diff --git a/.gitignore b/.gitignore index 45b61bdc79..c2b08ec41e 100644 --- a/.gitignore +++ b/.gitignore @@ -26,3 +26,9 @@ yarn* # Compiled WASM code *.wasm + +# Temporary files +.tmp/ + +# Istanbul report output +**.nyc_output/ diff --git a/README.md b/README.md index bb97452017..b2128b62f9 100644 --- a/README.md +++ b/README.md @@ -85,14 +85,23 @@ This will build and run a fresh new local development chain purging existing one cargo test ``` -### API integration tests +### Network tests ```bash -./scripts/run-dev-chain.sh +./scripts/run-test-chain.sh yarn test ``` To run the integration tests with a different chain, you can omit step running the local development chain and set the node URL using `NODE_URL` environment variable. +Proposal grace periods should be set to 0, otherwise proposal network tests will fail. + +### Rome-Constantinople migration network test + +Ensure Rome node is up and running, and node URL is set using `NODE_URL` environment variable (default value is `localhost:9944`). + +```bash +yarn test-migration +``` ## Joystream Runtime diff --git a/scripts/run-test-chain.sh b/scripts/run-test-chain.sh new file mode 100644 index 0000000000..0cce8d0fe0 --- /dev/null +++ b/scripts/run-test-chain.sh @@ -0,0 +1,14 @@ +#!/bin/bash +mkdir -p .tmp +cargo run --release -p joystream-node build-spec --chain dev > .tmp/chainspec.json +perl -i -pe's/"setValidatorCountProposalGracePeriod":.*/"setValidatorCountProposalGracePeriod": 0,/' .tmp/chainspec.json +perl -i -pe's/"runtimeUpgradeProposalGracePeriod":.*/"runtimeUpgradeProposalGracePeriod": 0,/' .tmp/chainspec.json +perl -i -pe's/"setElectionParametersProposalGracePeriod":.*/"setElectionParametersProposalGracePeriod": 0,/' .tmp/chainspec.json +perl -i -pe's/"textProposalGracePeriod":.*/"textProposalGracePeriod": 0,/' .tmp/chainspec.json +perl -i -pe's/"setContentWorkingGroupMintCapacityProposalGracePeriod":.*/"setContentWorkingGroupMintCapacityProposalGracePeriod": 0,/' .tmp/chainspec.json +perl -i -pe's/"setLeadProposalGracePeriod":.*/"setLeadProposalGracePeriod": 0,/' .tmp/chainspec.json +perl -i -pe's/"spendingProposalGracePeriod":.*/"spendingProposalGracePeriod": 0,/' .tmp/chainspec.json +perl -i -pe's/"evictStorageProviderProposalGracePeriod":.*/"evictStorageProviderProposalGracePeriod": 0,/' .tmp/chainspec.json +perl -i -pe's/"setStorageRoleParametersProposalGracePeriod":.*/"setStorageRoleParametersProposalGracePeriod": 0/' .tmp/chainspec.json +yes | cargo run --release -p joystream-node -- purge-chain --dev +cargo run --release -p joystream-node -- --chain=.tmp/chainspec.json --alice --validator diff --git a/tests/network-tests/.env b/tests/network-tests/.env index 00ee4bf8c5..fc43525257 100644 --- a/tests/network-tests/.env +++ b/tests/network-tests/.env @@ -7,16 +7,20 @@ MEMBERSHIP_CREATION_N = 2 # ID of the membership paid terms used in membership creation test. MEMBERSHIP_PAID_TERMS = 0 # Council stake amount for first K accounts in council election test. -COUNCIL_STAKE_GREATER_AMOUNT = 1500 +COUNCIL_STAKE_GREATER_AMOUNT = 3000 # Council stake amount for first the rest participants in council election test. -COUNCIL_STAKE_LESSER_AMOUNT = 1000 +COUNCIL_STAKE_LESSER_AMOUNT = 2000 # Number of members with greater stake in council election test. COUNCIL_ELECTION_K = 2 # Balance to spend using spending proposal SPENDING_BALANCE = 1000 -# Minting capacity for content working group minting capacity test. -MINTING_CAPACITY = 100020 +# Minting capacity increment for content working group minting capacity test. +MINTING_CAPACITY_INCREMENT = 20 +# Minting capacity for council mint for spending proposal. +COUNCIL_MINTING_CAPACITY = 100000 # Stake amount for Rome runtime upgrade proposal RUNTIME_UPGRADE_PROPOSAL_STAKE = 100000 +# Validator count increment for Validator count test. +VALIDATOR_COUNT_INCREMENT = 2 # Constantinople runtime path -RUNTIME_WASM_PATH = ../../target/release/wbuild/joystream-node-runtime/joystream_node_runtime.compact.wasm \ No newline at end of file +RUNTIME_WASM_PATH = ../../target/release/wbuild/joystream-node-runtime/joystream_node_runtime.compact.wasm diff --git a/tests/network-tests/package.json b/tests/network-tests/package.json index 7ddbae95c9..f142a111dd 100644 --- a/tests/network-tests/package.json +++ b/tests/network-tests/package.json @@ -4,16 +4,16 @@ "license": "GPL-3.0-only", "scripts": { "build": "tsc --build tsconfig.json", - "test": "mocha -r ts-node/register src/tests/constantinople/*", - "test-migration": "mocha -r ts-node/register src/tests/rome/* && mocha -r ts-node/register src/tests/constantinople/*", + "test": "tap --files ts-node/register src/constantinople/tests/proposals/*Test.ts", + "test-migration": "tap --files src/rome/tests/romeRuntimeUpgradeTest.ts --files src/constantinople/tests/electingCouncilTest.ts", "lint": "tslint --project tsconfig.json", "prettier": "prettier --write ./src" }, "dependencies": { - "@joystream/types": "", - "@rome/types@npm:@joystream/types": "^0.7.0", + "@constantinople/types@npm:@joystream/types": "^0.9.1", "@polkadot/api": "^0.96.1", "@polkadot/keyring": "^1.7.0-beta.5", + "@rome/types@npm:@joystream/types": "^0.7.0", "@types/bn.js": "^4.11.5", "bn.js": "^4.11.8", "dotenv": "^8.2.0", @@ -23,11 +23,11 @@ "devDependencies": { "@polkadot/ts": "^0.3.14", "@types/chai": "^4.2.11", - "@types/mocha": "^7.0.2", + "@types/tap": "^14.10.0", "@types/uuid": "^7.0.2", "chai": "^4.2.0", - "mocha": "^7.1.1", "prettier": "2.0.2", + "tap": "^14.10.7", "ts-node": "^8.8.1", "tslint": "^6.1.0", "typescript": "^3.8.3" diff --git a/tests/network-tests/src/constantinople/tap-parallel-not-ok b/tests/network-tests/src/constantinople/tap-parallel-not-ok new file mode 100644 index 0000000000..e69de29bb2 diff --git a/tests/network-tests/src/constantinople/tests/electingCouncilTest.ts b/tests/network-tests/src/constantinople/tests/electingCouncilTest.ts new file mode 100644 index 0000000000..7ba5ef5828 --- /dev/null +++ b/tests/network-tests/src/constantinople/tests/electingCouncilTest.ts @@ -0,0 +1,27 @@ +import { KeyringPair } from '@polkadot/keyring/types'; +import { membershipTest } from './impl/membershipCreation'; +import { councilTest } from './impl/electingCouncil'; +import { initConfig } from '../utils/config'; +import { Keyring } from '@polkadot/api'; +import { setTimeout } from './impl/setTimeout'; +import BN from 'bn.js'; + +initConfig(); + +const m1KeyPairs: KeyringPair[] = new Array(); +const m2KeyPairs: KeyringPair[] = new Array(); + +const keyring = new Keyring({ type: 'sr25519' }); +const N: number = +process.env.MEMBERSHIP_CREATION_N!; +const paidTerms: number = +process.env.MEMBERSHIP_PAID_TERMS!; +const nodeUrl: string = process.env.NODE_URL!; +const sudoUri: string = process.env.SUDO_ACCOUNT_URI!; +const K: number = +process.env.COUNCIL_ELECTION_K!; +const greaterStake: BN = new BN(+process.env.COUNCIL_STAKE_GREATER_AMOUNT!); +const lesserStake: BN = new BN(+process.env.COUNCIL_STAKE_LESSER_AMOUNT!); +const durationInBlocks: number = 25; + +setTimeout(nodeUrl, durationInBlocks); +membershipTest(m1KeyPairs, keyring, N, paidTerms, nodeUrl, sudoUri); +membershipTest(m2KeyPairs, keyring, N, paidTerms, nodeUrl, sudoUri); +councilTest(m1KeyPairs, m2KeyPairs, keyring, K, nodeUrl, sudoUri, greaterStake, lesserStake); diff --git a/tests/network-tests/src/tests/constantinople/electingCouncilTest.ts b/tests/network-tests/src/constantinople/tests/impl/electingCouncil.ts similarity index 77% rename from tests/network-tests/src/tests/constantinople/electingCouncilTest.ts rename to tests/network-tests/src/constantinople/tests/impl/electingCouncil.ts index df4feabcd1..de00fc9976 100644 --- a/tests/network-tests/src/tests/constantinople/electingCouncilTest.ts +++ b/tests/network-tests/src/constantinople/tests/impl/electingCouncil.ts @@ -1,34 +1,33 @@ -import { membershipTest } from './membershipCreationTest'; import { KeyringPair } from '@polkadot/keyring/types'; -import { ApiWrapper } from './utils/apiWrapper'; +import { ApiWrapper } from '../../utils/apiWrapper'; import { WsProvider, Keyring } from '@polkadot/api'; -import { initConfig } from './utils/config'; -import BN = require('bn.js'); -import { registerJoystreamTypes, Seat } from '@joystream/types/'; +import BN from 'bn.js'; +import { registerJoystreamTypes, Seat } from '@constantinople/types'; import { assert } from 'chai'; import { v4 as uuid } from 'uuid'; -import { Utils } from './utils/utils'; +import { Utils } from '../../utils/utils'; +import tap from 'tap'; -export function councilTest(m1KeyPairs: KeyringPair[], m2KeyPairs: KeyringPair[]) { - initConfig(); - const keyring = new Keyring({ type: 'sr25519' }); - const nodeUrl: string = process.env.NODE_URL!; - const sudoUri: string = process.env.SUDO_ACCOUNT_URI!; - const K: number = +process.env.COUNCIL_ELECTION_K!; - const greaterStake: BN = new BN(+process.env.COUNCIL_STAKE_GREATER_AMOUNT!); - const lesserStake: BN = new BN(+process.env.COUNCIL_STAKE_LESSER_AMOUNT!); - const defaultTimeout: number = 120000; +export function councilTest( + m1KeyPairs: KeyringPair[], + m2KeyPairs: KeyringPair[], + keyring: Keyring, + K: number, + nodeUrl: string, + sudoUri: string, + greaterStake: BN, + lesserStake: BN +) { let sudo: KeyringPair; let apiWrapper: ApiWrapper; - before(async function () { - this.timeout(defaultTimeout); + tap.test('Electing council test setup', async () => { registerJoystreamTypes(); const provider = new WsProvider(nodeUrl); apiWrapper = await ApiWrapper.create(provider); }); - it('Electing a council test', async () => { + tap.test('Electing a council test', async () => { // Setup goes here because M keypairs are generated after before() function sudo = keyring.addFromUri(sudoUri); let now = await apiWrapper.getBestBlock(); @@ -111,17 +110,9 @@ export function councilTest(m1KeyPairs: KeyringPair[], m2KeyPairs: KeyringPair[] `Member ${seat.member} has unexpected stake ${Utils.getTotalStake(seat)}` ) ); - }).timeout(defaultTimeout); + }); - after(() => { + tap.teardown(() => { apiWrapper.close(); }); } - -describe('Council integration tests', () => { - const m1KeyPairs: KeyringPair[] = new Array(); - const m2KeyPairs: KeyringPair[] = new Array(); - membershipTest(m1KeyPairs); - membershipTest(m2KeyPairs); - councilTest(m1KeyPairs, m2KeyPairs); -}); diff --git a/tests/network-tests/src/tests/constantinople/membershipCreationTest.ts b/tests/network-tests/src/constantinople/tests/impl/membershipCreation.ts similarity index 69% rename from tests/network-tests/src/tests/constantinople/membershipCreationTest.ts rename to tests/network-tests/src/constantinople/tests/impl/membershipCreation.ts index c41459113b..1060768d03 100644 --- a/tests/network-tests/src/tests/constantinople/membershipCreationTest.ts +++ b/tests/network-tests/src/constantinople/tests/impl/membershipCreation.ts @@ -1,30 +1,29 @@ import { WsProvider } from '@polkadot/api'; -import { registerJoystreamTypes } from '@joystream/types/'; +import { registerJoystreamTypes } from '@constantinople/types'; import { Keyring } from '@polkadot/keyring'; import { assert } from 'chai'; import { KeyringPair } from '@polkadot/keyring/types'; -import BN = require('bn.js'); -import { ApiWrapper } from './utils/apiWrapper'; -import { initConfig } from './utils/config'; +import BN from 'bn.js'; +import { ApiWrapper } from '../../utils/apiWrapper'; import { v4 as uuid } from 'uuid'; +import tap from 'tap'; -export function membershipTest(nKeyPairs: KeyringPair[]) { - initConfig(); - const keyring = new Keyring({ type: 'sr25519' }); - const N: number = +process.env.MEMBERSHIP_CREATION_N!; - const paidTerms: number = +process.env.MEMBERSHIP_PAID_TERMS!; - const nodeUrl: string = process.env.NODE_URL!; - const sudoUri: string = process.env.SUDO_ACCOUNT_URI!; - const defaultTimeout: number = 30000; +export function membershipTest( + nKeyPairs: KeyringPair[], + keyring: Keyring, + N: number, + paidTerms: number, + nodeUrl: string, + sudoUri: string +) { let apiWrapper: ApiWrapper; let sudo: KeyringPair; let aKeyPair: KeyringPair; let membershipFee: BN; let membershipTransactionFee: BN; + registerJoystreamTypes(); - before(async function () { - this.timeout(defaultTimeout); - registerJoystreamTypes(); + tap.test('Membership creation test setup', async () => { const provider = new WsProvider(nodeUrl); apiWrapper = await ApiWrapper.create(provider); sudo = keyring.addFromUri(sudoUri); @@ -42,7 +41,7 @@ export function membershipTest(nKeyPairs: KeyringPair[]) { await apiWrapper.transferBalance(sudo, aKeyPair.address, membershipTransactionFee); }); - it('Buy membeship is accepted with sufficient funds', async () => { + tap.test('Buy membeship is accepted with sufficient funds', async () => { await Promise.all( nKeyPairs.map(async (keyPair, index) => { await apiWrapper.buyMembership(keyPair, paidTerms, `new_member_${index}${keyPair.address.substring(0, 8)}`); @@ -53,9 +52,9 @@ export function membershipTest(nKeyPairs: KeyringPair[]) { .getMemberIds(keyPair.address) .then(membership => assert(membership.length > 0, `Account ${keyPair.address} is not a member`)) ); - }).timeout(defaultTimeout); + }); - it('Account A can not buy the membership with insufficient funds', async () => { + tap.test('Account A can not buy the membership with insufficient funds', async () => { await apiWrapper .getBalance(aKeyPair.address) .then(balance => @@ -68,9 +67,9 @@ export function membershipTest(nKeyPairs: KeyringPair[]) { apiWrapper .getMemberIds(aKeyPair.address) .then(membership => assert(membership.length === 0, 'Account A is a member')); - }).timeout(defaultTimeout); + }); - it('Account A was able to buy the membership with sufficient funds', async () => { + tap.test('Account A was able to buy the membership with sufficient funds', async () => { await apiWrapper.transferBalance(sudo, aKeyPair.address, membershipFee.add(membershipTransactionFee)); apiWrapper .getBalance(aKeyPair.address) @@ -81,14 +80,9 @@ export function membershipTest(nKeyPairs: KeyringPair[]) { apiWrapper .getMemberIds(aKeyPair.address) .then(membership => assert(membership.length > 0, 'Account A is a not member')); - }).timeout(defaultTimeout); + }); - after(() => { + tap.teardown(() => { apiWrapper.close(); }); } - -describe.skip('Membership integration tests', () => { - const nKeyPairs: KeyringPair[] = new Array(); - membershipTest(nKeyPairs); -}); diff --git a/tests/network-tests/src/constantinople/tests/impl/setTimeout.ts b/tests/network-tests/src/constantinople/tests/impl/setTimeout.ts new file mode 100644 index 0000000000..5523885809 --- /dev/null +++ b/tests/network-tests/src/constantinople/tests/impl/setTimeout.ts @@ -0,0 +1,20 @@ +import tap from 'tap'; +import { ApiWrapper } from '../../utils/apiWrapper'; +import { WsProvider } from '@polkadot/api'; +import { registerJoystreamTypes } from '@constantinople/types'; + +export function setTimeout(nodeUrl: string, durationInBlocks: number) { + let apiWrapper: ApiWrapper; + registerJoystreamTypes(); + + tap.test('retrieving time necessary for the test', async () => { + const provider = new WsProvider(nodeUrl); + apiWrapper = await ApiWrapper.create(provider); + const durationInMillis = (await apiWrapper.getBlockDuration()).muln(durationInBlocks).toNumber(); + tap.setTimeout(durationInMillis); + }); + + tap.teardown(() => { + apiWrapper.close(); + }); +} diff --git a/tests/network-tests/src/constantinople/tests/membershipCreationTest.ts b/tests/network-tests/src/constantinople/tests/membershipCreationTest.ts new file mode 100644 index 0000000000..7c83f1b98e --- /dev/null +++ b/tests/network-tests/src/constantinople/tests/membershipCreationTest.ts @@ -0,0 +1,19 @@ +import { KeyringPair } from '@polkadot/keyring/types'; +import { membershipTest } from './impl/membershipCreation'; +import { Keyring } from '@polkadot/api'; +import { initConfig } from '../utils/config'; +import { setTimeout } from './impl/setTimeout'; + +initConfig(); + +const nKeyPairs: KeyringPair[] = new Array(); + +const keyring = new Keyring({ type: 'sr25519' }); +const N: number = +process.env.MEMBERSHIP_CREATION_N!; +const paidTerms: number = +process.env.MEMBERSHIP_PAID_TERMS!; +const nodeUrl: string = process.env.NODE_URL!; +const sudoUri: string = process.env.SUDO_ACCOUNT_URI!; +const durationInBlocks: number = 7; + +setTimeout(nodeUrl, durationInBlocks); +membershipTest(nKeyPairs, keyring, N, paidTerms, nodeUrl, sudoUri); diff --git a/tests/network-tests/src/constantinople/tests/proposals/electionParametersProposalTest.ts b/tests/network-tests/src/constantinople/tests/proposals/electionParametersProposalTest.ts new file mode 100644 index 0000000000..f5dcd479bc --- /dev/null +++ b/tests/network-tests/src/constantinople/tests/proposals/electionParametersProposalTest.ts @@ -0,0 +1,29 @@ +import { KeyringPair } from '@polkadot/keyring/types'; +import { membershipTest } from '../impl/membershipCreation'; +import { councilTest } from '../impl/electingCouncil'; +import { electionParametersProposalTest } from './impl/electionParametersProposal'; +import { initConfig } from '../../utils/config'; +import { Keyring } from '@polkadot/api'; +import BN from 'bn.js'; +import { setTimeout } from '../impl/setTimeout'; + +initConfig(); + +const m1KeyPairs: KeyringPair[] = new Array(); +const m2KeyPairs: KeyringPair[] = new Array(); + +const keyring = new Keyring({ type: 'sr25519' }); +const N: number = +process.env.MEMBERSHIP_CREATION_N!; +const paidTerms: number = +process.env.MEMBERSHIP_PAID_TERMS!; +const nodeUrl: string = process.env.NODE_URL!; +const sudoUri: string = process.env.SUDO_ACCOUNT_URI!; +const K: number = +process.env.COUNCIL_ELECTION_K!; +const greaterStake: BN = new BN(+process.env.COUNCIL_STAKE_GREATER_AMOUNT!); +const lesserStake: BN = new BN(+process.env.COUNCIL_STAKE_LESSER_AMOUNT!); +const durationInBlocks: number = 29; + +setTimeout(nodeUrl, durationInBlocks); +membershipTest(m1KeyPairs, keyring, N, paidTerms, nodeUrl, sudoUri); +membershipTest(m2KeyPairs, keyring, N, paidTerms, nodeUrl, sudoUri); +councilTest(m1KeyPairs, m2KeyPairs, keyring, K, nodeUrl, sudoUri, greaterStake, lesserStake); +electionParametersProposalTest(m1KeyPairs, m2KeyPairs, keyring, nodeUrl, sudoUri); diff --git a/tests/network-tests/src/constantinople/tests/proposals/evictStorageProviderTest.ts b/tests/network-tests/src/constantinople/tests/proposals/evictStorageProviderTest.ts new file mode 100644 index 0000000000..1d0f0958be --- /dev/null +++ b/tests/network-tests/src/constantinople/tests/proposals/evictStorageProviderTest.ts @@ -0,0 +1,29 @@ +import { KeyringPair } from '@polkadot/keyring/types'; +import { membershipTest } from '../impl/membershipCreation'; +import { councilTest } from '../impl/electingCouncil'; +import { evictStorageProviderTest } from './impl/evictStoraveProvider'; +import { initConfig } from '../../utils/config'; +import { Keyring } from '@polkadot/api'; +import BN from 'bn.js'; +import { setTimeout } from '../impl/setTimeout'; + +initConfig(); + +const m1KeyPairs: KeyringPair[] = new Array(); +const m2KeyPairs: KeyringPair[] = new Array(); + +const keyring = new Keyring({ type: 'sr25519' }); +const N: number = +process.env.MEMBERSHIP_CREATION_N!; +const paidTerms: number = +process.env.MEMBERSHIP_PAID_TERMS!; +const nodeUrl: string = process.env.NODE_URL!; +const sudoUri: string = process.env.SUDO_ACCOUNT_URI!; +const K: number = +process.env.COUNCIL_ELECTION_K!; +const greaterStake: BN = new BN(+process.env.COUNCIL_STAKE_GREATER_AMOUNT!); +const lesserStake: BN = new BN(+process.env.COUNCIL_STAKE_LESSER_AMOUNT!); +const durationInBlocks: number = 32; + +setTimeout(nodeUrl, durationInBlocks); +membershipTest(m1KeyPairs, keyring, N, paidTerms, nodeUrl, sudoUri); +membershipTest(m2KeyPairs, keyring, N, paidTerms, nodeUrl, sudoUri); +councilTest(m1KeyPairs, m2KeyPairs, keyring, K, nodeUrl, sudoUri, greaterStake, lesserStake); +evictStorageProviderTest(m1KeyPairs, m2KeyPairs, keyring, nodeUrl, sudoUri); diff --git a/tests/network-tests/src/constantinople/tests/proposals/impl/electionParametersProposal.ts b/tests/network-tests/src/constantinople/tests/proposals/impl/electionParametersProposal.ts new file mode 100644 index 0000000000..d6f3463a93 --- /dev/null +++ b/tests/network-tests/src/constantinople/tests/proposals/impl/electionParametersProposal.ts @@ -0,0 +1,136 @@ +import { Keyring, WsProvider } from '@polkadot/api'; +import { KeyringPair } from '@polkadot/keyring/types'; +import { registerJoystreamTypes } from '@constantinople/types'; +import { ApiWrapper } from '../../../utils/apiWrapper'; +import { v4 as uuid } from 'uuid'; +import BN from 'bn.js'; +import { assert } from 'chai'; +import tap from 'tap'; + +export function electionParametersProposalTest( + m1KeyPairs: KeyringPair[], + m2KeyPairs: KeyringPair[], + keyring: Keyring, + nodeUrl: string, + sudoUri: string +) { + let apiWrapper: ApiWrapper; + let sudo: KeyringPair; + + tap.test('Election parameters proposal test setup', async () => { + registerJoystreamTypes(); + const provider = new WsProvider(nodeUrl); + apiWrapper = await ApiWrapper.create(provider); + }); + + tap.test('Election 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 announcingPeriod: BN = await apiWrapper.getAnnouncingPeriod(); + const votingPeriod: BN = await apiWrapper.getVotingPeriod(); + const revealingPeriod: BN = await apiWrapper.getRevealingPeriod(); + const councilSize: BN = await apiWrapper.getCouncilSize(); + const candidacyLimit: BN = await apiWrapper.getCandidacyLimit(); + const newTermDuration: BN = await apiWrapper.getNewTermDuration(); + const minCouncilStake: BN = await apiWrapper.getMinCouncilStake(); + const minVotingStake: BN = await apiWrapper.getMinVotingStake(); + + // Proposal stake calculation + const proposalStake: BN = new BN(200000); + const proposalFee: BN = apiWrapper.estimateProposeElectionParametersFee( + description, + description, + proposalStake, + announcingPeriod, + votingPeriod, + revealingPeriod, + councilSize, + candidacyLimit, + newTermDuration, + minCouncilStake, + minVotingStake + ); + await apiWrapper.transferBalance(sudo, m1KeyPairs[0].address, proposalFee.add(proposalStake)); + + // Proposal creation + const proposedAnnouncingPeriod: BN = announcingPeriod.subn(1); + const proposedVotingPeriod: BN = votingPeriod.addn(1); + const proposedRevealingPeriod: BN = revealingPeriod.addn(1); + const proposedCouncilSize: BN = councilSize.addn(1); + const proposedCandidacyLimit: BN = candidacyLimit.addn(1); + const proposedNewTermDuration: BN = newTermDuration.addn(1); + const proposedMinCouncilStake: BN = minCouncilStake.addn(1); + const proposedMinVotingStake: BN = minVotingStake.addn(1); + const proposalPromise = apiWrapper.expectProposalCreated(); + await apiWrapper.proposeElectionParameters( + m1KeyPairs[0], + proposalTitle, + description, + proposalStake, + proposedAnnouncingPeriod, + proposedVotingPeriod, + proposedRevealingPeriod, + proposedCouncilSize, + proposedCandidacyLimit, + proposedNewTermDuration, + proposedMinCouncilStake, + proposedMinVotingStake + ); + const proposalNumber = await proposalPromise; + + // Approving the proposal + const proposalExecutionPromise = apiWrapper.expectProposalFinalized(); + await apiWrapper.batchApproveProposal(m2KeyPairs, proposalNumber); + await proposalExecutionPromise; + + // Assertions + const newAnnouncingPeriod: BN = await apiWrapper.getAnnouncingPeriod(); + const newVotingPeriod: BN = await apiWrapper.getVotingPeriod(); + const newRevealingPeriod: BN = await apiWrapper.getRevealingPeriod(); + const newCouncilSize: BN = await apiWrapper.getCouncilSize(); + const newCandidacyLimit: BN = await apiWrapper.getCandidacyLimit(); + const newNewTermDuration: BN = await apiWrapper.getNewTermDuration(); + const newMinCouncilStake: BN = await apiWrapper.getMinCouncilStake(); + const newMinVotingStake: BN = await apiWrapper.getMinVotingStake(); + assert( + proposedAnnouncingPeriod.eq(newAnnouncingPeriod), + `Announcing period has unexpected value ${newAnnouncingPeriod}, expected ${proposedAnnouncingPeriod}` + ); + assert( + proposedVotingPeriod.eq(newVotingPeriod), + `Voting period has unexpected value ${newVotingPeriod}, expected ${proposedVotingPeriod}` + ); + assert( + proposedRevealingPeriod.eq(newRevealingPeriod), + `Revealing has unexpected value ${newRevealingPeriod}, expected ${proposedRevealingPeriod}` + ); + assert( + proposedCouncilSize.eq(newCouncilSize), + `Council size has unexpected value ${newCouncilSize}, expected ${proposedCouncilSize}` + ); + assert( + proposedCandidacyLimit.eq(newCandidacyLimit), + `Candidacy limit has unexpected value ${newCandidacyLimit}, expected ${proposedCandidacyLimit}` + ); + assert( + proposedNewTermDuration.eq(newNewTermDuration), + `New term duration has unexpected value ${newNewTermDuration}, expected ${proposedNewTermDuration}` + ); + assert( + proposedMinCouncilStake.eq(newMinCouncilStake), + `Min council stake has unexpected value ${newMinCouncilStake}, expected ${proposedMinCouncilStake}` + ); + assert( + proposedMinVotingStake.eq(newMinVotingStake), + `Min voting stake has unexpected value ${newMinVotingStake}, expected ${proposedMinVotingStake}` + ); + }); + + tap.teardown(() => { + apiWrapper.close(); + }); +} diff --git a/tests/network-tests/src/constantinople/tests/proposals/impl/evictStoraveProvider.ts b/tests/network-tests/src/constantinople/tests/proposals/impl/evictStoraveProvider.ts new file mode 100644 index 0000000000..e3512e5011 --- /dev/null +++ b/tests/network-tests/src/constantinople/tests/proposals/impl/evictStoraveProvider.ts @@ -0,0 +1,74 @@ +import { Keyring, WsProvider } from '@polkadot/api'; +import { KeyringPair } from '@polkadot/keyring/types'; +import { registerJoystreamTypes } from '@constantinople/types'; +import { ApiWrapper } from '../../../utils/apiWrapper'; +import { v4 as uuid } from 'uuid'; +import BN from 'bn.js'; +import { assert } from 'chai'; +import { Utils } from '../../../utils/utils'; +import tap from 'tap'; + +export function evictStorageProviderTest( + m1KeyPairs: KeyringPair[], + m2KeyPairs: KeyringPair[], + keyring: Keyring, + nodeUrl: string, + sudoUri: string +) { + let apiWrapper: ApiWrapper; + let sudo: KeyringPair; + + tap.test('Evict storage provider proposal test setup', async () => { + registerJoystreamTypes(); + const provider = new WsProvider(nodeUrl); + apiWrapper = await ApiWrapper.create(provider); + }); + + tap.test('Evict storage provider 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); + if (!(await apiWrapper.isStorageProvider(sudo.address))) { + await apiWrapper.createStorageProvider(sudo); + } + assert(await apiWrapper.isStorageProvider(sudo.address), `Account ${sudo.address} is not storage provider`); + + // Proposal stake calculation + const proposalStake: BN = new BN(25000); + const proposalFee: BN = apiWrapper.estimateProposeEvictStorageProviderFee( + description, + description, + proposalStake, + sudo.address + ); + await apiWrapper.transferBalance(sudo, m1KeyPairs[0].address, proposalFee.add(proposalStake)); + + // Proposal creation + const proposalPromise = apiWrapper.expectProposalCreated(); + await apiWrapper.proposeEvictStorageProvider( + m1KeyPairs[0], + proposalTitle, + description, + proposalStake, + sudo.address + ); + const proposalNumber = await proposalPromise; + + // Approving the proposal + const proposalExecutionPromise = apiWrapper.expectProposalFinalized(); + await apiWrapper.batchApproveProposal(m2KeyPairs, proposalNumber); + await proposalExecutionPromise; + await Utils.wait(apiWrapper.getBlockDuration().toNumber()); + assert( + !(await apiWrapper.isStorageProvider(sudo.address)), + `Account ${sudo.address} is storage provider after eviction` + ); + }); + + tap.teardown(() => { + apiWrapper.close(); + }); +} diff --git a/tests/network-tests/src/constantinople/tests/proposals/impl/setLeadProposal.ts b/tests/network-tests/src/constantinople/tests/proposals/impl/setLeadProposal.ts new file mode 100644 index 0000000000..3843342b2c --- /dev/null +++ b/tests/network-tests/src/constantinople/tests/proposals/impl/setLeadProposal.ts @@ -0,0 +1,58 @@ +import { Keyring, WsProvider } from '@polkadot/api'; +import { KeyringPair } from '@polkadot/keyring/types'; +import { registerJoystreamTypes } from '@constantinople/types'; +import { ApiWrapper } from '../../../utils/apiWrapper'; +import { v4 as uuid } from 'uuid'; +import BN from 'bn.js'; +import { assert } from 'chai'; +import tap from 'tap'; + +export function setLeadProposalTest( + m1KeyPairs: KeyringPair[], + m2KeyPairs: KeyringPair[], + keyring: Keyring, + nodeUrl: string, + sudoUri: string +) { + let apiWrapper: ApiWrapper; + let sudo: KeyringPair; + + tap.test('Set lead proposal test', async () => { + registerJoystreamTypes(); + const provider = new WsProvider(nodeUrl); + apiWrapper = await ApiWrapper.create(provider); + }); + + tap.test('Lead 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); + + // Proposal stake calculation + const proposalStake: BN = new BN(50000); + const proposalFee: BN = apiWrapper.estimateProposeLeadFee(description, description, proposalStake, sudo.address); + await apiWrapper.transferBalance(sudo, m1KeyPairs[0].address, proposalFee.add(proposalStake)); + + // Proposal creation + const proposalPromise = apiWrapper.expectProposalCreated(); + await apiWrapper.proposeLead(m1KeyPairs[0], proposalTitle, description, proposalStake, m1KeyPairs[1]); + const proposalNumber = await proposalPromise; + + // Approving the proposal + const proposalExecutionPromise = apiWrapper.expectProposalFinalized(); + await apiWrapper.batchApproveProposal(m2KeyPairs, proposalNumber); + await proposalExecutionPromise; + const newLead: string = await apiWrapper.getCurrentLeadAddress(); + assert( + newLead === m1KeyPairs[1].address, + `New lead has unexpected value ${newLead}, expected ${m1KeyPairs[1].address}` + ); + }); + + tap.teardown(() => { + apiWrapper.close(); + }); +} diff --git a/tests/network-tests/src/constantinople/tests/proposals/impl/spendingProposal.ts b/tests/network-tests/src/constantinople/tests/proposals/impl/spendingProposal.ts new file mode 100644 index 0000000000..0928e79537 --- /dev/null +++ b/tests/network-tests/src/constantinople/tests/proposals/impl/spendingProposal.ts @@ -0,0 +1,76 @@ +import { Keyring, WsProvider } from '@polkadot/api'; +import { KeyringPair } from '@polkadot/keyring/types'; +import { registerJoystreamTypes } from '@constantinople/types'; +import { ApiWrapper } from '../../../utils/apiWrapper'; +import { v4 as uuid } from 'uuid'; +import BN from 'bn.js'; +import { assert } from 'chai'; +import tap from 'tap'; + +export function spendingProposalTest( + m1KeyPairs: KeyringPair[], + m2KeyPairs: KeyringPair[], + keyring: Keyring, + nodeUrl: string, + sudoUri: string, + spendingBalance: BN, + mintCapacity: BN +) { + let apiWrapper: ApiWrapper; + let sudo: KeyringPair; + + tap.test('Spending proposal test setup', async () => { + registerJoystreamTypes(); + const provider = new WsProvider(nodeUrl); + apiWrapper = await ApiWrapper.create(provider); + }); + + tap.test('Spending proposal test', async () => { + // Setup + sudo = keyring.addFromUri(sudoUri); + const description: string = 'spending proposal which is used for API network testing with some mock data'; + const runtimeVoteFee: BN = apiWrapper.estimateVoteForProposalFee(); + + // Topping the balances + const proposalStake: BN = new BN(25000); + const runtimeProposalFee: BN = apiWrapper.estimateProposeSpendingFee( + description, + description, + proposalStake, + spendingBalance, + sudo.address + ); + await apiWrapper.transferBalance(sudo, m1KeyPairs[0].address, runtimeProposalFee.add(proposalStake)); + await apiWrapper.transferBalanceToAccounts(sudo, m2KeyPairs, runtimeVoteFee); + await apiWrapper.sudoSetCouncilMintCapacity(sudo, mintCapacity); + + // Proposal creation + const proposalPromise = apiWrapper.expectProposalCreated(); + await apiWrapper.proposeSpending( + m1KeyPairs[0], + 'testing spending' + uuid().substring(0, 8), + 'spending to test proposal functionality' + uuid().substring(0, 8), + proposalStake, + spendingBalance, + sudo.address + ); + const proposalNumber = await proposalPromise; + + // Approving spending proposal + const balanceBeforeMinting: BN = await apiWrapper.getBalance(sudo.address); + const spendingPromise = apiWrapper.expectProposalFinalized(); + await apiWrapper.batchApproveProposal(m2KeyPairs, proposalNumber); + await spendingPromise; + const balanceAfterMinting: BN = await apiWrapper.getBalance(sudo.address); + assert( + balanceAfterMinting.sub(balanceBeforeMinting).eq(spendingBalance), + `member ${ + m1KeyPairs[0].address + } has unexpected balance ${balanceAfterMinting}, expected ${balanceBeforeMinting.add(spendingBalance)}` + ); + }); + + tap.teardown(() => { + apiWrapper.close(); + }); +} diff --git a/tests/network-tests/src/constantinople/tests/proposals/impl/storageRoleParametersProposal.ts b/tests/network-tests/src/constantinople/tests/proposals/impl/storageRoleParametersProposal.ts new file mode 100644 index 0000000000..50e367c2c9 --- /dev/null +++ b/tests/network-tests/src/constantinople/tests/proposals/impl/storageRoleParametersProposal.ts @@ -0,0 +1,132 @@ +import { Keyring, WsProvider } from '@polkadot/api'; +import { KeyringPair } from '@polkadot/keyring/types'; +import { registerJoystreamTypes } from '@constantinople/types'; +import { ApiWrapper } from '../../../utils/apiWrapper'; +import { v4 as uuid } from 'uuid'; +import BN from 'bn.js'; +import { assert } from 'chai'; +import { RoleParameters } from '@constantinople/types/lib/roles'; +import tap from 'tap'; + +export function storageRoleParametersProposalTest( + m1KeyPairs: KeyringPair[], + m2KeyPairs: KeyringPair[], + keyring: Keyring, + nodeUrl: string, + sudoUri: string +) { + let apiWrapper: ApiWrapper; + let sudo: KeyringPair; + + tap.test('Storage role parameters proposal test setup', async () => { + registerJoystreamTypes(); + const provider = new WsProvider(nodeUrl); + apiWrapper = await ApiWrapper.create(provider); + }); + + tap.test('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; + + // Proposal stake calculation + const proposalStake: BN = new BN(100000); + 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 + const proposedMinStake: BN = roleParameters.min_stake.toBn().addn(1); + const proposedMaxActors: BN = roleParameters.max_actors.toBn().addn(1); + const proposedReward: BN = roleParameters.reward.toBn().addn(1); + const proposedRewardPeriod: BN = roleParameters.reward_period.toBn().addn(1); + const proposedBondingPeriod: BN = roleParameters.bonding_period.toBn().addn(1); + const proposedUnbondingPeriod: BN = roleParameters.unbonding_period.toBn().addn(1); + const proposedMinServicePeriod: BN = roleParameters.min_service_period.toBn().addn(1); + const proposedStartupGracePeriod: BN = roleParameters.startup_grace_period.toBn().addn(1); + const proposedEntryRequestFee: BN = roleParameters.entry_request_fee.toBn().addn(1); + const proposalPromise = apiWrapper.expectProposalCreated(); + await apiWrapper.proposeStorageRoleParameters( + m1KeyPairs[0], + proposalTitle, + description, + proposalStake, + proposedMinStake, + roleParameters.min_actors.toBn(), + proposedMaxActors, + proposedReward, + proposedRewardPeriod, + proposedBondingPeriod, + proposedUnbondingPeriod, + proposedMinServicePeriod, + proposedStartupGracePeriod, + proposedEntryRequestFee + ); + const proposalNumber = await proposalPromise; + + // Approving the proposal + const proposalExecutionPromise = apiWrapper.expectProposalFinalized(); + await apiWrapper.batchApproveProposal(m2KeyPairs, proposalNumber); + await proposalExecutionPromise; + + // Assertions + const newRoleParameters: RoleParameters = await apiWrapper.getStorageRoleParameters(); + assert( + proposedMinStake.eq(newRoleParameters.min_stake.toBn()), + `Min stake has unexpected value ${newRoleParameters.min_stake.toBn()}, expected ${proposedMinStake}` + ); + assert( + proposedMaxActors.eq(newRoleParameters.max_actors.toBn()), + `Max actors has unexpected value ${newRoleParameters.max_actors.toBn()}, expected ${proposedMaxActors}` + ); + assert( + proposedReward.eq(newRoleParameters.reward.toBn()), + `Reward has unexpected value ${newRoleParameters.reward.toBn()}, expected ${proposedReward}` + ); + assert( + proposedRewardPeriod.eq(newRoleParameters.reward_period.toBn()), + `Reward period has unexpected value ${newRoleParameters.reward_period.toBn()}, expected ${proposedRewardPeriod}` + ); + assert( + proposedBondingPeriod.eq(newRoleParameters.bonding_period.toBn()), + `Bonding period has unexpected value ${newRoleParameters.bonding_period.toBn()}, expected ${proposedBondingPeriod}` + ); + assert( + proposedUnbondingPeriod.eq(newRoleParameters.unbonding_period.toBn()), + `Unbonding period has unexpected value ${newRoleParameters.unbonding_period.toBn()}, expected ${proposedUnbondingPeriod}` + ); + assert( + proposedMinServicePeriod.eq(newRoleParameters.min_service_period.toBn()), + `Min service period has unexpected value ${newRoleParameters.min_service_period.toBn()}, expected ${proposedMinServicePeriod}` + ); + assert( + proposedStartupGracePeriod.eq(newRoleParameters.startup_grace_period.toBn()), + `Startup grace period has unexpected value ${newRoleParameters.startup_grace_period.toBn()}, expected ${proposedStartupGracePeriod}` + ); + assert( + proposedEntryRequestFee.eq(newRoleParameters.entry_request_fee.toBn()), + `Entry request fee has unexpected value ${newRoleParameters.entry_request_fee.toBn()}, expected ${proposedEntryRequestFee}` + ); + }); + + tap.teardown(() => { + apiWrapper.close(); + }); +} diff --git a/tests/network-tests/src/constantinople/tests/proposals/impl/textProposal.ts b/tests/network-tests/src/constantinople/tests/proposals/impl/textProposal.ts new file mode 100644 index 0000000000..2f7377c152 --- /dev/null +++ b/tests/network-tests/src/constantinople/tests/proposals/impl/textProposal.ts @@ -0,0 +1,58 @@ +import { Keyring, WsProvider } from '@polkadot/api'; +import { KeyringPair } from '@polkadot/keyring/types'; +import { registerJoystreamTypes } from '@constantinople/types'; +import { ApiWrapper } from '../../../utils/apiWrapper'; +import { v4 as uuid } from 'uuid'; +import BN from 'bn.js'; +import tap from 'tap'; + +export function textProposalTest( + m1KeyPairs: KeyringPair[], + m2KeyPairs: KeyringPair[], + keyring: Keyring, + nodeUrl: string, + sudoUri: string +) { + let apiWrapper: ApiWrapper; + let sudo: KeyringPair; + + tap.test('Text proposal test setup', async () => { + registerJoystreamTypes(); + const provider = new WsProvider(nodeUrl); + apiWrapper = await ApiWrapper.create(provider); + }); + + tap.test('Text proposal test', async () => { + // Setup + sudo = keyring.addFromUri(sudoUri); + const proposalTitle: string = 'Testing proposal ' + uuid().substring(0, 8); + const description: string = 'Testing text proposal ' + uuid().substring(0, 8); + const proposalText: string = 'Text of the testing proposal ' + uuid().substring(0, 8); + const runtimeVoteFee: BN = apiWrapper.estimateVoteForProposalFee(); + await apiWrapper.transferBalanceToAccounts(sudo, m2KeyPairs, runtimeVoteFee); + + // Proposal stake calculation + const proposalStake: BN = new BN(25000); + const runtimeProposalFee: BN = apiWrapper.estimateProposeTextFee( + proposalStake, + description, + description, + proposalText + ); + await apiWrapper.transferBalance(sudo, m1KeyPairs[0].address, runtimeProposalFee.add(proposalStake)); + + // Proposal creation + const proposalPromise = apiWrapper.expectProposalCreated(); + await apiWrapper.proposeText(m1KeyPairs[0], proposalStake, proposalTitle, description, proposalText); + const proposalNumber = await proposalPromise; + + // Approving text proposal + const textProposalPromise = apiWrapper.expectProposalFinalized(); + await apiWrapper.batchApproveProposal(m2KeyPairs, proposalNumber); + await textProposalPromise; + }); + + tap.teardown(() => { + apiWrapper.close(); + }); +} diff --git a/tests/network-tests/src/constantinople/tests/proposals/impl/updateRuntime.ts b/tests/network-tests/src/constantinople/tests/proposals/impl/updateRuntime.ts new file mode 100644 index 0000000000..90658bdd08 --- /dev/null +++ b/tests/network-tests/src/constantinople/tests/proposals/impl/updateRuntime.ts @@ -0,0 +1,64 @@ +import { Keyring, WsProvider } from '@polkadot/api'; +import { Bytes } from '@polkadot/types'; +import { KeyringPair } from '@polkadot/keyring/types'; +import { registerJoystreamTypes } from '@constantinople/types'; +import { ApiWrapper } from '../../../utils/apiWrapper'; +import { v4 as uuid } from 'uuid'; +import BN from 'bn.js'; +import tap from 'tap'; + +export function updateRuntimeTest( + m1KeyPairs: KeyringPair[], + m2KeyPairs: KeyringPair[], + keyring: Keyring, + nodeUrl: string, + sudoUri: string +) { + let apiWrapper: ApiWrapper; + let sudo: KeyringPair; + + tap.test('Update runtime test setup', async () => { + registerJoystreamTypes(); + const provider = new WsProvider(nodeUrl); + apiWrapper = await ApiWrapper.create(provider); + }); + + tap.test('\n\tUpgrading the runtime test', async () => { + // Setup + sudo = keyring.addFromUri(sudoUri); + const runtime: Bytes = await apiWrapper.getRuntime(); + const description: string = 'runtime upgrade proposal which is used for API network testing'; + const runtimeVoteFee: BN = apiWrapper.estimateVoteForProposalFee(); + + // Topping the balances + const proposalStake: BN = new BN(1000000); + const runtimeProposalFee: BN = apiWrapper.estimateProposeRuntimeUpgradeFee( + proposalStake, + description, + description, + runtime + ); + await apiWrapper.transferBalance(sudo, m1KeyPairs[0].address, runtimeProposalFee.add(proposalStake)); + await apiWrapper.transferBalanceToAccounts(sudo, m2KeyPairs, runtimeVoteFee); + + // Proposal creation + const proposalPromise = apiWrapper.expectProposalCreated(); + await apiWrapper.proposeRuntime( + m1KeyPairs[0], + proposalStake, + 'testing runtime' + uuid().substring(0, 8), + 'runtime to test proposal functionality' + uuid().substring(0, 8), + runtime + ); + const proposalNumber = await proposalPromise; + + // Approving runtime update proposal + const runtimePromise = apiWrapper.expectProposalFinalized(); + await apiWrapper.batchApproveProposal(m2KeyPairs, proposalNumber); + await runtimePromise; + }); + + tap.teardown(() => { + apiWrapper.close(); + }); +} diff --git a/tests/network-tests/src/constantinople/tests/proposals/impl/validatorCountProposal.ts b/tests/network-tests/src/constantinople/tests/proposals/impl/validatorCountProposal.ts new file mode 100644 index 0000000000..f2b33ed50b --- /dev/null +++ b/tests/network-tests/src/constantinople/tests/proposals/impl/validatorCountProposal.ts @@ -0,0 +1,67 @@ +import { Keyring, WsProvider } from '@polkadot/api'; +import { KeyringPair } from '@polkadot/keyring/types'; +import { registerJoystreamTypes } from '@constantinople/types'; +import { ApiWrapper } from '../../../utils/apiWrapper'; +import { v4 as uuid } from 'uuid'; +import BN from 'bn.js'; +import { assert } from 'chai'; +import tap from 'tap'; + +export function validatorCountProposal( + m1KeyPairs: KeyringPair[], + m2KeyPairs: KeyringPair[], + keyring: Keyring, + nodeUrl: string, + sudoUri: string, + validatorCountIncrement: BN +) { + let apiWrapper: ApiWrapper; + let sudo: KeyringPair; + + tap.test('Validator count proposal test setup', async () => { + registerJoystreamTypes(); + const provider = new WsProvider(nodeUrl); + apiWrapper = await ApiWrapper.create(provider); + }); + + tap.test('Validator count 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); + + // Proposal stake calculation + const proposalStake: BN = new BN(100000); + const proposalFee: BN = apiWrapper.estimateProposeValidatorCountFee(description, description, proposalStake); + await apiWrapper.transferBalance(sudo, m1KeyPairs[0].address, proposalFee.add(proposalStake)); + const validatorCount: BN = await apiWrapper.getValidatorCount(); + + // Proposal creation + const proposedValidatorCount: BN = validatorCount.add(validatorCountIncrement); + const proposalPromise = apiWrapper.expectProposalCreated(); + await apiWrapper.proposeValidatorCount( + m1KeyPairs[0], + proposalTitle, + description, + proposalStake, + proposedValidatorCount + ); + const proposalNumber = await proposalPromise; + + // Approving the proposal + const proposalExecutionPromise = apiWrapper.expectProposalFinalized(); + await apiWrapper.batchApproveProposal(m2KeyPairs, proposalNumber); + await proposalExecutionPromise; + const newValidatorCount: BN = await apiWrapper.getValidatorCount(); + assert( + proposedValidatorCount.eq(newValidatorCount), + `Validator count has unexpeccted value ${newValidatorCount}, expected ${proposedValidatorCount}` + ); + }); + + tap.teardown(() => { + apiWrapper.close(); + }); +} diff --git a/tests/network-tests/src/constantinople/tests/proposals/impl/workingGroupMintCapacityProposal.ts b/tests/network-tests/src/constantinople/tests/proposals/impl/workingGroupMintCapacityProposal.ts new file mode 100644 index 0000000000..27e9623ac2 --- /dev/null +++ b/tests/network-tests/src/constantinople/tests/proposals/impl/workingGroupMintCapacityProposal.ts @@ -0,0 +1,71 @@ +import { Keyring, WsProvider } from '@polkadot/api'; +import { KeyringPair } from '@polkadot/keyring/types'; +import { registerJoystreamTypes } from '@constantinople/types'; +import { ApiWrapper } from '../../../utils/apiWrapper'; +import { v4 as uuid } from 'uuid'; +import BN from 'bn.js'; +import { assert } from 'chai'; +import tap from 'tap'; + +export function workingGroupMintCapacityProposalTest( + m1KeyPairs: KeyringPair[], + m2KeyPairs: KeyringPair[], + keyring: Keyring, + nodeUrl: string, + sudoUri: string, + mintingCapacityIncrement: BN +) { + let apiWrapper: ApiWrapper; + let sudo: KeyringPair; + + tap.test('Working group mint capacity proposal test', async () => { + registerJoystreamTypes(); + const provider = new WsProvider(nodeUrl); + apiWrapper = await ApiWrapper.create(provider); + }); + + tap.test('Mint capacity proposal test', async () => { + // Setup + sudo = keyring.addFromUri(sudoUri); + const description: string = 'spending proposal which is used for API network testing'; + const runtimeVoteFee: BN = apiWrapper.estimateVoteForProposalFee(); + const initialMintingCapacity: BN = await apiWrapper.getWorkingGroupMintCapacity(); + + // Topping the balances + const proposalStake: BN = new BN(50000); + const runtimeProposalFee: BN = apiWrapper.estimateProposeWorkingGroupMintCapacityFee( + description, + description, + proposalStake, + initialMintingCapacity.add(mintingCapacityIncrement) + ); + await apiWrapper.transferBalance(sudo, m1KeyPairs[0].address, runtimeProposalFee.add(proposalStake)); + await apiWrapper.transferBalanceToAccounts(sudo, m2KeyPairs, runtimeVoteFee); + + // Proposal creation + const proposedMintingCapacity: BN = initialMintingCapacity.add(mintingCapacityIncrement); + const proposalPromise = apiWrapper.expectProposalCreated(); + await apiWrapper.proposeWorkingGroupMintCapacity( + m1KeyPairs[0], + 'testing mint capacity' + uuid().substring(0, 8), + 'mint capacity to test proposal functionality' + uuid().substring(0, 8), + proposalStake, + proposedMintingCapacity + ); + const proposalNumber = await proposalPromise; + + // Approving mint capacity proposal + const mintCapacityPromise = apiWrapper.expectProposalFinalized(); + await apiWrapper.batchApproveProposal(m2KeyPairs, proposalNumber); + await mintCapacityPromise; + const newMintingCapacity: BN = await apiWrapper.getWorkingGroupMintCapacity(); + assert( + proposedMintingCapacity.eq(newMintingCapacity), + `Content working group has unexpected minting capacity ${newMintingCapacity}, expected ${proposedMintingCapacity}` + ); + }); + + tap.teardown(() => { + apiWrapper.close(); + }); +} diff --git a/tests/network-tests/src/constantinople/tests/proposals/setLeadProposalTest.ts b/tests/network-tests/src/constantinople/tests/proposals/setLeadProposalTest.ts new file mode 100644 index 0000000000..0aad559f2e --- /dev/null +++ b/tests/network-tests/src/constantinople/tests/proposals/setLeadProposalTest.ts @@ -0,0 +1,29 @@ +import { KeyringPair } from '@polkadot/keyring/types'; +import { membershipTest } from '../impl/membershipCreation'; +import { councilTest } from '../impl/electingCouncil'; +import { setLeadProposalTest } from './impl/setLeadProposal'; +import { initConfig } from '../../utils/config'; +import { Keyring } from '@polkadot/api'; +import BN from 'bn.js'; +import { setTimeout } from '../impl/setTimeout'; + +initConfig(); + +const m1KeyPairs: KeyringPair[] = new Array(); +const m2KeyPairs: KeyringPair[] = new Array(); + +const keyring = new Keyring({ type: 'sr25519' }); +const N: number = +process.env.MEMBERSHIP_CREATION_N!; +const paidTerms: number = +process.env.MEMBERSHIP_PAID_TERMS!; +const nodeUrl: string = process.env.NODE_URL!; +const sudoUri: string = process.env.SUDO_ACCOUNT_URI!; +const K: number = +process.env.COUNCIL_ELECTION_K!; +const greaterStake: BN = new BN(+process.env.COUNCIL_STAKE_GREATER_AMOUNT!); +const lesserStake: BN = new BN(+process.env.COUNCIL_STAKE_LESSER_AMOUNT!); +const durationInBlocks: number = 29; + +setTimeout(nodeUrl, durationInBlocks); +membershipTest(m1KeyPairs, keyring, N, paidTerms, nodeUrl, sudoUri); +membershipTest(m2KeyPairs, keyring, N, paidTerms, nodeUrl, sudoUri); +councilTest(m1KeyPairs, m2KeyPairs, keyring, K, nodeUrl, sudoUri, greaterStake, lesserStake); +setLeadProposalTest(m1KeyPairs, m2KeyPairs, keyring, nodeUrl, sudoUri); diff --git a/tests/network-tests/src/constantinople/tests/proposals/spendingProposalTest.ts b/tests/network-tests/src/constantinople/tests/proposals/spendingProposalTest.ts new file mode 100644 index 0000000000..9e2812f1fa --- /dev/null +++ b/tests/network-tests/src/constantinople/tests/proposals/spendingProposalTest.ts @@ -0,0 +1,31 @@ +import { KeyringPair } from '@polkadot/keyring/types'; +import { membershipTest } from '../impl/membershipCreation'; +import { councilTest } from '../impl/electingCouncil'; +import { spendingProposalTest } from './impl/spendingProposal'; +import { initConfig } from '../../utils/config'; +import { Keyring } from '@polkadot/api'; +import BN from 'bn.js'; +import { setTimeout } from '../impl/setTimeout'; + +initConfig(); + +const m1KeyPairs: KeyringPair[] = new Array(); +const m2KeyPairs: KeyringPair[] = new Array(); + +const keyring = new Keyring({ type: 'sr25519' }); +const N: number = +process.env.MEMBERSHIP_CREATION_N!; +const paidTerms: number = +process.env.MEMBERSHIP_PAID_TERMS!; +const nodeUrl: string = process.env.NODE_URL!; +const sudoUri: string = process.env.SUDO_ACCOUNT_URI!; +const K: number = +process.env.COUNCIL_ELECTION_K!; +const greaterStake: BN = new BN(+process.env.COUNCIL_STAKE_GREATER_AMOUNT!); +const lesserStake: BN = new BN(+process.env.COUNCIL_STAKE_LESSER_AMOUNT!); +const spendingBalance: BN = new BN(+process.env.SPENDING_BALANCE!); +const mintCapacity: BN = new BN(+process.env.COUNCIL_MINTING_CAPACITY!); +const durationInBlocks: number = 29; + +setTimeout(nodeUrl, durationInBlocks); +membershipTest(m1KeyPairs, keyring, N, paidTerms, nodeUrl, sudoUri); +membershipTest(m2KeyPairs, keyring, N, paidTerms, nodeUrl, sudoUri); +councilTest(m1KeyPairs, m2KeyPairs, keyring, K, nodeUrl, sudoUri, greaterStake, lesserStake); +spendingProposalTest(m1KeyPairs, m2KeyPairs, keyring, nodeUrl, sudoUri, spendingBalance, mintCapacity); diff --git a/tests/network-tests/src/constantinople/tests/proposals/storageRoleParametersProposalTest.ts b/tests/network-tests/src/constantinople/tests/proposals/storageRoleParametersProposalTest.ts new file mode 100644 index 0000000000..5eaf336a11 --- /dev/null +++ b/tests/network-tests/src/constantinople/tests/proposals/storageRoleParametersProposalTest.ts @@ -0,0 +1,29 @@ +import { KeyringPair } from '@polkadot/keyring/types'; +import { membershipTest } from '../impl/membershipCreation'; +import { councilTest } from '../impl/electingCouncil'; +import { storageRoleParametersProposalTest } from './impl/storageRoleParametersProposal'; +import { initConfig } from '../../utils/config'; +import { Keyring } from '@polkadot/api'; +import BN from 'bn.js'; +import { setTimeout } from '../impl/setTimeout'; + +initConfig(); + +const m1KeyPairs: KeyringPair[] = new Array(); +const m2KeyPairs: KeyringPair[] = new Array(); + +const keyring = new Keyring({ type: 'sr25519' }); +const N: number = +process.env.MEMBERSHIP_CREATION_N!; +const paidTerms: number = +process.env.MEMBERSHIP_PAID_TERMS!; +const nodeUrl: string = process.env.NODE_URL!; +const sudoUri: string = process.env.SUDO_ACCOUNT_URI!; +const K: number = +process.env.COUNCIL_ELECTION_K!; +const greaterStake: BN = new BN(+process.env.COUNCIL_STAKE_GREATER_AMOUNT!); +const lesserStake: BN = new BN(+process.env.COUNCIL_STAKE_LESSER_AMOUNT!); +const durationInBlocks: number = 29; + +setTimeout(nodeUrl, durationInBlocks); +membershipTest(m1KeyPairs, keyring, N, paidTerms, nodeUrl, sudoUri); +membershipTest(m2KeyPairs, keyring, N, paidTerms, nodeUrl, sudoUri); +councilTest(m1KeyPairs, m2KeyPairs, keyring, K, nodeUrl, sudoUri, greaterStake, lesserStake); +storageRoleParametersProposalTest(m1KeyPairs, m2KeyPairs, keyring, nodeUrl, sudoUri); diff --git a/tests/network-tests/src/constantinople/tests/proposals/textProposalTest.ts b/tests/network-tests/src/constantinople/tests/proposals/textProposalTest.ts new file mode 100644 index 0000000000..96d9f4d9e7 --- /dev/null +++ b/tests/network-tests/src/constantinople/tests/proposals/textProposalTest.ts @@ -0,0 +1,29 @@ +import { KeyringPair } from '@polkadot/keyring/types'; +import { membershipTest } from '../impl/membershipCreation'; +import { councilTest } from '../impl/electingCouncil'; +import { textProposalTest } from './impl/textProposal'; +import { initConfig } from '../../utils/config'; +import { Keyring } from '@polkadot/api'; +import BN from 'bn.js'; +import { setTimeout } from '../impl/setTimeout'; + +initConfig(); + +const m1KeyPairs: KeyringPair[] = new Array(); +const m2KeyPairs: KeyringPair[] = new Array(); + +const keyring = new Keyring({ type: 'sr25519' }); +const N: number = +process.env.MEMBERSHIP_CREATION_N!; +const paidTerms: number = +process.env.MEMBERSHIP_PAID_TERMS!; +const nodeUrl: string = process.env.NODE_URL!; +const sudoUri: string = process.env.SUDO_ACCOUNT_URI!; +const K: number = +process.env.COUNCIL_ELECTION_K!; +const greaterStake: BN = new BN(+process.env.COUNCIL_STAKE_GREATER_AMOUNT!); +const lesserStake: BN = new BN(+process.env.COUNCIL_STAKE_LESSER_AMOUNT!); +const durationInBlocks: number = 28; + +setTimeout(nodeUrl, durationInBlocks); +membershipTest(m1KeyPairs, keyring, N, paidTerms, nodeUrl, sudoUri); +membershipTest(m2KeyPairs, keyring, N, paidTerms, nodeUrl, sudoUri); +councilTest(m1KeyPairs, m2KeyPairs, keyring, K, nodeUrl, sudoUri, greaterStake, lesserStake); +textProposalTest(m1KeyPairs, m2KeyPairs, keyring, nodeUrl, sudoUri); diff --git a/tests/network-tests/src/constantinople/tests/proposals/updateRuntimeTest.ts b/tests/network-tests/src/constantinople/tests/proposals/updateRuntimeTest.ts new file mode 100644 index 0000000000..ab361ee6e8 --- /dev/null +++ b/tests/network-tests/src/constantinople/tests/proposals/updateRuntimeTest.ts @@ -0,0 +1,30 @@ +import { KeyringPair } from '@polkadot/keyring/types'; +import { membershipTest } from '../impl/membershipCreation'; +import { councilTest } from '../impl/electingCouncil'; +import { updateRuntimeTest } from './impl/updateRuntime'; +import { initConfig } from '../../utils/config'; +import { Keyring } from '@polkadot/api'; +import BN from 'bn.js'; +import { setTimeout } from '../impl/setTimeout'; + +initConfig(); + +const m1KeyPairs: KeyringPair[] = new Array(); +const m2KeyPairs: KeyringPair[] = new Array(); + +const keyring = new Keyring({ type: 'sr25519' }); +const N: number = +process.env.MEMBERSHIP_CREATION_N!; +const paidTerms: number = +process.env.MEMBERSHIP_PAID_TERMS!; +const nodeUrl: string = process.env.NODE_URL!; +const sudoUri: string = process.env.SUDO_ACCOUNT_URI!; +const K: number = +process.env.COUNCIL_ELECTION_K!; +const greaterStake: BN = new BN(+process.env.COUNCIL_STAKE_GREATER_AMOUNT!); +const lesserStake: BN = new BN(+process.env.COUNCIL_STAKE_LESSER_AMOUNT!); +const durationInBlocks: number = 54; + +setTimeout(nodeUrl, durationInBlocks); +membershipTest(m1KeyPairs, keyring, N, paidTerms, nodeUrl, sudoUri); +membershipTest(m2KeyPairs, keyring, N, paidTerms, nodeUrl, sudoUri); +councilTest(m1KeyPairs, m2KeyPairs, keyring, K, nodeUrl, sudoUri, greaterStake, lesserStake); +updateRuntimeTest(m1KeyPairs, m2KeyPairs, keyring, nodeUrl, sudoUri); +membershipTest(new Array(), keyring, N, paidTerms, nodeUrl, sudoUri); diff --git a/tests/network-tests/src/constantinople/tests/proposals/validatorCountProposalTest.ts b/tests/network-tests/src/constantinople/tests/proposals/validatorCountProposalTest.ts new file mode 100644 index 0000000000..b793b634d2 --- /dev/null +++ b/tests/network-tests/src/constantinople/tests/proposals/validatorCountProposalTest.ts @@ -0,0 +1,30 @@ +import { KeyringPair } from '@polkadot/keyring/types'; +import { membershipTest } from '../impl/membershipCreation'; +import { councilTest } from '../impl/electingCouncil'; +import { validatorCountProposal } from './impl/validatorCountProposal'; +import { initConfig } from '../../utils/config'; +import { Keyring } from '@polkadot/api'; +import BN from 'bn.js'; +import { setTimeout } from '../impl/setTimeout'; + +initConfig(); + +const m1KeyPairs: KeyringPair[] = new Array(); +const m2KeyPairs: KeyringPair[] = new Array(); + +const keyring = new Keyring({ type: 'sr25519' }); +const N: number = +process.env.MEMBERSHIP_CREATION_N!; +const paidTerms: number = +process.env.MEMBERSHIP_PAID_TERMS!; +const nodeUrl: string = process.env.NODE_URL!; +const sudoUri: string = process.env.SUDO_ACCOUNT_URI!; +const K: number = +process.env.COUNCIL_ELECTION_K!; +const greaterStake: BN = new BN(+process.env.COUNCIL_STAKE_GREATER_AMOUNT!); +const lesserStake: BN = new BN(+process.env.COUNCIL_STAKE_LESSER_AMOUNT!); +const validatorCountIncrement: BN = new BN(+process.env.VALIDATOR_COUNT_INCREMENT!); +const durationInBlocks: number = 29; + +setTimeout(nodeUrl, durationInBlocks); +membershipTest(m1KeyPairs, keyring, N, paidTerms, nodeUrl, sudoUri); +membershipTest(m2KeyPairs, keyring, N, paidTerms, nodeUrl, sudoUri); +councilTest(m1KeyPairs, m2KeyPairs, keyring, K, nodeUrl, sudoUri, greaterStake, lesserStake); +validatorCountProposal(m1KeyPairs, m2KeyPairs, keyring, nodeUrl, sudoUri, validatorCountIncrement); diff --git a/tests/network-tests/src/constantinople/tests/proposals/workingGroupMintCapacityProposalTest.ts b/tests/network-tests/src/constantinople/tests/proposals/workingGroupMintCapacityProposalTest.ts new file mode 100644 index 0000000000..3f9e3fd02c --- /dev/null +++ b/tests/network-tests/src/constantinople/tests/proposals/workingGroupMintCapacityProposalTest.ts @@ -0,0 +1,30 @@ +import { KeyringPair } from '@polkadot/keyring/types'; +import { membershipTest } from '../impl/membershipCreation'; +import { councilTest } from '../impl/electingCouncil'; +import { workingGroupMintCapacityProposalTest } from './impl/workingGroupMintCapacityProposal'; +import { initConfig } from '../../utils/config'; +import { Keyring } from '@polkadot/api'; +import BN from 'bn.js'; +import { setTimeout } from '../impl/setTimeout'; + +initConfig(); + +const m1KeyPairs: KeyringPair[] = new Array(); +const m2KeyPairs: KeyringPair[] = new Array(); + +const keyring = new Keyring({ type: 'sr25519' }); +const N: number = +process.env.MEMBERSHIP_CREATION_N!; +const paidTerms: number = +process.env.MEMBERSHIP_PAID_TERMS!; +const nodeUrl: string = process.env.NODE_URL!; +const sudoUri: string = process.env.SUDO_ACCOUNT_URI!; +const K: number = +process.env.COUNCIL_ELECTION_K!; +const greaterStake: BN = new BN(+process.env.COUNCIL_STAKE_GREATER_AMOUNT!); +const lesserStake: BN = new BN(+process.env.COUNCIL_STAKE_LESSER_AMOUNT!); +const mintingCapacityIncrement: BN = new BN(+process.env.MINTING_CAPACITY_INCREMENT!); +const durationInBlocks: number = 29; + +setTimeout(nodeUrl, durationInBlocks); +membershipTest(m1KeyPairs, keyring, N, paidTerms, nodeUrl, sudoUri); +membershipTest(m2KeyPairs, keyring, N, paidTerms, nodeUrl, sudoUri); +councilTest(m1KeyPairs, m2KeyPairs, keyring, K, nodeUrl, sudoUri, greaterStake, lesserStake); +workingGroupMintCapacityProposalTest(m1KeyPairs, m2KeyPairs, keyring, nodeUrl, sudoUri, mintingCapacityIncrement); diff --git a/tests/network-tests/src/tests/constantinople/utils/apiWrapper.ts b/tests/network-tests/src/constantinople/utils/apiWrapper.ts similarity index 56% rename from tests/network-tests/src/tests/constantinople/utils/apiWrapper.ts rename to tests/network-tests/src/constantinople/utils/apiWrapper.ts index c43f541741..04f12a5953 100644 --- a/tests/network-tests/src/tests/constantinople/utils/apiWrapper.ts +++ b/tests/network-tests/src/constantinople/utils/apiWrapper.ts @@ -2,10 +2,13 @@ import { ApiPromise, WsProvider } from '@polkadot/api'; import { Option, Vec, Bytes, u32 } from '@polkadot/types'; import { Codec } from '@polkadot/types/types'; import { KeyringPair } from '@polkadot/keyring/types'; -import { UserInfo, PaidMembershipTerms, MemberId } from '@joystream/types/lib/members'; -import { Seat, VoteKind } from '@joystream/types/'; -import { Balance, EventRecord } from '@polkadot/types/interfaces'; -import BN = require('bn.js'); +import { UserInfo, PaidMembershipTerms, MemberId } from '@constantinople/types/lib/members'; +import { Mint, MintId } from '@constantinople/types/lib/mint'; +import { Lead, LeadId } from '@constantinople/types/lib/content-working-group'; +import { RoleParameters } from '@constantinople/types/lib/roles'; +import { Seat } from '@constantinople/types'; +import { Balance, EventRecord, AccountId, BlockNumber, BalanceOf } from '@polkadot/types/interfaces'; +import BN from 'bn.js'; import { SubmittableExtrinsic } from '@polkadot/api/types'; import { Sender } from './sender'; import { Utils } from './utils'; @@ -61,11 +64,12 @@ export class ApiWrapper { return this.getPaidMembershipTerms(paidTermsId).then(terms => terms.unwrap().fee.toBn()); } - public async transferBalanceToAccounts(from: KeyringPair, to: KeyringPair[], amount: BN): Promise { - for (const keyPair of to) { - await this.transferBalance(from, keyPair.address, amount); - } - return; + public async transferBalanceToAccounts(from: KeyringPair, to: KeyringPair[], amount: BN): Promise { + return Promise.all( + to.map(async keyPair => { + await this.transferBalance(from, keyPair.address, amount); + }) + ); } private getBaseTxFee(): BN { @@ -132,6 +136,82 @@ export class ApiWrapper { ); } + public estimateProposeValidatorCountFee(title: string, description: string, stake: BN): BN { + return this.estimateTxFee( + this.api.tx.proposalsCodex.createSetValidatorCountProposal(stake, title, description, stake, stake) + ); + } + + public estimateProposeLeadFee(title: string, description: string, stake: BN, address: string): BN { + return this.estimateTxFee( + this.api.tx.proposalsCodex.createSetLeadProposal(stake, title, description, stake, { stake, address }) + ); + } + + public estimateProposeEvictStorageProviderFee(title: string, description: string, stake: BN, address: string): BN { + return this.estimateTxFee( + this.api.tx.proposalsCodex.createEvictStorageProviderProposal(stake, title, description, stake, address) + ); + } + + public estimateProposeStorageRoleParametersFee( + title: string, + description: string, + stake: BN, + minStake: BN, + minActors: BN, + maxActors: BN, + reward: BN, + rewardPeriod: BN, + bondingPeriod: BN, + unbondingPeriod: BN, + minServicePeriod: BN, + startupGracePeriod: BN, + entryRequestFee: BN + ): BN { + return this.estimateTxFee( + this.api.tx.proposalsCodex.createSetStorageRoleParametersProposal(stake, title, description, stake, [ + minStake, + minActors, + maxActors, + reward, + rewardPeriod, + bondingPeriod, + unbondingPeriod, + minServicePeriod, + startupGracePeriod, + entryRequestFee, + ]) + ); + } + + public estimateProposeElectionParametersFee( + title: string, + description: string, + stake: BN, + announcingPeriod: BN, + votingPeriod: BN, + revealingPeriod: BN, + councilSize: BN, + candidacyLimit: BN, + newTermDuration: BN, + minCouncilStake: BN, + minVotingStake: BN + ): BN { + return this.estimateTxFee( + this.api.tx.proposalsCodex.createSetElectionParametersProposal(stake, title, description, stake, [ + announcingPeriod, + votingPeriod, + revealingPeriod, + councilSize, + candidacyLimit, + newTermDuration, + minCouncilStake, + minVotingStake, + ]) + ); + } + public estimateVoteForProposalFee(): BN { return this.estimateTxFee(this.api.tx.proposalsEngine.vote(0, 0, 'Approve')); } @@ -212,6 +292,14 @@ export class ApiWrapper { ); } + public sudoSetCouncilMintCapacity(sudo: KeyringPair, capacity: BN): Promise { + return this.sender.signAndSend( + this.api.tx.sudo.sudo(this.api.tx.council.setCouncilMintCapacity(capacity)), + sudo, + false + ); + } + public getBestBlock(): Promise { return this.api.derive.chain.bestNumber(); } @@ -293,6 +381,128 @@ export class ApiWrapper { ); } + public async proposeValidatorCount( + account: KeyringPair, + title: string, + description: string, + stake: BN, + validatorCount: BN + ): Promise { + const memberId: BN = (await this.getMemberIds(account.address))[0].toBn(); + return this.sender.signAndSend( + this.api.tx.proposalsCodex.createSetValidatorCountProposal(memberId, title, description, stake, validatorCount), + account, + false + ); + } + + public async proposeLead( + account: KeyringPair, + title: string, + description: string, + stake: BN, + leadAccount: KeyringPair + ): Promise { + const memberId: BN = (await this.getMemberIds(account.address))[0].toBn(); + const leadMemberId: BN = (await this.getMemberIds(leadAccount.address))[0].toBn(); + const addressString: string = leadAccount.address; + return this.sender.signAndSend( + this.api.tx.proposalsCodex.createSetLeadProposal(memberId, title, description, stake, [ + leadMemberId, + addressString, + ]), + account, + false + ); + } + + public async proposeEvictStorageProvider( + account: KeyringPair, + title: string, + description: string, + stake: BN, + storageProvider: string + ): Promise { + const memberId: BN = (await this.getMemberIds(account.address))[0].toBn(); + return this.sender.signAndSend( + this.api.tx.proposalsCodex.createEvictStorageProviderProposal( + memberId, + title, + description, + stake, + storageProvider + ), + account, + false + ); + } + + public async proposeStorageRoleParameters( + account: KeyringPair, + title: string, + description: string, + stake: BN, + minStake: BN, + minActors: BN, + maxActors: BN, + reward: BN, + rewardPeriod: BN, + bondingPeriod: BN, + unbondingPeriod: BN, + minServicePeriod: BN, + startupGracePeriod: BN, + entryRequestFee: BN + ): Promise { + const memberId: BN = (await this.getMemberIds(account.address))[0].toBn(); + return this.sender.signAndSend( + this.api.tx.proposalsCodex.createSetStorageRoleParametersProposal(memberId, title, description, stake, [ + minStake, + minActors, + maxActors, + reward, + rewardPeriod, + bondingPeriod, + unbondingPeriod, + minServicePeriod, + startupGracePeriod, + entryRequestFee, + ]), + account, + false + ); + } + + public async proposeElectionParameters( + account: KeyringPair, + title: string, + description: string, + stake: BN, + announcingPeriod: BN, + votingPeriod: BN, + revealingPeriod: BN, + councilSize: BN, + candidacyLimit: BN, + newTermDuration: BN, + minCouncilStake: BN, + minVotingStake: BN + ): Promise { + const memberId: BN = (await this.getMemberIds(account.address))[0].toBn(); + return this.sender.signAndSend( + this.api.tx.proposalsCodex.createSetElectionParametersProposal(memberId, title, description, stake, [ + announcingPeriod, + votingPeriod, + revealingPeriod, + councilSize, + candidacyLimit, + newTermDuration, + minCouncilStake, + minVotingStake, + ]), + account, + false + ); + } + public approveProposal(account: KeyringPair, memberId: BN, proposal: BN): Promise { return this.sender.signAndSend(this.api.tx.proposalsEngine.vote(memberId, proposal, 'Approve'), account, false); } @@ -354,11 +564,6 @@ export class ApiWrapper { return this.api.query.balances.totalIssuance(); } - public async getProposal(id: BN) { - const proposal = await this.api.query.proposalsEngine.proposals(id); - return; - } - public async getRequiredProposalStake(numerator: number, denominator: number): Promise { const issuance: number = await (await this.getTotalIssuance()).toNumber(); const stake = (issuance * numerator) / denominator; @@ -368,4 +573,72 @@ export class ApiWrapper { public getProposalCount(): Promise { return this.api.query.proposalsEngine.proposalCount(); } + + public async getWorkingGroupMintCapacity(): Promise { + const mintId: MintId = await this.api.query.contentWorkingGroup.mint(); + const mintCodec = await this.api.query.minting.mints(mintId); + const mint: Mint = (mintCodec[0] as unknown) as Mint; + return mint.getField('capacity'); + } + + public getValidatorCount(): Promise { + return this.api.query.staking.validatorCount(); + } + + public async getCurrentLeadAddress(): Promise { + const leadId: Option = await this.api.query.contentWorkingGroup.currentLeadId>(); + const leadCodec = await this.api.query.contentWorkingGroup.leadById(leadId.unwrap()); + const lead = (leadCodec[0] as unknown) as Lead; + return lead.role_account.toString(); + } + + public async createStorageProvider(account: KeyringPair): Promise { + const memberId: BN = (await this.getMemberIds(account.address))[0].toBn(); + await this.sender.signAndSend(this.api.tx.actors.roleEntryRequest('StorageProvider', memberId), account, false); + await this.sender.signAndSend(this.api.tx.actors.stake('StorageProvider', account.address), account, false); + return; + } + + public async isStorageProvider(address: string): Promise { + const storageProviders: Vec = await this.api.query.actors.accountIdsByRole>( + 'StorageProvider' + ); + return storageProviders.map(accountId => accountId.toString()).includes(address); + } + + public async getStorageRoleParameters(): Promise { + return (await this.api.query.actors.parameters>('StorageProvider')).unwrap(); + } + + public async getAnnouncingPeriod(): Promise { + return await this.api.query.councilElection.announcingPeriod(); + } + + public async getVotingPeriod(): Promise { + return await this.api.query.councilElection.votingPeriod(); + } + + public async getRevealingPeriod(): Promise { + return await this.api.query.councilElection.revealingPeriod(); + } + + public async getCouncilSize(): Promise { + return await this.api.query.councilElection.councilSize(); + } + + public async getCandidacyLimit(): Promise { + return await this.api.query.councilElection.candidacyLimit(); + } + + public async getNewTermDuration(): Promise { + return await this.api.query.councilElection.newTermDuration(); + } + + public async getMinCouncilStake(): Promise { + return await this.api.query.councilElection.minCouncilStake(); + } + + public async getMinVotingStake(): Promise { + return await this.api.query.councilElection.minVotingStake(); + } } diff --git a/tests/network-tests/src/tests/constantinople/utils/config.ts b/tests/network-tests/src/constantinople/utils/config.ts similarity index 100% rename from tests/network-tests/src/tests/constantinople/utils/config.ts rename to tests/network-tests/src/constantinople/utils/config.ts diff --git a/tests/network-tests/src/tests/rome/utils/sender.ts b/tests/network-tests/src/constantinople/utils/sender.ts similarity index 98% rename from tests/network-tests/src/tests/rome/utils/sender.ts rename to tests/network-tests/src/constantinople/utils/sender.ts index b8e1c15499..eb2600ebed 100644 --- a/tests/network-tests/src/tests/rome/utils/sender.ts +++ b/tests/network-tests/src/constantinople/utils/sender.ts @@ -1,4 +1,4 @@ -import BN = require('bn.js'); +import BN from 'bn.js'; import { ApiPromise } from '@polkadot/api'; import { Index } from '@polkadot/types/interfaces'; import { SubmittableExtrinsic } from '@polkadot/api/types'; diff --git a/tests/network-tests/src/tests/constantinople/utils/utils.ts b/tests/network-tests/src/constantinople/utils/utils.ts similarity index 92% rename from tests/network-tests/src/tests/constantinople/utils/utils.ts rename to tests/network-tests/src/constantinople/utils/utils.ts index 70b699cf21..62ae48eaa1 100644 --- a/tests/network-tests/src/tests/constantinople/utils/utils.ts +++ b/tests/network-tests/src/constantinople/utils/utils.ts @@ -1,11 +1,10 @@ import { IExtrinsic } from '@polkadot/types/types'; -import { Bytes } from '@polkadot/types'; import { compactToU8a, stringToU8a } from '@polkadot/util'; import { blake2AsHex } from '@polkadot/util-crypto'; -import BN = require('bn.js'); -import fs = require('fs'); +import BN from 'bn.js'; +import fs from 'fs'; import { decodeAddress } from '@polkadot/keyring'; -import { Seat } from '@joystream/types/'; +import { Seat } from '@constantinople/types'; export class Utils { private static LENGTH_ADDRESS = 32 + 1; // publicKey + prefix diff --git a/tests/network-tests/src/rome/tap-parallel-not-ok b/tests/network-tests/src/rome/tap-parallel-not-ok new file mode 100644 index 0000000000..e69de29bb2 diff --git a/tests/network-tests/src/rome/tests/electingCouncilTest.ts b/tests/network-tests/src/rome/tests/electingCouncilTest.ts new file mode 100644 index 0000000000..e09b743c24 --- /dev/null +++ b/tests/network-tests/src/rome/tests/electingCouncilTest.ts @@ -0,0 +1,27 @@ +import { KeyringPair } from '@polkadot/keyring/types'; +import { membershipTest } from './impl/membershipCreation'; +import { councilTest } from './impl/electingCouncil'; +import { initConfig } from '../utils/config'; +import { Keyring } from '@polkadot/api'; +import BN from 'bn.js'; +import { setTimeout } from './impl/setTimeout'; + +initConfig(); + +const m1KeyPairs: KeyringPair[] = new Array(); +const m2KeyPairs: KeyringPair[] = new Array(); + +const keyring = new Keyring({ type: 'sr25519' }); +const N: number = +process.env.MEMBERSHIP_CREATION_N!; +const paidTerms: number = +process.env.MEMBERSHIP_PAID_TERMS!; +const nodeUrl: string = process.env.NODE_URL!; +const sudoUri: string = process.env.SUDO_ACCOUNT_URI!; +const K: number = +process.env.COUNCIL_ELECTION_K!; +const greaterStake: BN = new BN(+process.env.COUNCIL_STAKE_GREATER_AMOUNT!); +const lesserStake: BN = new BN(+process.env.COUNCIL_STAKE_LESSER_AMOUNT!); +const durationInBlocks: number = 25; + +setTimeout(nodeUrl, durationInBlocks); +membershipTest(m1KeyPairs, keyring, N, paidTerms, nodeUrl, sudoUri); +membershipTest(m2KeyPairs, keyring, N, paidTerms, nodeUrl, sudoUri); +councilTest(m1KeyPairs, m2KeyPairs, keyring, K, nodeUrl, sudoUri, greaterStake, lesserStake); diff --git a/tests/network-tests/src/tests/rome/electingCouncilTest.ts b/tests/network-tests/src/rome/tests/impl/electingCouncil.ts similarity index 78% rename from tests/network-tests/src/tests/rome/electingCouncilTest.ts rename to tests/network-tests/src/rome/tests/impl/electingCouncil.ts index e4d901f5e8..5b4dbaf006 100644 --- a/tests/network-tests/src/tests/rome/electingCouncilTest.ts +++ b/tests/network-tests/src/rome/tests/impl/electingCouncil.ts @@ -1,34 +1,33 @@ -import { membershipTest } from './membershipCreationTest'; import { KeyringPair } from '@polkadot/keyring/types'; -import { ApiWrapper } from './utils/apiWrapper'; +import { ApiWrapper } from '../../utils/apiWrapper'; import { WsProvider, Keyring } from '@polkadot/api'; -import { initConfig } from './utils/config'; -import BN = require('bn.js'); +import BN from 'bn.js'; import { registerJoystreamTypes, Seat } from '@rome/types'; import { assert } from 'chai'; import { v4 as uuid } from 'uuid'; -import { Utils } from './utils/utils'; +import { Utils } from '../../utils/utils'; +import tap from 'tap'; -export function councilTest(m1KeyPairs: KeyringPair[], m2KeyPairs: KeyringPair[]) { - initConfig(); - const keyring = new Keyring({ type: 'sr25519' }); - const nodeUrl: string = process.env.NODE_URL!; - const sudoUri: string = process.env.SUDO_ACCOUNT_URI!; - const K: number = +process.env.COUNCIL_ELECTION_K!; - const greaterStake: BN = new BN(+process.env.COUNCIL_STAKE_GREATER_AMOUNT!); - const lesserStake: BN = new BN(+process.env.COUNCIL_STAKE_LESSER_AMOUNT!); - const defaultTimeout: number = 120000; +export function councilTest( + m1KeyPairs: KeyringPair[], + m2KeyPairs: KeyringPair[], + keyring: Keyring, + K: number, + nodeUrl: string, + sudoUri: string, + greaterStake: BN, + lesserStake: BN +) { let sudo: KeyringPair; let apiWrapper: ApiWrapper; - before(async function () { - this.timeout(defaultTimeout); + tap.test('Electing council test setup', async () => { registerJoystreamTypes(); const provider = new WsProvider(nodeUrl); apiWrapper = await ApiWrapper.create(provider); }); - it('Electing a council test', async () => { + tap.test('Electing a council test', async () => { // Setup goes here because M keypairs are generated after before() function sudo = keyring.addFromUri(sudoUri); let now = await apiWrapper.getBestBlock(); @@ -111,17 +110,9 @@ export function councilTest(m1KeyPairs: KeyringPair[], m2KeyPairs: KeyringPair[] `Member ${seat.member} has unexpected stake ${Utils.getTotalStake(seat)}` ) ); - }).timeout(defaultTimeout); + }); - after(() => { + tap.teardown(() => { apiWrapper.close(); }); } - -describe.skip('Council integration tests', () => { - const m1KeyPairs: KeyringPair[] = new Array(); - const m2KeyPairs: KeyringPair[] = new Array(); - membershipTest(m1KeyPairs); - membershipTest(m2KeyPairs); - councilTest(m1KeyPairs, m2KeyPairs); -}); diff --git a/tests/network-tests/src/tests/rome/membershipCreationTest.ts b/tests/network-tests/src/rome/tests/impl/membershipCreation.ts similarity index 71% rename from tests/network-tests/src/tests/rome/membershipCreationTest.ts rename to tests/network-tests/src/rome/tests/impl/membershipCreation.ts index b96e2b0418..a00d8a4504 100644 --- a/tests/network-tests/src/tests/rome/membershipCreationTest.ts +++ b/tests/network-tests/src/rome/tests/impl/membershipCreation.ts @@ -3,27 +3,26 @@ import { registerJoystreamTypes } from '@rome/types'; import { Keyring } from '@polkadot/keyring'; import { assert } from 'chai'; import { KeyringPair } from '@polkadot/keyring/types'; -import BN = require('bn.js'); -import { ApiWrapper } from './utils/apiWrapper'; -import { initConfig } from './utils/config'; +import BN from 'bn.js'; +import { ApiWrapper } from '../../utils/apiWrapper'; import { v4 as uuid } from 'uuid'; +import tap from 'tap'; -export function membershipTest(nKeyPairs: KeyringPair[]) { - initConfig(); - const keyring = new Keyring({ type: 'sr25519' }); - const N: number = +process.env.MEMBERSHIP_CREATION_N!; - const paidTerms: number = +process.env.MEMBERSHIP_PAID_TERMS!; - const nodeUrl: string = process.env.NODE_URL!; - const sudoUri: string = process.env.SUDO_ACCOUNT_URI!; - const defaultTimeout: number = 30000; +export function membershipTest( + nKeyPairs: KeyringPair[], + keyring: Keyring, + N: number, + paidTerms: number, + nodeUrl: string, + sudoUri: string +) { let apiWrapper: ApiWrapper; let sudo: KeyringPair; let aKeyPair: KeyringPair; let membershipFee: BN; let membershipTransactionFee: BN; - before(async function () { - this.timeout(defaultTimeout); + tap.test('Membership creation test setup', async () => { registerJoystreamTypes(); const provider = new WsProvider(nodeUrl); apiWrapper = await ApiWrapper.create(provider); @@ -42,7 +41,7 @@ export function membershipTest(nKeyPairs: KeyringPair[]) { await apiWrapper.transferBalance(sudo, aKeyPair.address, membershipTransactionFee); }); - it('Buy membeship is accepted with sufficient funds', async () => { + tap.test('Buy membeship is accepted with sufficient funds', async () => { await Promise.all( nKeyPairs.map(async (keyPair, index) => { await apiWrapper.buyMembership(keyPair, paidTerms, `new_member_${index}${keyPair.address.substring(0, 8)}`); @@ -53,9 +52,9 @@ export function membershipTest(nKeyPairs: KeyringPair[]) { .getMemberIds(keyPair.address) .then(membership => assert(membership.length > 0, `Account ${keyPair.address} is not a member`)) ); - }).timeout(defaultTimeout); + }); - it('Account A can not buy the membership with insufficient funds', async () => { + tap.test('Account A can not buy the membership with insufficient funds', async () => { await apiWrapper .getBalance(aKeyPair.address) .then(balance => @@ -68,9 +67,9 @@ export function membershipTest(nKeyPairs: KeyringPair[]) { apiWrapper .getMemberIds(aKeyPair.address) .then(membership => assert(membership.length === 0, 'Account A is a member')); - }).timeout(defaultTimeout); + }); - it('Account A was able to buy the membership with sufficient funds', async () => { + tap.test('Account A was able to buy the membership with sufficient funds', async () => { await apiWrapper.transferBalance(sudo, aKeyPair.address, membershipFee.add(membershipTransactionFee)); apiWrapper .getBalance(aKeyPair.address) @@ -81,14 +80,9 @@ export function membershipTest(nKeyPairs: KeyringPair[]) { apiWrapper .getMemberIds(aKeyPair.address) .then(membership => assert(membership.length > 0, 'Account A is a not member')); - }).timeout(defaultTimeout); + }); - after(() => { + tap.teardown(() => { apiWrapper.close(); }); } - -describe.skip('Membership integration tests', () => { - const nKeyPairs: KeyringPair[] = new Array(); - membershipTest(nKeyPairs); -}); diff --git a/tests/network-tests/src/tests/rome/romeRuntimeUpgradeTest.ts b/tests/network-tests/src/rome/tests/impl/romeRuntimeUpgrade.ts similarity index 57% rename from tests/network-tests/src/tests/rome/romeRuntimeUpgradeTest.ts rename to tests/network-tests/src/rome/tests/impl/romeRuntimeUpgrade.ts index 1ed8c7c8af..0984e7e5d8 100644 --- a/tests/network-tests/src/tests/rome/romeRuntimeUpgradeTest.ts +++ b/tests/network-tests/src/rome/tests/impl/romeRuntimeUpgrade.ts @@ -1,41 +1,30 @@ -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 '@rome/types'; -import { ApiWrapper } from './utils/apiWrapper'; -import BN = require('bn.js'); -import { Utils } from './utils/utils'; - -describe('Runtime upgrade integration tests', () => { - initConfig(); - const keyring = new Keyring({ type: 'sr25519' }); - const nodeUrl: string = process.env.NODE_URL!; - const sudoUri: string = process.env.SUDO_ACCOUNT_URI!; - const proposalStake: BN = new BN(+process.env.RUNTIME_UPGRADE_PROPOSAL_STAKE!); - const runtimePath: string = process.env.RUNTIME_WASM_PATH!; - const defaultTimeout: number = 180000; - - const m1KeyPairs: KeyringPair[] = new Array(); - const m2KeyPairs: KeyringPair[] = new Array(); +import { ApiWrapper } from '../../utils/apiWrapper'; +import BN from 'bn.js'; +import { Utils } from '../../utils/utils'; +import tap from 'tap'; +export function romeRuntimeUpgradeTest( + m1KeyPairs: KeyringPair[], + m2KeyPairs: KeyringPair[], + keyring: Keyring, + nodeUrl: string, + sudoUri: string, + proposalStake: BN, + runtimePath: string +) { let apiWrapper: ApiWrapper; let sudo: KeyringPair; - let provider: WsProvider; - before(async function () { - this.timeout(defaultTimeout); + tap.test('Rome runtime upgrade test setup', async () => { registerJoystreamTypes(); - provider = new WsProvider(nodeUrl); + const provider = new WsProvider(nodeUrl); apiWrapper = await ApiWrapper.create(provider); }); - membershipTest(m1KeyPairs); - membershipTest(m2KeyPairs); - councilTest(m1KeyPairs, m2KeyPairs); - - it('Upgrading the runtime test', async () => { + tap.test('Upgrading the runtime test', async () => { // Setup sudo = keyring.addFromUri(sudoUri); const runtime: string = Utils.readRuntimeFromFile(runtimePath); @@ -67,9 +56,9 @@ describe('Runtime upgrade integration tests', () => { const runtimePromise = apiWrapper.expectRuntimeUpgraded(); await apiWrapper.batchApproveProposal(m2KeyPairs, proposalNumber); await runtimePromise; - }).timeout(defaultTimeout); + }); - after(() => { + tap.teardown(() => { apiWrapper.close(); }); -}); +} diff --git a/tests/network-tests/src/rome/tests/impl/setTimeout.ts b/tests/network-tests/src/rome/tests/impl/setTimeout.ts new file mode 100644 index 0000000000..f03ae96b0d --- /dev/null +++ b/tests/network-tests/src/rome/tests/impl/setTimeout.ts @@ -0,0 +1,20 @@ +import tap from 'tap'; +import { ApiWrapper } from '../../utils/apiWrapper'; +import { WsProvider } from '@polkadot/api'; +import { registerJoystreamTypes } from '@rome/types'; + +export function setTimeout(nodeUrl: string, durationInBlocks: number) { + let apiWrapper: ApiWrapper; + registerJoystreamTypes(); + + tap.test('retrieving time necessary for the test', async () => { + const provider = new WsProvider(nodeUrl); + apiWrapper = await ApiWrapper.create(provider); + const durationInMillis = (await apiWrapper.getBlockDuration()).muln(durationInBlocks).toNumber(); + tap.setTimeout(durationInMillis); + }); + + tap.teardown(() => { + apiWrapper.close(); + }); +} diff --git a/tests/network-tests/src/rome/tests/membershipCreationTest.ts b/tests/network-tests/src/rome/tests/membershipCreationTest.ts new file mode 100644 index 0000000000..7c83f1b98e --- /dev/null +++ b/tests/network-tests/src/rome/tests/membershipCreationTest.ts @@ -0,0 +1,19 @@ +import { KeyringPair } from '@polkadot/keyring/types'; +import { membershipTest } from './impl/membershipCreation'; +import { Keyring } from '@polkadot/api'; +import { initConfig } from '../utils/config'; +import { setTimeout } from './impl/setTimeout'; + +initConfig(); + +const nKeyPairs: KeyringPair[] = new Array(); + +const keyring = new Keyring({ type: 'sr25519' }); +const N: number = +process.env.MEMBERSHIP_CREATION_N!; +const paidTerms: number = +process.env.MEMBERSHIP_PAID_TERMS!; +const nodeUrl: string = process.env.NODE_URL!; +const sudoUri: string = process.env.SUDO_ACCOUNT_URI!; +const durationInBlocks: number = 7; + +setTimeout(nodeUrl, durationInBlocks); +membershipTest(nKeyPairs, keyring, N, paidTerms, nodeUrl, sudoUri); diff --git a/tests/network-tests/src/rome/tests/romeRuntimeUpgradeTest.ts b/tests/network-tests/src/rome/tests/romeRuntimeUpgradeTest.ts new file mode 100644 index 0000000000..b00c5c9b6c --- /dev/null +++ b/tests/network-tests/src/rome/tests/romeRuntimeUpgradeTest.ts @@ -0,0 +1,31 @@ +import { KeyringPair } from '@polkadot/keyring/types'; +import { membershipTest } from './impl/membershipCreation'; +import { councilTest } from './impl/electingCouncil'; +import { romeRuntimeUpgradeTest } from './impl/romeRuntimeUpgrade'; +import { initConfig } from '../utils/config'; +import { Keyring } from '@polkadot/api'; +import BN from 'bn.js'; +import { setTimeout } from './impl/setTimeout'; + +initConfig(); + +const m1KeyPairs: KeyringPair[] = new Array(); +const m2KeyPairs: KeyringPair[] = new Array(); + +const keyring = new Keyring({ type: 'sr25519' }); +const N: number = +process.env.MEMBERSHIP_CREATION_N!; +const paidTerms: number = +process.env.MEMBERSHIP_PAID_TERMS!; +const nodeUrl: string = process.env.NODE_URL!; +const sudoUri: string = process.env.SUDO_ACCOUNT_URI!; +const K: number = +process.env.COUNCIL_ELECTION_K!; +const greaterStake: BN = new BN(+process.env.COUNCIL_STAKE_GREATER_AMOUNT!); +const lesserStake: BN = new BN(+process.env.COUNCIL_STAKE_LESSER_AMOUNT!); +const proposalStake: BN = new BN(+process.env.RUNTIME_UPGRADE_PROPOSAL_STAKE!); +const runtimePath: string = process.env.RUNTIME_WASM_PATH!; +const durationInBlocks: number = 30; + +setTimeout(nodeUrl, durationInBlocks); +membershipTest(m1KeyPairs, keyring, N, paidTerms, nodeUrl, sudoUri); +membershipTest(m2KeyPairs, keyring, N, paidTerms, nodeUrl, sudoUri); +councilTest(m1KeyPairs, m2KeyPairs, keyring, K, nodeUrl, sudoUri, greaterStake, lesserStake); +romeRuntimeUpgradeTest(m1KeyPairs, m2KeyPairs, keyring, nodeUrl, sudoUri, proposalStake, runtimePath); diff --git a/tests/network-tests/src/tests/rome/utils/apiWrapper.ts b/tests/network-tests/src/rome/utils/apiWrapper.ts similarity index 99% rename from tests/network-tests/src/tests/rome/utils/apiWrapper.ts rename to tests/network-tests/src/rome/utils/apiWrapper.ts index 983908fc7d..df8a2d462c 100644 --- a/tests/network-tests/src/tests/rome/utils/apiWrapper.ts +++ b/tests/network-tests/src/rome/utils/apiWrapper.ts @@ -5,7 +5,7 @@ import { KeyringPair } from '@polkadot/keyring/types'; import { UserInfo, PaidMembershipTerms, MemberId } from '@rome/types/lib/members'; import { Seat, VoteKind } from '@rome/types'; import { Balance, EventRecord } from '@polkadot/types/interfaces'; -import BN = require('bn.js'); +import BN from 'bn.js'; import { SubmittableExtrinsic } from '@polkadot/api/types'; import { Sender } from './sender'; import { Utils } from './utils'; diff --git a/tests/network-tests/src/tests/rome/utils/config.ts b/tests/network-tests/src/rome/utils/config.ts similarity index 100% rename from tests/network-tests/src/tests/rome/utils/config.ts rename to tests/network-tests/src/rome/utils/config.ts diff --git a/tests/network-tests/src/tests/constantinople/utils/sender.ts b/tests/network-tests/src/rome/utils/sender.ts similarity index 98% rename from tests/network-tests/src/tests/constantinople/utils/sender.ts rename to tests/network-tests/src/rome/utils/sender.ts index b8e1c15499..eb2600ebed 100644 --- a/tests/network-tests/src/tests/constantinople/utils/sender.ts +++ b/tests/network-tests/src/rome/utils/sender.ts @@ -1,4 +1,4 @@ -import BN = require('bn.js'); +import BN from 'bn.js'; import { ApiPromise } from '@polkadot/api'; import { Index } from '@polkadot/types/interfaces'; import { SubmittableExtrinsic } from '@polkadot/api/types'; diff --git a/tests/network-tests/src/tests/rome/utils/utils.ts b/tests/network-tests/src/rome/utils/utils.ts similarity index 96% rename from tests/network-tests/src/tests/rome/utils/utils.ts rename to tests/network-tests/src/rome/utils/utils.ts index 1e646ad025..e08436a155 100644 --- a/tests/network-tests/src/tests/rome/utils/utils.ts +++ b/tests/network-tests/src/rome/utils/utils.ts @@ -1,8 +1,8 @@ import { IExtrinsic } from '@polkadot/types/types'; import { compactToU8a, stringToU8a, u8aToHex } from '@polkadot/util'; import { blake2AsHex } from '@polkadot/util-crypto'; -import BN = require('bn.js'); -import fs = require('fs'); +import BN from 'bn.js'; +import fs from 'fs'; import { decodeAddress } from '@polkadot/keyring'; import { Seat } from '@rome/types'; diff --git a/yarn.lock b/yarn.lock index 3feaf0d963..38e01f0ec0 100644 --- a/yarn.lock +++ b/yarn.lock @@ -25,6 +25,13 @@ dependencies: "@babel/highlight" "^7.0.0" +"@babel/code-frame@^7.10.1": + version "7.10.1" + resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.10.1.tgz#d5481c5095daa1c57e16e54c6f9198443afb49ff" + integrity sha512-IGhtTmpjGbYzcEDOw7DcQtbQSXcG9ftmAXtWTu9V936vDye4xjjekktFAtgZsWpzTj/X01jocB46mTywm/4SZw== + dependencies: + "@babel/highlight" "^7.10.1" + "@babel/core@7.6.0": version "7.6.0" resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.6.0.tgz#9b00f73554edd67bebc86df8303ef678be3d7b48" @@ -65,6 +72,38 @@ semver "^5.4.1" source-map "^0.5.0" +"@babel/core@^7.5.5": + version "7.10.1" + resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.10.1.tgz#2a0ad0ea693601820defebad2140206503d89af3" + integrity sha512-u8XiZ6sMXW/gPmoP5ijonSUln4unazG291X0XAQ5h0s8qnAFr6BRRZGUEK+jtRWdmB0NTJQt7Uga25q8GetIIg== + dependencies: + "@babel/code-frame" "^7.10.1" + "@babel/generator" "^7.10.1" + "@babel/helper-module-transforms" "^7.10.1" + "@babel/helpers" "^7.10.1" + "@babel/parser" "^7.10.1" + "@babel/template" "^7.10.1" + "@babel/traverse" "^7.10.1" + "@babel/types" "^7.10.1" + convert-source-map "^1.7.0" + debug "^4.1.0" + gensync "^1.0.0-beta.1" + json5 "^2.1.2" + lodash "^4.17.13" + resolve "^1.3.2" + semver "^5.4.1" + source-map "^0.5.0" + +"@babel/generator@^7.10.1": + version "7.10.1" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.10.1.tgz#4d14458e539bcb04ffe34124143f5c489f2dbca9" + integrity sha512-AT0YPLQw9DI21tliuJIdplVfLHya6mcGa8ctkv7n4Qv+hYacJrKmNWIteAK1P9iyLikFIAkwqJ7HAOqIDLFfgA== + dependencies: + "@babel/types" "^7.10.1" + jsesc "^2.5.1" + lodash "^4.17.13" + source-map "^0.5.0" + "@babel/generator@^7.4.0", "@babel/generator@^7.6.0", "@babel/generator@^7.7.4": version "7.7.4" resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.7.4.tgz#db651e2840ca9aa66f327dcec1dc5f5fa9611369" @@ -82,6 +121,13 @@ dependencies: "@babel/types" "^7.7.4" +"@babel/helper-annotate-as-pure@^7.10.1": + version "7.10.1" + resolved "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.10.1.tgz#f6d08acc6f70bbd59b436262553fb2e259a1a268" + integrity sha512-ewp3rvJEwLaHgyWGe4wQssC2vjks3E80WiUe2BpMb0KhreTjMROCbxXcEovTrbeGVdQct5VjQfrv9EgC+xMzCw== + dependencies: + "@babel/types" "^7.10.1" + "@babel/helper-builder-binary-assignment-operator-visitor@^7.7.4": version "7.7.4" resolved "https://registry.yarnpkg.com/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.7.4.tgz#5f73f2b28580e224b5b9bd03146a4015d6217f5f" @@ -90,6 +136,23 @@ "@babel/helper-explode-assignable-expression" "^7.7.4" "@babel/types" "^7.7.4" +"@babel/helper-builder-react-jsx-experimental@^7.10.1": + version "7.10.1" + resolved "https://registry.yarnpkg.com/@babel/helper-builder-react-jsx-experimental/-/helper-builder-react-jsx-experimental-7.10.1.tgz#9a7d58ad184d3ac3bafb1a452cec2bad7e4a0bc8" + integrity sha512-irQJ8kpQUV3JasXPSFQ+LCCtJSc5ceZrPFVj6TElR6XCHssi3jV8ch3odIrNtjJFRZZVbrOEfJMI79TPU/h1pQ== + dependencies: + "@babel/helper-annotate-as-pure" "^7.10.1" + "@babel/helper-module-imports" "^7.10.1" + "@babel/types" "^7.10.1" + +"@babel/helper-builder-react-jsx@^7.10.1": + version "7.10.1" + resolved "https://registry.yarnpkg.com/@babel/helper-builder-react-jsx/-/helper-builder-react-jsx-7.10.1.tgz#a327f0cf983af5554701b1215de54a019f09b532" + integrity sha512-KXzzpyWhXgzjXIlJU1ZjIXzUPdej1suE6vzqgImZ/cpAsR/CC8gUcX4EWRmDfWz/cs6HOCPMBIJ3nKoXt3BFuw== + dependencies: + "@babel/helper-annotate-as-pure" "^7.10.1" + "@babel/types" "^7.10.1" + "@babel/helper-builder-react-jsx@^7.7.4": version "7.7.4" resolved "https://registry.yarnpkg.com/@babel/helper-builder-react-jsx/-/helper-builder-react-jsx-7.7.4.tgz#da188d247508b65375b2c30cf59de187be6b0c66" @@ -144,6 +207,15 @@ "@babel/traverse" "^7.7.4" "@babel/types" "^7.7.4" +"@babel/helper-function-name@^7.10.1": + version "7.10.1" + resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.10.1.tgz#92bd63829bfc9215aca9d9defa85f56b539454f4" + integrity sha512-fcpumwhs3YyZ/ttd5Rz0xn0TpIwVkN7X0V38B9TWNfVF42KEkhkAAuPCQ3oXmtTRtiPJrmZ0TrfS0GKF0eMaRQ== + dependencies: + "@babel/helper-get-function-arity" "^7.10.1" + "@babel/template" "^7.10.1" + "@babel/types" "^7.10.1" + "@babel/helper-function-name@^7.7.4": version "7.7.4" resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.7.4.tgz#ab6e041e7135d436d8f0a3eca15de5b67a341a2e" @@ -153,6 +225,13 @@ "@babel/template" "^7.7.4" "@babel/types" "^7.7.4" +"@babel/helper-get-function-arity@^7.10.1": + version "7.10.1" + resolved "https://registry.yarnpkg.com/@babel/helper-get-function-arity/-/helper-get-function-arity-7.10.1.tgz#7303390a81ba7cb59613895a192b93850e373f7d" + integrity sha512-F5qdXkYGOQUb0hpRaPoetF9AnsXknKjWMZ+wmsIRsp5ge5sFh4c3h1eH2pRTTuy9KKAA2+TTYomGXAtEL2fQEw== + dependencies: + "@babel/types" "^7.10.1" + "@babel/helper-get-function-arity@^7.7.4": version "7.7.4" resolved "https://registry.yarnpkg.com/@babel/helper-get-function-arity/-/helper-get-function-arity-7.7.4.tgz#cb46348d2f8808e632f0ab048172130e636005f0" @@ -167,6 +246,13 @@ dependencies: "@babel/types" "^7.7.4" +"@babel/helper-member-expression-to-functions@^7.10.1": + version "7.10.1" + resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.10.1.tgz#432967fd7e12a4afef66c4687d4ca22bc0456f15" + integrity sha512-u7XLXeM2n50gb6PWJ9hoO5oO7JFPaZtrh35t8RqKLT1jFKj9IWeD1zrcrYp1q1qiZTdEarfDWfTIP8nGsu0h5g== + dependencies: + "@babel/types" "^7.10.1" + "@babel/helper-member-expression-to-functions@^7.7.4": version "7.7.4" resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.7.4.tgz#356438e2569df7321a8326644d4b790d2122cb74" @@ -181,6 +267,26 @@ dependencies: "@babel/types" "^7.7.4" +"@babel/helper-module-imports@^7.10.1": + version "7.10.1" + resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.10.1.tgz#dd331bd45bccc566ce77004e9d05fe17add13876" + integrity sha512-SFxgwYmZ3HZPyZwJRiVNLRHWuW2OgE5k2nrVs6D9Iv4PPnXVffuEHy83Sfx/l4SqF+5kyJXjAyUmrG7tNm+qVg== + dependencies: + "@babel/types" "^7.10.1" + +"@babel/helper-module-transforms@^7.10.1": + version "7.10.1" + resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.10.1.tgz#24e2f08ee6832c60b157bb0936c86bef7210c622" + integrity sha512-RLHRCAzyJe7Q7sF4oy2cB+kRnU4wDZY/H2xJFGof+M+SJEGhZsb+GFj5j1AD8NiSaVBJ+Pf0/WObiXu/zxWpFg== + dependencies: + "@babel/helper-module-imports" "^7.10.1" + "@babel/helper-replace-supers" "^7.10.1" + "@babel/helper-simple-access" "^7.10.1" + "@babel/helper-split-export-declaration" "^7.10.1" + "@babel/template" "^7.10.1" + "@babel/types" "^7.10.1" + lodash "^4.17.13" + "@babel/helper-module-transforms@^7.7.4": version "7.7.4" resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.7.4.tgz#8d7cdb1e1f8ea3d8c38b067345924ac4f8e0879a" @@ -193,6 +299,13 @@ "@babel/types" "^7.7.4" lodash "^4.17.13" +"@babel/helper-optimise-call-expression@^7.10.1": + version "7.10.1" + resolved "https://registry.yarnpkg.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.10.1.tgz#b4a1f2561870ce1247ceddb02a3860fa96d72543" + integrity sha512-a0DjNS1prnBsoKx83dP2falChcs7p3i8VMzdrSbfLhuQra/2ENC4sbri34dz/rWmDADsmF1q5GbfaXydh0Jbjg== + dependencies: + "@babel/types" "^7.10.1" + "@babel/helper-optimise-call-expression@^7.7.4": version "7.7.4" resolved "https://registry.yarnpkg.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.7.4.tgz#034af31370d2995242aa4df402c3b7794b2dcdf2" @@ -205,6 +318,11 @@ resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.0.0.tgz#bbb3fbee98661c569034237cc03967ba99b4f250" integrity sha512-CYAOUCARwExnEixLdB6sDm2dIJ/YgEAKDM1MOeMeZu9Ld/bDgVo8aiWrXwcY7OBh+1Ea2uUcVRcxKk0GJvW7QA== +"@babel/helper-plugin-utils@^7.10.1": + version "7.10.1" + resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.1.tgz#ec5a5cf0eec925b66c60580328b122c01230a127" + integrity sha512-fvoGeXt0bJc7VMWZGCAEBEMo/HAjW2mP8apF5eXK0wSqwLAVHAISCWRoLMBMUs2kqeaG77jltVqu4Hn8Egl3nA== + "@babel/helper-regex@^7.0.0", "@babel/helper-regex@^7.4.4": version "7.5.5" resolved "https://registry.yarnpkg.com/@babel/helper-regex/-/helper-regex-7.5.5.tgz#0aa6824f7100a2e0e89c1527c23936c152cab351" @@ -223,6 +341,16 @@ "@babel/traverse" "^7.7.4" "@babel/types" "^7.7.4" +"@babel/helper-replace-supers@^7.10.1": + version "7.10.1" + resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.10.1.tgz#ec6859d20c5d8087f6a2dc4e014db7228975f13d" + integrity sha512-SOwJzEfpuQwInzzQJGjGaiG578UYmyi2Xw668klPWV5n07B73S0a9btjLk/52Mlcxa+5AdIYqws1KyXRfMoB7A== + dependencies: + "@babel/helper-member-expression-to-functions" "^7.10.1" + "@babel/helper-optimise-call-expression" "^7.10.1" + "@babel/traverse" "^7.10.1" + "@babel/types" "^7.10.1" + "@babel/helper-replace-supers@^7.7.4": version "7.7.4" resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.7.4.tgz#3c881a6a6a7571275a72d82e6107126ec9e2cdd2" @@ -233,6 +361,14 @@ "@babel/traverse" "^7.7.4" "@babel/types" "^7.7.4" +"@babel/helper-simple-access@^7.10.1": + version "7.10.1" + resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.10.1.tgz#08fb7e22ace9eb8326f7e3920a1c2052f13d851e" + integrity sha512-VSWpWzRzn9VtgMJBIWTZ+GP107kZdQ4YplJlCmIrjoLVSi/0upixezHCDG8kpPVTBJpKfxTH01wDhh+jS2zKbw== + dependencies: + "@babel/template" "^7.10.1" + "@babel/types" "^7.10.1" + "@babel/helper-simple-access@^7.7.4": version "7.7.4" resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.7.4.tgz#a169a0adb1b5f418cfc19f22586b2ebf58a9a294" @@ -241,6 +377,13 @@ "@babel/template" "^7.7.4" "@babel/types" "^7.7.4" +"@babel/helper-split-export-declaration@^7.10.1": + version "7.10.1" + resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.10.1.tgz#c6f4be1cbc15e3a868e4c64a17d5d31d754da35f" + integrity sha512-UQ1LVBPrYdbchNhLwj6fetj46BcFwfS4NllJo/1aJsT+1dLTEnXJL0qHqtY7gPzF8S2fXBJamf1biAXV3X077g== + dependencies: + "@babel/types" "^7.10.1" + "@babel/helper-split-export-declaration@^7.7.4": version "7.7.4" resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.7.4.tgz#57292af60443c4a3622cf74040ddc28e68336fd8" @@ -248,6 +391,11 @@ dependencies: "@babel/types" "^7.7.4" +"@babel/helper-validator-identifier@^7.10.1": + version "7.10.1" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.10.1.tgz#5770b0c1a826c4f53f5ede5e153163e0318e94b5" + integrity sha512-5vW/JXLALhczRCWP0PnFDMCJAchlBvM7f4uk/jXritBnIa6E1KmqmtrS3yn1LAnxFBypQ3eneLuXjsnfQsgILw== + "@babel/helper-wrap-function@^7.7.4": version "7.7.4" resolved "https://registry.yarnpkg.com/@babel/helper-wrap-function/-/helper-wrap-function-7.7.4.tgz#37ab7fed5150e22d9d7266e830072c0cdd8baace" @@ -258,6 +406,15 @@ "@babel/traverse" "^7.7.4" "@babel/types" "^7.7.4" +"@babel/helpers@^7.10.1": + version "7.10.1" + resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.10.1.tgz#a6827b7cb975c9d9cef5fd61d919f60d8844a973" + integrity sha512-muQNHF+IdU6wGgkaJyhhEmI54MOZBKsFfsXFhboz1ybwJ1Kl7IHlbm2a++4jwrmY5UYsgitt5lfqo1wMFcHmyw== + dependencies: + "@babel/template" "^7.10.1" + "@babel/traverse" "^7.10.1" + "@babel/types" "^7.10.1" + "@babel/helpers@^7.6.0", "@babel/helpers@^7.7.4": version "7.7.4" resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.7.4.tgz#62c215b9e6c712dadc15a9a0dcab76c92a940302" @@ -276,11 +433,25 @@ esutils "^2.0.2" js-tokens "^4.0.0" +"@babel/highlight@^7.10.1": + version "7.10.1" + resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.10.1.tgz#841d098ba613ba1a427a2b383d79e35552c38ae0" + integrity sha512-8rMof+gVP8mxYZApLF/JgNDAkdKa+aJt3ZYxF8z6+j/hpeXL7iMsKCPHa2jNMHu/qqBwzQF4OHNoYi8dMA/rYg== + dependencies: + "@babel/helper-validator-identifier" "^7.10.1" + chalk "^2.0.0" + js-tokens "^4.0.0" + "@babel/parser@^7.0.0", "@babel/parser@^7.1.0", "@babel/parser@^7.4.3", "@babel/parser@^7.6.0", "@babel/parser@^7.7.4": version "7.7.4" resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.7.4.tgz#75ab2d7110c2cf2fa949959afb05fa346d2231bb" integrity sha512-jIwvLO0zCL+O/LmEJQjWA75MQTWwx3c3u2JOTDK5D3/9egrWRRA0/0hk9XXywYnXZVVpzrBYeIQTmhwUaePI9g== +"@babel/parser@^7.10.1": + version "7.10.1" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.10.1.tgz#2e142c27ca58aa2c7b119d09269b702c8bbad28c" + integrity sha512-AUTksaz3FqugBkbTZ1i+lDLG5qy8hIzCaAxEtttU6C0BtZZU9pkNZtWSVAht4EW9kl46YBiyTGMp9xTTGqViNg== + "@babel/plugin-proposal-async-generator-functions@^7.2.0", "@babel/plugin-proposal-async-generator-functions@^7.7.4": version "7.7.4" resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.7.4.tgz#0351c5ac0a9e927845fffd5b82af476947b7ce6d" @@ -437,6 +608,13 @@ dependencies: "@babel/helper-plugin-utils" "^7.0.0" +"@babel/plugin-syntax-jsx@^7.10.1": + version "7.10.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.10.1.tgz#0ae371134a42b91d5418feb3c8c8d43e1565d2da" + integrity sha512-+OxyOArpVFXQeXKLO9o+r2I4dIoVoy6+Uu0vKELrlweDM3QJADZj+Z+5ERansZqIZBcLj42vHnDI8Rz9BnRIuQ== + dependencies: + "@babel/helper-plugin-utils" "^7.10.1" + "@babel/plugin-syntax-object-rest-spread@^7.0.0", "@babel/plugin-syntax-object-rest-spread@^7.2.0", "@babel/plugin-syntax-object-rest-spread@^7.7.4": version "7.7.4" resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.7.4.tgz#47cf220d19d6d0d7b154304701f468fc1cc6ff46" @@ -545,6 +723,13 @@ dependencies: "@babel/helper-plugin-utils" "^7.0.0" +"@babel/plugin-transform-destructuring@^7.5.0": + version "7.10.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.10.1.tgz#abd58e51337815ca3a22a336b85f62b998e71907" + integrity sha512-V/nUc4yGWG71OhaTH705pU8ZSdM6c1KmmLP8ys59oOYbT7RpMYAR3MsVOt6OHL0WzG7BlTU076va9fjJyYzJMA== + dependencies: + "@babel/helper-plugin-utils" "^7.10.1" + "@babel/plugin-transform-dotall-regex@^7.2.0", "@babel/plugin-transform-dotall-regex@^7.4.4", "@babel/plugin-transform-dotall-regex@^7.7.4": version "7.7.4" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.7.4.tgz#f7ccda61118c5b7a2599a72d5e3210884a021e96" @@ -734,6 +919,16 @@ "@babel/helper-plugin-utils" "^7.0.0" "@babel/plugin-syntax-jsx" "^7.7.4" +"@babel/plugin-transform-react-jsx@^7.3.0": + version "7.10.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.10.1.tgz#91f544248ba131486decb5d9806da6a6e19a2896" + integrity sha512-MBVworWiSRBap3Vs39eHt+6pJuLUAaK4oxGc8g+wY+vuSJvLiEQjW1LSTqKb8OUPtDvHCkdPhk7d6sjC19xyFw== + dependencies: + "@babel/helper-builder-react-jsx" "^7.10.1" + "@babel/helper-builder-react-jsx-experimental" "^7.10.1" + "@babel/helper-plugin-utils" "^7.10.1" + "@babel/plugin-syntax-jsx" "^7.10.1" + "@babel/plugin-transform-regenerator@^7.3.4", "@babel/plugin-transform-regenerator@^7.4.5", "@babel/plugin-transform-regenerator@^7.7.4": version "7.7.4" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.7.4.tgz#d18eac0312a70152d7d914cbed2dc3999601cfc0" @@ -1086,6 +1281,15 @@ dependencies: regenerator-runtime "^0.13.2" +"@babel/template@^7.10.1": + version "7.10.1" + resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.10.1.tgz#e167154a94cb5f14b28dc58f5356d2162f539811" + integrity sha512-OQDg6SqvFSsc9A0ej6SKINWrpJiNonRIniYondK2ViKhB06i3c0s+76XUft71iqBEe9S1OKsHwPAjfHnuvnCig== + dependencies: + "@babel/code-frame" "^7.10.1" + "@babel/parser" "^7.10.1" + "@babel/types" "^7.10.1" + "@babel/template@^7.4.0", "@babel/template@^7.6.0", "@babel/template@^7.7.4": version "7.7.4" resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.7.4.tgz#428a7d9eecffe27deac0a98e23bf8e3675d2a77b" @@ -1110,6 +1314,21 @@ globals "^11.1.0" lodash "^4.17.13" +"@babel/traverse@^7.10.1": + version "7.10.1" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.10.1.tgz#bbcef3031e4152a6c0b50147f4958df54ca0dd27" + integrity sha512-C/cTuXeKt85K+p08jN6vMDz8vSV0vZcI0wmQ36o6mjbuo++kPMdpOYw23W2XH04dbRt9/nMEfA4W3eR21CD+TQ== + dependencies: + "@babel/code-frame" "^7.10.1" + "@babel/generator" "^7.10.1" + "@babel/helper-function-name" "^7.10.1" + "@babel/helper-split-export-declaration" "^7.10.1" + "@babel/parser" "^7.10.1" + "@babel/types" "^7.10.1" + debug "^4.1.0" + globals "^11.1.0" + lodash "^4.17.13" + "@babel/types@^7.0.0", "@babel/types@^7.3.0", "@babel/types@^7.4.0", "@babel/types@^7.4.4", "@babel/types@^7.6.0", "@babel/types@^7.7.4": version "7.7.4" resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.7.4.tgz#516570d539e44ddf308c07569c258ff94fde9193" @@ -1119,6 +1338,15 @@ lodash "^4.17.13" to-fast-properties "^2.0.0" +"@babel/types@^7.10.1": + version "7.10.1" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.10.1.tgz#6886724d31c8022160a7db895e6731ca33483921" + integrity sha512-L2yqUOpf3tzlW9GVuipgLEcZxnO+96SzR6fjXMuxxNkIgFJ5+07mHCZ+HkHqaeZu8+3LKnNJJ1bKbjBETQAsrA== + dependencies: + "@babel/helper-validator-identifier" "^7.10.1" + lodash "^4.17.13" + to-fast-properties "^2.0.0" + "@cnakazawa/watch@^1.0.3": version "1.0.3" resolved "https://registry.yarnpkg.com/@cnakazawa/watch/-/watch-1.0.3.tgz#099139eaec7ebf07a27c1786a3ff64f39464d2ef" @@ -1127,6 +1355,16 @@ exec-sh "^0.3.2" minimist "^1.2.0" +"@constantinople/types@npm:@joystream/types@^0.9.1": + version "0.9.1" + resolved "https://registry.yarnpkg.com/@joystream/types/-/types-0.9.1.tgz#9dfacd679e91fe7e2e5e72eb1dc292bfa65b227e" + integrity sha512-UiaD2mf1wRPhmG1lPWFH0H835Ic79cZynSvyDnanAXKBiazW2rqZRxTWyc0gRXPGCcu79PN9VbJdK67QkNI9Gg== + dependencies: + "@polkadot/types" "^0.96.1" + "@types/vfile" "^4.0.0" + ajv "^6.11.0" + lodash "^4.17.15" + "@csstools/convert-colors@^1.4.0": version "1.4.0" resolved "https://registry.yarnpkg.com/@csstools/convert-colors/-/convert-colors-1.4.0.tgz#ad495dc41b12e75d588c6db8b9834f08fa131eb7" @@ -3568,7 +3806,7 @@ dependencies: "@types/node" "*" -"@types/mocha@*", "@types/mocha@^7.0.2": +"@types/mocha@*": version "7.0.2" resolved "https://registry.yarnpkg.com/@types/mocha/-/mocha-7.0.2.tgz#b17f16cf933597e10d6d78eae3251e692ce8b0ce" integrity sha512-ZvO2tAcjmMi8V/5Z3JsyofMe3hasRcaw88cto5etSVMwVQfeivGAlEYmaQgceUSVYFofVjT+ioHsATjdWcFt1w== @@ -3752,6 +3990,14 @@ "@types/prop-types" "*" csstype "^2.2.0" +"@types/react@^16.9.16": + version "16.9.35" + resolved "https://registry.yarnpkg.com/@types/react/-/react-16.9.35.tgz#a0830d172e8aadd9bd41709ba2281a3124bbd368" + integrity sha512-q0n0SsWcGc8nDqH2GJfWQWUOmZSJhXV64CjVN5SvcNti3TdEaA3AH0D8DwNmMdzjMAC/78tB8nAZIlV8yTz+zQ== + dependencies: + "@types/prop-types" "*" + csstype "^2.2.0" + "@types/retry@*": version "0.12.0" resolved "https://registry.yarnpkg.com/@types/retry/-/retry-0.12.0.tgz#2b35eccfcee7d38cd72ad99232fbd58bffb3c84d" @@ -3808,6 +4054,13 @@ "@types/styled-components" "*" csstype "^2.2.0" +"@types/tap@^14.10.0": + version "14.10.0" + resolved "https://registry.yarnpkg.com/@types/tap/-/tap-14.10.0.tgz#7ee1e9b98e5610dc1e54af003292608984c48184" + integrity sha512-5MqYgn9nfCsPN/KgbIq8XbaO0w5Ktf3awqStD+uHekqWMiLZ12Y4E4g4Ob08wxXSYgpRTe7UFd8z/2AcYn06xA== + dependencies: + "@types/node" "*" + "@types/through@*": version "0.0.30" resolved "https://registry.yarnpkg.com/@types/through/-/through-0.0.30.tgz#e0e42ce77e897bd6aead6f6ea62aeb135b8a3895" @@ -3879,6 +4132,11 @@ dependencies: "@types/yargs-parser" "*" +"@types/yoga-layout@1.9.2": + version "1.9.2" + resolved "https://registry.yarnpkg.com/@types/yoga-layout/-/yoga-layout-1.9.2.tgz#efaf9e991a7390dc081a0b679185979a83a9639a" + integrity sha512-S9q47ByT2pPvD65IvrWp7qppVMpk9WGMbVq9wbWZOHg6tnXSD4vyhao6nOSBwwfDdV2p3Kx9evA9vI+XWTfDvw== + "@types/yup@^0.26.10": version "0.26.26" resolved "https://registry.yarnpkg.com/@types/yup/-/yup-0.26.26.tgz#2e7065384ac2b7711271d8790f26ac7d73f6a33d" @@ -4660,11 +4918,6 @@ ansi-align@^3.0.0: dependencies: string-width "^3.0.0" -ansi-colors@3.2.3: - version "3.2.3" - resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-3.2.3.tgz#57d35b8686e851e2cc04c403f1c00203976a1813" - integrity sha512-LEHHyuhlPY3TmuUYMh2oz89lTShfvgbmzaBcxve9t/9Wuy7Dwf4yoAKcND7KFT1HAQfqZ12qtc+DUrBMeKF9nw== - ansi-colors@^3.0.0: version "3.2.4" resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-3.2.4.tgz#e3a3da4bfbae6c86a9c285625de124a234026fbf" @@ -4726,18 +4979,18 @@ ansi-styles@^3.2.0, ansi-styles@^3.2.1: dependencies: color-convert "^1.9.0" -ansi-styles@^4.1.0: - version "4.2.0" - resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.2.0.tgz#5681f0dcf7ae5880a7841d8831c4724ed9cc0172" - integrity sha512-7kFQgnEaMdRtwf6uSfUnVr9gSGC7faurn+J/Mv90/W+iTtN0405/nLdopfMWwchyxhbGYl6TC4Sccn9TUkGAgg== +ansi-styles@^4.0.0, ansi-styles@^4.2.0: + version "4.2.1" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.2.1.tgz#90ae75c424d008d2624c5bf29ead3177ebfcf359" + integrity sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA== dependencies: "@types/color-name" "^1.1.1" color-convert "^2.0.1" -ansi-styles@^4.2.0: - version "4.2.1" - resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.2.1.tgz#90ae75c424d008d2624c5bf29ead3177ebfcf359" - integrity sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA== +ansi-styles@^4.1.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.2.0.tgz#5681f0dcf7ae5880a7841d8831c4724ed9cc0172" + integrity sha512-7kFQgnEaMdRtwf6uSfUnVr9gSGC7faurn+J/Mv90/W+iTtN0405/nLdopfMWwchyxhbGYl6TC4Sccn9TUkGAgg== dependencies: "@types/color-name" "^1.1.1" color-convert "^2.0.1" @@ -4974,6 +5227,11 @@ arrify@^1.0.1: resolved "https://registry.yarnpkg.com/arrify/-/arrify-1.0.1.tgz#898508da2226f380df904728456849c1501a4b0d" integrity sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0= +arrify@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/arrify/-/arrify-2.0.1.tgz#c9655e9331e0abcd588d2a7cad7e9956f66701fa" + integrity sha512-3duEwti880xqi4eAMN8AyR4a0ByT90zoYdLlevfrvU43vb0YZwZVfxOgxWrLXXXpyugL0hNZc9G6BiB5B3nUug== + asap@^2.0.0, asap@~2.0.3: version "2.0.6" resolved "https://registry.yarnpkg.com/asap/-/asap-2.0.6.tgz#e50347611d7e690943208bbdafebcbc2fb866d46" @@ -5043,6 +5301,11 @@ astral-regex@^1.0.0: resolved "https://registry.yarnpkg.com/astral-regex/-/astral-regex-1.0.0.tgz#6c8c3fb827dd43ee3918f27b82782ab7658a6fd9" integrity sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg== +astral-regex@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/astral-regex/-/astral-regex-2.0.0.tgz#483143c567aeed4785759c0865786dc77d7d2e31" + integrity sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ== + async-each@^1.0.0, async-each@^1.0.1: version "1.0.3" resolved "https://registry.yarnpkg.com/async-each/-/async-each-1.0.3.tgz#b727dbf87d7651602f06f4d4ac387f47d91b0cbf" @@ -5053,6 +5316,13 @@ async-foreach@^0.1.3: resolved "https://registry.yarnpkg.com/async-foreach/-/async-foreach-0.1.3.tgz#36121f845c0578172de419a97dbeb1d16ec34542" integrity sha1-NhIfhFwFeBct5Bmpfb6x0W7DRUI= +async-hook-domain@^1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/async-hook-domain/-/async-hook-domain-1.1.3.tgz#f4f531b8ee8206b1ea1825fe3825e015c66f44d0" + integrity sha512-ZovMxSbADV3+biB7oR1GL5lGyptI24alp0LWHlmz1OFc5oL47pz3EiIF6nXOkDW7yLqih4NtsiYduzdDW0i+Wg== + dependencies: + source-map-support "^0.5.11" + async-iterator-to-pull-stream@^1.1.0: version "1.3.0" resolved "https://registry.yarnpkg.com/async-iterator-to-pull-stream/-/async-iterator-to-pull-stream-1.3.0.tgz#3a6b9f3cceadff972ca20eb480e3cb43f8789732" @@ -5093,6 +5363,11 @@ attr-accept@^2.0.0: resolved "https://registry.yarnpkg.com/attr-accept/-/attr-accept-2.0.0.tgz#8422fef5ee4a511c207796c888227ab5de03306f" integrity sha512-I9SDP4Wvh2ItYYoafEg8hFpsBe96pfQ+eabceShXt3sw2fbIP96+Aoj9zZE0vkZNAkXXzHJATVRuWz+h9FxJxQ== +auto-bind@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/auto-bind/-/auto-bind-4.0.0.tgz#e3589fc6c2da8f7ca43ba9f84fa52a744fc997fb" + integrity sha512-Hdw8qdNiqdJ8LqT0iK0sVzkFbzg6fhnQqqfWhBDxcHZvU75+B+ayzTy8x+k5Ix0Y92XOhOUlx74ps+bA6BeYMQ== + autocomplete.js@0.36.0: version "0.36.0" resolved "https://registry.yarnpkg.com/autocomplete.js/-/autocomplete.js-0.36.0.tgz#94fe775fe64b6cd42e622d076dc7fd26bedd837b" @@ -5644,6 +5919,11 @@ binary-extensions@^2.0.0: resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.0.0.tgz#23c0df14f6a88077f5f986c0d167ec03c3d5537c" integrity sha512-Phlt0plgpIIBOGTT/ehfFnbNlfsDEiqmzE2KRXoX1bLIlir4X/MR+zSyBEkL05ffWgnRSf/DXv+WrUAVr93/ow== +bind-obj-methods@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/bind-obj-methods/-/bind-obj-methods-2.0.0.tgz#0178140dbe7b7bb67dc74892ace59bc0247f06f0" + integrity sha512-3/qRXczDi2Cdbz6jE+W3IflJOutRVica8frpBn14de1mBOkzDo+6tY33kNhvkw54Kn3PzRRD2VnGbGPcTAk4sw== + bindings@^1.2.1, bindings@^1.4.0, bindings@^1.5.0: version "1.5.0" resolved "https://registry.yarnpkg.com/bindings/-/bindings-1.5.0.tgz#10353c9e945334bc0511a6d90b38fbc7c9c504df" @@ -5814,6 +6094,11 @@ browser-process-hrtime@^0.1.2: resolved "https://registry.yarnpkg.com/browser-process-hrtime/-/browser-process-hrtime-0.1.3.tgz#616f00faef1df7ec1b5bf9cfe2bdc3170f26c7b4" integrity sha512-bRFnI4NnjO6cnyLmOV/7PVoDEMJChlcfN0z4s1YMBY989/SvlfMI1lgCnkFUs53e9gQF+w7qu7XdllSTiSl8Aw== +browser-process-hrtime@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/browser-process-hrtime/-/browser-process-hrtime-1.0.0.tgz#3c9b4b7d782c8121e56f10106d84c0d0ffc94626" + integrity sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow== + browser-resolve@^1.11.3: version "1.11.3" resolved "https://registry.yarnpkg.com/browser-resolve/-/browser-resolve-1.11.3.tgz#9b7cbb3d0f510e4cb86bdbd796124d28b5890af6" @@ -6347,21 +6632,6 @@ cheerio@^1.0.0-rc.2: lodash "^4.15.0" parse5 "^3.0.1" -chokidar@3.3.0: - version "3.3.0" - resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.3.0.tgz#12c0714668c55800f659e262d4962a97faf554a6" - integrity sha512-dGmKLDdT3Gdl7fBUe8XK+gAtGmzy5Fn0XkkWQuYxGIgWVPPse2CxFA5mtrlD0TOHaHjEUqkWNyP1XdHoJES/4A== - dependencies: - anymatch "~3.1.1" - braces "~3.0.2" - glob-parent "~5.1.0" - is-binary-path "~2.1.0" - is-glob "~4.0.1" - normalize-path "~3.0.0" - readdirp "~3.2.0" - optionalDependencies: - fsevents "~2.1.1" - chokidar@^1.6.0: version "1.7.0" resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-1.7.0.tgz#798e689778151c8076b4b360e5edd28cda2bb468" @@ -6397,6 +6667,21 @@ chokidar@^2.0.2, chokidar@^2.0.3, chokidar@^2.0.4, chokidar@^2.1.8: optionalDependencies: fsevents "^1.2.7" +chokidar@^3.3.0: + version "3.4.0" + resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.4.0.tgz#b30611423ce376357c765b9b8f904b9fba3c0be8" + integrity sha512-aXAaho2VJtisB/1fg1+3nlLJqGOuewTzQpd/Tz0yTg2R0e4IGtshYvtjowyEumcBv2z+y4+kc75Mz7j5xJskcQ== + dependencies: + anymatch "~3.1.1" + braces "~3.0.2" + glob-parent "~5.1.0" + is-binary-path "~2.1.0" + is-glob "~4.0.1" + normalize-path "~3.0.0" + readdirp "~3.4.0" + optionalDependencies: + fsevents "~2.1.2" + chownr@^1.0.1, chownr@^1.1.1, chownr@^1.1.2: version "1.1.3" resolved "https://registry.yarnpkg.com/chownr/-/chownr-1.1.3.tgz#42d837d5239688d55f303003a508230fa6727142" @@ -6545,6 +6830,14 @@ cli-table3@0.5.1: optionalDependencies: colors "^1.1.2" +cli-truncate@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/cli-truncate/-/cli-truncate-2.1.0.tgz#c39e28bf05edcde5be3b98992a22deed5a2b93c7" + integrity sha512-n8fOixwDD6b/ObinzTrp1ZKFzbgvKZvuz/TvejnLn1aQfC6r52XEx85FmuC+3HI+JM7coBRXUvNqEU2PHVrHpg== + dependencies: + slice-ansi "^3.0.0" + string-width "^4.2.0" + cli-ux@^5.2.1, cli-ux@^5.4.5: version "5.4.6" resolved "https://registry.yarnpkg.com/cli-ux/-/cli-ux-5.4.6.tgz#26bbe7d1fb20402ce362240ea5dc434168ddbd46" @@ -6600,7 +6893,7 @@ cliui@^3.2.0: strip-ansi "^3.0.1" wrap-ansi "^2.0.0" -cliui@^4.0.0: +cliui@^4.0.0, cliui@^4.1.0: version "4.1.0" resolved "https://registry.yarnpkg.com/cliui/-/cliui-4.1.0.tgz#348422dbe82d800b3022eef4f6ac10bf2e4d1b49" integrity sha512-4FG+RSG9DL7uEwRUZXZn3SS34DiDPfzP0VOiEwtUWlE+AR2EIg+hSyvrIgUUfhdgR/UkAeW2QHgeP+hWrXs7jQ== @@ -6739,6 +7032,11 @@ color-string@^1.5.2: color-name "^1.0.0" simple-swizzle "^0.2.2" +color-support@^1.1.0: + version "1.1.3" + resolved "https://registry.yarnpkg.com/color-support/-/color-support-1.1.3.tgz#93834379a1cc9a0c61f82f52f0d04322251bd5a2" + integrity sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg== + color@^3.0.0, color@^3.1.2: version "3.1.2" resolved "https://registry.yarnpkg.com/color/-/color-3.1.2.tgz#68148e7f85d41ad7649c5fa8c8106f098d229e10" @@ -7696,7 +7994,7 @@ debug@3.1.0, debug@=3.1.0, debug@~3.1.0: dependencies: ms "2.0.0" -debug@3.2.6, debug@^3.0.0, debug@^3.1.0, debug@^3.1.1, debug@^3.2.5, debug@^3.2.6: +debug@^3.0.0, debug@^3.1.0, debug@^3.1.1, debug@^3.2.5, debug@^3.2.6: version "3.2.6" resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.6.tgz#e83d17de16d8a7efb7717edbe5fb10135eee629b" integrity sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ== @@ -8097,6 +8395,11 @@ diacritics@^1.3.0: resolved "https://registry.yarnpkg.com/diacritics/-/diacritics-1.3.0.tgz#3efa87323ebb863e6696cebb0082d48ff3d6f7a1" integrity sha1-PvqHMj67hj5mls67AILUj/PW96E= +diff-frag@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/diff-frag/-/diff-frag-1.0.1.tgz#a7bb51789743e8c0b40e2509166bd155e5833826" + integrity sha512-6/v2PC/6UTGcWPPetb9acL8foberUg/CtPdALeJUdD1B/weHNvzftoo00gYznqHGRhHEbykUGzqfG9RWOSr5yw== + diff-sequences@^24.9.0: version "24.9.0" resolved "https://registry.yarnpkg.com/diff-sequences/-/diff-sequences-24.9.0.tgz#5715d6244e2aa65f48bba0bc972db0b0b11e95b5" @@ -8781,6 +9084,11 @@ escape-string-regexp@1.0.5, escape-string-regexp@^1.0.2, escape-string-regexp@^1 resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" integrity sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ= +escape-string-regexp@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz#a30304e99daa32e23b2fd20f51babd07cffca344" + integrity sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w== + escodegen@^1.8.0, escodegen@^1.9.1: version "1.12.0" resolved "https://registry.yarnpkg.com/escodegen/-/escodegen-1.12.0.tgz#f763daf840af172bb3a2b6dd7219c0e17f7ff541" @@ -9147,6 +9455,11 @@ eslint@^6.7.1: text-table "^0.2.0" v8-compile-cache "^2.0.3" +esm@^3.2.25: + version "3.2.25" + resolved "https://registry.yarnpkg.com/esm/-/esm-3.2.25.tgz#342c18c29d56157688ba5ce31f8431fbb795cc10" + integrity sha512-U1suiZ2oDVWv4zPO56S0NcR5QriEahGtdN2OR6FiOG4WJvcjBVFB0qI4+eKoWFH483PKGuLuu6V8Z4T5g63UVA== + espree@^5.0.1: version "5.0.1" resolved "https://registry.yarnpkg.com/espree/-/espree-5.0.1.tgz#5d6526fa4fc7f0788a5cf75b15f30323e2f81f7a" @@ -9227,6 +9540,11 @@ eventemitter3@^4.0.0: resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-4.0.0.tgz#d65176163887ee59f386d64c82610b696a4a74eb" integrity sha512-qerSRB0p+UDEssxTtm6EDKcE7W4OaoisfIMl4CngyEhjpYglocpNg6UEqCvemdGhosAsg4sO2dXJOdyBifPGCg== +events-to-array@^1.0.1: + version "1.1.2" + resolved "https://registry.yarnpkg.com/events-to-array/-/events-to-array-1.1.2.tgz#2d41f563e1fe400ed4962fe1a4d5c6a7539df7f6" + integrity sha1-LUH1Y+H+QA7Uli/hpNXGp1Od9/Y= + events@^1.1.0: version "1.1.1" resolved "https://registry.yarnpkg.com/events/-/events-1.1.1.tgz#9ebdb7635ad099c70dcc4c2a1f5004288e8bd924" @@ -9855,6 +10173,11 @@ find@^0.3.0: dependencies: traverse-chain "~0.1.0" +findit@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/findit/-/findit-2.0.0.tgz#6509f0126af4c178551cfa99394e032e13a4d56e" + integrity sha1-ZQnwEmr0wXhVHPqZOU4DLhOk1W4= + findup-sync@3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/findup-sync/-/findup-sync-3.0.0.tgz#17b108f9ee512dfb7a5c7f3c8b27ea9e1a9c08d1" @@ -9874,13 +10197,6 @@ flat-cache@^2.0.1: rimraf "2.6.3" write "1.0.3" -flat@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/flat/-/flat-4.1.0.tgz#090bec8b05e39cba309747f1d588f04dbaf98db2" - integrity sha512-Px/TiLIznH7gEDlPXcUD4KnBusa6kR6ayRUVcnEAbreRIuhkqow/mun59BuRXwoYk7ZQOLW1ZM05ilIvK38hFw== - dependencies: - is-buffer "~2.0.3" - flatted@^2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/flatted/-/flatted-2.0.1.tgz#69e57caa8f0eacbc281d2e2cb458d46fdb449e08" @@ -9891,6 +10207,20 @@ flatten@^1.0.2: resolved "https://registry.yarnpkg.com/flatten/-/flatten-1.0.3.tgz#c1283ac9f27b368abc1e36d1ff7b04501a30356b" integrity sha512-dVsPA/UwQ8+2uoFe5GHtiBMu48dWLTdsuEd7CKGlZlD78r1TTWBvDuFaFGKCo/ZfEr95Uk56vZoX86OsHkUeIg== +flow-parser@^0.125.1: + version "0.125.1" + resolved "https://registry.yarnpkg.com/flow-parser/-/flow-parser-0.125.1.tgz#8e6174c0ad8bce8c4e8dbe3c2cfe30235eb0d080" + integrity sha512-vrnK98a85yyaPqcZTQmHlrzb4PAiF/WgkI8xZCmyn5sT6/bAKAFbUB+VQqfzTpnvq2VwZ5SThi/xuz3zMLTFRw== + +flow-remove-types@^2.112.0: + version "2.125.1" + resolved "https://registry.yarnpkg.com/flow-remove-types/-/flow-remove-types-2.125.1.tgz#95fb4c09b142a810435a1dc1acd6871532f1c8b7" + integrity sha512-HLSXvccqHf6KRqxqm4rqa81i4GQWl+8gYvdgESEOjzpHTlN77t09ehmrP+0a6td9ZzQXg22lUMoeDmTlOd5JeA== + dependencies: + flow-parser "^0.125.1" + pirates "^3.0.2" + vlq "^0.2.1" + flush-write-stream@^1.0.0, flush-write-stream@^1.0.2: version "1.1.1" resolved "https://registry.yarnpkg.com/flush-write-stream/-/flush-write-stream-1.1.1.tgz#8dd7d873a1babc207d94ead0c2e0e44276ebf2e8" @@ -9945,7 +10275,7 @@ foreach@^2.0.5: resolved "https://registry.yarnpkg.com/foreach/-/foreach-2.0.5.tgz#0bee005018aeb260d0a3af3ae658dd0136ec1b99" integrity sha1-C+4AUBiusmDQo6865ljdATbsG5k= -foreground-child@^1.5.6: +foreground-child@^1.3.3, foreground-child@^1.5.6: version "1.5.6" resolved "https://registry.yarnpkg.com/foreground-child/-/foreground-child-1.5.6.tgz#4fd71ad2dfde96789b980a5c0a295937cb2f5ce9" integrity sha1-T9ca0t/elnibmApcCilZN8svXOk= @@ -10036,6 +10366,11 @@ fs-constants@^1.0.0: resolved "https://registry.yarnpkg.com/fs-constants/-/fs-constants-1.0.0.tgz#6be0de9be998ce16af8afc24497b9ee9b7ccd9ad" integrity sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow== +fs-exists-cached@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/fs-exists-cached/-/fs-exists-cached-1.0.0.tgz#cf25554ca050dc49ae6656b41de42258989dcbce" + integrity sha1-zyVVTKBQ3EmuZla0HeQiWJidy84= + fs-extra@^0.30.0: version "0.30.0" resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-0.30.0.tgz#f233ffcc08d4da7d432daa449776989db1df93f0" @@ -10122,7 +10457,7 @@ fsevents@^1.0.0, fsevents@^1.2.7: nan "^2.12.1" node-pre-gyp "^0.12.0" -fsevents@~2.1.1: +fsevents@~2.1.2: version "2.1.3" resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.1.3.tgz#fb738703ae8d2f9fe900c33836ddebee8b97f23e" integrity sha512-Auw9a4AxqWpa9GUfj370BMPzzyncfBABW8Mab7BGWBYDj4Isgq+cDKtx0i6u9jcX9pQDnswsaaOTgTmA5pEjuQ== @@ -10142,6 +10477,11 @@ function-bind@^1.0.2, function-bind@^1.1.1: resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A== +function-loop@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/function-loop/-/function-loop-1.0.2.tgz#16b93dd757845eacfeca1a8061a6a65c106e0cb2" + integrity sha512-Iw4MzMfS3udk/rqxTiDDCllhGwlOrsr50zViTOO/W6lS/9y6B1J0BD2VZzrnWUYBJsl3aeqjgR5v7bWWhZSYbA== + function.prototype.name@^1.1.0, function.prototype.name@^1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/function.prototype.name/-/function.prototype.name-1.1.1.tgz#6d252350803085abc2ad423d4fe3be2f9cbda392" @@ -10193,6 +10533,11 @@ genfun@^5.0.0: resolved "https://registry.yarnpkg.com/genfun/-/genfun-5.0.0.tgz#9dd9710a06900a5c4a5bf57aca5da4e52fe76537" integrity sha512-KGDOARWVga7+rnB3z9Sd2Letx515owfk0hSxHGuqjANb1M+x2bGZGqHLiozPsYMdM2OubeMni/Hpwmjq6qIUhA== +gensync@^1.0.0-beta.1: + version "1.0.0-beta.1" + resolved "https://registry.yarnpkg.com/gensync/-/gensync-1.0.0-beta.1.tgz#58f4361ff987e5ff6e1e7a210827aa371eaac269" + integrity sha512-r8EC6NO1sngH/zdD9fiRDLdcgnbayXah+mLgManTaIZJqEC1MZstmnox8KpnI2/fxQwrp5OpCOYWLp4rBl4Jcg== + get-amd-module-type@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/get-amd-module-type/-/get-amd-module-type-3.0.0.tgz#bb334662fa04427018c937774570de495845c288" @@ -10430,18 +10775,6 @@ glob@7.1.2: once "^1.3.0" path-is-absolute "^1.0.0" -glob@7.1.3: - version "7.1.3" - resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.3.tgz#3960832d3f1574108342dafd3a67b332c0969df1" - integrity sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ== - dependencies: - fs.realpath "^1.0.0" - inflight "^1.0.4" - inherits "2" - minimatch "^3.0.4" - once "^1.3.0" - path-is-absolute "^1.0.0" - glob@^5.0.15: version "5.0.15" resolved "https://registry.yarnpkg.com/glob/-/glob-5.0.15.tgz#1bc936b9e02f4a603fcc222ecf7633d30b8b93b1" @@ -10847,7 +11180,7 @@ he@1.1.1: resolved "https://registry.yarnpkg.com/he/-/he-1.1.1.tgz#93410fd21b009735151f8868c2f271f3427e23fd" integrity sha1-k0EP0hsAlzUVH4howvJx80J+I/0= -he@1.2.0, he@1.2.x, he@^1.1.0, he@^1.2.0: +he@1.2.x, he@^1.1.0, he@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/he/-/he-1.2.0.tgz#84ae65fa7eafb165fddb61566ae14baf05664f0f" integrity sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw== @@ -11377,6 +11710,18 @@ import-from@^2.1.0: dependencies: resolve-from "^3.0.0" +import-jsx@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/import-jsx/-/import-jsx-3.1.0.tgz#f17a29dd43eda827f335c0766235f9fd07f7913f" + integrity sha512-lTuMdQ/mRXC+xQSGPDvAg1VkODlX78j5hZv2tneJ+zuo7GH/XhUF/YVKoeF382a4jO4GYw9jgganbMhEcxwb0g== + dependencies: + "@babel/core" "^7.5.5" + "@babel/plugin-proposal-object-rest-spread" "^7.5.5" + "@babel/plugin-transform-destructuring" "^7.5.0" + "@babel/plugin-transform-react-jsx" "^7.3.0" + caller-path "^2.0.0" + resolve-from "^3.0.0" + import-local@2.0.0, import-local@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/import-local/-/import-local-2.0.0.tgz#55070be38a5993cf18ef6db7e961f5bee5c5a09d" @@ -11485,6 +11830,30 @@ init-package-json@^1.10.3: validate-npm-package-license "^3.0.1" validate-npm-package-name "^3.0.0" +ink@^2.6.0: + version "2.7.1" + resolved "https://registry.yarnpkg.com/ink/-/ink-2.7.1.tgz#ff1c75b4b022924e2993af62297fa0e48e85618b" + integrity sha512-s7lJuQDJEdjqtaIWhp3KYHl6WV3J04U9zoQ6wVc+Xoa06XM27SXUY57qC5DO46xkF0CfgXMKkKNcgvSu/SAEpA== + dependencies: + ansi-escapes "^4.2.1" + arrify "^2.0.1" + auto-bind "^4.0.0" + chalk "^3.0.0" + cli-cursor "^3.1.0" + cli-truncate "^2.1.0" + is-ci "^2.0.0" + lodash.throttle "^4.1.1" + log-update "^3.0.0" + prop-types "^15.6.2" + react-reconciler "^0.24.0" + scheduler "^0.18.0" + signal-exit "^3.0.2" + slice-ansi "^3.0.0" + string-length "^3.1.0" + widest-line "^3.1.0" + wrap-ansi "^6.2.0" + yoga-layout-prebuilt "^1.9.3" + inquirer@6.5.0: version "6.5.0" resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-6.5.0.tgz#2303317efc9a4ea7ec2e2df6f86569b734accf42" @@ -11867,7 +12236,7 @@ is-buffer@^1.0.2, is-buffer@^1.1.4, is-buffer@^1.1.5: resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.6.tgz#efaa2ea9daa0d7ab2ea13a97b2b8ad51fefbe8be" integrity sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w== -is-buffer@^2.0.0, is-buffer@^2.0.2, is-buffer@~2.0.3: +is-buffer@^2.0.0, is-buffer@^2.0.2: version "2.0.4" resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-2.0.4.tgz#3e572f23c8411a5cfd9557c849e3665e0b290623" integrity sha512-Kq1rokWXOPXWuaMAqZiJW4XxsmD9zGx9q4aePabbn3qCRGedtH7Cm+zV8WETitMfu1wdh+Rvd6w5egwSngUX2A== @@ -12395,7 +12764,7 @@ isstream@~0.1.2: resolved "https://registry.yarnpkg.com/isstream/-/isstream-0.1.2.tgz#47e63f7af55afa6f92e1500e690eb8b8529c099a" integrity sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo= -istanbul-lib-coverage@^2.0.2, istanbul-lib-coverage@^2.0.5: +istanbul-lib-coverage@^2.0.2, istanbul-lib-coverage@^2.0.3, istanbul-lib-coverage@^2.0.5: version "2.0.5" resolved "https://registry.yarnpkg.com/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.5.tgz#675f0ab69503fad4b1d849f736baaca803344f49" integrity sha512-8aXznuEPCJvGnMSRft4udDRDtb1V3pkQkMMI5LI+6HuQz5oQ4J2UFn1H82raA3qJtyOLkkwVqICBQkjnGtn5mA== @@ -12420,6 +12789,17 @@ istanbul-lib-instrument@^3.0.1, istanbul-lib-instrument@^3.3.0: istanbul-lib-coverage "^2.0.5" semver "^6.0.0" +istanbul-lib-processinfo@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/istanbul-lib-processinfo/-/istanbul-lib-processinfo-1.0.0.tgz#6c0b59411d2897313ea09165fd95464a32be5610" + integrity sha512-FY0cPmWa4WoQNlvB8VOcafiRoB5nB+l2Pz2xGuXHRSy1KM8QFOYfz/rN+bGMCAeejrY3mrpF5oJHcN0s/garCg== + dependencies: + archy "^1.0.0" + cross-spawn "^6.0.5" + istanbul-lib-coverage "^2.0.3" + rimraf "^2.6.3" + uuid "^3.3.2" + istanbul-lib-report@^2.0.4, istanbul-lib-report@^2.0.8: version "2.0.8" resolved "https://registry.yarnpkg.com/istanbul-lib-report/-/istanbul-lib-report-2.0.8.tgz#5a8113cd746d43c4889eba36ab10e7d50c9b4f33" @@ -12454,6 +12834,13 @@ istanbul-reports@^2.2.6: dependencies: handlebars "^4.1.2" +jackspeak@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/jackspeak/-/jackspeak-1.4.0.tgz#4eb2c7935c5e6d28179b50829711d1372a1c9a2a" + integrity sha512-VDcSunT+wcccoG46FtzuBAyQKlzhHjli4q31e1fIHGOsRspqNUFjVzGb+7eIFDlTvqLygxapDHPHS0ouT2o/tw== + dependencies: + cliui "^4.1.0" + javascript-stringify@^1.6.0: version "1.6.0" resolved "https://registry.yarnpkg.com/javascript-stringify/-/javascript-stringify-1.6.0.tgz#142d111f3a6e3dae8f4a9afd77d45855b5a9cce3" @@ -12851,7 +13238,7 @@ js-tokens@^3.0.2: resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-3.0.2.tgz#9866df395102130e38f7f996bceb65443209c25b" integrity sha1-mGbfOVECEw449/mWvOtlRDIJwls= -js-yaml@3.13.1, js-yaml@^3.11.0, js-yaml@^3.12.1, js-yaml@^3.13.1: +js-yaml@^3.11.0, js-yaml@^3.12.1, js-yaml@^3.13.1: version "3.13.1" resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.13.1.tgz#aff151b30bfdfa8e49e05da22e7415e9dfa37847" integrity sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw== @@ -12996,6 +13383,13 @@ json5@^1.0.1: dependencies: minimist "^1.2.0" +json5@^2.1.2: + version "2.1.3" + resolved "https://registry.yarnpkg.com/json5/-/json5-2.1.3.tgz#c9b0f7fa9233bfe5807fe66fcf3a5617ed597d43" + integrity sha512-KXPvOm8K9IJKFM0bmdn8QXh7udDh1g/giieX0NLCaMnb4hEiVFqnop2ImTXCc5e0/oHz3LTqmHGtExn5hfMkOA== + dependencies: + minimist "^1.2.5" + jsonfile@^2.1.0: version "2.4.0" resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-2.4.0.tgz#3736a2b428b87bbda0cc83b53fa3d633a35c2ae8" @@ -13650,13 +14044,22 @@ log-driver@^1.2.7: resolved "https://registry.yarnpkg.com/log-driver/-/log-driver-1.2.7.tgz#63b95021f0702fedfa2c9bb0a24e7797d71871d8" integrity sha512-U7KCmLdqsGHBLeWqYlFA0V0Sl6P08EE1ZrmA9cxjUE0WVqT9qnyVDPz1kzpFEP0jdJuFnasWIfSd7fsaNXkpbg== -log-symbols@3.0.0, log-symbols@^3.0.0: +log-symbols@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-3.0.0.tgz#f3a08516a5dea893336a7dee14d18a1cfdab77c4" integrity sha512-dSkNGuI7iG3mfvDzUuYZyvk5dD9ocYCYzNU6CYDE6+Xqd+gwme6Z00NS3dUh8mq/73HaEtT7m6W+yUPtU6BZnQ== dependencies: chalk "^2.4.2" +log-update@^3.0.0: + version "3.4.0" + resolved "https://registry.yarnpkg.com/log-update/-/log-update-3.4.0.tgz#3b9a71e00ac5b1185cc193a36d654581c48f97b9" + integrity sha512-ILKe88NeMt4gmDvk/eb615U/IVn7K9KWGkoYbdatQ69Z65nj1ZzjM6fHXfcs0Uge+e+EGnMW7DY4T9yko8vWFg== + dependencies: + ansi-escapes "^3.2.0" + cli-cursor "^2.1.0" + wrap-ansi "^5.0.0" + loglevel@^1.6.4: version "1.6.6" resolved "https://registry.yarnpkg.com/loglevel/-/loglevel-1.6.6.tgz#0ee6300cc058db6b3551fa1c4bf73b83bb771312" @@ -14353,6 +14756,13 @@ minipass@^2.3.5, minipass@^2.6.0, minipass@^2.8.6, minipass@^2.9.0: safe-buffer "^5.1.2" yallist "^3.0.0" +minipass@^3.0.0, minipass@^3.1.1: + version "3.1.3" + resolved "https://registry.yarnpkg.com/minipass/-/minipass-3.1.3.tgz#7d42ff1f39635482e15f9cdb53184deebd5815fd" + integrity sha512-Mgd2GdMVzY+x3IJ+oHnVM+KG3lA5c8tnabyJKmHSaG2kAGpudxuOf8ToDkhumF7UzME7DecbQE9uOZhNm7PuJg== + dependencies: + yallist "^4.0.0" + minizlib@^1.2.1: version "1.3.3" resolved "https://registry.yarnpkg.com/minizlib/-/minizlib-1.3.3.tgz#2290de96818a34c29551c8a8d301216bd65a861d" @@ -14411,7 +14821,7 @@ mkdirp@0.3.0: resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.3.0.tgz#1bbf5ab1ba827af23575143490426455f481fe1e" integrity sha1-G79asbqCevI1dRQ0kEJkVfSB/h4= -mkdirp@0.5.5, mkdirp@^0.5.3: +mkdirp@^0.5.3: version "0.5.5" resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.5.tgz#d91cefd62d1436ca0f41620e251288d420099def" integrity sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ== @@ -14435,36 +14845,6 @@ mocha@^5.2.0: mkdirp "0.5.1" supports-color "5.4.0" -mocha@^7.1.1: - version "7.2.0" - resolved "https://registry.yarnpkg.com/mocha/-/mocha-7.2.0.tgz#01cc227b00d875ab1eed03a75106689cfed5a604" - integrity sha512-O9CIypScywTVpNaRrCAgoUnJgozpIofjKUYmJhiCIJMiuYnLI6otcb1/kpW9/n/tJODHGZ7i8aLQoDVsMtOKQQ== - dependencies: - ansi-colors "3.2.3" - browser-stdout "1.3.1" - chokidar "3.3.0" - debug "3.2.6" - diff "3.5.0" - escape-string-regexp "1.0.5" - find-up "3.0.0" - glob "7.1.3" - growl "1.10.5" - he "1.2.0" - js-yaml "3.13.1" - log-symbols "3.0.0" - minimatch "3.0.4" - mkdirp "0.5.5" - ms "2.1.1" - node-environment-flags "1.0.6" - object.assign "4.1.0" - strip-json-comments "2.0.1" - supports-color "6.0.0" - which "1.3.1" - wide-align "1.1.3" - yargs "13.3.2" - yargs-parser "13.1.2" - yargs-unparser "1.6.0" - mock-stdin@^0.3.1: version "0.3.1" resolved "https://registry.yarnpkg.com/mock-stdin/-/mock-stdin-0.3.1.tgz#c657d9642d90786435c64ca5e99bbd4d09bd7dd3" @@ -14527,7 +14907,7 @@ ms@2.1.1: resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.1.tgz#30a5864eb3ebb0a66f2ebe6d727af06a09d86e0a" integrity sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg== -ms@^2.0.0, ms@^2.1.1: +ms@^2.0.0, ms@^2.1.1, ms@^2.1.2: version "2.1.2" resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== @@ -14742,14 +15122,6 @@ node-dir@^0.1.10: dependencies: minimatch "^3.0.2" -node-environment-flags@1.0.6: - version "1.0.6" - resolved "https://registry.yarnpkg.com/node-environment-flags/-/node-environment-flags-1.0.6.tgz#a30ac13621f6f7d674260a54dede048c3982c088" - integrity sha512-5Evy2epuL+6TM0lCQGpFIj6KwiEsGh1SrHUhTbNX+sLbBtjidPZFAnVK9y5yU1+h//RitLbRHTIMyxQPtxMdHw== - dependencies: - object.getownpropertydescriptors "^2.0.3" - semver "^5.7.0" - node-fetch-npm@^2.0.2: version "2.0.2" resolved "https://registry.yarnpkg.com/node-fetch-npm/-/node-fetch-npm-2.0.2.tgz#7258c9046182dca345b4208eda918daf33697ff7" @@ -15206,7 +15578,7 @@ object-visit@^1.0.0: dependencies: isobject "^3.0.0" -object.assign@4.1.0, object.assign@^4.0.4, object.assign@^4.1.0: +object.assign@^4.0.4, object.assign@^4.1.0: version "4.1.0" resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.0.tgz#968bf1100d7956bb3ca086f006f846b3bc4008da" integrity sha512-exHJeq6kBKj58mqGyTQ9DFvrZC/eR6OwxzoM9YRoGBqrXYonaFyGiFMuc9VZrXf7DarreEwMpurG3dd+CNyW5w== @@ -15343,6 +15715,11 @@ opencollective-postinstall@^2.0.2: resolved "https://registry.yarnpkg.com/opencollective-postinstall/-/opencollective-postinstall-2.0.2.tgz#5657f1bede69b6e33a45939b061eb53d3c6c3a89" integrity sha512-pVOEP16TrAO2/fjej1IdOyupJY8KDUM1CvsaScRbw6oddvpQoOfGk4ywha0HKKVAD6RkW4x6Q+tNBwhf3Bgpuw== +opener@^1.5.1: + version "1.5.1" + resolved "https://registry.yarnpkg.com/opener/-/opener-1.5.1.tgz#6d2f0e77f1a0af0032aca716c2c1fbb8e7e8abed" + integrity sha512-goYSy5c2UXE4Ra1xixabeVh1guIX/ZV/YokJksb6q2lubWu6UbvPQ20p542/sFIll1nl8JnCyK9oBaOcCWXwvA== + opn@^5.5.0: version "5.5.0" resolved "https://registry.yarnpkg.com/opn/-/opn-5.5.0.tgz#fc7164fab56d235904c51c3b27da6758ca3b9bfc" @@ -15460,6 +15837,18 @@ osenv@0, osenv@^0.1.4, osenv@^0.1.5: os-homedir "^1.0.0" os-tmpdir "^1.0.0" +own-or-env@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/own-or-env/-/own-or-env-1.0.1.tgz#54ce601d3bf78236c5c65633aa1c8ec03f8007e4" + integrity sha512-y8qULRbRAlL6x2+M0vIe7jJbJx/kmUTzYonRAa2ayesR2qWLswninkVyeJe4x3IEXhdgoNodzjQRKAoEs6Fmrw== + dependencies: + own-or "^1.0.0" + +own-or@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/own-or/-/own-or-1.0.0.tgz#4e877fbeda9a2ec8000fbc0bcae39645ee8bf8dc" + integrity sha1-Tod/vtqaLsgAD7wLyuOWRe6L+Nw= + p-defer@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/p-defer/-/p-defer-1.0.0.tgz#9f6eb182f6c9aa8cd743004a7d4f96b196b0fb0c" @@ -15858,7 +16247,7 @@ performance-now@^2.1.0: resolved "https://registry.yarnpkg.com/performance-now/-/performance-now-2.1.0.tgz#6309f4e0e5fa913ec1c69307ae364b4b377c9e7b" integrity sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns= -picomatch@^2.0.4: +picomatch@^2.0.4, picomatch@^2.2.1: version "2.2.2" resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.2.2.tgz#21f333e9b6b8eaff02468f5146ea406d345f4dad" integrity sha512-q0M/9eZHzmr0AulXyPwNfZjtwZ/RBZlbN3K3CErVrk50T2ASYI7Bye0EvekFY3IP1Nt2DHu0re+V2ZHIpMkuWg== @@ -15895,6 +16284,13 @@ pinkie@^2.0.0: resolved "https://registry.yarnpkg.com/pinkie/-/pinkie-2.0.4.tgz#72556b80cfa0d48a974e80e77248e80ed4f7f870" integrity sha1-clVrgM+g1IqXToDnckjoDtT3+HA= +pirates@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/pirates/-/pirates-3.0.2.tgz#7e6f85413fd9161ab4e12b539b06010d85954bb9" + integrity sha512-c5CgUJq6H2k6MJz72Ak1F5sN9n9wlSlJyEnwvpm9/y3WB4E3pHBDT2c6PEiS1vyJvq2bUxUAIu0EGf8Cx4Ic7Q== + dependencies: + node-modules-regexp "^1.0.0" + pirates@^4.0.0, pirates@^4.0.1: version "4.0.1" resolved "https://registry.yarnpkg.com/pirates/-/pirates-4.0.1.tgz#643a92caf894566f91b2b986d2c66950a8e2fb87" @@ -17212,7 +17608,7 @@ punycode@^1.2.4, punycode@^1.4.1: resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.4.1.tgz#c0d5a63b2718800ad8e1eb0fa5269c84dd41845e" integrity sha1-wNWmOycYgArY4esPpSachN1BhF4= -punycode@^2.1.0, punycode@^2.1.1: +punycode@^2.0.0, punycode@^2.1.0, punycode@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec" integrity sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A== @@ -17709,6 +18105,16 @@ react-qr-reader@^2.2.1: prop-types "^15.7.2" webrtc-adapter "^7.2.1" +react-reconciler@^0.24.0: + version "0.24.0" + resolved "https://registry.yarnpkg.com/react-reconciler/-/react-reconciler-0.24.0.tgz#5a396b2c2f5efe8554134a5935f49f546723f2dd" + integrity sha512-gAGnwWkf+NOTig9oOowqid9O0HjTDC+XVGBCAmJYYJ2A2cN/O4gDdIuuUQjv8A4v6GDwVfJkagpBBLW5OW9HSw== + dependencies: + loose-envify "^1.1.0" + object-assign "^4.1.1" + prop-types "^15.6.2" + scheduler "^0.18.0" + react-redux@^7.1.1: version "7.1.3" resolved "https://registry.yarnpkg.com/react-redux/-/react-redux-7.1.3.tgz#717a3d7bbe3a1b2d535c94885ce04cdc5a33fc79" @@ -18003,12 +18409,12 @@ readdirp@^2.0.0, readdirp@^2.2.1: micromatch "^3.1.10" readable-stream "^2.0.2" -readdirp@~3.2.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.2.0.tgz#c30c33352b12c96dfb4b895421a49fd5a9593839" - integrity sha512-crk4Qu3pmXwgxdSgGhgA/eXiJAPQiX4GMOZZMXnqKxHX7TaoL+3gQVo/WeuAiogr07DpnfjIMpXXa+PAIvwPGQ== +readdirp@~3.4.0: + version "3.4.0" + resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.4.0.tgz#9fdccdf9e9155805449221ac645e8303ab5b9ada" + integrity sha512-0xe001vZBnJEK+uKcj8qOhyAKPzIT+gStxWr3LCB0DwcXR5NZJ3IaC+yGnHCYzB/S7ov3m3EEbZI2zeNvX+hGQ== dependencies: - picomatch "^2.0.4" + picomatch "^2.2.1" realpath-native@^1.1.0: version "1.1.0" @@ -18559,7 +18965,7 @@ rgba-regex@^1.0.0: resolved "https://registry.yarnpkg.com/rgba-regex/-/rgba-regex-1.0.0.tgz#43374e2e2ca0968b0ef1523460b7d730ff22eeb3" integrity sha1-QzdOLiyglosO8VI0YLfXMP8i7rM= -rimraf@2, rimraf@^2.2.8, rimraf@^2.5.4, rimraf@^2.6.1, rimraf@^2.6.2, rimraf@^2.6.3: +rimraf@2, rimraf@^2.2.8, rimraf@^2.5.4, rimraf@^2.6.1, rimraf@^2.6.2, rimraf@^2.6.3, rimraf@^2.7.1: version "2.7.1" resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.7.1.tgz#35797f13a7fdadc566142c29d4f07ccad483e3ec" integrity sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w== @@ -19125,6 +19531,15 @@ slice-ansi@^2.1.0: astral-regex "^1.0.0" is-fullwidth-code-point "^2.0.0" +slice-ansi@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-3.0.0.tgz#31ddc10930a1b7e0b67b08c96c2f49b77a789787" + integrity sha512-pSyv7bSTC7ig9Dcgbw9AuRNUb5k5V6oDudjZoMBSr13qpLBG7tB+zgCkARjq7xIUgdz5P1Qe8u+rSGdouOOIyQ== + dependencies: + ansi-styles "^4.0.0" + astral-regex "^2.0.0" + is-fullwidth-code-point "^3.0.0" + slide@^1.1.6: version "1.1.6" resolved "https://registry.yarnpkg.com/slide/-/slide-1.1.6.tgz#56eb027d65b4d2dce6cb2e2d32c4d4afc9e1d707" @@ -19284,18 +19699,18 @@ source-map-resolve@^0.5.0, source-map-resolve@^0.5.2: source-map-url "^0.4.0" urix "^0.1.0" -source-map-support@^0.5.16, source-map-support@^0.5.6, source-map-support@~0.5.12: - version "0.5.16" - resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.16.tgz#0ae069e7fe3ba7538c64c98515e35339eac5a042" - integrity sha512-efyLRJDr68D9hBBNIPWFjhpFzURh+KJykQwvMyW5UiZzYwoF6l4YMMDIJJEyFWxWCqfyxLzz6tSfUFR+kXXsVQ== +source-map-support@^0.5.11, source-map-support@^0.5.17: + version "0.5.19" + resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.19.tgz#a98b62f86dcaf4f67399648c085291ab9e8fed61" + integrity sha512-Wonm7zOCIJzBGQdB+thsPar0kYuCIzYvxZwlBa87yi/Mdjv7Tip2cyVbLj5o0cFPN4EVkuTwb3GDDyUx2DGnGw== dependencies: buffer-from "^1.0.0" source-map "^0.6.0" -source-map-support@^0.5.17: - version "0.5.19" - resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.19.tgz#a98b62f86dcaf4f67399648c085291ab9e8fed61" - integrity sha512-Wonm7zOCIJzBGQdB+thsPar0kYuCIzYvxZwlBa87yi/Mdjv7Tip2cyVbLj5o0cFPN4EVkuTwb3GDDyUx2DGnGw== +source-map-support@^0.5.16, source-map-support@^0.5.6, source-map-support@~0.5.12: + version "0.5.16" + resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.16.tgz#0ae069e7fe3ba7538c64c98515e35339eac5a042" + integrity sha512-efyLRJDr68D9hBBNIPWFjhpFzURh+KJykQwvMyW5UiZzYwoF6l4YMMDIJJEyFWxWCqfyxLzz6tSfUFR+kXXsVQ== dependencies: buffer-from "^1.0.0" source-map "^0.6.0" @@ -19461,7 +19876,7 @@ stable@^0.1.8, stable@~0.1.8: resolved "https://registry.yarnpkg.com/stable/-/stable-0.1.8.tgz#836eb3c8382fe2936feaf544631017ce7d47a3cf" integrity sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w== -stack-utils@^1.0.1: +stack-utils@^1.0.1, stack-utils@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/stack-utils/-/stack-utils-1.0.2.tgz#33eba3897788558bebfc2db059dc158ec36cebb8" integrity sha512-MTX+MeG5U994cazkjd/9KNAapsHnibjMLnfXodlkXw76JEea0UiNzrqidzo1emMwk7w5Qhc9jd4Bn9TBb1MFwA== @@ -19591,6 +20006,14 @@ string-length@^2.0.0: astral-regex "^1.0.0" strip-ansi "^4.0.0" +string-length@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/string-length/-/string-length-3.1.0.tgz#107ef8c23456e187a8abd4a61162ff4ac6e25837" + integrity sha512-Ttp5YvkGm5v9Ijagtaz1BnN+k9ObpvS0eIBblPMp2YWL8FBmi9qblQ9fexc2k/CXFgrTIteU3jAw3payCnwSTA== + dependencies: + astral-regex "^1.0.0" + strip-ansi "^5.2.0" + string-width@^1.0.1, string-width@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/string-width/-/string-width-1.0.2.tgz#118bdf5b8cdc51a2a7e70d211e07e2b0b9b107d3" @@ -19617,7 +20040,7 @@ string-width@^3.0.0, string-width@^3.1.0: is-fullwidth-code-point "^2.0.0" strip-ansi "^5.1.0" -string-width@^4.1.0, string-width@^4.2.0: +string-width@^4.0.0, string-width@^4.1.0, string-width@^4.2.0: version "4.2.0" resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.0.tgz#952182c46cc7b2c313d1596e623992bd163b72b5" integrity sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg== @@ -19785,7 +20208,7 @@ strip-indent@^2.0.0: resolved "https://registry.yarnpkg.com/strip-indent/-/strip-indent-2.0.0.tgz#5ef8db295d01e6ed6cbf7aab96998d7822527b68" integrity sha1-XvjbKV0B5u1sv3qrlpmNeCJSe2g= -strip-json-comments@2.0.1, strip-json-comments@^2.0.1, strip-json-comments@~2.0.1: +strip-json-comments@^2.0.1, strip-json-comments@~2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a" integrity sha1-PFMZQukIwml8DsNEhYwobHygpgo= @@ -19925,13 +20348,6 @@ supports-color@5.4.0: dependencies: has-flag "^3.0.0" -supports-color@6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-6.0.0.tgz#76cfe742cf1f41bb9b1c29ad03068c05b4c0e40a" - integrity sha512-on9Kwidc1IUQo+bQdhi8+Tijpo0e1SS6RoGo2guUwn5vdaxw8RXOF9Vb2ws+ihWOmh4JnCJOvaziZWP1VABaLg== - dependencies: - has-flag "^3.0.0" - supports-color@6.1.0, supports-color@^6.1.0: version "6.1.0" resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-6.1.0.tgz#0764abc69c63d5ac842dd4867e8d025e880df8f3" @@ -20035,6 +20451,85 @@ table@^5.2.3: slice-ansi "^2.1.0" string-width "^3.0.0" +tap-mocha-reporter@^5.0.0: + version "5.0.1" + resolved "https://registry.yarnpkg.com/tap-mocha-reporter/-/tap-mocha-reporter-5.0.1.tgz#74f00be2ddd2a380adad45e085795137bc39497a" + integrity sha512-1knFWOwd4khx/7uSEnUeaP9IPW3w+sqTgJMhrwah6t46nZ8P25atOKAjSvVDsT67lOPu0nfdOqUwoyKn+3E5pA== + dependencies: + color-support "^1.1.0" + debug "^4.1.1" + diff "^4.0.1" + escape-string-regexp "^2.0.0" + glob "^7.0.5" + tap-parser "^10.0.0" + tap-yaml "^1.0.0" + unicode-length "^2.0.2" + +tap-parser@^10.0.0, tap-parser@^10.0.1: + version "10.0.1" + resolved "https://registry.yarnpkg.com/tap-parser/-/tap-parser-10.0.1.tgz#b63c2500eeef2be8fbf09d512914196d1f12ebec" + integrity sha512-qdT15H0DoJIi7zOqVXDn9X0gSM68JjNy1w3VemwTJlDnETjbi6SutnqmBfjDJAwkFS79NJ97gZKqie00ZCGmzg== + dependencies: + events-to-array "^1.0.1" + minipass "^3.0.0" + tap-yaml "^1.0.0" + +tap-yaml@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/tap-yaml/-/tap-yaml-1.0.0.tgz#4e31443a5489e05ca8bbb3e36cef71b5dec69635" + integrity sha512-Rxbx4EnrWkYk0/ztcm5u3/VznbyFJpyXO12dDBHKWiDVxy7O2Qw6MRrwO5H6Ww0U5YhRY/4C/VzWmFPhBQc4qQ== + dependencies: + yaml "^1.5.0" + +tap@^14.10.7: + version "14.10.7" + resolved "https://registry.yarnpkg.com/tap/-/tap-14.10.7.tgz#426ee130a81bd00951d0ab2cc1eba76cf1775c36" + integrity sha512-DVx00lfiMxFhofwFDP77pitRCruVQJn8Dcj/6auIU3dErJQWsKT94oG6Yj0MQRuYANhSec8ruIPyUjH/RI9Hrw== + dependencies: + "@types/react" "^16.9.16" + async-hook-domain "^1.1.3" + bind-obj-methods "^2.0.0" + browser-process-hrtime "^1.0.0" + chokidar "^3.3.0" + color-support "^1.1.0" + coveralls "^3.0.8" + diff "^4.0.1" + esm "^3.2.25" + findit "^2.0.0" + flow-remove-types "^2.112.0" + foreground-child "^1.3.3" + fs-exists-cached "^1.0.0" + function-loop "^1.0.2" + glob "^7.1.6" + import-jsx "^3.1.0" + ink "^2.6.0" + isexe "^2.0.0" + istanbul-lib-processinfo "^1.0.0" + jackspeak "^1.4.0" + minipass "^3.1.1" + mkdirp "^0.5.1" + nyc "^14.1.1" + opener "^1.5.1" + own-or "^1.0.0" + own-or-env "^1.0.1" + react "^16.12.0" + rimraf "^2.7.1" + signal-exit "^3.0.0" + source-map-support "^0.5.16" + stack-utils "^1.0.2" + tap-mocha-reporter "^5.0.0" + tap-parser "^10.0.1" + tap-yaml "^1.0.0" + tcompare "^3.0.0" + treport "^1.0.2" + trivial-deferred "^1.0.1" + ts-node "^8.5.2" + typescript "^3.7.2" + which "^2.0.2" + write-file-atomic "^3.0.1" + yaml "^1.7.2" + yapool "^1.0.0" + tapable@^1.0.0, tapable@^1.1.3: version "1.1.3" resolved "https://registry.yarnpkg.com/tapable/-/tapable-1.1.3.tgz#a1fccc06b58db61fd7a45da2da44f5f3a3e67ba2" @@ -20111,6 +20606,13 @@ tcomb@^3.2.21: resolved "https://registry.yarnpkg.com/tcomb/-/tcomb-3.2.29.tgz#32404fe9456d90c2cf4798682d37439f1ccc386c" integrity sha512-di2Hd1DB2Zfw6StGv861JoAF5h/uQVu/QJp2g8KVbtfKnoHdBQl5M32YWq6mnSYBQ1vFFrns5B1haWJL7rKaOQ== +tcompare@^3.0.0: + version "3.0.4" + resolved "https://registry.yarnpkg.com/tcompare/-/tcompare-3.0.4.tgz#e92ebdbf1af33757afa0717aaed5bb4efdd41992" + integrity sha512-Q3TitMVK59NyKgQyFh+857wTAUE329IzLDehuPgU4nF5e8g+EUQ+yUbjUy1/6ugiNnXztphT+NnqlCXolv9P3A== + dependencies: + diff-frag "^1.0.1" + telejson@^3.0.2: version "3.3.0" resolved "https://registry.yarnpkg.com/telejson/-/telejson-3.3.0.tgz#6d814f3c0d254d5c4770085aad063e266b56ad03" @@ -20455,6 +20957,20 @@ traverse@~0.6.6: resolved "https://registry.yarnpkg.com/traverse/-/traverse-0.6.6.tgz#cbdf560fd7b9af632502fed40f918c157ea97137" integrity sha1-y99WD9e5r2MlAv7UD5GMFX6pcTc= +treport@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/treport/-/treport-1.0.2.tgz#5f99e68198982984415434a2a84df2af2dd7171d" + integrity sha512-QCAbFtzIjQN+9k+alo8e6oo8j0eSLsttdahAgNLoC3U36rls8XRy/R11QOhHmPz7CDcB2ar29eLe4OFJoPnsPA== + dependencies: + cardinal "^2.1.1" + chalk "^3.0.0" + import-jsx "^3.1.0" + ink "^2.6.0" + ms "^2.1.2" + string-length "^3.1.0" + tap-parser "^10.0.1" + unicode-length "^2.0.2" + trim-newlines@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/trim-newlines/-/trim-newlines-1.0.0.tgz#5887966bb582a4503a41eb524f7d35011815a613" @@ -20487,6 +21003,11 @@ trim@0.0.1: resolved "https://registry.yarnpkg.com/trim/-/trim-0.0.1.tgz#5858547f6b290757ee95cccc666fb50084c460dd" integrity sha1-WFhUf2spB1fulczMZm+1AITEYN0= +trivial-deferred@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/trivial-deferred/-/trivial-deferred-1.0.1.tgz#376d4d29d951d6368a6f7a0ae85c2f4d5e0658f3" + integrity sha1-N21NKdlR1jaKb3oK6FwvTV4GWPM= + trough@^1.0.0: version "1.0.4" resolved "https://registry.yarnpkg.com/trough/-/trough-1.0.4.tgz#3b52b1f13924f460c3fbfd0df69b587dbcbc762e" @@ -20515,6 +21036,17 @@ ts-jest@^24.1.0: semver "^5.5" yargs-parser "10.x" +ts-node@^8.5.2: + version "8.10.2" + resolved "https://registry.yarnpkg.com/ts-node/-/ts-node-8.10.2.tgz#eee03764633b1234ddd37f8db9ec10b75ec7fb8d" + integrity sha512-ISJJGgkIpDdBhWVu3jufsWpK3Rzo7bdiIXJjQc0ynKxVOVcg2oIrf2H2cejminGrptVc6q6/uynAHNCuWGbpVA== + dependencies: + arg "^4.1.0" + diff "^4.0.1" + make-error "^1.1.1" + source-map-support "^0.5.17" + yn "3.1.1" + ts-node@^8.8.1, ts-node@^8.8.2: version "8.10.1" resolved "https://registry.yarnpkg.com/ts-node/-/ts-node-8.10.1.tgz#77da0366ff8afbe733596361d2df9a60fc9c9bd3" @@ -20813,6 +21345,14 @@ unicode-canonical-property-names-ecmascript@^1.0.4: resolved "https://registry.yarnpkg.com/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-1.0.4.tgz#2619800c4c825800efdd8343af7dd9933cbe2818" integrity sha512-jDrNnXWHd4oHiTZnx/ZG7gtUTVp+gCcTTKr8L0HjlwphROEW3+Him+IpvC+xcJEFegapiMZyZe02CyuOnRmbnQ== +unicode-length@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/unicode-length/-/unicode-length-2.0.2.tgz#e5eb4c0d523fdf7bebb59ca261c9ca1cf732da96" + integrity sha512-Ph/j1VbS3/r77nhoY2WU0GWGjVYOHL3xpKp0y/Eq2e5r0mT/6b649vm7KFO6RdAdrZkYLdxphYVgvODxPB+Ebg== + dependencies: + punycode "^2.0.0" + strip-ansi "^3.0.1" + unicode-match-property-ecmascript@^1.0.4: version "1.0.4" resolved "https://registry.yarnpkg.com/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-1.0.4.tgz#8ed2a32569961bce9227d09cd3ffbb8fed5f020c" @@ -21269,6 +21809,11 @@ vinyl@^2.0.0, vinyl@^2.2.0: remove-trailing-separator "^1.0.1" replace-ext "^1.0.0" +vlq@^0.2.1: + version "0.2.3" + resolved "https://registry.yarnpkg.com/vlq/-/vlq-0.2.3.tgz#8f3e4328cf63b1540c0d67e1b2778386f8975b26" + integrity sha512-DRibZL6DsNhIgYQ+wNdWDL2SL3bKPlVrRiBqV5yuMm++op8W4kGFtaQfCs4KEJn0wBZcHVHJ3eoywX8983k1ow== + vm-browserify@^1.0.1: version "1.1.2" resolved "https://registry.yarnpkg.com/vm-browserify/-/vm-browserify-1.1.2.tgz#78641c488b8e6ca91a75f511e7a3b32a86e5dda0" @@ -21747,21 +22292,21 @@ which-pm-runs@^1.0.0: resolved "https://registry.yarnpkg.com/which-pm-runs/-/which-pm-runs-1.0.0.tgz#670b3afbc552e0b55df6b7780ca74615f23ad1cb" integrity sha1-Zws6+8VS4LVd9rd4DKdGFfI60cs= -which@1, which@1.3.1, which@^1.2.14, which@^1.2.9, which@^1.3.0, which@^1.3.1: +which@1, which@^1.2.14, which@^1.2.9, which@^1.3.0, which@^1.3.1: version "1.3.1" resolved "https://registry.yarnpkg.com/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a" integrity sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ== dependencies: isexe "^2.0.0" -which@^2.0.1: +which@^2.0.1, which@^2.0.2: version "2.0.2" resolved "https://registry.yarnpkg.com/which/-/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1" integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA== dependencies: isexe "^2.0.0" -wide-align@1.1.3, wide-align@^1.1.0: +wide-align@^1.1.0: version "1.1.3" resolved "https://registry.yarnpkg.com/wide-align/-/wide-align-1.1.3.tgz#ae074e6bdc0c14a431e804e624549c633b000457" integrity sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA== @@ -21775,6 +22320,13 @@ widest-line@^2.0.0, widest-line@^2.0.1: dependencies: string-width "^2.1.1" +widest-line@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/widest-line/-/widest-line-3.1.0.tgz#8292333bbf66cb45ff0de1603b136b7ae1496eca" + integrity sha512-NsmoXalsWVDMGupxZ5R08ka9flZjjiLvHVAWYOKtiKM8ujtZWr9cRffak+uSE48+Ob8ObalXpwyeUiyDD6QFgg== + dependencies: + string-width "^4.0.0" + windows-release@^3.1.0: version "3.2.0" resolved "https://registry.yarnpkg.com/windows-release/-/windows-release-3.2.0.tgz#8122dad5afc303d833422380680a79cdfa91785f" @@ -21831,7 +22383,7 @@ wrap-ansi@^4.0.0: string-width "^2.1.1" strip-ansi "^4.0.0" -wrap-ansi@^5.1.0: +wrap-ansi@^5.0.0, wrap-ansi@^5.1.0: version "5.1.0" resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-5.1.0.tgz#1fd1f67235d5b6d0fee781056001bfb694c03b09" integrity sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q== @@ -21840,6 +22392,15 @@ wrap-ansi@^5.1.0: string-width "^3.0.0" strip-ansi "^5.0.0" +wrap-ansi@^6.2.0: + version "6.2.0" + resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-6.2.0.tgz#e9393ba07102e6c91a3b221478f0257cd2856e53" + integrity sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA== + dependencies: + ansi-styles "^4.0.0" + string-width "^4.1.0" + strip-ansi "^6.0.0" + wrappy@1: version "1.0.2" resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" @@ -21863,7 +22424,7 @@ write-file-atomic@^2.0.0, write-file-atomic@^2.3.0, write-file-atomic@^2.4.2: imurmurhash "^0.1.4" signal-exit "^3.0.2" -write-file-atomic@^3.0.0: +write-file-atomic@^3.0.0, write-file-atomic@^3.0.1: version "3.0.3" resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-3.0.3.tgz#56bd5c5a5c70481cd19c571bd39ab965a5de56e8" integrity sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q== @@ -21999,6 +22560,16 @@ yallist@^3.0.0, yallist@^3.0.2, yallist@^3.0.3: resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.1.1.tgz#dbb7daf9bfd8bac9ab45ebf602b8cbad0d5d08fd" integrity sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g== +yallist@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/yallist/-/yallist-4.0.0.tgz#9bb92790d9c0effec63be73519e11a35019a3a72" + integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A== + +yaml@^1.5.0: + version "1.10.0" + resolved "https://registry.yarnpkg.com/yaml/-/yaml-1.10.0.tgz#3b593add944876077d4d683fee01081bd9fff31e" + integrity sha512-yr2icI4glYaNG+KWONODapy2/jDdMSDnrONSjblABjD9B4Z5LgiircSt8m8sRZFNi08kG9Sm0uSHtEmP3zaEGg== + yaml@^1.7.2: version "1.7.2" resolved "https://registry.yarnpkg.com/yaml/-/yaml-1.7.2.tgz#f26aabf738590ab61efaca502358e48dc9f348b2" @@ -22006,6 +22577,11 @@ yaml@^1.7.2: dependencies: "@babel/runtime" "^7.6.3" +yapool@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/yapool/-/yapool-1.0.0.tgz#f693f29a315b50d9a9da2646a7a6645c96985b6a" + integrity sha1-9pPymjFbUNmp2iZGp6ZkXJaYW2o= + yargs-parser@10.x, yargs-parser@^10.0.0: version "10.1.0" resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-10.1.0.tgz#7202265b89f7e9e9f2e5765e0fe735a905edbaa8" @@ -22013,14 +22589,6 @@ yargs-parser@10.x, yargs-parser@^10.0.0: dependencies: camelcase "^4.1.0" -yargs-parser@13.1.2, yargs-parser@^13.0.0, yargs-parser@^13.1.2: - version "13.1.2" - resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-13.1.2.tgz#130f09702ebaeef2650d54ce6e3e5706f7a4fb38" - integrity sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg== - dependencies: - camelcase "^5.0.0" - decamelize "^1.2.0" - yargs-parser@^11.1.1: version "11.1.1" resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-11.1.1.tgz#879a0865973bca9f6bab5cbdf3b1c67ec7d3bcf4" @@ -22029,6 +22597,14 @@ yargs-parser@^11.1.1: camelcase "^5.0.0" decamelize "^1.2.0" +yargs-parser@^13.0.0, yargs-parser@^13.1.2: + version "13.1.2" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-13.1.2.tgz#130f09702ebaeef2650d54ce6e3e5706f7a4fb38" + integrity sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg== + dependencies: + camelcase "^5.0.0" + decamelize "^1.2.0" + yargs-parser@^13.1.0, yargs-parser@^13.1.1: version "13.1.1" resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-13.1.1.tgz#d26058532aa06d365fe091f6a1fc06b2f7e5eca0" @@ -22067,15 +22643,6 @@ yargs-parser@^9.0.2: dependencies: camelcase "^4.1.0" -yargs-unparser@1.6.0: - version "1.6.0" - resolved "https://registry.yarnpkg.com/yargs-unparser/-/yargs-unparser-1.6.0.tgz#ef25c2c769ff6bd09e4b0f9d7c605fb27846ea9f" - integrity sha512-W9tKgmSn0DpSatfri0nx52Joq5hVXgeLiqR/5G0sZNDoLZFOr/xjBUDcShCOGNsBnEMNo1KAMBkTej1Hm62HTw== - dependencies: - flat "^4.1.0" - lodash "^4.17.15" - yargs "^13.3.0" - yargs@12.0.5: version "12.0.5" resolved "https://registry.yarnpkg.com/yargs/-/yargs-12.0.5.tgz#05f5997b609647b64f66b81e3b4b10a368e7ad13" @@ -22111,22 +22678,6 @@ yargs@13.2.4: y18n "^4.0.0" yargs-parser "^13.1.0" -yargs@13.3.2, yargs@^13.2.2: - version "13.3.2" - resolved "https://registry.yarnpkg.com/yargs/-/yargs-13.3.2.tgz#ad7ffefec1aa59565ac915f82dccb38a9c31a2dd" - integrity sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw== - dependencies: - cliui "^5.0.0" - find-up "^3.0.0" - get-caller-file "^2.0.1" - require-directory "^2.1.1" - require-main-filename "^2.0.0" - set-blocking "^2.0.0" - string-width "^3.0.0" - which-module "^2.0.0" - y18n "^4.0.0" - yargs-parser "^13.1.2" - yargs@^11.1.0: version "11.1.1" resolved "https://registry.yarnpkg.com/yargs/-/yargs-11.1.1.tgz#5052efe3446a4df5ed669c995886cc0f13702766" @@ -22145,6 +22696,22 @@ yargs@^11.1.0: y18n "^3.2.1" yargs-parser "^9.0.2" +yargs@^13.2.2: + version "13.3.2" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-13.3.2.tgz#ad7ffefec1aa59565ac915f82dccb38a9c31a2dd" + integrity sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw== + dependencies: + cliui "^5.0.0" + find-up "^3.0.0" + get-caller-file "^2.0.1" + require-directory "^2.1.1" + require-main-filename "^2.0.0" + set-blocking "^2.0.0" + string-width "^3.0.0" + which-module "^2.0.0" + y18n "^4.0.0" + yargs-parser "^13.1.2" + yargs@^13.3.0: version "13.3.0" resolved "https://registry.yarnpkg.com/yargs/-/yargs-13.3.0.tgz#4c657a55e07e5f2cf947f8a366567c04a0dedc83" @@ -22207,6 +22774,13 @@ yn@3.1.1: resolved "https://registry.yarnpkg.com/yn/-/yn-3.1.1.tgz#1e87401a09d767c1d5eab26a6e4c185182d2eb50" integrity sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q== +yoga-layout-prebuilt@^1.9.3: + version "1.9.6" + resolved "https://registry.yarnpkg.com/yoga-layout-prebuilt/-/yoga-layout-prebuilt-1.9.6.tgz#98dde95bbf8e6e12835876e9305f1e995c4bb801" + integrity sha512-Wursw6uqLXLMjBAO4SEShuzj8+EJXhCF71/rJ7YndHTkRAYSU0GY3OghRqfAk9HPUAAFMuqp3U1Wl+01vmGRQQ== + dependencies: + "@types/yoga-layout" "1.9.2" + yup@^0.26.10: version "0.26.10" resolved "https://registry.yarnpkg.com/yup/-/yup-0.26.10.tgz#3545839663289038faf25facfc07e11fd67c0cb1"