# Concepts - The idea is to add additional logic to the bank Send function . We can do this by wrapping the bank module with a custom wrapper. - The process of creating tokens through mint / setting the total supply etc would not be covered in this file. ## Step 1 : Create a `Custom_Asset` module This module has the following responsibilities - It maintains the state for custom tokens . denoms ,supply ,minter etc - It maintains the frozen accounts. ## Step 2 : Wrap the bank module - Create a module with name `Bank_Wrapper` - Add module.go ,with ```go type AppModuleBasic struct { cosmosAppModule bank.AppModule } ``` ```go type AppModule struct { AppModuleBasic bankKeeper bankkeeper.Keeper customAssetKeeper customAsset.Keeper cdc codec.Marshaler } ``` Add our custom router where The `NewMsgServerImpl` is written by us and passed to the bank Handler. ```go func (am AppModule) Route() sdk.Route { return sdk.NewRoute(banktypes.RouterKey, bank.NewHandler(keeper.NewMsgServerImpl( am.bankKeeper,am.customAssetKeeper))) } ``` Basically means whenever a user uses any bank tx , it will be routed to our MsgServer instead of the default. ## Notes on why this design was chosen - The whole reason of providing two keepers here is the separation of logic - The `Custom_Asset` module is responsible only for storing and maintaining custom assets and everything related to it.Something like custom assets would be used in multiple places throughout the project . - That is why keeping the `Send` separate provides a more modular design, as not all modules that use `Custom_Asset` module would necessarily want `Send` Tx - Since it wraps the default `Send` tx, it provides a better user experience .Users would not have to use a separate send method for custom assets.