--- a/tests/src/eth/contractSponsoring.test.ts +++ b/tests/src/eth/contractSponsoring.test.ts @@ -29,11 +29,15 @@ normalizeEvents, subToEth, executeEthTxOnSub, + evmCollectionHelper, + getCollectionAddressFromResult, + evmCollection, } from './util/helpers'; import { addCollectionAdminExpectSuccess, createCollectionExpectSuccess, getCreateCollectionResult, + getDetailedCollectionInfo, transferBalanceTo, } from '../util/helpers'; import nonFungibleAbi from './nonFungibleAbi.json'; @@ -42,6 +46,7 @@ } from '../substrate/substrate-api'; import getBalance from '../substrate/get-balance'; import {alicesPublicKey} from '../accounts'; +import { evmToAddress } from '@polkadot/util-crypto'; describe('Sponsoring EVM contracts', () => { itWeb3('Sponsoring can be set by the address that has deployed the contract', async ({api, web3}) => { @@ -222,84 +227,81 @@ }); itWeb3('Sponsoring evm address from substrate collection', async ({api, web3}) => { - const owner = privateKey('//Alice'); - const userEth = createEthAccount(web3); - const collectionId = await createCollectionExpectSuccess(); + const owner = await createEthAccountWithBalance(api, web3); + const collectionHelper = evmCollectionHelper(web3, owner); + let result = await collectionHelper.methods.create721Collection('Sponsor collection', '1', '1').send(); + const {collectionIdAddress, collectionId} = await getCollectionAddressFromResult(api, result); + const sponsor = await createEthAccountWithBalance(api, web3); + const collectionEvm = evmCollection(web3, owner, collectionIdAddress); + result = await collectionEvm.methods.ethSetSponsor(sponsor).send(); + let collectionSub = (await getDetailedCollectionInfo(api, collectionId))!; + expect(collectionSub.sponsorship.isUnconfirmed).to.be.true; + expect(collectionSub.sponsorship.asUnconfirmed.toHuman()).to.be.eq(evmToAddress(sponsor)); + await expect(collectionEvm.methods.ethConfirmSponsorship().call()).to.be.rejectedWith('Caller is not set as sponsor'); - { - const tx = api.tx.unique.setCollectionSponsor(collectionId, owner.address); - const events = await submitTransactionAsync(owner, tx); - const result = getCreateCollectionResult(events); - expect(result.success).to.be.true; - } - { - const tx = api.tx.unique.confirmSponsorship(collectionId); - const events = await submitTransactionAsync(owner, tx); - const result = getCreateCollectionResult(events); - expect(result.success).to.be.true; - } + const sponsorCollection = evmCollection(web3, sponsor, collectionIdAddress); + await sponsorCollection.methods.ethConfirmSponsorship().send(); + collectionSub = (await getDetailedCollectionInfo(api, collectionId))!; + expect(collectionSub.sponsorship.isConfirmed).to.be.true; + expect(collectionSub.sponsorship.asConfirmed.toHuman()).to.be.eq(evmToAddress(sponsor)); - const address = collectionIdToAddress(collectionId); - const contract = new web3.eth.Contract(nonFungibleAbi as any, address, {from: userEth, ...GAS_ARGS}); + const user = createEthAccount(web3); + const userContract = evmCollection(web3, user, collectionIdAddress); + const nextTokenId = await userContract.methods.nextTokenId().call(); - { // This part should fail, because user not in access list and user have no money - const nextTokenId = await contract.methods.nextTokenId().call(); - expect(nextTokenId).to.be.equal('1'); - await expect(contract.methods.mintWithTokenURI( - userEth, - nextTokenId, - 'Test URI', - ).call({from: userEth})).to.be.rejectedWith(/PublicMintingNotAllowed/); - } - - { - const tx = api.tx.unique.setPublicAccessMode(collectionId, 'AllowList'); - const events = await submitTransactionAsync(owner, tx); - const result = getCreateCollectionResult(events); - expect(result.success).to.be.true; - } - { - const tx = api.tx.unique.addToAllowList(collectionId, {Ethereum: userEth}); - const events = await submitTransactionAsync(owner, tx); - const result = getCreateCollectionResult(events); - expect(result.success).to.be.true; - } - { - const tx = api.tx.unique.setMintPermission(collectionId, true); - const events = await submitTransactionAsync(owner, tx); - const result = getCreateCollectionResult(events); - expect(result.success).to.be.true; - } + expect(nextTokenId).to.be.equal('1'); + await expect(userContract.methods.mintWithTokenURI( + user, + nextTokenId, + 'Test URI', + ).call()).to.be.rejectedWith('PublicMintingNotAllowed'); + + // TODO: add this methods to eth + // { + // const tx = api.tx.unique.setPublicAccessMode(collectionId, 'AllowList'); + // const events = await submitTransactionAsync(owner, tx); + // const result = getCreateCollectionResult(events); + // expect(result.success).to.be.true; + // } + // { + // const tx = api.tx.unique.addToAllowList(collectionId, {Ethereum: userEth}); + // const events = await submitTransactionAsync(owner, tx); + // const result = getCreateCollectionResult(events); + // expect(result.success).to.be.true; + // } + // { + // const tx = api.tx.unique.setMintPermission(collectionId, true); + // const events = await submitTransactionAsync(owner, tx); + // const result = getCreateCollectionResult(events); + // expect(result.success).to.be.true; + // } - const [alicesBalanceBefore] = await getBalance(api, [alicesPublicKey]); + // const [alicesBalanceBefore] = await getBalance(api, [alicesPublicKey]); { - const nextTokenId = await contract.methods.nextTokenId().call(); + const nextTokenId = await userContract.methods.nextTokenId().call(); expect(nextTokenId).to.be.equal('1'); - const result = await contract.methods.mintWithTokenURI( - userEth, + const result = await userContract.methods.mintWithTokenURI( + user, nextTokenId, 'Test URI', - ).send({from: userEth}); + ).send(); const events = normalizeEvents(result.events); expect(events).to.be.deep.equal([ { - address, + collectionIdAddress, event: 'Transfer', args: { from: '0x0000000000000000000000000000000000000000', - to: userEth, + to: user, tokenId: nextTokenId, }, }, ]); - expect(await contract.methods.tokenURI(nextTokenId).call()).to.be.equal('Test URI'); + expect(await userContract.methods.tokenURI(nextTokenId).call()).to.be.equal('Test URI'); } - - const [alicesBalanceAfter] = await getBalance(api, [alicesPublicKey]); - expect(alicesBalanceAfter < alicesBalanceBefore).to.be.true; }); --- a/tests/src/eth/createCollection.test.ts +++ b/tests/src/eth/createCollection.test.ts @@ -14,30 +14,18 @@ // You should have received a copy of the GNU General Public License // along with Unique Network. If not, see . -import nonFungibleAbi from './nonFungibleAbi.json'; -import {ApiPromise} from '@polkadot/api'; import {evmToAddress} from '@polkadot/util-crypto'; import {expect} from 'chai'; import {getCreatedCollectionCount, getDetailedCollectionInfo} from '../util/helpers'; import { evmCollectionHelper, - collectionIdFromAddress, collectionIdToAddress, createEthAccount, createEthAccountWithBalance, evmCollection, - GAS_ARGS, itWeb3, - normalizeAddress, - normalizeEvents, + getCollectionAddressFromResult, } from './util/helpers'; - -async function getCollectionAddressFromResult(api: ApiPromise, result: any) { - const collectionIdAddress = normalizeAddress(result.events[0].raw.topics[2]); - const collectionId = collectionIdFromAddress(collectionIdAddress); - const collection = (await getDetailedCollectionInfo(api, collectionId))!; - return {collectionIdAddress, collectionId, collection}; -} describe('Create collection from EVM', () => { itWeb3('Create collection', async ({api, web3}) => { @@ -138,45 +126,6 @@ expect(collectionSub.limits.ownerCanTransfer.toHuman()).to.be.eq(limits.ownerCanTransfer); expect(collectionSub.limits.ownerCanDestroy.toHuman()).to.be.eq(limits.ownerCanDestroy); expect(collectionSub.limits.transfersEnabled.toHuman()).to.be.eq(limits.transfersEnabled); - }); - - itWeb3('Check tokenURI', async ({web3, api}) => { - const owner = await createEthAccountWithBalance(api, web3); - const helper = evmCollectionHelper(web3, owner); - let result = await helper.methods.create721Collection('Mint collection', '6', '6').send(); - const {collectionIdAddress, collectionId} = await getCollectionAddressFromResult(api, result); - const receiver = createEthAccount(web3); - const contract = new web3.eth.Contract(nonFungibleAbi as any, collectionIdAddress, {from: owner, ...GAS_ARGS}); - const nextTokenId = await contract.methods.nextTokenId().call(); - - expect(nextTokenId).to.be.equal('1'); - result = await contract.methods.mintWithTokenURI( - receiver, - nextTokenId, - 'Test URI', - ).send(); - - const events = normalizeEvents(result.events); - const address = collectionIdToAddress(collectionId); - - expect(events).to.be.deep.equal([ - { - address, - event: 'Transfer', - args: { - from: '0x0000000000000000000000000000000000000000', - to: receiver, - tokenId: nextTokenId, - }, - }, - ]); - - expect(await contract.methods.tokenURI(nextTokenId).call()).to.be.equal('Test URI'); - - // TODO: this wont work right now, need release 919000 first - // await helper.methods.setOffchainSchema(collectionIdAddress, 'https://offchain-service.local/token-info/{id}').send(); - // const tokenUri = await contract.methods.tokenURI(nextTokenId).call(); - // expect(tokenUri).to.be.equal(`https://offchain-service.local/token-info/${nextTokenId}`); }); itWeb3('Collection address exist', async ({api, web3}) => { --- a/tests/src/eth/nonFungible.test.ts +++ b/tests/src/eth/nonFungible.test.ts @@ -16,7 +16,7 @@ import privateKey from '../substrate/privateKey'; import {approveExpectSuccess, burnItemExpectSuccess, createCollectionExpectSuccess, createItemExpectSuccess, transferExpectSuccess, transferFromExpectSuccess, UNIQUE} from '../util/helpers'; -import {collectionIdToAddress, createEthAccount, createEthAccountWithBalance, GAS_ARGS, itWeb3, normalizeEvents, recordEthFee, recordEvents, subToEth, transferBalanceToEth} from './util/helpers'; +import {collectionIdToAddress, createEthAccount, createEthAccountWithBalance, evmCollection, evmCollectionHelper, GAS_ARGS, getCollectionAddressFromResult, itWeb3, normalizeEvents, recordEthFee, recordEvents, subToEth, transferBalanceToEth} from './util/helpers'; import nonFungibleAbi from './nonFungibleAbi.json'; import {expect} from 'chai'; import {submitTransactionAsync} from '../substrate/substrate-api'; @@ -75,43 +75,42 @@ describe('NFT: Plain calls', () => { itWeb3('Can perform mint()', async ({web3, api}) => { - const collection = await createCollectionExpectSuccess({ - mode: {type: 'NFT'}, - }); - const alice = privateKey('//Alice'); - - const caller = await createEthAccountWithBalance(api, web3); - const changeAdminTx = api.tx.unique.addCollectionAdmin(collection, {Ethereum: caller}); - await submitTransactionAsync(alice, changeAdminTx); + const owner = await createEthAccountWithBalance(api, web3); + const helper = evmCollectionHelper(web3, owner); + let result = await helper.methods.create721Collection('Mint collection', '6', '6').send(); + const {collectionIdAddress, collectionId} = await getCollectionAddressFromResult(api, result); const receiver = createEthAccount(web3); + const contract = evmCollection(web3, owner, collectionIdAddress); + const nextTokenId = await contract.methods.nextTokenId().call(); - const address = collectionIdToAddress(collection); - const contract = new web3.eth.Contract(nonFungibleAbi as any, address, {from: caller, ...GAS_ARGS}); + expect(nextTokenId).to.be.equal('1'); + result = await contract.methods.mintWithTokenURI( + receiver, + nextTokenId, + 'Test URI', + ).send(); - { - const nextTokenId = await contract.methods.nextTokenId().call(); - expect(nextTokenId).to.be.equal('1'); - const result = await contract.methods.mintWithTokenURI( - receiver, - nextTokenId, - 'Test URI', - ).send({from: caller}); - const events = normalizeEvents(result.events); + const events = normalizeEvents(result.events); + const address = collectionIdToAddress(collectionId); - expect(events).to.be.deep.equal([ - { - address, - event: 'Transfer', - args: { - from: '0x0000000000000000000000000000000000000000', - to: receiver, - tokenId: nextTokenId, - }, + expect(events).to.be.deep.equal([ + { + address, + event: 'Transfer', + args: { + from: '0x0000000000000000000000000000000000000000', + to: receiver, + tokenId: nextTokenId, }, - ]); + }, + ]); + + expect(await contract.methods.tokenURI(nextTokenId).call()).to.be.equal('Test URI'); - expect(await contract.methods.tokenURI(nextTokenId).call()).to.be.equal('Test URI'); - } + // TODO: this wont work right now, need release 919000 first + // await helper.methods.setOffchainSchema(collectionIdAddress, 'https://offchain-service.local/token-info/{id}').send(); + // const tokenUri = await contract.methods.tokenURI(nextTokenId).call(); + // expect(tokenUri).to.be.equal(`https://offchain-service.local/token-info/${nextTokenId}`); }); itWeb3('Can perform mintBulk()', async ({web3, api}) => { const collection = await createCollectionExpectSuccess({ --- a/tests/src/eth/proxy/nonFungibleProxy.test.ts +++ b/tests/src/eth/proxy/nonFungibleProxy.test.ts @@ -127,6 +127,7 @@ expect(await contract.methods.tokenURI(nextTokenId).call()).to.be.equal('Test URI'); } }); + itWeb3('Can perform mintBulk()', async ({web3, api}) => { const collection = await createCollectionExpectSuccess({ mode: {type: 'NFT'}, --- a/tests/src/eth/util/helpers.ts +++ b/tests/src/eth/util/helpers.ts @@ -23,12 +23,12 @@ import usingApi, {submitTransactionAsync} from '../../substrate/substrate-api'; import {IKeyringPair} from '@polkadot/types/types'; import {expect} from 'chai'; -import {CrossAccountId, getGenericResult, UNIQUE} from '../../util/helpers'; +import {CrossAccountId, getDetailedCollectionInfo, getGenericResult, UNIQUE} from '../../util/helpers'; import * as solc from 'solc'; import config from '../../config'; import privateKey from '../../substrate/privateKey'; import contractHelpersAbi from './contractHelpersAbi.json'; -import collectionAbi from '../nonFungibleAbi.json'; +import nonFungibleAbi from '../nonFungibleAbi.json'; import collectionHelperAbi from '../collectionHelperAbi.json'; import getBalance from '../../substrate/get-balance'; import waitNewBlocks from '../../substrate/wait-new-blocks'; @@ -68,6 +68,13 @@ ]; } +export async function getCollectionAddressFromResult(api: ApiPromise, result: any) { + const collectionIdAddress = normalizeAddress(result.events[0].raw.topics[2]); + const collectionId = collectionIdFromAddress(collectionIdAddress); + const collection = (await getDetailedCollectionInfo(api, collectionId))!; + return {collectionIdAddress, collectionId, collection}; +} + export function collectionIdToAddress(collection: number): string { const buf = Buffer.from([0x17, 0xc4, 0xe6, 0x45, 0x3c, 0xc4, 0x9a, 0xaa, 0xae, 0xac, 0xa8, 0x94, 0xe6, 0xd9, 0x68, 0x3e, ...encodeIntBE(collection), @@ -301,7 +308,7 @@ * @returns */ export function evmCollection(web3: Web3, caller: string, collection: string) { - return new web3.eth.Contract(collectionAbi as any, collection, {from: caller, ...GAS_ARGS}); + return new web3.eth.Contract(nonFungibleAbi as any, collection, {from: caller, ...GAS_ARGS}); } /**