difftreelog
fixes
in: master
3 files changed
tests/src/createMultipleItems.test.tsdiffbeforeafterboth--- a/tests/src/createMultipleItems.test.ts
+++ b/tests/src/createMultipleItems.test.ts
@@ -8,7 +8,11 @@
import chaiAsPromised from 'chai-as-promised';
import privateKey from './substrate/privateKey';
import { default as usingApi, submitTransactionAsync, submitTransactionExpectFailAsync } from './substrate/substrate-api';
-import {createCollectionExpectSuccess, destroyCollectionExpectSuccess} from './util/helpers';
+import {
+ createCollectionExpectSuccess,
+ destroyCollectionExpectSuccess,
+ IReFungibleTokenDataType,
+} from './util/helpers';
chai.use(chaiAsPromised);
const expect = chai.expect;
@@ -47,9 +51,45 @@
expect(token1Data.VariableData.toString()).to.be.equal('0x31');
expect(token2Data.VariableData.toString()).to.be.equal('0x32');
expect(token3Data.VariableData.toString()).to.be.equal('0x33');
+ });
+ });
+
+ it('Create 0x31, 0x32, 0x33 items in active ReFungible collection and verify tokens data in chain', async () => {
+ await usingApi(async (api: ApiPromise) => {
+ const collectionId = await createCollectionExpectSuccess({mode: {type: 'ReFungible', decimalPoints: 0}});
+ const itemsListIndexBefore = await api.query.nft.itemListIndex(collectionId) as unknown as BN;
+ expect(itemsListIndexBefore.toNumber()).to.be.equal(0);
+ const Alice = privateKey('//Alice');
+ const args = [
+ { Refungible: ['0x31', '0x31'] },
+ { Refungible: ['0x32', '0x32'] },
+ { Refungible: ['0x33', '0x33'] },
+ ];
+ const createMultipleItemsTx = await api.tx.nft
+ .createMultipleItems(collectionId, Alice.address, args);
+ await submitTransactionAsync(Alice, createMultipleItemsTx);
+ const itemsListIndexAfter = await api.query.nft.itemListIndex(collectionId) as unknown as BN;
+ expect(itemsListIndexAfter.toNumber()).to.be.equal(3);
+ const token1Data = await api.query.nft.reFungibleItemList(collectionId, 1) as unknown as IReFungibleTokenDataType;
+ const token2Data = await api.query.nft.reFungibleItemList(collectionId, 2) as unknown as IReFungibleTokenDataType;
+ const token3Data = await api.query.nft.reFungibleItemList(collectionId, 3) as unknown as IReFungibleTokenDataType;
+
+ expect(token1Data.Owner[0].Owner.toString()).to.be.equal(Alice.address);
+ expect(token1Data.Owner[0].Fraction.toNumber()).to.be.equal(1);
+
+ expect(token2Data.Owner[0].Owner.toString()).to.be.equal(Alice.address);
+ expect(token2Data.Owner[0].Fraction.toNumber()).to.be.equal(1);
+
+ expect(token3Data.Owner[0].Owner.toString()).to.be.equal(Alice.address);
+ expect(token3Data.Owner[0].Fraction.toNumber()).to.be.equal(1);
- // garbage collection :-D
- await destroyCollectionExpectSuccess(collectionId);
+ expect(token1Data.ConstData.toString()).to.be.equal('0x31');
+ expect(token2Data.ConstData.toString()).to.be.equal('0x32');
+ expect(token3Data.ConstData.toString()).to.be.equal('0x33');
+
+ expect(token1Data.VariableData.toString()).to.be.equal('0x31');
+ expect(token2Data.VariableData.toString()).to.be.equal('0x32');
+ expect(token3Data.VariableData.toString()).to.be.equal('0x33');
});
});
});
@@ -60,15 +100,14 @@
const collectionId = await createCollectionExpectSuccess();
const Alice = privateKey('//Alice');
try {
+ const args = [{ invalid: null }, { invalid: null }, { invalid: null }];
const createMultipleItemsTx = await api.tx.nft
- .createMultipleItems(collectionId, Alice.address, ['UNKNOWN', 'UNKNOWN', 'UNKNOWN']);
+ .createMultipleItems(collectionId, Alice.address, args);
await expect(submitTransactionExpectFailAsync(Alice, createMultipleItemsTx)).to.be.rejected;
} catch (e) {
// tslint:disable-next-line:no-unused-expression
expect(e).to.be.exist;
}
- // garbage collection :-D
- await destroyCollectionExpectSuccess(collectionId);
});
});
@@ -79,8 +118,6 @@
const createMultipleItemsTx = await api.tx.nft
.createMultipleItems(collectionId + 1, Alice.address, ['NFT', 'NFT', 'NFT']);
await expect(submitTransactionExpectFailAsync(Alice, createMultipleItemsTx)).to.be.rejected;
- // garbage collection :-D
- await destroyCollectionExpectSuccess(collectionId);
});
});
@@ -97,21 +134,18 @@
const createMultipleItemsTx = await api.tx.nft
.createMultipleItems(collectionId, Alice.address, args);
await expect(submitTransactionExpectFailAsync(Alice, createMultipleItemsTx)).to.be.rejected;
- // garbage collection :-D
- await destroyCollectionExpectSuccess(collectionId);
- // Fungible
- const collectionIdFungible = await createCollectionExpectSuccess();
- const argsFungible = [
- { fungible: parseInt('1'.repeat(2049), 10) },
- { fungible: parseInt('2'.repeat(2049), 10) },
- { fungible: parseInt('3'.repeat(2049), 10) },
+ // ReFungible
+ const collectionIdReFungible =
+ await createCollectionExpectSuccess({mode: {type: 'ReFungible', decimalPoints: 0}});
+ const argsReFungible = [
+ { ReFungible: ['1'.repeat(2049), '1'.repeat(2049)] },
+ { ReFungible: ['2'.repeat(2049), '2'.repeat(2049)] },
+ { ReFungible: ['3'.repeat(2049), '3'.repeat(2049)] },
];
const createMultipleItemsTxFungible = await api.tx.nft
- .createMultipleItems(collectionIdFungible, Alice.address, argsFungible);
+ .createMultipleItems(collectionIdReFungible, Alice.address, argsReFungible);
await expect(submitTransactionExpectFailAsync(Alice, createMultipleItemsTxFungible)).to.be.rejected;
- // garbage collection :-D
- await destroyCollectionExpectSuccess(collectionId);
});
});
@@ -139,8 +173,6 @@
const createMultipleItemsTx = await api.tx.nft
.createMultipleItems(collectionId, Alice.address, args);
await expect(submitTransactionExpectFailAsync(Alice, createMultipleItemsTx)).to.be.rejected;
- // garbage collection :-D
- await destroyCollectionExpectSuccess(collectionId);
});
});
});
tests/src/substrate/substrate-api.tsdiffbeforeafterboth1//2// This file is subject to the terms and conditions defined in3// file 'LICENSE', which is part of this source code package.4//56import { WsProvider, ApiPromise } from "@polkadot/api";7import type { AccountId, Address, ApplyExtrinsicResult, DispatchError, DispatchInfo, EventRecord, Extrinsic, ExtrinsicStatus, Hash, RuntimeDispatchInfo } from '@polkadot/types/interfaces';8import { IKeyringPair } from "@polkadot/types/types";910import config from "../config";11import promisifySubstrate from "./promisify-substrate";12import { ApiOptions, SubmittableExtrinsic, ApiTypes } from "@polkadot/api/types";13import rtt from "../../../runtime_types.json";1415function defaultApiOptions(): ApiOptions {16 const wsProvider = new WsProvider(config.substrateUrl);17 return { provider: wsProvider, types: rtt };18}1920export default async function usingApi(action: (api: ApiPromise) => Promise<void>, settings: ApiOptions | undefined = undefined): Promise<void> {21 settings = settings || defaultApiOptions();22 let api: ApiPromise = new ApiPromise(settings);2324 try {25 await promisifySubstrate(api, async () => {26 if(api) {27 await api.isReadyOrError;28 await action(api);29 }30 })();31 } finally {32 await api.disconnect();33 }34}3536enum TransactionStatus {37 Success,38 Fail,39 NotReady40}4142function getTransactionStatus(events: EventRecord[], status: ExtrinsicStatus): TransactionStatus {43 if (status.isReady) {44 return TransactionStatus.NotReady;45 }46 if (status.isBroadcast) {47 return TransactionStatus.NotReady;48 } 49 if (status.isInBlock || status.isFinalized) {50 if(events.filter(e => e.event.data.method === 'ExtrinsicFailed').length > 0) {51 return TransactionStatus.Fail;52 }53 if(events.filter(e => e.event.data.method === 'ExtrinsicSuccess').length > 0) {54 return TransactionStatus.Success;55 }56 }5758 return TransactionStatus.Fail;59}6061export function submitTransactionAsync(sender: IKeyringPair, transaction: SubmittableExtrinsic<ApiTypes>): Promise<EventRecord[]> {62 return new Promise(async function(resolve, reject) {63 try {64 await transaction.signAndSend(sender, ({ events = [], status }) => {65 const transactionStatus = getTransactionStatus(events, status);6667 if (transactionStatus == TransactionStatus.Success) {68 resolve(events);69 } else if (transactionStatus == TransactionStatus.Fail) {70 console.log(`Something went wrong with transaction. Status: ${status}`);71 reject(events);72 }73 });74 } catch (e) {75 console.log("Error: ", e);76 reject(e);77 }78 });79}8081export function submitTransactionExpectFailAsync(sender: IKeyringPair, transaction: SubmittableExtrinsic<ApiTypes>): Promise<EventRecord[]> {82 const consoleError = console.error;83 const consoleLog = console.log;84 console.error = () => {};85 console.log = () => {};8687 return new Promise<EventRecord[]>(async function(res, rej) {88 const resolve = (rec: EventRecord[]) => {89 setTimeout(() => {90 res(rec);91 console.error = consoleError;92 console.log = consoleLog;93 });94 };95 const reject = (errror: any) => {96 setTimeout(() => {97 rej(errror);98 console.error = consoleError;99 console.log = consoleLog;100 });101 };102 try {103 await transaction.signAndSend(sender, ({ events = [], status }) => {104 const transactionStatus = getTransactionStatus(events, status);105106 console.log('transactionStatus', transactionStatus, 'events', events);107108 if (transactionStatus == TransactionStatus.Success) {109 resolve(events);110 } else if (transactionStatus == TransactionStatus.Fail) {111 reject(events);112 }113 });114 } catch (e) {115 reject(e);116 }117 });118}1//2// This file is subject to the terms and conditions defined in3// file 'LICENSE', which is part of this source code package.4//56import { WsProvider, ApiPromise } from "@polkadot/api";7import type { AccountId, Address, ApplyExtrinsicResult, DispatchError, DispatchInfo, EventRecord, Extrinsic, ExtrinsicStatus, Hash, RuntimeDispatchInfo } from '@polkadot/types/interfaces';8import { IKeyringPair } from "@polkadot/types/types";910import config from "../config";11import promisifySubstrate from "./promisify-substrate";12import { ApiOptions, SubmittableExtrinsic, ApiTypes } from "@polkadot/api/types";13import rtt from "../../../runtime_types.json";1415function defaultApiOptions(): ApiOptions {16 const wsProvider = new WsProvider(config.substrateUrl);17 return { provider: wsProvider, types: rtt };18}1920export default async function usingApi(action: (api: ApiPromise) => Promise<void>, settings: ApiOptions | undefined = undefined): Promise<void> {21 settings = settings || defaultApiOptions();22 let api: ApiPromise = new ApiPromise(settings);2324 try {25 await promisifySubstrate(api, async () => {26 if(api) {27 await api.isReadyOrError;28 await action(api);29 }30 })();31 } finally {32 await api.disconnect();33 }34}3536enum TransactionStatus {37 Success,38 Fail,39 NotReady40}4142function getTransactionStatus(events: EventRecord[], status: ExtrinsicStatus): TransactionStatus {43 if (status.isReady) {44 return TransactionStatus.NotReady;45 }46 if (status.isBroadcast) {47 return TransactionStatus.NotReady;48 } 49 if (status.isInBlock || status.isFinalized) {50 if(events.filter(e => e.event.data.method === 'ExtrinsicFailed').length > 0) {51 return TransactionStatus.Fail;52 }53 if(events.filter(e => e.event.data.method === 'ExtrinsicSuccess').length > 0) {54 return TransactionStatus.Success;55 }56 }5758 return TransactionStatus.Fail;59}6061export function submitTransactionAsync(sender: IKeyringPair, transaction: SubmittableExtrinsic<ApiTypes>): Promise<EventRecord[]> {62 return new Promise(async function(resolve, reject) {63 try {64 await transaction.signAndSend(sender, ({ events = [], status }) => {65 const transactionStatus = getTransactionStatus(events, status);6667 if (transactionStatus == TransactionStatus.Success) {68 resolve(events);69 } else if (transactionStatus == TransactionStatus.Fail) {70 console.log(`Something went wrong with transaction. Status: ${status}`);71 reject(events);72 }73 });74 } catch (e) {75 console.log("Error: ", e);76 reject(e);77 }78 });79}8081export function submitTransactionExpectFailAsync(sender: IKeyringPair, transaction: SubmittableExtrinsic<ApiTypes>): Promise<EventRecord[]> {82 const consoleError = console.error;83 const consoleLog = console.log;84 console.error = () => {};85 console.log = () => {};8687 return new Promise<EventRecord[]>(async function(res, rej) {88 const resolve = (rec: EventRecord[]) => {89 setTimeout(() => {90 res(rec);91 console.error = consoleError;92 console.log = consoleLog;93 });94 };95 const reject = (errror: any) => {96 setTimeout(() => {97 rej(errror);98 console.error = consoleError;99 console.log = consoleLog;100 });101 };102 try {103 await transaction.signAndSend(sender, ({ events = [], status }) => {104 const transactionStatus = getTransactionStatus(events, status);105 if (transactionStatus === TransactionStatus.Success) {106 resolve(events);107 } else if (transactionStatus === TransactionStatus.Fail) {108 reject(events);109 }110 });111 } catch (e) {112 reject(e);113 }114 });115}tests/src/util/helpers.tsdiffbeforeafterboth--- a/tests/src/util/helpers.ts
+++ b/tests/src/util/helpers.ts
@@ -51,7 +51,7 @@
Value: BN;
}
-interface IReFungibleTokenDataType {
+export interface IReFungibleTokenDataType {
Owner: IReFungibleOwner[];
ConstData: number[];
VariableData: number[];