From cce4a2b696b781e4a03c5ecc9e981899992d0206 Mon Sep 17 00:00:00 2001 From: rodolfopietro97 Date: Wed, 12 Jul 2023 07:51:13 +0200 Subject: [PATCH 01/28] feat: Update typescript and add original ethers.js library (toghether with forked version for now) --- package.json | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/package.json b/package.json index 643a547..0598bb6 100644 --- a/package.json +++ b/package.json @@ -67,6 +67,7 @@ }, "homepage": "https://github.com/vechain/thor-devkit.js#readme", "devDependencies": { + "@typechain/ethers-v6": "^0.4.0", "@types/chai": "^4.1.3", "@types/elliptic": "^6.4.9", "@types/mocha": "^5.2.1", @@ -76,13 +77,14 @@ "nyc": "^14.1.1", "ts-node": "^8.3.0", "tslint": "^5.11.0", - "typescript": "^3.9.7" + "typescript": "^5.1.6" }, "dependencies": { "@vechain/ethers": "^4.0.27-5", "bignumber.js": "^7.2.1", "blakejs": "^1.1.2", "elliptic": "6.5.4", + "ethers": "^6.6.2", "fast-json-stable-stringify": "^2.1.0", "js-sha3": "0.5.7", "rlp": "^2.0.0" From c29fd967a17d1464b50c94e81b137ad9108bca5e Mon Sep 17 00:00:00 2001 From: rodolfopietro97 Date: Wed, 12 Jul 2023 14:51:24 +0200 Subject: [PATCH 02/28] feat: Add keystore with regression tests and old version with original ethers --- package.json | 1 + src/old/keystore.ts | 84 +++++++++++++++++++++++++ tests/regression_check/keystore.test.ts | 25 ++++++++ 3 files changed, 110 insertions(+) create mode 100644 src/old/keystore.ts create mode 100644 tests/regression_check/keystore.test.ts diff --git a/package.json b/package.json index 0598bb6..bf00e63 100644 --- a/package.json +++ b/package.json @@ -21,6 +21,7 @@ "lint": "tslint -p .", "prepack": "npm run build", "test": "tslint -p . && NODE_ENV=test mocha --require ts-node/register --timeout 20000 --recursive './**/*.test.ts'", + "test:regression_check": "tslint -p . && NODE_ENV=test mocha --require ts-node/register --timeout 20000 --recursive './**/regression_check/*.test.ts'", "cover": "NODE_ENV=test nyc npm t" }, "nyc": { diff --git a/src/old/keystore.ts b/src/old/keystore.ts new file mode 100644 index 0000000..2a8f906 --- /dev/null +++ b/src/old/keystore.ts @@ -0,0 +1,84 @@ +import * as SecretStorage from '@vechain/ethers/utils/secret-storage' +import { Buffer } from 'buffer' + +/** to present encrypted private key in Ethereum keystore format. */ +export interface Keystore { + address: string + crypto: object + id: string + version: number +} + +export namespace Keystore { + /** + * encrypt private key to keystore with given password + * @param privateKey the private key to be encrypted + * @param password password to encrypt the private key + */ + export function encrypt(privateKey: Buffer, password: string) { + return SecretStorage.encrypt( + '0x' + privateKey.toString('hex'), + password, { + scrypt: { + N: 131072, + p: 1, + r: 8 + } + }).then(str => normalize(JSON.parse(str))) + } + + /** + * decrypt private key from keystore + * an error thrown if not well formed + * @param ks the keystore + * @param password password to decrypt keystore + */ + export function decrypt(ks: Keystore, password: string) { + return SecretStorage.decrypt(JSON.stringify(ks), password) + .then(sk => Buffer.from(sk.privateKey.slice(2), 'hex')) + } + + /** + * roughly check whether keystore is well formed + * @param ks the keystore + */ + export function wellFormed(ks: any): ks is Keystore { + try { + validate(normalize(ks)) + return true + } catch { + return false + } + } + + /** normalize keystore. e.g. lower case keys */ + function normalize(obj: object) { + const lowerKey = (o: object) => { + return Object.keys(o).reduce((converted, k) => { + let v = (o as any)[k] + if (typeof v === 'object') { + v = lowerKey(v) + } + converted[k.toLowerCase()] = v + return converted + }, {} as any) + } + return lowerKey(obj) + } + + function validate(ks: Keystore) { + if (ks.version !== 1 && ks.version !== 3) { + throw new Error('unsupported version') + } + if (!/^[0-9a-f]{40}$/i.test(ks.address)) { + throw new Error('invalid address') + } + if (!/^[0-9a-z]{8}-[0-9a-z]{4}-[0-9a-z]{4}-[0-9a-z]{4}-[0-9a-z]{12}$/i.test(ks.id)) { + throw new Error('invalid id') + } + if (typeof ks.crypto !== 'object') { + throw new Error('invalid crypto') + } + return ks + } +} diff --git a/tests/regression_check/keystore.test.ts b/tests/regression_check/keystore.test.ts new file mode 100644 index 0000000..4b3aebc --- /dev/null +++ b/tests/regression_check/keystore.test.ts @@ -0,0 +1,25 @@ +import { expect } from "chai" +import { Keystore, OldKeystore, secp256k1 } from "../../src" + +describe('keystore regression check', () => { + + // Private key to encrypt and decrypt + const privateKey = secp256k1.generatePrivateKey() + + it('encrypt and decrypt', async () => { + // Encrypt same private key with new and old keystore + const keyStore = await Keystore.encrypt(privateKey, '123') + const oldKeyStore = await OldKeystore.Keystore.encrypt(privateKey, '123') + + // Decrypt both keystore and compare results + const decryptedPrivateKey = await Keystore.decrypt(keyStore, '123') + const oldDecryptedPrivateKey = await OldKeystore.Keystore.decrypt(oldKeyStore, '123') + + // Encryption and decryption should result in the same private key + expect(decryptedPrivateKey).deep.equal(privateKey) + expect(oldDecryptedPrivateKey).deep.equal(privateKey) + + // Encryption and decryption should result in the same keystore + expect(decryptedPrivateKey).deep.equal(oldDecryptedPrivateKey) + }) +}) \ No newline at end of file From fab39cb9b7af3f9f399add41d6aa5557f1475403 Mon Sep 17 00:00:00 2001 From: rodolfopietro97 Date: Wed, 12 Jul 2023 14:54:03 +0200 Subject: [PATCH 03/28] feat: Keystore with original ethers --- src/keystore.ts | 31 ++++++++++++++++++++++--------- 1 file changed, 22 insertions(+), 9 deletions(-) diff --git a/src/keystore.ts b/src/keystore.ts index 2a8f906..c830179 100644 --- a/src/keystore.ts +++ b/src/keystore.ts @@ -1,5 +1,6 @@ -import * as SecretStorage from '@vechain/ethers/utils/secret-storage' -import { Buffer } from 'buffer' +import { ethers } from 'ethers' +import { secp256k1 } from './secp256k1' +import { address } from './address' /** to present encrypted private key in Ethereum keystore format. */ export interface Keystore { @@ -16,15 +17,27 @@ export namespace Keystore { * @param password password to encrypt the private key */ export function encrypt(privateKey: Buffer, password: string) { - return SecretStorage.encrypt( - '0x' + privateKey.toString('hex'), - password, { + // Public and Address are derived from private key + const derivePublicKey = secp256k1.derivePublicKey(privateKey) + const deriveAddress = address.fromPublicKey(derivePublicKey) + + // Create keystore account compatible with ethers + const keystoreAccount: ethers.KeystoreAccount = { + address: deriveAddress, + privateKey: '0x' + privateKey.toString('hex') + } + + // Scrypt options + const encryptOptions: ethers.EncryptOptions = { scrypt: { N: 131072, - p: 1, - r: 8 + r: 8, + p: 1 } - }).then(str => normalize(JSON.parse(str))) + } + + return ethers.encryptKeystoreJson(keystoreAccount, password, encryptOptions) + .then(str => normalize(JSON.parse(str))) } /** @@ -34,7 +47,7 @@ export namespace Keystore { * @param password password to decrypt keystore */ export function decrypt(ks: Keystore, password: string) { - return SecretStorage.decrypt(JSON.stringify(ks), password) + return ethers.decryptKeystoreJson(JSON.stringify(ks), password) .then(sk => Buffer.from(sk.privateKey.slice(2), 'hex')) } From e3a177bf9550531ac639123347e97be6da1fc61a Mon Sep 17 00:00:00 2001 From: rodolfopietro97 Date: Wed, 12 Jul 2023 18:28:52 +0200 Subject: [PATCH 04/28] feat: Switch ethers into hdnode with regression tests --- src/hdnode.ts | 17 ++-- src/old/hdnode.ts | 88 +++++++++++++++++++ tests/regression_check/mnemonic.test.ts | 110 ++++++++++++++++++++++++ 3 files changed, 208 insertions(+), 7 deletions(-) create mode 100644 src/old/hdnode.ts create mode 100644 tests/regression_check/mnemonic.test.ts diff --git a/src/hdnode.ts b/src/hdnode.ts index 9a63db6..275dc62 100644 --- a/src/hdnode.ts +++ b/src/hdnode.ts @@ -1,5 +1,4 @@ -import { Base58 } from '@vechain/ethers/utils/basex' -import * as HD from '@vechain/ethers/utils/hdnode' +import { ethers } from 'ethers' import { createHash } from 'crypto' import { ec as EC } from 'elliptic' import { address } from './address' @@ -21,11 +20,13 @@ export interface HDNode { } export namespace HDNode { + /** create node from mnemonic words */ export function fromMnemonic(words: string[], path=VET_DERIVATION_PATH) { // normalize words to lowercase const joinedWords = words.join(' ').toLowerCase() - const node = HD.fromMnemonic(joinedWords).derivePath(path) + const node = ethers.HDNodeWallet.fromMnemonic(ethers.Mnemonic.fromPhrase(joinedWords), path) + return createHDNode(node) } @@ -39,7 +40,8 @@ export namespace HDNode { const key = Buffer.concat([xpubPrefix, chainCode, Buffer.from(compressed)]) const checksum = sha256(sha256(key)).slice(0, 4) - const node = HD.fromExtendedKey(Base58.encode(Buffer.concat([key, checksum]))) + const node = ethers.HDNodeWallet.fromExtendedKey(ethers.encodeBase58(Buffer.concat([key, checksum]))) as ethers.HDNodeWallet + return createHDNode(node) } @@ -52,11 +54,12 @@ export namespace HDNode { const key = Buffer.concat([xprivPrefix, chainCode, Buffer.from([0]), priv]) const checksum = sha256(sha256(key)).slice(0, 4) - const node = HD.fromExtendedKey(Base58.encode(Buffer.concat([key, checksum]))) + const node = ethers.HDNodeWallet.fromExtendedKey(ethers.encodeBase58(Buffer.concat([key, checksum]))) as ethers.HDNodeWallet + return createHDNode(node) } - function createHDNode(ethersNode: HD.HDNode): HDNode { + function createHDNode(ethersNode: ethers.HDNodeWallet): HDNode { const pub = Buffer.from(curve.keyFromPublic(ethersNode.publicKey.slice(2), 'hex').getPublic(false, 'array')) const priv = ethersNode.privateKey ? Buffer.from(ethersNode.privateKey.slice(2), 'hex') : null const cc = Buffer.from(ethersNode.chainCode.slice(2), 'hex') @@ -76,7 +79,7 @@ export namespace HDNode { return addr }, derive(index) { - return createHDNode(ethersNode.derivePath('' + index)) + return createHDNode(ethersNode.deriveChild(index)) } } } diff --git a/src/old/hdnode.ts b/src/old/hdnode.ts new file mode 100644 index 0000000..a780d05 --- /dev/null +++ b/src/old/hdnode.ts @@ -0,0 +1,88 @@ +import { Base58 } from '@vechain/ethers/utils/basex' +import * as HD from '@vechain/ethers/utils/hdnode' +import { createHash } from 'crypto' +import { ec as EC } from 'elliptic' +import { address } from '../address' +import { Buffer } from 'buffer' + +// see https://github.com/satoshilabs/slips/blob/master/slip-0044.md +const VET_DERIVATION_PATH = `m/44'/818'/0'/0` +const xpubPrefix = Buffer.from('0488b21e000000000000000000', 'hex') +const xprivPrefix = Buffer.from('0488ade4000000000000000000', 'hex') +const curve = new EC('secp256k1') + +/** BIP32 hierarchical deterministic node */ +export interface HDNode { + readonly publicKey: Buffer + readonly privateKey: Buffer | null + readonly chainCode: Buffer + readonly address: string + derive(index: number): HDNode +} + +export namespace HDNode { + /** create node from mnemonic words */ + export function fromMnemonic(words: string[], path=VET_DERIVATION_PATH) { + // normalize words to lowercase + const joinedWords = words.join(' ').toLowerCase() + const node = HD.fromMnemonic(joinedWords).derivePath(path) + return createHDNode(node) + } + + /** + * create node from xpub + * @param pub public key + * @param chainCode chain code + */ + export function fromPublicKey(pub: Buffer, chainCode: Buffer) { + const compressed = curve.keyFromPublic(pub).getPublic(true, 'array') + const key = Buffer.concat([xpubPrefix, chainCode, Buffer.from(compressed)]) + const checksum = sha256(sha256(key)).slice(0, 4) + + const node = HD.fromExtendedKey(Base58.encode(Buffer.concat([key, checksum]))) + return createHDNode(node) + } + + /** + * create node from xpriv + * @param priv private key + * @param chainCode chain code + */ + export function fromPrivateKey(priv: Buffer, chainCode: Buffer) { + const key = Buffer.concat([xprivPrefix, chainCode, Buffer.from([0]), priv]) + const checksum = sha256(sha256(key)).slice(0, 4) + + const node = HD.fromExtendedKey(Base58.encode(Buffer.concat([key, checksum]))) + + return createHDNode(node) + } + + function createHDNode(ethersNode: HD.HDNode): HDNode { + const pub = Buffer.from(curve.keyFromPublic(ethersNode.publicKey.slice(2), 'hex').getPublic(false, 'array')) + const priv = ethersNode.privateKey ? Buffer.from(ethersNode.privateKey.slice(2), 'hex') : null + const cc = Buffer.from(ethersNode.chainCode.slice(2), 'hex') + const addr = address.fromPublicKey(pub) + + return { + get publicKey() { + return pub + }, + get privateKey() { + return priv + }, + get chainCode() { + return cc + }, + get address() { + return addr + }, + derive(index) { + return createHDNode(ethersNode.derivePath('' + index)) + } + } + } + + function sha256(data: Buffer) { + return createHash('sha256').update(data).digest() + } +} diff --git a/tests/regression_check/mnemonic.test.ts b/tests/regression_check/mnemonic.test.ts new file mode 100644 index 0000000..3ba8376 --- /dev/null +++ b/tests/regression_check/mnemonic.test.ts @@ -0,0 +1,110 @@ +import { expect } from "chai" +import { HDNode, OldHDNode, address, secp256k1 } from "../../src" + + +describe('mnemonic regression check', () => { + + // Mnemonic words + const words = 'ignore empty bird silly journey junior ripple have guard waste between tenant'.split(' ') + + // Public key and chain code + const publicKey = Buffer.from('04dc40b4324626eb393dbf77b6930e915dcca6297b42508adb743674a8ad5c69a046010f801a62cb945a6cb137a050cefaba0572429fc4afc57df825bfca2f219a', 'hex') + const chainCode = Buffer.from('105da5578eb3228655a8abe70bf4c317e525c7f7bb333634f5b7d1f70e111a33', 'hex') + + // Addresses for derivation + const addresses = [ + '339fb3c438606519e2c75bbf531fb43a0f449a70', + '5677099d06bc72f9da1113afa5e022feec424c8e', + '86231b5cdcbfe751b9ddcd4bd981fc0a48afe921', + 'd6f184944335f26ea59dbb603e38e2d434220fcd', + '2ac1a0aecd5c80fb5524348130ab7cf92670470a' + ] + + /** + * Compare derivation of child nodes. + * + * @param child Child node generated with ethers.js official library + * @param oldChild Child node generated with forked ethers.js library + * @param index Index of child node + * @param addressesFixture Addresses of child nodes after derivation + * @param nullPrivateKey If true, private key of child node MUST be expected null (case where derivation is made from public key) + */ + const compareDerivation = (child: HDNode, oldChild: OldHDNode.HDNode, index: number, addressesFixture: Array, nullPrivateKey: boolean) => { + // For child + expect(address.fromPublicKey(child.publicKey).slice(2)).equal(addressesFixture[index]) + expect(child.address).equal('0x' + addressesFixture[index]) + if(!nullPrivateKey) expect(secp256k1.derivePublicKey(child.privateKey!).toString('hex')).equal(child.publicKey.toString('hex')) + else expect(child.privateKey).equal(null) + + // For old child + expect(address.fromPublicKey(oldChild.publicKey).slice(2)).equal(addressesFixture[index]) + expect(oldChild.address).equal('0x' + addressesFixture[index]) + if(!nullPrivateKey) expect(secp256k1.derivePublicKey(oldChild.privateKey!).toString('hex')).equal(child.publicKey.toString('hex')) + else expect(child.privateKey).equal(null) + + // Compare both + expect(address.fromPublicKey(child.publicKey).slice(2)).equal(address.fromPublicKey(oldChild.publicKey).slice(2)) + expect(child.address).equal(oldChild.address) + if(!nullPrivateKey) expect(secp256k1.derivePublicKey(child.privateKey!).toString('hex')).equal(secp256k1.derivePublicKey(oldChild.privateKey!).toString('hex')) + else expect(child.privateKey).equal(null) + } + + it('fromMnemonic', async () => { + // Create node from mnemonic words + const node = HDNode.fromMnemonic(words) + const oldNode = OldHDNode.HDNode.fromMnemonic(words) + + // Check same node + expect(JSON.stringify(node)).to.equal(JSON.stringify(oldNode)) + }) + + it('fromPublicKey', async () => { + // Create node from public key and chain code + const node = HDNode.fromPublicKey(publicKey, chainCode) + const oldNode = OldHDNode.HDNode.fromPublicKey(publicKey, chainCode) + + // Check same node + expect(JSON.stringify(node)).to.equal(JSON.stringify(oldNode)) + }) + + it('fromPrivateKey', async () => { + // Temp node to get private key + const tempNode = HDNode.fromMnemonic(words) + + // Create node from public key and chain code + const node = HDNode.fromPrivateKey(tempNode.privateKey!, tempNode.chainCode) + const oldNode = OldHDNode.HDNode.fromPrivateKey(tempNode.privateKey!, tempNode.chainCode) + + // Check same node + expect(JSON.stringify(node)).to.equal(JSON.stringify(oldNode)) + }) + + it('createHDNode', async () => { + // Temp node to get private key + const tempNode = HDNode.fromMnemonic(words) + + // Create node from MNEMONIC WORDS + const node = HDNode.fromMnemonic(words) + const oldNode = OldHDNode.HDNode.fromMnemonic(words) + + // Create node from PRIVATE KEY + const xprivNode = HDNode.fromPrivateKey(tempNode.privateKey!, tempNode.chainCode) + const xprivNodeOld = OldHDNode.HDNode.fromPrivateKey(tempNode.privateKey!, tempNode.chainCode) + + // Create node from PUBLIC KEY + const xpubNode = HDNode.fromPublicKey(tempNode.publicKey, tempNode.chainCode) + const xpubNodeOld = OldHDNode.HDNode.fromPublicKey(tempNode.publicKey, tempNode.chainCode) + + // Check same nodes + for (let i = 0; i < 5; i++) { + // Compare derivation for child nodes from MNEMONIC WORDS + compareDerivation(node.derive(i), oldNode.derive(i), i, addresses, false) + + // Compare derivation for child nodes from PRIVATE KEY + compareDerivation(xprivNode.derive(i), xprivNodeOld.derive(i), i, addresses, false) + + // Compare derivation for child nodes from PUBLIC KEY + compareDerivation(xpubNode.derive(i), xpubNodeOld.derive(i), i, addresses, true) + } + }) +}) \ No newline at end of file From cd49016046677079d981e8f36ea2534aa4038c5f Mon Sep 17 00:00:00 2001 From: rodolfopietro97 Date: Wed, 12 Jul 2023 19:38:44 +0200 Subject: [PATCH 05/28] fix: Exclude "regression_tests" folder --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index bf00e63..bff7eae 100644 --- a/package.json +++ b/package.json @@ -20,7 +20,7 @@ "build": "rm -rf dist/ esm/ && tsc -d -p . && tsc --module esnext --outDir 'esm' -p .", "lint": "tslint -p .", "prepack": "npm run build", - "test": "tslint -p . && NODE_ENV=test mocha --require ts-node/register --timeout 20000 --recursive './**/*.test.ts'", + "test": "tslint -p . && NODE_ENV=test mocha --require ts-node/register --timeout 20000 --recursive './[!regression_check]**/*.test.ts'", "test:regression_check": "tslint -p . && NODE_ENV=test mocha --require ts-node/register --timeout 20000 --recursive './**/regression_check/*.test.ts'", "cover": "NODE_ENV=test nyc npm t" }, From adbece512203b67491dbd7ba6fc71936b02bf076 Mon Sep 17 00:00:00 2001 From: rodolfopietro97 Date: Wed, 12 Jul 2023 19:41:27 +0200 Subject: [PATCH 06/28] fix: Wrong filename for test --- tests/regression_check/{mnemonic.test.ts => hdnode.test.ts} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename tests/regression_check/{mnemonic.test.ts => hdnode.test.ts} (100%) diff --git a/tests/regression_check/mnemonic.test.ts b/tests/regression_check/hdnode.test.ts similarity index 100% rename from tests/regression_check/mnemonic.test.ts rename to tests/regression_check/hdnode.test.ts From ca870895c20be422910611dea742822d4d0cef0d Mon Sep 17 00:00:00 2001 From: rodolfopietro97 Date: Wed, 12 Jul 2023 19:42:13 +0200 Subject: [PATCH 07/28] fix: Name change into code --- tests/regression_check/hdnode.test.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/regression_check/hdnode.test.ts b/tests/regression_check/hdnode.test.ts index 3ba8376..ec37d65 100644 --- a/tests/regression_check/hdnode.test.ts +++ b/tests/regression_check/hdnode.test.ts @@ -2,7 +2,7 @@ import { expect } from "chai" import { HDNode, OldHDNode, address, secp256k1 } from "../../src" -describe('mnemonic regression check', () => { +describe('hdnode regression check', () => { // Mnemonic words const words = 'ignore empty bird silly journey junior ripple have guard waste between tenant'.split(' ') From ca4a212c45645f2b5b12d0aec6937d939c0aafcd Mon Sep 17 00:00:00 2001 From: rodolfopietro97 Date: Wed, 12 Jul 2023 20:00:43 +0200 Subject: [PATCH 08/28] feat: Original ethers into mnemonics --- src/mnemonic.ts | 8 +++---- src/old/mnemonic.ts | 31 +++++++++++++++++++++++++ tests/regression_check/mnemonic.test.ts | 23 ++++++++++++++++++ 3 files changed, 58 insertions(+), 4 deletions(-) create mode 100644 src/old/mnemonic.ts create mode 100644 tests/regression_check/mnemonic.test.ts diff --git a/src/mnemonic.ts b/src/mnemonic.ts index 31830d2..24671d3 100644 --- a/src/mnemonic.ts +++ b/src/mnemonic.ts @@ -1,4 +1,4 @@ -import * as HD from '@vechain/ethers/utils/hdnode' +import { ethers } from 'ethers' import { randomBytes } from 'crypto' import { HDNode } from './hdnode' @@ -9,8 +9,8 @@ export namespace mnemonic { * Every 4 bytes produce 3 words. */ export function generate(rng?: () => Buffer) { - rng = rng || (() => randomBytes(128 / 8)) - return HD.entropyToMnemonic(rng()).split(' ') + rng = rng ?? (() => randomBytes(128 / 8)) + return ethers.Mnemonic.fromEntropy(new Uint8Array(rng())).phrase.split(' ') } /** @@ -18,7 +18,7 @@ export namespace mnemonic { * @param words mnemonic words */ export function validate(words: string[]) { - return HD.isValidMnemonic(words.join(' ')) + return ethers.Mnemonic.isValidMnemonic(words.join(' ')) } /** diff --git a/src/old/mnemonic.ts b/src/old/mnemonic.ts new file mode 100644 index 0000000..31830d2 --- /dev/null +++ b/src/old/mnemonic.ts @@ -0,0 +1,31 @@ +import * as HD from '@vechain/ethers/utils/hdnode' +import { randomBytes } from 'crypto' +import { HDNode } from './hdnode' + +export namespace mnemonic { + /** + * generate BIP39 mnemonic words + * @param rng the optional random number generator, which generates 16~32 (step 4) random bytes. + * Every 4 bytes produce 3 words. + */ + export function generate(rng?: () => Buffer) { + rng = rng || (() => randomBytes(128 / 8)) + return HD.entropyToMnemonic(rng()).split(' ') + } + + /** + * check if the given mnemonic words have valid checksum + * @param words mnemonic words + */ + export function validate(words: string[]) { + return HD.isValidMnemonic(words.join(' ')) + } + + /** + * derive private key at index 0 from mnemonic words according to BIP32. + * the derivation path is defined at https://github.com/satoshilabs/slips/blob/master/slip-0044.md + */ + export function derivePrivateKey(words: string[]): Buffer { + return HDNode.fromMnemonic(words).derive(0).privateKey! + } +} diff --git a/tests/regression_check/mnemonic.test.ts b/tests/regression_check/mnemonic.test.ts new file mode 100644 index 0000000..f21ad58 --- /dev/null +++ b/tests/regression_check/mnemonic.test.ts @@ -0,0 +1,23 @@ +import { expect } from "chai" +import { OldMnemonic, mnemonic } from "../../src" + +describe('mnemonic regression check', () => { + + it('generate', () => { + // Old Mnemonic + expect(OldMnemonic.mnemonic.generate().length).equal(12) + + // New Mnemonic + expect(mnemonic.generate().length).equal(12) + }) + + it('validate', () => { + // Old Mnemonic + expect(OldMnemonic.mnemonic.validate(['hello', 'world'])).equal(false) + expect(OldMnemonic.mnemonic.validate(OldMnemonic.mnemonic.generate())).equal(true) + + // New Mnemonic + expect(mnemonic.validate(['hello', 'world'])).equal(false) + expect(mnemonic.validate(mnemonic.generate())).equal(true) + }) +}) \ No newline at end of file From c4111e04373f1a4290b2d641313432698d8fff35 Mon Sep 17 00:00:00 2001 From: rodolfopietro97 Date: Thu, 13 Jul 2023 15:37:57 +0200 Subject: [PATCH 09/28] feat: Old abi for regression tests --- src/old/abi.ts | 265 +++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 265 insertions(+) create mode 100644 src/old/abi.ts diff --git a/src/old/abi.ts b/src/old/abi.ts new file mode 100644 index 0000000..62fd1a4 --- /dev/null +++ b/src/old/abi.ts @@ -0,0 +1,265 @@ +import { AbiCoder, formatSignature as _formatSignature } from '@vechain/ethers/utils/abi-coder' +import { keccak256 } from '../keccak' +import { Buffer } from 'buffer' + +class Coder extends AbiCoder { + constructor() { + super((type, value) => { + if ((type.match(/^u?int/) && !Array.isArray(value) && typeof value !== 'object') || + value._ethersType === 'BigNumber') { + return value.toString() + } + return value + }) + } + + public encode(types: Array, values: any[]): string { + try { + return super.encode(types, values) + } catch (err) { + if (err.reason) { + throw new Error(err.reason) + } + throw err + } + } + + public decode(types: Array, data: string): any[] { + try { + return super.decode(types, data) + } catch (err) { + if (err.reason) { + throw new Error(err.reason) + } + throw err + } + } +} + +const coder = new Coder() + +function formatSignature(fragment: any) { + try { + return _formatSignature(fragment) + .replace(/\(tuple\(/g, '((') + .replace(/\,tuple\(/g, ',(') + } catch (err) { + if (err.reason) { + throw new Error(err.reason) + } + throw err + } +} + +/** encode/decode parameters of contract function call, event log, according to ABI JSON */ +export namespace abi { + + /** + * encode single parameter + * @param type type of the parameter + * @param value value of the parameter + * @returns encoded value in hex string + */ + export function encodeParameter(type: string, value: any) { + return coder.encode([type], [value]) + } + + /** + * decode single parameter + * @param type type of the parameter + * @param data encoded parameter in hex string + * @returns decoded value + */ + export function decodeParameter(type: string, data: string) { + return coder.decode([type], data)[0] + } + + /** + * encode a group of parameters + * @param types type array + * @param values value array + * @returns encoded values in hex string + */ + export function encodeParameters(types: Function.Parameter[], values: any[]) { + return coder.encode(types, values) + } + + /** + * decode a group of parameters + * @param types type array + * @param data encoded values in hex string + * @returns decoded object + */ + export function decodeParameters(types: Function.Parameter[], data: string) { + const result = coder.decode(types, data) + const decoded: Decoded = {} + types.forEach((t, i) => { + decoded[i] = result[i] + if (t.name) { + decoded[t.name] = result[i] + } + }) + return decoded + } + + /** for contract function */ + export class Function { + /** canonical name */ + public readonly canonicalName: string + + /** the function signature, aka. 4 bytes prefix */ + public readonly signature: string + + /** + * create a function object + * @param definition abi definition of the function + */ + constructor(public readonly definition: Function.Definition) { + this.canonicalName = formatSignature(definition) + this.signature = '0x' + keccak256(this.canonicalName).slice(0, 4).toString('hex') + } + + /** + * encode input parameters into call data + * @param args arguments for the function + */ + public encode(...args: any[]): string { + return this.signature + encodeParameters(this.definition.inputs, args).slice(2) + } + + /** + * decode output data + * @param outputData output data to decode + */ + public decode(outputData: string) { + return decodeParameters(this.definition.outputs, outputData) + } + } + + export namespace Function { + export type StateMutability = 'pure' | 'view' | 'constant' | 'payable' | 'nonpayable' + export interface Parameter { + name: string + type: string + components?: any[] // Tuples ONLY + internalType?: string + } + + export interface Definition { + type: 'function' + name: string + constant?: boolean + payable?: boolean + stateMutability: StateMutability + inputs: Parameter[] + outputs: Parameter[] + } + } + + /** for contract event */ + export class Event { + /** canonical name */ + public readonly canonicalName: string + + /** the event signature */ + public readonly signature: string + + /** for contract event */ + constructor(public readonly definition: Event.Definition) { + this.canonicalName = formatSignature(definition) + this.signature = '0x' + keccak256(this.canonicalName).toString('hex') + } + + /** + * encode an object of indexed keys into topics. + * @param indexed an object contains indexed keys + */ + public encode(indexed: object): Array { + const topics: Array = [] + if (!this.definition.anonymous) { + topics.push(this.signature) + } + for (const input of this.definition.inputs) { + if (!input.indexed) { + continue + } + const value = (indexed as any)[input.name] + if (value === undefined || value === null) { + topics.push(null) + } else { + let topic + // https://docs.soliditylang.org/en/v0.8.11/abi-spec.html#encoding-of-indexed-event-parameters + if (isValueType(input.type)) { + topic = encodeParameter(input.type, value) + } else { + if (input.type === 'string') { + topic = '0x' + keccak256(value).toString('hex') + } else if (typeof value === 'string' && /^0x[0-9a-f]+$/i.test(value) && value.length % 2 === 0) { + // value is encoded + topic = '0x' + keccak256(Buffer.from(value.slice(2), 'hex')).toString('hex') + } else { + throw new Error(`event.encode: invalid ${input.type} value`) + } + } + topics.push(topic) + } + } + return topics + } + + /** + * decode event log + * @param data data in event output + * @param topics topics in event + */ + public decode(data: string, topics: string[]) { + if (!this.definition.anonymous) { + topics = topics.slice(1) + } + + if (this.definition.inputs.filter(t => t.indexed).length !== topics.length) { + throw new Error('invalid topics count') + } + + const decodedNonIndexed = coder.decode( + this.definition.inputs.filter(t => !t.indexed), data) + + const decoded: Decoded = {} + this.definition.inputs.forEach((t, i) => { + if (t.indexed) { + const topic = topics.shift()! + decoded[i] = isValueType(t.type) ? decodeParameter(t.type, topic) : topic + } else { + decoded[i] = decodedNonIndexed.shift() + } + if (t.name) { + decoded[t.name] = decoded[i] + } + }) + return decoded + } + } + + export namespace Event { + export interface Parameter { + name: string + type: string + indexed: boolean + components?: any[] // Tuples ONLY + internalType?: string + } + + export interface Definition { + type: 'event' + name: string + anonymous?: boolean + inputs: Parameter[] + } + } + + export type Decoded = { [name: string]: any } & { [index: number]: any } + + function isValueType(type: string) { + return type === 'address' || type === 'bool' || /^(u?int)([0-9]*)$/.test(type) || /^bytes([0-9]+)$/.test(type) + } +} From 33da54aa4b7f98c77b21964328701352c8e79d73 Mon Sep 17 00:00:00 2001 From: rodolfopietro97 Date: Thu, 13 Jul 2023 15:48:49 +0200 Subject: [PATCH 10/28] feat: Imports for old versions --- src/index.ts | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/index.ts b/src/index.ts index 3d352a7..8d91e8c 100644 --- a/src/index.ts +++ b/src/index.ts @@ -12,3 +12,9 @@ export * from './keccak' export * from './keystore' export * from './mnemonic' export * from './hdnode' + +// Old +export * as OldAbi from './old/abi' +export * as OldHDNode from './old/hdnode' +export * as OldKeystore from './old/keystore' +export * as OldMnemonic from './old/mnemonic' From 4bebc2b2378c92788830bb4790ceef99e51f59a1 Mon Sep 17 00:00:00 2001 From: rodolfopietro97 Date: Thu, 13 Jul 2023 15:49:35 +0200 Subject: [PATCH 11/28] fix: ts-no check because last version of typescript is stritcly w.r.t old --- src/abi.ts | 1 + src/old/abi.ts | 1 + 2 files changed, 2 insertions(+) diff --git a/src/abi.ts b/src/abi.ts index 8f0877c..511f163 100644 --- a/src/abi.ts +++ b/src/abi.ts @@ -1,3 +1,4 @@ +// @ts-nocheck import { AbiCoder, formatSignature as _formatSignature } from '@vechain/ethers/utils/abi-coder' import { keccak256 } from './keccak' import { Buffer } from 'buffer' diff --git a/src/old/abi.ts b/src/old/abi.ts index 62fd1a4..2ef121c 100644 --- a/src/old/abi.ts +++ b/src/old/abi.ts @@ -1,3 +1,4 @@ +// @ts-nocheck import { AbiCoder, formatSignature as _formatSignature } from '@vechain/ethers/utils/abi-coder' import { keccak256 } from '../keccak' import { Buffer } from 'buffer' From c28962f330a696fc704cfaa01be139feb901e829 Mon Sep 17 00:00:00 2001 From: rodolfopietro97 Date: Thu, 13 Jul 2023 15:51:34 +0200 Subject: [PATCH 12/28] fix: First tests of regression for ABI --- src/old/abi.ts | 2 +- tests/regression_check/abi.test.ts | 68 ++++++++++++++++++++++++++++++ 2 files changed, 69 insertions(+), 1 deletion(-) create mode 100644 tests/regression_check/abi.test.ts diff --git a/src/old/abi.ts b/src/old/abi.ts index 2ef121c..87fb9dd 100644 --- a/src/old/abi.ts +++ b/src/old/abi.ts @@ -3,7 +3,7 @@ import { AbiCoder, formatSignature as _formatSignature } from '@vechain/ethers/u import { keccak256 } from '../keccak' import { Buffer } from 'buffer' -class Coder extends AbiCoder { +export class Coder extends AbiCoder { constructor() { super((type, value) => { if ((type.match(/^u?int/) && !Array.isArray(value) && typeof value !== 'object') || diff --git a/tests/regression_check/abi.test.ts b/tests/regression_check/abi.test.ts new file mode 100644 index 0000000..a7763dd --- /dev/null +++ b/tests/regression_check/abi.test.ts @@ -0,0 +1,68 @@ +import { expect } from "chai" +import { OldAbi } from "../../src" +import { ethers } from "ethers" + +describe('abi regression check', () => { + + // Low level coders + const coder = new OldAbi.Coder() + const ethersCoder = new ethers.AbiCoder() + + // Demonstrate compatibility between old and new ethers abi coder + it('LOW LEVEL encode', () => { + // Old + expect(coder.encode(['uint256'], ['2345675643'])).equal('0x000000000000000000000000000000000000000000000000000000008bd02b7b') + expect(() => coder.encode(['bytes32'], ['0xdf3234'])).to.throw() + + expect(coder.encode(['bytes32'], ['0xdf32340000000000000000000000000000000000000000000000000000000000'])).equal('0xdf32340000000000000000000000000000000000000000000000000000000000') + expect(coder.encode(['bytes'], ['0xdf3234'])).equal('0x00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000003df32340000000000000000000000000000000000000000000000000000000000') + expect(coder.encode(['uint256'], ['2345675643'])).equal('0x000000000000000000000000000000000000000000000000000000008bd02b7b') + expect(coder.encode(['bytes32[]'], [['0xdf32340000000000000000000000000000000000000000000000000000000000', '0xfdfd000000000000000000000000000000000000000000000000000000000000']])).equal('0x00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000002df32340000000000000000000000000000000000000000000000000000000000fdfd000000000000000000000000000000000000000000000000000000000000') + + // New + expect(ethersCoder.encode(['uint256'], ['2345675643'])).equal('0x000000000000000000000000000000000000000000000000000000008bd02b7b') + expect(() => ethersCoder.encode(['bytes32'], ['0xdf3234'])).to.throw() + + expect(ethersCoder.encode(['bytes32'], ['0xdf32340000000000000000000000000000000000000000000000000000000000'])).equal('0xdf32340000000000000000000000000000000000000000000000000000000000') + expect(ethersCoder.encode(['bytes'], ['0xdf3234'])).equal('0x00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000003df32340000000000000000000000000000000000000000000000000000000000') + expect(ethersCoder.encode(['uint256'], ['2345675643'])).equal('0x000000000000000000000000000000000000000000000000000000008bd02b7b') + expect(ethersCoder.encode(['bytes32[]'], [['0xdf32340000000000000000000000000000000000000000000000000000000000', '0xfdfd000000000000000000000000000000000000000000000000000000000000']])).equal('0x00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000002df32340000000000000000000000000000000000000000000000000000000000fdfd000000000000000000000000000000000000000000000000000000000000') + + // Compare + expect(ethersCoder.encode(['uint256'], ['2345675643'])) + .equal(coder.encode(['uint256'], ['2345675643'])) + + expect(ethersCoder.encode(['bytes32'], ['0xdf32340000000000000000000000000000000000000000000000000000000000'])) + .equal(coder.encode(['bytes32'], ['0xdf32340000000000000000000000000000000000000000000000000000000000'])) + + expect(ethersCoder.encode(['bytes'], ['0xdf3234'])) + .equal(coder.encode(['bytes'], ['0xdf3234'])) + + expect(ethersCoder.encode(['uint256'], ['2345675643'])) + .equal(coder.encode(['uint256'], ['2345675643'])) + + expect(ethersCoder.encode(['bytes32[]'], [['0xdf32340000000000000000000000000000000000000000000000000000000000', '0xfdfd000000000000000000000000000000000000000000000000000000000000']])) + .equal(coder.encode(['bytes32[]'], [['0xdf32340000000000000000000000000000000000000000000000000000000000', '0xfdfd000000000000000000000000000000000000000000000000000000000000']])) + }) + + // Demonstrate compatibility between old and new ethers abi coder + it('LOW LEVEL decode', () => { + // Old + expect(coder.decode(['uint256'], '0x0000000000000000000000000000000000000000000000000000000000000010')[0]).equal("16") + expect(coder.decode(['string'], '0x0000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000848656c6c6f212521000000000000000000000000000000000000000000000000')[0]) + .equal("Hello!%!") + expect(coder.decode(['string'], '0x0000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000848656c6c6f212521000000000000000000000000000000000000000000000000')[0]) + .equal("Hello!%!") + + expect(() => coder.decode(['uint256'], 'WRONG_UINT')[0]).to.throw() + + // New + expect(ethersCoder.decode(['uint256'], '0x0000000000000000000000000000000000000000000000000000000000000010').values().next().value.toString()).equal("16") + expect(ethersCoder.decode(['string'], '0x0000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000848656c6c6f212521000000000000000000000000000000000000000000000000').values().next().value.toString()) + .equal("Hello!%!") + expect(ethersCoder.decode(['string'], '0x0000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000848656c6c6f212521000000000000000000000000000000000000000000000000').values().next().value.toString()) + .equal("Hello!%!") + + expect(() => ethersCoder.decode(['uint256'], 'WRONG_UINT').values().next().value.toString()).to.throw() + }) +}) \ No newline at end of file From ed2c79b8cfe5bf7033ec556e3424fba87b7d3527 Mon Sep 17 00:00:00 2001 From: rodolfopietro97 Date: Thu, 13 Jul 2023 16:55:19 +0200 Subject: [PATCH 13/28] fix: Generalize the error --- tests/abi.test.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/abi.test.ts b/tests/abi.test.ts index 8ac29e1..a631c12 100644 --- a/tests/abi.test.ts +++ b/tests/abi.test.ts @@ -220,7 +220,7 @@ describe('abi', () => { expect(() => abi.encodeParameter('WRONG', 10)).to.throw() // Exception on decoding - expect(() => abi.decodeParameter('uint256', 'WRONG_UINT')).to.throw(Error, "invalid hexidecimal string") + expect(() => abi.decodeParameter('uint256', 'WRONG_UINT')).to.throw() }) it('function', () => { From 02ef99d64ace4700ebe0b297ee3a9f49749ef558 Mon Sep 17 00:00:00 2001 From: rodolfopietro97 Date: Fri, 14 Jul 2023 16:10:10 +0200 Subject: [PATCH 14/28] feat: Add regression --- tests/regression_check/abi.test.ts | 63 ++++++++++++++++++++++++++++-- 1 file changed, 60 insertions(+), 3 deletions(-) diff --git a/tests/regression_check/abi.test.ts b/tests/regression_check/abi.test.ts index a7763dd..4bab0df 100644 --- a/tests/regression_check/abi.test.ts +++ b/tests/regression_check/abi.test.ts @@ -1,6 +1,7 @@ import { expect } from "chai" import { OldAbi } from "../../src" import { ethers } from "ethers" +import * as web3 from 'web3' describe('abi regression check', () => { @@ -19,7 +20,7 @@ describe('abi regression check', () => { expect(coder.encode(['uint256'], ['2345675643'])).equal('0x000000000000000000000000000000000000000000000000000000008bd02b7b') expect(coder.encode(['bytes32[]'], [['0xdf32340000000000000000000000000000000000000000000000000000000000', '0xfdfd000000000000000000000000000000000000000000000000000000000000']])).equal('0x00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000002df32340000000000000000000000000000000000000000000000000000000000fdfd000000000000000000000000000000000000000000000000000000000000') - // New + // New Ethers expect(ethersCoder.encode(['uint256'], ['2345675643'])).equal('0x000000000000000000000000000000000000000000000000000000008bd02b7b') expect(() => ethersCoder.encode(['bytes32'], ['0xdf3234'])).to.throw() @@ -28,7 +29,33 @@ describe('abi regression check', () => { expect(ethersCoder.encode(['uint256'], ['2345675643'])).equal('0x000000000000000000000000000000000000000000000000000000008bd02b7b') expect(ethersCoder.encode(['bytes32[]'], [['0xdf32340000000000000000000000000000000000000000000000000000000000', '0xfdfd000000000000000000000000000000000000000000000000000000000000']])).equal('0x00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000002df32340000000000000000000000000000000000000000000000000000000000fdfd000000000000000000000000000000000000000000000000000000000000') - // Compare + // New Web3 + expect(web3.eth.abi.encodeParameter('uint256', '2345675643')).equal('0x000000000000000000000000000000000000000000000000000000008bd02b7b') + // **NOTE** here WEB3 doesn't throw. This aspect MUST be handled + // expect(() => web3.eth.abi.encodeParameter('bytes32', '0xdf3234')).to.throw() + + expect(web3.eth.abi.encodeParameter('bytes32', '0xdf32340000000000000000000000000000000000000000000000000000000000')).equal('0xdf32340000000000000000000000000000000000000000000000000000000000') + expect(web3.eth.abi.encodeParameter('bytes', '0xdf3234')).equal('0x00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000003df32340000000000000000000000000000000000000000000000000000000000') + expect(web3.eth.abi.encodeParameter('uint256', '2345675643')).equal('0x000000000000000000000000000000000000000000000000000000008bd02b7b') + expect(web3.eth.abi.encodeParameter('bytes32[]', ['0xdf32340000000000000000000000000000000000000000000000000000000000', '0xfdfd000000000000000000000000000000000000000000000000000000000000'])).equal('0x00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000002df32340000000000000000000000000000000000000000000000000000000000fdfd000000000000000000000000000000000000000000000000000000000000') + + // Compare - New Ethers/OLD + expect(ethersCoder.encode(['uint256'], ['2345675643'])) + .equal(coder.encode(['uint256'], ['2345675643'])) + + expect(ethersCoder.encode(['bytes32'], ['0xdf32340000000000000000000000000000000000000000000000000000000000'])) + .equal(coder.encode(['bytes32'], ['0xdf32340000000000000000000000000000000000000000000000000000000000'])) + + expect(ethersCoder.encode(['bytes'], ['0xdf3234'])) + .equal(coder.encode(['bytes'], ['0xdf3234'])) + + expect(ethersCoder.encode(['uint256'], ['2345675643'])) + .equal(coder.encode(['uint256'], ['2345675643'])) + + expect(ethersCoder.encode(['bytes32[]'], [['0xdf32340000000000000000000000000000000000000000000000000000000000', '0xfdfd000000000000000000000000000000000000000000000000000000000000']])) + .equal(coder.encode(['bytes32[]'], [['0xdf32340000000000000000000000000000000000000000000000000000000000', '0xfdfd000000000000000000000000000000000000000000000000000000000000']])) + + // Compare - New Ethers/New Web3 expect(ethersCoder.encode(['uint256'], ['2345675643'])) .equal(coder.encode(['uint256'], ['2345675643'])) @@ -56,7 +83,7 @@ describe('abi regression check', () => { expect(() => coder.decode(['uint256'], 'WRONG_UINT')[0]).to.throw() - // New + // New Ethers expect(ethersCoder.decode(['uint256'], '0x0000000000000000000000000000000000000000000000000000000000000010').values().next().value.toString()).equal("16") expect(ethersCoder.decode(['string'], '0x0000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000848656c6c6f212521000000000000000000000000000000000000000000000000').values().next().value.toString()) .equal("Hello!%!") @@ -64,5 +91,35 @@ describe('abi regression check', () => { .equal("Hello!%!") expect(() => ethersCoder.decode(['uint256'], 'WRONG_UINT').values().next().value.toString()).to.throw() + + // New Web3 + expect(new String(web3.eth.abi.decodeParameter('uint256', '0x0000000000000000000000000000000000000000000000000000000000000010')).toString()).equal("16") + expect(new String(web3.eth.abi.decodeParameter('string', '0x0000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000848656c6c6f212521000000000000000000000000000000000000000000000000')).toString()) + .equal("Hello!%!") + expect(new String(web3.eth.abi.decodeParameter('string', '0x0000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000848656c6c6f212521000000000000000000000000000000000000000000000000')).toString()) + .equal("Hello!%!") + + expect(() => web3.eth.abi.decodeParameter('uint256', 'WRONG_UINT')).to.throw() + + // Compare - New Ethers/OLD + expect(coder.decode(['uint256'], '0x0000000000000000000000000000000000000000000000000000000000000010')[0]) + .equal(ethersCoder.decode(['uint256'], '0x0000000000000000000000000000000000000000000000000000000000000010').values().next().value.toString()) + + expect(coder.decode(['string'], '0x0000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000848656c6c6f212521000000000000000000000000000000000000000000000000')[0]) + .equal(ethersCoder.decode(['string'], '0x0000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000848656c6c6f212521000000000000000000000000000000000000000000000000').values().next().value.toString()) + + expect(coder.decode(['string'], '0x0000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000848656c6c6f212521000000000000000000000000000000000000000000000000')[0]) + .equal(ethersCoder.decode(['string'], '0x0000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000848656c6c6f212521000000000000000000000000000000000000000000000000').values().next().value.toString()) + + // Compare - New Ethers/New Web3 + expect(new String(web3.eth.abi.decodeParameter('uint256', '0x0000000000000000000000000000000000000000000000000000000000000010')).toString()) + .equal(ethersCoder.decode(['uint256'], '0x0000000000000000000000000000000000000000000000000000000000000010').values().next().value.toString()) + + expect(new String(web3.eth.abi.decodeParameter('string', '0x0000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000848656c6c6f212521000000000000000000000000000000000000000000000000')).toString()) + .equal(ethersCoder.decode(['string'], '0x0000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000848656c6c6f212521000000000000000000000000000000000000000000000000').values().next().value.toString()) + + expect(new String(web3.eth.abi.decodeParameter('string', '0x0000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000848656c6c6f212521000000000000000000000000000000000000000000000000')).toString()) + .equal(ethersCoder.decode(['string'], '0x0000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000848656c6c6f212521000000000000000000000000000000000000000000000000').values().next().value.toString()) + }) }) \ No newline at end of file From b6621dbe44bb8f85792d71a7c1153bd5b788d421 Mon Sep 17 00:00:00 2001 From: rodolfopietro97 Date: Fri, 14 Jul 2023 16:13:44 +0200 Subject: [PATCH 15/28] feat: Remove coverage for old files and add web3.js --- package.json | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/package.json b/package.json index bff7eae..1042e36 100644 --- a/package.json +++ b/package.json @@ -30,7 +30,8 @@ ], "exclude": [ "tests/", - "**/*.d.ts" + "**/*.d.ts", + "src/old/**" ], "extension": [ ".ts" @@ -88,7 +89,8 @@ "ethers": "^6.6.2", "fast-json-stable-stringify": "^2.1.0", "js-sha3": "0.5.7", - "rlp": "^2.0.0" + "rlp": "^2.0.0", + "web3": "^4.0.3" }, "sideEffects": false } From 5a5c43ba7d496368d08dee881ead359df69a6c7e Mon Sep 17 00:00:00 2001 From: rodolfopietro97 Date: Fri, 14 Jul 2023 16:13:59 +0200 Subject: [PATCH 16/28] chore: TEMP semy working abi2 --- src/abi2 | 303 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 303 insertions(+) create mode 100644 src/abi2 diff --git a/src/abi2 b/src/abi2 new file mode 100644 index 0000000..47ad562 --- /dev/null +++ b/src/abi2 @@ -0,0 +1,303 @@ +// @ts-nocheck +import { AbiCoder, formatSignature as _formatSignature } from '@vechain/ethers/utils/abi-coder' +import { ethers } from 'ethers' +import { keccak256 } from './keccak' +import { Buffer } from 'buffer' +import { Verifier } from './utils/verifier' + +class Coder extends AbiCoder { + constructor() { + super((type, value) => { + if ((type.match(/^u?int/) && !Array.isArray(value) && typeof value !== 'object') || + value._ethersType === 'BigNumber') { + return value.toString() + } + return value + }) + } + + public encode(types: Array, values: any[]): string { + try { + return super.encode(types, values) + } catch (err) { + if (err.reason) { + throw new Error(err.reason) + } + throw err + } + } + + public decode(types: Array, data: string): any[] { + try { + return super.decode(types, data) + } catch (err) { + if (err.reason) { + throw new Error(err.reason) + } + throw err + } + } +} + +const coder = new Coder() +const ethersCoder = new ethers.AbiCoder() + +function formatSignature(fragment: any) { + try { + return _formatSignature(fragment) + .replace(/\(tuple\(/g, '((') + .replace(/\,tuple\(/g, ',(') + } catch (err) { + if (err.reason) { + throw new Error(err.reason) + } + throw err + } +} + +/** encode/decode parameters of contract function call, event log, according to ABI JSON */ +export namespace abi { + + /** + * encode single parameter + * @param type type of the parameter + * @param value value of the parameter + * @returns encoded value in hex string + */ + export function encodeParameter(type: string, value: any) { + return ethersCoder.encode([type], [value]) + } + + /** + * decode single parameter + * @param type type of the parameter + * @param data encoded parameter in hex string + * @returns decoded value + */ + export function decodeParameter(type: string, data: string) { + return ethersCoder.decode([type], data).values().next().value.toString() + } + + /** + * encode a group of parameters + * @param types type array + * @param values value array + * @returns encoded values in hex string + */ + export function encodeParameters(types: Function.Parameter[], values: any[]) { + return ethersCoder.encode(types, values) + } + + /** + * decode a group of parameters + * @param types type array + * @param data encoded values in hex string + * @returns decoded object + */ + export function decodeParameters(types: Function.Parameter[], data: string) { + const resultOld = coder.decode(types, data) + const result = JSON.parse(JSON.stringify(ethersCoder.decode(types, data).toArray())) + const resultWithLowerCaseHexs = result.map((res) => { + return Verifier.verifyHex(res) ? res.toString().toLowerCase() : res + }) + console.log("\n\nRESULT WITH LOWER CASE HEXS\n\n", resultWithLowerCaseHexs) + console.log("\n\nRESULT OLD\n\n", resultOld) + + + const decoded: Decoded = {} + types.forEach((t, i) => { + + // Take each attribute name of component and concat to attribute name of tuple + const componentNamesList = types[i].components?.map((component) => { + return component.name + }) + if(resultWithLowerCaseHexs.leength > 0) { + for (const resultWithLowerCaseHexs of resultWithLowerCaseHexs[i]) { + // [[Array] + [{ componentsName: element }]] + const newComponent = + componentOfResult + .concat(componentNamesList?.map((componentName, componentIndex) => { + return { componentName: componentOfResult[componentIndex] } + })) + decoded[i] = newComponent + } + } + + + // decoded[i] = result[i] + if (t.name) { + decoded[t.name] = resultWithLowerCaseHexs[i] + // console.log("\n\RESULT 2[i]\n", result[i]) + + // console.log("\nRESULT [i]\n", result[i], "\n\RESULT 2[i]\n", result2[i]) + // console.log("\n\nDECODED [i]\n\n", decoded[i]) + // console.log("\n\nTYPES [i].components\n\n", types[i].components) + + } + }) + return decoded + } + + /** for contract function */ + export class Function { + /** canonical name */ + public readonly canonicalName: string + + /** the function signature, aka. 4 bytes prefix */ + public readonly signature: string + + /** + * create a function object + * @param definition abi definition of the function + */ + constructor(public readonly definition: Function.Definition) { + this.canonicalName = formatSignature(definition) + console.log("\n\nDEFINITION\n\n", definition) + console.log("\n\nCANONICAL NAME\n\n", this.canonicalName) + this.signature = '0x' + keccak256(this.canonicalName).slice(0, 4).toString('hex') + } + + /** + * encode input parameters into call data + * @param args arguments for the function + */ + public encode(...args: any[]): string { + return this.signature + encodeParameters(this.definition.inputs, args).slice(2) + } + + /** + * decode output data + * @param outputData output data to decode + */ + public decode(outputData: string) { + return decodeParameters(this.definition.outputs, outputData) + } + } + + export namespace Function { + export type StateMutability = 'pure' | 'view' | 'constant' | 'payable' | 'nonpayable' + export interface Parameter { + name: string + type: string + components?: any[] // Tuples ONLY + internalType?: string + } + + export interface Definition { + type: 'function' + name: string + constant?: boolean + payable?: boolean + stateMutability: StateMutability + inputs: Parameter[] + outputs: Parameter[] + } + } + + /** for contract event */ + export class Event { + /** canonical name */ + public readonly canonicalName: string + + /** the event signature */ + public readonly signature: string + + /** for contract event */ + constructor(public readonly definition: Event.Definition) { + this.canonicalName = formatSignature(definition) + this.signature = '0x' + keccak256(this.canonicalName).toString('hex') + } + + /** + * encode an object of indexed keys into topics. + * @param indexed an object contains indexed keys + */ + public encode(indexed: object): Array { + const topics: Array = [] + if (!this.definition.anonymous) { + topics.push(this.signature) + } + for (const input of this.definition.inputs) { + if (!input.indexed) { + continue + } + const value = (indexed as any)[input.name] + if (value === undefined || value === null) { + topics.push(null) + } else { + let topic + // https://docs.soliditylang.org/en/v0.8.11/abi-spec.html#encoding-of-indexed-event-parameters + if (isValueType(input.type)) { + topic = encodeParameter(input.type, value) + } else { + if (input.type === 'string') { + topic = '0x' + keccak256(value).toString('hex') + } else if (typeof value === 'string' && /^0x[0-9a-f]+$/i.test(value) && value.length % 2 === 0) { + // value is encoded + topic = '0x' + keccak256(Buffer.from(value.slice(2), 'hex')).toString('hex') + } else { + throw new Error(`event.encode: invalid ${input.type} value`) + } + } + topics.push(topic) + } + } + return topics + } + + /** + * decode event log + * @param data data in event output + * @param topics topics in event + */ + public decode(data: string, topics: string[]) { + if (!this.definition.anonymous) { + topics = topics.slice(1) + } + + if (this.definition.inputs.filter(t => t.indexed).length !== topics.length) { + throw new Error('invalid topics count') + } + + const decodedNonIndexed = coder.decode( + this.definition.inputs.filter(t => !t.indexed), data) + + const decoded: Decoded = {} + this.definition.inputs.forEach((t, i) => { + if (t.indexed) { + const topic = topics.shift()! + decoded[i] = isValueType(t.type) ? decodeParameter(t.type, topic) : topic + } else { + decoded[i] = decodedNonIndexed.shift() + } + if (t.name) { + decoded[t.name] = decoded[i] + } + }) + return decoded + } + } + + export namespace Event { + export interface Parameter { + name: string + type: string + indexed: boolean + components?: any[] // Tuples ONLY + internalType?: string + } + + export interface Definition { + type: 'event' + name: string + anonymous?: boolean + inputs: Parameter[] + } + } + + export type Decoded = { [name: string]: any } & { [index: number]: any } + + function isValueType(type: string) { + return type === 'address' || type === 'bool' || /^(u?int)([0-9]*)$/.test(type) || /^bytes([0-9]+)$/.test(type) + } +} From 6d99b358c90e87bf8f96caa030109c54e5e14cde Mon Sep 17 00:00:00 2001 From: rodolfopietro97 Date: Mon, 17 Jul 2023 12:15:13 +0200 Subject: [PATCH 17/28] temp: Temp refactoring of ABI (to understand EIP stuff....) --- src/abi.ts | 91 ++++++++++++++++++++++++++++++++++++++++++++++++++---- 1 file changed, 85 insertions(+), 6 deletions(-) diff --git a/src/abi.ts b/src/abi.ts index 511f163..a10667f 100644 --- a/src/abi.ts +++ b/src/abi.ts @@ -2,6 +2,8 @@ import { AbiCoder, formatSignature as _formatSignature } from '@vechain/ethers/utils/abi-coder' import { keccak256 } from './keccak' import { Buffer } from 'buffer' +import { ethers } from 'ethers' +import * as web3 from 'web3' class Coder extends AbiCoder { constructor() { @@ -38,6 +40,7 @@ class Coder extends AbiCoder { } const coder = new Coder() +const ethersCoder = new ethers.AbiCoder() function formatSignature(fragment: any) { try { @@ -62,7 +65,17 @@ export namespace abi { * @returns encoded value in hex string */ export function encodeParameter(type: string, value: any) { - return coder.encode([type], [value]) + // const encode1 = coder.encode([type], [value]) + // const encode2 = ethersCoder.encode([type], [value]) + // const encode3 = web3.eth.abi.encodeParameter(type, value) + // if(encode1 !== encode2 || encode2 !== encode3) { + // console.log('encode1', encode1) + // console.log('encode2', encode2) + // console.log('encode3', encode3) + // } + const encoded = ethersCoder.encode([type], [value]) + + return encoded } /** @@ -72,7 +85,18 @@ export namespace abi { * @returns decoded value */ export function decodeParameter(type: string, data: string) { - return coder.decode([type], data)[0] + // const decoded1 = coder.decode([type], data)[0] + // const decoded2 = ethersCoder.decode([type], data).values().next().value.toString() + // const decoded3 = new String(web3.eth.abi.decodeParameter(type, data)).toString() + + // if(decoded1 !== decoded2 || decoded2 !== decoded3) { + // console.log('decoded1', decoded1) + // console.log('decoded2', decoded2) + // console.log('decoded3', decoded3) + // } + const decoded = ethersCoder.decode([type], data).values().next().value.toString() + + return decoded } /** @@ -82,7 +106,16 @@ export namespace abi { * @returns encoded values in hex string */ export function encodeParameters(types: Function.Parameter[], values: any[]) { - return coder.encode(types, values) + // const encode1 = coder.encode(types, values) + // const encode2 = ethersCoder.encode(types, values) + // const encode3 = web3.eth.abi.encodeParameters(types, values) + // if(encode1 !== encode2 || encode2 !== encode3) { + // console.log('encode1', encode1) + // console.log('encode2', encode2) + // console.log('encode3', encode3) + // } + const encode = web3.eth.abi.encodeParameters(types, values) + return encode } /** @@ -92,14 +125,60 @@ export namespace abi { * @returns decoded object */ export function decodeParameters(types: Function.Parameter[], data: string) { - const result = coder.decode(types, data) + // const decoded1 = coder.decode(types, data) + // const decoded2 = ethersCoder.decode(types, data).toArray() + // let decoded3 = web3.eth.abi.decodeParameters(types, data) + + // if(decoded1 !== decoded2 || decoded2 !== decoded3) { + // if(decoded1 !== decoded3) { + + // console.log('\n\ndecoded1', decoded1) + // // console.log('decoded2', decoded2) + // console.log('decoded3', decoded3) + // } + + // 1 - Decode parameters + var decodedParameters = web3.eth.abi.decodeParameters(types, data) + + // 2 - Remove __length__ property + delete decodedParameters['__length__'] + + // 3 - Lowecase address + // TODO: UNderstand EIP55 and then decide if we need to lowercase address + // for (var entries of Object.entries(decodedParameters)) { + // for (var entry of entries) { + + // // Hex must be lowercased + // if(typeof entry === 'string' && /^0x[0-9a-f]*/.test(entry)) { + // entry = entry.toLowerCase() + // } + // // Our entry is an object + // else { + // if(typeof entry === 'object') { + // for (var entriesOfObject of Object.entries(entry)) { + // for(var element of entriesOfObject[1]){ + // if(typeof element === 'string' && /^0x[0-9a-f]*/.test(element)) { + // element = element.toLowerCase() + // console.log('element', element) + // } + // } + // } + // } + + // } + + // } + // } + + // 4 - Get final result const decoded: Decoded = {} types.forEach((t, i) => { - decoded[i] = result[i] + decoded[i] = decodedParameters[i] if (t.name) { - decoded[t.name] = result[i] + decoded[t.name] = decodedParameters[i] } }) + return decoded } From 53f6098ec1bdf1f6f00116481fd624b504a46515 Mon Sep 17 00:00:00 2001 From: rodolfopietro97 Date: Tue, 18 Jul 2023 09:24:02 +0200 Subject: [PATCH 18/28] feat: New encoding take checksumed address. For this reason we change it into tests in order to not fail --- tests/abi.test.ts | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/tests/abi.test.ts b/tests/abi.test.ts index a631c12..57729fc 100644 --- a/tests/abi.test.ts +++ b/tests/abi.test.ts @@ -1,5 +1,5 @@ import { expect } from 'chai' -import { abi } from '../src' +import { abi, address } from '../src' import { keccak256 } from '../src' // tslint:disable:quotemark @@ -227,9 +227,9 @@ describe('abi', () => { expect(f1.signature).equal('0x27fcbb2f') expect(f1.encode(1, 'foo')).equal('0x27fcbb2f000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000003666f6f0000000000000000000000000000000000000000000000000000000000') expect(f1.decode('0x000000000000000000000000abc000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000003666f6f0000000000000000000000000000000000000000000000000000000000')).deep.equal({ - 0: '0xabc0000000000000000000000000000000000001', + 0: address.toChecksumed('0xabc0000000000000000000000000000000000001'), 1: '0x666f6f', - r1: '0xabc0000000000000000000000000000000000001', + r1: address.toChecksumed('0xabc0000000000000000000000000000000000001'), r2: '0x666f6f' }) @@ -342,13 +342,13 @@ describe('abi', () => { expect(decoded.list.length).to.equal(6) const data = [{ - master: '0x0e8fd586e022f825a109848832d7e552132bc332', - endorsor: '0x224626926a7a12225a60e127cec119c939db4a5c', + master: address.toChecksumed('0x0e8fd586e022f825a109848832d7e552132bc332'), + endorsor: address.toChecksumed('0x224626926a7a12225a60e127cec119c939db4a5c'), identity: '0xdbf2712e19af00dc4d376728f7cb06cc215c8e7c53b94cb47cefb4a26ada2a6c', active: false }, { - master: '0x4977d68df97bb313b23238520580d8d3a59939bf', - endorsor: '0x7ad1d568b3fe5bad3fc264aca70bc7bcd5e4a6ff', + master: address.toChecksumed('0x4977d68df97bb313b23238520580d8d3a59939bf'), + endorsor: address.toChecksumed('0x7ad1d568b3fe5bad3fc264aca70bc7bcd5e4a6ff'), identity: '0x83b137cf7e30864b8a4e56453eb1f094b4434685d86895de38ac2edcf5d3f534', active: false }] From ef88e52cbaa49ddddec0a4c6ad82c888771f7ac5 Mon Sep 17 00:00:00 2001 From: rodolfopietro97 Date: Tue, 18 Jul 2023 10:01:27 +0200 Subject: [PATCH 19/28] fix: Avoid odd-length error --- tests/abi.test.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/abi.test.ts b/tests/abi.test.ts index 57729fc..ff60aff 100644 --- a/tests/abi.test.ts +++ b/tests/abi.test.ts @@ -311,7 +311,7 @@ describe('abi', () => { '0x0000000000000000000000000000000000000000000000000000000000000001' ]) - expect(e3.decode('0x0', + expect(e3.decode('0x', ['0xe96585649d926cc4f5031a6113d7494d766198c0ac68b04eb93207460f9d7fd2', '0x0000000000000000000000000000000000000000000000000000000000000001'])) .deep.equal({ From baf50e1e0610f2722a7a2ad4adc5d3fff1a4dec7 Mon Sep 17 00:00:00 2001 From: rodolfopietro97 Date: Tue, 18 Jul 2023 11:21:37 +0200 Subject: [PATCH 20/28] fix: Missing some checksumed addresses --- tests/abi.test.ts | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/tests/abi.test.ts b/tests/abi.test.ts index ff60aff..1f8efb8 100644 --- a/tests/abi.test.ts +++ b/tests/abi.test.ts @@ -377,13 +377,13 @@ describe('abi', () => { expect(decoded.nodes.length).to.equal(2) const nodes = [{ - master: '0x0e8fd586e022f825a109848832d7e552132bc332', - endorsor: '0x224626926a7a12225a60e127cec119c939db4a5c', + master: address.toChecksumed('0x0e8fd586e022f825a109848832d7e552132bc332'), + endorsor: address.toChecksumed('0x224626926a7a12225a60e127cec119c939db4a5c'), identity: '0xdbf2712e19af00dc4d376728f7cb06cc215c8e7c53b94cb47cefb4a26ada2a6c', active: false }, { - master: '0x4977d68df97bb313b23238520580d8d3a59939bf', - endorsor: '0x7ad1d568b3fe5bad3fc264aca70bc7bcd5e4a6ff', + master: address.toChecksumed('0x4977d68df97bb313b23238520580d8d3a59939bf'), + endorsor: address.toChecksumed('0x7ad1d568b3fe5bad3fc264aca70bc7bcd5e4a6ff'), identity: '0x83b137cf7e30864b8a4e56453eb1f094b4434685d86895de38ac2edcf5d3f534', active: false }] From 0c872102821faa7b3a138a83c692aa6d861f09d8 Mon Sep 17 00:00:00 2001 From: rodolfopietro97 Date: Tue, 18 Jul 2023 11:22:49 +0200 Subject: [PATCH 21/28] fix: Remove old coders, remove comments and finish decode of events --- src/abi.ts | 141 +++++++++++++---------------------------------------- 1 file changed, 34 insertions(+), 107 deletions(-) diff --git a/src/abi.ts b/src/abi.ts index a10667f..31d4d9a 100644 --- a/src/abi.ts +++ b/src/abi.ts @@ -1,45 +1,11 @@ // @ts-nocheck -import { AbiCoder, formatSignature as _formatSignature } from '@vechain/ethers/utils/abi-coder' +import { formatSignature as _formatSignature } from '@vechain/ethers/utils/abi-coder' import { keccak256 } from './keccak' import { Buffer } from 'buffer' import { ethers } from 'ethers' import * as web3 from 'web3' -class Coder extends AbiCoder { - constructor() { - super((type, value) => { - if ((type.match(/^u?int/) && !Array.isArray(value) && typeof value !== 'object') || - value._ethersType === 'BigNumber') { - return value.toString() - } - return value - }) - } - - public encode(types: Array, values: any[]): string { - try { - return super.encode(types, values) - } catch (err) { - if (err.reason) { - throw new Error(err.reason) - } - throw err - } - } - - public decode(types: Array, data: string): any[] { - try { - return super.decode(types, data) - } catch (err) { - if (err.reason) { - throw new Error(err.reason) - } - throw err - } - } -} - -const coder = new Coder() +// Ethers coder instance const ethersCoder = new ethers.AbiCoder() function formatSignature(fragment: any) { @@ -65,14 +31,6 @@ export namespace abi { * @returns encoded value in hex string */ export function encodeParameter(type: string, value: any) { - // const encode1 = coder.encode([type], [value]) - // const encode2 = ethersCoder.encode([type], [value]) - // const encode3 = web3.eth.abi.encodeParameter(type, value) - // if(encode1 !== encode2 || encode2 !== encode3) { - // console.log('encode1', encode1) - // console.log('encode2', encode2) - // console.log('encode3', encode3) - // } const encoded = ethersCoder.encode([type], [value]) return encoded @@ -85,15 +43,6 @@ export namespace abi { * @returns decoded value */ export function decodeParameter(type: string, data: string) { - // const decoded1 = coder.decode([type], data)[0] - // const decoded2 = ethersCoder.decode([type], data).values().next().value.toString() - // const decoded3 = new String(web3.eth.abi.decodeParameter(type, data)).toString() - - // if(decoded1 !== decoded2 || decoded2 !== decoded3) { - // console.log('decoded1', decoded1) - // console.log('decoded2', decoded2) - // console.log('decoded3', decoded3) - // } const decoded = ethersCoder.decode([type], data).values().next().value.toString() return decoded @@ -106,14 +55,6 @@ export namespace abi { * @returns encoded values in hex string */ export function encodeParameters(types: Function.Parameter[], values: any[]) { - // const encode1 = coder.encode(types, values) - // const encode2 = ethersCoder.encode(types, values) - // const encode3 = web3.eth.abi.encodeParameters(types, values) - // if(encode1 !== encode2 || encode2 !== encode3) { - // console.log('encode1', encode1) - // console.log('encode2', encode2) - // console.log('encode3', encode3) - // } const encode = web3.eth.abi.encodeParameters(types, values) return encode } @@ -125,52 +66,13 @@ export namespace abi { * @returns decoded object */ export function decodeParameters(types: Function.Parameter[], data: string) { - // const decoded1 = coder.decode(types, data) - // const decoded2 = ethersCoder.decode(types, data).toArray() - // let decoded3 = web3.eth.abi.decodeParameters(types, data) - - // if(decoded1 !== decoded2 || decoded2 !== decoded3) { - // if(decoded1 !== decoded3) { - - // console.log('\n\ndecoded1', decoded1) - // // console.log('decoded2', decoded2) - // console.log('decoded3', decoded3) - // } - // 1 - Decode parameters var decodedParameters = web3.eth.abi.decodeParameters(types, data) // 2 - Remove __length__ property delete decodedParameters['__length__'] - // 3 - Lowecase address - // TODO: UNderstand EIP55 and then decide if we need to lowercase address - // for (var entries of Object.entries(decodedParameters)) { - // for (var entry of entries) { - - // // Hex must be lowercased - // if(typeof entry === 'string' && /^0x[0-9a-f]*/.test(entry)) { - // entry = entry.toLowerCase() - // } - // // Our entry is an object - // else { - // if(typeof entry === 'object') { - // for (var entriesOfObject of Object.entries(entry)) { - // for(var element of entriesOfObject[1]){ - // if(typeof element === 'string' && /^0x[0-9a-f]*/.test(element)) { - // element = element.toLowerCase() - // console.log('element', element) - // } - // } - // } - // } - - // } - - // } - // } - - // 4 - Get final result + // 3 - Get final result const decoded: Decoded = {} types.forEach((t, i) => { decoded[i] = decodedParameters[i] @@ -178,7 +80,7 @@ export namespace abi { decoded[t.name] = decodedParameters[i] } }) - + return decoded } @@ -287,6 +189,31 @@ export namespace abi { return topics } + /** + * Get indexed elements of decoded object. + * Indexed elements are elements with keys like '0', '1', '2', etc. + * + * @param decoded Decoded object from decodeParameters function + * + * @returns Array of indexed elements [[[], [], ...]]] + */ + private getIndexedElementOfDecoded(decoded: Array) { + // Base case - Empty object + if (Object.keys(decoded).length === 0) return [] + + // Normal cases - Non-empty object + var values: Array = [] + + Object.keys(decoded).forEach(key => { + // Keys like '0': ..., '1': ..., '2': ..., etc. + if (key.match(/^\d+$/)) { + values.push(decoded[key]) + } + }) + + return values + } + /** * decode event log * @param data data in event output @@ -301,16 +228,16 @@ export namespace abi { throw new Error('invalid topics count') } - const decodedNonIndexed = coder.decode( - this.definition.inputs.filter(t => !t.indexed), data) - + const nonIndexedInput = this.definition.inputs.filter(t => !t.indexed) + const decodedIndexed = this.getIndexedElementOfDecoded(decodeParameters(nonIndexedInput, data)) + const decoded: Decoded = {} this.definition.inputs.forEach((t, i) => { if (t.indexed) { const topic = topics.shift()! - decoded[i] = isValueType(t.type) ? decodeParameter(t.type, topic) : topic + decoded[i] = isValueType(t.type) ? decodeParameter(t.type, topic) : topic } else { - decoded[i] = decodedNonIndexed.shift() + decoded[i] = decodedIndexed.shift() } if (t.name) { decoded[t.name] = decoded[i] From 1aa1bac40db2cfeb6ff4dbfd47951c3eb833be8e Mon Sep 17 00:00:00 2001 From: rodolfopietro97 Date: Tue, 18 Jul 2023 12:39:43 +0200 Subject: [PATCH 22/28] feat: New signature --- src/abi.ts | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/src/abi.ts b/src/abi.ts index 31d4d9a..75a8155 100644 --- a/src/abi.ts +++ b/src/abi.ts @@ -9,10 +9,17 @@ import * as web3 from 'web3' const ethersCoder = new ethers.AbiCoder() function formatSignature(fragment: any) { - try { - return _formatSignature(fragment) + // New method + const fragmentInterface = new ethers.Interface([fragment]) + console.log("NEW SIGNATURE ETHERS 6:", fragmentInterface.format(true)[0]) + console.log("OLD SIGNATURE ETHERS 4:", _formatSignature(fragment) .replace(/\(tuple\(/g, '((') - .replace(/\,tuple\(/g, ',(') + .replace(/\,tuple\(/g, ',(')) + console.log("\n") + try { + const fragmentInterface = new ethers.Interface([fragment]) + + return fragmentInterface.format(true)[0] } catch (err) { if (err.reason) { throw new Error(err.reason) From 36e2252f84d5bf53be2294671daf100ba207bdbd Mon Sep 17 00:00:00 2001 From: rodolfopietro97 Date: Tue, 18 Jul 2023 12:41:42 +0200 Subject: [PATCH 23/28] fix: Forgot to remove console.log and comments --- src/abi.ts | 8 -------- 1 file changed, 8 deletions(-) diff --git a/src/abi.ts b/src/abi.ts index 75a8155..cf212c7 100644 --- a/src/abi.ts +++ b/src/abi.ts @@ -1,5 +1,4 @@ // @ts-nocheck -import { formatSignature as _formatSignature } from '@vechain/ethers/utils/abi-coder' import { keccak256 } from './keccak' import { Buffer } from 'buffer' import { ethers } from 'ethers' @@ -9,13 +8,6 @@ import * as web3 from 'web3' const ethersCoder = new ethers.AbiCoder() function formatSignature(fragment: any) { - // New method - const fragmentInterface = new ethers.Interface([fragment]) - console.log("NEW SIGNATURE ETHERS 6:", fragmentInterface.format(true)[0]) - console.log("OLD SIGNATURE ETHERS 4:", _formatSignature(fragment) - .replace(/\(tuple\(/g, '((') - .replace(/\,tuple\(/g, ',(')) - console.log("\n") try { const fragmentInterface = new ethers.Interface([fragment]) From 98180fd7fca87ead37047f0962e91d5f4d4c673b Mon Sep 17 00:00:00 2001 From: rodolfopietro97 Date: Tue, 18 Jul 2023 12:42:18 +0200 Subject: [PATCH 24/28] fix: Removed unuseful --- src/abi2 | 303 ------------------------------------------------------- 1 file changed, 303 deletions(-) delete mode 100644 src/abi2 diff --git a/src/abi2 b/src/abi2 deleted file mode 100644 index 47ad562..0000000 --- a/src/abi2 +++ /dev/null @@ -1,303 +0,0 @@ -// @ts-nocheck -import { AbiCoder, formatSignature as _formatSignature } from '@vechain/ethers/utils/abi-coder' -import { ethers } from 'ethers' -import { keccak256 } from './keccak' -import { Buffer } from 'buffer' -import { Verifier } from './utils/verifier' - -class Coder extends AbiCoder { - constructor() { - super((type, value) => { - if ((type.match(/^u?int/) && !Array.isArray(value) && typeof value !== 'object') || - value._ethersType === 'BigNumber') { - return value.toString() - } - return value - }) - } - - public encode(types: Array, values: any[]): string { - try { - return super.encode(types, values) - } catch (err) { - if (err.reason) { - throw new Error(err.reason) - } - throw err - } - } - - public decode(types: Array, data: string): any[] { - try { - return super.decode(types, data) - } catch (err) { - if (err.reason) { - throw new Error(err.reason) - } - throw err - } - } -} - -const coder = new Coder() -const ethersCoder = new ethers.AbiCoder() - -function formatSignature(fragment: any) { - try { - return _formatSignature(fragment) - .replace(/\(tuple\(/g, '((') - .replace(/\,tuple\(/g, ',(') - } catch (err) { - if (err.reason) { - throw new Error(err.reason) - } - throw err - } -} - -/** encode/decode parameters of contract function call, event log, according to ABI JSON */ -export namespace abi { - - /** - * encode single parameter - * @param type type of the parameter - * @param value value of the parameter - * @returns encoded value in hex string - */ - export function encodeParameter(type: string, value: any) { - return ethersCoder.encode([type], [value]) - } - - /** - * decode single parameter - * @param type type of the parameter - * @param data encoded parameter in hex string - * @returns decoded value - */ - export function decodeParameter(type: string, data: string) { - return ethersCoder.decode([type], data).values().next().value.toString() - } - - /** - * encode a group of parameters - * @param types type array - * @param values value array - * @returns encoded values in hex string - */ - export function encodeParameters(types: Function.Parameter[], values: any[]) { - return ethersCoder.encode(types, values) - } - - /** - * decode a group of parameters - * @param types type array - * @param data encoded values in hex string - * @returns decoded object - */ - export function decodeParameters(types: Function.Parameter[], data: string) { - const resultOld = coder.decode(types, data) - const result = JSON.parse(JSON.stringify(ethersCoder.decode(types, data).toArray())) - const resultWithLowerCaseHexs = result.map((res) => { - return Verifier.verifyHex(res) ? res.toString().toLowerCase() : res - }) - console.log("\n\nRESULT WITH LOWER CASE HEXS\n\n", resultWithLowerCaseHexs) - console.log("\n\nRESULT OLD\n\n", resultOld) - - - const decoded: Decoded = {} - types.forEach((t, i) => { - - // Take each attribute name of component and concat to attribute name of tuple - const componentNamesList = types[i].components?.map((component) => { - return component.name - }) - if(resultWithLowerCaseHexs.leength > 0) { - for (const resultWithLowerCaseHexs of resultWithLowerCaseHexs[i]) { - // [[Array] + [{ componentsName: element }]] - const newComponent = - componentOfResult - .concat(componentNamesList?.map((componentName, componentIndex) => { - return { componentName: componentOfResult[componentIndex] } - })) - decoded[i] = newComponent - } - } - - - // decoded[i] = result[i] - if (t.name) { - decoded[t.name] = resultWithLowerCaseHexs[i] - // console.log("\n\RESULT 2[i]\n", result[i]) - - // console.log("\nRESULT [i]\n", result[i], "\n\RESULT 2[i]\n", result2[i]) - // console.log("\n\nDECODED [i]\n\n", decoded[i]) - // console.log("\n\nTYPES [i].components\n\n", types[i].components) - - } - }) - return decoded - } - - /** for contract function */ - export class Function { - /** canonical name */ - public readonly canonicalName: string - - /** the function signature, aka. 4 bytes prefix */ - public readonly signature: string - - /** - * create a function object - * @param definition abi definition of the function - */ - constructor(public readonly definition: Function.Definition) { - this.canonicalName = formatSignature(definition) - console.log("\n\nDEFINITION\n\n", definition) - console.log("\n\nCANONICAL NAME\n\n", this.canonicalName) - this.signature = '0x' + keccak256(this.canonicalName).slice(0, 4).toString('hex') - } - - /** - * encode input parameters into call data - * @param args arguments for the function - */ - public encode(...args: any[]): string { - return this.signature + encodeParameters(this.definition.inputs, args).slice(2) - } - - /** - * decode output data - * @param outputData output data to decode - */ - public decode(outputData: string) { - return decodeParameters(this.definition.outputs, outputData) - } - } - - export namespace Function { - export type StateMutability = 'pure' | 'view' | 'constant' | 'payable' | 'nonpayable' - export interface Parameter { - name: string - type: string - components?: any[] // Tuples ONLY - internalType?: string - } - - export interface Definition { - type: 'function' - name: string - constant?: boolean - payable?: boolean - stateMutability: StateMutability - inputs: Parameter[] - outputs: Parameter[] - } - } - - /** for contract event */ - export class Event { - /** canonical name */ - public readonly canonicalName: string - - /** the event signature */ - public readonly signature: string - - /** for contract event */ - constructor(public readonly definition: Event.Definition) { - this.canonicalName = formatSignature(definition) - this.signature = '0x' + keccak256(this.canonicalName).toString('hex') - } - - /** - * encode an object of indexed keys into topics. - * @param indexed an object contains indexed keys - */ - public encode(indexed: object): Array { - const topics: Array = [] - if (!this.definition.anonymous) { - topics.push(this.signature) - } - for (const input of this.definition.inputs) { - if (!input.indexed) { - continue - } - const value = (indexed as any)[input.name] - if (value === undefined || value === null) { - topics.push(null) - } else { - let topic - // https://docs.soliditylang.org/en/v0.8.11/abi-spec.html#encoding-of-indexed-event-parameters - if (isValueType(input.type)) { - topic = encodeParameter(input.type, value) - } else { - if (input.type === 'string') { - topic = '0x' + keccak256(value).toString('hex') - } else if (typeof value === 'string' && /^0x[0-9a-f]+$/i.test(value) && value.length % 2 === 0) { - // value is encoded - topic = '0x' + keccak256(Buffer.from(value.slice(2), 'hex')).toString('hex') - } else { - throw new Error(`event.encode: invalid ${input.type} value`) - } - } - topics.push(topic) - } - } - return topics - } - - /** - * decode event log - * @param data data in event output - * @param topics topics in event - */ - public decode(data: string, topics: string[]) { - if (!this.definition.anonymous) { - topics = topics.slice(1) - } - - if (this.definition.inputs.filter(t => t.indexed).length !== topics.length) { - throw new Error('invalid topics count') - } - - const decodedNonIndexed = coder.decode( - this.definition.inputs.filter(t => !t.indexed), data) - - const decoded: Decoded = {} - this.definition.inputs.forEach((t, i) => { - if (t.indexed) { - const topic = topics.shift()! - decoded[i] = isValueType(t.type) ? decodeParameter(t.type, topic) : topic - } else { - decoded[i] = decodedNonIndexed.shift() - } - if (t.name) { - decoded[t.name] = decoded[i] - } - }) - return decoded - } - } - - export namespace Event { - export interface Parameter { - name: string - type: string - indexed: boolean - components?: any[] // Tuples ONLY - internalType?: string - } - - export interface Definition { - type: 'event' - name: string - anonymous?: boolean - inputs: Parameter[] - } - } - - export type Decoded = { [name: string]: any } & { [index: number]: any } - - function isValueType(type: string) { - return type === 'address' || type === 'bool' || /^(u?int)([0-9]*)$/.test(type) || /^bytes([0-9]+)$/.test(type) - } -} From 0d9ece24f80d2f14061ec766c31ed73339c4b872 Mon Sep 17 00:00:00 2001 From: rodolfopietro97 Date: Tue, 18 Jul 2023 12:42:40 +0200 Subject: [PATCH 25/28] fix: Change encoding for new signature --- tests/abi.test.ts | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/tests/abi.test.ts b/tests/abi.test.ts index 1f8efb8..0b43da3 100644 --- a/tests/abi.test.ts +++ b/tests/abi.test.ts @@ -224,8 +224,8 @@ describe('abi', () => { }) it('function', () => { - expect(f1.signature).equal('0x27fcbb2f') - expect(f1.encode(1, 'foo')).equal('0x27fcbb2f000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000003666f6f0000000000000000000000000000000000000000000000000000000000') + expect(f1.signature).equal('0x81b00db7') + expect(f1.encode(1, 'foo')).equal('0x81b00db7000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000003666f6f0000000000000000000000000000000000000000000000000000000000') expect(f1.decode('0x000000000000000000000000abc000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000003666f6f0000000000000000000000000000000000000000000000000000000000')).deep.equal({ 0: address.toChecksumed('0xabc0000000000000000000000000000000000001'), 1: '0x666f6f', @@ -259,11 +259,11 @@ describe('abi', () => { }) it('event', () => { - expect(e1.signature).equal('0x47b78f0ec63d97830ace2babb45e6271b15a678528e901a9651e45b65105e6c2') + expect(e1.signature).equal('0x4e61d2159c0016af010c0521c021973c907af5275b572e6d533e912a4e1ab8c3') expect(e1.decode( '0x00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000003666f6f0000000000000000000000000000000000000000000000000000000000', [ - '0x47b78f0ec63d97830ace2babb45e6271b15a678528e901a9651e45b65105e6c2', + '0x4e61d2159c0016af010c0521c021973c907af5275b572e6d533e912a4e1ab8c3', '0x0000000000000000000000000000000000000000000000000000000000000001' ])) .deep.equal({ @@ -285,19 +285,19 @@ describe('abi', () => { expect(e1.encode({})) .deep.equal([ - '0x47b78f0ec63d97830ace2babb45e6271b15a678528e901a9651e45b65105e6c2', + '0x4e61d2159c0016af010c0521c021973c907af5275b572e6d533e912a4e1ab8c3', null ]) expect(e1.encode({ a1: 1 })) .deep.equal([ - '0x47b78f0ec63d97830ace2babb45e6271b15a678528e901a9651e45b65105e6c2', + '0x4e61d2159c0016af010c0521c021973c907af5275b572e6d533e912a4e1ab8c3', '0x0000000000000000000000000000000000000000000000000000000000000001' ]) expect(e1.encode({ a1: 1, x: 3 })) .deep.equal([ - '0x47b78f0ec63d97830ace2babb45e6271b15a678528e901a9651e45b65105e6c2', + '0x4e61d2159c0016af010c0521c021973c907af5275b572e6d533e912a4e1ab8c3', '0x0000000000000000000000000000000000000000000000000000000000000001' ]) expect(e2.encode({ a1: 1 })) @@ -307,12 +307,12 @@ describe('abi', () => { expect(e3.encode({ a1: 1 })) .deep.equal([ - '0xe96585649d926cc4f5031a6113d7494d766198c0ac68b04eb93207460f9d7fd2', + '0xde1913e64cdac8a0da24fe0f36e752b8808b8f3dffc0edfdd7924b06ef90966e', '0x0000000000000000000000000000000000000000000000000000000000000001' ]) expect(e3.decode('0x', - ['0xe96585649d926cc4f5031a6113d7494d766198c0ac68b04eb93207460f9d7fd2', + ['0xde1913e64cdac8a0da24fe0f36e752b8808b8f3dffc0edfdd7924b06ef90966e', '0x0000000000000000000000000000000000000000000000000000000000000001'])) .deep.equal({ "0": "1", From 3637f084204411f624349e21ebbcd0e623e0f77e Mon Sep 17 00:00:00 2001 From: rodolfopietro97 Date: Tue, 18 Jul 2023 12:48:16 +0200 Subject: [PATCH 26/28] fix: Remove ts-nocheck and solve ts issues --- src/abi.ts | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/src/abi.ts b/src/abi.ts index cf212c7..ad4c40b 100644 --- a/src/abi.ts +++ b/src/abi.ts @@ -1,4 +1,3 @@ -// @ts-nocheck import { keccak256 } from './keccak' import { Buffer } from 'buffer' import { ethers } from 'ethers' @@ -12,7 +11,7 @@ function formatSignature(fragment: any) { const fragmentInterface = new ethers.Interface([fragment]) return fragmentInterface.format(true)[0] - } catch (err) { + } catch (err: any) { if (err.reason) { throw new Error(err.reason) } @@ -66,7 +65,7 @@ export namespace abi { */ export function decodeParameters(types: Function.Parameter[], data: string) { // 1 - Decode parameters - var decodedParameters = web3.eth.abi.decodeParameters(types, data) + var decodedParameters: any = web3.eth.abi.decodeParameters(types, data) // 2 - Remove __length__ property delete decodedParameters['__length__'] @@ -196,14 +195,14 @@ export namespace abi { * * @returns Array of indexed elements [[[], [], ...]]] */ - private getIndexedElementOfDecoded(decoded: Array) { + private getIndexedElementOfDecoded(decoded: Decoded) { // Base case - Empty object if (Object.keys(decoded).length === 0) return [] // Normal cases - Non-empty object var values: Array = [] - Object.keys(decoded).forEach(key => { + Object.keys(decoded).forEach((key: any) => { // Keys like '0': ..., '1': ..., '2': ..., etc. if (key.match(/^\d+$/)) { values.push(decoded[key]) From edf64424b02b4c9f1d5c5264abd30d0bf69059ca Mon Sep 17 00:00:00 2001 From: rodolfopietro97 Date: Tue, 18 Jul 2023 13:00:34 +0200 Subject: [PATCH 27/28] fix: update lock --- package-lock.json | 3023 +++++++++++++++++++++++++++++++++++++-------- 1 file changed, 2530 insertions(+), 493 deletions(-) diff --git a/package-lock.json b/package-lock.json index e357839..0dba52c 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,24 +1,58 @@ { "name": "thor-devkit", "version": "2.0.8", - "lockfileVersion": 1, + "lockfileVersion": 3, "requires": true, - "dependencies": { - "@babel/code-frame": { + "packages": { + "": { + "name": "thor-devkit", + "version": "2.0.8", + "license": "LGPL-3.0", + "dependencies": { + "@vechain/ethers": "^4.0.27-5", + "bignumber.js": "^7.2.1", + "blakejs": "^1.1.2", + "elliptic": "6.5.4", + "ethers": "^6.6.2", + "fast-json-stable-stringify": "^2.1.0", + "js-sha3": "0.5.7", + "rlp": "^2.0.0", + "web3": "^4.0.3" + }, + "devDependencies": { + "@typechain/ethers-v6": "^0.4.0", + "@types/chai": "^4.1.3", + "@types/elliptic": "^6.4.9", + "@types/mocha": "^5.2.1", + "@types/node": "^10.5.2", + "chai": "^4.1.2", + "mocha": "^5.2.0", + "nyc": "^14.1.1", + "ts-node": "^8.3.0", + "tslint": "^5.11.0", + "typescript": "^5.1.6" + } + }, + "node_modules/@adraffy/ens-normalize": { + "version": "1.9.2", + "resolved": "https://registry.npmjs.org/@adraffy/ens-normalize/-/ens-normalize-1.9.2.tgz", + "integrity": "sha512-0h+FrQDqe2Wn+IIGFkTCd4aAwTJ+7834Ek1COohCyV26AXhwQ7WQaz+4F/nLOeVl/3BtWHOHLPsq46V8YB46Eg==" + }, + "node_modules/@babel/code-frame": { "version": "7.5.5", "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.5.5.tgz", "integrity": "sha512-27d4lZoomVyo51VegxI20xZPuSHusqbQag/ztrBC7wegWoQ1nLREPVSKSW8byhTlzTKyNE4ifaTA6lCp7JjpFw==", "dev": true, - "requires": { + "dependencies": { "@babel/highlight": "^7.0.0" } }, - "@babel/generator": { + "node_modules/@babel/generator": { "version": "7.6.0", "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.6.0.tgz", "integrity": "sha512-Ms8Mo7YBdMMn1BYuNtKuP/z0TgEIhbcyB8HVR6PPNYp4P61lMsABiS4A3VG1qznjXVCf3r+fVHhm4efTYVsySA==", "dev": true, - "requires": { + "dependencies": { "@babel/types": "^7.6.0", "jsesc": "^2.5.1", "lodash": "^4.17.13", @@ -26,77 +60,87 @@ "trim-right": "^1.0.1" } }, - "@babel/helper-function-name": { + "node_modules/@babel/helper-function-name": { "version": "7.1.0", "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.1.0.tgz", "integrity": "sha512-A95XEoCpb3TO+KZzJ4S/5uW5fNe26DjBGqf1o9ucyLyCmi1dXq/B3c8iaWTfBk3VvetUxl16e8tIrd5teOCfGw==", "dev": true, - "requires": { + "dependencies": { "@babel/helper-get-function-arity": "^7.0.0", "@babel/template": "^7.1.0", "@babel/types": "^7.0.0" } }, - "@babel/helper-get-function-arity": { + "node_modules/@babel/helper-get-function-arity": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.0.0.tgz", "integrity": "sha512-r2DbJeg4svYvt3HOS74U4eWKsUAMRH01Z1ds1zx8KNTPtpTL5JAsdFv8BNyOpVqdFhHkkRDIg5B4AsxmkjAlmQ==", "dev": true, - "requires": { + "dependencies": { "@babel/types": "^7.0.0" } }, - "@babel/helper-split-export-declaration": { + "node_modules/@babel/helper-split-export-declaration": { "version": "7.4.4", "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.4.4.tgz", "integrity": "sha512-Ro/XkzLf3JFITkW6b+hNxzZ1n5OQ80NvIUdmHspih1XAhtN3vPTuUFT4eQnela+2MaZ5ulH+iyP513KJrxbN7Q==", "dev": true, - "requires": { + "dependencies": { "@babel/types": "^7.4.4" } }, - "@babel/highlight": { + "node_modules/@babel/highlight": { "version": "7.5.0", "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.5.0.tgz", "integrity": "sha512-7dV4eu9gBxoM0dAnj/BCFDW9LFU0zvTrkq0ugM7pnHEgguOEeOz1so2ZghEdzviYzQEED0r4EAgpsBChKy1TRQ==", "dev": true, - "requires": { + "dependencies": { "chalk": "^2.0.0", "esutils": "^2.0.2", "js-tokens": "^4.0.0" } }, - "@babel/parser": { + "node_modules/@babel/parser": { "version": "7.5.5", "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.5.5.tgz", "integrity": "sha512-E5BN68cqR7dhKan1SfqgPGhQ178bkVKpXTPEXnFJBrEt8/DKRZlybmy+IgYLTeN7tp1R5Ccmbm2rBk17sHYU3g==", - "dev": true + "dev": true, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } }, - "@babel/template": { + "node_modules/@babel/template": { "version": "7.6.0", "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.6.0.tgz", "integrity": "sha512-5AEH2EXD8euCk446b7edmgFdub/qfH1SN6Nii3+fyXP807QRx9Q73A2N5hNwRRslC2H9sNzaFhsPubkS4L8oNQ==", "dev": true, - "requires": { + "dependencies": { "@babel/code-frame": "^7.0.0", "@babel/parser": "^7.6.0", "@babel/types": "^7.6.0" + } + }, + "node_modules/@babel/template/node_modules/@babel/parser": { + "version": "7.6.0", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.6.0.tgz", + "integrity": "sha512-+o2q111WEx4srBs7L9eJmcwi655eD8sXniLqMB93TBK9GrNzGrxDWSjiqz2hLU0Ha8MTXFIP0yd9fNdP+m43ZQ==", + "dev": true, + "bin": { + "parser": "bin/babel-parser.js" }, - "dependencies": { - "@babel/parser": { - "version": "7.6.0", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.6.0.tgz", - "integrity": "sha512-+o2q111WEx4srBs7L9eJmcwi655eD8sXniLqMB93TBK9GrNzGrxDWSjiqz2hLU0Ha8MTXFIP0yd9fNdP+m43ZQ==", - "dev": true - } + "engines": { + "node": ">=6.0.0" } }, - "@babel/traverse": { + "node_modules/@babel/traverse": { "version": "7.6.0", "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.6.0.tgz", "integrity": "sha512-93t52SaOBgml/xY74lsmt7xOR4ufYvhb5c5qiM6lu4J/dWGMAfAh6eKw4PjLes6DI6nQgearoxnFJk60YchpvQ==", "dev": true, - "requires": { + "dependencies": { "@babel/code-frame": "^7.5.5", "@babel/generator": "^7.6.0", "@babel/helper-function-name": "^7.1.0", @@ -106,82 +150,628 @@ "debug": "^4.1.0", "globals": "^11.1.0", "lodash": "^4.17.13" + } + }, + "node_modules/@babel/traverse/node_modules/@babel/parser": { + "version": "7.6.0", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.6.0.tgz", + "integrity": "sha512-+o2q111WEx4srBs7L9eJmcwi655eD8sXniLqMB93TBK9GrNzGrxDWSjiqz2hLU0Ha8MTXFIP0yd9fNdP+m43ZQ==", + "dev": true, + "bin": { + "parser": "bin/babel-parser.js" }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/traverse/node_modules/debug": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "deprecated": "Debug versions >=3.2.0 <3.2.7 || >=4 <4.3.1 have a low-severity ReDos regression when used in a Node.js environment. It is recommended you upgrade to 3.2.7 or 4.3.1. (https://github.com/visionmedia/debug/issues/797)", + "dev": true, "dependencies": { - "@babel/parser": { - "version": "7.6.0", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.6.0.tgz", - "integrity": "sha512-+o2q111WEx4srBs7L9eJmcwi655eD8sXniLqMB93TBK9GrNzGrxDWSjiqz2hLU0Ha8MTXFIP0yd9fNdP+m43ZQ==", - "dev": true - }, - "debug": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", - "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", - "dev": true, - "requires": { - "ms": "^2.1.1" - } - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - } + "ms": "^2.1.1" } }, - "@babel/types": { + "node_modules/@babel/traverse/node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "node_modules/@babel/types": { "version": "7.6.1", "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.6.1.tgz", "integrity": "sha512-X7gdiuaCmA0uRjCmRtYJNAVCc/q+5xSgsfKJHqMN4iNLILX39677fJE1O40arPMh0TTtS9ItH67yre6c7k6t0g==", "dev": true, - "requires": { + "dependencies": { "esutils": "^2.0.2", "lodash": "^4.17.13", "to-fast-properties": "^2.0.0" } }, - "@types/bn.js": { + "node_modules/@ethereumjs/rlp": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@ethereumjs/rlp/-/rlp-4.0.1.tgz", + "integrity": "sha512-tqsQiBQDQdmPWE1xkkBq4rlSW5QZpLOUJ5RJh2/9fug+q9tnUhuZoVLk7s0scUIKTOzEtR72DFBXI4WiZcMpvw==", + "bin": { + "rlp": "bin/rlp" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/@ethersproject/abi": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/abi/-/abi-5.7.0.tgz", + "integrity": "sha512-351ktp42TiRcYB3H1OP8yajPeAQstMW/yCFokj/AthP9bLHzQFPlOrxOcwYEDkUAICmOHljvN4K39OMTMUa9RA==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "dependencies": { + "@ethersproject/address": "^5.7.0", + "@ethersproject/bignumber": "^5.7.0", + "@ethersproject/bytes": "^5.7.0", + "@ethersproject/constants": "^5.7.0", + "@ethersproject/hash": "^5.7.0", + "@ethersproject/keccak256": "^5.7.0", + "@ethersproject/logger": "^5.7.0", + "@ethersproject/properties": "^5.7.0", + "@ethersproject/strings": "^5.7.0" + } + }, + "node_modules/@ethersproject/abstract-provider": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/abstract-provider/-/abstract-provider-5.7.0.tgz", + "integrity": "sha512-R41c9UkchKCpAqStMYUpdunjo3pkEvZC3FAwZn5S5MGbXoMQOHIdHItezTETxAO5bevtMApSyEhn9+CHcDsWBw==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "dependencies": { + "@ethersproject/bignumber": "^5.7.0", + "@ethersproject/bytes": "^5.7.0", + "@ethersproject/logger": "^5.7.0", + "@ethersproject/networks": "^5.7.0", + "@ethersproject/properties": "^5.7.0", + "@ethersproject/transactions": "^5.7.0", + "@ethersproject/web": "^5.7.0" + } + }, + "node_modules/@ethersproject/abstract-signer": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/abstract-signer/-/abstract-signer-5.7.0.tgz", + "integrity": "sha512-a16V8bq1/Cz+TGCkE2OPMTOUDLS3grCpdjoJCYNnVBbdYEMSgKrU0+B90s8b6H+ByYTBZN7a3g76jdIJi7UfKQ==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "dependencies": { + "@ethersproject/abstract-provider": "^5.7.0", + "@ethersproject/bignumber": "^5.7.0", + "@ethersproject/bytes": "^5.7.0", + "@ethersproject/logger": "^5.7.0", + "@ethersproject/properties": "^5.7.0" + } + }, + "node_modules/@ethersproject/address": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/address/-/address-5.7.0.tgz", + "integrity": "sha512-9wYhYt7aghVGo758POM5nqcOMaE168Q6aRLJZwUmiqSrAungkG74gSSeKEIR7ukixesdRZGPgVqme6vmxs1fkA==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "dependencies": { + "@ethersproject/bignumber": "^5.7.0", + "@ethersproject/bytes": "^5.7.0", + "@ethersproject/keccak256": "^5.7.0", + "@ethersproject/logger": "^5.7.0", + "@ethersproject/rlp": "^5.7.0" + } + }, + "node_modules/@ethersproject/base64": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/base64/-/base64-5.7.0.tgz", + "integrity": "sha512-Dr8tcHt2mEbsZr/mwTPIQAf3Ai0Bks/7gTw9dSqk1mQvhW3XvRlmDJr/4n+wg1JmCl16NZue17CDh8xb/vZ0sQ==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "dependencies": { + "@ethersproject/bytes": "^5.7.0" + } + }, + "node_modules/@ethersproject/bignumber": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/bignumber/-/bignumber-5.7.0.tgz", + "integrity": "sha512-n1CAdIHRWjSucQO3MC1zPSVgV/6dy/fjL9pMrPP9peL+QxEg9wOsVqwD4+818B6LUEtaXzVHQiuivzRoxPxUGw==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "dependencies": { + "@ethersproject/bytes": "^5.7.0", + "@ethersproject/logger": "^5.7.0", + "bn.js": "^5.2.1" + } + }, + "node_modules/@ethersproject/bignumber/node_modules/bn.js": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.1.tgz", + "integrity": "sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ==" + }, + "node_modules/@ethersproject/bytes": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/bytes/-/bytes-5.7.0.tgz", + "integrity": "sha512-nsbxwgFXWh9NyYWo+U8atvmMsSdKJprTcICAkvbBffT75qDocbuggBU0SJiVK2MuTrp0q+xvLkTnGMPK1+uA9A==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "dependencies": { + "@ethersproject/logger": "^5.7.0" + } + }, + "node_modules/@ethersproject/constants": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/constants/-/constants-5.7.0.tgz", + "integrity": "sha512-DHI+y5dBNvkpYUMiRQyxRBYBefZkJfo70VUkUAsRjcPs47muV9evftfZ0PJVCXYbAiCgght0DtcF9srFQmIgWA==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "dependencies": { + "@ethersproject/bignumber": "^5.7.0" + } + }, + "node_modules/@ethersproject/hash": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/hash/-/hash-5.7.0.tgz", + "integrity": "sha512-qX5WrQfnah1EFnO5zJv1v46a8HW0+E5xuBBDTwMFZLuVTx0tbU2kkx15NqdjxecrLGatQN9FGQKpb1FKdHCt+g==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "dependencies": { + "@ethersproject/abstract-signer": "^5.7.0", + "@ethersproject/address": "^5.7.0", + "@ethersproject/base64": "^5.7.0", + "@ethersproject/bignumber": "^5.7.0", + "@ethersproject/bytes": "^5.7.0", + "@ethersproject/keccak256": "^5.7.0", + "@ethersproject/logger": "^5.7.0", + "@ethersproject/properties": "^5.7.0", + "@ethersproject/strings": "^5.7.0" + } + }, + "node_modules/@ethersproject/keccak256": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/keccak256/-/keccak256-5.7.0.tgz", + "integrity": "sha512-2UcPboeL/iW+pSg6vZ6ydF8tCnv3Iu/8tUmLLzWWGzxWKFFqOBQFLo6uLUv6BDrLgCDfN28RJ/wtByx+jZ4KBg==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "dependencies": { + "@ethersproject/bytes": "^5.7.0", + "js-sha3": "0.8.0" + } + }, + "node_modules/@ethersproject/keccak256/node_modules/js-sha3": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/js-sha3/-/js-sha3-0.8.0.tgz", + "integrity": "sha512-gF1cRrHhIzNfToc802P800N8PpXS+evLLXfsVpowqmAFR9uwbi89WvXg2QspOmXL8QL86J4T1EpFu+yUkwJY3Q==" + }, + "node_modules/@ethersproject/logger": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/logger/-/logger-5.7.0.tgz", + "integrity": "sha512-0odtFdXu/XHtjQXJYA3u9G0G8btm0ND5Cu8M7i5vhEcE8/HmF4Lbdqanwyv4uQTr2tx6b7fQRmgLrsnpQlmnig==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ] + }, + "node_modules/@ethersproject/networks": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/@ethersproject/networks/-/networks-5.7.1.tgz", + "integrity": "sha512-n/MufjFYv3yFcUyfhnXotyDlNdFb7onmkSy8aQERi2PjNcnWQ66xXxa3XlS8nCcA8aJKJjIIMNJTC7tu80GwpQ==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "dependencies": { + "@ethersproject/logger": "^5.7.0" + } + }, + "node_modules/@ethersproject/properties": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/properties/-/properties-5.7.0.tgz", + "integrity": "sha512-J87jy8suntrAkIZtecpxEPxY//szqr1mlBaYlQ0r4RCaiD2hjheqF9s1LVE8vVuJCXisjIP+JgtK/Do54ej4Sw==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "dependencies": { + "@ethersproject/logger": "^5.7.0" + } + }, + "node_modules/@ethersproject/rlp": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/rlp/-/rlp-5.7.0.tgz", + "integrity": "sha512-rBxzX2vK8mVF7b0Tol44t5Tb8gomOHkj5guL+HhzQ1yBh/ydjGnpw6at+X6Iw0Kp3OzzzkcKp8N9r0W4kYSs9w==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "dependencies": { + "@ethersproject/bytes": "^5.7.0", + "@ethersproject/logger": "^5.7.0" + } + }, + "node_modules/@ethersproject/signing-key": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/signing-key/-/signing-key-5.7.0.tgz", + "integrity": "sha512-MZdy2nL3wO0u7gkB4nA/pEf8lu1TlFswPNmy8AiYkfKTdO6eXBJyUdmHO/ehm/htHw9K/qF8ujnTyUAD+Ry54Q==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "dependencies": { + "@ethersproject/bytes": "^5.7.0", + "@ethersproject/logger": "^5.7.0", + "@ethersproject/properties": "^5.7.0", + "bn.js": "^5.2.1", + "elliptic": "6.5.4", + "hash.js": "1.1.7" + } + }, + "node_modules/@ethersproject/signing-key/node_modules/bn.js": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.1.tgz", + "integrity": "sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ==" + }, + "node_modules/@ethersproject/signing-key/node_modules/hash.js": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.7.tgz", + "integrity": "sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==", + "dependencies": { + "inherits": "^2.0.3", + "minimalistic-assert": "^1.0.1" + } + }, + "node_modules/@ethersproject/strings": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/strings/-/strings-5.7.0.tgz", + "integrity": "sha512-/9nu+lj0YswRNSH0NXYqrh8775XNyEdUQAuf3f+SmOrnVewcJ5SBNAjF7lpgehKi4abvNNXyf+HX86czCdJ8Mg==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "dependencies": { + "@ethersproject/bytes": "^5.7.0", + "@ethersproject/constants": "^5.7.0", + "@ethersproject/logger": "^5.7.0" + } + }, + "node_modules/@ethersproject/transactions": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/transactions/-/transactions-5.7.0.tgz", + "integrity": "sha512-kmcNicCp1lp8qanMTC3RIikGgoJ80ztTyvtsFvCYpSCfkjhD0jZ2LOrnbcuxuToLIUYYf+4XwD1rP+B/erDIhQ==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "dependencies": { + "@ethersproject/address": "^5.7.0", + "@ethersproject/bignumber": "^5.7.0", + "@ethersproject/bytes": "^5.7.0", + "@ethersproject/constants": "^5.7.0", + "@ethersproject/keccak256": "^5.7.0", + "@ethersproject/logger": "^5.7.0", + "@ethersproject/properties": "^5.7.0", + "@ethersproject/rlp": "^5.7.0", + "@ethersproject/signing-key": "^5.7.0" + } + }, + "node_modules/@ethersproject/web": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/@ethersproject/web/-/web-5.7.1.tgz", + "integrity": "sha512-Gueu8lSvyjBWL4cYsWsjh6MtMwM0+H4HvqFPZfB6dV8ctbP9zFAO73VG1cMWae0FLPCtz0peKPpZY8/ugJJX2w==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "dependencies": { + "@ethersproject/base64": "^5.7.0", + "@ethersproject/bytes": "^5.7.0", + "@ethersproject/logger": "^5.7.0", + "@ethersproject/properties": "^5.7.0", + "@ethersproject/strings": "^5.7.0" + } + }, + "node_modules/@noble/curves": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@noble/curves/-/curves-1.1.0.tgz", + "integrity": "sha512-091oBExgENk/kGj3AZmtBDMpxQPDtxQABR2B9lb1JbVTs6ytdzZNwvhxQ4MWasRNEzlbEH8jCWFCwhF/Obj5AA==", + "dependencies": { + "@noble/hashes": "1.3.1" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/@noble/curves/node_modules/@noble/hashes": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.3.1.tgz", + "integrity": "sha512-EbqwksQwz9xDRGfDST86whPBgM65E0OH/pCgqW0GBVzO22bNE+NuIbeTb714+IfSjU3aRk47EUvXIb5bTsenKA==", + "engines": { + "node": ">= 16" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/@noble/hashes": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.1.2.tgz", + "integrity": "sha512-KYRCASVTv6aeUi1tsF8/vpyR7zpfs3FUzy2Jqm+MU+LmUKhQ0y2FpfwqkCcxSg2ua4GALJd8k2R76WxwZGbQpA==", + "funding": [ + { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + ] + }, + "node_modules/@noble/secp256k1": { + "version": "1.7.1", + "resolved": "https://registry.npmjs.org/@noble/secp256k1/-/secp256k1-1.7.1.tgz", + "integrity": "sha512-hOUk6AyBFmqVrv7k5WAw/LpszxVbj9gGN4JRkIX52fdFAj1UA61KXmZDvqVEm+pOyec3+fIeZB02LYa/pWOArw==", + "funding": [ + { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + ] + }, + "node_modules/@scure/base": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@scure/base/-/base-1.1.1.tgz", + "integrity": "sha512-ZxOhsSyxYwLJj3pLZCefNitxsj093tb2vq90mp2txoYeBqbcjDjqFhyM8eUjq/uFm6zJ+mUuqxlS2FkuSY1MTA==", + "funding": [ + { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + ] + }, + "node_modules/@scure/bip32": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/@scure/bip32/-/bip32-1.3.1.tgz", + "integrity": "sha512-osvveYtyzdEVbt3OfwwXFr4P2iVBL5u1Q3q4ONBfDY/UpOuXmOlbgwc1xECEboY8wIays8Yt6onaWMUdUbfl0A==", + "dependencies": { + "@noble/curves": "~1.1.0", + "@noble/hashes": "~1.3.1", + "@scure/base": "~1.1.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/@scure/bip32/node_modules/@noble/hashes": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.3.1.tgz", + "integrity": "sha512-EbqwksQwz9xDRGfDST86whPBgM65E0OH/pCgqW0GBVzO22bNE+NuIbeTb714+IfSjU3aRk47EUvXIb5bTsenKA==", + "engines": { + "node": ">= 16" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/@scure/bip39": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@scure/bip39/-/bip39-1.2.1.tgz", + "integrity": "sha512-Z3/Fsz1yr904dduJD0NpiyRHhRYHdcnyh73FZWiV+/qhWi83wNJ3NWolYqCEN+ZWsUz2TWwajJggcRE9r1zUYg==", + "dependencies": { + "@noble/hashes": "~1.3.0", + "@scure/base": "~1.1.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/@scure/bip39/node_modules/@noble/hashes": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.3.1.tgz", + "integrity": "sha512-EbqwksQwz9xDRGfDST86whPBgM65E0OH/pCgqW0GBVzO22bNE+NuIbeTb714+IfSjU3aRk47EUvXIb5bTsenKA==", + "engines": { + "node": ">= 16" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/@typechain/ethers-v6": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/@typechain/ethers-v6/-/ethers-v6-0.4.0.tgz", + "integrity": "sha512-vD3Agzz63Gf2XlU3ed2/y+8dLWQj+wf+4Eq+0JXsyOio/plyV5F6r0yYe+s3XdGI858U3Sr263pl8mliDrUqbw==", + "dev": true, + "dependencies": { + "lodash": "^4.17.15", + "ts-essentials": "^7.0.1" + }, + "peerDependencies": { + "ethers": "6.x", + "typechain": "^8.2.0", + "typescript": ">=4.7.0" + } + }, + "node_modules/@types/bn.js": { "version": "4.11.5", "resolved": "https://registry.npmjs.org/@types/bn.js/-/bn.js-4.11.5.tgz", "integrity": "sha512-AEAZcIZga0JgVMHNtl1CprA/hXX7/wPt79AgR4XqaDt7jyj3QWYw6LPoOiznPtugDmlubUnAahMs2PFxGcQrng==", "dev": true, - "requires": { + "dependencies": { "@types/node": "*" } }, - "@types/chai": { + "node_modules/@types/chai": { "version": "4.2.2", "resolved": "https://registry.npmjs.org/@types/chai/-/chai-4.2.2.tgz", "integrity": "sha512-8V2aCcPM3WLuJvJpF6N60uUvdZb7NHjpjQlLk1QmZbTP4XZET/FX0c3TJ3K7qt4L98FS1Pifa8BVofTVuJFWVA==", "dev": true }, - "@types/elliptic": { + "node_modules/@types/elliptic": { "version": "6.4.9", "resolved": "https://registry.npmjs.org/@types/elliptic/-/elliptic-6.4.9.tgz", "integrity": "sha512-Mn+OyENd6YHwJKgUSyCTUDunEDFMaFpCXt52JCA00sxtzEa1ji6H0doZHL3iXhqMTo1Ob53X+Dv0s4PAJ+IVlA==", "dev": true, - "requires": { + "dependencies": { "@types/bn.js": "*" } }, - "@types/mocha": { + "node_modules/@types/mocha": { "version": "5.2.7", "resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-5.2.7.tgz", "integrity": "sha512-NYrtPht0wGzhwe9+/idPaBB+TqkY9AhTvOLMkThm0IoEfLaiVQZwBwyJ5puCkO3AUCWrmcoePjp2mbFocKy4SQ==", "dev": true }, - "@types/node": { + "node_modules/@types/node": { "version": "10.14.18", "resolved": "https://registry.npmjs.org/@types/node/-/node-10.14.18.tgz", "integrity": "sha512-ryO3Q3++yZC/+b8j8BdKd/dn9JlzlHBPdm80656xwYUdmPkpTGTjkAdt6BByiNupGPE8w0FhBgvYy/fX9hRNGQ==" }, - "@vechain/ethers": { + "node_modules/@types/prettier": { + "version": "2.7.3", + "resolved": "https://registry.npmjs.org/@types/prettier/-/prettier-2.7.3.tgz", + "integrity": "sha512-+68kP9yzs4LMp7VNh8gdzMSPZFL44MLGqiHWvttYJe+6qnuVr4Ek9wSBQoveqY/r+LwjCcU29kNVkidwim+kYA==", + "dev": true, + "peer": true + }, + "node_modules/@types/ws": { + "version": "8.5.5", + "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.5.5.tgz", + "integrity": "sha512-lwhs8hktwxSjf9UaZ9tG5M03PGogvFaH8gUgLNbN9HKIg0dvv6q+gkSuJ8HN4/VbyxkuLzCjlN7GquQ0gUJfIg==", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@vechain/ethers": { "version": "4.0.27-5", "resolved": "https://registry.npmjs.org/@vechain/ethers/-/ethers-4.0.27-5.tgz", "integrity": "sha512-dR+rTUauPJpqHNBdEgV6Xh+o009uCRPCvN2HWYIAzZP2SvgsPHLxNUzeRbRKhNzz/HC8HjWNvECRxODF88B03Q==", - "requires": { + "dependencies": { "@types/node": "^10.3.2", "aes-js": "3.0.0", "bn.js": "^4.4.0", @@ -194,293 +784,453 @@ "xmlhttprequest": "1.8.0" } }, - "aes-js": { + "node_modules/aes-js": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/aes-js/-/aes-js-3.0.0.tgz", "integrity": "sha1-4h3xCtbCBTKVvLuNq0Cwnb6ofk0=" }, - "ansi-regex": { + "node_modules/ansi-regex": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", - "dev": true + "dev": true, + "engines": { + "node": ">=6" + } }, - "ansi-styles": { + "node_modules/ansi-styles": { "version": "3.2.1", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", "dev": true, - "requires": { + "dependencies": { "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" } }, - "append-transform": { + "node_modules/append-transform": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/append-transform/-/append-transform-1.0.0.tgz", "integrity": "sha512-P009oYkeHyU742iSZJzZZywj4QRJdnTWffaKuJQLablCZ1uz6/cW4yaRgcDaoQ+uwOxxnt0gRUcwfsNP2ri0gw==", "dev": true, - "requires": { + "dependencies": { "default-require-extensions": "^2.0.0" + }, + "engines": { + "node": ">=4" } }, - "archy": { + "node_modules/archy": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/archy/-/archy-1.0.0.tgz", "integrity": "sha1-+cjBN1fMHde8N5rHeyxipcKGjEA=", "dev": true }, - "arg": { + "node_modules/arg": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.1.tgz", "integrity": "sha512-SlmP3fEA88MBv0PypnXZ8ZfJhwmDeIE3SP71j37AiXQBXYosPV0x6uISAaHYSlSVhmHOVkomen0tbGk6Anlebw==", "dev": true }, - "argparse": { + "node_modules/argparse": { "version": "1.0.10", "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", "dev": true, - "requires": { + "dependencies": { "sprintf-js": "~1.0.2" } }, - "assertion-error": { + "node_modules/array-back": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/array-back/-/array-back-3.1.0.tgz", + "integrity": "sha512-TkuxA4UCOvxuDK6NZYXCalszEzj+TLszyASooky+i742l9TqsOdYCMJJupxRic61hwquNtppB3hgcuq9SVSH1Q==", + "dev": true, + "peer": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/assertion-error": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-1.1.0.tgz", "integrity": "sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==", - "dev": true + "dev": true, + "engines": { + "node": "*" + } + }, + "node_modules/available-typed-arrays": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz", + "integrity": "sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } }, - "balanced-match": { + "node_modules/balanced-match": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", "dev": true }, - "bignumber.js": { + "node_modules/bignumber.js": { "version": "7.2.1", "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-7.2.1.tgz", - "integrity": "sha512-S4XzBk5sMB+Rcb/LNcpzXr57VRTxgAvaAEDAl1AwRx27j00hT84O6OkteE7u8UB3NuaaygCRrEpqox4uDOrbdQ==" + "integrity": "sha512-S4XzBk5sMB+Rcb/LNcpzXr57VRTxgAvaAEDAl1AwRx27j00hT84O6OkteE7u8UB3NuaaygCRrEpqox4uDOrbdQ==", + "engines": { + "node": "*" + } }, - "blakejs": { + "node_modules/blakejs": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/blakejs/-/blakejs-1.1.2.tgz", "integrity": "sha512-c482YFKvFRGlG2JshSIpKkek3WGn0qvhXAFcdZ0En9OgFFt2Ybu5urcnEHN3iQAz4wlLN6MBBVDDRkp8RfrjJg==" }, - "bn.js": { + "node_modules/bn.js": { "version": "4.11.8", "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.8.tgz", "integrity": "sha512-ItfYfPLkWHUjckQCk8xC+LwxgK8NYcXywGigJgSwOP8Y2iyWT4f2vsZnoOXTTbo+o5yXmIUJ4gn5538SO5S3gA==" }, - "brace-expansion": { + "node_modules/brace-expansion": { "version": "1.1.11", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", "dev": true, - "requires": { + "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" } }, - "brorand": { + "node_modules/brorand": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz", "integrity": "sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8=" }, - "browser-stdout": { + "node_modules/browser-stdout": { "version": "1.3.1", "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz", "integrity": "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==", "dev": true }, - "buffer-from": { + "node_modules/buffer-from": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz", "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==", "dev": true }, - "builtin-modules": { + "node_modules/builtin-modules": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-1.1.1.tgz", "integrity": "sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8=", - "dev": true + "dev": true, + "engines": { + "node": ">=0.10.0" + } }, - "caching-transform": { + "node_modules/caching-transform": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/caching-transform/-/caching-transform-3.0.2.tgz", "integrity": "sha512-Mtgcv3lh3U0zRii/6qVgQODdPA4G3zhG+jtbCWj39RXuUFTMzH0vcdMtaJS1jPowd+It2Pqr6y3NJMQqOqCE2w==", "dev": true, - "requires": { + "dependencies": { "hasha": "^3.0.0", "make-dir": "^2.0.0", "package-hash": "^3.0.0", "write-file-atomic": "^2.4.2" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/call-bind": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", + "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", + "dependencies": { + "function-bind": "^1.1.1", + "get-intrinsic": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "camelcase": { + "node_modules/camelcase": { "version": "5.3.1", "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", - "dev": true + "dev": true, + "engines": { + "node": ">=6" + } }, - "chai": { + "node_modules/chai": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/chai/-/chai-4.2.0.tgz", "integrity": "sha512-XQU3bhBukrOsQCuwZndwGcCVQHyZi53fQ6Ys1Fym7E4olpIqqZZhhoFJoaKVvV17lWQoXYwgWN2nF5crA8J2jw==", "dev": true, - "requires": { + "dependencies": { "assertion-error": "^1.1.0", "check-error": "^1.0.2", "deep-eql": "^3.0.1", "get-func-name": "^2.0.0", "pathval": "^1.1.0", "type-detect": "^4.0.5" + }, + "engines": { + "node": ">=4" } }, - "chalk": { + "node_modules/chalk": { "version": "2.4.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", "dev": true, - "requires": { + "dependencies": { "ansi-styles": "^3.2.1", "escape-string-regexp": "^1.0.5", "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" } }, - "check-error": { + "node_modules/check-error": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/check-error/-/check-error-1.0.2.tgz", "integrity": "sha1-V00xLt2Iu13YkS6Sht1sCu1KrII=", - "dev": true + "dev": true, + "engines": { + "node": "*" + } }, - "cliui": { + "node_modules/cliui": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz", "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==", "dev": true, - "requires": { + "dependencies": { "string-width": "^3.1.0", "strip-ansi": "^5.2.0", "wrap-ansi": "^5.1.0" } }, - "color-convert": { + "node_modules/color-convert": { "version": "1.9.3", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", "dev": true, - "requires": { + "dependencies": { "color-name": "1.1.3" } }, - "color-name": { + "node_modules/color-name": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", "dev": true }, - "commander": { + "node_modules/command-line-args": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/command-line-args/-/command-line-args-5.2.1.tgz", + "integrity": "sha512-H4UfQhZyakIjC74I9d34fGYDwk3XpSr17QhEd0Q3I9Xq1CETHo4Hcuo87WyWHpAF1aSLjLRf5lD9ZGX2qStUvg==", + "dev": true, + "peer": true, + "dependencies": { + "array-back": "^3.1.0", + "find-replace": "^3.0.0", + "lodash.camelcase": "^4.3.0", + "typical": "^4.0.0" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/command-line-usage": { + "version": "6.1.3", + "resolved": "https://registry.npmjs.org/command-line-usage/-/command-line-usage-6.1.3.tgz", + "integrity": "sha512-sH5ZSPr+7UStsloltmDh7Ce5fb8XPlHyoPzTpyyMuYCtervL65+ubVZ6Q61cFtFl62UyJlc8/JwERRbAFPUqgw==", + "dev": true, + "peer": true, + "dependencies": { + "array-back": "^4.0.2", + "chalk": "^2.4.2", + "table-layout": "^1.0.2", + "typical": "^5.2.0" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/command-line-usage/node_modules/array-back": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/array-back/-/array-back-4.0.2.tgz", + "integrity": "sha512-NbdMezxqf94cnNfWLL7V/im0Ub+Anbb0IoZhvzie8+4HJ4nMQuzHuy49FkGYCJK2yAloZ3meiB6AVMClbrI1vg==", + "dev": true, + "peer": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/command-line-usage/node_modules/typical": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/typical/-/typical-5.2.0.tgz", + "integrity": "sha512-dvdQgNDNJo+8B2uBQoqdb11eUCE1JQXhvjC/CZtgvZseVd5TYMXnq0+vuUemXbd/Se29cTaUuPX3YIc2xgbvIg==", + "dev": true, + "peer": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/commander": { "version": "2.15.1", "resolved": "https://registry.npmjs.org/commander/-/commander-2.15.1.tgz", "integrity": "sha512-VlfT9F3V0v+jr4yxPc5gg9s62/fIVWsd2Bk2iD435um1NlGMYdVCq+MjcXnhYq2icNOizHr1kK+5TI6H0Hy0ag==", "dev": true }, - "commondir": { + "node_modules/commondir": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", "integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=", "dev": true }, - "concat-map": { + "node_modules/concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", "dev": true }, - "convert-source-map": { + "node_modules/convert-source-map": { "version": "1.6.0", "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.6.0.tgz", "integrity": "sha512-eFu7XigvxdZ1ETfbgPBohgyQ/Z++C0eEhTor0qRwBw9unw+L0/6V8wkSuGgzdThkiS5lSpdptOQPD8Ak40a+7A==", "dev": true, - "requires": { - "safe-buffer": "~5.1.1" - }, "dependencies": { - "safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true - } + "safe-buffer": "~5.1.1" } }, - "cp-file": { + "node_modules/convert-source-map/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + }, + "node_modules/cp-file": { "version": "6.2.0", "resolved": "https://registry.npmjs.org/cp-file/-/cp-file-6.2.0.tgz", "integrity": "sha512-fmvV4caBnofhPe8kOcitBwSn2f39QLjnAnGq3gO9dfd75mUytzKNZB1hde6QHunW2Rt+OwuBOMc3i1tNElbszA==", "dev": true, - "requires": { + "dependencies": { "graceful-fs": "^4.1.2", "make-dir": "^2.0.0", "nested-error-stacks": "^2.0.0", "pify": "^4.0.1", "safe-buffer": "^5.0.1" + }, + "engines": { + "node": ">=6" } }, - "cross-spawn": { + "node_modules/crc-32": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/crc-32/-/crc-32-1.2.2.tgz", + "integrity": "sha512-ROmzCKrTnOwybPcJApAA6WBWij23HVfGVNKqqrZpuyZOHqK2CwHSvpGuyt/UNNvaIjEd8X5IFGp4Mh+Ie1IHJQ==", + "bin": { + "crc32": "bin/crc32.njs" + }, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/cross-fetch": { + "version": "3.1.8", + "resolved": "https://registry.npmjs.org/cross-fetch/-/cross-fetch-3.1.8.tgz", + "integrity": "sha512-cvA+JwZoU0Xq+h6WkMvAUqPEYy92Obet6UdKLfW60qn99ftItKjB5T+BkyWOFWe2pUyfQ+IJHmpOTznqk1M6Kg==", + "dependencies": { + "node-fetch": "^2.6.12" + } + }, + "node_modules/cross-spawn": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-4.0.2.tgz", "integrity": "sha1-e5JHYhwjrf3ThWAEqCPL45dCTUE=", "dev": true, - "requires": { + "dependencies": { "lru-cache": "^4.0.1", "which": "^1.2.9" } }, - "debug": { + "node_modules/debug": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", "dev": true, - "requires": { + "dependencies": { "ms": "2.0.0" } }, - "decamelize": { + "node_modules/decamelize": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", - "dev": true + "dev": true, + "engines": { + "node": ">=0.10.0" + } }, - "deep-eql": { + "node_modules/deep-eql": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-3.0.1.tgz", "integrity": "sha512-+QeIQyN5ZuO+3Uk5DYh6/1eKO0m0YmJFGNmFHGACpf1ClL1nmlV/p4gNgbl2pJGxgXb4faqo6UE+M5ACEMyVcw==", "dev": true, - "requires": { + "dependencies": { "type-detect": "^4.0.0" + }, + "engines": { + "node": ">=0.12" + } + }, + "node_modules/deep-extend": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", + "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", + "dev": true, + "peer": true, + "engines": { + "node": ">=4.0.0" } }, - "default-require-extensions": { + "node_modules/default-require-extensions": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/default-require-extensions/-/default-require-extensions-2.0.0.tgz", "integrity": "sha1-9fj7sYp9bVCyH2QfZJ67Uiz+JPc=", "dev": true, - "requires": { + "dependencies": { "strip-bom": "^3.0.0" + }, + "engines": { + "node": ">=4" } }, - "diff": { + "node_modules/diff": { "version": "3.5.0", "resolved": "https://registry.npmjs.org/diff/-/diff-3.5.0.tgz", "integrity": "sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==", - "dev": true + "dev": true, + "engines": { + "node": ">=0.3.1" + } }, - "elliptic": { + "node_modules/elliptic": { "version": "6.5.4", "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.4.tgz", "integrity": "sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ==", - "requires": { + "dependencies": { "bn.js": "^4.11.9", "brorand": "^1.1.0", "hash.js": "^1.0.0", @@ -488,257 +1238,594 @@ "inherits": "^2.0.4", "minimalistic-assert": "^1.0.1", "minimalistic-crypto-utils": "^1.0.1" - }, - "dependencies": { - "bn.js": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", - "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==" - } } }, - "emoji-regex": { + "node_modules/elliptic/node_modules/bn.js": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==" + }, + "node_modules/emoji-regex": { "version": "7.0.3", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==", "dev": true }, - "error-ex": { + "node_modules/error-ex": { "version": "1.3.2", "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", "dev": true, - "requires": { + "dependencies": { "is-arrayish": "^0.2.1" } }, - "es6-error": { + "node_modules/es6-error": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/es6-error/-/es6-error-4.1.1.tgz", "integrity": "sha512-Um/+FxMr9CISWh0bi5Zv0iOD+4cFh5qLeks1qhAopKVAJw3drgKbKySikp7wGhDL0HPeaja0P5ULZrxLkniUVg==", "dev": true }, - "escape-string-regexp": { + "node_modules/escape-string-regexp": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", - "dev": true + "dev": true, + "engines": { + "node": ">=0.8.0" + } }, - "esprima": { + "node_modules/esprima": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", - "dev": true + "dev": true, + "bin": { + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" + }, + "engines": { + "node": ">=4" + } }, - "esutils": { + "node_modules/esutils": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", - "dev": true + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/ethereum-cryptography": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ethereum-cryptography/-/ethereum-cryptography-2.1.2.tgz", + "integrity": "sha512-Z5Ba0T0ImZ8fqXrJbpHcbpAvIswRte2wGNR/KePnu8GbbvgJ47lMxT/ZZPG6i9Jaht4azPDop4HaM00J0J59ug==", + "dependencies": { + "@noble/curves": "1.1.0", + "@noble/hashes": "1.3.1", + "@scure/bip32": "1.3.1", + "@scure/bip39": "1.2.1" + } + }, + "node_modules/ethereum-cryptography/node_modules/@noble/hashes": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.3.1.tgz", + "integrity": "sha512-EbqwksQwz9xDRGfDST86whPBgM65E0OH/pCgqW0GBVzO22bNE+NuIbeTb714+IfSjU3aRk47EUvXIb5bTsenKA==", + "engines": { + "node": ">= 16" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/ethers": { + "version": "6.6.3", + "resolved": "https://registry.npmjs.org/ethers/-/ethers-6.6.3.tgz", + "integrity": "sha512-g8wLXeRWSGDD0T+wsL3pvyc3aYnmxEEAwH8LSoDTDRhRsmJeNs9YMXlNU7ax2caO+zHkeI9MkHiz6rwxEjN4Mw==", + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/ethers-io/" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "dependencies": { + "@adraffy/ens-normalize": "1.9.2", + "@noble/hashes": "1.1.2", + "@noble/secp256k1": "1.7.1", + "@types/node": "18.15.13", + "aes-js": "4.0.0-beta.5", + "tslib": "2.4.0", + "ws": "8.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/ethers/node_modules/@types/node": { + "version": "18.15.13", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.15.13.tgz", + "integrity": "sha512-N+0kuo9KgrUQ1Sn/ifDXsvg0TTleP7rIy4zOBGECxAljqvqfqpTfzx0Q1NUedOixRMBfe2Whhb056a42cWs26Q==" + }, + "node_modules/ethers/node_modules/aes-js": { + "version": "4.0.0-beta.5", + "resolved": "https://registry.npmjs.org/aes-js/-/aes-js-4.0.0-beta.5.tgz", + "integrity": "sha512-G965FqalsNyrPqgEGON7nIx1e/OVENSgiEIzyC63haUMuvNnwIgIjMs52hlTCKhkBny7A2ORNlfY9Zu+jmGk1Q==" + }, + "node_modules/ethers/node_modules/tslib": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", + "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==" }, - "fast-json-stable-stringify": { + "node_modules/fast-json-stable-stringify": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==" }, - "find-cache-dir": { + "node_modules/find-cache-dir": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-2.1.0.tgz", "integrity": "sha512-Tq6PixE0w/VMFfCgbONnkiQIVol/JJL7nRMi20fqzA4NRs9AfeqMGeRdPi3wIhYkxjeBaWh2rxwapn5Tu3IqOQ==", "dev": true, - "requires": { + "dependencies": { "commondir": "^1.0.1", "make-dir": "^2.0.0", "pkg-dir": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/find-replace": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-replace/-/find-replace-3.0.0.tgz", + "integrity": "sha512-6Tb2myMioCAgv5kfvP5/PkZZ/ntTpVK39fHY7WkWBgvbeE+VHd/tZuZ4mrC+bxh4cfOZeYKVPaJIZtZXV7GNCQ==", + "dev": true, + "peer": true, + "dependencies": { + "array-back": "^3.0.1" + }, + "engines": { + "node": ">=4.0.0" } }, - "find-up": { + "node_modules/find-up": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", "dev": true, - "requires": { + "dependencies": { "locate-path": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/for-each": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz", + "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==", + "dependencies": { + "is-callable": "^1.1.3" } }, - "foreground-child": { + "node_modules/foreground-child": { "version": "1.5.6", "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-1.5.6.tgz", "integrity": "sha1-T9ca0t/elnibmApcCilZN8svXOk=", "dev": true, - "requires": { + "dependencies": { "cross-spawn": "^4", "signal-exit": "^3.0.0" } }, - "fs.realpath": { + "node_modules/fs-extra": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-7.0.1.tgz", + "integrity": "sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==", + "dev": true, + "peer": true, + "dependencies": { + "graceful-fs": "^4.1.2", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + }, + "engines": { + "node": ">=6 <7 || >=8" + } + }, + "node_modules/fs.realpath": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", "dev": true }, - "get-caller-file": { + "node_modules/function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" + }, + "node_modules/generate-function": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/generate-function/-/generate-function-2.3.1.tgz", + "integrity": "sha512-eeB5GfMNeevm/GRYq20ShmsaGcmI81kIX2K9XQx5miC8KdHaC6Jm0qQ8ZNeGOi7wYB8OsdxKs+Y2oVuTFuVwKQ==", + "dependencies": { + "is-property": "^1.0.2" + } + }, + "node_modules/generate-object-property": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/generate-object-property/-/generate-object-property-1.2.0.tgz", + "integrity": "sha512-TuOwZWgJ2VAMEGJvAyPWvpqxSANF0LDpmyHauMjFYzaACvn+QTT/AZomvPCzVBV7yDN3OmwHQ5OvHaeLKre3JQ==", + "dependencies": { + "is-property": "^1.0.0" + } + }, + "node_modules/get-caller-file": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", - "dev": true + "dev": true, + "engines": { + "node": "6.* || 8.* || >= 10.*" + } }, - "get-func-name": { + "node_modules/get-func-name": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.0.tgz", "integrity": "sha1-6td0q+5y4gQJQzoGY2YCPdaIekE=", - "dev": true + "dev": true, + "engines": { + "node": "*" + } + }, + "node_modules/get-intrinsic": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.1.tgz", + "integrity": "sha512-2DcsyfABl+gVHEfCOaTrWgyt+tb6MSEGmKq+kI5HwLbIYgjgmMcV8KQ41uaKz1xxUcn9tJtgFbQUEVcEbd0FYw==", + "dependencies": { + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-proto": "^1.0.1", + "has-symbols": "^1.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } }, - "glob": { + "node_modules/glob": { "version": "7.1.2", "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz", "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==", "dev": true, - "requires": { + "dependencies": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", "inherits": "2", "minimatch": "^3.0.4", "once": "^1.3.0", "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" } }, - "globals": { + "node_modules/globals": { "version": "11.12.0", "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", - "dev": true + "dev": true, + "engines": { + "node": ">=4" + } }, - "graceful-fs": { + "node_modules/gopd": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", + "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", + "dependencies": { + "get-intrinsic": "^1.1.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/graceful-fs": { "version": "4.2.2", "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.2.tgz", "integrity": "sha512-IItsdsea19BoLC7ELy13q1iJFNmd7ofZH5+X/pJr90/nRoPEX0DJo1dHDbgtYWOhJhcCgMDTOw84RZ72q6lB+Q==", "dev": true }, - "growl": { + "node_modules/growl": { "version": "1.10.5", "resolved": "https://registry.npmjs.org/growl/-/growl-1.10.5.tgz", "integrity": "sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA==", - "dev": true + "dev": true, + "engines": { + "node": ">=4.x" + } }, - "has-flag": { + "node_modules/has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "dependencies": { + "function-bind": "^1.1.1" + }, + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/has-flag": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", - "dev": true + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/has-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.1.tgz", + "integrity": "sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-symbols": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", + "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } }, - "hash.js": { + "node_modules/has-tostringtag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz", + "integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==", + "dependencies": { + "has-symbols": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/hash.js": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.3.tgz", "integrity": "sha512-/UETyP0W22QILqS+6HowevwhEFJ3MBJnwTf75Qob9Wz9t0DPuisL8kW8YZMK62dHAKE1c1p+gY1TtOLY+USEHA==", - "requires": { + "dependencies": { "inherits": "^2.0.3", "minimalistic-assert": "^1.0.0" } }, - "hasha": { + "node_modules/hasha": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/hasha/-/hasha-3.0.0.tgz", "integrity": "sha1-UqMvq4Vp1BymmmH/GiFPjrfIvTk=", "dev": true, - "requires": { + "dependencies": { "is-stream": "^1.0.1" + }, + "engines": { + "node": ">=4" } }, - "he": { + "node_modules/he": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/he/-/he-1.1.1.tgz", "integrity": "sha1-k0EP0hsAlzUVH4howvJx80J+I/0=", - "dev": true + "dev": true, + "bin": { + "he": "bin/he" + } }, - "hmac-drbg": { + "node_modules/hmac-drbg": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz", "integrity": "sha1-0nRXAQJabHdabFRXk+1QL8DGSaE=", - "requires": { + "dependencies": { "hash.js": "^1.0.3", "minimalistic-assert": "^1.0.0", "minimalistic-crypto-utils": "^1.0.1" } }, - "hosted-git-info": { + "node_modules/hosted-git-info": { "version": "2.8.4", "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.4.tgz", "integrity": "sha512-pzXIvANXEFrc5oFFXRMkbLPQ2rXRoDERwDLyrcUxGhaZhgP54BBSl9Oheh7Vv0T090cszWBxPjkQQ5Sq1PbBRQ==", "dev": true }, - "html-escaper": { + "node_modules/html-escaper": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", "dev": true }, - "imurmurhash": { + "node_modules/imurmurhash": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", - "dev": true + "dev": true, + "engines": { + "node": ">=0.8.19" + } }, - "inflight": { + "node_modules/inflight": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", "dev": true, - "requires": { + "dependencies": { "once": "^1.3.0", "wrappy": "1" } }, - "inherits": { + "node_modules/inherits": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" }, - "is-arrayish": { + "node_modules/is-arguments": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.1.tgz", + "integrity": "sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==", + "dependencies": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-arrayish": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=", "dev": true }, - "is-fullwidth-code-point": { + "node_modules/is-callable": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", + "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-fullwidth-code-point": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", - "dev": true + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/is-generator-function": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.0.10.tgz", + "integrity": "sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A==", + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-my-ip-valid": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-my-ip-valid/-/is-my-ip-valid-1.0.1.tgz", + "integrity": "sha512-jxc8cBcOWbNK2i2aTkCZP6i7wkHF1bqKFrwEHuN5Jtg5BSaZHUZQ/JTOJwoV41YvHnOaRyWWh72T/KvfNz9DJg==" + }, + "node_modules/is-my-json-valid": { + "version": "2.20.6", + "resolved": "https://registry.npmjs.org/is-my-json-valid/-/is-my-json-valid-2.20.6.tgz", + "integrity": "sha512-1JQwulVNjx8UqkPE/bqDaxtH4PXCe/2VRh/y3p99heOV87HG4Id5/VfDswd+YiAfHcRTfDlWgISycnHuhZq1aw==", + "dependencies": { + "generate-function": "^2.0.0", + "generate-object-property": "^1.1.0", + "is-my-ip-valid": "^1.0.0", + "jsonpointer": "^5.0.0", + "xtend": "^4.0.0" + } }, - "is-stream": { + "node_modules/is-property": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-property/-/is-property-1.0.2.tgz", + "integrity": "sha512-Ks/IoX00TtClbGQr4TWXemAnktAQvYB7HzcCxDGqEZU6oCmb2INHuOoKxbtR+HFkmYWBKv/dOZtGRiAjDhj92g==" + }, + "node_modules/is-stream": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=", - "dev": true + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-typed-array": { + "version": "1.1.10", + "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.10.tgz", + "integrity": "sha512-PJqgEHiWZvMpaFZ3uTc8kHPM4+4ADTlDniuQL7cU/UDA0Ql7F70yGfHph3cLNe+c9toaigv+DFzTJKhc2CtO6A==", + "dependencies": { + "available-typed-arrays": "^1.0.5", + "call-bind": "^1.0.2", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } }, - "isexe": { + "node_modules/isexe": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", "dev": true }, - "istanbul-lib-coverage": { + "node_modules/isomorphic-ws": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/isomorphic-ws/-/isomorphic-ws-5.0.0.tgz", + "integrity": "sha512-muId7Zzn9ywDsyXgTIafTry2sV3nySZeUDe6YedVd1Hvuuep5AsIlqK+XefWpYTyJG5e503F2xIuT2lcU6rCSw==", + "peerDependencies": { + "ws": "*" + } + }, + "node_modules/istanbul-lib-coverage": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.5.tgz", "integrity": "sha512-8aXznuEPCJvGnMSRft4udDRDtb1V3pkQkMMI5LI+6HuQz5oQ4J2UFn1H82raA3qJtyOLkkwVqICBQkjnGtn5mA==", - "dev": true + "dev": true, + "engines": { + "node": ">=6" + } }, - "istanbul-lib-hook": { + "node_modules/istanbul-lib-hook": { "version": "2.0.7", "resolved": "https://registry.npmjs.org/istanbul-lib-hook/-/istanbul-lib-hook-2.0.7.tgz", "integrity": "sha512-vrRztU9VRRFDyC+aklfLoeXyNdTfga2EI3udDGn4cZ6fpSXpHLV9X6CHvfoMCPtggg8zvDDmC4b9xfu0z6/llA==", "dev": true, - "requires": { + "dependencies": { "append-transform": "^1.0.0" + }, + "engines": { + "node": ">=6" } }, - "istanbul-lib-instrument": { + "node_modules/istanbul-lib-instrument": { "version": "3.3.0", "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-3.3.0.tgz", "integrity": "sha512-5nnIN4vo5xQZHdXno/YDXJ0G+I3dAm4XgzfSVTPLQpj/zAV2dV6Juy0yaf10/zrJOJeHoN3fraFe+XRq2bFVZA==", "dev": true, - "requires": { + "dependencies": { "@babel/generator": "^7.4.0", "@babel/parser": "^7.4.3", "@babel/template": "^7.4.0", @@ -747,240 +1834,307 @@ "istanbul-lib-coverage": "^2.0.5", "semver": "^6.0.0" }, - "dependencies": { - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true - } + "engines": { + "node": ">=6" + } + }, + "node_modules/istanbul-lib-instrument/node_modules/semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true, + "bin": { + "semver": "bin/semver.js" } }, - "istanbul-lib-report": { + "node_modules/istanbul-lib-report": { "version": "2.0.8", "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-2.0.8.tgz", "integrity": "sha512-fHBeG573EIihhAblwgxrSenp0Dby6tJMFR/HvlerBsrCTD5bkUuoNtn3gVh29ZCS824cGGBPn7Sg7cNk+2xUsQ==", "dev": true, - "requires": { + "dependencies": { "istanbul-lib-coverage": "^2.0.5", "make-dir": "^2.1.0", "supports-color": "^6.1.0" }, + "engines": { + "node": ">=6" + } + }, + "node_modules/istanbul-lib-report/node_modules/supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "dev": true, "dependencies": { - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=6" } }, - "istanbul-lib-source-maps": { + "node_modules/istanbul-lib-source-maps": { "version": "3.0.6", "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-3.0.6.tgz", "integrity": "sha512-R47KzMtDJH6X4/YW9XTx+jrLnZnscW4VpNN+1PViSYTejLVPWv7oov+Duf8YQSPyVRUvueQqz1TcsC6mooZTXw==", "dev": true, - "requires": { + "dependencies": { "debug": "^4.1.1", "istanbul-lib-coverage": "^2.0.5", "make-dir": "^2.1.0", "rimraf": "^2.6.3", "source-map": "^0.6.1" }, + "engines": { + "node": ">=6" + } + }, + "node_modules/istanbul-lib-source-maps/node_modules/debug": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "deprecated": "Debug versions >=3.2.0 <3.2.7 || >=4 <4.3.1 have a low-severity ReDos regression when used in a Node.js environment. It is recommended you upgrade to 3.2.7 or 4.3.1. (https://github.com/visionmedia/debug/issues/797)", + "dev": true, "dependencies": { - "debug": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", - "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", - "dev": true, - "requires": { - "ms": "^2.1.1" - } - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - } + "ms": "^2.1.1" } }, - "istanbul-reports": { + "node_modules/istanbul-lib-source-maps/node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "node_modules/istanbul-lib-source-maps/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/istanbul-reports": { "version": "2.2.7", "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-2.2.7.tgz", "integrity": "sha512-uu1F/L1o5Y6LzPVSVZXNOoD/KXpJue9aeLRd0sM9uMXfZvzomB0WxVamWb5ue8kA2vVWEmW7EG+A5n3f1kqHKg==", "dev": true, - "requires": { + "dependencies": { "html-escaper": "^2.0.0" + }, + "engines": { + "node": ">=6" } }, - "js-sha3": { + "node_modules/js-sha3": { "version": "0.5.7", "resolved": "https://registry.npmjs.org/js-sha3/-/js-sha3-0.5.7.tgz", "integrity": "sha1-DU/9gALVMzqrr0oj7tL2N0yfKOc=" }, - "js-tokens": { + "node_modules/js-tokens": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", "dev": true }, - "js-yaml": { + "node_modules/js-yaml": { "version": "3.13.1", "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.13.1.tgz", "integrity": "sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw==", "dev": true, - "requires": { + "dependencies": { "argparse": "^1.0.7", "esprima": "^4.0.0" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" } }, - "jsesc": { + "node_modules/jsesc": { "version": "2.5.2", "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", - "dev": true + "dev": true, + "bin": { + "jsesc": "bin/jsesc" + }, + "engines": { + "node": ">=4" + } }, - "json-parse-better-errors": { + "node_modules/json-parse-better-errors": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==", "dev": true }, - "load-json-file": { + "node_modules/jsonfile": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", + "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==", + "dev": true, + "peer": true, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/jsonpointer": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/jsonpointer/-/jsonpointer-5.0.1.tgz", + "integrity": "sha512-p/nXbhSEcu3pZRdkW1OfJhpsVtW1gd4Wa1fnQc9YLiTfAjn0312eMKimbdIQzuZl9aa9xUGaRlP9T/CJE/ditQ==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/load-json-file": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-4.0.0.tgz", "integrity": "sha1-L19Fq5HjMhYjT9U62rZo607AmTs=", "dev": true, - "requires": { + "dependencies": { "graceful-fs": "^4.1.2", "parse-json": "^4.0.0", "pify": "^3.0.0", "strip-bom": "^3.0.0" }, - "dependencies": { - "pify": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", - "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", - "dev": true - } + "engines": { + "node": ">=4" + } + }, + "node_modules/load-json-file/node_modules/pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", + "dev": true, + "engines": { + "node": ">=4" } }, - "locate-path": { + "node_modules/locate-path": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", "dev": true, - "requires": { + "dependencies": { "p-locate": "^3.0.0", "path-exists": "^3.0.0" + }, + "engines": { + "node": ">=6" } }, - "lodash": { + "node_modules/lodash": { "version": "4.17.20", "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.20.tgz", "integrity": "sha512-PlhdFcillOINfeV7Ni6oF1TAEayyZBoZ8bcshTHqOYJYlrqzRK5hagpagky5o4HfCzzd1TRkXPMFq6cKk9rGmA==", "dev": true }, - "lodash.flattendeep": { + "node_modules/lodash.camelcase": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz", + "integrity": "sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==", + "dev": true, + "peer": true + }, + "node_modules/lodash.flattendeep": { "version": "4.4.0", "resolved": "https://registry.npmjs.org/lodash.flattendeep/-/lodash.flattendeep-4.4.0.tgz", "integrity": "sha1-+wMJF/hqMTTlvJvsDWngAT3f7bI=", "dev": true }, - "lru-cache": { + "node_modules/lru-cache": { "version": "4.1.5", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz", "integrity": "sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==", "dev": true, - "requires": { + "dependencies": { "pseudomap": "^1.0.2", "yallist": "^2.1.2" } }, - "make-dir": { + "node_modules/make-dir": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz", "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==", "dev": true, - "requires": { + "dependencies": { "pify": "^4.0.1", "semver": "^5.6.0" + }, + "engines": { + "node": ">=6" } }, - "make-error": { + "node_modules/make-error": { "version": "1.3.5", "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.5.tgz", "integrity": "sha512-c3sIjNUow0+8swNwVpqoH4YCShKNFkMaw6oH1mNS2haDZQqkeZFlHS3dhoeEbKKmJB4vXpJucU6oH75aDYeE9g==", "dev": true }, - "merge-source-map": { + "node_modules/merge-source-map": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/merge-source-map/-/merge-source-map-1.1.0.tgz", "integrity": "sha512-Qkcp7P2ygktpMPh2mCQZaf3jhN6D3Z/qVZHSdWvQ+2Ef5HgRAPBO57A77+ENm0CPx2+1Ce/MYKi3ymqdfuqibw==", "dev": true, - "requires": { - "source-map": "^0.6.1" - }, "dependencies": { - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - } + "source-map": "^0.6.1" + } + }, + "node_modules/merge-source-map/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "engines": { + "node": ">=0.10.0" } }, - "minimalistic-assert": { + "node_modules/minimalistic-assert": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==" }, - "minimalistic-crypto-utils": { + "node_modules/minimalistic-crypto-utils": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz", "integrity": "sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo=" }, - "minimatch": { + "node_modules/minimatch": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", "dev": true, - "requires": { + "dependencies": { "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" } }, - "minimist": { + "node_modules/minimist": { "version": "1.2.5", "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==", "dev": true }, - "mkdirp": { + "node_modules/mkdirp": { "version": "0.5.5", "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", "dev": true, - "requires": { + "dependencies": { "minimist": "^1.2.5" + }, + "bin": { + "mkdirp": "bin/cmd.js" } }, - "mocha": { + "node_modules/mocha": { "version": "5.2.0", "resolved": "https://registry.npmjs.org/mocha/-/mocha-5.2.0.tgz", "integrity": "sha512-2IUgKDhc3J7Uug+FxMXuqIyYzH7gJjXECKe/w43IGgQHTSj3InJi+yAA7T24L9bQMRKiUEHxEX37G5JpVUGLcQ==", "dev": true, - "requires": { + "dependencies": { "browser-stdout": "1.3.1", "commander": "2.15.1", "debug": "3.1.0", @@ -993,54 +2147,82 @@ "mkdirp": "0.5.1", "supports-color": "5.4.0" }, + "bin": { + "_mocha": "bin/_mocha", + "mocha": "bin/mocha" + }, + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/mocha/node_modules/minimist": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", + "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", + "dev": true + }, + "node_modules/mocha/node_modules/mkdirp": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", + "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", + "deprecated": "Legacy versions of mkdirp are no longer supported. Please update to mkdirp 1.x. (Note that the API surface has changed to use Promises in 1.x.)", + "dev": true, "dependencies": { - "minimist": { - "version": "0.0.8", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", - "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", - "dev": true - }, - "mkdirp": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", - "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", - "dev": true, - "requires": { - "minimist": "0.0.8" - } - } + "minimist": "0.0.8" + }, + "bin": { + "mkdirp": "bin/cmd.js" } }, - "ms": { + "node_modules/ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", "dev": true }, - "nested-error-stacks": { + "node_modules/nested-error-stacks": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/nested-error-stacks/-/nested-error-stacks-2.1.0.tgz", "integrity": "sha512-AO81vsIO1k1sM4Zrd6Hu7regmJN1NSiAja10gc4bX3F0wd+9rQmcuHQaHVQCYIEC8iFXnE+mavh23GOt7wBgug==", "dev": true }, - "normalize-package-data": { + "node_modules/node-fetch": { + "version": "2.6.12", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.12.tgz", + "integrity": "sha512-C/fGU2E8ToujUivIO0H+tpQ6HWo4eEmchoPIoXtxCrVghxdKq+QOHqEZW7tuP3KlV3bC8FRMO5nMCC7Zm1VP6g==", + "dependencies": { + "whatwg-url": "^5.0.0" + }, + "engines": { + "node": "4.x || >=6.0.0" + }, + "peerDependencies": { + "encoding": "^0.1.0" + }, + "peerDependenciesMeta": { + "encoding": { + "optional": true + } + } + }, + "node_modules/normalize-package-data": { "version": "2.5.0", "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", "dev": true, - "requires": { + "dependencies": { "hosted-git-info": "^2.1.4", "resolve": "^1.10.0", "semver": "2 || 3 || 4 || 5", "validate-npm-package-license": "^3.0.1" } }, - "nyc": { + "node_modules/nyc": { "version": "14.1.1", "resolved": "https://registry.npmjs.org/nyc/-/nyc-14.1.1.tgz", "integrity": "sha512-OI0vm6ZGUnoGZv/tLdZ2esSVzDwUC88SNs+6JoSOMVxA+gKMB8Tk7jBwgemLx4O40lhhvZCVw1C+OYLOBOPXWw==", "dev": true, - "requires": { + "dependencies": { "archy": "^1.0.0", "caching-transform": "^3.0.2", "convert-source-map": "^1.6.0", @@ -1067,306 +2249,409 @@ "yargs": "^13.2.2", "yargs-parser": "^13.0.0" }, + "bin": { + "nyc": "bin/nyc.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/nyc/node_modules/glob": { + "version": "7.1.4", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.4.tgz", + "integrity": "sha512-hkLPepehmnKk41pUGm3sYxoFs/umurYfYJCerbXEyFIWcAzvpipAgVkBqqT9RBKMGjnq6kMuyYwha6csxbiM1A==", + "dev": true, "dependencies": { - "glob": { - "version": "7.1.4", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.4.tgz", - "integrity": "sha512-hkLPepehmnKk41pUGm3sYxoFs/umurYfYJCerbXEyFIWcAzvpipAgVkBqqT9RBKMGjnq6kMuyYwha6csxbiM1A==", - "dev": true, - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - }, - "uuid": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.3.3.tgz", - "integrity": "sha512-pW0No1RGHgzlpHJO1nsVrHKpOEIxkGg1xB+v0ZmdNH5OAeAwzAVrCnI2/6Mtx+Uys6iaylxa+D3g4j63IKKjSQ==", - "dev": true - } + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + } + }, + "node_modules/nyc/node_modules/uuid": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.3.3.tgz", + "integrity": "sha512-pW0No1RGHgzlpHJO1nsVrHKpOEIxkGg1xB+v0ZmdNH5OAeAwzAVrCnI2/6Mtx+Uys6iaylxa+D3g4j63IKKjSQ==", + "deprecated": "Please upgrade to version 7 or higher. Older versions may use Math.random() in certain circumstances, which is known to be problematic. See https://v8.dev/blog/math-random for details.", + "dev": true, + "bin": { + "uuid": "bin/uuid" } }, - "once": { + "node_modules/once": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", "dev": true, - "requires": { + "dependencies": { "wrappy": "1" } }, - "os-homedir": { + "node_modules/os-homedir": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=", - "dev": true + "dev": true, + "engines": { + "node": ">=0.10.0" + } }, - "p-limit": { + "node_modules/p-limit": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.2.1.tgz", "integrity": "sha512-85Tk+90UCVWvbDavCLKPOLC9vvY8OwEX/RtKF+/1OADJMVlFfEHOiMTPVyxg7mk/dKa+ipdHm0OUkTvCpMTuwg==", "dev": true, - "requires": { + "dependencies": { "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" } }, - "p-locate": { + "node_modules/p-locate": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", "dev": true, - "requires": { + "dependencies": { "p-limit": "^2.0.0" + }, + "engines": { + "node": ">=6" } }, - "p-try": { + "node_modules/p-try": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", - "dev": true + "dev": true, + "engines": { + "node": ">=6" + } }, - "package-hash": { + "node_modules/package-hash": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/package-hash/-/package-hash-3.0.0.tgz", "integrity": "sha512-lOtmukMDVvtkL84rJHI7dpTYq+0rli8N2wlnqUcBuDWCfVhRUfOmnR9SsoHFMLpACvEV60dX7rd0rFaYDZI+FA==", "dev": true, - "requires": { + "dependencies": { "graceful-fs": "^4.1.15", "hasha": "^3.0.0", "lodash.flattendeep": "^4.4.0", "release-zalgo": "^1.0.0" + }, + "engines": { + "node": ">=6" } }, - "parse-json": { + "node_modules/parse-json": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=", "dev": true, - "requires": { + "dependencies": { "error-ex": "^1.3.1", "json-parse-better-errors": "^1.0.1" + }, + "engines": { + "node": ">=4" } }, - "path-exists": { + "node_modules/path-exists": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", - "dev": true + "dev": true, + "engines": { + "node": ">=4" + } }, - "path-is-absolute": { + "node_modules/path-is-absolute": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", - "dev": true + "dev": true, + "engines": { + "node": ">=0.10.0" + } }, - "path-parse": { + "node_modules/path-parse": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz", "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==", "dev": true }, - "path-type": { + "node_modules/path-type": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz", "integrity": "sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==", "dev": true, - "requires": { + "dependencies": { "pify": "^3.0.0" }, - "dependencies": { - "pify": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", - "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", - "dev": true - } + "engines": { + "node": ">=4" } }, - "pathval": { + "node_modules/path-type/node_modules/pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/pathval": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/pathval/-/pathval-1.1.0.tgz", "integrity": "sha1-uULm1L3mUwBe9rcTYd74cn0GReA=", - "dev": true + "dev": true, + "engines": { + "node": "*" + } }, - "pify": { + "node_modules/pify": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", - "dev": true + "dev": true, + "engines": { + "node": ">=6" + } }, - "pkg-dir": { + "node_modules/pkg-dir": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-3.0.0.tgz", "integrity": "sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw==", "dev": true, - "requires": { + "dependencies": { "find-up": "^3.0.0" + }, + "engines": { + "node": ">=6" } }, - "pseudomap": { + "node_modules/prettier": { + "version": "2.8.8", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.8.8.tgz", + "integrity": "sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==", + "dev": true, + "peer": true, + "bin": { + "prettier": "bin-prettier.js" + }, + "engines": { + "node": ">=10.13.0" + }, + "funding": { + "url": "https://github.com/prettier/prettier?sponsor=1" + } + }, + "node_modules/pseudomap": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=", "dev": true }, - "read-pkg": { + "node_modules/read-pkg": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-3.0.0.tgz", "integrity": "sha1-nLxoaXj+5l0WwA4rGcI3/Pbjg4k=", "dev": true, - "requires": { + "dependencies": { "load-json-file": "^4.0.0", "normalize-package-data": "^2.3.2", "path-type": "^3.0.0" + }, + "engines": { + "node": ">=4" } }, - "read-pkg-up": { + "node_modules/read-pkg-up": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-4.0.0.tgz", "integrity": "sha512-6etQSH7nJGsK0RbG/2TeDzZFa8shjQ1um+SwQQ5cwKy0dhSXdOncEhb1CPpvQG4h7FyOV6EB6YlV0yJvZQNAkA==", "dev": true, - "requires": { + "dependencies": { "find-up": "^3.0.0", "read-pkg": "^3.0.0" + }, + "engines": { + "node": ">=6" } }, - "release-zalgo": { + "node_modules/reduce-flatten": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/reduce-flatten/-/reduce-flatten-2.0.0.tgz", + "integrity": "sha512-EJ4UNY/U1t2P/2k6oqotuX2Cc3T6nxJwsM0N0asT7dhrtH1ltUxDn4NalSYmPE2rCkVpcf/X6R0wDwcFpzhd4w==", + "dev": true, + "peer": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/release-zalgo": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/release-zalgo/-/release-zalgo-1.0.0.tgz", "integrity": "sha1-CXALflB0Mpc5Mw5TXFqQ+2eFFzA=", "dev": true, - "requires": { + "dependencies": { "es6-error": "^4.0.1" + }, + "engines": { + "node": ">=4" } }, - "require-directory": { + "node_modules/require-directory": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", - "dev": true + "dev": true, + "engines": { + "node": ">=0.10.0" + } }, - "require-main-filename": { + "node_modules/require-main-filename": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==", "dev": true }, - "resolve": { + "node_modules/resolve": { "version": "1.12.0", "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.12.0.tgz", "integrity": "sha512-B/dOmuoAik5bKcD6s6nXDCjzUKnaDvdkRyAk6rsmsKLipWj4797iothd7jmmUhWTfinVMU+wc56rYKsit2Qy4w==", "dev": true, - "requires": { + "dependencies": { "path-parse": "^1.0.6" } }, - "resolve-from": { + "node_modules/resolve-from": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", - "dev": true + "dev": true, + "engines": { + "node": ">=4" + } }, - "rimraf": { + "node_modules/rimraf": { "version": "2.7.1", "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", "dev": true, - "requires": { + "dependencies": { "glob": "^7.1.3" }, + "bin": { + "rimraf": "bin.js" + } + }, + "node_modules/rimraf/node_modules/glob": { + "version": "7.1.4", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.4.tgz", + "integrity": "sha512-hkLPepehmnKk41pUGm3sYxoFs/umurYfYJCerbXEyFIWcAzvpipAgVkBqqT9RBKMGjnq6kMuyYwha6csxbiM1A==", + "dev": true, "dependencies": { - "glob": { - "version": "7.1.4", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.4.tgz", - "integrity": "sha512-hkLPepehmnKk41pUGm3sYxoFs/umurYfYJCerbXEyFIWcAzvpipAgVkBqqT9RBKMGjnq6kMuyYwha6csxbiM1A==", - "dev": true, - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - } + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" } }, - "rlp": { + "node_modules/rlp": { "version": "2.2.3", "resolved": "https://registry.npmjs.org/rlp/-/rlp-2.2.3.tgz", "integrity": "sha512-l6YVrI7+d2vpW6D6rS05x2Xrmq8oW7v3pieZOJKBEdjuTF4Kz/iwk55Zyh1Zaz+KOB2kC8+2jZlp2u9L4tTzCQ==", - "requires": { + "dependencies": { "bn.js": "^4.11.1", "safe-buffer": "^5.1.1" + }, + "bin": { + "rlp": "bin/rlp" } }, - "safe-buffer": { + "node_modules/safe-buffer": { "version": "5.2.0", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.0.tgz", "integrity": "sha512-fZEwUGbVl7kouZs1jCdMLdt95hdIv0ZeHg6L7qPeciMZhZ+/gdesW4wgTARkrFWEpspjEATAzUGPG8N2jJiwbg==" }, - "scrypt-js": { + "node_modules/scrypt-js": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/scrypt-js/-/scrypt-js-2.0.4.tgz", "integrity": "sha512-4KsaGcPnuhtCZQCxFxN3GVYIhKFPTdLd8PLC552XwbMndtD0cjRFAhDuuydXQ0h08ZfPgzqe6EKHozpuH74iDw==" }, - "semver": { + "node_modules/semver": { "version": "5.7.1", "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "dev": true + "dev": true, + "bin": { + "semver": "bin/semver" + } }, - "set-blocking": { + "node_modules/set-blocking": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", "dev": true }, - "setimmediate": { + "node_modules/setimmediate": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.4.tgz", "integrity": "sha1-IOgd5iLUoCWIzgyNqJc8vPHTE48=" }, - "signal-exit": { + "node_modules/signal-exit": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=", "dev": true }, - "source-map": { + "node_modules/source-map": { "version": "0.5.7", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "dev": true + "dev": true, + "engines": { + "node": ">=0.10.0" + } }, - "source-map-support": { + "node_modules/source-map-support": { "version": "0.5.13", "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.13.tgz", "integrity": "sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w==", "dev": true, - "requires": { + "dependencies": { "buffer-from": "^1.0.0", "source-map": "^0.6.0" - }, - "dependencies": { - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - } } }, - "spawn-wrap": { + "node_modules/source-map-support/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/spawn-wrap": { "version": "1.4.3", "resolved": "https://registry.npmjs.org/spawn-wrap/-/spawn-wrap-1.4.3.tgz", "integrity": "sha512-IgB8md0QW/+tWqcavuFgKYR/qIRvJkRLPJDFaoXtLLUaVcCDK0+HeFTkmQHj3eprcYhc+gOl0aEA1w7qZlYezw==", "dev": true, - "requires": { + "dependencies": { "foreground-child": "^1.5.6", "mkdirp": "^0.5.0", "os-homedir": "^1.0.1", @@ -1375,152 +2660,333 @@ "which": "^1.3.0" } }, - "spdx-correct": { + "node_modules/spdx-correct": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.0.tgz", "integrity": "sha512-lr2EZCctC2BNR7j7WzJ2FpDznxky1sjfxvvYEyzxNyb6lZXHODmEoJeFu4JupYlkfha1KZpJyoqiJ7pgA1qq8Q==", "dev": true, - "requires": { + "dependencies": { "spdx-expression-parse": "^3.0.0", "spdx-license-ids": "^3.0.0" } }, - "spdx-exceptions": { + "node_modules/spdx-exceptions": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.2.0.tgz", "integrity": "sha512-2XQACfElKi9SlVb1CYadKDXvoajPgBVPn/gOQLrTvHdElaVhr7ZEbqJaRnJLVNeaI4cMEAgVCeBMKF6MWRDCRA==", "dev": true }, - "spdx-expression-parse": { + "node_modules/spdx-expression-parse": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.0.tgz", "integrity": "sha512-Yg6D3XpRD4kkOmTpdgbUiEJFKghJH03fiC1OPll5h/0sO6neh2jqRDVHOQ4o/LMea0tgCkbMgea5ip/e+MkWyg==", "dev": true, - "requires": { + "dependencies": { "spdx-exceptions": "^2.1.0", "spdx-license-ids": "^3.0.0" } }, - "spdx-license-ids": { + "node_modules/spdx-license-ids": { "version": "3.0.5", "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.5.tgz", "integrity": "sha512-J+FWzZoynJEXGphVIS+XEh3kFSjZX/1i9gFBaWQcB+/tmpe2qUsSBABpcxqxnAxFdiUFEgAX1bjYGQvIZmoz9Q==", "dev": true }, - "sprintf-js": { + "node_modules/sprintf-js": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", "dev": true }, - "string-width": { + "node_modules/string-format": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/string-format/-/string-format-2.0.0.tgz", + "integrity": "sha512-bbEs3scLeYNXLecRRuk6uJxdXUSj6le/8rNPHChIJTn2V79aXVTR1EH2OH5zLKKoz0V02fOUKZZcw01pLUShZA==", + "dev": true, + "peer": true + }, + "node_modules/string-width": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", "dev": true, - "requires": { + "dependencies": { "emoji-regex": "^7.0.1", "is-fullwidth-code-point": "^2.0.0", "strip-ansi": "^5.1.0" + }, + "engines": { + "node": ">=6" } }, - "strip-ansi": { + "node_modules/strip-ansi": { "version": "5.2.0", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", "dev": true, - "requires": { + "dependencies": { "ansi-regex": "^4.1.0" + }, + "engines": { + "node": ">=6" } }, - "strip-bom": { + "node_modules/strip-bom": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", - "dev": true + "dev": true, + "engines": { + "node": ">=4" + } }, - "supports-color": { + "node_modules/supports-color": { "version": "5.4.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.4.0.tgz", "integrity": "sha512-zjaXglF5nnWpsq470jSv6P9DwPvgLkuapYmfDm3JWOm0vkNTVF2tI4UrN2r6jH1qM/uc/WtxYY1hYoA2dOKj5w==", "dev": true, - "requires": { + "dependencies": { "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" } }, - "test-exclude": { + "node_modules/table-layout": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/table-layout/-/table-layout-1.0.2.tgz", + "integrity": "sha512-qd/R7n5rQTRFi+Zf2sk5XVVd9UQl6ZkduPFC3S7WEGJAmetDTjY3qPN50eSKzwuzEyQKy5TN2TiZdkIjos2L6A==", + "dev": true, + "peer": true, + "dependencies": { + "array-back": "^4.0.1", + "deep-extend": "~0.6.0", + "typical": "^5.2.0", + "wordwrapjs": "^4.0.0" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/table-layout/node_modules/array-back": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/array-back/-/array-back-4.0.2.tgz", + "integrity": "sha512-NbdMezxqf94cnNfWLL7V/im0Ub+Anbb0IoZhvzie8+4HJ4nMQuzHuy49FkGYCJK2yAloZ3meiB6AVMClbrI1vg==", + "dev": true, + "peer": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/table-layout/node_modules/typical": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/typical/-/typical-5.2.0.tgz", + "integrity": "sha512-dvdQgNDNJo+8B2uBQoqdb11eUCE1JQXhvjC/CZtgvZseVd5TYMXnq0+vuUemXbd/Se29cTaUuPX3YIc2xgbvIg==", + "dev": true, + "peer": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/test-exclude": { "version": "5.2.3", "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-5.2.3.tgz", "integrity": "sha512-M+oxtseCFO3EDtAaGH7iiej3CBkzXqFMbzqYAACdzKui4eZA+pq3tZEwChvOdNfa7xxy8BfbmgJSIr43cC/+2g==", "dev": true, - "requires": { + "dependencies": { "glob": "^7.1.3", "minimatch": "^3.0.4", "read-pkg-up": "^4.0.0", "require-main-filename": "^2.0.0" }, + "engines": { + "node": ">=6" + } + }, + "node_modules/test-exclude/node_modules/glob": { + "version": "7.1.4", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.4.tgz", + "integrity": "sha512-hkLPepehmnKk41pUGm3sYxoFs/umurYfYJCerbXEyFIWcAzvpipAgVkBqqT9RBKMGjnq6kMuyYwha6csxbiM1A==", + "dev": true, "dependencies": { - "glob": { - "version": "7.1.4", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.4.tgz", - "integrity": "sha512-hkLPepehmnKk41pUGm3sYxoFs/umurYfYJCerbXEyFIWcAzvpipAgVkBqqT9RBKMGjnq6kMuyYwha6csxbiM1A==", - "dev": true, - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - } + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" } }, - "to-fast-properties": { + "node_modules/to-fast-properties": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=", - "dev": true + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/tr46": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", + "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==" }, - "trim-right": { + "node_modules/trim-right": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/trim-right/-/trim-right-1.0.1.tgz", "integrity": "sha1-yy4SAwZ+DI3h9hQJS5/kVwTqYAM=", - "dev": true + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/ts-command-line-args": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/ts-command-line-args/-/ts-command-line-args-2.5.1.tgz", + "integrity": "sha512-H69ZwTw3rFHb5WYpQya40YAX2/w7Ut75uUECbgBIsLmM+BNuYnxsltfyyLMxy6sEeKxgijLTnQtLd0nKd6+IYw==", + "dev": true, + "peer": true, + "dependencies": { + "chalk": "^4.1.0", + "command-line-args": "^5.1.1", + "command-line-usage": "^6.1.0", + "string-format": "^2.0.0" + }, + "bin": { + "write-markdown": "dist/write-markdown.js" + } + }, + "node_modules/ts-command-line-args/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "peer": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/ts-command-line-args/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "peer": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/ts-command-line-args/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "peer": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/ts-command-line-args/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true, + "peer": true + }, + "node_modules/ts-command-line-args/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "peer": true, + "engines": { + "node": ">=8" + } }, - "ts-node": { + "node_modules/ts-command-line-args/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "peer": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/ts-essentials": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/ts-essentials/-/ts-essentials-7.0.3.tgz", + "integrity": "sha512-8+gr5+lqO3G84KdiTSMRLtuyJ+nTBVRKuCrK4lidMPdVeEp0uqC875uE5NMcaA7YYMN7XsNiFQuMvasF8HT/xQ==", + "dev": true, + "peerDependencies": { + "typescript": ">=3.7.0" + } + }, + "node_modules/ts-node": { "version": "8.3.0", "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-8.3.0.tgz", "integrity": "sha512-dyNS/RqyVTDcmNM4NIBAeDMpsAdaQ+ojdf0GOLqE6nwJOgzEkdRNzJywhDfwnuvB10oa6NLVG1rUJQCpRN7qoQ==", "dev": true, - "requires": { + "dependencies": { "arg": "^4.1.0", "diff": "^4.0.1", "make-error": "^1.1.1", "source-map-support": "^0.5.6", "yn": "^3.0.0" }, - "dependencies": { - "diff": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.1.tgz", - "integrity": "sha512-s2+XdvhPCOF01LRQBC8hf4vhbVmI2CGS5aZnxLJlT5FtdhPCDFq80q++zK2KlrVorVDdL5BOGZ/VfLrVtYNF+Q==", - "dev": true - } + "bin": { + "ts-node": "dist/bin.js" + }, + "engines": { + "node": ">=4.2.0" + }, + "peerDependencies": { + "typescript": ">=2.0" + } + }, + "node_modules/ts-node/node_modules/diff": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.1.tgz", + "integrity": "sha512-s2+XdvhPCOF01LRQBC8hf4vhbVmI2CGS5aZnxLJlT5FtdhPCDFq80q++zK2KlrVorVDdL5BOGZ/VfLrVtYNF+Q==", + "dev": true, + "engines": { + "node": ">=0.3.1" } }, - "tslib": { + "node_modules/tslib": { "version": "1.10.0", "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.10.0.tgz", "integrity": "sha512-qOebF53frne81cf0S9B41ByenJ3/IuH8yJKngAX35CmiZySA0khhkovshKK+jGCaMnVomla7gVlIcc3EvKPbTQ==", "dev": true }, - "tslint": { + "node_modules/tslint": { "version": "5.20.0", "resolved": "https://registry.npmjs.org/tslint/-/tslint-5.20.0.tgz", "integrity": "sha512-2vqIvkMHbnx8acMogAERQ/IuINOq6DFqgF8/VDvhEkBqQh/x6SP0Y+OHnKth9/ZcHQSroOZwUQSN18v8KKF0/g==", "dev": true, - "requires": { + "dependencies": { "@babel/code-frame": "^7.0.0", "builtin-modules": "^1.1.1", "chalk": "^2.3.0", @@ -1535,117 +3001,685 @@ "tslib": "^1.8.0", "tsutils": "^2.29.0" }, - "dependencies": { - "diff": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.1.tgz", - "integrity": "sha512-s2+XdvhPCOF01LRQBC8hf4vhbVmI2CGS5aZnxLJlT5FtdhPCDFq80q++zK2KlrVorVDdL5BOGZ/VfLrVtYNF+Q==", - "dev": true - } + "bin": { + "tslint": "bin/tslint" + }, + "engines": { + "node": ">=4.8.0" + }, + "peerDependencies": { + "typescript": ">=2.3.0-dev || >=2.4.0-dev || >=2.5.0-dev || >=2.6.0-dev || >=2.7.0-dev || >=2.8.0-dev || >=2.9.0-dev || >=3.0.0-dev || >= 3.1.0-dev || >= 3.2.0-dev" } }, - "tsutils": { + "node_modules/tslint/node_modules/diff": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.1.tgz", + "integrity": "sha512-s2+XdvhPCOF01LRQBC8hf4vhbVmI2CGS5aZnxLJlT5FtdhPCDFq80q++zK2KlrVorVDdL5BOGZ/VfLrVtYNF+Q==", + "dev": true, + "engines": { + "node": ">=0.3.1" + } + }, + "node_modules/tsutils": { "version": "2.29.0", "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-2.29.0.tgz", "integrity": "sha512-g5JVHCIJwzfISaXpXE1qvNalca5Jwob6FjI4AoPlqMusJ6ftFE7IkkFoMhVLRgK+4Kx3gkzb8UZK5t5yTTvEmA==", "dev": true, - "requires": { + "dependencies": { "tslib": "^1.8.1" + }, + "peerDependencies": { + "typescript": ">=2.1.0 || >=2.1.0-dev || >=2.2.0-dev || >=2.3.0-dev || >=2.4.0-dev || >=2.5.0-dev || >=2.6.0-dev || >=2.7.0-dev || >=2.8.0-dev || >=2.9.0-dev || >= 3.0.0-dev || >= 3.1.0-dev" } }, - "type-detect": { + "node_modules/type-detect": { "version": "4.0.8", "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", - "dev": true + "dev": true, + "engines": { + "node": ">=4" + } }, - "typescript": { - "version": "3.9.7", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.9.7.tgz", - "integrity": "sha512-BLbiRkiBzAwsjut4x/dsibSTB6yWpwT5qWmC2OfuCg3GgVQCSgMs4vEctYPhsaGtd0AeuuHMkjZ2h2WG8MSzRw==", - "dev": true + "node_modules/typechain": { + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/typechain/-/typechain-8.2.0.tgz", + "integrity": "sha512-tZqhqjxJ9xAS/Lh32jccTjMkpx7sTdUVVHAy5Bf0TIer5QFNYXotiX74oCvoVYjyxUKDK3MXHtMFzMyD3kE+jg==", + "dev": true, + "peer": true, + "dependencies": { + "@types/prettier": "^2.1.1", + "debug": "^4.3.1", + "fs-extra": "^7.0.0", + "glob": "7.1.7", + "js-sha3": "^0.8.0", + "lodash": "^4.17.15", + "mkdirp": "^1.0.4", + "prettier": "^2.3.1", + "ts-command-line-args": "^2.2.0", + "ts-essentials": "^7.0.1" + }, + "bin": { + "typechain": "dist/cli/cli.js" + }, + "peerDependencies": { + "typescript": ">=4.3.0" + } + }, + "node_modules/typechain/node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dev": true, + "peer": true, + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } }, - "uuid": { + "node_modules/typechain/node_modules/glob": { + "version": "7.1.7", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.7.tgz", + "integrity": "sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ==", + "dev": true, + "peer": true, + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/typechain/node_modules/js-sha3": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/js-sha3/-/js-sha3-0.8.0.tgz", + "integrity": "sha512-gF1cRrHhIzNfToc802P800N8PpXS+evLLXfsVpowqmAFR9uwbi89WvXg2QspOmXL8QL86J4T1EpFu+yUkwJY3Q==", + "dev": true, + "peer": true + }, + "node_modules/typechain/node_modules/mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", + "dev": true, + "peer": true, + "bin": { + "mkdirp": "bin/cmd.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/typechain/node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true, + "peer": true + }, + "node_modules/typescript": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.1.6.tgz", + "integrity": "sha512-zaWCozRZ6DLEWAWFrVDz1H6FVXzUSfTy5FUMWsQlU8Ym5JP9eO4xkTIROFCQvhQf61z6O/G6ugw3SgAnvvm+HA==", + "dev": true, + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/typical": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/typical/-/typical-4.0.0.tgz", + "integrity": "sha512-VAH4IvQ7BDFYglMd7BPRDfLgxZZX4O4TFcRDA6EN5X7erNJJq+McIEp8np9aVtxrCJ6qx4GTYVfOWNjcqwZgRw==", + "dev": true, + "peer": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/universalify": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", + "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", + "dev": true, + "peer": true, + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/util": { + "version": "0.12.5", + "resolved": "https://registry.npmjs.org/util/-/util-0.12.5.tgz", + "integrity": "sha512-kZf/K6hEIrWHI6XqOFUiiMa+79wE/D8Q+NCNAWclkyg3b4d2k7s0QGepNjiABc+aR3N1PAyHL7p6UcLY6LmrnA==", + "dependencies": { + "inherits": "^2.0.3", + "is-arguments": "^1.0.4", + "is-generator-function": "^1.0.7", + "is-typed-array": "^1.1.3", + "which-typed-array": "^1.1.2" + } + }, + "node_modules/uuid": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/uuid/-/uuid-2.0.1.tgz", - "integrity": "sha1-wqMN7bPlNdcsz4LjQ5QaULqFM6w=" + "integrity": "sha1-wqMN7bPlNdcsz4LjQ5QaULqFM6w=", + "deprecated": "Please upgrade to version 7 or higher. Older versions may use Math.random() in certain circumstances, which is known to be problematic. See https://v8.dev/blog/math-random for details." }, - "validate-npm-package-license": { + "node_modules/validate-npm-package-license": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", "dev": true, - "requires": { + "dependencies": { "spdx-correct": "^3.0.0", "spdx-expression-parse": "^3.0.0" } }, - "which": { + "node_modules/web3": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/web3/-/web3-4.0.3.tgz", + "integrity": "sha512-rUMxui5f52yPWjiMRQV6xqIrTQSovYM2CNhl57y+xj/fGXNLbI1D5FsLPnUMZjMaFHJBTteaBxq/sTEaw/1jNA==", + "dependencies": { + "web3-core": "^4.0.3", + "web3-errors": "^1.0.2", + "web3-eth": "^4.0.3", + "web3-eth-abi": "^4.0.3", + "web3-eth-accounts": "^4.0.3", + "web3-eth-contract": "^4.0.3", + "web3-eth-ens": "^4.0.3", + "web3-eth-iban": "^4.0.3", + "web3-eth-personal": "^4.0.3", + "web3-net": "^4.0.3", + "web3-providers-http": "^4.0.3", + "web3-providers-ws": "^4.0.3", + "web3-rpc-methods": "^1.0.2", + "web3-types": "^1.0.2", + "web3-utils": "^4.0.3", + "web3-validator": "^1.0.2" + }, + "engines": { + "node": ">=14.0.0", + "npm": ">=6.12.0" + } + }, + "node_modules/web3-core": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/web3-core/-/web3-core-4.0.3.tgz", + "integrity": "sha512-KJaH1+ajm/gelvhImkXZx8HrBaGZDERqhOCRpikuwReVDTf4X3TlXqF+oKt153qf5HUXWR4CUL6NkNKNQWjhbA==", + "dependencies": { + "web3-errors": "^1.0.2", + "web3-eth-iban": "^4.0.3", + "web3-providers-http": "^4.0.3", + "web3-providers-ws": "^4.0.3", + "web3-types": "^1.0.2", + "web3-utils": "^4.0.3", + "web3-validator": "^1.0.2" + }, + "engines": { + "node": ">=14", + "npm": ">=6.12.0" + }, + "optionalDependencies": { + "web3-providers-ipc": "^4.0.3" + } + }, + "node_modules/web3-errors": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/web3-errors/-/web3-errors-1.0.2.tgz", + "integrity": "sha512-LtRUASAQKeCKyxHRhfyU5xiE9asUmo7KJ9bEzzaPlkVYLl5lzhUXzd6lvnQfSaSXJnlzoUXvhI5I0Hpzc8Lohg==", + "dependencies": { + "web3-types": "^1.0.2" + }, + "engines": { + "node": ">=14", + "npm": ">=6.12.0" + } + }, + "node_modules/web3-eth": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/web3-eth/-/web3-eth-4.0.3.tgz", + "integrity": "sha512-4t1+lpqzk3ljubr0CKE9Ila82p2Pim6Bn7ZIruVfMt9AOA5wL6M0OeMTy0fWBODLJiZJ7R77Ugm0kvEVWD3lqg==", + "dependencies": { + "setimmediate": "^1.0.5", + "web3-core": "^4.0.3", + "web3-errors": "^1.0.2", + "web3-eth-abi": "^4.0.3", + "web3-eth-accounts": "^4.0.3", + "web3-net": "^4.0.3", + "web3-providers-ws": "^4.0.3", + "web3-rpc-methods": "^1.0.2", + "web3-types": "^1.0.2", + "web3-utils": "^4.0.3", + "web3-validator": "^1.0.2" + }, + "engines": { + "node": ">=14", + "npm": ">=6.12.0" + } + }, + "node_modules/web3-eth-abi": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/web3-eth-abi/-/web3-eth-abi-4.0.3.tgz", + "integrity": "sha512-is1sKkTna5LQri25iRbxJ43kQ6qlFR/Syi6dnpwsFua0qAyKuDTxLZDoMaBfdH8NvxvjuGWFUWALwuSk8gk5Xg==", + "dependencies": { + "@ethersproject/abi": "^5.7.0", + "@ethersproject/bignumber": "^5.7.0", + "web3-errors": "^1.0.2", + "web3-types": "^1.0.2", + "web3-utils": "^4.0.3" + }, + "engines": { + "node": ">=14", + "npm": ">=6.12.0" + } + }, + "node_modules/web3-eth-accounts": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/web3-eth-accounts/-/web3-eth-accounts-4.0.3.tgz", + "integrity": "sha512-qS4r25weJYlKzHPIneL3g33LG+I6QkRCs25ZtooK6elurlZY4HyRE04BIWv12xZswtsvdmMt4HysMUNKgLrgPg==", + "dependencies": { + "@ethereumjs/rlp": "^4.0.1", + "crc-32": "^1.2.2", + "ethereum-cryptography": "^2.0.0", + "web3-errors": "^1.0.2", + "web3-types": "^1.0.2", + "web3-utils": "^4.0.3", + "web3-validator": "^1.0.2" + }, + "engines": { + "node": ">=14", + "npm": ">=6.12.0" + } + }, + "node_modules/web3-eth-contract": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/web3-eth-contract/-/web3-eth-contract-4.0.3.tgz", + "integrity": "sha512-x8YsIVVUeONwLCnUmswk5KD3luYxaKuN/xnSzxpb8fE4/KBA6eJswYcIGPrK9QILrVR26yDV/QQpgLU1IJS14g==", + "dependencies": { + "web3-core": "^4.0.3", + "web3-errors": "^1.0.2", + "web3-eth": "^4.0.3", + "web3-eth-abi": "^4.0.3", + "web3-types": "^1.0.2", + "web3-utils": "^4.0.3", + "web3-validator": "^1.0.2" + }, + "engines": { + "node": ">=14", + "npm": ">=6.12.0" + } + }, + "node_modules/web3-eth-ens": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/web3-eth-ens/-/web3-eth-ens-4.0.3.tgz", + "integrity": "sha512-1tk1WWJB6lsViRFxHR9kt8qgfMV0cySeNBa8H/bZ9/HZ1G8L/c2cboVrG4D0QsPO1im1jQl4Cf3ceKH0PW1KZg==", + "dependencies": { + "@adraffy/ens-normalize": "^1.8.8", + "web3-core": "^4.0.3", + "web3-errors": "^1.0.2", + "web3-eth": "^4.0.3", + "web3-eth-contract": "^4.0.3", + "web3-net": "^4.0.3", + "web3-types": "^1.0.2", + "web3-utils": "^4.0.3", + "web3-validator": "^1.0.2" + }, + "engines": { + "node": ">=14", + "npm": ">=6.12.0" + } + }, + "node_modules/web3-eth-iban": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/web3-eth-iban/-/web3-eth-iban-4.0.3.tgz", + "integrity": "sha512-9gn6fb034fh3DvQeutuhaG3J9+ZSriPC/O/H7K+lgUWJZh/lpaZy5A06nhHzNcleCWC07Q6J7d7VZlNjaBPtOA==", + "dependencies": { + "web3-errors": "^1.0.2", + "web3-types": "^1.0.2", + "web3-utils": "^4.0.3", + "web3-validator": "^1.0.2" + }, + "engines": { + "node": ">=14", + "npm": ">=6.12.0" + } + }, + "node_modules/web3-eth-personal": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/web3-eth-personal/-/web3-eth-personal-4.0.3.tgz", + "integrity": "sha512-Gugz45w/D4wlUNbUth8iHWkv0c5fFZGWZqFvpACJul0z9h0Ou8HzuJMUv3U0xFOQJF5fniVegfp6l0FJQ3hGrQ==", + "dependencies": { + "web3-core": "^4.0.3", + "web3-eth": "^4.0.3", + "web3-rpc-methods": "^1.0.2", + "web3-types": "^1.0.2", + "web3-utils": "^4.0.3", + "web3-validator": "^1.0.2" + }, + "engines": { + "node": ">=14", + "npm": ">=6.12.0" + } + }, + "node_modules/web3-eth/node_modules/setimmediate": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", + "integrity": "sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==" + }, + "node_modules/web3-net": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/web3-net/-/web3-net-4.0.3.tgz", + "integrity": "sha512-qe+stvVgYhO8AiPgDykZW5gS4mZ3GRWdQ8xn3eTvderresIMvdZYSAoUla2jWl1CgpcqzaoOSO9Pf8t43fr8SA==", + "dependencies": { + "web3-core": "^4.0.3", + "web3-rpc-methods": "^1.0.2", + "web3-types": "^1.0.2", + "web3-utils": "^4.0.3" + }, + "engines": { + "node": ">=14", + "npm": ">=6.12.0" + } + }, + "node_modules/web3-providers-http": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/web3-providers-http/-/web3-providers-http-4.0.3.tgz", + "integrity": "sha512-5E6nKjWrwlJdhGImOxyTnFDT6UcZu4waO6AJrENBRh2vdoCfP/Piiv3PLywHs71gwTMsAjy6CNPL5lZdGf+JQA==", + "dependencies": { + "cross-fetch": "^3.1.5", + "web3-errors": "^1.0.2", + "web3-types": "^1.0.2", + "web3-utils": "^4.0.3" + }, + "engines": { + "node": ">=14", + "npm": ">=6.12.0" + } + }, + "node_modules/web3-providers-ipc": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/web3-providers-ipc/-/web3-providers-ipc-4.0.3.tgz", + "integrity": "sha512-v+Ugp5XXUVcAQju/u4ThdjI3FM9lq674F6cJ7yz3R6uTel+wNPDiT47Se8hvm5grgHid7z3MbVYCQpDCiiAFHw==", + "optional": true, + "dependencies": { + "web3-errors": "^1.0.2", + "web3-types": "^1.0.2", + "web3-utils": "^4.0.3" + }, + "engines": { + "node": ">=14", + "npm": ">=6.12.0" + } + }, + "node_modules/web3-providers-ws": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/web3-providers-ws/-/web3-providers-ws-4.0.3.tgz", + "integrity": "sha512-V2bYiMvhv+xBYxFdf8V1zGTwhJoAkBQNMECVGNjQIz1qBKuqu6hXHasmkYSJV780LD6qoL58KlfTggjf4SUSaA==", + "dependencies": { + "@types/ws": "^8.5.3", + "isomorphic-ws": "^5.0.0", + "web3-errors": "^1.0.2", + "web3-types": "^1.0.2", + "web3-utils": "^4.0.3", + "ws": "^8.8.1" + }, + "engines": { + "node": ">=14", + "npm": ">=6.12.0" + } + }, + "node_modules/web3-providers-ws/node_modules/ws": { + "version": "8.13.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.13.0.tgz", + "integrity": "sha512-x9vcZYTrFPC7aSIbj7sRCYo7L/Xb8Iy+pW0ng0wt2vCJv7M9HOMy0UoN3rr+IFC7hb7vXoqS+P9ktyLLLhO+LA==", + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": ">=5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, + "node_modules/web3-rpc-methods": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/web3-rpc-methods/-/web3-rpc-methods-1.0.2.tgz", + "integrity": "sha512-VhLHvgR62JUNgo0op8hP4LcRkvdF0WaHD9xhcEKGLcri9VfYvR1yTZ3CVh6NTgRCmfDePObbp5blHfbla1cC5Q==", + "dependencies": { + "web3-core": "^4.0.3", + "web3-types": "^1.0.2", + "web3-validator": "^1.0.2" + }, + "engines": { + "node": ">=14", + "npm": ">=6.12.0" + } + }, + "node_modules/web3-types": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/web3-types/-/web3-types-1.0.2.tgz", + "integrity": "sha512-tLzA9vevGGWdHlxXvPRJjEIIR0UnZBI5Kq9qiENRS/vSekTHAHp7u+WGDxt+6kP105gKlbep50TogQIvJqLfnA==", + "engines": { + "node": ">=14", + "npm": ">=6.12.0" + } + }, + "node_modules/web3-utils": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/web3-utils/-/web3-utils-4.0.3.tgz", + "integrity": "sha512-clBvm/vWR2mAc9nPnsPYBZMikIhVG9RAsXdrxvXI4e2jAQ3DTtHKMhqy+Cl214dQaAdAEYyVb5ILW5lKKqk2vA==", + "dependencies": { + "ethereum-cryptography": "^2.0.0", + "web3-errors": "^1.0.2", + "web3-types": "^1.0.2", + "web3-validator": "^1.0.2" + }, + "engines": { + "node": ">=14", + "npm": ">=6.12.0" + } + }, + "node_modules/web3-validator": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/web3-validator/-/web3-validator-1.0.2.tgz", + "integrity": "sha512-orx1CQAEnwJUnl/8iF2II2zSA4wiooNJvFmVE0Dbmt/kE370SugIDViQP76snhxtouG2AXzz4GyKbPCMlLGh/A==", + "dependencies": { + "ethereum-cryptography": "^2.0.0", + "is-my-json-valid": "^2.20.6", + "util": "^0.12.5", + "web3-errors": "^1.0.2", + "web3-types": "^1.0.2" + }, + "engines": { + "node": ">=14", + "npm": ">=6.12.0" + } + }, + "node_modules/webidl-conversions": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", + "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==" + }, + "node_modules/whatwg-url": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", + "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", + "dependencies": { + "tr46": "~0.0.3", + "webidl-conversions": "^3.0.0" + } + }, + "node_modules/which": { "version": "1.3.1", "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", "dev": true, - "requires": { + "dependencies": { "isexe": "^2.0.0" + }, + "bin": { + "which": "bin/which" } }, - "which-module": { + "node_modules/which-module": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=", "dev": true }, - "wrap-ansi": { + "node_modules/which-typed-array": { + "version": "1.1.10", + "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.10.tgz", + "integrity": "sha512-uxoA5vLUfRPdjCuJ1h5LlYdmTLbYfums398v3WLkM+i/Wltl2/XyZpQWKbN++ck5L64SR/grOHqtXCUKmlZPNA==", + "dependencies": { + "available-typed-arrays": "^1.0.5", + "call-bind": "^1.0.2", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "has-tostringtag": "^1.0.0", + "is-typed-array": "^1.1.10" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/wordwrapjs": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/wordwrapjs/-/wordwrapjs-4.0.1.tgz", + "integrity": "sha512-kKlNACbvHrkpIw6oPeYDSmdCTu2hdMHoyXLTcUKala++lx5Y+wjJ/e474Jqv5abnVmwxw08DiTuHmw69lJGksA==", + "dev": true, + "peer": true, + "dependencies": { + "reduce-flatten": "^2.0.0", + "typical": "^5.2.0" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/wordwrapjs/node_modules/typical": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/typical/-/typical-5.2.0.tgz", + "integrity": "sha512-dvdQgNDNJo+8B2uBQoqdb11eUCE1JQXhvjC/CZtgvZseVd5TYMXnq0+vuUemXbd/Se29cTaUuPX3YIc2xgbvIg==", + "dev": true, + "peer": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/wrap-ansi": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz", "integrity": "sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==", "dev": true, - "requires": { + "dependencies": { "ansi-styles": "^3.2.0", "string-width": "^3.0.0", "strip-ansi": "^5.0.0" + }, + "engines": { + "node": ">=6" } }, - "wrappy": { + "node_modules/wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", "dev": true }, - "write-file-atomic": { + "node_modules/write-file-atomic": { "version": "2.4.3", "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-2.4.3.tgz", "integrity": "sha512-GaETH5wwsX+GcnzhPgKcKjJ6M2Cq3/iZp1WyY/X1CSqrW+jVNM9Y7D8EC2sM4ZG/V8wZlSniJnCKWPmBYAucRQ==", "dev": true, - "requires": { + "dependencies": { "graceful-fs": "^4.1.11", "imurmurhash": "^0.1.4", "signal-exit": "^3.0.2" } }, - "xmlhttprequest": { + "node_modules/ws": { + "version": "8.5.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.5.0.tgz", + "integrity": "sha512-BWX0SWVgLPzYwF8lTzEy1egjhS4S4OEAHfsO8o65WOVsrnSRGaSiUaa9e0ggGlkMTtBlmOpEXiie9RUcBO86qg==", + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": "^5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, + "node_modules/xmlhttprequest": { "version": "1.8.0", "resolved": "https://registry.npmjs.org/xmlhttprequest/-/xmlhttprequest-1.8.0.tgz", - "integrity": "sha1-Z/4HXFwk/vOfnWX197f+dRcZaPw=" + "integrity": "sha1-Z/4HXFwk/vOfnWX197f+dRcZaPw=", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/xtend": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", + "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", + "engines": { + "node": ">=0.4" + } }, - "y18n": { + "node_modules/y18n": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.0.tgz", "integrity": "sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w==", "dev": true }, - "yallist": { + "node_modules/yallist": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=", "dev": true }, - "yargs": { + "node_modules/yargs": { "version": "13.3.0", "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.3.0.tgz", "integrity": "sha512-2eehun/8ALW8TLoIl7MVaRUrg+yCnenu8B4kBlRxj3GJGDKU1Og7sMXPNm1BYyM1DOJmTZ4YeN/Nwxv+8XJsUA==", "dev": true, - "requires": { + "dependencies": { "cliui": "^5.0.0", "find-up": "^3.0.0", "get-caller-file": "^2.0.1", @@ -1658,21 +3692,24 @@ "yargs-parser": "^13.1.1" } }, - "yargs-parser": { + "node_modules/yargs-parser": { "version": "13.1.2", "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.2.tgz", "integrity": "sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg==", "dev": true, - "requires": { + "dependencies": { "camelcase": "^5.0.0", "decamelize": "^1.2.0" } }, - "yn": { + "node_modules/yn": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", - "dev": true + "dev": true, + "engines": { + "node": ">=6" + } } } } From 320bf8004301be4f295dd7959cd9094f8be1199d Mon Sep 17 00:00:00 2001 From: rodolfopietro97 Date: Tue, 18 Jul 2023 13:32:46 +0200 Subject: [PATCH 28/28] fix: Temp fix for node 14 issue --- .github/workflows/test.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 1523d44..3b52d60 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -23,7 +23,7 @@ jobs: cache: 'npm' - name: Install Dependencies - run: npm ci + run: npm install && npm ci - name: Build project run: npm run build