From 2b61267a6aaf76c2f5ff923bcf98d8f4334b2107 Mon Sep 17 00:00:00 2001 From: PlayJoker Date: Wed, 19 Apr 2023 16:55:54 -0700 Subject: [PATCH 01/29] Jia pool on both goerli and polygon --- deployment/goerli-deployed-contracts.json | 10 +- deployment/goerli-initialized-contracts.json | 26 +- deployment/goerli-verified-contracts.json | 10 +- deployment/goerli/deploy-goerli-jia-pool.js | 66 ++++ .../goerli/init-goerli-jia-pool-defender.js | 366 ++++++++++++++++++ deployment/goerli/verify-goerli-jia-pool.js | 169 ++++++++ deployment/matic-deployed-contracts.json | 50 +-- deployment/matic-initialized-contracts.json | 6 +- deployment/matic-verified-contracts.json | 3 +- deployment/polygon/deploy-jia-pioneer-pool.js | 66 ++++ .../polygon/init-jia-pioneer-pool-defender.js | 345 +++++++++++++++++ .../polygon/upgrade-base-credit-pool.js | 83 ++++ deployment/polygon/verify-Jia-pioneer-pool.js | 169 ++++++++ deployment/utils.js | 4 +- hardhat.config.js | 4 + scripts/cancel-pending-txs.js | 10 +- 16 files changed, 1342 insertions(+), 45 deletions(-) create mode 100644 deployment/goerli/deploy-goerli-jia-pool.js create mode 100644 deployment/goerli/init-goerli-jia-pool-defender.js create mode 100644 deployment/goerli/verify-goerli-jia-pool.js create mode 100644 deployment/polygon/deploy-jia-pioneer-pool.js create mode 100644 deployment/polygon/init-jia-pioneer-pool-defender.js create mode 100644 deployment/polygon/upgrade-base-credit-pool.js create mode 100644 deployment/polygon/verify-Jia-pioneer-pool.js diff --git a/deployment/goerli-deployed-contracts.json b/deployment/goerli-deployed-contracts.json index a5b99a45..f73ecd39 100644 --- a/deployment/goerli-deployed-contracts.json +++ b/deployment/goerli-deployed-contracts.json @@ -18,4 +18,12 @@ "HDT":"0x27Fa332a5cA06492C2007FF4b143C921Cf779C3b", "ReceivableFactoringPoolConfig":"0xBa779F41ae414dEc63265D79a02DED47fbe007a5", "ReceivableFactoringPoolImpl":"0x470f71B48B42BE5B4B47D9f9A407bDA98DbDEb8D", -"ReceivableFactoringPool":"0x11672c0bBFF498c72BC2200f42461c0414855042"} \ No newline at end of file +"ReceivableFactoringPool":"0x11672c0bBFF498c72BC2200f42461c0414855042", +"JiaPoolTimelock":"0x8DF7BBae57F1215eE8294D084E08B6a02076eAA5", +"JiaPoolProxyAdminTimelock":"0x87Da18395dc7CE21e0E72e1B01dca0826635FCf0", +"JiaPoolFeeManager":"0x4630ceAedb030b6ad1DCa0E58c3576aa33042b4C", +"JiaHDTImpl":"0x3f95c365aa092E3dF020Bf7E6582E371998Ada4A", +"JiaHDT":"0xAD5e1F01618A2A158097C21866B4e8DCEEA2aC25", +"JiaPoolConfig":"0x9b8513bF9A56E609e66F360B550b7c8724129a05", +"JiaPoolImpl":"0xEb204D979c7aBcA473a0BC780dDf6Ca45E84422f", +"JiaPool":"0x07fd5720FE4d7993550d147c8753A9e60b45940D"} \ No newline at end of file diff --git a/deployment/goerli-initialized-contracts.json b/deployment/goerli-initialized-contracts.json index f716231b..a1a2b1c5 100644 --- a/deployment/goerli-initialized-contracts.json +++ b/deployment/goerli-initialized-contracts.json @@ -1,12 +1,14 @@ -{ - "EANFT": "Done", - "HumaConfig": "Done", - "BaseCreditPoolFeeManager": "Done", - "BaseCreditHDT": "Done", - "BaseCreditPoolConfig": "Done", - "BaseCreditPool": "Done", - "ReceivableFactoringPoolFeeManager": "Done", - "HDT": "Done", - "ReceivableFactoringPoolConfig": "Done", - "ReceivableFactoringPool": "Done" -} \ No newline at end of file +{"EANFT":"Done", +"HumaConfig":"Done", +"BaseCreditPoolFeeManager":"Done", +"BaseCreditHDT":"Done", +"BaseCreditPoolConfig":"Done", +"BaseCreditPool":"Done", +"ReceivableFactoringPoolFeeManager":"Done", +"HDT":"Done", +"ReceivableFactoringPoolConfig":"Done", +"ReceivableFactoringPool":"Done", +"JiaPoolFeeManager":"Done", +"JiaHDT":"Done", +"JiaPoolConfig":"Done", +"JiaPool":"Done"} \ No newline at end of file diff --git a/deployment/goerli-verified-contracts.json b/deployment/goerli-verified-contracts.json index be219128..d7952cf3 100644 --- a/deployment/goerli-verified-contracts.json +++ b/deployment/goerli-verified-contracts.json @@ -18,4 +18,12 @@ "HDT":"Done", "ReceivableFactoringPoolConfig":"Done", "ReceivableFactoringPoolImpl":"Done", -"ReceivableFactoringPool":"Done"} \ No newline at end of file +"ReceivableFactoringPool":"Done", +"JiaPoolTimelock":"Done", +"JiaPoolProxyAdminTimelock":"Done", +"JiaPoolFeeManager":"Done", +"JiaHDTImpl":"Done", +"JiaHDT":"Done", +"JiaPoolConfig":"Done", +"JiaPoolImpl":"Done", +"JiaPool":"Done"} \ No newline at end of file diff --git a/deployment/goerli/deploy-goerli-jia-pool.js b/deployment/goerli/deploy-goerli-jia-pool.js new file mode 100644 index 00000000..78ac9aa1 --- /dev/null +++ b/deployment/goerli/deploy-goerli-jia-pool.js @@ -0,0 +1,66 @@ +const {deploy} = require("../utils.js"); + +const HUMA_OWNER_MULTI_SIG='0x1931bD73055335Ba06efB22DB96169dbD4C5B4DB'; +const POOL_OWNER_MULTI_SIG='0x7dC4018464e724fB2B04d9aC0df6D40B34786318'; + +async function deployContracts() { + const network = (await hre.ethers.provider.getNetwork()).name; + console.log("network : ", network); + const accounts = await hre.ethers.getSigners(); + if (accounts.length == 0) { + throw new Error("Accounts not set!"); + } + const deployer = await accounts[0]; + console.log("deployer address: " + deployer.address); + + const eaService = await accounts[4]; + console.log("ea service address: " + eaService.address); + + const usdc = await deploy("TestToken", "USDC"); + const evaluationAgentNFT = await deploy("EvaluationAgentNFT", "EANFT", [], eaService); + const invoiceNFT = await deploy("InvoiceNFT", "RNNFT", [usdc.address]); + + const humaConfig = await deploy("HumaConfig", "HumaConfig"); + const humaConfigTL = await deploy("TimelockController", "HumaConfigTimelock", [ + 0, + [HUMA_OWNER_MULTI_SIG], + [deployer.address], + ]); + + const baseCreditPoolTL = await deploy("TimelockController", "JiaPoolTimelock", [ + 0, + [POOL_OWNER_MULTI_SIG], + [deployer.address], + ]); + + const baseCreditPoolProxyAdminTL = await deploy("TimelockController", "JiaPoolProxyAdminTimelock", [ + 0, + [POOL_OWNER_MULTI_SIG], + [deployer.address], + ]); + + const bc_feeManager = await deploy("BaseFeeManager", "JiaPoolFeeManager"); + const bc_hdtImpl = await deploy("HDT", "JiaHDTImpl"); + const bc_hdt = await deploy("TransparentUpgradeableProxy", "JiaHDT", [ + bc_hdtImpl.address, + baseCreditPoolProxyAdminTL.address, + [], + ]); + const bc_poolConfig = await deploy("BasePoolConfig", "JiaPoolConfig"); + + const bc_poolImpl = await deploy("BaseCreditPool", "JiaPoolImpl"); + const bc_pool = await deploy("TransparentUpgradeableProxy", "JiaPool", [ + bc_poolImpl.address, + baseCreditPoolProxyAdminTL.address, + [], + ]); + // End of deploying base credit pool + +} + +deployContracts() + .then(() => process.exit(0)) + .catch((error) => { + console.error(error); + process.exit(1); + }); diff --git a/deployment/goerli/init-goerli-jia-pool-defender.js b/deployment/goerli/init-goerli-jia-pool-defender.js new file mode 100644 index 00000000..c91e0b17 --- /dev/null +++ b/deployment/goerli/init-goerli-jia-pool-defender.js @@ -0,0 +1,366 @@ +const {BigNumber: BN} = require("ethers"); +const { + getInitilizedContract, + updateInitilizedContract, + getDeployedContracts, + sendTransaction, +} = require("../utils.js"); + +let deployer, deployedContracts, lender, ea, eaService; +let pdsService, treasury, ea_bcp, bcpOperator, rfpOperator; +let bcpOwnerTreasury, rfpOwnerTreasury; + +const HUMA_OWNER_MULTI_SIG='0x1931bD73055335Ba06efB22DB96169dbD4C5B4DB'; +const POOL_OWNER_MULTI_SIG='0x7dC4018464e724fB2B04d9aC0df6D40B34786318'; + +async function transferOwnershipToTL(contractName, contractKey, timeLockKey) { + if (!deployedContracts[timeLockKey]) { + throw new Error(`${timeLockKey} not deployed yet!`); + } + + if (!deployedContracts[contractKey]) { + throw new Error(`${contractKey} not deployed yet!`); + } + + const TimeLockController = await hre.ethers.getContractFactory("TimelockController"); + const timeLockController = TimeLockController.attach(deployedContracts[timeLockKey]); + + const Contract = await hre.ethers.getContractFactory(contractName); + const contract = Contract.attach(deployedContracts[contractKey]); + + await sendTransaction(contractKey, contract, "transferOwnership", [timeLockController.address]); + + const adminRole = await timeLockController.TIMELOCK_ADMIN_ROLE(); + await sendTransaction(contractKey, timeLockController, "renounceRole", [ + adminRole, + deployer.address, + ]); +} + +async function initHumaConfig() { + const initilized = await getInitilizedContract("HumaConfig"); + if (initilized) { + console.log("HumaConfig is already initialized!"); + return; + } + + if (!deployedContracts["HumaConfig"]) { + throw new Error("HumaConfig not deployed yet!"); + } + + if (!deployedContracts["EANFT"]) { + throw new Error("EANFT not deployed yet!"); + } + + if (!deployedContracts["USDC"]) { + throw new Error("USDC not deployed yet!"); + } + + const HumaConfig = await hre.ethers.getContractFactory("HumaConfig"); + const humaConfig = HumaConfig.attach(deployedContracts["HumaConfig"]); + + await sendTransaction("HumaConfig", humaConfig, "setProtocolDefaultGracePeriod", [ + 30 * 24 * 3600, + ]); + await sendTransaction("HumaConfig", humaConfig, "setTreasuryFee", [500]); + await sendTransaction("HumaConfig", humaConfig, "setEANFTContractAddress", [ + deployedContracts["EANFT"], + ]); + + await sendTransaction("HumaConfig", humaConfig, "setEAServiceAccount", [eaService.address]); + await sendTransaction("HumaConfig", humaConfig, "setPDSServiceAccount", [pdsService.address]); + + const USDC = await hre.ethers.getContractFactory("TestToken"); + const usdc = USDC.attach(deployedContracts["USDC"]); + + // Add usdc as an asset supported by the protocol + await sendTransaction("HumaConfig", humaConfig, "setLiquidityAsset", [usdc.address, true]); + + // Set treasury for the protocol + await sendTransaction("HumaConfig", humaConfig, "setHumaTreasury", [treasury.address]); + + await transferOwnershipToTL("HumaConfig", "HumaConfig", "HumaConfigTimelock") + + await updateInitilizedContract("HumaConfig"); +} + +async function initEA() { + const initilized = await getInitilizedContract("EANFT"); + if (initilized) { + console.log("EANFT is already initialized!"); + return; + } + + if (!deployedContracts["EANFT"]) { + throw new Error("EANFT not deployed yet!"); + } + + const EANFT = await hre.ethers.getContractFactory("EvaluationAgentNFT"); + const eaNFT = EANFT.attach(deployedContracts["EANFT"]); + + const eaNFTFromEA = eaNFT.connect(ea); + await sendTransaction("EvaluationAgentNFT", eaNFTFromEA, "mintNFT", [ea.address]); + const eaNFTFromEA_bcp = eaNFT.connect(ea); + await sendTransaction("EvaluationAgentNFT", eaNFTFromEA_bcp, "mintNFT", [ea_bcp.address]); + await updateInitilizedContract("EANFT"); +} + +async function initBaseCreditPoolFeeManager() { + const initilized = await getInitilizedContract("JiaPoolFeeManager"); + if (initilized) { + console.log("JiaPoolFeeManager is already initialized!"); + return; + } + + if (!deployedContracts["JiaPoolFeeManager"]) { + throw new Error("JiaPoolFeeManager not deployed yet!"); + } + + const BaseFeeManager = await hre.ethers.getContractFactory("BaseFeeManager"); + const feeManager = BaseFeeManager.attach(deployedContracts["JiaPoolFeeManager"]); + + await sendTransaction( + "JiaPoolFeeManager", + feeManager, + "setFees", + [10_000_000, 0, 20_000_000, 0, 5_000_000] + ); + // await sendTransaction("FeeManager", feeManager, "setMinPrincipalRateInBps", [0]); + + await transferOwnershipToTL("BaseFeeManager", "JiaPoolFeeManager", "JiaPoolTimelock"); + + await updateInitilizedContract("JiaPoolFeeManager"); +} + +async function initBaseCreditPoolHDT() { + const initilized = await getInitilizedContract("JiaHDT"); + if (initilized) { + console.log("JiaHDT is already initialized!"); + return; + } + + if (!deployedContracts["JiaHDT"]) { + throw new Error("JiaHDT not deployed yet!"); + } + + const HDT = await hre.ethers.getContractFactory("HDT"); + const hdt = HDT.attach(deployedContracts["JiaHDT"]); + + if (!deployedContracts["USDC"]) { + throw new Error("USDC not deployed yet!"); + } + + if (!deployedContracts["JiaPool"]) { + throw new Error("JiaPool not deployed yet!"); + } + + await sendTransaction("HDT", hdt, "initialize", [ + "Jia HDT", + "JHDT", + deployedContracts["USDC"], + ]); + + await sendTransaction("HDT", hdt, "setPool", [deployedContracts["JiaPool"]]); + + await transferOwnershipToTL("HDT", "JiaHDT", "JiaPoolTimelock"); + + await updateInitilizedContract("JiaHDT"); +} + +async function initBaseCreditPoolConfig() { + const initilized = await getInitilizedContract("JiaPoolConfig"); + if (initilized) { + console.log("JiaPoolConfig is already initialized!"); + return; + } + + if (!deployedContracts["JiaPoolConfig"]) { + throw new Error("JiaPoolConfig not deployed yet!"); + } + + const ReceivableFactoringPoolConfig = await hre.ethers.getContractFactory("BasePoolConfig"); + const poolConfig = ReceivableFactoringPoolConfig.attach( + deployedContracts["JiaPoolConfig"] + ); + + if (!deployedContracts["JiaPool"]) { + throw new Error("JiaPool not deployed yet!"); + } + + if (!deployedContracts["JiaHDT"]) { + throw new Error("JiaHDT not deployed yet!"); + } + + if (!deployedContracts["HumaConfig"]) { + throw new Error("HumaConfig not deployed yet!"); + } + + if (!deployedContracts["JiaPoolFeeManager"]) { + throw new Error("JiaPoolFeeManager not deployed yet!"); + } + + const HDT = await hre.ethers.getContractFactory("HDT"); + const hdt = HDT.attach(deployedContracts["JiaHDT"]); + + const HumaConfig = await hre.ethers.getContractFactory("HumaConfig"); + const humaConfig = HumaConfig.attach(deployedContracts["HumaConfig"]); + + const BaseFeeManager = await hre.ethers.getContractFactory("BaseFeeManager"); + const feeManager = BaseFeeManager.attach(deployedContracts["JiaPoolFeeManager"]); + + await sendTransaction("JiaPoolConfig", poolConfig, "initialize", [ + "JiaPool", + hdt.address, + humaConfig.address, + feeManager.address, + ]); + + const decimals = await hdt.decimals(); + const cap = BN.from(1_000_000).mul(BN.from(10).pow(BN.from(decimals))); + console.log("cap: " + cap); + await sendTransaction("JiaPoolConfig", poolConfig, "setPoolLiquidityCap", [cap]); + + await sendTransaction("JiaPoolConfig", poolConfig, "setPool", [ + deployedContracts["JiaPool"], + ]); + + await sendTransaction( + "JiaPoolConfig", + poolConfig, + "setPoolOwnerRewardsAndLiquidity", + [500, 200] + ); + await sendTransaction( + "JiaPoolConfig", + poolConfig, + "setEARewardsAndLiquidity", + [1000, 100] + ); + + await sendTransaction("JiaPoolConfig", poolConfig, "setEvaluationAgent", [ + 2, + ea_bcp.address, + ]); + + const maxCL = BN.from(10_000).mul(BN.from(10).pow(BN.from(decimals))); + console.log("maxCL: " + maxCL); + await sendTransaction("JiaPoolConfig", poolConfig, "setMaxCreditLine", [maxCL]); + await sendTransaction("JiaPoolConfig", poolConfig, "setAPR", [1000]); + await sendTransaction("JiaPoolConfig", poolConfig, "setReceivableRequiredInBps", [0]); + await sendTransaction("JiaPoolConfig", poolConfig, "setPoolPayPeriod", [15]); + await sendTransaction("JiaPoolConfig", poolConfig, "setPoolToken", [ + deployedContracts["JiaHDT"], + ]); + await sendTransaction("JiaPoolConfig", poolConfig, "setWithdrawalLockoutPeriod", [0]); + await sendTransaction("JiaPoolConfig", poolConfig, "setPoolDefaultGracePeriod", [60]); + await sendTransaction("JiaPoolConfig", poolConfig, "addPoolOperator", [bcpOperator.address]); + await sendTransaction("JiaPoolConfig", poolConfig, "setPoolOwnerTreasury", [bcpOwnerTreasury.address]); + + await sendTransaction("JiaPoolConfig", poolConfig, "setCreditApprovalExpiration", [5]); + + await transferOwnershipToTL("BasePoolConfig", "JiaPoolConfig", "JiaPoolTimelock"); + + await updateInitilizedContract("JiaPoolConfig"); +} + +async function initBaseCreditPool() { + const initilized = await getInitilizedContract("JiaPool"); + if (initilized) { + console.log("JiaPool is already initialized!"); + return; + } + + if (!deployedContracts["JiaPool"]) { + throw new Error("JiaPool not deployed yet!"); + } + + if (!deployedContracts["JiaPoolConfig"]) { + throw new Error("JiaPoolConfig not deployed yet!"); + } + + const ReceivableFactoringPool = await hre.ethers.getContractFactory("BaseCreditPool"); + const pool = ReceivableFactoringPool.attach(deployedContracts["JiaPool"]); + + await sendTransaction("JiaPool", pool, "initialize", [ + deployedContracts["JiaPoolConfig"], + ]); + + await updateInitilizedContract("JiaPool"); +} + +async function prepareBaseCreditPool() { + // The operations commented off need to run with TL on Defender + if (!deployedContracts["JiaPool"]) { + throw new Error("JiaPool not deployed yet!"); + } + if (!deployedContracts["USDC"]) { + throw new Error("USDC not deployed yet!"); + } + + const JiaPool = await hre.ethers.getContractFactory("BaseCreditPool"); + const pool = JiaPool.attach(deployedContracts["JiaPool"]) + const poolFrombcpOperator = pool.connect(bcpOperator); + + await sendTransaction("JiaPool", poolFrombcpOperator, "addApprovedLender", [deployer.address]); + await sendTransaction("JiaPool", poolFrombcpOperator, "addApprovedLender", [ea_bcp.address]); + await sendTransaction("JiaPool", poolFrombcpOperator, "addApprovedLender", [lender.address]); + await sendTransaction("JiaPool", poolFrombcpOperator, "addApprovedLender", [bcpOwnerTreasury.address]); + + const USDC = await hre.ethers.getContractFactory("TestToken"); + const usdc = USDC.attach(deployedContracts["USDC"]); + const decimals = await usdc.decimals(); + + // Owner + const usdcFromPoolOwnerTreasury = await usdc.connect(bcpOwnerTreasury); + const poolFromPoolOwnerTreasury = await pool.connect(bcpOwnerTreasury); + const amountOwner = BN.from(20_000).mul(BN.from(10).pow(BN.from(decimals))); + console.log("owner to deposit: " + amountOwner); + await sendTransaction("TestToken", usdc, "mint", [bcpOwnerTreasury.address, amountOwner]); + await sendTransaction("TestToken", usdcFromPoolOwnerTreasury, "approve", [pool.address, amountOwner]); + await sendTransaction("JiaPool", poolFromPoolOwnerTreasury, "makeInitialDeposit", [amountOwner]); + + // EA + const usdcFromEA = await usdc.connect(ea_bcp); + const poolFromEA = await pool.connect(ea_bcp); + const amountEA = BN.from(10_000).mul(BN.from(10).pow(BN.from(decimals))); + await sendTransaction("TestToken", usdc, "mint", [ea_bcp.address, amountEA]); + await sendTransaction("TestToken", usdcFromEA, "approve", [poolFromEA.address, amountEA]); + await sendTransaction("JiaPool", poolFromEA, "makeInitialDeposit", [amountEA]); + + await sendTransaction("JiaPool", pool, "enablePool", []); +} + +async function initContracts() { + const network = (await hre.ethers.provider.getNetwork()).name; + console.log("network : ", network); + const accounts = await hre.ethers.getSigners(); + let invoicePayer; + [ + deployer, proxyOwner, lender, ea, + eaService, pdsService, treasury, ea_bcp, + invoicePayer, bcpOperator, rfpOperator, + bcpOwnerTreasury, rfpOwnerTreasury + ] = await accounts; + console.log("deployer address: " + deployer.address); + console.log("lender address: " + lender.address); + console.log("ea address: " + ea.address); + + deployedContracts = await getDeployedContracts(); + + await initHumaConfig(); + await initEA(); + await initBaseCreditPoolFeeManager(); + await initBaseCreditPoolHDT(); + await initBaseCreditPoolConfig(); + await initBaseCreditPool(); + + await prepareBaseCreditPool(); + +} + +initContracts() + .then(() => process.exit(0)) + .catch((error) => { + console.error(error); + process.exit(1); + }); diff --git a/deployment/goerli/verify-goerli-jia-pool.js b/deployment/goerli/verify-goerli-jia-pool.js new file mode 100644 index 00000000..dbb9b2db --- /dev/null +++ b/deployment/goerli/verify-goerli-jia-pool.js @@ -0,0 +1,169 @@ +const execSync = require('child_process').execSync; +const { + getDeployedContracts, + getVerifiedContract, + updateVerifiedContract, +} = require("../utils.js"); + +const fs = require("fs"); + +const VERIFY_ARGS_PATH = "./deployment/goerli/verify_args/" + +const HUMA_OWNER_MULTI_SIG='0x1931bD73055335Ba06efB22DB96169dbD4C5B4DB'; +const POOL_OWNER_MULTI_SIG='0x7dC4018464e724fB2B04d9aC0df6D40B34786318'; + +let deployedContracts, proxyOwner, network, deployer; + +const getArgsFile = async function (contractName) { + const argsFile = `${VERIFY_ARGS_PATH}${contractName}.js`; + return argsFile; +} + +const writeVerifyArgs = async function (contractName, args) { + const argsFile = await getArgsFile(contractName); + let data = `module.exports = [ + ${args.toString()}, + ];` + // console.log(data) + await fs.mkdir(`${VERIFY_ARGS_PATH}`, { recursive: true }, (err) => { + if (err) throw err; + }); + fs.writeFileSync(argsFile, data, {flag: "w"}); + return argsFile; +}; + +const sleep = (ms) => new Promise((res) => setTimeout(res, ms)); + +async function etherscanVerify(contractName, contractAddress, argsFile, logMessage) { + await sleep(5000); + logMessage = !logMessage ? contractAddress : logMessage; + console.log(`Verifying ${contractName}:${logMessage}`) + + const command = !argsFile ? `yarn hardhat verify '${contractAddress}' --network ${network}` : `yarn hardhat verify ${contractAddress} --constructor-args ${argsFile} --network ${network}` + let result; + try { + const verifyResult = execSync(command) + // console.log(verifyResult); + result = 'successful'; + } + catch (error) { + if (!error.toString().toLowerCase().includes("already verified" )) { + throw error; + } + else { + result = 'already verified'; + } + }; + console.log(`Verifying ${contractName}:${logMessage} ended!`); + return result; +} + +async function verifyContract(contractKey, args) { + const verified = await getVerifiedContract(contractKey); + if (verified) { + console.log(`${contractKey} is already verified!`); + return 'already verified'; + } + + if (!deployedContracts[contractKey]) { + throw new Error(`${contractKey} not deployed yet!`); + } + let result; + if (args) { + const argsFile = await writeVerifyArgs(contractKey, args); + result = await etherscanVerify(contractKey, deployedContracts[contractKey], argsFile); + } + else { + result = await etherscanVerify(contractKey, deployedContracts[contractKey]); + } + await updateVerifiedContract(contractKey); + return result; +} + +async function verifyContracts() { + network = (await hre.ethers.provider.getNetwork()).name; + console.log("network : ", network); + deployedContracts = await getDeployedContracts(); + const accounts = await hre.ethers.getSigners(); + if (accounts.length == 0) { + throw new Error("Accounts not set!"); + } + deployer = await accounts[0]; + proxyOwner = await accounts[1]; + console.log("proxyOwner address: " + proxyOwner.address); + + const verifyUsdc = await verifyContract('USDC'); + console.log(`Verify USDC result: ${verifyUsdc}`); + + const verifyEANFT = await verifyContract('EANFT'); + console.log(`Verify EANFT result: ${verifyEANFT}`); + + const verifyRNNFT = await verifyContract('RNNFT', [ + `'${deployedContracts['USDC']}'` + ]); + console.log(`Verify RNNFT result: ${verifyRNNFT}`); + + const verifyHumaConfig = await verifyContract('HumaConfig'); + console.log(`Verify HumaConfig result: ${verifyHumaConfig}`); + + const verifyHumaConfigTL = await verifyContract('HumaConfigTimelock', + [ + 0, + `['${HUMA_OWNER_MULTI_SIG}']`, + `['${deployer.address}']`, + ]); + console.log(`Verify HumaConfigTimelock result: ${verifyHumaConfigTL}`); + + const verifyJiaPoolTL = await verifyContract('JiaPoolTimelock', + [ + 0, + `['${POOL_OWNER_MULTI_SIG}']`, + `['${deployer.address}']`, + ]); + console.log(`Verify HumaConfigTimelock result: ${verifyJiaPoolTL}`); + + const verifyJiaPoolProxyAdminTL = await verifyContract('JiaPoolProxyAdminTimelock', + [ + 0, + `['${POOL_OWNER_MULTI_SIG}']`, + `['${deployer.address}']`, + ]); + console.log(`Verify HumaConfigTimelock result: ${verifyJiaPoolProxyAdminTL}`); + + const verifyFeeManager = await verifyContract('JiaPoolFeeManager'); + console.log(`Verify FeeManager result: ${verifyFeeManager}`); + + const verifyHDTImpl = await verifyContract('JiaHDTImpl'); + console.log(`Verify HDTImpl result: ${verifyHDTImpl}`); + + const verifyHDT = await verifyContract('JiaHDT', + [ + `'${deployedContracts['JiaHDTImpl']}'`, + `'${deployedContracts['JiaPoolProxyAdminTimelock']}'`, + '[]' + ]); + console.log(`Verify HDT result: ${verifyHDT}`); + + const verifyPoolConfig = await verifyContract('JiaPoolConfig'); + console.log(`Verify poolConfig result: ${verifyPoolConfig}`); + + const verifyPoolImpl = await verifyContract('JiaPoolImpl'); + console.log(`Verify PoolImpl result: ${verifyPoolImpl}`); + + const verifyPool = await verifyContract('JiaPool', + [ + `'${deployedContracts['JiaPoolImpl']}'`, + `'${deployedContracts['JiaPoolProxyAdminTimelock']}'`, + '[]', + ]); + console.log(`Verify Pool result: ${verifyPool}`); +} + +verifyContracts() + .then(() => process.exit(0)) + .catch((error) => { + console.error(error); + process.exit(1); + }); + +// Reason: Already Verified \ No newline at end of file diff --git a/deployment/matic-deployed-contracts.json b/deployment/matic-deployed-contracts.json index 24b8ce94..3605ea47 100644 --- a/deployment/matic-deployed-contracts.json +++ b/deployment/matic-deployed-contracts.json @@ -1,22 +1,28 @@ -{ - "HumaConfig": "0x03D80E259E34354B552fE5d152D7484192535393", - "HumaConfigTimelock": "0x4730Ba92780b6783Ce97bD5f7AaD75337d6D180A", - "ReceivableFactoringPoolTimelock": "0x0562e6287dd69E76771E046f7E24ADC608c837b6", - "ReceivableFactoringPoolProxyAdminTimelock": "0x1691090fb0cFd3bd9b59128b57490eA882A09573", - "ReceivableFactoringPoolFeeManager": "0x5B7841b94a3C7246662ef514745b034A6ceaAB15", - "HDTImpl": "0xfc256098C6c63836ac71F7057c68b74165fF9cbb", - "HDT": "0xf5F9297c74e464933e42F4a989e81D931fb20f83", - "ReceivableFactoringPoolConfig": "0x98f41d57C06b302AFf999f3F58f4ae7a3F884590", - "ReceivableFactoringPoolImpl": "0x87FD98F3eB172B5183F7527060DDbe8a8D17B924", - "ReceivableFactoringPool": "0x58AAF1f9cB10F335111A2129273056bbED251B61", - "EANFT": "0x941687792107eaC859B820d1636936382F3189aa", - "RNNFT": "0x34eA029c5195F8fb4fe59b492be1738a9Dd959AC", - "BaseCreditPoolTimelock": "0x48065723605D1367bC4256B747293e281F5aD37b", - "BaseCreditPoolProxyAdminTimelock": "0x6fE57952F3Ce61f6B6d348e1BB52943C8531e99B", - "BaseCreditPoolFeeManager": "0x65C5535735581039c5711A9d7c223cff9384334F", - "BaseCreditHDTImpl": "0xf26A071833032Ce57769fdf530E81A28f15671df", - "BaseCreditHDT": "0x73c16Db24951135BC8A628185BdbfA79115793E5", - "BaseCreditPoolConfig": "0x39f7D6040EC30B62c508723e2EDb822413837527", - "BaseCreditPoolImpl": "0xb9Cb48e53bf4728C316f9b876281927BE792A02D", - "BaseCreditPool": "0xAb3dc5221F373Dd879BEc070058c775A0f6Af759" -} \ No newline at end of file +{"HumaConfig":"0x03D80E259E34354B552fE5d152D7484192535393", +"HumaConfigTimelock":"0x4730Ba92780b6783Ce97bD5f7AaD75337d6D180A", +"ReceivableFactoringPoolTimelock":"0x0562e6287dd69E76771E046f7E24ADC608c837b6", +"ReceivableFactoringPoolProxyAdminTimelock":"0x1691090fb0cFd3bd9b59128b57490eA882A09573", +"ReceivableFactoringPoolFeeManager":"0x5B7841b94a3C7246662ef514745b034A6ceaAB15", +"HDTImpl":"0xfc256098C6c63836ac71F7057c68b74165fF9cbb", +"HDT":"0xf5F9297c74e464933e42F4a989e81D931fb20f83", +"ReceivableFactoringPoolConfig":"0x98f41d57C06b302AFf999f3F58f4ae7a3F884590", +"ReceivableFactoringPoolImpl":"0x87FD98F3eB172B5183F7527060DDbe8a8D17B924", +"ReceivableFactoringPool":"0x58AAF1f9cB10F335111A2129273056bbED251B61", +"EANFT":"0x941687792107eaC859B820d1636936382F3189aa", +"RNNFT":"0x34eA029c5195F8fb4fe59b492be1738a9Dd959AC", +"BaseCreditPoolTimelock":"0x48065723605D1367bC4256B747293e281F5aD37b", +"BaseCreditPoolProxyAdminTimelock":"0x6fE57952F3Ce61f6B6d348e1BB52943C8531e99B", +"BaseCreditPoolFeeManager":"0x65C5535735581039c5711A9d7c223cff9384334F", +"BaseCreditHDTImpl":"0xf26A071833032Ce57769fdf530E81A28f15671df", +"BaseCreditHDT":"0x73c16Db24951135BC8A628185BdbfA79115793E5", +"BaseCreditPoolConfig":"0x39f7D6040EC30B62c508723e2EDb822413837527", +"BaseCreditPoolImpl":"0xb9Cb48e53bf4728C316f9b876281927BE792A02D", +"BaseCreditPool":"0xAb3dc5221F373Dd879BEc070058c775A0f6Af759", +"JiaPioneerPoolTimelock":"0xA00d231e40ED5a27543B2D1e1dc7bEf01cd9A370", +"JiaPioneerPoolProxyAdminTimelock":"0x9B28b841eE3a80fe91d45fb7C9e52cEA54B8d9AE", +"JiaPioneerPoolFeeManager":"0x7Ed46Ea23CD1559a77a80F651C2115CDEe55FCD1", +"JiaPioneerHDTImpl":"0x203990430bbd5bb67FcD76C431fAb5bd127A8E61", +"JiaPioneerHDT":"0xc6CF8FF8a4B7f1530AC2f0531614C824285009f8", +"JiaPioneerPoolConfig":"0x901427A8328139E59EA2401cBD6bB5b1F5e72E37", +"JiaPioneerPoolImpl":"0x2cffAAf7885530E1C5a9684eBbe397d6f1De48d8", +"JiaPioneerPool":"0xe8926aDbFADb5DA91CD56A7d5aCC31AA3FDF47E5"} \ No newline at end of file diff --git a/deployment/matic-initialized-contracts.json b/deployment/matic-initialized-contracts.json index a43d5b38..1bb006f7 100644 --- a/deployment/matic-initialized-contracts.json +++ b/deployment/matic-initialized-contracts.json @@ -6,4 +6,8 @@ "BaseCreditPoolFeeManager":"Done", "BaseCreditHDT":"Done", "BaseCreditPoolConfig":"Done", -"BaseCreditPool":"Done"} \ No newline at end of file +"BaseCreditPool":"Done", +"JiaPioneerPoolFeeManager":"Done", +"JiaPioneerHDT":"Done", +"JiaPioneerPoolConfig":"Done", +"JiaPioneerPool":"Done"} \ No newline at end of file diff --git a/deployment/matic-verified-contracts.json b/deployment/matic-verified-contracts.json index 4da69f79..178b1d56 100644 --- a/deployment/matic-verified-contracts.json +++ b/deployment/matic-verified-contracts.json @@ -13,4 +13,5 @@ "BaseCreditPoolImpl":"Done", "BaseCreditPool":"Done", "BaseCreditHDTImpl":"Done", -"BaseCreditHDT":"Done"} \ No newline at end of file +"BaseCreditHDT":"Done", +"JiaPioneerPoolConfig":"Done"} \ No newline at end of file diff --git a/deployment/polygon/deploy-jia-pioneer-pool.js b/deployment/polygon/deploy-jia-pioneer-pool.js new file mode 100644 index 00000000..077d53d6 --- /dev/null +++ b/deployment/polygon/deploy-jia-pioneer-pool.js @@ -0,0 +1,66 @@ +const {deploy} = require("../utils.js"); + +const HUMA_OWNER_MULTI_SIG = "0x7E13931931d59f2199fE0b499534412FCD28b7Ed"; +const POOL_OWNER_MULTI_SIG = "0x06AE4a3bc855c0046F18F4Bdf1Ac6617dc0001B5"; + +async function deployContracts() { + const network = (await hre.ethers.provider.getNetwork()).name; + console.log("network : ", network); + const accounts = await hre.ethers.getSigners(); + if (accounts.length == 0) { + throw new Error("Accounts not set!"); + } + const deployer = await accounts[0]; + console.log("deployer address: " + deployer.address); + + const eaService = await accounts[1]; + console.log("ea service address: " + eaService.address); + + // const usdc = await deploy("TestToken", "USDC"); + const evaluationAgentNFT = await deploy("EvaluationAgentNFT", "EANFT", [], eaService); + // const invoiceNFT = await deploy("InvoiceNFT", "RNNFT", [usdc.address]); + + const humaConfig = await deploy("HumaConfig", "HumaConfig"); + const humaConfigTL = await deploy("TimelockController", "HumaConfigTimelock", [ + 0, + [HUMA_OWNER_MULTI_SIG], + [deployer.address], + ]); + + const baseCreditPoolTL = await deploy("TimelockController", "JiaPioneerPoolTimelock", [ + 0, + [POOL_OWNER_MULTI_SIG], + [deployer.address], + ]); + + const JiaPioneerPoolProxyAdminTL = await deploy("TimelockController", "JiaPioneerPoolProxyAdminTimelock", [ + 0, + [POOL_OWNER_MULTI_SIG], + [deployer.address], + ]); + + const bc_feeManager = await deploy("BaseFeeManager", "JiaPioneerPoolFeeManager"); + const bc_hdtImpl = await deploy("HDT", "JiaPioneerHDTImpl"); + const bc_hdt = await deploy("TransparentUpgradeableProxy", "JiaPioneerHDT", [ + bc_hdtImpl.address, + JiaPioneerPoolProxyAdminTL.address, + [], + ]); + const bc_poolConfig = await deploy("BasePoolConfig", "JiaPioneerPoolConfig"); + + const bc_poolImpl = await deploy("BaseCreditPool", "JiaPioneerPoolImpl"); + const bc_pool = await deploy("TransparentUpgradeableProxy", "JiaPioneerPool", [ + bc_poolImpl.address, + JiaPioneerPoolProxyAdminTL.address, + [], + ]); + // End of deploying base credit pool + +} + +deployContracts() + .then(() => process.exit(0)) + .catch((error) => { + console.error(error); + process.exit(1); + }); diff --git a/deployment/polygon/init-jia-pioneer-pool-defender.js b/deployment/polygon/init-jia-pioneer-pool-defender.js new file mode 100644 index 00000000..0c6f6850 --- /dev/null +++ b/deployment/polygon/init-jia-pioneer-pool-defender.js @@ -0,0 +1,345 @@ +const {BigNumber: BN} = require("ethers"); +const { + getInitilizedContract, + updateInitilizedContract, + getDeployedContracts, + sendTransaction, + deploy, +} = require("../utils.js"); + +let deployer, deployedContracts, lender, ea, eaService; +let pdsService, treasury, ea_bcp, bcpOperator, rfpOperator; +let bcpOwnerTreasury, rfpOwnerTreasury; + +const HUMA_OWNER_MULTI_SIG = "0x7E13931931d59f2199fE0b499534412FCD28b7Ed"; +const POOL_OWNER_MULTI_SIG = "0x06AE4a3bc855c0046F18F4Bdf1Ac6617dc0001B5"; +const USDC_ADDRESS = "0x2791Bca1f2de4661ED88A30C99A7a9449Aa84174"; +const EA_ADDRESS = '0xdB59787549cA50faF9Bd2679856B668eDDBf0A44'; + +async function renounceTLAdminRole(timeLockKey, account) { + if (!deployedContracts[timeLockKey]) { + throw new Error(`${timeLockKey} not deployed yet!`); + } + const TimeLockController = await hre.ethers.getContractFactory("TimelockController"); + const timeLockController = TimeLockController.attach(deployedContracts[timeLockKey]); + + const adminRole = await timeLockController.TIMELOCK_ADMIN_ROLE(); + await sendTransaction("TimelockController", timeLockController, "renounceRole", [ + adminRole, + account, + ]); +} + + +async function transferOwnershipToTL(contractName, contractKey, timeLockKey) { + if (!deployedContracts[timeLockKey]) { + throw new Error(`${timeLockKey} not deployed yet!`); + } + + if (!deployedContracts[contractKey]) { + throw new Error(`${contractKey} not deployed yet!`); + } + + const TimeLockController = await hre.ethers.getContractFactory("TimelockController"); + const timeLockController = TimeLockController.attach(deployedContracts[timeLockKey]); + + const Contract = await hre.ethers.getContractFactory(contractName); + const contract = Contract.attach(deployedContracts[contractKey]); + + await sendTransaction(contractKey, contract, "transferOwnership", [timeLockController.address]); + + await renounceTLAdminRole(timeLockKey, deployer.address); +} + +async function initHumaConfig() { + const initilized = await getInitilizedContract("HumaConfig"); + if (initilized) { + console.log("HumaConfig is already initialized!"); + return; + } + + if (!deployedContracts["HumaConfig"]) { + throw new Error("HumaConfig not deployed yet!"); + } + + if (!deployedContracts["EANFT"]) { + throw new Error("EANFT not deployed yet!"); + } + + const HumaConfig = await hre.ethers.getContractFactory("HumaConfig"); + const humaConfig = HumaConfig.attach(deployedContracts["HumaConfig"]); + + await sendTransaction("HumaConfig", humaConfig, "setProtocolDefaultGracePeriod", [ + 30 * 24 * 3600, + ]); + await sendTransaction("HumaConfig", humaConfig, "setTreasuryFee", [500]); + await sendTransaction("HumaConfig", humaConfig, "setEANFTContractAddress", [ + deployedContracts["EANFT"], + ]); + + await sendTransaction("HumaConfig", humaConfig, "setEAServiceAccount", [eaService.address]); + await sendTransaction("HumaConfig", humaConfig, "setPDSServiceAccount", [pdsService.address]); + + const USDC = await hre.ethers.getContractFactory("TestToken"); + const usdc = USDC.attach(deployedContracts["USDC"]); + + // Add usdc as an asset supported by the protocol + await sendTransaction("HumaConfig", humaConfig, "setLiquidityAsset", [usdc.address, true]); + + // Set treasury for the protocol + await sendTransaction("HumaConfig", humaConfig, "setHumaTreasury", [treasury.address]); + + await transferOwnershipToTL("HumaConfig", "HumaConfig", "HumaConfigTimelock") + + await updateInitilizedContract("HumaConfig"); +} + +async function initEA() { + const initilized = await getInitilizedContract("EANFT"); + if (initilized) { + console.log("EANFT is already initialized!"); + return; + } + + if (!deployedContracts["EANFT"]) { + throw new Error("EANFT not deployed yet!"); + } + + const EANFT = await hre.ethers.getContractFactory("EvaluationAgentNFT"); + const eaNFT = EANFT.attach(deployedContracts["EANFT"]); + + const eaNFTFromEA = eaNFT.connect(ea); + await sendTransaction("EvaluationAgentNFT", eaNFTFromEA, "mintNFT", [ea.address]); + const eaNFTFromEA_bcp = eaNFT.connect(ea); + await sendTransaction("EvaluationAgentNFT", eaNFTFromEA_bcp, "mintNFT", [ea_bcp.address]); + await updateInitilizedContract("EANFT"); +} + +async function initBaseCreditPoolFeeManager() { + const initilized = await getInitilizedContract("JiaPioneerPoolFeeManager"); + if (initilized) { + console.log("JiaPioneerPoolFeeManager is already initialized!"); + return; + } + + if (!deployedContracts["JiaPioneerPoolFeeManager"]) { + throw new Error("JiaPioneerPoolFeeManager not deployed yet!"); + } + + const BaseFeeManager = await hre.ethers.getContractFactory("BaseFeeManager"); + const feeManager = BaseFeeManager.attach(deployedContracts["JiaPioneerPoolFeeManager"]); + + await sendTransaction( + "JiaPioneerPoolFeeManager", + feeManager, + "setFees", + [0, 0, 0, 10, 0] + ); + await sendTransaction("FeeManager", feeManager, "setMinPrincipalRateInBps", [0]); + + await transferOwnershipToTL("BaseFeeManager", "JiaPioneerPoolFeeManager", "JiaPioneerPoolTimelock"); + + await updateInitilizedContract("JiaPioneerPoolFeeManager"); +} + +async function initBaseCreditPoolHDT() { + const initilized = await getInitilizedContract("JiaPioneerHDT"); + if (initilized) { + console.log("JiaPioneerHDT is already initialized!"); + return; + } + + if (!deployedContracts["JiaPioneerHDT"]) { + throw new Error("JiaPioneerHDT not deployed yet!"); + } + + const HDT = await hre.ethers.getContractFactory("HDT"); + const hdt = HDT.attach(deployedContracts["JiaPioneerHDT"]); + + if (!deployedContracts["JiaPioneerPool"]) { + throw new Error("JiaPioneerPool not deployed yet!"); + } + + await sendTransaction("HDT", hdt, "initialize", [ + "Jia Pioneer HDT", + "JHDT", + USDC_ADDRESS, + ]); + + await sendTransaction("HDT", hdt, "setPool", [deployedContracts["JiaPioneerPool"]]); + + await transferOwnershipToTL("HDT", "JiaPioneerHDT", "JiaPioneerPoolTimelock"); + + await updateInitilizedContract("JiaPioneerHDT"); +} + +async function initBaseCreditPoolConfig() { + const initilized = await getInitilizedContract("JiaPioneerPoolConfig"); + if (initilized) { + console.log("JiaPioneerPoolConfig is already initialized!"); + return; + } + + if (!deployedContracts["JiaPioneerPoolConfig"]) { + throw new Error("JiaPioneerPoolConfig not deployed yet!"); + } + + const ReceivableFactoringPoolConfig = await hre.ethers.getContractFactory("BasePoolConfig"); + const poolConfig = ReceivableFactoringPoolConfig.attach( + deployedContracts["JiaPioneerPoolConfig"] + ); + + if (!deployedContracts["JiaPioneerPool"]) { + throw new Error("JiaPioneerPool not deployed yet!"); + } + + if (!deployedContracts["JiaPioneerHDT"]) { + throw new Error("JiaPioneerHDT not deployed yet!"); + } + + if (!deployedContracts["HumaConfig"]) { + throw new Error("HumaConfig not deployed yet!"); + } + + if (!deployedContracts["JiaPioneerPoolFeeManager"]) { + throw new Error("JiaPioneerPoolFeeManager not deployed yet!"); + } + + const HDT = await hre.ethers.getContractFactory("HDT"); + const hdt = HDT.attach(deployedContracts["JiaPioneerHDT"]); + + const HumaConfig = await hre.ethers.getContractFactory("HumaConfig"); + const humaConfig = HumaConfig.attach(deployedContracts["HumaConfig"]); + + const BaseFeeManager = await hre.ethers.getContractFactory("BaseFeeManager"); + const feeManager = BaseFeeManager.attach(deployedContracts["JiaPioneerPoolFeeManager"]); + + await sendTransaction("JiaPioneerPoolConfig", poolConfig, "initialize", [ + "JiaPioneerPool", + hdt.address, + humaConfig.address, + feeManager.address, + ]); + + const decimals = await hdt.decimals(); + const cap = BN.from(500_000).mul(BN.from(10).pow(BN.from(decimals))); + console.log("cap: " + cap); + await sendTransaction("JiaPioneerPoolConfig", poolConfig, "setPoolLiquidityCap", [cap]); + + await sendTransaction("JiaPioneerPoolConfig", poolConfig, "setPool", [ + deployedContracts["JiaPioneerPool"], + ]); + await sendTransaction("JiaPioneerPoolConfig", poolConfig, "setEvaluationAgent", [ + 2, + EA_ADDRESS, + ]); + + await sendTransaction( + "JiaPioneerPoolConfig", + poolConfig, + "setPoolOwnerRewardsAndLiquidity", + [0, 0] + ); + await sendTransaction( + "JiaPioneerPoolConfig", + poolConfig, + "setEARewardsAndLiquidity", + [0, 0] + ); + const maxCL = BN.from(500_000).mul(BN.from(10).pow(BN.from(decimals))); + console.log("maxCL: " + maxCL); + await sendTransaction("JiaPioneerPoolConfig", poolConfig, "setMaxCreditLine", [maxCL]); + await sendTransaction("JiaPioneerPoolConfig", poolConfig, "setAPR", [1000]); + await sendTransaction("JiaPioneerPoolConfig", poolConfig, "setReceivableRequiredInBps", [0]); + await sendTransaction("JiaPioneerPoolConfig", poolConfig, "setPoolPayPeriod", [30]); + await sendTransaction("JiaPioneerPoolConfig", poolConfig, "setPoolToken", [ + deployedContracts["JiaPioneerHDT"], + ]); + await sendTransaction("JiaPioneerPoolConfig", poolConfig, "setWithdrawalLockoutPeriod", [365]); + await sendTransaction("JiaPioneerPoolConfig", poolConfig, "setPoolDefaultGracePeriod", [60]); + + await sendTransaction("JiaPioneerPoolConfig", poolConfig, "addPoolOperator", ['0x1d0C14ef74D4F76B218df9Cd752b3a831C20A909']); // Richard-pool + await sendTransaction("JiaPioneerPoolConfig", poolConfig, "addPoolOperator", ['0xCCE6e1b4b83D4133C20C3Bd961c519325fac9e8F']); // Erbil-pool + await sendTransaction("JiaPioneerPoolConfig", poolConfig, "addPoolOperator", ['0xB40a6D4C73766F769Cb3393B62488Fd57db04AA4']); // Ji-pool + await sendTransaction("JiaPioneerPoolConfig", poolConfig, "addPoolOperator", [deployer.address]); + + await sendTransaction("JiaPioneerPoolConfig", poolConfig, "setPoolOwnerTreasury", ['0xd4F254006d486688cE7515199C55266C581B949A']); + + await transferOwnershipToTL("BasePoolConfig", "JiaPioneerPoolConfig", "JiaPioneerPoolTimelock"); + + await updateInitilizedContract("JiaPioneerPoolConfig"); +} + +async function initBaseCreditPool() { + const initilized = await getInitilizedContract("JiaPioneerPool"); + if (initilized) { + console.log("JiaPioneerPool is already initialized!"); + return; + } + + if (!deployedContracts["JiaPioneerPool"]) { + throw new Error("JiaPioneerPool not deployed yet!"); + } + + if (!deployedContracts["JiaPioneerPoolConfig"]) { + throw new Error("JiaPioneerPoolConfig not deployed yet!"); + } + + const ReceivableFactoringPool = await hre.ethers.getContractFactory("BaseCreditPool"); + const pool = ReceivableFactoringPool.attach(deployedContracts["JiaPioneerPool"]); + + await sendTransaction("JiaPioneerPool", pool, "initialize", [ + deployedContracts["JiaPioneerPoolConfig"], + ]); + + if (!deployedContracts["JiaPioneerPoolTimelock"]) { + throw new Error("JiaPioneerPoolTimelock not deployed yet!"); + } + + await renounceTLAdminRole("JiaPioneerPoolTimelock", deployer.address); + + await updateInitilizedContract("JiaPioneerPool"); +} + +async function prepareBaseCreditPool() { + // The operations commented off need to run with TL on Defender + if (!deployedContracts["JiaPioneerPool"]) { + throw new Error("JiaPioneerPool not deployed yet!"); + } + + const JiaPioneerPool = await hre.ethers.getContractFactory("BaseCreditPool"); + const pool = JiaPioneerPool.attach(deployedContracts["JiaPioneerPool"]) + + await sendTransaction("JiaPioneerPool", pool, "addApprovedLender", ["0x062E4fa7b23518B24B6D18F8FAf06dA455D768E2"]); + await sendTransaction("JiaPioneerPool", pool, "addApprovedLender", [EA_ADDRESS]); +} + +async function initContracts() { + const network = (await hre.ethers.provider.getNetwork()).name; + console.log("network : ", network); + const accounts = await hre.ethers.getSigners(); + let invoicePayer; + [ + deployer, eaService, pdsService, + ] = await accounts; + console.log("deployer address: " + deployer.address); + + deployedContracts = await getDeployedContracts(); + + await initHumaConfig(); + // await initEA(); + await initBaseCreditPoolFeeManager(); + await initBaseCreditPoolHDT(); + await initBaseCreditPoolConfig(); + await initBaseCreditPool(); + + await prepareBaseCreditPool(); + +} + +initContracts() + .then(() => process.exit(0)) + .catch((error) => { + console.error(error); + process.exit(1); + }); diff --git a/deployment/polygon/upgrade-base-credit-pool.js b/deployment/polygon/upgrade-base-credit-pool.js new file mode 100644 index 00000000..6abe3283 --- /dev/null +++ b/deployment/polygon/upgrade-base-credit-pool.js @@ -0,0 +1,83 @@ +const { + getUpgradedContract, + updateUpgradedContract, + getDeployedContracts, + sendTransaction, +} = require("../utils.js"); + +let deployer, deployedContracts; + +async function upgradePool() { + const upgraded = await getUpgradedContract("BaseCreditPool"); + if (upgraded) { + console.log("BaseCreditPool is upgraded already!"); + return; + } + + if (!deployedContracts["BaseCreditPoolImpl"]) { + throw new Error("BaseCreditPoolImpl not deployed yet!"); + } + + if (!deployedContracts["BaseCreditPool"]) { + throw new Error("BaseCreditPool not deployed yet!"); + } + + const TransparentUpgradeableProxy = await hre.ethers.getContractFactory( + "TransparentUpgradeableProxy" + ); + let proxy = TransparentUpgradeableProxy.attach(deployedContracts["BaseCreditPool"]); + proxy = await proxy.connect(proxyOwner); + + await sendTransaction("BaseCreditPool", proxy, "upgradeTo", [ + deployedContracts["BaseCreditPoolImpl"], + ]); + + await updateUpgradedContract("BaseCreditPool"); +} + +async function upgradeHDT() { + const upgraded = await getUpgradedContract("BaseCreditHDT"); + if (upgraded) { + console.log("BaseCreditHDT is upgraded already!"); + return; + } + + if (!deployedContracts["BaseCreditHDTImpl"]) { + throw new Error("BaseCreditHDTImpl not deployed yet!"); + } + + if (!deployedContracts["BaseCreditHDT"]) { + throw new Error("BaseCreditHDT not deployed yet!"); + } + + const TransparentUpgradeableProxy = await hre.ethers.getContractFactory( + "TransparentUpgradeableProxy" + ); + let proxy = TransparentUpgradeableProxy.attach(deployedContracts["BaseCreditPool"]); + proxy = await proxy.connect(proxyOwner); + + await sendTransaction("BaseCreditPool", proxy, "upgradeTo", [ + deployedContracts["BaseCreditPoolImpl"], + ]); + + await updateUpgradedContract("BaseCreditPool"); +} + +async function upgradeContracts() { + const network = (await hre.ethers.provider.getNetwork()).name; + console.log("network : ", network); + const accounts = await hre.ethers.getSigners(); + deployer = await accounts[0]; + console.log("deployer address: " + deployer.address); + + deployedContracts = await getDeployedContracts(); + + await upgradePool(); +} + +upgradeContracts() + .then(() => process.exit(0)) + .catch((error) => { + console.error(error); + process.exit(1); + }); diff --git a/deployment/polygon/verify-Jia-pioneer-pool.js b/deployment/polygon/verify-Jia-pioneer-pool.js new file mode 100644 index 00000000..8c361d65 --- /dev/null +++ b/deployment/polygon/verify-Jia-pioneer-pool.js @@ -0,0 +1,169 @@ +const execSync = require('child_process').execSync; +const { + getDeployedContracts, + getVerifiedContract, + updateVerifiedContract, +} = require("../utils.js"); + +const fs = require("fs"); + +const VERIFY_ARGS_PATH = "./deployment/polygon/verify_args/" + +const HUMA_OWNER_MULTI_SIG = "0x7E13931931d59f2199fE0b499534412FCD28b7Ed"; +const POOL_OWNER_MULTI_SIG = "0x06AE4a3bc855c0046F18F4Bdf1Ac6617dc0001B5"; + +let deployedContracts, proxyOwner, network, deployer; + +const getArgsFile = async function (contractName) { + const argsFile = `${VERIFY_ARGS_PATH}${contractName}.js`; + return argsFile; +} + +const writeVerifyArgs = async function (contractName, args) { + const argsFile = await getArgsFile(contractName); + let data = `module.exports = [ + ${args.toString()}, + ];` + // console.log(data) + await fs.mkdir(`${VERIFY_ARGS_PATH}`, { recursive: true }, (err) => { + if (err) throw err; + }); + fs.writeFileSync(argsFile, data, {flag: "w"}); + return argsFile; +}; + +const sleep = (ms) => new Promise((res) => setTimeout(res, ms)); + +async function etherscanVerify(contractName, contractAddress, argsFile, logMessage) { + await sleep(5000); + logMessage = !logMessage ? contractAddress : logMessage; + console.log(`Verifying ${contractName}:${logMessage}`) + + const command = !argsFile ? `yarn hardhat verify '${contractAddress}' --network ${network}` : `yarn hardhat verify ${contractAddress} --constructor-args ${argsFile} --network ${network}` + let result; + try { + const verifyResult = execSync(command) + // console.log(verifyResult); + result = 'successful'; + } + catch (error) { + if (!error.toString().toLowerCase().includes("already verified" )) { + throw error; + } + else { + result = 'already verified'; + } + }; + console.log(`Verifying ${contractName}:${logMessage} ended!`); + return result; +} + +async function verifyContract(contractKey, args) { + const verified = await getVerifiedContract(contractKey); + if (verified) { + console.log(`${contractKey} is already verified!`); + return 'already verified'; + } + + if (!deployedContracts[contractKey]) { + throw new Error(`${contractKey} not deployed yet!`); + } + let result; + if (args) { + const argsFile = await writeVerifyArgs(contractKey, args); + result = await etherscanVerify(contractKey, deployedContracts[contractKey], argsFile); + } + else { + result = await etherscanVerify(contractKey, deployedContracts[contractKey]); + } + await updateVerifiedContract(contractKey); + return result; +} + +async function verifyContracts() { + network = (await hre.ethers.provider.getNetwork()).name; + console.log("network : ", network); + deployedContracts = await getDeployedContracts(); + const accounts = await hre.ethers.getSigners(); + if (accounts.length == 0) { + throw new Error("Accounts not set!"); + } + deployer = await accounts[0]; + // proxyOwner = await accounts[1]; + // console.log("proxyOwner address: " + proxyOwner.address); + + // const verifyUsdc = await verifyContract('USDC'); + // console.log(`Verify USDC result: ${verifyUsdc}`); + + // const verifyEANFT = await verifyContract('EANFT'); + // console.log(`Verify EANFT result: ${verifyEANFT}`); + + // const verifyRNNFT = await verifyContract('RNNFT', [ + // `'${deployedContracts['USDC']}'` + // ]); + // console.log(`Verify RNNFT result: ${verifyRNNFT}`); + + // const verifyHumaConfig = await verifyContract('HumaConfig'); + // console.log(`Verify HumaConfig result: ${verifyHumaConfig}`); + + // const verifyHumaConfigTL = await verifyContract('HumaConfigTimelock', + // [ + // 0, + // `['${HUMA_OWNER_MULTI_SIG}']`, + // `['${deployer.address}']`, + // ]); + // console.log(`Verify HumaConfigTimelock result: ${verifyHumaConfigTL}`); + + // const verifyBaseCreditPoolTL = await verifyContract('BaseCreditPoolTimelock', + // [ + // 0, + // `['${POOL_OWNER_MULTI_SIG}']`, + // `['${deployer.address}']`, + // ]); + // console.log(`Verify HumaConfigTimelock result: ${verifyBaseCreditPoolTL}`); + + // const verifyBaseCreditPoolProxyAdminTL = await verifyContract('BaseCreditPoolProxyAdminTimelock', + // [ + // 0, + // `['${POOL_OWNER_MULTI_SIG}']`, + // `['${deployer.address}']`, + // ]); + // console.log(`Verify HumaConfigTimelock result: ${verifyBaseCreditPoolProxyAdminTL}`); + + // const verifyFeeManager = await verifyContract('BaseCreditPoolFeeManager'); + // console.log(`Verify FeeManager result: ${verifyFeeManager}`); + + // const verifyHDTImpl = await verifyContract('BaseCreditHDTImpl'); + // console.log(`Verify HDTImpl result: ${verifyHDTImpl}`); + + // const verifyHDT = await verifyContract('BaseCreditHDT', + // [ + // `'${deployedContracts['BaseCreditHDTImpl']}'`, + // `'${deployedContracts['BaseCreditPoolProxyAdminTimelock']}'`, + // '[]' + // ]); + // console.log(`Verify HDT result: ${verifyHDT}`); + + const verifyPoolConfig = await verifyContract('JiaPioneerPoolConfig'); + console.log(`Verify poolConfig result: ${verifyPoolConfig}`); + + // const verifyPoolImpl = await verifyContract('BaseCreditPoolImpl'); + // console.log(`Verify PoolImpl result: ${verifyPoolImpl}`); + + // const verifyPool = await verifyContract('BaseCreditPool', + // [ + // `'${deployedContracts['BaseCreditPoolImpl']}'`, + // `'${deployedContracts['BaseCreditPoolProxyAdminTimelock']}'`, + // '[]', + // ]); + // console.log(`Verify Pool result: ${verifyPool}`); +} + +verifyContracts() + .then(() => process.exit(0)) + .catch((error) => { + console.error(error); + process.exit(1); + }); + +// Reason: Already Verified \ No newline at end of file diff --git a/deployment/utils.js b/deployment/utils.js index e25c1d31..cf4e91f5 100644 --- a/deployment/utils.js +++ b/deployment/utils.js @@ -2,8 +2,8 @@ const {BigNumber: BN, ethers} = require("ethers"); const fs = require("fs"); const DEPLOYED_PATH = "./deployment/"; -const MAX_FEE_PER_GAS = 30_000_000_000; -const MAX_PRIORITY_FEE_PER_GAS = 2_000_000_000; +const MAX_FEE_PER_GAS = 300_000_000_000; +const MAX_PRIORITY_FEE_PER_GAS = 50_000_000_000; const getContractAddressFile = async function (fileType = "deployed", network) { if (!network) { diff --git a/hardhat.config.js b/hardhat.config.js index 1d44297c..294ee030 100644 --- a/hardhat.config.js +++ b/hardhat.config.js @@ -216,6 +216,10 @@ module.exports = { treasury, ea_bcp, invoicePayer, + baseCreditPoolOperator, + receivableFactoringPoolOperator, + baseCreditPoolOwnerTreasury, + receivableFactoringPoolOwnerTreasury, ], }, matic: { diff --git a/scripts/cancel-pending-txs.js b/scripts/cancel-pending-txs.js index b14699bd..7c445b72 100644 --- a/scripts/cancel-pending-txs.js +++ b/scripts/cancel-pending-txs.js @@ -2,7 +2,7 @@ const {Wallet, utils} = require("ethers"); const ZERO_BYTES32 = "0x0000000000000000000000000000000000000000000000000000000000000000"; const ACCOUNT_PRIVATE_KEY = ""; -const TO_ADDRESS = "0x60891b087E81Ee2a61B7606f68019ec112c539B9"; +const TO_ADDRESS = "0x07250B0373Aa6a3de47A44e3Cf720A6376296dD5"; async function main() { const network = (await hre.ethers.provider.getNetwork()).name; @@ -16,10 +16,10 @@ async function main() { const data = { to: TO_ADDRESS, - // value: utils.parseUnits("10", "gwei"), - maxFeePerGas: utils.parseUnits("100", "gwei"), - maxPriorityFeePerGas: utils.parseUnits("40", "gwei"), - nonce: null, + value: utils.parseUnits("10", "gwei"), + maxFeePerGas: utils.parseUnits("280", "gwei"), + maxPriorityFeePerGas: utils.parseUnits("200", "gwei"), + nonce: 92173, }; const tx = await account.sendTransaction(data); From 894787dfbad5644e0693566dba53c9b6430e1697 Mon Sep 17 00:00:00 2001 From: PlayJoker Date: Wed, 17 May 2023 15:39:05 -0700 Subject: [PATCH 02/29] updated hardhat config --- hardhat.config.js | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/hardhat.config.js b/hardhat.config.js index 1d44297c..b16aa8c9 100644 --- a/hardhat.config.js +++ b/hardhat.config.js @@ -19,6 +19,10 @@ const fs = require("fs"); const EMPTY_URL = "empty url"; const EMPTY_PRIVATE_KEY = "0x0000000000000000000000000000000000000000000000000000000000000000"; +let sepoliaUrl = process.env["SEPOLIA_URL"]; +if (!sepoliaUrl) { + sepoliaUrl = EMPTY_URL; +} let goerliUrl = process.env["GOERLI_URL"]; if (!goerliUrl) { goerliUrl = EMPTY_URL; @@ -222,6 +226,10 @@ module.exports = { url: polygonUrl, accounts: [deployer, eaService, pdsService], }, + sepolia: { + url: sepoliaUrl, + accounts: [deployer, eaService], + }, optimism: { url: "https://mainnet.optimism.io", accounts: { From d4cc54530bf5b25176da366dc66c6790ba908114 Mon Sep 17 00:00:00 2001 From: PlayJoker Date: Thu, 18 May 2023 15:45:37 -0700 Subject: [PATCH 03/29] gitleaks to fetch all history --- .github/workflows/gitleaks.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.github/workflows/gitleaks.yml b/.github/workflows/gitleaks.yml index 8a63e176..11e32b08 100644 --- a/.github/workflows/gitleaks.yml +++ b/.github/workflows/gitleaks.yml @@ -12,6 +12,8 @@ jobs: runs-on: ubuntu-22.04 steps: - uses: actions/checkout@v3 + with: + fetch-depth: 0 - uses: actions/setup-go@v3 with: go-version: "1.19" From 4af5ac42a50d70cc4211fadb4144b725de43f120 Mon Sep 17 00:00:00 2001 From: PlayJoker Date: Thu, 18 May 2023 15:54:18 -0700 Subject: [PATCH 04/29] added todo comment --- .github/workflows/gitleaks.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/gitleaks.yml b/.github/workflows/gitleaks.yml index 11e32b08..0facdeac 100644 --- a/.github/workflows/gitleaks.yml +++ b/.github/workflows/gitleaks.yml @@ -13,7 +13,7 @@ jobs: steps: - uses: actions/checkout@v3 with: - fetch-depth: 0 + fetch-depth: 0 # todo: only fetch for the HEAD branch - uses: actions/setup-go@v3 with: go-version: "1.19" From 10822ce922e77a26bc7e5b69e424d530bdc5a8bc Mon Sep 17 00:00:00 2001 From: PlayJoker Date: Fri, 19 May 2023 11:45:05 -0700 Subject: [PATCH 05/29] upgraded ethers version, deployed, verified, initialized arf pools on sepolia --- deployment/utils.js | 4 +- hardhat.config.js | 7 +- package.json | 4 +- yarn.lock | 796 +++++++++++++++++++++++++++----------------- 4 files changed, 504 insertions(+), 307 deletions(-) diff --git a/deployment/utils.js b/deployment/utils.js index cf4e91f5..c7e0b2d0 100644 --- a/deployment/utils.js +++ b/deployment/utils.js @@ -2,8 +2,8 @@ const {BigNumber: BN, ethers} = require("ethers"); const fs = require("fs"); const DEPLOYED_PATH = "./deployment/"; -const MAX_FEE_PER_GAS = 300_000_000_000; -const MAX_PRIORITY_FEE_PER_GAS = 50_000_000_000; +const MAX_FEE_PER_GAS = 2_500_000_000; +const MAX_PRIORITY_FEE_PER_GAS = 2_000_000_000; const getContractAddressFile = async function (fileType = "deployed", network) { if (!network) { diff --git a/hardhat.config.js b/hardhat.config.js index 163c3be6..14ad7384 100644 --- a/hardhat.config.js +++ b/hardhat.config.js @@ -43,6 +43,10 @@ let deployer = process.env["DEPLOYER"]; if (!deployer) { deployer = EMPTY_PRIVATE_KEY; } +let poolTreasury = process.env["POOL_TREASURY"]; +if (!poolTreasury) { + poolTreasury = EMPTY_PRIVATE_KEY; +} let proxyOwner = process.env["PROXY_OWNER"]; if (!proxyOwner) { proxyOwner = EMPTY_PRIVATE_KEY; @@ -232,7 +236,7 @@ module.exports = { }, sepolia: { url: sepoliaUrl, - accounts: [deployer, eaService], + accounts: [deployer, eaService, poolTreasury], }, optimism: { url: "https://mainnet.optimism.io", @@ -374,6 +378,7 @@ module.exports = { goerli: process.env.ETHERSCAN_API_KEY || null, polygon: process.env.POLYGONSCAN_API_KEY || null, mainnet: process.env.ETHERSCAN_API_KEY || null, + sepolia: process.env.ETHERSCAN_API_KEY || null, }, }, contractSizer: { diff --git a/package.json b/package.json index 47672754..467b497f 100644 --- a/package.json +++ b/package.json @@ -9,7 +9,7 @@ "@openzeppelin/hardhat-upgrades": "^1.23.1", "@tenderly/hardhat-tenderly": "^1.1.6", "chai": "^4.3.6", - "ethers": "^5.7.0", + "ethers": "^6.3.0", "hardhat-abi-exporter": "^2.10.0", "hardhat-contract-sizer": "^2.6.1", "hardhat-gas-reporter": "^1.0.9", @@ -42,4 +42,4 @@ "dotenv": "^16.0.2", "hardhat": "^2.11.1" } -} \ No newline at end of file +} diff --git a/yarn.lock b/yarn.lock index 5f0edc3a..e9abc7cd 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2,6 +2,11 @@ # yarn lockfile v1 +"@adraffy/ens-normalize@1.9.0": + version "1.9.0" + resolved "https://registry.yarnpkg.com/@adraffy/ens-normalize/-/ens-normalize-1.9.0.tgz#223572538f6bea336750039bb43a4016dcc8182d" + integrity sha512-iowxq3U30sghZotgl4s/oJRci6WPBfNO5YYgk2cIOMCHr3LeGPcsZjCEr+33Q4N+oV3OABDAtA+pyvWjbvBifQ== + "@babel/code-frame@^7.0.0": version "7.18.6" resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.18.6.tgz#3b25d38c89600baa2dcc219edfa88a74eb2c427a" @@ -23,6 +28,42 @@ chalk "^2.0.0" js-tokens "^4.0.0" +"@chainsafe/as-sha256@^0.3.1": + version "0.3.1" + resolved "https://registry.yarnpkg.com/@chainsafe/as-sha256/-/as-sha256-0.3.1.tgz#3639df0e1435cab03f4d9870cc3ac079e57a6fc9" + integrity sha512-hldFFYuf49ed7DAakWVXSJODuq3pzJEguD8tQ7h+sGkM18vja+OFoJI9krnGmgzyuZC2ETX0NOIcCTy31v2Mtg== + +"@chainsafe/persistent-merkle-tree@^0.4.2": + version "0.4.2" + resolved "https://registry.yarnpkg.com/@chainsafe/persistent-merkle-tree/-/persistent-merkle-tree-0.4.2.tgz#4c9ee80cc57cd3be7208d98c40014ad38f36f7ff" + integrity sha512-lLO3ihKPngXLTus/L7WHKaw9PnNJWizlOF1H9NNzHP6Xvh82vzg9F2bzkXhYIFshMZ2gTCEz8tq6STe7r5NDfQ== + dependencies: + "@chainsafe/as-sha256" "^0.3.1" + +"@chainsafe/persistent-merkle-tree@^0.5.0": + version "0.5.0" + resolved "https://registry.yarnpkg.com/@chainsafe/persistent-merkle-tree/-/persistent-merkle-tree-0.5.0.tgz#2b4a62c9489a5739dedd197250d8d2f5427e9f63" + integrity sha512-l0V1b5clxA3iwQLXP40zYjyZYospQLZXzBVIhhr9kDg/1qHZfzzHw0jj4VPBijfYCArZDlPkRi1wZaV2POKeuw== + dependencies: + "@chainsafe/as-sha256" "^0.3.1" + +"@chainsafe/ssz@^0.10.0": + version "0.10.2" + resolved "https://registry.yarnpkg.com/@chainsafe/ssz/-/ssz-0.10.2.tgz#c782929e1bb25fec66ba72e75934b31fd087579e" + integrity sha512-/NL3Lh8K+0q7A3LsiFq09YXS9fPE+ead2rr7vM2QK8PLzrNsw3uqrif9bpRX5UxgeRjM+vYi+boCM3+GM4ovXg== + dependencies: + "@chainsafe/as-sha256" "^0.3.1" + "@chainsafe/persistent-merkle-tree" "^0.5.0" + +"@chainsafe/ssz@^0.9.2": + version "0.9.4" + resolved "https://registry.yarnpkg.com/@chainsafe/ssz/-/ssz-0.9.4.tgz#696a8db46d6975b600f8309ad3a12f7c0e310497" + integrity sha512-77Qtg2N1ayqs4Bg/wvnWfg5Bta7iy7IRh8XqXh7oNMeP2HBbBwx8m6yTpA8p0EHItWPEBkgZd5S5/LSlp3GXuQ== + dependencies: + "@chainsafe/as-sha256" "^0.3.1" + "@chainsafe/persistent-merkle-tree" "^0.4.2" + case "^1.6.3" + "@colors/colors@1.5.0": version "1.5.0" resolved "https://registry.yarnpkg.com/@colors/colors/-/colors-1.5.0.tgz#bb504579c1cae923e6576a4f5da43d25f97bdbd9" @@ -197,13 +238,20 @@ resolved "https://registry.yarnpkg.com/@ethersproject/logger/-/logger-5.7.0.tgz#6ce9ae168e74fecf287be17062b590852c311892" integrity sha512-0odtFdXu/XHtjQXJYA3u9G0G8btm0ND5Cu8M7i5vhEcE8/HmF4Lbdqanwyv4uQTr2tx6b7fQRmgLrsnpQlmnig== -"@ethersproject/networks@5.7.0", "@ethersproject/networks@^5.7.0": +"@ethersproject/networks@5.7.0": version "5.7.0" resolved "https://registry.yarnpkg.com/@ethersproject/networks/-/networks-5.7.0.tgz#df72a392f1a63a57f87210515695a31a245845ad" integrity sha512-MG6oHSQHd4ebvJrleEQQ4HhVu8Ichr0RDYEfHzsVAVjHNM+w36x9wp9r+hf1JstMXtseXDtkiVoARAG6M959AA== dependencies: "@ethersproject/logger" "^5.7.0" +"@ethersproject/networks@5.7.1", "@ethersproject/networks@^5.7.0": + version "5.7.1" + resolved "https://registry.yarnpkg.com/@ethersproject/networks/-/networks-5.7.1.tgz#118e1a981d757d45ccea6bb58d9fd3d9db14ead6" + integrity sha512-n/MufjFYv3yFcUyfhnXotyDlNdFb7onmkSy8aQERi2PjNcnWQ66xXxa3XlS8nCcA8aJKJjIIMNJTC7tu80GwpQ== + dependencies: + "@ethersproject/logger" "^5.7.0" + "@ethersproject/pbkdf2@5.7.0", "@ethersproject/pbkdf2@^5.7.0": version "5.7.0" resolved "https://registry.yarnpkg.com/@ethersproject/pbkdf2/-/pbkdf2-5.7.0.tgz#d2267d0a1f6e123f3771007338c47cccd83d3102" @@ -245,6 +293,32 @@ bech32 "1.1.4" ws "7.4.6" +"@ethersproject/providers@5.7.2", "@ethersproject/providers@^5.7.1", "@ethersproject/providers@^5.7.2": + version "5.7.2" + resolved "https://registry.yarnpkg.com/@ethersproject/providers/-/providers-5.7.2.tgz#f8b1a4f275d7ce58cf0a2eec222269a08beb18cb" + integrity sha512-g34EWZ1WWAVgr4aptGlVBF8mhl3VWjv+8hoAnzStu8Ah22VHBsuGzP17eb6xDVRzw895G4W7vvx60lFFur/1Rg== + dependencies: + "@ethersproject/abstract-provider" "^5.7.0" + "@ethersproject/abstract-signer" "^5.7.0" + "@ethersproject/address" "^5.7.0" + "@ethersproject/base64" "^5.7.0" + "@ethersproject/basex" "^5.7.0" + "@ethersproject/bignumber" "^5.7.0" + "@ethersproject/bytes" "^5.7.0" + "@ethersproject/constants" "^5.7.0" + "@ethersproject/hash" "^5.7.0" + "@ethersproject/logger" "^5.7.0" + "@ethersproject/networks" "^5.7.0" + "@ethersproject/properties" "^5.7.0" + "@ethersproject/random" "^5.7.0" + "@ethersproject/rlp" "^5.7.0" + "@ethersproject/sha2" "^5.7.0" + "@ethersproject/strings" "^5.7.0" + "@ethersproject/transactions" "^5.7.0" + "@ethersproject/web" "^5.7.0" + bech32 "1.1.4" + ws "7.4.6" + "@ethersproject/random@5.7.0", "@ethersproject/random@^5.7.0": version "5.7.0" resolved "https://registry.yarnpkg.com/@ethersproject/random/-/random-5.7.0.tgz#af19dcbc2484aae078bb03656ec05df66253280c" @@ -348,7 +422,7 @@ "@ethersproject/transactions" "^5.7.0" "@ethersproject/wordlists" "^5.7.0" -"@ethersproject/web@5.7.0", "@ethersproject/web@^5.7.0": +"@ethersproject/web@5.7.0": version "5.7.0" resolved "https://registry.yarnpkg.com/@ethersproject/web/-/web-5.7.0.tgz#40850c05260edad8b54827923bbad23d96aac0bc" integrity sha512-ApHcbbj+muRASVDSCl/tgxaH2LBkRMEYfLOLVa0COipx0+nlu0QKet7U2lEg0vdkh8XRSLf2nd1f1Uk9SrVSGA== @@ -359,6 +433,17 @@ "@ethersproject/properties" "^5.7.0" "@ethersproject/strings" "^5.7.0" +"@ethersproject/web@5.7.1", "@ethersproject/web@^5.7.0": + version "5.7.1" + resolved "https://registry.yarnpkg.com/@ethersproject/web/-/web-5.7.1.tgz#de1f285b373149bee5928f4eb7bcb87ee5fbb4ae" + integrity sha512-Gueu8lSvyjBWL4cYsWsjh6MtMwM0+H4HvqFPZfB6dV8ctbP9zFAO73VG1cMWae0FLPCtz0peKPpZY8/ugJJX2w== + 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" + "@ethersproject/wordlists@5.7.0", "@ethersproject/wordlists@^5.7.0": version "5.7.0" resolved "https://registry.yarnpkg.com/@ethersproject/wordlists/-/wordlists-5.7.0.tgz#8fb2c07185d68c3e09eb3bfd6e779ba2774627f5" @@ -381,15 +466,20 @@ tweetnacl "^1.0.3" tweetnacl-util "^0.15.1" -"@noble/hashes@1.1.2", "@noble/hashes@~1.1.1": +"@noble/hashes@1.1.2": version "1.1.2" resolved "https://registry.yarnpkg.com/@noble/hashes/-/hashes-1.1.2.tgz#e9e035b9b166ca0af657a7848eb2718f0f22f183" integrity sha512-KYRCASVTv6aeUi1tsF8/vpyR7zpfs3FUzy2Jqm+MU+LmUKhQ0y2FpfwqkCcxSg2ua4GALJd8k2R76WxwZGbQpA== -"@noble/secp256k1@1.6.3", "@noble/secp256k1@~1.6.0": - version "1.6.3" - resolved "https://registry.yarnpkg.com/@noble/secp256k1/-/secp256k1-1.6.3.tgz#7eed12d9f4404b416999d0c87686836c4c5c9b94" - integrity sha512-T04e4iTurVy7I8Sw4+c5OSN9/RkPlo1uKxAomtxQNLq8j1uPAqnsqG1bqvY3Jv7c13gyr6dui0zmh/I3+f/JaQ== +"@noble/hashes@1.2.0", "@noble/hashes@~1.2.0": + version "1.2.0" + resolved "https://registry.yarnpkg.com/@noble/hashes/-/hashes-1.2.0.tgz#a3150eeb09cc7ab207ebf6d7b9ad311a9bdbed12" + integrity sha512-FZfhjEDbT5GRswV3C6uvLPHMiVD6lQBmpoX5+eSiPaMTXte/IKqI5dykDxzZB/WBeK/CDuQRBWarPdi3FNY2zQ== + +"@noble/secp256k1@1.7.1", "@noble/secp256k1@~1.7.0": + version "1.7.1" + resolved "https://registry.yarnpkg.com/@noble/secp256k1/-/secp256k1-1.7.1.tgz#b251c70f824ce3ca7f8dc3df08d58f005cc0507c" + integrity sha512-hOUk6AyBFmqVrv7k5WAw/LpszxVbj9gGN4JRkIX52fdFAj1UA61KXmZDvqVEm+pOyec3+fIeZB02LYa/pWOArw== "@nodelib/fs.scandir@2.1.5": version "2.1.5" @@ -412,29 +502,31 @@ "@nodelib/fs.scandir" "2.1.5" fastq "^1.6.0" -"@nomicfoundation/ethereumjs-block@4.0.0-rc.3", "@nomicfoundation/ethereumjs-block@^4.0.0-rc.3": - version "4.0.0-rc.3" - resolved "https://registry.yarnpkg.com/@nomicfoundation/ethereumjs-block/-/ethereumjs-block-4.0.0-rc.3.tgz#759d361968b23f06fd0f3f24023005bd3f05aa76" - integrity sha512-T+KzsCOEB4iP2Wy0OmjsxARbX8czN8LjF2pfdz9ucx37jAHfVAhWmEZaB+wfh7NZqumsBfgRtYbRJ572+nlTBQ== - dependencies: - "@nomicfoundation/ethereumjs-common" "3.0.0-rc.3" - "@nomicfoundation/ethereumjs-rlp" "4.0.0-rc.3" - "@nomicfoundation/ethereumjs-trie" "5.0.0-rc.3" - "@nomicfoundation/ethereumjs-tx" "4.0.0-rc.3" - "@nomicfoundation/ethereumjs-util" "8.0.0-rc.3" +"@nomicfoundation/ethereumjs-block@5.0.1": + version "5.0.1" + resolved "https://registry.yarnpkg.com/@nomicfoundation/ethereumjs-block/-/ethereumjs-block-5.0.1.tgz#6f89664f55febbd723195b6d0974773d29ee133d" + integrity sha512-u1Yioemi6Ckj3xspygu/SfFvm8vZEO8/Yx5a1QLzi6nVU0jz3Pg2OmHKJ5w+D9Ogk1vhwRiqEBAqcb0GVhCyHw== + dependencies: + "@nomicfoundation/ethereumjs-common" "4.0.1" + "@nomicfoundation/ethereumjs-rlp" "5.0.1" + "@nomicfoundation/ethereumjs-trie" "6.0.1" + "@nomicfoundation/ethereumjs-tx" "5.0.1" + "@nomicfoundation/ethereumjs-util" "9.0.1" ethereum-cryptography "0.1.3" + ethers "^5.7.1" -"@nomicfoundation/ethereumjs-blockchain@6.0.0-rc.3", "@nomicfoundation/ethereumjs-blockchain@^6.0.0-rc.3": - version "6.0.0-rc.3" - resolved "https://registry.yarnpkg.com/@nomicfoundation/ethereumjs-blockchain/-/ethereumjs-blockchain-6.0.0-rc.3.tgz#d6f4111447caad4f2f9c30fbe71117a7fdf081c2" - integrity sha512-GxaMYLXcyY/aFFXOiIwYYDVwHFffnddymldOsBGtGHbs0HM/kYLLF+dp3C31Q0+EaFNa6mF1L0NqAbC82CJRNA== - dependencies: - "@nomicfoundation/ethereumjs-block" "4.0.0-rc.3" - "@nomicfoundation/ethereumjs-common" "3.0.0-rc.3" - "@nomicfoundation/ethereumjs-ethash" "2.0.0-rc.3" - "@nomicfoundation/ethereumjs-rlp" "4.0.0-rc.3" - "@nomicfoundation/ethereumjs-trie" "5.0.0-rc.3" - "@nomicfoundation/ethereumjs-util" "8.0.0-rc.3" +"@nomicfoundation/ethereumjs-blockchain@7.0.1": + version "7.0.1" + resolved "https://registry.yarnpkg.com/@nomicfoundation/ethereumjs-blockchain/-/ethereumjs-blockchain-7.0.1.tgz#80e0bd3535bfeb9baa29836b6f25123dab06a726" + integrity sha512-NhzndlGg829XXbqJEYrF1VeZhAwSPgsK/OB7TVrdzft3y918hW5KNd7gIZ85sn6peDZOdjBsAXIpXZ38oBYE5A== + dependencies: + "@nomicfoundation/ethereumjs-block" "5.0.1" + "@nomicfoundation/ethereumjs-common" "4.0.1" + "@nomicfoundation/ethereumjs-ethash" "3.0.1" + "@nomicfoundation/ethereumjs-rlp" "5.0.1" + "@nomicfoundation/ethereumjs-trie" "6.0.1" + "@nomicfoundation/ethereumjs-tx" "5.0.1" + "@nomicfoundation/ethereumjs-util" "9.0.1" abstract-level "^1.0.3" debug "^4.3.3" ethereum-cryptography "0.1.3" @@ -442,105 +534,105 @@ lru-cache "^5.1.1" memory-level "^1.0.0" -"@nomicfoundation/ethereumjs-common@3.0.0-rc.3", "@nomicfoundation/ethereumjs-common@^3.0.0-rc.3": - version "3.0.0-rc.3" - resolved "https://registry.yarnpkg.com/@nomicfoundation/ethereumjs-common/-/ethereumjs-common-3.0.0-rc.3.tgz#f0a43d0a9db0a0ebb587e8b5bac022c152c1da31" - integrity sha512-r7qLtNabVEHNihLZevHV0weNshDpXo/o7i0JD9O10OExdicpgHPsU4qGnAvzO9bby9ANO2ydrOIlrYSm4lBkTg== +"@nomicfoundation/ethereumjs-common@4.0.1": + version "4.0.1" + resolved "https://registry.yarnpkg.com/@nomicfoundation/ethereumjs-common/-/ethereumjs-common-4.0.1.tgz#4702d82df35b07b5407583b54a45bf728e46a2f0" + integrity sha512-OBErlkfp54GpeiE06brBW/TTbtbuBJV5YI5Nz/aB2evTDo+KawyEzPjBlSr84z/8MFfj8wS2wxzQX1o32cev5g== dependencies: - "@nomicfoundation/ethereumjs-util" "8.0.0-rc.3" + "@nomicfoundation/ethereumjs-util" "9.0.1" crc-32 "^1.2.0" -"@nomicfoundation/ethereumjs-ethash@2.0.0-rc.3": - version "2.0.0-rc.3" - resolved "https://registry.yarnpkg.com/@nomicfoundation/ethereumjs-ethash/-/ethereumjs-ethash-2.0.0-rc.3.tgz#78476d68fd15f3ab3ade8b1ad68407d8ac7b96eb" - integrity sha512-l75FH3KYUXuXjEdVZ3P7iVBbFhsghIMUuOBVfau4vx90SEGUQZnrU6cg9jBTyYvn0w9IIKJ76ZmDV8RDohZktA== +"@nomicfoundation/ethereumjs-ethash@3.0.1": + version "3.0.1" + resolved "https://registry.yarnpkg.com/@nomicfoundation/ethereumjs-ethash/-/ethereumjs-ethash-3.0.1.tgz#65ca494d53e71e8415c9a49ef48bc921c538fc41" + integrity sha512-KDjGIB5igzWOp8Ik5I6QiRH5DH+XgILlplsHR7TEuWANZA759G6krQ6o8bvj+tRUz08YygMQu/sGd9mJ1DYT8w== dependencies: - "@nomicfoundation/ethereumjs-block" "4.0.0-rc.3" - "@nomicfoundation/ethereumjs-rlp" "4.0.0-rc.3" - "@nomicfoundation/ethereumjs-util" "8.0.0-rc.3" + "@nomicfoundation/ethereumjs-block" "5.0.1" + "@nomicfoundation/ethereumjs-rlp" "5.0.1" + "@nomicfoundation/ethereumjs-util" "9.0.1" abstract-level "^1.0.3" bigint-crypto-utils "^3.0.23" ethereum-cryptography "0.1.3" -"@nomicfoundation/ethereumjs-evm@1.0.0-rc.3", "@nomicfoundation/ethereumjs-evm@^1.0.0-rc.3": - version "1.0.0-rc.3" - resolved "https://registry.yarnpkg.com/@nomicfoundation/ethereumjs-evm/-/ethereumjs-evm-1.0.0-rc.3.tgz#b09b470e33984211df9e1ca7fdff3261b6caef84" - integrity sha512-FY/SxIazYeJQ2uvx5uXV+MRgThrPjzr0nKMEyrFZPgbZb4KvcZarJuQVaJhQ4a5foqq8aHHRbWLdJQyWn9c2jw== +"@nomicfoundation/ethereumjs-evm@2.0.1": + version "2.0.1" + resolved "https://registry.yarnpkg.com/@nomicfoundation/ethereumjs-evm/-/ethereumjs-evm-2.0.1.tgz#f35681e203363f69ce2b3d3bf9f44d4e883ca1f1" + integrity sha512-oL8vJcnk0Bx/onl+TgQOQ1t/534GKFaEG17fZmwtPFeH8S5soiBYPCLUrvANOl4sCp9elYxIMzIiTtMtNNN8EQ== dependencies: - "@nomicfoundation/ethereumjs-common" "3.0.0-rc.3" - "@nomicfoundation/ethereumjs-util" "8.0.0-rc.3" - "@types/async-eventemitter" "^0.2.1" - async-eventemitter "^0.2.4" + "@ethersproject/providers" "^5.7.1" + "@nomicfoundation/ethereumjs-common" "4.0.1" + "@nomicfoundation/ethereumjs-tx" "5.0.1" + "@nomicfoundation/ethereumjs-util" "9.0.1" debug "^4.3.3" ethereum-cryptography "0.1.3" mcl-wasm "^0.7.1" rustbn.js "~0.2.0" -"@nomicfoundation/ethereumjs-rlp@4.0.0-rc.3", "@nomicfoundation/ethereumjs-rlp@^4.0.0-beta.2", "@nomicfoundation/ethereumjs-rlp@^4.0.0-rc.3": - version "4.0.0-rc.3" - resolved "https://registry.yarnpkg.com/@nomicfoundation/ethereumjs-rlp/-/ethereumjs-rlp-4.0.0-rc.3.tgz#f654b6aaf74b0859ba68bac9522df82d847070cd" - integrity sha512-4F3fYTdqJhBNDoZ4o7uGzorvcbXuSeRXz46X/Z1TGMri5FjpWFl48qEOse2RpXCFudlAv7n/MpgJSuFzN1vreQ== +"@nomicfoundation/ethereumjs-rlp@5.0.1": + version "5.0.1" + resolved "https://registry.yarnpkg.com/@nomicfoundation/ethereumjs-rlp/-/ethereumjs-rlp-5.0.1.tgz#0b30c1cf77d125d390408e391c4bb5291ef43c28" + integrity sha512-xtxrMGa8kP4zF5ApBQBtjlSbN5E2HI8m8FYgVSYAnO6ssUoY5pVPGy2H8+xdf/bmMa22Ce8nWMH3aEW8CcqMeQ== -"@nomicfoundation/ethereumjs-statemanager@1.0.0-rc.3", "@nomicfoundation/ethereumjs-statemanager@^1.0.0-rc.3": - version "1.0.0-rc.3" - resolved "https://registry.yarnpkg.com/@nomicfoundation/ethereumjs-statemanager/-/ethereumjs-statemanager-1.0.0-rc.3.tgz#1057e81406f058166f68c6af9aac48693cc9ad1a" - integrity sha512-c69I4eZN9LFXUp1OI8hGwTvQMmcICus+MLgK5HELKLexV1SKs+K0iA4jgTK6VMM4wrzkmljyVxU5pM0Cb82XAQ== +"@nomicfoundation/ethereumjs-statemanager@2.0.1": + version "2.0.1" + resolved "https://registry.yarnpkg.com/@nomicfoundation/ethereumjs-statemanager/-/ethereumjs-statemanager-2.0.1.tgz#8824a97938db4471911e2d2f140f79195def5935" + integrity sha512-B5ApMOnlruVOR7gisBaYwFX+L/AP7i/2oAahatssjPIBVDF6wTX1K7Qpa39E/nzsH8iYuL3krkYeUFIdO3EMUQ== dependencies: - "@nomicfoundation/ethereumjs-common" "3.0.0-rc.3" - "@nomicfoundation/ethereumjs-rlp" "4.0.0-rc.3" - "@nomicfoundation/ethereumjs-trie" "5.0.0-rc.3" - "@nomicfoundation/ethereumjs-util" "8.0.0-rc.3" + "@nomicfoundation/ethereumjs-common" "4.0.1" + "@nomicfoundation/ethereumjs-rlp" "5.0.1" debug "^4.3.3" ethereum-cryptography "0.1.3" - functional-red-black-tree "^1.0.1" + ethers "^5.7.1" + js-sdsl "^4.1.4" -"@nomicfoundation/ethereumjs-trie@5.0.0-rc.3", "@nomicfoundation/ethereumjs-trie@^5.0.0-rc.3": - version "5.0.0-rc.3" - resolved "https://registry.yarnpkg.com/@nomicfoundation/ethereumjs-trie/-/ethereumjs-trie-5.0.0-rc.3.tgz#df642ca1883eea0e2c2555028ae912b585d69da6" - integrity sha512-hz84rSGiYOs3vANLGxQm12gKtERMQzkgt1fZBu/OJulMCU+kR1CZxptVpmeg7W8n4NCyIcMPpGeshTMhg8zC5A== +"@nomicfoundation/ethereumjs-trie@6.0.1": + version "6.0.1" + resolved "https://registry.yarnpkg.com/@nomicfoundation/ethereumjs-trie/-/ethereumjs-trie-6.0.1.tgz#662c55f6b50659fd4b22ea9f806a7401cafb7717" + integrity sha512-A64It/IMpDVODzCgxDgAAla8jNjNtsoQZIzZUfIV5AY6Coi4nvn7+VReBn5itlxMiL2yaTlQr9TRWp3CSI6VoA== dependencies: - "@nomicfoundation/ethereumjs-rlp" "4.0.0-rc.3" - "@nomicfoundation/ethereumjs-util" "8.0.0-rc.3" + "@nomicfoundation/ethereumjs-rlp" "5.0.1" + "@nomicfoundation/ethereumjs-util" "9.0.1" + "@types/readable-stream" "^2.3.13" ethereum-cryptography "0.1.3" readable-stream "^3.6.0" -"@nomicfoundation/ethereumjs-tx@4.0.0-rc.3", "@nomicfoundation/ethereumjs-tx@^4.0.0-rc.3": - version "4.0.0-rc.3" - resolved "https://registry.yarnpkg.com/@nomicfoundation/ethereumjs-tx/-/ethereumjs-tx-4.0.0-rc.3.tgz#0b56bbaee0908491b21419808a44bc0356438060" - integrity sha512-Z3/EYglP+uKyzQj5pc2oMv/vuJ3ZZ2v3qVqRG9k5EsGXNB1lzN1zIh6NCW/vw/AdGoH69MDNGzG5hqGZ9cJJiw== - dependencies: - "@nomicfoundation/ethereumjs-common" "3.0.0-rc.3" - "@nomicfoundation/ethereumjs-rlp" "4.0.0-rc.3" - "@nomicfoundation/ethereumjs-util" "8.0.0-rc.3" +"@nomicfoundation/ethereumjs-tx@5.0.1": + version "5.0.1" + resolved "https://registry.yarnpkg.com/@nomicfoundation/ethereumjs-tx/-/ethereumjs-tx-5.0.1.tgz#7629dc2036b4a33c34e9f0a592b43227ef4f0c7d" + integrity sha512-0HwxUF2u2hrsIM1fsasjXvlbDOq1ZHFV2dd1yGq8CA+MEYhaxZr8OTScpVkkxqMwBcc5y83FyPl0J9MZn3kY0w== + dependencies: + "@chainsafe/ssz" "^0.9.2" + "@ethersproject/providers" "^5.7.2" + "@nomicfoundation/ethereumjs-common" "4.0.1" + "@nomicfoundation/ethereumjs-rlp" "5.0.1" + "@nomicfoundation/ethereumjs-util" "9.0.1" ethereum-cryptography "0.1.3" -"@nomicfoundation/ethereumjs-util@8.0.0-rc.3", "@nomicfoundation/ethereumjs-util@^8.0.0-rc.3": - version "8.0.0-rc.3" - resolved "https://registry.yarnpkg.com/@nomicfoundation/ethereumjs-util/-/ethereumjs-util-8.0.0-rc.3.tgz#d47dca076b5ea41b4498cf8292666d21f31b4e88" - integrity sha512-Ldd1NVbk+FtP/JKCQTOVrBJzHMXpMnUdqE9oetAqKVnaLszXMEUa/B0fBdJaPIXKU/c9tAba29/pGxRpcQbgKQ== +"@nomicfoundation/ethereumjs-util@9.0.1": + version "9.0.1" + resolved "https://registry.yarnpkg.com/@nomicfoundation/ethereumjs-util/-/ethereumjs-util-9.0.1.tgz#530cda8bae33f8b5020a8f199ed1d0a2ce48ec89" + integrity sha512-TwbhOWQ8QoSCFhV/DDfSmyfFIHjPjFBj957219+V3jTZYZ2rf9PmDtNOeZWAE3p3vlp8xb02XGpd0v6nTUPbsA== dependencies: - "@nomicfoundation/ethereumjs-rlp" "^4.0.0-beta.2" + "@chainsafe/ssz" "^0.10.0" + "@nomicfoundation/ethereumjs-rlp" "5.0.1" ethereum-cryptography "0.1.3" -"@nomicfoundation/ethereumjs-vm@^6.0.0-rc.3": - version "6.0.0-rc.3" - resolved "https://registry.yarnpkg.com/@nomicfoundation/ethereumjs-vm/-/ethereumjs-vm-6.0.0-rc.3.tgz#e1e3f29b45a206fdaafdff8316081c98a558407b" - integrity sha512-MF6WeU0sx+6zM8ustttlZZFZtI6/c/qIWVnxrT6K5VRaiC1Us1ih3S8HBr6xNkl6JgBHj0e0oC1CA9xiowwlUQ== - dependencies: - "@nomicfoundation/ethereumjs-block" "4.0.0-rc.3" - "@nomicfoundation/ethereumjs-blockchain" "6.0.0-rc.3" - "@nomicfoundation/ethereumjs-common" "3.0.0-rc.3" - "@nomicfoundation/ethereumjs-evm" "1.0.0-rc.3" - "@nomicfoundation/ethereumjs-rlp" "4.0.0-rc.3" - "@nomicfoundation/ethereumjs-statemanager" "1.0.0-rc.3" - "@nomicfoundation/ethereumjs-trie" "5.0.0-rc.3" - "@nomicfoundation/ethereumjs-tx" "4.0.0-rc.3" - "@nomicfoundation/ethereumjs-util" "8.0.0-rc.3" - "@types/async-eventemitter" "^0.2.1" - async-eventemitter "^0.2.4" +"@nomicfoundation/ethereumjs-vm@7.0.1": + version "7.0.1" + resolved "https://registry.yarnpkg.com/@nomicfoundation/ethereumjs-vm/-/ethereumjs-vm-7.0.1.tgz#7d035e0993bcad10716c8b36e61dfb87fa3ca05f" + integrity sha512-rArhyn0jPsS/D+ApFsz3yVJMQ29+pVzNZ0VJgkzAZ+7FqXSRtThl1C1prhmlVr3YNUlfpZ69Ak+RUT4g7VoOuQ== + dependencies: + "@nomicfoundation/ethereumjs-block" "5.0.1" + "@nomicfoundation/ethereumjs-blockchain" "7.0.1" + "@nomicfoundation/ethereumjs-common" "4.0.1" + "@nomicfoundation/ethereumjs-evm" "2.0.1" + "@nomicfoundation/ethereumjs-rlp" "5.0.1" + "@nomicfoundation/ethereumjs-statemanager" "2.0.1" + "@nomicfoundation/ethereumjs-trie" "6.0.1" + "@nomicfoundation/ethereumjs-tx" "5.0.1" + "@nomicfoundation/ethereumjs-util" "9.0.1" debug "^4.3.3" ethereum-cryptography "0.1.3" - functional-red-black-tree "^1.0.1" mcl-wasm "^0.7.1" rustbn.js "~0.2.0" @@ -556,92 +648,97 @@ deep-eql "^4.0.1" ordinal "^1.0.3" -"@nomicfoundation/solidity-analyzer-darwin-arm64@0.0.3": - version "0.0.3" - resolved "https://registry.yarnpkg.com/@nomicfoundation/solidity-analyzer-darwin-arm64/-/solidity-analyzer-darwin-arm64-0.0.3.tgz#1d49e4ac028831a3011a9f3dca60bd1963185342" - integrity sha512-W+bIiNiZmiy+MTYFZn3nwjyPUO6wfWJ0lnXx2zZrM8xExKObMrhCh50yy8pQING24mHfpPFCn89wEB/iG7vZDw== - -"@nomicfoundation/solidity-analyzer-darwin-x64@0.0.3": - version "0.0.3" - resolved "https://registry.yarnpkg.com/@nomicfoundation/solidity-analyzer-darwin-x64/-/solidity-analyzer-darwin-x64-0.0.3.tgz#c0fccecc5506ff5466225e41e65691abafef3dbe" - integrity sha512-HuJd1K+2MgmFIYEpx46uzwEFjvzKAI765mmoMxy4K+Aqq1p+q7hHRlsFU2kx3NB8InwotkkIq3A5FLU1sI1WDw== - -"@nomicfoundation/solidity-analyzer-freebsd-x64@0.0.3": - version "0.0.3" - resolved "https://registry.yarnpkg.com/@nomicfoundation/solidity-analyzer-freebsd-x64/-/solidity-analyzer-freebsd-x64-0.0.3.tgz#8261d033f7172b347490cd005931ef8168ab4d73" - integrity sha512-2cR8JNy23jZaO/vZrsAnWCsO73asU7ylrHIe0fEsXbZYqBP9sMr+/+xP3CELDHJxUbzBY8zqGvQt1ULpyrG+Kw== - -"@nomicfoundation/solidity-analyzer-linux-arm64-gnu@0.0.3": - version "0.0.3" - resolved "https://registry.yarnpkg.com/@nomicfoundation/solidity-analyzer-linux-arm64-gnu/-/solidity-analyzer-linux-arm64-gnu-0.0.3.tgz#1ba64b1d76425f8953dedc6367bd7dd46f31dfc5" - integrity sha512-Eyv50EfYbFthoOb0I1568p+eqHGLwEUhYGOxcRNywtlTE9nj+c+MT1LA53HnxD9GsboH4YtOOmJOulrjG7KtbA== - -"@nomicfoundation/solidity-analyzer-linux-arm64-musl@0.0.3": - version "0.0.3" - resolved "https://registry.yarnpkg.com/@nomicfoundation/solidity-analyzer-linux-arm64-musl/-/solidity-analyzer-linux-arm64-musl-0.0.3.tgz#8d864c49b55e683f7e3b5cce9d10b628797280ac" - integrity sha512-V8grDqI+ivNrgwEt2HFdlwqV2/EQbYAdj3hbOvjrA8Qv+nq4h9jhQUxFpegYMDtpU8URJmNNlXgtfucSrAQwtQ== - -"@nomicfoundation/solidity-analyzer-linux-x64-gnu@0.0.3": - version "0.0.3" - resolved "https://registry.yarnpkg.com/@nomicfoundation/solidity-analyzer-linux-x64-gnu/-/solidity-analyzer-linux-x64-gnu-0.0.3.tgz#16e769500cf1a8bb42ab9498cee3b93c30f78295" - integrity sha512-uRfVDlxtwT1vIy7MAExWAkRD4r9M79zMG7S09mCrWUn58DbLs7UFl+dZXBX0/8FTGYWHhOT/1Etw1ZpAf5DTrg== - -"@nomicfoundation/solidity-analyzer-linux-x64-musl@0.0.3": - version "0.0.3" - resolved "https://registry.yarnpkg.com/@nomicfoundation/solidity-analyzer-linux-x64-musl/-/solidity-analyzer-linux-x64-musl-0.0.3.tgz#75f4e1a25526d54c506e4eba63b3d698b6255b8f" - integrity sha512-8HPwYdLbhcPpSwsE0yiU/aZkXV43vlXT2ycH+XlOjWOnLfH8C41z0njK8DHRtEFnp4OVN6E7E5lHBBKDZXCliA== - -"@nomicfoundation/solidity-analyzer-win32-arm64-msvc@0.0.3": - version "0.0.3" - resolved "https://registry.yarnpkg.com/@nomicfoundation/solidity-analyzer-win32-arm64-msvc/-/solidity-analyzer-win32-arm64-msvc-0.0.3.tgz#ef6e20cfad5eedfdb145cc34a44501644cd7d015" - integrity sha512-5WWcT6ZNvfCuxjlpZOY7tdvOqT1kIQYlDF9Q42wMpZ5aTm4PvjdCmFDDmmTvyXEBJ4WTVmY5dWNWaxy8h/E28g== - -"@nomicfoundation/solidity-analyzer-win32-ia32-msvc@0.0.3": - version "0.0.3" - resolved "https://registry.yarnpkg.com/@nomicfoundation/solidity-analyzer-win32-ia32-msvc/-/solidity-analyzer-win32-ia32-msvc-0.0.3.tgz#98c4e3af9cee68896220fa7e270aefdf7fc89c7b" - integrity sha512-P/LWGZwWkyjSwkzq6skvS2wRc3gabzAbk6Akqs1/Iiuggql2CqdLBkcYWL5Xfv3haynhL+2jlNkak+v2BTZI4A== - -"@nomicfoundation/solidity-analyzer-win32-x64-msvc@0.0.3": - version "0.0.3" - resolved "https://registry.yarnpkg.com/@nomicfoundation/solidity-analyzer-win32-x64-msvc/-/solidity-analyzer-win32-x64-msvc-0.0.3.tgz#12da288e7ef17ec14848f19c1e8561fed20d231d" - integrity sha512-4AcTtLZG1s/S5mYAIr/sdzywdNwJpOcdStGF3QMBzEt+cGn3MchMaS9b1gyhb2KKM2c39SmPF5fUuWq1oBSQZQ== - -"@nomicfoundation/solidity-analyzer@^0.0.3": - version "0.0.3" - resolved "https://registry.yarnpkg.com/@nomicfoundation/solidity-analyzer/-/solidity-analyzer-0.0.3.tgz#d1029f872e66cb1082503b02cc8b0be12f8dd95e" - integrity sha512-VFMiOQvsw7nx5bFmrmVp2Q9rhIjw2AFST4DYvWVVO9PMHPE23BY2+kyfrQ4J3xCMFC8fcBbGLt7l4q7m1SlTqg== +"@nomicfoundation/solidity-analyzer-darwin-arm64@0.1.1": + version "0.1.1" + resolved "https://registry.yarnpkg.com/@nomicfoundation/solidity-analyzer-darwin-arm64/-/solidity-analyzer-darwin-arm64-0.1.1.tgz#4c858096b1c17fe58a474fe81b46815f93645c15" + integrity sha512-KcTodaQw8ivDZyF+D76FokN/HdpgGpfjc/gFCImdLUyqB6eSWVaZPazMbeAjmfhx3R0zm/NYVzxwAokFKgrc0w== + +"@nomicfoundation/solidity-analyzer-darwin-x64@0.1.1": + version "0.1.1" + resolved "https://registry.yarnpkg.com/@nomicfoundation/solidity-analyzer-darwin-x64/-/solidity-analyzer-darwin-x64-0.1.1.tgz#6e25ccdf6e2d22389c35553b64fe6f3fdaec432c" + integrity sha512-XhQG4BaJE6cIbjAVtzGOGbK3sn1BO9W29uhk9J8y8fZF1DYz0Doj8QDMfpMu+A6TjPDs61lbsmeYodIDnfveSA== + +"@nomicfoundation/solidity-analyzer-freebsd-x64@0.1.1": + version "0.1.1" + resolved "https://registry.yarnpkg.com/@nomicfoundation/solidity-analyzer-freebsd-x64/-/solidity-analyzer-freebsd-x64-0.1.1.tgz#0a224ea50317139caeebcdedd435c28a039d169c" + integrity sha512-GHF1VKRdHW3G8CndkwdaeLkVBi5A9u2jwtlS7SLhBc8b5U/GcoL39Q+1CSO3hYqePNP+eV5YI7Zgm0ea6kMHoA== + +"@nomicfoundation/solidity-analyzer-linux-arm64-gnu@0.1.1": + version "0.1.1" + resolved "https://registry.yarnpkg.com/@nomicfoundation/solidity-analyzer-linux-arm64-gnu/-/solidity-analyzer-linux-arm64-gnu-0.1.1.tgz#dfa085d9ffab9efb2e7b383aed3f557f7687ac2b" + integrity sha512-g4Cv2fO37ZsUENQ2vwPnZc2zRenHyAxHcyBjKcjaSmmkKrFr64yvzeNO8S3GBFCo90rfochLs99wFVGT/0owpg== + +"@nomicfoundation/solidity-analyzer-linux-arm64-musl@0.1.1": + version "0.1.1" + resolved "https://registry.yarnpkg.com/@nomicfoundation/solidity-analyzer-linux-arm64-musl/-/solidity-analyzer-linux-arm64-musl-0.1.1.tgz#c9e06b5d513dd3ab02a7ac069c160051675889a4" + integrity sha512-WJ3CE5Oek25OGE3WwzK7oaopY8xMw9Lhb0mlYuJl/maZVo+WtP36XoQTb7bW/i8aAdHW5Z+BqrHMux23pvxG3w== + +"@nomicfoundation/solidity-analyzer-linux-x64-gnu@0.1.1": + version "0.1.1" + resolved "https://registry.yarnpkg.com/@nomicfoundation/solidity-analyzer-linux-x64-gnu/-/solidity-analyzer-linux-x64-gnu-0.1.1.tgz#8d328d16839e52571f72f2998c81e46bf320f893" + integrity sha512-5WN7leSr5fkUBBjE4f3wKENUy9HQStu7HmWqbtknfXkkil+eNWiBV275IOlpXku7v3uLsXTOKpnnGHJYI2qsdA== + +"@nomicfoundation/solidity-analyzer-linux-x64-musl@0.1.1": + version "0.1.1" + resolved "https://registry.yarnpkg.com/@nomicfoundation/solidity-analyzer-linux-x64-musl/-/solidity-analyzer-linux-x64-musl-0.1.1.tgz#9b49d0634b5976bb5ed1604a1e1b736f390959bb" + integrity sha512-KdYMkJOq0SYPQMmErv/63CwGwMm5XHenEna9X9aB8mQmhDBrYrlAOSsIPgFCUSL0hjxE3xHP65/EPXR/InD2+w== + +"@nomicfoundation/solidity-analyzer-win32-arm64-msvc@0.1.1": + version "0.1.1" + resolved "https://registry.yarnpkg.com/@nomicfoundation/solidity-analyzer-win32-arm64-msvc/-/solidity-analyzer-win32-arm64-msvc-0.1.1.tgz#e2867af7264ebbcc3131ef837878955dd6a3676f" + integrity sha512-VFZASBfl4qiBYwW5xeY20exWhmv6ww9sWu/krWSesv3q5hA0o1JuzmPHR4LPN6SUZj5vcqci0O6JOL8BPw+APg== + +"@nomicfoundation/solidity-analyzer-win32-ia32-msvc@0.1.1": + version "0.1.1" + resolved "https://registry.yarnpkg.com/@nomicfoundation/solidity-analyzer-win32-ia32-msvc/-/solidity-analyzer-win32-ia32-msvc-0.1.1.tgz#0685f78608dd516c8cdfb4896ed451317e559585" + integrity sha512-JnFkYuyCSA70j6Si6cS1A9Gh1aHTEb8kOTBApp/c7NRTFGNMH8eaInKlyuuiIbvYFhlXW4LicqyYuWNNq9hkpQ== + +"@nomicfoundation/solidity-analyzer-win32-x64-msvc@0.1.1": + version "0.1.1" + resolved "https://registry.yarnpkg.com/@nomicfoundation/solidity-analyzer-win32-x64-msvc/-/solidity-analyzer-win32-x64-msvc-0.1.1.tgz#c9a44f7108646f083b82e851486e0f6aeb785836" + integrity sha512-HrVJr6+WjIXGnw3Q9u6KQcbZCtk0caVWhCdFADySvRyUxJ8PnzlaP+MhwNE8oyT8OZ6ejHBRrrgjSqDCFXGirw== + +"@nomicfoundation/solidity-analyzer@^0.1.0": + version "0.1.1" + resolved "https://registry.yarnpkg.com/@nomicfoundation/solidity-analyzer/-/solidity-analyzer-0.1.1.tgz#f5f4d36d3f66752f59a57e7208cd856f3ddf6f2d" + integrity sha512-1LMtXj1puAxyFusBgUIy5pZk3073cNXYnXUpuNKFghHbIit/xZgbk0AokpUADbNm3gyD6bFWl3LRFh3dhVdREg== optionalDependencies: - "@nomicfoundation/solidity-analyzer-darwin-arm64" "0.0.3" - "@nomicfoundation/solidity-analyzer-darwin-x64" "0.0.3" - "@nomicfoundation/solidity-analyzer-freebsd-x64" "0.0.3" - "@nomicfoundation/solidity-analyzer-linux-arm64-gnu" "0.0.3" - "@nomicfoundation/solidity-analyzer-linux-arm64-musl" "0.0.3" - "@nomicfoundation/solidity-analyzer-linux-x64-gnu" "0.0.3" - "@nomicfoundation/solidity-analyzer-linux-x64-musl" "0.0.3" - "@nomicfoundation/solidity-analyzer-win32-arm64-msvc" "0.0.3" - "@nomicfoundation/solidity-analyzer-win32-ia32-msvc" "0.0.3" - "@nomicfoundation/solidity-analyzer-win32-x64-msvc" "0.0.3" - -"@nomiclabs/hardhat-ethers@^2.0.6", "@nomiclabs/hardhat-ethers@^2.1.1": + "@nomicfoundation/solidity-analyzer-darwin-arm64" "0.1.1" + "@nomicfoundation/solidity-analyzer-darwin-x64" "0.1.1" + "@nomicfoundation/solidity-analyzer-freebsd-x64" "0.1.1" + "@nomicfoundation/solidity-analyzer-linux-arm64-gnu" "0.1.1" + "@nomicfoundation/solidity-analyzer-linux-arm64-musl" "0.1.1" + "@nomicfoundation/solidity-analyzer-linux-x64-gnu" "0.1.1" + "@nomicfoundation/solidity-analyzer-linux-x64-musl" "0.1.1" + "@nomicfoundation/solidity-analyzer-win32-arm64-msvc" "0.1.1" + "@nomicfoundation/solidity-analyzer-win32-ia32-msvc" "0.1.1" + "@nomicfoundation/solidity-analyzer-win32-x64-msvc" "0.1.1" + +"@nomiclabs/hardhat-ethers@^2.0.6": version "2.1.1" resolved "https://registry.yarnpkg.com/@nomiclabs/hardhat-ethers/-/hardhat-ethers-2.1.1.tgz#3f1d1ab49813d1bae4c035cc1adec224711e528b" integrity sha512-Gg0IFkT/DW3vOpih4/kMjeZCLYqtfgECLeLXTs7ZDPzcK0cfoc5wKk4nq5n/izCUzdhidO/Utd6ptF9JrWwWVA== +"@nomiclabs/hardhat-ethers@^2.1.1": + version "2.2.3" + resolved "https://registry.yarnpkg.com/@nomiclabs/hardhat-ethers/-/hardhat-ethers-2.2.3.tgz#b41053e360c31a32c2640c9a45ee981a7e603fe0" + integrity sha512-YhzPdzb612X591FOe68q+qXVXGG2ANZRvDo0RRUtimev85rCrAlv/TLMEZw5c+kq9AbzocLTVX/h2jVIFPL9Xg== + "@nomiclabs/hardhat-etherscan@^3.1.0": - version "3.1.0" - resolved "https://registry.yarnpkg.com/@nomiclabs/hardhat-etherscan/-/hardhat-etherscan-3.1.0.tgz#7137554862b3b1c914f1b1bf110f0529fd2dec53" - integrity sha512-JroYgfN1AlYFkQTQ3nRwFi4o8NtZF7K/qFR2dxDUgHbCtIagkUseca9L4E/D2ScUm4XT40+8PbCdqZi+XmHyQA== + version "3.1.7" + resolved "https://registry.yarnpkg.com/@nomiclabs/hardhat-etherscan/-/hardhat-etherscan-3.1.7.tgz#72e3d5bd5d0ceb695e097a7f6f5ff6fcbf062b9a" + integrity sha512-tZ3TvSgpvsQ6B6OGmo1/Au6u8BrAkvs1mIC/eURA3xgIfznUZBhmpne8hv7BXUzw9xNL3fXdpOYgOQlVMTcoHQ== dependencies: "@ethersproject/abi" "^5.1.2" "@ethersproject/address" "^5.0.2" - cbor "^5.0.2" + cbor "^8.1.0" chalk "^2.4.2" debug "^4.1.1" fs-extra "^7.0.1" lodash "^4.17.11" semver "^6.3.0" table "^6.8.0" - undici "^5.4.0" + undici "^5.14.0" "@openzeppelin/contracts-upgradeable@^4.8.3": version "4.8.3" @@ -681,21 +778,21 @@ resolved "https://registry.yarnpkg.com/@scure/base/-/base-1.1.1.tgz#ebb651ee52ff84f420097055f4bf46cfba403938" integrity sha512-ZxOhsSyxYwLJj3pLZCefNitxsj093tb2vq90mp2txoYeBqbcjDjqFhyM8eUjq/uFm6zJ+mUuqxlS2FkuSY1MTA== -"@scure/bip32@1.1.0": - version "1.1.0" - resolved "https://registry.yarnpkg.com/@scure/bip32/-/bip32-1.1.0.tgz#dea45875e7fbc720c2b4560325f1cf5d2246d95b" - integrity sha512-ftTW3kKX54YXLCxH6BB7oEEoJfoE2pIgw7MINKAs5PsS6nqKPuKk1haTF/EuHmYqG330t5GSrdmtRuHaY1a62Q== +"@scure/bip32@1.1.5": + version "1.1.5" + resolved "https://registry.yarnpkg.com/@scure/bip32/-/bip32-1.1.5.tgz#d2ccae16dcc2e75bc1d75f5ef3c66a338d1ba300" + integrity sha512-XyNh1rB0SkEqd3tXcXMi+Xe1fvg+kUIcoRIEujP1Jgv7DqW2r9lg3Ah0NkFaCs9sTkQAQA8kw7xiRXzENi9Rtw== dependencies: - "@noble/hashes" "~1.1.1" - "@noble/secp256k1" "~1.6.0" + "@noble/hashes" "~1.2.0" + "@noble/secp256k1" "~1.7.0" "@scure/base" "~1.1.0" -"@scure/bip39@1.1.0": - version "1.1.0" - resolved "https://registry.yarnpkg.com/@scure/bip39/-/bip39-1.1.0.tgz#92f11d095bae025f166bef3defcc5bf4945d419a" - integrity sha512-pwrPOS16VeTKg98dYXQyIjJEcWfz7/1YJIwxUEPFfQPtc86Ym/1sVgQ2RLoD43AazMk2l/unK4ITySSpW2+82w== +"@scure/bip39@1.1.1": + version "1.1.1" + resolved "https://registry.yarnpkg.com/@scure/bip39/-/bip39-1.1.1.tgz#b54557b2e86214319405db819c4b6a370cf340c5" + integrity sha512-t+wDck2rVkh65Hmv280fYdVdY25J9YeEUIgn2LG1WM6gxFkGzcksoDiUkWVpVp3Oex9xGC68JU2dSbUfwZ2jPg== dependencies: - "@noble/hashes" "~1.1.1" + "@noble/hashes" "~1.2.0" "@scure/base" "~1.1.0" "@sentry/core@5.30.0": @@ -786,11 +883,6 @@ hardhat-deploy "^0.11.10" js-yaml "^3.14.0" -"@types/async-eventemitter@^0.2.1": - version "0.2.1" - resolved "https://registry.yarnpkg.com/@types/async-eventemitter/-/async-eventemitter-0.2.1.tgz#f8e6280e87e8c60b2b938624b0a3530fb3e24712" - integrity sha512-M2P4Ng26QbAeITiH7w1d7OxtldgfAe0wobpyJzVK/XOb0cUGKU2R4pfAhqcJBXAe2ife5ZOhSv4wk7p+ffURtg== - "@types/bn.js@^4.11.3": version "4.11.6" resolved "https://registry.yarnpkg.com/@types/bn.js/-/bn.js-4.11.6.tgz#c306c70d9358aaea33cd4eda092a742b9505967c" @@ -850,9 +942,9 @@ integrity sha512-K0VQKziLUWkVKiRVrx4a40iPaxTUefQmjtkQofBkYRcoaaL/8rhwDWww9qWbrgicNOgnpIsMxyNIUM4+n6dUIA== "@types/node@*": - version "18.7.16" - resolved "https://registry.yarnpkg.com/@types/node/-/node-18.7.16.tgz#0eb3cce1e37c79619943d2fd903919fc30850601" - integrity sha512-EQHhixfu+mkqHMZl1R2Ovuvn47PUw18azMJOTwSZr9/fhzHNGXAJ0ma0dayRVchprpCj0Kc1K1xKoWaATWF1qg== + version "20.2.1" + resolved "https://registry.yarnpkg.com/@types/node/-/node-20.2.1.tgz#de559d4b33be9a808fd43372ccee822c70f39704" + integrity sha512-DqJociPbZP1lbZ5SQPk4oag6W7AyaGMO6gSfRwq3PWl4PXTwJpRQJhDq4W0kzrg3w6tJ1SwlvGZ5uKFHY13LIg== "@types/node@^10.0.3": version "10.17.60" @@ -876,6 +968,14 @@ resolved "https://registry.yarnpkg.com/@types/qs/-/qs-6.9.7.tgz#63bb7d067db107cc1e457c303bc25d511febf6cb" integrity sha512-FGa1F62FT09qcrueBA6qYTrJPVDzah9a+493+o2PCXsesWHIn27G98TsSMs3WPNbZIEj4+VJf6saSFpvD+3Zsw== +"@types/readable-stream@^2.3.13": + version "2.3.15" + resolved "https://registry.yarnpkg.com/@types/readable-stream/-/readable-stream-2.3.15.tgz#3d79c9ceb1b6a57d5f6e6976f489b9b5384321ae" + integrity sha512-oM5JSKQCcICF1wvGgmecmHldZ48OZamtMxcGGVICOJA8o8cahXC1zEVAif8iwoc5j8etxFaRFnf095+CDsuoFQ== + dependencies: + "@types/node" "*" + safe-buffer "~5.1.1" + "@types/secp256k1@^4.0.1": version "4.0.3" resolved "https://registry.yarnpkg.com/@types/secp256k1/-/secp256k1-4.0.3.tgz#1b8e55d8e00f08ee7220b4d59a6abe89c37a901c" @@ -883,11 +983,6 @@ dependencies: "@types/node" "*" -"@ungap/promise-all-settled@1.1.2": - version "1.1.2" - resolved "https://registry.yarnpkg.com/@ungap/promise-all-settled/-/promise-all-settled-1.1.2.tgz#aa58042711d6e3275dd37dc597e5d31e8c290a44" - integrity sha512-sL/cEvJWAnClXw0wHk85/2L0G6Sj8UB0Ctc1TEMbKSsmpRosqhwj9gWgFRZSrBr2f9tiXISwNhCPmlfqUqyb9Q== - abbrev@1: version "1.1.1" resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.1.1.tgz#f8f2c887ad10bf67f634f005b6987fed3179aac8" @@ -943,6 +1038,11 @@ aes-js@3.0.0: resolved "https://registry.yarnpkg.com/aes-js/-/aes-js-3.0.0.tgz#e21df10ad6c2053295bcbb8dab40b09dbea87e4d" integrity sha512-H7wUZRn8WpTq9jocdxQ2c8x2sKo9ZVmzfRE13GiNJXfp7NcKYEdvl3vspKjXox6RIG2VtaRe4JFvxG4rqp2Zuw== +aes-js@4.0.0-beta.3: + version "4.0.0-beta.3" + resolved "https://registry.yarnpkg.com/aes-js/-/aes-js-4.0.0-beta.3.tgz#da2253f0ff03a0b3a9e445c8cbdf78e7fda7d48c" + integrity sha512-/xJX0/VTPcbc5xQE2VUP91y1xN8q/rDfhEzLm+vLc3hYvb5+qHCnpJRuFcrKn63zumK/sCwYYzhG8HP78JYSTA== + agent-base@6: version "6.0.2" resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-6.0.2.tgz#49fff58577cfee3f37176feab4c22e00f86d7f77" @@ -969,9 +1069,9 @@ ajv@^6.10.2, ajv@^6.12.3, ajv@^6.6.1, ajv@^6.9.1: uri-js "^4.2.2" ajv@^8.0.1: - version "8.11.0" - resolved "https://registry.yarnpkg.com/ajv/-/ajv-8.11.0.tgz#977e91dd96ca669f54a11e23e378e33b884a565f" - integrity sha512-wGgprdCvMalC0BztXvitD2hC04YffAvtsUn93JbGXYLAtCUO4xd17mCCZQxUOItiBwZvJScWo8NIvQMQ71rdpg== + version "8.12.0" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-8.12.0.tgz#d1a0527323e22f53562c567c00991577dfbe19d1" + integrity sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA== dependencies: fast-deep-equal "^3.1.1" json-schema-traverse "^1.0.0" @@ -1049,7 +1149,7 @@ antlr4ts@^0.5.0-alpha.4: resolved "https://registry.yarnpkg.com/antlr4ts/-/antlr4ts-0.5.0-alpha.4.tgz#71702865a87478ed0b40c0709f422cf14d51652a" integrity sha512-WPQDt1B74OfPv/IMS2ekXAKkTZIHl88uMetg6q3OTqgFxZ/dxDXI0EWLyZid/1Pe6hTftyg5N7gel5wNAGxXyQ== -anymatch@~3.1.1, anymatch@~3.1.2: +anymatch@~3.1.1: version "3.1.2" resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.2.tgz#c0557c096af32f106198f4f4e2a383537e378716" integrity sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg== @@ -1057,6 +1157,14 @@ anymatch@~3.1.1, anymatch@~3.1.2: normalize-path "^3.0.0" picomatch "^2.0.4" +anymatch@~3.1.2: + version "3.1.3" + resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.3.tgz#790c58b19ba1720a84205b57c618d5ad8524973e" + integrity sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw== + dependencies: + normalize-path "^3.0.0" + picomatch "^2.0.4" + argparse@^1.0.7: version "1.0.10" resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.10.tgz#bcd6791ea5ae09725e17e5ad988134cd40b3d911" @@ -1127,25 +1235,11 @@ astral-regex@^2.0.0: resolved "https://registry.yarnpkg.com/astral-regex/-/astral-regex-2.0.0.tgz#483143c567aeed4785759c0865786dc77d7d2e31" integrity sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ== -async-eventemitter@^0.2.4: - version "0.2.4" - resolved "https://registry.yarnpkg.com/async-eventemitter/-/async-eventemitter-0.2.4.tgz#f5e7c8ca7d3e46aab9ec40a292baf686a0bafaca" - integrity sha512-pd20BwL7Yt1zwDFy+8MX8F1+WCT8aQeKj0kQnTrH9WaeRETlRamVhD0JtRPmrV4GfOJ2F9CvdQkZeZhnh2TuHw== - dependencies: - async "^2.4.0" - async@1.x: version "1.5.2" resolved "https://registry.yarnpkg.com/async/-/async-1.5.2.tgz#ec6a61ae56480c0c3cb241c95618e20892f9672a" integrity sha512-nSVgobk4rv61R9PUSDtYt7mPVB2olxNR5RWJcAsH676/ef11bUZwvu7+RGYrYauVdDPcO519v68wRhXQtxsV9w== -async@^2.4.0: - version "2.6.4" - resolved "https://registry.yarnpkg.com/async/-/async-2.6.4.tgz#706b7ff6084664cd7eae713f6f965433b5504221" - integrity sha512-mzo5dfJYwAn29PeiJ0zvwTo04zj8HDJj0Mn8TD7sno7q12prdbnasKJHhkm2c1LgrhlJ0teaea8860oxi51mGA== - dependencies: - lodash "^4.17.14" - asynckit@^0.4.0: version "0.4.0" resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" @@ -1203,21 +1297,9 @@ bech32@1.1.4: integrity sha512-s0IrSOzLlbvX7yp4WBfPITzpAU8sqQcpsmwXDiKwrG4r491vwCO/XpejasRNl0piBMe/DvP4Tz0mIS/X1DPJBQ== bigint-crypto-utils@^3.0.23: - version "3.1.4" - resolved "https://registry.yarnpkg.com/bigint-crypto-utils/-/bigint-crypto-utils-3.1.4.tgz#b00aa00eb792b14f2f71ead916105c17aac98a4c" - integrity sha512-niSkvARUEe8MiAiH+zKXPkgXzlvGDbOqXL3JDevWaA1TrPhUGSCgV+iedm8qMEBQwvSlMMn8GpSuoUjvsm2QfQ== - dependencies: - bigint-mod-arith "^3.1.0" - -bigint-mod-arith@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/bigint-mod-arith/-/bigint-mod-arith-3.1.0.tgz#ee7186ff512248e245f8c6ed0aa5c0ccf0c116b4" - integrity sha512-vpiKCiv9B1nK8HhFOU7PMC4k9nrufQxeivgCj5yOH2ZMLD+UPwc/RfNgBCX+v8C6t0sF4q7mEZgZij6k53zpWA== - -bignumber.js@^9.0.1: - version "9.1.0" - resolved "https://registry.yarnpkg.com/bignumber.js/-/bignumber.js-9.1.0.tgz#8d340146107fe3a6cb8d40699643c302e8773b62" - integrity sha512-4LwHK4nfDOraBCtst+wOWIHbu1vhvAPJK8g8nROd4iuc3PSEjWif/qwbkh8jwCJz6yDBvtU4KPynETgrfh7y3A== + version "3.2.2" + resolved "https://registry.yarnpkg.com/bigint-crypto-utils/-/bigint-crypto-utils-3.2.2.tgz#e30a49ec38357c6981cd3da5aaa6480b1f752ee4" + integrity sha512-U1RbE3aX9ayCUVcIPHuPDPKcK3SFOXf93J1UK/iHlJuQB7bhagPIX06/CLpLEsDThJ7KA4Dhrnzynl+d2weTiw== binary-extensions@^2.0.0: version "2.2.0" @@ -1332,6 +1414,13 @@ buffer@^6.0.3: base64-js "^1.3.1" ieee754 "^1.2.1" +busboy@^1.6.0: + version "1.6.0" + resolved "https://registry.yarnpkg.com/busboy/-/busboy-1.6.0.tgz#966ea36a9502e43cdb9146962523b92f531f6893" + integrity sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA== + dependencies: + streamsearch "^1.1.0" + bytes@3.1.2: version "3.1.2" resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.1.2.tgz#8b0beeb98605adf1b128fa4386403c009e0221a5" @@ -1379,6 +1468,11 @@ camelcase@^6.0.0: resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-6.3.0.tgz#5685b95eb209ac9c0c177467778c9c84df58ba9a" integrity sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA== +case@^1.6.3: + version "1.6.3" + resolved "https://registry.yarnpkg.com/case/-/case-1.6.3.tgz#0a4386e3e9825351ca2e6216c60467ff5f1ea1c9" + integrity sha512-mzDSXIPaFwVDvZAHqZ9VlbyF4yyXRuX6IvB06WvPYkqJVO24kX1PPhv9bfpKNFZyxYFmmgo03HUiD8iklmJYRQ== + caseless@^0.12.0, caseless@~0.12.0: version "0.12.0" resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.12.0.tgz#1b681c21ff84033c826543090689420d187151dc" @@ -1389,15 +1483,7 @@ catering@^2.1.0, catering@^2.1.1: resolved "https://registry.yarnpkg.com/catering/-/catering-2.1.1.tgz#66acba06ed5ee28d5286133982a927de9a04b510" integrity sha512-K7Qy8O9p76sL3/3m7/zLKbRkyOlSZAgzEaLhyj2mXS8PsCud2Eo4hAb8aLtZqHh0QGqLcb9dlJSu6lHRVENm1w== -cbor@^5.0.2: - version "5.2.0" - resolved "https://registry.yarnpkg.com/cbor/-/cbor-5.2.0.tgz#4cca67783ccd6de7b50ab4ed62636712f287a67c" - integrity sha512-5IMhi9e1QU76ppa5/ajP1BmMWZ2FHkhAhjeVKQ/EFCgYSEaeVaoGtL7cxJskf9oCCk+XjzaIdc3IuU/dbA/o2A== - dependencies: - bignumber.js "^9.0.1" - nofilter "^1.0.4" - -cbor@^8.0.0: +cbor@^8.0.0, cbor@^8.1.0: version "8.1.0" resolved "https://registry.yarnpkg.com/cbor/-/cbor-8.1.0.tgz#cfc56437e770b73417a2ecbfc9caf6b771af60d5" integrity sha512-DwGjNW9omn6EwP70aXsn7FQJx5kO12tX0bZkaTjzdVFM6/7nhA4t0EENocKGx6D2Bch9PE2KzCUf5SceBdeijg== @@ -1500,14 +1586,14 @@ cipher-base@^1.0.0, cipher-base@^1.0.1, cipher-base@^1.0.3: safe-buffer "^5.0.1" classic-level@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/classic-level/-/classic-level-1.2.0.tgz#2d52bdec8e7a27f534e67fdeb890abef3e643c27" - integrity sha512-qw5B31ANxSluWz9xBzklRWTUAJ1SXIdaVKTVS7HcTGKOAmExx65Wo5BUICW+YGORe2FOUaDghoI9ZDxj82QcFg== + version "1.3.0" + resolved "https://registry.yarnpkg.com/classic-level/-/classic-level-1.3.0.tgz#5e36680e01dc6b271775c093f2150844c5edd5c8" + integrity sha512-iwFAJQYtqRTRM0F6L8h4JCt00ZSGdOyqh7yVrhhjrOpFhmBjNlRUey64MCiyo6UmQHMJ+No3c81nujPv+n9yrg== dependencies: abstract-level "^1.0.2" catering "^2.1.0" module-error "^1.0.1" - napi-macros "~2.0.0" + napi-macros "^2.2.2" node-gyp-build "^4.3.0" clean-stack@^2.0.0: @@ -2133,14 +2219,14 @@ ethereum-cryptography@0.1.3, ethereum-cryptography@^0.1.3: setimmediate "^1.0.5" ethereum-cryptography@^1.0.3: - version "1.1.2" - resolved "https://registry.yarnpkg.com/ethereum-cryptography/-/ethereum-cryptography-1.1.2.tgz#74f2ac0f0f5fe79f012c889b3b8446a9a6264e6d" - integrity sha512-XDSJlg4BD+hq9N2FjvotwUET9Tfxpxc3kWGE2AqUG5vcbeunnbImVk3cj6e/xT3phdW21mE8R5IugU4fspQDcQ== + version "1.2.0" + resolved "https://registry.yarnpkg.com/ethereum-cryptography/-/ethereum-cryptography-1.2.0.tgz#5ccfa183e85fdaf9f9b299a79430c044268c9b3a" + integrity sha512-6yFQC9b5ug6/17CQpCyE3k9eKBMdhyVjzUy1WkiuY/E4vj/SXDBbCw8QEIaXqf0Mf2SnY6RmpDcwlUmBSS0EJw== dependencies: - "@noble/hashes" "1.1.2" - "@noble/secp256k1" "1.6.3" - "@scure/bip32" "1.1.0" - "@scure/bip39" "1.1.0" + "@noble/hashes" "1.2.0" + "@noble/secp256k1" "1.7.1" + "@scure/bip32" "1.1.5" + "@scure/bip39" "1.1.1" ethereumjs-abi@^0.6.8: version "0.6.8" @@ -2189,7 +2275,7 @@ ethers@^4.0.40: uuid "2.0.1" xmlhttprequest "1.8.0" -ethers@^5.5.3, ethers@^5.6.8, ethers@^5.7.0: +ethers@^5.5.3, ethers@^5.6.8: version "5.7.0" resolved "https://registry.yarnpkg.com/ethers/-/ethers-5.7.0.tgz#0055da174b9e076b242b8282638bc94e04b39835" integrity sha512-5Xhzp2ZQRi0Em+0OkOcRHxPzCfoBfgtOQA+RUylSkuHbhTEaQklnYi2hsWbRgs3ztJsXVXd9VKBcO1ScWL8YfA== @@ -2225,6 +2311,54 @@ ethers@^5.5.3, ethers@^5.6.8, ethers@^5.7.0: "@ethersproject/web" "5.7.0" "@ethersproject/wordlists" "5.7.0" +ethers@^5.7.1: + version "5.7.2" + resolved "https://registry.yarnpkg.com/ethers/-/ethers-5.7.2.tgz#3a7deeabbb8c030d4126b24f84e525466145872e" + integrity sha512-wswUsmWo1aOK8rR7DIKiWSw9DbLWe6x98Jrn8wcTflTVvaXhAMaB5zGAXy0GYQEQp9iO1iSHWVyARQm11zUtyg== + dependencies: + "@ethersproject/abi" "5.7.0" + "@ethersproject/abstract-provider" "5.7.0" + "@ethersproject/abstract-signer" "5.7.0" + "@ethersproject/address" "5.7.0" + "@ethersproject/base64" "5.7.0" + "@ethersproject/basex" "5.7.0" + "@ethersproject/bignumber" "5.7.0" + "@ethersproject/bytes" "5.7.0" + "@ethersproject/constants" "5.7.0" + "@ethersproject/contracts" "5.7.0" + "@ethersproject/hash" "5.7.0" + "@ethersproject/hdnode" "5.7.0" + "@ethersproject/json-wallets" "5.7.0" + "@ethersproject/keccak256" "5.7.0" + "@ethersproject/logger" "5.7.0" + "@ethersproject/networks" "5.7.1" + "@ethersproject/pbkdf2" "5.7.0" + "@ethersproject/properties" "5.7.0" + "@ethersproject/providers" "5.7.2" + "@ethersproject/random" "5.7.0" + "@ethersproject/rlp" "5.7.0" + "@ethersproject/sha2" "5.7.0" + "@ethersproject/signing-key" "5.7.0" + "@ethersproject/solidity" "5.7.0" + "@ethersproject/strings" "5.7.0" + "@ethersproject/transactions" "5.7.0" + "@ethersproject/units" "5.7.0" + "@ethersproject/wallet" "5.7.0" + "@ethersproject/web" "5.7.1" + "@ethersproject/wordlists" "5.7.0" + +ethers@^6.3.0: + version "6.3.0" + resolved "https://registry.yarnpkg.com/ethers/-/ethers-6.3.0.tgz#c61efaafa2bd9a4d9f0c799d932ef3b5cd4bd37d" + integrity sha512-CKFYvTne1YT4S1glTiu7TgGsj0t6c6GAD7evrIk8zbeUb6nK8dcUPAiAWM8uDX/1NmRTvLM9+1Vnn49hwKtEzw== + dependencies: + "@adraffy/ens-normalize" "1.9.0" + "@noble/hashes" "1.1.2" + "@noble/secp256k1" "1.7.1" + aes-js "4.0.0-beta.3" + tslib "2.4.0" + ws "8.5.0" + ethjs-unit@0.1.6: version "0.1.6" resolved "https://registry.yarnpkg.com/ethjs-unit/-/ethjs-unit-0.1.6.tgz#c665921e476e87bce2a9d588a6fe0405b2c41699" @@ -2392,7 +2526,12 @@ fmix@^0.1.0: dependencies: imul "^1.0.0" -follow-redirects@^1.12.1, follow-redirects@^1.14.0: +follow-redirects@^1.12.1: + version "1.15.2" + resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.15.2.tgz#b460864144ba63f2681096f274c4e57026da2c13" + integrity sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA== + +follow-redirects@^1.14.0: version "1.15.1" resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.15.1.tgz#0ca6a452306c9b276e4d3127483e29575e207ad5" integrity sha512-yLAMQs+k0b2m7cVxpS1VKJVvoz7SS9Td1zss3XRwXj+ZDH00RJgnuLx7E44wx02kQLrdM3aOOy+FpzS7+8OizA== @@ -2542,7 +2681,17 @@ get-func-name@^2.0.0: resolved "https://registry.yarnpkg.com/get-func-name/-/get-func-name-2.0.0.tgz#ead774abee72e20409433a066366023dd6887a41" integrity sha512-Hm0ixYtaSZ/V7C8FJrtZIuBBI+iSgL+1Aq82zSu8VQNB4S3Gk8e7Qs3VwBDJAhmRZcFqkl3tQu36g/Foh5I5ig== -get-intrinsic@^1.0.2, get-intrinsic@^1.1.0, get-intrinsic@^1.1.1, get-intrinsic@^1.1.2: +get-intrinsic@^1.0.2: + version "1.2.1" + resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.2.1.tgz#d295644fed4505fc9cde952c37ee12b477a83d82" + 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" + +get-intrinsic@^1.1.0, get-intrinsic@^1.1.1, get-intrinsic@^1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.1.2.tgz#336975123e05ad0b7ba41f152ee4aadbea6cf598" integrity sha512-Jfm3OyCxHh9DJyc28qGk+JmfkpO41A4XkneDSujN9MDXrm4oDKdHvndhZ2dN94+ERNfkYJWDclW6k2L/ZGHjXA== @@ -2668,7 +2817,12 @@ globby@^10.0.1: merge2 "^1.2.3" slash "^3.0.0" -graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.1.9, graceful-fs@^4.2.0, graceful-fs@^4.2.4: +graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.1.9: + version "4.2.11" + resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.11.tgz#4183e4e8bf08bb6e05bbb2f7d2e0c8f712ca40e3" + integrity sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ== + +graceful-fs@^4.2.0, graceful-fs@^4.2.4: version "4.2.10" resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.10.tgz#147d3a006da4ca3ce14728c7aefc287c367d7a6c" integrity sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA== @@ -2756,23 +2910,23 @@ hardhat-prettier@^0.0.1: glob "^7.1.6" hardhat@^2.11.1: - version "2.11.1" - resolved "https://registry.yarnpkg.com/hardhat/-/hardhat-2.11.1.tgz#9d7967dd360b9a217ac6b7d9ca7f5087db4db01d" - integrity sha512-7FoyfKjBs97GHNpQejHecJBBcRPOEhAE3VkjSWXB3GeeiXefWbw+zhRVOjI4eCsUUt7PyNFAdWje/lhnBT9fig== + version "2.14.0" + resolved "https://registry.yarnpkg.com/hardhat/-/hardhat-2.14.0.tgz#b60c74861494aeb1b50803cf04cc47865a42b87a" + integrity sha512-73jsInY4zZahMSVFurSK+5TNCJTXMv+vemvGia0Ac34Mm19fYp6vEPVGF3sucbumszsYxiTT2TbS8Ii2dsDSoQ== dependencies: "@ethersproject/abi" "^5.1.2" "@metamask/eth-sig-util" "^4.0.0" - "@nomicfoundation/ethereumjs-block" "^4.0.0-rc.3" - "@nomicfoundation/ethereumjs-blockchain" "^6.0.0-rc.3" - "@nomicfoundation/ethereumjs-common" "^3.0.0-rc.3" - "@nomicfoundation/ethereumjs-evm" "^1.0.0-rc.3" - "@nomicfoundation/ethereumjs-rlp" "^4.0.0-rc.3" - "@nomicfoundation/ethereumjs-statemanager" "^1.0.0-rc.3" - "@nomicfoundation/ethereumjs-trie" "^5.0.0-rc.3" - "@nomicfoundation/ethereumjs-tx" "^4.0.0-rc.3" - "@nomicfoundation/ethereumjs-util" "^8.0.0-rc.3" - "@nomicfoundation/ethereumjs-vm" "^6.0.0-rc.3" - "@nomicfoundation/solidity-analyzer" "^0.0.3" + "@nomicfoundation/ethereumjs-block" "5.0.1" + "@nomicfoundation/ethereumjs-blockchain" "7.0.1" + "@nomicfoundation/ethereumjs-common" "4.0.1" + "@nomicfoundation/ethereumjs-evm" "2.0.1" + "@nomicfoundation/ethereumjs-rlp" "5.0.1" + "@nomicfoundation/ethereumjs-statemanager" "2.0.1" + "@nomicfoundation/ethereumjs-trie" "6.0.1" + "@nomicfoundation/ethereumjs-tx" "5.0.1" + "@nomicfoundation/ethereumjs-util" "9.0.1" + "@nomicfoundation/ethereumjs-vm" "7.0.1" + "@nomicfoundation/solidity-analyzer" "^0.1.0" "@sentry/node" "^5.18.1" "@types/bn.js" "^5.1.0" "@types/lru-cache" "^5.1.0" @@ -2807,7 +2961,7 @@ hardhat@^2.11.1: source-map-support "^0.5.13" stacktrace-parser "^0.1.10" tsort "0.0.1" - undici "^5.4.0" + undici "^5.14.0" uuid "^8.3.2" ws "^7.4.6" @@ -2838,6 +2992,11 @@ has-property-descriptors@^1.0.0: dependencies: get-intrinsic "^1.1.1" +has-proto@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/has-proto/-/has-proto-1.0.1.tgz#1885c1305538958aff469fef37937c22795408e0" + integrity sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg== + has-symbols@^1.0.0, has-symbols@^1.0.2, has-symbols@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.3.tgz#bb7b2c4349251dce87b125f7bdf874aa7c8b39f8" @@ -2974,9 +3133,9 @@ ignore@^5.1.1: integrity sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ== immutable@^4.0.0-rc.12: - version "4.1.0" - resolved "https://registry.yarnpkg.com/immutable/-/immutable-4.1.0.tgz#f795787f0db780183307b9eb2091fcac1f6fafef" - integrity sha512-oNkuqVTA8jqG1Q6c+UglTOD1xhC1BtjKI7XkCXRkZHrN5m18/XsnUp8Q89GkQO/z+0WjonSvl0FLhDYftp46nQ== + version "4.3.0" + resolved "https://registry.yarnpkg.com/immutable/-/immutable-4.3.0.tgz#eb1738f14ffb39fd068b1dbe1296117484dd34be" + integrity sha512-0AOCmOip+xgJwEVTQj1EfiDDOkPmuyllDuTuEX+DDXUgapLAsBIfkg3sxCYyCEA8mQqZrrxPUGjcOQ2JS3WLkg== import-fresh@^2.0.0: version "2.0.0" @@ -3233,6 +3392,11 @@ isstream@~0.1.2: resolved "https://registry.yarnpkg.com/isstream/-/isstream-0.1.2.tgz#47e63f7af55afa6f92e1500e690eb8b8529c099a" integrity sha512-Yljz7ffyPbrLpLngrMtZ7NduUgVvi6wG9RJ9IUcyCd59YQ911PBJphODUcbOVbqYfxe1wuYf/LJ8PauMRwsM/g== +js-sdsl@^4.1.4: + version "4.4.0" + resolved "https://registry.yarnpkg.com/js-sdsl/-/js-sdsl-4.4.0.tgz#8b437dbe642daa95760400b602378ed8ffea8430" + integrity sha512-FfVSdx6pJ41Oa+CF7RDaFmTnCaFhua+SNYQX74riGOpl96x+2jQCqEfQ2bnXu/5DPCqlRuiqyvTJM0Qjz26IVg== + js-sha3@0.5.7: version "0.5.7" resolved "https://registry.yarnpkg.com/js-sha3/-/js-sha3-0.5.7.tgz#0d4ffd8002d5333aabaf4a23eed2f6374c9f28e7" @@ -3345,9 +3509,9 @@ jsprim@^1.2.2: verror "1.10.0" keccak@^3.0.0, keccak@^3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/keccak/-/keccak-3.0.2.tgz#4c2c6e8c54e04f2670ee49fa734eb9da152206e0" - integrity sha512-PyKKjkH53wDMLGrvmRGSNWgmSxZOUqbnXwKL9tmgbFYA1iAYqW21kfR7mZXV0MlESiefxQQE9X9fTa3X+2MPDQ== + version "3.0.3" + resolved "https://registry.yarnpkg.com/keccak/-/keccak-3.0.3.tgz#4bc35ad917be1ef54ff246f904c2bbbf9ac61276" + integrity sha512-JZrLIAJWuZxKbCilMpNz5Vj7Vtb4scDG3dMXLOsbzBmQGyjwE61BbW7bJkfKKCShXiQZt3T6sBgALRtmd+nZaQ== dependencies: node-addon-api "^2.0.0" node-gyp-build "^4.2.0" @@ -3624,11 +3788,10 @@ mocha@7.1.2: yargs-unparser "1.6.0" mocha@^10.0.0: - version "10.0.0" - resolved "https://registry.yarnpkg.com/mocha/-/mocha-10.0.0.tgz#205447d8993ec755335c4b13deba3d3a13c4def9" - integrity sha512-0Wl+elVUD43Y0BqPZBzZt8Tnkw9CMUdNYnUsTfOM1vuhJVZL+kiesFYsqwBkEEuEixaiPe5ZQdqDgX2jddhmoA== + version "10.2.0" + resolved "https://registry.yarnpkg.com/mocha/-/mocha-10.2.0.tgz#1fd4a7c32ba5ac372e03a17eef435bd00e5c68b8" + integrity sha512-IDY7fl/BecMwFHzoqF2sg/SHHANeBoMMXFlS9r0OXKDssYE1M5O43wUY/9BVPeIvfH2zmEbBfseqN9gBQZzXkg== dependencies: - "@ungap/promise-all-settled" "1.1.2" ansi-colors "4.1.1" browser-stdout "1.3.1" chokidar "3.5.3" @@ -3725,10 +3888,10 @@ nanoid@3.3.3: resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.3.tgz#fd8e8b7aa761fe807dba2d1b98fb7241bb724a25" integrity sha512-p1sjXuopFs0xg+fPASzQ28agW1oHD7xDsd9Xkf3T15H3c/cifrFHVwrh74PdoklAPi+i7MdRsE47vm2r6JoB+w== -napi-macros@~2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/napi-macros/-/napi-macros-2.0.0.tgz#2b6bae421e7b96eb687aa6c77a7858640670001b" - integrity sha512-A0xLykHtARfueITVDernsAWdtIMbOJgKgcluwENp3AlsKN/PloyO10HtmoqnFAQAcxPkgZN7wdfPfEd0zNGxbg== +napi-macros@^2.2.2: + version "2.2.2" + resolved "https://registry.yarnpkg.com/napi-macros/-/napi-macros-2.2.2.tgz#817fef20c3e0e40a963fbf7b37d1600bd0201044" + integrity sha512-hmEVtAGYzVQpCKdbQea4skABsdXW4RUh5t5mJ2zzqowJS2OyXZTU1KhDVFhx+NlWZ4ap9mqR9TcDO3LTTttd+g== natural-compare@^1.4.0: version "1.4.0" @@ -3766,20 +3929,15 @@ node-environment-flags@1.0.6: semver "^5.7.0" node-gyp-build@^4.2.0, node-gyp-build@^4.3.0: - version "4.5.0" - resolved "https://registry.yarnpkg.com/node-gyp-build/-/node-gyp-build-4.5.0.tgz#7a64eefa0b21112f89f58379da128ac177f20e40" - integrity sha512-2iGbaQBV+ITgCz76ZEjmhUKAKVf7xfY1sRl4UiKQspfZMH2h06SyhNsnSVy50cwkFQDGLyif6m/6uFXHkOZ6rg== + version "4.6.0" + resolved "https://registry.yarnpkg.com/node-gyp-build/-/node-gyp-build-4.6.0.tgz#0c52e4cbf54bbd28b709820ef7b6a3c2d6209055" + integrity sha512-NTZVKn9IylLwUzaKjkas1e4u2DLNcV4rdYagA4PWdPwW87Bi7z+BznyKSRwS/761tV/lzCGXplWsiaMjLqP2zQ== node-watch@^0.7.3: version "0.7.3" resolved "https://registry.yarnpkg.com/node-watch/-/node-watch-0.7.3.tgz#6d4db88e39c8d09d3ea61d6568d80e5975abc7ab" integrity sha512-3l4E8uMPY1HdMMryPRUAl+oIHtXtyiTlIiESNSVSNxcPfzAFzeTbXFQkZfAwBbo0B1qMSG8nUABx+Gd+YrbKrQ== -nofilter@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/nofilter/-/nofilter-1.0.4.tgz#78d6f4b6a613e7ced8b015cec534625f7667006e" - integrity sha512-N8lidFp+fCz+TD51+haYdbDGrcBWwuHX40F5+z0qkUjMJ5Tp+rdSuAkMJ9N9eoolDlEVTf6u5icM+cNKkKW2mA== - nofilter@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/nofilter/-/nofilter-3.1.0.tgz#c757ba68801d41ff930ba2ec55bab52ca184aa66" @@ -3815,11 +3973,16 @@ object-assign@^4.1.0: resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" integrity sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg== -object-inspect@^1.12.2, object-inspect@^1.9.0: +object-inspect@^1.12.2: version "1.12.2" resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.12.2.tgz#c0641f26394532f28ab8d796ab954e43c009a8ea" integrity sha512-z+cPxW0QGUp0mcqcsgQyLVRDoXFQbXOwBaqyF7VIgI4TWNQsDHrBpUQslRmIfAoYWdYzs6UlKJtB2XJpTaNSpQ== +object-inspect@^1.9.0: + version "1.12.3" + resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.12.3.tgz#ba62dffd67ee256c8c086dfae69e016cd1f198b9" + integrity sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g== + object-keys@^1.0.11, object-keys@^1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.1.1.tgz#1c47f272df277f3b1daf061677d9c82e2322c60e" @@ -4104,7 +4267,12 @@ psl@^1.1.28: resolved "https://registry.yarnpkg.com/psl/-/psl-1.9.0.tgz#d0df2a137f00794565fcaf3b2c00cd09f8d5a5a7" integrity sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag== -punycode@^2.1.0, punycode@^2.1.1: +punycode@^2.1.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.3.0.tgz#f67fa67c94da8f4d0cfff981aee4118064199b8f" + integrity sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA== + +punycode@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec" integrity sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A== @@ -4114,13 +4282,20 @@ qrcode-terminal@^0.12.0: resolved "https://registry.yarnpkg.com/qrcode-terminal/-/qrcode-terminal-0.12.0.tgz#bb5b699ef7f9f0505092a3748be4464fe71b5819" integrity sha512-EXtzRZmC+YGmGlDFbXKxQiMZNwCLEO6BANKXG4iCtSIM0yqc/pappSx3RIKr4r0uh5JsBckOXeKrB3Iz7mdQpQ== -qs@^6.4.0, qs@^6.7.0, qs@^6.9.4: +qs@^6.4.0, qs@^6.9.4: version "6.11.0" resolved "https://registry.yarnpkg.com/qs/-/qs-6.11.0.tgz#fd0d963446f7a65e1367e01abd85429453f0c37a" integrity sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q== dependencies: side-channel "^1.0.4" +qs@^6.7.0: + version "6.11.2" + resolved "https://registry.yarnpkg.com/qs/-/qs-6.11.2.tgz#64bea51f12c1f5da1bc01496f48ffcff7c69d7d9" + integrity sha512-tDNIz22aBzCDxLtVH++VnTfzxlfeK5CbqohpSqpJgj1Wg/cQbStNAz3NuqCs5vV+pjBsK4x4pN9HlVh7rcYRiA== + dependencies: + side-channel "^1.0.4" + qs@~6.5.2: version "6.5.3" resolved "https://registry.yarnpkg.com/qs/-/qs-6.5.3.tgz#3aeeffc91967ef6e35c0e488ef46fb296ab76aad" @@ -4139,9 +4314,9 @@ randombytes@^2.1.0: safe-buffer "^5.1.0" raw-body@^2.4.1: - version "2.5.1" - resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.5.1.tgz#fe1b1628b181b700215e5fd42389f98b71392857" - integrity sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig== + version "2.5.2" + resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.5.2.tgz#99febd83b90e08975087e8f1f9419a149366b68a" + integrity sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA== dependencies: bytes "3.1.2" http-errors "2.0.0" @@ -4162,9 +4337,9 @@ readable-stream@^2.2.2: util-deprecate "~1.0.1" readable-stream@^3.6.0: - version "3.6.0" - resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.0.tgz#337bbda3adc0706bd3e024426a286d4b4b2c9198" - integrity sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA== + version "3.6.2" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.2.tgz#56a9b36ea965c00c5a93ef31eb111a0f11056967" + integrity sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA== dependencies: inherits "^2.0.3" string_decoder "^1.1.1" @@ -4694,6 +4869,11 @@ stealthy-require@^1.1.1: resolved "https://registry.yarnpkg.com/stealthy-require/-/stealthy-require-1.1.1.tgz#35b09875b4ff49f26a777e509b3090a3226bf24b" integrity sha512-ZnWpYnYugiOVEY5GkcuJK1io5V8QmNYChG62gSit9pQVGErXtrKuPC55ITaVSukmMta5qpMU7vqLt2Lnni4f/g== +streamsearch@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/streamsearch/-/streamsearch-1.1.0.tgz#404dd1e2247ca94af554e841a8ef0eaa238da764" + integrity sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg== + "string-width@^1.0.2 || 2", string-width@^2.1.0, string-width@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/string-width/-/string-width-2.1.1.tgz#ab93f27a8dc13d28cac815c462143a6d9012ae9e" @@ -4857,9 +5037,9 @@ table@^5.2.3: string-width "^3.0.0" table@^6.8.0: - version "6.8.0" - resolved "https://registry.yarnpkg.com/table/-/table-6.8.0.tgz#87e28f14fa4321c3377ba286f07b79b281a3b3ca" - integrity sha512-s/fitrbVeEyHKFa7mFdkuQMWlH1Wgw/yEXMt5xACT4ZpzWFluehAxRtUUQKPuWhaLAWhFcVx6w3oC8VKaUfPGA== + version "6.8.1" + resolved "https://registry.yarnpkg.com/table/-/table-6.8.1.tgz#ea2b71359fe03b017a5fbc296204471158080bdf" + integrity sha512-Y4X9zqrCftUhMeH2EptSSERdVKt/nEdijTOacGD/97EKjhQ/Qs8RTlEGABSJNNN8lac9kheH+af7yAkEWlgneA== dependencies: ajv "^8.0.1" lodash.truncate "^4.4.2" @@ -4921,6 +5101,11 @@ tough-cookie@^2.3.3, tough-cookie@~2.5.0: psl "^1.1.28" punycode "^2.1.1" +tslib@2.4.0: + version "2.4.0" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.4.0.tgz#7cecaa7f073ce680a05847aa77be941098f36dc3" + integrity sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ== + tslib@^1.9.0, tslib@^1.9.3: version "1.14.1" resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.14.1.tgz#cf2d38bdc34a134bcaf1091c41f6619e2f672d00" @@ -5000,10 +5185,12 @@ unbox-primitive@^1.0.2: has-symbols "^1.0.3" which-boxed-primitive "^1.0.2" -undici@^5.4.0: - version "5.10.0" - resolved "https://registry.yarnpkg.com/undici/-/undici-5.10.0.tgz#dd9391087a90ccfbd007568db458674232ebf014" - integrity sha512-c8HsD3IbwmjjbLvoZuRI26TZic+TSEe8FPMLLOkN1AfYRhdjnKBU6yL+IwcSCbdZiX4e5t0lfMDLDCqj4Sq70g== +undici@^5.14.0: + version "5.22.1" + resolved "https://registry.yarnpkg.com/undici/-/undici-5.22.1.tgz#877d512effef2ac8be65e695f3586922e1a57d7b" + integrity sha512-Ji2IJhFXZY0x/0tVBXeQwgPlLWw13GVzpsWPQ3rV50IFMMof2I55PZZxtm4P6iNq+L5znYN9nSTAq0ZyE6lSJw== + dependencies: + busboy "^1.6.0" universalify@^0.1.0: version "0.1.2" @@ -5154,6 +5341,11 @@ ws@7.4.6: resolved "https://registry.yarnpkg.com/ws/-/ws-7.4.6.tgz#5654ca8ecdeee47c33a9a4bf6d28e2be2980377c" integrity sha512-YmhHDO4MzaDLB+M9ym/mDA5z0naX8j7SIlT8f8z+I0VtzsRbekxEutHSme7NPS2qE8StCYQNUnfWdXta/Yu85A== +ws@8.5.0: + version "8.5.0" + resolved "https://registry.yarnpkg.com/ws/-/ws-8.5.0.tgz#bfb4be96600757fe5382de12c670dab984a1ed4f" + integrity sha512-BWX0SWVgLPzYwF8lTzEy1egjhS4S4OEAHfsO8o65WOVsrnSRGaSiUaa9e0ggGlkMTtBlmOpEXiie9RUcBO86qg== + ws@^7.4.6: version "7.5.9" resolved "https://registry.yarnpkg.com/ws/-/ws-7.5.9.tgz#54fa7db29f4c7cec68b1ddd3a89de099942bb591" From 82cd5ea20d51a92c9eed79497fcdcf009a46f866 Mon Sep 17 00:00:00 2001 From: PlayJoker Date: Fri, 19 May 2023 11:46:02 -0700 Subject: [PATCH 06/29] added scripts for deployments --- deployment/sepolia-deployed-contracts.json | 14 + deployment/sepolia-initialized-contracts.json | 7 + deployment/sepolia-verified-contracts.json | 14 + deployment/sepolia/deploy-arf-pool.js | 70 ++++ deployment/sepolia/init-arf-pool-defender.js | 381 ++++++++++++++++++ deployment/sepolia/verify-arf-pool.js | 181 +++++++++ 6 files changed, 667 insertions(+) create mode 100644 deployment/sepolia-deployed-contracts.json create mode 100644 deployment/sepolia-initialized-contracts.json create mode 100644 deployment/sepolia-verified-contracts.json create mode 100644 deployment/sepolia/deploy-arf-pool.js create mode 100644 deployment/sepolia/init-arf-pool-defender.js create mode 100644 deployment/sepolia/verify-arf-pool.js diff --git a/deployment/sepolia-deployed-contracts.json b/deployment/sepolia-deployed-contracts.json new file mode 100644 index 00000000..102155fe --- /dev/null +++ b/deployment/sepolia-deployed-contracts.json @@ -0,0 +1,14 @@ +{"USDC":"0xC1eE32b97226825f5646109D770944491D7a1B47", +"EANFT":"0x349f04e3800bDbbCAb473f6e84a42Bf9e62aab39", +"RWReceivableImpl":"0xe79492b21BB9625BB83Cf55041607b5978B838F3", +"HumaConfig":"0x7eDb3AD12f48F9B6Bb44a275caD3084255EEdE7E", +"HumaConfigTimelock":"0x6D16F401a2814FF3c5e4e591EA49e178E11AB942", +"ArfPoolTimelock":"0x6bd5c1e23A997F2607B76D672c17735DA7510eB8", +"ArfPoolProxyAdminTimelock":"0x1b54e9067d22A785fdD44f581959D13604d814ef", +"ArfPoolFeeManager":"0xAdbB0f7545e1d1870773848Afb8950fA615701D5", +"ArfHDTImpl":"0x5861434f38529206024c60e742b5d802a3645c3e", +"ArfHDT":"0x33Bf0695769fc5F801d6bc671F9bb9c800E76b53", +"ArfPoolConfig":"0x9eb5c6E54f69C20ecD182ab1024c5Be570c0684c", +"ArfPoolImpl":"0x746a334B358bc5B651D17bAEca9EB90F80062e3a", +"ArfPool":"0xA62778EbAC1a43B4390Fe3a8286575003Ae339cd", +"RWReceivable":"0x4d3b200ef2F4030F1f8118Ea3CE41024DEd6f586"} \ No newline at end of file diff --git a/deployment/sepolia-initialized-contracts.json b/deployment/sepolia-initialized-contracts.json new file mode 100644 index 00000000..ce110f5b --- /dev/null +++ b/deployment/sepolia-initialized-contracts.json @@ -0,0 +1,7 @@ +{"HumaConfig":"Done", +"EANFT":"Done", +"ArfPoolFeeManager":"Done", +"ArfHDT":"Done", +"ArfPoolConfig":"Done", +"ArfPool":"Done", +"RWReceivable":"Done"} \ No newline at end of file diff --git a/deployment/sepolia-verified-contracts.json b/deployment/sepolia-verified-contracts.json new file mode 100644 index 00000000..030983c8 --- /dev/null +++ b/deployment/sepolia-verified-contracts.json @@ -0,0 +1,14 @@ +{"USDC":"Done", +"EANFT":"Done", +"HumaConfig":"Done", +"HumaConfigTimelock":"Done", +"ArfPoolTimelock":"Done", +"ArfPoolProxyAdminTimelock":"Done", +"ArfPoolFeeManager":"Done", +"ArfHDTImpl":"Done", +"ArfHDT":"Done", +"ArfPoolConfig":"Done", +"ArfPoolImpl":"Done", +"ArfPool":"Done", +"RWReceivableImpl":"Done", +"RWReceivable":"Done"} \ No newline at end of file diff --git a/deployment/sepolia/deploy-arf-pool.js b/deployment/sepolia/deploy-arf-pool.js new file mode 100644 index 00000000..600aea5c --- /dev/null +++ b/deployment/sepolia/deploy-arf-pool.js @@ -0,0 +1,70 @@ +const {deploy} = require("../utils.js"); + +const HUMA_OWNER_EOA='0x1e7A60fdc43E70d67A3C81AFAE1e95efC48b681b'; +const POOL_OWNER_EOA='0x242c334d3bd2882515547fFCF2733F3BB3701ACA'; + +async function deployContracts() { + const network = (await hre.ethers.provider.getNetwork()).name; + console.log("network : ", network); + const accounts = await hre.ethers.getSigners(); + if (accounts.length == 0) { + throw new Error("Accounts not set!"); + } + const [deployer, eaService] = await accounts; + console.log("deployer address: " + deployer.address); + console.log("ea service address: " + eaService.address); + + const usdc = await deploy("TestToken", "USDC"); + const evaluationAgentNFT = await deploy("EvaluationAgentNFT", "EANFT", [], eaService); + + const humaConfig = await deploy("HumaConfig", "HumaConfig"); + const humaConfigTL = await deploy("TimelockController", "HumaConfigTimelock", [ + 0, + [HUMA_OWNER_EOA], + [deployer.address], + ]); + + const rwrImpl = await deploy("RealWorldReceivable", "RWReceivableImpl"); + const rwr = await deploy("TransparentUpgradeableProxy", "RWReceivable", [ + rwrImpl.address, + humaConfigTL.address, + [], + ]); + + const baseCreditPoolTL = await deploy("TimelockController", "ArfPoolTimelock", [ + 0, + [POOL_OWNER_EOA], + [deployer.address], + ]); + + const baseCreditPoolProxyAdminTL = await deploy("TimelockController", "ArfPoolProxyAdminTimelock", [ + 0, + [POOL_OWNER_EOA], + [deployer.address], + ]); + + const bc_feeManager = await deploy("BaseFeeManager", "ArfPoolFeeManager"); + const bc_hdtImpl = await deploy("HDT", "ArfHDTImpl"); + const bc_hdt = await deploy("TransparentUpgradeableProxy", "ArfHDT", [ + bc_hdtImpl.address, + baseCreditPoolProxyAdminTL.address, + [], + ]); + const bc_poolConfig = await deploy("BasePoolConfig", "ArfPoolConfig"); + + const bc_poolImpl = await deploy("BaseCreditPool", "ArfPoolImpl"); + const bc_pool = await deploy("TransparentUpgradeableProxy", "ArfPool", [ + bc_poolImpl.address, + baseCreditPoolProxyAdminTL.address, + [], + ]); + // End of deploying base credit pool + +} + +deployContracts() + .then(() => process.exit(0)) + .catch((error) => { + console.error(error); + process.exit(1); + }); diff --git a/deployment/sepolia/init-arf-pool-defender.js b/deployment/sepolia/init-arf-pool-defender.js new file mode 100644 index 00000000..af6e229b --- /dev/null +++ b/deployment/sepolia/init-arf-pool-defender.js @@ -0,0 +1,381 @@ +const { + getInitilizedContract, + updateInitilizedContract, + getDeployedContracts, + sendTransaction, +} = require("../utils.js"); + +let deployer, eaService; + +const PDSServiceAccount = "0x4b2ea800c9791ea68faa284a69ac0df226eafa2b" +const treasuryAccount = "0x37f3591F7Ee1D53Ea445b710e6310FF3F92D5446" +// const poolTreasury = "0x942836828c2fbb046CE8C944d61143a0cE3608A5" + +async function transferOwnershipToTL(contractName, contractKey, timeLockKey) { + if (!deployedContracts[timeLockKey]) { + throw new Error(`${timeLockKey} not deployed yet!`); + } + + if (!deployedContracts[contractKey]) { + throw new Error(`${contractKey} not deployed yet!`); + } + + const TimeLockController = await hre.ethers.getContractFactory("TimelockController"); + const timeLockController = TimeLockController.attach(deployedContracts[timeLockKey]); + + const Contract = await hre.ethers.getContractFactory(contractName); + const contract = Contract.attach(deployedContracts[contractKey]); + + await sendTransaction(contractKey, contract, "transferOwnership", [timeLockController.address]); + + const adminRole = await timeLockController.TIMELOCK_ADMIN_ROLE(); + await sendTransaction(contractKey, timeLockController, "renounceRole", [ + adminRole, + deployer.address, + ]); +} + +async function initHumaConfig() { + const initilized = await getInitilizedContract("HumaConfig"); + if (initilized) { + console.log("HumaConfig is already initialized!"); + return; + } + + if (!deployedContracts["HumaConfig"]) { + throw new Error("HumaConfig not deployed yet!"); + } + + if (!deployedContracts["EANFT"]) { + throw new Error("EANFT not deployed yet!"); + } + + if (!deployedContracts["USDC"]) { + throw new Error("USDC not deployed yet!"); + } + + const HumaConfig = await hre.ethers.getContractFactory("HumaConfig"); + const humaConfig = HumaConfig.attach(deployedContracts["HumaConfig"]); + + await sendTransaction("HumaConfig", humaConfig, "setProtocolDefaultGracePeriod", [ + 30 * 24 * 3600, + ]); + await sendTransaction("HumaConfig", humaConfig, "setTreasuryFee", [500]); + await sendTransaction("HumaConfig", humaConfig, "setEANFTContractAddress", [ + deployedContracts["EANFT"], + ]); + + await sendTransaction("HumaConfig", humaConfig, "setEAServiceAccount", [eaService.address]); + await sendTransaction("HumaConfig", humaConfig, "setPDSServiceAccount", [PDSServiceAccount]); + + const USDC = await hre.ethers.getContractFactory("TestToken"); + const usdc = USDC.attach(deployedContracts["USDC"]); + + // Add usdc as an asset supported by the protocol + await sendTransaction("HumaConfig", humaConfig, "setLiquidityAsset", [usdc.address, true]); + + // Set treasury for the protocol + await sendTransaction("HumaConfig", humaConfig, "setHumaTreasury", [treasuryAccount]); + + await transferOwnershipToTL("HumaConfig", "HumaConfig", "HumaConfigTimelock") + + await updateInitilizedContract("HumaConfig"); +} + +async function initEA() { + const initilized = await getInitilizedContract("EANFT"); + if (initilized) { + console.log("EANFT is already initialized!"); + return; + } + + if (!deployedContracts["EANFT"]) { + throw new Error("EANFT not deployed yet!"); + } + + const EANFT = await hre.ethers.getContractFactory("EvaluationAgentNFT"); + const eaNFT = EANFT.attach(deployedContracts["EANFT"]); + + const eaNFTFromEA = eaNFT.connect(deployer); + await sendTransaction("EvaluationAgentNFT", eaNFTFromEA, "mintNFT", [deployer.address]); + // const eaNFTFromEA_bcp = eaNFT.connect(ea); + // await sendTransaction("EvaluationAgentNFT", eaNFTFromEA_bcp, "mintNFT", [ea_bcp.address]); + await updateInitilizedContract("EANFT"); +} + +async function initBaseCreditPoolFeeManager() { + const initilized = await getInitilizedContract("ArfPoolFeeManager"); + if (initilized) { + console.log("ArfPoolFeeManager is already initialized!"); + return; + } + + if (!deployedContracts["ArfPoolFeeManager"]) { + throw new Error("ArfPoolFeeManager not deployed yet!"); + } + + const BaseFeeManager = await hre.ethers.getContractFactory("BaseFeeManager"); + const feeManager = BaseFeeManager.attach(deployedContracts["ArfPoolFeeManager"]); + + await sendTransaction( + "ArfPoolFeeManager", + feeManager, + "setFees", + [10_000_000, 0, 20_000_000, 0, 0] + ); + // await sendTransaction("FeeManager", feeManager, "setMinPrincipalRateInBps", [0]); + + await transferOwnershipToTL("BaseFeeManager", "ArfPoolFeeManager", "ArfPoolTimelock"); + + await updateInitilizedContract("ArfPoolFeeManager"); +} + +async function initBaseCreditPoolHDT() { + const initilized = await getInitilizedContract("ArfHDT"); + if (initilized) { + console.log("ArfHDT is already initialized!"); + return; + } + + if (!deployedContracts["ArfHDT"]) { + throw new Error("ArfHDT not deployed yet!"); + } + + const HDT = await hre.ethers.getContractFactory("HDT"); + const hdt = HDT.attach(deployedContracts["ArfHDT"]); + + if (!deployedContracts["USDC"]) { + throw new Error("USDC not deployed yet!"); + } + + if (!deployedContracts["ArfPool"]) { + throw new Error("ArfPool not deployed yet!"); + } + + await sendTransaction("HDT", hdt, "initialize", [ + "Arf HDT", + "AHDT", + deployedContracts["USDC"], + ]); + + await sendTransaction("HDT", hdt, "setPool", [deployedContracts["ArfPool"]]); + + await transferOwnershipToTL("HDT", "ArfHDT", "ArfPoolTimelock"); + + await updateInitilizedContract("ArfHDT"); +} + +async function initBaseCreditPoolConfig() { + const initilized = await getInitilizedContract("ArfPoolConfig"); + if (initilized) { + console.log("ArfPoolConfig is already initialized!"); + return; + } + + if (!deployedContracts["ArfPoolConfig"]) { + throw new Error("ArfPoolConfig not deployed yet!"); + } + + const ReceivableFactoringPoolConfig = await hre.ethers.getContractFactory("BasePoolConfig"); + const poolConfig = ReceivableFactoringPoolConfig.attach( + deployedContracts["ArfPoolConfig"] + ); + + if (!deployedContracts["ArfPool"]) { + throw new Error("ArfPool not deployed yet!"); + } + + if (!deployedContracts["ArfHDT"]) { + throw new Error("ArfHDT not deployed yet!"); + } + + if (!deployedContracts["HumaConfig"]) { + throw new Error("HumaConfig not deployed yet!"); + } + + if (!deployedContracts["ArfPoolFeeManager"]) { + throw new Error("ArfPoolFeeManager not deployed yet!"); + } + + const HDT = await hre.ethers.getContractFactory("HDT"); + const hdt = HDT.attach(deployedContracts["ArfHDT"]); + + const HumaConfig = await hre.ethers.getContractFactory("HumaConfig"); + const humaConfig = HumaConfig.attach(deployedContracts["HumaConfig"]); + + const BaseFeeManager = await hre.ethers.getContractFactory("BaseFeeManager"); + const feeManager = BaseFeeManager.attach(deployedContracts["ArfPoolFeeManager"]); + + // await sendTransaction("ArfPoolConfig", poolConfig, "initialize", [ + // "ArfPool", + // hdt.address, + // humaConfig.address, + // feeManager.address, + // ]); + + const decimals = await hdt.decimals(); + console.log("decimals: " + BigInt(decimals)); + const cap = BigInt(1_000_000)*(BigInt(10)**(BigInt(decimals))); + console.log("cap: " + cap); + await sendTransaction("ArfPoolConfig", poolConfig, "setPoolLiquidityCap", [cap]); + + await sendTransaction("ArfPoolConfig", poolConfig, "setPool", [ + deployedContracts["ArfPool"], + ]); + + await sendTransaction( + "ArfPoolConfig", + poolConfig, + "setPoolOwnerRewardsAndLiquidity", + [500, 200] + ); + await sendTransaction( + "ArfPoolConfig", + poolConfig, + "setEARewardsAndLiquidity", + [0, 0] + ); + + await sendTransaction("ArfPoolConfig", poolConfig, "setEvaluationAgent", [ + 1, + deployer.address, + ]); + + const maxCL = BigInt(10_000)*(BigInt(10)**(BigInt(decimals))); + console.log("maxCL: " + maxCL); + await sendTransaction("ArfPoolConfig", poolConfig, "setMaxCreditLine", [maxCL]); + await sendTransaction("ArfPoolConfig", poolConfig, "setAPR", [1000]); + await sendTransaction("ArfPoolConfig", poolConfig, "setReceivableRequiredInBps", [0]); + await sendTransaction("ArfPoolConfig", poolConfig, "setPoolPayPeriod", [15]); + await sendTransaction("ArfPoolConfig", poolConfig, "setPoolToken", [ + deployedContracts["ArfHDT"], + ]); + await sendTransaction("ArfPoolConfig", poolConfig, "setWithdrawalLockoutPeriod", [0]); + await sendTransaction("ArfPoolConfig", poolConfig, "setPoolDefaultGracePeriod", [60]); + await sendTransaction("ArfPoolConfig", poolConfig, "addPoolOperator", [deployer.address]); + await sendTransaction("ArfPoolConfig", poolConfig, "setPoolOwnerTreasury", [poolTreasury.address]); + + await sendTransaction("ArfPoolConfig", poolConfig, "setCreditApprovalExpiration", [30]); + + await transferOwnershipToTL("BasePoolConfig", "ArfPoolConfig", "ArfPoolTimelock"); + + await updateInitilizedContract("ArfPoolConfig"); +} + +async function initBaseCreditPool() { + const initilized = await getInitilizedContract("ArfPool"); + if (initilized) { + console.log("ArfPool is already initialized!"); + return; + } + + if (!deployedContracts["ArfPool"]) { + throw new Error("ArfPool not deployed yet!"); + } + + if (!deployedContracts["ArfPoolConfig"]) { + throw new Error("ArfPoolConfig not deployed yet!"); + } + + const ReceivableFactoringPool = await hre.ethers.getContractFactory("BaseCreditPool"); + const pool = ReceivableFactoringPool.attach(deployedContracts["ArfPool"]); + + await sendTransaction("ArfPool", pool, "initialize", [ + deployedContracts["ArfPoolConfig"], + ]); + + await updateInitilizedContract("ArfPool"); +} + +async function initRWR() { + const initilized = await getInitilizedContract("RWReceivable"); + if (initilized) { + console.log("RWReceivable is already initialized!"); + return; + } + + if (!deployedContracts["RWReceivable"]) { + throw new Error("RWReceivable not deployed yet!"); + } + + const RealWorldReceivable = await hre.ethers.getContractFactory("RealWorldReceivable"); + const rwReceivable = RealWorldReceivable.attach(deployedContracts["RWReceivable"]); + + await sendTransaction("RWReceivable", rwReceivable, "initialize", []); + + await updateInitilizedContract("RWReceivable"); +} + +async function prepareBaseCreditPool() { + // The operations commented off need to run with TL on Defender + if (!deployedContracts["ArfPool"]) { + throw new Error("ArfPool not deployed yet!"); + } + if (!deployedContracts["USDC"]) { + throw new Error("USDC not deployed yet!"); + } + + const BaseCreditPool = await hre.ethers.getContractFactory("BaseCreditPool"); + const pool = BaseCreditPool.attach(deployedContracts["ArfPool"]) + // const poolFrombcpOperator = pool.connect(bcpOperator); + + await sendTransaction("ArfPool", poolFrombcpOperator, "addApprovedLender", [deployer.address]); + // await sendTransaction("ArfPool", poolFrombcpOperator, "addApprovedLender", [ea_bcp.address]); + // await sendTransaction("ArfPool", poolFrombcpOperator, "addApprovedLender", [lender.address]); + await sendTransaction("ArfPool", poolFrombcpOperator, "addApprovedLender", [poolTreasury.address]); + + const USDC = await hre.ethers.getContractFactory("TestToken"); + const usdc = USDC.attach(deployedContracts["USDC"]); + const decimals = await usdc.decimals(); + + // Owner + const usdcFromPoolOwnerTreasury = await usdc.connect(poolTreasury); + const poolFromPoolOwnerTreasury = await pool.connect(poolTreasury); + const amountOwner = BigInt(20_000)*(BigInt(10)**(BigInt(decimals))); + console.log("owner to deposit: " + amountOwner); + await sendTransaction("TestToken", usdc, "mint", [bcpOwnerTreasury.address, amountOwner]); + await sendTransaction("TestToken", usdcFromPoolOwnerTreasury, "approve", [pool.address, amountOwner]); + await sendTransaction("ArfPool", poolFromPoolOwnerTreasury, "makeInitialDeposit", [amountOwner]); + + // EA + // const usdcFromEA = await usdc.connect(ea_bcp); + // const poolFromEA = await pool.connect(ea_bcp); + // const amountEA = BigInt(10_000)*(BigInt(10)**(BigInt(decimals))); + // await sendTransaction("TestToken", usdc, "mint", [ea_bcp.address, amountEA]); + // await sendTransaction("TestToken", usdcFromEA, "approve", [poolFromEA.address, amountEA]); + // await sendTransaction("BaseCreditPool", poolFromEA, "makeInitialDeposit", [amountEA]); + + // await sendTransaction("BaseCreditPool", pool, "enablePool", []); +} + +async function initContracts() { + const network = (await hre.ethers.provider.getNetwork()).name; + console.log("network : ", network); + const accounts = await hre.ethers.getSigners(); + let invoicePayer; + [ + deployer, eaService, poolTreasury + ] = await accounts; + console.log("deployer address: " + deployer.address); + console.log("ea address: " + eaService.address); + + deployedContracts = await getDeployedContracts(); + + await initHumaConfig(); + await initEA(); + await initBaseCreditPoolFeeManager(); + await initBaseCreditPoolHDT(); + await initBaseCreditPoolConfig(); + await initBaseCreditPool(); + await initRWR(); + + // await prepareBaseCreditPool(); + +} + +initContracts() + .then(() => process.exit(0)) + .catch((error) => { + console.error(error); + process.exit(1); + }); diff --git a/deployment/sepolia/verify-arf-pool.js b/deployment/sepolia/verify-arf-pool.js new file mode 100644 index 00000000..88117788 --- /dev/null +++ b/deployment/sepolia/verify-arf-pool.js @@ -0,0 +1,181 @@ +const execSync = require('child_process').execSync; +const { + getDeployedContracts, + getVerifiedContract, + updateVerifiedContract, +} = require("../utils.js"); + +const fs = require("fs"); + +const VERIFY_ARGS_PATH = "./deployment/polygon/verify_args/" + +const HUMA_OWNER_EOA='0x1e7A60fdc43E70d67A3C81AFAE1e95efC48b681b'; +const POOL_OWNER_EOA='0x242c334d3bd2882515547fFCF2733F3BB3701ACA'; + +let deployedContracts, proxyOwner, network, deployer; + +const getArgsFile = async function (contractName) { + const argsFile = `${VERIFY_ARGS_PATH}${contractName}.js`; + return argsFile; +} + +const writeVerifyArgs = async function (contractName, args) { + const argsFile = await getArgsFile(contractName); + let data = `module.exports = [ + ${args.toString()}, + ];` + // console.log(data) + await fs.mkdir(`${VERIFY_ARGS_PATH}`, { recursive: true }, (err) => { + if (err) throw err; + }); + fs.writeFileSync(argsFile, data, {flag: "w"}); + return argsFile; +}; + +const sleep = (ms) => new Promise((res) => setTimeout(res, ms)); + +async function etherscanVerify(contractName, contractAddress, argsFile, logMessage) { + await sleep(5000); + logMessage = !logMessage ? contractAddress : logMessage; + console.log(`Verifying ${contractName}:${logMessage}`) + + const command = !argsFile ? `yarn hardhat verify '${contractAddress}' --network ${network}` : `yarn hardhat verify ${contractAddress} --constructor-args ${argsFile} --network ${network}` + let result; + try { + const verifyResult = execSync(command) + // console.log(verifyResult); + result = 'successful'; + } + catch (error) { + if (!error.toString().toLowerCase().includes("already verified" )) { + throw error; + } + else { + result = 'already verified'; + } + }; + console.log(`Verifying ${contractName}:${logMessage} ended!`); + return result; +} + +async function verifyContract(contractKey, args) { + const verified = await getVerifiedContract(contractKey); + if (verified) { + console.log(`${contractKey} is already verified!`); + return 'already verified'; + } + + if (!deployedContracts[contractKey]) { + throw new Error(`${contractKey} not deployed yet!`); + } + let result; + if (args) { + const argsFile = await writeVerifyArgs(contractKey, args); + result = await etherscanVerify(contractKey, deployedContracts[contractKey], argsFile); + } + else { + result = await etherscanVerify(contractKey, deployedContracts[contractKey]); + } + await updateVerifiedContract(contractKey); + return result; +} + +async function verifyContracts() { + network = (await hre.ethers.provider.getNetwork()).name; + console.log("network : ", network); + deployedContracts = await getDeployedContracts(); + const accounts = await hre.ethers.getSigners(); + if (accounts.length == 0) { + throw new Error("Accounts not set!"); + } + deployer = await accounts[0]; + // proxyOwner = await accounts[1]; + // console.log("proxyOwner address: " + proxyOwner.address); + + const verifyUsdc = await verifyContract('USDC'); + console.log(`Verify USDC result: ${verifyUsdc}`); + + const verifyEANFT = await verifyContract('EANFT'); + console.log(`Verify EANFT result: ${verifyEANFT}`); + + // const verifyRNNFT = await verifyContract('RNNFT', [ + // `'${deployedContracts['USDC']}'` + // ]); + // console.log(`Verify RNNFT result: ${verifyRNNFT}`); + + const verifyHumaConfig = await verifyContract('HumaConfig'); + console.log(`Verify HumaConfig result: ${verifyHumaConfig}`); + + const verifyHumaConfigTL = await verifyContract('HumaConfigTimelock', + [ + 0, + `['${HUMA_OWNER_EOA}']`, + `['${deployer.address}']`, + ]); + console.log(`Verify HumaConfigTimelock result: ${verifyHumaConfigTL}`); + + const verifyRWRImpl = await verifyContract('RWReceivableImpl'); + console.log(`Verify RWRImpl result: ${verifyRWRImpl}`); + + const verifyRWR = await verifyContract('RWReceivable', + [ + `'${deployedContracts['RWReceivableImpl']}'`, + `'${deployedContracts['HumaConfigTimelock']}'`, + '[]' + ]); + console.log(`Verify RWR result: ${verifyRWR}`); + + + const verifyBaseCreditPoolTL = await verifyContract('ArfPoolTimelock', + [ + 0, + `['${POOL_OWNER_EOA}']`, + `['${deployer.address}']`, + ]); + console.log(`Verify ArfPoolTimelock result: ${verifyBaseCreditPoolTL}`); + + const verifyBaseCreditPoolProxyAdminTL = await verifyContract('ArfPoolProxyAdminTimelock', + [ + 0, + `['${POOL_OWNER_EOA}']`, + `['${deployer.address}']`, + ]); + console.log(`Verify ArfPoolProxyAdminTimelock result: ${verifyBaseCreditPoolProxyAdminTL}`); + + const verifyFeeManager = await verifyContract('ArfPoolFeeManager'); + console.log(`Verify FeeManager result: ${verifyFeeManager}`); + + const verifyHDTImpl = await verifyContract('ArfHDTImpl'); + console.log(`Verify HDTImpl result: ${verifyHDTImpl}`); + + const verifyHDT = await verifyContract('ArfHDT', + [ + `'${deployedContracts['ArfHDTImpl']}'`, + `'${deployedContracts['ArfPoolProxyAdminTimelock']}'`, + '[]' + ]); + console.log(`Verify HDT result: ${verifyHDT}`); + + const verifyPoolConfig = await verifyContract('ArfPoolConfig'); + console.log(`Verify poolConfig result: ${verifyPoolConfig}`); + + const verifyPoolImpl = await verifyContract('ArfPoolImpl'); + console.log(`Verify PoolImpl result: ${verifyPoolImpl}`); + + const verifyPool = await verifyContract('ArfPool', + [ + `'${deployedContracts['ArfPoolImpl']}'`, + `'${deployedContracts['ArfPoolProxyAdminTimelock']}'`, + '[]', + ]); + console.log(`Verify Pool result: ${verifyPool}`); +} + +verifyContracts() + .then(() => process.exit(0)) + .catch((error) => { + console.error(error); + process.exit(1); + }); + +// Reason: Already Verified \ No newline at end of file From 744a63cd94edb17f9716033746ffc59acd2006da Mon Sep 17 00:00:00 2001 From: PlayJoker Date: Fri, 2 Jun 2023 12:20:27 -0700 Subject: [PATCH 07/29] temp save hardhat --- hardhat.config.js | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/hardhat.config.js b/hardhat.config.js index 1d44297c..0193764e 100644 --- a/hardhat.config.js +++ b/hardhat.config.js @@ -222,6 +222,11 @@ module.exports = { url: polygonUrl, accounts: [deployer, eaService, pdsService], }, + alfajores: { + url: "https://alfajores-forno.celo-testnet.org", + accounts: [deployer, eaService, poolTreasury], + chainId: 44787 + }, optimism: { url: "https://mainnet.optimism.io", accounts: { From ce53fa76991327383c1dec877adc98b214b22355 Mon Sep 17 00:00:00 2001 From: PlayJoker Date: Tue, 6 Jun 2023 13:25:37 -0700 Subject: [PATCH 08/29] saving goerli arf deplotmentr --- deployment/goerli-deployed-contracts.json | 70 ++-- deployment/goerli-initialized-contracts.json | 4 +- deployment/goerli-verified-contracts.json | 12 +- deployment/utils.js | 2 +- hardhat.config.js | 32 +- package.json | 9 +- yarn.lock | 357 ++++++++++++++++--- 7 files changed, 384 insertions(+), 102 deletions(-) diff --git a/deployment/goerli-deployed-contracts.json b/deployment/goerli-deployed-contracts.json index f73ecd39..8e542be3 100644 --- a/deployment/goerli-deployed-contracts.json +++ b/deployment/goerli-deployed-contracts.json @@ -1,29 +1,41 @@ -{"USDC":"0xf17FF940864351631b1be3ac03702dEA085ba51c", -"EANFT":"0x026D2AED6f1E9Db160b79688Ea0CE1ABaee4Dc39", -"RNNFT":"0x5D34C9CA746D59a171FdDf22fD1340033c50dBd2", -"HumaConfig":"0x98e77059F8C9BDF3e83A49CD5F5330E5b159014c", -"HumaConfigTimelock":"0x0Fc7E513274cE9559d9Aa09c715DAE06b6658dFA", -"BaseCreditPoolTimelock":"0x6590E419B28fDFDD82fDc221b85344F7E8708197", -"BaseCreditPoolProxyAdminTimelock":"0xdcccF0Ee1732BE26C77d07e860AE21cBE217fcb6", -"BaseCreditPoolFeeManager":"0x673b3C1094AE941bb4b2eF9377DaFE3bcCc4b003", -"BaseCreditHDTImpl":"0x1068AE689f40B2Db2C9771e7aC64345D115DB077", -"BaseCreditHDT":"0x61341186E8C3B7cC0De66ae86C65943797C8Fb99", -"BaseCreditPoolConfig":"0x0d7bae0e14aF194e52Ea2472737b24044fe6e929", -"BaseCreditPoolImpl":"0xec86280b5121821D37534C9B645acBeCE4A503D3", -"BaseCreditPool":"0xA22D20FB0c9980fb96A9B0B5679C061aeAf5dDE4", -"ReceivableFactoringPoolTimelock":"0xb179FEaD504cFAeD016192C668FfA0bc30769840", -"ReceivableFactoringPoolProxyAdminTimelock":"0xdAECE171D686AcC3DA455AA6134cF45114B5b2ba", -"ReceivableFactoringPoolFeeManager":"0x7BA6B8eBC9b09c228582814D44D4a0F2B6B0B9E4", -"HDTImpl":"0x33d6526394a1C0E52293BDa8B7e9647F2266F06a", -"HDT":"0x27Fa332a5cA06492C2007FF4b143C921Cf779C3b", -"ReceivableFactoringPoolConfig":"0xBa779F41ae414dEc63265D79a02DED47fbe007a5", -"ReceivableFactoringPoolImpl":"0x470f71B48B42BE5B4B47D9f9A407bDA98DbDEb8D", -"ReceivableFactoringPool":"0x11672c0bBFF498c72BC2200f42461c0414855042", -"JiaPoolTimelock":"0x8DF7BBae57F1215eE8294D084E08B6a02076eAA5", -"JiaPoolProxyAdminTimelock":"0x87Da18395dc7CE21e0E72e1B01dca0826635FCf0", -"JiaPoolFeeManager":"0x4630ceAedb030b6ad1DCa0E58c3576aa33042b4C", -"JiaHDTImpl":"0x3f95c365aa092E3dF020Bf7E6582E371998Ada4A", -"JiaHDT":"0xAD5e1F01618A2A158097C21866B4e8DCEEA2aC25", -"JiaPoolConfig":"0x9b8513bF9A56E609e66F360B550b7c8724129a05", -"JiaPoolImpl":"0xEb204D979c7aBcA473a0BC780dDf6Ca45E84422f", -"JiaPool":"0x07fd5720FE4d7993550d147c8753A9e60b45940D"} \ No newline at end of file +{ + "USDC": "0xf17FF940864351631b1be3ac03702dEA085ba51c", + "EANFT": "0x026D2AED6f1E9Db160b79688Ea0CE1ABaee4Dc39", + "RNNFT": "0x5D34C9CA746D59a171FdDf22fD1340033c50dBd2", + "HumaConfig": "0x98e77059F8C9BDF3e83A49CD5F5330E5b159014c", + "HumaConfigTimelock": "0x0Fc7E513274cE9559d9Aa09c715DAE06b6658dFA", + "BaseCreditPoolTimelock": "0x6590E419B28fDFDD82fDc221b85344F7E8708197", + "BaseCreditPoolProxyAdminTimelock": "0xdcccF0Ee1732BE26C77d07e860AE21cBE217fcb6", + "BaseCreditPoolFeeManager": "0x673b3C1094AE941bb4b2eF9377DaFE3bcCc4b003", + "BaseCreditHDTImpl": "0x1068AE689f40B2Db2C9771e7aC64345D115DB077", + "BaseCreditHDT": "0x61341186E8C3B7cC0De66ae86C65943797C8Fb99", + "BaseCreditPoolConfig": "0x0d7bae0e14aF194e52Ea2472737b24044fe6e929", + "BaseCreditPoolImpl": "0xec86280b5121821D37534C9B645acBeCE4A503D3", + "BaseCreditPool": "0xA22D20FB0c9980fb96A9B0B5679C061aeAf5dDE4", + "ReceivableFactoringPoolTimelock": "0xb179FEaD504cFAeD016192C668FfA0bc30769840", + "ReceivableFactoringPoolProxyAdminTimelock": "0xdAECE171D686AcC3DA455AA6134cF45114B5b2ba", + "ReceivableFactoringPoolFeeManager": "0x7BA6B8eBC9b09c228582814D44D4a0F2B6B0B9E4", + "HDTImpl": "0x33d6526394a1C0E52293BDa8B7e9647F2266F06a", + "HDT": "0x27Fa332a5cA06492C2007FF4b143C921Cf779C3b", + "ReceivableFactoringPoolConfig": "0xBa779F41ae414dEc63265D79a02DED47fbe007a5", + "ReceivableFactoringPoolImpl": "0x470f71B48B42BE5B4B47D9f9A407bDA98DbDEb8D", + "ReceivableFactoringPool": "0x11672c0bBFF498c72BC2200f42461c0414855042", + "JiaPoolTimelock": "0x8DF7BBae57F1215eE8294D084E08B6a02076eAA5", + "JiaPoolProxyAdminTimelock": "0x87Da18395dc7CE21e0E72e1B01dca0826635FCf0", + "JiaPoolFeeManager": "0x4630ceAedb030b6ad1DCa0E58c3576aa33042b4C", + "JiaHDTImpl": "0x3f95c365aa092E3dF020Bf7E6582E371998Ada4A", + "JiaHDT": "0xAD5e1F01618A2A158097C21866B4e8DCEEA2aC25", + "JiaPoolConfig": "0x9b8513bF9A56E609e66F360B550b7c8724129a05", + "JiaPoolImpl": "0xEb204D979c7aBcA473a0BC780dDf6Ca45E84422f", + "JiaPool": "0x07fd5720FE4d7993550d147c8753A9e60b45940D", + "RWReceivableImpl": "0xf48170cc418c432874d32B03EAc3AC820deEF05E", + "RWReceivable": "0xA1EB18643dd6b75e97D55583BFFfF2311124076f", + "ArfPoolTimelock": "0x025BAC45031309e7bE88F97Ae917AC1B216E3936", + "ArfPoolProxyAdminTimelock": "0x0ebC0e88cAdC182028F146a2eE2472D9c18Dc5B8", + "ArfPoolFeeManager": "0x6cd7E7a6baC464C8a213c8259ef10a42D63D3C20", + "ArfHDTImpl": "0xb3d90151Cc394d9924CBf11D7fB7dA6a366E809D", + "ArfHDT": "0x4322962964AF8E926875618ed7a3b275a484fCC6", + "ArfPoolConfig": "0x78c803d7c985b97884c83eFA30508e9F01a34964", + "ArfPoolImpl": "0x829461DD0b6938E4B1b81fB2fAd66aC191FadB95", + "ArfPool": "0x8e43d748b39497ab65DFF12da8e2c9a1D0855dEe" +} \ No newline at end of file diff --git a/deployment/goerli-initialized-contracts.json b/deployment/goerli-initialized-contracts.json index a1a2b1c5..2634626f 100644 --- a/deployment/goerli-initialized-contracts.json +++ b/deployment/goerli-initialized-contracts.json @@ -11,4 +11,6 @@ "JiaPoolFeeManager":"Done", "JiaHDT":"Done", "JiaPoolConfig":"Done", -"JiaPool":"Done"} \ No newline at end of file +"JiaPool":"Done", +"ArfPoolFeeManager":"Done", +"ArfHDT":"Done"} \ No newline at end of file diff --git a/deployment/goerli-verified-contracts.json b/deployment/goerli-verified-contracts.json index d7952cf3..2f42ecef 100644 --- a/deployment/goerli-verified-contracts.json +++ b/deployment/goerli-verified-contracts.json @@ -26,4 +26,14 @@ "JiaHDT":"Done", "JiaPoolConfig":"Done", "JiaPoolImpl":"Done", -"JiaPool":"Done"} \ No newline at end of file +"JiaPool":"Done", +"RWReceivableImpl":"Done", +"RWReceivable":"Done", +"ArfPoolTimelock":"Done", +"ArfPoolProxyAdminTimelock":"Done", +"ArfPoolFeeManager":"Done", +"ArfHDTImpl":"Done", +"ArfHDT":"Done", +"ArfPoolConfig":"Done", +"ArfPoolImpl":"Done", +"ArfPool":"Done"} \ No newline at end of file diff --git a/deployment/utils.js b/deployment/utils.js index c7e0b2d0..6237c6ed 100644 --- a/deployment/utils.js +++ b/deployment/utils.js @@ -2,7 +2,7 @@ const {BigNumber: BN, ethers} = require("ethers"); const fs = require("fs"); const DEPLOYED_PATH = "./deployment/"; -const MAX_FEE_PER_GAS = 2_500_000_000; +const MAX_FEE_PER_GAS = 9_000_000_000; const MAX_PRIORITY_FEE_PER_GAS = 2_000_000_000; const getContractAddressFile = async function (fileType = "deployed", network) { diff --git a/hardhat.config.js b/hardhat.config.js index eaa01b13..dcbf2e7e 100644 --- a/hardhat.config.js +++ b/hardhat.config.js @@ -13,6 +13,7 @@ require("hardhat-prettier"); require("solidity-coverage"); require("hardhat-abi-exporter"); +require("hardhat-celo"); require("dotenv").config(); const fs = require("fs"); @@ -171,21 +172,22 @@ module.exports = { }, goerli: { url: goerliUrl, - accounts: [ - deployer, - proxyOwner, - lender, - ea, - eaService, - pdsService, - treasury, - ea_bcp, - invoicePayer, - baseCreditPoolOperator, - receivableFactoringPoolOperator, - baseCreditPoolOwnerTreasury, - receivableFactoringPoolOwnerTreasury, - ], + accounts: [deployer, eaService, poolTreasury], + // accounts: [ + // deployer, + // proxyOwner, + // lender, + // ea, + // eaService, + // pdsService, + // treasury, + // ea_bcp, + // invoicePayer, + // baseCreditPoolOperator, + // receivableFactoringPoolOperator, + // baseCreditPoolOwnerTreasury, + // receivableFactoringPoolOwnerTreasury, + // ], }, xdai: { url: "https://rpc.xdaichain.com/", diff --git a/package.json b/package.json index 467b497f..37df1ff6 100644 --- a/package.json +++ b/package.json @@ -4,13 +4,18 @@ "license": "MIT", "devDependencies": { "@nomicfoundation/hardhat-chai-matchers": "^1.0.5", + "@nomicfoundation/hardhat-network-helpers": "^1.0.0", "@nomiclabs/hardhat-ethers": "^2.1.1", "@nomiclabs/hardhat-etherscan": "^3.1.0", "@openzeppelin/hardhat-upgrades": "^1.23.1", "@tenderly/hardhat-tenderly": "^1.1.6", + "@typechain/ethers-v5": "^10.1.0", + "@typechain/hardhat": "^6.1.2", + "@types/mocha": "^9.1.0", "chai": "^4.3.6", - "ethers": "^6.3.0", + "ethers": "^5.4.7", "hardhat-abi-exporter": "^2.10.0", + "hardhat-celo": "^0.0.4", "hardhat-contract-sizer": "^2.6.1", "hardhat-gas-reporter": "^1.0.9", "hardhat-prettier": "^0.0.1", @@ -21,6 +26,8 @@ "qrcode-terminal": "^0.12.0", "solhint": "^3.3.7", "solidity-coverage": "^0.8.2", + "ts-node": ">=8.0.0", + "typechain": "^8.1.0", "typescript": "^4.8.2" }, "scripts": { diff --git a/yarn.lock b/yarn.lock index e9abc7cd..6a874432 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2,11 +2,6 @@ # yarn lockfile v1 -"@adraffy/ens-normalize@1.9.0": - version "1.9.0" - resolved "https://registry.yarnpkg.com/@adraffy/ens-normalize/-/ens-normalize-1.9.0.tgz#223572538f6bea336750039bb43a4016dcc8182d" - integrity sha512-iowxq3U30sghZotgl4s/oJRci6WPBfNO5YYgk2cIOMCHr3LeGPcsZjCEr+33Q4N+oV3OABDAtA+pyvWjbvBifQ== - "@babel/code-frame@^7.0.0": version "7.18.6" resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.18.6.tgz#3b25d38c89600baa2dcc219edfa88a74eb2c427a" @@ -69,6 +64,13 @@ resolved "https://registry.yarnpkg.com/@colors/colors/-/colors-1.5.0.tgz#bb504579c1cae923e6576a4f5da43d25f97bdbd9" integrity sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ== +"@cspotcode/source-map-support@^0.8.0": + version "0.8.1" + resolved "https://registry.yarnpkg.com/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz#00629c35a688e05a88b1cda684fb9d5e73f000a1" + integrity sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw== + dependencies: + "@jridgewell/trace-mapping" "0.3.9" + "@ethersproject/abi@5.7.0", "@ethersproject/abi@^5.0.0-beta.146", "@ethersproject/abi@^5.0.9", "@ethersproject/abi@^5.1.2", "@ethersproject/abi@^5.5.0", "@ethersproject/abi@^5.7.0": version "5.7.0" resolved "https://registry.yarnpkg.com/@ethersproject/abi/-/abi-5.7.0.tgz#b3f3e045bbbeed1af3947335c247ad625a44e449" @@ -455,6 +457,24 @@ "@ethersproject/properties" "^5.7.0" "@ethersproject/strings" "^5.7.0" +"@jridgewell/resolve-uri@^3.0.3": + version "3.1.1" + resolved "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.1.tgz#c08679063f279615a3326583ba3a90d1d82cc721" + integrity sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA== + +"@jridgewell/sourcemap-codec@^1.4.10": + version "1.4.15" + resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz#d7c6e6755c78567a951e04ab52ef0fd26de59f32" + integrity sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg== + +"@jridgewell/trace-mapping@0.3.9": + version "0.3.9" + resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz#6534fd5933a53ba7cbf3a17615e273a0d1273ff9" + integrity sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ== + dependencies: + "@jridgewell/resolve-uri" "^3.0.3" + "@jridgewell/sourcemap-codec" "^1.4.10" + "@metamask/eth-sig-util@^4.0.0": version "4.0.1" resolved "https://registry.yarnpkg.com/@metamask/eth-sig-util/-/eth-sig-util-4.0.1.tgz#3ad61f6ea9ad73ba5b19db780d40d9aae5157088" @@ -466,11 +486,6 @@ tweetnacl "^1.0.3" tweetnacl-util "^0.15.1" -"@noble/hashes@1.1.2": - version "1.1.2" - resolved "https://registry.yarnpkg.com/@noble/hashes/-/hashes-1.1.2.tgz#e9e035b9b166ca0af657a7848eb2718f0f22f183" - integrity sha512-KYRCASVTv6aeUi1tsF8/vpyR7zpfs3FUzy2Jqm+MU+LmUKhQ0y2FpfwqkCcxSg2ua4GALJd8k2R76WxwZGbQpA== - "@noble/hashes@1.2.0", "@noble/hashes@~1.2.0": version "1.2.0" resolved "https://registry.yarnpkg.com/@noble/hashes/-/hashes-1.2.0.tgz#a3150eeb09cc7ab207ebf6d7b9ad311a9bdbed12" @@ -648,6 +663,18 @@ deep-eql "^4.0.1" ordinal "^1.0.3" +"@nomicfoundation/hardhat-network-helpers@^1.0.0": + version "1.0.8" + resolved "https://registry.yarnpkg.com/@nomicfoundation/hardhat-network-helpers/-/hardhat-network-helpers-1.0.8.tgz#e4fe1be93e8a65508c46d73c41fa26c7e9f84931" + integrity sha512-MNqQbzUJZnCMIYvlniC3U+kcavz/PhhQSsY90tbEtUyMj/IQqsLwIRZa4ctjABh3Bz0KCh9OXUZ7Yk/d9hr45Q== + dependencies: + ethereumjs-util "^7.1.4" + +"@nomicfoundation/hardhat-toolbox@^1.0.2": + version "1.0.2" + resolved "https://registry.yarnpkg.com/@nomicfoundation/hardhat-toolbox/-/hardhat-toolbox-1.0.2.tgz#342b79e19c456a56d8e76bc2e9cc8474cbcfc774" + integrity sha512-8CEgWSKUK2aMit+76Sez8n7UB0Ze1lwT+LcWxj4EFP30lQWOwOws048t6MTPfThH0BlSWjC6hJRr0LncIkc1Sw== + "@nomicfoundation/solidity-analyzer-darwin-arm64@0.1.1": version "0.1.1" resolved "https://registry.yarnpkg.com/@nomicfoundation/solidity-analyzer-darwin-arm64/-/solidity-analyzer-darwin-arm64-0.1.1.tgz#4c858096b1c17fe58a474fe81b46815f93645c15" @@ -883,6 +910,41 @@ hardhat-deploy "^0.11.10" js-yaml "^3.14.0" +"@tsconfig/node10@^1.0.7": + version "1.0.9" + resolved "https://registry.yarnpkg.com/@tsconfig/node10/-/node10-1.0.9.tgz#df4907fc07a886922637b15e02d4cebc4c0021b2" + integrity sha512-jNsYVVxU8v5g43Erja32laIDHXeoNvFEpX33OK4d6hljo3jDhCBDhx5dhCCTMWUojscpAagGiRkBKxpdl9fxqA== + +"@tsconfig/node12@^1.0.7": + version "1.0.11" + resolved "https://registry.yarnpkg.com/@tsconfig/node12/-/node12-1.0.11.tgz#ee3def1f27d9ed66dac6e46a295cffb0152e058d" + integrity sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag== + +"@tsconfig/node14@^1.0.0": + version "1.0.3" + resolved "https://registry.yarnpkg.com/@tsconfig/node14/-/node14-1.0.3.tgz#e4386316284f00b98435bf40f72f75a09dabf6c1" + integrity sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow== + +"@tsconfig/node16@^1.0.2": + version "1.0.4" + resolved "https://registry.yarnpkg.com/@tsconfig/node16/-/node16-1.0.4.tgz#0b92dcc0cc1c81f6f306a381f28e31b1a56536e9" + integrity sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA== + +"@typechain/ethers-v5@^10.1.0": + version "10.2.1" + resolved "https://registry.yarnpkg.com/@typechain/ethers-v5/-/ethers-v5-10.2.1.tgz#50241e6957683281ecfa03fb5a6724d8a3ce2391" + integrity sha512-n3tQmCZjRE6IU4h6lqUGiQ1j866n5MTCBJreNEHHVWXa2u9GJTaeYyU1/k+1qLutkyw+sS6VAN+AbeiTqsxd/A== + dependencies: + lodash "^4.17.15" + ts-essentials "^7.0.1" + +"@typechain/hardhat@^6.1.2": + version "6.1.6" + resolved "https://registry.yarnpkg.com/@typechain/hardhat/-/hardhat-6.1.6.tgz#1a749eb35e5054c80df531cf440819cb347c62ea" + integrity sha512-BiVnegSs+ZHVymyidtK472syodx1sXYlYJJixZfRstHVGYTi8V1O7QG4nsjyb0PC/LORcq7sfBUcHto1y6UgJA== + dependencies: + fs-extra "^9.1.0" + "@types/bn.js@^4.11.3": version "4.11.6" resolved "https://registry.yarnpkg.com/@types/bn.js/-/bn.js-4.11.6.tgz#c306c70d9358aaea33cd4eda092a742b9505967c" @@ -941,6 +1003,11 @@ resolved "https://registry.yarnpkg.com/@types/minimatch/-/minimatch-5.1.2.tgz#07508b45797cb81ec3f273011b054cd0755eddca" integrity sha512-K0VQKziLUWkVKiRVrx4a40iPaxTUefQmjtkQofBkYRcoaaL/8rhwDWww9qWbrgicNOgnpIsMxyNIUM4+n6dUIA== +"@types/mocha@^9.1.0": + version "9.1.1" + resolved "https://registry.yarnpkg.com/@types/mocha/-/mocha-9.1.1.tgz#e7c4f1001eefa4b8afbd1eee27a237fee3bf29c4" + integrity sha512-Z61JK7DKDtdKTWwLeElSEBcWGRLY8g95ic5FoQqI9CMx0ns/Ghep3B4DfcEimiKMvtamNVULVNKEsiwV3aQmXw== + "@types/node@*": version "20.2.1" resolved "https://registry.yarnpkg.com/@types/node/-/node-20.2.1.tgz#de559d4b33be9a808fd43372ccee822c70f39704" @@ -963,6 +1030,11 @@ dependencies: "@types/node" "*" +"@types/prettier@^2.1.1": + version "2.7.3" + resolved "https://registry.yarnpkg.com/@types/prettier/-/prettier-2.7.3.tgz#3e51a17e291d01d17d3fc61422015a933af7a08f" + integrity sha512-+68kP9yzs4LMp7VNh8gdzMSPZFL44MLGqiHWvttYJe+6qnuVr4Ek9wSBQoveqY/r+LwjCcU29kNVkidwim+kYA== + "@types/qs@^6.2.31", "@types/qs@^6.9.7": version "6.9.7" resolved "https://registry.yarnpkg.com/@types/qs/-/qs-6.9.7.tgz#63bb7d067db107cc1e457c303bc25d511febf6cb" @@ -1018,11 +1090,21 @@ acorn-jsx@^5.0.0: resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.3.2.tgz#7ed5bb55908b3b2f1bc55c6af1653bada7f07937" integrity sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ== +acorn-walk@^8.1.1: + version "8.2.0" + resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-8.2.0.tgz#741210f2e2426454508853a2f44d0ab83b7f69c1" + integrity sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA== + acorn@^6.0.7: version "6.4.2" resolved "https://registry.yarnpkg.com/acorn/-/acorn-6.4.2.tgz#35866fd710528e92de10cf06016498e47e39e1e6" integrity sha512-XtGIhXwF8YM8bJhGxG5kXgjkEuNGLTkoYqVE+KMR+aspr4KGYmKYg7yUe3KghyQ9yheNwLnjmzh/7+gfDBmHCQ== +acorn@^8.4.1: + version "8.8.2" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.8.2.tgz#1b2f25db02af965399b9776b0c2c391276d37c4a" + integrity sha512-xjIYgE8HBrkpd/sJqOGNspf8uHG+NOHGOw6a/Urj8taM2EXfdNAH2oFcPeIFfsv3+kz/mJrS5VuMqbNLjCa2vw== + address@^1.0.1: version "1.2.0" resolved "https://registry.yarnpkg.com/address/-/address-1.2.0.tgz#d352a62c92fee90f89a693eccd2a8b2139ab02d9" @@ -1038,11 +1120,6 @@ aes-js@3.0.0: resolved "https://registry.yarnpkg.com/aes-js/-/aes-js-3.0.0.tgz#e21df10ad6c2053295bcbb8dab40b09dbea87e4d" integrity sha512-H7wUZRn8WpTq9jocdxQ2c8x2sKo9ZVmzfRE13GiNJXfp7NcKYEdvl3vspKjXox6RIG2VtaRe4JFvxG4rqp2Zuw== -aes-js@4.0.0-beta.3: - version "4.0.0-beta.3" - resolved "https://registry.yarnpkg.com/aes-js/-/aes-js-4.0.0-beta.3.tgz#da2253f0ff03a0b3a9e445c8cbdf78e7fda7d48c" - integrity sha512-/xJX0/VTPcbc5xQE2VUP91y1xN8q/rDfhEzLm+vLc3hYvb5+qHCnpJRuFcrKn63zumK/sCwYYzhG8HP78JYSTA== - agent-base@6: version "6.0.2" resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-6.0.2.tgz#49fff58577cfee3f37176feab4c22e00f86d7f77" @@ -1165,6 +1242,11 @@ anymatch@~3.1.2: normalize-path "^3.0.0" picomatch "^2.0.4" +arg@^4.1.0: + version "4.1.3" + resolved "https://registry.yarnpkg.com/arg/-/arg-4.1.3.tgz#269fc7ad5b8e42cb63c896d5666017261c144089" + integrity sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA== + argparse@^1.0.7: version "1.0.10" resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.10.tgz#bcd6791ea5ae09725e17e5ad988134cd40b3d911" @@ -1177,6 +1259,16 @@ argparse@^2.0.1: resolved "https://registry.yarnpkg.com/argparse/-/argparse-2.0.1.tgz#246f50f3ca78a3240f6c997e8a9bd1eac49e4b38" integrity sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q== +array-back@^3.0.1, array-back@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/array-back/-/array-back-3.1.0.tgz#b8859d7a508871c9a7b2cf42f99428f65e96bfb0" + integrity sha512-TkuxA4UCOvxuDK6NZYXCalszEzj+TLszyASooky+i742l9TqsOdYCMJJupxRic61hwquNtppB3hgcuq9SVSH1Q== + +array-back@^4.0.1, array-back@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/array-back/-/array-back-4.0.2.tgz#8004e999a6274586beeb27342168652fdb89fa1e" + integrity sha512-NbdMezxqf94cnNfWLL7V/im0Ub+Anbb0IoZhvzie8+4HJ4nMQuzHuy49FkGYCJK2yAloZ3meiB6AVMClbrI1vg== + array-union@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/array-union/-/array-union-2.1.0.tgz#b798420adbeb1de828d84acd8a2e23d3efe85e8d" @@ -1691,6 +1783,26 @@ command-exists@^1.2.8: resolved "https://registry.yarnpkg.com/command-exists/-/command-exists-1.2.9.tgz#c50725af3808c8ab0260fd60b01fbfa25b954f69" integrity sha512-LTQ/SGc+s0Xc0Fu5WaKnR0YiygZkm9eKFvyS+fRsU7/ZWFF8ykFM6Pc9aCVf1+xasOOZpO3BAVgVrKvsqKHV7w== +command-line-args@^5.1.1: + version "5.2.1" + resolved "https://registry.yarnpkg.com/command-line-args/-/command-line-args-5.2.1.tgz#c44c32e437a57d7c51157696893c5909e9cec42e" + integrity sha512-H4UfQhZyakIjC74I9d34fGYDwk3XpSr17QhEd0Q3I9Xq1CETHo4Hcuo87WyWHpAF1aSLjLRf5lD9ZGX2qStUvg== + dependencies: + array-back "^3.1.0" + find-replace "^3.0.0" + lodash.camelcase "^4.3.0" + typical "^4.0.0" + +command-line-usage@^6.1.0: + version "6.1.3" + resolved "https://registry.yarnpkg.com/command-line-usage/-/command-line-usage-6.1.3.tgz#428fa5acde6a838779dfa30e44686f4b6761d957" + integrity sha512-sH5ZSPr+7UStsloltmDh7Ce5fb8XPlHyoPzTpyyMuYCtervL65+ubVZ6Q61cFtFl62UyJlc8/JwERRbAFPUqgw== + dependencies: + array-back "^4.0.2" + chalk "^2.4.2" + table-layout "^1.0.2" + typical "^5.2.0" + commander@2.18.0: version "2.18.0" resolved "https://registry.yarnpkg.com/commander/-/commander-2.18.0.tgz#2bf063ddee7c7891176981a2cc798e5754bc6970" @@ -1774,6 +1886,11 @@ create-hmac@^1.1.4, create-hmac@^1.1.7: safe-buffer "^5.0.1" sha.js "^2.4.8" +create-require@^1.1.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/create-require/-/create-require-1.1.1.tgz#c1d7e8f1e5f6cfc9ff65f9cd352d37348756c333" + integrity sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ== + cross-spawn@^6.0.5: version "6.0.5" resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-6.0.5.tgz#4a5ec7c64dfae22c3a14124dbacdee846d80cbc4" @@ -1809,7 +1926,7 @@ debug@3.2.6: dependencies: ms "^2.1.1" -debug@4, debug@4.3.4, debug@^4.0.1, debug@^4.1.1, debug@^4.3.2, debug@^4.3.3: +debug@4, debug@4.3.4, debug@^4.0.1, debug@^4.1.1, debug@^4.3.1, debug@^4.3.2, debug@^4.3.3: version "4.3.4" resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.4.tgz#1319f6579357f2338d3337d2cdd4914bb5dcc865" integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ== @@ -1847,6 +1964,11 @@ deep-eql@^4.0.1: dependencies: type-detect "^4.0.0" +deep-extend@~0.6.0: + version "0.6.0" + resolved "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.6.0.tgz#c4fa7c95404a17a9c3e8ca7e1537312b736330ac" + integrity sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA== + deep-is@~0.1.3: version "0.1.4" resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.4.tgz#a6f2dce612fadd2ef1f519b73551f17e85199831" @@ -1898,6 +2020,11 @@ diff@5.0.0: resolved "https://registry.yarnpkg.com/diff/-/diff-5.0.0.tgz#7ed6ad76d859d030787ec35855f5b1daf31d852b" integrity sha512-/VTCrvm5Z0JGty/BWHljh+BAiw3IK+2j87NGMu8Nwc/f48WoDAC395uomO9ZD117ZOBaHmkX1oyLvkVM/aIT3w== +diff@^4.0.1: + version "4.0.2" + resolved "https://registry.yarnpkg.com/diff/-/diff-4.0.2.tgz#60f3aecb89d5fae520c11aa19efc2bb982aade7d" + integrity sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A== + difflib@^0.2.4: version "0.2.4" resolved "https://registry.yarnpkg.com/difflib/-/difflib-0.2.4.tgz#b5e30361a6db023176d562892db85940a718f47e" @@ -2249,7 +2376,7 @@ ethereumjs-util@^6.0.0, ethereumjs-util@^6.2.1: ethjs-util "0.1.6" rlp "^2.2.3" -ethereumjs-util@^7.0.3, ethereumjs-util@^7.1.0: +ethereumjs-util@^7.0.3, ethereumjs-util@^7.1.0, ethereumjs-util@^7.1.4: version "7.1.5" resolved "https://registry.yarnpkg.com/ethereumjs-util/-/ethereumjs-util-7.1.5.tgz#9ecf04861e4fbbeed7465ece5f23317ad1129181" integrity sha512-SDl5kKrQAudFBUe5OJM9Ac6WmMyYmXX/6sTmLZ3ffG2eY6ZIGBes3pEDxNN6V72WyOw4CPD5RomKdsa8DAAwLg== @@ -2275,10 +2402,10 @@ ethers@^4.0.40: uuid "2.0.1" xmlhttprequest "1.8.0" -ethers@^5.5.3, ethers@^5.6.8: - version "5.7.0" - resolved "https://registry.yarnpkg.com/ethers/-/ethers-5.7.0.tgz#0055da174b9e076b242b8282638bc94e04b39835" - integrity sha512-5Xhzp2ZQRi0Em+0OkOcRHxPzCfoBfgtOQA+RUylSkuHbhTEaQklnYi2hsWbRgs3ztJsXVXd9VKBcO1ScWL8YfA== +ethers@^5.4.7, ethers@^5.7.1: + version "5.7.2" + resolved "https://registry.yarnpkg.com/ethers/-/ethers-5.7.2.tgz#3a7deeabbb8c030d4126b24f84e525466145872e" + integrity sha512-wswUsmWo1aOK8rR7DIKiWSw9DbLWe6x98Jrn8wcTflTVvaXhAMaB5zGAXy0GYQEQp9iO1iSHWVyARQm11zUtyg== dependencies: "@ethersproject/abi" "5.7.0" "@ethersproject/abstract-provider" "5.7.0" @@ -2295,10 +2422,10 @@ ethers@^5.5.3, ethers@^5.6.8: "@ethersproject/json-wallets" "5.7.0" "@ethersproject/keccak256" "5.7.0" "@ethersproject/logger" "5.7.0" - "@ethersproject/networks" "5.7.0" + "@ethersproject/networks" "5.7.1" "@ethersproject/pbkdf2" "5.7.0" "@ethersproject/properties" "5.7.0" - "@ethersproject/providers" "5.7.0" + "@ethersproject/providers" "5.7.2" "@ethersproject/random" "5.7.0" "@ethersproject/rlp" "5.7.0" "@ethersproject/sha2" "5.7.0" @@ -2308,13 +2435,13 @@ ethers@^5.5.3, ethers@^5.6.8: "@ethersproject/transactions" "5.7.0" "@ethersproject/units" "5.7.0" "@ethersproject/wallet" "5.7.0" - "@ethersproject/web" "5.7.0" + "@ethersproject/web" "5.7.1" "@ethersproject/wordlists" "5.7.0" -ethers@^5.7.1: - version "5.7.2" - resolved "https://registry.yarnpkg.com/ethers/-/ethers-5.7.2.tgz#3a7deeabbb8c030d4126b24f84e525466145872e" - integrity sha512-wswUsmWo1aOK8rR7DIKiWSw9DbLWe6x98Jrn8wcTflTVvaXhAMaB5zGAXy0GYQEQp9iO1iSHWVyARQm11zUtyg== +ethers@^5.5.3, ethers@^5.6.8: + version "5.7.0" + resolved "https://registry.yarnpkg.com/ethers/-/ethers-5.7.0.tgz#0055da174b9e076b242b8282638bc94e04b39835" + integrity sha512-5Xhzp2ZQRi0Em+0OkOcRHxPzCfoBfgtOQA+RUylSkuHbhTEaQklnYi2hsWbRgs3ztJsXVXd9VKBcO1ScWL8YfA== dependencies: "@ethersproject/abi" "5.7.0" "@ethersproject/abstract-provider" "5.7.0" @@ -2331,10 +2458,10 @@ ethers@^5.7.1: "@ethersproject/json-wallets" "5.7.0" "@ethersproject/keccak256" "5.7.0" "@ethersproject/logger" "5.7.0" - "@ethersproject/networks" "5.7.1" + "@ethersproject/networks" "5.7.0" "@ethersproject/pbkdf2" "5.7.0" "@ethersproject/properties" "5.7.0" - "@ethersproject/providers" "5.7.2" + "@ethersproject/providers" "5.7.0" "@ethersproject/random" "5.7.0" "@ethersproject/rlp" "5.7.0" "@ethersproject/sha2" "5.7.0" @@ -2344,21 +2471,9 @@ ethers@^5.7.1: "@ethersproject/transactions" "5.7.0" "@ethersproject/units" "5.7.0" "@ethersproject/wallet" "5.7.0" - "@ethersproject/web" "5.7.1" + "@ethersproject/web" "5.7.0" "@ethersproject/wordlists" "5.7.0" -ethers@^6.3.0: - version "6.3.0" - resolved "https://registry.yarnpkg.com/ethers/-/ethers-6.3.0.tgz#c61efaafa2bd9a4d9f0c799d932ef3b5cd4bd37d" - integrity sha512-CKFYvTne1YT4S1glTiu7TgGsj0t6c6GAD7evrIk8zbeUb6nK8dcUPAiAWM8uDX/1NmRTvLM9+1Vnn49hwKtEzw== - dependencies: - "@adraffy/ens-normalize" "1.9.0" - "@noble/hashes" "1.1.2" - "@noble/secp256k1" "1.7.1" - aes-js "4.0.0-beta.3" - tslib "2.4.0" - ws "8.5.0" - ethjs-unit@0.1.6: version "0.1.6" resolved "https://registry.yarnpkg.com/ethjs-unit/-/ethjs-unit-0.1.6.tgz#c665921e476e87bce2a9d588a6fe0405b2c41699" @@ -2471,6 +2586,13 @@ fill-range@^7.0.1: dependencies: to-regex-range "^5.0.1" +find-replace@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/find-replace/-/find-replace-3.0.0.tgz#3e7e23d3b05167a76f770c9fbd5258b0def68c38" + integrity sha512-6Tb2myMioCAgv5kfvP5/PkZZ/ntTpVK39fHY7WkWBgvbeE+VHd/tZuZ4mrC+bxh4cfOZeYKVPaJIZtZXV7GNCQ== + dependencies: + array-back "^3.0.1" + find-up@3.0.0, find-up@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/find-up/-/find-up-3.0.0.tgz#49169f1d7993430646da61ecc5ae355c21c97b73" @@ -2598,7 +2720,7 @@ fs-extra@^10.0.0: jsonfile "^6.0.1" universalify "^2.0.0" -fs-extra@^7.0.1: +fs-extra@^7.0.0, fs-extra@^7.0.1: version "7.0.1" resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-7.0.1.tgz#4f189c44aa123b895f722804f55ea23eadc348e9" integrity sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw== @@ -2616,7 +2738,7 @@ fs-extra@^8.1.0: jsonfile "^4.0.0" universalify "^0.1.0" -fs-extra@^9.0.1: +fs-extra@^9.0.1, fs-extra@^9.1.0: version "9.1.0" resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-9.1.0.tgz#5954460c764a8da2094ba3554bf839e6b9a7c86d" integrity sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ== @@ -2747,6 +2869,18 @@ glob@7.1.3: once "^1.3.0" path-is-absolute "^1.0.0" +glob@7.1.7: + version "7.1.7" + resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.7.tgz#3b193e9233f01d42d0b3f78294bbeeb418f94a90" + integrity sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ== + dependencies: + fs.realpath "^1.0.0" + inflight "^1.0.4" + inherits "2" + minimatch "^3.0.4" + once "^1.3.0" + path-is-absolute "^1.0.0" + glob@7.2.0: version "7.2.0" resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.0.tgz#d15535af7732e02e948f4c41628bd910293f6023" @@ -2865,6 +2999,13 @@ hardhat-abi-exporter@^2.10.0: "@ethersproject/abi" "^5.5.0" delete-empty "^3.0.0" +hardhat-celo@^0.0.4: + version "0.0.4" + resolved "https://registry.yarnpkg.com/hardhat-celo/-/hardhat-celo-0.0.4.tgz#aef6fc91e694dd5c0811953d01b08964e3c0a078" + integrity sha512-K/USkJCTaWUGfmlEs/9EbwYovgfoQ6BfhZNCrG7zAkFfmcYXuUuARwzLyyZbCHjmDOyh17OHiL3ItS89MEAohA== + dependencies: + "@nomicfoundation/hardhat-toolbox" "^1.0.2" + hardhat-contract-sizer@^2.6.1: version "2.6.1" resolved "https://registry.yarnpkg.com/hardhat-contract-sizer/-/hardhat-contract-sizer-2.6.1.tgz#2b0046a55fa1ec96f19fdab7fde372377401c874" @@ -3581,6 +3722,11 @@ locate-path@^6.0.0: dependencies: p-locate "^5.0.0" +lodash.camelcase@^4.3.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz#b28aa6288a2b9fc651035c7711f65ab6190331a6" + integrity sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA== + lodash.truncate@^4.4.2: version "4.4.2" resolved "https://registry.yarnpkg.com/lodash.truncate/-/lodash.truncate-4.4.2.tgz#5a350da0b1113b837ecfffd5812cbe58d6eae193" @@ -3632,6 +3778,11 @@ lru_map@^0.3.3: resolved "https://registry.yarnpkg.com/lru_map/-/lru_map-0.3.3.tgz#b5c8351b9464cbd750335a79650a0ec0e56118dd" integrity sha512-Pn9cox5CsMYngeDbmChANltQl+5pi6XmTrraMSzhPmMBbmgcxmqWry0U3PGapCU1yB4/LqCcom7qhHZiF/jGfQ== +make-error@^1.1.1: + version "1.3.6" + resolved "https://registry.yarnpkg.com/make-error/-/make-error-1.3.6.tgz#2eb2e37ea9b67c4891f684a1394799af484cf7a2" + integrity sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw== + markdown-table@^1.1.3: version "1.1.3" resolved "https://registry.yarnpkg.com/markdown-table/-/markdown-table-1.1.3.tgz#9fcb69bcfdb8717bfd0398c6ec2d93036ef8de60" @@ -3750,6 +3901,11 @@ mkdirp@0.5.x, mkdirp@^0.5.1: dependencies: minimist "^1.2.6" +mkdirp@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-1.0.4.tgz#3eb5ed62622756d79a5f0e2a221dfebad75c2f7e" + integrity sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw== + mnemonist@^0.38.0: version "0.38.5" resolved "https://registry.yarnpkg.com/mnemonist/-/mnemonist-0.38.5.tgz#4adc7f4200491237fe0fa689ac0b86539685cade" @@ -4231,6 +4387,11 @@ prettier@^1.14.3: resolved "https://registry.yarnpkg.com/prettier/-/prettier-1.19.1.tgz#f7d7f5ff8a9cd872a7be4ca142095956a60797cb" integrity sha512-s7PoyDv/II1ObgQunCbB9PdLmUcBZcnWOcxDh7O0N/UwDEsHyqkW+Qh28jW+mVuCdx7gLB0BotYI1Y6uI9iyew== +prettier@^2.3.1: + version "2.8.8" + resolved "https://registry.yarnpkg.com/prettier/-/prettier-2.8.8.tgz#e8c5d7e98a4305ffe3de2e1fc4aca1a71c28b1da" + integrity sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q== + prettier@^2.7.1: version "2.7.1" resolved "https://registry.yarnpkg.com/prettier/-/prettier-2.7.1.tgz#e235806850d057f97bb08368a4f7d899f7760c64" @@ -4373,6 +4534,11 @@ recursive-readdir@^2.2.2: dependencies: minimatch "3.0.4" +reduce-flatten@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/reduce-flatten/-/reduce-flatten-2.0.0.tgz#734fd84e65f375d7ca4465c69798c25c9d10ae27" + integrity sha512-EJ4UNY/U1t2P/2k6oqotuX2Cc3T6nxJwsM0N0asT7dhrtH1ltUxDn4NalSYmPE2rCkVpcf/X6R0wDwcFpzhd4w== + regexp.prototype.flags@^1.4.3: version "1.4.3" resolved "https://registry.yarnpkg.com/regexp.prototype.flags/-/regexp.prototype.flags-1.4.3.tgz#87cab30f80f66660181a3bb7bf5981a872b367ac" @@ -4874,6 +5040,11 @@ streamsearch@^1.1.0: resolved "https://registry.yarnpkg.com/streamsearch/-/streamsearch-1.1.0.tgz#404dd1e2247ca94af554e841a8ef0eaa238da764" integrity sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg== +string-format@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/string-format/-/string-format-2.0.0.tgz#f2df2e7097440d3b65de31b6d40d54c96eaffb9b" + integrity sha512-bbEs3scLeYNXLecRRuk6uJxdXUSj6le/8rNPHChIJTn2V79aXVTR1EH2OH5zLKKoz0V02fOUKZZcw01pLUShZA== + "string-width@^1.0.2 || 2", string-width@^2.1.0, string-width@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/string-width/-/string-width-2.1.1.tgz#ab93f27a8dc13d28cac815c462143a6d9012ae9e" @@ -5026,6 +5197,16 @@ sync-rpc@^1.2.1: dependencies: get-port "^3.1.0" +table-layout@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/table-layout/-/table-layout-1.0.2.tgz#c4038a1853b0136d63365a734b6931cf4fad4a04" + integrity sha512-qd/R7n5rQTRFi+Zf2sk5XVVd9UQl6ZkduPFC3S7WEGJAmetDTjY3qPN50eSKzwuzEyQKy5TN2TiZdkIjos2L6A== + dependencies: + array-back "^4.0.1" + deep-extend "~0.6.0" + typical "^5.2.0" + wordwrapjs "^4.0.0" + table@^5.2.3: version "5.4.6" resolved "https://registry.yarnpkg.com/table/-/table-5.4.6.tgz#1292d19500ce3f86053b05f0e8e7e4a3bb21079e" @@ -5101,10 +5282,39 @@ tough-cookie@^2.3.3, tough-cookie@~2.5.0: psl "^1.1.28" punycode "^2.1.1" -tslib@2.4.0: - version "2.4.0" - resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.4.0.tgz#7cecaa7f073ce680a05847aa77be941098f36dc3" - integrity sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ== +ts-command-line-args@^2.2.0: + version "2.5.1" + resolved "https://registry.yarnpkg.com/ts-command-line-args/-/ts-command-line-args-2.5.1.tgz#e64456b580d1d4f6d948824c274cf6fa5f45f7f0" + integrity sha512-H69ZwTw3rFHb5WYpQya40YAX2/w7Ut75uUECbgBIsLmM+BNuYnxsltfyyLMxy6sEeKxgijLTnQtLd0nKd6+IYw== + dependencies: + chalk "^4.1.0" + command-line-args "^5.1.1" + command-line-usage "^6.1.0" + string-format "^2.0.0" + +ts-essentials@^7.0.1: + version "7.0.3" + resolved "https://registry.yarnpkg.com/ts-essentials/-/ts-essentials-7.0.3.tgz#686fd155a02133eedcc5362dc8b5056cde3e5a38" + integrity sha512-8+gr5+lqO3G84KdiTSMRLtuyJ+nTBVRKuCrK4lidMPdVeEp0uqC875uE5NMcaA7YYMN7XsNiFQuMvasF8HT/xQ== + +ts-node@>=8.0.0: + version "10.9.1" + resolved "https://registry.yarnpkg.com/ts-node/-/ts-node-10.9.1.tgz#e73de9102958af9e1f0b168a6ff320e25adcff4b" + integrity sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw== + dependencies: + "@cspotcode/source-map-support" "^0.8.0" + "@tsconfig/node10" "^1.0.7" + "@tsconfig/node12" "^1.0.7" + "@tsconfig/node14" "^1.0.0" + "@tsconfig/node16" "^1.0.2" + acorn "^8.4.1" + acorn-walk "^8.1.1" + arg "^4.1.0" + create-require "^1.1.0" + diff "^4.0.1" + make-error "^1.1.1" + v8-compile-cache-lib "^3.0.1" + yn "3.1.1" tslib@^1.9.0, tslib@^1.9.3: version "1.14.1" @@ -5160,6 +5370,22 @@ type-fest@^0.7.1: resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.7.1.tgz#8dda65feaf03ed78f0a3f9678f1869147f7c5c48" integrity sha512-Ne2YiiGN8bmrmJJEuTWTLJR32nh/JdL1+PSicowtNb0WFpn59GK8/lfD61bVtzguz7b3PBt74nxpv/Pw5po5Rg== +typechain@^8.1.0: + version "8.2.0" + resolved "https://registry.yarnpkg.com/typechain/-/typechain-8.2.0.tgz#bd4fc8f111d4405e36858bae6f744604617b60f3" + integrity sha512-tZqhqjxJ9xAS/Lh32jccTjMkpx7sTdUVVHAy5Bf0TIer5QFNYXotiX74oCvoVYjyxUKDK3MXHtMFzMyD3kE+jg== + 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" + typedarray@^0.0.6: version "0.0.6" resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777" @@ -5170,6 +5396,16 @@ typescript@^4.8.2: resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.8.2.tgz#e3b33d5ccfb5914e4eeab6699cf208adee3fd790" integrity sha512-C0I1UsrrDHo2fYI5oaCGbSejwX4ch+9Y5jTQELvovfmFkK3HHSZJB8MSJcWLmCUBzQBchCrZ9rMRV6GuNrvGtw== +typical@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/typical/-/typical-4.0.0.tgz#cbeaff3b9d7ae1e2bbfaf5a4e6f11eccfde94fc4" + integrity sha512-VAH4IvQ7BDFYglMd7BPRDfLgxZZX4O4TFcRDA6EN5X7erNJJq+McIEp8np9aVtxrCJ6qx4GTYVfOWNjcqwZgRw== + +typical@^5.2.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/typical/-/typical-5.2.0.tgz#4daaac4f2b5315460804f0acf6cb69c52bb93066" + integrity sha512-dvdQgNDNJo+8B2uBQoqdb11eUCE1JQXhvjC/CZtgvZseVd5TYMXnq0+vuUemXbd/Se29cTaUuPX3YIc2xgbvIg== + uglify-js@^3.1.4: version "3.17.0" resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-3.17.0.tgz#55bd6e9d19ce5eef0d5ad17cd1f587d85b180a85" @@ -5239,6 +5475,11 @@ uuid@^8.3.2: resolved "https://registry.yarnpkg.com/uuid/-/uuid-8.3.2.tgz#80d5b5ced271bb9af6c445f21a1a04c606cefbe2" integrity sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg== +v8-compile-cache-lib@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz#6336e8d71965cb3d35a1bbb7868445a7c05264bf" + integrity sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg== + verror@1.10.0: version "1.10.0" resolved "https://registry.yarnpkg.com/verror/-/verror-1.10.0.tgz#3a105ca17053af55d6e270c1f8288682e18da400" @@ -5301,6 +5542,14 @@ wordwrap@^1.0.0: resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-1.0.0.tgz#27584810891456a4171c8d0226441ade90cbcaeb" integrity sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q== +wordwrapjs@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/wordwrapjs/-/wordwrapjs-4.0.1.tgz#d9790bccfb110a0fc7836b5ebce0937b37a8b98f" + integrity sha512-kKlNACbvHrkpIw6oPeYDSmdCTu2hdMHoyXLTcUKala++lx5Y+wjJ/e474Jqv5abnVmwxw08DiTuHmw69lJGksA== + dependencies: + reduce-flatten "^2.0.0" + typical "^5.2.0" + workerpool@6.2.1: version "6.2.1" resolved "https://registry.yarnpkg.com/workerpool/-/workerpool-6.2.1.tgz#46fc150c17d826b86a008e5a4508656777e9c343" @@ -5341,11 +5590,6 @@ ws@7.4.6: resolved "https://registry.yarnpkg.com/ws/-/ws-7.4.6.tgz#5654ca8ecdeee47c33a9a4bf6d28e2be2980377c" integrity sha512-YmhHDO4MzaDLB+M9ym/mDA5z0naX8j7SIlT8f8z+I0VtzsRbekxEutHSme7NPS2qE8StCYQNUnfWdXta/Yu85A== -ws@8.5.0: - version "8.5.0" - resolved "https://registry.yarnpkg.com/ws/-/ws-8.5.0.tgz#bfb4be96600757fe5382de12c670dab984a1ed4f" - integrity sha512-BWX0SWVgLPzYwF8lTzEy1egjhS4S4OEAHfsO8o65WOVsrnSRGaSiUaa9e0ggGlkMTtBlmOpEXiie9RUcBO86qg== - ws@^7.4.6: version "7.5.9" resolved "https://registry.yarnpkg.com/ws/-/ws-7.5.9.tgz#54fa7db29f4c7cec68b1ddd3a89de099942bb591" @@ -5442,6 +5686,11 @@ yargs@16.2.0: y18n "^5.0.5" yargs-parser "^20.2.2" +yn@3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/yn/-/yn-3.1.1.tgz#1e87401a09d767c1d5eab26a6e4c185182d2eb50" + integrity sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q== + yocto-queue@^0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-0.1.0.tgz#0294eb3dee05028d31ee1a5fa2c556a6aaf10a1b" From 07c4c72a461af75105c66d987e47af7cd03ea9f3 Mon Sep 17 00:00:00 2001 From: PlayJoker Date: Fri, 28 Jul 2023 14:21:18 -0700 Subject: [PATCH 09/29] added contract factory for deployment --- contracts/factory/LibFeeManager.sol | 11 ++ contracts/factory/LibPoolConfig.sol | 11 ++ contracts/factory/PoolFactory.sol | 181 ++++++++++++++++++++++++++ test/factoryTest.js | 195 ++++++++++++++++++++++++++++ 4 files changed, 398 insertions(+) create mode 100644 contracts/factory/LibFeeManager.sol create mode 100644 contracts/factory/LibPoolConfig.sol create mode 100644 contracts/factory/PoolFactory.sol create mode 100644 test/factoryTest.js diff --git a/contracts/factory/LibFeeManager.sol b/contracts/factory/LibFeeManager.sol new file mode 100644 index 00000000..14b8b5a2 --- /dev/null +++ b/contracts/factory/LibFeeManager.sol @@ -0,0 +1,11 @@ +// SPDX-License-Identifier: AGPL-3.0-or-later +pragma solidity ^0.8.0; + +import "../BaseFeeManager.sol"; + +library LibDeployFeeManager { + function addFeeManager() public returns (address) { + BaseFeeManager feeManager = new BaseFeeManager(); + return address(feeManager); + } +} diff --git a/contracts/factory/LibPoolConfig.sol b/contracts/factory/LibPoolConfig.sol new file mode 100644 index 00000000..ea009603 --- /dev/null +++ b/contracts/factory/LibPoolConfig.sol @@ -0,0 +1,11 @@ +// SPDX-License-Identifier: AGPL-3.0-or-later +pragma solidity ^0.8.0; + +import "../BasePoolConfig.sol"; + +library LibDeployPoolConfig { + function addPoolConfig() public returns (address) { + BasePoolConfig poolConfig = new BasePoolConfig(); + return address(poolConfig); + } +} diff --git a/contracts/factory/PoolFactory.sol b/contracts/factory/PoolFactory.sol new file mode 100644 index 00000000..92525ec2 --- /dev/null +++ b/contracts/factory/PoolFactory.sol @@ -0,0 +1,181 @@ +// SPDX-License-Identifier: AGPL-3.0-or-later +pragma solidity ^0.8.0; + +import "@openzeppelin/contracts/access/AccessControl.sol"; +import "@openzeppelin/contracts/governance/TimelockController.sol"; +import "@openzeppelin/contracts/access/Ownable.sol"; +import "@openzeppelin/contracts/proxy/transparent/TransparentUpgradeableProxy.sol"; + +import "../openzeppelin/TransparentUpgradeableProxy.sol"; + +import "./LibPoolConfig.sol"; +import "./LibFeeManager.sol"; + +contract PoolFactory is Ownable, AccessControl { + bytes32 public constant DEPLOYER_ROLE = keccak256("DEPLOYER_ROLE"); + + address public HUMA_CONFIG_ADDRESS; + address public hdtImplAddress; + address public baseCreditPoolImplAddress; + address public receivableFactoringPoolImplAddress; + + mapping(address => PoolRecord) private pools; + + enum PoolStatus { + Created, + Initialized, + Deleted + } + + struct PoolRecord { + string poolName; + PoolStatus poolStatus; + address poolTimeLock; + address hdt; + address feeManager; + address poolConfig; + } + + event HDTImplChanged(address oldAddress, address newAddress); + event BaseCredtiPoolImplChanged(address oldAddress, address newAddress); + event ReceivableFactoringPoolImplChanged(address oldAddress, address newAddress); + + event PoolDeleted(address poolAddress); + event DeployerAdded(address deployerAddress); + event DeployerRemoved(address deployerAddress); + + event PoolCreated(address poolAddress, string poolName); + + constructor( + address _humaConfigAddress, + address _hdtImplAddress, + address _baseCreditPoolImplAddress, + address _receivableFactoringPoolImplAddress + ) { + HUMA_CONFIG_ADDRESS = _humaConfigAddress; + hdtImplAddress = _hdtImplAddress; + baseCreditPoolImplAddress = _baseCreditPoolImplAddress; + receivableFactoringPoolImplAddress = _receivableFactoringPoolImplAddress; + } + + function addDeployer(address account) external onlyOwner { + _grantRole(DEPLOYER_ROLE, account); + } + + function removeDeployer(address account) external onlyOwner { + _revokeRole(DEPLOYER_ROLE, account); + } + + function createBaseCreditPool( + string memory _poolName, + address[] memory _poolOwner, + address[] memory _poolExecutors + ) external onlyRole(DEPLOYER_ROLE) { + address feeManagerAddress = LibDeployFeeManager.addFeeManager(); + TransparentUpgradeableProxy hdt = new TransparentUpgradeableProxy( + hdtImplAddress, + address(this), //Todo: for now proxy is not upgradable + "" + ); + address poolConfigAddress = LibDeployPoolConfig.addPoolConfig(); + address timeLockAddress = addTimeLock(_poolOwner, _poolExecutors); + TransparentUpgradeableProxy pool = new TransparentUpgradeableProxy( + baseCreditPoolImplAddress, + address(this), //Todo: for now proxy is not upgradable + "" + ); + pools[address(pool)] = PoolRecord( + _poolName, + PoolStatus.Created, + timeLockAddress, + address(hdt), + feeManagerAddress, + poolConfigAddress + ); + emit PoolCreated(address(pool), _poolName); + } + + function createReceivableFactoringPool( + string memory _poolName, + address[] memory _poolOwner, + address[] memory _poolExecutors + ) external onlyRole(DEPLOYER_ROLE) { + address feeManagerAddress = LibDeployFeeManager.addFeeManager(); + TransparentUpgradeableProxy hdt = new TransparentUpgradeableProxy( + hdtImplAddress, + address(this), //Todo: for now proxy is not upgradable + "" + ); + address poolConfigAddress = LibDeployPoolConfig.addPoolConfig(); + address timeLockAddress = addTimeLock(_poolOwner, _poolExecutors); + TransparentUpgradeableProxy pool = new TransparentUpgradeableProxy( + receivableFactoringPoolImplAddress, + address(this), //Todo: for now proxy is not upgradable + "" + ); + pools[address(pool)] = PoolRecord( + _poolName, + PoolStatus.Created, + timeLockAddress, + address(hdt), + feeManagerAddress, + poolConfigAddress + ); + emit PoolCreated(address(pool), _poolName); + } + + function setHDTImplAddress(address newAddress) external onlyOwner { + address oldAddress = hdtImplAddress; + hdtImplAddress = newAddress; + emit HDTImplChanged(oldAddress, newAddress); + } + + function setBaseCredtiPoolImplAddress(address newAddress) external onlyOwner { + address oldAddress = hdtImplAddress; + baseCreditPoolImplAddress = newAddress; + emit BaseCredtiPoolImplChanged(oldAddress, newAddress); + } + + function setReceivableFactoringPoolImplAddress(address newAddress) external onlyOwner { + address oldAddress = hdtImplAddress; + receivableFactoringPoolImplAddress = newAddress; + emit ReceivableFactoringPoolImplChanged(oldAddress, newAddress); + } + + function checkPool(address _poolAddress) external view returns (PoolRecord memory) { + if (_poolAddress == address(0)) { + revert("ZERO_ADDRESS"); + } + return pools[_poolAddress]; + } + + function deletePool(address _poolAddress) external onlyOwner { + if ( + pools[_poolAddress].poolStatus != PoolStatus.Created || + pools[_poolAddress].poolStatus != PoolStatus.Initialized + ) { + revert("NOT_VALID_POOL"); + } + pools[_poolAddress].poolStatus = PoolStatus.Deleted; + + emit PoolDeleted(_poolAddress); + } + + function addTimeLock(address[] memory poolAdmins, address[] memory poolExecutors) + internal + // only one account can be pool admin + onlyRole(DEPLOYER_ROLE) + returns (address) + { + TimelockController timeLock = new TimelockController(0, poolAdmins, poolExecutors); + return address(timeLock); + } + + // function initializeFeeManager() {} + + // function initializeHDT() {} + + // function initializePoolConfig() {} + + // function initializePool() {} +} diff --git a/test/factoryTest.js b/test/factoryTest.js new file mode 100644 index 00000000..0022d166 --- /dev/null +++ b/test/factoryTest.js @@ -0,0 +1,195 @@ +/* eslint-disable no-underscore-dangle */ +const {ethers} = require("hardhat"); +const {expect} = require("chai"); + +describe("Huma Config", function () { + let baseCreditPoolImpl; + before(async function () { + [ + deployer, + poolOwner, + protocolOwner, + ] = await ethers.getSigners(); + + // Deploy EvaluationAgentNFT + // console.log("deploying EANFT"); + const EvaluationAgentNFT = await ethers.getContractFactory("EvaluationAgentNFT"); + eaNFTContract = await EvaluationAgentNFT.deploy(); + + // console.log("deploying HumaConfig"); + const HumaConfig = await ethers.getContractFactory("HumaConfig"); + configContract = await HumaConfig.deploy(); + + // Deploy TestToken, give initial tokens to lender + // console.log("deploying TestToken"); + const TestToken = await ethers.getContractFactory("TestToken"); + testTokenContract = await TestToken.deploy(); + + // console.log("deploying HDTImpl"); + const HDTImpl = await ethers.getContractFactory("HDT"); + hdtImpl = await HDTImpl.deploy(); + + // deploy basecreditpool implementation + // console.log("deploying BaseCreditPoolImpl"); + const BaseCreditPoolImpl = await ethers.getContractFactory("BaseCreditPool"); + baseCreditPoolImpl = await BaseCreditPoolImpl.deploy(); + + const ReceivableFactoringPoolImpl = await ethers.getContractFactory("ReceivableFactoringPool"); + receivableFactoringPoolImpl = await ReceivableFactoringPoolImpl.deploy(); + + // console.log("deploying LibFeeManager"); + const LibFeeManager = await ethers.getContractFactory("LibDeployFeeManager"); + libFeeManager = await LibFeeManager.deploy(); + + // console.log("deploying LibPoolConfig"); + const LibPoolConfig = await ethers.getContractFactory("LibDeployPoolConfig"); + libPoolConfig = await LibPoolConfig.deploy(); + + // console.log("deploying PoolFactory"); + const PoolFactory = await ethers.getContractFactory("PoolFactory",{libraries: { + LibDeployFeeManager: libFeeManager.address, + LibDeployPoolConfig: libPoolConfig.address, + },}); + + poolFactory = await PoolFactory.deploy( + configContract.address, hdtImpl.address, + baseCreditPoolImpl.address, receivableFactoringPoolImpl.address + ); + console.log("Protocol contracts all deployed"); + console.log(baseCreditPoolImpl.address); + console.log(receivableFactoringPoolImpl.address); + console.log(configContract.address); + console.log(hdtImpl.address); + }); + + describe("Factory Ownership", function () { + it("Protocol owner should own the factory", async function () { + await poolFactory.transferOwnership(protocolOwner.address); + await expect(await poolFactory.owner()).to.equal(protocolOwner.address); + }); + }); + + describe("Deployer Role", function () { + it("Protocol owner can grant and revoke deployer role", async function () { + const role = await poolFactory.DEPLOYER_ROLE(); + await expect(await poolFactory.hasRole(role, deployer.address)).to.equal(false); + await poolFactory.connect(protocolOwner).addDeployer(deployer.address); + await expect(await poolFactory.hasRole(role, deployer.address)).to.equal(true); + await poolFactory.connect(protocolOwner).removeDeployer(deployer.address); + await expect(await poolFactory.hasRole(role, deployer.address)).to.equal(false); + await poolFactory.connect(protocolOwner).addDeployer(deployer.address); + }); + it("Other accounts cannot grant and revoke deployer role", async function () { + const role = await poolFactory.DEPLOYER_ROLE(); + await expect( + poolFactory.addDeployer(deployer.address) + ).to.be.revertedWith("Ownable: caller is not the owner"); + await expect( + poolFactory.removeDeployer(deployer.address) + ).to.be.revertedWith("Ownable: caller is not the owner"); + }); + }); + + describe("Setting implementation address", function () { + it("Owner can set new HDTimpl", async function () { + const newHDTImpl = await ethers.getContractFactory("HDT"); + hdtImpl = await newHDTImpl.deploy(); + await poolFactory.connect(protocolOwner).setHDTImplAddress(hdtImpl.address); + await expect(await poolFactory.hdtImplAddress()).to.equal(hdtImpl.address); + }); + it("Other accounts cannot set new HDTimpl", async function () { + const newHDTImpl = await ethers.getContractFactory("HDT"); + newhdtImpl = await newHDTImpl.deploy(); + await expect( + poolFactory.setHDTImplAddress(newhdtImpl.address) + ).to.be.revertedWith("Ownable: caller is not the owner"); + }); + it("Owner can set new BaseCredtiPoolImpl Address", async function () { + const NewImpl = await ethers.getContractFactory("BaseCreditPool"); + newBaseCreditPoolImpl = await NewImpl.deploy(); + await poolFactory.connect(protocolOwner).setBaseCredtiPoolImplAddress(newBaseCreditPoolImpl.address); + await expect(await poolFactory.baseCreditPoolImplAddress()).to.equal(newBaseCreditPoolImpl.address); + console.log(await poolFactory.baseCreditPoolImplAddress()); + }); + it("Other accounts cannot set new BaseCredtiPoolImpl", async function () { + const NewImpl = await ethers.getContractFactory("BaseCreditPool"); + newImpl = await NewImpl.deploy(); + await expect( + poolFactory.setHDTImplAddress(newImpl.address) + ).to.be.revertedWith("Ownable: caller is not the owner"); + console.log(await poolFactory.baseCreditPoolImplAddress()); + }); + it("Owner can set new receivableFactoringPoolImpl Address", async function () { + const NewImpl = await ethers.getContractFactory("ReceivableFactoringPool"); + newReceivableFactoringPoolImpl = await NewImpl.deploy(); + await poolFactory.connect( + protocolOwner + ).setReceivableFactoringPoolImplAddress( + newReceivableFactoringPoolImpl.address + ); + await expect( + await poolFactory.receivableFactoringPoolImplAddress() + ).to.equal( + newReceivableFactoringPoolImpl.address + ); + }); + it("Other accounts cannot set new BaseCredtiPoreceivableFactoringPoolImplolImpl", async function () { + const NewImpl = await ethers.getContractFactory("ReceivableFactoringPool"); + newImpl = await NewImpl.deploy(); + await expect( + poolFactory.setHDTImplAddress(newImpl.address) + ).to.be.revertedWith("Ownable: caller is not the owner"); + }); + }); + describe("Creating pools", function () { + it("Non-deployer cannot create pools", async function () { + console.log(await poolFactory.baseCreditPoolImplAddress()); + await expect( + poolFactory.connect(protocolOwner).createBaseCreditPool( + 'Testing pool', + [poolOwner.address], + [poolOwner.address], + )).to.be.revertedWith(/AccessControl: account .* is missing role .*/); + }); + it("Deployer creates base credit pool", async function () { + const tnx = await poolFactory.createBaseCreditPool( + 'Testing pool', + [poolOwner.address], + [poolOwner.address], + ); + const receipt = await tnx.wait(); + const poolAddress = await receipt.events.pop().args[0]; + const poolRecord = await poolFactory.checkPool(poolAddress); + await expect( + poolRecord['poolName'] + ).to.equal( + 'Testing pool', + ); + await expect( + poolRecord['poolStatus'] + ).to.equal( + 0, + ); + }); + it("Deployer creates receivable pool", async function () { + const tnx = await poolFactory.createReceivableFactoringPool( + 'Testing pool 2', + [poolOwner.address], + [poolOwner.address], + ); + const receipt = await tnx.wait(); + const poolAddress = await receipt.events.pop().args[0]; + const poolRecord = await poolFactory.checkPool(poolAddress); + await expect( + poolRecord['poolName'] + ).to.equal( + 'Testing pool 2', + ); + await expect( + poolRecord['poolStatus'] + ).to.equal( + 0, + ); + }); + }); +}); From 33551b21a6a020b8bc8a591eca003f02ae417156 Mon Sep 17 00:00:00 2001 From: PlayJoker Date: Mon, 31 Jul 2023 16:09:43 -0700 Subject: [PATCH 10/29] added initialization in the factory --- contracts/factory/LibFeeManager.sol | 27 +++++- contracts/factory/LibHDT.sol | 31 ++++++ contracts/factory/LibPool.sol | 29 ++++++ contracts/factory/LibPoolConfig.sol | 51 +++++++++- contracts/factory/PoolFactory.sol | 144 ++++++++++++++++++++-------- test/factoryTest.js | 68 +++++++++++-- 6 files changed, 304 insertions(+), 46 deletions(-) create mode 100644 contracts/factory/LibHDT.sol create mode 100644 contracts/factory/LibPool.sol diff --git a/contracts/factory/LibFeeManager.sol b/contracts/factory/LibFeeManager.sol index 14b8b5a2..44b17d2f 100644 --- a/contracts/factory/LibFeeManager.sol +++ b/contracts/factory/LibFeeManager.sol @@ -3,9 +3,34 @@ pragma solidity ^0.8.0; import "../BaseFeeManager.sol"; -library LibDeployFeeManager { +library LibFeeManager { function addFeeManager() public returns (address) { BaseFeeManager feeManager = new BaseFeeManager(); return address(feeManager); } + + function initializeFeeManager( + address _feeManagerAddress, + uint256 _frontLoadingFeeFlat, + uint256 _frontLoadingFeeBps, + uint256 _lateFeeFlat, + uint256 _lateFeeBps, + uint256 _membershipFee, + uint256 _minPrincipalRateInBps + ) public { + BaseFeeManager feeManager = BaseFeeManager(_feeManagerAddress); + feeManager.setFees( + _frontLoadingFeeFlat, + _frontLoadingFeeBps, + _lateFeeFlat, + _lateFeeBps, + _membershipFee + ); + feeManager.setMinPrincipalRateInBps(_minPrincipalRateInBps); + } + + function transferOwnership(address _feeManagerAddress, address newOwner) public { + BaseFeeManager feeManager = BaseFeeManager(_feeManagerAddress); + feeManager.transferOwnership(newOwner); + } } diff --git a/contracts/factory/LibHDT.sol b/contracts/factory/LibHDT.sol new file mode 100644 index 00000000..96b40ebe --- /dev/null +++ b/contracts/factory/LibHDT.sol @@ -0,0 +1,31 @@ +// SPDX-License-Identifier: AGPL-3.0-or-later +pragma solidity ^0.8.0; + +import "../HDT/HDT.sol"; +import "../openzeppelin/TransparentUpgradeableProxy.sol"; + +library LibHDT { + function addHDT(address _hdtImplAddress) public returns (address) { + TransparentUpgradeableProxy hdt = new TransparentUpgradeableProxy( + _hdtImplAddress, + msg.sender, //Todo: make this to be the real proxy admin + "" + ); + return address(hdt); + } + + function initializeHDT( + address _hdtAddress, + string memory name, + string memory symbol, + address underlyingToken + ) public { + HDT hdt = HDT(_hdtAddress); + hdt.initialize(name, symbol, underlyingToken); + } + + function transferOwnership(address _hdtAddress, address newOwner) public { + HDT hdt = HDT(_hdtAddress); + hdt.transferOwnership(newOwner); + } +} diff --git a/contracts/factory/LibPool.sol b/contracts/factory/LibPool.sol new file mode 100644 index 00000000..dbec1782 --- /dev/null +++ b/contracts/factory/LibPool.sol @@ -0,0 +1,29 @@ +// SPDX-License-Identifier: AGPL-3.0-or-later +pragma solidity ^0.8.0; + +import "../BaseCreditPool.sol"; +import "../ReceivableFactoringPool.sol"; +import "../openzeppelin/TransparentUpgradeableProxy.sol"; + +library LibPool { + function addPool(address _poolImplAddress) public returns (address) { + TransparentUpgradeableProxy pool = new TransparentUpgradeableProxy( + _poolImplAddress, + msg.sender, //Todo: make this to be the real proxy admin + "" + ); + return address(pool); + } + + function initializeBaseCreditPool(address _poolAddress, address _poolConfigAddress) public { + BaseCreditPool pool = BaseCreditPool(_poolAddress); + pool.initialize(_poolConfigAddress); + } + + function initializeReceivableFactoringPool(address _poolAddress, address _poolConfigAddress) + public + { + ReceivableFactoringPool pool = ReceivableFactoringPool(_poolAddress); + pool.initialize(_poolConfigAddress); + } +} diff --git a/contracts/factory/LibPoolConfig.sol b/contracts/factory/LibPoolConfig.sol index ea009603..e6f006b5 100644 --- a/contracts/factory/LibPoolConfig.sol +++ b/contracts/factory/LibPoolConfig.sol @@ -2,10 +2,59 @@ pragma solidity ^0.8.0; import "../BasePoolConfig.sol"; +import "hardhat/console.sol"; -library LibDeployPoolConfig { +library LibPoolConfig { function addPoolConfig() public returns (address) { BasePoolConfig poolConfig = new BasePoolConfig(); return address(poolConfig); } + + function initializePoolBasicConfig( + address _poolConfigAddress, + string memory _poolName, + address _poolAddress, + address _hdtAddress, + address _humaConfigAddress, + address _feeManagerAddress, + address _poolOwnerTreasury, + uint256 _poolPayPeriod, + uint256 withdrawalLockoutPeriod + ) public { + BasePoolConfig poolConfig = BasePoolConfig(_poolConfigAddress); + console.log("test"); + poolConfig.initialize(_poolName, _hdtAddress, _humaConfigAddress, _feeManagerAddress); + console.log("test2"); + poolConfig.setPool(_poolAddress); + poolConfig.setPoolToken(_hdtAddress); + poolConfig.setPoolOwnerTreasury(_poolOwnerTreasury); + poolConfig.setPoolPayPeriod(_poolPayPeriod); + poolConfig.setWithdrawalLockoutPeriod(withdrawalLockoutPeriod); + } + + function initializePoolLiquidityConfig( + address _poolConfigAddress, + uint256 liquidityCap, + uint256 poolOwnerRewards, + uint256 poolOwnerLiquidity, + uint256 EARewards, + uint256 EALiquidity, + uint256 maxCreditLine, + uint256 _apr, + uint256 receivableRequiredInBps + ) public { + BasePoolConfig poolConfig = BasePoolConfig(_poolConfigAddress); + + poolConfig.setPoolLiquidityCap(liquidityCap); + poolConfig.setPoolOwnerRewardsAndLiquidity(poolOwnerRewards, poolOwnerLiquidity); + poolConfig.setEARewardsAndLiquidity(EARewards, EALiquidity); + poolConfig.setMaxCreditLine(maxCreditLine); + poolConfig.setAPR(_apr); + poolConfig.setReceivableRequiredInBps(receivableRequiredInBps); + } + + function transferOwnership(address _poolConfigAddress, address newOwner) public { + BasePoolConfig poolConfig = BasePoolConfig(_poolConfigAddress); + poolConfig.transferOwnership(newOwner); + } } diff --git a/contracts/factory/PoolFactory.sol b/contracts/factory/PoolFactory.sol index 92525ec2..a7259cb2 100644 --- a/contracts/factory/PoolFactory.sol +++ b/contracts/factory/PoolFactory.sol @@ -6,10 +6,10 @@ import "@openzeppelin/contracts/governance/TimelockController.sol"; import "@openzeppelin/contracts/access/Ownable.sol"; import "@openzeppelin/contracts/proxy/transparent/TransparentUpgradeableProxy.sol"; -import "../openzeppelin/TransparentUpgradeableProxy.sol"; - import "./LibPoolConfig.sol"; import "./LibFeeManager.sol"; +import "./LibHDT.sol"; +import "./LibPool.sol"; contract PoolFactory is Ownable, AccessControl { bytes32 public constant DEPLOYER_ROLE = keccak256("DEPLOYER_ROLE"); @@ -71,20 +71,12 @@ contract PoolFactory is Ownable, AccessControl { address[] memory _poolOwner, address[] memory _poolExecutors ) external onlyRole(DEPLOYER_ROLE) { - address feeManagerAddress = LibDeployFeeManager.addFeeManager(); - TransparentUpgradeableProxy hdt = new TransparentUpgradeableProxy( - hdtImplAddress, - address(this), //Todo: for now proxy is not upgradable - "" - ); - address poolConfigAddress = LibDeployPoolConfig.addPoolConfig(); + address feeManagerAddress = LibFeeManager.addFeeManager(); + address hdt = LibHDT.addHDT(hdtImplAddress); + address poolConfigAddress = LibPoolConfig.addPoolConfig(); address timeLockAddress = addTimeLock(_poolOwner, _poolExecutors); - TransparentUpgradeableProxy pool = new TransparentUpgradeableProxy( - baseCreditPoolImplAddress, - address(this), //Todo: for now proxy is not upgradable - "" - ); - pools[address(pool)] = PoolRecord( + address pool = LibPool.addPool(baseCreditPoolImplAddress); + pools[pool] = PoolRecord( _poolName, PoolStatus.Created, timeLockAddress, @@ -92,7 +84,92 @@ contract PoolFactory is Ownable, AccessControl { feeManagerAddress, poolConfigAddress ); - emit PoolCreated(address(pool), _poolName); + emit PoolCreated(pool, _poolName); + } + + function initializePoolFeeManager( + address _poolAddress, + uint256 _frontLoadingFeeFlat, + uint256 _frontLoadingFeeBps, + uint256 _lateFeeFlat, + uint256 _lateFeeBps, + uint256 _membershipFee, + uint256 _minPrincipalRateInBps + ) external onlyRole(DEPLOYER_ROLE) { + LibFeeManager.initializeFeeManager( + pools[_poolAddress].feeManager, + _frontLoadingFeeFlat, + _frontLoadingFeeBps, + _lateFeeFlat, + _lateFeeBps, + _membershipFee, + _minPrincipalRateInBps + ); + LibFeeManager.transferOwnership( + pools[_poolAddress].feeManager, + pools[_poolAddress].poolTimeLock + ); + } + + function initializeHDT( + address _poolAddress, + string memory name, + string memory symbol, + address underlyingToken + ) external onlyRole(DEPLOYER_ROLE) { + LibHDT.initializeHDT(pools[_poolAddress].hdt, name, symbol, underlyingToken); + LibHDT.transferOwnership(pools[_poolAddress].hdt, pools[_poolAddress].poolTimeLock); + } + + function initializePoolConfigTwo( + address _poolAddress, + uint256 liquidityCap, + uint256 poolOwnerRewards, + uint256 poolOwnerLiquidity, + uint256 EARewards, + uint256 EALiquidity, + uint256 maxCreditLine, + uint256 _apr, + uint256 receivableRequiredInBps + ) external onlyRole(DEPLOYER_ROLE) { + LibPoolConfig.initializePoolLiquidityConfig( + pools[_poolAddress].poolConfig, + liquidityCap, + poolOwnerRewards, + poolOwnerLiquidity, + EARewards, + EALiquidity, + maxCreditLine, + _apr, + receivableRequiredInBps + ); + LibPoolConfig.transferOwnership( + pools[_poolAddress].poolConfig, + pools[_poolAddress].poolTimeLock + ); + } + + function initializePoolConfigOne( + address _poolAddress, + address _poolOwnerTreasury, + uint256 _poolPayPeriod, + uint256 withdrawalLockoutPeriod + ) external onlyRole(DEPLOYER_ROLE) { + LibPoolConfig.initializePoolBasicConfig( + pools[_poolAddress].poolConfig, + pools[_poolAddress].poolName, + _poolAddress, + pools[_poolAddress].hdt, + HUMA_CONFIG_ADDRESS, + pools[_poolAddress].feeManager, + _poolOwnerTreasury, + _poolPayPeriod, + withdrawalLockoutPeriod + ); + } + + function initializeBaseCreditPool(address _poolAddress) external onlyRole(DEPLOYER_ROLE) { + LibPool.initializeBaseCreditPool(_poolAddress, pools[_poolAddress].poolConfig); } function createReceivableFactoringPool( @@ -100,20 +177,12 @@ contract PoolFactory is Ownable, AccessControl { address[] memory _poolOwner, address[] memory _poolExecutors ) external onlyRole(DEPLOYER_ROLE) { - address feeManagerAddress = LibDeployFeeManager.addFeeManager(); - TransparentUpgradeableProxy hdt = new TransparentUpgradeableProxy( - hdtImplAddress, - address(this), //Todo: for now proxy is not upgradable - "" - ); - address poolConfigAddress = LibDeployPoolConfig.addPoolConfig(); + address feeManagerAddress = LibFeeManager.addFeeManager(); + address hdt = LibHDT.addHDT(hdtImplAddress); + address poolConfigAddress = LibPoolConfig.addPoolConfig(); address timeLockAddress = addTimeLock(_poolOwner, _poolExecutors); - TransparentUpgradeableProxy pool = new TransparentUpgradeableProxy( - receivableFactoringPoolImplAddress, - address(this), //Todo: for now proxy is not upgradable - "" - ); - pools[address(pool)] = PoolRecord( + address pool = LibPool.addPool(receivableFactoringPoolImplAddress); + pools[pool] = PoolRecord( _poolName, PoolStatus.Created, timeLockAddress, @@ -121,7 +190,14 @@ contract PoolFactory is Ownable, AccessControl { feeManagerAddress, poolConfigAddress ); - emit PoolCreated(address(pool), _poolName); + emit PoolCreated(pool, _poolName); + } + + function initializeReceivableFactoringPool(address _poolAddress) + external + onlyRole(DEPLOYER_ROLE) + { + LibPool.initializeReceivableFactoringPool(_poolAddress, pools[_poolAddress].poolConfig); } function setHDTImplAddress(address newAddress) external onlyOwner { @@ -170,12 +246,4 @@ contract PoolFactory is Ownable, AccessControl { TimelockController timeLock = new TimelockController(0, poolAdmins, poolExecutors); return address(timeLock); } - - // function initializeFeeManager() {} - - // function initializeHDT() {} - - // function initializePoolConfig() {} - - // function initializePool() {} } diff --git a/test/factoryTest.js b/test/factoryTest.js index 0022d166..3926709a 100644 --- a/test/factoryTest.js +++ b/test/factoryTest.js @@ -3,7 +3,7 @@ const {ethers} = require("hardhat"); const {expect} = require("chai"); describe("Huma Config", function () { - let baseCreditPoolImpl; + let poolAddress; before(async function () { [ deployer, @@ -20,11 +20,14 @@ describe("Huma Config", function () { const HumaConfig = await ethers.getContractFactory("HumaConfig"); configContract = await HumaConfig.deploy(); + // Deploy TestToken, give initial tokens to lender // console.log("deploying TestToken"); const TestToken = await ethers.getContractFactory("TestToken"); testTokenContract = await TestToken.deploy(); + await configContract.setLiquidityAsset(testTokenContract.address, true); + // console.log("deploying HDTImpl"); const HDTImpl = await ethers.getContractFactory("HDT"); hdtImpl = await HDTImpl.deploy(); @@ -38,17 +41,25 @@ describe("Huma Config", function () { receivableFactoringPoolImpl = await ReceivableFactoringPoolImpl.deploy(); // console.log("deploying LibFeeManager"); - const LibFeeManager = await ethers.getContractFactory("LibDeployFeeManager"); + const LibFeeManager = await ethers.getContractFactory("LibFeeManager"); libFeeManager = await LibFeeManager.deploy(); // console.log("deploying LibPoolConfig"); - const LibPoolConfig = await ethers.getContractFactory("LibDeployPoolConfig"); + const LibPoolConfig = await ethers.getContractFactory("LibPoolConfig"); libPoolConfig = await LibPoolConfig.deploy(); + const LibHDT = await ethers.getContractFactory("LibHDT"); + libHDT = await LibHDT.deploy(); + + const LibPool = await ethers.getContractFactory("LibPool"); + libPool = await LibPool.deploy(); + // console.log("deploying PoolFactory"); const PoolFactory = await ethers.getContractFactory("PoolFactory",{libraries: { - LibDeployFeeManager: libFeeManager.address, - LibDeployPoolConfig: libPoolConfig.address, + LibFeeManager: libFeeManager.address, + LibPoolConfig: libPoolConfig.address, + LibHDT: libHDT.address, + LibPool: libPool.address, },}); poolFactory = await PoolFactory.deploy( @@ -178,7 +189,7 @@ describe("Huma Config", function () { [poolOwner.address], ); const receipt = await tnx.wait(); - const poolAddress = await receipt.events.pop().args[0]; + poolAddress = await receipt.events.pop().args[0]; const poolRecord = await poolFactory.checkPool(poolAddress); await expect( poolRecord['poolName'] @@ -192,4 +203,49 @@ describe("Huma Config", function () { ); }); }); + describe("Initialize pools", function () { + it("Initialize Fee Manager", async function () { + await poolFactory.initializePoolFeeManager( + poolAddress, + 0, + 0, + 0, + 0, + 0, + 0, + ); + }); + it("Initialize HDT", async function () { + await poolFactory.initializeHDT( + poolAddress, + "Test HDT", + "THDT", + testTokenContract.address + ); + }); + it("Initialize Pool Config", async function () { + await poolFactory.initializePoolConfigOne( + poolAddress, + poolOwner.address, + 30, + 30 + ); + await poolFactory.initializePoolConfigTwo( + poolAddress, + 1_000_000_000_000, + 0, + 0, + 0, + 0, + 1000_000_000, + 1000, + 0 + ); + }); + it("Initialize Pool", async function () { + await poolFactory.initializeReceivableFactoringPool( + poolAddress + ); + }); + }); }); From 28bb714e7d428298e81d1e41f3bce372a1dd4830 Mon Sep 17 00:00:00 2001 From: PlayJoker Date: Mon, 31 Jul 2023 16:26:48 -0700 Subject: [PATCH 11/29] removed ownable and using accessControl for ownership --- contracts/factory/PoolFactory.sol | 21 +++++++++++++-------- test/factoryTest.js | 22 +++++++++------------- 2 files changed, 22 insertions(+), 21 deletions(-) diff --git a/contracts/factory/PoolFactory.sol b/contracts/factory/PoolFactory.sol index a7259cb2..93dbe89a 100644 --- a/contracts/factory/PoolFactory.sol +++ b/contracts/factory/PoolFactory.sol @@ -3,7 +3,6 @@ pragma solidity ^0.8.0; import "@openzeppelin/contracts/access/AccessControl.sol"; import "@openzeppelin/contracts/governance/TimelockController.sol"; -import "@openzeppelin/contracts/access/Ownable.sol"; import "@openzeppelin/contracts/proxy/transparent/TransparentUpgradeableProxy.sol"; import "./LibPoolConfig.sol"; @@ -11,8 +10,9 @@ import "./LibFeeManager.sol"; import "./LibHDT.sol"; import "./LibPool.sol"; -contract PoolFactory is Ownable, AccessControl { +contract PoolFactory is AccessControl { bytes32 public constant DEPLOYER_ROLE = keccak256("DEPLOYER_ROLE"); + bytes32 public constant OWNER_ROLE = keccak256("OWNER_ROLE"); address public HUMA_CONFIG_ADDRESS; address public hdtImplAddress; @@ -47,22 +47,24 @@ contract PoolFactory is Ownable, AccessControl { event PoolCreated(address poolAddress, string poolName); constructor( + address _protocolOwner, address _humaConfigAddress, address _hdtImplAddress, address _baseCreditPoolImplAddress, address _receivableFactoringPoolImplAddress ) { + _grantRole(OWNER_ROLE, _protocolOwner); HUMA_CONFIG_ADDRESS = _humaConfigAddress; hdtImplAddress = _hdtImplAddress; baseCreditPoolImplAddress = _baseCreditPoolImplAddress; receivableFactoringPoolImplAddress = _receivableFactoringPoolImplAddress; } - function addDeployer(address account) external onlyOwner { + function addDeployer(address account) external onlyRole(OWNER_ROLE) { _grantRole(DEPLOYER_ROLE, account); } - function removeDeployer(address account) external onlyOwner { + function removeDeployer(address account) external onlyRole(OWNER_ROLE) { _revokeRole(DEPLOYER_ROLE, account); } @@ -200,19 +202,22 @@ contract PoolFactory is Ownable, AccessControl { LibPool.initializeReceivableFactoringPool(_poolAddress, pools[_poolAddress].poolConfig); } - function setHDTImplAddress(address newAddress) external onlyOwner { + function setHDTImplAddress(address newAddress) external onlyRole(OWNER_ROLE) { address oldAddress = hdtImplAddress; hdtImplAddress = newAddress; emit HDTImplChanged(oldAddress, newAddress); } - function setBaseCredtiPoolImplAddress(address newAddress) external onlyOwner { + function setBaseCredtiPoolImplAddress(address newAddress) external onlyRole(OWNER_ROLE) { address oldAddress = hdtImplAddress; baseCreditPoolImplAddress = newAddress; emit BaseCredtiPoolImplChanged(oldAddress, newAddress); } - function setReceivableFactoringPoolImplAddress(address newAddress) external onlyOwner { + function setReceivableFactoringPoolImplAddress(address newAddress) + external + onlyRole(OWNER_ROLE) + { address oldAddress = hdtImplAddress; receivableFactoringPoolImplAddress = newAddress; emit ReceivableFactoringPoolImplChanged(oldAddress, newAddress); @@ -225,7 +230,7 @@ contract PoolFactory is Ownable, AccessControl { return pools[_poolAddress]; } - function deletePool(address _poolAddress) external onlyOwner { + function deletePool(address _poolAddress) external onlyRole(OWNER_ROLE) { if ( pools[_poolAddress].poolStatus != PoolStatus.Created || pools[_poolAddress].poolStatus != PoolStatus.Initialized diff --git a/test/factoryTest.js b/test/factoryTest.js index 3926709a..44b81ed7 100644 --- a/test/factoryTest.js +++ b/test/factoryTest.js @@ -63,20 +63,16 @@ describe("Huma Config", function () { },}); poolFactory = await PoolFactory.deploy( - configContract.address, hdtImpl.address, + protocolOwner.address, configContract.address, hdtImpl.address, baseCreditPoolImpl.address, receivableFactoringPoolImpl.address ); - console.log("Protocol contracts all deployed"); - console.log(baseCreditPoolImpl.address); - console.log(receivableFactoringPoolImpl.address); - console.log(configContract.address); - console.log(hdtImpl.address); }); describe("Factory Ownership", function () { it("Protocol owner should own the factory", async function () { - await poolFactory.transferOwnership(protocolOwner.address); - await expect(await poolFactory.owner()).to.equal(protocolOwner.address); + // await poolFactory.transferOwnership(protocolOwner.address); + const role = await poolFactory.OWNER_ROLE(); + await expect(await poolFactory.hasRole(role, protocolOwner.address)).to.equal(true); }); }); @@ -94,10 +90,10 @@ describe("Huma Config", function () { const role = await poolFactory.DEPLOYER_ROLE(); await expect( poolFactory.addDeployer(deployer.address) - ).to.be.revertedWith("Ownable: caller is not the owner"); + ).to.be.revertedWith(/AccessControl: account .* is missing role .*/); await expect( poolFactory.removeDeployer(deployer.address) - ).to.be.revertedWith("Ownable: caller is not the owner"); + ).to.be.revertedWith(/AccessControl: account .* is missing role .*/); }); }); @@ -113,7 +109,7 @@ describe("Huma Config", function () { newhdtImpl = await newHDTImpl.deploy(); await expect( poolFactory.setHDTImplAddress(newhdtImpl.address) - ).to.be.revertedWith("Ownable: caller is not the owner"); + ).to.be.revertedWith(/AccessControl: account .* is missing role .*/); }); it("Owner can set new BaseCredtiPoolImpl Address", async function () { const NewImpl = await ethers.getContractFactory("BaseCreditPool"); @@ -127,7 +123,7 @@ describe("Huma Config", function () { newImpl = await NewImpl.deploy(); await expect( poolFactory.setHDTImplAddress(newImpl.address) - ).to.be.revertedWith("Ownable: caller is not the owner"); + ).to.be.revertedWith(/AccessControl: account .* is missing role .*/); console.log(await poolFactory.baseCreditPoolImplAddress()); }); it("Owner can set new receivableFactoringPoolImpl Address", async function () { @@ -149,7 +145,7 @@ describe("Huma Config", function () { newImpl = await NewImpl.deploy(); await expect( poolFactory.setHDTImplAddress(newImpl.address) - ).to.be.revertedWith("Ownable: caller is not the owner"); + ).to.be.revertedWith(/AccessControl: account .* is missing role .*/); }); }); describe("Creating pools", function () { From 4bd427746d3bb54a4f92afca99dc5e42ae77866d Mon Sep 17 00:00:00 2001 From: PlayJoker Date: Mon, 31 Jul 2023 16:32:40 -0700 Subject: [PATCH 12/29] added transferOwnership for the factory --- contracts/factory/PoolFactory.sol | 5 +++++ test/factoryTest.js | 4 ++-- 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/contracts/factory/PoolFactory.sol b/contracts/factory/PoolFactory.sol index 93dbe89a..08f4914d 100644 --- a/contracts/factory/PoolFactory.sol +++ b/contracts/factory/PoolFactory.sol @@ -251,4 +251,9 @@ contract PoolFactory is AccessControl { TimelockController timeLock = new TimelockController(0, poolAdmins, poolExecutors); return address(timeLock); } + + function transferOwnership(address newOwner) external onlyRole(OWNER_ROLE) { + _grantRole(OWNER_ROLE, newOwner); + _revokeRole(OWNER_ROLE, msg.sender); + } } diff --git a/test/factoryTest.js b/test/factoryTest.js index 44b81ed7..f3dd6e97 100644 --- a/test/factoryTest.js +++ b/test/factoryTest.js @@ -63,14 +63,14 @@ describe("Huma Config", function () { },}); poolFactory = await PoolFactory.deploy( - protocolOwner.address, configContract.address, hdtImpl.address, + deployer.address, configContract.address, hdtImpl.address, baseCreditPoolImpl.address, receivableFactoringPoolImpl.address ); }); describe("Factory Ownership", function () { it("Protocol owner should own the factory", async function () { - // await poolFactory.transferOwnership(protocolOwner.address); + await poolFactory.transferOwnership(protocolOwner.address); const role = await poolFactory.OWNER_ROLE(); await expect(await poolFactory.hasRole(role, protocolOwner.address)).to.equal(true); }); From 1b56d3b5f0d6bd09349d09ba382c415c2a955fe3 Mon Sep 17 00:00:00 2001 From: PlayJoker Date: Tue, 1 Aug 2023 11:34:14 -0700 Subject: [PATCH 13/29] added more admin functions --- contracts/factory/PoolFactory.sol | 54 ++++++++++++++++++++++++++++--- test/factoryTest.js | 1 + 2 files changed, 50 insertions(+), 5 deletions(-) diff --git a/contracts/factory/PoolFactory.sol b/contracts/factory/PoolFactory.sol index 08f4914d..47c1c6d9 100644 --- a/contracts/factory/PoolFactory.sol +++ b/contracts/factory/PoolFactory.sol @@ -14,7 +14,7 @@ contract PoolFactory is AccessControl { bytes32 public constant DEPLOYER_ROLE = keccak256("DEPLOYER_ROLE"); bytes32 public constant OWNER_ROLE = keccak256("OWNER_ROLE"); - address public HUMA_CONFIG_ADDRESS; + address public immutable HUMA_CONFIG_ADDRESS; address public hdtImplAddress; address public baseCreditPoolImplAddress; address public receivableFactoringPoolImplAddress; @@ -45,6 +45,8 @@ contract PoolFactory is AccessControl { event DeployerRemoved(address deployerAddress); event PoolCreated(address poolAddress, string poolName); + event PoolAdded(address poolAddress, string poolName); + event OwnershipChanged(address oldOwner, address newOwner); constructor( address _protocolOwner, @@ -62,10 +64,12 @@ contract PoolFactory is AccessControl { function addDeployer(address account) external onlyRole(OWNER_ROLE) { _grantRole(DEPLOYER_ROLE, account); + emit DeployerAdded(account); } function removeDeployer(address account) external onlyRole(OWNER_ROLE) { _revokeRole(DEPLOYER_ROLE, account); + emit DeployerRemoved(account); } function createBaseCreditPool( @@ -78,15 +82,23 @@ contract PoolFactory is AccessControl { address poolConfigAddress = LibPoolConfig.addPoolConfig(); address timeLockAddress = addTimeLock(_poolOwner, _poolExecutors); address pool = LibPool.addPool(baseCreditPoolImplAddress); - pools[pool] = PoolRecord( + emit PoolCreated(pool, _poolName); + _addExistingPool( + pool, _poolName, - PoolStatus.Created, timeLockAddress, - address(hdt), + hdt, feeManagerAddress, poolConfigAddress ); - emit PoolCreated(pool, _poolName); + // pools[pool] = PoolRecord( + // _poolName, + // PoolStatus.Created, + // timeLockAddress, + // address(hdt), + // feeManagerAddress, + // poolConfigAddress + // ); } function initializePoolFeeManager( @@ -230,6 +242,36 @@ contract PoolFactory is AccessControl { return pools[_poolAddress]; } + function _addExistingPool( + address _poolAddress, + string memory _poolName, + address _poolTimeLock, + address _hdt, + address _feeManager, + address _poolConfig + ) private { + pools[_poolAddress] = PoolRecord( + _poolName, + PoolStatus.Created, + _poolTimeLock, + _hdt, + _feeManager, + _poolConfig + ); + emit PoolAdded(_poolAddress, _poolName); + } + + function addExistingPool( + address _poolAddress, + string memory _poolName, + address _poolTimeLock, + address _hdt, + address _feeManager, + address _poolConfig + ) external onlyRole(OWNER_ROLE) { + _addExistingPool(_poolAddress, _poolName, _poolTimeLock, _hdt, _feeManager, _poolConfig); + } + function deletePool(address _poolAddress) external onlyRole(OWNER_ROLE) { if ( pools[_poolAddress].poolStatus != PoolStatus.Created || @@ -242,6 +284,8 @@ contract PoolFactory is AccessControl { emit PoolDeleted(_poolAddress); } + function updatePoolStatus(address _poolAddress) external onlyRole(DEPLOYER_ROLE) {} + function addTimeLock(address[] memory poolAdmins, address[] memory poolExecutors) internal // only one account can be pool admin diff --git a/test/factoryTest.js b/test/factoryTest.js index f3dd6e97..7d1995b3 100644 --- a/test/factoryTest.js +++ b/test/factoryTest.js @@ -73,6 +73,7 @@ describe("Huma Config", function () { await poolFactory.transferOwnership(protocolOwner.address); const role = await poolFactory.OWNER_ROLE(); await expect(await poolFactory.hasRole(role, protocolOwner.address)).to.equal(true); + await expect(await poolFactory.hasRole(role, deployer.address)).to.equal(false); }); }); From 8da37693e63fe4046b9667ef0a1055ef62b1abe5 Mon Sep 17 00:00:00 2001 From: PlayJoker Date: Thu, 3 Aug 2023 23:29:24 -0700 Subject: [PATCH 14/29] added update pool status --- contracts/factory/LibFeeManager.sol | 5 +++++ contracts/factory/LibHDT.sol | 5 +++++ contracts/factory/LibPoolConfig.sol | 5 +++++ contracts/factory/PoolFactory.sol | 19 ++++++++++++++++++- test/factoryTest.js | 6 ++++++ 5 files changed, 39 insertions(+), 1 deletion(-) diff --git a/contracts/factory/LibFeeManager.sol b/contracts/factory/LibFeeManager.sol index 44b17d2f..a234a51b 100644 --- a/contracts/factory/LibFeeManager.sol +++ b/contracts/factory/LibFeeManager.sol @@ -33,4 +33,9 @@ library LibFeeManager { BaseFeeManager feeManager = BaseFeeManager(_feeManagerAddress); feeManager.transferOwnership(newOwner); } + + function owner(address _feeManagerAddress) public view returns (address) { + BaseFeeManager feeManager = BaseFeeManager(_feeManagerAddress); + return feeManager.owner(); + } } diff --git a/contracts/factory/LibHDT.sol b/contracts/factory/LibHDT.sol index 96b40ebe..09e2c154 100644 --- a/contracts/factory/LibHDT.sol +++ b/contracts/factory/LibHDT.sol @@ -28,4 +28,9 @@ library LibHDT { HDT hdt = HDT(_hdtAddress); hdt.transferOwnership(newOwner); } + + function owner(address _hdtAddress) public view returns (address) { + HDT hdt = HDT(_hdtAddress); + return hdt.owner(); + } } diff --git a/contracts/factory/LibPoolConfig.sol b/contracts/factory/LibPoolConfig.sol index e6f006b5..79ad48f6 100644 --- a/contracts/factory/LibPoolConfig.sol +++ b/contracts/factory/LibPoolConfig.sol @@ -57,4 +57,9 @@ library LibPoolConfig { BasePoolConfig poolConfig = BasePoolConfig(_poolConfigAddress); poolConfig.transferOwnership(newOwner); } + + function owner(address _poolConfigAddress) public view returns (address) { + BasePoolConfig poolConfig = BasePoolConfig(_poolConfigAddress); + return poolConfig.owner(); + } } diff --git a/contracts/factory/PoolFactory.sol b/contracts/factory/PoolFactory.sol index 47c1c6d9..b7f48fff 100644 --- a/contracts/factory/PoolFactory.sol +++ b/contracts/factory/PoolFactory.sol @@ -48,6 +48,8 @@ contract PoolFactory is AccessControl { event PoolAdded(address poolAddress, string poolName); event OwnershipChanged(address oldOwner, address newOwner); + event PoolStatusUpdated(PoolStatus oldStatus, PoolStatus newStatus); + constructor( address _protocolOwner, address _humaConfigAddress, @@ -284,7 +286,21 @@ contract PoolFactory is AccessControl { emit PoolDeleted(_poolAddress); } - function updatePoolStatus(address _poolAddress) external onlyRole(DEPLOYER_ROLE) {} + function updatePoolStatus(address _poolAddress) external onlyRole(DEPLOYER_ROLE) { + address poolTimeLock = pools[_poolAddress].poolTimeLock; + if (LibFeeManager.owner(pools[_poolAddress].feeManager) != poolTimeLock) { + revert("FEE_MANAGER_NOT_INITIALIZED"); + } + if (LibHDT.owner(pools[_poolAddress].hdt) != poolTimeLock) { + revert("HDT_NOT_INITIALIZED"); + } + if (LibPoolConfig.owner(pools[_poolAddress].poolConfig) != poolTimeLock) { + revert("POOL_CONFIG_NOT_INITIALIZED"); + } + PoolStatus oldStatus = pools[_poolAddress].poolStatus; + pools[_poolAddress].poolStatus = PoolStatus.Initialized; + emit PoolStatusUpdated(oldStatus, PoolStatus.Initialized); + } function addTimeLock(address[] memory poolAdmins, address[] memory poolExecutors) internal @@ -299,5 +315,6 @@ contract PoolFactory is AccessControl { function transferOwnership(address newOwner) external onlyRole(OWNER_ROLE) { _grantRole(OWNER_ROLE, newOwner); _revokeRole(OWNER_ROLE, msg.sender); + emit OwnershipChanged(msg.sender, newOwner); } } diff --git a/test/factoryTest.js b/test/factoryTest.js index 7d1995b3..09804ec2 100644 --- a/test/factoryTest.js +++ b/test/factoryTest.js @@ -245,4 +245,10 @@ describe("Huma Config", function () { ); }); }); + describe("Updating pool status", function () { + it("Pool should be initialized", async function () { + await poolFactory.updatePoolStatus(poolAddress); + console.log(await poolFactory.checkPool(poolAddress)); + }); + }); }); From 23d5085554589ab55284076d1df87675ba63ac37 Mon Sep 17 00:00:00 2001 From: PlayJoker Date: Wed, 9 Aug 2023 16:28:52 -0700 Subject: [PATCH 15/29] fixed a pool status buig --- contracts/factory/LibPool.sol | 15 ++++++--------- contracts/factory/PoolFactory.sol | 14 +++++--------- test/factoryTest.js | 2 +- yarn.lock | 8 ++++---- 4 files changed, 16 insertions(+), 23 deletions(-) diff --git a/contracts/factory/LibPool.sol b/contracts/factory/LibPool.sol index dbec1782..a1fd4aa2 100644 --- a/contracts/factory/LibPool.sol +++ b/contracts/factory/LibPool.sol @@ -1,8 +1,7 @@ // SPDX-License-Identifier: AGPL-3.0-or-later pragma solidity ^0.8.0; -import "../BaseCreditPool.sol"; -import "../ReceivableFactoringPool.sol"; +import "../BasePool.sol"; import "../openzeppelin/TransparentUpgradeableProxy.sol"; library LibPool { @@ -15,15 +14,13 @@ library LibPool { return address(pool); } - function initializeBaseCreditPool(address _poolAddress, address _poolConfigAddress) public { - BaseCreditPool pool = BaseCreditPool(_poolAddress); + function initializePool(address _poolAddress, address _poolConfigAddress) public { + BasePool pool = BasePool(_poolAddress); pool.initialize(_poolConfigAddress); } - function initializeReceivableFactoringPool(address _poolAddress, address _poolConfigAddress) - public - { - ReceivableFactoringPool pool = ReceivableFactoringPool(_poolAddress); - pool.initialize(_poolConfigAddress); + function initialized(address _poolAddress) public returns (bool) { + BasePool pool = BasePool(_poolAddress); + return pool.poolConfig() != address(0); } } diff --git a/contracts/factory/PoolFactory.sol b/contracts/factory/PoolFactory.sol index b7f48fff..c17bf110 100644 --- a/contracts/factory/PoolFactory.sol +++ b/contracts/factory/PoolFactory.sol @@ -184,8 +184,8 @@ contract PoolFactory is AccessControl { ); } - function initializeBaseCreditPool(address _poolAddress) external onlyRole(DEPLOYER_ROLE) { - LibPool.initializeBaseCreditPool(_poolAddress, pools[_poolAddress].poolConfig); + function initializePool(address _poolAddress) external onlyRole(DEPLOYER_ROLE) { + LibPool.initializePool(_poolAddress, pools[_poolAddress].poolConfig); } function createReceivableFactoringPool( @@ -209,13 +209,6 @@ contract PoolFactory is AccessControl { emit PoolCreated(pool, _poolName); } - function initializeReceivableFactoringPool(address _poolAddress) - external - onlyRole(DEPLOYER_ROLE) - { - LibPool.initializeReceivableFactoringPool(_poolAddress, pools[_poolAddress].poolConfig); - } - function setHDTImplAddress(address newAddress) external onlyRole(OWNER_ROLE) { address oldAddress = hdtImplAddress; hdtImplAddress = newAddress; @@ -297,6 +290,9 @@ contract PoolFactory is AccessControl { if (LibPoolConfig.owner(pools[_poolAddress].poolConfig) != poolTimeLock) { revert("POOL_CONFIG_NOT_INITIALIZED"); } + if (!LibPool.initialized(_poolAddress)) { + revert("POOL_NOT_INITIALIZED"); + } PoolStatus oldStatus = pools[_poolAddress].poolStatus; pools[_poolAddress].poolStatus = PoolStatus.Initialized; emit PoolStatusUpdated(oldStatus, PoolStatus.Initialized); diff --git a/test/factoryTest.js b/test/factoryTest.js index 09804ec2..062865d8 100644 --- a/test/factoryTest.js +++ b/test/factoryTest.js @@ -240,7 +240,7 @@ describe("Huma Config", function () { ); }); it("Initialize Pool", async function () { - await poolFactory.initializeReceivableFactoringPool( + await poolFactory.initializePool( poolAddress ); }); diff --git a/yarn.lock b/yarn.lock index 6c394df3..833e9b7b 100644 --- a/yarn.lock +++ b/yarn.lock @@ -5386,10 +5386,10 @@ unbox-primitive@^1.0.2: has-symbols "^1.0.3" which-boxed-primitive "^1.0.2" -undici@^5.14.0: - version "5.22.1" - resolved "https://registry.yarnpkg.com/undici/-/undici-5.22.1.tgz#877d512effef2ac8be65e695f3586922e1a57d7b" - integrity sha512-Ji2IJhFXZY0x/0tVBXeQwgPlLWw13GVzpsWPQ3rV50IFMMof2I55PZZxtm4P6iNq+L5znYN9nSTAq0ZyE6lSJw== +undici@^5.14.0, undici@^5.22.1: + version "5.23.0" + resolved "https://registry.yarnpkg.com/undici/-/undici-5.23.0.tgz#e7bdb0ed42cebe7b7aca87ced53e6eaafb8f8ca0" + integrity sha512-1D7w+fvRsqlQ9GscLBwcAJinqcZGHUKjbOmXdlE/v8BvEGXjeWAax+341q44EuTcHXXnfyKNbKRq4Lg7OzhMmg== dependencies: busboy "^1.6.0" From bdbcbf5046756539ff8ad5492695ce7148a6caad Mon Sep 17 00:00:00 2001 From: PlayJok3r Date: Wed, 23 Aug 2023 15:57:39 -0700 Subject: [PATCH 16/29] contract factory updates (#321) * deployed arf pool on polygon * clean up accounts for celo testnetwork * fix errors * alfajores dependency updates & removed console imports * Contract factory (#320) * fix alerts from Dependabot (#318) Co-authored-by: shan * added contract factory for deployment * added initialization in the factory * removed ownable and using accessControl for ownership * added transferOwnership for the factory * added more admin functions * added update pool status --------- Co-authored-by: shan-57blocks <115970472+shan-57blocks@users.noreply.github.com> Co-authored-by: shan * verify all contracts * fixing bugs * updated test file for factory * network config update * deployed contract factory to celo mainnet --------- Co-authored-by: shan-57blocks <115970472+shan-57blocks@users.noreply.github.com> Co-authored-by: shan --- abi/LibFeeManager.json | 21 + abi/LibHDT.json | 21 + abi/LibPool.json | 21 + abi/LibPoolConfig.json | 21 + abi/PoolFactory.json | 896 ++++++++ contracts/BaseCreditPool.sol | 2 +- contracts/BaseFeeManager.sol | 2 +- contracts/BasePool.sol | 2 +- contracts/BasePoolConfig.sol | 2 +- contracts/HumaConfig.sol | 2 +- contracts/factory/LibHDT.sol | 4 +- contracts/factory/LibPool.sol | 2 +- contracts/factory/LibPoolConfig.sol | 8 +- contracts/factory/PoolFactory.sol | 8 +- contracts/libraries/BaseStructs.sol | 2 +- contracts/receivables/RealWorldReceivable.sol | 2 +- deployment/alfajores-deployed-contracts.json | 23 + .../alfajores-initialized-contracts.json | 6 + deployment/alfajores-verified-contracts.json | 19 + deployment/alfajores/deploy-jia-pool.js | 76 + .../alfajores/init-jia-pool-defender.js | 384 ++++ deployment/alfajores/verify-jia-pool.js | 204 ++ deployment/celo-deployed-contracts.json | 14 + deployment/celo-initialized-contracts.json | 2 + deployment/celo-verified-contracts.json | 13 + deployment/celo/deploy-protocol-factory.js | 72 + deployment/celo/init-protocol-factory.js | 384 ++++ deployment/celo/verify-protocol-factory.js | 206 ++ deployment/goerli-deployed-contracts.json | 80 +- deployment/goerli-initialized-contracts.json | 5 +- deployment/goerli-verified-contracts.json | 2 +- deployment/matic-deployed-contracts.json | 10 +- deployment/matic-initialized-contracts.json | 7 +- deployment/matic-verified-contracts.json | 10 +- deployment/sepolia/deploy-arf-pool.js | 10 +- deployment/sepolia/init-arf-pool-defender.js | 46 +- deployment/sepolia/verify-arf-pool.js | 14 +- deployment/utils.js | 15 +- hardhat.config.js | 23 +- package.json | 73 +- test/factoryTest.js | 15 +- yarn.lock | 1810 ++++++++--------- 42 files changed, 3382 insertions(+), 1157 deletions(-) create mode 100644 abi/LibFeeManager.json create mode 100644 abi/LibHDT.json create mode 100644 abi/LibPool.json create mode 100644 abi/LibPoolConfig.json create mode 100644 abi/PoolFactory.json create mode 100644 deployment/alfajores-deployed-contracts.json create mode 100644 deployment/alfajores-initialized-contracts.json create mode 100644 deployment/alfajores-verified-contracts.json create mode 100644 deployment/alfajores/deploy-jia-pool.js create mode 100644 deployment/alfajores/init-jia-pool-defender.js create mode 100644 deployment/alfajores/verify-jia-pool.js create mode 100644 deployment/celo-deployed-contracts.json create mode 100644 deployment/celo-initialized-contracts.json create mode 100644 deployment/celo-verified-contracts.json create mode 100644 deployment/celo/deploy-protocol-factory.js create mode 100644 deployment/celo/init-protocol-factory.js create mode 100644 deployment/celo/verify-protocol-factory.js diff --git a/abi/LibFeeManager.json b/abi/LibFeeManager.json new file mode 100644 index 00000000..af6d24fe --- /dev/null +++ b/abi/LibFeeManager.json @@ -0,0 +1,21 @@ +[ + { + "inputs": [ + { + "internalType": "address", + "name": "_feeManagerAddress", + "type": "address" + } + ], + "name": "owner", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + } +] diff --git a/abi/LibHDT.json b/abi/LibHDT.json new file mode 100644 index 00000000..ae62ffab --- /dev/null +++ b/abi/LibHDT.json @@ -0,0 +1,21 @@ +[ + { + "inputs": [ + { + "internalType": "address", + "name": "_hdtAddress", + "type": "address" + } + ], + "name": "owner", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + } +] diff --git a/abi/LibPool.json b/abi/LibPool.json new file mode 100644 index 00000000..cee638ab --- /dev/null +++ b/abi/LibPool.json @@ -0,0 +1,21 @@ +[ + { + "inputs": [ + { + "internalType": "address", + "name": "_poolAddress", + "type": "address" + } + ], + "name": "initialized", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + } +] diff --git a/abi/LibPoolConfig.json b/abi/LibPoolConfig.json new file mode 100644 index 00000000..61ea58e4 --- /dev/null +++ b/abi/LibPoolConfig.json @@ -0,0 +1,21 @@ +[ + { + "inputs": [ + { + "internalType": "address", + "name": "_poolConfigAddress", + "type": "address" + } + ], + "name": "owner", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + } +] diff --git a/abi/PoolFactory.json b/abi/PoolFactory.json new file mode 100644 index 00000000..058acc67 --- /dev/null +++ b/abi/PoolFactory.json @@ -0,0 +1,896 @@ +[ + { + "inputs": [ + { + "internalType": "address", + "name": "_protocolOwner", + "type": "address" + }, + { + "internalType": "address", + "name": "_humaConfigAddress", + "type": "address" + }, + { + "internalType": "address", + "name": "_hdtImplAddress", + "type": "address" + }, + { + "internalType": "address", + "name": "_baseCreditPoolImplAddress", + "type": "address" + }, + { + "internalType": "address", + "name": "_receivableFactoringPoolImplAddress", + "type": "address" + } + ], + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "address", + "name": "oldAddress", + "type": "address" + }, + { + "indexed": false, + "internalType": "address", + "name": "newAddress", + "type": "address" + } + ], + "name": "BaseCredtiPoolImplChanged", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "address", + "name": "deployerAddress", + "type": "address" + } + ], + "name": "DeployerAdded", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "address", + "name": "deployerAddress", + "type": "address" + } + ], + "name": "DeployerRemoved", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "address", + "name": "oldAddress", + "type": "address" + }, + { + "indexed": false, + "internalType": "address", + "name": "newAddress", + "type": "address" + } + ], + "name": "HDTImplChanged", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "address", + "name": "oldOwner", + "type": "address" + }, + { + "indexed": false, + "internalType": "address", + "name": "newOwner", + "type": "address" + } + ], + "name": "OwnershipChanged", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "address", + "name": "poolAddress", + "type": "address" + }, + { + "indexed": false, + "internalType": "string", + "name": "poolName", + "type": "string" + } + ], + "name": "PoolAdded", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "address", + "name": "poolAddress", + "type": "address" + }, + { + "indexed": false, + "internalType": "string", + "name": "poolName", + "type": "string" + } + ], + "name": "PoolCreated", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "address", + "name": "poolAddress", + "type": "address" + } + ], + "name": "PoolDeleted", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "enum PoolFactory.PoolStatus", + "name": "oldStatus", + "type": "uint8" + }, + { + "indexed": false, + "internalType": "enum PoolFactory.PoolStatus", + "name": "newStatus", + "type": "uint8" + } + ], + "name": "PoolStatusUpdated", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "address", + "name": "oldAddress", + "type": "address" + }, + { + "indexed": false, + "internalType": "address", + "name": "newAddress", + "type": "address" + } + ], + "name": "ReceivableFactoringPoolImplChanged", + "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" + }, + { + "inputs": [], + "name": "DEFAULT_ADMIN_ROLE", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "DEPLOYER_ROLE", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "HUMA_CONFIG_ADDRESS", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "OWNER_ROLE", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "addDeployer", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_poolAddress", + "type": "address" + }, + { + "internalType": "string", + "name": "_poolName", + "type": "string" + }, + { + "internalType": "address", + "name": "_poolTimeLock", + "type": "address" + }, + { + "internalType": "address", + "name": "_hdt", + "type": "address" + }, + { + "internalType": "address", + "name": "_feeManager", + "type": "address" + }, + { + "internalType": "address", + "name": "_poolConfig", + "type": "address" + } + ], + "name": "addExistingPool", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "baseCreditPoolImplAddress", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_poolAddress", + "type": "address" + } + ], + "name": "checkPool", + "outputs": [ + { + "components": [ + { + "internalType": "string", + "name": "poolName", + "type": "string" + }, + { + "internalType": "enum PoolFactory.PoolStatus", + "name": "poolStatus", + "type": "uint8" + }, + { + "internalType": "address", + "name": "poolTimeLock", + "type": "address" + }, + { + "internalType": "address", + "name": "hdt", + "type": "address" + }, + { + "internalType": "address", + "name": "feeManager", + "type": "address" + }, + { + "internalType": "address", + "name": "poolConfig", + "type": "address" + } + ], + "internalType": "struct PoolFactory.PoolRecord", + "name": "", + "type": "tuple" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "string", + "name": "_poolName", + "type": "string" + }, + { + "internalType": "address[]", + "name": "_poolOwner", + "type": "address[]" + }, + { + "internalType": "address[]", + "name": "_poolExecutors", + "type": "address[]" + } + ], + "name": "createBaseCreditPool", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "string", + "name": "_poolName", + "type": "string" + }, + { + "internalType": "address[]", + "name": "_poolOwner", + "type": "address[]" + }, + { + "internalType": "address[]", + "name": "_poolExecutors", + "type": "address[]" + } + ], + "name": "createReceivableFactoringPool", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_poolAddress", + "type": "address" + } + ], + "name": "deletePool", + "outputs": [], + "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": [], + "name": "hdtImplAddress", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_poolAddress", + "type": "address" + }, + { + "internalType": "string", + "name": "name", + "type": "string" + }, + { + "internalType": "string", + "name": "symbol", + "type": "string" + }, + { + "internalType": "address", + "name": "underlyingToken", + "type": "address" + } + ], + "name": "initializeHDT", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_poolAddress", + "type": "address" + } + ], + "name": "initializePool", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_poolAddress", + "type": "address" + }, + { + "internalType": "address", + "name": "_poolOwnerTreasury", + "type": "address" + }, + { + "internalType": "uint256", + "name": "_poolPayPeriod", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "withdrawalLockoutPeriod", + "type": "uint256" + } + ], + "name": "initializePoolConfigOne", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_poolAddress", + "type": "address" + }, + { + "internalType": "uint256", + "name": "liquidityCap", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "poolOwnerRewards", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "poolOwnerLiquidity", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "EARewards", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "EALiquidity", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "maxCreditLine", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "_apr", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "receivableRequiredInBps", + "type": "uint256" + }, + { + "internalType": "address", + "name": "_defaultPoolOperator", + "type": "address" + } + ], + "name": "initializePoolConfigTwo", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_poolAddress", + "type": "address" + }, + { + "internalType": "uint256", + "name": "_frontLoadingFeeFlat", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "_frontLoadingFeeBps", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "_lateFeeFlat", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "_lateFeeBps", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "_membershipFee", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "_minPrincipalRateInBps", + "type": "uint256" + } + ], + "name": "initializePoolFeeManager", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "receivableFactoringPoolImplAddress", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "removeDeployer", + "outputs": [], + "stateMutability": "nonpayable", + "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": "address", + "name": "newAddress", + "type": "address" + } + ], + "name": "setBaseCredtiPoolImplAddress", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "newAddress", + "type": "address" + } + ], + "name": "setHDTImplAddress", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "newAddress", + "type": "address" + } + ], + "name": "setReceivableFactoringPoolImplAddress", + "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": [ + { + "internalType": "address", + "name": "newOwner", + "type": "address" + } + ], + "name": "transferOwnership", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_poolAddress", + "type": "address" + } + ], + "name": "updatePoolStatus", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + } +] diff --git a/contracts/BaseCreditPool.sol b/contracts/BaseCreditPool.sol index a397c843..a1e61887 100644 --- a/contracts/BaseCreditPool.sol +++ b/contracts/BaseCreditPool.sol @@ -7,7 +7,7 @@ import "./BasePool.sol"; import "./BaseCreditPoolStorage.sol"; import "./Errors.sol"; -import "hardhat/console.sol"; +// import "hardhat/console.sol"; /** * @notice BaseCreditPool is the basic form of a complete pool in Huma Protocol. diff --git a/contracts/BaseFeeManager.sol b/contracts/BaseFeeManager.sol index 5472a6ff..2a58273b 100644 --- a/contracts/BaseFeeManager.sol +++ b/contracts/BaseFeeManager.sol @@ -7,7 +7,7 @@ import "./interfaces/IFeeManager.sol"; import "./HumaConfig.sol"; import "./Errors.sol"; import {BaseStructs as BS} from "./libraries/BaseStructs.sol"; -import "hardhat/console.sol"; +// import "hardhat/console.sol"; /** * diff --git a/contracts/BasePool.sol b/contracts/BasePool.sol index 5c7d7ca9..7bc1a73e 100644 --- a/contracts/BasePool.sol +++ b/contracts/BasePool.sol @@ -15,7 +15,7 @@ import "./EvaluationAgentNFT.sol"; import "./HDT/HDT.sol"; import "./HumaConfig.sol"; -import "hardhat/console.sol"; +// import "hardhat/console.sol"; abstract contract BasePool is Initializable, BasePoolStorage, ILiquidityProvider, IPool { using SafeERC20 for IERC20; diff --git a/contracts/BasePoolConfig.sol b/contracts/BasePoolConfig.sol index 2cd0108e..7cfc9de0 100644 --- a/contracts/BasePoolConfig.sol +++ b/contracts/BasePoolConfig.sol @@ -12,7 +12,7 @@ import "./HumaConfig.sol"; import "./BasePool.sol"; import "./Errors.sol"; -import "hardhat/console.sol"; +// import "hardhat/console.sol"; contract BasePoolConfig is Ownable, Initializable { using SafeERC20 for IERC20; diff --git a/contracts/HumaConfig.sol b/contracts/HumaConfig.sol index 61dc3f8c..a0bc30d8 100644 --- a/contracts/HumaConfig.sol +++ b/contracts/HumaConfig.sol @@ -6,7 +6,7 @@ import "@openzeppelin/contracts/security/Pausable.sol"; import "./Errors.sol"; -import "hardhat/console.sol"; +// import "hardhat/console.sol"; /** @notice HumaConfig maintains all the global configurations supported by Huma protocol. */ diff --git a/contracts/factory/LibHDT.sol b/contracts/factory/LibHDT.sol index 09e2c154..c9a390c2 100644 --- a/contracts/factory/LibHDT.sol +++ b/contracts/factory/LibHDT.sol @@ -18,10 +18,12 @@ library LibHDT { address _hdtAddress, string memory name, string memory symbol, - address underlyingToken + address underlyingToken, + address _poolAddress ) public { HDT hdt = HDT(_hdtAddress); hdt.initialize(name, symbol, underlyingToken); + hdt.setPool(_poolAddress); } function transferOwnership(address _hdtAddress, address newOwner) public { diff --git a/contracts/factory/LibPool.sol b/contracts/factory/LibPool.sol index a1fd4aa2..94fef69c 100644 --- a/contracts/factory/LibPool.sol +++ b/contracts/factory/LibPool.sol @@ -19,7 +19,7 @@ library LibPool { pool.initialize(_poolConfigAddress); } - function initialized(address _poolAddress) public returns (bool) { + function initialized(address _poolAddress) public view returns (bool) { BasePool pool = BasePool(_poolAddress); return pool.poolConfig() != address(0); } diff --git a/contracts/factory/LibPoolConfig.sol b/contracts/factory/LibPoolConfig.sol index 79ad48f6..1b7b0790 100644 --- a/contracts/factory/LibPoolConfig.sol +++ b/contracts/factory/LibPoolConfig.sol @@ -2,7 +2,7 @@ pragma solidity ^0.8.0; import "../BasePoolConfig.sol"; -import "hardhat/console.sol"; +// import "hardhat/console.sol"; library LibPoolConfig { function addPoolConfig() public returns (address) { @@ -22,9 +22,7 @@ library LibPoolConfig { uint256 withdrawalLockoutPeriod ) public { BasePoolConfig poolConfig = BasePoolConfig(_poolConfigAddress); - console.log("test"); poolConfig.initialize(_poolName, _hdtAddress, _humaConfigAddress, _feeManagerAddress); - console.log("test2"); poolConfig.setPool(_poolAddress); poolConfig.setPoolToken(_hdtAddress); poolConfig.setPoolOwnerTreasury(_poolOwnerTreasury); @@ -41,7 +39,8 @@ library LibPoolConfig { uint256 EALiquidity, uint256 maxCreditLine, uint256 _apr, - uint256 receivableRequiredInBps + uint256 receivableRequiredInBps, + address _defaultPoolOperator ) public { BasePoolConfig poolConfig = BasePoolConfig(_poolConfigAddress); @@ -51,6 +50,7 @@ library LibPoolConfig { poolConfig.setMaxCreditLine(maxCreditLine); poolConfig.setAPR(_apr); poolConfig.setReceivableRequiredInBps(receivableRequiredInBps); + poolConfig.addPoolOperator(_defaultPoolOperator); } function transferOwnership(address _poolConfigAddress, address newOwner) public { diff --git a/contracts/factory/PoolFactory.sol b/contracts/factory/PoolFactory.sol index c17bf110..a01ab9ff 100644 --- a/contracts/factory/PoolFactory.sol +++ b/contracts/factory/PoolFactory.sol @@ -133,7 +133,7 @@ contract PoolFactory is AccessControl { string memory symbol, address underlyingToken ) external onlyRole(DEPLOYER_ROLE) { - LibHDT.initializeHDT(pools[_poolAddress].hdt, name, symbol, underlyingToken); + LibHDT.initializeHDT(pools[_poolAddress].hdt, name, symbol, underlyingToken, _poolAddress); LibHDT.transferOwnership(pools[_poolAddress].hdt, pools[_poolAddress].poolTimeLock); } @@ -146,7 +146,8 @@ contract PoolFactory is AccessControl { uint256 EALiquidity, uint256 maxCreditLine, uint256 _apr, - uint256 receivableRequiredInBps + uint256 receivableRequiredInBps, + address _defaultPoolOperator ) external onlyRole(DEPLOYER_ROLE) { LibPoolConfig.initializePoolLiquidityConfig( pools[_poolAddress].poolConfig, @@ -157,7 +158,8 @@ contract PoolFactory is AccessControl { EALiquidity, maxCreditLine, _apr, - receivableRequiredInBps + receivableRequiredInBps, + _defaultPoolOperator ); LibPoolConfig.transferOwnership( pools[_poolAddress].poolConfig, diff --git a/contracts/libraries/BaseStructs.sol b/contracts/libraries/BaseStructs.sol index 2f90474f..0321e62b 100644 --- a/contracts/libraries/BaseStructs.sol +++ b/contracts/libraries/BaseStructs.sol @@ -2,7 +2,7 @@ pragma solidity ^0.8.0; import "../interfaces/IFeeManager.sol"; -import "hardhat/console.sol"; +// import "hardhat/console.sol"; library BaseStructs { /** diff --git a/contracts/receivables/RealWorldReceivable.sol b/contracts/receivables/RealWorldReceivable.sol index e0cdc46e..0193faa5 100644 --- a/contracts/receivables/RealWorldReceivable.sol +++ b/contracts/receivables/RealWorldReceivable.sol @@ -198,7 +198,7 @@ contract RealWorldReceivable is function supportsInterface(bytes4 interfaceId) public view - override(ERC721Upgradeable, ERC721EnumerableUpgradeable, AccessControlUpgradeable) + override(AccessControlUpgradeable, ERC721EnumerableUpgradeable, ERC721Upgradeable) returns (bool) { return super.supportsInterface(interfaceId); diff --git a/deployment/alfajores-deployed-contracts.json b/deployment/alfajores-deployed-contracts.json new file mode 100644 index 00000000..4bb9acdf --- /dev/null +++ b/deployment/alfajores-deployed-contracts.json @@ -0,0 +1,23 @@ +{ + "USDC": "0x50dc34a634F3E29CfBad79E9cECD2759a6bA8Eae", + "EANFT": "0xd5c09d8E9C45FD0B99bd9032a8985e3c5F16eF6e", + "HumaConfig": "0xb94879541CAF746bFe1b066421E7D64C94fC9738", + "HumaConfigTimelock": "0xa0A16038D714F687679732dCb34e1d4051218Dc5", + "HumaProxyAdminTimelock": "0x503EA0E2d1180b74F3A6105F43C481d18C2e426d", + "RWReceivableImpl": "0x41c82e7bA2Cea9b14B4CCd88d96739a1f1890384", + "RWReceivable": "0xEDa33b3b92Af44D5D1Be70Fb77527e74CbE933f7", + "ArfNewPoolTimelock": "0xCc0a468E93e8D2eEA311c7e9135BB78207DB7EF9", + "ArfNewPoolProxyAdminTimelock": "0xDDf423278bBe8A5Fc0E608d68A577f05024a8Ed4", + "ArfNewPoolFeeManager": "0xF1982c34E7256e02852e7dE664247aE04B0c71f2", + "ArfNewHDTImpl": "0xBB867612c4428798F0Be599671530ED96B104D8a", + "ArfNewHDT": "0x458594604Fbc36DE8016843D50e54688A639655B", + "ArfNewPoolConfig": "0x03e84C522b834Bb8cF84A5B64b4d0824e492Fc68", + "ArfNewPoolImpl": "0x3DA2A11433eABBB1E661478BdBd03510F9D4b83b", + "ArfNewPool": "0xbaFF4a403AA31819B1bD23A254EaEd3d8cC87a41", + "ReceivableFactoringPoolImpl": "0x009016ed5c661d4E93B3f62B153300170B518C1B", + "LibFeeManager": "0x7261a30f2d79e16e3621744e20AA238F119D1B09", + "LibPoolConfig": "0x1Ab8e0B8e63f876c1650e77ae38351E4E796e224", + "LibHDT": "0x7BD8faa4B68c94687a763ad14fe8755295a609F6", + "LibPool": "0x3F6360E54540544c80426DFf0FC6E8d0E5cD0740", + "HumaPoolFactory": "0xd4DC13b2C5eC84243486A953C9223C941BD15Bc5" +} \ No newline at end of file diff --git a/deployment/alfajores-initialized-contracts.json b/deployment/alfajores-initialized-contracts.json new file mode 100644 index 00000000..24a20642 --- /dev/null +++ b/deployment/alfajores-initialized-contracts.json @@ -0,0 +1,6 @@ +{"HumaConfig":"Done", +"ArfNewPoolFeeManager":"Done", +"ArfNewHDT":"Done", +"ArfNewPoolConfig":"Done", +"ArfNewPool":"Done", +"RWReceivable":"Done"} \ No newline at end of file diff --git a/deployment/alfajores-verified-contracts.json b/deployment/alfajores-verified-contracts.json new file mode 100644 index 00000000..83d3cead --- /dev/null +++ b/deployment/alfajores-verified-contracts.json @@ -0,0 +1,19 @@ +{"USDC":"Done", +"EANFT":"Done", +"HumaConfig":"Done", +"HumaConfigTimelock":"Done", +"RWReceivableImpl":"Done", +"RWReceivable":"Done", +"ArfNewPoolTimelock":"Done", +"ArfNewPoolProxyAdminTimelock":"Done", +"ArfNewPoolFeeManager":"Done", +"ArfNewHDTImpl":"Done", +"ArfNewHDT":"Done", +"ArfNewPoolConfig":"Done", +"ArfNewPoolImpl":"Done", +"ArfNewPool":"Done", +"LibFeeManager":"Done", +"LibPoolConfig":"Done", +"LibHDT":"Done", +"LibPool":"Done", +"HumaPoolFactory":"Done"} \ No newline at end of file diff --git a/deployment/alfajores/deploy-jia-pool.js b/deployment/alfajores/deploy-jia-pool.js new file mode 100644 index 00000000..7f84862c --- /dev/null +++ b/deployment/alfajores/deploy-jia-pool.js @@ -0,0 +1,76 @@ +const {deploy} = require("../utils.js"); + +const HUMA_OWNER_EOA='0x18A00C3cdb71491eF7c3b890f9df37CB5Ec11D2A'; +const POOL_OWNER_EOA='0xf9f1f8b93Be684847D8DaF82b1643b2D5BB4419a'; + +async function deployContracts() { + const network = (await hre.ethers.provider.getNetwork()).name; + console.log("network : ", network); + const accounts = await hre.ethers.getSigners(); + if (accounts.length == 0) { + throw new Error("Accounts not set!"); + } + const [deployer, eaService] = await accounts; + console.log("deployer address: " + deployer.address); + console.log("ea service address: " + eaService.address); + + const usdc = await deploy("TestToken", "USDC"); + const evaluationAgentNFT = await deploy("EvaluationAgentNFT", "EANFT", [], eaService); + + const humaConfig = await deploy("HumaConfig", "HumaConfig"); + const humaConfigTL = await deploy("TimelockController", "HumaConfigTimelock", [ + 0, + [HUMA_OWNER_EOA], + [deployer.address], + ]); + + const HumaProxyAdminTL = await deploy("TimelockController", "HumaProxyAdminTimelock", [ + 0, + [HUMA_OWNER_EOA], + [deployer.address], + ]); + + const rwrImpl = await deploy("RealWorldReceivable", "RWReceivableImpl"); + const rwr = await deploy("TransparentUpgradeableProxy", "RWReceivable", [ + rwrImpl.address, + HumaProxyAdminTL.address, + [], + ]); + + const baseCreditPoolTL = await deploy("TimelockController", "ArfNewPoolTimelock", [ + 0, + [POOL_OWNER_EOA], + [deployer.address], + ]); + + const baseCreditPoolProxyAdminTL = await deploy("TimelockController", "ArfNewPoolProxyAdminTimelock", [ + 0, + [POOL_OWNER_EOA], + [deployer.address], + ]); + + const bc_feeManager = await deploy("BaseFeeManager", "ArfNewPoolFeeManager"); + const bc_hdtImpl = await deploy("HDT", "ArfNewHDTImpl"); + const bc_hdt = await deploy("TransparentUpgradeableProxy", "ArfNewHDT", [ + bc_hdtImpl.address, + baseCreditPoolProxyAdminTL.address, + [], + ]); + const bc_poolConfig = await deploy("BasePoolConfig", "ArfNewPoolConfig"); + + const bc_poolImpl = await deploy("BaseCreditPool", "ArfNewPoolImpl"); + const bc_pool = await deploy("TransparentUpgradeableProxy", "ArfNewPool", [ + bc_poolImpl.address, + baseCreditPoolProxyAdminTL.address, + [], + ]); + // End of deploying base credit pool + +} + +deployContracts() + .then(() => process.exit(0)) + .catch((error) => { + console.error(error); + process.exit(1); + }); diff --git a/deployment/alfajores/init-jia-pool-defender.js b/deployment/alfajores/init-jia-pool-defender.js new file mode 100644 index 00000000..5d606d5b --- /dev/null +++ b/deployment/alfajores/init-jia-pool-defender.js @@ -0,0 +1,384 @@ +const { + getInitilizedContract, + updateInitilizedContract, + getDeployedContracts, + sendTransaction, +} = require("../utils.js"); + +let deployer, eaService; + +const PDSServiceAccount = "0xD8F15c96825e1724B18dd477583E0DcCE3DfF0b1" +const treasuryAccount = "0x4062A9Eab6a49B2Be6aE4F7240D420f6fbE2e615" +const USDC_ADDRESS = "0x50dc34a634F3E29CfBad79E9cECD2759a6bA8Eae"; +const poolTreasury = "0xf9f1f8b93Be684847D8DaF82b1643b2D5BB4419a" + +async function transferOwnershipToTL(contractName, contractKey, timeLockKey) { + if (!deployedContracts[timeLockKey]) { + throw new Error(`${timeLockKey} not deployed yet!`); + } + + if (!deployedContracts[contractKey]) { + throw new Error(`${contractKey} not deployed yet!`); + } + + const TimeLockController = await hre.ethers.getContractFactory("TimelockController"); + const timeLockController = TimeLockController.attach(deployedContracts[timeLockKey]); + + const Contract = await hre.ethers.getContractFactory(contractName); + const contract = Contract.attach(deployedContracts[contractKey]); + + await sendTransaction(contractKey, contract, "transferOwnership", [timeLockController.address]); + + const adminRole = await timeLockController.TIMELOCK_ADMIN_ROLE(); + await sendTransaction(contractKey, timeLockController, "renounceRole", [ + adminRole, + deployer.address, + ]); +} + +async function initHumaConfig() { + const initilized = await getInitilizedContract("HumaConfig"); + if (initilized) { + console.log("HumaConfig is already initialized!"); + return; + } + + if (!deployedContracts["HumaConfig"]) { + throw new Error("HumaConfig not deployed yet!"); + } + + if (!deployedContracts["EANFT"]) { + throw new Error("EANFT not deployed yet!"); + } + + if (!deployedContracts["USDC"]) { + throw new Error("USDC not deployed yet!"); + } + + const HumaConfig = await hre.ethers.getContractFactory("HumaConfig"); + const humaConfig = HumaConfig.attach(deployedContracts["HumaConfig"]); + + await sendTransaction("HumaConfig", humaConfig, "setProtocolDefaultGracePeriod", [ + 30 * 24 * 3600, + ]); + await sendTransaction("HumaConfig", humaConfig, "setTreasuryFee", [500]); + await sendTransaction("HumaConfig", humaConfig, "setEANFTContractAddress", [ + deployedContracts["EANFT"], + ]); + + await sendTransaction("HumaConfig", humaConfig, "setEAServiceAccount", [eaService.address]); + await sendTransaction("HumaConfig", humaConfig, "setPDSServiceAccount", [PDSServiceAccount]); + + const USDC = await hre.ethers.getContractFactory("TestToken"); + const usdc = USDC.attach(deployedContracts["USDC"]); + + // Add usdc as an asset supported by the protocol + await sendTransaction("HumaConfig", humaConfig, "setLiquidityAsset", [USDC_ADDRESS, true]); + + // Set treasury for the protocol + await sendTransaction("HumaConfig", humaConfig, "setHumaTreasury", [treasuryAccount]); + + // await transferOwnershipToTL("HumaConfig", "HumaConfig", "HumaConfigTimelock") + + await updateInitilizedContract("HumaConfig"); +} + +async function initEA() { + const initilized = await getInitilizedContract("EANFT"); + if (initilized) { + console.log("EANFT is already initialized!"); + return; + } + + if (!deployedContracts["EANFT"]) { + throw new Error("EANFT not deployed yet!"); + } + + const EANFT = await hre.ethers.getContractFactory("EvaluationAgentNFT"); + const eaNFT = EANFT.attach(deployedContracts["EANFT"]); + + const eaNFTFromEA = eaNFT.connect(deployer); + await sendTransaction("EvaluationAgentNFT", eaNFTFromEA, "mintNFT", [deployer.address]); + // const eaNFTFromEA_bcp = eaNFT.connect(ea); + // await sendTransaction("EvaluationAgentNFT", eaNFTFromEA_bcp, "mintNFT", [ea_bcp.address]); + await updateInitilizedContract("EANFT"); +} + +async function initBaseCreditPoolFeeManager() { + const initilized = await getInitilizedContract("ArfNewPoolFeeManager"); + if (initilized) { + console.log("ArfNewPoolFeeManager is already initialized!"); + return; + } + + if (!deployedContracts["ArfNewPoolFeeManager"]) { + throw new Error("ArfNewPoolFeeManager not deployed yet!"); + } + + const BaseFeeManager = await hre.ethers.getContractFactory("BaseFeeManager"); + const feeManager = BaseFeeManager.attach(deployedContracts["ArfNewPoolFeeManager"]); + + await sendTransaction( + "ArfNewPoolFeeManager", + feeManager, + "setFees", + [0, 0, 0, 0, 0] + ); + await sendTransaction("FeeManager", feeManager, "setMinPrincipalRateInBps", [0]); + + await transferOwnershipToTL("BaseFeeManager", "ArfNewPoolFeeManager", "ArfNewPoolTimelock"); + + await updateInitilizedContract("ArfNewPoolFeeManager"); +} + +async function initBaseCreditPoolHDT() { + const initilized = await getInitilizedContract("ArfNewHDT"); + if (initilized) { + console.log("ArfNewHDT is already initialized!"); + return; + } + + if (!deployedContracts["ArfNewHDT"]) { + throw new Error("ArfNewHDT not deployed yet!"); + } + + const HDT = await hre.ethers.getContractFactory("HDT"); + const hdt = HDT.attach(deployedContracts["ArfNewHDT"]); + + // if (!deployedContracts["USDC"]) { + // throw new Error("USDC not deployed yet!"); + // } + + if (!deployedContracts["ArfNewPool"]) { + throw new Error("ArfNewPool not deployed yet!"); + } + + await sendTransaction("HDT", hdt, "initialize", [ + "Arf new HDT", + "AHDT", + USDC_ADDRESS, + ]); + + await sendTransaction("HDT", hdt, "setPool", [deployedContracts["ArfNewPool"]]); + + // await transferOwnershipToTL("HDT", "ArfNewHDT", "ArfNewPoolTimelock"); + + await updateInitilizedContract("ArfNewHDT"); +} + +async function initBaseCreditPoolConfig() { + const initilized = await getInitilizedContract("ArfNewPoolConfig"); + if (initilized) { + console.log("ArfNewPoolConfig is already initialized!"); + return; + } + + if (!deployedContracts["ArfNewPoolConfig"]) { + throw new Error("ArfNewPoolConfig not deployed yet!"); + } + + const ReceivableFactoringPoolConfig = await hre.ethers.getContractFactory("BasePoolConfig"); + const poolConfig = ReceivableFactoringPoolConfig.attach( + deployedContracts["ArfNewPoolConfig"] + ); + + if (!deployedContracts["ArfNewPool"]) { + throw new Error("ArfNewPool not deployed yet!"); + } + + if (!deployedContracts["ArfNewHDT"]) { + throw new Error("ArfNewHDT not deployed yet!"); + } + + if (!deployedContracts["HumaConfig"]) { + throw new Error("HumaConfig not deployed yet!"); + } + + if (!deployedContracts["ArfNewPoolFeeManager"]) { + throw new Error("ArfNewPoolFeeManager not deployed yet!"); + } + + const HDT = await hre.ethers.getContractFactory("HDT"); + const hdt = HDT.attach(deployedContracts["ArfNewHDT"]); + + const HumaConfig = await hre.ethers.getContractFactory("HumaConfig"); + const humaConfig = HumaConfig.attach(deployedContracts["HumaConfig"]); + + const BaseFeeManager = await hre.ethers.getContractFactory("BaseFeeManager"); + const feeManager = BaseFeeManager.attach(deployedContracts["ArfNewPoolFeeManager"]); + + await sendTransaction("ArfNewPoolConfig", poolConfig, "initialize", [ + "ArfNewPool", + hdt.address, + humaConfig.address, + feeManager.address, + ]); + + const decimals = await hdt.decimals(); + console.log("decimals: " + BigInt(decimals)); + const cap = BigInt(1_000_000)*(BigInt(10)**(BigInt(decimals))); + console.log("cap: " + cap); + await sendTransaction("ArfNewPoolConfig", poolConfig, "setPoolLiquidityCap", [cap]); + + await sendTransaction("ArfNewPoolConfig", poolConfig, "setPool", [ + deployedContracts["ArfNewPool"], + ]); + + await sendTransaction( + "ArfNewPoolConfig", + poolConfig, + "setPoolOwnerRewardsAndLiquidity", + [0, 0] + ); + await sendTransaction( + "ArfNewPoolConfig", + poolConfig, + "setEARewardsAndLiquidity", + [0, 0] + ); + + // // await sendTransaction("ArfPoolConfig", poolConfig, "setEvaluationAgent", [ + // // 1, + // // deployer.address, + // // ]); + + const maxCL = BigInt(1_000_000)*(BigInt(10)**(BigInt(decimals))); + console.log("maxCL: " + maxCL); + await sendTransaction("ArfNewPoolConfig", poolConfig, "setMaxCreditLine", [maxCL]); + await sendTransaction("ArfNewPoolConfig", poolConfig, "setAPR", [1300]); + await sendTransaction("ArfNewPoolConfig", poolConfig, "setReceivableRequiredInBps", [0]); + await sendTransaction("ArfNewPoolConfig", poolConfig, "setPoolPayPeriod", [30]); + await sendTransaction("ArfNewPoolConfig", poolConfig, "setPoolToken", [ + deployedContracts["ArfNewHDT"], + ]); + await sendTransaction("ArfNewPoolConfig", poolConfig, "setWithdrawalLockoutPeriod", [30]); + await sendTransaction("ArfNewPoolConfig", poolConfig, "setPoolDefaultGracePeriod", [10]); + await sendTransaction("ArfNewPoolConfig", poolConfig, "addPoolOperator", [deployer.address]); + + + await sendTransaction("ArfNewPoolConfig", poolConfig, "setPoolOwnerTreasury", [poolTreasury]); + + await sendTransaction("ArfNewPoolConfig", poolConfig, "setCreditApprovalExpiration", [10]); + + // await transferOwnershipToTL("BasePoolConfig", "ArfNewPoolConfig", "ArfNewPoolTimelock"); + + await updateInitilizedContract("ArfNewPoolConfig"); +} + +async function initBaseCreditPool() { + const initilized = await getInitilizedContract("ArfNewPool"); + if (initilized) { + console.log("ArfNewPool is already initialized!"); + return; + } + + if (!deployedContracts["ArfNewPool"]) { + throw new Error("ArfNewPool not deployed yet!"); + } + + if (!deployedContracts["ArfNewPoolConfig"]) { + throw new Error("ArfNewPoolConfig not deployed yet!"); + } + + const ReceivableFactoringPool = await hre.ethers.getContractFactory("BaseCreditPool"); + const pool = ReceivableFactoringPool.attach(deployedContracts["ArfNewPool"]); + + await sendTransaction("ArfNewPool", pool, "initialize", [ + deployedContracts["ArfNewPoolConfig"], + ]); + + await updateInitilizedContract("ArfNewPool"); +} + +async function initRWR() { + const initilized = await getInitilizedContract("RWReceivable"); + if (initilized) { + console.log("RWReceivable is already initialized!"); + return; + } + + if (!deployedContracts["RWReceivable"]) { + throw new Error("RWReceivable not deployed yet!"); + } + + const RealWorldReceivable = await hre.ethers.getContractFactory("RealWorldReceivable"); + const rwReceivable = RealWorldReceivable.attach(deployedContracts["RWReceivable"]); + + await sendTransaction("RWReceivable", rwReceivable, "initialize", []); + + await updateInitilizedContract("RWReceivable"); +} + +async function prepareBaseCreditPool() { + // The operations commented off need to run with TL on Defender + if (!deployedContracts["ArfNewPool"]) { + throw new Error("ArfNewPool not deployed yet!"); + } + // if (!deployedContracts["USDC"]) { + // throw new Error("USDC not deployed yet!"); + // } + + const BaseCreditPool = await hre.ethers.getContractFactory("BaseCreditPool"); + const pool = BaseCreditPool.attach(deployedContracts["ArfNewPool"]) + // const poolFrombcpOperator = pool.connect(bcpOperator); + + // await sendTransaction("ArfNewPool", pool, "addApprovedLender", [deployer.address]); + // // await sendTransaction("ArfNewPool", poolFrombcpOperator, "addApprovedLender", [ea_bcp.address]); + // // await sendTransaction("ArfNewPool", poolFrombcpOperator, "addApprovedLender", [lender.address]); + // await sendTransaction("ArfNewPool", pool, "addApprovedLender", [poolTreasury]); + + // const USDC = await hre.ethers.getContractFactory("TestToken"); + // const usdc = USDC.attach(deployedContracts["USDC"]); + // const decimals = await usdc.decimals(); + + // Owner + // const usdcFromPoolOwnerTreasury = await usdc.connect(poolTreasury); + // const poolFromPoolOwnerTreasury = await pool.connect(poolTreasury); + // const amountOwner = BigInt(20_000)*(BigInt(10)**(BigInt(decimals))); + // console.log("owner to deposit: " + amountOwner); + // await sendTransaction("TestToken", usdc, "mint", [poolTreasury.address, amountOwner]); + // await sendTransaction("TestToken", usdcFromPoolOwnerTreasury, "approve", [pool.address, amountOwner]); + // await sendTransaction("ArfPool", poolFromPoolOwnerTreasury, "makeInitialDeposit", [amountOwner]); + + // EA + // const usdcFromEA = await usdc.connect(ea_bcp); + // const poolFromEA = await pool.connect(ea_bcp); + // const amountEA = BigInt(10_000)*(BigInt(10)**(BigInt(decimals))); + // await sendTransaction("TestToken", usdc, "mint", [ea_bcp.address, amountEA]); + // await sendTransaction("TestToken", usdcFromEA, "approve", [poolFromEA.address, amountEA]); + // await sendTransaction("BaseCreditPool", poolFromEA, "makeInitialDeposit", [amountEA]); + + await sendTransaction("ArfPool", pool, "enablePool", []); +} + +async function initContracts() { + const network = (await hre.ethers.provider.getNetwork()).name; + console.log("network : ", network); + const accounts = await hre.ethers.getSigners(); + let invoicePayer; + [ + deployer, eaService //, poolTreasury + ] = await accounts; + console.log("deployer address: " + deployer.address); + // console.log("ea address: " + eaService.address); + + deployedContracts = await getDeployedContracts(); + + await initHumaConfig(); + // await initEA(); + await initBaseCreditPoolFeeManager(); + await initBaseCreditPoolHDT(); + await initBaseCreditPoolConfig(); + await initBaseCreditPool(); + await initRWR(); + + await prepareBaseCreditPool(); + +} + +initContracts() + .then(() => process.exit(0)) + .catch((error) => { + console.error(error); + process.exit(1); + }); diff --git a/deployment/alfajores/verify-jia-pool.js b/deployment/alfajores/verify-jia-pool.js new file mode 100644 index 00000000..ed6cf756 --- /dev/null +++ b/deployment/alfajores/verify-jia-pool.js @@ -0,0 +1,204 @@ +const execSync = require('child_process').execSync; +const { + getDeployedContracts, + getVerifiedContract, + updateVerifiedContract, +} = require("../utils.js"); + +const fs = require("fs"); + +const VERIFY_ARGS_PATH = "./deployment/alfajores/verify_args/" + +const HUMA_OWNER_EOA = "0x18A00C3cdb71491eF7c3b890f9df37CB5Ec11D2A"; +const POOL_OWNER_EOA = "0xf9f1f8b93Be684847D8DaF82b1643b2D5BB4419a"; + +let deployedContracts, proxyOwner, network, deployer; + +const getArgsFile = async function (contractName) { + const argsFile = `${VERIFY_ARGS_PATH}${contractName}.js`; + return argsFile; +} + +const writeVerifyArgs = async function (contractName, args) { + const argsFile = await getArgsFile(contractName); + let data = `module.exports = [ + ${args.toString()}, + ];` + // console.log(data) + await fs.mkdir(`${VERIFY_ARGS_PATH}`, { recursive: true }, (err) => { + if (err) throw err; + }); + fs.writeFileSync(argsFile, data, {flag: "w"}); + return argsFile; +}; + +const sleep = (ms) => new Promise((res) => setTimeout(res, ms)); + +async function etherscanVerify(contractName, contractAddress, argsFile, logMessage) { + await sleep(5000); + logMessage = !logMessage ? contractAddress : logMessage; + console.log(`Verifying ${contractName}:${logMessage}`) + + const command = !argsFile ? `yarn hardhat verify '${contractAddress}' --network ${network}` : `yarn hardhat verify ${contractAddress} --constructor-args ${argsFile} --network ${network}` + let result; + try { + const verifyResult = execSync(command) + // console.log(verifyResult); + result = 'successful'; + } + catch (error) { + if (!error.toString().toLowerCase().includes("already verified" )) { + throw error; + } + else { + result = 'already verified'; + } + }; + console.log(`Verifying ${contractName}:${logMessage} ended!`); + return result; +} + +async function verifyContract(contractKey, args) { + const verified = await getVerifiedContract(contractKey); + if (verified) { + console.log(`${contractKey} is already verified!`); + return 'already verified'; + } + + if (!deployedContracts[contractKey]) { + throw new Error(`${contractKey} not deployed yet!`); + } + let result; + if (args) { + const argsFile = await writeVerifyArgs(contractKey, args); + result = await etherscanVerify(contractKey, deployedContracts[contractKey], argsFile); + } + else { + result = await etherscanVerify(contractKey, deployedContracts[contractKey]); + } + await updateVerifiedContract(contractKey); + return result; +} + +async function verifyContracts() { + // network = (await hre.ethers.provider.getNetwork()).name; + network = "alfajores"; + console.log("network : ", network); + deployedContracts = await getDeployedContracts(); + const accounts = await hre.ethers.getSigners(); + if (accounts.length == 0) { + throw new Error("Accounts not set!"); + } + deployer = await accounts[0]; + // proxyOwner = await accounts[1]; + // console.log("proxyOwner address: " + proxyOwner.address); + + const verifyUsdc = await verifyContract('USDC'); + console.log(`Verify USDC result: ${verifyUsdc}`); + + const verifyEANFT = await verifyContract('EANFT'); + console.log(`Verify EANFT result: ${verifyEANFT}`); + + // const verifyRNNFT = await verifyContract('RNNFT', [ + // `'${deployedContracts['USDC']}'` + // ]); + // console.log(`Verify RNNFT result: ${verifyRNNFT}`); + + const verifyHumaConfig = await verifyContract('HumaConfig'); + console.log(`Verify HumaConfig result: ${verifyHumaConfig}`); + + const verifyHumaConfigTL = await verifyContract('HumaConfigTimelock', + [ + 0, + `['${HUMA_OWNER_EOA}']`, + `['${deployer.address}']`, + ]); + console.log(`Verify HumaConfigTimelock result: ${verifyHumaConfigTL}`); + + const verifyRWRImpl = await verifyContract('RWReceivableImpl'); + console.log(`Verify RWRImpl result: ${verifyRWRImpl}`); + + const verifyRWR = await verifyContract('RWReceivable', + [ + `'${deployedContracts['RWReceivableImpl']}'`, + `'${deployedContracts['HumaProxyAdminTimelock']}'`, + '[]' + ]); + console.log(`Verify RWR result: ${verifyRWR}`); + + + const verifyBaseCreditPoolTL = await verifyContract('ArfNewPoolTimelock', + [ + 0, + `['${POOL_OWNER_EOA}']`, + `['${deployer.address}']`, + ]); + console.log(`Verify Pool result: ${verifyBaseCreditPoolTL}`); + + const verifyBaseCreditPoolProxyAdminTL = await verifyContract('ArfNewPoolProxyAdminTimelock', + [ + 0, + `['${POOL_OWNER_EOA}']`, + `['${deployer.address}']`, + ]); + console.log(`Verify BaseCreditPoolProxyAdminTL result: ${verifyBaseCreditPoolProxyAdminTL}`); + + const verifyFeeManager = await verifyContract('ArfNewPoolFeeManager'); + console.log(`Verify FeeManager result: ${verifyFeeManager}`); + + const verifyHDTImpl = await verifyContract('ArfNewHDTImpl'); + console.log(`Verify HDTImpl result: ${verifyHDTImpl}`); + + const verifyHDT = await verifyContract('ArfNewHDT', + [ + `'${deployedContracts['ArfNewHDTImpl']}'`, + `'${deployedContracts['ArfNewPoolProxyAdminTimelock']}'`, + '[]' + ]); + console.log(`Verify HDT result: ${verifyHDT}`); + + const verifyPoolConfig = await verifyContract('ArfNewPoolConfig'); + console.log(`Verify poolConfig result: ${verifyPoolConfig}`); + + const verifyPoolImpl = await verifyContract('ArfNewPoolImpl'); + console.log(`Verify PoolImpl result: ${verifyPoolImpl}`); + const verifyPool = await verifyContract('ArfNewPool', + [ + `'${deployedContracts['ArfNewPoolImpl']}'`, + `'${deployedContracts['ArfNewPoolProxyAdminTimelock']}'`, + '[]', + ]); + console.log(`Verify Pool result: ${verifyPool}`); + + const verifyLibFeeManager = await verifyContract('LibFeeManager'); + console.log(`Verify LibFeeManager result: ${verifyLibFeeManager}`); + + const verifyLibPoolConfig = await verifyContract('LibPoolConfig'); + console.log(`Verify LibPoolConfig result: ${verifyLibPoolConfig}`); + + const verifyLibHDT = await verifyContract('LibHDT'); + console.log(`Verify LibHDT result: ${verifyLibHDT}`); + + const verifyLibPool = await verifyContract('LibPool'); + console.log(`Verify LibPool result: ${verifyLibPool}`); + + const verifyPoolFactory = await verifyContract('HumaPoolFactory', + [ + `'${HUMA_OWNER_EOA}'`, + `'${deployedContracts['HumaConfig']}'`, + `'${deployedContracts['ArfNewHDTImpl']}'`, + `'${deployedContracts['ArfNewPoolImpl']}'`, + `'${deployedContracts['ReceivableFactoringPoolImpl']}'`, + ]); + console.log(`Verify Pool result: ${verifyPoolFactory}`); + +} + +verifyContracts() + .then(() => process.exit(0)) + .catch((error) => { + console.error(error); + process.exit(1); + }); + +// Reason: Already Verified \ No newline at end of file diff --git a/deployment/celo-deployed-contracts.json b/deployment/celo-deployed-contracts.json new file mode 100644 index 00000000..ba26e8aa --- /dev/null +++ b/deployment/celo-deployed-contracts.json @@ -0,0 +1,14 @@ +{"EANFT":"0xe5DE2a822A61cd7E084Fea2410A00f4EcE47401B", +"HumaConfig":"0x4730Ba92780b6783Ce97bD5f7AaD75337d6D180A", +"HumaConfigTimelock":"0x0562e6287dd69E76771E046f7E24ADC608c837b6", +"HumaProxyAdminTimelock":"0x1691090fb0cFd3bd9b59128b57490eA882A09573", +"RWReceivableImpl":"0x5B7841b94a3C7246662ef514745b034A6ceaAB15", +"RWReceivable":"0xfc256098C6c63836ac71F7057c68b74165fF9cbb", +"HDTImpl":"0xf5F9297c74e464933e42F4a989e81D931fb20f83", +"BaseCreditPoolImpl":"0x98f41d57C06b302AFf999f3F58f4ae7a3F884590", +"ReceivableFactoringPoolImpl":"0x87FD98F3eB172B5183F7527060DDbe8a8D17B924", +"LibFeeManager":"0x58AAF1f9cB10F335111A2129273056bbED251B61", +"LibPoolConfig":"0x941687792107eaC859B820d1636936382F3189aa", +"LibHDT":"0x34eA029c5195F8fb4fe59b492be1738a9Dd959AC", +"LibPool":"0x5Cf4467F129e87274196a95a47BdE57f2C3F6C56", +"HumaPoolFactory":"0x8e945C9ca71637D5582FA2cA6347bD4634261410"} \ No newline at end of file diff --git a/deployment/celo-initialized-contracts.json b/deployment/celo-initialized-contracts.json new file mode 100644 index 00000000..557e17fc --- /dev/null +++ b/deployment/celo-initialized-contracts.json @@ -0,0 +1,2 @@ +{"HumaConfig":"Done", +"RWReceivable":"Done"} \ No newline at end of file diff --git a/deployment/celo-verified-contracts.json b/deployment/celo-verified-contracts.json new file mode 100644 index 00000000..104b39d8 --- /dev/null +++ b/deployment/celo-verified-contracts.json @@ -0,0 +1,13 @@ +{"EANFT":"Done", +"HumaConfig":"Done", +"HumaConfigTimelock":"Done", +"RWReceivableImpl":"Done", +"RWReceivable":"Done", +"HDTImpl":"Done", +"BaseCreditPoolImpl":"Done", +"ReceivableFactoringPoolImpl":"Done", +"LibFeeManager":"Done", +"LibPoolConfig":"Done", +"LibHDT":"Done", +"LibPool":"Done", +"HumaPoolFactory":"Done"} \ No newline at end of file diff --git a/deployment/celo/deploy-protocol-factory.js b/deployment/celo/deploy-protocol-factory.js new file mode 100644 index 00000000..347cc906 --- /dev/null +++ b/deployment/celo/deploy-protocol-factory.js @@ -0,0 +1,72 @@ +const {deploy} = require("../utils.js"); + +const HUMA_OWNER_ADDRESS='0xABd48A580F66ad5Ad0Fe983968De686F408c88EE'; +// const POOL_OWNER_EOA='0xf9f1f8b93Be684847D8DaF82b1643b2D5BB4419a'; + +async function deployContracts() { + const network = (await hre.ethers.provider.getNetwork()).name; + console.log("network : ", network); + const accounts = await hre.ethers.getSigners(); + if (accounts.length == 0) { + throw new Error("Accounts not set!"); + } + const [deployer, eaService] = await accounts; + console.log("deployer address: " + deployer.address); + console.log("ea service address: " + eaService.address); + + // const usdc = await deploy("TestToken", "USDC"); + const evaluationAgentNFT = await deploy("EvaluationAgentNFT", "EANFT", [], eaService); + + const humaConfig = await deploy("HumaConfig", "HumaConfig"); + const humaConfigTL = await deploy("TimelockController", "HumaConfigTimelock", [ + 0, + [HUMA_OWNER_ADDRESS], + [deployer.address], + ]); + + const HumaProxyAdminTL = await deploy("TimelockController", "HumaProxyAdminTimelock", [ + 0, + [HUMA_OWNER_ADDRESS], + [deployer.address], + ]); + + const rwrImpl = await deploy("RealWorldReceivable", "RWReceivableImpl"); + const rwr = await deploy("TransparentUpgradeableProxy", "RWReceivable", [ + rwrImpl.address, + HumaProxyAdminTL.address, + [], + ]); + + const hdtImpl = await deploy("HDT", "HDTImpl"); + + const bc_poolImpl = await deploy("BaseCreditPool", "BaseCreditPoolImpl"); + const rf_poolImpl = await deploy("BaseCreditPool", "ReceivableFactoringPoolImpl"); + + const libFeeManager = await deploy("LibFeeManager", "LibFeeManager"); + const libPoolConfig = await deploy("LibPoolConfig", "LibPoolConfig"); + const libHDT = await deploy("LibHDT", "LibHDT"); + const libPool = await deploy("LibPool", "LibPool"); + const poolFactory = await deploy("PoolFactory", "HumaPoolFactory", + [ + HUMA_OWNER_ADDRESS, + humaConfig.address, + hdtImpl.address, + bc_poolImpl.address, + rf_poolImpl.address, + ], + {libraries: { + LibFeeManager: libFeeManager.address, + LibPoolConfig: libPoolConfig.address, + LibHDT: libHDT.address, + LibPool: libPool.address, + },}) + // End of deploying base credit pool + +} + +deployContracts() + .then(() => process.exit(0)) + .catch((error) => { + console.error(error); + process.exit(1); + }); diff --git a/deployment/celo/init-protocol-factory.js b/deployment/celo/init-protocol-factory.js new file mode 100644 index 00000000..8e058e1b --- /dev/null +++ b/deployment/celo/init-protocol-factory.js @@ -0,0 +1,384 @@ +const { + getInitilizedContract, + updateInitilizedContract, + getDeployedContracts, + sendTransaction, +} = require("../utils.js"); + +let deployer, eaService; + +const PDSServiceAccount = "0x4388fDAF0Ae0F3B843882fF299E87e127c49A74c" +const treasuryAccount = "0xABd48A580F66ad5Ad0Fe983968De686F408c88EE" +const cUSD_ADDRESS = "0x765DE816845861e75A25fCA122bb6898B8B1282a"; +// const poolTreasury = "0xf9f1f8b93Be684847D8DaF82b1643b2D5BB4419a" + +async function transferOwnershipToTL(contractName, contractKey, timeLockKey) { + if (!deployedContracts[timeLockKey]) { + throw new Error(`${timeLockKey} not deployed yet!`); + } + + if (!deployedContracts[contractKey]) { + throw new Error(`${contractKey} not deployed yet!`); + } + + const TimeLockController = await hre.ethers.getContractFactory("TimelockController"); + const timeLockController = TimeLockController.attach(deployedContracts[timeLockKey]); + + const Contract = await hre.ethers.getContractFactory(contractName); + const contract = Contract.attach(deployedContracts[contractKey]); + + await sendTransaction(contractKey, contract, "transferOwnership", [timeLockController.address]); + + const adminRole = await timeLockController.TIMELOCK_ADMIN_ROLE(); + await sendTransaction(contractKey, timeLockController, "renounceRole", [ + adminRole, + deployer.address, + ]); +} + +async function initHumaConfig() { + const initilized = await getInitilizedContract("HumaConfig"); + if (initilized) { + console.log("HumaConfig is already initialized!"); + return; + } + + if (!deployedContracts["HumaConfig"]) { + throw new Error("HumaConfig not deployed yet!"); + } + + if (!deployedContracts["EANFT"]) { + throw new Error("EANFT not deployed yet!"); + } + + // if (!deployedContracts["USDC"]) { + // throw new Error("USDC not deployed yet!"); + // } + + const HumaConfig = await hre.ethers.getContractFactory("HumaConfig"); + const humaConfig = HumaConfig.attach(deployedContracts["HumaConfig"]); + + await sendTransaction("HumaConfig", humaConfig, "setProtocolDefaultGracePeriod", [ + 30 * 24 * 3600, + ]); + await sendTransaction("HumaConfig", humaConfig, "setTreasuryFee", [500]); + await sendTransaction("HumaConfig", humaConfig, "setEANFTContractAddress", [ + deployedContracts["EANFT"], + ]); + + await sendTransaction("HumaConfig", humaConfig, "setEAServiceAccount", [eaService.address]); + await sendTransaction("HumaConfig", humaConfig, "setPDSServiceAccount", [PDSServiceAccount]); + + // const USDC = await hre.ethers.getContractFactory("TestToken"); + // const usdc = USDC.attach(deployedContracts["USDC"]); + + // Add usdc as an asset supported by the protocol + await sendTransaction("HumaConfig", humaConfig, "setLiquidityAsset", [cUSD_ADDRESS, true]); + + // Set treasury for the protocol + await sendTransaction("HumaConfig", humaConfig, "setHumaTreasury", [treasuryAccount]); + + // await transferOwnershipToTL("HumaConfig", "HumaConfig", "HumaConfigTimelock") + + await updateInitilizedContract("HumaConfig"); +} + +async function initEA() { + const initilized = await getInitilizedContract("EANFT"); + if (initilized) { + console.log("EANFT is already initialized!"); + return; + } + + if (!deployedContracts["EANFT"]) { + throw new Error("EANFT not deployed yet!"); + } + + const EANFT = await hre.ethers.getContractFactory("EvaluationAgentNFT"); + const eaNFT = EANFT.attach(deployedContracts["EANFT"]); + + const eaNFTFromEA = eaNFT.connect(deployer); + await sendTransaction("EvaluationAgentNFT", eaNFTFromEA, "mintNFT", [deployer.address]); + // const eaNFTFromEA_bcp = eaNFT.connect(ea); + // await sendTransaction("EvaluationAgentNFT", eaNFTFromEA_bcp, "mintNFT", [ea_bcp.address]); + await updateInitilizedContract("EANFT"); +} + +async function initBaseCreditPoolFeeManager() { + const initilized = await getInitilizedContract("ArfNewPoolFeeManager"); + if (initilized) { + console.log("ArfNewPoolFeeManager is already initialized!"); + return; + } + + if (!deployedContracts["ArfNewPoolFeeManager"]) { + throw new Error("ArfNewPoolFeeManager not deployed yet!"); + } + + const BaseFeeManager = await hre.ethers.getContractFactory("BaseFeeManager"); + const feeManager = BaseFeeManager.attach(deployedContracts["ArfNewPoolFeeManager"]); + + await sendTransaction( + "ArfNewPoolFeeManager", + feeManager, + "setFees", + [0, 0, 0, 0, 0] + ); + await sendTransaction("FeeManager", feeManager, "setMinPrincipalRateInBps", [0]); + + await transferOwnershipToTL("BaseFeeManager", "ArfNewPoolFeeManager", "ArfNewPoolTimelock"); + + await updateInitilizedContract("ArfNewPoolFeeManager"); +} + +async function initBaseCreditPoolHDT() { + const initilized = await getInitilizedContract("ArfNewHDT"); + if (initilized) { + console.log("ArfNewHDT is already initialized!"); + return; + } + + if (!deployedContracts["ArfNewHDT"]) { + throw new Error("ArfNewHDT not deployed yet!"); + } + + const HDT = await hre.ethers.getContractFactory("HDT"); + const hdt = HDT.attach(deployedContracts["ArfNewHDT"]); + + // if (!deployedContracts["USDC"]) { + // throw new Error("USDC not deployed yet!"); + // } + + if (!deployedContracts["ArfNewPool"]) { + throw new Error("ArfNewPool not deployed yet!"); + } + + await sendTransaction("HDT", hdt, "initialize", [ + "Arf new HDT", + "AHDT", + cUSD_ADDRESS, + ]); + + await sendTransaction("HDT", hdt, "setPool", [deployedContracts["ArfNewPool"]]); + + // await transferOwnershipToTL("HDT", "ArfNewHDT", "ArfNewPoolTimelock"); + + await updateInitilizedContract("ArfNewHDT"); +} + +async function initBaseCreditPoolConfig() { + const initilized = await getInitilizedContract("ArfNewPoolConfig"); + if (initilized) { + console.log("ArfNewPoolConfig is already initialized!"); + return; + } + + if (!deployedContracts["ArfNewPoolConfig"]) { + throw new Error("ArfNewPoolConfig not deployed yet!"); + } + + const ReceivableFactoringPoolConfig = await hre.ethers.getContractFactory("BasePoolConfig"); + const poolConfig = ReceivableFactoringPoolConfig.attach( + deployedContracts["ArfNewPoolConfig"] + ); + + if (!deployedContracts["ArfNewPool"]) { + throw new Error("ArfNewPool not deployed yet!"); + } + + if (!deployedContracts["ArfNewHDT"]) { + throw new Error("ArfNewHDT not deployed yet!"); + } + + if (!deployedContracts["HumaConfig"]) { + throw new Error("HumaConfig not deployed yet!"); + } + + if (!deployedContracts["ArfNewPoolFeeManager"]) { + throw new Error("ArfNewPoolFeeManager not deployed yet!"); + } + + const HDT = await hre.ethers.getContractFactory("HDT"); + const hdt = HDT.attach(deployedContracts["ArfNewHDT"]); + + const HumaConfig = await hre.ethers.getContractFactory("HumaConfig"); + const humaConfig = HumaConfig.attach(deployedContracts["HumaConfig"]); + + const BaseFeeManager = await hre.ethers.getContractFactory("BaseFeeManager"); + const feeManager = BaseFeeManager.attach(deployedContracts["ArfNewPoolFeeManager"]); + + await sendTransaction("ArfNewPoolConfig", poolConfig, "initialize", [ + "ArfNewPool", + hdt.address, + humaConfig.address, + feeManager.address, + ]); + + const decimals = await hdt.decimals(); + console.log("decimals: " + BigInt(decimals)); + const cap = BigInt(1_000_000)*(BigInt(10)**(BigInt(decimals))); + console.log("cap: " + cap); + await sendTransaction("ArfNewPoolConfig", poolConfig, "setPoolLiquidityCap", [cap]); + + await sendTransaction("ArfNewPoolConfig", poolConfig, "setPool", [ + deployedContracts["ArfNewPool"], + ]); + + await sendTransaction( + "ArfNewPoolConfig", + poolConfig, + "setPoolOwnerRewardsAndLiquidity", + [0, 0] + ); + await sendTransaction( + "ArfNewPoolConfig", + poolConfig, + "setEARewardsAndLiquidity", + [0, 0] + ); + + // // await sendTransaction("ArfPoolConfig", poolConfig, "setEvaluationAgent", [ + // // 1, + // // deployer.address, + // // ]); + + const maxCL = BigInt(1_000_000)*(BigInt(10)**(BigInt(decimals))); + console.log("maxCL: " + maxCL); + await sendTransaction("ArfNewPoolConfig", poolConfig, "setMaxCreditLine", [maxCL]); + await sendTransaction("ArfNewPoolConfig", poolConfig, "setAPR", [1300]); + await sendTransaction("ArfNewPoolConfig", poolConfig, "setReceivableRequiredInBps", [0]); + await sendTransaction("ArfNewPoolConfig", poolConfig, "setPoolPayPeriod", [30]); + await sendTransaction("ArfNewPoolConfig", poolConfig, "setPoolToken", [ + deployedContracts["ArfNewHDT"], + ]); + await sendTransaction("ArfNewPoolConfig", poolConfig, "setWithdrawalLockoutPeriod", [30]); + await sendTransaction("ArfNewPoolConfig", poolConfig, "setPoolDefaultGracePeriod", [10]); + await sendTransaction("ArfNewPoolConfig", poolConfig, "addPoolOperator", [deployer.address]); + + + await sendTransaction("ArfNewPoolConfig", poolConfig, "setPoolOwnerTreasury", [poolTreasury]); + + await sendTransaction("ArfNewPoolConfig", poolConfig, "setCreditApprovalExpiration", [10]); + + // await transferOwnershipToTL("BasePoolConfig", "ArfNewPoolConfig", "ArfNewPoolTimelock"); + + await updateInitilizedContract("ArfNewPoolConfig"); +} + +async function initBaseCreditPool() { + const initilized = await getInitilizedContract("ArfNewPool"); + if (initilized) { + console.log("ArfNewPool is already initialized!"); + return; + } + + if (!deployedContracts["ArfNewPool"]) { + throw new Error("ArfNewPool not deployed yet!"); + } + + if (!deployedContracts["ArfNewPoolConfig"]) { + throw new Error("ArfNewPoolConfig not deployed yet!"); + } + + const ReceivableFactoringPool = await hre.ethers.getContractFactory("BaseCreditPool"); + const pool = ReceivableFactoringPool.attach(deployedContracts["ArfNewPool"]); + + await sendTransaction("ArfNewPool", pool, "initialize", [ + deployedContracts["ArfNewPoolConfig"], + ]); + + await updateInitilizedContract("ArfNewPool"); +} + +async function initRWR() { + const initilized = await getInitilizedContract("RWReceivable"); + if (initilized) { + console.log("RWReceivable is already initialized!"); + return; + } + + if (!deployedContracts["RWReceivable"]) { + throw new Error("RWReceivable not deployed yet!"); + } + + const RealWorldReceivable = await hre.ethers.getContractFactory("RealWorldReceivable"); + const rwReceivable = RealWorldReceivable.attach(deployedContracts["RWReceivable"]); + + await sendTransaction("RWReceivable", rwReceivable, "initialize", []); + + await updateInitilizedContract("RWReceivable"); +} + +async function prepareBaseCreditPool() { + // The operations commented off need to run with TL on Defender + if (!deployedContracts["ArfNewPool"]) { + throw new Error("ArfNewPool not deployed yet!"); + } + // if (!deployedContracts["USDC"]) { + // throw new Error("USDC not deployed yet!"); + // } + + const BaseCreditPool = await hre.ethers.getContractFactory("BaseCreditPool"); + const pool = BaseCreditPool.attach(deployedContracts["ArfNewPool"]) + // const poolFrombcpOperator = pool.connect(bcpOperator); + + // await sendTransaction("ArfNewPool", pool, "addApprovedLender", [deployer.address]); + // // await sendTransaction("ArfNewPool", poolFrombcpOperator, "addApprovedLender", [ea_bcp.address]); + // // await sendTransaction("ArfNewPool", poolFrombcpOperator, "addApprovedLender", [lender.address]); + // await sendTransaction("ArfNewPool", pool, "addApprovedLender", [poolTreasury]); + + // const USDC = await hre.ethers.getContractFactory("TestToken"); + // const usdc = USDC.attach(deployedContracts["USDC"]); + // const decimals = await usdc.decimals(); + + // Owner + // const usdcFromPoolOwnerTreasury = await usdc.connect(poolTreasury); + // const poolFromPoolOwnerTreasury = await pool.connect(poolTreasury); + // const amountOwner = BigInt(20_000)*(BigInt(10)**(BigInt(decimals))); + // console.log("owner to deposit: " + amountOwner); + // await sendTransaction("TestToken", usdc, "mint", [poolTreasury.address, amountOwner]); + // await sendTransaction("TestToken", usdcFromPoolOwnerTreasury, "approve", [pool.address, amountOwner]); + // await sendTransaction("ArfPool", poolFromPoolOwnerTreasury, "makeInitialDeposit", [amountOwner]); + + // EA + // const usdcFromEA = await usdc.connect(ea_bcp); + // const poolFromEA = await pool.connect(ea_bcp); + // const amountEA = BigInt(10_000)*(BigInt(10)**(BigInt(decimals))); + // await sendTransaction("TestToken", usdc, "mint", [ea_bcp.address, amountEA]); + // await sendTransaction("TestToken", usdcFromEA, "approve", [poolFromEA.address, amountEA]); + // await sendTransaction("BaseCreditPool", poolFromEA, "makeInitialDeposit", [amountEA]); + + await sendTransaction("ArfPool", pool, "enablePool", []); +} + +async function initContracts() { + const network = (await hre.ethers.provider.getNetwork()).name; + console.log("network : ", network); + const accounts = await hre.ethers.getSigners(); + let invoicePayer; + [ + deployer, eaService //, poolTreasury + ] = await accounts; + console.log("deployer address: " + deployer.address); + // console.log("ea address: " + eaService.address); + + deployedContracts = await getDeployedContracts(); + + await initHumaConfig(); + // await initEA(); + // await initBaseCreditPoolFeeManager(); + // await initBaseCreditPoolHDT(); + // await initBaseCreditPoolConfig(); + // await initBaseCreditPool(); + await initRWR(); + + // await prepareBaseCreditPool(); + +} + +initContracts() + .then(() => process.exit(0)) + .catch((error) => { + console.error(error); + process.exit(1); + }); diff --git a/deployment/celo/verify-protocol-factory.js b/deployment/celo/verify-protocol-factory.js new file mode 100644 index 00000000..ccc69fee --- /dev/null +++ b/deployment/celo/verify-protocol-factory.js @@ -0,0 +1,206 @@ +const execSync = require('child_process').execSync; +const { + getDeployedContracts, + getVerifiedContract, + updateVerifiedContract, +} = require("../utils.js"); + +const fs = require("fs"); + +const VERIFY_ARGS_PATH = "./deployment/celo/verify_args/" + +const HUMA_OWNER_ADDRESS = "0xABd48A580F66ad5Ad0Fe983968De686F408c88EE"; +const POOL_OWNER_EOA = "0xf9f1f8b93Be684847D8DaF82b1643b2D5BB4419a"; + +let deployedContracts, proxyOwner, network, deployer; + +const getArgsFile = async function (contractName) { + const argsFile = `${VERIFY_ARGS_PATH}${contractName}.js`; + return argsFile; +} + +const writeVerifyArgs = async function (contractName, args) { + const argsFile = await getArgsFile(contractName); + let data = `module.exports = [ + ${args.toString()}, + ];` + // console.log(data) + await fs.mkdir(`${VERIFY_ARGS_PATH}`, { recursive: true }, (err) => { + if (err) throw err; + }); + fs.writeFileSync(argsFile, data, {flag: "w"}); + return argsFile; +}; + +const sleep = (ms) => new Promise((res) => setTimeout(res, ms)); + +async function etherscanVerify(contractName, contractAddress, argsFile, logMessage) { + await sleep(5000); + logMessage = !logMessage ? contractAddress : logMessage; + console.log(`Verifying ${contractName}:${logMessage}`) + + const command = !argsFile ? `yarn hardhat verify '${contractAddress}' --network ${network}` : `yarn hardhat verify ${contractAddress} --constructor-args ${argsFile} --network ${network}` + let result; + try { + const verifyResult = execSync(command) + // console.log(verifyResult); + result = 'successful'; + } + catch (error) { + if (!error.toString().toLowerCase().includes("already verified" )) { + throw error; + } + else { + result = 'already verified'; + } + }; + console.log(`Verifying ${contractName}:${logMessage} ended!`); + return result; +} + +async function verifyContract(contractKey, args) { + const verified = await getVerifiedContract(contractKey); + if (verified) { + console.log(`${contractKey} is already verified!`); + return 'already verified'; + } + + if (!deployedContracts[contractKey]) { + throw new Error(`${contractKey} not deployed yet!`); + } + let result; + if (args) { + const argsFile = await writeVerifyArgs(contractKey, args); + result = await etherscanVerify(contractKey, deployedContracts[contractKey], argsFile); + } + else { + result = await etherscanVerify(contractKey, deployedContracts[contractKey]); + } + await updateVerifiedContract(contractKey); + return result; +} + +async function verifyContracts() { + // network = (await hre.ethers.provider.getNetwork()).name; + network = "celo"; + console.log("network : ", network); + deployedContracts = await getDeployedContracts(); + const accounts = await hre.ethers.getSigners(); + if (accounts.length == 0) { + throw new Error("Accounts not set!"); + } + deployer = await accounts[0]; + // proxyOwner = await accounts[1]; + // console.log("proxyOwner address: " + proxyOwner.address); + + // const verifyUsdc = await verifyContract('USDC'); + // console.log(`Verify USDC result: ${verifyUsdc}`); + + const verifyEANFT = await verifyContract('EANFT'); + console.log(`Verify EANFT result: ${verifyEANFT}`); + + // const verifyRNNFT = await verifyContract('RNNFT', [ + // `'${deployedContracts['USDC']}'` + // ]); + // console.log(`Verify RNNFT result: ${verifyRNNFT}`); + + const verifyHumaConfig = await verifyContract('HumaConfig'); + console.log(`Verify HumaConfig result: ${verifyHumaConfig}`); + + const verifyHumaConfigTL = await verifyContract('HumaConfigTimelock', + [ + 0, + `['${HUMA_OWNER_ADDRESS}']`, + `['${deployer.address}']`, + ]); + console.log(`Verify HumaConfigTimelock result: ${verifyHumaConfigTL}`); + + const verifyRWRImpl = await verifyContract('RWReceivableImpl'); + console.log(`Verify RWRImpl result: ${verifyRWRImpl}`); + + const verifyRWR = await verifyContract('RWReceivable', + [ + `'${deployedContracts['RWReceivableImpl']}'`, + `'${deployedContracts['HumaProxyAdminTimelock']}'`, + '[]' + ]); + console.log(`Verify RWR result: ${verifyRWR}`); + + + // const verifyBaseCreditPoolTL = await verifyContract('ArfNewPoolTimelock', + // [ + // 0, + // `['${POOL_OWNER_EOA}']`, + // `['${deployer.address}']`, + // ]); + // console.log(`Verify Pool result: ${verifyBaseCreditPoolTL}`); + + // const verifyBaseCreditPoolProxyAdminTL = await verifyContract('ArfNewPoolProxyAdminTimelock', + // [ + // 0, + // `['${POOL_OWNER_EOA}']`, + // `['${deployer.address}']`, + // ]); + // console.log(`Verify BaseCreditPoolProxyAdminTL result: ${verifyBaseCreditPoolProxyAdminTL}`); + + // const verifyFeeManager = await verifyContract('ArfNewPoolFeeManager'); + // console.log(`Verify FeeManager result: ${verifyFeeManager}`); + + const verifyHDTImpl = await verifyContract('HDTImpl'); + console.log(`Verify HDTImpl result: ${verifyHDTImpl}`); + + // const verifyHDT = await verifyContract('ArfNewHDT', + // [ + // `'${deployedContracts['ArfNewHDTImpl']}'`, + // `'${deployedContracts['ArfNewPoolProxyAdminTimelock']}'`, + // '[]' + // ]); + // console.log(`Verify HDT result: ${verifyHDT}`); + + // const verifyPoolConfig = await verifyContract('ArfNewPoolConfig'); + // console.log(`Verify poolConfig result: ${verifyPoolConfig}`); + + const verifyPoolImpl = await verifyContract('BaseCreditPoolImpl'); + console.log(`Verify PoolImpl result: ${verifyPoolImpl}`); + const verifyRFPoolImpl = await verifyContract('ReceivableFactoringPoolImpl'); + console.log(`Verify PoolImpl result: ${verifyRFPoolImpl}`); + // const verifyPool = await verifyContract('ArfNewPool', + // [ + // `'${deployedContracts['ArfNewPoolImpl']}'`, + // `'${deployedContracts['ArfNewPoolProxyAdminTimelock']}'`, + // '[]', + // ]); + // console.log(`Verify Pool result: ${verifyPool}`); + + const verifyLibFeeManager = await verifyContract('LibFeeManager'); + console.log(`Verify LibFeeManager result: ${verifyLibFeeManager}`); + + const verifyLibPoolConfig = await verifyContract('LibPoolConfig'); + console.log(`Verify LibPoolConfig result: ${verifyLibPoolConfig}`); + + const verifyLibHDT = await verifyContract('LibHDT'); + console.log(`Verify LibHDT result: ${verifyLibHDT}`); + + const verifyLibPool = await verifyContract('LibPool'); + console.log(`Verify LibPool result: ${verifyLibPool}`); + + const verifyPoolFactory = await verifyContract('HumaPoolFactory', + [ + `'${HUMA_OWNER_ADDRESS}'`, + `'${deployedContracts['HumaConfig']}'`, + `'${deployedContracts['HDTImpl']}'`, + `'${deployedContracts['BaseCreditPoolImpl']}'`, + `'${deployedContracts['ReceivableFactoringPoolImpl']}'`, + ]); + console.log(`Verify Pool result: ${verifyPoolFactory}`); + +} + +verifyContracts() + .then(() => process.exit(0)) + .catch((error) => { + console.error(error); + process.exit(1); + }); + +// Reason: Already Verified \ No newline at end of file diff --git a/deployment/goerli-deployed-contracts.json b/deployment/goerli-deployed-contracts.json index 8e542be3..08aa87ab 100644 --- a/deployment/goerli-deployed-contracts.json +++ b/deployment/goerli-deployed-contracts.json @@ -1,41 +1,39 @@ -{ - "USDC": "0xf17FF940864351631b1be3ac03702dEA085ba51c", - "EANFT": "0x026D2AED6f1E9Db160b79688Ea0CE1ABaee4Dc39", - "RNNFT": "0x5D34C9CA746D59a171FdDf22fD1340033c50dBd2", - "HumaConfig": "0x98e77059F8C9BDF3e83A49CD5F5330E5b159014c", - "HumaConfigTimelock": "0x0Fc7E513274cE9559d9Aa09c715DAE06b6658dFA", - "BaseCreditPoolTimelock": "0x6590E419B28fDFDD82fDc221b85344F7E8708197", - "BaseCreditPoolProxyAdminTimelock": "0xdcccF0Ee1732BE26C77d07e860AE21cBE217fcb6", - "BaseCreditPoolFeeManager": "0x673b3C1094AE941bb4b2eF9377DaFE3bcCc4b003", - "BaseCreditHDTImpl": "0x1068AE689f40B2Db2C9771e7aC64345D115DB077", - "BaseCreditHDT": "0x61341186E8C3B7cC0De66ae86C65943797C8Fb99", - "BaseCreditPoolConfig": "0x0d7bae0e14aF194e52Ea2472737b24044fe6e929", - "BaseCreditPoolImpl": "0xec86280b5121821D37534C9B645acBeCE4A503D3", - "BaseCreditPool": "0xA22D20FB0c9980fb96A9B0B5679C061aeAf5dDE4", - "ReceivableFactoringPoolTimelock": "0xb179FEaD504cFAeD016192C668FfA0bc30769840", - "ReceivableFactoringPoolProxyAdminTimelock": "0xdAECE171D686AcC3DA455AA6134cF45114B5b2ba", - "ReceivableFactoringPoolFeeManager": "0x7BA6B8eBC9b09c228582814D44D4a0F2B6B0B9E4", - "HDTImpl": "0x33d6526394a1C0E52293BDa8B7e9647F2266F06a", - "HDT": "0x27Fa332a5cA06492C2007FF4b143C921Cf779C3b", - "ReceivableFactoringPoolConfig": "0xBa779F41ae414dEc63265D79a02DED47fbe007a5", - "ReceivableFactoringPoolImpl": "0x470f71B48B42BE5B4B47D9f9A407bDA98DbDEb8D", - "ReceivableFactoringPool": "0x11672c0bBFF498c72BC2200f42461c0414855042", - "JiaPoolTimelock": "0x8DF7BBae57F1215eE8294D084E08B6a02076eAA5", - "JiaPoolProxyAdminTimelock": "0x87Da18395dc7CE21e0E72e1B01dca0826635FCf0", - "JiaPoolFeeManager": "0x4630ceAedb030b6ad1DCa0E58c3576aa33042b4C", - "JiaHDTImpl": "0x3f95c365aa092E3dF020Bf7E6582E371998Ada4A", - "JiaHDT": "0xAD5e1F01618A2A158097C21866B4e8DCEEA2aC25", - "JiaPoolConfig": "0x9b8513bF9A56E609e66F360B550b7c8724129a05", - "JiaPoolImpl": "0xEb204D979c7aBcA473a0BC780dDf6Ca45E84422f", - "JiaPool": "0x07fd5720FE4d7993550d147c8753A9e60b45940D", - "RWReceivableImpl": "0xf48170cc418c432874d32B03EAc3AC820deEF05E", - "RWReceivable": "0xA1EB18643dd6b75e97D55583BFFfF2311124076f", - "ArfPoolTimelock": "0x025BAC45031309e7bE88F97Ae917AC1B216E3936", - "ArfPoolProxyAdminTimelock": "0x0ebC0e88cAdC182028F146a2eE2472D9c18Dc5B8", - "ArfPoolFeeManager": "0x6cd7E7a6baC464C8a213c8259ef10a42D63D3C20", - "ArfHDTImpl": "0xb3d90151Cc394d9924CBf11D7fB7dA6a366E809D", - "ArfHDT": "0x4322962964AF8E926875618ed7a3b275a484fCC6", - "ArfPoolConfig": "0x78c803d7c985b97884c83eFA30508e9F01a34964", - "ArfPoolImpl": "0x829461DD0b6938E4B1b81fB2fAd66aC191FadB95", - "ArfPool": "0x8e43d748b39497ab65DFF12da8e2c9a1D0855dEe" -} \ No newline at end of file +{"USDC":"0xf17FF940864351631b1be3ac03702dEA085ba51c", +"EANFT":"0x026D2AED6f1E9Db160b79688Ea0CE1ABaee4Dc39", +"RNNFT":"0x5D34C9CA746D59a171FdDf22fD1340033c50dBd2", +"HumaConfig":"0x98e77059F8C9BDF3e83A49CD5F5330E5b159014c", +"HumaConfigTimelock":"0x0Fc7E513274cE9559d9Aa09c715DAE06b6658dFA", +"BaseCreditPoolTimelock":"0x6590E419B28fDFDD82fDc221b85344F7E8708197", +"BaseCreditPoolProxyAdminTimelock":"0xdcccF0Ee1732BE26C77d07e860AE21cBE217fcb6", +"BaseCreditPoolFeeManager":"0x673b3C1094AE941bb4b2eF9377DaFE3bcCc4b003", +"BaseCreditHDTImpl":"0x1068AE689f40B2Db2C9771e7aC64345D115DB077", +"BaseCreditHDT":"0x61341186E8C3B7cC0De66ae86C65943797C8Fb99", +"BaseCreditPoolConfig":"0x0d7bae0e14aF194e52Ea2472737b24044fe6e929", +"BaseCreditPoolImpl":"0xec86280b5121821D37534C9B645acBeCE4A503D3", +"BaseCreditPool":"0xA22D20FB0c9980fb96A9B0B5679C061aeAf5dDE4", +"ReceivableFactoringPoolTimelock":"0xb179FEaD504cFAeD016192C668FfA0bc30769840", +"ReceivableFactoringPoolProxyAdminTimelock":"0xdAECE171D686AcC3DA455AA6134cF45114B5b2ba", +"ReceivableFactoringPoolFeeManager":"0x7BA6B8eBC9b09c228582814D44D4a0F2B6B0B9E4", +"HDTImpl":"0x33d6526394a1C0E52293BDa8B7e9647F2266F06a", +"HDT":"0x27Fa332a5cA06492C2007FF4b143C921Cf779C3b", +"ReceivableFactoringPoolConfig":"0xBa779F41ae414dEc63265D79a02DED47fbe007a5", +"ReceivableFactoringPoolImpl":"0x470f71B48B42BE5B4B47D9f9A407bDA98DbDEb8D", +"ReceivableFactoringPool":"0x11672c0bBFF498c72BC2200f42461c0414855042", +"JiaPoolTimelock":"0x8DF7BBae57F1215eE8294D084E08B6a02076eAA5", +"JiaPoolProxyAdminTimelock":"0x87Da18395dc7CE21e0E72e1B01dca0826635FCf0", +"JiaPoolFeeManager":"0x4630ceAedb030b6ad1DCa0E58c3576aa33042b4C", +"JiaHDTImpl":"0x3f95c365aa092E3dF020Bf7E6582E371998Ada4A", +"JiaHDT":"0xAD5e1F01618A2A158097C21866B4e8DCEEA2aC25", +"JiaPoolConfig":"0x9b8513bF9A56E609e66F360B550b7c8724129a05", +"JiaPoolImpl":"0xEb204D979c7aBcA473a0BC780dDf6Ca45E84422f", +"JiaPool":"0x07fd5720FE4d7993550d147c8753A9e60b45940D", +"RWReceivableImpl":"0xf48170cc418c432874d32B03EAc3AC820deEF05E", +"RWReceivable":"0xA1EB18643dd6b75e97D55583BFFfF2311124076f", +"ArfPoolTimelock":"", +"ArfPoolProxyAdminTimelock":"0x74F1bcfb40A1d7A5A986712382ee2e03b1d472Fb", +"ArfPoolFeeManager":"0x35EC0c62F2185492284ecD1b6ed5aDc5b778B592", +"ArfHDTImpl":"0x67663D157Ea0Cd7075cC149EF64fd5701243Aa2b", +"ArfHDT":"0x8947482a523157A82563720e770E0BE8dfD67Cd7", +"ArfPoolConfig":"0xDE5b0A97017B28A4a55F46B27Ae9B3e89B699672", +"ArfPoolImpl":"0x8a6eb5c93b6ec5Bb213CD9E4a894CE8e08ebFFBf", +"ArfPool":"0x7A0F30f9449aC40eADed6994F1579Fd977506d8a"} \ No newline at end of file diff --git a/deployment/goerli-initialized-contracts.json b/deployment/goerli-initialized-contracts.json index 2634626f..1e6b56c2 100644 --- a/deployment/goerli-initialized-contracts.json +++ b/deployment/goerli-initialized-contracts.json @@ -13,4 +13,7 @@ "JiaPoolConfig":"Done", "JiaPool":"Done", "ArfPoolFeeManager":"Done", -"ArfHDT":"Done"} \ No newline at end of file +"ArfHDT":"Done", +"RWReceivable":"Done", +"ArfPoolConfig":"Done", +"ArfPool":"Done"} \ No newline at end of file diff --git a/deployment/goerli-verified-contracts.json b/deployment/goerli-verified-contracts.json index 2f42ecef..fb389728 100644 --- a/deployment/goerli-verified-contracts.json +++ b/deployment/goerli-verified-contracts.json @@ -29,7 +29,7 @@ "JiaPool":"Done", "RWReceivableImpl":"Done", "RWReceivable":"Done", -"ArfPoolTimelock":"Done", +"ArfPoolTimelock":"", "ArfPoolProxyAdminTimelock":"Done", "ArfPoolFeeManager":"Done", "ArfHDTImpl":"Done", diff --git a/deployment/matic-deployed-contracts.json b/deployment/matic-deployed-contracts.json index 3605ea47..eb263988 100644 --- a/deployment/matic-deployed-contracts.json +++ b/deployment/matic-deployed-contracts.json @@ -25,4 +25,12 @@ "JiaPioneerHDT":"0xc6CF8FF8a4B7f1530AC2f0531614C824285009f8", "JiaPioneerPoolConfig":"0x901427A8328139E59EA2401cBD6bB5b1F5e72E37", "JiaPioneerPoolImpl":"0x2cffAAf7885530E1C5a9684eBbe397d6f1De48d8", -"JiaPioneerPool":"0xe8926aDbFADb5DA91CD56A7d5aCC31AA3FDF47E5"} \ No newline at end of file +"JiaPioneerPool":"0xe8926aDbFADb5DA91CD56A7d5aCC31AA3FDF47E5", +"ArfPoolTimelock":"0x0735F775530D09d9419966FEa09f6f128620eb3d", +"ArfPoolProxyAdminTimelock":"0xF1F6D006ab76706C2538aF47D5091Decd61b28CB", +"ArfPoolFeeManager":"0xa42b10EcBA1fd953aeCc6Ce991D8dD26F8055C8a", +"ArfHDTImpl":"0x91E68909Ab9fB3D362ddE5949B77f369e98EdeaD", +"ArfHDT":"0xF68173AC6817961833C7FF303C0453e18fF6aBd2", +"ArfPoolConfig":"0x9570CdEe2abb43eF0DbE502d3eBB11AaebbCb77F", +"ArfPoolImpl":"0xAd19f43eC0903005C297EE555e34500C61dA5913", +"ArfPool":"0x91EaCEC15839Cc9Ec7083288E205C7f1EBfcdf62"} \ No newline at end of file diff --git a/deployment/matic-initialized-contracts.json b/deployment/matic-initialized-contracts.json index 1bb006f7..b4d1c022 100644 --- a/deployment/matic-initialized-contracts.json +++ b/deployment/matic-initialized-contracts.json @@ -10,4 +10,9 @@ "JiaPioneerPoolFeeManager":"Done", "JiaPioneerHDT":"Done", "JiaPioneerPoolConfig":"Done", -"JiaPioneerPool":"Done"} \ No newline at end of file +"JiaPioneerPool":"Done", +"EANFT":"Done", +"ArfPoolFeeManager":"Done", +"ArfHDT":"Done", +"ArfPoolConfig":"Done", +"ArfPool":"Done"} \ No newline at end of file diff --git a/deployment/matic-verified-contracts.json b/deployment/matic-verified-contracts.json index 178b1d56..a5b784c7 100644 --- a/deployment/matic-verified-contracts.json +++ b/deployment/matic-verified-contracts.json @@ -14,4 +14,12 @@ "BaseCreditPool":"Done", "BaseCreditHDTImpl":"Done", "BaseCreditHDT":"Done", -"JiaPioneerPoolConfig":"Done"} \ No newline at end of file +"JiaPioneerPoolConfig":"Done", +"ArfPoolTimelock":"Done", +"ArfPoolProxyAdminTimelock":"Done", +"ArfPoolFeeManager":"Done", +"ArfHDTImpl":"Done", +"ArfHDT":"Done", +"ArfPoolConfig":"Done", +"ArfPoolImpl":"Done", +"ArfPool":"Done"} \ No newline at end of file diff --git a/deployment/sepolia/deploy-arf-pool.js b/deployment/sepolia/deploy-arf-pool.js index 600aea5c..85c25555 100644 --- a/deployment/sepolia/deploy-arf-pool.js +++ b/deployment/sepolia/deploy-arf-pool.js @@ -31,11 +31,11 @@ async function deployContracts() { [], ]); - const baseCreditPoolTL = await deploy("TimelockController", "ArfPoolTimelock", [ - 0, - [POOL_OWNER_EOA], - [deployer.address], - ]); + // const baseCreditPoolTL = await deploy("TimelockController", "ArfPoolTimelock", [ + // 0, + // [POOL_OWNER_EOA], + // [deployer.address], + // ]); const baseCreditPoolProxyAdminTL = await deploy("TimelockController", "ArfPoolProxyAdminTimelock", [ 0, diff --git a/deployment/sepolia/init-arf-pool-defender.js b/deployment/sepolia/init-arf-pool-defender.js index af6e229b..b0526a98 100644 --- a/deployment/sepolia/init-arf-pool-defender.js +++ b/deployment/sepolia/init-arf-pool-defender.js @@ -125,7 +125,7 @@ async function initBaseCreditPoolFeeManager() { ); // await sendTransaction("FeeManager", feeManager, "setMinPrincipalRateInBps", [0]); - await transferOwnershipToTL("BaseFeeManager", "ArfPoolFeeManager", "ArfPoolTimelock"); + // await transferOwnershipToTL("BaseFeeManager", "ArfPoolFeeManager", "ArfPoolTimelock"); await updateInitilizedContract("ArfPoolFeeManager"); } @@ -160,7 +160,7 @@ async function initBaseCreditPoolHDT() { await sendTransaction("HDT", hdt, "setPool", [deployedContracts["ArfPool"]]); - await transferOwnershipToTL("HDT", "ArfHDT", "ArfPoolTimelock"); + // await transferOwnershipToTL("HDT", "ArfHDT", "ArfPoolTimelock"); await updateInitilizedContract("ArfHDT"); } @@ -206,12 +206,12 @@ async function initBaseCreditPoolConfig() { const BaseFeeManager = await hre.ethers.getContractFactory("BaseFeeManager"); const feeManager = BaseFeeManager.attach(deployedContracts["ArfPoolFeeManager"]); - // await sendTransaction("ArfPoolConfig", poolConfig, "initialize", [ - // "ArfPool", - // hdt.address, - // humaConfig.address, - // feeManager.address, - // ]); + await sendTransaction("ArfPoolConfig", poolConfig, "initialize", [ + "ArfPool", + hdt.address, + humaConfig.address, + feeManager.address, + ]); const decimals = await hdt.decimals(); console.log("decimals: " + BigInt(decimals)); @@ -236,11 +236,11 @@ async function initBaseCreditPoolConfig() { [0, 0] ); - await sendTransaction("ArfPoolConfig", poolConfig, "setEvaluationAgent", [ - 1, - deployer.address, - ]); - + // await sendTransaction("ArfPoolConfig", poolConfig, "setEvaluationAgent", [ + // 1, + // deployer.address, + // ]); + const maxCL = BigInt(10_000)*(BigInt(10)**(BigInt(decimals))); console.log("maxCL: " + maxCL); await sendTransaction("ArfPoolConfig", poolConfig, "setMaxCreditLine", [maxCL]); @@ -257,7 +257,7 @@ async function initBaseCreditPoolConfig() { await sendTransaction("ArfPoolConfig", poolConfig, "setCreditApprovalExpiration", [30]); - await transferOwnershipToTL("BasePoolConfig", "ArfPoolConfig", "ArfPoolTimelock"); + // await transferOwnershipToTL("BasePoolConfig", "ArfPoolConfig", "ArfPoolTimelock"); await updateInitilizedContract("ArfPoolConfig"); } @@ -319,10 +319,10 @@ async function prepareBaseCreditPool() { const pool = BaseCreditPool.attach(deployedContracts["ArfPool"]) // const poolFrombcpOperator = pool.connect(bcpOperator); - await sendTransaction("ArfPool", poolFrombcpOperator, "addApprovedLender", [deployer.address]); - // await sendTransaction("ArfPool", poolFrombcpOperator, "addApprovedLender", [ea_bcp.address]); - // await sendTransaction("ArfPool", poolFrombcpOperator, "addApprovedLender", [lender.address]); - await sendTransaction("ArfPool", poolFrombcpOperator, "addApprovedLender", [poolTreasury.address]); + // await sendTransaction("ArfPool", pool, "addApprovedLender", [deployer.address]); + // // await sendTransaction("ArfPool", poolFrombcpOperator, "addApprovedLender", [ea_bcp.address]); + // // await sendTransaction("ArfPool", poolFrombcpOperator, "addApprovedLender", [lender.address]); + // await sendTransaction("ArfPool", pool, "addApprovedLender", [poolTreasury.address]); const USDC = await hre.ethers.getContractFactory("TestToken"); const usdc = USDC.attach(deployedContracts["USDC"]); @@ -333,9 +333,9 @@ async function prepareBaseCreditPool() { const poolFromPoolOwnerTreasury = await pool.connect(poolTreasury); const amountOwner = BigInt(20_000)*(BigInt(10)**(BigInt(decimals))); console.log("owner to deposit: " + amountOwner); - await sendTransaction("TestToken", usdc, "mint", [bcpOwnerTreasury.address, amountOwner]); - await sendTransaction("TestToken", usdcFromPoolOwnerTreasury, "approve", [pool.address, amountOwner]); - await sendTransaction("ArfPool", poolFromPoolOwnerTreasury, "makeInitialDeposit", [amountOwner]); + // await sendTransaction("TestToken", usdc, "mint", [poolTreasury.address, amountOwner]); + // await sendTransaction("TestToken", usdcFromPoolOwnerTreasury, "approve", [pool.address, amountOwner]); + // await sendTransaction("ArfPool", poolFromPoolOwnerTreasury, "makeInitialDeposit", [amountOwner]); // EA // const usdcFromEA = await usdc.connect(ea_bcp); @@ -345,7 +345,7 @@ async function prepareBaseCreditPool() { // await sendTransaction("TestToken", usdcFromEA, "approve", [poolFromEA.address, amountEA]); // await sendTransaction("BaseCreditPool", poolFromEA, "makeInitialDeposit", [amountEA]); - // await sendTransaction("BaseCreditPool", pool, "enablePool", []); + await sendTransaction("ArfPool", pool, "enablePool", []); } async function initContracts() { @@ -369,7 +369,7 @@ async function initContracts() { await initBaseCreditPool(); await initRWR(); - // await prepareBaseCreditPool(); + await prepareBaseCreditPool(); } diff --git a/deployment/sepolia/verify-arf-pool.js b/deployment/sepolia/verify-arf-pool.js index 88117788..bc736ebc 100644 --- a/deployment/sepolia/verify-arf-pool.js +++ b/deployment/sepolia/verify-arf-pool.js @@ -126,13 +126,13 @@ async function verifyContracts() { console.log(`Verify RWR result: ${verifyRWR}`); - const verifyBaseCreditPoolTL = await verifyContract('ArfPoolTimelock', - [ - 0, - `['${POOL_OWNER_EOA}']`, - `['${deployer.address}']`, - ]); - console.log(`Verify ArfPoolTimelock result: ${verifyBaseCreditPoolTL}`); + // const verifyBaseCreditPoolTL = await verifyContract('ArfPoolTimelock', + // [ + // 0, + // `['${POOL_OWNER_EOA}']`, + // `['${deployer.address}']`, + // ]); + // console.log(`Verify ArfPoolTimelock result: ${verifyBaseCreditPoolTL}`); const verifyBaseCreditPoolProxyAdminTL = await verifyContract('ArfPoolProxyAdminTimelock', [ diff --git a/deployment/utils.js b/deployment/utils.js index 6237c6ed..ae04a66b 100644 --- a/deployment/utils.js +++ b/deployment/utils.js @@ -2,8 +2,8 @@ const {BigNumber: BN, ethers} = require("ethers"); const fs = require("fs"); const DEPLOYED_PATH = "./deployment/"; -const MAX_FEE_PER_GAS = 9_000_000_000; -const MAX_PRIORITY_FEE_PER_GAS = 2_000_000_000; +const MAX_FEE_PER_GAS = 5_000_000_000; +const MAX_PRIORITY_FEE_PER_GAS = 0; const getContractAddressFile = async function (fileType = "deployed", network) { if (!network) { @@ -119,14 +119,21 @@ const sendTransaction = async function ( console.log(`${contractName}:${logMessage} End!`); }; -async function deploy(contractName, keyName, contractParameters, deployer) { +async function deploy(contractName, keyName, contractParameters, libraries, deployer) { const deployed = await getDeployedContract(keyName); if (deployed) { console.log(`${keyName} already deployed: ${deployed}`); let Contract = await hre.ethers.getContractFactory(contractName); return Contract.attach(deployed); } - let Contract = await hre.ethers.getContractFactory(contractName); + + let Contract; + if (libraries) { + Contract = await hre.ethers.getContractFactory(contractName, libraries); + } else { + Contract = await hre.ethers.getContractFactory(contractName); + } + if (deployer) { Contract = Contract.connect(deployer); } diff --git a/hardhat.config.js b/hardhat.config.js index dcbf2e7e..baab302a 100644 --- a/hardhat.config.js +++ b/hardhat.config.js @@ -1,8 +1,7 @@ -require("dotenv").config(); require("hardhat-contract-sizer"); require("@nomicfoundation/hardhat-chai-matchers"); -require("@tenderly/hardhat-tenderly"); +// require("@tenderly/hardhat-tenderly"); require("hardhat-gas-reporter"); require("hardhat-abi-exporter"); @@ -12,7 +11,6 @@ require("@nomiclabs/hardhat-etherscan"); require("hardhat-prettier"); require("solidity-coverage"); -require("hardhat-abi-exporter"); require("hardhat-celo"); require("dotenv").config(); const fs = require("fs"); @@ -238,9 +236,14 @@ module.exports = { }, alfajores: { url: "https://alfajores-forno.celo-testnet.org", - accounts: [deployer, eaService, poolTreasury], + accounts: [deployer, eaService], chainId: 44787 }, + celo: { + url: "https://forno.celo.org", + accounts: [deployer, eaService], + chainId: 42220 + }, sepolia: { url: sepoliaUrl, accounts: [deployer, eaService, poolTreasury], @@ -386,7 +389,19 @@ module.exports = { polygon: process.env.POLYGONSCAN_API_KEY || null, mainnet: process.env.ETHERSCAN_API_KEY || null, sepolia: process.env.ETHERSCAN_API_KEY || null, + alfajores: process.env.CELOSCAN_API_KEY || null, + celo: process.env.CELOSCAN_API_KEY || null, }, + // customChains: [ + // { + // network: "alfajores", + // chainId: 44787, + // urls: { + // apiURL: "https://api-alfajores.celoscan.io/api", + // browserURL: "https://alfajores.celoscan.io/" + // } + // } + // ] }, contractSizer: { alphaSort: true, diff --git a/package.json b/package.json index 655b4d44..be018165 100644 --- a/package.json +++ b/package.json @@ -1,35 +1,7 @@ { "name": "huma-contract", "version": "1.0.0", - "license": "MIT", - "devDependencies": { - "@nomicfoundation/hardhat-chai-matchers": "^1.0.5", - "@nomicfoundation/hardhat-network-helpers": "^1.0.0", - "@nomiclabs/hardhat-ethers": "^2.1.1", - "@nomiclabs/hardhat-etherscan": "^3.1.0", - "@openzeppelin/hardhat-upgrades": "^1.23.1", - "@tenderly/hardhat-tenderly": "^1.1.6", - "@typechain/ethers-v5": "^10.1.0", - "@typechain/hardhat": "^6.1.2", - "@types/mocha": "^9.1.0", - "chai": "^4.3.6", - "ethers": "^5.4.7", - "hardhat-abi-exporter": "^2.10.0", - "hardhat-celo": "^0.0.4", - "hardhat-contract-sizer": "^2.6.1", - "hardhat-gas-reporter": "^1.0.9", - "hardhat-prettier": "^0.0.1", - "husky": "^8.0.1", - "node-watch": "^0.7.3", - "prettier": "^2.7.1", - "prettier-plugin-solidity": "^1.0.0-beta.24", - "qrcode-terminal": "^0.12.0", - "solhint": "^3.3.7", - "solidity-coverage": "^0.8.2", - "ts-node": ">=8.0.0", - "typechain": "^8.1.0", - "typescript": "^4.8.2" - }, + "license": "LGPL-3.0-or-later", "scripts": { "build": "hardhat compile", "chain": "hardhat node", @@ -44,17 +16,36 @@ "gitleaks": "bash scripts/gitleaks.sh" }, "dependencies": { - "@openzeppelin/contracts": "^4.7.3", - "@openzeppelin/contracts-upgradeable": "^4.8.3", - "dotenv": "^16.0.2", - "hardhat": "^2.11.1" + "@openzeppelin/contracts": "4.7.3", + "@openzeppelin/contracts-upgradeable": "4.8.3", + "hardhat": "^2.17.1" }, - "resolutions": { - "flat": "^5.0.2", - "minimatch": "^3.1.2", - "undici": "^5.22.1", - "semver": "^5.7.2", - "tough-cookie": "^4.1.3", - "word-wrap": "^1.2.4" + "devDependencies": { + "@nomicfoundation/hardhat-chai-matchers": "^1.0.5", + "@nomicfoundation/hardhat-ethers": "^3.0.4", + "@nomicfoundation/hardhat-network-helpers": "^1.0.8", + "@nomiclabs/hardhat-ethers": "^2.2.3", + "@nomiclabs/hardhat-etherscan": "^3.1.7", + "@openzeppelin/hardhat-upgrades": "^2.1.0", + "@typechain/ethers-v5": "^11.1.1", + "@typechain/hardhat": "^8.0.3", + "@types/mocha": "^10.0.1", + "chai": "^4.3.7", + "dotenv": "^16.3.1", + "ethers": "^5.7.2", + "hardhat-abi-exporter": "^2.10.1", + "hardhat-celo": "^0.0.4", + "hardhat-contract-sizer": "^2.10.0", + "hardhat-gas-reporter": "^1.0.9", + "hardhat-prettier": "^0.0.1", + "husky": "^8.0.3", + "node-watch": "^0.7.4", + "prettier": "^3.0.1", + "prettier-plugin-solidity": "^1.1.3", + "solhint": "^3.5.1", + "solidity-coverage": "^0.8.4", + "ts-node": "^10.9.1", + "typechain": "^8.3.1", + "typescript": "^5.1.6" } -} +} \ No newline at end of file diff --git a/test/factoryTest.js b/test/factoryTest.js index 062865d8..c36ea3fb 100644 --- a/test/factoryTest.js +++ b/test/factoryTest.js @@ -117,7 +117,7 @@ describe("Huma Config", function () { newBaseCreditPoolImpl = await NewImpl.deploy(); await poolFactory.connect(protocolOwner).setBaseCredtiPoolImplAddress(newBaseCreditPoolImpl.address); await expect(await poolFactory.baseCreditPoolImplAddress()).to.equal(newBaseCreditPoolImpl.address); - console.log(await poolFactory.baseCreditPoolImplAddress()); + // console.log(await poolFactory.baseCreditPoolImplAddress()); }); it("Other accounts cannot set new BaseCredtiPoolImpl", async function () { const NewImpl = await ethers.getContractFactory("BaseCreditPool"); @@ -125,7 +125,7 @@ describe("Huma Config", function () { await expect( poolFactory.setHDTImplAddress(newImpl.address) ).to.be.revertedWith(/AccessControl: account .* is missing role .*/); - console.log(await poolFactory.baseCreditPoolImplAddress()); + // console.log(await poolFactory.baseCreditPoolImplAddress()); }); it("Owner can set new receivableFactoringPoolImpl Address", async function () { const NewImpl = await ethers.getContractFactory("ReceivableFactoringPool"); @@ -151,7 +151,6 @@ describe("Huma Config", function () { }); describe("Creating pools", function () { it("Non-deployer cannot create pools", async function () { - console.log(await poolFactory.baseCreditPoolImplAddress()); await expect( poolFactory.connect(protocolOwner).createBaseCreditPool( 'Testing pool', @@ -202,6 +201,7 @@ describe("Huma Config", function () { }); describe("Initialize pools", function () { it("Initialize Fee Manager", async function () { + await expect(poolFactory.updatePoolStatus(poolAddress)).to.be.revertedWith("FEE_MANAGER_NOT_INITIALIZED"); await poolFactory.initializePoolFeeManager( poolAddress, 0, @@ -213,6 +213,7 @@ describe("Huma Config", function () { ); }); it("Initialize HDT", async function () { + await expect(poolFactory.updatePoolStatus(poolAddress)).to.be.revertedWith("HDT_NOT_INITIALIZED"); await poolFactory.initializeHDT( poolAddress, "Test HDT", @@ -221,6 +222,7 @@ describe("Huma Config", function () { ); }); it("Initialize Pool Config", async function () { + await expect(poolFactory.updatePoolStatus(poolAddress)).to.be.revertedWith("POOL_CONFIG_NOT_INITIALIZED"); await poolFactory.initializePoolConfigOne( poolAddress, poolOwner.address, @@ -236,10 +238,12 @@ describe("Huma Config", function () { 0, 1000_000_000, 1000, - 0 + 0, + deployer.address ); }); it("Initialize Pool", async function () { + await expect(poolFactory.updatePoolStatus(poolAddress)).to.be.revertedWith("POOL_NOT_INITIALIZED"); await poolFactory.initializePool( poolAddress ); @@ -248,7 +252,8 @@ describe("Huma Config", function () { describe("Updating pool status", function () { it("Pool should be initialized", async function () { await poolFactory.updatePoolStatus(poolAddress); - console.log(await poolFactory.checkPool(poolAddress)); + const poolStatus = await poolFactory.checkPool(poolAddress); + await expect(poolStatus['poolStatus']).to.equal(1); }); }); }); diff --git a/yarn.lock b/yarn.lock index 833e9b7b..4a873ea2 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2,25 +2,59 @@ # yarn lockfile v1 +"@aws-crypto/sha256-js@1.2.2": + version "1.2.2" + resolved "https://registry.yarnpkg.com/@aws-crypto/sha256-js/-/sha256-js-1.2.2.tgz#02acd1a1fda92896fc5a28ec7c6e164644ea32fc" + integrity sha512-Nr1QJIbW/afYYGzYvrF70LtaHrIRtd4TNAglX8BvlfxJLZ45SAmueIKYl5tWoNBPzp65ymXGFK0Bb1vZUpuc9g== + dependencies: + "@aws-crypto/util" "^1.2.2" + "@aws-sdk/types" "^3.1.0" + tslib "^1.11.1" + +"@aws-crypto/util@^1.2.2": + version "1.2.2" + resolved "https://registry.yarnpkg.com/@aws-crypto/util/-/util-1.2.2.tgz#b28f7897730eb6538b21c18bd4de22d0ea09003c" + integrity sha512-H8PjG5WJ4wz0UXAFXeJjWCW1vkvIJ3qUUD+rGRwJ2/hj+xT58Qle2MTql/2MGzkU+1JLAFuR6aJpLAjHwhmwwg== + dependencies: + "@aws-sdk/types" "^3.1.0" + "@aws-sdk/util-utf8-browser" "^3.0.0" + tslib "^1.11.1" + +"@aws-sdk/types@^3.1.0": + version "3.378.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/types/-/types-3.378.0.tgz#93a811ccdf15c81b1947f1cd67922c4690792189" + integrity sha512-qP0CvR/ItgktmN8YXpGQglzzR/6s0nrsQ4zIfx3HMwpsBTwuouYahcCtF1Vr82P4NFcoDA412EJahJ2pIqEd+w== + dependencies: + "@smithy/types" "^2.0.2" + tslib "^2.5.0" + +"@aws-sdk/util-utf8-browser@^3.0.0": + version "3.259.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/util-utf8-browser/-/util-utf8-browser-3.259.0.tgz#3275a6f5eb334f96ca76635b961d3c50259fd9ff" + integrity sha512-UvFa/vR+e19XookZF8RzFZBrw2EUkQWxiBW0yYQAhvk3C+QVGl0H3ouca8LDBlBfQKXwmW3huo/59H8rwb1wJw== + dependencies: + tslib "^2.3.1" + "@babel/code-frame@^7.0.0": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.18.6.tgz#3b25d38c89600baa2dcc219edfa88a74eb2c427a" - integrity sha512-TDCmlK5eOvH+eH7cdAFlNXeVJqWIQ7gW9tY1GJIpUtFb6CmjVyq2VM3u71bOyR8CRihcCgMUYoDNyLXao3+70Q== + version "7.22.10" + resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.22.10.tgz#1c20e612b768fefa75f6e90d6ecb86329247f0a3" + integrity sha512-/KKIMG4UEL35WmI9OlvMhurwtytjvXoFcGNrOvyG9zIzA8YmPjVtIZUf7b05+TPO7G7/GEmLHDaoCgACHl9hhA== dependencies: - "@babel/highlight" "^7.18.6" + "@babel/highlight" "^7.22.10" + chalk "^2.4.2" -"@babel/helper-validator-identifier@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.18.6.tgz#9c97e30d31b2b8c72a1d08984f2ca9b574d7a076" - integrity sha512-MmetCkz9ej86nJQV+sFCxoGGrUbU3q02kgLciwkrt9QqEB7cP39oKEY0PakknEO0Gu20SskMRi+AYZ3b1TpN9g== +"@babel/helper-validator-identifier@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.5.tgz#9544ef6a33999343c8740fa51350f30eeaaaf193" + integrity sha512-aJXu+6lErq8ltp+JhkJUfk1MTGyuA4v7f3pA+BJ5HLfNC6nAQ0Cpi9uOquUj8Hehg0aUiHzWQbOVJGao6ztBAQ== -"@babel/highlight@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.18.6.tgz#81158601e93e2563795adcbfbdf5d64be3f2ecdf" - integrity sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g== +"@babel/highlight@^7.22.10": + version "7.22.10" + resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.22.10.tgz#02a3f6d8c1cb4521b2fd0ab0da8f4739936137d7" + integrity sha512-78aUtVcT7MUscr0K5mIEnkwxPE0MaxkR5RxRwuHaQ+JuU5AmTPhY+do2mdzVTnIJJpyBglql2pehuBIWHug+WQ== dependencies: - "@babel/helper-validator-identifier" "^7.18.6" - chalk "^2.0.0" + "@babel/helper-validator-identifier" "^7.22.5" + chalk "^2.4.2" js-tokens "^4.0.0" "@chainsafe/as-sha256@^0.3.1": @@ -71,7 +105,7 @@ dependencies: "@jridgewell/trace-mapping" "0.3.9" -"@ethersproject/abi@5.7.0", "@ethersproject/abi@^5.0.0-beta.146", "@ethersproject/abi@^5.0.9", "@ethersproject/abi@^5.1.2", "@ethersproject/abi@^5.5.0", "@ethersproject/abi@^5.7.0": +"@ethersproject/abi@5.7.0", "@ethersproject/abi@^5.0.0-beta.146", "@ethersproject/abi@^5.0.9", "@ethersproject/abi@^5.1.2", "@ethersproject/abi@^5.5.0", "@ethersproject/abi@^5.6.3", "@ethersproject/abi@^5.7.0": version "5.7.0" resolved "https://registry.yarnpkg.com/@ethersproject/abi/-/abi-5.7.0.tgz#b3f3e045bbbeed1af3947335c247ad625a44e449" integrity sha512-351ktp42TiRcYB3H1OP8yajPeAQstMW/yCFokj/AthP9bLHzQFPlOrxOcwYEDkUAICmOHljvN4K39OMTMUa9RA== @@ -136,7 +170,7 @@ "@ethersproject/bytes" "^5.7.0" "@ethersproject/properties" "^5.7.0" -"@ethersproject/bignumber@5.7.0", "@ethersproject/bignumber@^5.6.2", "@ethersproject/bignumber@^5.7.0": +"@ethersproject/bignumber@5.7.0", "@ethersproject/bignumber@^5.7.0": version "5.7.0" resolved "https://registry.yarnpkg.com/@ethersproject/bignumber/-/bignumber-5.7.0.tgz#e2f03837f268ba655ffba03a57853e18a18dc9c2" integrity sha512-n1CAdIHRWjSucQO3MC1zPSVgV/6dy/fjL9pMrPP9peL+QxEg9wOsVqwD4+818B6LUEtaXzVHQiuivzRoxPxUGw== @@ -240,13 +274,6 @@ resolved "https://registry.yarnpkg.com/@ethersproject/logger/-/logger-5.7.0.tgz#6ce9ae168e74fecf287be17062b590852c311892" integrity sha512-0odtFdXu/XHtjQXJYA3u9G0G8btm0ND5Cu8M7i5vhEcE8/HmF4Lbdqanwyv4uQTr2tx6b7fQRmgLrsnpQlmnig== -"@ethersproject/networks@5.7.0": - version "5.7.0" - resolved "https://registry.yarnpkg.com/@ethersproject/networks/-/networks-5.7.0.tgz#df72a392f1a63a57f87210515695a31a245845ad" - integrity sha512-MG6oHSQHd4ebvJrleEQQ4HhVu8Ichr0RDYEfHzsVAVjHNM+w36x9wp9r+hf1JstMXtseXDtkiVoARAG6M959AA== - dependencies: - "@ethersproject/logger" "^5.7.0" - "@ethersproject/networks@5.7.1", "@ethersproject/networks@^5.7.0": version "5.7.1" resolved "https://registry.yarnpkg.com/@ethersproject/networks/-/networks-5.7.1.tgz#118e1a981d757d45ccea6bb58d9fd3d9db14ead6" @@ -269,32 +296,6 @@ dependencies: "@ethersproject/logger" "^5.7.0" -"@ethersproject/providers@5.7.0": - version "5.7.0" - resolved "https://registry.yarnpkg.com/@ethersproject/providers/-/providers-5.7.0.tgz#a885cfc7650a64385e7b03ac86fe9c2d4a9c2c63" - integrity sha512-+TTrrINMzZ0aXtlwO/95uhAggKm4USLm1PbeCBR/3XZ7+Oey+3pMyddzZEyRhizHpy1HXV0FRWRMI1O3EGYibA== - dependencies: - "@ethersproject/abstract-provider" "^5.7.0" - "@ethersproject/abstract-signer" "^5.7.0" - "@ethersproject/address" "^5.7.0" - "@ethersproject/base64" "^5.7.0" - "@ethersproject/basex" "^5.7.0" - "@ethersproject/bignumber" "^5.7.0" - "@ethersproject/bytes" "^5.7.0" - "@ethersproject/constants" "^5.7.0" - "@ethersproject/hash" "^5.7.0" - "@ethersproject/logger" "^5.7.0" - "@ethersproject/networks" "^5.7.0" - "@ethersproject/properties" "^5.7.0" - "@ethersproject/random" "^5.7.0" - "@ethersproject/rlp" "^5.7.0" - "@ethersproject/sha2" "^5.7.0" - "@ethersproject/strings" "^5.7.0" - "@ethersproject/transactions" "^5.7.0" - "@ethersproject/web" "^5.7.0" - bech32 "1.1.4" - ws "7.4.6" - "@ethersproject/providers@5.7.2", "@ethersproject/providers@^5.7.1", "@ethersproject/providers@^5.7.2": version "5.7.2" resolved "https://registry.yarnpkg.com/@ethersproject/providers/-/providers-5.7.2.tgz#f8b1a4f275d7ce58cf0a2eec222269a08beb18cb" @@ -424,17 +425,6 @@ "@ethersproject/transactions" "^5.7.0" "@ethersproject/wordlists" "^5.7.0" -"@ethersproject/web@5.7.0": - version "5.7.0" - resolved "https://registry.yarnpkg.com/@ethersproject/web/-/web-5.7.0.tgz#40850c05260edad8b54827923bbad23d96aac0bc" - integrity sha512-ApHcbbj+muRASVDSCl/tgxaH2LBkRMEYfLOLVa0COipx0+nlu0QKet7U2lEg0vdkh8XRSLf2nd1f1Uk9SrVSGA== - 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" - "@ethersproject/web@5.7.1", "@ethersproject/web@^5.7.0": version "5.7.1" resolved "https://registry.yarnpkg.com/@ethersproject/web/-/web-5.7.1.tgz#de1f285b373149bee5928f4eb7bcb87ee5fbb4ae" @@ -652,18 +642,25 @@ rustbn.js "~0.2.0" "@nomicfoundation/hardhat-chai-matchers@^1.0.5": - version "1.0.5" - resolved "https://registry.yarnpkg.com/@nomicfoundation/hardhat-chai-matchers/-/hardhat-chai-matchers-1.0.5.tgz#75d08bd9bd84a3cb7950be6bd27171a294516b01" - integrity sha512-+W5C/+5FHI2xBajUN9THSNc1UP6FUsA7LeLmfnaC9VMi/50/DEjjxd8OmizEXgV1Bjck7my4NVQLL1Ti39FkpA== + version "1.0.6" + resolved "https://registry.yarnpkg.com/@nomicfoundation/hardhat-chai-matchers/-/hardhat-chai-matchers-1.0.6.tgz#72a2e312e1504ee5dd73fe302932736432ba96bc" + integrity sha512-f5ZMNmabZeZegEfuxn/0kW+mm7+yV7VNDxLpMOMGXWFJ2l/Ct3QShujzDRF9cOkK9Ui/hbDeOWGZqyQALDXVCQ== dependencies: "@ethersproject/abi" "^5.1.2" "@types/chai-as-promised" "^7.1.3" chai-as-promised "^7.1.1" - chalk "^2.4.2" deep-eql "^4.0.1" ordinal "^1.0.3" -"@nomicfoundation/hardhat-network-helpers@^1.0.0": +"@nomicfoundation/hardhat-ethers@^3.0.4": + version "3.0.4" + resolved "https://registry.yarnpkg.com/@nomicfoundation/hardhat-ethers/-/hardhat-ethers-3.0.4.tgz#6f0df2424e687e26d6574610de7a36bd69485cc1" + integrity sha512-k9qbLoY7qn6C6Y1LI0gk2kyHXil2Tauj4kGzQ8pgxYXIGw8lWn8tuuL72E11CrlKaXRUvOgF0EXrv/msPI2SbA== + dependencies: + debug "^4.1.1" + lodash.isequal "^4.5.0" + +"@nomicfoundation/hardhat-network-helpers@^1.0.8": version "1.0.8" resolved "https://registry.yarnpkg.com/@nomicfoundation/hardhat-network-helpers/-/hardhat-network-helpers-1.0.8.tgz#e4fe1be93e8a65508c46d73c41fa26c7e9f84931" integrity sha512-MNqQbzUJZnCMIYvlniC3U+kcavz/PhhQSsY90tbEtUyMj/IQqsLwIRZa4ctjABh3Bz0KCh9OXUZ7Yk/d9hr45Q== @@ -741,17 +738,12 @@ "@nomicfoundation/solidity-analyzer-win32-ia32-msvc" "0.1.1" "@nomicfoundation/solidity-analyzer-win32-x64-msvc" "0.1.1" -"@nomiclabs/hardhat-ethers@^2.0.6": - version "2.1.1" - resolved "https://registry.yarnpkg.com/@nomiclabs/hardhat-ethers/-/hardhat-ethers-2.1.1.tgz#3f1d1ab49813d1bae4c035cc1adec224711e528b" - integrity sha512-Gg0IFkT/DW3vOpih4/kMjeZCLYqtfgECLeLXTs7ZDPzcK0cfoc5wKk4nq5n/izCUzdhidO/Utd6ptF9JrWwWVA== - -"@nomiclabs/hardhat-ethers@^2.1.1": +"@nomiclabs/hardhat-ethers@^2.2.3": version "2.2.3" resolved "https://registry.yarnpkg.com/@nomiclabs/hardhat-ethers/-/hardhat-ethers-2.2.3.tgz#b41053e360c31a32c2640c9a45ee981a7e603fe0" integrity sha512-YhzPdzb612X591FOe68q+qXVXGG2ANZRvDo0RRUtimev85rCrAlv/TLMEZw5c+kq9AbzocLTVX/h2jVIFPL9Xg== -"@nomiclabs/hardhat-etherscan@^3.1.0": +"@nomiclabs/hardhat-etherscan@^3.1.7": version "3.1.7" resolved "https://registry.yarnpkg.com/@nomiclabs/hardhat-etherscan/-/hardhat-etherscan-3.1.7.tgz#72e3d5bd5d0ceb695e097a7f6f5ff6fcbf062b9a" integrity sha512-tZ3TvSgpvsQ6B6OGmo1/Au6u8BrAkvs1mIC/eURA3xgIfznUZBhmpne8hv7BXUzw9xNL3fXdpOYgOQlVMTcoHQ== @@ -767,38 +759,64 @@ table "^6.8.0" undici "^5.14.0" -"@openzeppelin/contracts-upgradeable@^4.8.3": +"@openzeppelin/contracts-upgradeable@4.8.3": version "4.8.3" resolved "https://registry.yarnpkg.com/@openzeppelin/contracts-upgradeable/-/contracts-upgradeable-4.8.3.tgz#6b076a7b751811b90fe3a172a7faeaa603e13a3f" integrity sha512-SXDRl7HKpl2WDoJpn7CK/M9U4Z8gNXDHHChAKh0Iz+Wew3wu6CmFYBeie3je8V0GSXZAIYYwUktSrnW/kwVPtg== -"@openzeppelin/contracts@^4.7.3": +"@openzeppelin/contracts@4.7.3": version "4.7.3" resolved "https://registry.yarnpkg.com/@openzeppelin/contracts/-/contracts-4.7.3.tgz#939534757a81f8d69cc854c7692805684ff3111e" integrity sha512-dGRS0agJzu8ybo44pCIf3xBaPQN/65AIXNgK8+4gzKd5kbvlqyxryUYVLJv7fK98Seyd2hDZzVEHSWAh0Bt1Yw== -"@openzeppelin/hardhat-upgrades@^1.23.1": - version "1.23.1" - resolved "https://registry.yarnpkg.com/@openzeppelin/hardhat-upgrades/-/hardhat-upgrades-1.23.1.tgz#45b47f7083493dae7339782aeeafd68606f76488" - integrity sha512-/bE480eKxbNBuvGsSsQglnwk3T52hC7lgmrOCSb4EKoF6njCeyebeBwQCr/5uZTRfIhHMkKr5s7lFFP8t2KzjQ== +"@openzeppelin/defender-base-client@^1.47.0": + version "1.47.1" + resolved "https://registry.yarnpkg.com/@openzeppelin/defender-base-client/-/defender-base-client-1.47.1.tgz#2044fd048d73778a42eb0c5ae6f1370d0ab4bac9" + integrity sha512-xnopi1tZIh1zY9KF3mo9S2YgMP0I3T11r6jiO1teAw6M0U5Fx2SCjfCVoKV7CLAQGH1VHmAZ7w2CmcEsFvlQng== + dependencies: + amazon-cognito-identity-js "^6.0.1" + async-retry "^1.3.3" + axios "^1.4.0" + lodash "^4.17.19" + node-fetch "^2.6.0" + +"@openzeppelin/hardhat-upgrades@^2.1.0": + version "2.1.0" + resolved "https://registry.yarnpkg.com/@openzeppelin/hardhat-upgrades/-/hardhat-upgrades-2.1.0.tgz#cb77e212b7e21f8a98c4fbdf6aad730f9e988153" + integrity sha512-cHwWbm5YeRde9y37Tcx9o0xc+hE7t+CrxDAdHt+USELW5agi6IaVECpgtVjPhhpfLR8UDJvSggzaP4HAqQhZtQ== dependencies: - "@openzeppelin/upgrades-core" "^1.25.0" + "@openzeppelin/defender-base-client" "^1.47.0" + "@openzeppelin/platform-deploy-client" "^0.9.0" + "@openzeppelin/upgrades-core" "^1.27.0" chalk "^4.1.0" debug "^4.1.1" proper-lockfile "^4.1.1" + undici "^5.14.0" + +"@openzeppelin/platform-deploy-client@^0.9.0": + version "0.9.0" + resolved "https://registry.yarnpkg.com/@openzeppelin/platform-deploy-client/-/platform-deploy-client-0.9.0.tgz#6d7092066d1c5cf4c25ba6f9d8164e8d1c425b61" + integrity sha512-VepsNJu5B5xhrKMg//hROFljlxlNhlkcgLSKl8rqapKiRFN/dxXtSVmmpNmySrCFnbbV/6twfhuhYGAZiG7oAw== + dependencies: + "@ethersproject/abi" "^5.6.3" + "@openzeppelin/defender-base-client" "^1.47.0" + axios "^1.4.0" + lodash "^4.17.19" + node-fetch "^2.6.0" -"@openzeppelin/upgrades-core@^1.25.0": - version "1.25.0" - resolved "https://registry.yarnpkg.com/@openzeppelin/upgrades-core/-/upgrades-core-1.25.0.tgz#4f540e2043b98f8b59a4e8a988b9aeb5b5f23a35" - integrity sha512-vSxOSm1k+P156nNm15ydhOmSPGC37mnl092FMVOH+eGaoqLjr2Za6ULVjDMFzvMnG+sGE1UoDOqBNPfTm0ch8w== +"@openzeppelin/upgrades-core@^1.27.0": + version "1.28.0" + resolved "https://registry.yarnpkg.com/@openzeppelin/upgrades-core/-/upgrades-core-1.28.0.tgz#19405f272dc09e766c756d9d149cbd680168aef7" + integrity sha512-8RKlyg98Adv+46GxDaR0awL3R8bVCcQ27DcSEwrgWOp6siHh8sZg4a2l+2dhPl1510S6uBfhHSydMH5VX2BV5g== dependencies: - cbor "^8.0.0" + cbor "^9.0.0" chalk "^4.1.0" - compare-versions "^5.0.0" + compare-versions "^6.0.0" debug "^4.1.1" ethereumjs-util "^7.0.3" + minimist "^1.2.7" proper-lockfile "^4.1.1" - solidity-ast "^0.4.15" + solidity-ast "^0.4.26" "@scure/base@~1.1.0": version "1.1.1" @@ -890,25 +908,26 @@ "@sentry/types" "5.30.0" tslib "^1.9.3" -"@solidity-parser/parser@^0.14.0", "@solidity-parser/parser@^0.14.1", "@solidity-parser/parser@^0.14.3": - version "0.14.3" - resolved "https://registry.yarnpkg.com/@solidity-parser/parser/-/parser-0.14.3.tgz#0d627427b35a40d8521aaa933cc3df7d07bfa36f" - integrity sha512-29g2SZ29HtsqA58pLCtopI1P/cPy5/UAzlcAXO6T/CNJimG6yA8kx4NaseMyJULiC+TEs02Y9/yeHzClqoA0hw== +"@smithy/types@^2.0.2": + version "2.0.2" + resolved "https://registry.yarnpkg.com/@smithy/types/-/types-2.0.2.tgz#49d42724c909e845bfd80a2e195740614ce497f3" + integrity sha512-wcymEjIXQ9+NEfE5Yt5TInAqe1o4n+Nh+rh00AwoazppmUt8tdo6URhc5gkDcOYrcvlDVAZE7uG69nDpEGUKxw== + dependencies: + tslib "^2.5.0" + +"@solidity-parser/parser@^0.14.0": + version "0.14.5" + resolved "https://registry.yarnpkg.com/@solidity-parser/parser/-/parser-0.14.5.tgz#87bc3cc7b068e08195c219c91cd8ddff5ef1a804" + integrity sha512-6dKnHZn7fg/iQATVEzqyUOyEidbn05q7YA2mQ9hC0MMXhhV3/JrsxmFSYZAcr7j1yUP700LLhTruvJ3MiQmjJg== dependencies: antlr4ts "^0.5.0-alpha.4" -"@tenderly/hardhat-tenderly@^1.1.6": - version "1.1.6" - resolved "https://registry.yarnpkg.com/@tenderly/hardhat-tenderly/-/hardhat-tenderly-1.1.6.tgz#b706c7c337ebae7ecd314df3e8ee3d244ed1de08" - integrity sha512-B6vVdDAxQwjahrvsxjNirJW2ynDENLBD8LLFy8sYVJ+RCb4B8HXT1IGSceqpySNPr2iLYcD5cKC/YCHX+/O48Q== +"@solidity-parser/parser@^0.16.0": + version "0.16.1" + resolved "https://registry.yarnpkg.com/@solidity-parser/parser/-/parser-0.16.1.tgz#f7c8a686974e1536da0105466c4db6727311253c" + integrity sha512-PdhRFNhbTtu3x8Axm0uYpqOy/lODYQK+MlYSgqIsq2L8SFYEHJPHNUiOTAJbDGzNjjr1/n9AcIayxafR/fWmYw== dependencies: - "@ethersproject/bignumber" "^5.6.2" - "@nomiclabs/hardhat-ethers" "^2.0.6" - axios "^0.21.1" - ethers "^5.6.8" - fs-extra "^9.0.1" - hardhat-deploy "^0.11.10" - js-yaml "^3.14.0" + antlr4ts "^0.5.0-alpha.4" "@tsconfig/node10@^1.0.7": version "1.0.9" @@ -930,18 +949,18 @@ resolved "https://registry.yarnpkg.com/@tsconfig/node16/-/node16-1.0.4.tgz#0b92dcc0cc1c81f6f306a381f28e31b1a56536e9" integrity sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA== -"@typechain/ethers-v5@^10.1.0": - version "10.2.1" - resolved "https://registry.yarnpkg.com/@typechain/ethers-v5/-/ethers-v5-10.2.1.tgz#50241e6957683281ecfa03fb5a6724d8a3ce2391" - integrity sha512-n3tQmCZjRE6IU4h6lqUGiQ1j866n5MTCBJreNEHHVWXa2u9GJTaeYyU1/k+1qLutkyw+sS6VAN+AbeiTqsxd/A== +"@typechain/ethers-v5@^11.1.1": + version "11.1.1" + resolved "https://registry.yarnpkg.com/@typechain/ethers-v5/-/ethers-v5-11.1.1.tgz#23a358135a302140cf89a186592464dd6bbf1f98" + integrity sha512-D9WyUrCJ4Z5Gg8T00HWLpuqn1CqSDXlCiUOOpLaWoCbnZrE2jSIOUwR9blBZNo6LE5058e3niVu6xk205Et7tg== dependencies: lodash "^4.17.15" ts-essentials "^7.0.1" -"@typechain/hardhat@^6.1.2": - version "6.1.6" - resolved "https://registry.yarnpkg.com/@typechain/hardhat/-/hardhat-6.1.6.tgz#1a749eb35e5054c80df531cf440819cb347c62ea" - integrity sha512-BiVnegSs+ZHVymyidtK472syodx1sXYlYJJixZfRstHVGYTi8V1O7QG4nsjyb0PC/LORcq7sfBUcHto1y6UgJA== +"@typechain/hardhat@^8.0.3": + version "8.0.3" + resolved "https://registry.yarnpkg.com/@typechain/hardhat/-/hardhat-8.0.3.tgz#a114825f130405bbb8e535314003733b7ce3f91c" + integrity sha512-MytSmJJn+gs7Mqrpt/gWkTCOpOQ6ZDfRrRT2gtZL0rfGe4QrU4x9ZdW15fFbVM/XTa+5EsKiOMYXhRABibNeng== dependencies: fs-extra "^9.1.0" @@ -967,9 +986,9 @@ "@types/chai" "*" "@types/chai@*": - version "4.3.3" - resolved "https://registry.yarnpkg.com/@types/chai/-/chai-4.3.3.tgz#3c90752792660c4b562ad73b3fbd68bf3bc7ae07" - integrity sha512-hC7OMnszpxhZPduX+m+nrx+uFoLkWOMiR4oa/AZF3MuSETYTZmFfJAHqZEM8MVlvfG7BEUcgvtwoCTxBp6hm3g== + version "4.3.5" + resolved "https://registry.yarnpkg.com/@types/chai/-/chai-4.3.5.tgz#ae69bcbb1bebb68c4ac0b11e9d8ed04526b3562b" + integrity sha512-mEo1sAde+UCE6b2hxn332f1g1E8WfYRu6p5SvTKr2ZKC1f7gFJXk4h5PyGP9Dt6gCaG8y8XhwnXWC6Iy2cmBng== "@types/concat-stream@^1.6.0": version "1.6.1" @@ -1003,15 +1022,15 @@ resolved "https://registry.yarnpkg.com/@types/minimatch/-/minimatch-5.1.2.tgz#07508b45797cb81ec3f273011b054cd0755eddca" integrity sha512-K0VQKziLUWkVKiRVrx4a40iPaxTUefQmjtkQofBkYRcoaaL/8rhwDWww9qWbrgicNOgnpIsMxyNIUM4+n6dUIA== -"@types/mocha@^9.1.0": - version "9.1.1" - resolved "https://registry.yarnpkg.com/@types/mocha/-/mocha-9.1.1.tgz#e7c4f1001eefa4b8afbd1eee27a237fee3bf29c4" - integrity sha512-Z61JK7DKDtdKTWwLeElSEBcWGRLY8g95ic5FoQqI9CMx0ns/Ghep3B4DfcEimiKMvtamNVULVNKEsiwV3aQmXw== +"@types/mocha@^10.0.1": + version "10.0.1" + resolved "https://registry.yarnpkg.com/@types/mocha/-/mocha-10.0.1.tgz#2f4f65bb08bc368ac39c96da7b2f09140b26851b" + integrity sha512-/fvYntiO1GeICvqbQ3doGDIP97vWmvFt83GKguJ6prmQM2iXZfFcq6YE8KteFyRtX2/h5Hf91BYvPodJKFYv5Q== "@types/node@*": - version "20.2.1" - resolved "https://registry.yarnpkg.com/@types/node/-/node-20.2.1.tgz#de559d4b33be9a808fd43372ccee822c70f39704" - integrity sha512-DqJociPbZP1lbZ5SQPk4oag6W7AyaGMO6gSfRwq3PWl4PXTwJpRQJhDq4W0kzrg3w6tJ1SwlvGZ5uKFHY13LIg== + version "20.4.8" + resolved "https://registry.yarnpkg.com/@types/node/-/node-20.4.8.tgz#b5dda19adaa473a9bf0ab5cbd8f30ec7d43f5c85" + integrity sha512-0mHckf6D2DiIAzh8fM8f3HQCvMKDpK94YQ0DSVkfWTG9BZleYIWudw9cJxX8oCk9bM+vAkDyujDV6dmKHbvQpg== "@types/node@^10.0.3": version "10.17.60" @@ -1035,7 +1054,7 @@ resolved "https://registry.yarnpkg.com/@types/prettier/-/prettier-2.7.3.tgz#3e51a17e291d01d17d3fc61422015a933af7a08f" integrity sha512-+68kP9yzs4LMp7VNh8gdzMSPZFL44MLGqiHWvttYJe+6qnuVr4Ek9wSBQoveqY/r+LwjCcU29kNVkidwim+kYA== -"@types/qs@^6.2.31", "@types/qs@^6.9.7": +"@types/qs@^6.2.31": version "6.9.7" resolved "https://registry.yarnpkg.com/@types/qs/-/qs-6.9.7.tgz#63bb7d067db107cc1e457c303bc25d511febf6cb" integrity sha512-FGa1F62FT09qcrueBA6qYTrJPVDzah9a+493+o2PCXsesWHIn27G98TsSMs3WPNbZIEj4+VJf6saSFpvD+3Zsw== @@ -1065,13 +1084,6 @@ abbrev@1.0.x: resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.0.9.tgz#91b4792588a7738c25f35dd6f63752a2f8776135" integrity sha512-LEyx4aLEC3x6T0UguF6YILf+ntvmOaWsVfENmIW0E9H09vKlLDGelMjjSm0jkDHALj8A8quZ/HapKNigzwge+Q== -abort-controller@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/abort-controller/-/abort-controller-3.0.0.tgz#eaf54d53b62bae4138e809ca225c8439a6efb392" - integrity sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg== - dependencies: - event-target-shim "^5.0.0" - abstract-level@^1.0.0, abstract-level@^1.0.2, abstract-level@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/abstract-level/-/abstract-level-1.0.3.tgz#78a67d3d84da55ee15201486ab44c09560070741" @@ -1085,30 +1097,20 @@ abstract-level@^1.0.0, abstract-level@^1.0.2, abstract-level@^1.0.3: module-error "^1.0.1" queue-microtask "^1.2.3" -acorn-jsx@^5.0.0: - version "5.3.2" - resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.3.2.tgz#7ed5bb55908b3b2f1bc55c6af1653bada7f07937" - integrity sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ== - acorn-walk@^8.1.1: version "8.2.0" resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-8.2.0.tgz#741210f2e2426454508853a2f44d0ab83b7f69c1" integrity sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA== -acorn@^6.0.7: - version "6.4.2" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-6.4.2.tgz#35866fd710528e92de10cf06016498e47e39e1e6" - integrity sha512-XtGIhXwF8YM8bJhGxG5kXgjkEuNGLTkoYqVE+KMR+aspr4KGYmKYg7yUe3KghyQ9yheNwLnjmzh/7+gfDBmHCQ== - acorn@^8.4.1: - version "8.8.2" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.8.2.tgz#1b2f25db02af965399b9776b0c2c391276d37c4a" - integrity sha512-xjIYgE8HBrkpd/sJqOGNspf8uHG+NOHGOw6a/Urj8taM2EXfdNAH2oFcPeIFfsv3+kz/mJrS5VuMqbNLjCa2vw== + version "8.10.0" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.10.0.tgz#8be5b3907a67221a81ab23c7889c4c5526b62ec5" + integrity sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw== address@^1.0.1: - version "1.2.0" - resolved "https://registry.yarnpkg.com/address/-/address-1.2.0.tgz#d352a62c92fee90f89a693eccd2a8b2139ab02d9" - integrity sha512-tNEZYz5G/zYunxFm7sfhAxkXEuLj3K6BKwv6ZURlsF6yiUQ65z0Q2wZW9L5cPUl9ocofGvXOdFYbFHp0+6MOig== + version "1.2.2" + resolved "https://registry.yarnpkg.com/address/-/address-1.2.2.tgz#2b5248dac5485a6390532c6a517fda2e3faac89e" + integrity sha512-4B/qKCfeE/ODUaAUpSwfzazo5x29WD4r3vXiWsB7I2mSDAihwEqKO+g8GELZUQSSAo5e1XTYh3ZVfLyxBc12nA== adm-zip@^0.4.16: version "0.4.16" @@ -1135,7 +1137,7 @@ aggregate-error@^3.0.0: clean-stack "^2.0.0" indent-string "^4.0.0" -ajv@^6.10.2, ajv@^6.12.3, ajv@^6.6.1, ajv@^6.9.1: +ajv@^6.12.3, ajv@^6.12.6: version "6.12.6" resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.6.tgz#baf5a62e802b07d977034586f8c3baf5adf26df4" integrity sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g== @@ -1155,6 +1157,17 @@ ajv@^8.0.1: require-from-string "^2.0.2" uri-js "^4.2.2" +amazon-cognito-identity-js@^6.0.1: + version "6.3.1" + resolved "https://registry.yarnpkg.com/amazon-cognito-identity-js/-/amazon-cognito-identity-js-6.3.1.tgz#d9a4c1a92f4b059330df8ea075f65106d2605409" + integrity sha512-PxBdufgS8uZShrcIFAsRjmqNXsh/4fXOWUGQOUhKLHWWK1pcp/y+VeFF48avXIWefM8XwsT3JlN6m9J2eHt4LA== + dependencies: + "@aws-crypto/sha256-js" "1.2.2" + buffer "4.9.2" + fast-base64-decode "^1.0.0" + isomorphic-unfetch "^3.0.0" + js-cookie "^2.2.1" + amdefine@>=0.0.4: version "1.0.1" resolved "https://registry.yarnpkg.com/amdefine/-/amdefine-1.0.1.tgz#4a5282ac164729e93619bcfd3ad151f817ce91f5" @@ -1175,11 +1188,6 @@ ansi-colors@^4.1.0, ansi-colors@^4.1.1: resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-4.1.3.tgz#37611340eb2243e70cc604cad35d63270d48781b" integrity sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw== -ansi-escapes@^3.2.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-3.2.0.tgz#8780b98ff9dbf5638152d1f1fe5c1d7b4442976b" - integrity sha512-cBhpre4ma+U0T1oM5fXg7Dy1Jw7zzwv7lt/GoCpr+hDQJoYnKVPLL4dCvSEFMmQurOQvSrwT7SL/DAlhBI97RQ== - ansi-escapes@^4.3.0: version "4.3.2" resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-4.3.2.tgz#6b2291d1db7d98b6521d5f1efa42d0f3a9feb65e" @@ -1216,25 +1224,17 @@ ansi-styles@^4.0.0, ansi-styles@^4.1.0: dependencies: color-convert "^2.0.1" -antlr4@4.7.1: - version "4.7.1" - resolved "https://registry.yarnpkg.com/antlr4/-/antlr4-4.7.1.tgz#69984014f096e9e775f53dd9744bf994d8959773" - integrity sha512-haHyTW7Y9joE5MVs37P2lNYfU2RWBLfcRDD8OWldcdZm5TiCE91B5Xl1oWSwiDUSd4rlExpt2pu1fksYQjRBYQ== +antlr4@^4.11.0: + version "4.13.0" + resolved "https://registry.yarnpkg.com/antlr4/-/antlr4-4.13.0.tgz#25c0b17f0d9216de114303d38bafd6f181d5447f" + integrity sha512-zooUbt+UscjnWyOrsuY/tVFL4rwrAGwOivpQmvmUDE22hy/lUA467Rc1rcixyRwcRUIXFYBwv7+dClDSHdmmew== antlr4ts@^0.5.0-alpha.4: version "0.5.0-alpha.4" resolved "https://registry.yarnpkg.com/antlr4ts/-/antlr4ts-0.5.0-alpha.4.tgz#71702865a87478ed0b40c0709f422cf14d51652a" integrity sha512-WPQDt1B74OfPv/IMS2ekXAKkTZIHl88uMetg6q3OTqgFxZ/dxDXI0EWLyZid/1Pe6hTftyg5N7gel5wNAGxXyQ== -anymatch@~3.1.1: - version "3.1.2" - resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.2.tgz#c0557c096af32f106198f4f4e2a383537e378716" - integrity sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg== - dependencies: - normalize-path "^3.0.0" - picomatch "^2.0.4" - -anymatch@~3.1.2: +anymatch@~3.1.1, anymatch@~3.1.2: version "3.1.3" resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.3.tgz#790c58b19ba1720a84205b57c618d5ad8524973e" integrity sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw== @@ -1269,6 +1269,14 @@ array-back@^4.0.1, array-back@^4.0.2: resolved "https://registry.yarnpkg.com/array-back/-/array-back-4.0.2.tgz#8004e999a6274586beeb27342168652fdb89fa1e" integrity sha512-NbdMezxqf94cnNfWLL7V/im0Ub+Anbb0IoZhvzie8+4HJ4nMQuzHuy49FkGYCJK2yAloZ3meiB6AVMClbrI1vg== +array-buffer-byte-length@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/array-buffer-byte-length/-/array-buffer-byte-length-1.0.0.tgz#fabe8bc193fea865f317fe7807085ee0dee5aead" + integrity sha512-LPuwb2P+NrQw3XhxGc36+XSvuBPopovXYTR9Ew++Du9Yb/bx5AzBfrIsBoj0EZUifjQU+sHL21sseZ3jerWO/A== + dependencies: + call-bind "^1.0.2" + is-array-buffer "^3.0.1" + array-union@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/array-union/-/array-union-2.1.0.tgz#b798420adbeb1de828d84acd8a2e23d3efe85e8d" @@ -1279,17 +1287,29 @@ array-uniq@1.0.3: resolved "https://registry.yarnpkg.com/array-uniq/-/array-uniq-1.0.3.tgz#af6ac877a25cc7f74e058894753858dfdb24fdb6" integrity sha512-MNha4BWQ6JbwhFhj03YK552f7cb3AzoE8SzeljgChvL1dl3IcvggXVz1DilzySZkCja+CXuZbdW7yATchWn8/Q== -array.prototype.reduce@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/array.prototype.reduce/-/array.prototype.reduce-1.0.4.tgz#8167e80089f78bff70a99e20bd4201d4663b0a6f" - integrity sha512-WnM+AjG/DvLRLo4DDl+r+SvCzYtD2Jd9oeBYMcEaI7t3fFrHY9M53/wdLcTvmZNQ70IU6Htj0emFkZ5TS+lrdw== +array.prototype.reduce@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/array.prototype.reduce/-/array.prototype.reduce-1.0.5.tgz#6b20b0daa9d9734dd6bc7ea66b5bbce395471eac" + integrity sha512-kDdugMl7id9COE8R7MHF5jWk7Dqt/fs4Pv+JXoICnYwqpjjjbUurz6w5fT5IG6brLdJhv6/VoHB0H7oyIBXd+Q== dependencies: call-bind "^1.0.2" - define-properties "^1.1.3" - es-abstract "^1.19.2" + define-properties "^1.1.4" + es-abstract "^1.20.4" es-array-method-boxes-properly "^1.0.0" is-string "^1.0.7" +arraybuffer.prototype.slice@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.1.tgz#9b5ea3868a6eebc30273da577eb888381c0044bb" + integrity sha512-09x0ZWFEjj4WD8PDbykUwo3t9arLn8NIzmmYEJFpYekOAQjpkGSyrQhNoRTcwwcFRu+ycWF78QZ63oWTqSjBcw== + dependencies: + array-buffer-byte-length "^1.0.0" + call-bind "^1.0.2" + define-properties "^1.2.0" + get-intrinsic "^1.2.1" + is-array-buffer "^3.0.2" + is-shared-array-buffer "^1.0.2" + asap@~2.0.6: version "2.0.6" resolved "https://registry.yarnpkg.com/asap/-/asap-2.0.6.tgz#e50347611d7e690943208bbdafebcbc2fb866d46" @@ -1312,21 +1332,23 @@ assertion-error@^1.1.0: resolved "https://registry.yarnpkg.com/assertion-error/-/assertion-error-1.1.0.tgz#e60b6b0e8f301bd97e5375215bda406c85118c0b" integrity sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw== -ast-parents@0.0.1: +ast-parents@^0.0.1: version "0.0.1" resolved "https://registry.yarnpkg.com/ast-parents/-/ast-parents-0.0.1.tgz#508fd0f05d0c48775d9eccda2e174423261e8dd3" integrity sha512-XHusKxKz3zoYk1ic8Un640joHbFMhbqneyoZfoKnEGtf2ey9Uh/IdpcQplODdO/kENaMIWsD0nJm4+wX3UNLHA== -astral-regex@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/astral-regex/-/astral-regex-1.0.0.tgz#6c8c3fb827dd43ee3918f27b82782ab7658a6fd9" - integrity sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg== - astral-regex@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/astral-regex/-/astral-regex-2.0.0.tgz#483143c567aeed4785759c0865786dc77d7d2e31" integrity sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ== +async-retry@^1.3.3: + version "1.3.3" + resolved "https://registry.yarnpkg.com/async-retry/-/async-retry-1.3.3.tgz#0e7f36c04d8478e7a58bdbed80cedf977785f280" + integrity sha512-wfr/jstw9xNi/0teMHrRW7dsz3Lt5ARhYNZ2ewpadnhaIp5mbALhOAP+EAdsC7t4Z6wqsDVv9+W6gm1Dk9mEyw== + dependencies: + retry "0.13.1" + async@1.x: version "1.5.2" resolved "https://registry.yarnpkg.com/async/-/async-1.5.2.tgz#ec6a61ae56480c0c3cb241c95618e20892f9672a" @@ -1342,22 +1364,29 @@ at-least-node@^1.0.0: resolved "https://registry.yarnpkg.com/at-least-node/-/at-least-node-1.0.0.tgz#602cd4b46e844ad4effc92a8011a3c46e0238dc2" integrity sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg== +available-typed-arrays@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz#92f95616501069d07d10edb2fc37d3e1c65123b7" + integrity sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw== + aws-sign2@~0.7.0: version "0.7.0" resolved "https://registry.yarnpkg.com/aws-sign2/-/aws-sign2-0.7.0.tgz#b46e890934a9591f2d2f6f86d7e6a9f1b3fe76a8" integrity sha512-08kcGqnYf/YmjoRhfxyu+CLxBjUtHLXLXX/vUfx9l2LYzG3c1m61nrpyFUZI6zeS+Li/wWMMidD9KgrqtGq3mA== aws4@^1.8.0: - version "1.11.0" - resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.11.0.tgz#d61f46d83b2519250e2784daf5b09479a8b41c59" - integrity sha512-xh1Rl34h6Fi1DC2WWKfxUTVqRsNnr6LsKz2+hfwDxQJWmrx8+c7ylaqBMcHfl1U1r2dsifOvKX3LQuLNZ+XSvA== + version "1.12.0" + resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.12.0.tgz#ce1c9d143389679e253b314241ea9aa5cec980d3" + integrity sha512-NmWvPnx0F1SfrQbYwOi7OeaNGokp9XhzNioJ/CSBs8Qa4vxug81mhJEAVZwxXuBmYB5KDRfMq/F3RR0BIU7sWg== -axios@^0.21.1: - version "0.21.4" - resolved "https://registry.yarnpkg.com/axios/-/axios-0.21.4.tgz#c67b90dc0568e5c1cf2b0b858c43ba28e2eda575" - integrity sha512-ut5vewkiu8jjGBdqpM44XxjuCjq9LAKeHVmoVfHVzy8eHgxxq8SbAVQNovDA8mVi05kP0Ea/n/UzcSHcTJQfNg== +axios@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/axios/-/axios-1.4.0.tgz#38a7bf1224cd308de271146038b551d725f0be1f" + integrity sha512-S4XCWMEmzvo64T9GfvQDOXgYRDJ/wsSZc7Jvdgx5u1sd0JwsuPLqb3SYmusag+edF6ziyMensPVqLTSc1PiSEA== dependencies: - follow-redirects "^1.14.0" + follow-redirects "^1.15.0" + form-data "^4.0.0" + proxy-from-env "^1.1.0" balanced-match@^1.0.0: version "1.0.2" @@ -1371,7 +1400,7 @@ base-x@^3.0.2: dependencies: safe-buffer "^5.0.1" -base64-js@^1.3.1: +base64-js@^1.0.2, base64-js@^1.3.1: version "1.5.1" resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.5.1.tgz#1b1b440160a5bf7ad40b650f095963481903930a" integrity sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA== @@ -1389,9 +1418,9 @@ bech32@1.1.4: integrity sha512-s0IrSOzLlbvX7yp4WBfPITzpAU8sqQcpsmwXDiKwrG4r491vwCO/XpejasRNl0piBMe/DvP4Tz0mIS/X1DPJBQ== bigint-crypto-utils@^3.0.23: - version "3.2.2" - resolved "https://registry.yarnpkg.com/bigint-crypto-utils/-/bigint-crypto-utils-3.2.2.tgz#e30a49ec38357c6981cd3da5aaa6480b1f752ee4" - integrity sha512-U1RbE3aX9ayCUVcIPHuPDPKcK3SFOXf93J1UK/iHlJuQB7bhagPIX06/CLpLEsDThJ7KA4Dhrnzynl+d2weTiw== + version "3.3.0" + resolved "https://registry.yarnpkg.com/bigint-crypto-utils/-/bigint-crypto-utils-3.3.0.tgz#72ad00ae91062cf07f2b1def9594006c279c1d77" + integrity sha512-jOTSb+drvEDxEq6OuUybOAv/xxoh3cuYRUIPyu8sSHQNKM303UQ2R1DAo45o1AkcIXw6fzbaFI1+xGGdaXs2lg== binary-extensions@^2.0.0: version "2.2.0" @@ -1426,6 +1455,13 @@ brace-expansion@^1.1.7: balanced-match "^1.0.0" concat-map "0.0.1" +brace-expansion@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-2.0.1.tgz#1edc459e0f0c548486ecf9fc99f2221364b9a0ae" + integrity sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA== + dependencies: + balanced-match "^1.0.0" + braces@^3.0.2, braces@~3.0.2: version "3.0.2" resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.2.tgz#3454e1a462ee8d599e236df336cd9ea4f8afe107" @@ -1491,6 +1527,15 @@ buffer-xor@^1.0.3: resolved "https://registry.yarnpkg.com/buffer-xor/-/buffer-xor-1.0.3.tgz#26e61ed1422fb70dd42e6e36729ed51d855fe8d9" integrity sha512-571s0T7nZWK6vB67HI5dyUF7wXiNcfaPPPTl6zYCNApANjIvYJTg7hlud/+cJpdAhS7dVzqMLmfhfHR3rAcOjQ== +buffer@4.9.2: + version "4.9.2" + resolved "https://registry.yarnpkg.com/buffer/-/buffer-4.9.2.tgz#230ead344002988644841ab0244af8c44bbe3ef8" + integrity sha512-xq+q3SRMOxGivLhBNaUdC64hDTQwejJ+H0T/NB1XMtTVEwNTrfFF3gAxiyW0Bu/xWEGhjVKgUcMhCrUy2+uCWg== + dependencies: + base64-js "^1.0.2" + ieee754 "^1.1.4" + isarray "^1.0.0" + buffer@^6.0.3: version "6.0.3" resolved "https://registry.yarnpkg.com/buffer/-/buffer-6.0.3.tgz#2ace578459cc8fbe2a70aaa8f52ee63b6a74c6c6" @@ -1519,25 +1564,6 @@ call-bind@^1.0.0, call-bind@^1.0.2: function-bind "^1.1.1" get-intrinsic "^1.0.2" -caller-callsite@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/caller-callsite/-/caller-callsite-2.0.0.tgz#847e0fce0a223750a9a027c54b33731ad3154134" - integrity sha512-JuG3qI4QOftFsZyOn1qq87fq5grLIyk1JYd5lJmdA+fG7aQ9pA/i3JIJGcO3q0MrRcHlOt1U+ZeHW8Dq9axALQ== - dependencies: - callsites "^2.0.0" - -caller-path@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/caller-path/-/caller-path-2.0.0.tgz#468f83044e369ab2010fac5f06ceee15bb2cb1f4" - integrity sha512-MCL3sf6nCSXOwCTzvPKhN18TU7AHTvdtam8DAogxcrJ8Rjfbbg7Lgng64H9Iy+vUV6VGFClN/TyxBkAebLRR4A== - dependencies: - caller-callsite "^2.0.0" - -callsites@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/callsites/-/callsites-2.0.0.tgz#06eb84f00eea413da86affefacbffb36093b3c50" - integrity sha512-ksWePWBloaWPxJYQ8TL0JHvtci6G5QTKwQ95RcWAa/lzoAKuAOflGdAK92hpHXjkwb8zLxoLNUoNYZgVsaJzvQ== - callsites@^3.0.0: version "3.1.0" resolved "https://registry.yarnpkg.com/callsites/-/callsites-3.1.0.tgz#b3630abd8943432f54b3f0519238e33cd7df2f73" @@ -1568,13 +1594,20 @@ catering@^2.1.0, catering@^2.1.1: resolved "https://registry.yarnpkg.com/catering/-/catering-2.1.1.tgz#66acba06ed5ee28d5286133982a927de9a04b510" integrity sha512-K7Qy8O9p76sL3/3m7/zLKbRkyOlSZAgzEaLhyj2mXS8PsCud2Eo4hAb8aLtZqHh0QGqLcb9dlJSu6lHRVENm1w== -cbor@^8.0.0, cbor@^8.1.0: +cbor@^8.1.0: version "8.1.0" resolved "https://registry.yarnpkg.com/cbor/-/cbor-8.1.0.tgz#cfc56437e770b73417a2ecbfc9caf6b771af60d5" integrity sha512-DwGjNW9omn6EwP70aXsn7FQJx5kO12tX0bZkaTjzdVFM6/7nhA4t0EENocKGx6D2Bch9PE2KzCUf5SceBdeijg== dependencies: nofilter "^3.1.0" +cbor@^9.0.0: + version "9.0.1" + resolved "https://registry.yarnpkg.com/cbor/-/cbor-9.0.1.tgz#b16e393d4948d44758cd54ac6151379d443b37ae" + integrity sha512-/TQOWyamDxvVIv+DY9cOLNuABkoyz8K/F3QE56539pGVYohx0+MEA1f4lChFTX79dBTBS7R1PF6ovH7G+VtBfQ== + dependencies: + nofilter "^3.1.0" + chai-as-promised@^7.1.1: version "7.1.1" resolved "https://registry.yarnpkg.com/chai-as-promised/-/chai-as-promised-7.1.1.tgz#08645d825deb8696ee61725dbf590c012eb00ca0" @@ -1582,20 +1615,20 @@ chai-as-promised@^7.1.1: dependencies: check-error "^1.0.2" -chai@^4.3.6: - version "4.3.6" - resolved "https://registry.yarnpkg.com/chai/-/chai-4.3.6.tgz#ffe4ba2d9fa9d6680cc0b370adae709ec9011e9c" - integrity sha512-bbcp3YfHCUzMOvKqsztczerVgBKSsEijCySNlHHbX3VG1nskvqjz5Rfso1gGwD6w6oOV3eI60pKuMOV5MV7p3Q== +chai@^4.3.7: + version "4.3.7" + resolved "https://registry.yarnpkg.com/chai/-/chai-4.3.7.tgz#ec63f6df01829088e8bf55fca839bcd464a8ec51" + integrity sha512-HLnAzZ2iupm25PlN0xFreAlBA5zaBSv3og0DdeGA4Ar6h6rJ3A0rolRUKJhSF2V10GZKDgWF/VmAEsNWjCRB+A== dependencies: assertion-error "^1.1.0" check-error "^1.0.2" - deep-eql "^3.0.1" + deep-eql "^4.1.2" get-func-name "^2.0.0" loupe "^2.3.1" pathval "^1.1.1" type-detect "^4.0.5" -chalk@^2.0.0, chalk@^2.1.0, chalk@^2.4.2: +chalk@^2.4.2: version "2.4.2" resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== @@ -1612,11 +1645,6 @@ chalk@^4.0.0, chalk@^4.1.0, chalk@^4.1.2: ansi-styles "^4.1.0" supports-color "^7.1.0" -chardet@^0.7.0: - version "0.7.0" - resolved "https://registry.yarnpkg.com/chardet/-/chardet-0.7.0.tgz#90094849f0937f2eedc2425d0d28a9e5f0cbad9e" - integrity sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA== - "charenc@>= 0.0.1": version "0.0.2" resolved "https://registry.yarnpkg.com/charenc/-/charenc-0.0.2.tgz#c0a1d2f3a7092e03774bfa83f14c0fc5790a8667" @@ -1642,7 +1670,7 @@ chokidar@3.3.0: optionalDependencies: fsevents "~2.1.1" -chokidar@3.5.3, chokidar@^3.4.0, chokidar@^3.5.2: +chokidar@3.5.3, chokidar@^3.4.0: version "3.5.3" resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.5.3.tgz#1cf37c8707b932bd1af1ae22c0432e2acd1903bd" integrity sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw== @@ -1686,13 +1714,6 @@ clean-stack@^2.0.0: resolved "https://registry.yarnpkg.com/clean-stack/-/clean-stack-2.2.0.tgz#ee8472dbb129e727b31e8a10a427dee9dfe4008b" integrity sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A== -cli-cursor@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-2.1.0.tgz#b35dac376479facc3e94747d41d0d0f5238ffcb5" - integrity sha512-8lgKz8LmCRYZZQDpRyT2m5rKJ08TnU4tR9FFFW2rxpxR1FzWi4PQ/NfyODchAatHaUgnSPVcx/R5w6NuTBzFiw== - dependencies: - restore-cursor "^2.0.0" - cli-table3@^0.5.0: version "0.5.1" resolved "https://registry.yarnpkg.com/cli-table3/-/cli-table3-0.5.1.tgz#0252372d94dfc40dbd8df06005f48f31f656f202" @@ -1704,19 +1725,14 @@ cli-table3@^0.5.0: colors "^1.1.2" cli-table3@^0.6.0: - version "0.6.2" - resolved "https://registry.yarnpkg.com/cli-table3/-/cli-table3-0.6.2.tgz#aaf5df9d8b5bf12634dc8b3040806a0c07120d2a" - integrity sha512-QyavHCaIC80cMivimWu4aWHilIpiDpfm3hGmqAmXVL1UsnbLuBSMd21hTX6VY4ZSDSM73ESLeF8TOYId3rBTbw== + version "0.6.3" + resolved "https://registry.yarnpkg.com/cli-table3/-/cli-table3-0.6.3.tgz#61ab765aac156b52f222954ffc607a6f01dbeeb2" + integrity sha512-w5Jac5SykAeZJKntOxJCrm63Eg5/4dhMWIcuTbo9rpE+brgaSZo0RuNJZeOyMgsUdhDeojvgyQLmjI+K50ZGyg== dependencies: string-width "^4.2.0" optionalDependencies: "@colors/colors" "1.5.0" -cli-width@^2.0.0: - version "2.2.1" - resolved "https://registry.yarnpkg.com/cli-width/-/cli-width-2.2.1.tgz#b0433d0b4e9c847ef18868a4ef16fd5fc8271c48" - integrity sha512-GRMWDxpOB6Dgk2E5Uo+3eEBvtOOlimMmpbFiKuLFnQzYDavtLFY3K5ona41jgN/WdRZtG7utuVSVTL4HbZHGkw== - cliui@^5.0.0: version "5.0.0" resolved "https://registry.yarnpkg.com/cliui/-/cliui-5.0.0.tgz#deefcfdb2e800784aa34f46fa08e06851c7bbbc5" @@ -1796,20 +1812,20 @@ command-line-usage@^6.1.0: table-layout "^1.0.2" typical "^5.2.0" -commander@2.18.0: - version "2.18.0" - resolved "https://registry.yarnpkg.com/commander/-/commander-2.18.0.tgz#2bf063ddee7c7891176981a2cc798e5754bc6970" - integrity sha512-6CYPa+JP2ftfRU2qkDK+UTVeQYosOg/2GbcjIcKPHfinyOLPVGXu/ovN86RP49Re5ndJK1N0kuiidFFuepc4ZQ== - commander@3.0.2: version "3.0.2" resolved "https://registry.yarnpkg.com/commander/-/commander-3.0.2.tgz#6837c3fb677ad9933d1cfba42dd14d5117d6b39e" integrity sha512-Gar0ASD4BDyKC4hl4DwHqDrmvjoxWKZigVnAbn5H1owvm4CxCPdb0HQDehwNYMJpla5+M2tPmPARzhtYuwpHow== -compare-versions@^5.0.0: - version "5.0.3" - resolved "https://registry.yarnpkg.com/compare-versions/-/compare-versions-5.0.3.tgz#a9b34fea217472650ef4a2651d905f42c28ebfd7" - integrity sha512-4UZlZP8Z99MGEY+Ovg/uJxJuvoXuN4M6B3hKaiackiHrgzQFEe3diJi1mf1PNHbFujM7FvLrK2bpgIaImbtZ1A== +commander@^10.0.0: + version "10.0.1" + resolved "https://registry.yarnpkg.com/commander/-/commander-10.0.1.tgz#881ee46b4f77d1c1dccc5823433aa39b022cbe06" + integrity sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug== + +compare-versions@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/compare-versions/-/compare-versions-6.0.0.tgz#a3edb527e4487bfab9a8b62ffe70cebc9b87675b" + integrity sha512-s2MzYxfRsE9f/ow8hjn7ysa7pod1xhHdQMsgiJtKx6XSNf4x2N1KG4fjrkUmXcP/e9Y2ZX4zB6sHIso0Lm6evQ== concat-map@0.0.1: version "0.0.1" @@ -1841,15 +1857,15 @@ core-util-is@~1.0.0: resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.3.tgz#a6042d3634c2b27e9328f837b965fac83808db85" integrity sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ== -cosmiconfig@^5.0.7: - version "5.2.1" - resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-5.2.1.tgz#040f726809c591e77a17c0a3626ca45b4f168b1a" - integrity sha512-H65gsXo1SKjf8zmrJ67eJk8aIRKV5ff2D4uKZIBZShbhGSpEmsQOPW/SKMKYhSTrqR7ufy6RP69rPogdaPh/kA== +cosmiconfig@^8.0.0: + version "8.2.0" + resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-8.2.0.tgz#f7d17c56a590856cd1e7cee98734dca272b0d8fd" + integrity sha512-3rTMnFJA1tCOPwRxtgF4wd7Ab2qvDbL8jX+3smjIbS4HlZBagTlpERbdN7iAbWlrfxE3M8c27kTwTawQ7st+OQ== dependencies: - import-fresh "^2.0.0" - is-directory "^0.3.1" - js-yaml "^3.13.1" - parse-json "^4.0.0" + import-fresh "^3.2.1" + js-yaml "^4.1.0" + parse-json "^5.0.0" + path-type "^4.0.0" crc-32@^1.2.0: version "1.2.2" @@ -1884,17 +1900,6 @@ create-require@^1.1.0: resolved "https://registry.yarnpkg.com/create-require/-/create-require-1.1.1.tgz#c1d7e8f1e5f6cfc9ff65f9cd352d37348756c333" integrity sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ== -cross-spawn@^6.0.5: - version "6.0.5" - resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-6.0.5.tgz#4a5ec7c64dfae22c3a14124dbacdee846d80cbc4" - integrity sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ== - dependencies: - nice-try "^1.0.4" - path-key "^2.0.1" - semver "^5.5.0" - shebang-command "^1.2.0" - which "^1.2.9" - "crypt@>= 0.0.1": version "0.0.2" resolved "https://registry.yarnpkg.com/crypt/-/crypt-0.0.2.tgz#88d7ff7ec0dfb86f713dc87bbb42d044d3e6c41b" @@ -1919,20 +1924,13 @@ debug@3.2.6: dependencies: ms "^2.1.1" -debug@4, debug@4.3.4, debug@^4.0.1, debug@^4.1.1, debug@^4.3.1, debug@^4.3.2, debug@^4.3.3: +debug@4, debug@4.3.4, debug@^4.1.1, debug@^4.3.1, debug@^4.3.3: version "4.3.4" resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.4.tgz#1319f6579357f2338d3337d2cdd4914bb5dcc865" integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ== dependencies: ms "2.1.2" -debug@^2.6.0: - version "2.6.9" - resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" - integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA== - dependencies: - ms "2.0.0" - decamelize@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290" @@ -1943,14 +1941,7 @@ decamelize@^4.0.0: resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-4.0.0.tgz#aa472d7bf660eb15f3494efd531cab7f2a709837" integrity sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ== -deep-eql@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/deep-eql/-/deep-eql-3.0.1.tgz#dfc9404400ad1c8fe023e7da1df1c147c4b444df" - integrity sha512-+QeIQyN5ZuO+3Uk5DYh6/1eKO0m0YmJFGNmFHGACpf1ClL1nmlV/p4gNgbl2pJGxgXb4faqo6UE+M5ACEMyVcw== - dependencies: - type-detect "^4.0.0" - -deep-eql@^4.0.1: +deep-eql@^4.0.1, deep-eql@^4.1.2: version "4.1.3" resolved "https://registry.yarnpkg.com/deep-eql/-/deep-eql-4.1.3.tgz#7c7775513092f7df98d8df9996dd085eb668cc6d" integrity sha512-WaEtAOpRA1MQ0eohqZjpGD8zdI0Ovsm8mmFhaDN8dvDZzyoUMcYDnf5Y6iu7HTXxf8JDS23qWa4a+hKCDyOPzw== @@ -1967,10 +1958,10 @@ deep-is@~0.1.3: resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.4.tgz#a6f2dce612fadd2ef1f519b73551f17e85199831" integrity sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ== -define-properties@^1.1.2, define-properties@^1.1.3, define-properties@^1.1.4: - version "1.1.4" - resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.1.4.tgz#0b14d7bd7fbeb2f3572c3a7eda80ea5d57fb05b1" - integrity sha512-uckOqKcfaVvtBdsVkdPv3XjveQJsNQqmhXgRi8uhvWWuPYZCNlzT8qAyblUgNoXdHdjMTzAqeGjAoli8f+bzPA== +define-properties@^1.1.2, define-properties@^1.1.3, define-properties@^1.1.4, define-properties@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.2.0.tgz#52988570670c9eacedd8064f4a990f2405849bd5" + integrity sha512-xvqAVKGfT1+UAvPwKTVw/njhdQ8ZhXK4lI0bCIuCMrp2up9nPnaDftrLtmpTazqd1o+UY4zgzU+avtMbDP+ldA== dependencies: has-property-descriptors "^1.0.0" object-keys "^1.1.1" @@ -1996,12 +1987,12 @@ depd@2.0.0: integrity sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw== detect-port@^1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/detect-port/-/detect-port-1.3.0.tgz#d9c40e9accadd4df5cac6a782aefd014d573d1f1" - integrity sha512-E+B1gzkl2gqxt1IhUzwjrxBKRqx1UzC3WLONHinn8S3T6lwV/agVCyitiFOsGJ/eYuEUBvD71MZHy3Pv1G9doQ== + version "1.5.1" + resolved "https://registry.yarnpkg.com/detect-port/-/detect-port-1.5.1.tgz#451ca9b6eaf20451acb0799b8ab40dff7718727b" + integrity sha512-aBzdj76lueB6uUst5iAs7+0H/oOjqI5D16XUWxlWMIMROhcM0rfsNVk93zTngq1dDNpoXRr++Sus7ETAExppAQ== dependencies: address "^1.0.1" - debug "^2.6.0" + debug "4" diff@3.5.0: version "3.5.0" @@ -2032,17 +2023,10 @@ dir-glob@^3.0.1: dependencies: path-type "^4.0.0" -doctrine@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-3.0.0.tgz#addebead72a6574db783639dc87a121773973961" - integrity sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w== - dependencies: - esutils "^2.0.2" - -dotenv@^16.0.2: - version "16.0.2" - resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-16.0.2.tgz#0b0f8652c016a3858ef795024508cddc4bffc5bf" - integrity sha512-JvpYKUmzQhYoIFgK2MOnF3bciIZoItIIoryihy0rIA+H4Jy0FmgyKYAHCTN98P5ybGSJcIFbh6QKeJdtZd1qhA== +dotenv@^16.3.1: + version "16.3.1" + resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-16.3.1.tgz#369034de7d7e5b120972693352a3bf112172cc3e" + integrity sha512-IPzF4w4/Rd94bA9imS68tZBaYyBWSCE47V1RGuMrB94iyTOIEwRmVL2x/4An+6mETpLrKJ5hQkB8W4kFAadeIQ== ecc-jsbn@~0.1.1: version "0.1.2" @@ -2065,11 +2049,6 @@ elliptic@6.5.4, elliptic@^6.5.2, elliptic@^6.5.4: minimalistic-assert "^1.0.1" minimalistic-crypto-utils "^1.0.1" -emoji-regex@^10.1.0: - version "10.1.0" - resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-10.1.0.tgz#d50e383743c0f7a5945c47087295afc112e3cf66" - integrity sha512-xAEnNCT3w2Tg6MA7ly6QqYJvEoY1tm9iIjJ3yMKK9JPlWuRHAMoe5iETwQnx3M9TVbFMfsrBgWKR+IsmswwNjg== - emoji-regex@^7.0.1: version "7.0.3" resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-7.0.3.tgz#933a04052860c85e83c122479c4748a8e4c72156" @@ -2080,17 +2059,13 @@ emoji-regex@^8.0.0: resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37" integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A== -encode-utf8@^1.0.2: - version "1.0.3" - resolved "https://registry.yarnpkg.com/encode-utf8/-/encode-utf8-1.0.3.tgz#f30fdd31da07fb596f281beb2f6b027851994cda" - integrity sha512-ucAnuBEhUK4boH2HjVYG5Q2mQyPorvv0u/ocS+zhdw0S8AlHYY+GOFhP1Gio5z4icpP2ivFSvhtFjQi8+T9ppw== - -enquirer@^2.3.0, enquirer@^2.3.6: - version "2.3.6" - resolved "https://registry.yarnpkg.com/enquirer/-/enquirer-2.3.6.tgz#2a7fe5dd634a1e4125a975ec994ff5456dc3734d" - integrity sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg== +enquirer@^2.3.0: + version "2.4.1" + resolved "https://registry.yarnpkg.com/enquirer/-/enquirer-2.4.1.tgz#93334b3fbd74fc7097b224ab4a8fb7e40bf4ae56" + integrity sha512-rRqJg/6gd538VHvR3PSrdRBb/1Vy2YfzHqzvbhGIQpDRKIa4FgV/54b5Q1xYSxOOwKvjXweS26E0Q+nAMwp2pQ== dependencies: ansi-colors "^4.1.1" + strip-ansi "^6.0.1" env-paths@^2.2.0: version "2.2.1" @@ -2104,40 +2079,65 @@ error-ex@^1.3.1: dependencies: is-arrayish "^0.2.1" -es-abstract@^1.19.0, es-abstract@^1.19.2, es-abstract@^1.19.5, es-abstract@^1.20.1: - version "1.20.2" - resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.20.2.tgz#8495a07bc56d342a3b8ea3ab01bd986700c2ccb3" - integrity sha512-XxXQuVNrySBNlEkTYJoDNFe5+s2yIOpzq80sUHEdPdQr0S5nTLz4ZPPPswNIpKseDDUS5yghX1gfLIHQZ1iNuQ== +es-abstract@^1.19.0, es-abstract@^1.20.4, es-abstract@^1.21.2: + version "1.22.1" + resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.22.1.tgz#8b4e5fc5cefd7f1660f0f8e1a52900dfbc9d9ccc" + integrity sha512-ioRRcXMO6OFyRpyzV3kE1IIBd4WG5/kltnzdxSCqoP8CMGs/Li+M1uF5o7lOkZVFjDs+NLesthnF66Pg/0q0Lw== dependencies: + array-buffer-byte-length "^1.0.0" + arraybuffer.prototype.slice "^1.0.1" + available-typed-arrays "^1.0.5" call-bind "^1.0.2" + es-set-tostringtag "^2.0.1" es-to-primitive "^1.2.1" - function-bind "^1.1.1" function.prototype.name "^1.1.5" - get-intrinsic "^1.1.2" + get-intrinsic "^1.2.1" get-symbol-description "^1.0.0" + globalthis "^1.0.3" + gopd "^1.0.1" has "^1.0.3" has-property-descriptors "^1.0.0" + has-proto "^1.0.1" has-symbols "^1.0.3" - internal-slot "^1.0.3" - is-callable "^1.2.4" + internal-slot "^1.0.5" + is-array-buffer "^3.0.2" + is-callable "^1.2.7" is-negative-zero "^2.0.2" is-regex "^1.1.4" is-shared-array-buffer "^1.0.2" is-string "^1.0.7" + is-typed-array "^1.1.10" is-weakref "^1.0.2" - object-inspect "^1.12.2" + object-inspect "^1.12.3" object-keys "^1.1.1" object.assign "^4.1.4" - regexp.prototype.flags "^1.4.3" - string.prototype.trimend "^1.0.5" - string.prototype.trimstart "^1.0.5" + regexp.prototype.flags "^1.5.0" + safe-array-concat "^1.0.0" + safe-regex-test "^1.0.0" + string.prototype.trim "^1.2.7" + string.prototype.trimend "^1.0.6" + string.prototype.trimstart "^1.0.6" + typed-array-buffer "^1.0.0" + typed-array-byte-length "^1.0.0" + typed-array-byte-offset "^1.0.0" + typed-array-length "^1.0.4" unbox-primitive "^1.0.2" + which-typed-array "^1.1.10" es-array-method-boxes-properly@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/es-array-method-boxes-properly/-/es-array-method-boxes-properly-1.0.0.tgz#873f3e84418de4ee19c5be752990b2e44718d09e" integrity sha512-wd6JXUmyHmt8T5a2xreUwKcGPq6f1f+WwIJkijUqiGcJz1qqnZgP6XIK+QyIWU5lT7imeNxUll48bziG+TSYcA== +es-set-tostringtag@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/es-set-tostringtag/-/es-set-tostringtag-2.0.1.tgz#338d502f6f674301d710b80c8592de8a15f09cd8" + integrity sha512-g3OMbtlwY3QewlqAiMLI47KywjWZoEytKr8pf6iTC8uJq5bIAH52Z9pnQ8pVL6whrCto53JZDuUIsifGeLorTg== + dependencies: + get-intrinsic "^1.1.3" + has "^1.0.3" + has-tostringtag "^1.0.0" + es-to-primitive@^1.2.1: version "1.2.1" resolved "https://registry.yarnpkg.com/es-to-primitive/-/es-to-primitive-1.2.1.tgz#e55cd4c9cdc188bcefb03b366c736323fc5c898a" @@ -2157,7 +2157,7 @@ escape-string-regexp@1.0.5, escape-string-regexp@^1.0.5: resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" integrity sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg== -escape-string-regexp@4.0.0, escape-string-regexp@^4.0.0: +escape-string-regexp@4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz#14ba83a5d373e3d311e5afca29cf5bfad965bf34" integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA== @@ -2174,77 +2174,6 @@ escodegen@1.8.x: optionalDependencies: source-map "~0.2.0" -eslint-scope@^4.0.3: - version "4.0.3" - resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-4.0.3.tgz#ca03833310f6889a3264781aa82e63eb9cfe7848" - integrity sha512-p7VutNr1O/QrxysMo3E45FjYDTeXBy0iTltPFNSqKAIfjDSXC+4dj+qfyuD8bfAXrW/y6lW3O76VaYNPKfpKrg== - dependencies: - esrecurse "^4.1.0" - estraverse "^4.1.1" - -eslint-utils@^1.3.1: - version "1.4.3" - resolved "https://registry.yarnpkg.com/eslint-utils/-/eslint-utils-1.4.3.tgz#74fec7c54d0776b6f67e0251040b5806564e981f" - integrity sha512-fbBN5W2xdY45KulGXmLHZ3c3FHfVYmKg0IrAKGOkT/464PQsx2UeIzfz1RmEci+KLm1bBaAzZAh8+/E+XAeZ8Q== - dependencies: - eslint-visitor-keys "^1.1.0" - -eslint-visitor-keys@^1.0.0, eslint-visitor-keys@^1.1.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz#30ebd1ef7c2fdff01c3a4f151044af25fab0523e" - integrity sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ== - -eslint@^5.6.0: - version "5.16.0" - resolved "https://registry.yarnpkg.com/eslint/-/eslint-5.16.0.tgz#a1e3ac1aae4a3fbd8296fcf8f7ab7314cbb6abea" - integrity sha512-S3Rz11i7c8AA5JPv7xAH+dOyq/Cu/VXHiHXBPOU1k/JAM5dXqQPt3qcrhpHSorXmrpu2g0gkIBVXAqCpzfoZIg== - dependencies: - "@babel/code-frame" "^7.0.0" - ajv "^6.9.1" - chalk "^2.1.0" - cross-spawn "^6.0.5" - debug "^4.0.1" - doctrine "^3.0.0" - eslint-scope "^4.0.3" - eslint-utils "^1.3.1" - eslint-visitor-keys "^1.0.0" - espree "^5.0.1" - esquery "^1.0.1" - esutils "^2.0.2" - file-entry-cache "^5.0.1" - functional-red-black-tree "^1.0.1" - glob "^7.1.2" - globals "^11.7.0" - ignore "^4.0.6" - import-fresh "^3.0.0" - imurmurhash "^0.1.4" - inquirer "^6.2.2" - js-yaml "^3.13.0" - json-stable-stringify-without-jsonify "^1.0.1" - levn "^0.3.0" - lodash "^4.17.11" - minimatch "^3.0.4" - mkdirp "^0.5.1" - natural-compare "^1.4.0" - optionator "^0.8.2" - path-is-inside "^1.0.2" - progress "^2.0.0" - regexpp "^2.0.1" - semver "^5.5.1" - strip-ansi "^4.0.0" - strip-json-comments "^2.0.1" - table "^5.2.3" - text-table "^0.2.0" - -espree@^5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/espree/-/espree-5.0.1.tgz#5d6526fa4fc7f0788a5cf75b15f30323e2f81f7a" - integrity sha512-qWAZcWh4XE/RwzLJejfcofscgMc9CamR6Tn1+XRXNzrvUSSbiAjGOI/fggztjIi7y9VLPqnICMIPiGyr8JaZ0A== - dependencies: - acorn "^6.0.7" - acorn-jsx "^5.0.0" - eslint-visitor-keys "^1.0.0" - esprima@2.7.x, esprima@^2.7.1: version "2.7.3" resolved "https://registry.yarnpkg.com/esprima/-/esprima-2.7.3.tgz#96e3b70d5779f6ad49cd032673d1c312767ba581" @@ -2255,35 +2184,11 @@ esprima@^4.0.0: resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71" integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A== -esquery@^1.0.1: - version "1.4.0" - resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.4.0.tgz#2148ffc38b82e8c7057dfed48425b3e61f0f24a5" - integrity sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w== - dependencies: - estraverse "^5.1.0" - -esrecurse@^4.1.0: - version "4.3.0" - resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.3.0.tgz#7ad7964d679abb28bee72cec63758b1c5d2c9921" - integrity sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag== - dependencies: - estraverse "^5.2.0" - estraverse@^1.9.1: version "1.9.3" resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-1.9.3.tgz#af67f2dc922582415950926091a4005d29c9bb44" integrity sha512-25w1fMXQrGdoquWnScXZGckOv+Wes+JDnuN/+7ex3SauFRS72r2lFDec0EKPt2YD1wUJ/IrfEex+9yp4hfSOJA== -estraverse@^4.1.1: - version "4.3.0" - resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.3.0.tgz#398ad3f3c5a24948be7725e83d11a7de28cdbd1d" - integrity sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw== - -estraverse@^5.1.0, estraverse@^5.2.0: - version "5.3.0" - resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-5.3.0.tgz#2eea5290702f26ab8fe5370370ff86c965d21123" - integrity sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA== - esutils@^2.0.2: version "2.0.3" resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64" @@ -2395,7 +2300,7 @@ ethers@^4.0.40: uuid "2.0.1" xmlhttprequest "1.8.0" -ethers@^5.4.7, ethers@^5.7.1: +ethers@^5.7.1, ethers@^5.7.2: version "5.7.2" resolved "https://registry.yarnpkg.com/ethers/-/ethers-5.7.2.tgz#3a7deeabbb8c030d4126b24f84e525466145872e" integrity sha512-wswUsmWo1aOK8rR7DIKiWSw9DbLWe6x98Jrn8wcTflTVvaXhAMaB5zGAXy0GYQEQp9iO1iSHWVyARQm11zUtyg== @@ -2431,42 +2336,6 @@ ethers@^5.4.7, ethers@^5.7.1: "@ethersproject/web" "5.7.1" "@ethersproject/wordlists" "5.7.0" -ethers@^5.5.3, ethers@^5.6.8: - version "5.7.0" - resolved "https://registry.yarnpkg.com/ethers/-/ethers-5.7.0.tgz#0055da174b9e076b242b8282638bc94e04b39835" - integrity sha512-5Xhzp2ZQRi0Em+0OkOcRHxPzCfoBfgtOQA+RUylSkuHbhTEaQklnYi2hsWbRgs3ztJsXVXd9VKBcO1ScWL8YfA== - dependencies: - "@ethersproject/abi" "5.7.0" - "@ethersproject/abstract-provider" "5.7.0" - "@ethersproject/abstract-signer" "5.7.0" - "@ethersproject/address" "5.7.0" - "@ethersproject/base64" "5.7.0" - "@ethersproject/basex" "5.7.0" - "@ethersproject/bignumber" "5.7.0" - "@ethersproject/bytes" "5.7.0" - "@ethersproject/constants" "5.7.0" - "@ethersproject/contracts" "5.7.0" - "@ethersproject/hash" "5.7.0" - "@ethersproject/hdnode" "5.7.0" - "@ethersproject/json-wallets" "5.7.0" - "@ethersproject/keccak256" "5.7.0" - "@ethersproject/logger" "5.7.0" - "@ethersproject/networks" "5.7.0" - "@ethersproject/pbkdf2" "5.7.0" - "@ethersproject/properties" "5.7.0" - "@ethersproject/providers" "5.7.0" - "@ethersproject/random" "5.7.0" - "@ethersproject/rlp" "5.7.0" - "@ethersproject/sha2" "5.7.0" - "@ethersproject/signing-key" "5.7.0" - "@ethersproject/solidity" "5.7.0" - "@ethersproject/strings" "5.7.0" - "@ethersproject/transactions" "5.7.0" - "@ethersproject/units" "5.7.0" - "@ethersproject/wallet" "5.7.0" - "@ethersproject/web" "5.7.0" - "@ethersproject/wordlists" "5.7.0" - ethjs-unit@0.1.6: version "0.1.6" resolved "https://registry.yarnpkg.com/ethjs-unit/-/ethjs-unit-0.1.6.tgz#c665921e476e87bce2a9d588a6fe0405b2c41699" @@ -2483,11 +2352,6 @@ ethjs-util@0.1.6, ethjs-util@^0.1.6: is-hex-prefixed "1.0.0" strip-hex-prefix "1.0.0" -event-target-shim@^5.0.0: - version "5.0.1" - resolved "https://registry.yarnpkg.com/event-target-shim/-/event-target-shim-5.0.1.tgz#5d4d3ebdf9583d63a5333ce2deb7480ab2b05789" - integrity sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ== - evp_bytestokey@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz#7fcbdb198dc71959432efe13842684e0525acb02" @@ -2501,15 +2365,6 @@ extend@~3.0.2: resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.2.tgz#f8b1136b4071fbd8eb140aff858b1019ec2915fa" integrity sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g== -external-editor@^3.0.3: - version "3.1.0" - resolved "https://registry.yarnpkg.com/external-editor/-/external-editor-3.1.0.tgz#cb03f740befae03ea4d283caed2741a83f335495" - integrity sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew== - dependencies: - chardet "^0.7.0" - iconv-lite "^0.4.24" - tmp "^0.0.33" - extsprintf@1.3.0: version "1.3.0" resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.3.0.tgz#96918440e3041a7a414f8c52e3c574eb3c3e1e05" @@ -2520,20 +2375,25 @@ extsprintf@^1.2.0: resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.4.1.tgz#8d172c064867f235c0c84a596806d279bf4bcc07" integrity sha512-Wrk35e8ydCKDj/ArClo1VrPVmN8zph5V4AtHwIuHhvMXsKf73UT3BOD+azBIW+3wOJ4FhEH7zyaJCFvChjYvMA== +fast-base64-decode@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/fast-base64-decode/-/fast-base64-decode-1.0.0.tgz#b434a0dd7d92b12b43f26819300d2dafb83ee418" + integrity sha512-qwaScUgUGBYeDNRnbc/KyllVU88Jk1pRHPStuF/lO7B0/RTRLj7U0lkdTAutlBblY08rwZDff6tNU9cjv6j//Q== + fast-deep-equal@^3.1.1: version "3.1.3" resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525" integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== -fast-diff@^1.1.2: - version "1.2.0" - resolved "https://registry.yarnpkg.com/fast-diff/-/fast-diff-1.2.0.tgz#73ee11982d86caaf7959828d519cfe927fac5f03" - integrity sha512-xJuoT5+L99XlZ8twedaRf6Ax2TgQVxvgZOYoPKqZufmJib0tL2tegPBOZb1pVNgIhlqDlA0eO0c3wBvQcmzx4w== +fast-diff@^1.2.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/fast-diff/-/fast-diff-1.3.0.tgz#ece407fa550a64d638536cd727e129c61616e0f0" + integrity sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw== fast-glob@^3.0.3: - version "3.2.11" - resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.2.11.tgz#a1172ad95ceb8a16e20caa5c5e56480e5129c1d9" - integrity sha512-xrO3+1bxSo3ZVHAnqzyuewYT6aMFHRAd4Kcs92MAonjwQZLsK9d0SF1IyQ3k5PoirxTW0Oe/RqFgMQ6TcNE5Ew== + version "3.3.1" + resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.3.1.tgz#784b4e897340f3dbbef17413b3f11acf03c874c4" + integrity sha512-kNFPyjhh5cKjrUltxs+wFx+ZkbRaxxmZ+X0ZU31SOsxCEtP9VPgtq2teZw1DebupL5GmDaNQ6yKMMVcM41iqDg== dependencies: "@nodelib/fs.stat" "^2.0.2" "@nodelib/fs.walk" "^1.2.3" @@ -2552,26 +2412,12 @@ fast-levenshtein@~2.0.6: integrity sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw== fastq@^1.6.0: - version "1.13.0" - resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.13.0.tgz#616760f88a7526bdfc596b7cab8c18938c36b98c" - integrity sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw== + version "1.15.0" + resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.15.0.tgz#d04d07c6a2a68fe4599fea8d2e103a937fae6b3a" + integrity sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw== dependencies: reusify "^1.0.4" -figures@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/figures/-/figures-2.0.0.tgz#3ab1a2d2a62c8bfb431a0c94cb797a2fce27c962" - integrity sha512-Oa2M9atig69ZkfwiApY8F2Yy+tzMbazyvqv21R0NsSC8floSOC09BbT1ITWAdoMGQvJ/aZnR1KMwdx9tvHnTNA== - dependencies: - escape-string-regexp "^1.0.5" - -file-entry-cache@^5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-5.0.1.tgz#ca0f6efa6dd3d561333fb14515065c2fafdf439c" - integrity sha512-bCg29ictuBaKUwwArK4ouCaqDgLZcysCFLmM/Yn/FDoqndh/9vNuQfXRDvTuXKLxfD/JtZQGKFT8MGcJBK644g== - dependencies: - flat-cache "^2.0.1" - fill-range@^7.0.1: version "7.0.1" resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.0.1.tgz#1919a6a7c75fe38b2c7c77e5198535da9acdda40" @@ -2608,41 +2454,29 @@ find-up@^2.1.0: dependencies: locate-path "^2.0.0" -flat-cache@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-2.0.1.tgz#5d296d6f04bda44a4630a301413bdbc2ec085ec0" - integrity sha512-LoQe6yDuUMDzQAEH8sgmh4Md6oZnc/7PjtwjNFSzveXqSHt6ka9fPBuso7IGf9Rz4uqnSnWiFH2B/zj24a5ReA== +flat@^4.1.0: + version "4.1.1" + resolved "https://registry.yarnpkg.com/flat/-/flat-4.1.1.tgz#a392059cc382881ff98642f5da4dde0a959f309b" + integrity sha512-FmTtBsHskrU6FJ2VxCnsDb84wu9zhmO3cUX2kGFb5tuwhfXxGciiT0oRY+cck35QmG+NmGh5eLz6lLCpWTqwpA== dependencies: - flatted "^2.0.0" - rimraf "2.6.3" - write "1.0.3" + is-buffer "~2.0.3" -flat@^4.1.0, flat@^5.0.2: +flat@^5.0.2: version "5.0.2" resolved "https://registry.yarnpkg.com/flat/-/flat-5.0.2.tgz#8ca6fe332069ffa9d324c327198c598259ceb241" integrity sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ== -flatted@^2.0.0: - version "2.0.2" - resolved "https://registry.yarnpkg.com/flatted/-/flatted-2.0.2.tgz#4575b21e2bcee7434aa9be662f4b7b5f9c2b5138" - integrity sha512-r5wGx7YeOwNWNlCA0wQ86zKyDLMQr+/RB8xy74M4hTphfmjlijTSSXGuH8rnvKZnfT9i+75zmd8jcKdMR4O6jA== - -fmix@^0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/fmix/-/fmix-0.1.0.tgz#c7bbf124dec42c9d191cfb947d0a9778dd986c0c" - integrity sha512-Y6hyofImk9JdzU8k5INtTXX1cu8LDlePWDFU5sftm9H+zKCr5SGrVjdhkvsim646cw5zD0nADj8oHyXMZmCZ9w== - dependencies: - imul "^1.0.0" - -follow-redirects@^1.12.1: +follow-redirects@^1.12.1, follow-redirects@^1.15.0: version "1.15.2" resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.15.2.tgz#b460864144ba63f2681096f274c4e57026da2c13" integrity sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA== -follow-redirects@^1.14.0: - version "1.15.1" - resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.15.1.tgz#0ca6a452306c9b276e4d3127483e29575e207ad5" - integrity sha512-yLAMQs+k0b2m7cVxpS1VKJVvoz7SS9Td1zss3XRwXj+ZDH00RJgnuLx7E44wx02kQLrdM3aOOy+FpzS7+8OizA== +for-each@^0.3.3: + version "0.3.3" + resolved "https://registry.yarnpkg.com/for-each/-/for-each-0.3.3.tgz#69b447e88a0a5d32c3e7084f3f1710034b21376e" + integrity sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw== + dependencies: + is-callable "^1.1.3" forever-agent@~0.6.1: version "0.6.1" @@ -2695,16 +2529,7 @@ fs-extra@^0.30.0: jsonfile "^2.1.0" klaw "^1.0.0" path-is-absolute "^1.0.0" - rimraf "^2.2.8" - -fs-extra@^10.0.0: - version "10.1.0" - resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-10.1.0.tgz#02873cfbc4084dde127eaa5f9905eef2325d1abf" - integrity sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ== - dependencies: - graceful-fs "^4.2.0" - jsonfile "^6.0.1" - universalify "^2.0.0" + rimraf "^2.2.8" fs-extra@^7.0.0, fs-extra@^7.0.1: version "7.0.1" @@ -2724,7 +2549,7 @@ fs-extra@^8.1.0: jsonfile "^4.0.0" universalify "^0.1.0" -fs-extra@^9.0.1, fs-extra@^9.1.0: +fs-extra@^9.1.0: version "9.1.0" resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-9.1.0.tgz#5954460c764a8da2094ba3554bf839e6b9a7c86d" integrity sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ== @@ -2774,7 +2599,7 @@ functional-red-black-tree@^1.0.1: resolved "https://registry.yarnpkg.com/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz#1b0ab3bd553b2a0d6399d29c0e3ea0b252078327" integrity sha512-dsKNQNdj6xA3T+QlADDA7mOSlX0qiMINjn0cgr+eGHGsbSHzTabcIogz2+p/iqP1Xs6EP/sS2SbqH+brGTbq0g== -functions-have-names@^1.2.2: +functions-have-names@^1.2.2, functions-have-names@^1.2.3: version "1.2.3" resolved "https://registry.yarnpkg.com/functions-have-names/-/functions-have-names-1.2.3.tgz#0404fe4ee2ba2f607f0e0ec3c80bae994133b834" integrity sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ== @@ -2789,7 +2614,7 @@ get-func-name@^2.0.0: resolved "https://registry.yarnpkg.com/get-func-name/-/get-func-name-2.0.0.tgz#ead774abee72e20409433a066366023dd6887a41" integrity sha512-Hm0ixYtaSZ/V7C8FJrtZIuBBI+iSgL+1Aq82zSu8VQNB4S3Gk8e7Qs3VwBDJAhmRZcFqkl3tQu36g/Foh5I5ig== -get-intrinsic@^1.0.2: +get-intrinsic@^1.0.2, get-intrinsic@^1.1.1, get-intrinsic@^1.1.3, get-intrinsic@^1.2.0, get-intrinsic@^1.2.1: version "1.2.1" resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.2.1.tgz#d295644fed4505fc9cde952c37ee12b477a83d82" integrity sha512-2DcsyfABl+gVHEfCOaTrWgyt+tb6MSEGmKq+kI5HwLbIYgjgmMcV8KQ41uaKz1xxUcn9tJtgFbQUEVcEbd0FYw== @@ -2799,15 +2624,6 @@ get-intrinsic@^1.0.2: has-proto "^1.0.1" has-symbols "^1.0.3" -get-intrinsic@^1.1.0, get-intrinsic@^1.1.1, get-intrinsic@^1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.1.2.tgz#336975123e05ad0b7ba41f152ee4aadbea6cf598" - integrity sha512-Jfm3OyCxHh9DJyc28qGk+JmfkpO41A4XkneDSujN9MDXrm4oDKdHvndhZ2dN94+ERNfkYJWDclW6k2L/ZGHjXA== - dependencies: - function-bind "^1.1.1" - has "^1.0.3" - has-symbols "^1.0.3" - get-port@^3.1.0: version "3.2.0" resolved "https://registry.yarnpkg.com/get-port/-/get-port-3.2.0.tgz#dd7ce7de187c06c8bf353796ac71e099f0980ebc" @@ -2890,7 +2706,7 @@ glob@^5.0.15: once "^1.3.0" path-is-absolute "^1.0.0" -glob@^7.0.0, glob@^7.1.2, glob@^7.1.3, glob@^7.1.6: +glob@^7.0.0, glob@^7.1.3, glob@^7.1.6: version "7.2.3" resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.3.tgz#b8df0fb802bbfa8e89bd1d938b4e16578ed44f2b" integrity sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q== @@ -2902,6 +2718,17 @@ glob@^7.0.0, glob@^7.1.2, glob@^7.1.3, glob@^7.1.6: once "^1.3.0" path-is-absolute "^1.0.0" +glob@^8.0.3: + version "8.1.0" + resolved "https://registry.yarnpkg.com/glob/-/glob-8.1.0.tgz#d388f656593ef708ee3e34640fdfb99a9fd1c33e" + integrity sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ== + dependencies: + fs.realpath "^1.0.0" + inflight "^1.0.4" + inherits "2" + minimatch "^5.0.1" + once "^1.3.0" + global-modules@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/global-modules/-/global-modules-2.0.0.tgz#997605ad2345f27f51539bea26574421215c7780" @@ -2918,10 +2745,12 @@ global-prefix@^3.0.0: kind-of "^6.0.2" which "^1.3.1" -globals@^11.7.0: - version "11.12.0" - resolved "https://registry.yarnpkg.com/globals/-/globals-11.12.0.tgz#ab8795338868a0babd8525758018c2a7eb95c42e" - integrity sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA== +globalthis@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/globalthis/-/globalthis-1.0.3.tgz#5852882a52b80dc301b0660273e1ed082f0b6ccf" + integrity sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA== + dependencies: + define-properties "^1.1.3" globby@^10.0.1: version "10.0.2" @@ -2937,28 +2766,30 @@ globby@^10.0.1: merge2 "^1.2.3" slash "^3.0.0" -graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.1.9: +gopd@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/gopd/-/gopd-1.0.1.tgz#29ff76de69dac7489b7c0918a5788e56477c332c" + integrity sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA== + dependencies: + get-intrinsic "^1.1.3" + +graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.1.9, graceful-fs@^4.2.0, graceful-fs@^4.2.4: version "4.2.11" resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.11.tgz#4183e4e8bf08bb6e05bbb2f7d2e0c8f712ca40e3" integrity sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ== -graceful-fs@^4.2.0, graceful-fs@^4.2.4: - version "4.2.10" - resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.10.tgz#147d3a006da4ca3ce14728c7aefc287c367d7a6c" - integrity sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA== - growl@1.10.5: version "1.10.5" resolved "https://registry.yarnpkg.com/growl/-/growl-1.10.5.tgz#f2735dc2283674fa67478b10181059355c369e5e" integrity sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA== handlebars@^4.0.1: - version "4.7.7" - resolved "https://registry.yarnpkg.com/handlebars/-/handlebars-4.7.7.tgz#9ce33416aad02dbd6c8fafa8240d5d98004945a1" - integrity sha512-aAcXm5OAfE/8IXkcZvCepKU3VzW1/39Fb5ZuqMtgI/hT8X2YgoMvBY5dLhq/cpOvw7Lk1nK/UF71aLG/ZnVYRA== + version "4.7.8" + resolved "https://registry.yarnpkg.com/handlebars/-/handlebars-4.7.8.tgz#41c42c18b1be2365439188c77c6afae71c0cd9e9" + integrity sha512-vafaFqs8MZkRrSX7sFVUdo3ap/eNiLnb4IakshzvP56X5Nr1iGKAIqdX6tMlm6HcNRIkr6AxO5jFEoJzzpT8aQ== dependencies: minimist "^1.2.5" - neo-async "^2.6.0" + neo-async "^2.6.2" source-map "^0.6.1" wordwrap "^1.0.0" optionalDependencies: @@ -2977,10 +2808,10 @@ har-validator@~5.1.3: ajv "^6.12.3" har-schema "^2.0.0" -hardhat-abi-exporter@^2.10.0: - version "2.10.0" - resolved "https://registry.yarnpkg.com/hardhat-abi-exporter/-/hardhat-abi-exporter-2.10.0.tgz#4498982bb8942178a3b6d9368b0def8d18b49cc8" - integrity sha512-ynYGUptkal3leyUNGP3aJ6GRYtSHed3lHcfMv6imawqEd7MERueEkeFy+X4kWH3Vf5w4k6xeeCJHJsegGBJUPA== +hardhat-abi-exporter@^2.10.1: + version "2.10.1" + resolved "https://registry.yarnpkg.com/hardhat-abi-exporter/-/hardhat-abi-exporter-2.10.1.tgz#b14884e233c73fe3f43360f014ad7fd6df4b6d25" + integrity sha512-X8GRxUTtebMAd2k4fcPyVnCdPa6dYK4lBsrwzKP5yiSq4i+WadWPIumaLfce53TUf/o2TnLpLOduyO1ylE2NHQ== dependencies: "@ethersproject/abi" "^5.5.0" delete-empty "^3.0.0" @@ -2992,32 +2823,14 @@ hardhat-celo@^0.0.4: dependencies: "@nomicfoundation/hardhat-toolbox" "^1.0.2" -hardhat-contract-sizer@^2.6.1: - version "2.6.1" - resolved "https://registry.yarnpkg.com/hardhat-contract-sizer/-/hardhat-contract-sizer-2.6.1.tgz#2b0046a55fa1ec96f19fdab7fde372377401c874" - integrity sha512-b8wS7DBvyo22kmVwpzstAQTdDCThpl/ySBqZh5ga9Yxjf61/uTL12TEg5nl7lDeWy73ntEUzxMwY6XxbQEc2wA== +hardhat-contract-sizer@^2.10.0: + version "2.10.0" + resolved "https://registry.yarnpkg.com/hardhat-contract-sizer/-/hardhat-contract-sizer-2.10.0.tgz#72646f43bfe50e9a5702c9720c9bc3e77d93a2c9" + integrity sha512-QiinUgBD5MqJZJh1hl1jc9dNnpJg7eE/w4/4GEnrcmZJJTDbVFNe3+/3Ep24XqISSkYxRz36czcPHKHd/a0dwA== dependencies: chalk "^4.0.0" cli-table3 "^0.6.0" - -hardhat-deploy@^0.11.10: - version "0.11.14" - resolved "https://registry.yarnpkg.com/hardhat-deploy/-/hardhat-deploy-0.11.14.tgz#8be2dcb0fa3560e59abba2ca33212d98f201b904" - integrity sha512-QL/ETKUj8a5QNZujXJCYFf7vwSvtKFmQhrSFe2S6x2TCHqhYt7heiR0H3YCxFGO8d1iF2QNL2wYtwvL+i5VvLQ== - dependencies: - "@types/qs" "^6.9.7" - axios "^0.21.1" - chalk "^4.1.2" - chokidar "^3.5.2" - debug "^4.3.2" - enquirer "^2.3.6" - ethers "^5.5.3" - form-data "^4.0.0" - fs-extra "^10.0.0" - match-all "^1.2.6" - murmur-128 "^0.2.1" - qs "^6.9.4" - zksync-web3 "^0.8.1" + strip-ansi "^6.0.0" hardhat-gas-reporter@^1.0.9: version "1.0.9" @@ -3036,10 +2849,10 @@ hardhat-prettier@^0.0.1: chalk "^4.1.0" glob "^7.1.6" -hardhat@^2.11.1: - version "2.14.0" - resolved "https://registry.yarnpkg.com/hardhat/-/hardhat-2.14.0.tgz#b60c74861494aeb1b50803cf04cc47865a42b87a" - integrity sha512-73jsInY4zZahMSVFurSK+5TNCJTXMv+vemvGia0Ac34Mm19fYp6vEPVGF3sucbumszsYxiTT2TbS8Ii2dsDSoQ== +hardhat@^2.17.1: + version "2.17.1" + resolved "https://registry.yarnpkg.com/hardhat/-/hardhat-2.17.1.tgz#4b6c8c8f624fd23d9f40185a4af24815d05a486a" + integrity sha512-1PxRkfjhEzXs/wDxI5YgzYBxNmvzifBTjYzuopwel+vXpAhCudplusJthN5eig0FTs4qbi828DBIITEDh8x9LA== dependencies: "@ethersproject/abi" "^5.1.2" "@metamask/eth-sig-util" "^4.0.0" @@ -3057,7 +2870,6 @@ hardhat@^2.11.1: "@sentry/node" "^5.18.1" "@types/bn.js" "^5.1.0" "@types/lru-cache" "^5.1.0" - abort-controller "^3.0.0" adm-zip "^0.4.16" aggregate-error "^3.0.0" ansi-escapes "^4.3.0" @@ -3080,7 +2892,6 @@ hardhat@^2.11.1: mnemonist "^0.38.0" mocha "^10.0.0" p-map "^4.0.0" - qs "^6.7.0" raw-body "^2.4.1" resolve "1.17.0" semver "^6.3.0" @@ -3232,47 +3043,34 @@ https-proxy-agent@^5.0.0: agent-base "6" debug "4" -husky@^8.0.1: - version "8.0.1" - resolved "https://registry.yarnpkg.com/husky/-/husky-8.0.1.tgz#511cb3e57de3e3190514ae49ed50f6bc3f50b3e9" - integrity sha512-xs7/chUH/CKdOCs7Zy0Aev9e/dKOMZf3K1Az1nar3tzlv0jfqnYtu235bstsWTmXOR0EfINrPa97yy4Lz6RiKw== +husky@^8.0.3: + version "8.0.3" + resolved "https://registry.yarnpkg.com/husky/-/husky-8.0.3.tgz#4936d7212e46d1dea28fef29bb3a108872cd9184" + integrity sha512-+dQSyqPh4x1hlO1swXBiNb2HzTDN1I2IGLQx1GrBuiqFJfoMrnZWwVmatvSiO+Iz8fBUnf+lekwNo4c2LlXItg== -iconv-lite@0.4.24, iconv-lite@^0.4.24: +iconv-lite@0.4.24: version "0.4.24" resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA== dependencies: safer-buffer ">= 2.1.2 < 3" -ieee754@^1.2.1: +ieee754@^1.1.4, ieee754@^1.2.1: version "1.2.1" resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.2.1.tgz#8eb7a10a63fff25d15a57b001586d177d1b0d352" integrity sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA== -ignore@^4.0.6: - version "4.0.6" - resolved "https://registry.yarnpkg.com/ignore/-/ignore-4.0.6.tgz#750e3db5862087b4737ebac8207ffd1ef27b25fc" - integrity sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg== - -ignore@^5.1.1: - version "5.2.0" - resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.2.0.tgz#6d3bac8fa7fe0d45d9f9be7bac2fc279577e345a" - integrity sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ== +ignore@^5.1.1, ignore@^5.2.4: + version "5.2.4" + resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.2.4.tgz#a291c0c6178ff1b960befe47fcdec301674a6324" + integrity sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ== immutable@^4.0.0-rc.12: - version "4.3.0" - resolved "https://registry.yarnpkg.com/immutable/-/immutable-4.3.0.tgz#eb1738f14ffb39fd068b1dbe1296117484dd34be" - integrity sha512-0AOCmOip+xgJwEVTQj1EfiDDOkPmuyllDuTuEX+DDXUgapLAsBIfkg3sxCYyCEA8mQqZrrxPUGjcOQ2JS3WLkg== - -import-fresh@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-2.0.0.tgz#d81355c15612d386c61f9ddd3922d4304822a546" - integrity sha512-eZ5H8rcgYazHbKC3PG4ClHNykCSxtAhxSSEM+2mb+7evD2CKF5V7c0dNum7AdpDh0ZdICwZY9sRSn8f+KH96sg== - dependencies: - caller-path "^2.0.0" - resolve-from "^3.0.0" + version "4.3.2" + resolved "https://registry.yarnpkg.com/immutable/-/immutable-4.3.2.tgz#f89d910f8dfb6e15c03b2cae2faaf8c1f66455fe" + integrity sha512-oGXzbEDem9OOpDWZu88jGiYCvIsLHMvGw+8OXlpsvTFvIQplQbjg1B1cvKg8f7Hoch6+NGjpPsH1Fr+Mc2D1aA== -import-fresh@^3.0.0: +import-fresh@^3.2.1: version "3.3.0" resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.3.0.tgz#37162c25fcb9ebaa2e6e53d5b4d88ce17d9e0c2b" integrity sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw== @@ -3280,16 +3078,6 @@ import-fresh@^3.0.0: parent-module "^1.0.0" resolve-from "^4.0.0" -imul@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/imul/-/imul-1.0.1.tgz#9d5867161e8b3de96c2c38d5dc7cb102f35e2ac9" - integrity sha512-WFAgfwPLAjU66EKt6vRdTlKj4nAgIDQzh29JonLa4Bqtl6D8JrIMvWjCnx7xEjVNmP3U0fM5o8ZObk7d0f62bA== - -imurmurhash@^0.1.4: - version "0.1.4" - resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" - integrity sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA== - indent-string@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-4.0.0.tgz#624f8f4497d619b2d9768531d58f4122854d7251" @@ -3313,31 +3101,12 @@ ini@^1.3.5: resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.8.tgz#a29da425b48806f34767a4efce397269af28432c" integrity sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew== -inquirer@^6.2.2: - version "6.5.2" - resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-6.5.2.tgz#ad50942375d036d327ff528c08bd5fab089928ca" - integrity sha512-cntlB5ghuB0iuO65Ovoi8ogLHiWGs/5yNrtUcKjFhSSiVeAIVpD7koaSU9RM8mpXw5YDi9RdYXGQMaOURB7ycQ== - dependencies: - ansi-escapes "^3.2.0" - chalk "^2.4.2" - cli-cursor "^2.1.0" - cli-width "^2.0.0" - external-editor "^3.0.3" - figures "^2.0.0" - lodash "^4.17.12" - mute-stream "0.0.7" - run-async "^2.2.0" - rxjs "^6.4.0" - string-width "^2.1.0" - strip-ansi "^5.1.0" - through "^2.3.6" - -internal-slot@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/internal-slot/-/internal-slot-1.0.3.tgz#7347e307deeea2faac2ac6205d4bc7d34967f59c" - integrity sha512-O0DB1JC/sPyZl7cIo78n5dR7eUSwwpYPiXRhTzNxZVAMUuB8vlnRFyLxdrVToks6XPLVnFfbzaVd5WLjhgg+vA== +internal-slot@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/internal-slot/-/internal-slot-1.0.5.tgz#f2a2ee21f668f8627a4667f309dc0f4fb6674986" + integrity sha512-Y+R5hJrzs52QCG2laLn4udYVnxsfny9CpOhNhUvk/SSSVyF6T27FzRbF0sroPidSu3X8oEAkOn2K804mjpt6UQ== dependencies: - get-intrinsic "^1.1.0" + get-intrinsic "^1.2.0" has "^1.0.3" side-channel "^1.0.4" @@ -3353,6 +3122,15 @@ io-ts@1.10.4: dependencies: fp-ts "^1.0.0" +is-array-buffer@^3.0.1, is-array-buffer@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/is-array-buffer/-/is-array-buffer-3.0.2.tgz#f2653ced8412081638ecb0ebbd0c41c6e0aecbbe" + integrity sha512-y+FyyR/w8vfIRq4eQcM1EYgSTnmHXPqaF+IgzgraytCFq5Xh8lllDVmAZolPJiZttZLeFSINPYMaEJ7/vWUa1w== + dependencies: + call-bind "^1.0.2" + get-intrinsic "^1.2.0" + is-typed-array "^1.1.10" + is-arrayish@^0.2.1: version "0.2.1" resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d" @@ -3380,20 +3158,20 @@ is-boolean-object@^1.1.0: call-bind "^1.0.2" has-tostringtag "^1.0.0" -is-buffer@^2.0.5: +is-buffer@^2.0.5, is-buffer@~2.0.3: version "2.0.5" resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-2.0.5.tgz#ebc252e400d22ff8d77fa09888821a24a658c191" integrity sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ== -is-callable@^1.1.4, is-callable@^1.2.4: - version "1.2.4" - resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.2.4.tgz#47301d58dd0259407865547853df6d61fe471945" - integrity sha512-nsuwtxZfMX67Oryl9LCQ+upnC0Z0BgpwntpS89m1H/TLF0zNfzfLMV/9Wa/6MZsj0acpEjAO0KF1xT6ZdLl95w== +is-callable@^1.1.3, is-callable@^1.1.4, is-callable@^1.2.7: + version "1.2.7" + resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.2.7.tgz#3bc2a85ea742d9e36205dcacdd72ca1fdc51b055" + integrity sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA== -is-core-module@^2.9.0: - version "2.10.0" - resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.10.0.tgz#9012ede0a91c69587e647514e1d5277019e728ed" - integrity sha512-Erxj2n/LDAZ7H8WNJXd9tw38GYM3dv8rk8Zcs+jJuxYTW7sozH+SS8NtrSjVL1/vpLvWi1hxy96IzjJ3EHTJJg== +is-core-module@^2.13.0: + version "2.13.0" + resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.13.0.tgz#bb52aa6e2cbd49a30c2ba68c42bf3435ba6072db" + integrity sha512-Z7dk6Qo8pOCp3l4tsX2C5ZVas4V+UxwQodwZhLopL91TX8UyyHEXafPcyoeeWuLrwzHcr3igO78wNLwHJHsMCQ== dependencies: has "^1.0.3" @@ -3404,11 +3182,6 @@ is-date-object@^1.0.1: dependencies: has-tostringtag "^1.0.0" -is-directory@^0.3.1: - version "0.3.1" - resolved "https://registry.yarnpkg.com/is-directory/-/is-directory-0.3.1.tgz#61339b6f2475fc772fd9c9d83f5c8575dc154ae1" - integrity sha512-yVChGzahRFvbkscn2MlwGismPO12i9+znNruC5gVEntG3qu0xQMzsGg/JFbrsqDOHtHFPci+V5aP5T9I+yeKqw== - is-extglob@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" @@ -3487,6 +3260,13 @@ is-symbol@^1.0.2, is-symbol@^1.0.3: dependencies: has-symbols "^1.0.2" +is-typed-array@^1.1.10, is-typed-array@^1.1.9: + version "1.1.12" + resolved "https://registry.yarnpkg.com/is-typed-array/-/is-typed-array-1.1.12.tgz#d0bab5686ef4a76f7a73097b95470ab199c57d4a" + integrity sha512-Z14TF2JNG8Lss5/HMqt0//T9JeHXttXy5pH/DBU4vi98ozO2btxzq9MwYDZYnKwU8nRsz/+GVFVRDq3DkVuSPg== + dependencies: + which-typed-array "^1.1.11" + is-typedarray@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a" @@ -3504,25 +3284,43 @@ is-weakref@^1.0.2: dependencies: call-bind "^1.0.2" -isarray@~1.0.0: +isarray@^1.0.0, isarray@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" integrity sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ== +isarray@^2.0.5: + version "2.0.5" + resolved "https://registry.yarnpkg.com/isarray/-/isarray-2.0.5.tgz#8af1e4c1221244cc62459faf38940d4e644a5723" + integrity sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw== + isexe@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" integrity sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw== +isomorphic-unfetch@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/isomorphic-unfetch/-/isomorphic-unfetch-3.1.0.tgz#87341d5f4f7b63843d468438128cb087b7c3e98f" + integrity sha512-geDJjpoZ8N0kWexiwkX8F9NkTsXhetLPVbZFQ+JTW239QNOwvB0gniuR1Wc6f0AMTn7/mFGyXvHTifrCp/GH8Q== + dependencies: + node-fetch "^2.6.1" + unfetch "^4.2.0" + isstream@~0.1.2: version "0.1.2" resolved "https://registry.yarnpkg.com/isstream/-/isstream-0.1.2.tgz#47e63f7af55afa6f92e1500e690eb8b8529c099a" integrity sha512-Yljz7ffyPbrLpLngrMtZ7NduUgVvi6wG9RJ9IUcyCd59YQ911PBJphODUcbOVbqYfxe1wuYf/LJ8PauMRwsM/g== +js-cookie@^2.2.1: + version "2.2.1" + resolved "https://registry.yarnpkg.com/js-cookie/-/js-cookie-2.2.1.tgz#69e106dc5d5806894562902aa5baec3744e9b2b8" + integrity sha512-HvdH2LzI/EAZcUwA8+0nKNtWHqS+ZmijLA30RwZA0bo7ToCckjK5MkGhjED9KoRcXO6BaGI3I9UIzSA1FKFPOQ== + js-sdsl@^4.1.4: - version "4.4.0" - resolved "https://registry.yarnpkg.com/js-sdsl/-/js-sdsl-4.4.0.tgz#8b437dbe642daa95760400b602378ed8ffea8430" - integrity sha512-FfVSdx6pJ41Oa+CF7RDaFmTnCaFhua+SNYQX74riGOpl96x+2jQCqEfQ2bnXu/5DPCqlRuiqyvTJM0Qjz26IVg== + version "4.4.2" + resolved "https://registry.yarnpkg.com/js-sdsl/-/js-sdsl-4.4.2.tgz#2e3c031b1f47d3aca8b775532e3ebb0818e7f847" + integrity sha512-dwXFwByc/ajSV6m5bcKAPwe4yDDF6D614pxmIi5odytzxRlwqF6nwoiCek80Ixc7Cvma5awClxrzFtxCQvcM8w== js-sha3@0.5.7: version "0.5.7" @@ -3547,7 +3345,7 @@ js-yaml@3.13.1: argparse "^1.0.7" esprima "^4.0.0" -js-yaml@3.x, js-yaml@^3.12.0, js-yaml@^3.13.0, js-yaml@^3.13.1, js-yaml@^3.14.0: +js-yaml@3.x: version "3.14.1" resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.14.1.tgz#dae812fdb3825fa306609a8717383c50c36a0537" integrity sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g== @@ -3555,7 +3353,7 @@ js-yaml@3.x, js-yaml@^3.12.0, js-yaml@^3.13.0, js-yaml@^3.13.1, js-yaml@^3.14.0: argparse "^1.0.7" esprima "^4.0.0" -js-yaml@4.1.0: +js-yaml@4.1.0, js-yaml@^4.1.0: version "4.1.0" resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-4.1.0.tgz#c1fb65f8f5017901cdd2c951864ba18458a10602" integrity sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA== @@ -3567,10 +3365,10 @@ jsbn@~0.1.0: resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-0.1.1.tgz#a5e654c2e5a2deb5f201d96cefbca80c0ef2f513" integrity sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg== -json-parse-better-errors@^1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz#bb867cfb3450e69107c131d1c514bab3dc8bcaa9" - integrity sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw== +json-parse-even-better-errors@^2.3.0: + version "2.3.1" + resolved "https://registry.yarnpkg.com/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz#7c47805a94319928e05777405dc12e1f7a4ee02d" + integrity sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w== json-schema-traverse@^0.4.1: version "0.4.1" @@ -3587,11 +3385,6 @@ json-schema@0.4.0: resolved "https://registry.yarnpkg.com/json-schema/-/json-schema-0.4.0.tgz#f7de4cf6efab838ebaeb3236474cbba5a1930ab5" integrity sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA== -json-stable-stringify-without-jsonify@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz#9db7b59496ad3f3cfef30a75142d2d930ad72651" - integrity sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw== - json-stringify-safe@~5.0.1: version "5.0.1" resolved "https://registry.yarnpkg.com/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz#1296a2d58fd45f19a0f6ce01d65701e2c735b6eb" @@ -3677,7 +3470,7 @@ level@^8.0.0: browser-level "^1.0.1" classic-level "^1.2.0" -levn@^0.3.0, levn@~0.3.0: +levn@~0.3.0: version "0.3.0" resolved "https://registry.yarnpkg.com/levn/-/levn-0.3.0.tgz#3b09924edf9f083c0490fdd4c0bc4421e04764ee" integrity sha512-0OO4y2iOHix2W6ujICbKIaEQXvFQHue65vUG3pb5EUomzPI90z9hsA1VsO/dbIIpC53J8gxM9Q4Oho0jrCM/yA== @@ -3685,6 +3478,11 @@ levn@^0.3.0, levn@~0.3.0: prelude-ls "~1.1.2" type-check "~0.3.2" +lines-and-columns@^1.1.6: + version "1.2.4" + resolved "https://registry.yarnpkg.com/lines-and-columns/-/lines-and-columns-1.2.4.tgz#eca284f75d2965079309dc0ad9255abb2ebc1632" + integrity sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg== + locate-path@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-2.0.0.tgz#2b568b265eec944c6d9c0de9c3dbbbca0354cd8e" @@ -3713,12 +3511,17 @@ lodash.camelcase@^4.3.0: resolved "https://registry.yarnpkg.com/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz#b28aa6288a2b9fc651035c7711f65ab6190331a6" integrity sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA== +lodash.isequal@^4.5.0: + version "4.5.0" + resolved "https://registry.yarnpkg.com/lodash.isequal/-/lodash.isequal-4.5.0.tgz#415c4478f2bcc30120c22ce10ed3226f7d3e18e0" + integrity sha512-pDo3lu8Jhfjqls6GkMgpahsF9kCyayhgykjyLMNFTKWrpVdAQtYyB4muAMWozBB4ig/dtWAmsMxLEI8wuz+DYQ== + lodash.truncate@^4.4.2: version "4.4.2" resolved "https://registry.yarnpkg.com/lodash.truncate/-/lodash.truncate-4.4.2.tgz#5a350da0b1113b837ecfffd5812cbe58d6eae193" integrity sha512-jttmRe7bRse52OsWIMDLaXxWqRAmtIUccAQ3garviCqJjafXOfNMO0yMfNpdD6zbGaTU0P5Nz7e7gAT6cKmJRw== -lodash@^4.17.11, lodash@^4.17.12, lodash@^4.17.14, lodash@^4.17.15, lodash@^4.17.19, lodash@^4.17.21: +lodash@^4.17.11, lodash@^4.17.14, lodash@^4.17.15, lodash@^4.17.19, lodash@^4.17.21: version "4.17.21" resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== @@ -3739,9 +3542,9 @@ log-symbols@4.1.0: is-unicode-supported "^0.1.0" loupe@^2.3.1: - version "2.3.4" - resolved "https://registry.yarnpkg.com/loupe/-/loupe-2.3.4.tgz#7e0b9bffc76f148f9be769cb1321d3dcf3cb25f3" - integrity sha512-OvKfgCC2Ndby6aSTREl5aCCPTNIzlDfQZvZxNUrBrihDhL3xcrYegTblhmEiCrg2kKQz4XsFIaemE5BF4ybSaQ== + version "2.3.6" + resolved "https://registry.yarnpkg.com/loupe/-/loupe-2.3.6.tgz#76e4af498103c532d1ecc9be102036a21f787b53" + integrity sha512-RaPMZKiMy8/JruncMU5Bt6na1eftNoo++R4Y+N2FrxkDVTrGvcyzFTsaGif4QTeKESheMGegbhw6iUAq+5A8zA== dependencies: get-func-name "^2.0.0" @@ -3752,6 +3555,13 @@ lru-cache@^5.1.1: dependencies: yallist "^3.0.2" +lru-cache@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-6.0.0.tgz#6d6fe6570ebd96aaf90fcad1dafa3b2566db3a94" + integrity sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA== + dependencies: + yallist "^4.0.0" + lru_map@^0.3.3: version "0.3.3" resolved "https://registry.yarnpkg.com/lru_map/-/lru_map-0.3.3.tgz#b5c8351b9464cbd750335a79650a0ec0e56118dd" @@ -3767,11 +3577,6 @@ markdown-table@^1.1.3: resolved "https://registry.yarnpkg.com/markdown-table/-/markdown-table-1.1.3.tgz#9fcb69bcfdb8717bfd0398c6ec2d93036ef8de60" integrity sha512-1RUZVgQlpJSPWYbFSpmudq5nHY1doEIv89gBtF0s4gW1GF2XorxcA/70M5vq7rLv0a6mhOUccRsqkwhwLCIQ2Q== -match-all@^1.2.6: - version "1.2.6" - resolved "https://registry.yarnpkg.com/match-all/-/match-all-1.2.6.tgz#66d276ad6b49655551e63d3a6ee53e8be0566f8d" - integrity sha512-0EESkXiTkWzrQQntBu2uzKvLu6vVkUGz40nGPbSZuegcfE5UuSzNjLaIu76zJWuaT/2I3Z/8M06OlUOZLGwLlQ== - mcl-wasm@^0.7.1: version "0.7.9" resolved "https://registry.yarnpkg.com/mcl-wasm/-/mcl-wasm-0.7.9.tgz#c1588ce90042a8700c3b60e40efb339fc07ab87f" @@ -3825,11 +3630,6 @@ mime-types@^2.1.12, mime-types@~2.1.19: dependencies: mime-db "1.52.0" -mimic-fn@^1.0.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-1.2.0.tgz#820c86a39334640e99516928bd03fca88057d022" - integrity sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ== - minimalistic-assert@^1.0.0, minimalistic-assert@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz#2e194de044626d4a10e7f7fbc00ce73e83e4d5c7" @@ -3840,18 +3640,44 @@ minimalistic-crypto-utils@^1.0.1: resolved "https://registry.yarnpkg.com/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz#f6c00c1c0b082246e5c4d99dfb8c7c083b2b582a" integrity sha512-JIYlbt6g8i5jKfJ3xz7rF0LXmv2TkDxBLUkiBeZ7bAx4GnnNMr8xFpGnOxn6GhTEHx3SjRrZEoU+j04prX1ktg== -"minimatch@2 || 3", minimatch@3.0.4, minimatch@5.0.1, minimatch@^3.0.4, minimatch@^3.1.1, minimatch@^3.1.2: +"minimatch@2 || 3", minimatch@^3.0.4, minimatch@^3.0.5, minimatch@^3.1.1: version "3.1.2" resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.1.2.tgz#19cd194bfd3e428f049a70817c038d89ab4be35b" integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw== dependencies: brace-expansion "^1.1.7" +minimatch@3.0.4: + version "3.0.4" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083" + integrity sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA== + dependencies: + brace-expansion "^1.1.7" + +minimatch@5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-5.0.1.tgz#fb9022f7528125187c92bd9e9b6366be1cf3415b" + integrity sha512-nLDxIFRyhDblz3qMuq+SoRZED4+miJ/G+tdDrjkkkRnjAsBexeGpgjLEQ0blJy7rHhR2b93rhQY4SvyWu9v03g== + dependencies: + brace-expansion "^2.0.1" + +minimatch@^5.0.1: + version "5.1.6" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-5.1.6.tgz#1cfcb8cf5522ea69952cd2af95ae09477f122a96" + integrity sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g== + dependencies: + brace-expansion "^2.0.1" + minimist@^1.2.0, minimist@^1.2.5, minimist@^1.2.6: version "1.2.6" resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.6.tgz#8637a5b759ea0d6e98702cfb3a9283323c93af44" integrity sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q== +minimist@^1.2.7: + version "1.2.8" + resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.8.tgz#c1a464e7693302e082a075cee0c057741ac4772c" + integrity sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA== + mkdirp@0.5.5: version "0.5.5" resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.5.tgz#d91cefd62d1436ca0f41620e251288d420099def" @@ -3859,7 +3685,7 @@ mkdirp@0.5.5: dependencies: minimist "^1.2.5" -mkdirp@0.5.x, mkdirp@^0.5.1: +mkdirp@0.5.x: version "0.5.6" resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.6.tgz#7def03d2432dcae4ba1d611445c48396062255f6" integrity sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw== @@ -3970,11 +3796,6 @@ module-error@^1.0.1, module-error@^1.0.2: resolved "https://registry.yarnpkg.com/module-error/-/module-error-1.0.2.tgz#8d1a48897ca883f47a45816d4fb3e3c6ba404d86" integrity sha512-0yuvsqSCv8LbaOKhnsQ/T5JhyFlCYLPXK3U2sgV10zoKQwzs/MyfuQUOZQ1V/6OCOJsK/TRgNVrPuPDqtdMFtA== -ms@2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" - integrity sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A== - ms@2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.1.tgz#30a5864eb3ebb0a66f2ebe6d727af06a09d86e0a" @@ -3990,20 +3811,6 @@ ms@2.1.3, ms@^2.1.1: resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== -murmur-128@^0.2.1: - version "0.2.1" - resolved "https://registry.yarnpkg.com/murmur-128/-/murmur-128-0.2.1.tgz#a9f6568781d2350ecb1bf80c14968cadbeaa4b4d" - integrity sha512-WseEgiRkI6aMFBbj8Cg9yBj/y+OdipwVC7zUo3W2W1JAJITwouUOtpqsmGSg67EQmwwSyod7hsVsWY5LsrfQVg== - dependencies: - encode-utf8 "^1.0.2" - fmix "^0.1.0" - imul "^1.0.0" - -mute-stream@0.0.7: - version "0.0.7" - resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.7.tgz#3075ce93bc21b8fab43e1bc4da7e8115ed1e7bab" - integrity sha512-r65nCZhrbXXb6dXOACihYApHw2Q6pV0M3V0PSxd74N0+D8nzAdEAITq2oAjA1jVnKI+tGvEBUpqiMh0+rW6zDQ== - nanoid@3.3.3: version "3.3.3" resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.3.tgz#fd8e8b7aa761fe807dba2d1b98fb7241bb724a25" @@ -4014,21 +3821,11 @@ napi-macros@^2.2.2: resolved "https://registry.yarnpkg.com/napi-macros/-/napi-macros-2.2.2.tgz#817fef20c3e0e40a963fbf7b37d1600bd0201044" integrity sha512-hmEVtAGYzVQpCKdbQea4skABsdXW4RUh5t5mJ2zzqowJS2OyXZTU1KhDVFhx+NlWZ4ap9mqR9TcDO3LTTttd+g== -natural-compare@^1.4.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" - integrity sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw== - -neo-async@^2.6.0: +neo-async@^2.6.2: version "2.6.2" resolved "https://registry.yarnpkg.com/neo-async/-/neo-async-2.6.2.tgz#b4aafb93e3aeb2d8174ca53cf163ab7d7308305f" integrity sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw== -nice-try@^1.0.4: - version "1.0.5" - resolved "https://registry.yarnpkg.com/nice-try/-/nice-try-1.0.5.tgz#a3378a7696ce7d223e88fc9b764bd7ef1089e366" - integrity sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ== - node-addon-api@^2.0.0: version "2.0.2" resolved "https://registry.yarnpkg.com/node-addon-api/-/node-addon-api-2.0.2.tgz#432cfa82962ce494b132e9d72a15b29f71ff5d32" @@ -4049,15 +3846,22 @@ node-environment-flags@1.0.6: object.getownpropertydescriptors "^2.0.3" semver "^5.7.0" +node-fetch@^2.6.0, node-fetch@^2.6.1: + version "2.6.12" + resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.6.12.tgz#02eb8e22074018e3d5a83016649d04df0e348fba" + integrity sha512-C/fGU2E8ToujUivIO0H+tpQ6HWo4eEmchoPIoXtxCrVghxdKq+QOHqEZW7tuP3KlV3bC8FRMO5nMCC7Zm1VP6g== + dependencies: + whatwg-url "^5.0.0" + node-gyp-build@^4.2.0, node-gyp-build@^4.3.0: version "4.6.0" resolved "https://registry.yarnpkg.com/node-gyp-build/-/node-gyp-build-4.6.0.tgz#0c52e4cbf54bbd28b709820ef7b6a3c2d6209055" integrity sha512-NTZVKn9IylLwUzaKjkas1e4u2DLNcV4rdYagA4PWdPwW87Bi7z+BznyKSRwS/761tV/lzCGXplWsiaMjLqP2zQ== -node-watch@^0.7.3: - version "0.7.3" - resolved "https://registry.yarnpkg.com/node-watch/-/node-watch-0.7.3.tgz#6d4db88e39c8d09d3ea61d6568d80e5975abc7ab" - integrity sha512-3l4E8uMPY1HdMMryPRUAl+oIHtXtyiTlIiESNSVSNxcPfzAFzeTbXFQkZfAwBbo0B1qMSG8nUABx+Gd+YrbKrQ== +node-watch@^0.7.4: + version "0.7.4" + resolved "https://registry.yarnpkg.com/node-watch/-/node-watch-0.7.4.tgz#34557106948cd4b8ddff9aa3d284774004548824" + integrity sha512-RinNxoz4W1cep1b928fuFhvAQ5ag/+1UlMDV7rbyGthBIgsiEouS4kvRayvvboxii4m8eolKOIBo3OjDqbc+uQ== nofilter@^3.1.0: version "3.1.0" @@ -4094,12 +3898,7 @@ object-assign@^4.1.0: resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" integrity sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg== -object-inspect@^1.12.2: - version "1.12.2" - resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.12.2.tgz#c0641f26394532f28ab8d796ab954e43c009a8ea" - integrity sha512-z+cPxW0QGUp0mcqcsgQyLVRDoXFQbXOwBaqyF7VIgI4TWNQsDHrBpUQslRmIfAoYWdYzs6UlKJtB2XJpTaNSpQ== - -object-inspect@^1.9.0: +object-inspect@^1.12.3, object-inspect@^1.9.0: version "1.12.3" resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.12.3.tgz#ba62dffd67ee256c8c086dfae69e016cd1f198b9" integrity sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g== @@ -4130,14 +3929,15 @@ object.assign@^4.1.4: object-keys "^1.1.1" object.getownpropertydescriptors@^2.0.3: - version "2.1.4" - resolved "https://registry.yarnpkg.com/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.4.tgz#7965e6437a57278b587383831a9b829455a4bc37" - integrity sha512-sccv3L/pMModT6dJAYF3fzGMVcb38ysQ0tEE6ixv2yXJDtEIPph268OlAdJj5/qZMZDq2g/jqvwppt36uS/uQQ== + version "2.1.6" + resolved "https://registry.yarnpkg.com/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.6.tgz#5e5c384dd209fa4efffead39e3a0512770ccc312" + integrity sha512-lq+61g26E/BgHv0ZTFgRvi7NMEPuAxLkFU7rukXjc/AlwH4Am5xXVnIXy3un1bg/JPbXHrixRkK1itUzzPiIjQ== dependencies: - array.prototype.reduce "^1.0.4" + array.prototype.reduce "^1.0.5" call-bind "^1.0.2" - define-properties "^1.1.4" - es-abstract "^1.20.1" + define-properties "^1.2.0" + es-abstract "^1.21.2" + safe-array-concat "^1.0.0" obliterator@^2.0.0: version "2.0.4" @@ -4151,14 +3951,7 @@ once@1.x, once@^1.3.0: dependencies: wrappy "1" -onetime@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/onetime/-/onetime-2.0.1.tgz#067428230fd67443b2794b22bba528b6867962d4" - integrity sha512-oyyPpiMaKARvvcgip+JV+7zci5L8D1W9RZIz2l1o08AM3pfspitVWnPt3mzHcBPp12oYMTy0pqrFs/C+m3EwsQ== - dependencies: - mimic-fn "^1.0.0" - -optionator@^0.8.1, optionator@^0.8.2: +optionator@^0.8.1: version "0.8.3" resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.8.3.tgz#84fa1d036fe9d3c7e21d99884b601167ec8fb495" integrity sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA== @@ -4251,13 +4044,15 @@ parse-cache-control@^1.0.1: resolved "https://registry.yarnpkg.com/parse-cache-control/-/parse-cache-control-1.0.1.tgz#8eeab3e54fa56920fe16ba38f77fa21aacc2d74e" integrity sha512-60zvsJReQPX5/QP0Kzfd/VrpjScIQ7SHBW6bFCYfEP+fp0Eppr1SHhIO5nd1PjZtvclzSzES9D/p5nFJurwfWg== -parse-json@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-4.0.0.tgz#be35f5425be1f7f6c747184f98a788cb99477ee0" - integrity sha512-aOIos8bujGN93/8Ox/jPLh7RwVnPEysynVFE+fQZyg6jKELEHwzgKdLRFHUgXJL6kylijVSBC4BvN9OmsB48Rw== +parse-json@^5.0.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-5.2.0.tgz#c76fc66dee54231c962b22bcc8a72cf2f99753cd" + integrity sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg== dependencies: + "@babel/code-frame" "^7.0.0" error-ex "^1.3.1" - json-parse-better-errors "^1.0.1" + json-parse-even-better-errors "^2.3.0" + lines-and-columns "^1.1.6" path-exists@^3.0.0: version "3.0.0" @@ -4274,25 +4069,15 @@ path-is-absolute@^1.0.0: resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" integrity sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg== -path-is-inside@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/path-is-inside/-/path-is-inside-1.0.2.tgz#365417dede44430d1c11af61027facf074bdfc53" - integrity sha512-DUWJr3+ULp4zXmol/SZkFf3JGsS9/SIv+Y3Rt93/UjPpDpklB5f1er4O3POIbUuUJ3FXgqte2Q7SrU6zAqwk8w== - -path-key@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/path-key/-/path-key-2.0.1.tgz#411cadb574c5a140d3a4b1910d40d80cc9f40b40" - integrity sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw== - path-parse@^1.0.6, path-parse@^1.0.7: version "1.0.7" resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735" integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw== path-starts-with@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/path-starts-with/-/path-starts-with-2.0.0.tgz#ffd6d51926cd497022b44d392196033d5451892f" - integrity sha512-3UHTHbJz5+NLkPafFR+2ycJOjoc4WV2e9qCZCnm71zHiWaFrm1XniLVTkZXvaRgxr1xFh9JsTdicpH2yM03nLA== + version "2.0.1" + resolved "https://registry.yarnpkg.com/path-starts-with/-/path-starts-with-2.0.1.tgz#cd8b6213c141a9f2dd86c748310acdfa6493abb1" + integrity sha512-wZ3AeiRBRlNwkdUxvBANh0+esnt38DLffHDujZyRHkqkaKHTglnY2EP5UX3b8rdeiSutgO4y9NEJwXezNP5vHg== path-type@^4.0.0: version "4.0.0" @@ -4330,52 +4115,44 @@ pify@^4.0.1: resolved "https://registry.yarnpkg.com/pify/-/pify-4.0.1.tgz#4b2cd25c50d598735c50292224fd8c6df41e3231" integrity sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g== +pluralize@^8.0.0: + version "8.0.0" + resolved "https://registry.yarnpkg.com/pluralize/-/pluralize-8.0.0.tgz#1a6fa16a38d12a1901e0320fa017051c539ce3b1" + integrity sha512-Nc3IT5yHzflTfbjgqWcCPpo7DaKy4FnpB0l/zCAW0Tc7jxAiuqSxHasntB3D7887LSrA93kDJ9IXovxJYxyLCA== + prelude-ls@~1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.1.2.tgz#21932a549f5e52ffd9a827f570e04be62a97da54" integrity sha512-ESF23V4SKG6lVSGZgYNpbsiaAkdab6ZgOxe52p7+Kid3W3u3bxR4Vfd/o21dmN7jSt0IwgZ4v5MUd26FEtXE9w== -prettier-plugin-solidity@^1.0.0-beta.24: - version "1.0.0-beta.24" - resolved "https://registry.yarnpkg.com/prettier-plugin-solidity/-/prettier-plugin-solidity-1.0.0-beta.24.tgz#67573ca87098c14f7ccff3639ddd8a4cab2a87eb" - integrity sha512-6JlV5BBTWzmDSq4kZ9PTXc3eLOX7DF5HpbqmmaF+kloyUwOZbJ12hIYsUaZh2fVgZdV2t0vWcvY6qhILhlzgqg== +prettier-plugin-solidity@^1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/prettier-plugin-solidity/-/prettier-plugin-solidity-1.1.3.tgz#9a35124f578404caf617634a8cab80862d726cba" + integrity sha512-fQ9yucPi2sBbA2U2Xjh6m4isUTJ7S7QLc/XDDsktqqxYfTwdYKJ0EnnywXHwCGAaYbQNK+HIYPL1OemxuMsgeg== dependencies: - "@solidity-parser/parser" "^0.14.3" - emoji-regex "^10.1.0" - escape-string-regexp "^4.0.0" - semver "^7.3.7" + "@solidity-parser/parser" "^0.16.0" + semver "^7.3.8" solidity-comments-extractor "^0.0.7" - string-width "^4.2.3" -prettier@^1.14.3: - version "1.19.1" - resolved "https://registry.yarnpkg.com/prettier/-/prettier-1.19.1.tgz#f7d7f5ff8a9cd872a7be4ca142095956a60797cb" - integrity sha512-s7PoyDv/II1ObgQunCbB9PdLmUcBZcnWOcxDh7O0N/UwDEsHyqkW+Qh28jW+mVuCdx7gLB0BotYI1Y6uI9iyew== - -prettier@^2.3.1: +prettier@^2.3.1, prettier@^2.8.3: version "2.8.8" resolved "https://registry.yarnpkg.com/prettier/-/prettier-2.8.8.tgz#e8c5d7e98a4305ffe3de2e1fc4aca1a71c28b1da" integrity sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q== -prettier@^2.7.1: - version "2.7.1" - resolved "https://registry.yarnpkg.com/prettier/-/prettier-2.7.1.tgz#e235806850d057f97bb08368a4f7d899f7760c64" - integrity sha512-ujppO+MkdPqoVINuDFDRLClm7D78qbDt0/NR+wp5FqEZOoTNAjPHWj17QRhu7geIHJfcNhRk1XVQmF8Bp3ye+g== +prettier@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/prettier/-/prettier-3.0.1.tgz#65271fc9320ce4913c57747a70ce635b30beaa40" + integrity sha512-fcOWSnnpCrovBsmFZIGIy9UqK2FaI7Hqax+DIO0A9UxeVoY4iweyaFjS5TavZN97Hfehph0nhsZnjlVKzEQSrQ== process-nextick-args@~2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.1.tgz#7820d9b16120cc55ca9ae7792680ae7dba6d7fe2" integrity sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag== -progress@^2.0.0: - version "2.0.3" - resolved "https://registry.yarnpkg.com/progress/-/progress-2.0.3.tgz#7e8cf8d8f5b8f239c1bc68beb4eb78567d572ef8" - integrity sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA== - promise@^8.0.0: - version "8.2.0" - resolved "https://registry.yarnpkg.com/promise/-/promise-8.2.0.tgz#a1f6280ab67457fbfc8aad2b198c9497e9e5c806" - integrity sha512-+CMAlLHqwRYwBMXKCP+o8ns7DN+xHDUiI+0nArsiJ9y+kJVPLFxEaSw6Ha9s9H0tftxg2Yzl25wqj9G7m5wLZg== + version "8.3.0" + resolved "https://registry.yarnpkg.com/promise/-/promise-8.3.0.tgz#8cb333d1edeb61ef23869fbb8a4ea0279ab60e0a" + integrity sha512-rZPNPKTOYVNEEKFaq1HqTgOwZD+4/YHS5ukLzQCypkj+OkYx7iv0mA91lJlpPPZ8vMau3IIGj5Qlwrx+8iiSmg== dependencies: asap "~2.0.6" @@ -4388,34 +4165,22 @@ proper-lockfile@^4.1.1: retry "^0.12.0" signal-exit "^3.0.2" -psl@^1.1.33: +proxy-from-env@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/proxy-from-env/-/proxy-from-env-1.1.0.tgz#e102f16ca355424865755d2c9e8ea4f24d58c3e2" + integrity sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg== + +psl@^1.1.28: version "1.9.0" resolved "https://registry.yarnpkg.com/psl/-/psl-1.9.0.tgz#d0df2a137f00794565fcaf3b2c00cd09f8d5a5a7" integrity sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag== -punycode@^2.1.0: +punycode@^2.1.0, punycode@^2.1.1: version "2.3.0" resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.3.0.tgz#f67fa67c94da8f4d0cfff981aee4118064199b8f" integrity sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA== -punycode@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec" - integrity sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A== - -qrcode-terminal@^0.12.0: - version "0.12.0" - resolved "https://registry.yarnpkg.com/qrcode-terminal/-/qrcode-terminal-0.12.0.tgz#bb5b699ef7f9f0505092a3748be4464fe71b5819" - integrity sha512-EXtzRZmC+YGmGlDFbXKxQiMZNwCLEO6BANKXG4iCtSIM0yqc/pappSx3RIKr4r0uh5JsBckOXeKrB3Iz7mdQpQ== - -qs@^6.4.0, qs@^6.9.4: - version "6.11.0" - resolved "https://registry.yarnpkg.com/qs/-/qs-6.11.0.tgz#fd0d963446f7a65e1367e01abd85429453f0c37a" - integrity sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q== - dependencies: - side-channel "^1.0.4" - -qs@^6.7.0: +qs@^6.4.0: version "6.11.2" resolved "https://registry.yarnpkg.com/qs/-/qs-6.11.2.tgz#64bea51f12c1f5da1bc01496f48ffcff7c69d7d9" integrity sha512-tDNIz22aBzCDxLtVH++VnTfzxlfeK5CbqohpSqpJgj1Wg/cQbStNAz3NuqCs5vV+pjBsK4x4pN9HlVh7rcYRiA== @@ -4427,11 +4192,6 @@ qs@~6.5.2: resolved "https://registry.yarnpkg.com/qs/-/qs-6.5.3.tgz#3aeeffc91967ef6e35c0e488ef46fb296ab76aad" integrity sha512-qxXIEh4pCGfHICj1mAJQ2/2XVZkjCDTcEgfoSQxc/fYivUZxTkk7L3bDBJSoNrEzXI17oUO5Dp07ktqE5KzczA== -querystringify@^2.1.1: - version "2.2.0" - resolved "https://registry.yarnpkg.com/querystringify/-/querystringify-2.2.0.tgz#3345941b4153cb9d082d8eee4cda2016a9aef7f6" - integrity sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ== - queue-microtask@^1.2.2, queue-microtask@^1.2.3: version "1.2.3" resolved "https://registry.yarnpkg.com/queue-microtask/-/queue-microtask-1.2.3.tgz#4929228bbc724dfac43e0efb058caf7b6cfb6243" @@ -4455,9 +4215,9 @@ raw-body@^2.4.1: unpipe "1.0.0" readable-stream@^2.2.2: - version "2.3.7" - resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.7.tgz#1eca1cf711aef814c04f62252a36a62f6cb23b57" - integrity sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw== + version "2.3.8" + 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" inherits "~2.0.3" @@ -4498,30 +4258,25 @@ rechoir@^0.6.2: resolve "^1.1.6" recursive-readdir@^2.2.2: - version "2.2.2" - resolved "https://registry.yarnpkg.com/recursive-readdir/-/recursive-readdir-2.2.2.tgz#9946fb3274e1628de6e36b2f6714953b4845094f" - integrity sha512-nRCcW9Sj7NuZwa2XvH9co8NPeXUBhZP7CRKJtU+cS6PW9FpCIFoI5ib0NT1ZrbNuPoRy0ylyCaUL8Gih4LSyFg== + version "2.2.3" + resolved "https://registry.yarnpkg.com/recursive-readdir/-/recursive-readdir-2.2.3.tgz#e726f328c0d69153bcabd5c322d3195252379372" + integrity sha512-8HrF5ZsXk5FAH9dgsx3BlUer73nIhuj+9OrQwEbLTPOBzGkL1lsFCR01am+v+0m2Cmbs1nP12hLDl5FA7EszKA== dependencies: - minimatch "3.0.4" + minimatch "^3.0.5" reduce-flatten@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/reduce-flatten/-/reduce-flatten-2.0.0.tgz#734fd84e65f375d7ca4465c69798c25c9d10ae27" integrity sha512-EJ4UNY/U1t2P/2k6oqotuX2Cc3T6nxJwsM0N0asT7dhrtH1ltUxDn4NalSYmPE2rCkVpcf/X6R0wDwcFpzhd4w== -regexp.prototype.flags@^1.4.3: - version "1.4.3" - resolved "https://registry.yarnpkg.com/regexp.prototype.flags/-/regexp.prototype.flags-1.4.3.tgz#87cab30f80f66660181a3bb7bf5981a872b367ac" - integrity sha512-fjggEOO3slI6Wvgjwflkc4NFRCTZAu5CnNfBd5qOMYhWdn67nJBBu34/TkD++eeFmd8C9r9jfXJ27+nSiRkSUA== +regexp.prototype.flags@^1.5.0: + version "1.5.0" + resolved "https://registry.yarnpkg.com/regexp.prototype.flags/-/regexp.prototype.flags-1.5.0.tgz#fe7ce25e7e4cca8db37b6634c8a2c7009199b9cb" + integrity sha512-0SutC3pNudRKgquxGoRGIz946MZVHqbNfPjBdxeOhBrdgDKlRoXmYLQN9xRbrR09ZXWeGAdPuif7egofn6v5LA== dependencies: call-bind "^1.0.2" - define-properties "^1.1.3" - functions-have-names "^1.2.2" - -regexpp@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/regexpp/-/regexpp-2.0.1.tgz#8d19d31cf632482b589049f8281f93dbcba4d07f" - integrity sha512-lv0M6+TkDVniA3aD1Eg0DVpfU/booSu7Eev3TDO/mZKHBfVjgCGTV4t4buppESEYDtkArYFOxTJWv6S5C+iaNw== + define-properties "^1.2.0" + functions-have-names "^1.2.3" req-cwd@^2.0.0: version "2.0.0" @@ -4594,11 +4349,6 @@ require-main-filename@^2.0.0: resolved "https://registry.yarnpkg.com/require-main-filename/-/require-main-filename-2.0.0.tgz#d0b329ecc7cc0f61649f62215be69af54aa8989b" integrity sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg== -requires-port@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/requires-port/-/requires-port-1.0.0.tgz#925d2601d39ac485e091cf0da5c6e694dc3dcaff" - integrity sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ== - resolve-from@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-3.0.0.tgz#b22c7af7d9d6881bc8b6e653335eebcb0a188748" @@ -4622,21 +4372,18 @@ resolve@1.17.0: path-parse "^1.0.6" resolve@^1.1.6: - version "1.22.1" - resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.1.tgz#27cb2ebb53f91abb49470a928bba7558066ac177" - integrity sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw== + version "1.22.4" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.4.tgz#1dc40df46554cdaf8948a486a10f6ba1e2026c34" + integrity sha512-PXNdCiPqDqeUou+w1C2eTQbNfxKSuMxqTCuvlmmMsk1NWHL5fRrhY6Pl0qEYYc6+QqGClco1Qj8XnjPego4wfg== dependencies: - is-core-module "^2.9.0" + is-core-module "^2.13.0" path-parse "^1.0.7" supports-preserve-symlinks-flag "^1.0.0" -restore-cursor@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-2.0.0.tgz#9f7ee287f82fd326d4fd162923d62129eee0dfaf" - integrity sha512-6IzJLuGi4+R14vwagDHX+JrXmPVtPpn4mffDJ1UdR7/Edm87fl6yi8mMBIVvFtJaNTUvjughmW4hwLhRG7gC1Q== - dependencies: - onetime "^2.0.0" - signal-exit "^3.0.2" +retry@0.13.1: + version "0.13.1" + resolved "https://registry.yarnpkg.com/retry/-/retry-0.13.1.tgz#185b1587acf67919d63b357349e03537b2484658" + integrity sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg== retry@^0.12.0: version "0.12.0" @@ -4648,13 +4395,6 @@ reusify@^1.0.4: resolved "https://registry.yarnpkg.com/reusify/-/reusify-1.0.4.tgz#90da382b1e126efc02146e90845a88db12925d76" integrity sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw== -rimraf@2.6.3: - version "2.6.3" - resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.6.3.tgz#b2d104fe0d8fb27cf9e0a1cda8262dd3833c6cab" - integrity sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA== - dependencies: - glob "^7.1.3" - rimraf@^2.2.8, rimraf@^2.6.2: version "2.7.1" resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.7.1.tgz#35797f13a7fdadc566142c29d4f07ccad483e3ec" @@ -4677,11 +4417,6 @@ rlp@^2.2.3, rlp@^2.2.4: dependencies: bn.js "^5.2.0" -run-async@^2.2.0: - version "2.4.1" - resolved "https://registry.yarnpkg.com/run-async/-/run-async-2.4.1.tgz#8440eccf99ea3e70bd409d49aab88e10c189a455" - integrity sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ== - run-parallel-limit@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/run-parallel-limit/-/run-parallel-limit-1.1.0.tgz#be80e936f5768623a38a963262d6bef8ff11e7ba" @@ -4701,12 +4436,15 @@ rustbn.js@~0.2.0: resolved "https://registry.yarnpkg.com/rustbn.js/-/rustbn.js-0.2.0.tgz#8082cb886e707155fd1cb6f23bd591ab8d55d0ca" integrity sha512-4VlvkRUuCJvr2J6Y0ImW7NvTCriMi7ErOAqWk1y69vAdoNIzCF3yPmgeNzx+RQTLEDFq5sHfscn1MwHxP9hNfA== -rxjs@^6.4.0: - version "6.6.7" - resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-6.6.7.tgz#90ac018acabf491bf65044235d5863c4dab804c9" - integrity sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ== +safe-array-concat@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/safe-array-concat/-/safe-array-concat-1.0.0.tgz#2064223cba3c08d2ee05148eedbc563cd6d84060" + integrity sha512-9dVEFruWIsnie89yym+xWTAYASdpw3CJV7Li/6zBewGf9z2i1j31rP6jnY0pHEO4QZh6N0K11bFjWmdR8UGdPQ== dependencies: - tslib "^1.9.0" + call-bind "^1.0.2" + get-intrinsic "^1.2.0" + has-symbols "^1.0.3" + isarray "^2.0.5" safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@^5.1.1, safe-buffer@^5.1.2, safe-buffer@^5.2.0, safe-buffer@~5.2.0: version "5.2.1" @@ -4718,6 +4456,15 @@ safe-buffer@~5.1.0, safe-buffer@~5.1.1: resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== +safe-regex-test@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/safe-regex-test/-/safe-regex-test-1.0.0.tgz#793b874d524eb3640d1873aad03596db2d4f2295" + integrity sha512-JBUUzyOgEwXQY1NuPtvcj/qcBDbDmEvWufhlnXZIm75DEHp+afM1r1ujJpJsV/gSM4t59tpDyPi1sd6ZaPFfsA== + dependencies: + call-bind "^1.0.2" + get-intrinsic "^1.1.3" + is-regex "^1.1.4" + "safer-buffer@>= 2.1.2 < 3", safer-buffer@^2.0.2, safer-buffer@^2.1.0, safer-buffer@~2.1.0: version "2.1.2" resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" @@ -4762,10 +4509,29 @@ secp256k1@^4.0.1: node-addon-api "^2.0.0" node-gyp-build "^4.2.0" -semver@^5.5.0, semver@^5.5.1, semver@^5.7.0, semver@^5.7.2, semver@^6.3.0, semver@^7.3.4, semver@^7.3.7: - version "5.7.2" - resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.2.tgz#48d55db737c3287cd4835e17fa13feace1c41ef8" - integrity sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g== +semver@^5.5.0, semver@^5.7.0: + version "5.7.1" + resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7" + integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ== + +semver@^6.3.0: + version "6.3.0" + resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d" + integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw== + +semver@^7.3.4: + version "7.3.7" + resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.7.tgz#12c5b649afdbf9049707796e22a4028814ce523f" + integrity sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g== + dependencies: + lru-cache "^6.0.0" + +semver@^7.3.8, semver@^7.5.2: + version "7.5.4" + resolved "https://registry.yarnpkg.com/semver/-/semver-7.5.4.tgz#483986ec4ed38e1c6c48c34894a9182dbff68a6e" + integrity sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA== + dependencies: + lru-cache "^6.0.0" serialize-javascript@6.0.0: version "6.0.0" @@ -4810,18 +4576,6 @@ sha1@^1.1.1: charenc ">= 0.0.1" crypt ">= 0.0.1" -shebang-command@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-1.2.0.tgz#44aac65b695b03398968c39f363fee5deafdf1ea" - integrity sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg== - dependencies: - shebang-regex "^1.0.0" - -shebang-regex@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-1.0.0.tgz#da42f49740c0b42db2ca9728571cb190c98efea3" - integrity sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ== - shelljs@^0.8.3: version "0.8.5" resolved "https://registry.yarnpkg.com/shelljs/-/shelljs-0.8.5.tgz#de055408d8361bed66c669d2f000538ced8ee20c" @@ -4850,15 +4604,6 @@ slash@^3.0.0: resolved "https://registry.yarnpkg.com/slash/-/slash-3.0.0.tgz#6539be870c165adbd5240220dbe361f1bc4d4634" integrity sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q== -slice-ansi@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-2.1.0.tgz#cacd7693461a637a5788d92a7dd4fba068e81636" - integrity sha512-Qu+VC3EwYLldKa1fCxuuvULvSJOKEgk9pi8dZeCVK7TqBfUNTH4sFkk4joj8afVSfAYgJoSOetjx9QWOJ5mYoQ== - dependencies: - ansi-styles "^3.2.0" - astral-regex "^1.0.0" - is-fullwidth-code-point "^2.0.0" - slice-ansi@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-4.0.0.tgz#500e8dd0fd55b05815086255b3195adf2a45fe6b" @@ -4883,45 +4628,48 @@ solc@0.7.3: semver "^5.5.0" tmp "0.0.33" -solhint@^3.3.7: - version "3.3.7" - resolved "https://registry.yarnpkg.com/solhint/-/solhint-3.3.7.tgz#b5da4fedf7a0fee954cb613b6c55a5a2b0063aa7" - integrity sha512-NjjjVmXI3ehKkb3aNtRJWw55SUVJ8HMKKodwe0HnejA+k0d2kmhw7jvpa+MCTbcEgt8IWSwx0Hu6aCo/iYOZzQ== +solhint@^3.5.1: + version "3.5.1" + resolved "https://registry.yarnpkg.com/solhint/-/solhint-3.5.1.tgz#3cf47c173f1a223770c3bef719122d6d2d157371" + integrity sha512-29+vUIwUmsasKuIzCYOqiKlu4We7+BVYNuoKmDMWsmjfPDoJQpM65eBzYuqEr18lwvXpQAbjTGdzvm4iZIO9Uw== dependencies: - "@solidity-parser/parser" "^0.14.1" - ajv "^6.6.1" - antlr4 "4.7.1" - ast-parents "0.0.1" - chalk "^2.4.2" - commander "2.18.0" - cosmiconfig "^5.0.7" - eslint "^5.6.0" - fast-diff "^1.1.2" - glob "^7.1.3" - ignore "^4.0.6" - js-yaml "^3.12.0" - lodash "^4.17.11" - semver "^6.3.0" + "@solidity-parser/parser" "^0.16.0" + ajv "^6.12.6" + antlr4 "^4.11.0" + ast-parents "^0.0.1" + chalk "^4.1.2" + commander "^10.0.0" + cosmiconfig "^8.0.0" + fast-diff "^1.2.0" + glob "^8.0.3" + ignore "^5.2.4" + js-yaml "^4.1.0" + lodash "^4.17.21" + pluralize "^8.0.0" + semver "^7.5.2" + strip-ansi "^6.0.1" + table "^6.8.1" + text-table "^0.2.0" optionalDependencies: - prettier "^1.14.3" + prettier "^2.8.3" -solidity-ast@^0.4.15: - version "0.4.35" - resolved "https://registry.yarnpkg.com/solidity-ast/-/solidity-ast-0.4.35.tgz#82e064b14dc989338123264bde2235cad751f128" - integrity sha512-F5bTDLh3rmDxRmLSrs3qt3nvxJprWSEkS7h2KmuXDx7XTfJ6ZKVTV1rtPIYCqJAuPsU/qa8YUeFn7jdOAZcTPA== +solidity-ast@^0.4.26: + version "0.4.49" + resolved "https://registry.yarnpkg.com/solidity-ast/-/solidity-ast-0.4.49.tgz#ecba89d10c0067845b7848c3a3e8cc61a4fc5b82" + integrity sha512-Pr5sCAj1SFqzwFZw1HPKSq0PehlQNdM8GwKyAVYh2DOn7/cCK8LUKD1HeHnKtTgBW7hi9h4nnnan7hpAg5RhWQ== solidity-comments-extractor@^0.0.7: version "0.0.7" resolved "https://registry.yarnpkg.com/solidity-comments-extractor/-/solidity-comments-extractor-0.0.7.tgz#99d8f1361438f84019795d928b931f4e5c39ca19" integrity sha512-wciNMLg/Irp8OKGrh3S2tfvZiZ0NEyILfcRCXCD4mp7SgK/i9gzLfhY2hY7VMCQJ3kH9UB9BzNdibIVMchzyYw== -solidity-coverage@^0.8.2: - version "0.8.2" - resolved "https://registry.yarnpkg.com/solidity-coverage/-/solidity-coverage-0.8.2.tgz#bc39604ab7ce0a3fa7767b126b44191830c07813" - integrity sha512-cv2bWb7lOXPE9/SSleDO6czkFiMHgP4NXPj+iW9W7iEKLBk7Cj0AGBiNmGX3V1totl9wjPrT0gHmABZKZt65rQ== +solidity-coverage@^0.8.4: + version "0.8.4" + resolved "https://registry.yarnpkg.com/solidity-coverage/-/solidity-coverage-0.8.4.tgz#c57a21979f5e86859c5198de9fbae2d3bc6324a5" + integrity sha512-xeHOfBOjdMF6hWTbt42iH4x+7j1Atmrf5OldDPMxI+i/COdExUxszOswD9qqvcBTaLGiOrrpnh9UZjSpt4rBsg== dependencies: "@ethersproject/abi" "^5.0.9" - "@solidity-parser/parser" "^0.14.1" + "@solidity-parser/parser" "^0.16.0" chalk "^2.4.2" death "^1.1.0" detect-port "^1.3.0" @@ -5008,7 +4756,7 @@ string-format@^2.0.0: resolved "https://registry.yarnpkg.com/string-format/-/string-format-2.0.0.tgz#f2df2e7097440d3b65de31b6d40d54c96eaffb9b" integrity sha512-bbEs3scLeYNXLecRRuk6uJxdXUSj6le/8rNPHChIJTn2V79aXVTR1EH2OH5zLKKoz0V02fOUKZZcw01pLUShZA== -"string-width@^1.0.2 || 2", string-width@^2.1.0, string-width@^2.1.1: +"string-width@^1.0.2 || 2", string-width@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/string-width/-/string-width-2.1.1.tgz#ab93f27a8dc13d28cac815c462143a6d9012ae9e" integrity sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw== @@ -5034,23 +4782,32 @@ string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3: is-fullwidth-code-point "^3.0.0" strip-ansi "^6.0.1" -string.prototype.trimend@^1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/string.prototype.trimend/-/string.prototype.trimend-1.0.5.tgz#914a65baaab25fbdd4ee291ca7dde57e869cb8d0" - integrity sha512-I7RGvmjV4pJ7O3kdf+LXFpVfdNOxtCW/2C8f6jNiW4+PQchwxkCDzlk1/7p+Wl4bqFIZeF47qAHXLuHHWKAxog== +string.prototype.trim@^1.2.7: + version "1.2.7" + resolved "https://registry.yarnpkg.com/string.prototype.trim/-/string.prototype.trim-1.2.7.tgz#a68352740859f6893f14ce3ef1bb3037f7a90533" + integrity sha512-p6TmeT1T3411M8Cgg9wBTMRtY2q9+PNy9EV1i2lIXUN/btt763oIfxwN3RR8VU6wHX8j/1CFy0L+YuThm6bgOg== dependencies: call-bind "^1.0.2" define-properties "^1.1.4" - es-abstract "^1.19.5" + es-abstract "^1.20.4" -string.prototype.trimstart@^1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/string.prototype.trimstart/-/string.prototype.trimstart-1.0.5.tgz#5466d93ba58cfa2134839f81d7f42437e8c01fef" - integrity sha512-THx16TJCGlsN0o6dl2o6ncWUsdgnLRSA23rRE5pyGBw/mLr3Ej/R2LaqCtgP8VNMGZsvMWnf9ooZPyY2bHvUFg== +string.prototype.trimend@^1.0.6: + version "1.0.6" + resolved "https://registry.yarnpkg.com/string.prototype.trimend/-/string.prototype.trimend-1.0.6.tgz#c4a27fa026d979d79c04f17397f250a462944533" + integrity sha512-JySq+4mrPf9EsDBEDYMOb/lM7XQLulwg5R/m1r0PXEFqrV0qHvl58sdTilSXtKOflCsK2E8jxf+GKC0T07RWwQ== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.4" + es-abstract "^1.20.4" + +string.prototype.trimstart@^1.0.6: + version "1.0.6" + resolved "https://registry.yarnpkg.com/string.prototype.trimstart/-/string.prototype.trimstart-1.0.6.tgz#e90ab66aa8e4007d92ef591bbf3cd422c56bdcf4" + integrity sha512-omqjMDaY92pbn5HOX7f9IccLA+U1tA9GvtU4JrodiXFfYB7jPzzHpRzpglLAjtUV6bB557zwClJezTqnAiYnQA== dependencies: call-bind "^1.0.2" define-properties "^1.1.4" - es-abstract "^1.19.5" + es-abstract "^1.20.4" string_decoder@^1.1.1: version "1.3.0" @@ -5094,7 +4851,7 @@ strip-hex-prefix@1.0.0: dependencies: is-hex-prefixed "1.0.0" -strip-json-comments@2.0.1, strip-json-comments@^2.0.1: +strip-json-comments@2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a" integrity sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ== @@ -5170,17 +4927,7 @@ table-layout@^1.0.2: typical "^5.2.0" wordwrapjs "^4.0.0" -table@^5.2.3: - version "5.4.6" - resolved "https://registry.yarnpkg.com/table/-/table-5.4.6.tgz#1292d19500ce3f86053b05f0e8e7e4a3bb21079e" - integrity sha512-wmEc8m4fjnob4gt5riFRtTu/6+4rSe12TpAELNSqHMfF3IqnA+CH37USM6/YR3qRZv7e56kAEAtd6nKZaxe0Ug== - dependencies: - ajv "^6.10.2" - lodash "^4.17.14" - slice-ansi "^2.1.0" - string-width "^3.0.0" - -table@^6.8.0: +table@^6.8.0, table@^6.8.1: version "6.8.1" resolved "https://registry.yarnpkg.com/table/-/table-6.8.1.tgz#ea2b71359fe03b017a5fbc296204471158080bdf" integrity sha512-Y4X9zqrCftUhMeH2EptSSERdVKt/nEdijTOacGD/97EKjhQ/Qs8RTlEGABSJNNN8lac9kheH+af7yAkEWlgneA== @@ -5213,12 +4960,7 @@ then-request@^6.0.0: promise "^8.0.0" qs "^6.4.0" -through@^2.3.6: - version "2.3.8" - resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" - integrity sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg== - -tmp@0.0.33, tmp@^0.0.33: +tmp@0.0.33: version "0.0.33" resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.0.33.tgz#6d34335889768d21b2bcda0aa277ced3b1bfadf9" integrity sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw== @@ -5237,15 +4979,18 @@ toidentifier@1.0.1: resolved "https://registry.yarnpkg.com/toidentifier/-/toidentifier-1.0.1.tgz#3be34321a88a820ed1bd80dfaa33e479fbb8dd35" integrity sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA== -tough-cookie@^2.3.3, tough-cookie@^4.1.3, tough-cookie@~2.5.0: - version "4.1.3" - resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-4.1.3.tgz#97b9adb0728b42280aa3d814b6b999b2ff0318bf" - integrity sha512-aX/y5pVRkfRnfmuX+OdbSdXvPe6ieKX/G2s7e98f4poJHnqH3281gDPm/metm6E/WRamfx7WC4HUqkWHfQHprw== +tough-cookie@^2.3.3, tough-cookie@~2.5.0: + version "2.5.0" + resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.5.0.tgz#cd9fb2a0aa1d5a12b473bd9fb96fa3dcff65ade2" + integrity sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g== dependencies: - psl "^1.1.33" + psl "^1.1.28" punycode "^2.1.1" - universalify "^0.2.0" - url-parse "^1.5.3" + +tr46@~0.0.3: + version "0.0.3" + resolved "https://registry.yarnpkg.com/tr46/-/tr46-0.0.3.tgz#8184fd347dac9cdc185992f3a6622e14b9d9ab6a" + integrity sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw== ts-command-line-args@^2.2.0: version "2.5.1" @@ -5262,7 +5007,7 @@ ts-essentials@^7.0.1: resolved "https://registry.yarnpkg.com/ts-essentials/-/ts-essentials-7.0.3.tgz#686fd155a02133eedcc5362dc8b5056cde3e5a38" integrity sha512-8+gr5+lqO3G84KdiTSMRLtuyJ+nTBVRKuCrK4lidMPdVeEp0uqC875uE5NMcaA7YYMN7XsNiFQuMvasF8HT/xQ== -ts-node@>=8.0.0: +ts-node@^10.9.1: version "10.9.1" resolved "https://registry.yarnpkg.com/ts-node/-/ts-node-10.9.1.tgz#e73de9102958af9e1f0b168a6ff320e25adcff4b" integrity sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw== @@ -5281,11 +5026,16 @@ ts-node@>=8.0.0: v8-compile-cache-lib "^3.0.1" yn "3.1.1" -tslib@^1.9.0, tslib@^1.9.3: +tslib@^1.11.1, tslib@^1.9.3: version "1.14.1" resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.14.1.tgz#cf2d38bdc34a134bcaf1091c41f6619e2f672d00" integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg== +tslib@^2.3.1, tslib@^2.5.0: + version "2.6.1" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.6.1.tgz#fd8c9a0ff42590b25703c0acb3de3d3f4ede0410" + integrity sha512-t0hLfiEKfMUoqhG+U1oid7Pva4bbDPHYfJNiB7BiIjRkj1pyC++4N3huJfqY6aRH6VTB0rvtzQwjM4K6qpfOig== + tsort@0.0.1: version "0.0.1" resolved "https://registry.yarnpkg.com/tsort/-/tsort-0.0.1.tgz#e2280f5e817f8bf4275657fd0f9aebd44f5a2786" @@ -5335,10 +5085,10 @@ type-fest@^0.7.1: resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.7.1.tgz#8dda65feaf03ed78f0a3f9678f1869147f7c5c48" integrity sha512-Ne2YiiGN8bmrmJJEuTWTLJR32nh/JdL1+PSicowtNb0WFpn59GK8/lfD61bVtzguz7b3PBt74nxpv/Pw5po5Rg== -typechain@^8.1.0: - version "8.2.0" - resolved "https://registry.yarnpkg.com/typechain/-/typechain-8.2.0.tgz#bd4fc8f111d4405e36858bae6f744604617b60f3" - integrity sha512-tZqhqjxJ9xAS/Lh32jccTjMkpx7sTdUVVHAy5Bf0TIer5QFNYXotiX74oCvoVYjyxUKDK3MXHtMFzMyD3kE+jg== +typechain@^8.3.1: + version "8.3.1" + resolved "https://registry.yarnpkg.com/typechain/-/typechain-8.3.1.tgz#dccbc839b94877997536c356380eff7325395cfb" + integrity sha512-fA7clol2IP/56yq6vkMTR+4URF1nGjV82Wx6Rf09EsqD4tkzMAvEaqYxVFCavJm/1xaRga/oD55K+4FtuXwQOQ== dependencies: "@types/prettier" "^2.1.1" debug "^4.3.1" @@ -5351,15 +5101,54 @@ typechain@^8.1.0: ts-command-line-args "^2.2.0" ts-essentials "^7.0.1" +typed-array-buffer@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/typed-array-buffer/-/typed-array-buffer-1.0.0.tgz#18de3e7ed7974b0a729d3feecb94338d1472cd60" + integrity sha512-Y8KTSIglk9OZEr8zywiIHG/kmQ7KWyjseXs1CbSo8vC42w7hg2HgYTxSWwP0+is7bWDc1H+Fo026CpHFwm8tkw== + dependencies: + call-bind "^1.0.2" + get-intrinsic "^1.2.1" + is-typed-array "^1.1.10" + +typed-array-byte-length@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/typed-array-byte-length/-/typed-array-byte-length-1.0.0.tgz#d787a24a995711611fb2b87a4052799517b230d0" + integrity sha512-Or/+kvLxNpeQ9DtSydonMxCx+9ZXOswtwJn17SNLvhptaXYDJvkFFP5zbfU/uLmvnBJlI4yrnXRxpdWH/M5tNA== + dependencies: + call-bind "^1.0.2" + for-each "^0.3.3" + has-proto "^1.0.1" + is-typed-array "^1.1.10" + +typed-array-byte-offset@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/typed-array-byte-offset/-/typed-array-byte-offset-1.0.0.tgz#cbbe89b51fdef9cd6aaf07ad4707340abbc4ea0b" + integrity sha512-RD97prjEt9EL8YgAgpOkf3O4IF9lhJFr9g0htQkm0rchFp/Vx7LW5Q8fSXXub7BXAODyUQohRMyOc3faCPd0hg== + dependencies: + available-typed-arrays "^1.0.5" + call-bind "^1.0.2" + for-each "^0.3.3" + has-proto "^1.0.1" + is-typed-array "^1.1.10" + +typed-array-length@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/typed-array-length/-/typed-array-length-1.0.4.tgz#89d83785e5c4098bec72e08b319651f0eac9c1bb" + integrity sha512-KjZypGq+I/H7HI5HlOoGHkWUUGq+Q0TPhQurLbyrVrvnKTBgzLhIJ7j6J/XTQOi0d1RjyZ0wdas8bKs2p0x3Ng== + dependencies: + call-bind "^1.0.2" + for-each "^0.3.3" + is-typed-array "^1.1.9" + typedarray@^0.0.6: version "0.0.6" resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777" integrity sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA== -typescript@^4.8.2: - version "4.8.2" - resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.8.2.tgz#e3b33d5ccfb5914e4eeab6699cf208adee3fd790" - integrity sha512-C0I1UsrrDHo2fYI5oaCGbSejwX4ch+9Y5jTQELvovfmFkK3HHSZJB8MSJcWLmCUBzQBchCrZ9rMRV6GuNrvGtw== +typescript@^5.1.6: + version "5.1.6" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.1.6.tgz#02f8ac202b6dad2c0dd5e0913745b47a37998274" + integrity sha512-zaWCozRZ6DLEWAWFrVDz1H6FVXzUSfTy5FUMWsQlU8Ym5JP9eO4xkTIROFCQvhQf61z6O/G6ugw3SgAnvvm+HA== typical@^4.0.0: version "4.0.0" @@ -5372,9 +5161,9 @@ typical@^5.2.0: integrity sha512-dvdQgNDNJo+8B2uBQoqdb11eUCE1JQXhvjC/CZtgvZseVd5TYMXnq0+vuUemXbd/Se29cTaUuPX3YIc2xgbvIg== uglify-js@^3.1.4: - version "3.17.0" - resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-3.17.0.tgz#55bd6e9d19ce5eef0d5ad17cd1f587d85b180a85" - integrity sha512-aTeNPVmgIMPpm1cxXr2Q/nEbvkmV8yq66F3om7X3P/cvOXQ0TMQ64Wk63iyT1gPlmdmGzjGpyLh1f3y8MZWXGg== + version "3.17.4" + resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-3.17.4.tgz#61678cf5fa3f5b7eb789bb345df29afb8257c22c" + integrity sha512-T9q82TJI9e/C1TAxYvfb16xO120tMVFZrGA3f9/P4424DNu6ypK103y0GPFVa17yotwSyZW5iYXgjYHkGrJW/g== unbox-primitive@^1.0.2: version "1.0.2" @@ -5386,23 +5175,23 @@ unbox-primitive@^1.0.2: has-symbols "^1.0.3" which-boxed-primitive "^1.0.2" -undici@^5.14.0, undici@^5.22.1: +undici@^5.14.0: version "5.23.0" resolved "https://registry.yarnpkg.com/undici/-/undici-5.23.0.tgz#e7bdb0ed42cebe7b7aca87ced53e6eaafb8f8ca0" integrity sha512-1D7w+fvRsqlQ9GscLBwcAJinqcZGHUKjbOmXdlE/v8BvEGXjeWAax+341q44EuTcHXXnfyKNbKRq4Lg7OzhMmg== dependencies: busboy "^1.6.0" +unfetch@^4.2.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/unfetch/-/unfetch-4.2.0.tgz#7e21b0ef7d363d8d9af0fb929a5555f6ef97a3be" + integrity sha512-F9p7yYCn6cIW9El1zi0HI6vqpeIvBsr3dSuRO6Xuppb1u5rXpCPmMvLSyECLhybr9isec8Ohl0hPekMVrEinDA== + universalify@^0.1.0: version "0.1.2" resolved "https://registry.yarnpkg.com/universalify/-/universalify-0.1.2.tgz#b646f69be3942dabcecc9d6639c80dc105efaa66" integrity sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg== -universalify@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/universalify/-/universalify-0.2.0.tgz#6451760566fa857534745ab1dde952d1b1761be0" - integrity sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg== - universalify@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/universalify/-/universalify-2.0.0.tgz#75a4984efedc4b08975c5aeb73f530d02df25717" @@ -5420,14 +5209,6 @@ uri-js@^4.2.2: dependencies: punycode "^2.1.0" -url-parse@^1.5.3: - version "1.5.10" - resolved "https://registry.yarnpkg.com/url-parse/-/url-parse-1.5.10.tgz#9d3c2f736c1d75dd3bd2be507dcc111f1e2ea9c1" - integrity sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ== - dependencies: - querystringify "^2.1.1" - requires-port "^1.0.0" - utf8@3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/utf8/-/utf8-3.0.0.tgz#f052eed1364d696e769ef058b183df88c87f69d1" @@ -5468,9 +5249,9 @@ verror@1.10.0: extsprintf "^1.2.0" web3-utils@^1.3.6: - version "1.8.1" - resolved "https://registry.yarnpkg.com/web3-utils/-/web3-utils-1.8.1.tgz#f2f7ca7eb65e6feb9f3d61056d0de6bbd57125ff" - integrity sha512-LgnM9p6V7rHHUGfpMZod+NST8cRfGzJ1BTXAyNo7A9cJX9LczBfSRxJp+U/GInYe9mby40t3v22AJdlELibnsQ== + version "1.10.0" + resolved "https://registry.yarnpkg.com/web3-utils/-/web3-utils-1.10.0.tgz#ca4c1b431a765c14ac7f773e92e0fd9377ccf578" + integrity sha512-kSaCM0uMcZTNUSmn5vMEhlo02RObGNRRCkdX0V9UTAU0+lrvn0HSaudyCo6CQzuXUsnuY2ERJGCGPfeWmv19Rg== dependencies: bn.js "^5.2.1" ethereum-bloom-filters "^1.0.6" @@ -5480,6 +5261,19 @@ web3-utils@^1.3.6: randombytes "^2.1.0" utf8 "3.0.0" +webidl-conversions@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-3.0.1.tgz#24534275e2a7bc6be7bc86611cc16ae0a5654871" + integrity sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ== + +whatwg-url@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-5.0.0.tgz#966454e8765462e37644d3626f6742ce8b70965d" + integrity sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw== + dependencies: + tr46 "~0.0.3" + webidl-conversions "^3.0.0" + which-boxed-primitive@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz#13757bc89b209b049fe5d86430e21cf40a89a8e6" @@ -5492,11 +5286,22 @@ which-boxed-primitive@^1.0.2: is-symbol "^1.0.3" which-module@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/which-module/-/which-module-2.0.0.tgz#d9ef07dce77b9902b8a3a8fa4b31c3e3f7e6e87a" - integrity sha512-B+enWhmw6cjfVC7kS8Pj9pCrKSc5txArRyaYGe088shv/FGWH+0Rjx/xPgtsWfsUtS27FkP697E4DDhgrgoc0Q== + version "2.0.1" + resolved "https://registry.yarnpkg.com/which-module/-/which-module-2.0.1.tgz#776b1fe35d90aebe99e8ac15eb24093389a4a409" + integrity sha512-iBdZ57RDvnOR9AGBhML2vFZf7h8vmBjhoaZqODJBFWHVtKkDmKuHai3cx5PgVMrX5YDNp27AofYbAwctSS+vhQ== + +which-typed-array@^1.1.10, which-typed-array@^1.1.11: + version "1.1.11" + resolved "https://registry.yarnpkg.com/which-typed-array/-/which-typed-array-1.1.11.tgz#99d691f23c72aab6768680805a271b69761ed61a" + integrity sha512-qe9UWWpkeG5yzZ0tNYxDmd7vo58HDBc39mZ0xWWpolAGADdFOzkfamWLDxkOWcvHQKVmdTyQdLD4NOfjLWTKew== + 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" -which@1.3.1, which@^1.1.1, which@^1.2.9, which@^1.3.1: +which@1.3.1, which@^1.1.1, which@^1.3.1: version "1.3.1" resolved "https://registry.yarnpkg.com/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a" integrity sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ== @@ -5510,7 +5315,7 @@ wide-align@1.1.3: dependencies: string-width "^1.0.2 || 2" -word-wrap@^1.2.4, word-wrap@~1.2.3: +word-wrap@~1.2.3: version "1.2.4" resolved "https://registry.yarnpkg.com/word-wrap/-/word-wrap-1.2.4.tgz#cb4b50ec9aca570abd1f52f33cd45b6c61739a9f" integrity sha512-2V81OA4ugVo5pRo46hAoD2ivUJx8jXmWXfUkY4KFNw0hEptvN0QfH3K4nHiwzGeKl5rFKedV48QVoqYavy4YpA== @@ -5556,13 +5361,6 @@ wrappy@1: resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" integrity sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ== -write@1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/write/-/write-1.0.3.tgz#0800e14523b923a387e415123c865616aae0f5c3" - integrity sha512-/lg70HAjtkUgWPVZhZcm+T4hkL8Zbtp1nFNOn3lRrxnlv50SRBv7cR7RqR+GMsd3hUXy9hWBo4CHTbFTcOYwig== - dependencies: - mkdirp "^0.5.1" - ws@7.4.6: version "7.4.6" resolved "https://registry.yarnpkg.com/ws/-/ws-7.4.6.tgz#5654ca8ecdeee47c33a9a4bf6d28e2be2980377c" @@ -5593,6 +5391,11 @@ yallist@^3.0.2: resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.1.1.tgz#dbb7daf9bfd8bac9ab45ebf602b8cbad0d5d08fd" integrity sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g== +yallist@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/yallist/-/yallist-4.0.0.tgz#9bb92790d9c0effec63be73519e11a35019a3a72" + integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A== + yargs-parser@13.1.2, yargs-parser@^13.1.2: version "13.1.2" resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-13.1.2.tgz#130f09702ebaeef2650d54ce6e3e5706f7a4fb38" @@ -5668,8 +5471,3 @@ yocto-queue@^0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-0.1.0.tgz#0294eb3dee05028d31ee1a5fa2c556a6aaf10a1b" integrity sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q== - -zksync-web3@^0.8.1: - version "0.8.1" - resolved "https://registry.yarnpkg.com/zksync-web3/-/zksync-web3-0.8.1.tgz#db289d8f6caf61f4d5ddc471fa3448d93208dc14" - integrity sha512-1A4aHPQ3MyuGjpv5X/8pVEN+MdZqMjfVmiweQSRjOlklXYu65wT9BGEOtCmMs5d3gIvLp4ssfTeuR5OCKOD2kw== From e5c867ad78a129039c9dff1b7a8ce1403876bf21 Mon Sep 17 00:00:00 2001 From: PlayJoker Date: Sun, 27 Aug 2023 22:44:25 -0700 Subject: [PATCH 17/29] deployed factory on polygon --- deployment/matic-deployed-contracts.json | 10 +++++++++- deployment/matic-initialized-contracts.json | 3 ++- deployment/matic-verified-contracts.json | 9 ++++++++- deployment/utils.js | 4 ++-- 4 files changed, 21 insertions(+), 5 deletions(-) diff --git a/deployment/matic-deployed-contracts.json b/deployment/matic-deployed-contracts.json index eb263988..9ff4f254 100644 --- a/deployment/matic-deployed-contracts.json +++ b/deployment/matic-deployed-contracts.json @@ -33,4 +33,12 @@ "ArfHDT":"0xF68173AC6817961833C7FF303C0453e18fF6aBd2", "ArfPoolConfig":"0x9570CdEe2abb43eF0DbE502d3eBB11AaebbCb77F", "ArfPoolImpl":"0xAd19f43eC0903005C297EE555e34500C61dA5913", -"ArfPool":"0x91EaCEC15839Cc9Ec7083288E205C7f1EBfcdf62"} \ No newline at end of file +"ArfPool":"0x91EaCEC15839Cc9Ec7083288E205C7f1EBfcdf62", +"HumaProxyAdminTimelock":"0x10B6AeF9Efd79E07c9426f26479ef9cb842BC3b3", +"RWReceivableImpl":"0x50B106ba1A278A04f071F0ae0D45d097D5A15AfF", +"RWReceivable":"0x202dbC700C4DA1322f27bBFe1F49F50e262e4fB0", +"LibFeeManager":"0x836F3A6fF1fAa6129D911946153E122beD4A45f8", +"LibPoolConfig":"0x5E03dB5B41013F5031607aB311f32919EF256A6B", +"LibHDT":"0x2658a477e15cA9b6AbC64C665Db7d9b5C6b275C2", +"LibPool":"0x8BdacbdAbaa1307E4A0cFb05cbfAd24BfA417302", +"HumaPoolFactory":"0x3A719adcEE26b8252E2A9fD3b60397fE329A2200"} \ No newline at end of file diff --git a/deployment/matic-initialized-contracts.json b/deployment/matic-initialized-contracts.json index b4d1c022..1f386db7 100644 --- a/deployment/matic-initialized-contracts.json +++ b/deployment/matic-initialized-contracts.json @@ -15,4 +15,5 @@ "ArfPoolFeeManager":"Done", "ArfHDT":"Done", "ArfPoolConfig":"Done", -"ArfPool":"Done"} \ No newline at end of file +"ArfPool":"Done", +"RWReceivable":"Done"} \ No newline at end of file diff --git a/deployment/matic-verified-contracts.json b/deployment/matic-verified-contracts.json index a5b784c7..3cc7bd10 100644 --- a/deployment/matic-verified-contracts.json +++ b/deployment/matic-verified-contracts.json @@ -22,4 +22,11 @@ "ArfHDT":"Done", "ArfPoolConfig":"Done", "ArfPoolImpl":"Done", -"ArfPool":"Done"} \ No newline at end of file +"ArfPool":"Done", +"RWReceivableImpl":"Done", +"RWReceivable":"Done", +"LibFeeManager":"Done", +"LibPoolConfig":"Done", +"LibHDT":"Done", +"LibPool":"Done", +"HumaPoolFactory":"Done"} \ No newline at end of file diff --git a/deployment/utils.js b/deployment/utils.js index ae04a66b..a2ea4ee7 100644 --- a/deployment/utils.js +++ b/deployment/utils.js @@ -2,8 +2,8 @@ const {BigNumber: BN, ethers} = require("ethers"); const fs = require("fs"); const DEPLOYED_PATH = "./deployment/"; -const MAX_FEE_PER_GAS = 5_000_000_000; -const MAX_PRIORITY_FEE_PER_GAS = 0; +const MAX_FEE_PER_GAS = 175_000_000_000; +const MAX_PRIORITY_FEE_PER_GAS = 50_000_000_000; const getContractAddressFile = async function (fileType = "deployed", network) { if (!network) { From 5ed89d67be29a4bbf2e958a04e126fb9c3311e0b Mon Sep 17 00:00:00 2001 From: PlayJoker Date: Sun, 27 Aug 2023 22:47:16 -0700 Subject: [PATCH 18/29] mumbai verified contracts --- deployment/maticmum-verified-contracts.json | 12 ++++++++++++ 1 file changed, 12 insertions(+) create mode 100644 deployment/maticmum-verified-contracts.json diff --git a/deployment/maticmum-verified-contracts.json b/deployment/maticmum-verified-contracts.json new file mode 100644 index 00000000..fd149870 --- /dev/null +++ b/deployment/maticmum-verified-contracts.json @@ -0,0 +1,12 @@ +{"EANFT":"Done", +"HumaConfig":"Done", +"HumaConfigTimelock":"Done", +"RWReceivableImpl":"Done", +"RWReceivable":"Done", +"ArfPoolFeeManager":"Done", +"HDTImpl":"Done", +"ArfHDT":"Done", +"ArfPoolConfig":"Done", +"BaseCreditPoolImpl":"Done", +"ArfPool":"Done", +"USDC":"Done"} \ No newline at end of file From f08160baa3bb1c189b3a23374c3db4f5b61032ef Mon Sep 17 00:00:00 2001 From: PlayJoker Date: Thu, 31 Aug 2023 22:57:32 -0700 Subject: [PATCH 19/29] added abi files --- abi/ERC20Permit.json | 347 ++++++++++++++++++++++++++++++++++++++ abi/IERC777.json | 393 +++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 740 insertions(+) create mode 100644 abi/ERC20Permit.json create mode 100644 abi/IERC777.json diff --git a/abi/ERC20Permit.json b/abi/ERC20Permit.json new file mode 100644 index 00000000..1e5f78ed --- /dev/null +++ b/abi/ERC20Permit.json @@ -0,0 +1,347 @@ +[ + { + "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": "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": "DOMAIN_SEPARATOR", + "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": "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": "address", + "name": "spender", + "type": "address" + }, + { + "internalType": "uint256", + "name": "addedValue", + "type": "uint256" + } + ], + "name": "increaseAllowance", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "name", + "outputs": [ + { + "internalType": "string", + "name": "", + "type": "string" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "owner", + "type": "address" + } + ], + "name": "nonces", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "owner", + "type": "address" + }, + { + "internalType": "address", + "name": "spender", + "type": "address" + }, + { + "internalType": "uint256", + "name": "value", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "deadline", + "type": "uint256" + }, + { + "internalType": "uint8", + "name": "v", + "type": "uint8" + }, + { + "internalType": "bytes32", + "name": "r", + "type": "bytes32" + }, + { + "internalType": "bytes32", + "name": "s", + "type": "bytes32" + } + ], + "name": "permit", + "outputs": [], + "stateMutability": "nonpayable", + "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": "to", + "type": "address" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "transfer", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "from", + "type": "address" + }, + { + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "transferFrom", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "nonpayable", + "type": "function" + } +] diff --git a/abi/IERC777.json b/abi/IERC777.json new file mode 100644 index 00000000..c713a87c --- /dev/null +++ b/abi/IERC777.json @@ -0,0 +1,393 @@ +[ + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "operator", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "tokenHolder", + "type": "address" + } + ], + "name": "AuthorizedOperator", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "operator", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "from", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "amount", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "bytes", + "name": "data", + "type": "bytes" + }, + { + "indexed": false, + "internalType": "bytes", + "name": "operatorData", + "type": "bytes" + } + ], + "name": "Burned", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "operator", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "amount", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "bytes", + "name": "data", + "type": "bytes" + }, + { + "indexed": false, + "internalType": "bytes", + "name": "operatorData", + "type": "bytes" + } + ], + "name": "Minted", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "operator", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "tokenHolder", + "type": "address" + } + ], + "name": "RevokedOperator", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "operator", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "from", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "amount", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "bytes", + "name": "data", + "type": "bytes" + }, + { + "indexed": false, + "internalType": "bytes", + "name": "operatorData", + "type": "bytes" + } + ], + "name": "Sent", + "type": "event" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "operator", + "type": "address" + } + ], + "name": "authorizeOperator", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "owner", + "type": "address" + } + ], + "name": "balanceOf", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + }, + { + "internalType": "bytes", + "name": "data", + "type": "bytes" + } + ], + "name": "burn", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "defaultOperators", + "outputs": [ + { + "internalType": "address[]", + "name": "", + "type": "address[]" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "granularity", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "operator", + "type": "address" + }, + { + "internalType": "address", + "name": "tokenHolder", + "type": "address" + } + ], + "name": "isOperatorFor", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "name", + "outputs": [ + { + "internalType": "string", + "name": "", + "type": "string" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "account", + "type": "address" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + }, + { + "internalType": "bytes", + "name": "data", + "type": "bytes" + }, + { + "internalType": "bytes", + "name": "operatorData", + "type": "bytes" + } + ], + "name": "operatorBurn", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "sender", + "type": "address" + }, + { + "internalType": "address", + "name": "recipient", + "type": "address" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + }, + { + "internalType": "bytes", + "name": "data", + "type": "bytes" + }, + { + "internalType": "bytes", + "name": "operatorData", + "type": "bytes" + } + ], + "name": "operatorSend", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "operator", + "type": "address" + } + ], + "name": "revokeOperator", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "recipient", + "type": "address" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + }, + { + "internalType": "bytes", + "name": "data", + "type": "bytes" + } + ], + "name": "send", + "outputs": [], + "stateMutability": "nonpayable", + "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" + } +] From aeca34ae65c84a1f7f366a340257b620dec3d213 Mon Sep 17 00:00:00 2001 From: PlayJoker Date: Tue, 5 Sep 2023 22:30:16 -0700 Subject: [PATCH 20/29] deployed the factory on mumbai --- deployment/maticmum-verified-contracts.json | 11 ++++++----- deployment/utils.js | 4 ++-- hardhat.config.js | 21 +++++++++------------ 3 files changed, 17 insertions(+), 19 deletions(-) diff --git a/deployment/maticmum-verified-contracts.json b/deployment/maticmum-verified-contracts.json index fd149870..104b39d8 100644 --- a/deployment/maticmum-verified-contracts.json +++ b/deployment/maticmum-verified-contracts.json @@ -3,10 +3,11 @@ "HumaConfigTimelock":"Done", "RWReceivableImpl":"Done", "RWReceivable":"Done", -"ArfPoolFeeManager":"Done", "HDTImpl":"Done", -"ArfHDT":"Done", -"ArfPoolConfig":"Done", "BaseCreditPoolImpl":"Done", -"ArfPool":"Done", -"USDC":"Done"} \ No newline at end of file +"ReceivableFactoringPoolImpl":"Done", +"LibFeeManager":"Done", +"LibPoolConfig":"Done", +"LibHDT":"Done", +"LibPool":"Done", +"HumaPoolFactory":"Done"} \ No newline at end of file diff --git a/deployment/utils.js b/deployment/utils.js index a2ea4ee7..5c05884d 100644 --- a/deployment/utils.js +++ b/deployment/utils.js @@ -2,8 +2,8 @@ const {BigNumber: BN, ethers} = require("ethers"); const fs = require("fs"); const DEPLOYED_PATH = "./deployment/"; -const MAX_FEE_PER_GAS = 175_000_000_000; -const MAX_PRIORITY_FEE_PER_GAS = 50_000_000_000; +const MAX_FEE_PER_GAS = 2_000_000_000; +const MAX_PRIORITY_FEE_PER_GAS = 1_500_000_000; const getContractAddressFile = async function (fileType = "deployed", network) { if (!network) { diff --git a/hardhat.config.js b/hardhat.config.js index baab302a..a578185e 100644 --- a/hardhat.config.js +++ b/hardhat.config.js @@ -212,22 +212,18 @@ module.exports = { url: polygonUrl, accounts: [deployer, eaService], }, - mumbai: { + polygonMumbai: { + url: mumbaiUrl, + accounts: [ + deployer, + eaService, + ], + }, + maticmum: { url: mumbaiUrl, accounts: [ deployer, - proxyOwner, - lender, - ea, eaService, - pdsService, - treasury, - ea_bcp, - invoicePayer, - baseCreditPoolOperator, - receivableFactoringPoolOperator, - baseCreditPoolOwnerTreasury, - receivableFactoringPoolOwnerTreasury, ], }, matic: { @@ -391,6 +387,7 @@ module.exports = { sepolia: process.env.ETHERSCAN_API_KEY || null, alfajores: process.env.CELOSCAN_API_KEY || null, celo: process.env.CELOSCAN_API_KEY || null, + polygonMumbai: process.env.POLYGONSCAN_API_KEY || null, }, // customChains: [ // { From bdcc7c57f06ffee99221248be92e857717cc1710 Mon Sep 17 00:00:00 2001 From: PlayJoker Date: Tue, 5 Sep 2023 22:30:50 -0700 Subject: [PATCH 21/29] deployed the factory on mumbai --- deployment/maticmum-deployed-contracts.json | 15 +++++++++++++++ deployment/maticmum-initialized-contracts.json | 2 ++ 2 files changed, 17 insertions(+) create mode 100644 deployment/maticmum-deployed-contracts.json create mode 100644 deployment/maticmum-initialized-contracts.json diff --git a/deployment/maticmum-deployed-contracts.json b/deployment/maticmum-deployed-contracts.json new file mode 100644 index 00000000..557d54e9 --- /dev/null +++ b/deployment/maticmum-deployed-contracts.json @@ -0,0 +1,15 @@ +{"EANFT":"0xE9B46CA6dB1D3A80114b7f49431a4c0746c6f0f7", +"HumaConfig":"0x3D5AF0e4413d29de290D7d4fc8375ECd9E72B837", +"HumaConfigTimelock":"0xbb3D272477220eA119087d2Aa1e91bDF8Ec2D5C3", +"HumaProxyAdminTimelock":"0xF7b05012827E7768af629a5E5271EB1BE1e6ed90", +"RWReceivableImpl":"0x6317b90aBF0D070Eb6A357C5bF444A98da98cb95", +"RWReceivable":"0xC15Fe2908Dcf2C81070b3a09a0888814C302b94d", +"HDTImpl":"0x5C0260CfbAF4A852f70aAD904Fb8234c18691540", +"BaseCreditPoolImpl":"0xaaAdE6a8a8aA86F06E0e5CDc9Bc9a020D369a509", +"ReceivableFactoringPoolImpl":"0xc4d87bE1D08b59aED116Abd968139e7f95c9ed50", +"LibFeeManager":"0x96c9cfDC42392004D2df8C2d3384ED32A3A8aEf7", +"LibPoolConfig":"0x3CBeb5843925C2e3Ca85C8210464215E10c1F739", +"LibHDT":"0x4842F1d47c2a0B8B5af56d2D2734caEcee890540", +"LibPool":"0xe6F12f2CAbC401492ECbe7988F2aE71F5f3Bc093", +"HumaPoolFactory":"0xc32eE02433F77753B410d80fC37AeD25556189F3", +"USDC":"0xb961c37ABDDA55929327fa9d20eBDE6BB8B1348E"} \ No newline at end of file diff --git a/deployment/maticmum-initialized-contracts.json b/deployment/maticmum-initialized-contracts.json new file mode 100644 index 00000000..557e17fc --- /dev/null +++ b/deployment/maticmum-initialized-contracts.json @@ -0,0 +1,2 @@ +{"HumaConfig":"Done", +"RWReceivable":"Done"} \ No newline at end of file From 806d12c6e529373eb77fb851f060183a8ebcafd0 Mon Sep 17 00:00:00 2001 From: PlayJoker Date: Tue, 3 Oct 2023 16:54:38 -0700 Subject: [PATCH 22/29] added capability for HDT to update asset token --- contracts/HDT/HDT.sol | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/contracts/HDT/HDT.sol b/contracts/HDT/HDT.sol index d123598c..f8ecf3cc 100644 --- a/contracts/HDT/HDT.sol +++ b/contracts/HDT/HDT.sol @@ -14,6 +14,7 @@ import "../Errors.sol"; */ contract HDT is ERC20Upgradeable, OwnableUpgradeable, HDTStorage, IHDT { event PoolChanged(address pool); + event AssetTokenChanged(address oldToken, address newToken); constructor() { _disableInitializers(); @@ -48,6 +49,12 @@ contract HDT is ERC20Upgradeable, OwnableUpgradeable, HDTStorage, IHDT { emit PoolChanged(poolAddress); } + function setAssetToken(address newTokenAddress) external onlyOwner { + address oldTokenAddress = _assetToken; + _assetToken = newTokenAddress; + emit AssetTokenChanged(oldTokenAddress, newTokenAddress); + } + function decimals() public view override returns (uint8) { return _decimals; } From f4d12b11cb951d1c86fc9439e8903ce3c2163997 Mon Sep 17 00:00:00 2001 From: PlayJoker Date: Tue, 24 Oct 2023 23:30:15 -0700 Subject: [PATCH 23/29] hdt abi --- abi/HDT.json | 32 ++++++++++++++++++++++++++++++++ 1 file changed, 32 insertions(+) diff --git a/abi/HDT.json b/abi/HDT.json index a541ff9c..e3996558 100644 --- a/abi/HDT.json +++ b/abi/HDT.json @@ -44,6 +44,25 @@ "name": "Approval", "type": "event" }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "address", + "name": "oldToken", + "type": "address" + }, + { + "indexed": false, + "internalType": "address", + "name": "newToken", + "type": "address" + } + ], + "name": "AssetTokenChanged", + "type": "event" + }, { "anonymous": false, "inputs": [ @@ -372,6 +391,19 @@ "stateMutability": "nonpayable", "type": "function" }, + { + "inputs": [ + { + "internalType": "address", + "name": "newTokenAddress", + "type": "address" + } + ], + "name": "setAssetToken", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, { "inputs": [ { From bc29ae18c5cf38eeaa0c13d87eb43a1724e47444 Mon Sep 17 00:00:00 2001 From: PlayJoker Date: Wed, 17 Jan 2024 10:52:51 -0800 Subject: [PATCH 24/29] deployed new factory for credit collective --- abi/ERC20Permit.json | 347 ------------------ abi/IERC777.json | 393 --------------------- deployment/celo-deployed-contracts.json | 31 +- deployment/celo/deploy-protocol-factory.js | 2 +- deployment/celo/verify-protocol-factory.js | 2 +- deployment/matic-deployed-contracts.json | 3 +- deployment/utils.js | 4 +- 7 files changed, 23 insertions(+), 759 deletions(-) delete mode 100644 abi/ERC20Permit.json delete mode 100644 abi/IERC777.json diff --git a/abi/ERC20Permit.json b/abi/ERC20Permit.json deleted file mode 100644 index 1e5f78ed..00000000 --- a/abi/ERC20Permit.json +++ /dev/null @@ -1,347 +0,0 @@ -[ - { - "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": "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": "DOMAIN_SEPARATOR", - "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": "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": "address", - "name": "spender", - "type": "address" - }, - { - "internalType": "uint256", - "name": "addedValue", - "type": "uint256" - } - ], - "name": "increaseAllowance", - "outputs": [ - { - "internalType": "bool", - "name": "", - "type": "bool" - } - ], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [], - "name": "name", - "outputs": [ - { - "internalType": "string", - "name": "", - "type": "string" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "owner", - "type": "address" - } - ], - "name": "nonces", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "owner", - "type": "address" - }, - { - "internalType": "address", - "name": "spender", - "type": "address" - }, - { - "internalType": "uint256", - "name": "value", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "deadline", - "type": "uint256" - }, - { - "internalType": "uint8", - "name": "v", - "type": "uint8" - }, - { - "internalType": "bytes32", - "name": "r", - "type": "bytes32" - }, - { - "internalType": "bytes32", - "name": "s", - "type": "bytes32" - } - ], - "name": "permit", - "outputs": [], - "stateMutability": "nonpayable", - "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": "to", - "type": "address" - }, - { - "internalType": "uint256", - "name": "amount", - "type": "uint256" - } - ], - "name": "transfer", - "outputs": [ - { - "internalType": "bool", - "name": "", - "type": "bool" - } - ], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "from", - "type": "address" - }, - { - "internalType": "address", - "name": "to", - "type": "address" - }, - { - "internalType": "uint256", - "name": "amount", - "type": "uint256" - } - ], - "name": "transferFrom", - "outputs": [ - { - "internalType": "bool", - "name": "", - "type": "bool" - } - ], - "stateMutability": "nonpayable", - "type": "function" - } -] diff --git a/abi/IERC777.json b/abi/IERC777.json deleted file mode 100644 index c713a87c..00000000 --- a/abi/IERC777.json +++ /dev/null @@ -1,393 +0,0 @@ -[ - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "address", - "name": "operator", - "type": "address" - }, - { - "indexed": true, - "internalType": "address", - "name": "tokenHolder", - "type": "address" - } - ], - "name": "AuthorizedOperator", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "address", - "name": "operator", - "type": "address" - }, - { - "indexed": true, - "internalType": "address", - "name": "from", - "type": "address" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "amount", - "type": "uint256" - }, - { - "indexed": false, - "internalType": "bytes", - "name": "data", - "type": "bytes" - }, - { - "indexed": false, - "internalType": "bytes", - "name": "operatorData", - "type": "bytes" - } - ], - "name": "Burned", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "address", - "name": "operator", - "type": "address" - }, - { - "indexed": true, - "internalType": "address", - "name": "to", - "type": "address" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "amount", - "type": "uint256" - }, - { - "indexed": false, - "internalType": "bytes", - "name": "data", - "type": "bytes" - }, - { - "indexed": false, - "internalType": "bytes", - "name": "operatorData", - "type": "bytes" - } - ], - "name": "Minted", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "address", - "name": "operator", - "type": "address" - }, - { - "indexed": true, - "internalType": "address", - "name": "tokenHolder", - "type": "address" - } - ], - "name": "RevokedOperator", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "address", - "name": "operator", - "type": "address" - }, - { - "indexed": true, - "internalType": "address", - "name": "from", - "type": "address" - }, - { - "indexed": true, - "internalType": "address", - "name": "to", - "type": "address" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "amount", - "type": "uint256" - }, - { - "indexed": false, - "internalType": "bytes", - "name": "data", - "type": "bytes" - }, - { - "indexed": false, - "internalType": "bytes", - "name": "operatorData", - "type": "bytes" - } - ], - "name": "Sent", - "type": "event" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "operator", - "type": "address" - } - ], - "name": "authorizeOperator", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "owner", - "type": "address" - } - ], - "name": "balanceOf", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "amount", - "type": "uint256" - }, - { - "internalType": "bytes", - "name": "data", - "type": "bytes" - } - ], - "name": "burn", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [], - "name": "defaultOperators", - "outputs": [ - { - "internalType": "address[]", - "name": "", - "type": "address[]" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "granularity", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "operator", - "type": "address" - }, - { - "internalType": "address", - "name": "tokenHolder", - "type": "address" - } - ], - "name": "isOperatorFor", - "outputs": [ - { - "internalType": "bool", - "name": "", - "type": "bool" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "name", - "outputs": [ - { - "internalType": "string", - "name": "", - "type": "string" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "account", - "type": "address" - }, - { - "internalType": "uint256", - "name": "amount", - "type": "uint256" - }, - { - "internalType": "bytes", - "name": "data", - "type": "bytes" - }, - { - "internalType": "bytes", - "name": "operatorData", - "type": "bytes" - } - ], - "name": "operatorBurn", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "sender", - "type": "address" - }, - { - "internalType": "address", - "name": "recipient", - "type": "address" - }, - { - "internalType": "uint256", - "name": "amount", - "type": "uint256" - }, - { - "internalType": "bytes", - "name": "data", - "type": "bytes" - }, - { - "internalType": "bytes", - "name": "operatorData", - "type": "bytes" - } - ], - "name": "operatorSend", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "operator", - "type": "address" - } - ], - "name": "revokeOperator", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "recipient", - "type": "address" - }, - { - "internalType": "uint256", - "name": "amount", - "type": "uint256" - }, - { - "internalType": "bytes", - "name": "data", - "type": "bytes" - } - ], - "name": "send", - "outputs": [], - "stateMutability": "nonpayable", - "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" - } -] diff --git a/deployment/celo-deployed-contracts.json b/deployment/celo-deployed-contracts.json index ba26e8aa..bb207d7e 100644 --- a/deployment/celo-deployed-contracts.json +++ b/deployment/celo-deployed-contracts.json @@ -1,14 +1,17 @@ -{"EANFT":"0xe5DE2a822A61cd7E084Fea2410A00f4EcE47401B", -"HumaConfig":"0x4730Ba92780b6783Ce97bD5f7AaD75337d6D180A", -"HumaConfigTimelock":"0x0562e6287dd69E76771E046f7E24ADC608c837b6", -"HumaProxyAdminTimelock":"0x1691090fb0cFd3bd9b59128b57490eA882A09573", -"RWReceivableImpl":"0x5B7841b94a3C7246662ef514745b034A6ceaAB15", -"RWReceivable":"0xfc256098C6c63836ac71F7057c68b74165fF9cbb", -"HDTImpl":"0xf5F9297c74e464933e42F4a989e81D931fb20f83", -"BaseCreditPoolImpl":"0x98f41d57C06b302AFf999f3F58f4ae7a3F884590", -"ReceivableFactoringPoolImpl":"0x87FD98F3eB172B5183F7527060DDbe8a8D17B924", -"LibFeeManager":"0x58AAF1f9cB10F335111A2129273056bbED251B61", -"LibPoolConfig":"0x941687792107eaC859B820d1636936382F3189aa", -"LibHDT":"0x34eA029c5195F8fb4fe59b492be1738a9Dd959AC", -"LibPool":"0x5Cf4467F129e87274196a95a47BdE57f2C3F6C56", -"HumaPoolFactory":"0x8e945C9ca71637D5582FA2cA6347bD4634261410"} \ No newline at end of file +{ + "EANFT": "0xe5DE2a822A61cd7E084Fea2410A00f4EcE47401B", + "HumaConfig": "0x4730Ba92780b6783Ce97bD5f7AaD75337d6D180A", + "HumaConfigTimelock": "0x0562e6287dd69E76771E046f7E24ADC608c837b6", + "HumaProxyAdminTimelock": "0x1691090fb0cFd3bd9b59128b57490eA882A09573", + "RWReceivableImpl": "0x5B7841b94a3C7246662ef514745b034A6ceaAB15", + "RWReceivable": "0xfc256098C6c63836ac71F7057c68b74165fF9cbb", + "HDTImpl": "0xf5F9297c74e464933e42F4a989e81D931fb20f83", + "BaseCreditPoolImpl": "0x98f41d57C06b302AFf999f3F58f4ae7a3F884590", + "ReceivableFactoringPoolImpl": "0x87FD98F3eB172B5183F7527060DDbe8a8D17B924", + "LibFeeManager": "0x58AAF1f9cB10F335111A2129273056bbED251B61", + "LibPoolConfig": "0x941687792107eaC859B820d1636936382F3189aa", + "LibHDT": "0x34eA029c5195F8fb4fe59b492be1738a9Dd959AC", + "LibPool": "0x5Cf4467F129e87274196a95a47BdE57f2C3F6C56", + "HumaPoolFactory": "0x8e945C9ca71637D5582FA2cA6347bD4634261410", + "HumaPoolFactoryCreditCollective": "0x48065723605D1367bC4256B747293e281F5aD37b" +} \ No newline at end of file diff --git a/deployment/celo/deploy-protocol-factory.js b/deployment/celo/deploy-protocol-factory.js index 347cc906..e8cf1bfe 100644 --- a/deployment/celo/deploy-protocol-factory.js +++ b/deployment/celo/deploy-protocol-factory.js @@ -46,7 +46,7 @@ async function deployContracts() { const libPoolConfig = await deploy("LibPoolConfig", "LibPoolConfig"); const libHDT = await deploy("LibHDT", "LibHDT"); const libPool = await deploy("LibPool", "LibPool"); - const poolFactory = await deploy("PoolFactory", "HumaPoolFactory", + const poolFactory = await deploy("PoolFactory", "HumaPoolFactoryCreditCollective", [ HUMA_OWNER_ADDRESS, humaConfig.address, diff --git a/deployment/celo/verify-protocol-factory.js b/deployment/celo/verify-protocol-factory.js index ccc69fee..d2d22e91 100644 --- a/deployment/celo/verify-protocol-factory.js +++ b/deployment/celo/verify-protocol-factory.js @@ -184,7 +184,7 @@ async function verifyContracts() { const verifyLibPool = await verifyContract('LibPool'); console.log(`Verify LibPool result: ${verifyLibPool}`); - const verifyPoolFactory = await verifyContract('HumaPoolFactory', + const verifyPoolFactory = await verifyContract('HumaPoolFactoryCreditCollective', [ `'${HUMA_OWNER_ADDRESS}'`, `'${deployedContracts['HumaConfig']}'`, diff --git a/deployment/matic-deployed-contracts.json b/deployment/matic-deployed-contracts.json index 9ff4f254..58c4b608 100644 --- a/deployment/matic-deployed-contracts.json +++ b/deployment/matic-deployed-contracts.json @@ -41,4 +41,5 @@ "LibPoolConfig":"0x5E03dB5B41013F5031607aB311f32919EF256A6B", "LibHDT":"0x2658a477e15cA9b6AbC64C665Db7d9b5C6b275C2", "LibPool":"0x8BdacbdAbaa1307E4A0cFb05cbfAd24BfA417302", -"HumaPoolFactory":"0x3A719adcEE26b8252E2A9fD3b60397fE329A2200"} \ No newline at end of file +"HumaPoolFactory":"0x3A719adcEE26b8252E2A9fD3b60397fE329A2200", +"HumaPoolFactoryCreditCollective":"0x842C531f376Dc9154D55a0f39a5fb87a5946820C"} \ No newline at end of file diff --git a/deployment/utils.js b/deployment/utils.js index 5c05884d..1971940e 100644 --- a/deployment/utils.js +++ b/deployment/utils.js @@ -2,8 +2,8 @@ const {BigNumber: BN, ethers} = require("ethers"); const fs = require("fs"); const DEPLOYED_PATH = "./deployment/"; -const MAX_FEE_PER_GAS = 2_000_000_000; -const MAX_PRIORITY_FEE_PER_GAS = 1_500_000_000; +const MAX_FEE_PER_GAS = 40_000_000_000; +const MAX_PRIORITY_FEE_PER_GAS = 38_000_000_000; const getContractAddressFile = async function (fileType = "deployed", network) { if (!network) { From 5d196e6550a7720bea5e636dd388563f43ca0c88 Mon Sep 17 00:00:00 2001 From: PlayJoker Date: Tue, 21 May 2024 06:51:22 -0700 Subject: [PATCH 25/29] updated deployed contracts --- deployment/celo-deployed-contracts.json | 4 +- deployment/celo/deploy-protocol-factory.js | 2 +- deployment/celo/verify-protocol-factory.js | 112 ++++++++++----------- deployment/matic-deployed-contracts.json | 2 +- deployment/matic-verified-contracts.json | 3 +- hardhat.config.js | 2 +- 6 files changed, 64 insertions(+), 61 deletions(-) diff --git a/deployment/celo-deployed-contracts.json b/deployment/celo-deployed-contracts.json index bb207d7e..435a207c 100644 --- a/deployment/celo-deployed-contracts.json +++ b/deployment/celo-deployed-contracts.json @@ -13,5 +13,7 @@ "LibHDT": "0x34eA029c5195F8fb4fe59b492be1738a9Dd959AC", "LibPool": "0x5Cf4467F129e87274196a95a47BdE57f2C3F6C56", "HumaPoolFactory": "0x8e945C9ca71637D5582FA2cA6347bD4634261410", - "HumaPoolFactoryCreditCollective": "0x48065723605D1367bC4256B747293e281F5aD37b" + "HumaPoolFactoryCreditCollective": "0x48065723605D1367bC4256B747293e281F5aD37b", + "newHDTImpl": "0x0140ABA3E70eba261E31eDaef77a5898DDe84bC1", + "HDT": "0xFf518eb9B4328d37e28C61AAe74079cD4cC7058A" } \ No newline at end of file diff --git a/deployment/celo/deploy-protocol-factory.js b/deployment/celo/deploy-protocol-factory.js index e8cf1bfe..96568091 100644 --- a/deployment/celo/deploy-protocol-factory.js +++ b/deployment/celo/deploy-protocol-factory.js @@ -37,7 +37,7 @@ async function deployContracts() { [], ]); - const hdtImpl = await deploy("HDT", "HDTImpl"); + const hdtImpl = await deploy("HDT", "newHDTImpl"); const bc_poolImpl = await deploy("BaseCreditPool", "BaseCreditPoolImpl"); const rf_poolImpl = await deploy("BaseCreditPool", "ReceivableFactoringPoolImpl"); diff --git a/deployment/celo/verify-protocol-factory.js b/deployment/celo/verify-protocol-factory.js index d2d22e91..20c72972 100644 --- a/deployment/celo/verify-protocol-factory.js +++ b/deployment/celo/verify-protocol-factory.js @@ -96,35 +96,35 @@ async function verifyContracts() { // const verifyUsdc = await verifyContract('USDC'); // console.log(`Verify USDC result: ${verifyUsdc}`); - const verifyEANFT = await verifyContract('EANFT'); - console.log(`Verify EANFT result: ${verifyEANFT}`); + // const verifyEANFT = await verifyContract('EANFT'); + // console.log(`Verify EANFT result: ${verifyEANFT}`); // const verifyRNNFT = await verifyContract('RNNFT', [ // `'${deployedContracts['USDC']}'` // ]); // console.log(`Verify RNNFT result: ${verifyRNNFT}`); - const verifyHumaConfig = await verifyContract('HumaConfig'); - console.log(`Verify HumaConfig result: ${verifyHumaConfig}`); + // const verifyHumaConfig = await verifyContract('HumaConfig'); + // console.log(`Verify HumaConfig result: ${verifyHumaConfig}`); - const verifyHumaConfigTL = await verifyContract('HumaConfigTimelock', - [ - 0, - `['${HUMA_OWNER_ADDRESS}']`, - `['${deployer.address}']`, - ]); - console.log(`Verify HumaConfigTimelock result: ${verifyHumaConfigTL}`); + // const verifyHumaConfigTL = await verifyContract('HumaConfigTimelock', + // [ + // 0, + // `['${HUMA_OWNER_ADDRESS}']`, + // `['${deployer.address}']`, + // ]); + // console.log(`Verify HumaConfigTimelock result: ${verifyHumaConfigTL}`); - const verifyRWRImpl = await verifyContract('RWReceivableImpl'); - console.log(`Verify RWRImpl result: ${verifyRWRImpl}`); + // const verifyRWRImpl = await verifyContract('RWReceivableImpl'); + // console.log(`Verify RWRImpl result: ${verifyRWRImpl}`); - const verifyRWR = await verifyContract('RWReceivable', - [ - `'${deployedContracts['RWReceivableImpl']}'`, - `'${deployedContracts['HumaProxyAdminTimelock']}'`, - '[]' - ]); - console.log(`Verify RWR result: ${verifyRWR}`); + // const verifyRWR = await verifyContract('RWReceivable', + // [ + // `'${deployedContracts['RWReceivableImpl']}'`, + // `'${deployedContracts['HumaProxyAdminTimelock']}'`, + // '[]' + // ]); + // console.log(`Verify RWR result: ${verifyRWR}`); // const verifyBaseCreditPoolTL = await verifyContract('ArfNewPoolTimelock', @@ -146,53 +146,53 @@ async function verifyContracts() { // const verifyFeeManager = await verifyContract('ArfNewPoolFeeManager'); // console.log(`Verify FeeManager result: ${verifyFeeManager}`); - const verifyHDTImpl = await verifyContract('HDTImpl'); + const verifyHDTImpl = await verifyContract('newHDTImpl'); console.log(`Verify HDTImpl result: ${verifyHDTImpl}`); - // const verifyHDT = await verifyContract('ArfNewHDT', - // [ - // `'${deployedContracts['ArfNewHDTImpl']}'`, - // `'${deployedContracts['ArfNewPoolProxyAdminTimelock']}'`, - // '[]' - // ]); - // console.log(`Verify HDT result: ${verifyHDT}`); + const verifyHDT = await verifyContract('HDT', + [ + `'${deployedContracts['HDTImpl']}'`, + deployer.address, + '[]' + ]); + console.log(`Verify HDT result: ${verifyHDT}`); // const verifyPoolConfig = await verifyContract('ArfNewPoolConfig'); // console.log(`Verify poolConfig result: ${verifyPoolConfig}`); - const verifyPoolImpl = await verifyContract('BaseCreditPoolImpl'); - console.log(`Verify PoolImpl result: ${verifyPoolImpl}`); - const verifyRFPoolImpl = await verifyContract('ReceivableFactoringPoolImpl'); - console.log(`Verify PoolImpl result: ${verifyRFPoolImpl}`); - // const verifyPool = await verifyContract('ArfNewPool', - // [ - // `'${deployedContracts['ArfNewPoolImpl']}'`, - // `'${deployedContracts['ArfNewPoolProxyAdminTimelock']}'`, - // '[]', - // ]); - // console.log(`Verify Pool result: ${verifyPool}`); + // const verifyPoolImpl = await verifyContract('BaseCreditPoolImpl'); + // console.log(`Verify PoolImpl result: ${verifyPoolImpl}`); + // const verifyRFPoolImpl = await verifyContract('ReceivableFactoringPoolImpl'); + // console.log(`Verify PoolImpl result: ${verifyRFPoolImpl}`); + // // const verifyPool = await verifyContract('ArfNewPool', + // // [ + // // `'${deployedContracts['ArfNewPoolImpl']}'`, + // // `'${deployedContracts['ArfNewPoolProxyAdminTimelock']}'`, + // // '[]', + // // ]); + // // console.log(`Verify Pool result: ${verifyPool}`); - const verifyLibFeeManager = await verifyContract('LibFeeManager'); - console.log(`Verify LibFeeManager result: ${verifyLibFeeManager}`); + // const verifyLibFeeManager = await verifyContract('LibFeeManager'); + // console.log(`Verify LibFeeManager result: ${verifyLibFeeManager}`); - const verifyLibPoolConfig = await verifyContract('LibPoolConfig'); - console.log(`Verify LibPoolConfig result: ${verifyLibPoolConfig}`); + // const verifyLibPoolConfig = await verifyContract('LibPoolConfig'); + // console.log(`Verify LibPoolConfig result: ${verifyLibPoolConfig}`); - const verifyLibHDT = await verifyContract('LibHDT'); - console.log(`Verify LibHDT result: ${verifyLibHDT}`); + // const verifyLibHDT = await verifyContract('LibHDT'); + // console.log(`Verify LibHDT result: ${verifyLibHDT}`); - const verifyLibPool = await verifyContract('LibPool'); - console.log(`Verify LibPool result: ${verifyLibPool}`); + // const verifyLibPool = await verifyContract('LibPool'); + // console.log(`Verify LibPool result: ${verifyLibPool}`); - const verifyPoolFactory = await verifyContract('HumaPoolFactoryCreditCollective', - [ - `'${HUMA_OWNER_ADDRESS}'`, - `'${deployedContracts['HumaConfig']}'`, - `'${deployedContracts['HDTImpl']}'`, - `'${deployedContracts['BaseCreditPoolImpl']}'`, - `'${deployedContracts['ReceivableFactoringPoolImpl']}'`, - ]); - console.log(`Verify Pool result: ${verifyPoolFactory}`); + // const verifyPoolFactory = await verifyContract('HumaPoolFactoryCreditCollective', + // [ + // `'${HUMA_OWNER_ADDRESS}'`, + // `'${deployedContracts['HumaConfig']}'`, + // `'${deployedContracts['HDTImpl']}'`, + // `'${deployedContracts['BaseCreditPoolImpl']}'`, + // `'${deployedContracts['ReceivableFactoringPoolImpl']}'`, + // ]); + // console.log(`Verify Pool result: ${verifyPoolFactory}`); } diff --git a/deployment/matic-deployed-contracts.json b/deployment/matic-deployed-contracts.json index 58c4b608..97c5cec3 100644 --- a/deployment/matic-deployed-contracts.json +++ b/deployment/matic-deployed-contracts.json @@ -42,4 +42,4 @@ "LibHDT":"0x2658a477e15cA9b6AbC64C665Db7d9b5C6b275C2", "LibPool":"0x8BdacbdAbaa1307E4A0cFb05cbfAd24BfA417302", "HumaPoolFactory":"0x3A719adcEE26b8252E2A9fD3b60397fE329A2200", -"HumaPoolFactoryCreditCollective":"0x842C531f376Dc9154D55a0f39a5fb87a5946820C"} \ No newline at end of file +"HumaPoolFactoryCreditCollective":"0xfe6A1c4811bE86c4189a0435a8976d6b4b0eA6FD"} \ No newline at end of file diff --git a/deployment/matic-verified-contracts.json b/deployment/matic-verified-contracts.json index 3cc7bd10..437b50b8 100644 --- a/deployment/matic-verified-contracts.json +++ b/deployment/matic-verified-contracts.json @@ -29,4 +29,5 @@ "LibPoolConfig":"Done", "LibHDT":"Done", "LibPool":"Done", -"HumaPoolFactory":"Done"} \ No newline at end of file +"HumaPoolFactory":"Done", +"HumaPoolFactoryCreditCollective":"Done"} \ No newline at end of file diff --git a/hardhat.config.js b/hardhat.config.js index a578185e..4acb0954 100644 --- a/hardhat.config.js +++ b/hardhat.config.js @@ -228,7 +228,7 @@ module.exports = { }, matic: { url: polygonUrl, - accounts: [deployer, eaService, pdsService], + accounts: [deployer, eaService], }, alfajores: { url: "https://alfajores-forno.celo-testnet.org", From e34030de91882bd0cb4d53fa9a769f7f07fc62cf Mon Sep 17 00:00:00 2001 From: PlayJoker Date: Tue, 21 May 2024 07:00:46 -0700 Subject: [PATCH 26/29] added audit report --- Huma Finance Certik Audit Final.pdf | Bin 0 -> 2074434 bytes audit/Huma Finance Certik Audit Final.pdf | Bin 0 -> 2074434 bytes 2 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 Huma Finance Certik Audit Final.pdf create mode 100644 audit/Huma Finance Certik Audit Final.pdf diff --git a/Huma Finance Certik Audit Final.pdf b/Huma Finance Certik Audit Final.pdf new file mode 100644 index 0000000000000000000000000000000000000000..2137e2382b54ca355411f9f1c236fddbe141d24c GIT binary patch literal 2074434 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