diff --git a/.gitignore b/.gitignore index b07b458..6eec187 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,3 @@ node_modules/ lib/ - +.DS_Store diff --git a/package.json b/package.json index 518044a..c3677ad 100644 --- a/package.json +++ b/package.json @@ -8,7 +8,7 @@ "status": "node lib/status" }, "dependencies": { - "@joystream/types": "^0.9.1", + "@joystream/types": "^0.10.0", "@polkadot/api": "^0.96.1", "@polkadot/keyring": "^1.7.0-beta.5", "@polkadot/types": "^0.96.1", diff --git a/src/tokenomics/functions.ts b/src/tokenomics/functions.ts new file mode 100644 index 0000000..11e9ac9 --- /dev/null +++ b/src/tokenomics/functions.ts @@ -0,0 +1,522 @@ +import { ApiPromise } from "@polkadot/api" +import { PoolTopup, ExchangeInfo, OverviewCouncil, ValidatorReward, Slashing, OverviewValidation, OverviewStorage, OverviewCurators, ActiveProposal, PoolStatus, PoolChangeHistory, OverviewProposal, OverviewGeneral, VoteStatus } from "./interfaces" +import { Hash, Balance, Proposal, Moment, BlockNumber } from "@polkadot/types/interfaces" +import { Seats, Active, ProposalStatus, VotingResults, ProposalDetails, SpendingParams, Finalized, ProposalDecisionStatus, Approved, ActiveStake } from "@joystream/types/lib/proposals" +import { MemberId } from "@joystream/types/lib/members" +import { Vec, Option, Tuple, Enum } from '@polkadot/types/codec'; +import { MintId } from "@joystream/types/lib/mint" +import { RewardRelationshipId, Recipient } from "@joystream/types/lib/recurring-rewards" +import { RoleParameters } from "@joystream/types/lib/roles" +import AccountId from "@polkadot/types/primitive/Generic/AccountId" +import { Curator, CuratorRoleStage, CuratorInduction, CuratorExitSummary, CuratorApplication, ChannelId } from "@joystream/types/lib/content-working-group" +import { u32 } from "@polkadot/types" +import { StakeId, Stake, Staked } from "@joystream/types/lib/stake" +import { PostId, CategoryId } from "@joystream/types/lib/forum" +import { EntityId } from "@joystream/types/lib/versioned-store" + +export async function getProposalVotingData(api: ApiPromise, lastBlockHash: Hash, proposalIds:number[], activeProposals: ActiveProposal[]): Promise { + const proposals = activeProposals + for (let index in proposalIds) { + const proposalInfo = await api.query.proposalsEngine.proposals.at(lastBlockHash,proposalIds[index]) as Proposal + const proposalStatus = proposalInfo.get("status") as ProposalStatus + const voteStatus = proposalInfo.get("votingResults") as VotingResults + const votingResults: VoteStatus = { + abstensions: (voteStatus.get("abstensions") as u32).toNumber(), + approvals: (voteStatus.get("approvals") as u32).toNumber(), + rejections: (voteStatus.get("rejections") as u32).toNumber(), + slashes: (voteStatus.get("slashes") as u32).toNumber() + } + proposals[index].votingResults = votingResults + if (proposalStatus.value instanceof Active) { + proposals[index].status = proposalStatus.type + } + } + return proposals +} + +export async function getActiveProposals(api: ApiPromise, firstBlockHash: Hash): Promise { + const proposalsAtStart = await api.query.proposalsEngine.proposalCount.at(firstBlockHash) as u32 + const activeProposalsAtStart: ActiveProposal[] = [] + for (let i=1; i { + let activeProposalsAtStart = 0 + let activeProposalsAtEnd = 0 + let fundingCosts = 0 + let feesPaid = 0 + let slashAmount = 0 + let proposalsAddedInRange = 0 + let proposalsFinalizedInRange = 0 + for (let i=0;i { + let totalAddedToPool = 0 + let status = topUps[topUps.length-1] + getStatus: + for (let i=0; i firstBlock) { + status = topUps[i-1] + break getStatus + } else { + totalAddedToPool += topUps[i].change + } + } + let totalTokensBurned = 0 + let totalExchangesMade = 0 + let poolSize = status.mintAfter + for (let i=0; i status.blockHeight) { + const blockHash: Hash = await api.rpc.chain.getBlockHash(blockHeight-1) + const issuance = await api.query.balances.totalIssuance.at(blockHash) as Balance + const balanceOfAccount = await api.query.balances.freeBalance.at(blockHash,burnAddress) as Balance + const calculatedIssuance = issuance.toNumber()-balanceOfAccount.toNumber() + const poolDrain = (poolSize/calculatedIssuance)*tokensBurned + poolSize -= poolDrain + } + } + } + const blockHash: Hash = await api.rpc.chain.getBlockHash(firstBlock) + const issuance = (await api.query.balances.totalIssuance.at(blockHash) as Balance).toNumber() + const poolStart: PoolStatus = { + blockHeight: firstBlock, + issuance: issuance, + poolSize: poolSize, + rate: poolSize/issuance, + totalAddedToFiatPool: totalAddedToPool, + totalExchangesMade: totalExchangesMade, + totalTokensBurned: totalTokensBurned, + totalCashedOut: totalAddedToPool-poolSize, + addedToFiatPoolInRange: 0, + exchangesMadeInRange: 0, + tokensExchangedInRange: 0, + cashedOutInRange: 0, + poolChangesInRange: [], + } + return poolStart +} + +export async function getGeneralOverview(api: ApiPromise, firstBlockHash:Hash,lastBlockHash:Hash): Promise { + const forumCategoriesAtStart = await api.query.forum.nextCategoryId.at(firstBlockHash) as CategoryId; + const forumCategoriesAtEnd = await api.query.forum.nextCategoryId.at(lastBlockHash) as CategoryId; + const newCategories = forumCategoriesAtEnd.toNumber()-forumCategoriesAtStart.toNumber() + const forumPostsAtStart = await api.query.forum.nextPostId.at(firstBlockHash) as PostId; + const forumPostsAtEnd = await api.query.forum.nextPostId.at(lastBlockHash) as PostId; + const newPosts = forumPostsAtEnd.toNumber()-forumPostsAtStart.toNumber() + const channelsAtStart = await api.query.contentWorkingGroup.nextChannelId.at(firstBlockHash) as ChannelId; + const channelsAtEnd = await api.query.contentWorkingGroup.nextChannelId.at(lastBlockHash) as ChannelId; + const newChannels = channelsAtEnd.toNumber()-channelsAtStart.toNumber() + const entitiesAtStart = await api.query.versionedStore.nextEntityId.at(firstBlockHash) as EntityId; + const entitiesAtEnd = await api.query.versionedStore.nextEntityId.at(lastBlockHash) as EntityId; + const newEntities = entitiesAtEnd.toNumber()-entitiesAtStart.toNumber() + const membersAtStart = await api.query.members.membersCreated.at(firstBlockHash) as MemberId; + const membersAtEnd = await api.query.members.membersCreated.at(lastBlockHash) as MemberId; + const newMembers = membersAtEnd.toNumber()-membersAtStart.toNumber() + const generalData: OverviewGeneral = { + newCategories: newCategories, + newPosts: newPosts, + newChannels: newChannels, + newEntities: newEntities, + newMembers: newMembers, +} +return generalData +} + + +export async function getPoolEnd(api: ApiPromise, burnAddress:string,lastBlock:number, poolStart: PoolStatus, topUps:PoolTopup[], newExchanges: ExchangeInfo[]): Promise { + const firstBlock = poolStart.blockHeight + let poolSize = poolStart.poolSize + let addedToFiatPoolInRange = 0 + let exchangesMadeInRange = 0 + let tokensExchangedInRange = 0 + let cashedOutInRange = 0 + const topUpSize: number[] = [] + const mintAfterTopUp: number[] = [] + const topUpHeight: number[] = [] + const poolChanges: PoolChangeHistory[] = [] + for (let i=0; i firstBlock && topUps[i].blockHeight <= lastBlock) { + topUpSize.push(topUps[i].change) + mintAfterTopUp.push(topUps[i].mintAfter) + topUpHeight.push(topUps[i].blockHeight) + } + } + for (let i=0; i { + let firstValRewardHeight = 0 + let lastValRewardHeight = 1 + let sharedRewards = 0 + let remainingRewards = 0 + let slotStakes = 0 + let validators = 0 + let averageStakeRatios = 0 + if (validationRewards.length>0) { + firstValRewardHeight = validationRewards[0].blockHeight-validationRewards[0].blocksInEra + lastValRewardHeight = validationRewards[validationRewards.length-1].blockHeight + for (let i=0; i0) { + for (let i=0; i { + const lastHashOfTerm: Hash = await api.rpc.chain.getBlockHash(blockHeight) + const getCouncilStart = await api.query.council.activeCouncil.at(firstBlockHash) as Seats + const councilMintId = (await api.query.council.councilMint.at(firstBlockHash) as Option).unwrap() + const councilMintInfoStart = await api.query.minting.mints.at(firstBlockHash,councilMintId) as any + const councilMintInfoEnd = await api.query.minting.mints.at(lastHash,councilMintId) as any + const councilMintSpent = councilMintInfoEnd[0].get("total_minted").toNumber() - councilMintInfoStart[0].get("total_minted").toNumber() + const councilMemberAtStart = [] + let totalStakeAtStart = 0 + let ownStakeAtStart = 0 + let rewardsPaid = 0 + let rewardsMissed = 0 + for (let i=0; i + const ownStakeOfCM = getCouncilStart[i].stake.toNumber() + let backersStake = 0 + const rewardId = await api.query.council.rewardRelationships.at(firstBlockHash,accountIdOfMember) as RewardRelationshipId + const rewardStart = (await api.query.recurringRewards.recipients.at(firstBlockHash,rewardId) as Tuple)[0] as Recipient + const rewardAtStart = rewardStart.total_reward_received.toNumber() + const rewardMissedAtStart = rewardStart.total_reward_missed.toNumber() + const rewardEnd = (await api.query.recurringRewards.recipients.at(lastHashOfTerm,rewardId) as Tuple)[0] as Recipient + const rewardAtEnd = rewardEnd.total_reward_received.toNumber() + const rewardMissedAtEnd = rewardEnd.total_reward_missed.toNumber() + for (let n=0; n { + let estimateOfStorageSpend = 0 + const storageProvidersStart = await api.query.actors.actorAccountIds.at(firstBlockHash) as Vec + const storageProvidersEnd = await api.query.actors.actorAccountIds.at(lastBlockHash) as Vec + const storageStakeParameters = (await api.query.actors.parameters.at(lastBlockHash,"StorageProvider") as Option).unwrap(); + const stake = storageStakeParameters.reward.toNumber() + const totalStake = storageProvidersEnd.length*stake + for (let blockHeight=firstBlock; blockHeight + const storageParameters = (await api.query.actors.parameters.at(blockHash,"StorageProvider") as Option).unwrap(); + const reward = storageParameters.reward.toNumber() + const rewardPeriod = storageParameters.reward_period.toNumber() + estimateOfStorageSpend += storageProviders.length*reward*rewardPeriod/600 + } + const storageStats: OverviewStorage = { + storageProvidersAtStart: storageProvidersStart.length, + storageProvidersAtEnd: storageProvidersEnd.length, + storageStakeAtEnd: totalStake, + feesPaid: storageFees, + estimateOfStorageSpend: estimateOfStorageSpend, + netStorageProviderSpend: estimateOfStorageSpend-storageFees, + } + return storageStats +} + + +export async function getCuratorOverview(api: ApiPromise, firstBlock: number, firstBlockHash:Hash, lastBlock: number, lastBlockHash: Hash): Promise { + let curators = 0 + let inductionHeight = 1 + let rewardsEarned = 0 + let rewardsMissed = 0 + let numberOfCuratorsAtStart = 0 + let numberOfCuratorsAtEnd = 0 + let curatorsHired = 0 + let curatorsFiredOrQuit = 0 + const curatorGroup = [] + const curatorMintId = await api.query.contentWorkingGroup.mint.at(firstBlockHash) as MintId + const curatorMintInfoStart = await api.query.minting.mints.at(firstBlockHash,curatorMintId) as any + const curatorMintInfoEnd = await api.query.minting.mints.at(lastBlockHash,curatorMintId) as any + const curatorMintSpent = curatorMintInfoEnd[0].get("total_minted").toNumber() - curatorMintInfoStart[0].get("total_minted").toNumber() + + while (inductionHeight > 0) { + const curatorEnd = (await api.query.contentWorkingGroup.curatorById.at(lastBlockHash, curators) as Tuple)[0] as Curator + inductionHeight = (curatorEnd.induction as CuratorInduction).at_block.toNumber() + if (inductionHeight == 0) { + break + } + const curatorStart = (await api.query.contentWorkingGroup.curatorById.at(firstBlockHash, curators) as Tuple)[0] as Curator + const curatorStageStart = (curatorStart.stage as CuratorRoleStage).value as Enum + const curatorStageEnd = (curatorEnd.stage as CuratorRoleStage).value as Enum + if (!(curatorStageStart instanceof CuratorExitSummary) || inductionHeight > firstBlock) { + let activeCurator = true + let rewardStartBlockHash = firstBlockHash + let rewardEndBlockHash = lastBlockHash + if (inductionHeight > firstBlock) { + rewardStartBlockHash = await api.rpc.chain.getBlockHash(inductionHeight) + curatorsHired += 1 + } else { + numberOfCuratorsAtStart += 1 + } + if (curatorStageEnd instanceof CuratorExitSummary) { + const rewardEndBlock = (((curatorStageEnd.value as CuratorExitSummary).get("initiated_at_block_number") as u32).toNumber()) + rewardEndBlockHash = await api.rpc.chain.getBlockHash(rewardEndBlock) + activeCurator = false + curatorsFiredOrQuit += 1 + } else { + numberOfCuratorsAtEnd += 1 + } + const curatorApplicationId = (curatorEnd.induction as CuratorInduction).curator_application_id + const memberId = ((await api.query.contentWorkingGroup.curatorApplicationById.at(lastBlockHash,curatorApplicationId) as Tuple)[0] as CuratorApplication).member_id + + const accountIdOfCurator = curatorEnd.role_account + const rewardRelationship = curatorEnd.reward_relationship.unwrap() + const rewardStart = (await api.query.recurringRewards.recipients.at(rewardStartBlockHash,rewardRelationship) as Tuple)[0] as Recipient + const rewardAtStart = rewardStart.total_reward_received.toNumber() + const rewardMissedAtStart = rewardStart.total_reward_missed.toNumber() + const rewardEnd = (await api.query.recurringRewards.recipients.at(rewardEndBlockHash,rewardRelationship) as Tuple)[0] as Recipient + const rewardAtEnd = rewardEnd.total_reward_received.toNumber() + const rewardMissedAtEnd = rewardEnd.total_reward_missed.toNumber() + + rewardsEarned += rewardAtEnd-rewardAtStart + rewardsMissed += rewardMissedAtEnd-rewardMissedAtStart + + + + curatorGroup.push({ + roleAccount:accountIdOfCurator.toString(), + memberId: memberId.toNumber(), + hiredAt: inductionHeight, + curatorApplicationId: curatorApplicationId.toNumber(), + active: activeCurator, + rewardRelationship: rewardRelationship.toNumber(), + rewardsInRange: rewardAtEnd-rewardAtStart, + rewardsMissedInRange: rewardMissedAtEnd-rewardMissedAtStart + }) + } + curators ++ + } + const curatorStats: OverviewCurators = { + curatorGroup: curatorGroup, + numberOfCuratorsAtStart: numberOfCuratorsAtStart, + numberOfCuratorsAtEnd: numberOfCuratorsAtEnd, + curatorsHired: curatorsHired, + curatorsFiredOrQuit: curatorsFiredOrQuit, + curatorMintSpent: curatorMintSpent, + rewardsEarned: rewardsEarned, + rewardsMissed: rewardsMissed, + } + return curatorStats +} \ No newline at end of file diff --git a/src/tokenomics/get-history-events.ts b/src/tokenomics/get-history-events.ts new file mode 100644 index 0000000..5810e23 --- /dev/null +++ b/src/tokenomics/get-history-events.ts @@ -0,0 +1,156 @@ +// @ts-check + +import { VoteKind } from '@joystream/types'; +import { Hash, EraIndex, SessionIndex, AccountId, Balance, Proposal, BlockNumber, EventRecord } from "@polkadot/types/interfaces"; +import { MemberId, Role } from '@joystream/types/lib/members'; +import { ProposalId, ProposalDetails, ProposalStatus, Finalized, Approved, ProposalDecisionStatus, SpendingParams, Active, ActiveStake } from '@joystream/types/lib/proposals'; +import { PoolChangeHistory, ValidatorReward, Slashing, Voters, ActiveProposal } from './interfaces'; +import { EventData } from '@polkadot/types/primitive/Generic/Event'; +import { ApiPromise } from '@polkadot/api'; +import { RoleParameters } from '@joystream/types/lib/roles'; +import { Option, Tuple } from '@polkadot/types/codec'; +import { Vec } from '@polkadot/types/codec'; +import { StakeId, Stake, Staked } from '@joystream/types/lib/stake'; + +export async function getCashouts(api: ApiPromise, event: EventData, poolStart: PoolChangeHistory, oldHash:Hash, blockHeight: number): Promise { + const amountJOY = event[2] as Balance; + const oldIssuance = await api.query.balances.totalIssuance.at(oldHash) as Balance; + const poolChange = -amountJOY.toNumber()*poolStart.oldPool/oldIssuance.toNumber(); + const exchange: PoolChangeHistory = { + blockHeight: blockHeight, + poolChange: poolChange, + oldPool: poolStart.oldPool, + newPool: poolStart.oldPool+poolChange, + tokensBurned: amountJOY.toNumber(), + issuanceBefore: oldIssuance.toNumber(), + issuanceAfter: oldIssuance.toNumber()-amountJOY.toNumber() + } + return exchange +} +export async function getLastStakingRewardHeight(api: ApiPromise, firstBlock: number): Promise { + let lastRewardHeight = firstBlock-600 + getFirstHeight: + for (let blockHeight=firstBlock; blockHeight>firstBlock-600; blockHeight--) { + const blockHash: Hash = await api.rpc.chain.getBlockHash(blockHeight) + const events = await api.query.system.events.at(blockHash) as Vec; + for (let { event } of events) { + if (event.section === 'staking' && event.method === 'Reward') { + lastRewardHeight = blockHeight + break getFirstHeight + } + } + }; + return lastRewardHeight +} + +export async function getStakingRewards(api: ApiPromise, event: EventData, oldHash:Hash, blockHeight: number, lastRewardHeight: number, era: EraIndex, session: SessionIndex): Promise { + const sharedReward = event[0] as Balance; + const remainingReward = event[1] as Balance; + const oldSlotStake = await api.query.staking.slotStake.at(oldHash) as Balance; + const oldIssuance = await api.query.balances.totalIssuance.at(oldHash) as Balance; + const oldValidatorInfo = await api.query.staking.currentElected.at(oldHash) as AccountId; + const valReward: ValidatorReward = { + sharedReward: sharedReward.toNumber(), + remainingReward: remainingReward.toNumber(), + slotStake: oldSlotStake.toNumber(), + validators: oldValidatorInfo.length, + issuance: oldIssuance.toNumber(), + stakeRatio: (oldSlotStake.toNumber()*oldValidatorInfo.length)/oldIssuance.toNumber(), + blockHeight: blockHeight, + blocksInEra: blockHeight-lastRewardHeight, + session: session.toNumber(), + era: era.toNumber() + }; + return valReward +} + +export async function getSlash(event: EventData, blockHeight: number, era: EraIndex, session: SessionIndex): Promise { + const validatorStash = event[0] as AccountId; + const slashedAmount = event[1] as Balance; + const slash: Slashing = { + validatorStash: validatorStash.toString(), + slashedAmount: slashedAmount.toNumber(), + blockHeight: blockHeight, + session: session.toNumber(), + era: era.toNumber() + }; + return slash +} + +export async function getProposalCreated(api: ApiPromise, proposalId: ProposalId, blockHash:Hash): Promise { + const proposalData = await api.query.proposalsEngine.proposals.at(blockHash,proposalId) as Proposal; + const proposalStatus = proposalData.get("status") as ProposalStatus + const proposalsDetails = await api.query.proposalsCodex.proposalDetailsByProposalId.at(blockHash,proposalId) as ProposalDetails + const activeProposal: ActiveProposal = { + id: proposalId.toNumber(), + type: proposalsDetails.type.toString(), + title: proposalData.get("title")?.toString(), + createdBy: (proposalData.get("proposerId") as MemberId).toNumber(), + created: (proposalData.get("createdAt") as BlockNumber).toNumber(), + statusAtStart: proposalStatus.type, + voters: [], + status: proposalStatus.type, + }; + if (proposalsDetails.value instanceof SpendingParams) { + activeProposal.spending = (proposalsDetails.value[0] as Balance).toNumber() + } + if (proposalStatus.value instanceof Active) { + const stakeId = ((proposalStatus.value.value) as ActiveStake).get("stakeId") as StakeId + const stakeData = (await api.query.stake.stakes.at(blockHash,stakeId) as Tuple)[0] as Stake + activeProposal.stakeId = stakeId.toNumber() + activeProposal.stake = (stakeData.staking_status.value as Staked).staked_amount.toNumber() + } + return activeProposal +} + +export async function getVote(event: EventData, blockHeight: number): Promise { + const memberId = event[0] as MemberId; + const voteKind = event[2] as VoteKind; + const vote: Voters = { + voter: memberId.toNumber(), + vote: voteKind.toString(), + blockNumber: blockHeight + }; + return vote +} + +export async function getProposalStatusUpdated(event: EventData, proposals: ActiveProposal[], proposalIds: number[], blockHeight: number): Promise { + const proposalId = event[0] as ProposalId + const proposalStatus = event[1] as ProposalStatus + if (proposalIds.includes(proposalId.toNumber())) { + const index = proposalIds.indexOf(proposalId.toNumber()) + if (proposalStatus.value instanceof Finalized) { + proposals[index].status = proposalStatus.type + proposals[index].finalizedAt = blockHeight + const decision = proposalStatus.value.get("proposalStatus") as ProposalDecisionStatus + proposals[index].result = decision.type + if (decision.value instanceof Approved) { + proposals[index].executionStatus = decision.value.type + if (decision.value.toString()!=="PendingExecution") { + proposals[index].executedAt = blockHeight + } + } else { + if (decision.type === "Canceled" ||decision.type === "Cancelled") { + proposals[index].feePaid = 10000 + } else if (decision.type === "Rejected" || decision.type === "Expired") { + proposals[index].feePaid = 5000 + } else if (decision.type === "Slashed") { + if (proposals[index].stake) { + proposals[index].feePaid = proposals[index].stake + } + } + } + } + } + return proposals +} + +export async function getActorJoined(api: ApiPromise, event: EventData, blockHash: Hash): Promise { + const role = event[1] as Role + let fee = 0 + if (role.toString()==="StorageProvider") { + const storageParameters = (await api.query.actors.parameters.at(blockHash,"StorageProvider") as Option).unwrap(); + fee += storageParameters.entry_request_fee.toNumber() + } + return fee +} \ No newline at end of file diff --git a/src/tokenomics/get-tokenomics-history.ts b/src/tokenomics/get-tokenomics-history.ts new file mode 100644 index 0000000..1dc702f --- /dev/null +++ b/src/tokenomics/get-tokenomics-history.ts @@ -0,0 +1,246 @@ +// @ts-check + +import { ApiPromise, WsProvider } from '@polkadot/api'; +import { registerJoystreamTypes } from '@joystream/types'; +import { Hash, EraIndex, SessionIndex, EventRecord, AccountId, Balance, BlockNumber, Moment, SignedBlock, Extrinsic } from "@polkadot/types/interfaces"; +import { Vec } from '@polkadot/types/codec'; +import { ProposalId, } from '@joystream/types/lib/proposals'; +import { Slashing, OverviewRange, OverviewTokenomics, ValidatorReward, ExchangeInfo } from './interfaces'; +import { getStakingRewards, getSlash, getVote, getProposalCreated, getProposalStatusUpdated, getActorJoined, getLastStakingRewardHeight } from './get-history-events'; +import { topUps, allExchanges } from './pool-changes'; +import { getPoolStart, getValidationOverview, getCouncilOverview, getStorageOverview, getCuratorOverview, getPoolEnd, getActiveProposals, getProposalVotingData, getProposalOverview, getGeneralOverview } from './functions'; + +// Will not work with firstBlock<909252 +// Script is meant to get the data from a single council term, and will not include what happens after a new one is elected +const firstBlock:number = 1442011 +// +let lastBlock = 1442010+100800 +const burnAddress: string = "5D5PhZQNJzcJXVBxwJxZcsutjKPqUPydrvpu6HeiBfMaeKQu" + +async function main () { + // Initialise the provider to connect to the local node + const provider = new WsProvider('ws://127.0.0.1:9944'); + + // register types before creating the api + registerJoystreamTypes(); + + // Create the API and wait until ready + const api = await ApiPromise.create({provider}); + let oldHash: Hash = await api.rpc.chain.getBlockHash(firstBlock-1) + const firstBlockHash: Hash = await api.rpc.chain.getBlockHash(firstBlock) + + let councilElectedAtFirstblock = false + let councilTermEndedBlock = lastBlock + + const valRewards: ValidatorReward[] = [] + const slashings: Slashing[] = [] + let lastValRewardHeight = await getLastStakingRewardHeight(api, firstBlock) + const proposalIds: number[] = [] + let transactionFees = 0 + let storageFees = 0 + let membershipFees = 0 + let balanceTransfers = 0 + let extrinsicTipsPayed = 0 + let actualExchangeBurns = 0 + + + //Get active proposals at start + const activeProposals = await getActiveProposals(api,firstBlockHash) + + //Get fiat pool info at start + const poolStart = await getPoolStart(api, burnAddress, firstBlock, topUps, allExchanges) + const newExchanges: ExchangeInfo[] = [] + + //Iterate through all blocks to get all events (some things are only available this way) + for (let blockHeight=firstBlock; blockHeight; + const getBlock = await api.rpc.chain.getBlock(blockHash) as SignedBlock + // Get extrinsic info + const extrinsicsInBlock = getBlock.block.extrinsics as Vec + for (let i=0; i0) { + if (extrinsicsInBlock[i].signer.toString() === burnAddress) { + actualExchangeBurns += extrinsicsInBlock[i].tip.toNumber() + } else { + extrinsicTipsPayed += extrinsicsInBlock[i].tip.toNumber() + } + } + // Get tokens burned from tx fees + if ( + sectionName === "actors" || sectionName ==="contentWorkingGroup" || sectionName === "councilElection" || + sectionName === "dataDirectory" || sectionName === "dataObjectStorageRegistry" || sectionName === "discovery" || + sectionName === "forum" || sectionName === "memo" || sectionName === "proposalsCodex" || + sectionName === "proposalsDiscussion" || sectionName === "proposalsEngine" || sectionName === "staking" || + sectionName === "versionedStorePermissions" || + (sectionName === "members" && methodName !== "buyMembership") || + (sectionName === "session" && methodName=== "setKeys") + ) { + transactionFees ++ + // Get tokens burned from membership purchases + } else if (sectionName === "members" && methodName=== "buyMembership") { + transactionFees ++ + membershipFees += 100 + } + } + for (let { event } of events) { + + //Get exchanges + if (event.section === 'balances' && event.method === 'Transfer') { + balanceTransfers ++ + transactionFees ++ + const recipient = event.data[1] as AccountId; + if (recipient.toString() === burnAddress) { + const amountJOY = event.data[2] as Balance; + const newExchange:ExchangeInfo = { + amount: amountJOY.toNumber(), + tokensRecievedAtBlock: blockHeight, + } + newExchanges.push(newExchange) + } + + //Get validator rewards + } else if (event.section === 'staking' && event.method === 'Reward') { + if (valRewards.length>0) { + lastValRewardHeight = valRewards[valRewards.length-1].blockHeight + } + valRewards.push(await getStakingRewards(api, event.data, oldHash, blockHeight, lastValRewardHeight, era, session)) + + //Get validator slashes + } else if (event.section === 'staking' && event.method === 'Slash') { + slashings.push(await getSlash(event.data, blockHeight, era, session)) + + //Get new proposals + } else if (event.section === 'proposalsEngine' && event.method === 'ProposalCreated') { + const proposalId = event.data[1] as ProposalId + proposalIds.push(proposalId.toNumber()) + activeProposals.push(await getProposalCreated(api, proposalId, blockHash)) + + //Get proposal votes + } else if (event.section === 'proposalsEngine' && event.method === 'Voted') { + const proposalId = event.data[1] as ProposalId + for (let proposal in activeProposals) { + if (activeProposals[proposal].id === proposalId.toNumber() ) { + activeProposals[proposal].voters.push(await getVote(event.data, blockHeight)) + } + } + //Get changes in the status of a proposal + } else if (event.section === 'proposalsEngine' && event.method === 'ProposalStatusUpdated') { + await getProposalStatusUpdated(event.data, activeProposals, proposalIds, blockHeight) + + //Get all storage signup fees + } else if (event.section === 'actors' && event.method === 'Staked') { + storageFees += await getActorJoined(api, event.data, blockHash); + + //If a new council is elected, sets lastBlock to this height + } else if (event.section === 'councilElection' && event.method === 'CouncilElected') { + if (blockHeight>firstBlock) { + lastBlock = (event.data[0] as BlockNumber).toNumber() + console.log("New council elected, ending report generation at block:", lastBlock) + break + } else if ( blockHeight===firstBlock ){ + councilElectedAtFirstblock = true + } + + //Get councilRewards + } else if (event.section === 'council' && event.method === 'CouncilTermEnded') { + councilTermEndedBlock = blockHeight-1 + } + } + oldHash = blockHash + } + + + const lastBlockHash: Hash = await api.rpc.chain.getBlockHash(lastBlock) + const timestampStart = await api.query.timestamp.now.at(firstBlockHash) as Moment; + const timestampEnd = await api.query.timestamp.now.at(lastBlockHash) as Moment; + const startIssuance = await api.query.balances.totalIssuance.at(firstBlockHash) as Balance + const endIssuance = await api.query.balances.totalIssuance.at(lastBlockHash) as Balance + + //Get voting on all proposals + const proposalEnd = await getProposalVotingData(api,lastBlockHash,proposalIds,activeProposals) + + //Get fiat pool info at end + const poolEnd = await getPoolEnd(api,burnAddress,lastBlock,poolStart,topUps,newExchanges) + + const outputRangeStats: OverviewRange = { + startBlock: firstBlock, + endBlock: lastBlock, + blockRange: lastBlock-firstBlock, + timestampStart: new Date(timestampStart.toNumber()), + timestampEnd: new Date(timestampEnd.toNumber()), + totalBalanceTransfers: balanceTransfers, + } + + const councilStats = await getCouncilOverview(api,firstBlockHash, councilElectedAtFirstblock, councilTermEndedBlock, lastBlockHash) + + const storageStats = await getStorageOverview(api, firstBlock, firstBlockHash, lastBlock, lastBlockHash, storageFees) + + const curatorStats = await getCuratorOverview(api, firstBlock, firstBlockHash, lastBlock, lastBlockHash) + + const validatorStats = await getValidationOverview(firstBlock, lastBlock, valRewards, slashings, timestampStart, timestampEnd) + + const proposalStats = await getProposalOverview(proposalEnd) + + const generalStats = await getGeneralOverview(api, firstBlockHash, lastBlockHash) + + const totalRewardsMint = councilStats.councilRewardsPaid+storageStats.netStorageProviderSpend+curatorStats.rewardsEarned+validatorStats.totalRewardsMinted+proposalStats.fundingCosts + + const totalFeesSlashesBurns = transactionFees+membershipFees+extrinsicTipsPayed+poolEnd.tokensExchangedInRange+validatorStats.totalSlashesIncurred+storageStats.feesPaid+proposalStats.feesPaid+proposalStats.slashAmount + + + const tokenomicsStats: OverviewTokenomics = { + startIssuance: startIssuance.toNumber(), + endIssuance: endIssuance.toNumber(), + issuanceDiff: endIssuance.toNumber()-startIssuance.toNumber(), + tokensExchangedInRange: poolEnd.tokensExchangedInRange, + totalValueExchanged: poolEnd.cashedOutInRange, + poolAtStart: poolStart.poolSize, + poolAtEnd: poolEnd.poolSize, + rateAtStart: poolStart.rate, + rateAtEnd: poolEnd.rate, + actualExchangeBurnsInRange: actualExchangeBurns, + extrinsicFeeBurn: transactionFees, + extrinsicTipBurn: extrinsicTipsPayed, + membershipFees: membershipFees, + netValidatorSpend: validatorStats.totalRewardsMinted-validatorStats.totalSlashesIncurred, + netStorageProviderSpend: storageStats.netStorageProviderSpend-storageStats.feesPaid, + netCouncilSpend: councilStats.councilRewardsPaid, + netProposalSpend: proposalStats.fundingCosts-proposalStats.feesPaid-proposalStats.slashAmount, + netCuratorSpend: curatorStats.rewardsEarned, + totalRewardsMinted: totalRewardsMint, + totalFeesSlashesBurns: totalFeesSlashesBurns, + expectedIssuanceDiffNoExchanges: totalRewardsMint-totalFeesSlashesBurns+poolEnd.tokensExchangedInRange, + actualIssuanceDiffNoExchanges: endIssuance.toNumber()-startIssuance.toNumber()+actualExchangeBurns, + } + + console.log("proposalEnd",JSON.stringify(proposalEnd, null, 4)) + + console.log("outputRangeStats",JSON.stringify(outputRangeStats, null, 4)) + + console.log("generalStats",JSON.stringify(generalStats, null, 4)) + + console.log("councilStats",JSON.stringify(councilStats, null, 4)) + + console.log("proposalStats",JSON.stringify(proposalStats, null, 4)) + + console.log("storageStats",JSON.stringify(storageStats, null, 4)) + + console.log("curatorStats",JSON.stringify(curatorStats, null, 4)) + + console.log("validatorStats",JSON.stringify(validatorStats, null, 4)) + + console.log("poolStart",JSON.stringify(poolStart, null, 4)) + + console.log("poolEnd",JSON.stringify(poolEnd, null, 4)) + + console.log("tokenomicsStats",JSON.stringify(tokenomicsStats, null, 4)) + + api.disconnect(); +} +main() \ No newline at end of file diff --git a/src/tokenomics/interfaces.ts b/src/tokenomics/interfaces.ts new file mode 100644 index 0000000..9742167 --- /dev/null +++ b/src/tokenomics/interfaces.ts @@ -0,0 +1,190 @@ +// Tokenomics Specific +export interface Voters { + voter: number, + vote: string, + blockNumber: number +} +export interface VoteStatus { + abstensions: number, + approvals: number, + rejections: number, + slashes: number +} + +export interface ValidatorReward { + sharedReward: number, + remainingReward: number, + slotStake: number, + validators: number, + issuance: number, + stakeRatio: number, + blockHeight: number, + blocksInEra: number + session: number, + era: number, +}; + +export interface Slashing { + validatorStash: string, + slashedAmount: number, + blockHeight: number, + session: number, + era: number +}; + + +export interface ActiveProposal { + id: number, + type: string, + title?: string, + createdBy: number, + stakeId?: number, + stake?: number, + spending?: number, + created: number, + statusAtStart: string, + voters: Voters[], + status: string, + finalizedAt?: number, + result?: string, + feePaid?: number, + votingResults?: VoteStatus, + executionStatus?: string, + executedAt?: number, + execution?: any[] +} + +export interface OverviewGeneral { + newCategories: number, + newPosts: number, + newChannels: number, + newEntities: number, + newMembers: number, +} + +export interface OverviewProposal { + activeProposalsAtStart: number, + activeProposalsAtEnd: number, + fundingCosts: number, + feesPaid: number, + slashAmount: number, + proposalsAddedInRange: number, + proposalsFinalizedInRange: number, +} + +export interface OverviewRange { + startBlock: number, + endBlock: number, + blockRange: number, + timestampStart: Date, + timestampEnd: Date, + totalBalanceTransfers: number, +} + +export interface OverviewCouncil { + councilElectedAtFirstBlock: boolean, + council: any[], + councilOwnStake: number, + councilTotalStake: number, + councilMintSpent: number, + councilSpendingFunded: number, + councilRewardsPaid: number, + councilRewardsMissed: number, +} + +export interface OverviewValidation { + averageValidatorSetSize: number, + averageSlotStake: number, + averageStakeRatio: number, + numberOfRewardPayoutEras: number, + totalRewardsMinted: number, + totalRemainingRewards: number, + numberOfSlashes: number, + totalSlashesIncurred: number, + averageBlockTime: number, +} + +export interface OverviewStorage { + storageProvidersAtStart: number, + storageProvidersAtEnd: number, + storageStakeAtEnd: number, + feesPaid: number, + estimateOfStorageSpend: number, + netStorageProviderSpend: number, +} + +export interface OverviewCurators { + curatorGroup: any[], + numberOfCuratorsAtStart: number, + numberOfCuratorsAtEnd: number, + curatorsHired: number, + curatorsFiredOrQuit: number, + curatorMintSpent: number, + rewardsEarned: number, + rewardsMissed: number, +} + +export interface OverviewTokenomics { + startIssuance: number, + endIssuance: number, + issuanceDiff: number, + tokensExchangedInRange: number, + totalValueExchanged: number, + poolAtStart: number, + poolAtEnd: number, + rateAtStart: number, + rateAtEnd: number, + actualExchangeBurnsInRange: number, + extrinsicFeeBurn: number, + extrinsicTipBurn: number, + membershipFees: number, + netValidatorSpend: number, + netStorageProviderSpend: number, + netCouncilSpend: number, + netProposalSpend: number, + netCuratorSpend: number, + totalRewardsMinted: number, + totalFeesSlashesBurns: number, + expectedIssuanceDiffNoExchanges: number, + actualIssuanceDiffNoExchanges: number, +} + + +export interface PoolStatus { + blockHeight: number, + issuance: number, + poolSize: number, + rate: number, + totalAddedToFiatPool: number, + totalExchangesMade: number, + totalTokensBurned: number, + totalCashedOut: number, + addedToFiatPoolInRange: number, + exchangesMadeInRange: number, + tokensExchangedInRange: number, + cashedOutInRange: number, + poolChangesInRange: PoolChangeHistory[], +} + +export interface PoolTopup { + blockHeight: number, + amount: number, + mintBefore: number, + change: number, + mintAfter: number, +} + +export interface ExchangeInfo { + amount: number, + tokensRecievedAtBlock: number, +} + +export interface PoolChangeHistory { + blockHeight: number, + poolChange: number, + oldPool: number, + newPool: number, + tokensBurned: number, + issuanceBefore: number, + issuanceAfter: number +} \ No newline at end of file diff --git a/src/tokenomics/pool-changes.ts b/src/tokenomics/pool-changes.ts new file mode 100644 index 0000000..32f4b4d --- /dev/null +++ b/src/tokenomics/pool-changes.ts @@ -0,0 +1,173 @@ +import { PoolTopup, ExchangeInfo } from "./interfaces" + +export const topUps:PoolTopup[] = [ + { + "blockHeight": 909253, + "amount": 0, + "change": 2500, + "mintBefore": 0, + "mintAfter": 2500, + }, + { + "blockHeight": 1020520, + "amount": 0, + "change": 420, + "mintBefore": 2499.95, + "mintAfter": 2919.95, + }, + { + "blockHeight": 1138912, + "amount": 0, + "change": 250, + "mintBefore": 2861.11, + "mintAfter": 3192.32, + }, + { + "blockHeight": 1152762, + "amount": 0, + "change": 110, + "mintBefore": 3082.32, + "mintAfter": 3192.32, + }, + { + "blockHeight": 1181755, + "amount": 0, + "change": 120, + "mintBefore": 3177.58, + "mintAfter": 3297.58, + }, + { + "blockHeight": 1249547, + "amount": 0, + "change": 370, + "mintBefore": 3282.90, + "mintAfter": 3652.90, + }, + { + "blockHeight": 1365602, + "amount": 0, + "change": 510, + "mintBefore": 3501.50, + "mintAfter": 4011.50, + }, + { + "blockHeight": 1466844, + "amount": 0, + "change": 350, + "mintBefore": 3811.02, + "mintAfter": 4161.02, + }, + { + "blockHeight": 1565000, + "amount": 0, + "change": 270, + "mintBefore": 4057.66, + "mintAfter": 4327.66, + } +] +export const allExchanges: ExchangeInfo[] = [ + { + "amount": 1, + "tokensRecievedAtBlock": 909276, + }, + { + "amount": 2000, + "tokensRecievedAtBlock": 992663, + }, + { + "amount": 100000, + "tokensRecievedAtBlock": 1026037, + }, + { + "amount": 500000, + "tokensRecievedAtBlock": 1035084, + }, + { + "amount": 526315, + "tokensRecievedAtBlock": 1035346, + }, + { + "amount": 500000, + "tokensRecievedAtBlock": 1115996, + }, + { + "amount": 500000, + "tokensRecievedAtBlock": 1118640, + }, + { + "amount": 1000000, + "tokensRecievedAtBlock": 1143233, + }, + { + "amount": 500000, + "tokensRecievedAtBlock": 1162361, + }, + { + "amount": 500000, + "tokensRecievedAtBlock": 1234566, + }, + { + "amount": 500000, + "tokensRecievedAtBlock": 1250836, + }, + { + "amount": 1000000, + "tokensRecievedAtBlock": 1255030, + }, + { + "amount": 1000000, + "tokensRecievedAtBlock": 1264724, + }, + { + "amount": 500000, + "tokensRecievedAtBlock": 1282244, + }, + { + "amount": 327447, + "tokensRecievedAtBlock": 1285159, + }, + { + "amount": 500000, + "tokensRecievedAtBlock": 1346839, + }, + { + "amount": 1000000, + "tokensRecievedAtBlock": 1356206, + }, + { + "amount": 1000000, + "tokensRecievedAtBlock": 1371132, + }, + { + "amount": 1000000, + "tokensRecievedAtBlock": 1371799, + }, + { + "amount": 2000000, + "tokensRecievedAtBlock": 1381456, + }, + { + "amount": 1000000, + "tokensRecievedAtBlock": 1399102, + }, + { + "amount": 1000000, + "tokensRecievedAtBlock": 1423387, + }, + { + "amount": 2000000, + "tokensRecievedAtBlock": 1467413, + }, + { + "amount": 1000000, + "tokensRecievedAtBlock": 1552054, + }, + { + "amount": 2000000, + "tokensRecievedAtBlock": 1565652, + }, + { + "amount": 1000000, + "tokensRecievedAtBlock": 1568705, + } +] \ No newline at end of file diff --git a/tsconfig.json b/tsconfig.json index 301bc96..6a9e337 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -71,6 +71,6 @@ ] }, "include": [ - "src/*.ts" + "src/**/*.ts" ] } diff --git a/yarn.lock b/yarn.lock new file mode 100644 index 0000000..e85d3ff --- /dev/null +++ b/yarn.lock @@ -0,0 +1,898 @@ +# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. +# yarn lockfile v1 + + +"@babel/runtime@^7.7.1", "@babel/runtime@^7.7.7": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.10.4.tgz#a6724f1a6b8d2f6ea5236dbfe58c7d7ea9c5eb99" + integrity sha512-UpTN5yUJr9b4EX2CnGNWIvER7Ab83ibv0pcvvHc4UOdrBI5jb8bj+32cCwPX6xu0mt2daFNjYhoi+X7beH0RSw== + dependencies: + regenerator-runtime "^0.13.4" + +"@joystream/types@^0.10.0": + version "0.10.0" + resolved "https://registry.yarnpkg.com/@joystream/types/-/types-0.10.0.tgz#7e98ef221410b26a7d952cfc3d1c03d28395ad69" + integrity sha512-RDZizqGKWGYpLR5PnUWM4aGa7InpWNh2Txlr7Al3ROFYOHoyQf62/omPfEz29F6scwlFxysOdmEfQaLeVRaUxA== + dependencies: + "@polkadot/types" "^0.96.1" + "@types/vfile" "^4.0.0" + ajv "^6.11.0" + lodash "^4.17.15" + +"@polkadot/api-derive@^0.96.1": + version "0.96.1" + resolved "https://registry.yarnpkg.com/@polkadot/api-derive/-/api-derive-0.96.1.tgz#dc49db7293b585c4bde5e334c134127821a0ebed" + integrity sha512-PGWdUvlD2acUKOgaJcYWuMTfSuQKUpwgwjer5SomHLFn4ZPOz8iDa7mYtrgmxQctRv1zsuck2X01uhxdEdtJZw== + dependencies: + "@babel/runtime" "^7.7.1" + "@polkadot/api" "^0.96.1" + "@polkadot/types" "^0.96.1" + +"@polkadot/api-metadata@^0.96.1": + version "0.96.1" + resolved "https://registry.yarnpkg.com/@polkadot/api-metadata/-/api-metadata-0.96.1.tgz#5aaf7b78a72049cca9cbde5b078f26a330ab515c" + integrity sha512-I9F3twpSCgx4ny25a3moGrhf2vHKFnjooO3W9NaAxIj/us4q4Gqo4+czQajqt8vaJqrNMq/PE7lzVz1NhYDrZQ== + dependencies: + "@babel/runtime" "^7.7.1" + "@polkadot/types" "^0.96.1" + "@polkadot/util" "^1.7.0-beta.5" + "@polkadot/util-crypto" "^1.7.0-beta.5" + +"@polkadot/api@^0.96.1": + version "0.96.1" + resolved "https://registry.yarnpkg.com/@polkadot/api/-/api-0.96.1.tgz#708b7f487091e6ffafac16c71074d1366f8f122f" + integrity sha512-FeYyMfJL0NACJBIuG7C7mp7f9J/WOGUERF/hUP3RlIz4Ld2X0vRjEoOgiG0VIS89I4K31XaNmSjIchH244WtHg== + dependencies: + "@babel/runtime" "^7.7.1" + "@polkadot/api-derive" "^0.96.1" + "@polkadot/api-metadata" "^0.96.1" + "@polkadot/keyring" "^1.7.0-beta.5" + "@polkadot/rpc-core" "^0.96.1" + "@polkadot/rpc-provider" "^0.96.1" + "@polkadot/types" "^0.96.1" + "@polkadot/util-crypto" "^1.7.0-beta.5" + +"@polkadot/jsonrpc@^0.96.1": + version "0.96.1" + resolved "https://registry.yarnpkg.com/@polkadot/jsonrpc/-/jsonrpc-0.96.1.tgz#78ae3565169d2bd3cb46abbcb67d4768fb0f6154" + integrity sha512-UHpcUGIvkG4dJ5gUhDyfJ1xfr/VcBlJ5lIlGamGsnNacMuIVmmEsftgxtPlJLWHuoA1EBEHY4cbPSv9CUJ0IFw== + dependencies: + "@babel/runtime" "^7.7.1" + +"@polkadot/keyring@^1.7.0-beta.5": + version "1.8.1" + resolved "https://registry.yarnpkg.com/@polkadot/keyring/-/keyring-1.8.1.tgz#69a9209f22b766a9e2d97d36bfca8bcdbc4daa18" + integrity sha512-KeDbfP8biY3bXEhMv1ANp9d3kCuXj2oxseuDK0jvxRo7CehVME9UwAMGQK3Y9NCUuYWd+xTO2To0ZOqR7hdmuQ== + dependencies: + "@babel/runtime" "^7.7.7" + "@polkadot/util" "^1.8.1" + "@polkadot/util-crypto" "^1.8.1" + +"@polkadot/rpc-core@^0.96.1": + version "0.96.1" + resolved "https://registry.yarnpkg.com/@polkadot/rpc-core/-/rpc-core-0.96.1.tgz#8da81d3a690fc4e9b2ccc65761166b4830c5d1a3" + integrity sha512-ygSaJpz/QPEq1p35wYRzONuP2PCtkAJ9eS8swQqUIezTo2ZPUOyBhmnJ3nxj11R8YnQClq4Id0QdsJmH1ClYgw== + dependencies: + "@babel/runtime" "^7.7.1" + "@polkadot/jsonrpc" "^0.96.1" + "@polkadot/rpc-provider" "^0.96.1" + "@polkadot/types" "^0.96.1" + "@polkadot/util" "^1.7.0-beta.5" + rxjs "^6.5.3" + +"@polkadot/rpc-provider@^0.96.1": + version "0.96.1" + resolved "https://registry.yarnpkg.com/@polkadot/rpc-provider/-/rpc-provider-0.96.1.tgz#4936f1876484e3388b6d4b31ee51a7f8946638ad" + integrity sha512-cUhp8FMCYHrXrBTbxZrok/hPIgtOXEUhIXn5/zrffg1Qpbzju/y/bXx7c1Kxl1JF7Bg0vSBRZEGJTn/x0irWRQ== + dependencies: + "@babel/runtime" "^7.7.1" + "@polkadot/api-metadata" "^0.96.1" + "@polkadot/util" "^1.7.0-beta.5" + "@polkadot/util-crypto" "^1.7.0-beta.5" + eventemitter3 "^4.0.0" + isomorphic-fetch "^2.2.1" + websocket "^1.0.30" + +"@polkadot/ts@^0.1.56": + version "0.1.91" + resolved "https://registry.yarnpkg.com/@polkadot/ts/-/ts-0.1.91.tgz#e3cc05cea480cc3d15b213110aec082fb0af5e79" + integrity sha512-UB8zOFZXb/ih03izzAQ1r1DRpiUXBofxAlXjcx4530jopfiNsiU1LZ2J/uS3dVV1QXaGRhkgm8SIJDLsSMRYIQ== + dependencies: + "@types/chrome" "^0.0.92" + +"@polkadot/types@^0.96.1": + version "0.96.1" + resolved "https://registry.yarnpkg.com/@polkadot/types/-/types-0.96.1.tgz#84a7123db0ae2922217a0b830a59acb9d83f176f" + integrity sha512-b8AZBNmMjB0+34Oxue3AYc0gIjDHYCdVGtDpel0omHkLMcEquSvrCniLm+p7g4cfArICiZPFmS9In/OWWdRUVA== + dependencies: + "@babel/runtime" "^7.7.1" + "@polkadot/util" "^1.7.0-beta.5" + "@polkadot/util-crypto" "^1.7.0-beta.5" + "@types/memoizee" "^0.4.3" + memoizee "^0.4.14" + +"@polkadot/util-crypto@^1.7.0-beta.5", "@polkadot/util-crypto@^1.8.1": + version "1.8.1" + resolved "https://registry.yarnpkg.com/@polkadot/util-crypto/-/util-crypto-1.8.1.tgz#dbc3f75c4a780bd31cd37e63cf27bade54728646" + integrity sha512-ypUs10hV1HPvYc0ZsEu+LTGSEh0rkr0as/FUh7+Z9v3Bxibn3aO+EOxJPQuDbZZ59FSMRmc9SeOSa0wn9ddrnw== + dependencies: + "@babel/runtime" "^7.7.7" + "@polkadot/util" "^1.8.1" + "@polkadot/wasm-crypto" "^0.14.1" + "@types/bip39" "^2.4.2" + "@types/bs58" "^4.0.0" + "@types/pbkdf2" "^3.0.0" + "@types/secp256k1" "^3.5.0" + "@types/xxhashjs" "^0.2.1" + base-x "3.0.5" + bip39 "^2.5.0" + blakejs "^1.1.0" + bs58 "^4.0.1" + js-sha3 "^0.8.0" + secp256k1 "^3.8.0" + tweetnacl "^1.0.1" + xxhashjs "^0.2.2" + +"@polkadot/util@^1.7.0-beta.5", "@polkadot/util@^1.8.1": + version "1.8.1" + resolved "https://registry.yarnpkg.com/@polkadot/util/-/util-1.8.1.tgz#7473383a1eb26bec59cca53643cf07bc078fe052" + integrity sha512-sFpr+JLCG9d+epjboXsmJ1qcKa96r8ZYzXmVo8+aPzI/9jKKyez6Unox/dnfnpKppZB2nJuLcsxQm6nocp2Caw== + dependencies: + "@babel/runtime" "^7.7.7" + "@types/bn.js" "^4.11.6" + bn.js "^4.11.8" + camelcase "^5.3.1" + chalk "^3.0.0" + ip-regex "^4.1.0" + moment "^2.24.0" + +"@polkadot/wasm-crypto@^0.14.1": + version "0.14.1" + resolved "https://registry.yarnpkg.com/@polkadot/wasm-crypto/-/wasm-crypto-0.14.1.tgz#f4923bba22d7c68a4be3575ba27790947b212633" + integrity sha512-Xng7L2Z8TNZa/5g6pot4O06Jf0ohQRZdvfl8eQL+E/L2mcqJYC1IjkMxJBSBuQEV7hisWzh9mHOy5WCcgPk29Q== + +"@types/bip39@^2.4.2": + version "2.4.2" + resolved "https://registry.yarnpkg.com/@types/bip39/-/bip39-2.4.2.tgz#f5d6617212be496bb998d3969f657f77a10c5287" + integrity sha512-Vo9lqOIRq8uoIzEVrV87ZvcIM0PN9t0K3oYZ/CS61fIYKCBdOIM7mlWzXuRvSXrDtVa1uUO2w1cdfufxTC0bzg== + dependencies: + "@types/node" "*" + +"@types/bn.js@^4.11.5", "@types/bn.js@^4.11.6": + version "4.11.6" + resolved "https://registry.yarnpkg.com/@types/bn.js/-/bn.js-4.11.6.tgz#c306c70d9358aaea33cd4eda092a742b9505967c" + integrity sha512-pqr857jrp2kPuO9uRjZ3PwnJTjoQy+fcdxvBTvHm6dkmEL9q+hDD/2j/0ELOBPtPnS8LjCX0gI9nbl8lVkadpg== + dependencies: + "@types/node" "*" + +"@types/bs58@^4.0.0": + version "4.0.1" + resolved "https://registry.yarnpkg.com/@types/bs58/-/bs58-4.0.1.tgz#3d51222aab067786d3bc3740a84a7f5a0effaa37" + integrity sha512-yfAgiWgVLjFCmRv8zAcOIHywYATEwiTVccTLnRp6UxTNavT55M9d/uhK3T03St/+8/z/wW+CRjGKUNmEqoHHCA== + dependencies: + base-x "^3.0.6" + +"@types/chrome@^0.0.92": + version "0.0.92" + resolved "https://registry.yarnpkg.com/@types/chrome/-/chrome-0.0.92.tgz#8630a52fcbcd0b30a2301f2a092386018ece1de6" + integrity sha512-bTv1EljZ03bexRJwS5FwSZmrudtw+QNbzwUY2sxVtXWgtxk752G4I2owhZ+Mlzbf3VKvG+rBYSw/FnvzuZ4xOA== + dependencies: + "@types/filesystem" "*" + +"@types/color-name@^1.1.1": + version "1.1.1" + resolved "https://registry.yarnpkg.com/@types/color-name/-/color-name-1.1.1.tgz#1c1261bbeaa10a8055bbc5d8ab84b7b2afc846a0" + integrity sha512-rr+OQyAjxze7GgWrSaJwydHStIhHq2lvY3BOC2Mj7KnzI7XK0Uw1TOOdI9lDoajEbSWLiYgoo4f1R51erQfhPQ== + +"@types/filesystem@*": + version "0.0.29" + resolved "https://registry.yarnpkg.com/@types/filesystem/-/filesystem-0.0.29.tgz#ee3748eb5be140dcf980c3bd35f11aec5f7a3748" + integrity sha512-85/1KfRedmfPGsbK8YzeaQUyV1FQAvMPMTuWFQ5EkLd2w7szhNO96bk3Rh/SKmOfd9co2rCLf0Voy4o7ECBOvw== + dependencies: + "@types/filewriter" "*" + +"@types/filewriter@*": + version "0.0.28" + resolved "https://registry.yarnpkg.com/@types/filewriter/-/filewriter-0.0.28.tgz#c054e8af4d9dd75db4e63abc76f885168714d4b3" + integrity sha1-wFTor02d11205jq8dviFFocU1LM= + +"@types/memoizee@^0.4.3": + version "0.4.4" + resolved "https://registry.yarnpkg.com/@types/memoizee/-/memoizee-0.4.4.tgz#a8a5e917ef70c79523b8b8d57f529e49616a760c" + integrity sha512-c9+1g6+6vEqcw5UuM0RbfQV0mssmZcoG9+hNC5ptDCsv4G+XJW1Z4pE13wV5zbc9e0+YrDydALBTiD3nWG1a3g== + +"@types/node@*": + version "14.0.20" + resolved "https://registry.yarnpkg.com/@types/node/-/node-14.0.20.tgz#0da05cddbc761e1fa98af88a17244c8c1ff37231" + integrity sha512-MRn/NP3dee8yL5QhbSA6riuwkS+UOcsPUMOIOG3KMUQpuor/2TopdRBu8QaaB4fGU+gz/bzyDWt0FtUbeJ8H1A== + +"@types/pbkdf2@^3.0.0": + version "3.0.0" + resolved "https://registry.yarnpkg.com/@types/pbkdf2/-/pbkdf2-3.0.0.tgz#5d9ca5f12a78a08cc89ad72883ad4a30af359229" + integrity sha512-6J6MHaAlBJC/eVMy9jOwj9oHaprfutukfW/Dyt0NEnpQ/6HN6YQrpvLwzWdWDeWZIdenjGHlbYDzyEODO5Z+2Q== + dependencies: + "@types/node" "*" + +"@types/secp256k1@^3.5.0": + version "3.5.3" + resolved "https://registry.yarnpkg.com/@types/secp256k1/-/secp256k1-3.5.3.tgz#57ebfdd19d476de3ff13758cf7b6d9e420d54c19" + integrity sha512-NGcsPDR0P+Q71O63e2ayshmiZGAwCOa/cLJzOIuhOiDvmbvrCIiVtEpqdCJGogG92Bnr6tw/6lqVBsRMEl15OQ== + dependencies: + "@types/node" "*" + +"@types/unist@^2.0.0", "@types/unist@^2.0.2": + version "2.0.3" + resolved "https://registry.yarnpkg.com/@types/unist/-/unist-2.0.3.tgz#9c088679876f374eb5983f150d4787aa6fb32d7e" + integrity sha512-FvUupuM3rlRsRtCN+fDudtmytGO6iHJuuRKS1Ss0pG5z8oX0diNEw94UEL7hgDbpN94rgaK5R7sWm6RrSkZuAQ== + +"@types/vfile@^4.0.0": + version "4.0.0" + resolved "https://registry.yarnpkg.com/@types/vfile/-/vfile-4.0.0.tgz#c32d13cbda319bc9f4ab3cacc0263b4ba1dd1ea3" + integrity sha512-eleP0/Cz8uVWxARDLi3Axq2+fDdN4ibAXoC6Pv8p6s7znXaUL7XvhgeIhjCiNMnvlLNP+tmCLd+RuCryGgmtEg== + dependencies: + vfile "*" + +"@types/xxhashjs@^0.2.1": + version "0.2.2" + resolved "https://registry.yarnpkg.com/@types/xxhashjs/-/xxhashjs-0.2.2.tgz#f72d9398e94b3cb59f53b784186a70b472e61376" + integrity sha512-+hlk/W1kgnZn0vR22XNhxHk/qIRQYF54i0UTF2MwBAPd0e7xSy+jKOJwSwTdRQrNnOMRVv+vsh8ITV0uyhp2yg== + dependencies: + "@types/node" "*" + +ajv@^6.11.0: + version "6.12.3" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.3.tgz#18c5af38a111ddeb4f2697bd78d68abc1cabd706" + integrity sha512-4K0cK3L1hsqk9xIb2z9vs/XU+PGJZ9PNpJRDS9YLzmNdX6jmVPfamLvTJr0aDAusnHyCHO6MjzlkAsgtqp9teA== + dependencies: + fast-deep-equal "^3.1.1" + fast-json-stable-stringify "^2.0.0" + json-schema-traverse "^0.4.1" + uri-js "^4.2.2" + +ansi-styles@^4.1.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" + +base-x@3.0.5: + version "3.0.5" + resolved "https://registry.yarnpkg.com/base-x/-/base-x-3.0.5.tgz#d3ada59afed05b921ab581ec3112e6444ba0795a" + integrity sha512-C3picSgzPSLE+jW3tcBzJoGwitOtazb5B+5YmAxZm2ybmTi9LNgAtDO/jjVEBZwHoXmDBZ9m/IELj3elJVRBcA== + dependencies: + safe-buffer "^5.0.1" + +base-x@^3.0.2, base-x@^3.0.6: + version "3.0.8" + resolved "https://registry.yarnpkg.com/base-x/-/base-x-3.0.8.tgz#1e1106c2537f0162e8b52474a557ebb09000018d" + integrity sha512-Rl/1AWP4J/zRrk54hhlxH4drNxPJXYUaKffODVI53/dAsV4t9fBxyxYKAVPU1XBHxYwOWP9h9H0hM2MVw4YfJA== + dependencies: + safe-buffer "^5.0.1" + +bindings@^1.5.0: + version "1.5.0" + resolved "https://registry.yarnpkg.com/bindings/-/bindings-1.5.0.tgz#10353c9e945334bc0511a6d90b38fbc7c9c504df" + integrity sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ== + dependencies: + file-uri-to-path "1.0.0" + +bip39@^2.5.0: + version "2.6.0" + resolved "https://registry.yarnpkg.com/bip39/-/bip39-2.6.0.tgz#9e3a720b42ec8b3fbe4038f1e445317b6a99321c" + integrity sha512-RrnQRG2EgEoqO24ea+Q/fftuPUZLmrEM3qNhhGsA3PbaXaCW791LTzPuVyx/VprXQcTbPJ3K3UeTna8ZnVl2sg== + dependencies: + create-hash "^1.1.0" + pbkdf2 "^3.0.9" + randombytes "^2.0.1" + safe-buffer "^5.0.1" + unorm "^1.3.3" + +bip66@^1.1.5: + version "1.1.5" + resolved "https://registry.yarnpkg.com/bip66/-/bip66-1.1.5.tgz#01fa8748785ca70955d5011217d1b3139969ca22" + integrity sha1-AfqHSHhcpwlV1QESF9GzE5lpyiI= + dependencies: + safe-buffer "^5.0.1" + +blakejs@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/blakejs/-/blakejs-1.1.0.tgz#69df92ef953aa88ca51a32df6ab1c54a155fc7a5" + integrity sha1-ad+S75U6qIylGjLfarHFShVfx6U= + +bn.js@^4.11.8, bn.js@^4.4.0: + version "4.11.9" + resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-4.11.9.tgz#26d556829458f9d1e81fc48952493d0ba3507828" + integrity sha512-E6QoYqCKZfgatHTdHzs1RRKP7ip4vvm+EyRUeE2RF0NblwVvb0p6jSVeNTOFxPn26QXN2o6SMfNxKp6kU8zQaw== + +brorand@^1.0.1: + version "1.1.0" + resolved "https://registry.yarnpkg.com/brorand/-/brorand-1.1.0.tgz#12c25efe40a45e3c323eb8675a0a0ce57b22371f" + integrity sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8= + +browserify-aes@^1.0.6: + version "1.2.0" + resolved "https://registry.yarnpkg.com/browserify-aes/-/browserify-aes-1.2.0.tgz#326734642f403dabc3003209853bb70ad428ef48" + integrity sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA== + dependencies: + buffer-xor "^1.0.3" + cipher-base "^1.0.0" + create-hash "^1.1.0" + evp_bytestokey "^1.0.3" + inherits "^2.0.1" + safe-buffer "^5.0.1" + +bs58@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/bs58/-/bs58-4.0.1.tgz#be161e76c354f6f788ae4071f63f34e8c4f0a42a" + integrity sha1-vhYedsNU9veIrkBx9j806MTwpCo= + dependencies: + base-x "^3.0.2" + +buffer-xor@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/buffer-xor/-/buffer-xor-1.0.3.tgz#26e61ed1422fb70dd42e6e36729ed51d855fe8d9" + integrity sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk= + +camelcase@^5.3.1: + version "5.3.1" + resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-5.3.1.tgz#e3c9b31569e106811df242f715725a1f4c494320" + integrity sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg== + +chalk@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-3.0.0.tgz#3f73c2bf526591f574cc492c51e2456349f844e4" + integrity sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg== + dependencies: + ansi-styles "^4.1.0" + supports-color "^7.1.0" + +cipher-base@^1.0.0, cipher-base@^1.0.1, cipher-base@^1.0.3: + version "1.0.4" + resolved "https://registry.yarnpkg.com/cipher-base/-/cipher-base-1.0.4.tgz#8760e4ecc272f4c363532f926d874aae2c1397de" + integrity sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q== + dependencies: + inherits "^2.0.1" + safe-buffer "^5.0.1" + +color-convert@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3" + integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ== + dependencies: + color-name "~1.1.4" + +color-name@~1.1.4: + version "1.1.4" + resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" + integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== + +create-hash@^1.1.0, create-hash@^1.1.2, create-hash@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/create-hash/-/create-hash-1.2.0.tgz#889078af11a63756bcfb59bd221996be3a9ef196" + integrity sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg== + dependencies: + cipher-base "^1.0.1" + inherits "^2.0.1" + md5.js "^1.3.4" + ripemd160 "^2.0.1" + sha.js "^2.4.0" + +create-hmac@^1.1.4: + version "1.1.7" + resolved "https://registry.yarnpkg.com/create-hmac/-/create-hmac-1.1.7.tgz#69170c78b3ab957147b2b8b04572e47ead2243ff" + integrity sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg== + dependencies: + cipher-base "^1.0.3" + create-hash "^1.1.0" + inherits "^2.0.1" + ripemd160 "^2.0.0" + safe-buffer "^5.0.1" + sha.js "^2.4.8" + +cuint@^0.2.2: + version "0.2.2" + resolved "https://registry.yarnpkg.com/cuint/-/cuint-0.2.2.tgz#408086d409550c2631155619e9fa7bcadc3b991b" + integrity sha1-QICG1AlVDCYxFVYZ6fp7ytw7mRs= + +d@1, d@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/d/-/d-1.0.1.tgz#8698095372d58dbee346ffd0c7093f99f8f9eb5a" + integrity sha512-m62ShEObQ39CfralilEQRjH6oAMtNCV1xJyEx5LpRYUVN+EviphDgUc/F3hnYbADmkiNs67Y+3ylmlG7Lnu+FA== + dependencies: + es5-ext "^0.10.50" + type "^1.0.1" + +debug@^2.2.0: + version "2.6.9" + resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" + integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA== + dependencies: + ms "2.0.0" + +drbg.js@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/drbg.js/-/drbg.js-1.0.1.tgz#3e36b6c42b37043823cdbc332d58f31e2445480b" + integrity sha1-Pja2xCs3BDgjzbwzLVjzHiRFSAs= + dependencies: + browserify-aes "^1.0.6" + create-hash "^1.1.2" + create-hmac "^1.1.4" + +elliptic@^6.5.2: + version "6.5.3" + resolved "https://registry.yarnpkg.com/elliptic/-/elliptic-6.5.3.tgz#cb59eb2efdaf73a0bd78ccd7015a62ad6e0f93d6" + integrity sha512-IMqzv5wNQf+E6aHeIqATs0tOLeOTwj1QKbRcS3jBbYkl5oLAserA8yJTT7/VyHUYG91PRmPyeQDObKLPpeS4dw== + dependencies: + bn.js "^4.4.0" + brorand "^1.0.1" + hash.js "^1.0.0" + hmac-drbg "^1.0.0" + inherits "^2.0.1" + minimalistic-assert "^1.0.0" + minimalistic-crypto-utils "^1.0.0" + +encoding@^0.1.11: + version "0.1.12" + resolved "https://registry.yarnpkg.com/encoding/-/encoding-0.1.12.tgz#538b66f3ee62cd1ab51ec323829d1f9480c74beb" + integrity sha1-U4tm8+5izRq1HsMjgp0flIDHS+s= + dependencies: + iconv-lite "~0.4.13" + +es5-ext@^0.10.35, es5-ext@^0.10.45, es5-ext@^0.10.46, es5-ext@^0.10.50, es5-ext@~0.10.14, es5-ext@~0.10.2, es5-ext@~0.10.46: + version "0.10.53" + resolved "https://registry.yarnpkg.com/es5-ext/-/es5-ext-0.10.53.tgz#93c5a3acfdbef275220ad72644ad02ee18368de1" + integrity sha512-Xs2Stw6NiNHWypzRTY1MtaG/uJlwCk8kH81920ma8mvN8Xq1gsfhZvpkImLQArw8AHnv8MT2I45J3c0R8slE+Q== + dependencies: + es6-iterator "~2.0.3" + es6-symbol "~3.1.3" + next-tick "~1.0.0" + +es6-iterator@^2.0.3, es6-iterator@~2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/es6-iterator/-/es6-iterator-2.0.3.tgz#a7de889141a05a94b0854403b2d0a0fbfa98f3b7" + integrity sha1-p96IkUGgWpSwhUQDstCg+/qY87c= + dependencies: + d "1" + es5-ext "^0.10.35" + es6-symbol "^3.1.1" + +es6-symbol@^3.1.1, es6-symbol@~3.1.3: + version "3.1.3" + resolved "https://registry.yarnpkg.com/es6-symbol/-/es6-symbol-3.1.3.tgz#bad5d3c1bcdac28269f4cb331e431c78ac705d18" + integrity sha512-NJ6Yn3FuDinBaBRWl/q5X/s4koRHBrgKAu+yGI6JCBeiu3qrcbJhwT2GeR/EXVfylRk8dpQVJoLEFhK+Mu31NA== + dependencies: + d "^1.0.1" + ext "^1.1.2" + +es6-weak-map@^2.0.2: + version "2.0.3" + resolved "https://registry.yarnpkg.com/es6-weak-map/-/es6-weak-map-2.0.3.tgz#b6da1f16cc2cc0d9be43e6bdbfc5e7dfcdf31d53" + integrity sha512-p5um32HOTO1kP+w7PRnB+5lQ43Z6muuMuIMffvDN8ZB4GcnjLBV6zGStpbASIMk4DCAvEaamhe2zhyCb/QXXsA== + dependencies: + d "1" + es5-ext "^0.10.46" + es6-iterator "^2.0.3" + es6-symbol "^3.1.1" + +event-emitter@^0.3.5: + version "0.3.5" + resolved "https://registry.yarnpkg.com/event-emitter/-/event-emitter-0.3.5.tgz#df8c69eef1647923c7157b9ce83840610b02cc39" + integrity sha1-34xp7vFkeSPHFXuc6DhAYQsCzDk= + dependencies: + d "1" + es5-ext "~0.10.14" + +eventemitter3@^4.0.0: + version "4.0.4" + resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-4.0.4.tgz#b5463ace635a083d018bdc7c917b4c5f10a85384" + integrity sha512-rlaVLnVxtxvoyLsQQFBx53YmXHDxRIzzTLbdfxqi4yocpSjAxXwkU0cScM5JgSKMqEhrZpnvQ2D9gjylR0AimQ== + +evp_bytestokey@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz#7fcbdb198dc71959432efe13842684e0525acb02" + integrity sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA== + dependencies: + md5.js "^1.3.4" + safe-buffer "^5.1.1" + +ext@^1.1.2: + version "1.4.0" + resolved "https://registry.yarnpkg.com/ext/-/ext-1.4.0.tgz#89ae7a07158f79d35517882904324077e4379244" + integrity sha512-Key5NIsUxdqKg3vIsdw9dSuXpPCQ297y6wBjL30edxwPgt2E44WcWBZey/ZvUc6sERLTxKdyCu4gZFmUbk1Q7A== + dependencies: + type "^2.0.0" + +fast-deep-equal@^3.1.1: + version "3.1.3" + resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525" + integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== + +fast-json-stable-stringify@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633" + integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw== + +file-uri-to-path@1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz#553a7b8446ff6f684359c445f1e37a05dacc33dd" + integrity sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw== + +has-flag@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b" + integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== + +hash-base@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/hash-base/-/hash-base-3.1.0.tgz#55c381d9e06e1d2997a883b4a3fddfe7f0d3af33" + integrity sha512-1nmYp/rhMDiE7AYkDw+lLwlAzz0AntGIe51F3RfFfEqyQ3feY2eI/NcwC6umIQVOASPMsWJLJScWKSSvzL9IVA== + dependencies: + inherits "^2.0.4" + readable-stream "^3.6.0" + safe-buffer "^5.2.0" + +hash.js@^1.0.0, hash.js@^1.0.3: + version "1.1.7" + resolved "https://registry.yarnpkg.com/hash.js/-/hash.js-1.1.7.tgz#0babca538e8d4ee4a0f8988d68866537a003cf42" + integrity sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA== + dependencies: + inherits "^2.0.3" + minimalistic-assert "^1.0.1" + +hmac-drbg@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/hmac-drbg/-/hmac-drbg-1.0.1.tgz#d2745701025a6c775a6c545793ed502fc0c649a1" + integrity sha1-0nRXAQJabHdabFRXk+1QL8DGSaE= + dependencies: + hash.js "^1.0.3" + minimalistic-assert "^1.0.0" + minimalistic-crypto-utils "^1.0.1" + +iconv-lite@~0.4.13: + version "0.4.24" + resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" + integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA== + dependencies: + safer-buffer ">= 2.1.2 < 3" + +inherits@^2.0.1, inherits@^2.0.3, inherits@^2.0.4: + version "2.0.4" + resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" + integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== + +ip-regex@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/ip-regex/-/ip-regex-4.1.0.tgz#5ad62f685a14edb421abebc2fff8db94df67b455" + integrity sha512-pKnZpbgCTfH/1NLIlOduP/V+WRXzC2MOz3Qo8xmxk8C5GudJLgK5QyLVXOSWy3ParAH7Eemurl3xjv/WXYFvMA== + +is-buffer@^2.0.0: + version "2.0.4" + resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-2.0.4.tgz#3e572f23c8411a5cfd9557c849e3665e0b290623" + integrity sha512-Kq1rokWXOPXWuaMAqZiJW4XxsmD9zGx9q4aePabbn3qCRGedtH7Cm+zV8WETitMfu1wdh+Rvd6w5egwSngUX2A== + +is-promise@^2.1: + version "2.2.2" + resolved "https://registry.yarnpkg.com/is-promise/-/is-promise-2.2.2.tgz#39ab959ccbf9a774cf079f7b40c7a26f763135f1" + integrity sha512-+lP4/6lKUBfQjZ2pdxThZvLUAafmZb8OAxFb8XXtiQmS35INgr85hdOGoEs124ez1FCnZJt6jau/T+alh58QFQ== + +is-stream@^1.0.1: + version "1.1.0" + resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-1.1.0.tgz#12d4a3dd4e68e0b79ceb8dbc84173ae80d91ca44" + integrity sha1-EtSj3U5o4Lec6428hBc66A2RykQ= + +is-typedarray@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a" + integrity sha1-5HnICFjfDBsR3dppQPlgEfzaSpo= + +isomorphic-fetch@^2.2.1: + version "2.2.1" + resolved "https://registry.yarnpkg.com/isomorphic-fetch/-/isomorphic-fetch-2.2.1.tgz#611ae1acf14f5e81f729507472819fe9733558a9" + integrity sha1-YRrhrPFPXoH3KVB0coGf6XM1WKk= + dependencies: + node-fetch "^1.0.1" + whatwg-fetch ">=0.10.0" + +js-sha3@^0.8.0: + version "0.8.0" + resolved "https://registry.yarnpkg.com/js-sha3/-/js-sha3-0.8.0.tgz#b9b7a5da73afad7dedd0f8c463954cbde6818840" + integrity sha512-gF1cRrHhIzNfToc802P800N8PpXS+evLLXfsVpowqmAFR9uwbi89WvXg2QspOmXL8QL86J4T1EpFu+yUkwJY3Q== + +json-schema-traverse@^0.4.1: + version "0.4.1" + resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660" + integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg== + +lodash@^4.17.15: + version "4.17.19" + resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.19.tgz#e48ddedbe30b3321783c5b4301fbd353bc1e4a4b" + integrity sha512-JNvd8XER9GQX0v2qJgsaN/mzFCNA5BRe/j8JN9d+tWyGLSodKQHKFicdwNYzWwI3wjRnaKPsGj1XkBjx/F96DQ== + +lru-queue@0.1: + version "0.1.0" + resolved "https://registry.yarnpkg.com/lru-queue/-/lru-queue-0.1.0.tgz#2738bd9f0d3cf4f84490c5736c48699ac632cda3" + integrity sha1-Jzi9nw089PhEkMVzbEhpmsYyzaM= + dependencies: + es5-ext "~0.10.2" + +md5.js@^1.3.4: + version "1.3.5" + resolved "https://registry.yarnpkg.com/md5.js/-/md5.js-1.3.5.tgz#b5d07b8e3216e3e27cd728d72f70d1e6a342005f" + integrity sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg== + dependencies: + hash-base "^3.0.0" + inherits "^2.0.1" + safe-buffer "^5.1.2" + +memoizee@^0.4.14: + version "0.4.14" + resolved "https://registry.yarnpkg.com/memoizee/-/memoizee-0.4.14.tgz#07a00f204699f9a95c2d9e77218271c7cd610d57" + integrity sha512-/SWFvWegAIYAO4NQMpcX+gcra0yEZu4OntmUdrBaWrJncxOqAziGFlHxc7yjKVK2uu3lpPW27P27wkR82wA8mg== + dependencies: + d "1" + es5-ext "^0.10.45" + es6-weak-map "^2.0.2" + event-emitter "^0.3.5" + is-promise "^2.1" + lru-queue "0.1" + next-tick "1" + timers-ext "^0.1.5" + +minimalistic-assert@^1.0.0, minimalistic-assert@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz#2e194de044626d4a10e7f7fbc00ce73e83e4d5c7" + integrity sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A== + +minimalistic-crypto-utils@^1.0.0, minimalistic-crypto-utils@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz#f6c00c1c0b082246e5c4d99dfb8c7c083b2b582a" + integrity sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo= + +moment@^2.24.0: + version "2.27.0" + resolved "https://registry.yarnpkg.com/moment/-/moment-2.27.0.tgz#8bff4e3e26a236220dfe3e36de756b6ebaa0105d" + integrity sha512-al0MUK7cpIcglMv3YF13qSgdAIqxHTO7brRtaz3DlSULbqfazqkc5kEjNrLDOM7fsjshoFIihnU8snrP7zUvhQ== + +ms@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" + integrity sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g= + +nan@^2.14.0: + version "2.14.1" + resolved "https://registry.yarnpkg.com/nan/-/nan-2.14.1.tgz#d7be34dfa3105b91494c3147089315eff8874b01" + integrity sha512-isWHgVjnFjh2x2yuJ/tj3JbwoHu3UC2dX5G/88Cm24yB6YopVgxvBObDY7n5xW6ExmFhJpSEQqFPvq9zaXc8Jw== + +next-tick@1: + version "1.1.0" + resolved "https://registry.yarnpkg.com/next-tick/-/next-tick-1.1.0.tgz#1836ee30ad56d67ef281b22bd199f709449b35eb" + integrity sha512-CXdUiJembsNjuToQvxayPZF9Vqht7hewsvy2sOWafLvi2awflj9mOC6bHIg50orX8IJvWKY9wYQ/zB2kogPslQ== + +next-tick@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/next-tick/-/next-tick-1.0.0.tgz#ca86d1fe8828169b0120208e3dc8424b9db8342c" + integrity sha1-yobR/ogoFpsBICCOPchCS524NCw= + +node-fetch@^1.0.1: + version "1.7.3" + resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-1.7.3.tgz#980f6f72d85211a5347c6b2bc18c5b84c3eb47ef" + integrity sha512-NhZ4CsKx7cYm2vSrBAr2PvFOe6sWDf0UYLRqA6svUYg7+/TSfVAu49jYC4BvQ4Sms9SZgdqGBgroqfDhJdTyKQ== + dependencies: + encoding "^0.1.11" + is-stream "^1.0.1" + +pbkdf2@^3.0.9: + version "3.1.1" + resolved "https://registry.yarnpkg.com/pbkdf2/-/pbkdf2-3.1.1.tgz#cb8724b0fada984596856d1a6ebafd3584654b94" + integrity sha512-4Ejy1OPxi9f2tt1rRV7Go7zmfDQ+ZectEQz3VGUQhgq62HtIRPDyG/JtnwIxs6x3uNMwo2V7q1fMvKjb+Tnpqg== + dependencies: + create-hash "^1.1.2" + create-hmac "^1.1.4" + ripemd160 "^2.0.1" + safe-buffer "^5.0.1" + sha.js "^2.4.8" + +punycode@^2.1.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec" + integrity sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A== + +randombytes@^2.0.1: + version "2.1.0" + resolved "https://registry.yarnpkg.com/randombytes/-/randombytes-2.1.0.tgz#df6f84372f0270dc65cdf6291349ab7a473d4f2a" + integrity sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ== + dependencies: + safe-buffer "^5.1.0" + +readable-stream@^3.6.0: + version "3.6.0" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.0.tgz#337bbda3adc0706bd3e024426a286d4b4b2c9198" + integrity sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA== + dependencies: + inherits "^2.0.3" + string_decoder "^1.1.1" + util-deprecate "^1.0.1" + +regenerator-runtime@^0.13.4: + version "0.13.5" + resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.13.5.tgz#d878a1d094b4306d10b9096484b33ebd55e26697" + integrity sha512-ZS5w8CpKFinUzOwW3c83oPeVXoNsrLsaCoLtJvAClH135j/R77RuymhiSErhm2lKcwSCIpmvIWSbDkIfAqKQlA== + +replace-ext@1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/replace-ext/-/replace-ext-1.0.0.tgz#de63128373fcbf7c3ccfa4de5a480c45a67958eb" + integrity sha1-3mMSg3P8v3w8z6TeWkgMRaZ5WOs= + +ripemd160@^2.0.0, ripemd160@^2.0.1: + version "2.0.2" + resolved "https://registry.yarnpkg.com/ripemd160/-/ripemd160-2.0.2.tgz#a1c1a6f624751577ba5d07914cbc92850585890c" + integrity sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA== + dependencies: + hash-base "^3.0.0" + inherits "^2.0.1" + +rxjs@^6.5.3: + version "6.6.0" + resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-6.6.0.tgz#af2901eedf02e3a83ffa7f886240ff9018bbec84" + integrity sha512-3HMA8z/Oz61DUHe+SdOiQyzIf4tOx5oQHmMir7IZEu6TMqCLHT4LRcmNaUS0NwOz8VLvmmBduMsoaUvMaIiqzg== + dependencies: + tslib "^1.9.0" + +safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@^5.1.1, safe-buffer@^5.1.2, safe-buffer@^5.2.0, safe-buffer@~5.2.0: + version "5.2.1" + resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" + integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== + +"safer-buffer@>= 2.1.2 < 3": + version "2.1.2" + resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" + integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== + +secp256k1@^3.8.0: + version "3.8.0" + resolved "https://registry.yarnpkg.com/secp256k1/-/secp256k1-3.8.0.tgz#28f59f4b01dbee9575f56a47034b7d2e3b3b352d" + integrity sha512-k5ke5avRZbtl9Tqx/SA7CbY3NF6Ro+Sj9cZxezFzuBlLDmyqPiL8hJJ+EmzD8Ig4LUDByHJ3/iPOVoRixs/hmw== + dependencies: + bindings "^1.5.0" + bip66 "^1.1.5" + bn.js "^4.11.8" + create-hash "^1.2.0" + drbg.js "^1.0.1" + elliptic "^6.5.2" + nan "^2.14.0" + safe-buffer "^5.1.2" + +sha.js@^2.4.0, sha.js@^2.4.8: + version "2.4.11" + resolved "https://registry.yarnpkg.com/sha.js/-/sha.js-2.4.11.tgz#37a5cf0b81ecbc6943de109ba2960d1b26584ae7" + integrity sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ== + dependencies: + inherits "^2.0.1" + safe-buffer "^5.0.1" + +string_decoder@^1.1.1: + version "1.3.0" + resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.3.0.tgz#42f114594a46cf1a8e30b0a84f56c78c3edac21e" + integrity sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA== + dependencies: + safe-buffer "~5.2.0" + +supports-color@^7.1.0: + version "7.1.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.1.0.tgz#68e32591df73e25ad1c4b49108a2ec507962bfd1" + integrity sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g== + dependencies: + has-flag "^4.0.0" + +timers-ext@^0.1.5: + version "0.1.7" + resolved "https://registry.yarnpkg.com/timers-ext/-/timers-ext-0.1.7.tgz#6f57ad8578e07a3fb9f91d9387d65647555e25c6" + integrity sha512-b85NUNzTSdodShTIbky6ZF02e8STtVVfD+fu4aXXShEELpozH+bCpJLYMPZbsABN2wDH7fJpqIoXxJpzbf0NqQ== + dependencies: + es5-ext "~0.10.46" + next-tick "1" + +tslib@^1.9.0: + version "1.13.0" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.13.0.tgz#c881e13cc7015894ed914862d276436fa9a47043" + integrity sha512-i/6DQjL8Xf3be4K/E6Wgpekn5Qasl1usyw++dAA35Ue5orEn65VIxOA+YvNNl9HV3qv70T7CNwjODHZrLwvd1Q== + +tweetnacl@^1.0.1: + version "1.0.3" + resolved "https://registry.yarnpkg.com/tweetnacl/-/tweetnacl-1.0.3.tgz#ac0af71680458d8a6378d0d0d050ab1407d35596" + integrity sha512-6rt+RN7aOi1nGMyC4Xa5DdYiukl2UWCbcJft7YhxReBGQD7OAM8Pbxw6YMo4r2diNEA8FEmu32YOn9rhaiE5yw== + +type@^1.0.1: + version "1.2.0" + resolved "https://registry.yarnpkg.com/type/-/type-1.2.0.tgz#848dd7698dafa3e54a6c479e759c4bc3f18847a0" + integrity sha512-+5nt5AAniqsCnu2cEQQdpzCAh33kVx8n0VoFidKpB1dVVLAN/F+bgVOqOJqOnEnrhp222clB5p3vUlD+1QAnfg== + +type@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/type/-/type-2.0.0.tgz#5f16ff6ef2eb44f260494dae271033b29c09a9c3" + integrity sha512-KBt58xCHry4Cejnc2ISQAF7QY+ORngsWfxezO68+12hKV6lQY8P/psIkcbjeHWn7MqcgciWJyCCevFMJdIXpow== + +typedarray-to-buffer@^3.1.5: + version "3.1.5" + resolved "https://registry.yarnpkg.com/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz#a97ee7a9ff42691b9f783ff1bc5112fe3fca9080" + integrity sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q== + dependencies: + is-typedarray "^1.0.0" + +typescript@3.7.2: + version "3.7.2" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-3.7.2.tgz#27e489b95fa5909445e9fef5ee48d81697ad18fb" + integrity sha512-ml7V7JfiN2Xwvcer+XAf2csGO1bPBdRbFCkYBczNZggrBZ9c7G3riSUeJmqEU5uOtXNPMhE3n+R4FA/3YOAWOQ== + +unist-util-stringify-position@^2.0.0: + version "2.0.3" + resolved "https://registry.yarnpkg.com/unist-util-stringify-position/-/unist-util-stringify-position-2.0.3.tgz#cce3bfa1cdf85ba7375d1d5b17bdc4cada9bd9da" + integrity sha512-3faScn5I+hy9VleOq/qNbAd6pAx7iH5jYBMS9I1HgQVijz/4mv5Bvw5iw1sC/90CODiKo81G/ps8AJrISn687g== + dependencies: + "@types/unist" "^2.0.2" + +unorm@^1.3.3: + version "1.6.0" + resolved "https://registry.yarnpkg.com/unorm/-/unorm-1.6.0.tgz#029b289661fba714f1a9af439eb51d9b16c205af" + integrity sha512-b2/KCUlYZUeA7JFUuRJZPUtr4gZvBh7tavtv4fvk4+KV9pfGiR6CQAQAWl49ZpR3ts2dk4FYkP7EIgDJoiOLDA== + +uri-js@^4.2.2: + version "4.2.2" + resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.2.2.tgz#94c540e1ff772956e2299507c010aea6c8838eb0" + integrity sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ== + dependencies: + punycode "^2.1.0" + +util-deprecate@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" + integrity sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8= + +vfile-message@^2.0.0: + version "2.0.4" + resolved "https://registry.yarnpkg.com/vfile-message/-/vfile-message-2.0.4.tgz#5b43b88171d409eae58477d13f23dd41d52c371a" + integrity sha512-DjssxRGkMvifUOJre00juHoP9DPWuzjxKuMDrhNbk2TdaYYBNMStsNhEOt3idrtI12VQYM/1+iM0KOzXi4pxwQ== + dependencies: + "@types/unist" "^2.0.0" + unist-util-stringify-position "^2.0.0" + +vfile@*: + version "4.1.1" + resolved "https://registry.yarnpkg.com/vfile/-/vfile-4.1.1.tgz#282d28cebb609183ac51703001bc18b3e3f17de9" + integrity sha512-lRjkpyDGjVlBA7cDQhQ+gNcvB1BGaTHYuSOcY3S7OhDmBtnzX95FhtZZDecSTDm6aajFymyve6S5DN4ZHGezdQ== + dependencies: + "@types/unist" "^2.0.0" + is-buffer "^2.0.0" + replace-ext "1.0.0" + unist-util-stringify-position "^2.0.0" + vfile-message "^2.0.0" + +websocket@^1.0.30: + version "1.0.31" + resolved "https://registry.yarnpkg.com/websocket/-/websocket-1.0.31.tgz#e5d0f16c3340ed87670e489ecae6144c79358730" + integrity sha512-VAouplvGKPiKFDTeCCO65vYHsyay8DqoBSlzIO3fayrfOgU94lQN5a1uWVnFrMLceTJw/+fQXR5PGbUVRaHshQ== + dependencies: + debug "^2.2.0" + es5-ext "^0.10.50" + nan "^2.14.0" + typedarray-to-buffer "^3.1.5" + yaeti "^0.0.6" + +whatwg-fetch@>=0.10.0: + version "3.1.1" + resolved "https://registry.yarnpkg.com/whatwg-fetch/-/whatwg-fetch-3.1.1.tgz#03f6b16271619003a5d42c1f14026523787a931e" + integrity sha512-UlBvc5VApYAwNutfXFeuC9Jp3QCMazcqobfNqSK/RghRr3F8b0+i/QELUlEPsHjDHfijio6H5KPJcZwYXhuZsA== + +xxhashjs@^0.2.2: + version "0.2.2" + resolved "https://registry.yarnpkg.com/xxhashjs/-/xxhashjs-0.2.2.tgz#8a6251567621a1c46a5ae204da0249c7f8caa9d8" + integrity sha512-AkTuIuVTET12tpsVIQo+ZU6f/qDmKuRUcjaqR+OIvm+aCBsZ95i7UVY5WJ9TMsSaZ0DA2WxoZ4acu0sPH+OKAw== + dependencies: + cuint "^0.2.2" + +yaeti@^0.0.6: + version "0.0.6" + resolved "https://registry.yarnpkg.com/yaeti/-/yaeti-0.0.6.tgz#f26f484d72684cf42bedfb76970aa1608fbf9577" + integrity sha1-8m9ITXJoTPQr7ft2lwqhYI+/lXc=