From ad99b69246f559775dd6df001ae176d22f86b3fe Mon Sep 17 00:00:00 2001 From: swelf Date: Thu, 1 Aug 2024 18:02:24 +0300 Subject: [PATCH 01/23] kv queries --- package.json | 6 +- src/helpers/interchainqueries.ts | 4 +- .../run_in_band/interchain_kv_query.test.ts | 137 +++++++++++++++++- .../interchain_tx_query_plain.test.ts | 11 +- src/testcases/run_in_band/parameters.test.ts | 4 + yarn.lock | 12 +- 6 files changed, 152 insertions(+), 22 deletions(-) diff --git a/package.json b/package.json index e9f241bf..d289d410 100644 --- a/package.json +++ b/package.json @@ -46,8 +46,8 @@ "@cosmjs/cosmwasm-stargate": "^0.32.4", "@cosmjs/stargate": "0.32.4", "@cosmjs/tendermint-rpc": "^0.32.4", - "@neutron-org/neutronjs": "0.1.0-rc4", - "@neutron-org/neutronjsplus": "https://github.com/neutron-org/neutronjsplus.git#4d1663cd0e46d488b742612ee62baf51dd3d8915", + "@neutron-org/neutronjs": "0.1.0-rc5", + "@neutron-org/neutronjsplus": "https://github.com/neutron-org/neutronjsplus.git#04cc73ea1fc9922cc3af774ccf6b16aeee26b7db", "@types/lodash": "^4.14.182", "axios": "^0.27.2", "commander": "^10.0.0", @@ -90,4 +90,4 @@ "engines": { "node": ">=20.0" } -} +} \ No newline at end of file diff --git a/src/helpers/interchainqueries.ts b/src/helpers/interchainqueries.ts index 770129bd..62acd517 100644 --- a/src/helpers/interchainqueries.ts +++ b/src/helpers/interchainqueries.ts @@ -604,13 +604,13 @@ export const registerTransfersQuery = async ( contractAddress: string, connectionId: string, updatePeriod: number, - recipient: string, + recipients: string[], ) => { const res = await cm.execute(contractAddress, { register_transfers_query: { connection_id: connectionId, update_period: updatePeriod, - recipient: recipient, + recipients: recipients, }, }); diff --git a/src/testcases/run_in_band/interchain_kv_query.test.ts b/src/testcases/run_in_band/interchain_kv_query.test.ts index 92e8cc7d..1b0d9d03 100644 --- a/src/testcases/run_in_band/interchain_kv_query.test.ts +++ b/src/testcases/run_in_band/interchain_kv_query.test.ts @@ -3,6 +3,7 @@ import { filterIBCDenoms, } from '../../helpers/interchainqueries'; import '@neutron-org/neutronjsplus'; +import { QueryClientImpl as AdminQueryClient } from '@neutron-org/neutronjs/cosmos/adminmodule/adminmodule/query.rpc.Query'; import { getEventAttribute } from '@neutron-org/neutronjsplus/dist/cosmos'; import { inject } from 'vitest'; import { @@ -59,6 +60,9 @@ import { QueryClientImpl as BankQuerier } from 'cosmjs-types/cosmos/bank/v1beta1 import { QueryClientImpl as SlashingQuerier } from 'cosmjs-types/cosmos/slashing/v1beta1/query'; const config = require('../../config.json'); +let chainManagerAddress: string; +let mainDao: Dao; + describe('Neutron / Interchain KV Query', () => { const connectionId = 'connection-0'; const updatePeriods: { [key: number]: number } = { @@ -66,6 +70,7 @@ describe('Neutron / Interchain KV Query', () => { 3: 4, 4: 3, 5: 4, + 6: 11, }; let testState: LocalState; let neutronClient: SigningNeutronClient; @@ -80,6 +85,7 @@ describe('Neutron / Interchain KV Query', () => { let bankQuerierGaia: BankQuerier; let slashingQuerier: SlashingQuerier; let contractAddress: string; + let daoMember: DaoMember; beforeAll(async () => { testState = await LocalState.create(config, inject('mnemonics')); @@ -114,9 +120,9 @@ describe('Neutron / Interchain KV Query', () => { neutronRpcClient, ); const daoContracts = await getDaoContracts(neutronClient, daoCoreAddress); - const dao = new Dao(neutronClient, daoContracts); - const daoMember = new DaoMember( - dao, + mainDao = new Dao(neutronClient, daoContracts); + daoMember = new DaoMember( + mainDao, neutronClient.client, neutronWallet.address, NEUTRON_DENOM, @@ -126,6 +132,10 @@ describe('Neutron / Interchain KV Query', () => { bankQuerier = new BankQuerier(neutronRpcClient); bankQuerierGaia = new BankQuerier(await testState.gaiaRpcClient()); slashingQuerier = new SlashingQuerier(await testState.gaiaRpcClient()); + + const adminQuery = new AdminQueryClient(neutronRpcClient); + const admins = await adminQuery.admins(); + chainManagerAddress = admins.admins[0]; }); describe('Instantiate interchain queries contract', () => { @@ -223,6 +233,43 @@ describe('Neutron / Interchain KV Query', () => { expect(balances.balances.length).toEqual(0); }); + + test('should throw exception because of too many keys', async () => { + await neutronClient.sendTokens( + contractAddress, + [{ denom: NEUTRON_DENOM, amount: '1000000' }], + { + gas: '200000', + amount: [{ denom: NEUTRON_DENOM, amount: '1000' }], + }, + ); + await expect( + neutronClient.execute(contractAddress, { + register_balances_query: { + connection_id: connectionId, + denoms: Array.from(Array(33).keys()).map((v) => 'denom' + v), + addr: gaiaWallet.address, + update_period: 10, + }, + }), + ).rejects.toThrowError(/keys count cannot be more than 32/); + await executeUpdateInterchainQueriesParams( + interchainqQuerier, + daoMember, + 10, + undefined, + ); + await expect( + neutronClient.execute(contractAddress, { + register_balances_query: { + connection_id: connectionId, + denoms: Array.from(Array(11).keys()).map((v) => 'denom' + v), + addr: gaiaWallet.address, + update_period: 10, + }, + }), + ).rejects.toThrowError(/keys count cannot be more than 10/); + }); }); describe('Successfully', () => { @@ -281,6 +328,23 @@ describe('Neutron / Interchain KV Query', () => { testState.wallets.cosmos.val1.address, ); }); + + test('register icq #6: 100 keys', async () => { + await executeUpdateInterchainQueriesParams( + interchainqQuerier, + daoMember, + 100, + undefined, + ); + await registerBalancesQuery( + neutronClient, + contractAddress, + connectionId, + updatePeriods[6], + Array.from(Array(100).keys()).map((v) => 'denom' + v), + testState.wallets.cosmos.val1.address, + ); + }); }); }); @@ -367,8 +431,33 @@ describe('Neutron / Interchain KV Query', () => { ); }); - test("registered icq #6 doesn't exist", async () => { + test('get registered icq #6: 100 keys', async () => { const queryId = 6; + const queryResult = await getRegisteredQuery( + neutronClient, + contractAddress, + queryId, + ); + expect(queryResult.registered_query.id).toEqual(queryId); + expect(queryResult.registered_query.owner).toEqual(contractAddress); + expect(queryResult.registered_query.keys.length).toEqual(100); + for (let i = 0; i < queryResult.registered_query.keys.length; i++) { + expect(queryResult.registered_query.keys[i].path).toEqual('bank'); + expect(queryResult.registered_query.keys[i].key.length).toBeGreaterThan( + 0, + ); + } + + expect(queryResult.registered_query.query_type).toEqual('kv'); + expect(queryResult.registered_query.transactions_filter).toEqual(''); + expect(queryResult.registered_query.connection_id).toEqual(connectionId); + expect(queryResult.registered_query.update_period).toEqual( + updatePeriods[queryId], + ); + }); + + test("registered icq #7 doesn't exist", async () => { + const queryId = 7; await expect( getRegisteredQuery(neutronClient, contractAddress, queryId), ).rejects.toThrow(); @@ -575,7 +664,7 @@ describe('Neutron / Interchain KV Query', () => { address: contractAddress, }); - expect(balances.balances[0].amount).toEqual('1000000'); + expect(balances.balances[0].amount).toEqual('2000000'); }); test('should fail to remove icq #2 from non owner address before timeout expiration', async () => { @@ -1181,3 +1270,41 @@ describe('Neutron / Interchain KV Query', () => { }); }); }); + +const executeUpdateInterchainQueriesParams = async ( + interchainQueriesQuerier: InterchainqQuerier, + daoMember: DaoMember, + maxKvQueryKeysCount?: number, + maxTransactionsFilters?: number, +) => { + const params = (await interchainQueriesQuerier.params()).params; + if (maxKvQueryKeysCount != undefined) { + params.maxKvQueryKeysCount = BigInt(maxKvQueryKeysCount); + } + + if (maxTransactionsFilters != undefined) { + params.maxTransactionsFilters = BigInt(maxTransactionsFilters); + } + + const proposalId = + await daoMember.submitUpdateParamsInterchainqueriesProposal( + chainManagerAddress, + 'Change Proposal - InterchainQueriesParams', + 'Param change proposal. It will change enabled params of interchainquries module.', + { + query_submit_timeout: Number(params.querySubmitTimeout), + query_deposit: params.queryDeposit, + tx_query_removal_limit: Number(params.txQueryRemovalLimit), + max_kv_query_keys_count: Number(params.maxKvQueryKeysCount), + max_transactions_filters: Number(params.maxTransactionsFilters), + }, + '1000', + ); + + await daoMember.voteYes(proposalId, 'single', { + gas: '4000000', + amount: [{ denom: NEUTRON_DENOM, amount: '100000' }], + }); + await mainDao.checkPassedProposal(proposalId); + await daoMember.executeProposalWithAttempts(proposalId); +}; diff --git a/src/testcases/run_in_band/interchain_tx_query_plain.test.ts b/src/testcases/run_in_band/interchain_tx_query_plain.test.ts index 4858fdec..990d4881 100644 --- a/src/testcases/run_in_band/interchain_tx_query_plain.test.ts +++ b/src/testcases/run_in_band/interchain_tx_query_plain.test.ts @@ -91,7 +91,7 @@ describe('Neutron / Interchain TX Query', () => { contractAddress, connectionId, query1UpdatePeriod, - watchedAddr1, + [watchedAddr1], ); }); @@ -254,7 +254,7 @@ describe('Neutron / Interchain TX Query', () => { contractAddress, connectionId, query2UpdatePeriod, - watchedAddr2, + [watchedAddr2], ); }); @@ -323,7 +323,7 @@ describe('Neutron / Interchain TX Query', () => { contractAddress, connectionId, query3UpdatePeriod, - watchedAddr3, + [watchedAddr3], ); }); @@ -622,14 +622,14 @@ describe('Neutron / Interchain TX Query', () => { contractAddress, connectionId, query4UpdatePeriod, - watchedAddr4, + [watchedAddr4], ); await registerTransfersQuery( neutronClient, contractAddress, connectionId, query5UpdatePeriod, - watchedAddr5, + [watchedAddr5], ); await neutronClient.waitBlocks(2); // wait for queries handling on init }); @@ -854,7 +854,6 @@ describe('Neutron / Interchain TX Query', () => { }); it('should handle callback on a sending to the new address', async () => { - const res = await gaiaWallet.msgSend(newWatchedAddr5, '10000'); const res = await gaiaClient.sendTokens( gaiaWallet.address, newWatchedAddr5, diff --git a/src/testcases/run_in_band/parameters.test.ts b/src/testcases/run_in_band/parameters.test.ts index 1e4f384d..fc55f615 100644 --- a/src/testcases/run_in_band/parameters.test.ts +++ b/src/testcases/run_in_band/parameters.test.ts @@ -113,6 +113,8 @@ describe('Neutron / Parameters', () => { query_submit_timeout: 30, query_deposit: null, tx_query_removal_limit: 20, + max_kv_query_keys_count: 10, + max_transactions_filters: 10, }), '1000', ); @@ -150,6 +152,8 @@ describe('Neutron / Parameters', () => { ); expect(paramsAfter.params.querySubmitTimeout).toEqual(30n); expect(paramsAfter.params.txQueryRemovalLimit).toEqual(20n); + expect(paramsAfter.params.maxKvQueryKeysCount).toEqual(10n); + expect(paramsAfter.params.maxTransactionsFilters).toEqual(10n); }); }); }); diff --git a/yarn.lock b/yarn.lock index b74b8b82..af792dff 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1325,14 +1325,14 @@ resolved "https://registry.yarnpkg.com/@neutron-org/cosmjs-types/-/cosmjs-types-0.9.2-rc1.tgz#ca1fc1dc9566858dbd765e8f82c8a70097bcc84b" integrity sha512-ju2AqJ14yO4+JF8RwY4ZVy7f2HVjhdf66SfhS6y4ucBZm997/E/yYVMnpWmUncVg8ARooISOKaOYNagqz0am6Q== -"@neutron-org/neutronjs@0.1.0-rc4": - version "0.1.0-rc4" - resolved "https://registry.yarnpkg.com/@neutron-org/neutronjs/-/neutronjs-0.1.0-rc4.tgz#5e6e56dcc3ffdc5a6421674195a6c15010fdd4f5" - integrity sha512-LXK+OkrwD81bApE8KBv6F7f7kMM28w5cfnuZmz8b4r7KrROZrxlWxsd7vzTlBhO8Dzups0LdUo1NYBoNc9oY2Q== +"@neutron-org/neutronjs@0.1.0-rc5": + version "0.1.0-rc5" + resolved "https://registry.yarnpkg.com/@neutron-org/neutronjs/-/neutronjs-0.1.0-rc5.tgz#ebdafe6951ad4b1c752b102e444dbe9dee8a0de9" + integrity sha512-9VGdDNMICs6oljsA96CloCz8/5ocnSTZyNpxkpC/AnZxl1QxukQp5+WatLAK0c5a0814RPOJ5+0L2mPvcINHDQ== -"@neutron-org/neutronjsplus@https://github.com/neutron-org/neutronjsplus.git#4d1663cd0e46d488b742612ee62baf51dd3d8915": +"@neutron-org/neutronjsplus@https://github.com/neutron-org/neutronjsplus.git#04cc73ea1fc9922cc3af774ccf6b16aeee26b7db": version "0.4.0-rc21" - resolved "https://github.com/neutron-org/neutronjsplus.git#4d1663cd0e46d488b742612ee62baf51dd3d8915" + resolved "https://github.com/neutron-org/neutronjsplus.git#04cc73ea1fc9922cc3af774ccf6b16aeee26b7db" dependencies: "@cosmjs/cosmwasm-stargate" "^0.32.4" "@cosmjs/proto-signing" "^0.32.4" From b900351580b7eac20c51197eb63bb4889addebee Mon Sep 17 00:00:00 2001 From: swelf Date: Thu, 1 Aug 2024 19:27:09 +0300 Subject: [PATCH 02/23] fixed icq tx --- src/helpers/interchainqueries.ts | 41 ++++++++ .../run_in_band/interchain_kv_query.test.ts | 48 ++-------- .../interchain_tx_query_plain.test.ts | 94 +++++++++++++++++++ 3 files changed, 142 insertions(+), 41 deletions(-) diff --git a/src/helpers/interchainqueries.ts b/src/helpers/interchainqueries.ts index df6e5d11..1d0c5f2b 100644 --- a/src/helpers/interchainqueries.ts +++ b/src/helpers/interchainqueries.ts @@ -6,6 +6,7 @@ import { getNeutronDAOCore, } from '@neutron-org/neutronjsplus/dist/dao'; import { QueryClientImpl as AdminQueryClient } from '@neutron-org/neutronjs/cosmos/adminmodule/adminmodule/query.rpc.Query'; +import { QueryClientImpl as InterchainqQuerier } from '@neutron-org/neutronjs/neutron/interchainqueries/query.rpc.Query'; import { paramChangeProposal } from '@neutron-org/neutronjsplus/dist/proposal'; import { CosmWasmClient, @@ -21,6 +22,46 @@ import { Coin } from '@neutron-org/neutronjs/cosmos/base/v1beta1/coin'; import { QueryClientImpl as BankQuerier } from 'cosmjs-types/cosmos/bank/v1beta1/query'; import { MsgRemoveInterchainQueryRequest } from '@neutron-org/neutronjs/neutron/interchainqueries/tx'; +export const executeUpdateInterchainQueriesParams = async ( + chainManagerAddress: string, + interchainQueriesQuerier: InterchainqQuerier, + mainDao: Dao, + daoMember: DaoMember, + maxKvQueryKeysCount?: number, + maxTransactionsFilters?: number, +) => { + const params = (await interchainQueriesQuerier.params()).params; + if (maxKvQueryKeysCount != undefined) { + params.maxKvQueryKeysCount = BigInt(maxKvQueryKeysCount); + } + + if (maxTransactionsFilters != undefined) { + params.maxTransactionsFilters = BigInt(maxTransactionsFilters); + } + + const proposalId = + await daoMember.submitUpdateParamsInterchainqueriesProposal( + chainManagerAddress, + 'Change Proposal - InterchainQueriesParams', + 'Param change proposal. It will change enabled params of interchainquries module.', + { + query_submit_timeout: Number(params.querySubmitTimeout), + query_deposit: params.queryDeposit, + tx_query_removal_limit: Number(params.txQueryRemovalLimit), + max_kv_query_keys_count: Number(params.maxKvQueryKeysCount), + max_transactions_filters: Number(params.maxTransactionsFilters), + }, + '1000', + ); + + await daoMember.voteYes(proposalId, 'single', { + gas: '4000000', + amount: [{ denom: NEUTRON_DENOM, amount: '100000' }], + }); + await mainDao.checkPassedProposal(proposalId); + await daoMember.executeProposalWithAttempts(proposalId); +}; + export const getKvCallbackStatus = async ( client: SigningNeutronClient, contractAddress: string, diff --git a/src/testcases/run_in_band/interchain_kv_query.test.ts b/src/testcases/run_in_band/interchain_kv_query.test.ts index 723d4a6e..b4ff53a8 100644 --- a/src/testcases/run_in_band/interchain_kv_query.test.ts +++ b/src/testcases/run_in_band/interchain_kv_query.test.ts @@ -1,5 +1,6 @@ import { acceptInterchainqueriesParamsChangeProposal, + executeUpdateInterchainQueriesParams, filterIBCDenoms, } from '../../helpers/interchainqueries'; import '@neutron-org/neutronjsplus'; @@ -60,9 +61,6 @@ import { QueryClientImpl as SlashingQuerier } from 'cosmjs-types/cosmos/slashing import config from '../../config.json'; import { Wallet } from '../../helpers/wallet'; -let chainManagerAddress: string; -let mainDao: Dao; - describe('Neutron / Interchain KV Query', () => { const connectionId = 'connection-0'; const updatePeriods: { [key: number]: number } = { @@ -86,6 +84,8 @@ describe('Neutron / Interchain KV Query', () => { let slashingQuerier: SlashingQuerier; let contractAddress: string; let daoMember: DaoMember; + let mainDao: Dao; + let chainManagerAddress: string; beforeAll(async () => { testState = await LocalState.create(config, inject('mnemonics')); @@ -254,7 +254,9 @@ describe('Neutron / Interchain KV Query', () => { }), ).rejects.toThrowError(/keys count cannot be more than 32/); await executeUpdateInterchainQueriesParams( + chainManagerAddress, interchainqQuerier, + mainDao, daoMember, 10, undefined, @@ -331,7 +333,9 @@ describe('Neutron / Interchain KV Query', () => { test('register icq #6: 100 keys', async () => { await executeUpdateInterchainQueriesParams( + chainManagerAddress, interchainqQuerier, + mainDao, daoMember, 100, undefined, @@ -1268,41 +1272,3 @@ describe('Neutron / Interchain KV Query', () => { }); }); }); - -const executeUpdateInterchainQueriesParams = async ( - interchainQueriesQuerier: InterchainqQuerier, - daoMember: DaoMember, - maxKvQueryKeysCount?: number, - maxTransactionsFilters?: number, -) => { - const params = (await interchainQueriesQuerier.params()).params; - if (maxKvQueryKeysCount != undefined) { - params.maxKvQueryKeysCount = BigInt(maxKvQueryKeysCount); - } - - if (maxTransactionsFilters != undefined) { - params.maxTransactionsFilters = BigInt(maxTransactionsFilters); - } - - const proposalId = - await daoMember.submitUpdateParamsInterchainqueriesProposal( - chainManagerAddress, - 'Change Proposal - InterchainQueriesParams', - 'Param change proposal. It will change enabled params of interchainquries module.', - { - query_submit_timeout: Number(params.querySubmitTimeout), - query_deposit: params.queryDeposit, - tx_query_removal_limit: Number(params.txQueryRemovalLimit), - max_kv_query_keys_count: Number(params.maxKvQueryKeysCount), - max_transactions_filters: Number(params.maxTransactionsFilters), - }, - '1000', - ); - - await daoMember.voteYes(proposalId, 'single', { - gas: '4000000', - amount: [{ denom: NEUTRON_DENOM, amount: '100000' }], - }); - await mainDao.checkPassedProposal(proposalId); - await daoMember.executeProposalWithAttempts(proposalId); -}; diff --git a/src/testcases/run_in_band/interchain_tx_query_plain.test.ts b/src/testcases/run_in_band/interchain_tx_query_plain.test.ts index c36eb96f..a4e85928 100644 --- a/src/testcases/run_in_band/interchain_tx_query_plain.test.ts +++ b/src/testcases/run_in_band/interchain_tx_query_plain.test.ts @@ -3,11 +3,15 @@ import { LocalState } from '../../helpers/local_state'; import { defaultRegistryTypes, MsgSendEncodeObject, + ProtobufRpcClient, SigningStargateClient, } from '@cosmjs/stargate'; import { SigningNeutronClient } from '../../helpers/signing_neutron_client'; import { Registry } from '@cosmjs/proto-signing'; +import { QueryClientImpl as AdminQueryClient } from '@neutron-org/neutronjs/cosmos/adminmodule/adminmodule/query.rpc.Query'; +import { QueryClientImpl as InterchainqQuerier } from '@neutron-org/neutronjs/neutron/interchainqueries/query.rpc.Query'; import { + executeUpdateInterchainQueriesParams, getRegisteredQuery, queryRecipientTxs, queryTransfersNumber, @@ -23,15 +27,26 @@ import { QueryClientImpl as BankQuerier } from 'cosmjs-types/cosmos/bank/v1beta1 import config from '../../config.json'; import { Wallet } from '../../helpers/wallet'; +import { + Dao, + DaoMember, + getDaoContracts, + getNeutronDAOCore, +} from '@neutron-org/neutronjsplus/dist/dao'; describe('Neutron / Interchain TX Query', () => { let testState: LocalState; let neutronClient: SigningNeutronClient; + let neutronRpcClient: ProtobufRpcClient; let gaiaClient: SigningStargateClient; let neutronWallet: Wallet; let gaiaWallet: Wallet; let contractAddress: string; let bankQuerierGaia: BankQuerier; + let interchainqQuerier: InterchainqQuerier; + let daoMember: DaoMember; + let mainDao: Dao; + let chainManagerAddress: string; const connectionId = 'connection-0'; beforeAll(async (suite: Suite) => { @@ -51,6 +66,26 @@ describe('Neutron / Interchain TX Query', () => { { registry: new Registry(defaultRegistryTypes) }, ); bankQuerierGaia = new BankQuerier(await testState.gaiaRpcClient()); + + neutronRpcClient = await testState.neutronRpcClient(); + const daoCoreAddress = await getNeutronDAOCore( + neutronClient, + neutronRpcClient, + ); + const daoContracts = await getDaoContracts(neutronClient, daoCoreAddress); + mainDao = new Dao(neutronClient, daoContracts); + daoMember = new DaoMember( + mainDao, + neutronClient.client, + neutronWallet.address, + NEUTRON_DENOM, + ); + await daoMember.bondFunds('1000000000'); + interchainqQuerier = new InterchainqQuerier(neutronRpcClient); + + const adminQuery = new AdminQueryClient(neutronRpcClient); + const admins = await adminQuery.admins(); + chainManagerAddress = admins.admins[0]; }); describe('deploy contract', () => { @@ -768,6 +803,65 @@ describe('Neutron / Interchain TX Query', () => { }); }); + describe('Multiple keys', () => { + test('Should fail. register filter with 50 keys', async () => { + // Top up contract address before running query + await neutronClient.sendTokens( + contractAddress, + [{ denom: NEUTRON_DENOM, amount: '1000000' }], + { + gas: '200000', + amount: [{ denom: NEUTRON_DENOM, amount: '1000' }], + }, + ); + await expect( + registerTransfersQuery( + neutronClient, + contractAddress, + connectionId, + query2UpdatePeriod, + Array(50).fill(watchedAddr2), + ), + ).rejects.toThrowError( + /failed to validate MsgRegisterInterchainQuery: too many transactions filters, provided=50, max=32/, + ); + }); + + test('Should pass. register filter with 50 keys after a proposal', async () => { + await executeUpdateInterchainQueriesParams( + chainManagerAddress, + interchainqQuerier, + mainDao, + daoMember, + undefined, + 50, + ); + + await registerTransfersQuery( + neutronClient, + contractAddress, + connectionId, + query2UpdatePeriod, + Array(50).fill(watchedAddr2), + ); + }); + + test('check registered transfers query', async () => { + const query = await getRegisteredQuery(neutronClient, contractAddress, 6); + expect(query.registered_query.id).toEqual(6); + expect(query.registered_query.owner).toEqual(contractAddress); + expect(query.registered_query.keys.length).toEqual(0); + expect(query.registered_query.query_type).toEqual('tx'); + expect(JSON.parse(query.registered_query.transactions_filter)).toEqual( + Array(50) + .fill(watchedAddr2) + .map((v) => ({ field: 'transfer.recipient', op: 'Eq', value: v })), + ); + expect(query.registered_query.connection_id).toEqual(connectionId); + expect(query.registered_query.update_period).toEqual(query2UpdatePeriod); + }); + }); + describe('check contract state is reverted on failed sudo', () => { // contract handles only transfers <= 20000, otherwise it ends callback with an error. const amountToAddrForth2 = 21000; From 1f5d7b269416ed6af54d3b2e39c13f980cde781c Mon Sep 17 00:00:00 2001 From: keylogic1 <119584546+keylogic1@users.noreply.github.com> Date: Tue, 6 Aug 2024 16:23:39 +0300 Subject: [PATCH 03/23] Upgrade to docker v2 --- setup/Makefile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/setup/Makefile b/setup/Makefile index 1d447f09..22f7280a 100644 --- a/setup/Makefile +++ b/setup/Makefile @@ -1,5 +1,5 @@ APP_DIR ?= ../.. -COMPOSE ?= docker-compose +COMPOSE ?= "docker compose" build-gaia: @docker buildx build --load --build-context app=$(APP_DIR)/gaia --build-context setup=$(APP_DIR)/neutron/network -t gaia-node -f dockerbuilds/Dockerfile.gaia --build-arg BINARY=gaiad . From 570554fce7159143f3121727a1fc7cbad8955d8e Mon Sep 17 00:00:00 2001 From: keylogic1 <119584546+keylogic1@users.noreply.github.com> Date: Tue, 6 Aug 2024 18:12:52 +0300 Subject: [PATCH 04/23] Update Makefile --- setup/Makefile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/setup/Makefile b/setup/Makefile index 22f7280a..890d4387 100644 --- a/setup/Makefile +++ b/setup/Makefile @@ -1,5 +1,5 @@ APP_DIR ?= ../.. -COMPOSE ?= "docker compose" +COMPOSE ?= docker compose build-gaia: @docker buildx build --load --build-context app=$(APP_DIR)/gaia --build-context setup=$(APP_DIR)/neutron/network -t gaia-node -f dockerbuilds/Dockerfile.gaia --build-arg BINARY=gaiad . From 162f8037314dc12a43a85de08a909a220200146c Mon Sep 17 00:00:00 2001 From: swelf Date: Wed, 7 Aug 2024 13:12:07 +0300 Subject: [PATCH 05/23] fixed tests --- package.json | 2 +- src/testcases/parallel/interchain_tx_query_resubmit.test.ts | 2 +- src/testcases/run_in_band/parameters.test.ts | 5 ++--- yarn.lock | 4 ++-- 4 files changed, 6 insertions(+), 7 deletions(-) diff --git a/package.json b/package.json index 7f8c4795..d5f1ef2f 100644 --- a/package.json +++ b/package.json @@ -42,7 +42,7 @@ "@cosmjs/stargate": "0.32.4", "@cosmjs/tendermint-rpc": "^0.32.4", "@neutron-org/neutronjs": "0.1.0-rc5", - "@neutron-org/neutronjsplus": "https://github.com/neutron-org/neutronjsplus.git#04cc73ea1fc9922cc3af774ccf6b16aeee26b7db", + "@neutron-org/neutronjsplus": "https://github.com/neutron-org/neutronjsplus.git#cf53a61bd7d4aa1e9204c41b2c2ea36cb024ae7d", "@types/lodash": "^4.14.182", "axios": "1.6.0", "commander": "^10.0.0", diff --git a/src/testcases/parallel/interchain_tx_query_resubmit.test.ts b/src/testcases/parallel/interchain_tx_query_resubmit.test.ts index 581cee75..08eb4e15 100644 --- a/src/testcases/parallel/interchain_tx_query_resubmit.test.ts +++ b/src/testcases/parallel/interchain_tx_query_resubmit.test.ts @@ -87,7 +87,7 @@ describe('Neutron / Interchain TX Query Resubmit', () => { contractAddress, connectionId, query1UpdatePeriod, - watchedAddr1, + [watchedAddr1], ); }); diff --git a/src/testcases/run_in_band/parameters.test.ts b/src/testcases/run_in_band/parameters.test.ts index 0d553c85..cab91414 100644 --- a/src/testcases/run_in_band/parameters.test.ts +++ b/src/testcases/run_in_band/parameters.test.ts @@ -12,7 +12,6 @@ import { updateCronParamsProposal, updateFeeburnerParamsProposal, updateFeerefunderParamsProposal, - updateInterchainqueriesParamsProposal, updateInterchaintxsParamsProposal, updateTokenfactoryParamsProposal, updateTransferParamsProposal, @@ -108,13 +107,13 @@ describe('Neutron / Parameters', () => { chainManagerAddress, 'Proposal #1', 'Param change proposal. This one will pass', - updateInterchainqueriesParamsProposal({ + { query_submit_timeout: 30, query_deposit: null, tx_query_removal_limit: 20, max_kv_query_keys_count: 10, max_transactions_filters: 10, - }), + }, '1000', ); }); diff --git a/yarn.lock b/yarn.lock index ce18fa15..4c3b4956 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1312,9 +1312,9 @@ resolved "https://registry.yarnpkg.com/@neutron-org/neutronjs/-/neutronjs-0.1.0-rc5.tgz#ebdafe6951ad4b1c752b102e444dbe9dee8a0de9" integrity sha512-9VGdDNMICs6oljsA96CloCz8/5ocnSTZyNpxkpC/AnZxl1QxukQp5+WatLAK0c5a0814RPOJ5+0L2mPvcINHDQ== -"@neutron-org/neutronjsplus@https://github.com/neutron-org/neutronjsplus.git#04cc73ea1fc9922cc3af774ccf6b16aeee26b7db": +"@neutron-org/neutronjsplus@https://github.com/neutron-org/neutronjsplus.git#cf53a61bd7d4aa1e9204c41b2c2ea36cb024ae7d": version "0.4.0-rc21" - resolved "https://github.com/neutron-org/neutronjsplus.git#04cc73ea1fc9922cc3af774ccf6b16aeee26b7db" + resolved "https://github.com/neutron-org/neutronjsplus.git#cf53a61bd7d4aa1e9204c41b2c2ea36cb024ae7d" dependencies: "@cosmjs/cosmwasm-stargate" "^0.32.4" "@cosmjs/proto-signing" "^0.32.4" From 40dd2d9d7aff166cf85432844331aa01c46a14e1 Mon Sep 17 00:00:00 2001 From: nhpd Date: Thu, 8 Aug 2024 14:30:34 +0400 Subject: [PATCH 06/23] use RunnerTestSuite instead of deprecated Suite --- src/helpers/local_state.ts | 8 +++---- src/testcases/parallel/dao_assert.test.ts | 4 ++-- src/testcases/parallel/governance.test.ts | 4 ++-- src/testcases/parallel/ibc_transfer.test.ts | 4 ++-- .../interchain_tx_query_resubmit.test.ts | 4 ++-- src/testcases/parallel/overrule.test.ts | 4 ++-- .../parallel/stargate_queries.test.ts | 4 ++-- src/testcases/parallel/subdao.test.ts | 4 ++-- .../parallel/voting_registry.test.ts | 4 ++-- .../run_in_band/chain_manager.test.ts | 4 ++-- .../run_in_band/dex_stargate.test.ts | 4 ++-- src/testcases/run_in_band/feemarket.test.ts | 4 ++-- src/testcases/run_in_band/ibc_hooks.test.ts | 4 ++-- .../interchain_tx_query_plain.test.ts | 4 ++-- .../run_in_band/interchaintx.test.ts | 22 +++++++++---------- .../run_in_band/tokenfactory.test.ts | 4 ++-- 16 files changed, 42 insertions(+), 44 deletions(-) diff --git a/src/helpers/local_state.ts b/src/helpers/local_state.ts index 8775713b..d60fd116 100644 --- a/src/helpers/local_state.ts +++ b/src/helpers/local_state.ts @@ -5,7 +5,7 @@ import { QueryClient, } from '@cosmjs/stargate'; import { DirectSecp256k1HdWallet } from '@cosmjs/proto-signing'; -import { Suite } from 'vitest'; +import { RunnerTestSuite } from 'vitest'; import { connectComet } from '@cosmjs/tendermint-rpc'; import { COSMOS_PREFIX, NEUTRON_PREFIX } from './constants'; import { Wallet } from './wallet'; @@ -35,7 +35,7 @@ export class LocalState { static async create( config: any, mnemonics: string[], - suite?: Suite, + suite?: RunnerTestSuite, ): Promise { const res = new LocalState(config, mnemonics, suite); await res.init(); @@ -45,7 +45,7 @@ export class LocalState { protected constructor( private config: any, private mnemonics: string[], - private suite?: Suite | undefined, + private suite?: RunnerTestSuite | undefined, ) { this.rpcNeutron = process.env.NODE1_RPC || 'http://localhost:26657'; this.rpcGaia = process.env.NODE2_RPC || 'http://localhost:16657'; @@ -134,7 +134,7 @@ export const mnemonicToWallet = async ( return new Wallet(addrPrefix, directwallet, account, accountValoper); }; -async function testFilePosition(s: Suite): Promise { +async function testFilePosition(s: RunnerTestSuite): Promise { const filepath = s.file.filepath.trim(); const splitted = filepath.split('/'); const filename = splitted.pop().trim(); diff --git a/src/testcases/parallel/dao_assert.test.ts b/src/testcases/parallel/dao_assert.test.ts index 3df15d5d..f9008188 100644 --- a/src/testcases/parallel/dao_assert.test.ts +++ b/src/testcases/parallel/dao_assert.test.ts @@ -1,4 +1,4 @@ -import { inject, Suite } from 'vitest'; +import { RunnerTestSuite, inject } from 'vitest'; import { getContractsHashes } from '../../helpers/setup'; import '@neutron-org/neutronjsplus'; import { LocalState } from '../../helpers/local_state'; @@ -32,7 +32,7 @@ describe('Neutron / DAO check', () => { let feeburnerQuery: FeeburnerQueryClient; let wasmQuery: WasmQueryClient; - beforeAll(async (suite: Suite) => { + beforeAll(async (suite: RunnerTestSuite) => { testState = await LocalState.create(config, inject('mnemonics'), suite); const neutronWallet = await testState.nextWallet('neutron'); diff --git a/src/testcases/parallel/governance.test.ts b/src/testcases/parallel/governance.test.ts index fedf542c..a7031f77 100644 --- a/src/testcases/parallel/governance.test.ts +++ b/src/testcases/parallel/governance.test.ts @@ -10,7 +10,7 @@ import { getNeutronDAOCore, } from '@neutron-org/neutronjsplus/dist/dao'; import { updateInterchaintxsParamsProposal } from '@neutron-org/neutronjsplus/dist/proposal'; -import { Suite, inject } from 'vitest'; +import { RunnerTestSuite, inject } from 'vitest'; import { NEUTRON_DENOM } from '../../helpers/constants'; import { ParameterChangeProposal } from '@neutron-org/neutronjs/cosmos/params/v1beta1/params'; import { MsgSubmitProposalLegacy } from '@neutron-org/neutronjs/cosmos/adminmodule/adminmodule/tx'; @@ -48,7 +48,7 @@ describe('Neutron / Governance', () => { let interchaintxQuery: InterchainTxQueryClient; let interchainAccountsQuerier: InterchainAccountsQueryClient; - beforeAll(async (suite: Suite) => { + beforeAll(async (suite: RunnerTestSuite) => { testState = await LocalState.create(config, inject('mnemonics'), suite); neutronWallet = await testState.nextWallet('neutron'); neutronClient = await SigningNeutronClient.connectWithSigner( diff --git a/src/testcases/parallel/ibc_transfer.test.ts b/src/testcases/parallel/ibc_transfer.test.ts index 6d38e1e1..07570bd3 100644 --- a/src/testcases/parallel/ibc_transfer.test.ts +++ b/src/testcases/parallel/ibc_transfer.test.ts @@ -1,5 +1,5 @@ import { Registry } from '@cosmjs/proto-signing'; -import { Suite, inject } from 'vitest'; +import { RunnerTestSuite, inject } from 'vitest'; import { LocalState } from '../../helpers/local_state'; import { SigningNeutronClient } from '../../helpers/signing_neutron_client'; import { MsgTransfer as GaiaMsgTransfer } from 'cosmjs-types/ibc/applications/transfer/v1/tx'; @@ -45,7 +45,7 @@ describe('Neutron / IBC transfer', () => { let bankQuerier: BankQueryClient; let ibcQuerier: IbcQueryClient; - beforeAll(async (suite: Suite) => { + beforeAll(async (suite: RunnerTestSuite) => { testState = await LocalState.create(config, inject('mnemonics'), suite); neutronWallet = await testState.nextWallet('neutron'); diff --git a/src/testcases/parallel/interchain_tx_query_resubmit.test.ts b/src/testcases/parallel/interchain_tx_query_resubmit.test.ts index 581cee75..dcdbde5f 100644 --- a/src/testcases/parallel/interchain_tx_query_resubmit.test.ts +++ b/src/testcases/parallel/interchain_tx_query_resubmit.test.ts @@ -8,7 +8,7 @@ import { registerTransfersQuery, waitForTransfersAmount, } from '../../helpers/interchainqueries'; -import { Suite, inject } from 'vitest'; +import { RunnerTestSuite, inject } from 'vitest'; import { SigningNeutronClient } from '../../helpers/signing_neutron_client'; import { CONTRACTS, @@ -29,7 +29,7 @@ describe('Neutron / Interchain TX Query Resubmit', () => { let contractAddress: string; const connectionId = 'connection-0'; - beforeAll(async (suite: Suite) => { + beforeAll(async (suite: RunnerTestSuite) => { testState = await LocalState.create(config, inject('mnemonics'), suite); neutronWallet = await testState.nextWallet('neutron'); diff --git a/src/testcases/parallel/overrule.test.ts b/src/testcases/parallel/overrule.test.ts index 7778c121..d56f148a 100644 --- a/src/testcases/parallel/overrule.test.ts +++ b/src/testcases/parallel/overrule.test.ts @@ -3,7 +3,7 @@ import '@neutron-org/neutronjsplus'; import { NEUTRON_DENOM } from '@neutron-org/neutronjsplus/dist/constants'; import { LocalState } from '../../helpers/local_state'; import { Dao, DaoMember } from '@neutron-org/neutronjsplus/dist/dao'; -import { Suite, inject } from 'vitest'; +import { RunnerTestSuite, inject } from 'vitest'; import { addSubdaoToDao, deployNeutronDao, @@ -25,7 +25,7 @@ describe('Neutron / Subdao Overrule', () => { let neutronClient1: SigningNeutronClient; let neutronClient2: SigningNeutronClient; - beforeAll(async (suite: Suite) => { + beforeAll(async (suite: RunnerTestSuite) => { const mnemonics = inject('mnemonics'); testState = await LocalState.create(config, mnemonics, suite); neutronWallet1 = await testState.nextWallet('neutron'); diff --git a/src/testcases/parallel/stargate_queries.test.ts b/src/testcases/parallel/stargate_queries.test.ts index e07adbd3..52fe41a3 100644 --- a/src/testcases/parallel/stargate_queries.test.ts +++ b/src/testcases/parallel/stargate_queries.test.ts @@ -3,7 +3,7 @@ import { getEventAttribute } from '@neutron-org/neutronjsplus/dist/cosmos'; import { LocalState } from '../../helpers/local_state'; import { Wallet } from '../../helpers/wallet'; import { CONTRACTS } from '../../helpers/constants'; -import { Suite, inject } from 'vitest'; +import { RunnerTestSuite, inject } from 'vitest'; import { SigningNeutronClient } from '../../helpers/signing_neutron_client'; import { defaultRegistryTypes, SigningStargateClient } from '@cosmjs/stargate'; import { Registry } from '@cosmjs/proto-signing'; @@ -23,7 +23,7 @@ describe('Neutron / Stargate Queries', () => { let newTokenDenom: string; - beforeAll(async (suite: Suite) => { + beforeAll(async (suite: RunnerTestSuite) => { testState = await LocalState.create(config, inject('mnemonics'), suite); neutronWallet = await testState.nextWallet('neutron'); diff --git a/src/testcases/parallel/subdao.test.ts b/src/testcases/parallel/subdao.test.ts index 1768c604..9ae8b9e5 100644 --- a/src/testcases/parallel/subdao.test.ts +++ b/src/testcases/parallel/subdao.test.ts @@ -1,4 +1,4 @@ -import { Suite, inject } from 'vitest'; +import { RunnerTestSuite, inject } from 'vitest'; /* eslint-disable @typescript-eslint/no-non-null-assertion */ import '@neutron-org/neutronjsplus'; import { createBankSendMessage } from '@neutron-org/neutronjsplus/dist/cosmos'; @@ -37,7 +37,7 @@ describe('Neutron / Subdao', () => { let adminQuery: AdminQueryClient; let chainManagerAddress; - beforeAll(async (suite: Suite) => { + beforeAll(async (suite: RunnerTestSuite) => { testState = await LocalState.create(config, inject('mnemonics'), suite); neutronWallet1 = await testState.nextWallet('neutron'); securityDaoWallet = await testState.nextWallet('neutron'); diff --git a/src/testcases/parallel/voting_registry.test.ts b/src/testcases/parallel/voting_registry.test.ts index d5f9d88e..75653a4a 100644 --- a/src/testcases/parallel/voting_registry.test.ts +++ b/src/testcases/parallel/voting_registry.test.ts @@ -1,5 +1,5 @@ import { LocalState } from '../../helpers/local_state'; -import { Suite, inject } from 'vitest'; +import { RunnerTestSuite, inject } from 'vitest'; import { waitBlocks } from '@neutron-org/neutronjsplus/dist/wait'; import { SigningNeutronClient } from '../../helpers/signing_neutron_client'; import { NEUTRON_DENOM } from '@neutron-org/neutronjsplus/dist/constants'; @@ -38,7 +38,7 @@ describe('Neutron / Voting Registry', () => { // bonding to an additional vault const vault3Bonding = 5_000_000; - beforeAll(async (suite: Suite) => { + beforeAll(async (suite: RunnerTestSuite) => { const mnemonics = inject('mnemonics'); testState = await LocalState.create(config, mnemonics, suite); neutronWallet = await testState.nextWallet('neutron'); diff --git a/src/testcases/run_in_band/chain_manager.test.ts b/src/testcases/run_in_band/chain_manager.test.ts index a836bd29..a2f78d41 100644 --- a/src/testcases/run_in_band/chain_manager.test.ts +++ b/src/testcases/run_in_band/chain_manager.test.ts @@ -13,7 +13,7 @@ import { updateTokenfactoryParamsProposal, } from '@neutron-org/neutronjsplus/dist/proposal'; import { LocalState } from '../../helpers/local_state'; -import { Suite, inject } from 'vitest'; +import { RunnerTestSuite, inject } from 'vitest'; import { NEUTRON_DENOM } from '@neutron-org/neutronjsplus/dist/constants'; import { setupSubDaoTimelockSet } from '../../helpers/dao'; import { QueryClientImpl as CronQueryClient } from '@neutron-org/neutronjs/neutron/cron/query.rpc.Query'; @@ -36,7 +36,7 @@ describe('Neutron / Chain Manager', () => { let dexQuerier: DexQueryClient; let chainManagerAddress: string; - beforeAll(async (suite: Suite) => { + beforeAll(async (suite: RunnerTestSuite) => { testState = await LocalState.create(config, inject('mnemonics'), suite); const neutronWallet = await testState.nextWallet('neutron'); neutronClient = await SigningNeutronClient.connectWithSigner( diff --git a/src/testcases/run_in_band/dex_stargate.test.ts b/src/testcases/run_in_band/dex_stargate.test.ts index 8db29b05..3baee3c5 100644 --- a/src/testcases/run_in_band/dex_stargate.test.ts +++ b/src/testcases/run_in_band/dex_stargate.test.ts @@ -1,4 +1,4 @@ -import { inject, Suite } from 'vitest'; +import { RunnerTestSuite, inject } from 'vitest'; import { LocalState } from '../../helpers/local_state'; import { NEUTRON_DENOM } from '@neutron-org/neutronjsplus/dist/constants'; import config from '../../config.json'; @@ -16,7 +16,7 @@ describe('Neutron / dex module (stargate contract)', () => { let activeTrancheKey: string; let inactiveTrancheKey: string; - beforeAll(async (suite: Suite) => { + beforeAll(async (suite: RunnerTestSuite) => { testState = await LocalState.create(config, inject('mnemonics'), suite); neutronWallet = testState.wallets.neutron.demo1; neutronClient = await SigningNeutronClient.connectWithSigner( diff --git a/src/testcases/run_in_band/feemarket.test.ts b/src/testcases/run_in_band/feemarket.test.ts index 8d3b7ba1..3087b217 100644 --- a/src/testcases/run_in_band/feemarket.test.ts +++ b/src/testcases/run_in_band/feemarket.test.ts @@ -8,7 +8,7 @@ import { } from '@neutron-org/neutronjsplus/dist/dao'; import { DynamicFeesParams } from '@neutron-org/neutronjsplus/dist/proposal'; import { LocalState } from '../../helpers/local_state'; -import { Suite, inject } from 'vitest'; +import { RunnerTestSuite, inject } from 'vitest'; import { QueryClientImpl as FeemarketQueryClient } from '@neutron-org/neutronjs/feemarket/feemarket/v1/query.rpc.Query'; import { QueryClientImpl as AdminQueryClient } from '@neutron-org/neutronjs/cosmos/adminmodule/adminmodule/query.rpc.Query'; @@ -27,7 +27,7 @@ describe('Neutron / Fee Market', () => { let feemarketQuerier: FeemarketQueryClient; let chainManagerAddress: string; - beforeAll(async (suite: Suite) => { + beforeAll(async (suite: RunnerTestSuite) => { testState = await LocalState.create(config, inject('mnemonics'), suite); const neutronRpcClient = await testState.neutronRpcClient(); diff --git a/src/testcases/run_in_band/ibc_hooks.test.ts b/src/testcases/run_in_band/ibc_hooks.test.ts index a5342047..4ce70753 100644 --- a/src/testcases/run_in_band/ibc_hooks.test.ts +++ b/src/testcases/run_in_band/ibc_hooks.test.ts @@ -5,7 +5,7 @@ import { NEUTRON_DENOM, } from '../../helpers/constants'; import { LocalState } from '../../helpers/local_state'; -import { inject, Suite } from 'vitest'; +import { RunnerTestSuite, inject } from 'vitest'; import { SigningNeutronClient } from '../../helpers/signing_neutron_client'; import { defaultRegistryTypes, SigningStargateClient } from '@cosmjs/stargate'; import { Registry } from '@cosmjs/proto-signing'; @@ -26,7 +26,7 @@ describe('Neutron / IBC hooks', () => { const transferDenom = 'ibc/4E41ED8F3DCAEA15F4D6ADC6EDD7C04A676160735C9710B904B7BF53525B56D6'; - beforeAll(async (suite: Suite) => { + beforeAll(async (suite: RunnerTestSuite) => { testState = await LocalState.create(config, inject('mnemonics'), suite); neutronWallet = await testState.nextWallet('neutron'); diff --git a/src/testcases/run_in_band/interchain_tx_query_plain.test.ts b/src/testcases/run_in_band/interchain_tx_query_plain.test.ts index ede4657a..27699f58 100644 --- a/src/testcases/run_in_band/interchain_tx_query_plain.test.ts +++ b/src/testcases/run_in_band/interchain_tx_query_plain.test.ts @@ -1,4 +1,4 @@ -import { inject, Suite } from 'vitest'; +import { RunnerTestSuite, inject } from 'vitest'; import { LocalState } from '../../helpers/local_state'; import { defaultRegistryTypes, @@ -34,7 +34,7 @@ describe('Neutron / Interchain TX Query', () => { let bankQuerierGaia: BankQuerier; const connectionId = 'connection-0'; - beforeAll(async (suite: Suite) => { + beforeAll(async (suite: RunnerTestSuite) => { testState = await LocalState.create(config, inject('mnemonics'), suite); neutronWallet = await testState.nextWallet('neutron'); diff --git a/src/testcases/run_in_band/interchaintx.test.ts b/src/testcases/run_in_band/interchaintx.test.ts index 84c4bca6..d7638ab4 100644 --- a/src/testcases/run_in_band/interchaintx.test.ts +++ b/src/testcases/run_in_band/interchaintx.test.ts @@ -6,7 +6,7 @@ import { defaultRegistryTypes } from '@cosmjs/stargate'; import { Registry } from '@cosmjs/proto-signing'; import { CONTRACTS, COSMOS_DENOM, NEUTRON_DENOM } from '../../helpers/constants'; import { LocalState } from '../../helpers/local_state'; -import { Suite, inject } from 'vitest'; +import { RunnerTestSuite, inject } from 'vitest'; import { SigningNeutronClient } from '../../helpers/signing_neutron_client'; import { SigningStargateClient } from '@cosmjs/stargate'; @@ -34,7 +34,7 @@ describe('Neutron / Interchain TXs', () => { let contractAddress: string; let icaAddress1: string; let icaAddress2: string; - let stakingQuerier: StakingQueryClient; + let gaiaStakingQuerier: StakingQueryClient; let ibcQuerier: IbcQueryClient; let contractManagerQuerier: ContractManagerQuery; @@ -47,7 +47,7 @@ describe('Neutron / Interchain TXs', () => { const icaId2 = 'test2'; const connectionId = 'connection-0'; - beforeAll(async (suite: Suite) => { + beforeAll(async (suite: RunnerTestSuite) => { testState = await LocalState.create(config, inject('mnemonics'), suite); neutronWallet = await testState.nextWallet('neutron'); @@ -67,6 +67,8 @@ describe('Neutron / Interchain TXs', () => { const neutronRpcClient = await testState.neutronRpcClient(); ibcQuerier = new IbcQueryClient(neutronRpcClient); contractManagerQuerier = new ContractManagerQuery(neutronRpcClient); + const gaiaRpcClient = await testState.gaiaRpcClient(); + gaiaStakingQuerier = new StakingQueryClient(gaiaRpcClient); }); describe('Interchain Tx with multiple ICAs', () => { @@ -78,10 +80,6 @@ describe('Neutron / Interchain TXs', () => { 'interchaintx', ); }); - test('init client', async () => { - const gaiaRpcClient = await testState.gaiaRpcClient(); - stakingQuerier = new StakingQueryClient(gaiaRpcClient); - }); }); describe('Create ICAs and setup contract', () => { test('fund contract to pay fees', async () => { @@ -233,7 +231,7 @@ describe('Neutron / Interchain TXs', () => { const res1 = await getWithAttempts( gaiaClient, () => - stakingQuerier.DelegatorDelegations({ + gaiaStakingQuerier.DelegatorDelegations({ delegatorAddr: icaAddress1, }), async (delegations) => delegations.delegationResponses?.length == 1, @@ -252,7 +250,7 @@ describe('Neutron / Interchain TXs', () => { const res2 = await getWithAttempts( gaiaClient, () => - stakingQuerier.DelegatorDelegations({ + gaiaStakingQuerier.DelegatorDelegations({ delegatorAddr: icaAddress2, }), async (delegations) => delegations.delegationResponses?.length == 0, @@ -303,7 +301,7 @@ describe('Neutron / Interchain TXs', () => { const res1 = await getWithAttempts( gaiaClient, () => - stakingQuerier.DelegatorDelegations({ delegatorAddr: icaAddress1 }), + gaiaStakingQuerier.DelegatorDelegations({ delegatorAddr: icaAddress1 }), async (delegations) => delegations.delegationResponses?.length == 1, ); expect(res1.delegationResponses).toEqual([ @@ -317,7 +315,7 @@ describe('Neutron / Interchain TXs', () => { }, }, ]); - const res2 = await stakingQuerier.DelegatorDelegations({ + const res2 = await gaiaStakingQuerier.DelegatorDelegations({ delegatorAddr: icaAddress2, }); expect(res2.delegationResponses).toEqual([]); @@ -565,7 +563,7 @@ describe('Neutron / Interchain TXs', () => { }); }); test('check validator state after ICA recreation', async () => { - const res = await stakingQuerier.DelegatorDelegations({ + const res = await gaiaStakingQuerier.DelegatorDelegations({ delegatorAddr: icaAddress1, }); expect(res.delegationResponses).toEqual([ diff --git a/src/testcases/run_in_band/tokenfactory.test.ts b/src/testcases/run_in_band/tokenfactory.test.ts index 1863a613..d5267de2 100644 --- a/src/testcases/run_in_band/tokenfactory.test.ts +++ b/src/testcases/run_in_band/tokenfactory.test.ts @@ -2,7 +2,7 @@ import { updateTokenfactoryParamsProposal } from '@neutron-org/neutronjsplus/dis import '@neutron-org/neutronjsplus'; import { getEventAttribute } from '@neutron-org/neutronjsplus/dist/cosmos'; import { LocalState } from '../../helpers/local_state'; -import { Suite, inject } from 'vitest'; +import { RunnerTestSuite, inject } from 'vitest'; import { Dao, DaoMember, @@ -92,7 +92,7 @@ describe('Neutron / Tokenfactory', () => { let bankQuerier: BankQueryClient; let chainManagerAddress: string; - beforeAll(async (suite: Suite) => { + beforeAll(async (suite: RunnerTestSuite) => { testState = await LocalState.create(config, inject('mnemonics'), suite); neutronWallet = await testState.nextWallet('neutron'); neutronClient = await SigningNeutronClient.connectWithSigner( From f86752d2348f7f81baac702ce93aac9ff87930d0 Mon Sep 17 00:00:00 2001 From: nhpd Date: Thu, 8 Aug 2024 16:15:24 +0400 Subject: [PATCH 07/23] format --- .../run_in_band/interchaintx.test.ts | 34 ++++++++++++------- 1 file changed, 21 insertions(+), 13 deletions(-) diff --git a/src/testcases/run_in_band/interchaintx.test.ts b/src/testcases/run_in_band/interchaintx.test.ts index d7638ab4..46dfca55 100644 --- a/src/testcases/run_in_band/interchaintx.test.ts +++ b/src/testcases/run_in_band/interchaintx.test.ts @@ -1,15 +1,17 @@ -/* eslint-disable prettier/prettier */ import { IndexedTx, JsonObject } from '@cosmjs/cosmwasm-stargate'; import '@neutron-org/neutronjsplus'; import { getSequenceId } from '@neutron-org/neutronjsplus/dist/cosmos'; import { defaultRegistryTypes } from '@cosmjs/stargate'; import { Registry } from '@cosmjs/proto-signing'; -import { CONTRACTS, COSMOS_DENOM, NEUTRON_DENOM } from '../../helpers/constants'; +import { + CONTRACTS, + COSMOS_DENOM, + NEUTRON_DENOM, +} from '../../helpers/constants'; import { LocalState } from '../../helpers/local_state'; import { RunnerTestSuite, inject } from 'vitest'; import { SigningNeutronClient } from '../../helpers/signing_neutron_client'; import { SigningStargateClient } from '@cosmjs/stargate'; - import { QueryClientImpl as StakingQueryClient, QueryDelegatorDelegationsResponse, @@ -23,14 +25,18 @@ import { QueryFailuresResponse, } from '@neutron-org/cosmjs-types/neutron/contractmanager/query'; import { getWithAttempts } from '../../helpers/misc'; - -import config from '../../config.json'; import { Wallet } from '../../helpers/wallet'; -import { AcknowledgementResult, cleanAckResults, getAck, getAcks, waitForAck } from '../../helpers/interchaintxs'; +import { + AcknowledgementResult, + cleanAckResults, + getAck, + getAcks, + waitForAck, +} from '../../helpers/interchaintxs'; +import config from '../../config.json'; describe('Neutron / Interchain TXs', () => { let testState: LocalState; - let contractAddress: string; let icaAddress1: string; let icaAddress2: string; @@ -301,7 +307,9 @@ describe('Neutron / Interchain TXs', () => { const res1 = await getWithAttempts( gaiaClient, () => - gaiaStakingQuerier.DelegatorDelegations({ delegatorAddr: icaAddress1 }), + gaiaStakingQuerier.DelegatorDelegations({ + delegatorAddr: icaAddress1, + }), async (delegations) => delegations.delegationResponses?.length == 1, ); expect(res1.delegationResponses).toEqual([ @@ -832,17 +840,17 @@ describe('Neutron / Interchain TXs', () => { expect.objectContaining({ address: contractAddress, id: 0n, - error: 'codespace: wasm, code: 5', // execute wasm contract failer + error: 'codespace: wasm, code: 5', // execute wasm contract failed }), expect.objectContaining({ address: contractAddress, id: 1n, - error: 'codespace: wasm, code: 5', // execute wasm contract failer + error: 'codespace: wasm, code: 5', // execute wasm contract failed }), expect.objectContaining({ address: contractAddress, id: 2n, - error: 'codespace: wasm, code: 5', // execute wasm contract failer + error: 'codespace: wasm, code: 5', // execute wasm contract failed }), expect.objectContaining({ address: contractAddress, @@ -937,8 +945,8 @@ describe('Neutron / Interchain TXs', () => { const acks = await getAcks(neutronClient, contractAddress); expect(acks.length).toEqual(1); expect(acks[0].sequence_id).toEqual( - +JSON.parse(Buffer.from(failure.sudoPayload).toString()) - .response.request.sequence, + +JSON.parse(Buffer.from(failure.sudoPayload).toString()).response + .request.sequence, ); }); }); From 2662b8f1c11e7d85c5a672dc54cfffd18094e6d3 Mon Sep 17 00:00:00 2001 From: nhpd Date: Thu, 8 Aug 2024 16:56:49 +0400 Subject: [PATCH 08/23] feat: unordered ica check --- .../run_in_band/interchaintx.test.ts | 107 +++++++++++++++++- 1 file changed, 101 insertions(+), 6 deletions(-) diff --git a/src/testcases/run_in_band/interchaintx.test.ts b/src/testcases/run_in_band/interchaintx.test.ts index 46dfca55..655a0777 100644 --- a/src/testcases/run_in_band/interchaintx.test.ts +++ b/src/testcases/run_in_band/interchaintx.test.ts @@ -40,6 +40,7 @@ describe('Neutron / Interchain TXs', () => { let contractAddress: string; let icaAddress1: string; let icaAddress2: string; + let unorderedIcaAddress: string; let gaiaStakingQuerier: StakingQueryClient; let ibcQuerier: IbcQueryClient; let contractManagerQuerier: ContractManagerQuery; @@ -51,6 +52,7 @@ describe('Neutron / Interchain TXs', () => { const icaId1 = 'test1'; const icaId2 = 'test2'; + const unorderedIcaId = 'test-unordered'; const connectionId = 'connection-0'; beforeAll(async (suite: RunnerTestSuite) => { @@ -117,12 +119,22 @@ describe('Neutron / Interchain TXs', () => { }); expect(res.code).toEqual(0); }); + test('create unordered ICA', async () => { + const res = await neutronClient.execute(contractAddress, { + register: { + connection_id: connectionId, + interchain_account_id: unorderedIcaId, + ordering: 'ORDER_UNORDERED', + }, + }); + expect(res.code).toEqual(0); + }); test('check contract balance', async () => { const balance = await neutronClient.getBalance( contractAddress, NEUTRON_DENOM, ); - expect(balance.amount).toEqual('8000000'); + expect(balance.amount).toEqual('7000000'); }); test('multiple IBC accounts created', async () => { const channels = @@ -132,7 +144,7 @@ describe('Neutron / Interchain TXs', () => { // - one exists already, it is open for IBC transfers; // - two more should appear soon since we are opening them implicitly // through ICA creation. - async (channels) => channels.channels.length == 3, + async (channels) => channels.channels.length == 4, ); expect(channels.channels).toBeArray(); expect(channels.channels).toIncludeAllPartialMembers([ @@ -142,6 +154,9 @@ describe('Neutron / Interchain TXs', () => { { portId: `icacontroller-${contractAddress}.test2`, }, + { + portId: `icacontroller-${contractAddress}.test-unordered`, + }, ]); }); @@ -173,6 +188,20 @@ describe('Neutron / Interchain TXs', () => { expect(ica2.interchain_account_address).toStartWith('cosmos'); expect(ica2.interchain_account_address.length).toEqual(65); icaAddress2 = ica2.interchain_account_address; + + const icaUnordered = await neutronClient.getWithAttempts( + () => + neutronClient.queryContractSmart(contractAddress, { + interchain_account_address: { + interchain_account_id: icaId2, + connection_id: connectionId, + }, + }), + async (data) => data.interchain_account_address != null, + ); + expect(icaUnordered.interchain_account_address).toStartWith('cosmos'); + expect(icaUnordered.interchain_account_address.length).toEqual(65); + unorderedIcaAddress = icaUnordered.interchain_account_address; }); test('set payer fees', async () => { @@ -208,6 +237,17 @@ describe('Neutron / Interchain TXs', () => { }, ); expect(res2.code).toEqual(0); + // unordered ICA + const res3 = await gaiaClient.sendTokens( + gaiaWallet.address, + unorderedIcaAddress, + [{ denom: COSMOS_DENOM, amount: '10000' }], + { + gas: '200000', + amount: [{ denom: COSMOS_DENOM, amount: '1000' }], + }, + ); + expect(res3.code).toEqual(0); }); }); describe('Send Interchain TX', () => { @@ -268,7 +308,7 @@ describe('Neutron / Interchain TXs', () => { contractAddress, NEUTRON_DENOM, ); - expect(balance.amount).toEqual('7998000'); + expect(balance.amount).toEqual('6998000'); }); }); @@ -334,7 +374,7 @@ describe('Neutron / Interchain TXs', () => { NEUTRON_DENOM, ); // two interchain txs inside (2000 * 2 = 4000) - expect(balance.amount).toEqual('7994000'); + expect(balance.amount).toEqual('6994000'); }); }); @@ -457,8 +497,7 @@ describe('Neutron / Interchain TXs', () => { timeout: 1, }, }); - // FIXME - rawLog = res.events.join(''); + rawLog = res.rawLog; } catch (e) { rawLog = e.message; } @@ -523,6 +562,62 @@ describe('Neutron / Interchain TXs', () => { }); }); }); + + describe('Unordered channel', () => { + test('delegate with timeout', async () => { + await cleanAckResults(neutronClient, contractAddress); + const res = await neutronClient.execute(contractAddress, { + delegate: { + interchain_account_id: unorderedIcaId, + validator: testState.wallets.cosmos.val1.valAddress, + amount: '10', + denom: COSMOS_DENOM, + timeout: 1, + }, + }); + expect(res.code).toEqual(0); + console.log( + 'unordered ica delegate log: ' + JSON.stringify(res.rawLog), + ); + const sequenceId = getSequenceId(res); + console.log('unordered ica sequenceId: ' + sequenceId); + + // timeout handling may be slow, hence we wait for up to 100 blocks here + await waitForAck( + neutronClient, + contractAddress, + unorderedIcaId, + sequenceId, + 100, + ); + const ackRes = await getAck( + neutronClient, + contractAddress, + unorderedIcaId, + sequenceId, + ); + expect(ackRes).toMatchObject({ + timeout: 'message', + }); + }); + + test('delegate after the timeout on unordered channel should work as channel should still be open', async () => { + const res = await neutronClient.execute(contractAddress, { + delegate: { + interchain_account_id: icaId1, + validator: testState.wallets.cosmos.val1.valAddress, + amount: '10', + denom: COSMOS_DENOM, + timeout: 1, + }, + }); + console.log( + 'delegate after timeout rawLog: ' + JSON.stringify(res.rawLog), + ); + expect(res.code).toBe(0); + }); + }); + describe('Recreation', () => { test('recreate ICA1', async () => { const res = await neutronClient.execute(contractAddress, { From 34ae5b9251e4d6b2f431ad6ab9fe0aae121fcbdc Mon Sep 17 00:00:00 2001 From: nhpd Date: Tue, 13 Aug 2024 11:49:20 +0400 Subject: [PATCH 09/23] check ordering of newly created channels --- src/testcases/run_in_band/interchaintx.test.ts | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/testcases/run_in_band/interchaintx.test.ts b/src/testcases/run_in_band/interchaintx.test.ts index 655a0777..6b3cfd25 100644 --- a/src/testcases/run_in_band/interchaintx.test.ts +++ b/src/testcases/run_in_band/interchaintx.test.ts @@ -34,6 +34,7 @@ import { waitForAck, } from '../../helpers/interchaintxs'; import config from '../../config.json'; +import { Order } from '@neutron-org/neutronjs/ibc/core/channel/v1/channel'; describe('Neutron / Interchain TXs', () => { let testState: LocalState; @@ -150,12 +151,15 @@ describe('Neutron / Interchain TXs', () => { expect(channels.channels).toIncludeAllPartialMembers([ { portId: `icacontroller-${contractAddress}.test1`, + ordering: Order.ORDER_ORDERED, }, { portId: `icacontroller-${contractAddress}.test2`, + ordering: Order.ORDER_ORDERED, }, { portId: `icacontroller-${contractAddress}.test-unordered`, + ordering: Order.ORDER_UNORDERED, }, ]); }); From 241c9577f92b79e3d3c164aaff6e558428fc7886 Mon Sep 17 00:00:00 2001 From: nhpd Date: Tue, 13 Aug 2024 16:53:48 +0400 Subject: [PATCH 10/23] add unordered two tx's one not relayed case --- .../run_in_band/interchaintx.test.ts | 120 +++++++++++++++--- 1 file changed, 103 insertions(+), 17 deletions(-) diff --git a/src/testcases/run_in_band/interchaintx.test.ts b/src/testcases/run_in_band/interchaintx.test.ts index 6b3cfd25..e577eb71 100644 --- a/src/testcases/run_in_band/interchaintx.test.ts +++ b/src/testcases/run_in_band/interchaintx.test.ts @@ -33,6 +33,7 @@ import { getAcks, waitForAck, } from '../../helpers/interchaintxs'; +import { execSync } from 'child_process'; import config from '../../config.json'; import { Order } from '@neutron-org/neutronjs/ibc/core/channel/v1/channel'; @@ -568,7 +569,7 @@ describe('Neutron / Interchain TXs', () => { }); describe('Unordered channel', () => { - test('delegate with timeout', async () => { + test('delegate with timeout does not close unordered channel', async () => { await cleanAckResults(neutronClient, contractAddress); const res = await neutronClient.execute(contractAddress, { delegate: { @@ -603,12 +604,14 @@ describe('Neutron / Interchain TXs', () => { expect(ackRes).toMatchObject({ timeout: 'message', }); + + // TODO: check that channel is opened }); test('delegate after the timeout on unordered channel should work as channel should still be open', async () => { const res = await neutronClient.execute(contractAddress, { delegate: { - interchain_account_id: icaId1, + interchain_account_id: unorderedIcaId, validator: testState.wallets.cosmos.val1.valAddress, amount: '10', denom: COSMOS_DENOM, @@ -620,6 +623,74 @@ describe('Neutron / Interchain TXs', () => { ); expect(res.code).toBe(0); }); + + test('try two delegates with first one when relayer is paused, so only second delegate passed through', async () => { + const delegationsBefore = await gaiaStakingQuerier.ValidatorDelegations( + { validatorAddr: testState.wallets.cosmos.val1.valAddress }, + ); + + const pauseRes = execSync('docker pause setup-hermes-1'); + console.log('pauseRes: ' + pauseRes.toString()); + + // this should get through without relaying + const res1 = await neutronClient.execute(contractAddress, { + delegate: { + interchain_account_id: unorderedIcaId, + validator: testState.wallets.cosmos.val1.valAddress, + denom: COSMOS_DENOM, + amount: '15', + }, + }); + expect(res1.code).toEqual(0); + const sequenceId1 = getSequenceId(res1); + + // TODO: check that delegated did not change + // TODO: check that operation not acknowledged + + const unpauseRes = execSync('docker unpause setup-hermes-1'); + console.log('pauseRes: ' + unpauseRes.toString()); + + // this should be relayed first, even thought it has later sequence. + const res2 = await neutronClient.execute(contractAddress, { + delegate: { + interchain_account_id: unorderedIcaId, + validator: testState.wallets.cosmos.val1.valAddress, + denom: COSMOS_DENOM, + amount: '49', + }, + }); + expect(res2.code).toEqual(0); + const sequenceId2 = getSequenceId(res2); + expect(sequenceId1).toBe(sequenceId2 - 1); + + // timeout handling may be slow, hence we wait for up to 100 blocks here + await waitForAck( + neutronClient, + contractAddress, + unorderedIcaId, + sequenceId2, + 100, + ); + + const delegationsAfter = await gaiaStakingQuerier.ValidatorDelegations({ + validatorAddr: testState.wallets.cosmos.val1.valAddress, + }); + console.log( + 'before: ' + + JSON.stringify( + delegationsBefore.delegationResponses.map((d) => d.balance), + ), + ); + console.log( + 'after: ' + + JSON.stringify( + delegationsAfter.delegationResponses.map((d) => d.balance), + ), + ); + + // TODO: compare + // delegationsBefore.delegationResponses[0]. + }); }); describe('Recreation', () => { @@ -637,7 +708,7 @@ describe('Neutron / Interchain TXs', () => { // - one exists already, it is open for IBC transfers; // - two channels are already opened via ICA registration before // - one more, we are opening it right now - async (channels) => channels.channels.length == 4, + async (channels) => channels.channels.length == 5, ); await neutronClient.getWithAttempts( () => ibcQuerier.Channels({}), @@ -857,16 +928,21 @@ describe('Neutron / Interchain TXs', () => { integration_tests_set_sudo_failure_mock: { state: 'enabled' }, }); - // Testing timeout failure - await neutronClient.execute(contractAddress, { - delegate: { - interchain_account_id: icaId1, - validator: testState.wallets.cosmos.val1.valAddress, - amount: '10', - denom: COSMOS_DENOM, - timeout: 1, - }, - }); + try { + // Testing timeout failure + const kekw = await neutronClient.execute(contractAddress, { + delegate: { + interchain_account_id: icaId1, + validator: testState.wallets.cosmos.val1.valAddress, + amount: '10', + denom: COSMOS_DENOM, + timeout: 1, + }, + }); + console.log('result: ' + kekw.rawLog); + } catch (e) { + console.log('exception: ' + e.toString()); + } // wait until sudo is called and processed and failure is recorder await neutronClient.getWithAttempts( @@ -875,7 +951,7 @@ describe('Neutron / Interchain TXs', () => { address: contractAddress, failureId: 0n, }), - async (data) => data.failures.length == 5, + async (data) => data.failures.length == 6, 100, ); @@ -915,7 +991,12 @@ describe('Neutron / Interchain TXs', () => { address: contractAddress, failureId: 0n, }), - async (data) => data.failures.length == 6, + async (data) => { + console.log( + 'data.failures.length : ' + data.failures.length.toString(), + ); + return data.failures.length == 7; + }, 100, ); @@ -964,6 +1045,11 @@ describe('Neutron / Interchain TXs', () => { expect.objectContaining({ address: contractAddress, id: 5n, + error: 'codespace: wasm, code: 5', // contractmanager sudo limit exceeded + }), + expect.objectContaining({ + address: contractAddress, + id: 6n, error: 'codespace: contractmanager, code: 1103', // contractmanager sudo limit exceeded }), ]); @@ -1003,7 +1089,7 @@ describe('Neutron / Interchain TXs', () => { address: contractAddress, failureId: 0n, }); - expect(failuresResAfter.failures.length).toEqual(6); + expect(failuresResAfter.failures.length).toEqual(7); // make sure contract's state hasn't been changed const acks = await getAcks(neutronClient, contractAddress); @@ -1038,7 +1124,7 @@ describe('Neutron / Interchain TXs', () => { address: contractAddress, failureId: 0n, }); - expect(failuresResAfter.failures.length).toEqual(5); + expect(failuresResAfter.failures.length).toEqual(6); // make sure contract's state has been changed const acks = await getAcks(neutronClient, contractAddress); From 866213fb72e2e29c557b49d4786ed9c73735e1ff Mon Sep 17 00:00:00 2001 From: nhpd Date: Wed, 14 Aug 2024 14:53:02 +0400 Subject: [PATCH 11/23] tmp: try out manual relaying --- package.json | 2 + src/global_setup.ts | 4 + .../run_in_band/interchaintx.test.ts | 198 +++++++-- yarn.lock | 416 +++++++++++++++++- 4 files changed, 566 insertions(+), 54 deletions(-) diff --git a/package.json b/package.json index beaa1981..5acd65aa 100644 --- a/package.json +++ b/package.json @@ -38,6 +38,7 @@ "license": "Apache-2.0", "dependencies": { "@babel/plugin-transform-modules-commonjs": "^7.18.6", + "@confio/relayer": "^0.12.0", "@cosmjs/cosmwasm-stargate": "^0.32.4", "@cosmjs/stargate": "0.32.4", "@cosmjs/tendermint-rpc": "^0.32.4", @@ -53,6 +54,7 @@ "lodash": "^4.17.21", "long": "^5.2.1", "merkletreejs": "^0.3.9", + "sinon": "^18.0.0", "yesno": "^0.4.0" }, "devDependencies": { diff --git a/src/global_setup.ts b/src/global_setup.ts index d7389389..f30ce149 100644 --- a/src/global_setup.ts +++ b/src/global_setup.ts @@ -118,3 +118,7 @@ declare module 'vitest' { mnemonics: string[]; } } + +(BigInt.prototype as any).toJSON = function () { + return this.toString(); +}; diff --git a/src/testcases/run_in_band/interchaintx.test.ts b/src/testcases/run_in_band/interchaintx.test.ts index e577eb71..6bfc42dc 100644 --- a/src/testcases/run_in_band/interchaintx.test.ts +++ b/src/testcases/run_in_band/interchaintx.test.ts @@ -34,8 +34,10 @@ import { waitForAck, } from '../../helpers/interchaintxs'; import { execSync } from 'child_process'; +import { IbcClient, Link, NoopLogger } from '@confio/relayer/build'; import config from '../../config.json'; import { Order } from '@neutron-org/neutronjs/ibc/core/channel/v1/channel'; +import { GasPrice } from '@cosmjs/stargate/build/fee'; describe('Neutron / Interchain TXs', () => { let testState: LocalState; @@ -198,7 +200,7 @@ describe('Neutron / Interchain TXs', () => { () => neutronClient.queryContractSmart(contractAddress, { interchain_account_address: { - interchain_account_id: icaId2, + interchain_account_id: unorderedIcaId, connection_id: connectionId, }, }), @@ -569,21 +571,21 @@ describe('Neutron / Interchain TXs', () => { }); describe('Unordered channel', () => { - test('delegate with timeout does not close unordered channel', async () => { + test.skip('delegate with timeout does not close unordered channel', async () => { await cleanAckResults(neutronClient, contractAddress); const res = await neutronClient.execute(contractAddress, { delegate: { interchain_account_id: unorderedIcaId, validator: testState.wallets.cosmos.val1.valAddress, - amount: '10', + amount: '100', denom: COSMOS_DENOM, timeout: 1, }, }); expect(res.code).toEqual(0); - console.log( - 'unordered ica delegate log: ' + JSON.stringify(res.rawLog), - ); + // console.log( + // 'unordered ica delegate log: ' + JSON.stringify(res.rawLog), + // ); const sequenceId = getSequenceId(res); console.log('unordered ica sequenceId: ' + sequenceId); @@ -608,25 +610,60 @@ describe('Neutron / Interchain TXs', () => { // TODO: check that channel is opened }); - test('delegate after the timeout on unordered channel should work as channel should still be open', async () => { + test.skip('delegate after the timeout on unordered channel should work as channel should still be open', async () => { const res = await neutronClient.execute(contractAddress, { delegate: { interchain_account_id: unorderedIcaId, validator: testState.wallets.cosmos.val1.valAddress, - amount: '10', + amount: '770', denom: COSMOS_DENOM, - timeout: 1, }, }); + const sequenceId = getSequenceId(res); + await getAck( + neutronClient, + contractAddress, + unorderedIcaId, + sequenceId, + ); console.log( 'delegate after timeout rawLog: ' + JSON.stringify(res.rawLog), ); - expect(res.code).toBe(0); + expect(res.code).toBe(0); // works as channel is still open }); test('try two delegates with first one when relayer is paused, so only second delegate passed through', async () => { - const delegationsBefore = await gaiaStakingQuerier.ValidatorDelegations( - { validatorAddr: testState.wallets.cosmos.val1.valAddress }, + const neutronIbcClient = await IbcClient.connectWithSigner( + 'http://localhost:26657', + testState.wallets.neutron.demo1.directwallet, + testState.wallets.neutron.demo1.address, + { + gasPrice: GasPrice.fromString('0.05untrn'), + estimatedBlockTime: 3, // FIXME + estimatedIndexerTime: 100, + }, + ); + const gaiaIbcClient = await IbcClient.connectWithSigner( + 'http://localhost:16657', + testState.wallets.cosmos.demo1.directwallet, + testState.wallets.cosmos.demo1.address, + { + gasPrice: GasPrice.fromString('0.05uatom'), + estimatedBlockTime: 3, + estimatedIndexerTime: 100, + }, + ); + + const link = await Link.createWithExistingConnections( + neutronIbcClient, + gaiaIbcClient, + 'connection-0', + 'connection-0', + new NoopLogger(), + ); + + const delegationsBefore = await gaiaStakingQuerier.DelegatorDelegations( + { delegatorAddr: unorderedIcaAddress }, ); const pauseRes = execSync('docker pause setup-hermes-1'); @@ -638,17 +675,25 @@ describe('Neutron / Interchain TXs', () => { interchain_account_id: unorderedIcaId, validator: testState.wallets.cosmos.val1.valAddress, denom: COSMOS_DENOM, - amount: '15', + amount: '583', }, }); expect(res1.code).toEqual(0); const sequenceId1 = getSequenceId(res1); + console.log( + 'paused sequenceId (TO BE RELAYED ONLY LATER): ' + sequenceId1, + ); // TODO: check that delegated did not change // TODO: check that operation not acknowledged - const unpauseRes = execSync('docker unpause setup-hermes-1'); - console.log('pauseRes: ' + unpauseRes.toString()); + // const unpauseRes = execSync('docker unpause setup-hermes-1'); + // console.log('unpauseRes: ' + unpauseRes.toString()); + + const delegationsBefore2 = + await gaiaStakingQuerier.DelegatorDelegations({ + delegatorAddr: unorderedIcaAddress, + }); // this should be relayed first, even thought it has later sequence. const res2 = await neutronClient.execute(contractAddress, { @@ -656,14 +701,37 @@ describe('Neutron / Interchain TXs', () => { interchain_account_id: unorderedIcaId, validator: testState.wallets.cosmos.val1.valAddress, denom: COSMOS_DENOM, - amount: '49', + amount: '490', }, }); expect(res2.code).toEqual(0); const sequenceId2 = getSequenceId(res2); expect(sequenceId1).toBe(sequenceId2 - 1); + console.log('unpaused sequenceId: ' + sequenceId2); + + const pendingPackets = await link.getPendingPackets('A'); + console.log( + 'Pending packets to relay manually: ' + + JSON.stringify( + pendingPackets.map((p) => p.packet.sequence.toString()), + ), + ); + const res = await link.relayPackets('A', pendingPackets); + console.log( + 'Manual relay result: ' + + JSON.stringify( + res.map((p) => p.originalPacket.sequence.toString()), + ), + ); // timeout handling may be slow, hence we wait for up to 100 blocks here + await waitForAck( + neutronClient, + contractAddress, + unorderedIcaId, + sequenceId1, + 100, + ); await waitForAck( neutronClient, contractAddress, @@ -671,25 +739,59 @@ describe('Neutron / Interchain TXs', () => { sequenceId2, 100, ); + console.log( + 'should not get to this point! as were waiting for tx that was sent when relayer was paused', + ); - const delegationsAfter = await gaiaStakingQuerier.ValidatorDelegations({ - validatorAddr: testState.wallets.cosmos.val1.valAddress, + const delegationsAfter = await gaiaStakingQuerier.DelegatorDelegations({ + delegatorAddr: unorderedIcaAddress, }); console.log( - 'before: ' + - JSON.stringify( - delegationsBefore.delegationResponses.map((d) => d.balance), - ), + 'before: ' + JSON.stringify(delegationsBefore.delegationResponses), ); console.log( - 'after: ' + - JSON.stringify( - delegationsAfter.delegationResponses.map((d) => d.balance), - ), + 'before2: ' + JSON.stringify(delegationsBefore2.delegationResponses), + ); + console.log( + 'after : ' + JSON.stringify(delegationsAfter.delegationResponses), ); // TODO: compare // delegationsBefore.delegationResponses[0]. + + // TODO: clear first packet. Should be successful + const channel = (await ibcQuerier.Channels({})).channels.find( + (c) => c.ordering === Order.ORDER_UNORDERED, + ); + const clearPacketsCmd = + "docker exec setup-hermes-1 hermes --config /app/network/hermes/config.toml clear packets --chain 'test-1' --port " + + channel.portId + + ' --channel ' + + channel.channelId; + console.log('clearPacketsCmd: ' + clearPacketsCmd); + const clearPacketsRes = execSync(clearPacketsCmd); + console.log('clearPacketsRes: ' + clearPacketsRes.toString()); + + // timeout handling may be slow, hence we wait for up to 100 blocks here + await waitForAck( + neutronClient, + contractAddress, + unorderedIcaId, + sequenceId1, + 100, + ); + + // TODO: wait for ack sequenceId1 + // console.log( + // 'after2 : ' + + // JSON.stringify( + // delegationsAfter.delegationResponses.map((d) => d.balance), + // ), + // ); + + // unpause hermes for tests below + const unpauseRes = execSync('docker unpause setup-hermes-1'); + console.log('unpauseRes: ' + unpauseRes.toString()); }); }); @@ -758,7 +860,7 @@ describe('Neutron / Interchain TXs', () => { }); }); - describe('delegate with sudo failure', () => { + describe('Delegate with sudo failure', () => { beforeAll(async () => { await cleanAckResults(neutronClient, contractAddress); @@ -951,7 +1053,7 @@ describe('Neutron / Interchain TXs', () => { address: contractAddress, failureId: 0n, }), - async (data) => data.failures.length == 6, + async (data) => data.failures.length == 5, 100, ); @@ -991,12 +1093,7 @@ describe('Neutron / Interchain TXs', () => { address: contractAddress, failureId: 0n, }), - async (data) => { - console.log( - 'data.failures.length : ' + data.failures.length.toString(), - ); - return data.failures.length == 7; - }, + async (data) => data.failures.length == 6, 100, ); @@ -1045,13 +1142,13 @@ describe('Neutron / Interchain TXs', () => { expect.objectContaining({ address: contractAddress, id: 5n, - error: 'codespace: wasm, code: 5', // contractmanager sudo limit exceeded - }), - expect.objectContaining({ - address: contractAddress, - id: 6n, error: 'codespace: contractmanager, code: 1103', // contractmanager sudo limit exceeded }), + // expect.objectContaining({ + // address: contractAddress, + // id: 6n, + // // error: 'codespace: contractmanager, code: 1103', // contractmanager sudo limit exceeded + // }), ]); const acks = await getAcks(neutronClient, contractAddress); @@ -1137,3 +1234,26 @@ describe('Neutron / Interchain TXs', () => { }); }); }); + +function logger() { + return { + log: (msg) => { + console.log('LOG: ' + msg); + }, + info: (msg) => { + console.log('INFO: ' + msg); + }, + error: (msg) => { + console.log('ERROR: ' + msg); + }, + warn: (msg) => { + console.log('WARN: ' + msg); + }, + verbose: (msg) => { + console.log('VERBOSE: ' + msg); + }, + debug: (msg) => { + console.log('DEBUG: ' + msg); + }, + }; +} diff --git a/yarn.lock b/yarn.lock index 862ec492..97e2a7ab 100644 --- a/yarn.lock +++ b/yarn.lock @@ -946,6 +946,11 @@ "@babel/helper-validator-identifier" "^7.24.7" to-fast-properties "^2.0.0" +"@colors/colors@1.6.0": + version "1.6.0" + resolved "https://registry.yarnpkg.com/@colors/colors/-/colors-1.6.0.tgz#ec6cd237440700bc23ca23087f513c75508958b0" + integrity sha512-Ir+AOibqzrIsL6ajt3Rz3LskB7OiMVHqltZmspbW/TJuTVuyOMirVqAkjfY6JISiLHgyNqicAC8AyHHGzNd/dA== + "@confio/ics23@^0.6.8": version "0.6.8" resolved "https://registry.yarnpkg.com/@confio/ics23/-/ics23-0.6.8.tgz#2a6b4f1f2b7b20a35d9a0745bb5a446e72930b3d" @@ -954,6 +959,32 @@ "@noble/hashes" "^1.0.0" protobufjs "^6.8.8" +"@confio/relayer@^0.12.0": + version "0.12.0" + resolved "https://registry.yarnpkg.com/@confio/relayer/-/relayer-0.12.0.tgz#c63ec1aae7c6f14518a7958d491d135b39bb91c8" + integrity sha512-oLoE0VbW0TNt5RWQ7m87b5NfZ8ffY2O80OIM9y1G8S1CV7oNUi0iw0/yZRT0thSmSzHVTMGxTu1YB+jy0CqmVw== + dependencies: + "@cosmjs/cosmwasm-stargate" "^0.32.1" + "@cosmjs/crypto" "^0.32.1" + "@cosmjs/encoding" "^0.32.1" + "@cosmjs/faucet-client" "^0.32.1" + "@cosmjs/math" "^0.32.1" + "@cosmjs/proto-signing" "^0.32.1" + "@cosmjs/stargate" "^0.32.1" + "@cosmjs/stream" "^0.32.1" + "@cosmjs/tendermint-rpc" "^0.32.1" + "@cosmjs/utils" "^0.32.1" + ajv "7.1.1" + axios "^1.6.7" + commander "7.1.0" + cosmjs-types "^0.9.0" + fast-safe-stringify "2.0.4" + js-yaml "4.0.0" + prom-client "13.1.0" + table "^6.7.1" + triple-beam "1.3.0" + winston "3.3.3" + "@cosmjs/amino@^0.32.4": version "0.32.4" resolved "https://registry.yarnpkg.com/@cosmjs/amino/-/amino-0.32.4.tgz#3908946c0394e6d431694c8992c5147079a1c860" @@ -964,7 +995,7 @@ "@cosmjs/math" "^0.32.4" "@cosmjs/utils" "^0.32.4" -"@cosmjs/cosmwasm-stargate@^0.32.4": +"@cosmjs/cosmwasm-stargate@^0.32.1", "@cosmjs/cosmwasm-stargate@^0.32.4": version "0.32.4" resolved "https://registry.yarnpkg.com/@cosmjs/cosmwasm-stargate/-/cosmwasm-stargate-0.32.4.tgz#2ee93f2cc0b1c146ac369b2bf8ef9ee2e159fd50" integrity sha512-Fuo9BGEiB+POJ5WeRyBGuhyKR1ordvxZGLPuPosFJOH9U0gKMgcjwKMCgAlWFkMlHaTB+tNdA8AifWiHrI7VgA== @@ -980,7 +1011,7 @@ cosmjs-types "^0.9.0" pako "^2.0.2" -"@cosmjs/crypto@^0.32.4": +"@cosmjs/crypto@^0.32.1", "@cosmjs/crypto@^0.32.4": version "0.32.4" resolved "https://registry.yarnpkg.com/@cosmjs/crypto/-/crypto-0.32.4.tgz#5d29633b661eaf092ddb3e7ea6299cfd6f4507a2" integrity sha512-zicjGU051LF1V9v7bp8p7ovq+VyC91xlaHdsFOTo2oVry3KQikp8L/81RkXmUIT8FxMwdx1T7DmFwVQikcSDIw== @@ -993,7 +1024,7 @@ elliptic "^6.5.4" libsodium-wrappers-sumo "^0.7.11" -"@cosmjs/encoding@^0.32.4": +"@cosmjs/encoding@^0.32.1", "@cosmjs/encoding@^0.32.4": version "0.32.4" resolved "https://registry.yarnpkg.com/@cosmjs/encoding/-/encoding-0.32.4.tgz#646e0e809f7f4f1414d8fa991fb0ffe6c633aede" integrity sha512-tjvaEy6ZGxJchiizzTn7HVRiyTg1i4CObRRaTRPknm5EalE13SV+TCHq38gIDfyUeden4fCuaBVEdBR5+ti7Hw== @@ -1002,6 +1033,13 @@ bech32 "^1.1.4" readonly-date "^1.0.0" +"@cosmjs/faucet-client@^0.32.1": + version "0.32.4" + resolved "https://registry.yarnpkg.com/@cosmjs/faucet-client/-/faucet-client-0.32.4.tgz#33eb5922e5e2955a6029cd29318ae3f40dbf071c" + integrity sha512-ahbuoyI0lZBpK7nKSvmFywc+qodiIwOCnUuMLN9CWGQguqkC808ewCz4NWiMPPX3dj46SG7Y71n979YIlguUuw== + dependencies: + axios "^1.6.0" + "@cosmjs/json-rpc@^0.32.4": version "0.32.4" resolved "https://registry.yarnpkg.com/@cosmjs/json-rpc/-/json-rpc-0.32.4.tgz#be91eb89ea78bd5dc02d0a9fa184dd6790790f0b" @@ -1010,14 +1048,14 @@ "@cosmjs/stream" "^0.32.4" xstream "^11.14.0" -"@cosmjs/math@^0.32.4": +"@cosmjs/math@^0.32.1", "@cosmjs/math@^0.32.4": version "0.32.4" resolved "https://registry.yarnpkg.com/@cosmjs/math/-/math-0.32.4.tgz#87ac9eadc06696e30a30bdb562a495974bfd0a1a" integrity sha512-++dqq2TJkoB8zsPVYCvrt88oJWsy1vMOuSOKcdlnXuOA/ASheTJuYy4+oZlTQ3Fr8eALDLGGPhJI02W2HyAQaw== dependencies: bn.js "^5.2.0" -"@cosmjs/proto-signing@^0.32.4": +"@cosmjs/proto-signing@^0.32.1", "@cosmjs/proto-signing@^0.32.4": version "0.32.4" resolved "https://registry.yarnpkg.com/@cosmjs/proto-signing/-/proto-signing-0.32.4.tgz#5a06e087c6d677439c8c9b25b5223d5e72c4cd93" integrity sha512-QdyQDbezvdRI4xxSlyM1rSVBO2st5sqtbEIl3IX03uJ7YiZIQHyv6vaHVf1V4mapusCqguiHJzm4N4gsFdLBbQ== @@ -1039,7 +1077,7 @@ ws "^7" xstream "^11.14.0" -"@cosmjs/stargate@0.32.4", "@cosmjs/stargate@^0.32.4": +"@cosmjs/stargate@0.32.4", "@cosmjs/stargate@^0.32.1", "@cosmjs/stargate@^0.32.4": version "0.32.4" resolved "https://registry.yarnpkg.com/@cosmjs/stargate/-/stargate-0.32.4.tgz#bd0e4d3bf613b629addbf5f875d3d3b50f640af1" integrity sha512-usj08LxBSsPRq9sbpCeVdyLx2guEcOHfJS9mHGCLCXpdAPEIEQEtWLDpEUc0LEhWOx6+k/ChXTc5NpFkdrtGUQ== @@ -1055,14 +1093,14 @@ cosmjs-types "^0.9.0" xstream "^11.14.0" -"@cosmjs/stream@^0.32.4": +"@cosmjs/stream@^0.32.1", "@cosmjs/stream@^0.32.4": version "0.32.4" resolved "https://registry.yarnpkg.com/@cosmjs/stream/-/stream-0.32.4.tgz#83e1f2285807467c56d9ea0e1113f79d9fa63802" integrity sha512-Gih++NYHEiP+oyD4jNEUxU9antoC0pFSg+33Hpp0JlHwH0wXhtD3OOKnzSfDB7OIoEbrzLJUpEjOgpCp5Z+W3A== dependencies: xstream "^11.14.0" -"@cosmjs/tendermint-rpc@^0.32.4": +"@cosmjs/tendermint-rpc@^0.32.1", "@cosmjs/tendermint-rpc@^0.32.4": version "0.32.4" resolved "https://registry.yarnpkg.com/@cosmjs/tendermint-rpc/-/tendermint-rpc-0.32.4.tgz#b36f9ec657498e42c97e21bb7368798ef6279752" integrity sha512-MWvUUno+4bCb/LmlMIErLypXxy7ckUuzEmpufYYYd9wgbdCXaTaO08SZzyFM5PI8UJ/0S2AmUrgWhldlbxO8mw== @@ -1078,11 +1116,20 @@ readonly-date "^1.0.0" xstream "^11.14.0" -"@cosmjs/utils@^0.32.4": +"@cosmjs/utils@^0.32.1", "@cosmjs/utils@^0.32.4": version "0.32.4" resolved "https://registry.yarnpkg.com/@cosmjs/utils/-/utils-0.32.4.tgz#a9a717c9fd7b1984d9cefdd0ef6c6f254060c671" integrity sha512-D1Yc+Zy8oL/hkUkFUL/bwxvuDBzRGpc4cF7/SkdhxX4iHpSLgdOuTt1mhCh9+kl6NQREy9t7SYZ6xeW5gFe60w== +"@dabh/diagnostics@^2.0.2": + version "2.0.3" + resolved "https://registry.yarnpkg.com/@dabh/diagnostics/-/diagnostics-2.0.3.tgz#7f7e97ee9a725dffc7808d93668cc984e1dc477a" + integrity sha512-hrlQOIi7hAfzsMqlGSFyVucrx38O+j6wiGOf//H2ecvIEqYN4ADBSS2iLMh5UFyDunCNniUIPk/q3riFv45xRA== + dependencies: + colorspace "1.1.x" + enabled "2.0.x" + kuler "^2.0.0" + "@esbuild/aix-ppc64@0.21.5": version "0.21.5" resolved "https://registry.yarnpkg.com/@esbuild/aix-ppc64/-/aix-ppc64-0.21.5.tgz#c7184a326533fcdf1b8ee0733e21c713b975575f" @@ -1524,6 +1571,41 @@ resolved "https://registry.yarnpkg.com/@sinclair/typebox/-/typebox-0.27.8.tgz#6667fac16c436b5434a387a34dedb013198f6e6e" integrity sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA== +"@sinonjs/commons@^2.0.0": + version "2.0.0" + resolved "https://registry.yarnpkg.com/@sinonjs/commons/-/commons-2.0.0.tgz#fd4ca5b063554307e8327b4564bd56d3b73924a3" + integrity sha512-uLa0j859mMrg2slwQYdO/AkrOfmH+X6LTVmNTS9CqexuE2IvVORIkSpJLqePAbEnKJ77aMmCwr1NUZ57120Xcg== + dependencies: + type-detect "4.0.8" + +"@sinonjs/commons@^3.0.0", "@sinonjs/commons@^3.0.1": + version "3.0.1" + resolved "https://registry.yarnpkg.com/@sinonjs/commons/-/commons-3.0.1.tgz#1029357e44ca901a615585f6d27738dbc89084cd" + integrity sha512-K3mCHKQ9sVh8o1C9cxkwxaOmXoAMlDxC1mYyHrjqOWEcBjYr76t96zL2zlj5dUGZ3HSw240X1qgH3Mjf1yJWpQ== + dependencies: + type-detect "4.0.8" + +"@sinonjs/fake-timers@^11.2.2": + version "11.2.2" + resolved "https://registry.yarnpkg.com/@sinonjs/fake-timers/-/fake-timers-11.2.2.tgz#50063cc3574f4a27bd8453180a04171c85cc9699" + integrity sha512-G2piCSxQ7oWOxwGSAyFHfPIsyeJGXYtc6mFbnFA+kRXkiEnTl8c/8jul2S329iFBnDI9HGoeWWAZvuvOkZccgw== + dependencies: + "@sinonjs/commons" "^3.0.0" + +"@sinonjs/samsam@^8.0.0": + version "8.0.0" + resolved "https://registry.yarnpkg.com/@sinonjs/samsam/-/samsam-8.0.0.tgz#0d488c91efb3fa1442e26abea81759dfc8b5ac60" + integrity sha512-Bp8KUVlLp8ibJZrnvq2foVhP0IVX2CIprMJPK0vqGqgrDa0OHVKeZyBykqskkrdxV6yKBPmGasO8LVjAKR3Gew== + dependencies: + "@sinonjs/commons" "^2.0.0" + lodash.get "^4.4.2" + type-detect "^4.0.8" + +"@sinonjs/text-encoding@^0.7.2": + version "0.7.2" + resolved "https://registry.yarnpkg.com/@sinonjs/text-encoding/-/text-encoding-0.7.2.tgz#5981a8db18b56ba38ef0efb7d995b12aa7b51918" + integrity sha512-sXXKG+uL9IrKqViTtao2Ws6dy0znu9sOaP1di/jKGW1M6VssO8vlpXCQcpZ+jisQ1tTFAC5Jo/EOzFbggBagFQ== + "@types/body-parser@*": version "1.19.5" resolved "https://registry.yarnpkg.com/@types/body-parser/-/body-parser-1.19.5.tgz#04ce9a3b677dc8bd681a17da1ab9835dc9d3ede4" @@ -1628,6 +1710,11 @@ "@types/node" "*" "@types/send" "*" +"@types/triple-beam@^1.3.2": + version "1.3.5" + resolved "https://registry.yarnpkg.com/@types/triple-beam/-/triple-beam-1.3.5.tgz#74fef9ffbaa198eb8b588be029f38b00299caa2c" + integrity sha512-6WaYesThRMCl19iryMYP7/x2OVgCtbIVflDGFpWnb9irXI3UjYE4AzmYuiUKY1AJstGijoY+MgUszMgRxIYTYw== + "@typescript-eslint/eslint-plugin@^5.19.0": version "5.62.0" resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.62.0.tgz#aeef0328d172b9e37d9bab6dbc13b87ed88977db" @@ -1807,6 +1894,16 @@ aggregate-error@^3.0.0: clean-stack "^2.0.0" indent-string "^4.0.0" +ajv@7.1.1: + version "7.1.1" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-7.1.1.tgz#1e6b37a454021fa9941713f38b952fc1c8d32a84" + integrity sha512-ga/aqDYnUy/o7vbsRTFhhTsNeXiYb5JWDIcRIeZfwRNCefwjNTVYCGdGSUrEmiu3yDK3vFvNbgJxvrQW4JXrYQ== + dependencies: + fast-deep-equal "^3.1.1" + json-schema-traverse "^1.0.0" + require-from-string "^2.0.2" + uri-js "^4.2.2" + ajv@^6.12.4: version "6.12.6" resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.6.tgz#baf5a62e802b07d977034586f8c3baf5adf26df4" @@ -1817,6 +1914,16 @@ ajv@^6.12.4: json-schema-traverse "^0.4.1" uri-js "^4.2.2" +ajv@^8.0.1: + version "8.17.1" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-8.17.1.tgz#37d9a5c776af6bc92d7f4f9510eba4c0a60d11a6" + integrity sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g== + dependencies: + fast-deep-equal "^3.1.3" + fast-uri "^3.0.1" + json-schema-traverse "^1.0.0" + require-from-string "^2.0.2" + ansi-escapes@^4.3.0: version "4.3.2" resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-4.3.2.tgz#6b2291d1db7d98b6521d5f1efa42d0f3a9feb65e" @@ -1895,6 +2002,11 @@ astral-regex@^2.0.0: resolved "https://registry.yarnpkg.com/astral-regex/-/astral-regex-2.0.0.tgz#483143c567aeed4785759c0865786dc77d7d2e31" integrity sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ== +async@^3.1.0: + version "3.2.5" + resolved "https://registry.yarnpkg.com/async/-/async-3.2.5.tgz#ebd52a8fdaf7a2289a24df399f8d8485c8a46b66" + integrity sha512-baNZyqaaLhyLVKm/DlvdW051MSgO6b8eVfIezl9E5PqWxFgzLm/wQntEW4zOytVburDEr0JlALEpdOFwvErLsg== + asynckit@^0.4.0: version "0.4.0" resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" @@ -1918,6 +2030,15 @@ axios@^1.6.0: form-data "^4.0.0" proxy-from-env "^1.1.0" +axios@^1.6.7: + version "1.7.4" + resolved "https://registry.yarnpkg.com/axios/-/axios-1.7.4.tgz#4c8ded1b43683c8dd362973c393f3ede24052aa2" + integrity sha512-DukmaFRnY6AzAALSH4J2M3k6PkaC+MfaAGdEERRWcC9q3/TWQwLpHR8ZRLKTdQ3aBDL64EdluRDjJqKw+BPZEw== + dependencies: + follow-redirects "^1.15.6" + form-data "^4.0.0" + proxy-from-env "^1.1.0" + babel-plugin-polyfill-corejs2@^0.4.10: version "0.4.11" resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.11.tgz#30320dfe3ffe1a336c15afdcdafd6fd615b25e33" @@ -1962,6 +2083,11 @@ bignumber.js@^9.0.1: resolved "https://registry.yarnpkg.com/bignumber.js/-/bignumber.js-9.1.2.tgz#b7c4242259c008903b13707983b5f4bbd31eda0c" integrity sha512-2/mKyZH9K85bzOEfhXDBFZTGd1CTs+5IHpeFQo9luiBG7hghdC851Pj2WAhb6E3R6b9tZj/XKhbg4fum+Kepug== +bintrees@1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/bintrees/-/bintrees-1.0.2.tgz#49f896d6e858a4a499df85c38fb399b9aff840f8" + integrity sha512-VOMgTMwjAaUG580SXn3LacVgjurrbMme7ZZNYGSSV7mmtY6QQRh0Eg3pwIcntQ77DErK1L0NxkbetjcoXzVwKw== + bip39@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/bip39/-/bip39-3.1.0.tgz#c55a418deaf48826a6ceb34ac55b3ee1577e18a3" @@ -2139,7 +2265,7 @@ cli-truncate@^3.1.0: slice-ansi "^5.0.0" string-width "^5.0.0" -color-convert@^1.9.0: +color-convert@^1.9.0, color-convert@^1.9.3: version "1.9.3" resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8" integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg== @@ -2158,16 +2284,40 @@ color-name@1.1.3: resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" integrity sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw== -color-name@~1.1.4: +color-name@^1.0.0, color-name@~1.1.4: version "1.1.4" resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== +color-string@^1.6.0: + version "1.9.1" + resolved "https://registry.yarnpkg.com/color-string/-/color-string-1.9.1.tgz#4467f9146f036f855b764dfb5bf8582bf342c7a4" + integrity sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg== + dependencies: + color-name "^1.0.0" + simple-swizzle "^0.2.2" + +color@^3.1.3: + version "3.2.1" + resolved "https://registry.yarnpkg.com/color/-/color-3.2.1.tgz#3544dc198caf4490c3ecc9a790b54fe9ff45e164" + integrity sha512-aBl7dZI9ENN6fUGC7mWpMTPNHmWUSNan9tuWN6ahh5ZLNk9baLJOnSMlrQkHcrfFgz2/RigjUVAjdx36VcemKA== + dependencies: + color-convert "^1.9.3" + color-string "^1.6.0" + colorette@^2.0.16: version "2.0.20" resolved "https://registry.yarnpkg.com/colorette/-/colorette-2.0.20.tgz#9eb793e6833067f7235902fcd3b09917a000a95a" integrity sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w== +colorspace@1.1.x: + version "1.1.4" + resolved "https://registry.yarnpkg.com/colorspace/-/colorspace-1.1.4.tgz#8d442d1186152f60453bf8070cd66eb364e59243" + integrity sha512-BgvKJiuVu1igBUF2kEjRCZXol6wiiGbY5ipL/oVPwm0BL9sIpMIzM8IK7vwuxIIzOXMV3Ey5w+vxhm0rR/TN8w== + dependencies: + color "^3.1.3" + text-hex "1.0.x" + combined-stream@^1.0.8: version "1.0.8" resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.8.tgz#c3d45a8b34fd730631a110a8a2520682b31d5a7f" @@ -2175,6 +2325,11 @@ combined-stream@^1.0.8: dependencies: delayed-stream "~1.0.0" +commander@7.1.0: + version "7.1.0" + resolved "https://registry.yarnpkg.com/commander/-/commander-7.1.0.tgz#f2eaecf131f10e36e07d894698226e36ae0eb5ff" + integrity sha512-pRxBna3MJe6HKnBGsDyMv8ETbptw3axEdYHoqNh7gu5oDcew8fs0xnivZGm06Ogk8zGAJ9VX+OPEr2GXEQK4dg== + commander@^10.0.0: version "10.0.1" resolved "https://registry.yarnpkg.com/commander/-/commander-10.0.1.tgz#881ee46b4f77d1c1dccc5823433aa39b022cbe06" @@ -2327,6 +2482,11 @@ diff@^4.0.1: resolved "https://registry.yarnpkg.com/diff/-/diff-4.0.2.tgz#60f3aecb89d5fae520c11aa19efc2bb982aade7d" integrity sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A== +diff@^5.2.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/diff/-/diff-5.2.0.tgz#26ded047cd1179b78b9537d5ef725503ce1ae531" + integrity sha512-uIFDxqpRZGZ6ThOk84hEfqWoHx2devRFvpTZcTHur85vImfaxUbTW9Ryh4CpCuDnToOP1CEtXKIgytHBPVff5A== + dir-glob@^3.0.1: version "3.0.1" resolved "https://registry.yarnpkg.com/dir-glob/-/dir-glob-3.0.1.tgz#56dbf73d992a4a93ba1584f4534063fd2e41717f" @@ -2379,6 +2539,11 @@ emoji-regex@^9.2.2: resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-9.2.2.tgz#840c8803b0d8047f4ff0cf963176b32d4ef3ed72" integrity sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg== +enabled@2.0.x: + version "2.0.0" + resolved "https://registry.yarnpkg.com/enabled/-/enabled-2.0.0.tgz#f9dd92ec2d6f4bbc0d5d1e64e21d61cd4665e7c2" + integrity sha512-AKrN98kuwOzMIdAizXGI86UFBoo26CL21UM763y1h/GMSJ4/OHU9k2YlsmBpyScFo/wbLzWQJBMCW4+IO3/+OQ== + encodeurl@~1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.2.tgz#ad3ff4c86ec2d029322f5a02c3a9a606c95b3f59" @@ -2700,6 +2865,16 @@ fast-levenshtein@^2.0.6: resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917" integrity sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw== +fast-safe-stringify@2.0.4: + version "2.0.4" + resolved "https://registry.yarnpkg.com/fast-safe-stringify/-/fast-safe-stringify-2.0.4.tgz#4fe828718aa61dbcf9119c3c24e79cc4dea973b2" + integrity sha512-mNlGUdKOeGNleyrmgbKYtbnCr9KZkZXU7eM89JRo8vY10f7Ul1Fbj07hUBW3N4fC0xM+fmfFfa2zM7mIizhpNQ== + +fast-uri@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/fast-uri/-/fast-uri-3.0.1.tgz#cddd2eecfc83a71c1be2cc2ef2061331be8a7134" + integrity sha512-MWipKbbYiYI0UC7cl8m/i/IWTqfC8YXsqjzybjddLsFjStroQzsHXkc73JutMvBiXmOvapk+axIl79ig5t55Bw== + fastq@^1.6.0: version "1.17.1" resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.17.1.tgz#2a523f07a4e7b1e81a42b91b8bf2254107753b47" @@ -2707,6 +2882,11 @@ fastq@^1.6.0: dependencies: reusify "^1.0.4" +fecha@^4.2.0: + version "4.2.3" + resolved "https://registry.yarnpkg.com/fecha/-/fecha-4.2.3.tgz#4d9ccdbc61e8629b259fdca67e65891448d569fd" + integrity sha512-OP2IUU6HeYKJi3i0z4A19kHMQoLVs4Hc+DPqqxI2h/DPZHTm/vjsfC6P0b4jCMy14XizLBqvndQ+UilD7707Jw== + fflate@^0.8.2: version "0.8.2" resolved "https://registry.yarnpkg.com/fflate/-/fflate-0.8.2.tgz#fc8631f5347812ad6028bbe4a2308b2792aa1dea" @@ -2761,6 +2941,11 @@ flatted@^3.2.9, flatted@^3.3.1: resolved "https://registry.yarnpkg.com/flatted/-/flatted-3.3.1.tgz#21db470729a6734d4997002f439cb308987f567a" integrity sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw== +fn.name@1.x.x: + version "1.1.0" + resolved "https://registry.yarnpkg.com/fn.name/-/fn.name-1.1.0.tgz#26cad8017967aea8731bc42961d04a3d5988accc" + integrity sha512-GRnmB5gPyJpAhTQdSZTSp9uaPSvl09KoYcMQtsB9rQoOmzs9dH6ffeccH+Z+cv6P68Hu5bC6JjRh4Ah/mHSNRw== + follow-redirects@^1.15.0, follow-redirects@^1.15.6: version "1.15.6" resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.15.6.tgz#7f815c0cda4249c74ff09e95ef97c23b5fd0399b" @@ -3016,6 +3201,11 @@ ipaddr.js@1.9.1: resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-1.9.1.tgz#bff38543eeb8984825079ff3a2a8e6cbd46781b3" integrity sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g== +is-arrayish@^0.3.1: + version "0.3.2" + resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.3.2.tgz#4574a2ae56f7ab206896fb431eaeed066fdf8f03" + integrity sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ== + is-core-module@^2.13.0: version "2.15.0" resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.15.0.tgz#71c72ec5442ace7e76b306e9d48db361f22699ea" @@ -3108,6 +3298,13 @@ js-tokens@^4.0.0: resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== +js-yaml@4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-4.0.0.tgz#f426bc0ff4b4051926cd588c71113183409a121f" + integrity sha512-pqon0s+4ScYUvX30wxQi3PogGFAlUyH0awepWvwkj4jD4v+ova3RiYw8bmA6x2rDrEaj8i/oWKoRxpVNW+Re8Q== + dependencies: + argparse "^2.0.1" + js-yaml@^3.13.1: version "3.14.1" resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.14.1.tgz#dae812fdb3825fa306609a8717383c50c36a0537" @@ -3143,11 +3340,21 @@ json-schema-traverse@^0.4.1: resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660" integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg== +json-schema-traverse@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz#ae7bcb3656ab77a73ba5c49bf654f38e6b6860e2" + integrity sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug== + json-stable-stringify-without-jsonify@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz#9db7b59496ad3f3cfef30a75142d2d930ad72651" integrity sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw== +just-extend@^6.2.0: + version "6.2.0" + resolved "https://registry.yarnpkg.com/just-extend/-/just-extend-6.2.0.tgz#b816abfb3d67ee860482e7401564672558163947" + integrity sha512-cYofQu2Xpom82S6qD778jBDpwvvy39s1l/hrYij2u9AMdQcGRpaBu6kY4mVhuno5kJVi1DAz4aiphA2WI1/OAw== + keyv@^4.5.3: version "4.5.4" resolved "https://registry.yarnpkg.com/keyv/-/keyv-4.5.4.tgz#a879a99e29452f942439f2a405e3af8b31d4de93" @@ -3155,6 +3362,11 @@ keyv@^4.5.3: dependencies: json-buffer "3.0.1" +kuler@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/kuler/-/kuler-2.0.0.tgz#e2c570a3800388fb44407e851531c1d670b061b3" + integrity sha512-Xq9nH7KlWZmXAtodXDDRE7vs6DU1gTU8zYDHDiWLSip45Egwq3plLHzPn27NgvzL2r1LMPC1vdqh98sQxtqj4A== + levn@^0.4.1: version "0.4.1" resolved "https://registry.yarnpkg.com/levn/-/levn-0.4.1.tgz#ae4562c007473b932a6200d403268dd2fffc6ade" @@ -3226,11 +3438,21 @@ lodash.debounce@^4.0.8: resolved "https://registry.yarnpkg.com/lodash.debounce/-/lodash.debounce-4.0.8.tgz#82d79bff30a67c4005ffd5e2515300ad9ca4d7af" integrity sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow== +lodash.get@^4.4.2: + version "4.4.2" + resolved "https://registry.yarnpkg.com/lodash.get/-/lodash.get-4.4.2.tgz#2d177f652fa31e939b4438d5341499dfa3825e99" + integrity sha512-z+Uw/vLuy6gQe8cfaFWD7p0wVv8fJl3mbzXh33RS+0oW2wvUqiRXiQ69gLWSLpgB5/6sU+r6BlQR0MBILadqTQ== + lodash.merge@^4.6.2: version "4.6.2" resolved "https://registry.yarnpkg.com/lodash.merge/-/lodash.merge-4.6.2.tgz#558aa53b43b661e1925a0afdfa36a9a1085fe57a" integrity sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ== +lodash.truncate@^4.4.2: + version "4.4.2" + resolved "https://registry.yarnpkg.com/lodash.truncate/-/lodash.truncate-4.4.2.tgz#5a350da0b1113b837ecfffd5812cbe58d6eae193" + integrity sha512-jttmRe7bRse52OsWIMDLaXxWqRAmtIUccAQ3garviCqJjafXOfNMO0yMfNpdD6zbGaTU0P5Nz7e7gAT6cKmJRw== + lodash@^4.17.21: version "4.17.21" resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" @@ -3246,6 +3468,18 @@ log-update@^4.0.0: slice-ansi "^4.0.0" wrap-ansi "^6.2.0" +logform@^2.2.0, logform@^2.6.1: + version "2.6.1" + resolved "https://registry.yarnpkg.com/logform/-/logform-2.6.1.tgz#71403a7d8cae04b2b734147963236205db9b3df0" + integrity sha512-CdaO738xRapbKIMVn2m4F6KTj4j7ooJ8POVnebSgKo3KBz5axNXRAL7ZdRjIV6NOr2Uf4vjtRkxrFETOioCqSA== + dependencies: + "@colors/colors" "1.6.0" + "@types/triple-beam" "^1.3.2" + fecha "^4.2.0" + ms "^2.1.1" + safe-stable-stringify "^2.3.1" + triple-beam "^1.3.0" + long@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/long/-/long-4.0.0.tgz#9a7b71cfb7d361a194ea555241c92f7468d5bf28" @@ -3402,7 +3636,7 @@ ms@2.1.2: resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== -ms@2.1.3: +ms@2.1.3, ms@^2.1.1: version "2.1.3" resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== @@ -3427,6 +3661,17 @@ negotiator@0.6.3: resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.3.tgz#58e323a72fedc0d6f9cd4d31fe49f51479590ccd" integrity sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg== +nise@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/nise/-/nise-6.0.0.tgz#ae56fccb5d912037363c3b3f29ebbfa28bde8b48" + integrity sha512-K8ePqo9BFvN31HXwEtTNGzgrPpmvgciDsFz8aztFjt4LqKO/JeFD8tBOeuDiCMXrIl/m1YvfH8auSpxfaD09wg== + dependencies: + "@sinonjs/commons" "^3.0.0" + "@sinonjs/fake-timers" "^11.2.2" + "@sinonjs/text-encoding" "^0.7.2" + just-extend "^6.2.0" + path-to-regexp "^6.2.1" + node-releases@^2.0.18: version "2.0.18" resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.18.tgz#f010e8d35e2fe8d6b2944f03f70213ecedc4ca3f" @@ -3483,6 +3728,13 @@ once@^1.3.0: dependencies: wrappy "1" +one-time@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/one-time/-/one-time-1.0.0.tgz#e06bc174aed214ed58edede573b433bbf827cb45" + integrity sha512-5DXOiRKwuSEcQ/l0kGCF6Q3jcADFv5tSmRaJck/OqkVFcOzutB134KRSfF0xDrL39MNnqxbHBbUUcjZIhTgb2g== + dependencies: + fn.name "1.x.x" + onetime@^5.1.0, onetime@^5.1.2: version "5.1.2" resolved "https://registry.yarnpkg.com/onetime/-/onetime-5.1.2.tgz#d0e96ebb56b07476df1dd9c4806e5237985ca45e" @@ -3577,6 +3829,11 @@ path-to-regexp@0.1.7: resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-0.1.7.tgz#df604178005f522f15eb4490e7247a1bfaa67f8c" integrity sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ== +path-to-regexp@^6.2.1: + version "6.2.2" + resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-6.2.2.tgz#324377a83e5049cbecadc5554d6a63a9a4866b36" + integrity sha512-GQX3SSMokngb36+whdpRXE+3f9V8UzyAorlYvOGx87ufGHehNTn5lCxrKtLyZ4Yl/wEKnNnr98ZzOwwDZV5ogw== + path-type@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/path-type/-/path-type-4.0.0.tgz#84ed01c0a7ba380afe09d90a8c180dcd9d03043b" @@ -3642,6 +3899,13 @@ pretty-format@^29.7.0: ansi-styles "^5.0.0" react-is "^18.0.0" +prom-client@13.1.0: + version "13.1.0" + resolved "https://registry.yarnpkg.com/prom-client/-/prom-client-13.1.0.tgz#1185caffd8691e28d32e373972e662964e3dba45" + integrity sha512-jT9VccZCWrJWXdyEtQddCDszYsiuWj5T0ekrPszi/WEegj3IZy6Mm09iOOVM86A4IKMWq8hZkT2dD9MaSe+sng== + dependencies: + tdigest "^0.1.1" + protobufjs@^6.8.8: version "6.11.4" resolved "https://registry.yarnpkg.com/protobufjs/-/protobufjs-6.11.4.tgz#29a412c38bf70d89e537b6d02d904a6f448173aa" @@ -3718,6 +3982,15 @@ react-is@^18.0.0: resolved "https://registry.yarnpkg.com/react-is/-/react-is-18.3.1.tgz#e83557dc12eae63a99e003a46388b1dcbb44db7e" integrity sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg== +readable-stream@^3.4.0, readable-stream@^3.6.2: + version "3.6.2" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.2.tgz#56a9b36ea965c00c5a93ef31eb111a0f11056967" + integrity sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA== + dependencies: + inherits "^2.0.3" + string_decoder "^1.1.1" + util-deprecate "^1.0.1" + readonly-date@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/readonly-date/-/readonly-date-1.0.0.tgz#5af785464d8c7d7c40b9d738cbde8c646f97dcd9" @@ -3771,6 +4044,11 @@ regjsparser@^0.9.1: dependencies: jsesc "~0.5.0" +require-from-string@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/require-from-string/-/require-from-string-2.0.2.tgz#89a7fdd938261267318eafe14f9c32e598c36909" + integrity sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw== + resolve-from@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-4.0.0.tgz#4abcd852ad32dd7baabfe9b40e00a36db5f392e6" @@ -3849,11 +4127,16 @@ rxjs@^7.5.5: dependencies: tslib "^2.1.0" -safe-buffer@5.2.1, safe-buffer@^5.1.0: +safe-buffer@5.2.1, safe-buffer@^5.1.0, safe-buffer@~5.2.0: version "5.2.1" resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== +safe-stable-stringify@^2.3.1: + version "2.4.3" + resolved "https://registry.yarnpkg.com/safe-stable-stringify/-/safe-stable-stringify-2.4.3.tgz#138c84b6f6edb3db5f8ef3ef7115b8f55ccbf886" + integrity sha512-e2bDA2WJT0wxseVd4lsDP4+3ONX6HpMXQa1ZhFQ7SU+GjvORCmShbCMltrtIDfkYhVHrOcPtj+KhmDBdPdZD1g== + "safer-buffer@>= 2.1.2 < 3": version "2.1.2" resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" @@ -3957,6 +4240,25 @@ signal-exit@^4.1.0: resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-4.1.0.tgz#952188c1cbd546070e2dd20d0f41c0ae0530cb04" integrity sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw== +simple-swizzle@^0.2.2: + version "0.2.2" + resolved "https://registry.yarnpkg.com/simple-swizzle/-/simple-swizzle-0.2.2.tgz#a4da6b635ffcccca33f70d17cb92592de95e557a" + integrity sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg== + dependencies: + is-arrayish "^0.3.1" + +sinon@^18.0.0: + version "18.0.0" + resolved "https://registry.yarnpkg.com/sinon/-/sinon-18.0.0.tgz#69ca293dbc3e82590a8b0d46c97f63ebc1e5fc01" + integrity sha512-+dXDXzD1sBO6HlmZDd7mXZCR/y5ECiEiGCBSGuFD/kZ0bDTofPYc6JaeGmPSF+1j1MejGUWkORbYOLDyvqCWpA== + dependencies: + "@sinonjs/commons" "^3.0.1" + "@sinonjs/fake-timers" "^11.2.2" + "@sinonjs/samsam" "^8.0.0" + diff "^5.2.0" + nise "^6.0.0" + supports-color "^7" + sirv@^2.0.4: version "2.0.4" resolved "https://registry.yarnpkg.com/sirv/-/sirv-2.0.4.tgz#5dd9a725c578e34e449f332703eb2a74e46a29b0" @@ -4020,6 +4322,11 @@ sprintf-js@~1.0.2: resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" integrity sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g== +stack-trace@0.0.x: + version "0.0.10" + resolved "https://registry.yarnpkg.com/stack-trace/-/stack-trace-0.0.10.tgz#547c70b347e8d32b4e108ea1a2a159e5fdde19c0" + integrity sha512-KGzahc7puUKkzyMt+IqAep+TVNbKP+k2Lmwhub39m1AsTSkaDutx56aDCo+HLDzf/D26BIHTJWNiTG1KAJiQCg== + stackback@0.0.2: version "0.0.2" resolved "https://registry.yarnpkg.com/stackback/-/stackback-0.0.2.tgz#1ac8a0d9483848d1695e418b6d031a3c3ce68e3b" @@ -4040,7 +4347,7 @@ string-argv@^0.3.1: resolved "https://registry.yarnpkg.com/string-argv/-/string-argv-0.3.2.tgz#2b6d0ef24b656274d957d54e0a4bbf6153dc02b6" integrity sha512-aqD2Q0144Z+/RqG52NeHEkZauTAUWJO8c6yTftGJKO3Tja5tUgIfmIl6kExvhtxSDP7fXB6DvzkfMpCd/F3G+Q== -string-width@^4.1.0, string-width@^4.2.0: +string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3: version "4.2.3" resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== @@ -4058,6 +4365,13 @@ string-width@^5.0.0: emoji-regex "^9.2.2" strip-ansi "^7.0.1" +string_decoder@^1.1.1: + version "1.3.0" + resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.3.0.tgz#42f114594a46cf1a8e30b0a84f56c78c3edac21e" + integrity sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA== + dependencies: + safe-buffer "~5.2.0" + strip-ansi@^6.0.0, strip-ansi@^6.0.1: version "6.0.1" resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" @@ -4101,7 +4415,7 @@ supports-color@^5.3.0: dependencies: has-flag "^3.0.0" -supports-color@^7.1.0: +supports-color@^7, supports-color@^7.1.0: version "7.2.0" resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.2.0.tgz#1b7dcdcb32b8138801b3e478ba6a51caa89648da" integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw== @@ -4123,6 +4437,29 @@ symbol-observable@^2.0.3: resolved "https://registry.yarnpkg.com/symbol-observable/-/symbol-observable-2.0.3.tgz#5b521d3d07a43c351055fa43b8355b62d33fd16a" integrity sha512-sQV7phh2WCYAn81oAkakC5qjq2Ml0g8ozqz03wOGnx9dDlG1de6yrF+0RAzSJD8fPUow3PTSMf2SAbOGxb93BA== +table@^6.7.1: + version "6.8.2" + resolved "https://registry.yarnpkg.com/table/-/table-6.8.2.tgz#c5504ccf201213fa227248bdc8c5569716ac6c58" + integrity sha512-w2sfv80nrAh2VCbqR5AK27wswXhqcck2AhfnNW76beQXskGZ1V12GwS//yYVa3d3fcvAip2OUnbDAjW2k3v9fA== + dependencies: + ajv "^8.0.1" + lodash.truncate "^4.4.2" + slice-ansi "^4.0.0" + string-width "^4.2.3" + strip-ansi "^6.0.1" + +tdigest@^0.1.1: + version "0.1.2" + resolved "https://registry.yarnpkg.com/tdigest/-/tdigest-0.1.2.tgz#96c64bac4ff10746b910b0e23b515794e12faced" + integrity sha512-+G0LLgjjo9BZX2MfdvPfH+MKLCrxlXSYec5DaPYP1fe6Iyhf0/fSmJ0bFiZ1F8BT6cGXl2LpltQptzjXKWEkKA== + dependencies: + bintrees "1.0.2" + +text-hex@1.0.x: + version "1.0.0" + resolved "https://registry.yarnpkg.com/text-hex/-/text-hex-1.0.0.tgz#69dc9c1b17446ee79a92bf5b884bb4b9127506f5" + integrity sha512-uuVGNWzgJ4yhRaNSiubPY7OjISw4sw4E5Uv0wbjp+OzcbmVU/rsT8ujgcXJhn9ypzsgr5vlzpPqP+MBBKcGvbg== + text-table@^0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4" @@ -4180,6 +4517,16 @@ treeify@^1.1.0: resolved "https://registry.yarnpkg.com/treeify/-/treeify-1.1.0.tgz#4e31c6a463accd0943879f30667c4fdaff411bb8" integrity sha512-1m4RA7xVAJrSGrrXGs0L3YTwyvBs2S8PbRHaLZAkFw7JR8oIFwYtysxlBZhYIa7xSyiYJKZ3iGrrk55cGA3i9A== +triple-beam@1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/triple-beam/-/triple-beam-1.3.0.tgz#a595214c7298db8339eeeee083e4d10bd8cb8dd9" + integrity sha512-XrHUvV5HpdLmIj4uVMxHggLbFSZYIn7HEWsqePZcI50pco+MPqJ50wMGY794X7AOOhxOBAjbkqfAbEe/QMp2Lw== + +triple-beam@^1.3.0: + version "1.4.1" + resolved "https://registry.yarnpkg.com/triple-beam/-/triple-beam-1.4.1.tgz#6fde70271dc6e5d73ca0c3b24e2d92afb7441984" + integrity sha512-aZbgViZrg1QNcG+LULa7nhZpJTZSLm/mXnHXnbAbjmN5aSa0y7V+wvv6+4WaBtpISJzThKy+PIPxc1Nq1EJ9mg== + ts-node@^9.1.1: version "9.1.1" resolved "https://registry.yarnpkg.com/ts-node/-/ts-node-9.1.1.tgz#51a9a450a3e959401bda5f004a72d54b936d376d" @@ -4242,6 +4589,16 @@ type-check@^0.4.0, type-check@~0.4.0: dependencies: prelude-ls "^1.2.1" +type-detect@4.0.8: + version "4.0.8" + resolved "https://registry.yarnpkg.com/type-detect/-/type-detect-4.0.8.tgz#7646fb5f18871cfbb7749e69bd39a6388eb7450c" + integrity sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g== + +type-detect@^4.0.8: + version "4.1.0" + resolved "https://registry.yarnpkg.com/type-detect/-/type-detect-4.1.0.tgz#deb2453e8f08dcae7ae98c626b13dddb0155906c" + integrity sha512-Acylog8/luQ8L7il+geoSxhEkazvkslg7PSNKOX59mbB9cOveP5aq9h74Y7YU8yDpJwetzQQrfIwtf4Wp4LKcw== + type-fest@^0.20.2: version "0.20.2" resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.20.2.tgz#1bf207f4b28f91583666cb5fbd327887301cd5f4" @@ -4318,6 +4675,11 @@ utf8@3.0.0: resolved "https://registry.yarnpkg.com/utf8/-/utf8-3.0.0.tgz#f052eed1364d696e769ef058b183df88c87f69d1" integrity sha512-E8VjFIQ/TyQgp+TZfS6l8yp/xWppSAHzidGiRrqe4bK4XP9pTRyKFgGJpO3SN7zdX4DeomTrwaseCHovfpFcqQ== +util-deprecate@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" + integrity sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw== + utils-merge@1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/utils-merge/-/utils-merge-1.0.1.tgz#9f95710f50a267947b2ccc124741c1028427e713" @@ -4404,6 +4766,30 @@ why-is-node-running@^2.3.0: siginfo "^2.0.0" stackback "0.0.2" +winston-transport@^4.4.0: + version "4.7.1" + resolved "https://registry.yarnpkg.com/winston-transport/-/winston-transport-4.7.1.tgz#52ff1bcfe452ad89991a0aaff9c3b18e7f392569" + integrity sha512-wQCXXVgfv/wUPOfb2x0ruxzwkcZfxcktz6JIMUaPLmcNhO4bZTwA/WtDWK74xV3F2dKu8YadrFv0qhwYjVEwhA== + dependencies: + logform "^2.6.1" + readable-stream "^3.6.2" + triple-beam "^1.3.0" + +winston@3.3.3: + version "3.3.3" + resolved "https://registry.yarnpkg.com/winston/-/winston-3.3.3.tgz#ae6172042cafb29786afa3d09c8ff833ab7c9170" + integrity sha512-oEXTISQnC8VlSAKf1KYSSd7J6IWuRPQqDdo8eoRNaYKLvwSb5+79Z3Yi1lrl6KDpU6/VWaxpakDAtb1oQ4n9aw== + dependencies: + "@dabh/diagnostics" "^2.0.2" + async "^3.1.0" + is-stream "^2.0.0" + logform "^2.2.0" + one-time "^1.0.0" + readable-stream "^3.4.0" + stack-trace "0.0.x" + triple-beam "^1.3.0" + winston-transport "^4.4.0" + word-wrap@^1.2.5: version "1.2.5" resolved "https://registry.yarnpkg.com/word-wrap/-/word-wrap-1.2.5.tgz#d2c45c6dd4fbce621a66f136cbe328afd0410b34" From 39a0e5d34f3cc38b158790291af0e796ac187402 Mon Sep 17 00:00:00 2001 From: nhpd Date: Wed, 14 Aug 2024 21:27:39 +0400 Subject: [PATCH 12/23] extract into constants --- src/global_setup.ts | 10 ++++------ src/helpers/constants.ts | 5 +++++ src/helpers/local_state.ts | 20 ++++++++++++++------ 3 files changed, 23 insertions(+), 12 deletions(-) diff --git a/src/global_setup.ts b/src/global_setup.ts index f30ce149..64c3f354 100644 --- a/src/global_setup.ts +++ b/src/global_setup.ts @@ -8,9 +8,9 @@ import { Input, Output } from '@neutron-org/neutronjs/cosmos/bank/v1beta1/bank'; import ch from 'child_process'; import { COSMOS_DENOM, - COSMOS_PREFIX, + COSMOS_PREFIX, GAIA_RPC, NEUTRON_DENOM, - NEUTRON_PREFIX, + NEUTRON_PREFIX, NEUTRON_RPC, } from './helpers/constants'; import config from './config.json'; @@ -31,11 +31,9 @@ export default async function ({ provide }: GlobalSetupContext) { mnemonics.push(generateMnemonic()); } - const rpcNeutron = process.env.NODE1_RPC || 'http://localhost:26657'; - const rpcGaia = process.env.NODE2_RPC || 'http://localhost:16657'; // fund a lot or preallocated wallets for testing purposes - await fundWallets(mnemonics, rpcNeutron, NEUTRON_PREFIX, NEUTRON_DENOM); - await fundWallets(mnemonics, rpcGaia, COSMOS_PREFIX, COSMOS_DENOM); + await fundWallets(mnemonics, NEUTRON_RPC, NEUTRON_PREFIX, NEUTRON_DENOM); + await fundWallets(mnemonics, GAIA_RPC, COSMOS_PREFIX, COSMOS_DENOM); provide('mnemonics', mnemonics); diff --git a/src/helpers/constants.ts b/src/helpers/constants.ts index 2bceff41..0be79ef5 100644 --- a/src/helpers/constants.ts +++ b/src/helpers/constants.ts @@ -78,3 +78,8 @@ export const CONTRACTS = { export const NEUTRON_PREFIX = process.env.NEUTRON_ADDRESS_PREFIX || 'neutron'; export const COSMOS_PREFIX = process.env.COSMOS_ADDRESS_PREFIX || 'cosmos'; +export const NEUTRON_RPC = process.env.NODE1_RPC || 'http://localhost:26657'; +export const GAIA_RPC = process.env.NODE2_RPC || 'http://localhost:16657'; +export const NEUTRON_REST = process.env.NODE1_URL || 'http://localhost:1317'; +export const GAIA_REST = process.env.NODE2_URL || 'http://localhost:1316'; +export const IBC_WEB_HOST = process.env.ICQ_WEB_HOST || 'http://localhost:9999'; diff --git a/src/helpers/local_state.ts b/src/helpers/local_state.ts index d60fd116..0b142266 100644 --- a/src/helpers/local_state.ts +++ b/src/helpers/local_state.ts @@ -7,7 +7,15 @@ import { import { DirectSecp256k1HdWallet } from '@cosmjs/proto-signing'; import { RunnerTestSuite } from 'vitest'; import { connectComet } from '@cosmjs/tendermint-rpc'; -import { COSMOS_PREFIX, NEUTRON_PREFIX } from './constants'; +import { + COSMOS_PREFIX, + GAIA_REST, + GAIA_RPC, + IBC_WEB_HOST, + NEUTRON_PREFIX, + NEUTRON_REST, + NEUTRON_RPC, +} from './constants'; import { Wallet } from './wallet'; // limit of wallets precreated for one test @@ -47,13 +55,13 @@ export class LocalState { private mnemonics: string[], private suite?: RunnerTestSuite | undefined, ) { - this.rpcNeutron = process.env.NODE1_RPC || 'http://localhost:26657'; - this.rpcGaia = process.env.NODE2_RPC || 'http://localhost:16657'; + this.rpcNeutron = NEUTRON_RPC; + this.rpcGaia = GAIA_RPC; - this.restNeutron = process.env.NODE1_URL || 'http://localhost:1317'; - this.restGaia = process.env.NODE2_URL || 'http://localhost:1316'; + this.restNeutron = NEUTRON_REST; + this.restGaia = GAIA_REST; - this.icqWebHost = process.env.ICQ_WEB_HOST || 'http://localhost:9999'; + this.icqWebHost = IBC_WEB_HOST; this.walletIndexes = { neutron: 0, cosmos: 0 }; } From 8fa11c644a365ea2f707b4e3ad4ed957eba81b61 Mon Sep 17 00:00:00 2001 From: nhpd Date: Wed, 14 Aug 2024 21:28:00 +0400 Subject: [PATCH 13/23] use conflio relayer to manually control relaying of ibc packets --- .../run_in_band/interchaintx.test.ts | 205 +++++++++--------- 1 file changed, 104 insertions(+), 101 deletions(-) diff --git a/src/testcases/run_in_band/interchaintx.test.ts b/src/testcases/run_in_band/interchaintx.test.ts index 6bfc42dc..7d178024 100644 --- a/src/testcases/run_in_band/interchaintx.test.ts +++ b/src/testcases/run_in_band/interchaintx.test.ts @@ -34,9 +34,12 @@ import { waitForAck, } from '../../helpers/interchaintxs'; import { execSync } from 'child_process'; -import { IbcClient, Link, NoopLogger } from '@confio/relayer/build'; +import { IbcClient, Link } from '@confio/relayer/build'; import config from '../../config.json'; -import { Order } from '@neutron-org/neutronjs/ibc/core/channel/v1/channel'; +import { + Order, + State, +} from '@neutron-org/neutronjs/ibc/core/channel/v1/channel'; import { GasPrice } from '@cosmjs/stargate/build/fee'; describe('Neutron / Interchain TXs', () => { @@ -583,11 +586,7 @@ describe('Neutron / Interchain TXs', () => { }, }); expect(res.code).toEqual(0); - // console.log( - // 'unordered ica delegate log: ' + JSON.stringify(res.rawLog), - // ); const sequenceId = getSequenceId(res); - console.log('unordered ica sequenceId: ' + sequenceId); // timeout handling may be slow, hence we wait for up to 100 blocks here await waitForAck( @@ -607,18 +606,22 @@ describe('Neutron / Interchain TXs', () => { timeout: 'message', }); - // TODO: check that channel is opened + const channel = (await ibcQuerier.Channels({})).channels.find( + (c) => c.ordering === Order.ORDER_UNORDERED, + ); + expect(channel.state).toEqual(State.STATE_OPEN); }); - test.skip('delegate after the timeout on unordered channel should work as channel should still be open', async () => { + test('delegate after the timeout on unordered channel should work as channel should still be open', async () => { const res = await neutronClient.execute(contractAddress, { delegate: { interchain_account_id: unorderedIcaId, validator: testState.wallets.cosmos.val1.valAddress, - amount: '770', + amount: '100', denom: COSMOS_DENOM, }, }); + expect(res.code).toBe(0); // works as channel is still open const sequenceId = getSequenceId(res); await getAck( neutronClient, @@ -626,25 +629,21 @@ describe('Neutron / Interchain TXs', () => { unorderedIcaId, sequenceId, ); - console.log( - 'delegate after timeout rawLog: ' + JSON.stringify(res.rawLog), - ); - expect(res.code).toBe(0); // works as channel is still open }); test('try two delegates with first one when relayer is paused, so only second delegate passed through', async () => { const neutronIbcClient = await IbcClient.connectWithSigner( - 'http://localhost:26657', + testState.rpcNeutron, testState.wallets.neutron.demo1.directwallet, testState.wallets.neutron.demo1.address, { gasPrice: GasPrice.fromString('0.05untrn'), - estimatedBlockTime: 3, // FIXME + estimatedBlockTime: 3, estimatedIndexerTime: 100, }, ); const gaiaIbcClient = await IbcClient.connectWithSigner( - 'http://localhost:16657', + testState.rpcGaia, testState.wallets.cosmos.demo1.directwallet, testState.wallets.cosmos.demo1.address, { @@ -657,32 +656,31 @@ describe('Neutron / Interchain TXs', () => { const link = await Link.createWithExistingConnections( neutronIbcClient, gaiaIbcClient, - 'connection-0', - 'connection-0', - new NoopLogger(), + connectionId, + connectionId, ); const delegationsBefore = await gaiaStakingQuerier.DelegatorDelegations( { delegatorAddr: unorderedIcaAddress }, ); - const pauseRes = execSync('docker pause setup-hermes-1'); - console.log('pauseRes: ' + pauseRes.toString()); + // We pause hermes container, so that we can use manual relaying of the packets. + // That needed in order to ack ibc packets in backwards order + execSync('docker pause setup-hermes-1'); - // this should get through without relaying const res1 = await neutronClient.execute(contractAddress, { delegate: { interchain_account_id: unorderedIcaId, validator: testState.wallets.cosmos.val1.valAddress, denom: COSMOS_DENOM, - amount: '583', + amount: '200', }, }); expect(res1.code).toEqual(0); const sequenceId1 = getSequenceId(res1); - console.log( - 'paused sequenceId (TO BE RELAYED ONLY LATER): ' + sequenceId1, - ); + // console.log( + // 'paused sequenceId (TO BE RELAYED ONLY LATER): ' + sequenceId1, + // ); // TODO: check that delegated did not change // TODO: check that operation not acknowledged @@ -695,50 +693,62 @@ describe('Neutron / Interchain TXs', () => { delegatorAddr: unorderedIcaAddress, }); - // this should be relayed first, even thought it has later sequence. + // this should be relayed first, even thought it has a later sequence. const res2 = await neutronClient.execute(contractAddress, { delegate: { interchain_account_id: unorderedIcaId, validator: testState.wallets.cosmos.val1.valAddress, denom: COSMOS_DENOM, - amount: '490', + amount: '400', }, }); expect(res2.code).toEqual(0); const sequenceId2 = getSequenceId(res2); expect(sequenceId1).toBe(sequenceId2 - 1); - console.log('unpaused sequenceId: ' + sequenceId2); const pendingPackets = await link.getPendingPackets('A'); - console.log( - 'Pending packets to relay manually: ' + - JSON.stringify( - pendingPackets.map((p) => p.packet.sequence.toString()), - ), - ); - const res = await link.relayPackets('A', pendingPackets); - console.log( - 'Manual relay result: ' + - JSON.stringify( - res.map((p) => p.originalPacket.sequence.toString()), - ), + // console.log( + // 'Pending packets to relay manually: ' + + // JSON.stringify( + // pendingPackets.map((p) => p.packet.sequence.toString()), + // ), + // ); + const lastPacket = pendingPackets.find( + (p) => p.packet.sequence === BigInt(sequenceId2), ); + await link.relayPackets('A', [lastPacket]); + // console.log( + // 'Manual relay result: ' + + // JSON.stringify( + // res.map((p) => p.originalPacket.sequence.toString()), + // ) + + // ', events: \n' + + // JSON.stringify(res.map((p) => p.txEvents)), + // ); + const [acksA, acksB] = await Promise.all([ + link.getPendingAcks('A'), + link.getPendingAcks('B'), + ]); + const [acksResA, acksResB] = await Promise.all([ + link.relayAcks('A', acksA), + link.relayAcks('B', acksB), + ]); + console.log('acksResA: ' + JSON.stringify(acksResA)); + console.log('acksResB: ' + JSON.stringify(acksResB)); // timeout handling may be slow, hence we wait for up to 100 blocks here - await waitForAck( - neutronClient, - contractAddress, - unorderedIcaId, - sequenceId1, - 100, - ); - await waitForAck( - neutronClient, - contractAddress, - unorderedIcaId, - sequenceId2, - 100, - ); + try { + await waitForAck( + neutronClient, + contractAddress, + unorderedIcaId, + sequenceId2, + 100, + ); + console.log('got ack!'); + } catch (_) { + console.log('continue after error waiting for sequenceId2'); + } console.log( 'should not get to this point! as were waiting for tx that was sent when relayer was paused', ); @@ -760,26 +770,26 @@ describe('Neutron / Interchain TXs', () => { // delegationsBefore.delegationResponses[0]. // TODO: clear first packet. Should be successful - const channel = (await ibcQuerier.Channels({})).channels.find( - (c) => c.ordering === Order.ORDER_UNORDERED, - ); - const clearPacketsCmd = - "docker exec setup-hermes-1 hermes --config /app/network/hermes/config.toml clear packets --chain 'test-1' --port " + - channel.portId + - ' --channel ' + - channel.channelId; - console.log('clearPacketsCmd: ' + clearPacketsCmd); - const clearPacketsRes = execSync(clearPacketsCmd); - console.log('clearPacketsRes: ' + clearPacketsRes.toString()); + // const channel = (await ibcQuerier.Channels({})).channels.find( + // (c) => c.ordering === Order.ORDER_UNORDERED, + // ); + // const clearPacketsCmd = + // "docker exec setup-hermes-1 hermes --config /app/network/hermes/config.toml clear packets --chain 'test-1' --port " + + // channel.portId + + // ' --channel ' + + // channel.channelId; + // console.log('clearPacketsCmd: ' + clearPacketsCmd); + // const clearPacketsRes = execSync(clearPacketsCmd); + // console.log('clearPacketsRes: ' + clearPacketsRes.toString()); // timeout handling may be slow, hence we wait for up to 100 blocks here - await waitForAck( - neutronClient, - contractAddress, - unorderedIcaId, - sequenceId1, - 100, - ); + // await waitForAck( + // neutronClient, + // contractAddress, + // unorderedIcaId, + // sequenceId1, + // 100, + // ); // TODO: wait for ack sequenceId1 // console.log( @@ -797,6 +807,13 @@ describe('Neutron / Interchain TXs', () => { describe('Recreation', () => { test('recreate ICA1', async () => { + // debug + const beforeChannels = await ibcQuerier.Channels({}); + console.log('beforeChannels: ' + beforeChannels.channels.length); + console.log( + 'kekw: ' + + JSON.stringify(beforeChannels.channels.map((c) => c.channelId)), + ); const res = await neutronClient.execute(contractAddress, { register: { connection_id: connectionId, @@ -806,17 +823,26 @@ describe('Neutron / Interchain TXs', () => { expect(res.code).toEqual(0); await neutronClient.getWithAttempts( async () => ibcQuerier.Channels({}), - // Wait until there are 4 channels: + // Wait until there are 5 channels: // - one exists already, it is open for IBC transfers; - // - two channels are already opened via ICA registration before + // - three channels are already opened via ICA registration before // - one more, we are opening it right now async (channels) => channels.channels.length == 5, ); await neutronClient.getWithAttempts( () => ibcQuerier.Channels({}), - async (channels) => - channels.channels.find((c) => c.channelId == 'channel-3')?.state == - 3, + async (channels) => { + console.log( + 'channel-4: ' + + JSON.stringify( + channels.channels.find((c) => c.channelId == 'channel-3'), + ), + ); + return ( + channels.channels.find((c) => c.channelId == 'channel-4') + ?.state == State.STATE_OPEN + ); + }, ); }); test('delegate from first ICA after ICA recreation', async () => { @@ -1234,26 +1260,3 @@ describe('Neutron / Interchain TXs', () => { }); }); }); - -function logger() { - return { - log: (msg) => { - console.log('LOG: ' + msg); - }, - info: (msg) => { - console.log('INFO: ' + msg); - }, - error: (msg) => { - console.log('ERROR: ' + msg); - }, - warn: (msg) => { - console.log('WARN: ' + msg); - }, - verbose: (msg) => { - console.log('VERBOSE: ' + msg); - }, - debug: (msg) => { - console.log('DEBUG: ' + msg); - }, - }; -} From 8d16d3b737c1a1bb79ea4d67dbe4f4b9549bb518 Mon Sep 17 00:00:00 2001 From: nhpd Date: Wed, 14 Aug 2024 22:00:58 +0400 Subject: [PATCH 14/23] cleanup --- .../run_in_band/interchaintx.test.ts | 217 ++++++------------ 1 file changed, 75 insertions(+), 142 deletions(-) diff --git a/src/testcases/run_in_band/interchaintx.test.ts b/src/testcases/run_in_band/interchaintx.test.ts index 7d178024..49192d5d 100644 --- a/src/testcases/run_in_band/interchaintx.test.ts +++ b/src/testcases/run_in_band/interchaintx.test.ts @@ -41,6 +41,20 @@ import { State, } from '@neutron-org/neutronjs/ibc/core/channel/v1/channel'; import { GasPrice } from '@cosmjs/stargate/build/fee'; +import { PacketWithMetadata } from '@confio/relayer/build/lib/endpoint'; + +async function relayPacket(link: Link, lastPacket: PacketWithMetadata) { + await link.relayPackets('A', [lastPacket]); + const [acksA, acksB] = await Promise.all([ + link.getPendingAcks('A'), + link.getPendingAcks('B'), + ]); + const [acksResA, acksResB] = await Promise.all([ + link.relayAcks('A', acksA), + link.relayAcks('B', acksB), + ]); + return { acksResA, acksResB }; +} describe('Neutron / Interchain TXs', () => { let testState: LocalState; @@ -660,10 +674,6 @@ describe('Neutron / Interchain TXs', () => { connectionId, ); - const delegationsBefore = await gaiaStakingQuerier.DelegatorDelegations( - { delegatorAddr: unorderedIcaAddress }, - ); - // We pause hermes container, so that we can use manual relaying of the packets. // That needed in order to ack ibc packets in backwards order execSync('docker pause setup-hermes-1'); @@ -678,20 +688,6 @@ describe('Neutron / Interchain TXs', () => { }); expect(res1.code).toEqual(0); const sequenceId1 = getSequenceId(res1); - // console.log( - // 'paused sequenceId (TO BE RELAYED ONLY LATER): ' + sequenceId1, - // ); - - // TODO: check that delegated did not change - // TODO: check that operation not acknowledged - - // const unpauseRes = execSync('docker unpause setup-hermes-1'); - // console.log('unpauseRes: ' + unpauseRes.toString()); - - const delegationsBefore2 = - await gaiaStakingQuerier.DelegatorDelegations({ - delegatorAddr: unorderedIcaAddress, - }); // this should be relayed first, even thought it has a later sequence. const res2 = await neutronClient.execute(contractAddress, { @@ -706,114 +702,68 @@ describe('Neutron / Interchain TXs', () => { const sequenceId2 = getSequenceId(res2); expect(sequenceId1).toBe(sequenceId2 - 1); + // should be delegated 100 coins from before + const delegationsQ1 = await gaiaStakingQuerier.DelegatorDelegations({ + delegatorAddr: unorderedIcaAddress, + }); + expect(delegationsQ1.delegationResponses[0].balance.amount).toEqual( + '100', + ); + const pendingPackets = await link.getPendingPackets('A'); - // console.log( - // 'Pending packets to relay manually: ' + - // JSON.stringify( - // pendingPackets.map((p) => p.packet.sequence.toString()), - // ), - // ); + + // relay lastPacket const lastPacket = pendingPackets.find( (p) => p.packet.sequence === BigInt(sequenceId2), ); - await link.relayPackets('A', [lastPacket]); - // console.log( - // 'Manual relay result: ' + - // JSON.stringify( - // res.map((p) => p.originalPacket.sequence.toString()), - // ) + - // ', events: \n' + - // JSON.stringify(res.map((p) => p.txEvents)), - // ); - const [acksA, acksB] = await Promise.all([ - link.getPendingAcks('A'), - link.getPendingAcks('B'), - ]); - const [acksResA, acksResB] = await Promise.all([ - link.relayAcks('A', acksA), - link.relayAcks('B', acksB), - ]); - console.log('acksResA: ' + JSON.stringify(acksResA)); - console.log('acksResB: ' + JSON.stringify(acksResB)); - - // timeout handling may be slow, hence we wait for up to 100 blocks here - try { - await waitForAck( - neutronClient, - contractAddress, - unorderedIcaId, - sequenceId2, - 100, - ); - console.log('got ack!'); - } catch (_) { - console.log('continue after error waiting for sequenceId2'); - } - console.log( - 'should not get to this point! as were waiting for tx that was sent when relayer was paused', + expect(lastPacket).not.toBeNull(); + await relayPacket(link, lastPacket); + await waitForAck( + neutronClient, + contractAddress, + unorderedIcaId, + sequenceId2, + 100, ); - const delegationsAfter = await gaiaStakingQuerier.DelegatorDelegations({ + // should be delegated 100 + 400 (lastPacket) coins after relaying last packet + const delegationsQ2 = await gaiaStakingQuerier.DelegatorDelegations({ delegatorAddr: unorderedIcaAddress, }); - console.log( - 'before: ' + JSON.stringify(delegationsBefore.delegationResponses), + expect(delegationsQ2.delegationResponses[0].balance.amount).toEqual( + '500', ); - console.log( - 'before2: ' + JSON.stringify(delegationsBefore2.delegationResponses), - ); - console.log( - 'after : ' + JSON.stringify(delegationsAfter.delegationResponses), + + // relay firstPacket + const firstPacket = pendingPackets.find( + (p) => p.packet.sequence === BigInt(sequenceId1), ); + expect(firstPacket).not.toBeNull(); + await relayPacket(link, firstPacket); - // TODO: compare - // delegationsBefore.delegationResponses[0]. - - // TODO: clear first packet. Should be successful - // const channel = (await ibcQuerier.Channels({})).channels.find( - // (c) => c.ordering === Order.ORDER_UNORDERED, - // ); - // const clearPacketsCmd = - // "docker exec setup-hermes-1 hermes --config /app/network/hermes/config.toml clear packets --chain 'test-1' --port " + - // channel.portId + - // ' --channel ' + - // channel.channelId; - // console.log('clearPacketsCmd: ' + clearPacketsCmd); - // const clearPacketsRes = execSync(clearPacketsCmd); - // console.log('clearPacketsRes: ' + clearPacketsRes.toString()); + await waitForAck( + neutronClient, + contractAddress, + unorderedIcaId, + sequenceId1, + 100, + ); - // timeout handling may be slow, hence we wait for up to 100 blocks here - // await waitForAck( - // neutronClient, - // contractAddress, - // unorderedIcaId, - // sequenceId1, - // 100, - // ); - - // TODO: wait for ack sequenceId1 - // console.log( - // 'after2 : ' + - // JSON.stringify( - // delegationsAfter.delegationResponses.map((d) => d.balance), - // ), - // ); + // should be delegated 100 + 400 + 200 (lastPacket + firstPacket) coins after relaying last packet + const delegationsQ3 = await gaiaStakingQuerier.DelegatorDelegations({ + delegatorAddr: unorderedIcaAddress, + }); + expect(delegationsQ3.delegationResponses[0].balance.amount).toEqual( + '700', + ); // unpause hermes for tests below - const unpauseRes = execSync('docker unpause setup-hermes-1'); - console.log('unpauseRes: ' + unpauseRes.toString()); + execSync('docker unpause setup-hermes-1'); }); }); describe('Recreation', () => { test('recreate ICA1', async () => { - // debug - const beforeChannels = await ibcQuerier.Channels({}); - console.log('beforeChannels: ' + beforeChannels.channels.length); - console.log( - 'kekw: ' + - JSON.stringify(beforeChannels.channels.map((c) => c.channelId)), - ); const res = await neutronClient.execute(contractAddress, { register: { connection_id: connectionId, @@ -831,18 +781,11 @@ describe('Neutron / Interchain TXs', () => { ); await neutronClient.getWithAttempts( () => ibcQuerier.Channels({}), - async (channels) => { - console.log( - 'channel-4: ' + - JSON.stringify( - channels.channels.find((c) => c.channelId == 'channel-3'), - ), - ); - return ( - channels.channels.find((c) => c.channelId == 'channel-4') - ?.state == State.STATE_OPEN - ); - }, + async (channels) => + channels.channels.findLast( + (c) => c.portId === `icacontroller-${contractAddress}.test1`, + )?.state == State.STATE_OPEN, + 100, ); }); test('delegate from first ICA after ICA recreation', async () => { @@ -1056,21 +999,16 @@ describe('Neutron / Interchain TXs', () => { integration_tests_set_sudo_failure_mock: { state: 'enabled' }, }); - try { - // Testing timeout failure - const kekw = await neutronClient.execute(contractAddress, { - delegate: { - interchain_account_id: icaId1, - validator: testState.wallets.cosmos.val1.valAddress, - amount: '10', - denom: COSMOS_DENOM, - timeout: 1, - }, - }); - console.log('result: ' + kekw.rawLog); - } catch (e) { - console.log('exception: ' + e.toString()); - } + const res = await neutronClient.execute(contractAddress, { + delegate: { + interchain_account_id: icaId1, + validator: testState.wallets.cosmos.val1.valAddress, + amount: '10', + denom: COSMOS_DENOM, + timeout: 1, + }, + }); + expect(res.code).toEqual(0); // wait until sudo is called and processed and failure is recorder await neutronClient.getWithAttempts( @@ -1163,18 +1101,13 @@ describe('Neutron / Interchain TXs', () => { expect.objectContaining({ address: contractAddress, id: 4n, - error: 'codespace: wasm, code: 5', // execute wasm contract failer + error: 'codespace: wasm, code: 5', // execute wasm contract failed }), expect.objectContaining({ address: contractAddress, id: 5n, error: 'codespace: contractmanager, code: 1103', // contractmanager sudo limit exceeded }), - // expect.objectContaining({ - // address: contractAddress, - // id: 6n, - // // error: 'codespace: contractmanager, code: 1103', // contractmanager sudo limit exceeded - // }), ]); const acks = await getAcks(neutronClient, contractAddress); @@ -1212,7 +1145,7 @@ describe('Neutron / Interchain TXs', () => { address: contractAddress, failureId: 0n, }); - expect(failuresResAfter.failures.length).toEqual(7); + expect(failuresResAfter.failures.length).toEqual(6); // make sure contract's state hasn't been changed const acks = await getAcks(neutronClient, contractAddress); @@ -1247,7 +1180,7 @@ describe('Neutron / Interchain TXs', () => { address: contractAddress, failureId: 0n, }); - expect(failuresResAfter.failures.length).toEqual(6); + expect(failuresResAfter.failures.length).toEqual(5); // make sure contract's state has been changed const acks = await getAcks(neutronClient, contractAddress); From 62c1906dd59a033fe3430f75739b81c2300a8ac3 Mon Sep 17 00:00:00 2001 From: nhpd Date: Thu, 15 Aug 2024 01:34:35 +0400 Subject: [PATCH 15/23] fmt --- src/global_setup.ts | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/global_setup.ts b/src/global_setup.ts index 64c3f354..32cc3291 100644 --- a/src/global_setup.ts +++ b/src/global_setup.ts @@ -8,9 +8,11 @@ import { Input, Output } from '@neutron-org/neutronjs/cosmos/bank/v1beta1/bank'; import ch from 'child_process'; import { COSMOS_DENOM, - COSMOS_PREFIX, GAIA_RPC, + COSMOS_PREFIX, + GAIA_RPC, NEUTRON_DENOM, - NEUTRON_PREFIX, NEUTRON_RPC, + NEUTRON_PREFIX, + NEUTRON_RPC, } from './helpers/constants'; import config from './config.json'; From b2b3086baca23ca0888c65b0737efc10adc20af5 Mon Sep 17 00:00:00 2001 From: nhpd Date: Thu, 15 Aug 2024 02:09:17 +0400 Subject: [PATCH 16/23] cleanup --- src/helpers/constants.ts | 1 + src/helpers/interchaintxs.ts | 17 ++++++ src/helpers/local_state.ts | 38 +++++++++++++ .../run_in_band/interchaintx.test.ts | 56 +++---------------- 4 files changed, 65 insertions(+), 47 deletions(-) diff --git a/src/helpers/constants.ts b/src/helpers/constants.ts index 75e24ac5..62f61fd2 100644 --- a/src/helpers/constants.ts +++ b/src/helpers/constants.ts @@ -83,3 +83,4 @@ export const GAIA_RPC = process.env.NODE2_RPC || 'http://localhost:16657'; export const NEUTRON_REST = process.env.NODE1_URL || 'http://localhost:1317'; export const GAIA_REST = process.env.NODE2_URL || 'http://localhost:1316'; export const IBC_WEB_HOST = process.env.ICQ_WEB_HOST || 'http://localhost:9999'; +export const GAIA_CONNECTION = 'connection-0'; diff --git a/src/helpers/interchaintxs.ts b/src/helpers/interchaintxs.ts index 01b3fbb8..58e18dbd 100644 --- a/src/helpers/interchaintxs.ts +++ b/src/helpers/interchaintxs.ts @@ -1,5 +1,7 @@ import { SigningNeutronClient } from './signing_neutron_client'; import { JsonObject } from '@cosmjs/cosmwasm-stargate'; +import { Link } from '@confio/relayer/build'; +import { PacketWithMetadata } from '@confio/relayer/build/lib/endpoint'; export type AcknowledgementResult = | { success: string[] } @@ -56,3 +58,18 @@ export const getAcks = ( client.queryContractSmart(contractAddress, { acknowledgement_results: {}, }); + +// relays given packet from A side, and it's acknowledgement +// note that it does not relay the timeout if it happens +export async function relayPacketFromA(link: Link, packet: PacketWithMetadata) { + await link.relayPackets('A', [packet]); + const [acksA, acksB] = await Promise.all([ + link.getPendingAcks('A'), + link.getPendingAcks('B'), + ]); + const [acksResA, acksResB] = await Promise.all([ + link.relayAcks('A', acksA), + link.relayAcks('B', acksB), + ]); + return { acksResA, acksResB }; +} diff --git a/src/helpers/local_state.ts b/src/helpers/local_state.ts index 0b142266..747dcbad 100644 --- a/src/helpers/local_state.ts +++ b/src/helpers/local_state.ts @@ -9,6 +9,7 @@ import { RunnerTestSuite } from 'vitest'; import { connectComet } from '@cosmjs/tendermint-rpc'; import { COSMOS_PREFIX, + GAIA_CONNECTION, GAIA_REST, GAIA_RPC, IBC_WEB_HOST, @@ -17,6 +18,8 @@ import { NEUTRON_RPC, } from './constants'; import { Wallet } from './wallet'; +import { IbcClient, Link } from '@confio/relayer'; +import { GasPrice } from '@cosmjs/stargate/build/fee'; // limit of wallets precreated for one test const WALLETS_PER_TEST_FILE = 20; @@ -122,6 +125,41 @@ export class LocalState { throw new Error('rpcClient() called non existent network: ' + network); } } + + // Creates a relayer between neutron and gaia + // This relayer can be used to manually relay packets + // Since hermes don't have manual relay. + async relayerLink(): Promise { + const neutronWallet = await this.nextWallet('neutron'); + const gaiaWallet = await this.nextWallet('cosmos'); + const neutronIbcClient = await IbcClient.connectWithSigner( + this.rpcNeutron, + neutronWallet.directwallet, + neutronWallet.address, + { + gasPrice: GasPrice.fromString('0.05untrn'), + estimatedBlockTime: 3, + estimatedIndexerTime: 100, + }, + ); + const gaiaIbcClient = await IbcClient.connectWithSigner( + this.rpcGaia, + gaiaWallet.directwallet, + gaiaWallet.address, + { + gasPrice: GasPrice.fromString('0.05uatom'), + estimatedBlockTime: 3, + estimatedIndexerTime: 100, + }, + ); + + return await Link.createWithExistingConnections( + neutronIbcClient, + gaiaIbcClient, + GAIA_CONNECTION, + GAIA_CONNECTION, + ); + } } export const mnemonicToWallet = async ( diff --git a/src/testcases/run_in_band/interchaintx.test.ts b/src/testcases/run_in_band/interchaintx.test.ts index 49192d5d..1fdd08d8 100644 --- a/src/testcases/run_in_band/interchaintx.test.ts +++ b/src/testcases/run_in_band/interchaintx.test.ts @@ -31,30 +31,16 @@ import { cleanAckResults, getAck, getAcks, + relayPacketFromA, waitForAck, } from '../../helpers/interchaintxs'; import { execSync } from 'child_process'; -import { IbcClient, Link } from '@confio/relayer/build'; +import { Link } from '@confio/relayer/build'; import config from '../../config.json'; import { Order, State, } from '@neutron-org/neutronjs/ibc/core/channel/v1/channel'; -import { GasPrice } from '@cosmjs/stargate/build/fee'; -import { PacketWithMetadata } from '@confio/relayer/build/lib/endpoint'; - -async function relayPacket(link: Link, lastPacket: PacketWithMetadata) { - await link.relayPackets('A', [lastPacket]); - const [acksA, acksB] = await Promise.all([ - link.getPendingAcks('A'), - link.getPendingAcks('B'), - ]); - const [acksResA, acksResB] = await Promise.all([ - link.relayAcks('A', acksA), - link.relayAcks('B', acksB), - ]); - return { acksResA, acksResB }; -} describe('Neutron / Interchain TXs', () => { let testState: LocalState; @@ -71,6 +57,8 @@ describe('Neutron / Interchain TXs', () => { let neutronWallet: Wallet; let gaiaWallet: Wallet; + let link: Link; + const icaId1 = 'test1'; const icaId2 = 'test2'; const unorderedIcaId = 'test-unordered'; @@ -98,6 +86,8 @@ describe('Neutron / Interchain TXs', () => { contractManagerQuerier = new ContractManagerQuery(neutronRpcClient); const gaiaRpcClient = await testState.gaiaRpcClient(); gaiaStakingQuerier = new StakingQueryClient(gaiaRpcClient); + + link = await testState.relayerLink(); }); describe('Interchain Tx with multiple ICAs', () => { @@ -588,7 +578,7 @@ describe('Neutron / Interchain TXs', () => { }); describe('Unordered channel', () => { - test.skip('delegate with timeout does not close unordered channel', async () => { + test('delegate with timeout does not close unordered channel', async () => { await cleanAckResults(neutronClient, contractAddress); const res = await neutronClient.execute(contractAddress, { delegate: { @@ -646,34 +636,6 @@ describe('Neutron / Interchain TXs', () => { }); test('try two delegates with first one when relayer is paused, so only second delegate passed through', async () => { - const neutronIbcClient = await IbcClient.connectWithSigner( - testState.rpcNeutron, - testState.wallets.neutron.demo1.directwallet, - testState.wallets.neutron.demo1.address, - { - gasPrice: GasPrice.fromString('0.05untrn'), - estimatedBlockTime: 3, - estimatedIndexerTime: 100, - }, - ); - const gaiaIbcClient = await IbcClient.connectWithSigner( - testState.rpcGaia, - testState.wallets.cosmos.demo1.directwallet, - testState.wallets.cosmos.demo1.address, - { - gasPrice: GasPrice.fromString('0.05uatom'), - estimatedBlockTime: 3, - estimatedIndexerTime: 100, - }, - ); - - const link = await Link.createWithExistingConnections( - neutronIbcClient, - gaiaIbcClient, - connectionId, - connectionId, - ); - // We pause hermes container, so that we can use manual relaying of the packets. // That needed in order to ack ibc packets in backwards order execSync('docker pause setup-hermes-1'); @@ -717,7 +679,7 @@ describe('Neutron / Interchain TXs', () => { (p) => p.packet.sequence === BigInt(sequenceId2), ); expect(lastPacket).not.toBeNull(); - await relayPacket(link, lastPacket); + await relayPacketFromA(link, lastPacket); await waitForAck( neutronClient, contractAddress, @@ -739,7 +701,7 @@ describe('Neutron / Interchain TXs', () => { (p) => p.packet.sequence === BigInt(sequenceId1), ); expect(firstPacket).not.toBeNull(); - await relayPacket(link, firstPacket); + await relayPacketFromA(link, firstPacket); await waitForAck( neutronClient, From 3e09e86e4d1ac67eb2621c6364b4f61f0e451c17 Mon Sep 17 00:00:00 2001 From: nhpd Date: Thu, 15 Aug 2024 23:53:47 +0400 Subject: [PATCH 17/23] wait longer for ICA recreation --- src/testcases/run_in_band/interchaintx.test.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/testcases/run_in_band/interchaintx.test.ts b/src/testcases/run_in_band/interchaintx.test.ts index 1fdd08d8..c5d0d339 100644 --- a/src/testcases/run_in_band/interchaintx.test.ts +++ b/src/testcases/run_in_band/interchaintx.test.ts @@ -747,7 +747,7 @@ describe('Neutron / Interchain TXs', () => { channels.channels.findLast( (c) => c.portId === `icacontroller-${contractAddress}.test1`, )?.state == State.STATE_OPEN, - 100, + 200, ); }); test('delegate from first ICA after ICA recreation', async () => { From eccb062a33de7f2aa138c8b7818aa512f193d89f Mon Sep 17 00:00:00 2001 From: nhpd Date: Fri, 16 Aug 2024 00:06:48 +0400 Subject: [PATCH 18/23] reorder test to avoid clashing --- .../run_in_band/interchaintx.test.ts | 295 +++++++++--------- 1 file changed, 148 insertions(+), 147 deletions(-) diff --git a/src/testcases/run_in_band/interchaintx.test.ts b/src/testcases/run_in_band/interchaintx.test.ts index c5d0d339..e6d60d92 100644 --- a/src/testcases/run_in_band/interchaintx.test.ts +++ b/src/testcases/run_in_band/interchaintx.test.ts @@ -577,153 +577,6 @@ describe('Neutron / Interchain TXs', () => { }); }); - describe('Unordered channel', () => { - test('delegate with timeout does not close unordered channel', async () => { - await cleanAckResults(neutronClient, contractAddress); - const res = await neutronClient.execute(contractAddress, { - delegate: { - interchain_account_id: unorderedIcaId, - validator: testState.wallets.cosmos.val1.valAddress, - amount: '100', - denom: COSMOS_DENOM, - timeout: 1, - }, - }); - expect(res.code).toEqual(0); - const sequenceId = getSequenceId(res); - - // timeout handling may be slow, hence we wait for up to 100 blocks here - await waitForAck( - neutronClient, - contractAddress, - unorderedIcaId, - sequenceId, - 100, - ); - const ackRes = await getAck( - neutronClient, - contractAddress, - unorderedIcaId, - sequenceId, - ); - expect(ackRes).toMatchObject({ - timeout: 'message', - }); - - const channel = (await ibcQuerier.Channels({})).channels.find( - (c) => c.ordering === Order.ORDER_UNORDERED, - ); - expect(channel.state).toEqual(State.STATE_OPEN); - }); - - test('delegate after the timeout on unordered channel should work as channel should still be open', async () => { - const res = await neutronClient.execute(contractAddress, { - delegate: { - interchain_account_id: unorderedIcaId, - validator: testState.wallets.cosmos.val1.valAddress, - amount: '100', - denom: COSMOS_DENOM, - }, - }); - expect(res.code).toBe(0); // works as channel is still open - const sequenceId = getSequenceId(res); - await getAck( - neutronClient, - contractAddress, - unorderedIcaId, - sequenceId, - ); - }); - - test('try two delegates with first one when relayer is paused, so only second delegate passed through', async () => { - // We pause hermes container, so that we can use manual relaying of the packets. - // That needed in order to ack ibc packets in backwards order - execSync('docker pause setup-hermes-1'); - - const res1 = await neutronClient.execute(contractAddress, { - delegate: { - interchain_account_id: unorderedIcaId, - validator: testState.wallets.cosmos.val1.valAddress, - denom: COSMOS_DENOM, - amount: '200', - }, - }); - expect(res1.code).toEqual(0); - const sequenceId1 = getSequenceId(res1); - - // this should be relayed first, even thought it has a later sequence. - const res2 = await neutronClient.execute(contractAddress, { - delegate: { - interchain_account_id: unorderedIcaId, - validator: testState.wallets.cosmos.val1.valAddress, - denom: COSMOS_DENOM, - amount: '400', - }, - }); - expect(res2.code).toEqual(0); - const sequenceId2 = getSequenceId(res2); - expect(sequenceId1).toBe(sequenceId2 - 1); - - // should be delegated 100 coins from before - const delegationsQ1 = await gaiaStakingQuerier.DelegatorDelegations({ - delegatorAddr: unorderedIcaAddress, - }); - expect(delegationsQ1.delegationResponses[0].balance.amount).toEqual( - '100', - ); - - const pendingPackets = await link.getPendingPackets('A'); - - // relay lastPacket - const lastPacket = pendingPackets.find( - (p) => p.packet.sequence === BigInt(sequenceId2), - ); - expect(lastPacket).not.toBeNull(); - await relayPacketFromA(link, lastPacket); - await waitForAck( - neutronClient, - contractAddress, - unorderedIcaId, - sequenceId2, - 100, - ); - - // should be delegated 100 + 400 (lastPacket) coins after relaying last packet - const delegationsQ2 = await gaiaStakingQuerier.DelegatorDelegations({ - delegatorAddr: unorderedIcaAddress, - }); - expect(delegationsQ2.delegationResponses[0].balance.amount).toEqual( - '500', - ); - - // relay firstPacket - const firstPacket = pendingPackets.find( - (p) => p.packet.sequence === BigInt(sequenceId1), - ); - expect(firstPacket).not.toBeNull(); - await relayPacketFromA(link, firstPacket); - - await waitForAck( - neutronClient, - contractAddress, - unorderedIcaId, - sequenceId1, - 100, - ); - - // should be delegated 100 + 400 + 200 (lastPacket + firstPacket) coins after relaying last packet - const delegationsQ3 = await gaiaStakingQuerier.DelegatorDelegations({ - delegatorAddr: unorderedIcaAddress, - }); - expect(delegationsQ3.delegationResponses[0].balance.amount).toEqual( - '700', - ); - - // unpause hermes for tests below - execSync('docker unpause setup-hermes-1'); - }); - }); - describe('Recreation', () => { test('recreate ICA1', async () => { const res = await neutronClient.execute(contractAddress, { @@ -1153,5 +1006,153 @@ describe('Neutron / Interchain TXs', () => { ); }); }); + + + describe('Unordered channel', () => { + test('delegate with timeout does not close unordered channel', async () => { + await cleanAckResults(neutronClient, contractAddress); + const res = await neutronClient.execute(contractAddress, { + delegate: { + interchain_account_id: unorderedIcaId, + validator: testState.wallets.cosmos.val1.valAddress, + amount: '100', + denom: COSMOS_DENOM, + timeout: 1, + }, + }); + expect(res.code).toEqual(0); + const sequenceId = getSequenceId(res); + + // timeout handling may be slow, hence we wait for up to 100 blocks here + await waitForAck( + neutronClient, + contractAddress, + unorderedIcaId, + sequenceId, + 100, + ); + const ackRes = await getAck( + neutronClient, + contractAddress, + unorderedIcaId, + sequenceId, + ); + expect(ackRes).toMatchObject({ + timeout: 'message', + }); + + const channel = (await ibcQuerier.Channels({})).channels.find( + (c) => c.ordering === Order.ORDER_UNORDERED, + ); + expect(channel.state).toEqual(State.STATE_OPEN); + }); + + test('delegate after the timeout on unordered channel should work as channel should still be open', async () => { + const res = await neutronClient.execute(contractAddress, { + delegate: { + interchain_account_id: unorderedIcaId, + validator: testState.wallets.cosmos.val1.valAddress, + amount: '100', + denom: COSMOS_DENOM, + }, + }); + expect(res.code).toBe(0); // works as channel is still open + const sequenceId = getSequenceId(res); + await getAck( + neutronClient, + contractAddress, + unorderedIcaId, + sequenceId, + ); + }); + + test('try two delegates with first one when relayer is paused, so only second delegate passed through', async () => { + // We pause hermes container, so that we can use manual relaying of the packets. + // That needed in order to ack ibc packets in backwards order + execSync('docker pause setup-hermes-1'); + + const res1 = await neutronClient.execute(contractAddress, { + delegate: { + interchain_account_id: unorderedIcaId, + validator: testState.wallets.cosmos.val1.valAddress, + denom: COSMOS_DENOM, + amount: '200', + }, + }); + expect(res1.code).toEqual(0); + const sequenceId1 = getSequenceId(res1); + + // this should be relayed first, even thought it has a later sequence. + const res2 = await neutronClient.execute(contractAddress, { + delegate: { + interchain_account_id: unorderedIcaId, + validator: testState.wallets.cosmos.val1.valAddress, + denom: COSMOS_DENOM, + amount: '400', + }, + }); + expect(res2.code).toEqual(0); + const sequenceId2 = getSequenceId(res2); + expect(sequenceId1).toBe(sequenceId2 - 1); + + // should be delegated 100 coins from before + const delegationsQ1 = await gaiaStakingQuerier.DelegatorDelegations({ + delegatorAddr: unorderedIcaAddress, + }); + expect(delegationsQ1.delegationResponses[0].balance.amount).toEqual( + '100', + ); + + const pendingPackets = await link.getPendingPackets('A'); + + // relay lastPacket + const lastPacket = pendingPackets.find( + (p) => p.packet.sequence === BigInt(sequenceId2), + ); + expect(lastPacket).not.toBeNull(); + await relayPacketFromA(link, lastPacket); + await waitForAck( + neutronClient, + contractAddress, + unorderedIcaId, + sequenceId2, + 100, + ); + + // should be delegated 100 + 400 (lastPacket) coins after relaying last packet + const delegationsQ2 = await gaiaStakingQuerier.DelegatorDelegations({ + delegatorAddr: unorderedIcaAddress, + }); + expect(delegationsQ2.delegationResponses[0].balance.amount).toEqual( + '500', + ); + + // relay firstPacket + const firstPacket = pendingPackets.find( + (p) => p.packet.sequence === BigInt(sequenceId1), + ); + expect(firstPacket).not.toBeNull(); + await relayPacketFromA(link, firstPacket); + + await waitForAck( + neutronClient, + contractAddress, + unorderedIcaId, + sequenceId1, + 100, + ); + + // should be delegated 100 + 400 + 200 (lastPacket + firstPacket) coins after relaying last packet + const delegationsQ3 = await gaiaStakingQuerier.DelegatorDelegations({ + delegatorAddr: unorderedIcaAddress, + }); + expect(delegationsQ3.delegationResponses[0].balance.amount).toEqual( + '700', + ); + + // unpause hermes for tests below + execSync('docker unpause setup-hermes-1'); + }); + }); }); }); From 4fdbf2cea92a07583b55242f76c2f62fcedd3382 Mon Sep 17 00:00:00 2001 From: nhpd Date: Fri, 16 Aug 2024 00:22:05 +0400 Subject: [PATCH 19/23] cleanup --- src/helpers/local_state.ts | 4 ++-- src/testcases/run_in_band/interchaintx.test.ts | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/helpers/local_state.ts b/src/helpers/local_state.ts index 747dcbad..ef76e61d 100644 --- a/src/helpers/local_state.ts +++ b/src/helpers/local_state.ts @@ -126,9 +126,9 @@ export class LocalState { } } - // Creates a relayer between neutron and gaia + // Creates an IBC relayer between neutron and gaia // This relayer can be used to manually relay packets - // Since hermes don't have manual relay. + // since hermes don't have manual relay. async relayerLink(): Promise { const neutronWallet = await this.nextWallet('neutron'); const gaiaWallet = await this.nextWallet('cosmos'); diff --git a/src/testcases/run_in_band/interchaintx.test.ts b/src/testcases/run_in_band/interchaintx.test.ts index e6d60d92..010d6925 100644 --- a/src/testcases/run_in_band/interchaintx.test.ts +++ b/src/testcases/run_in_band/interchaintx.test.ts @@ -1150,7 +1150,7 @@ describe('Neutron / Interchain TXs', () => { '700', ); - // unpause hermes for tests below + // unpause hermes back execSync('docker unpause setup-hermes-1'); }); }); From 0c137c219ed8e587fd7a511a2bc476b6de30fd90 Mon Sep 17 00:00:00 2001 From: swelf Date: Fri, 30 Aug 2024 12:26:03 +0300 Subject: [PATCH 20/23] install neutronjs by commit --- package.json | 6 ++++-- yarn.lock | 5 ++--- 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/package.json b/package.json index d5f1ef2f..f4a09460 100644 --- a/package.json +++ b/package.json @@ -32,7 +32,9 @@ "test:feemarket": "NO_WAIT_CHANNEL1=1 NO_WAIT_HTTP2=1 NO_WAIT_CHANNEL2=1 NO_WAIT_DELAY=1 vitest --run src/testcases/run_in_band/feemarket --bail 1", "lint": "eslint ./src", "fmt": "eslint ./src --fix", - "postinstall": "[ -d './node_modules/@neutron-org/neutronjsplus/dist' ] || tsc -p ./node_modules/@neutron-org/neutronjsplus/tsconfig.json" + "build:neutronjsplus": "[ -d './node_modules/@neutron-org/neutronjsplus/dist' ] || tsc -p ./node_modules/@neutron-org/neutronjsplus/tsconfig.json", + "build:neutronjs": "[ -d './node_modules/@neutron-org/neutronjs/dist' ] || tsc -p ./node_modules/@neutron-org/neutronjs/tsconfig.json", + "postinstall": "yarn build:neutronjs && yarn build:neutronjsplus" }, "author": "Neutron", "license": "Apache-2.0", @@ -41,7 +43,7 @@ "@cosmjs/cosmwasm-stargate": "^0.32.4", "@cosmjs/stargate": "0.32.4", "@cosmjs/tendermint-rpc": "^0.32.4", - "@neutron-org/neutronjs": "0.1.0-rc5", + "@neutron-org/neutronjs": "https://github.com/neutron-org/neutronjs.git#f5334307decfa549283d03e626cd45582667c13f", "@neutron-org/neutronjsplus": "https://github.com/neutron-org/neutronjsplus.git#cf53a61bd7d4aa1e9204c41b2c2ea36cb024ae7d", "@types/lodash": "^4.14.182", "axios": "1.6.0", diff --git a/yarn.lock b/yarn.lock index 4c3b4956..949a00dc 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1307,10 +1307,9 @@ resolved "https://registry.yarnpkg.com/@neutron-org/cosmjs-types/-/cosmjs-types-0.9.2-rc1.tgz#ca1fc1dc9566858dbd765e8f82c8a70097bcc84b" integrity sha512-ju2AqJ14yO4+JF8RwY4ZVy7f2HVjhdf66SfhS6y4ucBZm997/E/yYVMnpWmUncVg8ARooISOKaOYNagqz0am6Q== -"@neutron-org/neutronjs@0.1.0-rc5": +"@neutron-org/neutronjs@https://github.com/neutron-org/neutronjs.git#f5334307decfa549283d03e626cd45582667c13f": version "0.1.0-rc5" - resolved "https://registry.yarnpkg.com/@neutron-org/neutronjs/-/neutronjs-0.1.0-rc5.tgz#ebdafe6951ad4b1c752b102e444dbe9dee8a0de9" - integrity sha512-9VGdDNMICs6oljsA96CloCz8/5ocnSTZyNpxkpC/AnZxl1QxukQp5+WatLAK0c5a0814RPOJ5+0L2mPvcINHDQ== + resolved "https://github.com/neutron-org/neutronjs.git#f5334307decfa549283d03e626cd45582667c13f" "@neutron-org/neutronjsplus@https://github.com/neutron-org/neutronjsplus.git#cf53a61bd7d4aa1e9204c41b2c2ea36cb024ae7d": version "0.4.0-rc21" From e740eaf4ceca7cd8bcc6f42352b81230d4168236 Mon Sep 17 00:00:00 2001 From: swelf Date: Fri, 30 Aug 2024 12:34:59 +0300 Subject: [PATCH 21/23] updated neutronjsplus --- package.json | 2 +- yarn.lock | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/package.json b/package.json index f4a09460..cc5317c5 100644 --- a/package.json +++ b/package.json @@ -44,7 +44,7 @@ "@cosmjs/stargate": "0.32.4", "@cosmjs/tendermint-rpc": "^0.32.4", "@neutron-org/neutronjs": "https://github.com/neutron-org/neutronjs.git#f5334307decfa549283d03e626cd45582667c13f", - "@neutron-org/neutronjsplus": "https://github.com/neutron-org/neutronjsplus.git#cf53a61bd7d4aa1e9204c41b2c2ea36cb024ae7d", + "@neutron-org/neutronjsplus": "https://github.com/neutron-org/neutronjsplus.git#1e4527ef6971f4dc2c202cb3cc2a50b0a4491f54", "@types/lodash": "^4.14.182", "axios": "1.6.0", "commander": "^10.0.0", diff --git a/yarn.lock b/yarn.lock index 949a00dc..72ba7fd0 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1311,9 +1311,9 @@ version "0.1.0-rc5" resolved "https://github.com/neutron-org/neutronjs.git#f5334307decfa549283d03e626cd45582667c13f" -"@neutron-org/neutronjsplus@https://github.com/neutron-org/neutronjsplus.git#cf53a61bd7d4aa1e9204c41b2c2ea36cb024ae7d": - version "0.4.0-rc21" - resolved "https://github.com/neutron-org/neutronjsplus.git#cf53a61bd7d4aa1e9204c41b2c2ea36cb024ae7d" +"@neutron-org/neutronjsplus@https://github.com/neutron-org/neutronjsplus.git#1e4527ef6971f4dc2c202cb3cc2a50b0a4491f54": + version "0.5.0" + resolved "https://github.com/neutron-org/neutronjsplus.git#1e4527ef6971f4dc2c202cb3cc2a50b0a4491f54" dependencies: "@cosmjs/cosmwasm-stargate" "^0.32.4" "@cosmjs/proto-signing" "^0.32.4" From c7f65c326f96aff5fb773f93132531511d25f0a1 Mon Sep 17 00:00:00 2001 From: swelf Date: Fri, 30 Aug 2024 12:53:24 +0300 Subject: [PATCH 22/23] install neutronjs by commit --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index cc5317c5..0d181db1 100644 --- a/package.json +++ b/package.json @@ -33,7 +33,7 @@ "lint": "eslint ./src", "fmt": "eslint ./src --fix", "build:neutronjsplus": "[ -d './node_modules/@neutron-org/neutronjsplus/dist' ] || tsc -p ./node_modules/@neutron-org/neutronjsplus/tsconfig.json", - "build:neutronjs": "[ -d './node_modules/@neutron-org/neutronjs/dist' ] || tsc -p ./node_modules/@neutron-org/neutronjs/tsconfig.json", + "build:neutronjs": "[ -d './node_modules/@neutron-org/neutronjs/dist' ] || { tsc -p ./node_modules/@neutron-org/neutronjs/tsconfig.json && cp -R ./node_modules/@neutron-org/neutronjs/build/* ./node_modules/@neutron-org/neutronjs/ ; }", "postinstall": "yarn build:neutronjs && yarn build:neutronjsplus" }, "author": "Neutron", From f45f76bb3bd0743100115ed5638c5adb5ef09597 Mon Sep 17 00:00:00 2001 From: nhpd Date: Mon, 2 Sep 2024 14:26:11 +0400 Subject: [PATCH 23/23] fix lint --- src/testcases/run_in_band/interchaintx.test.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/src/testcases/run_in_band/interchaintx.test.ts b/src/testcases/run_in_band/interchaintx.test.ts index 010d6925..392efe82 100644 --- a/src/testcases/run_in_band/interchaintx.test.ts +++ b/src/testcases/run_in_band/interchaintx.test.ts @@ -1007,7 +1007,6 @@ describe('Neutron / Interchain TXs', () => { }); }); - describe('Unordered channel', () => { test('delegate with timeout does not close unordered channel', async () => { await cleanAckResults(neutronClient, contractAddress);