difftreelog
fix Small fixes.
in: master
6 files changed
Cargo.lockdiffbeforeafterboth--- a/Cargo.lock
+++ b/Cargo.lock
@@ -5552,7 +5552,7 @@
[[package]]
name = "pallet-common"
-version = "0.1.6"
+version = "0.1.7"
dependencies = [
"ethereum",
"evm-coder",
pallets/common/CHANGELOG.mddiffbeforeafterboth--- a/pallets/common/CHANGELOG.md
+++ b/pallets/common/CHANGELOG.md
@@ -2,7 +2,7 @@
All notable changes to this project will be documented in this file.
-## [0.2.0] - 2022-08-19
+## [0.1.7] - 2022-08-19
### Added
pallets/common/Cargo.tomldiffbeforeafterboth--- a/pallets/common/Cargo.toml
+++ b/pallets/common/Cargo.toml
@@ -1,6 +1,6 @@
[package]
name = "pallet-common"
-version = "0.1.6"
+version = "0.1.7"
license = "GPLv3"
edition = "2021"
tests/src/eth/collectionSponsoring.test.tsdiffbeforeafterboth--- a/tests/src/eth/collectionSponsoring.test.ts
+++ b/tests/src/eth/collectionSponsoring.test.ts
@@ -2,7 +2,7 @@
import {itWeb3, createEthAccount, collectionIdToAddress, GAS_ARGS, normalizeEvents, createEthAccountWithBalance, evmCollectionHelpers, getCollectionAddressFromResult, evmCollection, ethBalanceViaSub} from './util/helpers';
import nonFungibleAbi from './nonFungibleAbi.json';
import {expect} from 'chai';
-import { evmToAddress } from '@polkadot/util-crypto';
+import {evmToAddress} from '@polkadot/util-crypto';
describe('evm collection sponsoring', () => {
itWeb3('sponsors mint transactions', async ({web3, privateKeyWrapper}) => {
tests/src/eth/contractSponsoring.test.tsdiffbeforeafterboth1// Copyright 2019-2022 Unique Network (Gibraltar) Ltd.2// This file is part of Unique Network.34// Unique Network is free software: you can redistribute it and/or modify5// it under the terms of the GNU General Public License as published by6// the Free Software Foundation, either version 3 of the License, or7// (at your option) any later version.89// Unique Network is distributed in the hope that it will be useful,10// but WITHOUT ANY WARRANTY; without even the implied warranty of11// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the12// GNU General Public License for more details.1314// You should have received a copy of the GNU General Public License15// along with Unique Network. If not, see <http://www.gnu.org/licenses/>.1617import {expect} from 'chai';18import {19 contractHelpers,20 createEthAccountWithBalance,21 transferBalanceToEth,22 deployFlipper,23 itWeb3,24 SponsoringMode,25 createEthAccount,26 ethBalanceViaSub,27} from './util/helpers';28import {evmToAddress} from '@polkadot/util-crypto';2930describe('Sponsoring EVM contracts', () => {31 itWeb3('Self sponsored can be set by the address that deployed the contract', async ({api, web3, privateKeyWrapper}) => {32 const owner = await createEthAccountWithBalance(api, web3, privateKeyWrapper);33 const flipper = await deployFlipper(web3, owner);34 const helpers = contractHelpers(web3, owner);35 expect(await helpers.methods.hasSponsor(flipper.options.address).call()).to.be.false;36 await expect(helpers.methods.selfSponsoredEnable(flipper.options.address).send()).to.be.not.rejected;37 expect(await helpers.methods.hasSponsor(flipper.options.address).call()).to.be.true;38 });3940 itWeb3('Self sponsored can not be set by the address that did not deployed the contract', async ({api, web3, privateKeyWrapper}) => {41 const owner = await createEthAccountWithBalance(api, web3, privateKeyWrapper);42 const notOwner = await createEthAccountWithBalance(api, web3, privateKeyWrapper);43 const flipper = await deployFlipper(web3, owner);44 const helpers = contractHelpers(web3, owner);45 expect(await helpers.methods.hasSponsor(flipper.options.address).call()).to.be.false;46 await expect(helpers.methods.selfSponsoredEnable(flipper.options.address).call({from: notOwner})).to.be.rejectedWith('NoPermission');47 expect(await helpers.methods.hasSponsor(flipper.options.address).call()).to.be.false;48 });4950 itWeb3('Sponsoring can be set by the address that has deployed the contract', async ({api, web3, privateKeyWrapper}) => {51 const owner = await createEthAccountWithBalance(api, web3, privateKeyWrapper);52 const flipper = await deployFlipper(web3, owner);53 const helpers = contractHelpers(web3, owner);54 expect(await helpers.methods.sponsoringEnabled(flipper.options.address).call()).to.be.false;55 await expect(helpers.methods.setSponsoringMode(flipper.options.address, SponsoringMode.Allowlisted).send({from: owner})).to.be.not.rejected;56 expect(await helpers.methods.sponsoringEnabled(flipper.options.address).call()).to.be.true;57 });5859 itWeb3('Sponsoring cannot be set by the address that did not deployed the contract', async ({api, web3, privateKeyWrapper}) => {60 const owner = await createEthAccountWithBalance(api, web3, privateKeyWrapper);61 const notOwner = await createEthAccountWithBalance(api, web3, privateKeyWrapper);62 const flipper = await deployFlipper(web3, owner);63 const helpers = contractHelpers(web3, owner);64 expect(await helpers.methods.sponsoringEnabled(flipper.options.address).call()).to.be.false;65 await expect(helpers.methods.setSponsoringMode(notOwner, SponsoringMode.Allowlisted).call({from: notOwner})).to.be.rejectedWith('NoPermission');66 expect(await helpers.methods.sponsoringEnabled(flipper.options.address).call()).to.be.false;67 });68 69 itWeb3('Sponsor can be set by the address that deployed the contract', async ({api, web3, privateKeyWrapper}) => {70 const owner = await createEthAccountWithBalance(api, web3, privateKeyWrapper);71 const sponsor = await createEthAccountWithBalance(api, web3, privateKeyWrapper);72 const flipper = await deployFlipper(web3, owner);73 const helpers = contractHelpers(web3, owner);74 expect(await helpers.methods.hasPendingSponsor(flipper.options.address).call()).to.be.false;75 await expect(helpers.methods.setSponsor(flipper.options.address, sponsor).send()).to.be.not.rejected;76 expect(await helpers.methods.hasPendingSponsor(flipper.options.address).call()).to.be.true;77 });78 79 itWeb3('Sponsor can not be set by the address that did not deployed the contract', async ({api, web3, privateKeyWrapper}) => {80 const owner = await createEthAccountWithBalance(api, web3, privateKeyWrapper);81 const sponsor = await createEthAccountWithBalance(api, web3, privateKeyWrapper);82 const notOwner = await createEthAccountWithBalance(api, web3, privateKeyWrapper);83 const flipper = await deployFlipper(web3, owner);84 const helpers = contractHelpers(web3, owner);85 expect(await helpers.methods.hasPendingSponsor(flipper.options.address).call()).to.be.false;86 await expect(helpers.methods.setSponsor(flipper.options.address, sponsor).call({from: notOwner})).to.be.rejectedWith('NoPermission');87 expect(await helpers.methods.hasPendingSponsor(flipper.options.address).call()).to.be.false;88 });8990 itWeb3('Sponsorship can be confirmed by the address that pending as sponsor', async ({api, web3, privateKeyWrapper}) => {91 const owner = await createEthAccountWithBalance(api, web3, privateKeyWrapper);92 const sponsor = await createEthAccountWithBalance(api, web3, privateKeyWrapper);93 const flipper = await deployFlipper(web3, owner);94 const helpers = contractHelpers(web3, owner);95 expect(await helpers.methods.hasSponsor(flipper.options.address).call()).to.be.false;96 await expect(helpers.methods.setSponsor(flipper.options.address, sponsor).send()).to.be.not.rejected;97 await expect(helpers.methods.confirmSponsorship(flipper.options.address).send({from: sponsor})).to.be.not.rejected;98 expect(await helpers.methods.hasSponsor(flipper.options.address).call()).to.be.true;99 });100101 itWeb3('Sponsorship can not be confirmed by the address that not pending as sponsor', async ({api, web3, privateKeyWrapper}) => {102 const owner = await createEthAccountWithBalance(api, web3, privateKeyWrapper);103 const sponsor = await createEthAccountWithBalance(api, web3, privateKeyWrapper);104 const notSponsor = await createEthAccountWithBalance(api, web3, privateKeyWrapper);105 const flipper = await deployFlipper(web3, owner);106 const helpers = contractHelpers(web3, owner);107 expect(await helpers.methods.hasSponsor(flipper.options.address).call()).to.be.false;108 await expect(helpers.methods.setSponsor(flipper.options.address, sponsor).send()).to.be.not.rejected;109 await expect(helpers.methods.confirmSponsorship(flipper.options.address).call({from: notSponsor})).to.be.rejectedWith('NoPermission');110 expect(await helpers.methods.hasSponsor(flipper.options.address).call()).to.be.false;111 });112113 itWeb3('Sponsorship can not be confirmed by the address that not set as sponsor', async ({api, web3, privateKeyWrapper}) => {114 const owner = await createEthAccountWithBalance(api, web3, privateKeyWrapper);115 const notSponsor = await createEthAccountWithBalance(api, web3, privateKeyWrapper);116 const flipper = await deployFlipper(web3, owner);117 const helpers = contractHelpers(web3, owner);118 expect(await helpers.methods.hasSponsor(flipper.options.address).call()).to.be.false;119 await expect(helpers.methods.confirmSponsorship(flipper.options.address).call({from: notSponsor})).to.be.rejectedWith('NoPendingSponsor');120 expect(await helpers.methods.hasSponsor(flipper.options.address).call()).to.be.false;121 });122123 itWeb3('Get self sponsored sponsor', async ({api, web3, privateKeyWrapper}) => {124 const owner = await createEthAccountWithBalance(api, web3, privateKeyWrapper);125 const flipper = await deployFlipper(web3, owner);126 const helpers = contractHelpers(web3, owner);127 await helpers.methods.selfSponsoredEnable(flipper.options.address).send();128 129 const result = await helpers.methods.getSponsor(flipper.options.address).call();130131 expect(result[0]).to.be.eq(flipper.options.address);132 expect(result[1]).to.be.eq('0');133 });134135 itWeb3('Get confirmed sponsor', async ({api, web3, privateKeyWrapper}) => {136 const owner = await createEthAccountWithBalance(api, web3, privateKeyWrapper);137 const sponsor = await createEthAccountWithBalance(api, web3, privateKeyWrapper);138 const flipper = await deployFlipper(web3, owner);139 const helpers = contractHelpers(web3, owner);140 await helpers.methods.setSponsor(flipper.options.address, sponsor).send();141 await helpers.methods.confirmSponsorship(flipper.options.address).send({from: sponsor});142 143 const result = await helpers.methods.getSponsor(flipper.options.address).call();144145 expect(result[0]).to.be.eq(sponsor);146 expect(result[1]).to.be.eq('0');147 });148149 itWeb3('Sponsor can be removed by the address that deployed the contract', async ({api, web3, privateKeyWrapper}) => {150 const owner = await createEthAccountWithBalance(api, web3, privateKeyWrapper);151 const sponsor = await createEthAccountWithBalance(api, web3, privateKeyWrapper);152 const flipper = await deployFlipper(web3, owner);153 const helpers = contractHelpers(web3, owner);154155 expect(await helpers.methods.hasSponsor(flipper.options.address).call()).to.be.false;156 await helpers.methods.setSponsor(flipper.options.address, sponsor).send();157 await helpers.methods.confirmSponsorship(flipper.options.address).send({from: sponsor});158 expect(await helpers.methods.hasSponsor(flipper.options.address).call()).to.be.true;159 160 await helpers.methods.removeSponsor(flipper.options.address).send();161 expect(await helpers.methods.hasSponsor(flipper.options.address).call()).to.be.false;162 });163164 itWeb3('Sponsor can not be removed by the address that did not deployed the contract', async ({api, web3, privateKeyWrapper}) => {165 const owner = await createEthAccountWithBalance(api, web3, privateKeyWrapper);166 const notOwner = await createEthAccountWithBalance(api, web3, privateKeyWrapper);167 const sponsor = await createEthAccountWithBalance(api, web3, privateKeyWrapper);168 const flipper = await deployFlipper(web3, owner);169 const helpers = contractHelpers(web3, owner);170171 expect(await helpers.methods.hasSponsor(flipper.options.address).call()).to.be.false;172 await helpers.methods.setSponsor(flipper.options.address, sponsor).send();173 await helpers.methods.confirmSponsorship(flipper.options.address).send({from: sponsor});174 expect(await helpers.methods.hasSponsor(flipper.options.address).call()).to.be.true;175 176 await expect(helpers.methods.removeSponsor(flipper.options.address).call({from: notOwner})).to.be.rejectedWith('NoPermission');177 expect(await helpers.methods.hasSponsor(flipper.options.address).call()).to.be.true;178 });179180 itWeb3('In generous mode, non-allowlisted user transaction will be sponsored', async ({api, web3, privateKeyWrapper}) => {181 const owner = await createEthAccountWithBalance(api, web3, privateKeyWrapper);182 const sponsor = await createEthAccountWithBalance(api, web3, privateKeyWrapper);183 const caller = await createEthAccountWithBalance(api, web3, privateKeyWrapper);184185 const flipper = await deployFlipper(web3, owner);186187 const helpers = contractHelpers(web3, owner);188189 await helpers.methods.setSponsor(flipper.options.address, sponsor).send();190 await helpers.methods.confirmSponsorship(flipper.options.address).send({from: sponsor});191192 await helpers.methods.setSponsoringMode(flipper.options.address, SponsoringMode.Generous).send({from: owner});193 await helpers.methods.setSponsoringRateLimit(flipper.options.address, 0).send({from: owner});194195 const sponsorBalanceBefore = await ethBalanceViaSub(api, sponsor);196 const callerBalanceBefore = await ethBalanceViaSub(api, caller);197198 await flipper.methods.flip().send({from: caller});199 expect(await flipper.methods.getValue().call()).to.be.true;200201 // Balance should be taken from sponsor instead of caller202 const sponsorBalanceAfter = await ethBalanceViaSub(api, sponsor);203 const callerBalanceAfter = await ethBalanceViaSub(api, caller);204 expect(sponsorBalanceAfter < sponsorBalanceBefore).to.be.true;205 expect(callerBalanceAfter).to.be.eq(callerBalanceBefore);206 });207208 itWeb3('In generous mode, non-allowlisted user transaction will be self sponsored', async ({api, web3, privateKeyWrapper}) => {209 const alice = privateKeyWrapper('//Alice');210211 const owner = await createEthAccountWithBalance(api, web3, privateKeyWrapper);212 const caller = await createEthAccountWithBalance(api, web3, privateKeyWrapper);213214 const flipper = await deployFlipper(web3, owner);215216 const helpers = contractHelpers(web3, owner);217218 await helpers.methods.selfSponsoredEnable(flipper.options.address).send();219220 await helpers.methods.setSponsoringMode(flipper.options.address, SponsoringMode.Generous).send({from: owner});221 await helpers.methods.setSponsoringRateLimit(flipper.options.address, 0).send({from: owner});222223 await transferBalanceToEth(api, alice, flipper.options.address);224225 const contractBalanceBefore = await ethBalanceViaSub(api, flipper.options.address);226 const callerBalanceBefore = await ethBalanceViaSub(api, caller);227228 await flipper.methods.flip().send({from: caller});229 expect(await flipper.methods.getValue().call()).to.be.true;230231 // Balance should be taken from sponsor instead of caller232 const contractBalanceAfter = await ethBalanceViaSub(api, flipper.options.address);233 const callerBalanceAfter = await ethBalanceViaSub(api, caller);234 expect(contractBalanceAfter < contractBalanceBefore).to.be.true;235 expect(callerBalanceAfter).to.be.eq(callerBalanceBefore);236 });237238 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, privateKeyWrapper}) => {239 const owner = await createEthAccountWithBalance(api, web3, privateKeyWrapper);240 const sponsor = await createEthAccountWithBalance(api, web3, privateKeyWrapper);241 const caller = createEthAccount(web3);242243 const flipper = await deployFlipper(web3, owner);244245 const helpers = contractHelpers(web3, owner);246 await helpers.methods.toggleAllowlist(flipper.options.address, true).send({from: owner});247 await helpers.methods.toggleAllowed(flipper.options.address, caller, true).send({from: owner});248249 await helpers.methods.setSponsoringMode(flipper.options.address, SponsoringMode.Allowlisted).send({from: owner});250 await helpers.methods.setSponsoringRateLimit(flipper.options.address, 0).send({from: owner});251252 await helpers.methods.setSponsor(flipper.options.address, sponsor).send();253 await helpers.methods.confirmSponsorship(flipper.options.address).send({from: sponsor});254255 const sponsorBalanceBefore = await ethBalanceViaSub(api, sponsor);256 expect(sponsorBalanceBefore).to.be.not.equal('0');257258 await flipper.methods.flip().send({from: caller});259 expect(await flipper.methods.getValue().call()).to.be.true;260261 // Balance should be taken from flipper instead of caller262 const sponsorBalanceAfter = await ethBalanceViaSub(api, sponsor);263 expect(sponsorBalanceAfter < sponsorBalanceBefore).to.be.true;264 });265266 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, privateKeyWrapper}) => {267 const alice = privateKeyWrapper('//Alice');268269 const owner = await createEthAccountWithBalance(api, web3, privateKeyWrapper);270 const caller = createEthAccount(web3);271272 const flipper = await deployFlipper(web3, owner);273274 const helpers = contractHelpers(web3, owner);275276 await helpers.methods.setSponsoringMode(flipper.options.address, SponsoringMode.Allowlisted).send({from: owner});277 await helpers.methods.setSponsoringRateLimit(flipper.options.address, 0).send({from: owner});278279 await transferBalanceToEth(api, alice, flipper.options.address);280281 const originalFlipperBalance = await web3.eth.getBalance(flipper.options.address);282 expect(originalFlipperBalance).to.be.not.equal('0');283284 await expect(flipper.methods.flip().send({from: caller})).to.be.rejectedWith(/InvalidTransaction::Payment/);285 expect(await flipper.methods.getValue().call()).to.be.false;286287 // Balance should be taken from flipper instead of caller288 const balanceAfter = await web3.eth.getBalance(flipper.options.address);289 expect(+balanceAfter).to.be.equals(+originalFlipperBalance);290 });291292 itWeb3('Sponsoring is set, an address that has UNQ can send a transaction and it works. User balance should not change', async ({api, web3, privateKeyWrapper}) => {293 const owner = await createEthAccountWithBalance(api, web3, privateKeyWrapper);294 const sponsor = await createEthAccountWithBalance(api, web3, privateKeyWrapper);295 const caller = await createEthAccountWithBalance(api, web3, privateKeyWrapper);296297 const flipper = await deployFlipper(web3, owner);298299 const helpers = contractHelpers(web3, owner);300 await helpers.methods.toggleAllowlist(flipper.options.address, true).send({from: owner});301 await helpers.methods.toggleAllowed(flipper.options.address, caller, true).send({from: owner});302303 await helpers.methods.setSponsoringMode(flipper.options.address, SponsoringMode.Allowlisted).send({from: owner});304 await helpers.methods.setSponsoringRateLimit(flipper.options.address, 0).send({from: owner});305306 await helpers.methods.setSponsor(flipper.options.address, sponsor).send();307 await helpers.methods.confirmSponsorship(flipper.options.address).send({from: sponsor});308309 const sponsorBalanceBefore = await ethBalanceViaSub(api, sponsor);310 const callerBalanceBefore = await ethBalanceViaSub(api, caller);311312 await flipper.methods.flip().send({from: caller});313 expect(await flipper.methods.getValue().call()).to.be.true;314315 const sponsorBalanceAfter = await ethBalanceViaSub(api, sponsor);316 const callerBalanceAfter = await ethBalanceViaSub(api, caller);317 expect(sponsorBalanceAfter < sponsorBalanceBefore).to.be.true;318 expect(callerBalanceAfter).to.be.equals(callerBalanceBefore);319 });320321 itWeb3('Sponsoring is limited, with setContractRateLimit. The limitation is working if transactions are sent more often, the sender pays the commission.', async ({api, web3, privateKeyWrapper}) => {322 const owner = await createEthAccountWithBalance(api, web3, privateKeyWrapper);323 const sponsor = await createEthAccountWithBalance(api, web3, privateKeyWrapper);324 const caller = await createEthAccountWithBalance(api, web3, privateKeyWrapper);325 const originalCallerBalance = await web3.eth.getBalance(caller);326327 const flipper = await deployFlipper(web3, owner);328329 const helpers = contractHelpers(web3, owner);330 await helpers.methods.toggleAllowlist(flipper.options.address, true).send({from: owner});331 await helpers.methods.toggleAllowed(flipper.options.address, caller, true).send({from: owner});332333 await helpers.methods.setSponsoringMode(flipper.options.address, SponsoringMode.Allowlisted).send({from: owner});334 await helpers.methods.setSponsoringRateLimit(flipper.options.address, 10).send({from: owner});335336 await helpers.methods.setSponsor(flipper.options.address, sponsor).send();337 await helpers.methods.confirmSponsorship(flipper.options.address).send({from: sponsor});338339 const originalFlipperBalance = await web3.eth.getBalance(sponsor);340 expect(originalFlipperBalance).to.be.not.equal('0');341342 await flipper.methods.flip().send({from: caller});343 expect(await flipper.methods.getValue().call()).to.be.true;344 expect(await web3.eth.getBalance(caller)).to.be.equals(originalCallerBalance);345346 const newFlipperBalance = await web3.eth.getBalance(sponsor);347 expect(newFlipperBalance).to.be.not.equals(originalFlipperBalance);348349 await flipper.methods.flip().send({from: caller});350 expect(await web3.eth.getBalance(sponsor)).to.be.equal(newFlipperBalance);351 expect(await web3.eth.getBalance(caller)).to.be.not.equals(originalCallerBalance);352 });353354 // TODO: Find a way to calculate default rate limit355 itWeb3('Default rate limit equals 7200', async ({api, web3, privateKeyWrapper}) => {356 const owner = await createEthAccountWithBalance(api, web3, privateKeyWrapper);357 const flipper = await deployFlipper(web3, owner);358 const helpers = contractHelpers(web3, owner);359 expect(await helpers.methods.getSponsoringRateLimit(flipper.options.address).call()).to.be.equals('7200');360 });361});1// Copyright 2019-2022 Unique Network (Gibraltar) Ltd.2// This file is part of Unique Network.34// Unique Network is free software: you can redistribute it and/or modify5// it under the terms of the GNU General Public License as published by6// the Free Software Foundation, either version 3 of the License, or7// (at your option) any later version.89// Unique Network is distributed in the hope that it will be useful,10// but WITHOUT ANY WARRANTY; without even the implied warranty of11// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the12// GNU General Public License for more details.1314// You should have received a copy of the GNU General Public License15// along with Unique Network. If not, see <http://www.gnu.org/licenses/>.1617import {expect} from 'chai';18import {19 contractHelpers,20 createEthAccountWithBalance,21 transferBalanceToEth,22 deployFlipper,23 itWeb3,24 SponsoringMode,25 createEthAccount,26 ethBalanceViaSub,27} from './util/helpers';2829describe('Sponsoring EVM contracts', () => {30 itWeb3('Self sponsored can be set by the address that deployed the contract', async ({api, web3, privateKeyWrapper}) => {31 const owner = await createEthAccountWithBalance(api, web3, privateKeyWrapper);32 const flipper = await deployFlipper(web3, owner);33 const helpers = contractHelpers(web3, owner);34 expect(await helpers.methods.hasSponsor(flipper.options.address).call()).to.be.false;35 await expect(helpers.methods.selfSponsoredEnable(flipper.options.address).send()).to.be.not.rejected;36 expect(await helpers.methods.hasSponsor(flipper.options.address).call()).to.be.true;37 });3839 itWeb3('Self sponsored can not be set by the address that did not deployed the contract', async ({api, web3, privateKeyWrapper}) => {40 const owner = await createEthAccountWithBalance(api, web3, privateKeyWrapper);41 const notOwner = await createEthAccountWithBalance(api, web3, privateKeyWrapper);42 const flipper = await deployFlipper(web3, owner);43 const helpers = contractHelpers(web3, owner);44 expect(await helpers.methods.hasSponsor(flipper.options.address).call()).to.be.false;45 await expect(helpers.methods.selfSponsoredEnable(flipper.options.address).call({from: notOwner})).to.be.rejectedWith('NoPermission');46 expect(await helpers.methods.hasSponsor(flipper.options.address).call()).to.be.false;47 });4849 itWeb3('Sponsoring can be set by the address that has deployed the contract', async ({api, web3, privateKeyWrapper}) => {50 const owner = await createEthAccountWithBalance(api, web3, privateKeyWrapper);51 const flipper = await deployFlipper(web3, owner);52 const helpers = contractHelpers(web3, owner);53 expect(await helpers.methods.sponsoringEnabled(flipper.options.address).call()).to.be.false;54 await expect(helpers.methods.setSponsoringMode(flipper.options.address, SponsoringMode.Allowlisted).send({from: owner})).to.be.not.rejected;55 expect(await helpers.methods.sponsoringEnabled(flipper.options.address).call()).to.be.true;56 });5758 itWeb3('Sponsoring cannot be set by the address that did not deployed the contract', async ({api, web3, privateKeyWrapper}) => {59 const owner = await createEthAccountWithBalance(api, web3, privateKeyWrapper);60 const notOwner = await createEthAccountWithBalance(api, web3, privateKeyWrapper);61 const flipper = await deployFlipper(web3, owner);62 const helpers = contractHelpers(web3, owner);63 expect(await helpers.methods.sponsoringEnabled(flipper.options.address).call()).to.be.false;64 await expect(helpers.methods.setSponsoringMode(notOwner, SponsoringMode.Allowlisted).call({from: notOwner})).to.be.rejectedWith('NoPermission');65 expect(await helpers.methods.sponsoringEnabled(flipper.options.address).call()).to.be.false;66 });67 68 itWeb3('Sponsor can be set by the address that deployed the contract', async ({api, web3, privateKeyWrapper}) => {69 const owner = await createEthAccountWithBalance(api, web3, privateKeyWrapper);70 const sponsor = await createEthAccountWithBalance(api, web3, privateKeyWrapper);71 const flipper = await deployFlipper(web3, owner);72 const helpers = contractHelpers(web3, owner);73 expect(await helpers.methods.hasPendingSponsor(flipper.options.address).call()).to.be.false;74 await expect(helpers.methods.setSponsor(flipper.options.address, sponsor).send()).to.be.not.rejected;75 expect(await helpers.methods.hasPendingSponsor(flipper.options.address).call()).to.be.true;76 });77 78 itWeb3('Sponsor can not be set by the address that did not deployed the contract', async ({api, web3, privateKeyWrapper}) => {79 const owner = await createEthAccountWithBalance(api, web3, privateKeyWrapper);80 const sponsor = await createEthAccountWithBalance(api, web3, privateKeyWrapper);81 const notOwner = await createEthAccountWithBalance(api, web3, privateKeyWrapper);82 const flipper = await deployFlipper(web3, owner);83 const helpers = contractHelpers(web3, owner);84 expect(await helpers.methods.hasPendingSponsor(flipper.options.address).call()).to.be.false;85 await expect(helpers.methods.setSponsor(flipper.options.address, sponsor).call({from: notOwner})).to.be.rejectedWith('NoPermission');86 expect(await helpers.methods.hasPendingSponsor(flipper.options.address).call()).to.be.false;87 });8889 itWeb3('Sponsorship can be confirmed by the address that pending as sponsor', async ({api, web3, privateKeyWrapper}) => {90 const owner = await createEthAccountWithBalance(api, web3, privateKeyWrapper);91 const sponsor = await createEthAccountWithBalance(api, web3, privateKeyWrapper);92 const flipper = await deployFlipper(web3, owner);93 const helpers = contractHelpers(web3, owner);94 expect(await helpers.methods.hasSponsor(flipper.options.address).call()).to.be.false;95 await expect(helpers.methods.setSponsor(flipper.options.address, sponsor).send()).to.be.not.rejected;96 await expect(helpers.methods.confirmSponsorship(flipper.options.address).send({from: sponsor})).to.be.not.rejected;97 expect(await helpers.methods.hasSponsor(flipper.options.address).call()).to.be.true;98 });99100 itWeb3('Sponsorship can not be confirmed by the address that not pending as sponsor', async ({api, web3, privateKeyWrapper}) => {101 const owner = await createEthAccountWithBalance(api, web3, privateKeyWrapper);102 const sponsor = await createEthAccountWithBalance(api, web3, privateKeyWrapper);103 const notSponsor = await createEthAccountWithBalance(api, web3, privateKeyWrapper);104 const flipper = await deployFlipper(web3, owner);105 const helpers = contractHelpers(web3, owner);106 expect(await helpers.methods.hasSponsor(flipper.options.address).call()).to.be.false;107 await expect(helpers.methods.setSponsor(flipper.options.address, sponsor).send()).to.be.not.rejected;108 await expect(helpers.methods.confirmSponsorship(flipper.options.address).call({from: notSponsor})).to.be.rejectedWith('NoPermission');109 expect(await helpers.methods.hasSponsor(flipper.options.address).call()).to.be.false;110 });111112 itWeb3('Sponsorship can not be confirmed by the address that not set as sponsor', async ({api, web3, privateKeyWrapper}) => {113 const owner = await createEthAccountWithBalance(api, web3, privateKeyWrapper);114 const notSponsor = await createEthAccountWithBalance(api, web3, privateKeyWrapper);115 const flipper = await deployFlipper(web3, owner);116 const helpers = contractHelpers(web3, owner);117 expect(await helpers.methods.hasSponsor(flipper.options.address).call()).to.be.false;118 await expect(helpers.methods.confirmSponsorship(flipper.options.address).call({from: notSponsor})).to.be.rejectedWith('NoPendingSponsor');119 expect(await helpers.methods.hasSponsor(flipper.options.address).call()).to.be.false;120 });121122 itWeb3('Get self sponsored sponsor', async ({api, web3, privateKeyWrapper}) => {123 const owner = await createEthAccountWithBalance(api, web3, privateKeyWrapper);124 const flipper = await deployFlipper(web3, owner);125 const helpers = contractHelpers(web3, owner);126 await helpers.methods.selfSponsoredEnable(flipper.options.address).send();127 128 const result = await helpers.methods.getSponsor(flipper.options.address).call();129130 expect(result[0]).to.be.eq(flipper.options.address);131 expect(result[1]).to.be.eq('0');132 });133134 itWeb3('Get confirmed sponsor', async ({api, web3, privateKeyWrapper}) => {135 const owner = await createEthAccountWithBalance(api, web3, privateKeyWrapper);136 const sponsor = await createEthAccountWithBalance(api, web3, privateKeyWrapper);137 const flipper = await deployFlipper(web3, owner);138 const helpers = contractHelpers(web3, owner);139 await helpers.methods.setSponsor(flipper.options.address, sponsor).send();140 await helpers.methods.confirmSponsorship(flipper.options.address).send({from: sponsor});141 142 const result = await helpers.methods.getSponsor(flipper.options.address).call();143144 expect(result[0]).to.be.eq(sponsor);145 expect(result[1]).to.be.eq('0');146 });147148 itWeb3('Sponsor can be removed by the address that deployed the contract', async ({api, web3, privateKeyWrapper}) => {149 const owner = await createEthAccountWithBalance(api, web3, privateKeyWrapper);150 const sponsor = await createEthAccountWithBalance(api, web3, privateKeyWrapper);151 const flipper = await deployFlipper(web3, owner);152 const helpers = contractHelpers(web3, owner);153154 expect(await helpers.methods.hasSponsor(flipper.options.address).call()).to.be.false;155 await helpers.methods.setSponsor(flipper.options.address, sponsor).send();156 await helpers.methods.confirmSponsorship(flipper.options.address).send({from: sponsor});157 expect(await helpers.methods.hasSponsor(flipper.options.address).call()).to.be.true;158 159 await helpers.methods.removeSponsor(flipper.options.address).send();160 expect(await helpers.methods.hasSponsor(flipper.options.address).call()).to.be.false;161 });162163 itWeb3('Sponsor can not be removed by the address that did not deployed the contract', async ({api, web3, privateKeyWrapper}) => {164 const owner = await createEthAccountWithBalance(api, web3, privateKeyWrapper);165 const notOwner = await createEthAccountWithBalance(api, web3, privateKeyWrapper);166 const sponsor = await createEthAccountWithBalance(api, web3, privateKeyWrapper);167 const flipper = await deployFlipper(web3, owner);168 const helpers = contractHelpers(web3, owner);169170 expect(await helpers.methods.hasSponsor(flipper.options.address).call()).to.be.false;171 await helpers.methods.setSponsor(flipper.options.address, sponsor).send();172 await helpers.methods.confirmSponsorship(flipper.options.address).send({from: sponsor});173 expect(await helpers.methods.hasSponsor(flipper.options.address).call()).to.be.true;174 175 await expect(helpers.methods.removeSponsor(flipper.options.address).call({from: notOwner})).to.be.rejectedWith('NoPermission');176 expect(await helpers.methods.hasSponsor(flipper.options.address).call()).to.be.true;177 });178179 itWeb3('In generous mode, non-allowlisted user transaction will be sponsored', async ({api, web3, privateKeyWrapper}) => {180 const owner = await createEthAccountWithBalance(api, web3, privateKeyWrapper);181 const sponsor = await createEthAccountWithBalance(api, web3, privateKeyWrapper);182 const caller = await createEthAccountWithBalance(api, web3, privateKeyWrapper);183184 const flipper = await deployFlipper(web3, owner);185186 const helpers = contractHelpers(web3, owner);187188 await helpers.methods.setSponsor(flipper.options.address, sponsor).send();189 await helpers.methods.confirmSponsorship(flipper.options.address).send({from: sponsor});190191 await helpers.methods.setSponsoringMode(flipper.options.address, SponsoringMode.Generous).send({from: owner});192 await helpers.methods.setSponsoringRateLimit(flipper.options.address, 0).send({from: owner});193194 const sponsorBalanceBefore = await ethBalanceViaSub(api, sponsor);195 const callerBalanceBefore = await ethBalanceViaSub(api, caller);196197 await flipper.methods.flip().send({from: caller});198 expect(await flipper.methods.getValue().call()).to.be.true;199200 // Balance should be taken from sponsor instead of caller201 const sponsorBalanceAfter = await ethBalanceViaSub(api, sponsor);202 const callerBalanceAfter = await ethBalanceViaSub(api, caller);203 expect(sponsorBalanceAfter < sponsorBalanceBefore).to.be.true;204 expect(callerBalanceAfter).to.be.eq(callerBalanceBefore);205 });206207 itWeb3('In generous mode, non-allowlisted user transaction will be self sponsored', async ({api, web3, privateKeyWrapper}) => {208 const alice = privateKeyWrapper('//Alice');209210 const owner = await createEthAccountWithBalance(api, web3, privateKeyWrapper);211 const caller = await createEthAccountWithBalance(api, web3, privateKeyWrapper);212213 const flipper = await deployFlipper(web3, owner);214215 const helpers = contractHelpers(web3, owner);216217 await helpers.methods.selfSponsoredEnable(flipper.options.address).send();218219 await helpers.methods.setSponsoringMode(flipper.options.address, SponsoringMode.Generous).send({from: owner});220 await helpers.methods.setSponsoringRateLimit(flipper.options.address, 0).send({from: owner});221222 await transferBalanceToEth(api, alice, flipper.options.address);223224 const contractBalanceBefore = await ethBalanceViaSub(api, flipper.options.address);225 const callerBalanceBefore = await ethBalanceViaSub(api, caller);226227 await flipper.methods.flip().send({from: caller});228 expect(await flipper.methods.getValue().call()).to.be.true;229230 // Balance should be taken from sponsor instead of caller231 const contractBalanceAfter = await ethBalanceViaSub(api, flipper.options.address);232 const callerBalanceAfter = await ethBalanceViaSub(api, caller);233 expect(contractBalanceAfter < contractBalanceBefore).to.be.true;234 expect(callerBalanceAfter).to.be.eq(callerBalanceBefore);235 });236237 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, privateKeyWrapper}) => {238 const owner = await createEthAccountWithBalance(api, web3, privateKeyWrapper);239 const sponsor = await createEthAccountWithBalance(api, web3, privateKeyWrapper);240 const caller = createEthAccount(web3);241242 const flipper = await deployFlipper(web3, owner);243244 const helpers = contractHelpers(web3, owner);245 await helpers.methods.toggleAllowlist(flipper.options.address, true).send({from: owner});246 await helpers.methods.toggleAllowed(flipper.options.address, caller, true).send({from: owner});247248 await helpers.methods.setSponsoringMode(flipper.options.address, SponsoringMode.Allowlisted).send({from: owner});249 await helpers.methods.setSponsoringRateLimit(flipper.options.address, 0).send({from: owner});250251 await helpers.methods.setSponsor(flipper.options.address, sponsor).send();252 await helpers.methods.confirmSponsorship(flipper.options.address).send({from: sponsor});253254 const sponsorBalanceBefore = await ethBalanceViaSub(api, sponsor);255 expect(sponsorBalanceBefore).to.be.not.equal('0');256257 await flipper.methods.flip().send({from: caller});258 expect(await flipper.methods.getValue().call()).to.be.true;259260 // Balance should be taken from flipper instead of caller261 const sponsorBalanceAfter = await ethBalanceViaSub(api, sponsor);262 expect(sponsorBalanceAfter < sponsorBalanceBefore).to.be.true;263 });264265 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, privateKeyWrapper}) => {266 const alice = privateKeyWrapper('//Alice');267268 const owner = await createEthAccountWithBalance(api, web3, privateKeyWrapper);269 const caller = createEthAccount(web3);270271 const flipper = await deployFlipper(web3, owner);272273 const helpers = contractHelpers(web3, owner);274275 await helpers.methods.setSponsoringMode(flipper.options.address, SponsoringMode.Allowlisted).send({from: owner});276 await helpers.methods.setSponsoringRateLimit(flipper.options.address, 0).send({from: owner});277278 await transferBalanceToEth(api, alice, flipper.options.address);279280 const originalFlipperBalance = await web3.eth.getBalance(flipper.options.address);281 expect(originalFlipperBalance).to.be.not.equal('0');282283 await expect(flipper.methods.flip().send({from: caller})).to.be.rejectedWith(/InvalidTransaction::Payment/);284 expect(await flipper.methods.getValue().call()).to.be.false;285286 // Balance should be taken from flipper instead of caller287 const balanceAfter = await web3.eth.getBalance(flipper.options.address);288 expect(+balanceAfter).to.be.equals(+originalFlipperBalance);289 });290291 itWeb3('Sponsoring is set, an address that has UNQ can send a transaction and it works. User balance should not change', async ({api, web3, privateKeyWrapper}) => {292 const owner = await createEthAccountWithBalance(api, web3, privateKeyWrapper);293 const sponsor = await createEthAccountWithBalance(api, web3, privateKeyWrapper);294 const caller = await createEthAccountWithBalance(api, web3, privateKeyWrapper);295296 const flipper = await deployFlipper(web3, owner);297298 const helpers = contractHelpers(web3, owner);299 await helpers.methods.toggleAllowlist(flipper.options.address, true).send({from: owner});300 await helpers.methods.toggleAllowed(flipper.options.address, caller, true).send({from: owner});301302 await helpers.methods.setSponsoringMode(flipper.options.address, SponsoringMode.Allowlisted).send({from: owner});303 await helpers.methods.setSponsoringRateLimit(flipper.options.address, 0).send({from: owner});304305 await helpers.methods.setSponsor(flipper.options.address, sponsor).send();306 await helpers.methods.confirmSponsorship(flipper.options.address).send({from: sponsor});307308 const sponsorBalanceBefore = await ethBalanceViaSub(api, sponsor);309 const callerBalanceBefore = await ethBalanceViaSub(api, caller);310311 await flipper.methods.flip().send({from: caller});312 expect(await flipper.methods.getValue().call()).to.be.true;313314 const sponsorBalanceAfter = await ethBalanceViaSub(api, sponsor);315 const callerBalanceAfter = await ethBalanceViaSub(api, caller);316 expect(sponsorBalanceAfter < sponsorBalanceBefore).to.be.true;317 expect(callerBalanceAfter).to.be.equals(callerBalanceBefore);318 });319320 itWeb3('Sponsoring is limited, with setContractRateLimit. The limitation is working if transactions are sent more often, the sender pays the commission.', async ({api, web3, privateKeyWrapper}) => {321 const owner = await createEthAccountWithBalance(api, web3, privateKeyWrapper);322 const sponsor = await createEthAccountWithBalance(api, web3, privateKeyWrapper);323 const caller = await createEthAccountWithBalance(api, web3, privateKeyWrapper);324 const originalCallerBalance = await web3.eth.getBalance(caller);325326 const flipper = await deployFlipper(web3, owner);327328 const helpers = contractHelpers(web3, owner);329 await helpers.methods.toggleAllowlist(flipper.options.address, true).send({from: owner});330 await helpers.methods.toggleAllowed(flipper.options.address, caller, true).send({from: owner});331332 await helpers.methods.setSponsoringMode(flipper.options.address, SponsoringMode.Allowlisted).send({from: owner});333 await helpers.methods.setSponsoringRateLimit(flipper.options.address, 10).send({from: owner});334335 await helpers.methods.setSponsor(flipper.options.address, sponsor).send();336 await helpers.methods.confirmSponsorship(flipper.options.address).send({from: sponsor});337338 const originalFlipperBalance = await web3.eth.getBalance(sponsor);339 expect(originalFlipperBalance).to.be.not.equal('0');340341 await flipper.methods.flip().send({from: caller});342 expect(await flipper.methods.getValue().call()).to.be.true;343 expect(await web3.eth.getBalance(caller)).to.be.equals(originalCallerBalance);344345 const newFlipperBalance = await web3.eth.getBalance(sponsor);346 expect(newFlipperBalance).to.be.not.equals(originalFlipperBalance);347348 await flipper.methods.flip().send({from: caller});349 expect(await web3.eth.getBalance(sponsor)).to.be.equal(newFlipperBalance);350 expect(await web3.eth.getBalance(caller)).to.be.not.equals(originalCallerBalance);351 });352353 // TODO: Find a way to calculate default rate limit354 itWeb3('Default rate limit equals 7200', async ({api, web3, privateKeyWrapper}) => {355 const owner = await createEthAccountWithBalance(api, web3, privateKeyWrapper);356 const flipper = await deployFlipper(web3, owner);357 const helpers = contractHelpers(web3, owner);358 expect(await helpers.methods.getSponsoringRateLimit(flipper.options.address).call()).to.be.equals('7200');359 });360});tests/src/eth/sponsoring.test.tsdiffbeforeafterboth--- a/tests/src/eth/sponsoring.test.ts
+++ b/tests/src/eth/sponsoring.test.ts
@@ -51,8 +51,6 @@
});
itWeb3('...but this doesn\'t applies to payable value', async ({api, web3, privateKeyWrapper}) => {
- const alice = privateKeyWrapper('//Alice');
-
const owner = await createEthAccountWithBalance(api, web3, privateKeyWrapper);
const sponsor = await createEthAccountWithBalance(api, web3, privateKeyWrapper);
const caller = await createEthAccountWithBalance(api, web3, privateKeyWrapper);