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

difftreelog

Add contract sponsoring tests

Max Andreev2022-08-30parent: #daf5420.patch.diff
in: master
Also removed waitForRecalculationBlock function

1 file changed

modifiedtests/src/app-promotion.test.tsdiffbeforeafterboth
25import chaiAsPromised from 'chai-as-promised';25import chaiAsPromised from 'chai-as-promised';
26import {usingPlaygrounds} from './util/playgrounds';26import {usingPlaygrounds} from './util/playgrounds';
2727
28import {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;
3334
43 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!);
220221
221 // Everything fine, blockchain alive222 // Everything fine, blockchain alive
222 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});
408409
409describe('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 = TODO416
416 // 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 });
418428
419 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);
424434
425 // assert: contract.sponsoringMode = TODO435 await expect(contractMethods.methods.selfSponsoredEnable(flipper.options.address).send()).to.be.not.rejected;
426 // assert: contract.sponsor to be PalleteAddress436
437 // Contract is self sponsored
438 expect((await api.query.evmContractHelpers.sponsoring(flipper.options.address)).toJSON()).to.be.deep.equal({
439 confirmed: {
440 ethereum: flipper.options.address.toLowerCase(),
441 },
442 });
443
444 // set promotion sponsoring
445 await helper.signTransaction(palletAdmin, api.tx.promotion.sponsorConract(flipper.options.address));
446
447 // new sponsor is pallet address
448 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 });
428457
429 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);
434463
435 // assert: contract.sponsoringMode = Self464 // contract sponsored by pallet
436 // assert: contract.sponsor to be contract465 await helper.signTransaction(palletAdmin, api.tx.promotion.sponsorConract(flipper.options.address));
466
467 // owner sets self sponsoring
468 await expect(contractMethods.methods.selfSponsoredEnable(flipper.options.address).send()).to.be.not.rejected;
469
470 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 });
438479
439 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 contract486
487 await expect(contractMethods.methods.selfSponsoredEnable(flipper.options.address).send()).to.be.not.rejected;
488
489 // nonAdmin calls sponsorConract
490 await expect(helper.signTransaction(nonAdmin, api.tx.promotion.sponsorConract(flipper.options.address))).to.be.rejected;
491
492 // 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 });
447500
448 it('will return unused gas fee to app-promotion pallete', async () => {501 it('will return unused gas fee to app-promotion pallete', async () => {
502 // TODO
449 // arrange: Alice deploys Flipper503 // arrange: Alice deploys Flipper
450 // arrange: Admin calls appPromotion.sponsorContract(Flipper.address)504 // arrange: Admin calls appPromotion.sponsorContract(Flipper.address)
451505
524 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});
566
567
568function 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}
585617
586async 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();