From a11cc833f1405761d32667eeeefd58966f655700 Mon Sep 17 00:00:00 2001 From: Yaroslav Bolyukin Date: Wed, 19 Jan 2022 12:22:44 +0000 Subject: [PATCH] test(contract-helpers): generous sponsoring mode --- --- a/tests/src/eth/contractSponsoring.test.ts +++ b/tests/src/eth/contractSponsoring.test.ts @@ -10,7 +10,10 @@ createEthAccountWithBalance, transferBalanceToEth, deployFlipper, - itWeb3} from './util/helpers'; + itWeb3, + SponsoringMode, + createEthAccount, +} from './util/helpers'; describe('Sponsoring EVM contracts', () => { itWeb3('Sponsoring can be set by the address that has deployed the contract', async ({api, web3}) => { @@ -18,7 +21,7 @@ const flipper = await deployFlipper(web3, owner); const helpers = contractHelpers(web3, owner); expect(await helpers.methods.sponsoringEnabled(flipper.options.address).call()).to.be.false; - await helpers.methods.toggleSponsoring(flipper.options.address, true).send({from: owner}); + await helpers.methods.setSponsoringMode(flipper.options.address, SponsoringMode.Allowlisted).send({from: owner}); expect(await helpers.methods.sponsoringEnabled(flipper.options.address).call()).to.be.true; }); @@ -28,11 +31,11 @@ const flipper = await deployFlipper(web3, owner); const helpers = contractHelpers(web3, owner); expect(await helpers.methods.sponsoringEnabled(flipper.options.address).call()).to.be.false; - await expect(helpers.methods.toggleSponsoring(notOwner, true).send({from: notOwner})).to.rejected; + await expect(helpers.methods.setSponsoringMode(notOwner, SponsoringMode.Allowlisted).send({from: notOwner})).to.rejected; expect(await helpers.methods.sponsoringEnabled(flipper.options.address).call()).to.be.false; }); - itWeb3('Sponsoring is set, an address that has no UNQ can send a transaction and it works. Sponsor balance should decrease (allowlisted)', async ({api, web3}) => { + itWeb3('In generous mode, non-allowlisted user transaction will be sponsored', async ({ api, web3 }) => { const alice = privateKey('//Alice'); const owner = await createEthAccountWithBalance(api, web3); @@ -41,11 +44,39 @@ const flipper = await deployFlipper(web3, owner); const helpers = contractHelpers(web3, owner); + + expect(await helpers.methods.sponsoringEnabled(flipper.options.address).call()).to.be.false; + await helpers.methods.setSponsoringMode(flipper.options.address, SponsoringMode.Generous).send({from: owner}); + await helpers.methods.setSponsoringRateLimit(flipper.options.address, 0).send({from: owner}); + expect(await helpers.methods.sponsoringEnabled(flipper.options.address).call()).to.be.true; + + await transferBalanceToEth(api, alice, flipper.options.address); + + const originalFlipperBalance = await web3.eth.getBalance(flipper.options.address); + expect(originalFlipperBalance).to.be.not.equal('0'); + + await flipper.methods.flip().send({from: caller}); + expect(await flipper.methods.getValue().call()).to.be.true; + + // Balance should be taken from flipper instead of caller + const balanceAfter = await web3.eth.getBalance(flipper.options.address); + expect(+balanceAfter).to.be.lessThan(+originalFlipperBalance); + }); + + itWeb3('Sponsoring is set, an address that has no UNQ can send a transaction and it works. Sponsor balance should decrease (allowlisted)', async ({api, web3}) => { + const alice = privateKey('//Alice'); + + const owner = await createEthAccountWithBalance(api, web3); + const caller = await createEthAccount(api); + + const flipper = await deployFlipper(web3, owner); + + const helpers = contractHelpers(web3, owner); await helpers.methods.toggleAllowlist(flipper.options.address, true).send({from: owner}); await helpers.methods.toggleAllowed(flipper.options.address, caller, true).send({from: owner}); expect(await helpers.methods.sponsoringEnabled(flipper.options.address).call()).to.be.false; - await helpers.methods.toggleSponsoring(flipper.options.address, true).send({from: owner}); + await helpers.methods.setSponsoringMode(flipper.options.address, SponsoringMode.Allowlisted).send({from: owner}); await helpers.methods.setSponsoringRateLimit(flipper.options.address, 0).send({from: owner}); expect(await helpers.methods.sponsoringEnabled(flipper.options.address).call()).to.be.true; @@ -66,14 +97,14 @@ const alice = privateKey('//Alice'); const owner = await createEthAccountWithBalance(api, web3); - const caller = await createEthAccountWithBalance(api, web3); + const caller = await createEthAccount(api); const flipper = await deployFlipper(web3, owner); const helpers = contractHelpers(web3, owner); expect(await helpers.methods.sponsoringEnabled(flipper.options.address).call()).to.be.false; - await helpers.methods.toggleSponsoring(flipper.options.address, true).send({from: owner}); + await helpers.methods.setSponsoringMode(flipper.options.address, SponsoringMode.Allowlisted).send({from: owner}); await helpers.methods.setSponsoringRateLimit(flipper.options.address, 0).send({from: owner}); expect(await helpers.methods.sponsoringEnabled(flipper.options.address).call()).to.be.true; @@ -104,7 +135,7 @@ await helpers.methods.toggleAllowed(flipper.options.address, caller, true).send({from: owner}); expect(await helpers.methods.sponsoringEnabled(flipper.options.address).call()).to.be.false; - await helpers.methods.toggleSponsoring(flipper.options.address, true).send({from: owner}); + await helpers.methods.setSponsoringMode(flipper.options.address, SponsoringMode.Allowlisted).send({from: owner}); await helpers.methods.setSponsoringRateLimit(flipper.options.address, 0).send({from: owner}); expect(await helpers.methods.sponsoringEnabled(flipper.options.address).call()).to.be.true; @@ -133,7 +164,7 @@ await helpers.methods.toggleAllowed(flipper.options.address, caller, true).send({from: owner}); expect(await helpers.methods.sponsoringEnabled(flipper.options.address).call()).to.be.false; - await helpers.methods.toggleSponsoring(flipper.options.address, true).send({from: owner}); + await helpers.methods.setSponsoringMode(flipper.options.address, SponsoringMode.Allowlisted).send({from: owner}); await helpers.methods.setSponsoringRateLimit(flipper.options.address, 10).send({from: owner}); expect(await helpers.methods.sponsoringEnabled(flipper.options.address).call()).to.be.true; @@ -157,33 +188,4 @@ const helpers = contractHelpers(web3, owner); expect(await helpers.methods.getSponsoringRateLimit(flipper.options.address).call()).to.be.equals('7200'); }); - - itWeb3('If allowlist mode is off and sponsorship is on, sponsorship does not work', async ({api, web3}) => { - const alice = privateKey('//Alice'); - - const owner = await createEthAccountWithBalance(api, web3); - const caller = await createEthAccountWithBalance(api, web3); - - const flipper = await deployFlipper(web3, owner); - - const helpers = contractHelpers(web3, owner); - - expect(await helpers.methods.sponsoringEnabled(flipper.options.address).call()).to.be.false; - await helpers.methods.toggleSponsoring(flipper.options.address, true).send({from: owner}); - await helpers.methods.setSponsoringRateLimit(flipper.options.address, 0).send({from: owner}); - expect(await helpers.methods.sponsoringEnabled(flipper.options.address).call()).to.be.true; - - await transferBalanceToEth(api, alice, flipper.options.address); - - const originalFlipperBalance = await web3.eth.getBalance(flipper.options.address); - expect(originalFlipperBalance).to.be.not.equal('0'); - - await flipper.methods.flip().send({from: caller}); - expect(await flipper.methods.getValue().call()).to.be.true; - - // Balance should be taken from flipper instead of caller - const balanceAfter = await web3.eth.getBalance(flipper.options.address); - expect(+balanceAfter).to.be.equals(+originalFlipperBalance); - }); - }); --- a/tests/src/eth/marketplace/marketplace.test.ts +++ b/tests/src/eth/marketplace/marketplace.test.ts @@ -2,7 +2,7 @@ import {getBalanceSingle, transferBalanceExpectSuccess} from '../../substrate/get-balance'; import privateKey from '../../substrate/privateKey'; import {addToAllowListExpectSuccess, confirmSponsorshipExpectSuccess, createCollectionExpectSuccess, createFungibleItemExpectSuccess, createItemExpectSuccess, getTokenOwner, setCollectionLimitsExpectSuccess, setCollectionSponsorExpectSuccess, transferExpectSuccess, transferFromExpectSuccess} from '../../util/helpers'; -import {collectionIdToAddress, contractHelpers, createEthAccountWithBalance, executeEthTxOnSub, GAS_ARGS, itWeb3, subToEth, subToEthLowercase, transferBalanceToEth} from '../util/helpers'; +import {collectionIdToAddress, contractHelpers, createEthAccountWithBalance, executeEthTxOnSub, GAS_ARGS, itWeb3, SponsoringMode, subToEth, subToEthLowercase, transferBalanceToEth} from '../util/helpers'; import {evmToAddress} from '@polkadot/util-crypto'; import nonFungibleAbi from '../nonFungibleAbi.json'; import fungibleAbi from '../fungibleAbi.json'; @@ -20,7 +20,7 @@ }); const matcher = await matcherContract.deploy({data: (await readFile(`${__dirname}/MarketPlace.bin`)).toString(), arguments:[matcherOwner]}).send({from: matcherOwner}); const helpers = contractHelpers(web3, matcherOwner); - await helpers.methods.toggleSponsoring(matcher.options.address, true).send({from: matcherOwner}); + await helpers.methods.setSponsoringMode(matcher.options.address, SponsoringMode.Allowlisted).send({from: matcherOwner}); await helpers.methods.setSponsoringRateLimit(matcher.options.address, 1).send({from: matcherOwner}); await transferBalanceToEth(api, alice, matcher.options.address); @@ -147,7 +147,7 @@ const matcher = await matcherContract.deploy({data: (await readFile(`${__dirname}/MarketPlace.bin`)).toString(), arguments: [matcherOwner]}).send({from: matcherOwner, gas: 10000000}); await matcher.methods.setEscrow(escrow).send({from: matcherOwner}); const helpers = contractHelpers(web3, matcherOwner); - await helpers.methods.toggleSponsoring(matcher.options.address, true).send({from: matcherOwner}); + await helpers.methods.setSponsoringMode(matcher.options.address, SponsoringMode.Allowlisted).send({from: matcherOwner}); await helpers.methods.setSponsoringRateLimit(matcher.options.address, 1).send({from: matcherOwner}); await transferBalanceToEth(api, alice, matcher.options.address); --- a/tests/src/eth/sponsoring.test.ts +++ b/tests/src/eth/sponsoring.test.ts @@ -1,6 +1,6 @@ import {expect} from 'chai'; import privateKey from '../substrate/privateKey'; -import {contractHelpers, createEthAccount, createEthAccountWithBalance, deployCollector, deployFlipper, itWeb3, transferBalanceToEth} from './util/helpers'; +import {contractHelpers, createEthAccount, createEthAccountWithBalance, deployCollector, deployFlipper, itWeb3, SponsoringMode, transferBalanceToEth} from './util/helpers'; describe('EVM sponsoring', () => { itWeb3('Fee is deducted from contract if sponsoring is enabled', async ({api, web3}) => { @@ -18,7 +18,7 @@ await helpers.methods.toggleAllowed(flipper.options.address, caller, true).send({from: owner}); expect(await helpers.methods.sponsoringEnabled(flipper.options.address).call()).to.be.false; - await helpers.methods.toggleSponsoring(flipper.options.address, true).send({from: owner}); + await helpers.methods.setSponsoringMode(flipper.options.address, SponsoringMode.Allowlisted).send({from: owner}); await helpers.methods.setSponsoringRateLimit(flipper.options.address, 0).send({from: owner}); expect(await helpers.methods.sponsoringEnabled(flipper.options.address).call()).to.be.true; @@ -49,7 +49,7 @@ await helpers.methods.toggleAllowed(collector.options.address, caller, true).send({from: owner}); expect(await helpers.methods.sponsoringEnabled(collector.options.address).call()).to.be.false; - await helpers.methods.toggleSponsoring(collector.options.address, true).send({from: owner}); + await helpers.methods.setSponsoringMode(collector.options.address, SponsoringMode.Allowlisted).send({from: owner}); await helpers.methods.setSponsoringRateLimit(collector.options.address, 0).send({from: owner}); expect(await helpers.methods.sponsoringEnabled(collector.options.address).call()).to.be.true; --- a/tests/src/eth/util/helpers.ts +++ b/tests/src/eth/util/helpers.ts @@ -21,6 +21,12 @@ export const GAS_ARGS = {gas: 2500000}; +export enum SponsoringMode { + Disabled, + Allowlisted, + Generous, +} + let web3Connected = false; export async function usingWeb3(cb: (web3: Web3) => Promise | T): Promise { if (web3Connected) throw new Error('do not nest usingWeb3 calls'); -- gitstuff