From 32f66f7e14040c5e85e6d982ca23cfb627c50a0f Mon Sep 17 00:00:00 2001 From: Yaroslav Bolyukin Date: Thu, 16 Nov 2023 11:15:07 +0000 Subject: [PATCH] Merge pull request #1017 from UniqueNetwork/feature/speedup-inflation-pallet --- --- a/.docker/Dockerfile-chain-dev +++ b/.docker/Dockerfile-chain-dev @@ -21,7 +21,7 @@ WORKDIR /dev_chain -RUN cargo build --profile integration-tests --features=${NETWORK}-runtime +RUN cargo build --profile integration-tests --features=${NETWORK}-runtime,fast-inflation RUN echo "$NETWORK" -CMD cargo run --profile integration-tests --features=${NETWORK}-runtime -- --dev -linfo --rpc-cors=all --unsafe-rpc-external +CMD cargo run --profile integration-tests --features=${NETWORK}-runtime,fast-inflation -- --dev -linfo --rpc-cors=all --unsafe-rpc-external --- a/.docker/Dockerfile-unique +++ b/.docker/Dockerfile-unique @@ -47,7 +47,7 @@ --mount=type=cache,target=/unique_parachain/unique-chain/target \ cd unique-chain && \ echo "Using runtime features '$RUNTIME_FEATURES'" && \ - CARGO_INCREMENTAL=0 cargo build --profile integration-tests --features="$RUNTIME_FEATURES" --locked && \ + CARGO_INCREMENTAL=0 cargo build --profile integration-tests --features=fast-inflation,"$RUNTIME_FEATURES" --locked && \ mv ./target/integration-tests/unique-collator /unique_parachain/unique-chain/ && \ cd target/integration-tests/wbuild && find . -name "*.wasm" -exec sh -c 'mkdir -p "../../../wasm/$(dirname {})"; cp {} "../../../wasm/{}"' \; --- a/.docker/docker-compose.gov.j2 +++ b/.docker/docker-compose.gov.j2 @@ -21,4 +21,4 @@ options: max-size: "1m" max-file: "3" - command: cargo run --profile integration-tests --features={{ NETWORK }}-runtime,gov-test-timings -- --dev -linfo --rpc-cors=all --unsafe-rpc-external + command: cargo run --profile integration-tests --features={{ NETWORK }}-runtime,gov-test-timings,fast-inflation -- --dev -linfo --rpc-cors=all --unsafe-rpc-external --- a/js-packages/tests/creditFeesToTreasury.seqtest.ts +++ b/js-packages/tests/creditFeesToTreasury.seqtest.ts @@ -33,7 +33,7 @@ const blockInterval = inflationBlockInterval.toNumber(); const unsubscribe = await api.rpc.chain.subscribeNewHeads(head => { const currentBlock = head.number.toNumber(); - if(currentBlock % blockInterval < blockInterval - 10) { + if(currentBlock % blockInterval < blockInterval - (blockInterval / 5)) { unsubscribe(); resolve(); } else { --- a/js-packages/tests/eth/util/playgrounds/unique.dev.ts +++ b/js-packages/tests/eth/util/playgrounds/unique.dev.ts @@ -460,7 +460,7 @@ fromCollectionId(collectionId: number): string { if(collectionId >= 0xffffffff || collectionId < 0) throw new Error('collectionId overflow'); - return (web3 as any).utils.toChecksumAddress(`0x17c4e6453cc49aaaaeaca894e6d9683e${collectionId.toString(16).padStart(8, '0')}`); + return web3.default.utils.toChecksumAddress(`0x17c4e6453cc49aaaaeaca894e6d9683e${collectionId.toString(16).padStart(8, '0')}`); } extractTokenId(address: string): { collectionId: number, tokenId: number } { @@ -590,8 +590,8 @@ connectWeb3(wsEndpoint: string) { if(this.web3 !== null) return; - this.web3Provider = new (web3 as any).providers.WebsocketProvider(wsEndpoint); - this.web3 = new (web3 as any)(this.web3Provider); + this.web3Provider = new web3.default.providers.WebsocketProvider(wsEndpoint); + this.web3 = new web3.default(this.web3Provider); } override async disconnect() { --- a/js-packages/tests/inflation.seqtest.ts +++ b/js-packages/tests/inflation.seqtest.ts @@ -17,13 +17,19 @@ import type {IKeyringPair} from '@polkadot/types/types'; import {expect, itSub, usingPlaygrounds} from './util/index.js'; +const TREASURY = '5EYCAe5ijiYfyeZ2JJCGq56LmPyNRAKzpG4QkoQkkQNB5e6Z'; + // todo:playgrounds requires sudo, look into on the later stage describe('integration test: Inflation', () => { let superuser: IKeyringPair; before(async () => { - await usingPlaygrounds(async (_, privateKey) => { + await usingPlaygrounds(async (helper, privateKey) => { superuser = await privateKey('//Alice'); + const api = helper.getApi(); + + const relayBlock = (await api.query.parachainSystem.lastRelayChainBlockNumber()).toNumber(); + await expect(helper.executeExtrinsic(superuser, 'api.tx.sudo.sudo', [helper.constructApiCall('api.tx.inflation.startInflation', [relayBlock])])).to.not.be.rejected; }); }); @@ -36,10 +42,6 @@ // Make sure superuser can't start inflation without explicit sudo await expect(helper.executeExtrinsic(superuser, 'api.tx.inflation.startInflation', [1])).to.be.rejectedWith(/BadOrigin/); - // Start inflation on relay block 1 (Alice is sudo) - const tx = helper.constructApiCall('api.tx.inflation.startInflation', [1]); - await expect(helper.executeExtrinsic(superuser, 'api.tx.sudo.sudo', [tx])).to.not.be.rejected; - const blockInterval = (helper.getApi().consts.inflation.inflationBlockInterval as any).toBigInt(); const totalIssuanceStart = ((await helper.callRpc('api.query.inflation.startingYearTotalIssuance', [])) as any).toBigInt(); const blockInflation = (await helper.callRpc('api.query.inflation.blockInflation', []) as any).toBigInt(); @@ -55,4 +57,22 @@ expect(Math.abs(Number(expectedInflation))).to.be.lessThanOrEqual(tolerance); }); + + itSub('Inflation happens after inflation block interval', async ({helper}) => { + const api = helper.getApi(); + const blockInterval = await api.consts.inflation.inflationBlockInterval.toNumber(); + + const relayBlock = (await api.query.parachainSystem.lastRelayChainBlockNumber()).toNumber(); + const blockInflation = (await helper.callRpc('api.query.inflation.blockInflation', []) as any).toBigInt(); + const startBlock = (relayBlock + blockInterval) - (relayBlock % blockInterval) + 1; + + await helper.wait.forRelayBlockNumber(startBlock); + + const treasuryBalanceBefore = await helper.balance.getSubstrate(TREASURY); + + await helper.wait.forRelayBlockNumber(startBlock + blockInterval + 1); + + const treasuryBalanceAfter = await helper.balance.getSubstrate(TREASURY); + expect(Number(treasuryBalanceAfter)).to.be.eqls(Number(treasuryBalanceBefore + blockInflation)); + }); }); --- a/pallets/inflation/Cargo.toml +++ b/pallets/inflation/Cargo.toml @@ -27,6 +27,7 @@ 'sp-std/std', ] try-runtime = ["frame-support/try-runtime"] +fast-inflation = [] [dependencies] parity-scale-codec = { workspace = true } --- a/runtime/common/config/pallets/mod.rs +++ b/runtime/common/config/pallets/mod.rs @@ -101,8 +101,14 @@ type WeightInfo = pallet_balances::weights::SubstrateWeight; } +// every time per how many blocks inflation is applied +#[cfg(feature = "fast-inflation")] +parameter_types! { + pub const InflationBlockInterval: BlockNumber = 10; +} +#[cfg(not(feature = "fast-inflation"))] parameter_types! { - pub const InflationBlockInterval: BlockNumber = 100; // every time per how many blocks inflation is applied + pub const InflationBlockInterval: BlockNumber = 100; } /// Pallet-inflation needs block number in on_initialize, where there is no `validation_data` exists yet --- a/runtime/opal/Cargo.toml +++ b/runtime/opal/Cargo.toml @@ -232,6 +232,7 @@ preimage = [] refungible = [] session-test-timings = [] +fast-inflation = [] ################################################################################ # local dependencies --- a/runtime/quartz/Cargo.toml +++ b/runtime/quartz/Cargo.toml @@ -221,6 +221,7 @@ preimage = [] refungible = [] session-test-timings = [] +fast-inflation = [] ################################################################################ # local dependencies --- a/runtime/unique/Cargo.toml +++ b/runtime/unique/Cargo.toml @@ -224,6 +224,7 @@ preimage = [] refungible = [] session-test-timings = [] +fast-inflation = [] ################################################################################ # local dependencies -- gitstuff