difftreelog
test Add test for "sef sponsoring" and "remove sponsor".
in: master
4 files changed
pallets/evm-contract-helpers/src/stubs/ContractHelpers.soldiffbeforeafterboth--- a/pallets/evm-contract-helpers/src/stubs/ContractHelpers.sol
+++ b/pallets/evm-contract-helpers/src/stubs/ContractHelpers.sol
@@ -27,8 +27,13 @@
}
}
-// Selector: 06fc42e9
+// Selector: 6073d917
contract ContractHelpers is Dummy, ERC165 {
+ // Get contract ovner
+ //
+ // @param Contract_address contract for which the owner is being determined.
+ // @return Contract owner.
+ //
// Selector: contractOwner(address) 5152b14c
function contractOwner(address contractAddress)
public
@@ -41,6 +46,11 @@
return 0x0000000000000000000000000000000000000000;
}
+ // Set sponsor.
+ //
+ // @param contract_address Contract for which a sponsor is being established.
+ // @param sponsor User address who set as pending sponsor.
+ //
// Selector: setSponsor(address,address) f01fba93
function setSponsor(address contractAddress, address sponsor) public {
require(false, stub_error);
@@ -49,6 +59,34 @@
dummy = 0;
}
+ // Set contract as self sponsored.
+ //
+ // @param contract_address Contract for which a self sponsoring is being enabled.
+ //
+ // Selector: selfSponsoredEnable(address) 89f7d9ae
+ function selfSponsoredEnable(address contractAddress) public {
+ require(false, stub_error);
+ contractAddress;
+ dummy = 0;
+ }
+
+ // Remove sponsor.
+ //
+ // @param contract_address Contract for which a sponsorship is being removed.
+ //
+ // Selector: removeSponsor(address) ef784250
+ function removeSponsor(address contractAddress) public {
+ require(false, stub_error);
+ contractAddress;
+ dummy = 0;
+ }
+
+ // Confirm sponsorship.
+ //
+ // @dev Caller must be same that set via [`set_sponsor`].
+ //
+ // @param contract_address Сontract for which need to confirm sponsorship.
+ //
// Selector: confirmSponsorship(address) abc00001
function confirmSponsorship(address contractAddress) public {
require(false, stub_error);
@@ -56,6 +94,11 @@
dummy = 0;
}
+ // Get current sponsor.
+ //
+ // @param contract_address The contract for which a sponsor is requested.
+ // @return Tuble with sponsor address and his substrate mirror. If there is no confirmed sponsor error "Contract has no sponsor" throw.
+ //
// Selector: getSponsor(address) 743fc745
function getSponsor(address contractAddress)
public
@@ -68,6 +111,11 @@
return Tuple0(0x0000000000000000000000000000000000000000, 0);
}
+ // Check tat contract has confirmed sponsor.
+ //
+ // @param contract_address The contract for which the presence of a confirmed sponsor is checked.
+ // @return **true** if contract has confirmed sponsor.
+ //
// Selector: hasSponsor(address) 97418603
function hasSponsor(address contractAddress) public view returns (bool) {
require(false, stub_error);
@@ -76,6 +124,11 @@
return false;
}
+ // Check tat contract has pending sponsor.
+ //
+ // @param contract_address The contract for which the presence of a pending sponsor is checked.
+ // @return **true** if contract has pending sponsor.
+ //
// Selector: hasPendingSponsor(address) 39b9b242
function hasPendingSponsor(address contractAddress)
public
tests/src/eth/api/ContractHelpers.soldiffbeforeafterboth--- a/tests/src/eth/api/ContractHelpers.sol
+++ b/tests/src/eth/api/ContractHelpers.sol
@@ -18,29 +18,74 @@
function supportsInterface(bytes4 interfaceID) external view returns (bool);
}
-// Selector: 06fc42e9
+// Selector: 6073d917
interface ContractHelpers is Dummy, ERC165 {
+ // Get contract ovner
+ //
+ // @param Contract_address contract for which the owner is being determined.
+ // @return Contract owner.
+ //
// Selector: contractOwner(address) 5152b14c
function contractOwner(address contractAddress)
external
view
returns (address);
+ // Set sponsor.
+ //
+ // @param contract_address Contract for which a sponsor is being established.
+ // @param sponsor User address who set as pending sponsor.
+ //
// Selector: setSponsor(address,address) f01fba93
function setSponsor(address contractAddress, address sponsor) external;
+ // Set contract as self sponsored.
+ //
+ // @param contract_address Contract for which a self sponsoring is being enabled.
+ //
+ // Selector: selfSponsoredEnable(address) 89f7d9ae
+ function selfSponsoredEnable(address contractAddress) external;
+
+ // Remove sponsor.
+ //
+ // @param contract_address Contract for which a sponsorship is being removed.
+ //
+ // Selector: removeSponsor(address) ef784250
+ function removeSponsor(address contractAddress) external;
+
+ // Confirm sponsorship.
+ //
+ // @dev Caller must be same that set via [`set_sponsor`].
+ //
+ // @param contract_address Сontract for which need to confirm sponsorship.
+ //
// Selector: confirmSponsorship(address) abc00001
function confirmSponsorship(address contractAddress) external;
+ // Get current sponsor.
+ //
+ // @param contract_address The contract for which a sponsor is requested.
+ // @return Tuble with sponsor address and his substrate mirror. If there is no confirmed sponsor error "Contract has no sponsor" throw.
+ //
// Selector: getSponsor(address) 743fc745
function getSponsor(address contractAddress)
external
view
returns (Tuple0 memory);
+ // Check tat contract has confirmed sponsor.
+ //
+ // @param contract_address The contract for which the presence of a confirmed sponsor is checked.
+ // @return **true** if contract has confirmed sponsor.
+ //
// Selector: hasSponsor(address) 97418603
function hasSponsor(address contractAddress) external view returns (bool);
+ // Check tat contract has pending sponsor.
+ //
+ // @param contract_address The contract for which the presence of a pending sponsor is checked.
+ // @return **true** if contract has pending sponsor.
+ //
// Selector: hasPendingSponsor(address) 39b9b242
function hasPendingSponsor(address contractAddress)
external
tests/src/eth/contractSponsoring.test.tsdiffbeforeafterboth28import {evmToAddress} from '@polkadot/util-crypto';28import {evmToAddress} from '@polkadot/util-crypto';292930describe('Sponsoring EVM contracts', () => {30describe('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 });4931 itWeb3('Sponsoring can be set by the address that has deployed the contract', async ({api, web3, privateKeyWrapper}) => {50 itWeb3('Sponsoring can be set by the address that has deployed the contract', async ({api, web3, privateKeyWrapper}) => {32 const owner = await createEthAccountWithBalance(api, web3, privateKeyWrapper);51 const owner = await createEthAccountWithBalance(api, web3, privateKeyWrapper);33 const flipper = await deployFlipper(web3, owner);52 const flipper = await deployFlipper(web3, owner);34 const helpers = contractHelpers(web3, owner);53 const helpers = contractHelpers(web3, owner);35 expect(await helpers.methods.sponsoringEnabled(flipper.options.address).call()).to.be.false;54 expect(await helpers.methods.sponsoringEnabled(flipper.options.address).call()).to.be.false;36 await helpers.methods.setSponsoringMode(flipper.options.address, SponsoringMode.Allowlisted).send({from: owner});55 await expect(helpers.methods.setSponsoringMode(flipper.options.address, SponsoringMode.Allowlisted).send({from: owner})).to.be.not.rejected;37 expect(await helpers.methods.sponsoringEnabled(flipper.options.address).call()).to.be.true;56 expect(await helpers.methods.sponsoringEnabled(flipper.options.address).call()).to.be.true;38 });57 });395843 const flipper = await deployFlipper(web3, owner);62 const flipper = await deployFlipper(web3, owner);44 const helpers = contractHelpers(web3, owner);63 const helpers = contractHelpers(web3, owner);45 expect(await helpers.methods.sponsoringEnabled(flipper.options.address).call()).to.be.false;64 expect(await helpers.methods.sponsoringEnabled(flipper.options.address).call()).to.be.false;46 await expect(helpers.methods.setSponsoringMode(notOwner, SponsoringMode.Allowlisted).send({from: notOwner})).to.rejected;65 await expect(helpers.methods.setSponsoringMode(notOwner, SponsoringMode.Allowlisted).call({from: notOwner})).to.be.rejectedWith('NoPermission');47 expect(await helpers.methods.sponsoringEnabled(flipper.options.address).call()).to.be.false;66 expect(await helpers.methods.sponsoringEnabled(flipper.options.address).call()).to.be.false;48 });67 });49 68 91 expect(await helpers.methods.hasSponsor(flipper.options.address).call()).to.be.false;110 expect(await helpers.methods.hasSponsor(flipper.options.address).call()).to.be.false;92 });111 });112113 itWeb3('Get self sponsored sponsor', async ({api, web3, privateKeyWrapper}) => {114 const owner = await createEthAccountWithBalance(api, web3, privateKeyWrapper);115 const flipper = await deployFlipper(web3, owner);116 const helpers = contractHelpers(web3, owner);117 await helpers.methods.selfSponsoredEnable(flipper.options.address).send();118 119 const result = await helpers.methods.getSponsor(flipper.options.address).call();120121 expect(result[0]).to.be.eq(flipper.options.address);122 const sponsorSub = api.registry.createType('AccountId', '0x' + BigInt(result[1]).toString(16).padStart(64, '0')).toJSON();123 expect(sponsorSub).to.be.eq(evmToAddress(flipper.options.address));124 });9312594 itWeb3('Get confirmed sponsor', async ({api, web3, privateKeyWrapper}) => {126 itWeb3('Get confirmed sponsor', async ({api, web3, privateKeyWrapper}) => {95 const owner = await createEthAccountWithBalance(api, web3, privateKeyWrapper);127 const owner = await createEthAccountWithBalance(api, web3, privateKeyWrapper);106 expect(sponsorSub).to.be.eq(evmToAddress(sponsor));138 expect(sponsorSub).to.be.eq(evmToAddress(sponsor));107 });139 });140141 itWeb3('Sponsor can be removed by the address that deployed the contract', async ({api, web3, privateKeyWrapper}) => {142 const owner = await createEthAccountWithBalance(api, web3, privateKeyWrapper);143 const sponsor = await createEthAccountWithBalance(api, web3, privateKeyWrapper);144 const flipper = await deployFlipper(web3, owner);145 const helpers = contractHelpers(web3, owner);146147 expect(await helpers.methods.hasSponsor(flipper.options.address).call()).to.be.false;148 await helpers.methods.setSponsor(flipper.options.address, sponsor).send();149 await helpers.methods.confirmSponsorship(flipper.options.address).send({from: sponsor});150 expect(await helpers.methods.hasSponsor(flipper.options.address).call()).to.be.true;151 152 await helpers.methods.removeSponsor(flipper.options.address).send();153 expect(await helpers.methods.hasSponsor(flipper.options.address).call()).to.be.false;154 });155156 itWeb3('Sponsor can not be removed by the address that did not deployed the contract', async ({api, web3, privateKeyWrapper}) => {157 const owner = await createEthAccountWithBalance(api, web3, privateKeyWrapper);158 const notOwner = await createEthAccountWithBalance(api, web3, privateKeyWrapper);159 const sponsor = await createEthAccountWithBalance(api, web3, privateKeyWrapper);160 const flipper = await deployFlipper(web3, owner);161 const helpers = contractHelpers(web3, owner);162163 expect(await helpers.methods.hasSponsor(flipper.options.address).call()).to.be.false;164 await helpers.methods.setSponsor(flipper.options.address, sponsor).send();165 await helpers.methods.confirmSponsorship(flipper.options.address).send({from: sponsor});166 expect(await helpers.methods.hasSponsor(flipper.options.address).call()).to.be.true;167 168 await expect(helpers.methods.removeSponsor(flipper.options.address).call({from: notOwner})).to.be.rejectedWith('NoPermission');169 expect(await helpers.methods.hasSponsor(flipper.options.address).call()).to.be.true;170 });108171109 itWeb3('In generous mode, non-allowlisted user transaction will be sponsored', async ({api, web3, privateKeyWrapper}) => {172 itWeb3('In generous mode, non-allowlisted user transaction will be sponsored', async ({api, web3, privateKeyWrapper}) => {110 const owner = await createEthAccountWithBalance(api, web3, privateKeyWrapper);173 const owner = await createEthAccountWithBalance(api, web3, privateKeyWrapper);115178116 const helpers = contractHelpers(web3, owner);179 const helpers = contractHelpers(web3, owner);117180118 expect(await helpers.methods.hasSponsor(flipper.options.address).call()).to.be.false;119 await helpers.methods.setSponsor(flipper.options.address, sponsor).send();181 await helpers.methods.setSponsor(flipper.options.address, sponsor).send();120 await helpers.methods.confirmSponsorship(flipper.options.address).send({from: sponsor});182 await helpers.methods.confirmSponsorship(flipper.options.address).send({from: sponsor});121 expect(await helpers.methods.hasSponsor(flipper.options.address).call()).to.be.true;122183123 await helpers.methods.setSponsoringMode(flipper.options.address, SponsoringMode.Generous).send({from: owner});184 await helpers.methods.setSponsoringMode(flipper.options.address, SponsoringMode.Generous).send({from: owner});124 await helpers.methods.setSponsoringRateLimit(flipper.options.address, 0).send({from: owner});185 await helpers.methods.setSponsoringRateLimit(flipper.options.address, 0).send({from: owner});136 expect(callerBalanceAfter).to.be.eq(callerBalanceBefore);197 expect(callerBalanceAfter).to.be.eq(callerBalanceBefore);137 });198 });199200 itWeb3('In generous mode, non-allowlisted user transaction will be self sponsored', async ({api, web3, privateKeyWrapper}) => {201 const alice = privateKeyWrapper('//Alice');202203 const owner = await createEthAccountWithBalance(api, web3, privateKeyWrapper);204 const caller = await createEthAccountWithBalance(api, web3, privateKeyWrapper);205206 const flipper = await deployFlipper(web3, owner);207208 const helpers = contractHelpers(web3, owner);209210 await helpers.methods.selfSponsoredEnable(flipper.options.address).send();211212 await helpers.methods.setSponsoringMode(flipper.options.address, SponsoringMode.Generous).send({from: owner});213 await helpers.methods.setSponsoringRateLimit(flipper.options.address, 0).send({from: owner});214215 await transferBalanceToEth(api, alice, flipper.options.address);216217 const contractBalanceBefore = await ethBalanceViaSub(api, flipper.options.address);218 const callerBalanceBefore = await ethBalanceViaSub(api, caller);219220 await flipper.methods.flip().send({from: caller});221 expect(await flipper.methods.getValue().call()).to.be.true;222223 // Balance should be taken from sponsor instead of caller224 const contractBalanceAfter = await ethBalanceViaSub(api, flipper.options.address);225 const callerBalanceAfter = await ethBalanceViaSub(api, caller);226 expect(contractBalanceAfter < contractBalanceBefore).to.be.true;227 expect(callerBalanceAfter).to.be.eq(callerBalanceBefore);228 });138229139 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}) => {230 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}) => {140 const owner = await createEthAccountWithBalance(api, web3, privateKeyWrapper);231 const owner = await createEthAccountWithBalance(api, web3, privateKeyWrapper);tests/src/eth/util/contractHelpersAbi.jsondiffbeforeafterboth--- a/tests/src/eth/util/contractHelpersAbi.json
+++ b/tests/src/eth/util/contractHelpersAbi.json
@@ -120,6 +120,32 @@
"internalType": "address",
"name": "contractAddress",
"type": "address"
+ }
+ ],
+ "name": "removeSponsor",
+ "outputs": [],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "contractAddress",
+ "type": "address"
+ }
+ ],
+ "name": "selfSponsoredEnable",
+ "outputs": [],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "contractAddress",
+ "type": "address"
},
{ "internalType": "address", "name": "sponsor", "type": "address" }
],