diff --git a/bootstrap/.env.example b/bootstrap/.env.example new file mode 100644 index 000000000..bea352295 --- /dev/null +++ b/bootstrap/.env.example @@ -0,0 +1,29 @@ +# Set prior to 1_deployer_funding.js +CHILD_CHAIN_NAME= +CHILD_RPC_URL= +CHILD_CHAIN_ID= +ROOT_CHAIN_NAME= +ROOT_RPC_URL= +ROOT_CHAIN_ID= +IMX_ROOT_ADDR= +WETH_ROOT_ADDR= +## Use private key string or "ledger" if using hardware wallet +ADMIN_EOA_SECRET= +AXELAR_EOA= +AXELAR_FUND= + +# Set prior to 2_deployment_validation.js +CHILD_GATEWAY_ADDRESS= +CHILD_GAS_SERVICE_ADDRESS= +MULTISIG_CONTRACT_ADDRESS= +ROOT_GATEWAY_ADDRESS= +ROOT_GAS_SERVICE_ADDRESS= + +# Set prior to 5_child_initialisation.js +CHILD_BRIDGE_ADDRESS= +CHILD_ADAPTER_ADDRESS= +WRAPPED_IMX_ADDRESS= +CHILD_TOKEN_TEMPLATE= +ROOT_BRIDGE_ADDRESS= +ROOT_ADAPTER_ADDRESS= +ROOT_TOKEN_TEMPLATE= \ No newline at end of file diff --git a/bootstrap/1_deployer_funding.js b/bootstrap/1_deployer_funding.js new file mode 100644 index 000000000..c724cf511 --- /dev/null +++ b/bootstrap/1_deployer_funding.js @@ -0,0 +1,83 @@ +// Deployer funding +'use strict'; +require('dotenv').config(); +const { ethers } = require("ethers"); +const { LedgerSigner } = require('@ethersproject/hardware-wallets') + +async function run() { + // Check environment variables + let childRPCURL = requireEnv("CHILD_RPC_URL"); + let childChainID = requireEnv("CHILD_CHAIN_ID"); + let adminEOASecret = requireEnv("ADMIN_EOA_SECRET"); + let axelarEOA = requireEnv("AXELAR_EOA"); + let axelarFund = requireEnv("AXELAR_FUND"); + + // Get admin address + const childProvider = new ethers.providers.JsonRpcProvider(childRPCURL, Number(childChainID)); + let adminWallet; + if (adminEOASecret == "ledger") { + adminWallet = new LedgerSigner(childProvider); + } else { + adminWallet = new ethers.Wallet(adminEOASecret, childProvider); + } + let adminAddr = await adminWallet.getAddress(); + console.log("Admin address is: ", adminAddr); + + // Check duplicates + if (hasDuplicates([adminAddr, axelarEOA, axelarFund])) { + throw("Duplicate address detected!"); + } + + // Execute + console.log("Fund deployer in..."); + for (let i = 10; i >= 0; i--) { + console.log(i) + await delay(1000); + } + let feeData = await adminWallet.getFeeData(); + let baseFee = feeData.lastBaseFeePerGas; + let gasPrice = feeData.gasPrice; + let priorityFee = Math.round(gasPrice * 150 / 100); + let maxFee = Math.round(1.13 * baseFee + priorityFee); + + let txn = { + to: axelarEOA, + value: ethers.utils.parseEther(axelarFund), + maxPriorityFeePerGas: priorityFee, + maxFeePerGas: maxFee, + } + let resp = await adminWallet.sendTransaction(txn) + + let receipt; + while (receipt == null) { + receipt = await childProvider.getTransactionReceipt(resp.hash) + await delay(1000); + } + console.log(receipt); + + // Check target balance + let balance = await childProvider.getBalance(axelarEOA) + console.log("Axelar EOA now has: ", ethers.utils.formatEther(balance)); +} + +run(); + +// Helper functions +function requireEnv(envName) { + let val = process.env[envName]; + if (val == null || val == "") { + throw(envName + " not set!"); + } + if (!envName.includes("SECRET")) { + console.log(envName + ": ", val); + } + return val +} + +function hasDuplicates(array) { + return (new Set(array)).size !== array.length; +} + +function delay(time) { + return new Promise(resolve => setTimeout(resolve, time)); +} \ No newline at end of file diff --git a/bootstrap/2_deployment_validation.js b/bootstrap/2_deployment_validation.js new file mode 100644 index 000000000..8bd2bfe50 --- /dev/null +++ b/bootstrap/2_deployment_validation.js @@ -0,0 +1,62 @@ +// Deployment validation +'use strict'; +require('dotenv').config(); +const { ethers } = require("ethers"); + +async function run() { + // Check environment variables + let childRPCURL = requireEnv("CHILD_RPC_URL"); + let childChainID =requireEnv("CHILD_CHAIN_ID"); + let rootRPCURL = requireEnv("ROOT_RPC_URL"); + let rootChainID = requireEnv("ROOT_CHAIN_ID"); + let childGatewayAddr = requireEnv("CHILD_GATEWAY_ADDRESS"); + let childGasServiceAddr = requireEnv("CHILD_GAS_SERVICE_ADDRESS"); + let multisigAddr = requireEnv("MULTISIG_CONTRACT_ADDRESS"); + let rootGatewayAddr = requireEnv("ROOT_GATEWAY_ADDRESS"); + let rootGasService = requireEnv("ROOT_GAS_SERVICE_ADDRESS"); + + // Check duplicates + if (hasDuplicates([childGatewayAddr, childGasServiceAddr, multisigAddr])) { + throw("Duplicate address detected!"); + } + if (hasDuplicates([rootGatewayAddr, rootGasService])) { + throw("Duplicate address detected!"); + } + + const childProvider = new ethers.providers.JsonRpcProvider(childRPCURL, Number(childChainID)); + const rootProvider = new ethers.providers.JsonRpcProvider(rootRPCURL, Number(rootChainID)); + + // Check child chain. + console.log("Check contracts on child chain..."); + await requireNonEmptyCode(childProvider, childGatewayAddr); + await requireNonEmptyCode(childProvider, childGasServiceAddr); + await requireNonEmptyCode(childProvider, multisigAddr); + + // Check root chain. + console.log("Check contracts on root chain..."); + await requireNonEmptyCode(rootProvider, rootGatewayAddr); + await requireNonEmptyCode(rootProvider, rootGasService); +} + +run(); + +// Helper functions +function requireEnv(envName) { + let val = process.env[envName]; + if (val == null || val == "") { + throw(envName + " not set!"); + } + console.log(envName + " is set to be: ", val); + return val; +} + +async function requireNonEmptyCode(provider, addr) { + if (await provider.getCode(addr) == "0x") { + throw(addr + " has empty code!"); + } + console.log(addr + " has code."); +} + +function hasDuplicates(array) { + return (new Set(array)).size !== array.length; +} \ No newline at end of file diff --git a/bootstrap/3_child_deployment.js b/bootstrap/3_child_deployment.js new file mode 100755 index 000000000..39fdaf39e --- /dev/null +++ b/bootstrap/3_child_deployment.js @@ -0,0 +1,168 @@ +// Deploy child contracts +'use strict'; +require('dotenv').config(); +const { ethers, ContractFactory } = require("ethers"); +const fs = require('fs'); + +async function run() { + // Check environment variables + let rootChainName = requireEnv("ROOT_CHAIN_NAME"); + let childRPCURL = requireEnv("CHILD_RPC_URL"); + let childChainID = requireEnv("CHILD_CHAIN_ID"); + let adminEOASecret = requireEnv("ADMIN_EOA_SECRET"); + let childGatewayAddr = requireEnv("CHILD_GATEWAY_ADDRESS"); + let childGasServiceAddr = requireEnv("CHILD_GAS_SERVICE_ADDRESS"); + + // Get admin address + const childProvider = new ethers.providers.JsonRpcProvider(childRPCURL, Number(childChainID)); + let adminWallet; + if (adminEOASecret == "ledger") { + adminWallet = new LedgerSigner(childProvider); + } else { + adminWallet = new ethers.Wallet(adminEOASecret, childProvider); + } + let adminAddr = await adminWallet.getAddress(); + console.log("Admin address is: ", adminAddr); + + // Execute + let childBridgeContractObj = JSON.parse(fs.readFileSync('../out/ChildERC20Bridge.sol/ChildERC20Bridge.json', 'utf8')); + console.log("Deploy child bridge contract in...") + for (let i = 10; i >= 0; i--) { + console.log(i) + await delay(1000); + } + let factory = new ContractFactory(childBridgeContractObj.abi, childBridgeContractObj.bytecode, adminWallet); + + let feeData = await adminWallet.getFeeData(); + let baseFee = feeData.lastBaseFeePerGas; + let gasPrice = feeData.gasPrice; + let priorityFee = Math.round(gasPrice * 150 / 100); + let maxFee = Math.round(1.13 * baseFee + priorityFee); + let childBridge = await factory.deploy({ + maxPriorityFeePerGas: priorityFee, + maxFeePerGas: maxFee, + }); + + let receipt; + while (receipt == null) { + receipt = await childProvider.getTransactionReceipt(childBridge.deployTransaction.hash) + await delay(1000); + } + console.log(receipt); + console.log("Deployed to CHILD_BRIDGE_ADDRESS: ", childBridge.address); + + let wIMXContractObj = JSON.parse(fs.readFileSync('../out/WIMX.sol/WIMX.json', 'utf8')); + console.log("Deploy WIMX contract in...") + for (let i = 10; i >= 0; i--) { + console.log(i) + await delay(1000); + } + factory = new ContractFactory(wIMXContractObj.abi, wIMXContractObj.bytecode, adminWallet); + + feeData = await adminWallet.getFeeData(); + baseFee = feeData.lastBaseFeePerGas; + gasPrice = feeData.gasPrice; + priorityFee = Math.round(gasPrice * 150 / 100); + maxFee = Math.round(1.13 * baseFee + priorityFee); + let WIMX = await factory.deploy({ + maxPriorityFeePerGas: priorityFee, + maxFeePerGas: maxFee, + }); + + receipt = null; + while (receipt == null) { + receipt = await childProvider.getTransactionReceipt(WIMX.deployTransaction.hash) + await delay(1000); + } + console.log(receipt); + console.log("Deployed to WRAPPED_IMX_ADDRESS: ", WIMX.address); + + let adapterContractObj = JSON.parse(fs.readFileSync('../out/ChildAxelarBridgeAdaptor.sol/ChildAxelarBridgeAdaptor.json', 'utf8')); + console.log("Deploy child adapter contract in...") + for (let i = 10; i >= 0; i--) { + console.log(i) + await delay(1000); + } + factory = new ContractFactory(adapterContractObj.abi, adapterContractObj.bytecode, adminWallet); + + feeData = await adminWallet.getFeeData(); + baseFee = feeData.lastBaseFeePerGas; + gasPrice = feeData.gasPrice; + priorityFee = Math.round(gasPrice * 150 / 100); + maxFee = Math.round(1.13 * baseFee + priorityFee); + let childAdapter = await factory.deploy(childGatewayAddr, childBridge.address, { + maxPriorityFeePerGas: priorityFee, + maxFeePerGas: maxFee, + }); + + receipt = null; + while (receipt == null) { + receipt = await childProvider.getTransactionReceipt(childAdapter.deployTransaction.hash) + await delay(1000); + } + console.log(receipt); + console.log("Deployed to CHILD_ADAPTER_ADDRESS: ", childAdapter.address); + + let templateContractObj = JSON.parse(fs.readFileSync('../out/ChildERC20.sol/ChildERC20.json', 'utf8')); + console.log("Deploy child template contract in...") + for (let i = 10; i >= 0; i--) { + console.log(i) + await delay(1000); + } + factory = new ContractFactory(templateContractObj.abi, templateContractObj.bytecode, adminWallet); + + feeData = await adminWallet.getFeeData(); + baseFee = feeData.lastBaseFeePerGas; + gasPrice = feeData.gasPrice; + priorityFee = Math.round(gasPrice * 150 / 100); + maxFee = Math.round(1.13 * baseFee + priorityFee); + let childTemplate = await factory.deploy({ + maxPriorityFeePerGas: priorityFee, + maxFeePerGas: maxFee, + }); + + receipt = null; + while (receipt == null) { + receipt = await childProvider.getTransactionReceipt(childTemplate.deployTransaction.hash) + await delay(1000); + } + console.log(receipt); + console.log("Deployed to CHILD_TOKEN_TEMPLATE: ", childTemplate.address); + + feeData = await adminWallet.getFeeData(); + baseFee = feeData.lastBaseFeePerGas; + gasPrice = feeData.gasPrice; + priorityFee = Math.round(gasPrice * 150 / 100); + maxFee = Math.round(1.13 * baseFee + priorityFee); + let resp = await childTemplate.initialize("000000000000000000000000000000000000007B", "TEMPLATE", "TPT", 18, { + maxPriorityFeePerGas: priorityFee, + maxFeePerGas: maxFee, + }); + receipt = null; + while (receipt == null) { + receipt = await childProvider.getTransactionReceipt(resp.hash) + await delay(1000); + } + console.log(receipt); + + + fs.writeFileSync("./3.out.tmp", "CHILD_BRIDGE_ADDRESS:" + childBridge.address + "\n" + "WRAPPED_IMX_ADDRESS:" + WIMX.address + "\n" + "CHILD_ADAPTER_ADDRESS:" + childAdapter.address + "\n" + "CHILD_TOKEN_TEMPLATE:" + childTemplate.address); +} + +run(); + +// Helper functions +function requireEnv(envName) { + let val = process.env[envName]; + if (val == null || val == "") { + throw(envName + " not set!"); + } + if (!envName.includes("SECRET")) { + console.log(envName + ": ", val); + } + return val +} + +function delay(time) { + return new Promise(resolve => setTimeout(resolve, time)); +} \ No newline at end of file diff --git a/bootstrap/4_root_deployment.js b/bootstrap/4_root_deployment.js new file mode 100755 index 000000000..e537efc20 --- /dev/null +++ b/bootstrap/4_root_deployment.js @@ -0,0 +1,109 @@ +// Deploy root contracts +'use strict'; +require('dotenv').config(); +const { ethers, ContractFactory } = require("ethers"); +const fs = require('fs'); + +async function run() { + // Check environment variables + let childChainName = requireEnv("CHILD_CHAIN_NAME"); + let rootRPCURL = requireEnv("ROOT_RPC_URL"); + let rootChainID = requireEnv("ROOT_CHAIN_ID"); + let adminEOASecret = requireEnv("ADMIN_EOA_SECRET"); + let rootGatewayAddr = requireEnv("ROOT_GATEWAY_ADDRESS"); + let rootGasService = requireEnv("ROOT_GAS_SERVICE_ADDRESS"); + + // Get admin address + const rootProvider = new ethers.providers.JsonRpcProvider(rootRPCURL, Number(rootChainID)); + let adminWallet; + if (adminEOASecret == "ledger") { + adminWallet = new LedgerSigner(rootProvider); + } else { + adminWallet = new ethers.Wallet(adminEOASecret, rootProvider); + } + let adminAddr = await adminWallet.getAddress(); + console.log("Admin address is: ", adminAddr); + + // Execute + let rootBridgeContractObj = JSON.parse(fs.readFileSync('../out/RootERC20Bridge.sol/RootERC20Bridge.json', 'utf8')); + console.log("Deploy root bridge contract in...") + for (let i = 10; i >= 0; i--) { + console.log(i) + await delay(1000); + } + let factory = new ContractFactory(rootBridgeContractObj.abi, rootBridgeContractObj.bytecode, adminWallet); + + let rootBridge = await factory.deploy(); + + let receipt; + while (receipt == null) { + receipt = await rootProvider.getTransactionReceipt(rootBridge.deployTransaction.hash) + await delay(1000); + } + console.log(receipt); + console.log("Deployed to ROOT_BRIDGE_ADDRESS: ", rootBridge.address); + + let adapterContractObj = JSON.parse(fs.readFileSync('../out/RootAxelarBridgeAdaptor.sol/RootAxelarBridgeAdaptor.json', 'utf8')); + console.log("Deploy root adapter contract in...") + for (let i = 10; i >= 0; i--) { + console.log(i) + await delay(1000); + } + factory = new ContractFactory(adapterContractObj.abi, adapterContractObj.bytecode, adminWallet); + + let rootAdapter = await factory.deploy(rootBridge.address, childChainName, rootGatewayAddr, rootGasService); + + receipt = null; + while (receipt == null) { + receipt = await rootProvider.getTransactionReceipt(rootAdapter.deployTransaction.hash) + await delay(1000); + } + console.log(receipt); + console.log("Deployed to ROOT_ADAPTER_ADDRESS: ", rootAdapter.address); + + let templateContractObj = JSON.parse(fs.readFileSync('../out/ChildERC20.sol/ChildERC20.json', 'utf8')); + console.log("Deploy root template contract in...") + for (let i = 10; i >= 0; i--) { + console.log(i) + await delay(1000); + } + factory = new ContractFactory(templateContractObj.abi, templateContractObj.bytecode, adminWallet); + + let rootTemplate = await factory.deploy(); + + receipt = null; + while (receipt == null) { + receipt = await rootProvider.getTransactionReceipt(rootTemplate.deployTransaction.hash) + await delay(1000); + } + console.log(receipt); + console.log("Deployed to ROOT_TOKEN_TEMPLATE: ", rootTemplate.address); + + let resp = await rootTemplate.initialize("000000000000000000000000000000000000007B", "TEMPLATE", "TPT", 18); + receipt = null; + while (receipt == null) { + receipt = await childProvider.getTransactionReceipt(resp.hash) + await delay(1000); + } + console.log(receipt); + + fs.writeFileSync("./4.out.tmp", "ROOT_BRIDGE_ADDRESS:" + rootBridge.address + "\n" + "ROOT_ADAPTER_ADDRESS:" + rootAdapter.address + "\n" + "ROOT_TOKEN_TEMPLATE:" + rootTemplate.address); +} + +run(); + +// Helper functions +function requireEnv(envName) { + let val = process.env[envName]; + if (val == null || val == "") { + throw(envName + " not set!"); + } + if (!envName.includes("SECRET")) { + console.log(envName + ": ", val); + } + return val +} + +function delay(time) { + return new Promise(resolve => setTimeout(resolve, time)); +} \ No newline at end of file diff --git a/bootstrap/5_child_initialisation.js b/bootstrap/5_child_initialisation.js new file mode 100644 index 000000000..522dcf98d --- /dev/null +++ b/bootstrap/5_child_initialisation.js @@ -0,0 +1,90 @@ +// Initialise child contracts +'use strict'; +require('dotenv').config(); +const { ethers } = require("ethers"); +const fs = require('fs'); + +async function run() { + let rootChainName = requireEnv("ROOT_CHAIN_NAME"); + let childRPCURL = requireEnv("CHILD_RPC_URL"); + let childChainID = requireEnv("CHILD_CHAIN_ID"); + let adminEOASecret = requireEnv("ADMIN_EOA_SECRET"); + let childBridgeAddr = requireEnv("CHILD_BRIDGE_ADDRESS"); + let childAdapterAddr = requireEnv("CHILD_ADAPTER_ADDRESS"); + let childTemplateAddr = requireEnv("CHILD_TOKEN_TEMPLATE"); + let rootAdapterAddr = requireEnv("ROOT_ADAPTER_ADDRESS"); + let imxRootAddr = requireEnv("IMX_ROOT_ADDR"); + + // Get admin address + const childProvider = new ethers.providers.JsonRpcProvider(childRPCURL, Number(childChainID)); + let adminWallet; + if (adminEOASecret == "ledger") { + adminWallet = new LedgerSigner(childProvider); + } else { + adminWallet = new ethers.Wallet(adminEOASecret, childProvider); + } + let adminAddr = await adminWallet.getAddress(); + console.log("Admin address is: ", adminAddr); + + // Execute + let childBridgeContractObj = JSON.parse(fs.readFileSync('../out/ChildERC20Bridge.sol/ChildERC20Bridge.json', 'utf8')); + let adapterContractObj = JSON.parse(fs.readFileSync('../out/ChildAxelarBridgeAdaptor.sol/ChildAxelarBridgeAdaptor.json', 'utf8')); + console.log("Initialise child contracts in...") + for (let i = 10; i >= 0; i--) { + console.log(i) + await delay(1000); + } + let feeData = await adminWallet.getFeeData(); + let baseFee = feeData.lastBaseFeePerGas; + let gasPrice = feeData.gasPrice; + let priorityFee = Math.round(gasPrice * 150 / 100); + let maxFee = Math.round(1.13 * baseFee + priorityFee); + const childBridge = new ethers.Contract(childBridgeAddr, childBridgeContractObj.abi, childProvider); + let resp = await childBridge.connect(adminWallet).initialize(childAdapterAddr, rootAdapterAddr, childTemplateAddr, rootChainName, imxRootAddr, { + maxPriorityFeePerGas: priorityFee, + maxFeePerGas: maxFee, + }); + + let receipt; + while (receipt == null) { + receipt = await rootProvider.getTransactionReceipt(resp.hash) + await delay(1000); + } + console.log(receipt); + + feeData = await adminWallet.getFeeData(); + baseFee = feeData.lastBaseFeePerGas; + gasPrice = feeData.gasPrice; + priorityFee = Math.round(gasPrice * 150 / 100); + maxFee = Math.round(1.13 * baseFee + priorityFee); + const childAdapter = new ethers.Contract(childAdapterAddr, adapterContractObj.abi, childProvider); + resp = await childAdapter.connect(adminWallet).setRootBridgeAdaptor({ + maxPriorityFeePerGas: priorityFee, + maxFeePerGas: maxFee, + }); + + receipt = null; + while (receipt == null) { + receipt = await childProvider.getTransactionReceipt(childTemplate.deployTransaction.hash) + await delay(1000); + } + console.log(receipt); +} + +run(); + +// Helper functions +function requireEnv(envName) { + let val = process.env[envName]; + if (val == null || val == "") { + throw(envName + " not set!"); + } + if (!envName.includes("SECRET")) { + console.log(envName + ": ", val); + } + return val +} + +function delay(time) { + return new Promise(resolve => setTimeout(resolve, time)); +} \ No newline at end of file diff --git a/bootstrap/6_imx_burning.js b/bootstrap/6_imx_burning.js new file mode 100644 index 000000000..0c75ec587 --- /dev/null +++ b/bootstrap/6_imx_burning.js @@ -0,0 +1,130 @@ +// IMX burning +'use strict'; +require('dotenv').config(); +const { ethers } = require("ethers"); + +// Transfer 200 million IMX to child bridge +const TRANSFER_TO_CHILD_BRIDGE = "200000000"; + +async function run() { + // Check environment variables + let childRPCURL = requireEnv("CHILD_RPC_URL"); + let childChainID = requireEnv("CHILD_CHAIN_ID"); + let adminEOASecret = requireEnv("ADMIN_EOA_SECRET"); + let childBridgeAddr = requireEnv("CHILD_BRIDGE_ADDRESS"); + let multisigAddr = requireEnv("MULTISIG_CONTRACT_ADDRESS"); + + // Get admin address + const childProvider = new ethers.providers.JsonRpcProvider(childRPCURL, Number(childChainID)); + let adminWallet; + if (adminEOASecret == "ledger") { + adminWallet = new LedgerSigner(childProvider); + } else { + adminWallet = new ethers.Wallet(adminEOASecret, childProvider); + } + let adminAddr = await adminWallet.getAddress(); + console.log("Admin address is: ", adminAddr); + + // Check duplicates + if (hasDuplicates([adminAddr, childBridgeAddr, multisigAddr])) { + throw("Duplicate address detected!"); + } + + // Get admin, child bridge and multisig balances. + let adminBal = await childProvider.getBalance(adminAddr); + let bridgeBal = await childProvider.getBalance(childBridgeAddr); + let multisigBal = await childProvider.getBalance(multisigAddr); + + console.log("Admin balance: ", ethers.utils.formatEther(adminBal)); + console.log("Bridge balance: ", ethers.utils.formatEther(bridgeBal)); + console.log("Multisig balance: ", ethers.utils.formatEther(multisigBal)); + + // Execute + console.log("Burn IMX in..."); + for (let i = 10; i >= 0; i--) { + console.log(i) + await delay(1000); + } + // Transfer to child bridge. + console.log("Transfer 200m to child bridge...") + let feeData = await adminWallet.getFeeData(); + let baseFee = feeData.lastBaseFeePerGas; + let gasPrice = feeData.gasPrice; + let priorityFee = Math.round(gasPrice * 150 / 100); + let maxFee = Math.round(1.13 * baseFee + priorityFee); + let txn = { + to: childBridgeAddr, + value: ethers.utils.parseEther(TRANSFER_TO_CHILD_BRIDGE), + maxPriorityFeePerGas: priorityFee, + maxFeePerGas: maxFee, + } + let resp = await adminWallet.sendTransaction(txn) + + let receipt; + while (receipt == null) { + receipt = await childProvider.getTransactionReceipt(resp.hash) + await delay(1000); + } + console.log(receipt); + + adminBal = await childProvider.getBalance(adminAddr); + bridgeBal = await childProvider.getBalance(childBridgeAddr); + multisigBal = await childProvider.getBalance(multisigAddr); + + console.log("Admin balance: ", ethers.utils.formatEther(adminBal)); + console.log("Bridge balance: ", ethers.utils.formatEther(bridgeBal)); + console.log("Multisig balance: ", ethers.utils.formatEther(multisigBal)); + + // Transfer to multisig. + console.log("Transfer remaining to multisig...") + feeData = await adminWallet.getFeeData(); + baseFee = feeData.lastBaseFeePerGas; + gasPrice = feeData.gasPrice; + priorityFee = Math.round(gasPrice * 150 / 100); + maxFee = Math.round(1.13 * baseFee + priorityFee); + + txn = { + to: multisigAddr, + value: adminBal.sub(ethers.utils.parseEther("0.01")), + maxPriorityFeePerGas: priorityFee, + maxFeePerGas: maxFee, + } + resp = await adminWallet.sendTransaction(txn) + + receipt = null; + while (receipt == null) { + receipt = await childProvider.getTransactionReceipt(resp.hash) + await delay(1000); + } + console.log(receipt); + + adminBal = await childProvider.getBalance(adminAddr); + bridgeBal = await childProvider.getBalance(childBridgeAddr); + multisigBal = await childProvider.getBalance(multisigAddr); + + console.log("Admin balance: ", ethers.utils.formatEther(adminBal)); + console.log("Bridge balance: ", ethers.utils.formatEther(bridgeBal)); + console.log("Multisig balance: ", ethers.utils.formatEther(multisigBal)); +} + +run(); + +// Helper functions +function requireEnv(envName) { + let val = process.env[envName]; + if (val == null || val == "") { + throw(envName + " not set!"); + } + if (!envName.includes("SECRET")) { + console.log(envName + ": ", val); + } + return val +} + +function hasDuplicates(array) { + return (new Set(array)).size !== array.length; +} + +function delay(time) { + return new Promise(resolve => setTimeout(resolve, time)); +} \ No newline at end of file diff --git a/bootstrap/7_imx_rebalancing.js b/bootstrap/7_imx_rebalancing.js new file mode 100644 index 000000000..7d33202d1 --- /dev/null +++ b/bootstrap/7_imx_rebalancing.js @@ -0,0 +1,95 @@ +// IMX rebalancing +'use strict'; +require('dotenv').config(); +const { ethers } = require("ethers"); + +// The total supply of IMX +const TOTAL_SUPPLY = "2000000000"; + +// The contract ABI of IMX on L1. +const IMX_ABI = `[{"inputs":[{"internalType":"address","name":"minter","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"previousAdminRole","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"newAdminRole","type":"bytes32"}],"name":"RoleAdminChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleGranted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleRevoked","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"DEFAULT_ADMIN_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MINTER_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"cap","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"}],"name":"getRoleAdmin","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"grantRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"hasRole","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"renounceRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"revokeRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"}]`; + +async function run() { + // Check environment variables + let childRPCURL = requireEnv("CHILD_RPC_URL"); + let childChainID = requireEnv("CHILD_CHAIN_ID"); + let rootRPCURL = requireEnv("ROOT_RPC_URL"); + let rootChainID = requireEnv("ROOT_CHAIN_ID"); + let adminEOASecret = requireEnv("ADMIN_EOA_SECRET"); + let childBridgeAddr = requireEnv("CHILD_BRIDGE_ADDRESS"); + let multisigAddr = requireEnv("MULTISIG_CONTRACT_ADDRESS"); + let rootBridgeAddr = requireEnv("ROOT_BRIDGE_ADDRESS"); + let imxRootAddr = requireEnv("IMX_ROOT_ADDR"); + + // Get admin address + const childProvider = new ethers.providers.JsonRpcProvider(childRPCURL, Number(childChainID)); + const rootProvider = new ethers.providers.JsonRpcProvider(rootRPCURL, Number(rootChainID)); + let adminWallet; + if (adminEOASecret == "ledger") { + adminWallet = new LedgerSigner(rootProvider); + } else { + adminWallet = new ethers.Wallet(adminEOASecret, rootProvider); + } + let adminAddr = await adminWallet.getAddress(); + console.log("Admin address is: ", adminAddr); + + // Check duplicates + if (hasDuplicates([adminAddr, childBridgeAddr, multisigAddr])) { + throw("Duplicate address detected!"); + } + if (hasDuplicates([adminAddr, rootBridgeAddr, imxRootAddr])) { + throw("Duplicate address detected!"); + } + + // Get amount to balance on L2. + let bridgeBal = await childProvider.getBalance(childBridgeAddr); + let multisigBal = await childProvider.getBalance(multisigAddr); + let balanceAmt = ethers.utils.parseEther(TOTAL_SUPPLY).sub(bridgeBal).sub(multisigBal); + + console.log("The amount to balance on L1 is: ", ethers.utils.formatEther(balanceAmt)); + + // Execute + console.log("Rebalance in..."); + for (let i = 10; i >= 0; i--) { + console.log(i) + await delay(1000); + } + + console.log("Admin IMX balance: ", await IMX.balanceOf(adminAddr)); + console.log("Root bridge IMX balance: ", await IMX.balanceOf(rootBridgeAddr)); + console.log("Transfer...") + const IMX = new ethers.Contract(imxRootAddr, IMX_ABI, rootProvider); + let resp = await IMX.connect(adminWallet).transfer(rootBridgeAddr, balanceAmt); + + let receipt; + while (receipt == null) { + receipt = await rootProvider.getTransactionReceipt(resp.hash) + await delay(1000); + } + console.log(receipt); + + console.log("Admin IMX balance: ", await IMX.balanceOf(adminAddr)); + console.log("Root bridge IMX balance: ", await IMX.balanceOf(rootBridgeAddr)); +} + +run(); + +// Helper functions +function requireEnv(envName) { + let val = process.env[envName]; + if (val == null || val == "") { + throw(envName + " not set!"); + } + if (!envName.includes("SECRET")) { + console.log(envName + ": ", val); + } + return val +} + +function hasDuplicates(array) { + return (new Set(array)).size !== array.length; +} + +function delay(time) { + return new Promise(resolve => setTimeout(resolve, time)); +} \ No newline at end of file diff --git a/bootstrap/8_root_initialisation.js b/bootstrap/8_root_initialisation.js new file mode 100644 index 000000000..56d20b76e --- /dev/null +++ b/bootstrap/8_root_initialisation.js @@ -0,0 +1,77 @@ +// Initialise root contracts +'use strict'; +require('dotenv').config(); +const { ethers } = require("ethers"); +const fs = require('fs'); + +async function run() { + // Check environment variables + let rootRPCURL = requireEnv("ROOT_RPC_URL"); + let rootChainID = requireEnv("ROOT_CHAIN_ID"); + let adminEOASecret = requireEnv("ADMIN_EOA_SECRET"); + let rootBridgeAddr = requireEnv("ROOT_BRIDGE_ADDRESS"); + let rootAdapterAddr = requireEnv("ROOT_ADAPTER_ADDRESS"); + let rootTemplateAddr = requireEnv("ROOT_TOKEN_TEMPLATE"); + let childBridgeAddr = requireEnv("CHILD_BRIDGE_ADDRESS"); + let childAdapterAddr = requireEnv("CHILD_ADAPTER_ADDRESS"); + let imxRootAddr = requireEnv("IMX_ROOT_ADDR"); + let wethRootAddr = requireEnv("WETH_ROOT_ADDR"); + + // Get admin address + const rootProvider = new ethers.providers.JsonRpcProvider(rootRPCURL, Number(rootChainID)); + let adminWallet; + if (adminEOASecret == "ledger") { + adminWallet = new LedgerSigner(rootProvider); + } else { + adminWallet = new ethers.Wallet(adminEOASecret, rootProvider); + } + let adminAddr = await adminWallet.getAddress(); + console.log("Admin address is: ", adminAddr); + + // Execute + let rootBridgeContractObj = JSON.parse(fs.readFileSync('../out/RootERC20Bridge.sol/RootERC20Bridge.json', 'utf8')); + let adapterContractObj = JSON.parse(fs.readFileSync('../out/RootAxelarBridgeAdaptor.sol/RootAxelarBridgeAdaptor.json', 'utf8')); + console.log("Initialise root contracts in...") + for (let i = 10; i >= 0; i--) { + console.log(i) + await delay(1000); + } + + const rootBridge = new ethers.Contract(rootBridgeAddr, rootBridgeContractObj.abi, rootProvider); + let resp = await rootBridge.connect(adminWallet).initialize(rootAdapterAddr, childBridgeAddr, ethers.utils.getAddress(childAdapterAddr), rootTemplateAddr, imxRootAddr, wethRootAddr); + + let receipt; + while (receipt == null) { + receipt = await rootProvider.getTransactionReceipt(resp.hash) + await delay(1000); + } + console.log(receipt); + + const rootAdapter = new ethers.Contract(rootAdapterAddr, adapterContractObj.abi, rootProvider); + resp = await rootAdapter.connect(adminWallet).setChildBridgeAdaptor(); + + receipt = null; + while (receipt == null) { + receipt = await childProvider.getTransactionReceipt(childTemplate.deployTransaction.hash) + await delay(1000); + } + console.log(receipt); +} + +run(); + +// Helper functions +function requireEnv(envName) { + let val = process.env[envName]; + if (val == null || val == "") { + throw(envName + " not set!"); + } + if (!envName.includes("SECRET")) { + console.log(envName + ": ", val); + } + return val +} + +function delay(time) { + return new Promise(resolve => setTimeout(resolve, time)); +} \ No newline at end of file diff --git a/bootstrap/README.md b/bootstrap/README.md new file mode 100644 index 000000000..11ebbfbf0 --- /dev/null +++ b/bootstrap/README.md @@ -0,0 +1,80 @@ +# Bridge bootstrapping + +## Prerequisite +1. Coordinate with Axelar to obtain their admin address for initial funding as well as the desired amount in $IMX. (50 IMX in previous discussion). +2. Fund admin EOA account with `ETH` and `IMX` on root chain. (As a rule of thumb, _0.1 ETH and 100 IMX_ (TBD)) + + +## Bootstrapping +0. Install dependency and compile contracts (Run in root directory) +``` +yarn install +forge build +``` +1. Create environment file +``` +cd bootstrap +cp ./env.example ./env +``` +2. Set the following environment variables +``` +CHILD_CHAIN_NAME= +CHILD_RPC_URL= +CHILD_CHAIN_ID= +ROOT_CHAIN_NAME= +ROOT_RPC_URL= +ROOT_CHAIN_ID= +IMX_ROOT_ADDR= +WETH_ROOT_ADDR= +ADMIN_EOA_SECRET= (Note: Use private key string or "ledger" if using hardware wallet) +AXELAR_EOA= +AXELAR_FUND= +``` +3. Fund deployer +``` +node 1_deployer_funding.js +``` +4. Wait for Axelar to deploy & setup their system and Security team to deploy & setup multisig wallet. +5. Set the following environment variables +``` +CHILD_GATEWAY_ADDRESS= +CHILD_GAS_SERVICE_ADDRESS= +MULTISIG_CONTRACT_ADDRESS= +ROOT_GATEWAY_ADDRESS= +ROOT_GAS_SERVICE_ADDRESS= +``` +6. Basic contract validation +``` +node 2_deployment_validation.js (Note, for testnet regenesis, lien 41 needs to be disabled.) +``` +7. Deploy bridge contracts on child and root chain. (see [here](../README.md#remote-deployment) for more details) +``` +node 3_child_deployment.js +node 4_child_deployment.js +``` +8. Set the following environment variables using the output `3.out.tmp` & `4.out.tmp` from the previous step. +``` +CHILD_BRIDGE_ADDRESS= +CHILD_ADAPTER_ADDRESS= +WRAPPED_IMX_ADDRESS= +CHILD_TOKEN_TEMPLATE= +ROOT_BRIDGE_ADDRESS= +ROOT_ADAPTER_ADDRESS= +ROOT_TOKEN_TEMPLATE= +``` +9. Initialise bridge contracts on child chain. (see [here](../README.md#remote-deployment) for more details) +``` +node 5_child_initialisation.js +``` +10. IMX Burning +``` +node 6_imx_burning.js +``` +11. IMX Rebalancing +``` +node 7_imx_rebalancing.js +``` +12. Initialise bridge contracts on root chain. (see [here](../README.md#remote-deployment) for more details) +``` +node 8_root_initialisation.js +``` diff --git a/package.json b/package.json index fc7d8bd0f..04e05ea77 100644 --- a/package.json +++ b/package.json @@ -22,6 +22,8 @@ "@axelar-network/axelar-gmp-sdk-solidity": "^5.3.1", "@axelar-network/axelar-local-dev": "^2.1.1-alpha.2", "@axelar-network/axelarjs-sdk": "^0.12.8", + "@ethersproject/hardware-wallets": "^5.7.0", + "@ledgerhq/hw-transport-node-hid": "^6.27.21", "@openzeppelin/contracts": "^4.5.0", "axios": "^0.27.2", "bip39": "^3.0.4", diff --git a/yarn.lock b/yarn.lock index a1ca53761..a529c3e63 100644 --- a/yarn.lock +++ b/yarn.lock @@ -402,6 +402,18 @@ "@ethersproject/properties" "^5.7.0" "@ethersproject/transactions" "^5.7.0" +"@ethersproject/hardware-wallets@^5.7.0": + version "5.7.0" + resolved "https://registry.npmjs.org/@ethersproject/hardware-wallets/-/hardware-wallets-5.7.0.tgz" + integrity sha512-DjMMXIisRc8xFvEoLoYz1w7JDOYmaz/a0X9sp7Zu668RR8U1zCAyj5ow25HLRW+TCzEC5XiFetTXqS5kXonFCQ== + dependencies: + "@ledgerhq/hw-app-eth" "5.27.2" + "@ledgerhq/hw-transport" "5.26.0" + "@ledgerhq/hw-transport-u2f" "5.26.0" + ethers "^5.7.0" + optionalDependencies: + "@ledgerhq/hw-transport-node-hid" "5.26.0" + "@ethersproject/hash@5.7.0", "@ethersproject/hash@^5.7.0": version "5.7.0" resolved "https://registry.npmjs.org/@ethersproject/hash/-/hash-5.7.0.tgz" @@ -645,6 +657,151 @@ resolved "https://registry.npmjs.org/@fastify/busboy/-/busboy-2.0.0.tgz" integrity sha512-JUFJad5lv7jxj926GPgymrWQxxjPYuJNiNjNMzqT+HiuP6Vl3dk5xzG+8sTX96np0ZAluvaMzPsjhHZ5rNuNQQ== +"@ledgerhq/cryptoassets@^5.27.2": + version "5.53.0" + resolved "https://registry.npmjs.org/@ledgerhq/cryptoassets/-/cryptoassets-5.53.0.tgz" + integrity sha512-M3ibc3LRuHid5UtL7FI3IC6nMEppvly98QHFoSa7lJU0HDzQxY6zHec/SPM4uuJUC8sXoGVAiRJDkgny54damw== + dependencies: + invariant "2" + +"@ledgerhq/devices@^5.26.0", "@ledgerhq/devices@^5.51.1": + version "5.51.1" + resolved "https://registry.npmjs.org/@ledgerhq/devices/-/devices-5.51.1.tgz" + integrity sha512-4w+P0VkbjzEXC7kv8T1GJ/9AVaP9I6uasMZ/JcdwZBS3qwvKo5A5z9uGhP5c7TvItzcmPb44b5Mw2kT+WjUuAA== + dependencies: + "@ledgerhq/errors" "^5.50.0" + "@ledgerhq/logs" "^5.50.0" + rxjs "6" + semver "^7.3.5" + +"@ledgerhq/devices@^8.0.7": + version "8.0.7" + resolved "https://registry.npmjs.org/@ledgerhq/devices/-/devices-8.0.7.tgz" + integrity sha512-BbPyET52lXnVs7CxJWrGYqmtGdbGzj+XnfCqLsDnA7QYr1CZREysxmie+Rr6BKpNDBRVesAovXjtaVaZOn+upw== + dependencies: + "@ledgerhq/errors" "^6.14.0" + "@ledgerhq/logs" "^6.10.1" + rxjs "6" + semver "^7.3.5" + +"@ledgerhq/errors@^5.26.0", "@ledgerhq/errors@^5.50.0": + version "5.50.0" + resolved "https://registry.npmjs.org/@ledgerhq/errors/-/errors-5.50.0.tgz" + integrity sha512-gu6aJ/BHuRlpU7kgVpy2vcYk6atjB4iauP2ymF7Gk0ez0Y/6VSMVSJvubeEQN+IV60+OBK0JgeIZG7OiHaw8ow== + +"@ledgerhq/errors@^6.14.0": + version "6.14.0" + resolved "https://registry.npmjs.org/@ledgerhq/errors/-/errors-6.14.0.tgz" + integrity sha512-ZWJw2Ti6Dq1Ott/+qYqJdDWeZm16qI3VNG5rFlb0TQ3UcAyLIQZbnnzzdcVVwVeZiEp66WIpINd/pBdqsHVyOA== + +"@ledgerhq/hw-app-eth@5.27.2": + version "5.27.2" + resolved "https://registry.npmjs.org/@ledgerhq/hw-app-eth/-/hw-app-eth-5.27.2.tgz" + integrity sha512-llNdrE894cCN8j6yxJEUniciyLVcLmu5N0UmIJLOObztG+5rOF4bX54h4SreTWK+E10Z0CzHSeyE5Lz/tVcqqQ== + dependencies: + "@ledgerhq/cryptoassets" "^5.27.2" + "@ledgerhq/errors" "^5.26.0" + "@ledgerhq/hw-transport" "^5.26.0" + bignumber.js "^9.0.1" + rlp "^2.2.6" + +"@ledgerhq/hw-transport-node-hid-noevents@^5.26.0": + version "5.51.1" + resolved "https://registry.yarnpkg.com/@ledgerhq/hw-transport-node-hid-noevents/-/hw-transport-node-hid-noevents-5.51.1.tgz#71f37f812e448178ad0bcc2258982150d211c1ab" + integrity sha512-9wFf1L8ZQplF7XOY2sQGEeOhpmBRzrn+4X43kghZ7FBDoltrcK+s/D7S+7ffg3j2OySyP6vIIIgloXylao5Scg== + dependencies: + "@ledgerhq/devices" "^5.51.1" + "@ledgerhq/errors" "^5.50.0" + "@ledgerhq/hw-transport" "^5.51.1" + "@ledgerhq/logs" "^5.50.0" + node-hid "2.1.1" + +"@ledgerhq/hw-transport-node-hid-noevents@^6.27.19": + version "6.27.19" + resolved "https://registry.npmjs.org/@ledgerhq/hw-transport-node-hid-noevents/-/hw-transport-node-hid-noevents-6.27.19.tgz" + integrity sha512-zOIB1fBiQH9ZYFzoEpNY4n1lE7bGPgRT+k85fKuLM7cxxm5Sy+TgrdxImvBz0IQUS8EvrtZCm+dVWkb2sH/6OA== + dependencies: + "@ledgerhq/devices" "^8.0.7" + "@ledgerhq/errors" "^6.14.0" + "@ledgerhq/hw-transport" "^6.28.8" + "@ledgerhq/logs" "^6.10.1" + node-hid "^2.1.2" + +"@ledgerhq/hw-transport-node-hid@5.26.0": + version "5.26.0" + resolved "https://registry.yarnpkg.com/@ledgerhq/hw-transport-node-hid/-/hw-transport-node-hid-5.26.0.tgz#69bc4f8067cdd9c09ef4aed0e0b3c58328936e4b" + integrity sha512-qhaefZVZatJ6UuK8Wb6WSFNOLWc2mxcv/xgsfKi5HJCIr4bPF/ecIeN+7fRcEaycxj4XykY6Z4A7zDVulfFH4w== + dependencies: + "@ledgerhq/devices" "^5.26.0" + "@ledgerhq/errors" "^5.26.0" + "@ledgerhq/hw-transport" "^5.26.0" + "@ledgerhq/hw-transport-node-hid-noevents" "^5.26.0" + "@ledgerhq/logs" "^5.26.0" + lodash "^4.17.20" + node-hid "1.3.0" + usb "^1.6.3" + +"@ledgerhq/hw-transport-node-hid@^6.27.21": + version "6.27.21" + resolved "https://registry.npmjs.org/@ledgerhq/hw-transport-node-hid/-/hw-transport-node-hid-6.27.21.tgz" + integrity sha512-8G3Owpa2ex+TkGQSMkKoAbMEGZ7a23g0wZUvVzalQphMqbayebMhuXxue8iPp7F9pulm7uyLxgMYptYyw5i4yQ== + dependencies: + "@ledgerhq/devices" "^8.0.7" + "@ledgerhq/errors" "^6.14.0" + "@ledgerhq/hw-transport" "^6.28.8" + "@ledgerhq/hw-transport-node-hid-noevents" "^6.27.19" + "@ledgerhq/logs" "^6.10.1" + lodash "^4.17.21" + node-hid "^2.1.2" + usb "2.9.0" + +"@ledgerhq/hw-transport-u2f@5.26.0": + version "5.26.0" + resolved "https://registry.npmjs.org/@ledgerhq/hw-transport-u2f/-/hw-transport-u2f-5.26.0.tgz" + integrity sha512-QTxP1Rsh+WZ184LUOelYVLeaQl3++V3I2jFik+l9JZtakwEHjD0XqOT750xpYNL/vfHsy31Wlz+oicdxGzFk+w== + dependencies: + "@ledgerhq/errors" "^5.26.0" + "@ledgerhq/hw-transport" "^5.26.0" + "@ledgerhq/logs" "^5.26.0" + u2f-api "0.2.7" + +"@ledgerhq/hw-transport@5.26.0", "@ledgerhq/hw-transport@^5.26.0": + version "5.26.0" + resolved "https://registry.npmjs.org/@ledgerhq/hw-transport/-/hw-transport-5.26.0.tgz" + integrity sha512-NFeJOJmyEfAX8uuIBTpocWHcz630sqPcXbu864Q+OCBm4EK5UOKV1h/pX7e0xgNIKY8zhJ/O4p4cIZp9tnXLHQ== + dependencies: + "@ledgerhq/devices" "^5.26.0" + "@ledgerhq/errors" "^5.26.0" + events "^3.2.0" + +"@ledgerhq/hw-transport@^5.51.1": + version "5.51.1" + resolved "https://registry.yarnpkg.com/@ledgerhq/hw-transport/-/hw-transport-5.51.1.tgz#8dd14a8e58cbee4df0c29eaeef983a79f5f22578" + integrity sha512-6wDYdbWrw9VwHIcoDnqWBaDFyviyjZWv6H9vz9Vyhe4Qd7TIFmbTl/eWs6hZvtZBza9K8y7zD8ChHwRI4s9tSw== + dependencies: + "@ledgerhq/devices" "^5.51.1" + "@ledgerhq/errors" "^5.50.0" + events "^3.3.0" + +"@ledgerhq/hw-transport@^6.28.8": + version "6.28.8" + resolved "https://registry.npmjs.org/@ledgerhq/hw-transport/-/hw-transport-6.28.8.tgz" + integrity sha512-XxQVl4htd018u/M66r0iu5nlHi+J6QfdPsORzDF6N39jaz+tMqItb7tUlXM/isggcuS5lc7GJo7NOuJ8rvHZaQ== + dependencies: + "@ledgerhq/devices" "^8.0.7" + "@ledgerhq/errors" "^6.14.0" + events "^3.3.0" + +"@ledgerhq/logs@^5.26.0", "@ledgerhq/logs@^5.50.0": + version "5.50.0" + resolved "https://registry.npmjs.org/@ledgerhq/logs/-/logs-5.50.0.tgz" + integrity sha512-swKHYCOZUGyVt4ge0u8a7AwNcA//h4nx5wIi0sruGye1IJ5Cva0GyK9L2/WdX+kWVTKp92ZiEo1df31lrWGPgA== + +"@ledgerhq/logs@^6.10.1": + version "6.10.1" + resolved "https://registry.npmjs.org/@ledgerhq/logs/-/logs-6.10.1.tgz" + integrity sha512-z+ILK8Q3y+nfUl43ctCPuR4Y2bIxk/ooCQFwZxhtci1EhAtMDzMAx2W25qx8G1PPL9UUOdnUax19+F0OjXoj4w== + "@metamask/eth-sig-util@^4.0.0": version "4.0.1" resolved "https://registry.npmjs.org/@metamask/eth-sig-util/-/eth-sig-util-4.0.1.tgz" @@ -1274,6 +1431,11 @@ resolved "https://registry.npmjs.org/@types/uuid/-/uuid-8.3.4.tgz" integrity sha512-c/I8ZRb51j+pYGAu5CrFMRxqZ2ke4y2grEBO5AUjgSkSk+qT2Ea+OdWElz/OiMf5MNpn2b17kuVBwZLQJXzihw== +"@types/w3c-web-usb@^1.0.6": + version "1.0.9" + resolved "https://registry.npmjs.org/@types/w3c-web-usb/-/w3c-web-usb-1.0.9.tgz" + integrity sha512-6EIpb9g9k/SGu59mQ6RW3tedmabtE+N3iGRa98+1CCFuhGt565wLEYKXoEVKTuNrCr2SrgfvBMN5db6hggkzKQ== + abbrev@1: version "1.1.1" resolved "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz" @@ -1381,6 +1543,11 @@ ansi-escapes@^4.3.0: dependencies: type-fest "^0.21.3" +ansi-regex@^2.0.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-2.1.1.tgz#c3b33ab5ee360d86e0e628f0468ae7ef27d654df" + integrity sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA== + ansi-regex@^3.0.0: version "3.0.1" resolved "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.1.tgz" @@ -1423,6 +1590,11 @@ anymatch@~3.1.2: normalize-path "^3.0.0" picomatch "^2.0.4" +aproba@^1.0.3: + version "1.2.0" + resolved "https://registry.yarnpkg.com/aproba/-/aproba-1.2.0.tgz#6802e6264efd18c790a1b0d517f0f2627bf2c94a" + integrity sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw== + aptos@1.3.16: version "1.3.16" resolved "https://registry.npmjs.org/aptos/-/aptos-1.3.16.tgz" @@ -1434,6 +1606,14 @@ aptos@1.3.16: form-data "4.0.0" tweetnacl "1.0.3" +are-we-there-yet@~1.1.2: + version "1.1.7" + resolved "https://registry.yarnpkg.com/are-we-there-yet/-/are-we-there-yet-1.1.7.tgz#b15474a932adab4ff8a50d9adfa7e4e926f21146" + integrity sha512-nxwy40TuMiUGqMyRHgCSWZ9FM4VAoRP4xUYSTv5ImRog+h9yISPbVH7H8fASCIzYn9wlEv4zvFL7uKDMCFQm3g== + dependencies: + delegates "^1.0.0" + readable-stream "^2.0.6" + argparse@^1.0.7: version "1.0.10" resolved "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz" @@ -1624,11 +1804,23 @@ bigint-crypto-utils@^3.0.23: resolved "https://registry.npmjs.org/bigint-crypto-utils/-/bigint-crypto-utils-3.3.0.tgz" integrity sha512-jOTSb+drvEDxEq6OuUybOAv/xxoh3cuYRUIPyu8sSHQNKM303UQ2R1DAo45o1AkcIXw6fzbaFI1+xGGdaXs2lg== +bignumber.js@^9.0.1: + version "9.1.2" + resolved "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.1.2.tgz" + integrity sha512-2/mKyZH9K85bzOEfhXDBFZTGd1CTs+5IHpeFQo9luiBG7hghdC851Pj2WAhb6E3R6b9tZj/XKhbg4fum+Kepug== + binary-extensions@^2.0.0: version "2.2.0" resolved "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz" integrity sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA== +bindings@^1.5.0: + version "1.5.0" + resolved "https://registry.npmjs.org/bindings/-/bindings-1.5.0.tgz" + integrity sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ== + dependencies: + file-uri-to-path "1.0.0" + bip39@^3.0.4: version "3.1.0" resolved "https://registry.npmjs.org/bip39/-/bip39-3.1.0.tgz" @@ -1636,6 +1828,15 @@ bip39@^3.0.4: dependencies: "@noble/hashes" "^1.2.0" +bl@^4.0.3: + version "4.1.0" + resolved "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz" + integrity sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w== + dependencies: + buffer "^5.5.0" + inherits "^2.0.4" + readable-stream "^3.4.0" + blakejs@^1.1.0: version "1.2.1" resolved "https://registry.npmjs.org/blakejs/-/blakejs-1.2.1.tgz" @@ -1759,6 +1960,14 @@ buffer-xor@^1.0.3: resolved "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz" integrity sha512-571s0T7nZWK6vB67HI5dyUF7wXiNcfaPPPTl6zYCNApANjIvYJTg7hlud/+cJpdAhS7dVzqMLmfhfHR3rAcOjQ== +buffer@^5.5.0: + version "5.7.1" + resolved "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz" + integrity sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ== + dependencies: + base64-js "^1.3.1" + ieee754 "^1.1.13" + buffer@^6.0.3: version "6.0.3" resolved "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz" @@ -1884,6 +2093,11 @@ chokidar@3.5.3, chokidar@^3.4.0: optionalDependencies: fsevents "~2.3.2" +chownr@^1.1.1: + version "1.1.4" + resolved "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz" + integrity sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg== + chownr@^2.0.0: version "2.0.0" resolved "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz" @@ -1953,6 +2167,11 @@ clone-response@^1.0.2: dependencies: mimic-response "^1.0.0" +code-point-at@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/code-point-at/-/code-point-at-1.1.0.tgz#0d070b4d043a5bea33a2f1a40e2edb3d9a4ccf77" + integrity sha512-RpAVKQA5T63xEj6/giIbUEtZwJ4UFIc3ZtvEkiaUERylqe8xb5IvqcgOurZLahv93CLKfxcw5YI+DZcUBRyLXA== + color-convert@^1.9.0: version "1.9.3" resolved "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz" @@ -2026,6 +2245,11 @@ config@^3.3.9: dependencies: json5 "^2.2.3" +console-control-strings@^1.0.0, console-control-strings@~1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/console-control-strings/-/console-control-strings-1.1.0.tgz#3d7cf4464db6446ea644bf4b39507f9851008e8e" + integrity sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ== + cookie@^0.4.1: version "0.4.2" resolved "https://registry.npmjs.org/cookie/-/cookie-0.4.2.tgz" @@ -2118,6 +2342,13 @@ decamelize@^4.0.0: resolved "https://registry.npmjs.org/decamelize/-/decamelize-4.0.0.tgz" integrity sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ== +decompress-response@^4.2.0: + version "4.2.1" + resolved "https://registry.yarnpkg.com/decompress-response/-/decompress-response-4.2.1.tgz#414023cc7a302da25ce2ec82d0d5238ccafd8986" + integrity sha512-jOSne2qbyE+/r8G1VU+G/82LBs2Fs4LAsTiLSHOCOMZQl2OKZ6i8i4IyHemTe+/yIXOtTcRQMzPcgyhoFlqPkw== + dependencies: + mimic-response "^2.0.0" + decompress-response@^6.0.0: version "6.0.0" resolved "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz" @@ -2125,6 +2356,11 @@ decompress-response@^6.0.0: dependencies: mimic-response "^3.1.0" +deep-extend@^0.6.0: + version "0.6.0" + resolved "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz" + integrity sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA== + deep-is@~0.1.3: version "0.1.4" resolved "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz" @@ -2158,6 +2394,11 @@ delayed-stream@~1.0.0: resolved "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz" integrity sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ== +delegates@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/delegates/-/delegates-1.0.0.tgz#84c6e159b81904fdca59a0ef44cd870d31250f9a" + integrity sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ== + depd@2.0.0, depd@^2.0.0: version "2.0.0" resolved "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz" @@ -2168,6 +2409,16 @@ depd@~1.1.2: resolved "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz" integrity sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ== +detect-libc@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/detect-libc/-/detect-libc-1.0.3.tgz#fa137c4bd698edf55cd5cd02ac559f91a4c4ba9b" + integrity sha512-pGjwhsmsp4kL2RTz08wcOlGN83otlqHeD/Z5T8GXZB+/YcpQ/dgo+lbU8ZsGxV0HIvqqxo9l7mqYwyYMD9bKDg== + +detect-libc@^2.0.0: + version "2.0.2" + resolved "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.2.tgz" + integrity sha512-UX6sGumvvqSaXgdKGUsgZWqcUyIXZ/vZTrlRT/iobiKhGL0zL4d3osHj3uqllWJK+i+sixDS/3COVEOFbupFyw== + detect-port@^1.3.0: version "1.5.1" resolved "https://registry.npmjs.org/detect-port/-/detect-port-1.5.1.tgz" @@ -2230,7 +2481,7 @@ emoji-regex@^8.0.0: resolved "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz" integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A== -end-of-stream@^1.1.0: +end-of-stream@^1.1.0, end-of-stream@^1.4.1: version "1.4.4" resolved "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz" integrity sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q== @@ -2601,7 +2852,7 @@ ethereumjs-util@^6.0.0, ethereumjs-util@^6.2.1: ethjs-util "0.1.6" rlp "^2.2.3" -ethers@^5.6.2, ethers@^5.6.5, ethers@^5.7.1, ethers@^5.7.2: +ethers@^5.6.2, ethers@^5.6.5, ethers@^5.7.0, ethers@^5.7.1, ethers@^5.7.2: version "5.7.2" resolved "https://registry.npmjs.org/ethers/-/ethers-5.7.2.tgz" integrity sha512-wswUsmWo1aOK8rR7DIKiWSw9DbLWe6x98Jrn8wcTflTVvaXhAMaB5zGAXy0GYQEQp9iO1iSHWVyARQm11zUtyg== @@ -2653,6 +2904,11 @@ ethjs-util@0.1.6, ethjs-util@^0.1.6: is-hex-prefixed "1.0.0" strip-hex-prefix "1.0.0" +events@^3.2.0, events@^3.3.0: + version "3.3.0" + resolved "https://registry.npmjs.org/events/-/events-3.3.0.tgz" + integrity sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q== + evp_bytestokey@^1.0.3: version "1.0.3" resolved "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz" @@ -2661,6 +2917,11 @@ evp_bytestokey@^1.0.3: md5.js "^1.3.4" safe-buffer "^5.1.1" +expand-template@^2.0.3: + version "2.0.3" + resolved "https://registry.npmjs.org/expand-template/-/expand-template-2.0.3.tgz" + integrity sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg== + fast-deep-equal@^3.1.1: version "3.1.3" resolved "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz" @@ -2699,6 +2960,11 @@ fastq@^1.6.0: dependencies: reusify "^1.0.4" +file-uri-to-path@1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz" + integrity sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw== + fill-range@^7.0.1: version "7.0.1" resolved "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz" @@ -2766,6 +3032,11 @@ fp-ts@^1.0.0: resolved "https://registry.npmjs.org/fp-ts/-/fp-ts-1.19.5.tgz" integrity sha512-wDNqTimnzs8QqpldiId9OavWK2NptormjXnRJTQecNjzwfyp6P/8s/zG8e4h3ja3oqkKaY72UlTjQYt/1yXf9A== +fs-constants@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz" + integrity sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow== + fs-extra@^0.30.0: version "0.30.0" resolved "https://registry.npmjs.org/fs-extra/-/fs-extra-0.30.0.tgz" @@ -2881,6 +3152,20 @@ ganache@^7.1.0: bufferutil "4.0.5" utf-8-validate "5.0.7" +gauge@~2.7.3: + version "2.7.4" + resolved "https://registry.yarnpkg.com/gauge/-/gauge-2.7.4.tgz#2c03405c7538c39d7eb37b317022e325fb018bf7" + integrity sha512-14x4kjc6lkD3ltw589k0NrPD6cCNTD6CWoVUNpB85+DrtONoZn+Rug6xZU5RvSC4+TZPxA5AnBibQYAvZn41Hg== + dependencies: + aproba "^1.0.3" + console-control-strings "^1.0.0" + has-unicode "^2.0.0" + object-assign "^4.1.0" + signal-exit "^3.0.0" + string-width "^1.0.1" + strip-ansi "^3.0.1" + wide-align "^1.1.0" + get-caller-file@^2.0.5: version "2.0.5" resolved "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz" @@ -2929,6 +3214,11 @@ ghost-testrpc@^0.0.2: chalk "^2.4.2" node-emoji "^1.10.0" +github-from-package@0.0.0: + version "0.0.0" + resolved "https://registry.npmjs.org/github-from-package/-/github-from-package-0.0.0.tgz" + integrity sha512-SyHy3T1v2NUXn29OsWdxmK6RwHD+vkj3v8en8AOBZ1wBQ/hCAQ5bAQTD02kW4W9tUp/3Qh6J8r9EvntiyCmOOw== + glob-parent@^5.1.2, glob-parent@~5.1.2: version "5.1.2" resolved "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz" @@ -3167,6 +3457,11 @@ has-tostringtag@^1.0.0: dependencies: has-symbols "^1.0.2" +has-unicode@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/has-unicode/-/has-unicode-2.0.1.tgz#e0e6fe6a28cf51138855e086d1691e771de2a8b9" + integrity sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ== + has@^1.0.3: version "1.0.4" resolved "https://registry.npmjs.org/has/-/has-1.0.4.tgz" @@ -3275,7 +3570,7 @@ iconv-lite@0.4.24: dependencies: safer-buffer ">= 2.1.2 < 3" -ieee754@^1.2.1: +ieee754@^1.1.13, ieee754@^1.2.1: version "1.2.1" resolved "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz" integrity sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA== @@ -3316,7 +3611,7 @@ inherits@2, inherits@2.0.4, inherits@^2.0.1, inherits@^2.0.3, inherits@^2.0.4, i resolved "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz" integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== -ini@^1.3.5: +ini@^1.3.5, ini@~1.3.0: version "1.3.8" resolved "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz" integrity sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew== @@ -3335,6 +3630,13 @@ interpret@^1.0.0: resolved "https://registry.npmjs.org/interpret/-/interpret-1.4.0.tgz" integrity sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA== +invariant@2: + version "2.2.4" + resolved "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz" + integrity sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA== + dependencies: + loose-envify "^1.0.0" + io-ts@1.10.4: version "1.10.4" resolved "https://registry.npmjs.org/io-ts/-/io-ts-1.10.4.tgz" @@ -3407,6 +3709,13 @@ is-extglob@^2.1.1: resolved "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz" integrity sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ== +is-fullwidth-code-point@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz#ef9e31386f031a7f0d643af82fde50c457ef00cb" + integrity sha512-1pqUqRjkhPJ9miNq9SwMfdvi6lBJcd6eFxvfaivQhaH3SgisfiuudvFntdKOmxuee/77l+FPjKrQjWvmPjWrRw== + dependencies: + number-is-nan "^1.0.0" + is-fullwidth-code-point@^2.0.0: version "2.0.0" resolved "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz" @@ -3546,7 +3855,7 @@ js-sha3@0.8.0, js-sha3@^0.8.0: resolved "https://registry.npmjs.org/js-sha3/-/js-sha3-0.8.0.tgz" integrity sha512-gF1cRrHhIzNfToc802P800N8PpXS+evLLXfsVpowqmAFR9uwbi89WvXg2QspOmXL8QL86J4T1EpFu+yUkwJY3Q== -js-tokens@^4.0.0: +"js-tokens@^3.0.0 || ^4.0.0", js-tokens@^4.0.0: version "4.0.0" resolved "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz" integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== @@ -3750,7 +4059,7 @@ lodash.truncate@^4.4.2: resolved "https://registry.npmjs.org/lodash.truncate/-/lodash.truncate-4.4.2.tgz" integrity sha512-jttmRe7bRse52OsWIMDLaXxWqRAmtIUccAQ3garviCqJjafXOfNMO0yMfNpdD6zbGaTU0P5Nz7e7gAT6cKmJRw== -lodash@^4.17.11, lodash@^4.17.14, lodash@^4.17.15, lodash@^4.17.21: +lodash@^4.17.11, lodash@^4.17.14, lodash@^4.17.15, lodash@^4.17.20, lodash@^4.17.21: version "4.17.21" resolved "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz" integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== @@ -3768,6 +4077,13 @@ long@^4.0.0: resolved "https://registry.npmjs.org/long/-/long-4.0.0.tgz" integrity sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA== +loose-envify@^1.0.0: + version "1.4.0" + resolved "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz" + integrity sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q== + dependencies: + js-tokens "^3.0.0 || ^4.0.0" + lowercase-keys@^2.0.0: version "2.0.0" resolved "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz" @@ -3860,6 +4176,11 @@ mimic-response@^1.0.0: resolved "https://registry.npmjs.org/mimic-response/-/mimic-response-1.0.1.tgz" integrity sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ== +mimic-response@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/mimic-response/-/mimic-response-2.1.0.tgz#d13763d35f613d09ec37ebb30bac0469c0ee8f43" + integrity sha512-wXqjST+SLt7R009ySCglWBCFpjUygmCIfD790/kVbiGmUgfYGuB14PiTd5DwVxSV4NcYHjzMkoj5LjQZwTQLEA== + mimic-response@^3.1.0: version "3.1.0" resolved "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz" @@ -3896,7 +4217,7 @@ minimatch@^5.0.1: dependencies: brace-expansion "^2.0.1" -minimist@^1.2.0, minimist@^1.2.5, minimist@^1.2.6: +minimist@^1.2.0, minimist@^1.2.3, minimist@^1.2.5, minimist@^1.2.6: version "1.2.8" resolved "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz" integrity sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA== @@ -3921,6 +4242,11 @@ minizlib@^2.1.1: minipass "^3.0.0" yallist "^4.0.0" +mkdirp-classic@^0.5.2, mkdirp-classic@^0.5.3: + version "0.5.3" + resolved "https://registry.npmjs.org/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz" + integrity sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A== + mkdirp@0.5.x: version "0.5.6" resolved "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz" @@ -3987,11 +4313,21 @@ mustache@^4.0.0: resolved "https://registry.npmjs.org/mustache/-/mustache-4.2.0.tgz" integrity sha512-71ippSywq5Yb7/tVYyGbkBggbU8H3u5Rz56fH60jGFgr8uHwxs+aSKeqmluIVzM0m0kB7xQjKS6qPfd0b2ZoqQ== +nan@^2.14.0: + version "2.18.0" + resolved "https://registry.yarnpkg.com/nan/-/nan-2.18.0.tgz#26a6faae7ffbeb293a39660e88a76b82e30b7554" + integrity sha512-W7tfG7vMOGtD30sHoZSSc/JVYiyDPEyQVso/Zz+/uQd0B0L46gtC+pHha5FFMRpil6fm/AoEcRWyOVi4+E/f8w== + nanoid@3.3.3: version "3.3.3" resolved "https://registry.npmjs.org/nanoid/-/nanoid-3.3.3.tgz" integrity sha512-p1sjXuopFs0xg+fPASzQ28agW1oHD7xDsd9Xkf3T15H3c/cifrFHVwrh74PdoklAPi+i7MdRsE47vm2r6JoB+w== +napi-build-utils@^1.0.1: + version "1.0.2" + resolved "https://registry.npmjs.org/napi-build-utils/-/napi-build-utils-1.0.2.tgz" + integrity sha512-ONmRUqK7zj7DWX0D9ADe03wbwOBZxNAfF20PlGfCWQcD3+/MakShIHrMqx9YwPTfxDdF1zLeL+RGZiR9kGMLdg== + napi-macros@^2.2.2: version "2.2.2" resolved "https://registry.npmjs.org/napi-macros/-/napi-macros-2.2.2.tgz" @@ -4060,11 +4396,40 @@ neo-async@^2.6.2: resolved "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz" integrity sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw== +node-abi@^2.18.0, node-abi@^2.21.0, node-abi@^2.7.0: + version "2.30.1" + resolved "https://registry.yarnpkg.com/node-abi/-/node-abi-2.30.1.tgz#c437d4b1fe0e285aaf290d45b45d4d7afedac4cf" + integrity sha512-/2D0wOQPgaUWzVSVgRMx+trKJRC2UG4SUc4oCJoXx9Uxjtp0Vy3/kt7zcbxHF8+Z/pK3UloLWzBISg72brfy1w== + dependencies: + semver "^5.4.1" + +node-abi@^3.3.0: + version "3.51.0" + resolved "https://registry.npmjs.org/node-abi/-/node-abi-3.51.0.tgz" + integrity sha512-SQkEP4hmNWjlniS5zdnfIXTk1x7Ome85RDzHlTbBtzE97Gfwz/Ipw4v/Ryk20DWIy3yCNVLVlGKApCnmvYoJbA== + dependencies: + semver "^7.3.5" + node-addon-api@^2.0.0: version "2.0.2" resolved "https://registry.npmjs.org/node-addon-api/-/node-addon-api-2.0.2.tgz" integrity sha512-Ntyt4AIXyaLIuMHF6IOoTakB3K+RWxwtsHNRxllEoA6vPwP9o4866g6YWDLUdnucilZhmkxiHwHr11gAENw+QA== +node-addon-api@^3.0.2: + version "3.2.1" + resolved "https://registry.npmjs.org/node-addon-api/-/node-addon-api-3.2.1.tgz" + integrity sha512-mmcei9JghVNDYydghQmeDX8KoAm0FAiYyIcUt/N4nhyAipB17pllZQDOJD2fotxABnt4Mdz+dKTO7eftLg4d0A== + +node-addon-api@^4.2.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/node-addon-api/-/node-addon-api-4.3.0.tgz#52a1a0b475193e0928e98e0426a0d1254782b77f" + integrity sha512-73sE9+3UaLYYFmDsFZnqCInzPyh3MqIwZO9cw58yIqAZhONrrabrYyYe3TuIqtIiOuTXVhsGau8hcrhhwSsDIQ== + +node-addon-api@^6.0.0: + version "6.1.0" + resolved "https://registry.npmjs.org/node-addon-api/-/node-addon-api-6.1.0.tgz" + integrity sha512-+eawOlIgy680F0kBzPUNFhMZGtJ1YmqM6l4+Crf4IkImjYrO/mqPwRMh352g23uIaQKFItcQ64I7KMaJxHgAVA== + node-emoji@^1.10.0: version "1.11.0" resolved "https://registry.npmjs.org/node-emoji/-/node-emoji-1.11.0.tgz" @@ -4084,16 +4449,49 @@ node-gyp-build@4.4.0: resolved "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.4.0.tgz" integrity sha512-amJnQCcgtRVw9SvoebO3BKGESClrfXGCUTX9hSn1OuGQTQBOZmVd0Z0OlecpuRksKvbsUqALE8jls/ErClAPuQ== -node-gyp-build@^4.2.0, node-gyp-build@^4.3.0: +node-gyp-build@^4.2.0, node-gyp-build@^4.3.0, node-gyp-build@^4.5.0: version "4.6.1" resolved "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.6.1.tgz" integrity sha512-24vnklJmyRS8ViBNI8KbtK/r/DmXQMRiOMXTNz2nrTnAYUwjmEEbnnpB/+kt+yWRv73bPsSPRFddrcIbAxSiMQ== +node-hid@1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/node-hid/-/node-hid-1.3.0.tgz#346a468505cee13d69ccd760052cbaf749f66a41" + integrity sha512-BA6G4V84kiNd1uAChub/Z/5s/xS3EHBCxotQ0nyYrUG65mXewUDHE1tWOSqA2dp3N+mV0Ffq9wo2AW9t4p/G7g== + dependencies: + bindings "^1.5.0" + nan "^2.14.0" + node-abi "^2.18.0" + prebuild-install "^5.3.4" + +node-hid@2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/node-hid/-/node-hid-2.1.1.tgz#f83c8aa0bb4e6758b5f7383542477da93f67359d" + integrity sha512-Skzhqow7hyLZU93eIPthM9yjot9lszg9xrKxESleEs05V2NcbUptZc5HFqzjOkSmL0sFlZFr3kmvaYebx06wrw== + dependencies: + bindings "^1.5.0" + node-addon-api "^3.0.2" + prebuild-install "^6.0.0" + +node-hid@^2.1.2: + version "2.1.2" + resolved "https://registry.npmjs.org/node-hid/-/node-hid-2.1.2.tgz" + integrity sha512-qhCyQqrPpP93F/6Wc/xUR7L8mAJW0Z6R7HMQV8jCHHksAxNDe/4z4Un/H9CpLOT+5K39OPyt9tIQlavxWES3lg== + dependencies: + bindings "^1.5.0" + node-addon-api "^3.0.2" + prebuild-install "^7.1.1" + node-port-check@^2.0.1: version "2.0.1" resolved "https://registry.npmjs.org/node-port-check/-/node-port-check-2.0.1.tgz" integrity sha512-PV1tj5OPbWwxvhPcChXxwCIKl/IfVEdPP4u/gQz2lao/VGoeIUXb/4U72KSHLZpTVBmgTnMm0me7yR0wUsIuPg== +noop-logger@^0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/noop-logger/-/noop-logger-0.1.1.tgz#94a2b1633c4f1317553007d8966fd0e841b6a4c2" + integrity sha512-6kM8CLXvuW5crTxsAtva2YLrRrDaiTIkIePWs9moLHqbFWT94WpNFjwS/5dfLfECg5i/lkmw3aoqVidxt23TEQ== + nopt@3.x: version "3.0.6" resolved "https://registry.npmjs.org/nopt/-/nopt-3.0.6.tgz" @@ -4111,6 +4509,21 @@ normalize-url@^6.0.1: resolved "https://registry.npmjs.org/normalize-url/-/normalize-url-6.1.0.tgz" integrity sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A== +npmlog@^4.0.1: + version "4.1.2" + resolved "https://registry.yarnpkg.com/npmlog/-/npmlog-4.1.2.tgz#08a7f2a8bf734604779a9efa4ad5cc717abb954b" + integrity sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg== + dependencies: + are-we-there-yet "~1.1.2" + console-control-strings "~1.1.0" + gauge "~2.7.3" + set-blocking "~2.0.0" + +number-is-nan@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/number-is-nan/-/number-is-nan-1.0.1.tgz#097b602b53422a522c1afb8790318336941a011d" + integrity sha512-4jbtZXNAsfZbAHiiqjLPBiCl16dES1zI4Hpzzxw61Tk+loF+sBDBKx1ICKKKwIqQ7M0mFn1TmkN7euSncWgHiQ== + number-to-bn@1.7.0: version "1.7.0" resolved "https://registry.npmjs.org/number-to-bn/-/number-to-bn-1.7.0.tgz" @@ -4326,6 +4739,64 @@ pluralize@^8.0.0: resolved "https://registry.npmjs.org/pluralize/-/pluralize-8.0.0.tgz" integrity sha512-Nc3IT5yHzflTfbjgqWcCPpo7DaKy4FnpB0l/zCAW0Tc7jxAiuqSxHasntB3D7887LSrA93kDJ9IXovxJYxyLCA== +prebuild-install@^5.3.4: + version "5.3.6" + resolved "https://registry.yarnpkg.com/prebuild-install/-/prebuild-install-5.3.6.tgz#7c225568d864c71d89d07f8796042733a3f54291" + integrity sha512-s8Aai8++QQGi4sSbs/M1Qku62PFK49Jm1CbgXklGz4nmHveDq0wzJkg7Na5QbnO1uNH8K7iqx2EQ/mV0MZEmOg== + dependencies: + detect-libc "^1.0.3" + expand-template "^2.0.3" + github-from-package "0.0.0" + minimist "^1.2.3" + mkdirp-classic "^0.5.3" + napi-build-utils "^1.0.1" + node-abi "^2.7.0" + noop-logger "^0.1.1" + npmlog "^4.0.1" + pump "^3.0.0" + rc "^1.2.7" + simple-get "^3.0.3" + tar-fs "^2.0.0" + tunnel-agent "^0.6.0" + which-pm-runs "^1.0.0" + +prebuild-install@^6.0.0: + version "6.1.4" + resolved "https://registry.yarnpkg.com/prebuild-install/-/prebuild-install-6.1.4.tgz#ae3c0142ad611d58570b89af4986088a4937e00f" + integrity sha512-Z4vpywnK1lBg+zdPCVCsKq0xO66eEV9rWo2zrROGGiRS4JtueBOdlB1FnY8lcy7JsUud/Q3ijUxyWN26Ika0vQ== + dependencies: + detect-libc "^1.0.3" + expand-template "^2.0.3" + github-from-package "0.0.0" + minimist "^1.2.3" + mkdirp-classic "^0.5.3" + napi-build-utils "^1.0.1" + node-abi "^2.21.0" + npmlog "^4.0.1" + pump "^3.0.0" + rc "^1.2.7" + simple-get "^3.0.3" + tar-fs "^2.0.0" + tunnel-agent "^0.6.0" + +prebuild-install@^7.1.1: + version "7.1.1" + resolved "https://registry.npmjs.org/prebuild-install/-/prebuild-install-7.1.1.tgz" + integrity sha512-jAXscXWMcCK8GgCoHOfIr0ODh5ai8mj63L2nWrjuAgXE6tDyYGnx4/8o/rCgU+B4JSyZBKbeZqzhtwtC3ovxjw== + dependencies: + detect-libc "^2.0.0" + expand-template "^2.0.3" + github-from-package "0.0.0" + minimist "^1.2.3" + mkdirp-classic "^0.5.3" + napi-build-utils "^1.0.1" + node-abi "^3.3.0" + pump "^3.0.0" + rc "^1.2.7" + simple-get "^4.0.0" + tar-fs "^2.0.0" + tunnel-agent "^0.6.0" + prelude-ls@~1.1.2: version "1.1.2" resolved "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz" @@ -4443,9 +4914,19 @@ raw-body@^2.4.1: iconv-lite "0.4.24" unpipe "1.0.0" -readable-stream@^2.2.2: +rc@^1.2.7: + version "1.2.8" + resolved "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz" + integrity sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw== + dependencies: + deep-extend "^0.6.0" + ini "~1.3.0" + minimist "^1.2.0" + strip-json-comments "~2.0.1" + +readable-stream@^2.0.6, readable-stream@^2.2.2: version "2.3.8" - resolved "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.8.tgz#91125e8042bba1b9887f49345f6277027ce8be9b" integrity sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA== dependencies: core-util-is "~1.0.0" @@ -4456,7 +4937,7 @@ readable-stream@^2.2.2: string_decoder "~1.1.1" util-deprecate "~1.0.1" -readable-stream@^3.6.0: +readable-stream@^3.1.1, readable-stream@^3.4.0, readable-stream@^3.6.0: version "3.6.2" resolved "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz" integrity sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA== @@ -4599,7 +5080,7 @@ ripemd160@^2.0.0, ripemd160@^2.0.1: hash-base "^3.0.0" inherits "^2.0.1" -rlp@^2.2.3: +rlp@^2.2.3, rlp@^2.2.6: version "2.2.7" resolved "https://registry.npmjs.org/rlp/-/rlp-2.2.7.tgz" integrity sha512-d5gdPmgQ0Z+AklL2NVXr/IoSjNZFfTVvQWzL/AM2AOcSzYP2xjlb0AC8YyCLc41MSNf6P6QVtjgPdmVtzb+4lQ== @@ -4625,6 +5106,13 @@ rustbn.js@~0.2.0: resolved "https://registry.npmjs.org/rustbn.js/-/rustbn.js-0.2.0.tgz" integrity sha512-4VlvkRUuCJvr2J6Y0ImW7NvTCriMi7ErOAqWk1y69vAdoNIzCF3yPmgeNzx+RQTLEDFq5sHfscn1MwHxP9hNfA== +rxjs@6: + version "6.6.7" + resolved "https://registry.npmjs.org/rxjs/-/rxjs-6.6.7.tgz" + integrity sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ== + dependencies: + tslib "^1.9.0" + safe-array-concat@^1.0.1: version "1.0.1" resolved "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.0.1.tgz" @@ -4693,9 +5181,9 @@ secp256k1@4.0.3, secp256k1@^4.0.1: node-addon-api "^2.0.0" node-gyp-build "^4.2.0" -semver@^5.5.0: +semver@^5.4.1, semver@^5.5.0: version "5.7.2" - resolved "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz" + resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.2.tgz#48d55db737c3287cd4835e17fa13feace1c41ef8" integrity sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g== semver@^6.1.0, semver@^6.3.0, semver@^6.3.1: @@ -4703,7 +5191,7 @@ semver@^6.1.0, semver@^6.3.0, semver@^6.3.1: resolved "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz" integrity sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA== -semver@^7.3.4, semver@^7.3.8, semver@^7.5.2: +semver@^7.3.4, semver@^7.3.5, semver@^7.3.8, semver@^7.5.2: version "7.5.4" resolved "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz" integrity sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA== @@ -4717,6 +5205,11 @@ serialize-javascript@6.0.0: dependencies: randombytes "^2.1.0" +set-blocking@~2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7" + integrity sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw== + set-function-name@^2.0.0: version "2.0.1" resolved "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.1.tgz" @@ -4777,6 +5270,34 @@ side-channel@^1.0.4: get-intrinsic "^1.0.2" object-inspect "^1.9.0" +signal-exit@^3.0.0: + version "3.0.7" + resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.7.tgz#a9a1767f8af84155114eaabd73f99273c8f59ad9" + integrity sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ== + +simple-concat@^1.0.0: + version "1.0.1" + resolved "https://registry.npmjs.org/simple-concat/-/simple-concat-1.0.1.tgz" + integrity sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q== + +simple-get@^3.0.3: + version "3.1.1" + resolved "https://registry.yarnpkg.com/simple-get/-/simple-get-3.1.1.tgz#cc7ba77cfbe761036fbfce3d021af25fc5584d55" + integrity sha512-CQ5LTKGfCpvE1K0n2us+kuMPbk/q0EKl82s4aheV9oXjFEz6W/Y7oQFVJuU6QG77hRT4Ghb5RURteF5vnWjupA== + dependencies: + decompress-response "^4.2.0" + once "^1.3.1" + simple-concat "^1.0.0" + +simple-get@^4.0.0: + version "4.0.1" + resolved "https://registry.npmjs.org/simple-get/-/simple-get-4.0.1.tgz" + integrity sha512-brv7p5WgH0jmQJr1ZDDfKDOSeWWg+OVypG99A/5vYGPqJ6pxiaHLy8nxtFjBA7oMa01ebA9gfh1uMCFqOuXxvA== + dependencies: + decompress-response "^6.0.0" + once "^1.3.1" + simple-concat "^1.0.0" + slash@^3.0.0: version "3.0.0" resolved "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz" @@ -4939,23 +5460,32 @@ string-similarity-js@^2.1.4: resolved "https://registry.npmjs.org/string-similarity-js/-/string-similarity-js-2.1.4.tgz" integrity sha512-uApODZNjCHGYROzDSAdCmAHf60L/pMDHnP/yk6TAbvGg7JSPZlSto/ceCI7hZEqzc53/juU2aOJFkM2yUVTMTA== -string-width@^2.1.1: - version "2.1.1" - resolved "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz" - integrity sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw== +string-width@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-1.0.2.tgz#118bdf5b8cdc51a2a7e70d211e07e2b0b9b107d3" + integrity sha512-0XsVpQLnVCXHJfyEs8tC0zpTVIr5PKKsQtkT29IwupnPTjtPmQ3xT/4yCREF9hYkV/3M3kzcUTSAZT6a6h81tw== dependencies: - is-fullwidth-code-point "^2.0.0" - strip-ansi "^4.0.0" + code-point-at "^1.0.0" + is-fullwidth-code-point "^1.0.0" + strip-ansi "^3.0.0" -string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3: +"string-width@^1.0.2 || 2 || 3 || 4", string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3: version "4.2.3" - resolved "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== dependencies: emoji-regex "^8.0.0" is-fullwidth-code-point "^3.0.0" strip-ansi "^6.0.1" +string-width@^2.1.1: + version "2.1.1" + resolved "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz" + integrity sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw== + dependencies: + is-fullwidth-code-point "^2.0.0" + strip-ansi "^4.0.0" + string.prototype.trim@^1.2.8: version "1.2.8" resolved "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.8.tgz" @@ -4997,6 +5527,13 @@ string_decoder@~1.1.1: dependencies: safe-buffer "~5.1.0" +strip-ansi@^3.0.0, strip-ansi@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-3.0.1.tgz#6a385fb8853d952d5ff05d0e8aaf94278dc63dcf" + integrity sha512-VhumSSbBqDTP8p2ZLKj40UjBCV4+v8bUSEpUb4KjRgWk9pbqGF4REFj6KEagidb2f/M6AzC0EmFyDNGaw9OCzg== + dependencies: + ansi-regex "^2.0.0" + strip-ansi@^4.0.0: version "4.0.0" resolved "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz" @@ -5028,6 +5565,11 @@ strip-json-comments@3.1.1: resolved "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz" integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig== +strip-json-comments@~2.0.1: + version "2.0.1" + resolved "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz" + integrity sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ== + supports-color@8.1.1: version "8.1.1" resolved "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz" @@ -5093,6 +5635,27 @@ table@^6.8.1: string-width "^4.2.3" strip-ansi "^6.0.1" +tar-fs@^2.0.0: + version "2.1.1" + resolved "https://registry.npmjs.org/tar-fs/-/tar-fs-2.1.1.tgz" + integrity sha512-V0r2Y9scmbDRLCNex/+hYzvp/zyYjvFbHPNgVTKfQvVrb6guiE/fxP+XblDNR011utopbkex2nM4dHNV6GDsng== + dependencies: + chownr "^1.1.1" + mkdirp-classic "^0.5.2" + pump "^3.0.0" + tar-stream "^2.1.4" + +tar-stream@^2.1.4: + version "2.2.0" + resolved "https://registry.npmjs.org/tar-stream/-/tar-stream-2.2.0.tgz" + integrity sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ== + dependencies: + bl "^4.0.3" + end-of-stream "^1.4.1" + fs-constants "^1.0.0" + inherits "^2.0.3" + readable-stream "^3.1.1" + tar@^6.1.0: version "6.2.0" resolved "https://registry.npmjs.org/tar/-/tar-6.2.0.tgz" @@ -5171,7 +5734,7 @@ tsconfig-paths@^3.14.2: minimist "^1.2.6" strip-bom "^3.0.0" -tslib@^1.9.3: +tslib@^1.9.0, tslib@^1.9.3: version "1.14.1" resolved "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz" integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg== @@ -5181,6 +5744,13 @@ tsort@0.0.1: resolved "https://registry.npmjs.org/tsort/-/tsort-0.0.1.tgz" integrity sha512-Tyrf5mxF8Ofs1tNoxA13lFeZ2Zrbd6cKbuH3V+MQ5sb6DtBj5FjrXVsRWT8YvNAQTqNoz66dz1WsbigI22aEnw== +tunnel-agent@^0.6.0: + version "0.6.0" + resolved "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz" + integrity sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w== + dependencies: + safe-buffer "^5.0.1" + tweetnacl-util@^0.15.1: version "0.15.1" resolved "https://registry.npmjs.org/tweetnacl-util/-/tweetnacl-util-0.15.1.tgz" @@ -5252,6 +5822,11 @@ typedarray@^0.0.6: resolved "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz" integrity sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA== +u2f-api@0.2.7: + version "0.2.7" + resolved "https://registry.npmjs.org/u2f-api/-/u2f-api-0.2.7.tgz" + integrity sha512-fqLNg8vpvLOD5J/z4B6wpPg4Lvowz1nJ9xdHcCzdUPKcFE/qNCceV2gNZxSJd5vhAZemHr/K/hbzVA0zxB5mkg== + u3@^0.1.1: version "0.1.1" resolved "https://registry.npmjs.org/u3/-/u3-0.1.1.tgz" @@ -5306,6 +5881,23 @@ uri-js@^4.2.2: dependencies: punycode "^2.1.0" +usb@2.9.0: + version "2.9.0" + resolved "https://registry.npmjs.org/usb/-/usb-2.9.0.tgz" + integrity sha512-G0I/fPgfHUzWH8xo2KkDxTTFruUWfppgSFJ+bQxz/kVY2x15EQ/XDB7dqD1G432G4gBG4jYQuF3U7j/orSs5nw== + dependencies: + "@types/w3c-web-usb" "^1.0.6" + node-addon-api "^6.0.0" + node-gyp-build "^4.5.0" + +usb@^1.6.3: + version "1.9.2" + resolved "https://registry.yarnpkg.com/usb/-/usb-1.9.2.tgz#fb6b36f744ecc707a196c45a6ec72442cb6f2b73" + integrity sha512-dryNz030LWBPAf6gj8vyq0Iev3vPbCLHCT8dBw3gQRXRzVNsIdeuU+VjPp3ksmSPkeMAl1k+kQ14Ij0QHyeiAg== + dependencies: + node-addon-api "^4.2.0" + node-gyp-build "^4.3.0" + utf-8-validate@5.0.7: version "5.0.7" resolved "https://registry.npmjs.org/utf-8-validate/-/utf-8-validate-5.0.7.tgz" @@ -5315,7 +5907,7 @@ utf-8-validate@5.0.7: utf-8-validate@6.0.3: version "6.0.3" - resolved "https://registry.yarnpkg.com/utf-8-validate/-/utf-8-validate-6.0.3.tgz#7d8c936d854e86b24d1d655f138ee27d2636d777" + resolved "https://registry.npmjs.org/utf-8-validate/-/utf-8-validate-6.0.3.tgz" integrity sha512-uIuGf9TWQ/y+0Lp+KGZCMuJWc3N9BHA+l/UmHd/oUHwJJDeysyTRxNQVkbzsIWfGFbRe3OcgML/i0mvVRPOyDA== dependencies: node-gyp-build "^4.3.0" @@ -5373,6 +5965,11 @@ which-boxed-primitive@^1.0.2: is-string "^1.0.5" is-symbol "^1.0.3" +which-pm-runs@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/which-pm-runs/-/which-pm-runs-1.1.0.tgz#35ccf7b1a0fce87bd8b92a478c9d045785d3bf35" + integrity sha512-n1brCuqClxfFfq/Rb0ICg9giSZqCS+pLtccdag6C2HyufBrh3fBOiy9nb6ggRMvWOVH5GrdJskj5iGTZNxd7SA== + which-typed-array@^1.1.11: version "1.1.11" resolved "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.11.tgz" @@ -5391,6 +5988,13 @@ which@^1.1.1, which@^1.3.1: dependencies: isexe "^2.0.0" +wide-align@^1.1.0: + version "1.1.5" + resolved "https://registry.yarnpkg.com/wide-align/-/wide-align-1.1.5.tgz#df1d4c206854369ecf3c9a4898f1b23fbd9d15d3" + integrity sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg== + dependencies: + string-width "^1.0.2 || 2 || 3 || 4" + word-wrap@~1.2.3: version "1.2.5" resolved "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz"