---
# System prepended metadata

title: Concepts

---

# 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.