From 77e366b9e580ca6ed98bfc854195d023a8425aa4 Mon Sep 17 00:00:00 2001 From: Fahrrader Date: Tue, 27 Sep 2022 08:21:31 +0000 Subject: [PATCH] tests(nesting): revert majority of last commit + refactor token and collection naming convention --- --- a/tests/src/fungible.test.ts +++ b/tests/src/fungible.test.ts @@ -15,7 +15,9 @@ // along with Unique Network. If not, see . import {IKeyringPair} from '@polkadot/types/types'; -import {itSub, usingPlaygrounds, expect, U128_MAX} from './util/playgrounds'; +import {itSub, usingPlaygrounds, expect} from './util/playgrounds'; + +const U128_MAX = (1n << 128n) - 1n; describe('integration test: Fungible functionality:', () => { let alice: IKeyringPair; --- a/tests/src/nesting/graphs.test.ts +++ b/tests/src/nesting/graphs.test.ts @@ -16,8 +16,7 @@ import {IKeyringPair} from '@polkadot/types/types'; import {expect, itSub, usingPlaygrounds} from '../util/playgrounds'; -import {ITokenNonfungible} from '../util/playgrounds/types'; -import {UniqueHelper} from '../util/playgrounds/unique'; +import {UniqueHelper, UniqueNFToken} from '../util/playgrounds/unique'; /** * ```dot @@ -26,7 +25,7 @@ * 8 -> 5 * ``` */ -async function buildComplexObjectGraph(helper: UniqueHelper, sender: IKeyringPair): Promise { +async function buildComplexObjectGraph(helper: UniqueHelper, sender: IKeyringPair): Promise { const collection = await helper.nft.mintCollection(sender, {permissions: {nesting: {tokenOwner: true}}}); const tokens = await collection.mintMultipleTokens(sender, Array(8).fill({owner: {Substrate: sender.address}})); --- a/tests/src/nesting/properties.test.ts +++ b/tests/src/nesting/properties.test.ts @@ -16,8 +16,7 @@ import {IKeyringPair} from '@polkadot/types/types'; import {itSub, Pallets, requirePalletsOrSkip, usingPlaygrounds, expect} from '../util/playgrounds'; -import {ICollectionBase, ICollectionNFT, ITokenNonfungible, ICollectionRFT, ITokenRefungible} from '../util/playgrounds/types'; -import {UniqueHelper} from '../util/playgrounds/unique'; +import {UniqueHelper, UniqueBaseCollection, UniqueNFTCollection, UniqueNFToken, UniqueRFTCollection, UniqueRFToken} from '../util/playgrounds/unique'; // ---------- COLLECTION PROPERTIES @@ -37,7 +36,7 @@ expect(await collection.getProperties()).to.be.empty; }); - async function testSetsPropertiesForCollection(collection: ICollectionBase) { + async function testSetsPropertiesForCollection(collection: UniqueBaseCollection) { // As owner await expect(collection.setProperties(alice, [{key: 'electron', value: 'come bond'}])).to.be.fulfilled; @@ -61,7 +60,7 @@ await testSetsPropertiesForCollection(await helper.rft.mintCollection(alice)); }); - async function testCheckValidNames(collection: ICollectionBase) { + async function testCheckValidNames(collection: UniqueBaseCollection) { // alpha symbols await expect(collection.setProperties(alice, [{key: 'answer'}])).to.be.fulfilled; @@ -95,7 +94,7 @@ await testCheckValidNames(await helper.rft.mintCollection(alice)); }); - async function testChangesProperties(collection: ICollectionBase) { + 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 @@ -116,7 +115,7 @@ await testChangesProperties(await helper.rft.mintCollection(alice)); }); - async function testDeleteProperties(collection: ICollectionBase) { + 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; @@ -147,7 +146,7 @@ }); }); - async function testFailsSetPropertiesIfNotOwnerOrAdmin(collection: ICollectionBase) { + 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/); @@ -162,7 +161,7 @@ await testFailsSetPropertiesIfNotOwnerOrAdmin(await helper.rft.mintCollection(alice)); }); - async function testFailsSetPropertiesThatExeedLimits(collection: ICollectionBase) { + 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 @@ -191,7 +190,7 @@ await testFailsSetPropertiesThatExeedLimits(await helper.rft.mintCollection(alice)); }); - async function testFailsSetMorePropertiesThanAllowed(collection: ICollectionBase) { + async function testFailsSetMorePropertiesThanAllowed(collection: UniqueBaseCollection) { const propertiesToBeSet = []; for (let i = 0; i < 65; i++) { propertiesToBeSet.push({ @@ -214,7 +213,7 @@ await testFailsSetMorePropertiesThanAllowed(await helper.rft.mintCollection(alice)); }); - async function testFailsSetPropertiesWithInvalidNames(collection: ICollectionBase) { + async function testFailsSetPropertiesWithInvalidNames(collection: UniqueBaseCollection) { const invalidProperties = [ [{key: 'electron', value: 'negative'}, {key: 'string theory', value: 'understandable'}], [{key: 'Mr/Sandman', value: 'Bring me a gene'}], @@ -281,7 +280,7 @@ expect(propertyRights).to.be.empty; }); - async function testSetsAccessRightsToProperties(collection: ICollectionNFT | ICollectionRFT) { + async function testSetsAccessRightsToProperties(collection: UniqueNFTCollection | UniqueRFTCollection) { await expect(collection.setTokenPropertyPermissions(alice, [{key: 'skullduggery', permission: {mutable: true}}])) .to.be.fulfilled; @@ -305,7 +304,7 @@ await testSetsAccessRightsToProperties(await helper.rft.mintCollection(alice)); }); - async function testChangesAccessRightsToProperty(collection: ICollectionNFT | ICollectionRFT) { + async function testChangesAccessRightsToProperty(collection: UniqueNFTCollection | UniqueRFTCollection) { await expect(collection.setTokenPropertyPermissions(alice, [{key: 'skullduggery', permission: {mutable: true, collectionAdmin: true}}])) .to.be.fulfilled; @@ -338,7 +337,7 @@ }); }); - async function testPreventsFromSettingAccessRightsNotAdminOrOwner(collection: ICollectionNFT | ICollectionRFT) { + async function testPreventsFromSettingAccessRightsNotAdminOrOwner(collection: UniqueNFTCollection | UniqueRFTCollection) { await expect(collection.setTokenPropertyPermissions(bob, [{key: 'skullduggery', permission: {mutable: true, tokenOwner: true}}])) .to.be.rejectedWith(/common\.NoPermission/); @@ -354,7 +353,7 @@ await testPreventsFromSettingAccessRightsNotAdminOrOwner(await helper.rft.mintCollection(alice)); }); - async function testPreventFromAddingTooManyPossibleProperties(collection: ICollectionNFT | ICollectionRFT) { + async function testPreventFromAddingTooManyPossibleProperties(collection: UniqueNFTCollection | UniqueRFTCollection) { const constitution = []; for (let i = 0; i < 65; i++) { constitution.push({ @@ -378,7 +377,7 @@ await testPreventFromAddingTooManyPossibleProperties(await helper.rft.mintCollection(alice)); }); - async function testPreventAccessRightsModifiedIfConstant(collection: ICollectionNFT | ICollectionRFT) { + async function testPreventAccessRightsModifiedIfConstant(collection: UniqueNFTCollection | UniqueRFTCollection) { await expect(collection.setTokenPropertyPermissions(alice, [{key: 'skullduggery', permission: {mutable: false, tokenOwner: true}}])) .to.be.fulfilled; @@ -399,7 +398,7 @@ await testPreventAccessRightsModifiedIfConstant(await helper.rft.mintCollection(alice)); }); - async function testPreventsAddingPropertiesWithInvalidNames(collection: ICollectionNFT | ICollectionRFT) { + 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}}], @@ -469,7 +468,7 @@ ]; }); - async function testReadsYetEmptyProperties(token: ITokenNonfungible | ITokenRefungible) { + async function testReadsYetEmptyProperties(token: UniqueNFToken | UniqueRFToken) { const properties = await token.getProperties(); expect(properties).to.be.empty; @@ -489,7 +488,7 @@ await testReadsYetEmptyProperties(token); }); - async function testAssignPropertiesAccordingToPermissions(token: ITokenNonfungible | ITokenRefungible, pieces: bigint) { + async function testAssignPropertiesAccordingToPermissions(token: UniqueNFToken | UniqueRFToken, pieces: bigint) { await token.collection.addAdmin(alice, {Substrate: bob.address}); await token.transfer(alice, {Substrate: charlie.address}, pieces); @@ -535,7 +534,7 @@ await testAssignPropertiesAccordingToPermissions(token, 100n); }); - async function testChangesPropertiesAccordingPermission(token: ITokenNonfungible | ITokenRefungible, pieces: bigint) { + async function testChangesPropertiesAccordingPermission(token: UniqueNFToken | UniqueRFToken, pieces: bigint) { await token.collection.addAdmin(alice, {Substrate: bob.address}); await token.transfer(alice, {Substrate: charlie.address}, pieces); @@ -588,7 +587,7 @@ await testChangesPropertiesAccordingPermission(token, 100n); }); - async function testDeletePropertiesAccordingPermission(token: ITokenNonfungible | ITokenRefungible, pieces: bigint) { + async function testDeletePropertiesAccordingPermission(token: UniqueNFToken | UniqueRFToken, pieces: bigint) { await token.collection.addAdmin(alice, {Substrate: bob.address}); await token.transfer(alice, {Substrate: charlie.address}, pieces); @@ -799,7 +798,7 @@ return (await (mode == 'NFT' ? api.query.nonfungible : api.query.refungible).tokenProperties(collectionId, tokenId)).toJSON().consumedSpace; } - async function prepare(token: ITokenNonfungible | ITokenRefungible, pieces: bigint): Promise { + 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); @@ -823,7 +822,7 @@ return originalSpace; } - async function testForbidsChangingDeletingPropertiesUserOutsideOfPermissions(token: ITokenNonfungible | ITokenRefungible, pieces: bigint) { + async function testForbidsChangingDeletingPropertiesUserOutsideOfPermissions(token: UniqueNFToken | UniqueRFToken, pieces: bigint) { const originalSpace = await prepare(token, pieces); let i = 0; @@ -858,7 +857,7 @@ await testForbidsChangingDeletingPropertiesUserOutsideOfPermissions(token, 100n); }); - async function testForbidsChangingDeletingPropertiesIfPropertyImmutable(token: ITokenNonfungible | ITokenRefungible, pieces: bigint) { + async function testForbidsChangingDeletingPropertiesIfPropertyImmutable(token: UniqueNFToken | UniqueRFToken, pieces: bigint) { const originalSpace = await prepare(token, pieces); let i = 0; @@ -893,7 +892,7 @@ await testForbidsChangingDeletingPropertiesIfPropertyImmutable(token, 100n); }); - async function testForbidsAddingPropertiesIfPropertyNotDeclared(token: ITokenNonfungible | ITokenRefungible, pieces: bigint) { + async function testForbidsAddingPropertiesIfPropertyNotDeclared(token: UniqueNFToken | UniqueRFToken, pieces: bigint) { const originalSpace = await prepare(token, pieces); await expect( @@ -929,7 +928,7 @@ await testForbidsAddingPropertiesIfPropertyNotDeclared(token, 100n); }); - async function testForbidsAddingTooManyProperties(token: ITokenNonfungible | ITokenRefungible, pieces: bigint) { + async function testForbidsAddingTooManyProperties(token: UniqueNFToken | UniqueRFToken, pieces: bigint) { const originalSpace = await prepare(token, pieces); await expect( @@ -984,7 +983,7 @@ }); }); - async function prepare(helper: UniqueHelper): Promise { + async function prepare(helper: UniqueHelper): Promise { const collection = await helper.rft.mintCollection(alice); const token = await collection.mintToken(alice, 100n); --- a/tests/src/util/playgrounds/index.ts +++ b/tests/src/util/playgrounds/index.ts @@ -12,13 +12,6 @@ chai.use(chaiAsPromised); export const expect = chai.expect; -export const U128_MAX = (1n << 128n) - 1n; - -const MICROUNIQUE = 1_000_000_000_000n; -const MILLIUNIQUE = 1_000n * MICROUNIQUE; -const CENTIUNIQUE = 10n * MILLIUNIQUE; -export const UNIQUE = 100n * CENTIUNIQUE; - export const usingPlaygrounds = async (code: (helper: DevUniqueHelper, privateKey: (seed: string) => IKeyringPair) => Promise, url: string = config.substrateUrl) => { const silentConsole = new SilentConsole(); silentConsole.enable(); --- a/tests/src/util/playgrounds/types.ts +++ b/tests/src/util/playgrounds/types.ts @@ -2,7 +2,6 @@ // SPDX-License-Identifier: Apache-2.0 import {IKeyringPair} from '@polkadot/types/types'; -import {UniqueHelper} from './unique'; export interface IEvent { section: string; @@ -107,7 +106,7 @@ } } -export interface ITokenAddress { +export interface IToken { collectionId: number; tokenId: number; } @@ -168,169 +167,3 @@ export type TApiAllowedListeners = 'connected' | 'disconnected' | 'error' | 'ready' | 'decorated'; export type TUniqueNetworks = 'opal' | 'quartz' | 'unique'; export type TSigner = IKeyringPair; // | 'string' - -export interface ICollectionBase { - helper: UniqueHelper; - collectionId: number; - getData: () => Promise<{ - id: number; - name: string; - description: string; - tokensCount: number; - admins: ICrossAccountId[]; - normalizedOwner: TSubstrateAccount; - raw: any - } | null>; - getLastTokenId: () => Promise; - isTokenExists: (tokenId: number) => Promise; - getAdmins: () => Promise; - getAllowList: () => Promise; - getEffectiveLimits: () => Promise; - getProperties: (propertyKeys?: string[]) => Promise; - getTokenNextSponsored: (tokenId: number, addressObj: ICrossAccountId) => Promise; - setSponsor: (signer: TSigner, sponsorAddress: TSubstrateAccount) => Promise; - confirmSponsorship: (signer: TSigner) => Promise; - removeSponsor: (signer: TSigner) => Promise; - setLimits: (signer: TSigner, limits: ICollectionLimits) => Promise; - changeOwner: (signer: TSigner, ownerAddress: TSubstrateAccount) => Promise; - addAdmin: (signer: TSigner, adminAddressObj: ICrossAccountId) => Promise; - addToAllowList: (signer: TSigner, addressObj: ICrossAccountId) => Promise; - removeFromAllowList: (signer: TSigner, addressObj: ICrossAccountId) => Promise; - removeAdmin: (signer: TSigner, adminAddressObj: ICrossAccountId) => Promise; - setProperties: (signer: TSigner, properties: IProperty[]) => Promise; - deleteProperties: (signer: TSigner, propertyKeys: string[]) => Promise; - setPermissions: (signer: TSigner, permissions: ICollectionPermissions) => Promise; - enableNesting: (signer: TSigner, permissions: INestingPermissions) => Promise; - disableNesting: (signer: TSigner) => Promise; - burn: (signer: TSigner) => Promise; -} - -export interface ICollectionNFT extends ICollectionBase { - getTokenObject: (tokenId: number) => ITokenNonfungible; // todo:playgrounds - getTokensByAddress: (addressObj: ICrossAccountId) => Promise; - getToken: (tokenId: number, blockHashAt?: string) => Promise<{ - properties: IProperty[]; - owner: ICrossAccountId; - normalizedOwner: ICrossAccountId; - }| null>; - getTokenOwner: (tokenId: number, blockHashAt?: string) => Promise; - getTokenTopmostOwner: (tokenId: number, blockHashAt?: string) => Promise; - getTokenChildren: (tokenId: number, blockHashAt?: string) => Promise; // todo:playgrounds - getPropertyPermissions: (propertyKeys?: string[]) => Promise; - getTokenProperties: (tokenId: number, propertyKeys?: string[]) => Promise; - transferToken: (signer: TSigner, tokenId: number, addressObj: ICrossAccountId) => Promise; - transferTokenFrom: (signer: TSigner, tokenId: number, fromAddressObj: ICrossAccountId, toAddressObj: ICrossAccountId) => Promise; - approveToken: (signer: TSigner, tokenId: number, toAddressObj: ICrossAccountId) => Promise; - isTokenApproved: (tokenId: number, toAddressObj: ICrossAccountId) => Promise; - mintToken: (signer: TSigner, owner: ICrossAccountId, properties?: IProperty[]) => Promise;// todo:playgrounds - mintMultipleTokens: (signer: TSigner, tokens: {owner: ICrossAccountId, properties?: IProperty[]}[]) => Promise;// todo:playgrounds - burnToken: (signer: TSigner, tokenId: number) => Promise<{ - success: boolean, - token: number | null - }>; - burnTokenFrom: (signer: TSigner, tokenId: number, fromAddressObj: ICrossAccountId) => Promise; - setTokenProperties: (signer: TSigner, tokenId: number, properties: IProperty[]) => Promise; - deleteTokenProperties: (signer: TSigner, tokenId: number, propertyKeys: string[]) => Promise; - setTokenPropertyPermissions: (signer: TSigner, permissions: ITokenPropertyPermission[]) => Promise; - nestToken: (signer: TSigner, tokenId: number, toTokenObj: ITokenAddress) => Promise; - unnestToken: (signer: TSigner, tokenId: number, fromTokenObj: ITokenAddress, toAddressObj: ICrossAccountId) => Promise; -} - -export interface ICollectionRFT extends ICollectionBase { - getTokenObject: (tokenId: number) => ITokenRefungible; - getToken: (tokenId: number, blockHashAt?: string) => Promise<{ - properties: IProperty[]; - owner: ICrossAccountId; - normalizedOwner: ICrossAccountId; - }| null>; - getTokensByAddress: (addressObj: ICrossAccountId) => Promise; - getTop10TokenOwners: (tokenId: number) => Promise; - getTokenBalance: (tokenId: number, addressObj: ICrossAccountId) => Promise; - getTokenTotalPieces: (tokenId: number) => Promise; - getTokenApprovedPieces: (tokenId: number, fromAddressObj: ICrossAccountId, toAddressObj: ICrossAccountId) => Promise; - getPropertyPermissions: (propertyKeys?: string[] | null) => Promise; - getTokenProperties: (tokenId: number, propertyKeys?: string[]) => Promise; - transferToken: (signer: TSigner, tokenId: number, addressObj: ICrossAccountId, amount: bigint) => Promise; - transferTokenFrom: (signer: TSigner, tokenId: number, fromAddressObj: ICrossAccountId, toAddressObj: ICrossAccountId, amount: bigint) => Promise; - approveToken: (signer: TSigner, tokenId: number, toAddressObj: ICrossAccountId, amount: bigint) => Promise; - repartitionToken: (signer: TSigner, tokenId: number, amount: bigint) => Promise; - mintToken: (signer: TSigner, pieces: bigint, owner: ICrossAccountId, properties?: IProperty[]) => Promise; - mintMultipleTokens: (signer: TSigner, tokens: {pieces: bigint, owner: ICrossAccountId, properties?: IProperty[]}[]) => Promise; // todo:playgrounds - burnToken: (signer: TSigner, tokenId: number, amount: bigint) => Promise<{ - success: boolean, - token: number | null - }>; - burnTokenFrom: (signer: TSigner, tokenId: number, fromAddressObj: ICrossAccountId, amount: bigint) => Promise; - setTokenProperties: (signer: TSigner, tokenId: number, properties: IProperty[]) => Promise; - deleteTokenProperties: (signer: TSigner, tokenId: number, propertyKeys: string[]) => Promise; - setTokenPropertyPermissions: (signer: TSigner, permissions: ITokenPropertyPermission[]) => Promise; -} - -export interface ICollectionFT extends ICollectionBase { - getBalance: (addressObj: ICrossAccountId) => Promise; - getTotalPieces: () => Promise; - getApprovedTokens: (fromAddressObj: ICrossAccountId, toAddressObj: ICrossAccountId) => Promise; - getTop10Owners: () => Promise; - mint: (signer: TSigner, amount: bigint, owner: ICrossAccountId) => Promise; - mintWithOneOwner: (signer: TSigner, tokens: {value: bigint}[], owner: ICrossAccountId) => Promise; - transfer: (signer: TSigner, toAddressObj: ICrossAccountId, amount: bigint) => Promise; - transferFrom: (signer: TSigner, fromAddressObj: ICrossAccountId, toAddressObj: ICrossAccountId, amount: bigint) => Promise; - burnTokens: (signer: TSigner, amount: bigint) => Promise; - burnTokensFrom: (signer: TSigner, fromAddressObj: ICrossAccountId, amount: bigint) => Promise; - approveTokens: (signer: TSigner, toAddressObj: ICrossAccountId, amount: bigint) => Promise; -} - -export interface ITokenBase extends ITokenAddress { - collection: ICollectionNFT | ICollectionRFT; - getNextSponsored: (addressObj: ICrossAccountId) => Promise; - getProperties: (propertyKeys?: string[]) => Promise; - setProperties: (signer: TSigner, properties: IProperty[]) => Promise; - deleteProperties: (signer: TSigner, propertyKeys: string[]) => Promise; - nestingAccount: () => ICrossAccountId; - nestingAccountInLowerCase: () => ICrossAccountId; -} - -export interface ITokenNonfungible extends ITokenBase { - collection: ICollectionNFT; - getData: (blockHashAt?: string) => Promise<{ - properties: IProperty[]; - owner: ICrossAccountId; - normalizedOwner: ICrossAccountId; - }| null>; - getOwner: (blockHashAt?: string) => Promise; - getTopmostOwner: (blockHashAt?: string) => Promise; - getChildren: (blockHashAt?: string) => Promise; // todo:playgrounds - nest: (signer: TSigner, toTokenObj: ITokenAddress) => Promise; - unnest: (signer: TSigner, fromTokenObj: ITokenAddress, toAddressObj: ICrossAccountId) => Promise; - transfer: (signer: TSigner, addressObj: ICrossAccountId) => Promise; - transferFrom: (signer: TSigner, fromAddressObj: ICrossAccountId, toAddressObj: ICrossAccountId) => Promise; - approve: (signer: TSigner, toAddressObj: ICrossAccountId) => Promise; - isApproved: (toAddressObj: ICrossAccountId) => Promise; - burn: (signer: TSigner) => Promise<{ - success: boolean, - token: number | null - }>; - burnFrom: (signer: TSigner, fromAddressObj: ICrossAccountId) => Promise; -} - -export interface ITokenRefungible extends ITokenBase { - collection: ICollectionRFT; - getData: (blockHashAt?: string) => Promise<{ - properties: IProperty[]; - owner: ICrossAccountId; - normalizedOwner: ICrossAccountId; - }| null>; - getTop10Owners: () => Promise; - getBalance: (addressObj: ICrossAccountId) => Promise; - getTotalPieces: () => Promise; - getApprovedPieces: (fromAddressObj: ICrossAccountId, toAccountObj: ICrossAccountId) => Promise; - transfer: (signer: TSigner, addressObj: ICrossAccountId, amount: bigint) => Promise; - transferFrom: (signer: TSigner, fromAddressObj: ICrossAccountId, toAddressObj: ICrossAccountId, amount: bigint) => Promise; - approve: (signer: TSigner, toAddressObj: ICrossAccountId, amount: bigint) => Promise; - repartition: (signer: TSigner, amount: bigint) => Promise; - burn: (signer: TSigner, amount: bigint) => Promise<{ - success: boolean, - token: number | null - }>; - burnFrom: (signer: TSigner, fromAddressObj: ICrossAccountId, amount: bigint) => Promise; -} --- a/tests/src/util/playgrounds/unique.ts +++ b/tests/src/util/playgrounds/unique.ts @@ -9,7 +9,7 @@ import {ApiInterfaceEvents, SignerOptions} from '@polkadot/api/types'; import {encodeAddress, decodeAddress, keccakAsHex, evmToAddress, addressToEvm} from '@polkadot/util-crypto'; import {IKeyringPair} from '@polkadot/types/types'; -import {IApiListeners, IBlock, IEvent, IChainProperties, ICollectionCreationOptions, ICollectionLimits, ICollectionPermissions, ICrossAccountId, ICrossAccountIdLower, ILogger, INestingPermissions, IProperty, IStakingInfo, ISubstrateBalance, ITokenAddress, ITokenPropertyPermission, ITransactionResult, IUniqueHelperLog, TApiAllowedListeners, TEthereumAccount, TSigner, TSubstrateAccount, TUniqueNetworks, ICollectionBase, ICollectionNFT, ICollectionRFT, ITokenBase, ITokenNonfungible, ITokenRefungible, ICollectionFT} from './types'; +import {IApiListeners, IBlock, IEvent, IChainProperties, ICollectionCreationOptions, ICollectionLimits, ICollectionPermissions, ICrossAccountId, ICrossAccountIdLower, ILogger, INestingPermissions, IProperty, IStakingInfo, ISubstrateBalance, IToken, ITokenPropertyPermission, ITransactionResult, IUniqueHelperLog, TApiAllowedListeners, TEthereumAccount, TSigner, TSubstrateAccount, TUniqueNetworks} from './types'; export const crossAccountIdFromLower = (lowerAddress: ICrossAccountIdLower): ICrossAccountId => { const address = {} as ICrossAccountId; @@ -55,15 +55,15 @@ RPC: 'rpc', }; - static getTokenAccount(token: ITokenAddress): ICrossAccountId { + static getTokenAccount(token: IToken): ICrossAccountId { return {Ethereum: this.getTokenAddress(token)}; } - static getTokenAccountInLowerCase(token: ITokenAddress): ICrossAccountId { + static getTokenAccountInLowerCase(token: IToken): ICrossAccountId { return {Ethereum: this.getTokenAddress(token).toLowerCase()}; } - static getTokenAddress(token: ITokenAddress): string { + static getTokenAddress(token: IToken): string { return nesting.tokenIdToAddress(token.collectionId, token.tokenId); } @@ -1218,7 +1218,7 @@ * @example mintCollection(aliceKeyring, {name: 'New', description: "New collection", tokenPrefix: "NEW"}, "NFT") * @returns object of the created collection */ - async mintCollection(signer: TSigner, collectionOptions: ICollectionCreationOptions, mode: 'NFT' | 'RFT'): Promise { + async mintCollection(signer: TSigner, collectionOptions: ICollectionCreationOptions, mode: 'NFT' | 'RFT'): Promise { collectionOptions = JSON.parse(JSON.stringify(collectionOptions)) as ICollectionCreationOptions; // Clone object collectionOptions.mode = (mode === 'NFT') ? {nft: null} : {refungible: null}; for (const key of ['name', 'description', 'tokenPrefix']) { @@ -1260,8 +1260,8 @@ * @example getTokenObject(10, 5); * @returns instance of UniqueNFTToken */ - getTokenObject(collectionId: number, tokenId: number): UniqueNFTToken { - return new UniqueNFTToken(tokenId, this.getCollectionObject(collectionId)); + getTokenObject(collectionId: number, tokenId: number): UniqueNFToken { + return new UniqueNFToken(tokenId, this.getCollectionObject(collectionId)); } /** @@ -1352,7 +1352,7 @@ * @example getTokenChildren(10, 5); * @returns tokens whose depth of nesting is <= 5 */ - async getTokenChildren(collectionId: number, tokenId: number, blockHashAt?: string): Promise { + async getTokenChildren(collectionId: number, tokenId: number, blockHashAt?: string): Promise { let children; if(typeof blockHashAt === 'undefined') { children = await this.helper.callRpc('api.rpc.unique.tokenChildren', [collectionId, tokenId]); @@ -1373,7 +1373,7 @@ * @example nestToken(aliceKeyring, {collectionId: 10, tokenId: 5}, {collectionId: 10, tokenId: 4}); * @returns ```true``` if extrinsic success, otherwise ```false``` */ - async nestToken(signer: TSigner, tokenObj: ITokenAddress, rootTokenObj: ITokenAddress): Promise { + async nestToken(signer: TSigner, tokenObj: IToken, rootTokenObj: IToken): Promise { const rootTokenAddress = this.helper.util.getTokenAccount(rootTokenObj); const result = await this.transferToken(signer, tokenObj.collectionId, tokenObj.tokenId, rootTokenAddress); if(!result) { @@ -1391,7 +1391,7 @@ * @example unnestToken(aliceKeyring, {collectionId: 10, tokenId: 5}, {collectionId: 10, tokenId: 4}, {Substrate: "5DyN4Y92vZCjv38fg..."}); * @returns ```true``` if extrinsic success, otherwise ```false``` */ - async unnestToken(signer: TSigner, tokenObj: ITokenAddress, rootTokenObj: ITokenAddress, toAddressObj: ICrossAccountId): Promise { + async unnestToken(signer: TSigner, tokenObj: IToken, rootTokenObj: IToken, toAddressObj: ICrossAccountId): Promise { const rootTokenAddress = this.helper.util.getTokenAccount(rootTokenObj); const result = await this.transferTokenFrom(signer, tokenObj.collectionId, tokenObj.tokenId, rootTokenAddress, toAddressObj); if(!result) { @@ -1422,7 +1422,7 @@ * @param data token data * @returns created token object */ - async mintToken(signer: TSigner, data: { collectionId: number; owner: ICrossAccountId | string; properties?: IProperty[]; }): Promise { + async mintToken(signer: TSigner, data: { collectionId: number; owner: ICrossAccountId | string; properties?: IProperty[]; }): Promise { const creationResult = await this.helper.executeExtrinsic( signer, 'api.tx.unique.createItem', [data.collectionId, (typeof data.owner === 'string') ? {Substrate: data.owner} : data.owner, { @@ -1453,14 +1453,14 @@ * }]); * @returns ```true``` if extrinsic success, otherwise ```false``` */ - async mintMultipleTokens(signer: TSigner, collectionId: number, tokens: {owner: ICrossAccountId, properties?: IProperty[]}[]): Promise { + async mintMultipleTokens(signer: TSigner, collectionId: number, tokens: {owner: ICrossAccountId, properties?: IProperty[]}[]): Promise { const creationResult = await this.helper.executeExtrinsic( signer, 'api.tx.unique.createMultipleItemsEx', [collectionId, {NFT: tokens}], true, ); const collection = this.getCollectionObject(collectionId); - return this.helper.util.extractTokensFromCreationResult(creationResult).tokens.map((x: ITokenAddress) => collection.getTokenObject(x.tokenId)); + return this.helper.util.extractTokensFromCreationResult(creationResult).tokens.map((x: IToken) => collection.getTokenObject(x.tokenId)); } /** @@ -1481,7 +1481,7 @@ * }]); * @returns array of newly created tokens */ - async mintMultipleTokensWithOneOwner(signer: TSigner, collectionId: number, owner: ICrossAccountId, tokens: {properties?: IProperty[]}[]): Promise { + async mintMultipleTokensWithOneOwner(signer: TSigner, collectionId: number, owner: ICrossAccountId, tokens: {properties?: IProperty[]}[]): Promise { const rawTokens = []; for (const token of tokens) { const raw = {NFT: {properties: token.properties}}; @@ -1493,7 +1493,7 @@ true, ); const collection = this.getCollectionObject(collectionId); - return this.helper.util.extractTokensFromCreationResult(creationResult).tokens.map((x: ITokenAddress) => collection.getTokenObject(x.tokenId)); + return this.helper.util.extractTokensFromCreationResult(creationResult).tokens.map((x: IToken) => collection.getTokenObject(x.tokenId)); } /** @@ -1530,8 +1530,8 @@ * @example getTokenObject(10, 5); * @returns instance of UniqueNFTToken */ - getTokenObject(collectionId: number, tokenId: number): UniqueRFTToken { - return new UniqueRFTToken(tokenId, this.getCollectionObject(collectionId)); + getTokenObject(collectionId: number, tokenId: number): UniqueRFToken { + return new UniqueRFToken(tokenId, this.getCollectionObject(collectionId)); } /** @@ -1609,7 +1609,7 @@ * @example mintToken(aliceKeyring, {collectionId: 10, owner: {Substrate: '5GHoZe9c73RYbVzq...'}, pieces: 10000n}); * @returns created token object */ - async mintToken(signer: TSigner, data: { collectionId: number; owner: ICrossAccountId | string; pieces: bigint; properties?: IProperty[]; }): Promise { + async mintToken(signer: TSigner, data: { collectionId: number; owner: ICrossAccountId | string; pieces: bigint; properties?: IProperty[]; }): Promise { const creationResult = await this.helper.executeExtrinsic( signer, 'api.tx.unique.createItem', [data.collectionId, (typeof data.owner === 'string') ? {Substrate: data.owner} : data.owner, { @@ -1626,7 +1626,7 @@ return this.getTokenObject(data.collectionId, createdTokens.tokens[0].tokenId); } - async mintMultipleTokens(signer: TSigner, collectionId: number, tokens: {owner: ICrossAccountId, pieces: bigint, properties?: IProperty[]}[]): Promise { + async mintMultipleTokens(signer: TSigner, collectionId: number, tokens: {owner: ICrossAccountId, pieces: bigint, properties?: IProperty[]}[]): Promise { throw Error('Not implemented'); const creationResult = await this.helper.executeExtrinsic( signer, @@ -1634,7 +1634,7 @@ true, // `Unable to mint RFT tokens for ${label}`, ); const collection = this.getCollectionObject(collectionId); - return this.helper.util.extractTokensFromCreationResult(creationResult).tokens.map((x: ITokenAddress) => collection.getTokenObject(x.tokenId)); + return this.helper.util.extractTokensFromCreationResult(creationResult).tokens.map((x: IToken) => collection.getTokenObject(x.tokenId)); } /** @@ -1646,7 +1646,7 @@ * @example mintMultipleTokensWithOneOwner(aliceKeyring, 10, {Substrate: "5GHoZe9c73RYbVzq..."}, [{pieces: 100000n, properties: [{key: "gender", value: "male"}]}]); * @returns array of newly created RFT tokens */ - async mintMultipleTokensWithOneOwner(signer: TSigner, collectionId: number, owner: ICrossAccountId, tokens: {pieces: bigint, properties?: IProperty[]}[]): Promise { + async mintMultipleTokensWithOneOwner(signer: TSigner, collectionId: number, owner: ICrossAccountId, tokens: {pieces: bigint, properties?: IProperty[]}[]): Promise { const rawTokens = []; for (const token of tokens) { const raw = {ReFungible: {pieces: token.pieces, properties: token.properties}}; @@ -1658,7 +1658,7 @@ true, ); const collection = this.getCollectionObject(collectionId); - return this.helper.util.extractTokensFromCreationResult(creationResult).tokens.map((x: ITokenAddress) => collection.getTokenObject(x.tokenId)); + return this.helper.util.extractTokensFromCreationResult(creationResult).tokens.map((x: IToken) => collection.getTokenObject(x.tokenId)); } /** @@ -1985,7 +1985,7 @@ class BalanceGroup extends HelperGroup { /** - * Representation of the native token in the smallest unit + * Representation of the native token in the smallest unit - one OPAL (OPL), QUARTZ (QTZ), or UNIQUE (UNQ). * @example getOneTokenNominal() * @returns ```BigInt``` representation of the native token in the smallest unit, e.g. ```1_000_000_000_000_000_000n``` for QTZ. */ @@ -2223,7 +2223,7 @@ } -class UniqueCollectionBase implements ICollectionBase { +export class UniqueBaseCollection { helper: UniqueHelper; collectionId: number; @@ -2326,9 +2326,9 @@ } -class UniqueNFTCollection extends UniqueCollectionBase implements ICollectionNFT { +export class UniqueNFTCollection extends UniqueBaseCollection { getTokenObject(tokenId: number) { - return new UniqueNFTToken(tokenId, this); + return new UniqueNFToken(tokenId, this); } async getTokensByAddress(addressObj: ICrossAccountId) { @@ -2403,19 +2403,19 @@ return await this.helper.nft.setTokenPropertyPermissions(signer, this.collectionId, permissions); } - async nestToken(signer: TSigner, tokenId: number, toTokenObj: ITokenAddress) { + async nestToken(signer: TSigner, tokenId: number, toTokenObj: IToken) { return await this.helper.nft.nestToken(signer, {collectionId: this.collectionId, tokenId}, toTokenObj); } - async unnestToken(signer: TSigner, tokenId: number, fromTokenObj: ITokenAddress, toAddressObj: ICrossAccountId) { + async unnestToken(signer: TSigner, tokenId: number, fromTokenObj: IToken, toAddressObj: ICrossAccountId) { return await this.helper.nft.unnestToken(signer, {collectionId: this.collectionId, tokenId}, fromTokenObj, toAddressObj); } } -class UniqueRFTCollection extends UniqueCollectionBase implements ICollectionRFT { +export class UniqueRFTCollection extends UniqueBaseCollection { getTokenObject(tokenId: number) { - return new UniqueRFTToken(tokenId, this); + return new UniqueRFToken(tokenId, this); } async getToken(tokenId: number, blockHashAt?: string) { @@ -2496,7 +2496,7 @@ } -class UniqueFTCollection extends UniqueCollectionBase implements ICollectionFT { +export class UniqueFTCollection extends UniqueBaseCollection { async getBalance(addressObj: ICrossAccountId) { return await this.helper.ft.getBalance(this.collectionId, addressObj); } @@ -2543,7 +2543,7 @@ } -class UniqueTokenBase implements ITokenBase { +export class UniqueBaseToken { collection: UniqueNFTCollection | UniqueRFTCollection; collectionId: number; tokenId: number; @@ -2580,7 +2580,7 @@ } -class UniqueNFTToken extends UniqueTokenBase implements ITokenNonfungible { +export class UniqueNFToken extends UniqueBaseToken { collection: UniqueNFTCollection; constructor(tokenId: number, collection: UniqueNFTCollection) { @@ -2604,11 +2604,11 @@ return await this.collection.getTokenChildren(this.tokenId, blockHashAt); } - async nest(signer: TSigner, toTokenObj: ITokenAddress) { + async nest(signer: TSigner, toTokenObj: IToken) { return await this.collection.nestToken(signer, this.tokenId, toTokenObj); } - async unnest(signer: TSigner, fromTokenObj: ITokenAddress, toAddressObj: ICrossAccountId) { + async unnest(signer: TSigner, fromTokenObj: IToken, toAddressObj: ICrossAccountId) { return await this.collection.unnestToken(signer, this.tokenId, fromTokenObj, toAddressObj); } @@ -2637,7 +2637,7 @@ } } -class UniqueRFTToken extends UniqueTokenBase implements ITokenRefungible { +export class UniqueRFToken extends UniqueBaseToken { collection: UniqueRFTCollection; constructor(tokenId: number, collection: UniqueRFTCollection) { -- gitstuff