wasm 模块是与部署在 injective 链上的 wasm 智能合约交互的核心,您可以在这里找到部署在 Injective 链上的智能合约列表。
MsgUpdateCode 和 MsgStoreCode 不被以太坊(如 Metamask)钱包支持。
MsgExecuteContract (Transfer)
此消息用于执行合约函数,下面我们将使用 CW20 规范 的 transfer 消息作为示例。
import { Network } from "@injectivelabs/networks";
import { MsgBroadcasterWithPk } from "@injectivelabs/sdk-ts/core/tx";
import { MsgExecuteContract } from "@injectivelabs/sdk-ts/core/modules";
const injectiveAddress = "inj1...";
const recipientAddress = "inj2...";
const contractAddress = "cw...";
const msg = MsgExecuteContract.fromJSON({
contractAddress,
sender: injectiveAddress,
exec: {
action: "transfer",
msg: {
recipient: recipientAddress,
amount: 100000,
},
},
});
const txHash = await new MsgBroadcasterWithPk({
privateKey,
network: Network.Mainnet,
}).broadcast({
msgs: msg,
});
console.log(txHash);
MsgExecuteContract (funds 示例)
在某些场景中,根据智能合约的函数,我们必须将代币转移到智能合约,按照 cosmwasm 惯例,我们使用 funds 字段将代币从用户的 bank 模块转移到智能合约。
以下是使用 test 合约函数发送 MsgExecuteContract 的示例。
import { Network } from "@injectivelabs/networks";
import { toChainFormat } from "@injectivelabs/utils";
import { MsgBroadcasterWithPk } from "@injectivelabs/sdk-ts/core/tx";
import { MsgExecuteContract } from "@injectivelabs/sdk-ts/core/modules";
const injectiveAddress = "inj1...";
const contractAddress = "cw...";
const msg = MsgExecuteContract.fromJSON({
contractAddress,
sender: injectiveAddress,
exec: {
action: "test",
funds: [
{
denom: "inj",
amount: toChainFormat(1).toFixed(),
},
],
},
});
const txHash = await new MsgBroadcasterWithPk({
privateKey,
network: Network.Mainnet,
}).broadcast({
msgs: msg,
});
console.log(txHash);
MsgExecuteContractCompat
在前面的示例中,使用 EIP712 解析 funds 数组和 msgs 对象存在一些兼容性问题。由于 MsgExecuteContract 无法正确转换为 EIP712 然后由以太坊钱包签名,我们引入了完全兼容 EIP712 的 MsgExecuteContractCompat。
注意: MsgExecuteContract 和 MsgExecuteContractCompat 的底层消息是相同的。MsgExecuteContractCompat 只是兼容 EIP712。
以下是使用 test 合约函数发送 MsgExecuteContractCompact 的示例。
import { Network } from "@injectivelabs/networks";
import { toChainFormat } from "@injectivelabs/utils";
import { MsgBroadcasterWithPk } from "@injectivelabs/sdk-ts/core/tx";
import { MsgExecuteContractCompat } from "@injectivelabs/sdk-ts/core/modules";
const injectiveAddress = "inj1...";
const contractAddress = "cw...";
const msg = MsgExecuteContractCompat.fromJSON({
contractAddress,
sender: injectiveAddress,
exec: {
action: "test",
funds: [
{
denom: "inj",
amount: toChainFormat(1).toFixed(),
},
],
},
});
const txHash = await new MsgBroadcasterWithPk({
privateKey,
network: Network.Mainnet,
}).broadcast({
msgs: msg,
});
console.log(txHash);