From 67c56fa49efc89772d158fcdcd6e1fea79a99e9a Mon Sep 17 00:00:00 2001 From: kozyrevdev <73348153+kozyrevdev@users.noreply.github.com> Date: Tue, 18 Oct 2022 09:36:05 +0000 Subject: [PATCH] Merge pull request #655 from UniqueNetwork/tests/feed-alices Parallel tests --- --- a/tests/package.json +++ b/tests/package.json @@ -5,11 +5,11 @@ "main": "", "devDependencies": { "@polkadot/ts": "0.4.22", - "@polkadot/typegen": "9.2.2", + "@polkadot/typegen": "9.5.1", "@types/chai": "^4.3.1", "@types/chai-as-promised": "^7.1.5", "@types/chai-like": "^1.1.1", - "@types/mocha": "^9.1.1", + "@types/mocha": "^10.0.0", "@types/node": "^17.0.35", "@typescript-eslint/eslint-plugin": "^5.26.0", "@typescript-eslint/parser": "^5.26.0", @@ -21,34 +21,37 @@ }, "mocha": { "timeout": 9999999, - "require": "ts-node/register" + "require": ["ts-node/register"] }, "scripts": { "lint": "eslint --ext .ts,.js src/", "fix": "eslint --ext .ts,.js src/ --fix", - "test": "mocha --timeout 9999999 -r ts-node/register './src/**/*.test.ts'", - "testEth": "mocha --timeout 9999999 -r ts-node/register './**/eth/**/*.test.ts'", - "testEthMarketplace": "mocha --timeout 9999999 -r ts-node/register './**/eth/marketplace/**/*.test.ts'", - "testEthNesting": "mocha --timeout 9999999 -r ts-node/register './**/eth/nesting/**/*.test.ts'", - "testEthFractionalizer": "mocha --timeout 9999999 -r ts-node/register './**/eth/fractionalizer/**/*.test.ts'", + "setup": "ts-node ./src/util/globalSetup.ts", + + "test": "yarn setup && mocha --timeout 9999999 -r ts-node/register './src/**/*.*test.ts'", + "testParallelFull": "yarn testParallel && yarn testSequential", + "testParallel": "yarn setup && mocha --parallel --timeout 9999999 -r ts-node/register './src/**/*.test.ts'", + "testSequential": "yarn setup && mocha --timeout 9999999 -r ts-node/register './src/**/*.seqtest.ts'", + "testStructure": "yarn setup && mocha --timeout 9999999 -r ts-node/register ./**/nesting/*.*test.ts", + "testEth": "yarn setup && mocha --timeout 9999999 -r ts-node/register './**/eth/**/*.*test.ts'", + "testEthNesting": "yarn setup && mocha --timeout 9999999 -r ts-node/register './**/eth/nesting/**/*.*test.ts'", + "testEthFractionalizer": "yarn setup && mocha --timeout 9999999 -r ts-node/register './**/eth/fractionalizer/**/*.*test.ts'", + "testEthMarketplace": "yarn setup && mocha --timeout 9999999 -r ts-node/register './**/eth/marketplace/**/*.*test.ts'", + "testEvent": "yarn setup && mocha --timeout 9999999 -r ts-node/register ./src/check-event/*.*test.ts", + "testRmrk": "yarn setup && mocha --timeout 9999999 -r ts-node/register ./**/rmrk/*.*test.ts", + "testEthPayable": "mocha --timeout 9999999 -r ts-node/register './**/eth/payable.test.ts'", + "testEthTokenProperties": "mocha --timeout 9999999 -r ts-node/register ./**/eth/tokenProperties.test.ts", "testEvmCoder": "mocha --timeout 9999999 -r ts-node/register './**/eth/evmCoder.test.ts'", - "load": "mocha --timeout 9999999 -r ts-node/register './**/*.load.ts'", - "loadTransfer": "ts-node src/transfer.nload.ts", - "testCollision": "mocha --timeout 9999999 -r ts-node/register ./src/collision-tests/*.test.ts", - "testEvent": "mocha --timeout 9999999 -r ts-node/register ./src/check-event/*.test.ts", "testNesting": "mocha --timeout 9999999 -r ts-node/register ./**/nest.test.ts", "testUnnesting": "mocha --timeout 9999999 -r ts-node/register ./**/unnest.test.ts", - "testStructure": "mocha --timeout 9999999 -r ts-node/register ./**/nesting/**.test.ts", "testProperties": "mocha --timeout 9999999 -r ts-node/register ./**/properties.test.ts ./**/getPropertiesRpc.test.ts", "testMigration": "mocha --timeout 9999999 -r ts-node/register ./**/nesting/migration-check.test.ts", - "testRmrk": "mocha --timeout 9999999 -r ts-node/register ./**/rmrk/**.test.ts", "testAddCollectionAdmin": "mocha --timeout 9999999 -r ts-node/register ./**/addCollectionAdmin.test.ts", - "testSetSchemaVersion": "mocha --timeout 9999999 -r ts-node/register ./**/setSchemaVersion.test.ts", "testSetCollectionLimits": "mocha --timeout 9999999 -r ts-node/register ./**/setCollectionLimits.test.ts", "testChangeCollectionOwner": "mocha --timeout 9999999 -r ts-node/register ./**/change-collection-owner.test.ts", "testSetCollectionSponsor": "mocha --timeout 9999999 -r ts-node/register ./**/setCollectionSponsor.test.ts", - "testConfirmSponsorship": "mocha --timeout 9999999 -r ts-node/register ./**/confirmSponsorship.test.ts", + "testConfirmSponsorship": "mocha --timeout 9999999 --parallel -r ts-node/register ./**/confirmSponsorship.test.ts", "testRemoveCollectionAdmin": "mocha --timeout 9999999 -r ts-node/register ./**/removeCollectionAdmin.test.ts", "testRemoveCollectionSponsor": "mocha --timeout 9999999 -r ts-node/register ./**/removeCollectionSponsor.test.ts", "testAllowLists": "mocha --timeout 9999999 -r ts-node/register ./**/allowLists.test.ts", @@ -78,12 +81,6 @@ "testInflation": "mocha --timeout 9999999 -r ts-node/register ./**/inflation.test.ts", "testScheduler": "mocha --timeout 9999999 -r ts-node/register ./**/scheduler.test.ts", "testSchedulingEVM": "mocha --timeout 9999999 -r ts-node/register ./**/eth/scheduling.test.ts", - "testXcmUnique": "RUN_XCM_TESTS=1 mocha --timeout 9999999 -r ts-node/register ./**/xcm/xcmUnique.test.ts", - "testXcmQuartz": "RUN_XCM_TESTS=1 mocha --timeout 9999999 -r ts-node/register ./**/xcm/xcmQuartz.test.ts", - "testXcmOpal": "RUN_XCM_TESTS=1 mocha --timeout 9999999 -r ts-node/register ./**/xcm/xcmOpal.test.ts", - "testXcmTransferAcala": "mocha --timeout 9999999 -r ts-node/register ./**/xcm/xcmTransferAcala.test.ts acalaId=2000 uniqueId=5000", - "testXcmTransferStatemine": "mocha --timeout 9999999 -r ts-node/register ./**/xcm/xcmTransferStatemine.test.ts statemineId=1000 uniqueId=5000", - "testXcmTransferMoonbeam": "mocha --timeout 9999999 -r ts-node/register ./**/xcm/xcmTransferMoonbeam.test.ts", "testPalletPresence": "mocha --timeout 9999999 -r ts-node/register ./**/pallet-presence.test.ts", "testBlockProduction": "mocha --timeout 9999999 -r ts-node/register ./**/block-production.test.ts", "testEnableDisableTransfers": "mocha --timeout 9999999 -r ts-node/register ./**/enableDisableTransfer.test.ts", @@ -96,7 +93,18 @@ "testFT": "mocha --timeout 9999999 -r ts-node/register ./**/fungible.test.ts", "testEthFT": "mocha --timeout 9999999 -r ts-node/register ./**/eth/fungible.test.ts", "testRPC": "mocha --timeout 9999999 -r ts-node/register ./**/rpc.test.ts", - "testPromotion": "mocha --timeout 9999999 -r ts-node/register ./**/app-promotion.test.ts", + "testPromotion": "yarn setup && mocha --timeout 9999999 -r ts-node/register ./**/app-promotion.test.ts", + + "testXcmUnique": "RUN_XCM_TESTS=1 mocha --timeout 9999999 -r ts-node/register ./**/xcm/xcmUnique.test.ts", + "testXcmQuartz": "RUN_XCM_TESTS=1 mocha --timeout 9999999 -r ts-node/register ./**/xcm/xcmQuartz.test.ts", + "testXcmOpal": "RUN_XCM_TESTS=1 mocha --timeout 9999999 -r ts-node/register ./**/xcm/xcmOpal.test.ts", + "testXcmTransferAcala": "mocha --timeout 9999999 -r ts-node/register ./**/xcm/xcmTransferAcala.test.ts acalaId=2000 uniqueId=5000", + "testXcmTransferStatemine": "mocha --timeout 9999999 -r ts-node/register ./**/xcm/xcmTransferStatemine.test.ts statemineId=1000 uniqueId=5000", + "testXcmTransferMoonbeam": "mocha --timeout 9999999 -r ts-node/register ./**/xcm/xcmTransferMoonbeam.test.ts", + + "load": "mocha --timeout 9999999 -r ts-node/register './**/*.load.ts'", + "loadTransfer": "ts-node src/transfer.nload.ts", + "polkadot-types-fetch-metadata": "curl -H 'Content-Type: application/json' -d '{\"id\":\"1\", \"jsonrpc\":\"2.0\", \"method\": \"state_getMetadata\", \"params\":[]}' http://localhost:9933 > src/interfaces/metadata.json", "polkadot-types-from-defs": "ts-node ./node_modules/.bin/polkadot-types-from-defs --endpoint src/interfaces/metadata.json --input src/interfaces/ --package .", "polkadot-types-from-chain": "ts-node ./node_modules/.bin/polkadot-types-from-chain --endpoint src/interfaces/metadata.json --output src/interfaces/ --package .", @@ -106,14 +114,14 @@ "license": "SEE LICENSE IN ../LICENSE", "homepage": "", "dependencies": { - "@polkadot/api": "9.2.2", - "@polkadot/api-contract": "9.2.2", - "@polkadot/util-crypto": "10.1.7", - "bignumber.js": "^9.0.2", + "@polkadot/api": "9.5.1", + "@polkadot/api-contract": "9.5.1", + "@polkadot/util-crypto": "10.1.10", + "bignumber.js": "^9.1.0", "chai-as-promised": "^7.1.1", "chai-like": "^1.1.1", "find-process": "^1.4.7", - "solc": "0.8.14-fixed", + "solc": "0.8.17", "web3": "^1.7.3" }, "standard": { --- a/tests/src/addCollectionAdmin.test.ts +++ b/tests/src/addCollectionAdmin.test.ts @@ -15,14 +15,14 @@ // along with Unique Network. If not, see . import {IKeyringPair} from '@polkadot/types/types'; -import {itSub, usingPlaygrounds, expect} from './util/playgrounds'; +import {itSub, usingPlaygrounds, expect} from './util'; describe('Integration Test addCollectionAdmin(collection_id, new_admin_id):', () => { let donor: IKeyringPair; before(async () => { - await usingPlaygrounds(async (_, privateKeyWrapper) => { - donor = privateKeyWrapper('//Alice'); + await usingPlaygrounds(async (_, privateKey) => { + donor = await privateKey({filename: __filename}); }); }); @@ -44,8 +44,8 @@ let donor: IKeyringPair; before(async () => { - await usingPlaygrounds(async (_, privateKeyWrapper) => { - donor = privateKeyWrapper('//Alice'); + await usingPlaygrounds(async (_, privateKey) => { + donor = await privateKey({filename: __filename}); }); }); --- a/tests/src/adminTransferAndBurn.test.ts +++ b/tests/src/adminTransferAndBurn.test.ts @@ -15,7 +15,7 @@ // along with Unique Network. If not, see . import {IKeyringPair} from '@polkadot/types/types'; -import {usingPlaygrounds, expect, itSub} from './util/playgrounds'; +import {usingPlaygrounds, expect, itSub} from './util'; describe('Integration Test: ownerCanTransfer allows admins to use only transferFrom/burnFrom:', () => { let alice: IKeyringPair; @@ -24,7 +24,7 @@ before(async () => { await usingPlaygrounds(async (helper, privateKey) => { - const donor = privateKey('//Alice'); + const donor = await privateKey({filename: __filename}); [alice, bob, charlie] = await helper.arrange.createAccounts([10n, 10n, 10n], donor); }); }); --- a/tests/src/allowLists.test.ts +++ b/tests/src/allowLists.test.ts @@ -15,7 +15,7 @@ // along with Unique Network. If not, see . import {IKeyringPair} from '@polkadot/types/types'; -import {usingPlaygrounds, expect, itSub} from './util/playgrounds'; +import {usingPlaygrounds, expect, itSub} from './util'; import {ICollectionPermissions} from './util/playgrounds/types'; describe('Integration Test ext. Allow list tests', () => { @@ -25,7 +25,7 @@ before(async () => { await usingPlaygrounds(async (helper, privateKey) => { - const donor = privateKey('//Alice'); + const donor = await privateKey({filename: __filename}); [alice, bob, charlie] = await helper.arrange.createAccounts([30n, 10n, 10n], donor); }); }); @@ -87,7 +87,7 @@ before(async () => { await usingPlaygrounds(async (helper, privateKey) => { - const donor = privateKey('//Alice'); + const donor = await privateKey({filename: __filename}); [alice, bob, charlie] = await helper.arrange.createAccounts([30n, 10n, 10n], donor); }); }); @@ -163,7 +163,7 @@ before(async () => { await usingPlaygrounds(async (helper, privateKey) => { - const donor = privateKey('//Alice'); + const donor = await privateKey({filename: __filename}); [alice, bob, charlie] = await helper.arrange.createAccounts([30n, 10n, 10n], donor); }); }); @@ -291,7 +291,7 @@ before(async () => { await usingPlaygrounds(async (helper, privateKey) => { - const donor = privateKey('//Alice'); + const donor = await privateKey({filename: __filename}); [alice, bob] = await helper.arrange.createAccounts([100n, 100n], donor); }); }); --- /dev/null +++ b/tests/src/app-promotion.seqtest.ts @@ -0,0 +1,82 @@ +// Copyright 2019-2022 Unique Network (Gibraltar) Ltd. +// This file is part of Unique Network. + +// Unique Network is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Unique Network is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Unique Network. If not, see . + +import {IKeyringPair} from '@polkadot/types/types'; +import {itSub, usingPlaygrounds, Pallets, requirePalletsOrSkip} from './util'; +import {expect} from './eth/util'; + +let superuser: IKeyringPair; +let donor: IKeyringPair; +let palletAdmin: IKeyringPair; + +describe('App promotion', () => { + before(async function () { + await usingPlaygrounds(async (helper, privateKey) => { + requirePalletsOrSkip(this, helper, [Pallets.AppPromotion]); + superuser = await privateKey('//Alice'); + donor = await privateKey({filename: __filename}); + palletAdmin = await privateKey('//PromotionAdmin'); + const api = helper.getApi(); + await helper.signTransaction(superuser, api.tx.sudo.sudo(api.tx.appPromotion.setAdminAddress({Substrate: palletAdmin.address}))); + }); + }); + + after(async function () { + await usingPlaygrounds(async (helper) => { + if (helper.fetchMissingPalletNames([Pallets.AppPromotion]).length != 0) return; + const api = helper.getApi(); + await helper.signTransaction(superuser, api.tx.sudo.sudo(api.tx.appPromotion.setAdminAddress({Substrate: palletAdmin.address}))); + }); + }); + + describe('admin adress', () => { + itSub('can be set by sudo only', async ({helper}) => { + const api = helper.getApi(); + const [nonAdmin] = await helper.arrange.createAccounts([10n], donor); + // nonAdmin can not set admin not from himself nor as a sudo + await expect(helper.signTransaction(nonAdmin, api.tx.appPromotion.setAdminAddress({Substrate: nonAdmin.address}))).to.be.rejected; + await expect(helper.signTransaction(nonAdmin, api.tx.sudo.sudo(api.tx.appPromotion.setAdminAddress({Substrate: nonAdmin.address})))).to.be.rejected; + }); + + itSub('can be any valid CrossAccountId', async ({helper}) => { + // We are not going to set an eth address as a sponsor, + // but we do want to check, it doesn't break anything; + const api = helper.getApi(); + const [account] = await helper.arrange.createAccounts([10n], donor); + const ethAccount = helper.address.substrateToEth(account.address); + // Alice sets Ethereum address as a sudo. Then Substrate address back... + await expect(helper.signTransaction(superuser, api.tx.sudo.sudo(api.tx.appPromotion.setAdminAddress({Ethereum: ethAccount})))).to.be.fulfilled; + await expect(helper.signTransaction(superuser, api.tx.sudo.sudo(api.tx.appPromotion.setAdminAddress({Substrate: palletAdmin.address})))).to.be.fulfilled; + + // ...It doesn't break anything; + const collection = await helper.nft.mintCollection(account, {name: 'New', description: 'New Collection', tokenPrefix: 'Promotion'}); + await expect(helper.signTransaction(account, api.tx.appPromotion.sponsorCollection(collection.collectionId))).to.be.rejected; + }); + + itSub('can be reassigned', async ({helper}) => { + const api = helper.getApi(); + const [oldAdmin, newAdmin, collectionOwner] = await helper.arrange.createAccounts([10n, 10n, 10n], donor); + const collection = await helper.nft.mintCollection(collectionOwner, {name: 'New', description: 'New Collection', tokenPrefix: 'Promotion'}); + + await expect(helper.signTransaction(superuser, api.tx.sudo.sudo(api.tx.appPromotion.setAdminAddress({Substrate: oldAdmin.address})))).to.be.fulfilled; + await expect(helper.signTransaction(superuser, api.tx.sudo.sudo(api.tx.appPromotion.setAdminAddress({Substrate: newAdmin.address})))).to.be.fulfilled; + await expect(helper.signTransaction(oldAdmin, api.tx.appPromotion.sponsorCollection(collection.collectionId))).to.be.rejected; + + await expect(helper.signTransaction(newAdmin, api.tx.appPromotion.sponsorCollection(collection.collectionId))).to.be.fulfilled; + }); + }); +}); + --- a/tests/src/app-promotion.test.ts +++ b/tests/src/app-promotion.test.ts @@ -15,17 +15,15 @@ // along with Unique Network. If not, see . import {IKeyringPair} from '@polkadot/types/types'; -import {itSub, usingPlaygrounds, Pallets, requirePalletsOrSkip} from './util/playgrounds'; -import {encodeAddress} from '@polkadot/util-crypto'; -import {stringToU8a} from '@polkadot/util'; +import {itSub, usingPlaygrounds, Pallets, requirePalletsOrSkip} from './util'; import {DevUniqueHelper} from './util/playgrounds/unique.dev'; -import {itEth, expect, SponsoringMode} from './eth/util/playgrounds'; +import {itEth, expect, SponsoringMode} from './eth/util'; -let alice: IKeyringPair; +let donor: IKeyringPair; let palletAdmin: IKeyringPair; let nominal: bigint; -const palletAddress = calculatePalleteAddress('appstake'); -let accounts: IKeyringPair[] = []; +let palletAddress: string; +let accounts: IKeyringPair[]; const LOCKING_PERIOD = 20n; // 20 blocks of relay const UNLOCKING_PERIOD = 10n; // 10 blocks of parachain const rewardAvailableInBlock = (stakedInBlock: bigint) => { @@ -37,14 +35,11 @@ before(async function () { await usingPlaygrounds(async (helper, privateKey) => { requirePalletsOrSkip(this, helper, [Pallets.AppPromotion]); - alice = privateKey('//Alice'); - palletAdmin = privateKey('//Charlie'); // TODO use custom address - const api = helper.getApi(); - await helper.signTransaction(alice, api.tx.sudo.sudo(api.tx.appPromotion.setAdminAddress({Substrate: palletAdmin.address}))); + donor = await privateKey({filename: __filename}); + palletAddress = helper.arrange.calculatePalletAddress('appstake'); + palletAdmin = await privateKey('//PromotionAdmin'); nominal = helper.balance.getOneTokenNominal(); - await helper.balance.transferToSubstrate(alice, palletAdmin.address, 1000n * nominal); - await helper.balance.transferToSubstrate(alice, palletAddress, 1000n * nominal); - accounts = await helper.arrange.createCrowd(100, 1000n, alice); // create accounts-pool to speed up tests + accounts = await helper.arrange.createCrowd(100, 1000n, donor); // create accounts-pool to speed up tests }); }); @@ -76,7 +71,7 @@ }); itSub('should allow to create maximum 10 stakes for account', async ({helper}) => { - const [staker] = await helper.arrange.createAccounts([2000n], alice); + const [staker] = await helper.arrange.createAccounts([2000n], donor); for (let i = 0; i < 10; i++) { await helper.staking.stake(staker, 100n * nominal); } @@ -144,7 +139,7 @@ expect(await helper.balance.getSubstrate(staker.address) / nominal).to.be.equal(999n); // staker can transfer: - await helper.balance.transferToSubstrate(staker, alice.address, 998n * nominal); + await helper.balance.transferToSubstrate(staker, donor.address, 998n * nominal); expect(await helper.balance.getSubstrate(staker.address) / nominal).to.be.equal(1n); }); @@ -224,55 +219,7 @@ }); }); - describe('admin adress', () => { - itSub('can be set by sudo only', async ({helper}) => { - const api = helper.getApi(); - const nonAdmin = accounts.pop()!; - // nonAdmin can not set admin not from himself nor as a sudo - await expect(helper.signTransaction(nonAdmin, api.tx.appPromotion.setAdminAddress({Substrate: nonAdmin.address}))).to.be.rejected; - await expect(helper.signTransaction(nonAdmin, api.tx.sudo.sudo(api.tx.appPromotion.setAdminAddress({Substrate: nonAdmin.address})))).to.be.rejected; - - // Alice can - await expect(helper.signTransaction(alice, api.tx.sudo.sudo(api.tx.appPromotion.setAdminAddress({Substrate: palletAdmin.address})))).to.be.fulfilled; - }); - - itSub('can be any valid CrossAccountId', async ({helper}) => { - // We are not going to set an eth address as a sponsor, - // but we do want to check, it doesn't break anything; - const api = helper.getApi(); - const account = accounts.pop()!; - const ethAccount = helper.address.substrateToEth(account.address); - // Alice sets Ethereum address as a sudo. Then Substrate address back... - await expect(helper.signTransaction(alice, api.tx.sudo.sudo(api.tx.appPromotion.setAdminAddress({Ethereum: ethAccount})))).to.be.fulfilled; - await expect(helper.signTransaction(alice, api.tx.sudo.sudo(api.tx.appPromotion.setAdminAddress({Substrate: palletAdmin.address})))).to.be.fulfilled; - - // ...It doesn't break anything; - const collection = await helper.nft.mintCollection(account, {name: 'New', description: 'New Collection', tokenPrefix: 'Promotion'}); - await expect(helper.signTransaction(account, api.tx.appPromotion.sponsorCollection(collection.collectionId))).to.be.rejected; - }); - - itSub('can be reassigned', async ({helper}) => { - const api = helper.getApi(); - const [oldAdmin, newAdmin, collectionOwner] = [accounts.pop()!, accounts.pop()!, accounts.pop()!]; - const collection = await helper.nft.mintCollection(collectionOwner, {name: 'New', description: 'New Collection', tokenPrefix: 'Promotion'}); - - await expect(helper.signTransaction(alice, api.tx.sudo.sudo(api.tx.appPromotion.setAdminAddress({Substrate: oldAdmin.address})))).to.be.fulfilled; - await expect(helper.signTransaction(alice, api.tx.sudo.sudo(api.tx.appPromotion.setAdminAddress({Substrate: newAdmin.address})))).to.be.fulfilled; - await expect(helper.signTransaction(oldAdmin, api.tx.appPromotion.sponsorCollection(collection.collectionId))).to.be.rejected; - - await expect(helper.signTransaction(newAdmin, api.tx.appPromotion.sponsorCollection(collection.collectionId))).to.be.fulfilled; - }); - }); - describe('collection sponsoring', () => { - before(async function () { - await usingPlaygrounds(async (helper) => { - const api = helper.getApi(); - const tx = api.tx.sudo.sudo(api.tx.appPromotion.setAdminAddress({Substrate: palletAdmin.address})); - await helper.signTransaction(alice, tx); - }); - }); - itSub('should actually sponsor transactions', async ({helper}) => { const api = helper.getApi(); const [collectionOwner, tokenSender, receiver] = [accounts.pop()!, accounts.pop()!, accounts.pop()!]; @@ -343,7 +290,7 @@ itSub('should not overwrite collection limits set by the owner earlier', async ({helper}) => { const api = helper.getApi(); const limits = {ownerCanDestroy: true, ownerCanTransfer: true, sponsorTransferTimeout: 0}; - const collectionWithLimits = await helper.nft.mintCollection(alice, {name: 'New', description: 'New Collection', tokenPrefix: 'Promotion', limits}); + const collectionWithLimits = await helper.nft.mintCollection(accounts.pop()!, {name: 'New', description: 'New Collection', tokenPrefix: 'Promotion', limits}); await expect(helper.signTransaction(palletAdmin, api.tx.appPromotion.sponsorCollection(collectionWithLimits.collectionId))).to.be.fulfilled; expect((await collectionWithLimits.getData())?.raw.limits).to.be.deep.contain(limits); @@ -416,7 +363,7 @@ describe('contract sponsoring', () => { itEth('should set palletes address as a sponsor', async ({helper}) => { - const contractOwner = (await helper.eth.createAccountWithBalance(alice, 1000n)).toLowerCase(); + const contractOwner = (await helper.eth.createAccountWithBalance(donor, 1000n)).toLowerCase(); const flipper = await helper.eth.deployFlipper(contractOwner); // await deployFlipper(web3, contractOwner); const contractHelper = helper.ethNativeContract.contractHelpers(contractOwner); @@ -432,7 +379,7 @@ }); itEth('should overwrite sponsoring mode and existed sponsor', async ({helper}) => { - const contractOwner = (await helper.eth.createAccountWithBalance(alice, 1000n)).toLowerCase(); + const contractOwner = (await helper.eth.createAccountWithBalance(donor, 1000n)).toLowerCase(); const flipper = await helper.eth.deployFlipper(contractOwner); // await deployFlipper(web3, contractOwner); const contractHelper = helper.ethNativeContract.contractHelpers(contractOwner); @@ -459,7 +406,7 @@ }); itEth('can be overwritten by contract owner', async ({helper}) => { - const contractOwner = (await helper.eth.createAccountWithBalance(alice, 1000n)).toLowerCase(); + const contractOwner = (await helper.eth.createAccountWithBalance(donor, 1000n)).toLowerCase(); const flipper = await helper.eth.deployFlipper(contractOwner); // await deployFlipper(web3, contractOwner); const contractHelper = helper.ethNativeContract.contractHelpers(contractOwner); @@ -480,7 +427,7 @@ itEth('can not be set by non admin', async ({helper}) => { const nonAdmin = accounts.pop()!; - const contractOwner = (await helper.eth.createAccountWithBalance(alice, 1000n)).toLowerCase(); + const contractOwner = (await helper.eth.createAccountWithBalance(donor, 1000n)).toLowerCase(); const flipper = await helper.eth.deployFlipper(contractOwner); // await deployFlipper(web3, contractOwner); const contractHelper = helper.ethNativeContract.contractHelpers(contractOwner); @@ -499,18 +446,18 @@ itEth('should actually sponsor transactions', async ({helper}) => { // Contract caller - const caller = await helper.eth.createAccountWithBalance(alice, 1000n); + const caller = await helper.eth.createAccountWithBalance(donor, 1000n); const palletBalanceBefore = await helper.balance.getSubstrate(palletAddress); // Deploy flipper - const contractOwner = (await helper.eth.createAccountWithBalance(alice, 1000n)).toLowerCase(); + const contractOwner = (await helper.eth.createAccountWithBalance(donor, 1000n)).toLowerCase(); const flipper = await helper.eth.deployFlipper(contractOwner); // await deployFlipper(web3, contractOwner); const contractHelper = helper.ethNativeContract.contractHelpers(contractOwner); // Owner sets to sponsor every tx await contractHelper.methods.setSponsoringRateLimit(flipper.options.address, 0).send({from: contractOwner}); await contractHelper.methods.setSponsoringMode(flipper.options.address, SponsoringMode.Generous).send({from: contractOwner}); - await helper.eth.transferBalanceFromSubstrate(alice, flipper.options.address, 1000n); // transferBalanceToEth(api, alice, flipper.options.address, 1000n); + await helper.eth.transferBalanceFromSubstrate(donor, flipper.options.address, 1000n); // transferBalanceToEth(api, alice, flipper.options.address, 1000n); // Set promotion to the Flipper await helper.executeExtrinsic(palletAdmin, 'api.tx.appPromotion.sponsorContract', [flipper.options.address], true); @@ -533,10 +480,10 @@ describe('stopSponsoringContract', () => { itEth('should remove pallet address from contract sponsors', async ({helper}) => { - const caller = await helper.eth.createAccountWithBalance(alice, 1000n); - const contractOwner = (await helper.eth.createAccountWithBalance(alice, 1000n)).toLowerCase(); + const caller = await helper.eth.createAccountWithBalance(donor, 1000n); + const contractOwner = (await helper.eth.createAccountWithBalance(donor, 1000n)).toLowerCase(); const flipper = await helper.eth.deployFlipper(contractOwner); - await helper.eth.transferBalanceFromSubstrate(alice, flipper.options.address); + await helper.eth.transferBalanceFromSubstrate(donor, flipper.options.address); const contractHelper = helper.ethNativeContract.contractHelpers(contractOwner); await contractHelper.methods.setSponsoringMode(flipper.options.address, SponsoringMode.Generous).send({from: contractOwner}); @@ -557,12 +504,12 @@ // caller payed for call expect(1000n * nominal > callerBalance).to.be.true; - expect(contractBalanceAfter).to.be.equal(1000n * nominal); + expect(contractBalanceAfter).to.be.equal(100n * nominal); }); itEth('can not be called by non-admin', async ({helper}) => { const nonAdmin = accounts.pop()!; - const contractOwner = (await helper.eth.createAccountWithBalance(alice, 1000n)).toLowerCase(); + const contractOwner = (await helper.eth.createAccountWithBalance(donor, 1000n)).toLowerCase(); const flipper = await helper.eth.deployFlipper(contractOwner); await helper.executeExtrinsic(palletAdmin, 'api.tx.appPromotion.sponsorContract', [flipper.options.address]); @@ -572,7 +519,7 @@ itEth('should not affect a contract which is not sponsored by pallete', async ({helper}) => { const nonAdmin = accounts.pop()!; - const contractOwner = (await helper.eth.createAccountWithBalance(alice, 1000n)).toLowerCase(); + const contractOwner = (await helper.eth.createAccountWithBalance(donor, 1000n)).toLowerCase(); const flipper = await helper.eth.deployFlipper(contractOwner); const contractHelper = helper.ethNativeContract.contractHelpers(contractOwner); await expect(contractHelper.methods.selfSponsoredEnable(flipper.options.address).send()).to.be.fulfilled; @@ -613,7 +560,7 @@ await helper.staking.stake(staker, 200n * nominal); // wait rewards are available: - const [_, stake2] = await helper.staking.getTotalStakedPerBlock({Substrate: staker.address}); + const [_stake1, stake2] = await helper.staking.getTotalStakedPerBlock({Substrate: staker.address}); await helper.wait.forRelayBlockNumber(rewardAvailableInBlock(stake2.block)); const payoutToStaker = (await helper.admin.payoutStakers(palletAdmin, 100)).find((payout) => payout.staker === staker.address)?.payout; @@ -678,7 +625,7 @@ itSub.skip('can be paid 1000 rewards in a time', async ({helper}) => { // all other stakes should be unstaked - const oneHundredStakers = await helper.arrange.createCrowd(100, 1050n, alice); + const oneHundredStakers = await helper.arrange.createCrowd(100, 1050n, donor); // stakers stakes 10 times each for (let i = 0; i < 10; i++) { @@ -689,7 +636,6 @@ }); itSub.skip('can handle 40.000 rewards', async ({helper}) => { - const [donor] = await helper.arrange.createAccounts([7_000_000n], alice); const crowdStakes = async () => { // each account in the crowd stakes 2 times const crowd = await helper.arrange.createCrowd(500, 300n, donor); @@ -706,11 +652,6 @@ }); }); }); - -function calculatePalleteAddress(palletId: any) { - const address = stringToU8a(('modl' + palletId).padEnd(32, '\0')); - return encodeAddress(address); -} function calculateIncome(base: bigint, calcPeriod: bigint, iter = 0): bigint { const DAY = 7200n; --- a/tests/src/approve.test.ts +++ b/tests/src/approve.test.ts @@ -15,7 +15,7 @@ // along with Unique Network. If not, see . import {IKeyringPair} from '@polkadot/types/types'; -import {expect, itSub, Pallets, usingPlaygrounds} from './util/playgrounds'; +import {expect, itSub, Pallets, usingPlaygrounds} from './util'; describe('Integration Test approve(spender, collection_id, item_id, amount):', () => { @@ -25,7 +25,7 @@ before(async () => { await usingPlaygrounds(async (helper, privateKey) => { - const donor = privateKey('//Alice'); + const donor = await privateKey({filename: __filename}); [alice, bob, charlie] = await helper.arrange.createAccounts([100n, 100n, 100n], donor); }); }); @@ -104,7 +104,7 @@ before(async () => { await usingPlaygrounds(async (helper, privateKey) => { - const donor = privateKey('//Alice'); + const donor = await privateKey({filename: __filename}); [alice, bob, charlie] = await helper.arrange.createAccounts([100n, 100n, 100n], donor); }); }); @@ -141,7 +141,7 @@ before(async () => { await usingPlaygrounds(async (helper, privateKey) => { - const donor = privateKey('//Alice'); + const donor = await privateKey({filename: __filename}); [alice, bob, charlie] = await helper.arrange.createAccounts([100n, 100n, 100n], donor); }); }); @@ -184,7 +184,7 @@ before(async () => { await usingPlaygrounds(async (helper, privateKey) => { - const donor = privateKey('//Alice'); + const donor = await privateKey({filename: __filename}); [alice, bob, charlie] = await helper.arrange.createAccounts([100n, 100n, 100n], donor); }); }); @@ -227,7 +227,7 @@ }); }); -describe('Approved amount decreases by the transferred amount.:', () => { +describe('Approved amount decreases by the transferred amount:', () => { let alice: IKeyringPair; let bob: IKeyringPair; let charlie: IKeyringPair; @@ -235,7 +235,7 @@ before(async () => { await usingPlaygrounds(async (helper, privateKey) => { - const donor = privateKey('//Alice'); + const donor = await privateKey({filename: __filename}); [alice, bob, charlie, dave] = await helper.arrange.createAccounts([100n, 100n, 100n, 100n], donor); }); }); @@ -265,7 +265,7 @@ before(async () => { await usingPlaygrounds(async (helper, privateKey) => { - const donor = privateKey('//Alice'); + const donor = await privateKey({filename: __filename}); [alice, bob, charlie] = await helper.arrange.createAccounts([100n, 100n, 100n], donor); }); }); @@ -320,7 +320,7 @@ before(async () => { await usingPlaygrounds(async (helper, privateKey) => { - const donor = privateKey('//Alice'); + const donor = await privateKey({filename: __filename}); [alice, bob, charlie] = await helper.arrange.createAccounts([100n, 100n, 100n], donor); }); }); @@ -357,7 +357,7 @@ before(async () => { await usingPlaygrounds(async (helper, privateKey) => { - const donor = privateKey('//Alice'); + const donor = await privateKey({filename: __filename}); [alice, bob, charlie, dave] = await helper.arrange.createAccounts([100n, 100n, 100n, 100n], donor); }); }); @@ -423,7 +423,7 @@ before(async () => { await usingPlaygrounds(async (helper, privateKey) => { - const donor = privateKey('//Alice'); + const donor = await privateKey({filename: __filename}); [alice, bob, charlie, dave] = await helper.arrange.createAccounts([100n, 100n, 100n, 100n], donor); }); }); @@ -474,7 +474,7 @@ before(async () => { await usingPlaygrounds(async (helper, privateKey) => { - const donor = privateKey('//Alice'); + const donor = await privateKey({filename: __filename}); [alice, bob, charlie] = await helper.arrange.createAccounts([100n, 100n, 100n], donor); }); }); @@ -495,7 +495,7 @@ before(async () => { await usingPlaygrounds(async (helper, privateKey) => { - const donor = privateKey('//Alice'); + const donor = await privateKey({filename: __filename}); [alice, bob, charlie] = await helper.arrange.createAccounts([100n, 100n, 100n], donor); }); }); --- a/tests/src/block-production.test.ts +++ b/tests/src/block-production.test.ts @@ -15,7 +15,7 @@ // along with Unique Network. If not, see . import {ApiPromise} from '@polkadot/api'; -import {expect, itSub} from './util/playgrounds'; +import {expect, itSub} from './util'; const BLOCK_TIME_MS = 12000; const TOLERANCE_MS = 3000; --- a/tests/src/burnItem.test.ts +++ b/tests/src/burnItem.test.ts @@ -15,7 +15,7 @@ // along with Unique Network. If not, see . import {IKeyringPair} from '@polkadot/types/types'; -import {expect, itSub, Pallets, usingPlaygrounds} from './util/playgrounds'; +import {expect, itSub, Pallets, usingPlaygrounds} from './util'; describe('integration test: ext. burnItem():', () => { @@ -25,7 +25,7 @@ before(async () => { await usingPlaygrounds(async (helper, privateKey) => { - donor = privateKey('//Alice'); + donor = await privateKey({filename: __filename}); [alice, bob] = await helper.arrange.createAccounts([100n, 100n], donor); }); }); @@ -80,7 +80,7 @@ before(async () => { await usingPlaygrounds(async (helper, privateKey) => { - donor = privateKey('//Alice'); + donor = await privateKey({filename: __filename}); [alice, bob] = await helper.arrange.createAccounts([100n, 100n], donor); }); }); @@ -123,7 +123,7 @@ before(async () => { await usingPlaygrounds(async (helper, privateKey) => { - donor = privateKey('//Alice'); + donor = await privateKey({filename: __filename}); [alice, bob] = await helper.arrange.createAccounts([100n, 100n], donor); }); }); --- a/tests/src/calibrate.ts +++ b/tests/src/calibrate.ts @@ -1,6 +1,6 @@ import {IKeyringPair} from '@polkadot/types/types'; -import {usingEthPlaygrounds, EthUniqueHelper} from './eth/util/playgrounds'; +import {usingEthPlaygrounds, EthUniqueHelper} from './eth/util'; function linearRegression(points: { x: bigint, y: bigint }[]) { @@ -56,9 +56,9 @@ }).reduce((a, b) => a + b, 0n) / BigInt(points.length)); } -async function calibrateWeightToFee(helper: EthUniqueHelper, privateKey: (account: string) => IKeyringPair) { - const alice = privateKey('//Alice'); - const bob = privateKey('//Bob'); +async function calibrateWeightToFee(helper: EthUniqueHelper, privateKey: (account: string) => Promise) { + const alice = await privateKey('//Alice'); + const bob = await privateKey('//Bob'); const dataPoints = []; { @@ -106,8 +106,8 @@ } } -async function calibrateMinGasPrice(helper: EthUniqueHelper, privateKey: (account: string) => IKeyringPair) { - const alice = privateKey('//Alice'); +async function calibrateMinGasPrice(helper: EthUniqueHelper, privateKey: (account: string) => Promise) { + const alice = await privateKey('//Alice'); const caller = await helper.eth.createAccountWithBalance(alice); const receiver = helper.eth.createAccount(); const dataPoints = []; --- a/tests/src/change-collection-owner.test.ts +++ b/tests/src/change-collection-owner.test.ts @@ -15,7 +15,7 @@ // along with Unique Network. If not, see . import {IKeyringPair} from '@polkadot/types/types'; -import {usingPlaygrounds, expect, itSub} from './util/playgrounds'; +import {usingPlaygrounds, expect, itSub} from './util'; describe('Integration Test changeCollectionOwner(collection_id, new_owner):', () => { let alice: IKeyringPair; @@ -23,7 +23,7 @@ before(async () => { await usingPlaygrounds(async (helper, privateKey) => { - const donor = privateKey('//Alice'); + const donor = await privateKey({filename: __filename}); [alice, bob] = await helper.arrange.createAccounts([100n, 100n], donor); }); }); @@ -46,7 +46,7 @@ before(async () => { await usingPlaygrounds(async (helper, privateKey) => { - const donor = privateKey('//Alice'); + const donor = await privateKey({filename: __filename}); [alice, bob, charlie] = await helper.arrange.createAccounts([100n, 100n, 100n], donor); }); }); @@ -108,7 +108,7 @@ before(async () => { await usingPlaygrounds(async (helper, privateKey) => { - const donor = privateKey('//Alice'); + const donor = await privateKey({filename: __filename}); [alice, bob, charlie] = await helper.arrange.createAccounts([100n, 100n, 100n], donor); }); }); --- a/tests/src/check-event/burnItemEvent.test.ts +++ b/tests/src/check-event/burnItemEvent.test.ts @@ -16,7 +16,7 @@ // https://unique-network.readthedocs.io/en/latest/jsapi.html#setchainlimits import {IKeyringPair} from '@polkadot/types/types'; -import {usingPlaygrounds, expect, itSub} from '../util/playgrounds'; +import {usingPlaygrounds, expect, itSub} from '../util'; import {IEvent} from '../util/playgrounds/types'; @@ -24,7 +24,7 @@ let alice: IKeyringPair; before(async () => { await usingPlaygrounds(async (helper, privateKey) => { - const donor = privateKey('//Alice'); + const donor = await privateKey({filename: __filename}); [alice] = await helper.arrange.createAccounts([10n], donor); }); }); --- a/tests/src/check-event/createCollectionEvent.test.ts +++ b/tests/src/check-event/createCollectionEvent.test.ts @@ -16,14 +16,14 @@ // https://unique-network.readthedocs.io/en/latest/jsapi.html#setchainlimits import {IKeyringPair} from '@polkadot/types/types'; -import {usingPlaygrounds, itSub, expect} from '../util/playgrounds'; +import {usingPlaygrounds, itSub, expect} from '../util'; import {IEvent} from '../util/playgrounds/types'; describe('Create collection event ', () => { let alice: IKeyringPair; before(async () => { await usingPlaygrounds(async (helper, privateKey) => { - const donor = privateKey('//Alice'); + const donor = await privateKey({filename: __filename}); [alice] = await helper.arrange.createAccounts([10n], donor); }); }); --- a/tests/src/check-event/createItemEvent.test.ts +++ b/tests/src/check-event/createItemEvent.test.ts @@ -16,14 +16,14 @@ // https://unique-network.readthedocs.io/en/latest/jsapi.html#setchainlimits import {IKeyringPair} from '@polkadot/types/types'; -import {itSub, usingPlaygrounds, expect} from '../util/playgrounds'; +import {itSub, usingPlaygrounds, expect} from '../util'; import {IEvent} from '../util/playgrounds/types'; describe('Create Item event ', () => { let alice: IKeyringPair; before(async () => { await usingPlaygrounds(async (helper, privateKey) => { - const donor = privateKey('//Alice'); + const donor = await privateKey({filename: __filename}); [alice] = await helper.arrange.createAccounts([10n], donor); }); }); --- a/tests/src/check-event/createMultipleItemsEvent.test.ts +++ b/tests/src/check-event/createMultipleItemsEvent.test.ts @@ -16,14 +16,14 @@ // https://unique-network.readthedocs.io/en/latest/jsapi.html#setchainlimits import {IKeyringPair} from '@polkadot/types/types'; -import {usingPlaygrounds, itSub, expect} from '../util/playgrounds'; +import {usingPlaygrounds, itSub, expect} from '../util'; import {IEvent} from '../util/playgrounds/types'; describe('Create Multiple Items Event event ', () => { let alice: IKeyringPair; before(async () => { await usingPlaygrounds(async (helper, privateKey) => { - const donor = privateKey('//Alice'); + const donor = await privateKey({filename: __filename}); [alice] = await helper.arrange.createAccounts([10n], donor); }); }); --- a/tests/src/check-event/destroyCollectionEvent.test.ts +++ b/tests/src/check-event/destroyCollectionEvent.test.ts @@ -16,14 +16,14 @@ // https://unique-network.readthedocs.io/en/latest/jsapi.html#setchainlimits import {IKeyringPair} from '@polkadot/types/types'; -import {itSub, usingPlaygrounds, expect} from '../util/playgrounds'; +import {itSub, usingPlaygrounds, expect} from '../util'; import {IEvent} from '../util/playgrounds/types'; describe('Destroy collection event ', () => { let alice: IKeyringPair; before(async () => { await usingPlaygrounds(async (helper, privateKey) => { - const donor = privateKey('//Alice'); + const donor = await privateKey({filename: __filename}); [alice] = await helper.arrange.createAccounts([10n], donor); }); }); --- a/tests/src/check-event/transferEvent.test.ts +++ b/tests/src/check-event/transferEvent.test.ts @@ -16,7 +16,7 @@ // https://unique-network.readthedocs.io/en/latest/jsapi.html#setchainlimits import {IKeyringPair} from '@polkadot/types/types'; -import {usingPlaygrounds, expect, itSub} from '../util/playgrounds'; +import {usingPlaygrounds, expect, itSub} from '../util'; import {IEvent} from '../util/playgrounds/types'; describe('Transfer event ', () => { @@ -25,7 +25,7 @@ before(async () => { await usingPlaygrounds(async (helper, privateKey) => { - const donor = privateKey('//Alice'); + const donor = await privateKey({filename: __filename}); [alice, bob] = await helper.arrange.createAccounts([10n, 10n], donor); }); }); --- a/tests/src/check-event/transferFromEvent.test.ts +++ b/tests/src/check-event/transferFromEvent.test.ts @@ -16,7 +16,7 @@ // https://unique-network.readthedocs.io/en/latest/jsapi.html#setchainlimits import {IKeyringPair} from '@polkadot/types/types'; -import {usingPlaygrounds, expect, itSub} from '../util/playgrounds'; +import {usingPlaygrounds, expect, itSub} from '../util'; import {IEvent} from '../util/playgrounds/types'; describe('Transfer event ', () => { @@ -24,7 +24,7 @@ let bob: IKeyringPair; before(async () => { await usingPlaygrounds(async (helper, privateKey) => { - const donor = privateKey('//Alice'); + const donor = await privateKey({filename: __filename}); [alice, bob] = await helper.arrange.createAccounts([10n, 10n], donor); }); }); --- a/tests/src/confirmSponsorship.test.ts +++ b/tests/src/confirmSponsorship.test.ts @@ -15,7 +15,7 @@ // along with Unique Network. If not, see . import {IKeyringPair} from '@polkadot/types/types'; -import {usingPlaygrounds, expect, itSub, Pallets} from './util/playgrounds'; +import {usingPlaygrounds, expect, itSub, Pallets} from './util'; async function setSponsorHelper(collection: any, signer: IKeyringPair, sponsorAddress: string) { await collection.setSponsor(signer, sponsorAddress); @@ -37,7 +37,7 @@ before(async () => { await usingPlaygrounds(async (helper, privateKey) => { - const donor = privateKey('//Alice'); + const donor = await privateKey({filename: __filename}); [alice, bob, charlie, zeroBalance] = await helper.arrange.createAccounts([100n, 100n, 100n, 0n], donor); }); }); @@ -73,7 +73,7 @@ }); itSub('Fungible: Transfer fees are paid by the sponsor after confirmation', async ({helper}) => { - const collection = await helper.ft.mintCollection(alice, {name: 'col', description: 'descr', tokenPrefix: 'COL'}, 0); + const collection = await helper.ft.mintCollection(alice, {name: 'col', description: 'descr', tokenPrefix: 'COL'}); await collection.setSponsor(alice, bob.address); await collection.confirmSponsorship(bob); const bobBalanceBefore = await helper.balance.getSubstrate(bob.address); @@ -109,7 +109,9 @@ }); itSub('NFT: Sponsoring of transfers is rate limited', async ({helper}) => { - const collection = await helper.nft.mintCollection(alice, {name: 'col', description: 'descr', tokenPrefix: 'COL'}); + const collection = await helper.nft.mintCollection(alice, {name: 'col', description: 'descr', tokenPrefix: 'COL', limits: { + sponsorTransferTimeout: 1000, + }}); await collection.setSponsor(alice, bob.address); await collection.confirmSponsorship(bob); @@ -125,7 +127,9 @@ }); itSub('Fungible: Sponsoring is rate limited', async ({helper}) => { - const collection = await helper.ft.mintCollection(alice, {name: 'col', description: 'descr', tokenPrefix: 'COL'}); + const collection = await helper.ft.mintCollection(alice, {name: 'col', description: 'descr', tokenPrefix: 'COL', limits: { + sponsorTransferTimeout: 1000, + }}); await collection.setSponsor(alice, bob.address); await collection.confirmSponsorship(bob); @@ -141,7 +145,9 @@ }); itSub.ifWithPallets('ReFungible: Sponsoring is rate limited', [Pallets.ReFungible], async ({helper}) => { - const collection = await helper.rft.mintCollection(alice, {name: 'col', description: 'descr', tokenPrefix: 'COL'}); + const collection = await helper.rft.mintCollection(alice, {name: 'col', description: 'descr', tokenPrefix: 'COL', limits: { + sponsorTransferTimeout: 1000, + }}); await collection.setSponsor(alice, bob.address); await collection.confirmSponsorship(bob); @@ -157,7 +163,10 @@ }); itSub('NFT: Sponsoring of createItem is rate limited', async ({helper}) => { - const collection = await helper.nft.mintCollection(alice, {name: 'col', description: 'descr', tokenPrefix: 'COL'}); + const collection = await helper.nft.mintCollection(alice, {name: 'col', description: 'descr', tokenPrefix: 'COL', limits: { + sponsoredDataRateLimit: {blocks: 1000}, + sponsorTransferTimeout: 1000, + }}); await collection.setSponsor(alice, bob.address); await collection.confirmSponsorship(bob); await collection.setPermissions(alice, {mintMode: true, access: 'AllowList'}); @@ -183,13 +192,13 @@ before(async () => { await usingPlaygrounds(async (helper, privateKey) => { - const donor = privateKey('//Alice'); + const donor = await privateKey({filename: __filename}); [alice, bob, charlie, ownerZeroBalance, senderZeroBalance] = await helper.arrange.createAccounts([100n, 100n, 100n, 0n, 0n], donor); }); }); itSub('(!negative test!) Confirm sponsorship for a collection that never existed', async ({helper}) => { - const collectionId = 1_000_000; + const collectionId = (1 << 32) - 1; const confirmSponsorshipTx = async () => helper.collection.confirmSponsorship(bob, collectionId); await expect(confirmSponsorshipTx()).to.be.rejectedWith(/common\.CollectionNotFound/); }); --- a/tests/src/connection.test.ts +++ b/tests/src/connection.test.ts @@ -14,7 +14,7 @@ // You should have received a copy of the GNU General Public License // along with Unique Network. If not, see . -import {itSub, expect, usingPlaygrounds} from './util/playgrounds'; +import {itSub, expect, usingPlaygrounds} from './util'; describe('Connection smoke test', () => { itSub('Connection can be established', async ({helper}) => { --- a/tests/src/createCollection.test.ts +++ b/tests/src/createCollection.test.ts @@ -15,7 +15,7 @@ // along with Unique Network. If not, see . import {IKeyringPair} from '@polkadot/types/types'; -import {usingPlaygrounds, expect, itSub, Pallets} from './util/playgrounds'; +import {usingPlaygrounds, expect, itSub, Pallets} from './util'; import {ICollectionCreationOptions, IProperty} from './util/playgrounds/types'; import {UniqueHelper} from './util/playgrounds/unique'; @@ -49,7 +49,7 @@ before(async () => { await usingPlaygrounds(async (helper, privateKey) => { - const donor = privateKey('//Alice'); + const donor = await privateKey({filename: __filename}); [alice] = await helper.arrange.createAccounts([100n], donor); }); }); @@ -110,7 +110,7 @@ before(async () => { await usingPlaygrounds(async (helper, privateKey) => { - const donor = privateKey('//Alice'); + const donor = await privateKey({filename: __filename}); [alice] = await helper.arrange.createAccounts([100n], donor); }); }); --- a/tests/src/createItem.test.ts +++ b/tests/src/createItem.test.ts @@ -15,7 +15,7 @@ // along with Unique Network. If not, see . import {IKeyringPair} from '@polkadot/types/types'; -import {usingPlaygrounds, expect, itSub, Pallets} from './util/playgrounds'; +import {usingPlaygrounds, expect, itSub, Pallets} from './util'; import {IProperty, ICrossAccountId} from './util/playgrounds/types'; import {UniqueHelper} from './util/playgrounds/unique'; @@ -50,7 +50,7 @@ before(async () => { await usingPlaygrounds(async (helper, privateKey) => { - const donor = privateKey('//Alice'); + const donor = await privateKey({filename: __filename}); [alice, bob] = await helper.arrange.createAccounts([100n, 100n], donor); }); }); @@ -179,7 +179,7 @@ before(async () => { await usingPlaygrounds(async (helper, privateKey) => { - const donor = privateKey('//Alice'); + const donor = await privateKey({filename: __filename}); [alice, bob] = await helper.arrange.createAccounts([100n, 100n], donor); }); }); --- a/tests/src/createMultipleItems.test.ts +++ b/tests/src/createMultipleItems.test.ts @@ -15,14 +15,14 @@ // along with Unique Network. If not, see . import {IKeyringPair} from '@polkadot/types/types'; -import {usingPlaygrounds, expect, Pallets, itSub} from './util/playgrounds'; +import {usingPlaygrounds, expect, Pallets, itSub} from './util'; describe('Integration Test createMultipleItems(collection_id, owner, items_data):', () => { let alice: IKeyringPair; before(async () => { await usingPlaygrounds(async (helper, privateKey) => { - const donor = privateKey('//Alice'); + const donor = await privateKey({filename: __filename}); [alice] = await helper.arrange.createAccounts([100n], donor); }); }); @@ -168,7 +168,7 @@ before(async () => { await usingPlaygrounds(async (helper, privateKey) => { - const donor = privateKey('//Alice'); + const donor = await privateKey({filename: __filename}); [alice, bob] = await helper.arrange.createAccounts([100n, 100n], donor); }); }); --- a/tests/src/createMultipleItemsEx.test.ts +++ b/tests/src/createMultipleItemsEx.test.ts @@ -15,7 +15,7 @@ // along with Unique Network. If not, see . import {IKeyringPair} from '@polkadot/types/types'; -import {usingPlaygrounds, expect, Pallets, itSub} from './util/playgrounds'; +import {usingPlaygrounds, expect, Pallets, itSub} from './util'; import {IProperty} from './util/playgrounds/types'; describe('Integration Test: createMultipleItemsEx', () => { @@ -25,7 +25,7 @@ before(async () => { await usingPlaygrounds(async (helper, privateKey) => { - const donor = privateKey('//Alice'); + const donor = await privateKey({filename: __filename}); [alice, bob, charlie] = await helper.arrange.createAccounts([100n, 100n, 100n], donor); }); }); @@ -264,7 +264,7 @@ before(async () => { await usingPlaygrounds(async (helper, privateKey) => { - const donor = privateKey('//Alice'); + const donor = await privateKey({filename: __filename}); [alice, bob, charlie] = await helper.arrange.createAccounts([100n, 100n, 100n], donor); }); }); --- /dev/null +++ b/tests/src/creditFeesToTreasury.seqtest.ts @@ -0,0 +1,165 @@ +// Copyright 2019-2022 Unique Network (Gibraltar) Ltd. +// This file is part of Unique Network. + +// Unique Network is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Unique Network is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Unique Network. If not, see . + +import './interfaces/augment-api-consts'; +import {IKeyringPair} from '@polkadot/types/types'; +import {ApiPromise} from '@polkadot/api'; +import {usingPlaygrounds, expect, itSub} from './util'; + +const TREASURY = '5EYCAe5ijiYfyeZ2JJCGq56LmPyNRAKzpG4QkoQkkQNB5e6Z'; +const saneMinimumFee = 0.05; +const saneMaximumFee = 0.5; +const createCollectionDeposit = 100; + +// Skip the inflation block pauses if the block is close to inflation block +// until the inflation happens +/*eslint no-async-promise-executor: "off"*/ +function skipInflationBlock(api: ApiPromise): Promise { + const promise = new Promise(async (resolve) => { + const blockInterval = api.consts.inflation.inflationBlockInterval.toNumber(); + const unsubscribe = await api.rpc.chain.subscribeNewHeads(head => { + const currentBlock = head.number.toNumber(); + if (currentBlock % blockInterval < blockInterval - 10) { + unsubscribe(); + resolve(); + } else { + console.log(`Skipping inflation block, current block: ${currentBlock}`); + } + }); + }); + + return promise; +} + +describe('integration test: Fees must be credited to Treasury:', () => { + let alice: IKeyringPair; + let bob: IKeyringPair; + + before(async () => { + await usingPlaygrounds(async (helper, privateKey) => { + const donor = await privateKey({filename: __filename}); + [alice, bob] = await helper.arrange.createAccounts([100n, 100n], donor); + }); + }); + + itSub('Total issuance does not change', async ({helper}) => { + const api = helper.getApi(); + await skipInflationBlock(api); + await helper.wait.newBlocks(1); + + const totalBefore = (await helper.callRpc('api.query.balances.totalIssuance', [])).toBigInt(); + + await helper.balance.transferToSubstrate(alice, bob.address, 1n); + + const totalAfter = (await helper.callRpc('api.query.balances.totalIssuance', [])).toBigInt(); + + expect(totalAfter).to.be.equal(totalBefore); + }); + + itSub('Sender balance decreased by fee+sent amount, Treasury balance increased by fee', async ({helper}) => { + await skipInflationBlock(helper.getApi()); + await helper.wait.newBlocks(1); + + const treasuryBalanceBefore = await helper.balance.getSubstrate(TREASURY); + const aliceBalanceBefore = await helper.balance.getSubstrate(alice.address); + + const amount = 1n; + await helper.balance.transferToSubstrate(alice, bob.address, amount); + + const treasuryBalanceAfter = await helper.balance.getSubstrate(TREASURY); + const aliceBalanceAfter = await helper.balance.getSubstrate(alice.address); + + const fee = aliceBalanceBefore - aliceBalanceAfter - amount; + const treasuryIncrease = treasuryBalanceAfter - treasuryBalanceBefore; + + expect(treasuryIncrease).to.be.equal(fee); + }); + + itSub('Treasury balance increased by failed tx fee', async ({helper}) => { + const api = helper.getApi(); + await helper.wait.newBlocks(1); + + const treasuryBalanceBefore = await helper.balance.getSubstrate(TREASURY); + const bobBalanceBefore = await helper.balance.getSubstrate(bob.address); + + await expect(helper.signTransaction(bob, api.tx.balances.setBalance(alice.address, 0, 0))).to.be.rejected; + + const treasuryBalanceAfter = await helper.balance.getSubstrate(TREASURY); + const bobBalanceAfter = await helper.balance.getSubstrate(bob.address); + + const fee = bobBalanceBefore - bobBalanceAfter; + const treasuryIncrease = treasuryBalanceAfter - treasuryBalanceBefore; + + expect(treasuryIncrease).to.be.equal(fee); + }); + + itSub('NFT Transactions also send fees to Treasury', async ({helper}) => { + await skipInflationBlock(helper.getApi()); + await helper.wait.newBlocks(1); + + const treasuryBalanceBefore = await helper.balance.getSubstrate(TREASURY); + const aliceBalanceBefore = await helper.balance.getSubstrate(alice.address); + + await helper.nft.mintCollection(alice, {name: 'test', description: 'test', tokenPrefix: 'test'}); + + const treasuryBalanceAfter = await helper.balance.getSubstrate(TREASURY); + const aliceBalanceAfter = await helper.balance.getSubstrate(alice.address); + const fee = aliceBalanceBefore - aliceBalanceAfter; + const treasuryIncrease = treasuryBalanceAfter - treasuryBalanceBefore; + + expect(treasuryIncrease).to.be.equal(fee); + }); + + itSub('Fees are sane', async ({helper}) => { + const unique = helper.balance.getOneTokenNominal(); + await skipInflationBlock(helper.getApi()); + await helper.wait.newBlocks(1); + + const aliceBalanceBefore = await helper.balance.getSubstrate(alice.address); + + await helper.nft.mintCollection(alice, {name: 'test', description: 'test', tokenPrefix: 'test'}); + + const aliceBalanceAfter = await helper.balance.getSubstrate(alice.address); + const fee = aliceBalanceBefore - aliceBalanceAfter; + + expect(fee / unique < BigInt(Math.ceil(saneMaximumFee + createCollectionDeposit))).to.be.true; + expect(fee / unique < BigInt(Math.ceil(saneMinimumFee + createCollectionDeposit))).to.be.true; + }); + + itSub('NFT Transfer fee is close to 0.1 Unique', async ({helper}) => { + await skipInflationBlock(helper.getApi()); + await helper.wait.newBlocks(1); + + const collection = await helper.nft.mintCollection(alice, { + name: 'test', + description: 'test', + tokenPrefix: 'test', + }); + // const tokenId = await createItemExpectSuccess(alice, collectionId, 'NFT'); + const token = await collection.mintToken(alice, {Substrate: alice.address}); + + const aliceBalanceBefore = await helper.balance.getSubstrate(alice.address); + await token.transfer(alice, {Substrate: bob.address}); + const aliceBalanceAfter = await helper.balance.getSubstrate(alice.address); + + const fee = Number(aliceBalanceBefore - aliceBalanceAfter) / Number(helper.balance.getOneTokenNominal()); + const expectedTransferFee = 0.1; + // fee drifts because of NextFeeMultiplier + const tolerance = 0.001; + + expect(Math.abs(fee - expectedTransferFee)).to.be.lessThan(tolerance); + }); +}); --- a/tests/src/creditFeesToTreasury.test.ts +++ /dev/null @@ -1,165 +0,0 @@ -// Copyright 2019-2022 Unique Network (Gibraltar) Ltd. -// This file is part of Unique Network. - -// Unique Network is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Unique Network is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Unique Network. If not, see . - -import './interfaces/augment-api-consts'; -import {IKeyringPair} from '@polkadot/types/types'; -import {ApiPromise} from '@polkadot/api'; -import {usingPlaygrounds, expect, itSub} from './util/playgrounds'; - -const TREASURY = '5EYCAe5ijiYfyeZ2JJCGq56LmPyNRAKzpG4QkoQkkQNB5e6Z'; -const saneMinimumFee = 0.05; -const saneMaximumFee = 0.5; -const createCollectionDeposit = 100; - -// Skip the inflation block pauses if the block is close to inflation block -// until the inflation happens -/*eslint no-async-promise-executor: "off"*/ -function skipInflationBlock(api: ApiPromise): Promise { - const promise = new Promise(async (resolve) => { - const blockInterval = api.consts.inflation.inflationBlockInterval.toNumber(); - const unsubscribe = await api.rpc.chain.subscribeNewHeads(head => { - const currentBlock = head.number.toNumber(); - if (currentBlock % blockInterval < blockInterval - 10) { - unsubscribe(); - resolve(); - } else { - console.log(`Skipping inflation block, current block: ${currentBlock}`); - } - }); - }); - - return promise; -} - -describe('integration test: Fees must be credited to Treasury:', () => { - let alice: IKeyringPair; - let bob: IKeyringPair; - - before(async () => { - await usingPlaygrounds(async (helper, privateKey) => { - const donor = privateKey('//Alice'); - [alice, bob] = await helper.arrange.createAccounts([100n, 100n], donor); - }); - }); - - itSub('Total issuance does not change', async ({helper}) => { - const api = helper.getApi(); - await skipInflationBlock(api); - await helper.wait.newBlocks(1); - - const totalBefore = (await helper.callRpc('api.query.balances.totalIssuance', [])).toBigInt(); - - await helper.balance.transferToSubstrate(alice, bob.address, 1n); - - const totalAfter = (await helper.callRpc('api.query.balances.totalIssuance', [])).toBigInt(); - - expect(totalAfter).to.be.equal(totalBefore); - }); - - itSub('Sender balance decreased by fee+sent amount, Treasury balance increased by fee', async ({helper}) => { - await skipInflationBlock(helper.getApi()); - await helper.wait.newBlocks(1); - - const treasuryBalanceBefore = await helper.balance.getSubstrate(TREASURY); - const aliceBalanceBefore = await helper.balance.getSubstrate(alice.address); - - const amount = 1n; - await helper.balance.transferToSubstrate(alice, bob.address, amount); - - const treasuryBalanceAfter = await helper.balance.getSubstrate(TREASURY); - const aliceBalanceAfter = await helper.balance.getSubstrate(alice.address); - - const fee = aliceBalanceBefore - aliceBalanceAfter - amount; - const treasuryIncrease = treasuryBalanceAfter - treasuryBalanceBefore; - - expect(treasuryIncrease).to.be.equal(fee); - }); - - itSub('Treasury balance increased by failed tx fee', async ({helper}) => { - const api = helper.getApi(); - await helper.wait.newBlocks(1); - - const treasuryBalanceBefore = await helper.balance.getSubstrate(TREASURY); - const bobBalanceBefore = await helper.balance.getSubstrate(bob.address); - - await expect(helper.signTransaction(bob, api.tx.balances.setBalance(alice.address, 0, 0))).to.be.rejected; - - const treasuryBalanceAfter = await helper.balance.getSubstrate(TREASURY); - const bobBalanceAfter = await helper.balance.getSubstrate(bob.address); - - const fee = bobBalanceBefore - bobBalanceAfter; - const treasuryIncrease = treasuryBalanceAfter - treasuryBalanceBefore; - - expect(treasuryIncrease).to.be.equal(fee); - }); - - itSub('NFT Transactions also send fees to Treasury', async ({helper}) => { - await skipInflationBlock(helper.getApi()); - await helper.wait.newBlocks(1); - - const treasuryBalanceBefore = await helper.balance.getSubstrate(TREASURY); - const aliceBalanceBefore = await helper.balance.getSubstrate(alice.address); - - await helper.nft.mintCollection(alice, {name: 'test', description: 'test', tokenPrefix: 'test'}); - - const treasuryBalanceAfter = await helper.balance.getSubstrate(TREASURY); - const aliceBalanceAfter = await helper.balance.getSubstrate(alice.address); - const fee = aliceBalanceBefore - aliceBalanceAfter; - const treasuryIncrease = treasuryBalanceAfter - treasuryBalanceBefore; - - expect(treasuryIncrease).to.be.equal(fee); - }); - - itSub('Fees are sane', async ({helper}) => { - const unique = helper.balance.getOneTokenNominal(); - await skipInflationBlock(helper.getApi()); - await helper.wait.newBlocks(1); - - const aliceBalanceBefore = await helper.balance.getSubstrate(alice.address); - - await helper.nft.mintCollection(alice, {name: 'test', description: 'test', tokenPrefix: 'test'}); - - const aliceBalanceAfter = await helper.balance.getSubstrate(alice.address); - const fee = aliceBalanceBefore - aliceBalanceAfter; - - expect(fee / unique < BigInt(Math.ceil(saneMaximumFee + createCollectionDeposit))).to.be.true; - expect(fee / unique < BigInt(Math.ceil(saneMinimumFee + createCollectionDeposit))).to.be.true; - }); - - itSub('NFT Transfer fee is close to 0.1 Unique', async ({helper}) => { - await skipInflationBlock(helper.getApi()); - await helper.wait.newBlocks(1); - - const collection = await helper.nft.mintCollection(alice, { - name: 'test', - description: 'test', - tokenPrefix: 'test', - }); - // const tokenId = await createItemExpectSuccess(alice, collectionId, 'NFT'); - const token = await collection.mintToken(alice, {Substrate: alice.address}); - - const aliceBalanceBefore = await helper.balance.getSubstrate(alice.address); - await token.transfer(alice, {Substrate: bob.address}); - const aliceBalanceAfter = await helper.balance.getSubstrate(alice.address); - - const fee = Number(aliceBalanceBefore - aliceBalanceAfter) / Number(helper.balance.getOneTokenNominal()); - const expectedTransferFee = 0.1; - // fee drifts because of NextFeeMultiplier - const tolerance = 0.001; - - expect(Math.abs(fee - expectedTransferFee)).to.be.lessThan(tolerance); - }); -}); --- a/tests/src/destroyCollection.test.ts +++ b/tests/src/destroyCollection.test.ts @@ -15,14 +15,14 @@ // along with Unique Network. If not, see . import {IKeyringPair} from '@polkadot/types/types'; -import {itSub, expect, usingPlaygrounds, Pallets} from './util/playgrounds'; +import {itSub, expect, usingPlaygrounds, Pallets} from './util'; describe('integration test: ext. destroyCollection():', () => { let alice: IKeyringPair; before(async () => { await usingPlaygrounds(async (helper, privateKey) => { - const donor = privateKey('//Alice'); + const donor = await privateKey({filename: __filename}); [alice] = await helper.arrange.createAccounts([100n], donor); }); }); @@ -62,7 +62,7 @@ before(async () => { await usingPlaygrounds(async (helper, privateKey) => { - const donor = privateKey('//Alice'); + const donor = await privateKey({filename: __filename}); [alice, bob] = await helper.arrange.createAccounts([100n, 100n], donor); }); }); --- a/tests/src/enableDisableTransfer.test.ts +++ b/tests/src/enableDisableTransfer.test.ts @@ -15,7 +15,7 @@ // along with Unique Network. If not, see . import {IKeyringPair} from '@polkadot/types/types'; -import {itSub, usingPlaygrounds, expect} from './util/playgrounds'; +import {itSub, usingPlaygrounds, expect} from './util'; describe('Enable/Disable Transfers', () => { let alice: IKeyringPair; @@ -23,7 +23,7 @@ before(async () => { await usingPlaygrounds(async (helper, privateKey) => { - const donor = privateKey('//Alice'); + const donor = await privateKey({filename: __filename}); [alice, bob] = await helper.arrange.createAccounts([100n, 100n], donor); }); }); @@ -62,7 +62,7 @@ before(async () => { await usingPlaygrounds(async (helper, privateKey) => { - const donor = privateKey('//Alice'); + const donor = await privateKey({filename: __filename}); [alice, bob] = await helper.arrange.createAccounts([100n, 100n], donor); }); }); --- a/tests/src/eth/allowlist.test.ts +++ b/tests/src/eth/allowlist.test.ts @@ -15,14 +15,14 @@ // along with Unique Network. If not, see . import {IKeyringPair} from '@polkadot/types/types'; -import {itEth, usingEthPlaygrounds, expect} from './util/playgrounds'; +import {itEth, usingEthPlaygrounds, expect} from './util'; describe('EVM contract allowlist', () => { let donor: IKeyringPair; before(async function() { await usingEthPlaygrounds(async (_helper, privateKey) => { - donor = privateKey('//Alice'); + donor = await privateKey({filename: __filename}); }); }); @@ -70,7 +70,7 @@ before(async function() { await usingEthPlaygrounds(async (_helper, privateKey) => { - donor = privateKey('//Alice'); + donor = await privateKey({filename: __filename}); }); }); --- a/tests/src/eth/base.test.ts +++ b/tests/src/eth/base.test.ts @@ -17,7 +17,7 @@ import {Contract} from 'web3-eth-contract'; import {IKeyringPair} from '@polkadot/types/types'; -import {EthUniqueHelper, itEth, usingEthPlaygrounds, expect} from './util/playgrounds'; +import {EthUniqueHelper, itEth, usingEthPlaygrounds, expect} from './util'; describe('Contract calls', () => { @@ -25,7 +25,7 @@ before(async function() { await usingEthPlaygrounds(async (_helper, privateKey) => { - donor = privateKey('//Alice'); + donor = await privateKey({filename: __filename}); }); }); @@ -78,7 +78,7 @@ before(async () => { await usingEthPlaygrounds(async (helper, privateKey) => { - const donor = privateKey('//Alice'); + const donor = await privateKey({filename: __filename}); const [alice] = await helper.arrange.createAccounts([10n], donor); ({collectionId: collection} = await helper.nft.mintCollection(alice, {name: 'test', description: 'test', tokenPrefix: 'test'})); minter = helper.eth.createAccount(); --- a/tests/src/eth/collectionAdmin.test.ts +++ b/tests/src/eth/collectionAdmin.test.ts @@ -14,7 +14,7 @@ // along with Unique Network. If not, see . import {IKeyringPair} from '@polkadot/types/types'; -import {usingEthPlaygrounds, itEth, expect, EthUniqueHelper} from './util/playgrounds'; +import {usingEthPlaygrounds, itEth, expect, EthUniqueHelper} from './util'; async function recordEthFee(helper: EthUniqueHelper, userAddress: string, call: () => Promise) { const before = await helper.balance.getSubstrate(helper.address.ethToSubstrate(userAddress)); @@ -32,7 +32,7 @@ before(async function() { await usingEthPlaygrounds(async (_helper, privateKey) => { - donor = privateKey('//Alice'); + donor = await privateKey({filename: __filename}); }); }); @@ -144,7 +144,7 @@ before(async function() { await usingEthPlaygrounds(async (_helper, privateKey) => { - donor = privateKey('//Alice'); + donor = await privateKey({filename: __filename}); }); }); @@ -272,7 +272,7 @@ before(async function() { await usingEthPlaygrounds(async (_helper, privateKey) => { - donor = privateKey('//Alice'); + donor = await privateKey({filename: __filename}); }); }); @@ -314,7 +314,7 @@ before(async function() { await usingEthPlaygrounds(async (_helper, privateKey) => { - donor = privateKey('//Alice'); + donor = await privateKey({filename: __filename}); }); }); --- a/tests/src/eth/collectionProperties.test.ts +++ b/tests/src/eth/collectionProperties.test.ts @@ -1,4 +1,20 @@ -import {itEth, usingEthPlaygrounds, expect} from './util/playgrounds'; +// Copyright 2019-2022 Unique Network (Gibraltar) Ltd. +// This file is part of Unique Network. + +// Unique Network is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Unique Network is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Unique Network. If not, see . + +import {itEth, usingEthPlaygrounds, expect} from './util'; import {IKeyringPair} from '@polkadot/types/types'; describe('EVM collection properties', () => { @@ -7,7 +23,7 @@ before(async function() { await usingEthPlaygrounds(async (_helper, privateKey) => { - donor = privateKey('//Alice'); + donor = await privateKey({filename: __filename}); [alice] = await _helper.arrange.createAccounts([10n], donor); }); }); --- a/tests/src/eth/collectionSponsoring.test.ts +++ b/tests/src/eth/collectionSponsoring.test.ts @@ -1,6 +1,22 @@ +// Copyright 2019-2022 Unique Network (Gibraltar) Ltd. +// This file is part of Unique Network. + +// Unique Network is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Unique Network is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Unique Network. If not, see . + import {IKeyringPair} from '@polkadot/types/types'; -import {usingPlaygrounds} from './../util/playgrounds/index'; -import {itEth, expect} from '../eth/util/playgrounds'; +import {usingPlaygrounds} from '../util/index'; +import {itEth, expect} from './util'; describe('evm collection sponsoring', () => { let donor: IKeyringPair; @@ -9,17 +25,12 @@ before(async () => { await usingPlaygrounds(async (helper, privateKey) => { - donor = privateKey('//Alice'); + donor = await privateKey({filename: __filename}); + [alice] = await helper.arrange.createAccounts([100n], donor); nominal = helper.balance.getOneTokenNominal(); }); }); - - beforeEach(async () => { - await usingPlaygrounds(async (helper) => { - [alice] = await helper.arrange.createAccounts([1000n], donor); - }); - }); - + itEth('sponsors mint transactions', async ({helper}) => { const collection = await helper.nft.mintCollection(alice, {tokenPrefix: 'spnr', permissions: {mintMode: true}}); await collection.setSponsor(alice, alice.address); --- a/tests/src/eth/contractSponsoring.test.ts +++ b/tests/src/eth/contractSponsoring.test.ts @@ -16,8 +16,8 @@ import {IKeyringPair} from '@polkadot/types/types'; import {EthUniqueHelper} from './util/playgrounds/unique.dev'; -import {itEth, expect, SponsoringMode, usingEthPlaygrounds} from '../eth/util/playgrounds'; -import {usingPlaygrounds} from '../util/playgrounds'; +import {itEth, expect, SponsoringMode, usingEthPlaygrounds} from './util'; +import {usingPlaygrounds} from '../util'; import {CompiledContract} from './util/playgrounds/types'; describe('Sponsoring EVM contracts', () => { @@ -25,11 +25,11 @@ before(async () => { await usingPlaygrounds(async (_helper, privateKey) => { - donor = privateKey('//Alice'); + donor = await privateKey({filename: __filename}); }); }); - itEth('Self sponsored can be set by the address that deployed the contract', async ({helper, privateKey}) => { + itEth('Self sponsored can be set by the address that deployed the contract', async ({helper}) => { const owner = await helper.eth.createAccountWithBalance(donor); const flipper = await helper.eth.deployFlipper(owner); const helpers = helper.ethNativeContract.contractHelpers(owner); @@ -378,7 +378,7 @@ // Balance should be taken from flipper instead of caller // FIXME the comment is wrong! What check should be here? const balanceAfter = await helper.balance.getEthereum(flipper.options.address); - expect(balanceAfter).to.be.equals(originalFlipperBalance); + expect(balanceAfter).to.be.equal(originalFlipperBalance); }); itEth('Sponsoring is set, an address that has UNQ can send a transaction and it works. User balance should not change', async ({helper}) => { @@ -406,7 +406,7 @@ const sponsorBalanceAfter = await helper.balance.getSubstrate(await helper.address.ethToSubstrate(sponsor)); const callerBalanceAfter = await helper.balance.getSubstrate(await helper.address.ethToSubstrate(caller)); expect(sponsorBalanceAfter < sponsorBalanceBefore).to.be.true; - expect(callerBalanceAfter).to.be.equals(callerBalanceBefore); + expect(callerBalanceAfter).to.be.equal(callerBalanceBefore); }); itEth('Sponsoring is limited, with setContractRateLimit. The limitation is working if transactions are sent more often, the sender pays the commission.', async ({helper}) => { @@ -431,23 +431,24 @@ await flipper.methods.flip().send({from: caller}); expect(await flipper.methods.getValue().call()).to.be.true; - expect(await helper.balance.getEthereum(caller)).to.be.equals(originalCallerBalance); + expect(await helper.balance.getEthereum(caller)).to.be.equal(originalCallerBalance); const newFlipperBalance = await helper.balance.getEthereum(sponsor); - expect(newFlipperBalance).to.be.not.equals(originalFlipperBalance); + expect(newFlipperBalance).to.be.not.equal(originalFlipperBalance); await flipper.methods.flip().send({from: caller}); + // todo:playgrounds fails rarely (expected 99893341659775672580n to equal 99912598679356033129n) (again, 99893341659775672580n) expect(await helper.balance.getEthereum(sponsor)).to.be.equal(newFlipperBalance); - expect(await helper.balance.getEthereum(caller)).to.be.not.equals(originalCallerBalance); + expect(await helper.balance.getEthereum(caller)).to.be.not.equal(originalCallerBalance); }); // TODO: Find a way to calculate default rate limit - itEth('Default rate limit equals 7200', async ({helper}) => { + itEth('Default rate limit equal 7200', async ({helper}) => { const owner = await helper.eth.createAccountWithBalance(donor); const helpers = helper.ethNativeContract.contractHelpers(owner); const flipper = await helper.eth.deployFlipper(owner); - expect(await helpers.methods.sponsoringRateLimit(flipper.options.address).call()).to.be.equals('7200'); + expect(await helpers.methods.sponsoringRateLimit(flipper.options.address).call()).to.be.equal('7200'); }); }); @@ -490,24 +491,18 @@ } before(async () => { - await usingEthPlaygrounds(async (_helper, privateKey) => { - donor = privateKey('//Alice'); + await usingEthPlaygrounds(async (helper, privateKey) => { + donor = await privateKey({filename: __filename}); + [alice] = await helper.arrange.createAccounts([100n], donor); }); }); - - beforeEach(async () => { - await usingPlaygrounds(async (helper) => { - [alice] = await helper.arrange.createAccounts([1000n], donor); - }); - }); - itEth('Default fee limit', async ({helper}) => { const owner = await helper.eth.createAccountWithBalance(donor); const helpers = helper.ethNativeContract.contractHelpers(owner); const flipper = await helper.eth.deployFlipper(owner); - expect(await helpers.methods.sponsoringFeeLimit(flipper.options.address).call()).to.be.equals('115792089237316195423570985008687907853269984665640564039457584007913129639935'); + expect(await helpers.methods.sponsoringFeeLimit(flipper.options.address).call()).to.be.equal('115792089237316195423570985008687907853269984665640564039457584007913129639935'); }); itEth('Set fee limit', async ({helper}) => { @@ -516,7 +511,7 @@ const flipper = await helper.eth.deployFlipper(owner); await helpers.methods.setSponsoringFeeLimit(flipper.options.address, 100).send(); - expect(await helpers.methods.sponsoringFeeLimit(flipper.options.address).call()).to.be.equals('100'); + expect(await helpers.methods.sponsoringFeeLimit(flipper.options.address).call()).to.be.equal('100'); }); itEth('Negative test - set fee limit by non-owner', async ({helper}) => { @@ -554,7 +549,7 @@ expect(await helper.balance.getEthereum(user)).to.not.be.equal(originalUserBalance); }); - itEth('Negative test - check that evm.call transactions exceeding fee limit are not executed', async ({helper, privateKey}) => { + itEth('Negative test - check that evm.call transactions exceeding fee limit are not executed', async ({helper}) => { const owner = await helper.eth.createAccountWithBalance(donor); const sponsor = await helper.eth.createAccountWithBalance(donor); const helpers = helper.ethNativeContract.contractHelpers(owner); --- a/tests/src/eth/createNFTCollection.test.ts +++ b/tests/src/eth/createNFTCollection.test.ts @@ -16,7 +16,7 @@ import {evmToAddress} from '@polkadot/util-crypto'; import {IKeyringPair} from '@polkadot/types/types'; -import {expect, itEth, usingEthPlaygrounds} from './util/playgrounds'; +import {expect, itEth, usingEthPlaygrounds} from './util'; describe('Create NFT collection from EVM', () => { @@ -24,7 +24,7 @@ before(async function() { await usingEthPlaygrounds(async (_helper, privateKey) => { - donor = privateKey('//Alice'); + donor = await privateKey({filename: __filename}); }); }); @@ -35,24 +35,17 @@ const description = 'Some description'; const prefix = 'token prefix'; - // todo:playgrounds this might fail when in async environment. - const collectionCountBefore = +(await helper.callRpc('api.rpc.unique.collectionStats')).created; const {collectionId} = await helper.eth.createNonfungibleCollection(owner, name, description, prefix); - const collectionCountAfter = +(await helper.callRpc('api.rpc.unique.collectionStats')).created; - - const collection = helper.nft.getCollectionObject(collectionId); - const data = (await collection.getData())!; + const data = (await helper.rft.getData(collectionId))!; - expect(collectionCountAfter - collectionCountBefore).to.be.eq(1); - expect(collectionId).to.be.eq(collectionCountAfter); expect(data.name).to.be.eq(name); expect(data.description).to.be.eq(description); expect(data.raw.tokenPrefix).to.be.eq(prefix); expect(data.raw.mode).to.be.eq('NFT'); }); - // todo:playgrounds this test will fail when in async environment. - itEth('Check collection address exist', async ({helper}) => { + // this test will occasionally fail when in async environment. + itEth.skip('Check collection address exist', async ({helper}) => { const owner = await helper.eth.createAccountWithBalance(donor); const expectedCollectionId = +(await helper.callRpc('api.rpc.unique.collectionStats')).created + 1; @@ -151,7 +144,7 @@ before(async function() { await usingEthPlaygrounds(async (helper, privateKey) => { - donor = privateKey('//Alice'); + donor = await privateKey({filename: __filename}); nominal = helper.balance.getOneTokenNominal(); }); }); --- a/tests/src/eth/createRFTCollection.test.ts +++ b/tests/src/eth/createRFTCollection.test.ts @@ -16,8 +16,8 @@ import {evmToAddress} from '@polkadot/util-crypto'; import {IKeyringPair} from '@polkadot/types/types'; -import {Pallets, requirePalletsOrSkip} from '../util/playgrounds'; -import {expect, itEth, usingEthPlaygrounds} from './util/playgrounds'; +import {Pallets, requirePalletsOrSkip} from '../util'; +import {expect, itEth, usingEthPlaygrounds} from './util'; describe('Create RFT collection from EVM', () => { @@ -26,7 +26,7 @@ before(async function() { await usingEthPlaygrounds(async (helper, privateKey) => { requirePalletsOrSkip(this, helper, [Pallets.ReFungible]); - donor = privateKey('//Alice'); + donor = await privateKey({filename: __filename}); }); }); @@ -37,23 +37,17 @@ const description = 'Some description'; const prefix = 'token prefix'; - // todo:playgrounds this might fail when in async environment. - const collectionCountBefore = +(await helper.callRpc('api.rpc.unique.collectionStats')).created; const {collectionId} = await helper.eth.createRefungibleCollection(owner, name, description, prefix); - const collectionCountAfter = +(await helper.callRpc('api.rpc.unique.collectionStats')).created; - const data = (await helper.rft.getData(collectionId))!; - expect(collectionCountAfter - collectionCountBefore).to.be.eq(1); - expect(collectionId).to.be.eq(collectionCountAfter); expect(data.name).to.be.eq(name); expect(data.description).to.be.eq(description); expect(data.raw.tokenPrefix).to.be.eq(prefix); expect(data.raw.mode).to.be.eq('ReFungible'); }); - - // todo:playgrounds this test will fail when in async environment. - itEth('Check collection address exist', async ({helper}) => { + + // this test will occasionally fail when in async environment. + itEth.skip('Check collection address exist', async ({helper}) => { const owner = await helper.eth.createAccountWithBalance(donor); const expectedCollectionId = +(await helper.callRpc('api.rpc.unique.collectionStats')).created + 1; @@ -153,7 +147,7 @@ before(async function() { await usingEthPlaygrounds(async (helper, privateKey) => { requirePalletsOrSkip(this, helper, [Pallets.ReFungible]); - donor = privateKey('//Alice'); + donor = await privateKey({filename: __filename}); nominal = helper.balance.getOneTokenNominal(); }); }); --- a/tests/src/eth/crossTransfer.test.ts +++ b/tests/src/eth/crossTransfer.test.ts @@ -14,7 +14,7 @@ // You should have received a copy of the GNU General Public License // along with Unique Network. If not, see . -import {itEth, usingEthPlaygrounds} from './util/playgrounds'; +import {itEth, usingEthPlaygrounds} from './util'; import {CrossAccountId} from '../util/playgrounds/unique'; import {IKeyringPair} from '@polkadot/types/types'; @@ -26,7 +26,7 @@ before(async function() { await usingEthPlaygrounds(async (helper, privateKey) => { - donor = privateKey('//Alice'); + donor = await privateKey({filename: __filename}); [alice, bob, charlie] = await helper.arrange.createAccounts([10n, 10n, 10n], donor); }); }); @@ -69,7 +69,7 @@ before(async function() { await usingEthPlaygrounds(async (helper, privateKey) => { - donor = privateKey('//Alice'); + donor = await privateKey({filename: __filename}); [alice, bob, charlie] = await helper.arrange.createAccounts([10n, 10n, 10n], donor); }); }); --- a/tests/src/eth/evmCoder.test.ts +++ b/tests/src/eth/evmCoder.test.ts @@ -15,7 +15,7 @@ // along with Unique Network. If not, see . import {IKeyringPair} from '@polkadot/types/types'; -import {itEth, expect, usingEthPlaygrounds} from './util/playgrounds'; +import {itEth, expect, usingEthPlaygrounds} from './util'; const getContractSource = (collectionAddress: string, contractAddress: string): string => { return ` @@ -59,7 +59,7 @@ before(async function() { await usingEthPlaygrounds(async (_helper, privateKey) => { - donor = privateKey('//Alice'); + donor = await privateKey({filename: __filename}); }); }); --- a/tests/src/eth/fractionalizer/fractionalizer.test.ts +++ b/tests/src/eth/fractionalizer/fractionalizer.test.ts @@ -22,9 +22,9 @@ import {Contract} from 'web3-eth-contract'; -import {usingEthPlaygrounds, expect, itEth, EthUniqueHelper} from '../util/playgrounds'; +import {usingEthPlaygrounds, expect, itEth, EthUniqueHelper} from '../util'; import {CompiledContract} from '../util/playgrounds/types'; -import {requirePalletsOrSkip, Pallets} from '../../util/playgrounds'; +import {requirePalletsOrSkip, Pallets} from '../../util'; let compiledFractionalizer: CompiledContract; @@ -85,7 +85,7 @@ before(async function() { await usingEthPlaygrounds(async (helper: EthUniqueHelper, privateKey) => { requirePalletsOrSkip(this, helper, [Pallets.ReFungible]); - donor = privateKey('//Alice'); + donor = await privateKey({filename: __filename}); }); }); @@ -225,7 +225,7 @@ before(async function() { await usingEthPlaygrounds(async (helper: EthUniqueHelper, privateKey) => { requirePalletsOrSkip(this, helper, [Pallets.ReFungible]); - donor = privateKey('//Alice'); + donor = await privateKey({filename: __filename}); }); }); --- a/tests/src/eth/fungible.test.ts +++ b/tests/src/eth/fungible.test.ts @@ -14,7 +14,7 @@ // You should have received a copy of the GNU General Public License // along with Unique Network. If not, see . -import {expect, itEth, usingEthPlaygrounds} from './util/playgrounds'; +import {expect, itEth, usingEthPlaygrounds} from './util'; import {IKeyringPair} from '@polkadot/types/types'; describe('Fungible: Information getting', () => { @@ -23,7 +23,7 @@ before(async function() { await usingEthPlaygrounds(async (helper, privateKey) => { - donor = privateKey('//Alice'); + donor = await privateKey({filename: __filename}); [alice] = await helper.arrange.createAccounts([20n], donor); }); }); @@ -55,7 +55,7 @@ before(async function() { await usingEthPlaygrounds(async (helper, privateKey) => { - donor = privateKey('//Alice'); + donor = await privateKey({filename: __filename}); [alice] = await helper.arrange.createAccounts([20n], donor); }); }); @@ -224,7 +224,7 @@ before(async function() { await usingEthPlaygrounds(async (helper, privateKey) => { - donor = privateKey('//Alice'); + donor = await privateKey({filename: __filename}); [alice] = await helper.arrange.createAccounts([20n], donor); }); }); @@ -277,7 +277,7 @@ before(async function() { await usingEthPlaygrounds(async (helper, privateKey) => { - donor = privateKey('//Alice'); + donor = await privateKey({filename: __filename}); [alice] = await helper.arrange.createAccounts([20n], donor); }); }); @@ -294,9 +294,11 @@ contract.events.allEvents((_: any, event: any) => { events.push(event); }); + await collection.approveTokens(alice, {Ethereum: receiver}, 100n); - + if (events.length == 0) await helper.wait.newBlocks(1); const event = events[0]; + expect(event.event).to.be.equal('Approval'); expect(event.address).to.be.equal(collectionAddress); expect(event.returnValues.owner).to.be.equal(helper.address.substrateToEth(alice.address)); @@ -318,9 +320,11 @@ contract.events.allEvents((_: any, event: any) => { events.push(event); }); + await collection.transferFrom(bob, {Substrate: alice.address}, {Ethereum: receiver}, 51n); - + if (events.length == 0) await helper.wait.newBlocks(1); let event = events[0]; + expect(event.event).to.be.equal('Transfer'); expect(event.address).to.be.equal(collectionAddress); expect(event.returnValues.from).to.be.equal(helper.address.substrateToEth(alice.address)); @@ -347,9 +351,11 @@ contract.events.allEvents((_: any, event: any) => { events.push(event); }); + await collection.transfer(alice, {Ethereum:receiver}, 51n); - + if (events.length == 0) await helper.wait.newBlocks(1); const event = events[0]; + expect(event.event).to.be.equal('Transfer'); expect(event.address).to.be.equal(collectionAddress); expect(event.returnValues.from).to.be.equal(helper.address.substrateToEth(alice.address)); --- a/tests/src/eth/helpersSmoke.test.ts +++ b/tests/src/eth/helpersSmoke.test.ts @@ -14,7 +14,7 @@ // You should have received a copy of the GNU General Public License // along with Unique Network. If not, see . -import {expect, itEth, usingEthPlaygrounds} from './util/playgrounds'; +import {expect, itEth, usingEthPlaygrounds} from './util'; import {IKeyringPair} from '@polkadot/types/types'; describe('Helpers sanity check', () => { @@ -22,7 +22,7 @@ before(async function() { await usingEthPlaygrounds(async (_helper, privateKey) => { - donor = privateKey('//Alice'); + donor = await privateKey({filename: __filename}); }); }); --- a/tests/src/eth/marketplace/marketplace.test.ts +++ b/tests/src/eth/marketplace/marketplace.test.ts @@ -14,10 +14,9 @@ // You should have received a copy of the GNU General Public License // along with Unique Network. If not, see . -import {usingPlaygrounds} from './../../util/playgrounds/index'; import {IKeyringPair} from '@polkadot/types/types'; import {readFile} from 'fs/promises'; -import {itEth, expect, SponsoringMode} from '../util/playgrounds'; +import {itEth, usingEthPlaygrounds, expect, SponsoringMode} from '../util'; describe('Matcher contract usage', () => { const PRICE = 2000n; @@ -29,17 +28,17 @@ let sellerMirror: string; before(async () => { - await usingPlaygrounds(async (_helper, privateKey) => { - donor = privateKey('//Alice'); + await usingEthPlaygrounds(async (_helper, privateKey) => { + donor = await privateKey({filename: __filename}); }); }); beforeEach(async () => { - await usingPlaygrounds(async (helper, privateKey) => { - [alice] = await helper.arrange.createAccounts([10000n], donor); + await usingEthPlaygrounds(async (helper, privateKey) => { + [alice] = await helper.arrange.createAccounts([1000n], donor); aliceMirror = helper.address.substrateToEth(alice.address).toLowerCase(); aliceDoubleMirror = helper.address.ethToSubstrate(aliceMirror); - seller = privateKey(`//Seller/${Date.now()}`); + seller = await privateKey(`//Seller/${Date.now()}`); sellerMirror = helper.address.substrateToEth(seller.address).toLowerCase(); await helper.balance.transferToSubstrate(donor, aliceDoubleMirror, 10_000_000_000_000_000_000n); --- a/tests/src/eth/migration.test.ts +++ b/tests/src/eth/migration.test.ts @@ -14,7 +14,7 @@ // You should have received a copy of the GNU General Public License // along with Unique Network. If not, see . -import {expect, itEth, usingEthPlaygrounds} from './util/playgrounds'; +import {expect, itEth, usingEthPlaygrounds} from './util'; import {IKeyringPair} from '@polkadot/types/types'; describe('EVM Migrations', () => { @@ -22,7 +22,7 @@ before(async function() { await usingEthPlaygrounds(async (_helper, privateKey) => { - superuser = privateKey('//Alice'); + superuser = await privateKey('//Alice'); }); }); --- a/tests/src/eth/nesting/nest.test.ts +++ b/tests/src/eth/nesting/nest.test.ts @@ -1,7 +1,7 @@ import {IKeyringPair} from '@polkadot/types/types'; import {Contract} from 'web3-eth-contract'; -import {itEth, EthUniqueHelper, usingEthPlaygrounds, expect} from '../util/playgrounds'; +import {itEth, EthUniqueHelper, usingEthPlaygrounds, expect} from '../util'; const createNestingCollection = async ( helper: EthUniqueHelper, @@ -21,7 +21,7 @@ before(async function() { await usingEthPlaygrounds(async (_, privateKey) => { - donor = privateKey('//Alice'); + donor = await privateKey({filename: __filename}); }); }); --- a/tests/src/eth/nonFungible.test.ts +++ b/tests/src/eth/nonFungible.test.ts @@ -14,7 +14,7 @@ // You should have received a copy of the GNU General Public License // along with Unique Network. If not, see . -import {itEth, usingEthPlaygrounds, expect, EthUniqueHelper} from './util/playgrounds'; +import {itEth, usingEthPlaygrounds, expect, EthUniqueHelper} from './util'; import {IKeyringPair} from '@polkadot/types/types'; import {Contract} from 'web3-eth-contract'; @@ -25,7 +25,7 @@ before(async function() { await usingEthPlaygrounds(async (helper, privateKey) => { - donor = privateKey('//Alice'); + donor = await privateKey({filename: __filename}); [alice] = await helper.arrange.createAccounts([10n], donor); }); }); @@ -75,7 +75,7 @@ before(async function() { await usingEthPlaygrounds(async (_helper, privateKey) => { - donor = privateKey('//Alice'); + donor = await privateKey({filename: __filename}); }); }); @@ -137,7 +137,7 @@ before(async function() { await usingEthPlaygrounds(async (helper, privateKey) => { - donor = privateKey('//Alice'); + donor = await privateKey({filename: __filename}); [alice] = await helper.arrange.createAccounts([10n], donor); }); }); @@ -318,7 +318,7 @@ before(async function() { await usingEthPlaygrounds(async (helper, privateKey) => { - donor = privateKey('//Alice'); + donor = await privateKey({filename: __filename}); [alice] = await helper.arrange.createAccounts([10n], donor); }); }); @@ -371,7 +371,7 @@ before(async function() { await usingEthPlaygrounds(async (helper, privateKey) => { - donor = privateKey('//Alice'); + donor = await privateKey({filename: __filename}); [alice] = await helper.arrange.createAccounts([20n], donor); }); }); @@ -385,9 +385,11 @@ contract.events.allEvents((_: any, event: any) => { events.push(event); }); + const {tokenId} = await collection.mintToken(alice); + if (events.length == 0) await helper.wait.newBlocks(1); + const event = events[0]; - const event = events[0]; expect(event.event).to.be.equal('Transfer'); expect(event.address).to.be.equal(collectionAddress); expect(event.returnValues.from).to.be.equal('0x0000000000000000000000000000000000000000'); @@ -408,8 +410,9 @@ }); await token.burn(alice); + if (events.length == 0) await helper.wait.newBlocks(1); + const event = events[0]; - const event = events[0]; expect(event.event).to.be.equal('Transfer'); expect(event.address).to.be.equal(collectionAddress); expect(event.returnValues.from).to.be.equal(helper.address.substrateToEth(alice.address)); @@ -432,8 +435,9 @@ }); await token.approve(alice, {Ethereum: receiver}); + if (events.length == 0) await helper.wait.newBlocks(1); + const event = events[0]; - const event = events[0]; expect(event.event).to.be.equal('Approval'); expect(event.address).to.be.equal(collectionAddress); expect(event.returnValues.owner).to.be.equal(helper.address.substrateToEth(alice.address)); @@ -458,8 +462,9 @@ }); await token.transferFrom(bob, {Substrate: alice.address}, {Ethereum: receiver}); - + if (events.length == 0) await helper.wait.newBlocks(1); const event = events[0]; + expect(event.address).to.be.equal(collectionAddress); expect(event.returnValues.from).to.be.equal(helper.address.substrateToEth(alice.address)); expect(event.returnValues.to).to.be.equal(receiver); @@ -481,8 +486,9 @@ }); await token.transfer(alice, {Ethereum: receiver}); - + if (events.length == 0) await helper.wait.newBlocks(1); const event = events[0]; + expect(event.address).to.be.equal(collectionAddress); expect(event.returnValues.from).to.be.equal(helper.address.substrateToEth(alice.address)); expect(event.returnValues.to).to.be.equal(receiver); @@ -496,7 +502,7 @@ before(async function() { await usingEthPlaygrounds(async (helper, privateKey) => { - donor = privateKey('//Alice'); + donor = await privateKey({filename: __filename}); [alice] = await helper.arrange.createAccounts([20n], donor); }); }); --- a/tests/src/eth/payable.test.ts +++ b/tests/src/eth/payable.test.ts @@ -16,14 +16,14 @@ import {IKeyringPair} from '@polkadot/types/types'; -import {itEth, expect, usingEthPlaygrounds, EthUniqueHelper} from './util/playgrounds'; +import {itEth, expect, usingEthPlaygrounds, EthUniqueHelper} from './util'; describe('EVM payable contracts', () => { let donor: IKeyringPair; before(async function() { await usingEthPlaygrounds(async (_, privateKey) => { - donor = privateKey('//Alice'); + donor = await privateKey({filename: __filename}); }); }); @@ -68,7 +68,7 @@ expect(await contract.methods.getUnaccounted().call()).to.be.equal(weiCount.toString()); }); - itEth('Balance can be retrieved from evm contract', async({helper, privateKey}) => { + itEth('Balance can be retrieved from evm contract', async({helper}) => { const FEE_BALANCE = 10n * helper.balance.getOneTokenNominal(); const CONTRACT_BALANCE = 1n * helper.balance.getOneTokenNominal(); @@ -80,7 +80,7 @@ await web3.eth.sendTransaction({from: deployer, to: contract.options.address, value: CONTRACT_BALANCE.toString(), gas: helper.eth.DEFAULT_GAS}); - const receiver = privateKey(`//Receiver${Date.now()}`); + const [receiver] = await helper.arrange.createAccounts([0n], donor); // First receive balance on eth balance of bob { @@ -110,7 +110,7 @@ before(async function() { await usingEthPlaygrounds(async (_, privateKey) => { - donor = privateKey('//Alice'); + donor = await privateKey({filename: __filename}); }); }); --- a/tests/src/eth/proxy/fungibleProxy.test.ts +++ b/tests/src/eth/proxy/fungibleProxy.test.ts @@ -17,7 +17,7 @@ import {expect} from 'chai'; import {readFile} from 'fs/promises'; import {IKeyringPair} from '@polkadot/types/types'; -import {EthUniqueHelper, itEth, usingEthPlaygrounds} from '../util/playgrounds'; +import {EthUniqueHelper, itEth, usingEthPlaygrounds} from '../util'; async function proxyWrap(helper: EthUniqueHelper, wrapped: any, donor: IKeyringPair) { // Proxy owner has no special privilegies, we don't need to reuse them @@ -37,7 +37,7 @@ before(async function() { await usingEthPlaygrounds(async (helper, privateKey) => { - donor = privateKey('//Alice'); + donor = await privateKey({filename: __filename}); [alice] = await helper.arrange.createAccounts([10n], donor); }); }); @@ -76,7 +76,7 @@ before(async function() { await usingEthPlaygrounds(async (helper, privateKey) => { - donor = privateKey('//Alice'); + donor = await privateKey({filename: __filename}); [alice] = await helper.arrange.createAccounts([10n], donor); }); }); --- a/tests/src/eth/proxy/nonFungibleProxy.test.ts +++ b/tests/src/eth/proxy/nonFungibleProxy.test.ts @@ -16,7 +16,7 @@ import {readFile} from 'fs/promises'; import {IKeyringPair} from '@polkadot/types/types'; -import {EthUniqueHelper, itEth, usingEthPlaygrounds, expect} from '../util/playgrounds'; +import {EthUniqueHelper, itEth, usingEthPlaygrounds, expect} from '../util'; async function proxyWrap(helper: EthUniqueHelper, wrapped: any, donor: IKeyringPair) { @@ -37,7 +37,7 @@ before(async function() { await usingEthPlaygrounds(async (helper, privateKey) => { - donor = privateKey('//Alice'); + donor = await privateKey({filename: __filename}); [alice] = await helper.arrange.createAccounts([10n], donor); }); }); @@ -94,7 +94,7 @@ before(async function() { await usingEthPlaygrounds(async (helper, privateKey) => { - donor = privateKey('//Alice'); + donor = await privateKey({filename: __filename}); [alice] = await helper.arrange.createAccounts([10n], donor); }); }); --- a/tests/src/eth/reFungible.test.ts +++ b/tests/src/eth/reFungible.test.ts @@ -14,8 +14,8 @@ // You should have received a copy of the GNU General Public License // along with Unique Network. If not, see . -import {Pallets, requirePalletsOrSkip} from '../util/playgrounds'; -import {expect, itEth, usingEthPlaygrounds} from './util/playgrounds'; +import {Pallets, requirePalletsOrSkip} from '../util'; +import {expect, itEth, usingEthPlaygrounds} from './util'; import {IKeyringPair} from '@polkadot/types/types'; describe('Refungible: Information getting', () => { @@ -25,7 +25,7 @@ await usingEthPlaygrounds(async (helper, privateKey) => { requirePalletsOrSkip(this, helper, [Pallets.ReFungible]); - donor = privateKey('//Alice'); + donor = await privateKey({filename: __filename}); }); }); @@ -117,7 +117,7 @@ await usingEthPlaygrounds(async (helper, privateKey) => { requirePalletsOrSkip(this, helper, [Pallets.ReFungible]); - donor = privateKey('//Alice'); + donor = await privateKey({filename: __filename}); }); }); @@ -286,9 +286,11 @@ contract.events.allEvents((_: any, event: any) => { events.push(event); }); + await tokenContract.methods.transfer(receiver, 1).send(); + if (events.length == 0) await helper.wait.newBlocks(1); + const event = events[0]; - const event = events[0]; expect(event.address).to.equal(collectionAddress); expect(event.returnValues.from).to.equal('0xFFfFfFffFFfffFFfFFfFFFFFffFFFffffFfFFFfF'); expect(event.returnValues.to).to.equal(receiver); @@ -312,9 +314,11 @@ contract.events.allEvents((_: any, event: any) => { events.push(event); }); + await tokenContract.methods.transfer(receiver, 1).send(); + if (events.length == 0) await helper.wait.newBlocks(1); + const event = events[0]; - const event = events[0]; expect(event.address).to.equal(collectionAddress); expect(event.returnValues.from).to.equal(caller); expect(event.returnValues.to).to.equal('0xFFfFfFffFFfffFFfFFfFFFFFffFFFffffFfFFFfF'); @@ -329,7 +333,7 @@ await usingEthPlaygrounds(async (helper, privateKey) => { requirePalletsOrSkip(this, helper, [Pallets.ReFungible]); - donor = privateKey('//Alice'); + donor = await privateKey({filename: __filename}); }); }); @@ -370,7 +374,7 @@ await usingEthPlaygrounds(async (helper, privateKey) => { requirePalletsOrSkip(this, helper, [Pallets.ReFungible]); - donor = privateKey('//Alice'); + donor = await privateKey({filename: __filename}); [alice] = await helper.arrange.createAccounts([20n], donor); }); }); --- a/tests/src/eth/reFungibleToken.test.ts +++ b/tests/src/eth/reFungibleToken.test.ts @@ -14,8 +14,8 @@ // You should have received a copy of the GNU General Public License // along with Unique Network. If not, see . -import {Pallets, requirePalletsOrSkip} from '../util/playgrounds'; -import {EthUniqueHelper, expect, itEth, usingEthPlaygrounds} from './util/playgrounds'; +import {Pallets, requirePalletsOrSkip} from '../util'; +import {EthUniqueHelper, expect, itEth, usingEthPlaygrounds} from './util'; import {IKeyringPair} from '@polkadot/types/types'; import {Contract} from 'web3-eth-contract'; @@ -28,7 +28,7 @@ await usingEthPlaygrounds(async (helper, privateKey) => { requirePalletsOrSkip(this, helper, [Pallets.ReFungible]); - donor = privateKey('//Alice'); + donor = await privateKey({filename: __filename}); [alice] = await helper.arrange.createAccounts([20n], donor); }); }); @@ -72,7 +72,7 @@ await usingEthPlaygrounds(async (helper, privateKey) => { requirePalletsOrSkip(this, helper, [Pallets.ReFungible]); - donor = privateKey('//Alice'); + donor = await privateKey({filename: __filename}); }); }); @@ -136,7 +136,7 @@ await usingEthPlaygrounds(async (helper, privateKey) => { requirePalletsOrSkip(this, helper, [Pallets.ReFungible]); - donor = privateKey('//Alice'); + donor = await privateKey({filename: __filename}); [alice] = await helper.arrange.createAccounts([50n], donor); }); }); @@ -311,6 +311,7 @@ }); await tokenContract.methods.burnFrom(caller, 1).send(); + if (events.length == 0) await helper.wait.newBlocks(1); const event = events[0]; expect(event.address).to.be.equal(collectionAddress); expect(event.returnValues.from).to.be.equal('0xFFfFfFffFFfffFFfFFfFFFFFffFFFffffFfFFFfF'); @@ -327,7 +328,7 @@ await usingEthPlaygrounds(async (helper, privateKey) => { requirePalletsOrSkip(this, helper, [Pallets.ReFungible]); - donor = privateKey('//Alice'); + donor = await privateKey({filename: __filename}); [alice] = await helper.arrange.createAccounts([50n], donor); }); }); @@ -382,7 +383,7 @@ await usingEthPlaygrounds(async (helper, privateKey) => { requirePalletsOrSkip(this, helper, [Pallets.ReFungible]); - donor = privateKey('//Alice'); + donor = await privateKey({filename: __filename}); [alice] = await helper.arrange.createAccounts([50n], donor); }); }); @@ -399,9 +400,11 @@ contract.events.allEvents((_: any, event: any) => { events.push(event); }); + expect(await token.approve(alice, {Ethereum: receiver}, 100n)).to.be.true; - + if (events.length == 0) await helper.wait.newBlocks(1); const event = events[0]; + expect(event.event).to.be.equal('Approval'); expect(event.address).to.be.equal(tokenAddress); expect(event.returnValues.owner).to.be.equal(helper.address.substrateToEth(alice.address)); @@ -425,6 +428,7 @@ }); expect(await token.transferFrom(bob, {Substrate: alice.address}, {Ethereum: receiver}, 51n)).to.be.true; + if (events.length == 0) await helper.wait.newBlocks(1); let event = events[0]; expect(event.event).to.be.equal('Transfer'); @@ -455,8 +459,9 @@ }); expect(await token.transfer(alice, {Ethereum: receiver}, 51n)).to.be.true; + if (events.length == 0) await helper.wait.newBlocks(1); + const event = events[0]; - const event = events[0]; expect(event.event).to.be.equal('Transfer'); expect(event.address).to.be.equal(tokenAddress); expect(event.returnValues.from).to.be.equal(helper.address.substrateToEth(alice.address)); @@ -472,7 +477,7 @@ await usingEthPlaygrounds(async (helper, privateKey) => { requirePalletsOrSkip(this, helper, [Pallets.ReFungible]); - donor = privateKey('//Alice'); + donor = await privateKey({filename: __filename}); }); }); --- a/tests/src/eth/sponsoring.test.ts +++ b/tests/src/eth/sponsoring.test.ts @@ -15,15 +15,15 @@ // along with Unique Network. If not, see . import {IKeyringPair} from '@polkadot/types/types'; -import {itEth, expect, SponsoringMode} from '../eth/util/playgrounds'; -import {usingPlaygrounds} from './../util/playgrounds/index'; +import {itEth, expect, SponsoringMode} from './util'; +import {usingPlaygrounds} from '../util/index'; describe('EVM sponsoring', () => { let donor: IKeyringPair; before(async () => { - await usingPlaygrounds(async (helper, privateKey) => { - donor = privateKey('//Alice'); + await usingPlaygrounds(async (_helper, privateKey) => { + donor = await privateKey({filename: __filename}); }); }); --- a/tests/src/eth/tokenProperties.test.ts +++ b/tests/src/eth/tokenProperties.test.ts @@ -1,32 +1,45 @@ +// Copyright 2019-2022 Unique Network (Gibraltar) Ltd. +// This file is part of Unique Network. + +// Unique Network is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Unique Network is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Unique Network. If not, see . + +import {itEth, usingEthPlaygrounds, expect} from './util'; import {IKeyringPair} from '@polkadot/types/types'; -import {usingPlaygrounds} from './../util/playgrounds/index'; -import {itEth, expect} from '../eth/util/playgrounds'; describe('EVM token properties', () => { let donor: IKeyringPair; let alice: IKeyringPair; - before(async () => { - await usingPlaygrounds(async (helper, privateKey) => { - donor = privateKey('//Alice'); - [alice] = await helper.arrange.createAccounts([1000n], donor); + before(async function() { + await usingEthPlaygrounds(async (helper, privateKey) => { + donor = await privateKey({filename: __filename}); + [alice] = await helper.arrange.createAccounts([100n], donor); }); }); itEth('Can be reconfigured', async({helper}) => { const caller = await helper.eth.createAccountWithBalance(donor); - for(const [mutable,collectionAdmin, tokenOwner] of cartesian([], [false, true], [false, true], [false, true])) { - const collection = await helper.nft.mintCollection(alice, {tokenPrefix: 'ethp'}); + const collection = await helper.nft.mintCollection(alice); await collection.addAdmin(alice, {Ethereum: caller}); - + const address = helper.ethAddress.fromCollectionId(collection.collectionId); const contract = helper.ethNativeContract.collection(address, 'nft', caller); - + await contract.methods.setTokenPropertyPermission('testKey', mutable, collectionAdmin, tokenOwner).send({from: caller}); - const state = await collection.getPropertyPermissions(); - expect(state).to.be.deep.equal([{ + expect(await collection.getPropertyPermissions()).to.be.deep.equal([{ key: 'testKey', permission: {mutable, collectionAdmin, tokenOwner}, }]); @@ -36,7 +49,6 @@ itEth('Can be set', async({helper}) => { const caller = await helper.eth.createAccountWithBalance(donor); const collection = await helper.nft.mintCollection(alice, { - tokenPrefix: 'ethp', tokenPropertyPermissions: [{ key: 'testKey', permission: { @@ -60,7 +72,6 @@ itEth('Can be deleted', async({helper}) => { const caller = await helper.eth.createAccountWithBalance(donor); const collection = await helper.nft.mintCollection(alice, { - tokenPrefix: 'ethp', tokenPropertyPermissions: [{ key: 'testKey', permission: { @@ -69,11 +80,11 @@ }, }], }); + + const token = await collection.mintToken(alice); + await token.setProperties(alice, [{key: 'testKey', value: 'testValue'}]); await collection.addAdmin(alice, {Ethereum: caller}); - - const token = await collection.mintToken(alice); - await token.setProperties(alice, [{key: 'testKey', value: 'testValue'}]); const address = helper.ethAddress.fromCollectionId(collection.collectionId); const contract = helper.ethNativeContract.collection(address, 'nft', caller); @@ -85,9 +96,8 @@ }); itEth('Can be read', async({helper}) => { - const caller = await helper.eth.createAccountWithBalance(donor); + const caller = helper.eth.createAccount(); const collection = await helper.nft.mintCollection(alice, { - tokenPrefix: 'ethp', tokenPropertyPermissions: [{ key: 'testKey', permission: { @@ -95,6 +105,7 @@ }, }], }); + const token = await collection.mintToken(alice); await token.setProperties(alice, [{key: 'testKey', value: 'testValue'}]); @@ -116,4 +127,4 @@ for(const value of args[0]) { yield* cartesian([...internalRest, value], ...args.slice(1)) as any; } -} \ No newline at end of file +} --- /dev/null +++ b/tests/src/eth/util/index.ts @@ -0,0 +1,83 @@ +// Copyright 2019-2022 Unique Network (Gibraltar) Ltd. +// SPDX-License-Identifier: Apache-2.0 + +import * as path from 'path'; +import {IKeyringPair} from '@polkadot/types/types'; + +import config from '../../config'; + +import {EthUniqueHelper} from './playgrounds/unique.dev'; +import {SilentLogger, SilentConsole} from '../../util/playgrounds/unique.dev'; + +export {EthUniqueHelper} from './playgrounds/unique.dev'; + +import chai from 'chai'; +import chaiAsPromised from 'chai-as-promised'; +import chaiLike from 'chai-like'; +import {getTestSeed, requirePalletsOrSkip} from '../../util'; + +chai.use(chaiAsPromised); +chai.use(chaiLike); +export const expect = chai.expect; + +export enum SponsoringMode { + Disabled = 0, + Allowlisted = 1, + Generous = 2, +} + +export const usingEthPlaygrounds = async (code: (helper: EthUniqueHelper, privateKey: (seed: string | {filename: string}) => Promise) => Promise) => { + const silentConsole = new SilentConsole(); + silentConsole.enable(); + + const helper = new EthUniqueHelper(new SilentLogger()); + + try { + await helper.connect(config.substrateUrl); + await helper.connectWeb3(config.substrateUrl); + const ss58Format = helper.chain.getChainProperties().ss58Format; + const privateKey = async (seed: string | {filename: string}) => { + if (typeof seed === 'string') { + return helper.util.fromSeed(seed, ss58Format); + } + else { + const actualSeed = getTestSeed(seed.filename); + let account = helper.util.fromSeed(actualSeed, ss58Format); + if (await helper.balance.getSubstrate(account.address) == 0n) { + console.warn(`${path.basename(seed.filename)}: Not enough funds present on the filename account. Using the default one as the donor instead.`); + account = helper.util.fromSeed('//Alice', ss58Format); + } + return account; + } + }; + await code(helper, privateKey); + } + finally { + await helper.disconnect(); + silentConsole.disable(); + } +}; + +export async function itEth(name: string, cb: (apis: { helper: EthUniqueHelper, privateKey: (seed: string | {filename: string}) => Promise }) => any, opts: { only?: boolean, skip?: boolean, requiredPallets?: string[] } = {}) { + (opts.only ? it.only : + opts.skip ? it.skip : it)(name, async function() { + await usingEthPlaygrounds(async (helper, privateKey) => { + if (opts.requiredPallets) { + requirePalletsOrSkip(this, helper, opts.requiredPallets); + } + + await cb({helper, privateKey}); + }); + }); +} + +export async function itEthIfWithPallet(name: string, required: string[], cb: (apis: { helper: EthUniqueHelper, privateKey: (seed: string | {filename: string}) => Promise }) => any, opts: { only?: boolean, skip?: boolean, requiredPallets?: string[] } = {}) { + return itEth(name, cb, {requiredPallets: required, ...opts}); +} + +itEth.only = (name: string, cb: (apis: { helper: EthUniqueHelper, privateKey: (seed: string | {filename: string}) => Promise }) => any) => itEth(name, cb, {only: true}); +itEth.skip = (name: string, cb: (apis: { helper: EthUniqueHelper, privateKey: (seed: string | {filename: string}) => Promise }) => any) => itEth(name, cb, {skip: true}); + +itEthIfWithPallet.only = (name: string, required: string[], cb: (apis: { helper: EthUniqueHelper, privateKey: (seed: string | {filename: string}) => Promise }) => any) => itEthIfWithPallet(name, required, cb, {only: true}); +itEthIfWithPallet.skip = (name: string, required: string[], cb: (apis: { helper: EthUniqueHelper, privateKey: (seed: string | {filename: string}) => Promise }) => any) => itEthIfWithPallet(name, required, cb, {skip: true}); +itEth.ifWithPallets = itEthIfWithPallet; --- a/tests/src/eth/util/playgrounds/index.ts +++ /dev/null @@ -1,68 +0,0 @@ -// Copyright 2019-2022 Unique Network (Gibraltar) Ltd. -// SPDX-License-Identifier: Apache-2.0 - -import {IKeyringPair} from '@polkadot/types/types'; - -import config from '../../../config'; - -import {EthUniqueHelper} from './unique.dev'; -import {SilentLogger, SilentConsole} from '../../../util/playgrounds/unique.dev'; - -export {EthUniqueHelper} from './unique.dev'; - -import chai from 'chai'; -import chaiAsPromised from 'chai-as-promised'; -import chaiLike from 'chai-like'; -import {requirePalletsOrSkip} from '../../../util/playgrounds'; -chai.use(chaiAsPromised); -chai.use(chaiLike); -export const expect = chai.expect; - -export enum SponsoringMode { - Disabled = 0, - Allowlisted = 1, - Generous = 2, -} - -export const usingEthPlaygrounds = async (code: (helper: EthUniqueHelper, privateKey: (seed: string) => IKeyringPair) => Promise) => { - const silentConsole = new SilentConsole(); - silentConsole.enable(); - - const helper = new EthUniqueHelper(new SilentLogger()); - - try { - await helper.connect(config.substrateUrl); - await helper.connectWeb3(config.substrateUrl); - const ss58Format = helper.chain.getChainProperties().ss58Format; - const privateKey = (seed: string) => helper.util.fromSeed(seed, ss58Format); - await code(helper, privateKey); - } - finally { - await helper.disconnect(); - silentConsole.disable(); - } -}; - -export async function itEth(name: string, cb: (apis: { helper: EthUniqueHelper, privateKey: (seed: string) => IKeyringPair }) => any, opts: { only?: boolean, skip?: boolean, requiredPallets?: string[] } = {}) { - (opts.only ? it.only : - opts.skip ? it.skip : it)(name, async function() { - await usingEthPlaygrounds(async (helper, privateKey) => { - if (opts.requiredPallets) { - requirePalletsOrSkip(this, helper, opts.requiredPallets); - } - - await cb({helper, privateKey}); - }); - }); -} - -export async function itEthIfWithPallet(name: string, required: string[], cb: (apis: { helper: EthUniqueHelper, privateKey: (seed: string) => IKeyringPair }) => any, opts: { only?: boolean, skip?: boolean, requiredPallets?: string[] } = {}) { - return itEth(name, cb, {requiredPallets: required, ...opts}); -} - -itEth.only = (name: string, cb: (apis: { helper: EthUniqueHelper, privateKey: (seed: string) => IKeyringPair }) => any) => itEth(name, cb, {only: true}); -itEth.skip = (name: string, cb: (apis: { helper: EthUniqueHelper, privateKey: (seed: string) => IKeyringPair }) => any) => itEth(name, cb, {skip: true}); - -itEthIfWithPallet.only = (name: string, required: string[], cb: (apis: { helper: EthUniqueHelper, privateKey: (seed: string) => IKeyringPair }) => any) => itEthIfWithPallet(name, required, cb, {only: true}); -itEthIfWithPallet.skip = (name: string, required: string[], cb: (apis: { helper: EthUniqueHelper, privateKey: (seed: string) => IKeyringPair }) => any) => itEthIfWithPallet(name, required, cb, {skip: true}); -itEth.ifWithPallets = itEthIfWithPallet; --- a/tests/src/eth/util/playgrounds/unique.dev.ts +++ b/tests/src/eth/util/playgrounds/unique.dev.ts @@ -142,14 +142,14 @@ return account.address; } - async createAccountWithBalance(donor: IKeyringPair, amount=1000n) { + async createAccountWithBalance(donor: IKeyringPair, amount=100n) { const account = this.createAccount(); await this.transferBalanceFromSubstrate(donor, account, amount); return account; } - async transferBalanceFromSubstrate(donor: IKeyringPair, recepient: string, amount=1000n, inTokens=true) { + async transferBalanceFromSubstrate(donor: IKeyringPair, recepient: string, amount=100n, inTokens=true) { return await this.helper.balance.transferToSubstrate(donor, evmToAddress(recepient), amount * (inTokens ? this.helper.balance.getOneTokenNominal() : 1n)); } --- a/tests/src/fungible.test.ts +++ b/tests/src/fungible.test.ts @@ -15,17 +15,18 @@ // along with Unique Network. If not, see . import {IKeyringPair} from '@polkadot/types/types'; -import {itSub, usingPlaygrounds, expect} from './util/playgrounds'; +import {itSub, usingPlaygrounds, expect} from './util'; const U128_MAX = (1n << 128n) - 1n; describe('integration test: Fungible functionality:', () => { + let donor: IKeyringPair; let alice: IKeyringPair; let bob: IKeyringPair; before(async () => { await usingPlaygrounds(async (helper, privateKey) => { - const donor = privateKey('//Alice'); + donor = await privateKey({filename: __filename}); [alice, bob] = await helper.arrange.createAccounts([100n, 10n], donor); }); }); @@ -43,9 +44,9 @@ expect(aliceBalance).to.be.equal(U128_MAX); }); - itSub('RPC method tokenOnewrs for fungible collection and token', async ({helper, privateKey}) => { + itSub('RPC method tokenOnewrs for fungible collection and token', async ({helper}) => { const ethAcc = {Ethereum: '0x67fb3503a61b284dc83fa96dceec4192db47dc7c'}; - const facelessCrowd = Array(7).fill(0).map((_, i) => ({Substrate: privateKey(`//Alice+${i}`).address})); + const facelessCrowd = (await helper.arrange.createAccounts(Array(7).fill(0n), donor)).map(keyring => {return {Substrate: keyring.address};}); const collection = await helper.ft.mintCollection(alice, {name: 'test', description: 'test', tokenPrefix: 'test'}); @@ -64,7 +65,7 @@ expect(owners).to.deep.include.members([{Substrate: alice.address}, ethAcc, {Substrate: bob.address}, ...facelessCrowd]); expect(owners.length).to.be.equal(10); - const eleven = privateKey('//ALice+11'); + const [eleven] = await helper.arrange.createAccounts([0n], donor); expect(await collection.transfer(alice, {Substrate: eleven.address}, 10n)).to.be.true; expect((await collection.getTop10Owners()).length).to.be.equal(10); }); --- a/tests/src/getPropertiesRpc.test.ts +++ b/tests/src/getPropertiesRpc.test.ts @@ -15,7 +15,7 @@ // along with Unique Network. If not, see . import {IKeyringPair} from '@polkadot/types/types'; -import {itSub, usingPlaygrounds, expect} from './util/playgrounds'; +import {itSub, usingPlaygrounds, expect} from './util'; import {UniqueHelper, UniqueNFTCollection} from './util/playgrounds/unique'; const collectionProps = [ @@ -63,7 +63,7 @@ before(async () => { await usingPlaygrounds(async (_, privateKey) => { - alice = privateKey('//Alice'); + alice = await privateKey({filename: __filename}); }); }); --- a/tests/src/inflation.test.ts +++ b/tests/src/inflation.test.ts @@ -15,7 +15,7 @@ // along with Unique Network. If not, see . import {IKeyringPair} from '@polkadot/types/types'; -import {expect, itSub, usingPlaygrounds} from './util/playgrounds'; +import {expect, itSub, usingPlaygrounds} from './util'; // todo:playgrounds requires sudo, look into on the later stage describe('integration test: Inflation', () => { @@ -23,7 +23,7 @@ before(async () => { await usingPlaygrounds(async (_, privateKey) => { - superuser = privateKey('//Alice'); + superuser = await privateKey('//Alice'); }); }); --- a/tests/src/interfaces/augment-api-consts.ts +++ b/tests/src/interfaces/augment-api-consts.ts @@ -8,7 +8,7 @@ import type { ApiTypes, AugmentedConst } from '@polkadot/api-base/types'; import type { Option, u128, u16, u32, u64, u8 } from '@polkadot/types-codec'; import type { Codec } from '@polkadot/types-codec/types'; -import type { Perbill, Permill } from '@polkadot/types/interfaces/runtime'; +import type { Perbill, Permill, Weight } from '@polkadot/types/interfaces/runtime'; import type { FrameSupportPalletId, FrameSupportWeightsRuntimeDbWeight, FrameSystemLimitsBlockLength, FrameSystemLimitsBlockWeights, SpVersionRuntimeVersion, XcmV1MultiLocation } from '@polkadot/types/lookup'; export type __AugmentedConst = AugmentedConst; @@ -97,7 +97,7 @@ * The maximum weight that may be scheduled per block for any dispatchables of less * priority than `schedule::HARD_DEADLINE`. **/ - maximumWeight: u64 & AugmentedConst; + maximumWeight: Weight & AugmentedConst; /** * The maximum number of scheduled calls in the queue for a single block. * Not strictly enforced, but used for weight estimation. @@ -126,7 +126,7 @@ **/ dbWeight: FrameSupportWeightsRuntimeDbWeight & AugmentedConst; /** - * The designated SS85 prefix of this chain. + * The designated SS58 prefix of this chain. * * This replaces the "ss58Format" property declared in the chain spec. Reason is * that the runtime should know about the prefix in order to make use of it as --- a/tests/src/interfaces/augment-api-events.ts +++ b/tests/src/interfaces/augment-api-events.ts @@ -8,7 +8,7 @@ import type { ApiTypes, AugmentedEvent } from '@polkadot/api-base/types'; import type { Bytes, Null, Option, Result, U256, U8aFixed, bool, u128, u32, u64, u8 } from '@polkadot/types-codec'; import type { ITuple } from '@polkadot/types-codec/types'; -import type { AccountId32, H160, H256 } from '@polkadot/types/interfaces/runtime'; +import type { AccountId32, H160, H256, Weight } from '@polkadot/types/interfaces/runtime'; import type { EthereumLog, EvmCoreErrorExitReason, FrameSupportScheduleLookupError, FrameSupportTokensMiscBalanceStatus, FrameSupportWeightsDispatchInfo, OrmlVestingVestingSchedule, PalletEvmAccountBasicCrossAccountIdRepr, PalletForeignAssetsAssetIds, PalletForeignAssetsModuleAssetMetadata, RmrkTraitsNftAccountIdOrCollectionNftTuple, SpRuntimeDispatchError, XcmV1MultiAsset, XcmV1MultiLocation, XcmV1MultiassetMultiAssets, XcmV2Response, XcmV2TraitsError, XcmV2TraitsOutcome, XcmV2Xcm, XcmVersionedMultiAssets, XcmVersionedMultiLocation } from '@polkadot/types/lookup'; export type __AugmentedEvent = AugmentedEvent; @@ -184,11 +184,11 @@ /** * Downward message is overweight and was placed in the overweight queue. **/ - OverweightEnqueued: AugmentedEvent; + OverweightEnqueued: AugmentedEvent; /** * Downward message from the overweight queue was executed. **/ - OverweightServiced: AugmentedEvent; + OverweightServiced: AugmentedEvent; /** * Downward message is unsupported version of XCM. **/ @@ -196,7 +196,7 @@ /** * The weight limit for handling downward messages was reached. **/ - WeightExhausted: AugmentedEvent; + WeightExhausted: AugmentedEvent; /** * Generic event **/ @@ -290,7 +290,7 @@ /** * Downward messages were processed using the given weight. **/ - DownwardMessagesProcessed: AugmentedEvent; + DownwardMessagesProcessed: AugmentedEvent; /** * Some downward messages have been received and will be processed. **/ @@ -378,7 +378,7 @@ * * \[ id, pallet index, call index, actual weight, max budgeted weight \] **/ - NotifyOverweight: AugmentedEvent; + NotifyOverweight: AugmentedEvent; /** * A given location which had a version change subscription was dropped owing to an error * migrating the location to our new XCM format. @@ -769,19 +769,19 @@ /** * Some XCM failed. **/ - Fail: AugmentedEvent, error: XcmV2TraitsError, weight: u64], { messageHash: Option, error: XcmV2TraitsError, weight: u64 }>; + Fail: AugmentedEvent, error: XcmV2TraitsError, weight: Weight], { messageHash: Option, error: XcmV2TraitsError, weight: Weight }>; /** * An XCM exceeded the individual message weight budget. **/ - OverweightEnqueued: AugmentedEvent; + OverweightEnqueued: AugmentedEvent; /** * An XCM from the overweight queue was executed with the given actual weight used. **/ - OverweightServiced: AugmentedEvent; + OverweightServiced: AugmentedEvent; /** * Some XCM was executed ok. **/ - Success: AugmentedEvent, weight: u64], { messageHash: Option, weight: u64 }>; + Success: AugmentedEvent, weight: Weight], { messageHash: Option, weight: Weight }>; /** * An upward message was sent to the relay chain. **/ --- a/tests/src/interfaces/augment-api-query.ts +++ b/tests/src/interfaces/augment-api-query.ts @@ -8,8 +8,8 @@ import type { ApiTypes, AugmentedQuery, QueryableStorageEntry } from '@polkadot/api-base/types'; import type { BTreeMap, Bytes, Option, U256, U8aFixed, Vec, bool, u128, u16, u32, u64, u8 } from '@polkadot/types-codec'; import type { AnyNumber, ITuple } from '@polkadot/types-codec/types'; -import type { AccountId32, H160, H256 } from '@polkadot/types/interfaces/runtime'; -import type { CumulusPalletDmpQueueConfigData, CumulusPalletDmpQueuePageIndexData, CumulusPalletParachainSystemRelayStateSnapshotMessagingStateSnapshot, CumulusPalletXcmpQueueInboundChannelDetails, CumulusPalletXcmpQueueOutboundChannelDetails, CumulusPalletXcmpQueueQueueConfigData, EthereumBlock, EthereumLog, EthereumReceiptReceiptV3, EthereumTransactionTransactionV2, FpRpcTransactionStatus, FrameSupportWeightsPerDispatchClassU64, FrameSystemAccountInfo, FrameSystemEventRecord, FrameSystemLastRuntimeUpgradeInfo, FrameSystemPhase, OrmlTokensAccountData, OrmlTokensBalanceLock, OrmlTokensReserveData, OrmlVestingVestingSchedule, PalletBalancesAccountData, PalletBalancesBalanceLock, PalletBalancesReleases, PalletBalancesReserveData, PalletEvmAccountBasicCrossAccountIdRepr, PalletEvmContractHelpersSponsoringModeT, PalletForeignAssetsAssetIds, PalletForeignAssetsModuleAssetMetadata, PalletNonfungibleItemData, PalletRefungibleItemData, PalletTransactionPaymentReleases, PalletTreasuryProposal, PalletUniqueSchedulerScheduledV3, PhantomTypeUpDataStructs, PolkadotCorePrimitivesOutboundHrmpMessage, PolkadotPrimitivesV2AbridgedHostConfiguration, PolkadotPrimitivesV2PersistedValidationData, PolkadotPrimitivesV2UpgradeRestriction, SpRuntimeDigest, SpTrieStorageProof, UpDataStructsCollection, UpDataStructsCollectionStats, UpDataStructsProperties, UpDataStructsPropertiesMapPropertyPermission, UpDataStructsPropertyPermission, UpDataStructsPropertyScope, UpDataStructsSponsorshipStateBasicCrossAccountIdRepr, UpDataStructsTokenChild, XcmV1MultiLocation } from '@polkadot/types/lookup'; +import type { AccountId32, H160, H256, Weight } from '@polkadot/types/interfaces/runtime'; +import type { CumulusPalletDmpQueueConfigData, CumulusPalletDmpQueuePageIndexData, CumulusPalletParachainSystemRelayStateSnapshotMessagingStateSnapshot, CumulusPalletXcmpQueueInboundChannelDetails, CumulusPalletXcmpQueueOutboundChannelDetails, CumulusPalletXcmpQueueQueueConfigData, EthereumBlock, EthereumLog, EthereumReceiptReceiptV3, EthereumTransactionTransactionV2, FpRpcTransactionStatus, FrameSupportWeightsPerDispatchClassWeight, FrameSystemAccountInfo, FrameSystemEventRecord, FrameSystemLastRuntimeUpgradeInfo, FrameSystemPhase, OrmlTokensAccountData, OrmlTokensBalanceLock, OrmlTokensReserveData, OrmlVestingVestingSchedule, PalletBalancesAccountData, PalletBalancesBalanceLock, PalletBalancesReleases, PalletBalancesReserveData, PalletEvmAccountBasicCrossAccountIdRepr, PalletEvmContractHelpersSponsoringModeT, PalletForeignAssetsAssetIds, PalletForeignAssetsModuleAssetMetadata, PalletNonfungibleItemData, PalletRefungibleItemData, PalletTransactionPaymentReleases, PalletTreasuryProposal, PalletUniqueSchedulerScheduledV3, PhantomTypeUpDataStructs, PolkadotCorePrimitivesOutboundHrmpMessage, PolkadotPrimitivesV2AbridgedHostConfiguration, PolkadotPrimitivesV2PersistedValidationData, PolkadotPrimitivesV2UpgradeRestriction, SpRuntimeDigest, SpTrieStorageProof, UpDataStructsCollection, UpDataStructsCollectionStats, UpDataStructsProperties, UpDataStructsPropertiesMapPropertyPermission, UpDataStructsPropertyPermission, UpDataStructsPropertyScope, UpDataStructsSponsorshipStateBasicCrossAccountIdRepr, UpDataStructsTokenChild, XcmV1MultiLocation } from '@polkadot/types/lookup'; import type { Observable } from '@polkadot/types/types'; export type __AugmentedQuery = AugmentedQuery unknown>; @@ -555,12 +555,12 @@ * The weight we reserve at the beginning of the block for processing DMP messages. This * overrides the amount set in the Config trait. **/ - reservedDmpWeightOverride: AugmentedQuery Observable>, []> & QueryableStorageEntry; + reservedDmpWeightOverride: AugmentedQuery Observable>, []> & QueryableStorageEntry; /** * The weight we reserve at the beginning of the block for processing XCMP messages. This * overrides the amount set in the Config trait. **/ - reservedXcmpWeightOverride: AugmentedQuery Observable>, []> & QueryableStorageEntry; + reservedXcmpWeightOverride: AugmentedQuery Observable>, []> & QueryableStorageEntry; /** * An option which indicates if the relay-chain restricts signalling a validation code upgrade. * In other words, if this is `Some` and [`NewValidationCode`] is `Some` then the produced @@ -716,7 +716,7 @@ /** * The current weight for the block. **/ - blockWeight: AugmentedQuery Observable, []> & QueryableStorageEntry; + blockWeight: AugmentedQuery Observable, []> & QueryableStorageEntry; /** * Digest of the current block, also part of the block header. **/ --- a/tests/src/interfaces/augment-api-rpc.ts +++ b/tests/src/interfaces/augment-api-rpc.ts @@ -161,22 +161,27 @@ }; contracts: { /** + * @deprecated Use the runtime interface `api.call.contractsApi.call` instead * Executes a call to a contract **/ call: AugmentedRpc<(callRequest: ContractCallRequest | { origin?: any; dest?: any; value?: any; gasLimit?: any; storageDepositLimit?: any; inputData?: any } | string | Uint8Array, at?: BlockHash | string | Uint8Array) => Observable>; /** + * @deprecated Use the runtime interface `api.call.contractsApi.getStorage` instead * Returns the value under a specified storage key in a contract **/ getStorage: AugmentedRpc<(address: AccountId | string | Uint8Array, key: H256 | string | Uint8Array, at?: BlockHash | string | Uint8Array) => Observable>>; /** + * @deprecated Use the runtime interface `api.call.contractsApi.instantiate` instead * Instantiate a new contract **/ instantiate: AugmentedRpc<(request: InstantiateRequest | { origin?: any; value?: any; gasLimit?: any; storageDepositLimit?: any; code?: any; data?: any; salt?: any } | string | Uint8Array, at?: BlockHash | string | Uint8Array) => Observable>; /** + * @deprecated Not available in newer versions of the contracts interfaces * Returns the projected time a given contract will be able to sustain paying its rent **/ rentProjection: AugmentedRpc<(address: AccountId | string | Uint8Array, at?: BlockHash | string | Uint8Array) => Observable>>; /** + * @deprecated Use the runtime interface `api.call.contractsApi.uploadCode` instead * Upload new code without instantiating a contract from it **/ uploadCode: AugmentedRpc<(uploadRequest: CodeUploadRequest | { origin?: any; code?: any; storageDepositLimit?: any } | string | Uint8Array, at?: BlockHash | string | Uint8Array) => Observable>; @@ -515,6 +520,7 @@ **/ getChildStorageSize: AugmentedRpc<(childStorageKey: StorageKey | string | Uint8Array | any, childDefinition: StorageKey | string | Uint8Array | any, childType: u32 | AnyNumber | Uint8Array, key: StorageKey | string | Uint8Array | any, at?: BlockHash | string | Uint8Array) => Observable>; /** + * @deprecated Use `api.rpc.state.getKeysPaged` to retrieve keys * Retrieves the keys with a certain prefix **/ getKeys: AugmentedRpc<(key: StorageKey | string | Uint8Array | any, at?: BlockHash | string | Uint8Array) => Observable>>; @@ -527,6 +533,7 @@ **/ getMetadata: AugmentedRpc<(at?: BlockHash | string | Uint8Array) => Observable>; /** + * @deprecated Use `api.rpc.state.getKeysPaged` to retrieve keys * Returns the keys with prefix, leave empty to get all the keys (deprecated: Use getKeysPaged) **/ getPairs: AugmentedRpc<(prefix: StorageKey | string | Uint8Array | any, at?: BlockHash | string | Uint8Array) => Observable>>; --- a/tests/src/interfaces/augment-api-tx.ts +++ b/tests/src/interfaces/augment-api-tx.ts @@ -8,7 +8,7 @@ import type { ApiTypes, AugmentedSubmittable, SubmittableExtrinsic, SubmittableExtrinsicFunction } from '@polkadot/api-base/types'; import type { Bytes, Compact, Option, U256, U8aFixed, Vec, bool, u128, u16, u32, u64, u8 } from '@polkadot/types-codec'; import type { AnyNumber, IMethod, ITuple } from '@polkadot/types-codec/types'; -import type { AccountId32, Call, H160, H256, MultiAddress, Perbill, Permill } from '@polkadot/types/interfaces/runtime'; +import type { AccountId32, Call, H160, H256, MultiAddress, Perbill, Permill, Weight } from '@polkadot/types/interfaces/runtime'; import type { CumulusPrimitivesParachainInherentParachainInherentData, EthereumTransactionTransactionV2, FrameSupportScheduleMaybeHashed, OrmlVestingVestingSchedule, PalletEvmAccountBasicCrossAccountIdRepr, PalletForeignAssetsAssetIds, PalletForeignAssetsModuleAssetMetadata, RmrkTraitsNftAccountIdOrCollectionNftTuple, RmrkTraitsPartEquippableList, RmrkTraitsPartPartType, RmrkTraitsResourceBasicResource, RmrkTraitsResourceComposableResource, RmrkTraitsResourceResourceTypes, RmrkTraitsResourceSlotResource, RmrkTraitsTheme, UpDataStructsCollectionLimits, UpDataStructsCollectionMode, UpDataStructsCollectionPermissions, UpDataStructsCreateCollectionData, UpDataStructsCreateItemData, UpDataStructsCreateItemExData, UpDataStructsProperty, UpDataStructsPropertyKeyPermission, XcmV1MultiLocation, XcmV2WeightLimit, XcmVersionedMultiAsset, XcmVersionedMultiAssets, XcmVersionedMultiLocation, XcmVersionedXcm } from '@polkadot/types/lookup'; export type __AugmentedSubmittable = AugmentedSubmittable<() => unknown>; @@ -243,7 +243,7 @@ * Events: * - `OverweightServiced`: On success. **/ - serviceOverweight: AugmentedSubmittable<(index: u64 | AnyNumber | Uint8Array, weightLimit: u64 | AnyNumber | Uint8Array) => SubmittableExtrinsic, [u64, u64]>; + serviceOverweight: AugmentedSubmittable<(index: u64 | AnyNumber | Uint8Array, weightLimit: Weight | AnyNumber | Uint8Array) => SubmittableExtrinsic, [u64, Weight]>; /** * Generic tx **/ @@ -367,7 +367,7 @@ * NOTE: A successful return to this does *not* imply that the `msg` was executed successfully * to completion; only that *some* of it was executed. **/ - execute: AugmentedSubmittable<(message: XcmVersionedXcm | { V0: any } | { V1: any } | { V2: any } | string | Uint8Array, maxWeight: u64 | AnyNumber | Uint8Array) => SubmittableExtrinsic, [XcmVersionedXcm, u64]>; + execute: AugmentedSubmittable<(message: XcmVersionedXcm | { V0: any } | { V1: any } | { V2: any } | string | Uint8Array, maxWeight: Weight | AnyNumber | Uint8Array) => SubmittableExtrinsic, [XcmVersionedXcm, Weight]>; /** * Set a safe XCM version (the version that XCM should be encoded with if the most recent * version a destination can accept is unknown). @@ -902,7 +902,7 @@ * - The weight of this call is defined by the caller. * # **/ - sudoUncheckedWeight: AugmentedSubmittable<(call: Call | IMethod | string | Uint8Array, weight: u64 | AnyNumber | Uint8Array) => SubmittableExtrinsic, [Call, u64]>; + sudoUncheckedWeight: AugmentedSubmittable<(call: Call | IMethod | string | Uint8Array, weight: Weight | AnyNumber | Uint8Array) => SubmittableExtrinsic, [Call, Weight]>; /** * Generic tx **/ @@ -1683,7 +1683,7 @@ * Events: * - `OverweightServiced`: On success. **/ - serviceOverweight: AugmentedSubmittable<(index: u64 | AnyNumber | Uint8Array, weightLimit: u64 | AnyNumber | Uint8Array) => SubmittableExtrinsic, [u64, u64]>; + serviceOverweight: AugmentedSubmittable<(index: u64 | AnyNumber | Uint8Array, weightLimit: Weight | AnyNumber | Uint8Array) => SubmittableExtrinsic, [u64, Weight]>; /** * Suspends all XCM executions for the XCMP queue, regardless of the sender's origin. * @@ -1720,7 +1720,7 @@ * - `origin`: Must pass `Root`. * - `new`: Desired value for `QueueConfigData.threshold_weight` **/ - updateThresholdWeight: AugmentedSubmittable<(updated: u64 | AnyNumber | Uint8Array) => SubmittableExtrinsic, [u64]>; + updateThresholdWeight: AugmentedSubmittable<(updated: Weight | AnyNumber | Uint8Array) => SubmittableExtrinsic, [Weight]>; /** * Overwrites the speed to which the available weight approaches the maximum weight. * A lower number results in a faster progression. A value of 1 makes the entire weight available initially. @@ -1728,7 +1728,7 @@ * - `origin`: Must pass `Root`. * - `new`: Desired value for `QueueConfigData.weight_restrict_decay`. **/ - updateWeightRestrictDecay: AugmentedSubmittable<(updated: u64 | AnyNumber | Uint8Array) => SubmittableExtrinsic, [u64]>; + updateWeightRestrictDecay: AugmentedSubmittable<(updated: Weight | AnyNumber | Uint8Array) => SubmittableExtrinsic, [Weight]>; /** * Overwrite the maximum amount of weight any individual message may consume. * Messages above this weight go into the overweight queue and may only be serviced explicitly. @@ -1736,7 +1736,7 @@ * - `origin`: Must pass `Root`. * - `new`: Desired value for `QueueConfigData.xcmp_max_individual_weight`. **/ - updateXcmpMaxIndividualWeight: AugmentedSubmittable<(updated: u64 | AnyNumber | Uint8Array) => SubmittableExtrinsic, [u64]>; + updateXcmpMaxIndividualWeight: AugmentedSubmittable<(updated: Weight | AnyNumber | Uint8Array) => SubmittableExtrinsic, [Weight]>; /** * Generic tx **/ --- a/tests/src/interfaces/augment-types.ts +++ b/tests/src/interfaces/augment-types.ts @@ -5,7 +5,7 @@ // this is required to allow for ambient/previous definitions import '@polkadot/types/types/registry'; -import type { CumulusPalletDmpQueueCall, CumulusPalletDmpQueueConfigData, CumulusPalletDmpQueueError, CumulusPalletDmpQueueEvent, CumulusPalletDmpQueuePageIndexData, CumulusPalletParachainSystemCall, CumulusPalletParachainSystemError, CumulusPalletParachainSystemEvent, CumulusPalletParachainSystemRelayStateSnapshotMessagingStateSnapshot, CumulusPalletXcmCall, CumulusPalletXcmError, CumulusPalletXcmEvent, CumulusPalletXcmOrigin, CumulusPalletXcmpQueueCall, CumulusPalletXcmpQueueError, CumulusPalletXcmpQueueEvent, CumulusPalletXcmpQueueInboundChannelDetails, CumulusPalletXcmpQueueInboundState, CumulusPalletXcmpQueueOutboundChannelDetails, CumulusPalletXcmpQueueOutboundState, CumulusPalletXcmpQueueQueueConfigData, CumulusPrimitivesParachainInherentParachainInherentData, EthbloomBloom, EthereumBlock, EthereumHeader, EthereumLog, EthereumReceiptEip658ReceiptData, EthereumReceiptReceiptV3, EthereumTransactionAccessListItem, EthereumTransactionEip1559Transaction, EthereumTransactionEip2930Transaction, EthereumTransactionLegacyTransaction, EthereumTransactionTransactionAction, EthereumTransactionTransactionSignature, EthereumTransactionTransactionV2, EthereumTypesHashH64, EvmCoreErrorExitError, EvmCoreErrorExitFatal, EvmCoreErrorExitReason, EvmCoreErrorExitRevert, EvmCoreErrorExitSucceed, FpRpcTransactionStatus, FrameSupportDispatchRawOrigin, FrameSupportPalletId, FrameSupportScheduleLookupError, FrameSupportScheduleMaybeHashed, FrameSupportTokensMiscBalanceStatus, FrameSupportWeightsDispatchClass, FrameSupportWeightsDispatchInfo, FrameSupportWeightsPays, FrameSupportWeightsPerDispatchClassU32, FrameSupportWeightsPerDispatchClassU64, FrameSupportWeightsPerDispatchClassWeightsPerClass, FrameSupportWeightsRuntimeDbWeight, FrameSystemAccountInfo, FrameSystemCall, FrameSystemError, FrameSystemEvent, FrameSystemEventRecord, FrameSystemExtensionsCheckGenesis, FrameSystemExtensionsCheckNonce, FrameSystemExtensionsCheckSpecVersion, FrameSystemExtensionsCheckTxVersion, FrameSystemExtensionsCheckWeight, FrameSystemLastRuntimeUpgradeInfo, FrameSystemLimitsBlockLength, FrameSystemLimitsBlockWeights, FrameSystemLimitsWeightsPerClass, FrameSystemPhase, OpalRuntimeOriginCaller, OpalRuntimeRuntime, OrmlTokensAccountData, OrmlTokensBalanceLock, OrmlTokensModuleCall, OrmlTokensModuleError, OrmlTokensModuleEvent, OrmlTokensReserveData, OrmlVestingModuleCall, OrmlVestingModuleError, OrmlVestingModuleEvent, OrmlVestingVestingSchedule, OrmlXtokensModuleCall, OrmlXtokensModuleError, OrmlXtokensModuleEvent, PalletAppPromotionCall, PalletAppPromotionError, PalletAppPromotionEvent, PalletBalancesAccountData, PalletBalancesBalanceLock, PalletBalancesCall, PalletBalancesError, PalletBalancesEvent, PalletBalancesReasons, PalletBalancesReleases, PalletBalancesReserveData, PalletCommonError, PalletCommonEvent, PalletConfigurationCall, PalletEthereumCall, PalletEthereumError, PalletEthereumEvent, PalletEthereumFakeTransactionFinalizer, PalletEthereumRawOrigin, PalletEvmAccountBasicCrossAccountIdRepr, PalletEvmCall, PalletEvmCoderSubstrateError, PalletEvmContractHelpersError, PalletEvmContractHelpersEvent, PalletEvmContractHelpersSponsoringModeT, PalletEvmError, PalletEvmEvent, PalletEvmMigrationCall, PalletEvmMigrationError, PalletForeignAssetsAssetIds, PalletForeignAssetsModuleAssetMetadata, PalletForeignAssetsModuleCall, PalletForeignAssetsModuleError, PalletForeignAssetsModuleEvent, PalletForeignAssetsNativeCurrency, PalletFungibleError, PalletInflationCall, PalletNonfungibleError, PalletNonfungibleItemData, PalletRefungibleError, PalletRefungibleItemData, PalletRmrkCoreCall, PalletRmrkCoreError, PalletRmrkCoreEvent, PalletRmrkEquipCall, PalletRmrkEquipError, PalletRmrkEquipEvent, PalletStructureCall, PalletStructureError, PalletStructureEvent, PalletSudoCall, PalletSudoError, PalletSudoEvent, PalletTemplateTransactionPaymentCall, PalletTemplateTransactionPaymentChargeTransactionPayment, PalletTimestampCall, PalletTransactionPaymentEvent, PalletTransactionPaymentReleases, PalletTreasuryCall, PalletTreasuryError, PalletTreasuryEvent, PalletTreasuryProposal, PalletUniqueCall, PalletUniqueError, PalletUniqueRawEvent, PalletUniqueSchedulerCall, PalletUniqueSchedulerError, PalletUniqueSchedulerEvent, PalletUniqueSchedulerScheduledV3, PalletXcmCall, PalletXcmError, PalletXcmEvent, PalletXcmOrigin, PhantomTypeUpDataStructs, PolkadotCorePrimitivesInboundDownwardMessage, PolkadotCorePrimitivesInboundHrmpMessage, PolkadotCorePrimitivesOutboundHrmpMessage, PolkadotParachainPrimitivesXcmpMessageFormat, PolkadotPrimitivesV2AbridgedHostConfiguration, PolkadotPrimitivesV2AbridgedHrmpChannel, PolkadotPrimitivesV2PersistedValidationData, PolkadotPrimitivesV2UpgradeRestriction, RmrkTraitsBaseBaseInfo, RmrkTraitsCollectionCollectionInfo, RmrkTraitsNftAccountIdOrCollectionNftTuple, RmrkTraitsNftNftChild, RmrkTraitsNftNftInfo, RmrkTraitsNftRoyaltyInfo, RmrkTraitsPartEquippableList, RmrkTraitsPartFixedPart, RmrkTraitsPartPartType, RmrkTraitsPartSlotPart, RmrkTraitsPropertyPropertyInfo, RmrkTraitsResourceBasicResource, RmrkTraitsResourceComposableResource, RmrkTraitsResourceResourceInfo, RmrkTraitsResourceResourceTypes, RmrkTraitsResourceSlotResource, RmrkTraitsTheme, RmrkTraitsThemeThemeProperty, SpCoreEcdsaSignature, SpCoreEd25519Signature, SpCoreSr25519Signature, SpCoreVoid, SpRuntimeArithmeticError, SpRuntimeDigest, SpRuntimeDigestDigestItem, SpRuntimeDispatchError, SpRuntimeModuleError, SpRuntimeMultiSignature, SpRuntimeTokenError, SpRuntimeTransactionalError, SpTrieStorageProof, SpVersionRuntimeVersion, UpDataStructsAccessMode, UpDataStructsCollection, UpDataStructsCollectionLimits, UpDataStructsCollectionMode, UpDataStructsCollectionPermissions, UpDataStructsCollectionStats, UpDataStructsCreateCollectionData, UpDataStructsCreateFungibleData, UpDataStructsCreateItemData, UpDataStructsCreateItemExData, UpDataStructsCreateNftData, UpDataStructsCreateNftExData, UpDataStructsCreateReFungibleData, UpDataStructsCreateRefungibleExMultipleOwners, UpDataStructsCreateRefungibleExSingleOwner, UpDataStructsNestingPermissions, UpDataStructsOwnerRestrictedSet, UpDataStructsProperties, UpDataStructsPropertiesMapBoundedVec, UpDataStructsPropertiesMapPropertyPermission, UpDataStructsProperty, UpDataStructsPropertyKeyPermission, UpDataStructsPropertyPermission, UpDataStructsPropertyScope, UpDataStructsRpcCollection, UpDataStructsSponsoringRateLimit, UpDataStructsSponsorshipStateAccountId32, UpDataStructsSponsorshipStateBasicCrossAccountIdRepr, UpDataStructsTokenChild, UpDataStructsTokenData, XcmDoubleEncoded, XcmV0Junction, XcmV0JunctionBodyId, XcmV0JunctionBodyPart, XcmV0JunctionNetworkId, XcmV0MultiAsset, XcmV0MultiLocation, XcmV0Order, XcmV0OriginKind, XcmV0Response, XcmV0Xcm, XcmV1Junction, XcmV1MultiAsset, XcmV1MultiLocation, XcmV1MultiassetAssetId, XcmV1MultiassetAssetInstance, XcmV1MultiassetFungibility, XcmV1MultiassetMultiAssetFilter, XcmV1MultiassetMultiAssets, XcmV1MultiassetWildFungibility, XcmV1MultiassetWildMultiAsset, XcmV1MultilocationJunctions, XcmV1Order, XcmV1Response, XcmV1Xcm, XcmV2Instruction, XcmV2Response, XcmV2TraitsError, XcmV2TraitsOutcome, XcmV2WeightLimit, XcmV2Xcm, XcmVersionedMultiAsset, XcmVersionedMultiAssets, XcmVersionedMultiLocation, XcmVersionedXcm } from './default'; +import type { CumulusPalletDmpQueueCall, CumulusPalletDmpQueueConfigData, CumulusPalletDmpQueueError, CumulusPalletDmpQueueEvent, CumulusPalletDmpQueuePageIndexData, CumulusPalletParachainSystemCall, CumulusPalletParachainSystemError, CumulusPalletParachainSystemEvent, CumulusPalletParachainSystemRelayStateSnapshotMessagingStateSnapshot, CumulusPalletXcmCall, CumulusPalletXcmError, CumulusPalletXcmEvent, CumulusPalletXcmOrigin, CumulusPalletXcmpQueueCall, CumulusPalletXcmpQueueError, CumulusPalletXcmpQueueEvent, CumulusPalletXcmpQueueInboundChannelDetails, CumulusPalletXcmpQueueInboundState, CumulusPalletXcmpQueueOutboundChannelDetails, CumulusPalletXcmpQueueOutboundState, CumulusPalletXcmpQueueQueueConfigData, CumulusPrimitivesParachainInherentParachainInherentData, EthbloomBloom, EthereumBlock, EthereumHeader, EthereumLog, EthereumReceiptEip658ReceiptData, EthereumReceiptReceiptV3, EthereumTransactionAccessListItem, EthereumTransactionEip1559Transaction, EthereumTransactionEip2930Transaction, EthereumTransactionLegacyTransaction, EthereumTransactionTransactionAction, EthereumTransactionTransactionSignature, EthereumTransactionTransactionV2, EthereumTypesHashH64, EvmCoreErrorExitError, EvmCoreErrorExitFatal, EvmCoreErrorExitReason, EvmCoreErrorExitRevert, EvmCoreErrorExitSucceed, FpRpcTransactionStatus, FrameSupportDispatchRawOrigin, FrameSupportPalletId, FrameSupportScheduleLookupError, FrameSupportScheduleMaybeHashed, FrameSupportTokensMiscBalanceStatus, FrameSupportWeightsDispatchClass, FrameSupportWeightsDispatchInfo, FrameSupportWeightsPays, FrameSupportWeightsPerDispatchClassU32, FrameSupportWeightsPerDispatchClassWeight, FrameSupportWeightsPerDispatchClassWeightsPerClass, FrameSupportWeightsRuntimeDbWeight, FrameSystemAccountInfo, FrameSystemCall, FrameSystemError, FrameSystemEvent, FrameSystemEventRecord, FrameSystemExtensionsCheckGenesis, FrameSystemExtensionsCheckNonce, FrameSystemExtensionsCheckSpecVersion, FrameSystemExtensionsCheckTxVersion, FrameSystemExtensionsCheckWeight, FrameSystemLastRuntimeUpgradeInfo, FrameSystemLimitsBlockLength, FrameSystemLimitsBlockWeights, FrameSystemLimitsWeightsPerClass, FrameSystemPhase, OpalRuntimeOriginCaller, OpalRuntimeRuntime, OrmlTokensAccountData, OrmlTokensBalanceLock, OrmlTokensModuleCall, OrmlTokensModuleError, OrmlTokensModuleEvent, OrmlTokensReserveData, OrmlVestingModuleCall, OrmlVestingModuleError, OrmlVestingModuleEvent, OrmlVestingVestingSchedule, OrmlXtokensModuleCall, OrmlXtokensModuleError, OrmlXtokensModuleEvent, PalletAppPromotionCall, PalletAppPromotionError, PalletAppPromotionEvent, PalletBalancesAccountData, PalletBalancesBalanceLock, PalletBalancesCall, PalletBalancesError, PalletBalancesEvent, PalletBalancesReasons, PalletBalancesReleases, PalletBalancesReserveData, PalletCommonError, PalletCommonEvent, PalletConfigurationCall, PalletEthereumCall, PalletEthereumError, PalletEthereumEvent, PalletEthereumFakeTransactionFinalizer, PalletEthereumRawOrigin, PalletEvmAccountBasicCrossAccountIdRepr, PalletEvmCall, PalletEvmCoderSubstrateError, PalletEvmContractHelpersError, PalletEvmContractHelpersEvent, PalletEvmContractHelpersSponsoringModeT, PalletEvmError, PalletEvmEvent, PalletEvmMigrationCall, PalletEvmMigrationError, PalletForeignAssetsAssetIds, PalletForeignAssetsModuleAssetMetadata, PalletForeignAssetsModuleCall, PalletForeignAssetsModuleError, PalletForeignAssetsModuleEvent, PalletForeignAssetsNativeCurrency, PalletFungibleError, PalletInflationCall, PalletNonfungibleError, PalletNonfungibleItemData, PalletRefungibleError, PalletRefungibleItemData, PalletRmrkCoreCall, PalletRmrkCoreError, PalletRmrkCoreEvent, PalletRmrkEquipCall, PalletRmrkEquipError, PalletRmrkEquipEvent, PalletStructureCall, PalletStructureError, PalletStructureEvent, PalletSudoCall, PalletSudoError, PalletSudoEvent, PalletTemplateTransactionPaymentCall, PalletTemplateTransactionPaymentChargeTransactionPayment, PalletTimestampCall, PalletTransactionPaymentEvent, PalletTransactionPaymentReleases, PalletTreasuryCall, PalletTreasuryError, PalletTreasuryEvent, PalletTreasuryProposal, PalletUniqueCall, PalletUniqueError, PalletUniqueRawEvent, PalletUniqueSchedulerCall, PalletUniqueSchedulerError, PalletUniqueSchedulerEvent, PalletUniqueSchedulerScheduledV3, PalletXcmCall, PalletXcmError, PalletXcmEvent, PalletXcmOrigin, PhantomTypeUpDataStructs, PolkadotCorePrimitivesInboundDownwardMessage, PolkadotCorePrimitivesInboundHrmpMessage, PolkadotCorePrimitivesOutboundHrmpMessage, PolkadotParachainPrimitivesXcmpMessageFormat, PolkadotPrimitivesV2AbridgedHostConfiguration, PolkadotPrimitivesV2AbridgedHrmpChannel, PolkadotPrimitivesV2PersistedValidationData, PolkadotPrimitivesV2UpgradeRestriction, RmrkTraitsBaseBaseInfo, RmrkTraitsCollectionCollectionInfo, RmrkTraitsNftAccountIdOrCollectionNftTuple, RmrkTraitsNftNftChild, RmrkTraitsNftNftInfo, RmrkTraitsNftRoyaltyInfo, RmrkTraitsPartEquippableList, RmrkTraitsPartFixedPart, RmrkTraitsPartPartType, RmrkTraitsPartSlotPart, RmrkTraitsPropertyPropertyInfo, RmrkTraitsResourceBasicResource, RmrkTraitsResourceComposableResource, RmrkTraitsResourceResourceInfo, RmrkTraitsResourceResourceTypes, RmrkTraitsResourceSlotResource, RmrkTraitsTheme, RmrkTraitsThemeThemeProperty, SpCoreEcdsaSignature, SpCoreEd25519Signature, SpCoreSr25519Signature, SpCoreVoid, SpRuntimeArithmeticError, SpRuntimeDigest, SpRuntimeDigestDigestItem, SpRuntimeDispatchError, SpRuntimeModuleError, SpRuntimeMultiSignature, SpRuntimeTokenError, SpRuntimeTransactionalError, SpTrieStorageProof, SpVersionRuntimeVersion, UpDataStructsAccessMode, UpDataStructsCollection, UpDataStructsCollectionLimits, UpDataStructsCollectionMode, UpDataStructsCollectionPermissions, UpDataStructsCollectionStats, UpDataStructsCreateCollectionData, UpDataStructsCreateFungibleData, UpDataStructsCreateItemData, UpDataStructsCreateItemExData, UpDataStructsCreateNftData, UpDataStructsCreateNftExData, UpDataStructsCreateReFungibleData, UpDataStructsCreateRefungibleExMultipleOwners, UpDataStructsCreateRefungibleExSingleOwner, UpDataStructsNestingPermissions, UpDataStructsOwnerRestrictedSet, UpDataStructsProperties, UpDataStructsPropertiesMapBoundedVec, UpDataStructsPropertiesMapPropertyPermission, UpDataStructsProperty, UpDataStructsPropertyKeyPermission, UpDataStructsPropertyPermission, UpDataStructsPropertyScope, UpDataStructsRpcCollection, UpDataStructsSponsoringRateLimit, UpDataStructsSponsorshipStateAccountId32, UpDataStructsSponsorshipStateBasicCrossAccountIdRepr, UpDataStructsTokenChild, UpDataStructsTokenData, XcmDoubleEncoded, XcmV0Junction, XcmV0JunctionBodyId, XcmV0JunctionBodyPart, XcmV0JunctionNetworkId, XcmV0MultiAsset, XcmV0MultiLocation, XcmV0Order, XcmV0OriginKind, XcmV0Response, XcmV0Xcm, XcmV1Junction, XcmV1MultiAsset, XcmV1MultiLocation, XcmV1MultiassetAssetId, XcmV1MultiassetAssetInstance, XcmV1MultiassetFungibility, XcmV1MultiassetMultiAssetFilter, XcmV1MultiassetMultiAssets, XcmV1MultiassetWildFungibility, XcmV1MultiassetWildMultiAsset, XcmV1MultilocationJunctions, XcmV1Order, XcmV1Response, XcmV1Xcm, XcmV2Instruction, XcmV2Response, XcmV2TraitsError, XcmV2TraitsOutcome, XcmV2WeightLimit, XcmV2Xcm, XcmVersionedMultiAsset, XcmVersionedMultiAssets, XcmVersionedMultiLocation, XcmVersionedXcm } from './default'; import type { Data, StorageKey } from '@polkadot/types'; import type { BitVec, Bool, Bytes, F32, F64, I128, I16, I256, I32, I64, I8, Json, Null, OptionBool, Raw, Text, Type, U128, U16, U256, U32, U64, U8, USize, bool, f32, f64, i128, i16, i256, i32, i64, i8, u128, u16, u256, u32, u64, u8, usize } from '@polkadot/types-codec'; import type { AssetApproval, AssetApprovalKey, AssetBalance, AssetDestroyWitness, AssetDetails, AssetMetadata, TAssetBalance, TAssetDepositBalance } from '@polkadot/types/interfaces/assets'; @@ -25,7 +25,7 @@ import type { CollectiveOrigin, MemberCount, ProposalIndex, Votes, VotesTo230 } from '@polkadot/types/interfaces/collective'; import type { AuthorityId, RawVRFOutput } from '@polkadot/types/interfaces/consensus'; import type { AliveContractInfo, CodeHash, CodeSource, CodeUploadRequest, CodeUploadResult, CodeUploadResultValue, ContractCallFlags, ContractCallRequest, ContractExecResult, ContractExecResultOk, ContractExecResultResult, ContractExecResultSuccessTo255, ContractExecResultSuccessTo260, ContractExecResultTo255, ContractExecResultTo260, ContractExecResultTo267, ContractInfo, ContractInstantiateResult, ContractInstantiateResultTo267, ContractInstantiateResultTo299, ContractReturnFlags, ContractStorageKey, DeletedContract, ExecReturnValue, Gas, HostFnWeights, HostFnWeightsTo264, InstantiateRequest, InstantiateRequestV1, InstantiateRequestV2, InstantiateReturnValue, InstantiateReturnValueOk, InstantiateReturnValueTo267, InstructionWeights, Limits, LimitsTo264, PrefabWasmModule, RentProjection, Schedule, ScheduleTo212, ScheduleTo258, ScheduleTo264, SeedOf, StorageDeposit, TombstoneContractInfo, TrieId } from '@polkadot/types/interfaces/contracts'; -import type { ContractConstructorSpecLatest, ContractConstructorSpecV0, ContractConstructorSpecV1, ContractConstructorSpecV2, ContractConstructorSpecV3, ContractContractSpecV0, ContractContractSpecV1, ContractContractSpecV2, ContractContractSpecV3, ContractCryptoHasher, ContractDiscriminant, ContractDisplayName, ContractEventParamSpecLatest, ContractEventParamSpecV0, ContractEventParamSpecV2, ContractEventSpecLatest, ContractEventSpecV0, ContractEventSpecV1, ContractEventSpecV2, ContractLayoutArray, ContractLayoutCell, ContractLayoutEnum, ContractLayoutHash, ContractLayoutHashingStrategy, ContractLayoutKey, ContractLayoutStruct, ContractLayoutStructField, ContractMessageParamSpecLatest, ContractMessageParamSpecV0, ContractMessageParamSpecV2, ContractMessageSpecLatest, ContractMessageSpecV0, ContractMessageSpecV1, ContractMessageSpecV2, ContractMetadata, ContractMetadataLatest, ContractMetadataV0, ContractMetadataV1, ContractMetadataV2, ContractMetadataV3, ContractProject, ContractProjectContract, ContractProjectInfo, ContractProjectSource, ContractProjectV0, ContractSelector, ContractStorageLayout, ContractTypeSpec } from '@polkadot/types/interfaces/contractsAbi'; +import type { ContractConstructorSpecLatest, ContractConstructorSpecV0, ContractConstructorSpecV1, ContractConstructorSpecV2, ContractConstructorSpecV3, ContractContractSpecV0, ContractContractSpecV1, ContractContractSpecV2, ContractContractSpecV3, ContractContractSpecV4, ContractCryptoHasher, ContractDiscriminant, ContractDisplayName, ContractEventParamSpecLatest, ContractEventParamSpecV0, ContractEventParamSpecV2, ContractEventSpecLatest, ContractEventSpecV0, ContractEventSpecV1, ContractEventSpecV2, ContractLayoutArray, ContractLayoutCell, ContractLayoutEnum, ContractLayoutHash, ContractLayoutHashingStrategy, ContractLayoutKey, ContractLayoutStruct, ContractLayoutStructField, ContractMessageParamSpecLatest, ContractMessageParamSpecV0, ContractMessageParamSpecV2, ContractMessageSpecLatest, ContractMessageSpecV0, ContractMessageSpecV1, ContractMessageSpecV2, ContractMetadata, ContractMetadataLatest, ContractMetadataV0, ContractMetadataV1, ContractMetadataV2, ContractMetadataV3, ContractMetadataV4, ContractProject, ContractProjectContract, ContractProjectInfo, ContractProjectSource, ContractProjectV0, ContractSelector, ContractStorageLayout, ContractTypeSpec } from '@polkadot/types/interfaces/contractsAbi'; import type { FundIndex, FundInfo, LastContribution, TrieIndex } from '@polkadot/types/interfaces/crowdloan'; import type { CollationInfo, CollationInfoV1, ConfigData, MessageId, OverweightIndex, PageCounter, PageIndexData } from '@polkadot/types/interfaces/cumulus'; import type { AccountVote, AccountVoteSplit, AccountVoteStandard, Conviction, Delegations, PreimageStatus, PreimageStatusAvailable, PriorLock, PropIndex, Proposal, ProxyState, ReferendumIndex, ReferendumInfo, ReferendumInfoFinished, ReferendumInfoTo239, ReferendumStatus, Tally, Voting, VotingDelegating, VotingDirect, VotingDirectVote } from '@polkadot/types/interfaces/democracy'; @@ -53,7 +53,7 @@ import type { AccountStatus, AccountValidity } from '@polkadot/types/interfaces/purchase'; import type { ActiveRecovery, RecoveryConfig } from '@polkadot/types/interfaces/recovery'; import type { RpcMethods } from '@polkadot/types/interfaces/rpc'; -import type { AccountId, AccountId20, AccountId32, AccountIdOf, AccountIndex, Address, AssetId, Balance, BalanceOf, Block, BlockNumber, BlockNumberFor, BlockNumberOf, Call, CallHash, CallHashOf, ChangesTrieConfiguration, ChangesTrieSignal, CodecHash, Consensus, ConsensusEngineId, CrateVersion, Digest, DigestItem, EncodedJustification, ExtrinsicsWeight, Fixed128, Fixed64, FixedI128, FixedI64, FixedU128, FixedU64, H1024, H128, H160, H2048, H256, H32, H512, H64, Hash, Header, HeaderPartial, I32F32, Index, IndicesLookupSource, Justification, Justifications, KeyTypeId, KeyValue, LockIdentifier, LookupSource, LookupTarget, ModuleId, Moment, MultiAddress, MultiSigner, OpaqueCall, Origin, OriginCaller, PalletId, PalletVersion, PalletsOrigin, Pays, PerU16, Perbill, Percent, Permill, Perquintill, Phantom, PhantomData, PreRuntime, Releases, RuntimeDbWeight, Seal, SealV0, SignedBlock, SignedBlockWithJustification, SignedBlockWithJustifications, Slot, SlotDuration, StorageData, StorageInfo, StorageProof, TransactionInfo, TransactionLongevity, TransactionPriority, TransactionStorageProof, TransactionTag, U32F32, ValidatorId, ValidatorIdOf, Weight, WeightMultiplier } from '@polkadot/types/interfaces/runtime'; +import type { AccountId, AccountId20, AccountId32, AccountId33, AccountIdOf, AccountIndex, Address, AssetId, Balance, BalanceOf, Block, BlockNumber, BlockNumberFor, BlockNumberOf, Call, CallHash, CallHashOf, ChangesTrieConfiguration, ChangesTrieSignal, CodecHash, Consensus, ConsensusEngineId, CrateVersion, Digest, DigestItem, EncodedJustification, ExtrinsicsWeight, Fixed128, Fixed64, FixedI128, FixedI64, FixedU128, FixedU64, H1024, H128, H160, H2048, H256, H32, H512, H64, Hash, Header, HeaderPartial, I32F32, Index, IndicesLookupSource, Justification, Justifications, KeyTypeId, KeyValue, LockIdentifier, LookupSource, LookupTarget, ModuleId, Moment, MultiAddress, MultiSigner, OpaqueCall, Origin, OriginCaller, PalletId, PalletVersion, PalletsOrigin, Pays, PerU16, Perbill, Percent, Permill, Perquintill, Phantom, PhantomData, PreRuntime, Releases, RuntimeDbWeight, Seal, SealV0, SignedBlock, SignedBlockWithJustification, SignedBlockWithJustifications, Slot, SlotDuration, StorageData, StorageInfo, StorageProof, TransactionInfo, TransactionLongevity, TransactionPriority, TransactionStorageProof, TransactionTag, U32F32, ValidatorId, ValidatorIdOf, Weight, WeightMultiplier, WeightV1, WeightV2 } from '@polkadot/types/interfaces/runtime'; import type { Si0Field, Si0LookupTypeId, Si0Path, Si0Type, Si0TypeDef, Si0TypeDefArray, Si0TypeDefBitSequence, Si0TypeDefCompact, Si0TypeDefComposite, Si0TypeDefPhantom, Si0TypeDefPrimitive, Si0TypeDefSequence, Si0TypeDefTuple, Si0TypeDefVariant, Si0TypeParameter, Si0Variant, Si1Field, Si1LookupTypeId, Si1Path, Si1Type, Si1TypeDef, Si1TypeDefArray, Si1TypeDefBitSequence, Si1TypeDefCompact, Si1TypeDefComposite, Si1TypeDefPrimitive, Si1TypeDefSequence, Si1TypeDefTuple, Si1TypeDefVariant, Si1TypeParameter, Si1Variant, SiField, SiLookupTypeId, SiPath, SiType, SiTypeDef, SiTypeDefArray, SiTypeDefBitSequence, SiTypeDefCompact, SiTypeDefComposite, SiTypeDefPrimitive, SiTypeDefSequence, SiTypeDefTuple, SiTypeDefVariant, SiTypeParameter, SiVariant } from '@polkadot/types/interfaces/scaleInfo'; import type { Period, Priority, SchedulePeriod, SchedulePriority, Scheduled, ScheduledTo254, TaskAddress } from '@polkadot/types/interfaces/scheduler'; import type { BeefyKey, FullIdentification, IdentificationTuple, Keys, MembershipProof, SessionIndex, SessionKeys1, SessionKeys10, SessionKeys10B, SessionKeys2, SessionKeys3, SessionKeys4, SessionKeys5, SessionKeys6, SessionKeys6B, SessionKeys7, SessionKeys7B, SessionKeys8, SessionKeys8B, SessionKeys9, SessionKeys9B, ValidatorCount } from '@polkadot/types/interfaces/session'; @@ -79,6 +79,7 @@ AccountId: AccountId; AccountId20: AccountId20; AccountId32: AccountId32; + AccountId33: AccountId33; AccountIdOf: AccountIdOf; AccountIndex: AccountIndex; AccountInfo: AccountInfo; @@ -253,6 +254,7 @@ ContractContractSpecV1: ContractContractSpecV1; ContractContractSpecV2: ContractContractSpecV2; ContractContractSpecV3: ContractContractSpecV3; + ContractContractSpecV4: ContractContractSpecV4; ContractCryptoHasher: ContractCryptoHasher; ContractDiscriminant: ContractDiscriminant; ContractDisplayName: ContractDisplayName; @@ -296,6 +298,7 @@ ContractMetadataV1: ContractMetadataV1; ContractMetadataV2: ContractMetadataV2; ContractMetadataV3: ContractMetadataV3; + ContractMetadataV4: ContractMetadataV4; ContractProject: ContractProject; ContractProjectContract: ContractProjectContract; ContractProjectInfo: ContractProjectInfo; @@ -524,7 +527,7 @@ FrameSupportWeightsDispatchInfo: FrameSupportWeightsDispatchInfo; FrameSupportWeightsPays: FrameSupportWeightsPays; FrameSupportWeightsPerDispatchClassU32: FrameSupportWeightsPerDispatchClassU32; - FrameSupportWeightsPerDispatchClassU64: FrameSupportWeightsPerDispatchClassU64; + FrameSupportWeightsPerDispatchClassWeight: FrameSupportWeightsPerDispatchClassWeight; FrameSupportWeightsPerDispatchClassWeightsPerClass: FrameSupportWeightsPerDispatchClassWeightsPerClass; FrameSupportWeightsRuntimeDbWeight: FrameSupportWeightsRuntimeDbWeight; FrameSystemAccountInfo: FrameSystemAccountInfo; @@ -1375,6 +1378,8 @@ WeightMultiplier: WeightMultiplier; WeightPerClass: WeightPerClass; WeightToFeeCoefficient: WeightToFeeCoefficient; + WeightV1: WeightV1; + WeightV2: WeightV2; WildFungibility: WildFungibility; WildFungibilityV0: WildFungibilityV0; WildFungibilityV1: WildFungibilityV1; --- a/tests/src/interfaces/default/types.ts +++ b/tests/src/interfaces/default/types.ts @@ -3,7 +3,7 @@ import type { BTreeMap, BTreeSet, Bytes, Compact, Enum, Null, Option, Result, Struct, Text, U256, U8aFixed, Vec, bool, u128, u16, u32, u64, u8 } from '@polkadot/types-codec'; import type { ITuple } from '@polkadot/types-codec/types'; -import type { AccountId32, Call, H160, H256, MultiAddress, Perbill, Permill } from '@polkadot/types/interfaces/runtime'; +import type { AccountId32, Call, H160, H256, MultiAddress, Perbill, Permill, Weight } from '@polkadot/types/interfaces/runtime'; import type { Event } from '@polkadot/types/interfaces/system'; /** @name CumulusPalletDmpQueueCall */ @@ -11,14 +11,14 @@ readonly isServiceOverweight: boolean; readonly asServiceOverweight: { readonly index: u64; - readonly weightLimit: u64; + readonly weightLimit: Weight; } & Struct; readonly type: 'ServiceOverweight'; } /** @name CumulusPalletDmpQueueConfigData */ export interface CumulusPalletDmpQueueConfigData extends Struct { - readonly maxIndividual: u64; + readonly maxIndividual: Weight; } /** @name CumulusPalletDmpQueueError */ @@ -46,19 +46,19 @@ readonly isWeightExhausted: boolean; readonly asWeightExhausted: { readonly messageId: U8aFixed; - readonly remainingWeight: u64; - readonly requiredWeight: u64; + readonly remainingWeight: Weight; + readonly requiredWeight: Weight; } & Struct; readonly isOverweightEnqueued: boolean; readonly asOverweightEnqueued: { readonly messageId: U8aFixed; readonly overweightIndex: u64; - readonly requiredWeight: u64; + readonly requiredWeight: Weight; } & Struct; readonly isOverweightServiced: boolean; readonly asOverweightServiced: { readonly overweightIndex: u64; - readonly weightUsed: u64; + readonly weightUsed: Weight; } & Struct; readonly type: 'InvalidFormat' | 'UnsupportedVersion' | 'ExecutedDownward' | 'WeightExhausted' | 'OverweightEnqueued' | 'OverweightServiced'; } @@ -122,7 +122,7 @@ } & Struct; readonly isDownwardMessagesProcessed: boolean; readonly asDownwardMessagesProcessed: { - readonly weightUsed: u64; + readonly weightUsed: Weight; readonly dmqHead: H256; } & Struct; readonly type: 'ValidationFunctionStored' | 'ValidationFunctionApplied' | 'ValidationFunctionDiscarded' | 'UpgradeAuthorized' | 'DownwardMessagesReceived' | 'DownwardMessagesProcessed'; @@ -166,7 +166,7 @@ readonly isServiceOverweight: boolean; readonly asServiceOverweight: { readonly index: u64; - readonly weightLimit: u64; + readonly weightLimit: Weight; } & Struct; readonly isSuspendXcmExecution: boolean; readonly isResumeXcmExecution: boolean; @@ -184,15 +184,15 @@ } & Struct; readonly isUpdateThresholdWeight: boolean; readonly asUpdateThresholdWeight: { - readonly new_: u64; + readonly new_: Weight; } & Struct; readonly isUpdateWeightRestrictDecay: boolean; readonly asUpdateWeightRestrictDecay: { - readonly new_: u64; + readonly new_: Weight; } & Struct; readonly isUpdateXcmpMaxIndividualWeight: boolean; readonly asUpdateXcmpMaxIndividualWeight: { - readonly new_: u64; + readonly new_: Weight; } & Struct; readonly type: 'ServiceOverweight' | 'SuspendXcmExecution' | 'ResumeXcmExecution' | 'UpdateSuspendThreshold' | 'UpdateDropThreshold' | 'UpdateResumeThreshold' | 'UpdateThresholdWeight' | 'UpdateWeightRestrictDecay' | 'UpdateXcmpMaxIndividualWeight'; } @@ -212,13 +212,13 @@ readonly isSuccess: boolean; readonly asSuccess: { readonly messageHash: Option; - readonly weight: u64; + readonly weight: Weight; } & Struct; readonly isFail: boolean; readonly asFail: { readonly messageHash: Option; readonly error: XcmV2TraitsError; - readonly weight: u64; + readonly weight: Weight; } & Struct; readonly isBadVersion: boolean; readonly asBadVersion: { @@ -241,12 +241,12 @@ readonly sender: u32; readonly sentAt: u32; readonly index: u64; - readonly required: u64; + readonly required: Weight; } & Struct; readonly isOverweightServiced: boolean; readonly asOverweightServiced: { readonly index: u64; - readonly used: u64; + readonly used: Weight; } & Struct; readonly type: 'Success' | 'Fail' | 'BadVersion' | 'BadFormat' | 'UpwardMessageSent' | 'XcmpMessageSent' | 'OverweightEnqueued' | 'OverweightServiced'; } @@ -286,9 +286,9 @@ readonly suspendThreshold: u32; readonly dropThreshold: u32; readonly resumeThreshold: u32; - readonly thresholdWeight: u64; - readonly weightRestrictDecay: u64; - readonly xcmpMaxIndividualWeight: u64; + readonly thresholdWeight: Weight; + readonly weightRestrictDecay: Weight; + readonly xcmpMaxIndividualWeight: Weight; } /** @name CumulusPrimitivesParachainInherentParachainInherentData */ @@ -546,7 +546,7 @@ /** @name FrameSupportWeightsDispatchInfo */ export interface FrameSupportWeightsDispatchInfo extends Struct { - readonly weight: u64; + readonly weight: Weight; readonly class: FrameSupportWeightsDispatchClass; readonly paysFee: FrameSupportWeightsPays; } @@ -565,11 +565,11 @@ readonly mandatory: u32; } -/** @name FrameSupportWeightsPerDispatchClassU64 */ -export interface FrameSupportWeightsPerDispatchClassU64 extends Struct { - readonly normal: u64; - readonly operational: u64; - readonly mandatory: u64; +/** @name FrameSupportWeightsPerDispatchClassWeight */ +export interface FrameSupportWeightsPerDispatchClassWeight extends Struct { + readonly normal: Weight; + readonly operational: Weight; + readonly mandatory: Weight; } /** @name FrameSupportWeightsPerDispatchClassWeightsPerClass */ @@ -710,17 +710,17 @@ /** @name FrameSystemLimitsBlockWeights */ export interface FrameSystemLimitsBlockWeights extends Struct { - readonly baseBlock: u64; - readonly maxBlock: u64; + readonly baseBlock: Weight; + readonly maxBlock: Weight; readonly perClass: FrameSupportWeightsPerDispatchClassWeightsPerClass; } /** @name FrameSystemLimitsWeightsPerClass */ export interface FrameSystemLimitsWeightsPerClass extends Struct { - readonly baseExtrinsic: u64; - readonly maxExtrinsic: Option; - readonly maxTotal: Option; - readonly reserved: Option; + readonly baseExtrinsic: Weight; + readonly maxExtrinsic: Option; + readonly maxTotal: Option; + readonly reserved: Option; } /** @name FrameSystemPhase */ @@ -1929,7 +1929,7 @@ readonly isSudoUncheckedWeight: boolean; readonly asSudoUncheckedWeight: { readonly call: Call; - readonly weight: u64; + readonly weight: Weight; } & Struct; readonly isSetKey: boolean; readonly asSetKey: { @@ -2372,7 +2372,7 @@ readonly isExecute: boolean; readonly asExecute: { readonly message: XcmVersionedXcm; - readonly maxWeight: u64; + readonly maxWeight: Weight; } & Struct; readonly isForceXcmVersion: boolean; readonly asForceXcmVersion: { @@ -2441,7 +2441,7 @@ readonly isNotified: boolean; readonly asNotified: ITuple<[u64, u8, u8]>; readonly isNotifyOverweight: boolean; - readonly asNotifyOverweight: ITuple<[u64, u8, u8, u64, u64]>; + readonly asNotifyOverweight: ITuple<[u64, u8, u8, Weight, Weight]>; readonly isNotifyDispatchError: boolean; readonly asNotifyDispatchError: ITuple<[u64, u8, u8]>; readonly isNotifyDecodeFailed: boolean; --- a/tests/src/interfaces/lookup.ts +++ b/tests/src/interfaces/lookup.ts @@ -24,21 +24,21 @@ feeFrozen: 'u128' }, /** - * Lookup7: frame_support::weights::PerDispatchClass + * Lookup7: frame_support::weights::PerDispatchClass **/ - FrameSupportWeightsPerDispatchClassU64: { - normal: 'u64', - operational: 'u64', - mandatory: 'u64' + FrameSupportWeightsPerDispatchClassWeight: { + normal: 'Weight', + operational: 'Weight', + mandatory: 'Weight' }, /** - * Lookup11: sp_runtime::generic::digest::Digest + * Lookup12: sp_runtime::generic::digest::Digest **/ SpRuntimeDigest: { logs: 'Vec' }, /** - * Lookup13: sp_runtime::generic::digest::DigestItem + * Lookup14: sp_runtime::generic::digest::DigestItem **/ SpRuntimeDigestDigestItem: { _enum: { @@ -54,7 +54,7 @@ } }, /** - * Lookup16: frame_system::EventRecord + * Lookup17: frame_system::EventRecord **/ FrameSystemEventRecord: { phase: 'FrameSystemPhase', @@ -62,7 +62,7 @@ topics: 'Vec' }, /** - * Lookup18: frame_system::pallet::Event + * Lookup19: frame_system::pallet::Event **/ FrameSystemEvent: { _enum: { @@ -90,27 +90,27 @@ } }, /** - * Lookup19: frame_support::weights::DispatchInfo + * Lookup20: frame_support::weights::DispatchInfo **/ FrameSupportWeightsDispatchInfo: { - weight: 'u64', + weight: 'Weight', class: 'FrameSupportWeightsDispatchClass', paysFee: 'FrameSupportWeightsPays' }, /** - * Lookup20: frame_support::weights::DispatchClass + * Lookup21: frame_support::weights::DispatchClass **/ FrameSupportWeightsDispatchClass: { _enum: ['Normal', 'Operational', 'Mandatory'] }, /** - * Lookup21: frame_support::weights::Pays + * Lookup22: frame_support::weights::Pays **/ FrameSupportWeightsPays: { _enum: ['Yes', 'No'] }, /** - * Lookup22: sp_runtime::DispatchError + * Lookup23: sp_runtime::DispatchError **/ SpRuntimeDispatchError: { _enum: { @@ -127,32 +127,32 @@ } }, /** - * Lookup23: sp_runtime::ModuleError + * Lookup24: sp_runtime::ModuleError **/ SpRuntimeModuleError: { index: 'u8', error: '[u8;4]' }, /** - * Lookup24: sp_runtime::TokenError + * Lookup25: sp_runtime::TokenError **/ SpRuntimeTokenError: { _enum: ['NoFunds', 'WouldDie', 'BelowMinimum', 'CannotCreate', 'UnknownAsset', 'Frozen', 'Unsupported'] }, /** - * Lookup25: sp_runtime::ArithmeticError + * Lookup26: sp_runtime::ArithmeticError **/ SpRuntimeArithmeticError: { _enum: ['Underflow', 'Overflow', 'DivisionByZero'] }, /** - * Lookup26: sp_runtime::TransactionalError + * Lookup27: sp_runtime::TransactionalError **/ SpRuntimeTransactionalError: { _enum: ['LimitReached', 'NoLayer'] }, /** - * Lookup27: cumulus_pallet_parachain_system::pallet::Event + * Lookup28: cumulus_pallet_parachain_system::pallet::Event **/ CumulusPalletParachainSystemEvent: { _enum: { @@ -168,13 +168,13 @@ count: 'u32', }, DownwardMessagesProcessed: { - weightUsed: 'u64', + weightUsed: 'Weight', dmqHead: 'H256' } } }, /** - * Lookup28: pallet_balances::pallet::Event + * Lookup29: pallet_balances::pallet::Event **/ PalletBalancesEvent: { _enum: { @@ -225,13 +225,13 @@ } }, /** - * Lookup29: frame_support::traits::tokens::misc::BalanceStatus + * Lookup30: frame_support::traits::tokens::misc::BalanceStatus **/ FrameSupportTokensMiscBalanceStatus: { _enum: ['Free', 'Reserved'] }, /** - * Lookup30: pallet_transaction_payment::pallet::Event + * Lookup31: pallet_transaction_payment::pallet::Event **/ PalletTransactionPaymentEvent: { _enum: { @@ -243,7 +243,7 @@ } }, /** - * Lookup31: pallet_treasury::pallet::Event + * Lookup32: pallet_treasury::pallet::Event **/ PalletTreasuryEvent: { _enum: { @@ -279,7 +279,7 @@ } }, /** - * Lookup32: pallet_sudo::pallet::Event + * Lookup33: pallet_sudo::pallet::Event **/ PalletSudoEvent: { _enum: { @@ -295,7 +295,7 @@ } }, /** - * Lookup36: orml_vesting::module::Event + * Lookup37: orml_vesting::module::Event **/ OrmlVestingModuleEvent: { _enum: { @@ -314,7 +314,7 @@ } }, /** - * Lookup37: orml_vesting::VestingSchedule + * Lookup38: orml_vesting::VestingSchedule **/ OrmlVestingVestingSchedule: { start: 'u32', @@ -323,7 +323,7 @@ perPeriod: 'Compact' }, /** - * Lookup39: orml_xtokens::module::Event + * Lookup40: orml_xtokens::module::Event **/ OrmlXtokensModuleEvent: { _enum: { @@ -336,18 +336,18 @@ } }, /** - * Lookup40: xcm::v1::multiasset::MultiAssets + * Lookup41: xcm::v1::multiasset::MultiAssets **/ XcmV1MultiassetMultiAssets: 'Vec', /** - * Lookup42: xcm::v1::multiasset::MultiAsset + * Lookup43: xcm::v1::multiasset::MultiAsset **/ XcmV1MultiAsset: { id: 'XcmV1MultiassetAssetId', fun: 'XcmV1MultiassetFungibility' }, /** - * Lookup43: xcm::v1::multiasset::AssetId + * Lookup44: xcm::v1::multiasset::AssetId **/ XcmV1MultiassetAssetId: { _enum: { @@ -356,14 +356,14 @@ } }, /** - * Lookup44: xcm::v1::multilocation::MultiLocation + * Lookup45: xcm::v1::multilocation::MultiLocation **/ XcmV1MultiLocation: { parents: 'u8', interior: 'XcmV1MultilocationJunctions' }, /** - * Lookup45: xcm::v1::multilocation::Junctions + * Lookup46: xcm::v1::multilocation::Junctions **/ XcmV1MultilocationJunctions: { _enum: { @@ -379,7 +379,7 @@ } }, /** - * Lookup46: xcm::v1::junction::Junction + * Lookup47: xcm::v1::junction::Junction **/ XcmV1Junction: { _enum: { @@ -407,7 +407,7 @@ } }, /** - * Lookup48: xcm::v0::junction::NetworkId + * Lookup49: xcm::v0::junction::NetworkId **/ XcmV0JunctionNetworkId: { _enum: { @@ -418,7 +418,7 @@ } }, /** - * Lookup52: xcm::v0::junction::BodyId + * Lookup53: xcm::v0::junction::BodyId **/ XcmV0JunctionBodyId: { _enum: { @@ -432,7 +432,7 @@ } }, /** - * Lookup53: xcm::v0::junction::BodyPart + * Lookup54: xcm::v0::junction::BodyPart **/ XcmV0JunctionBodyPart: { _enum: { @@ -455,7 +455,7 @@ } }, /** - * Lookup54: xcm::v1::multiasset::Fungibility + * Lookup55: xcm::v1::multiasset::Fungibility **/ XcmV1MultiassetFungibility: { _enum: { @@ -464,7 +464,7 @@ } }, /** - * Lookup55: xcm::v1::multiasset::AssetInstance + * Lookup56: xcm::v1::multiasset::AssetInstance **/ XcmV1MultiassetAssetInstance: { _enum: { @@ -478,7 +478,7 @@ } }, /** - * Lookup58: orml_tokens::module::Event + * Lookup59: orml_tokens::module::Event **/ OrmlTokensModuleEvent: { _enum: { @@ -555,7 +555,7 @@ } }, /** - * Lookup59: pallet_foreign_assets::AssetIds + * Lookup60: pallet_foreign_assets::AssetIds **/ PalletForeignAssetsAssetIds: { _enum: { @@ -564,24 +564,24 @@ } }, /** - * Lookup60: pallet_foreign_assets::NativeCurrency + * Lookup61: pallet_foreign_assets::NativeCurrency **/ PalletForeignAssetsNativeCurrency: { _enum: ['Here', 'Parent'] }, /** - * Lookup61: cumulus_pallet_xcmp_queue::pallet::Event + * Lookup62: cumulus_pallet_xcmp_queue::pallet::Event **/ CumulusPalletXcmpQueueEvent: { _enum: { Success: { messageHash: 'Option', - weight: 'u64', + weight: 'Weight', }, Fail: { messageHash: 'Option', error: 'XcmV2TraitsError', - weight: 'u64', + weight: 'Weight', }, BadVersion: { messageHash: 'Option', @@ -599,16 +599,16 @@ sender: 'u32', sentAt: 'u32', index: 'u64', - required: 'u64', + required: 'Weight', }, OverweightServiced: { index: 'u64', - used: 'u64' + used: 'Weight' } } }, /** - * Lookup63: xcm::v2::traits::Error + * Lookup64: xcm::v2::traits::Error **/ XcmV2TraitsError: { _enum: { @@ -641,7 +641,7 @@ } }, /** - * Lookup65: pallet_xcm::pallet::Event + * Lookup66: pallet_xcm::pallet::Event **/ PalletXcmEvent: { _enum: { @@ -650,7 +650,7 @@ UnexpectedResponse: '(XcmV1MultiLocation,u64)', ResponseReady: '(u64,XcmV2Response)', Notified: '(u64,u8,u8)', - NotifyOverweight: '(u64,u8,u8,u64,u64)', + NotifyOverweight: '(u64,u8,u8,Weight,Weight)', NotifyDispatchError: '(u64,u8,u8)', NotifyDecodeFailed: '(u64,u8,u8)', InvalidResponder: '(XcmV1MultiLocation,u64,Option)', @@ -664,7 +664,7 @@ } }, /** - * Lookup66: xcm::v2::traits::Outcome + * Lookup67: xcm::v2::traits::Outcome **/ XcmV2TraitsOutcome: { _enum: { @@ -674,11 +674,11 @@ } }, /** - * Lookup67: xcm::v2::Xcm + * Lookup68: xcm::v2::Xcm **/ XcmV2Xcm: 'Vec', /** - * Lookup69: xcm::v2::Instruction + * Lookup70: xcm::v2::Instruction **/ XcmV2Instruction: { _enum: { @@ -776,7 +776,7 @@ } }, /** - * Lookup70: xcm::v2::Response + * Lookup71: xcm::v2::Response **/ XcmV2Response: { _enum: { @@ -787,19 +787,19 @@ } }, /** - * Lookup73: xcm::v0::OriginKind + * Lookup74: xcm::v0::OriginKind **/ XcmV0OriginKind: { _enum: ['Native', 'SovereignAccount', 'Superuser', 'Xcm'] }, /** - * Lookup74: xcm::double_encoded::DoubleEncoded + * Lookup75: xcm::double_encoded::DoubleEncoded **/ XcmDoubleEncoded: { encoded: 'Bytes' }, /** - * Lookup75: xcm::v1::multiasset::MultiAssetFilter + * Lookup76: xcm::v1::multiasset::MultiAssetFilter **/ XcmV1MultiassetMultiAssetFilter: { _enum: { @@ -808,7 +808,7 @@ } }, /** - * Lookup76: xcm::v1::multiasset::WildMultiAsset + * Lookup77: xcm::v1::multiasset::WildMultiAsset **/ XcmV1MultiassetWildMultiAsset: { _enum: { @@ -820,13 +820,13 @@ } }, /** - * Lookup77: xcm::v1::multiasset::WildFungibility + * Lookup78: xcm::v1::multiasset::WildFungibility **/ XcmV1MultiassetWildFungibility: { _enum: ['Fungible', 'NonFungible'] }, /** - * Lookup78: xcm::v2::WeightLimit + * Lookup79: xcm::v2::WeightLimit **/ XcmV2WeightLimit: { _enum: { @@ -835,7 +835,7 @@ } }, /** - * Lookup80: xcm::VersionedMultiAssets + * Lookup81: xcm::VersionedMultiAssets **/ XcmVersionedMultiAssets: { _enum: { @@ -844,7 +844,7 @@ } }, /** - * Lookup82: xcm::v0::multi_asset::MultiAsset + * Lookup83: xcm::v0::multi_asset::MultiAsset **/ XcmV0MultiAsset: { _enum: { @@ -883,7 +883,7 @@ } }, /** - * Lookup83: xcm::v0::multi_location::MultiLocation + * Lookup84: xcm::v0::multi_location::MultiLocation **/ XcmV0MultiLocation: { _enum: { @@ -899,7 +899,7 @@ } }, /** - * Lookup84: xcm::v0::junction::Junction + * Lookup85: xcm::v0::junction::Junction **/ XcmV0Junction: { _enum: { @@ -928,7 +928,7 @@ } }, /** - * Lookup85: xcm::VersionedMultiLocation + * Lookup86: xcm::VersionedMultiLocation **/ XcmVersionedMultiLocation: { _enum: { @@ -937,7 +937,7 @@ } }, /** - * Lookup86: cumulus_pallet_xcm::pallet::Event + * Lookup87: cumulus_pallet_xcm::pallet::Event **/ CumulusPalletXcmEvent: { _enum: { @@ -947,7 +947,7 @@ } }, /** - * Lookup87: cumulus_pallet_dmp_queue::pallet::Event + * Lookup88: cumulus_pallet_dmp_queue::pallet::Event **/ CumulusPalletDmpQueueEvent: { _enum: { @@ -963,22 +963,22 @@ }, WeightExhausted: { messageId: '[u8;32]', - remainingWeight: 'u64', - requiredWeight: 'u64', + remainingWeight: 'Weight', + requiredWeight: 'Weight', }, OverweightEnqueued: { messageId: '[u8;32]', overweightIndex: 'u64', - requiredWeight: 'u64', + requiredWeight: 'Weight', }, OverweightServiced: { overweightIndex: 'u64', - weightUsed: 'u64' + weightUsed: 'Weight' } } }, /** - * Lookup88: pallet_unique::RawEvent> + * Lookup89: pallet_unique::RawEvent> **/ PalletUniqueRawEvent: { _enum: { @@ -995,7 +995,7 @@ } }, /** - * Lookup89: pallet_evm::account::BasicCrossAccountIdRepr + * Lookup90: pallet_evm::account::BasicCrossAccountIdRepr **/ PalletEvmAccountBasicCrossAccountIdRepr: { _enum: { @@ -1004,7 +1004,7 @@ } }, /** - * Lookup92: pallet_unique_scheduler::pallet::Event + * Lookup93: pallet_unique_scheduler::pallet::Event **/ PalletUniqueSchedulerEvent: { _enum: { @@ -1029,13 +1029,13 @@ } }, /** - * Lookup95: frame_support::traits::schedule::LookupError + * Lookup96: frame_support::traits::schedule::LookupError **/ FrameSupportScheduleLookupError: { _enum: ['Unknown', 'BadFormat'] }, /** - * Lookup96: pallet_common::pallet::Event + * Lookup97: pallet_common::pallet::Event **/ PalletCommonEvent: { _enum: { @@ -1053,7 +1053,7 @@ } }, /** - * Lookup99: pallet_structure::pallet::Event + * Lookup100: pallet_structure::pallet::Event **/ PalletStructureEvent: { _enum: { @@ -1061,7 +1061,7 @@ } }, /** - * Lookup100: pallet_rmrk_core::pallet::Event + * Lookup101: pallet_rmrk_core::pallet::Event **/ PalletRmrkCoreEvent: { _enum: { @@ -1138,7 +1138,7 @@ } }, /** - * Lookup101: rmrk_traits::nft::AccountIdOrCollectionNftTuple + * Lookup102: rmrk_traits::nft::AccountIdOrCollectionNftTuple **/ RmrkTraitsNftAccountIdOrCollectionNftTuple: { _enum: { @@ -1147,7 +1147,7 @@ } }, /** - * Lookup106: pallet_rmrk_equip::pallet::Event + * Lookup107: pallet_rmrk_equip::pallet::Event **/ PalletRmrkEquipEvent: { _enum: { @@ -1162,7 +1162,7 @@ } }, /** - * Lookup107: pallet_app_promotion::pallet::Event + * Lookup108: pallet_app_promotion::pallet::Event **/ PalletAppPromotionEvent: { _enum: { @@ -1173,7 +1173,7 @@ } }, /** - * Lookup108: pallet_foreign_assets::module::Event + * Lookup109: pallet_foreign_assets::module::Event **/ PalletForeignAssetsModuleEvent: { _enum: { @@ -1198,7 +1198,7 @@ } }, /** - * Lookup109: pallet_foreign_assets::module::AssetMetadata + * Lookup110: pallet_foreign_assets::module::AssetMetadata **/ PalletForeignAssetsModuleAssetMetadata: { name: 'Bytes', @@ -1207,7 +1207,7 @@ minimalBalance: 'u128' }, /** - * Lookup110: pallet_evm::pallet::Event + * Lookup111: pallet_evm::pallet::Event **/ PalletEvmEvent: { _enum: { @@ -1221,7 +1221,7 @@ } }, /** - * Lookup111: ethereum::log::Log + * Lookup112: ethereum::log::Log **/ EthereumLog: { address: 'H160', @@ -1229,7 +1229,7 @@ data: 'Bytes' }, /** - * Lookup115: pallet_ethereum::pallet::Event + * Lookup116: pallet_ethereum::pallet::Event **/ PalletEthereumEvent: { _enum: { @@ -1237,7 +1237,7 @@ } }, /** - * Lookup116: evm_core::error::ExitReason + * Lookup117: evm_core::error::ExitReason **/ EvmCoreErrorExitReason: { _enum: { @@ -1248,13 +1248,13 @@ } }, /** - * Lookup117: evm_core::error::ExitSucceed + * Lookup118: evm_core::error::ExitSucceed **/ EvmCoreErrorExitSucceed: { _enum: ['Stopped', 'Returned', 'Suicided'] }, /** - * Lookup118: evm_core::error::ExitError + * Lookup119: evm_core::error::ExitError **/ EvmCoreErrorExitError: { _enum: { @@ -1276,13 +1276,13 @@ } }, /** - * Lookup121: evm_core::error::ExitRevert + * Lookup122: evm_core::error::ExitRevert **/ EvmCoreErrorExitRevert: { _enum: ['Reverted'] }, /** - * Lookup122: evm_core::error::ExitFatal + * Lookup123: evm_core::error::ExitFatal **/ EvmCoreErrorExitFatal: { _enum: { @@ -1293,7 +1293,7 @@ } }, /** - * Lookup123: pallet_evm_contract_helpers::pallet::Event + * Lookup124: pallet_evm_contract_helpers::pallet::Event **/ PalletEvmContractHelpersEvent: { _enum: { @@ -1303,7 +1303,7 @@ } }, /** - * Lookup124: frame_system::Phase + * Lookup125: frame_system::Phase **/ FrameSystemPhase: { _enum: { @@ -1313,14 +1313,14 @@ } }, /** - * Lookup126: frame_system::LastRuntimeUpgradeInfo + * Lookup127: frame_system::LastRuntimeUpgradeInfo **/ FrameSystemLastRuntimeUpgradeInfo: { specVersion: 'Compact', specName: 'Text' }, /** - * Lookup127: frame_system::pallet::Call + * Lookup128: frame_system::pallet::Call **/ FrameSystemCall: { _enum: { @@ -1358,15 +1358,15 @@ } }, /** - * Lookup132: frame_system::limits::BlockWeights + * Lookup133: frame_system::limits::BlockWeights **/ FrameSystemLimitsBlockWeights: { - baseBlock: 'u64', - maxBlock: 'u64', + baseBlock: 'Weight', + maxBlock: 'Weight', perClass: 'FrameSupportWeightsPerDispatchClassWeightsPerClass' }, /** - * Lookup133: frame_support::weights::PerDispatchClass + * Lookup134: frame_support::weights::PerDispatchClass **/ FrameSupportWeightsPerDispatchClassWeightsPerClass: { normal: 'FrameSystemLimitsWeightsPerClass', @@ -1374,22 +1374,22 @@ mandatory: 'FrameSystemLimitsWeightsPerClass' }, /** - * Lookup134: frame_system::limits::WeightsPerClass + * Lookup135: frame_system::limits::WeightsPerClass **/ FrameSystemLimitsWeightsPerClass: { - baseExtrinsic: 'u64', - maxExtrinsic: 'Option', - maxTotal: 'Option', - reserved: 'Option' + baseExtrinsic: 'Weight', + maxExtrinsic: 'Option', + maxTotal: 'Option', + reserved: 'Option' }, /** - * Lookup136: frame_system::limits::BlockLength + * Lookup137: frame_system::limits::BlockLength **/ FrameSystemLimitsBlockLength: { max: 'FrameSupportWeightsPerDispatchClassU32' }, /** - * Lookup137: frame_support::weights::PerDispatchClass + * Lookup138: frame_support::weights::PerDispatchClass **/ FrameSupportWeightsPerDispatchClassU32: { normal: 'u32', @@ -1397,14 +1397,14 @@ mandatory: 'u32' }, /** - * Lookup138: frame_support::weights::RuntimeDbWeight + * Lookup139: frame_support::weights::RuntimeDbWeight **/ FrameSupportWeightsRuntimeDbWeight: { read: 'u64', write: 'u64' }, /** - * Lookup139: sp_version::RuntimeVersion + * Lookup140: sp_version::RuntimeVersion **/ SpVersionRuntimeVersion: { specName: 'Text', @@ -1417,13 +1417,13 @@ stateVersion: 'u8' }, /** - * Lookup144: frame_system::pallet::Error + * Lookup145: frame_system::pallet::Error **/ FrameSystemError: { _enum: ['InvalidSpecName', 'SpecVersionNeedsToIncrease', 'FailedToExtractRuntimeVersion', 'NonDefaultComposite', 'NonZeroRefCount', 'CallFiltered'] }, /** - * Lookup145: polkadot_primitives::v2::PersistedValidationData + * Lookup146: polkadot_primitives::v2::PersistedValidationData **/ PolkadotPrimitivesV2PersistedValidationData: { parentHead: 'Bytes', @@ -1432,19 +1432,19 @@ maxPovSize: 'u32' }, /** - * Lookup148: polkadot_primitives::v2::UpgradeRestriction + * Lookup149: polkadot_primitives::v2::UpgradeRestriction **/ PolkadotPrimitivesV2UpgradeRestriction: { _enum: ['Present'] }, /** - * Lookup149: sp_trie::storage_proof::StorageProof + * Lookup150: sp_trie::storage_proof::StorageProof **/ SpTrieStorageProof: { trieNodes: 'BTreeSet' }, /** - * Lookup151: cumulus_pallet_parachain_system::relay_state_snapshot::MessagingStateSnapshot + * Lookup152: cumulus_pallet_parachain_system::relay_state_snapshot::MessagingStateSnapshot **/ CumulusPalletParachainSystemRelayStateSnapshotMessagingStateSnapshot: { dmqMqcHead: 'H256', @@ -1453,7 +1453,7 @@ egressChannels: 'Vec<(u32,PolkadotPrimitivesV2AbridgedHrmpChannel)>' }, /** - * Lookup154: polkadot_primitives::v2::AbridgedHrmpChannel + * Lookup155: polkadot_primitives::v2::AbridgedHrmpChannel **/ PolkadotPrimitivesV2AbridgedHrmpChannel: { maxCapacity: 'u32', @@ -1464,7 +1464,7 @@ mqcHead: 'Option' }, /** - * Lookup155: polkadot_primitives::v2::AbridgedHostConfiguration + * Lookup156: polkadot_primitives::v2::AbridgedHostConfiguration **/ PolkadotPrimitivesV2AbridgedHostConfiguration: { maxCodeSize: 'u32', @@ -1478,14 +1478,14 @@ validationUpgradeDelay: 'u32' }, /** - * Lookup161: polkadot_core_primitives::OutboundHrmpMessage + * Lookup162: polkadot_core_primitives::OutboundHrmpMessage **/ PolkadotCorePrimitivesOutboundHrmpMessage: { recipient: 'u32', data: 'Bytes' }, /** - * Lookup162: cumulus_pallet_parachain_system::pallet::Call + * Lookup163: cumulus_pallet_parachain_system::pallet::Call **/ CumulusPalletParachainSystemCall: { _enum: { @@ -1504,7 +1504,7 @@ } }, /** - * Lookup163: cumulus_primitives_parachain_inherent::ParachainInherentData + * Lookup164: cumulus_primitives_parachain_inherent::ParachainInherentData **/ CumulusPrimitivesParachainInherentParachainInherentData: { validationData: 'PolkadotPrimitivesV2PersistedValidationData', @@ -1513,27 +1513,27 @@ horizontalMessages: 'BTreeMap>' }, /** - * Lookup165: polkadot_core_primitives::InboundDownwardMessage + * Lookup166: polkadot_core_primitives::InboundDownwardMessage **/ PolkadotCorePrimitivesInboundDownwardMessage: { sentAt: 'u32', msg: 'Bytes' }, /** - * Lookup168: polkadot_core_primitives::InboundHrmpMessage + * Lookup169: polkadot_core_primitives::InboundHrmpMessage **/ PolkadotCorePrimitivesInboundHrmpMessage: { sentAt: 'u32', data: 'Bytes' }, /** - * Lookup171: cumulus_pallet_parachain_system::pallet::Error + * Lookup172: cumulus_pallet_parachain_system::pallet::Error **/ CumulusPalletParachainSystemError: { _enum: ['OverlappingUpgrades', 'ProhibitedByPolkadot', 'TooBig', 'ValidationDataNotAvailable', 'HostConfigurationNotAvailable', 'NotScheduled', 'NothingAuthorized', 'Unauthorized'] }, /** - * Lookup173: pallet_balances::BalanceLock + * Lookup174: pallet_balances::BalanceLock **/ PalletBalancesBalanceLock: { id: '[u8;8]', @@ -1541,26 +1541,26 @@ reasons: 'PalletBalancesReasons' }, /** - * Lookup174: pallet_balances::Reasons + * Lookup175: pallet_balances::Reasons **/ PalletBalancesReasons: { _enum: ['Fee', 'Misc', 'All'] }, /** - * Lookup177: pallet_balances::ReserveData + * Lookup178: pallet_balances::ReserveData **/ PalletBalancesReserveData: { id: '[u8;16]', amount: 'u128' }, /** - * Lookup179: pallet_balances::Releases + * Lookup180: pallet_balances::Releases **/ PalletBalancesReleases: { _enum: ['V1_0_0', 'V2_0_0'] }, /** - * Lookup180: pallet_balances::pallet::Call + * Lookup181: pallet_balances::pallet::Call **/ PalletBalancesCall: { _enum: { @@ -1593,13 +1593,13 @@ } }, /** - * Lookup183: pallet_balances::pallet::Error + * Lookup184: pallet_balances::pallet::Error **/ PalletBalancesError: { _enum: ['VestingBalance', 'LiquidityRestrictions', 'InsufficientBalance', 'ExistentialDeposit', 'KeepAlive', 'ExistingVestingSchedule', 'DeadAccount', 'TooManyReserves'] }, /** - * Lookup185: pallet_timestamp::pallet::Call + * Lookup186: pallet_timestamp::pallet::Call **/ PalletTimestampCall: { _enum: { @@ -1609,13 +1609,13 @@ } }, /** - * Lookup187: pallet_transaction_payment::Releases + * Lookup188: pallet_transaction_payment::Releases **/ PalletTransactionPaymentReleases: { _enum: ['V1Ancient', 'V2'] }, /** - * Lookup188: pallet_treasury::Proposal + * Lookup189: pallet_treasury::Proposal **/ PalletTreasuryProposal: { proposer: 'AccountId32', @@ -1624,7 +1624,7 @@ bond: 'u128' }, /** - * Lookup191: pallet_treasury::pallet::Call + * Lookup192: pallet_treasury::pallet::Call **/ PalletTreasuryCall: { _enum: { @@ -1648,17 +1648,17 @@ } }, /** - * Lookup194: frame_support::PalletId + * Lookup195: frame_support::PalletId **/ FrameSupportPalletId: '[u8;8]', /** - * Lookup195: pallet_treasury::pallet::Error + * Lookup196: pallet_treasury::pallet::Error **/ PalletTreasuryError: { _enum: ['InsufficientProposersBalance', 'InvalidIndex', 'TooManyApprovals', 'InsufficientPermission', 'ProposalNotApproved'] }, /** - * Lookup196: pallet_sudo::pallet::Call + * Lookup197: pallet_sudo::pallet::Call **/ PalletSudoCall: { _enum: { @@ -1667,7 +1667,7 @@ }, sudo_unchecked_weight: { call: 'Call', - weight: 'u64', + weight: 'Weight', }, set_key: { _alias: { @@ -1682,7 +1682,7 @@ } }, /** - * Lookup198: orml_vesting::module::Call + * Lookup199: orml_vesting::module::Call **/ OrmlVestingModuleCall: { _enum: { @@ -1701,7 +1701,7 @@ } }, /** - * Lookup200: orml_xtokens::module::Call + * Lookup201: orml_xtokens::module::Call **/ OrmlXtokensModuleCall: { _enum: { @@ -1744,7 +1744,7 @@ } }, /** - * Lookup201: xcm::VersionedMultiAsset + * Lookup202: xcm::VersionedMultiAsset **/ XcmVersionedMultiAsset: { _enum: { @@ -1753,7 +1753,7 @@ } }, /** - * Lookup204: orml_tokens::module::Call + * Lookup205: orml_tokens::module::Call **/ OrmlTokensModuleCall: { _enum: { @@ -1787,13 +1787,13 @@ } }, /** - * Lookup205: cumulus_pallet_xcmp_queue::pallet::Call + * Lookup206: cumulus_pallet_xcmp_queue::pallet::Call **/ CumulusPalletXcmpQueueCall: { _enum: { service_overweight: { index: 'u64', - weightLimit: 'u64', + weightLimit: 'Weight', }, suspend_xcm_execution: 'Null', resume_xcm_execution: 'Null', @@ -1819,24 +1819,24 @@ _alias: { new_: 'new', }, - new_: 'u64', + new_: 'Weight', }, update_weight_restrict_decay: { _alias: { new_: 'new', }, - new_: 'u64', + new_: 'Weight', }, update_xcmp_max_individual_weight: { _alias: { new_: 'new', }, - new_: 'u64' + new_: 'Weight' } } }, /** - * Lookup206: pallet_xcm::pallet::Call + * Lookup207: pallet_xcm::pallet::Call **/ PalletXcmCall: { _enum: { @@ -1858,7 +1858,7 @@ }, execute: { message: 'XcmVersionedXcm', - maxWeight: 'u64', + maxWeight: 'Weight', }, force_xcm_version: { location: 'XcmV1MultiLocation', @@ -1890,7 +1890,7 @@ } }, /** - * Lookup207: xcm::VersionedXcm + * Lookup208: xcm::VersionedXcm **/ XcmVersionedXcm: { _enum: { @@ -1900,7 +1900,7 @@ } }, /** - * Lookup208: xcm::v0::Xcm + * Lookup209: xcm::v0::Xcm **/ XcmV0Xcm: { _enum: { @@ -1954,7 +1954,7 @@ } }, /** - * Lookup210: xcm::v0::order::Order + * Lookup211: xcm::v0::order::Order **/ XcmV0Order: { _enum: { @@ -1997,7 +1997,7 @@ } }, /** - * Lookup212: xcm::v0::Response + * Lookup213: xcm::v0::Response **/ XcmV0Response: { _enum: { @@ -2005,7 +2005,7 @@ } }, /** - * Lookup213: xcm::v1::Xcm + * Lookup214: xcm::v1::Xcm **/ XcmV1Xcm: { _enum: { @@ -2064,7 +2064,7 @@ } }, /** - * Lookup215: xcm::v1::order::Order + * Lookup216: xcm::v1::order::Order **/ XcmV1Order: { _enum: { @@ -2109,7 +2109,7 @@ } }, /** - * Lookup217: xcm::v1::Response + * Lookup218: xcm::v1::Response **/ XcmV1Response: { _enum: { @@ -2118,22 +2118,22 @@ } }, /** - * Lookup231: cumulus_pallet_xcm::pallet::Call + * Lookup232: cumulus_pallet_xcm::pallet::Call **/ CumulusPalletXcmCall: 'Null', /** - * Lookup232: cumulus_pallet_dmp_queue::pallet::Call + * Lookup233: cumulus_pallet_dmp_queue::pallet::Call **/ CumulusPalletDmpQueueCall: { _enum: { service_overweight: { index: 'u64', - weightLimit: 'u64' + weightLimit: 'Weight' } } }, /** - * Lookup233: pallet_inflation::pallet::Call + * Lookup234: pallet_inflation::pallet::Call **/ PalletInflationCall: { _enum: { @@ -2143,7 +2143,7 @@ } }, /** - * Lookup234: pallet_unique::Call + * Lookup235: pallet_unique::Call **/ PalletUniqueCall: { _enum: { @@ -2275,7 +2275,7 @@ } }, /** - * Lookup239: up_data_structs::CollectionMode + * Lookup240: up_data_structs::CollectionMode **/ UpDataStructsCollectionMode: { _enum: { @@ -2285,7 +2285,7 @@ } }, /** - * Lookup240: up_data_structs::CreateCollectionData + * Lookup241: up_data_structs::CreateCollectionData **/ UpDataStructsCreateCollectionData: { mode: 'UpDataStructsCollectionMode', @@ -2300,13 +2300,13 @@ properties: 'Vec' }, /** - * Lookup242: up_data_structs::AccessMode + * Lookup243: up_data_structs::AccessMode **/ UpDataStructsAccessMode: { _enum: ['Normal', 'AllowList'] }, /** - * Lookup244: up_data_structs::CollectionLimits + * Lookup245: up_data_structs::CollectionLimits **/ UpDataStructsCollectionLimits: { accountTokenOwnershipLimit: 'Option', @@ -2320,7 +2320,7 @@ transfersEnabled: 'Option' }, /** - * Lookup246: up_data_structs::SponsoringRateLimit + * Lookup247: up_data_structs::SponsoringRateLimit **/ UpDataStructsSponsoringRateLimit: { _enum: { @@ -2329,7 +2329,7 @@ } }, /** - * Lookup249: up_data_structs::CollectionPermissions + * Lookup250: up_data_structs::CollectionPermissions **/ UpDataStructsCollectionPermissions: { access: 'Option', @@ -2337,7 +2337,7 @@ nesting: 'Option' }, /** - * Lookup251: up_data_structs::NestingPermissions + * Lookup252: up_data_structs::NestingPermissions **/ UpDataStructsNestingPermissions: { tokenOwner: 'bool', @@ -2345,18 +2345,18 @@ restricted: 'Option' }, /** - * Lookup253: up_data_structs::OwnerRestrictedSet + * Lookup254: up_data_structs::OwnerRestrictedSet **/ UpDataStructsOwnerRestrictedSet: 'BTreeSet', /** - * Lookup258: up_data_structs::PropertyKeyPermission + * Lookup259: up_data_structs::PropertyKeyPermission **/ UpDataStructsPropertyKeyPermission: { key: 'Bytes', permission: 'UpDataStructsPropertyPermission' }, /** - * Lookup259: up_data_structs::PropertyPermission + * Lookup260: up_data_structs::PropertyPermission **/ UpDataStructsPropertyPermission: { mutable: 'bool', @@ -2364,14 +2364,14 @@ tokenOwner: 'bool' }, /** - * Lookup262: up_data_structs::Property + * Lookup263: up_data_structs::Property **/ UpDataStructsProperty: { key: 'Bytes', value: 'Bytes' }, /** - * Lookup265: up_data_structs::CreateItemData + * Lookup266: up_data_structs::CreateItemData **/ UpDataStructsCreateItemData: { _enum: { @@ -2381,26 +2381,26 @@ } }, /** - * Lookup266: up_data_structs::CreateNftData + * Lookup267: up_data_structs::CreateNftData **/ UpDataStructsCreateNftData: { properties: 'Vec' }, /** - * Lookup267: up_data_structs::CreateFungibleData + * Lookup268: up_data_structs::CreateFungibleData **/ UpDataStructsCreateFungibleData: { value: 'u128' }, /** - * Lookup268: up_data_structs::CreateReFungibleData + * Lookup269: up_data_structs::CreateReFungibleData **/ UpDataStructsCreateReFungibleData: { pieces: 'u128', properties: 'Vec' }, /** - * Lookup271: up_data_structs::CreateItemExData> + * Lookup272: up_data_structs::CreateItemExData> **/ UpDataStructsCreateItemExData: { _enum: { @@ -2411,14 +2411,14 @@ } }, /** - * Lookup273: up_data_structs::CreateNftExData> + * Lookup274: up_data_structs::CreateNftExData> **/ UpDataStructsCreateNftExData: { properties: 'Vec', owner: 'PalletEvmAccountBasicCrossAccountIdRepr' }, /** - * Lookup280: up_data_structs::CreateRefungibleExSingleOwner> + * Lookup281: up_data_structs::CreateRefungibleExSingleOwner> **/ UpDataStructsCreateRefungibleExSingleOwner: { user: 'PalletEvmAccountBasicCrossAccountIdRepr', @@ -2426,14 +2426,14 @@ properties: 'Vec' }, /** - * Lookup282: up_data_structs::CreateRefungibleExMultipleOwners> + * Lookup283: up_data_structs::CreateRefungibleExMultipleOwners> **/ UpDataStructsCreateRefungibleExMultipleOwners: { users: 'BTreeMap', properties: 'Vec' }, /** - * Lookup283: pallet_unique_scheduler::pallet::Call + * Lookup284: pallet_unique_scheduler::pallet::Call **/ PalletUniqueSchedulerCall: { _enum: { @@ -2457,7 +2457,7 @@ } }, /** - * Lookup285: frame_support::traits::schedule::MaybeHashed + * Lookup286: frame_support::traits::schedule::MaybeHashed **/ FrameSupportScheduleMaybeHashed: { _enum: { @@ -2466,7 +2466,7 @@ } }, /** - * Lookup286: pallet_configuration::pallet::Call + * Lookup287: pallet_configuration::pallet::Call **/ PalletConfigurationCall: { _enum: { @@ -2479,15 +2479,15 @@ } }, /** - * Lookup287: pallet_template_transaction_payment::Call + * Lookup289: pallet_template_transaction_payment::Call **/ PalletTemplateTransactionPaymentCall: 'Null', /** - * Lookup288: pallet_structure::pallet::Call + * Lookup290: pallet_structure::pallet::Call **/ PalletStructureCall: 'Null', /** - * Lookup289: pallet_rmrk_core::pallet::Call + * Lookup291: pallet_rmrk_core::pallet::Call **/ PalletRmrkCoreCall: { _enum: { @@ -2578,7 +2578,7 @@ } }, /** - * Lookup295: rmrk_traits::resource::ResourceTypes, sp_runtime::bounded::bounded_vec::BoundedVec> + * Lookup297: rmrk_traits::resource::ResourceTypes, sp_runtime::bounded::bounded_vec::BoundedVec> **/ RmrkTraitsResourceResourceTypes: { _enum: { @@ -2588,7 +2588,7 @@ } }, /** - * Lookup297: rmrk_traits::resource::BasicResource> + * Lookup299: rmrk_traits::resource::BasicResource> **/ RmrkTraitsResourceBasicResource: { src: 'Option', @@ -2597,7 +2597,7 @@ thumb: 'Option' }, /** - * Lookup299: rmrk_traits::resource::ComposableResource, sp_runtime::bounded::bounded_vec::BoundedVec> + * Lookup301: rmrk_traits::resource::ComposableResource, sp_runtime::bounded::bounded_vec::BoundedVec> **/ RmrkTraitsResourceComposableResource: { parts: 'Vec', @@ -2608,7 +2608,7 @@ thumb: 'Option' }, /** - * Lookup300: rmrk_traits::resource::SlotResource> + * Lookup302: rmrk_traits::resource::SlotResource> **/ RmrkTraitsResourceSlotResource: { base: 'u32', @@ -2619,7 +2619,7 @@ thumb: 'Option' }, /** - * Lookup303: pallet_rmrk_equip::pallet::Call + * Lookup305: pallet_rmrk_equip::pallet::Call **/ PalletRmrkEquipCall: { _enum: { @@ -2640,7 +2640,7 @@ } }, /** - * Lookup306: rmrk_traits::part::PartType, sp_runtime::bounded::bounded_vec::BoundedVec> + * Lookup308: rmrk_traits::part::PartType, sp_runtime::bounded::bounded_vec::BoundedVec> **/ RmrkTraitsPartPartType: { _enum: { @@ -2649,7 +2649,7 @@ } }, /** - * Lookup308: rmrk_traits::part::FixedPart> + * Lookup310: rmrk_traits::part::FixedPart> **/ RmrkTraitsPartFixedPart: { id: 'u32', @@ -2657,7 +2657,7 @@ src: 'Bytes' }, /** - * Lookup309: rmrk_traits::part::SlotPart, sp_runtime::bounded::bounded_vec::BoundedVec> + * Lookup311: rmrk_traits::part::SlotPart, sp_runtime::bounded::bounded_vec::BoundedVec> **/ RmrkTraitsPartSlotPart: { id: 'u32', @@ -2666,7 +2666,7 @@ z: 'u32' }, /** - * Lookup310: rmrk_traits::part::EquippableList> + * Lookup312: rmrk_traits::part::EquippableList> **/ RmrkTraitsPartEquippableList: { _enum: { @@ -2676,7 +2676,7 @@ } }, /** - * Lookup312: rmrk_traits::theme::Theme, sp_runtime::bounded::bounded_vec::BoundedVec>, S>> + * Lookup314: rmrk_traits::theme::Theme, sp_runtime::bounded::bounded_vec::BoundedVec>, S>> **/ RmrkTraitsTheme: { name: 'Bytes', @@ -2684,14 +2684,14 @@ inherit: 'bool' }, /** - * Lookup314: rmrk_traits::theme::ThemeProperty> + * Lookup316: rmrk_traits::theme::ThemeProperty> **/ RmrkTraitsThemeThemeProperty: { key: 'Bytes', value: 'Bytes' }, /** - * Lookup316: pallet_app_promotion::pallet::Call + * Lookup318: pallet_app_promotion::pallet::Call **/ PalletAppPromotionCall: { _enum: { @@ -2720,7 +2720,7 @@ } }, /** - * Lookup318: pallet_foreign_assets::module::Call + * Lookup320: pallet_foreign_assets::module::Call **/ PalletForeignAssetsModuleCall: { _enum: { @@ -2737,7 +2737,7 @@ } }, /** - * Lookup319: pallet_evm::pallet::Call + * Lookup321: pallet_evm::pallet::Call **/ PalletEvmCall: { _enum: { @@ -2780,7 +2780,7 @@ } }, /** - * Lookup323: pallet_ethereum::pallet::Call + * Lookup325: pallet_ethereum::pallet::Call **/ PalletEthereumCall: { _enum: { @@ -2790,7 +2790,7 @@ } }, /** - * Lookup324: ethereum::transaction::TransactionV2 + * Lookup326: ethereum::transaction::TransactionV2 **/ EthereumTransactionTransactionV2: { _enum: { @@ -2800,7 +2800,7 @@ } }, /** - * Lookup325: ethereum::transaction::LegacyTransaction + * Lookup327: ethereum::transaction::LegacyTransaction **/ EthereumTransactionLegacyTransaction: { nonce: 'U256', @@ -2812,7 +2812,7 @@ signature: 'EthereumTransactionTransactionSignature' }, /** - * Lookup326: ethereum::transaction::TransactionAction + * Lookup328: ethereum::transaction::TransactionAction **/ EthereumTransactionTransactionAction: { _enum: { @@ -2821,7 +2821,7 @@ } }, /** - * Lookup327: ethereum::transaction::TransactionSignature + * Lookup329: ethereum::transaction::TransactionSignature **/ EthereumTransactionTransactionSignature: { v: 'u64', @@ -2829,7 +2829,7 @@ s: 'H256' }, /** - * Lookup329: ethereum::transaction::EIP2930Transaction + * Lookup331: ethereum::transaction::EIP2930Transaction **/ EthereumTransactionEip2930Transaction: { chainId: 'u64', @@ -2845,14 +2845,14 @@ s: 'H256' }, /** - * Lookup331: ethereum::transaction::AccessListItem + * Lookup333: ethereum::transaction::AccessListItem **/ EthereumTransactionAccessListItem: { address: 'H160', storageKeys: 'Vec' }, /** - * Lookup332: ethereum::transaction::EIP1559Transaction + * Lookup334: ethereum::transaction::EIP1559Transaction **/ EthereumTransactionEip1559Transaction: { chainId: 'u64', @@ -2869,7 +2869,7 @@ s: 'H256' }, /** - * Lookup333: pallet_evm_migration::pallet::Call + * Lookup335: pallet_evm_migration::pallet::Call **/ PalletEvmMigrationCall: { _enum: { @@ -2887,32 +2887,32 @@ } }, /** - * Lookup336: pallet_sudo::pallet::Error + * Lookup338: pallet_sudo::pallet::Error **/ PalletSudoError: { _enum: ['RequireSudo'] }, /** - * Lookup338: orml_vesting::module::Error + * Lookup340: orml_vesting::module::Error **/ OrmlVestingModuleError: { _enum: ['ZeroVestingPeriod', 'ZeroVestingPeriodCount', 'InsufficientBalanceToLock', 'TooManyVestingSchedules', 'AmountLow', 'MaxVestingSchedulesExceeded'] }, /** - * Lookup339: orml_xtokens::module::Error + * Lookup341: orml_xtokens::module::Error **/ OrmlXtokensModuleError: { _enum: ['AssetHasNoReserve', 'NotCrossChainTransfer', 'InvalidDest', 'NotCrossChainTransferableCurrency', 'UnweighableMessage', 'XcmExecutionFailed', 'CannotReanchor', 'InvalidAncestry', 'InvalidAsset', 'DestinationNotInvertible', 'BadVersion', 'DistinctReserveForAssetAndFee', 'ZeroFee', 'ZeroAmount', 'TooManyAssetsBeingSent', 'AssetIndexNonExistent', 'FeeNotEnough', 'NotSupportedMultiLocation', 'MinXcmFeeNotDefined'] }, /** - * Lookup342: orml_tokens::BalanceLock + * Lookup344: orml_tokens::BalanceLock **/ OrmlTokensBalanceLock: { id: '[u8;8]', amount: 'u128' }, /** - * Lookup344: orml_tokens::AccountData + * Lookup346: orml_tokens::AccountData **/ OrmlTokensAccountData: { free: 'u128', @@ -2920,20 +2920,20 @@ frozen: 'u128' }, /** - * Lookup346: orml_tokens::ReserveData + * Lookup348: orml_tokens::ReserveData **/ OrmlTokensReserveData: { id: 'Null', amount: 'u128' }, /** - * Lookup348: orml_tokens::module::Error + * Lookup350: orml_tokens::module::Error **/ OrmlTokensModuleError: { _enum: ['BalanceTooLow', 'AmountIntoBalanceFailed', 'LiquidityRestrictions', 'MaxLocksExceeded', 'KeepAlive', 'ExistentialDeposit', 'DeadAccount', 'TooManyReserves'] }, /** - * Lookup350: cumulus_pallet_xcmp_queue::InboundChannelDetails + * Lookup352: cumulus_pallet_xcmp_queue::InboundChannelDetails **/ CumulusPalletXcmpQueueInboundChannelDetails: { sender: 'u32', @@ -2941,19 +2941,19 @@ messageMetadata: 'Vec<(u32,PolkadotParachainPrimitivesXcmpMessageFormat)>' }, /** - * Lookup351: cumulus_pallet_xcmp_queue::InboundState + * Lookup353: cumulus_pallet_xcmp_queue::InboundState **/ CumulusPalletXcmpQueueInboundState: { _enum: ['Ok', 'Suspended'] }, /** - * Lookup354: polkadot_parachain::primitives::XcmpMessageFormat + * Lookup356: polkadot_parachain::primitives::XcmpMessageFormat **/ PolkadotParachainPrimitivesXcmpMessageFormat: { _enum: ['ConcatenatedVersionedXcm', 'ConcatenatedEncodedBlob', 'Signals'] }, /** - * Lookup357: cumulus_pallet_xcmp_queue::OutboundChannelDetails + * Lookup359: cumulus_pallet_xcmp_queue::OutboundChannelDetails **/ CumulusPalletXcmpQueueOutboundChannelDetails: { recipient: 'u32', @@ -2963,46 +2963,46 @@ lastIndex: 'u16' }, /** - * Lookup358: cumulus_pallet_xcmp_queue::OutboundState + * Lookup360: cumulus_pallet_xcmp_queue::OutboundState **/ CumulusPalletXcmpQueueOutboundState: { _enum: ['Ok', 'Suspended'] }, /** - * Lookup360: cumulus_pallet_xcmp_queue::QueueConfigData + * Lookup362: cumulus_pallet_xcmp_queue::QueueConfigData **/ CumulusPalletXcmpQueueQueueConfigData: { suspendThreshold: 'u32', dropThreshold: 'u32', resumeThreshold: 'u32', - thresholdWeight: 'u64', - weightRestrictDecay: 'u64', - xcmpMaxIndividualWeight: 'u64' + thresholdWeight: 'Weight', + weightRestrictDecay: 'Weight', + xcmpMaxIndividualWeight: 'Weight' }, /** - * Lookup362: cumulus_pallet_xcmp_queue::pallet::Error + * Lookup364: cumulus_pallet_xcmp_queue::pallet::Error **/ CumulusPalletXcmpQueueError: { _enum: ['FailedToSend', 'BadXcmOrigin', 'BadXcm', 'BadOverweightIndex', 'WeightOverLimit'] }, /** - * Lookup363: pallet_xcm::pallet::Error + * Lookup365: pallet_xcm::pallet::Error **/ PalletXcmError: { _enum: ['Unreachable', 'SendFailure', 'Filtered', 'UnweighableMessage', 'DestinationNotInvertible', 'Empty', 'CannotReanchor', 'TooManyAssets', 'InvalidOrigin', 'BadVersion', 'BadLocation', 'NoSubscription', 'AlreadySubscribed'] }, /** - * Lookup364: cumulus_pallet_xcm::pallet::Error + * Lookup366: cumulus_pallet_xcm::pallet::Error **/ CumulusPalletXcmError: 'Null', /** - * Lookup365: cumulus_pallet_dmp_queue::ConfigData + * Lookup367: cumulus_pallet_dmp_queue::ConfigData **/ CumulusPalletDmpQueueConfigData: { - maxIndividual: 'u64' + maxIndividual: 'Weight' }, /** - * Lookup366: cumulus_pallet_dmp_queue::PageIndexData + * Lookup368: cumulus_pallet_dmp_queue::PageIndexData **/ CumulusPalletDmpQueuePageIndexData: { beginUsed: 'u32', @@ -3010,19 +3010,19 @@ overweightCount: 'u64' }, /** - * Lookup369: cumulus_pallet_dmp_queue::pallet::Error + * Lookup371: cumulus_pallet_dmp_queue::pallet::Error **/ CumulusPalletDmpQueueError: { _enum: ['Unknown', 'OverLimit'] }, /** - * Lookup373: pallet_unique::Error + * Lookup375: pallet_unique::Error **/ PalletUniqueError: { _enum: ['CollectionDecimalPointLimitExceeded', 'ConfirmUnsetSponsorFail', 'EmptyArgument', 'RepartitionCalledOnNonRefungibleCollection'] }, /** - * Lookup376: pallet_unique_scheduler::ScheduledV3, BlockNumber, opal_runtime::OriginCaller, sp_core::crypto::AccountId32> + * Lookup378: pallet_unique_scheduler::ScheduledV3, BlockNumber, opal_runtime::OriginCaller, sp_core::crypto::AccountId32> **/ PalletUniqueSchedulerScheduledV3: { maybeId: 'Option<[u8;16]>', @@ -3032,7 +3032,7 @@ origin: 'OpalRuntimeOriginCaller' }, /** - * Lookup377: opal_runtime::OriginCaller + * Lookup379: opal_runtime::OriginCaller **/ OpalRuntimeOriginCaller: { _enum: { @@ -3141,7 +3141,7 @@ } }, /** - * Lookup378: frame_support::dispatch::RawOrigin + * Lookup380: frame_support::dispatch::RawOrigin **/ FrameSupportDispatchRawOrigin: { _enum: { @@ -3151,7 +3151,7 @@ } }, /** - * Lookup379: pallet_xcm::pallet::Origin + * Lookup381: pallet_xcm::pallet::Origin **/ PalletXcmOrigin: { _enum: { @@ -3160,7 +3160,7 @@ } }, /** - * Lookup380: cumulus_pallet_xcm::pallet::Origin + * Lookup382: cumulus_pallet_xcm::pallet::Origin **/ CumulusPalletXcmOrigin: { _enum: { @@ -3169,7 +3169,7 @@ } }, /** - * Lookup381: pallet_ethereum::RawOrigin + * Lookup383: pallet_ethereum::RawOrigin **/ PalletEthereumRawOrigin: { _enum: { @@ -3177,17 +3177,17 @@ } }, /** - * Lookup382: sp_core::Void + * Lookup384: sp_core::Void **/ SpCoreVoid: 'Null', /** - * Lookup383: pallet_unique_scheduler::pallet::Error + * Lookup385: pallet_unique_scheduler::pallet::Error **/ PalletUniqueSchedulerError: { _enum: ['FailedToSchedule', 'NotFound', 'TargetBlockNumberInPast', 'RescheduleNoChange'] }, /** - * Lookup384: up_data_structs::Collection + * Lookup386: up_data_structs::Collection **/ UpDataStructsCollection: { owner: 'AccountId32', @@ -3201,7 +3201,7 @@ flags: '[u8;1]' }, /** - * Lookup385: up_data_structs::SponsorshipState + * Lookup387: up_data_structs::SponsorshipState **/ UpDataStructsSponsorshipStateAccountId32: { _enum: { @@ -3211,7 +3211,7 @@ } }, /** - * Lookup387: up_data_structs::Properties + * Lookup389: up_data_structs::Properties **/ UpDataStructsProperties: { map: 'UpDataStructsPropertiesMapBoundedVec', @@ -3219,15 +3219,15 @@ spaceLimit: 'u32' }, /** - * Lookup388: up_data_structs::PropertiesMap> + * Lookup390: up_data_structs::PropertiesMap> **/ UpDataStructsPropertiesMapBoundedVec: 'BTreeMap', /** - * Lookup393: up_data_structs::PropertiesMap + * Lookup395: up_data_structs::PropertiesMap **/ UpDataStructsPropertiesMapPropertyPermission: 'BTreeMap', /** - * Lookup400: up_data_structs::CollectionStats + * Lookup402: up_data_structs::CollectionStats **/ UpDataStructsCollectionStats: { created: 'u32', @@ -3235,18 +3235,18 @@ alive: 'u32' }, /** - * Lookup401: up_data_structs::TokenChild + * Lookup403: up_data_structs::TokenChild **/ UpDataStructsTokenChild: { token: 'u32', collection: 'u32' }, /** - * Lookup402: PhantomType::up_data_structs + * Lookup404: PhantomType::up_data_structs **/ PhantomTypeUpDataStructs: '[(UpDataStructsTokenData,UpDataStructsRpcCollection,RmrkTraitsCollectionCollectionInfo,RmrkTraitsNftNftInfo,RmrkTraitsResourceResourceInfo,RmrkTraitsPropertyPropertyInfo,RmrkTraitsBaseBaseInfo,RmrkTraitsPartPartType,RmrkTraitsTheme,RmrkTraitsNftNftChild);0]', /** - * Lookup404: up_data_structs::TokenData> + * Lookup406: up_data_structs::TokenData> **/ UpDataStructsTokenData: { properties: 'Vec', @@ -3254,7 +3254,7 @@ pieces: 'u128' }, /** - * Lookup406: up_data_structs::RpcCollection + * Lookup408: up_data_structs::RpcCollection **/ UpDataStructsRpcCollection: { owner: 'AccountId32', @@ -3271,7 +3271,7 @@ foreign: 'bool' }, /** - * Lookup407: rmrk_traits::collection::CollectionInfo, sp_runtime::bounded::bounded_vec::BoundedVec, sp_core::crypto::AccountId32> + * Lookup409: rmrk_traits::collection::CollectionInfo, sp_runtime::bounded::bounded_vec::BoundedVec, sp_core::crypto::AccountId32> **/ RmrkTraitsCollectionCollectionInfo: { issuer: 'AccountId32', @@ -3281,7 +3281,7 @@ nftsCount: 'u32' }, /** - * Lookup408: rmrk_traits::nft::NftInfo> + * Lookup410: rmrk_traits::nft::NftInfo> **/ RmrkTraitsNftNftInfo: { owner: 'RmrkTraitsNftAccountIdOrCollectionNftTuple', @@ -3291,14 +3291,14 @@ pending: 'bool' }, /** - * Lookup410: rmrk_traits::nft::RoyaltyInfo + * Lookup412: rmrk_traits::nft::RoyaltyInfo **/ RmrkTraitsNftRoyaltyInfo: { recipient: 'AccountId32', amount: 'Permill' }, /** - * Lookup411: rmrk_traits::resource::ResourceInfo, sp_runtime::bounded::bounded_vec::BoundedVec> + * Lookup413: rmrk_traits::resource::ResourceInfo, sp_runtime::bounded::bounded_vec::BoundedVec> **/ RmrkTraitsResourceResourceInfo: { id: 'u32', @@ -3307,14 +3307,14 @@ pendingRemoval: 'bool' }, /** - * Lookup412: rmrk_traits::property::PropertyInfo, sp_runtime::bounded::bounded_vec::BoundedVec> + * Lookup414: rmrk_traits::property::PropertyInfo, sp_runtime::bounded::bounded_vec::BoundedVec> **/ RmrkTraitsPropertyPropertyInfo: { key: 'Bytes', value: 'Bytes' }, /** - * Lookup413: rmrk_traits::base::BaseInfo> + * Lookup415: rmrk_traits::base::BaseInfo> **/ RmrkTraitsBaseBaseInfo: { issuer: 'AccountId32', @@ -3322,92 +3322,92 @@ symbol: 'Bytes' }, /** - * Lookup414: rmrk_traits::nft::NftChild + * Lookup416: rmrk_traits::nft::NftChild **/ RmrkTraitsNftNftChild: { collectionId: 'u32', nftId: 'u32' }, /** - * Lookup416: pallet_common::pallet::Error + * Lookup418: pallet_common::pallet::Error **/ PalletCommonError: { _enum: ['CollectionNotFound', 'MustBeTokenOwner', 'NoPermission', 'CantDestroyNotEmptyCollection', 'PublicMintingNotAllowed', 'AddressNotInAllowlist', 'CollectionNameLimitExceeded', 'CollectionDescriptionLimitExceeded', 'CollectionTokenPrefixLimitExceeded', 'TotalCollectionsLimitExceeded', 'CollectionAdminCountExceeded', 'CollectionLimitBoundsExceeded', 'OwnerPermissionsCantBeReverted', 'TransferNotAllowed', 'AccountTokenLimitExceeded', 'CollectionTokenLimitExceeded', 'MetadataFlagFrozen', 'TokenNotFound', 'TokenValueTooLow', 'ApprovedValueTooLow', 'CantApproveMoreThanOwned', 'AddressIsZero', 'UnsupportedOperation', 'NotSufficientFounds', 'UserIsNotAllowedToNest', 'SourceCollectionIsNotAllowedToNest', 'CollectionFieldSizeExceeded', 'NoSpaceForProperty', 'PropertyLimitReached', 'PropertyKeyIsTooLong', 'InvalidCharacterInPropertyKey', 'EmptyPropertyKey', 'CollectionIsExternal', 'CollectionIsInternal'] }, /** - * Lookup418: pallet_fungible::pallet::Error + * Lookup420: pallet_fungible::pallet::Error **/ PalletFungibleError: { _enum: ['NotFungibleDataUsedToMintFungibleCollectionToken', 'FungibleItemsHaveNoId', 'FungibleItemsDontHaveData', 'FungibleDisallowsNesting', 'SettingPropertiesNotAllowed'] }, /** - * Lookup419: pallet_refungible::ItemData + * Lookup421: pallet_refungible::ItemData **/ PalletRefungibleItemData: { constData: 'Bytes' }, /** - * Lookup424: pallet_refungible::pallet::Error + * Lookup426: pallet_refungible::pallet::Error **/ PalletRefungibleError: { _enum: ['NotRefungibleDataUsedToMintFungibleCollectionToken', 'WrongRefungiblePieces', 'RepartitionWhileNotOwningAllPieces', 'RefungibleDisallowsNesting', 'SettingPropertiesNotAllowed'] }, /** - * Lookup425: pallet_nonfungible::ItemData> + * Lookup427: pallet_nonfungible::ItemData> **/ PalletNonfungibleItemData: { owner: 'PalletEvmAccountBasicCrossAccountIdRepr' }, /** - * Lookup427: up_data_structs::PropertyScope + * Lookup429: up_data_structs::PropertyScope **/ UpDataStructsPropertyScope: { _enum: ['None', 'Rmrk'] }, /** - * Lookup429: pallet_nonfungible::pallet::Error + * Lookup431: pallet_nonfungible::pallet::Error **/ PalletNonfungibleError: { _enum: ['NotNonfungibleDataUsedToMintFungibleCollectionToken', 'NonfungibleItemsHaveNoAmount', 'CantBurnNftWithChildren'] }, /** - * Lookup430: pallet_structure::pallet::Error + * Lookup432: pallet_structure::pallet::Error **/ PalletStructureError: { _enum: ['OuroborosDetected', 'DepthLimit', 'BreadthLimit', 'TokenNotFound'] }, /** - * Lookup431: pallet_rmrk_core::pallet::Error + * Lookup433: pallet_rmrk_core::pallet::Error **/ PalletRmrkCoreError: { _enum: ['CorruptedCollectionType', 'RmrkPropertyKeyIsTooLong', 'RmrkPropertyValueIsTooLong', 'RmrkPropertyIsNotFound', 'UnableToDecodeRmrkData', 'CollectionNotEmpty', 'NoAvailableCollectionId', 'NoAvailableNftId', 'CollectionUnknown', 'NoPermission', 'NonTransferable', 'CollectionFullOrLocked', 'ResourceDoesntExist', 'CannotSendToDescendentOrSelf', 'CannotAcceptNonOwnedNft', 'CannotRejectNonOwnedNft', 'CannotRejectNonPendingNft', 'ResourceNotPending', 'NoAvailableResourceId'] }, /** - * Lookup433: pallet_rmrk_equip::pallet::Error + * Lookup435: pallet_rmrk_equip::pallet::Error **/ PalletRmrkEquipError: { _enum: ['PermissionError', 'NoAvailableBaseId', 'NoAvailablePartId', 'BaseDoesntExist', 'NeedsDefaultThemeFirst', 'PartDoesntExist', 'NoEquippableOnFixedPart'] }, /** - * Lookup439: pallet_app_promotion::pallet::Error + * Lookup441: pallet_app_promotion::pallet::Error **/ PalletAppPromotionError: { _enum: ['AdminNotSet', 'NoPermission', 'NotSufficientFunds', 'PendingForBlockOverflow', 'SponsorNotSet', 'IncorrectLockedBalanceOperation'] }, /** - * Lookup440: pallet_foreign_assets::module::Error + * Lookup442: pallet_foreign_assets::module::Error **/ PalletForeignAssetsModuleError: { _enum: ['BadLocation', 'MultiLocationExisted', 'AssetIdNotExists', 'AssetIdExisted'] }, /** - * Lookup443: pallet_evm::pallet::Error + * Lookup445: pallet_evm::pallet::Error **/ PalletEvmError: { _enum: ['BalanceLow', 'FeeOverflow', 'PaymentOverflow', 'WithdrawFailed', 'GasPriceTooLow', 'InvalidNonce'] }, /** - * Lookup446: fp_rpc::TransactionStatus + * Lookup448: fp_rpc::TransactionStatus **/ FpRpcTransactionStatus: { transactionHash: 'H256', @@ -3419,11 +3419,11 @@ logsBloom: 'EthbloomBloom' }, /** - * Lookup448: ethbloom::Bloom + * Lookup450: ethbloom::Bloom **/ EthbloomBloom: '[u8;256]', /** - * Lookup450: ethereum::receipt::ReceiptV3 + * Lookup452: ethereum::receipt::ReceiptV3 **/ EthereumReceiptReceiptV3: { _enum: { @@ -3433,7 +3433,7 @@ } }, /** - * Lookup451: ethereum::receipt::EIP658ReceiptData + * Lookup453: ethereum::receipt::EIP658ReceiptData **/ EthereumReceiptEip658ReceiptData: { statusCode: 'u8', @@ -3442,7 +3442,7 @@ logs: 'Vec' }, /** - * Lookup452: ethereum::block::Block + * Lookup454: ethereum::block::Block **/ EthereumBlock: { header: 'EthereumHeader', @@ -3450,7 +3450,7 @@ ommers: 'Vec' }, /** - * Lookup453: ethereum::header::Header + * Lookup455: ethereum::header::Header **/ EthereumHeader: { parentHash: 'H256', @@ -3470,23 +3470,23 @@ nonce: 'EthereumTypesHashH64' }, /** - * Lookup454: ethereum_types::hash::H64 + * Lookup456: ethereum_types::hash::H64 **/ EthereumTypesHashH64: '[u8;8]', /** - * Lookup459: pallet_ethereum::pallet::Error + * Lookup461: pallet_ethereum::pallet::Error **/ PalletEthereumError: { _enum: ['InvalidSignature', 'PreLogExists'] }, /** - * Lookup460: pallet_evm_coder_substrate::pallet::Error + * Lookup462: pallet_evm_coder_substrate::pallet::Error **/ PalletEvmCoderSubstrateError: { _enum: ['OutOfGas', 'OutOfFund'] }, /** - * Lookup461: up_data_structs::SponsorshipState> + * Lookup463: up_data_structs::SponsorshipState> **/ UpDataStructsSponsorshipStateBasicCrossAccountIdRepr: { _enum: { @@ -3496,25 +3496,25 @@ } }, /** - * Lookup462: pallet_evm_contract_helpers::SponsoringModeT + * Lookup464: pallet_evm_contract_helpers::SponsoringModeT **/ PalletEvmContractHelpersSponsoringModeT: { _enum: ['Disabled', 'Allowlisted', 'Generous'] }, /** - * Lookup468: pallet_evm_contract_helpers::pallet::Error + * Lookup470: pallet_evm_contract_helpers::pallet::Error **/ PalletEvmContractHelpersError: { _enum: ['NoPermission', 'NoPendingSponsor', 'TooManyMethodsHaveSponsoredLimit'] }, /** - * Lookup469: pallet_evm_migration::pallet::Error + * Lookup471: pallet_evm_migration::pallet::Error **/ PalletEvmMigrationError: { _enum: ['AccountNotEmpty', 'AccountIsNotMigrating'] }, /** - * Lookup471: sp_runtime::MultiSignature + * Lookup473: sp_runtime::MultiSignature **/ SpRuntimeMultiSignature: { _enum: { @@ -3524,47 +3524,47 @@ } }, /** - * Lookup472: sp_core::ed25519::Signature + * Lookup474: sp_core::ed25519::Signature **/ SpCoreEd25519Signature: '[u8;64]', /** - * Lookup474: sp_core::sr25519::Signature + * Lookup476: sp_core::sr25519::Signature **/ SpCoreSr25519Signature: '[u8;64]', /** - * Lookup475: sp_core::ecdsa::Signature + * Lookup477: sp_core::ecdsa::Signature **/ SpCoreEcdsaSignature: '[u8;65]', /** - * Lookup478: frame_system::extensions::check_spec_version::CheckSpecVersion + * Lookup480: frame_system::extensions::check_spec_version::CheckSpecVersion **/ FrameSystemExtensionsCheckSpecVersion: 'Null', /** - * Lookup479: frame_system::extensions::check_tx_version::CheckTxVersion + * Lookup481: frame_system::extensions::check_tx_version::CheckTxVersion **/ FrameSystemExtensionsCheckTxVersion: 'Null', /** - * Lookup480: frame_system::extensions::check_genesis::CheckGenesis + * Lookup482: frame_system::extensions::check_genesis::CheckGenesis **/ FrameSystemExtensionsCheckGenesis: 'Null', /** - * Lookup483: frame_system::extensions::check_nonce::CheckNonce + * Lookup485: frame_system::extensions::check_nonce::CheckNonce **/ FrameSystemExtensionsCheckNonce: 'Compact', /** - * Lookup484: frame_system::extensions::check_weight::CheckWeight + * Lookup486: frame_system::extensions::check_weight::CheckWeight **/ FrameSystemExtensionsCheckWeight: 'Null', /** - * Lookup485: pallet_template_transaction_payment::ChargeTransactionPayment + * Lookup487: pallet_template_transaction_payment::ChargeTransactionPayment **/ PalletTemplateTransactionPaymentChargeTransactionPayment: 'Compact', /** - * Lookup486: opal_runtime::Runtime + * Lookup488: opal_runtime::Runtime **/ OpalRuntimeRuntime: 'Null', /** - * Lookup487: pallet_ethereum::FakeTransactionFinalizer + * Lookup489: pallet_ethereum::FakeTransactionFinalizer **/ PalletEthereumFakeTransactionFinalizer: 'Null' }; --- a/tests/src/interfaces/registry.ts +++ b/tests/src/interfaces/registry.ts @@ -5,7 +5,7 @@ // this is required to allow for ambient/previous definitions import '@polkadot/types/types/registry'; -import type { CumulusPalletDmpQueueCall, CumulusPalletDmpQueueConfigData, CumulusPalletDmpQueueError, CumulusPalletDmpQueueEvent, CumulusPalletDmpQueuePageIndexData, CumulusPalletParachainSystemCall, CumulusPalletParachainSystemError, CumulusPalletParachainSystemEvent, CumulusPalletParachainSystemRelayStateSnapshotMessagingStateSnapshot, CumulusPalletXcmCall, CumulusPalletXcmError, CumulusPalletXcmEvent, CumulusPalletXcmOrigin, CumulusPalletXcmpQueueCall, CumulusPalletXcmpQueueError, CumulusPalletXcmpQueueEvent, CumulusPalletXcmpQueueInboundChannelDetails, CumulusPalletXcmpQueueInboundState, CumulusPalletXcmpQueueOutboundChannelDetails, CumulusPalletXcmpQueueOutboundState, CumulusPalletXcmpQueueQueueConfigData, CumulusPrimitivesParachainInherentParachainInherentData, EthbloomBloom, EthereumBlock, EthereumHeader, EthereumLog, EthereumReceiptEip658ReceiptData, EthereumReceiptReceiptV3, EthereumTransactionAccessListItem, EthereumTransactionEip1559Transaction, EthereumTransactionEip2930Transaction, EthereumTransactionLegacyTransaction, EthereumTransactionTransactionAction, EthereumTransactionTransactionSignature, EthereumTransactionTransactionV2, EthereumTypesHashH64, EvmCoreErrorExitError, EvmCoreErrorExitFatal, EvmCoreErrorExitReason, EvmCoreErrorExitRevert, EvmCoreErrorExitSucceed, FpRpcTransactionStatus, FrameSupportDispatchRawOrigin, FrameSupportPalletId, FrameSupportScheduleLookupError, FrameSupportScheduleMaybeHashed, FrameSupportTokensMiscBalanceStatus, FrameSupportWeightsDispatchClass, FrameSupportWeightsDispatchInfo, FrameSupportWeightsPays, FrameSupportWeightsPerDispatchClassU32, FrameSupportWeightsPerDispatchClassU64, FrameSupportWeightsPerDispatchClassWeightsPerClass, FrameSupportWeightsRuntimeDbWeight, FrameSystemAccountInfo, FrameSystemCall, FrameSystemError, FrameSystemEvent, FrameSystemEventRecord, FrameSystemExtensionsCheckGenesis, FrameSystemExtensionsCheckNonce, FrameSystemExtensionsCheckSpecVersion, FrameSystemExtensionsCheckTxVersion, FrameSystemExtensionsCheckWeight, FrameSystemLastRuntimeUpgradeInfo, FrameSystemLimitsBlockLength, FrameSystemLimitsBlockWeights, FrameSystemLimitsWeightsPerClass, FrameSystemPhase, OpalRuntimeOriginCaller, OpalRuntimeRuntime, OrmlTokensAccountData, OrmlTokensBalanceLock, OrmlTokensModuleCall, OrmlTokensModuleError, OrmlTokensModuleEvent, OrmlTokensReserveData, OrmlVestingModuleCall, OrmlVestingModuleError, OrmlVestingModuleEvent, OrmlVestingVestingSchedule, OrmlXtokensModuleCall, OrmlXtokensModuleError, OrmlXtokensModuleEvent, PalletAppPromotionCall, PalletAppPromotionError, PalletAppPromotionEvent, PalletBalancesAccountData, PalletBalancesBalanceLock, PalletBalancesCall, PalletBalancesError, PalletBalancesEvent, PalletBalancesReasons, PalletBalancesReleases, PalletBalancesReserveData, PalletCommonError, PalletCommonEvent, PalletConfigurationCall, PalletEthereumCall, PalletEthereumError, PalletEthereumEvent, PalletEthereumFakeTransactionFinalizer, PalletEthereumRawOrigin, PalletEvmAccountBasicCrossAccountIdRepr, PalletEvmCall, PalletEvmCoderSubstrateError, PalletEvmContractHelpersError, PalletEvmContractHelpersEvent, PalletEvmContractHelpersSponsoringModeT, PalletEvmError, PalletEvmEvent, PalletEvmMigrationCall, PalletEvmMigrationError, PalletForeignAssetsAssetIds, PalletForeignAssetsModuleAssetMetadata, PalletForeignAssetsModuleCall, PalletForeignAssetsModuleError, PalletForeignAssetsModuleEvent, PalletForeignAssetsNativeCurrency, PalletFungibleError, PalletInflationCall, PalletNonfungibleError, PalletNonfungibleItemData, PalletRefungibleError, PalletRefungibleItemData, PalletRmrkCoreCall, PalletRmrkCoreError, PalletRmrkCoreEvent, PalletRmrkEquipCall, PalletRmrkEquipError, PalletRmrkEquipEvent, PalletStructureCall, PalletStructureError, PalletStructureEvent, PalletSudoCall, PalletSudoError, PalletSudoEvent, PalletTemplateTransactionPaymentCall, PalletTemplateTransactionPaymentChargeTransactionPayment, PalletTimestampCall, PalletTransactionPaymentEvent, PalletTransactionPaymentReleases, PalletTreasuryCall, PalletTreasuryError, PalletTreasuryEvent, PalletTreasuryProposal, PalletUniqueCall, PalletUniqueError, PalletUniqueRawEvent, PalletUniqueSchedulerCall, PalletUniqueSchedulerError, PalletUniqueSchedulerEvent, PalletUniqueSchedulerScheduledV3, PalletXcmCall, PalletXcmError, PalletXcmEvent, PalletXcmOrigin, PhantomTypeUpDataStructs, PolkadotCorePrimitivesInboundDownwardMessage, PolkadotCorePrimitivesInboundHrmpMessage, PolkadotCorePrimitivesOutboundHrmpMessage, PolkadotParachainPrimitivesXcmpMessageFormat, PolkadotPrimitivesV2AbridgedHostConfiguration, PolkadotPrimitivesV2AbridgedHrmpChannel, PolkadotPrimitivesV2PersistedValidationData, PolkadotPrimitivesV2UpgradeRestriction, RmrkTraitsBaseBaseInfo, RmrkTraitsCollectionCollectionInfo, RmrkTraitsNftAccountIdOrCollectionNftTuple, RmrkTraitsNftNftChild, RmrkTraitsNftNftInfo, RmrkTraitsNftRoyaltyInfo, RmrkTraitsPartEquippableList, RmrkTraitsPartFixedPart, RmrkTraitsPartPartType, RmrkTraitsPartSlotPart, RmrkTraitsPropertyPropertyInfo, RmrkTraitsResourceBasicResource, RmrkTraitsResourceComposableResource, RmrkTraitsResourceResourceInfo, RmrkTraitsResourceResourceTypes, RmrkTraitsResourceSlotResource, RmrkTraitsTheme, RmrkTraitsThemeThemeProperty, SpCoreEcdsaSignature, SpCoreEd25519Signature, SpCoreSr25519Signature, SpCoreVoid, SpRuntimeArithmeticError, SpRuntimeDigest, SpRuntimeDigestDigestItem, SpRuntimeDispatchError, SpRuntimeModuleError, SpRuntimeMultiSignature, SpRuntimeTokenError, SpRuntimeTransactionalError, SpTrieStorageProof, SpVersionRuntimeVersion, UpDataStructsAccessMode, UpDataStructsCollection, UpDataStructsCollectionLimits, UpDataStructsCollectionMode, UpDataStructsCollectionPermissions, UpDataStructsCollectionStats, UpDataStructsCreateCollectionData, UpDataStructsCreateFungibleData, UpDataStructsCreateItemData, UpDataStructsCreateItemExData, UpDataStructsCreateNftData, UpDataStructsCreateNftExData, UpDataStructsCreateReFungibleData, UpDataStructsCreateRefungibleExMultipleOwners, UpDataStructsCreateRefungibleExSingleOwner, UpDataStructsNestingPermissions, UpDataStructsOwnerRestrictedSet, UpDataStructsProperties, UpDataStructsPropertiesMapBoundedVec, UpDataStructsPropertiesMapPropertyPermission, UpDataStructsProperty, UpDataStructsPropertyKeyPermission, UpDataStructsPropertyPermission, UpDataStructsPropertyScope, UpDataStructsRpcCollection, UpDataStructsSponsoringRateLimit, UpDataStructsSponsorshipStateAccountId32, UpDataStructsSponsorshipStateBasicCrossAccountIdRepr, UpDataStructsTokenChild, UpDataStructsTokenData, XcmDoubleEncoded, XcmV0Junction, XcmV0JunctionBodyId, XcmV0JunctionBodyPart, XcmV0JunctionNetworkId, XcmV0MultiAsset, XcmV0MultiLocation, XcmV0Order, XcmV0OriginKind, XcmV0Response, XcmV0Xcm, XcmV1Junction, XcmV1MultiAsset, XcmV1MultiLocation, XcmV1MultiassetAssetId, XcmV1MultiassetAssetInstance, XcmV1MultiassetFungibility, XcmV1MultiassetMultiAssetFilter, XcmV1MultiassetMultiAssets, XcmV1MultiassetWildFungibility, XcmV1MultiassetWildMultiAsset, XcmV1MultilocationJunctions, XcmV1Order, XcmV1Response, XcmV1Xcm, XcmV2Instruction, XcmV2Response, XcmV2TraitsError, XcmV2TraitsOutcome, XcmV2WeightLimit, XcmV2Xcm, XcmVersionedMultiAsset, XcmVersionedMultiAssets, XcmVersionedMultiLocation, XcmVersionedXcm } from '@polkadot/types/lookup'; +import type { CumulusPalletDmpQueueCall, CumulusPalletDmpQueueConfigData, CumulusPalletDmpQueueError, CumulusPalletDmpQueueEvent, CumulusPalletDmpQueuePageIndexData, CumulusPalletParachainSystemCall, CumulusPalletParachainSystemError, CumulusPalletParachainSystemEvent, CumulusPalletParachainSystemRelayStateSnapshotMessagingStateSnapshot, CumulusPalletXcmCall, CumulusPalletXcmError, CumulusPalletXcmEvent, CumulusPalletXcmOrigin, CumulusPalletXcmpQueueCall, CumulusPalletXcmpQueueError, CumulusPalletXcmpQueueEvent, CumulusPalletXcmpQueueInboundChannelDetails, CumulusPalletXcmpQueueInboundState, CumulusPalletXcmpQueueOutboundChannelDetails, CumulusPalletXcmpQueueOutboundState, CumulusPalletXcmpQueueQueueConfigData, CumulusPrimitivesParachainInherentParachainInherentData, EthbloomBloom, EthereumBlock, EthereumHeader, EthereumLog, EthereumReceiptEip658ReceiptData, EthereumReceiptReceiptV3, EthereumTransactionAccessListItem, EthereumTransactionEip1559Transaction, EthereumTransactionEip2930Transaction, EthereumTransactionLegacyTransaction, EthereumTransactionTransactionAction, EthereumTransactionTransactionSignature, EthereumTransactionTransactionV2, EthereumTypesHashH64, EvmCoreErrorExitError, EvmCoreErrorExitFatal, EvmCoreErrorExitReason, EvmCoreErrorExitRevert, EvmCoreErrorExitSucceed, FpRpcTransactionStatus, FrameSupportDispatchRawOrigin, FrameSupportPalletId, FrameSupportScheduleLookupError, FrameSupportScheduleMaybeHashed, FrameSupportTokensMiscBalanceStatus, FrameSupportWeightsDispatchClass, FrameSupportWeightsDispatchInfo, FrameSupportWeightsPays, FrameSupportWeightsPerDispatchClassU32, FrameSupportWeightsPerDispatchClassWeight, FrameSupportWeightsPerDispatchClassWeightsPerClass, FrameSupportWeightsRuntimeDbWeight, FrameSystemAccountInfo, FrameSystemCall, FrameSystemError, FrameSystemEvent, FrameSystemEventRecord, FrameSystemExtensionsCheckGenesis, FrameSystemExtensionsCheckNonce, FrameSystemExtensionsCheckSpecVersion, FrameSystemExtensionsCheckTxVersion, FrameSystemExtensionsCheckWeight, FrameSystemLastRuntimeUpgradeInfo, FrameSystemLimitsBlockLength, FrameSystemLimitsBlockWeights, FrameSystemLimitsWeightsPerClass, FrameSystemPhase, OpalRuntimeOriginCaller, OpalRuntimeRuntime, OrmlTokensAccountData, OrmlTokensBalanceLock, OrmlTokensModuleCall, OrmlTokensModuleError, OrmlTokensModuleEvent, OrmlTokensReserveData, OrmlVestingModuleCall, OrmlVestingModuleError, OrmlVestingModuleEvent, OrmlVestingVestingSchedule, OrmlXtokensModuleCall, OrmlXtokensModuleError, OrmlXtokensModuleEvent, PalletAppPromotionCall, PalletAppPromotionError, PalletAppPromotionEvent, PalletBalancesAccountData, PalletBalancesBalanceLock, PalletBalancesCall, PalletBalancesError, PalletBalancesEvent, PalletBalancesReasons, PalletBalancesReleases, PalletBalancesReserveData, PalletCommonError, PalletCommonEvent, PalletConfigurationCall, PalletEthereumCall, PalletEthereumError, PalletEthereumEvent, PalletEthereumFakeTransactionFinalizer, PalletEthereumRawOrigin, PalletEvmAccountBasicCrossAccountIdRepr, PalletEvmCall, PalletEvmCoderSubstrateError, PalletEvmContractHelpersError, PalletEvmContractHelpersEvent, PalletEvmContractHelpersSponsoringModeT, PalletEvmError, PalletEvmEvent, PalletEvmMigrationCall, PalletEvmMigrationError, PalletForeignAssetsAssetIds, PalletForeignAssetsModuleAssetMetadata, PalletForeignAssetsModuleCall, PalletForeignAssetsModuleError, PalletForeignAssetsModuleEvent, PalletForeignAssetsNativeCurrency, PalletFungibleError, PalletInflationCall, PalletNonfungibleError, PalletNonfungibleItemData, PalletRefungibleError, PalletRefungibleItemData, PalletRmrkCoreCall, PalletRmrkCoreError, PalletRmrkCoreEvent, PalletRmrkEquipCall, PalletRmrkEquipError, PalletRmrkEquipEvent, PalletStructureCall, PalletStructureError, PalletStructureEvent, PalletSudoCall, PalletSudoError, PalletSudoEvent, PalletTemplateTransactionPaymentCall, PalletTemplateTransactionPaymentChargeTransactionPayment, PalletTimestampCall, PalletTransactionPaymentEvent, PalletTransactionPaymentReleases, PalletTreasuryCall, PalletTreasuryError, PalletTreasuryEvent, PalletTreasuryProposal, PalletUniqueCall, PalletUniqueError, PalletUniqueRawEvent, PalletUniqueSchedulerCall, PalletUniqueSchedulerError, PalletUniqueSchedulerEvent, PalletUniqueSchedulerScheduledV3, PalletXcmCall, PalletXcmError, PalletXcmEvent, PalletXcmOrigin, PhantomTypeUpDataStructs, PolkadotCorePrimitivesInboundDownwardMessage, PolkadotCorePrimitivesInboundHrmpMessage, PolkadotCorePrimitivesOutboundHrmpMessage, PolkadotParachainPrimitivesXcmpMessageFormat, PolkadotPrimitivesV2AbridgedHostConfiguration, PolkadotPrimitivesV2AbridgedHrmpChannel, PolkadotPrimitivesV2PersistedValidationData, PolkadotPrimitivesV2UpgradeRestriction, RmrkTraitsBaseBaseInfo, RmrkTraitsCollectionCollectionInfo, RmrkTraitsNftAccountIdOrCollectionNftTuple, RmrkTraitsNftNftChild, RmrkTraitsNftNftInfo, RmrkTraitsNftRoyaltyInfo, RmrkTraitsPartEquippableList, RmrkTraitsPartFixedPart, RmrkTraitsPartPartType, RmrkTraitsPartSlotPart, RmrkTraitsPropertyPropertyInfo, RmrkTraitsResourceBasicResource, RmrkTraitsResourceComposableResource, RmrkTraitsResourceResourceInfo, RmrkTraitsResourceResourceTypes, RmrkTraitsResourceSlotResource, RmrkTraitsTheme, RmrkTraitsThemeThemeProperty, SpCoreEcdsaSignature, SpCoreEd25519Signature, SpCoreSr25519Signature, SpCoreVoid, SpRuntimeArithmeticError, SpRuntimeDigest, SpRuntimeDigestDigestItem, SpRuntimeDispatchError, SpRuntimeModuleError, SpRuntimeMultiSignature, SpRuntimeTokenError, SpRuntimeTransactionalError, SpTrieStorageProof, SpVersionRuntimeVersion, UpDataStructsAccessMode, UpDataStructsCollection, UpDataStructsCollectionLimits, UpDataStructsCollectionMode, UpDataStructsCollectionPermissions, UpDataStructsCollectionStats, UpDataStructsCreateCollectionData, UpDataStructsCreateFungibleData, UpDataStructsCreateItemData, UpDataStructsCreateItemExData, UpDataStructsCreateNftData, UpDataStructsCreateNftExData, UpDataStructsCreateReFungibleData, UpDataStructsCreateRefungibleExMultipleOwners, UpDataStructsCreateRefungibleExSingleOwner, UpDataStructsNestingPermissions, UpDataStructsOwnerRestrictedSet, UpDataStructsProperties, UpDataStructsPropertiesMapBoundedVec, UpDataStructsPropertiesMapPropertyPermission, UpDataStructsProperty, UpDataStructsPropertyKeyPermission, UpDataStructsPropertyPermission, UpDataStructsPropertyScope, UpDataStructsRpcCollection, UpDataStructsSponsoringRateLimit, UpDataStructsSponsorshipStateAccountId32, UpDataStructsSponsorshipStateBasicCrossAccountIdRepr, UpDataStructsTokenChild, UpDataStructsTokenData, XcmDoubleEncoded, XcmV0Junction, XcmV0JunctionBodyId, XcmV0JunctionBodyPart, XcmV0JunctionNetworkId, XcmV0MultiAsset, XcmV0MultiLocation, XcmV0Order, XcmV0OriginKind, XcmV0Response, XcmV0Xcm, XcmV1Junction, XcmV1MultiAsset, XcmV1MultiLocation, XcmV1MultiassetAssetId, XcmV1MultiassetAssetInstance, XcmV1MultiassetFungibility, XcmV1MultiassetMultiAssetFilter, XcmV1MultiassetMultiAssets, XcmV1MultiassetWildFungibility, XcmV1MultiassetWildMultiAsset, XcmV1MultilocationJunctions, XcmV1Order, XcmV1Response, XcmV1Xcm, XcmV2Instruction, XcmV2Response, XcmV2TraitsError, XcmV2TraitsOutcome, XcmV2WeightLimit, XcmV2Xcm, XcmVersionedMultiAsset, XcmVersionedMultiAssets, XcmVersionedMultiLocation, XcmVersionedXcm } from '@polkadot/types/lookup'; declare module '@polkadot/types/types/registry' { interface InterfaceTypes { @@ -60,7 +60,7 @@ FrameSupportWeightsDispatchInfo: FrameSupportWeightsDispatchInfo; FrameSupportWeightsPays: FrameSupportWeightsPays; FrameSupportWeightsPerDispatchClassU32: FrameSupportWeightsPerDispatchClassU32; - FrameSupportWeightsPerDispatchClassU64: FrameSupportWeightsPerDispatchClassU64; + FrameSupportWeightsPerDispatchClassWeight: FrameSupportWeightsPerDispatchClassWeight; FrameSupportWeightsPerDispatchClassWeightsPerClass: FrameSupportWeightsPerDispatchClassWeightsPerClass; FrameSupportWeightsRuntimeDbWeight: FrameSupportWeightsRuntimeDbWeight; FrameSystemAccountInfo: FrameSystemAccountInfo; --- a/tests/src/interfaces/types-lookup.ts +++ b/tests/src/interfaces/types-lookup.ts @@ -7,7 +7,7 @@ import type { BTreeMap, BTreeSet, Bytes, Compact, Enum, Null, Option, Result, Struct, Text, U256, U8aFixed, Vec, bool, u128, u16, u32, u64, u8 } from '@polkadot/types-codec'; import type { ITuple } from '@polkadot/types-codec/types'; -import type { AccountId32, Call, H160, H256, MultiAddress, Perbill, Permill } from '@polkadot/types/interfaces/runtime'; +import type { AccountId32, Call, H160, H256, MultiAddress, Perbill, Permill, Weight } from '@polkadot/types/interfaces/runtime'; import type { Event } from '@polkadot/types/interfaces/system'; declare module '@polkadot/types/lookup' { @@ -28,19 +28,19 @@ readonly feeFrozen: u128; } - /** @name FrameSupportWeightsPerDispatchClassU64 (7) */ - interface FrameSupportWeightsPerDispatchClassU64 extends Struct { - readonly normal: u64; - readonly operational: u64; - readonly mandatory: u64; + /** @name FrameSupportWeightsPerDispatchClassWeight (7) */ + interface FrameSupportWeightsPerDispatchClassWeight extends Struct { + readonly normal: Weight; + readonly operational: Weight; + readonly mandatory: Weight; } - /** @name SpRuntimeDigest (11) */ + /** @name SpRuntimeDigest (12) */ interface SpRuntimeDigest extends Struct { readonly logs: Vec; } - /** @name SpRuntimeDigestDigestItem (13) */ + /** @name SpRuntimeDigestDigestItem (14) */ interface SpRuntimeDigestDigestItem extends Enum { readonly isOther: boolean; readonly asOther: Bytes; @@ -54,14 +54,14 @@ readonly type: 'Other' | 'Consensus' | 'Seal' | 'PreRuntime' | 'RuntimeEnvironmentUpdated'; } - /** @name FrameSystemEventRecord (16) */ + /** @name FrameSystemEventRecord (17) */ interface FrameSystemEventRecord extends Struct { readonly phase: FrameSystemPhase; readonly event: Event; readonly topics: Vec; } - /** @name FrameSystemEvent (18) */ + /** @name FrameSystemEvent (19) */ interface FrameSystemEvent extends Enum { readonly isExtrinsicSuccess: boolean; readonly asExtrinsicSuccess: { @@ -89,14 +89,14 @@ readonly type: 'ExtrinsicSuccess' | 'ExtrinsicFailed' | 'CodeUpdated' | 'NewAccount' | 'KilledAccount' | 'Remarked'; } - /** @name FrameSupportWeightsDispatchInfo (19) */ + /** @name FrameSupportWeightsDispatchInfo (20) */ interface FrameSupportWeightsDispatchInfo extends Struct { - readonly weight: u64; + readonly weight: Weight; readonly class: FrameSupportWeightsDispatchClass; readonly paysFee: FrameSupportWeightsPays; } - /** @name FrameSupportWeightsDispatchClass (20) */ + /** @name FrameSupportWeightsDispatchClass (21) */ interface FrameSupportWeightsDispatchClass extends Enum { readonly isNormal: boolean; readonly isOperational: boolean; @@ -104,14 +104,14 @@ readonly type: 'Normal' | 'Operational' | 'Mandatory'; } - /** @name FrameSupportWeightsPays (21) */ + /** @name FrameSupportWeightsPays (22) */ interface FrameSupportWeightsPays extends Enum { readonly isYes: boolean; readonly isNo: boolean; readonly type: 'Yes' | 'No'; } - /** @name SpRuntimeDispatchError (22) */ + /** @name SpRuntimeDispatchError (23) */ interface SpRuntimeDispatchError extends Enum { readonly isOther: boolean; readonly isCannotLookup: boolean; @@ -130,13 +130,13 @@ readonly type: 'Other' | 'CannotLookup' | 'BadOrigin' | 'Module' | 'ConsumerRemaining' | 'NoProviders' | 'TooManyConsumers' | 'Token' | 'Arithmetic' | 'Transactional'; } - /** @name SpRuntimeModuleError (23) */ + /** @name SpRuntimeModuleError (24) */ interface SpRuntimeModuleError extends Struct { readonly index: u8; readonly error: U8aFixed; } - /** @name SpRuntimeTokenError (24) */ + /** @name SpRuntimeTokenError (25) */ interface SpRuntimeTokenError extends Enum { readonly isNoFunds: boolean; readonly isWouldDie: boolean; @@ -148,7 +148,7 @@ readonly type: 'NoFunds' | 'WouldDie' | 'BelowMinimum' | 'CannotCreate' | 'UnknownAsset' | 'Frozen' | 'Unsupported'; } - /** @name SpRuntimeArithmeticError (25) */ + /** @name SpRuntimeArithmeticError (26) */ interface SpRuntimeArithmeticError extends Enum { readonly isUnderflow: boolean; readonly isOverflow: boolean; @@ -156,14 +156,14 @@ readonly type: 'Underflow' | 'Overflow' | 'DivisionByZero'; } - /** @name SpRuntimeTransactionalError (26) */ + /** @name SpRuntimeTransactionalError (27) */ interface SpRuntimeTransactionalError extends Enum { readonly isLimitReached: boolean; readonly isNoLayer: boolean; readonly type: 'LimitReached' | 'NoLayer'; } - /** @name CumulusPalletParachainSystemEvent (27) */ + /** @name CumulusPalletParachainSystemEvent (28) */ interface CumulusPalletParachainSystemEvent extends Enum { readonly isValidationFunctionStored: boolean; readonly isValidationFunctionApplied: boolean; @@ -181,13 +181,13 @@ } & Struct; readonly isDownwardMessagesProcessed: boolean; readonly asDownwardMessagesProcessed: { - readonly weightUsed: u64; + readonly weightUsed: Weight; readonly dmqHead: H256; } & Struct; readonly type: 'ValidationFunctionStored' | 'ValidationFunctionApplied' | 'ValidationFunctionDiscarded' | 'UpgradeAuthorized' | 'DownwardMessagesReceived' | 'DownwardMessagesProcessed'; } - /** @name PalletBalancesEvent (28) */ + /** @name PalletBalancesEvent (29) */ interface PalletBalancesEvent extends Enum { readonly isEndowed: boolean; readonly asEndowed: { @@ -246,14 +246,14 @@ readonly type: 'Endowed' | 'DustLost' | 'Transfer' | 'BalanceSet' | 'Reserved' | 'Unreserved' | 'ReserveRepatriated' | 'Deposit' | 'Withdraw' | 'Slashed'; } - /** @name FrameSupportTokensMiscBalanceStatus (29) */ + /** @name FrameSupportTokensMiscBalanceStatus (30) */ interface FrameSupportTokensMiscBalanceStatus extends Enum { readonly isFree: boolean; readonly isReserved: boolean; readonly type: 'Free' | 'Reserved'; } - /** @name PalletTransactionPaymentEvent (30) */ + /** @name PalletTransactionPaymentEvent (31) */ interface PalletTransactionPaymentEvent extends Enum { readonly isTransactionFeePaid: boolean; readonly asTransactionFeePaid: { @@ -264,7 +264,7 @@ readonly type: 'TransactionFeePaid'; } - /** @name PalletTreasuryEvent (31) */ + /** @name PalletTreasuryEvent (32) */ interface PalletTreasuryEvent extends Enum { readonly isProposed: boolean; readonly asProposed: { @@ -306,7 +306,7 @@ readonly type: 'Proposed' | 'Spending' | 'Awarded' | 'Rejected' | 'Burnt' | 'Rollover' | 'Deposit' | 'SpendApproved'; } - /** @name PalletSudoEvent (32) */ + /** @name PalletSudoEvent (33) */ interface PalletSudoEvent extends Enum { readonly isSudid: boolean; readonly asSudid: { @@ -323,7 +323,7 @@ readonly type: 'Sudid' | 'KeyChanged' | 'SudoAsDone'; } - /** @name OrmlVestingModuleEvent (36) */ + /** @name OrmlVestingModuleEvent (37) */ interface OrmlVestingModuleEvent extends Enum { readonly isVestingScheduleAdded: boolean; readonly asVestingScheduleAdded: { @@ -343,7 +343,7 @@ readonly type: 'VestingScheduleAdded' | 'Claimed' | 'VestingSchedulesUpdated'; } - /** @name OrmlVestingVestingSchedule (37) */ + /** @name OrmlVestingVestingSchedule (38) */ interface OrmlVestingVestingSchedule extends Struct { readonly start: u32; readonly period: u32; @@ -351,7 +351,7 @@ readonly perPeriod: Compact; } - /** @name OrmlXtokensModuleEvent (39) */ + /** @name OrmlXtokensModuleEvent (40) */ interface OrmlXtokensModuleEvent extends Enum { readonly isTransferredMultiAssets: boolean; readonly asTransferredMultiAssets: { @@ -363,16 +363,16 @@ readonly type: 'TransferredMultiAssets'; } - /** @name XcmV1MultiassetMultiAssets (40) */ + /** @name XcmV1MultiassetMultiAssets (41) */ interface XcmV1MultiassetMultiAssets extends Vec {} - /** @name XcmV1MultiAsset (42) */ + /** @name XcmV1MultiAsset (43) */ interface XcmV1MultiAsset extends Struct { readonly id: XcmV1MultiassetAssetId; readonly fun: XcmV1MultiassetFungibility; } - /** @name XcmV1MultiassetAssetId (43) */ + /** @name XcmV1MultiassetAssetId (44) */ interface XcmV1MultiassetAssetId extends Enum { readonly isConcrete: boolean; readonly asConcrete: XcmV1MultiLocation; @@ -381,13 +381,13 @@ readonly type: 'Concrete' | 'Abstract'; } - /** @name XcmV1MultiLocation (44) */ + /** @name XcmV1MultiLocation (45) */ interface XcmV1MultiLocation extends Struct { readonly parents: u8; readonly interior: XcmV1MultilocationJunctions; } - /** @name XcmV1MultilocationJunctions (45) */ + /** @name XcmV1MultilocationJunctions (46) */ interface XcmV1MultilocationJunctions extends Enum { readonly isHere: boolean; readonly isX1: boolean; @@ -409,7 +409,7 @@ readonly type: 'Here' | 'X1' | 'X2' | 'X3' | 'X4' | 'X5' | 'X6' | 'X7' | 'X8'; } - /** @name XcmV1Junction (46) */ + /** @name XcmV1Junction (47) */ interface XcmV1Junction extends Enum { readonly isParachain: boolean; readonly asParachain: Compact; @@ -443,7 +443,7 @@ readonly type: 'Parachain' | 'AccountId32' | 'AccountIndex64' | 'AccountKey20' | 'PalletInstance' | 'GeneralIndex' | 'GeneralKey' | 'OnlyChild' | 'Plurality'; } - /** @name XcmV0JunctionNetworkId (48) */ + /** @name XcmV0JunctionNetworkId (49) */ interface XcmV0JunctionNetworkId extends Enum { readonly isAny: boolean; readonly isNamed: boolean; @@ -453,7 +453,7 @@ readonly type: 'Any' | 'Named' | 'Polkadot' | 'Kusama'; } - /** @name XcmV0JunctionBodyId (52) */ + /** @name XcmV0JunctionBodyId (53) */ interface XcmV0JunctionBodyId extends Enum { readonly isUnit: boolean; readonly isNamed: boolean; @@ -467,7 +467,7 @@ readonly type: 'Unit' | 'Named' | 'Index' | 'Executive' | 'Technical' | 'Legislative' | 'Judicial'; } - /** @name XcmV0JunctionBodyPart (53) */ + /** @name XcmV0JunctionBodyPart (54) */ interface XcmV0JunctionBodyPart extends Enum { readonly isVoice: boolean; readonly isMembers: boolean; @@ -492,7 +492,7 @@ readonly type: 'Voice' | 'Members' | 'Fraction' | 'AtLeastProportion' | 'MoreThanProportion'; } - /** @name XcmV1MultiassetFungibility (54) */ + /** @name XcmV1MultiassetFungibility (55) */ interface XcmV1MultiassetFungibility extends Enum { readonly isFungible: boolean; readonly asFungible: Compact; @@ -501,7 +501,7 @@ readonly type: 'Fungible' | 'NonFungible'; } - /** @name XcmV1MultiassetAssetInstance (55) */ + /** @name XcmV1MultiassetAssetInstance (56) */ interface XcmV1MultiassetAssetInstance extends Enum { readonly isUndefined: boolean; readonly isIndex: boolean; @@ -519,7 +519,7 @@ readonly type: 'Undefined' | 'Index' | 'Array4' | 'Array8' | 'Array16' | 'Array32' | 'Blob'; } - /** @name OrmlTokensModuleEvent (58) */ + /** @name OrmlTokensModuleEvent (59) */ interface OrmlTokensModuleEvent extends Enum { readonly isEndowed: boolean; readonly asEndowed: { @@ -607,7 +607,7 @@ readonly type: 'Endowed' | 'DustLost' | 'Transfer' | 'Reserved' | 'Unreserved' | 'ReserveRepatriated' | 'BalanceSet' | 'TotalIssuanceSet' | 'Withdrawn' | 'Slashed' | 'Deposited' | 'LockSet' | 'LockRemoved'; } - /** @name PalletForeignAssetsAssetIds (59) */ + /** @name PalletForeignAssetsAssetIds (60) */ interface PalletForeignAssetsAssetIds extends Enum { readonly isForeignAssetId: boolean; readonly asForeignAssetId: u32; @@ -616,25 +616,25 @@ readonly type: 'ForeignAssetId' | 'NativeAssetId'; } - /** @name PalletForeignAssetsNativeCurrency (60) */ + /** @name PalletForeignAssetsNativeCurrency (61) */ interface PalletForeignAssetsNativeCurrency extends Enum { readonly isHere: boolean; readonly isParent: boolean; readonly type: 'Here' | 'Parent'; } - /** @name CumulusPalletXcmpQueueEvent (61) */ + /** @name CumulusPalletXcmpQueueEvent (62) */ interface CumulusPalletXcmpQueueEvent extends Enum { readonly isSuccess: boolean; readonly asSuccess: { readonly messageHash: Option; - readonly weight: u64; + readonly weight: Weight; } & Struct; readonly isFail: boolean; readonly asFail: { readonly messageHash: Option; readonly error: XcmV2TraitsError; - readonly weight: u64; + readonly weight: Weight; } & Struct; readonly isBadVersion: boolean; readonly asBadVersion: { @@ -657,17 +657,17 @@ readonly sender: u32; readonly sentAt: u32; readonly index: u64; - readonly required: u64; + readonly required: Weight; } & Struct; readonly isOverweightServiced: boolean; readonly asOverweightServiced: { readonly index: u64; - readonly used: u64; + readonly used: Weight; } & Struct; readonly type: 'Success' | 'Fail' | 'BadVersion' | 'BadFormat' | 'UpwardMessageSent' | 'XcmpMessageSent' | 'OverweightEnqueued' | 'OverweightServiced'; } - /** @name XcmV2TraitsError (63) */ + /** @name XcmV2TraitsError (64) */ interface XcmV2TraitsError extends Enum { readonly isOverflow: boolean; readonly isUnimplemented: boolean; @@ -700,7 +700,7 @@ readonly type: 'Overflow' | 'Unimplemented' | 'UntrustedReserveLocation' | 'UntrustedTeleportLocation' | 'MultiLocationFull' | 'MultiLocationNotInvertible' | 'BadOrigin' | 'InvalidLocation' | 'AssetNotFound' | 'FailedToTransactAsset' | 'NotWithdrawable' | 'LocationCannotHold' | 'ExceedsMaxMessageSize' | 'DestinationUnsupported' | 'Transport' | 'Unroutable' | 'UnknownClaim' | 'FailedToDecode' | 'MaxWeightInvalid' | 'NotHoldingFees' | 'TooExpensive' | 'Trap' | 'UnhandledXcmVersion' | 'WeightLimitReached' | 'Barrier' | 'WeightNotComputable'; } - /** @name PalletXcmEvent (65) */ + /** @name PalletXcmEvent (66) */ interface PalletXcmEvent extends Enum { readonly isAttempted: boolean; readonly asAttempted: XcmV2TraitsOutcome; @@ -713,7 +713,7 @@ readonly isNotified: boolean; readonly asNotified: ITuple<[u64, u8, u8]>; readonly isNotifyOverweight: boolean; - readonly asNotifyOverweight: ITuple<[u64, u8, u8, u64, u64]>; + readonly asNotifyOverweight: ITuple<[u64, u8, u8, Weight, Weight]>; readonly isNotifyDispatchError: boolean; readonly asNotifyDispatchError: ITuple<[u64, u8, u8]>; readonly isNotifyDecodeFailed: boolean; @@ -737,7 +737,7 @@ readonly type: 'Attempted' | 'Sent' | 'UnexpectedResponse' | 'ResponseReady' | 'Notified' | 'NotifyOverweight' | 'NotifyDispatchError' | 'NotifyDecodeFailed' | 'InvalidResponder' | 'InvalidResponderVersion' | 'ResponseTaken' | 'AssetsTrapped' | 'VersionChangeNotified' | 'SupportedVersionChanged' | 'NotifyTargetSendFail' | 'NotifyTargetMigrationFail'; } - /** @name XcmV2TraitsOutcome (66) */ + /** @name XcmV2TraitsOutcome (67) */ interface XcmV2TraitsOutcome extends Enum { readonly isComplete: boolean; readonly asComplete: u64; @@ -748,10 +748,10 @@ readonly type: 'Complete' | 'Incomplete' | 'Error'; } - /** @name XcmV2Xcm (67) */ + /** @name XcmV2Xcm (68) */ interface XcmV2Xcm extends Vec {} - /** @name XcmV2Instruction (69) */ + /** @name XcmV2Instruction (70) */ interface XcmV2Instruction extends Enum { readonly isWithdrawAsset: boolean; readonly asWithdrawAsset: XcmV1MultiassetMultiAssets; @@ -871,7 +871,7 @@ readonly type: 'WithdrawAsset' | 'ReserveAssetDeposited' | 'ReceiveTeleportedAsset' | 'QueryResponse' | 'TransferAsset' | 'TransferReserveAsset' | 'Transact' | 'HrmpNewChannelOpenRequest' | 'HrmpChannelAccepted' | 'HrmpChannelClosing' | 'ClearOrigin' | 'DescendOrigin' | 'ReportError' | 'DepositAsset' | 'DepositReserveAsset' | 'ExchangeAsset' | 'InitiateReserveWithdraw' | 'InitiateTeleport' | 'QueryHolding' | 'BuyExecution' | 'RefundSurplus' | 'SetErrorHandler' | 'SetAppendix' | 'ClearError' | 'ClaimAsset' | 'Trap' | 'SubscribeVersion' | 'UnsubscribeVersion'; } - /** @name XcmV2Response (70) */ + /** @name XcmV2Response (71) */ interface XcmV2Response extends Enum { readonly isNull: boolean; readonly isAssets: boolean; @@ -883,7 +883,7 @@ readonly type: 'Null' | 'Assets' | 'ExecutionResult' | 'Version'; } - /** @name XcmV0OriginKind (73) */ + /** @name XcmV0OriginKind (74) */ interface XcmV0OriginKind extends Enum { readonly isNative: boolean; readonly isSovereignAccount: boolean; @@ -892,12 +892,12 @@ readonly type: 'Native' | 'SovereignAccount' | 'Superuser' | 'Xcm'; } - /** @name XcmDoubleEncoded (74) */ + /** @name XcmDoubleEncoded (75) */ interface XcmDoubleEncoded extends Struct { readonly encoded: Bytes; } - /** @name XcmV1MultiassetMultiAssetFilter (75) */ + /** @name XcmV1MultiassetMultiAssetFilter (76) */ interface XcmV1MultiassetMultiAssetFilter extends Enum { readonly isDefinite: boolean; readonly asDefinite: XcmV1MultiassetMultiAssets; @@ -906,7 +906,7 @@ readonly type: 'Definite' | 'Wild'; } - /** @name XcmV1MultiassetWildMultiAsset (76) */ + /** @name XcmV1MultiassetWildMultiAsset (77) */ interface XcmV1MultiassetWildMultiAsset extends Enum { readonly isAll: boolean; readonly isAllOf: boolean; @@ -917,14 +917,14 @@ readonly type: 'All' | 'AllOf'; } - /** @name XcmV1MultiassetWildFungibility (77) */ + /** @name XcmV1MultiassetWildFungibility (78) */ interface XcmV1MultiassetWildFungibility extends Enum { readonly isFungible: boolean; readonly isNonFungible: boolean; readonly type: 'Fungible' | 'NonFungible'; } - /** @name XcmV2WeightLimit (78) */ + /** @name XcmV2WeightLimit (79) */ interface XcmV2WeightLimit extends Enum { readonly isUnlimited: boolean; readonly isLimited: boolean; @@ -932,7 +932,7 @@ readonly type: 'Unlimited' | 'Limited'; } - /** @name XcmVersionedMultiAssets (80) */ + /** @name XcmVersionedMultiAssets (81) */ interface XcmVersionedMultiAssets extends Enum { readonly isV0: boolean; readonly asV0: Vec; @@ -941,7 +941,7 @@ readonly type: 'V0' | 'V1'; } - /** @name XcmV0MultiAsset (82) */ + /** @name XcmV0MultiAsset (83) */ interface XcmV0MultiAsset extends Enum { readonly isNone: boolean; readonly isAll: boolean; @@ -986,7 +986,7 @@ readonly type: 'None' | 'All' | 'AllFungible' | 'AllNonFungible' | 'AllAbstractFungible' | 'AllAbstractNonFungible' | 'AllConcreteFungible' | 'AllConcreteNonFungible' | 'AbstractFungible' | 'AbstractNonFungible' | 'ConcreteFungible' | 'ConcreteNonFungible'; } - /** @name XcmV0MultiLocation (83) */ + /** @name XcmV0MultiLocation (84) */ interface XcmV0MultiLocation extends Enum { readonly isNull: boolean; readonly isX1: boolean; @@ -1008,7 +1008,7 @@ readonly type: 'Null' | 'X1' | 'X2' | 'X3' | 'X4' | 'X5' | 'X6' | 'X7' | 'X8'; } - /** @name XcmV0Junction (84) */ + /** @name XcmV0Junction (85) */ interface XcmV0Junction extends Enum { readonly isParent: boolean; readonly isParachain: boolean; @@ -1043,7 +1043,7 @@ readonly type: 'Parent' | 'Parachain' | 'AccountId32' | 'AccountIndex64' | 'AccountKey20' | 'PalletInstance' | 'GeneralIndex' | 'GeneralKey' | 'OnlyChild' | 'Plurality'; } - /** @name XcmVersionedMultiLocation (85) */ + /** @name XcmVersionedMultiLocation (86) */ interface XcmVersionedMultiLocation extends Enum { readonly isV0: boolean; readonly asV0: XcmV0MultiLocation; @@ -1052,7 +1052,7 @@ readonly type: 'V0' | 'V1'; } - /** @name CumulusPalletXcmEvent (86) */ + /** @name CumulusPalletXcmEvent (87) */ interface CumulusPalletXcmEvent extends Enum { readonly isInvalidFormat: boolean; readonly asInvalidFormat: U8aFixed; @@ -1063,7 +1063,7 @@ readonly type: 'InvalidFormat' | 'UnsupportedVersion' | 'ExecutedDownward'; } - /** @name CumulusPalletDmpQueueEvent (87) */ + /** @name CumulusPalletDmpQueueEvent (88) */ interface CumulusPalletDmpQueueEvent extends Enum { readonly isInvalidFormat: boolean; readonly asInvalidFormat: { @@ -1081,24 +1081,24 @@ readonly isWeightExhausted: boolean; readonly asWeightExhausted: { readonly messageId: U8aFixed; - readonly remainingWeight: u64; - readonly requiredWeight: u64; + readonly remainingWeight: Weight; + readonly requiredWeight: Weight; } & Struct; readonly isOverweightEnqueued: boolean; readonly asOverweightEnqueued: { readonly messageId: U8aFixed; readonly overweightIndex: u64; - readonly requiredWeight: u64; + readonly requiredWeight: Weight; } & Struct; readonly isOverweightServiced: boolean; readonly asOverweightServiced: { readonly overweightIndex: u64; - readonly weightUsed: u64; + readonly weightUsed: Weight; } & Struct; readonly type: 'InvalidFormat' | 'UnsupportedVersion' | 'ExecutedDownward' | 'WeightExhausted' | 'OverweightEnqueued' | 'OverweightServiced'; } - /** @name PalletUniqueRawEvent (88) */ + /** @name PalletUniqueRawEvent (89) */ interface PalletUniqueRawEvent extends Enum { readonly isCollectionSponsorRemoved: boolean; readonly asCollectionSponsorRemoved: u32; @@ -1123,7 +1123,7 @@ readonly type: 'CollectionSponsorRemoved' | 'CollectionAdminAdded' | 'CollectionOwnedChanged' | 'CollectionSponsorSet' | 'SponsorshipConfirmed' | 'CollectionAdminRemoved' | 'AllowListAddressRemoved' | 'AllowListAddressAdded' | 'CollectionLimitSet' | 'CollectionPermissionSet'; } - /** @name PalletEvmAccountBasicCrossAccountIdRepr (89) */ + /** @name PalletEvmAccountBasicCrossAccountIdRepr (90) */ interface PalletEvmAccountBasicCrossAccountIdRepr extends Enum { readonly isSubstrate: boolean; readonly asSubstrate: AccountId32; @@ -1132,7 +1132,7 @@ readonly type: 'Substrate' | 'Ethereum'; } - /** @name PalletUniqueSchedulerEvent (92) */ + /** @name PalletUniqueSchedulerEvent (93) */ interface PalletUniqueSchedulerEvent extends Enum { readonly isScheduled: boolean; readonly asScheduled: { @@ -1159,14 +1159,14 @@ readonly type: 'Scheduled' | 'Canceled' | 'Dispatched' | 'CallLookupFailed'; } - /** @name FrameSupportScheduleLookupError (95) */ + /** @name FrameSupportScheduleLookupError (96) */ interface FrameSupportScheduleLookupError extends Enum { readonly isUnknown: boolean; readonly isBadFormat: boolean; readonly type: 'Unknown' | 'BadFormat'; } - /** @name PalletCommonEvent (96) */ + /** @name PalletCommonEvent (97) */ interface PalletCommonEvent extends Enum { readonly isCollectionCreated: boolean; readonly asCollectionCreated: ITuple<[u32, u8, AccountId32]>; @@ -1193,14 +1193,14 @@ readonly type: 'CollectionCreated' | 'CollectionDestroyed' | 'ItemCreated' | 'ItemDestroyed' | 'Transfer' | 'Approved' | 'CollectionPropertySet' | 'CollectionPropertyDeleted' | 'TokenPropertySet' | 'TokenPropertyDeleted' | 'PropertyPermissionSet'; } - /** @name PalletStructureEvent (99) */ + /** @name PalletStructureEvent (100) */ interface PalletStructureEvent extends Enum { readonly isExecuted: boolean; readonly asExecuted: Result; readonly type: 'Executed'; } - /** @name PalletRmrkCoreEvent (100) */ + /** @name PalletRmrkCoreEvent (101) */ interface PalletRmrkCoreEvent extends Enum { readonly isCollectionCreated: boolean; readonly asCollectionCreated: { @@ -1290,7 +1290,7 @@ readonly type: 'CollectionCreated' | 'CollectionDestroyed' | 'IssuerChanged' | 'CollectionLocked' | 'NftMinted' | 'NftBurned' | 'NftSent' | 'NftAccepted' | 'NftRejected' | 'PropertySet' | 'ResourceAdded' | 'ResourceRemoval' | 'ResourceAccepted' | 'ResourceRemovalAccepted' | 'PrioritySet'; } - /** @name RmrkTraitsNftAccountIdOrCollectionNftTuple (101) */ + /** @name RmrkTraitsNftAccountIdOrCollectionNftTuple (102) */ interface RmrkTraitsNftAccountIdOrCollectionNftTuple extends Enum { readonly isAccountId: boolean; readonly asAccountId: AccountId32; @@ -1299,7 +1299,7 @@ readonly type: 'AccountId' | 'CollectionAndNftTuple'; } - /** @name PalletRmrkEquipEvent (106) */ + /** @name PalletRmrkEquipEvent (107) */ interface PalletRmrkEquipEvent extends Enum { readonly isBaseCreated: boolean; readonly asBaseCreated: { @@ -1314,7 +1314,7 @@ readonly type: 'BaseCreated' | 'EquippablesUpdated'; } - /** @name PalletAppPromotionEvent (107) */ + /** @name PalletAppPromotionEvent (108) */ interface PalletAppPromotionEvent extends Enum { readonly isStakingRecalculation: boolean; readonly asStakingRecalculation: ITuple<[AccountId32, u128, u128]>; @@ -1327,7 +1327,7 @@ readonly type: 'StakingRecalculation' | 'Stake' | 'Unstake' | 'SetAdmin'; } - /** @name PalletForeignAssetsModuleEvent (108) */ + /** @name PalletForeignAssetsModuleEvent (109) */ interface PalletForeignAssetsModuleEvent extends Enum { readonly isForeignAssetRegistered: boolean; readonly asForeignAssetRegistered: { @@ -1354,7 +1354,7 @@ readonly type: 'ForeignAssetRegistered' | 'ForeignAssetUpdated' | 'AssetRegistered' | 'AssetUpdated'; } - /** @name PalletForeignAssetsModuleAssetMetadata (109) */ + /** @name PalletForeignAssetsModuleAssetMetadata (110) */ interface PalletForeignAssetsModuleAssetMetadata extends Struct { readonly name: Bytes; readonly symbol: Bytes; @@ -1362,7 +1362,7 @@ readonly minimalBalance: u128; } - /** @name PalletEvmEvent (110) */ + /** @name PalletEvmEvent (111) */ interface PalletEvmEvent extends Enum { readonly isLog: boolean; readonly asLog: EthereumLog; @@ -1381,21 +1381,21 @@ readonly type: 'Log' | 'Created' | 'CreatedFailed' | 'Executed' | 'ExecutedFailed' | 'BalanceDeposit' | 'BalanceWithdraw'; } - /** @name EthereumLog (111) */ + /** @name EthereumLog (112) */ interface EthereumLog extends Struct { readonly address: H160; readonly topics: Vec; readonly data: Bytes; } - /** @name PalletEthereumEvent (115) */ + /** @name PalletEthereumEvent (116) */ interface PalletEthereumEvent extends Enum { readonly isExecuted: boolean; readonly asExecuted: ITuple<[H160, H160, H256, EvmCoreErrorExitReason]>; readonly type: 'Executed'; } - /** @name EvmCoreErrorExitReason (116) */ + /** @name EvmCoreErrorExitReason (117) */ interface EvmCoreErrorExitReason extends Enum { readonly isSucceed: boolean; readonly asSucceed: EvmCoreErrorExitSucceed; @@ -1408,7 +1408,7 @@ readonly type: 'Succeed' | 'Error' | 'Revert' | 'Fatal'; } - /** @name EvmCoreErrorExitSucceed (117) */ + /** @name EvmCoreErrorExitSucceed (118) */ interface EvmCoreErrorExitSucceed extends Enum { readonly isStopped: boolean; readonly isReturned: boolean; @@ -1416,7 +1416,7 @@ readonly type: 'Stopped' | 'Returned' | 'Suicided'; } - /** @name EvmCoreErrorExitError (118) */ + /** @name EvmCoreErrorExitError (119) */ interface EvmCoreErrorExitError extends Enum { readonly isStackUnderflow: boolean; readonly isStackOverflow: boolean; @@ -1437,13 +1437,13 @@ readonly type: 'StackUnderflow' | 'StackOverflow' | 'InvalidJump' | 'InvalidRange' | 'DesignatedInvalid' | 'CallTooDeep' | 'CreateCollision' | 'CreateContractLimit' | 'OutOfOffset' | 'OutOfGas' | 'OutOfFund' | 'PcUnderflow' | 'CreateEmpty' | 'Other' | 'InvalidCode'; } - /** @name EvmCoreErrorExitRevert (121) */ + /** @name EvmCoreErrorExitRevert (122) */ interface EvmCoreErrorExitRevert extends Enum { readonly isReverted: boolean; readonly type: 'Reverted'; } - /** @name EvmCoreErrorExitFatal (122) */ + /** @name EvmCoreErrorExitFatal (123) */ interface EvmCoreErrorExitFatal extends Enum { readonly isNotSupported: boolean; readonly isUnhandledInterrupt: boolean; @@ -1454,7 +1454,7 @@ readonly type: 'NotSupported' | 'UnhandledInterrupt' | 'CallErrorAsFatal' | 'Other'; } - /** @name PalletEvmContractHelpersEvent (123) */ + /** @name PalletEvmContractHelpersEvent (124) */ interface PalletEvmContractHelpersEvent extends Enum { readonly isContractSponsorSet: boolean; readonly asContractSponsorSet: ITuple<[H160, AccountId32]>; @@ -1465,7 +1465,7 @@ readonly type: 'ContractSponsorSet' | 'ContractSponsorshipConfirmed' | 'ContractSponsorRemoved'; } - /** @name FrameSystemPhase (124) */ + /** @name FrameSystemPhase (125) */ interface FrameSystemPhase extends Enum { readonly isApplyExtrinsic: boolean; readonly asApplyExtrinsic: u32; @@ -1474,13 +1474,13 @@ readonly type: 'ApplyExtrinsic' | 'Finalization' | 'Initialization'; } - /** @name FrameSystemLastRuntimeUpgradeInfo (126) */ + /** @name FrameSystemLastRuntimeUpgradeInfo (127) */ interface FrameSystemLastRuntimeUpgradeInfo extends Struct { readonly specVersion: Compact; readonly specName: Text; } - /** @name FrameSystemCall (127) */ + /** @name FrameSystemCall (128) */ interface FrameSystemCall extends Enum { readonly isFillBlock: boolean; readonly asFillBlock: { @@ -1522,47 +1522,47 @@ readonly type: 'FillBlock' | 'Remark' | 'SetHeapPages' | 'SetCode' | 'SetCodeWithoutChecks' | 'SetStorage' | 'KillStorage' | 'KillPrefix' | 'RemarkWithEvent'; } - /** @name FrameSystemLimitsBlockWeights (132) */ + /** @name FrameSystemLimitsBlockWeights (133) */ interface FrameSystemLimitsBlockWeights extends Struct { - readonly baseBlock: u64; - readonly maxBlock: u64; + readonly baseBlock: Weight; + readonly maxBlock: Weight; readonly perClass: FrameSupportWeightsPerDispatchClassWeightsPerClass; } - /** @name FrameSupportWeightsPerDispatchClassWeightsPerClass (133) */ + /** @name FrameSupportWeightsPerDispatchClassWeightsPerClass (134) */ interface FrameSupportWeightsPerDispatchClassWeightsPerClass extends Struct { readonly normal: FrameSystemLimitsWeightsPerClass; readonly operational: FrameSystemLimitsWeightsPerClass; readonly mandatory: FrameSystemLimitsWeightsPerClass; } - /** @name FrameSystemLimitsWeightsPerClass (134) */ + /** @name FrameSystemLimitsWeightsPerClass (135) */ interface FrameSystemLimitsWeightsPerClass extends Struct { - readonly baseExtrinsic: u64; - readonly maxExtrinsic: Option; - readonly maxTotal: Option; - readonly reserved: Option; + readonly baseExtrinsic: Weight; + readonly maxExtrinsic: Option; + readonly maxTotal: Option; + readonly reserved: Option; } - /** @name FrameSystemLimitsBlockLength (136) */ + /** @name FrameSystemLimitsBlockLength (137) */ interface FrameSystemLimitsBlockLength extends Struct { readonly max: FrameSupportWeightsPerDispatchClassU32; } - /** @name FrameSupportWeightsPerDispatchClassU32 (137) */ + /** @name FrameSupportWeightsPerDispatchClassU32 (138) */ interface FrameSupportWeightsPerDispatchClassU32 extends Struct { readonly normal: u32; readonly operational: u32; readonly mandatory: u32; } - /** @name FrameSupportWeightsRuntimeDbWeight (138) */ + /** @name FrameSupportWeightsRuntimeDbWeight (139) */ interface FrameSupportWeightsRuntimeDbWeight extends Struct { readonly read: u64; readonly write: u64; } - /** @name SpVersionRuntimeVersion (139) */ + /** @name SpVersionRuntimeVersion (140) */ interface SpVersionRuntimeVersion extends Struct { readonly specName: Text; readonly implName: Text; @@ -1574,7 +1574,7 @@ readonly stateVersion: u8; } - /** @name FrameSystemError (144) */ + /** @name FrameSystemError (145) */ interface FrameSystemError extends Enum { readonly isInvalidSpecName: boolean; readonly isSpecVersionNeedsToIncrease: boolean; @@ -1585,7 +1585,7 @@ readonly type: 'InvalidSpecName' | 'SpecVersionNeedsToIncrease' | 'FailedToExtractRuntimeVersion' | 'NonDefaultComposite' | 'NonZeroRefCount' | 'CallFiltered'; } - /** @name PolkadotPrimitivesV2PersistedValidationData (145) */ + /** @name PolkadotPrimitivesV2PersistedValidationData (146) */ interface PolkadotPrimitivesV2PersistedValidationData extends Struct { readonly parentHead: Bytes; readonly relayParentNumber: u32; @@ -1593,18 +1593,18 @@ readonly maxPovSize: u32; } - /** @name PolkadotPrimitivesV2UpgradeRestriction (148) */ + /** @name PolkadotPrimitivesV2UpgradeRestriction (149) */ interface PolkadotPrimitivesV2UpgradeRestriction extends Enum { readonly isPresent: boolean; readonly type: 'Present'; } - /** @name SpTrieStorageProof (149) */ + /** @name SpTrieStorageProof (150) */ interface SpTrieStorageProof extends Struct { readonly trieNodes: BTreeSet; } - /** @name CumulusPalletParachainSystemRelayStateSnapshotMessagingStateSnapshot (151) */ + /** @name CumulusPalletParachainSystemRelayStateSnapshotMessagingStateSnapshot (152) */ interface CumulusPalletParachainSystemRelayStateSnapshotMessagingStateSnapshot extends Struct { readonly dmqMqcHead: H256; readonly relayDispatchQueueSize: ITuple<[u32, u32]>; @@ -1612,7 +1612,7 @@ readonly egressChannels: Vec>; } - /** @name PolkadotPrimitivesV2AbridgedHrmpChannel (154) */ + /** @name PolkadotPrimitivesV2AbridgedHrmpChannel (155) */ interface PolkadotPrimitivesV2AbridgedHrmpChannel extends Struct { readonly maxCapacity: u32; readonly maxTotalSize: u32; @@ -1622,7 +1622,7 @@ readonly mqcHead: Option; } - /** @name PolkadotPrimitivesV2AbridgedHostConfiguration (155) */ + /** @name PolkadotPrimitivesV2AbridgedHostConfiguration (156) */ interface PolkadotPrimitivesV2AbridgedHostConfiguration extends Struct { readonly maxCodeSize: u32; readonly maxHeadDataSize: u32; @@ -1635,13 +1635,13 @@ readonly validationUpgradeDelay: u32; } - /** @name PolkadotCorePrimitivesOutboundHrmpMessage (161) */ + /** @name PolkadotCorePrimitivesOutboundHrmpMessage (162) */ interface PolkadotCorePrimitivesOutboundHrmpMessage extends Struct { readonly recipient: u32; readonly data: Bytes; } - /** @name CumulusPalletParachainSystemCall (162) */ + /** @name CumulusPalletParachainSystemCall (163) */ interface CumulusPalletParachainSystemCall extends Enum { readonly isSetValidationData: boolean; readonly asSetValidationData: { @@ -1662,7 +1662,7 @@ readonly type: 'SetValidationData' | 'SudoSendUpwardMessage' | 'AuthorizeUpgrade' | 'EnactAuthorizedUpgrade'; } - /** @name CumulusPrimitivesParachainInherentParachainInherentData (163) */ + /** @name CumulusPrimitivesParachainInherentParachainInherentData (164) */ interface CumulusPrimitivesParachainInherentParachainInherentData extends Struct { readonly validationData: PolkadotPrimitivesV2PersistedValidationData; readonly relayChainState: SpTrieStorageProof; @@ -1670,19 +1670,19 @@ readonly horizontalMessages: BTreeMap>; } - /** @name PolkadotCorePrimitivesInboundDownwardMessage (165) */ + /** @name PolkadotCorePrimitivesInboundDownwardMessage (166) */ interface PolkadotCorePrimitivesInboundDownwardMessage extends Struct { readonly sentAt: u32; readonly msg: Bytes; } - /** @name PolkadotCorePrimitivesInboundHrmpMessage (168) */ + /** @name PolkadotCorePrimitivesInboundHrmpMessage (169) */ interface PolkadotCorePrimitivesInboundHrmpMessage extends Struct { readonly sentAt: u32; readonly data: Bytes; } - /** @name CumulusPalletParachainSystemError (171) */ + /** @name CumulusPalletParachainSystemError (172) */ interface CumulusPalletParachainSystemError extends Enum { readonly isOverlappingUpgrades: boolean; readonly isProhibitedByPolkadot: boolean; @@ -1695,14 +1695,14 @@ readonly type: 'OverlappingUpgrades' | 'ProhibitedByPolkadot' | 'TooBig' | 'ValidationDataNotAvailable' | 'HostConfigurationNotAvailable' | 'NotScheduled' | 'NothingAuthorized' | 'Unauthorized'; } - /** @name PalletBalancesBalanceLock (173) */ + /** @name PalletBalancesBalanceLock (174) */ interface PalletBalancesBalanceLock extends Struct { readonly id: U8aFixed; readonly amount: u128; readonly reasons: PalletBalancesReasons; } - /** @name PalletBalancesReasons (174) */ + /** @name PalletBalancesReasons (175) */ interface PalletBalancesReasons extends Enum { readonly isFee: boolean; readonly isMisc: boolean; @@ -1710,20 +1710,20 @@ readonly type: 'Fee' | 'Misc' | 'All'; } - /** @name PalletBalancesReserveData (177) */ + /** @name PalletBalancesReserveData (178) */ interface PalletBalancesReserveData extends Struct { readonly id: U8aFixed; readonly amount: u128; } - /** @name PalletBalancesReleases (179) */ + /** @name PalletBalancesReleases (180) */ interface PalletBalancesReleases extends Enum { readonly isV100: boolean; readonly isV200: boolean; readonly type: 'V100' | 'V200'; } - /** @name PalletBalancesCall (180) */ + /** @name PalletBalancesCall (181) */ interface PalletBalancesCall extends Enum { readonly isTransfer: boolean; readonly asTransfer: { @@ -1760,7 +1760,7 @@ readonly type: 'Transfer' | 'SetBalance' | 'ForceTransfer' | 'TransferKeepAlive' | 'TransferAll' | 'ForceUnreserve'; } - /** @name PalletBalancesError (183) */ + /** @name PalletBalancesError (184) */ interface PalletBalancesError extends Enum { readonly isVestingBalance: boolean; readonly isLiquidityRestrictions: boolean; @@ -1773,7 +1773,7 @@ readonly type: 'VestingBalance' | 'LiquidityRestrictions' | 'InsufficientBalance' | 'ExistentialDeposit' | 'KeepAlive' | 'ExistingVestingSchedule' | 'DeadAccount' | 'TooManyReserves'; } - /** @name PalletTimestampCall (185) */ + /** @name PalletTimestampCall (186) */ interface PalletTimestampCall extends Enum { readonly isSet: boolean; readonly asSet: { @@ -1782,14 +1782,14 @@ readonly type: 'Set'; } - /** @name PalletTransactionPaymentReleases (187) */ + /** @name PalletTransactionPaymentReleases (188) */ interface PalletTransactionPaymentReleases extends Enum { readonly isV1Ancient: boolean; readonly isV2: boolean; readonly type: 'V1Ancient' | 'V2'; } - /** @name PalletTreasuryProposal (188) */ + /** @name PalletTreasuryProposal (189) */ interface PalletTreasuryProposal extends Struct { readonly proposer: AccountId32; readonly value: u128; @@ -1797,7 +1797,7 @@ readonly bond: u128; } - /** @name PalletTreasuryCall (191) */ + /** @name PalletTreasuryCall (192) */ interface PalletTreasuryCall extends Enum { readonly isProposeSpend: boolean; readonly asProposeSpend: { @@ -1824,10 +1824,10 @@ readonly type: 'ProposeSpend' | 'RejectProposal' | 'ApproveProposal' | 'Spend' | 'RemoveApproval'; } - /** @name FrameSupportPalletId (194) */ + /** @name FrameSupportPalletId (195) */ interface FrameSupportPalletId extends U8aFixed {} - /** @name PalletTreasuryError (195) */ + /** @name PalletTreasuryError (196) */ interface PalletTreasuryError extends Enum { readonly isInsufficientProposersBalance: boolean; readonly isInvalidIndex: boolean; @@ -1837,7 +1837,7 @@ readonly type: 'InsufficientProposersBalance' | 'InvalidIndex' | 'TooManyApprovals' | 'InsufficientPermission' | 'ProposalNotApproved'; } - /** @name PalletSudoCall (196) */ + /** @name PalletSudoCall (197) */ interface PalletSudoCall extends Enum { readonly isSudo: boolean; readonly asSudo: { @@ -1846,7 +1846,7 @@ readonly isSudoUncheckedWeight: boolean; readonly asSudoUncheckedWeight: { readonly call: Call; - readonly weight: u64; + readonly weight: Weight; } & Struct; readonly isSetKey: boolean; readonly asSetKey: { @@ -1860,7 +1860,7 @@ readonly type: 'Sudo' | 'SudoUncheckedWeight' | 'SetKey' | 'SudoAs'; } - /** @name OrmlVestingModuleCall (198) */ + /** @name OrmlVestingModuleCall (199) */ interface OrmlVestingModuleCall extends Enum { readonly isClaim: boolean; readonly isVestedTransfer: boolean; @@ -1880,7 +1880,7 @@ readonly type: 'Claim' | 'VestedTransfer' | 'UpdateVestingSchedules' | 'ClaimFor'; } - /** @name OrmlXtokensModuleCall (200) */ + /** @name OrmlXtokensModuleCall (201) */ interface OrmlXtokensModuleCall extends Enum { readonly isTransfer: boolean; readonly asTransfer: { @@ -1927,7 +1927,7 @@ readonly type: 'Transfer' | 'TransferMultiasset' | 'TransferWithFee' | 'TransferMultiassetWithFee' | 'TransferMulticurrencies' | 'TransferMultiassets'; } - /** @name XcmVersionedMultiAsset (201) */ + /** @name XcmVersionedMultiAsset (202) */ interface XcmVersionedMultiAsset extends Enum { readonly isV0: boolean; readonly asV0: XcmV0MultiAsset; @@ -1936,7 +1936,7 @@ readonly type: 'V0' | 'V1'; } - /** @name OrmlTokensModuleCall (204) */ + /** @name OrmlTokensModuleCall (205) */ interface OrmlTokensModuleCall extends Enum { readonly isTransfer: boolean; readonly asTransfer: { @@ -1973,12 +1973,12 @@ readonly type: 'Transfer' | 'TransferAll' | 'TransferKeepAlive' | 'ForceTransfer' | 'SetBalance'; } - /** @name CumulusPalletXcmpQueueCall (205) */ + /** @name CumulusPalletXcmpQueueCall (206) */ interface CumulusPalletXcmpQueueCall extends Enum { readonly isServiceOverweight: boolean; readonly asServiceOverweight: { readonly index: u64; - readonly weightLimit: u64; + readonly weightLimit: Weight; } & Struct; readonly isSuspendXcmExecution: boolean; readonly isResumeXcmExecution: boolean; @@ -1996,20 +1996,20 @@ } & Struct; readonly isUpdateThresholdWeight: boolean; readonly asUpdateThresholdWeight: { - readonly new_: u64; + readonly new_: Weight; } & Struct; readonly isUpdateWeightRestrictDecay: boolean; readonly asUpdateWeightRestrictDecay: { - readonly new_: u64; + readonly new_: Weight; } & Struct; readonly isUpdateXcmpMaxIndividualWeight: boolean; readonly asUpdateXcmpMaxIndividualWeight: { - readonly new_: u64; + readonly new_: Weight; } & Struct; readonly type: 'ServiceOverweight' | 'SuspendXcmExecution' | 'ResumeXcmExecution' | 'UpdateSuspendThreshold' | 'UpdateDropThreshold' | 'UpdateResumeThreshold' | 'UpdateThresholdWeight' | 'UpdateWeightRestrictDecay' | 'UpdateXcmpMaxIndividualWeight'; } - /** @name PalletXcmCall (206) */ + /** @name PalletXcmCall (207) */ interface PalletXcmCall extends Enum { readonly isSend: boolean; readonly asSend: { @@ -2033,7 +2033,7 @@ readonly isExecute: boolean; readonly asExecute: { readonly message: XcmVersionedXcm; - readonly maxWeight: u64; + readonly maxWeight: Weight; } & Struct; readonly isForceXcmVersion: boolean; readonly asForceXcmVersion: { @@ -2071,7 +2071,7 @@ readonly type: 'Send' | 'TeleportAssets' | 'ReserveTransferAssets' | 'Execute' | 'ForceXcmVersion' | 'ForceDefaultXcmVersion' | 'ForceSubscribeVersionNotify' | 'ForceUnsubscribeVersionNotify' | 'LimitedReserveTransferAssets' | 'LimitedTeleportAssets'; } - /** @name XcmVersionedXcm (207) */ + /** @name XcmVersionedXcm (208) */ interface XcmVersionedXcm extends Enum { readonly isV0: boolean; readonly asV0: XcmV0Xcm; @@ -2082,7 +2082,7 @@ readonly type: 'V0' | 'V1' | 'V2'; } - /** @name XcmV0Xcm (208) */ + /** @name XcmV0Xcm (209) */ interface XcmV0Xcm extends Enum { readonly isWithdrawAsset: boolean; readonly asWithdrawAsset: { @@ -2145,7 +2145,7 @@ readonly type: 'WithdrawAsset' | 'ReserveAssetDeposit' | 'TeleportAsset' | 'QueryResponse' | 'TransferAsset' | 'TransferReserveAsset' | 'Transact' | 'HrmpNewChannelOpenRequest' | 'HrmpChannelAccepted' | 'HrmpChannelClosing' | 'RelayedFrom'; } - /** @name XcmV0Order (210) */ + /** @name XcmV0Order (211) */ interface XcmV0Order extends Enum { readonly isNull: boolean; readonly isDepositAsset: boolean; @@ -2193,14 +2193,14 @@ readonly type: 'Null' | 'DepositAsset' | 'DepositReserveAsset' | 'ExchangeAsset' | 'InitiateReserveWithdraw' | 'InitiateTeleport' | 'QueryHolding' | 'BuyExecution'; } - /** @name XcmV0Response (212) */ + /** @name XcmV0Response (213) */ interface XcmV0Response extends Enum { readonly isAssets: boolean; readonly asAssets: Vec; readonly type: 'Assets'; } - /** @name XcmV1Xcm (213) */ + /** @name XcmV1Xcm (214) */ interface XcmV1Xcm extends Enum { readonly isWithdrawAsset: boolean; readonly asWithdrawAsset: { @@ -2269,7 +2269,7 @@ readonly type: 'WithdrawAsset' | 'ReserveAssetDeposited' | 'ReceiveTeleportedAsset' | 'QueryResponse' | 'TransferAsset' | 'TransferReserveAsset' | 'Transact' | 'HrmpNewChannelOpenRequest' | 'HrmpChannelAccepted' | 'HrmpChannelClosing' | 'RelayedFrom' | 'SubscribeVersion' | 'UnsubscribeVersion'; } - /** @name XcmV1Order (215) */ + /** @name XcmV1Order (216) */ interface XcmV1Order extends Enum { readonly isNoop: boolean; readonly isDepositAsset: boolean; @@ -2319,7 +2319,7 @@ readonly type: 'Noop' | 'DepositAsset' | 'DepositReserveAsset' | 'ExchangeAsset' | 'InitiateReserveWithdraw' | 'InitiateTeleport' | 'QueryHolding' | 'BuyExecution'; } - /** @name XcmV1Response (217) */ + /** @name XcmV1Response (218) */ interface XcmV1Response extends Enum { readonly isAssets: boolean; readonly asAssets: XcmV1MultiassetMultiAssets; @@ -2328,20 +2328,20 @@ readonly type: 'Assets' | 'Version'; } - /** @name CumulusPalletXcmCall (231) */ + /** @name CumulusPalletXcmCall (232) */ type CumulusPalletXcmCall = Null; - /** @name CumulusPalletDmpQueueCall (232) */ + /** @name CumulusPalletDmpQueueCall (233) */ interface CumulusPalletDmpQueueCall extends Enum { readonly isServiceOverweight: boolean; readonly asServiceOverweight: { readonly index: u64; - readonly weightLimit: u64; + readonly weightLimit: Weight; } & Struct; readonly type: 'ServiceOverweight'; } - /** @name PalletInflationCall (233) */ + /** @name PalletInflationCall (234) */ interface PalletInflationCall extends Enum { readonly isStartInflation: boolean; readonly asStartInflation: { @@ -2350,7 +2350,7 @@ readonly type: 'StartInflation'; } - /** @name PalletUniqueCall (234) */ + /** @name PalletUniqueCall (235) */ interface PalletUniqueCall extends Enum { readonly isCreateCollection: boolean; readonly asCreateCollection: { @@ -2508,7 +2508,7 @@ readonly type: 'CreateCollection' | 'CreateCollectionEx' | 'DestroyCollection' | 'AddToAllowList' | 'RemoveFromAllowList' | 'ChangeCollectionOwner' | 'AddCollectionAdmin' | 'RemoveCollectionAdmin' | 'SetCollectionSponsor' | 'ConfirmSponsorship' | 'RemoveCollectionSponsor' | 'CreateItem' | 'CreateMultipleItems' | 'SetCollectionProperties' | 'DeleteCollectionProperties' | 'SetTokenProperties' | 'DeleteTokenProperties' | 'SetTokenPropertyPermissions' | 'CreateMultipleItemsEx' | 'SetTransfersEnabledFlag' | 'BurnItem' | 'BurnFrom' | 'Transfer' | 'Approve' | 'TransferFrom' | 'SetCollectionLimits' | 'SetCollectionPermissions' | 'Repartition'; } - /** @name UpDataStructsCollectionMode (239) */ + /** @name UpDataStructsCollectionMode (240) */ interface UpDataStructsCollectionMode extends Enum { readonly isNft: boolean; readonly isFungible: boolean; @@ -2517,7 +2517,7 @@ readonly type: 'Nft' | 'Fungible' | 'ReFungible'; } - /** @name UpDataStructsCreateCollectionData (240) */ + /** @name UpDataStructsCreateCollectionData (241) */ interface UpDataStructsCreateCollectionData extends Struct { readonly mode: UpDataStructsCollectionMode; readonly access: Option; @@ -2531,14 +2531,14 @@ readonly properties: Vec; } - /** @name UpDataStructsAccessMode (242) */ + /** @name UpDataStructsAccessMode (243) */ interface UpDataStructsAccessMode extends Enum { readonly isNormal: boolean; readonly isAllowList: boolean; readonly type: 'Normal' | 'AllowList'; } - /** @name UpDataStructsCollectionLimits (244) */ + /** @name UpDataStructsCollectionLimits (245) */ interface UpDataStructsCollectionLimits extends Struct { readonly accountTokenOwnershipLimit: Option; readonly sponsoredDataSize: Option; @@ -2551,7 +2551,7 @@ readonly transfersEnabled: Option; } - /** @name UpDataStructsSponsoringRateLimit (246) */ + /** @name UpDataStructsSponsoringRateLimit (247) */ interface UpDataStructsSponsoringRateLimit extends Enum { readonly isSponsoringDisabled: boolean; readonly isBlocks: boolean; @@ -2559,43 +2559,43 @@ readonly type: 'SponsoringDisabled' | 'Blocks'; } - /** @name UpDataStructsCollectionPermissions (249) */ + /** @name UpDataStructsCollectionPermissions (250) */ interface UpDataStructsCollectionPermissions extends Struct { readonly access: Option; readonly mintMode: Option; readonly nesting: Option; } - /** @name UpDataStructsNestingPermissions (251) */ + /** @name UpDataStructsNestingPermissions (252) */ interface UpDataStructsNestingPermissions extends Struct { readonly tokenOwner: bool; readonly collectionAdmin: bool; readonly restricted: Option; } - /** @name UpDataStructsOwnerRestrictedSet (253) */ + /** @name UpDataStructsOwnerRestrictedSet (254) */ interface UpDataStructsOwnerRestrictedSet extends BTreeSet {} - /** @name UpDataStructsPropertyKeyPermission (258) */ + /** @name UpDataStructsPropertyKeyPermission (259) */ interface UpDataStructsPropertyKeyPermission extends Struct { readonly key: Bytes; readonly permission: UpDataStructsPropertyPermission; } - /** @name UpDataStructsPropertyPermission (259) */ + /** @name UpDataStructsPropertyPermission (260) */ interface UpDataStructsPropertyPermission extends Struct { readonly mutable: bool; readonly collectionAdmin: bool; readonly tokenOwner: bool; } - /** @name UpDataStructsProperty (262) */ + /** @name UpDataStructsProperty (263) */ interface UpDataStructsProperty extends Struct { readonly key: Bytes; readonly value: Bytes; } - /** @name UpDataStructsCreateItemData (265) */ + /** @name UpDataStructsCreateItemData (266) */ interface UpDataStructsCreateItemData extends Enum { readonly isNft: boolean; readonly asNft: UpDataStructsCreateNftData; @@ -2606,23 +2606,23 @@ readonly type: 'Nft' | 'Fungible' | 'ReFungible'; } - /** @name UpDataStructsCreateNftData (266) */ + /** @name UpDataStructsCreateNftData (267) */ interface UpDataStructsCreateNftData extends Struct { readonly properties: Vec; } - /** @name UpDataStructsCreateFungibleData (267) */ + /** @name UpDataStructsCreateFungibleData (268) */ interface UpDataStructsCreateFungibleData extends Struct { readonly value: u128; } - /** @name UpDataStructsCreateReFungibleData (268) */ + /** @name UpDataStructsCreateReFungibleData (269) */ interface UpDataStructsCreateReFungibleData extends Struct { readonly pieces: u128; readonly properties: Vec; } - /** @name UpDataStructsCreateItemExData (271) */ + /** @name UpDataStructsCreateItemExData (272) */ interface UpDataStructsCreateItemExData extends Enum { readonly isNft: boolean; readonly asNft: Vec; @@ -2635,26 +2635,26 @@ readonly type: 'Nft' | 'Fungible' | 'RefungibleMultipleItems' | 'RefungibleMultipleOwners'; } - /** @name UpDataStructsCreateNftExData (273) */ + /** @name UpDataStructsCreateNftExData (274) */ interface UpDataStructsCreateNftExData extends Struct { readonly properties: Vec; readonly owner: PalletEvmAccountBasicCrossAccountIdRepr; } - /** @name UpDataStructsCreateRefungibleExSingleOwner (280) */ + /** @name UpDataStructsCreateRefungibleExSingleOwner (281) */ interface UpDataStructsCreateRefungibleExSingleOwner extends Struct { readonly user: PalletEvmAccountBasicCrossAccountIdRepr; readonly pieces: u128; readonly properties: Vec; } - /** @name UpDataStructsCreateRefungibleExMultipleOwners (282) */ + /** @name UpDataStructsCreateRefungibleExMultipleOwners (283) */ interface UpDataStructsCreateRefungibleExMultipleOwners extends Struct { readonly users: BTreeMap; readonly properties: Vec; } - /** @name PalletUniqueSchedulerCall (283) */ + /** @name PalletUniqueSchedulerCall (284) */ interface PalletUniqueSchedulerCall extends Enum { readonly isScheduleNamed: boolean; readonly asScheduleNamed: { @@ -2679,7 +2679,7 @@ readonly type: 'ScheduleNamed' | 'CancelNamed' | 'ScheduleNamedAfter'; } - /** @name FrameSupportScheduleMaybeHashed (285) */ + /** @name FrameSupportScheduleMaybeHashed (286) */ interface FrameSupportScheduleMaybeHashed extends Enum { readonly isValue: boolean; readonly asValue: Call; @@ -2688,7 +2688,7 @@ readonly type: 'Value' | 'Hash'; } - /** @name PalletConfigurationCall (286) */ + /** @name PalletConfigurationCall (287) */ interface PalletConfigurationCall extends Enum { readonly isSetWeightToFeeCoefficientOverride: boolean; readonly asSetWeightToFeeCoefficientOverride: { @@ -2701,13 +2701,13 @@ readonly type: 'SetWeightToFeeCoefficientOverride' | 'SetMinGasPriceOverride'; } - /** @name PalletTemplateTransactionPaymentCall (287) */ + /** @name PalletTemplateTransactionPaymentCall (289) */ type PalletTemplateTransactionPaymentCall = Null; - /** @name PalletStructureCall (288) */ + /** @name PalletStructureCall (290) */ type PalletStructureCall = Null; - /** @name PalletRmrkCoreCall (289) */ + /** @name PalletRmrkCoreCall (291) */ interface PalletRmrkCoreCall extends Enum { readonly isCreateCollection: boolean; readonly asCreateCollection: { @@ -2813,7 +2813,7 @@ readonly type: 'CreateCollection' | 'DestroyCollection' | 'ChangeCollectionIssuer' | 'LockCollection' | 'MintNft' | 'BurnNft' | 'Send' | 'AcceptNft' | 'RejectNft' | 'AcceptResource' | 'AcceptResourceRemoval' | 'SetProperty' | 'SetPriority' | 'AddBasicResource' | 'AddComposableResource' | 'AddSlotResource' | 'RemoveResource'; } - /** @name RmrkTraitsResourceResourceTypes (295) */ + /** @name RmrkTraitsResourceResourceTypes (297) */ interface RmrkTraitsResourceResourceTypes extends Enum { readonly isBasic: boolean; readonly asBasic: RmrkTraitsResourceBasicResource; @@ -2824,7 +2824,7 @@ readonly type: 'Basic' | 'Composable' | 'Slot'; } - /** @name RmrkTraitsResourceBasicResource (297) */ + /** @name RmrkTraitsResourceBasicResource (299) */ interface RmrkTraitsResourceBasicResource extends Struct { readonly src: Option; readonly metadata: Option; @@ -2832,7 +2832,7 @@ readonly thumb: Option; } - /** @name RmrkTraitsResourceComposableResource (299) */ + /** @name RmrkTraitsResourceComposableResource (301) */ interface RmrkTraitsResourceComposableResource extends Struct { readonly parts: Vec; readonly base: u32; @@ -2842,7 +2842,7 @@ readonly thumb: Option; } - /** @name RmrkTraitsResourceSlotResource (300) */ + /** @name RmrkTraitsResourceSlotResource (302) */ interface RmrkTraitsResourceSlotResource extends Struct { readonly base: u32; readonly src: Option; @@ -2852,7 +2852,7 @@ readonly thumb: Option; } - /** @name PalletRmrkEquipCall (303) */ + /** @name PalletRmrkEquipCall (305) */ interface PalletRmrkEquipCall extends Enum { readonly isCreateBase: boolean; readonly asCreateBase: { @@ -2874,7 +2874,7 @@ readonly type: 'CreateBase' | 'ThemeAdd' | 'Equippable'; } - /** @name RmrkTraitsPartPartType (306) */ + /** @name RmrkTraitsPartPartType (308) */ interface RmrkTraitsPartPartType extends Enum { readonly isFixedPart: boolean; readonly asFixedPart: RmrkTraitsPartFixedPart; @@ -2883,14 +2883,14 @@ readonly type: 'FixedPart' | 'SlotPart'; } - /** @name RmrkTraitsPartFixedPart (308) */ + /** @name RmrkTraitsPartFixedPart (310) */ interface RmrkTraitsPartFixedPart extends Struct { readonly id: u32; readonly z: u32; readonly src: Bytes; } - /** @name RmrkTraitsPartSlotPart (309) */ + /** @name RmrkTraitsPartSlotPart (311) */ interface RmrkTraitsPartSlotPart extends Struct { readonly id: u32; readonly equippable: RmrkTraitsPartEquippableList; @@ -2898,7 +2898,7 @@ readonly z: u32; } - /** @name RmrkTraitsPartEquippableList (310) */ + /** @name RmrkTraitsPartEquippableList (312) */ interface RmrkTraitsPartEquippableList extends Enum { readonly isAll: boolean; readonly isEmpty: boolean; @@ -2907,20 +2907,20 @@ readonly type: 'All' | 'Empty' | 'Custom'; } - /** @name RmrkTraitsTheme (312) */ + /** @name RmrkTraitsTheme (314) */ interface RmrkTraitsTheme extends Struct { readonly name: Bytes; readonly properties: Vec; readonly inherit: bool; } - /** @name RmrkTraitsThemeThemeProperty (314) */ + /** @name RmrkTraitsThemeThemeProperty (316) */ interface RmrkTraitsThemeThemeProperty extends Struct { readonly key: Bytes; readonly value: Bytes; } - /** @name PalletAppPromotionCall (316) */ + /** @name PalletAppPromotionCall (318) */ interface PalletAppPromotionCall extends Enum { readonly isSetAdminAddress: boolean; readonly asSetAdminAddress: { @@ -2954,7 +2954,7 @@ readonly type: 'SetAdminAddress' | 'Stake' | 'Unstake' | 'SponsorCollection' | 'StopSponsoringCollection' | 'SponsorContract' | 'StopSponsoringContract' | 'PayoutStakers'; } - /** @name PalletForeignAssetsModuleCall (318) */ + /** @name PalletForeignAssetsModuleCall (320) */ interface PalletForeignAssetsModuleCall extends Enum { readonly isRegisterForeignAsset: boolean; readonly asRegisterForeignAsset: { @@ -2971,7 +2971,7 @@ readonly type: 'RegisterForeignAsset' | 'UpdateForeignAsset'; } - /** @name PalletEvmCall (319) */ + /** @name PalletEvmCall (321) */ interface PalletEvmCall extends Enum { readonly isWithdraw: boolean; readonly asWithdraw: { @@ -3016,7 +3016,7 @@ readonly type: 'Withdraw' | 'Call' | 'Create' | 'Create2'; } - /** @name PalletEthereumCall (323) */ + /** @name PalletEthereumCall (325) */ interface PalletEthereumCall extends Enum { readonly isTransact: boolean; readonly asTransact: { @@ -3025,7 +3025,7 @@ readonly type: 'Transact'; } - /** @name EthereumTransactionTransactionV2 (324) */ + /** @name EthereumTransactionTransactionV2 (326) */ interface EthereumTransactionTransactionV2 extends Enum { readonly isLegacy: boolean; readonly asLegacy: EthereumTransactionLegacyTransaction; @@ -3036,7 +3036,7 @@ readonly type: 'Legacy' | 'Eip2930' | 'Eip1559'; } - /** @name EthereumTransactionLegacyTransaction (325) */ + /** @name EthereumTransactionLegacyTransaction (327) */ interface EthereumTransactionLegacyTransaction extends Struct { readonly nonce: U256; readonly gasPrice: U256; @@ -3047,7 +3047,7 @@ readonly signature: EthereumTransactionTransactionSignature; } - /** @name EthereumTransactionTransactionAction (326) */ + /** @name EthereumTransactionTransactionAction (328) */ interface EthereumTransactionTransactionAction extends Enum { readonly isCall: boolean; readonly asCall: H160; @@ -3055,14 +3055,14 @@ readonly type: 'Call' | 'Create'; } - /** @name EthereumTransactionTransactionSignature (327) */ + /** @name EthereumTransactionTransactionSignature (329) */ interface EthereumTransactionTransactionSignature extends Struct { readonly v: u64; readonly r: H256; readonly s: H256; } - /** @name EthereumTransactionEip2930Transaction (329) */ + /** @name EthereumTransactionEip2930Transaction (331) */ interface EthereumTransactionEip2930Transaction extends Struct { readonly chainId: u64; readonly nonce: U256; @@ -3077,13 +3077,13 @@ readonly s: H256; } - /** @name EthereumTransactionAccessListItem (331) */ + /** @name EthereumTransactionAccessListItem (333) */ interface EthereumTransactionAccessListItem extends Struct { readonly address: H160; readonly storageKeys: Vec; } - /** @name EthereumTransactionEip1559Transaction (332) */ + /** @name EthereumTransactionEip1559Transaction (334) */ interface EthereumTransactionEip1559Transaction extends Struct { readonly chainId: u64; readonly nonce: U256; @@ -3099,7 +3099,7 @@ readonly s: H256; } - /** @name PalletEvmMigrationCall (333) */ + /** @name PalletEvmMigrationCall (335) */ interface PalletEvmMigrationCall extends Enum { readonly isBegin: boolean; readonly asBegin: { @@ -3118,13 +3118,13 @@ readonly type: 'Begin' | 'SetData' | 'Finish'; } - /** @name PalletSudoError (336) */ + /** @name PalletSudoError (338) */ interface PalletSudoError extends Enum { readonly isRequireSudo: boolean; readonly type: 'RequireSudo'; } - /** @name OrmlVestingModuleError (338) */ + /** @name OrmlVestingModuleError (340) */ interface OrmlVestingModuleError extends Enum { readonly isZeroVestingPeriod: boolean; readonly isZeroVestingPeriodCount: boolean; @@ -3135,7 +3135,7 @@ readonly type: 'ZeroVestingPeriod' | 'ZeroVestingPeriodCount' | 'InsufficientBalanceToLock' | 'TooManyVestingSchedules' | 'AmountLow' | 'MaxVestingSchedulesExceeded'; } - /** @name OrmlXtokensModuleError (339) */ + /** @name OrmlXtokensModuleError (341) */ interface OrmlXtokensModuleError extends Enum { readonly isAssetHasNoReserve: boolean; readonly isNotCrossChainTransfer: boolean; @@ -3159,26 +3159,26 @@ readonly type: 'AssetHasNoReserve' | 'NotCrossChainTransfer' | 'InvalidDest' | 'NotCrossChainTransferableCurrency' | 'UnweighableMessage' | 'XcmExecutionFailed' | 'CannotReanchor' | 'InvalidAncestry' | 'InvalidAsset' | 'DestinationNotInvertible' | 'BadVersion' | 'DistinctReserveForAssetAndFee' | 'ZeroFee' | 'ZeroAmount' | 'TooManyAssetsBeingSent' | 'AssetIndexNonExistent' | 'FeeNotEnough' | 'NotSupportedMultiLocation' | 'MinXcmFeeNotDefined'; } - /** @name OrmlTokensBalanceLock (342) */ + /** @name OrmlTokensBalanceLock (344) */ interface OrmlTokensBalanceLock extends Struct { readonly id: U8aFixed; readonly amount: u128; } - /** @name OrmlTokensAccountData (344) */ + /** @name OrmlTokensAccountData (346) */ interface OrmlTokensAccountData extends Struct { readonly free: u128; readonly reserved: u128; readonly frozen: u128; } - /** @name OrmlTokensReserveData (346) */ + /** @name OrmlTokensReserveData (348) */ interface OrmlTokensReserveData extends Struct { readonly id: Null; readonly amount: u128; } - /** @name OrmlTokensModuleError (348) */ + /** @name OrmlTokensModuleError (350) */ interface OrmlTokensModuleError extends Enum { readonly isBalanceTooLow: boolean; readonly isAmountIntoBalanceFailed: boolean; @@ -3191,21 +3191,21 @@ readonly type: 'BalanceTooLow' | 'AmountIntoBalanceFailed' | 'LiquidityRestrictions' | 'MaxLocksExceeded' | 'KeepAlive' | 'ExistentialDeposit' | 'DeadAccount' | 'TooManyReserves'; } - /** @name CumulusPalletXcmpQueueInboundChannelDetails (350) */ + /** @name CumulusPalletXcmpQueueInboundChannelDetails (352) */ interface CumulusPalletXcmpQueueInboundChannelDetails extends Struct { readonly sender: u32; readonly state: CumulusPalletXcmpQueueInboundState; readonly messageMetadata: Vec>; } - /** @name CumulusPalletXcmpQueueInboundState (351) */ + /** @name CumulusPalletXcmpQueueInboundState (353) */ interface CumulusPalletXcmpQueueInboundState extends Enum { readonly isOk: boolean; readonly isSuspended: boolean; readonly type: 'Ok' | 'Suspended'; } - /** @name PolkadotParachainPrimitivesXcmpMessageFormat (354) */ + /** @name PolkadotParachainPrimitivesXcmpMessageFormat (356) */ interface PolkadotParachainPrimitivesXcmpMessageFormat extends Enum { readonly isConcatenatedVersionedXcm: boolean; readonly isConcatenatedEncodedBlob: boolean; @@ -3213,7 +3213,7 @@ readonly type: 'ConcatenatedVersionedXcm' | 'ConcatenatedEncodedBlob' | 'Signals'; } - /** @name CumulusPalletXcmpQueueOutboundChannelDetails (357) */ + /** @name CumulusPalletXcmpQueueOutboundChannelDetails (359) */ interface CumulusPalletXcmpQueueOutboundChannelDetails extends Struct { readonly recipient: u32; readonly state: CumulusPalletXcmpQueueOutboundState; @@ -3222,24 +3222,24 @@ readonly lastIndex: u16; } - /** @name CumulusPalletXcmpQueueOutboundState (358) */ + /** @name CumulusPalletXcmpQueueOutboundState (360) */ interface CumulusPalletXcmpQueueOutboundState extends Enum { readonly isOk: boolean; readonly isSuspended: boolean; readonly type: 'Ok' | 'Suspended'; } - /** @name CumulusPalletXcmpQueueQueueConfigData (360) */ + /** @name CumulusPalletXcmpQueueQueueConfigData (362) */ interface CumulusPalletXcmpQueueQueueConfigData extends Struct { readonly suspendThreshold: u32; readonly dropThreshold: u32; readonly resumeThreshold: u32; - readonly thresholdWeight: u64; - readonly weightRestrictDecay: u64; - readonly xcmpMaxIndividualWeight: u64; + readonly thresholdWeight: Weight; + readonly weightRestrictDecay: Weight; + readonly xcmpMaxIndividualWeight: Weight; } - /** @name CumulusPalletXcmpQueueError (362) */ + /** @name CumulusPalletXcmpQueueError (364) */ interface CumulusPalletXcmpQueueError extends Enum { readonly isFailedToSend: boolean; readonly isBadXcmOrigin: boolean; @@ -3249,7 +3249,7 @@ readonly type: 'FailedToSend' | 'BadXcmOrigin' | 'BadXcm' | 'BadOverweightIndex' | 'WeightOverLimit'; } - /** @name PalletXcmError (363) */ + /** @name PalletXcmError (365) */ interface PalletXcmError extends Enum { readonly isUnreachable: boolean; readonly isSendFailure: boolean; @@ -3267,29 +3267,29 @@ readonly type: 'Unreachable' | 'SendFailure' | 'Filtered' | 'UnweighableMessage' | 'DestinationNotInvertible' | 'Empty' | 'CannotReanchor' | 'TooManyAssets' | 'InvalidOrigin' | 'BadVersion' | 'BadLocation' | 'NoSubscription' | 'AlreadySubscribed'; } - /** @name CumulusPalletXcmError (364) */ + /** @name CumulusPalletXcmError (366) */ type CumulusPalletXcmError = Null; - /** @name CumulusPalletDmpQueueConfigData (365) */ + /** @name CumulusPalletDmpQueueConfigData (367) */ interface CumulusPalletDmpQueueConfigData extends Struct { - readonly maxIndividual: u64; + readonly maxIndividual: Weight; } - /** @name CumulusPalletDmpQueuePageIndexData (366) */ + /** @name CumulusPalletDmpQueuePageIndexData (368) */ interface CumulusPalletDmpQueuePageIndexData extends Struct { readonly beginUsed: u32; readonly endUsed: u32; readonly overweightCount: u64; } - /** @name CumulusPalletDmpQueueError (369) */ + /** @name CumulusPalletDmpQueueError (371) */ interface CumulusPalletDmpQueueError extends Enum { readonly isUnknown: boolean; readonly isOverLimit: boolean; readonly type: 'Unknown' | 'OverLimit'; } - /** @name PalletUniqueError (373) */ + /** @name PalletUniqueError (375) */ interface PalletUniqueError extends Enum { readonly isCollectionDecimalPointLimitExceeded: boolean; readonly isConfirmUnsetSponsorFail: boolean; @@ -3298,7 +3298,7 @@ readonly type: 'CollectionDecimalPointLimitExceeded' | 'ConfirmUnsetSponsorFail' | 'EmptyArgument' | 'RepartitionCalledOnNonRefungibleCollection'; } - /** @name PalletUniqueSchedulerScheduledV3 (376) */ + /** @name PalletUniqueSchedulerScheduledV3 (378) */ interface PalletUniqueSchedulerScheduledV3 extends Struct { readonly maybeId: Option; readonly priority: u8; @@ -3307,7 +3307,7 @@ readonly origin: OpalRuntimeOriginCaller; } - /** @name OpalRuntimeOriginCaller (377) */ + /** @name OpalRuntimeOriginCaller (379) */ interface OpalRuntimeOriginCaller extends Enum { readonly isSystem: boolean; readonly asSystem: FrameSupportDispatchRawOrigin; @@ -3321,7 +3321,7 @@ readonly type: 'System' | 'Void' | 'PolkadotXcm' | 'CumulusXcm' | 'Ethereum'; } - /** @name FrameSupportDispatchRawOrigin (378) */ + /** @name FrameSupportDispatchRawOrigin (380) */ interface FrameSupportDispatchRawOrigin extends Enum { readonly isRoot: boolean; readonly isSigned: boolean; @@ -3330,7 +3330,7 @@ readonly type: 'Root' | 'Signed' | 'None'; } - /** @name PalletXcmOrigin (379) */ + /** @name PalletXcmOrigin (381) */ interface PalletXcmOrigin extends Enum { readonly isXcm: boolean; readonly asXcm: XcmV1MultiLocation; @@ -3339,7 +3339,7 @@ readonly type: 'Xcm' | 'Response'; } - /** @name CumulusPalletXcmOrigin (380) */ + /** @name CumulusPalletXcmOrigin (382) */ interface CumulusPalletXcmOrigin extends Enum { readonly isRelay: boolean; readonly isSiblingParachain: boolean; @@ -3347,17 +3347,17 @@ readonly type: 'Relay' | 'SiblingParachain'; } - /** @name PalletEthereumRawOrigin (381) */ + /** @name PalletEthereumRawOrigin (383) */ interface PalletEthereumRawOrigin extends Enum { readonly isEthereumTransaction: boolean; readonly asEthereumTransaction: H160; readonly type: 'EthereumTransaction'; } - /** @name SpCoreVoid (382) */ + /** @name SpCoreVoid (384) */ type SpCoreVoid = Null; - /** @name PalletUniqueSchedulerError (383) */ + /** @name PalletUniqueSchedulerError (385) */ interface PalletUniqueSchedulerError extends Enum { readonly isFailedToSchedule: boolean; readonly isNotFound: boolean; @@ -3366,7 +3366,7 @@ readonly type: 'FailedToSchedule' | 'NotFound' | 'TargetBlockNumberInPast' | 'RescheduleNoChange'; } - /** @name UpDataStructsCollection (384) */ + /** @name UpDataStructsCollection (386) */ interface UpDataStructsCollection extends Struct { readonly owner: AccountId32; readonly mode: UpDataStructsCollectionMode; @@ -3379,7 +3379,7 @@ readonly flags: U8aFixed; } - /** @name UpDataStructsSponsorshipStateAccountId32 (385) */ + /** @name UpDataStructsSponsorshipStateAccountId32 (387) */ interface UpDataStructsSponsorshipStateAccountId32 extends Enum { readonly isDisabled: boolean; readonly isUnconfirmed: boolean; @@ -3389,43 +3389,43 @@ readonly type: 'Disabled' | 'Unconfirmed' | 'Confirmed'; } - /** @name UpDataStructsProperties (387) */ + /** @name UpDataStructsProperties (389) */ interface UpDataStructsProperties extends Struct { readonly map: UpDataStructsPropertiesMapBoundedVec; readonly consumedSpace: u32; readonly spaceLimit: u32; } - /** @name UpDataStructsPropertiesMapBoundedVec (388) */ + /** @name UpDataStructsPropertiesMapBoundedVec (390) */ interface UpDataStructsPropertiesMapBoundedVec extends BTreeMap {} - /** @name UpDataStructsPropertiesMapPropertyPermission (393) */ + /** @name UpDataStructsPropertiesMapPropertyPermission (395) */ interface UpDataStructsPropertiesMapPropertyPermission extends BTreeMap {} - /** @name UpDataStructsCollectionStats (400) */ + /** @name UpDataStructsCollectionStats (402) */ interface UpDataStructsCollectionStats extends Struct { readonly created: u32; readonly destroyed: u32; readonly alive: u32; } - /** @name UpDataStructsTokenChild (401) */ + /** @name UpDataStructsTokenChild (403) */ interface UpDataStructsTokenChild extends Struct { readonly token: u32; readonly collection: u32; } - /** @name PhantomTypeUpDataStructs (402) */ + /** @name PhantomTypeUpDataStructs (404) */ interface PhantomTypeUpDataStructs extends Vec> {} - /** @name UpDataStructsTokenData (404) */ + /** @name UpDataStructsTokenData (406) */ interface UpDataStructsTokenData extends Struct { readonly properties: Vec; readonly owner: Option; readonly pieces: u128; } - /** @name UpDataStructsRpcCollection (406) */ + /** @name UpDataStructsRpcCollection (408) */ interface UpDataStructsRpcCollection extends Struct { readonly owner: AccountId32; readonly mode: UpDataStructsCollectionMode; @@ -3441,7 +3441,7 @@ readonly foreign: bool; } - /** @name RmrkTraitsCollectionCollectionInfo (407) */ + /** @name RmrkTraitsCollectionCollectionInfo (409) */ interface RmrkTraitsCollectionCollectionInfo extends Struct { readonly issuer: AccountId32; readonly metadata: Bytes; @@ -3450,7 +3450,7 @@ readonly nftsCount: u32; } - /** @name RmrkTraitsNftNftInfo (408) */ + /** @name RmrkTraitsNftNftInfo (410) */ interface RmrkTraitsNftNftInfo extends Struct { readonly owner: RmrkTraitsNftAccountIdOrCollectionNftTuple; readonly royalty: Option; @@ -3459,13 +3459,13 @@ readonly pending: bool; } - /** @name RmrkTraitsNftRoyaltyInfo (410) */ + /** @name RmrkTraitsNftRoyaltyInfo (412) */ interface RmrkTraitsNftRoyaltyInfo extends Struct { readonly recipient: AccountId32; readonly amount: Permill; } - /** @name RmrkTraitsResourceResourceInfo (411) */ + /** @name RmrkTraitsResourceResourceInfo (413) */ interface RmrkTraitsResourceResourceInfo extends Struct { readonly id: u32; readonly resource: RmrkTraitsResourceResourceTypes; @@ -3473,26 +3473,26 @@ readonly pendingRemoval: bool; } - /** @name RmrkTraitsPropertyPropertyInfo (412) */ + /** @name RmrkTraitsPropertyPropertyInfo (414) */ interface RmrkTraitsPropertyPropertyInfo extends Struct { readonly key: Bytes; readonly value: Bytes; } - /** @name RmrkTraitsBaseBaseInfo (413) */ + /** @name RmrkTraitsBaseBaseInfo (415) */ interface RmrkTraitsBaseBaseInfo extends Struct { readonly issuer: AccountId32; readonly baseType: Bytes; readonly symbol: Bytes; } - /** @name RmrkTraitsNftNftChild (414) */ + /** @name RmrkTraitsNftNftChild (416) */ interface RmrkTraitsNftNftChild extends Struct { readonly collectionId: u32; readonly nftId: u32; } - /** @name PalletCommonError (416) */ + /** @name PalletCommonError (418) */ interface PalletCommonError extends Enum { readonly isCollectionNotFound: boolean; readonly isMustBeTokenOwner: boolean; @@ -3531,7 +3531,7 @@ readonly type: 'CollectionNotFound' | 'MustBeTokenOwner' | 'NoPermission' | 'CantDestroyNotEmptyCollection' | 'PublicMintingNotAllowed' | 'AddressNotInAllowlist' | 'CollectionNameLimitExceeded' | 'CollectionDescriptionLimitExceeded' | 'CollectionTokenPrefixLimitExceeded' | 'TotalCollectionsLimitExceeded' | 'CollectionAdminCountExceeded' | 'CollectionLimitBoundsExceeded' | 'OwnerPermissionsCantBeReverted' | 'TransferNotAllowed' | 'AccountTokenLimitExceeded' | 'CollectionTokenLimitExceeded' | 'MetadataFlagFrozen' | 'TokenNotFound' | 'TokenValueTooLow' | 'ApprovedValueTooLow' | 'CantApproveMoreThanOwned' | 'AddressIsZero' | 'UnsupportedOperation' | 'NotSufficientFounds' | 'UserIsNotAllowedToNest' | 'SourceCollectionIsNotAllowedToNest' | 'CollectionFieldSizeExceeded' | 'NoSpaceForProperty' | 'PropertyLimitReached' | 'PropertyKeyIsTooLong' | 'InvalidCharacterInPropertyKey' | 'EmptyPropertyKey' | 'CollectionIsExternal' | 'CollectionIsInternal'; } - /** @name PalletFungibleError (418) */ + /** @name PalletFungibleError (420) */ interface PalletFungibleError extends Enum { readonly isNotFungibleDataUsedToMintFungibleCollectionToken: boolean; readonly isFungibleItemsHaveNoId: boolean; @@ -3541,12 +3541,12 @@ readonly type: 'NotFungibleDataUsedToMintFungibleCollectionToken' | 'FungibleItemsHaveNoId' | 'FungibleItemsDontHaveData' | 'FungibleDisallowsNesting' | 'SettingPropertiesNotAllowed'; } - /** @name PalletRefungibleItemData (419) */ + /** @name PalletRefungibleItemData (421) */ interface PalletRefungibleItemData extends Struct { readonly constData: Bytes; } - /** @name PalletRefungibleError (424) */ + /** @name PalletRefungibleError (426) */ interface PalletRefungibleError extends Enum { readonly isNotRefungibleDataUsedToMintFungibleCollectionToken: boolean; readonly isWrongRefungiblePieces: boolean; @@ -3556,19 +3556,19 @@ readonly type: 'NotRefungibleDataUsedToMintFungibleCollectionToken' | 'WrongRefungiblePieces' | 'RepartitionWhileNotOwningAllPieces' | 'RefungibleDisallowsNesting' | 'SettingPropertiesNotAllowed'; } - /** @name PalletNonfungibleItemData (425) */ + /** @name PalletNonfungibleItemData (427) */ interface PalletNonfungibleItemData extends Struct { readonly owner: PalletEvmAccountBasicCrossAccountIdRepr; } - /** @name UpDataStructsPropertyScope (427) */ + /** @name UpDataStructsPropertyScope (429) */ interface UpDataStructsPropertyScope extends Enum { readonly isNone: boolean; readonly isRmrk: boolean; readonly type: 'None' | 'Rmrk'; } - /** @name PalletNonfungibleError (429) */ + /** @name PalletNonfungibleError (431) */ interface PalletNonfungibleError extends Enum { readonly isNotNonfungibleDataUsedToMintFungibleCollectionToken: boolean; readonly isNonfungibleItemsHaveNoAmount: boolean; @@ -3576,7 +3576,7 @@ readonly type: 'NotNonfungibleDataUsedToMintFungibleCollectionToken' | 'NonfungibleItemsHaveNoAmount' | 'CantBurnNftWithChildren'; } - /** @name PalletStructureError (430) */ + /** @name PalletStructureError (432) */ interface PalletStructureError extends Enum { readonly isOuroborosDetected: boolean; readonly isDepthLimit: boolean; @@ -3585,7 +3585,7 @@ readonly type: 'OuroborosDetected' | 'DepthLimit' | 'BreadthLimit' | 'TokenNotFound'; } - /** @name PalletRmrkCoreError (431) */ + /** @name PalletRmrkCoreError (433) */ interface PalletRmrkCoreError extends Enum { readonly isCorruptedCollectionType: boolean; readonly isRmrkPropertyKeyIsTooLong: boolean; @@ -3609,7 +3609,7 @@ readonly type: 'CorruptedCollectionType' | 'RmrkPropertyKeyIsTooLong' | 'RmrkPropertyValueIsTooLong' | 'RmrkPropertyIsNotFound' | 'UnableToDecodeRmrkData' | 'CollectionNotEmpty' | 'NoAvailableCollectionId' | 'NoAvailableNftId' | 'CollectionUnknown' | 'NoPermission' | 'NonTransferable' | 'CollectionFullOrLocked' | 'ResourceDoesntExist' | 'CannotSendToDescendentOrSelf' | 'CannotAcceptNonOwnedNft' | 'CannotRejectNonOwnedNft' | 'CannotRejectNonPendingNft' | 'ResourceNotPending' | 'NoAvailableResourceId'; } - /** @name PalletRmrkEquipError (433) */ + /** @name PalletRmrkEquipError (435) */ interface PalletRmrkEquipError extends Enum { readonly isPermissionError: boolean; readonly isNoAvailableBaseId: boolean; @@ -3621,7 +3621,7 @@ readonly type: 'PermissionError' | 'NoAvailableBaseId' | 'NoAvailablePartId' | 'BaseDoesntExist' | 'NeedsDefaultThemeFirst' | 'PartDoesntExist' | 'NoEquippableOnFixedPart'; } - /** @name PalletAppPromotionError (439) */ + /** @name PalletAppPromotionError (441) */ interface PalletAppPromotionError extends Enum { readonly isAdminNotSet: boolean; readonly isNoPermission: boolean; @@ -3632,7 +3632,7 @@ readonly type: 'AdminNotSet' | 'NoPermission' | 'NotSufficientFunds' | 'PendingForBlockOverflow' | 'SponsorNotSet' | 'IncorrectLockedBalanceOperation'; } - /** @name PalletForeignAssetsModuleError (440) */ + /** @name PalletForeignAssetsModuleError (442) */ interface PalletForeignAssetsModuleError extends Enum { readonly isBadLocation: boolean; readonly isMultiLocationExisted: boolean; @@ -3641,7 +3641,7 @@ readonly type: 'BadLocation' | 'MultiLocationExisted' | 'AssetIdNotExists' | 'AssetIdExisted'; } - /** @name PalletEvmError (443) */ + /** @name PalletEvmError (445) */ interface PalletEvmError extends Enum { readonly isBalanceLow: boolean; readonly isFeeOverflow: boolean; @@ -3652,7 +3652,7 @@ readonly type: 'BalanceLow' | 'FeeOverflow' | 'PaymentOverflow' | 'WithdrawFailed' | 'GasPriceTooLow' | 'InvalidNonce'; } - /** @name FpRpcTransactionStatus (446) */ + /** @name FpRpcTransactionStatus (448) */ interface FpRpcTransactionStatus extends Struct { readonly transactionHash: H256; readonly transactionIndex: u32; @@ -3663,10 +3663,10 @@ readonly logsBloom: EthbloomBloom; } - /** @name EthbloomBloom (448) */ + /** @name EthbloomBloom (450) */ interface EthbloomBloom extends U8aFixed {} - /** @name EthereumReceiptReceiptV3 (450) */ + /** @name EthereumReceiptReceiptV3 (452) */ interface EthereumReceiptReceiptV3 extends Enum { readonly isLegacy: boolean; readonly asLegacy: EthereumReceiptEip658ReceiptData; @@ -3677,7 +3677,7 @@ readonly type: 'Legacy' | 'Eip2930' | 'Eip1559'; } - /** @name EthereumReceiptEip658ReceiptData (451) */ + /** @name EthereumReceiptEip658ReceiptData (453) */ interface EthereumReceiptEip658ReceiptData extends Struct { readonly statusCode: u8; readonly usedGas: U256; @@ -3685,14 +3685,14 @@ readonly logs: Vec; } - /** @name EthereumBlock (452) */ + /** @name EthereumBlock (454) */ interface EthereumBlock extends Struct { readonly header: EthereumHeader; readonly transactions: Vec; readonly ommers: Vec; } - /** @name EthereumHeader (453) */ + /** @name EthereumHeader (455) */ interface EthereumHeader extends Struct { readonly parentHash: H256; readonly ommersHash: H256; @@ -3711,24 +3711,24 @@ readonly nonce: EthereumTypesHashH64; } - /** @name EthereumTypesHashH64 (454) */ + /** @name EthereumTypesHashH64 (456) */ interface EthereumTypesHashH64 extends U8aFixed {} - /** @name PalletEthereumError (459) */ + /** @name PalletEthereumError (461) */ interface PalletEthereumError extends Enum { readonly isInvalidSignature: boolean; readonly isPreLogExists: boolean; readonly type: 'InvalidSignature' | 'PreLogExists'; } - /** @name PalletEvmCoderSubstrateError (460) */ + /** @name PalletEvmCoderSubstrateError (462) */ interface PalletEvmCoderSubstrateError extends Enum { readonly isOutOfGas: boolean; readonly isOutOfFund: boolean; readonly type: 'OutOfGas' | 'OutOfFund'; } - /** @name UpDataStructsSponsorshipStateBasicCrossAccountIdRepr (461) */ + /** @name UpDataStructsSponsorshipStateBasicCrossAccountIdRepr (463) */ interface UpDataStructsSponsorshipStateBasicCrossAccountIdRepr extends Enum { readonly isDisabled: boolean; readonly isUnconfirmed: boolean; @@ -3738,7 +3738,7 @@ readonly type: 'Disabled' | 'Unconfirmed' | 'Confirmed'; } - /** @name PalletEvmContractHelpersSponsoringModeT (462) */ + /** @name PalletEvmContractHelpersSponsoringModeT (464) */ interface PalletEvmContractHelpersSponsoringModeT extends Enum { readonly isDisabled: boolean; readonly isAllowlisted: boolean; @@ -3746,7 +3746,7 @@ readonly type: 'Disabled' | 'Allowlisted' | 'Generous'; } - /** @name PalletEvmContractHelpersError (468) */ + /** @name PalletEvmContractHelpersError (470) */ interface PalletEvmContractHelpersError extends Enum { readonly isNoPermission: boolean; readonly isNoPendingSponsor: boolean; @@ -3754,14 +3754,14 @@ readonly type: 'NoPermission' | 'NoPendingSponsor' | 'TooManyMethodsHaveSponsoredLimit'; } - /** @name PalletEvmMigrationError (469) */ + /** @name PalletEvmMigrationError (471) */ interface PalletEvmMigrationError extends Enum { readonly isAccountNotEmpty: boolean; readonly isAccountIsNotMigrating: boolean; readonly type: 'AccountNotEmpty' | 'AccountIsNotMigrating'; } - /** @name SpRuntimeMultiSignature (471) */ + /** @name SpRuntimeMultiSignature (473) */ interface SpRuntimeMultiSignature extends Enum { readonly isEd25519: boolean; readonly asEd25519: SpCoreEd25519Signature; @@ -3772,37 +3772,37 @@ readonly type: 'Ed25519' | 'Sr25519' | 'Ecdsa'; } - /** @name SpCoreEd25519Signature (472) */ + /** @name SpCoreEd25519Signature (474) */ interface SpCoreEd25519Signature extends U8aFixed {} - /** @name SpCoreSr25519Signature (474) */ + /** @name SpCoreSr25519Signature (476) */ interface SpCoreSr25519Signature extends U8aFixed {} - /** @name SpCoreEcdsaSignature (475) */ + /** @name SpCoreEcdsaSignature (477) */ interface SpCoreEcdsaSignature extends U8aFixed {} - /** @name FrameSystemExtensionsCheckSpecVersion (478) */ + /** @name FrameSystemExtensionsCheckSpecVersion (480) */ type FrameSystemExtensionsCheckSpecVersion = Null; - /** @name FrameSystemExtensionsCheckTxVersion (479) */ + /** @name FrameSystemExtensionsCheckTxVersion (481) */ type FrameSystemExtensionsCheckTxVersion = Null; - /** @name FrameSystemExtensionsCheckGenesis (480) */ + /** @name FrameSystemExtensionsCheckGenesis (482) */ type FrameSystemExtensionsCheckGenesis = Null; - /** @name FrameSystemExtensionsCheckNonce (483) */ + /** @name FrameSystemExtensionsCheckNonce (485) */ interface FrameSystemExtensionsCheckNonce extends Compact {} - /** @name FrameSystemExtensionsCheckWeight (484) */ + /** @name FrameSystemExtensionsCheckWeight (486) */ type FrameSystemExtensionsCheckWeight = Null; - /** @name PalletTemplateTransactionPaymentChargeTransactionPayment (485) */ + /** @name PalletTemplateTransactionPaymentChargeTransactionPayment (487) */ interface PalletTemplateTransactionPaymentChargeTransactionPayment extends Compact {} - /** @name OpalRuntimeRuntime (486) */ + /** @name OpalRuntimeRuntime (488) */ type OpalRuntimeRuntime = Null; - /** @name PalletEthereumFakeTransactionFinalizer (487) */ + /** @name PalletEthereumFakeTransactionFinalizer (489) */ type PalletEthereumFakeTransactionFinalizer = Null; } // declare module --- a/tests/src/limits.test.ts +++ b/tests/src/limits.test.ts @@ -15,14 +15,14 @@ // along with Unique Network. If not, see . import {IKeyringPair} from '@polkadot/types/types'; -import {expect, itSub, Pallets, requirePalletsOrSkip, usingPlaygrounds} from './util/playgrounds'; +import {expect, itSub, Pallets, requirePalletsOrSkip, usingPlaygrounds} from './util'; describe('Number of tokens per address (NFT)', () => { let alice: IKeyringPair; before(async () => { await usingPlaygrounds(async (helper, privateKey) => { - const donor = privateKey('//Alice'); + const donor = await privateKey({filename: __filename}); [alice] = await helper.arrange.createAccounts([10n], donor); }); }); @@ -60,7 +60,7 @@ await usingPlaygrounds(async (helper, privateKey) => { requirePalletsOrSkip(this, helper, [Pallets.ReFungible]); - const donor = privateKey('//Alice'); + const donor = await privateKey({filename: __filename}); [alice] = await helper.arrange.createAccounts([10n], donor); }); }); @@ -292,7 +292,7 @@ before(async () => { await usingPlaygrounds(async (helper, privateKey) => { - const donor = privateKey('//Alice'); + const donor = await privateKey({filename: __filename}); [alice, bob, charlie] = await helper.arrange.createAccounts([10n, 10n, 10n], donor); }); }); @@ -333,7 +333,7 @@ before(async () => { await usingPlaygrounds(async (helper, privateKey) => { - const donor = privateKey('//Alice'); + const donor = await privateKey({filename: __filename}); [alice, bob, charlie] = await helper.arrange.createAccounts([10n, 10n, 10n], donor); }); }); @@ -366,7 +366,7 @@ await usingPlaygrounds(async (helper, privateKey) => { requirePalletsOrSkip(this, helper, [Pallets.ReFungible]); - const donor = privateKey('//Alice'); + const donor = await privateKey({filename: __filename}); [alice, bob, charlie] = await helper.arrange.createAccounts([10n, 10n, 10n], donor); }); }); @@ -404,7 +404,7 @@ before(async () => { await usingPlaygrounds(async (helper, privateKey) => { - const donor = privateKey('//Alice'); + const donor = await privateKey({filename: __filename}); [alice] = await helper.arrange.createAccounts([10n], donor); }); }); --- /dev/null +++ b/tests/src/nesting/collectionProperties.test.ts @@ -0,0 +1,261 @@ +// Copyright 2019-2022 Unique Network (Gibraltar) Ltd. +// This file is part of Unique Network. + +// Unique Network is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Unique Network is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Unique Network. If not, see . + +import {IKeyringPair} from '@polkadot/types/types'; +import {itSub, Pallets, usingPlaygrounds, expect} from '../util'; +import {UniqueBaseCollection} from '../util/playgrounds/unique'; + +describe('Integration Test: Collection Properties', () => { + let alice: IKeyringPair; + let bob: IKeyringPair; + + before(async () => { + await usingPlaygrounds(async (helper, privateKey) => { + const donor = await privateKey({filename: __filename}); + [alice, bob] = await helper.arrange.createAccounts([50n, 10n], donor); + }); + }); + + itSub('Properties are initially empty', async ({helper}) => { + const collection = await helper.nft.mintCollection(alice); + expect(await collection.getProperties()).to.be.empty; + }); + + async function testSetsPropertiesForCollection(collection: UniqueBaseCollection) { + // As owner + await expect(collection.setProperties(alice, [{key: 'electron', value: 'come bond'}])).to.be.fulfilled; + + await collection.addAdmin(alice, {Substrate: bob.address}); + + // As administrator + await expect(collection.setProperties(bob, [{key: 'black_hole'}])).to.be.fulfilled; + + const properties = await collection.getProperties(); + expect(properties).to.include.deep.members([ + {key: 'electron', value: 'come bond'}, + {key: 'black_hole', value: ''}, + ]); + } + + itSub('Sets properties for a NFT collection', async ({helper}) => { + await testSetsPropertiesForCollection(await helper.nft.mintCollection(alice)); + }); + + itSub.ifWithPallets('Sets properties for a ReFungible collection', [Pallets.ReFungible], async ({helper}) => { + await testSetsPropertiesForCollection(await helper.rft.mintCollection(alice)); + }); + + async function testCheckValidNames(collection: UniqueBaseCollection) { + // alpha symbols + await expect(collection.setProperties(alice, [{key: 'answer'}])).to.be.fulfilled; + + // numeric symbols + await expect(collection.setProperties(alice, [{key: '451'}])).to.be.fulfilled; + + // underscore symbol + await expect(collection.setProperties(alice, [{key: 'black_hole'}])).to.be.fulfilled; + + // dash symbol + await expect(collection.setProperties(alice, [{key: '-'}])).to.be.fulfilled; + + // dot symbol + await expect(collection.setProperties(alice, [{key: 'once.in.a.long.long.while...', value: 'you get a little lost'}])).to.be.fulfilled; + + const properties = await collection.getProperties(); + expect(properties).to.include.deep.members([ + {key: 'answer', value: ''}, + {key: '451', value: ''}, + {key: 'black_hole', value: ''}, + {key: '-', value: ''}, + {key: 'once.in.a.long.long.while...', value: 'you get a little lost'}, + ]); + } + + itSub('Check valid names for NFT collection properties keys', async ({helper}) => { + await testCheckValidNames(await helper.nft.mintCollection(alice)); + }); + + itSub.ifWithPallets('Check valid names for ReFungible collection properties keys', [Pallets.ReFungible], async ({helper}) => { + await testCheckValidNames(await helper.rft.mintCollection(alice)); + }); + + async function testChangesProperties(collection: UniqueBaseCollection) { + await expect(collection.setProperties(alice, [{key: 'electron', value: 'come bond'}, {key: 'black_hole', value: ''}])).to.be.fulfilled; + + // Mutate the properties + await expect(collection.setProperties(alice, [{key: 'black_hole', value: 'LIGO'}])).to.be.fulfilled; + + const properties = await collection.getProperties(); + expect(properties).to.include.deep.members([ + {key: 'electron', value: 'come bond'}, + {key: 'black_hole', value: 'LIGO'}, + ]); + } + + itSub('Changes properties of a NFT collection', async ({helper}) => { + await testChangesProperties(await helper.nft.mintCollection(alice)); + }); + + itSub.ifWithPallets('Changes properties of a ReFungible collection', [Pallets.ReFungible], async ({helper}) => { + await testChangesProperties(await helper.rft.mintCollection(alice)); + }); + + async function testDeleteProperties(collection: UniqueBaseCollection) { + await expect(collection.setProperties(alice, [{key: 'electron', value: 'come bond'}, {key: 'black_hole', value: 'LIGO'}])).to.be.fulfilled; + + await expect(collection.deleteProperties(alice, ['electron'])).to.be.fulfilled; + + const properties = await collection.getProperties(['black_hole', 'electron']); + expect(properties).to.be.deep.equal([ + {key: 'black_hole', value: 'LIGO'}, + ]); + } + + itSub('Deletes properties of a NFT collection', async ({helper}) => { + await testDeleteProperties(await helper.nft.mintCollection(alice)); + }); + + itSub.ifWithPallets('Deletes properties of a ReFungible collection', [Pallets.ReFungible], async ({helper}) => { + await testDeleteProperties(await helper.rft.mintCollection(alice)); + }); +}); + +describe('Negative Integration Test: Collection Properties', () => { + let alice: IKeyringPair; + let bob: IKeyringPair; + + before(async () => { + await usingPlaygrounds(async (helper, privateKey) => { + const donor = await privateKey({filename: __filename}); + [alice, bob] = await helper.arrange.createAccounts([100n, 10n], donor); + }); + }); + + async function testFailsSetPropertiesIfNotOwnerOrAdmin(collection: UniqueBaseCollection) { + await expect(collection.setProperties(bob, [{key: 'electron', value: 'come bond'}, {key: 'black_hole', value: 'LIGO'}])) + .to.be.rejectedWith(/common\.NoPermission/); + + expect(await collection.getProperties()).to.be.empty; + } + + itSub('Fails to set properties in a NFT collection if not its onwer/administrator', async ({helper}) => { + await testFailsSetPropertiesIfNotOwnerOrAdmin(await helper.nft.mintCollection(alice)); + }); + + itSub.ifWithPallets('Fails to set properties in a ReFungible collection if not its onwer/administrator', [Pallets.ReFungible], async ({helper}) => { + await testFailsSetPropertiesIfNotOwnerOrAdmin(await helper.rft.mintCollection(alice)); + }); + + async function testFailsSetPropertiesThatExeedLimits(collection: UniqueBaseCollection) { + const spaceLimit = (await (collection.helper!.api! as any).query.common.collectionProperties(collection.collectionId)).spaceLimit.toNumber(); + + // Mute the general tx parsing error, too many bytes to process + { + console.error = () => {}; + await expect(collection.setProperties(alice, [ + {key: 'electron', value: 'low high '.repeat(Math.ceil(spaceLimit! / 9))}, + ])).to.be.rejected; + } + + expect(await collection.getProperties(['electron'])).to.be.empty; + + await expect(collection.setProperties(alice, [ + {key: 'electron', value: 'low high '.repeat(Math.ceil(spaceLimit! / 18))}, + {key: 'black_hole', value: '0'.repeat(Math.ceil(spaceLimit! / 2))}, + ])).to.be.rejectedWith(/common\.NoSpaceForProperty/); + + expect(await collection.getProperties(['electron', 'black_hole'])).to.be.empty; + } + + itSub('Fails to set properties that exceed the limits (NFT)', async ({helper}) => { + await testFailsSetPropertiesThatExeedLimits(await helper.nft.mintCollection(alice)); + }); + + itSub.ifWithPallets('Fails to set properties that exceed the limits (ReFungible)', [Pallets.ReFungible], async ({helper}) => { + await testFailsSetPropertiesThatExeedLimits(await helper.rft.mintCollection(alice)); + }); + + async function testFailsSetMorePropertiesThanAllowed(collection: UniqueBaseCollection) { + const propertiesToBeSet = []; + for (let i = 0; i < 65; i++) { + propertiesToBeSet.push({ + key: 'electron_' + i, + value: Math.random() > 0.5 ? 'high' : 'low', + }); + } + + await expect(collection.setProperties(alice, propertiesToBeSet)). + to.be.rejectedWith(/common\.PropertyLimitReached/); + + expect(await collection.getProperties()).to.be.empty; + } + + itSub('Fails to set more properties than it is allowed (NFT)', async ({helper}) => { + await testFailsSetMorePropertiesThanAllowed(await helper.nft.mintCollection(alice)); + }); + + itSub.ifWithPallets('Fails to set more properties than it is allowed (ReFungible)', [Pallets.ReFungible], async ({helper}) => { + await testFailsSetMorePropertiesThanAllowed(await helper.rft.mintCollection(alice)); + }); + + async function testFailsSetPropertiesWithInvalidNames(collection: UniqueBaseCollection) { + const invalidProperties = [ + [{key: 'electron', value: 'negative'}, {key: 'string theory', value: 'understandable'}], + [{key: 'Mr/Sandman', value: 'Bring me a gene'}], + [{key: 'déjà vu', value: 'hmm...'}], + ]; + + for (let i = 0; i < invalidProperties.length; i++) { + await expect( + collection.setProperties(alice, invalidProperties[i]), + `on rejecting the new badly-named property #${i}`, + ).to.be.rejectedWith(/common\.InvalidCharacterInPropertyKey/); + } + + await expect( + collection.setProperties(alice, [{key: '', value: 'nothing must not exist'}]), + 'on rejecting an unnamed property', + ).to.be.rejectedWith(/common\.EmptyPropertyKey/); + + await expect( + collection.setProperties(alice, [{key: 'CRISPR-Cas9', value: 'rewriting nature!'}]), + 'on setting the correctly-but-still-badly-named property', + ).to.be.fulfilled; + + const keys = invalidProperties.flatMap(propertySet => propertySet.map(property => property.key)).concat('CRISPR-Cas9').concat(''); + + const properties = await collection.getProperties(keys); + expect(properties).to.be.deep.equal([ + {key: 'CRISPR-Cas9', value: 'rewriting nature!'}, + ]); + + for (let i = 0; i < invalidProperties.length; i++) { + await expect( + collection.deleteProperties(alice, invalidProperties[i].map(propertySet => propertySet.key)), + `on trying to delete the non-existent badly-named property #${i}`, + ).to.be.rejectedWith(/common\.InvalidCharacterInPropertyKey/); + } + } + + itSub('Fails to set properties with invalid names (NFT)', async ({helper}) => { + await testFailsSetPropertiesWithInvalidNames(await helper.nft.mintCollection(alice)); + }); + + itSub.ifWithPallets('Fails to set properties with invalid names (ReFungible)', [Pallets.ReFungible], async ({helper}) => { + await testFailsSetPropertiesWithInvalidNames(await helper.rft.mintCollection(alice)); + }); +}); + \ No newline at end of file --- a/tests/src/nesting/graphs.test.ts +++ b/tests/src/nesting/graphs.test.ts @@ -15,7 +15,7 @@ // along with Unique Network. If not, see . import {IKeyringPair} from '@polkadot/types/types'; -import {expect, itSub, usingPlaygrounds} from '../util/playgrounds'; +import {expect, itSub, usingPlaygrounds} from '../util'; import {UniqueHelper, UniqueNFToken} from '../util/playgrounds/unique'; /** @@ -45,7 +45,7 @@ before(async () => { await usingPlaygrounds(async (helper, privateKey) => { - const donor = privateKey('//Alice'); + const donor = await privateKey({filename: __filename}); [alice] = await helper.arrange.createAccounts([10n], donor); }); }); --- a/tests/src/nesting/nest.test.ts +++ b/tests/src/nesting/nest.test.ts @@ -15,7 +15,7 @@ // along with Unique Network. If not, see . import {IKeyringPair} from '@polkadot/types/types'; -import {expect, itSub, Pallets, usingPlaygrounds} from '../util/playgrounds'; +import {expect, itSub, Pallets, usingPlaygrounds} from '../util'; describe('Integration Test: Composite nesting tests', () => { let alice: IKeyringPair; @@ -23,7 +23,7 @@ before(async () => { await usingPlaygrounds(async (helper, privateKey) => { - const donor = privateKey('//Alice'); + const donor = await privateKey({filename: __filename}); [alice, bob] = await helper.arrange.createAccounts([50n, 10n], donor); }); }); @@ -137,7 +137,7 @@ before(async () => { await usingPlaygrounds(async (helper, privateKey) => { - const donor = privateKey('//Alice'); + const donor = await privateKey({filename: __filename}); [alice, bob, charlie] = await helper.arrange.createAccounts([50n, 10n, 10n], donor); }); }); @@ -343,7 +343,7 @@ before(async () => { await usingPlaygrounds(async (helper, privateKey) => { - const donor = privateKey('//Alice'); + const donor = await privateKey({filename: __filename}); [alice, bob] = await helper.arrange.createAccounts([100n, 50n], donor); }); }); --- a/tests/src/nesting/properties.test.ts +++ /dev/null @@ -1,1047 +0,0 @@ -// Copyright 2019-2022 Unique Network (Gibraltar) Ltd. -// This file is part of Unique Network. - -// Unique Network is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Unique Network is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Unique Network. If not, see . - -import {IKeyringPair} from '@polkadot/types/types'; -import {itSub, Pallets, requirePalletsOrSkip, usingPlaygrounds, expect} from '../util/playgrounds'; -import {UniqueHelper, UniqueBaseCollection, UniqueNFTCollection, UniqueNFToken, UniqueRFTCollection, UniqueRFToken} from '../util/playgrounds/unique'; - -// ---------- COLLECTION PROPERTIES - -describe('Integration Test: Collection Properties', () => { - let alice: IKeyringPair; - let bob: IKeyringPair; - - before(async () => { - await usingPlaygrounds(async (helper, privateKey) => { - const donor = privateKey('//Alice'); - [alice, bob] = await helper.arrange.createAccounts([50n, 10n], donor); - }); - }); - - itSub('Properties are initially empty', async ({helper}) => { - const collection = await helper.nft.mintCollection(alice); - expect(await collection.getProperties()).to.be.empty; - }); - - async function testSetsPropertiesForCollection(collection: UniqueBaseCollection) { - // As owner - await expect(collection.setProperties(alice, [{key: 'electron', value: 'come bond'}])).to.be.fulfilled; - - await collection.addAdmin(alice, {Substrate: bob.address}); - - // As administrator - await expect(collection.setProperties(bob, [{key: 'black_hole'}])).to.be.fulfilled; - - const properties = await collection.getProperties(); - expect(properties).to.include.deep.members([ - {key: 'electron', value: 'come bond'}, - {key: 'black_hole', value: ''}, - ]); - } - - itSub('Sets properties for a NFT collection', async ({helper}) => { - await testSetsPropertiesForCollection(await helper.nft.mintCollection(alice)); - }); - - itSub.ifWithPallets('Sets properties for a ReFungible collection', [Pallets.ReFungible], async ({helper}) => { - await testSetsPropertiesForCollection(await helper.rft.mintCollection(alice)); - }); - - async function testCheckValidNames(collection: UniqueBaseCollection) { - // alpha symbols - await expect(collection.setProperties(alice, [{key: 'answer'}])).to.be.fulfilled; - - // numeric symbols - await expect(collection.setProperties(alice, [{key: '451'}])).to.be.fulfilled; - - // underscore symbol - await expect(collection.setProperties(alice, [{key: 'black_hole'}])).to.be.fulfilled; - - // dash symbol - await expect(collection.setProperties(alice, [{key: '-'}])).to.be.fulfilled; - - // dot symbol - await expect(collection.setProperties(alice, [{key: 'once.in.a.long.long.while...', value: 'you get a little lost'}])).to.be.fulfilled; - - const properties = await collection.getProperties(); - expect(properties).to.include.deep.members([ - {key: 'answer', value: ''}, - {key: '451', value: ''}, - {key: 'black_hole', value: ''}, - {key: '-', value: ''}, - {key: 'once.in.a.long.long.while...', value: 'you get a little lost'}, - ]); - } - - itSub('Check valid names for NFT collection properties keys', async ({helper}) => { - await testCheckValidNames(await helper.nft.mintCollection(alice)); - }); - - itSub.ifWithPallets('Check valid names for ReFungible collection properties keys', [Pallets.ReFungible], async ({helper}) => { - await testCheckValidNames(await helper.rft.mintCollection(alice)); - }); - - async function testChangesProperties(collection: UniqueBaseCollection) { - await expect(collection.setProperties(alice, [{key: 'electron', value: 'come bond'}, {key: 'black_hole', value: ''}])).to.be.fulfilled; - - // Mutate the properties - await expect(collection.setProperties(alice, [{key: 'black_hole', value: 'LIGO'}])).to.be.fulfilled; - - const properties = await collection.getProperties(); - expect(properties).to.include.deep.members([ - {key: 'electron', value: 'come bond'}, - {key: 'black_hole', value: 'LIGO'}, - ]); - } - - itSub('Changes properties of a NFT collection', async ({helper}) => { - await testChangesProperties(await helper.nft.mintCollection(alice)); - }); - - itSub.ifWithPallets('Changes properties of a ReFungible collection', [Pallets.ReFungible], async ({helper}) => { - await testChangesProperties(await helper.rft.mintCollection(alice)); - }); - - async function testDeleteProperties(collection: UniqueBaseCollection) { - await expect(collection.setProperties(alice, [{key: 'electron', value: 'come bond'}, {key: 'black_hole', value: 'LIGO'}])).to.be.fulfilled; - - await expect(collection.deleteProperties(alice, ['electron'])).to.be.fulfilled; - - const properties = await collection.getProperties(['black_hole', 'electron']); - expect(properties).to.be.deep.equal([ - {key: 'black_hole', value: 'LIGO'}, - ]); - } - - itSub('Deletes properties of a NFT collection', async ({helper}) => { - await testDeleteProperties(await helper.nft.mintCollection(alice)); - }); - - itSub.ifWithPallets('Deletes properties of a ReFungible collection', [Pallets.ReFungible], async ({helper}) => { - await testDeleteProperties(await helper.rft.mintCollection(alice)); - }); -}); - -describe('Negative Integration Test: Collection Properties', () => { - let alice: IKeyringPair; - let bob: IKeyringPair; - - before(async () => { - await usingPlaygrounds(async (helper, privateKey) => { - const donor = privateKey('//Alice'); - [alice, bob] = await helper.arrange.createAccounts([100n, 10n], donor); - }); - }); - - async function testFailsSetPropertiesIfNotOwnerOrAdmin(collection: UniqueBaseCollection) { - await expect(collection.setProperties(bob, [{key: 'electron', value: 'come bond'}, {key: 'black_hole', value: 'LIGO'}])) - .to.be.rejectedWith(/common\.NoPermission/); - - expect(await collection.getProperties()).to.be.empty; - } - - itSub('Fails to set properties in a NFT collection if not its onwer/administrator', async ({helper}) => { - await testFailsSetPropertiesIfNotOwnerOrAdmin(await helper.nft.mintCollection(alice)); - }); - - itSub.ifWithPallets('Fails to set properties in a ReFungible collection if not its onwer/administrator', [Pallets.ReFungible], async ({helper}) => { - await testFailsSetPropertiesIfNotOwnerOrAdmin(await helper.rft.mintCollection(alice)); - }); - - async function testFailsSetPropertiesThatExeedLimits(collection: UniqueBaseCollection) { - const spaceLimit = (await (collection.helper!.api! as any).query.common.collectionProperties(collection.collectionId)).spaceLimit.toNumber(); - - // Mute the general tx parsing error, too many bytes to process - { - console.error = () => {}; - await expect(collection.setProperties(alice, [ - {key: 'electron', value: 'low high '.repeat(Math.ceil(spaceLimit! / 9))}, - ])).to.be.rejected; - } - - expect(await collection.getProperties(['electron'])).to.be.empty; - - await expect(collection.setProperties(alice, [ - {key: 'electron', value: 'low high '.repeat(Math.ceil(spaceLimit! / 18))}, - {key: 'black_hole', value: '0'.repeat(Math.ceil(spaceLimit! / 2))}, - ])).to.be.rejectedWith(/common\.NoSpaceForProperty/); - - expect(await collection.getProperties(['electron', 'black_hole'])).to.be.empty; - } - - itSub('Fails to set properties that exceed the limits (NFT)', async ({helper}) => { - await testFailsSetPropertiesThatExeedLimits(await helper.nft.mintCollection(alice)); - }); - - itSub.ifWithPallets('Fails to set properties that exceed the limits (ReFungible)', [Pallets.ReFungible], async ({helper}) => { - await testFailsSetPropertiesThatExeedLimits(await helper.rft.mintCollection(alice)); - }); - - async function testFailsSetMorePropertiesThanAllowed(collection: UniqueBaseCollection) { - const propertiesToBeSet = []; - for (let i = 0; i < 65; i++) { - propertiesToBeSet.push({ - key: 'electron_' + i, - value: Math.random() > 0.5 ? 'high' : 'low', - }); - } - - await expect(collection.setProperties(alice, propertiesToBeSet)). - to.be.rejectedWith(/common\.PropertyLimitReached/); - - expect(await collection.getProperties()).to.be.empty; - } - - itSub('Fails to set more properties than it is allowed (NFT)', async ({helper}) => { - await testFailsSetMorePropertiesThanAllowed(await helper.nft.mintCollection(alice)); - }); - - itSub.ifWithPallets('Fails to set more properties than it is allowed (ReFungible)', [Pallets.ReFungible], async ({helper}) => { - await testFailsSetMorePropertiesThanAllowed(await helper.rft.mintCollection(alice)); - }); - - async function testFailsSetPropertiesWithInvalidNames(collection: UniqueBaseCollection) { - const invalidProperties = [ - [{key: 'electron', value: 'negative'}, {key: 'string theory', value: 'understandable'}], - [{key: 'Mr/Sandman', value: 'Bring me a gene'}], - [{key: 'déjà vu', value: 'hmm...'}], - ]; - - for (let i = 0; i < invalidProperties.length; i++) { - await expect( - collection.setProperties(alice, invalidProperties[i]), - `on rejecting the new badly-named property #${i}`, - ).to.be.rejectedWith(/common\.InvalidCharacterInPropertyKey/); - } - - await expect( - collection.setProperties(alice, [{key: '', value: 'nothing must not exist'}]), - 'on rejecting an unnamed property', - ).to.be.rejectedWith(/common\.EmptyPropertyKey/); - - await expect( - collection.setProperties(alice, [{key: 'CRISPR-Cas9', value: 'rewriting nature!'}]), - 'on setting the correctly-but-still-badly-named property', - ).to.be.fulfilled; - - const keys = invalidProperties.flatMap(propertySet => propertySet.map(property => property.key)).concat('CRISPR-Cas9').concat(''); - - const properties = await collection.getProperties(keys); - expect(properties).to.be.deep.equal([ - {key: 'CRISPR-Cas9', value: 'rewriting nature!'}, - ]); - - for (let i = 0; i < invalidProperties.length; i++) { - await expect( - collection.deleteProperties(alice, invalidProperties[i].map(propertySet => propertySet.key)), - `on trying to delete the non-existent badly-named property #${i}`, - ).to.be.rejectedWith(/common\.InvalidCharacterInPropertyKey/); - } - } - - itSub('Fails to set properties with invalid names (NFT)', async ({helper}) => { - await testFailsSetPropertiesWithInvalidNames(await helper.nft.mintCollection(alice)); - }); - - itSub.ifWithPallets('Fails to set properties with invalid names (ReFungible)', [Pallets.ReFungible], async ({helper}) => { - await testFailsSetPropertiesWithInvalidNames(await helper.rft.mintCollection(alice)); - }); -}); - -// ---------- ACCESS RIGHTS - -describe('Integration Test: Access Rights to Token Properties', () => { - let alice: IKeyringPair; - let bob: IKeyringPair; - - before(async () => { - await usingPlaygrounds(async (helper, privateKey) => { - const donor = privateKey('//Alice'); - [alice, bob] = await helper.arrange.createAccounts([100n, 10n], donor); - }); - }); - - itSub('Reads access rights to properties of a collection', async ({helper}) => { - const collection = await helper.nft.mintCollection(alice); - const propertyRights = (await helper.callRpc('api.query.common.collectionPropertyPermissions', [collection.collectionId])).toJSON(); - expect(propertyRights).to.be.empty; - }); - - async function testSetsAccessRightsToProperties(collection: UniqueNFTCollection | UniqueRFTCollection) { - await expect(collection.setTokenPropertyPermissions(alice, [{key: 'skullduggery', permission: {mutable: true}}])) - .to.be.fulfilled; - - await collection.addAdmin(alice, {Substrate: bob.address}); - - await expect(collection.setTokenPropertyPermissions(bob, [{key: 'mindgame', permission: {collectionAdmin: true, tokenOwner: false}}])) - .to.be.fulfilled; - - const propertyRights = await collection.getPropertyPermissions(['skullduggery', 'mindgame']); - expect(propertyRights).to.include.deep.members([ - {key: 'skullduggery', permission: {mutable: true, collectionAdmin: false, tokenOwner: false}}, - {key: 'mindgame', permission: {mutable: false, collectionAdmin: true, tokenOwner: false}}, - ]); - } - - itSub('Sets access rights to properties of a collection (NFT)', async ({helper}) => { - await testSetsAccessRightsToProperties(await helper.nft.mintCollection(alice)); - }); - - itSub.ifWithPallets('Sets access rights to properties of a collection (ReFungible)', [Pallets.ReFungible], async ({helper}) => { - await testSetsAccessRightsToProperties(await helper.rft.mintCollection(alice)); - }); - - async function testChangesAccessRightsToProperty(collection: UniqueNFTCollection | UniqueRFTCollection) { - await expect(collection.setTokenPropertyPermissions(alice, [{key: 'skullduggery', permission: {mutable: true, collectionAdmin: true}}])) - .to.be.fulfilled; - - await expect(collection.setTokenPropertyPermissions(alice, [{key: 'skullduggery', permission: {mutable: false, tokenOwner: true}}])) - .to.be.fulfilled; - - const propertyRights = await collection.getPropertyPermissions(); - expect(propertyRights).to.be.deep.equal([ - {key: 'skullduggery', permission: {'mutable': false, 'collectionAdmin': false, 'tokenOwner': true}}, - ]); - } - - itSub('Changes access rights to properties of a NFT collection', async ({helper}) => { - await testChangesAccessRightsToProperty(await helper.nft.mintCollection(alice)); - }); - - itSub.ifWithPallets('Changes access rights to properties of a ReFungible collection', [Pallets.ReFungible], async ({helper}) => { - await testChangesAccessRightsToProperty(await helper.rft.mintCollection(alice)); - }); -}); - -describe('Negative Integration Test: Access Rights to Token Properties', () => { - let alice: IKeyringPair; - let bob: IKeyringPair; - - before(async () => { - await usingPlaygrounds(async (helper, privateKey) => { - const donor = privateKey('//Alice'); - [alice, bob] = await helper.arrange.createAccounts([50n, 10n], donor); - }); - }); - - async function testPreventsFromSettingAccessRightsNotAdminOrOwner(collection: UniqueNFTCollection | UniqueRFTCollection) { - await expect(collection.setTokenPropertyPermissions(bob, [{key: 'skullduggery', permission: {mutable: true, tokenOwner: true}}])) - .to.be.rejectedWith(/common\.NoPermission/); - - const propertyRights = await collection.getPropertyPermissions(['skullduggery']); - expect(propertyRights).to.be.empty; - } - - itSub('Prevents from setting access rights to properties of a NFT collection if not an onwer/admin', async ({helper}) => { - await testPreventsFromSettingAccessRightsNotAdminOrOwner(await helper.nft.mintCollection(alice)); - }); - - itSub.ifWithPallets('Prevents from setting access rights to properties of a ReFungible collection if not an onwer/admin', [Pallets.ReFungible], async ({helper}) => { - await testPreventsFromSettingAccessRightsNotAdminOrOwner(await helper.rft.mintCollection(alice)); - }); - - async function testPreventFromAddingTooManyPossibleProperties(collection: UniqueNFTCollection | UniqueRFTCollection) { - const constitution = []; - for (let i = 0; i < 65; i++) { - constitution.push({ - key: 'property_' + i, - permission: Math.random() > 0.5 ? {mutable: true, collectionAdmin: true, tokenOwner: true} : {}, - }); - } - - await expect(collection.setTokenPropertyPermissions(alice, constitution)) - .to.be.rejectedWith(/common\.PropertyLimitReached/); - - const propertyRights = await collection.getPropertyPermissions(); - expect(propertyRights).to.be.empty; - } - - itSub('Prevents from adding too many possible properties (NFT)', async ({helper}) => { - await testPreventFromAddingTooManyPossibleProperties(await helper.nft.mintCollection(alice)); - }); - - itSub.ifWithPallets('Prevents from adding too many possible properties (ReFungible)', [Pallets.ReFungible], async ({helper}) => { - await testPreventFromAddingTooManyPossibleProperties(await helper.rft.mintCollection(alice)); - }); - - async function testPreventAccessRightsModifiedIfConstant(collection: UniqueNFTCollection | UniqueRFTCollection) { - await expect(collection.setTokenPropertyPermissions(alice, [{key: 'skullduggery', permission: {mutable: false, tokenOwner: true}}])) - .to.be.fulfilled; - - await expect(collection.setTokenPropertyPermissions(alice, [{key: 'skullduggery', permission: {collectionAdmin: true}}])) - .to.be.rejectedWith(/common\.NoPermission/); - - const propertyRights = await collection.getPropertyPermissions(['skullduggery']); - expect(propertyRights).to.deep.equal([ - {key: 'skullduggery', permission: {'mutable': false, 'collectionAdmin': false, 'tokenOwner': true}}, - ]); - } - - itSub('Prevents access rights to be modified if constant (NFT)', async ({helper}) => { - await testPreventAccessRightsModifiedIfConstant(await helper.nft.mintCollection(alice)); - }); - - itSub.ifWithPallets('Prevents access rights to be modified if constant (ReFungible)', [Pallets.ReFungible], async ({helper}) => { - await testPreventAccessRightsModifiedIfConstant(await helper.rft.mintCollection(alice)); - }); - - async function testPreventsAddingPropertiesWithInvalidNames(collection: UniqueNFTCollection | UniqueRFTCollection) { - const invalidProperties = [ - [{key: 'skullduggery', permission: {tokenOwner: true}}, {key: 'im possible', permission: {collectionAdmin: true}}], - [{key: 'G#4', permission: {tokenOwner: true}}], - [{key: 'HÆMILTON', permission: {mutable: false, collectionAdmin: true, tokenOwner: true}}], - ]; - - for (let i = 0; i < invalidProperties.length; i++) { - await expect( - collection.setTokenPropertyPermissions(alice, invalidProperties[i]), - `on setting the new badly-named property #${i}`, - ).to.be.rejectedWith(/common\.InvalidCharacterInPropertyKey/); - } - - await expect( - collection.setTokenPropertyPermissions(alice, [{key: '', permission: {}}]), - 'on rejecting an unnamed property', - ).to.be.rejectedWith(/common\.EmptyPropertyKey/); - - const correctKey = '--0x03116e387820CA05'; // PolkadotJS would parse this as an already encoded hex-string - await expect( - collection.setTokenPropertyPermissions(alice, [ - {key: correctKey, permission: {collectionAdmin: true}}, - ]), - 'on setting the correctly-but-still-badly-named property', - ).to.be.fulfilled; - - const keys = invalidProperties.flatMap(propertySet => propertySet.map(property => property.key)).concat(correctKey).concat(''); - - const propertyRights = await collection.getPropertyPermissions(keys); - expect(propertyRights).to.be.deep.equal([ - {key: correctKey, permission: {mutable: false, collectionAdmin: true, tokenOwner: false}}, - ]); - } - - itSub('Prevents adding properties with invalid names (NFT)', async ({helper}) => { - await testPreventsAddingPropertiesWithInvalidNames(await helper.nft.mintCollection(alice)); - }); - - itSub.ifWithPallets('Prevents adding properties with invalid names (ReFungible)', [Pallets.ReFungible], async ({helper}) => { - await testPreventsAddingPropertiesWithInvalidNames(await helper.rft.mintCollection(alice)); - }); -}); - -// ---------- TOKEN PROPERTIES - -describe('Integration Test: Token Properties', () => { - let alice: IKeyringPair; // collection owner - let bob: IKeyringPair; // collection admin - let charlie: IKeyringPair; // token owner - - let permissions: {permission: any, signers: IKeyringPair[]}[]; - - before(async () => { - await usingPlaygrounds(async (helper, privateKey) => { - const donor = privateKey('//Alice'); - [alice, bob, charlie] = await helper.arrange.createAccounts([100n, 100n, 100n], donor); - }); - - // todo:playgrounds probably separate these tests later - permissions = [ - {permission: {mutable: true, collectionAdmin: true}, signers: [alice, bob]}, - {permission: {mutable: false, collectionAdmin: true}, signers: [alice, bob]}, - {permission: {mutable: true, tokenOwner: true}, signers: [charlie]}, - {permission: {mutable: false, tokenOwner: true}, signers: [charlie]}, - {permission: {mutable: true, collectionAdmin: true, tokenOwner: true}, signers: [alice, bob, charlie]}, - {permission: {mutable: false, collectionAdmin: true, tokenOwner: true}, signers: [alice, bob, charlie]}, - ]; - }); - - async function testReadsYetEmptyProperties(token: UniqueNFToken | UniqueRFToken) { - const properties = await token.getProperties(); - expect(properties).to.be.empty; - - const tokenData = await token.getData(); - expect(tokenData!.properties).to.be.empty; - } - - itSub('Reads yet empty properties of a token (NFT)', async ({helper}) => { - const collection = await helper.nft.mintCollection(alice); - const token = await collection.mintToken(alice); - await testReadsYetEmptyProperties(token); - }); - - itSub.ifWithPallets('Reads yet empty properties of a token (ReFungible)', [Pallets.ReFungible], async ({helper}) => { - const collection = await helper.rft.mintCollection(alice); - const token = await collection.mintToken(alice); - await testReadsYetEmptyProperties(token); - }); - - async function testAssignPropertiesAccordingToPermissions(token: UniqueNFToken | UniqueRFToken, pieces: bigint) { - await token.collection.addAdmin(alice, {Substrate: bob.address}); - await token.transfer(alice, {Substrate: charlie.address}, pieces); - - const propertyKeys: string[] = []; - let i = 0; - for (const permission of permissions) { - i++; - let j = 0; - for (const signer of permission.signers) { - j++; - const key = i + '_' + signer.address; - propertyKeys.push(key); - - await expect( - token.collection.setTokenPropertyPermissions(alice, [{key: key, permission: permission.permission}]), - `on setting permission #${i} by alice`, - ).to.be.fulfilled; - - await expect( - token.setProperties(signer, [{key: key, value: 'Serotonin increase'}]), - `on adding property #${i} by signer #${j}`, - ).to.be.fulfilled; - } - } - - const properties = await token.getProperties(propertyKeys); - const tokenData = await token.getData(); - for (let i = 0; i < properties.length; i++) { - expect(properties[i].value).to.be.equal('Serotonin increase'); - expect(tokenData!.properties[i].value).to.be.equal('Serotonin increase'); - } - } - - itSub('Assigns properties to a token according to permissions (NFT)', async ({helper}) => { - const collection = await helper.nft.mintCollection(alice); - const token = await collection.mintToken(alice); - await testAssignPropertiesAccordingToPermissions(token, 1n); - }); - - itSub.ifWithPallets('Assigns properties to a token according to permissions (ReFungible)', [Pallets.ReFungible], async ({helper}) => { - const collection = await helper.rft.mintCollection(alice); - const token = await collection.mintToken(alice, 100n); - await testAssignPropertiesAccordingToPermissions(token, 100n); - }); - - async function testChangesPropertiesAccordingPermission(token: UniqueNFToken | UniqueRFToken, pieces: bigint) { - await token.collection.addAdmin(alice, {Substrate: bob.address}); - await token.transfer(alice, {Substrate: charlie.address}, pieces); - - const propertyKeys: string[] = []; - let i = 0; - for (const permission of permissions) { - i++; - if (!permission.permission.mutable) continue; - - let j = 0; - for (const signer of permission.signers) { - j++; - const key = i + '_' + signer.address; - propertyKeys.push(key); - - await expect( - token.collection.setTokenPropertyPermissions(alice, [{key: key, permission: permission.permission}]), - `on setting permission #${i} by alice`, - ).to.be.fulfilled; - - await expect( - token.setProperties(signer, [{key, value: 'Serotonin increase'}]), - `on adding property #${i} by signer #${j}`, - ).to.be.fulfilled; - - await expect( - token.setProperties(signer, [{key, value: 'Serotonin stable'}]), - `on changing property #${i} by signer #${j}`, - ).to.be.fulfilled; - } - } - - const properties = await token.getProperties(propertyKeys); - const tokenData = await token.getData(); - for (let i = 0; i < properties.length; i++) { - expect(properties[i].value).to.be.equal('Serotonin stable'); - expect(tokenData!.properties[i].value).to.be.equal('Serotonin stable'); - } - } - - itSub('Changes properties of a token according to permissions (NFT)', async ({helper}) => { - const collection = await helper.nft.mintCollection(alice); - const token = await collection.mintToken(alice); - await testChangesPropertiesAccordingPermission(token, 1n); - }); - - itSub.ifWithPallets('Changes properties of a token according to permissions (ReFungible)', [Pallets.ReFungible], async ({helper}) => { - const collection = await helper.rft.mintCollection(alice); - const token = await collection.mintToken(alice, 100n); - await testChangesPropertiesAccordingPermission(token, 100n); - }); - - async function testDeletePropertiesAccordingPermission(token: UniqueNFToken | UniqueRFToken, pieces: bigint) { - await token.collection.addAdmin(alice, {Substrate: bob.address}); - await token.transfer(alice, {Substrate: charlie.address}, pieces); - - const propertyKeys: string[] = []; - let i = 0; - - for (const permission of permissions) { - i++; - if (!permission.permission.mutable) continue; - - let j = 0; - for (const signer of permission.signers) { - j++; - const key = i + '_' + signer.address; - propertyKeys.push(key); - - await expect( - token.collection.setTokenPropertyPermissions(alice, [{key: key, permission: permission.permission}]), - `on setting permission #${i} by alice`, - ).to.be.fulfilled; - - await expect( - token.setProperties(signer, [{key, value: 'Serotonin increase'}]), - `on adding property #${i} by signer #${j}`, - ).to.be.fulfilled; - - await expect( - token.deleteProperties(signer, [key]), - `on deleting property #${i} by signer #${j}`, - ).to.be.fulfilled; - } - } - - expect(await token.getProperties(propertyKeys)).to.be.empty; - expect((await token.getData())!.properties).to.be.empty; - } - - itSub('Deletes properties of a token according to permissions (NFT)', async ({helper}) => { - const collection = await helper.nft.mintCollection(alice); - const token = await collection.mintToken(alice); - await testDeletePropertiesAccordingPermission(token, 1n); - }); - - itSub.ifWithPallets('Deletes properties of a token according to permissions (ReFungible)', [Pallets.ReFungible], async ({helper}) => { - const collection = await helper.rft.mintCollection(alice); - const token = await collection.mintToken(alice, 100n); - await testDeletePropertiesAccordingPermission(token, 100n); - }); - - itSub('Assigns properties to a nested token according to permissions', async ({helper}) => { - const collectionA = await helper.nft.mintCollection(alice, {permissions: {nesting: {tokenOwner: true}}}); - const collectionB = await helper.nft.mintCollection(alice); - const targetToken = await collectionA.mintToken(alice); - const nestedToken = await collectionB.mintToken(alice, targetToken.nestingAccount()); - - await collectionB.addAdmin(alice, {Substrate: bob.address}); - await targetToken.transfer(alice, {Substrate: charlie.address}); - - const propertyKeys: string[] = []; - let i = 0; - for (const permission of permissions) { - i++; - let j = 0; - for (const signer of permission.signers) { - j++; - const key = i + '_' + signer.address; - propertyKeys.push(key); - - await expect( - nestedToken.collection.setTokenPropertyPermissions(alice, [{key: key, permission: permission.permission}]), - `on setting permission #${i} by alice`, - ).to.be.fulfilled; - - await expect( - nestedToken.setProperties(signer, [{key, value: 'Serotonin increase'}]), - `on adding property #${i} by signer #${j}`, - ).to.be.fulfilled; - } - } - - const properties = await nestedToken.getProperties(propertyKeys); - const tokenData = await nestedToken.getData(); - for (let i = 0; i < properties.length; i++) { - expect(properties[i].value).to.be.equal('Serotonin increase'); - expect(tokenData!.properties[i].value).to.be.equal('Serotonin increase'); - } - expect(await targetToken.getProperties()).to.be.empty; - }); - - itSub('Changes properties of a nested token according to permissions', async ({helper}) => { - const collectionA = await helper.nft.mintCollection(alice, {permissions: {nesting: {tokenOwner: true}}}); - const collectionB = await helper.nft.mintCollection(alice); - const targetToken = await collectionA.mintToken(alice); - const nestedToken = await collectionB.mintToken(alice, targetToken.nestingAccount()); - - await collectionB.addAdmin(alice, {Substrate: bob.address}); - await targetToken.transfer(alice, {Substrate: charlie.address}); - - const propertyKeys: string[] = []; - let i = 0; - for (const permission of permissions) { - i++; - if (!permission.permission.mutable) continue; - - let j = 0; - for (const signer of permission.signers) { - j++; - const key = i + '_' + signer.address; - propertyKeys.push(key); - - await expect( - nestedToken.collection.setTokenPropertyPermissions(alice, [{key: key, permission: permission.permission}]), - `on setting permission #${i} by alice`, - ).to.be.fulfilled; - - await expect( - nestedToken.setProperties(signer, [{key, value: 'Serotonin increase'}]), - `on adding property #${i} by signer #${j}`, - ).to.be.fulfilled; - - await expect( - nestedToken.setProperties(signer, [{key, value: 'Serotonin stable'}]), - `on changing property #${i} by signer #${j}`, - ).to.be.fulfilled; - } - } - - const properties = await nestedToken.getProperties(propertyKeys); - const tokenData = await nestedToken.getData(); - for (let i = 0; i < properties.length; i++) { - expect(properties[i].value).to.be.equal('Serotonin stable'); - expect(tokenData!.properties[i].value).to.be.equal('Serotonin stable'); - } - expect(await targetToken.getProperties()).to.be.empty; - }); - - itSub('Deletes properties of a nested token according to permissions', async ({helper}) => { - const collectionA = await helper.nft.mintCollection(alice, {permissions: {nesting: {tokenOwner: true}}}); - const collectionB = await helper.nft.mintCollection(alice); - const targetToken = await collectionA.mintToken(alice); - const nestedToken = await collectionB.mintToken(alice, targetToken.nestingAccount()); - - await collectionB.addAdmin(alice, {Substrate: bob.address}); - await targetToken.transfer(alice, {Substrate: charlie.address}); - - const propertyKeys: string[] = []; - let i = 0; - for (const permission of permissions) { - i++; - if (!permission.permission.mutable) continue; - - let j = 0; - for (const signer of permission.signers) { - j++; - const key = i + '_' + signer.address; - propertyKeys.push(key); - - await expect( - nestedToken.collection.setTokenPropertyPermissions(alice, [{key: key, permission: permission.permission}]), - `on setting permission #${i} by alice`, - ).to.be.fulfilled; - - await expect( - nestedToken.setProperties(signer, [{key, value: 'Serotonin increase'}]), - `on adding property #${i} by signer #${j}`, - ).to.be.fulfilled; - - await expect( - nestedToken.deleteProperties(signer, [key]), - `on deleting property #${i} by signer #${j}`, - ).to.be.fulfilled; - } - } - - expect(await nestedToken.getProperties(propertyKeys)).to.be.empty; - expect((await nestedToken.getData())!.properties).to.be.empty; - expect(await targetToken.getProperties()).to.be.empty; - }); -}); - -describe('Negative Integration Test: Token Properties', () => { - let alice: IKeyringPair; // collection owner - let bob: IKeyringPair; // collection admin - let charlie: IKeyringPair; // token owner - - let constitution: {permission: any, signers: IKeyringPair[], sinner: IKeyringPair}[]; - - before(async () => { - await usingPlaygrounds(async (helper, privateKey) => { - const donor = privateKey('//Alice'); - let dave: IKeyringPair; - [alice, bob, charlie, dave] = await helper.arrange.createAccounts([100n, 100n, 100n, 100n], donor); - - // todo:playgrounds probably separate these tests later - constitution = [ - {permission: {mutable: true, collectionAdmin: true}, signers: [alice, bob], sinner: charlie}, - {permission: {mutable: false, collectionAdmin: true}, signers: [alice, bob], sinner: charlie}, - {permission: {mutable: true, tokenOwner: true}, signers: [charlie], sinner: alice}, - {permission: {mutable: false, tokenOwner: true}, signers: [charlie], sinner: alice}, - {permission: {mutable: true, collectionAdmin: true, tokenOwner: true}, signers: [alice, bob, charlie], sinner: dave}, - {permission: {mutable: false, collectionAdmin: true, tokenOwner: true}, signers: [alice, bob, charlie], sinner: dave}, - ]; - }); - }); - - async function getConsumedSpace(api: any, collectionId: number, tokenId: number, mode: 'NFT' | 'RFT'): Promise { - return (await (mode == 'NFT' ? api.query.nonfungible : api.query.refungible).tokenProperties(collectionId, tokenId)).toJSON().consumedSpace; - } - - async function prepare(token: UniqueNFToken | UniqueRFToken, pieces: bigint): Promise { - await token.collection.addAdmin(alice, {Substrate: bob.address}); - await token.transfer(alice, {Substrate: charlie.address}, pieces); - - let i = 0; - for (const passage of constitution) { - i++; - const signer = passage.signers[0]; - - await expect( - token.collection.setTokenPropertyPermissions(alice, [{key: `${i}`, permission: passage.permission}]), - `on setting permission ${i} by alice`, - ).to.be.fulfilled; - - await expect( - token.setProperties(signer, [{key: `${i}`, value: 'Serotonin increase'}]), - `on adding property ${i} by ${signer.address}`, - ).to.be.fulfilled; - } - - const originalSpace = await getConsumedSpace(token.collection.helper.getApi(), token.collectionId, token.tokenId, pieces == 1n ? 'NFT' : 'RFT'); - return originalSpace; - } - - async function testForbidsChangingDeletingPropertiesUserOutsideOfPermissions(token: UniqueNFToken | UniqueRFToken, pieces: bigint) { - const originalSpace = await prepare(token, pieces); - - let i = 0; - for (const forbiddance of constitution) { - i++; - if (!forbiddance.permission.mutable) continue; - - await expect( - token.setProperties(forbiddance.sinner, [{key: `${i}`, value: 'Serotonin down'}]), - `on failing to change property ${i} by the malefactor`, - ).to.be.rejectedWith(/common\.NoPermission/); - - await expect( - token.deleteProperties(forbiddance.sinner, [`${i}`]), - `on failing to delete property ${i} by the malefactor`, - ).to.be.rejectedWith(/common\.NoPermission/); - } - - const consumedSpace = await getConsumedSpace(token.collection.helper.getApi(), token.collectionId, token.tokenId, pieces == 1n ? 'NFT' : 'RFT'); - expect(consumedSpace).to.be.equal(originalSpace); - } - - itSub('Forbids changing/deleting properties of a token if the user is outside of permissions (NFT)', async ({helper}) => { - const collection = await helper.nft.mintCollection(alice); - const token = await collection.mintToken(alice); - await testForbidsChangingDeletingPropertiesUserOutsideOfPermissions(token, 1n); - }); - - itSub.ifWithPallets('Forbids changing/deleting properties of a token if the user is outside of permissions (ReFungible)', [Pallets.ReFungible], async ({helper}) => { - const collection = await helper.rft.mintCollection(alice); - const token = await collection.mintToken(alice, 100n); - await testForbidsChangingDeletingPropertiesUserOutsideOfPermissions(token, 100n); - }); - - async function testForbidsChangingDeletingPropertiesIfPropertyImmutable(token: UniqueNFToken | UniqueRFToken, pieces: bigint) { - const originalSpace = await prepare(token, pieces); - - let i = 0; - for (const permission of constitution) { - i++; - if (permission.permission.mutable) continue; - - await expect( - token.setProperties(permission.signers[0], [{key: `${i}`, value: 'Serotonin down'}]), - `on failing to change property ${i} by signer #0`, - ).to.be.rejectedWith(/common\.NoPermission/); - - await expect( - token.deleteProperties(permission.signers[0], [i.toString()]), - `on failing to delete property ${i} by signer #0`, - ).to.be.rejectedWith(/common\.NoPermission/); - } - - const consumedSpace = await getConsumedSpace(token.collection.helper.getApi(), token.collectionId, token.tokenId, pieces == 1n ? 'NFT' : 'RFT'); - expect(consumedSpace).to.be.equal(originalSpace); - } - - itSub('Forbids changing/deleting properties of a token if the property is permanent (immutable) (NFT)', async ({helper}) => { - const collection = await helper.nft.mintCollection(alice); - const token = await collection.mintToken(alice); - await testForbidsChangingDeletingPropertiesIfPropertyImmutable(token, 1n); - }); - - itSub.ifWithPallets('Forbids changing/deleting properties of a token if the property is permanent (immutable) (ReFungible)', [Pallets.ReFungible], async ({helper}) => { - const collection = await helper.rft.mintCollection(alice); - const token = await collection.mintToken(alice, 100n); - await testForbidsChangingDeletingPropertiesIfPropertyImmutable(token, 100n); - }); - - async function testForbidsAddingPropertiesIfPropertyNotDeclared(token: UniqueNFToken | UniqueRFToken, pieces: bigint) { - const originalSpace = await prepare(token, pieces); - - await expect( - token.setProperties(alice, [{key: 'non-existent', value: 'I exist!'}]), - 'on failing to add a previously non-existent property', - ).to.be.rejectedWith(/common\.NoPermission/); - - await expect( - token.collection.setTokenPropertyPermissions(alice, [{key: 'now-existent', permission: {}}]), - 'on setting a new non-permitted property', - ).to.be.fulfilled; - - await expect( - token.setProperties(alice, [{key: 'now-existent', value: 'I exist!'}]), - 'on failing to add a property forbidden by the \'None\' permission', - ).to.be.rejectedWith(/common\.NoPermission/); - - expect(await token.getProperties(['non-existent', 'now-existent'])).to.be.empty; - - const consumedSpace = await getConsumedSpace(token.collection.helper.getApi(), token.collectionId, token.tokenId, pieces == 1n ? 'NFT' : 'RFT'); - expect(consumedSpace).to.be.equal(originalSpace); - } - - itSub('Forbids adding properties to a token if the property is not declared / forbidden with the \'None\' permission (NFT)', async ({helper}) => { - const collection = await helper.nft.mintCollection(alice); - const token = await collection.mintToken(alice); - await testForbidsAddingPropertiesIfPropertyNotDeclared(token, 1n); - }); - - itSub.ifWithPallets('Forbids adding properties to a token if the property is not declared / forbidden with the \'None\' permission (ReFungible)', [Pallets.ReFungible], async ({helper}) => { - const collection = await helper.rft.mintCollection(alice); - const token = await collection.mintToken(alice, 100n); - await testForbidsAddingPropertiesIfPropertyNotDeclared(token, 100n); - }); - - async function testForbidsAddingTooManyProperties(token: UniqueNFToken | UniqueRFToken, pieces: bigint) { - const originalSpace = await prepare(token, pieces); - - await expect( - token.collection.setTokenPropertyPermissions(alice, [ - {key: 'a_holy_book', permission: {collectionAdmin: true, tokenOwner: true}}, - {key: 'young_years', permission: {collectionAdmin: true, tokenOwner: true}}, - ]), - 'on setting new permissions for properties', - ).to.be.fulfilled; - - // Mute the general tx parsing error - { - console.error = () => {}; - await expect(token.setProperties(alice, [{key: 'a_holy_book', value: 'word '.repeat(6554)}])) - .to.be.rejected; - } - - await expect(token.setProperties(alice, [ - {key: 'a_holy_book', value: 'word '.repeat(3277)}, - {key: 'young_years', value: 'neverending'.repeat(1490)}, - ])).to.be.rejectedWith(/common\.NoSpaceForProperty/); - - expect(await token.getProperties(['a_holy_book', 'young_years'])).to.be.empty; - const consumedSpace = await getConsumedSpace(token.collection.helper.getApi(), token.collectionId, token.tokenId, pieces == 1n ? 'NFT' : 'RFT'); - expect(consumedSpace).to.be.equal(originalSpace); - } - - itSub('Forbids adding too many properties to a token (NFT)', async ({helper}) => { - const collection = await helper.nft.mintCollection(alice); - const token = await collection.mintToken(alice); - await testForbidsAddingTooManyProperties(token, 1n); - }); - - itSub.ifWithPallets('Forbids adding too many properties to a token (ReFungible)', [Pallets.ReFungible], async ({helper}) => { - const collection = await helper.rft.mintCollection(alice); - const token = await collection.mintToken(alice, 100n); - await testForbidsAddingTooManyProperties(token, 100n); - }); -}); - -describe('ReFungible token properties permissions tests', () => { - let alice: IKeyringPair; - let bob: IKeyringPair; - let charlie: IKeyringPair; - - before(async function() { - await usingPlaygrounds(async (helper, privateKey) => { - requirePalletsOrSkip(this, helper, [Pallets.ReFungible]); - - const donor = privateKey('//Alice'); - [alice, bob, charlie] = await helper.arrange.createAccounts([100n, 100n, 100n], donor); - }); - }); - - async function prepare(helper: UniqueHelper): Promise { - const collection = await helper.rft.mintCollection(alice); - const token = await collection.mintToken(alice, 100n); - - await collection.addAdmin(alice, {Substrate: bob.address}); - await collection.setTokenPropertyPermissions(alice, [{key: 'fractals', permission: {mutable: true, tokenOwner: true}}]); - - return token; - } - - itSub('Forbids adding token property with tokenOwner==true when signer doesn\'t have all pieces', async ({helper}) => { - const token = await prepare(helper); - - await token.transfer(alice, {Substrate: charlie.address}, 33n); - - await expect(token.setProperties(alice, [ - {key: 'fractals', value: 'multiverse'}, - ])).to.be.rejectedWith(/common\.NoPermission/); - }); - - itSub('Forbids mutating token property with tokenOwher==true when signer doesn\'t have all pieces', async ({helper}) => { - const token = await prepare(helper); - - await expect(token.collection.setTokenPropertyPermissions(alice, [{key: 'fractals', permission: {mutable:true, tokenOwner: true}}])) - .to.be.fulfilled; - - await expect(token.setProperties(alice, [ - {key: 'fractals', value: 'multiverse'}, - ])).to.be.fulfilled; - - await token.transfer(alice, {Substrate: charlie.address}, 33n); - - await expect(token.setProperties(alice, [ - {key: 'fractals', value: 'want to rule the world'}, - ])).to.be.rejectedWith(/common\.NoPermission/); - }); - - itSub('Forbids deleting token property with tokenOwner==true when signer doesn\'t have all pieces', async ({helper}) => { - const token = await prepare(helper); - - await expect(token.setProperties(alice, [ - {key: 'fractals', value: 'one headline - why believe it'}, - ])).to.be.fulfilled; - - await token.transfer(alice, {Substrate: charlie.address}, 33n); - - await expect(token.deleteProperties(alice, ['fractals'])). - to.be.rejectedWith(/common\.NoPermission/); - }); - - itSub('Allows token property mutation with collectionOwner==true when admin doesn\'t have all pieces', async ({helper}) => { - const token = await prepare(helper); - - await token.transfer(alice, {Substrate: charlie.address}, 33n); - - await expect(token.collection.setTokenPropertyPermissions(alice, [{key: 'fractals', permission: {mutable:true, collectionAdmin: true}}])) - .to.be.fulfilled; - - await expect(token.setProperties(alice, [ - {key: 'fractals', value: 'multiverse'}, - ])).to.be.fulfilled; - }); -}); --- /dev/null +++ b/tests/src/nesting/propertyPermissions.test.ts @@ -0,0 +1,198 @@ +// Copyright 2019-2022 Unique Network (Gibraltar) Ltd. +// This file is part of Unique Network. + +// Unique Network is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Unique Network is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Unique Network. If not, see . + +import {IKeyringPair} from '@polkadot/types/types'; +import {itSub, Pallets, usingPlaygrounds, expect} from '../util'; +import {UniqueNFTCollection, UniqueRFTCollection} from '../util/playgrounds/unique'; + +describe('Integration Test: Access Rights to Token Properties', () => { + let alice: IKeyringPair; + let bob: IKeyringPair; + + before(async () => { + await usingPlaygrounds(async (helper, privateKey) => { + const donor = await privateKey({filename: __filename}); + [alice, bob] = await helper.arrange.createAccounts([100n, 10n], donor); + }); + }); + + itSub('Reads access rights to properties of a collection', async ({helper}) => { + const collection = await helper.nft.mintCollection(alice); + const propertyRights = (await helper.callRpc('api.query.common.collectionPropertyPermissions', [collection.collectionId])).toJSON(); + expect(propertyRights).to.be.empty; + }); + + async function testSetsAccessRightsToProperties(collection: UniqueNFTCollection | UniqueRFTCollection) { + await expect(collection.setTokenPropertyPermissions(alice, [{key: 'skullduggery', permission: {mutable: true}}])) + .to.be.fulfilled; + + await collection.addAdmin(alice, {Substrate: bob.address}); + + await expect(collection.setTokenPropertyPermissions(bob, [{key: 'mindgame', permission: {collectionAdmin: true, tokenOwner: false}}])) + .to.be.fulfilled; + + const propertyRights = await collection.getPropertyPermissions(['skullduggery', 'mindgame']); + expect(propertyRights).to.include.deep.members([ + {key: 'skullduggery', permission: {mutable: true, collectionAdmin: false, tokenOwner: false}}, + {key: 'mindgame', permission: {mutable: false, collectionAdmin: true, tokenOwner: false}}, + ]); + } + + itSub('Sets access rights to properties of a collection (NFT)', async ({helper}) => { + await testSetsAccessRightsToProperties(await helper.nft.mintCollection(alice)); + }); + + itSub.ifWithPallets('Sets access rights to properties of a collection (ReFungible)', [Pallets.ReFungible], async ({helper}) => { + await testSetsAccessRightsToProperties(await helper.rft.mintCollection(alice)); + }); + + async function testChangesAccessRightsToProperty(collection: UniqueNFTCollection | UniqueRFTCollection) { + await expect(collection.setTokenPropertyPermissions(alice, [{key: 'skullduggery', permission: {mutable: true, collectionAdmin: true}}])) + .to.be.fulfilled; + + await expect(collection.setTokenPropertyPermissions(alice, [{key: 'skullduggery', permission: {mutable: false, tokenOwner: true}}])) + .to.be.fulfilled; + + const propertyRights = await collection.getPropertyPermissions(); + expect(propertyRights).to.be.deep.equal([ + {key: 'skullduggery', permission: {'mutable': false, 'collectionAdmin': false, 'tokenOwner': true}}, + ]); + } + + itSub('Changes access rights to properties of a NFT collection', async ({helper}) => { + await testChangesAccessRightsToProperty(await helper.nft.mintCollection(alice)); + }); + + itSub.ifWithPallets('Changes access rights to properties of a ReFungible collection', [Pallets.ReFungible], async ({helper}) => { + await testChangesAccessRightsToProperty(await helper.rft.mintCollection(alice)); + }); +}); + +describe('Negative Integration Test: Access Rights to Token Properties', () => { + let alice: IKeyringPair; + let bob: IKeyringPair; + + before(async () => { + await usingPlaygrounds(async (helper, privateKey) => { + const donor = await privateKey({filename: __filename}); + [alice, bob] = await helper.arrange.createAccounts([50n, 10n], donor); + }); + }); + + async function testPreventsFromSettingAccessRightsNotAdminOrOwner(collection: UniqueNFTCollection | UniqueRFTCollection) { + await expect(collection.setTokenPropertyPermissions(bob, [{key: 'skullduggery', permission: {mutable: true, tokenOwner: true}}])) + .to.be.rejectedWith(/common\.NoPermission/); + + const propertyRights = await collection.getPropertyPermissions(['skullduggery']); + expect(propertyRights).to.be.empty; + } + + itSub('Prevents from setting access rights to properties of a NFT collection if not an onwer/admin', async ({helper}) => { + await testPreventsFromSettingAccessRightsNotAdminOrOwner(await helper.nft.mintCollection(alice)); + }); + + itSub.ifWithPallets('Prevents from setting access rights to properties of a ReFungible collection if not an onwer/admin', [Pallets.ReFungible], async ({helper}) => { + await testPreventsFromSettingAccessRightsNotAdminOrOwner(await helper.rft.mintCollection(alice)); + }); + + async function testPreventFromAddingTooManyPossibleProperties(collection: UniqueNFTCollection | UniqueRFTCollection) { + const constitution = []; + for (let i = 0; i < 65; i++) { + constitution.push({ + key: 'property_' + i, + permission: Math.random() > 0.5 ? {mutable: true, collectionAdmin: true, tokenOwner: true} : {}, + }); + } + + await expect(collection.setTokenPropertyPermissions(alice, constitution)) + .to.be.rejectedWith(/common\.PropertyLimitReached/); + + const propertyRights = await collection.getPropertyPermissions(); + expect(propertyRights).to.be.empty; + } + + itSub('Prevents from adding too many possible properties (NFT)', async ({helper}) => { + await testPreventFromAddingTooManyPossibleProperties(await helper.nft.mintCollection(alice)); + }); + + itSub.ifWithPallets('Prevents from adding too many possible properties (ReFungible)', [Pallets.ReFungible], async ({helper}) => { + await testPreventFromAddingTooManyPossibleProperties(await helper.rft.mintCollection(alice)); + }); + + async function testPreventAccessRightsModifiedIfConstant(collection: UniqueNFTCollection | UniqueRFTCollection) { + await expect(collection.setTokenPropertyPermissions(alice, [{key: 'skullduggery', permission: {mutable: false, tokenOwner: true}}])) + .to.be.fulfilled; + + await expect(collection.setTokenPropertyPermissions(alice, [{key: 'skullduggery', permission: {collectionAdmin: true}}])) + .to.be.rejectedWith(/common\.NoPermission/); + + const propertyRights = await collection.getPropertyPermissions(['skullduggery']); + expect(propertyRights).to.deep.equal([ + {key: 'skullduggery', permission: {'mutable': false, 'collectionAdmin': false, 'tokenOwner': true}}, + ]); + } + + itSub('Prevents access rights to be modified if constant (NFT)', async ({helper}) => { + await testPreventAccessRightsModifiedIfConstant(await helper.nft.mintCollection(alice)); + }); + + itSub.ifWithPallets('Prevents access rights to be modified if constant (ReFungible)', [Pallets.ReFungible], async ({helper}) => { + await testPreventAccessRightsModifiedIfConstant(await helper.rft.mintCollection(alice)); + }); + + async function testPreventsAddingPropertiesWithInvalidNames(collection: UniqueNFTCollection | UniqueRFTCollection) { + const invalidProperties = [ + [{key: 'skullduggery', permission: {tokenOwner: true}}, {key: 'im possible', permission: {collectionAdmin: true}}], + [{key: 'G#4', permission: {tokenOwner: true}}], + [{key: 'HÆMILTON', permission: {mutable: false, collectionAdmin: true, tokenOwner: true}}], + ]; + + for (let i = 0; i < invalidProperties.length; i++) { + await expect( + collection.setTokenPropertyPermissions(alice, invalidProperties[i]), + `on setting the new badly-named property #${i}`, + ).to.be.rejectedWith(/common\.InvalidCharacterInPropertyKey/); + } + + await expect( + collection.setTokenPropertyPermissions(alice, [{key: '', permission: {}}]), + 'on rejecting an unnamed property', + ).to.be.rejectedWith(/common\.EmptyPropertyKey/); + + const correctKey = '--0x03116e387820CA05'; // PolkadotJS would parse this as an already encoded hex-string + await expect( + collection.setTokenPropertyPermissions(alice, [ + {key: correctKey, permission: {collectionAdmin: true}}, + ]), + 'on setting the correctly-but-still-badly-named property', + ).to.be.fulfilled; + + const keys = invalidProperties.flatMap(propertySet => propertySet.map(property => property.key)).concat(correctKey).concat(''); + + const propertyRights = await collection.getPropertyPermissions(keys); + expect(propertyRights).to.be.deep.equal([ + {key: correctKey, permission: {mutable: false, collectionAdmin: true, tokenOwner: false}}, + ]); + } + + itSub('Prevents adding properties with invalid names (NFT)', async ({helper}) => { + await testPreventsAddingPropertiesWithInvalidNames(await helper.nft.mintCollection(alice)); + }); + + itSub.ifWithPallets('Prevents adding properties with invalid names (ReFungible)', [Pallets.ReFungible], async ({helper}) => { + await testPreventsAddingPropertiesWithInvalidNames(await helper.rft.mintCollection(alice)); + }); +}); \ No newline at end of file --- /dev/null +++ b/tests/src/nesting/tokenProperties.test.ts @@ -0,0 +1,594 @@ +// Copyright 2019-2022 Unique Network (Gibraltar) Ltd. +// This file is part of Unique Network. + +// Unique Network is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Unique Network is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Unique Network. If not, see . + +import {IKeyringPair} from '@polkadot/types/types'; +import {itSub, Pallets, requirePalletsOrSkip, usingPlaygrounds, expect} from '../util'; +import {UniqueHelper, UniqueNFToken, UniqueRFToken} from '../util/playgrounds/unique'; + +describe('Integration Test: Token Properties', () => { + let alice: IKeyringPair; // collection owner + let bob: IKeyringPair; // collection admin + let charlie: IKeyringPair; // token owner + + let permissions: {permission: any, signers: IKeyringPair[]}[]; + + before(async () => { + await usingPlaygrounds(async (helper, privateKey) => { + const donor = await privateKey({filename: __filename}); + [alice, bob, charlie] = await helper.arrange.createAccounts([100n, 100n, 100n], donor); + }); + + permissions = [ + {permission: {mutable: true, collectionAdmin: true}, signers: [alice, bob]}, + {permission: {mutable: false, collectionAdmin: true}, signers: [alice, bob]}, + {permission: {mutable: true, tokenOwner: true}, signers: [charlie]}, + {permission: {mutable: false, tokenOwner: true}, signers: [charlie]}, + {permission: {mutable: true, collectionAdmin: true, tokenOwner: true}, signers: [alice, bob, charlie]}, + {permission: {mutable: false, collectionAdmin: true, tokenOwner: true}, signers: [alice, bob, charlie]}, + ]; + }); + + async function mintCollectionWithAllPermissionsAndToken(helper: UniqueHelper, mode: 'NFT' | 'RFT'): Promise<[UniqueNFToken | UniqueRFToken, bigint]> { + const collection = await (mode == 'NFT' ? helper.nft : helper.rft).mintCollection(alice, { + tokenPropertyPermissions: permissions.flatMap(({permission, signers}, i) => + signers.map(signer => {return {key: `${i+1}_${signer.address}`, permission};})), + }); + return mode == 'NFT' ? [await collection.mintToken(alice), 1n] : [await collection.mintToken(alice, 100n), 100n]; + } + + async function testReadsYetEmptyProperties(token: UniqueNFToken | UniqueRFToken) { + const properties = await token.getProperties(); + expect(properties).to.be.empty; + + const tokenData = await token.getData(); + expect(tokenData!.properties).to.be.empty; + } + + itSub('Reads yet empty properties of a token (NFT)', async ({helper}) => { + const collection = await helper.nft.mintCollection(alice); + const token = await collection.mintToken(alice); + await testReadsYetEmptyProperties(token); + }); + + itSub.ifWithPallets('Reads yet empty properties of a token (ReFungible)', [Pallets.ReFungible], async ({helper}) => { + const collection = await helper.rft.mintCollection(alice); + const token = await collection.mintToken(alice); + await testReadsYetEmptyProperties(token); + }); + + async function testAssignPropertiesAccordingToPermissions(token: UniqueNFToken | UniqueRFToken, pieces: bigint) { + await token.collection.addAdmin(alice, {Substrate: bob.address}); + await token.transfer(alice, {Substrate: charlie.address}, pieces); + + const propertyKeys: string[] = []; + let i = 0; + for (const permission of permissions) { + i++; + let j = 0; + for (const signer of permission.signers) { + j++; + const key = i + '_' + signer.address; + propertyKeys.push(key); + + await expect( + token.setProperties(signer, [{key: key, value: 'Serotonin increase'}]), + `on adding property #${i} by signer #${j}`, + ).to.be.fulfilled; + } + } + + const properties = await token.getProperties(propertyKeys); + const tokenData = await token.getData(); + for (let i = 0; i < properties.length; i++) { + expect(properties[i].value).to.be.equal('Serotonin increase'); + expect(tokenData!.properties[i].value).to.be.equal('Serotonin increase'); + } + } + + itSub('Assigns properties to a token according to permissions (NFT)', async ({helper}) => { + const [token, amount] = await mintCollectionWithAllPermissionsAndToken(helper, 'NFT'); + await testAssignPropertiesAccordingToPermissions(token, amount); + }); + + itSub.ifWithPallets('Assigns properties to a token according to permissions (ReFungible)', [Pallets.ReFungible], async ({helper}) => { + const [token, amount] = await mintCollectionWithAllPermissionsAndToken(helper, 'RFT'); + await testAssignPropertiesAccordingToPermissions(token, amount); + }); + + async function testChangesPropertiesAccordingPermission(token: UniqueNFToken | UniqueRFToken, pieces: bigint) { + await token.collection.addAdmin(alice, {Substrate: bob.address}); + await token.transfer(alice, {Substrate: charlie.address}, pieces); + + const propertyKeys: string[] = []; + let i = 0; + for (const permission of permissions) { + i++; + if (!permission.permission.mutable) continue; + + let j = 0; + for (const signer of permission.signers) { + j++; + const key = i + '_' + signer.address; + propertyKeys.push(key); + + await expect( + token.setProperties(signer, [{key, value: 'Serotonin increase'}]), + `on adding property #${i} by signer #${j}`, + ).to.be.fulfilled; + + await expect( + token.setProperties(signer, [{key, value: 'Serotonin stable'}]), + `on changing property #${i} by signer #${j}`, + ).to.be.fulfilled; + } + } + + const properties = await token.getProperties(propertyKeys); + const tokenData = await token.getData(); + for (let i = 0; i < properties.length; i++) { + expect(properties[i].value).to.be.equal('Serotonin stable'); + expect(tokenData!.properties[i].value).to.be.equal('Serotonin stable'); + } + } + + itSub('Changes properties of a token according to permissions (NFT)', async ({helper}) => { + const [token, amount] = await mintCollectionWithAllPermissionsAndToken(helper, 'NFT'); + await testChangesPropertiesAccordingPermission(token, amount); + }); + + itSub.ifWithPallets('Changes properties of a token according to permissions (ReFungible)', [Pallets.ReFungible], async ({helper}) => { + const [token, amount] = await mintCollectionWithAllPermissionsAndToken(helper, 'RFT'); + await testChangesPropertiesAccordingPermission(token, amount); + }); + + async function testDeletePropertiesAccordingPermission(token: UniqueNFToken | UniqueRFToken, pieces: bigint) { + await token.collection.addAdmin(alice, {Substrate: bob.address}); + await token.transfer(alice, {Substrate: charlie.address}, pieces); + + const propertyKeys: string[] = []; + let i = 0; + + for (const permission of permissions) { + i++; + if (!permission.permission.mutable) continue; + + let j = 0; + for (const signer of permission.signers) { + j++; + const key = i + '_' + signer.address; + propertyKeys.push(key); + + await expect( + token.setProperties(signer, [{key, value: 'Serotonin increase'}]), + `on adding property #${i} by signer #${j}`, + ).to.be.fulfilled; + + await expect( + token.deleteProperties(signer, [key]), + `on deleting property #${i} by signer #${j}`, + ).to.be.fulfilled; + } + } + + expect(await token.getProperties(propertyKeys)).to.be.empty; + expect((await token.getData())!.properties).to.be.empty; + } + + itSub('Deletes properties of a token according to permissions (NFT)', async ({helper}) => { + const [token, amount] = await mintCollectionWithAllPermissionsAndToken(helper, 'NFT'); + await testDeletePropertiesAccordingPermission(token, amount); + }); + + itSub.ifWithPallets('Deletes properties of a token according to permissions (ReFungible)', [Pallets.ReFungible], async ({helper}) => { + const [token, amount] = await mintCollectionWithAllPermissionsAndToken(helper, 'RFT'); + await testDeletePropertiesAccordingPermission(token, amount); + }); + + itSub('Assigns properties to a nested token according to permissions', async ({helper}) => { + const collectionA = await helper.nft.mintCollection(alice, {permissions: {nesting: {tokenOwner: true}}}); + const collectionB = await helper.nft.mintCollection(alice, { + tokenPropertyPermissions: permissions.flatMap(({permission, signers}, i) => + signers.map(signer => {return {key: `${i+1}_${signer.address}`, permission};})), + }); + const targetToken = await collectionA.mintToken(alice); + const nestedToken = await collectionB.mintToken(alice, targetToken.nestingAccount()); + + await collectionB.addAdmin(alice, {Substrate: bob.address}); + await targetToken.transfer(alice, {Substrate: charlie.address}); + + const propertyKeys: string[] = []; + let i = 0; + for (const permission of permissions) { + i++; + let j = 0; + for (const signer of permission.signers) { + j++; + const key = i + '_' + signer.address; + propertyKeys.push(key); + + await expect( + nestedToken.setProperties(signer, [{key, value: 'Serotonin increase'}]), + `on adding property #${i} by signer #${j}`, + ).to.be.fulfilled; + } + } + + const properties = await nestedToken.getProperties(propertyKeys); + const tokenData = await nestedToken.getData(); + for (let i = 0; i < properties.length; i++) { + expect(properties[i].value).to.be.equal('Serotonin increase'); + expect(tokenData!.properties[i].value).to.be.equal('Serotonin increase'); + } + expect(await targetToken.getProperties()).to.be.empty; + }); + + itSub('Changes properties of a nested token according to permissions', async ({helper}) => { + const collectionA = await helper.nft.mintCollection(alice, {permissions: {nesting: {tokenOwner: true}}}); + const collectionB = await helper.nft.mintCollection(alice, { + tokenPropertyPermissions: permissions.flatMap(({permission, signers}, i) => + signers.map(signer => {return {key: `${i+1}_${signer.address}`, permission};})), + }); + const targetToken = await collectionA.mintToken(alice); + const nestedToken = await collectionB.mintToken(alice, targetToken.nestingAccount()); + + await collectionB.addAdmin(alice, {Substrate: bob.address}); + await targetToken.transfer(alice, {Substrate: charlie.address}); + + const propertyKeys: string[] = []; + let i = 0; + for (const permission of permissions) { + i++; + if (!permission.permission.mutable) continue; + + let j = 0; + for (const signer of permission.signers) { + j++; + const key = i + '_' + signer.address; + propertyKeys.push(key); + + await expect( + nestedToken.setProperties(signer, [{key, value: 'Serotonin increase'}]), + `on adding property #${i} by signer #${j}`, + ).to.be.fulfilled; + + await expect( + nestedToken.setProperties(signer, [{key, value: 'Serotonin stable'}]), + `on changing property #${i} by signer #${j}`, + ).to.be.fulfilled; + } + } + + const properties = await nestedToken.getProperties(propertyKeys); + const tokenData = await nestedToken.getData(); + for (let i = 0; i < properties.length; i++) { + expect(properties[i].value).to.be.equal('Serotonin stable'); + expect(tokenData!.properties[i].value).to.be.equal('Serotonin stable'); + } + expect(await targetToken.getProperties()).to.be.empty; + }); + + itSub('Deletes properties of a nested token according to permissions', async ({helper}) => { + const collectionA = await helper.nft.mintCollection(alice, {permissions: {nesting: {tokenOwner: true}}}); + const collectionB = await helper.nft.mintCollection(alice, { + tokenPropertyPermissions: permissions.flatMap(({permission, signers}, i) => + signers.map(signer => {return {key: `${i+1}_${signer.address}`, permission};})), + }); + const targetToken = await collectionA.mintToken(alice); + const nestedToken = await collectionB.mintToken(alice, targetToken.nestingAccount()); + + await collectionB.addAdmin(alice, {Substrate: bob.address}); + await targetToken.transfer(alice, {Substrate: charlie.address}); + + const propertyKeys: string[] = []; + let i = 0; + for (const permission of permissions) { + i++; + if (!permission.permission.mutable) continue; + + let j = 0; + for (const signer of permission.signers) { + j++; + const key = i + '_' + signer.address; + propertyKeys.push(key); + + await expect( + nestedToken.setProperties(signer, [{key, value: 'Serotonin increase'}]), + `on adding property #${i} by signer #${j}`, + ).to.be.fulfilled; + + await expect( + nestedToken.deleteProperties(signer, [key]), + `on deleting property #${i} by signer #${j}`, + ).to.be.fulfilled; + } + } + + expect(await nestedToken.getProperties(propertyKeys)).to.be.empty; + expect((await nestedToken.getData())!.properties).to.be.empty; + expect(await targetToken.getProperties()).to.be.empty; + }); +}); + +describe('Negative Integration Test: Token Properties', () => { + let alice: IKeyringPair; // collection owner + let bob: IKeyringPair; // collection admin + let charlie: IKeyringPair; // token owner + + let constitution: {permission: any, signers: IKeyringPair[], sinner: IKeyringPair}[]; + + before(async () => { + await usingPlaygrounds(async (helper, privateKey) => { + const donor = await privateKey({filename: __filename}); + let dave: IKeyringPair; + [alice, bob, charlie, dave] = await helper.arrange.createAccounts([100n, 100n, 100n, 100n], donor); + + // todo:playgrounds probably separate these tests later + constitution = [ + {permission: {mutable: true, collectionAdmin: true}, signers: [alice, bob], sinner: charlie}, + {permission: {mutable: false, collectionAdmin: true}, signers: [alice, bob], sinner: charlie}, + {permission: {mutable: true, tokenOwner: true}, signers: [charlie], sinner: alice}, + {permission: {mutable: false, tokenOwner: true}, signers: [charlie], sinner: alice}, + {permission: {mutable: true, collectionAdmin: true, tokenOwner: true}, signers: [alice, bob, charlie], sinner: dave}, + {permission: {mutable: false, collectionAdmin: true, tokenOwner: true}, signers: [alice, bob, charlie], sinner: dave}, + ]; + }); + }); + + async function mintCollectionWithAllPermissionsAndToken(helper: UniqueHelper, mode: 'NFT' | 'RFT'): Promise<[UniqueNFToken | UniqueRFToken, bigint]> { + const collection = await (mode == 'NFT' ? helper.nft : helper.rft).mintCollection(alice, { + tokenPropertyPermissions: constitution.map(({permission}, i) => {return {key: `${i+1}`, permission};}), + }); + return mode == 'NFT' ? [await collection.mintToken(alice), 1n] : [await collection.mintToken(alice, 100n), 100n]; + } + + async function getConsumedSpace(api: any, collectionId: number, tokenId: number, mode: 'NFT' | 'RFT'): Promise { + return (await (mode == 'NFT' ? api.query.nonfungible : api.query.refungible).tokenProperties(collectionId, tokenId)).toJSON().consumedSpace; + } + + async function prepare(token: UniqueNFToken | UniqueRFToken, pieces: bigint): Promise { + await token.collection.addAdmin(alice, {Substrate: bob.address}); + await token.transfer(alice, {Substrate: charlie.address}, pieces); + + let i = 0; + for (const passage of constitution) { + i++; + const signer = passage.signers[0]; + await expect( + token.setProperties(signer, [{key: `${i}`, value: 'Serotonin increase'}]), + `on adding property ${i} by ${signer.address}`, + ).to.be.fulfilled; + } + + const originalSpace = await getConsumedSpace(token.collection.helper.getApi(), token.collectionId, token.tokenId, pieces == 1n ? 'NFT' : 'RFT'); + return originalSpace; + } + + async function testForbidsChangingDeletingPropertiesUserOutsideOfPermissions(token: UniqueNFToken | UniqueRFToken, pieces: bigint) { + const originalSpace = await prepare(token, pieces); + + let i = 0; + for (const forbiddance of constitution) { + i++; + if (!forbiddance.permission.mutable) continue; + + await expect( + token.setProperties(forbiddance.sinner, [{key: `${i}`, value: 'Serotonin down'}]), + `on failing to change property ${i} by the malefactor`, + ).to.be.rejectedWith(/common\.NoPermission/); + + await expect( + token.deleteProperties(forbiddance.sinner, [`${i}`]), + `on failing to delete property ${i} by the malefactor`, + ).to.be.rejectedWith(/common\.NoPermission/); + } + + const consumedSpace = await getConsumedSpace(token.collection.helper.getApi(), token.collectionId, token.tokenId, pieces == 1n ? 'NFT' : 'RFT'); + expect(consumedSpace).to.be.equal(originalSpace); + } + + itSub('Forbids changing/deleting properties of a token if the user is outside of permissions (NFT)', async ({helper}) => { + const [token, amount] = await mintCollectionWithAllPermissionsAndToken(helper, 'NFT'); + await testForbidsChangingDeletingPropertiesUserOutsideOfPermissions(token, amount); + }); + + itSub.ifWithPallets('Forbids changing/deleting properties of a token if the user is outside of permissions (ReFungible)', [Pallets.ReFungible], async ({helper}) => { + const [token, amount] = await mintCollectionWithAllPermissionsAndToken(helper, 'RFT'); + await testForbidsChangingDeletingPropertiesUserOutsideOfPermissions(token, amount); + }); + + async function testForbidsChangingDeletingPropertiesIfPropertyImmutable(token: UniqueNFToken | UniqueRFToken, pieces: bigint) { + const originalSpace = await prepare(token, pieces); + + let i = 0; + for (const permission of constitution) { + i++; + if (permission.permission.mutable) continue; + + await expect( + token.setProperties(permission.signers[0], [{key: `${i}`, value: 'Serotonin down'}]), + `on failing to change property ${i} by signer #0`, + ).to.be.rejectedWith(/common\.NoPermission/); + + await expect( + token.deleteProperties(permission.signers[0], [i.toString()]), + `on failing to delete property ${i} by signer #0`, + ).to.be.rejectedWith(/common\.NoPermission/); + } + + const consumedSpace = await getConsumedSpace(token.collection.helper.getApi(), token.collectionId, token.tokenId, pieces == 1n ? 'NFT' : 'RFT'); + expect(consumedSpace).to.be.equal(originalSpace); + } + + itSub('Forbids changing/deleting properties of a token if the property is permanent (immutable) (NFT)', async ({helper}) => { + const [token, amount] = await mintCollectionWithAllPermissionsAndToken(helper, 'NFT'); + await testForbidsChangingDeletingPropertiesIfPropertyImmutable(token, amount); + }); + + itSub.ifWithPallets('Forbids changing/deleting properties of a token if the property is permanent (immutable) (ReFungible)', [Pallets.ReFungible], async ({helper}) => { + const [token, amount] = await mintCollectionWithAllPermissionsAndToken(helper, 'RFT'); + await testForbidsChangingDeletingPropertiesIfPropertyImmutable(token, amount); + }); + + async function testForbidsAddingPropertiesIfPropertyNotDeclared(token: UniqueNFToken | UniqueRFToken, pieces: bigint) { + const originalSpace = await prepare(token, pieces); + + await expect( + token.setProperties(alice, [{key: 'non-existent', value: 'I exist!'}]), + 'on failing to add a previously non-existent property', + ).to.be.rejectedWith(/common\.NoPermission/); + + await expect( + token.collection.setTokenPropertyPermissions(alice, [{key: 'now-existent', permission: {}}]), + 'on setting a new non-permitted property', + ).to.be.fulfilled; + + await expect( + token.setProperties(alice, [{key: 'now-existent', value: 'I exist!'}]), + 'on failing to add a property forbidden by the \'None\' permission', + ).to.be.rejectedWith(/common\.NoPermission/); + + expect(await token.getProperties(['non-existent', 'now-existent'])).to.be.empty; + + const consumedSpace = await getConsumedSpace(token.collection.helper.getApi(), token.collectionId, token.tokenId, pieces == 1n ? 'NFT' : 'RFT'); + expect(consumedSpace).to.be.equal(originalSpace); + } + + itSub('Forbids adding properties to a token if the property is not declared / forbidden with the \'None\' permission (NFT)', async ({helper}) => { + const [token, amount] = await mintCollectionWithAllPermissionsAndToken(helper, 'NFT'); + await testForbidsAddingPropertiesIfPropertyNotDeclared(token, amount); + }); + + itSub.ifWithPallets('Forbids adding properties to a token if the property is not declared / forbidden with the \'None\' permission (ReFungible)', [Pallets.ReFungible], async ({helper}) => { + const [token, amount] = await mintCollectionWithAllPermissionsAndToken(helper, 'RFT'); + await testForbidsAddingPropertiesIfPropertyNotDeclared(token, amount); + }); + + async function testForbidsAddingTooManyProperties(token: UniqueNFToken | UniqueRFToken, pieces: bigint) { + const originalSpace = await prepare(token, pieces); + + await expect( + token.collection.setTokenPropertyPermissions(alice, [ + {key: 'a_holy_book', permission: {collectionAdmin: true, tokenOwner: true}}, + {key: 'young_years', permission: {collectionAdmin: true, tokenOwner: true}}, + ]), + 'on setting new permissions for properties', + ).to.be.fulfilled; + + // Mute the general tx parsing error + { + console.error = () => {}; + await expect(token.setProperties(alice, [{key: 'a_holy_book', value: 'word '.repeat(6554)}])) + .to.be.rejected; + } + + await expect(token.setProperties(alice, [ + {key: 'a_holy_book', value: 'word '.repeat(3277)}, + {key: 'young_years', value: 'neverending'.repeat(1490)}, + ])).to.be.rejectedWith(/common\.NoSpaceForProperty/); + + expect(await token.getProperties(['a_holy_book', 'young_years'])).to.be.empty; + const consumedSpace = await getConsumedSpace(token.collection.helper.getApi(), token.collectionId, token.tokenId, pieces == 1n ? 'NFT' : 'RFT'); + expect(consumedSpace).to.be.equal(originalSpace); + } + + itSub('Forbids adding too many properties to a token (NFT)', async ({helper}) => { + const [token, amount] = await mintCollectionWithAllPermissionsAndToken(helper, 'NFT'); + await testForbidsAddingTooManyProperties(token, amount); + }); + + itSub.ifWithPallets('Forbids adding too many properties to a token (ReFungible)', [Pallets.ReFungible], async ({helper}) => { + const [token, amount] = await mintCollectionWithAllPermissionsAndToken(helper, 'RFT'); + await testForbidsAddingTooManyProperties(token, amount); + }); +}); + +describe('ReFungible token properties permissions tests', () => { + let alice: IKeyringPair; + let bob: IKeyringPair; + let charlie: IKeyringPair; + + before(async function() { + await usingPlaygrounds(async (helper, privateKey) => { + requirePalletsOrSkip(this, helper, [Pallets.ReFungible]); + + const donor = await privateKey({filename: __filename}); + [alice, bob, charlie] = await helper.arrange.createAccounts([100n, 100n, 100n], donor); + }); + }); + + async function prepare(helper: UniqueHelper): Promise { + const collection = await helper.rft.mintCollection(alice); + const token = await collection.mintToken(alice, 100n); + + await collection.addAdmin(alice, {Substrate: bob.address}); + await collection.setTokenPropertyPermissions(alice, [{key: 'fractals', permission: {mutable: true, tokenOwner: true}}]); + + return token; + } + + itSub('Forbids adding token property with tokenOwner==true when signer doesn\'t have all pieces', async ({helper}) => { + const token = await prepare(helper); + + await token.transfer(alice, {Substrate: charlie.address}, 33n); + + await expect(token.setProperties(alice, [ + {key: 'fractals', value: 'multiverse'}, + ])).to.be.rejectedWith(/common\.NoPermission/); + }); + + itSub('Forbids mutating token property with tokenOwner==true when signer doesn\'t have all pieces', async ({helper}) => { + const token = await prepare(helper); + + await expect(token.collection.setTokenPropertyPermissions(alice, [{key: 'fractals', permission: {mutable:true, tokenOwner: true}}])) + .to.be.fulfilled; + + await expect(token.setProperties(alice, [ + {key: 'fractals', value: 'multiverse'}, + ])).to.be.fulfilled; + + await token.transfer(alice, {Substrate: charlie.address}, 33n); + + await expect(token.setProperties(alice, [ + {key: 'fractals', value: 'want to rule the world'}, + ])).to.be.rejectedWith(/common\.NoPermission/); + }); + + itSub('Forbids deleting token property with tokenOwner==true when signer doesn\'t have all pieces', async ({helper}) => { + const token = await prepare(helper); + + await expect(token.setProperties(alice, [ + {key: 'fractals', value: 'one headline - why believe it'}, + ])).to.be.fulfilled; + + await token.transfer(alice, {Substrate: charlie.address}, 33n); + + await expect(token.deleteProperties(alice, ['fractals'])). + to.be.rejectedWith(/common\.NoPermission/); + }); + + itSub('Allows token property mutation with collectionOwner==true when admin doesn\'t have all pieces', async ({helper}) => { + const token = await prepare(helper); + + await token.transfer(alice, {Substrate: charlie.address}, 33n); + + await expect(token.collection.setTokenPropertyPermissions(alice, [{key: 'fractals', permission: {mutable:true, collectionAdmin: true}}])) + .to.be.fulfilled; + + await expect(token.setProperties(alice, [ + {key: 'fractals', value: 'multiverse'}, + ])).to.be.fulfilled; + }); +}); --- a/tests/src/nesting/unnest.test.ts +++ b/tests/src/nesting/unnest.test.ts @@ -15,14 +15,14 @@ // along with Unique Network. If not, see . import {IKeyringPair} from '@polkadot/types/types'; -import {expect, itSub, Pallets, usingPlaygrounds} from '../util/playgrounds'; +import {expect, itSub, Pallets, usingPlaygrounds} from '../util'; describe('Integration Test: Unnesting', () => { let alice: IKeyringPair; before(async () => { await usingPlaygrounds(async (helper, privateKey) => { - const donor = privateKey('//Alice'); + const donor = await privateKey({filename: __filename}); [alice] = await helper.arrange.createAccounts([50n], donor); }); }); @@ -91,7 +91,7 @@ before(async () => { await usingPlaygrounds(async (helper, privateKey) => { - const donor = privateKey('//Alice'); + const donor = await privateKey({filename: __filename}); [alice, bob] = await helper.arrange.createAccounts([50n, 10n], donor); }); }); --- a/tests/src/nextSponsoring.test.ts +++ b/tests/src/nextSponsoring.test.ts @@ -15,7 +15,7 @@ // along with Unique Network. If not, see . import {IKeyringPair} from '@polkadot/types/types'; -import {expect, itSub, Pallets, usingPlaygrounds} from './util/playgrounds'; +import {expect, itSub, Pallets, usingPlaygrounds} from './util'; const SPONSORING_TIMEOUT = 5; @@ -25,7 +25,7 @@ before(async () => { await usingPlaygrounds(async (helper, privateKey) => { - const donor = privateKey('//Alice'); + const donor = await privateKey({filename: __filename}); [alice, bob] = await helper.arrange.createAccounts([20n, 10n], donor); }); }); --- a/tests/src/pallet-presence.test.ts +++ b/tests/src/pallet-presence.test.ts @@ -14,7 +14,7 @@ // You should have received a copy of the GNU General Public License // along with Unique Network. If not, see . -import {itSub, usingPlaygrounds, expect} from './util/playgrounds'; +import {itSub, usingPlaygrounds, expect} from './util'; // Pallets that must always be present const requiredPallets = [ --- a/tests/src/refungible.test.ts +++ b/tests/src/refungible.test.ts @@ -15,11 +15,12 @@ // along with Unique Network. If not, see . import {IKeyringPair} from '@polkadot/types/types'; -import {itSub, Pallets, requirePalletsOrSkip, usingPlaygrounds, expect} from './util/playgrounds'; +import {itSub, Pallets, requirePalletsOrSkip, usingPlaygrounds, expect} from './util'; const MAX_REFUNGIBLE_PIECES = 1_000_000_000_000_000_000_000n; describe('integration test: Refungible functionality:', async () => { + let donor: IKeyringPair; let alice: IKeyringPair; let bob: IKeyringPair; @@ -27,7 +28,7 @@ await usingPlaygrounds(async (helper, privateKey) => { requirePalletsOrSkip(this, helper, [Pallets.ReFungible]); - const donor = privateKey('//Alice'); + donor = await privateKey({filename: __filename}); [alice, bob] = await helper.arrange.createAccounts([100n, 10n], donor); }); }); @@ -61,9 +62,9 @@ .to.eventually.be.rejectedWith(/refungible\.WrongRefungiblePieces/); }); - itSub('RPC method tokenOnewrs for refungible collection and token', async ({helper, privateKey}) => { + itSub('RPC method tokenOwners for refungible collection and token', async ({helper}) => { const ethAcc = {Ethereum: '0x67fb3503a61b284dc83fa96dceec4192db47dc7c'}; - const facelessCrowd = Array(7).fill(0).map((_, i) => ({Substrate: privateKey(`//Alice+${i}`).address})); + const facelessCrowd = (await helper.arrange.createAccounts(Array(7).fill(0n), donor)).map(keyring => {return {Substrate: keyring.address};}); const collection = await helper.rft.mintCollection(alice, {name: 'test', description: 'test', tokenPrefix: 'test'}); @@ -82,7 +83,7 @@ expect(owners).to.deep.include.members([{Substrate: alice.address}, ethAcc, {Substrate: bob.address}, ...facelessCrowd]); expect(owners.length).to.be.equal(10); - const eleven = privateKey('//ALice+11'); + const [eleven] = await helper.arrange.createAccounts([0n], donor); expect(await token.transfer(alice, {Substrate: eleven.address}, 10n)).to.be.true; expect((await token.getTop10Owners()).length).to.be.equal(10); }); @@ -211,7 +212,8 @@ const token = await collection.mintToken(alice, 100n); await token.repartition(alice, 200n); const chainEvents = helper.chainLog.slice(-1)[0].events; - expect(chainEvents).to.deep.include({ + const event = chainEvents.find((event: any) => event.section === 'common' && event.method === 'ItemCreated'); + expect(event).to.deep.include({ section: 'common', method: 'ItemCreated', index: [66, 2], @@ -221,7 +223,6 @@ {substrate: alice.address}, 100n, ], - phase: {applyExtrinsic: 2}, }); }); @@ -230,9 +231,10 @@ const token = await collection.mintToken(alice, 100n); await token.repartition(alice, 50n); const chainEvents = helper.chainLog.slice(-1)[0].events; - expect(chainEvents).to.deep.include({ - method: 'ItemDestroyed', + const event = chainEvents.find((event: any) => event.section === 'common' && event.method === 'ItemDestroyed'); + expect(event).to.deep.include({ section: 'common', + method: 'ItemDestroyed', index: [66, 3], data: [ collection.collectionId, @@ -240,7 +242,6 @@ {substrate: alice.address}, 50n, ], - phase: {applyExtrinsic: 2}, }); }); --- a/tests/src/removeCollectionAdmin.test.ts +++ b/tests/src/removeCollectionAdmin.test.ts @@ -15,7 +15,7 @@ // along with Unique Network. If not, see . import {IKeyringPair} from '@polkadot/types/types'; -import {itSub, usingPlaygrounds, expect} from './util/playgrounds'; +import {itSub, usingPlaygrounds, expect} from './util'; describe('Integration Test removeCollectionAdmin(collection_id, account_id):', () => { let alice: IKeyringPair; @@ -23,7 +23,7 @@ before(async () => { await usingPlaygrounds(async (helper, privateKey) => { - const donor = privateKey('//Alice'); + const donor = await privateKey({filename: __filename}); [alice, bob] = await helper.arrange.createAccounts([20n, 10n], donor); }); }); @@ -62,7 +62,7 @@ before(async () => { await usingPlaygrounds(async (helper, privateKey) => { - const donor = privateKey('//Alice'); + const donor = await privateKey({filename: __filename}); [alice, bob, charlie] = await helper.arrange.createAccounts([20n, 10n, 10n], donor); }); }); --- a/tests/src/removeCollectionSponsor.test.ts +++ b/tests/src/removeCollectionSponsor.test.ts @@ -15,7 +15,7 @@ // along with Unique Network. If not, see . import {IKeyringPair} from '@polkadot/types/types'; -import {itSub, usingPlaygrounds, expect} from './util/playgrounds'; +import {itSub, usingPlaygrounds, expect} from './util'; describe('integration test: ext. removeCollectionSponsor():', () => { let donor: IKeyringPair; @@ -24,7 +24,7 @@ before(async () => { await usingPlaygrounds(async (helper, privateKey) => { - donor = privateKey('//Alice'); + donor = await privateKey({filename: __filename}); [alice, bob] = await helper.arrange.createAccounts([10n, 10n], donor); }); }); @@ -78,7 +78,7 @@ before(async () => { await usingPlaygrounds(async (helper, privateKey) => { - const donor = privateKey('//Alice'); + const donor = await privateKey({filename: __filename}); [alice, bob, charlie] = await helper.arrange.createAccounts([20n, 10n, 10n], donor); }); }); --- /dev/null +++ b/tests/src/rmrk/acceptNft.seqtest.ts @@ -0,0 +1,107 @@ +import {expect} from 'chai'; +import {getApiConnection} from '../substrate/substrate-api'; +import { + createCollection, + mintNft, + sendNft, + acceptNft, +} from './util/tx'; +import {NftIdTuple} from './util/fetch'; +import {isNftChildOfAnother, expectTxFailure, requirePallets, Pallets} from './util/helpers'; + +describe('integration test: accept NFT', () => { + let api: any; + before(async function() { + api = await getApiConnection(); + await requirePallets(this, [Pallets.RmrkCore]); + }); + + + const alice = '//Alice'; + const bob = '//Bob'; + + const createTestCollection = async (issuerUri: string) => { + return await createCollection( + api, + issuerUri, + 'accept-metadata', + null, + 'acpt', + ); + }; + + it('accept NFT', async () => { + const ownerAlice = alice; + const ownerBob = bob; + + const aliceCollectionId = await createTestCollection(alice); + const bobCollectionId = await createTestCollection(bob); + + const parentNftId = await mintNft(api, alice, ownerAlice, aliceCollectionId, 'parent-nft-metadata'); + const childNftId = await mintNft(api, bob, ownerBob, bobCollectionId, 'child-nft-metadata'); + + const newOwnerNFT: NftIdTuple = [aliceCollectionId, parentNftId]; + + await sendNft(api, 'pending', ownerBob, bobCollectionId, childNftId, newOwnerNFT); + await acceptNft(api, alice, bobCollectionId, childNftId, newOwnerNFT); + + const isChild = await isNftChildOfAnother(api, bobCollectionId, childNftId, newOwnerNFT); + expect(isChild).to.be.true; + }); + + it('[negative] unable to accept NFT by a not-an-owner', async () => { + const ownerAlice = alice; + const ownerBob = bob; + + const aliceCollectionId = await createTestCollection(alice); + const bobCollectionId = await createTestCollection(bob); + + const parentNftId = await mintNft(api, alice, ownerAlice, aliceCollectionId, 'parent-nft-metadata'); + const childNftId = await mintNft(api, bob, ownerBob, bobCollectionId, 'child-nft-metadata'); + + const newOwnerNFT: NftIdTuple = [aliceCollectionId, parentNftId]; + + await sendNft(api, 'pending', ownerBob, bobCollectionId, childNftId, newOwnerNFT); + const tx = acceptNft(api, bob, bobCollectionId, childNftId, newOwnerNFT); + + await expectTxFailure(/rmrkCore\.NoPermission/, tx); + }); + + it('[negative] unable to accept non-existing NFT', async () => { + const collectionId = 0; + const maxNftId = 0xFFFFFFFF; + + const owner = alice; + const aliceCollectionId = await createTestCollection(alice); + + const parentNftId = await mintNft(api, alice, owner, aliceCollectionId, 'parent-nft-metadata'); + + const newOwnerNFT: NftIdTuple = [aliceCollectionId, parentNftId]; + + const tx = acceptNft(api, alice, collectionId, maxNftId, newOwnerNFT); + + await expectTxFailure(/rmrkCore\.NoAvailableNftId/, tx); + }); + + it('[negative] unable to accept NFT which is not sent', async () => { + const ownerAlice = alice; + const ownerBob = bob; + + const aliceCollectionId = await createTestCollection(alice); + const bobCollectionId = await createTestCollection(bob); + + const parentNftId = await mintNft(api, alice, ownerAlice, aliceCollectionId, 'parent-nft-metadata'); + const childNftId = await mintNft(api, bob, ownerBob, bobCollectionId, 'child-nft-metadata'); + + const newOwnerNFT: NftIdTuple = [aliceCollectionId, parentNftId]; + + const tx = acceptNft(api, alice, bobCollectionId, childNftId, newOwnerNFT); + + await expectTxFailure(/rmrkCore\.NoPermission/, tx); + + const isChild = await isNftChildOfAnother(api, bobCollectionId, childNftId, newOwnerNFT); + expect(isChild).to.be.false; + }); + + after(async() => { await api.disconnect(); }); +}); --- a/tests/src/rmrk/acceptNft.test.ts +++ /dev/null @@ -1,107 +0,0 @@ -import {expect} from 'chai'; -import {getApiConnection} from '../substrate/substrate-api'; -import { - createCollection, - mintNft, - sendNft, - acceptNft, -} from './util/tx'; -import {NftIdTuple} from './util/fetch'; -import {isNftChildOfAnother, expectTxFailure, requirePallets, Pallets} from './util/helpers'; - -describe('integration test: accept NFT', () => { - let api: any; - before(async function() { - api = await getApiConnection(); - await requirePallets(this, [Pallets.RmrkCore]); - }); - - - const alice = '//Alice'; - const bob = '//Bob'; - - const createTestCollection = async (issuerUri: string) => { - return await createCollection( - api, - issuerUri, - 'accept-metadata', - null, - 'acpt', - ); - }; - - it('accept NFT', async () => { - const ownerAlice = alice; - const ownerBob = bob; - - const aliceCollectionId = await createTestCollection(alice); - const bobCollectionId = await createTestCollection(bob); - - const parentNftId = await mintNft(api, alice, ownerAlice, aliceCollectionId, 'parent-nft-metadata'); - const childNftId = await mintNft(api, bob, ownerBob, bobCollectionId, 'child-nft-metadata'); - - const newOwnerNFT: NftIdTuple = [aliceCollectionId, parentNftId]; - - await sendNft(api, 'pending', ownerBob, bobCollectionId, childNftId, newOwnerNFT); - await acceptNft(api, alice, bobCollectionId, childNftId, newOwnerNFT); - - const isChild = await isNftChildOfAnother(api, bobCollectionId, childNftId, newOwnerNFT); - expect(isChild).to.be.true; - }); - - it('[negative] unable to accept NFT by a not-an-owner', async () => { - const ownerAlice = alice; - const ownerBob = bob; - - const aliceCollectionId = await createTestCollection(alice); - const bobCollectionId = await createTestCollection(bob); - - const parentNftId = await mintNft(api, alice, ownerAlice, aliceCollectionId, 'parent-nft-metadata'); - const childNftId = await mintNft(api, bob, ownerBob, bobCollectionId, 'child-nft-metadata'); - - const newOwnerNFT: NftIdTuple = [aliceCollectionId, parentNftId]; - - await sendNft(api, 'pending', ownerBob, bobCollectionId, childNftId, newOwnerNFT); - const tx = acceptNft(api, bob, bobCollectionId, childNftId, newOwnerNFT); - - await expectTxFailure(/rmrkCore\.NoPermission/, tx); - }); - - it('[negative] unable to accept non-existing NFT', async () => { - const collectionId = 0; - const maxNftId = 0xFFFFFFFF; - - const owner = alice; - const aliceCollectionId = await createTestCollection(alice); - - const parentNftId = await mintNft(api, alice, owner, aliceCollectionId, 'parent-nft-metadata'); - - const newOwnerNFT: NftIdTuple = [aliceCollectionId, parentNftId]; - - const tx = acceptNft(api, alice, collectionId, maxNftId, newOwnerNFT); - - await expectTxFailure(/rmrkCore\.NoAvailableNftId/, tx); - }); - - it('[negative] unable to accept NFT which is not sent', async () => { - const ownerAlice = alice; - const ownerBob = bob; - - const aliceCollectionId = await createTestCollection(alice); - const bobCollectionId = await createTestCollection(bob); - - const parentNftId = await mintNft(api, alice, ownerAlice, aliceCollectionId, 'parent-nft-metadata'); - const childNftId = await mintNft(api, bob, ownerBob, bobCollectionId, 'child-nft-metadata'); - - const newOwnerNFT: NftIdTuple = [aliceCollectionId, parentNftId]; - - const tx = acceptNft(api, alice, bobCollectionId, childNftId, newOwnerNFT); - - await expectTxFailure(/rmrkCore\.NoPermission/, tx); - - const isChild = await isNftChildOfAnother(api, bobCollectionId, childNftId, newOwnerNFT); - expect(isChild).to.be.false; - }); - - after(async() => { await api.disconnect(); }); -}); --- /dev/null +++ b/tests/src/rmrk/addResource.seqtest.ts @@ -0,0 +1,437 @@ +import {expect} from 'chai'; +import {getApiConnection} from '../substrate/substrate-api'; +import {NftIdTuple} from './util/fetch'; +import {expectTxFailure, getResourceById, requirePallets, Pallets} from './util/helpers'; +import { + addNftBasicResource, + acceptNftResource, + createCollection, + mintNft, + sendNft, + addNftSlotResource, + addNftComposableResource, +} from './util/tx'; +import {RmrkTraitsResourceResourceInfo as ResourceInfo} from '@polkadot/types/lookup'; + +describe('integration test: add NFT resource', () => { + const alice = '//Alice'; + const bob = '//Bob'; + const src = 'test-res-src'; + const metadata = 'test-res-metadata'; + const license = 'test-res-license'; + const thumb = 'test-res-thumb'; + + const nonexistentId = 99999; + + let api: any; + before(async function() { + api = await getApiConnection(); + await requirePallets(this, [Pallets.RmrkCore]); + }); + + it('add resource', async () => { + const collectionIdAlice = await createCollection( + api, + alice, + 'test-metadata', + null, + 'test-symbol', + ); + + const nftAlice = await mintNft( + api, + alice, + alice, + collectionIdAlice, + 'nft-metadata', + ); + + await addNftBasicResource( + api, + alice, + 'added', + collectionIdAlice, + nftAlice, + src, + metadata, + license, + thumb, + ); + }); + + it('add a resource to the nested NFT', async () => { + const collectionIdAlice = await createCollection( + api, + alice, + 'test-metadata', + null, + 'test-symbol', + ); + + const parentNftId = await mintNft(api, alice, alice, collectionIdAlice, 'parent-nft-metadata'); + const childNftId = await mintNft(api, alice, alice, collectionIdAlice, 'child-nft-metadata'); + + const newOwnerNFT: NftIdTuple = [collectionIdAlice, parentNftId]; + + await sendNft(api, 'sent', alice, collectionIdAlice, childNftId, newOwnerNFT); + + await addNftBasicResource( + api, + alice, + 'added', + collectionIdAlice, + childNftId, + src, + metadata, + license, + thumb, + ); + }); + + it('add multiple resources', async () => { + const collectionIdAlice = await createCollection( + api, + alice, + 'test-metadata', + null, + 'test-symbol', + ); + + const nftAlice = await mintNft( + api, + alice, + alice, + collectionIdAlice, + 'nft-metadata', + ); + + const baseId = 42; + const slotId = 10; + const parts = [0, 5, 2]; + + const resourcesInfo = []; + const resourceNum = 4; + + const checkResource = async (resource: ResourceInfo, resType: string, expectedId: number, expected: { + src: string, + metadata: string, + license: string, + thumb: string + }) => { + + // FIXME A workaround. It seems it is a PolkadotJS bug. + // All of the following are `false`. + // + // console.log('>>> basic:', resource.resource.isBasic); + // console.log('>>> composable:', resource.resource.isComposable); + // console.log('>>> slot:', resource.resource.isSlot); + const resourceJson = (resource.resource.toHuman() as any)[resType]; + + expect(resource.id.toNumber(), 'Error: Invalid resource Id') + .to.be.eq(expectedId); + + expect(resourceJson.src, 'Error: Invalid resource src') + .to.be.eq(expected.src); + expect(resourceJson.metadata, 'Error: Invalid resource metadata') + .to.be.eq(expected.metadata); + expect(resourceJson.license, 'Error: Invalid resource license') + .to.be.eq(expected.license); + expect(resourceJson.thumb, 'Error: Invalid resource thumb') + .to.be.eq(expected.thumb); + }; + + for (let i = 0; i < resourceNum; i++) { + resourcesInfo.push({ + src: src + 'r-' + i, + metadata: metadata + 'r-' + i, + license: license + 'r-' + i, + thumb: thumb + 'r-' + i, + }); + } + + const firstBasicResourceId = await addNftBasicResource( + api, + alice, + 'added', + collectionIdAlice, + nftAlice, + resourcesInfo[0].src, + resourcesInfo[0].metadata, + resourcesInfo[0].license, + resourcesInfo[0].thumb, + ); + + const secondBasicResourceId = await addNftBasicResource( + api, + alice, + 'added', + collectionIdAlice, + nftAlice, + resourcesInfo[1].src, + resourcesInfo[1].metadata, + resourcesInfo[1].license, + resourcesInfo[1].thumb, + ); + + const composableResourceId = await addNftComposableResource( + api, + alice, + 'added', + collectionIdAlice, + nftAlice, + parts, + baseId, + resourcesInfo[2].src, + resourcesInfo[2].metadata, + resourcesInfo[2].license, + resourcesInfo[2].thumb, + ); + + const slotResourceId = await addNftSlotResource( + api, + alice, + 'added', + collectionIdAlice, + nftAlice, + baseId, + slotId, + resourcesInfo[3].src, + resourcesInfo[3].metadata, + resourcesInfo[3].license, + resourcesInfo[3].thumb, + ); + + const firstResource = await getResourceById(api, collectionIdAlice, nftAlice, firstBasicResourceId); + await checkResource(firstResource, 'Basic', firstBasicResourceId, resourcesInfo[0]); + + const secondResource = await getResourceById(api, collectionIdAlice, nftAlice, secondBasicResourceId); + await checkResource(secondResource, 'Basic', secondBasicResourceId, resourcesInfo[1]); + + const composableResource = await getResourceById(api, collectionIdAlice, nftAlice, composableResourceId); + await checkResource(composableResource, 'Composable', composableResourceId, resourcesInfo[2]); + + const slotResource = await getResourceById(api, collectionIdAlice, nftAlice, slotResourceId); + await checkResource(slotResource, 'Slot', slotResourceId, resourcesInfo[3]); + }); + + it('[negative]: unable to add a resource to the non-existing NFT', async () => { + const collectionIdAlice = await createCollection( + api, + alice, + 'test-metadata', + null, + 'test-symbol', + ); + + const tx = addNftBasicResource( + api, + alice, + 'added', + collectionIdAlice, + nonexistentId, + src, + metadata, + license, + thumb, + ); + + await expectTxFailure(/rmrkCore\.NoAvailableNftId/, tx); + }); + + it('[negative]: unable to add a resource by a not-an-owner user', async () => { + const collectionIdAlice = await createCollection( + api, + alice, + 'test-metadata', + null, + 'test-symbol', + ); + + const nftAlice = await mintNft( + api, + alice, + alice, + collectionIdAlice, + 'nft-metadata', + ); + + const tx = addNftBasicResource( + api, + bob, + 'added', + collectionIdAlice, + nftAlice, + src, + metadata, + license, + thumb, + ); + + await expectTxFailure(/rmrkCore\.NoPermission/, tx); + }); + + it('[negative]: unable to add a resource to the nested NFT if it isnt root owned by the caller', async () => { + const collectionIdAlice = await createCollection( + api, + alice, + 'test-metadata', + null, + 'test-symbol', + ); + + const parentNftId = await mintNft(api, alice, alice, collectionIdAlice, 'parent-nft-metadata'); + const childNftId = await mintNft(api, alice, alice, collectionIdAlice, 'child-nft-metadata'); + + const newOwnerNFT: NftIdTuple = [collectionIdAlice, parentNftId]; + + await sendNft(api, 'sent', alice, collectionIdAlice, childNftId, newOwnerNFT); + + const tx = addNftBasicResource( + api, + bob, + 'added', + collectionIdAlice, + childNftId, + src, + metadata, + license, + thumb, + ); + + await expectTxFailure(/rmrkCore\.NoPermission/, tx); + }); + + it('accept resource', async () => { + const collectionIdBob = await createCollection( + api, + bob, + 'test-metadata', + null, + 'test-symbol', + ); + + const nftAlice = await mintNft( + api, + bob, + alice, + collectionIdBob, + 'nft-metadata', + ); + + const resourceId = await addNftBasicResource( + api, + bob, + 'pending', + collectionIdBob, + nftAlice, + src, + metadata, + license, + thumb, + ); + + await acceptNftResource(api, alice, collectionIdBob, nftAlice, resourceId); + }); + + it('[negative]: unable to accept a non-existing resource', async () => { + const collectionIdBob = await createCollection( + api, + bob, + 'test-metadata', + null, + 'test-symbol', + ); + + const nftAlice = await mintNft( + api, + bob, + alice, + collectionIdBob, + 'nft-metadata', + ); + + const tx = acceptNftResource(api, alice, collectionIdBob, nftAlice, nonexistentId); + await expectTxFailure(/rmrkCore\.ResourceDoesntExist/, tx); + }); + + it('[negative]: unable to accept a resource by a not-an-NFT-owner user', async () => { + const collectionIdBob = await createCollection( + api, + bob, + 'test-metadata', + null, + 'test-symbol', + ); + + const nftAlice = await mintNft( + api, + bob, + alice, + collectionIdBob, + 'nft-metadata', + ); + + const resourceId = await addNftBasicResource( + api, + bob, + 'pending', + collectionIdBob, + nftAlice, + src, + metadata, + license, + thumb, + ); + + const tx = acceptNftResource(api, bob, collectionIdBob, nftAlice, resourceId); + + await expectTxFailure(/rmrkCore\.NoPermission/, tx); + }); + + it('[negative]: unable to accept a resource to a non-target NFT', async () => { + const collectionIdBob = await createCollection( + api, + bob, + 'test-metadata', + null, + 'test-symbol', + ); + + const nftAlice = await mintNft( + api, + bob, + alice, + collectionIdBob, + 'nft-metadata', + ); + + const wrongNft = await mintNft( + api, + bob, + alice, + collectionIdBob, + 'nft-metadata', + ); + + const resourceId = await addNftBasicResource( + api, + bob, + 'pending', + collectionIdBob, + nftAlice, + src, + metadata, + license, + thumb, + ); + + const tx = acceptNftResource(api, bob, collectionIdBob, wrongNft, resourceId); + + await expectTxFailure(/rmrkCore\.ResourceDoesntExist/, tx); + }); + + + after(() => { + after(async() => { await api.disconnect(); }); + }); +}); --- a/tests/src/rmrk/addResource.test.ts +++ /dev/null @@ -1,437 +0,0 @@ -import {expect} from 'chai'; -import {getApiConnection} from '../substrate/substrate-api'; -import {NftIdTuple} from './util/fetch'; -import {expectTxFailure, getResourceById, requirePallets, Pallets} from './util/helpers'; -import { - addNftBasicResource, - acceptNftResource, - createCollection, - mintNft, - sendNft, - addNftSlotResource, - addNftComposableResource, -} from './util/tx'; -import {RmrkTraitsResourceResourceInfo as ResourceInfo} from '@polkadot/types/lookup'; - -describe('integration test: add NFT resource', () => { - const Alice = '//Alice'; - const Bob = '//Bob'; - const src = 'test-res-src'; - const metadata = 'test-res-metadata'; - const license = 'test-res-license'; - const thumb = 'test-res-thumb'; - - const nonexistentId = 99999; - - let api: any; - before(async function() { - api = await getApiConnection(); - await requirePallets(this, [Pallets.RmrkCore]); - }); - - it('add resource', async () => { - const collectionIdAlice = await createCollection( - api, - Alice, - 'test-metadata', - null, - 'test-symbol', - ); - - const nftAlice = await mintNft( - api, - Alice, - Alice, - collectionIdAlice, - 'nft-metadata', - ); - - await addNftBasicResource( - api, - Alice, - 'added', - collectionIdAlice, - nftAlice, - src, - metadata, - license, - thumb, - ); - }); - - it('add a resource to the nested NFT', async () => { - const collectionIdAlice = await createCollection( - api, - Alice, - 'test-metadata', - null, - 'test-symbol', - ); - - const parentNftId = await mintNft(api, Alice, Alice, collectionIdAlice, 'parent-nft-metadata'); - const childNftId = await mintNft(api, Alice, Alice, collectionIdAlice, 'child-nft-metadata'); - - const newOwnerNFT: NftIdTuple = [collectionIdAlice, parentNftId]; - - await sendNft(api, 'sent', Alice, collectionIdAlice, childNftId, newOwnerNFT); - - await addNftBasicResource( - api, - Alice, - 'added', - collectionIdAlice, - childNftId, - src, - metadata, - license, - thumb, - ); - }); - - it('add multiple resources', async () => { - const collectionIdAlice = await createCollection( - api, - Alice, - 'test-metadata', - null, - 'test-symbol', - ); - - const nftAlice = await mintNft( - api, - Alice, - Alice, - collectionIdAlice, - 'nft-metadata', - ); - - const baseId = 42; - const slotId = 10; - const parts = [0, 5, 2]; - - const resourcesInfo = []; - const resourceNum = 4; - - const checkResource = async (resource: ResourceInfo, resType: string, expectedId: number, expected: { - src: string, - metadata: string, - license: string, - thumb: string - }) => { - - // FIXME A workaround. It seems it is a PolkadotJS bug. - // All of the following are `false`. - // - // console.log('>>> basic:', resource.resource.isBasic); - // console.log('>>> composable:', resource.resource.isComposable); - // console.log('>>> slot:', resource.resource.isSlot); - const resourceJson = (resource.resource.toHuman() as any)[resType]; - - expect(resource.id.toNumber(), 'Error: Invalid resource Id') - .to.be.eq(expectedId); - - expect(resourceJson.src, 'Error: Invalid resource src') - .to.be.eq(expected.src); - expect(resourceJson.metadata, 'Error: Invalid resource metadata') - .to.be.eq(expected.metadata); - expect(resourceJson.license, 'Error: Invalid resource license') - .to.be.eq(expected.license); - expect(resourceJson.thumb, 'Error: Invalid resource thumb') - .to.be.eq(expected.thumb); - }; - - for (let i = 0; i < resourceNum; i++) { - resourcesInfo.push({ - src: src + 'r-' + i, - metadata: metadata + 'r-' + i, - license: license + 'r-' + i, - thumb: thumb + 'r-' + i, - }); - } - - const firstBasicResourceId = await addNftBasicResource( - api, - Alice, - 'added', - collectionIdAlice, - nftAlice, - resourcesInfo[0].src, - resourcesInfo[0].metadata, - resourcesInfo[0].license, - resourcesInfo[0].thumb, - ); - - const secondBasicResourceId = await addNftBasicResource( - api, - Alice, - 'added', - collectionIdAlice, - nftAlice, - resourcesInfo[1].src, - resourcesInfo[1].metadata, - resourcesInfo[1].license, - resourcesInfo[1].thumb, - ); - - const composableResourceId = await addNftComposableResource( - api, - Alice, - 'added', - collectionIdAlice, - nftAlice, - parts, - baseId, - resourcesInfo[2].src, - resourcesInfo[2].metadata, - resourcesInfo[2].license, - resourcesInfo[2].thumb, - ); - - const slotResourceId = await addNftSlotResource( - api, - Alice, - 'added', - collectionIdAlice, - nftAlice, - baseId, - slotId, - resourcesInfo[3].src, - resourcesInfo[3].metadata, - resourcesInfo[3].license, - resourcesInfo[3].thumb, - ); - - const firstResource = await getResourceById(api, collectionIdAlice, nftAlice, firstBasicResourceId); - await checkResource(firstResource, 'Basic', firstBasicResourceId, resourcesInfo[0]); - - const secondResource = await getResourceById(api, collectionIdAlice, nftAlice, secondBasicResourceId); - await checkResource(secondResource, 'Basic', secondBasicResourceId, resourcesInfo[1]); - - const composableResource = await getResourceById(api, collectionIdAlice, nftAlice, composableResourceId); - await checkResource(composableResource, 'Composable', composableResourceId, resourcesInfo[2]); - - const slotResource = await getResourceById(api, collectionIdAlice, nftAlice, slotResourceId); - await checkResource(slotResource, 'Slot', slotResourceId, resourcesInfo[3]); - }); - - it('[negative]: unable to add a resource to the non-existing NFT', async () => { - const collectionIdAlice = await createCollection( - api, - Alice, - 'test-metadata', - null, - 'test-symbol', - ); - - const tx = addNftBasicResource( - api, - Alice, - 'added', - collectionIdAlice, - nonexistentId, - src, - metadata, - license, - thumb, - ); - - await expectTxFailure(/rmrkCore\.NoAvailableNftId/, tx); - }); - - it('[negative]: unable to add a resource by a not-an-owner user', async () => { - const collectionIdAlice = await createCollection( - api, - Alice, - 'test-metadata', - null, - 'test-symbol', - ); - - const nftAlice = await mintNft( - api, - Alice, - Alice, - collectionIdAlice, - 'nft-metadata', - ); - - const tx = addNftBasicResource( - api, - Bob, - 'added', - collectionIdAlice, - nftAlice, - src, - metadata, - license, - thumb, - ); - - await expectTxFailure(/rmrkCore\.NoPermission/, tx); - }); - - it('[negative]: unable to add a resource to the nested NFT if it isnt root owned by the caller', async () => { - const collectionIdAlice = await createCollection( - api, - Alice, - 'test-metadata', - null, - 'test-symbol', - ); - - const parentNftId = await mintNft(api, Alice, Alice, collectionIdAlice, 'parent-nft-metadata'); - const childNftId = await mintNft(api, Alice, Alice, collectionIdAlice, 'child-nft-metadata'); - - const newOwnerNFT: NftIdTuple = [collectionIdAlice, parentNftId]; - - await sendNft(api, 'sent', Alice, collectionIdAlice, childNftId, newOwnerNFT); - - const tx = addNftBasicResource( - api, - Bob, - 'added', - collectionIdAlice, - childNftId, - src, - metadata, - license, - thumb, - ); - - await expectTxFailure(/rmrkCore\.NoPermission/, tx); - }); - - it('accept resource', async () => { - const collectionIdBob = await createCollection( - api, - Bob, - 'test-metadata', - null, - 'test-symbol', - ); - - const nftAlice = await mintNft( - api, - Bob, - Alice, - collectionIdBob, - 'nft-metadata', - ); - - const resourceId = await addNftBasicResource( - api, - Bob, - 'pending', - collectionIdBob, - nftAlice, - src, - metadata, - license, - thumb, - ); - - await acceptNftResource(api, Alice, collectionIdBob, nftAlice, resourceId); - }); - - it('[negative]: unable to accept a non-existing resource', async () => { - const collectionIdBob = await createCollection( - api, - Bob, - 'test-metadata', - null, - 'test-symbol', - ); - - const nftAlice = await mintNft( - api, - Bob, - Alice, - collectionIdBob, - 'nft-metadata', - ); - - const tx = acceptNftResource(api, Alice, collectionIdBob, nftAlice, nonexistentId); - await expectTxFailure(/rmrkCore\.ResourceDoesntExist/, tx); - }); - - it('[negative]: unable to accept a resource by a not-an-NFT-owner user', async () => { - const collectionIdBob = await createCollection( - api, - Bob, - 'test-metadata', - null, - 'test-symbol', - ); - - const nftAlice = await mintNft( - api, - Bob, - Alice, - collectionIdBob, - 'nft-metadata', - ); - - const resourceId = await addNftBasicResource( - api, - Bob, - 'pending', - collectionIdBob, - nftAlice, - src, - metadata, - license, - thumb, - ); - - const tx = acceptNftResource(api, Bob, collectionIdBob, nftAlice, resourceId); - - await expectTxFailure(/rmrkCore\.NoPermission/, tx); - }); - - it('[negative]: unable to accept a resource to a non-target NFT', async () => { - const collectionIdBob = await createCollection( - api, - Bob, - 'test-metadata', - null, - 'test-symbol', - ); - - const nftAlice = await mintNft( - api, - Bob, - Alice, - collectionIdBob, - 'nft-metadata', - ); - - const wrongNft = await mintNft( - api, - Bob, - Alice, - collectionIdBob, - 'nft-metadata', - ); - - const resourceId = await addNftBasicResource( - api, - Bob, - 'pending', - collectionIdBob, - nftAlice, - src, - metadata, - license, - thumb, - ); - - const tx = acceptNftResource(api, Bob, collectionIdBob, wrongNft, resourceId); - - await expectTxFailure(/rmrkCore\.ResourceDoesntExist/, tx); - }); - - - after(() => { - after(async() => { await api.disconnect(); }); - }); -}); --- /dev/null +++ b/tests/src/rmrk/addTheme.seqtest.ts @@ -0,0 +1,129 @@ +import {expect} from 'chai'; +import {getApiConnection} from '../substrate/substrate-api'; +import {createBase, addTheme} from './util/tx'; +import {expectTxFailure, requirePallets, Pallets} from './util/helpers'; +import {getThemeNames} from './util/fetch'; + +describe('integration test: add Theme to Base', () => { + let api: any; + before(async function() { + api = await getApiConnection(); + await requirePallets(this, [Pallets.RmrkEquip]); + }); + + const alice = '//Alice'; + const bob = '//Bob'; + + it('add default theme', async () => { + const baseId = await createBase(api, alice, 'default-themed-base', 'DTBase', []); + await addTheme(api, alice, baseId, { + name: 'default', + properties: [ + { + key: 'some-key', + value: 'some-key-value', + }, + { + key: 'another-key', + value: 'another-key-value', + }, + ], + }); + }); + + it('add default theme and a custom one', async () => { + const baseId = await createBase(api, alice, '2-themed-base', '2TBase', []); + await addTheme(api, alice, baseId, { + name: 'default', + properties: [ + { + key: 'default-key', + value: 'default-key-value', + }, + ], + }); + await addTheme(api, alice, baseId, { + name: 'custom-theme', + properties: [ + { + key: 'custom-key-0', + value: 'custom-key-value-0', + }, + { + key: 'custom-key-1', + value: 'custom-key-value-1', + }, + ], + }); + }); + + it('fetch filtered theme keys', async () => { + const baseId = await createBase(api, alice, '2-themed-base', '2TBase', []); + await addTheme(api, alice, baseId, { + name: 'default', + properties: [ + { + key: 'first-key', + value: 'first-key-value', + }, + { + key: 'second-key', + value: 'second-key-value', + }, + ], + }, ['second-key']); + }); + + it('fetch theme names', async() => { + const baseId = await createBase(api, alice, '3-themed-base', '3TBase', []); + const names = [ + 'default', + 'first-theme', + 'second-theme', + ]; + + for (let i = 0; i < names.length; i++) { + await addTheme(api, alice, baseId, {name: names[i], properties: [{key: 'dummy', value: 'dummy'}]}); + } + + const fetchedNames = await getThemeNames(api, baseId); + + for (let i = 0; i < names.length; i++) { + const isFound = fetchedNames.find((name) => name === names[i]) !== undefined; + + expect(isFound, 'Error: invalid theme names').to.be.true; + } + }); + + it('[negative] unable to add theme to non-existing base', async () => { + const maxBaseId = 0xFFFFFFFF; + const tx = addTheme(api, alice, maxBaseId, { + name: 'default', + properties: [], + }); + + await expectTxFailure(/rmrkEquip\.BaseDoesntExist/, tx); + }); + + it('[negative] unable to add custom theme if no default theme', async () => { + const baseId = await createBase(api, alice, 'no-default-themed-base', 'NDTBase', []); + const tx = addTheme(api, alice, baseId, { + name: 'custom-theme', + properties: [], + }); + + await expectTxFailure(/rmrkEquip\.NeedsDefaultThemeFirst/, tx); + }); + + it('[negative] unable to add theme by a not-an-owner', async () => { + const baseId = await createBase(api, alice, 'no-default-themed-base', 'NDTBase', []); + const tx = addTheme(api, bob, baseId, { + name: 'default', + properties: [], + }); + + await expectTxFailure(/rmrkEquip\.PermissionError/, tx); + }); + + after(async() => { await api.disconnect(); }); +}); --- a/tests/src/rmrk/addTheme.test.ts +++ /dev/null @@ -1,129 +0,0 @@ -import {expect} from 'chai'; -import {getApiConnection} from '../substrate/substrate-api'; -import {createBase, addTheme} from './util/tx'; -import {expectTxFailure, requirePallets, Pallets} from './util/helpers'; -import {getThemeNames} from './util/fetch'; - -describe('integration test: add Theme to Base', () => { - let api: any; - before(async function() { - api = await getApiConnection(); - await requirePallets(this, [Pallets.RmrkEquip]); - }); - - const alice = '//Alice'; - const bob = '//Bob'; - - it('add default theme', async () => { - const baseId = await createBase(api, alice, 'default-themed-base', 'DTBase', []); - await addTheme(api, alice, baseId, { - name: 'default', - properties: [ - { - key: 'some-key', - value: 'some-key-value', - }, - { - key: 'another-key', - value: 'another-key-value', - }, - ], - }); - }); - - it('add default theme and a custom one', async () => { - const baseId = await createBase(api, alice, '2-themed-base', '2TBase', []); - await addTheme(api, alice, baseId, { - name: 'default', - properties: [ - { - key: 'default-key', - value: 'default-key-value', - }, - ], - }); - await addTheme(api, alice, baseId, { - name: 'custom-theme', - properties: [ - { - key: 'custom-key-0', - value: 'custom-key-value-0', - }, - { - key: 'custom-key-1', - value: 'custom-key-value-1', - }, - ], - }); - }); - - it('fetch filtered theme keys', async () => { - const baseId = await createBase(api, alice, '2-themed-base', '2TBase', []); - await addTheme(api, alice, baseId, { - name: 'default', - properties: [ - { - key: 'first-key', - value: 'first-key-value', - }, - { - key: 'second-key', - value: 'second-key-value', - }, - ], - }, ['second-key']); - }); - - it('fetch theme names', async() => { - const baseId = await createBase(api, alice, '3-themed-base', '3TBase', []); - const names = [ - 'default', - 'first-theme', - 'second-theme', - ]; - - for (let i = 0; i < names.length; i++) { - await addTheme(api, alice, baseId, {name: names[i], properties: [{key: 'dummy', value: 'dummy'}]}); - } - - const fetchedNames = await getThemeNames(api, baseId); - - for (let i = 0; i < names.length; i++) { - const isFound = fetchedNames.find((name) => name === names[i]) !== undefined; - - expect(isFound, 'Error: invalid theme names').to.be.true; - } - }); - - it('[negative] unable to add theme to non-existing base', async () => { - const maxBaseId = 0xFFFFFFFF; - const tx = addTheme(api, alice, maxBaseId, { - name: 'default', - properties: [], - }); - - await expectTxFailure(/rmrkEquip\.BaseDoesntExist/, tx); - }); - - it('[negative] unable to add custom theme if no default theme', async () => { - const baseId = await createBase(api, alice, 'no-default-themed-base', 'NDTBase', []); - const tx = addTheme(api, alice, baseId, { - name: 'custom-theme', - properties: [], - }); - - await expectTxFailure(/rmrkEquip\.NeedsDefaultThemeFirst/, tx); - }); - - it('[negative] unable to add theme by a not-an-owner', async () => { - const baseId = await createBase(api, alice, 'no-default-themed-base', 'NDTBase', []); - const tx = addTheme(api, bob, baseId, { - name: 'default', - properties: [], - }); - - await expectTxFailure(/rmrkEquip\.PermissionError/, tx); - }); - - after(async() => { await api.disconnect(); }); -}); --- /dev/null +++ b/tests/src/rmrk/burnNft.seqtest.ts @@ -0,0 +1,170 @@ +import {getApiConnection} from '../substrate/substrate-api'; +import {expectTxFailure, requirePallets, Pallets} from './util/helpers'; +import {NftIdTuple, getChildren} from './util/fetch'; +import {burnNft, createCollection, sendNft, mintNft} from './util/tx'; + +import chai from 'chai'; +import chaiAsPromised from 'chai-as-promised'; + +chai.use(chaiAsPromised); +const expect = chai.expect; + +describe('integration test: burn nft', () => { + const alice = '//Alice'; + const bob = '//Bob'; + + let api: any; + before(async function() { + api = await getApiConnection(); + await requirePallets(this, [Pallets.RmrkCore]); + }); + + + it('burn nft', async () => { + await createCollection( + api, + alice, + 'test-metadata', + null, + 'test-symbol', + ).then(async (collectionId) => { + const nftId = await mintNft( + api, + alice, + alice, + collectionId, + 'nft-metadata', + ); + await burnNft(api, alice, collectionId, nftId); + }); + }); + + it('burn nft with children', async () => { + const collectionId = await createCollection( + api, + alice, + 'test-metadata', + null, + 'test-symbol', + ); + + const parentNftId = await mintNft( + api, + alice, + alice, + collectionId, + 'nft-metadata', + ); + + const childNftId = await mintNft( + api, + alice, + alice, + collectionId, + 'nft-metadata', + ); + + const newOwnerNFT: NftIdTuple = [collectionId, parentNftId]; + + await sendNft(api, 'sent', alice, collectionId, childNftId, newOwnerNFT); + + const childrenBefore = await getChildren(api, collectionId, parentNftId); + expect(childrenBefore.length === 1, 'Error: parent NFT should have children') + .to.be.true; + + const child = childrenBefore[0]; + expect(child.collectionId.eq(collectionId), 'Error: invalid child collection Id') + .to.be.true; + + expect(child.nftId.eq(childNftId), 'Error: invalid child NFT Id') + .to.be.true; + + await burnNft(api, alice, collectionId, parentNftId); + + const childrenAfter = await getChildren(api, collectionId, parentNftId); + + expect(childrenAfter.length === 0, 'Error: children should be burned').to.be.true; + }); + + it('burn child nft', async () => { + const collectionId = await createCollection( + api, + alice, + 'test-metadata', + null, + 'test-symbol', + ); + + const parentNftId = await mintNft( + api, + alice, + alice, + collectionId, + 'nft-metadata', + ); + + const childNftId = await mintNft( + api, + alice, + alice, + collectionId, + 'nft-metadata', + ); + + const newOwnerNFT: NftIdTuple = [collectionId, parentNftId]; + + await sendNft(api, 'sent', alice, collectionId, childNftId, newOwnerNFT); + + const childrenBefore = await getChildren(api, collectionId, parentNftId); + expect(childrenBefore.length === 1, 'Error: parent NFT should have children') + .to.be.true; + + const child = childrenBefore[0]; + expect(child.collectionId.eq(collectionId), 'Error: invalid child collection Id') + .to.be.true; + + expect(child.nftId.eq(childNftId), 'Error: invalid child NFT Id') + .to.be.true; + + await burnNft(api, alice, collectionId, childNftId); + + const childrenAfter = await getChildren(api, collectionId, parentNftId); + + expect(childrenAfter.length === 0, 'Error: children should be burned').to.be.true; + }); + + it('[negative] burn non-existing NFT', async () => { + await createCollection( + api, + alice, + 'test-metadata', + null, + 'test-symbol', + ).then(async (collectionId) => { + const tx = burnNft(api, alice, collectionId, 99999); + await expectTxFailure(/rmrkCore\.NoAvailableNftId/, tx); + }); + }); + + it('[negative] burn not an owner NFT user', async () => { + await createCollection( + api, + alice, + 'test-metadata', + null, + 'test-symbol', + ).then(async (collectionId) => { + const nftId = await mintNft( + api, + alice, + alice, + collectionId, + 'nft-metadata', + ); + const tx = burnNft(api, bob, collectionId, nftId); + await expectTxFailure(/rmrkCore\.NoPermission/, tx); + }); + }); + + after(async() => { await api.disconnect(); }); +}); --- a/tests/src/rmrk/burnNft.test.ts +++ /dev/null @@ -1,170 +0,0 @@ -import {getApiConnection} from '../substrate/substrate-api'; -import {expectTxFailure, requirePallets, Pallets} from './util/helpers'; -import {NftIdTuple, getChildren} from './util/fetch'; -import {burnNft, createCollection, sendNft, mintNft} from './util/tx'; - -import chai from 'chai'; -import chaiAsPromised from 'chai-as-promised'; - -chai.use(chaiAsPromised); -const expect = chai.expect; - -describe('integration test: burn nft', () => { - const Alice = '//Alice'; - const Bob = '//Bob'; - - let api: any; - before(async function() { - api = await getApiConnection(); - await requirePallets(this, [Pallets.RmrkCore]); - }); - - - it('burn nft', async () => { - await createCollection( - api, - Alice, - 'test-metadata', - null, - 'test-symbol', - ).then(async (collectionId) => { - const nftId = await mintNft( - api, - Alice, - Alice, - collectionId, - 'nft-metadata', - ); - await burnNft(api, Alice, collectionId, nftId); - }); - }); - - it('burn nft with children', async () => { - const collectionId = await createCollection( - api, - Alice, - 'test-metadata', - null, - 'test-symbol', - ); - - const parentNftId = await mintNft( - api, - Alice, - Alice, - collectionId, - 'nft-metadata', - ); - - const childNftId = await mintNft( - api, - Alice, - Alice, - collectionId, - 'nft-metadata', - ); - - const newOwnerNFT: NftIdTuple = [collectionId, parentNftId]; - - await sendNft(api, 'sent', Alice, collectionId, childNftId, newOwnerNFT); - - const childrenBefore = await getChildren(api, collectionId, parentNftId); - expect(childrenBefore.length === 1, 'Error: parent NFT should have children') - .to.be.true; - - const child = childrenBefore[0]; - expect(child.collectionId.eq(collectionId), 'Error: invalid child collection Id') - .to.be.true; - - expect(child.nftId.eq(childNftId), 'Error: invalid child NFT Id') - .to.be.true; - - await burnNft(api, Alice, collectionId, parentNftId); - - const childrenAfter = await getChildren(api, collectionId, parentNftId); - - expect(childrenAfter.length === 0, 'Error: children should be burned').to.be.true; - }); - - it('burn child nft', async () => { - const collectionId = await createCollection( - api, - Alice, - 'test-metadata', - null, - 'test-symbol', - ); - - const parentNftId = await mintNft( - api, - Alice, - Alice, - collectionId, - 'nft-metadata', - ); - - const childNftId = await mintNft( - api, - Alice, - Alice, - collectionId, - 'nft-metadata', - ); - - const newOwnerNFT: NftIdTuple = [collectionId, parentNftId]; - - await sendNft(api, 'sent', Alice, collectionId, childNftId, newOwnerNFT); - - const childrenBefore = await getChildren(api, collectionId, parentNftId); - expect(childrenBefore.length === 1, 'Error: parent NFT should have children') - .to.be.true; - - const child = childrenBefore[0]; - expect(child.collectionId.eq(collectionId), 'Error: invalid child collection Id') - .to.be.true; - - expect(child.nftId.eq(childNftId), 'Error: invalid child NFT Id') - .to.be.true; - - await burnNft(api, Alice, collectionId, childNftId); - - const childrenAfter = await getChildren(api, collectionId, parentNftId); - - expect(childrenAfter.length === 0, 'Error: children should be burned').to.be.true; - }); - - it('[negative] burn non-existing NFT', async () => { - await createCollection( - api, - Alice, - 'test-metadata', - null, - 'test-symbol', - ).then(async (collectionId) => { - const tx = burnNft(api, Alice, collectionId, 99999); - await expectTxFailure(/rmrkCore\.NoAvailableNftId/, tx); - }); - }); - - it('[negative] burn not an owner NFT user', async () => { - await createCollection( - api, - Alice, - 'test-metadata', - null, - 'test-symbol', - ).then(async (collectionId) => { - const nftId = await mintNft( - api, - Alice, - Alice, - collectionId, - 'nft-metadata', - ); - const tx = burnNft(api, Bob, collectionId, nftId); - await expectTxFailure(/rmrkCore\.NoPermission/, tx); - }); - }); - - after(async() => { await api.disconnect(); }); -}); --- /dev/null +++ b/tests/src/rmrk/changeCollectionIssuer.seqtest.ts @@ -0,0 +1,53 @@ +import {getApiConnection} from '../substrate/substrate-api'; +import {expectTxFailure, requirePallets, Pallets} from './util/helpers'; +import { + changeIssuer, + createCollection, +} from './util/tx'; + +describe('integration test: collection issuer', () => { + const alice = '//Alice'; + const bob = '//Bob'; + + let api: any; + before(async function() { + api = await getApiConnection(); + await requirePallets(this, [Pallets.RmrkCore]); + }); + + + + it('change collection issuer', async () => { + await createCollection( + api, + alice, + 'test-metadata', + null, + 'test-symbol', + ).then(async (collectionId) => { + await changeIssuer(api, alice, collectionId, bob); + }); + }); + + it('[negative] change not an owner NFT collection issuer', async () => { + await createCollection(api, bob, 'test-metadata', null, 'test-symbol').then(async (collectionId) => { + const tx = changeIssuer(api, alice, collectionId, bob); + await expectTxFailure(/rmrkCore\.NoPermission/, tx); + }); + }); + + it('[negative] change non-existigit NFT collection issuer', async () => { + await createCollection( + api, + alice, + 'test-metadata', + null, + 'test-symbol', + ).then(async () => { + const tx = changeIssuer(api, alice, 99999, bob); + await expectTxFailure(/rmrkCore\.CollectionUnknown/, tx); + }); + }); + + after(async() => { await api.disconnect(); }); +}); --- a/tests/src/rmrk/changeCollectionIssuer.test.ts +++ /dev/null @@ -1,53 +0,0 @@ -import {getApiConnection} from '../substrate/substrate-api'; -import {expectTxFailure, requirePallets, Pallets} from './util/helpers'; -import { - changeIssuer, - createCollection, -} from './util/tx'; - -describe('integration test: collection issuer', () => { - const Alice = '//Alice'; - const Bob = '//Bob'; - - let api: any; - before(async function() { - api = await getApiConnection(); - await requirePallets(this, [Pallets.RmrkCore]); - }); - - - - it('change collection issuer', async () => { - await createCollection( - api, - Alice, - 'test-metadata', - null, - 'test-symbol', - ).then(async (collectionId) => { - await changeIssuer(api, Alice, collectionId, Bob); - }); - }); - - it('[negative] change not an owner NFT collection issuer', async () => { - await createCollection(api, Bob, 'test-metadata', null, 'test-symbol').then(async (collectionId) => { - const tx = changeIssuer(api, Alice, collectionId, Bob); - await expectTxFailure(/rmrkCore\.NoPermission/, tx); - }); - }); - - it('[negative] change non-existigit NFT collection issuer', async () => { - await createCollection( - api, - Alice, - 'test-metadata', - null, - 'test-symbol', - ).then(async () => { - const tx = changeIssuer(api, Alice, 99999, Bob); - await expectTxFailure(/rmrkCore\.CollectionUnknown/, tx); - }); - }); - - after(async() => { await api.disconnect(); }); -}); --- /dev/null +++ b/tests/src/rmrk/createBase.seqtest.ts @@ -0,0 +1,88 @@ +import {getApiConnection} from '../substrate/substrate-api'; +import {requirePallets, Pallets} from './util/helpers'; +import {createCollection, createBase} from './util/tx'; + +describe('integration test: create new Base', () => { + let api: any; + before(async function() { + api = await getApiConnection(); + await requirePallets(this, [Pallets.RmrkCore, Pallets.RmrkEquip]); + }); + + const alice = '//Alice'; + + it('create empty Base', async () => { + await createBase(api, alice, 'empty-base-type', 'EBase', []); + }); + + it('create Base with fixed part', async () => { + await createBase(api, alice, 'fixedpart-base-type', 'FPBase', [ + { + 'FixedPart': { + id: 42, + z: 0, + src: 'some-fixed-url', + }, + }, + ]); + }); + + it('create Base with slot part (no collection)', async () => { + await createBase(api, alice, 'slotpart-base-type', 'SPBase', [ + { + 'SlotPart': { + id: 112, + equippable: 'Empty', + z: 0, + src: 'some-fallback-slot-url', + }, + }, + ]); + }); + + it('create Base with slot part (any collection)', async () => { + await createBase(api, alice, 'slotpartany-base-type', 'SPABase', [ + { + 'SlotPart': { + id: 222, + equippable: 'All', + z: 1, + src: 'some-fallback-slot-url', + }, + }, + ]); + }); + + it('create Base with slot part (custom collections)', async () => { + const firstCollectionId = await createCollection( + api, + alice, + 'first-collection-meta', + null, + 'first-collection', + ); + + const secondCollectionId = await createCollection( + api, + alice, + 'first-collection-meta', + null, + 'first-collection', + ); + + await createBase(api, alice, 'slotpartcustom-base-type', 'SPCBase', [ + { + 'SlotPart': { + id: 1024, + equippable: { + 'Custom': [firstCollectionId, secondCollectionId], + }, + z: 2, + src: 'some-fallback-slot-url', + }, + }, + ]); + }); + + after(async() => { await api.disconnect(); }); +}); --- a/tests/src/rmrk/createBase.test.ts +++ /dev/null @@ -1,88 +0,0 @@ -import {getApiConnection} from '../substrate/substrate-api'; -import {requirePallets, Pallets} from './util/helpers'; -import {createCollection, createBase} from './util/tx'; - -describe('integration test: create new Base', () => { - let api: any; - before(async function() { - api = await getApiConnection(); - await requirePallets(this, [Pallets.RmrkCore, Pallets.RmrkEquip]); - }); - - const alice = '//Alice'; - - it('create empty Base', async () => { - await createBase(api, alice, 'empty-base-type', 'EBase', []); - }); - - it('create Base with fixed part', async () => { - await createBase(api, alice, 'fixedpart-base-type', 'FPBase', [ - { - 'FixedPart': { - id: 42, - z: 0, - src: 'some-fixed-url', - }, - }, - ]); - }); - - it('create Base with slot part (no collection)', async () => { - await createBase(api, alice, 'slotpart-base-type', 'SPBase', [ - { - 'SlotPart': { - id: 112, - equippable: 'Empty', - z: 0, - src: 'some-fallback-slot-url', - }, - }, - ]); - }); - - it('create Base with slot part (any collection)', async () => { - await createBase(api, alice, 'slotpartany-base-type', 'SPABase', [ - { - 'SlotPart': { - id: 222, - equippable: 'All', - z: 1, - src: 'some-fallback-slot-url', - }, - }, - ]); - }); - - it('create Base with slot part (custom collections)', async () => { - const firstCollectionId = await createCollection( - api, - alice, - 'first-collection-meta', - null, - 'first-collection', - ); - - const secondCollectionId = await createCollection( - api, - alice, - 'first-collection-meta', - null, - 'first-collection', - ); - - await createBase(api, alice, 'slotpartcustom-base-type', 'SPCBase', [ - { - 'SlotPart': { - id: 1024, - equippable: { - 'Custom': [firstCollectionId, secondCollectionId], - }, - z: 2, - src: 'some-fallback-slot-url', - }, - }, - ]); - }); - - after(async() => { await api.disconnect(); }); -}); --- /dev/null +++ b/tests/src/rmrk/createCollection.seqtest.ts @@ -0,0 +1,25 @@ +import {getApiConnection} from '../substrate/substrate-api'; +import {requirePallets, Pallets} from './util/helpers'; +import {createCollection} from './util/tx'; + +describe('Integration test: create new collection', () => { + let api: any; + before(async function () { + api = await getApiConnection(); + await requirePallets(this, [Pallets.RmrkCore]); + }); + + + + const alice = '//Alice'; + + it('create NFT collection', async () => { + await createCollection(api, alice, 'test-metadata', 42, 'test-symbol'); + }); + + it('create NFT collection without token limit', async () => { + await createCollection(api, alice, 'no-limit-metadata', null, 'no-limit-symbol'); + }); + + after(async() => { await api.disconnect(); }); +}); --- a/tests/src/rmrk/createCollection.test.ts +++ /dev/null @@ -1,25 +0,0 @@ -import {getApiConnection} from '../substrate/substrate-api'; -import {requirePallets, Pallets} from './util/helpers'; -import {createCollection} from './util/tx'; - -describe('Integration test: create new collection', () => { - let api: any; - before(async function () { - api = await getApiConnection(); - await requirePallets(this, [Pallets.RmrkCore]); - }); - - - - const alice = '//Alice'; - - it('create NFT collection', async () => { - await createCollection(api, alice, 'test-metadata', 42, 'test-symbol'); - }); - - it('create NFT collection without token limit', async () => { - await createCollection(api, alice, 'no-limit-metadata', null, 'no-limit-symbol'); - }); - - after(async() => { await api.disconnect(); }); -}); --- /dev/null +++ b/tests/src/rmrk/deleteCollection.seqtest.ts @@ -0,0 +1,46 @@ +import {getApiConnection} from '../substrate/substrate-api'; +import {expectTxFailure, requirePallets, Pallets} from './util/helpers'; +import {createCollection, deleteCollection} from './util/tx'; + +describe('integration test: delete collection', () => { + let api: any; + before(async function () { + api = await getApiConnection(); + await requirePallets(this, [Pallets.RmrkCore]); + }); + + const alice = '//Alice'; + const bob = '//Bob'; + + it('delete NFT collection', async () => { + await createCollection( + api, + alice, + 'test-metadata', + null, + 'test-symbol', + ).then(async (collectionId) => { + await deleteCollection(api, alice, collectionId.toString()); + }); + }); + + it('[negative] delete non-existing NFT collection', async () => { + const tx = deleteCollection(api, alice, '99999'); + await expectTxFailure(/rmrkCore\.CollectionUnknown/, tx); + }); + + it('[negative] delete not an owner NFT collection', async () => { + await createCollection( + api, + alice, + 'test-metadata', + null, + 'test-symbol', + ).then(async (collectionId) => { + const tx = deleteCollection(api, bob, collectionId.toString()); + await expectTxFailure(/rmrkCore.NoPermission/, tx); + }); + }); + + after(async() => { await api.disconnect(); }); +}); --- a/tests/src/rmrk/deleteCollection.test.ts +++ /dev/null @@ -1,46 +0,0 @@ -import {getApiConnection} from '../substrate/substrate-api'; -import {expectTxFailure, requirePallets, Pallets} from './util/helpers'; -import {createCollection, deleteCollection} from './util/tx'; - -describe('integration test: delete collection', () => { - let api: any; - before(async function () { - api = await getApiConnection(); - await requirePallets(this, [Pallets.RmrkCore]); - }); - - const Alice = '//Alice'; - const Bob = '//Bob'; - - it('delete NFT collection', async () => { - await createCollection( - api, - Alice, - 'test-metadata', - null, - 'test-symbol', - ).then(async (collectionId) => { - await deleteCollection(api, Alice, collectionId.toString()); - }); - }); - - it('[negative] delete non-existing NFT collection', async () => { - const tx = deleteCollection(api, Alice, '99999'); - await expectTxFailure(/rmrkCore\.CollectionUnknown/, tx); - }); - - it('[negative] delete not an owner NFT collection', async () => { - await createCollection( - api, - Alice, - 'test-metadata', - null, - 'test-symbol', - ).then(async (collectionId) => { - const tx = deleteCollection(api, Bob, collectionId.toString()); - await expectTxFailure(/rmrkCore.NoPermission/, tx); - }); - }); - - after(async() => { await api.disconnect(); }); -}); --- /dev/null +++ b/tests/src/rmrk/equipNft.seqtest.ts @@ -0,0 +1,340 @@ +import {ApiPromise} from '@polkadot/api'; +import {expect} from 'chai'; +import {getApiConnection} from '../substrate/substrate-api'; +import {getNft, NftIdTuple} from './util/fetch'; +import {expectTxFailure, requirePallets, Pallets} from './util/helpers'; +import { + addNftComposableResource, + addNftSlotResource, + createBase, + createCollection, + equipNft, + mintNft, + sendNft, + unequipNft, +} from './util/tx'; + +const alice = '//Alice'; +const bob = '//Bob'; + +const composableParts: number[] = [5, 2, 7]; +const composableSrc = 'test-cmp-src'; +const composableMetadata = 'test-cmp-metadata'; +const composableLicense = 'test-comp-license'; +const composableThumb = 'test-comp-thumb'; + +const slotSrc = 'test-slot-src'; +const slotLicense = 'test-slot-license'; +const slotMetadata = 'test-slot-metadata'; +const slotThumb = 'test-slot-thumb'; + +const slotId = 1; + +async function createTestCollection(api: ApiPromise): Promise { + return createCollection( + api, + alice, + 'test-metadata', + null, + 'test-symbol', + ); +} + +async function mintTestNft(api: ApiPromise, collectionId: number): Promise { + return await mintNft( + api, + alice, + alice, + collectionId, + 'nft-metadata', + ); +} + +async function mintChildNft(api: ApiPromise, collectionId: number, parentNftId: number): Promise { + const nftChildId = await mintTestNft(api, collectionId); + + const parentNFT: NftIdTuple = [collectionId, parentNftId]; + + await sendNft(api, 'sent', alice, collectionId, nftChildId, parentNFT); + + return nftChildId; +} + +async function createTestBase(api: ApiPromise): Promise { + return createBase(api, alice, 'test-base', 'DTBase', [ + { + SlotPart: { + id: slotId, + equippable: 'All', + z: 1, + src: slotSrc, + }, + }, + ]); +} + +async function addTestComposable(api: ApiPromise, collectionId: number, nftId: number, baseId: number) { + await addNftComposableResource( + api, + alice, + 'added', + collectionId, + nftId, + composableParts, + baseId, + composableSrc, + composableMetadata, + composableLicense, + composableThumb, + ); +} + +async function addTestSlot(api: ApiPromise, collectionId: number, nftId: number, baseId: number, slotId: number): Promise { + return await addNftSlotResource( + api, + alice, + 'added', + collectionId, + nftId, + baseId, + slotId, + slotSrc, + slotMetadata, + slotLicense, + slotThumb, + ); +} + +async function checkEquipStatus( + api: ApiPromise, + expectedStatus: 'equipped' | 'unequipped', + collectionId: number, + nftId: number, +) { + const itemNftDataOpt = await getNft(api, collectionId, nftId); + expect(itemNftDataOpt.isSome, 'Error: unable to fetch item NFT data'); + + const itemNftData = itemNftDataOpt.unwrap(); + expect(itemNftData.equipped.isTrue, `Error: item NFT should be ${expectedStatus}`) + .to.be.equal(expectedStatus === 'equipped'); +} + +describe.skip('integration test: Equip NFT', () => { + + let api: any; + + before(async function () { + api = await getApiConnection(); + await requirePallets(this, [Pallets.RmrkCore, Pallets.RmrkEquip]); + }); + + it('equip nft', async () => { + const collectionId = await createTestCollection(api); + const nftParentId = await mintTestNft(api, collectionId); + const nftChildId = await mintChildNft(api, collectionId, nftParentId); + + const baseId = await createTestBase(api); + + await addTestComposable(api, collectionId, nftParentId, baseId); + const resourceId = await addTestSlot(api, collectionId, nftChildId, baseId, slotId); + + const equipperNFT: NftIdTuple = [collectionId, nftParentId]; + const itemNFT: NftIdTuple = [collectionId, nftChildId]; + + await equipNft(api, alice, itemNFT, equipperNFT, resourceId, baseId, slotId); + + await checkEquipStatus(api, 'equipped', collectionId, nftChildId); + }); + + it('unequip nft', async () => { + const collectionId = await createTestCollection(api); + const nftParentId = await mintTestNft(api, collectionId); + const nftChildId = await mintChildNft(api, collectionId, nftParentId); + + const baseId = await createTestBase(api); + + await addTestComposable(api, collectionId, nftParentId, baseId); + const resourceId = await addTestSlot(api, collectionId, nftChildId, baseId, slotId); + + const equipperNFT: NftIdTuple = [collectionId, nftParentId]; + const itemNFT: NftIdTuple = [collectionId, nftChildId]; + + await equipNft(api, alice, itemNFT, equipperNFT, resourceId, baseId, slotId); + + await checkEquipStatus(api, 'equipped', collectionId, nftChildId); + + await unequipNft(api, alice, itemNFT, equipperNFT, resourceId, baseId, slotId); + await checkEquipStatus(api, 'unequipped', collectionId, nftChildId); + }); + + it('[negative] equip NFT onto non-existing NFT', async () => { + const collectionId = await createTestCollection(api); + + const nftChildId = await mintNft( + api, + alice, + alice, + collectionId, + 'nft-metadata', + ); + + const itemNFT: NftIdTuple = [collectionId, nftChildId]; + const invalidEquipperNFT: NftIdTuple = [collectionId, 9999999]; + + const baseId = 0; + const resourceId = 0; + + const tx = equipNft(api, alice, itemNFT, invalidEquipperNFT, resourceId, baseId, slotId); + await expectTxFailure(/rmrkCore\.NoAvailableNftId/, tx); + }); + + it('[negative] equip non-existing NFT', async () => { + const collectionId = await createTestCollection(api); + const nftParentId = await mintNft( + api, + alice, + alice, + collectionId, + 'nft-metadata', + ); + + const baseId = await createTestBase(api); + + await addTestComposable(api, collectionId, nftParentId, baseId); + + const equipperNFT: NftIdTuple = [collectionId, nftParentId]; + const invalidItemNFT: NftIdTuple = [collectionId, 99999999]; + + const resourceId = 0; + + const tx = equipNft(api, alice, invalidItemNFT, equipperNFT, resourceId, baseId, slotId); + await expectTxFailure(/rmrkCore\.NoAvailableNftId/, tx); + }); + + it('[negative] equip NFT by a not-an-owner user', async () => { + const collectionId = await createTestCollection(api); + const nftParentId = await mintTestNft(api, collectionId); + const nftChildId = await mintChildNft(api, collectionId, nftParentId); + + const baseId = await createTestBase(api); + + await addTestComposable(api, collectionId, nftParentId, baseId); + + const equipperNFT: NftIdTuple = [collectionId, nftParentId]; + const itemNFT: NftIdTuple = [collectionId, nftChildId]; + + const resourceId = await addTestSlot(api, collectionId, nftChildId, baseId, slotId); + + const tx = equipNft(api, bob, itemNFT, equipperNFT, resourceId, baseId, slotId); + await expectTxFailure(/rmrkEquip\.PermissionError/, tx); + }); + + it('[negative] unable to equip NFT onto indirect parent NFT', async () => { + const collectionId = await createTestCollection(api); + const nftParentId = await mintTestNft(api, collectionId); + const nftChildId = await mintChildNft(api, collectionId, nftParentId); + const nftGrandchildId = await mintChildNft(api, collectionId, nftChildId); + + const baseId = await createTestBase(api); + + await addTestComposable(api, collectionId, nftParentId, baseId); + const resourceId = await addTestSlot(api, collectionId, nftGrandchildId, baseId, slotId); + + const equipperNFT: NftIdTuple = [collectionId, nftParentId]; + const itemNFT: NftIdTuple = [collectionId, nftGrandchildId]; + + const tx = equipNft(api, alice, itemNFT, equipperNFT, resourceId, baseId, slotId); + await expectTxFailure(/rmrkEquip\.MustBeDirectParent/, tx); + }); + + it('[negative] unable to equip NFT onto parent NFT with another base', async () => { + const collectionId = await createTestCollection(api); + const nftParentId = await mintTestNft(api, collectionId); + const nftChildId = await mintChildNft(api, collectionId, nftParentId); + + const baseId = await createTestBase(api); + + await addTestComposable(api, collectionId, nftParentId, baseId); + const resourceId = await addTestSlot(api, collectionId, nftChildId, baseId, slotId); + + const equipperNFT: NftIdTuple = [collectionId, nftParentId]; + const itemNFT: NftIdTuple = [collectionId, nftChildId]; + + const invalidBaseId = 99999; + + const tx = equipNft(api, alice, itemNFT, equipperNFT, resourceId, invalidBaseId, slotId); + await expectTxFailure(/rmrkEquip\.NoResourceForThisBaseFoundOnNft/, tx); + }); + + it('[negative] unable to equip NFT into slot with another id', async () => { + const collectionId = await createTestCollection(api); + const nftParentId = await mintTestNft(api, collectionId); + const nftChildId = await mintChildNft(api, collectionId, nftParentId); + + const baseId = await createTestBase(api); + + await addTestComposable(api, collectionId, nftParentId, baseId); + const resourceId = await addTestSlot(api, collectionId, nftChildId, baseId, slotId); + + const equipperNFT: NftIdTuple = [collectionId, nftParentId]; + const itemNFT: NftIdTuple = [collectionId, nftChildId]; + + const incorrectSlotId = slotId + 1; + const tx = equipNft(api, alice, itemNFT, equipperNFT, resourceId, baseId, incorrectSlotId); + await expectTxFailure(/rmrkEquip\.ItemHasNoResourceToEquipThere/, tx); + }); + + it('[negative] unable to equip NFT with incorrect slot (fixed part)', async () => { + const collectionId = await createTestCollection(api); + const nftParentId = await mintTestNft(api, collectionId); + const nftChildId = await mintChildNft(api, collectionId, nftParentId); + + const baseId = await createBase(api, alice, 'test-base', 'DTBase', [ + { + FixedPart: { + id: slotId, + equippable: 'All', + z: 1, + src: slotSrc, + }, + }, + ]); + + await addTestComposable(api, collectionId, nftParentId, baseId); + const resourceId = await addTestSlot(api, collectionId, nftChildId, baseId, slotId); + + const equipperNFT: NftIdTuple = [collectionId, nftParentId]; + const itemNFT: NftIdTuple = [collectionId, nftChildId]; + + const tx = equipNft(api, alice, itemNFT, equipperNFT, resourceId, baseId, slotId); + await expectTxFailure(/rmrkEquip\.CantEquipFixedPart/, tx); + }); + + it('[negative] unable to equip NFT from a collection that is not allowed by the slot', async () => { + const collectionId = await createTestCollection(api); + const nftParentId = await mintTestNft(api, collectionId); + const nftChildId = await mintChildNft(api, collectionId, nftParentId); + + const baseId = await createBase(api, alice, 'test-base', 'DTBase', [ + { + SlotPart: { + id: 1, + z: 1, + equippable: 'Empty', + src: slotSrc, + }, + }, + ]); + + await addTestComposable(api, collectionId, nftParentId, baseId); + const resourceId = await addTestSlot(api, collectionId, nftChildId, baseId, slotId); + + const equipperNFT: NftIdTuple = [collectionId, nftParentId]; + const itemNFT: NftIdTuple = [collectionId, nftChildId]; + + const tx = equipNft(api, alice, itemNFT, equipperNFT, resourceId, baseId, slotId); + await expectTxFailure(/rmrkEquip\.CollectionNotEquippable/, tx); + }); + + after(async() => { await api.disconnect(); }); +}); --- a/tests/src/rmrk/equipNft.test.ts +++ /dev/null @@ -1,340 +0,0 @@ -import {ApiPromise} from '@polkadot/api'; -import {expect} from 'chai'; -import {getApiConnection} from '../substrate/substrate-api'; -import {getNft, getParts, NftIdTuple} from './util/fetch'; -import {expectTxFailure, requirePallets, Pallets} from './util/helpers'; -import { - addNftComposableResource, - addNftSlotResource, - createBase, - createCollection, - equipNft, - mintNft, - sendNft, - unequipNft, -} from './util/tx'; - -const Alice = '//Alice'; -const Bob = '//Bob'; - -const composableParts: number[] = [5, 2, 7]; -const composableSrc = 'test-cmp-src'; -const composableMetadata = 'test-cmp-metadata'; -const composableLicense = 'test-comp-license'; -const composableThumb = 'test-comp-thumb'; - -const slotSrc = 'test-slot-src'; -const slotLicense = 'test-slot-license'; -const slotMetadata = 'test-slot-metadata'; -const slotThumb = 'test-slot-thumb'; - -const slotId = 1; - -async function createTestCollection(api: ApiPromise): Promise { - return createCollection( - api, - Alice, - 'test-metadata', - null, - 'test-symbol', - ); -} - -async function mintTestNft(api: ApiPromise, collectionId: number): Promise { - return await mintNft( - api, - Alice, - Alice, - collectionId, - 'nft-metadata', - ); -} - -async function mintChildNft(api: ApiPromise, collectionId: number, parentNftId: number): Promise { - const nftChildId = await mintTestNft(api, collectionId); - - const parentNFT: NftIdTuple = [collectionId, parentNftId]; - - await sendNft(api, 'sent', Alice, collectionId, nftChildId, parentNFT); - - return nftChildId; -} - -async function createTestBase(api: ApiPromise): Promise { - return createBase(api, Alice, 'test-base', 'DTBase', [ - { - SlotPart: { - id: slotId, - equippable: 'All', - z: 1, - src: slotSrc, - }, - }, - ]); -} - -async function addTestComposable(api: ApiPromise, collectionId: number, nftId: number, baseId: number) { - await addNftComposableResource( - api, - Alice, - 'added', - collectionId, - nftId, - composableParts, - baseId, - composableSrc, - composableMetadata, - composableLicense, - composableThumb, - ); -} - -async function addTestSlot(api: ApiPromise, collectionId: number, nftId: number, baseId: number, slotId: number): Promise { - return await addNftSlotResource( - api, - Alice, - 'added', - collectionId, - nftId, - baseId, - slotId, - slotSrc, - slotMetadata, - slotLicense, - slotThumb, - ); -} - -async function checkEquipStatus( - api: ApiPromise, - expectedStatus: 'equipped' | 'unequipped', - collectionId: number, - nftId: number, -) { - const itemNftDataOpt = await getNft(api, collectionId, nftId); - expect(itemNftDataOpt.isSome, 'Error: unable to fetch item NFT data'); - - const itemNftData = itemNftDataOpt.unwrap(); - expect(itemNftData.equipped.isTrue, `Error: item NFT should be ${expectedStatus}`) - .to.be.equal(expectedStatus === 'equipped'); -} - -describe.skip('integration test: Equip NFT', () => { - - let api: any; - - before(async function () { - api = await getApiConnection(); - await requirePallets(this, [Pallets.RmrkCore, Pallets.RmrkEquip]); - }); - - it('equip nft', async () => { - const collectionId = await createTestCollection(api); - const nftParentId = await mintTestNft(api, collectionId); - const nftChildId = await mintChildNft(api, collectionId, nftParentId); - - const baseId = await createTestBase(api); - - await addTestComposable(api, collectionId, nftParentId, baseId); - const resourceId = await addTestSlot(api, collectionId, nftChildId, baseId, slotId); - - const equipperNFT: NftIdTuple = [collectionId, nftParentId]; - const itemNFT: NftIdTuple = [collectionId, nftChildId]; - - await equipNft(api, Alice, itemNFT, equipperNFT, resourceId, baseId, slotId); - - await checkEquipStatus(api, 'equipped', collectionId, nftChildId); - }); - - it('unequip nft', async () => { - const collectionId = await createTestCollection(api); - const nftParentId = await mintTestNft(api, collectionId); - const nftChildId = await mintChildNft(api, collectionId, nftParentId); - - const baseId = await createTestBase(api); - - await addTestComposable(api, collectionId, nftParentId, baseId); - const resourceId = await addTestSlot(api, collectionId, nftChildId, baseId, slotId); - - const equipperNFT: NftIdTuple = [collectionId, nftParentId]; - const itemNFT: NftIdTuple = [collectionId, nftChildId]; - - await equipNft(api, Alice, itemNFT, equipperNFT, resourceId, baseId, slotId); - - await checkEquipStatus(api, 'equipped', collectionId, nftChildId); - - await unequipNft(api, Alice, itemNFT, equipperNFT, resourceId, baseId, slotId); - await checkEquipStatus(api, 'unequipped', collectionId, nftChildId); - }); - - it('[negative] equip NFT onto non-existing NFT', async () => { - const collectionId = await createTestCollection(api); - - const nftChildId = await mintNft( - api, - Alice, - Alice, - collectionId, - 'nft-metadata', - ); - - const itemNFT: NftIdTuple = [collectionId, nftChildId]; - const invalidEquipperNFT: NftIdTuple = [collectionId, 9999999]; - - const baseId = 0; - const resourceId = 0; - - const tx = equipNft(api, Alice, itemNFT, invalidEquipperNFT, resourceId, baseId, slotId); - await expectTxFailure(/rmrkCore\.NoAvailableNftId/, tx); - }); - - it('[negative] equip non-existing NFT', async () => { - const collectionId = await createTestCollection(api); - const nftParentId = await mintNft( - api, - Alice, - Alice, - collectionId, - 'nft-metadata', - ); - - const baseId = await createTestBase(api); - - await addTestComposable(api, collectionId, nftParentId, baseId); - - const equipperNFT: NftIdTuple = [collectionId, nftParentId]; - const invalidItemNFT: NftIdTuple = [collectionId, 99999999]; - - const resourceId = 0; - - const tx = equipNft(api, Alice, invalidItemNFT, equipperNFT, resourceId, baseId, slotId); - await expectTxFailure(/rmrkCore\.NoAvailableNftId/, tx); - }); - - it('[negative] equip NFT by a not-an-owner user', async () => { - const collectionId = await createTestCollection(api); - const nftParentId = await mintTestNft(api, collectionId); - const nftChildId = await mintChildNft(api, collectionId, nftParentId); - - const baseId = await createTestBase(api); - - await addTestComposable(api, collectionId, nftParentId, baseId); - - const equipperNFT: NftIdTuple = [collectionId, nftParentId]; - const itemNFT: NftIdTuple = [collectionId, nftChildId]; - - const resourceId = await addTestSlot(api, collectionId, nftChildId, baseId, slotId); - - const tx = equipNft(api, Bob, itemNFT, equipperNFT, resourceId, baseId, slotId); - await expectTxFailure(/rmrkEquip\.PermissionError/, tx); - }); - - it('[negative] unable to equip NFT onto indirect parent NFT', async () => { - const collectionId = await createTestCollection(api); - const nftParentId = await mintTestNft(api, collectionId); - const nftChildId = await mintChildNft(api, collectionId, nftParentId); - const nftGrandchildId = await mintChildNft(api, collectionId, nftChildId); - - const baseId = await createTestBase(api); - - await addTestComposable(api, collectionId, nftParentId, baseId); - const resourceId = await addTestSlot(api, collectionId, nftGrandchildId, baseId, slotId); - - const equipperNFT: NftIdTuple = [collectionId, nftParentId]; - const itemNFT: NftIdTuple = [collectionId, nftGrandchildId]; - - const tx = equipNft(api, Alice, itemNFT, equipperNFT, resourceId, baseId, slotId); - await expectTxFailure(/rmrkEquip\.MustBeDirectParent/, tx); - }); - - it('[negative] unable to equip NFT onto parent NFT with another base', async () => { - const collectionId = await createTestCollection(api); - const nftParentId = await mintTestNft(api, collectionId); - const nftChildId = await mintChildNft(api, collectionId, nftParentId); - - const baseId = await createTestBase(api); - - await addTestComposable(api, collectionId, nftParentId, baseId); - const resourceId = await addTestSlot(api, collectionId, nftChildId, baseId, slotId); - - const equipperNFT: NftIdTuple = [collectionId, nftParentId]; - const itemNFT: NftIdTuple = [collectionId, nftChildId]; - - const invalidBaseId = 99999; - - const tx = equipNft(api, Alice, itemNFT, equipperNFT, resourceId, invalidBaseId, slotId); - await expectTxFailure(/rmrkEquip\.NoResourceForThisBaseFoundOnNft/, tx); - }); - - it('[negative] unable to equip NFT into slot with another id', async () => { - const collectionId = await createTestCollection(api); - const nftParentId = await mintTestNft(api, collectionId); - const nftChildId = await mintChildNft(api, collectionId, nftParentId); - - const baseId = await createTestBase(api); - - await addTestComposable(api, collectionId, nftParentId, baseId); - const resourceId = await addTestSlot(api, collectionId, nftChildId, baseId, slotId); - - const equipperNFT: NftIdTuple = [collectionId, nftParentId]; - const itemNFT: NftIdTuple = [collectionId, nftChildId]; - - const incorrectSlotId = slotId + 1; - const tx = equipNft(api, Alice, itemNFT, equipperNFT, resourceId, baseId, incorrectSlotId); - await expectTxFailure(/rmrkEquip\.ItemHasNoResourceToEquipThere/, tx); - }); - - it('[negative] unable to equip NFT with incorrect slot (fixed part)', async () => { - const collectionId = await createTestCollection(api); - const nftParentId = await mintTestNft(api, collectionId); - const nftChildId = await mintChildNft(api, collectionId, nftParentId); - - const baseId = await createBase(api, Alice, 'test-base', 'DTBase', [ - { - FixedPart: { - id: slotId, - equippable: 'All', - z: 1, - src: slotSrc, - }, - }, - ]); - - await addTestComposable(api, collectionId, nftParentId, baseId); - const resourceId = await addTestSlot(api, collectionId, nftChildId, baseId, slotId); - - const equipperNFT: NftIdTuple = [collectionId, nftParentId]; - const itemNFT: NftIdTuple = [collectionId, nftChildId]; - - const tx = equipNft(api, Alice, itemNFT, equipperNFT, resourceId, baseId, slotId); - await expectTxFailure(/rmrkEquip\.CantEquipFixedPart/, tx); - }); - - it('[negative] unable to equip NFT from a collection that is not allowed by the slot', async () => { - const collectionId = await createTestCollection(api); - const nftParentId = await mintTestNft(api, collectionId); - const nftChildId = await mintChildNft(api, collectionId, nftParentId); - - const baseId = await createBase(api, Alice, 'test-base', 'DTBase', [ - { - SlotPart: { - id: 1, - z: 1, - equippable: 'Empty', - src: slotSrc, - }, - }, - ]); - - await addTestComposable(api, collectionId, nftParentId, baseId); - const resourceId = await addTestSlot(api, collectionId, nftChildId, baseId, slotId); - - const equipperNFT: NftIdTuple = [collectionId, nftParentId]; - const itemNFT: NftIdTuple = [collectionId, nftChildId]; - - const tx = equipNft(api, Alice, itemNFT, equipperNFT, resourceId, baseId, slotId); - await expectTxFailure(/rmrkEquip\.CollectionNotEquippable/, tx); - }); - - after(async() => { await api.disconnect(); }); -}); --- /dev/null +++ b/tests/src/rmrk/getOwnedNfts.seqtest.ts @@ -0,0 +1,80 @@ +import {expect} from 'chai'; +import {getApiConnection} from '../substrate/substrate-api'; +import {requirePallets, Pallets} from './util/helpers'; +import {getOwnedNfts} from './util/fetch'; +import {mintNft, createCollection} from './util/tx'; + +describe('integration test: get owned NFTs', () => { + let api: any; + + before(async function () { + api = await getApiConnection(); + await requirePallets(this, [Pallets.RmrkCore]); + }); + + + const alice = '//Alice'; + + it('fetch all NFTs owned by a user', async () => { + const owner = alice; + const collectionMetadata = 'aliceCollectionMetadata'; + const collectionMax = null; + const collectionSymbol = 'AliceSym'; + const recipientUri = null; + const royalty = null; + const nftMetadata = 'alice-NFT-metadata'; + + const collectionId = await createCollection( + api, + alice, + collectionMetadata, + collectionMax, + collectionSymbol, + ); + + const nftIds = [ + await mintNft( + api, + alice, + owner, + collectionId, + nftMetadata + '-0', + recipientUri, + royalty, + ), + await mintNft( + api, + alice, + owner, + collectionId, + nftMetadata + '-1', + recipientUri, + royalty, + ), + await mintNft( + api, + alice, + owner, + collectionId, + nftMetadata + '-2', + recipientUri, + royalty, + ), + ]; + + const ownedNfts = await getOwnedNfts(api, alice, collectionId); + + const isFound = (nftId: number) => { + return ownedNfts.find((ownedNftId) => { + return ownedNftId === nftId; + }) !== undefined; + }; + + nftIds.forEach((nftId) => { + expect(isFound(nftId), `NFT ${nftId} should be owned by ${alice}`) + .to.be.true; + }); + }); + + after(async() => { await api.disconnect(); }); +}); --- a/tests/src/rmrk/getOwnedNfts.test.ts +++ /dev/null @@ -1,80 +0,0 @@ -import {expect} from 'chai'; -import {getApiConnection} from '../substrate/substrate-api'; -import {requirePallets, Pallets} from './util/helpers'; -import {getOwnedNfts} from './util/fetch'; -import {mintNft, createCollection} from './util/tx'; - -describe('integration test: get owned NFTs', () => { - let api: any; - - before(async function () { - api = await getApiConnection(); - await requirePallets(this, [Pallets.RmrkCore]); - }); - - - const alice = '//Alice'; - - it('fetch all NFTs owned by a user', async () => { - const owner = alice; - const collectionMetadata = 'aliceCollectionMetadata'; - const collectionMax = null; - const collectionSymbol = 'AliceSym'; - const recipientUri = null; - const royalty = null; - const nftMetadata = 'alice-NFT-metadata'; - - const collectionId = await createCollection( - api, - alice, - collectionMetadata, - collectionMax, - collectionSymbol, - ); - - const nftIds = [ - await mintNft( - api, - alice, - owner, - collectionId, - nftMetadata + '-0', - recipientUri, - royalty, - ), - await mintNft( - api, - alice, - owner, - collectionId, - nftMetadata + '-1', - recipientUri, - royalty, - ), - await mintNft( - api, - alice, - owner, - collectionId, - nftMetadata + '-2', - recipientUri, - royalty, - ), - ]; - - const ownedNfts = await getOwnedNfts(api, alice, collectionId); - - const isFound = (nftId: number) => { - return ownedNfts.find((ownedNftId) => { - return ownedNftId === nftId; - }) !== undefined; - }; - - nftIds.forEach((nftId) => { - expect(isFound(nftId), `NFT ${nftId} should be owned by ${alice}`) - .to.be.true; - }); - }); - - after(async() => { await api.disconnect(); }); -}); --- /dev/null +++ b/tests/src/rmrk/lockCollection.seqtest.ts @@ -0,0 +1,116 @@ +import {getApiConnection} from '../substrate/substrate-api'; +import {expectTxFailure, requirePallets, Pallets} from './util/helpers'; +import {createCollection, lockCollection, mintNft} from './util/tx'; + +describe('integration test: lock collection', () => { + const alice = '//Alice'; + const bob = '//Bob'; + const max = 5; + + let api: any; + before(async function () { + api = await getApiConnection(); + await requirePallets(this, [Pallets.RmrkCore]); + }); + + it('lock collection', async () => { + await createCollection( + api, + alice, + 'test-metadata', + null, + 'test-symbol', + ).then(async (collectionId) => { + await lockCollection(api, alice, collectionId); + }); + }); + + it('[negative] lock non-existing NFT collection', async () => { + const tx = lockCollection(api, alice, 99999); + await expectTxFailure(/rmrkCore\.CollectionUnknown/, tx); + }); + + it('[negative] lock not an owner NFT collection issuer', async () => { + await createCollection( + api, + alice, + 'test-metadata', + null, + 'test-symbol', + ).then(async (collectionId) => { + const tx = lockCollection(api, bob, collectionId); + await expectTxFailure(/rmrkCore\.NoPermission/, tx); + }); + }); + + it('lock collection with minting', async () => { + await createCollection( + api, + alice, + 'test-metadata', + max, + 'test-symbol', + ).then(async (collectionId) => { + for (let i = 0; i < 5; i++) { + await mintNft( + api, + alice, + alice, + collectionId, + 'test-metadata', + null, + null, + ); + } + await lockCollection(api, alice, collectionId, max); + }); + }); + + it('[negative] unable to mint NFT inside a locked collection', async () => { + await createCollection( + api, + alice, + 'test-metadata', + max, + 'test-symbol', + ).then(async (collectionId) => { + await lockCollection(api, alice, collectionId); + const tx = mintNft( + api, + alice, + alice, + collectionId, + 'test-metadata', + null, + null, + ); + await expectTxFailure(/rmrkCore\.CollectionFullOrLocked/, tx); + }); + }); + + it('[negative] unable to mint NFT inside a full collection', async () => { + await createCollection(api, alice, 'test-metadata', 1, 'test-symbol').then(async (collectionId) => { + await mintNft( + api, + alice, + alice, + collectionId, + 'test-metadata', + null, + null, + ); + const tx = mintNft( + api, + alice, + alice, + collectionId, + 'test-metadata', + null, + null, + ); + await expectTxFailure(/rmrkCore\.CollectionFullOrLocked/, tx); + }); + }); + + after(async() => { await api.disconnect(); }); +}); --- a/tests/src/rmrk/lockCollection.test.ts +++ /dev/null @@ -1,116 +0,0 @@ -import {getApiConnection} from '../substrate/substrate-api'; -import {expectTxFailure, requirePallets, Pallets} from './util/helpers'; -import {createCollection, lockCollection, mintNft} from './util/tx'; - -describe('integration test: lock collection', () => { - const Alice = '//Alice'; - const Bob = '//Bob'; - const Max = 5; - - let api: any; - before(async function () { - api = await getApiConnection(); - await requirePallets(this, [Pallets.RmrkCore]); - }); - - it('lock collection', async () => { - await createCollection( - api, - Alice, - 'test-metadata', - null, - 'test-symbol', - ).then(async (collectionId) => { - await lockCollection(api, Alice, collectionId); - }); - }); - - it('[negative] lock non-existing NFT collection', async () => { - const tx = lockCollection(api, Alice, 99999); - await expectTxFailure(/rmrkCore\.CollectionUnknown/, tx); - }); - - it('[negative] lock not an owner NFT collection issuer', async () => { - await createCollection( - api, - Alice, - 'test-metadata', - null, - 'test-symbol', - ).then(async (collectionId) => { - const tx = lockCollection(api, Bob, collectionId); - await expectTxFailure(/rmrkCore\.NoPermission/, tx); - }); - }); - - it('lock collection with minting', async () => { - await createCollection( - api, - Alice, - 'test-metadata', - Max, - 'test-symbol', - ).then(async (collectionId) => { - for (let i = 0; i < 5; i++) { - await mintNft( - api, - Alice, - Alice, - collectionId, - 'test-metadata', - null, - null, - ); - } - await lockCollection(api, Alice, collectionId, Max); - }); - }); - - it('[negative] unable to mint NFT inside a locked collection', async () => { - await createCollection( - api, - Alice, - 'test-metadata', - Max, - 'test-symbol', - ).then(async (collectionId) => { - await lockCollection(api, Alice, collectionId); - const tx = mintNft( - api, - Alice, - Alice, - collectionId, - 'test-metadata', - null, - null, - ); - await expectTxFailure(/rmrkCore\.CollectionFullOrLocked/, tx); - }); - }); - - it('[negative] unable to mint NFT inside a full collection', async () => { - await createCollection(api, Alice, 'test-metadata', 1, 'test-symbol').then(async (collectionId) => { - await mintNft( - api, - Alice, - Alice, - collectionId, - 'test-metadata', - null, - null, - ); - const tx = mintNft( - api, - Alice, - Alice, - collectionId, - 'test-metadata', - null, - null, - ); - await expectTxFailure(/rmrkCore\.CollectionFullOrLocked/, tx); - }); - }); - - after(async() => { await api.disconnect(); }); -}); --- /dev/null +++ b/tests/src/rmrk/mintNft.seqtest.ts @@ -0,0 +1,211 @@ +import {expect} from 'chai'; +import {getApiConnection} from '../substrate/substrate-api'; +import {getNft} from './util/fetch'; +import {expectTxFailure, requirePallets, Pallets} from './util/helpers'; +import {createCollection, mintNft} from './util/tx'; + +describe('integration test: mint new NFT', () => { + let api: any; + + before(async function () { + api = await getApiConnection(); + await requirePallets(this, [Pallets.RmrkCore]); + }); + + + const alice = '//Alice'; + const bob = '//Bob'; + const maxCollectionId = 0xFFFFFFFF; + const maxNftId = 0xFFFFFFFF; + + it('mint NFT', async () => { + const owner = null; + const collectionMetadata = 'mintingCollectionMetadata'; + const collectionMax = null; + const collectionSymbol = 'MCS'; + const recipientUri = null; + const royalty = null; + const nftMetadata = 'NFT-test-metadata'; + + const collectionId = await createCollection( + api, + alice, + collectionMetadata, + collectionMax, + collectionSymbol, + ); + + await mintNft( + api, + alice, + owner, + collectionId, + nftMetadata, + recipientUri, + royalty, + ); + }); + + it('mint NFT and set another owner', async () => { + const owner = bob; + const collectionMetadata = 'setOwnerCollectionMetadata'; + const collectionMax = null; + const collectionSymbol = 'SOCS'; + const recipientUri = null; + const royalty = null; + const nftMetadata = 'setOwner-NFT-metadata'; + + const collectionId = await createCollection( + api, + alice, + collectionMetadata, + collectionMax, + collectionSymbol, + ); + + await mintNft( + api, + alice, + owner, + collectionId, + nftMetadata, + recipientUri, + royalty, + ); + }); + + it('mint NFT with recipient and roalty', async () => { + const owner = alice; + const collectionMetadata = 'mintingCollectionMetadata'; + const collectionMax = null; + const collectionSymbol = 'MCS'; + const recipientUri = bob; + const royalty = 70000; + const nftMetadata = 'recipient-royalty-NFT-test-metadata'; + + const collectionId = await createCollection( + api, + alice, + collectionMetadata, + collectionMax, + collectionSymbol, + ); + + await mintNft( + api, + alice, + owner, + collectionId, + nftMetadata, + recipientUri, + royalty, + ); + }); + + it('mint NFT with resources', async () => { + const owner = alice; + const collectionMetadata = 'mintingCollectionMetadata'; + const collectionMax = null; + const collectionSymbol = 'MCS'; + const nftMetadata = 'NFT-with-resources-test-metadata'; + const resources = [ + { + basic: { + metadata: 'basic-resource-nft-minting', + }, + }, { + slot: { + metadata: 'slot-resource-nft-minting', + slot: 9, + }, + }, { + composable: { + metadata: 'composable-resource-nft-minting', + parts: [0, 5, 2], + }, + }, { + slot: { + metadata: 'slot-resource-nft-minting-2', + thumb: 'srnm2', + base: 5, + }, + }, + ]; + + const collectionId = await createCollection( + api, + alice, + collectionMetadata, + collectionMax, + collectionSymbol, + ); + + await mintNft( + api, + alice, + owner, + collectionId, + nftMetadata, + null, + null, + true, + resources, + ); + }); + + it('[negative] unable to mint NFT within non-existing collection', async () => { + const owner = alice; + const recipientUri = null; + const royalty = null; + const nftMetadata = 'NFT-test-metadata'; + + const tx = mintNft( + api, + alice, + owner, + maxCollectionId, + nftMetadata, + recipientUri, + royalty, + ); + + await expectTxFailure(/rmrkCore\.CollectionUnknown/, tx); + }); + + it("[negative] unable to mint NFT by a user that isn't the owner of the collection", async () => { + const owner = alice; + const collectionMetadata = 'mintingCollectionMetadata'; + const collectionMax = null; + const collectionSymbol = 'MCS'; + const recipientUri = null; + const royalty = null; + const nftMetadata = 'NFT-test-metadata'; + + const collectionId = await createCollection( + api, + alice, + collectionMetadata, + collectionMax, + collectionSymbol, + ); + + const tx = mintNft( + api, + bob, + owner, + collectionId, + nftMetadata, + recipientUri, + royalty, + ); + + await expectTxFailure(/rmrkCore\.NoPermission/, tx); + }); + + it('[negative] unable to fetch non-existing NFT', async () => { + const nft = await getNft(api, maxCollectionId, maxNftId); + expect(nft.isSome).to.be.false; + }); + + after(async() => { await api.disconnect(); }); +}); --- a/tests/src/rmrk/mintNft.test.ts +++ /dev/null @@ -1,211 +0,0 @@ -import {expect} from 'chai'; -import {getApiConnection} from '../substrate/substrate-api'; -import {getNft} from './util/fetch'; -import {expectTxFailure, requirePallets, Pallets} from './util/helpers'; -import {createCollection, mintNft} from './util/tx'; - -describe('integration test: mint new NFT', () => { - let api: any; - - before(async function () { - api = await getApiConnection(); - await requirePallets(this, [Pallets.RmrkCore]); - }); - - - const alice = '//Alice'; - const bob = '//Bob'; - const maxCollectionId = 0xFFFFFFFF; - const maxNftId = 0xFFFFFFFF; - - it('mint NFT', async () => { - const owner = null; - const collectionMetadata = 'mintingCollectionMetadata'; - const collectionMax = null; - const collectionSymbol = 'MCS'; - const recipientUri = null; - const royalty = null; - const nftMetadata = 'NFT-test-metadata'; - - const collectionId = await createCollection( - api, - alice, - collectionMetadata, - collectionMax, - collectionSymbol, - ); - - await mintNft( - api, - alice, - owner, - collectionId, - nftMetadata, - recipientUri, - royalty, - ); - }); - - it('mint NFT and set another owner', async () => { - const owner = bob; - const collectionMetadata = 'setOwnerCollectionMetadata'; - const collectionMax = null; - const collectionSymbol = 'SOCS'; - const recipientUri = null; - const royalty = null; - const nftMetadata = 'setOwner-NFT-metadata'; - - const collectionId = await createCollection( - api, - alice, - collectionMetadata, - collectionMax, - collectionSymbol, - ); - - await mintNft( - api, - alice, - owner, - collectionId, - nftMetadata, - recipientUri, - royalty, - ); - }); - - it('mint NFT with recipient and roalty', async () => { - const owner = alice; - const collectionMetadata = 'mintingCollectionMetadata'; - const collectionMax = null; - const collectionSymbol = 'MCS'; - const recipientUri = bob; - const royalty = 70000; - const nftMetadata = 'recipient-royalty-NFT-test-metadata'; - - const collectionId = await createCollection( - api, - alice, - collectionMetadata, - collectionMax, - collectionSymbol, - ); - - await mintNft( - api, - alice, - owner, - collectionId, - nftMetadata, - recipientUri, - royalty, - ); - }); - - it('mint NFT with resources', async () => { - const owner = alice; - const collectionMetadata = 'mintingCollectionMetadata'; - const collectionMax = null; - const collectionSymbol = 'MCS'; - const nftMetadata = 'NFT-with-resources-test-metadata'; - const resources = [ - { - basic: { - metadata: 'basic-resource-nft-minting', - }, - }, { - slot: { - metadata: 'slot-resource-nft-minting', - slot: 9, - }, - }, { - composable: { - metadata: 'composable-resource-nft-minting', - parts: [0, 5, 2], - }, - }, { - slot: { - metadata: 'slot-resource-nft-minting-2', - thumb: 'srnm2', - base: 5, - }, - }, - ]; - - const collectionId = await createCollection( - api, - alice, - collectionMetadata, - collectionMax, - collectionSymbol, - ); - - await mintNft( - api, - alice, - owner, - collectionId, - nftMetadata, - null, - null, - true, - resources, - ); - }); - - it('[negative] unable to mint NFT within non-existing collection', async () => { - const owner = alice; - const recipientUri = null; - const royalty = null; - const nftMetadata = 'NFT-test-metadata'; - - const tx = mintNft( - api, - alice, - owner, - maxCollectionId, - nftMetadata, - recipientUri, - royalty, - ); - - await expectTxFailure(/rmrkCore\.CollectionUnknown/, tx); - }); - - it("[negative] unable to mint NFT by a user that isn't the owner of the collection", async () => { - const owner = alice; - const collectionMetadata = 'mintingCollectionMetadata'; - const collectionMax = null; - const collectionSymbol = 'MCS'; - const recipientUri = null; - const royalty = null; - const nftMetadata = 'NFT-test-metadata'; - - const collectionId = await createCollection( - api, - alice, - collectionMetadata, - collectionMax, - collectionSymbol, - ); - - const tx = mintNft( - api, - bob, - owner, - collectionId, - nftMetadata, - recipientUri, - royalty, - ); - - await expectTxFailure(/rmrkCore\.NoPermission/, tx); - }); - - it('[negative] unable to fetch non-existing NFT', async () => { - const nft = await getNft(api, maxCollectionId, maxNftId); - expect(nft.isSome).to.be.false; - }); - - after(async() => { await api.disconnect(); }); -}); --- /dev/null +++ b/tests/src/rmrk/rejectNft.seqtest.ts @@ -0,0 +1,94 @@ +import {expect} from 'chai'; +import {getApiConnection} from '../substrate/substrate-api'; +import { + createCollection, + mintNft, + sendNft, + rejectNft, +} from './util/tx'; +import {NftIdTuple} from './util/fetch'; +import {isNftChildOfAnother, expectTxFailure, requirePallets, Pallets} from './util/helpers'; + +describe('integration test: reject NFT', () => { + let api: any; + before(async function () { + api = await getApiConnection(); + await requirePallets(this, [Pallets.RmrkCore]); + }); + + + + const alice = '//Alice'; + const bob = '//Bob'; + + const createTestCollection = async (issuerUri: string) => { + return await createCollection( + api, + issuerUri, + 'reject-metadata', + null, + 'rjct', + ); + }; + + it('reject NFT', async () => { + const ownerAlice = alice; + const ownerBob = bob; + + const aliceCollectionId = await createTestCollection(alice); + const bobCollectionId = await createTestCollection(bob); + + const parentNftId = await mintNft(api, alice, ownerAlice, aliceCollectionId, 'parent-nft-metadata'); + const childNftId = await mintNft(api, bob, ownerBob, bobCollectionId, 'child-nft-metadata'); + + const newOwnerNFT: NftIdTuple = [aliceCollectionId, parentNftId]; + + await sendNft(api, 'pending', ownerBob, bobCollectionId, childNftId, newOwnerNFT); + await rejectNft(api, alice, bobCollectionId, childNftId); + + const isChild = await isNftChildOfAnother(api, bobCollectionId, childNftId, newOwnerNFT); + expect(isChild, 'Error: rejected NFT is still a child of the target NFT').to.be.false; + }); + + it('[negative] unable to reject NFT by a not-an-owner', async () => { + const ownerAlice = alice; + const ownerBob = bob; + + const aliceCollectionId = await createTestCollection(alice); + const bobCollectionId = await createTestCollection(bob); + + const parentNftId = await mintNft(api, alice, ownerAlice, aliceCollectionId, 'parent-nft-metadata'); + const childNftId = await mintNft(api, bob, ownerBob, bobCollectionId, 'child-nft-metadata'); + + const newOwnerNFT: NftIdTuple = [aliceCollectionId, parentNftId]; + + await sendNft(api, 'pending', ownerBob, bobCollectionId, childNftId, newOwnerNFT); + const tx = rejectNft(api, bob, bobCollectionId, childNftId); + + await expectTxFailure(/rmrkCore\.CannotRejectNonOwnedNft/, tx); + }); + + it('[negative] unable to reject non-existing NFT', async () => { + const maxNftId = 0xFFFFFFFF; + + const collectionId = await createTestCollection(alice); + + const tx = rejectNft(api, alice, collectionId, maxNftId); + + await expectTxFailure(/rmrkCore\.NoAvailableNftId/, tx); + }); + + it('[negative] unable to reject NFT which is not sent', async () => { + const ownerAlice = alice; + + const collectionId = await createTestCollection(alice); + + const nftId = await mintNft(api, alice, ownerAlice, collectionId, 'parent-nft-metadata'); + + const tx = rejectNft(api, alice, collectionId, nftId); + + await expectTxFailure(/rmrkCore\.CannotRejectNonPendingNft/, tx); + }); + + after(async() => { await api.disconnect(); }); +}); --- a/tests/src/rmrk/rejectNft.test.ts +++ /dev/null @@ -1,94 +0,0 @@ -import {expect} from 'chai'; -import {getApiConnection} from '../substrate/substrate-api'; -import { - createCollection, - mintNft, - sendNft, - rejectNft, -} from './util/tx'; -import {getChildren, NftIdTuple} from './util/fetch'; -import {isNftChildOfAnother, expectTxFailure, requirePallets, Pallets} from './util/helpers'; - -describe('integration test: reject NFT', () => { - let api: any; - before(async function () { - api = await getApiConnection(); - await requirePallets(this, [Pallets.RmrkCore]); - }); - - - - const alice = '//Alice'; - const bob = '//Bob'; - - const createTestCollection = async (issuerUri: string) => { - return await createCollection( - api, - issuerUri, - 'reject-metadata', - null, - 'rjct', - ); - }; - - it('reject NFT', async () => { - const ownerAlice = alice; - const ownerBob = bob; - - const aliceCollectionId = await createTestCollection(alice); - const bobCollectionId = await createTestCollection(bob); - - const parentNftId = await mintNft(api, alice, ownerAlice, aliceCollectionId, 'parent-nft-metadata'); - const childNftId = await mintNft(api, bob, ownerBob, bobCollectionId, 'child-nft-metadata'); - - const newOwnerNFT: NftIdTuple = [aliceCollectionId, parentNftId]; - - await sendNft(api, 'pending', ownerBob, bobCollectionId, childNftId, newOwnerNFT); - await rejectNft(api, alice, bobCollectionId, childNftId); - - const isChild = await isNftChildOfAnother(api, bobCollectionId, childNftId, newOwnerNFT); - expect(isChild, 'Error: rejected NFT is still a child of the target NFT').to.be.false; - }); - - it('[negative] unable to reject NFT by a not-an-owner', async () => { - const ownerAlice = alice; - const ownerBob = bob; - - const aliceCollectionId = await createTestCollection(alice); - const bobCollectionId = await createTestCollection(bob); - - const parentNftId = await mintNft(api, alice, ownerAlice, aliceCollectionId, 'parent-nft-metadata'); - const childNftId = await mintNft(api, bob, ownerBob, bobCollectionId, 'child-nft-metadata'); - - const newOwnerNFT: NftIdTuple = [aliceCollectionId, parentNftId]; - - await sendNft(api, 'pending', ownerBob, bobCollectionId, childNftId, newOwnerNFT); - const tx = rejectNft(api, bob, bobCollectionId, childNftId); - - await expectTxFailure(/rmrkCore\.CannotRejectNonOwnedNft/, tx); - }); - - it('[negative] unable to reject non-existing NFT', async () => { - const maxNftId = 0xFFFFFFFF; - - const collectionId = await createTestCollection(alice); - - const tx = rejectNft(api, alice, collectionId, maxNftId); - - await expectTxFailure(/rmrkCore\.NoAvailableNftId/, tx); - }); - - it('[negative] unable to reject NFT which is not sent', async () => { - const ownerAlice = alice; - - const collectionId = await createTestCollection(alice); - - const nftId = await mintNft(api, alice, ownerAlice, collectionId, 'parent-nft-metadata'); - - const tx = rejectNft(api, alice, collectionId, nftId); - - await expectTxFailure(/rmrkCore\.CannotRejectNonPendingNft/, tx); - }); - - after(async() => { await api.disconnect(); }); -}); --- /dev/null +++ b/tests/src/rmrk/removeResource.seqtest.ts @@ -0,0 +1,340 @@ +import {getApiConnection} from '../substrate/substrate-api'; +import {NftIdTuple} from './util/fetch'; +import {expectTxFailure, requirePallets, Pallets} from './util/helpers'; +import { + acceptResourceRemoval, addNftBasicResource, createCollection, mintNft, removeNftResource, sendNft, +} from './util/tx'; + + + + +describe('Integration test: remove nft resource', () => { + let api: any; + before(async function() { + api = await getApiConnection(); + await requirePallets(this, [Pallets.RmrkCore]); + }); + + const alice = '//Alice'; + const bob = '//Bob'; + const src = 'test-basic-src'; + const metadata = 'test-basic-metadata'; + const license = 'test-basic-license'; + const thumb = 'test-basic-thumb'; + + it('deleting a resource directly by the NFT owner', async () => { + const collectionIdAlice = await createCollection( + api, + alice, + 'test-metadata', + null, + 'test-symbol', + ); + + const nftAlice = await mintNft( + api, + alice, + alice, + collectionIdAlice, + 'nft-metadata', + ); + + const resourceId = await addNftBasicResource( + api, + alice, + 'added', + collectionIdAlice, + nftAlice, + src, + metadata, + license, + thumb, + ); + + await removeNftResource(api, 'removed', alice, collectionIdAlice, nftAlice, resourceId); + }); + + it('deleting resources indirectly by the NFT owner', async () => { + const collectionIdAlice = await createCollection( + api, + alice, + 'test-metadata', + null, + 'test-symbol', + ); + + const parentNftId = await mintNft(api, alice, alice, collectionIdAlice, 'parent-nft-metadata'); + const childNftId = await mintNft(api, alice, alice, collectionIdAlice, 'child-nft-metadata'); + + const resourceId = await addNftBasicResource( + api, + alice, + 'added', + collectionIdAlice, + childNftId, + src, + metadata, + license, + thumb, + ); + + const newOwnerNFT: NftIdTuple = [collectionIdAlice, parentNftId]; + + await sendNft(api, 'sent', alice, collectionIdAlice, childNftId, newOwnerNFT); + + await removeNftResource(api, 'removed', alice, collectionIdAlice, childNftId, resourceId); + }); + + it('deleting a resource by the collection owner', async () => { + const collectionIdAlice = await createCollection( + api, + alice, + 'test-metadata', + null, + 'test-symbol', + ); + + const nftBob = await mintNft( + api, + alice, + bob, + collectionIdAlice, + 'nft-metadata', + ); + + const resourceId = await addNftBasicResource( + api, + alice, + 'pending', + collectionIdAlice, + nftBob, + src, + metadata, + license, + thumb, + ); + + await removeNftResource(api, 'pending', alice, collectionIdAlice, nftBob, resourceId); + await acceptResourceRemoval(api, bob, collectionIdAlice, nftBob, resourceId); + }); + + it('deleting a resource in a nested NFT by the collection owner', async () => { + const collectionIdAlice = await createCollection( + api, + alice, + 'test-metadata', + null, + 'test-symbol', + ); + + const parentNftId = await mintNft( + api, + alice, + bob, + collectionIdAlice, + 'parent-nft-metadata', + ); + const childNftId = await mintNft( + api, + alice, + bob, + collectionIdAlice, + 'child-nft-metadata', + ); + + const resourceId = await addNftBasicResource( + api, + alice, + 'pending', + collectionIdAlice, + childNftId, + src, + metadata, + license, + thumb, + ); + + const newOwnerNFT: NftIdTuple = [collectionIdAlice, parentNftId]; + + await sendNft(api, 'sent', bob, collectionIdAlice, childNftId, newOwnerNFT); + + await removeNftResource(api, 'pending', alice, collectionIdAlice, childNftId, resourceId); + await acceptResourceRemoval(api, bob, collectionIdAlice, childNftId, resourceId); + }); + + it('[negative]: can\'t delete a resource in a non-existing collection', async () => { + const collectionIdAlice = await createCollection( + api, + alice, + 'test-metadata', + null, + 'test-symbol', + ); + + const nftAlice = await mintNft( + api, + alice, + alice, + collectionIdAlice, + 'nft-metadata', + ); + + const resourceId = await addNftBasicResource( + api, + alice, + 'added', + collectionIdAlice, + nftAlice, + src, + metadata, + license, + thumb, + ); + + const tx = removeNftResource(api, 'removed', alice, 0xFFFFFFFF, nftAlice, resourceId); + await expectTxFailure(/rmrkCore\.CollectionUnknown/, tx); // FIXME: inappropriate error message (NoAvailableNftId) + }); + + it('[negative]: only collection owner can delete a resource', async () => { + const collectionIdAlice = await createCollection( + api, + alice, + 'test-metadata', + null, + 'test-symbol', + ); + + const nftAlice = await mintNft( + api, + alice, + alice, + collectionIdAlice, + 'nft-metadata', + ); + + const resourceId = await addNftBasicResource( + api, + alice, + 'added', + collectionIdAlice, + nftAlice, + src, + metadata, + license, + thumb, + ); + + const tx = removeNftResource(api, 'removed', bob, collectionIdAlice, nftAlice, resourceId); + await expectTxFailure(/rmrkCore\.NoPermission/, tx); + }); + + it('[negative]: cannot delete a resource that does not exist', async () => { + const collectionIdAlice = await createCollection( + api, + alice, + 'test-metadata', + null, + 'test-symbol', + ); + + const nftAlice = await mintNft( + api, + alice, + alice, + collectionIdAlice, + 'nft-metadata', + ); + + const tx = removeNftResource(api, 'removed', alice, collectionIdAlice, nftAlice, 127); + await expectTxFailure(/rmrkCore\.ResourceDoesntExist/, tx); + }); + + it('[negative]: Cannot accept deleting resource without owner attempt do delete it', async () => { + const collectionIdAlice = await createCollection( + api, + alice, + 'test-metadata', + null, + 'test-symbol', + ); + + const nftBob = await mintNft( + api, + alice, + bob, + collectionIdAlice, + 'nft-metadata', + ); + + const resourceId = await addNftBasicResource( + api, + alice, + 'pending', + collectionIdAlice, + nftBob, + src, + metadata, + license, + thumb, + ); + + const tx = acceptResourceRemoval(api, bob, collectionIdAlice, nftBob, resourceId); + await expectTxFailure(/rmrkCore\.ResourceNotPending/, tx); + }); + + it('[negative]: cannot confirm the deletion of a non-existing resource', async () => { + const collectionIdAlice = await createCollection( + api, + alice, + 'test-metadata', + null, + 'test-symbol', + ); + + const nftBob = await mintNft( + api, + alice, + bob, + collectionIdAlice, + 'nft-metadata', + ); + + const tx = acceptResourceRemoval(api, bob, collectionIdAlice, nftBob, 127); + await expectTxFailure(/rmrkCore\.ResourceDoesntExist/, tx); + }); + + it('[negative]: Non-owner user cannot confirm the deletion of resource', async () => { + const collectionIdAlice = await createCollection( + api, + alice, + 'test-metadata', + null, + 'test-symbol', + ); + + const nftAlice = await mintNft( + api, + alice, + alice, + collectionIdAlice, + 'nft-metadata', + ); + + const resourceId = await addNftBasicResource( + api, + alice, + 'added', + collectionIdAlice, + nftAlice, + src, + metadata, + license, + thumb, + ); + + const tx = acceptResourceRemoval(api, bob, collectionIdAlice, nftAlice, resourceId); + await expectTxFailure(/rmrkCore\.NoPermission/, tx); + }); + + after(async() => { await api.disconnect(); }); +}); --- a/tests/src/rmrk/removeResource.test.ts +++ /dev/null @@ -1,347 +0,0 @@ -import {expect} from 'chai'; -import privateKey from '../substrate/privateKey'; -import {executeTransaction, getApiConnection} from '../substrate/substrate-api'; -import {getNft, NftIdTuple} from './util/fetch'; -import {expectTxFailure, requirePallets, Pallets} from './util/helpers'; -import { - acceptNft, acceptResourceRemoval, addNftBasicResource, - createBase, - createCollection, - mintNft, removeNftResource, sendNft, -} from './util/tx'; - - - - -describe('Integration test: remove nft resource', () => { - let api: any; - let ss58Format: string; - before(async function() { - api = await getApiConnection(); - ss58Format = api.registry.getChainProperties()!.toJSON().ss58Format; - await requirePallets(this, [Pallets.RmrkCore]); - }); - - const Alice = '//Alice'; - const Bob = '//Bob'; - const src = 'test-basic-src'; - const metadata = 'test-basic-metadata'; - const license = 'test-basic-license'; - const thumb = 'test-basic-thumb'; - - it('deleting a resource directly by the NFT owner', async () => { - const collectionIdAlice = await createCollection( - api, - Alice, - 'test-metadata', - null, - 'test-symbol', - ); - - const nftAlice = await mintNft( - api, - Alice, - Alice, - collectionIdAlice, - 'nft-metadata', - ); - - const resourceId = await addNftBasicResource( - api, - Alice, - 'added', - collectionIdAlice, - nftAlice, - src, - metadata, - license, - thumb, - ); - - await removeNftResource(api, 'removed', Alice, collectionIdAlice, nftAlice, resourceId); - }); - - it('deleting resources indirectly by the NFT owner', async () => { - const collectionIdAlice = await createCollection( - api, - Alice, - 'test-metadata', - null, - 'test-symbol', - ); - - const parentNftId = await mintNft(api, Alice, Alice, collectionIdAlice, 'parent-nft-metadata'); - const childNftId = await mintNft(api, Alice, Alice, collectionIdAlice, 'child-nft-metadata'); - - const resourceId = await addNftBasicResource( - api, - Alice, - 'added', - collectionIdAlice, - childNftId, - src, - metadata, - license, - thumb, - ); - - const newOwnerNFT: NftIdTuple = [collectionIdAlice, parentNftId]; - - await sendNft(api, 'sent', Alice, collectionIdAlice, childNftId, newOwnerNFT); - - await removeNftResource(api, 'removed', Alice, collectionIdAlice, childNftId, resourceId); - }); - - it('deleting a resource by the collection owner', async () => { - const collectionIdAlice = await createCollection( - api, - Alice, - 'test-metadata', - null, - 'test-symbol', - ); - - const nftBob = await mintNft( - api, - Alice, - Bob, - collectionIdAlice, - 'nft-metadata', - ); - - const resourceId = await addNftBasicResource( - api, - Alice, - 'pending', - collectionIdAlice, - nftBob, - src, - metadata, - license, - thumb, - ); - - await removeNftResource(api, 'pending', Alice, collectionIdAlice, nftBob, resourceId); - await acceptResourceRemoval(api, Bob, collectionIdAlice, nftBob, resourceId); - }); - - it('deleting a resource in a nested NFT by the collection owner', async () => { - const collectionIdAlice = await createCollection( - api, - Alice, - 'test-metadata', - null, - 'test-symbol', - ); - - const parentNftId = await mintNft( - api, - Alice, - Bob, - collectionIdAlice, - 'parent-nft-metadata', - ); - const childNftId = await mintNft( - api, - Alice, - Bob, - collectionIdAlice, - 'child-nft-metadata', - ); - - const resourceId = await addNftBasicResource( - api, - Alice, - 'pending', - collectionIdAlice, - childNftId, - src, - metadata, - license, - thumb, - ); - - const newOwnerNFT: NftIdTuple = [collectionIdAlice, parentNftId]; - - await sendNft(api, 'sent', Bob, collectionIdAlice, childNftId, newOwnerNFT); - - await removeNftResource(api, 'pending', Alice, collectionIdAlice, childNftId, resourceId); - await acceptResourceRemoval(api, Bob, collectionIdAlice, childNftId, resourceId); - }); - - it('[negative]: can\'t delete a resource in a non-existing collection', async () => { - const collectionIdAlice = await createCollection( - api, - Alice, - 'test-metadata', - null, - 'test-symbol', - ); - - const nftAlice = await mintNft( - api, - Alice, - Alice, - collectionIdAlice, - 'nft-metadata', - ); - - const resourceId = await addNftBasicResource( - api, - Alice, - 'added', - collectionIdAlice, - nftAlice, - src, - metadata, - license, - thumb, - ); - - const tx = removeNftResource(api, 'removed', Alice, 0xFFFFFFFF, nftAlice, resourceId); - await expectTxFailure(/rmrkCore\.CollectionUnknown/, tx); // FIXME: inappropriate error message (NoAvailableNftId) - }); - - it('[negative]: only collection owner can delete a resource', async () => { - const collectionIdAlice = await createCollection( - api, - Alice, - 'test-metadata', - null, - 'test-symbol', - ); - - const nftAlice = await mintNft( - api, - Alice, - Alice, - collectionIdAlice, - 'nft-metadata', - ); - - const resourceId = await addNftBasicResource( - api, - Alice, - 'added', - collectionIdAlice, - nftAlice, - src, - metadata, - license, - thumb, - ); - - const tx = removeNftResource(api, 'removed', Bob, collectionIdAlice, nftAlice, resourceId); - await expectTxFailure(/rmrkCore\.NoPermission/, tx); - }); - - it('[negative]: cannot delete a resource that does not exist', async () => { - const collectionIdAlice = await createCollection( - api, - Alice, - 'test-metadata', - null, - 'test-symbol', - ); - - const nftAlice = await mintNft( - api, - Alice, - Alice, - collectionIdAlice, - 'nft-metadata', - ); - - const tx = removeNftResource(api, 'removed', Alice, collectionIdAlice, nftAlice, 127); - await expectTxFailure(/rmrkCore\.ResourceDoesntExist/, tx); - }); - - it('[negative]: Cannot accept deleting resource without owner attempt do delete it', async () => { - const collectionIdAlice = await createCollection( - api, - Alice, - 'test-metadata', - null, - 'test-symbol', - ); - - const nftBob = await mintNft( - api, - Alice, - Bob, - collectionIdAlice, - 'nft-metadata', - ); - - const resourceId = await addNftBasicResource( - api, - Alice, - 'pending', - collectionIdAlice, - nftBob, - src, - metadata, - license, - thumb, - ); - - const tx = acceptResourceRemoval(api, Bob, collectionIdAlice, nftBob, resourceId); - await expectTxFailure(/rmrkCore\.ResourceNotPending/, tx); - }); - - it('[negative]: cannot confirm the deletion of a non-existing resource', async () => { - const collectionIdAlice = await createCollection( - api, - Alice, - 'test-metadata', - null, - 'test-symbol', - ); - - const nftBob = await mintNft( - api, - Alice, - Bob, - collectionIdAlice, - 'nft-metadata', - ); - - const tx = acceptResourceRemoval(api, Bob, collectionIdAlice, nftBob, 127); - await expectTxFailure(/rmrkCore\.ResourceDoesntExist/, tx); - }); - - it('[negative]: Non-owner user cannot confirm the deletion of resource', async () => { - const collectionIdAlice = await createCollection( - api, - Alice, - 'test-metadata', - null, - 'test-symbol', - ); - - const nftAlice = await mintNft( - api, - Alice, - Alice, - collectionIdAlice, - 'nft-metadata', - ); - - const resourceId = await addNftBasicResource( - api, - Alice, - 'added', - collectionIdAlice, - nftAlice, - src, - metadata, - license, - thumb, - ); - - const tx = acceptResourceRemoval(api, Bob, collectionIdAlice, nftAlice, resourceId); - await expectTxFailure(/rmrkCore\.NoPermission/, tx); - }); - - after(async() => { await api.disconnect(); }); -}); --- /dev/null +++ b/tests/src/rmrk/rmrkIsolation.seqtest.ts @@ -0,0 +1,225 @@ +import {executeTransaction} from '../substrate/substrate-api'; +import {IKeyringPair} from '@polkadot/types/types'; +import {itSub, expect, usingPlaygrounds, Pallets, requirePalletsOrSkip} from '../util'; +import {UniqueHelper} from '../util/playgrounds/unique'; + +let alice: IKeyringPair; +let bob: IKeyringPair; + +async function createRmrkCollection(helper: UniqueHelper, sender: IKeyringPair): Promise<{uniqueId: number, rmrkId: number}> { + const result = await helper.executeExtrinsic(sender, 'api.tx.rmrkCore.createCollection', ['metadata', null, 'symbol'], true); + + const uniqueId = helper.util.extractCollectionIdFromCreationResult(result); + + let rmrkId = null; + result.result.events.forEach(({event: {data, method, section}}) => { + if ((section === 'rmrkCore') && (method === 'CollectionCreated')) { + rmrkId = parseInt(data[1].toString(), 10); + } + }); + + if (rmrkId === null) { + throw Error('No rmrkCore.CollectionCreated event was found!'); + } + + return { + uniqueId, + rmrkId, + }; +} + +async function createRmrkNft(helper: UniqueHelper, sender: IKeyringPair, collectionId: number): Promise { + const result = await helper.executeExtrinsic( + sender, + 'api.tx.rmrkCore.mintNft', + [ + sender.address, + collectionId, + sender.address, + null, + 'nft-metadata', + true, + null, + ], + true, + ); + + let rmrkNftId = null; + result.result.events.forEach(({event: {data, method, section}}) => { + if ((section === 'rmrkCore') && (method === 'NftMinted')) { + rmrkNftId = parseInt(data[2].toString(), 10); + } + }); + + if (rmrkNftId === null) { + throw Error('No rmrkCore.NftMinted event was found!'); + } + + return rmrkNftId; +} + +describe('RMRK External Integration Test', async () => { + before(async function() { + await usingPlaygrounds(async (_helper, privateKey) => { + alice = await privateKey('//Alice'); + }); + }); + + itSub.ifWithPallets('Creates a new RMRK collection that is mapped to a different ID and is tagged as external', [Pallets.RmrkCore], async ({helper}) => { + // throw away collection to bump last Unique collection ID to test ID mapping + await helper.nft.mintCollection(alice, {tokenPrefix: 'unqt'}); + + const collectionIds = await createRmrkCollection(helper, alice); + + expect(collectionIds.rmrkId).to.be.lessThan(collectionIds.uniqueId, 'collection ID mapping'); + + const collection = (await helper.nft.getCollectionObject(collectionIds.uniqueId).getData())!; // (await getDetailedCollectionInfo(api, collectionIds.uniqueId))!; + expect(collection.raw.readOnly, 'tagged external').to.be.true; + }); +}); + +describe('Negative Integration Test: External Collections, Internal Ops', async () => { + let uniqueCollectionId: number; + let rmrkCollectionId: number; + let rmrkNftId: number; + let normalizedAlice: {Substrate: string}; + + before(async function() { + await usingPlaygrounds(async (helper, privateKey) => { + alice = await privateKey('//Alice'); + bob = await privateKey('//Bob'); + normalizedAlice = {Substrate: helper.address.normalizeSubstrateToChainFormat(alice.address)}; + + requirePalletsOrSkip(this, helper, [Pallets.RmrkCore]); + + const collectionIds = await createRmrkCollection(helper, alice); + uniqueCollectionId = collectionIds.uniqueId; + rmrkCollectionId = collectionIds.rmrkId; + + rmrkNftId = await createRmrkNft(helper, alice, rmrkCollectionId); + }); + }); + + itSub.ifWithPallets('[Negative] Forbids Unique operations with an external collection, handled by dispatch_call', [Pallets.RmrkCore], async ({helper}) => { + // Collection item creation + + await expect(helper.nft.mintToken(alice, {collectionId: uniqueCollectionId, owner: {Substrate: alice.address}}), 'creating item') + .to.be.rejectedWith(/common\.CollectionIsExternal/); + + const txCreateMultipleItems = helper.getApi().tx.unique.createMultipleItems(uniqueCollectionId, normalizedAlice, [{NFT: {}}, {NFT: {}}]); + await expect(executeTransaction(helper.getApi(), alice, txCreateMultipleItems), 'creating multiple') + .to.be.rejectedWith(/common\.CollectionIsExternal/); + + await expect(helper.nft.mintMultipleTokens(alice, uniqueCollectionId, [{owner: {Substrate: alice.address}}]), 'creating multiple ex') + .to.be.rejectedWith(/common\.CollectionIsExternal/); + + // Collection properties + + await expect(helper.nft.setProperties(alice, uniqueCollectionId, [{key: 'a', value: '1'}, {key: 'b'}]), 'setting collection properties') + .to.be.rejectedWith(/common\.CollectionIsExternal/); + + await expect(helper.nft.deleteProperties(alice, uniqueCollectionId, ['a']), 'deleting collection properties') + .to.be.rejectedWith(/common\.CollectionIsExternal/); + + await expect(helper.nft.setTokenPropertyPermissions(alice, uniqueCollectionId, [{key: 'a', permission: {mutable: true}}]), 'setting property permissions') + .to.be.rejectedWith(/common\.CollectionIsExternal/); + + // NFT + + await expect(helper.nft.burnToken(alice, uniqueCollectionId, rmrkNftId, 1n), 'burning') + .to.be.rejectedWith(/common\.CollectionIsExternal/); + + await expect(helper.nft.burnTokenFrom(alice, uniqueCollectionId, rmrkNftId, {Substrate: alice.address}, 1n), 'burning-from') + .to.be.rejectedWith(/common\.CollectionIsExternal/); + + await expect(helper.nft.transferToken(alice, uniqueCollectionId, rmrkNftId, {Substrate: bob.address}), 'transferring') + .to.be.rejectedWith(/common\.CollectionIsExternal/); + + await expect(helper.nft.approveToken(alice, uniqueCollectionId, rmrkNftId, {Substrate: bob.address}), 'approving') + .to.be.rejectedWith(/common\.CollectionIsExternal/); + + await expect(helper.nft.transferTokenFrom(alice, uniqueCollectionId, rmrkNftId, {Substrate: alice.address}, {Substrate: bob.address}), 'transferring-from') + .to.be.rejectedWith(/common\.CollectionIsExternal/); + + // NFT properties + + await expect(helper.nft.setTokenProperties(alice, uniqueCollectionId, rmrkNftId, [{key: 'a', value: '2'}]), 'setting token properties') + .to.be.rejectedWith(/common\.CollectionIsExternal/); + + await expect(helper.nft.deleteTokenProperties(alice, uniqueCollectionId, rmrkNftId, ['a'])) + .to.be.rejectedWith(/common\.CollectionIsExternal/); + }); + + itSub.ifWithPallets('[Negative] Forbids Unique collection operations with an external collection', [Pallets.RmrkCore], async ({helper}) => { + await expect(helper.nft.burn(alice, uniqueCollectionId), 'destroying collection') + .to.be.rejectedWith(/common\.CollectionIsExternal/); + + // Allow list + + await expect(helper.nft.addToAllowList(alice, uniqueCollectionId, {Substrate: bob.address}), 'adding to allow list') + .to.be.rejectedWith(/common\.CollectionIsExternal/); + + await expect(helper.nft.removeFromAllowList(alice, uniqueCollectionId, {Substrate: bob.address}), 'removing from allowlist') + .to.be.rejectedWith(/common\.CollectionIsExternal/); + + // Owner / Admin / Sponsor + + await expect(helper.nft.changeOwner(alice, uniqueCollectionId, bob.address), 'changing owner') + .to.be.rejectedWith(/common\.CollectionIsExternal/); + + await expect(helper.nft.addAdmin(alice, uniqueCollectionId, {Substrate: bob.address}), 'adding admin') + .to.be.rejectedWith(/common\.CollectionIsExternal/); + + await expect(helper.nft.removeAdmin(alice, uniqueCollectionId, {Substrate: bob.address}), 'removing admin') + .to.be.rejectedWith(/common\.CollectionIsExternal/); + + await expect(helper.nft.setSponsor(alice, uniqueCollectionId, bob.address), 'setting sponsor') + .to.be.rejectedWith(/common\.CollectionIsExternal/); + + await expect(helper.nft.confirmSponsorship(alice, uniqueCollectionId), 'confirming sponsor') + .to.be.rejectedWith(/common\.CollectionIsExternal/); + + await expect(helper.nft.removeSponsor(alice, uniqueCollectionId), 'removing sponsor') + .to.be.rejectedWith(/common\.CollectionIsExternal/); + + // Limits / permissions / transfers + + const txSetTransfers = helper.getApi().tx.unique.setTransfersEnabledFlag(uniqueCollectionId, true); + await expect(executeTransaction(helper.getApi(), alice, txSetTransfers), 'setting transfers enabled flag') + .to.be.rejectedWith(/common\.CollectionIsExternal/); + + await expect(helper.nft.setLimits(alice, uniqueCollectionId, {transfersEnabled: false}), 'setting collection limits') + .to.be.rejectedWith(/common\.CollectionIsExternal/); + + await expect(helper.nft.setPermissions(alice, uniqueCollectionId, {access: 'AllowList'}), 'setting collection permissions') + .to.be.rejectedWith(/common\.CollectionIsExternal/); + }); +}); + +describe('Negative Integration Test: Internal Collections, External Ops', async () => { + let collectionId: number; + let nftId: number; + + before(async () => { + await usingPlaygrounds(async (helper, privateKey) => { + alice = await privateKey('//Alice'); + bob = await privateKey('//Bob'); + + const collection = await helper.nft.mintCollection(alice, {tokenPrefix: 'iceo'}); + collectionId = collection.collectionId; + nftId = (await collection.mintToken(alice)).tokenId; + }); + }); + + itSub.ifWithPallets('[Negative] Forbids RMRK operations with the internal collection and NFT (due to the lack of mapping)', [Pallets.RmrkCore], async ({helper}) => { + const api = helper.getApi(); + + const txChangeOwner = api.tx.rmrkCore.changeCollectionIssuer(collectionId, bob.address); + await expect(executeTransaction(api, alice, txChangeOwner), 'changing collection issuer') + .to.be.rejectedWith(/rmrkCore\.CollectionUnknown/); + + const maxBurns = 10; + const txBurnItem = api.tx.rmrkCore.burnNft(collectionId, nftId, maxBurns); + await expect(executeTransaction(api, alice, txBurnItem), 'burning NFT').to.be.rejectedWith(/rmrkCore\.CollectionUnknown/); + }); +}); --- a/tests/src/rmrk/rmrkIsolation.test.ts +++ /dev/null @@ -1,225 +0,0 @@ -import {executeTransaction} from '../substrate/substrate-api'; -import {IKeyringPair} from '@polkadot/types/types'; -import {itSub, expect, usingPlaygrounds, Pallets, requirePalletsOrSkip} from '../util/playgrounds'; -import {UniqueHelper} from '../util/playgrounds/unique'; - -let alice: IKeyringPair; -let bob: IKeyringPair; - -async function createRmrkCollection(helper: UniqueHelper, sender: IKeyringPair): Promise<{uniqueId: number, rmrkId: number}> { - const result = await helper.executeExtrinsic(sender, 'api.tx.rmrkCore.createCollection', ['metadata', null, 'symbol'], true); - - const uniqueId = helper.util.extractCollectionIdFromCreationResult(result); - - let rmrkId = null; - result.result.events.forEach(({event: {data, method, section}}) => { - if ((section === 'rmrkCore') && (method === 'CollectionCreated')) { - rmrkId = parseInt(data[1].toString(), 10); - } - }); - - if (rmrkId === null) { - throw Error('No rmrkCore.CollectionCreated event was found!'); - } - - return { - uniqueId, - rmrkId, - }; -} - -async function createRmrkNft(helper: UniqueHelper, sender: IKeyringPair, collectionId: number): Promise { - const result = await helper.executeExtrinsic( - sender, - 'api.tx.rmrkCore.mintNft', - [ - sender.address, - collectionId, - sender.address, - null, - 'nft-metadata', - true, - null, - ], - true, - ); - - let rmrkNftId = null; - result.result.events.forEach(({event: {data, method, section}}) => { - if ((section === 'rmrkCore') && (method === 'NftMinted')) { - rmrkNftId = parseInt(data[2].toString(), 10); - } - }); - - if (rmrkNftId === null) { - throw Error('No rmrkCore.NftMinted event was found!'); - } - - return rmrkNftId; -} - -describe('RMRK External Integration Test', async () => { - before(async function() { - await usingPlaygrounds(async (_helper, privateKey) => { - alice = privateKey('//Alice'); - }); - }); - - itSub.ifWithPallets('Creates a new RMRK collection that is mapped to a different ID and is tagged as external', [Pallets.RmrkCore], async ({helper}) => { - // throw away collection to bump last Unique collection ID to test ID mapping - await helper.nft.mintCollection(alice, {tokenPrefix: 'unqt'}); - - const collectionIds = await createRmrkCollection(helper, alice); - - expect(collectionIds.rmrkId).to.be.lessThan(collectionIds.uniqueId, 'collection ID mapping'); - - const collection = (await helper.nft.getCollectionObject(collectionIds.uniqueId).getData())!; // (await getDetailedCollectionInfo(api, collectionIds.uniqueId))!; - expect(collection.raw.readOnly, 'tagged external').to.be.true; - }); -}); - -describe('Negative Integration Test: External Collections, Internal Ops', async () => { - let uniqueCollectionId: number; - let rmrkCollectionId: number; - let rmrkNftId: number; - let normalizedAlice: {Substrate: string}; - - before(async function() { - await usingPlaygrounds(async (helper, privateKey) => { - alice = privateKey('//Alice'); - bob = privateKey('//Bob'); - normalizedAlice = {Substrate: helper.address.normalizeSubstrateToChainFormat(alice.address)}; - - await requirePalletsOrSkip(this, helper, [Pallets.RmrkCore]); - - const collectionIds = await createRmrkCollection(helper, alice); - uniqueCollectionId = collectionIds.uniqueId; - rmrkCollectionId = collectionIds.rmrkId; - - rmrkNftId = await createRmrkNft(helper, alice, rmrkCollectionId); - }); - }); - - itSub.ifWithPallets('[Negative] Forbids Unique operations with an external collection, handled by dispatch_call', [Pallets.RmrkCore], async ({helper}) => { - // Collection item creation - - await expect(helper.nft.mintToken(alice, {collectionId: uniqueCollectionId, owner: {Substrate: alice.address}}), 'creating item') - .to.be.rejectedWith(/common\.CollectionIsExternal/); - - const txCreateMultipleItems = helper.getApi().tx.unique.createMultipleItems(uniqueCollectionId, normalizedAlice, [{NFT: {}}, {NFT: {}}]); - await expect(executeTransaction(helper.getApi(), alice, txCreateMultipleItems), 'creating multiple') - .to.be.rejectedWith(/common\.CollectionIsExternal/); - - await expect(helper.nft.mintMultipleTokens(alice, uniqueCollectionId, [{owner: {Substrate: alice.address}}]), 'creating multiple ex') - .to.be.rejectedWith(/common\.CollectionIsExternal/); - - // Collection properties - - await expect(helper.nft.setProperties(alice, uniqueCollectionId, [{key: 'a', value: '1'}, {key: 'b'}]), 'setting collection properties') - .to.be.rejectedWith(/common\.CollectionIsExternal/); - - await expect(helper.nft.deleteProperties(alice, uniqueCollectionId, ['a']), 'deleting collection properties') - .to.be.rejectedWith(/common\.CollectionIsExternal/); - - await expect(helper.nft.setTokenPropertyPermissions(alice, uniqueCollectionId, [{key: 'a', permission: {mutable: true}}]), 'setting property permissions') - .to.be.rejectedWith(/common\.CollectionIsExternal/); - - // NFT - - await expect(helper.nft.burnToken(alice, uniqueCollectionId, rmrkNftId, 1n), 'burning') - .to.be.rejectedWith(/common\.CollectionIsExternal/); - - await expect(helper.nft.burnTokenFrom(alice, uniqueCollectionId, rmrkNftId, {Substrate: alice.address}, 1n), 'burning-from') - .to.be.rejectedWith(/common\.CollectionIsExternal/); - - await expect(helper.nft.transferToken(alice, uniqueCollectionId, rmrkNftId, {Substrate: bob.address}), 'transferring') - .to.be.rejectedWith(/common\.CollectionIsExternal/); - - await expect(helper.nft.approveToken(alice, uniqueCollectionId, rmrkNftId, {Substrate: bob.address}), 'approving') - .to.be.rejectedWith(/common\.CollectionIsExternal/); - - await expect(helper.nft.transferTokenFrom(alice, uniqueCollectionId, rmrkNftId, {Substrate: alice.address}, {Substrate: bob.address}), 'transferring-from') - .to.be.rejectedWith(/common\.CollectionIsExternal/); - - // NFT properties - - await expect(helper.nft.setTokenProperties(alice, uniqueCollectionId, rmrkNftId, [{key: 'a', value: '2'}]), 'setting token properties') - .to.be.rejectedWith(/common\.CollectionIsExternal/); - - await expect(helper.nft.deleteTokenProperties(alice, uniqueCollectionId, rmrkNftId, ['a'])) - .to.be.rejectedWith(/common\.CollectionIsExternal/); - }); - - itSub.ifWithPallets('[Negative] Forbids Unique collection operations with an external collection', [Pallets.RmrkCore], async ({helper}) => { - await expect(helper.nft.burn(alice, uniqueCollectionId), 'destroying collection') - .to.be.rejectedWith(/common\.CollectionIsExternal/); - - // Allow list - - await expect(helper.nft.addToAllowList(alice, uniqueCollectionId, {Substrate: bob.address}), 'adding to allow list') - .to.be.rejectedWith(/common\.CollectionIsExternal/); - - await expect(helper.nft.removeFromAllowList(alice, uniqueCollectionId, {Substrate: bob.address}), 'removing from allowlist') - .to.be.rejectedWith(/common\.CollectionIsExternal/); - - // Owner / Admin / Sponsor - - await expect(helper.nft.changeOwner(alice, uniqueCollectionId, bob.address), 'changing owner') - .to.be.rejectedWith(/common\.CollectionIsExternal/); - - await expect(helper.nft.addAdmin(alice, uniqueCollectionId, {Substrate: bob.address}), 'adding admin') - .to.be.rejectedWith(/common\.CollectionIsExternal/); - - await expect(helper.nft.removeAdmin(alice, uniqueCollectionId, {Substrate: bob.address}), 'removing admin') - .to.be.rejectedWith(/common\.CollectionIsExternal/); - - await expect(helper.nft.setSponsor(alice, uniqueCollectionId, bob.address), 'setting sponsor') - .to.be.rejectedWith(/common\.CollectionIsExternal/); - - await expect(helper.nft.confirmSponsorship(alice, uniqueCollectionId), 'confirming sponsor') - .to.be.rejectedWith(/common\.CollectionIsExternal/); - - await expect(helper.nft.removeSponsor(alice, uniqueCollectionId), 'removing sponsor') - .to.be.rejectedWith(/common\.CollectionIsExternal/); - - // Limits / permissions / transfers - - const txSetTransfers = helper.getApi().tx.unique.setTransfersEnabledFlag(uniqueCollectionId, true); - await expect(executeTransaction(helper.getApi(), alice, txSetTransfers), 'setting transfers enabled flag') - .to.be.rejectedWith(/common\.CollectionIsExternal/); - - await expect(helper.nft.setLimits(alice, uniqueCollectionId, {transfersEnabled: false}), 'setting collection limits') - .to.be.rejectedWith(/common\.CollectionIsExternal/); - - await expect(helper.nft.setPermissions(alice, uniqueCollectionId, {access: 'AllowList'}), 'setting collection permissions') - .to.be.rejectedWith(/common\.CollectionIsExternal/); - }); -}); - -describe('Negative Integration Test: Internal Collections, External Ops', async () => { - let collectionId: number; - let nftId: number; - - before(async () => { - await usingPlaygrounds(async (helper, privateKey) => { - alice = privateKey('//Alice'); - bob = privateKey('//Bob'); - - const collection = await helper.nft.mintCollection(alice, {tokenPrefix: 'iceo'}); - collectionId = collection.collectionId; - nftId = (await collection.mintToken(alice)).tokenId; - }); - }); - - itSub.ifWithPallets('[Negative] Forbids RMRK operations with the internal collection and NFT (due to the lack of mapping)', [Pallets.RmrkCore], async ({helper}) => { - const api = helper.getApi(); - - const txChangeOwner = api.tx.rmrkCore.changeCollectionIssuer(collectionId, bob.address); - await expect(executeTransaction(api, alice, txChangeOwner), 'changing collection issuer') - .to.be.rejectedWith(/rmrkCore\.CollectionUnknown/); - - const maxBurns = 10; - const txBurnItem = api.tx.rmrkCore.burnNft(collectionId, nftId, maxBurns); - await expect(executeTransaction(api, alice, txBurnItem), 'burning NFT').to.be.rejectedWith(/rmrkCore\.CollectionUnknown/); - }); -}); --- /dev/null +++ b/tests/src/rmrk/sendNft.seqtest.ts @@ -0,0 +1,255 @@ +import {expect} from 'chai'; +import {getApiConnection} from '../substrate/substrate-api'; +import {createCollection, mintNft, sendNft} from './util/tx'; +import {NftIdTuple} from './util/fetch'; +import {isNftChildOfAnother, expectTxFailure, requirePallets, Pallets} from './util/helpers'; + +describe('integration test: send NFT', () => { + let api: any; + before(async function () { + api = await getApiConnection(); + await requirePallets(this, [Pallets.RmrkCore]); + }); + + const maxNftId = 0xFFFFFFFF; + + const alice = '//Alice'; + const bob = '//Bob'; + + const createTestCollection = async (issuerUri: string) => { + return await createCollection( + api, + issuerUri, + 'nft-collection-metadata', + null, + 'nft-collection', + ); + }; + + + it('send NFT to another user', async () => { + const originalOwnerUri = alice; + const newOwnerUri = bob; + + const collectionId = await createTestCollection(alice); + + const nftId = await mintNft(api, alice, originalOwnerUri, collectionId, 'nft-metadata'); + + await sendNft(api, 'sent', originalOwnerUri, collectionId, nftId, newOwnerUri); + }); + + it('[negative] unable to send non-existing NFT', async () => { + const originalOwnerUri = alice; + const newOwnerUri = bob; + + const collectionId = 0; + const tx = sendNft(api, 'sent', originalOwnerUri, collectionId, maxNftId, newOwnerUri); + + await expectTxFailure(/rmrkCore\.NoAvailableNftId/, tx); + }); + + it('[negative] unable to send NFT by a not-an-owner', async () => { + const originalOwnerUri = alice; + const newOwnerUri = bob; + + const collectionId = await createTestCollection(alice); + + const nftId = await mintNft(api, alice, originalOwnerUri, collectionId, 'nft-metadata'); + + const tx = sendNft(api, 'sent', newOwnerUri, collectionId, nftId, newOwnerUri); + await expectTxFailure(/rmrkCore\.NoPermission/, tx); + }); + + it('send NFT to another NFT (same owner)', async () => { + const originalOwnerUri = alice; + + const collectionId = await createTestCollection(alice); + + const parentNftId = await mintNft(api, alice, originalOwnerUri, collectionId, 'parent-nft-metadata'); + const childNftId = await mintNft(api, alice, originalOwnerUri, collectionId, 'child-nft-metadata'); + + const newOwnerNFT: NftIdTuple = [collectionId, parentNftId]; + + await sendNft(api, 'sent', alice, collectionId, childNftId, newOwnerNFT); + + const isChild = await isNftChildOfAnother(api, collectionId, childNftId, newOwnerNFT); + expect(isChild).to.be.true; + }); + + it('[negative] send non-existing NFT to another NFT', async () => { + const originalOwnerUri = alice; + + const collectionId = await createTestCollection(alice); + + const parentNftId = await mintNft(api, alice, originalOwnerUri, collectionId, 'parent-nft-metadata'); + const childNftId = maxNftId; + + const newOwnerNFT: NftIdTuple = [collectionId, parentNftId]; + + const tx = sendNft(api, 'sent', alice, collectionId, childNftId, newOwnerNFT); + + await expectTxFailure(/rmrkCore\.NoAvailableNftId/, tx); + + const isChild = await isNftChildOfAnother(api, collectionId, childNftId, newOwnerNFT); + expect(isChild).to.be.false; + }); + + it('send NFT to another NFT (by not-an-owner)', async () => { + const originalOwnerUri = alice; + + const collectionId = await createTestCollection(alice); + + const author = alice; + const attacker = bob; + + const parentNftId = await mintNft(api, author, originalOwnerUri, collectionId, 'parent-nft-metadata'); + const childNftId = await mintNft(api, author, originalOwnerUri, collectionId, 'child-nft-metadata'); + + const newOwnerNFT: NftIdTuple = [collectionId, parentNftId]; + + const tx = sendNft(api, 'sent', attacker, collectionId, childNftId, newOwnerNFT); + + await expectTxFailure(/rmrkCore\.NoPermission/, tx); + + const isChild = await isNftChildOfAnother(api, collectionId, childNftId, newOwnerNFT); + expect(isChild).to.be.false; + }); + + it('[negative] send NFT to non-existing NFT', async () => { + const originalOwnerUri = alice; + + const collectionId = await createTestCollection(alice); + + const parentNftId = maxNftId; + const childNftId = await mintNft(api, alice, originalOwnerUri, collectionId, 'child-nft-metadata'); + + const newOwnerNFT: NftIdTuple = [collectionId, parentNftId]; + + const tx = sendNft(api, 'sent', alice, collectionId, childNftId, newOwnerNFT); + + await expectTxFailure(/rmrkCore\.NoAvailableNftId/, tx); + + const isChild = await isNftChildOfAnother(api, collectionId, childNftId, newOwnerNFT); + expect(isChild).to.be.false; + }); + + it('send NFT to another NFT owned by another user', async () => { + const ownerAlice = alice; + const ownerBob = bob; + + const aliceCollectionId = await createTestCollection(alice); + const bobCollectionId = await createTestCollection(bob); + + const parentNftId = await mintNft(api, alice, ownerAlice, aliceCollectionId, 'parent-nft-metadata'); + const childNftId = await mintNft(api, bob, ownerBob, bobCollectionId, 'child-nft-metadata'); + + const newOwnerNFT: NftIdTuple = [aliceCollectionId, parentNftId]; + + await sendNft(api, 'pending', bob, bobCollectionId, childNftId, newOwnerNFT); + }); + + it('[negative] unable to send NFT to itself', async () => { + const nftOwner = alice; + const collectionId = await createTestCollection(alice); + + const nftId = await mintNft(api, alice, nftOwner, collectionId, 'ouroboros-nft-metadata'); + + const newOwnerNFT: NftIdTuple = [collectionId, nftId]; + + const tx = sendNft(api, 'sent', alice, collectionId, nftId, newOwnerNFT); + + await expectTxFailure(/rmrkCore\.CannotSendToDescendentOrSelf/, tx); + + const isChild = await isNftChildOfAnother(api, collectionId, nftId, newOwnerNFT); + expect(isChild).to.be.false; + }); + + it('[negative] unable to send NFT to child NFT', async () => { + const originalOwnerUri = alice; + + const collectionId = await createTestCollection(alice); + + const parentNftId = await mintNft(api, alice, originalOwnerUri, collectionId, 'parent-nft-metadata'); + const childNftId = await mintNft(api, alice, originalOwnerUri, collectionId, 'child-nft-metadata'); + + const newOwnerNFT: NftIdTuple = [collectionId, parentNftId]; + + await sendNft(api, 'sent', alice, collectionId, childNftId, newOwnerNFT); + + const isChild = await isNftChildOfAnother(api, collectionId, childNftId, newOwnerNFT); + expect(isChild).to.be.true; + + const descendentOwner: NftIdTuple = [collectionId, childNftId]; + const tx = sendNft(api, 'sent', alice, collectionId, parentNftId, descendentOwner); + + await expectTxFailure(/rmrkCore\.CannotSendToDescendentOrSelf/, tx); + const isOuroboros = await isNftChildOfAnother(api, collectionId, parentNftId, descendentOwner); + expect(isOuroboros).to.be.false; + }); + + it('[negative] unable to send NFT to descendent NFT', async () => { + const originalOwnerUri = alice; + + const collectionId = await createTestCollection(alice); + + const parentNftId = await mintNft(api, alice, originalOwnerUri, collectionId, 'parent-nft-metadata'); + const childNftId = await mintNft(api, alice, originalOwnerUri, collectionId, 'child-nft-metadata'); + const grandsonNftId = await mintNft(api, alice, originalOwnerUri, collectionId, 'grandson-nft-metadata'); + + const ownerParentNFT: NftIdTuple = [collectionId, parentNftId]; + + await sendNft(api, 'sent', alice, collectionId, childNftId, ownerParentNFT); + + const isChild = await isNftChildOfAnother(api, collectionId, childNftId, ownerParentNFT); + expect(isChild).to.be.true; + + const ownerChildNFT: NftIdTuple = [collectionId, childNftId]; + await sendNft(api, 'sent', alice, collectionId, grandsonNftId, ownerChildNFT); + + const isGrandson = await isNftChildOfAnother(api, collectionId, grandsonNftId, ownerChildNFT); + expect(isGrandson).to.be.true; + + const ownerGrandsonNFT: NftIdTuple = [collectionId, grandsonNftId]; + const tx = sendNft(api, 'sent', alice, collectionId, parentNftId, ownerGrandsonNFT); + + await expectTxFailure(/rmrkCore\.CannotSendToDescendentOrSelf/, tx); + const isOuroboros = await isNftChildOfAnother(api, collectionId, parentNftId, ownerGrandsonNFT); + expect(isOuroboros).to.be.false; + }); + + it('send nested NFT to another user', async () => { + const originalOwner = alice; + const newOwner = bob; + + const collectionId = await createTestCollection(alice); + + const parentNftId = await mintNft(api, alice, originalOwner, collectionId, 'parent-nft-metadata'); + const childNftId = await mintNft(api, alice, originalOwner, collectionId, 'child-nft-metadata'); + + const parentNftTuple: NftIdTuple = [collectionId, parentNftId]; + + await sendNft(api, 'sent', originalOwner, collectionId, childNftId, parentNftTuple); + + await sendNft(api, 'sent', originalOwner, collectionId, childNftId, newOwner); + }); + + it('[negative] send nested NFT to another user (by a not-root-owner)', async () => { + const originalOwner = alice; + const newOwner = bob; + + const collectionId = await createTestCollection(alice); + + const parentNftId = await mintNft(api, alice, originalOwner, collectionId, 'parent-nft-metadata'); + const childNftId = await mintNft(api, alice, originalOwner, collectionId, 'child-nft-metadata'); + + const parentNftTuple: NftIdTuple = [collectionId, parentNftId]; + + await sendNft(api, 'sent', originalOwner, collectionId, childNftId, parentNftTuple); + + const tx = sendNft(api, 'sent', newOwner, collectionId, childNftId, newOwner); + + await expectTxFailure(/rmrkCore\.NoPermission/, tx); + }); + + after(async() => { await api.disconnect(); }); +}); --- a/tests/src/rmrk/sendNft.test.ts +++ /dev/null @@ -1,255 +0,0 @@ -import {expect} from 'chai'; -import {getApiConnection} from '../substrate/substrate-api'; -import {createCollection, mintNft, sendNft} from './util/tx'; -import {NftIdTuple} from './util/fetch'; -import {isNftChildOfAnother, expectTxFailure, requirePallets, Pallets} from './util/helpers'; - -describe('integration test: send NFT', () => { - let api: any; - before(async function () { - api = await getApiConnection(); - await requirePallets(this, [Pallets.RmrkCore]); - }); - - const maxNftId = 0xFFFFFFFF; - - const alice = '//Alice'; - const bob = '//Bob'; - - const createTestCollection = async (issuerUri: string) => { - return await createCollection( - api, - issuerUri, - 'nft-collection-metadata', - null, - 'nft-collection', - ); - }; - - - it('send NFT to another user', async () => { - const originalOwnerUri = alice; - const newOwnerUri = bob; - - const collectionId = await createTestCollection(alice); - - const nftId = await mintNft(api, alice, originalOwnerUri, collectionId, 'nft-metadata'); - - await sendNft(api, 'sent', originalOwnerUri, collectionId, nftId, newOwnerUri); - }); - - it('[negative] unable to send non-existing NFT', async () => { - const originalOwnerUri = alice; - const newOwnerUri = bob; - - const collectionId = 0; - const tx = sendNft(api, 'sent', originalOwnerUri, collectionId, maxNftId, newOwnerUri); - - await expectTxFailure(/rmrkCore\.NoAvailableNftId/, tx); - }); - - it('[negative] unable to send NFT by a not-an-owner', async () => { - const originalOwnerUri = alice; - const newOwnerUri = bob; - - const collectionId = await createTestCollection(alice); - - const nftId = await mintNft(api, alice, originalOwnerUri, collectionId, 'nft-metadata'); - - const tx = sendNft(api, 'sent', newOwnerUri, collectionId, nftId, newOwnerUri); - await expectTxFailure(/rmrkCore\.NoPermission/, tx); - }); - - it('send NFT to another NFT (same owner)', async () => { - const originalOwnerUri = alice; - - const collectionId = await createTestCollection(alice); - - const parentNftId = await mintNft(api, alice, originalOwnerUri, collectionId, 'parent-nft-metadata'); - const childNftId = await mintNft(api, alice, originalOwnerUri, collectionId, 'child-nft-metadata'); - - const newOwnerNFT: NftIdTuple = [collectionId, parentNftId]; - - await sendNft(api, 'sent', alice, collectionId, childNftId, newOwnerNFT); - - const isChild = await isNftChildOfAnother(api, collectionId, childNftId, newOwnerNFT); - expect(isChild).to.be.true; - }); - - it('[negative] send non-existing NFT to another NFT', async () => { - const originalOwnerUri = alice; - - const collectionId = await createTestCollection(alice); - - const parentNftId = await mintNft(api, alice, originalOwnerUri, collectionId, 'parent-nft-metadata'); - const childNftId = maxNftId; - - const newOwnerNFT: NftIdTuple = [collectionId, parentNftId]; - - const tx = sendNft(api, 'sent', alice, collectionId, childNftId, newOwnerNFT); - - await expectTxFailure(/rmrkCore\.NoAvailableNftId/, tx); - - const isChild = await isNftChildOfAnother(api, collectionId, childNftId, newOwnerNFT); - expect(isChild).to.be.false; - }); - - it('send NFT to another NFT (by not-an-owner)', async () => { - const originalOwnerUri = alice; - - const collectionId = await createTestCollection(alice); - - const author = alice; - const attacker = bob; - - const parentNftId = await mintNft(api, author, originalOwnerUri, collectionId, 'parent-nft-metadata'); - const childNftId = await mintNft(api, author, originalOwnerUri, collectionId, 'child-nft-metadata'); - - const newOwnerNFT: NftIdTuple = [collectionId, parentNftId]; - - const tx = sendNft(api, 'sent', attacker, collectionId, childNftId, newOwnerNFT); - - await expectTxFailure(/rmrkCore\.NoPermission/, tx); - - const isChild = await isNftChildOfAnother(api, collectionId, childNftId, newOwnerNFT); - expect(isChild).to.be.false; - }); - - it('[negative] send NFT to non-existing NFT', async () => { - const originalOwnerUri = alice; - - const collectionId = await createTestCollection(alice); - - const parentNftId = maxNftId; - const childNftId = await mintNft(api, alice, originalOwnerUri, collectionId, 'child-nft-metadata'); - - const newOwnerNFT: NftIdTuple = [collectionId, parentNftId]; - - const tx = sendNft(api, 'sent', alice, collectionId, childNftId, newOwnerNFT); - - await expectTxFailure(/rmrkCore\.NoAvailableNftId/, tx); - - const isChild = await isNftChildOfAnother(api, collectionId, childNftId, newOwnerNFT); - expect(isChild).to.be.false; - }); - - it('send NFT to another NFT owned by another user', async () => { - const ownerAlice = alice; - const ownerBob = bob; - - const aliceCollectionId = await createTestCollection(alice); - const bobCollectionId = await createTestCollection(bob); - - const parentNftId = await mintNft(api, alice, ownerAlice, aliceCollectionId, 'parent-nft-metadata'); - const childNftId = await mintNft(api, bob, ownerBob, bobCollectionId, 'child-nft-metadata'); - - const newOwnerNFT: NftIdTuple = [aliceCollectionId, parentNftId]; - - await sendNft(api, 'pending', bob, bobCollectionId, childNftId, newOwnerNFT); - }); - - it('[negative] unable to send NFT to itself', async () => { - const nftOwner = alice; - const collectionId = await createTestCollection(alice); - - const nftId = await mintNft(api, alice, nftOwner, collectionId, 'ouroboros-nft-metadata'); - - const newOwnerNFT: NftIdTuple = [collectionId, nftId]; - - const tx = sendNft(api, 'sent', alice, collectionId, nftId, newOwnerNFT); - - await expectTxFailure(/rmrkCore\.CannotSendToDescendentOrSelf/, tx); - - const isChild = await isNftChildOfAnother(api, collectionId, nftId, newOwnerNFT); - expect(isChild).to.be.false; - }); - - it('[negative] unable to send NFT to child NFT', async () => { - const originalOwnerUri = alice; - - const collectionId = await createTestCollection(alice); - - const parentNftId = await mintNft(api, alice, originalOwnerUri, collectionId, 'parent-nft-metadata'); - const childNftId = await mintNft(api, alice, originalOwnerUri, collectionId, 'child-nft-metadata'); - - const newOwnerNFT: NftIdTuple = [collectionId, parentNftId]; - - await sendNft(api, 'sent', alice, collectionId, childNftId, newOwnerNFT); - - const isChild = await isNftChildOfAnother(api, collectionId, childNftId, newOwnerNFT); - expect(isChild).to.be.true; - - const descendentOwner: NftIdTuple = [collectionId, childNftId]; - const tx = sendNft(api, 'sent', alice, collectionId, parentNftId, descendentOwner); - - await expectTxFailure(/rmrkCore\.CannotSendToDescendentOrSelf/, tx); - const isOuroboros = await isNftChildOfAnother(api, collectionId, parentNftId, descendentOwner); - expect(isOuroboros).to.be.false; - }); - - it('[negative] unable to send NFT to descendent NFT', async () => { - const originalOwnerUri = alice; - - const collectionId = await createTestCollection(alice); - - const parentNftId = await mintNft(api, alice, originalOwnerUri, collectionId, 'parent-nft-metadata'); - const childNftId = await mintNft(api, alice, originalOwnerUri, collectionId, 'child-nft-metadata'); - const grandsonNftId = await mintNft(api, alice, originalOwnerUri, collectionId, 'grandson-nft-metadata'); - - const ownerParentNFT: NftIdTuple = [collectionId, parentNftId]; - - await sendNft(api, 'sent', alice, collectionId, childNftId, ownerParentNFT); - - const isChild = await isNftChildOfAnother(api, collectionId, childNftId, ownerParentNFT); - expect(isChild).to.be.true; - - const ownerChildNFT: NftIdTuple = [collectionId, childNftId]; - await sendNft(api, 'sent', alice, collectionId, grandsonNftId, ownerChildNFT); - - const isGrandson = await isNftChildOfAnother(api, collectionId, grandsonNftId, ownerChildNFT); - expect(isGrandson).to.be.true; - - const ownerGrandsonNFT: NftIdTuple = [collectionId, grandsonNftId]; - const tx = sendNft(api, 'sent', alice, collectionId, parentNftId, ownerGrandsonNFT); - - await expectTxFailure(/rmrkCore\.CannotSendToDescendentOrSelf/, tx); - const isOuroboros = await isNftChildOfAnother(api, collectionId, parentNftId, ownerGrandsonNFT); - expect(isOuroboros).to.be.false; - }); - - it('send nested NFT to another user', async () => { - const originalOwner = alice; - const newOwner = bob; - - const collectionId = await createTestCollection(alice); - - const parentNftId = await mintNft(api, alice, originalOwner, collectionId, 'parent-nft-metadata'); - const childNftId = await mintNft(api, alice, originalOwner, collectionId, 'child-nft-metadata'); - - const parentNftTuple: NftIdTuple = [collectionId, parentNftId]; - - await sendNft(api, 'sent', originalOwner, collectionId, childNftId, parentNftTuple); - - await sendNft(api, 'sent', originalOwner, collectionId, childNftId, newOwner); - }); - - it('[negative] send nested NFT to another user (by a not-root-owner)', async () => { - const originalOwner = alice; - const newOwner = bob; - - const collectionId = await createTestCollection(alice); - - const parentNftId = await mintNft(api, alice, originalOwner, collectionId, 'parent-nft-metadata'); - const childNftId = await mintNft(api, alice, originalOwner, collectionId, 'child-nft-metadata'); - - const parentNftTuple: NftIdTuple = [collectionId, parentNftId]; - - await sendNft(api, 'sent', originalOwner, collectionId, childNftId, parentNftTuple); - - const tx = sendNft(api, 'sent', newOwner, collectionId, childNftId, newOwner); - - await expectTxFailure(/rmrkCore\.NoPermission/, tx); - }); - - after(async() => { await api.disconnect(); }); -}); --- /dev/null +++ b/tests/src/rmrk/setCollectionProperty.seqtest.ts @@ -0,0 +1,66 @@ +import {getApiConnection} from '../substrate/substrate-api'; +import {expectTxFailure, requirePallets, Pallets} from './util/helpers'; +import {createCollection, setPropertyCollection} from './util/tx'; + +describe('integration test: set collection property', () => { + const alice = '//Alice'; + const bob = '//Bob'; + + let api: any; + before(async function () { + api = await getApiConnection(); + await requirePallets(this, [Pallets.RmrkCore]); + }); + + it('set collection property', async () => { + await createCollection( + api, + alice, + 'test-metadata', + null, + 'test-symbol', + ).then(async (collectionId) => { + await setPropertyCollection(api, alice, collectionId, 'test_key', '42'); + await setPropertyCollection(api, alice, collectionId, 'test_key', '10'); + await setPropertyCollection( + api, + alice, + collectionId, + 'second_test_key', + '111', + ); + }); + }); + + it('[negative] set non-existing collection property', async () => { + const tx = setPropertyCollection( + api, + alice, + 9999, + 'test_key', + '42', + ); + await expectTxFailure(/rmrkCore\.CollectionUnknown/, tx); + }); + + it('[negative] set property not an owner NFT collection issuer', async () => { + await createCollection( + api, + bob, + 'test-metadata', + null, + 'test-symbol', + ).then(async (collectionId) => { + const tx = setPropertyCollection( + api, + alice, + collectionId, + 'test_key', + '42', + ); + await expectTxFailure(/rmrkCore\.NoPermission/, tx); + }); + }); + + after(async() => { await api.disconnect(); }); +}); --- a/tests/src/rmrk/setCollectionProperty.test.ts +++ /dev/null @@ -1,66 +0,0 @@ -import {getApiConnection} from '../substrate/substrate-api'; -import {expectTxFailure, requirePallets, Pallets} from './util/helpers'; -import {createCollection, setPropertyCollection} from './util/tx'; - -describe('integration test: set collection property', () => { - const Alice = '//Alice'; - const Bob = '//Bob'; - - let api: any; - before(async function () { - api = await getApiConnection(); - await requirePallets(this, [Pallets.RmrkCore]); - }); - - it('set collection property', async () => { - await createCollection( - api, - Alice, - 'test-metadata', - null, - 'test-symbol', - ).then(async (collectionId) => { - await setPropertyCollection(api, Alice, collectionId, 'test_key', '42'); - await setPropertyCollection(api, Alice, collectionId, 'test_key', '10'); - await setPropertyCollection( - api, - Alice, - collectionId, - 'second_test_key', - '111', - ); - }); - }); - - it('[negative] set non-existing collection property', async () => { - const tx = setPropertyCollection( - api, - Alice, - 9999, - 'test_key', - '42', - ); - await expectTxFailure(/rmrkCore\.CollectionUnknown/, tx); - }); - - it('[negative] set property not an owner NFT collection issuer', async () => { - await createCollection( - api, - Bob, - 'test-metadata', - null, - 'test-symbol', - ).then(async (collectionId) => { - const tx = setPropertyCollection( - api, - Alice, - collectionId, - 'test_key', - '42', - ); - await expectTxFailure(/rmrkCore\.NoPermission/, tx); - }); - }); - - after(async() => { await api.disconnect(); }); -}); --- /dev/null +++ b/tests/src/rmrk/setEquippableList.seqtest.ts @@ -0,0 +1,114 @@ +import {getApiConnection} from '../substrate/substrate-api'; +import {expectTxFailure, requirePallets, Pallets} from './util/helpers'; +import {createCollection, createBase, setEquippableList} from './util/tx'; + +describe("integration test: set slot's Equippable List", () => { + let api: any; + before(async function () { + api = await getApiConnection(); + await requirePallets(this, [Pallets.RmrkCore]); + }); + + const alice = '//Alice'; + const bob = '//Bob'; + + it("set Base's slot Equippable List", async () => { + const collectionIds = [ + await createCollection( + api, + alice, + 'equiplist-collection-metadata', + null, + 'equiplist-0', + ), + await createCollection( + api, + alice, + 'equiplist-collection-metadata', + null, + 'equiplist-1', + ), + ]; + + const slotId = 202; + + const baseId = await createBase(api, alice, 'slotpartany-base-type', 'slotpartany', [ + { + 'SlotPart': { + id: slotId, + equippable: 'All', + z: 1, + src: 'some-fallback-slot-url', + }, + }, + ]); + + await setEquippableList(api, alice, baseId, slotId, 'All'); + await setEquippableList(api, alice, baseId, slotId, 'Empty'); + await setEquippableList(api, alice, baseId, slotId, {'Custom': collectionIds}); + }); + + it('[negative] unable to set equippable list of a slot of non-existing base', async () => { + const maxBaseId = 0xFFFFFFFF; + const slotId = 0; + + const tx = setEquippableList(api, alice, maxBaseId, slotId, 'All'); + await expectTxFailure(/rmrkEquip\.BaseDoesntExist/, tx); + }); + + it('[negative] unable to set equippable list by a not-an-owner', async () => { + const slotId = 42; + + const baseId = await createBase(api, alice, 'slotpartany-base-type', 'slotpartany', [ + { + 'SlotPart': { + id: slotId, + equippable: 'All', + z: 1, + src: 'some-fallback-slot-url', + }, + }, + ]); + + const tx = setEquippableList(api, bob, baseId, slotId, 'All'); + await expectTxFailure(/rmrkEquip\.PermissionError/, tx); + }); + + it('[negative] unable to set equippable list to a fixed part', async () => { + const fixedPartId = 42; + + const baseId = await createBase(api, alice, 'fixedpart-base-type', 'fixedpart', [ + { + 'FixedPart': { + id: fixedPartId, + z: 0, + src: 'fixed-part-url', + }, + }, + ]); + + const tx = setEquippableList(api, alice, baseId, fixedPartId, 'All'); + await expectTxFailure(/rmrkEquip\.NoEquippableOnFixedPart/, tx); + }); + + it('[negative] unable to set equippable list to non-existing slot', async () => { + const slotId = 777; + const maxSlotId = 0xFFFFFFFF; + + const baseId = await createBase(api, alice, 'slotpartany-base-type', 'slotpartany', [ + { + 'SlotPart': { + id: slotId, + equippable: 'All', + z: 1, + src: 'some-fallback-slot-url', + }, + }, + ]); + + const tx = setEquippableList(api, alice, baseId, maxSlotId, 'All'); + await expectTxFailure(/rmrkEquip\.PartDoesntExist/, tx); + }); + + after(async() => { await api.disconnect(); }); +}); --- a/tests/src/rmrk/setEquippableList.test.ts +++ /dev/null @@ -1,114 +0,0 @@ -import {getApiConnection} from '../substrate/substrate-api'; -import {expectTxFailure, requirePallets, Pallets} from './util/helpers'; -import {createCollection, createBase, setEquippableList} from './util/tx'; - -describe("integration test: set slot's Equippable List", () => { - let api: any; - before(async function () { - api = await getApiConnection(); - await requirePallets(this, [Pallets.RmrkCore]); - }); - - const alice = '//Alice'; - const bob = '//Bob'; - - it("set Base's slot Equippable List", async () => { - const collectionIds = [ - await createCollection( - api, - alice, - 'equiplist-collection-metadata', - null, - 'equiplist-0', - ), - await createCollection( - api, - alice, - 'equiplist-collection-metadata', - null, - 'equiplist-1', - ), - ]; - - const slotId = 202; - - const baseId = await createBase(api, alice, 'slotpartany-base-type', 'slotpartany', [ - { - 'SlotPart': { - id: slotId, - equippable: 'All', - z: 1, - src: 'some-fallback-slot-url', - }, - }, - ]); - - await setEquippableList(api, alice, baseId, slotId, 'All'); - await setEquippableList(api, alice, baseId, slotId, 'Empty'); - await setEquippableList(api, alice, baseId, slotId, {'Custom': collectionIds}); - }); - - it('[negative] unable to set equippable list of a slot of non-existing base', async () => { - const maxBaseId = 0xFFFFFFFF; - const slotId = 0; - - const tx = setEquippableList(api, alice, maxBaseId, slotId, 'All'); - await expectTxFailure(/rmrkEquip\.BaseDoesntExist/, tx); - }); - - it('[negative] unable to set equippable list by a not-an-owner', async () => { - const slotId = 42; - - const baseId = await createBase(api, alice, 'slotpartany-base-type', 'slotpartany', [ - { - 'SlotPart': { - id: slotId, - equippable: 'All', - z: 1, - src: 'some-fallback-slot-url', - }, - }, - ]); - - const tx = setEquippableList(api, bob, baseId, slotId, 'All'); - await expectTxFailure(/rmrkEquip\.PermissionError/, tx); - }); - - it('[negative] unable to set equippable list to a fixed part', async () => { - const fixedPartId = 42; - - const baseId = await createBase(api, alice, 'fixedpart-base-type', 'fixedpart', [ - { - 'FixedPart': { - id: fixedPartId, - z: 0, - src: 'fixed-part-url', - }, - }, - ]); - - const tx = setEquippableList(api, alice, baseId, fixedPartId, 'All'); - await expectTxFailure(/rmrkEquip\.NoEquippableOnFixedPart/, tx); - }); - - it('[negative] unable to set equippable list to non-existing slot', async () => { - const slotId = 777; - const maxSlotId = 0xFFFFFFFF; - - const baseId = await createBase(api, alice, 'slotpartany-base-type', 'slotpartany', [ - { - 'SlotPart': { - id: slotId, - equippable: 'All', - z: 1, - src: 'some-fallback-slot-url', - }, - }, - ]); - - const tx = setEquippableList(api, alice, baseId, maxSlotId, 'All'); - await expectTxFailure(/rmrkEquip\.PartDoesntExist/, tx); - }); - - after(async() => { await api.disconnect(); }); -}); --- /dev/null +++ b/tests/src/rmrk/setNftProperty.seqtest.ts @@ -0,0 +1,88 @@ +import {getApiConnection} from '../substrate/substrate-api'; +import {NftIdTuple} from './util/fetch'; +import {expectTxFailure, requirePallets, Pallets} from './util/helpers'; +import {createCollection, mintNft, sendNft, setNftProperty} from './util/tx'; + +describe('integration test: set NFT property', () => { + let api: any; + before(async function () { + api = await getApiConnection(); + await requirePallets(this, [Pallets.RmrkCore]); + }); + + const alice = '//Alice'; + const bob = '//Bob'; + + const createTestCollection = async (issuerUri: string) => { + return await createCollection( + api, + issuerUri, + 'setprop-nft-collection-metadata', + null, + 'setprop', + ); + }; + + it('set NFT property', async () => { + const ownerAlice = alice; + + const collectionId = await createTestCollection(alice); + const nftId = await mintNft(api, alice, ownerAlice, collectionId, 'prop-nft'); + + await setNftProperty(api, alice, collectionId, nftId, 'test-key', 'test-key-value'); + await setNftProperty(api, alice, collectionId, nftId, 'test-key', 'updated-key-value'); + await setNftProperty(api, alice, collectionId, nftId, 'second-test-key', 'second-test-key-value'); + }); + + it('[negative] unable to set a property of non-existing NFT', async () => { + const collectionId = 0; + const maxNftId = 0xFFFFFFFF; + + const tx = setNftProperty(api, alice, collectionId, maxNftId, 'test-key', 'test-value'); + + await expectTxFailure(/rmrkCore\.NoAvailableNftId/, tx); + }); + + it('[negative] unable to set a property by not-an-owner', async () => { + const ownerAlice = alice; + + const collectionId = await createTestCollection(alice); + const nftId = await mintNft(api, alice, ownerAlice, collectionId, 'prop-nft'); + + const tx = setNftProperty(api, bob, collectionId, nftId, 'test-key', 'test-key-value'); + + await expectTxFailure(/rmrkCore\.NoPermission/, tx); + }); + + it('set a property to nested NFT', async () => { + const ownerAlice = alice; + + const collectionId = await createTestCollection(alice); + const parentNftId = await mintNft(api, alice, ownerAlice, collectionId, 'prop-parent-nft'); + const childNftId = await mintNft(api, alice, ownerAlice, collectionId, 'prop-child-nft'); + + const ownerNft: NftIdTuple = [collectionId, parentNftId]; + + await sendNft(api, 'sent', ownerAlice, collectionId, childNftId, ownerNft); + + await setNftProperty(api, alice, collectionId, childNftId, 'test-key', 'test-key-value'); + }); + + it('[negative] set a property to nested NFT (by not-root-owner)', async () => { + const ownerAlice = alice; + + const collectionId = await createTestCollection(alice); + const parentNftId = await mintNft(api, alice, ownerAlice, collectionId, 'prop-parent-nft'); + const childNftId = await mintNft(api, alice, ownerAlice, collectionId, 'prop-child-nft'); + + const ownerNft: NftIdTuple = [collectionId, parentNftId]; + + await sendNft(api, 'sent', ownerAlice, collectionId, childNftId, ownerNft); + + const tx = setNftProperty(api, bob, collectionId, childNftId, 'test-key', 'test-key-value'); + + await expectTxFailure(/rmrkCore\.NoPermission/, tx); + }); + + after(async() => { await api.disconnect(); }); +}); --- a/tests/src/rmrk/setNftProperty.test.ts +++ /dev/null @@ -1,88 +0,0 @@ -import {getApiConnection} from '../substrate/substrate-api'; -import {NftIdTuple} from './util/fetch'; -import {expectTxFailure, requirePallets, Pallets} from './util/helpers'; -import {createCollection, mintNft, sendNft, setNftProperty} from './util/tx'; - -describe('integration test: set NFT property', () => { - let api: any; - before(async function () { - api = await getApiConnection(); - await requirePallets(this, [Pallets.RmrkCore]); - }); - - const alice = '//Alice'; - const bob = '//Bob'; - - const createTestCollection = async (issuerUri: string) => { - return await createCollection( - api, - issuerUri, - 'setprop-nft-collection-metadata', - null, - 'setprop', - ); - }; - - it('set NFT property', async () => { - const ownerAlice = alice; - - const collectionId = await createTestCollection(alice); - const nftId = await mintNft(api, alice, ownerAlice, collectionId, 'prop-nft'); - - await setNftProperty(api, alice, collectionId, nftId, 'test-key', 'test-key-value'); - await setNftProperty(api, alice, collectionId, nftId, 'test-key', 'updated-key-value'); - await setNftProperty(api, alice, collectionId, nftId, 'second-test-key', 'second-test-key-value'); - }); - - it('[negative] unable to set a property of non-existing NFT', async () => { - const collectionId = 0; - const maxNftId = 0xFFFFFFFF; - - const tx = setNftProperty(api, alice, collectionId, maxNftId, 'test-key', 'test-value'); - - await expectTxFailure(/rmrkCore\.NoAvailableNftId/, tx); - }); - - it('[negative] unable to set a property by not-an-owner', async () => { - const ownerAlice = alice; - - const collectionId = await createTestCollection(alice); - const nftId = await mintNft(api, alice, ownerAlice, collectionId, 'prop-nft'); - - const tx = setNftProperty(api, bob, collectionId, nftId, 'test-key', 'test-key-value'); - - await expectTxFailure(/rmrkCore\.NoPermission/, tx); - }); - - it('set a property to nested NFT', async () => { - const ownerAlice = alice; - - const collectionId = await createTestCollection(alice); - const parentNftId = await mintNft(api, alice, ownerAlice, collectionId, 'prop-parent-nft'); - const childNftId = await mintNft(api, alice, ownerAlice, collectionId, 'prop-child-nft'); - - const ownerNft: NftIdTuple = [collectionId, parentNftId]; - - await sendNft(api, 'sent', ownerAlice, collectionId, childNftId, ownerNft); - - await setNftProperty(api, alice, collectionId, childNftId, 'test-key', 'test-key-value'); - }); - - it('[negative] set a property to nested NFT (by not-root-owner)', async () => { - const ownerAlice = alice; - - const collectionId = await createTestCollection(alice); - const parentNftId = await mintNft(api, alice, ownerAlice, collectionId, 'prop-parent-nft'); - const childNftId = await mintNft(api, alice, ownerAlice, collectionId, 'prop-child-nft'); - - const ownerNft: NftIdTuple = [collectionId, parentNftId]; - - await sendNft(api, 'sent', ownerAlice, collectionId, childNftId, ownerNft); - - const tx = setNftProperty(api, bob, collectionId, childNftId, 'test-key', 'test-key-value'); - - await expectTxFailure(/rmrkCore\.NoPermission/, tx); - }); - - after(async() => { await api.disconnect(); }); -}); --- /dev/null +++ b/tests/src/rmrk/setResourcePriorities.seqtest.ts @@ -0,0 +1,56 @@ +import {getApiConnection} from '../substrate/substrate-api'; +import {expectTxFailure, requirePallets, Pallets} from './util/helpers'; +import {mintNft, createCollection, setResourcePriorities} from './util/tx'; + +describe('integration test: set NFT resource priorities', () => { + let api: any; + before(async function () { + api = await getApiConnection(); + await requirePallets(this, [Pallets.RmrkCore]); + }); + + const alice = '//Alice'; + const bob = '//Bob'; + + const createTestCollection = (issuerUri: string) => { + return createCollection( + api, + issuerUri, + 'resprio-collection-metadata', + null, + 'resprio', + ); + }; + + it('set NFT resource priorities', async () => { + const owner = alice; + + const collectionId = await createTestCollection(alice); + const nftId = await mintNft(api, alice, owner, collectionId, 'resprio-nft-metadata'); + + await setResourcePriorities(api, alice, collectionId, nftId, [10, 42]); + }); + + it('[negative] set NFT resource priorities by a not-an-owner', async () => { + const owner = alice; + const attacker = bob; + + const collectionId = await createTestCollection(alice); + const nftId = await mintNft(api, alice, owner, collectionId, 'resprio-nft-metadata'); + + const tx = setResourcePriorities(api, attacker, collectionId, nftId, [10, 42]); + + await expectTxFailure(/rmrkCore\.NoPermission/, tx); + }); + + it('[negative] set NFT resource priorities to non-existing NFT', async () => { + const collectionId = 0; + const maxNftId = 0xFFFFFFFF; + + const tx = setResourcePriorities(api, alice, collectionId, maxNftId, [10, 42]); + + await expectTxFailure(/rmrkCore\.NoAvailableNftId/, tx); + }); + + after(async() => { await api.disconnect(); }); +}); --- a/tests/src/rmrk/setResourcePriorities.test.ts +++ /dev/null @@ -1,58 +0,0 @@ -import {getApiConnection} from '../substrate/substrate-api'; -import {expectTxFailure, requirePallets, Pallets} from './util/helpers'; -import {mintNft, createCollection, setResourcePriorities} from './util/tx'; - -describe('integration test: set NFT resource priorities', () => { - let api: any; - before(async function () { - api = await getApiConnection(); - await requirePallets(this, [Pallets.RmrkCore]); - }); - - const alice = '//Alice'; - const bob = '//Bob'; - - const createTestCollection = (issuerUri: string) => { - return createCollection( - api, - issuerUri, - 'resprio-collection-metadata', - null, - 'resprio', - ); - }; - - it('set NFT resource priorities', async () => { - const owner = alice; - - const collectionId = await createTestCollection(alice); - const nftId = await mintNft(api, alice, owner, collectionId, 'resprio-nft-metadata'); - - await setResourcePriorities(api, alice, collectionId, nftId, [10, 42]); - }); - - it('[negative] set NFT resource priorities by a not-an-owner', async () => { - const owner = alice; - const attacker = bob; - - const collectionId = await createTestCollection(alice); - const nftId = await mintNft(api, alice, owner, collectionId, 'resprio-nft-metadata'); - - const tx = setResourcePriorities(api, attacker, collectionId, nftId, [10, 42]); - - await expectTxFailure(/rmrkCore\.NoPermission/, tx); - }); - - it('[negative] set NFT resource priorities to non-existing NFT', async () => { - const owner = alice; - - const collectionId = 0; - const maxNftId = 0xFFFFFFFF; - - const tx = setResourcePriorities(api, alice, collectionId, maxNftId, [10, 42]); - - await expectTxFailure(/rmrkCore\.NoAvailableNftId/, tx); - }); - - after(async() => { await api.disconnect(); }); -}); --- a/tests/src/rmrk/util/fetch.ts +++ b/tests/src/rmrk/util/fetch.ts @@ -1,5 +1,5 @@ import {ApiPromise} from '@polkadot/api'; -import type {Option, Bytes} from '@polkadot/types-codec'; +import type {Option} from '@polkadot/types-codec'; import type { RmrkTraitsCollectionCollectionInfo as Collection, RmrkTraitsNftNftInfo as Nft, --- a/tests/src/rmrk/util/helpers.ts +++ b/tests/src/rmrk/util/helpers.ts @@ -149,7 +149,7 @@ export function isTxResultSuccess(events: EventRecord[]): boolean { let success = false; - events.forEach(({event: {data, method, section}}) => { + events.forEach(({event: {method}}) => { if (method == 'ExtrinsicSuccess') { success = true; } --- a/tests/src/rpc.test.ts +++ b/tests/src/rpc.test.ts @@ -15,7 +15,7 @@ // along with Unique Network. If not, see . import {IKeyringPair} from '@polkadot/types/types'; -import {usingPlaygrounds, itSub, expect} from './util/playgrounds'; +import {usingPlaygrounds, itSub, expect} from './util'; import {CrossAccountId} from './util/playgrounds/unique'; describe('integration test: RPC methods', () => { @@ -25,7 +25,7 @@ before(async () => { await usingPlaygrounds(async (helper, privateKey) => { - donor = privateKey('//Alice'); + donor = await privateKey({filename: __filename}); [alice, bob] = await helper.arrange.createAccounts([20n, 10n], donor); }); }); --- a/tests/src/setCollectionLimits.test.ts +++ b/tests/src/setCollectionLimits.test.ts @@ -16,7 +16,7 @@ // https://unique-network.readthedocs.io/en/latest/jsapi.html#setchainlimits import {IKeyringPair} from '@polkadot/types/types'; -import {itSub, usingPlaygrounds, expect} from './util/playgrounds'; +import {itSub, usingPlaygrounds, expect} from './util'; const accountTokenOwnershipLimit = 0; const sponsoredDataSize = 0; @@ -29,7 +29,7 @@ before(async () => { await usingPlaygrounds(async (helper, privateKey) => { - const donor = privateKey('//Alice'); + const donor = await privateKey({filename: __filename}); [alice, bob] = await helper.arrange.createAccounts([20n, 10n], donor); }); }); @@ -104,7 +104,7 @@ before(async () => { await usingPlaygrounds(async (helper, privateKey) => { - const donor = privateKey('//Alice'); + const donor = await privateKey({filename: __filename}); [alice, bob] = await helper.arrange.createAccounts([20n, 10n], donor); }); }); --- a/tests/src/setCollectionSponsor.test.ts +++ b/tests/src/setCollectionSponsor.test.ts @@ -15,7 +15,7 @@ // along with Unique Network. If not, see . import {IKeyringPair} from '@polkadot/types/types'; -import {itSub, usingPlaygrounds, expect, Pallets} from './util/playgrounds'; +import {itSub, usingPlaygrounds, expect, Pallets} from './util'; describe('integration test: ext. setCollectionSponsor():', () => { let alice: IKeyringPair; @@ -24,7 +24,7 @@ before(async () => { await usingPlaygrounds(async (helper, privateKey) => { - const donor = privateKey('//Alice'); + const donor = await privateKey({filename: __filename}); [alice, bob, charlie] = await helper.arrange.createAccounts([20n, 10n, 10n], donor); }); }); @@ -93,7 +93,7 @@ before(async () => { await usingPlaygrounds(async (helper, privateKey) => { - const donor = privateKey('//Alice'); + const donor = await privateKey({filename: __filename}); [alice, bob] = await helper.arrange.createAccounts([10n, 5n], donor); }); }); --- a/tests/src/setPermissions.test.ts +++ b/tests/src/setPermissions.test.ts @@ -15,7 +15,7 @@ // along with Unique Network. If not, see . import {IKeyringPair} from '@polkadot/types/types'; -import {itSub, usingPlaygrounds, expect} from './util/playgrounds'; +import {itSub, usingPlaygrounds, expect} from './util'; describe('Integration Test: Set Permissions', () => { let alice: IKeyringPair; @@ -23,7 +23,7 @@ before(async () => { await usingPlaygrounds(async (helper, privateKey) => { - const donor = privateKey('//Alice'); + const donor = await privateKey({filename: __filename}); [alice, bob] = await helper.arrange.createAccounts([10n, 10n], donor); }); }); @@ -79,7 +79,7 @@ before(async () => { await usingPlaygrounds(async (helper, privateKey) => { - const donor = privateKey('//Alice'); + const donor = await privateKey({filename: __filename}); [alice, bob] = await helper.arrange.createAccounts([10n, 10n], donor); }); }); --- a/tests/src/transfer.test.ts +++ b/tests/src/transfer.test.ts @@ -15,16 +15,17 @@ // along with Unique Network. If not, see . import {IKeyringPair} from '@polkadot/types/types'; -import {itEth, usingEthPlaygrounds} from './eth/util/playgrounds'; -import {itSub, Pallets, usingPlaygrounds, expect} from './util/playgrounds'; +import {itEth, usingEthPlaygrounds} from './eth/util'; +import {itSub, Pallets, usingPlaygrounds, expect} from './util'; describe('Integration Test Transfer(recipient, collection_id, item_id, value)', () => { + let donor: IKeyringPair; let alice: IKeyringPair; let bob: IKeyringPair; before(async () => { await usingPlaygrounds(async (helper, privateKey) => { - const donor = privateKey('//Alice'); + donor = await privateKey({filename: __filename}); [alice, bob] = await helper.arrange.createAccounts([50n, 10n], donor); }); }); @@ -42,8 +43,7 @@ expect(bobsBalanceAfter > bobsBalanceBefore).to.be.true; }); - itSub('Inability to pay fees error message is correct', async ({helper, privateKey}) => { - const donor = privateKey('//Alice'); + itSub('Inability to pay fees error message is correct', async ({helper}) => { const [zero] = await helper.arrange.createAccounts([0n], donor); // console.error = () => {}; @@ -117,7 +117,7 @@ before(async () => { await usingPlaygrounds(async (helper, privateKey) => { - const donor = privateKey('//Alice'); + const donor = await privateKey({filename: __filename}); [alice, bob] = await helper.arrange.createAccounts([50n, 10n], donor); }); }); @@ -256,7 +256,7 @@ before(async function() { await usingEthPlaygrounds(async (_, privateKey) => { - donor = privateKey('//Alice'); + donor = await privateKey({filename: __filename}); }); }); --- a/tests/src/transferFrom.test.ts +++ b/tests/src/transferFrom.test.ts @@ -15,7 +15,7 @@ // along with Unique Network. If not, see . import {IKeyringPair} from '@polkadot/types/types'; -import {itSub, Pallets, usingPlaygrounds, expect} from './util/playgrounds'; +import {itSub, Pallets, usingPlaygrounds, expect} from './util'; describe('Integration Test transferFrom(from, recipient, collection_id, item_id, value):', () => { let alice: IKeyringPair; @@ -24,7 +24,7 @@ before(async () => { await usingPlaygrounds(async (helper, privateKey) => { - const donor = privateKey('//Alice'); + const donor = await privateKey({filename: __filename}); [alice, bob, charlie] = await helper.arrange.createAccounts([20n, 10n, 10n], donor); }); }); @@ -91,7 +91,7 @@ before(async () => { await usingPlaygrounds(async (helper, privateKey) => { - const donor = privateKey('//Alice'); + const donor = await privateKey({filename: __filename}); [alice, bob, charlie] = await helper.arrange.createAccounts([50n, 10n, 10n], donor); }); }); --- a/tests/src/tx-version-presence.test.ts +++ b/tests/src/tx-version-presence.test.ts @@ -15,7 +15,7 @@ // along with Unique Network. If not, see . import {Metadata} from '@polkadot/types'; -import {itSub, usingPlaygrounds, expect} from './util/playgrounds'; +import {itSub, usingPlaygrounds, expect} from './util'; let metadata: Metadata; --- /dev/null +++ b/tests/src/util/globalSetup.ts @@ -0,0 +1,104 @@ +// Copyright 2019-2022 Unique Network (Gibraltar) Ltd. +// SPDX-License-Identifier: Apache-2.0 + +import {usingPlaygrounds, Pallets, DONOR_FUNDING, MINIMUM_DONOR_FUND} from './index'; +import * as path from 'path'; +import {promises as fs} from 'fs'; + +// This function should be called before running test suites. +const globalSetup = async (): Promise => { + await usingPlaygrounds(async (helper, privateKey) => { + try { + // 1. Create donors for test files + await fundFilenamesWithRetries(3) + .then((result) => { + if (!result) Promise.reject(); + }); + + // 2. Set up App Promotion admin + const missingPallets = helper.fetchMissingPalletNames([Pallets.AppPromotion]); + if (missingPallets.length === 0) { + const superuser = await privateKey('//Alice'); + const palletAddress = helper.arrange.calculatePalletAddress('appstake'); + const palletAdmin = await privateKey('//PromotionAdmin'); + const api = helper.getApi(); + await helper.signTransaction(superuser, api.tx.sudo.sudo(api.tx.appPromotion.setAdminAddress({Substrate: palletAdmin.address}))); + const nominal = helper.balance.getOneTokenNominal(); + await helper.balance.transferToSubstrate(superuser, palletAdmin.address, 1000n * nominal); + await helper.balance.transferToSubstrate(superuser, palletAddress, 1000n * nominal); + } + } catch (error) { + console.error(error); + Promise.reject(); + } + }); +}; + +async function getFiles(rootPath: string): Promise { + const files = await fs.readdir(rootPath, {withFileTypes: true}); + const filenames: string[] = []; + for (const entry of files) { + const res = path.resolve(rootPath, entry.name); + if (entry.isDirectory()) { + filenames.push(...await getFiles(res)); + } else { + filenames.push(res); + } + } + return filenames; +} + +const fundFilenames = async () => { + await usingPlaygrounds(async (helper, privateKey) => { + const oneToken = helper.balance.getOneTokenNominal(); + const alice = await privateKey('//Alice'); + const nonce = await helper.chain.getNonce(alice.address); + const filenames = await getFiles(path.resolve(__dirname, '..')); + + // batching is actually undesireable, it takes away the time while all the transactions actually succeed + const batchSize = 300; + let balanceGrantedCounter = 0; + for (let b = 0; b < filenames.length; b += batchSize) { + const tx = []; + let batchBalanceGrantedCounter = 0; + for (let i = 0; batchBalanceGrantedCounter < batchSize && b + i < filenames.length; i++) { + const f = filenames[b + i]; + if (!f.endsWith('.test.ts') && !f.endsWith('seqtest.ts') || f.includes('.outdated')) continue; + const account = await privateKey({filename: f, ignoreFundsPresence: true}); + const aliceBalance = await helper.balance.getSubstrate(account.address); + + if (aliceBalance < MINIMUM_DONOR_FUND * oneToken) { + tx.push(helper.executeExtrinsic( + alice, + 'api.tx.balances.transfer', + [account.address, DONOR_FUNDING * oneToken], + true, + {nonce: nonce + balanceGrantedCounter++}, + ).then(() => true).catch(() => {console.error(`Transaction to ${path.basename(f)} registered as failed. Strange.`); return false;})); + batchBalanceGrantedCounter++; + } + } + + if(tx.length > 0) { + console.log(`Granting funds to ${batchBalanceGrantedCounter} filename accounts.`); + const result = await Promise.all(tx); + if (result && result.lastIndexOf(false) > -1) throw new Error('The transactions actually probably succeeded, should check the balances.'); + } + } + + if (balanceGrantedCounter == 0) console.log('No account needs additional funding.'); + }); +}; + +const fundFilenamesWithRetries = async (retriesLeft: number): Promise => { + if (retriesLeft <= 0) return Promise.resolve(false); + return fundFilenames() + .then(() => Promise.resolve(true)) + .catch(e => { + console.error(e); + console.error(`Some transactions might have failed. ${retriesLeft > 1 ? 'Retrying...' : 'Something is wrong.'}\n`); + return fundFilenamesWithRetries(--retriesLeft); + }); +}; + +globalSetup().catch(() => process.exit(1)); --- /dev/null +++ b/tests/src/util/index.ts @@ -0,0 +1,138 @@ +// Copyright 2019-2022 Unique Network (Gibraltar) Ltd. +// SPDX-License-Identifier: Apache-2.0 + +import * as path from 'path'; +import * as crypto from 'crypto'; +import {IKeyringPair} from '@polkadot/types/types'; +import chai from 'chai'; +import chaiAsPromised from 'chai-as-promised'; +import {Context} from 'mocha'; +import config from '../config'; +import {ChainHelperBase} from './playgrounds/unique'; +import {ILogger} from './playgrounds/types'; +import {DevUniqueHelper, SilentLogger, SilentConsole, DevMoonbeamHelper, DevMoonriverHelper, DevAcalaHelper, DevKaruraHelper, DevRelayHelper, DevWestmintHelper} from './playgrounds/unique.dev'; + +chai.use(chaiAsPromised); +export const expect = chai.expect; + +const getTestHash = (filename: string) => { + return crypto.createHash('md5').update(filename).digest('hex'); +}; + +export const getTestSeed = (filename: string) => { + return `//Alice+${getTestHash(filename)}`; +}; + +async function usingPlaygroundsGeneral(helperType: new(logger: ILogger) => T, url: string, code: (helper: T, privateKey: (seed: string | {filename: string, ignoreFundsPresence?: boolean}) => Promise) => Promise) { + const silentConsole = new SilentConsole(); + silentConsole.enable(); + + const helper = new helperType(new SilentLogger()); + + try { + await helper.connect(url); + const ss58Format = helper.chain.getChainProperties().ss58Format; + const privateKey = async (seed: string | {filename: string, ignoreFundsPresence?: boolean}) => { + if (typeof seed === 'string') { + return helper.util.fromSeed(seed, ss58Format); + } + else { + const actualSeed = getTestSeed(seed.filename); + let account = helper.util.fromSeed(actualSeed, ss58Format); + // here's to hoping that no + if (!seed.ignoreFundsPresence && ((helper as any)['balance'] == undefined || await (helper as any).balance.getSubstrate(account.address) < MINIMUM_DONOR_FUND)) { + console.warn(`${path.basename(seed.filename)}: Not enough funds present on the filename account. Using the default one as the donor instead.`); + account = helper.util.fromSeed('//Alice', ss58Format); + } + return account; + } + }; + await code(helper, privateKey); + } + finally { + await helper.disconnect(); + silentConsole.disable(); + } +} + +export const usingPlaygrounds = (code: (helper: DevUniqueHelper, privateKey: (seed: string | {filename: string, ignoreFundsPresence?: boolean}) => Promise) => Promise, url: string = config.substrateUrl) => { + return usingPlaygroundsGeneral(DevUniqueHelper, url, code); +}; + +export const usingWestmintPlaygrounds = async (url: string, code: (helper: DevWestmintHelper, privateKey: (seed: string) => Promise) => Promise) => { + return usingPlaygroundsGeneral(DevWestmintHelper, url, code); +}; + +export const usingRelayPlaygrounds = async (url: string, code: (helper: DevRelayHelper, privateKey: (seed: string) => Promise) => Promise) => { + return usingPlaygroundsGeneral(DevRelayHelper, url, code); +}; + +export const usingAcalaPlaygrounds = async (url: string, code: (helper: DevAcalaHelper, privateKey: (seed: string) => Promise) => Promise) => { + return usingPlaygroundsGeneral(DevAcalaHelper, url, code); +}; + +export const usingKaruraPlaygrounds = async (url: string, code: (helper: DevKaruraHelper, privateKey: (seed: string) => Promise) => Promise) => { + return usingPlaygroundsGeneral(DevAcalaHelper, url, code); +}; + +export const usingMoonbeamPlaygrounds = async (url: string, code: (helper: DevMoonbeamHelper, privateKey: (seed: string) => Promise) => Promise) => { + return usingPlaygroundsGeneral(DevMoonbeamHelper, url, code); +}; + +export const usingMoonriverPlaygrounds = async (url: string, code: (helper: DevMoonbeamHelper, privateKey: (seed: string) => Promise) => Promise) => { + return usingPlaygroundsGeneral(DevMoonriverHelper, url, code); +}; + +export const MINIMUM_DONOR_FUND = 100_000n; +export const DONOR_FUNDING = 1_000_000n; + +export enum Pallets { + Inflation = 'inflation', + RmrkCore = 'rmrkcore', + RmrkEquip = 'rmrkequip', + ReFungible = 'refungible', + Fungible = 'fungible', + NFT = 'nonfungible', + Scheduler = 'scheduler', + AppPromotion = 'apppromotion', +} + +export function requirePalletsOrSkip(test: Context, helper: DevUniqueHelper, requiredPallets: string[]) { + const missingPallets = helper.fetchMissingPalletNames(requiredPallets); + + if (missingPallets.length > 0) { + const skipMsg = `\tSkipping test '${test.test?.title}'.\n\tThe following pallets are missing:\n\t- ${missingPallets.join('\n\t- ')}`; + console.warn('\x1b[38:5:208m%s\x1b[0m', skipMsg); + test.skip(); + } +} + +export async function itSub(name: string, cb: (apis: { helper: DevUniqueHelper, privateKey: (seed: string) => Promise }) => any, opts: { only?: boolean, skip?: boolean, requiredPallets?: string[] } = {}) { + (opts.only ? it.only : + opts.skip ? it.skip : it)(name, async function () { + await usingPlaygrounds(async (helper, privateKey) => { + if (opts.requiredPallets) { + requirePalletsOrSkip(this, helper, opts.requiredPallets); + } + + await cb({helper, privateKey}); + }); + }); +} +export async function itSubIfWithPallet(name: string, required: string[], cb: (apis: { helper: DevUniqueHelper, privateKey: (seed: string) => Promise }) => any, opts: { only?: boolean, skip?: boolean, requiredPallets?: string[] } = {}) { + return itSub(name, cb, {requiredPallets: required, ...opts}); +} +itSub.only = (name: string, cb: (apis: { helper: DevUniqueHelper, privateKey: (seed: string) => Promise }) => any) => itSub(name, cb, {only: true}); +itSub.skip = (name: string, cb: (apis: { helper: DevUniqueHelper, privateKey: (seed: string) => Promise }) => any) => itSub(name, cb, {skip: true}); + +itSubIfWithPallet.only = (name: string, required: string[], cb: (apis: { helper: DevUniqueHelper, privateKey: (seed: string) => Promise }) => any) => itSubIfWithPallet(name, required, cb, {only: true}); +itSubIfWithPallet.skip = (name: string, required: string[], cb: (apis: { helper: DevUniqueHelper, privateKey: (seed: string) => Promise }) => any) => itSubIfWithPallet(name, required, cb, {skip: true}); +itSub.ifWithPallets = itSubIfWithPallet; + +export async function describeXCM(title: string, fn: (this: Mocha.Suite) => void, opts: {skip?: boolean} = {}) { + (process.env.RUN_XCM_TESTS && !opts.skip + ? describe + : describe.skip)(title, fn); +} + +describeXCM.skip = (name: string, fn: (this: Mocha.Suite) => void) => describeXCM(name, fn, {skip: true}); --- a/tests/src/util/playgrounds/index.ts +++ /dev/null @@ -1,110 +0,0 @@ -// Copyright 2019-2022 Unique Network (Gibraltar) Ltd. -// SPDX-License-Identifier: Apache-2.0 - -import {IKeyringPair} from '@polkadot/types/types'; -import chai from 'chai'; -import chaiAsPromised from 'chai-as-promised'; -import {Context} from 'mocha'; -import config from '../../config'; -import '../../interfaces/augment-api-events'; -import {ChainHelperBase} from './unique'; -import {ILogger} from './types'; -import {DevUniqueHelper, SilentLogger, SilentConsole, DevMoonbeamHelper, DevMoonriverHelper, DevAcalaHelper, DevKaruraHelper, DevRelayHelper, DevWestmintHelper} from './unique.dev'; - -chai.use(chaiAsPromised); -export const expect = chai.expect; - -async function usingPlaygroundsGeneral(helperType: new(logger: ILogger) => T, url: string, code: (helper: T, privateKey: (seed: string) => IKeyringPair) => Promise) { - const silentConsole = new SilentConsole(); - silentConsole.enable(); - - const helper = new helperType(new SilentLogger()); - - try { - await helper.connect(url); - const ss58Format = helper.chain.getChainProperties().ss58Format; - const privateKey = (seed: string) => helper.util.fromSeed(seed, ss58Format); - await code(helper, privateKey); - } - finally { - await helper.disconnect(); - silentConsole.disable(); - } -} - -export const usingPlaygrounds = (code: (helper: DevUniqueHelper, privateKey: (seed: string) => IKeyringPair) => Promise, url: string = config.substrateUrl) => { - return usingPlaygroundsGeneral(DevUniqueHelper, url, code); -}; - -export const usingWestmintPlaygrounds = async (url: string, code: (helper: DevWestmintHelper, privateKey: (seed: string) => IKeyringPair) => Promise) => { - return usingPlaygroundsGeneral(DevWestmintHelper, url, code); -}; - -export const usingRelayPlaygrounds = async (url: string, code: (helper: DevRelayHelper, privateKey: (seed: string) => IKeyringPair) => Promise) => { - return usingPlaygroundsGeneral(DevRelayHelper, url, code); -}; - -export const usingAcalaPlaygrounds = async (url: string, code: (helper: DevAcalaHelper, privateKey: (seed: string) => IKeyringPair) => Promise) => { - return usingPlaygroundsGeneral(DevAcalaHelper, url, code); -}; - -export const usingKaruraPlaygrounds = async (url: string, code: (helper: DevKaruraHelper, privateKey: (seed: string) => IKeyringPair) => Promise) => { - return usingPlaygroundsGeneral(DevAcalaHelper, url, code); -}; - -export const usingMoonbeamPlaygrounds = async (url: string, code: (helper: DevMoonbeamHelper, privateKey: (seed: string) => IKeyringPair) => Promise) => { - return usingPlaygroundsGeneral(DevMoonbeamHelper, url, code); -}; - -export const usingMoonriverPlaygrounds = async (url: string, code: (helper: DevMoonbeamHelper, privateKey: (seed: string) => IKeyringPair) => Promise) => { - return usingPlaygroundsGeneral(DevMoonriverHelper, url, code); -}; - -export enum Pallets { - Inflation = 'inflation', - RmrkCore = 'rmrkcore', - RmrkEquip = 'rmrkequip', - ReFungible = 'refungible', - Fungible = 'fungible', - NFT = 'nonfungible', - Scheduler = 'scheduler', - AppPromotion = 'apppromotion', -} - -export function requirePalletsOrSkip(test: Context, helper: DevUniqueHelper, requiredPallets: string[]) { - const missingPallets = helper.fetchMissingPalletNames(requiredPallets); - - if (missingPallets.length > 0) { - const skipMsg = `\tSkipping test '${test.test?.title}'.\n\tThe following pallets are missing:\n\t- ${missingPallets.join('\n\t- ')}`; - console.warn('\x1b[38:5:208m%s\x1b[0m', skipMsg); - test.skip(); - } -} - -export async function itSub(name: string, cb: (apis: { helper: DevUniqueHelper, privateKey: (seed: string) => IKeyringPair }) => any, opts: { only?: boolean, skip?: boolean, requiredPallets?: string[] } = {}) { - (opts.only ? it.only : - opts.skip ? it.skip : it)(name, async function () { - await usingPlaygrounds(async (helper, privateKey) => { - if (opts.requiredPallets) { - requirePalletsOrSkip(this, helper, opts.requiredPallets); - } - - await cb({helper, privateKey}); - }); - }); -} -export async function itSubIfWithPallet(name: string, required: string[], cb: (apis: { helper: DevUniqueHelper, privateKey: (seed: string) => IKeyringPair }) => any, opts: { only?: boolean, skip?: boolean, requiredPallets?: string[] } = {}) { - return itSub(name, cb, {requiredPallets: required, ...opts}); -} -itSub.only = (name: string, cb: (apis: { helper: DevUniqueHelper, privateKey: (seed: string) => IKeyringPair }) => any) => itSub(name, cb, {only: true}); -itSub.skip = (name: string, cb: (apis: { helper: DevUniqueHelper, privateKey: (seed: string) => IKeyringPair }) => any) => itSub(name, cb, {skip: true}); - -itSubIfWithPallet.only = (name: string, required: string[], cb: (apis: { helper: DevUniqueHelper, privateKey: (seed: string) => IKeyringPair }) => any) => itSubIfWithPallet(name, required, cb, {only: true}); -itSubIfWithPallet.skip = (name: string, required: string[], cb: (apis: { helper: DevUniqueHelper, privateKey: (seed: string) => IKeyringPair }) => any) => itSubIfWithPallet(name, required, cb, {skip: true}); -itSub.ifWithPallets = itSubIfWithPallet; - -export async function describeXcm(name: string, cb: () => any) { - ( - process.env.RUN_XCM_TESTS ? describe : describe.skip - )(name, cb); -} --- a/tests/src/util/playgrounds/unique.dev.ts +++ b/tests/src/util/playgrounds/unique.dev.ts @@ -1,7 +1,8 @@ // Copyright 2019-2022 Unique Network (Gibraltar) Ltd. // SPDX-License-Identifier: Apache-2.0 -import {mnemonicGenerate} from '@polkadot/util-crypto'; +import {stringToU8a} from '@polkadot/util'; +import {encodeAddress, mnemonicGenerate} from '@polkadot/util-crypto'; import {UniqueHelper, MoonbeamHelper, ChainHelperBase, AcalaHelper, RelayHelper, WestmintHelper} from './unique'; import {ApiPromise, Keyring, WsProvider} from '@polkadot/api'; import * as defs from '../../interfaces/definitions'; @@ -197,8 +198,9 @@ }; let accountsCreated = false; - // checkBalances retry up to 5 blocks - for (let index = 0; index < 5; index++) { + const maxBlocksChecked = await this.helper.arrange.isDevNode() ? 50 : 5; + // checkBalances retry up to 5-50 blocks + for (let index = 0; index < maxBlocksChecked; index++) { accountsCreated = await checkBalances(); if(accountsCreated) break; await wait.newBlocks(1); @@ -258,8 +260,13 @@ }; isDevNode = async () => { - const block1 = await this.helper.callRpc('api.rpc.chain.getBlock', [await this.helper.callRpc('api.rpc.chain.getBlockHash', [1])]); - const block2 = await this.helper.callRpc('api.rpc.chain.getBlock', [await this.helper.callRpc('api.rpc.chain.getBlockHash', [2])]); + let blockNumber = (await this.helper.callRpc('api.query.system.number')).toJSON(); + if (blockNumber == 0) { + await this.helper.wait.newBlocks(1); + blockNumber = (await this.helper.callRpc('api.query.system.number')).toJSON(); + } + const block2 = await this.helper.callRpc('api.rpc.chain.getBlock', [await this.helper.callRpc('api.rpc.chain.getBlockHash', [blockNumber])]); + const block1 = await this.helper.callRpc('api.rpc.chain.getBlock', [await this.helper.callRpc('api.rpc.chain.getBlockHash', [blockNumber - 1])]); const findCreationDate = async (block: any) => { const humanBlock = block.toHuman(); let date; @@ -285,6 +292,11 @@ return balance; } + + calculatePalletAddress(palletId: any) { + const address = stringToU8a(('modl' + palletId).padEnd(32, '\0')); + return encodeAddress(address); + } } class MoonbeamAccountGroup { --- a/tests/src/util/playgrounds/unique.ts +++ b/tests/src/util/playgrounds/unique.ts @@ -295,12 +295,12 @@ return data.toHuman(); } - public static extractEvents(records: ITransactionResult): IEvent[] { + public static extractEvents(events: {event: any, phase: any}[]): IEvent[] { const parsedEvents: IEvent[] = []; - records.result.events.forEach((record) => { + events.forEach((record) => { const {event, phase} = record; - const types = (event as any).typeDef; + const types = event.typeDef; const eventData: IEvent = { section: event.section.toString(), @@ -550,7 +550,7 @@ let events: IEvent[] = []; try { result = await this.signTransaction(sender, this.constructApiCall(extrinsic, params), options, extrinsic) as ITransactionResult; - events = this.eventHelper.extractEvents(result); + events = this.eventHelper.extractEvents(result.result.events); } catch(e) { if(!(e as object).hasOwnProperty('status')) throw e; --- a/tests/src/xcm/xcmOpal.test.ts +++ b/tests/src/xcm/xcmOpal.test.ts @@ -16,7 +16,7 @@ import {IKeyringPair} from '@polkadot/types/types'; import config from '../config'; -import {itSub, expect, describeXcm, usingPlaygrounds, usingWestmintPlaygrounds, usingRelayPlaygrounds} from '../util/playgrounds'; +import {itSub, expect, describeXCM, usingPlaygrounds, usingWestmintPlaygrounds, usingRelayPlaygrounds} from '../util'; const STATEMINE_CHAIN = 1000; const UNIQUE_CHAIN = 2095; @@ -38,7 +38,7 @@ // 10,000.00 (ten thousands) USDT const ASSET_AMOUNT = 1_000_000_000_000_000_000_000n; -describeXcm('[XCM] Integration test: Exchanging USDT with Westmint', () => { +describeXCM('[XCM] Integration test: Exchanging USDT with Westmint', () => { let alice: IKeyringPair; let bob: IKeyringPair; @@ -59,8 +59,8 @@ before(async () => { await usingPlaygrounds(async (_helper, privateKey) => { - alice = privateKey('//Alice'); - bob = privateKey('//Bob'); // funds donor + alice = await privateKey('//Alice'); + bob = await privateKey('//Bob'); // funds donor }); await usingWestmintPlaygrounds(westmintUrl, async (helper) => { --- a/tests/src/xcm/xcmQuartz.test.ts +++ b/tests/src/xcm/xcmQuartz.test.ts @@ -18,7 +18,7 @@ import {blake2AsHex} from '@polkadot/util-crypto'; import config from '../config'; import {XcmV2TraitsOutcome, XcmV2TraitsError} from '../interfaces'; -import {itSub, expect, describeXcm, usingPlaygrounds, usingKaruraPlaygrounds, usingRelayPlaygrounds, usingMoonriverPlaygrounds} from '../util/playgrounds'; +import {itSub, expect, describeXCM, usingPlaygrounds, usingKaruraPlaygrounds, usingRelayPlaygrounds, usingMoonriverPlaygrounds} from '../util'; const QUARTZ_CHAIN = 2095; const KARURA_CHAIN = 2000; @@ -32,7 +32,7 @@ const TRANSFER_AMOUNT = 2000000000000000000000000n; -describeXcm('[XCM] Integration test: Exchanging tokens with Karura', () => { +describeXCM('[XCM] Integration test: Exchanging tokens with Karura', () => { let alice: IKeyringPair; let randomAccount: IKeyringPair; @@ -48,7 +48,7 @@ before(async () => { await usingPlaygrounds(async (helper, privateKey) => { - alice = privateKey('//Alice'); + alice = await privateKey('//Alice'); [randomAccount] = await helper.arrange.createAccounts([0n], alice); }); @@ -207,12 +207,12 @@ }); // These tests are relevant only when the foreign asset pallet is disabled -describeXcm('[XCM] Integration test: Quartz rejects non-native tokens', () => { +describeXCM('[XCM] Integration test: Quartz rejects non-native tokens', () => { let alice: IKeyringPair; before(async () => { await usingPlaygrounds(async (_helper, privateKey) => { - alice = privateKey('//Alice'); + alice = await privateKey('//Alice'); }); }); @@ -331,9 +331,8 @@ ).to.be.true; }); }); - -describeXcm('[XCM] Integration test: Exchanging QTZ with Moonriver', () => { +describeXCM('[XCM] Integration test: Exchanging QTZ with Moonriver', () => { // Quartz constants let quartzDonor: IKeyringPair; let quartzAssetLocation; @@ -369,7 +368,7 @@ before(async () => { await usingPlaygrounds(async (helper, privateKey) => { - quartzDonor = privateKey('//Alice'); + quartzDonor = await privateKey('//Alice'); [randomAccountQuartz] = await helper.arrange.createAccounts([0n], quartzDonor); balanceForeignQtzTokenInit = 0n; --- a/tests/src/xcm/xcmUnique.test.ts +++ b/tests/src/xcm/xcmUnique.test.ts @@ -18,7 +18,7 @@ import {blake2AsHex} from '@polkadot/util-crypto'; import config from '../config'; import {XcmV2TraitsError, XcmV2TraitsOutcome} from '../interfaces'; -import {itSub, expect, describeXcm, usingPlaygrounds, usingAcalaPlaygrounds, usingRelayPlaygrounds, usingMoonbeamPlaygrounds} from '../util/playgrounds'; +import {itSub, expect, describeXCM, usingPlaygrounds, usingAcalaPlaygrounds, usingRelayPlaygrounds, usingMoonbeamPlaygrounds} from '../util'; const UNIQUE_CHAIN = 2037; const ACALA_CHAIN = 2000; @@ -32,7 +32,7 @@ const TRANSFER_AMOUNT = 2000000000000000000000000n; -describeXcm('[XCM] Integration test: Exchanging tokens with Acala', () => { +describeXCM('[XCM] Integration test: Exchanging tokens with Acala', () => { let alice: IKeyringPair; let randomAccount: IKeyringPair; @@ -48,7 +48,7 @@ before(async () => { await usingPlaygrounds(async (helper, privateKey) => { - alice = privateKey('//Alice'); + alice = await privateKey('//Alice'); [randomAccount] = await helper.arrange.createAccounts([0n], alice); }); @@ -211,12 +211,12 @@ }); // These tests are relevant only when the foreign asset pallet is disabled -describeXcm('[XCM] Integration test: Unique rejects non-native tokens', () => { +describeXCM('[XCM] Integration test: Unique rejects non-native tokens', () => { let alice: IKeyringPair; before(async () => { await usingPlaygrounds(async (_helper, privateKey) => { - alice = privateKey('//Alice'); + alice = await privateKey('//Alice'); }); }); @@ -335,9 +335,8 @@ ).to.be.true; }); }); - -describeXcm('[XCM] Integration test: Exchanging UNQ with Moonbeam', () => { +describeXCM('[XCM] Integration test: Exchanging UNQ with Moonbeam', () => { // Unique constants let uniqueDonor: IKeyringPair; let uniqueAssetLocation; @@ -373,7 +372,7 @@ before(async () => { await usingPlaygrounds(async (helper, privateKey) => { - uniqueDonor = privateKey('//Alice'); + uniqueDonor = await privateKey('//Alice'); [randomAccountUnique] = await helper.arrange.createAccounts([0n], uniqueDonor); balanceForeignUnqTokenInit = 0n; --- a/tests/yarn.lock +++ b/tests/yarn.lock @@ -17,49 +17,49 @@ dependencies: "@babel/highlight" "^7.18.6" -"@babel/compat-data@^7.19.0": - version "7.19.0" - resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.19.0.tgz#2a592fd89bacb1fcde68de31bee4f2f2dacb0e86" - integrity sha512-y5rqgTTPTmaF5e2nVhOxw+Ur9HDJLsWb6U/KpgUzRZEdPfE6VOubXBKLdbcUTijzRptednSBDQbYZBOSqJxpJw== +"@babel/compat-data@^7.19.3": + version "7.19.4" + resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.19.4.tgz#95c86de137bf0317f3a570e1b6e996b427299747" + integrity sha512-CHIGpJcUQ5lU9KrPHTjBMhVwQG6CQjxfg36fGXl3qk/Gik1WwWachaXFuo0uCWJT/mStOKtcbFJCaVLihC1CMw== -"@babel/core@^7.18.10": - version "7.19.0" - resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.19.0.tgz#d2f5f4f2033c00de8096be3c9f45772563e150c3" - integrity sha512-reM4+U7B9ss148rh2n1Qs9ASS+w94irYXga7c2jaQv9RVzpS7Mv1a9rnYYwuDa45G+DkORt9g6An2k/V4d9LbQ== +"@babel/core@^7.19.3": + version "7.19.3" + resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.19.3.tgz#2519f62a51458f43b682d61583c3810e7dcee64c" + integrity sha512-WneDJxdsjEvyKtXKsaBGbDeiyOjR5vYq4HcShxnIbG0qixpoHjI3MqeZM9NDvsojNCEBItQE4juOo/bU6e72gQ== dependencies: "@ampproject/remapping" "^2.1.0" "@babel/code-frame" "^7.18.6" - "@babel/generator" "^7.19.0" - "@babel/helper-compilation-targets" "^7.19.0" + "@babel/generator" "^7.19.3" + "@babel/helper-compilation-targets" "^7.19.3" "@babel/helper-module-transforms" "^7.19.0" "@babel/helpers" "^7.19.0" - "@babel/parser" "^7.19.0" + "@babel/parser" "^7.19.3" "@babel/template" "^7.18.10" - "@babel/traverse" "^7.19.0" - "@babel/types" "^7.19.0" + "@babel/traverse" "^7.19.3" + "@babel/types" "^7.19.3" convert-source-map "^1.7.0" debug "^4.1.0" gensync "^1.0.0-beta.2" json5 "^2.2.1" semver "^6.3.0" -"@babel/generator@^7.19.0": - version "7.19.0" - resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.19.0.tgz#785596c06425e59334df2ccee63ab166b738419a" - integrity sha512-S1ahxf1gZ2dpoiFgA+ohK9DIpz50bJ0CWs7Zlzb54Z4sG8qmdIrGrVqmy1sAtTVRb+9CU6U8VqT9L0Zj7hxHVg== +"@babel/generator@^7.19.3", "@babel/generator@^7.19.4": + version "7.19.4" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.19.4.tgz#60050cf3f0a593d7b2471b4be4f62a56b949237f" + integrity sha512-5T2lY5vXqS+5UEit/5TwcIUeCnwgCljcF8IQRT6XRQPBrvLeq5V8W+URv+GvwoF3FP8tkhp++evVyDzkDGzNmA== dependencies: - "@babel/types" "^7.19.0" + "@babel/types" "^7.19.4" "@jridgewell/gen-mapping" "^0.3.2" jsesc "^2.5.1" -"@babel/helper-compilation-targets@^7.19.0": - version "7.19.0" - resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.19.0.tgz#537ec8339d53e806ed422f1e06c8f17d55b96bb0" - integrity sha512-Ai5bNWXIvwDvWM7njqsG3feMlL9hCVQsPYXodsZyLwshYkZVJt59Gftau4VrE8S9IT9asd2uSP1hG6wCNw+sXA== +"@babel/helper-compilation-targets@^7.19.3": + version "7.19.3" + resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.19.3.tgz#a10a04588125675d7c7ae299af86fa1b2ee038ca" + integrity sha512-65ESqLGyGmLvgR0mst5AdW1FkNlj9rQsCKduzEoEPhBCDFGXvz2jW6bXFG6i0/MrV2s7hhXjjb2yAzcPuQlLwg== dependencies: - "@babel/compat-data" "^7.19.0" + "@babel/compat-data" "^7.19.3" "@babel/helper-validator-option" "^7.18.6" - browserslist "^4.20.2" + browserslist "^4.21.3" semver "^6.3.0" "@babel/helper-environment-visitor@^7.18.9": @@ -104,11 +104,11 @@ "@babel/types" "^7.19.0" "@babel/helper-simple-access@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.18.6.tgz#d6d8f51f4ac2978068df934b569f08f29788c7ea" - integrity sha512-iNpIgTgyAvDQpDj76POqg+YEt8fPxx3yaNBg3S30dxNKm2SWfYhD0TGrK/Eu9wHpUW63VQU894TsTg+GLbUa1g== + version "7.19.4" + resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.19.4.tgz#be553f4951ac6352df2567f7daa19a0ee15668e7" + integrity sha512-f9Xq6WqBFqaDfbCzn2w85hwklswz5qsKlh7f08w4Y9yhJHpnNC0QemtSkK5YyOY8kPGvyiwdzZksGUhnGdaUIg== dependencies: - "@babel/types" "^7.18.6" + "@babel/types" "^7.19.4" "@babel/helper-split-export-declaration@^7.18.6": version "7.18.6" @@ -117,15 +117,15 @@ dependencies: "@babel/types" "^7.18.6" -"@babel/helper-string-parser@^7.18.10": - version "7.18.10" - resolved "https://registry.yarnpkg.com/@babel/helper-string-parser/-/helper-string-parser-7.18.10.tgz#181f22d28ebe1b3857fa575f5c290b1aaf659b56" - integrity sha512-XtIfWmeNY3i4t7t4D2t02q50HvqHybPqW2ki1kosnvWCwuCMeo81Jf0gwr85jy/neUdg5XDdeFE/80DXiO+njw== +"@babel/helper-string-parser@^7.19.4": + version "7.19.4" + resolved "https://registry.yarnpkg.com/@babel/helper-string-parser/-/helper-string-parser-7.19.4.tgz#38d3acb654b4701a9b77fb0615a96f775c3a9e63" + integrity sha512-nHtDoQcuqFmwYNYPz3Rah5ph2p8PFeFCsZk9A/48dPc/rGocJ5J3hAAZ7pb76VWX3fZKu+uEr/FhH5jLx7umrw== -"@babel/helper-validator-identifier@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.18.6.tgz#9c97e30d31b2b8c72a1d08984f2ca9b574d7a076" - integrity sha512-MmetCkz9ej86nJQV+sFCxoGGrUbU3q02kgLciwkrt9QqEB7cP39oKEY0PakknEO0Gu20SskMRi+AYZ3b1TpN9g== +"@babel/helper-validator-identifier@^7.18.6", "@babel/helper-validator-identifier@^7.19.1": + version "7.19.1" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.19.1.tgz#7eea834cf32901ffdc1a7ee555e2f9c27e249ca2" + integrity sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w== "@babel/helper-validator-option@^7.18.6": version "7.18.6" @@ -133,13 +133,13 @@ integrity sha512-XO7gESt5ouv/LRJdrVjkShckw6STTaB7l9BrpBaAHDeF5YZT+01PCwmR0SJHnkW6i8OwW/EVWRShfi4j2x+KQw== "@babel/helpers@^7.19.0": - version "7.19.0" - resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.19.0.tgz#f30534657faf246ae96551d88dd31e9d1fa1fc18" - integrity sha512-DRBCKGwIEdqY3+rPJgG/dKfQy9+08rHIAJx8q2p+HSWP87s2HCrQmaAMMyMll2kIXKCW0cO1RdQskx15Xakftg== + version "7.19.4" + resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.19.4.tgz#42154945f87b8148df7203a25c31ba9a73be46c5" + integrity sha512-G+z3aOx2nfDHwX/kyVii5fJq+bgscg89/dJNWpYeKeBv3v9xX8EIabmx1k6u9LS04H7nROFVRVK+e3k0VHp+sw== dependencies: "@babel/template" "^7.18.10" - "@babel/traverse" "^7.19.0" - "@babel/types" "^7.19.0" + "@babel/traverse" "^7.19.4" + "@babel/types" "^7.19.4" "@babel/highlight@^7.18.6": version "7.18.6" @@ -150,10 +150,10 @@ chalk "^2.0.0" js-tokens "^4.0.0" -"@babel/parser@^7.18.10", "@babel/parser@^7.19.0": - version "7.19.0" - resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.19.0.tgz#497fcafb1d5b61376959c1c338745ef0577aa02c" - integrity sha512-74bEXKX2h+8rrfQUfsBfuZZHzsEs6Eql4pqy/T4Nn6Y9wNPggQOqD6z6pn5Bl8ZfysKouFZT/UXEH94ummEeQw== +"@babel/parser@^7.18.10", "@babel/parser@^7.19.3", "@babel/parser@^7.19.4": + version "7.19.4" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.19.4.tgz#03c4339d2b8971eb3beca5252bafd9b9f79db3dc" + integrity sha512-qpVT7gtuOLjWeDTKLkJ6sryqLliBaFpAtGeqw5cs5giLldvh+Ch0plqnUMKoVAUS6ZEueQQiZV+p5pxtPitEsA== "@babel/register@^7.18.9": version "7.18.9" @@ -166,10 +166,10 @@ pirates "^4.0.5" source-map-support "^0.5.16" -"@babel/runtime@^7.18.9": - version "7.19.0" - resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.19.0.tgz#22b11c037b094d27a8a2504ea4dcff00f50e2259" - integrity sha512-eR8Lo9hnDS7tqkO7NsV+mKvCmv5boaXFSZ70DnfhcgiEne8hv9oCEd36Klw74EtizEqLsy4YnW8UWwpBVolHZA== +"@babel/runtime@^7.18.9", "@babel/runtime@^7.19.0": + version "7.19.4" + resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.19.4.tgz#a42f814502ee467d55b38dd1c256f53a7b885c78" + integrity sha512-EXpLCrk55f+cYqmHsSR+yD/0gAIMxxA9QK9lnQWzhMCvt+YmoBN7Zx94s++Kv0+unHk39vxNO8t+CMA2WSS3wA== dependencies: regenerator-runtime "^0.13.4" @@ -182,29 +182,29 @@ "@babel/parser" "^7.18.10" "@babel/types" "^7.18.10" -"@babel/traverse@^7.19.0": - version "7.19.0" - resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.19.0.tgz#eb9c561c7360005c592cc645abafe0c3c4548eed" - integrity sha512-4pKpFRDh+utd2mbRC8JLnlsMUii3PMHjpL6a0SZ4NMZy7YFP9aXORxEhdMVOc9CpWtDF09IkciQLEhK7Ml7gRA== +"@babel/traverse@^7.19.0", "@babel/traverse@^7.19.3", "@babel/traverse@^7.19.4": + version "7.19.4" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.19.4.tgz#f117820e18b1e59448a6c1fa9d0ff08f7ac459a8" + integrity sha512-w3K1i+V5u2aJUOXBFFC5pveFLmtq1s3qcdDNC2qRI6WPBQIDaKFqXxDEqDO/h1dQ3HjsZoZMyIy6jGLq0xtw+g== dependencies: "@babel/code-frame" "^7.18.6" - "@babel/generator" "^7.19.0" + "@babel/generator" "^7.19.4" "@babel/helper-environment-visitor" "^7.18.9" "@babel/helper-function-name" "^7.19.0" "@babel/helper-hoist-variables" "^7.18.6" "@babel/helper-split-export-declaration" "^7.18.6" - "@babel/parser" "^7.19.0" - "@babel/types" "^7.19.0" + "@babel/parser" "^7.19.4" + "@babel/types" "^7.19.4" debug "^4.1.0" globals "^11.1.0" -"@babel/types@^7.18.10", "@babel/types@^7.18.6", "@babel/types@^7.19.0": - version "7.19.0" - resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.19.0.tgz#75f21d73d73dc0351f3368d28db73465f4814600" - integrity sha512-YuGopBq3ke25BVSiS6fgF49Ul9gH1x70Bcr6bqRLjWCkcX8Hre1/5+z+IiWOIerRMSSEfGZVB9z9kyq7wVs9YA== +"@babel/types@^7.18.10", "@babel/types@^7.18.6", "@babel/types@^7.19.0", "@babel/types@^7.19.3", "@babel/types@^7.19.4": + version "7.19.4" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.19.4.tgz#0dd5c91c573a202d600490a35b33246fed8a41c7" + integrity sha512-M5LK7nAeS6+9j7hAq+b3fQs+pNfUtTGq+yFFfHnauFA8zQtLRfmuipmsKDKKLuyG+wC8ABW43A153YNawNTEtw== dependencies: - "@babel/helper-string-parser" "^7.18.10" - "@babel/helper-validator-identifier" "^7.18.6" + "@babel/helper-string-parser" "^7.19.4" + "@babel/helper-validator-identifier" "^7.19.1" to-fast-properties "^2.0.0" "@cspotcode/source-map-support@^0.8.0": @@ -214,10 +214,10 @@ dependencies: "@jridgewell/trace-mapping" "0.3.9" -"@eslint/eslintrc@^1.3.1": - version "1.3.1" - resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-1.3.1.tgz#de0807bfeffc37b964a7d0400e0c348ce5a2543d" - integrity sha512-OhSY22oQQdw3zgPOOwdoj01l/Dzl1Z+xyUP33tkSN+aqyEhymJCcPHyXt+ylW8FSe0TfRC2VG+ROQOapD0aZSQ== +"@eslint/eslintrc@^1.3.3": + version "1.3.3" + resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-1.3.3.tgz#2b044ab39fdfa75b4688184f9e573ce3c5b0ff95" + integrity sha512-uj3pT6Mg+3t39fvLrj8iuCIJ38zKO9FpGtJ4BBJebJhEwjoT+KLVNCcHT5QC9NGRIEi7fZ0ZR8YRb884auB4Lg== dependencies: ajv "^6.12.4" debug "^4.3.2" @@ -354,9 +354,9 @@ integrity sha512-0odtFdXu/XHtjQXJYA3u9G0G8btm0ND5Cu8M7i5vhEcE8/HmF4Lbdqanwyv4uQTr2tx6b7fQRmgLrsnpQlmnig== "@ethersproject/networks@^5.7.0": - version "5.7.0" - resolved "https://registry.yarnpkg.com/@ethersproject/networks/-/networks-5.7.0.tgz#df72a392f1a63a57f87210515695a31a245845ad" - integrity sha512-MG6oHSQHd4ebvJrleEQQ4HhVu8Ichr0RDYEfHzsVAVjHNM+w36x9wp9r+hf1JstMXtseXDtkiVoARAG6M959AA== + version "5.7.1" + resolved "https://registry.yarnpkg.com/@ethersproject/networks/-/networks-5.7.1.tgz#118e1a981d757d45ccea6bb58d9fd3d9db14ead6" + integrity sha512-n/MufjFYv3yFcUyfhnXotyDlNdFb7onmkSy8aQERi2PjNcnWQ66xXxa3XlS8nCcA8aJKJjIIMNJTC7tu80GwpQ== dependencies: "@ethersproject/logger" "^5.7.0" @@ -412,9 +412,9 @@ "@ethersproject/signing-key" "^5.7.0" "@ethersproject/web@^5.7.0": - version "5.7.0" - resolved "https://registry.yarnpkg.com/@ethersproject/web/-/web-5.7.0.tgz#40850c05260edad8b54827923bbad23d96aac0bc" - integrity sha512-ApHcbbj+muRASVDSCl/tgxaH2LBkRMEYfLOLVa0COipx0+nlu0QKet7U2lEg0vdkh8XRSLf2nd1f1Uk9SrVSGA== + version "5.7.1" + resolved "https://registry.yarnpkg.com/@ethersproject/web/-/web-5.7.1.tgz#de1f285b373149bee5928f4eb7bcb87ee5fbb4ae" + integrity sha512-Gueu8lSvyjBWL4cYsWsjh6MtMwM0+H4HvqFPZfB6dV8ctbP9zFAO73VG1cMWae0FLPCtz0peKPpZY8/ugJJX2w== dependencies: "@ethersproject/base64" "^5.7.0" "@ethersproject/bytes" "^5.7.0" @@ -422,19 +422,14 @@ "@ethersproject/properties" "^5.7.0" "@ethersproject/strings" "^5.7.0" -"@humanwhocodes/config-array@^0.10.4": - version "0.10.4" - resolved "https://registry.yarnpkg.com/@humanwhocodes/config-array/-/config-array-0.10.4.tgz#01e7366e57d2ad104feea63e72248f22015c520c" - integrity sha512-mXAIHxZT3Vcpg83opl1wGlVZ9xydbfZO3r5YfRSH6Gpp2J/PfdBP0wbDa2sO6/qRbcalpoevVyW6A/fI6LfeMw== +"@humanwhocodes/config-array@^0.10.5": + version "0.10.7" + resolved "https://registry.yarnpkg.com/@humanwhocodes/config-array/-/config-array-0.10.7.tgz#6d53769fd0c222767e6452e8ebda825c22e9f0dc" + integrity sha512-MDl6D6sBsaV452/QSdX+4CXIjZhIcI0PELsxUjk4U828yd58vk3bTIvk/6w5FY+4hIy9sLW0sfrV7K7Kc++j/w== dependencies: "@humanwhocodes/object-schema" "^1.2.1" debug "^4.1.1" minimatch "^3.0.4" - -"@humanwhocodes/gitignore-to-minimatch@^1.0.2": - version "1.0.2" - resolved "https://registry.yarnpkg.com/@humanwhocodes/gitignore-to-minimatch/-/gitignore-to-minimatch-1.0.2.tgz#316b0a63b91c10e53f242efb4ace5c3b34e8728d" - integrity sha512-rSqmMJDdLFUsyxR6FMtD00nfQKKLFb1kv+qBbOVKqErvloEIJLo5bDTJTQNTYgeyp78JsA7u/NPi5jT1GR/MuA== "@humanwhocodes/module-importer@^1.0.1": version "1.0.1" @@ -463,7 +458,7 @@ "@jridgewell/sourcemap-codec" "^1.4.10" "@jridgewell/trace-mapping" "^0.3.9" -"@jridgewell/resolve-uri@^3.0.3": +"@jridgewell/resolve-uri@3.1.0", "@jridgewell/resolve-uri@^3.0.3": version "3.1.0" resolved "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz#2203b118c157721addfe69d47b70465463066d78" integrity sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w== @@ -473,7 +468,7 @@ resolved "https://registry.yarnpkg.com/@jridgewell/set-array/-/set-array-1.1.2.tgz#7c6cf998d6d20b914c0a55a91ae928ff25965e72" integrity sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw== -"@jridgewell/sourcemap-codec@^1.4.10": +"@jridgewell/sourcemap-codec@1.4.14", "@jridgewell/sourcemap-codec@^1.4.10": version "1.4.14" resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz#add4c98d341472a289190b424efbdb096991bb24" integrity sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw== @@ -487,22 +482,22 @@ "@jridgewell/sourcemap-codec" "^1.4.10" "@jridgewell/trace-mapping@^0.3.9": - version "0.3.15" - resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.15.tgz#aba35c48a38d3fd84b37e66c9c0423f9744f9774" - integrity sha512-oWZNOULl+UbhsgB51uuZzglikfIKSUBO/M9W2OfEjn7cmqoAiCgmv9lyACTUacZwBz0ITnJ2NqjU8Tx0DHL88g== + version "0.3.16" + resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.16.tgz#a7982f16c18cae02be36274365433e5b49d7b23f" + integrity sha512-LCQ+NeThyJ4k1W2d+vIKdxuSt9R3pQSZ4P92m7EakaYuXcVWbHuT5bjNcqLd4Rdgi6xYWYDvBJZJLZSLanjDcA== dependencies: - "@jridgewell/resolve-uri" "^3.0.3" - "@jridgewell/sourcemap-codec" "^1.4.10" + "@jridgewell/resolve-uri" "3.1.0" + "@jridgewell/sourcemap-codec" "1.4.14" -"@noble/hashes@1.1.2": - version "1.1.2" - resolved "https://registry.yarnpkg.com/@noble/hashes/-/hashes-1.1.2.tgz#e9e035b9b166ca0af657a7848eb2718f0f22f183" - integrity sha512-KYRCASVTv6aeUi1tsF8/vpyR7zpfs3FUzy2Jqm+MU+LmUKhQ0y2FpfwqkCcxSg2ua4GALJd8k2R76WxwZGbQpA== +"@noble/hashes@1.1.3": + version "1.1.3" + resolved "https://registry.yarnpkg.com/@noble/hashes/-/hashes-1.1.3.tgz#360afc77610e0a61f3417e497dcf36862e4f8111" + integrity sha512-CE0FCR57H2acVI5UOzIGSSIYxZ6v/HOhDR0Ro9VLyhnzLwx0o8W1mmgaqlEUx4049qJDlIBRztv5k+MM8vbO3A== -"@noble/secp256k1@1.6.3": - version "1.6.3" - resolved "https://registry.yarnpkg.com/@noble/secp256k1/-/secp256k1-1.6.3.tgz#7eed12d9f4404b416999d0c87686836c4c5c9b94" - integrity sha512-T04e4iTurVy7I8Sw4+c5OSN9/RkPlo1uKxAomtxQNLq8j1uPAqnsqG1bqvY3Jv7c13gyr6dui0zmh/I3+f/JaQ== +"@noble/secp256k1@1.7.0": + version "1.7.0" + resolved "https://registry.yarnpkg.com/@noble/secp256k1/-/secp256k1-1.7.0.tgz#d15357f7c227e751d90aa06b05a0e5cf993ba8c1" + integrity sha512-kbacwGSsH/CTout0ZnZWxnW1B+jH/7r/WAAKLBtrRJ/+CUH7lgmQzl3GTrQua3SGKWNSDsS6lmjnDpIJ5Dxyaw== "@nodelib/fs.scandir@2.1.5": version "2.1.5" @@ -525,139 +520,139 @@ "@nodelib/fs.scandir" "2.1.5" fastq "^1.6.0" -"@polkadot/api-augment@9.2.2": - version "9.2.2" - resolved "https://registry.yarnpkg.com/@polkadot/api-augment/-/api-augment-9.2.2.tgz#fab9dd96f9322ae658245cd8711fd2d8db5c2412" - integrity sha512-yDtp1ecRWMCFXTjmKOvqXI6VHTYvHormRwJwE85VGQbMsZFDWFVbQXZOxsqkfx2rJye/25seVRWxQS+7oKzqkA== +"@polkadot/api-augment@9.5.1": + version "9.5.1" + resolved "https://registry.yarnpkg.com/@polkadot/api-augment/-/api-augment-9.5.1.tgz#f4ae75837782dd09c2f7468f78c17626c359797d" + integrity sha512-9NQ2miIKVJvyhR2Zhk0XcHA+pgnWhQ0815lqcq0kz9ny5JHUFeGlNtxECw7AEnxoiC81EqpfWkOHpJpfiIcOmw== dependencies: - "@babel/runtime" "^7.18.9" - "@polkadot/api-base" "9.2.2" - "@polkadot/rpc-augment" "9.2.2" - "@polkadot/types" "9.2.2" - "@polkadot/types-augment" "9.2.2" - "@polkadot/types-codec" "9.2.2" - "@polkadot/util" "^10.1.4" + "@babel/runtime" "^7.19.0" + "@polkadot/api-base" "9.5.1" + "@polkadot/rpc-augment" "9.5.1" + "@polkadot/types" "9.5.1" + "@polkadot/types-augment" "9.5.1" + "@polkadot/types-codec" "9.5.1" + "@polkadot/util" "^10.1.10" -"@polkadot/api-base@9.2.2": - version "9.2.2" - resolved "https://registry.yarnpkg.com/@polkadot/api-base/-/api-base-9.2.2.tgz#f84cbf1eb1893e9c8eb538369c8b349f3d64d5fd" - integrity sha512-Dqbh0MQo/ByAqOC56ga1VkVCpEjfWtxPHz3ni8oXJp0YvjA/4qKkZRM2ejoN07XKOMFNBZC4hnmNplyaCnVHfw== +"@polkadot/api-base@9.5.1": + version "9.5.1" + resolved "https://registry.yarnpkg.com/@polkadot/api-base/-/api-base-9.5.1.tgz#f6084ebd21c4c43e3c11a7d638621d27162c5fcc" + integrity sha512-3qsMsIhYbU3zp+YnP5h6Hg98y3B+FrxgPW7r2Uk6Kp1uSPmIzhMCyGuxur/BAcDVbd3KME+zWLHJDYOdyhuUwQ== dependencies: - "@babel/runtime" "^7.18.9" - "@polkadot/rpc-core" "9.2.2" - "@polkadot/types" "9.2.2" - "@polkadot/util" "^10.1.4" - rxjs "^7.5.6" + "@babel/runtime" "^7.19.0" + "@polkadot/rpc-core" "9.5.1" + "@polkadot/types" "9.5.1" + "@polkadot/util" "^10.1.10" + rxjs "^7.5.7" -"@polkadot/api-contract@9.2.2": - version "9.2.2" - resolved "https://registry.yarnpkg.com/@polkadot/api-contract/-/api-contract-9.2.2.tgz#1b8c1c6a4fb2f5e21d0c9549062c8242453a15b5" - integrity sha512-NE2QbBtX7e/lXdOG5wFqArjnbujcVWppoksvX1SrG2GKdhM2Y/shHLNV7uCYMq3tqmmCKOcp0RKE85Owu/7LQA== +"@polkadot/api-contract@9.5.1": + version "9.5.1" + resolved "https://registry.yarnpkg.com/@polkadot/api-contract/-/api-contract-9.5.1.tgz#ba45c9150610477f5d05509414f7330b6175ecdd" + integrity sha512-BfI1Yi2R0eZ076F4v4UZklQ+8WS0g8QZ9g2716FoNTGGYogUeMQ/8gZWIJaAyylCypN/ucNLdpSmSTnhR59jCw== dependencies: - "@babel/runtime" "^7.18.9" - "@polkadot/api" "9.2.2" - "@polkadot/types" "9.2.2" - "@polkadot/types-codec" "9.2.2" - "@polkadot/types-create" "9.2.2" - "@polkadot/util" "^10.1.4" - "@polkadot/util-crypto" "^10.1.4" - rxjs "^7.5.6" + "@babel/runtime" "^7.19.0" + "@polkadot/api" "9.5.1" + "@polkadot/types" "9.5.1" + "@polkadot/types-codec" "9.5.1" + "@polkadot/types-create" "9.5.1" + "@polkadot/util" "^10.1.10" + "@polkadot/util-crypto" "^10.1.10" + rxjs "^7.5.7" -"@polkadot/api-derive@9.2.2": - version "9.2.2" - resolved "https://registry.yarnpkg.com/@polkadot/api-derive/-/api-derive-9.2.2.tgz#70b510d8140f081ef145b9bdf4f8a03108183192" - integrity sha512-8Du6Wxro5yhAgwJ7R8xWCrDFnAWGv6aDWVnpckUZWs9LRw5wGNN4GJD4WB/715H9ZZXzQ/sDW5lXo3ux19SE7w== +"@polkadot/api-derive@9.5.1": + version "9.5.1" + resolved "https://registry.yarnpkg.com/@polkadot/api-derive/-/api-derive-9.5.1.tgz#8542b989c34249df5ec3b836ec10b910897620df" + integrity sha512-fKlKQe8WZ3jrm44w/zptMofljW5qj+jZxnryK08CAH/MINlZArPfCtn+EJla2ND9aTnRMUWlEBtytyCPImI/Hg== dependencies: - "@babel/runtime" "^7.18.9" - "@polkadot/api" "9.2.2" - "@polkadot/api-augment" "9.2.2" - "@polkadot/api-base" "9.2.2" - "@polkadot/rpc-core" "9.2.2" - "@polkadot/types" "9.2.2" - "@polkadot/types-codec" "9.2.2" - "@polkadot/util" "^10.1.4" - "@polkadot/util-crypto" "^10.1.4" - rxjs "^7.5.6" + "@babel/runtime" "^7.19.0" + "@polkadot/api" "9.5.1" + "@polkadot/api-augment" "9.5.1" + "@polkadot/api-base" "9.5.1" + "@polkadot/rpc-core" "9.5.1" + "@polkadot/types" "9.5.1" + "@polkadot/types-codec" "9.5.1" + "@polkadot/util" "^10.1.10" + "@polkadot/util-crypto" "^10.1.10" + rxjs "^7.5.7" -"@polkadot/api@9.2.2": - version "9.2.2" - resolved "https://registry.yarnpkg.com/@polkadot/api/-/api-9.2.2.tgz#3ecd80110acf5e479ce510d301e3a7ce2c1b8f17" - integrity sha512-dRXfdGhV3XWRtsYt+OskAwSAimTRC1k/oh3yO1vYc7C9cmqssw0LMEib9mlVh7qHprD30db7NleTOSFU6Bt2ag== +"@polkadot/api@9.5.1": + version "9.5.1" + resolved "https://registry.yarnpkg.com/@polkadot/api/-/api-9.5.1.tgz#3501dac23bf82986dfe0a8c22857eb86610eca61" + integrity sha512-A2i/+mCl6cbFJ84ExMcWosUDfq0gVvzyKftkbRMs0oDzvHVVucTm0nCCzBgi/ltvSsFq8oJQ4pVqNTfT/IXgeQ== dependencies: - "@babel/runtime" "^7.18.9" - "@polkadot/api-augment" "9.2.2" - "@polkadot/api-base" "9.2.2" - "@polkadot/api-derive" "9.2.2" - "@polkadot/keyring" "^10.1.4" - "@polkadot/rpc-augment" "9.2.2" - "@polkadot/rpc-core" "9.2.2" - "@polkadot/rpc-provider" "9.2.2" - "@polkadot/types" "9.2.2" - "@polkadot/types-augment" "9.2.2" - "@polkadot/types-codec" "9.2.2" - "@polkadot/types-create" "9.2.2" - "@polkadot/types-known" "9.2.2" - "@polkadot/util" "^10.1.4" - "@polkadot/util-crypto" "^10.1.4" + "@babel/runtime" "^7.19.0" + "@polkadot/api-augment" "9.5.1" + "@polkadot/api-base" "9.5.1" + "@polkadot/api-derive" "9.5.1" + "@polkadot/keyring" "^10.1.10" + "@polkadot/rpc-augment" "9.5.1" + "@polkadot/rpc-core" "9.5.1" + "@polkadot/rpc-provider" "9.5.1" + "@polkadot/types" "9.5.1" + "@polkadot/types-augment" "9.5.1" + "@polkadot/types-codec" "9.5.1" + "@polkadot/types-create" "9.5.1" + "@polkadot/types-known" "9.5.1" + "@polkadot/util" "^10.1.10" + "@polkadot/util-crypto" "^10.1.10" eventemitter3 "^4.0.7" - rxjs "^7.5.6" + rxjs "^7.5.7" -"@polkadot/keyring@^10.1.4": - version "10.1.7" - resolved "https://registry.yarnpkg.com/@polkadot/keyring/-/keyring-10.1.7.tgz#d51be1dc5807c961889847d8f0e10e4bbdd19d3f" - integrity sha512-lArwaAS3hDs+HHupDIC4r2mFaAfmNQV2YzwL2wM5zhOqB2RugN03BFrgwNll0y9/Bg8rYDqM3Y5BvVMzgMZ6XA== +"@polkadot/keyring@^10.1.10": + version "10.1.10" + resolved "https://registry.yarnpkg.com/@polkadot/keyring/-/keyring-10.1.10.tgz#f9d97ab528e612df4820e0df1837faae51c15904" + integrity sha512-crKYBbwmPcFoTP6mby2+o1QWsjAyi5QlKzU8tXuXOApP6SBuqmDujIuLOKNG2vZoftNdVldsVL0WmKVYtBeuQg== dependencies: - "@babel/runtime" "^7.18.9" - "@polkadot/util" "10.1.7" - "@polkadot/util-crypto" "10.1.7" + "@babel/runtime" "^7.19.0" + "@polkadot/util" "10.1.10" + "@polkadot/util-crypto" "10.1.10" -"@polkadot/networks@10.1.7", "@polkadot/networks@^10.1.4": - version "10.1.7" - resolved "https://registry.yarnpkg.com/@polkadot/networks/-/networks-10.1.7.tgz#33b38d70409e2daf0990ef18ff150c6718ffb700" - integrity sha512-ol864SZ/GwAF72GQOPRy+Y9r6NtgJJjMBlDLESvV5VK64eEB0MRSSyiOdd7y/4SumR9crrrNimx3ynACFgxZ8A== +"@polkadot/networks@10.1.10", "@polkadot/networks@^10.1.10": + version "10.1.10" + resolved "https://registry.yarnpkg.com/@polkadot/networks/-/networks-10.1.10.tgz#421ce200f8b26759edd1d9d9408d934527f5b455" + integrity sha512-Db78t2XnFIZbdSdu1aFuj3/1cNwcSzG/+wNrpCQ9dPhnGPy5S1GVbmU8pyxTftPKdTFc+8RdBr+5bc0d5ijGiA== dependencies: - "@babel/runtime" "^7.18.9" - "@polkadot/util" "10.1.7" - "@substrate/ss58-registry" "^1.28.0" + "@babel/runtime" "^7.19.0" + "@polkadot/util" "10.1.10" + "@substrate/ss58-registry" "^1.31.0" -"@polkadot/rpc-augment@9.2.2": - version "9.2.2" - resolved "https://registry.yarnpkg.com/@polkadot/rpc-augment/-/rpc-augment-9.2.2.tgz#7246e6a43536296ad19be8460a81e434d718ff4c" - integrity sha512-LbluIgoFtFtN/PTLk0kPErPgMPwj1+ySLn1bNlWjshoE00NeYAIltin9j11iT9g4Zpb+ppSWpsrhO/5crGqERQ== +"@polkadot/rpc-augment@9.5.1": + version "9.5.1" + resolved "https://registry.yarnpkg.com/@polkadot/rpc-augment/-/rpc-augment-9.5.1.tgz#a4d8d7c6132375c9f4d50c7cb4c6813ff700937f" + integrity sha512-7Qm6oIoVIqv6VOaIqDal45hUTb3TVZ58S3zkSr60p/dPMlGCaFMcojtfcQErHtCW0hgvzFNsDl9ShpXRcPWu7g== dependencies: - "@babel/runtime" "^7.18.9" - "@polkadot/rpc-core" "9.2.2" - "@polkadot/types" "9.2.2" - "@polkadot/types-codec" "9.2.2" - "@polkadot/util" "^10.1.4" + "@babel/runtime" "^7.19.0" + "@polkadot/rpc-core" "9.5.1" + "@polkadot/types" "9.5.1" + "@polkadot/types-codec" "9.5.1" + "@polkadot/util" "^10.1.10" -"@polkadot/rpc-core@9.2.2": - version "9.2.2" - resolved "https://registry.yarnpkg.com/@polkadot/rpc-core/-/rpc-core-9.2.2.tgz#96b9fd033ecf0d4edf5f2f48c958a1991776b332" - integrity sha512-D+rmC7etJVvlDb7debjF1HDvjqvRnx/b3j7zKpJ3IjjVKWiYyCgQvcyyLyX4lH1f3PHOfEJZP6Q8FNA8B2U7XA== +"@polkadot/rpc-core@9.5.1": + version "9.5.1" + resolved "https://registry.yarnpkg.com/@polkadot/rpc-core/-/rpc-core-9.5.1.tgz#7c327d735b742aaaee856bce6288331d0b2b042f" + integrity sha512-8CXgBVTEUjeuN5VOwS6MjTeqpN+9qrNJAAwNEba36/72g6Wgg3flza11kx0luQ6OLPVgCM7OcAjZ17p16phXDA== dependencies: - "@babel/runtime" "^7.18.9" - "@polkadot/rpc-augment" "9.2.2" - "@polkadot/rpc-provider" "9.2.2" - "@polkadot/types" "9.2.2" - "@polkadot/util" "^10.1.4" - rxjs "^7.5.6" + "@babel/runtime" "^7.19.0" + "@polkadot/rpc-augment" "9.5.1" + "@polkadot/rpc-provider" "9.5.1" + "@polkadot/types" "9.5.1" + "@polkadot/util" "^10.1.10" + rxjs "^7.5.7" -"@polkadot/rpc-provider@9.2.2": - version "9.2.2" - resolved "https://registry.yarnpkg.com/@polkadot/rpc-provider/-/rpc-provider-9.2.2.tgz#14453b8e80d4f0826dbcbf4e749d5a9397cb6905" - integrity sha512-QnUql17q9ByP+7IyouXJDUPjkvOB1ciCGTwzf98WlOQxr/OEwcaWx0axHSVtMQyhX06ciVIbyI9hIjV5cfT78A== +"@polkadot/rpc-provider@9.5.1": + version "9.5.1" + resolved "https://registry.yarnpkg.com/@polkadot/rpc-provider/-/rpc-provider-9.5.1.tgz#1857b655a461820025b85cf3a7e7a58066ede137" + integrity sha512-CxyEo1SzwbcByUsrW5RUm5GTLNK7yjmVlTMseex8zQLO4+4erqUoQzr6TTIPSt4LWyk+TjbZdtGtlt7p6i2nJg== dependencies: - "@babel/runtime" "^7.18.9" - "@polkadot/keyring" "^10.1.4" - "@polkadot/types" "9.2.2" - "@polkadot/types-support" "9.2.2" - "@polkadot/util" "^10.1.4" - "@polkadot/util-crypto" "^10.1.4" - "@polkadot/x-fetch" "^10.1.4" - "@polkadot/x-global" "^10.1.4" - "@polkadot/x-ws" "^10.1.4" - "@substrate/connect" "0.7.10" + "@babel/runtime" "^7.19.0" + "@polkadot/keyring" "^10.1.10" + "@polkadot/types" "9.5.1" + "@polkadot/types-support" "9.5.1" + "@polkadot/util" "^10.1.10" + "@polkadot/util-crypto" "^10.1.10" + "@polkadot/x-fetch" "^10.1.10" + "@polkadot/x-global" "^10.1.10" + "@polkadot/x-ws" "^10.1.10" + "@substrate/connect" "0.7.14" eventemitter3 "^4.0.7" mock-socket "^9.1.5" nock "^13.2.9" @@ -669,119 +664,119 @@ dependencies: "@types/chrome" "^0.0.171" -"@polkadot/typegen@9.2.2": - version "9.2.2" - resolved "https://registry.yarnpkg.com/@polkadot/typegen/-/typegen-9.2.2.tgz#e99ec0c8b6a73e302ab6015008c16a969908a794" - integrity sha512-Bh7cvvT45Vw0A5yJDb4Pp+gIsMaqDg1x/p7QpBFf/RbPL6bORC3hBOxwa36m+RyWhYggNycoxfnKz5eAsdjCFQ== +"@polkadot/typegen@9.5.1": + version "9.5.1" + resolved "https://registry.yarnpkg.com/@polkadot/typegen/-/typegen-9.5.1.tgz#deb74a4bbabd205d68f2b3d59793b3234cfc8c00" + integrity sha512-SKLiXHUpSCBop8dd1P/LCN2R5GpM41QSOmRyNVnhgOKPtmB/vxS2pVNvMDl7dOhQkANCO6E2CWZiIPeWlu/G7Q== dependencies: - "@babel/core" "^7.18.10" + "@babel/core" "^7.19.3" "@babel/register" "^7.18.9" - "@babel/runtime" "^7.18.9" - "@polkadot/api" "9.2.2" - "@polkadot/api-augment" "9.2.2" - "@polkadot/rpc-augment" "9.2.2" - "@polkadot/rpc-provider" "9.2.2" - "@polkadot/types" "9.2.2" - "@polkadot/types-augment" "9.2.2" - "@polkadot/types-codec" "9.2.2" - "@polkadot/types-create" "9.2.2" - "@polkadot/types-support" "9.2.2" - "@polkadot/util" "^10.1.4" - "@polkadot/util-crypto" "^10.1.4" - "@polkadot/x-ws" "^10.1.4" + "@babel/runtime" "^7.19.0" + "@polkadot/api" "9.5.1" + "@polkadot/api-augment" "9.5.1" + "@polkadot/rpc-augment" "9.5.1" + "@polkadot/rpc-provider" "9.5.1" + "@polkadot/types" "9.5.1" + "@polkadot/types-augment" "9.5.1" + "@polkadot/types-codec" "9.5.1" + "@polkadot/types-create" "9.5.1" + "@polkadot/types-support" "9.5.1" + "@polkadot/util" "^10.1.10" + "@polkadot/util-crypto" "^10.1.10" + "@polkadot/x-ws" "^10.1.10" handlebars "^4.7.7" websocket "^1.0.34" - yargs "^17.5.1" + yargs "^17.6.0" -"@polkadot/types-augment@9.2.2": - version "9.2.2" - resolved "https://registry.yarnpkg.com/@polkadot/types-augment/-/types-augment-9.2.2.tgz#3ec2aff0a86287f9f9f4ddb0aa5430450d4a684f" - integrity sha512-OyAC/WxNYrJjVp8NXklAeg/380BnFCBo4YgEOT4EhXK8fWzKzanvFAFROKAg78JQBI4LRJKkRyAEWIEzMNGR1Q== +"@polkadot/types-augment@9.5.1": + version "9.5.1" + resolved "https://registry.yarnpkg.com/@polkadot/types-augment/-/types-augment-9.5.1.tgz#907d05da7cf0891cdf6d59e2387a3394a978a5c9" + integrity sha512-1AzQpGe5bGttYbbjR1UhV19htsFjgqJ651eyT3YdRqo1hotZ2GwTCkGXuTJtcmQQH9G09xUUwS3nx8WsSyQ70A== dependencies: - "@babel/runtime" "^7.18.9" - "@polkadot/types" "9.2.2" - "@polkadot/types-codec" "9.2.2" - "@polkadot/util" "^10.1.4" + "@babel/runtime" "^7.19.0" + "@polkadot/types" "9.5.1" + "@polkadot/types-codec" "9.5.1" + "@polkadot/util" "^10.1.10" -"@polkadot/types-codec@9.2.2": - version "9.2.2" - resolved "https://registry.yarnpkg.com/@polkadot/types-codec/-/types-codec-9.2.2.tgz#8ab24d6208cce7e6abf3c352742045062b7ff588" - integrity sha512-p6E31UQ9Hq0KwKXz5wBXvzrus3v7fY3yHR9EkR8eZvG7rBIHST42JPlfXIxKmnkkXkMxIX1LNSHQy0A8EikVxQ== +"@polkadot/types-codec@9.5.1": + version "9.5.1" + resolved "https://registry.yarnpkg.com/@polkadot/types-codec/-/types-codec-9.5.1.tgz#d0c04a9f7dd8337dce4fe806e634c4ef99f954cc" + integrity sha512-7Dy8TeApu4lN8DqdMZLuh34ocdHQh9jzAob6cQl1fl1ypOiCO/SwPjFkj0Xnhh7QQz9X9w63jZzbaFR3PPT+0g== dependencies: - "@babel/runtime" "^7.18.9" - "@polkadot/util" "^10.1.4" - "@polkadot/x-bigint" "^10.1.4" + "@babel/runtime" "^7.19.0" + "@polkadot/util" "^10.1.10" + "@polkadot/x-bigint" "^10.1.10" -"@polkadot/types-create@9.2.2": - version "9.2.2" - resolved "https://registry.yarnpkg.com/@polkadot/types-create/-/types-create-9.2.2.tgz#d1e3cf945a0c95b31999673add738c4d585543d8" - integrity sha512-byGoFbkwpMHuqRwZXoD3lrTRkgIB89GlZlXJIfBuNeGE84nWktPCuZw3hBm5LO/qIgp5RFjdfeOCmBvxQ0fzQg== +"@polkadot/types-create@9.5.1": + version "9.5.1" + resolved "https://registry.yarnpkg.com/@polkadot/types-create/-/types-create-9.5.1.tgz#06f71f08b3c68fb3bbdabe838325c955384d59bd" + integrity sha512-pUQ1U0mho5aKRdi4iR9DP9ldIoj9U+ApHIeYyxkBY8RexMQOpkt8PZfpFhg4z2H5vZj/sgNIBXq65HjXuyu+9w== dependencies: - "@babel/runtime" "^7.18.9" - "@polkadot/types-codec" "9.2.2" - "@polkadot/util" "^10.1.4" + "@babel/runtime" "^7.19.0" + "@polkadot/types-codec" "9.5.1" + "@polkadot/util" "^10.1.10" -"@polkadot/types-known@9.2.2": - version "9.2.2" - resolved "https://registry.yarnpkg.com/@polkadot/types-known/-/types-known-9.2.2.tgz#0d3d70eb37796aac06c874cd2b2bc97464f00e6a" - integrity sha512-WHkgoMJg0ZzxOainMjvGhaIa8/m/zwmhH1P+0UqLoZf+oE9EUkjPJaG5oETz4YUa3Nb8uuHfdMl6c5xN3DMIaQ== +"@polkadot/types-known@9.5.1": + version "9.5.1" + resolved "https://registry.yarnpkg.com/@polkadot/types-known/-/types-known-9.5.1.tgz#0eb596078733a96f2cff3d5b4258966f4a6e4a5a" + integrity sha512-SedfPDxJREYPATa7X2Fv26z6UVPYv6v9Z9P4nulnC6Yl8C2+Q4A/VIqTtgsJc0DU1YT3gM8ofVxircfHqqRVNA== dependencies: - "@babel/runtime" "^7.18.9" - "@polkadot/networks" "^10.1.4" - "@polkadot/types" "9.2.2" - "@polkadot/types-codec" "9.2.2" - "@polkadot/types-create" "9.2.2" - "@polkadot/util" "^10.1.4" + "@babel/runtime" "^7.19.0" + "@polkadot/networks" "^10.1.10" + "@polkadot/types" "9.5.1" + "@polkadot/types-codec" "9.5.1" + "@polkadot/types-create" "9.5.1" + "@polkadot/util" "^10.1.10" -"@polkadot/types-support@9.2.2": - version "9.2.2" - resolved "https://registry.yarnpkg.com/@polkadot/types-support/-/types-support-9.2.2.tgz#d695b54b466bb47c0b376d07e9853d1ae3b17d5e" - integrity sha512-JNcdTyMKGETV7pjE4eZ8eBs82c4ZSY7n1R1/xT/tNZNA6uNdukBxOOkyRHdu5ugEehwCMSpOgruMCNH9e77zLg== +"@polkadot/types-support@9.5.1": + version "9.5.1" + resolved "https://registry.yarnpkg.com/@polkadot/types-support/-/types-support-9.5.1.tgz#5383cd84375aedd67bf0ccd2fa230d811f4b9dc9" + integrity sha512-mjenEGNT/ReY1xFexb37NDgV7QHHBBfWt31ZQMZKDkQL+R2P0rXFpmitcE3eOCV3oY4mf+GaU2N/ZfnsFl3tPQ== dependencies: - "@babel/runtime" "^7.18.9" - "@polkadot/util" "^10.1.4" + "@babel/runtime" "^7.19.0" + "@polkadot/util" "^10.1.10" -"@polkadot/types@9.2.2": - version "9.2.2" - resolved "https://registry.yarnpkg.com/@polkadot/types/-/types-9.2.2.tgz#b74d098ed8c725f961c3d95b610c49bde1cf5334" - integrity sha512-sDpS/m9oeihkYAYljZzp7xfMkJDLP5nLHSKkLdrh6H9XDVQnKgzJ19/kuAHsU8FCa9E37Al3aSQf/+NR+kCfZw== +"@polkadot/types@9.5.1": + version "9.5.1" + resolved "https://registry.yarnpkg.com/@polkadot/types/-/types-9.5.1.tgz#5f3891ce45d8d78aa0b5bc65d7517d98342699b0" + integrity sha512-xuhYq+O4JRl2iqLVEwKVHnfOA9AfwoNlHzrFx2DChDcIWdmgmUDASq9TkZhBP+jx81SieMH7iTf4zY6UwPKYQw== dependencies: - "@babel/runtime" "^7.18.9" - "@polkadot/keyring" "^10.1.4" - "@polkadot/types-augment" "9.2.2" - "@polkadot/types-codec" "9.2.2" - "@polkadot/types-create" "9.2.2" - "@polkadot/util" "^10.1.4" - "@polkadot/util-crypto" "^10.1.4" - rxjs "^7.5.6" + "@babel/runtime" "^7.19.0" + "@polkadot/keyring" "^10.1.10" + "@polkadot/types-augment" "9.5.1" + "@polkadot/types-codec" "9.5.1" + "@polkadot/types-create" "9.5.1" + "@polkadot/util" "^10.1.10" + "@polkadot/util-crypto" "^10.1.10" + rxjs "^7.5.7" -"@polkadot/util-crypto@10.1.7", "@polkadot/util-crypto@^10.1.4": - version "10.1.7" - resolved "https://registry.yarnpkg.com/@polkadot/util-crypto/-/util-crypto-10.1.7.tgz#fe5ea006bf23ae19319f3ac9236905a984a65e2f" - integrity sha512-zGmSU7a0wdWfpDtfc+Q7fUuW+extu9o1Uh4JpkuwwZ/dxmyW5xlfqVsIScM1pdPyjJsyamX8KwsKiVsW4slasg== +"@polkadot/util-crypto@10.1.10", "@polkadot/util-crypto@^10.1.10": + version "10.1.10" + resolved "https://registry.yarnpkg.com/@polkadot/util-crypto/-/util-crypto-10.1.10.tgz#ae00c794dda6a2f5e40cdaaa87987312461dc59f" + integrity sha512-w9h/wf4wZXeUkRnihhnfqlaKuoQtrjkjK3C5liCQkr9vx5zOsmg/nMSDP8UUFJX0msPPYpFeNvzn7oDIs6qSZA== dependencies: - "@babel/runtime" "^7.18.9" - "@noble/hashes" "1.1.2" - "@noble/secp256k1" "1.6.3" - "@polkadot/networks" "10.1.7" - "@polkadot/util" "10.1.7" + "@babel/runtime" "^7.19.0" + "@noble/hashes" "1.1.3" + "@noble/secp256k1" "1.7.0" + "@polkadot/networks" "10.1.10" + "@polkadot/util" "10.1.10" "@polkadot/wasm-crypto" "^6.3.1" - "@polkadot/x-bigint" "10.1.7" - "@polkadot/x-randomvalues" "10.1.7" + "@polkadot/x-bigint" "10.1.10" + "@polkadot/x-randomvalues" "10.1.10" "@scure/base" "1.1.1" ed2curve "^0.3.0" tweetnacl "^1.0.3" -"@polkadot/util@10.1.7", "@polkadot/util@^10.1.4": - version "10.1.7" - resolved "https://registry.yarnpkg.com/@polkadot/util/-/util-10.1.7.tgz#c54ca2a5b29cb834b40d8a876baefa3a0efb93af" - integrity sha512-s7gDLdNb4HUpoe3faXwoO6HwiUp8pi66voYKiUYRh1kEtW1o9vGBgyZPHPGC/FBgILzTJKii/9XxnSex60zBTA== +"@polkadot/util@10.1.10", "@polkadot/util@^10.1.10": + version "10.1.10" + resolved "https://registry.yarnpkg.com/@polkadot/util/-/util-10.1.10.tgz#dc79c93d70e699e8cc1b09e636af7e4a64c5f0f0" + integrity sha512-BQoTfSxZ3BWAgWDjgKBVdyw1AJGaoOeAidCA+LZcHV6wlMu5643AZPUnoMrW413MbbpxsIhJXtNttqOwjo8MjA== dependencies: - "@babel/runtime" "^7.18.9" - "@polkadot/x-bigint" "10.1.7" - "@polkadot/x-global" "10.1.7" - "@polkadot/x-textdecoder" "10.1.7" - "@polkadot/x-textencoder" "10.1.7" + "@babel/runtime" "^7.19.0" + "@polkadot/x-bigint" "10.1.10" + "@polkadot/x-global" "10.1.10" + "@polkadot/x-textdecoder" "10.1.10" + "@polkadot/x-textencoder" "10.1.10" "@types/bn.js" "^5.1.1" bn.js "^5.2.1" @@ -836,62 +831,62 @@ dependencies: "@babel/runtime" "^7.18.9" -"@polkadot/x-bigint@10.1.7", "@polkadot/x-bigint@^10.1.4": - version "10.1.7" - resolved "https://registry.yarnpkg.com/@polkadot/x-bigint/-/x-bigint-10.1.7.tgz#1338689476ffdbb9f9cb243df1954ae8186134b9" - integrity sha512-uaClHpI6cnDumIfejUKvNTkB43JleEb0V6OIufDKJ/e1aCLE3f/Ws9ggwL8ea05lQP5k5xqOzbPdizi/UvrgKQ== +"@polkadot/x-bigint@10.1.10", "@polkadot/x-bigint@^10.1.10": + version "10.1.10" + resolved "https://registry.yarnpkg.com/@polkadot/x-bigint/-/x-bigint-10.1.10.tgz#97dcccda2e24776aad3ae49f3268c03332138246" + integrity sha512-4Jt0BO0WTby6r9A2DgkDxf/LFaICQHvSl1VSFtBf0Z0GV2n4OxkBX5x/1bdEdGEvYT5rM7RbR3xI7EL+W1ixHA== dependencies: - "@babel/runtime" "^7.18.9" - "@polkadot/x-global" "10.1.7" + "@babel/runtime" "^7.19.0" + "@polkadot/x-global" "10.1.10" -"@polkadot/x-fetch@^10.1.4": - version "10.1.7" - resolved "https://registry.yarnpkg.com/@polkadot/x-fetch/-/x-fetch-10.1.7.tgz#1b76051a495563403a20ef235a8558c6d91b11a6" - integrity sha512-NL+xrlqUoCLwCIAvQLwOA189gSUgeSGOFjCmZ9uMkBqf35KXeZoHWse6YaoseTSlnAal3dQOGbXnYWZ4Ck2OSA== +"@polkadot/x-fetch@^10.1.10": + version "10.1.10" + resolved "https://registry.yarnpkg.com/@polkadot/x-fetch/-/x-fetch-10.1.10.tgz#6551e44211cf21a1ca076eedc4676754345e1504" + integrity sha512-LvTxAN6GaJzfgZ74WFYPZrIkMEThpX5u7O4ILiExcJt87E19cSWlYSHDa5n+OLjUpq0lBV2ueF90iUblt6aHpg== dependencies: - "@babel/runtime" "^7.18.9" - "@polkadot/x-global" "10.1.7" + "@babel/runtime" "^7.19.0" + "@polkadot/x-global" "10.1.10" "@types/node-fetch" "^2.6.2" node-fetch "^3.2.10" -"@polkadot/x-global@10.1.7", "@polkadot/x-global@^10.1.4": - version "10.1.7" - resolved "https://registry.yarnpkg.com/@polkadot/x-global/-/x-global-10.1.7.tgz#91a472ac2f83fd0858dcd0df528844a5b650790e" - integrity sha512-k2ZUZyBVgDnP/Ysxapa0mthn63j6gsN2V0kZejEQPyOfCHtQQkse3jFvAWdslpWoR8j2k8SN5O6reHc0F4f7mA== +"@polkadot/x-global@10.1.10", "@polkadot/x-global@^10.1.10": + version "10.1.10" + resolved "https://registry.yarnpkg.com/@polkadot/x-global/-/x-global-10.1.10.tgz#eedf63f1f3918c7f2bd8ef0907e051783f1a626e" + integrity sha512-WFfgaZSrzPlKLdnOus2mIFGzUbSDIQK6RMCfFfM9SmF3DkoxN40z5Nkni4PztfKr22stlkhmhnX/Lp/NxpuT6Q== dependencies: - "@babel/runtime" "^7.18.9" + "@babel/runtime" "^7.19.0" -"@polkadot/x-randomvalues@10.1.7": - version "10.1.7" - resolved "https://registry.yarnpkg.com/@polkadot/x-randomvalues/-/x-randomvalues-10.1.7.tgz#d537f1f7bf3fb03e6c08ae6e6ac36e069c1f9844" - integrity sha512-3er4UYOlozLGgFYWwcbmcFslmO8m82u4cAGR4AaEag0VdV7jLO/M5lTmivT/3rtLSww6sjkEfr522GM2Q5lmFg== +"@polkadot/x-randomvalues@10.1.10": + version "10.1.10" + resolved "https://registry.yarnpkg.com/@polkadot/x-randomvalues/-/x-randomvalues-10.1.10.tgz#a10f98f2c4d744612b68ee697e43f1e4d6e1f89a" + integrity sha512-KM4sCI/DNLIXlmnkeJIuYvh3pPuWvnkbR1a6TUB12J1izUJ+uGV+cAFRR4/EZk3oEsG/Tgivbs56meEOo3ws5A== dependencies: - "@babel/runtime" "^7.18.9" - "@polkadot/x-global" "10.1.7" + "@babel/runtime" "^7.19.0" + "@polkadot/x-global" "10.1.10" -"@polkadot/x-textdecoder@10.1.7": - version "10.1.7" - resolved "https://registry.yarnpkg.com/@polkadot/x-textdecoder/-/x-textdecoder-10.1.7.tgz#1dd4e6141b1669acdd321a4da1fc6fdc271b7908" - integrity sha512-iAFOHludmZFOyVL8sQFv4TDqbcqQU5gwwYv74duTA+WQBgbSITJrBahSCV/rXOjUqds9pzQO3qBFzziznNnkiQ== +"@polkadot/x-textdecoder@10.1.10": + version "10.1.10" + resolved "https://registry.yarnpkg.com/@polkadot/x-textdecoder/-/x-textdecoder-10.1.10.tgz#a6d0010b092bdefc69c70dcb34d76ec8993980b2" + integrity sha512-cAk37faYXx8IICeaq/tdl+aiIXwo3SLrx9XNoQqhX02g+SEs3ARM7zJcohj/p8ynWAI+ezNcsKn1wh174nquHw== dependencies: - "@babel/runtime" "^7.18.9" - "@polkadot/x-global" "10.1.7" + "@babel/runtime" "^7.19.0" + "@polkadot/x-global" "10.1.10" -"@polkadot/x-textencoder@10.1.7": - version "10.1.7" - resolved "https://registry.yarnpkg.com/@polkadot/x-textencoder/-/x-textencoder-10.1.7.tgz#b208601f33b936c7a059f126dbb6b26a87f45864" - integrity sha512-GzjaWZDbgzZ0IQT60xuZ7cZ0wnlNVYMqpfI9KvBc58X9dPI3TIMwzbXDVzZzpjY1SAqJGs4hJse9HMWZazfhew== +"@polkadot/x-textencoder@10.1.10": + version "10.1.10" + resolved "https://registry.yarnpkg.com/@polkadot/x-textencoder/-/x-textencoder-10.1.10.tgz#35b2e778b3dbb6816bb37f1848b772c4cd3c43d1" + integrity sha512-Auaql6BL5UHtWakZUQyj4y/BrM0tm4bYG5vXCMQCA1Gg0ky+46DhgpRrAQ9F7NNgWg1A6dA2I9KuAA4BTbNx0w== dependencies: - "@babel/runtime" "^7.18.9" - "@polkadot/x-global" "10.1.7" + "@babel/runtime" "^7.19.0" + "@polkadot/x-global" "10.1.10" -"@polkadot/x-ws@^10.1.4": - version "10.1.7" - resolved "https://registry.yarnpkg.com/@polkadot/x-ws/-/x-ws-10.1.7.tgz#b1fbfe3e16fa809f35f24ef47fde145b018d8cdc" - integrity sha512-aNkotxHx3qPVjiItD9lbNONs4GNzqeeZ98wHtCjd9JWl/g+xNkOVF3xQ8++1qSHPBEYSwKh9URjQH2+CD2XlvQ== +"@polkadot/x-ws@^10.1.10": + version "10.1.10" + resolved "https://registry.yarnpkg.com/@polkadot/x-ws/-/x-ws-10.1.10.tgz#27b55a988a0f60db7f79fed8268802406f522813" + integrity sha512-JxDgfm0ox2XPAtdTeJXYl6qq7LY/KOPi69wRpFMczWaYUsZubO6EiRzgzjuFlHY4/oxfjS/D+YbzcjefTxHz6g== dependencies: - "@babel/runtime" "^7.18.9" - "@polkadot/x-global" "10.1.7" + "@babel/runtime" "^7.19.0" + "@polkadot/x-global" "10.1.10" "@types/websocket" "^1.0.5" websocket "^1.0.34" @@ -910,27 +905,27 @@ resolved "https://registry.yarnpkg.com/@substrate/connect-extension-protocol/-/connect-extension-protocol-1.0.1.tgz#fa5738039586c648013caa6a0c95c43265dbe77d" integrity sha512-161JhCC1csjH3GE5mPLEd7HbWtwNSPJBg3p1Ksz9SFlTzj/bgEwudiRN2y5i0MoLGCIJRYKyKGMxVnd29PzNjg== -"@substrate/connect@0.7.10": - version "0.7.10" - resolved "https://registry.yarnpkg.com/@substrate/connect/-/connect-0.7.10.tgz#db49a62188cd830a8dc8848240e635da21f333ff" - integrity sha512-WNdW18e0I696/AQjrAXdMD9W8YaKLTcPr2Cu8scSwiUT40in84KEzi+g+P367cE2etAc+Dvu8vNDEQTbUPNqEg== +"@substrate/connect@0.7.14": + version "0.7.14" + resolved "https://registry.yarnpkg.com/@substrate/connect/-/connect-0.7.14.tgz#c090e952e9cdd93185a94d24fbc424ea20fe7bbe" + integrity sha512-uW5uBmihpivshmmmw+rsg7qOV0KqVSep4rWOXFMP8aFQinvmqw4JqxP21og4H/7JZxttYUBFQVsdtXHGKJ0aVQ== dependencies: "@substrate/connect-extension-protocol" "^1.0.1" - "@substrate/smoldot-light" "0.6.27" + "@substrate/smoldot-light" "0.6.34" eventemitter3 "^4.0.7" -"@substrate/smoldot-light@0.6.27": - version "0.6.27" - resolved "https://registry.yarnpkg.com/@substrate/smoldot-light/-/smoldot-light-0.6.27.tgz#7e66ad4bfddce4168a6008f6be8c771c881ae585" - integrity sha512-Wy3fbyfZqR3HLynuxeBkUunZsrbqpsmFN+D0/8cVIHZbO7WDwJsmCUc32yO5r+v6s/T97L7FOJHEyMWmRfnKAQ== +"@substrate/smoldot-light@0.6.34": + version "0.6.34" + resolved "https://registry.yarnpkg.com/@substrate/smoldot-light/-/smoldot-light-0.6.34.tgz#273dba622102281fd0fdb0e375198bff2ec584c3" + integrity sha512-+HK9MaJ0HelJmpf4YYR+salJ7dhVBltmhGlyz5l8OXS9DW18fe0Z2wxEo8P5kX9CUxlCXEb8J9JBRQAYBPHbwQ== dependencies: pako "^2.0.4" - websocket "^1.0.32" + ws "^8.8.1" -"@substrate/ss58-registry@^1.28.0": - version "1.29.0" - resolved "https://registry.yarnpkg.com/@substrate/ss58-registry/-/ss58-registry-1.29.0.tgz#0dea078271b5318c5eff7176e1df1f9b2c27e43f" - integrity sha512-KTqwZgTjtWPhCAUJJx9qswP/p9cRKUU9GOHYUDKNdISFDiFafWmpI54JHfYLkgjvkSKEUgRZnvLpe0LMF1fXvw== +"@substrate/ss58-registry@^1.31.0": + version "1.31.0" + resolved "https://registry.yarnpkg.com/@substrate/ss58-registry/-/ss58-registry-1.31.0.tgz#489e3a496081dc3ee7ef5ef2eb513962d5d29351" + integrity sha512-OSOmdjaq9foXfHBy9aLVMwGheygvsiZlv4dggnLOYOuhSmNCsSB/PaW4DBz+/tSdK1Fo9+ZiFW6cF24RA+m0sw== "@szmarczak/http-timer@^4.0.5": version "4.0.6" @@ -1023,9 +1018,9 @@ integrity sha512-BsPXH/irW0ht0Ji6iw/jJaK8Lj3FJemon2gvEqHKpCdDCeemHa+rI3WBGq5z7cDMZgoLjY40oninGxqk+8NzNQ== "@types/har-format@*": - version "1.2.8" - resolved "https://registry.yarnpkg.com/@types/har-format/-/har-format-1.2.8.tgz#e6908b76d4c88be3db642846bb8b455f0bfb1c4e" - integrity sha512-OP6L9VuZNdskgNN3zFQQ54ceYD8OLq5IbqO4VK91ORLfOm7WdT/CiT/pHEBSQEqCInJ2y3O6iCm/zGtPElpgJQ== + version "1.2.9" + resolved "https://registry.yarnpkg.com/@types/har-format/-/har-format-1.2.9.tgz#b9b3a9bfc33a078e7d898a00b09662910577f4a4" + integrity sha512-rffW6MhQ9yoa75bdNi+rjZBAvu2HhehWJXlhuWXnWdENeuKe82wUgAwxYOb7KRKKmxYN+D/iRKd2NDQMLqlUmg== "@types/http-cache-semantics@*": version "4.0.1" @@ -1044,10 +1039,10 @@ dependencies: "@types/node" "*" -"@types/mocha@^9.1.1": - version "9.1.1" - resolved "https://registry.yarnpkg.com/@types/mocha/-/mocha-9.1.1.tgz#e7c4f1001eefa4b8afbd1eee27a237fee3bf29c4" - integrity sha512-Z61JK7DKDtdKTWwLeElSEBcWGRLY8g95ic5FoQqI9CMx0ns/Ghep3B4DfcEimiKMvtamNVULVNKEsiwV3aQmXw== +"@types/mocha@^10.0.0": + version "10.0.0" + resolved "https://registry.yarnpkg.com/@types/mocha/-/mocha-10.0.0.tgz#3d9018c575f0e3f7386c1de80ee66cc21fbb7a52" + integrity sha512-rADY+HtTOA52l9VZWtgQfn4p+UDVM2eDVkMZT1I6syp0YKxW2F9v+0pbRZLsvskhQv/vMb6ZfCay81GHbz5SHg== "@types/node-fetch@^2.6.2": version "2.6.2" @@ -1058,9 +1053,9 @@ form-data "^3.0.0" "@types/node@*": - version "18.7.16" - resolved "https://registry.yarnpkg.com/@types/node/-/node-18.7.16.tgz#0eb3cce1e37c79619943d2fd903919fc30850601" - integrity sha512-EQHhixfu+mkqHMZl1R2Ovuvn47PUw18azMJOTwSZr9/fhzHNGXAJ0ma0dayRVchprpCj0Kc1K1xKoWaATWF1qg== + version "18.8.3" + resolved "https://registry.yarnpkg.com/@types/node/-/node-18.8.3.tgz#ce750ab4017effa51aed6a7230651778d54e327c" + integrity sha512-0os9vz6BpGwxGe9LOhgP/ncvYN5Tx1fNcd2TM3rD/aCGBkysb+ZWpXEocG24h6ZzOi13+VB8HndAQFezsSOw1w== "@types/node@^12.12.6": version "12.20.55" @@ -1101,84 +1096,83 @@ "@types/node" "*" "@typescript-eslint/eslint-plugin@^5.26.0": - version "5.36.2" - resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.36.2.tgz#6df092a20e0f9ec748b27f293a12cb39d0c1fe4d" - integrity sha512-OwwR8LRwSnI98tdc2z7mJYgY60gf7I9ZfGjN5EjCwwns9bdTuQfAXcsjSB2wSQ/TVNYSGKf4kzVXbNGaZvwiXw== + version "5.39.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.39.0.tgz#778b2d9e7f293502c7feeea6c74dca8eb3e67511" + integrity sha512-xVfKOkBm5iWMNGKQ2fwX5GVgBuHmZBO1tCRwXmY5oAIsPscfwm2UADDuNB8ZVYCtpQvJK4xpjrK7jEhcJ0zY9A== dependencies: - "@typescript-eslint/scope-manager" "5.36.2" - "@typescript-eslint/type-utils" "5.36.2" - "@typescript-eslint/utils" "5.36.2" + "@typescript-eslint/scope-manager" "5.39.0" + "@typescript-eslint/type-utils" "5.39.0" + "@typescript-eslint/utils" "5.39.0" debug "^4.3.4" - functional-red-black-tree "^1.0.1" ignore "^5.2.0" regexpp "^3.2.0" semver "^7.3.7" tsutils "^3.21.0" "@typescript-eslint/parser@^5.26.0": - version "5.36.2" - resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-5.36.2.tgz#3ddf323d3ac85a25295a55fcb9c7a49ab4680ddd" - integrity sha512-qS/Kb0yzy8sR0idFspI9Z6+t7mqk/oRjnAYfewG+VN73opAUvmYL3oPIMmgOX6CnQS6gmVIXGshlb5RY/R22pA== + version "5.39.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-5.39.0.tgz#93fa0bc980a3a501e081824f6097f7ca30aaa22b" + integrity sha512-PhxLjrZnHShe431sBAGHaNe6BDdxAASDySgsBCGxcBecVCi8NQWxQZMcizNA4g0pN51bBAn/FUfkWG3SDVcGlA== dependencies: - "@typescript-eslint/scope-manager" "5.36.2" - "@typescript-eslint/types" "5.36.2" - "@typescript-eslint/typescript-estree" "5.36.2" + "@typescript-eslint/scope-manager" "5.39.0" + "@typescript-eslint/types" "5.39.0" + "@typescript-eslint/typescript-estree" "5.39.0" debug "^4.3.4" -"@typescript-eslint/scope-manager@5.36.2": - version "5.36.2" - resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-5.36.2.tgz#a75eb588a3879ae659514780831370642505d1cd" - integrity sha512-cNNP51L8SkIFSfce8B1NSUBTJTu2Ts4nWeWbFrdaqjmn9yKrAaJUBHkyTZc0cL06OFHpb+JZq5AUHROS398Orw== +"@typescript-eslint/scope-manager@5.39.0": + version "5.39.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-5.39.0.tgz#873e1465afa3d6c78d8ed2da68aed266a08008d0" + integrity sha512-/I13vAqmG3dyqMVSZPjsbuNQlYS082Y7OMkwhCfLXYsmlI0ca4nkL7wJ/4gjX70LD4P8Hnw1JywUVVAwepURBw== dependencies: - "@typescript-eslint/types" "5.36.2" - "@typescript-eslint/visitor-keys" "5.36.2" + "@typescript-eslint/types" "5.39.0" + "@typescript-eslint/visitor-keys" "5.39.0" -"@typescript-eslint/type-utils@5.36.2": - version "5.36.2" - resolved "https://registry.yarnpkg.com/@typescript-eslint/type-utils/-/type-utils-5.36.2.tgz#752373f4babf05e993adf2cd543a763632826391" - integrity sha512-rPQtS5rfijUWLouhy6UmyNquKDPhQjKsaKH0WnY6hl/07lasj8gPaH2UD8xWkePn6SC+jW2i9c2DZVDnL+Dokw== +"@typescript-eslint/type-utils@5.39.0": + version "5.39.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/type-utils/-/type-utils-5.39.0.tgz#0a8c00f95dce4335832ad2dc6bc431c14e32a0a6" + integrity sha512-KJHJkOothljQWzR3t/GunL0TPKY+fGJtnpl+pX+sJ0YiKTz3q2Zr87SGTmFqsCMFrLt5E0+o+S6eQY0FAXj9uA== dependencies: - "@typescript-eslint/typescript-estree" "5.36.2" - "@typescript-eslint/utils" "5.36.2" + "@typescript-eslint/typescript-estree" "5.39.0" + "@typescript-eslint/utils" "5.39.0" debug "^4.3.4" tsutils "^3.21.0" -"@typescript-eslint/types@5.36.2": - version "5.36.2" - resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-5.36.2.tgz#a5066e500ebcfcee36694186ccc57b955c05faf9" - integrity sha512-9OJSvvwuF1L5eS2EQgFUbECb99F0mwq501w0H0EkYULkhFa19Qq7WFbycdw1PexAc929asupbZcgjVIe6OK/XQ== +"@typescript-eslint/types@5.39.0": + version "5.39.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-5.39.0.tgz#f4e9f207ebb4579fd854b25c0bf64433bb5ed78d" + integrity sha512-gQMZrnfEBFXK38hYqt8Lkwt8f4U6yq+2H5VDSgP/qiTzC8Nw8JO3OuSUOQ2qW37S/dlwdkHDntkZM6SQhKyPhw== -"@typescript-eslint/typescript-estree@5.36.2": - version "5.36.2" - resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-5.36.2.tgz#0c93418b36c53ba0bc34c61fe9405c4d1d8fe560" - integrity sha512-8fyH+RfbKc0mTspfuEjlfqA4YywcwQK2Amcf6TDOwaRLg7Vwdu4bZzyvBZp4bjt1RRjQ5MDnOZahxMrt2l5v9w== +"@typescript-eslint/typescript-estree@5.39.0": + version "5.39.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-5.39.0.tgz#c0316aa04a1a1f4f7f9498e3c13ef1d3dc4cf88b" + integrity sha512-qLFQP0f398sdnogJoLtd43pUgB18Q50QSA+BTE5h3sUxySzbWDpTSdgt4UyxNSozY/oDK2ta6HVAzvGgq8JYnA== dependencies: - "@typescript-eslint/types" "5.36.2" - "@typescript-eslint/visitor-keys" "5.36.2" + "@typescript-eslint/types" "5.39.0" + "@typescript-eslint/visitor-keys" "5.39.0" debug "^4.3.4" globby "^11.1.0" is-glob "^4.0.3" semver "^7.3.7" tsutils "^3.21.0" -"@typescript-eslint/utils@5.36.2": - version "5.36.2" - resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-5.36.2.tgz#b01a76f0ab244404c7aefc340c5015d5ce6da74c" - integrity sha512-uNcopWonEITX96v9pefk9DC1bWMdkweeSsewJ6GeC7L6j2t0SJywisgkr9wUTtXk90fi2Eljj90HSHm3OGdGRg== +"@typescript-eslint/utils@5.39.0": + version "5.39.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-5.39.0.tgz#b7063cca1dcf08d1d21b0d91db491161ad0be110" + integrity sha512-+DnY5jkpOpgj+EBtYPyHRjXampJfC0yUZZzfzLuUWVZvCuKqSdJVC8UhdWipIw7VKNTfwfAPiOWzYkAwuIhiAg== dependencies: "@types/json-schema" "^7.0.9" - "@typescript-eslint/scope-manager" "5.36.2" - "@typescript-eslint/types" "5.36.2" - "@typescript-eslint/typescript-estree" "5.36.2" + "@typescript-eslint/scope-manager" "5.39.0" + "@typescript-eslint/types" "5.39.0" + "@typescript-eslint/typescript-estree" "5.39.0" eslint-scope "^5.1.1" eslint-utils "^3.0.0" -"@typescript-eslint/visitor-keys@5.36.2": - version "5.36.2" - resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-5.36.2.tgz#2f8f78da0a3bad3320d2ac24965791ac39dace5a" - integrity sha512-BtRvSR6dEdrNt7Net2/XDjbYKU5Ml6GqJgVfXT0CxTCJlnIqK7rAGreuWKMT2t8cFUT2Msv5oxw0GMRD7T5J7A== +"@typescript-eslint/visitor-keys@5.39.0": + version "5.39.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-5.39.0.tgz#8f41f7d241b47257b081ddba5d3ce80deaae61e2" + integrity sha512-yyE3RPwOG+XJBLrhvsxAidUgybJVQ/hG8BhiJo0k8JSAYfk/CshVcxf0HwP4Jt7WZZ6vLmxdo1p6EyN3tzFTkg== dependencies: - "@typescript-eslint/types" "5.36.2" + "@typescript-eslint/types" "5.39.0" eslint-visitor-keys "^3.3.0" "@ungap/promise-all-settled@1.1.2": @@ -1187,9 +1181,9 @@ integrity sha512-sL/cEvJWAnClXw0wHk85/2L0G6Sj8UB0Ctc1TEMbKSsmpRosqhwj9gWgFRZSrBr2f9tiXISwNhCPmlfqUqyb9Q== abortcontroller-polyfill@^1.7.3: - version "1.7.3" - resolved "https://registry.yarnpkg.com/abortcontroller-polyfill/-/abortcontroller-polyfill-1.7.3.tgz#1b5b487bd6436b5b764fd52a612509702c3144b5" - integrity sha512-zetDJxd89y3X99Kvo4qFx8GKlt6GsvN3UcRZHwU6iFA/0KiOmhkTVhe8oRoTBiTVPZu09x3vCra47+w8Yz1+2Q== + version "1.7.5" + resolved "https://registry.yarnpkg.com/abortcontroller-polyfill/-/abortcontroller-polyfill-1.7.5.tgz#6738495f4e901fbb57b6c0611d0c75f76c485bed" + integrity sha512-JMJ5soJWP18htbbxJjG7bG6yuI6pRhgJ0scHHTfkUjf6wjP912xZWvM+A4sJK3gqd9E8fcPbDnOefbA9Th/FIQ== accepts@~1.3.8: version "1.3.8" @@ -1352,7 +1346,7 @@ dependencies: tweetnacl "^0.14.3" -bignumber.js@^9.0.0, bignumber.js@^9.0.2: +bignumber.js@^9.0.0, bignumber.js@^9.1.0: version "9.1.0" resolved "https://registry.yarnpkg.com/bignumber.js/-/bignumber.js-9.1.0.tgz#8d340146107fe3a6cb8d40699643c302e8773b62" integrity sha512-4LwHK4nfDOraBCtst+wOWIHbu1vhvAPJK8g8nROd4iuc3PSEjWif/qwbkh8jwCJz6yDBvtU4KPynETgrfh7y3A== @@ -1387,10 +1381,10 @@ resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-5.2.1.tgz#0bc527a6a0d18d0aa8d5b0538ce4a77dccfa7b70" integrity sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ== -body-parser@1.20.0, body-parser@^1.16.0: - version "1.20.0" - resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.20.0.tgz#3de69bd89011c11573d7bfee6a64f11b6bd27cc5" - integrity sha512-DfJ+q6EPcGKZD1QWUjSpqp+Q7bDQTsQIF4zfUAtZ6qk+H/3/QRhg9CEp39ss+/T2vw0+HaidC0ecJj/DRLIaKg== +body-parser@1.20.1, body-parser@^1.16.0: + version "1.20.1" + resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.20.1.tgz#b1812a8912c195cd371a3ee5e66faa2338a5c668" + integrity sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw== dependencies: bytes "3.1.2" content-type "~1.0.4" @@ -1400,7 +1394,7 @@ http-errors "2.0.0" iconv-lite "0.4.24" on-finished "2.4.1" - qs "6.10.3" + qs "6.11.0" raw-body "2.5.1" type-is "~1.6.18" unpipe "1.0.0" @@ -1491,15 +1485,15 @@ readable-stream "^3.6.0" safe-buffer "^5.2.0" -browserslist@^4.20.2: - version "4.21.3" - resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.21.3.tgz#5df277694eb3c48bc5c4b05af3e8b7e09c5a6d1a" - integrity sha512-898rgRXLAyRkM1GryrrBHGkqA5hlpkV5MhtZwg9QXeiyLUYs2k00Un05aX5l2/yJIOObYKOpS2JNo8nJDE7fWQ== +browserslist@^4.21.3: + version "4.21.4" + resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.21.4.tgz#e7496bbc67b9e39dd0f98565feccdcb0d4ff6987" + integrity sha512-CBHJJdDmgjl3daYjN5Cp5kbTf1mUhZoS+beLklHIvkOWscs83YAhLlF3Wsh/lciQYAcbBJgTOD44VtG31ZM4Hw== dependencies: - caniuse-lite "^1.0.30001370" - electron-to-chromium "^1.4.202" + caniuse-lite "^1.0.30001400" + electron-to-chromium "^1.4.251" node-releases "^2.0.6" - update-browserslist-db "^1.0.5" + update-browserslist-db "^1.0.9" bs58@^4.0.0: version "4.0.1" @@ -1593,10 +1587,10 @@ resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-6.3.0.tgz#5685b95eb209ac9c0c177467778c9c84df58ba9a" integrity sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA== -caniuse-lite@^1.0.30001370: - version "1.0.30001393" - resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001393.tgz#1aa161e24fe6af2e2ccda000fc2b94be0b0db356" - integrity sha512-N/od11RX+Gsk+1qY/jbPa0R6zJupEa0lxeBG598EbrtblxVCTJsQwbRBm6+V+rxpc5lHKdsXb9RY83cZIPLseA== +caniuse-lite@^1.0.30001400: + version "1.0.30001418" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001418.tgz#5f459215192a024c99e3e3a53aac310fc7cf24e6" + integrity sha512-oIs7+JL3K9JRQ3jPZjlH6qyYDp+nBTCais7hjh0s+fuBwufc7uZ7hPYMXrDOJhV360KGMTcczMRObk0/iMqZRg== caseless@~0.12.0: version "0.12.0" @@ -1703,6 +1697,15 @@ strip-ansi "^6.0.0" wrap-ansi "^7.0.0" +cliui@^8.0.1: + version "8.0.1" + resolved "https://registry.yarnpkg.com/cliui/-/cliui-8.0.1.tgz#0c04b075db02cbfe60dc8e6cf2f5486b1a3608aa" + integrity sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ== + dependencies: + string-width "^4.2.0" + strip-ansi "^6.0.1" + wrap-ansi "^7.0.0" + clone-deep@^4.0.1: version "4.0.1" resolved "https://registry.yarnpkg.com/clone-deep/-/clone-deep-4.0.1.tgz#c19fd9bdbbf85942b4fd979c84dcf7d5f07c2387" @@ -2057,10 +2060,10 @@ resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d" integrity sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow== -electron-to-chromium@^1.4.202: - version "1.4.246" - resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.246.tgz#802132d1bbd3ff32ce82fcd6a6ed6ab59b4366dc" - integrity sha512-/wFCHUE+Hocqr/LlVGsuKLIw4P2lBWwFIDcNMDpJGzyIysQV4aycpoOitAs32FT94EHKnNqDR/CVZJFbXEufJA== +electron-to-chromium@^1.4.251: + version "1.4.276" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.276.tgz#17837b19dafcc43aba885c4689358b298c19b520" + integrity sha512-EpuHPqu8YhonqLBXHoU6hDJCD98FCe6KDoet3/gY1qsQ6usjJoHqBH2YIVs8FXaAtHwVL8Uqa/fsYao/vq9VWQ== elliptic@6.5.4, elliptic@^6.4.0, elliptic@^6.5.3, elliptic@^6.5.4: version "6.5.4" @@ -2093,21 +2096,21 @@ once "^1.4.0" es-abstract@^1.19.0, es-abstract@^1.19.5, es-abstract@^1.20.0: - version "1.20.2" - resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.20.2.tgz#8495a07bc56d342a3b8ea3ab01bd986700c2ccb3" - integrity sha512-XxXQuVNrySBNlEkTYJoDNFe5+s2yIOpzq80sUHEdPdQr0S5nTLz4ZPPPswNIpKseDDUS5yghX1gfLIHQZ1iNuQ== + version "1.20.4" + resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.20.4.tgz#1d103f9f8d78d4cf0713edcd6d0ed1a46eed5861" + integrity sha512-0UtvRN79eMe2L+UNEF1BwRe364sj/DXhQ/k5FmivgoSdpM90b8Jc0mDzKMGo7QS0BVbOP/bTwBKNnDc9rNzaPA== dependencies: call-bind "^1.0.2" es-to-primitive "^1.2.1" function-bind "^1.1.1" function.prototype.name "^1.1.5" - get-intrinsic "^1.1.2" + get-intrinsic "^1.1.3" get-symbol-description "^1.0.0" has "^1.0.3" has-property-descriptors "^1.0.0" has-symbols "^1.0.3" internal-slot "^1.0.3" - is-callable "^1.2.4" + is-callable "^1.2.7" is-negative-zero "^2.0.2" is-regex "^1.1.4" is-shared-array-buffer "^1.0.2" @@ -2117,6 +2120,7 @@ object-keys "^1.1.1" object.assign "^4.1.4" regexp.prototype.flags "^1.4.3" + safe-regex-test "^1.0.0" string.prototype.trimend "^1.0.5" string.prototype.trimstart "^1.0.5" unbox-primitive "^1.0.2" @@ -2215,13 +2219,12 @@ integrity sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA== eslint@^8.16.0: - version "8.23.0" - resolved "https://registry.yarnpkg.com/eslint/-/eslint-8.23.0.tgz#a184918d288820179c6041bb3ddcc99ce6eea040" - integrity sha512-pBG/XOn0MsJcKcTRLr27S5HpzQo4kLr+HjLQIyK4EiCsijDl/TB+h5uEuJU6bQ8Edvwz1XWOjpaP2qgnXGpTcA== + version "8.25.0" + resolved "https://registry.yarnpkg.com/eslint/-/eslint-8.25.0.tgz#00eb962f50962165d0c4ee3327708315eaa8058b" + integrity sha512-DVlJOZ4Pn50zcKW5bYH7GQK/9MsoQG2d5eDH0ebEkE8PbgzTTmtt/VTH9GGJ4BfeZCpBLqFfvsjX35UacUL83A== dependencies: - "@eslint/eslintrc" "^1.3.1" - "@humanwhocodes/config-array" "^0.10.4" - "@humanwhocodes/gitignore-to-minimatch" "^1.0.2" + "@eslint/eslintrc" "^1.3.3" + "@humanwhocodes/config-array" "^0.10.5" "@humanwhocodes/module-importer" "^1.0.1" ajv "^6.10.0" chalk "^4.0.0" @@ -2238,7 +2241,6 @@ fast-deep-equal "^3.1.3" file-entry-cache "^6.0.1" find-up "^5.0.0" - functional-red-black-tree "^1.0.1" glob-parent "^6.0.1" globals "^13.15.0" globby "^11.1.0" @@ -2247,6 +2249,7 @@ import-fresh "^3.0.0" imurmurhash "^0.1.4" is-glob "^4.0.0" + js-sdsl "^4.1.4" js-yaml "^4.1.0" json-stable-stringify-without-jsonify "^1.0.1" levn "^0.4.1" @@ -2397,13 +2400,13 @@ safe-buffer "^5.1.1" express@^4.14.0: - version "4.18.1" - resolved "https://registry.yarnpkg.com/express/-/express-4.18.1.tgz#7797de8b9c72c857b9cd0e14a5eea80666267caf" - integrity sha512-zZBcOX9TfehHQhtupq57OF8lFZ3UZi08Y97dwFCkD8p9d/d2Y3M+ykKcwaMDEL+4qyUolgBDX6AblpR3fL212Q== + version "4.18.2" + resolved "https://registry.yarnpkg.com/express/-/express-4.18.2.tgz#3fabe08296e930c796c19e3c516979386ba9fd59" + integrity sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ== dependencies: accepts "~1.3.8" array-flatten "1.1.1" - body-parser "1.20.0" + body-parser "1.20.1" content-disposition "0.5.4" content-type "~1.0.4" cookie "0.5.0" @@ -2422,7 +2425,7 @@ parseurl "~1.3.3" path-to-regexp "0.1.7" proxy-addr "~2.0.7" - qs "6.10.3" + qs "6.11.0" range-parser "~1.2.1" safe-buffer "5.2.1" send "0.18.0" @@ -2575,9 +2578,9 @@ integrity sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ== follow-redirects@^1.12.1: - version "1.15.1" - resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.15.1.tgz#0ca6a452306c9b276e4d3127483e29575e207ad5" - integrity sha512-yLAMQs+k0b2m7cVxpS1VKJVvoz7SS9Td1zss3XRwXj+ZDH00RJgnuLx7E44wx02kQLrdM3aOOy+FpzS7+8OizA== + version "1.15.2" + resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.15.2.tgz#b460864144ba63f2681096f274c4e57026da2c13" + integrity sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA== for-each@^0.3.3: version "0.3.3" @@ -2672,11 +2675,6 @@ es-abstract "^1.19.0" functions-have-names "^1.2.2" -functional-red-black-tree@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz#1b0ab3bd553b2a0d6399d29c0e3ea0b252078327" - integrity sha512-dsKNQNdj6xA3T+QlADDA7mOSlX0qiMINjn0cgr+eGHGsbSHzTabcIogz2+p/iqP1Xs6EP/sS2SbqH+brGTbq0g== - functions-have-names@^1.2.2: version "1.2.3" resolved "https://registry.yarnpkg.com/functions-have-names/-/functions-have-names-1.2.3.tgz#0404fe4ee2ba2f607f0e0ec3c80bae994133b834" @@ -2697,10 +2695,10 @@ resolved "https://registry.yarnpkg.com/get-func-name/-/get-func-name-2.0.0.tgz#ead774abee72e20409433a066366023dd6887a41" integrity sha512-Hm0ixYtaSZ/V7C8FJrtZIuBBI+iSgL+1Aq82zSu8VQNB4S3Gk8e7Qs3VwBDJAhmRZcFqkl3tQu36g/Foh5I5ig== -get-intrinsic@^1.0.2, get-intrinsic@^1.1.0, get-intrinsic@^1.1.1, get-intrinsic@^1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.1.2.tgz#336975123e05ad0b7ba41f152ee4aadbea6cf598" - integrity sha512-Jfm3OyCxHh9DJyc28qGk+JmfkpO41A4XkneDSujN9MDXrm4oDKdHvndhZ2dN94+ERNfkYJWDclW6k2L/ZGHjXA== +get-intrinsic@^1.0.2, get-intrinsic@^1.1.0, get-intrinsic@^1.1.1, get-intrinsic@^1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.1.3.tgz#063c84329ad93e83893c7f4f243ef63ffa351385" + integrity sha512-QJVz1Tj7MS099PevUG5jvnt9tSkXN8K14dxQlikJuPt4uD9hHAHjLyLBiLR5zELelBdD9QNRAXZzsJx0WaDL9A== dependencies: function-bind "^1.1.1" has "^1.0.3" @@ -3086,10 +3084,10 @@ call-bind "^1.0.2" has-tostringtag "^1.0.0" -is-callable@^1.1.3, is-callable@^1.1.4, is-callable@^1.2.4: - version "1.2.4" - resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.2.4.tgz#47301d58dd0259407865547853df6d61fe471945" - integrity sha512-nsuwtxZfMX67Oryl9LCQ+upnC0Z0BgpwntpS89m1H/TLF0zNfzfLMV/9Wa/6MZsj0acpEjAO0KF1xT6ZdLl95w== +is-callable@^1.1.3, is-callable@^1.1.4, is-callable@^1.2.7: + version "1.2.7" + resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.2.7.tgz#3bc2a85ea742d9e36205dcacdd72ca1fdc51b055" + integrity sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA== is-date-object@^1.0.1: version "1.0.5" @@ -3233,6 +3231,11 @@ resolved "https://registry.yarnpkg.com/isstream/-/isstream-0.1.2.tgz#47e63f7af55afa6f92e1500e690eb8b8529c099a" integrity sha512-Yljz7ffyPbrLpLngrMtZ7NduUgVvi6wG9RJ9IUcyCd59YQ911PBJphODUcbOVbqYfxe1wuYf/LJ8PauMRwsM/g== +js-sdsl@^4.1.4: + version "4.1.5" + resolved "https://registry.yarnpkg.com/js-sdsl/-/js-sdsl-4.1.5.tgz#1ff1645e6b4d1b028cd3f862db88c9d887f26e2a" + integrity sha512-08bOAKweV2NUC1wqTtf3qZlnpOX/R2DU9ikpjOHs0H+ibQv3zpncVQg6um4uYtRtrwIX8M4Nh3ytK4HGlYAq7Q== + js-sha3@0.8.0, js-sha3@^0.8.0: version "0.8.0" resolved "https://registry.yarnpkg.com/js-sha3/-/js-sha3-0.8.0.tgz#b9b7a5da73afad7dedd0f8c463954cbde6818840" @@ -4025,10 +4028,10 @@ resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec" integrity sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A== -qs@6.10.3: - version "6.10.3" - resolved "https://registry.yarnpkg.com/qs/-/qs-6.10.3.tgz#d6cde1b2ffca87b5aa57889816c5f81535e22e8e" - integrity sha512-wr7M2E0OFRfIfJZjKGieI8lBKb7fRCH4Fv5KNPEs7gJ8jadvotdsS08PzOKR7opXhZ/Xkjtt3WF9g38drmyRqQ== +qs@6.11.0: + version "6.11.0" + resolved "https://registry.yarnpkg.com/qs/-/qs-6.11.0.tgz#fd0d963446f7a65e1367e01abd85429453f0c37a" + integrity sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q== dependencies: side-channel "^1.0.4" @@ -4203,10 +4206,10 @@ dependencies: queue-microtask "^1.2.2" -rxjs@^7.5.6: - version "7.5.6" - resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-7.5.6.tgz#0446577557862afd6903517ce7cae79ecb9662bc" - integrity sha512-dnyv2/YsXhnm461G+R/Pe5bWP41Nm6LBXEYWI6eiFP4fiwx6WRI/CD0zbdVAudd9xwLEF2IDcKXLHit0FYjUzw== +rxjs@^7.5.7: + version "7.5.7" + resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-7.5.7.tgz#2ec0d57fdc89ece220d2e702730ae8f1e49def39" + integrity sha512-z9MzKh/UcOqB3i20H6rtrlaE/CgjLOvheWK/9ILrbhROGTweAi1BaFsTT9FbwZi5Trr1qNRs+MXkhmR06awzQA== dependencies: tslib "^2.1.0" @@ -4220,6 +4223,15 @@ resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== +safe-regex-test@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/safe-regex-test/-/safe-regex-test-1.0.0.tgz#793b874d524eb3640d1873aad03596db2d4f2295" + integrity sha512-JBUUzyOgEwXQY1NuPtvcj/qcBDbDmEvWufhlnXZIm75DEHp+afM1r1ujJpJsV/gSM4t59tpDyPi1sd6ZaPFfsA== + dependencies: + call-bind "^1.0.2" + get-intrinsic "^1.1.3" + is-regex "^1.1.4" + "safer-buffer@>= 2.1.2 < 3", safer-buffer@^2.0.2, safer-buffer@^2.1.0, safer-buffer@~2.1.0: version "2.1.2" resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" @@ -4250,9 +4262,9 @@ integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw== semver@^7.3.7: - version "7.3.7" - resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.7.tgz#12c5b649afdbf9049707796e22a4028814ce523f" - integrity sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g== + version "7.3.8" + resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.8.tgz#07a78feafb3f7b32347d725e33de7e2a2df67798" + integrity sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A== dependencies: lru-cache "^6.0.0" @@ -4368,10 +4380,10 @@ resolved "https://registry.yarnpkg.com/slash/-/slash-3.0.0.tgz#6539be870c165adbd5240220dbe361f1bc4d4634" integrity sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q== -solc@0.8.14-fixed: - version "0.8.14-fixed" - resolved "https://registry.yarnpkg.com/solc/-/solc-0.8.14-fixed.tgz#a730a1e8259ac06313f6b7287df046ebe1dddc13" - integrity sha512-jFYa2fKbk95olckuDbhs9kbtaUhLRllM7aC++mLinJBUcdHbaHVM8LxHaJpOIDdnHBV9TpIP4XBybVugqMDyhA== +solc@0.8.17: + version "0.8.17" + resolved "https://registry.yarnpkg.com/solc/-/solc-0.8.17.tgz#c748fec6a64bf029ec406aa9b37e75938d1115ae" + integrity sha512-Dtidk2XtTTmkB3IKdyeg6wLYopJnBVxdoykN8oP8VY3PQjN16BScYoUJTXFm2OP7P0hXNAqWiJNmmfuELtLf8g== dependencies: command-exists "^1.2.8" commander "^8.1.0" @@ -4666,14 +4678,14 @@ is-typedarray "^1.0.0" typescript@^4.7.2: - version "4.8.3" - resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.8.3.tgz#d59344522c4bc464a65a730ac695007fdb66dd88" - integrity sha512-goMHfm00nWPa8UvR/CPSvykqf6dVV8x/dp0c5mFTMTIu0u0FlGWRioyy7Nn0PGAdHxpJZnuO/ut+PpQ8UiHAig== + version "4.8.4" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.8.4.tgz#c464abca159669597be5f96b8943500b238e60e6" + integrity sha512-QCh+85mCy+h0IGff8r5XWzOVSbBO+KfeYrMQh7NJ58QujwcE22u+NUSmUxqF+un70P9GXKxa2HCNiTTMJknyjQ== uglify-js@^3.1.4: - version "3.17.0" - resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-3.17.0.tgz#55bd6e9d19ce5eef0d5ad17cd1f587d85b180a85" - integrity sha512-aTeNPVmgIMPpm1cxXr2Q/nEbvkmV8yq66F3om7X3P/cvOXQ0TMQ64Wk63iyT1gPlmdmGzjGpyLh1f3y8MZWXGg== + version "3.17.3" + resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-3.17.3.tgz#f0feedf019c4510f164099e8d7e72ff2d7304377" + integrity sha512-JmMFDME3iufZnBpyKL+uS78LRiC+mK55zWfM5f/pWBJfpOttXAqYfdDGRukYhJuyRinvPVAtUhvy7rlDybNtFg== ultron@~1.1.0: version "1.1.1" @@ -4700,10 +4712,10 @@ resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec" integrity sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ== -update-browserslist-db@^1.0.5: - version "1.0.7" - resolved "https://registry.yarnpkg.com/update-browserslist-db/-/update-browserslist-db-1.0.7.tgz#16279639cff1d0f800b14792de43d97df2d11b7d" - integrity sha512-iN/XYesmZ2RmmWAiI4Z5rq0YqSiv0brj9Ce9CfhNE4xIW2h+MFxcgkxIzZ+ShkFPUkjU3gQ+3oypadD3RAMtrg== +update-browserslist-db@^1.0.9: + version "1.0.10" + resolved "https://registry.yarnpkg.com/update-browserslist-db/-/update-browserslist-db-1.0.10.tgz#0f54b876545726f17d00cd9a2561e6dade943ff3" + integrity sha512-OztqDenkfFkbSG+tRxBeAnCVPckDBcvibKd35yDONx6OU8N7sqgwc7rCbkJ/WcYtVRZ4ba68d6byhC21GFh7sQ== dependencies: escalade "^3.1.1" picocolors "^1.0.0" @@ -4793,85 +4805,85 @@ resolved "https://registry.yarnpkg.com/web-streams-polyfill/-/web-streams-polyfill-3.2.1.tgz#71c2718c52b45fd49dbeee88634b3a60ceab42a6" integrity sha512-e0MO3wdXWKrLbL0DgGnUV7WHVuw9OUvL4hjgnPkIeEvESk74gAITi5G606JtZPp39cd8HA9VQzCIvA49LpPN5Q== -web3-bzz@1.7.5: - version "1.7.5" - resolved "https://registry.yarnpkg.com/web3-bzz/-/web3-bzz-1.7.5.tgz#edeb262c3a6619109763077a94172513cf07cdde" - integrity sha512-Z53sY0YK/losqjJncmL4vP0zZI9r6tiXg6o7R6e1JD2Iy7FH3serQvU+qXmPjqEBzsnhf8wTG+YcBPB3RHpr0Q== +web3-bzz@1.8.0: + version "1.8.0" + resolved "https://registry.yarnpkg.com/web3-bzz/-/web3-bzz-1.8.0.tgz#2023676d7c17ea36512bf76eb310755a02a3d464" + integrity sha512-caDtdKeLi7+2Vb+y+cq2yyhkNjnxkFzVW0j1DtemarBg3dycG1iEl75CVQMLNO6Wkg+HH9tZtRnUyFIe5LIUeQ== dependencies: "@types/node" "^12.12.6" got "12.1.0" swarm-js "^0.1.40" -web3-core-helpers@1.7.5: - version "1.7.5" - resolved "https://registry.yarnpkg.com/web3-core-helpers/-/web3-core-helpers-1.7.5.tgz#e97b3ecac787ade4b9390807a86aca78ed97872b" - integrity sha512-lDDjTks6Q6aNUO87RYrY2xub3UWTKr/RIWxpHJODEqkLxZS1dWdyliJ6aIx3031VQwsNT5HE7NvABe/t0p3iDQ== +web3-core-helpers@1.8.0: + version "1.8.0" + resolved "https://registry.yarnpkg.com/web3-core-helpers/-/web3-core-helpers-1.8.0.tgz#5dcfdda1a4ea277041d912003198f1334ca29d7c" + integrity sha512-nMAVwZB3rEp/khHI2BvFy0e/xCryf501p5NGjswmJtEM+Zrd3Biaw52JrB1qAZZIzCA8cmLKaOgdfamoDOpWdw== dependencies: - web3-eth-iban "1.7.5" - web3-utils "1.7.5" + web3-eth-iban "1.8.0" + web3-utils "1.8.0" -web3-core-method@1.7.5: - version "1.7.5" - resolved "https://registry.yarnpkg.com/web3-core-method/-/web3-core-method-1.7.5.tgz#ffe8883c169468f0e4d13509377f2d8876d9b7be" - integrity sha512-ApTvq1Llzlbxmy0n4L7QaE6NodIsR80VJqk8qN4kLg30SGznt/pNJFebryLI2kpyDmxSgj1TjEWzmHJBp6FhYg== +web3-core-method@1.8.0: + version "1.8.0" + resolved "https://registry.yarnpkg.com/web3-core-method/-/web3-core-method-1.8.0.tgz#9c2da8896808917d1679c319f19e2174ba17086c" + integrity sha512-c94RAzo3gpXwf2rf8rL8C77jOzNWF4mXUoUfZYYsiY35cJFd46jQDPI00CB5+ZbICTiA5mlVzMj4e7jAsTqiLA== dependencies: "@ethersproject/transactions" "^5.6.2" - web3-core-helpers "1.7.5" - web3-core-promievent "1.7.5" - web3-core-subscriptions "1.7.5" - web3-utils "1.7.5" + web3-core-helpers "1.8.0" + web3-core-promievent "1.8.0" + web3-core-subscriptions "1.8.0" + web3-utils "1.8.0" -web3-core-promievent@1.7.5: - version "1.7.5" - resolved "https://registry.yarnpkg.com/web3-core-promievent/-/web3-core-promievent-1.7.5.tgz#56a9b06a20e20a0a89d2ab7f88d44c8ae01d5b62" - integrity sha512-uZ1VRErVuhiLtHlyt3oEH/JSvAf6bWPndChHR9PG7i1Zfqm6ZVCeM91ICTPmiL8ddsGQOxASpnJk4vhApcTIww== +web3-core-promievent@1.8.0: + version "1.8.0" + resolved "https://registry.yarnpkg.com/web3-core-promievent/-/web3-core-promievent-1.8.0.tgz#979765fd4d37ab0f158f0ee54037b279b737bd53" + integrity sha512-FGLyjAuOaAQ+ZhV6iuw9tg/9WvIkSZXKHQ4mdTyQ8MxVraOtFivOCbuLLsGgapfHYX+RPxsc1j1YzQjKoupagQ== dependencies: eventemitter3 "4.0.4" -web3-core-requestmanager@1.7.5: - version "1.7.5" - resolved "https://registry.yarnpkg.com/web3-core-requestmanager/-/web3-core-requestmanager-1.7.5.tgz#be18fc99642689aeb2e016fa43fb47bb9e8c94ce" - integrity sha512-3KpfxW/wVH4mgwWEsSJGHKrtRVoijWlDxtUrm17xgtqRNZ2mFolifKnHAUKa0fY48C9CrxmcCiMIi3W4G6WYRw== +web3-core-requestmanager@1.8.0: + version "1.8.0" + resolved "https://registry.yarnpkg.com/web3-core-requestmanager/-/web3-core-requestmanager-1.8.0.tgz#06189df80cf52d24a195a7ef655031afe8192df3" + integrity sha512-2AoYCs3Owl5foWcf4uKPONyqFygSl9T54L8b581U16nsUirjhoTUGK/PBhMDVcLCmW4QQmcY5A8oPFpkQc1TTg== dependencies: util "^0.12.0" - web3-core-helpers "1.7.5" - web3-providers-http "1.7.5" - web3-providers-ipc "1.7.5" - web3-providers-ws "1.7.5" + web3-core-helpers "1.8.0" + web3-providers-http "1.8.0" + web3-providers-ipc "1.8.0" + web3-providers-ws "1.8.0" -web3-core-subscriptions@1.7.5: - version "1.7.5" - resolved "https://registry.yarnpkg.com/web3-core-subscriptions/-/web3-core-subscriptions-1.7.5.tgz#c0e25610768ea9d9f9107b4ac74b6b6573125e00" - integrity sha512-YK6utQ7Wwjbe4XZOIA8quWGBPi1lFDS1A+jQYwxKKrCvm6BloBNc3FhvrcSYlDhLe/kOy8+2Je8i9amndgT4ww== +web3-core-subscriptions@1.8.0: + version "1.8.0" + resolved "https://registry.yarnpkg.com/web3-core-subscriptions/-/web3-core-subscriptions-1.8.0.tgz#ff66ae4467c8cb4716367248bcefb1845c0f8b83" + integrity sha512-7lHVRzDdg0+Gcog55lG6Q3D8JV+jN+4Ly6F8cSn9xFUAwOkdbgdWsjknQG7t7CDWy21DQkvdiY2BJF8S68AqOA== dependencies: eventemitter3 "4.0.4" - web3-core-helpers "1.7.5" + web3-core-helpers "1.8.0" -web3-core@1.7.5: - version "1.7.5" - resolved "https://registry.yarnpkg.com/web3-core/-/web3-core-1.7.5.tgz#8ee2ca490230a30ca970cb9f308eb65b76405e1d" - integrity sha512-UgOWXZr1fR/3cUQJKWbfMwRxj1/N7o6RSd/dHqdXBlOD+62EjNZItFmLRg5veq5kp9YfXzrNw9bnDkXfsL+nKQ== +web3-core@1.8.0: + version "1.8.0" + resolved "https://registry.yarnpkg.com/web3-core/-/web3-core-1.8.0.tgz#90afce527ac1b1dff8cbed2acbc0336530b8aacf" + integrity sha512-9sCA+Z02ci6zoY2bAquFiDjujRwmSKHiSGi4B8IstML8okSytnzXk1izHYSynE7ahIkguhjWAuXFvX76F5rAbA== dependencies: "@types/bn.js" "^5.1.0" "@types/node" "^12.12.6" bignumber.js "^9.0.0" - web3-core-helpers "1.7.5" - web3-core-method "1.7.5" - web3-core-requestmanager "1.7.5" - web3-utils "1.7.5" + web3-core-helpers "1.8.0" + web3-core-method "1.8.0" + web3-core-requestmanager "1.8.0" + web3-utils "1.8.0" -web3-eth-abi@1.7.5: - version "1.7.5" - resolved "https://registry.yarnpkg.com/web3-eth-abi/-/web3-eth-abi-1.7.5.tgz#db9d6dbcc043a6e922252f3228686e9bbd50d7c9" - integrity sha512-qWHvF7sayxql9BD1yqK9sZRLBQ66eJzGeaU53Y1PRq2iFPrhY6NUWxQ3c3ps0rg+dyObvRbloviWpKXcS4RE/A== +web3-eth-abi@1.8.0: + version "1.8.0" + resolved "https://registry.yarnpkg.com/web3-eth-abi/-/web3-eth-abi-1.8.0.tgz#47fdff00bfdfa72064c9c612ff6369986598196d" + integrity sha512-xPeMb2hS9YLQK/Q5YZpkcmzoRGM+/R8bogSrYHhNC3hjZSSU0YRH+1ZKK0f9YF4qDZaPMI8tKWIMSCDIpjG6fg== dependencies: "@ethersproject/abi" "^5.6.3" - web3-utils "1.7.5" + web3-utils "1.8.0" -web3-eth-accounts@1.7.5: - version "1.7.5" - resolved "https://registry.yarnpkg.com/web3-eth-accounts/-/web3-eth-accounts-1.7.5.tgz#b37ee3aeebcc6bce3337636aeb272cbba0ece547" - integrity sha512-AzMLoTj3RGwKpyp3x3TtHrEeU4VpR99iMOD6NKrWSDumS6QEi0lCo+y7QZhdTlINw3iIA3SFIdvbAOO4NCHSDg== +web3-eth-accounts@1.8.0: + version "1.8.0" + resolved "https://registry.yarnpkg.com/web3-eth-accounts/-/web3-eth-accounts-1.8.0.tgz#960d947ee87a49d6c706dc6312334fbfbd6ff812" + integrity sha512-HQ/MDSv4bexwJLvnqsM6xpGE7c2NVOqyhzOZFyMUKXbIwIq85T3TaLnM9pCN7XqMpDcfxqiZ3q43JqQVkzHdmw== dependencies: "@ethereumjs/common" "^2.5.0" "@ethereumjs/tx" "^3.3.2" @@ -4880,127 +4892,127 @@ ethereumjs-util "^7.0.10" scrypt-js "^3.0.1" uuid "3.3.2" - web3-core "1.7.5" - web3-core-helpers "1.7.5" - web3-core-method "1.7.5" - web3-utils "1.7.5" + web3-core "1.8.0" + web3-core-helpers "1.8.0" + web3-core-method "1.8.0" + web3-utils "1.8.0" -web3-eth-contract@1.7.5: - version "1.7.5" - resolved "https://registry.yarnpkg.com/web3-eth-contract/-/web3-eth-contract-1.7.5.tgz#a032419579bcec062513a3d089ad0e89ac63d731" - integrity sha512-qab7NPJRKRlTs58ozsqK8YIEwWpxIm3vD/okSIKBGkFx5gIHWW+vGmMh5PDSfefLJM9rCd+T+Lc0LYvtME7uqg== +web3-eth-contract@1.8.0: + version "1.8.0" + resolved "https://registry.yarnpkg.com/web3-eth-contract/-/web3-eth-contract-1.8.0.tgz#58f4ce0bde74e5ce87663502e409a92abad7b2c5" + integrity sha512-6xeXhW2YoCrz2Ayf2Vm4srWiMOB6LawkvxWJDnUWJ8SMATg4Pgu42C/j8rz/enXbYWt2IKuj0kk8+QszxQbK+Q== dependencies: "@types/bn.js" "^5.1.0" - web3-core "1.7.5" - web3-core-helpers "1.7.5" - web3-core-method "1.7.5" - web3-core-promievent "1.7.5" - web3-core-subscriptions "1.7.5" - web3-eth-abi "1.7.5" - web3-utils "1.7.5" + web3-core "1.8.0" + web3-core-helpers "1.8.0" + web3-core-method "1.8.0" + web3-core-promievent "1.8.0" + web3-core-subscriptions "1.8.0" + web3-eth-abi "1.8.0" + web3-utils "1.8.0" -web3-eth-ens@1.7.5: - version "1.7.5" - resolved "https://registry.yarnpkg.com/web3-eth-ens/-/web3-eth-ens-1.7.5.tgz#fa0e287f5e6fae20531117b7467e21b482d58cab" - integrity sha512-k1Q0msdRv/wac2egpZBIwG3n/sa/KdrVmVJvFm471gLTL4xfUizV5qJjkDVf+ikf9JyDvWJTs5eWNUUbOFIw/A== +web3-eth-ens@1.8.0: + version "1.8.0" + resolved "https://registry.yarnpkg.com/web3-eth-ens/-/web3-eth-ens-1.8.0.tgz#f1937371eac54b087ebe2e871780c2710d39998d" + integrity sha512-/eFbQEwvsMOEiOhw9/iuRXCsPkqAmHHWuFOrThQkozRgcnSTRnvxkkRC/b6koiT5/HaKeUs4yQDg+/ixsIxZxA== dependencies: content-hash "^2.5.2" eth-ens-namehash "2.0.8" - web3-core "1.7.5" - web3-core-helpers "1.7.5" - web3-core-promievent "1.7.5" - web3-eth-abi "1.7.5" - web3-eth-contract "1.7.5" - web3-utils "1.7.5" + web3-core "1.8.0" + web3-core-helpers "1.8.0" + web3-core-promievent "1.8.0" + web3-eth-abi "1.8.0" + web3-eth-contract "1.8.0" + web3-utils "1.8.0" -web3-eth-iban@1.7.5: - version "1.7.5" - resolved "https://registry.yarnpkg.com/web3-eth-iban/-/web3-eth-iban-1.7.5.tgz#1a50efa42cabf1b731396d38bef6a8bf92b5ee1f" - integrity sha512-mn2W5t/1IpL8OZvzAabLKT4kvwRnZSJ9K0tctndl9sDNWkfITYQibEEhUaNNA50Q5fJKgVudHI/m0gwIVTyG8Q== +web3-eth-iban@1.8.0: + version "1.8.0" + resolved "https://registry.yarnpkg.com/web3-eth-iban/-/web3-eth-iban-1.8.0.tgz#3af8a0c95b5f7b0b81ab0bcd2075c1e5dda31520" + integrity sha512-4RbvUxcMpo/e5811sE3a6inJ2H4+FFqUVmlRYs0RaXaxiHweahSRBNcpO0UWgmlePTolj0rXqPT2oEr0DuC8kg== dependencies: bn.js "^5.2.1" - web3-utils "1.7.5" + web3-utils "1.8.0" -web3-eth-personal@1.7.5: - version "1.7.5" - resolved "https://registry.yarnpkg.com/web3-eth-personal/-/web3-eth-personal-1.7.5.tgz#615a3ddcf97aeea93e2a4569753c033fd7a495c5" - integrity sha512-txh2P/eN8I4AOUKFi9++KKddoD0tWfCuu9Y1Kc41jSRbk6smO88Fum0KWNmYFYhSCX2qiknS1DfqsONl3igoKQ== +web3-eth-personal@1.8.0: + version "1.8.0" + resolved "https://registry.yarnpkg.com/web3-eth-personal/-/web3-eth-personal-1.8.0.tgz#433c35e2e042844402a12d543c4126ea1494b478" + integrity sha512-L7FT4nR3HmsfZyIAhFpEctKkYGOjRC2h6iFKs9gnFCHZga8yLcYcGaYOBIoYtaKom99MuGBoosayWt/Twh7F5A== dependencies: "@types/node" "^12.12.6" - web3-core "1.7.5" - web3-core-helpers "1.7.5" - web3-core-method "1.7.5" - web3-net "1.7.5" - web3-utils "1.7.5" + web3-core "1.8.0" + web3-core-helpers "1.8.0" + web3-core-method "1.8.0" + web3-net "1.8.0" + web3-utils "1.8.0" -web3-eth@1.7.5: - version "1.7.5" - resolved "https://registry.yarnpkg.com/web3-eth/-/web3-eth-1.7.5.tgz#36906f50a6c35570cbc08871a33caa83dc131c9c" - integrity sha512-BucjvqZyDWYkGlsFX+OnOBub0YutlC1KZiNGibdmvtNX0NQK+8iw1uzAoL9yTTwCSszL7lnkFe8N+HCOl9B4Dw== +web3-eth@1.8.0: + version "1.8.0" + resolved "https://registry.yarnpkg.com/web3-eth/-/web3-eth-1.8.0.tgz#006974a5d5e30644d05814111f9e162a72e4a09c" + integrity sha512-hist52os3OT4TQFB/GxPSMxTh3995sz6LPvQpPvj7ktSbpg9RNSFaSsPlCT63wUAHA3PZb1FemkAIeQM5t72Lw== dependencies: - web3-core "1.7.5" - web3-core-helpers "1.7.5" - web3-core-method "1.7.5" - web3-core-subscriptions "1.7.5" - web3-eth-abi "1.7.5" - web3-eth-accounts "1.7.5" - web3-eth-contract "1.7.5" - web3-eth-ens "1.7.5" - web3-eth-iban "1.7.5" - web3-eth-personal "1.7.5" - web3-net "1.7.5" - web3-utils "1.7.5" + web3-core "1.8.0" + web3-core-helpers "1.8.0" + web3-core-method "1.8.0" + web3-core-subscriptions "1.8.0" + web3-eth-abi "1.8.0" + web3-eth-accounts "1.8.0" + web3-eth-contract "1.8.0" + web3-eth-ens "1.8.0" + web3-eth-iban "1.8.0" + web3-eth-personal "1.8.0" + web3-net "1.8.0" + web3-utils "1.8.0" -web3-net@1.7.5: - version "1.7.5" - resolved "https://registry.yarnpkg.com/web3-net/-/web3-net-1.7.5.tgz#87fbc00a9ca40515bf60c847c0092498887cfdc8" - integrity sha512-xwuCb2YWw49PmW81AJQ/G+Xi2ikRsYyZXSgyPt4LmZuKjiqg/6kSdK8lZvUi3Pi3wM+QDBXbpr73M/WEkW0KvA== +web3-net@1.8.0: + version "1.8.0" + resolved "https://registry.yarnpkg.com/web3-net/-/web3-net-1.8.0.tgz#9acff92d7c647d801bc68df0ff4416f104dbe789" + integrity sha512-kX6EAacK7QrOe7DOh0t5yHS5q2kxZmTCxPVwSz9io9xBeE4n4UhmzGJ/VfhP2eM3OPKYeypcR3LEO6zZ8xn2vw== dependencies: - web3-core "1.7.5" - web3-core-method "1.7.5" - web3-utils "1.7.5" + web3-core "1.8.0" + web3-core-method "1.8.0" + web3-utils "1.8.0" -web3-providers-http@1.7.5: - version "1.7.5" - resolved "https://registry.yarnpkg.com/web3-providers-http/-/web3-providers-http-1.7.5.tgz#144bb0c29007d1b766bafb0e20f80be050c7aa80" - integrity sha512-vPgr4Kzy0M3CHtoP/Bh7qwK/D9h2fhjpoqctdMWVJseOfeTgfOphCKN0uwV8w2VpZgDPXA8aeTdBx5OjmDdStA== +web3-providers-http@1.8.0: + version "1.8.0" + resolved "https://registry.yarnpkg.com/web3-providers-http/-/web3-providers-http-1.8.0.tgz#3fd1e569ead2095343fac17d53160a3bae674c23" + integrity sha512-/MqxwRzExohBWW97mqlCSW/+NHydGRyoEDUS1bAIF2YjfKFwyRtHgrEzOojzkC9JvB+8LofMvbXk9CcltpZapw== dependencies: abortcontroller-polyfill "^1.7.3" cross-fetch "^3.1.4" es6-promise "^4.2.8" - web3-core-helpers "1.7.5" + web3-core-helpers "1.8.0" -web3-providers-ipc@1.7.5: - version "1.7.5" - resolved "https://registry.yarnpkg.com/web3-providers-ipc/-/web3-providers-ipc-1.7.5.tgz#5b0f9b4f7340416953b8816d2e42e3f548d47372" - integrity sha512-aNHx+RAROzO+apDEzy8Zncj78iqWBadIXtpmFDg7uiTn8i+oO+IcP1Yni7jyzkltsysVJHgHWG4kPx50ANCK3Q== +web3-providers-ipc@1.8.0: + version "1.8.0" + resolved "https://registry.yarnpkg.com/web3-providers-ipc/-/web3-providers-ipc-1.8.0.tgz#d339a24c4d764e459e425d3ac868a551ac33e3ea" + integrity sha512-tAXHtVXNUOgehaBU8pzAlB3qhjn/PRpjdzEjzHNFqtRRTwzSEKOJxFeEhaUA4FzHnTlbnrs8ujHWUitcp1elfg== dependencies: oboe "2.1.5" - web3-core-helpers "1.7.5" + web3-core-helpers "1.8.0" -web3-providers-ws@1.7.5: - version "1.7.5" - resolved "https://registry.yarnpkg.com/web3-providers-ws/-/web3-providers-ws-1.7.5.tgz#196b9e56a4a48f9bee54def56875ea53dec7c711" - integrity sha512-9uJNVVkIGC8PmM9kNbgPth56HDMSSsxZh3ZEENdwO3LNWemaADiQYUDCsD/dMVkn0xsGLHP5dgAy4Q5msqySLg== +web3-providers-ws@1.8.0: + version "1.8.0" + resolved "https://registry.yarnpkg.com/web3-providers-ws/-/web3-providers-ws-1.8.0.tgz#a0a73e0606981ea32bed40d215000a64753899de" + integrity sha512-bcZtSifsqyJxwkfQYamfdIRp4nhj9eJd7cxHg1uUkfLJK125WP96wyJL1xbPt7qt0MpfnTFn8/UuIqIB6nFENg== dependencies: eventemitter3 "4.0.4" - web3-core-helpers "1.7.5" + web3-core-helpers "1.8.0" websocket "^1.0.32" -web3-shh@1.7.5: - version "1.7.5" - resolved "https://registry.yarnpkg.com/web3-shh/-/web3-shh-1.7.5.tgz#742e27f5c44bea6d7adef3a49b085e0fcd6aa621" - integrity sha512-aCIWJyLMH5H76OybU4ZpUCJ93yNOPATGhJ+KboRPU8QZDzS2CcVhtEzyl27bbvw+rSnVroMLqBgTXBB4mmKI7A== +web3-shh@1.8.0: + version "1.8.0" + resolved "https://registry.yarnpkg.com/web3-shh/-/web3-shh-1.8.0.tgz#b4abbf4f59d097ce2f74360e61e2e5c0bd6507c7" + integrity sha512-DNRgSa9Jf9xYFUGKSMylrf+zt3MPjhI2qF+UWX07o0y3+uf8zalDGiJOWvIS4upAsdPiKKVJ7co+Neof47OMmg== dependencies: - web3-core "1.7.5" - web3-core-method "1.7.5" - web3-core-subscriptions "1.7.5" - web3-net "1.7.5" + web3-core "1.8.0" + web3-core-method "1.8.0" + web3-core-subscriptions "1.8.0" + web3-net "1.8.0" -web3-utils@1.7.5: - version "1.7.5" - resolved "https://registry.yarnpkg.com/web3-utils/-/web3-utils-1.7.5.tgz#081a952ac6e0322e25ac97b37358a43c7372ef6a" - integrity sha512-9AqNOziQky4wNQadEwEfHiBdOZqopIHzQQVzmvvv6fJwDSMhP+khqmAZC7YTiGjs0MboyZ8tWNivqSO1699XQw== +web3-utils@1.8.0: + version "1.8.0" + resolved "https://registry.yarnpkg.com/web3-utils/-/web3-utils-1.8.0.tgz#0a506f8c6af9a2ad6ba79689892662769534fc03" + integrity sha512-7nUIl7UWpLVka2f09CMbKOSEvorvHnaugIabU4mj7zfMvm0tSByLcEu3eyV9qgS11qxxLuOkzBIwCstTflhmpQ== dependencies: bn.js "^5.2.1" ethereum-bloom-filters "^1.0.6" @@ -5011,17 +5023,17 @@ utf8 "3.0.0" web3@^1.7.3: - version "1.7.5" - resolved "https://registry.yarnpkg.com/web3/-/web3-1.7.5.tgz#4e185d2058195b5775109b3f27cdea65a34a036e" - integrity sha512-3jHZTWyXt975AOXgnZKayiSWDLpoSKk9fZtLk1hURQtt7AdSbXPT8AK9ooBCm0Dt3GYaOeNcHGaiHC3gtyqhLg== + version "1.8.0" + resolved "https://registry.yarnpkg.com/web3/-/web3-1.8.0.tgz#3ca5f0b32de6a1f626407740411219035b5fde64" + integrity sha512-sldr9stK/SALSJTgI/8qpnDuBJNMGjVR84hJ+AcdQ+MLBGLMGsCDNubCoyO6qgk1/Y9SQ7ignegOI/7BPLoiDA== dependencies: - web3-bzz "1.7.5" - web3-core "1.7.5" - web3-eth "1.7.5" - web3-eth-personal "1.7.5" - web3-net "1.7.5" - web3-shh "1.7.5" - web3-utils "1.7.5" + web3-bzz "1.8.0" + web3-core "1.8.0" + web3-eth "1.8.0" + web3-eth-personal "1.8.0" + web3-net "1.8.0" + web3-shh "1.8.0" + web3-utils "1.8.0" webidl-conversions@^3.0.0: version "3.0.1" @@ -5116,6 +5128,11 @@ safe-buffer "~5.1.0" ultron "~1.1.0" +ws@^8.8.1: + version "8.9.0" + resolved "https://registry.yarnpkg.com/ws/-/ws-8.9.0.tgz#2a994bb67144be1b53fe2d23c53c028adeb7f45e" + integrity sha512-Ja7nszREasGaYUYCI2k4lCKIRTt+y7XuqVoHR44YpI49TtryyqbqvDMn5eqfW7e6HzTukDRIsXqzVHScqRcafg== + xhr-request-promise@^0.1.2: version "0.1.3" resolved "https://registry.yarnpkg.com/xhr-request-promise/-/xhr-request-promise-0.1.3.tgz#2d5f4b16d8c6c893be97f1a62b0ed4cf3ca5f96c" @@ -5209,12 +5226,12 @@ y18n "^5.0.5" yargs-parser "^20.2.2" -yargs@^17.5.1: - version "17.5.1" - resolved "https://registry.yarnpkg.com/yargs/-/yargs-17.5.1.tgz#e109900cab6fcb7fd44b1d8249166feb0b36e58e" - integrity sha512-t6YAJcxDkNX7NFYiVtKvWUz8l+PaKTLiL63mJYWR2GnHq2gjEWISzsLp9wg3aY36dY1j+gfIEL3pIF+XlJJfbA== +yargs@^17.6.0: + version "17.6.0" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-17.6.0.tgz#e134900fc1f218bc230192bdec06a0a5f973e46c" + integrity sha512-8H/wTDqlSwoSnScvV2N/JHfLWOKuh5MVla9hqLjK3nsfyy6Y4kDSYSvkU5YCUEPOSnRXfIyx3Sq+B/IWudTo4g== dependencies: - cliui "^7.0.2" + cliui "^8.0.1" escalade "^3.1.1" get-caller-file "^2.0.5" require-directory "^2.1.1" -- gitstuff