Contract - module call

Explanation of executing modules inside a CosmWasm contract using sending Native SCRT as an example.

Sending Native SCRT from a contract is realtively trivial and can be done using the BankMsg::Send message. This is a contract-to-module call. Any native denoms can be send in this way (ex. native IBC tokens).

pub fn execute(
    deps: DepsMut,
    env: Env,
    info: MessageInfo,
    msg: ExecuteMsg // this is a custom struct defined in your
) -> StdResult<Response> {
    // example: send 33 uscrt
    let coins_to_send: Vec<Coin> = vec![Coin {
        denom: "uscrt".to_string(),
        amount: Uint128::from(33u128),
    let message = CosmosMsg::Bank(BankMsg::Send {
        // replace with recipient of your choice
        to_address: info.sender.clone().into_string(),
        amount: coins_to_send,
    let res = Response::new().add_message(message);

Having Trouble? Always make sure your contract has enough funds to begin with!

You can send some coins to your contract like this:

secretcli tx bank send <from-account> <contract-address> 1000uscrt

You can always see decrypted error messages from the contract like so:

secretcli q compute tx <tx_hash>

Transaction logs

You can see the spent coins as events when you query for the transaction:

> tx_hash=$(secretcli tx compute execute <contract-address> '{}' --output json | jq '.txhash')
> secretcli q tx $txhash
# ...
- events:
  - attributes:
    - key: receiver
      value: secret1ap26qrlp8mcq2pg6r47w43l0y8zkqm8a450s03
    - key: amount
      value: 33uscrt
    type: coin_received
  - attributes:
    - key: spender
      value: secret18vd8fpwxzck93qlwghaj6arh4p7c5n8978vsyg
    - key: amount
      value: 33uscrt
    type: coin_spent
# ...

Last updated