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).
#[entry_point]
pub fn execute(
deps: DepsMut,
env: Env,
info: MessageInfo,
msg: ExecuteMsg // this is a custom struct defined in your msg.rs
) -> 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);
Ok(res)
}
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
# ...
logs:
- 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
Was this helpful?