From dcef71418541db2bb66f611e770b608f8b253d40 Mon Sep 17 00:00:00 2001 From: quasisamurai Date: Tue, 10 Sep 2024 11:35:25 -0300 Subject: [PATCH 01/29] inc hermes gas multiplier in order to avoid oog --- setup/hermes/config.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/setup/hermes/config.toml b/setup/hermes/config.toml index 131249b6..7a7b5fcc 100644 --- a/setup/hermes/config.toml +++ b/setup/hermes/config.toml @@ -102,7 +102,7 @@ store_prefix = 'ibc' default_gas = 100000 max_gas = 3000000 gas_price = { price = 0.0025, denom = 'untrn' } -gas_multiplier = 2.0 +gas_multiplier = 2.5 max_msg_num = 30 max_tx_size = 2097152 clock_drift = '5s' From 6b6b634a6391740a3e6ec0539d5ab47b31815077 Mon Sep 17 00:00:00 2001 From: quasisamurai Date: Thu, 12 Sep 2024 11:42:29 -0300 Subject: [PATCH 02/29] wip debug --- src/testcases/parallel/ibc_transfer.test.ts | 23 ++++++++++++++++++--- 1 file changed, 20 insertions(+), 3 deletions(-) diff --git a/src/testcases/parallel/ibc_transfer.test.ts b/src/testcases/parallel/ibc_transfer.test.ts index 6f41728f..06f0c94f 100644 --- a/src/testcases/parallel/ibc_transfer.test.ts +++ b/src/testcases/parallel/ibc_transfer.test.ts @@ -483,7 +483,7 @@ describe('Neutron / IBC transfer', () => { hermes checks height on remote chain and Timeout error occurs. */ const currentHeight = await gaiaClient.getHeight(); - await waitBlocks(15, gaiaClient); + await waitBlocks(25, gaiaClient); await neutronClient.execute(ibcContract, { send: { @@ -562,6 +562,12 @@ describe('Neutron / IBC transfer', () => { state: 'enabled_infinite_loop', }, }); + // check that failures count is the same + let failuresResAfter = await contractManagerQuerier.failures({ + address: ibcContract, + }); + + console.log(failuresResAfter) await neutronClient.execute(ibcContract, { send: { @@ -572,7 +578,15 @@ describe('Neutron / IBC transfer', () => { }, }); - await neutronClient.waitBlocks(5); + await neutronClient.waitBlocks(35); + + // check that failures count is the same + failuresResAfter = await contractManagerQuerier.failures({ + address: ibcContract, + }); + + console.log(failuresResAfter) + const res = await neutronClient.getWithAttempts( async () => @@ -614,6 +628,7 @@ describe('Neutron / IBC transfer', () => { const failuresResAfter = await contractManagerQuerier.failures({ address: ibcContract, }); + console.log(failuresResAfter.failures) expect(failuresResAfter.failures.length).toEqual(6); // Restore sudo handler's normal state @@ -629,6 +644,7 @@ describe('Neutron / IBC transfer', () => { address: ibcContract, }); const failure = failuresResBefore.failures[0]; + console.log(failure) const res = await neutronClient.execute(ibcContract, { resubmit_failure: { failure_id: +failure.id.toString(), @@ -636,12 +652,13 @@ describe('Neutron / IBC transfer', () => { }); expect(res.code).toBe(0); - await neutronClient.waitBlocks(5); + await neutronClient.waitBlocks(10); // check that failures count is changed const failuresResAfter = await contractManagerQuerier.failures({ address: ibcContract, }); + console.log(failuresResAfter.failures) expect(failuresResAfter.failures.length).toEqual(5); }); }); From e0c5a1bec7eb0dcf2626dc332c9d35c4742322c2 Mon Sep 17 00:00:00 2001 From: quasisamurai Date: Thu, 12 Sep 2024 11:56:53 -0300 Subject: [PATCH 03/29] inc gmp once again --- setup/hermes/config.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/setup/hermes/config.toml b/setup/hermes/config.toml index 7a7b5fcc..dd33f080 100644 --- a/setup/hermes/config.toml +++ b/setup/hermes/config.toml @@ -102,7 +102,7 @@ store_prefix = 'ibc' default_gas = 100000 max_gas = 3000000 gas_price = { price = 0.0025, denom = 'untrn' } -gas_multiplier = 2.5 +gas_multiplier = 2.7 max_msg_num = 30 max_tx_size = 2097152 clock_drift = '5s' From ee8b133120441019ac0f16e4ba0a8c9be029ef0e Mon Sep 17 00:00:00 2001 From: quasisamurai Date: Thu, 12 Sep 2024 12:17:51 -0300 Subject: [PATCH 04/29] inc gmp once again --- setup/hermes/config.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/setup/hermes/config.toml b/setup/hermes/config.toml index dd33f080..fc1da922 100644 --- a/setup/hermes/config.toml +++ b/setup/hermes/config.toml @@ -102,7 +102,7 @@ store_prefix = 'ibc' default_gas = 100000 max_gas = 3000000 gas_price = { price = 0.0025, denom = 'untrn' } -gas_multiplier = 2.7 +gas_multiplier = 3.7 max_msg_num = 30 max_tx_size = 2097152 clock_drift = '5s' From 8247b95381a1f49c84ba59ce79b1594b410ed037 Mon Sep 17 00:00:00 2001 From: quasisamurai Date: Thu, 12 Sep 2024 13:49:28 -0300 Subject: [PATCH 05/29] bring multiplier down --- setup/hermes/config.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/setup/hermes/config.toml b/setup/hermes/config.toml index fc1da922..dd33f080 100644 --- a/setup/hermes/config.toml +++ b/setup/hermes/config.toml @@ -102,7 +102,7 @@ store_prefix = 'ibc' default_gas = 100000 max_gas = 3000000 gas_price = { price = 0.0025, denom = 'untrn' } -gas_multiplier = 3.7 +gas_multiplier = 2.7 max_msg_num = 30 max_tx_size = 2097152 clock_drift = '5s' From 5e49fc6105c3006b8e33ab93771ffae895cf0b9c Mon Sep 17 00:00:00 2001 From: quasisamurai Date: Wed, 18 Sep 2024 06:50:38 -0300 Subject: [PATCH 06/29] add skeleton for rl --- package.json | 3 +- src/helpers/constants.ts | 1 + src/helpers/signing_neutron_client.ts | 37 +- src/testcases/run_in_band/rate_limit.test.ts | 388 +++++++++++++++++++ yarn.lock | 15 +- 5 files changed, 421 insertions(+), 23 deletions(-) create mode 100644 src/testcases/run_in_band/rate_limit.test.ts diff --git a/package.json b/package.json index 503a5e04..19b4ea6c 100644 --- a/package.json +++ b/package.json @@ -30,6 +30,7 @@ "test:dex_bindings": "NO_WAIT_CHANNEL1=1 NO_WAIT_HTTP2=1 NO_WAIT_CHANNEL2=1 NO_WAIT_DELAY=1 vitest --run src/testcases/run_in_band/dex_bindings --bail 1", "test:chain_manager": "vitest --run src/testcases/run_in_band/chain_manager --bail 1", "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", + "test:rate_limit": "vitest --run src/testcases/run_in_band/rate_limit --bail 1", "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", @@ -45,7 +46,7 @@ "@cosmjs/stargate": "0.32.4", "@cosmjs/tendermint-rpc": "^0.32.4", "@neutron-org/neutronjs": "https://github.com/neutron-org/neutronjs.git#1e70c1f68e997857f42bab7647227c8ca9dc8aa1", - "@neutron-org/neutronjsplus": "https://github.com/neutron-org/neutronjsplus.git#1e4527ef6971f4dc2c202cb3cc2a50b0a4491f54", + "@neutron-org/neutronjsplus": "https://github.com/neutron-org/neutronjsplus.git#a05b8bedd5ad6e33cf55da79821a1652ea6c2b22", "@types/lodash": "^4.14.182", "axios": "1.6.0", "commander": "^10.0.0", diff --git a/src/helpers/constants.ts b/src/helpers/constants.ts index 62f61fd2..0cc1972e 100644 --- a/src/helpers/constants.ts +++ b/src/helpers/constants.ts @@ -74,6 +74,7 @@ export const CONTRACTS = { LOCKDROP_VAULT_CL: 'lockdrop_vault_for_cl_pools.wasm', MARKETMAP: 'marketmap.wasm', ORACLE: 'oracle.wasm', + RATE_LIMITER: 'rate_limiter.wasm', }; export const NEUTRON_PREFIX = process.env.NEUTRON_ADDRESS_PREFIX || 'neutron'; diff --git a/src/helpers/signing_neutron_client.ts b/src/helpers/signing_neutron_client.ts index 231c5541..40e5b7cc 100644 --- a/src/helpers/signing_neutron_client.ts +++ b/src/helpers/signing_neutron_client.ts @@ -98,22 +98,31 @@ export class SigningNeutronClient extends CosmWasmClient { fee: StdFee | 'auto' | number = 'auto', admin: string = this.sender, ): Promise { - // upload - const wasmCode = await this.getNeutronContract(fileName); - const uploadResult = await this.client.upload(this.sender, wasmCode, fee); - - // instantiate - const res = await this.client.instantiate( - this.sender, - uploadResult.codeId, - msg, - label, - fee, - { admin }, - ); - return res.contractAddress; + try { + // Upload + const wasmCode = await this.getNeutronContract(fileName); + const uploadResult = await this.client.upload(this.sender, wasmCode, fee); + console.log("Upload logs:", uploadResult.logs); + + // Instantiate + const res = await this.client.instantiate( + this.sender, + uploadResult.codeId, + msg, + label, + fee, + { admin }, + ); + console.log("Instantiation events:", res.events); + return res.contractAddress; + + } catch (error) { + console.error("Error during contract upload/instantiation:", error); + throw new Error(`Contract instantiation failed: ${error}`); + } } + async migrate( contract: string, codeId: number, diff --git a/src/testcases/run_in_band/rate_limit.test.ts b/src/testcases/run_in_band/rate_limit.test.ts new file mode 100644 index 00000000..7fa70276 --- /dev/null +++ b/src/testcases/run_in_band/rate_limit.test.ts @@ -0,0 +1,388 @@ +import {Registry} from '@cosmjs/proto-signing'; +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'; +import {MsgTransfer as NeutronMsgTransfer} from '@neutron-org/neutronjs/ibc/applications/transfer/v1/tx'; +import {defaultRegistryTypes} from '@cosmjs/stargate'; +import {QueryFailuresResponse} from '@neutron-org/neutronjs/neutron/contractmanager/query'; +import {QueryClientImpl as BankQueryClient} from '@neutron-org/neutronjs/cosmos/bank/v1beta1/query.rpc.Query'; +import {QueryClientImpl as IbcQueryClient} from '@neutron-org/neutronjs/ibc/applications/transfer/v1/query.rpc.Query'; +import { + COSMOS_DENOM, + IBC_RELAYER_NEUTRON_ADDRESS, + CONTRACTS, + NEUTRON_DENOM, +} from '../../helpers/constants'; +import {SigningStargateClient} from '@cosmjs/stargate'; +import {waitBlocks} from '@neutron-org/neutronjsplus/dist/wait'; +import {Wallet} from '../../helpers/wallet'; +import {getIBCDenom} from '@neutron-org/neutronjsplus/dist/cosmos'; +import config from '../../config.json'; +import {QueryClientImpl as ContractManagerQuery} from '@neutron-org/neutronjs/neutron/contractmanager/query.rpc.Query'; +import {Dao, DaoMember, getDaoContracts, getNeutronDAOCore} from "@neutron-org/neutronjsplus/dist/dao"; +import {ADMIN_MODULE_ADDRESS} from "@neutron-org/neutronjsplus/dist/constants"; +import {createRPCQueryClient as createNeutronClient} from "@neutron-org/neutronjs/neutron/rpc.query"; +import {NeutronQuerier} from "@neutron-org/neutronjs/querier_types"; +import {QueryParamsResponse} from "@neutron-org/neutronjs/neutron/interchainqueries/query"; + + +const TRANSFER_CHANNEL = 'channel-0'; +const IBC_TOKEN_DENOM = + 'ibc/4E41ED8F3DCAEA15F4D6ADC6EDD7C04A676160735C9710B904B7BF53525B56D6'; +const UATOM_IBC_TO_NEUTRON_DENOM = + 'ibc/27394FB092D2ECCD56123C74F36E4C1F926001CEADA9CA97EA622B25F41E5EB2'; + +describe('Neutron / IBC transfer', () => { + let testState: LocalState; + + let neutronClient: SigningNeutronClient; + let gaiaClient: SigningStargateClient; + let neutronWallet: Wallet; + let gaiaWallet: Wallet; + let gaiaWallet2: Wallet; + + let daoMember1: DaoMember; + let mainDao: Dao; + let chainManagerAddress: string; + + let rlContract: string; + + let contractManagerQuerier: ContractManagerQuery; + let bankQuerier: BankQueryClient; + let ibcQuerier: IbcQueryClient; + let neutronQuerier: NeutronQuerier; + + beforeAll(async (suite: RunnerTestSuite) => { + testState = await LocalState.create(config, inject('mnemonics'), suite); + + neutronWallet = await testState.nextWallet('neutron'); + neutronClient = await SigningNeutronClient.connectWithSigner( + testState.rpcNeutron, + neutronWallet.directwallet, + neutronWallet.address, + ); + gaiaWallet = await testState.nextWallet('cosmos'); + gaiaWallet2 = await testState.nextWallet('cosmos'); + gaiaClient = await SigningStargateClient.connectWithSigner( + testState.rpcGaia, + gaiaWallet.directwallet, + {registry: new Registry(defaultRegistryTypes)}, + ); + + let neutronRpcClient = await testState.neutronRpcClient(); + + const daoCoreAddress = await getNeutronDAOCore( + neutronClient, + neutronRpcClient, + ); // add assert for some addresses + const daoContracts = await getDaoContracts(neutronClient, daoCoreAddress); + mainDao = new Dao(neutronClient, daoContracts); + daoMember1 = new DaoMember( + mainDao, + neutronClient.client, + neutronWallet.address, + NEUTRON_DENOM, + ); + contractManagerQuerier = new ContractManagerQuery(neutronRpcClient); + bankQuerier = new BankQueryClient(neutronRpcClient); + ibcQuerier = new IbcQueryClient(neutronRpcClient); + neutronQuerier = await createNeutronClient({ + rpcEndpoint: testState.rpcNeutron, + }); + const admins = await neutronQuerier.cosmos.adminmodule.adminmodule.admins(); + chainManagerAddress = admins.admins[0]; + neutronClient.waitBlocks(20) + }); + + + + describe('No limit', () => { + test('IBC transfer without any limits', async () => { + const fee = { + gas: '200000', + amount: [{denom: NEUTRON_DENOM, amount: '1000'}], + }; + const res = await neutronClient.signAndBroadcast( + [ + { + typeUrl: NeutronMsgTransfer.typeUrl, + value: NeutronMsgTransfer.fromPartial({ + sourcePort: 'transfer', + sourceChannel: TRANSFER_CHANNEL, + token: {denom: NEUTRON_DENOM, amount: '1000'}, + sender: neutronWallet.address, + receiver: gaiaWallet.address, + timeoutHeight: { + revisionNumber: 2n, + revisionHeight: 100000000n, + }, + }), + }, + ], + fee, + ); + expect(res.code).toEqual(0); + }); + test('check IBC token balance', async () => { + await neutronClient.waitBlocks(10); + const balance = await gaiaClient.getBalance( + gaiaWallet.address, + IBC_TOKEN_DENOM, + ); + expect(balance.amount).toEqual('1000'); + }); + }); + + + describe('Contracts', () => { + test('store and instantiate RL contract', async () => { + let quota = buildChannelQuota('weekly', TRANSFER_CHANNEL, NEUTRON_DENOM, 604800, 1, 1) + rlContract = await neutronClient.create(CONTRACTS.RATE_LIMITER, { + gov_module: ADMIN_MODULE_ADDRESS, + ibc_module: ADMIN_MODULE_ADDRESS, + paths: [quota] + }); + }); + }); + + describe('prepare: bond funds', () => { + test('bond form wallet 1', async () => { + await daoMember1.bondFunds('10000'); + await neutronClient.getWithAttempts( + async () => await mainDao.queryVotingPower(daoMember1.user), + async (response) => response.power == 10000, + 20, + ); + }); + + test('IBC transfer without any limits', async () => { + const fee = { + gas: '200000', + amount: [{denom: NEUTRON_DENOM, amount: '1000'}], + }; + const res = await neutronClient.signAndBroadcast( + [ + { + typeUrl: NeutronMsgTransfer.typeUrl, + value: NeutronMsgTransfer.fromPartial({ + sourcePort: 'transfer', + sourceChannel: TRANSFER_CHANNEL, + token: {denom: NEUTRON_DENOM, amount: '1000'}, + sender: neutronWallet.address, + receiver: gaiaWallet.address, + timeoutHeight: { + revisionNumber: 2n, + revisionHeight: 100000000n, + }, + }), + }, + ], + fee, + ); + // expect(res.code).toEqual(0); + console.log(res.rawLog) + }); + + // describe('Funds transfer', () => { + // const proposalId = 1; + // test('create proposal', async () => { + // await daoMember1.submitUpdateParamsRateLimitProposal( + // chainManagerAddress, + // 'Proposal #1', + // 'Param change proposal. Setup rate limit contract', + // { + // contract_address: rlContract + // }, + // '1000', + // ); + // }); + // test('vote YES', async () => { + // await daoMember1.voteYes(proposalId); + // + // }); + // test('check if proposal is passed', async () => { + // await mainDao.checkPassedProposal(proposalId); + // }); + // test('execute passed proposal', async () => { + // await daoMember1.executeProposalWithAttempts(proposalId); + // }); + // }); + + describe('Rate limit params proposal', () => { + const proposalId = 2; + test('create proposal', async () => { + await daoMember1.submitUpdateParamsRateLimitProposal( + chainManagerAddress, + 'Proposal #1', + 'Param change proposal. Setup rate limit contract', + { + contract_address: rlContract + }, + '1000', + ); + }); + test('vote YES', async () => { + await daoMember1.voteYes(proposalId); + + }); + test('check if proposal is passed', async () => { + await mainDao.checkPassedProposal(proposalId); + }); + test('execute passed proposal', async () => { + await daoMember1.executeProposalWithAttempts(proposalId); + }); + }); + + + }); + + describe('Rate limits', () => { + describe('with limit, Neutron -> gaia', () => { + test('add limit', async () => { + // let quota = buildChannelQuota('weekly', TRANSFER_CHANNEL, NEUTRON_DENOM, 604800, 1, 1) + // await neutronClient.execute(rlContract + // , { + // add_path: quota, + // }); + }); + test('IBC transfer to limit', async () => { + const fee = { + gas: '200000', + amount: [{denom: NEUTRON_DENOM, amount: '1000'}], + }; + const res = await neutronClient.signAndBroadcast( + [ + { + typeUrl: NeutronMsgTransfer.typeUrl, + value: NeutronMsgTransfer.fromPartial({ + sourcePort: 'transfer', + sourceChannel: TRANSFER_CHANNEL, + token: {denom: NEUTRON_DENOM, amount: '10000000000000'}, + sender: neutronWallet.address, + receiver: gaiaWallet.address, + timeoutHeight: { + revisionNumber: 2n, + revisionHeight: 100000000n, + }, + }), + }, + ], + fee, + ); + expect(res.code).toEqual(0); + }); + test('Unset limit', async () => { + // let quota = buildChannelQuota('weekly', TRANSFER_CHANNEL, NEUTRON_DENOM, 604800, 1, 1) + await neutronClient.execute(rlContract, { + remove_path: { + channel_id: TRANSFER_CHANNEL, + denom: NEUTRON_DENOM + }, + }); + }); + test('IBC transfer: no more limiting', async () => { + const fee = { + gas: '200000', + amount: [{denom: NEUTRON_DENOM, amount: '1000'}], + }; + const res = await neutronClient.signAndBroadcast( + [ + { + typeUrl: NeutronMsgTransfer.typeUrl, + value: NeutronMsgTransfer.fromPartial({ + sourcePort: 'transfer', + sourceChannel: TRANSFER_CHANNEL, + token: {denom: NEUTRON_DENOM, amount: '1000'}, + sender: neutronWallet.address, + receiver: gaiaWallet.address, + timeoutHeight: { + revisionNumber: 2n, + revisionHeight: 100000000n, + }, + }), + }, + ], + fee, + ); + expect(res.code).toEqual(0); + }); + }); + describe('with limit, Gaia -> Neutron', () => { + test('add limit', async () => { + await neutronClient.waitBlocks(10); + const balance = await gaiaClient.getBalance( + gaiaWallet.address, + IBC_TOKEN_DENOM, + ); + expect(balance.amount).toEqual('1000'); + }); + test('IBC transfer to limit', async () => { + const fee = { + gas: '200000', + amount: [{denom: NEUTRON_DENOM, amount: '1000'}], + }; + const res = await neutronClient.signAndBroadcast( + [ + { + typeUrl: NeutronMsgTransfer.typeUrl, + value: NeutronMsgTransfer.fromPartial({ + sourcePort: 'transfer', + sourceChannel: TRANSFER_CHANNEL, + token: {denom: NEUTRON_DENOM, amount: '1000'}, + sender: neutronWallet.address, + receiver: gaiaWallet.address, + timeoutHeight: { + revisionNumber: 2n, + revisionHeight: 100000000n, + }, + }), + }, + ], + fee, + ); + expect(res.code).toEqual(0); + }); + test('Unset limit', async () => { + await neutronClient.waitBlocks(10); + const balance = await gaiaClient.getBalance( + gaiaWallet.address, + IBC_TOKEN_DENOM, + ); + expect(balance.amount).toEqual('1000'); + }); + }); + + }); +}); + +function buildChannelQuota( + name: string, + channel: string, + denom: string, + duration: number, + sendPercentage: number, + recvPercentage: number +): object { + return { + channel_id: channel, + denom: denom, + quotas: [ + { + name: name, + duration: duration, + send_recv: [sendPercentage, recvPercentage] + } + ] + }; +} + +function buildRestrictionMsg(denom: string, acceptedChannel: string): object { + return { + set_denom_restrictions: { + denom: denom, + allowed_channels: [acceptedChannel] + } + } +} + diff --git a/yarn.lock b/yarn.lock index 3284c3a7..22d0b5c3 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1349,23 +1349,22 @@ "@jridgewell/resolve-uri" "^3.1.0" "@jridgewell/sourcemap-codec" "^1.4.14" -"@neutron-org/cosmjs-types@0.9.2-rc1": - version "0.9.2-rc1" - 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@https://github.com/neutron-org/neutronjs.git#1e70c1f68e997857f42bab7647227c8ca9dc8aa1": version "4.2.0" resolved "https://github.com/neutron-org/neutronjs.git#1e70c1f68e997857f42bab7647227c8ca9dc8aa1" -"@neutron-org/neutronjsplus@https://github.com/neutron-org/neutronjsplus.git#1e4527ef6971f4dc2c202cb3cc2a50b0a4491f54": +"@neutron-org/neutronjs@https://github.com/neutron-org/neutronjs.git#7f45328320b53b4fa2b572bc25bb96bf80260181": + version "4.2.0" + resolved "https://github.com/neutron-org/neutronjs.git#7f45328320b53b4fa2b572bc25bb96bf80260181" + +"@neutron-org/neutronjsplus@https://github.com/neutron-org/neutronjsplus.git#a05b8bedd5ad6e33cf55da79821a1652ea6c2b22": version "0.5.0" - resolved "https://github.com/neutron-org/neutronjsplus.git#1e4527ef6971f4dc2c202cb3cc2a50b0a4491f54" + resolved "https://github.com/neutron-org/neutronjsplus.git#a05b8bedd5ad6e33cf55da79821a1652ea6c2b22" dependencies: "@cosmjs/cosmwasm-stargate" "^0.32.4" "@cosmjs/proto-signing" "^0.32.4" "@cosmjs/stargate" "0.32.4" - "@neutron-org/cosmjs-types" "0.9.2-rc1" + "@neutron-org/neutronjs" "https://github.com/neutron-org/neutronjs.git#7f45328320b53b4fa2b572bc25bb96bf80260181" axios "1.6.0" bip39 "^3.1.0" long "^5.2.1" From ad40ad9639b96b27215dba84e547bb3c4acc577a Mon Sep 17 00:00:00 2001 From: quasisamurai Date: Wed, 18 Sep 2024 21:03:25 -0300 Subject: [PATCH 07/29] fix & improve tests --- src/helpers/signing_neutron_client.ts | 22 +- src/testcases/parallel/ibc_transfer.test.ts | 11 +- src/testcases/run_in_band/rate_limit.test.ts | 350 ++++++++++--------- 3 files changed, 213 insertions(+), 170 deletions(-) diff --git a/src/helpers/signing_neutron_client.ts b/src/helpers/signing_neutron_client.ts index 40e5b7cc..a17f932d 100644 --- a/src/helpers/signing_neutron_client.ts +++ b/src/helpers/signing_neutron_client.ts @@ -102,7 +102,7 @@ export class SigningNeutronClient extends CosmWasmClient { // Upload const wasmCode = await this.getNeutronContract(fileName); const uploadResult = await this.client.upload(this.sender, wasmCode, fee); - console.log("Upload logs:", uploadResult.logs); + console.log('Upload logs:', uploadResult.logs); // Instantiate const res = await this.client.instantiate( @@ -113,16 +113,14 @@ export class SigningNeutronClient extends CosmWasmClient { fee, { admin }, ); - console.log("Instantiation events:", res.events); + console.log('Instantiation events:', res.events); return res.contractAddress; - } catch (error) { - console.error("Error during contract upload/instantiation:", error); + console.error('Error during contract upload/instantiation:', error); throw new Error(`Contract instantiation failed: ${error}`); } } - async migrate( contract: string, codeId: number, @@ -237,3 +235,17 @@ export class SigningNeutronClient extends CosmWasmClient { ); } } + +export async function CreateWalletFromMnemonic( + mnemonic: string, + prefix: string, +): Promise { + const wallet = await DirectSecp256k1HdWallet.fromMnemonic(mnemonic, { + prefix: prefix, + }); + + const accounts = await wallet.getAccounts(); + + console.log('Wallet address:', accounts[0].address); + return wallet; +} diff --git a/src/testcases/parallel/ibc_transfer.test.ts b/src/testcases/parallel/ibc_transfer.test.ts index 06f0c94f..9b743b30 100644 --- a/src/testcases/parallel/ibc_transfer.test.ts +++ b/src/testcases/parallel/ibc_transfer.test.ts @@ -567,7 +567,7 @@ describe('Neutron / IBC transfer', () => { address: ibcContract, }); - console.log(failuresResAfter) + console.log(failuresResAfter); await neutronClient.execute(ibcContract, { send: { @@ -585,8 +585,7 @@ describe('Neutron / IBC transfer', () => { address: ibcContract, }); - console.log(failuresResAfter) - + console.log(failuresResAfter); const res = await neutronClient.getWithAttempts( async () => @@ -628,7 +627,7 @@ describe('Neutron / IBC transfer', () => { const failuresResAfter = await contractManagerQuerier.failures({ address: ibcContract, }); - console.log(failuresResAfter.failures) + console.log(failuresResAfter.failures); expect(failuresResAfter.failures.length).toEqual(6); // Restore sudo handler's normal state @@ -644,7 +643,7 @@ describe('Neutron / IBC transfer', () => { address: ibcContract, }); const failure = failuresResBefore.failures[0]; - console.log(failure) + console.log(failure); const res = await neutronClient.execute(ibcContract, { resubmit_failure: { failure_id: +failure.id.toString(), @@ -658,7 +657,7 @@ describe('Neutron / IBC transfer', () => { const failuresResAfter = await contractManagerQuerier.failures({ address: ibcContract, }); - console.log(failuresResAfter.failures) + console.log(failuresResAfter.failures); expect(failuresResAfter.failures.length).toEqual(5); }); }); diff --git a/src/testcases/run_in_band/rate_limit.test.ts b/src/testcases/run_in_band/rate_limit.test.ts index 7fa70276..42b0e56c 100644 --- a/src/testcases/run_in_band/rate_limit.test.ts +++ b/src/testcases/run_in_band/rate_limit.test.ts @@ -1,46 +1,53 @@ -import {Registry} from '@cosmjs/proto-signing'; -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'; -import {MsgTransfer as NeutronMsgTransfer} from '@neutron-org/neutronjs/ibc/applications/transfer/v1/tx'; -import {defaultRegistryTypes} from '@cosmjs/stargate'; -import {QueryFailuresResponse} from '@neutron-org/neutronjs/neutron/contractmanager/query'; -import {QueryClientImpl as BankQueryClient} from '@neutron-org/neutronjs/cosmos/bank/v1beta1/query.rpc.Query'; -import {QueryClientImpl as IbcQueryClient} from '@neutron-org/neutronjs/ibc/applications/transfer/v1/query.rpc.Query'; +import { DirectSecp256k1HdWallet, Registry } from '@cosmjs/proto-signing'; +import { RunnerTestSuite, inject, expect } from 'vitest'; +import { LocalState } from '../../helpers/local_state'; +import { + SigningNeutronClient, + CreateWalletFromMnemonic, +} from '../../helpers/signing_neutron_client'; +import { MsgTransfer as GaiaMsgTransfer } from 'cosmjs-types/ibc/applications/transfer/v1/tx'; +import { MsgTransfer as NeutronMsgTransfer } from '@neutron-org/neutronjs/ibc/applications/transfer/v1/tx'; +import { defaultRegistryTypes } from '@cosmjs/stargate'; +import { QueryClientImpl as BankQueryClient } from '@neutron-org/neutronjs/cosmos/bank/v1beta1/query.rpc.Query'; +import { QueryClientImpl as IbcQueryClient } from '@neutron-org/neutronjs/ibc/applications/transfer/v1/query.rpc.Query'; import { COSMOS_DENOM, - IBC_RELAYER_NEUTRON_ADDRESS, CONTRACTS, NEUTRON_DENOM, } from '../../helpers/constants'; -import {SigningStargateClient} from '@cosmjs/stargate'; -import {waitBlocks} from '@neutron-org/neutronjsplus/dist/wait'; -import {Wallet} from '../../helpers/wallet'; -import {getIBCDenom} from '@neutron-org/neutronjsplus/dist/cosmos'; +import { SigningStargateClient } from '@cosmjs/stargate'; +import { Wallet } from '../../helpers/wallet'; import config from '../../config.json'; -import {QueryClientImpl as ContractManagerQuery} from '@neutron-org/neutronjs/neutron/contractmanager/query.rpc.Query'; -import {Dao, DaoMember, getDaoContracts, getNeutronDAOCore} from "@neutron-org/neutronjsplus/dist/dao"; -import {ADMIN_MODULE_ADDRESS} from "@neutron-org/neutronjsplus/dist/constants"; -import {createRPCQueryClient as createNeutronClient} from "@neutron-org/neutronjs/neutron/rpc.query"; -import {NeutronQuerier} from "@neutron-org/neutronjs/querier_types"; -import {QueryParamsResponse} from "@neutron-org/neutronjs/neutron/interchainqueries/query"; - +import { QueryClientImpl as ContractManagerQuery } from '@neutron-org/neutronjs/neutron/contractmanager/query.rpc.Query'; +import { + Dao, + DaoMember, + getDaoContracts, + getNeutronDAOCore, +} from '@neutron-org/neutronjsplus/dist/dao'; +import { ADMIN_MODULE_ADDRESS } from '@neutron-org/neutronjsplus/dist/constants'; +import { createRPCQueryClient as createNeutronClient } from '@neutron-org/neutronjs/neutron/rpc.query'; +import { NeutronQuerier } from '@neutron-org/neutronjs/querier_types'; const TRANSFER_CHANNEL = 'channel-0'; -const IBC_TOKEN_DENOM = - 'ibc/4E41ED8F3DCAEA15F4D6ADC6EDD7C04A676160735C9710B904B7BF53525B56D6'; const UATOM_IBC_TO_NEUTRON_DENOM = 'ibc/27394FB092D2ECCD56123C74F36E4C1F926001CEADA9CA97EA622B25F41E5EB2'; +// These are th +const DEMO_MNEMONIC_1 = + 'banner spread envelope side kite person disagree path silver will brother under couch edit food venture squirrel civil budget number acquire point work mass'; +const DEMO_MNEMONIC_2 = + 'veteran try aware erosion drink dance decade comic dawn museum release episode original list ability owner size tuition surface ceiling depth seminar capable only'; + describe('Neutron / IBC transfer', () => { let testState: LocalState; let neutronClient: SigningNeutronClient; let gaiaClient: SigningStargateClient; - let neutronWallet: Wallet; + let neutronWallet: DirectSecp256k1HdWallet; + let neutronWallet2: DirectSecp256k1HdWallet; + let neutronAddr: string; let gaiaWallet: Wallet; - let gaiaWallet2: Wallet; let daoMember1: DaoMember; let mainDao: Dao; @@ -56,21 +63,22 @@ describe('Neutron / IBC transfer', () => { beforeAll(async (suite: RunnerTestSuite) => { testState = await LocalState.create(config, inject('mnemonics'), suite); - neutronWallet = await testState.nextWallet('neutron'); + neutronWallet = await CreateWalletFromMnemonic(DEMO_MNEMONIC_1, 'neutron'); + const accounts = await neutronWallet.getAccounts(); + neutronAddr = accounts[0].address; neutronClient = await SigningNeutronClient.connectWithSigner( testState.rpcNeutron, - neutronWallet.directwallet, - neutronWallet.address, + neutronWallet, + neutronAddr, ); gaiaWallet = await testState.nextWallet('cosmos'); - gaiaWallet2 = await testState.nextWallet('cosmos'); gaiaClient = await SigningStargateClient.connectWithSigner( testState.rpcGaia, gaiaWallet.directwallet, - {registry: new Registry(defaultRegistryTypes)}, + { registry: new Registry(defaultRegistryTypes) }, ); - let neutronRpcClient = await testState.neutronRpcClient(); + const neutronRpcClient = await testState.neutronRpcClient(); const daoCoreAddress = await getNeutronDAOCore( neutronClient, @@ -81,7 +89,7 @@ describe('Neutron / IBC transfer', () => { daoMember1 = new DaoMember( mainDao, neutronClient.client, - neutronWallet.address, + accounts[0].address, NEUTRON_DENOM, ); contractManagerQuerier = new ContractManagerQuery(neutronRpcClient); @@ -92,66 +100,40 @@ describe('Neutron / IBC transfer', () => { }); const admins = await neutronQuerier.cosmos.adminmodule.adminmodule.admins(); chainManagerAddress = admins.admins[0]; - neutronClient.waitBlocks(20) + neutronClient.waitBlocks(20); }); - - - describe('No limit', () => { - test('IBC transfer without any limits', async () => { - const fee = { - gas: '200000', - amount: [{denom: NEUTRON_DENOM, amount: '1000'}], - }; - const res = await neutronClient.signAndBroadcast( - [ - { - typeUrl: NeutronMsgTransfer.typeUrl, - value: NeutronMsgTransfer.fromPartial({ - sourcePort: 'transfer', - sourceChannel: TRANSFER_CHANNEL, - token: {denom: NEUTRON_DENOM, amount: '1000'}, - sender: neutronWallet.address, - receiver: gaiaWallet.address, - timeoutHeight: { - revisionNumber: 2n, - revisionHeight: 100000000n, - }, - }), - }, - ], - fee, - ); - expect(res.code).toEqual(0); - }); - test('check IBC token balance', async () => { - await neutronClient.waitBlocks(10); - const balance = await gaiaClient.getBalance( - gaiaWallet.address, - IBC_TOKEN_DENOM, - ); - expect(balance.amount).toEqual('1000'); - }); - }); - - describe('Contracts', () => { test('store and instantiate RL contract', async () => { - let quota = buildChannelQuota('weekly', TRANSFER_CHANNEL, NEUTRON_DENOM, 604800, 1, 1) + const quota = buildChannelQuota( + 'weekly', + TRANSFER_CHANNEL, + NEUTRON_DENOM, + 604800, + 1, + 1, + ); + console.log( + JSON.stringify({ + gov_module: ADMIN_MODULE_ADDRESS, + ibc_module: ADMIN_MODULE_ADDRESS, + paths: [quota], + }), + ); rlContract = await neutronClient.create(CONTRACTS.RATE_LIMITER, { - gov_module: ADMIN_MODULE_ADDRESS, + gov_module: neutronAddr, ibc_module: ADMIN_MODULE_ADDRESS, - paths: [quota] + paths: [quota], }); }); }); - describe('prepare: bond funds', () => { + describe('prepare: test IBC transfer and set RL contract addr to neutron', () => { test('bond form wallet 1', async () => { await daoMember1.bondFunds('10000'); await neutronClient.getWithAttempts( async () => await mainDao.queryVotingPower(daoMember1.user), - async (response) => response.power == 10000, + async (response) => response.power == 11000, 20, ); }); @@ -159,7 +141,7 @@ describe('Neutron / IBC transfer', () => { test('IBC transfer without any limits', async () => { const fee = { gas: '200000', - amount: [{denom: NEUTRON_DENOM, amount: '1000'}], + amount: [{ denom: NEUTRON_DENOM, amount: '1000' }], }; const res = await neutronClient.signAndBroadcast( [ @@ -168,8 +150,8 @@ describe('Neutron / IBC transfer', () => { value: NeutronMsgTransfer.fromPartial({ sourcePort: 'transfer', sourceChannel: TRANSFER_CHANNEL, - token: {denom: NEUTRON_DENOM, amount: '1000'}, - sender: neutronWallet.address, + token: { denom: NEUTRON_DENOM, amount: '1000' }, + sender: neutronAddr, receiver: gaiaWallet.address, timeoutHeight: { revisionNumber: 2n, @@ -180,51 +162,24 @@ describe('Neutron / IBC transfer', () => { ], fee, ); - // expect(res.code).toEqual(0); - console.log(res.rawLog) + expect(res.code).toEqual(0); }); - // describe('Funds transfer', () => { - // const proposalId = 1; - // test('create proposal', async () => { - // await daoMember1.submitUpdateParamsRateLimitProposal( - // chainManagerAddress, - // 'Proposal #1', - // 'Param change proposal. Setup rate limit contract', - // { - // contract_address: rlContract - // }, - // '1000', - // ); - // }); - // test('vote YES', async () => { - // await daoMember1.voteYes(proposalId); - // - // }); - // test('check if proposal is passed', async () => { - // await mainDao.checkPassedProposal(proposalId); - // }); - // test('execute passed proposal', async () => { - // await daoMember1.executeProposalWithAttempts(proposalId); - // }); - // }); - describe('Rate limit params proposal', () => { - const proposalId = 2; + const proposalId = 1; test('create proposal', async () => { await daoMember1.submitUpdateParamsRateLimitProposal( chainManagerAddress, 'Proposal #1', 'Param change proposal. Setup rate limit contract', { - contract_address: rlContract + contract_address: rlContract, }, '1000', ); }); test('vote YES', async () => { await daoMember1.voteYes(proposalId); - }); test('check if proposal is passed', async () => { await mainDao.checkPassedProposal(proposalId); @@ -233,24 +188,28 @@ describe('Neutron / IBC transfer', () => { await daoMember1.executeProposalWithAttempts(proposalId); }); }); - - }); describe('Rate limits', () => { describe('with limit, Neutron -> gaia', () => { - test('add limit', async () => { - // let quota = buildChannelQuota('weekly', TRANSFER_CHANNEL, NEUTRON_DENOM, 604800, 1, 1) - // await neutronClient.execute(rlContract - // , { - // add_path: quota, - // }); - }); test('IBC transfer to limit', async () => { const fee = { gas: '200000', - amount: [{denom: NEUTRON_DENOM, amount: '1000'}], + amount: [{ denom: NEUTRON_DENOM, amount: '1000' }], }; + let neutronSupply = await bankQuerier.supplyOf({denom: NEUTRON_DENOM}) + + console.log("BALANCEEE") + console.log(neutronSupply.amount) + // 1% of ntrn supply - 1ntrn + const firstAmount = ((BigInt(neutronSupply.amount.amount) / BigInt(100)) - BigInt(1000000)).toString(); + + const balance = await neutronClient.getBalance( + mainDao.contracts.core.address, + NEUTRON_DENOM, + ); + console.log(balance); + // transfer 6.9(9)M from neutron wallet which almost 1%, but still not reach it const res = await neutronClient.signAndBroadcast( [ { @@ -258,8 +217,8 @@ describe('Neutron / IBC transfer', () => { value: NeutronMsgTransfer.fromPartial({ sourcePort: 'transfer', sourceChannel: TRANSFER_CHANNEL, - token: {denom: NEUTRON_DENOM, amount: '10000000000000'}, - sender: neutronWallet.address, + token: { denom: NEUTRON_DENOM, amount: firstAmount }, + sender: neutronAddr, receiver: gaiaWallet.address, timeoutHeight: { revisionNumber: 2n, @@ -271,21 +230,45 @@ describe('Neutron / IBC transfer', () => { fee, ); expect(res.code).toEqual(0); + + const res2 = await neutronClient.signAndBroadcast( + [ + { + typeUrl: NeutronMsgTransfer.typeUrl, + value: NeutronMsgTransfer.fromPartial({ + sourcePort: 'transfer', + sourceChannel: TRANSFER_CHANNEL, + token: { denom: NEUTRON_DENOM, amount: '1000001' }, // basically 1NTRN + 1 untrn + sender: neutronAddr, + receiver: gaiaWallet.address, + timeoutHeight: { + revisionNumber: 2n, + revisionHeight: 100000000n, + }, + }), + }, + ], + fee, + ); + expect(res2.code).toEqual(2); + expect(res2.rawLog).contains( + 'IBC Rate Limit exceeded for channel-0/untrn.', + ); }); test('Unset limit', async () => { - // let quota = buildChannelQuota('weekly', TRANSFER_CHANNEL, NEUTRON_DENOM, 604800, 1, 1) await neutronClient.execute(rlContract, { remove_path: { channel_id: TRANSFER_CHANNEL, - denom: NEUTRON_DENOM + denom: NEUTRON_DENOM, }, }); }); test('IBC transfer: no more limiting', async () => { const fee = { gas: '200000', - amount: [{denom: NEUTRON_DENOM, amount: '1000'}], + amount: [{ denom: NEUTRON_DENOM, amount: '1000' }], }; + // here we doing exact same tx, but it is not failing because there is no such path (limit) anymore const res = await neutronClient.signAndBroadcast( [ { @@ -293,8 +276,8 @@ describe('Neutron / IBC transfer', () => { value: NeutronMsgTransfer.fromPartial({ sourcePort: 'transfer', sourceChannel: TRANSFER_CHANNEL, - token: {denom: NEUTRON_DENOM, amount: '1000'}, - sender: neutronWallet.address, + token: { denom: NEUTRON_DENOM, amount: '100000' }, + sender: neutronAddr, receiver: gaiaWallet.address, timeoutHeight: { revisionNumber: 2n, @@ -310,28 +293,31 @@ describe('Neutron / IBC transfer', () => { }); describe('with limit, Gaia -> Neutron', () => { test('add limit', async () => { - await neutronClient.waitBlocks(10); - const balance = await gaiaClient.getBalance( - gaiaWallet.address, - IBC_TOKEN_DENOM, + const quota = buildChannelQuota( + 'weekly', + TRANSFER_CHANNEL, + UATOM_IBC_TO_NEUTRON_DENOM, + 604800, + 1, + 1, ); - expect(balance.amount).toEqual('1000'); + await neutronClient.execute(rlContract, { + add_path: quota, + }); }); + // Note: we don't unset the limit afterwards, instead we're removing rate limiting contract from params test('IBC transfer to limit', async () => { - const fee = { - gas: '200000', - amount: [{denom: NEUTRON_DENOM, amount: '1000'}], - }; - const res = await neutronClient.signAndBroadcast( + const res = await gaiaClient.signAndBroadcast( + gaiaWallet.address, [ { - typeUrl: NeutronMsgTransfer.typeUrl, - value: NeutronMsgTransfer.fromPartial({ + typeUrl: GaiaMsgTransfer.typeUrl, + value: GaiaMsgTransfer.fromPartial({ sourcePort: 'transfer', sourceChannel: TRANSFER_CHANNEL, - token: {denom: NEUTRON_DENOM, amount: '1000'}, - sender: neutronWallet.address, - receiver: gaiaWallet.address, + token: { denom: COSMOS_DENOM, amount: '1000' }, + sender: gaiaWallet.address, + receiver: neutronAddr, timeoutHeight: { revisionNumber: 2n, revisionHeight: 100000000n, @@ -339,20 +325,67 @@ describe('Neutron / IBC transfer', () => { }), }, ], - fee, + { + gas: '200000', + amount: [{ denom: COSMOS_DENOM, amount: '1000' }], + }, ); expect(res.code).toEqual(0); + expect(res.rawLog).contains( + 'IBC Rate Limit exceeded for channel-0/untrn.', + ); + }); - test('Unset limit', async () => { - await neutronClient.waitBlocks(10); - const balance = await gaiaClient.getBalance( + }); + describe('Remove RL contract from neutron', () => { + const proposalId = 2; + test('create proposal', async () => { + await daoMember1.submitUpdateParamsRateLimitProposal( + chainManagerAddress, + 'Proposal #2', + 'Param change proposal. Remove rate limit contract', + { + contract_address: '', + }, + '1000', + ); + }); + test('vote YES', async () => { + await daoMember1.voteYes(proposalId); + }); + test('check if proposal is passed', async () => { + await mainDao.checkPassedProposal(proposalId); + }); + test('execute passed proposal', async () => { + await daoMember1.executeProposalWithAttempts(proposalId); + }); + test('perform IBC send after removig of contract: should', async () => { + const res = await gaiaClient.signAndBroadcast( gaiaWallet.address, - IBC_TOKEN_DENOM, + [ + { + typeUrl: GaiaMsgTransfer.typeUrl, + value: GaiaMsgTransfer.fromPartial({ + sourcePort: 'transfer', + sourceChannel: TRANSFER_CHANNEL, + token: { denom: COSMOS_DENOM, amount: '1000000000' }, + sender: gaiaWallet.address, + receiver: neutronAddr, + timeoutHeight: { + revisionNumber: 2n, + revisionHeight: 100000000n, + }, + }), + }, + ], + { + gas: '200000', + amount: [{ denom: COSMOS_DENOM, amount: '1000' }], + }, ); - expect(balance.amount).toEqual('1000'); + expect(res.code).toEqual(0); }); }); - }); }); @@ -362,7 +395,7 @@ function buildChannelQuota( denom: string, duration: number, sendPercentage: number, - recvPercentage: number + recvPercentage: number, ): object { return { channel_id: channel, @@ -371,9 +404,9 @@ function buildChannelQuota( { name: name, duration: duration, - send_recv: [sendPercentage, recvPercentage] - } - ] + send_recv: [sendPercentage, recvPercentage], + }, + ], }; } @@ -381,8 +414,7 @@ function buildRestrictionMsg(denom: string, acceptedChannel: string): object { return { set_denom_restrictions: { denom: denom, - allowed_channels: [acceptedChannel] - } - } + allowed_channels: [acceptedChannel], + }, + }; } - From f070a06c798cd4fc65be8b7db672548ceae431d2 Mon Sep 17 00:00:00 2001 From: quasisamurai Date: Wed, 18 Sep 2024 21:11:17 -0300 Subject: [PATCH 08/29] lint --- src/testcases/run_in_band/rate_limit.test.ts | 34 +++++++------------- 1 file changed, 11 insertions(+), 23 deletions(-) diff --git a/src/testcases/run_in_band/rate_limit.test.ts b/src/testcases/run_in_band/rate_limit.test.ts index 42b0e56c..a9c763c5 100644 --- a/src/testcases/run_in_band/rate_limit.test.ts +++ b/src/testcases/run_in_band/rate_limit.test.ts @@ -9,7 +9,6 @@ import { MsgTransfer as GaiaMsgTransfer } from 'cosmjs-types/ibc/applications/tr import { MsgTransfer as NeutronMsgTransfer } from '@neutron-org/neutronjs/ibc/applications/transfer/v1/tx'; import { defaultRegistryTypes } from '@cosmjs/stargate'; import { QueryClientImpl as BankQueryClient } from '@neutron-org/neutronjs/cosmos/bank/v1beta1/query.rpc.Query'; -import { QueryClientImpl as IbcQueryClient } from '@neutron-org/neutronjs/ibc/applications/transfer/v1/query.rpc.Query'; import { COSMOS_DENOM, CONTRACTS, @@ -18,7 +17,6 @@ import { import { SigningStargateClient } from '@cosmjs/stargate'; import { Wallet } from '../../helpers/wallet'; import config from '../../config.json'; -import { QueryClientImpl as ContractManagerQuery } from '@neutron-org/neutronjs/neutron/contractmanager/query.rpc.Query'; import { Dao, DaoMember, @@ -36,8 +34,8 @@ const UATOM_IBC_TO_NEUTRON_DENOM = // These are th const DEMO_MNEMONIC_1 = 'banner spread envelope side kite person disagree path silver will brother under couch edit food venture squirrel civil budget number acquire point work mass'; -const DEMO_MNEMONIC_2 = - 'veteran try aware erosion drink dance decade comic dawn museum release episode original list ability owner size tuition surface ceiling depth seminar capable only'; +// const DEMO_MNEMONIC_2 = +// 'veteran try aware erosion drink dance decade comic dawn museum release episode original list ability owner size tuition surface ceiling depth seminar capable only'; describe('Neutron / IBC transfer', () => { let testState: LocalState; @@ -45,7 +43,6 @@ describe('Neutron / IBC transfer', () => { let neutronClient: SigningNeutronClient; let gaiaClient: SigningStargateClient; let neutronWallet: DirectSecp256k1HdWallet; - let neutronWallet2: DirectSecp256k1HdWallet; let neutronAddr: string; let gaiaWallet: Wallet; @@ -55,9 +52,7 @@ describe('Neutron / IBC transfer', () => { let rlContract: string; - let contractManagerQuerier: ContractManagerQuery; let bankQuerier: BankQueryClient; - let ibcQuerier: IbcQueryClient; let neutronQuerier: NeutronQuerier; beforeAll(async (suite: RunnerTestSuite) => { @@ -92,9 +87,7 @@ describe('Neutron / IBC transfer', () => { accounts[0].address, NEUTRON_DENOM, ); - contractManagerQuerier = new ContractManagerQuery(neutronRpcClient); bankQuerier = new BankQueryClient(neutronRpcClient); - ibcQuerier = new IbcQueryClient(neutronRpcClient); neutronQuerier = await createNeutronClient({ rpcEndpoint: testState.rpcNeutron, }); @@ -197,12 +190,17 @@ describe('Neutron / IBC transfer', () => { gas: '200000', amount: [{ denom: NEUTRON_DENOM, amount: '1000' }], }; - let neutronSupply = await bankQuerier.supplyOf({denom: NEUTRON_DENOM}) + const neutronSupply = await bankQuerier.supplyOf({ + denom: NEUTRON_DENOM, + }); - console.log("BALANCEEE") - console.log(neutronSupply.amount) + console.log('BALANCEEE'); + console.log(neutronSupply.amount); // 1% of ntrn supply - 1ntrn - const firstAmount = ((BigInt(neutronSupply.amount.amount) / BigInt(100)) - BigInt(1000000)).toString(); + const firstAmount = ( + BigInt(neutronSupply.amount.amount) / BigInt(100) - + BigInt(1000000) + ).toString(); const balance = await neutronClient.getBalance( mainDao.contracts.core.address, @@ -334,7 +332,6 @@ describe('Neutron / IBC transfer', () => { expect(res.rawLog).contains( 'IBC Rate Limit exceeded for channel-0/untrn.', ); - }); }); describe('Remove RL contract from neutron', () => { @@ -409,12 +406,3 @@ function buildChannelQuota( ], }; } - -function buildRestrictionMsg(denom: string, acceptedChannel: string): object { - return { - set_denom_restrictions: { - denom: denom, - allowed_channels: [acceptedChannel], - }, - }; -} From 5e516f89b83178cecb9520f7f8943a43706d4066 Mon Sep 17 00:00:00 2001 From: quasisamurai Date: Thu, 19 Sep 2024 10:00:12 -0300 Subject: [PATCH 09/29] improve tests --- src/testcases/run_in_band/rate_limit.test.ts | 103 +++++++++++++------ 1 file changed, 71 insertions(+), 32 deletions(-) diff --git a/src/testcases/run_in_band/rate_limit.test.ts b/src/testcases/run_in_band/rate_limit.test.ts index a9c763c5..7dc66538 100644 --- a/src/testcases/run_in_band/rate_limit.test.ts +++ b/src/testcases/run_in_band/rate_limit.test.ts @@ -15,7 +15,6 @@ import { NEUTRON_DENOM, } from '../../helpers/constants'; import { SigningStargateClient } from '@cosmjs/stargate'; -import { Wallet } from '../../helpers/wallet'; import config from '../../config.json'; import { Dao, @@ -26,6 +25,7 @@ import { import { ADMIN_MODULE_ADDRESS } from '@neutron-org/neutronjsplus/dist/constants'; import { createRPCQueryClient as createNeutronClient } from '@neutron-org/neutronjs/neutron/rpc.query'; import { NeutronQuerier } from '@neutron-org/neutronjs/querier_types'; +import { QueryClientImpl as IbcQueryClient } from '@neutron-org/neutronjs/ibc/applications/transfer/v1/query.rpc.Query'; const TRANSFER_CHANNEL = 'channel-0'; const UATOM_IBC_TO_NEUTRON_DENOM = @@ -34,8 +34,8 @@ const UATOM_IBC_TO_NEUTRON_DENOM = // These are th const DEMO_MNEMONIC_1 = 'banner spread envelope side kite person disagree path silver will brother under couch edit food venture squirrel civil budget number acquire point work mass'; -// const DEMO_MNEMONIC_2 = -// 'veteran try aware erosion drink dance decade comic dawn museum release episode original list ability owner size tuition surface ceiling depth seminar capable only'; +const DEMO_MNEMONIC_2 = + 'veteran try aware erosion drink dance decade comic dawn museum release episode original list ability owner size tuition surface ceiling depth seminar capable only'; describe('Neutron / IBC transfer', () => { let testState: LocalState; @@ -44,7 +44,8 @@ describe('Neutron / IBC transfer', () => { let gaiaClient: SigningStargateClient; let neutronWallet: DirectSecp256k1HdWallet; let neutronAddr: string; - let gaiaWallet: Wallet; + let gaiaWallet: DirectSecp256k1HdWallet; + let gaiaAddr: string; let daoMember1: DaoMember; let mainDao: Dao; @@ -54,22 +55,25 @@ describe('Neutron / IBC transfer', () => { let bankQuerier: BankQueryClient; let neutronQuerier: NeutronQuerier; + let ibcQuerier: IbcQueryClient; beforeAll(async (suite: RunnerTestSuite) => { testState = await LocalState.create(config, inject('mnemonics'), suite); neutronWallet = await CreateWalletFromMnemonic(DEMO_MNEMONIC_1, 'neutron'); - const accounts = await neutronWallet.getAccounts(); - neutronAddr = accounts[0].address; + const accountsNeutron = await neutronWallet.getAccounts(); + neutronAddr = accountsNeutron[0].address; neutronClient = await SigningNeutronClient.connectWithSigner( testState.rpcNeutron, neutronWallet, neutronAddr, ); - gaiaWallet = await testState.nextWallet('cosmos'); + gaiaWallet = await CreateWalletFromMnemonic(DEMO_MNEMONIC_2, 'cosmos'); + const accountsGaia = await gaiaWallet.getAccounts(); + gaiaAddr = accountsGaia[0].address; gaiaClient = await SigningStargateClient.connectWithSigner( testState.rpcGaia, - gaiaWallet.directwallet, + gaiaWallet, { registry: new Registry(defaultRegistryTypes) }, ); @@ -84,7 +88,7 @@ describe('Neutron / IBC transfer', () => { daoMember1 = new DaoMember( mainDao, neutronClient.client, - accounts[0].address, + accountsNeutron[0].address, NEUTRON_DENOM, ); bankQuerier = new BankQueryClient(neutronRpcClient); @@ -93,6 +97,7 @@ describe('Neutron / IBC transfer', () => { }); const admins = await neutronQuerier.cosmos.adminmodule.adminmodule.admins(); chainManagerAddress = admins.admins[0]; + ibcQuerier = new IbcQueryClient(neutronRpcClient); neutronClient.waitBlocks(20); }); @@ -145,7 +150,7 @@ describe('Neutron / IBC transfer', () => { sourceChannel: TRANSFER_CHANNEL, token: { denom: NEUTRON_DENOM, amount: '1000' }, sender: neutronAddr, - receiver: gaiaWallet.address, + receiver: gaiaAddr, timeoutHeight: { revisionNumber: 2n, revisionHeight: 100000000n, @@ -194,7 +199,6 @@ describe('Neutron / IBC transfer', () => { denom: NEUTRON_DENOM, }); - console.log('BALANCEEE'); console.log(neutronSupply.amount); // 1% of ntrn supply - 1ntrn const firstAmount = ( @@ -217,7 +221,7 @@ describe('Neutron / IBC transfer', () => { sourceChannel: TRANSFER_CHANNEL, token: { denom: NEUTRON_DENOM, amount: firstAmount }, sender: neutronAddr, - receiver: gaiaWallet.address, + receiver: gaiaAddr, timeoutHeight: { revisionNumber: 2n, revisionHeight: 100000000n, @@ -238,7 +242,7 @@ describe('Neutron / IBC transfer', () => { sourceChannel: TRANSFER_CHANNEL, token: { denom: NEUTRON_DENOM, amount: '1000001' }, // basically 1NTRN + 1 untrn sender: neutronAddr, - receiver: gaiaWallet.address, + receiver: gaiaAddr, timeoutHeight: { revisionNumber: 2n, revisionHeight: 100000000n, @@ -276,7 +280,7 @@ describe('Neutron / IBC transfer', () => { sourceChannel: TRANSFER_CHANNEL, token: { denom: NEUTRON_DENOM, amount: '100000' }, sender: neutronAddr, - receiver: gaiaWallet.address, + receiver: gaiaAddr, timeoutHeight: { revisionNumber: 2n, revisionHeight: 100000000n, @@ -290,6 +294,37 @@ describe('Neutron / IBC transfer', () => { }); }); describe('with limit, Gaia -> Neutron', () => { + test('check that weird IBC denom is uatom indeed', async () => { + const resBefroreLimit = await gaiaClient.signAndBroadcast( + gaiaAddr, + [ + { + typeUrl: GaiaMsgTransfer.typeUrl, + value: GaiaMsgTransfer.fromPartial({ + sourcePort: 'transfer', + sourceChannel: TRANSFER_CHANNEL, + token: { denom: COSMOS_DENOM, amount: '1000000' }, + sender: gaiaAddr, + receiver: neutronAddr, + timeoutHeight: { + revisionNumber: 2n, + revisionHeight: 100000000n, + }, + }), + }, + ], + { + gas: '200000', + amount: [{ denom: COSMOS_DENOM, amount: '1000' }], + }, + ); + expect(resBefroreLimit.code).toEqual(0); + const res = await ibcQuerier.denomTrace({ + hash: '27394FB092D2ECCD56123C74F36E4C1F926001CEADA9CA97EA622B25F41E5EB2', + }); + expect(res.denomTrace.baseDenom).toEqual(COSMOS_DENOM); + }); + test('add limit', async () => { const quota = buildChannelQuota( 'weekly', @@ -303,19 +338,24 @@ describe('Neutron / IBC transfer', () => { add_path: quota, }); }); + // Note: we don't unset the limit afterwards, instead we're removing rate limiting contract from params test('IBC transfer to limit', async () => { - const res = await gaiaClient.signAndBroadcast( - gaiaWallet.address, + const uatomibcSupply = await bankQuerier.supplyOf({ + denom: UATOM_IBC_TO_NEUTRON_DENOM, + }); + + console.log(uatomibcSupply.amount); + const res = await neutronClient.signAndBroadcast( [ { - typeUrl: GaiaMsgTransfer.typeUrl, - value: GaiaMsgTransfer.fromPartial({ + typeUrl: NeutronMsgTransfer.typeUrl, + value: NeutronMsgTransfer.fromPartial({ sourcePort: 'transfer', sourceChannel: TRANSFER_CHANNEL, - token: { denom: COSMOS_DENOM, amount: '1000' }, - sender: gaiaWallet.address, - receiver: neutronAddr, + token: { denom: UATOM_IBC_TO_NEUTRON_DENOM, amount: '100000' }, + sender: neutronAddr, + receiver: gaiaAddr, timeoutHeight: { revisionNumber: 2n, revisionHeight: 100000000n, @@ -325,10 +365,10 @@ describe('Neutron / IBC transfer', () => { ], { gas: '200000', - amount: [{ denom: COSMOS_DENOM, amount: '1000' }], + amount: [{ denom: NEUTRON_DENOM, amount: '1000' }], }, ); - expect(res.code).toEqual(0); + expect(res.code).toEqual(2); expect(res.rawLog).contains( 'IBC Rate Limit exceeded for channel-0/untrn.', ); @@ -356,18 +396,17 @@ describe('Neutron / IBC transfer', () => { test('execute passed proposal', async () => { await daoMember1.executeProposalWithAttempts(proposalId); }); - test('perform IBC send after removig of contract: should', async () => { - const res = await gaiaClient.signAndBroadcast( - gaiaWallet.address, + test('perform IBC send after removig of contract: should be fine', async () => { + const res = await neutronClient.signAndBroadcast( [ { - typeUrl: GaiaMsgTransfer.typeUrl, - value: GaiaMsgTransfer.fromPartial({ + typeUrl: NeutronMsgTransfer.typeUrl, + value: NeutronMsgTransfer.fromPartial({ sourcePort: 'transfer', sourceChannel: TRANSFER_CHANNEL, - token: { denom: COSMOS_DENOM, amount: '1000000000' }, - sender: gaiaWallet.address, - receiver: neutronAddr, + token: { denom: UATOM_IBC_TO_NEUTRON_DENOM, amount: '100000' }, + sender: neutronAddr, + receiver: gaiaAddr, timeoutHeight: { revisionNumber: 2n, revisionHeight: 100000000n, @@ -377,7 +416,7 @@ describe('Neutron / IBC transfer', () => { ], { gas: '200000', - amount: [{ denom: COSMOS_DENOM, amount: '1000' }], + amount: [{ denom: NEUTRON_DENOM, amount: '1000' }], }, ); expect(res.code).toEqual(0); From f1147a4dae6157112ee2cf5b4b59bceb1c761f6d Mon Sep 17 00:00:00 2001 From: quasisamurai Date: Thu, 19 Sep 2024 10:29:37 -0300 Subject: [PATCH 10/29] rm debug traces --- src/helpers/signing_neutron_client.ts | 35 +++++++++++---------------- 1 file changed, 14 insertions(+), 21 deletions(-) diff --git a/src/helpers/signing_neutron_client.ts b/src/helpers/signing_neutron_client.ts index a17f932d..cb045e24 100644 --- a/src/helpers/signing_neutron_client.ts +++ b/src/helpers/signing_neutron_client.ts @@ -98,27 +98,20 @@ export class SigningNeutronClient extends CosmWasmClient { fee: StdFee | 'auto' | number = 'auto', admin: string = this.sender, ): Promise { - try { - // Upload - const wasmCode = await this.getNeutronContract(fileName); - const uploadResult = await this.client.upload(this.sender, wasmCode, fee); - console.log('Upload logs:', uploadResult.logs); - - // Instantiate - const res = await this.client.instantiate( - this.sender, - uploadResult.codeId, - msg, - label, - fee, - { admin }, - ); - console.log('Instantiation events:', res.events); - return res.contractAddress; - } catch (error) { - console.error('Error during contract upload/instantiation:', error); - throw new Error(`Contract instantiation failed: ${error}`); - } + // upload + const wasmCode = await this.getNeutronContract(fileName); + const uploadResult = await this.client.upload(this.sender, wasmCode, fee); + + // instantiate + const res = await this.client.instantiate( + this.sender, + uploadResult.codeId, + msg, + label, + fee, + { admin }, + ); + return res.contractAddress; } async migrate( From 7a53a729178a3d4bed7c957e37325a327d0ed3f0 Mon Sep 17 00:00:00 2001 From: quasisamurai Date: Thu, 19 Sep 2024 10:32:56 -0300 Subject: [PATCH 11/29] rm ibc transfer debug prints as well --- src/testcases/parallel/ibc_transfer.test.ts | 22 +++------------------ 1 file changed, 3 insertions(+), 19 deletions(-) diff --git a/src/testcases/parallel/ibc_transfer.test.ts b/src/testcases/parallel/ibc_transfer.test.ts index 9b743b30..6f41728f 100644 --- a/src/testcases/parallel/ibc_transfer.test.ts +++ b/src/testcases/parallel/ibc_transfer.test.ts @@ -483,7 +483,7 @@ describe('Neutron / IBC transfer', () => { hermes checks height on remote chain and Timeout error occurs. */ const currentHeight = await gaiaClient.getHeight(); - await waitBlocks(25, gaiaClient); + await waitBlocks(15, gaiaClient); await neutronClient.execute(ibcContract, { send: { @@ -562,12 +562,6 @@ describe('Neutron / IBC transfer', () => { state: 'enabled_infinite_loop', }, }); - // check that failures count is the same - let failuresResAfter = await contractManagerQuerier.failures({ - address: ibcContract, - }); - - console.log(failuresResAfter); await neutronClient.execute(ibcContract, { send: { @@ -578,14 +572,7 @@ describe('Neutron / IBC transfer', () => { }, }); - await neutronClient.waitBlocks(35); - - // check that failures count is the same - failuresResAfter = await contractManagerQuerier.failures({ - address: ibcContract, - }); - - console.log(failuresResAfter); + await neutronClient.waitBlocks(5); const res = await neutronClient.getWithAttempts( async () => @@ -627,7 +614,6 @@ describe('Neutron / IBC transfer', () => { const failuresResAfter = await contractManagerQuerier.failures({ address: ibcContract, }); - console.log(failuresResAfter.failures); expect(failuresResAfter.failures.length).toEqual(6); // Restore sudo handler's normal state @@ -643,7 +629,6 @@ describe('Neutron / IBC transfer', () => { address: ibcContract, }); const failure = failuresResBefore.failures[0]; - console.log(failure); const res = await neutronClient.execute(ibcContract, { resubmit_failure: { failure_id: +failure.id.toString(), @@ -651,13 +636,12 @@ describe('Neutron / IBC transfer', () => { }); expect(res.code).toBe(0); - await neutronClient.waitBlocks(10); + await neutronClient.waitBlocks(5); // check that failures count is changed const failuresResAfter = await contractManagerQuerier.failures({ address: ibcContract, }); - console.log(failuresResAfter.failures); expect(failuresResAfter.failures.length).toEqual(5); }); }); From bee8ea82c910cc9c5b972d4322c01f472f7aa097 Mon Sep 17 00:00:00 2001 From: quasisamurai Date: Thu, 19 Sep 2024 11:27:49 -0300 Subject: [PATCH 12/29] use built-in wallet from mnemonic func --- src/helpers/signing_neutron_client.ts | 14 ---- src/testcases/run_in_band/rate_limit.test.ts | 68 +++++++++----------- 2 files changed, 29 insertions(+), 53 deletions(-) diff --git a/src/helpers/signing_neutron_client.ts b/src/helpers/signing_neutron_client.ts index cb045e24..231c5541 100644 --- a/src/helpers/signing_neutron_client.ts +++ b/src/helpers/signing_neutron_client.ts @@ -228,17 +228,3 @@ export class SigningNeutronClient extends CosmWasmClient { ); } } - -export async function CreateWalletFromMnemonic( - mnemonic: string, - prefix: string, -): Promise { - const wallet = await DirectSecp256k1HdWallet.fromMnemonic(mnemonic, { - prefix: prefix, - }); - - const accounts = await wallet.getAccounts(); - - console.log('Wallet address:', accounts[0].address); - return wallet; -} diff --git a/src/testcases/run_in_band/rate_limit.test.ts b/src/testcases/run_in_band/rate_limit.test.ts index 7dc66538..8082aaae 100644 --- a/src/testcases/run_in_band/rate_limit.test.ts +++ b/src/testcases/run_in_band/rate_limit.test.ts @@ -1,10 +1,7 @@ -import { DirectSecp256k1HdWallet, Registry } from '@cosmjs/proto-signing'; +import { Registry } from '@cosmjs/proto-signing'; import { RunnerTestSuite, inject, expect } from 'vitest'; -import { LocalState } from '../../helpers/local_state'; -import { - SigningNeutronClient, - CreateWalletFromMnemonic, -} from '../../helpers/signing_neutron_client'; +import { LocalState, mnemonicToWallet } from '../../helpers/local_state'; +import { SigningNeutronClient } from '../../helpers/signing_neutron_client'; import { MsgTransfer as GaiaMsgTransfer } from 'cosmjs-types/ibc/applications/transfer/v1/tx'; import { MsgTransfer as NeutronMsgTransfer } from '@neutron-org/neutronjs/ibc/applications/transfer/v1/tx'; import { defaultRegistryTypes } from '@cosmjs/stargate'; @@ -26,6 +23,7 @@ import { ADMIN_MODULE_ADDRESS } from '@neutron-org/neutronjsplus/dist/constants' import { createRPCQueryClient as createNeutronClient } from '@neutron-org/neutronjs/neutron/rpc.query'; import { NeutronQuerier } from '@neutron-org/neutronjs/querier_types'; import { QueryClientImpl as IbcQueryClient } from '@neutron-org/neutronjs/ibc/applications/transfer/v1/query.rpc.Query'; +import { Wallet } from '../../helpers/wallet'; const TRANSFER_CHANNEL = 'channel-0'; const UATOM_IBC_TO_NEUTRON_DENOM = @@ -42,10 +40,8 @@ describe('Neutron / IBC transfer', () => { let neutronClient: SigningNeutronClient; let gaiaClient: SigningStargateClient; - let neutronWallet: DirectSecp256k1HdWallet; - let neutronAddr: string; - let gaiaWallet: DirectSecp256k1HdWallet; - let gaiaAddr: string; + let neutronWallet: Wallet; + let gaiaWallet: Wallet; let daoMember1: DaoMember; let mainDao: Dao; @@ -60,20 +56,16 @@ describe('Neutron / IBC transfer', () => { beforeAll(async (suite: RunnerTestSuite) => { testState = await LocalState.create(config, inject('mnemonics'), suite); - neutronWallet = await CreateWalletFromMnemonic(DEMO_MNEMONIC_1, 'neutron'); - const accountsNeutron = await neutronWallet.getAccounts(); - neutronAddr = accountsNeutron[0].address; + neutronWallet = await mnemonicToWallet(DEMO_MNEMONIC_1, 'neutron'); neutronClient = await SigningNeutronClient.connectWithSigner( testState.rpcNeutron, - neutronWallet, - neutronAddr, + neutronWallet.directwallet, + neutronWallet.address, ); - gaiaWallet = await CreateWalletFromMnemonic(DEMO_MNEMONIC_2, 'cosmos'); - const accountsGaia = await gaiaWallet.getAccounts(); - gaiaAddr = accountsGaia[0].address; + gaiaWallet = await mnemonicToWallet(DEMO_MNEMONIC_2, 'cosmos'); gaiaClient = await SigningStargateClient.connectWithSigner( testState.rpcGaia, - gaiaWallet, + gaiaWallet.directwallet, { registry: new Registry(defaultRegistryTypes) }, ); @@ -88,7 +80,7 @@ describe('Neutron / IBC transfer', () => { daoMember1 = new DaoMember( mainDao, neutronClient.client, - accountsNeutron[0].address, + neutronWallet.address, NEUTRON_DENOM, ); bankQuerier = new BankQueryClient(neutronRpcClient); @@ -119,7 +111,7 @@ describe('Neutron / IBC transfer', () => { }), ); rlContract = await neutronClient.create(CONTRACTS.RATE_LIMITER, { - gov_module: neutronAddr, + gov_module: neutronWallet.address, ibc_module: ADMIN_MODULE_ADDRESS, paths: [quota], }); @@ -149,8 +141,8 @@ describe('Neutron / IBC transfer', () => { sourcePort: 'transfer', sourceChannel: TRANSFER_CHANNEL, token: { denom: NEUTRON_DENOM, amount: '1000' }, - sender: neutronAddr, - receiver: gaiaAddr, + sender: neutronWallet.address, + receiver: gaiaWallet.address, timeoutHeight: { revisionNumber: 2n, revisionHeight: 100000000n, @@ -220,8 +212,8 @@ describe('Neutron / IBC transfer', () => { sourcePort: 'transfer', sourceChannel: TRANSFER_CHANNEL, token: { denom: NEUTRON_DENOM, amount: firstAmount }, - sender: neutronAddr, - receiver: gaiaAddr, + sender: neutronWallet.address, + receiver: gaiaWallet.address, timeoutHeight: { revisionNumber: 2n, revisionHeight: 100000000n, @@ -241,8 +233,8 @@ describe('Neutron / IBC transfer', () => { sourcePort: 'transfer', sourceChannel: TRANSFER_CHANNEL, token: { denom: NEUTRON_DENOM, amount: '1000001' }, // basically 1NTRN + 1 untrn - sender: neutronAddr, - receiver: gaiaAddr, + sender: neutronWallet.address, + receiver: gaiaWallet.address, timeoutHeight: { revisionNumber: 2n, revisionHeight: 100000000n, @@ -279,8 +271,8 @@ describe('Neutron / IBC transfer', () => { sourcePort: 'transfer', sourceChannel: TRANSFER_CHANNEL, token: { denom: NEUTRON_DENOM, amount: '100000' }, - sender: neutronAddr, - receiver: gaiaAddr, + sender: neutronWallet.address, + receiver: gaiaWallet.address, timeoutHeight: { revisionNumber: 2n, revisionHeight: 100000000n, @@ -296,7 +288,7 @@ describe('Neutron / IBC transfer', () => { describe('with limit, Gaia -> Neutron', () => { test('check that weird IBC denom is uatom indeed', async () => { const resBefroreLimit = await gaiaClient.signAndBroadcast( - gaiaAddr, + gaiaWallet.address, [ { typeUrl: GaiaMsgTransfer.typeUrl, @@ -304,8 +296,8 @@ describe('Neutron / IBC transfer', () => { sourcePort: 'transfer', sourceChannel: TRANSFER_CHANNEL, token: { denom: COSMOS_DENOM, amount: '1000000' }, - sender: gaiaAddr, - receiver: neutronAddr, + sender: gaiaWallet.address, + receiver: neutronWallet.address, timeoutHeight: { revisionNumber: 2n, revisionHeight: 100000000n, @@ -354,8 +346,8 @@ describe('Neutron / IBC transfer', () => { sourcePort: 'transfer', sourceChannel: TRANSFER_CHANNEL, token: { denom: UATOM_IBC_TO_NEUTRON_DENOM, amount: '100000' }, - sender: neutronAddr, - receiver: gaiaAddr, + sender: neutronWallet.address, + receiver: gaiaWallet.address, timeoutHeight: { revisionNumber: 2n, revisionHeight: 100000000n, @@ -369,9 +361,7 @@ describe('Neutron / IBC transfer', () => { }, ); expect(res.code).toEqual(2); - expect(res.rawLog).contains( - 'IBC Rate Limit exceeded for channel-0/untrn.', - ); + expect(res.rawLog).contains('IBC Rate Limit exceeded'); }); }); describe('Remove RL contract from neutron', () => { @@ -405,8 +395,8 @@ describe('Neutron / IBC transfer', () => { sourcePort: 'transfer', sourceChannel: TRANSFER_CHANNEL, token: { denom: UATOM_IBC_TO_NEUTRON_DENOM, amount: '100000' }, - sender: neutronAddr, - receiver: gaiaAddr, + sender: neutronWallet.address, + receiver: gaiaWallet.address, timeoutHeight: { revisionNumber: 2n, revisionHeight: 100000000n, From 2ebf08f7d5dd0a5afe1b10997f994290142dc866 Mon Sep 17 00:00:00 2001 From: quasisamurai Date: Fri, 20 Sep 2024 06:49:01 -0300 Subject: [PATCH 13/29] rm consolelogs --- src/testcases/run_in_band/rate_limit.test.ts | 24 ++++++-------------- 1 file changed, 7 insertions(+), 17 deletions(-) diff --git a/src/testcases/run_in_band/rate_limit.test.ts b/src/testcases/run_in_band/rate_limit.test.ts index 8082aaae..ac2d4a38 100644 --- a/src/testcases/run_in_band/rate_limit.test.ts +++ b/src/testcases/run_in_band/rate_limit.test.ts @@ -103,13 +103,6 @@ describe('Neutron / IBC transfer', () => { 1, 1, ); - console.log( - JSON.stringify({ - gov_module: ADMIN_MODULE_ADDRESS, - ibc_module: ADMIN_MODULE_ADDRESS, - paths: [quota], - }), - ); rlContract = await neutronClient.create(CONTRACTS.RATE_LIMITER, { gov_module: neutronWallet.address, ibc_module: ADMIN_MODULE_ADDRESS, @@ -190,19 +183,12 @@ describe('Neutron / IBC transfer', () => { const neutronSupply = await bankQuerier.supplyOf({ denom: NEUTRON_DENOM, }); - - console.log(neutronSupply.amount); // 1% of ntrn supply - 1ntrn const firstAmount = ( BigInt(neutronSupply.amount.amount) / BigInt(100) - BigInt(1000000) ).toString(); - const balance = await neutronClient.getBalance( - mainDao.contracts.core.address, - NEUTRON_DENOM, - ); - console.log(balance); // transfer 6.9(9)M from neutron wallet which almost 1%, but still not reach it const res = await neutronClient.signAndBroadcast( [ @@ -337,7 +323,11 @@ describe('Neutron / IBC transfer', () => { denom: UATOM_IBC_TO_NEUTRON_DENOM, }); - console.log(uatomibcSupply.amount); + const amount = ( + BigInt(uatomibcSupply.amount.amount) / BigInt(100) + + BigInt(1) + ).toString(); + const res = await neutronClient.signAndBroadcast( [ { @@ -345,7 +335,7 @@ describe('Neutron / IBC transfer', () => { value: NeutronMsgTransfer.fromPartial({ sourcePort: 'transfer', sourceChannel: TRANSFER_CHANNEL, - token: { denom: UATOM_IBC_TO_NEUTRON_DENOM, amount: '100000' }, + token: { denom: UATOM_IBC_TO_NEUTRON_DENOM, amount: amount }, sender: neutronWallet.address, receiver: gaiaWallet.address, timeoutHeight: { @@ -394,7 +384,7 @@ describe('Neutron / IBC transfer', () => { value: NeutronMsgTransfer.fromPartial({ sourcePort: 'transfer', sourceChannel: TRANSFER_CHANNEL, - token: { denom: UATOM_IBC_TO_NEUTRON_DENOM, amount: '100000' }, + token: { denom: UATOM_IBC_TO_NEUTRON_DENOM, amount: '10' }, sender: neutronWallet.address, receiver: gaiaWallet.address, timeoutHeight: { From adaf55a0fcc41876e00c1e1b6df4d17be101de1d Mon Sep 17 00:00:00 2001 From: quasisamurai Date: Tue, 24 Sep 2024 10:13:42 -0300 Subject: [PATCH 14/29] split one test in 2 for explicity, extend comments and describes --- src/testcases/run_in_band/rate_limit.test.ts | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/src/testcases/run_in_band/rate_limit.test.ts b/src/testcases/run_in_band/rate_limit.test.ts index ac2d4a38..bde9120c 100644 --- a/src/testcases/run_in_band/rate_limit.test.ts +++ b/src/testcases/run_in_band/rate_limit.test.ts @@ -175,7 +175,7 @@ describe('Neutron / IBC transfer', () => { describe('Rate limits', () => { describe('with limit, Neutron -> gaia', () => { - test('IBC transfer to limit', async () => { + test('IBC transfer to limit in 2 steps: 1tx almost hits the limit (w/o failing), 2 tx exceeds the limit by 1 untrn', async () => { const fee = { gas: '200000', amount: [{ denom: NEUTRON_DENOM, amount: '1000' }], @@ -272,7 +272,7 @@ describe('Neutron / IBC transfer', () => { }); }); describe('with limit, Gaia -> Neutron', () => { - test('check that weird IBC denom is uatom indeed', async () => { + test('send some atoms to neutron chain', async () => { const resBefroreLimit = await gaiaClient.signAndBroadcast( gaiaWallet.address, [ @@ -297,6 +297,9 @@ describe('Neutron / IBC transfer', () => { }, ); expect(resBefroreLimit.code).toEqual(0); + }); + + test('check that weird IBC denom is uatom indeed', async () => { const res = await ibcQuerier.denomTrace({ hash: '27394FB092D2ECCD56123C74F36E4C1F926001CEADA9CA97EA622B25F41E5EB2', }); @@ -317,8 +320,7 @@ describe('Neutron / IBC transfer', () => { }); }); - // Note: we don't unset the limit afterwards, instead we're removing rate limiting contract from params - test('IBC transfer to limit', async () => { + test('IBC transfer to limit (hits the limit)', async () => { const uatomibcSupply = await bankQuerier.supplyOf({ denom: UATOM_IBC_TO_NEUTRON_DENOM, }); @@ -376,6 +378,8 @@ describe('Neutron / IBC transfer', () => { test('execute passed proposal', async () => { await daoMember1.executeProposalWithAttempts(proposalId); }); + // Note: we haven't unset the limit afterwards, instead we've removed rate limiting contract from params + // and here we just tests if ibc send works test('perform IBC send after removig of contract: should be fine', async () => { const res = await neutronClient.signAndBroadcast( [ From 08f6d33ef8c008b6a6413e960d8ea6bb323296b7 Mon Sep 17 00:00:00 2001 From: quasisamurai Date: Tue, 24 Sep 2024 10:23:40 -0300 Subject: [PATCH 15/29] add more comments --- src/testcases/run_in_band/rate_limit.test.ts | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/testcases/run_in_band/rate_limit.test.ts b/src/testcases/run_in_band/rate_limit.test.ts index bde9120c..0c96ef38 100644 --- a/src/testcases/run_in_band/rate_limit.test.ts +++ b/src/testcases/run_in_band/rate_limit.test.ts @@ -356,6 +356,10 @@ describe('Neutron / IBC transfer', () => { expect(res.rawLog).contains('IBC Rate Limit exceeded'); }); }); + + + // Note: we haven't unset the limit afterwards, instead we've removed rate limiting contract from params. + // ibc send afterwards should work because rate-limiting MW action is completely removed from the ibc stack describe('Remove RL contract from neutron', () => { const proposalId = 2; test('create proposal', async () => { @@ -378,7 +382,6 @@ describe('Neutron / IBC transfer', () => { test('execute passed proposal', async () => { await daoMember1.executeProposalWithAttempts(proposalId); }); - // Note: we haven't unset the limit afterwards, instead we've removed rate limiting contract from params // and here we just tests if ibc send works test('perform IBC send after removig of contract: should be fine', async () => { const res = await neutronClient.signAndBroadcast( From 05dadb41d88edcd2728938fc58e6e77a804896c1 Mon Sep 17 00:00:00 2001 From: quasisamurai Date: Tue, 24 Sep 2024 10:56:02 -0300 Subject: [PATCH 16/29] lint --- src/testcases/run_in_band/rate_limit.test.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/src/testcases/run_in_band/rate_limit.test.ts b/src/testcases/run_in_band/rate_limit.test.ts index 0c96ef38..ad95b144 100644 --- a/src/testcases/run_in_band/rate_limit.test.ts +++ b/src/testcases/run_in_band/rate_limit.test.ts @@ -357,7 +357,6 @@ describe('Neutron / IBC transfer', () => { }); }); - // Note: we haven't unset the limit afterwards, instead we've removed rate limiting contract from params. // ibc send afterwards should work because rate-limiting MW action is completely removed from the ibc stack describe('Remove RL contract from neutron', () => { From f777034ad4f289884742c49462416398c43c94fd Mon Sep 17 00:00:00 2001 From: quasisamurai Date: Thu, 26 Sep 2024 12:24:25 -0300 Subject: [PATCH 17/29] cover more scenarios --- src/testcases/run_in_band/rate_limit.test.ts | 80 +++++++++++++++++++- 1 file changed, 79 insertions(+), 1 deletion(-) diff --git a/src/testcases/run_in_band/rate_limit.test.ts b/src/testcases/run_in_band/rate_limit.test.ts index ad95b144..2b327051 100644 --- a/src/testcases/run_in_band/rate_limit.test.ts +++ b/src/testcases/run_in_band/rate_limit.test.ts @@ -39,8 +39,10 @@ describe('Neutron / IBC transfer', () => { let testState: LocalState; let neutronClient: SigningNeutronClient; + let neutronClient2: SigningNeutronClient; let gaiaClient: SigningStargateClient; let neutronWallet: Wallet; + let neutronWallet2: Wallet; let gaiaWallet: Wallet; let daoMember1: DaoMember; @@ -48,6 +50,7 @@ describe('Neutron / IBC transfer', () => { let chainManagerAddress: string; let rlContract: string; + let ibcContract: string; let bankQuerier: BankQueryClient; let neutronQuerier: NeutronQuerier; @@ -62,6 +65,12 @@ describe('Neutron / IBC transfer', () => { neutronWallet.directwallet, neutronWallet.address, ); + neutronWallet2 = await testState.nextWallet('neutron'); + neutronClient2 = await SigningNeutronClient.connectWithSigner( + testState.rpcNeutron, + neutronWallet2.directwallet, + neutronWallet2.address, + ); gaiaWallet = await mnemonicToWallet(DEMO_MNEMONIC_2, 'cosmos'); gaiaClient = await SigningStargateClient.connectWithSigner( testState.rpcGaia, @@ -109,6 +118,9 @@ describe('Neutron / IBC transfer', () => { paths: [quota], }); }); + test('instantiate IBC contract', async () => { + ibcContract = await neutronClient.create(CONTRACTS.IBC_TRANSFER, {}); + }); }); describe('prepare: test IBC transfer and set RL contract addr to neutron', () => { @@ -174,8 +186,32 @@ describe('Neutron / IBC transfer', () => { }); describe('Rate limits', () => { + describe('setup ibc contract', () => { + test('transfer to contract', async () => { + const res = await neutronClient.sendTokens( + ibcContract, + [{ denom: NEUTRON_DENOM, amount: '50000000' }], + { + gas: '200000', + amount: [{ denom: NEUTRON_DENOM, amount: '1000' }], + }, + ); + expect(res.code).toEqual(0); + }); + test('set payer fees', async () => { + const res = await neutronClient.execute(ibcContract, { + set_fees: { + denom: NEUTRON_DENOM, + ack_fee: '2333', + recv_fee: '0', + timeout_fee: '2666', + }, + }); + expect(res.code).toEqual(0); + }); + }); describe('with limit, Neutron -> gaia', () => { - test('IBC transfer to limit in 2 steps: 1tx almost hits the limit (w/o failing), 2 tx exceeds the limit by 1 untrn', async () => { + test('IBC transfer exceed limit in 2 steps: 1tx almost hits the limit (w/o failing), 2 tx exceeds the limit by 1 untrn', async () => { const fee = { gas: '200000', amount: [{ denom: NEUTRON_DENOM, amount: '1000' }], @@ -235,6 +271,48 @@ describe('Neutron / IBC transfer', () => { 'IBC Rate Limit exceeded for channel-0/untrn.', ); }); + + test('IBC send via contract(s) should be limited as well', async () => { + await expect(neutronClient.execute(ibcContract, { + send: { + channel: TRANSFER_CHANNEL, + to: gaiaWallet.address, + denom: NEUTRON_DENOM, + amount: '1000001', + }, + })).rejects.toThrow(/IBC Rate Limit exceeded for channel-0/); + }); + + test('IBC transfer from a different wallet to ensure that limiting is working for different address (non-contract)', async () => { + const fee = { + gas: '200000', + amount: [{ denom: NEUTRON_DENOM, amount: '1000' }], + }; + const res = await neutronClient2.signAndBroadcast( + [ + { + typeUrl: NeutronMsgTransfer.typeUrl, + value: NeutronMsgTransfer.fromPartial({ + sourcePort: 'transfer', + sourceChannel: TRANSFER_CHANNEL, + token: { denom: NEUTRON_DENOM, amount: '1000001' }, // 1NTRN + 1untrn + sender: neutronWallet2.address, + receiver: gaiaWallet.address, + timeoutHeight: { + revisionNumber: 2n, + revisionHeight: 100000000n, + }, + }), + }, + ], + fee, + ); + expect(res.code).toEqual(2); + expect(res.rawLog).contains( + 'IBC Rate Limit exceeded for channel-0/untrn.', + ); + }); + test('Unset limit', async () => { await neutronClient.execute(rlContract, { remove_path: { From 10b18690ad8b9b5301ec15c6bb4db28e6eae797d Mon Sep 17 00:00:00 2001 From: quasisamurai Date: Thu, 26 Sep 2024 12:42:36 -0300 Subject: [PATCH 18/29] lint & more explicit namings & small ref --- package.json | 2 +- src/helpers/constants.ts | 2 +- ...e_limit.test.ts => ibc_rate_limit.test.ts} | 34 +++++++++++-------- 3 files changed, 21 insertions(+), 17 deletions(-) rename src/testcases/run_in_band/{rate_limit.test.ts => ibc_rate_limit.test.ts} (96%) diff --git a/package.json b/package.json index 19b4ea6c..48ecbe49 100644 --- a/package.json +++ b/package.json @@ -30,7 +30,7 @@ "test:dex_bindings": "NO_WAIT_CHANNEL1=1 NO_WAIT_HTTP2=1 NO_WAIT_CHANNEL2=1 NO_WAIT_DELAY=1 vitest --run src/testcases/run_in_band/dex_bindings --bail 1", "test:chain_manager": "vitest --run src/testcases/run_in_band/chain_manager --bail 1", "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", - "test:rate_limit": "vitest --run src/testcases/run_in_band/rate_limit --bail 1", + "test:ibc_rate_limit": "vitest --run src/testcases/run_in_band/ibc_rate_limit --bail 1", "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", diff --git a/src/helpers/constants.ts b/src/helpers/constants.ts index 0cc1972e..d0e64649 100644 --- a/src/helpers/constants.ts +++ b/src/helpers/constants.ts @@ -74,7 +74,7 @@ export const CONTRACTS = { LOCKDROP_VAULT_CL: 'lockdrop_vault_for_cl_pools.wasm', MARKETMAP: 'marketmap.wasm', ORACLE: 'oracle.wasm', - RATE_LIMITER: 'rate_limiter.wasm', + IBC_RATE_LIMITER: 'rate_limiter.wasm', }; export const NEUTRON_PREFIX = process.env.NEUTRON_ADDRESS_PREFIX || 'neutron'; diff --git a/src/testcases/run_in_band/rate_limit.test.ts b/src/testcases/run_in_band/ibc_rate_limit.test.ts similarity index 96% rename from src/testcases/run_in_band/rate_limit.test.ts rename to src/testcases/run_in_band/ibc_rate_limit.test.ts index 2b327051..1694ca30 100644 --- a/src/testcases/run_in_band/rate_limit.test.ts +++ b/src/testcases/run_in_band/ibc_rate_limit.test.ts @@ -56,6 +56,8 @@ describe('Neutron / IBC transfer', () => { let neutronQuerier: NeutronQuerier; let ibcQuerier: IbcQueryClient; + let amount: string; + beforeAll(async (suite: RunnerTestSuite) => { testState = await LocalState.create(config, inject('mnemonics'), suite); @@ -112,7 +114,7 @@ describe('Neutron / IBC transfer', () => { 1, 1, ); - rlContract = await neutronClient.create(CONTRACTS.RATE_LIMITER, { + rlContract = await neutronClient.create(CONTRACTS.IBC_RATE_LIMITER, { gov_module: neutronWallet.address, ibc_module: ADMIN_MODULE_ADDRESS, paths: [quota], @@ -160,13 +162,13 @@ describe('Neutron / IBC transfer', () => { expect(res.code).toEqual(0); }); - describe('Rate limit params proposal', () => { + describe('IBC rate limit params proposal', () => { const proposalId = 1; test('create proposal', async () => { await daoMember1.submitUpdateParamsRateLimitProposal( chainManagerAddress, 'Proposal #1', - 'Param change proposal. Setup rate limit contract', + 'Param change proposal. Setup IBC rate limit contract', { contract_address: rlContract, }, @@ -185,7 +187,7 @@ describe('Neutron / IBC transfer', () => { }); }); - describe('Rate limits', () => { + describe('IBC Rate limits', () => { describe('setup ibc contract', () => { test('transfer to contract', async () => { const res = await neutronClient.sendTokens( @@ -273,14 +275,16 @@ describe('Neutron / IBC transfer', () => { }); test('IBC send via contract(s) should be limited as well', async () => { - await expect(neutronClient.execute(ibcContract, { - send: { - channel: TRANSFER_CHANNEL, - to: gaiaWallet.address, - denom: NEUTRON_DENOM, - amount: '1000001', - }, - })).rejects.toThrow(/IBC Rate Limit exceeded for channel-0/); + await expect( + neutronClient.execute(ibcContract, { + send: { + channel: TRANSFER_CHANNEL, + to: gaiaWallet.address, + denom: NEUTRON_DENOM, + amount: '1000001', + }, + }), + ).rejects.toThrow(/IBC Rate Limit exceeded for channel-0/); }); test('IBC transfer from a different wallet to ensure that limiting is working for different address (non-contract)', async () => { @@ -398,12 +402,12 @@ describe('Neutron / IBC transfer', () => { }); }); - test('IBC transfer to limit (hits the limit)', async () => { + test('IBC transfer exceeds the limit', async () => { const uatomibcSupply = await bankQuerier.supplyOf({ denom: UATOM_IBC_TO_NEUTRON_DENOM, }); - const amount = ( + amount = ( BigInt(uatomibcSupply.amount.amount) / BigInt(100) + BigInt(1) ).toString(); @@ -468,7 +472,7 @@ describe('Neutron / IBC transfer', () => { value: NeutronMsgTransfer.fromPartial({ sourcePort: 'transfer', sourceChannel: TRANSFER_CHANNEL, - token: { denom: UATOM_IBC_TO_NEUTRON_DENOM, amount: '10' }, + token: { denom: UATOM_IBC_TO_NEUTRON_DENOM, amount: amount }, sender: neutronWallet.address, receiver: gaiaWallet.address, timeoutHeight: { From 000d45acdaed9ac2d68b4c45283f427fe14ccb33 Mon Sep 17 00:00:00 2001 From: quasisamurai Date: Fri, 27 Sep 2024 11:01:33 -0300 Subject: [PATCH 19/29] upd njsp --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 9ae8827e..e90b60e9 100644 --- a/package.json +++ b/package.json @@ -47,7 +47,7 @@ "@cosmjs/stargate": "0.32.4", "@cosmjs/tendermint-rpc": "^0.32.4", "@neutron-org/neutronjs": "https://github.com/neutron-org/neutronjs.git#7f45328320b53b4fa2b572bc25bb96bf80260181", - "@neutron-org/neutronjsplus": "https://github.com/neutron-org/neutronjsplus.git#a05b8bedd5ad6e33cf55da79821a1652ea6c2b22", + "@neutron-org/neutronjsplus": "https://github.com/neutron-org/neutronjsplus.git#a219b4213f5e395d79120b2b477768777d597c42", "@types/lodash": "^4.14.182", "axios": "1.6.0", "commander": "^10.0.0", From e42fe5ca4bdfd424f73b4076adeab696da44aac1 Mon Sep 17 00:00:00 2001 From: quasisamurai Date: Mon, 30 Sep 2024 07:27:05 -0300 Subject: [PATCH 20/29] switch njs once again --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index e90b60e9..986e98e9 100644 --- a/package.json +++ b/package.json @@ -47,7 +47,7 @@ "@cosmjs/stargate": "0.32.4", "@cosmjs/tendermint-rpc": "^0.32.4", "@neutron-org/neutronjs": "https://github.com/neutron-org/neutronjs.git#7f45328320b53b4fa2b572bc25bb96bf80260181", - "@neutron-org/neutronjsplus": "https://github.com/neutron-org/neutronjsplus.git#a219b4213f5e395d79120b2b477768777d597c42", + "@neutron-org/neutronjsplus": "https://github.com/neutron-org/neutronjsplus.git#3f971b1a974d394466ae7bb71c604a7ef416bae6", "@types/lodash": "^4.14.182", "axios": "1.6.0", "commander": "^10.0.0", From 385b3b5678680d788f1c2276286f004ac7ea6da9 Mon Sep 17 00:00:00 2001 From: quasisamurai Date: Mon, 30 Sep 2024 07:41:58 -0300 Subject: [PATCH 21/29] switch njsp once again --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 986e98e9..2066134e 100644 --- a/package.json +++ b/package.json @@ -47,7 +47,7 @@ "@cosmjs/stargate": "0.32.4", "@cosmjs/tendermint-rpc": "^0.32.4", "@neutron-org/neutronjs": "https://github.com/neutron-org/neutronjs.git#7f45328320b53b4fa2b572bc25bb96bf80260181", - "@neutron-org/neutronjsplus": "https://github.com/neutron-org/neutronjsplus.git#3f971b1a974d394466ae7bb71c604a7ef416bae6", + "@neutron-org/neutronjsplus": "https://github.com/neutron-org/neutronjsplus.git#021923dbb5a8b70fa901267a2e85f4cd16668c15", "@types/lodash": "^4.14.182", "axios": "1.6.0", "commander": "^10.0.0", From ecf0f7c294a6005247eb4cb8e7be7d486ad2e3b3 Mon Sep 17 00:00:00 2001 From: quasisamurai Date: Mon, 30 Sep 2024 09:34:30 -0300 Subject: [PATCH 22/29] update njsp)) --- package.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/package.json b/package.json index 2066134e..90b8ab31 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": "https://github.com/neutron-org/neutronjs.git#7f45328320b53b4fa2b572bc25bb96bf80260181", - "@neutron-org/neutronjsplus": "https://github.com/neutron-org/neutronjsplus.git#021923dbb5a8b70fa901267a2e85f4cd16668c15", + "@neutron-org/neutronjs": "https://github.com/neutron-org/neutronjs.git#a751ce115f423be5d9168af87d14eb8f3b301b3f", + "@neutron-org/neutronjsplus": "https://github.com/neutron-org/neutronjsplus.git#207509f5857d077938e56eac971ad384d5c69a4a", "@types/lodash": "^4.14.182", "axios": "1.6.0", "commander": "^10.0.0", From db3f971214ebb8a0f08ae45c3490fda3f4072252 Mon Sep 17 00:00:00 2001 From: quasisamurai Date: Mon, 30 Sep 2024 09:51:20 -0300 Subject: [PATCH 23/29] update njsp to linted version (just in case) --- package.json | 2 +- yarn.lock | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/package.json b/package.json index 90b8ab31..db1d05f0 100644 --- a/package.json +++ b/package.json @@ -47,7 +47,7 @@ "@cosmjs/stargate": "0.32.4", "@cosmjs/tendermint-rpc": "^0.32.4", "@neutron-org/neutronjs": "https://github.com/neutron-org/neutronjs.git#a751ce115f423be5d9168af87d14eb8f3b301b3f", - "@neutron-org/neutronjsplus": "https://github.com/neutron-org/neutronjsplus.git#207509f5857d077938e56eac971ad384d5c69a4a", + "@neutron-org/neutronjsplus": "https://github.com/neutron-org/neutronjsplus.git#2ead8703af32a0c55871273803587a321ec3d4d5", "@types/lodash": "^4.14.182", "axios": "1.6.0", "commander": "^10.0.0", diff --git a/yarn.lock b/yarn.lock index f860f031..6b349be3 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1341,18 +1341,18 @@ "@jridgewell/resolve-uri" "^3.1.0" "@jridgewell/sourcemap-codec" "^1.4.14" -"@neutron-org/neutronjs@https://github.com/neutron-org/neutronjs.git#7f45328320b53b4fa2b572bc25bb96bf80260181": +"@neutron-org/neutronjs@https://github.com/neutron-org/neutronjs.git#a751ce115f423be5d9168af87d14eb8f3b301b3f": version "4.2.0" - resolved "https://github.com/neutron-org/neutronjs.git#7f45328320b53b4fa2b572bc25bb96bf80260181" + resolved "https://github.com/neutron-org/neutronjs.git#a751ce115f423be5d9168af87d14eb8f3b301b3f" "@neutron-org/neutronjsplus@https://github.com/neutron-org/neutronjsplus.git#df604d8c6475c8640f4ee2ded9b1905574226a3a": version "0.5.0" - resolved "https://github.com/neutron-org/neutronjsplus.git#df604d8c6475c8640f4ee2ded9b1905574226a3a" + resolved "https://github.com/neutron-org/neutronjsplus.git#207509f5857d077938e56eac971ad384d5c69a4a" dependencies: "@cosmjs/cosmwasm-stargate" "^0.32.4" "@cosmjs/proto-signing" "^0.32.4" "@cosmjs/stargate" "0.32.4" - "@neutron-org/neutronjs" "https://github.com/neutron-org/neutronjs.git#7f45328320b53b4fa2b572bc25bb96bf80260181" + "@neutron-org/neutronjs" "https://github.com/neutron-org/neutronjs.git#a751ce115f423be5d9168af87d14eb8f3b301b3f" axios "1.6.0" bip39 "^3.1.0" long "^5.2.1" From a5aaa27801cefa18841a7c28d8104fce9eb7400b Mon Sep 17 00:00:00 2001 From: quasisamurai Date: Mon, 30 Sep 2024 13:43:18 -0300 Subject: [PATCH 24/29] store rl contract --- contracts/rate_limiter.wasm | Bin 0 -> 407455 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 contracts/rate_limiter.wasm diff --git a/contracts/rate_limiter.wasm b/contracts/rate_limiter.wasm new file mode 100644 index 0000000000000000000000000000000000000000..7627ff34c56a87610dece7d4565200ad920e3969 GIT binary patch literal 407455 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

cM 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

^I(q}i#B&6hl$hmUV{oOQ1kgxc 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 Date: Mon, 30 Sep 2024 13:48:00 -0300 Subject: [PATCH 25/29] use fixed njsp version & regen yarnlock --- package.json | 2 +- yarn.lock | 374 +++++++++++++++++++++++++++++---------------------- 2 files changed, 211 insertions(+), 165 deletions(-) diff --git a/package.json b/package.json index db1d05f0..109a8497 100644 --- a/package.json +++ b/package.json @@ -47,7 +47,7 @@ "@cosmjs/stargate": "0.32.4", "@cosmjs/tendermint-rpc": "^0.32.4", "@neutron-org/neutronjs": "https://github.com/neutron-org/neutronjs.git#a751ce115f423be5d9168af87d14eb8f3b301b3f", - "@neutron-org/neutronjsplus": "https://github.com/neutron-org/neutronjsplus.git#2ead8703af32a0c55871273803587a321ec3d4d5", + "@neutron-org/neutronjsplus": "https://github.com/neutron-org/neutronjsplus.git#ab3cf06d10c56f8321440e23b521af2840bc6616", "@types/lodash": "^4.14.182", "axios": "1.6.0", "commander": "^10.0.0", diff --git a/yarn.lock b/yarn.lock index 6b349be3..d96d9502 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1345,9 +1345,9 @@ version "4.2.0" resolved "https://github.com/neutron-org/neutronjs.git#a751ce115f423be5d9168af87d14eb8f3b301b3f" -"@neutron-org/neutronjsplus@https://github.com/neutron-org/neutronjsplus.git#df604d8c6475c8640f4ee2ded9b1905574226a3a": +"@neutron-org/neutronjsplus@https://github.com/neutron-org/neutronjsplus.git#ab3cf06d10c56f8321440e23b521af2840bc6616": version "0.5.0" - resolved "https://github.com/neutron-org/neutronjsplus.git#207509f5857d077938e56eac971ad384d5c69a4a" + resolved "https://github.com/neutron-org/neutronjsplus.git#ab3cf06d10c56f8321440e23b521af2840bc6616" dependencies: "@cosmjs/cosmwasm-stargate" "^0.32.4" "@cosmjs/proto-signing" "^0.32.4" @@ -1397,9 +1397,9 @@ fastq "^1.6.0" "@polka/url@^1.0.0-next.24": - version "1.0.0-next.25" - resolved "https://registry.yarnpkg.com/@polka/url/-/url-1.0.0-next.25.tgz#f077fdc0b5d0078d30893396ff4827a13f99e817" - integrity sha512-j7P6Rgr3mmtdkeDGTe0E/aYyWEWVtc5yFXtHCRHs28/jptDEWfaVOc5T7cblqy1XKPPfCxJc/8DwQ5YgLOZOVQ== + version "1.0.0-next.28" + resolved "https://registry.yarnpkg.com/@polka/url/-/url-1.0.0-next.28.tgz#d45e01c4a56f143ee69c54dd6b12eade9e270a73" + integrity sha512-8LduaNlMZGwdZ6qWrKlfa+2M4gahzFkprZiAt2TF8uS0qQgBizKXpXURqvTJ4WtmupWxaLqjRb2UCTe72mu+Aw== "@protobufjs/aspromise@^1.1.1", "@protobufjs/aspromise@^1.1.2": version "1.1.2" @@ -1454,90 +1454,90 @@ resolved "https://registry.yarnpkg.com/@protobufjs/utf8/-/utf8-1.1.0.tgz#a777360b5b39a1a2e5106f8e858f2fd2d060c570" integrity sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw== -"@rollup/rollup-android-arm-eabi@4.21.3": - version "4.21.3" - resolved "https://registry.yarnpkg.com/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.21.3.tgz#155c7d82c1b36c3ad84d9adf9b3cd520cba81a0f" - integrity sha512-MmKSfaB9GX+zXl6E8z4koOr/xU63AMVleLEa64v7R0QF/ZloMs5vcD1sHgM64GXXS1csaJutG+ddtzcueI/BLg== - -"@rollup/rollup-android-arm64@4.21.3": - version "4.21.3" - resolved "https://registry.yarnpkg.com/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.21.3.tgz#b94b6fa002bd94a9cbd8f9e47e23b25e5bd113ba" - integrity sha512-zrt8ecH07PE3sB4jPOggweBjJMzI1JG5xI2DIsUbkA+7K+Gkjys6eV7i9pOenNSDJH3eOr/jLb/PzqtmdwDq5g== - -"@rollup/rollup-darwin-arm64@4.21.3": - version "4.21.3" - resolved "https://registry.yarnpkg.com/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.21.3.tgz#0934126cf9cbeadfe0eb7471ab5d1517e8cd8dcc" - integrity sha512-P0UxIOrKNBFTQaXTxOH4RxuEBVCgEA5UTNV6Yz7z9QHnUJ7eLX9reOd/NYMO3+XZO2cco19mXTxDMXxit4R/eQ== - -"@rollup/rollup-darwin-x64@4.21.3": - version "4.21.3" - resolved "https://registry.yarnpkg.com/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.21.3.tgz#0ce8e1e0f349778938c7c90e4bdc730640e0a13e" - integrity sha512-L1M0vKGO5ASKntqtsFEjTq/fD91vAqnzeaF6sfNAy55aD+Hi2pBI5DKwCO+UNDQHWsDViJLqshxOahXyLSh3EA== - -"@rollup/rollup-linux-arm-gnueabihf@4.21.3": - version "4.21.3" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.21.3.tgz#5669d34775ad5d71e4f29ade99d0ff4df523afb6" - integrity sha512-btVgIsCjuYFKUjopPoWiDqmoUXQDiW2A4C3Mtmp5vACm7/GnyuprqIDPNczeyR5W8rTXEbkmrJux7cJmD99D2g== - -"@rollup/rollup-linux-arm-musleabihf@4.21.3": - version "4.21.3" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.21.3.tgz#f6d1a0e1da4061370cb2f4244fbdd727c806dd88" - integrity sha512-zmjbSphplZlau6ZTkxd3+NMtE4UKVy7U4aVFMmHcgO5CUbw17ZP6QCgyxhzGaU/wFFdTfiojjbLG3/0p9HhAqA== - -"@rollup/rollup-linux-arm64-gnu@4.21.3": - version "4.21.3" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.21.3.tgz#ed96a05e99743dee4d23cc4913fc6e01a0089c88" - integrity sha512-nSZfcZtAnQPRZmUkUQwZq2OjQciR6tEoJaZVFvLHsj0MF6QhNMg0fQ6mUOsiCUpTqxTx0/O6gX0V/nYc7LrgPw== - -"@rollup/rollup-linux-arm64-musl@4.21.3": - version "4.21.3" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.21.3.tgz#057ea26eaa7e537a06ded617d23d57eab3cecb58" - integrity sha512-MnvSPGO8KJXIMGlQDYfvYS3IosFN2rKsvxRpPO2l2cum+Z3exiExLwVU+GExL96pn8IP+GdH8Tz70EpBhO0sIQ== - -"@rollup/rollup-linux-powerpc64le-gnu@4.21.3": - version "4.21.3" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.21.3.tgz#6e6e1f9404c9bf3fbd7d51cd11cd288a9a2843aa" - integrity sha512-+W+p/9QNDr2vE2AXU0qIy0qQE75E8RTwTwgqS2G5CRQ11vzq0tbnfBd6brWhS9bCRjAjepJe2fvvkvS3dno+iw== - -"@rollup/rollup-linux-riscv64-gnu@4.21.3": - version "4.21.3" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.21.3.tgz#eef1536a53f6e6658a2a778130e6b1a4a41cb439" - integrity sha512-yXH6K6KfqGXaxHrtr+Uoy+JpNlUlI46BKVyonGiaD74ravdnF9BUNC+vV+SIuB96hUMGShhKV693rF9QDfO6nQ== - -"@rollup/rollup-linux-s390x-gnu@4.21.3": - version "4.21.3" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.21.3.tgz#2b28fb89ca084efaf8086f435025d96b4a966957" - integrity sha512-R8cwY9wcnApN/KDYWTH4gV/ypvy9yZUHlbJvfaiXSB48JO3KpwSpjOGqO4jnGkLDSk1hgjYkTbTt6Q7uvPf8eg== - -"@rollup/rollup-linux-x64-gnu@4.21.3": - version "4.21.3" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.21.3.tgz#5226cde6c6b495b04a3392c1d2c572844e42f06b" - integrity sha512-kZPbX/NOPh0vhS5sI+dR8L1bU2cSO9FgxwM8r7wHzGydzfSjLRCFAT87GR5U9scj2rhzN3JPYVC7NoBbl4FZ0g== - -"@rollup/rollup-linux-x64-musl@4.21.3": - version "4.21.3" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.21.3.tgz#2c2412982e6c2a00a2ecac6d548ebb02f0aa6ca4" - integrity sha512-S0Yq+xA1VEH66uiMNhijsWAafffydd2X5b77eLHfRmfLsRSpbiAWiRHV6DEpz6aOToPsgid7TI9rGd6zB1rhbg== - -"@rollup/rollup-win32-arm64-msvc@4.21.3": - version "4.21.3" - resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.21.3.tgz#fbb6ef5379199e2ec0103ef32877b0985c773a55" - integrity sha512-9isNzeL34yquCPyerog+IMCNxKR8XYmGd0tHSV+OVx0TmE0aJOo9uw4fZfUuk2qxobP5sug6vNdZR6u7Mw7Q+Q== - -"@rollup/rollup-win32-ia32-msvc@4.21.3": - version "4.21.3" - resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.21.3.tgz#d50e2082e147e24d87fe34abbf6246525ec3845a" - integrity sha512-nMIdKnfZfzn1Vsk+RuOvl43ONTZXoAPUUxgcU0tXooqg4YrAqzfKzVenqqk2g5efWh46/D28cKFrOzDSW28gTA== - -"@rollup/rollup-win32-x64-msvc@4.21.3": - version "4.21.3" - resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.21.3.tgz#4115233aa1bd5a2060214f96d8511f6247093212" - integrity sha512-fOvu7PCQjAj4eWDEuD8Xz5gpzFqXzGlxHZozHP4b9Jxv9APtdxL6STqztDzMLuRXEc4UpXGGhx029Xgm91QBeA== +"@rollup/rollup-android-arm-eabi@4.22.5": + version "4.22.5" + resolved "https://registry.yarnpkg.com/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.22.5.tgz#e0f5350845090ca09690fe4a472717f3b8aae225" + integrity sha512-SU5cvamg0Eyu/F+kLeMXS7GoahL+OoizlclVFX3l5Ql6yNlywJJ0OuqTzUx0v+aHhPHEB/56CT06GQrRrGNYww== + +"@rollup/rollup-android-arm64@4.22.5": + version "4.22.5" + resolved "https://registry.yarnpkg.com/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.22.5.tgz#08270faef6747e2716d3e978a8bbf479f75fb19a" + integrity sha512-S4pit5BP6E5R5C8S6tgU/drvgjtYW76FBuG6+ibG3tMvlD1h9LHVF9KmlmaUBQ8Obou7hEyS+0w+IR/VtxwNMQ== + +"@rollup/rollup-darwin-arm64@4.22.5": + version "4.22.5" + resolved "https://registry.yarnpkg.com/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.22.5.tgz#691671133b350661328d42c8dbdedd56dfb97dfd" + integrity sha512-250ZGg4ipTL0TGvLlfACkIxS9+KLtIbn7BCZjsZj88zSg2Lvu3Xdw6dhAhfe/FjjXPVNCtcSp+WZjVsD3a/Zlw== + +"@rollup/rollup-darwin-x64@4.22.5": + version "4.22.5" + resolved "https://registry.yarnpkg.com/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.22.5.tgz#b2ec52a1615f24b1cd40bc8906ae31af81e8a342" + integrity sha512-D8brJEFg5D+QxFcW6jYANu+Rr9SlKtTenmsX5hOSzNYVrK5oLAEMTUgKWYJP+wdKyCdeSwnapLsn+OVRFycuQg== + +"@rollup/rollup-linux-arm-gnueabihf@4.22.5": + version "4.22.5" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.22.5.tgz#217f01f304808920680bd269002df38e25d9205f" + integrity sha512-PNqXYmdNFyWNg0ma5LdY8wP+eQfdvyaBAojAXgO7/gs0Q/6TQJVXAXe8gwW9URjbS0YAammur0fynYGiWsKlXw== + +"@rollup/rollup-linux-arm-musleabihf@4.22.5": + version "4.22.5" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.22.5.tgz#93ac1c5a1e389f4482a2edaeec41fcffee54a930" + integrity sha512-kSSCZOKz3HqlrEuwKd9TYv7vxPYD77vHSUvM2y0YaTGnFc8AdI5TTQRrM1yIp3tXCKrSL9A7JLoILjtad5t8pQ== + +"@rollup/rollup-linux-arm64-gnu@4.22.5": + version "4.22.5" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.22.5.tgz#a7f146787d6041fecc4ecdf1aa72234661ca94a4" + integrity sha512-oTXQeJHRbOnwRnRffb6bmqmUugz0glXaPyspp4gbQOPVApdpRrY/j7KP3lr7M8kTfQTyrBUzFjj5EuHAhqH4/w== + +"@rollup/rollup-linux-arm64-musl@4.22.5": + version "4.22.5" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.22.5.tgz#6a37236189648e678bd564d6e8ca798f42cf42c5" + integrity sha512-qnOTIIs6tIGFKCHdhYitgC2XQ2X25InIbZFor5wh+mALH84qnFHvc+vmWUpyX97B0hNvwNUL4B+MB8vJvH65Fw== + +"@rollup/rollup-linux-powerpc64le-gnu@4.22.5": + version "4.22.5" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.22.5.tgz#5661420dc463bec31ecb2d17d113de858cfcfe2d" + integrity sha512-TMYu+DUdNlgBXING13rHSfUc3Ky5nLPbWs4bFnT+R6Vu3OvXkTkixvvBKk8uO4MT5Ab6lC3U7x8S8El2q5o56w== + +"@rollup/rollup-linux-riscv64-gnu@4.22.5": + version "4.22.5" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.22.5.tgz#cb00342b7432bdef723aa606281de2f522d6dcf7" + integrity sha512-PTQq1Kz22ZRvuhr3uURH+U/Q/a0pbxJoICGSprNLAoBEkyD3Sh9qP5I0Asn0y0wejXQBbsVMRZRxlbGFD9OK4A== + +"@rollup/rollup-linux-s390x-gnu@4.22.5": + version "4.22.5" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.22.5.tgz#0708889674dccecccd28e2befccf791e0767fcb7" + integrity sha512-bR5nCojtpuMss6TDEmf/jnBnzlo+6n1UhgwqUvRoe4VIotC7FG1IKkyJbwsT7JDsF2jxR+NTnuOwiGv0hLyDoQ== + +"@rollup/rollup-linux-x64-gnu@4.22.5": + version "4.22.5" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.22.5.tgz#a135b040b21582e91cfed2267ccfc7d589e1dbc6" + integrity sha512-N0jPPhHjGShcB9/XXZQWuWBKZQnC1F36Ce3sDqWpujsGjDz/CQtOL9LgTrJ+rJC8MJeesMWrMWVLKKNR/tMOCA== + +"@rollup/rollup-linux-x64-musl@4.22.5": + version "4.22.5" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.22.5.tgz#88395a81a3ab7ee3dc8dc31a73ff62ed3185f34d" + integrity sha512-uBa2e28ohzNNwjr6Uxm4XyaA1M/8aTgfF2T7UIlElLaeXkgpmIJ2EitVNQxjO9xLLLy60YqAgKn/AqSpCUkE9g== + +"@rollup/rollup-win32-arm64-msvc@4.22.5": + version "4.22.5" + resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.22.5.tgz#12ee49233b1125f2c1da38392f63b1dbb0c31bba" + integrity sha512-RXT8S1HP8AFN/Kr3tg4fuYrNxZ/pZf1HemC5Tsddc6HzgGnJm0+Lh5rAHJkDuW3StI0ynNXukidROMXYl6ew8w== + +"@rollup/rollup-win32-ia32-msvc@4.22.5": + version "4.22.5" + resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.22.5.tgz#0f987b134c6b3123c22842b33ba0c2b6fb78cc3b" + integrity sha512-ElTYOh50InL8kzyUD6XsnPit7jYCKrphmddKAe1/Ytt74apOxDq5YEcbsiKs0fR3vff3jEneMM+3I7jbqaMyBg== + +"@rollup/rollup-win32-x64-msvc@4.22.5": + version "4.22.5" + resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.22.5.tgz#f2feb149235a5dc1deb5439758f8871255e5a161" + integrity sha512-+lvL/4mQxSV8MukpkKyyvfwhH266COcWlXE/1qxwN08ajovta3459zrjLghYMgDerlzNwLAcFpvU+WWE5y6nAQ== "@scure/base@~1.1.6": - version "1.1.8" - resolved "https://registry.yarnpkg.com/@scure/base/-/base-1.1.8.tgz#8f23646c352f020c83bca750a82789e246d42b50" - integrity sha512-6CyAclxj3Nb0XT7GHK6K4zK6k2xJm6E4Ft0Ohjt4WgegiFUHEtFb2CGzmPmGBwoIhrLsqNLYfLr04Y1GePrzZg== + version "1.1.9" + resolved "https://registry.yarnpkg.com/@scure/base/-/base-1.1.9.tgz#e5e142fbbfe251091f9c5f1dd4c834ac04c3dbd1" + integrity sha512-8YKhl8GHiNI/pU2VMaofa2Tor7PJRAjwQLBBuilkJ9L5+13yVbC7JO/wS7piioAvPSwR3JKM1IJ/u4xQzbcXKg== "@scure/bip32@1.4.0": version "1.4.0" @@ -1611,15 +1611,15 @@ dependencies: "@types/node" "*" -"@types/estree@1.0.5", "@types/estree@^1.0.0": - version "1.0.5" - resolved "https://registry.yarnpkg.com/@types/estree/-/estree-1.0.5.tgz#a6ce3e556e00fd9895dd872dd172ad0d4bd687f4" - integrity sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw== +"@types/estree@1.0.6", "@types/estree@^1.0.0": + version "1.0.6" + resolved "https://registry.yarnpkg.com/@types/estree/-/estree-1.0.6.tgz#628effeeae2064a1b4e79f78e81d87b7e5fc7b50" + integrity sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw== "@types/express-serve-static-core@^4.17.33": - version "4.19.5" - resolved "https://registry.yarnpkg.com/@types/express-serve-static-core/-/express-serve-static-core-4.19.5.tgz#218064e321126fcf9048d1ca25dd2465da55d9c6" - integrity sha512-y6W03tvrACO72aijJ5uF02FRq5cgDR9lUxddQ8vyF+GvmjJQqbzDcJngEjURc+ZsG31VI3hODNZJ2URj86pzmg== + version "4.19.6" + resolved "https://registry.yarnpkg.com/@types/express-serve-static-core/-/express-serve-static-core-4.19.6.tgz#e01324c2a024ff367d92c66f48553ced0ab50267" + integrity sha512-N4LZ2xG7DatVqhCZzOGb1Yi5lMbXSZcmdLDe9EzSndPV2HpWYWzRbaerl2n27irrm94EPpprqa8KpskPT085+A== dependencies: "@types/node" "*" "@types/qs" "*" @@ -1647,9 +1647,9 @@ integrity sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA== "@types/lodash@^4.14.182": - version "4.17.7" - resolved "https://registry.yarnpkg.com/@types/lodash/-/lodash-4.17.7.tgz#2f776bcb53adc9e13b2c0dfd493dfcbd7de43612" - integrity sha512-8wTvZawATi/lsmNu10/j2hk1KEP0IvjubqPE3cu1Xz7xfXXt5oCq3SNUz4fMIP4XGF9Ky+Ue2tBA3hcS7LSBlA== + version "4.17.9" + resolved "https://registry.yarnpkg.com/@types/lodash/-/lodash-4.17.9.tgz#0dc4902c229f6b8e2ac5456522104d7b1a230290" + integrity sha512-w9iWudx1XWOHW5lQRS9iKpK/XuRhnN+0T7HvdCCd802FYkT1AMTnxndJHGrNJwRoRHkslGr4S29tjm1cT7x/7w== "@types/long@^4.0.1": version "4.0.2" @@ -1662,9 +1662,9 @@ integrity sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w== "@types/node@*", "@types/node@>=13.7.0": - version "22.5.5" - resolved "https://registry.yarnpkg.com/@types/node/-/node-22.5.5.tgz#52f939dd0f65fc552a4ad0b392f3c466cc5d7a44" - integrity sha512-Xjs4y5UPO/CLdzpgR6GirZJx36yScjh73+2NlLlkFRSoQN8B0DpfXPdZGnvVmLRLOsqDpOfTNv7D9trgGhmOIA== + version "22.7.4" + resolved "https://registry.yarnpkg.com/@types/node/-/node-22.7.4.tgz#e35d6f48dca3255ce44256ddc05dee1c23353fcc" + integrity sha512-y+NPi1rFzDs1NdQHHToqeiX2TIS79SWEAw9GYhkkx8bD0ChpfqC+n2j5OXOCpzfojBEBt6DnEnnG9MY0zk1XLg== dependencies: undici-types "~6.19.2" @@ -1866,6 +1866,13 @@ loupe "^3.1.1" tinyrainbow "^1.2.0" +abort-controller@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/abort-controller/-/abort-controller-3.0.0.tgz#eaf54d53b62bae4138e809ca225c8439a6efb392" + integrity sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg== + dependencies: + event-target-shim "^5.0.0" + accepts@~1.3.8: version "1.3.8" resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.3.8.tgz#0bf0be125b67014adcb0b0921e62db7bffe16b2e" @@ -2057,7 +2064,7 @@ balanced-match@^1.0.0: resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== -base64-js@^1.3.0: +base64-js@^1.3.0, base64-js@^1.3.1: version "1.5.1" resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.5.1.tgz#1b1b440160a5bf7ad40b650f095963481903930a" integrity sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA== @@ -2138,12 +2145,12 @@ brorand@^1.1.0: integrity sha512-cKV8tMCEpQs4hK/ik71d6LrPOnpkpGBR0wzxqr68g2m/LB2GxVYQroAjMJZRVM1Y4BCjCKc3vAamxSzOY2RP+w== browserslist@^4.23.1, browserslist@^4.23.3: - version "4.23.3" - resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.23.3.tgz#debb029d3c93ebc97ffbc8d9cbb03403e227c800" - integrity sha512-btwCFJVjI4YWDNfau8RhZ+B1Q/VLoUITrm3RlP6y1tYGWIOa+InuYiRGXUBXo8nA1qKmHMyLB/iVQg5TT4eFoA== + version "4.24.0" + resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.24.0.tgz#a1325fe4bc80b64fda169629fc01b3d6cecd38d4" + integrity sha512-Rmb62sR1Zpjql25eSanFGEhAxcFwfA1K0GuQcLoaJBAcENegrQut3hYdhXFF1obQfiDyqIW/cLM5HSJ/9k884A== dependencies: - caniuse-lite "^1.0.30001646" - electron-to-chromium "^1.5.4" + caniuse-lite "^1.0.30001663" + electron-to-chromium "^1.5.28" node-releases "^2.0.18" update-browserslist-db "^1.1.0" @@ -2157,6 +2164,14 @@ buffer-reverse@^1.0.1: resolved "https://registry.yarnpkg.com/buffer-reverse/-/buffer-reverse-1.0.1.tgz#49283c8efa6f901bc01fa3304d06027971ae2f60" integrity sha512-M87YIUBsZ6N924W57vDwT/aOu8hw7ZgdByz6ijksLjmHJELBASmYTTlNHRgjE+pTsT9oJXGaDSgqqwfdHotDUg== +buffer@^6.0.3: + version "6.0.3" + resolved "https://registry.yarnpkg.com/buffer/-/buffer-6.0.3.tgz#2ace578459cc8fbe2a70aaa8f52ee63b6a74c6c6" + integrity sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA== + dependencies: + base64-js "^1.3.1" + ieee754 "^1.2.1" + builtin-modules@^1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/builtin-modules/-/builtin-modules-1.1.1.tgz#270f076c5a72c02f5b65a47df94c5fe3a278892f" @@ -2188,10 +2203,10 @@ callsites@^3.0.0: resolved "https://registry.yarnpkg.com/callsites/-/callsites-3.1.0.tgz#b3630abd8943432f54b3f0519238e33cd7df2f73" integrity sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ== -caniuse-lite@^1.0.30001646: - version "1.0.30001660" - resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001660.tgz#31218de3463fabb44d0b7607b652e56edf2e2355" - integrity sha512-GacvNTTuATm26qC74pt+ad1fW15mlQ/zuTzzY1ZoIzECTP8HURDfF43kNxPgf7H1jmelCBQTTbBNxdSXOA7Bqg== +caniuse-lite@^1.0.30001663: + version "1.0.30001664" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001664.tgz#d588d75c9682d3301956b05a3749652a80677df4" + integrity sha512-AmE7k4dXiNKQipgn7a2xg558IRqPN3jMQY/rOsbxDhrd0tyChwbITBfiwtnqz8bi2M5mIWbxAYBvk7W7QBUS2g== chai@^5.1.1: version "5.1.1" @@ -2500,10 +2515,10 @@ ee-first@1.1.1: resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d" integrity sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow== -electron-to-chromium@^1.5.4: - version "1.5.24" - resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.5.24.tgz#b3cd2f71b7a84bac340d862e3b7b0aadf48478de" - integrity sha512-0x0wLCmpdKFCi9ulhvYZebgcPmHTkFVUfU2wzDykadkslKwT4oAmDTHEKLnlrDsMGZe4B+ksn8quZfZjYsBetA== +electron-to-chromium@^1.5.28: + version "1.5.29" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.5.29.tgz#aa592a3caa95d07cc26a66563accf99fa573a1ee" + integrity sha512-PF8n2AlIhCKXQ+gTpiJi0VhcHDb69kYX4MtCiivctc2QD3XuNZ/XIOlbGzt7WAjjEev0TtaH6Cu3arZExm5DOw== elliptic@^6.5.4: version "6.5.7" @@ -2584,7 +2599,7 @@ esbuild@^0.21.3: "@esbuild/win32-ia32" "0.21.5" "@esbuild/win32-x64" "0.21.5" -escalade@^3.1.2: +escalade@^3.2.0: version "3.2.0" resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.2.0.tgz#011a3f69856ba189dffa7dc8fcce99d2a87903e5" integrity sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA== @@ -2761,6 +2776,16 @@ ethjs-unit@0.1.6: bn.js "4.11.6" number-to-bn "1.7.0" +event-target-shim@^5.0.0: + version "5.0.1" + resolved "https://registry.yarnpkg.com/event-target-shim/-/event-target-shim-5.0.1.tgz#5d4d3ebdf9583d63a5333ce2deb7480ab2b05789" + integrity sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ== + +events@^3.3.0: + version "3.3.0" + resolved "https://registry.yarnpkg.com/events/-/events-3.3.0.tgz#31a95ad0a924e2d2c419a813aeb2c4e878ea7400" + integrity sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q== + execa@^5.1.1: version "5.1.1" resolved "https://registry.yarnpkg.com/execa/-/execa-5.1.1.tgz#f80ad9cbf4298f7bd1d4c9555c21e93741c411dd" @@ -2850,9 +2875,9 @@ fast-safe-stringify@2.0.4: 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== + version "3.0.2" + resolved "https://registry.yarnpkg.com/fast-uri/-/fast-uri-3.0.2.tgz#d78b298cf70fd3b752fd951175a3da6a7b48f024" + integrity sha512-GR6f0hD7XXyNJa25Tb9BuIdN0tdr+0BMi6/CJPH3wJO1JjNG3n/VsSw38AwRdKZABm8lGbPfakLRkYzx2V9row== fastq@^1.6.0: version "1.17.1" @@ -2861,10 +2886,10 @@ fastq@^1.6.0: dependencies: reusify "^1.0.4" -fdir@^6.3.0: - version "6.3.0" - resolved "https://registry.yarnpkg.com/fdir/-/fdir-6.3.0.tgz#fcca5a23ea20e767b15e081ee13b3e6488ee0bb0" - integrity sha512-QOnuT+BOtivR77wYvCWHfGt9s4Pz1VIMbD463vegT5MLqNXy8rYFT/lPVEqf/bhYeT6qmqrNHhsX+rWwe3rOCQ== +fdir@^6.4.0: + version "6.4.0" + resolved "https://registry.yarnpkg.com/fdir/-/fdir-6.4.0.tgz#8e80ab4b18a2ac24beebf9d20d71e1bc2627dbae" + integrity sha512-3oB133prH1o4j/L5lLW7uOCF1PlD+/It2L0eL/iAqWMB91RBbqTewABqxhj0ibBd90EEmWZq7ntIWzVaWcXTGQ== fecha@^4.2.0: version "4.2.3" @@ -3134,6 +3159,11 @@ iconv-lite@0.4.24: dependencies: safer-buffer ">= 2.1.2 < 3" +ieee754@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.2.1.tgz#8eb7a10a63fff25d15a57b001586d177d1b0d352" + integrity sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA== + ignore@^5.2.0: version "5.3.2" resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.3.2.tgz#3cd40e729f3643fd87cb04e50bf0eb722bc596f5" @@ -3770,9 +3800,9 @@ path-to-regexp@0.1.10: integrity sha512-7lf7qcQidTku0Gu3YDPc8DJ1q7OOucfa/BSsIwjuh56VU7katFvuM8hULfkwB3Fns/rsVF7PwPKVw1sl5KQS9w== path-to-regexp@^8.1.0: - version "8.1.0" - resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-8.1.0.tgz#4d687606ed0be8ed512ba802eb94d620cb1a86f0" - integrity sha512-Bqn3vc8CMHty6zuD+tG23s6v2kwxslHEhTj4eYaVKGIEB+YX/2wd0/rgXLFD9G9id9KCtbVy/3ZgmvZjpa0UdQ== + version "8.2.0" + resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-8.2.0.tgz#73990cc29e57a3ff2a0d914095156df5db79e8b4" + integrity sha512-TdrF7fW9Rphjq4RjrW0Kp2AW0Ahwu9sRGTkS6bvDi0SCwZlEZYmcfDbEsTz8RVk0EHIS/Vd1bv3JhG+1xZuAyQ== path-type@^4.0.0: version "4.0.0" @@ -3789,7 +3819,7 @@ pathval@^2.0.0: resolved "https://registry.yarnpkg.com/pathval/-/pathval-2.0.0.tgz#7e2550b422601d4f6b8e26f1301bc8f15a741a25" integrity sha512-vE7JKRyES09KiunauX7nd2Q9/L7lhok4smP9RZTDeD4MVs72Dp2qNFVz39Nz5a0FVEW0BJR6C0DYrq6unoziZA== -picocolors@^1.0.0, picocolors@^1.0.1, picocolors@^1.1.0: +picocolors@^1.0.0, picocolors@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.1.0.tgz#5358b76a78cde483ba5cef6a9dc9671440b27d59" integrity sha512-TQ92mBOW0l3LeMeyLV6mzy/kWr8lkd/hp3mTg7wYK7zJhuBStmGMBG0BdeDZS/dZx1IukaX6Bk11zcln25o1Aw== @@ -3844,6 +3874,11 @@ pretty-format@^29.7.0: ansi-styles "^5.0.0" react-is "^18.0.0" +process@^0.11.10: + version "0.11.10" + resolved "https://registry.yarnpkg.com/process/-/process-0.11.10.tgz#7332300e840161bda3e69a1d1d91a7d4bc16f182" + integrity sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A== + prom-client@13.1.0: version "13.1.0" resolved "https://registry.yarnpkg.com/prom-client/-/prom-client-13.1.0.tgz#1185caffd8691e28d32e373972e662964e3dba45" @@ -3927,7 +3962,7 @@ 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: +readable-stream@^3.4.0: version "3.6.2" resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.2.tgz#56a9b36ea965c00c5a93ef31eb111a0f11056967" integrity sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA== @@ -3936,6 +3971,17 @@ readable-stream@^3.4.0, readable-stream@^3.6.2: string_decoder "^1.1.1" util-deprecate "^1.0.1" +readable-stream@^4.5.2: + version "4.5.2" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-4.5.2.tgz#9e7fc4c45099baeed934bff6eb97ba6cf2729e09" + integrity sha512-yjavECdqeZ3GLXNgRXgeQEdz9fvDDkNKyHnbHRFtOr7/LcfgBcmct7t/ET+HaCTqfh06OzoAxrkN/IfjJBVe+g== + dependencies: + abort-controller "^3.0.0" + buffer "^6.0.3" + events "^3.3.0" + process "^0.11.10" + string_decoder "^1.3.0" + readonly-date@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/readonly-date/-/readonly-date-1.0.0.tgz#5af785464d8c7d7c40b9d738cbde8c646f97dcd9" @@ -4034,28 +4080,28 @@ rimraf@^3.0.2: glob "^7.1.3" rollup@^4.20.0: - version "4.21.3" - resolved "https://registry.yarnpkg.com/rollup/-/rollup-4.21.3.tgz#c64ba119e6aeb913798a6f7eef2780a0df5a0821" - integrity sha512-7sqRtBNnEbcBtMeRVc6VRsJMmpI+JU1z9VTvW8D4gXIYQFz0aLcsE6rRkyghZkLfEgUZgVvOG7A5CVz/VW5GIA== + version "4.22.5" + resolved "https://registry.yarnpkg.com/rollup/-/rollup-4.22.5.tgz#d5108cc470249417e50492456253884d19f5d40f" + integrity sha512-WoinX7GeQOFMGznEcWA1WrTQCd/tpEbMkc3nuMs9BT0CPjMdSjPMTVClwWd4pgSQwJdP65SK9mTCNvItlr5o7w== dependencies: - "@types/estree" "1.0.5" + "@types/estree" "1.0.6" optionalDependencies: - "@rollup/rollup-android-arm-eabi" "4.21.3" - "@rollup/rollup-android-arm64" "4.21.3" - "@rollup/rollup-darwin-arm64" "4.21.3" - "@rollup/rollup-darwin-x64" "4.21.3" - "@rollup/rollup-linux-arm-gnueabihf" "4.21.3" - "@rollup/rollup-linux-arm-musleabihf" "4.21.3" - "@rollup/rollup-linux-arm64-gnu" "4.21.3" - "@rollup/rollup-linux-arm64-musl" "4.21.3" - "@rollup/rollup-linux-powerpc64le-gnu" "4.21.3" - "@rollup/rollup-linux-riscv64-gnu" "4.21.3" - "@rollup/rollup-linux-s390x-gnu" "4.21.3" - "@rollup/rollup-linux-x64-gnu" "4.21.3" - "@rollup/rollup-linux-x64-musl" "4.21.3" - "@rollup/rollup-win32-arm64-msvc" "4.21.3" - "@rollup/rollup-win32-ia32-msvc" "4.21.3" - "@rollup/rollup-win32-x64-msvc" "4.21.3" + "@rollup/rollup-android-arm-eabi" "4.22.5" + "@rollup/rollup-android-arm64" "4.22.5" + "@rollup/rollup-darwin-arm64" "4.22.5" + "@rollup/rollup-darwin-x64" "4.22.5" + "@rollup/rollup-linux-arm-gnueabihf" "4.22.5" + "@rollup/rollup-linux-arm-musleabihf" "4.22.5" + "@rollup/rollup-linux-arm64-gnu" "4.22.5" + "@rollup/rollup-linux-arm64-musl" "4.22.5" + "@rollup/rollup-linux-powerpc64le-gnu" "4.22.5" + "@rollup/rollup-linux-riscv64-gnu" "4.22.5" + "@rollup/rollup-linux-s390x-gnu" "4.22.5" + "@rollup/rollup-linux-x64-gnu" "4.22.5" + "@rollup/rollup-linux-x64-musl" "4.22.5" + "@rollup/rollup-win32-arm64-msvc" "4.22.5" + "@rollup/rollup-win32-ia32-msvc" "4.22.5" + "@rollup/rollup-win32-x64-msvc" "4.22.5" fsevents "~2.3.2" run-parallel@^1.1.9: @@ -4305,7 +4351,7 @@ string-width@^5.0.0: emoji-regex "^9.2.2" strip-ansi "^7.0.1" -string_decoder@^1.1.1: +string_decoder@^1.1.1, string_decoder@^1.3.0: 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== @@ -4416,11 +4462,11 @@ tinyexec@^0.3.0: integrity sha512-tVGE0mVJPGb0chKhqmsoosjsS+qUnJVGJpZgsHYQcGoPlG3B51R3PouqTgEGH2Dc9jjFyOqOpix6ZHNMXp1FZg== tinyglobby@^0.2.6: - version "0.2.6" - resolved "https://registry.yarnpkg.com/tinyglobby/-/tinyglobby-0.2.6.tgz#950baf1462d0c0b443bc3d754d0d39c2e589aaae" - integrity sha512-NbBoFBpqfcgd1tCiO8Lkfdk+xrA7mlLR9zgvZcZWQQwU63XAfUePyd6wZBaU93Hqw347lHnwFzttAkemHzzz4g== + version "0.2.7" + resolved "https://registry.yarnpkg.com/tinyglobby/-/tinyglobby-0.2.7.tgz#36f583c166ac2d91f47c799d6e2e256fdcfb3a56" + integrity sha512-qFWYeNxBQxrOTRHvGjlRdBamy8JFqu6c0bwRru9leE+q8J72tLtlT0L3v+2T7fbLXN7FGzDNBhXkWiJqHUHD9g== dependencies: - fdir "^6.3.0" + fdir "^6.4.0" picomatch "^4.0.2" tinypool@^1.0.0: @@ -4604,12 +4650,12 @@ unpipe@1.0.0, unpipe@~1.0.0: integrity sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ== update-browserslist-db@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/update-browserslist-db/-/update-browserslist-db-1.1.0.tgz#7ca61c0d8650766090728046e416a8cde682859e" - integrity sha512-EdRAaAyk2cUE1wOf2DkEhzxqOQvFOoRJFNS6NeyJ01Gp2beMRpBAINjM2iDXE3KCuKhwnvHIQCJm6ThL2Z+HzQ== + version "1.1.1" + resolved "https://registry.yarnpkg.com/update-browserslist-db/-/update-browserslist-db-1.1.1.tgz#80846fba1d79e82547fb661f8d141e0945755fe5" + integrity sha512-R8UzCaa9Az+38REPiJ1tXlImTJXlVfgHZsglwBD/k6nj76ctsH1E3q4doGrukiLQd3sGQYu56r5+lo5r94l29A== dependencies: - escalade "^3.1.2" - picocolors "^1.0.1" + escalade "^3.2.0" + picocolors "^1.1.0" uri-js@^4.2.2: version "4.4.1" @@ -4649,9 +4695,9 @@ vite-node@2.1.1: vite "^5.0.0" vite@^5.0.0: - version "5.4.6" - resolved "https://registry.yarnpkg.com/vite/-/vite-5.4.6.tgz#85a93a1228a7fb5a723ca1743e337a2588ed008f" - integrity sha512-IeL5f8OO5nylsgzd9tq4qD2QqI0k2CQLGrWD0rCN0EQJZpBK5vJAx0I+GDkMOXxQX/OfFHMuLIx6ddAxGX/k+Q== + version "5.4.8" + resolved "https://registry.yarnpkg.com/vite/-/vite-5.4.8.tgz#af548ce1c211b2785478d3ba3e8da51e39a287e8" + integrity sha512-FqrItQ4DT1NC4zCUqMB4c4AZORMKIa0m8/URVCZ77OZ/QSNeJ54bU1vrFADbDsuwfIPcgknRkmqakQcgnL4GiQ== dependencies: esbuild "^0.21.3" postcss "^8.4.43" @@ -4714,12 +4760,12 @@ why-is-node-running@^2.3.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== + version "4.8.0" + resolved "https://registry.yarnpkg.com/winston-transport/-/winston-transport-4.8.0.tgz#a15080deaeb80338455ac52c863418c74fcf38ea" + integrity sha512-qxSTKswC6llEMZKgCQdaWgDuMJQnhuvF5f2Nk3SNXc4byfQ+voo2mX1Px9dkNOuR8p0KAjfPG29PuYUSIb+vSA== dependencies: logform "^2.6.1" - readable-stream "^3.6.2" + readable-stream "^4.5.2" triple-beam "^1.3.0" winston@3.3.3: From cfaa50b7680ecd84f4eae0f81da71c8ea6b88c63 Mon Sep 17 00:00:00 2001 From: quasisamurai Date: Mon, 30 Sep 2024 14:19:37 -0300 Subject: [PATCH 26/29] use pwd fallback on njs build --- package.json | 2 +- yarn.lock | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/package.json b/package.json index 109a8497..1414c4e4 100644 --- a/package.json +++ b/package.json @@ -47,7 +47,7 @@ "@cosmjs/stargate": "0.32.4", "@cosmjs/tendermint-rpc": "^0.32.4", "@neutron-org/neutronjs": "https://github.com/neutron-org/neutronjs.git#a751ce115f423be5d9168af87d14eb8f3b301b3f", - "@neutron-org/neutronjsplus": "https://github.com/neutron-org/neutronjsplus.git#ab3cf06d10c56f8321440e23b521af2840bc6616", + "@neutron-org/neutronjsplus": "https://github.com/neutron-org/neutronjsplus.git#622584d06c1c963a510d53af400204d0b8f54b94", "@types/lodash": "^4.14.182", "axios": "1.6.0", "commander": "^10.0.0", diff --git a/yarn.lock b/yarn.lock index d96d9502..17ef73bd 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1345,9 +1345,9 @@ version "4.2.0" resolved "https://github.com/neutron-org/neutronjs.git#a751ce115f423be5d9168af87d14eb8f3b301b3f" -"@neutron-org/neutronjsplus@https://github.com/neutron-org/neutronjsplus.git#ab3cf06d10c56f8321440e23b521af2840bc6616": +"@neutron-org/neutronjsplus@https://github.com/neutron-org/neutronjsplus.git#622584d06c1c963a510d53af400204d0b8f54b94": version "0.5.0" - resolved "https://github.com/neutron-org/neutronjsplus.git#ab3cf06d10c56f8321440e23b521af2840bc6616" + resolved "https://github.com/neutron-org/neutronjsplus.git#622584d06c1c963a510d53af400204d0b8f54b94" dependencies: "@cosmjs/cosmwasm-stargate" "^0.32.4" "@cosmjs/proto-signing" "^0.32.4" From e721578895cdd380196c19900e5a68b3be825e0a Mon Sep 17 00:00:00 2001 From: quasisamurai Date: Mon, 30 Sep 2024 22:11:31 -0300 Subject: [PATCH 27/29] try magic commit --- package.json | 4 ++-- yarn.lock | 10 +++++----- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/package.json b/package.json index 1414c4e4..b1d32728 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": "https://github.com/neutron-org/neutronjs.git#a751ce115f423be5d9168af87d14eb8f3b301b3f", - "@neutron-org/neutronjsplus": "https://github.com/neutron-org/neutronjsplus.git#622584d06c1c963a510d53af400204d0b8f54b94", + "@neutron-org/neutronjs": "https://github.com/neutron-org/neutronjs.git#7f45328320b53b4fa2b572bc25bb96bf80260181", + "@neutron-org/neutronjsplus": "https://github.com/neutron-org/neutronjsplus.git#39dd19b17165ef206b40018ff437054210c2bdbc", "@types/lodash": "^4.14.182", "axios": "1.6.0", "commander": "^10.0.0", diff --git a/yarn.lock b/yarn.lock index 17ef73bd..0c07889a 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1341,18 +1341,18 @@ "@jridgewell/resolve-uri" "^3.1.0" "@jridgewell/sourcemap-codec" "^1.4.14" -"@neutron-org/neutronjs@https://github.com/neutron-org/neutronjs.git#a751ce115f423be5d9168af87d14eb8f3b301b3f": +"@neutron-org/neutronjs@https://github.com/neutron-org/neutronjs.git#7f45328320b53b4fa2b572bc25bb96bf80260181": version "4.2.0" - resolved "https://github.com/neutron-org/neutronjs.git#a751ce115f423be5d9168af87d14eb8f3b301b3f" + resolved "https://github.com/neutron-org/neutronjs.git#7f45328320b53b4fa2b572bc25bb96bf80260181" -"@neutron-org/neutronjsplus@https://github.com/neutron-org/neutronjsplus.git#622584d06c1c963a510d53af400204d0b8f54b94": +"@neutron-org/neutronjsplus@https://github.com/neutron-org/neutronjsplus.git#39dd19b17165ef206b40018ff437054210c2bdbc": version "0.5.0" - resolved "https://github.com/neutron-org/neutronjsplus.git#622584d06c1c963a510d53af400204d0b8f54b94" + resolved "https://github.com/neutron-org/neutronjsplus.git#39dd19b17165ef206b40018ff437054210c2bdbc" dependencies: "@cosmjs/cosmwasm-stargate" "^0.32.4" "@cosmjs/proto-signing" "^0.32.4" "@cosmjs/stargate" "0.32.4" - "@neutron-org/neutronjs" "https://github.com/neutron-org/neutronjs.git#a751ce115f423be5d9168af87d14eb8f3b301b3f" + "@neutron-org/neutronjs" "https://github.com/neutron-org/neutronjs.git#7f45328320b53b4fa2b572bc25bb96bf80260181" axios "1.6.0" bip39 "^3.1.0" long "^5.2.1" From da6674cb64c4734b9ae0b58465aa5c87a0cf333f Mon Sep 17 00:00:00 2001 From: quasisamurai Date: Tue, 1 Oct 2024 11:39:53 -0300 Subject: [PATCH 28/29] bring hermes gas multiplier back: we fixed the cause of high gas consumption (by removing osmo specific code) --- setup/hermes/config.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/setup/hermes/config.toml b/setup/hermes/config.toml index dd33f080..131249b6 100644 --- a/setup/hermes/config.toml +++ b/setup/hermes/config.toml @@ -102,7 +102,7 @@ store_prefix = 'ibc' default_gas = 100000 max_gas = 3000000 gas_price = { price = 0.0025, denom = 'untrn' } -gas_multiplier = 2.7 +gas_multiplier = 2.0 max_msg_num = 30 max_tx_size = 2097152 clock_drift = '5s' From 25c77215a1ecef7a8bf185697134d8b6b60317c1 Mon Sep 17 00:00:00 2001 From: quasisamurai Date: Wed, 2 Oct 2024 07:40:40 -0300 Subject: [PATCH 29/29] add comment --- src/testcases/run_in_band/ibc_rate_limit.test.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/testcases/run_in_band/ibc_rate_limit.test.ts b/src/testcases/run_in_band/ibc_rate_limit.test.ts index 1694ca30..a1e84a97 100644 --- a/src/testcases/run_in_band/ibc_rate_limit.test.ts +++ b/src/testcases/run_in_band/ibc_rate_limit.test.ts @@ -29,7 +29,7 @@ const TRANSFER_CHANNEL = 'channel-0'; const UATOM_IBC_TO_NEUTRON_DENOM = 'ibc/27394FB092D2ECCD56123C74F36E4C1F926001CEADA9CA97EA622B25F41E5EB2'; -// These are th +// These are wallets rich enough to execute transfer which hits the rl const DEMO_MNEMONIC_1 = 'banner spread envelope side kite person disagree path silver will brother under couch edit food venture squirrel civil budget number acquire point work mass'; const DEMO_MNEMONIC_2 =