difftreelog
Add contract sponsoring tests
in: master
Also removed waitForRecalculationBlock function
1 file changed
tests/src/app-promotion.test.tsdiffbeforeafterboth25import chaiAsPromised from 'chai-as-promised';25import chaiAsPromised from 'chai-as-promised';26import {usingPlaygrounds} from './util/playgrounds';26import {usingPlaygrounds} from './util/playgrounds';272728import {encodeAddress, mnemonicGenerate} from '@polkadot/util-crypto';28import {encodeAddress} from '@polkadot/util-crypto';29import {stringToU8a} from '@polkadot/util';29import {stringToU8a} from '@polkadot/util';30import {ApiPromise} from '@polkadot/api';30import {ApiPromise} from '@polkadot/api';31import {contractHelpers, createEthAccountWithBalance, deployFlipper, itWeb3} from './eth/util/helpers';31chai.use(chaiAsPromised);32chai.use(chaiAsPromised);32const expect = chai.expect;33const expect = chai.expect;333443 if (!getModuleNames(helper.api!).includes(Pallets.AppPromotion)) this.skip();44 if (!getModuleNames(helper.api!).includes(Pallets.AppPromotion)) this.skip();44 alice = privateKeyWrapper('//Alice');45 alice = privateKeyWrapper('//Alice');45 bob = privateKeyWrapper('//Bob');46 bob = privateKeyWrapper('//Bob');46 palletAdmin = privateKeyWrapper('//palletAdmin');47 palletAdmin = privateKeyWrapper('//Charlie');48 await helper.signTransaction(alice, helper.api!.tx.sudo.sudo(helper.api!.tx.promotion.setAdminAddress({Substrate: palletAdmin.address})));47 nominal = helper.balance.getOneTokenNominal();49 nominal = helper.balance.getOneTokenNominal();48 await helper.balance.transferToSubstrate(alice, palletAdmin.address, 100n * nominal);50 await helper.balance.transferToSubstrate(alice, palletAdmin.address, 1000n * nominal);49 await helper.balance.transferToSubstrate(alice, palletAddress, 100n * nominal);51 await helper.balance.transferToSubstrate(alice, palletAddress, 1000n * nominal);50 if (!promotionStartBlock) {52 if (!promotionStartBlock) {51 promotionStartBlock = (await helper.api!.query.parachainSystem.lastRelayChainBlockNumber()).toNumber();53 promotionStartBlock = (await helper.api!.query.parachainSystem.lastRelayChainBlockNumber()).toNumber();52 }54 }216 const [staker] = await helper.arrange.creteAccounts([10n], alice);218 const [staker] = await helper.arrange.creteAccounts([10n], alice);217 await helper.staking.stake(staker, nominal);219 await helper.staking.stake(staker, nominal);218 await helper.staking.unstake(staker, nominal - 1n);220 await helper.staking.unstake(staker, nominal - 1n);219 await waitForRecalculationBlock(helper.api!);220221221 // Everything fine, blockchain alive222 // Everything fine, blockchain alive222 await helper.nft.mintCollection(staker, {name: 'name', description: 'description', tokenPrefix: 'prefix'});223 await helper.nft.mintCollection(staker, {name: 'name', description: 'description', tokenPrefix: 'prefix'});407});408});408409409describe('app-promotion contract sponsoring', () => {410describe('app-promotion contract sponsoring', () => {410 it('will set contract sponsoring mode and set palletes address as a sponsor', async () => {411 itWeb3('should set palletes address as a sponsor', async ({api, web3, privateKeyWrapper}) => {411 // arrange: Alice deploys Flipper412 await usingPlaygrounds(async (helper) => {412 413 const contractOwner = (await createEthAccountWithBalance(api, web3, privateKeyWrapper)).toLowerCase();413 // act: Admin calls appPromotion.sponsorContract(Flipper.address)414 const flipper = await deployFlipper(web3, contractOwner);414415 const contractMethods = contractHelpers(web3, contractOwner);415 // assert: contract.sponsoringMode = TODO416416 // assert: contract.sponsor to be PalleteAddress417 await helper.signTransaction(palletAdmin, api.tx.promotion.sponsorConract(flipper.options.address));418 419 expect(await contractMethods.methods.hasSponsor(flipper.options.address).call()).to.be.true; 420 expect((await api.query.evmContractHelpers.owner(flipper.options.address)).toJSON()).to.be.equal(contractOwner); 421 expect((await api.query.evmContractHelpers.sponsoring(flipper.options.address)).toJSON()).to.deep.equal({422 confirmed: {423 substrate: palletAddress,424 },425 });426 });417 });427 });418428419 it('will overwrite sponsoring mode and existed sponsor', async () => {429 itWeb3('should overwrite sponsoring mode and existed sponsor', async ({api, web3, privateKeyWrapper}) => {420 // arrange: Alice deploys Flipper430 await usingPlaygrounds(async (helper) => {421 // arrange: Alice sets self sponsoring for Flipper431 const contractOwner = (await createEthAccountWithBalance(api, web3, privateKeyWrapper)).toLowerCase();422432 const flipper = await deployFlipper(web3, contractOwner);423 // act: Admin calls appPromotion.sponsorContract(Flipper.address)433 const contractMethods = contractHelpers(web3, contractOwner);424434425 // assert: contract.sponsoringMode = TODO435 await expect(contractMethods.methods.selfSponsoredEnable(flipper.options.address).send()).to.be.not.rejected;426 // assert: contract.sponsor to be PalleteAddress436437 // Contract is self sponsored438 expect((await api.query.evmContractHelpers.sponsoring(flipper.options.address)).toJSON()).to.be.deep.equal({439 confirmed: {440 ethereum: flipper.options.address.toLowerCase(),441 },442 });443444 // set promotion sponsoring445 await helper.signTransaction(palletAdmin, api.tx.promotion.sponsorConract(flipper.options.address));446447 // new sponsor is pallet address448 expect(await contractMethods.methods.hasSponsor(flipper.options.address).call()).to.be.true; 449 expect((await api.query.evmContractHelpers.owner(flipper.options.address)).toJSON()).to.be.equal(contractOwner); 450 expect((await api.query.evmContractHelpers.sponsoring(flipper.options.address)).toJSON()).to.deep.equal({451 confirmed: {452 substrate: palletAddress,453 },454 });455 });427 });456 });428457429 it('can be overwritten by contract owner', async () => {458 itWeb3('can be overwritten by contract owner', async ({api, web3, privateKeyWrapper}) => {430 // arrange: Alice deploys Flipper459 await usingPlaygrounds(async (helper) => { 431 // arrange: Admin calls appPromotion.sponsorContract(Flipper.address)460 const contractOwner = (await createEthAccountWithBalance(api, web3, privateKeyWrapper)).toLowerCase();432461 const flipper = await deployFlipper(web3, contractOwner);433 // act: Alice sets self sponsoring for Flipper462 const contractMethods = contractHelpers(web3, contractOwner);434463435 // assert: contract.sponsoringMode = Self464 // contract sponsored by pallet436 // assert: contract.sponsor to be contract465 await helper.signTransaction(palletAdmin, api.tx.promotion.sponsorConract(flipper.options.address));466467 // owner sets self sponsoring468 await expect(contractMethods.methods.selfSponsoredEnable(flipper.options.address).send()).to.be.not.rejected;469470 expect(await contractMethods.methods.hasSponsor(flipper.options.address).call()).to.be.true; 471 expect((await api.query.evmContractHelpers.owner(flipper.options.address)).toJSON()).to.be.equal(contractOwner); 472 expect((await api.query.evmContractHelpers.sponsoring(flipper.options.address)).toJSON()).to.deep.equal({473 confirmed: {474 ethereum: flipper.options.address.toLowerCase(),475 },476 });477 });437 });478 });438479439 it('can not be set by non admin', async () => {480 itWeb3('can not be set by non admin', async ({api, web3, privateKeyWrapper}) => {440 // arrange: Alice deploys Flipper481 await usingPlaygrounds(async (helper) => { 441 // arrange: Alice sets self sponsoring for Flipper482 const [nonAdmin] = await helper.arrange.creteAccounts([50n], alice);442483 const contractOwner = (await createEthAccountWithBalance(api, web3, privateKeyWrapper)).toLowerCase();443 // assert: Random calls appPromotion.sponsorContract(Flipper.address) throws484 const flipper = await deployFlipper(web3, contractOwner);444 // assert: contract.sponsoringMode = Self485 const contractMethods = contractHelpers(web3, contractOwner);445 // assert: contract.sponsor to be contract486487 await expect(contractMethods.methods.selfSponsoredEnable(flipper.options.address).send()).to.be.not.rejected;488489 // nonAdmin calls sponsorConract490 await expect(helper.signTransaction(nonAdmin, api.tx.promotion.sponsorConract(flipper.options.address))).to.be.rejected;491492 // contract still self-sponsored 493 expect((await api.query.evmContractHelpers.sponsoring(flipper.options.address)).toJSON()).to.deep.equal({494 confirmed: {495 ethereum: flipper.options.address.toLowerCase(),496 },497 });498 });446 });499 });447500448 it('will return unused gas fee to app-promotion pallete', async () => {501 it('will return unused gas fee to app-promotion pallete', async () => {502 // TODO449 // arrange: Alice deploys Flipper503 // arrange: Alice deploys Flipper450 // arrange: Admin calls appPromotion.sponsorContract(Flipper.address)504 // arrange: Admin calls appPromotion.sponsorContract(Flipper.address)451505524 it('should credit 0.05% for staking period', async () => { 578 it('should credit 0.05% for staking period', async () => { 525 await usingPlaygrounds(async helper => {579 await usingPlaygrounds(async helper => {526 const [staker] = await helper.arrange.creteAccounts([50n], alice);580 const [staker] = await helper.arrange.creteAccounts([50n], alice);527 await waitForRecalculationBlock(helper.api!);581 528 529 await helper.staking.stake(staker, 1n * nominal);582 await helper.staking.stake(staker, 1n * nominal);530 await helper.staking.stake(staker, 2n * nominal);583 await helper.staking.stake(staker, 2n * nominal);545 await usingPlaygrounds(async helper => {598 await usingPlaygrounds(async helper => {546 const [staker] = await helper.arrange.creteAccounts([80n], alice);599 const [staker] = await helper.arrange.creteAccounts([80n], alice);547 600 548 await waitForRecalculationBlock(helper.api!);549 550 await helper.staking.stake(staker, 10n * nominal);601 await helper.staking.stake(staker, 10n * nominal);551 await helper.staking.stake(staker, 20n * nominal);602 await helper.staking.stake(staker, 20n * nominal);565});616});566567568function waitForRecalculationBlock(api: ApiPromise): Promise<void> {569 return new Promise<void>(async (resolve, reject) => {570 const unsubscribe = await api.query.system.events((events) => {571 572 events.forEach((record) => {573 574 const {event, phase} = record;575 const types = event.typeDef;576 577 if (event.section === 'promotion' && event.method === 'StakingRecalculation') {578 unsubscribe();579 resolve();580 }581 });582 });583 });584}585617586async function waitForRelayBlock(api: ApiPromise, blocks = 1): Promise<void> {618async function waitForRelayBlock(api: ApiPromise, blocks = 1): Promise<void> {587 const current_block = (await api.query.parachainSystem.lastRelayChainBlockNumber()).toNumber();619 const current_block = (await api.query.parachainSystem.lastRelayChainBlockNumber()).toNumber();