From b4172c17f4afccc337990f2d4965e47c6e404ecf Mon Sep 17 00:00:00 2001 From: quasisamurai Date: Wed, 10 Apr 2024 21:29:54 -0300 Subject: [PATCH] rm unused --- src/testcases/parallel/dao_assert.test.ts | 496 ++++----- src/testcases/parallel/tokenfactory.test.ts | 1017 ++++++++++--------- 2 files changed, 758 insertions(+), 755 deletions(-) diff --git a/src/testcases/parallel/dao_assert.test.ts b/src/testcases/parallel/dao_assert.test.ts index 5a010a1a..91376dd7 100644 --- a/src/testcases/parallel/dao_assert.test.ts +++ b/src/testcases/parallel/dao_assert.test.ts @@ -16,254 +16,254 @@ import { getContractsHashes } from '@neutron-org/neutronjsplus/dist/env'; const config = require('../../config.json'); describe('DAO / Check', () => { - // let testState: TestStateLocalCosmosTestNet; - // let neutronChain: CosmosWrapper; - // let daoContracts: DaoContracts; - // let proposalSingleAddress: string; - // let preProposalSingleAddress: string; - // let proposalMultipleAddress: string; - // let preProposalMultipleAddress: string; - // let proposalOverruleAddress: string; - // let preProposalOverruleAddress: string; - // let votingModuleAddress: string; - // let votingVaultsNtrnAddress: string; - // let treasuryContract: string; - // - // beforeAll(async () => { - // testState = new TestStateLocalCosmosTestNet(config); - // await testState.init(); - // - // neutronChain = new CosmosWrapper( - // testState.sdk1, - // testState.blockWaiter1, - // NEUTRON_DENOM, - // ); - // const daoCoreAddress = (await neutronChain.getChainAdmins())[0]; //add assert for some addresses - // daoContracts = await getDaoContracts(neutronChain, daoCoreAddress); - // proposalSingleAddress = daoContracts.proposals.single.address; - // preProposalSingleAddress = - // daoContracts.proposals.single.pre_propose.address; - // proposalMultipleAddress = daoContracts.proposals.multiple.address; - // preProposalMultipleAddress = - // daoContracts.proposals.multiple.pre_propose.address; - // proposalOverruleAddress = daoContracts.proposals.overrule.address; - // preProposalOverruleAddress = - // daoContracts.proposals.overrule.pre_propose.address; - // votingModuleAddress = daoContracts.voting.address; - // votingVaultsNtrnAddress = (daoContracts.voting as VotingVaultsModule).vaults - // .neutron.address; - // treasuryContract = await getTreasuryContract(neutronChain); - // }); - // - // describe('Checking the association of proposal & preproposal modules with the Dao', () => { - // test('Proposal dao single', async () => { - // await performCommonChecks( - // neutronChain, - // daoContracts, - // proposalSingleAddress, - // ); - // }); - // - // test('Preproposal dao single', async () => { - // await performCommonChecks( - // neutronChain, - // daoContracts, - // preProposalSingleAddress, - // ); - // - // const propContract = await neutronChain.queryContract( - // preProposalSingleAddress, - // { - // proposal_module: {}, - // }, - // ); - // expect(propContract).toEqual(proposalSingleAddress); - // }); - // - // test('Proposal dao multiple', async () => { - // await performCommonChecks( - // neutronChain, - // daoContracts, - // proposalMultipleAddress, - // ); - // }); - // - // test('Preproposal dao multiple', async () => { - // await performCommonChecks( - // neutronChain, - // daoContracts, - // preProposalMultipleAddress, - // ); - // - // const propContract = await neutronChain.queryContract( - // preProposalMultipleAddress, - // { - // proposal_module: {}, - // }, - // ); - // expect(propContract).toEqual(proposalMultipleAddress); - // }); - // - // test('Proposal dao overrule', async () => { - // await performCommonChecks( - // neutronChain, - // daoContracts, - // proposalOverruleAddress, - // ); - // }); - // - // test('Preproposal dao overrule', async () => { - // await performCommonChecks( - // neutronChain, - // daoContracts, - // preProposalOverruleAddress, - // ); - // - // const propContract = await neutronChain.queryContract( - // preProposalOverruleAddress, - // { - // proposal_module: {}, - // }, - // ); - // expect(propContract).toEqual(proposalOverruleAddress); - // }); - // test('Treasury is correct', async () => { - // const treasuryAddress = await getTreasuryContract(neutronChain); - // expect(treasuryAddress.length).toBeGreaterThan(0); - // }); - // }); - // - // describe('Checking the association of voting modules with the Dao', () => { - // test('voting module', async () => { - // await performCommonChecks( - // neutronChain, - // daoContracts, - // votingModuleAddress, - // ); - // }); - // - // test('Neutron voting vault', async () => { - // await verifyAdmin( - // neutronChain, - // votingVaultsNtrnAddress, - // daoContracts.core.address, - // ); - // await verifyLabel(neutronChain, daoContracts, votingVaultsNtrnAddress); - // }); - // - // test('Dao is the admin of himself', async () => { - // await verifyAdmin( - // neutronChain, - // daoContracts.core.address, - // daoContracts.core.address, - // ); - // await verifyLabel(neutronChain, daoContracts, daoContracts.core.address); - // }); - // }); - // - // describe('Checking the validity of binary files', () => { - // test('Dao proposal single hash assert', async () => { - // await checkContractHash( - // neutronChain, - // proposalSingleAddress, - // NeutronContract.DAO_PROPOSAL_SINGLE, - // ); - // }); - // - // test('Dao proposal multiple hash assert', async () => { - // await checkContractHash( - // neutronChain, - // proposalMultipleAddress, - // NeutronContract.DAO_PROPOSAL_MULTI, - // ); - // }); - // - // test('Dao preproposal single hash assert', async () => { - // await checkContractHash( - // neutronChain, - // preProposalSingleAddress, - // NeutronContract.DAO_PREPROPOSAL_SINGLE, - // ); - // }); - // - // test('Dao preproposal multiple hash assert', async () => { - // await checkContractHash( - // neutronChain, - // preProposalMultipleAddress, - // NeutronContract.DAO_PREPROPOSAL_MULTI, - // ); - // }); - // - // test('Dao core hash assert', async () => { - // await checkContractHash( - // neutronChain, - // daoContracts.core.address, - // NeutronContract.DAO_CORE, - // ); - // }); - // - // test('Dao proposal overrule hash assert', async () => { - // await checkContractHash( - // neutronChain, - // proposalOverruleAddress, - // NeutronContract.DAO_PROPOSAL_SINGLE, - // ); - // }); - // - // test('Dao preproposal overrule hash assert', async () => { - // await checkContractHash( - // neutronChain, - // preProposalOverruleAddress, - // NeutronContract.DAO_PREPROPOSAL_OVERRULE, - // ); - // }); - // - // test('Treasury hash assert', async () => { - // await checkContractHash( - // neutronChain, - // treasuryContract, - // NeutronContract.DAO_CORE, - // ); - // }); - // test('Dao neutron vault hash assert', async () => { - // await checkContractHash( - // neutronChain, - // votingVaultsNtrnAddress, - // NeutronContract.NEUTRON_VAULT, - // ); - // }); - // }); - // - // describe('Test subdaos', () => { - // test('Check subdaos contracts admins and labels', async () => { - // for (const subdaoIndex in daoContracts.subdaos) { - // const sudao = daoContracts.subdaos[subdaoIndex]; - // const contractsList = [ - // sudao.core.address, - // sudao.proposals.single.address, - // sudao.proposals.single.pre_propose.address, - // sudao.voting.address, - // // (sudao.voting as VotingCw4Module).cw4group.address, // todo fix this - // ]; - // if ( - // sudao.proposals.single.pre_propose.timelock && - // sudao.proposals.single.pre_propose.timelock.address != null // TODO: figure out where a null value come from? - // ) { - // contractsList.push( - // sudao.proposals.single.pre_propose.timelock.address, - // ); - // } - // for (const contractAddress of contractsList) { - // await verifyAdmin( - // neutronChain, - // contractAddress, - // daoContracts.core.address, - // ); - // await verifyLabel(neutronChain, daoContracts, contractAddress); - // } - // } - // }); - // }); + let testState: TestStateLocalCosmosTestNet; + let neutronChain: CosmosWrapper; + let daoContracts: DaoContracts; + let proposalSingleAddress: string; + let preProposalSingleAddress: string; + let proposalMultipleAddress: string; + let preProposalMultipleAddress: string; + let proposalOverruleAddress: string; + let preProposalOverruleAddress: string; + let votingModuleAddress: string; + let votingVaultsNtrnAddress: string; + let treasuryContract: string; + + beforeAll(async () => { + testState = new TestStateLocalCosmosTestNet(config); + await testState.init(); + + neutronChain = new CosmosWrapper( + testState.sdk1, + testState.blockWaiter1, + NEUTRON_DENOM, + ); + const daoCoreAddress = (await neutronChain.getChainAdmins())[0]; //add assert for some addresses + daoContracts = await getDaoContracts(neutronChain, daoCoreAddress); + proposalSingleAddress = daoContracts.proposals.single.address; + preProposalSingleAddress = + daoContracts.proposals.single.pre_propose.address; + proposalMultipleAddress = daoContracts.proposals.multiple.address; + preProposalMultipleAddress = + daoContracts.proposals.multiple.pre_propose.address; + proposalOverruleAddress = daoContracts.proposals.overrule.address; + preProposalOverruleAddress = + daoContracts.proposals.overrule.pre_propose.address; + votingModuleAddress = daoContracts.voting.address; + votingVaultsNtrnAddress = (daoContracts.voting as VotingVaultsModule).vaults + .neutron.address; + treasuryContract = await getTreasuryContract(neutronChain); + }); + + describe('Checking the association of proposal & preproposal modules with the Dao', () => { + test('Proposal dao single', async () => { + await performCommonChecks( + neutronChain, + daoContracts, + proposalSingleAddress, + ); + }); + + test('Preproposal dao single', async () => { + await performCommonChecks( + neutronChain, + daoContracts, + preProposalSingleAddress, + ); + + const propContract = await neutronChain.queryContract( + preProposalSingleAddress, + { + proposal_module: {}, + }, + ); + expect(propContract).toEqual(proposalSingleAddress); + }); + + test('Proposal dao multiple', async () => { + await performCommonChecks( + neutronChain, + daoContracts, + proposalMultipleAddress, + ); + }); + + test('Preproposal dao multiple', async () => { + await performCommonChecks( + neutronChain, + daoContracts, + preProposalMultipleAddress, + ); + + const propContract = await neutronChain.queryContract( + preProposalMultipleAddress, + { + proposal_module: {}, + }, + ); + expect(propContract).toEqual(proposalMultipleAddress); + }); + + test('Proposal dao overrule', async () => { + await performCommonChecks( + neutronChain, + daoContracts, + proposalOverruleAddress, + ); + }); + + test('Preproposal dao overrule', async () => { + await performCommonChecks( + neutronChain, + daoContracts, + preProposalOverruleAddress, + ); + + const propContract = await neutronChain.queryContract( + preProposalOverruleAddress, + { + proposal_module: {}, + }, + ); + expect(propContract).toEqual(proposalOverruleAddress); + }); + test('Treasury is correct', async () => { + const treasuryAddress = await getTreasuryContract(neutronChain); + expect(treasuryAddress.length).toBeGreaterThan(0); + }); + }); + + describe('Checking the association of voting modules with the Dao', () => { + test('voting module', async () => { + await performCommonChecks( + neutronChain, + daoContracts, + votingModuleAddress, + ); + }); + + test('Neutron voting vault', async () => { + await verifyAdmin( + neutronChain, + votingVaultsNtrnAddress, + daoContracts.core.address, + ); + await verifyLabel(neutronChain, daoContracts, votingVaultsNtrnAddress); + }); + + test('Dao is the admin of himself', async () => { + await verifyAdmin( + neutronChain, + daoContracts.core.address, + daoContracts.core.address, + ); + await verifyLabel(neutronChain, daoContracts, daoContracts.core.address); + }); + }); + + describe('Checking the validity of binary files', () => { + test('Dao proposal single hash assert', async () => { + await checkContractHash( + neutronChain, + proposalSingleAddress, + NeutronContract.DAO_PROPOSAL_SINGLE, + ); + }); + + test('Dao proposal multiple hash assert', async () => { + await checkContractHash( + neutronChain, + proposalMultipleAddress, + NeutronContract.DAO_PROPOSAL_MULTI, + ); + }); + + test('Dao preproposal single hash assert', async () => { + await checkContractHash( + neutronChain, + preProposalSingleAddress, + NeutronContract.DAO_PREPROPOSAL_SINGLE, + ); + }); + + test('Dao preproposal multiple hash assert', async () => { + await checkContractHash( + neutronChain, + preProposalMultipleAddress, + NeutronContract.DAO_PREPROPOSAL_MULTI, + ); + }); + + test('Dao core hash assert', async () => { + await checkContractHash( + neutronChain, + daoContracts.core.address, + NeutronContract.DAO_CORE, + ); + }); + + test('Dao proposal overrule hash assert', async () => { + await checkContractHash( + neutronChain, + proposalOverruleAddress, + NeutronContract.DAO_PROPOSAL_SINGLE, + ); + }); + + test('Dao preproposal overrule hash assert', async () => { + await checkContractHash( + neutronChain, + preProposalOverruleAddress, + NeutronContract.DAO_PREPROPOSAL_OVERRULE, + ); + }); + + test('Treasury hash assert', async () => { + await checkContractHash( + neutronChain, + treasuryContract, + NeutronContract.DAO_CORE, + ); + }); + test('Dao neutron vault hash assert', async () => { + await checkContractHash( + neutronChain, + votingVaultsNtrnAddress, + NeutronContract.NEUTRON_VAULT, + ); + }); + }); + + describe('Test subdaos', () => { + test('Check subdaos contracts admins and labels', async () => { + for (const subdaoIndex in daoContracts.subdaos) { + const sudao = daoContracts.subdaos[subdaoIndex]; + const contractsList = [ + sudao.core.address, + sudao.proposals.single.address, + sudao.proposals.single.pre_propose.address, + sudao.voting.address, + // (sudao.voting as VotingCw4Module).cw4group.address, // todo fix this + ]; + if ( + sudao.proposals.single.pre_propose.timelock && + sudao.proposals.single.pre_propose.timelock.address != null // TODO: figure out where a null value come from? + ) { + contractsList.push( + sudao.proposals.single.pre_propose.timelock.address, + ); + } + for (const contractAddress of contractsList) { + await verifyAdmin( + neutronChain, + contractAddress, + daoContracts.core.address, + ); + await verifyLabel(neutronChain, daoContracts, contractAddress); + } + } + }); + }); }); const performCommonChecks = async ( diff --git a/src/testcases/parallel/tokenfactory.test.ts b/src/testcases/parallel/tokenfactory.test.ts index 645f4ab6..0c1e7ebd 100644 --- a/src/testcases/parallel/tokenfactory.test.ts +++ b/src/testcases/parallel/tokenfactory.test.ts @@ -39,511 +39,514 @@ describe('Neutron / Tokenfactory', () => { neutronAccount = new WalletWrapper(neutronChain, ownerWallet); }); - // test('tokenfactory module is added', async () => { - // const paramsPresent = await checkTokenfactoryParams(neutronChain.sdk.url); - // expect(paramsPresent).toBeTruthy(); - // }); - // - // describe('Module itself', () => { - // test('create denoms and check list', async () => { - // const denom = 'test1'; - // const data = await msgCreateDenom( - // neutronAccount, - // ownerWallet.address.toString(), - // 'test1', - // ); - // - // const newTokenDenom = getEventAttribute( - // (data as any).events, - // 'create_denom', - // 'new_token_denom', - // ); - // - // expect(newTokenDenom).toEqual( - // `factory/${ownerWallet.address.toString()}/${denom}`, - // ); - // - // const denomsAfter = await getDenomsFromCreator( - // neutronChain.sdk.url, - // ownerWallet.address.toString(), - // ); - // - // expect(denomsAfter.denoms).toContainEqual( - // `factory/${ownerWallet.address.toString()}/${denom}`, - // ); - // }); - // - // test('create denom, mint', async () => { - // const denom = `test2`; - // - // const data = await msgCreateDenom( - // neutronAccount, - // ownerWallet.address.toString(), - // denom, - // ); - // const newTokenDenom = getEventAttribute( - // (data as any).events, - // 'create_denom', - // 'new_token_denom', - // ); - // - // await msgMintDenom(neutronAccount, ownerWallet.address.toString(), { - // denom: newTokenDenom, - // amount: '10000', - // }); - // - // const balanceBefore = await neutronChain.queryDenomBalance( - // ownerWallet.address.toString(), - // newTokenDenom, - // ); - // - // expect(balanceBefore).toEqual(10000); - // }); - // - // test('check authority metadata update', async () => { - // const denom = `test3`; - // - // const data = await msgCreateDenom( - // neutronAccount, - // ownerWallet.address.toString(), - // denom, - // ); - // const newTokenDenom = getEventAttribute( - // (data as any).events, - // 'create_denom', - // 'new_token_denom', - // ); - // - // const authorityMetadataBefore = await getAuthorityMetadata( - // neutronChain.sdk.url, - // newTokenDenom, - // ); - // - // expect(authorityMetadataBefore.authority_metadata).toEqual({ - // Admin: ownerWallet.address.toString(), - // }); - // - // const newAdmin = 'neutron1pyqyzrh6p4skmm43zrpt77wgrqq588vc8nhpfz'; - // - // await msgChangeAdmin( - // neutronAccount, - // ownerWallet.address.toString(), - // newTokenDenom, - // newAdmin, - // ); - // - // const authorityMetadataAfter = await getAuthorityMetadata( - // neutronChain.sdk.url, - // newTokenDenom, - // ); - // - // expect(authorityMetadataAfter.authority_metadata).toEqual({ - // Admin: newAdmin, - // }); - // }); - // - // // Test denom creation, mint some coins and burn some of them - // test('create denom, mint and burn', async () => { - // const denom = `test4`; - // - // const data = await msgCreateDenom( - // neutronAccount, - // ownerWallet.address.toString(), - // denom, - // ); - // const newTokenDenom = getEventAttribute( - // (data as any).events, - // 'create_denom', - // 'new_token_denom', - // ); - // await msgMintDenom(neutronAccount, ownerWallet.address.toString(), { - // denom: newTokenDenom, - // amount: '10000', - // }); - // - // const balanceBefore = await neutronChain.queryDenomBalance( - // ownerWallet.address.toString(), - // newTokenDenom, - // ); - // - // expect(balanceBefore).toEqual(10000); - // - // await msgBurn( - // neutronAccount, - // ownerWallet.address.toString(), - // newTokenDenom, - // '100', - // ); - // - // const balanceAfter = await neutronChain.queryDenomBalance( - // ownerWallet.address.toString(), - // newTokenDenom, - // ); - // - // expect(balanceAfter).toEqual(9900); - // }); - // test('create denom, set before send hook', async () => { - // const codeId = await neutronAccount.storeWasm( - // NeutronContract.BEFORE_SEND_HOOK_TEST, - // ); - // expect(codeId).toBeGreaterThan(0); - // - // const res = await neutronAccount.instantiateContract( - // codeId, - // '{}', - // 'before_send_hook_test', - // ); - // const contractAddress = res[0]._contract_address; - // - // const denom = `test5`; - // - // const data = await msgCreateDenom( - // neutronAccount, - // ownerWallet.address.toString(), - // denom, - // ); - // const newTokenDenom = getEventAttribute( - // (data as any).events, - // 'create_denom', - // 'new_token_denom', - // ); - // - // await msgMintDenom(neutronAccount, ownerWallet.address.toString(), { - // denom: newTokenDenom, - // amount: '10000', - // }); - // - // const balanceBefore = await neutronChain.queryDenomBalance( - // ownerWallet.address.toString(), - // newTokenDenom, - // ); - // - // expect(balanceBefore).toEqual(10000); - // - // await neutronAccount.msgSend(contractAddress, { - // amount: '666', - // denom: newTokenDenom, - // }); - // - // const contractBalance = await neutronChain.queryDenomBalance( - // contractAddress, - // newTokenDenom, - // ); - // expect(contractBalance).toEqual(666); - // - // let queryBlock = await neutronChain.queryContract<{ - // block: { received: boolean }; - // }>(contractAddress, { - // sudo_result_block_before: {}, - // }); - // let queryTrack = await neutronChain.queryContract<{ - // track: { received: boolean }; - // }>(contractAddress, { - // sudo_result_track_before: {}, - // }); - // - // expect(queryTrack.track.received).toEqual(false); - // expect(queryBlock.block.received).toEqual(false); - // - // await msgSetBeforeSendHook( - // neutronAccount, - // ownerWallet.address.toString(), - // newTokenDenom, - // contractAddress, - // ); - // - // const hookAfter = await getBeforeSendHook( - // neutronChain.sdk.url, - // newTokenDenom, - // ); - // expect(hookAfter.contract_addr).toEqual(contractAddress); - // - // await neutronAccount.msgSend(contractAddress, { - // amount: '1', - // denom: newTokenDenom, - // }); - // - // const contractBalanceAfter = await neutronChain.queryDenomBalance( - // contractAddress, - // newTokenDenom, - // ); - // expect(contractBalanceAfter).toEqual(667); - // - // const balanceAfter = await neutronChain.queryDenomBalance( - // ownerWallet.address.toString(), - // newTokenDenom, - // ); - // expect(balanceAfter).toEqual(9333); - // - // queryBlock = await neutronChain.queryContract<{ - // block: { received: boolean }; - // }>(contractAddress, { - // sudo_result_block_before: {}, - // }); - // - // queryTrack = await neutronChain.queryContract<{ - // track: { received: boolean }; - // }>(contractAddress, { - // sudo_result_track_before: {}, - // }); - // - // expect(queryTrack.track.received).toEqual(true); - // expect(queryBlock.block.received).toEqual(true); - // }); - // }); - // - // describe('wasmbindings', () => { - // let contractAddress: string; - // const subdenom = 'mycoin'; - // let denom: string; - // let amount = 10000000; - // const toBurn = 1000000; - // - // test('setup contract', async () => { - // const codeId = await neutronAccount.storeWasm( - // NeutronContract.TOKENFACTORY, - // ); - // expect(codeId).toBeGreaterThan(0); - // - // const res = await neutronAccount.instantiateContract( - // codeId, - // '{}', - // 'tokenfactory', - // ); - // contractAddress = res[0]._contract_address; - // - // await neutronAccount.msgSend(contractAddress, { - // amount: '10000000', - // denom: 'untrn', - // }); - // }); - // - // test('create denom', async () => { - // const res = await neutronAccount.executeContract( - // contractAddress, - // JSON.stringify({ - // create_denom: { - // subdenom, - // }, - // }), - // ); - // denom = res.logs[0].events - // ?.find((event) => event.type == 'create_denom') - // ?.attributes?.find( - // (attribute) => attribute.key == 'new_token_denom', - // )?.value; - // }); - // - // test('set denom metadata', async () => { - // await neutronAccount.executeContract( - // contractAddress, - // JSON.stringify({ - // set_denom_metadata: { - // description: denom, - // denom_units: [ - // { - // denom, - // exponent: 0, - // aliases: [], - // }, - // ], - // base: denom, - // display: denom, - // name: denom, - // symbol: denom, - // uri: denom, - // uri_hash: denom, - // }, - // }), - // ); - // - // const metadatas = await neutronChain.queryDenomsMetadata(); - // const metadata = metadatas.metadatas.find((meta) => meta.base == denom); - // expect(metadata.base).toEqual(denom); - // expect(metadata.uri).toEqual(denom); - // expect(metadata.display).toEqual(denom); - // expect(metadata.description).toEqual(denom); - // expect(metadata.name).toEqual(denom); - // expect(metadata.symbol).toEqual(denom); - // expect(metadata.uri_hash).toEqual(denom); - // expect(metadata.denom_units.length).toEqual(1); - // expect(metadata.denom_units[0].denom).toEqual(denom); - // }); - // - // test('mint coins', async () => { - // await neutronAccount.executeContract( - // contractAddress, - // JSON.stringify({ - // mint_tokens: { - // denom, - // amount: amount.toString(), - // }, - // }), - // ); - // - // const balance = await neutronChain.queryDenomBalance( - // contractAddress, - // denom, - // ); - // expect(balance).toEqual(amount); - // }); - // - // test('burn coins', async () => { - // await neutronAccount.executeContract( - // contractAddress, - // JSON.stringify({ - // burn_tokens: { - // denom, - // amount: toBurn.toString(), - // }, - // }), - // ); - // amount -= toBurn; - // - // const balance = await neutronChain.queryDenomBalance( - // contractAddress, - // denom, - // ); - // expect(balance).toEqual(amount); - // }); - // - // test('full denom query', async () => { - // const res = await neutronChain.queryContract<{ denom: string }>( - // contractAddress, - // { - // full_denom: { creator_addr: contractAddress, subdenom }, - // }, - // ); - // expect(res.denom).toEqual(denom); - // }); - // - // test('denom admin query', async () => { - // const res = await neutronChain.queryContract<{ admin: string }>( - // contractAddress, - // { - // denom_admin: { - // subdenom: denom, - // }, - // }, - // ); - // expect(res.admin).toEqual(contractAddress); - // }); - // - // test('set_before_send_hook', async () => { - // await neutronAccount.executeContract( - // contractAddress, - // JSON.stringify({ - // set_before_send_hook: { - // denom, - // contract_addr: contractAddress, - // }, - // }), - // ); - // const res = await neutronChain.queryContract<{ - // contract_addr: string; - // }>(contractAddress, { - // before_send_hook: { - // denom, - // }, - // }); - // expect(res.contract_addr).toEqual(contractAddress); - // - // await neutronAccount.executeContract( - // contractAddress, - // JSON.stringify({ - // set_before_send_hook: { - // denom, - // contract_addr: '', - // }, - // }), - // ); - // - // // TODO: check that it actually sets hook by querying tokenfactory module - // }); - // - // test('force transfer', async () => { - // const randomAccount = 'neutron14640tst2rx45nxg3evqwlzuaestnnhm8es3rtc'; - // const randomAccount2 = 'neutron14qncu5xag9ec26cx09x6pwncn9w74pq3zqe408'; - // - // await neutronAccount.executeContract( - // contractAddress, - // JSON.stringify({ - // mint_tokens: { - // denom, - // amount: amount.toString(), - // }, - // }), - // ); - // - // await neutronAccount.executeContract( - // contractAddress, - // JSON.stringify({ - // send_tokens: { - // recipient: randomAccount, - // denom, - // amount: amount.toString(), - // }, - // }), - // ); - // const balance = await neutronChain.queryDenomBalance( - // randomAccount, - // denom, - // ); - // expect(balance).toEqual(amount); - // - // await neutronAccount.executeContract( - // contractAddress, - // JSON.stringify({ - // force_transfer: { - // denom, - // amount: amount.toString(), - // from: randomAccount, - // to: randomAccount2, - // }, - // }), - // ); - // const balance2 = await neutronChain.queryDenomBalance( - // randomAccount2, - // denom, - // ); - // expect(balance2).toEqual(amount); - // }); - // - // test('change admin', async () => { - // await neutronAccount.executeContract( - // contractAddress, - // JSON.stringify({ - // send_tokens: { - // recipient: neutronAccount.wallet.address.toString(), - // denom, - // amount: amount.toString(), - // }, - // }), - // ); - // await neutronAccount.executeContract( - // contractAddress, - // JSON.stringify({ - // change_admin: { - // denom, - // new_admin_address: neutronAccount.wallet.address.toString(), - // }, - // }), - // ); - // - // const balance = await neutronChain.queryDenomBalance( - // neutronAccount.wallet.address.toString(), - // denom, - // ); - // expect(balance).toEqual(amount); - // const res = await neutronChain.queryContract<{ admin: string }>( - // contractAddress, - // { - // denom_admin: { - // subdenom: denom, - // }, - // }, - // ); - // expect(res.admin).toEqual(neutronAccount.wallet.address.toString()); - // }); - // }); + test('tokenfactory module is added', async () => { + const paramsPresent = await checkTokenfactoryParams(neutronChain.sdk.url); + expect(paramsPresent).toBeTruthy(); + }); + + describe('Module itself', () => { + test('create denoms and check list', async () => { + const denom = 'test1'; + const data = await msgCreateDenom( + neutronAccount, + ownerWallet.address.toString(), + 'test1', + ); + + const newTokenDenom = getEventAttribute( + (data as any).events, + 'create_denom', + 'new_token_denom', + ); + + expect(newTokenDenom).toEqual( + `factory/${ownerWallet.address.toString()}/${denom}`, + ); + + const denomsAfter = await getDenomsFromCreator( + neutronChain.sdk.url, + ownerWallet.address.toString(), + ); + + expect(denomsAfter.denoms).toContainEqual( + `factory/${ownerWallet.address.toString()}/${denom}`, + ); + }); + + test('create denom, mint', async () => { + const denom = `test2`; + + const data = await msgCreateDenom( + neutronAccount, + ownerWallet.address.toString(), + denom, + ); + const newTokenDenom = getEventAttribute( + (data as any).events, + 'create_denom', + 'new_token_denom', + ); + + await msgMintDenom(neutronAccount, ownerWallet.address.toString(), { + denom: newTokenDenom, + amount: '10000', + }); + + const balanceBefore = await neutronChain.queryDenomBalance( + ownerWallet.address.toString(), + newTokenDenom, + ); + + expect(balanceBefore).toEqual(10000); + }); + + test('check authority metadata update', async () => { + const denom = `test3`; + + const data = await msgCreateDenom( + neutronAccount, + ownerWallet.address.toString(), + denom, + ); + const newTokenDenom = getEventAttribute( + (data as any).events, + 'create_denom', + 'new_token_denom', + ); + + const authorityMetadataBefore = await getAuthorityMetadata( + neutronChain.sdk.url, + newTokenDenom, + ); + + expect(authorityMetadataBefore.authority_metadata).toEqual({ + Admin: ownerWallet.address.toString(), + }); + + const newAdmin = 'neutron1pyqyzrh6p4skmm43zrpt77wgrqq588vc8nhpfz'; + + await msgChangeAdmin( + neutronAccount, + ownerWallet.address.toString(), + newTokenDenom, + newAdmin, + ); + + const authorityMetadataAfter = await getAuthorityMetadata( + neutronChain.sdk.url, + newTokenDenom, + ); + + expect(authorityMetadataAfter.authority_metadata).toEqual({ + Admin: newAdmin, + }); + }); + + // Test denom creation, mint some coins and burn some of them + test('create denom, mint and burn', async () => { + const denom = `test4`; + + const data = await msgCreateDenom( + neutronAccount, + ownerWallet.address.toString(), + denom, + ); + const newTokenDenom = getEventAttribute( + (data as any).events, + 'create_denom', + 'new_token_denom', + ); + await msgMintDenom(neutronAccount, ownerWallet.address.toString(), { + denom: newTokenDenom, + amount: '10000', + }); + + const balanceBefore = await neutronChain.queryDenomBalance( + ownerWallet.address.toString(), + newTokenDenom, + ); + + expect(balanceBefore).toEqual(10000); + + await msgBurn( + neutronAccount, + ownerWallet.address.toString(), + newTokenDenom, + '100', + ); + + const balanceAfter = await neutronChain.queryDenomBalance( + ownerWallet.address.toString(), + newTokenDenom, + ); + + expect(balanceAfter).toEqual(9900); + }); + test('create denom, set before send hook', async () => { + const codeId = await neutronAccount.storeWasm( + NeutronContract.BEFORE_SEND_HOOK_TEST, + ); + expect(codeId).toBeGreaterThan(0); + + const res = await neutronAccount.instantiateContract( + codeId, + '{}', + 'before_send_hook_test', + ); + const contractAddress = res[0]._contract_address; + + const denom = `test5`; + + const data = await msgCreateDenom( + neutronAccount, + ownerWallet.address.toString(), + denom, + ); + const newTokenDenom = getEventAttribute( + (data as any).events, + 'create_denom', + 'new_token_denom', + ); + + await msgMintDenom(neutronAccount, ownerWallet.address.toString(), { + denom: newTokenDenom, + amount: '10000', + }); + + const balanceBefore = await neutronChain.queryDenomBalance( + ownerWallet.address.toString(), + newTokenDenom, + ); + + expect(balanceBefore).toEqual(10000); + + await neutronAccount.msgSend(contractAddress, { + amount: '666', + denom: newTokenDenom, + }); + + const contractBalance = await neutronChain.queryDenomBalance( + contractAddress, + newTokenDenom, + ); + expect(contractBalance).toEqual(666); + + let queryBlock = await neutronChain.queryContract<{ + block: { received: boolean }; + }>(contractAddress, { + sudo_result_block_before: {}, + }); + let queryTrack = await neutronChain.queryContract<{ + track: { received: boolean }; + }>(contractAddress, { + sudo_result_track_before: {}, + }); + + expect(queryTrack.track.received).toEqual(false); + expect(queryBlock.block.received).toEqual(false); + + await msgSetBeforeSendHook( + neutronAccount, + ownerWallet.address.toString(), + newTokenDenom, + contractAddress, + ); + + const hookAfter = await getBeforeSendHook( + neutronChain.sdk.url, + newTokenDenom, + ); + expect(hookAfter.contract_addr).toEqual(contractAddress); + + await neutronAccount.msgSend(contractAddress, { + amount: '1', + denom: newTokenDenom, + }); + + const contractBalanceAfter = await neutronChain.queryDenomBalance( + contractAddress, + newTokenDenom, + ); + expect(contractBalanceAfter).toEqual(667); + + const balanceAfter = await neutronChain.queryDenomBalance( + ownerWallet.address.toString(), + newTokenDenom, + ); + expect(balanceAfter).toEqual(9333); + + queryBlock = await neutronChain.queryContract<{ + block: { received: boolean }; + }>(contractAddress, { + sudo_result_block_before: {}, + }); + + queryTrack = await neutronChain.queryContract<{ + track: { received: boolean }; + }>(contractAddress, { + sudo_result_track_before: {}, + }); + + expect(queryTrack.track.received).toEqual(true); + expect(queryBlock.block.received).toEqual(true); + }); + }); + + describe('wasmbindings', () => { + let contractAddress: string; + const subdenom = 'mycoin'; + let denom: string; + let amount = 10000000; + const toBurn = 1000000; + + test('setup contract', async () => { + const codeId = await neutronAccount.storeWasm( + NeutronContract.TOKENFACTORY, + ); + expect(codeId).toBeGreaterThan(0); + + const res = await neutronAccount.instantiateContract( + codeId, + '{}', + 'tokenfactory', + ); + contractAddress = res[0]._contract_address; + + await neutronAccount.msgSend(contractAddress, { + amount: '10000000', + denom: 'untrn', + }); + }); + + test('create denom', async () => { + const res = await neutronAccount.executeContract( + contractAddress, + JSON.stringify({ + create_denom: { + subdenom, + }, + }), + ); + console.log(JSON.stringify(res.events)) + denom = res.events + ?.find((event) => event.type == 'create_denom') + ?.attributes?.find( + (attribute) => attribute.key == 'new_token_denom', + )?.value; + console.log(denom); + console.log(contractAddress); + }); + + test('set denom metadata', async () => { + await neutronAccount.executeContract( + contractAddress, + JSON.stringify({ + set_denom_metadata: { + description: denom, + denom_units: [ + { + denom, + exponent: 0, + aliases: [], + }, + ], + base: denom, + display: denom, + name: denom, + symbol: denom, + uri: denom, + uri_hash: denom, + }, + }), + ); + + const metadatas = await neutronChain.queryDenomsMetadata(); + const metadata = metadatas.metadatas.find((meta) => meta.base == denom); + expect(metadata.base).toEqual(denom); + expect(metadata.uri).toEqual(denom); + expect(metadata.display).toEqual(denom); + expect(metadata.description).toEqual(denom); + expect(metadata.name).toEqual(denom); + expect(metadata.symbol).toEqual(denom); + expect(metadata.uri_hash).toEqual(denom); + expect(metadata.denom_units.length).toEqual(1); + expect(metadata.denom_units[0].denom).toEqual(denom); + }); + + test('mint coins', async () => { + await neutronAccount.executeContract( + contractAddress, + JSON.stringify({ + mint_tokens: { + denom, + amount: amount.toString(), + }, + }), + ); + + const balance = await neutronChain.queryDenomBalance( + contractAddress, + denom, + ); + expect(balance).toEqual(amount); + }); + + test('burn coins', async () => { + await neutronAccount.executeContract( + contractAddress, + JSON.stringify({ + burn_tokens: { + denom, + amount: toBurn.toString(), + }, + }), + ); + amount -= toBurn; + + const balance = await neutronChain.queryDenomBalance( + contractAddress, + denom, + ); + expect(balance).toEqual(amount); + }); + + test('full denom query', async () => { + const res = await neutronChain.queryContract<{ denom: string }>( + contractAddress, + { + full_denom: { creator_addr: contractAddress, subdenom }, + }, + ); + expect(res.denom).toEqual(denom); + }); + + test('denom admin query', async () => { + const res = await neutronChain.queryContract<{ admin: string }>( + contractAddress, + { + denom_admin: { + subdenom: denom, + }, + }, + ); + expect(res.admin).toEqual(contractAddress); + }); + + test('set_before_send_hook', async () => { + await neutronAccount.executeContract( + contractAddress, + JSON.stringify({ + set_before_send_hook: { + denom, + contract_addr: contractAddress, + }, + }), + ); + const res = await neutronChain.queryContract<{ + contract_addr: string; + }>(contractAddress, { + before_send_hook: { + denom, + }, + }); + expect(res.contract_addr).toEqual(contractAddress); + + await neutronAccount.executeContract( + contractAddress, + JSON.stringify({ + set_before_send_hook: { + denom, + contract_addr: '', + }, + }), + ); + + // TODO: check that it actually sets hook by querying tokenfactory module + }); + + test('force transfer', async () => { + const randomAccount = 'neutron14640tst2rx45nxg3evqwlzuaestnnhm8es3rtc'; + const randomAccount2 = 'neutron14qncu5xag9ec26cx09x6pwncn9w74pq3zqe408'; + + await neutronAccount.executeContract( + contractAddress, + JSON.stringify({ + mint_tokens: { + denom, + amount: amount.toString(), + }, + }), + ); + + await neutronAccount.executeContract( + contractAddress, + JSON.stringify({ + send_tokens: { + recipient: randomAccount, + denom, + amount: amount.toString(), + }, + }), + ); + const balance = await neutronChain.queryDenomBalance( + randomAccount, + denom, + ); + expect(balance).toEqual(amount); + + await neutronAccount.executeContract( + contractAddress, + JSON.stringify({ + force_transfer: { + denom, + amount: amount.toString(), + from: randomAccount, + to: randomAccount2, + }, + }), + ); + const balance2 = await neutronChain.queryDenomBalance( + randomAccount2, + denom, + ); + expect(balance2).toEqual(amount); + }); + + test('change admin', async () => { + await neutronAccount.executeContract( + contractAddress, + JSON.stringify({ + send_tokens: { + recipient: neutronAccount.wallet.address.toString(), + denom, + amount: amount.toString(), + }, + }), + ); + await neutronAccount.executeContract( + contractAddress, + JSON.stringify({ + change_admin: { + denom, + new_admin_address: neutronAccount.wallet.address.toString(), + }, + }), + ); + + const balance = await neutronChain.queryDenomBalance( + neutronAccount.wallet.address.toString(), + denom, + ); + expect(balance).toEqual(amount); + const res = await neutronChain.queryContract<{ admin: string }>( + contractAddress, + { + denom_admin: { + subdenom: denom, + }, + }, + ); + expect(res.admin).toEqual(neutronAccount.wallet.address.toString()); + }); + }); });