git.delta.rocks / unique-network / refs/commits / dc1fefd785d4

difftreelog

source

tests/src/eth/contractSponsoring.test.ts9.3 KiBsourcehistory
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 privateKey from '../substrate/privateKey';7import {expect} from 'chai';8import {9  contractHelpers,10  createEthAccountWithBalance,11  transferBalanceToEth,12  deployFlipper,13  itWeb3} from './util/helpers';1415describe('Sponsoring EVM contracts', () => {16  itWeb3('Sponsoring can be set by the address that has deployed the contract', async ({api, web3}) => {17    const owner = await createEthAccountWithBalance(api, web3);18    const flipper = await deployFlipper(web3, owner);19    const helpers = contractHelpers(web3, owner);20    expect(await helpers.methods.sponsoringEnabled(flipper.options.address).call()).to.be.false;21    await helpers.methods.toggleSponsoring(flipper.options.address, true).send({from: owner});22    expect(await helpers.methods.sponsoringEnabled(flipper.options.address).call()).to.be.true;23  });2425  itWeb3('Sponsoring cannot be set by the address that did not deployed the contract', async ({api, web3}) => {26    const owner = await createEthAccountWithBalance(api, web3);27    const notOwner = await createEthAccountWithBalance(api, web3);28    const flipper = await deployFlipper(web3, owner);29    const helpers = contractHelpers(web3, owner);30    expect(await helpers.methods.sponsoringEnabled(flipper.options.address).call()).to.be.false;31    await expect(helpers.methods.toggleSponsoring(notOwner, true).send({from: notOwner})).to.rejected;32    expect(await helpers.methods.sponsoringEnabled(flipper.options.address).call()).to.be.false;33  });3435  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}) => {36    const alice = privateKey('//Alice');3738    const owner = await createEthAccountWithBalance(api, web3);39    const caller = await createEthAccountWithBalance(api, web3);4041    const flipper = await deployFlipper(web3, owner);4243    const helpers = contractHelpers(web3, owner);44    await helpers.methods.toggleAllowlist(flipper.options.address, true).send({from: owner});45    await helpers.methods.toggleAllowed(flipper.options.address, caller, true).send({from: owner});4647    expect(await helpers.methods.sponsoringEnabled(flipper.options.address).call()).to.be.false;48    await helpers.methods.toggleSponsoring(flipper.options.address, true).send({from: owner});49    await helpers.methods.setSponsoringRateLimit(flipper.options.address, 0).send({from: owner});50    expect(await helpers.methods.sponsoringEnabled(flipper.options.address).call()).to.be.true;5152    await transferBalanceToEth(api, alice, flipper.options.address);5354    const originalFlipperBalance = await web3.eth.getBalance(flipper.options.address);55    expect(originalFlipperBalance).to.be.not.equal('0');5657    await flipper.methods.flip().send({from: caller});58    expect(await flipper.methods.getValue().call()).to.be.true;5960    // Balance should be taken from flipper instead of caller61    const balanceAfter = await web3.eth.getBalance(flipper.options.address);62    expect(+balanceAfter).to.be.lessThan(+originalFlipperBalance);63  });6465  itWeb3('Sponsoring is set, an address that has no UNQ can send a transaction and it works. Sponsor balance should not decrease (non-allowlisted)', async ({api, web3}) => {66    const alice = privateKey('//Alice');6768    const owner = await createEthAccountWithBalance(api, web3);69    const caller = await createEthAccountWithBalance(api, web3);7071    const flipper = await deployFlipper(web3, owner);7273    const helpers = contractHelpers(web3, owner);7475    expect(await helpers.methods.sponsoringEnabled(flipper.options.address).call()).to.be.false;76    await helpers.methods.toggleSponsoring(flipper.options.address, true).send({from: owner});77    await helpers.methods.setSponsoringRateLimit(flipper.options.address, 0).send({from: owner});78    expect(await helpers.methods.sponsoringEnabled(flipper.options.address).call()).to.be.true;7980    await transferBalanceToEth(api, alice, flipper.options.address);8182    const originalFlipperBalance = await web3.eth.getBalance(flipper.options.address);83    expect(originalFlipperBalance).to.be.not.equal('0');8485    await flipper.methods.flip().send({from: caller});86    expect(await flipper.methods.getValue().call()).to.be.true;8788    // Balance should be taken from flipper instead of caller89    const balanceAfter = await web3.eth.getBalance(flipper.options.address);90    expect(+balanceAfter).to.be.equals(+originalFlipperBalance);91  });9293  itWeb3('Sponsoring is set, an address that has UNQ can send a transaction and it works. User balance should not change', async ({api, web3}) => {94    const alice = privateKey('//Alice');9596    const owner = await createEthAccountWithBalance(api, web3);97    const caller = await createEthAccountWithBalance(api, web3);98    const originalCallerBalance = await web3.eth.getBalance(caller);99100    const flipper = await deployFlipper(web3, owner);101102    const helpers = contractHelpers(web3, owner);103    await helpers.methods.toggleAllowlist(flipper.options.address, true).send({from: owner});104    await helpers.methods.toggleAllowed(flipper.options.address, caller, true).send({from: owner});105106    expect(await helpers.methods.sponsoringEnabled(flipper.options.address).call()).to.be.false;107    await helpers.methods.toggleSponsoring(flipper.options.address, true).send({from: owner});108    await helpers.methods.setSponsoringRateLimit(flipper.options.address, 0).send({from: owner});109    expect(await helpers.methods.sponsoringEnabled(flipper.options.address).call()).to.be.true;110111    await transferBalanceToEth(api, alice, flipper.options.address);112113    const originalFlipperBalance = await web3.eth.getBalance(flipper.options.address);114    expect(originalFlipperBalance).to.be.not.equal('0');115116    await flipper.methods.flip().send({from: caller});117    expect(await flipper.methods.getValue().call()).to.be.true;118119    expect(await web3.eth.getBalance(caller)).to.be.equals(originalCallerBalance);120  });121122  itWeb3('Sponsoring is limited, with setContractRateLimit. The limitation is working if transactions are sent more often, the sender pays the commission.', async ({api, web3}) => {123    const alice = privateKey('//Alice');124125    const owner = await createEthAccountWithBalance(api, web3);126    const caller = await createEthAccountWithBalance(api, web3);127    const originalCallerBalance = await web3.eth.getBalance(caller);128129    const flipper = await deployFlipper(web3, owner);130131    const helpers = contractHelpers(web3, owner);132    await helpers.methods.toggleAllowlist(flipper.options.address, true).send({from: owner});133    await helpers.methods.toggleAllowed(flipper.options.address, caller, true).send({from: owner});134135    expect(await helpers.methods.sponsoringEnabled(flipper.options.address).call()).to.be.false;136    await helpers.methods.toggleSponsoring(flipper.options.address, true).send({from: owner});137    await helpers.methods.setSponsoringRateLimit(flipper.options.address, 10).send({from: owner});138    expect(await helpers.methods.sponsoringEnabled(flipper.options.address).call()).to.be.true;139140    await transferBalanceToEth(api, alice, flipper.options.address);141142    const originalFlipperBalance = await web3.eth.getBalance(flipper.options.address);143    expect(originalFlipperBalance).to.be.not.equal('0');144145    await flipper.methods.flip().send({from: caller});146    expect(await flipper.methods.getValue().call()).to.be.true;147    expect(await web3.eth.getBalance(caller)).to.be.equals(originalCallerBalance);148149    await flipper.methods.flip().send({from: caller});150    expect(await web3.eth.getBalance(caller)).to.be.not.equals(originalCallerBalance);151  });152153  // TODO: Find a way to calculate default rate limit154  itWeb3('Default rate limit equals 7200', async ({api, web3}) => {155    const owner = await createEthAccountWithBalance(api, web3);156    const flipper = await deployFlipper(web3, owner);157    const helpers = contractHelpers(web3, owner);158    expect(await helpers.methods.getSponsoringRateLimit(flipper.options.address).call()).to.be.equals('7200');159  });160161  itWeb3('If allowlist mode is off and sponsorship is on, sponsorship does not work', async ({api, web3}) => {162    const alice = privateKey('//Alice');163164    const owner = await createEthAccountWithBalance(api, web3);165    const caller = await createEthAccountWithBalance(api, web3);166167    const flipper = await deployFlipper(web3, owner);168169    const helpers = contractHelpers(web3, owner);170171    expect(await helpers.methods.sponsoringEnabled(flipper.options.address).call()).to.be.false;172    await helpers.methods.toggleSponsoring(flipper.options.address, true).send({from: owner});173    await helpers.methods.setSponsoringRateLimit(flipper.options.address, 0).send({from: owner});174    expect(await helpers.methods.sponsoringEnabled(flipper.options.address).call()).to.be.true;175176    await transferBalanceToEth(api, alice, flipper.options.address);177178    const originalFlipperBalance = await web3.eth.getBalance(flipper.options.address);179    expect(originalFlipperBalance).to.be.not.equal('0');180181    await flipper.methods.flip().send({from: caller});182    expect(await flipper.methods.getValue().call()).to.be.true;183184    // Balance should be taken from flipper instead of caller185    const balanceAfter = await web3.eth.getBalance(flipper.options.address);186    expect(+balanceAfter).to.be.equals(+originalFlipperBalance);187  });188189});