diff --git a/packages/cosmwasm/src/cosmwasmclient.spec.ts b/packages/cosmwasm/src/cosmwasmclient.spec.ts index 398cfc32..0d176f63 100644 --- a/packages/cosmwasm/src/cosmwasmclient.spec.ts +++ b/packages/cosmwasm/src/cosmwasmclient.spec.ts @@ -313,25 +313,28 @@ describe("CosmWasmClient", () => { address: "cosmos18vd8fpwxzck93qlwghaj6arh4p7c5n89uzcee5", codeId: 1, creator: alice.address0, + admin: undefined, label: "HASH", }); expect(isa).toEqual({ address: "cosmos1hqrdl6wstt8qzshwc6mrumpjk9338k0lr4dqxd", codeId: 1, creator: alice.address0, + admin: undefined, label: "ISA", }); expect(jade).toEqual({ address: "cosmos18r5szma8hm93pvx6lwpjwyxruw27e0k5uw835c", codeId: 1, creator: alice.address0, + admin: alice.address1, label: "JADE", }); }); }); describe("getContract", () => { - it("works for HASH instance", async () => { + it("works for instance without admin", async () => { pendingWithoutWasmd(); const client = new CosmWasmClient(wasmd.endpoint); const hash = await client.getContract("cosmos18vd8fpwxzck93qlwghaj6arh4p7c5n89uzcee5"); @@ -340,6 +343,7 @@ describe("CosmWasmClient", () => { codeId: 1, creator: alice.address0, label: "HASH", + admin: undefined, initMsg: { decimals: 5, name: "Hash token", @@ -361,6 +365,19 @@ describe("CosmWasmClient", () => { }, }); }); + + it("works for instance with admin", async () => { + pendingWithoutWasmd(); + const client = new CosmWasmClient(wasmd.endpoint); + const jade = await client.getContract("cosmos18r5szma8hm93pvx6lwpjwyxruw27e0k5uw835c"); + expect(jade).toEqual( + jasmine.objectContaining({ + address: "cosmos18r5szma8hm93pvx6lwpjwyxruw27e0k5uw835c", + label: "JADE", + admin: alice.address1, + }), + ); + }); }); describe("queryContractRaw", () => { diff --git a/packages/cosmwasm/src/cosmwasmclient.ts b/packages/cosmwasm/src/cosmwasmclient.ts index 3ab253d7..c126bf66 100644 --- a/packages/cosmwasm/src/cosmwasmclient.ts +++ b/packages/cosmwasm/src/cosmwasmclient.ts @@ -118,6 +118,8 @@ export interface Contract { readonly codeId: number; /** Bech32 account address */ readonly creator: string; + /** Bech32-encoded admin address */ + readonly admin: string | undefined; readonly label: string; } @@ -380,6 +382,7 @@ export class CosmWasmClient { address: entry.address, codeId: entry.code_id, creator: entry.creator, + admin: entry.admin, label: entry.label, }), ); @@ -395,6 +398,7 @@ export class CosmWasmClient { address: result.address, codeId: result.code_id, creator: result.creator, + admin: result.admin, label: result.label, initMsg: result.init_msg, }; diff --git a/packages/cosmwasm/src/restclient.spec.ts b/packages/cosmwasm/src/restclient.spec.ts index cb98b084..3b45542a 100644 --- a/packages/cosmwasm/src/restclient.spec.ts +++ b/packages/cosmwasm/src/restclient.spec.ts @@ -193,6 +193,7 @@ describe("RestClient", () => { init_msg: jasmine.objectContaining({ symbol: "JADE" }), label: "JADE", sender: alice.address0, + admin: alice.address1, }); }); @@ -248,6 +249,7 @@ describe("RestClient", () => { init_msg: jasmine.objectContaining({ symbol: "JADE" }), label: "JADE", sender: alice.address0, + admin: alice.address1, }); } }); diff --git a/packages/cosmwasm/src/testutils.spec.ts b/packages/cosmwasm/src/testutils.spec.ts index d78f18b0..e2fb52f6 100644 --- a/packages/cosmwasm/src/testutils.spec.ts +++ b/packages/cosmwasm/src/testutils.spec.ts @@ -53,6 +53,10 @@ export const alice = { value: "A9cXhWb8ZpqCzkA8dQCPV29KdeRLV3rUYxrkHudLbQtS", }, address0: "cosmos14qemq0vw6y3gc3u3e0aty2e764u4gs5le3hada", + address1: "cosmos1hhg2rlu9jscacku2wwckws7932qqqu8x3gfgw0", + address2: "cosmos1xv9tklw7d82sezh9haa573wufgy59vmwe6xxe5", + address3: "cosmos17yg9mssjenmc3jkqth6ulcwj9cxujrxxzezwta", + address4: "cosmos1f7j7ryulwjfe9ljplvhtcaxa6wqgula3etktce", }; /** Unused account */ diff --git a/packages/cosmwasm/types/cosmwasmclient.d.ts b/packages/cosmwasm/types/cosmwasmclient.d.ts index 0dad3fa0..5e85137a 100644 --- a/packages/cosmwasm/types/cosmwasmclient.d.ts +++ b/packages/cosmwasm/types/cosmwasmclient.d.ts @@ -76,6 +76,8 @@ export interface Contract { readonly codeId: number; /** Bech32 account address */ readonly creator: string; + /** Bech32-encoded admin address */ + readonly admin: string | undefined; readonly label: string; } export interface ContractDetails extends Contract { diff --git a/scripts/wasmd/deploy_erc20.js b/scripts/wasmd/deploy_erc20.js index ffbaeca6..140b5b06 100755 --- a/scripts/wasmd/deploy_erc20.js +++ b/scripts/wasmd/deploy_erc20.js @@ -26,102 +26,111 @@ const codeMeta = { builder: "cosmwasm/rust-optimizer:0.8.0", }; -const initMsgHash = { - decimals: 5, - name: "Hash token", - symbol: "HASH", - initial_balances: [ - { - address: alice.address0, - amount: "11", - }, - { - address: alice.address1, - amount: "11", - }, - { - address: alice.address2, - amount: "11", - }, - { - address: alice.address3, - amount: "11", - }, - { - address: alice.address4, - amount: "11", - }, - { - address: unused.address, - amount: "12812345", - }, - { - address: guest.address, - amount: "22004000000", - }, - ], +const initDataHash = { + admin: undefined, + initMsg: { + decimals: 5, + name: "Hash token", + symbol: "HASH", + initial_balances: [ + { + address: alice.address0, + amount: "11", + }, + { + address: alice.address1, + amount: "11", + }, + { + address: alice.address2, + amount: "11", + }, + { + address: alice.address3, + amount: "11", + }, + { + address: alice.address4, + amount: "11", + }, + { + address: unused.address, + amount: "12812345", + }, + { + address: guest.address, + amount: "22004000000", + }, + ], + }, }; -const initMsgIsa = { - decimals: 0, - name: "Isa Token", - symbol: "ISA", - initial_balances: [ - { - address: alice.address0, - amount: "999999999", - }, - { - address: alice.address1, - amount: "999999999", - }, - { - address: alice.address2, - amount: "999999999", - }, - { - address: alice.address3, - amount: "999999999", - }, - { - address: alice.address4, - amount: "999999999", - }, - { - address: unused.address, - amount: "42", - }, - ], +const initDataIsa = { + admin: undefined, + initMsg: { + decimals: 0, + name: "Isa Token", + symbol: "ISA", + initial_balances: [ + { + address: alice.address0, + amount: "999999999", + }, + { + address: alice.address1, + amount: "999999999", + }, + { + address: alice.address2, + amount: "999999999", + }, + { + address: alice.address3, + amount: "999999999", + }, + { + address: alice.address4, + amount: "999999999", + }, + { + address: unused.address, + amount: "42", + }, + ], + }, }; -const initMsgJade = { - decimals: 18, - name: "Jade Token", - symbol: "JADE", - initial_balances: [ - { - address: alice.address0, - amount: "189189189000000000000000000", // 189189189 JADE - }, - { - address: alice.address1, - amount: "189189189000000000000000000", // 189189189 JADE - }, - { - address: alice.address2, - amount: "189189189000000000000000000", // 189189189 JADE - }, - { - address: alice.address3, - amount: "189189189000000000000000000", // 189189189 JADE - }, - { - address: alice.address4, - amount: "189189189000000000000000000", // 189189189 JADE - }, - { - address: guest.address, - amount: "189500000000000000000", // 189.5 JADE - }, - ], +const initDataJade = { + admin: alice.address1, + initMsg: { + decimals: 18, + name: "Jade Token", + symbol: "JADE", + initial_balances: [ + { + address: alice.address0, + amount: "189189189000000000000000000", // 189189189 JADE + }, + { + address: alice.address1, + amount: "189189189000000000000000000", // 189189189 JADE + }, + { + address: alice.address2, + amount: "189189189000000000000000000", // 189189189 JADE + }, + { + address: alice.address3, + amount: "189189189000000000000000000", // 189189189 JADE + }, + { + address: alice.address4, + amount: "189189189000000000000000000", // 189189189 JADE + }, + { + address: guest.address, + amount: "189500000000000000000", // 189.5 JADE + }, + ], + }, }; async function main() { @@ -132,9 +141,10 @@ async function main() { const uploadReceipt = await client.upload(wasm, codeMeta, "Upload ERC20 contract"); console.info(`Upload succeeded. Receipt: ${JSON.stringify(uploadReceipt)}`); - for (const initMsg of [initMsgHash, initMsgIsa, initMsgJade]) { + for (const { initMsg, admin } of [initDataHash, initDataIsa, initDataJade]) { const { contractAddress } = await client.instantiate(uploadReceipt.codeId, initMsg, initMsg.symbol, { memo: `Create an ERC20 instance for ${initMsg.symbol}`, + admin: admin, }); console.info(`Contract instantiated for ${initMsg.symbol} at ${contractAddress}`); }