1234567891011121314151617import {usingPlaygrounds} from './../../util/playgrounds/index';18import {IKeyringPair} from '@polkadot/types/types';19import {readFile} from 'fs/promises';20import {itEth, expect, SponsoringMode} from '../util/playgrounds';2122describe('Matcher contract usage', () => {23 const PRICE = 2000n;24 let donor: IKeyringPair;25 let alice: IKeyringPair;26 let aliceMirror: string;27 let aliceDoubleMirror: string;28 let seller: IKeyringPair;29 let sellerMirror: string;3031 before(async () => {32 await usingPlaygrounds(async (_helper, privateKey) => {33 donor = privateKey('//Alice');34 }); 35 });3637 beforeEach(async () => {38 await usingPlaygrounds(async (helper, privateKey) => {39 [alice] = await helper.arrange.createAccounts([10000n], donor);40 aliceMirror = helper.address.substrateToEth(alice.address).toLowerCase();41 aliceDoubleMirror = helper.address.ethToSubstrate(aliceMirror);42 seller = privateKey(`//Seller/${Date.now()}`);43 sellerMirror = helper.address.substrateToEth(seller.address).toLowerCase();4445 await helper.balance.transferToSubstrate(donor, aliceDoubleMirror, 10_000_000_000_000_000_000n);46 });47 });4849 itEth('With UNQ', async ({helper}) => {50 const web3 = helper.getWeb3();51 const matcherOwner = await helper.eth.createAccountWithBalance(donor);52 const matcherContract = new web3.eth.Contract(JSON.parse((await readFile(`${__dirname}/MarketPlace.abi`)).toString()), undefined, {53 from: matcherOwner,54 gas: helper.eth.DEFAULT_GAS,55 });56 const matcher = await matcherContract.deploy({data: (await readFile(`${__dirname}/MarketPlace.bin`)).toString(), arguments:[matcherOwner]}).send({from: matcherOwner});5758 const sponsor = await helper.eth.createAccountWithBalance(donor);59 const helpers = helper.ethNativeContract.contractHelpers(matcherOwner);60 await helpers.methods.setSponsoringMode(matcher.options.address, SponsoringMode.Allowlisted).send({from: matcherOwner});61 await helpers.methods.setSponsoringRateLimit(matcher.options.address, 1).send({from: matcherOwner});62 63 await helpers.methods.setSponsor(matcher.options.address, sponsor).send({from: matcherOwner});64 await helpers.methods.confirmSponsorship(matcher.options.address).send({from: sponsor});6566 const collection = await helper.nft.mintCollection(alice, {limits: {sponsorApproveTimeout: 1}, pendingSponsor: alice.address});67 await collection.confirmSponsorship(alice);68 await collection.addToAllowList(alice, {Substrate: aliceDoubleMirror});69 const evmCollection = helper.ethNativeContract.collection(helper.ethAddress.fromCollectionId(collection.collectionId), 'nft');70 await helper.eth.transferBalanceFromSubstrate(donor, aliceMirror);7172 await helpers.methods.toggleAllowed(matcher.options.address, aliceMirror, true).send({from: matcherOwner});73 await helpers.methods.toggleAllowed(matcher.options.address, sellerMirror, true).send({from: matcherOwner});7475 const token = await collection.mintToken(alice, {Ethereum: sellerMirror});7677 78 expect(await token.getOwner()).to.be.deep.equal({Ethereum: sellerMirror});7980 81 {82 await helper.eth.sendEVM(seller, evmCollection.options.address, evmCollection.methods.approve(matcher.options.address, token.tokenId).encodeABI(), '0');83 await helper.eth.sendEVM(seller, matcher.options.address, matcher.methods.addAsk(PRICE, '0x0000000000000000000000000000000000000001', evmCollection.options.address, token.tokenId).encodeABI(), '0');84 }8586 87 expect(await token.getOwner()).to.be.deep.equal({Ethereum: matcher.options.address.toLowerCase()});8889 90 {91 const sellerBalanceBeforePurchase = await helper.balance.getSubstrate(seller.address);92 await helper.eth.sendEVM(alice, matcher.options.address, matcher.methods.buy(evmCollection.options.address, token.tokenId).encodeABI(), PRICE.toString());93 expect(await helper.balance.getSubstrate(seller.address) - sellerBalanceBeforePurchase === PRICE);94 }9596 97 expect(await token.getOwner()).to.be.deep.equal({Ethereum: aliceMirror});9899 100 await token.transferFrom(alice, {Ethereum: aliceMirror}, {Substrate: alice.address});101102 103 expect(await token.getOwner()).to.be.deep.equal({Substrate: alice.address});104 });105106 itEth('With escrow', async ({helper}) => {107 const web3 = helper.getWeb3();108 const matcherOwner = await helper.eth.createAccountWithBalance(donor);109 const matcherContract = new web3.eth.Contract(JSON.parse((await readFile(`${__dirname}/MarketPlace.abi`)).toString()), undefined, {110 from: matcherOwner,111 gas: helper.eth.DEFAULT_GAS,112 });113 const matcher = await matcherContract.deploy({data: (await readFile(`${__dirname}/MarketPlace.bin`)).toString(), arguments: [matcherOwner]}).send({from: matcherOwner, gas: 10000000});114115 const sponsor = await helper.eth.createAccountWithBalance(donor);116 const escrow = await helper.eth.createAccountWithBalance(donor);117 await matcher.methods.setEscrow(escrow).send({from: matcherOwner});118 const helpers = helper.ethNativeContract.contractHelpers(matcherOwner);119 await helpers.methods.setSponsoringMode(matcher.options.address, SponsoringMode.Allowlisted).send({from: matcherOwner});120 await helpers.methods.setSponsoringRateLimit(matcher.options.address, 1).send({from: matcherOwner});121 122 await helpers.methods.setSponsor(matcher.options.address, sponsor).send({from: matcherOwner});123 await helpers.methods.confirmSponsorship(matcher.options.address).send({from: sponsor});124125 const collection = await helper.nft.mintCollection(alice, {limits: {sponsorApproveTimeout: 1}, pendingSponsor: alice.address});126 await collection.confirmSponsorship(alice);127 await collection.addToAllowList(alice, {Substrate: aliceDoubleMirror});128 const evmCollection = helper.ethNativeContract.collection(helper.ethAddress.fromCollectionId(collection.collectionId), 'nft');129 await helper.eth.transferBalanceFromSubstrate(donor, aliceMirror);130131132 await helpers.methods.toggleAllowed(matcher.options.address, aliceMirror, true).send({from: matcherOwner});133134 await helpers.methods.toggleAllowed(matcher.options.address, sellerMirror, true).send({from: matcherOwner});135136 const token = await collection.mintToken(alice, {Ethereum: sellerMirror});137138 139 expect(await token.getOwner()).to.be.deep.equal({Ethereum: sellerMirror});140141 142 {143 await helper.eth.sendEVM(seller, evmCollection.options.address, evmCollection.methods.approve(matcher.options.address, token.tokenId).encodeABI(), '0');144 await helper.eth.sendEVM(seller, matcher.options.address, matcher.methods.addAsk(PRICE, '0x0000000000000000000000000000000000000001', evmCollection.options.address, token.tokenId).encodeABI(), '0');145 }146147 148 expect(await token.getOwner()).to.be.deep.equal({Ethereum: matcher.options.address.toLowerCase()});149150 151 await matcher.methods.depositKSM(PRICE, aliceMirror).send({from: escrow});152153 154 {155 expect(await matcher.methods.balanceKSM(sellerMirror).call()).to.be.equal('0');156 expect(await matcher.methods.balanceKSM(aliceMirror).call()).to.be.equal(PRICE.toString());157158 await helper.eth.sendEVM(alice, matcher.options.address, matcher.methods.buyKSM(evmCollection.options.address, token.tokenId, aliceMirror, aliceMirror).encodeABI(), '0');159160 161 expect(await matcher.methods.balanceKSM(aliceMirror).call()).to.be.equal('0');162 expect(await matcher.methods.balanceKSM(sellerMirror).call()).to.be.equal(PRICE.toString());163 }164165 166 expect(await token.getOwner()).to.be.deep.equal({Ethereum: aliceMirror});167168 169 await token.transferFrom(alice, {Ethereum: aliceMirror}, {Substrate: alice.address});170171 172 expect(await token.getOwner()).to.be.deep.equal({Substrate: alice.address});173 });174175 itEth('Sell tokens from substrate user via EVM contract', async ({helper}) => {176 const web3 = helper.getWeb3();177 const matcherOwner = await helper.eth.createAccountWithBalance(donor);178 const matcherContract = new web3.eth.Contract(JSON.parse((await readFile(`${__dirname}/MarketPlace.abi`)).toString()), undefined, {179 from: matcherOwner,180 gas: helper.eth.DEFAULT_GAS,181 });182 const matcher = await matcherContract.deploy({data: (await readFile(`${__dirname}/MarketPlace.bin`)).toString(), arguments:[matcherOwner]}).send({from: matcherOwner});183184 await helper.eth.transferBalanceFromSubstrate(donor, matcher.options.address);185186 const collection = await helper.nft.mintCollection(alice, {limits: {sponsorApproveTimeout: 1}});187 const evmCollection = helper.ethNativeContract.collection(helper.ethAddress.fromCollectionId(collection.collectionId), 'nft');188189 await helper.balance.transferToSubstrate(donor, seller.address, 100_000_000_000_000_000_000n);190 191 const token = await collection.mintToken(alice, {Ethereum: sellerMirror});192193 194 expect(await token.getOwner()).to.be.deep.equal({Ethereum: sellerMirror});195196 197 {198 await helper.eth.sendEVM(seller, evmCollection.options.address, evmCollection.methods.approve(matcher.options.address, token.tokenId).encodeABI(), '0');199 await helper.eth.sendEVM(seller, matcher.options.address, matcher.methods.addAsk(PRICE, '0x0000000000000000000000000000000000000001', evmCollection.options.address, token.tokenId).encodeABI(), '0');200 }201202 203 expect(await token.getOwner()).to.be.deep.equal({Ethereum: matcher.options.address.toLowerCase()});204205 206 {207 const sellerBalanceBeforePurchase = await helper.balance.getSubstrate(seller.address);208 await helper.eth.sendEVM(alice, matcher.options.address, matcher.methods.buy(evmCollection.options.address, token.tokenId).encodeABI(), PRICE.toString());209 expect(await helper.balance.getSubstrate(seller.address) - sellerBalanceBeforePurchase === PRICE);210 }211212 213 expect(await token.getOwner()).to.be.deep.equal({Ethereum: aliceMirror});214215 216 await token.transferFrom(alice, {Ethereum: aliceMirror}, {Substrate: alice.address});217218 219 expect(await token.getOwner()).to.be.deep.equal({Substrate: alice.address});220 });221});