在本地搭建LocalTerra节点时,有时会用到创建cw20Token来测试。LocalTerra中的cw20合约代码需要自己编译后上传。记录该过程。
在本地搭建LocalTerra节点时,有时会用到创建cw20Token来测试。LocalTerra中的cw20合约代码需要自己编译后上传。记录该过程。
git clone https://github.com/CosmWasm/cw-plus
CosmWasm提供了多个已通过测试验证的合约,包括白名单、多签、质押,以及符合ERC20规范的相关合约。
.
├── cw1-subkeys
├── cw1-whitelist
├── cw1155-base
├── cw20-atomic-swap
├── cw20-base
├── cw20-bonding
├── cw20-escrow
├── cw20-ics20
├── cw20-merkle-airdrop
├── cw20-staking
├── cw3-fixed-multisig
├── cw3-flex-multisig
├── cw4-group
├── cw4-stake
└── cw721-base
其中cw20-base即实现ERC20规范的合约项目。
由于当前最新版本(v0.12.0)编译优化后,上传代码提示
Wasm contract has unknown interface_version_* marker
因此选择的是v0.8.0版本代码进行编译的
git tag
...
v0.7.0
v0.8.0
v0.8.0-rc1
v0.8.0-rc2
v0.8.0-rc3
v0.8.1
...
git checkout v0.8.0
项目根目录下运行
cw-plus % docker run --rm -v "$(pwd)":/code \
--mount type=volume,source="$(basename "$(pwd)")_cache",target=/code/target
--mount type=volume,source=registry_cache,target=/usr/local/cargo/registry
cosmwasm/workspace-optimizer:0.11.3
会将编译优化后的wasm文件放置在项目根目录下的artifacts目录下
1.51.0-x86_64-unknown-linux-musl (default)
cargo 1.51.0 (43b129a20 2021-03-16)
Building artifacts in workspace ...
Found workspace member entries: ['packages/*', 'contracts/*']
Package directories: ['contracts/cw1-subkeys', 'contracts/cw1-whitelist', 'contracts/cw1155-base', 'contracts/cw20-atomic-swap', 'contracts/cw20-base', 'contracts/cw20-bonding', 'contracts/cw20-escrow', 'contracts/cw20-ics20', 'contracts/cw20-merkle-airdrop', 'contracts/cw20-staking', 'contracts/cw3-fixed-multisig', 'contracts/cw3-flex-multisig', 'contracts/cw4-group', 'contracts/cw4-stake', 'contracts/cw721-base', 'packages/controllers', 'packages/cw0', 'packages/cw1', 'packages/cw1155', 'packages/cw2', 'packages/cw20', 'packages/cw3', 'packages/cw4', 'packages/cw721', 'packages/multi-test', 'packages/storage-plus']
Contracts to be built: ['contracts/cw1-subkeys', 'contracts/cw1-whitelist', 'contracts/cw1155-base', 'contracts/cw20-atomic-swap', 'contracts/cw20-base', 'contracts/cw20-bonding', 'contracts/cw20-escrow', 'contracts/cw20-ics20', 'contracts/cw20-merkle-airdrop', 'contracts/cw20-staking', 'contracts/cw3-fixed-multisig', 'contracts/cw3-flex-multisig', 'contracts/cw4-group', 'contracts/cw4-stake', 'contracts/cw721-base']
Building contracts/cw1-subkeys ...
Compiling cw1-whitelist v0.8.0 (/code/contracts/cw1-whitelist)
Compiling cw1-subkeys v0.8.0 (/code/contracts/cw1-subkeys)
Finished release [optimized] target(s) in 19.91s
Building contracts/cw1-whitelist ...
Compiling cw1-whitelist v0.8.0 (/code/contracts/cw1-whitelist)
Finished release [optimized] target(s) in 11.05s
Building contracts/cw1155-base ...
Finished release [optimized] target(s) in 0.30s
Building contracts/cw20-atomic-swap ...
Finished release [optimized] target(s) in 0.33s
Building contracts/cw20-base ...
Compiling cw20-base v0.8.0 (/code/contracts/cw20-base)
Finished release [optimized] target(s) in 15.57s
Building contracts/cw20-bonding ...
Compiling cw20-base v0.8.0 (/code/contracts/cw20-base)
Compiling cw20-bonding v0.8.0 (/code/contracts/cw20-bonding)
Finished release [optimized] target(s) in 20.32s
Building contracts/cw20-escrow ...
Finished release [optimized] target(s) in 0.32s
Building contracts/cw20-ics20 ...
Finished release [optimized] target(s) in 0.30s
Building contracts/cw20-merkle-airdrop ...
Finished release [optimized] target(s) in 0.30s
Building contracts/cw20-staking ...
Compiling cw20-staking v0.8.0 (/code/contracts/cw20-staking)
Finished release [optimized] target(s) in 13.36s
Building contracts/cw3-fixed-multisig ...
Finished release [optimized] target(s) in 0.30s
Building contracts/cw3-flex-multisig ...
Finished release [optimized] target(s) in 0.30s
Building contracts/cw4-group ...
Finished release [optimized] target(s) in 0.31s
Building contracts/cw4-stake ...
Finished release [optimized] target(s) in 0.31s
Building contracts/cw721-base ...
Finished release [optimized] target(s) in 0.30s
Optimizing artifacts in workspace ...
Optimizing ../target/wasm32-unknown-unknown/release/cw1155_base.wasm ...
Optimizing ../target/wasm32-unknown-unknown/release/cw1_subkeys.wasm ...
Optimizing ../target/wasm32-unknown-unknown/release/cw1_whitelist.wasm ...
Optimizing ../target/wasm32-unknown-unknown/release/cw20_atomic_swap.wasm ...
Optimizing ../target/wasm32-unknown-unknown/release/cw20_base.wasm ...
Optimizing ../target/wasm32-unknown-unknown/release/cw20_bonding.wasm ...
Optimizing ../target/wasm32-unknown-unknown/release/cw20_escrow.wasm ...
Optimizing ../target/wasm32-unknown-unknown/release/cw20_ics20.wasm ...
Optimizing ../target/wasm32-unknown-unknown/release/cw20_merkle_airdrop.wasm ...
Optimizing ../target/wasm32-unknown-unknown/release/cw20_staking.wasm ...
Optimizing ../target/wasm32-unknown-unknown/release/cw3_fixed_multisig.wasm ...
Optimizing ../target/wasm32-unknown-unknown/release/cw3_flex_multisig.wasm ...
Optimizing ../target/wasm32-unknown-unknown/release/cw4_group.wasm ...
Optimizing ../target/wasm32-unknown-unknown/release/cw4_stake.wasm ...
Optimizing ../target/wasm32-unknown-unknown/release/cw721_base.wasm ...
Moving wasm files ...
Post-processing artifacts in workspace ...
done
编译优化后的文件
.
├── checksums.txt
├── cw1155_base.wasm
├── cw1_subkeys.wasm
├── cw1_whitelist.wasm
├── cw20_atomic_swap.wasm
├── cw20_base.wasm
├── cw20_bonding.wasm
├── cw20_escrow.wasm
├── cw20_ics20.wasm
├── cw20_merkle_airdrop.wasm
├── cw20_staking.wasm
├── cw3_fixed_multisig.wasm
├── cw3_flex_multisig.wasm
├── cw4_group.wasm
├── cw4_stake.wasm
└── cw721_base.wasm
cw-plus % terrad tx wasm store artifacts/cw20_base.wasm --from test1 --chain-id=localterra --gas=auto --fees=100000uluna --broadcast-mode=block
gas estimate: 1612883
{"body":{"messages":[{"@type":"/terra.wasm.v1beta1.MsgStoreCode","sender":"terra1dcegyrekltswvyy0xy69ydgxn9x8x32zdtapd8","wasm_byte_code":"H4sIAAAAAAAA/+y9DZhdR3UgWH/357373uvbP7Jbasmpe1HgdXAPMjGvhewkXQ0t2THfIBO+rL0fM...IFNRQhOgEoKa5KvGf4QqH0nlp8YH/i+ArBCwFgeNf2UblJRhlJBBCgvwb2AjAMMhRmRI2ElVyo5CmhsAFBoUwJpK1L61ryryrWqAbt8VCBSyQwvo5NX+OQCxNAZ1nJ8lkeF7DQShUkJIaIiULEihBQu9Q4th76b/uniVpSEQRHoYIP0ltGQZbIEaHx8nhhJSIODfAQAA//8L2Bj8Q6AEAA=="}],"memo":"","timeout_height":"0","extension_options":[],"non_critical_extension_options":[]},"auth_info":{"signer_infos":[],"fee":{"amount":[{"denom":"uluna","amount":"100000"}],"gas_limit":"1612883","payer":"","granter":""}},"signatures":[]}
confirm transaction before signing and broadcasting [y/N]: y
code: 0
codespace: ""
data: 0A260A202F74657272612E7761736D2E763162657461312E4D736753746F7265436F646512020802
events:
- attributes:
- index: true
key: c3BlbmRlcg==
value: dGVycmExZGNlZ3lyZWtsdHN3dnl5MHh5Njl5ZGd4bjl4OHgzMnpkdGFwZDg=
- index: true
key: YW1vdW50
value: MTAwMDAwdWx1bmE=
type: coin_spent
- attributes:
- index: true
key: cmVjZWl2ZXI=
value: dGVycmExN3hwZnZha20yYW1nOTYyeWxzNmY4NHoza2VsbDhjNWxrYWVxZmE=
- index: true
key: YW1vdW50
value: MTAwMDAwdWx1bmE=
type: coin_received
- attributes:
- index: true
key: cmVjaXBpZW50
value: dGVycmExN3hwZnZha20yYW1nOTYyeWxzNmY4NHoza2VsbDhjNWxrYWVxZmE=
- index: true
key: c2VuZGVy
value: dGVycmExZGNlZ3lyZWtsdHN3dnl5MHh5Njl5ZGd4bjl4OHgzMnpkdGFwZDg=
- index: true
key: YW1vdW50
value: MTAwMDAwdWx1bmE=
type: transfer
- attributes:
- index: true
key: c2VuZGVy
value: dGVycmExZGNlZ3lyZWtsdHN3dnl5MHh5Njl5ZGd4bjl4OHgzMnpkdGFwZDg=
type: message
- attributes:
- index: true
key: ZmVl
value: MTAwMDAwdWx1bmE=
type: tx
- attributes:
- index: true
key: YWNjX3NlcQ==
value: dGVycmExZGNlZ3lyZWtsdHN3dnl5MHh5Njl5ZGd4bjl4OHgzMnpkdGFwZDgvNzI0
type: tx
- attributes:
- index: true
key: c2lnbmF0dXJl
value: eTZaS1plRTZHTXlCM3BSL3BFWEE5M0llcmpUQXJlRkRobWhGRzBaVDhZY1k3LzZpWWdMdWV3UkVTNllIVk1naDB1Q3dacnZSK09kWDYyMjZrYm1kWXc9PQ==
type: tx
- attributes:
- index: true
key: YWN0aW9u
value: L3RlcnJhLndhc20udjFiZXRhMS5Nc2dTdG9yZUNvZGU=
type: message
- attributes:
- index: true
key: c2VuZGVy
value: dGVycmExZGNlZ3lyZWtsdHN3dnl5MHh5Njl5ZGd4bjl4OHgzMnpkdGFwZDg=
- index: true
key: Y29kZV9pZA==
value: Mg==
type: store_code
- attributes:
- index: true
key: bW9kdWxl
value: d2FzbQ==
type: message
gas_used: "1611362"
gas_wanted: "1612883"
height: "3603"
info: ""
logs:
- events:
- attributes:
- key: action
value: /terra.wasm.v1beta1.MsgStoreCode
- key: module
value: wasm
type: message
- attributes:
- key: sender
value: terra1dcegyrekltswvyy0xy69ydgxn9x8x32zdtapd8
- key: code_id
value: "2"
type: store_code
log: ""
msg_index: 0
raw_log: '[{"events":[{"type":"message","attributes":[{"key":"action","value":"/terra.wasm.v1beta1.MsgStoreCode"},{"key":"module","value":"wasm"}]},{"type":"store_code","attributes":[{"key":"sender","value":"terra1dcegyrekltswvyy0xy69ydgxn9x8x32zdtapd8"},{"key":"code_id","value":"2"}]}]}]'
timestamp: ""
tx: null
txhash: 024D97F1FE62D117FC2E3817184030ADC3C772FB1C4951A158AD3946CCC5DD9F
上传成功,code_id为2记录了cw20合约代码。
实例化CW20Token。
{
"name": "yout_token_name",
"symbol": "SYMBOL",
"decimals": 6,
"initial_balances": [
{
"address": "terraaddress0001asdfsdfbqwer...",
"amount": "10000"
},
{
"address": "terraaddress0002asdfsdfbqwer...",
"amount": "10000"
},
...
]
}
执行初始化命令。
% terrad tx wasm instantiate 2 '{"name":"Tether USD","symbol":"USDT","decimals":6,"initial_balances":[{"address":"terra1x46rqay4d3cssq8gxxvqz8xt6nwlz4td20k38v","amount":"1000000000"}]}' --from test1 --chain-id=localterra --fees=10000uluna --gas=auto --broadcast-mode=block
gas estimate: 289047
{"body":{"messages":[{"@type":"/terra.wasm.v1beta1.MsgInstantiateContract","sender":"terra1dcegyrekltswvyy0xy69ydgxn9x8x32zdtapd8","admin":"","code_id":"2","init_msg":{"name":"Tether USD","symbol":"USDT","decimals":6,"initial_balances":[{"address":"terra1x46rqay4d3cssq8gxxvqz8xt6nwlz4td20k38v","amount":"1000000000"}]},"init_coins":[]}],"memo":"","timeout_height":"0","extension_options":[],"non_critical_extension_options":[]},"auth_info":{"signer_infos":[],"fee":{"amount":[{"denom":"uluna","amount":"10000"}],"gas_limit":"289047","payer":"","granter":""}},"signatures":[]}
confirm transaction before signing and broadcasting [y/N]: y
code: 0
codespace: ""
data: 0A5C0A2A2F74657272612E7761736D2E763162657461312E4D7367496E7374616E7469617465436F6E7472616374122E0A2C746572726131763765747336763538707736353373356B326E737764386B75396D64706D7137717A7A357178
events:
- attributes:
- index: true
key: c3BlbmRlcg==
value: dGVycmExZGNlZ3lyZWtsdHN3dnl5MHh5Njl5ZGd4bjl4OHgzMnpkdGFwZDg=
- index: true
key: YW1vdW50
value: MTAwMDB1bHVuYQ==
type: coin_spent
- attributes:
- index: true
key: cmVjZWl2ZXI=
value: dGVycmExN3hwZnZha20yYW1nOTYyeWxzNmY4NHoza2VsbDhjNWxrYWVxZmE=
- index: true
key: YW1vdW50
value: MTAwMDB1bHVuYQ==
type: coin_received
- attributes:
- index: true
key: cmVjaXBpZW50
value: dGVycmExN3hwZnZha20yYW1nOTYyeWxzNmY4NHoza2VsbDhjNWxrYWVxZmE=
- index: true
key: c2VuZGVy
value: dGVycmExZGNlZ3lyZWtsdHN3dnl5MHh5Njl5ZGd4bjl4OHgzMnpkdGFwZDg=
- index: true
key: YW1vdW50
value: MTAwMDB1bHVuYQ==
type: transfer
- attributes:
- index: true
key: c2VuZGVy
value: dGVycmExZGNlZ3lyZWtsdHN3dnl5MHh5Njl5ZGd4bjl4OHgzMnpkdGFwZDg=
type: message
- attributes:
- index: true
key: ZmVl
value: MTAwMDB1bHVuYQ==
type: tx
- attributes:
- index: true
key: YWNjX3NlcQ==
value: dGVycmExZGNlZ3lyZWtsdHN3dnl5MHh5Njl5ZGd4bjl4OHgzMnpkdGFwZDgvMTQyMQ==
type: tx
- attributes:
- index: true
key: c2lnbmF0dXJl
value: WDNGTytaSUNuVWxqSTJNNnhlazNaR1B1NTNFaDRqa1I0eE9EOURORVVMVTZtQlNwVXdtWnNGcUJKZTBRWUhKL0ROS0RBNUdBR1hqOXV0bFdVbk5iUkE9PQ==
type: tx
- attributes:
- index: true
key: YWN0aW9u
value: L3RlcnJhLndhc20udjFiZXRhMS5Nc2dJbnN0YW50aWF0ZUNvbnRyYWN0
type: message
- attributes:
- index: true
key: Y3JlYXRvcg==
value: dGVycmExZGNlZ3lyZWtsdHN3dnl5MHh5Njl5ZGd4bjl4OHgzMnpkdGFwZDg=
- index: true
key: YWRtaW4=
value: ""
- index: true
key: Y29kZV9pZA==
value: Mg==
- index: true
key: Y29udHJhY3RfYWRkcmVzcw==
value: dGVycmExdjdldHM2djU4cHc2NTNzNWsybnN3ZDhrdTltZHBtcTdxeno1cXg=
type: instantiate_contract
- attributes:
- index: true
key: bW9kdWxl
value: d2FzbQ==
- index: true
key: c2VuZGVy
value: dGVycmExZGNlZ3lyZWtsdHN3dnl5MHh5Njl5ZGd4bjl4OHgzMnpkdGFwZDg=
type: message
gas_used: "288496"
gas_wanted: "289047"
height: "7072"
info: ""
logs:
- events:
- attributes:
- key: creator
value: terra1dcegyrekltswvyy0xy69ydgxn9x8x32zdtapd8
- key: admin
value: ""
- key: code_id
value: "2"
- key: contract_address
value: terra1v7ets6v58pw653s5k2nswd8ku9mdpmq7qzz5qx
type: instantiate_contract
- attributes:
- key: action
value: /terra.wasm.v1beta1.MsgInstantiateContract
- key: module
value: wasm
- key: sender
value: terra1dcegyrekltswvyy0xy69ydgxn9x8x32zdtapd8
type: message
log: ""
msg_index: 0
raw_log: '[{"events":[{"type":"instantiate_contract","attributes":[{"key":"creator","value":"terra1dcegyrekltswvyy0xy69ydgxn9x8x32zdtapd8"},{"key":"admin"},{"key":"code_id","value":"2"},{"key":"contract_address","value":"terra1v7ets6v58pw653s5k2nswd8ku9mdpmq7qzz5qx"}]},{"type":"message","attributes":[{"key":"action","value":"/terra.wasm.v1beta1.MsgInstantiateContract"},{"key":"module","value":"wasm"},{"key":"sender","value":"terra1dcegyrekltswvyy0xy69ydgxn9x8x32zdtapd8"}]}]}]'
timestamp: ""
tx: null
txhash: 33046CA5685B52C054B12EBD6AB9623D4BD357CB5F7DF2DEF05526DE837E92DA
部署完成。
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!