Browse Source

set role parameters test implementation

Gleb Urvanov 4 years ago
parent
commit
9328be92d5

+ 1 - 1
runtime-modules/proposals/codex/src/proposal_types/parameters.rs

@@ -94,7 +94,7 @@ pub(crate) fn set_lead_proposal<T: crate::Trait>(
         approval_threshold_percentage: 80,
         slashing_quorum_percentage: 60,
         slashing_threshold_percentage: 80,
-        required_stake: Some(get_required_stake_by_fraction::<T>(1, 1000)),
+        required_stake: Some(get_required_stake_by_fraction::<T>(25, 10000)),
     }
 }
 

+ 1 - 1
scripts/run-test-chain.sh

@@ -9,6 +9,6 @@ sed -i 's/"setContentWorkingGroupMintCapacityProposalGracePeriod":.*/"setContent
 sed -i 's/"setLeadProposalGracePeriod":.*/"setLeadProposalGracePeriod": 0,/' chainspec.json
 sed -i 's/"spendingProposalGracePeriod":.*/"spendingProposalGracePeriod": 0,/' chainspec.json
 sed -i 's/"evictStorageProviderProposalGracePeriod":.*/"evictStorageProviderProposalGracePeriod": 0,/' chainspec.json
-sed -i 's/"setStorageRoleParametersProposalGracePeriod":.*/"setStorageRoleParametersProposalGracePeriod": 0,/' chainspec.json
+sed -i 's/"setStorageRoleParametersProposalGracePeriod":.*/"setStorageRoleParametersProposalGracePeriod": 0/' chainspec.json
 yes | cargo run --release -p joystream-node -- purge-chain --dev
 cargo run --release -p joystream-node -- --dev

+ 1 - 1
tests/network-tests/src/tests/constantinople/proposals/evictStoraveProviderTest.ts

@@ -10,7 +10,7 @@ import BN = require('bn.js');
 import { assert } from 'chai';
 import { Utils } from '../../../utils/utils';
 
-describe('Evict storage provider proposal network tests', () => {
+describe.skip('Evict storage provider proposal network tests', () => {
   initConfig();
   const keyring = new Keyring({ type: 'sr25519' });
   const nodeUrl: string = process.env.NODE_URL!;

+ 1 - 1
tests/network-tests/src/tests/constantinople/proposals/setLeadProposalTest.ts

@@ -9,7 +9,7 @@ import { v4 as uuid } from 'uuid';
 import BN = require('bn.js');
 import { assert } from 'chai';
 
-describe('Lead proposal network tests', () => {
+describe.skip('Lead proposal network tests', () => {
   initConfig();
   const keyring = new Keyring({ type: 'sr25519' });
   const nodeUrl: string = process.env.NODE_URL!;

+ 1 - 1
tests/network-tests/src/tests/constantinople/proposals/spendingProposalTest.ts

@@ -9,7 +9,7 @@ import { v4 as uuid } from 'uuid';
 import BN = require('bn.js');
 import { assert } from 'chai';
 
-describe('Spending proposal network tests', () => {
+describe.skip('Spending proposal network tests', () => {
   initConfig();
   const keyring = new Keyring({ type: 'sr25519' });
   const nodeUrl: string = process.env.NODE_URL!;

+ 106 - 0
tests/network-tests/src/tests/constantinople/proposals/storageRoleParametersProposalTest.ts

@@ -0,0 +1,106 @@
+import { initConfig } from '../../../utils/config';
+import { Keyring, WsProvider } from '@polkadot/api';
+import { KeyringPair } from '@polkadot/keyring/types';
+import { membershipTest } from '../membershipCreationTest';
+import { councilTest } from '../electingCouncilTest';
+import { registerJoystreamTypes } from '@joystream/types';
+import { ApiWrapper } from '../../../utils/apiWrapper';
+import { v4 as uuid } from 'uuid';
+import BN = require('bn.js');
+import { assert } from 'chai';
+import { RoleParameters } from '@joystream/types/lib/roles';
+
+describe('Storage role parameters proposal network tests', () => {
+  initConfig();
+  const keyring = new Keyring({ type: 'sr25519' });
+  const nodeUrl: string = process.env.NODE_URL!;
+  const sudoUri: string = process.env.SUDO_ACCOUNT_URI!;
+  const defaultTimeout: number = 180000;
+
+  const m1KeyPairs: KeyringPair[] = new Array();
+  const m2KeyPairs: KeyringPair[] = new Array();
+
+  let apiWrapper: ApiWrapper;
+  let sudo: KeyringPair;
+
+  before(async function () {
+    this.timeout(defaultTimeout);
+    registerJoystreamTypes();
+    const provider = new WsProvider(nodeUrl);
+    apiWrapper = await ApiWrapper.create(provider);
+  });
+
+  membershipTest(m1KeyPairs);
+  membershipTest(m2KeyPairs);
+  councilTest(m1KeyPairs, m2KeyPairs);
+
+  it('Storage role parameters proposal test', async () => {
+    // Setup
+    sudo = keyring.addFromUri(sudoUri);
+    const proposalTitle: string = 'Testing proposal ' + uuid().substring(0, 8);
+    const description: string = 'Testing validator count proposal ' + uuid().substring(0, 8);
+    const runtimeVoteFee: BN = apiWrapper.estimateVoteForProposalFee();
+    await apiWrapper.transferBalanceToAccounts(sudo, m2KeyPairs, runtimeVoteFee);
+    const roleParameters: RoleParameters = ((await apiWrapper.getStorageRoleParameters()) as unknown) as RoleParameters;
+    console.log('role parameters ' + roleParameters);
+    console.log('role parameters ' + roleParameters.toRawType());
+    console.log('role parameters min stake ' + roleParameters.min_stake);
+
+    // Proposal stake calculation
+    const proposalStake: BN = await apiWrapper.getRequiredProposalStake(25, 10000);
+    const proposalFee: BN = apiWrapper.estimateProposeStorageRoleParametersFee(
+      description,
+      description,
+      proposalStake,
+      roleParameters.min_stake.toBn(),
+      roleParameters.min_actors.toBn(),
+      roleParameters.max_actors.toBn(),
+      roleParameters.reward.toBn(),
+      roleParameters.reward_period.toBn(),
+      roleParameters.bonding_period.toBn(),
+      roleParameters.unbonding_period.toBn(),
+      roleParameters.min_service_period.toBn(),
+      roleParameters.startup_grace_period.toBn(),
+      roleParameters.entry_request_fee.toBn()
+    );
+    await apiWrapper.transferBalance(sudo, m1KeyPairs[0].address, proposalFee.add(proposalStake));
+
+    // Proposal creation
+    console.log('proposing new parameters');
+    const proposalPromise = apiWrapper.expectProposalCreated();
+    await apiWrapper.proposeStorageRoleParameters(
+      m1KeyPairs[0],
+      proposalTitle,
+      description,
+      proposalStake,
+      roleParameters.min_stake.toBn(),
+      roleParameters.min_actors.toBn(),
+      roleParameters.max_actors.toBn(),
+      roleParameters.reward.toBn(),
+      roleParameters.reward_period.toBn(),
+      roleParameters.bonding_period.toBn(),
+      roleParameters.unbonding_period.toBn(),
+      roleParameters.min_service_period.toBn(),
+      roleParameters.startup_grace_period.toBn(),
+      roleParameters.entry_request_fee.toBn()
+    );
+    const proposalNumber = await proposalPromise;
+
+    // Approving the proposal
+    const proposalExecutionPromise = apiWrapper.expectProposalFinalized();
+    await apiWrapper.batchApproveProposal(m2KeyPairs, proposalNumber);
+    await proposalExecutionPromise;
+    const newRoleParameters: RoleParameters = await apiWrapper.getStorageRoleParameters();
+    console.log('new role parameters ' + newRoleParameters);
+
+    // const newLead: string = await apiWrapper.getCurrentLeadAddress();
+    // assert(
+    //   newLead === m1KeyPairs[1].address,
+    //   `New lead has unexpected value ${newLead}, expected ${m1KeyPairs[1].address}`
+    // );
+  }).timeout(defaultTimeout);
+
+  after(() => {
+    apiWrapper.close();
+  });
+});

+ 1 - 1
tests/network-tests/src/tests/constantinople/proposals/textProposalTest.ts

@@ -8,7 +8,7 @@ import { ApiWrapper } from '../../../utils/apiWrapper';
 import { v4 as uuid } from 'uuid';
 import BN = require('bn.js');
 
-describe('Text proposal network tests', () => {
+describe.skip('Text proposal network tests', () => {
   initConfig();
   const keyring = new Keyring({ type: 'sr25519' });
   const nodeUrl: string = process.env.NODE_URL!;

+ 1 - 1
tests/network-tests/src/tests/constantinople/proposals/updateRuntimeTest.ts

@@ -9,7 +9,7 @@ import { ApiWrapper } from '../../../utils/apiWrapper';
 import { v4 as uuid } from 'uuid';
 import BN = require('bn.js');
 
-describe('Runtime upgrade networt tests', () => {
+describe.skip('Runtime upgrade networt tests', () => {
   initConfig();
   const keyring = new Keyring({ type: 'sr25519' });
   const nodeUrl: string = process.env.NODE_URL!;

+ 1 - 1
tests/network-tests/src/tests/constantinople/proposals/validatorCountProposal.ts

@@ -9,7 +9,7 @@ import { v4 as uuid } from 'uuid';
 import BN = require('bn.js');
 import { assert } from 'chai';
 
-describe('Validator count proposal network tests', () => {
+describe.skip('Validator count proposal network tests', () => {
   initConfig();
   const keyring = new Keyring({ type: 'sr25519' });
   const nodeUrl: string = process.env.NODE_URL!;

+ 1 - 1
tests/network-tests/src/tests/constantinople/proposals/workingGroupMintCapacityProposalTest.ts

@@ -9,7 +9,7 @@ import { v4 as uuid } from 'uuid';
 import BN = require('bn.js');
 import { assert } from 'chai';
 
-describe('Working group mint capacity proposal network tests', () => {
+describe.skip('Working group mint capacity proposal network tests', () => {
   initConfig();
   const keyring = new Keyring({ type: 'sr25519' });
   const nodeUrl: string = process.env.NODE_URL!;

+ 70 - 0
tests/network-tests/src/utils/apiWrapper.ts

@@ -5,6 +5,7 @@ import { KeyringPair } from '@polkadot/keyring/types';
 import { UserInfo, PaidMembershipTerms, MemberId } from '@joystream/types/lib/members';
 import { Mint, MintId } from '@joystream/types/lib/mint';
 import { Lead, LeadId } from '@joystream/types/lib/content-working-group';
+import { RoleParameters } from '@joystream/types/lib/roles';
 import { Seat } from '@joystream/types';
 import { Balance, EventRecord, AccountId } from '@polkadot/types/interfaces';
 import BN = require('bn.js');
@@ -152,6 +153,37 @@ export class ApiWrapper {
     );
   }
 
+  public estimateProposeStorageRoleParametersFee(
+    title: string,
+    description: string,
+    stake: BN,
+    min_stake: BN,
+    min_actors: BN,
+    max_actors: BN,
+    reward: BN,
+    reward_period: BN,
+    bonding_period: BN,
+    unbonding_period: BN,
+    min_service_period: BN,
+    startup_grace_period: BN,
+    entry_request_fee: BN
+  ): BN {
+    return this.estimateTxFee(
+      this.api.tx.proposalsCodex.createSetStorageRoleParametersProposal(stake, title, description, stake, [
+        min_stake,
+        min_actors,
+        max_actors,
+        reward,
+        reward_period,
+        bonding_period,
+        unbonding_period,
+        min_service_period,
+        startup_grace_period,
+        entry_request_fee,
+      ])
+    );
+  }
+
   public estimateVoteForProposalFee(): BN {
     return this.estimateTxFee(this.api.tx.proposalsEngine.vote(0, 0, 'Approve'));
   }
@@ -377,6 +409,40 @@ export class ApiWrapper {
     );
   }
 
+  public async proposeStorageRoleParameters(
+    account: KeyringPair,
+    title: string,
+    description: string,
+    stake: BN,
+    min_stake: BN,
+    min_actors: BN,
+    max_actors: BN,
+    reward: BN,
+    reward_period: BN,
+    bonding_period: BN,
+    unbonding_period: BN,
+    min_service_period: BN,
+    startup_grace_period: BN,
+    entry_request_fee: BN
+  ): Promise<void> {
+    return this.sender.signAndSend(
+      this.api.tx.proposalsCodex.createSetStorageRoleParametersProposal(stake, title, description, stake, [
+        min_stake,
+        min_actors,
+        max_actors,
+        reward,
+        reward_period,
+        bonding_period,
+        unbonding_period,
+        min_service_period,
+        startup_grace_period,
+        entry_request_fee,
+      ]),
+      account,
+      false
+    );
+  }
+
   public approveProposal(account: KeyringPair, memberId: BN, proposal: BN): Promise<void> {
     return this.sender.signAndSend(this.api.tx.proposalsEngine.vote(memberId, proposal, 'Approve'), account, false);
   }
@@ -479,4 +545,8 @@ export class ApiWrapper {
     );
     return storageProviders.map(accountId => accountId.toString()).includes(address);
   }
+
+  public async getStorageRoleParameters(): Promise<RoleParameters> {
+    return (await this.api.query.actors.parameters<Option<RoleParameters>>('StorageProvider')).unwrap();
+  }
 }