From e4fca8f41b9fe3d91ed6f96a048e0317cdb3e868 Mon Sep 17 00:00:00 2001 From: liangping <18786721@qq.com> Date: Tue, 3 Aug 2021 00:13:53 +0800 Subject: [PATCH] Finish validator detail --- package.json | 3 + src/libs/code.js | 137 ++++++++ src/libs/data/block-data.js | 11 + src/libs/data/block-header.js | 41 +++ src/libs/data/block-id.js | 13 + src/libs/data/block-inner.js | 21 ++ src/libs/data/block-last-commit.js | 20 ++ src/libs/data/block.js | 16 + src/libs/data/data.js | 20 ++ src/libs/data/index.js | 3 + src/libs/data/signature.js | 17 + src/libs/data/staking-delegation.js | 13 + src/libs/data/validator-distribution.js | 25 ++ src/libs/data/validator.js | 2 + src/libs/fetch.js | 26 +- src/router/index.js | 18 + src/views/Staking.vue | 6 +- src/views/StakingAddressComponent.vue | 144 ++++++++ src/views/StakingCommissionComponent.vue | 151 +++++++++ src/views/StakingRewardComponent.vue | 146 +++++++++ src/views/StakingValidator.vue | 401 +++++++++++++++++++++++ yarn.lock | 99 +++++- 22 files changed, 1326 insertions(+), 7 deletions(-) create mode 100644 src/libs/code.js create mode 100644 src/libs/data/block-data.js create mode 100644 src/libs/data/block-header.js create mode 100644 src/libs/data/block-id.js create mode 100644 src/libs/data/block-inner.js create mode 100644 src/libs/data/block-last-commit.js create mode 100644 src/libs/data/block.js create mode 100644 src/libs/data/signature.js create mode 100644 src/libs/data/staking-delegation.js create mode 100644 src/libs/data/validator-distribution.js create mode 100644 src/views/StakingAddressComponent.vue create mode 100644 src/views/StakingCommissionComponent.vue create mode 100644 src/views/StakingRewardComponent.vue create mode 100644 src/views/StakingValidator.vue diff --git a/package.json b/package.json index 566a43d8..5b7180a3 100644 --- a/package.json +++ b/package.json @@ -12,6 +12,9 @@ "dependencies": { "@casl/ability": "4.1.6", "@casl/vue": "1.1.1", + "@cosmjs/amino": "^0.25.6", + "@cosmjs/crypto": "^0.25.6", + "@cosmjs/encoding": "^0.25.6", "@fullcalendar/common": "5.x", "@fullcalendar/core": "5.x", "@fullcalendar/daygrid": "5.x", diff --git a/src/libs/code.js b/src/libs/code.js new file mode 100644 index 00000000..f42948b5 --- /dev/null +++ b/src/libs/code.js @@ -0,0 +1,137 @@ +export const codeDirective = ` + + + +` + +export const codeWithoutDirective = ` + + + +` diff --git a/src/libs/data/block-data.js b/src/libs/data/block-data.js new file mode 100644 index 00000000..2e5511d2 --- /dev/null +++ b/src/libs/data/block-data.js @@ -0,0 +1,11 @@ +export default class BlockData { + constructor() { + this.txs = [] + } + + static create(element) { + const self = new BlockData() + self.txs = element.txs + return self + } +} diff --git a/src/libs/data/block-header.js b/src/libs/data/block-header.js new file mode 100644 index 00000000..86dd4516 --- /dev/null +++ b/src/libs/data/block-header.js @@ -0,0 +1,41 @@ +import BlockId from './block-id' + +export default class BlockHeader { + constructor() { + this.version = { + block: '0', + } + this.chain_id = '' + this.height = 0 + this.time = '2021-08-02T01:12:43.42506492Z' + this.last_block_id = new BlockId() + this.last_commit_hash = '' + this.data_hash = '' + this.validators_hash = '' + this.next_validators_hash = '' + this.consensus_hash = '' + this.app_hash = '' + this.last_results_hash = '' + this.evidence_hash = '' + this.proposer_address = '' + } + + static create(element) { + const self = new BlockHeader() + self.version = element.version + self.chain_id = element.chain_id + self.height = element.height + self.time = element.time + self.last_block_id = element.last_block_id + self.last_commit_hash = element.last_commit_hash + self.data_hash = element.data_hash + self.validators_hash = element.validators_hash + self.next_validators_hash = element.next_validators_hash + self.consensus_hash = element.consensus_hash + self.app_hash = element.app_hash + self.last_results_hash = element.last_results_hash + self.evidence_hash = element.evidence_hash + self.proposer_address = element.proposer_address + return self + } +} diff --git a/src/libs/data/block-id.js b/src/libs/data/block-id.js new file mode 100644 index 00000000..7e8f481a --- /dev/null +++ b/src/libs/data/block-id.js @@ -0,0 +1,13 @@ +export default class BlockId { + constructor() { + this.hash = '' + this.parts = { total: 0, hash: '' } + } + + static create(element) { + const self = new BlockId() + self.hash = element.hash + self.parts = element.parts + return self + } +} diff --git a/src/libs/data/block-inner.js b/src/libs/data/block-inner.js new file mode 100644 index 00000000..f5de69f4 --- /dev/null +++ b/src/libs/data/block-inner.js @@ -0,0 +1,21 @@ +import BlockData from './block-data' +import BlockHeader from './block-header' +import BlockLastCommit from './block-last-commit' + +export default class BlockInner { + constructor() { + this.header = new BlockHeader() + this.data = new BlockData() + this.evidence = { evidence: [] } + this.last_commit = new BlockLastCommit() + } + + static create(element) { + const self = new BlockInner() + self.header = BlockHeader.create(element.header) + self.data = BlockData.create(element.data) + self.evidence = element.evidence + self.last_commit = BlockLastCommit.create(element.last_commit) + return self + } +} diff --git a/src/libs/data/block-last-commit.js b/src/libs/data/block-last-commit.js new file mode 100644 index 00000000..1d445842 --- /dev/null +++ b/src/libs/data/block-last-commit.js @@ -0,0 +1,20 @@ +import BlockId from './block-id' +import Signature from './signature' + +export default class BlockLastCommit { + constructor() { + this.height = 0 + this.round = 0 + this.block_id = new BlockId() + this.signatures = [] + } + + static create(element) { + const self = new BlockLastCommit() + self.height = Number(element.height) + self.round = Number(element.round) + self.block_id = element.block_id + self.signatures = element.signatures.map(x => Signature.create(x)) + return self + } +} diff --git a/src/libs/data/block.js b/src/libs/data/block.js new file mode 100644 index 00000000..bd18d092 --- /dev/null +++ b/src/libs/data/block.js @@ -0,0 +1,16 @@ +import BlockId from './block-id' +import BlockInner from './block-inner' + +export default class Block { + constructor() { + this.block_id = new BlockId() + this.block = new BlockInner() + } + + static create(element) { + const self = new Block() + self.block_id = BlockId.create(element.block_id) + self.block = BlockInner.create(element.block) + return self + } +} diff --git a/src/libs/data/data.js b/src/libs/data/data.js index 75acb0b9..ff302180 100644 --- a/src/libs/data/data.js +++ b/src/libs/data/data.js @@ -1,4 +1,8 @@ import dayjs from 'dayjs' +import { + Bech32, fromBase64, fromHex, toHex, +} from '@cosmjs/encoding' +import { sha256 } from '@cosmjs/crypto' export function toDay(time) { return dayjs(time).format('YYYY-MM-DD HH:mm') @@ -23,6 +27,22 @@ export function tokenFormatter(tokens) { return formatToken(tokens) } +export function operatorAddressToAccount(operAddress) { + const { prefix, data } = Bech32.decode(operAddress) + return Bech32.encode(prefix.replace('valoper', ''), data) +} + +export function consensusPubkeyToHexAddress(consensusPubkey) { + let raw = null + if (typeof consensusPubkey === 'object') { + raw = toHex(fromBase64(consensusPubkey.value)) + } else { + raw = toHex(Bech32.decode(consensusPubkey).data).toUpperCase().replace('1624DE6420', '') + } + const address = toHex(sha256(fromHex(raw))).slice(0, 40).toUpperCase() + return address +} + export * from 'compare-versions' export class Data { diff --git a/src/libs/data/index.js b/src/libs/data/index.js index f1c15db8..571884a7 100644 --- a/src/libs/data/index.js +++ b/src/libs/data/index.js @@ -6,6 +6,9 @@ export { default as Votes } from './votes' export { default as Deposit } from './deposit' export { default as Validator } from './validator' export { default as StakingParameters } from './staking-parameters' +export { default as Block } from './block' +export { default as ValidatorDistribution } from './validator-distribution' +export { default as StakingDelegation } from './staking-delegation' export * from './data' export default class Test {} diff --git a/src/libs/data/signature.js b/src/libs/data/signature.js new file mode 100644 index 00000000..1778d743 --- /dev/null +++ b/src/libs/data/signature.js @@ -0,0 +1,17 @@ +export default class Signature { + constructor() { + this.block_id_flag = 2 + this.validator_address = '' + this.timestamp = '' + this.signature = '' + } + + static create(element) { + const self = new Signature() + self.block_id_flag = element.block_id_flag + self.validator_address = element.validator_address + self.timestamp = element.timestamp + self.signature = element.signature + return self + } +} diff --git a/src/libs/data/staking-delegation.js b/src/libs/data/staking-delegation.js new file mode 100644 index 00000000..3885a67b --- /dev/null +++ b/src/libs/data/staking-delegation.js @@ -0,0 +1,13 @@ +export default class StakingDelegation { + constructor() { + this.delegation = {} + this.balance = {} + } + + static create(element) { + const self = new StakingDelegation() + self.delegation = element.delegation + self.balance = element.balance + return self + } +} diff --git a/src/libs/data/validator-distribution.js b/src/libs/data/validator-distribution.js new file mode 100644 index 00000000..8f9452af --- /dev/null +++ b/src/libs/data/validator-distribution.js @@ -0,0 +1,25 @@ +import compareVersions from 'compare-versions' + +export default class ValidatorDistribution { + constructor() { + this.element = {} + this.operator_address = '' + this.self_bond_rewards = [] + this.val_commission = [] + } + + static create(element) { + const self = new ValidatorDistribution() + self.element = element + self.operator_address = element.operator_address + self.self_bond_rewards = element.self_bond_rewards + self.val_commission = element.val_commission + return self + } + + versionFixed(ver) { + if (compareVersions(ver, '0.40') >= 0) { + this.val_commission = this.element.val_commission.commission + } + } +} diff --git a/src/libs/data/validator.js b/src/libs/data/validator.js index afd826a6..130863fd 100644 --- a/src/libs/data/validator.js +++ b/src/libs/data/validator.js @@ -15,6 +15,7 @@ export default class Validator { this.unbonding_height = 0 this.unbonding_time = '1970-01-01T00:00:00Z' this.commission = new ValidatorCommission() + this.min_self_delegation = 1 } init(element) { @@ -30,6 +31,7 @@ export default class Validator { this.unbonding_height = element.unbonding_height this.unbonding_time = element.unbonding_time this.commission = new ValidatorCommission().init(element.commission) + this.min_self_delegation = element.min_self_delegation return this } } diff --git a/src/libs/fetch.js b/src/libs/fetch.js index 4ea55be8..5baccee3 100644 --- a/src/libs/fetch.js +++ b/src/libs/fetch.js @@ -2,7 +2,7 @@ import fetch from 'node-fetch' import store from '@/store' import { Proposal, ProposalTally, Proposer, StakingPool, Votes, Deposit, - Validator, StakingParameters, + Validator, StakingParameters, Block, ValidatorDistribution, StakingDelegation, } from './data' function commonProcess(res) { @@ -21,6 +21,26 @@ const chainAPI = class ChainFetch { return this.config } + async getLatestBlock() { + return this.get('/blocks/latest').then(data => Block.create(data)) + } + + async getBlockByHeight(height) { + return this.get(`/blocks/${height}`).then(data => Block.create(data)) + } + + async getValidatorDistribution(address) { + return this.get(`/distribution/validators/${address}`).then(data => { + const ret = ValidatorDistribution.create(commonProcess(data)) + ret.versionFixed(this.config.sdk_version) + return ret + }) + } + + async getStakingDelegatorDelegation(delegatorAddr, validatorAddr) { + return this.get(`/staking/delegators/${delegatorAddr}/delegations/${validatorAddr}`).then(data => StakingDelegation.create(commonProcess(data))) + } + async getStakingPool() { return this.get('/staking/pool').then(data => new StakingPool().init(commonProcess(data))) } @@ -37,6 +57,10 @@ const chainAPI = class ChainFetch { return this.get('/staking/validators').then(data => commonProcess(data).map(i => new Validator().init(i))) } + async getStakingValidator(address) { + return this.get(`/staking/validators/${address}`).then(data => new Validator().init(commonProcess(data))) + } + async getGovernanceTally(pid, total) { return this.get(`/gov/proposals/${pid}/tally`).then(data => new ProposalTally().init(commonProcess(data), total)) } diff --git a/src/router/index.js b/src/router/index.js index 6a8f3b32..fa0f881d 100644 --- a/src/router/index.js +++ b/src/router/index.js @@ -56,6 +56,24 @@ const router = new VueRouter({ ], }, }, + { + path: '/:chain/staking/:address', + name: 'staking-valiator', + component: () => import('@/views/StakingValidator.vue'), + meta: { + pageTitle: 'Staking Valdiator', + breadcrumb: [ + { + text: 'Staking', + active: true, + }, + { + text: 'Validator', + active: true, + }, + ], + }, + }, { path: '/:chain/gov', name: 'governance', diff --git a/src/views/Staking.vue b/src/views/Staking.vue index bdd45ee0..ed131385 100644 --- a/src/views/Staking.vue +++ b/src/views/Staking.vue @@ -56,7 +56,11 @@ - {{ data.item.description.moniker }} + + {{ data.item.description.moniker }} + {{ data.item.description.website || data.item.description.identity }} diff --git a/src/views/StakingAddressComponent.vue b/src/views/StakingAddressComponent.vue new file mode 100644 index 00000000..f367afac --- /dev/null +++ b/src/views/StakingAddressComponent.vue @@ -0,0 +1,144 @@ + + + + + diff --git a/src/views/StakingCommissionComponent.vue b/src/views/StakingCommissionComponent.vue new file mode 100644 index 00000000..e553f7a3 --- /dev/null +++ b/src/views/StakingCommissionComponent.vue @@ -0,0 +1,151 @@ + + + diff --git a/src/views/StakingRewardComponent.vue b/src/views/StakingRewardComponent.vue new file mode 100644 index 00000000..ffbdd268 --- /dev/null +++ b/src/views/StakingRewardComponent.vue @@ -0,0 +1,146 @@ + + + diff --git a/src/views/StakingValidator.vue b/src/views/StakingValidator.vue new file mode 100644 index 00000000..c97a439f --- /dev/null +++ b/src/views/StakingValidator.vue @@ -0,0 +1,401 @@ + + + + + diff --git a/yarn.lock b/yarn.lock index 0c6716fd..5e961d33 100644 --- a/yarn.lock +++ b/yarn.lock @@ -915,6 +915,53 @@ resolved "https://registry.npmjs.org/@casl/vue/-/vue-1.1.1.tgz" integrity sha512-lJnPGJ2sdid22IGNPegWsMH0136WSMKZqqZb2YjLWL/vsRvw+wuLZE+yaR7enEfETmH5KZE55WAfXpyZgy99hQ== +"@cosmjs/amino@^0.25.6": + version "0.25.6" + resolved "https://registry.yarnpkg.com/@cosmjs/amino/-/amino-0.25.6.tgz#cdf9632253bfab7b1d2ef967124953d7bf16351f" + integrity sha512-9dXN2W7LHjDtJUGNsQ9ok0DfxeN3ca/TXnxCR3Ikh/5YqBqxI8Gel1J9PQO9L6EheYyh045Wff4bsMaLjyEeqQ== + dependencies: + "@cosmjs/crypto" "^0.25.6" + "@cosmjs/encoding" "^0.25.6" + "@cosmjs/math" "^0.25.6" + "@cosmjs/utils" "^0.25.6" + +"@cosmjs/crypto@^0.25.6": + version "0.25.6" + resolved "https://registry.yarnpkg.com/@cosmjs/crypto/-/crypto-0.25.6.tgz#695d2d0d2195bdbdd5825d415385646244900bbb" + integrity sha512-ec+YcQLrg2ibcxtNrh4FqQnG9kG9IE/Aik2NH6+OXQdFU/qFuBTxSFcKDgzzBOChwlkXwydllM9Jjbp+dgIzRw== + dependencies: + "@cosmjs/encoding" "^0.25.6" + "@cosmjs/math" "^0.25.6" + "@cosmjs/utils" "^0.25.6" + bip39 "^3.0.2" + bn.js "^4.11.8" + elliptic "^6.5.3" + js-sha3 "^0.8.0" + libsodium-wrappers "^0.7.6" + ripemd160 "^2.0.2" + sha.js "^2.4.11" + +"@cosmjs/encoding@^0.25.6": + version "0.25.6" + resolved "https://registry.yarnpkg.com/@cosmjs/encoding/-/encoding-0.25.6.tgz#da741a33eaf063a6d3611d7d68db5ca3938e0ef5" + integrity sha512-0imUOB8XkUstI216uznPaX1hqgvLQ2Xso3zJj5IV5oJuNlsfDj9nt/iQxXWbJuettc6gvrFfpf+Vw2vBZSZ75g== + dependencies: + base64-js "^1.3.0" + bech32 "^1.1.4" + readonly-date "^1.0.0" + +"@cosmjs/math@^0.25.6": + version "0.25.6" + resolved "https://registry.yarnpkg.com/@cosmjs/math/-/math-0.25.6.tgz#25c7b106aaded889a5b80784693caa9e654b0c28" + integrity sha512-Fmyc9FJ8KMU34n7rdapMJrT/8rx5WhMw2F7WLBu7AVLcBh0yWsXIcMSJCoPHTOnMIiABjXsnrrwEaLrOOBfu6A== + dependencies: + bn.js "^4.11.8" + +"@cosmjs/utils@^0.25.6": + version "0.25.6" + resolved "https://registry.yarnpkg.com/@cosmjs/utils/-/utils-0.25.6.tgz#934d9a967180baa66163847616a74358732227ca" + integrity sha512-ofOYiuxVKNo238vCPPlaDzqPXy2AQ/5/nashBo5rvPZJkxt9LciGfUEQWPCOb1BIJDNx2Dzu0z4XCf/dwzl0Dg== + "@fullcalendar/common@5.x", "@fullcalendar/common@~5.8.0": version "5.8.0" resolved "https://registry.npmjs.org/@fullcalendar/common/-/common-5.8.0.tgz" @@ -1322,6 +1369,11 @@ resolved "https://registry.npmjs.org/@types/node/-/node-16.3.3.tgz" integrity sha512-8h7k1YgQKxKXWckzFCMfsIwn0Y61UK6tlD6y2lOb3hTOIMlK3t9/QwHOhc81TwU+RMf0As5fj7NPjroERCnejQ== +"@types/node@11.11.6": + version "11.11.6" + resolved "https://registry.yarnpkg.com/@types/node/-/node-11.11.6.tgz#df929d1bb2eee5afdda598a41930fe50b43eaa6a" + integrity sha512-Exw4yUWMBXM3X+8oqzJNRqZSwUAaS4+7NdvHqQuFi/d+synz++xmX3QIf+BFqneW8N31R8Ky+sikfZUXq07ggQ== + "@types/normalize-package-data@^2.4.0": version "2.4.1" resolved "https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.1.tgz" @@ -2307,7 +2359,7 @@ balanced-match@^1.0.0: resolved "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz" integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== -base64-js@^1.0.2, base64-js@^1.3.1: +base64-js@^1.0.2, base64-js@^1.3.0, base64-js@^1.3.1: version "1.5.1" resolved "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz" integrity sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA== @@ -2337,6 +2389,11 @@ bcrypt-pbkdf@^1.0.0: dependencies: tweetnacl "^0.14.3" +bech32@^1.1.4: + version "1.1.4" + resolved "https://registry.yarnpkg.com/bech32/-/bech32-1.1.4.tgz#e38c9f37bf179b8eb16ae3a772b40c356d4832e9" + integrity sha512-s0IrSOzLlbvX7yp4WBfPITzpAU8sqQcpsmwXDiKwrG4r491vwCO/XpejasRNl0piBMe/DvP4Tz0mIS/X1DPJBQ== + bfj@^6.1.1: version "6.1.2" resolved "https://registry.npmjs.org/bfj/-/bfj-6.1.2.tgz" @@ -2422,6 +2479,16 @@ bindings@^1.5.0: dependencies: file-uri-to-path "1.0.0" +bip39@^3.0.2: + version "3.0.4" + resolved "https://registry.yarnpkg.com/bip39/-/bip39-3.0.4.tgz#5b11fed966840b5e1b8539f0f54ab6392969b2a0" + integrity sha512-YZKQlb752TrUWqHWj7XAwCSjYEgGAk+/Aas3V7NyjQeZYsztO8JnQUaCWhcnL4T+jL8nvB8typ2jRPzTlgugNw== + dependencies: + "@types/node" "11.11.6" + create-hash "^1.1.0" + pbkdf2 "^3.0.9" + randombytes "^2.0.1" + bl@^1.0.0: version "1.2.3" resolved "https://registry.nlark.com/bl/download/bl-1.2.3.tgz" @@ -2444,7 +2511,7 @@ bluebird@^3.1.1, bluebird@^3.5.5: resolved "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz" integrity sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg== -bn.js@^4.0.0, bn.js@^4.1.0, bn.js@^4.11.9: +bn.js@^4.0.0, bn.js@^4.1.0, bn.js@^4.11.8, bn.js@^4.11.9: version "4.12.0" resolved "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz" integrity sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA== @@ -6567,6 +6634,11 @@ js-queue@2.0.2: dependencies: easy-stack "^1.0.1" +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== + "js-tokens@^3.0.0 || ^4.0.0", js-tokens@^4.0.0: version "4.0.0" resolved "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz" @@ -6828,6 +6900,18 @@ levn@^0.3.0, levn@~0.3.0: prelude-ls "~1.1.2" type-check "~0.3.2" +libsodium-wrappers@^0.7.6: + version "0.7.9" + resolved "https://registry.yarnpkg.com/libsodium-wrappers/-/libsodium-wrappers-0.7.9.tgz#4ffc2b69b8f7c7c7c5594a93a4803f80f6d0f346" + integrity sha512-9HaAeBGk1nKTRFRHkt7nzxqCvnkWTjn1pdjKgcUnZxj0FyOP4CnhgFhMdrFfgNsukijBGyBLpP2m2uKT1vuWhQ== + dependencies: + libsodium "^0.7.0" + +libsodium@^0.7.0: + version "0.7.9" + resolved "https://registry.yarnpkg.com/libsodium/-/libsodium-0.7.9.tgz#4bb7bcbf662ddd920d8795c227ae25bbbfa3821b" + integrity sha512-gfeADtR4D/CM0oRUviKBViMGXZDgnFdMKMzHsvBdqLBHd9ySi6EtYnmuhHVDDYgYpAO8eU8hEY+F8vIUAPh08A== + lines-and-columns@^1.1.6: version "1.1.6" resolved "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.1.6.tgz" @@ -8255,7 +8339,7 @@ path-type@^4.0.0: resolved "https://registry.nlark.com/path-type/download/path-type-4.0.0.tgz" integrity sha1-hO0BwKe6OAr+CdkKjBgNzZ0DBDs= -pbkdf2@^3.0.3: +pbkdf2@^3.0.3, pbkdf2@^3.0.9: version "3.1.2" resolved "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.1.2.tgz" integrity sha512-iuh7L6jA7JEGu2WxDwtQP1ddOpaJNC4KlDEFfdQajSGgGPNi4OyDc2R7QnbY2bR9QjBVGwgvTdNJZoE7RaxUMA== @@ -9112,6 +9196,11 @@ readdirp@~3.6.0: dependencies: picomatch "^2.2.1" +readonly-date@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/readonly-date/-/readonly-date-1.0.0.tgz#5af785464d8c7d7c40b9d738cbde8c646f97dcd9" + integrity sha512-tMKIV7hlk0h4mO3JTmmVuIlJVXjKk3Sep9Bf5OH0O+758ruuVkUy2J9SttDLm91IEX/WHlXPSpxMGjPj4beMIQ== + redent@^1.0.0: version "1.0.0" resolved "https://registry.nlark.com/redent/download/redent-1.0.0.tgz?cache=0&sync_timestamp=1620069702182&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fredent%2Fdownload%2Fredent-1.0.0.tgz" @@ -9396,7 +9485,7 @@ rimraf@^2.5.4, rimraf@^2.6.1, rimraf@^2.6.3: dependencies: glob "^7.1.3" -ripemd160@^2.0.0, ripemd160@^2.0.1: +ripemd160@^2.0.0, ripemd160@^2.0.1, ripemd160@^2.0.2: version "2.0.2" resolved "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.2.tgz" integrity sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA== @@ -9657,7 +9746,7 @@ setprototypeof@1.1.1: resolved "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz" integrity sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw== -sha.js@^2.4.0, sha.js@^2.4.8: +sha.js@^2.4.0, sha.js@^2.4.11, sha.js@^2.4.8: version "2.4.11" resolved "https://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz" integrity sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==