difftreelog
Merge pull request #180 from UniqueNetwork/feature/CORE-159
in: master
CORE-159. Transfer through substrate and EVM
2 files changed
tests/package.jsondiffbeforeafterboth1{2 "name": "nfttests",3 "version": "1.0.0",4 "description": "Substrate Nft tests",5 "main": "",6 "devDependencies": {7 "@polkadot/dev": "0.62.43",8 "@polkadot/ts": "0.3.89",9 "@polkadot/typegen": "5.0.1",10 "@types/chai": "^4.2.17",11 "@types/chai-as-promised": "^7.1.3",12 "@types/mocha": "^8.2.2",13 "@types/node": "^14.14.12",14 "@typescript-eslint/eslint-plugin": "^4.28.5",15 "@typescript-eslint/parser": "^4.28.5",16 "chai": "^4.3.4",17 "eslint": "^7.31.0",18 "mocha": "^8.3.2",19 "ts-node": "^9.1.1",20 "tslint": "^6.1.3",21 "typescript": "^4.2.4"22 },23 "scripts": {24 "lint": "eslint --ext .ts,.js src/",25 "fix": "eslint --ext .ts,.js src/ --fix",26 "test": "mocha --timeout 9999999 -r ts-node/register ./**/*.test.ts ./**/eth/**/*.test.ts",27 "testEth": "mocha --timeout 9999999 -r ts-node/register ./**/eth/**/*.test.ts",28 "load": "mocha --timeout 9999999 -r ts-node/register ./**/*.load.ts",29 "loadTransfer": "ts-node src/transfer.nload.ts",30 "testCollision": "mocha --timeout 9999999 -r ts-node/register ./src/collision-tests/*.test.ts",31 "testAddCollectionAdmin": "mocha --timeout 9999999 -r ts-node/register ./**/addCollectionAdmin.test.ts",32 "testSetSchemaVersion": "mocha --timeout 9999999 -r ts-node/register ./**/setSchemaVersion.test.ts",33 "testSetVariableMetaData": "mocha --timeout 9999999 -r ts-node/register ./**/setVariableMetaData.test.ts",34 "testSetCollectionLimits": "mocha --timeout 9999999 -r ts-node/register ./**/setCollectionLimits.test.ts",35 "testSetCollectionSponsor": "mocha --timeout 9999999 -r ts-node/register ./**/setCollectionSponsor.test.ts",36 "testConfirmSponsorship": "mocha --timeout 9999999 -r ts-node/register ./**/confirmSponsorship.test.ts",37 "testRemoveCollectionAdmin": "mocha --timeout 9999999 -r ts-node/register ./**/removeCollectionAdmin.test.ts",38 "testRemoveCollectionSponsor": "mocha --timeout 9999999 -r ts-node/register ./**/removeCollectionSponsor.test.ts",39 "testRemoveFromWhiteList": "mocha --timeout 9999999 -r ts-node/register ./**/removeFromWhiteList.test.ts",40 "testConnection": "mocha --timeout 9999999 -r ts-node/register ./**/connection.test.ts",41 "testCollection": "mocha --timeout 9999999 -r ts-node/register ./**/createCollection.test.ts",42 "testContracts": "mocha --timeout 9999999 -r ts-node/register ./**/contracts.test.ts",43 "testCreateItem": "mocha --timeout 9999999 -r ts-node/register ./**/createItem.test.ts",44 "testCreateMultipleItems": "mocha --timeout 9999999 -r ts-node/register ./**/createMultipleItems.test.ts",45 "testApprove": "mocha --timeout 9999999 -r ts-node/register ./**/approve.test.ts",46 "testTransferFrom": "mocha --timeout 9999999 -r ts-node/register ./**/transferFrom.test.ts",47 "testCreateCollection": "mocha --timeout 9999999 -r ts-node/register ./**/createCollection.test.ts",48 "testToggleContractWhiteList": "mocha --timeout 9999999 -r ts-node/register ./**/toggleContractWhiteList.test.ts",49 "testAddToContractWhiteList": "mocha --timeout 9999999 -r ts-node/register ./**/addToContractWhiteList.test.ts",50 "testTransfer": "mocha --timeout 9999999 -r ts-node/register ./**/transfer.test.ts",51 "testBurnItem": "mocha --timeout 9999999 -r ts-node/register ./**/burnItem.test.ts",52 "testSetMintPermission": "mocha --timeout 9999999 -r ts-node/register ./**/setMintPermission.test.ts",53 "testCreditFeesToTreasury": "mocha --timeout 9999999 -r ts-node/register ./**/creditFeesToTreasury.test.ts",54 "testEnableContractSponsoring": "mocha --timeout 9999999 -r ts-node/register ./**/enableContractSponsoring.test.ts",55 "testRemoveFromContractWhiteList": "mocha --timeout 9999999 -r ts-node/register ./**/removeFromContractWhiteList.test.ts",56 "testSetContractSponsoringRateLimit": "mocha --timeout 9999999 -r ts-node/register ./**/setContractSponsoringRateLimit.test.ts",57 "testSetOffchainSchema": "mocha --timeout 9999999 -r ts-node/register ./**/setOffchainSchema.test.ts",58 "testOverflow": "mocha --timeout 9999999 -r ts-node/register ./**/overflow.test.ts",59 "testSetVariableMetadataSponsoringRateLimit": "mocha --timeout 9999999 -r ts-node/register ./**/setVariableMetadataSponsoringRateLimit.test.ts",60 "testInflation": "mocha --timeout 9999999 -r ts-node/register ./**/inflation.test.ts",61 "testPalletPresence": "mocha --timeout 9999999 -r ts-node/register ./**/pallet-presence.test.ts",62 "testBlockProduction": "mocha --timeout 9999999 -r ts-node/register ./**/block-production.test.ts",63 "testEnableDisableTransfers": "mocha --timeout 9999999 -r ts-node/register ./**/enableDisableTransfer.test.ts"64 },65 "author": "",66 "license": "SEE LICENSE IN ../LICENSE",67 "homepage": "",68 "dependencies": {69 "@polkadot/api": "5.0.1",70 "@polkadot/api-contract": "5.0.1",71 "bignumber.js": "^9.0.1",72 "chai-as-promised": "^7.1.1",73 "solc": "^0.8.6",74 "web3": "^1.3.5"75 },76 "standard": {77 "globals": [78 "it",79 "assert",80 "beforeEach",81 "afterEach",82 "describe",83 "contract",84 "artifacts"85 ]86 }87}1{2 "name": "nfttests",3 "version": "1.0.0",4 "description": "Substrate Nft tests",5 "main": "",6 "devDependencies": {7 "@polkadot/dev": "0.62.43",8 "@polkadot/ts": "0.3.89",9 "@polkadot/typegen": "5.0.1",10 "@types/chai": "^4.2.17",11 "@types/chai-as-promised": "^7.1.3",12 "@types/mocha": "^8.2.2",13 "@types/node": "^14.14.12",14 "@typescript-eslint/eslint-plugin": "^4.28.5",15 "@typescript-eslint/parser": "^4.28.5",16 "chai": "^4.3.4",17 "eslint": "^7.31.0",18 "mocha": "^8.3.2",19 "ts-node": "^9.1.1",20 "tslint": "^6.1.3",21 "typescript": "^4.2.4"22 },23 "scripts": {24 "lint": "eslint --ext .ts,.js src/",25 "fix": "eslint --ext .ts,.js src/ --fix",26 "test": "mocha --timeout 9999999 -r ts-node/register './**/*.test.ts'",27 "testEth": "mocha --timeout 9999999 -r ts-node/register ./**/eth/**/*.test.ts",28 "load": "mocha --timeout 9999999 -r ts-node/register ./**/*.load.ts",29 "loadTransfer": "ts-node src/transfer.nload.ts",30 "testCollision": "mocha --timeout 9999999 -r ts-node/register ./src/collision-tests/*.test.ts",31 "testAddCollectionAdmin": "mocha --timeout 9999999 -r ts-node/register ./**/addCollectionAdmin.test.ts",32 "testSetSchemaVersion": "mocha --timeout 9999999 -r ts-node/register ./**/setSchemaVersion.test.ts",33 "testSetVariableMetaData": "mocha --timeout 9999999 -r ts-node/register ./**/setVariableMetaData.test.ts",34 "testSetCollectionLimits": "mocha --timeout 9999999 -r ts-node/register ./**/setCollectionLimits.test.ts",35 "testSetCollectionSponsor": "mocha --timeout 9999999 -r ts-node/register ./**/setCollectionSponsor.test.ts",36 "testConfirmSponsorship": "mocha --timeout 9999999 -r ts-node/register ./**/confirmSponsorship.test.ts",37 "testRemoveCollectionAdmin": "mocha --timeout 9999999 -r ts-node/register ./**/removeCollectionAdmin.test.ts",38 "testRemoveCollectionSponsor": "mocha --timeout 9999999 -r ts-node/register ./**/removeCollectionSponsor.test.ts",39 "testRemoveFromWhiteList": "mocha --timeout 9999999 -r ts-node/register ./**/removeFromWhiteList.test.ts",40 "testConnection": "mocha --timeout 9999999 -r ts-node/register ./**/connection.test.ts",41 "testCollection": "mocha --timeout 9999999 -r ts-node/register ./**/createCollection.test.ts",42 "testContracts": "mocha --timeout 9999999 -r ts-node/register ./**/contracts.test.ts",43 "testCreateItem": "mocha --timeout 9999999 -r ts-node/register ./**/createItem.test.ts",44 "testCreateMultipleItems": "mocha --timeout 9999999 -r ts-node/register ./**/createMultipleItems.test.ts",45 "testApprove": "mocha --timeout 9999999 -r ts-node/register ./**/approve.test.ts",46 "testTransferFrom": "mocha --timeout 9999999 -r ts-node/register ./**/transferFrom.test.ts",47 "testCreateCollection": "mocha --timeout 9999999 -r ts-node/register ./**/createCollection.test.ts",48 "testToggleContractWhiteList": "mocha --timeout 9999999 -r ts-node/register ./**/toggleContractWhiteList.test.ts",49 "testAddToContractWhiteList": "mocha --timeout 9999999 -r ts-node/register ./**/addToContractWhiteList.test.ts",50 "testTransfer": "mocha --timeout 9999999 -r ts-node/register ./**/transfer.test.ts",51 "testBurnItem": "mocha --timeout 9999999 -r ts-node/register ./**/burnItem.test.ts",52 "testSetMintPermission": "mocha --timeout 9999999 -r ts-node/register ./**/setMintPermission.test.ts",53 "testCreditFeesToTreasury": "mocha --timeout 9999999 -r ts-node/register ./**/creditFeesToTreasury.test.ts",54 "testEnableContractSponsoring": "mocha --timeout 9999999 -r ts-node/register ./**/enableContractSponsoring.test.ts",55 "testRemoveFromContractWhiteList": "mocha --timeout 9999999 -r ts-node/register ./**/removeFromContractWhiteList.test.ts",56 "testSetContractSponsoringRateLimit": "mocha --timeout 9999999 -r ts-node/register ./**/setContractSponsoringRateLimit.test.ts",57 "testSetOffchainSchema": "mocha --timeout 9999999 -r ts-node/register ./**/setOffchainSchema.test.ts",58 "testOverflow": "mocha --timeout 9999999 -r ts-node/register ./**/overflow.test.ts",59 "testSetVariableMetadataSponsoringRateLimit": "mocha --timeout 9999999 -r ts-node/register ./**/setVariableMetadataSponsoringRateLimit.test.ts",60 "testInflation": "mocha --timeout 9999999 -r ts-node/register ./**/inflation.test.ts",61 "testPalletPresence": "mocha --timeout 9999999 -r ts-node/register ./**/pallet-presence.test.ts",62 "testBlockProduction": "mocha --timeout 9999999 -r ts-node/register ./**/block-production.test.ts",63 "testEnableDisableTransfers": "mocha --timeout 9999999 -r ts-node/register ./**/enableDisableTransfer.test.ts"64 },65 "author": "",66 "license": "SEE LICENSE IN ../LICENSE",67 "homepage": "",68 "dependencies": {69 "@polkadot/api": "5.0.1",70 "@polkadot/api-contract": "5.0.1",71 "bignumber.js": "^9.0.1",72 "chai-as-promised": "^7.1.1",73 "solc": "^0.8.6",74 "web3": "^1.3.5"75 },76 "standard": {77 "globals": [78 "it",79 "assert",80 "beforeEach",81 "afterEach",82 "describe",83 "contract",84 "artifacts"85 ]86 }87}tests/src/eth/crossTransfer.test.tsdiffbeforeafterboth--- /dev/null
+++ b/tests/src/eth/crossTransfer.test.ts
@@ -0,0 +1,88 @@
+//
+// This file is subject to the terms and conditions defined in
+// file 'LICENSE', which is part of this source code package.
+//
+
+import privateKey from '../substrate/privateKey';
+import { createCollectionExpectSuccess,
+ createFungibleItemExpectSuccess,
+ transferExpectSuccess,
+ transferFromExpectSuccess,
+ createItemExpectSuccess } from '../util/helpers';
+import { collectionIdToAddress,
+ createEthAccountWithBalance,
+ subToEth,
+ GAS_ARGS, itWeb3 } from './util/helpers';
+import fungibleAbi from './fungibleAbi.json';
+import nonFungibleAbi from './nonFungibleAbi.json';
+
+describe('Token transfer between substrate address and EVM address. Fungible', () => {
+ itWeb3('The private key X create a substrate address. Alice sends a token to the corresponding EVM address, and X can send it to Bob in the substrate', async () => {
+ const collection = await createCollectionExpectSuccess({
+ name: 'token name',
+ mode: { type: 'Fungible', decimalPoints: 0 },
+ });
+ const alice = privateKey('//Alice');
+ const bob = privateKey('//Bob');
+ const charlie = privateKey('//Charlie');
+ await createFungibleItemExpectSuccess(alice, collection, { Value: 200n }, { substrate: alice.address });
+ await transferExpectSuccess(collection, 0, alice, {ethereum: subToEth(charlie.address)} , 200, 'Fungible');
+ await transferFromExpectSuccess(collection, 0, alice, {ethereum: subToEth(charlie.address)}, charlie, 50, 'Fungible');
+ await transferExpectSuccess(collection, 0, charlie, bob, 50, 'Fungible');
+ });
+
+ itWeb3('The private key X create a EVM address. Alice sends a token to the substrate address corresponding to this EVM address, and X can send it to Bob in the EVM', async ({ api, web3 }) => {
+ const collection = await createCollectionExpectSuccess({
+ name: 'token name',
+ mode: { type: 'Fungible', decimalPoints: 0 },
+ });
+ const alice = privateKey('//Alice');
+ const bob = privateKey('//Bob');
+ const bobProxy = await createEthAccountWithBalance(api, web3);
+ const aliceProxy = await createEthAccountWithBalance(api, web3);
+
+ await createFungibleItemExpectSuccess(alice, collection, { Value: 200n }, alice.address);
+ await transferExpectSuccess(collection, 0, alice, { ethereum: aliceProxy } , 200, 'Fungible');
+ const address = collectionIdToAddress(collection);
+ const contract = new web3.eth.Contract(fungibleAbi as any, address, {from: aliceProxy, ...GAS_ARGS});
+
+ await contract.methods.transfer(bobProxy, 50).send({ from: aliceProxy });
+ await transferFromExpectSuccess(collection, 0, alice, {ethereum: bobProxy}, bob, 50, 'Fungible');
+ await transferExpectSuccess(collection, 0, bob, alice, 50, 'Fungible');
+ });
+});
+
+describe('Token transfer between substrate address and EVM address. NFT', () => {
+ itWeb3('The private key X create a substrate address. Alice sends a token to the corresponding EVM address, and X can send it to Bob in the substrate', async () => {
+ const collection = await createCollectionExpectSuccess({
+ name: 'token name',
+ mode: { type: 'NFT' },
+ });
+ const alice = privateKey('//Alice');
+ const bob = privateKey('//Bob');
+ const charlie = privateKey('//Charlie');
+ const tokenId = await createItemExpectSuccess(alice, collection, 'NFT', { substrate: alice.address });
+ await transferExpectSuccess(collection, tokenId, alice, { ethereum: subToEth(charlie.address) }, 1, 'NFT');
+ await transferFromExpectSuccess(collection, tokenId, alice, {ethereum: subToEth(charlie.address)}, charlie, 1, 'NFT');
+ await transferExpectSuccess(collection, tokenId, charlie, bob, 1, 'NFT');
+ });
+
+ itWeb3('The private key X create a EVM address. Alice sends a token to the substrate address corresponding to this EVM address, and X can send it to Bob in the EVM', async ({ api, web3 }) => {
+ const collection = await createCollectionExpectSuccess({
+ name: 'token name',
+ mode: { type: 'NFT' },
+ });
+ const alice = privateKey('//Alice');
+ const bob = privateKey('//Bob');
+ const charlie = privateKey('//Charlie');
+ const bobProxy = await createEthAccountWithBalance(api, web3);
+ const aliceProxy = await createEthAccountWithBalance(api, web3);
+ const tokenId = await createItemExpectSuccess(alice, collection, 'NFT', { substrate: alice.address });
+ await transferExpectSuccess(collection, tokenId, alice, { ethereum: aliceProxy } , 1, 'NFT');
+ const address = collectionIdToAddress(collection);
+ const contract = new web3.eth.Contract(nonFungibleAbi as any, address, {from: aliceProxy, ...GAS_ARGS});
+ await contract.methods.transfer(bobProxy, 1).send({ from: aliceProxy });
+ await transferFromExpectSuccess(collection, tokenId, alice, {ethereum: bobProxy}, bob, 1, 'NFT');
+ await transferExpectSuccess(collection, tokenId, bob, charlie, 1, 'NFT');
+ });
+});
\ No newline at end of file