diff --git a/.github/workflows/contracts-tests.yml b/.github/workflows/contracts-tests.yml index b6454f09..7fe283aa 100644 --- a/.github/workflows/contracts-tests.yml +++ b/.github/workflows/contracts-tests.yml @@ -86,7 +86,7 @@ jobs: with: node-version-file: '.node-version' cache: 'pnpm' - cache-dependency-path: 'contracts/pnpm-lock.yaml' + cache-dependency-path: 'pnpm-lock.yaml' - name: Install dependencies run: pnpm install @@ -142,11 +142,12 @@ jobs: with: version: 8 - - uses: actions/setup-node@v4 + - name: Install Node.js + uses: actions/setup-node@v4 with: node-version-file: '.node-version' cache: 'pnpm' - cache-dependency-path: 'contracts/pnpm-lock.yaml' + cache-dependency-path: 'pnpm-lock.yaml' - name: Install dependencies run: pnpm install diff --git a/.github/workflows/testnet-deployment.yml b/.github/workflows/testnet-deployment.yml index f9d41177..55d816e1 100644 --- a/.github/workflows/testnet-deployment.yml +++ b/.github/workflows/testnet-deployment.yml @@ -44,7 +44,7 @@ jobs: with: node-version-file: '.node-version' cache: 'pnpm' - cache-dependency-path: 'contracts/pnpm-lock.yaml' + cache-dependency-path: 'pnpm-lock.yaml' - name: Install dependencies run: pnpm install diff --git a/.gitignore b/.gitignore new file mode 100644 index 00000000..c2658d7d --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +node_modules/ diff --git a/.vscode/extensions.json b/.vscode/extensions.json new file mode 100644 index 00000000..c5d06d00 --- /dev/null +++ b/.vscode/extensions.json @@ -0,0 +1,5 @@ +{ + "recommendations": [ + "dprint.dprint" + ] +} \ No newline at end of file diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 00000000..9fab5c28 --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,4 @@ +{ + "editor.defaultFormatter": "dprint.dprint", + "dprint.path": "node_modules/.bin/dprint" +} diff --git a/contracts/.gitignore b/contracts/.gitignore index 11aaa712..c3607833 100644 --- a/contracts/.gitignore +++ b/contracts/.gitignore @@ -16,7 +16,6 @@ docs/ artifacts cache_hardhat -node_modules coverage/ coverage.json diff --git a/contracts/.solcover.js b/contracts/.solcover.js index b8b8466f..8c75ba9f 100644 --- a/contracts/.solcover.js +++ b/contracts/.solcover.js @@ -1,8 +1,8 @@ module.exports = { // Improve performance by skipping statements and functions. Tool still checks lines of code and branches: // https://github.com/sc-forks/solidity-coverage/blob/master/docs/advanced.md - //measureStatementCoverage: false, - //measureFunctionCoverage: false, + // measureStatementCoverage: false, + // measureFunctionCoverage: false, skipFiles: [ "GasPool", @@ -14,12 +14,12 @@ module.exports = { "Dependencies/Math.sol", "Dependencies/Ownable.sol", "Dependencies/", - "Integrations/" + "Integrations/", ], // https://github.com/sc-forks/solidity-coverage/blob/master/docs/advanced.md#skipping-tests mocha: { grep: "@skip-on-coverage", // Find everything with this tag - invert: true // Run the grep's inverse set. + invert: true, // Run the grep's inverse set. }, contractsDir: "src/", }; diff --git a/contracts/README.md b/contracts/README.md index 9265b455..8817d6ab 100644 --- a/contracts/README.md +++ b/contracts/README.md @@ -4,10 +4,10 @@ Foundry consists of: -- **Forge**: Ethereum testing framework (like Truffle, Hardhat and DappTools). -- **Cast**: Swiss army knife for interacting with EVM smart contracts, sending transactions and getting chain data. -- **Anvil**: Local Ethereum node, akin to Ganache, Hardhat Network. -- **Chisel**: Fast, utilitarian, and verbose solidity REPL. +- **Forge**: Ethereum testing framework (like Truffle, Hardhat and DappTools). +- **Cast**: Swiss army knife for interacting with EVM smart contracts, sending transactions and getting chain data. +- **Anvil**: Local Ethereum node, akin to Ganache, Hardhat Network. +- **Chisel**: Fast, utilitarian, and verbose solidity REPL. ## Documentation diff --git a/contracts/hardhatAccountsList2k.js b/contracts/hardhatAccountsList2k.js index f6911b91..226a1a90 100644 --- a/contracts/hardhatAccountsList2k.js +++ b/contracts/hardhatAccountsList2k.js @@ -1,2008 +1,2008 @@ -const _1e36Str = String(10n ** 36n) +const _1e36Str = String(10n ** 36n); -const accountsList = +const accountsList = [ + { privateKey: "0x60ddFE7f579aB6867cbE7A2Dc03853dC141d7A4aB6DBEFc0Dae2d2B1Bd4e487F", balance: _1e36Str }, + { privateKey: "0xeaa445c85f7b438dEd6e831d06a4eD0CEBDc2f8527f84Fcda6EBB5fCfAd4C0e9", balance: _1e36Str }, + { privateKey: "0x8b693607Bd68C4dEB7bcF976a473Cf998BDE9fBeDF08e1D8ADadAcDff4e5D1b6", balance: _1e36Str }, + { privateKey: "0x519B6e4f493e532a1BEbfeB2a06eA25AAD691A17875cCB38607D4A4C28DFADC2", balance: _1e36Str }, + { privateKey: "0x09CFF53c181C96B42255ccbCEB2CeE7012A532EcbcEaaBab4d55a47E1874FbFC", balance: _1e36Str }, + { privateKey: "0x054ce61b1eA12d9Edb667ceFB001FADB07FE0C37b5A74542BB0DaBF5DDeEe5f0", balance: _1e36Str }, + { privateKey: "0x42F55f0dFFE4e9e2C2BdfdE2FF98f3d1ea6d3F21A8bB0dA644f1c0e0Acd84FA0", balance: _1e36Str }, + { privateKey: "0x8F3aFFEC01e78ea6925De62d68A5F3f2cFda7D0C1E7ED9b20d31eb88b9Ed6A58", balance: _1e36Str }, + { privateKey: "0xBeBeF90A7E9A8e018F0F0baBb868Bc432C5e7F1EfaAe7e5B465d74afDD87c7cf", balance: _1e36Str }, + { privateKey: "0xaD55BABd2FdceD7aa85eB1FEf47C455DBB7a57a46a16aC9ACFFBE66d7Caf83Ee", balance: _1e36Str }, + { privateKey: "0x24AdB73C45C2EccEDE38B63E5B8F3D3bB396cf0eDFa4BB788231C8fd38d4cdd3", balance: _1e36Str }, + { privateKey: "0xA7C2caCEACfdE954DebDAC9FE0dB6D587eA1FC66Ffa7B2E802D6021EeF9fACEe", balance: _1e36Str }, + { privateKey: "0xab6b6fd0bcAc38E3453A751dB3D6eEa804aCfAc6782Acc19ec2ea225673fAC1C", balance: _1e36Str }, + { privateKey: "0xBCdEd8cdAbf2FecDE7CD4cEb56E81B9eb8DDBA4fFA4d7D9b5daBD70BFfbacfDf", balance: _1e36Str }, + { privateKey: "0x51B9F9A65ec3f86feDe3ac7cBAe613b6b2DEc64c93b0fb0CddADB6F6Ee3D9866", balance: _1e36Str }, + { privateKey: "0xead23Cf6c3e1f61a5e390381A39E7c8c79B6d03F51b4823D83AFEEcabBc1A680", balance: _1e36Str }, + { privateKey: "0xCCCB498D6AC5BB5AC0F963eCC80b8c54bBce8a0AfF3df4a240Dd07AF6529bcAc", balance: _1e36Str }, + { privateKey: "0xf2F7299ACB815b5002BD2C36cdBccE59F6EfDe6ABDEB8b744E987cEdD5b3E5DF", balance: _1e36Str }, + { privateKey: "0xbDea513EbCa2683eAE46DDDd6ADF8d8AEf11aE3bb59d4fabA5c01BB53B1caEAd", balance: _1e36Str }, + { privateKey: "0x218b2BA39Cee417A3cE486CA87e3CA63B360731Ed7CEf15eda6DB88A872Ca4e5", balance: _1e36Str }, + { privateKey: "0x9ebC3BA711E9C6dfDDBfD82c8aC29dDBFEbE51d4fB2D5773c1c9EE1A0afCc76b", balance: _1e36Str }, + { privateKey: "0x82Ae62ffBAEA3cF930F3C310Ff8C9ec8AeA8cBcd4ABcD76d43d540EaaEb43Ae2", balance: _1e36Str }, + { privateKey: "0xADbFcE089F7b0a1aeA10020d0B4EdCDDA8Fd13EB4BdFdd0b6EA3addfa79119f9", balance: _1e36Str }, + { privateKey: "0x1Aa9d55DADDbd07c0ECf7ecCc8e5AACdeA5707B2F04a727ad60CF0D4D5CF21cF", balance: _1e36Str }, + { privateKey: "0xBEFF95de2b6aDe8eE0fA6eaBF7c10feE9aFC1da7Ae9cCB2bdDcEEB318dEcA3ce", balance: _1e36Str }, + { privateKey: "0x8B44f27AdF48A1a5c9bAda13971Ed6EeccDB7a223709c83b96af5cB89BD36F93", balance: _1e36Str }, + { privateKey: "0xDC6E9936D3F49c26a73A4Ab7E1Ae2965F680adCaDC4DccafF11A48E18Bd63688", balance: _1e36Str }, + { privateKey: "0xc07dF5fD6c4fF8be980d13ADDA3a86FC7b815BAbc091eCc23bBB27a1bfac22cE", balance: _1e36Str }, + { privateKey: "0x64fBBd78Cb201a5eE06fDA113C4c91B85d8e0e2a5Dffa38CD541dfdF72A01D52", balance: _1e36Str }, + { privateKey: "0xC28e7e4ce7BF6b7FDedd9483CDafC3a2cF1fEcdace5e8Ac3F81CCFa83e484f06", balance: _1e36Str }, + { privateKey: "0xbcbDddCeffd3b395bc4e02ABC4cD464eBd3BA6f756BeEd414fb44E5Bda35b6D1", balance: _1e36Str }, + { privateKey: "0x1Da12363E1Ea59cAc9f88E4aCebbdCA8cD25Be2C72da22C3dD9D05e193678dE8", balance: _1e36Str }, + { privateKey: "0xCe3eA4b6aBfB9BaF5DeD76e6F6C67Dce9f18d6bcb8290b76C2DAcC87b2d63E0B", balance: _1e36Str }, + { privateKey: "0x8bfDDCdb52717A0dcC8daf7bC0fCDf127BA09375CF6CE3DBbEe0c64E5dFCA60D", balance: _1e36Str }, + { privateKey: "0x77CE7DD53edb5D85d734103af171a7c47140AB474Ae4D05AeaBF5bEaD6EfFFf9", balance: _1e36Str }, + { privateKey: "0xb45dEE462c21Df583FA1baC536d41AfE4ef7d84a858aEC03F6d6D293f4881a9A", balance: _1e36Str }, + { privateKey: "0x7b606a0c35deE9E81873F7e4fB1F73fcFfB2A3Cfd45eD12abcc08A3CeECAaFb5", balance: _1e36Str }, + { privateKey: "0x8De4c0048aAC87fc0e61ceAF1503716cB8f25eDa4BE0DfddfD85568B052c6cC0", balance: _1e36Str }, + { privateKey: "0xAcfA5C7bAFF9f01BE4cBeA6E399BcE609DECcEAC7e0B411bD9eD38CF177CD2bF", balance: _1e36Str }, + { privateKey: "0xE8dD8FaaF0bBD00AAF2c5eaE481bfcE668e5aDef445Bb9Bc81fEF995542C3F2D", balance: _1e36Str }, + { privateKey: "0xc115A7DCeEAf591C8dA3eF4cf9ECFCbcCba77585Bae56b755bAeFA714cDaa9bd", balance: _1e36Str }, + { privateKey: "0xa302c71EF0D1d479EBBcAFF6BbC86146A26ba05c65Ba97EE915a5F62D30907c1", balance: _1e36Str }, + { privateKey: "0xd1fEBbFd8D3C980ff369e62F8EBa9eDebccFeff12Ca1eEbe3777908E1c3e7cF8", balance: _1e36Str }, + { privateKey: "0xc4D67EC0a5cB398E8cdc9F5bEDfF51fF63F6FF505A25C5a99616062131f7b402", balance: _1e36Str }, + { privateKey: "0x602F39eDfd6c713Ee18aebE55d4e1f838CBA979FB4d0F9DaA6AebCAadAe7E1C9", balance: _1e36Str }, + { privateKey: "0xCb30CBB18b1d15a6edA00DCF64EcD04f9E64fBcC7E2abBbe2f3AF1D44cBDDC9b", balance: _1e36Str }, + { privateKey: "0x5dE6f3462cc76e97AbE877aCbFc2eF4CEd68e47DfA7A0255fEa2fBbE28b7F70F", balance: _1e36Str }, + { privateKey: "0xb92Ff73D27cd9febDA3Ca62Bd3aEC38eA609Cd94b7fabEfA5A0e9BCebeDe9F6a", balance: _1e36Str }, + { privateKey: "0xcb2b40b1691fFaB7cE472D1D7eD04C4f3AC1d597F01Abc1BeAfeFEA4eA470c4c", balance: _1e36Str }, + { privateKey: "0x9B4A523E1d91954D31FcFb18Fdc28A0a7af6c45AC73B9CbbCCEebcafe980d510", balance: _1e36Str }, + { privateKey: "0x8d90b7cAdf1A5EAEc001FEe70632CF151fdCDdA1c590BDd1E61Dfd0cE3219791", balance: _1e36Str }, + { privateKey: "0xA65C0cbaef18A5A86aaFe44EC6932Ec0EAAB647fbCCE905cff1A125f5Bfe282D", balance: _1e36Str }, + { privateKey: "0x09F36aeF4f0eFEC0DE56CBaa8aE4Ad71aC820C3f6d649Eb9d8fd3492aC0a83f3", balance: _1e36Str }, + { privateKey: "0xEEfdcE15FC4add6CCcf53DFa37FBDfCba8f2caE454CB2cA433e26A8D396AE4ab", balance: _1e36Str }, + { privateKey: "0xC0d9D291fB49F4fe3B2C6Cb44A8210D68Cc727d1ddc8DaC22A26CC9C3f5a5f4a", balance: _1e36Str }, + { privateKey: "0x7b77defCB1fD1C81e1cBFfF38949852BFE0fb0eb8385c68D26bf9C2c6dECe380", balance: _1e36Str }, + { privateKey: "0x0F6Fcf8E8A99BD10843445bEBEC6AEA5a8e5976451FBAC1d351c24f9d57Ef96F", balance: _1e36Str }, + { privateKey: "0xC25ba8FEe461FEF1C5AD85Fef26aCFfddAa7B2aB5C91bD3FA8A4AaDA79dd8bDA", balance: _1e36Str }, + { privateKey: "0x0aFAEfc59D19eFc6EEBBBFDFBE9d5DB87de7d50f8ce2023850770dD434B567CC", balance: _1e36Str }, + { privateKey: "0x836Bb03Af64f04d0fAc574fab9a2C7E4a1bfbd2Fb0179e5BfA1198A2d58EcCcb", balance: _1e36Str }, + { privateKey: "0xdbE59CA8dFCEbc17b899f5CbC4C2abAD9a2DcaA85bbCc2BbF92865a66cBCAcDa", balance: _1e36Str }, + { privateKey: "0x6ccDfaAEA2bb1ea2F4b376Daec0645c3f3567682aD2f8fBD9BeaC4abB0489Dd3", balance: _1e36Str }, + { privateKey: "0xD2bD2B8F3eDE84cB8f9B8aF6901f8F0a88cD1D7c41eCFfD8DDE67Dcb9521f15A", balance: _1e36Str }, + { privateKey: "0x1dF8Ef7ea6Cc90DfC2Fb7F412e7d5A4aE8Dab3e538F8DF9edBbE41CEaC40F8aC", balance: _1e36Str }, + { privateKey: "0xDfaD57f13d737cfecf50dBbb922eFcf97FB33c51fA4f9f967BEAdc892FE3fA5B", balance: _1e36Str }, + { privateKey: "0x279AFC0e2B7A24CbAcC4F1ddA9eC763Ae6B5124da293dAB544cfC74E51d6c64E", balance: _1e36Str }, + { privateKey: "0xDfCcDB4D1365E4b3FB419adf6BadC7b3886BEB2Bad2aB9b60872B2DCCbc3AaB1", balance: _1e36Str }, + { privateKey: "0xBd3FFbDa8bc036a0D51ABBC8db61EA97812ed7e169ef7efBac1F66f38A45E2fb", balance: _1e36Str }, + { privateKey: "0x79ED1a5a0b585Ef0e9Ef59439bbc3142e9c524FF95bcAecFa06eBb0FAca3f7Df", balance: _1e36Str }, + { privateKey: "0x6E40ee4BFcB1be77b18e127d75a815DbFaFB3548857eEca6Dce730dAaA8e4fd1", balance: _1e36Str }, + { privateKey: "0xbeDff07E874BECB31dFB022Ba6Ed6f626cae74E7F8E9Efb3752d1048edBAEB1f", balance: _1e36Str }, + { privateKey: "0x744B70a65c6c01a262400fe6a82a5cfbB2E61249DccBC2Cfc8d6E19AC878fD06", balance: _1e36Str }, + { privateKey: "0xcbb757EdeC8E19Bc2dffdCAeD2BD5ACBcA30CE97de34F6B3cB642edF8E8Afc85", balance: _1e36Str }, + { privateKey: "0xdc32Ad57beaAAaE782ECC11344a1e2308bcdAd834635dD22FCA0C2Cb3ca2aabe", balance: _1e36Str }, + { privateKey: "0x60ABF4ef24DC6B4Ec1aE1eCb0A2A8f7913b11f07db0e74ABe4c5a3FAdD35EF3E", balance: _1e36Str }, + { privateKey: "0xf3F8AEeb4b3EFE42eF6C53403Ece1CC6AFcf7b677cE1cBe8fADf71ABffD00227", balance: _1e36Str }, + { privateKey: "0xffbfC0fD2585fDFBeFf9CEB72e0Aa48f6bFD1ABBD585DcaB31DCc390b4Fea5Fe", balance: _1e36Str }, + { privateKey: "0xd2FaE3Cc087239F1ECAd98e955a4E1ef4bfc1DaD7EBB2d78643ECF4351bFcbFC", balance: _1e36Str }, + { privateKey: "0xF8b749a53cffb6BeB5b6F1Ba7BFd91cf98b3eC7Dd12D4DcFe75f1DE7b04E6CFf", balance: _1e36Str }, + { privateKey: "0xe25fc5f8d3B25CBe560E6925B670225a8EB4A9d12Ce0345dB4b160d2DaCe3077", balance: _1e36Str }, + { privateKey: "0xAc2534fcbeF95e4fFC7c83DEFCC85DcDE846aEeb7ef0542ADE15a6E4EdC6A32F", balance: _1e36Str }, + { privateKey: "0x785eFbe723138c23108BAfd119fC3F99FcDd621C4320FB8c43D82AEdA3EffC59", balance: _1e36Str }, + { privateKey: "0x5Ab36eFd957af3EEC90A4Cdcf72ba463F10EFC2CEF2CF4170211C26a2aDf5E26", balance: _1e36Str }, + { privateKey: "0x74e2AebaC39Ec6B27Ca0ef2b238994f49Ee9489df1E0dABe1d69eE9DfD9B1fa0", balance: _1e36Str }, + { privateKey: "0xcbF5c97E0E2112aF0D13d4F4eaDF0572f15eae16b1F6D1C355b6Db5eAc3Bdc0c", balance: _1e36Str }, + { privateKey: "0xc9Ab29514391dBadf0bA35a3eEf00FC5D14D3a242d3B9564B2BDBB3b1dBAcd85", balance: _1e36Str }, + { privateKey: "0x1376febf8Afe5fFeCEFe1902Cb28f8b7Ef7EEaFeEb5F3C5E37B9afd196eAec67", balance: _1e36Str }, + { privateKey: "0xB90b7C6FaCCFe4b4F0DA0DDAe7cEDCFc5E5d09De2E496Ab4fE7b106F90F1ceAA", balance: _1e36Str }, + { privateKey: "0xb8DFEE8b8cCaeCb2B0dbDf41E956e98EdD2A05DEffc533e49Df27AfDc5CC7a6c", balance: _1e36Str }, + { privateKey: "0x2F25d6fC8E8E2AF8dC0BEB1EF3aA28fDb2DB6A9705BDcbdBd01cE7CABfeEACFc", balance: _1e36Str }, + { privateKey: "0xE46aBCbB580A28CDBF7C01d740AAefBB5aDa79BD80aBDcE7bbe15dE199cfdfE0", balance: _1e36Str }, + { privateKey: "0xECb78eb074b81Ade820f74a97DA3BaA8B33cbcAfeedc3314FEACC60CC2d65d09", balance: _1e36Str }, + { privateKey: "0x888AD49fFbC6fdA307f67c5ABc14a1cCeCBaADaAFDE0dcCBe274Bbb3Ebc4Ed34", balance: _1e36Str }, + { privateKey: "0xE6aee5027f5Abe06FE7A819067CaFf8eE5dbB76c8c6c3C4fdFA11fA7F6EA92d6", balance: _1e36Str }, + { privateKey: "0xAfafa9f70DeBa03746f3CCcbBc76C1F1dF8E4a220aFadC55AE8BCE4dADfBc05f", balance: _1e36Str }, + { privateKey: "0xc6f9DA2b1EcEC198B4eeCb97FA453BCCDD4aA1805303Bd9bbad6cAFbf02732Fe", balance: _1e36Str }, + { privateKey: "0x5E66eaB19703dAC6fc85F07072241fABFa5FE9D161ae8D16EA9A2aDdEe4b8a7C", balance: _1e36Str }, + { privateKey: "0xAbe72e623a6Baa5f8f0b1aE4bDAc8CdEaFd1Ecc5878B9eDcBC80aC61020F0E83", balance: _1e36Str }, + { privateKey: "0x271ec8d6eb55A2ED2a5c97CECeEDEF59c2EEE5EA2EcCD3CbfeC455efa45578B3", balance: _1e36Str }, + { privateKey: "0x2b8aaBcF28334Eed82EA8c6E4f18AcFfeEC9E32cd8Ed7cBd3DECbA271cb9C4c4", balance: _1e36Str }, + { privateKey: "0xb13c1a6005BC02CCAeEC8E9fFfEb55e1B86A6ffb4f4DB48b5506904dEeCf7aFa", balance: _1e36Str }, + { privateKey: "0xd37C35aBa93EB24Eb95A7D64C3508f415e864dEC8FfEDAd4BEfD873d192805fE", balance: _1e36Str }, + { privateKey: "0x7C255436a3785ba78FCBfad4F5D49b9C5aDc96D0a34DA4AE879Fe9D72fcAdc4F", balance: _1e36Str }, + { privateKey: "0x809325745E84a52BEeCf5920b8BF3Ff98F29B2A9ef5F72B7D3feF1f66fc7ED51", balance: _1e36Str }, + { privateKey: "0xCED115dBC9d424DEa7fa684bA606DEFdF618eAdC40ff62affeABbc176b49A1FE", balance: _1e36Str }, + { privateKey: "0xa55850D6ab8844d6D64B5daecb9350899d195107e0DaaBfF470c8BfaaF2cfF3a", balance: _1e36Str }, + { privateKey: "0xE5B0b7AfA8f0d598EdD7DFa1290c9Ea9683b3DC7103C9AFc37B4BAB0f4D82bfb", balance: _1e36Str }, + { privateKey: "0xfaBDC65325EB8c9F874bA1E6B9BaEc63a2D0E1ECF6b742AF6484fBEEcBC0922e", balance: _1e36Str }, + { privateKey: "0xC8dDab45a8a2DC25fbC10Be780275e5fECF142abbDADB5FD1f2C89f80bC3C8B2", balance: _1e36Str }, + { privateKey: "0xf9588Eb75e37f3D94B6Fe66eEe7AD3bCbe254ca3A802e8a4CeDEaBead7Deef0B", balance: _1e36Str }, + { privateKey: "0xD5A1CFD2d684cA6F8ffbd95cBEBDbE0f7dF7aFd9b4Adc3Cd89Aa4F884E87766f", balance: _1e36Str }, + { privateKey: "0xe5baeD62c0B6bcEd4bEd38Ea9ff7da0FdAEF1B96AE8aE1BFDbAff9FAaeaECe59", balance: _1e36Str }, + { privateKey: "0xB5ADAaA2b8A8CfcDCdAe1a1C9B68fbf7DC59718527F422Ef8a22A47edfdefc0f", balance: _1e36Str }, + { privateKey: "0xA6d530ECb9BfaB65db8f4eB78cf8dA0Ac85C2E19dD18cf9C3aA4F8dc8deE2A2A", balance: _1e36Str }, + { privateKey: "0x858fbefDFAF3206BbbAEFF6311a04bC4F00e7a8a1f86A9C29BC4f99B3DfCA47B", balance: _1e36Str }, + { privateKey: "0x3283CcA8E849AeEBa6D07fbCceF06DBFdD6C280bf6ACFe4EcEf8cD6Fe906AEdb", balance: _1e36Str }, + { privateKey: "0xF19B146b83fD4dc48A7B5f463dCadE3C7027c99F54f05dcA9aE8cbB9Ff7ACc4b", balance: _1e36Str }, + { privateKey: "0x1A89bcB5cC568e7Fb20d0ABE1dCD520Ac06FAFec6DFbF37BF2eCE7A042a1C8b1", balance: _1e36Str }, + { privateKey: "0xb29ffFef1A19A6c20be9fDc524E2E3C4Bfbe91Cd5c8a5d54faB830bec9eDb76E", balance: _1e36Str }, + { privateKey: "0xe7cBa50C7AF2eC5C23EdF60BaD08D4d7d3eF5cA0D632CFaFC6874F0c95BEDe3C", balance: _1e36Str }, + { privateKey: "0xbEc3Ea7F6652dd0DDA2bF271F982aBCaBcBcD0cF76deD7B2c8508d515D47C20E", balance: _1e36Str }, + { privateKey: "0x87d2510c6CA006bc5BfDafc1e11e2212cCd98F9D422A4E85c2bF18cfCEA2c9c3", balance: _1e36Str }, + { privateKey: "0xFBBe285317dA7bDecdd5B935ce761e71CBe19f8B74fbBE598cD0a056bdac0aff", balance: _1e36Str }, + { privateKey: "0x411D062e5f17f5Ec3e7317CbAdACcBDf0cD1CE6f62A3bf40596CE4132faFc9D8", balance: _1e36Str }, + { privateKey: "0x8ec7fD8EedaA8b90eeC27Ddc5BFd6696d8Cff53b470ecC51CC0Dcb465a71B13a", balance: _1e36Str }, + { privateKey: "0xd823D0AaE55f149FCcD564f506792889BdF8a1AA9f7E9bd3b2Bd0A7e1B1AFb6a", balance: _1e36Str }, + { privateKey: "0x26d94c8fc2cfBEA48cEF0eBfd3cfcDCc770F1467A4fBa51BCD7e7e61250FDD8B", balance: _1e36Str }, + { privateKey: "0xEc62792fc72B20b8b93d90A69b0565bceab06E90dDD3dEA23d1E9DE2ac39FF62", balance: _1e36Str }, + { privateKey: "0xd7ccC3d570C74ae2e4F547D07752DbD6EfeD9c8B65c8cB4A3cFcbe492faE25aD", balance: _1e36Str }, + { privateKey: "0x83C391713Cd7b0e0852bD84CAaDD1aB0B65CC1CF4CfdF6bd97A3008C2BCf59B3", balance: _1e36Str }, + { privateKey: "0x8E39Ed10E2eafAbc1Faf548F5F8074Ddc0764Cf855f6ae8dEF115DB5bEB96B61", balance: _1e36Str }, + { privateKey: "0xAD2E2cb68aB1D75BEedEFC47ECE963D1afbBFebd10C4Adf68AEC58dBfBfBCAFA", balance: _1e36Str }, + { privateKey: "0x5ED318bF8A5Bb4DBD5BE9a47Fd6ec59E97C949a1DBc31BAcbE645F9Cfe4ea07c", balance: _1e36Str }, + { privateKey: "0xdC30Dd994B8aCbE9F4374186c11EdcD85eebc4dBf4aFFedBBE9Afea2D9496a0C", balance: _1e36Str }, + { privateKey: "0xd90e2a275F7e9f54F8bEC3EDFaed1A150fdB330475f6CeCe70EEbEA779dd44bA", balance: _1e36Str }, + { privateKey: "0xA3d0DA6D5Af0fdaa033E1F885BC3dBf62b203a09Fb66CeCDbDbE0AD0Ad6f6F7d", balance: _1e36Str }, + { privateKey: "0xeCD0A803DCcfA3AaD2cCdfBDd94318bAEbE3e14BBA4F0e770a447B43bB28FEFB", balance: _1e36Str }, + { privateKey: "0xeBF2fbc9C6FE3Ecd58d1323Fd7Da610deFc5B10b73B585c432430ceA81c047ea", balance: _1e36Str }, + { privateKey: "0xDb107Eca6ee69b73B4F0fd25FfbEF4d12671d267CBf6CE39cdAbCa68bB92741f", balance: _1e36Str }, + { privateKey: "0xDf8DBC03A850D8b188CBEc934ffEEE5773A6F97cbcEc43dd6f45BAE437EFFCCd", balance: _1e36Str }, + { privateKey: "0x92D958ce5F73F0Eca0A89adaC08C36eBac6547c3865545Ab054b16Eb1C0086cc", balance: _1e36Str }, + { privateKey: "0xF6075f1BCE23B4fdB383c4051CeFBf8e2f9ACBCDf2FDef8Cbf54ff299Ebc05eA", balance: _1e36Str }, + { privateKey: "0x2A9279DA5925e3b373C5Dd1addAadC86c318b12CdA3ACDF9D31c82FB4729aeeB", balance: _1e36Str }, + { privateKey: "0xF6A342721bd931a8AeAeae750Ba5EFAffDFeBE4514AcC224fFeb6eEbe15d7CAE", balance: _1e36Str }, + { privateKey: "0x29c8bB26ff7fFD3bcB884Ef9Dd77Ffa6Ab5F2C71A9c35e2CED3dEe4dcC5009AD", balance: _1e36Str }, + { privateKey: "0x48f59c8Bc2D672A3Ffa394f5D9C90c65745aACf7Ceb9E32e1c36ED8Ead4af6b6", balance: _1e36Str }, + { privateKey: "0xeaD4c3d9cFE4CDDd2ffB3aa647D40Fda9bC6d5aBA2F1b07edC89b47d78E34A8d", balance: _1e36Str }, + { privateKey: "0x6adAdACCFa1cBD18eC5Defc58B0AFe331337CfCCbE1fDd76c2371697df7E243a", balance: _1e36Str }, + { privateKey: "0xcFE0eB0aFbE7eF2DdA46B7f2fC127AC87C74E4aE3faAFebdDEEE6cC6cABdc2a7", balance: _1e36Str }, + { privateKey: "0x8C9fe32563d3ed6B34A2Ab06271Bce4F55d42dA1EaC4db9b16ABF6ce71aACC76", balance: _1e36Str }, + { privateKey: "0xdfDf9fEa42CF1AB0fbBBF52d5305Af1F6aaAf6AfBBCCA4a319ce1F3A908eb9E5", balance: _1e36Str }, + { privateKey: "0xB6AfbE0eE5daffcF23facCaCcED35d15b3969fAbcD306eD6fABEd5E8eD6C5FBd", balance: _1e36Str }, + { privateKey: "0x4FBb2FFDD3C3DB5F74E893577bA339cE5A8edbaf571E91adedEC50fa46c56864", balance: _1e36Str }, + { privateKey: "0xeB417BE7ddeaeFfcF2fcb4F7bebde4FB23994B9F862C863a358fD37Ba929B2F8", balance: _1e36Str }, + { privateKey: "0xDBA12Db5b29f01ACB45C0b051aD7cFaEb4BFe38abcCf13BA1F3bf2177dC51CFa", balance: _1e36Str }, + { privateKey: "0x81D77Bb549aac5DfcD4EFFD5FB3Bb69FB48D7CEACc1fBCBc23Bae1DBbab0fdbC", balance: _1e36Str }, + { privateKey: "0xb9BDdC1F838Eb3bF6B49b8bF32181Cf89D2D120bEB62CcAea9eAFbF4fdB0479F", balance: _1e36Str }, + { privateKey: "0x02adf4DdCaAEE05D7A297f16FD5aA8dE9dCCE6d1Ff6cadfe4AB8E8d662BbbFAF", balance: _1e36Str }, + { privateKey: "0x61231fcABe74Bc2faddeabCcad3CbEE5f7D09d9d0b2bDCfca8F9C190BCf8Ef04", balance: _1e36Str }, + { privateKey: "0x68AeEF50Bb3dAdEf65DB5cE7ca6C049089Bd0267e8A37DFbcF7A683Bab5aA3Cf", balance: _1e36Str }, + { privateKey: "0xDb941ec68825Ea73Bb4616F322c996b341c7ea06b1E5BA3D7Bd9Feeb4BE91196", balance: _1e36Str }, + { privateKey: "0xc95FEaB1EbC4CBB2EBcAF92BDC0cBfa6fD0D9d5CdEDceEA71c9854711E3BEeBE", balance: _1e36Str }, + { privateKey: "0xC3Fbeec5CB369d625ae086BECd0aEa2dB5Abb3Db2abca4df8fb185c43D272D8B", balance: _1e36Str }, + { privateKey: "0xdFEfF3cA104bFDdB1a43649DbB469beECBb0efb1cc2E48eDEE41c57AeCB98BEa", balance: _1e36Str }, + { privateKey: "0xeF28ddAB8a4ECA0a698aFA55bbeCa8Fe5Fc7FD5957d5eECa3A0238182f1Fb4dC", balance: _1e36Str }, + { privateKey: "0x26B13acfBcACDf666530bB48BDe8AfF879F54cDd430fe435F0AE8C3fDEe4999D", balance: _1e36Str }, + { privateKey: "0xc9648ccDD198f2caFa04Effb3fFa1A3c79dAb43d81BE301929cEDDF510f905Ee", balance: _1e36Str }, + { privateKey: "0xfdF2fAaE2eBE07A011BACDcEB89326aEFD0c72AD95321aed4Cf00e017ecDA9d7", balance: _1e36Str }, + { privateKey: "0xA0d8233a10f4Abf8ea141a3b75c8f6Bd31dcd9b385DD4517AE45a0ACAEE304a7", balance: _1e36Str }, + { privateKey: "0xe7b9E1AdA2f0fdCd13C3beC11dfe7a2e41CCBd6b03a4448b8c46F53bdF29Eda1", balance: _1e36Str }, + { privateKey: "0xDe341eFF3cd160cf06BF3c70CF958Face0fcCd5Fe0CeFa56a2AC8Fbc0495A26B", balance: _1e36Str }, + { privateKey: "0xC7BD3DB19c0B8b8108B0dDF72F764A19F1C832Dd146DdcfBDbcdE0D4eB89811f", balance: _1e36Str }, + { privateKey: "0x6DcA7C0ABeabADD22DE19Ae5a5F0627DF3e4DADa71aFFF7c7D5b60F76C1c56eA", balance: _1e36Str }, + { privateKey: "0xA5B5eed86Ce56dDde6CCFAFBe64AD9aEA7cb114D5Cd7dc73f0E594D6A84c427f", balance: _1e36Str }, + { privateKey: "0xDF023E46AA90213afEdcf4E79440ff80aDfFd5A31202baeCeaFcc0f66f8e9C16", balance: _1e36Str }, + { privateKey: "0x76f2Df2CEA6Efcfa653Cb8db9A86D62c6F1E7007c6b7D3D0AD58c6B2dAfEC566", balance: _1e36Str }, + { privateKey: "0x935e5Da5dfB39f3D18c3fBf6b76bafbA1b4EedCF382b27cfC95AafFfDC372222", balance: _1e36Str }, + { privateKey: "0x2D8cFD5F5Efe89e21eD6B58678FDa53eFee92Ccaca1E4Dc792DbeaA378effD5C", balance: _1e36Str }, + { privateKey: "0xabc2b1524F5b1Adc9c72D3Bb46bdba1D670c19cd9A57Bd6d3afC3d1F10D2F1Ef", balance: _1e36Str }, + { privateKey: "0xCB2964Ca8f2fDC3A1CA02dEc3bf2Ae7C7d58b7805Aac4F838d148aefd0CEbeaC", balance: _1e36Str }, + { privateKey: "0x620f7f5735c6d6bEF7d09120DFc96FD17DDB34c8fF8BC289AC55cBA6E5A4AbfD", balance: _1e36Str }, + { privateKey: "0xEAeCbb75A2a35aAF9e6CE8ab03d66d9edA6471cB9bDd8Eb0F1Fc2F1C08767C17", balance: _1e36Str }, + { privateKey: "0xEfc47CBaa0f5072cA756841a0C37D86eDA0cFe899bd67bAAE22c4BB70CfF81bd", balance: _1e36Str }, + { privateKey: "0xE009dBd7233C4628D88A6E16B52566bcB73eecECBeD0Be18a0D4F42A5ce85c31", balance: _1e36Str }, + { privateKey: "0xa07c6A0dD46bf1aFaf45fE5240EbbE4454aCEB1cde673dA5F5B35Ee8AECEec4B", balance: _1e36Str }, + { privateKey: "0x13ca21fE6eE4Ac4e7e57EfdcB3e5E07c0f9A8F1d1Ac13d4beb8f1a4eDcFC75A5", balance: _1e36Str }, + { privateKey: "0xe46f0aB26b6a79E8Ee0a3ECCFdda2e2bd6a1dc0Abc13BF0f125ADBB99B6ED32A", balance: _1e36Str }, + { privateKey: "0x87CdA8638e872804D4eced78A0F061B476d5d12Fd2b4AE0498d0a625061fC8C1", balance: _1e36Str }, + { privateKey: "0x8190a31fB8A00Ab8C8c1ff2E8b4995B131D6B8cdc6bCaEBd1eE8ABc4d988e0bD", balance: _1e36Str }, + { privateKey: "0x635eD420F5e71aa6c4b2Fb1a7B1C43aAefB6e62C444fBFb85Fa61B146Ac7aDB7", balance: _1e36Str }, + { privateKey: "0xDB5aD0baAff52ADEa9b0eAffEe2e5E6430266f400abACb8e4Fc4B01BcBB53990", balance: _1e36Str }, + { privateKey: "0x8c4Bacbb40c2CBC12F5C52ae374ACf9242f9FDdDA74DCc7D9BfF9E435ea4b4b7", balance: _1e36Str }, + { privateKey: "0xA5667ebaB8913048Fd49CE21450a36dFbBAD4b9fbDC8CDf7219c563aE2C776ED", balance: _1e36Str }, + { privateKey: "0xd520fB1BcFA43F3b3B89CA3D78fe7effC13Dafaa7B631eEE16645cfbEAcC1a3d", balance: _1e36Str }, + { privateKey: "0xBADb99bA75acA5B7cE4Ea6E043BCCFDCf12ba7eA682b11be6B8304608482ea9C", balance: _1e36Str }, + { privateKey: "0x82Fefd7771474C22cCb1eA0A7Af04e9Ab8a3C0Cf94788574D172dc42a2Bde8E7", balance: _1e36Str }, + { privateKey: "0x52DbF8e6265Fe0acDcc4AEF5f12dB5C6FfFFFAad3aC47CaaE352e9d4e0fd59cB", balance: _1e36Str }, + { privateKey: "0xFfF2BF6C2BdCb0f1880eB376AcFD8d57c4AB416D69eb018470cB5fD1B5DcEE21", balance: _1e36Str }, + { privateKey: "0xAFa217A623a8F47B9cbf81f0Dbaa0e938DE334BCE3dBEFBad6D53bAfB3Bc27C1", balance: _1e36Str }, + { privateKey: "0xb9044CafEabC51eAAa4B6db03DDAF1e1A09dd3ADDcBcBD10C51e01ce03E5B28A", balance: _1e36Str }, + { privateKey: "0xFCF41115B2E84db6f7adB20FDEF285e05faaFaD4C6E64AD64bb431e94C68d76E", balance: _1e36Str }, + { privateKey: "0xCAeE2E543bDD9CCa1CCae5Bb371BAd0CaEafBdd3C08eCC2139BeBaA056b8dA2b", balance: _1e36Str }, + { privateKey: "0x5aB04830e3fD0D84e75Fe0D4bCECEA18d0BEC3fEd3FAdCD89e4d3BE8ca0f1c58", balance: _1e36Str }, + { privateKey: "0x9b4A28b18DCDA7f49C461eBb9A642CFe4285C4cbBE3dbad87d1Ef46FF991aEA3", balance: _1e36Str }, + { privateKey: "0x47f924F4ffcbDb76551f4d851b5c22Bc6c5Ff7AEfb19F2f8cFEed3bDa0F8B881", balance: _1e36Str }, + { privateKey: "0x963Ecea4132D30Aa859b4fa2847b37fdE0aCDbdc341DbDbF3dD2878F97BDEe2a", balance: _1e36Str }, + { privateKey: "0xDd5d66Ba5eB9ed1D54E9A1aBAD9AD9CE95Ca370FA8c6fD3Eec3481fD09e96513", balance: _1e36Str }, + { privateKey: "0xC5bEDaAb03101Ac6ea191f8cfEAfd35B0A6EBe6e0dB2bC8eA00ddd5b13EC4784", balance: _1e36Str }, + { privateKey: "0xff80ABeA6bEF940c203cBA75eF32DAf3a86fBebF57DFAc7cfAACCc29aBa5F03f", balance: _1e36Str }, + { privateKey: "0x2b48c1bA532D2bcFe5cFCFD04FE71C3cAE556CfA0CB46EcffC9bE72C8dF3E089", balance: _1e36Str }, + { privateKey: "0xdC05D6BFEc3EDf1D90Af5F3C56CCeAEbcF24A1AcAEdd7F56eEeBAf623c0cBDe8", balance: _1e36Str }, + { privateKey: "0x8DcAd29a5bEB85DAfb47C2dAF47F6EC467cBd60Fc46c8DC9EfbceE704CdB4b7b", balance: _1e36Str }, + { privateKey: "0xDfCD2d0a0c958eEb0E037cCfaFCCc1Ac8F4eDb834a1db6312F8E794338ff96c8", balance: _1e36Str }, + { privateKey: "0xFccb7b5c7A4734BdA79cCAd1ff8F8C5edbCf63B1F847A60aAdF2beaE162D741e", balance: _1e36Str }, + { privateKey: "0x4A099adedeE538fF7EbBB17DCDEb7aE6E578146BB4eFF91CBe0cCB7eB095b3EB", balance: _1e36Str }, + { privateKey: "0x5FC7c6f0F5A9fbAaa8F7DeB8cCD67E8FdCb6f6eb63aB5A4D7a954FDF88EDdB2b", balance: _1e36Str }, + { privateKey: "0xc3cE2c20f7aBEe42a87745EC8fc95be7B2D54589f1C0c19BEa22A0D0A7Ad2504", balance: _1e36Str }, + { privateKey: "0xed7C97003b0bbaE84Dd3b18cE2767dBbcDC8d01D3ab325f6acE1eC005AEA1CCE", balance: _1e36Str }, + { privateKey: "0x14Ba7a5a5A55dC27808Bb5e3EbE6D033ef3d46E13e4EFE8cf3fa8ba8971C0EB7", balance: _1e36Str }, + { privateKey: "0xFbd091bed8a7Fae294a63Ea339f77719bB22aed86B1eF8CbeAf11d35FD254efE", balance: _1e36Str }, + { privateKey: "0x4AAa57f1fDdFbBdaB85bC49ffbDFb664Cb6F6Aa239A25fb1F3eCe6cDD9fA18Bb", balance: _1e36Str }, + { privateKey: "0xcDBa7abD7b2Ded9DFFaA432C110654EeA5d85De566Ec6285cEEa156fFd47EFFd", balance: _1e36Str }, + { privateKey: "0xD7081aa15efd8a6b9040F2B7f347fB9bb5521CD6cD2de3475A4ADD627BDB4E2f", balance: _1e36Str }, + { privateKey: "0xd6acF81d926f9EFfbEE61C25A3dE28Ff9bb9CCEc6956eA2BFBe12a3C1A7ECe90", balance: _1e36Str }, + { privateKey: "0x8449fA5BCAB9EE44EdE10b30073AAfb7a46a27c9C99Dc1C4D27b63Eb39e23A72", balance: _1e36Str }, + { privateKey: "0xFAac3fcfEDfDA7f8ef5012C8d1b99EC5E3b3aB99Bf6E2dE20dbDaca213F08F4c", balance: _1e36Str }, + { privateKey: "0xFdDD2EA9bfC0AC2aAc30a68680e3F10D3C25F43283B2e1DBcB3cCCa1efE5e5AD", balance: _1e36Str }, + { privateKey: "0xcAcA0A140194d9a9563918B67c5f5f53cBB90F913ECAebF9Cc1A5ba1659edAa0", balance: _1e36Str }, + { privateKey: "0x9eb24e1beEdBFF67f8676062aBff6f640C1BBEfD2AB9Ce6Dc508742c5de23dDF", balance: _1e36Str }, + { privateKey: "0xe3d702eBaF9578B71DfF4d11168626bAbe46a215062eff30dF23bc9CCf841A57", balance: _1e36Str }, + { privateKey: "0x64a67Fc14B6c40a8f3EdAf3C9B08a9bbd1FFBBd1e393FC0109C4AacFc6c48d2d", balance: _1e36Str }, + { privateKey: "0xD26a8FBB7cc0AF46c4dCCCc637b1274e98F8B4AF07a7640D5c2bB2EaCFaD3ca9", balance: _1e36Str }, + { privateKey: "0x9f8eB70DC7bDB7CfEe53cADEAE405CDA3830Ade584f7B079Bd86cacB33dcd493", balance: _1e36Str }, + { privateKey: "0xfCeF8fFB7bf3f7475c50bCcFDbfb34C50dC9C854e2eAfb886Bd8d6Be2E1B3D70", balance: _1e36Str }, + { privateKey: "0xB2070bfBb3fcb7778787247a2Ef4cc6e3B8E60d05ad4c0dAB0a7Ef4D770e476f", balance: _1e36Str }, + { privateKey: "0xC3B58E2D70cD6D2ABbA9fcA671e1E9C1Fac82C7Bc87D264f698D98aEAdCaBeB4", balance: _1e36Str }, + { privateKey: "0xad428589f9067Bcf33997fa626b2E4eBF1fe6F39cAc1CB77DcC553abdcb3f304", balance: _1e36Str }, + { privateKey: "0x850eC6b80228Fb19dB5DDA1A5D0bbbc1AeF86AE74FE1D5FeD097CaF1F580FcE9", balance: _1e36Str }, + { privateKey: "0xF11Aab831B47EadA7e9212d4caB8C4c2403Cbf28C689E0a90ba7F9C7BE00ceEd", balance: _1e36Str }, + { privateKey: "0x2cF1B7e0BcE571E6ec22eeE45C5087aFa262d2FA18dC74E6f6ecdbB3Af3CB4DC", balance: _1e36Str }, + { privateKey: "0xe5bBfA78FdB7B55EE4CC7bC9629ceA8Ff2919fd562BaDa69fAA42e8CD6EE04AB", balance: _1e36Str }, + { privateKey: "0x83DF2cbCfc90dC6293A8c81E05c9d5CAa93F5cEBdEEa1FF026f7cdcaEEB3C2DB", balance: _1e36Str }, + { privateKey: "0xd6BaA18Ecc09356bdbC66d12CEA18630aA7AcAE7E5CA03f6986240D4a9ea94E8", balance: _1e36Str }, + { privateKey: "0x611fD2925b5246E2EDaaeD5C8bfea3fAc95CbFc3dEcAeF48BA04ad477609dbAa", balance: _1e36Str }, + { privateKey: "0xc38A74dc73047221A6Cd5ca6Baa776BEffd02EadEaD0Ce4fFcfcfDBa037fc08b", balance: _1e36Str }, + { privateKey: "0xA1afFCA7CF953E9baaf82cadCAf4318a3fAB4bcFF78Ab5B53C8970acf2259Ba1", balance: _1e36Str }, + { privateKey: "0x7ebf90FefdCcEEbceaEa39BcC5bab05283467DE48f2Edcd6777D69712C8525Ae", balance: _1e36Str }, + { privateKey: "0xf82bad12E793F8EFc5FDaCcEA8Ef76C3Fa2fCB0b493eE4dde43ab101eBC41294", balance: _1e36Str }, + { privateKey: "0x5Bbb8de04c2f11AaFBFca6bed7b9075d1896C7bF2c17bBA8a0cB192099D33cf4", balance: _1e36Str }, + { privateKey: "0xb6fe94F20d09AFED3bBad24A99daCcfb7E4D8edfBA1B24ED161Ce8B37a185CCc", balance: _1e36Str }, + { privateKey: "0xFEdB8adf2b0D6FC96bbD27c1f7d5EDcDaa8BDe8a13BEBda29eA7ad368fe0d876", balance: _1e36Str }, + { privateKey: "0xCc10FD27Efcad40AAF99a2c2Be7F6cCcAe236dfCbF460E95dFdB6b558A9C76af", balance: _1e36Str }, + { privateKey: "0x1dBA5Eb675BcCc6DFa31b9F85de06C45Bac6C4d70D6e348b3cA2c1f4F70ab3a3", balance: _1e36Str }, + { privateKey: "0xCD8604ec8dCb4b7335b7d6bD11f2AaD72E571B22cA9C5e0F411c3fB4098bf5d0", balance: _1e36Str }, + { privateKey: "0x657E6ddeCc81fe6A799CD4DD8dEf804cAaD2Daddf65fc2AB8ccb8D6D9CADba0A", balance: _1e36Str }, + { privateKey: "0x5B2A1dC96ad0D07eD9555A8d127D203dB228b0e85ccb0EeeCE059D6D3550A2ff", balance: _1e36Str }, + { privateKey: "0xf0Cc97904e51F669F798cEf0bAFB6F5f6fe9018aF31Cb4624dC59DEf9DBb35F3", balance: _1e36Str }, + { privateKey: "0xcB5cCAEC7aEf26f4A7aFD606FacAbB0564F395B1BB5F3D515bF47a4E2BFA340A", balance: _1e36Str }, + { privateKey: "0x6Cf17C2AFa8466145995Dabd3ACbd4DC3BcDC8EB4Ebb54dfBddA00E1CB43CB97", balance: _1e36Str }, + { privateKey: "0xD1ba29caA17aE0a3E2dFF5Bad21bBeeCAC5729D72F1cB8ac3a387FDB713d5f4b", balance: _1e36Str }, + { privateKey: "0x435C5A1b8EEf03AB76153f15BEbC3A4858dD4C9f51F4BE655AAEB872ffbbD5C0", balance: _1e36Str }, + { privateKey: "0xBBC4AEC42F4fB5775249Fee3C2a964AaBcC54aA61DE01febf8DD2b2Ca11Fa7B5", balance: _1e36Str }, + { privateKey: "0xEc45f87EAF8F4D86Ea9A1a7D54eeaeb7cEe0cc56110A68FF0fF2f9e09D2e7A87", balance: _1e36Str }, + { privateKey: "0x64ED2D99b7E3ad5aF62eB9e9eA130020128a1E84EcdFaC8BEb06fFbadE8ded0c", balance: _1e36Str }, + { privateKey: "0xCad9aE5EaA22592ddbb2e9d1D14f07725Adde4FC4FDCbEd5CAB9C33C0aa5efdb", balance: _1e36Str }, + { privateKey: "0xdb6A58229C79FcbBD64b0C1c79047d18b93843dEA35Faa402deb6BAFd7A0CBcD", balance: _1e36Str }, + { privateKey: "0xB10D5E2F08ab9ab1Ef75bD944C8fF356BbbC9A121aCa16a4aBc5f9a3d3D52909", balance: _1e36Str }, + { privateKey: "0x3c3481A9D16AAC4a1FC9De1c45DCB8fc4B3ee1E2dF731486f0F31c7c23de20fF", balance: _1e36Str }, + { privateKey: "0xFeCFBed08A8B84B0F7F224CBd9c9B58b7e52395aeAbfFdedD5709B3b3a2619E4", balance: _1e36Str }, + { privateKey: "0xb592011e9eDe1b7Ca0Ef45A4C2AeBCb365Eb9f0a012Dafa7E7825Aa0fe6e6B5A", balance: _1e36Str }, + { privateKey: "0x9762dA0CF7399bC503D6DDcbba08fd165ffACEDcD825B64E5D73C970Ac0FAd14", balance: _1e36Str }, + { privateKey: "0xC5a7D3d0bcAab84D4935CD69Dd30DfcAAA4cE89D17DE3aE83fbd725D1D46F0cf", balance: _1e36Str }, + { privateKey: "0xD3E7eCE08EaDD3c9eaeB8098A4ed80bEB551C85B1FD6350cDdFEbfBDd71Ffc64", balance: _1e36Str }, + { privateKey: "0x49bdBfBeD3808A80E0bc608333E24ED90AB63131eEa52aBF31308Cb0789c384d", balance: _1e36Str }, + { privateKey: "0xEfad8cF9cD30f81B95AB92ffabbEF58cdc8f07cDAA09a1e446acfc22aF1bCD8E", balance: _1e36Str }, + { privateKey: "0xaF1162EDeDa11eDb8Bd14b4bB084C5cf29B0dE6e5a67ccdC1bF3aab08Cf53d2f", balance: _1e36Str }, + { privateKey: "0x6ac0FcC65dFc5d52efcEbEBFcDfFbd16A3e805C4aB398Cefc9fFF497D73317fa", balance: _1e36Str }, + { privateKey: "0x43dbbeF32fcaBfCdE5f01e0E53C478D8BA770AbD199A43f3BE50fD150bFfcE9C", balance: _1e36Str }, + { privateKey: "0x9A19fbC8BfFdCbe3a36BE081BFdDECd1a29A570F6ca52B98D0A0f1A808ABf583", balance: _1e36Str }, + { privateKey: "0xD12caCec99Bcc7EEe2f62eCaf69EFfEEa832fb1992A9aC6Af615c3EfBF0e50DF", balance: _1e36Str }, + { privateKey: "0x49A1DA6BD96Ec139BEED48d7Ba5e7B90eA609DBf0eEe8D72D6b747EB1428A507", balance: _1e36Str }, + { privateKey: "0x8Abb9B51AeeDd2AEd69aA0Ba679e0d96aF4FD32F1F21F6F5Fd9fEdB1B9382b1E", balance: _1e36Str }, + { privateKey: "0x2CEBBAf8F2Bd3E8A2bf3eA8AF4bf473aAaf0F6e0Ce7becCeeA93BaEADA7ac3a0", balance: _1e36Str }, + { privateKey: "0x795EEC06f8aE4D5a55c4Bf6C19caa9D239Df95742732Ce8d9f5B2f6EfEB1F6d1", balance: _1e36Str }, + { privateKey: "0xefD2986dE8ccDbd9a688fEA655eEEaEACee4be19Fc3DA64A5CbF06BeAFcfFddd", balance: _1e36Str }, + { privateKey: "0xf95CBDaF9ECd36cf2878B87Ac4a5aF13CCdB33e8EcC98ECD5De1fA3aBc8DB8eF", balance: _1e36Str }, + { privateKey: "0x3EbfaE1ea115E171df9A3E84BFfA86deC2e39FAcEbDdbaFAaDDED6DC34BB849f", balance: _1e36Str }, + { privateKey: "0xdAeDf41eBB84ab2850d940FF0A6aeBBcf52a11CC1efb491EA7CE043f0Fb6468e", balance: _1e36Str }, + { privateKey: "0x2AfE2FCcdA9EEEBF48B92cadbb8Ec190DB0d2D70A4aAe02bC42D02d76F525474", balance: _1e36Str }, + { privateKey: "0xd5E3baa0d22e848C63026DdE3eF4ef4214A5B8EBDcDeB463aEcEeC8Cd6e1EA6b", balance: _1e36Str }, + { privateKey: "0x15d5Ae1F55bCaf06Bc92dc88E26b0f3Fd0b62fDf0A966144F9a024EE3744C6Be", balance: _1e36Str }, + { privateKey: "0x478ff7B3BD12ECCa3b5FadfBC1A88AD63c5cAeC92CcEcc5ADc28CDD258c78a0E", balance: _1e36Str }, + { privateKey: "0xcB87C8399c122D6EA4a67bDE729bfE8c7Fb3a6EAF56ccFEfbeC51E60736Ae4FE", balance: _1e36Str }, + { privateKey: "0x83e11dCCA8fC676A1D8Aba5DB1E59CDD5136C59EABF1E91A7AFf9cFd0e4Db1af", balance: _1e36Str }, + { privateKey: "0xE49eA2Cfb1EF0fab3be76c57EBD21C3b01eE6dfE575d6FdD3acD76fbfEdbCe83", balance: _1e36Str }, + { privateKey: "0x258f98880CE7fd13cbEAf3BF2f36840Dbb1d6A5ddA9e4C253aFccE1eB45Ff8d1", balance: _1e36Str }, + { privateKey: "0x47fF1870B6ed45a62bac0FC5cCF8Ad5F7f4eFa6cFdF4b79dc94b91BE8BbaB56c", balance: _1e36Str }, + { privateKey: "0xFE7496cc29dd0Db3867FF3c19a75bEfc97Ab578Be69F45deE928c3eCeA5f32ff", balance: _1e36Str }, + { privateKey: "0x05BCa0C18c095cA829986BfAf120bff5C6978dCfCd9B2231cA9ccc4299B54ED5", balance: _1e36Str }, + { privateKey: "0xeFcB5aA2EfB49368d2Ee95D5Ffb811d15B11C2BbFAEFcdE43bc5816A736F8f70", balance: _1e36Str }, + { privateKey: "0x32Fd03F3f9870EbFA088fC6A9a14D1d7959Ce42E2c63eCA406C6D2fcA3A5844f", balance: _1e36Str }, + { privateKey: "0xC5a1713dcDfB199DF2b0D1ECEf7A7E423cC118577d5Acf79B6455436b225E675", balance: _1e36Str }, + { privateKey: "0xF5423CBDba6C5682Eb6C9d54ba74E7bcaF0fC083a5Dc7CAbAa1ADE1fb35ABC4B", balance: _1e36Str }, + { privateKey: "0xFC5BEaDAC25fb74Da1BC119307F7F3BD6de38D9964f79Ae2670adD00531A50Bc", balance: _1e36Str }, + { privateKey: "0x6212Fb393D8ca8eDFcaaeDd7BDeC90eD473eDDCBc7811aB8DB5feeEe05d6A4C4", balance: _1e36Str }, + { privateKey: "0xFe1EF9ca7f6Ddd0E264AcB5E0aaEaAa7199FCfCdA04a03B40EcAae617aEa35Df", balance: _1e36Str }, + { privateKey: "0x9A30a36dDDD76bf1ed2A3ab65c0E639c1D0be746AE57f3c3BB566c936240A4f5", balance: _1e36Str }, + { privateKey: "0x3e4Ca98E9d9DDd2dc1fa1C00fe6A7DB4896dfC38cAFb24AC1Ac9D0f4eacc5DE5", balance: _1e36Str }, + { privateKey: "0xe472e52e3b8C49ACAA8ADceA94Ddd0EFbf1fB9f34DDe6aFC2D18687a35769AEA", balance: _1e36Str }, + { privateKey: "0x4F3Ec07DA07531ebC1aEA66c3aB9e3AC93FEFd0dA4aDA24Cf8f5Fa4EA61f0c75", balance: _1e36Str }, + { privateKey: "0x4cb1BDfEF472aB068b9AeDfF08D4d76DDc163cB844d203EB31800FD8a0a3e1c2", balance: _1e36Str }, + { privateKey: "0x8EdDe0dB5aCbcC0b16b10d28a537A5f2ae2d2aEc30b377a3e10FdaEF541A2cab", balance: _1e36Str }, + { privateKey: "0xAe7Ec8A6B02da3123f90Ca1bd5407bdefcd80358003edBDa59f5D4E4C1fab7C1", balance: _1e36Str }, + { privateKey: "0x65837A9aAF3AABC6ff079EbcB0a4D90C17e2abdbe1e895b6Ec095B3CeCF0aBb2", balance: _1e36Str }, + { privateKey: "0xaCB3182e9001d05A6D0F9fdf9E886B30Abe5053da7Ee1d1CEAcA45fc1Fcc6a2B", balance: _1e36Str }, + { privateKey: "0xbD59fac8caEA261b406f0C4E978dCFa8945f5063154F2fFaf785a2b76BDaD7cc", balance: _1e36Str }, + { privateKey: "0xb5CB81BFCA9524F7aeefE1dB26cF06c75A39eDbbBe77acAbb5a11BCBbAC05bb8", balance: _1e36Str }, + { privateKey: "0xe9c7218B4c26179e47aB408Cf31DE7265Ad47C9A6157b8cB9E1e6e015C4EfbAC", balance: _1e36Str }, + { privateKey: "0x3B94B4a82BaF0dCbfedAA5d6Ea1F5c00e3e30F08A3a4FD4405EE31A203F63Cef", balance: _1e36Str }, + { privateKey: "0x0877570EF12BfCe3e43dE6841156AF603Bc3238085E7AEa27F443aB7793bEa0c", balance: _1e36Str }, + { privateKey: "0x41a0D98aC57bEa4b4F8d0EF16bd0e5E26AE6BDB4cef6149F332EFFFa6057BD55", balance: _1e36Str }, + { privateKey: "0x893E406840AcBb079Bd5cbBA973EcecBAC8dfcd9F57B372b908c7a17c441122C", balance: _1e36Str }, + { privateKey: "0xCb7731B1c0fC8B7d06bF573551b9BaDE1dAb5Cb76A3B7fa8bfDEFA529F40Ec9C", balance: _1e36Str }, + { privateKey: "0x9C0C42bFd3FD592b962EfffaFaAdC3AEF09556eD44FBAA15224dE3ec15aD9fFb", balance: _1e36Str }, + { privateKey: "0x986392Dd0e725B8F5bE34921E84Ef8aeB0F7c0791CaFE90AB6d1A0ad7132AC77", balance: _1e36Str }, + { privateKey: "0xB95534c77C91Ea284eEdDeABD6e7c680d8ac1Ec9fc4CBB1f0b5BFB4aAF49f6EC", balance: _1e36Str }, + { privateKey: "0xAd5cdA003FDaCafE2D7ADdC28Db2b5EC91b03B408Ca4c45C7aEa7FC997B441Cb", balance: _1e36Str }, + { privateKey: "0xb07a16C47e76E03cA1E86B8f6aDC7e243493aa0c4dBbe5A4eA8B4DA9BEE3b3Af", balance: _1e36Str }, + { privateKey: "0xce08FB939816bCc6AB3BdBbC4E6c85AB6BAF5d566C11Eb12e10a4B47F55Cff0C", balance: _1e36Str }, + { privateKey: "0xbbf6228282958282Dc3Ea6CC9CF13EBA5f7974FF87e9501Bb7d1caDDB2E6FaB7", balance: _1e36Str }, + { privateKey: "0xBCa581EeDF4b90c92eDcc7676873093A3Ef8b7637b7c8D235Ef6eCEECCbAe36B", balance: _1e36Str }, + { privateKey: "0xAC4d6169d5e8Bba76A9BDfBB9F7eca5A51e6EfAe73Ac1Cb9Fb8aADd0F5EAFB47", balance: _1e36Str }, + { privateKey: "0x0Eeb6fbe7f9fEb67869CB9F3f033dACc808FDbF6E3Ffd33d19c19667c0aF624a", balance: _1e36Str }, + { privateKey: "0x07ce1543A9CcaC3aB71cEe48239aB5B0d21DfD90cBdADb7faF3a5bd9dD95CbB4", balance: _1e36Str }, + { privateKey: "0x02C285e99FCda44a2D02A5046446df65D7Cf50bf7AA01e248efcBE3F7672Bf3D", balance: _1e36Str }, + { privateKey: "0x8e831AECB96F17A87C21E9DdbfAed0cF2eb9d45E23aE70721ac9Ed2Ed38AdE62", balance: _1e36Str }, + { privateKey: "0xdcCDB023Fe26BBcaBbea9980eC04ca1D0A5de539eB6Fd0dCC8cE3ccdc96f3Ea2", balance: _1e36Str }, + { privateKey: "0xaccB5B6fF0c05FCb2DB1da059b1f44eCE8aaaDa0FB8a42d5F8a1bde8f97A8Cf7", balance: _1e36Str }, + { privateKey: "0xE5c69bDEDa3dCf2dcf690cAC861D5C136E781cAdF921a6Cd7425f9A2a8FCcDc3", balance: _1e36Str }, + { privateKey: "0xB00b9f98bE2DaCEC5137e479Be444eFEF6CcDb7788cCe03D0bCB7E1db2dEC5FA", balance: _1e36Str }, + { privateKey: "0xAAe8DEC8Dd2F95B09aC30ecbCCCe4f9bC14424Ee713Ef2eDA7dADCc8AcBFd8aD", balance: _1e36Str }, + { privateKey: "0xdaEEDAeADa4cbe12CbD3Fe331aA71EAD1aDA1bF60EB498001A83D9ae40Bbccd1", balance: _1e36Str }, + { privateKey: "0xD5B92f9062c0941EBdDA48a12a0B78d9De536fCa3EdD06dcD9ADF0dbBc0A7c18", balance: _1e36Str }, + { privateKey: "0xedfeA04C47f477C3F9Dad3Fe2eB689aDDcDa49CC0fbBCE7c294AECD2D55B2787", balance: _1e36Str }, + { privateKey: "0xb4adE8deC014C6ca5f2De7D26BAaFDf23F22e12DD181439a481Fdcbe7CB7cED1", balance: _1e36Str }, + { privateKey: "0x04a3B0ec8Bd5C56dc2eF79fAECcCC7bCf4B099fAd24c3dEd76dca4ADba4C5E7D", balance: _1e36Str }, + { privateKey: "0x95BBD7e609a2E84D1DaDbEca85eBc2dDf4aD9a5f0F531C0acF73DFf70Cf4Dcaa", balance: _1e36Str }, + { privateKey: "0x2CCfa05787c5eECf3C0FD38F21B7A705d21FB2b87aE58B0065beE0Aa5d7D7ceC", balance: _1e36Str }, + { privateKey: "0x8AFeC65cD4fA2EAECf91Ac6942164d82f5D8C0dD4fAe5Ea4f3236C6E8f9fdFFb", balance: _1e36Str }, + { privateKey: "0xDD72dd73A6Fe4BafcC11baD8D1eeA3f1FE3A5ED28faD1f9aDdD263359E56CdFA", balance: _1e36Str }, + { privateKey: "0xcF4Ff1793f17A37FCEB5e2A3C01CE1880aAb76d10ED0CBefcFe8C013bba17f0A", balance: _1e36Str }, + { privateKey: "0xB15F1B0880Cb1D1d0F03dB319CcA5Efa464A75CDF1cD0858de5BA9d5Ae528E65", balance: _1e36Str }, + { privateKey: "0xdCD5Ff3C4bFBF02a8781eCeaFfabAfbF7d33d53FEa6c94B0A2A058E00E28f1CC", balance: _1e36Str }, + { privateKey: "0x9aeB8f7D488E4d1DE1c9AdC1BaceCbBd5853aa5fEcBaCfDdb7AbD7b4FaE8e0D8", balance: _1e36Str }, + { privateKey: "0xB1b1522Ee790AC7dCEEbF06020d07dC9233CBBEbCb5B2cf55Fc4D6cdA15eAFb9", balance: _1e36Str }, + { privateKey: "0xcadaA8420fefC1cd9409CdcF3F07a1147bc49E1baCc4A114ce7EBdf62dc2b22D", balance: _1e36Str }, + { privateKey: "0x9D5d734fC5dbea297e952bB52B3dd09a2B9bCec5De7dDEeffF57B18dD14EF9C2", balance: _1e36Str }, + { privateKey: "0xcc0ABa7Ecc3a3557F80fD71Ad0aba8bd8147ED3a6dF0d8EfA74b818fdb5A1dF3", balance: _1e36Str }, + { privateKey: "0xF56eeC80cd7aAD2F58FdaEb3ADdcfec9295bCA17cd6d31E162f1A3bfcf0fD8af", balance: _1e36Str }, + { privateKey: "0xF0abc72a065D7aA67eceF7f6be74B38BFDaEd6dCa2a9F8FCac5Ec4567E0fe8E9", balance: _1e36Str }, + { privateKey: "0xbaECfa197dfC3Ed3F507BAc6e9B60F2b045bbf94aF61b6C8c0e937F8B20c48b3", balance: _1e36Str }, + { privateKey: "0xcd3F20e8d55BadB3a38C0dBBA812E87FF18981741B978FA36bB0acd1D36ACdf7", balance: _1e36Str }, + { privateKey: "0xbfbAAa795EE4DD7cf93095D93AfeA278BcA8FA71196324eae5bC6Dc1B7eca2D7", balance: _1e36Str }, + { privateKey: "0xDe0bAA1befbcBBB6a7575CCCed1C1dda51021A7e2ad9Cf4a8430eBb8F4A9e2f5", balance: _1e36Str }, + { privateKey: "0xaDfd1e2bD9Cd1c8a7ff77a251d4BEe9Dd895FcC44dA8Cf5fEC38ad589dDA318F", balance: _1e36Str }, + { privateKey: "0x4a8C6FAf6d67BDbb8cfE7dc5Faa0B1c55E7beB74ac1dd785AcB2b9e8Ae4C5F4d", balance: _1e36Str }, + { privateKey: "0x02FF2d674e85Fcdc31eC5CECc6aD50dF954BF80c1b0B9bbC7B5a5FabAD5c837A", balance: _1e36Str }, + { privateKey: "0x6E8c73bfF20abea2abDaEA799CeB862Cd9eb594b50f7FFc905eDdeceAAB916bA", balance: _1e36Str }, + { privateKey: "0xa6Da0E05705Dfc0d1EBF8bDf2149d89FfE2fec452dBae23DF1a5CE2Cb5ffBcC2", balance: _1e36Str }, + { privateKey: "0xf70dDfA9F3FF9Ba1b1BfAa5bEef5CBDDFD05faCFe4EDaD64AFADDeeC0d2Cb13E", balance: _1e36Str }, + { privateKey: "0xCDCDAeD1Fefb7cbdb1dFbA7375258ae6Ade1cB66AeE7Aab49CAaCbae8eBC1caa", balance: _1e36Str }, + { privateKey: "0x6d3Ba7d4495dC23852C14941fe2eD15EDebb7B013eE29aF3dAeAf8C10854d67c", balance: _1e36Str }, + { privateKey: "0x5eD030C7F63b247cC3E7AEeadFB2cd93A434fB4Febb8faCaFAC17d73c6d80Bba", balance: _1e36Str }, + { privateKey: "0xBE03c9dEC5Dd1D7DcDCdCe02DCc79F4fE2b6BAbea89AE2729bCbEdbE648eC3BE", balance: _1e36Str }, + { privateKey: "0xdE54EAD54a435e2AEf033343e6D71424E5F1df7c571EA25DfC8E19bdbC363E8B", balance: _1e36Str }, + { privateKey: "0x9deFf90bdd96f62FCDCF7bef37AF6fB6a7CF8FDa83e2096dDEF49fA9aD2DaF0F", balance: _1e36Str }, + { privateKey: "0xEfEFfcbd049C5fecE4fdd34DaDdfbbbcFBc1ce0AbeB75a1Bee0a3aa4B5F375B2", balance: _1e36Str }, + { privateKey: "0xeB2C63C51E32eF0CCEe5d8De127F8BcFfFCC74c7b28b1338e7E3C633dd9E75D4", balance: _1e36Str }, + { privateKey: "0xeb36CbD33eCdFFE59c88ECED1b05cae5e4a9E2a57bcBC0EEA613C9c1baFA3B57", balance: _1e36Str }, + { privateKey: "0xb437861fa0135F7498ffEE196d4a17dB7578f123C9349B6F23e7aAce7ADE2B77", balance: _1e36Str }, + { privateKey: "0x539eAbDBe82Bc3B760C26bEff3EDBFc8e3Ad5c7ee7A0E25d4873DDAbDBcE57CE", balance: _1e36Str }, + { privateKey: "0x0D5DbCe654fbaBD22A33F6d9D4EEAB7D38AD3a393c5d4466b85FC44bcaad9aFf", balance: _1e36Str }, + { privateKey: "0x5efAD6CA153953AC6B7A9bD70Bfd64807cada5AF28B1a3ef3c4ae0fb857Cd2A8", balance: _1e36Str }, + { privateKey: "0x57E34a08A8D8c15e78A0fAA49ee2b64b8EF2cF214d7E4d29cFd1B0AffE15EAB7", balance: _1e36Str }, + { privateKey: "0xF96A3aBff0D46072F5FF5d7bcE87CB6c5baF6FA918bDFe2c62E0Db63C32E2Fb3", balance: _1e36Str }, + { privateKey: "0xDc23ca3aD420eC99fb86BFcDbfcCdEDa1Ef5dFaBb3cd916575DA3faD2E9fC941", balance: _1e36Str }, + { privateKey: "0xfFB7fcac543143FAaDF51459F6CFFC004DFE2eaDAcBBd3BceE9b0D96Bfb3599a", balance: _1e36Str }, + { privateKey: "0xdEBAD6ee9C62e5b3ACc1804cE1B0c476c9DBFA8fBB5ADAab0BCA53cfD7b3DAf5", balance: _1e36Str }, + { privateKey: "0xdAdC3E0cf4e1D0c4C7fFf2DFDC1F2EFEFADE72FDd1cBB5bB8DDE910C3Addde7a", balance: _1e36Str }, + { privateKey: "0x2a1ced6C6eef98E64cA4a6Fb9CBcAB6CD8aCfc3Ff4bAceF7D13cC49bFb0B5291", balance: _1e36Str }, + { privateKey: "0x11A92Ae865ebb683DedEF8a3F1Dc36E6cCa7ab65c01C14Aa90bAEfb0e44CbCE4", balance: _1e36Str }, + { privateKey: "0xe93cEac824115De4aa7F296De256B9f59D6387E816cf13AFBEa4fFD3F7DdD4DD", balance: _1e36Str }, + { privateKey: "0x00c420fABc31AFaffF56AE2D7f61f4c084b4dd82b0b4Ce6C738Fe55AEF2c7cD0", balance: _1e36Str }, + { privateKey: "0x2eDfD942fd8EabCD4Cb1AD2Af7da6F9A6d0Dc9ECE75e96045e0C80Cca2Afd93C", balance: _1e36Str }, + { privateKey: "0xad6D8e38f5D7b3672E5ec44d58b2cEfEF892Cf9acfCdbC4Ca5a302aEC9B027E2", balance: _1e36Str }, + { privateKey: "0x96FEa8BA8c087eebd9EeAdDfaDFd7fA8b9FDe16CafBeE2bf1AcD8b0FfD4aEA0B", balance: _1e36Str }, + { privateKey: "0xB28c67Bde7B82fb2c2fcB2e7FBbdCa2cDef4F76cf7A3Ac68FDecFCcC40350eaA", balance: _1e36Str }, + { privateKey: "0x343Fc9C1A8aD6D8b555Ab2bf64B53ccae49e32A6b3c2ef18ed1123C206763e65", balance: _1e36Str }, + { privateKey: "0xE4DB4E5CDd91a7c867fCa7a6bB8BFc556D50182855a26dEae386AcE1D198eC54", balance: _1e36Str }, + { privateKey: "0x8F6bB7Bf8d1c4969Ce5cC5Cd9cdeCef276E0dEbCb05FaD2aacD433Dc0BA82faA", balance: _1e36Str }, + { privateKey: "0xCdEbcB927AA80A7D15FebbE4BE72F4bDEc03Bb99aDfDb01217F4d1bB74EAF1a3", balance: _1e36Str }, + { privateKey: "0xebfdBee6a8448Ebf99C9DAdb631f1C3ba1AdeE0B225011ae7f1A1FBbc8BfA716", balance: _1e36Str }, + { privateKey: "0xFEeBC77DDB2b2babB5bf43F5CFECedaBbe8d0ffE63C7346FbF7bd17dbDF1aaC1", balance: _1e36Str }, + { privateKey: "0x71bca70Fedfe8eDBC2b96Cdc94FBC2FaFFF5Ba576C9B99205e6458b1Ca41F862", balance: _1e36Str }, + { privateKey: "0xA3ac00EB9ce8854C5FDDf4C8Dc7E28eEfad1e6dEFBe3a6eFA48dc16EE5dD5fb5", balance: _1e36Str }, + { privateKey: "0xdF4dd17A0495c7bFEadcd9EbA921D8EE9c77e00fbea58d4Bd743D654aAbd8f11", balance: _1e36Str }, + { privateKey: "0xDdEb8Afd1D22C3C8ef1d23004Ab61DFeF02ca9A1EEa3EBbc7625F80EF1ab800e", balance: _1e36Str }, + { privateKey: "0xBd88E1185e4e686c784d0964E7df0dcd2cE4CfDcE7c3b851C69bCCdcC64e3FEd", balance: _1e36Str }, + { privateKey: "0x64bC5Ec226b999f43e18E3BBe2d629A2E57ABf01Fe50Bfd7e21046CFFAeCba7B", balance: _1e36Str }, + { privateKey: "0xb80167d4E6E38e14FCbE823b5cFfC57ef6Ab22ECa4Af5DA1fecea4EA39c7569e", balance: _1e36Str }, + { privateKey: "0xaD0Ca081Cf3A78dC3dBbDEf04341aFdE11AbfEdAe8Caa5D2adFde545F0B9ec68", balance: _1e36Str }, + { privateKey: "0x78aadbFBE6C525Ac0B99F4aa8F06D6bd2f6f0aE93F57eee5b8Af09eae79862fa", balance: _1e36Str }, + { privateKey: "0x05AEdbaC579afa7C0BDEEBd34bD65eB3640A8BCBDDC97Bd706d2aD42F803cdF9", balance: _1e36Str }, + { privateKey: "0x88cF1e9c4c619d195b150d86Cdb8752fe4DDC6F8732fAEAA3f4CaE0Bb11c26Ed", balance: _1e36Str }, + { privateKey: "0x113ADA271d7BcE3D2AaF5A8B4CDc5AA4e0be4B5Ca5Bfd5cf40ebaff12ffe2e0a", balance: _1e36Str }, + { privateKey: "0x335f1B38C6bb4AC7C4cD0C64C4dcA1808f42AF1aBbf7b86383bfe7C4609DA27f", balance: _1e36Str }, + { privateKey: "0xD4238FffcccA74e77Bd0Cbf3B9C718db7eEFbE4ce56B6698F9e6b74Da2701AaB", balance: _1e36Str }, + { privateKey: "0x240f0F7a8Ccf2E1aa4dFA7eFe5eeEEC636bB5d93DCc0278EdDF3f736Ebf8EE13", balance: _1e36Str }, + { privateKey: "0xc3922E04120951CEE7aA3DFcEF4bad5064AA339ADD8fbC0e0Ff6812Ec10Be177", balance: _1e36Str }, + { privateKey: "0xC3be7ff5A102F9810D9C56FcdceF5a4a852bAFe2A102462dCa91A0e9554e2E6c", balance: _1e36Str }, + { privateKey: "0xEcCD90CedFa47a78B40b0D1BcE7eDDEcDAeb0C8b77bB7d6A575d2E5aE5afFEa6", balance: _1e36Str }, + { privateKey: "0xFb3FaE50f3018B8FFa336fd4D6ab4D5BaEc88Af478f172F05fd3f42B2B8Dc663", balance: _1e36Str }, + { privateKey: "0x4E7BCbDdABBE87d7DFA4FE6Adf7aafC5F4c1B1deD1Cae0C09eA76cEE280F8859", balance: _1e36Str }, + { privateKey: "0xB91cE6FD3aC86aaed37810cCBff6e268fD9abAADC03ac75aC8eBD9CF3BEBfFb8", balance: _1e36Str }, + { privateKey: "0x0bBb2F39F6809Db4abdb90FFA2A8D4DcB3cbadd4368D6f50aC0cBa4dc345cBf0", balance: _1e36Str }, + { privateKey: "0x1A67B8E0961a9E93a8df461Dafe5EE29AF54ecb3c86442fF25642EF6B2CfC27d", balance: _1e36Str }, + { privateKey: "0x4a4e011fCD1bfDaA5f4fF3f4c97A21fB2916E0AB76AaBbe78e3f08c31A6EcE25", balance: _1e36Str }, + { privateKey: "0x300aeD3121CCE58ef47aFd9aD0C83Cbd0cDe99D3cDa6dcAa76ee5fADbba25Cb2", balance: _1e36Str }, + { privateKey: "0x290F9763C01bBeCbe14F7c96F31e8D0aaD0ee9CeF04Ea3Cc8463eAf6A7c2afF6", balance: _1e36Str }, + { privateKey: "0x4c2E96D6b4C97a1d9AB3Bc0CaedB1fb025B1Bb86cAef39221DDEFD7CbddD37Ac", balance: _1e36Str }, + { privateKey: "0x61ccEc2cD7c8F8E4eA1aa98Fe620C623A0175e7da8CA627cF49fCd0f9Cb8fEcE", balance: _1e36Str }, + { privateKey: "0x0940CbE7feFd431DfFC1A03cDFDc331efDF06DFeDD62A65C1E313eaD39f9e9A0", balance: _1e36Str }, + { privateKey: "0x2b85eCE8bEDaB2db9a60916eeaB4a0Eb746ee904d01f86cCfAE4FF46e7CBc0CF", balance: _1e36Str }, + { privateKey: "0xaEe4Ad6Cb3aF6ad600ebf0a4dafED8F7d42E708bA72A3cAAAD144cBeB23bEE41", balance: _1e36Str }, + { privateKey: "0xe3aCDdbD9E8679F021EfaEc4F9BB83BA7c59fd8cFDf98b5AEbF1cA5DCA7E979a", balance: _1e36Str }, + { privateKey: "0xedbb75AB5D1346A57C89cbD6eFF2dCA0CBd8E543FA3EaaDB403b2b53ac5bAB86", balance: _1e36Str }, + { privateKey: "0xCf4b1BaACdae3F64774BA0aa1A1be28FFFe80B5cF1deE8BC0B4264FbaB71B57e", balance: _1e36Str }, + { privateKey: "0xB01C5fefA5c19aE1B80322B0eD0B9719dB6dbc4E1aC1BdE42CAD0AaD5BEfd236", balance: _1e36Str }, + { privateKey: "0xbbFa04eD7c73D4a1b4b42Ac3D9AB4e6cC28266b7943821Dfdde394D91a80Def2", balance: _1e36Str }, + { privateKey: "0xeD031535D10eACb029D5Bf62BACEb52Ca1AB5db3d5bf1142d6Bfa3CeaceB0fDa", balance: _1e36Str }, + { privateKey: "0xf9eD6f4b6265bFA2aF1b2A557CeA4Ae3e2ABFE92AfE4923Ecc69AaC908d4A1D7", balance: _1e36Str }, + { privateKey: "0xA0f39D649F8dB00a83cEa6c66bD5FaDEe8e50FD9CaBbEb9BaD62625589Cc1A0A", balance: _1e36Str }, + { privateKey: "0x5CBcF2be1C86814F3E386c62DA45C0F6B2d130c4F892Af85D68A3Eb09FCD6DD5", balance: _1e36Str }, + { privateKey: "0xcfE1Ac3366A697eebE154D107FC76cCeE96B1BD09A0F2DaFf6b3afABD9acEd3E", balance: _1e36Str }, + { privateKey: "0xbae045FAEFa834bD8e4EdAECD9bc4961dff4a79241AFE74c9e821CFD0cCd01ae", balance: _1e36Str }, + { privateKey: "0xb93d6E2F60155bB9E03a3AcFCABa57FA9AF23D721E3c5E6fef67Aaa116Bdb3E5", balance: _1e36Str }, + { privateKey: "0x5eeba0f13A9F9bb2de5E50C5edd3ec098793F4de8fEb3D41c5d2D8f9eC25e768", balance: _1e36Str }, + { privateKey: "0xE2feA8fdD8818249b90b72df047696FbDAA4BC905CDb1fC3d144DE934782Eb0e", balance: _1e36Str }, + { privateKey: "0x8B2CEEbdfBa5ef62276CC3C263A44cd6bb05B62c75cFf9464AbE41Ef18b0BFcc", balance: _1e36Str }, + { privateKey: "0xD83EcEe10Cf4fb238C99FAEA6eEbc29E393C2d4F8d0F5D7C4a35eD151b8Cf9f5", balance: _1e36Str }, + { privateKey: "0xdC96CEedbc4ac50449E7Dc8B83179CcEa1fF430aA7fd1601d5618D245758F5Bf", balance: _1e36Str }, + { privateKey: "0xefdceb50eee1c83c69609E6Ad24be85498fcdA9dCB5ceb1c3Fe8332C6c7fAa8b", balance: _1e36Str }, + { privateKey: "0x82E42eFEbcb4681E1A33d0Add0F24c369ecd29172fF1AE07325ceaD426dFCD43", balance: _1e36Str }, + { privateKey: "0xCEc57Fba2FEff13b6205ACD6dE9C3EFBda4b2Cc92BfedfbDeE305Ac02973Ec1F", balance: _1e36Str }, + { privateKey: "0x85AAed669aAea256Bd0b0BF1B5132B847dbCf6D65Eb4Ff9817ae1Dcd5F3DCB0A", balance: _1e36Str }, + { privateKey: "0xDC3BCa1dC2bA0DfDC62df181AfDFCb4955d0c6B4eDA0cAAd9B5c8D9717EFc4C7", balance: _1e36Str }, + { privateKey: "0xf24d3fC62c631Ec8Da12E23fb1Cb4cA5Ee0eE0ab5c018B062CA7fd969D5d3C29", balance: _1e36Str }, + { privateKey: "0x0Fa1A21FB93e182CE3E0C1694Fffa1d4fEbf9eB64e6BDcd9Ec61468dfBfBf11F", balance: _1e36Str }, + { privateKey: "0x75eb6FCaedaA965E142fc58dA7Ba2AeEB70eAB743B68362b889cFEBf8A5Bb402", balance: _1e36Str }, + { privateKey: "0x58f35CFA953EAd63D7A91f9DC02A9E7B705DD9F7f68E871C77D9ae51aE8E947F", balance: _1e36Str }, + { privateKey: "0x9Bbb5f01AC9dcD8eebA2Cbbe66D5CC0Cc2440793349d0ABfB29FD045cb3a81B0", balance: _1e36Str }, + { privateKey: "0x65d25e05CE3b59ed30A32bC6c5d3D3582F4afF9Ed8531BB0497CBe03BbcCed04", balance: _1e36Str }, + { privateKey: "0xA60fF413dDee59CAc3668CDdF43BA139EbF3ce25D339A708Fd1AbfFFD84b5Fa9", balance: _1e36Str }, + { privateKey: "0x3Dcb34aDFAfb7264C6eFf0CbD6c7f3dAF9697dE5359e14dB3381ba0B5e16fAFF", balance: _1e36Str }, + { privateKey: "0xc82C8EC3085abC46B9bb11378169CB601BdFaBD268Ae6Da9a004e8267CefAdA7", balance: _1e36Str }, + { privateKey: "0x9ded4DC3cae050f2F77Ec0aDEdf42CA3DFce2BCBdb90EaE7D3841a21cB2AebEb", balance: _1e36Str }, + { privateKey: "0xf9fBfb91Fe3F9B3aeEEdFE67fc6E0cBCCa2Bfd55D673B2925BDfE515AdCc552a", balance: _1e36Str }, + { privateKey: "0x15d4963dCca3c5Ac7dc40b7a93e374232c6fFF4c8DD0938cc18F037F1CCb9aF2", balance: _1e36Str }, + { privateKey: "0x316F2fd6269aFC40db5eB9Bf73dEaf6DbA2bfF6B57c0c5c337F16676aB4D16Ed", balance: _1e36Str }, + { privateKey: "0x7BDef99122d2e331a1d62b3B513f7B99C12496d5d91Feab470fBbbe84aCC8b8b", balance: _1e36Str }, + { privateKey: "0xc4C0F7D1bf6faFE6751e9A925Dbb285474D8741fa7023Da0e7dCBafc3EB2Fb04", balance: _1e36Str }, + { privateKey: "0xfaBFee6994F798Eb3De97e4e30A7bD74DA2eef3f4013d2e46b3EcBa1Eb5Ad7dE", balance: _1e36Str }, + { privateKey: "0xad9c9E2a4AD87BE8b238ACC11C9baA07B77f10E4bA2d7b1d107BB8F7e54CbCc9", balance: _1e36Str }, + { privateKey: "0x6c177Ee68e8f8EAF8aCfDBAc9C8D1aCF5BAe0572e2Be7F6D1C47e69D09643B8A", balance: _1e36Str }, + { privateKey: "0x13DD4Bb05deCfE86FcA027bee09b6f7a8D0366eBe09E4eF4d282b9b3377FbF6E", balance: _1e36Str }, + { privateKey: "0x9d7e0Ec0bEC01Cf8aa2d1EC42a77891B41afEb4C71B9e98305cEF3EEdecCCbe6", balance: _1e36Str }, + { privateKey: "0xeD30F0421Cc601EBe56869dEa0fDd9fEaCf14f8Dcf3F2CdC8C30F975c02cfF0f", balance: _1e36Str }, + { privateKey: "0xfc523AEcc24EcB3B2Df032Ffdb310eC772Bb7adeDc03dc40fAFCBA2Aa7E3Ed39", balance: _1e36Str }, + { privateKey: "0xc5Fa20bd3588FFd6B07211413BCecAd4A10a68b9e0ae0b47E309b8f2ACdbFd55", balance: _1e36Str }, + { privateKey: "0x5f52aa6F0dEFE4a45F1d77BA643F58ac0755F429cd4eF5a2c4e23a836a4fA637", balance: _1e36Str }, + { privateKey: "0x51fbb84aE10c8d3df2EbeCcA7187afeaec96C5aB4f7ad0E75EfC3f1C35a282e2", balance: _1e36Str }, + { privateKey: "0xd8eebDe91D1bdd8e7D1740c20aE76378B87f3eBF50F6aF5b2cEBdaEBAF1A0dce", balance: _1e36Str }, + { privateKey: "0xEDffFf17eBFeFFAB8567CAac5cebC5a7ebaf7E3fE2adfAacAF14CA08aAa40cd4", balance: _1e36Str }, + { privateKey: "0xCFCC3E3D3DF0740Ea3BC11befD41Cba5AeCE8d28E544D5a6b3f85eb1ee5BcD66", balance: _1e36Str }, + { privateKey: "0xEccEeaDcccd9A37480e41805f0a638A670FEDF66cD13fdBC9b5d7be8A95d198e", balance: _1e36Str }, + { privateKey: "0x5713eaf9D14dc06ceBbfebD2B336Efc70B378A2aB4F9ec4e629A95Fae5dDf333", balance: _1e36Str }, + { privateKey: "0x0e69dD311a1bb5E0A79bC94Ae2eABad7aa4F00F16CBAc8525d8a0e4EeCFD5821", balance: _1e36Str }, + { privateKey: "0x7EA1dDbB6C24B2260371cEb4AA6ba3E785BE26983Dde0DdDAB96C1F9449e52F8", balance: _1e36Str }, + { privateKey: "0xf526cB921D860c25aC3362ACEBcDa9D49acbb8F96938DEC65Fb5a8fdeBfeeb4f", balance: _1e36Str }, + { privateKey: "0xFeefb2febC5813B14C21FDfE0a6AFf14bD75eD304eAbc0cb8ceAE71e94daAFcD", balance: _1e36Str }, + { privateKey: "0x67Fd85B2dbf1E7bea8Ad223aEABE1Be9bFA5F683E20FfC55A8D6Cdf6fBc0c32D", balance: _1e36Str }, + { privateKey: "0xfA46E5e445d98d1811fb274B9Df94e6Da9FB42384cFd99a9e5ec2bfA8eF3B66A", balance: _1e36Str }, + { privateKey: "0xA53fBD12EfF27CF3066e7c7259045766F0ABF6cEAa51DfFdC0A7aB7644676b6A", balance: _1e36Str }, + { privateKey: "0x6aFBe0E88470e60C599EDD5b1bF91d9ce8058ce14f6DA66e97F468eeF2e60C75", balance: _1e36Str }, + { privateKey: "0xc551D35ab17a5Dabbe397DabC226b26ba6B7AB92E7D23c6928Ffb28d9Ca78ddB", balance: _1e36Str }, + { privateKey: "0xEAa44aaDeb75ecD6c9b9EE565eFe204B76bBfAcb4BB192b0F21e1C6Fee69529D", balance: _1e36Str }, + { privateKey: "0x5bD5fFF9eccAC7737CAF13AAE53860AD03cB47Dc7DCFD4db9fa82863AFfb98D3", balance: _1e36Str }, + { privateKey: "0x22cDd3dbf85Dae5De249F0D4e2fe2CdD6dc03fb56a89Ec28bBE4dCd6D3c51B0f", balance: _1e36Str }, + { privateKey: "0x12B55f6b5E3D84BC1F361E3f1DfdF0c126ba28B351054c8AfbF48430bEF94fbD", balance: _1e36Str }, + { privateKey: "0xf7FF4bE3509F5aBeA0d764Db343dFDd32ABdFEEDCC471c9D81CE6a62FEe1dfc9", balance: _1e36Str }, + { privateKey: "0xa3E1701fb68ecCEcB6BC3C721b6fF1dDc756180BbAB4FbF13beD088ebe6ceb9D", balance: _1e36Str }, + { privateKey: "0x9DacDF8AB4d763bEfFcD7AC0c69bC967B1fc4C2Ecf189829E5911bCbACF95EaD", balance: _1e36Str }, + { privateKey: "0xfD9aE7da5B1c0Ec85c99fb5c84FA0419F96aD0A04BCd900deA1C67B647081d43", balance: _1e36Str }, + { privateKey: "0x4FE4BBd6225648e51Ab08A942CDe57AdaB25148A408beb7F64FaCAebd3BE9afd", balance: _1e36Str }, + { privateKey: "0xdd280EF9deAD4D1FcDe31eFCB4A19D68e578e3DDF53Fe9Fa0E059ffb8a4D885C", balance: _1e36Str }, + { privateKey: "0xf55b09BFCceF7Ad43DfCc3db77B771bf41A2bDbfaD1EBf7d7dF08B3Ec13ED606", balance: _1e36Str }, + { privateKey: "0x7Aa1CE00F979a53B99C4a4DfcB3e5424A498A68bEF2fEdBBe77bFD1DFE8ad8e2", balance: _1e36Str }, + { privateKey: "0x360CFfEAE6b95bAbA2D94058a7CB8e05bC21b4aBb4Dd2Ac0a900cf0bF60C8Aec", balance: _1e36Str }, + { privateKey: "0xa300C85AcCDa0EbEF0E3e3c3f8b4d47D8ab990c7dbF3bFAB9eBCbFd0098fB79b", balance: _1e36Str }, + { privateKey: "0xB3dEc4e5DB65a3284BaCAfBDE1b9CedD341A6B1C5DBBbfEe82Ca1ac6dBdAa58b", balance: _1e36Str }, + { privateKey: "0x71bE0A33eBB0C6F6ff7683bfA817DCb33ECEbf9e9dc27fDE80DcF424AF762a35", balance: _1e36Str }, + { privateKey: "0x5E453Ac8Aa2E1F68F7B40Db0c99D3Efd1FC8a8f64cD4e92f70C5be3FE71FAFCb", balance: _1e36Str }, + { privateKey: "0x4cBfCcd198a24fD67f49323CAd01Fa8eb26025854f9c685eEFa38cE34573F01D", balance: _1e36Str }, + { privateKey: "0x3bBcaC3435A5c4b8cDF220771adADcd4E9001248CffAd38baD48aF7970d5cBc8", balance: _1e36Str }, + { privateKey: "0x5304D476AfB229abc5B262dBcb0fe2FDA4BdadF4FBfb1d1C5CB914BBD0420C86", balance: _1e36Str }, + { privateKey: "0x381A1c8EEBaFAa47e9919ED41f6fA1f080e52913C69747f8D14eeD3aAB72b6aB", balance: _1e36Str }, + { privateKey: "0xa8c78E8CeD4b5B72b4863C0ba77ff5C923C5Cabd75a6A1CE492F25FfB1a0ba2b", balance: _1e36Str }, + { privateKey: "0x847998Ddc85aFACF68EE3bbEDB72D0FaFe62F00Ffc594b2CC2BE7A35D4149bD2", balance: _1e36Str }, + { privateKey: "0x5B4a2dc7b4f9A4CDAcA01f5bCA5Cba988fC24fD161bD7efBbBCc7edef5EFFeD3", balance: _1e36Str }, + { privateKey: "0xBF30C0C35BEFf44f882a05D5B2AB1187A5dff7b87Ac3B153D60C91Ea2b4Cca6A", balance: _1e36Str }, + { privateKey: "0x4F3BAFEa2d1D1C7dbbdad6fFcabF653A5DaAEDD96BAca4bDB4d00c3b0eC7F4fe", balance: _1e36Str }, + { privateKey: "0xCF6c0AC1fFDc45e8DBcFfB62FcF34C6CbB1c9c76efBa79669a0A5BB6b8daCBcD", balance: _1e36Str }, + { privateKey: "0xe5192d3E40Eef9e32CaE43d368fa9f7A904Ff4a9d85C0d21CeA985C0dAacE8B0", balance: _1e36Str }, + { privateKey: "0x4dEAba8FD79DEAf99bedF55e7DFDBcC4FdfecfbfE2DdFde3ffB358BF66ddf1b2", balance: _1e36Str }, + { privateKey: "0x5D6Ee9B7c214027f306E154664D686CBbf3Ab5f78fbe4D120E90Ae2aC374Fbfb", balance: _1e36Str }, + { privateKey: "0xfc1Ff408CbADDF4CcAb7DDD228EB0C8081a0fE4b5dE4482F5ad213d46BFDbf58", balance: _1e36Str }, + { privateKey: "0x0fbf947Af0BEA2Bde98AfcFE64FABdefA7722AdAf1697AcF809AEe0c10d499DB", balance: _1e36Str }, + { privateKey: "0xCD7aa5Ed190893DDe987c78c3Aa78585D42d0ee218652075c46E843D4acEb67E", balance: _1e36Str }, + { privateKey: "0xD851A24Ed21bAAB91BEfc23Da36238c4dE111c04D6cF8c0b936F9815Dc961Eee", balance: _1e36Str }, + { privateKey: "0xB22aee9dCAA25AeC10D7f7e492A4FeFa57EB8d4b720dEBaFfeBE6ffF451F913C", balance: _1e36Str }, + { privateKey: "0x07f2aF34fE75eF8a0ac3Aa50be66B9ACbeB8AcEe3C5ddb82bbeab5D4f0aa31D6", balance: _1e36Str }, + { privateKey: "0x9e2C27dBbcba1E8D013ddEA0E763d07cFba9DCc6dAA9EBBBC1bf4A4Fecf530a5", balance: _1e36Str }, + { privateKey: "0x8F49172dA65Af38FEAb82E368325d5A2f9ceaA9a307640454fCB5Cd713BC3d8E", balance: _1e36Str }, + { privateKey: "0x9de75dce14Ffd2e287Ad8aEbfe2c61Ae8c7E05C7eA527B730050eA225e8aEDAE", balance: _1e36Str }, + { privateKey: "0xBAdC1641AEEeaF5830413D5F6A9e0eEBE77Ad07CF277707cACc4Cf27C1a8DBf0", balance: _1e36Str }, + { privateKey: "0xdA0A11FACffd9e84b6e6A1749BDF44A9a345AB56746eBb96f949F66b5CAE5dcd", balance: _1e36Str }, + { privateKey: "0x71C0DD9eFBDD0eCc1ebE9c9eDe0EcAaD9eECaeBDd9C29C76CE5FC4e9BEECDF4D", balance: _1e36Str }, + { privateKey: "0x5aec16f84f0BC4b2a6D3D17475fB1B4a34A8255CaEF9dAA7cc30dca243429fC3", balance: _1e36Str }, + { privateKey: "0xF486DB8f6B37bd28deDD326a5d210DAA1B535dcCEdEb17eeB1dd8472ba7f72FD", balance: _1e36Str }, + { privateKey: "0xEDFB25ee763bD1FeCCaE7e29F7fEF5DBbafF9079FA7eaCba37fc9Ef518dBdC09", balance: _1e36Str }, + { privateKey: "0xC0d7c8B35fD6fB4d628DbAfDf1bD7Aa4DCF72d2D4C9D9882dD0BcDA65E15D1de", balance: _1e36Str }, + { privateKey: "0x7e61Dd4dB13E3E5b85DD06d6A9fb9d9eD5FDd41e1E92114eBACA0BeE4CEdfC3D", balance: _1e36Str }, + { privateKey: "0xE15BC7A4d4CD07C2aC7Bc01b450Bf43dB99de1ef7Ad8ADA100BDC3aA844c8c54", balance: _1e36Str }, + { privateKey: "0xa50f9d8f87bd4B6A71070FbEBf6660794CC803cBE6CebA8ffA8aBFd3A4779909", balance: _1e36Str }, + { privateKey: "0xaDb034a6Af4CDCAcDF38431eE9b58AE34F680e5BfA6aA6a4ffDBC0bC6fFFF50D", balance: _1e36Str }, + { privateKey: "0xdFc6Ed8a53faAE4FedF5723CA2E18eF93AE72Bb76B702dD63E7499bE172E348C", balance: _1e36Str }, + { privateKey: "0xAC616489cb5E71bf3Ad40FC5CfbEbE9eDAB6C507fcDBe1755890C4310be8dfD9", balance: _1e36Str }, + { privateKey: "0xCEACF0CFdCCC8FffA2cE2B4a046EE0ce0FF9789aeE959d414afE7321d75c2b3f", balance: _1e36Str }, + { privateKey: "0x95ccD9BaEadfd1C8fbFC2CCbeB4e28DafcA26b1573fbBC585FA8f1c9faC02B76", balance: _1e36Str }, + { privateKey: "0xb783CbC5fFdEb3ccbA0bE173652f959E5c6f4569e60E6d67161a8f38C5dF79d0", balance: _1e36Str }, + { privateKey: "0x9c1F38DE9dCc0f34e60CeA9Cb4D992f176Cf0bDB18dE003df25D0aBbf38887D0", balance: _1e36Str }, + { privateKey: "0x4AaB2dbE112CEc2Eed109DCe3d6EdCb3Da47Bf9C6E2880e09Cb9430baD5beB0c", balance: _1e36Str }, + { privateKey: "0xec2FdEe3DFE78E6d9aa8FCBEAF3DBf82cc4C7BaBb1Dfda7b5208FEea6b8F038e", balance: _1e36Str }, + { privateKey: "0x362fFEC3eEBfFAA78c81523e12c1eaCbF2F2E56B9Bff574f3440f44bb86BF23c", balance: _1e36Str }, + { privateKey: "0x1c7EEBD1A7B3DBde93dD6E1292a70BB7532e5feE48b48b0E1239b9cEBf1b2f04", balance: _1e36Str }, + { privateKey: "0xAEEb0b58AF1e4ABddCB08Ee8988baFe5Cc4efD74D1fafCC3F016F127fCcD38f1", balance: _1e36Str }, + { privateKey: "0xFC45e0a8Ee248eCa2B4B4EF2443E46B5Deb8f42D51eF0f614bc0eD06ffEaf59f", balance: _1e36Str }, + { privateKey: "0x3FC30Fe223AcF399f875d0a9E5775E81C7660EDAc9F12ce73B4A5B9b59CAa71E", balance: _1e36Str }, + { privateKey: "0x6cfFE8d0b2B4fC44AB3ac8Bedb0eeCaC7D2c8ab7bC82BeD0E513B5963FaDCfDD", balance: _1e36Str }, + { privateKey: "0x1141Da15ccB571bfcB1B036feCA1a4Dd8BdCEb488AD0ED41e970bbFBDddA85b7", balance: _1e36Str }, + { privateKey: "0xF8eA6A0AA6553eEEa0Aa8d5dbC25Fc76ebb89d403EC849DEAAA7C3e8B18F9F3E", balance: _1e36Str }, + { privateKey: "0xE8ae7fbcD7C4A82Cc99aAcA6D2E8A40a1dDa8Bc24CDfA40d8dA2D497F2afE4ab", balance: _1e36Str }, + { privateKey: "0xfC5f4561C3FE1AAA57AE3b9fBCaAAEe7ADDEf18Eb91A43fda59a71562c09DDe8", balance: _1e36Str }, + { privateKey: "0x0DF3aAc9bFf3a00AFe1c42dD14CccdC5b0CCE096C7c3cb1C75df92e521D67bbd", balance: _1e36Str }, + { privateKey: "0xE52E8Bfff63164e08CCEbC5DBFbeebc53AEF3Abbc68bCbbF3D8F975cBfeb3fFB", balance: _1e36Str }, + { privateKey: "0x38BeD53eD51c6ACcDA1E7bb29D6C7bFda1b5Ae0Ecd2Cb64049e0cAc4f4e2cCed", balance: _1e36Str }, + { privateKey: "0xA7042EDD74a1A7B50eFcc0A7E24BdeB3b3f6209ddBE2A8c13E6Fe4Bd3556Fed9", balance: _1e36Str }, + { privateKey: "0xFCdef0bc0F9FDb3fBaE3eED418cAAC9cf952bC7cf683Ff85C12DDFaBA2909D65", balance: _1e36Str }, + { privateKey: "0x77e1bB2694BFdcdcFb9b7892E2D8C8d024B36fcbCB8Af3751BBEaf18e586ab57", balance: _1e36Str }, + { privateKey: "0x0D9f2ef8bEdCfeecEB7B8FaeFCeEc01e4a94aEb4b9a5FacE4B5DC6B33aCbEb66", balance: _1e36Str }, + { privateKey: "0xa4f76eCd7Cd3FDf80cA38A7E3bAa546842EF3589DFA73c4e7aD0aB3157DACDbF", balance: _1e36Str }, + { privateKey: "0xb4EfcCf5846EA5d1aDfCb91FE65a16c8AD77eca4D76f156012D628fF663AAdfd", balance: _1e36Str }, + { privateKey: "0xc51D482aceFA5Bc852004f41eEcF7de8cDF19136DEF8dBaDe254cbaBC5EBfB5e", balance: _1e36Str }, + { privateKey: "0x0117FD1e4b504AeCDEE8A5E5d067DAEAdD57D9Bd2CF0b9FBfaAAA9AEF56fdc3e", balance: _1e36Str }, + { privateKey: "0x37632ef7eBf4b853Eae97da9ddDeA5CD314CE7D6f80bf0A6EF6da115e846DC41", balance: _1e36Str }, + { privateKey: "0xFb1a35e2758Fc3D9Fa5B7B9a7cEc89D2a77c66EaACD159CeAb3Ef9106892b84A", balance: _1e36Str }, + { privateKey: "0x790787ABF562266ccf766aF01bD2A2dA9d89D45023A9Cccf62bb88a53CBCA6e7", balance: _1e36Str }, + { privateKey: "0xFDBDfE26a0152FA0ECEA4EddFd5C0b995ca7aBDbE4c4c87ffcAFDB0610a8e361", balance: _1e36Str }, + { privateKey: "0xc8bcD70c04DBE5d2dBB22ef6afF59b2D39d7cb170f0ff18be6a5cBFdDa1DDB04", balance: _1e36Str }, + { privateKey: "0x64C9E95E2efdb216C70255b80bb341cAD2b3FaBFF9EC46D3a8BF5b2CDCFd773C", balance: _1e36Str }, + { privateKey: "0xfDbBE1567F4AC280D7dF328087C50bC25E5A1f6E1B397Da9BcCbF4DFE3aBf7da", balance: _1e36Str }, + { privateKey: "0xDE72c31ddBd3c4dB2eaAD2E7fC0616d3CB0c4b7F6cBEdE61dfBCAeF9153166Ac", balance: _1e36Str }, + { privateKey: "0x7cfAD4eDbAC3FE9DFb04F0A3E9a0dD99A3323dbe77E9e22aa2BaceCBF67fbe60", balance: _1e36Str }, + { privateKey: "0xffC11d3081abDef79F486fbCd6CbECa2cBbc2aA2Ddb765faAEA84A6cbEbc9eDF", balance: _1e36Str }, + { privateKey: "0xC8dE6fF874D8C9900b4474baAF99b774545cE7Fa55D5cEd5085ff27bbB372cd3", balance: _1e36Str }, + { privateKey: "0x25Ee75C172d0701bB5a076b8AcfA078A8B0f8fd2cEC3a6298A4eD62c8F8e6e4B", balance: _1e36Str }, + { privateKey: "0xED80ad9e82Ba12f1b727aec0E1E6Ccd8C917eFC122f78ef682531a6Aa51b84C8", balance: _1e36Str }, + { privateKey: "0x7fdB92e7eA164F8Ca9f4c5225Fa5F721Ca97DADC6722a4e0Be69F59F72E4406d", balance: _1e36Str }, + { privateKey: "0xc35328ddB8CaCEcA33435c17931c1e43a0FD3eF9EdcCdf6EDe8e9A644F27b4CA", balance: _1e36Str }, + { privateKey: "0x0b04baCCD0bd8D68aBDD0fFe86c33ace070A32ceE305D56c68D20B4dDBb97f0b", balance: _1e36Str }, + { privateKey: "0xa2B90e1DdB40BAeae18cada7CDcAD4a8dCF1FdAb02fB0C7216A3A942b36A86FF", balance: _1e36Str }, + { privateKey: "0xE4F62eBfbd48Af31Bb2cFfED2f6aDddbCEfE87C1DbC4c63Ded1F3E8a63a04331", balance: _1e36Str }, + { privateKey: "0x3a9E54733E09a8bFAB3f4ba6bbCba20EE2feC9CC3d9C5e7fCBc87bb9eEFf97Be", balance: _1e36Str }, + { privateKey: "0x4ef1a8934c1bBf33f7FE4C8cA9ec4aF94aEE14D859E89D5eea74c504D3cF8d8F", balance: _1e36Str }, + { privateKey: "0x7b93B4EcA077fC5800f687b1fACCA6639c9ACbe7DFbD06a3D1Df8A398d880dAe", balance: _1e36Str }, + { privateKey: "0x8d670FE6d77b49ACF6891A3FdbB3d5C602CDBbaa2f3dCB8FE22bdDd3beaf4164", balance: _1e36Str }, + { privateKey: "0x360259E9b1FdFF304c02F737BFC8bfdEACF1D81dc6FFce8cd466FEe1dbb06404", balance: _1e36Str }, + { privateKey: "0x88e70eBCca012CA3cCb742E64CdEDBDAd4af1f0b4ab74880402a7D9fd3afDf83", balance: _1e36Str }, + { privateKey: "0x9A346ce2bAe43cDC0adffe850CEfc8b475599feC9308b51D98dDe01dEEdcD6e0", balance: _1e36Str }, + { privateKey: "0x4B83CFBf5BEEf4c606FaE8159eDD8Ea40B9bFC9AB4c2689b9ABb5AB288C2b914", balance: _1e36Str }, + { privateKey: "0xbdc41e9A1E6EbAC6E3aa3C308Ee64A8F4BBFe2Ad7CB0dbE2759fD7b07CdD65A2", balance: _1e36Str }, + { privateKey: "0xcEB70dA0A7E2fd8fF89B0a4fD0ae43DC31dd071A966d56f97dddeb2DEcF2CDa1", balance: _1e36Str }, + { privateKey: "0xbAc7edc59bFCb445BEd1Da8Fe114e4cbfBC8A4eE0F88EEA3119C77e7df582Ff6", balance: _1e36Str }, + { privateKey: "0xdda27647F49dCbCB5539EAf062edE7d4336c19bBC7d8CABEE57c608A601B38dB", balance: _1e36Str }, + { privateKey: "0xa6C7de9Eb7CC24c932e74bD1e60cb73dA4bC1BcBaDb04F1bC994762bBccF79A6", balance: _1e36Str }, + { privateKey: "0xF983Dea7f9ffbdB56FBB5bE6CcF2F5f78D19F6e06E3DeEa6CBce179dF466B491", balance: _1e36Str }, + { privateKey: "0x53f3f52Ab93a905133Ff9DEBa5A9bf924FFca4a2dCdcf5A7ccb1dB9565a778bA", balance: _1e36Str }, + { privateKey: "0x760c6D438B5d8Cf8eF7a1eDEc6495AD1E08c5EE92f5d40beD0DEA1A1a03AC10b", balance: _1e36Str }, + { privateKey: "0x8134EBec6C55C4ddf2B43E6eEe077b75fA1Cc5f1A8067CacfEc2e5bc9D515FfD", balance: _1e36Str }, + { privateKey: "0xbaBCDB7eB36Cb45f8Bec0cf3E7CCe17AD93CdACDBb6edd75Bbb1C2cdad40f35f", balance: _1e36Str }, + { privateKey: "0xC5bbBEB98bF5A71aBCB3acab7Ed3dFe9B7EA6DE3E2BE3235d1040EB0B3123cB9", balance: _1e36Str }, + { privateKey: "0x9aEB8E9250dcAADc10D2C5b7CEF28bFB35071DceeE7fb188BF1Bab056f63f541", balance: _1e36Str }, + { privateKey: "0x5055bD0b3104AAB674ecE2b93F9FdDcC784fF8AA2f0A55Ee5Fb9a9Ebcada99fB", balance: _1e36Str }, + { privateKey: "0xAbFfEC11fac0cFEdEBA51F747FD88Ee62f8A4bFe7bCaA3fD497C9b837e4ad1Aa", balance: _1e36Str }, + { privateKey: "0xf6cEBb8aCBF3FD9f3667B9aead92Fccbb15BaeE87a72F0FECd0a7C20a06ED11E", balance: _1e36Str }, + { privateKey: "0x47ae2bDF44Ca0D93f5dF31EA0295d3ea6063f4EEbCD8DEBABbB774AdEF96a6A6", balance: _1e36Str }, + { privateKey: "0xbEdc94dFFAA93AaEeF6AcC5dF5F4ccA82A7Ec5aE1bAfB1c58aDFb12fc95BDA08", balance: _1e36Str }, + { privateKey: "0xAacd1B9658f1b0afaD72065c71dAfDfEA79745C8CdD7e26Ef9BeBe6D7dB82E0b", balance: _1e36Str }, + { privateKey: "0xFCEB8B83D1a93CB8bcc3fDaEfFf3AD0c24e6F94dfe2B1CF78F33BDD3f887C132", balance: _1e36Str }, + { privateKey: "0xa6BD72DDf5380e4b4953eE4d043CEE3975383E7dF60AE643f9627ce56695e3A1", balance: _1e36Str }, + { privateKey: "0xB1EbAca4Ba4c4Ca75dEfD2b4aac124071bC4aAC6286AcF4E0A2502BfD1A50e1f", balance: _1e36Str }, + { privateKey: "0xf713C1Bf9b4a5445e5a9a204cd7d001eF7ACa4821C9E6eDeb9e400E0FDdD28d8", balance: _1e36Str }, + { privateKey: "0xF332226eD87251B4E2DEd35BF60F7fA2ebFacE23AFBff7F597eA3361CAFeFB50", balance: _1e36Str }, + { privateKey: "0x7E10DEc7EADe42aB56e71f8ccaF7DEBe61A50C24026B23f20e3D93b5F8D5499e", balance: _1e36Str }, + { privateKey: "0xB0F71066eDB5ECf26EE668237eC49F4B7A941de5f9bd752F3E91ff4DEDDaDA8a", balance: _1e36Str }, + { privateKey: "0x4C4B4e674A591e2EAa123Ec9DDbcfB06E48c0CeaC66fAF64E8BbBA78E453C8ba", balance: _1e36Str }, + { privateKey: "0x7c5C7e8FBb20b5d57182DFD2eAA53dB3591Cad8Db1c8920e353E2D5EACa3c553", balance: _1e36Str }, + { privateKey: "0xA0F3Bc7fCeABe3a7CCa3ec6EA37bE1a1C368Ab19579B4A071F2c5c82E5abf1aB", balance: _1e36Str }, + { privateKey: "0x722ddFefFcc5F2FE1403F1DccDe50dfA5F3fE16c7325d79877c6a128cE3E7f87", balance: _1e36Str }, + { privateKey: "0xEA10Bb5B2Cd8dfEb419bAFD4c79C09DFD99FfE6a9c624FA6FcB6d68cdacfB7Ed", balance: _1e36Str }, + { privateKey: "0xBbc5ec5a8Efa99FC95b6e221543827FF5dA6ADcF32EF8af1eb2CfD1fd66992dA", balance: _1e36Str }, + { privateKey: "0xA8dD6690ec20CEA254C1eC1BA6Aea3fbeDfEEFEd6Ecb6a881Ddc37d3ED2EAF8e", balance: _1e36Str }, + { privateKey: "0xb83a18baBaAD74c1Df4bBA435A75dCcA724De3AcA6DD4a0506FBEafcA91cdbFc", balance: _1e36Str }, + { privateKey: "0x51656e0CFe8fEfeA8D4AacbF99f7dCCbF4e0FDD2c6BCa9dCce579c0b2fBbcAcC", balance: _1e36Str }, + { privateKey: "0xe45a46745F2EB9F03D9DF6a13CE8DED8aEdfd6d8Be652BE0cdbD840F19dd6804", balance: _1e36Str }, + { privateKey: "0x1BCD6E3d0479AAe3dA99e05b74a336add6aC8fcF93567c11AE57aAb392FFE0d3", balance: _1e36Str }, + { privateKey: "0x41d5F5C0dE5c8ACF5E323AD8cfA2910fd9EA6fFfF7db64cfAc2caed19FECFEFF", balance: _1e36Str }, + { privateKey: "0xA8aB14D7d3A65fe2b9b8F1F72c08f2D8ecCd6Cdf44bACD0abEeDC1fFeb7B0A3A", balance: _1e36Str }, + { privateKey: "0x3dFCc3b02c494Ade3b0DA5D93CBbBFC4DCE4A2CBC2EEAe101Bc0e1EAF8baC8f5", balance: _1e36Str }, + { privateKey: "0x71ebe2FaEE0AFCde26E9A2C5b6936dfD7aF371cf2672BDbeaAfe6079ca5D1F6a", balance: _1e36Str }, + { privateKey: "0x7F0e9b58Ff6fe6aAeF2Af8aDECDBe3A6EbE0bDacA320cfe223fe812e16b4B4e5", balance: _1e36Str }, + { privateKey: "0x20F385e9D63d673dDa61aDacd81f180C4F0bCa228cACb5fED81476faAAaafeca", balance: _1e36Str }, + { privateKey: "0x7a24Cee8a184efD6C0BA5425da629B3ccb25C7CC9fC309A9bDfa7ff1C09F98bc", balance: _1e36Str }, + { privateKey: "0xC7A100eF0acCfdbca6C7A3fD0A4BBdFEc07A89e060bCB3FDcDAAdDC8dcd808D8", balance: _1e36Str }, + { privateKey: "0x0daF0e1C5c3CdeF967681AC7F2d5EF2Cc392b8A7b854dbc43180e1C9575FAB5a", balance: _1e36Str }, + { privateKey: "0x5f8eCaf23e83E2cCeF9e4c4a3fbeF6Fdaf0d93A3C7B8bcFbBFB53643c8e5fcf8", balance: _1e36Str }, + { privateKey: "0xaa3aCd68e0A1F0D1EDAd4A04dB88dfbAAd9E4813d0b59cA0bdACbfc74A1Ef73c", balance: _1e36Str }, + { privateKey: "0x579F5eF50E2ffE41c1F2EF8E0D6DaBCC4a11a6B6CCe7cB5c88C37AA3Ad05036f", balance: _1e36Str }, + { privateKey: "0xd4cAf9f374eED0D383AC52d45DC4dFCf94dfa7ADADab1382883075E45aeACcD3", balance: _1e36Str }, + { privateKey: "0xAFfdD281e82cDce3cB97C74c36dF7FBe7219BB4d7982B667bdC9CB8Eae7dAbAF", balance: _1e36Str }, + { privateKey: "0xbc6ff23B20bd7eD4eD3704dCBa96a1b4ECF2Cde3d32d384bB132C3aEEef197ec", balance: _1e36Str }, + { privateKey: "0x1DD30db5F82Bd05F0Dc42117E1fbDA73965352dfBdfFBCa1Ca9F4CA4ABF09Afe", balance: _1e36Str }, + { privateKey: "0x2Dc7bfB5f0D24f7abb3C908efb21e60bfd9BBC13bAdeFAAFEB4FbBF8FAb80A3a", balance: _1e36Str }, + { privateKey: "0x0EAD4bB5f8C9e005dABe5BAa2CCd1DfF25c5D307DecB1F3F1cabeB79eFf77b27", balance: _1e36Str }, + { privateKey: "0xab8083915ce11D1Fa61e6fe29b3fc8D76Afb88FfCEa4BFCBa3AEb0978cEFfAef", balance: _1e36Str }, + { privateKey: "0xAdE83c02854bD99B1BA405b32a029Bcd28E932Bc3cDaBdBD97E6667b7DbB771d", balance: _1e36Str }, + { privateKey: "0x2A7DA2F623A7874971dbA6DAeddEFca9DEc496CBDC38e4D162cD6CEd98d7d4Af", balance: _1e36Str }, + { privateKey: "0xB179D6Dc4EFeAE071206eb0ea8cEaE1E590E57Dbcb517a1CB30AE81e4f5fBD9e", balance: _1e36Str }, + { privateKey: "0x165D41E3fed53e016eFEC41cDc0E2AbDf494C3d3d25cf0EFCea9cA2Ef725B10c", balance: _1e36Str }, + { privateKey: "0xb7ECAb70fd1106eE488DcB4605A8D7CeF0c81b1eBFB4DF1cD0cA92ffEF7Cdb12", balance: _1e36Str }, + { privateKey: "0xdaAEA38aDD26DDaCBf286c5de2A8F4BA1c8ac9a3Ff3D7c1e4aa7C39Ed5d419b3", balance: _1e36Str }, + { privateKey: "0xa5F3dfCad0e94dDDd3F85aEdfcCABaa1dcD5EECBEf53810Ebe81ca62D9FEb7a1", balance: _1e36Str }, + { privateKey: "0xDD3D7EE4b3Ec894FB136a6bDAFAab17aeDfDB831DB402B7aC18Ae75EAb3FD5Cd", balance: _1e36Str }, + { privateKey: "0x61Bddd6617fd7fB6Ac00bDd53cFF20e4FefE788a0484bfc43b5Bf68CCcbcC1A7", balance: _1e36Str }, + { privateKey: "0x314cB5df8aFc22dB14fDA523d8CE9DB9Dfbc1F47741550F1CbC93eeDAc51c98b", balance: _1e36Str }, + { privateKey: "0xefc1c960FDd6b932184aE8e5289dECa8fe4daBdD7a37EFf3Cc7Fc6B325b18C73", balance: _1e36Str }, + { privateKey: "0x2d32fce95ACaCbd5D828E1ed7d4C8A3972FBe44EdEEFf6543b6Eb4E17F6b707F", balance: _1e36Str }, + { privateKey: "0xAAC27ef0cFce20eCdEdBF36FC68BcBeFD173a7fCCa2b8bB1f6fCF523E2E4C013", balance: _1e36Str }, + { privateKey: "0x2C58cED806BebcA8545b5C82D3c83EBc2dbBAC09Bd05Ca2c161bBa23afEFcFD5", balance: _1e36Str }, + { privateKey: "0x6dFAAc5Ecf7A75dE0cF641ffFBEEcedD0B0Ef1e92aFA0b27EaEaE09ecE6aFfEf", balance: _1e36Str }, + { privateKey: "0xaE68Db045b0AEA45c479eb5748398E9C9c4caf46E35Be3DbaF7D704e6DaD2de6", balance: _1e36Str }, + { privateKey: "0xA99E6E06Db7c24870b6Cde3A0e7ae9a549Ff3aA1EFCDa67B8dD10DC2fAefdc4e", balance: _1e36Str }, + { privateKey: "0xA2d88f9fFbd9F28E40feE9A0495fe7feD1Fc5e94Aef2EC8EFb4EC8fEdff1C9d8", balance: _1e36Str }, + { privateKey: "0xFbd04C0A1b9e9BcD30DCf3e7EBf8ee069dEC6DDa3B8F53DAa0D20AB7CfdFAaEf", balance: _1e36Str }, + { privateKey: "0xbeb56d2C10afe6eFd72Ce9DB0Fd3C6cB7Faac7d8bd3A9f5AEBA1ECF5eAB25946", balance: _1e36Str }, + { privateKey: "0x9d7A1b51d76E7deC1c5B399E24edadf22af8DaCbc979E96b3dB7c2AaBdC6eC97", balance: _1e36Str }, + { privateKey: "0x4a5De1a09038Eb0FBd2eBBDCAef58C1fd9B75bbFfbDaCC583027Db471B19A4E9", balance: _1e36Str }, + { privateKey: "0xc118Ab3C4E4A06A42A69cb9bfBaa5B46dc255Ac83EFeED7Ed1A320AB49293D0e", balance: _1e36Str }, + { privateKey: "0x706AD6CF0c307c7ef4A73b8D7dcA21F25bCcedcb5f4CFAFbCFc3C7C89F02aF34", balance: _1e36Str }, + { privateKey: "0x3a6830dE5DD77b1CA96bFB22dE6d44B5bfbE328Db7A9e49A972a2FF95FEBEA09", balance: _1e36Str }, + { privateKey: "0xC90da3CbAc8B72CCE8c93065D2AEcD1adFa36Fa7C19f7D4CDC6adcE3c8EA706D", balance: _1e36Str }, + { privateKey: "0x40DB6C8B26ABe35153FCaDCd5FdF3eC5b6CA2bfabBcE85C4c7b63F6cea7Cad4C", balance: _1e36Str }, + { privateKey: "0xcC4BEC1Be799561786bC2dcDCFDbeD1bECdBADbB7dfdFc029E1d9A4DABC0dbEb", balance: _1e36Str }, + { privateKey: "0xacCaBe2b8b262aED34cD47B8d478eb3aadE3aF0a88C780E22a8Bc1B4CF909FF2", balance: _1e36Str }, + { privateKey: "0xbfDddd91BE4a2cE3f87B7EF50Eb0F6f404e7A4898d2875dcdFbDFBc4d854Df2E", balance: _1e36Str }, + { privateKey: "0xcD15CF93A8ABe2A00E7397a2874fb94bfcc2D4e2bdDACAFCbf7D3eC7F2210Cd9", balance: _1e36Str }, + { privateKey: "0xB30F4eaf5cC0c59AE0f101c5ECF24A5b85BC88Cfb6B8E8fb3Acc9AAa94dAe99C", balance: _1e36Str }, + { privateKey: "0xE8321F9566EEa282B7f507E96EfD1dC5ca2FfbAacdE3dFa601DFF20E1CF5DfB1", balance: _1e36Str }, + { privateKey: "0xdB7EFec0D8D5B3Bbb1FB4fb0bFBd0D58b80FbcdFa190ccB1FC7dfb8a94AacDb7", balance: _1e36Str }, + { privateKey: "0x01DFa03679b446FDD1f28Dc3c7e7EA37D59EaeBC4eeBae91fCd8d6eCaF8FbEec", balance: _1e36Str }, + { privateKey: "0x67fe2A0c6290783f2F4717fbe0CF72aC7c3005aA8cBfAff0E7468F1D0Fa16D1d", balance: _1e36Str }, + { privateKey: "0xA3C9292475ae245Baf25Ea8A355CF2DCb0feB787f8c7f9dE0933FD342b9aF2da", balance: _1e36Str }, + { privateKey: "0xfAcad3cbD1e0c4F08914b2DAec072f1520eda4DcEb1ACdD4177AE40334aE3BCC", balance: _1e36Str }, + { privateKey: "0x1e8aB5E10Bca132BA82EFFf198F9dc61Fac8bbCEF75a2ED3E1Af4DA3C924D7EA", balance: _1e36Str }, + { privateKey: "0xDBca79F9ddB0D46A1556645De5685CA58c0aD52462b3AC46aADcAAFa2e4Ef9A9", balance: _1e36Str }, + { privateKey: "0xB75B389d81E6D389BbDBf9bDffa74CD42D6a792dD1ee7aC85d597c284dc0eA2e", balance: _1e36Str }, + { privateKey: "0x8bFeba2c1aD9fbEeeB4028d921Ed53Da51f15090Dc9736CC53eb5a05EB081eC6", balance: _1e36Str }, + { privateKey: "0xB7B6e74adf1575c294b56FeEded6424DfD3fcdA1b0Bb9aff8Cfdaa9e4E350b80", balance: _1e36Str }, + { privateKey: "0xB2922a2a63c7AC66AcDD8a3CaF0D0c50c1D158E70cFfdAcdEE831fBF9A8F3cB5", balance: _1e36Str }, + { privateKey: "0x0Bebff8ad570a9fdF7B02F5Ce1bfe8b43DDd63bB85AE24C5dAb2DDccbeeC50A6", balance: _1e36Str }, + { privateKey: "0x0786B5bAE18cf8Aa6bacBc7C67729E61bAeEaDcddC74BA8fdb4b6BF836B47d25", balance: _1e36Str }, + { privateKey: "0xf3cbA5A83d53C5AFf3Ffcc799905F8Fffbb6AFD57e41CbDC6682d56E7EC2fEDC", balance: _1e36Str }, + { privateKey: "0xDf71E23c590c94AFf5E173efD11E7daF4a4AA9a3F4C83cfd47dB117395A9a4dB", balance: _1e36Str }, + { privateKey: "0x739c3570D0693FB9AdCedb90549FD7bEce1aa1333fc3db56eAFB4e61b8f0Bf8b", balance: _1e36Str }, + { privateKey: "0xAbbbC5756EfaDCa73bBB4b610349891d110347Ba40cA7DDEcCa2c0f0ce334cbC", balance: _1e36Str }, + { privateKey: "0x7b61317784B4256AEaA4aDc1490973a2E87CcB3D4D2F7F1Ab5DC6ddECD0e13a9", balance: _1e36Str }, + { privateKey: "0x046176e33f7ab209C61F5b2D467e1aFB6e7BDECcbeCaeC8f826f7C1cf7C353CA", balance: _1e36Str }, + { privateKey: "0x2b1CF29d3E6DFeC4Bc1CD3AAA9f5f52b3DAC55AA2eE7990eaEC3f6f658Eaf449", balance: _1e36Str }, + { privateKey: "0x80cdf2b52aCb8bCc9cB0C9Ea36bC282Fb0721B37e2b81bDb745bA3aD2952cdBb", balance: _1e36Str }, + { privateKey: "0x6d3eC8CABE7b1D1A2DCD2Eaae87FcFed3eF1E15bE7023e67BBD08c6AaF3B66a1", balance: _1e36Str }, + { privateKey: "0xbBEA8Ef624E4a05275Ff02AAea6Cafb4dF12eCCAc5dBeCBb7A2896A151B0F662", balance: _1e36Str }, + { privateKey: "0xA0FBdAc51dC0bAeeDfCa431F64aE55AB6625d7b781019EF9b1E53cA2b296f32B", balance: _1e36Str }, + { privateKey: "0xf54dCA19D5c05dA0DC1E90e6A080ab8f30bdc0AAf42cc51feC78F5c29aBe774f", balance: _1e36Str }, + { privateKey: "0xeffB7d1047cAC0CCD461c8bAB8765aB19c2F75EdAdfc51bcd6a2afea3afCBF2c", balance: _1e36Str }, + { privateKey: "0x83eB7f66F7Db6addFbFe2C6Efc9C28fd7dc80D9F1befd45dEdaEf763EeA7de34", balance: _1e36Str }, + { privateKey: "0xC2803AA8805FdCF4BDBa5e3fe8B04799D0E2BdbC4f6A9D3c5E0FDB2C1a3c5BEE", balance: _1e36Str }, + { privateKey: "0x765427a2Ccc081D6bCBab3Aa049eA3EBBD39F8842FfA6bbb42b30372Cc843289", balance: _1e36Str }, + { privateKey: "0xEeF5cFc1e4F658bFe9d8e4abDFc9203dEEBd363bA7ABc8cd2cee196dc1Dfdccd", balance: _1e36Str }, + { privateKey: "0xbbb96cFcE91C83eAACcaffcb8eeBAcbEF2ec402D0223bd6a9b4fd2eb7CcA114f", balance: _1e36Str }, + { privateKey: "0xA59c0C47C3cDbDC2d5BEbb77b388485cEa2ccA11C77De606C4A2EA88cE8Ee40F", balance: _1e36Str }, + { privateKey: "0xC3Dc3FfBbcD3f3C9a87f05D7cB8e9e2e600eB4c8C074962fE5B04d5AF51a3Ab2", balance: _1e36Str }, + { privateKey: "0x00acCf8c3A27a0E48bC74AC22B27EDBaC99bE3b6DaE2D5333c5DCdeE9A355bb8", balance: _1e36Str }, + { privateKey: "0xBc5EEC7aA4Cddb5a5ddbAADEc538F7a30C7DAFE44fBb10aa9366f4FaaaCF3603", balance: _1e36Str }, + { privateKey: "0x5DA43DA715bD0037F53DC7306ac9B259Dfea9bE88fB7fDbc61ad09e2DAF4faE5", balance: _1e36Str }, + { privateKey: "0x5CcfD962C800CF256Ca7CBFAFE414dCf0ABDC733648b1bC7b1573a51aaDEeF7A", balance: _1e36Str }, + { privateKey: "0xAFD5164CF56A03B1Ed5DDD1Eb87faBfecB035Cef3Ef07fFd2Cb87FDa5CdD7ACD", balance: _1e36Str }, + { privateKey: "0xb4Ea584Dc36cc457983b385Ef5EEC4cD4eD113B8B1f38FBfE5aB702EcbfEDc5F", balance: _1e36Str }, + { privateKey: "0xf1e0dF7c97eAa0d4d0b3A93ABcf04Feb6db356A54Fd5CFcfdcbe5c1FDf7Ac83a", balance: _1e36Str }, + { privateKey: "0x19db7d8882Edd5c9AcbAB17FBDcCfC64E9f5Bc18BbdBc5fb5f2D00ECE02ad9E1", balance: _1e36Str }, + { privateKey: "0xeb624cFcDb9EAa0cacC9BFB542Bfa0d75Abf0dAC1F2Bd7bbEB2daCD0E2DC17f4", balance: _1e36Str }, + { privateKey: "0xF81bdbFBafE7e3E2C7DA1242E51040Acb85E74a5643A2C37f5EEB64eEB5c0291", balance: _1e36Str }, + { privateKey: "0xcbE84DdD3feF1dbAa59Ebb3F1a53fC6Ea6Eb744b5faaAcCB606EbbfC92a7eC68", balance: _1e36Str }, + { privateKey: "0x0ee4f59b9CDfCDf0dB0B1BCAfC2b0B93dA87b3d520AC984DAaFfCa8b7f4Cabf0", balance: _1e36Str }, + { privateKey: "0x2CCafd718Ba7BFD8Ad9aF69c4acC529a9FCC7dB7ce8FaD91E76dd6eD13dBcEa8", balance: _1e36Str }, + { privateKey: "0xb9e06CcB5F9DfEAACAC402477bC4cF3eEdaE72b69c9EfCB0f0BecB7FeFE2e615", balance: _1e36Str }, + { privateKey: "0x83aeccADAb1F87AeF6684dddDd8b4d81dbdd48b951AdD2d9Aa8fC42E36a56434", balance: _1e36Str }, + { privateKey: "0xB7C2A0b71F4d2D2C65fd17CC655dbB5FdceFE09C3Ba8b9174D546bdB307ECebD", balance: _1e36Str }, + { privateKey: "0xd6A8E91cae9fE3B6A526ea5F7acBef7fA9915fA2Af1CddB4E85F44e061Af7bEF", balance: _1e36Str }, + { privateKey: "0xbaB1ba450C3eEE71DB70F44224ffd87adc39EC138fBbAb2e0B193a80BaA7fcd3", balance: _1e36Str }, + { privateKey: "0x60A56b9d521cAcBDBd619Cc90de09AC5CED4144cf2175802Af0dBA7ca1Caab68", balance: _1e36Str }, + { privateKey: "0xE5FaF52Ad1141CdE8DC9655d67861fc70c4c7eEcBB3A906Fb37179fdc72c9ADE", balance: _1e36Str }, + { privateKey: "0xaf5ac1Fea23e18FB7FA2bAfdADcEf70D6a3BBeD88aBDb4D0AbF4dAcbEa9CeaCf", balance: _1e36Str }, + { privateKey: "0xa171DD68AeAFDa1A3c986DCBDbcF64BeFFBfD1C9CBD8497ED384Ee587BCe7EE6", balance: _1e36Str }, + { privateKey: "0xF5c2A2A5EcE2CE1aa0ade6161cbAeCA6aE2a701ddf8DCdb52A42acE5EdBAcAd1", balance: _1e36Str }, + { privateKey: "0x86B2cDf49df7F2CF1C8a9a6FC18eCfF5c7E1F76bE31cE7809945Aed21B32DB33", balance: _1e36Str }, + { privateKey: "0x44B4A11ea7adca721E6b7ba90ffaa3dDB7d2F68De691Ab3A4A8acFbcDe0A8ceC", balance: _1e36Str }, + { privateKey: "0xB21e7cD85947BbD0C7FeDbe2EF49E1bB5B72E44Dc03635F3DeCbFa986A43753A", balance: _1e36Str }, + { privateKey: "0xeC8b0baddf5C218d3dbeF9f0A5D93353d2Fb0436c5DD61BFCbCbADfFCCa22edA", balance: _1e36Str }, + { privateKey: "0xFD1DA8EB5152a03773eCE05Eee5816F31DeAfbaE938bEa0524C0D76B80683304", balance: _1e36Str }, + { privateKey: "0x39AbCD617Edb085E4D4cB55bD8Aa6Adb05ACC290826AfdFdb6317d40D7b9dD3E", balance: _1e36Str }, + { privateKey: "0xeF2c8d7fabCBaf8f02Db7DcEEEFE65cb4e1b5EAd36B83B475F73fBe7ff2CAAe8", balance: _1e36Str }, + { privateKey: "0x955af80d35C74fdF8caea3BBDbfD9878e155DEf8a3D2817fe40E5fdd6e8781D5", balance: _1e36Str }, + { privateKey: "0xF2528Cf6c3978c28C5F213B5e2cfbaB043A8Fa3aEfC6Cb090C9249E6ce3E8cae", balance: _1e36Str }, + { privateKey: "0x3F698969DC0919e2AfdCFFeEE653c41cbAA198bdD5Edd519E6C70B391db2DDBF", balance: _1e36Str }, + { privateKey: "0xcAAb8AD323CdC9BCAc02D99d6Ef6CBD1edB0B5658A2bCCF4Aad8511118EE46E6", balance: _1e36Str }, + { privateKey: "0x48C43F2A235FAd0300ABb6B01F545b4D57EEf45102bdA7C127EAbD8d1FEAe4De", balance: _1e36Str }, + { privateKey: "0xD7BBbc8c0dc1A27f0ad11F28FFF5c607EAD0Cdbd7fdFFf4AaDd7D1BebeFDaD40", balance: _1e36Str }, + { privateKey: "0xe3aa97fa9Cf9bbBFAeb35B0315dF48f1C70dAD9b70B8d51EFe8f0dB37a975fA6", balance: _1e36Str }, + { privateKey: "0xFA1bECc8da1d64FEf78d5Fed3CD8fD5Ea38cE396fA2fcf15AEC5a7a9ab883bA8", balance: _1e36Str }, + { privateKey: "0xfeceEE2Db29E4Fd21298a836B6947c2Bf2aFb1DD2A2fBd647Da5fcfB8c24A3Cd", balance: _1e36Str }, + { privateKey: "0xe7C1bFb15E70da8E2a66D7dc3dBadD8aDdDdb8cAebCdbB9eF3ECc86e3BE2BD71", balance: _1e36Str }, + { privateKey: "0xeED40ad248d6BdeD632bCC709d1eedea1fF0783e6c43D5fEa3bdbAa78386eE7a", balance: _1e36Str }, + { privateKey: "0x76aA17BC5B1e7aB3cB4BD7CCFcD0EEf25423caBdc17Faa8de18d0d788DFEeeF4", balance: _1e36Str }, + { privateKey: "0x1E278CAdde9E743aB1ACd3e5Bd67e9b3A1E6c5EBA5d652a2125C1A53dc908B6a", balance: _1e36Str }, + { privateKey: "0x581333F21Badefed148B1BdDbeaaeB432ccBDd15dAdD2d5FDEbBEd4E35397BC0", balance: _1e36Str }, + { privateKey: "0xBdeC9E385Af6Aa8CBF8ba9f5fFd7Fc3aA2cbb6ceeA2Cb39b6a0B8124701535eC", balance: _1e36Str }, + { privateKey: "0xdcb5d6e708e54b9B2C6CEEBaa50BE5aEF083bb63BEE8e1Be4d776DE7ED0e6A9B", balance: _1e36Str }, + { privateKey: "0x0f36b74EB79f7eC92da5d9dAB78bAfBAd3f832930676e06d93267Bf5307B9B82", balance: _1e36Str }, + { privateKey: "0x1cbEfEAaca37134789CEc3825F830f8545b6Abd4DCAba190DcAdDD214BE4C81f", balance: _1e36Str }, + { privateKey: "0x1C5e8e9b422dCc516f3e5a7eED08E0aDF26960dde2EeEeECCF9feaCAB2fF2c86", balance: _1e36Str }, + { privateKey: "0xa8F0BF0dEb341B46De7178eAdc7FbF8CbcE6f2dEdA152deddA6ea8BbdCfe0f32", balance: _1e36Str }, + { privateKey: "0x39d8DdC1412F50e37a534583e6bbb8AdF5956d15543b30d83E991E0ADE4b56e1", balance: _1e36Str }, + { privateKey: "0x217d366CEddc6F16cEAf1fED4BD40d99a10E0CAeeFd4dA8cB37D3D7F5AAEf9d3", balance: _1e36Str }, + { privateKey: "0xCD3ce1a11b4F7BDAD40c2aF9A2B4FF7a25B88B5412bBF062077CE3AE6850fBbe", balance: _1e36Str }, + { privateKey: "0x5BcBb1eC48DA3eaDCd03fEa74fA10ccc39E05fB64A89B6DA6b7b1aeF8CcA3cAc", balance: _1e36Str }, + { privateKey: "0x05C03862F4dcD1fadeefc404A710DcEBecb3Dd8C16CAed5D3815e5d2C4530F10", balance: _1e36Str }, + { privateKey: "0x21cbE7F5B2aA44ef61419EfcbEE2DacDA0599CE266FaebBCdbbB046f3Ed6F96a", balance: _1e36Str }, + { privateKey: "0x2583FAF40B56ffdB0A08ceEe5D47Bb8CaED24c0ebE16FEF6D1a30AcdEC8A91Cd", balance: _1e36Str }, + { privateKey: "0x8775Fde2ae0e0E9CFa960aC8F3407B2689eE4C9BCDA0ee4DBfbC77E2A0b21c82", balance: _1e36Str }, + { privateKey: "0xC79CC10E021A48f220BF72Fe88A16fDFC004D001cB935BFbfE473AaE3BEEbE13", balance: _1e36Str }, + { privateKey: "0x5e606FC7B5FCcF55182CBF7B0f6ccBbA2fd1d641E9b5e9f015f997B3cA8699D7", balance: _1e36Str }, + { privateKey: "0xBc7AABD30Af8a160Ee509db8bf97b7951458EfAe22fB7Afe903F325C7Fd8AECE", balance: _1e36Str }, + { privateKey: "0x478f33Cb5965B82DEd82f4400eC41FbAf718aeCB2900F3fA6E67e4B775AeE053", balance: _1e36Str }, + { privateKey: "0x5EC972Dc270EFc7D2D38B76B9DAf010Eaa9f463Eda9E8aF8dDA96a74AbCBa2bE", balance: _1e36Str }, + { privateKey: "0x02fE6A827EdB3E3bBFcA69F676C51e6c2baD47Ceb713B5E1E207bA9b56Bce1AB", balance: _1e36Str }, + { privateKey: "0xfBF2b6e02E2b2A1bc4A8f748AbefAB67Bf8aDfD5f6cf3C1e7945C2aC7d1bDd86", balance: _1e36Str }, + { privateKey: "0xfB5ddEBFCf053FDEB51A57361796dCdC62eD635B575Ea9BD9Fdb816610697cB1", balance: _1e36Str }, + { privateKey: "0xEE28e00DEca7cffADe726d84fAAC894e9AAd3eBEa06CF338B7FEB58166B47Fc1", balance: _1e36Str }, + { privateKey: "0x4Ea1C5C79bEdAcC1559eB1E3fDc83BC1e6c4964Ed6B9f1CB2bfEE3cE6f9bedeD", balance: _1e36Str }, + { privateKey: "0xD6Ad0DfaB857f4D5dAcd3e1fb74CcfcCFCfdDE72D534b2f0605FBc8291Fc0f3B", balance: _1e36Str }, + { privateKey: "0x6aefEaEbC7fFD5c6D6F1dA5cbC595195ef5cF9b459532d3Aaa5a1AcB0CD3c6BF", balance: _1e36Str }, + { privateKey: "0x7d2a6c0629C80Ca7e513dEcE64f84d9A9E9d25Fe2F0D5F74fd4F0D99d053c9a2", balance: _1e36Str }, + { privateKey: "0x6B3Ea2C23b7bdA45A14b724D486cbad761F556Cf64CAA2FEeCDdb95Ac3B5CBC2", balance: _1e36Str }, + { privateKey: "0xF67031c0ECfeA3eEfda9D9A1e4bdc359DBfb077E1008cC3313ef962B39A25d8F", balance: _1e36Str }, + { privateKey: "0xb29D4ae1AA3A8EDfAcEDFaBD09A95a65f1927C47989e9c4fDfAbD2Fb8d2bc8ea", balance: _1e36Str }, + { privateKey: "0xE60ba2bF9EceB47DA9D9E23ad025D8c81c4c2FcA4ABF5785Fb27F9DafaAfEFFA", balance: _1e36Str }, + { privateKey: "0xEC8fCc3Fcf89Aa1D8D26c661B39b5faf7e2D37dB7EC052acBB8Fe965fBDc4940", balance: _1e36Str }, + { privateKey: "0xFFbCca52ca7e891369b98cEAAec71986a36bafbaBeEAde807eC8b1817f98C325", balance: _1e36Str }, + { privateKey: "0xd57d2e5e8ee2E96b0187Ba795eA0dbbaE0b737FaBEf77C2AF767ae3fae4efDC5", balance: _1e36Str }, + { privateKey: "0x4c8c324eE0bacae3BA642bFB75336cFE7e1B7185f4D24b30A1083a9BC10f308f", balance: _1e36Str }, + { privateKey: "0xdc78AE3aCf5d085539aA83B0CCc7cecFbb73F8bf4795B2199dc58D912AC4C04C", balance: _1e36Str }, + { privateKey: "0xDB264dE9c7B6188A0Fb1A91ccaa6Bf256294ffEB9E4Ab9B58624A0e45A0a2Eda", balance: _1e36Str }, + { privateKey: "0xdFb18a34adbe760B9CBc8bc66b40c6EacCeCddaB7A2bc22115CbBF1c3A6C0dbb", balance: _1e36Str }, + { privateKey: "0xcaB1AaBA163Cb5243b943172A51AdFcAd91EAB220eB89dD0cEC2f0A3c0FCcC97", balance: _1e36Str }, + { privateKey: "0x07d8469f44C14f27bC6BF67Fe92FbFab3268Ed4824AaC00a4b3bbeEdC8afCaee", balance: _1e36Str }, + { privateKey: "0xc7eF1eB85Fbb3308dB02a6bB3f37ED60b74DFEdbbfDB1eD5FEb92b6EF0d9eCa5", balance: _1e36Str }, + { privateKey: "0xBF348cB60361C1FFBBdD1feF2DaeBc661B11Ef1517558fAFe7A1CcBAdeD2004C", balance: _1e36Str }, + { privateKey: "0x2ce070a6fC4a96cac5A0B51A2FAa67aBdbeb0496DD841C417cB9Ee0E5663799f", balance: _1e36Str }, + { privateKey: "0xeEe3B8abc45e2CF825FE651bfE9Ef33bAd1f2d78D5cBf7842AAAAA0bf9Efb197", balance: _1e36Str }, + { privateKey: "0x741534d0300C8D4B3f55D412Bee30fe00A42A5D9dcc3f15C1ad5e5Dae7edd0c5", balance: _1e36Str }, + { privateKey: "0x13DBe67fD98839DcEd106cB3E9C8cBc1C364B3EefEf3e29425e8D43207F22177", balance: _1e36Str }, + { privateKey: "0xA85e142eDE2cB5a5cE11Eb9a45a0342B60611FF83c70EDC03fCaeC52Be32beb0", balance: _1e36Str }, + { privateKey: "0x3cd3ddb1febd1058955cEcD12C0cb40a128Fd59957EbC3FfcaCfcdFaAf38CEE9", balance: _1e36Str }, + { privateKey: "0xe8E0CBe60AfAc11bA06AC2cF50E103aA4afAFA3BbD6A7891e86aB21C1cA061AE", balance: _1e36Str }, + { privateKey: "0x99f2F5443e5aCcc77c96C30eE5E9cDE260a1419B7B48e3ced99DFa52dee64dF1", balance: _1e36Str }, + { privateKey: "0xeDDfAd4A07BB5B3BB6f41D646a81F6ac20EBcEc1E9B4CbEcEbEb106984aAac9B", balance: _1e36Str }, + { privateKey: "0xFC980c13FFf7E5094BBfe8c1c0c33adadFAe77A2CdC3439D4F1e1F0B6afC14ef", balance: _1e36Str }, + { privateKey: "0xfB03dFB6BAabd82Fe5B2C24bAe8cc81dF67962ecFa3d2a3f9fa22da3865D940A", balance: _1e36Str }, + { privateKey: "0xeDd7bDda24D1Daa3E159acaEaB2F956cBECd202cdB6dE29D4c32Ed3C9c7E9dCC", balance: _1e36Str }, + { privateKey: "0xbA6e256AfbDd0ac5D2FDA5fE34f64CCB1EfaCE6Ca7B43b1BBB8D334bc594aC1E", balance: _1e36Str }, + { privateKey: "0xB5fAbDd1eEAaBCDaa3DA0d95eAC7749A6b68B8a4DE968CecCdF2144Cb7B0afcf", balance: _1e36Str }, + { privateKey: "0xdf044c8c00a43ddf50c76c4d87CFDb5E8EdD7B9a224Bd0f67ED32ad643d69Dc2", balance: _1e36Str }, + { privateKey: "0x8Fc2decC9De50973CE9df8C4Ef7DC28Cddf524beE9f2D64c38A7c50EfbcBA953", balance: _1e36Str }, + { privateKey: "0x482Dc8b8c13a46fEd9ABf27bd6Cbb2D27cdED0cbde544582362ce7c6ef526FFC", balance: _1e36Str }, + { privateKey: "0x4DFdc7ABe5D99FB6DeD2dEfab1B840aE4f0317c49FCb4c9b4FFCBBDCDE8f2019", balance: _1e36Str }, + { privateKey: "0xcDAe7CCad2CFbcDDDb4Df56B6fDACFe677Bcc73BB1e69F79401CB3cDcCacff70", balance: _1e36Str }, + { privateKey: "0xA56CB8163DA4556f6B549D505ECFDDEEEA8d70aE28EbBbdAdC0C402DB338De54", balance: _1e36Str }, + { privateKey: "0xC64Bd0D608BA514B6a9dBBeaeceD0Bc7E9ecb5bA4D605A05d0b8fAB30e5bD23c", balance: _1e36Str }, + { privateKey: "0xFBc3CBb28d9bEa8343Acca6D011fcCa5280DFFDceBa6795aa775Cd5b4Dd1B0A8", balance: _1e36Str }, + { privateKey: "0x84FAE35ecFc38DC6cd5bE2ECfbF84eC5Df02C26cdcb3000ce6ce5cDa180A96ff", balance: _1e36Str }, + { privateKey: "0xa3A78FbDf70fbD710E3AaAa9372bbF867bBEAd22C7f65A25A41e00a3Adb3dFFd", balance: _1e36Str }, + { privateKey: "0x83bE5db4985000BafD5b0ff507B5CBbE41dA6bac7A0CBA4E6EDBA3A9cDDc0D6f", balance: _1e36Str }, + { privateKey: "0x7DbA3D3f63e5AE576b3aBa9F1aCEa90c203ff6F073baB7E56acf427Ba8714F20", balance: _1e36Str }, + { privateKey: "0x1cB68ecf092fbBdd79AcDB2E9cCd967689Ca1b8BaC9938dcCf459C2a4C7A5cf9", balance: _1e36Str }, + { privateKey: "0x667e8E84cdF72241c68Ee15392431E5CC2D8C7ebAA4FEBd93E98D8DffeBBe50a", balance: _1e36Str }, + { privateKey: "0x4b0a4FEd90A9d4db2Cd9E5e2cEbBD25dA2D54Aa73fEDe3fF2fB5a750E2D326D5", balance: _1e36Str }, + { privateKey: "0xdF450b7DFefC7BFbBb46bF80A0eA5eE9ecB34A8eD1D113A05D66AbAAaF32AbD3", balance: _1e36Str }, + { privateKey: "0xfFaddEcFcfC080ccfAfB24Aaf098922C43B601CE652adaEd8bc77Db4a2a2b07e", balance: _1e36Str }, + { privateKey: "0xa20F4D5bB8FA67CAd6FbEaCa5a87BBcE6eB988D88aeC1e6Af84507Daf7Dbc439", balance: _1e36Str }, + { privateKey: "0x2F6baa7FC9FdaeBaD346FE0B5d6F4E206BC948DEbcBAE8C195db1b8a6Dc62Ff4", balance: _1e36Str }, + { privateKey: "0xBea684dfdcdE88eF05D6AF9De4Fce8EABE1e45C52C42A05cc9d1d704bBB201e9", balance: _1e36Str }, + { privateKey: "0x6dEB631c04455D0EA1ec7EfAed0a69BCEE9C05AaD05ABEFc35aEABcaA699e153", balance: _1e36Str }, + { privateKey: "0xfCC9b7Ec379c989dB3bAbFF10fa73B406dbe0Ca27bbc17bd8D92Ba5efc83DeBA", balance: _1e36Str }, + { privateKey: "0x8a5D540001DCFEdc4f8a400B11e9379dC1f5ffbeAF30f66D81193dB5d9f6FB9C", balance: _1e36Str }, + { privateKey: "0xeE03Eb8dD4adEB51DCdFFD60B71D8CA392CfDAf29D3fbE7270B3843fDe5acbfd", balance: _1e36Str }, + { privateKey: "0x8fBed0269D9Eed8C0A6dDc1fccDBBbaDDfE61cE3FdB71eE7CA6fBd8755516beC", balance: _1e36Str }, + { privateKey: "0xcCe27e128Fe331dBb07E34CCe2bF9fdBEB0a7E2Ac4ecBb3DE8Bdfaeea7FFA26e", balance: _1e36Str }, + { privateKey: "0xF4C05d399cA72CeECbB60bE5cFadc8aceFfeFdeb0E05036AcEa73f1b3bbd7B23", balance: _1e36Str }, + { privateKey: "0xD5a11C5fa09ffB8BE3d2C792EfD4d2Fc697aC2D6bb6d4Fa1fC8E14af5bE2f94A", balance: _1e36Str }, + { privateKey: "0xa2F3EcDEcB7d7e770b41bf73e9B6b1EEe4af7646A7E5a2aC9a2ea55FCc808006", balance: _1e36Str }, + { privateKey: "0xc2f92e25dB8ebbBa92daddEdCE3eDC41F7E8aedeb264724f32b433a742B9Aaf0", balance: _1e36Str }, + { privateKey: "0xcfd5deFb1Dc02DA057dcEECcBE8D3e9b77b44cBBb17dFc70a4acD78Bb39BD3D4", balance: _1e36Str }, + { privateKey: "0xef6FfEd3c0AE72B29A9D209e816fB5AA3CEBDBb174dA6bbfE5C801F4fAE61E0f", balance: _1e36Str }, + { privateKey: "0x11e430C1Bf74ddCBf8fB4981397750fbE4Eb504ead6B9aa3aFc8a2b133C5fB2A", balance: _1e36Str }, + { privateKey: "0xfEeAA3b0efcFFC42a3f1Ab6B155bfa4d4FB350fAA3ffEDcF9D7fb4dEd3C42f02", balance: _1e36Str }, + { privateKey: "0xfacB3A1F68fCde53B8Acb2f8b4Cc934D50C7FBFE36Da3deD742b19e74Ed7a93b", balance: _1e36Str }, + { privateKey: "0xc7aA3BeBAbCc4be5Bcc19bf0b34fb6c53aDf464C3EF572192072aeEBCadDdBDB", balance: _1e36Str }, + { privateKey: "0xD5a8Bc556cF3EdbeAcc9F92C2E0B31Ecb68f45A79a0F998e9359BaccB20C8600", balance: _1e36Str }, + { privateKey: "0x6BEeaa9A7D83e0aD79F1494FE254fB78685c11Bca93C3460E72fF6d9fFb8c505", balance: _1e36Str }, + { privateKey: "0x8D649fBcEc39f21829fc7Cafe9DB7cd2BfdeF4aDDd6355ADeA5a15cab2eE2cff", balance: _1e36Str }, + { privateKey: "0xba8BAD4B9ef23B43DaEc6777dC8D7Ba5d28Af9D83d3c5E8a6BaCa3A385Ce8b33", balance: _1e36Str }, + { privateKey: "0xCC98cC2fe7D543C9ec3d55d0a09fbb4625bb905cFb7Ae93bBEC422FAdbeBb1bD", balance: _1e36Str }, + { privateKey: "0xa95Be2aD481FA3dEECdB2BdB3CEfca7031f277be3C9FbCc6ff9752dc1613daf5", balance: _1e36Str }, + { privateKey: "0xBCfB5cD7c756EF6b90F4a94cF53De5daA0b6A2dd1ED4b307A938596e06A75C0B", balance: _1e36Str }, + { privateKey: "0xEfEe98C09a0E7E4F212FcdAa7C7deE072cc0Be3faacCBbc144e301B6f00b9518", balance: _1e36Str }, + { privateKey: "0x714feCD1Db6cdcb7f1d7edB3A506BfE4f0b53aF84fde85D35eCdDe07aDF99575", balance: _1e36Str }, + { privateKey: "0x438b8eAdA0fcfaf4EF21DFF136DE2CB7fBBeed9A9Bb5D6B6D4B8ddef025fBDD2", balance: _1e36Str }, + { privateKey: "0x59Ae7adb4D90cEd4dB9E7CeeE7cEBCb3f5ED90cDeB32bF5AEef1C37647CDbbeB", balance: _1e36Str }, + { privateKey: "0xBAFCFdEFFb3A78B39c0dfDef3860e1bCADD3DC87B4c8CCdf0b2DE8cDcbfa6Abe", balance: _1e36Str }, + { privateKey: "0xcCF872dF3d7c80C1Afa2d150CF31D99d680acafFb3E4dF5b0aa1fBd9FFFabce9", balance: _1e36Str }, + { privateKey: "0x707dbDc0b28E78004C7d47feE6F429eA9fa7fFd207c4B8A76A89cA276Ffb6E86", balance: _1e36Str }, + { privateKey: "0x3Abf8eD21bd8dEF543d5C043D7a3EEdECdb46690eEF3E1A45A9F8048aAbF378F", balance: _1e36Str }, + { privateKey: "0x163a0F9FA0e9e836D41ff0be900e3DAAC0e4CAb3A1817d7dAB0f9BBe5aAbD562", balance: _1e36Str }, + { privateKey: "0x6cE372AC8f90d7D0BEb2Cc28F0d622C784e0a3cec6268dBB340B215BcedabE6A", balance: _1e36Str }, + { privateKey: "0x40BFD3157bDB44af2a40099fEb896Fe68F8edCccE5f21a8C5c6C5B21e6C5dAdc", balance: _1e36Str }, + { privateKey: "0x89aB4aBc8b3F26bf83Dac8bec001b6B8F65a7300f08aBAda73bC59cac4e4a43F", balance: _1e36Str }, + { privateKey: "0xe5F066c5aA057CfdF1eE1e6D38c5A81C0c9b2Db1eEfd568d112f1bdf7AAe1944", balance: _1e36Str }, + { privateKey: "0x6147D55BAE900ad6Fbeddf4c467bbd5af2703D95d7fAFeAb40113068761CC3Dd", balance: _1e36Str }, + { privateKey: "0xD0ffE15EdD8D58653EfDcD4e88B27D880D40CFdF4c1836F67EBeBE6E31Bb6ef7", balance: _1e36Str }, + { privateKey: "0xA3AF8c89e2b19dEa7eF201928D0Ff92061e4b76cdf1671b14F41Cbdd05FE1A0c", balance: _1e36Str }, + { privateKey: "0x0dCd6eAF84147CFaa37FF5Dea20d4d95eEcAAdEa1F68CC2aFF8eeDfffCfba280", balance: _1e36Str }, + { privateKey: "0x68CA0c1BdfD992Df69d2895CAc1Ec4Eb0eA6Ab5Ba62dEfFF13A0879Cb2c1Fcf3", balance: _1e36Str }, + { privateKey: "0x30033ec8B92abceEa9B2Dcc5a27Ac2ddfaBe4765e3212A29DB8fff6B3b2Eca87", balance: _1e36Str }, + { privateKey: "0xd4Cad344fb9598aA99790c0205FEE36c34a897AFb252DB12df42E0Fa0EC6abCd", balance: _1e36Str }, + { privateKey: "0x0E385cC566BfB01fFF3C8FDE1F6AA96A9Df5f4AE925ac9FBfBFfbaE3c28C3e95", balance: _1e36Str }, + { privateKey: "0xEaBE51DB88D85DB9e7ecBf2A22CBf5c1ff67e12fDfbf1F4fEF816EA0d4B91a00", balance: _1e36Str }, + { privateKey: "0xCe9Fdb9bcb0C3B214580d5D4DBBf4D64f09C5c31AFc146B7FfaDa1f9Ba8Ec3Ba", balance: _1e36Str }, + { privateKey: "0x108E5a56C8B3BE5887CCf2a3bFd7aF69C881FE45DbdF3aCD9CFde3189eEcE9Ab", balance: _1e36Str }, + { privateKey: "0xBaC513AdE5b6c7cD4B8F4a010fa3bE71B8BFEA44d54ff0a6a5b6Fe96c3EB1F92", balance: _1e36Str }, + { privateKey: "0x1ef1E7D95D1E2bdE4ad770A425A2Af8d9B2aa8BD2dFAbFa20C2872Fac35ddc7A", balance: _1e36Str }, + { privateKey: "0x1cF35e42FC10FADFd0bC3E4A0C7ca60fbf9c4Fff34cAb91D8f3bfB36a4bD5853", balance: _1e36Str }, + { privateKey: "0xADE6b8b2a9FBb8a12F3F6D5036F1d24fAD06EE72d8A94dDa9dCfbA492FCdbb83", balance: _1e36Str }, + { privateKey: "0xE125Ac0eFBE41A6564D5840CCfc3F4F157fbeC0eCF117bdbfADEE63AED07EaC2", balance: _1e36Str }, + { privateKey: "0x2BADfDBADf32fC384Ac1d8Ec76C3b7dfeE0c9Fe65e86e2eD9AF926Eaaf316D4D", balance: _1e36Str }, + { privateKey: "0x63ADbE25a57726EDE7edD8A167C90005Ab887E644Ed153FC373d9D0E5b037AEf", balance: _1e36Str }, + { privateKey: "0xEa9E947187bB7a746DADEd402EBba4DD79B2dc99e34109771Fd834bd74801e21", balance: _1e36Str }, + { privateKey: "0x4cEfB3A9BC8046930dAca53FDEe4aDA68062569Ca7d9FfEE1CC0324481D64f9c", balance: _1e36Str }, + { privateKey: "0xCB4C4c7b1e7D1CabbF9cAD7E158D007b8bEfcE16754DCBeD1c7Fe4DaDCfa3E9D", balance: _1e36Str }, + { privateKey: "0x30dB9e898f60867761C95f8de8a36fDbaeB9e8C84EE6Ea584CaB8ceEcb264B54", balance: _1e36Str }, + { privateKey: "0x81aBC14D2be047c44b2Bb3Bd9c15daD627EB1D22143Ca3fEae6E69ae1022eaF4", balance: _1e36Str }, + { privateKey: "0xa26Ec0bFDbaBBDDCec564D8cB62fE5490aB35B8CAC7AdAEACae321dB78Cfaaa3", balance: _1e36Str }, + { privateKey: "0xC9C8a8D5c8B54b93A2aE1be9fC3Ac84eBDBC2b5fB063cDBEf1E8cAc6c93B1a65", balance: _1e36Str }, + { privateKey: "0x59D8bFaAFa292FBcb9f6BD86eF8E9e815bccB2eda7C0e938ABeC04CA0ecF0bdD", balance: _1e36Str }, + { privateKey: "0xe94f6EFeA674AE551E5bbbe17C4dd9fAa8aB856dF11Da3FFcaB5fa1d5Ac82a60", balance: _1e36Str }, + { privateKey: "0x3da8E7c26a0d5C01ABDE56aEaa5385D6ABdd968014C7daCe1FaF6946b408CD29", balance: _1e36Str }, + { privateKey: "0x8bdcC823a4BBe8CCeC87db74B5Dbda1f7Fd7C65DAE441cE0fA02BbD878dBCE3C", balance: _1e36Str }, + { privateKey: "0xDfCedDFfaEa1aD6C4F6Bc4c6DF5909cf14dD8d0a538D6a3A2c5Fd652BeD3D5aA", balance: _1e36Str }, + { privateKey: "0xac0edA10193EECf3DaBE6a3FEEa65EdbA7717aAF20Da85B5D87BA1fFD1EE3397", balance: _1e36Str }, + { privateKey: "0x0B9C8EeC93DAb3faaEcfBebad5beD8FbF3A7cF8dDAbc27308c30D9AE7Ea9F59B", balance: _1e36Str }, + { privateKey: "0xF9D2BAFA0eFfF3dCBd91c2B0d72e9cFbD3a775CA2FaC0DeCcA1D8EcAc6030A6a", balance: _1e36Str }, + { privateKey: "0xBC4F980Fcbe2C3A2350a9D0DBBC46A9ceCBCBa2fEB9FbcB4032bB3b49b48A7aD", balance: _1e36Str }, + { privateKey: "0x1E3DbFEb6D6e9b9eafbb301AB8DE2A7f6BEC85F87fC1F84791dfCc0F4001f5c4", balance: _1e36Str }, + { privateKey: "0x8a28fcd2B993BCe53af4aba4b7B82D575d3eEcBaB24ba5BE284D34ae772b1876", balance: _1e36Str }, + { privateKey: "0x81CCa0cfAd64CD74DADdfc5e22EfDe58e995C7A2dF3AF7CAAa7FabF1aC35a0D0", balance: _1e36Str }, + { privateKey: "0xfc94baF112AbA5e7bAcd557Fbd1BEAbdC19251Eb67808C5e0d7AAf3deaAD6C5b", balance: _1e36Str }, + { privateKey: "0xAeb13248De4B28015c2F9f9AbABF95B9d5e0a7b7cB6eCffE35d4fcdfece1D4d8", balance: _1e36Str }, + { privateKey: "0x8d1E2ea844eA4693A83A9e537CF024ffF2c6C4B1EFaEEd3f93d6FF39Ed52cE98", balance: _1e36Str }, + { privateKey: "0x36cC5DcbE98FfFDf004bfd67ACC6FA0c66e159a42deC26a41c3aEe7EE45C3EF2", balance: _1e36Str }, + { privateKey: "0x3094A1A521cd728D344EcDbffDBeF471fb3bE3eCCD10ccad528e1EAfDC5Ef9Dc", balance: _1e36Str }, + { privateKey: "0x4AABdBBC0C1FD66dE45f75f1b4EaaeaBa1dFCf4FB15D6B04A4FC9eeb654BE736", balance: _1e36Str }, + { privateKey: "0xE6d78BcC9Decc5c5fFA806eEf8d82B7ADf0CD3E498e5EBbb7d5Be5F845eb1AFC", balance: _1e36Str }, + { privateKey: "0xdC5A99AAc3be7E854B1db468eFB4648ea842CA23FFDfaEDf7af0CABCAD2060f5", balance: _1e36Str }, + { privateKey: "0xcAE5F28DBcd7B5c9f6ADEFC382D4C41bA8349B4b64ba1C8CaA0c80dA23b1A490", balance: _1e36Str }, + { privateKey: "0xDC8985bFBBE4bCD6205Fb0AABE0cbBc77ECab3efBdA496C65724bed9CFbaC02c", balance: _1e36Str }, + { privateKey: "0xDf1113e1B0FB2d60BFeaE72Cc9C891dEA47B1164fd88d0063E583FC5feEB45B1", balance: _1e36Str }, + { privateKey: "0xD1f6bb4785A9e5bAce3cd950F4B179DF1B5FE26D0bf793FAC3c2F38A9D132bdB", balance: _1e36Str }, + { privateKey: "0xBbc7fe8aDBA08Ea373E8f5e1fC0BFcFBDcd2919D2326060EF0ccBEDdc00ce3F1", balance: _1e36Str }, + { privateKey: "0xfC6633fe0e0a3bbC8DF6b989CdEaF93ACF02ac7c7BF4f36cD9A9e3aFe4d605bD", balance: _1e36Str }, + { privateKey: "0xAe02ae68Cf7f6DcCefAb4C5E37cd4F74dbFfa9f57da20E8b4a8aE1b5A9261AfC", balance: _1e36Str }, + { privateKey: "0xAbe503E3daFcb8F51D5Ed329aCf868b737EC5a8Ad2cCF4eeAF42BeB1b61383c4", balance: _1e36Str }, + { privateKey: "0x36aDb5f2fA4EaEeFb653cef8B69CEED7E0FcA9b29bb5B28186aa1b3bcc65Ff62", balance: _1e36Str }, + { privateKey: "0xfcDC39E65FF1cAdDB4AaE5EA1f6ae4e0d0bA6aDC81BdAf1d80dbb75b8EA4d3E4", balance: _1e36Str }, + { privateKey: "0xBbAab8EADbA1A5bebb62bfCf56f92F2ED375ae62E08E1dAE0Eea8ABEAE9B5DBD", balance: _1e36Str }, + { privateKey: "0xD7CBBABC5E8815B2DfcD7bF47BF44cA30ebd3ce43BBcDcE732fC1BD0A5E84D0D", balance: _1e36Str }, + { privateKey: "0x4E3a6818bDC3F6469cf01DeDBa0Bf380eD0874bC6b04D98C7BF3b8BAe6DCC51f", balance: _1e36Str }, + { privateKey: "0x6dbe07DADDDbc10bA4eDFEe1BC825cBbbf796F92d0ECDBEcCAAc3E2e383a9d11", balance: _1e36Str }, + { privateKey: "0xEf121cF484bdE3E42cdAFa125de30e19FF0C4b1cD03D83Aa33bAAbAfEA74B038", balance: _1e36Str }, + { privateKey: "0x6AB6D5aa6a71ea5ccfeD170CD11b6C0ab976e738a0Cc048ba283EDd55cDBbaa8", balance: _1e36Str }, + { privateKey: "0x32a82f4E3FFF6Ff896ae0ffd46D51bDD80FcaEebB3ced7e1fCdd2e5A89dBC28b", balance: _1e36Str }, + { privateKey: "0xCbdc56AAAd7CF95fc02E30B14c3Aa8Dc9d2E078B824E94beCAf3843B1F57d51B", balance: _1e36Str }, + { privateKey: "0x44A60ee9b417C401Da4fD5De70789DEA95F37af2bdFc9dAD6F8de134fED6A1A6", balance: _1e36Str }, + { privateKey: "0xAC8cbDb16DcEe88Abea749eDA89AabEFCD2814d6d2A48f9bE89beE4dFdCe0Bd6", balance: _1e36Str }, + { privateKey: "0x2e68EaC96BE8AEd9A03fc09a0E6c2f0FbBcF357407ddffb8B08f4FFebC7B31f0", balance: _1e36Str }, + { privateKey: "0x85D8fcbAd8af4BFAe3B59c6E9fD66Ac7cE2CAA8d5CCBF5dcbd65BA80B6B0ecb9", balance: _1e36Str }, + { privateKey: "0x9795cC55aFbFB6DACC555CEA9388C62c7efF6fB1E7CB2126bd8e28Ce3fdbD65F", balance: _1e36Str }, + { privateKey: "0xaCCDdd03fE00938451D3Eda3E5AaCAee8e5c2760bFdC0F4401c550EE152A70BD", balance: _1e36Str }, + { privateKey: "0xdE27885A3FfDDd579A1f2fC49CA2AdCb8FA9A2bf17f8Bb5C3bE206d3CEE2fA4F", balance: _1e36Str }, + { privateKey: "0x16fddAC6f0c53A2f55deCb2DE1cb6a5dd5f163608cdFEcC2EDCeaf272df5C3E8", balance: _1e36Str }, + { privateKey: "0xDDfa5Ca7834a41BD9B0CF9FD8b097bfB0E24BCF6369d5fBd1F4Ad8E2EDC91f0f", balance: _1e36Str }, + { privateKey: "0xC5FbeA4fCe33DEFc62dA8aEbCeCaF0badCF0eA5c3a01bC7BEE4AC49dcaE2b6cf", balance: _1e36Str }, + { privateKey: "0xf7375ADA2eE20Eb1AEaBD040fdEaF5746ec3c9fB63e1FC652DeC79ADBEc9dBeC", balance: _1e36Str }, + { privateKey: "0xE4C4E3A179F9D7B43A20592edfff7cbEbFD5a37DA2cA7E43e3281dc3f5Faa53a", balance: _1e36Str }, + { privateKey: "0xA91Fc6BFB5E71ec65b76bfddad77Eed99CBBEac0762C0A0DBeB5aaa7B9fdEA6a", balance: _1e36Str }, + { privateKey: "0x9Af5Ce21D3F9FDff4D5564EFe53dAEeC8a3D49B29aB6A1DF0f59b2cf84EB047C", balance: _1e36Str }, + { privateKey: "0xad882e65Fe7eD77587ADBFd69C3415C4CB7451cb48F0bFAEBbdc4cdAfaad9733", balance: _1e36Str }, + { privateKey: "0xC7EE373ebEFEE7c50F88efd12EeAEda1C12A00CddA4dC5b3cBa0aE43cD7030ad", balance: _1e36Str }, + { privateKey: "0xDd3faAb358f878AE18CfDbFaE341dFE5Ae5A258f7c414Aa49cE671840F3a36aD", balance: _1e36Str }, + { privateKey: "0x6246D3aaeBE3D3b7EbeE7AaC17521AEA757E2dB5ac8fEfadb7CdA125758B0892", balance: _1e36Str }, + { privateKey: "0xe7e7B752Fc1196BB1eFac88Ce4F52E4884bf64B72B626Bc0ED81d3dd86b75dAF", balance: _1e36Str }, + { privateKey: "0xBEE65fF2ccfadC89C6E4632FB941fbb2F61D8207b6eFbc3ce0bb25E8d6ba0Bc9", balance: _1e36Str }, + { privateKey: "0xb197Aa9Dc884ad7C337ACaD5bacdcBB561d382bDbe89cBBDaD01Dd27B8eedF32", balance: _1e36Str }, + { privateKey: "0x9b7dEF7a3ed1edEa805391Eb26CBAFe2584F1cFCafcb4E1F5b9bE60Eda772B48", balance: _1e36Str }, + { privateKey: "0x17caa6eF31F545E92513Ef94c298a44Dd92aDb43B3F9d72eED11AC5AdE6b4da8", balance: _1e36Str }, + { privateKey: "0x51FadA00cDACfb9DD05f296abfE0EaFc626bB6ea7EB6211d643Bc7aA69cd1eFD", balance: _1e36Str }, + { privateKey: "0xFaA73f397c75EA5A1f355fBDb2EE2A09FfEa65fdeC91D53aE3b2ED3fa00AF47d", balance: _1e36Str }, + { privateKey: "0xAb84Ca0D5E4AAbE67F6d01F6bddA29aE4e7eBCd6c9cEff42FFc97929d7Fa6Fd5", balance: _1e36Str }, + { privateKey: "0x7D9F8e884e55d0ddaBfAbd027C8b5aaCeD18d8992dB5AC40eFCF2Cada5a97Fe9", balance: _1e36Str }, + { privateKey: "0xf7Db27Ebc50Bb1cDFFB36Bcc36Ef4fCe578CFd4249d6DCbF33D99cbFdb54D4b8", balance: _1e36Str }, + { privateKey: "0xE91FC3FD5BecEBd1284bbe04b2e4C6bdC13B161623748D1ed8CABA358C9bAf3F", balance: _1e36Str }, + { privateKey: "0x87FecbfAafCab372bd1cA2e2E2A2b96EE5f16B00D02dDDA1Fbb854D211dc5BeF", balance: _1e36Str }, + { privateKey: "0x0e2eC3BbcE6eeeF0742d705053E16ad212A5798ccADc8FEEF5EFB3Dbd94dfb7E", balance: _1e36Str }, + { privateKey: "0x8EAbBf1624c4cbEC1Af6cA2E2CCf0FcDeB3E0683D1f0D03FffDfae44BAfe220c", balance: _1e36Str }, + { privateKey: "0xDFf624AA4B131BEd5E8A0dfBDEF7EF7ab0FfBAAF0fF6D2dd491fFF1eba9EBBD6", balance: _1e36Str }, + { privateKey: "0x0Fc76fEFf2c59d55F47fD2B1ca5FeF7AbD0ab62dF8ee2BafE61178F0bea480Ca", balance: _1e36Str }, + { privateKey: "0xD122150Ff0bdE00Fef37D3fac1BA923600C5e43A5DBC9CFB94D6c0eC31d61fDA", balance: _1e36Str }, + { privateKey: "0x9DC8bB17BFDBab85EAa3C490c3Cb34ACf70566baBF4E8EC8c7B2C496EB0Bd026", balance: _1e36Str }, + { privateKey: "0xee5d3bEfAcfBcD2DE7b4DB3D0eb5D3D5cd59aeC3ccC1a9AC7EBbBF16a3Dadd2B", balance: _1e36Str }, + { privateKey: "0x2ddC7FcBD743C0bde774A984caf7C5f7F1bBD7F89EB2Bdcf8cACdde9eBeEFB43", balance: _1e36Str }, + { privateKey: "0xB8DbfF5dd53E5db22Eb3FE52A4E9cD166FCfDFD5188d6AF9eb380c23eBc7dBb5", balance: _1e36Str }, + { privateKey: "0xF7eAC55d10F1F1A4985cDcac40CD6997a8EAc06c30fA36a9Cec9BF5E08d807Fb", balance: _1e36Str }, + { privateKey: "0x4FCB7674f9dCF4cF43dB8bf0fb576DffeAe0FB5Acd5C6cd9fC09E9dCF49ADB75", balance: _1e36Str }, + { privateKey: "0xED0270A3a48Df5748EdAe6248e1bcEF19eFFeC9bc06B296DEEBfD5eACbdB232A", balance: _1e36Str }, + { privateKey: "0xF11Bb3Bd5DE647A5ecEAff38fba477Bb628be67De259aC4604CBA9cEEa8DECEd", balance: _1e36Str }, + { privateKey: "0xaf4FBaAEdF31F081Bb87423e9377a16eB9ad3cF2EE83613EAd3A45a9Ca6cD3bF", balance: _1e36Str }, + { privateKey: "0xD4EEeBcD2Afe45Ec3bE688e75613Ad157EDcb639BEae0f50C3EF4a39Cf1Ae38c", balance: _1e36Str }, + { privateKey: "0xF3Cb7434fEfEB2cb8F405fFFfDeD8cC9CBdAFa3f91EFab9fB0Ff3CAdC9dE7c8e", balance: _1e36Str }, + { privateKey: "0x13B0C00CE33fF846a85e3BcCe2cE1af8Bf6F0aA970108D8428104bd9aAB37eeE", balance: _1e36Str }, + { privateKey: "0x1A791413E030E3cf5cBAFb66F38be30f5cac2beAffaAC2e1b5ad90bac3dfd2a4", balance: _1e36Str }, + { privateKey: "0xD1b9b1eD434f34d6d6AFAcF0F9F0d89bd393a312217fecDeeDbDb1816A3bAbD5", balance: _1e36Str }, + { privateKey: "0x1A9B1DFF6b2f7D50a2f3cde98832Cb0afE104f0E3f5B3Eb13b3eE1a15aEdd351", balance: _1e36Str }, + { privateKey: "0x119263fD5A3aFcD6045b342d6B8DDd550A5D5C434d9fE3f710AFC873cE1B8A65", balance: _1e36Str }, + { privateKey: "0x4B58477C9A99abFB76b1534BF9A0E2B361fb7Bb24A012aebfCa9c04EAe0adb6f", balance: _1e36Str }, + { privateKey: "0xc0E6805251EB7cAFFfd8142cEfDcB0A1ecc51e19Bfdda641FED9Cd4013aDA684", balance: _1e36Str }, + { privateKey: "0xFfaa2e042bd5abfE8A9ADE87585c8fdF06B23e6D7cBb33dcfa54AcDeA232d6bE", balance: _1e36Str }, + { privateKey: "0x6d9DE1d8DfFAB66920D681a29eDCbAfAb241Effba02D5D5E578E776C0baF2aFB", balance: _1e36Str }, + { privateKey: "0xD54C84B9E06a7dfFF4D2a9B935E4388E431Ce2fEa129353FaFE7E1D1f60CdCcE", balance: _1e36Str }, + { privateKey: "0xFC1EdC6EEFeBe9Bd2C1bd85Bd2b0dEe8CC1a3F244CB06EaDBfDa3374beC2009A", balance: _1e36Str }, + { privateKey: "0x3cEBaAF9Eeb4D1e1Ae9DbF718C357f17181dDdEfFFC227012FA6848B37cF30FD", balance: _1e36Str }, + { privateKey: "0x3A4CA9cc6cac7eFA8BEFD2b7B6cA4eD10deFb20EeE3FAA5B5fe75c2d28b9BB16", balance: _1e36Str }, + { privateKey: "0xB1682AEFfa797bffedE3E04a7f0fbdfBbBBa68eD3F06b40B3bdD6Ee6a1b23AAd", balance: _1e36Str }, + { privateKey: "0xacf0DacC07571dedeAED8Df7Aa2Ff4a3E55FaA4D5B7A6efC719bC5E6a2D2B8a8", balance: _1e36Str }, + { privateKey: "0xB2004e04AD5Fddb4E42D6C7336eb631dE66faA7DAe26Fdf2933cB0DFF5081010", balance: _1e36Str }, + { privateKey: "0xC0AEC7A3dB5De6d058D7AfAE9e3Fa27beb03E7C4013F30785EE5B4B3eb5Aa7e1", balance: _1e36Str }, + { privateKey: "0x4e742f922E2e6D08382A92CD6b8C1DEC790C1491C2e8DfaC6aD4d8d8897BA4af", balance: _1e36Str }, + { privateKey: "0x1CF97ac25A0FAffe1fCcA48cf8f3568C3efBD7cbA14bd31f6Ed12dd144cFE2Fc", balance: _1e36Str }, + { privateKey: "0x4952D74Bad3Aad3af7dD72Be1eF4f2AfaA30Bf39dc2A9B385EE4bEFAc2C05ABE", balance: _1e36Str }, + { privateKey: "0x569e4A45B022B6cFc6adfeC4C5fde36A6c02B016e6a6f5ea5FAeB5ABFC3B2b73", balance: _1e36Str }, + { privateKey: "0x6Cb0f1b7f1306F1C8ffE4104bD8cCB7d58AFcf6ADBC4EDD952d2A0F1AD6fE3C2", balance: _1e36Str }, + { privateKey: "0x75cA12bcFe6CdBe8eAdbCF5e06E3495fb07B4BcdDFE9A1C1CcF7114ae81B64FA", balance: _1e36Str }, + { privateKey: "0x2A5DfFAAD6E68a1DDDC70AbD071B8e532Be99190cBA1E6A81C6A9C8a953E6f5D", balance: _1e36Str }, + { privateKey: "0xE28eFDfcb5D7Fb1EB9f3BD3BE4398b6e104E83fed8717a12a5DD073fF9cFA445", balance: _1e36Str }, + { privateKey: "0xdE1aaC5De2466Ff0d394b2CbEccaeaA18573e1BcbAb6B3D811e7ba49a2d44Fef", balance: _1e36Str }, + { privateKey: "0x14DAB09e2e0E3aF98Dcf620A2Ee9bEE3b3EE20ABBA1023066965DAe04cFd89D3", balance: _1e36Str }, + { privateKey: "0xedbfeaDCd77B0F227dC5d68FEce8fA37e7A5D21FdbAE052ACF57cb6FedC8eed1", balance: _1e36Str }, + { privateKey: "0xbFAfe0DeBf83D6beAfc13DDeC6498b831BCD1E6AA6A8Bc693a9D31BD1AbC85aa", balance: _1e36Str }, + { privateKey: "0xE640ee1a12DA75Ca5825Ae8aC6B6Edb0fC5DBa20AFf35aF03eac0179Ae5e2AAE", balance: _1e36Str }, + { privateKey: "0xF64562e905E8FAE2a6447AFd0FAC02a3ff7e61147D388EaCFC48b0Bd9dA3094e", balance: _1e36Str }, + { privateKey: "0x6cbaE40CDABd6Db182fD43FFadB7DEcA9bDCb1aa3FcC95bcfA899f26ACE23F32", balance: _1e36Str }, + { privateKey: "0xe5eA053EAda1f6CdFFdC0A5f5Fe3c794e1Fc832288AA0Ee8Cc2b6C994FFAc27C", balance: _1e36Str }, + { privateKey: "0xED17FaA5c1AF1EF2Ca7EfebE6C6cC6e7EE6277bbE07Daa9fBe9C3de50b4F6b5E", balance: _1e36Str }, + { privateKey: "0x6c85fcbd6568c50b9Bbbd1ac670a090DEEb9354c7A55CD6DcFb9457015EB5aeE", balance: _1e36Str }, + { privateKey: "0xdfc4F15EA695C3Fbce4DCc68a5fa1FAdA3e2Dd3Dd6efCa635b43Cb78bAb7e8DB", balance: _1e36Str }, + { privateKey: "0x9CA9A803a72BDE625e88B4eE76417d76EEEBA06cc4D6A34eE21CcB8dE8355cAB", balance: _1e36Str }, + { privateKey: "0x3aE0FCFe2D4dCEAef36ba8dd77d9FBaCdb0ABBb319Ab5E35bE5d066fa7F1A0bE", balance: _1e36Str }, + { privateKey: "0xC9fb278eF294a4E76Ac6eAD7e07B5356aA1cFFa0398ca8917Ae50046AACA2d3c", balance: _1e36Str }, + { privateKey: "0x5aBd85AdfEA6F6C0105A95bAe64245df89E3Dcb981A215DFB1cc8feBDbE51309", balance: _1e36Str }, + { privateKey: "0x34eADBbEcaF8AcB847Ecb88C1FDc7DF7AAff7d29dA6056E7ff46ec6c2ddA1c83", balance: _1e36Str }, + { privateKey: "0xcEA9CE18c75de3C9de8fEBECF7a4083B3682dAbB015cFa24ddb48403aBabbF44", balance: _1e36Str }, + { privateKey: "0xd0D92cf7F48a1bAA7a191cbd14551DdC2298DC01Df41E00FEdDd4e332C0BcCc3", balance: _1e36Str }, + { privateKey: "0x8C06fCDdcC8910Ffd0cF2BCbEAFadE311e07E41c6d1529ae8A9286708fbb419b", balance: _1e36Str }, + { privateKey: "0xeAcc09aBF39adA7787ccBc0ce7614d4BF7B3fdebba62cA5fcA54bC6B8beBCDcd", balance: _1e36Str }, + { privateKey: "0x43843a03FED086124E9E9412eD4c239cDC3c0f0d6a082Ee11Bcf619Fe7fc20C7", balance: _1e36Str }, + { privateKey: "0xfE9afcc2b94aA9f36C7B5BbE2E38DEBB6fB2f1cdeEfed73cfEE7CBebA2dD75be", balance: _1e36Str }, + { privateKey: "0x86dE879706AF8CEab8FF52e7B2f868aeC684CBD090DEF0c31Aef6ee883B6376D", balance: _1e36Str }, + { privateKey: "0xfB3bdaB2695F8A83EDf72Ba8aCaE5C2B39Eee8E2E9d537DB096C6CbBeEE06eA3", balance: _1e36Str }, + { privateKey: "0xEEe76B8a06dE1A1eb06caFe7Cc7BBeA3B6988a8c7F7A68F8FA15acb0e93d08cb", balance: _1e36Str }, + { privateKey: "0x7c3B1b28cFbcdCEaFF3AB6571ddB6AE7F2b5a8dCDd662B3cF8B3A776DFD7F98D", balance: _1e36Str }, + { privateKey: "0xB34a3a5D78f971EEb981fa80FB0e6A58Ce05A1Ba114aA5AEBea2eb9ffea11e31", balance: _1e36Str }, + { privateKey: "0xaEecbf1997bFb16AABd10deDEC3e8E35607a9318EA674fd02AdCaEf2ADd6C5dE", balance: _1e36Str }, + { privateKey: "0x5fA879ecacFc908Be85f4Cd86c9E7BabECCc1D370E15Eb43DE1c189EB1007D5b", balance: _1e36Str }, + { privateKey: "0xDFcF7F9D2bA7a827Ab9a9C9efADE033DaE278F29D83C63F2ffFEEC0cAbEB53a5", balance: _1e36Str }, + { privateKey: "0x2ea09ffbe13F7Ec873bbD2CabbbE03E03D890f7F1e945a5F5bbf3CEE1eEad2BD", balance: _1e36Str }, + { privateKey: "0xdeE5D3565B304EcA2e6AFf98ef43D70Ecc6F8891f6E5439e587d2b6Aaa6eeAda", balance: _1e36Str }, + { privateKey: "0xf5aC589Bc0F8f34EFD9040401CcAAB15E6A02bE705F9c4584e9edE95b9F1DEeC", balance: _1e36Str }, + { privateKey: "0xEC37cdAceFAad773f471cDEf86B5ffeF71EBBcCA4A0fF216ec7145a6d3DA8cdF", balance: _1e36Str }, + { privateKey: "0x9aCCDFBDEdf12FA7613cFa96C9Fd4BE2B5eE6C3880CCEAdD7A356a720ceE9b9B", balance: _1e36Str }, + { privateKey: "0xaD5F5A875AB4DEE5aD3F93059ee23c9D2BB9d23A1ce2E5Add6Dc4F2CA3B5Bbb7", balance: _1e36Str }, + { privateKey: "0x4215B8c7f0eCAdacaBD7d5Da87B8CcECFf74C4EB3E91BD27dcF7feb8fBD1dE3f", balance: _1e36Str }, + { privateKey: "0x4c051E68E2B5b056379f500E95e312132C44DE84dd637ca4150EEfae41aCfBdc", balance: _1e36Str }, + { privateKey: "0x3aa945266cDD97b4c19045562AFFb2D3bf0d4F63ACD5E15a0EeAcA65C2eD85fE", balance: _1e36Str }, + { privateKey: "0xAC57f268eaBBA0e13ECeeea1780818c3cFac17623d287c5ad5Fcc4590fe82AcD", balance: _1e36Str }, + { privateKey: "0x453a0dD29016dCFfd21C7BDaaF7783488FF6cC1FDa3fccEAA832F284fA9Be83f", balance: _1e36Str }, + { privateKey: "0xAcA21387826da43e4aDaf540247D00bfd2cFd3323BDfebDE830449fb99FbC47F", balance: _1e36Str }, + { privateKey: "0xFDeb8788BCE849c169ffb03880a88Dae1242aABDcAf4E4C87Bb7e1cfEC669D44", balance: _1e36Str }, + { privateKey: "0xE82d0c7A0ACa07c38368f4Eaf5B84fFFFCA008de4FefA6a29DBA41ABeFaB33Ae", balance: _1e36Str }, + { privateKey: "0xAb0C7f0Ec2b80fA1a9f24B33BB0E0DeFe6Ca9E59C73F4aDed9158Dd90c8c1d5f", balance: _1e36Str }, + { privateKey: "0x83253fa82C8d1CE59AacE5A8bEAE8CeECcD67fFAEBacF5afcD852AFddcF6fEAe", balance: _1e36Str }, + { privateKey: "0x333cF338D9B19B7F8fFEeD6e1b1DcFaEB3CA0ebF2B88E204cf94B8Caf1BfAf9c", balance: _1e36Str }, + { privateKey: "0x8BA02c034fBDdE7AFa0bbb8B987a76CE64deBB9AC41F7ABFDEEE2B2Ed931F8F7", balance: _1e36Str }, + { privateKey: "0xAd286026FBeA1Fc9Ea7BF3ea6ad8e9DcfCa906aBcdBee44652c6C7df8014dbfB", balance: _1e36Str }, + { privateKey: "0xeB40c44Cea0AbAbD14ac3EC65ddc6A4E505D87cDa732932074a1Df3F960ED9Df", balance: _1e36Str }, + { privateKey: "0xACDC321B9Aef943b39De3bEF9fb605515Fdf3ecD2C32aeEee164fCF2b2efBBee", balance: _1e36Str }, + { privateKey: "0x8890f0F13CEaf7fB73F49C5b0aADD3875A3A7Db2aFdd5c265DF0B3DB95FeC8B0", balance: _1e36Str }, + { privateKey: "0xE73A396E2e59b0c67AEac6aFbEb3317cf66e7b5Fcb01afCb7881c3D2Ac8FBb7d", balance: _1e36Str }, + { privateKey: "0xAcFFEAD041586AAdBbc469FbF3f3ab3BBfC4c1fB9cD5EEb913Ef45CcBeb1c93f", balance: _1e36Str }, + { privateKey: "0xABbBbBe029BFFB939ad609a964EA219fEB512B243EED4894f7BDBCE1EdCD22BA", balance: _1e36Str }, + { privateKey: "0x9E65dBbeeA0Fdc8aD43de722a4c85f69Ec9Ea863BdaeBdf76A821cC1B8Fa6bEa", balance: _1e36Str }, + { privateKey: "0xD6FbEe0391305458fbE2fAaba3db11Ad9B6Bf81ed82DFA8F41fb5662F178f35B", balance: _1e36Str }, + { privateKey: "0x3b5a174AbC1E1a8191A9D325Eb867Bd97Ea790B9f4DA3a12EEb7E21dD76B328c", balance: _1e36Str }, + { privateKey: "0x075EdAAfc15f218502Ab2561Dc8A89a374586bdB96d1d7bdBDdD0b281Fc715EE", balance: _1e36Str }, + { privateKey: "0x52d92ea5Fd62aafe0fE96Ceaf8Acd5c6AcEa8Ecb9fD02148Ff23DA0AC8b9f21E", balance: _1e36Str }, + { privateKey: "0xF2F0b801f0B4e939bc7DA32c95C84EBC5BBe59F4D0Fc7Bdd5E0EFbFbF8a64967", balance: _1e36Str }, + { privateKey: "0xDc239FDA9a0859D0057CcC5F433EADCc49FA9Ee5503EbeFaCDeF4633CD14AB2F", balance: _1e36Str }, + { privateKey: "0x6eA7F30feaf205c1868524a1ACc328B3Ce5f6f23d305A6b05aA28DB26BDa6EB2", balance: _1e36Str }, + { privateKey: "0xFAba7a4845A9fEb3C79dA1F0EcaA2be7A4086289E3DDee49C7dDb72B1EA92dfd", balance: _1e36Str }, + { privateKey: "0x9adE34b5469fC3eE9Da029eECbD06BA53cbad5FE4B0Ad8a03c9E0CEB7564faC6", balance: _1e36Str }, + { privateKey: "0x3EC655DaC1e67FAd1833cBAA3A6BBA132837Cf1DB219Fd9CE91CA1742BF6a01a", balance: _1e36Str }, + { privateKey: "0xB7BEA97eC2900C1a4F8e97A4c4FBFaf52Da3B0dEf9d82bDfa8Eaf4a56a7efdf7", balance: _1e36Str }, + { privateKey: "0x1B63D8AA4Eb2EF8cFADE8E75917BeDFB6DcD62B9dcC5cDC562B7312d6E7BBeE2", balance: _1e36Str }, + { privateKey: "0xae3E26D059aeE78FbbA2EA50FEBBaf8223069Ba0E2fCCb6AF91dCfEd0e3Ac160", balance: _1e36Str }, + { privateKey: "0xf0Bc670B9d5ee77E4dB8Be87113fE2B838bc9BA5EC6AFcEA0B7b9E5E7c4BcAA3", balance: _1e36Str }, + { privateKey: "0x834A781a2fdECbb5fdA18FAEEeBc2b8661C8C9528cA25fecEc2F8Dafa526c9AD", balance: _1e36Str }, + { privateKey: "0x5dD92fdc8bBd655FDfF9C0D487f6153dB35EdDA66c0a99a3edefDFcd263b672b", balance: _1e36Str }, + { privateKey: "0x5A3867C3D9cF4EeBcdAdCFc3B8ad620C2Ba1685ED1831C7E3Aa46a3a5edC81Aa", balance: _1e36Str }, + { privateKey: "0x5Fc84BC3594C78b18fEfAcAe400d5bd8f92B9781c04F38f7f68b8Fa1e2Ba0F1a", balance: _1e36Str }, + { privateKey: "0xBCF2af3BD42fDD11Bd6a7A1cBaA4C7eff1CDF0C7eeF772cca24Da8251C39EBfc", balance: _1e36Str }, + { privateKey: "0x0CDC9ba2491f4a12BfDfbc88Fc3A5828DDd6CA0ed0c24192A4855aEAEd73feEf", balance: _1e36Str }, + { privateKey: "0xbBa7af45Cf2ed5d0DDBca87eBaFf5c0FBD768c54ECcDb430F1bD86B66D253323", balance: _1e36Str }, + { privateKey: "0xD73EF609380f56b17e51A58556155FAF1Ee459e0cf72Aa436fD6EEEaa8a2f9Ff", balance: _1e36Str }, + { privateKey: "0x253Cc5febb863bB580fD5aeDC8CE7CB879F8aEBF1C2A503Bd909bA9B57D92136", balance: _1e36Str }, + { privateKey: "0xB783db55DCfBc45dbdFFb60E612D04492eb7EE3e0B898a5a1e43D78e0eeea522", balance: _1e36Str }, + { privateKey: "0x69c7Ea51aeaEFaf96212b2d28B1daEdA9Cb4fA21aDcdE06412afa12AfED45306", balance: _1e36Str }, + { privateKey: "0xEc568dCFA000F1Cd0db8f17cD185AbBcFAdB88dDE8a64ad8dEc261913C6DBba8", balance: _1e36Str }, + { privateKey: "0x9e631FCB88A2B593818DDA6cf81fEc447a5Af9deb77f3A986A0c7c74E7D3EF8a", balance: _1e36Str }, + { privateKey: "0x5f0E9ab4B5CeFF6CDdD4F78C13E86cBaF4E4df5b729F1E16B9DFE2Ec5e46A1cF", balance: _1e36Str }, + { privateKey: "0xDBaCC98111ba14Ee31e9ED8777660DCB97Ce40dc5cF5DE69F165c63adDC28Cb4", balance: _1e36Str }, + { privateKey: "0xE87C91Bd989D5a9eb7d120ca25da7A25bf8ebE86d4a3B9cC1B3E09c1C58db3d7", balance: _1e36Str }, + { privateKey: "0xDE4aD389dcF8DF1b1caE8cF4DdA4CfF7cDAdc5B5a23BBFca2ECCcF4AbD461FE8", balance: _1e36Str }, + { privateKey: "0xfdE6633f3aBd558e28ADdd3d1aD3839E8713735cBdd85fAff7A3aBAb8cA691B8", balance: _1e36Str }, + { privateKey: "0x3c96e806cEc3f4cCf876CfA37dcd53AeE1c1A5aE7CE39035B2bEf82362A1E830", balance: _1e36Str }, + { privateKey: "0x40e68C840815FcaF97BdCeaf3beaDe6e03348c7BC3fD9bA8deD178aBc5233896", balance: _1e36Str }, + { privateKey: "0xBdf2cdb7c0CbCF395eF6BAB2bFd1679eC5a82Bed061Ae52AbAee00AEc60C1CB2", balance: _1e36Str }, + { privateKey: "0xDf1A11ccD21EdBe679d06f34efDe03068F171B6f47c71fa2E04fAcE00fCe43aA", balance: _1e36Str }, + { privateKey: "0xAf69cc6B32E02B4Cf66Dea192AD06973E45ACadef2c9fA179adbD1CF02bc04C6", balance: _1e36Str }, + { privateKey: "0x3dEF97AeB6FbE3495feE1F5925d8f3bE60aEB463E6dC39B8A586C1Fcc7603eba", balance: _1e36Str }, + { privateKey: "0xCE8b10D29FB25EbDB566aFB6AbdaFF0C27E02c6A5F43E9625860638317F00dA0", balance: _1e36Str }, + { privateKey: "0xBFCB6351C9bDEf5E1C6E4DF51EEBeD33edCFaca35cBf7B3B97c25cce7edAb380", balance: _1e36Str }, + { privateKey: "0xF4A7591de59b833Aa4FDcaFe0ABA2C7eDF9DfA43DbcC6f7F568Af7ddDBDFF50d", balance: _1e36Str }, + { privateKey: "0x6AB2d35FfEAFBC1BB2f13B5A6A308f97fFe11FE2e76F825A27794325DB2Ec1ca", balance: _1e36Str }, + { privateKey: "0x4f32bdB88ADD636fEAdbd999b1c6a5EF378ae941fb6C0b77B3bD84E2EC0E875e", balance: _1e36Str }, + { privateKey: "0x7cB5cee3f0653379F9AAFFCE0C7af0F454bC2299932DD2421ebcBc2EBAcbAAda", balance: _1e36Str }, + { privateKey: "0x7448AAc0503965eFfbBCC446F6EeC7c1563B74c3FC9B62a95E011dac6A5a63E7", balance: _1e36Str }, + { privateKey: "0x153E8F5C1DD71EDAF5B0B433f65bF19D36455Bf8185d6aFf59Dc62261852f7Ca", balance: _1e36Str }, + { privateKey: "0xAf47350Bb5ddA5A2Fd36CbEfb32deCC587ceAcb4b4eF6fAeadf4e3Caa5A5cc90", balance: _1e36Str }, + { privateKey: "0x251ffd49DEAAbABbFE4bCd027c0B2aa33B6f12Fe6E6b5afac4D4347D70831ca8", balance: _1e36Str }, + { privateKey: "0x84CC45bF6dd0aE47D78F63b7BBEBBFE6d02c9eB1D69ec26Bd9c09c2fF7F3f8F1", balance: _1e36Str }, + { privateKey: "0xd552e3E0B7aCfbB3876972Cd83E74eF5F4Fb30578d5DD959e4450EeaFDddeDfF", balance: _1e36Str }, + { privateKey: "0xDd42AfaB5eDaA95ac60fbcF775dF9b6d9c4aabEFEBaA68420ECe4Aed056Bcef8", balance: _1e36Str }, + { privateKey: "0xFb4CBEdD311b5AaF4D2e37800b6dB32DEb9394d03Bff0dDAfC1Cce59DaC1FFEa", balance: _1e36Str }, + { privateKey: "0xe6CF9C7c5d3DD2cDcedAAB0CAc4dE85aF3e9347ddAdcBCFee3CA4Fe6D28cB88E", balance: _1e36Str }, + { privateKey: "0xd3A4DeaFcFe539dfE8f1A6e8dc3a8dDaEb4516bC44d9bD6a9243DcBb30FB75A3", balance: _1e36Str }, + { privateKey: "0x11EDAc3bC10EfecD0CD375A0BF13d89A983344bf9B22EbE2d9FC6EFfb80Bb2Bb", balance: _1e36Str }, + { privateKey: "0x8E782d3EaeCdA8c54DA8ABAE38Cbfb2bfd602FF7215CEce826Af5Fbdf1fb467D", balance: _1e36Str }, + { privateKey: "0x71f6eceF5AADB7Fab94bCf7D2A08F4B16ef68Eb0372a535442Ff83ca2b9B77A2", balance: _1e36Str }, + { privateKey: "0xAFF096e96B9a7Bdfd6ccdc39AbF651fBe0eeD4E205Be3339A2Fb7fBf49e89E4a", balance: _1e36Str }, + { privateKey: "0xc3Ff65464AeBCCD1a16Dab59fAaaFb19aBbd3a9125262e5fa9AfdBAF784cA0E6", balance: _1e36Str }, + { privateKey: "0x5764DCeF70FD8D6d7B6f55c7eA5Ee62ea6bA43e930dDdF1E9DD9CCa85e8174Bb", balance: _1e36Str }, + { privateKey: "0xD79BBBAAb8c3355C42b7c9FFb4F81EcAac4eC921fA0a05D91aee2f6EA00b61bd", balance: _1e36Str }, + { privateKey: "0x63345BF93540bEDB80aBA3d19B51F5ffbc15A603C3a0EDC5E3a59b04fA991bd4", balance: _1e36Str }, + { privateKey: "0x385dF5caB7d7bBbb9FbC92D1EDEf78588cBbD46719470f9f32Aa5cDD5A0c29Fb", balance: _1e36Str }, + { privateKey: "0xfE7e1bA71e0F2Cb1c9dad07c9DDB980EF3Cdaf13cC57fE6CaBbecD8DF19ea99A", balance: _1e36Str }, + { privateKey: "0xCce7F23c1d5DDF28fc6F2CEEf6C0d21042df9baCF769Cc20a218966e57006C4b", balance: _1e36Str }, + { privateKey: "0xdCAd70Ff4468Ab5edFebfDedee5Bb10B27eee2Fb3eEbDfD5B8dedD6bB84AD9Ce", balance: _1e36Str }, + { privateKey: "0x3BFB1b46E3CdF64469c8fF5A2C8A067eBEAa014fC8ae14B8A2BD6734be29d02D", balance: _1e36Str }, + { privateKey: "0x3E82af9a9DC1EFFebFCA6DAA8Bb63EEC129D0eEDBC14D2ACcDfebfff11DBfbef", balance: _1e36Str }, + { privateKey: "0xF4CB2d0A9a508BADDfCDa402CfE5dFB4AdE520BEa3daf1D6Ff5dEC4c35b7317d", balance: _1e36Str }, + { privateKey: "0xd99d7eA3B33ddA5735A17b3B5eDeb11eA5c1Ee1F93dA9Ad3DA1f4ffC3a822Fb8", balance: _1e36Str }, + { privateKey: "0x6cAd93AadE1442A94cDfFE0b7dA02e0C8dEB6eCEd501f2BD433F6852ECbC3bfa", balance: _1e36Str }, + { privateKey: "0xb03f948e1731F97567BaffADEc55aBf3AAdee2dAD50bb10BC1b2b1abFABdEaeA", balance: _1e36Str }, + { privateKey: "0xB39Fba81c809499dC8E4a343A0F0cdF7c5Bbed3cD2cbA693d1057Df9E7d0CE55", balance: _1e36Str }, + { privateKey: "0x07A4E933B6aEbC27ccb0E8E2E099aFa0E5bAEf4f2Dd6dca97cE30293ebD424e5", balance: _1e36Str }, + { privateKey: "0xEf03De1d11adCBfB8C5dFe5Bae858917b64B8CA3ce2EB66Bd838A4089a28FdDf", balance: _1e36Str }, + { privateKey: "0xA3cCB3ECDb856eb1FEF7D254Ec3BB4B54eD5fF47deCB994630bBEC6bCba0DFB4", balance: _1e36Str }, + { privateKey: "0xFdC9deAB83e6eF5c81fB93BBBc1dBC6b4Ccd4c70062729325D3BE4e38F3dDDea", balance: _1e36Str }, + { privateKey: "0x5D0afC0b07AD3DB744FFe075FC8895BA2Fb65fBFa09e246B73b5ef1bDD1cA70d", balance: _1e36Str }, + { privateKey: "0x6Eae1dE8A416E69Fa4EC1EBECC5f571C0DfeF491a4fd02FCCa42BDE0026Ccaee", balance: _1e36Str }, + { privateKey: "0x9C2bf2fCBEAFAaCA4cB9403bfB3c8dd2C8b0840a498BBfa729CfFbFd3d8aE5FF", balance: _1e36Str }, + { privateKey: "0xE23d7aA7e018ABD14Bf41E8aFcbd7CAed2D67e9b00e9402ADcdd156AbEeb8A9f", balance: _1e36Str }, + { privateKey: "0x9F1aAccb4CFc39Ebf3F42E7dB0710ef526d869572Eb3dC22bbFACcbd252ae6C0", balance: _1e36Str }, + { privateKey: "0xB8bcEc5ff2d4BA1f91e8Ed92D90D4CBb50e968dedb5a79acF4a3aa7A5fCcDa1c", balance: _1e36Str }, + { privateKey: "0xD3aaee5ACcfB2DdCffA259065Bc184F4e7DEC1aE8DCABDf18C4b4fc2abA1c218", balance: _1e36Str }, + { privateKey: "0x8A4948Bf12EdA92dEEa3Ec9338ce2Defc58af2bAaC99d5E50fA3fcEBBA542FAc", balance: _1e36Str }, + { privateKey: "0xAc0bB26d9cD75969c31A2A2f8F6e4DFc6510B43A86d1679d04aba8cF8F225711", balance: _1e36Str }, + { privateKey: "0xACbB5b5E6e1A61CaA2E53Ee1cFeb3A9458fae0C53EF764608aB0ed27305F5eFd", balance: _1e36Str }, + { privateKey: "0xeBbaC1dbBba6a56A9FdaBD5FE9Af262c3C85B6467a364fbEc6E34d0FED1378B9", balance: _1e36Str }, + { privateKey: "0xba802E4CE2EEE1EDBEb9a03Bc5d1fb6E99f1EcD5a107d2DDB5FDC3ADdFB7a6B5", balance: _1e36Str }, + { privateKey: "0xaBbB7bA0e420F514FdbdBDc47fDB90C717eC0E6CB1c7E22e04feFf0DbB59B82b", balance: _1e36Str }, + { privateKey: "0x0aDea8abf38abb72E1cd3352053eCcaE11FeddCbFC16Eee3EBf72FbCcf1cfb27", balance: _1e36Str }, + { privateKey: "0xfC925DbA92ECd1ECfA8C25b85Bab5cdb790097e8Fba1F3bf49EB099Db5eFdEbc", balance: _1e36Str }, + { privateKey: "0x1EE9b224DE0F846e03E51EBDF8fDf57E0D34E32bEAb9EFd5Ff8E57C1D90BCa8c", balance: _1e36Str }, + { privateKey: "0x0eEA4Bdf42CAAB8CdacFA6cE3DCDc187F2E4F224b1cc156F337e7F819a213613", balance: _1e36Str }, + { privateKey: "0x80E925DDBE74f1D9F7a9D2AB8Dd43EbeF3Bcf30DaCab99239C9d0bbB1FfdaCca", balance: _1e36Str }, + { privateKey: "0xa2909a0CB5B868d46AeD0AB97fFaeEfE7B8A6778AebAf2c18bf0CfbCe2B22d99", balance: _1e36Str }, + { privateKey: "0x52a8b153f9B7C8D6acF3Ce87DBb41f5f9B298EeedD788e23AF0a1B1ABEfCD42B", balance: _1e36Str }, + { privateKey: "0xf0e36A9EDBc1E25376da9aDcdfBdF8aBA437BFaA96B4d8c08dFdc2abE036B9eA", balance: _1e36Str }, + { privateKey: "0x94F1Cb0D4A2Cc8087fC4F3bEDf51bb6A0E2e3aD4aA8bCbF80eACb8e04ddA00eA", balance: _1e36Str }, + { privateKey: "0xcCB0Cd6F2a01bF27fC92aCbCa927D14FC3c3f74E48Fb4FE0fcA8f2fDEEAcEDC0", balance: _1e36Str }, + { privateKey: "0xaDa14CF43Dd2721D8Cffc0F1bE94e4256D282D3c6aC866f7a2Ed9cc9f10bdDDF", balance: _1e36Str }, + { privateKey: "0xBEDd67fBeF5E0e11DAB1273023FEF56adaff0E5CeB1ba46beDa76AADDDffaF45", balance: _1e36Str }, + { privateKey: "0x32e67E8A77ED16AC4aDbA35f86bCDeAc12A6eB1b4dF7FbBcDCE999fAb44Ed5F9", balance: _1e36Str }, + { privateKey: "0xD483A0DcDB0B3a38e80AD9EfC5D581003Bea2FDDF6b6AC5bbf6baAfA4cA5C4Ab", balance: _1e36Str }, + { privateKey: "0x9808eDBE3a4E167D5Ae7aE231D6968a02dBfFDbA0D43A625eb3d1BfBAfBa31E4", balance: _1e36Str }, + { privateKey: "0x1D2ac2bFDAA05C0AbEa6E1Fd02acCaE2bEfb625749D8cde7762395e9CFdAeD93", balance: _1e36Str }, + { privateKey: "0x719b0aA9aFa4fA4BF0DEbB5fC06AaD3C4F14199EF25a6D9Ba2E5e8dD24E07cF1", balance: _1e36Str }, + { privateKey: "0x6be44Cf5f014dBf3Da3857dfbdAFBC1C9Fc53CBC8BB92b41c05ebD9fD418eeaB", balance: _1e36Str }, + { privateKey: "0x9fd0135A35CdEfcDBaa2ACEEFaA13A3b27cc9E281e0b2BadadEbD039c2cC4aeE", balance: _1e36Str }, + { privateKey: "0x7bDaeBcAAF701Acda8012E28BF6b75717fcc1CABbeE5aE4eecB7d440cAcbCe76", balance: _1e36Str }, + { privateKey: "0xe92cEa5501d4F89f1DcC90FbbC41c3FddB62F3a8Eaf5b5cBEA0f311eb24Dd450", balance: _1e36Str }, + { privateKey: "0xE79bF44Ea2eeBFce2FA0DeafE4aEB7da7deb7254E6686CB8C7Be4BA239CE4D8E", balance: _1e36Str }, + { privateKey: "0x254ff08e9eaDAAFEC23B7AC60CDDEcd2E2b4d9a7fF0Caa8Bcbcb116a1A9b0e7c", balance: _1e36Str }, + { privateKey: "0xACEB5dbf9E23BCaAE5C181BbeAE9e62E3cbD8CD0C64DaCDd0DFBcBeBFf0d5B61", balance: _1e36Str }, + { privateKey: "0xEC2fB180f03d6f2Acb429E7BE539eD6CcAF9Df9b3D470265cbD13dfa35d87a80", balance: _1e36Str }, + { privateKey: "0x3fcAb28FfC9bBbFf6De7bbf07aE5cD4de4cdB56F377adaBD5B16655C7151f8C6", balance: _1e36Str }, + { privateKey: "0xe08efdca582B4eeB3A9bb0decc5630CFEAc0F4CEeFD7f0e29A7B8CB81EfEe344", balance: _1e36Str }, + { privateKey: "0xfAC7ABC31b79E6FFeacf6917Ceda2ffa174A2fBD46d029a765BBabfEBc3d8Ee0", balance: _1e36Str }, + { privateKey: "0xb3f3Af8a0919CcdC870DCa3B22510BAa798082dfa5f81E82af9CA9C78f107fa3", balance: _1e36Str }, + { privateKey: "0x7BFBF12619BBFd18efb88e4c6a3eAD5Bd2EFf3902b3f4Bc7FAdc8ada3eB74939", balance: _1e36Str }, + { privateKey: "0xDdeA634E20e9cdd148F43c1CbAAB0E3f690F2D188B9CaCa8f48A0c2268F70e7f", balance: _1e36Str }, + { privateKey: "0xb2D834D50adEdF57ccbB1e94bE9BDDCF8daEd6Aab19b76a59E1c52eA26E13bF3", balance: _1e36Str }, + { privateKey: "0x0BFcb562ADdFcEaa616F4FE11C911EdD7F2Ee274198260cBF7de55CB7bb0FeC4", balance: _1e36Str }, + { privateKey: "0x33eeD6CE9F78220Fd4ECA8c25492C8e3A96d6c3ad2Ec11fAe8a7fBEdbC3a120D", balance: _1e36Str }, + { privateKey: "0xDB28B7adaED1df7daAB8Bd5DaBBf42E0da2EE53bCFDaEdc2f2e49522DA003333", balance: _1e36Str }, + { privateKey: "0xDcc25ce4dcff179c5487EBCdfF0ced69aC960cAbfFa3b9aDEEd870eebED6a48f", balance: _1e36Str }, + { privateKey: "0xD053efcdE1E4d9deBAA0BaeC3c16B70f319Dc55C142C6fB92C53EDbe6be6cB11", balance: _1e36Str }, + { privateKey: "0xB3f97862464ee31Edcc2dec54b52C30d00dDbc2bBbacdc14dF3cfEA4cEF8BEB2", balance: _1e36Str }, + { privateKey: "0xC2b8C2f23159Ee3AEF1d295be9Dfed4CBbB89A4cB0764B9FaDb54C4FDDDd3a1e", balance: _1e36Str }, + { privateKey: "0xA33037cF3b1fc82DE8a0063d9e9FcA3EdBcEAF2D4FB2D15c8ae05965De7b95fA", balance: _1e36Str }, + { privateKey: "0x1dEF3B3f0C8E3AAC250b5b5A394036b5dA1BF4acA74D66A2d00A671503ACCcfD", balance: _1e36Str }, + { privateKey: "0xCC4857E4F9E76c3DC9A714583831DFE83951e3ccf9F9fa4AcfCa57Cdae0aE841", balance: _1e36Str }, + { privateKey: "0x451DFaBe73E615De55ecf7c0338d820c8dc3Cc92FFb565d0feCDcBFEa89AfacE", balance: _1e36Str }, + { privateKey: "0xbbD7296EdAaEdc63bf6ea0bdd8EE3b59Aca28fa8A5bBab7c4bcFaFbe77ec60F7", balance: _1e36Str }, + { privateKey: "0x47Efc980AaE4954A13Ce3b4cB6b6BB867cB9feA9ffB0a26e3BFC5799b3bace7b", balance: _1e36Str }, + { privateKey: "0xf3E4753b1b4ea2F4BddBBBE74d6899780cAc522d9610CE9DCd246cdA63Aa53FC", balance: _1e36Str }, + { privateKey: "0xD4bD7ad31cf23ed95d4be3bD46a61Ef1fa296f0b5c17c0FeCCF3077E5ecadb2F", balance: _1e36Str }, + { privateKey: "0x4B1acCE143c98dC1CC130aCED1aCE9dd2624E93BeeFe99dcd40281fDb5B96E9A", balance: _1e36Str }, + { privateKey: "0x0b7afB042f5c7D9FF25Cb9f68E34E019A5EBDcB6aF3f5fd9fDCd3AfDe095A8E2", balance: _1e36Str }, + { privateKey: "0x0A52eec4DAA3ae0EA9919b791E0d29ffA1A8a3ABD1B9562e4a4AaA1B3BD8a59C", balance: _1e36Str }, + { privateKey: "0xd1CdeAB1Cee995Cd6Ed7adBfd15E6b47Dee2E3ad8fEB5CaFBF58fAcF7bab3cE6", balance: _1e36Str }, + { privateKey: "0x23aFd6F3Cf94C0bA770Acd3D089e4eEC1c59BbecB5f3e8155ac7AfE2bbc08FaD", balance: _1e36Str }, + { privateKey: "0xd4f13a491beDE02FDbadd4EEef3C21A1D9b3a2adD92CD5Ab243EDdC6bb18D58F", balance: _1e36Str }, + { privateKey: "0xEb8fcBD3b21D9D20cB4dc259F7FcD692CD7d83fa8f08D1AA40Edc9D05C13cE6e", balance: _1e36Str }, + { privateKey: "0xFD0e23CaB82cfdA8Def215a53c764fEc45a15eEFf81CdFd39AD3da17EB8faBb6", balance: _1e36Str }, + { privateKey: "0xbe92efb5a0022d8eb3Efb65cAEE4C3Dd5dBB8A997BEBec9FfDbAB7ec8B3Bfdf4", balance: _1e36Str }, + { privateKey: "0x3EeA2daaE910BEbF6cAfe5FA37Db32aF680BdBc0A5f022d6746cDA456A1bad7C", balance: _1e36Str }, + { privateKey: "0x66aE6623749693fF47732b5dD89A8F3f8C54C2FC6AA7546E7f8825D1de665fe2", balance: _1e36Str }, + { privateKey: "0xc1b4c0D62dD7Dfc7aF4C2F67eFeBe6A986d3c9fcDc1D61d87E3ee27A40a7dD62", balance: _1e36Str }, + { privateKey: "0x98b3e0AF5e8457Cd91CCB98a573cB5349E34A9B1B79f5cC70ebafCb0EC2D6eEa", balance: _1e36Str }, + { privateKey: "0x2AaA360bB28FfaB6Dfb07DF6d749CcAB33f456feE8c48CA0C0aBabE505E1fcaE", balance: _1e36Str }, + { privateKey: "0xF87Bf212BaB4cF22919E87CEe7314714d4DE04EDE0C6248bA20f9a3aeCd92A5E", balance: _1e36Str }, + { privateKey: "0x7CAb6eD36E5ae319cA36a920AB40C4ACbaCBA11D6a2CD9A0463a2dd0ad0BAFff", balance: _1e36Str }, + { privateKey: "0x8eBDDfB589EAb34B1dBef5401ceDEEb5A5356Ee99D397204C290dcdFE3bE0b1e", balance: _1e36Str }, + { privateKey: "0x0c33C6c04431bde14BC2ED53Be3Dda82E46Bcc38E4C67DfCd7BDfcD0efDA0c1E", balance: _1e36Str }, + { privateKey: "0x33E4cDc6E44DfEc4f3C61cEd7B619348Bdc4b7393A5BaFA0e6beF6a31D762187", balance: _1e36Str }, + { privateKey: "0xB36C6Dc9d37eFC0dB35C82a4a6A2c1cFaFa1F8e22b5DdfE5eeF2Afabc1aF4F3F", balance: _1e36Str }, + { privateKey: "0x81C0029779E4883CBbe3DdD1F0C7f70F1B8ECDd3ca6b1885F90aCec02dA57aa6", balance: _1e36Str }, + { privateKey: "0xe0eE2Fb1AF4c7c0dfEc3cC74ed54f9fD5D19FDCb84e0E3B3dF98a6Db699f2FEd", balance: _1e36Str }, + { privateKey: "0x59D1EB337E1b4F1fF7d00EAD7D535C0bEb7C537D2a57C50CABF8fBE7fbB13971", balance: _1e36Str }, + { privateKey: "0xf4F7CabaAe9dB2B966C36F6CdF944ED105Dcd3c84bECca44EfbEcF3B3162e68a", balance: _1e36Str }, + { privateKey: "0x5f0CC6F6B15aBb9E5caCeFeB5E94Db4d4600EFec15884e46Dacfca22bE7E1e4e", balance: _1e36Str }, + { privateKey: "0x974b202d2210b72CE9Ed7d659dfF39459fB7567E6a0be03328f1d61E4392a8bb", balance: _1e36Str }, + { privateKey: "0xf56f422f7da15e585b40Bcd03FDFD6F2B0B4bF75BcDdB332422AfCBce6dEbCeA", balance: _1e36Str }, + { privateKey: "0x449dc1Fbda2aaE045B75cc8a1E1E3fdF2Fb0cEA8C8ae1FcC1e7240A89b7BE87c", balance: _1e36Str }, + { privateKey: "0xDFAe5AbafAA1fD4DbA7bAe9C2B9B8Df6f8DEcD76e2e3D3FB452eFC074Adbc484", balance: _1e36Str }, + { privateKey: "0x8edDbba6C5a25AD9f8b8f6538c5EC5b94cf4A8296AAe12D6ecC80e9B410451B0", balance: _1e36Str }, + { privateKey: "0x4CFE4c147BEbbE59fBEEd822D42FDA8184a9Aa7bd1CFcaefcfC168F1CFDCcC87", balance: _1e36Str }, + { privateKey: "0xEfCF38B4BE5dF38fC25B21fCdCa3Fb0DBCECa9d7F2b90Daaac2BDf3A927C3d2D", balance: _1e36Str }, + { privateKey: "0x96Fb11d89fac2d81e199FC8bdEed8faedDEe940D69EBE9eed11cf59b09bf485f", balance: _1e36Str }, + { privateKey: "0x0dEBBc5d2fEC31A9E6aeBF45eeA37f4d62ddff40C21Beb2fA91dFdCc5a74EdDB", balance: _1e36Str }, + { privateKey: "0xe595009D54A442C3B8bab0aAa29Fc32f0a69c913e3CAE99Ed7cab8b30a767d30", balance: _1e36Str }, + { privateKey: "0x8c131eFeC4aAf3767cedaC6aC9f397bD1cA75e401B6986F8Dc2c5A8A75a42C1e", balance: _1e36Str }, + { privateKey: "0x9fEC48A5668Ae4a4FbE00B99f0A1916F312Ca67BCDcd982FB4cAB18A33fEBc8e", balance: _1e36Str }, + { privateKey: "0x7afC439E54ABd363E8A16De0fdb0813DaDb00B7f478Df986Ecca78eBD8bABd99", balance: _1e36Str }, + { privateKey: "0x2bFbE5B65F6fb237D0fCc3934E97baBbd762D6bf0019cdbFf61eA035cF698bb2", balance: _1e36Str }, + { privateKey: "0xf1698BB19bcb2DD40C66d748e7d7e51BaA48e89A65FdDA83d0A412ffCe8ffbA7", balance: _1e36Str }, + { privateKey: "0x7f13D5Ccb1CbBBCaDBfacaa9Cc75877A8c7cbAcCA678dBCfCE8bCAD0AAeefaBE", balance: _1e36Str }, + { privateKey: "0xEb501dCb45243CbcccAcD9d5c4AFBEc6D674b3d8db1CcF6E2AA7eC8341DfacA2", balance: _1e36Str }, + { privateKey: "0x5968a48B4459E42c153Cd0cF9dAfeaa3dEE7b345C1eC6eeeE3dB35d0eaE8525A", balance: _1e36Str }, + { privateKey: "0xe1B04C5b3d81CD0d7a824f2AeDABdF3CaEB815EfDdbDb70Ef8a4aefA8AfAFe0D", balance: _1e36Str }, + { privateKey: "0xEa3C3E1B971AF1A38acA8890c80f0988D46D476A7ebfEc8e4e4444d3BF220d5F", balance: _1e36Str }, + { privateKey: "0xDfAB60bca7fCcadDf9CCa29b46acc55fBF47628Af7D9FF68AE4c3eaBf2773eCd", balance: _1e36Str }, + { privateKey: "0x1d469c1c05FE7158F87F9AfA59C159dd1F35Fb842c4D75ceC3866Bd8E20B38cd", balance: _1e36Str }, + { privateKey: "0xF6E9F70CDBEF23BD0f44C29cf3D46dBBCa41bC8E34243e8A8c6cB4a0b89d6faB", balance: _1e36Str }, + { privateKey: "0xf9EBcF5CA7E7f4efFbb1B5b5908519BAD9dc881f3ce10F78D4A76cEb3bca7dd6", balance: _1e36Str }, + { privateKey: "0x9Be1341Bd47BbeCD4DaaCFBFC6521Da3ca99cEBa2c015bDc5396D21f93fb083e", balance: _1e36Str }, + { privateKey: "0xCF6cfA3bAFfdCbBBD21CcC26d8AdCdc7e73DCdeB3DbFc593aDe6eF7e0dCCd6b5", balance: _1e36Str }, + { privateKey: "0xFCAAb2f51b7AdBFC85965E04FC7bCE43abdA62e9a550Eb03Ae3DeC9B3E9a6A3E", balance: _1e36Str }, + { privateKey: "0x5373595F795F0bcA6C8DFb8059BdceCfeb0e1AC41bfadfe2ff30c44BFe028CFf", balance: _1e36Str }, + { privateKey: "0xEFd1A59B43DA61b94F97f55e46b34fFd4B1Cd6aD5B13bfCbb0aB73cbE4b64648", balance: _1e36Str }, + { privateKey: "0x0882d8FcBEc800CbbC274d05A4E80aFd03C48FbbdbbB82C0e393e3a1fd6bb3FE", balance: _1e36Str }, + { privateKey: "0xb31bdF240e1AEfe9B38E6ce748Cff6Bd9a2caEdAD4Db6ff2ABBcb4BA0afc83Ff", balance: _1e36Str }, + { privateKey: "0x48014eB47439A9B4D0BB9F674dcad87Cc2Db83C0DeBEecBf7891C46cEc7dCD2E", balance: _1e36Str }, + { privateKey: "0x04CB5cEF0C97f3b1AFd402a57BDcefB9FD88D434eB3Ff682f214981fffd96ebC", balance: _1e36Str }, + { privateKey: "0xbcE7f35a120b78876a96C9cb1DD00b60A43546c71e44337f25adcBd3FadfADaA", balance: _1e36Str }, + { privateKey: "0xA375bB4751B5F4eDD7CB124dceF9501C8860bAa1Dcc56A4812DEeb9D2fEd483B", balance: _1e36Str }, + { privateKey: "0x2DD6e6a53Ae0fA1d002F3b6aD2DCccc5cCBEd0829DEcED94e5D561AFCAc9ecFf", balance: _1e36Str }, + { privateKey: "0xAA3beB7109c486ac7C65dce2f99F01dF380856159390922ed3fbf6A6AC0fBD32", balance: _1e36Str }, + { privateKey: "0x6CCE77A62f6B35E44a1cEbCF4ADECaC9Fa6C5EBeaf552C6b2404D111F3AAC3EF", balance: _1e36Str }, + { privateKey: "0xbb44B0CAf55be6FAADc841cCcA88eA227Dd096e65d1Bcb2e4c6c4edA2dfE90Cb", balance: _1e36Str }, + { privateKey: "0xbF1498f7C2c8eb21Bb6b8f2B9dd4BDa92824569FBA9E2E1931dB82DDC33d67b4", balance: _1e36Str }, + { privateKey: "0x8b6c6c6AC7EB3fb5de441d2a47EF9E22D42dEFea2ba5425A863cf76dcDCE7D88", balance: _1e36Str }, + { privateKey: "0xA700f2aF7c094daae3D4FB3d4D571168e656eB5d2231A2522F13De953148f3EB", balance: _1e36Str }, + { privateKey: "0x22BE4f11f0a663aFedd22E83746b171a02D9BD1A437DA212B9eF410A01EDEf7c", balance: _1e36Str }, + { privateKey: "0x1d7cF08983fDD91A7ca0014dBB746483D0AE4Ed8167e8Ac226fceeFb9DC3dbC7", balance: _1e36Str }, + { privateKey: "0x0dd0DBD1Ae6BA54384DB4Eb9C60DAa4de0a4Aa4dacfd3bA37cec9c67039CF66c", balance: _1e36Str }, + { privateKey: "0x0ACB6aF4EFFdCF094Dcbc1Fc0F0AFF30AE0f24ff7b7D10BcfC7A92F30d19A78F", balance: _1e36Str }, + { privateKey: "0xbCef26d02F68d1Bb0aA8f865fbD0Ed5bdc9b70AF4BdEf259C22fEdBBc14B4d88", balance: _1e36Str }, + { privateKey: "0xdCec192ab72d80Cc6B1bAE5aFfad26C6Fbe65d65C20029DB4EdA4FE57dfF1fC4", balance: _1e36Str }, + { privateKey: "0x7B37e5acA4d8DD3B5B24EF2443aDfEC9A10b849CA3AacB88eae2B210D3a91b9c", balance: _1e36Str }, + { privateKey: "0xb58D6d00fFfEea1E97330E9cE375BF0EBEEeAABFc2C5fCAABEe92d9D98B993b8", balance: _1e36Str }, + { privateKey: "0x74FB3B605CDDCefc0DCC289DBB6dad6FC5fd52C7bd71eBeBf563Da5CBDAfB7A3", balance: _1e36Str }, + { privateKey: "0x37eaC4Bb1163f67cBE81bd55755E73ffFC0dC633EE44FD24Bb0B6cFD2fFab09e", balance: _1e36Str }, + { privateKey: "0xbF2AFE9218BEC1B98f8A1b0780C7cFa0561dB06287fbDF6F842BCbFD0c85dc8c", balance: _1e36Str }, + { privateKey: "0xdDFF5A7A11cd4ea21d8E0B8F70A8df2BBF54E6FbC44967D92BdCD4a054447bfF", balance: _1e36Str }, + { privateKey: "0x351c54E13C5FddEA43268781A35E3AD5b8bB9bfEE423da7e9Eb72d9b0eeD0AFc", balance: _1e36Str }, + { privateKey: "0x77c1984fF57afCaB30Efc287fB9ABfcFfDE46b3E3d63B6aaA1a8FAabcceCF5BA", balance: _1e36Str }, + { privateKey: "0xb061aEEDdc5efFfBa3ceB16cd9e3d708eA81A8f692dbbAf9C5a0B4acb0eF2895", balance: _1e36Str }, + { privateKey: "0xf46675572ECa0aEacBCE749E8B3fEb4A4434bF8fc4a17E99f93D3cAF4De08aac", balance: _1e36Str }, + { privateKey: "0xe6FA5fA76AEA8F90db9Ab5Bba1BF25A2F98Af28aAcFE7eD3df7d2D657678Cd28", balance: _1e36Str }, + { privateKey: "0xA1F35bBEBddadF8dD4FFbFF3FC1d1C9dF4C4CdCf07f3BDc554687Fb21b8EB7ee", balance: _1e36Str }, + { privateKey: "0xfdFdE3c49dFbAf022b56dFC4d35660DB7fE5F89F5BCD3c1b3e7caab20DA30567", balance: _1e36Str }, + { privateKey: "0x4c02AE2F7e7EaE3eb7fEeB80f377473c3E0C2B6FCBCF43E303a2CAE8EE0CB068", balance: _1e36Str }, + { privateKey: "0xece75AF56E55bd379aEF2CbDaa632d1bE3C8f7D5e8dAE7047c1D3c6e37aec8d1", balance: _1e36Str }, + { privateKey: "0xbECaCc33BAFFbCbadF6d8C41B3eb3CF760C39699BCf872C230BeD4cE89552D8C", balance: _1e36Str }, + { privateKey: "0x9cfce0dEe4BcCD4ae742ec8B041f47aC0da8AEd59c3615BFBb7feDAef0E1FE99", balance: _1e36Str }, + { privateKey: "0x6ecBA94ffd23aEeCF30Aa7ccf28D77b0Eb9Ed1Afbf5c9abD3E5b50CacB8c0BfA", balance: _1e36Str }, + { privateKey: "0xe5d9dBF0284bF49a313c9f8cfC0453AFc087d88Ed69EEc8ab3CC8d1fBceeB689", balance: _1e36Str }, + { privateKey: "0xADcF872FA85ECEedFEA3BdcC51A00AEF3CEAAF3610d9693Aa3B23Ba3FcBAFCeB", balance: _1e36Str }, + { privateKey: "0xabDa7702CACa69A367aBfD0adddd45efFa4Df4D9eaCcbd75F89470c9cBDDa3EA", balance: _1e36Str }, + { privateKey: "0xF0404Ea46c32D9c10c936dA2bcb42bB9AC6D6FF91eB57EFFc5bfECeCeEBf2fE7", balance: _1e36Str }, + { privateKey: "0xA63633DeECC4A815c2575C1d42a2feFC153a667C566F429e1E9c54d13b4c0D50", balance: _1e36Str }, + { privateKey: "0x58Ab12c9d92d2BDf674bEfCdc2bdd5305Dae2aaAa5fDf34C422BbAC80Df8d1DC", balance: _1e36Str }, + { privateKey: "0xdE99Ef975619feF1Bcceed01CDABaeb4BefEebbBF5758DE3CaBf172ED917a99A", balance: _1e36Str }, + { privateKey: "0xFDeB03179DA2CbaF223BB381eAaBcDE1aCd0BC3f8783Af8dD672408d83e5795d", balance: _1e36Str }, + { privateKey: "0xD1be21f70434b2CdBE742cD1e6275c85c5d45dd6Eb288da346AEeB2C55cFfDdd", balance: _1e36Str }, + { privateKey: "0xFBDc2B603C39E155c5F4FbA09ac9dBeABfc6cA0Ba567CAb9B5c4FAdCdC4E2e47", balance: _1e36Str }, + { privateKey: "0xF13cA746556b11e1CfBEF3b816dDa8fb5A2f2FdA1cDD1CDFDdfC8957C9ABeEC4", balance: _1e36Str }, + { privateKey: "0xC4FdFFaef0C0f5892c3C1bFD65b1C3A2dEb74f54eCe2A6bcaeBF48537FEDdad3", balance: _1e36Str }, + { privateKey: "0x7F8Caa4bEa69B4CAaAC6BF44Ba9cfB4f0FA28e2e420f1E70dCAfFbe6E8B946ef", balance: _1e36Str }, + { privateKey: "0xd988572CEa7e14685FDF5DC42Cd7c4aDfcFBa9A6bdb2Aa7DBDE410c26c5Aa9Dd", balance: _1e36Str }, + { privateKey: "0xd2fC3E60e9dcd019eFdFC7B7b02aFDc4cC4BAdD1DD9bb3bCf7FbDE1EDCEcbaa5", balance: _1e36Str }, + { privateKey: "0xC742bf81FFA5f41bD3Ff697aaF489cC9A29FAe9ad2c2744724bcD81e4DAeF9E1", balance: _1e36Str }, + { privateKey: "0xE9c8B558B7d3CcEE64818cEE425218D53fC623dadaE1e5d17D0A87aDDCdB6B75", balance: _1e36Str }, + { privateKey: "0xde09b86236EE80CEC1E1d4d4cdBAE9A6E5c1F7afAABD7ef0B7398F3Bac97f965", balance: _1e36Str }, + { privateKey: "0xb5623027bb4bd4FFABB0AD9E5fBdF57b56D035ba357cC6e6BBbe682Cb1AEBA00", balance: _1e36Str }, + { privateKey: "0xe04047CEe2Ccf64730A3Abcae3D4c65dfbceEfFfEa8f3cfE8D01EFa9D0b836A9", balance: _1e36Str }, + { privateKey: "0xA9Cf7cD230FC2b35749248F8bCff88db7Fdaa8f6B057DD74dEcdC6246808FB71", balance: _1e36Str }, + { privateKey: "0xECEB4B2ae4b710FD2dB276cEa350D7B8eCB5334eef26dDe43Adc8fDFf3DBe75B", balance: _1e36Str }, + { privateKey: "0x5144DF6cfB7382cEA2E1a77dBE0a3f875EB1F6035dBAb72E6B50fAfb618dEDf4", balance: _1e36Str }, + { privateKey: "0xE79BE252eF4bC59dF48c4fDC24ba816186ED33e8Ba5A0cADCF51ED76B7390cD2", balance: _1e36Str }, + { privateKey: "0x8aa363A58bFfcdEbF64db5aA6cdBAa8D7e7CEaF41106abFE5Ca78edFaBA87696", balance: _1e36Str }, + { privateKey: "0xd996AdC0fe328A103C909f9bCE1CedeC5dEbebFEaDBfa3F99B182dE3558Ed664", balance: _1e36Str }, + { privateKey: "0xcAa4ABa7c2FC81D3fAE89B528fd45cBc9687E32bc0ddeBDefdE5eBA965e0cAEA", balance: _1e36Str }, + { privateKey: "0x41b675527cD2AA6dCaAdf6E1BEF9ea356C1cCDBC61712Cf7C184ab9954a3BB4e", balance: _1e36Str }, + { privateKey: "0xEFADCEF12AD0a8D8FDf5d4f91c023Df7d7daCfF6FebcDfc2fDC315C3d4C510cD", balance: _1e36Str }, + { privateKey: "0xd04fDB5dfDB3B85afF09dAa5f6cFCEEA79d98cE9E6DCCFE98f8a4ee6Ea9dFF22", balance: _1e36Str }, + { privateKey: "0xEf5a02Ad3c182ab2d36dC8daDea3ac81fEFBf869aEaCaF0cDbbB1EfacD18C103", balance: _1e36Str }, + { privateKey: "0xFAd56f20E09D8eeA24b55d8Cec8e2eBA7409cA8EAA0FCf2e1c3Ec215e42a5D2D", balance: _1e36Str }, + { privateKey: "0xC521B59cEaE40CC92C076fb05D3fFa61Bf3Fc88Ef58dDF60ae6Ef05fcB85aBC5", balance: _1e36Str }, + { privateKey: "0x080BA7ce0c7Ce6EF9A3B0530CDeC20c5B3FAB022CF805A5bf0EB8120dC8CfBBb", balance: _1e36Str }, + { privateKey: "0xC2d1FcCCb77aE4c830F6ebc9Cc59CCE59ceF03Bf025F18e34C2dFFA23d4DeEEF", balance: _1e36Str }, + { privateKey: "0xc976dcC1Cc98F1eEBCBDf2BD068BAC9Fb7dB0eBB8487B2d0efe22b8FeC8b7d6F", balance: _1e36Str }, + { privateKey: "0x3522eebD5fFbAD9913C2ead1De69a57EeeaCA6A1bF6583Fda3A8C7fdb6FaD2bd", balance: _1e36Str }, + { privateKey: "0xFBEaEE4bEac56daf889FEeeFD62621470E5F8802193a572AAcdedEE237afdE81", balance: _1e36Str }, + { privateKey: "0x46e1C0aE3fCB814bd1CcC59dBcdaed4BAB1EEe75b8ecF8f5bB12845da5C625A0", balance: _1e36Str }, + { privateKey: "0x58eEec67F3dBc150a1dE3F8c6f35e5FFB3E0FB4023a58eEa0bF6023bCfECA589", balance: _1e36Str }, + { privateKey: "0x4Fbde0CB188DbEaBB8dcb73407B9aFeD8cfE1CBDac971afDEcCe5e788AEfABFA", balance: _1e36Str }, + { privateKey: "0xa0fE02FF8ca3Aa0096Cb6ec2DB67Ed0DF800147D925aFd8E8aC2BA0bbC37C4e6", balance: _1e36Str }, + { privateKey: "0x79C6F4a42a4beC4bEf8DE257e60bee4b6BbDd7BfE8bF41b463b5Bc5aa43486cE", balance: _1e36Str }, + { privateKey: "0x3d0352b4603fc5b7bB59C8a67f491b0CF3e1e09CFc7c8567e8083f32E5E63aCA", balance: _1e36Str }, + { privateKey: "0xe2e998F3711fBE06287c81900BB93bDb2DafFEB9470513bfF991a72BB7BbfebF", balance: _1e36Str }, + { privateKey: "0x9c9F5E71eba954d6004E86E25520C51Fe0736F473adC4dE9348Ae3EeCbAdeC62", balance: _1e36Str }, + { privateKey: "0xcc1fBcd93d668e2cEC8b4f9E15fACC3013a182Ca779eDace4eF9aBDeaDdeB9BB", balance: _1e36Str }, + { privateKey: "0xe03657CD9AaF72fF52c63339eBcBe85bFEde4d04a33D5Cbbbe9ffA7E8B3b4d2E", balance: _1e36Str }, + { privateKey: "0x0CA1DD1aBfdBc0e5406E993e59b7C2d3A1433fD6a3cCeA8D0e68dA7B1a0Ba47b", balance: _1e36Str }, + { privateKey: "0x9384AAeee8cba7Ab2463adB74e0d91Ae14613A496f53eB2EDfe82eD5a4Ab4a62", balance: _1e36Str }, + { privateKey: "0x77B2f77Da640C7A983050B3fc0b1ed7D4d4d7aBbf8baFEBfea22AABCebBEEb45", balance: _1e36Str }, + { privateKey: "0x59eeaf658A0de6c065ab80DDAB14e52f32bf7892e8515d5dAb1a6f1AcFB863ab", balance: _1e36Str }, + { privateKey: "0x4eED08e85d9ab7Cf33aeECE4F21bb8ff45E6bE335afA8eBE3Edca2dC82786EC5", balance: _1e36Str }, + { privateKey: "0xFcADfFdD4EEE8AAD5d596bF75f9753CDb2D1EF80CE3Faf8eaC8F8a8cB0ff8333", balance: _1e36Str }, + { privateKey: "0x4aAc06Ce4B31AcaF9929784Cc5DbEBF0BD3C6f942dB0eDde8B895A04bC61f2bE", balance: _1e36Str }, + { privateKey: "0xaeE2bCAcfa4B87B4cE4a5f2E1eA393310545FaC8B3C0AbDAa9f38ab7e94bF0eF", balance: _1e36Str }, + { privateKey: "0x78e86D2A7edb3fC5dF7fDC702cAf80cEFd6DE9EcfeDaF175d685b29afA7EfAfe", balance: _1e36Str }, + { privateKey: "0x2BCD6ca3B5dc74E47D31a6923aafa7e0210B5f9C26fD975a95Aa0Ca617861C06", balance: _1e36Str }, + { privateKey: "0x10618f48F2b32CA4F092fbB46eeA2a687D158f4C8f74B4Bb8a5Bd3AA9eA9E72D", balance: _1e36Str }, + { privateKey: "0xc75e53Eb4eB6D0FCb73Cc3B15A5518d585Ebd88D1aC5B1399ceeCCEed33d3c1e", balance: _1e36Str }, + { privateKey: "0xd74ceF6af1AfA32C1Ac4CCb1D76DdC48156c8BDAbc6ADb5Cf24f9f92e764672C", balance: _1e36Str }, + { privateKey: "0x451cfe2DaE14EDe9f2abD145745fa1fCe8CE9aa7eDE8dBe0EA31F6aE3390b61b", balance: _1e36Str }, + { privateKey: "0xCdABCCcf69EB53fd3Ea0D7B4046a2C8E810f3e1F15CAb4BB3f83dAFd7769f2F4", balance: _1e36Str }, + { privateKey: "0x63e5a9b960dcfBAfA1a2d3C7D7cBaBAF2f2Bca8eAeA9eb8FF21Bd5C9A3bfcD42", balance: _1e36Str }, + { privateKey: "0xe39BEAF370353C03EA07EF86d903ABFec6eD1AC38F4b1D303D5E15AD4FC4Ea0c", balance: _1e36Str }, + { privateKey: "0xBdff0efed98486239Ef209cDD6be6B73cDbBEC28848AFdF2564e7c0a9B4b2a74", balance: _1e36Str }, + { privateKey: "0x4Ed3cc63C2B3De1C9c7BD6dAce69EBE20A4D7e4d8a76885Da5ffF90F4dDEcec5", balance: _1e36Str }, + { privateKey: "0xD78BBd0Cc68E15BaB5D2CdeEe08a7AD18F8fbFC94A74A9ff271dcB3fCdcCDC29", balance: _1e36Str }, + { privateKey: "0xCB4f539CfaBfbDCC06D4C9AdAECe862aE069CF3a4796dda93Fc89915A13cf85D", balance: _1e36Str }, + { privateKey: "0x57abBc52e8A86024eA5A78553FAdd33cDe450C7a2B67De3CdaCCBc9e67FbdBCB", balance: _1e36Str }, + { privateKey: "0x5D55DDdb69D2DA8eC74e3EC8aedAC69997dDf7a11DF11a8cdF9DDd1fF099CFbB", balance: _1e36Str }, + { privateKey: "0xB65dfe2eb25ce5974cea6Acdaf6c36D9e1d78C0Dcec3f7bB6F7bE09CD3739E3B", balance: _1e36Str }, + { privateKey: "0x86cf13C11061b5F3ddCBa6bC644EC633fCD7cC60A588f8A372B79990fdC5aF9F", balance: _1e36Str }, + { privateKey: "0xa70a9769E14DeC9529093e6d5A8eFEbF2fCFc14a4d9eF8cE8F87554f3ac5ADC6", balance: _1e36Str }, + { privateKey: "0xf2EEAF143ADbB899c56bD3f0a7Ae8FC1d0720fdfFFbbC1f9AD1227D34aA49d8A", balance: _1e36Str }, + { privateKey: "0x8Bb38FDf9cC6F1f2B5F4f20Cdbd3Ca41a78cc3eDAfaeb9eeFF8a5e2dA8B4CB26", balance: _1e36Str }, + { privateKey: "0xDEf80a9ac2FeBbdEcbA795B61Ee03ddad39aDaAb8A5a46e55dBF9FD7EDceE5b9", balance: _1e36Str }, + { privateKey: "0x0AFE94263fBa9Eb0F8eCb783d0bCFdD3e0651Bdf4Ed8ECDE9d2CC629C0db4777", balance: _1e36Str }, + { privateKey: "0x0F1c0cBFa21bB894e7597FaAEeB6cA26f782deae5eF65DD07c3DeF9b9f8E9f43", balance: _1e36Str }, + { privateKey: "0xAAEd5A8aCdace7fd1ddDb3e82c328c65262ebDde518FE5baa2B9bd2c92cDA2E0", balance: _1e36Str }, + { privateKey: "0xafba5BA3cf80ff4D7f20cDA1dD877fFe0A2aBa6cbb789Ee6f4efDEDc932eA5aB", balance: _1e36Str }, + { privateKey: "0x5F667CBaE7eaDa4ca0c7aac1a7D3df90a0D34D1e6d964712F8ee757A0d841218", balance: _1e36Str }, + { privateKey: "0xA912AceABfD7990BBf8f261ECD6755Ba4e0A20eD8BDB153dba990C7b3BD43cfe", balance: _1e36Str }, + { privateKey: "0x06D1fa28eCBd31BF3E0d5b64F49E5Db5ca92Db926C39B90cC4197cEf5edf8Dfd", balance: _1e36Str }, + { privateKey: "0xF784cFB68A3F28EC5C1401feB7ecc6AD1D16A00DF3aDAdF647fA72D5Dc4a0aA5", balance: _1e36Str }, + { privateKey: "0x94a9c75dbdC7865E0Dbb7CA86Feff8baEecD693a307abBABFeFAec70fCAcacbb", balance: _1e36Str }, + { privateKey: "0x01D9cec2d11FD73FEb7febF2adC3cABa7FFfa6860C4bF7FcB02C9CAEB512EdeA", balance: _1e36Str }, + { privateKey: "0xC5A68DE449Accfac650b6a3C12D7895aEdFE9Dca4CD2df176AAA74D9055dA3e2", balance: _1e36Str }, + { privateKey: "0x04c8d87fD5ABf56982f9af5C8EfFDB11Bf7BD2bcc29caC8fdfA99a73a8c3cE34", balance: _1e36Str }, + { privateKey: "0x64C0618bB7d1868dEaB31FeA8DDee59EdEa9DC020Ee04a5A385DC06c7cef6DCA", balance: _1e36Str }, + { privateKey: "0xB6646d2Fcd6EBB0BeBeeB06E30A6ecFE9B6dcA6Ba9005bfff6f4c7eDf0B23Fb3", balance: _1e36Str }, + { privateKey: "0xdBbBdC9d7AFea4Ead5cFE21bEC7F1Abdc02AB61D54D1DF7394C823d38Fbe40dC", balance: _1e36Str }, + { privateKey: "0xa03A3a0Fe1af1aaeec6882c9deFCab8C5ABCadE3F988F895EBfBA3EC13ffEC2a", balance: _1e36Str }, + { privateKey: "0xDDbeDB0B062cf06EBECD0cc280C5Da78d3Eda7a24Aa13498D0B48FB6Fdd364c9", balance: _1e36Str }, + { privateKey: "0xF99F24C7f56C1b01ABB0a14CBDf5eC1fB9DbfFE27c0e91EA98A5f1F5dEA6047E", balance: _1e36Str }, + { privateKey: "0x5aF0e55A84318c5Fb8ABC6fBCAe4c4bEE12bc9F5dD8CBD9aDF07A3bd0De1ECf4", balance: _1e36Str }, + { privateKey: "0xa2c4c38bbDe6aF5fd25bAD4f20f1fA12A2532A11967Cd0AfCEaaAaccFecaf9cc", balance: _1e36Str }, + { privateKey: "0x14faceD70eB8b64d4f1509c1ACeDf87a9c09f9bC97C2D8A50d8cDbf6812c83D2", balance: _1e36Str }, + { privateKey: "0x3033ED5Bae5bBD7bE1BdbDD3AAAF2A9a6C1EBEf1AcA18aB1Dc06423b40b3e5Be", balance: _1e36Str }, + { privateKey: "0x051C0E1d9ea7FEcb8EeD7E6A2d47Aa72cF4de4EEeB725cE97FC4F9acA146067e", balance: _1e36Str }, + { privateKey: "0x2bC84AbdecA9DF4EcFec4D65EE474DB9635d7E6d5B4F5Bb65D77d9dcE21b040C", balance: _1e36Str }, + { privateKey: "0x8747d4E73c8Ba2dCe4Ea26b1B7efCD328cE04aCEEc4db9ceF037bA67ba5c47E8", balance: _1e36Str }, + { privateKey: "0x7B937A9aa64B5135a1CCD49dD6D861C9962a6FCA45dfcD5D78E9DA3AdDEBCf3c", balance: _1e36Str }, + { privateKey: "0x0A3FADB008dD80d9dDc31B5DdB82c71c9Cbe8CbA7a85A70acdb3a2BB5907ffcE", balance: _1e36Str }, + { privateKey: "0xAADa8A68eFBCAa06C6CbAA6Baf5a07Ab4ee544DADC42f94Ac8A5dC836aaEFff3", balance: _1e36Str }, + { privateKey: "0xDa03FeDb38b0CeF6d390b1CB7203Ef8dE77007Fb1aD9bF66feb418FFB5bD46dC", balance: _1e36Str }, + { privateKey: "0x8c0C381A96A22fFab19FcC5DA9cd8F5aB4aDaFC2f3dEcbCf513C87E4dFEA08fF", balance: _1e36Str }, + { privateKey: "0xDA6fad6d12defCE32BB28Cad7FBD54eAf06bA6756eFed03D9FFfaD779a98EaBC", balance: _1e36Str }, + { privateKey: "0xcF93eF1F7d8a73C4eC1cB9E0AE1fFFFa6bA47C5FEfBBa89bF1EAFe669c9fCdca", balance: _1e36Str }, + { privateKey: "0xbEA9A85A6F7aD3dA842f062FbC7Ae0eb8A57A7ca46fcbBd7e0ff411C1872AcD6", balance: _1e36Str }, + { privateKey: "0xF7EE1f863A979A97d62dDBE72D025BCcaBC096Dc5FF325b1DAdaf0F9Fc4dbbE5", balance: _1e36Str }, + { privateKey: "0xf63038937CD85A21EF5Ff643dAF85C6A1ed2fb74a7676C9d8F47C02fFeceDB82", balance: _1e36Str }, + { privateKey: "0x69d7bBD48fa7aa9FfD4E3f5dCb3030ed8c76Be675aC2813Db82Bf5dc7b53f5AC", balance: _1e36Str }, + { privateKey: "0xFceDddCe2B4BA5D1e5A194D56c56f3dB90926D1D1F8e8Cf4Aae1B21B0bdbfba2", balance: _1e36Str }, + { privateKey: "0xbcbdD9a8462ae69FcCdeEDd838A25Ead9c65EEbc9ebC2CeAb7D5ad1c4AEfA0B6", balance: _1e36Str }, + { privateKey: "0x480aAa813f77D5a76FF8D0Dd59678Ee30ffcBB9AACbBa1Cfe6846cCdAdDA40d2", balance: _1e36Str }, + { privateKey: "0xd1836f0e438514127E3a7ecFd849F6Af2BEA1Ba60A6509160F6581bCeae08166", balance: _1e36Str }, + { privateKey: "0x4C3EFe7D74D88aD180cEb0cFA8FbCE4DbdCFCFb1d2a7ab57860a99eD318Dd62c", balance: _1e36Str }, + { privateKey: "0x98325e169f87cAA934F7477cDDEF08Ad0a5ddBD02a288B6C9Bd1793Aa1DAe548", balance: _1e36Str }, + { privateKey: "0xAe6723fcFf9FE1Ea5ABd7Da31c85BdC3a64Ef04c1EaB0882210bB8467baAF6eC", balance: _1e36Str }, + { privateKey: "0xE9f48fB2DF1fb5eFA3CBa1FaBef0DFe9A9bdAbdECc28bd52a7FaaeC6cDCdb702", balance: _1e36Str }, + { privateKey: "0xe7fF762eEFE330c3b7001eBCAecD4576d283bdc6e7eEFbEC1F9e9b4015BBdcca", balance: _1e36Str }, + { privateKey: "0xC3132EaaC185B46Bc24d6eebd0b9cd8db01121Feb6E00e08d1Ed9dA7d8565f1a", balance: _1e36Str }, + { privateKey: "0x84eAcaDe988efD602aC0e1Df7895A61cBb2Cf353bEA0a730DE6DA6BDF6F666C6", balance: _1e36Str }, + { privateKey: "0xd78FC7E7DB45f9E019fB990fE8f1Dbc7Fae98b015EE8DD223bC7a833F5cBeB1d", balance: _1e36Str }, + { privateKey: "0x5aA68076bAa8fEAA1F93Bb47d1Ee4ebf92D8DF5BAC3FBB0CdFe251fEeC1bDfcc", balance: _1e36Str }, + { privateKey: "0xCA99CdC2AAb75E58C262131d27E08BCB2115cB41daB2498EfaaCe32Dc1045134", balance: _1e36Str }, + { privateKey: "0x6C7bcefF450caC1f5Eccc0e9eD627e154065D3BB756e0bA2488E894AEEae0Fa8", balance: _1e36Str }, + { privateKey: "0x10882dfa6DdEddb0df651C8fE2eCfca788fcd1abF65a47bB71f21f9aad1BFDaf", balance: _1e36Str }, + { privateKey: "0xF2eBA4cCc2D8cdDD9D51bD8eA4defAfB15a0Bc021a9707c7DDFf8ddFB1Bdc10D", balance: _1e36Str }, + { privateKey: "0xaF58ce73775454dC1656727BE1BFe96ADC9d3aFf2D70AEedcE82bCa585fF3FCa", balance: _1e36Str }, + { privateKey: "0x755b05779ce55c474dE78eaAE12B6BBA82714dD988B1dddBEfb21Dbcddb35fbA", balance: _1e36Str }, + { privateKey: "0xb3aFcB5Cb47b2ca38a13e1aE835921DddfBdd40127bbF4Bc55cdb859FC7CA49C", balance: _1e36Str }, + { privateKey: "0xb393Ce1CdEF6Cc0B0e90ea1B6d2eDC4d28Bf0Cd2c1BC4cD6cFF0A5D4f5ca1DdE", balance: _1e36Str }, + { privateKey: "0xaeaA6BcEC770ED3FEB9f4e8FFcD6a6e4b8dBaE96f4b3ddade4abdaeef31bE1db", balance: _1e36Str }, + { privateKey: "0x1B2d1a2F6eEc52FebaC6e57EaA390BCaf49A9ff75De4e2CFabD1c06fD42d36DD", balance: _1e36Str }, + { privateKey: "0xec4A94847E0a62C6cCfd27eFe8bC4DBcFF2bA318AbCa23b79b41Eac296fe85Fc", balance: _1e36Str }, + { privateKey: "0xd41654F3D2eb3dC6DE40b7a4EB25D2bEdB4CEC0Cc6FE6cf429ae67BbAdD56257", balance: _1e36Str }, + { privateKey: "0xf5E26c8A50bBA4AeaDE9d10acF00FBb0e8E6eCB3abB8Ba9a70972D406007FCa5", balance: _1e36Str }, + { privateKey: "0x8bA41A49dDABA343BC8a7Ca2182CE0DABA7e6bf90BcdDf9afe610c80B5ce3e7f", balance: _1e36Str }, + { privateKey: "0xA8C7A18fd324aEdf046bbA28dC165bC16FA89C7af1FC9A65512Be5Ff7E9315ad", balance: _1e36Str }, + { privateKey: "0xDBD3Ab09D4e56Cc6F2Ad3beB3fbfed3FB2d4C4a76d404fDb194FfF46c58C8878", balance: _1e36Str }, + { privateKey: "0x8Bf9aC663ec64f3FDe669A389ec35F8fEFF288b8EA4C9A71F5a3f737D93f5D8f", balance: _1e36Str }, + { privateKey: "0x64db9679e67DdF4E0EDdc276Da87EEB3fECdB2E4a4bfAF4A85e43d65c05afD00", balance: _1e36Str }, + { privateKey: "0x3AD4Ea30bb27F09Fe4bbd3ec5A3Dce0C0a2CAF1A1a9EcE5d9e4e4B6DE2Bab7E2", balance: _1e36Str }, + { privateKey: "0x80D1eacCB72Da4e372Ef8f1a35BEC9134b93c4A3fFe867eda21aE656dB80AFBa", balance: _1e36Str }, + { privateKey: "0xaceCfd38eEfD48b1e7038AE7449aFB4Ff3EAf0cD14C3e86c48eF0F165715085c", balance: _1e36Str }, + { privateKey: "0x4f56Dd0CA3FEBCCe05247c50749D2c10A2ECEEa5a66Dd4ec3e9C04ebeb13A34A", balance: _1e36Str }, + { privateKey: "0x84EeeBC76B5978E08aAcEf16C2B6BF3A5EC450F96cff9Edbeed3dDcaad33CF2A", balance: _1e36Str }, + { privateKey: "0x4f447EfB685ee6A0fD1ECf926EAcFABF60fdAfF836CC5995Dc3b8bD311ddED41", balance: _1e36Str }, + { privateKey: "0x2aee12ca147cE6Fd16e1FDfBd6EB4Efd7b49d40cBCdCEEaDdC42a825Fb7B80AF", balance: _1e36Str }, + { privateKey: "0x58d9254d3c3a93663feD5CaaF9e3D0CCd9ea0fea19EbC9e5df42dB1CBbAbD5bA", balance: _1e36Str }, + { privateKey: "0x3d984A82d66dA7aCC63fc3cb2D99B2c37c1ecfeE55dF0Ba1A95C1100e7d5e249", balance: _1e36Str }, + { privateKey: "0xBD09F7e89f45eF6cce4b40E0e78cEb3aDc1A27F9Ed9223A34aDfd0ff7d8EE6ED", balance: _1e36Str }, + { privateKey: "0x2311cca4a594B6FAC5e26EDE725c842F9b94C52bCf0d684f6b8aFFE3dE0ADE78", balance: _1e36Str }, + { privateKey: "0xe2E57F9ecf136bFc9C7bE4edF3d6B1F6CF86768353AB2C42BaE8cAB0b2F7e3df", balance: _1e36Str }, + { privateKey: "0x69Df6ad9CC5A0b7D0F6DFf2c94ad7Ac386FC82EAbdAeDcEe4FEcC4df5Dd9F79a", balance: _1e36Str }, + { privateKey: "0xC9EC6aDDeD2Aaee8f9965cb36515bb6aF9Aff19EAA55dcf528b6Aec2A4fD0eAF", balance: _1e36Str }, + { privateKey: "0x4f18892E8e1FBC01ACAE6add931DDEFEd7D6cFd905dD0De02Fa58FFC53E1feF0", balance: _1e36Str }, + { privateKey: "0xDe930aa8Cd6FAb91E2d539A3D1aca1c89f0C1E08BddDEE837fA8Cf2BdD434b41", balance: _1e36Str }, + { privateKey: "0x95A98Ff8BfdA2ac3C1baA1FfAbF3b3928A0df36DeA7550DB3d8Ee2d3Fc8dF1Ee", balance: _1e36Str }, + { privateKey: "0xf4DD8EE213FA29f28dCDfaBEcCc0695dCDa18eF19faE501d9D43aCDe0dA04C55", balance: _1e36Str }, + { privateKey: "0x1ee1ef445fFd36F1cA6DcBa50DE1A3CC478c65FaCC471eAfBEbdc02F2b0eE3DB", balance: _1e36Str }, + { privateKey: "0x9FEd7cA7f195757F62C1ed9D8A601B96A2F3b7Fe604088ECF3FD1bc5F5cc1Bf1", balance: _1e36Str }, + { privateKey: "0xB49078f3364CCA5dc4DeE83dfA7bd5FF38FE89D6C58e5B08DC2c1FcDd91CeF5f", balance: _1e36Str }, + { privateKey: "0x734fDCCAf02Db436964A9eFD597E8707292BF8bEEe8da9CCFff9953EdEFc5f6f", balance: _1e36Str }, + { privateKey: "0x6Bd842Ba1Df4fB9A6d117969A518bce56c8d3dDA4abbedf3ca3ab0BdD2D3AeFb", balance: _1e36Str }, + { privateKey: "0xcbA7EFB3acfa7Ae75A0d58a310D8AA9F14ceFe4CD9F72F0dbd2ddeBA5bcDAB39", balance: _1e36Str }, + { privateKey: "0xDaaa1Af4Fd56C8C6e4B48D4177a66EEDa8cCecab491A3B3ecbC70A2Ef7C0EbB0", balance: _1e36Str }, + { privateKey: "0x6EDbb899a11AcD370bcd56fCb0a3EE12dd5a41c4E5B2BC69efbd5d08B77CaBd6", balance: _1e36Str }, + { privateKey: "0xc40EDe5891Dd94Dee1D61dAaF1eb2C13b7E7E2F28FeDd4F9cdFBFe923e6902AA", balance: _1e36Str }, + { privateKey: "0xa25FcBf74B6bEff262E30b735BDD68cecCA02F63e04ee14dc4BB7f9DB8f42f9d", balance: _1e36Str }, + { privateKey: "0xCFDAeE25Af4f61bee7B93DE2EAcabaec8C886D2ba0ECB2Daa3CdB8B247272CDf", balance: _1e36Str }, + { privateKey: "0xbfaCf6aE590A98d8eaCEDF4280Fa6FAAEEc5a4Bb709026f457e9F47CA3165aE0", balance: _1e36Str }, + { privateKey: "0x0bcBFBDaa02B377e9c4Be8dEfcd4dd1Ea644676D1fE0e11f3FcbbbEfF459Dba2", balance: _1e36Str }, + { privateKey: "0xaF45d38fEd4b68911958590dC36EbfEA8e4E3A126Be2bf200dd0afaF41C2ec71", balance: _1e36Str }, + { privateKey: "0x97d7cCF22d42b1FC4Cf7Fd1fcdDBBbedDccbC4BDa8e4A6C084cFbbE40951c5dc", balance: _1e36Str }, + { privateKey: "0xBaFb273781f8e63e8d94aaA4BB43e401c7eF8936e3b32216c8442F67a1B69231", balance: _1e36Str }, + { privateKey: "0x79f28732647dF2C3A7ff774e7FF4CD3C2f3DFdD6c5a8cAbaA9Dd8Da3bF51BAd9", balance: _1e36Str }, + { privateKey: "0xeEB5EDCfB5b943E3758CF76Ea55aDf2FBda7625CD30feafF5fFeB0fAefCafa3e", balance: _1e36Str }, + { privateKey: "0x5D4391a3Fb62BFCaf04021d41a5797Cbdd1EBCcDc16Bf0cbDe9d21Cfa18E996b", balance: _1e36Str }, + { privateKey: "0xbde9185B23dC7Ebdb1Ca5CdA543CE2b21F1DF9ba667Bb16Df0EAEADaD6A5E91c", balance: _1e36Str }, + { privateKey: "0xD18732F7A3DFec86d4dfAe75ED1f42cD9C8Bd9f5EE8a0FDaBECDB1D004AF6A1e", balance: _1e36Str }, + { privateKey: "0xd852e02ACAaf5BEDd163585C46Af085125c3a3A9832Fa1Cd8BB7D5cE6B7Cba2B", balance: _1e36Str }, + { privateKey: "0x6DcD73a0502616D619C1135A76B7FD7cBceCE81F01949EDf11DAd80AEBFBc960", balance: _1e36Str }, + { privateKey: "0xC34f65a1a1F6D1247EdF15c115920DADEA3e4cB3CFF0C4d66DBacbbe4Fe2bd5c", balance: _1e36Str }, + { privateKey: "0xc12FDc0D6e68675AF4CeE2eEA2dEC7b19Dcb3ADaFA1CE09bab4b4aDC37f075AE", balance: _1e36Str }, + { privateKey: "0xeAec4D5B4Fdf63beC6BD54aBC9cB3Fe02B48fe94C69BFcf6b9BDFDcDaebe3ADa", balance: _1e36Str }, + { privateKey: "0x9aaCcBDC0DcCEbBF2d3Cbd78dcEA590B07eDD66bC40EE4C268900B2e5dB5Dd81", balance: _1e36Str }, + { privateKey: "0xffa84ABf279c1872Be58BDF23536AEB9C54d183D194DB1f62Ba2f876D1BaF4BC", balance: _1e36Str }, + { privateKey: "0xFCECeC7E39EbA1dFcaBbeF933c2eAfD075BFeF6f6F2052019A90b73EFfC05b0c", balance: _1e36Str }, + { privateKey: "0xB047aC9C80ff22BDb6ebEfd4eB5ac1d7b8f3cD2c91DEb240f99bb0cfeEACCB0f", balance: _1e36Str }, + { privateKey: "0xE7FA65CfCb1DA7E1042D162De7675d027af9D5Ed74A5d4B97d89010cBF0Fba03", balance: _1e36Str }, + { privateKey: "0xc45dD5acbD5Efcf3D0f04c5cAB54ea5caCFDAFFa5BA3F5470eAeDC8DcF7aedaf", balance: _1e36Str }, + { privateKey: "0x3Fc11660Fb3DCB4F1E0085f9b6eBD9EF7D8f48FdBD93eBC1693D6d8FDf7aDCBd", balance: _1e36Str }, + { privateKey: "0x3FeC76BA1E7dd231d95bCcecf12aeD4bF7793c9e5CD5a9dCC184DCF50EaaeCdd", balance: _1e36Str }, + { privateKey: "0x11dC5Aa88cC54eCeBcE724dDFF3eAf212bf0B018A8C0E53dB54006fb930e5CFf", balance: _1e36Str }, + { privateKey: "0xfafFFf9a68Ea5eDF4Db4dA32880Ce8e71DBbf95495b2379A028339A0c6B1d0aE", balance: _1e36Str }, + { privateKey: "0x1e96a7A6A8262f377b98e381265Cb1Ab3dD5a0bA5A8aDFd29d2D53FaAbA36e4d", balance: _1e36Str }, + { privateKey: "0x2E38D9e40185964f36B6E85eb7D2a6Bb3305F0E1EF69c77Da372e738D4E13EA1", balance: _1e36Str }, + { privateKey: "0xF1E1dF380c20CdDAFABEF1F4e732cbDDA17E2933E1Dbe9f6aD20568a23A38F1b", balance: _1e36Str }, + { privateKey: "0x1fd7D1DFcB08c1B364c1eCB3497A3d8fc4Cd7fC88904649F995Eed9ACC1FF42B", balance: _1e36Str }, + { privateKey: "0xfAEc1beF7Fb49Ca0bdf55B205a49D1d3406Fafb4F3DeBf0c1a54c27Db5b26999", balance: _1e36Str }, + { privateKey: "0x1D7D0cFAD91DE154B0df10dD11965c5C2851f066B68e3eFe707E69edBF6Fa4c1", balance: _1e36Str }, + { privateKey: "0xa499cAFd8c3fFbD270fC8D310BaFd1b2cE9Bf8D4aba3e36dDAc4a176acd4FDD8", balance: _1e36Str }, + { privateKey: "0xb7d5B4EEcAB5CC1C2eDF888e4Ba885F65A9DEBe7ECbc51Ad6ed133A59FF01c0F", balance: _1e36Str }, + { privateKey: "0x5CE5dAbeAF26c7C3df6DCF8AEa8919B9bf2E0AC94739BA7C637deDB214874C63", balance: _1e36Str }, + { privateKey: "0xD0E74eCEfDc0Ffc39ffF6D180dcdfEe350BD9220B8a6AEc3De5cb0fF9e6EF548", balance: _1e36Str }, + { privateKey: "0xf9b91e2C3028b6F97CAaAE9E0e991Ad854Fa2ce0CbbCE829D5C545F8d001BD0e", balance: _1e36Str }, + { privateKey: "0xDFd1C5cCF079B3e4BCd4Ddb1Ee6D1e14e2c6CDA05a6D0dbf02B221637701370b", balance: _1e36Str }, + { privateKey: "0x1dC552efbD0d0f95A7C61DFE80407513fd2752e0De714dBe1Fe6dfBDB45a71Af", balance: _1e36Str }, + { privateKey: "0x57f0043CDe7Fbd87592F45C8720d3cE4a6A2BcAabab6fc13a0E2F21b64806E2b", balance: _1e36Str }, + { privateKey: "0xBBED1BdAC93D1DfB7fACea1CDdfD8eeaeBf7F01dEfedcdCcB8081aCFBDf5E093", balance: _1e36Str }, + { privateKey: "0xB00140d90CA0C19B8dBE7ac383c3e48e091a569fA0BcDddD8DB7fBA3326829b9", balance: _1e36Str }, + { privateKey: "0x43aF2b33cfCE8b700C20a039fb1dbFCeE46296c8a86F357D810BCfd84a5abACe", balance: _1e36Str }, + { privateKey: "0x18BA2EEFBee115Eb1E9842018F5eD31ffC1D9cE0EfE5BEF7b9Cf2cd3AFCDEb37", balance: _1e36Str }, + { privateKey: "0x8848fE0D7cd24D44FE93Eb07eEDbcBAFBe48468E192ed3ADD8CBDAF091FDDc6A", balance: _1e36Str }, + { privateKey: "0x5CcFCd98DD6b00BC24FFC6bb68C323f9d0cdCfdC1e433e7073B0ceA4ff9E37A7", balance: _1e36Str }, + { privateKey: "0xd1b9Cc572Ed2CD4B3a71a5d3D609f7fb714e7c9c8b48E00C5F4C9f163a7FA125", balance: _1e36Str }, + { privateKey: "0x560FB81dBDFb2Ab9507fCC6ACCbB123cf6cA4fD03Db925f0dE588EdEF13b4778", balance: _1e36Str }, + { privateKey: "0x011fd4e372Dca408eE865CDddEf808bbEefAe22F10BA98c7ddf5Da2DA7Ae69A5", balance: _1e36Str }, + { privateKey: "0xd6706CefB83ee1dA3E6BBB7BD620fc4CcFF0cF048A7fA94f9bf41b5eEb1Ca1c8", balance: _1e36Str }, + { privateKey: "0xdBE90BcdcE1fe2BfAdBD6A4B3deD84a39cBCa9F3DBCaB5Dccb800Df0a2cab072", balance: _1e36Str }, + { privateKey: "0x25AD5ae641b2Fa4dcFCE2A707C5fCEBCfc1C13106E9751a17F62a6a40f94b3AA", balance: _1e36Str }, + { privateKey: "0x8fe8296edC53Fa84aE72E3CD0AB3dcD1c0fC2eEb5993c4e46f66AedC0cea5bd3", balance: _1e36Str }, + { privateKey: "0x24c57A6363DB4ae8aAC98457f2D686bCfbCC931fb4dAccE71daf9dAE8eeD9910", balance: _1e36Str }, + { privateKey: "0x17304F39f8cF50aE3737fbbBdf5B479f60b4904203CBBfbF7d7e0aeeeBE5eA1a", balance: _1e36Str }, + { privateKey: "0xD0Ec8D0Cb7E81c87c64841aACb4cd70eCf4acb0E3Eb5ccabb1B6dbF69b96aaA8", balance: _1e36Str }, + { privateKey: "0xbFafa833cc9Ff4F303aA092B702bD8Cb187FFDed1bdE1F4993fDd54CC63d4fb3", balance: _1e36Str }, + { privateKey: "0x8639e88A16F66F849bDEe7c4ECd3CF3e12f3D2edE621e6ED9C6DAD47Ba0Cb6BD", balance: _1e36Str }, + { privateKey: "0xbeB0CF5F46bA2CeD21da8E0Ef9597895E6f2FaB93aabFC23f0Aa784391B2cf49", balance: _1e36Str }, + { privateKey: "0xE85fbE9465ac30ECBaCda7d9Aac35aAA3191eaB7A88197733fFcA7cA93EDdE0A", balance: _1e36Str }, + { privateKey: "0xa85a994534a5eC049bfE71Ff749EE021C80E727b8D8Aac00a3fEA873546BFFEa", balance: _1e36Str }, + { privateKey: "0x3c84Ec6bff9feA5CDd20aecDBe72B64e20D59Fc66C8eBFcA3CE1df43522bb7DC", balance: _1e36Str }, + { privateKey: "0xBeAdCF1f1650e26A903570D05b6504f30909988DE7d939726AAaE01FDf9c9dEF", balance: _1e36Str }, + { privateKey: "0xdc1B7Fc7AA40df0cBffC278Bd73f74a8E7dC436C7a3FdbFbe0fdc733a87249C9", balance: _1e36Str }, + { privateKey: "0xa19BAd9E47DE1AF2Ef6ebFaA5FF0BbDE14E1BDCAB6c121a5f30Eae2Afe713eC9", balance: _1e36Str }, + { privateKey: "0x004493BE3AdcADA4688dd99102F40aeDea099fC438a9aB0d47DE6Cf9dC9aDaCF", balance: _1e36Str }, + { privateKey: "0x6Aa7eBbCFaDc84DCE7EdFAAebf4EE1DCa6b5D3bC2a4aa2Ae60011C16c95F043b", balance: _1e36Str }, + { privateKey: "0xfB1e593Aa1F596Cc425C7B5F1EdFFdBa8f246EBDE496470b9f6DeCc6aFE11f28", balance: _1e36Str }, + { privateKey: "0x626CF73E7efBb7AEA721f60cd7AC92d70cd2B3880Bf9ef50AF8A25a162De1FB8", balance: _1e36Str }, + { privateKey: "0xDB18BedFC7097Fbcf4fbeBFD19c9C2D42e2AaCEa9EF0f0dB7cDedb5fb7642Fab", balance: _1e36Str }, + { privateKey: "0xf3b73FeDaDd064a4D8A6afCD44ec367364bFb7c92CDeA21e3020c4951318eDca", balance: _1e36Str }, + { privateKey: "0xBF2Ebb19a3BD5d7A7d4c9f985bcB4DBA99B1F4ABc1C0F19c7FED11C2eB30f952", balance: _1e36Str }, + { privateKey: "0x88Ccfe1b065Ae8CE69180977c64E97Aa6C7abBEaBaDA32d5c6B70FaAdf79B3A0", balance: _1e36Str }, + { privateKey: "0xb94F8bBb5Aa4dC7681AC48262Cbe3875Ae7bbbc6EeDD0A680E2b4b48ffb7Df19", balance: _1e36Str }, + { privateKey: "0xcd8CAe0CfcD892cFEd45DC80Bddafe2289CEa7BDe0FEC8CBbA1CB282Aad2CcC5", balance: _1e36Str }, + { privateKey: "0x22EfBb2CEdb6Ad5aA9b7f9A2dC8bC5e457b223d50B0BCFe0Eea8A6AFAbAea9b7", balance: _1e36Str }, + { privateKey: "0xa8e012cbEcAB6d157E4ad082dD5f99cCc02F0b5EABF04FD7dFa3a1ECc631E4bE", balance: _1e36Str }, + { privateKey: "0xe5EC9FEB9205805d7b26Be4a00beF48FBBe56CcBaD7F0C8d0098Cf2A3e7EaDDb", balance: _1e36Str }, + { privateKey: "0xA4E19934B3afAFED681d999Ca1d8eB681DfB05e9DEcdf53700aa7DC2E46c9b18", balance: _1e36Str }, + { privateKey: "0x1C80Ac7e73D58A3fcA48Bf2aec5a8D136a7fF5Ce08BAEED5ffF352AeD63a35cC", balance: _1e36Str }, + { privateKey: "0xCDD25b8ED4bff2Bb7e30be417Cea90dEBa69FAcf9e6C3ED33D96eca2C026ceeE", balance: _1e36Str }, + { privateKey: "0xfAa21F300d9d39E5Af4D2b2ce11632ddeDacAba2C9BBed63A61f49DD0cbDD0Bd", balance: _1e36Str }, + { privateKey: "0xaA2cE6Dc554BEC463DDE2123C9C31DDEFd8Ebfe5eaE88eC1dBC73101a074AB08", balance: _1e36Str }, + { privateKey: "0xD7Cf1caE9b18dDd0D123cd5d73FC03CFF74CdAaF9F5BAeAA5Bc9CEd9C3a23bDd", balance: _1e36Str }, + { privateKey: "0x0DF37FEd09aa15a93e8DEBdF8BBDDFa8b4d48BC2BbE1B87D4FC93DC9db6Dac3E", balance: _1e36Str }, + { privateKey: "0xD0AcB70cA38a85EA5fCCE279C9E92cA46eB233df7ffEC0A5bA1C97d4Ec3a6cEe", balance: _1e36Str }, + { privateKey: "0xEDf109A5f068C7f6a3827Af367c3d79FF78a467EFfaEAea3d50AF8CbFB0Fa01F", balance: _1e36Str }, + { privateKey: "0x2FCFd3Ac43219d7E0CCfeDA9F822eDBB2b1fdc8bAd30958Eb7e67BBa8D9cdaED", balance: _1e36Str }, + { privateKey: "0x18b7EfF47073CAe4Ded58b13aD87BdcfB8Ac5Ba829F8315573CEacA197C05DbF", balance: _1e36Str }, + { privateKey: "0x5dB84dD1EC7Dfd875F1eeEACd338cA70cD7dF7DEecB4Ad90AEbCE172e1067db7", balance: _1e36Str }, + { privateKey: "0x1c4EBDaa2Dda607C8b15eCeDff3765046BDfF74679aBc3a4bbFd34Dd0cE49deE", balance: _1e36Str }, + { privateKey: "0x4ae4ac2dD45cAf96AB5Bb06ED3D6ed9693f54b0702dEe0b6f57Be446dAa0155e", balance: _1e36Str }, + { privateKey: "0xde6D95DC5fB42d65c8a46A94e86C43cC57fA9DCA6Efa38F90BfB2c5c4F0eAb33", balance: _1e36Str }, + { privateKey: "0xcfEA1C2bcBbF2fEAB3599a323Cd827f169759F0D02B9EE257415028f8F6dA0d5", balance: _1e36Str }, + { privateKey: "0x54eF8FB2463DD13b79A27C156cca3b5be4b01FE8389FAfD2f997cD1B82ecfCFF", balance: _1e36Str }, + { privateKey: "0x75A8AB521AAEeaf0E42e77cDaD4a4AfEAf7a2f8a150C9d1Ba62d13FbbFDcfD81", balance: _1e36Str }, + { privateKey: "0xD60667da5feB3E0D8dcDF76D02fEFF6aCDa9e25BC5E77d97aafE4e8F2eD75eBe", balance: _1e36Str }, + { privateKey: "0xf383a7EB9D9DB8e5efee7476afFBC04a7EFD509a34ddeb4558FcefAbDb212ea1", balance: _1e36Str }, + { privateKey: "0xC9D0bda6b7782F6E3bE8b2Dfe2c6a980ce9295Ea5Ee4bf7aE639CB627FcEaB09", balance: _1e36Str }, + { privateKey: "0xfeE3A4D514e4fECeD69ed8Da9f4AB5f5C1dcA48D6dc9cF2acB19787fe3BC79DB", balance: _1e36Str }, + { privateKey: "0xAFCF716fbc2DD744bDc701FDB8fabD07B47BF8ef7Dca8303E951A39A4a9f9cE7", balance: _1e36Str }, + { privateKey: "0xC97AebAF9C6bE1B0739BebFb46cEfaAE9b62A298A77DCfc19CD8fB1B9D0C3259", balance: _1e36Str }, + { privateKey: "0x22ee2eAC806b1Ba3cCAf5f7DDb0F8CBc3Ba3D5315cEF878FD0f3dA6b2aD3E64b", balance: _1e36Str }, + { privateKey: "0xeA10409ad8924df6fdCDD543327E823D7A62B6DDCdf44AbfA8fFa5581d816b2e", balance: _1e36Str }, + { privateKey: "0x1A2BEBB1E3ed72B4ceD24b645Afbea43AeeD9fB64cec8Cac641BcD4dD4A1d7Fc", balance: _1e36Str }, + { privateKey: "0xBA1E1C4Fb4BfBCe16cbbCd2A1307FfE3C3cc75AA6f7c9568e210E54761b043B2", balance: _1e36Str }, + { privateKey: "0x0EDaD22FBa7F93b4BAC019e57eF6bB9839d9c347c01E865EEAdD2D35fcc8f13B", balance: _1e36Str }, + { privateKey: "0xcb11eDE2faDca37ea4C20f3e3D75D61DcdcFeFFAEB28C82a38Ad789B3b3b23de", balance: _1e36Str }, + { privateKey: "0xabe2B8EaedE6a50A21c8Eb7FFFcdd563d3e6AbaEBCF667D2168dFCcd0cc72d7E", balance: _1e36Str }, + { privateKey: "0xcbE612CddeC30eF0f24FBb5CaDaBC731cFE11bE65eD66037fe2F410cDEFF3E0a", balance: _1e36Str }, + { privateKey: "0xdCeACc56f3Cf9Adb2b0ebE28CCF40265DbAc01995b2A85679dc73C397b3C53AC", balance: _1e36Str }, + { privateKey: "0x81ECa333Dd6Bb51eE5DD8eB863E0dfC60D7EaBE8f53E1998aF52FC2b331007aA", balance: _1e36Str }, + { privateKey: "0xe84e0F0A1e5c21F298f07eDFBdBEbecE22A5c133Aeb9Dc32cccf6D0AFE3BFFAB", balance: _1e36Str }, + { privateKey: "0xF60f98ce3DDCC98A3aa8EDDB68af5cb8aAAe29B1Af9d9C29cBcD6600C4dCB3f4", balance: _1e36Str }, + { privateKey: "0xCf65fF4BF0cb9Ebd4a58bEb6355d6E15d3D4c94f2e2b5C830aF7dBEaCdB32bDf", balance: _1e36Str }, + { privateKey: "0xAC0Ad3d4CCdEbbc0b8831Ea9D3D39e6f9c5161eb1ebB6CcdE7F03cc3A4De0DCb", balance: _1e36Str }, + { privateKey: "0xA529bFDD67A161bf31010CB0C91744d8D51F37Ceecac742aEFc4CC94cFB14A7F", balance: _1e36Str }, + { privateKey: "0xAB2471c4e05db5B1b7bd7595deC4BCBC4Ff2a21f975e8FF8b258BFBd90bAE9C2", balance: _1e36Str }, + { privateKey: "0xf52753e7CA0FFFcEdb9f8bCFAC09ABDc4160aff7bF0cA8D9Aa970B892ea8E49b", balance: _1e36Str }, + { privateKey: "0xdEbecAE057Ebc1E05783eCe8fc4f71a506880e55Ae15C1aEf5F40E5E8608d594", balance: _1e36Str }, + { privateKey: "0x8a0b2C7E6ef8A478D9A8B0bB148e2BBba0d2cFee76Bf0860BB68f7C0F1d789ba", balance: _1e36Str }, + { privateKey: "0x7EF23Eb49F7BA9C332b5c1ccFdADe4C4df55Da959fac3AB4BD8999BCdA027Ac5", balance: _1e36Str }, + { privateKey: "0x5b8c99342De51EcaE5aeBE77fdafBFab3af4FeE6caDaf0fBFf9d968BDA9Ace3e", balance: _1e36Str }, + { privateKey: "0xffAEd61eE70641dBFfECBAfdBb969752A9AEF3CB710DAbCCCCcdDDBDfDDCC2AB", balance: _1e36Str }, + { privateKey: "0x6c8eB2AcF8800CBedbAfBE15a599c0ada55e5E3cdeE0Fd8cFd8CcC5A530FBCC2", balance: _1e36Str }, + { privateKey: "0xdF99a988D79b4fA0835D53cFB35e48baB7b37990655E828aD8FA14Da763fdb17", balance: _1e36Str }, + { privateKey: "0xFDAEC48AFAf55933dD0bc2Af9aaAdC157Cf192C936C5CCbAb37d5C860Ac7fC43", balance: _1e36Str }, + { privateKey: "0x13624Efab7fE888abb7CD390043df2eee40Ddad2BAEf829Da7f29E8fE3AcEF43", balance: _1e36Str }, + { privateKey: "0x4C1FD68F5dC6284AC1B63A933EaC2AcA182381aAF767ffBDc6D5eFAfEA70eec7", balance: _1e36Str }, + { privateKey: "0xDdfe82EdDcA6b5be7E57Fa8a4a1eDAcFBF57E1fCC2D2f21F56E9F8F843b2e0a6", balance: _1e36Str }, + { privateKey: "0x342aC2DeEEccbeb95dab2dE01ddabB6Fb8f82D5D1Cab4ea4B76212EC7D8d71b9", balance: _1e36Str }, + { privateKey: "0xC002fE67B307403dfA95dB342F782d624CCCEa404B5DfCA2aed2a7d3A924dB42", balance: _1e36Str }, + { privateKey: "0xa03e9eA52eB91Ec3e86bB4F738ae91Af94aB73Ce35F61e4D8f8Bbea6b0add32B", balance: _1e36Str }, + { privateKey: "0xe45B47DbafdaF2E6bACC1D5Be61a25C8D0CfbF37eceED8Ece3Da51A397EF0d8D", balance: _1e36Str }, + { privateKey: "0xd32EbDD5d0E087CC6b9dDCd22A1FBD133e413Ff05f8c1bAE9AB14D518FBdAF8a", balance: _1e36Str }, + { privateKey: "0x3AAd6e9ADDdA9e1ca82AAa1cfEBbc7f4D7389df8Aa61bE5EA4D7aF12F3Cb20AD", balance: _1e36Str }, + { privateKey: "0xF8A7794C011dA19ac8E96E591ECF6fbacd42AD857440deddA29bC9DdE0b74dc5", balance: _1e36Str }, + { privateKey: "0xC2c5Bf5eCF3fDdAC33cEf257fb947BD83a5A84aaC2A5C55d71C9A542ce107Cdb", balance: _1e36Str }, + { privateKey: "0xcd7c4fCDC448F8036AD952aFbD2E23aA5e4ffA2D9Fca58846dbbaab245bFbEFc", balance: _1e36Str }, + { privateKey: "0xCCEa8a4FdA23ced29Cfb31DA636CaF39AF3eb0a4043a6D4b6B3fcFF1DAEcAF9c", balance: _1e36Str }, + { privateKey: "0xbAdaB8aC29734aa6947CDcdEEAfe96563624eD9D4e59B6cd5D6043C71c8E74CA", balance: _1e36Str }, + { privateKey: "0x1af40aa3d7510d1aA399c8aAaacfa5CefA2AA4d0eE9E7C398BC21baf66842C92", balance: _1e36Str }, + { privateKey: "0xCDE3155F3f60538fAaE857Ae2EdEf6C3eB2C5AdEc4fF6dFfbBB874E1ECE3ffb3", balance: _1e36Str }, + { privateKey: "0x86fbFCbBE7D15C66dE0d38fE05bFeD9D76442DAca1712dBDf3CEdBE8bE6B376e", balance: _1e36Str }, + { privateKey: "0xF5f5E0EA43ac3A20390c6AC96BDCadA0cAcC151beDd8151F8A6446f0C9E44c9f", balance: _1e36Str }, + { privateKey: "0x3cc7DdcADF43AFa8Aa90d1b1DC50c96B357Fb61A7C9f0A1d5C9B3bB64A0DfF1c", balance: _1e36Str }, + { privateKey: "0x4aF1248a92D4c1bFBdbE17fa14fE8eC4FCf19Cf9CBfAE9281eeffb5b5F6192E7", balance: _1e36Str }, + { privateKey: "0x883a24F9A39F3cdE5FF3E8Ea8D077E02D275ABf3Dcb4Fc47B8c1c4A10E637cbe", balance: _1e36Str }, + { privateKey: "0xB69525b2B1FA9F2acBCafce11BcaEF34e04Ab2e9F6B0aafb5d1Ebe5cB829B8eb", balance: _1e36Str }, + { privateKey: "0x9f9d2Ac96eDc59b2B0abD009BFccDE0Ec73c25bE9F3Dd19eBf58DED76aaB6CeD", balance: _1e36Str }, + { privateKey: "0x3Fa5c25EdDdEBF3ef85Bc18D16Cffc00c82AbF5AfEDfdbD32950B7FC9D6bdB7B", balance: _1e36Str }, + { privateKey: "0xde68FE37083dA72A5Cff769FED4bcACfefEdb30035BEac2e4F7A1bC8CAfe55bc", balance: _1e36Str }, + { privateKey: "0xbe9f07De2B6A3a6Bf440e1392aBB9a757C1Fc96D0FA5D37FAde4E497792E6ACc", balance: _1e36Str }, + { privateKey: "0xAEdEa91E82Ace1b58718CC4BAebF12c9b3Db2B7D0cD1cA4F95A2fd1cFa0Feabd", balance: _1e36Str }, + { privateKey: "0xAA230ccD7e3CD6bE51cFCAAedeb3eb0e756BD54bC1b31E96A6baB17D4c52df4C", balance: _1e36Str }, + { privateKey: "0xb234ffafAa1ECF70A49D5ef2A0c8697E1c8D9c51B2F9b0EED733CAd5fFDD1e5E", balance: _1e36Str }, + { privateKey: "0xaEFbE7EFbedFE6d4D01e5dA9Fd1807AfF066BeADF853B3F27Db42dFfd357BfA0", balance: _1e36Str }, + { privateKey: "0xbEF03d032BB1D40A980C4ad18B3Cbf0351aBfd2D82ffa0e3E0FFe67E8B4bCAb7", balance: _1e36Str }, + { privateKey: "0x0470b2CE45A056FfcB30abCC1ef4D50Fced6b1E4EF70DC71f2D236840E9a4cC5", balance: _1e36Str }, + { privateKey: "0x6EfAb05F9990dEFAeA019ED14e3deF0A1dF91EBcD96bC5Aa3A3AEac2e3fb51AF", balance: _1e36Str }, + { privateKey: "0x3BedD06595d0fFc7955aEcCed8f5F8Cfb2feaAa1B2E1f67F2e3393Ac19DD4512", balance: _1e36Str }, + { privateKey: "0xa50AAEaaBB4AD83B9cCdd5EAECc66bCac0ce3A3Ad5dEE4D45517BfdFa9c88F7F", balance: _1e36Str }, + { privateKey: "0x6fc5Ee99c79beec4DCB3caEB86910c2BcDf71A5234c757A63ddbd7846a9d907A", balance: _1e36Str }, + { privateKey: "0xBCc4fDDF957BC7c03cFcdaCa9E022597ecb37B3F0Fb13D86F2A8f7aC243b019B", balance: _1e36Str }, + { privateKey: "0x1a7Bd2AcB4063c94dc71DcA24c90ba2610cCcd3A0CF01fD643255f95ACA2480c", balance: _1e36Str }, + { privateKey: "0x1DEa423f0A9Be91A996ccdAb9640aaf69Db4C4eA92FAcF23DaDadA6a561273D3", balance: _1e36Str }, + { privateKey: "0x9fd3D25E5581a083f7aED75c293415CDfb0C5e1AcB50A9eFcbE007bC9DF68edc", balance: _1e36Str }, + { privateKey: "0xfC055ED6ADDD5a66FD34dE4B0248AA4Fb8Bd5eacAfecDCc9d885EB276AaE8EbC", balance: _1e36Str }, + { privateKey: "0xCdc28dFD70Ea5C3F8DD2e501e280F6a8E7cAbAecE5a5d43751732CfEE2aCEE7e", balance: _1e36Str }, + { privateKey: "0x9CA314D91caF6f676ab6b2B9AEB4F6CeAcBfe8eC4df23505AC0FaFBaC8CF7ef5", balance: _1e36Str }, + { privateKey: "0xf29be03E90c3f0bFEAfACFb38668C6153e3BBaF47C916c059fE3287C2fC1925f", balance: _1e36Str }, + { privateKey: "0xECB29908AdB1bAFb5fbeD1d10fcB896f4Fb3c3D26aFe2b1aaE24e02b0198E4d3", balance: _1e36Str }, + { privateKey: "0xbBCF3d85d9bc8ec9ecdf7AB6DDb03634e79c94f9ff3d81fbCe7DB12f9663EA85", balance: _1e36Str }, + { privateKey: "0xfe11FcFaaA3dcF9235572a3b956FE9bDddA631890fcc1BC70B5Aea6459ac05DD", balance: _1e36Str }, + { privateKey: "0xBb7fef9f8bFec37cAFf5A8BD03dDb8bE1dA13ad22E42b0f76fc78D9E2E9d2932", balance: _1e36Str }, + { privateKey: "0xcafCe7348aC1aeAdFfeb9faabF5944f4AB3ce6859DDcB5aa1b95BEc6a127fAeA", balance: _1e36Str }, + { privateKey: "0xA58D4Dbf273c8FCDBAC765A5C03846060D21d599F95055ABF1bDBd3D5bCd478c", balance: _1e36Str }, + { privateKey: "0x9446C99AF1fd38C5b76DfCAe1a7E87b98Cf627dc48Cc91dF4ddEa8f4Edc34FE2", balance: _1e36Str }, + { privateKey: "0xba8986dDCAea2ca81fA3BfcC7A66C34Fd4ac67cFCb7aA89E19FCFE55ca82BeD1", balance: _1e36Str }, + { privateKey: "0x5eE33FEa64dCc77C799A48065348BB956a79A0CffAAABdeE7edd2AE912E262c6", balance: _1e36Str }, + { privateKey: "0x4d6cDBBC4c1dfe97E0383f47ab33C08fc47eEd7f448e9EA8e918ad0FC00aba36", balance: _1e36Str }, + { privateKey: "0x2DBE32C1C5FEF03eb40Ab4ced59ca8DEef43a8e214802D4DDf6bD73c95f92ED0", balance: _1e36Str }, + { privateKey: "0x2e929cEEfDaDF29AaEbF7142A9B34c68Bf3cfFcC8C0afa30927fd1E37d62B88B", balance: _1e36Str }, + { privateKey: "0x859DFf9e0C84fD41820297B60448b074aABc7aae0AC69DDA287AdB53aB413Fc8", balance: _1e36Str }, + { privateKey: "0x3eb17Eef6AF285e40d6D510dAc28de17a1B8665D5BCA78B765e8Bda4Dd0cEf3E", balance: _1e36Str }, + { privateKey: "0x1c6caaD90EbDd5caEcCF3aDeBDA4F84DD8d097c8802dFDFaE187BD8EDeFEAC6C", balance: _1e36Str }, + { privateKey: "0x9cE9CfaD02eBae4f35E7EdceDF675Be4511fc96BBfeecC5e60f00959217C8Bec", balance: _1e36Str }, + { privateKey: "0xdc31f576C3F2EaF8a1cdC2Eaf927Db64377D8dbcE15ADc832C3C14a36BAfaF8b", balance: _1e36Str }, + { privateKey: "0xf8EaDADBBEbDfc110Bc65E2c1F4B9Ded6f1AEB40B80Bf39C47DF4BcB75e0b956", balance: _1e36Str }, + { privateKey: "0xbC5EF4a10aC7dC6BdFdE498CCd1FbE4BeE6a3EaE5997dacd4f9196BaB6c7bF33", balance: _1e36Str }, + { privateKey: "0xcc61117Fe1Db61BdF74708Acc0ba6eD9C7DCDDd6FDD73D6847f4fdfAD955FDb3", balance: _1e36Str }, + { privateKey: "0xCcbcFE001eab3CBB1bA87BCE8cE2E6645E1edcB46D91D67eAA0ffAd3a6C61cad", balance: _1e36Str }, + { privateKey: "0xecdBec45f14F1Bbd4Cbec2AdccE87b9de2B9Eb2Be9a5E650bbE9F4846cda9451", balance: _1e36Str }, + { privateKey: "0xc3aba0F13baBa70d7EddA7bA64a6656eD67D566E95B0BD57Dc6113cBF96Ba28C", balance: _1e36Str }, + { privateKey: "0xf2Dc784baACc11b0E746d3fE7Bb102819a64d57B99Dd67be9DBcDe2D9Cb09BEf", balance: _1e36Str }, + { privateKey: "0x4eF8935EFD03EFcf57ad026cdf7989BaBC3ECd50DD11aefBaAECb1256f600F68", balance: _1e36Str }, + { privateKey: "0xcc08d111Bcec006D79987cAa3C48D0de1605D587B9CED3FA932CAea3dc632167", balance: _1e36Str }, + { privateKey: "0xBF5E9dC5AF59FcFDa205D04310a1c66C847AD1fDfbd36C0dA080B182C1ebcf5D", balance: _1e36Str }, + { privateKey: "0xFB86a7666F3fB8Bec6Ebc0fFd2b063bc4655e2FB38cD4582E32dDbC9e94FAAAC", balance: _1e36Str }, + { privateKey: "0xD76CE6b726b4b50Dcbf864fde5EBBB7CFF212fB6A98F5bbB53D742AaDF24D838", balance: _1e36Str }, + { privateKey: "0xE1DCc9952eC00aB57Dc9d63cFfa5befFec53e9eCd311EC4A9bE92a1ea6112fa5", balance: _1e36Str }, + { privateKey: "0xF3b7cFADCf2Ca68CcfcF380abE18C7E69DeC01Ba48BAD783DffBfdfdaFEE6cDD", balance: _1e36Str }, + { privateKey: "0xEf3A859bB1Ceee47a3f5D8ab57ff2CC6Efd3B1BDDF4b30c64A2A639b4bb926fD", balance: _1e36Str }, + { privateKey: "0x4da5bDD86b0EeAA0F2A820Fe2AD1d7fFDf96Bfe4AcAbc1B23Bb0ACAEd8decf9D", balance: _1e36Str }, + { privateKey: "0x95E5ae73033E9aB2CD56C3CeAE9E47Ac32Fe4244306c4dEebFfBc3da809dE1b3", balance: _1e36Str }, + { privateKey: "0x249DFd85B8CBdcDceEAaD2Ad9Cebb92B1fF8D4bEb42f2262db1Eb18bdce081FE", balance: _1e36Str }, + { privateKey: "0xbf24bD2A8732b0ff34aC466Ac8bDDFC79C2f2C5ED5acdfABEbDD71bb5fB8C230", balance: _1e36Str }, + { privateKey: "0xe4cA41d0B9bEEAA6C1B5dC974421D02cC4f454D60dcAe06bfAC24A62edd1dDD5", balance: _1e36Str }, + { privateKey: "0x47fcCC94c315e0B40acdB92B2660391fCF09E77C5cCf5fbdc54CC4DD1276C3ee", balance: _1e36Str }, + { privateKey: "0x4AFc577d869ae8dDcAc01CCd10f4d006eBAe35c6809CD6eb8cB36f5dcB10E4df", balance: _1e36Str }, + { privateKey: "0x24ced26ee55ee964D3Aa239db36606C0bf5fa2683E25D7C913923eF40c7C6C3e", balance: _1e36Str }, + { privateKey: "0x3EAEaBd428D442b8Eb94f63824bDB7dBa3FB6BBCE02AC716EDE9a5c4ADb3aa8a", balance: _1e36Str }, + { privateKey: "0x1058AfC84410FEEa779D797ac9712EB384AA32e1DAeDC05E9E1B5B6faB312D48", balance: _1e36Str }, + { privateKey: "0xeF2D273f9113dE26fE9EE58e5cDD3b647D649713FcB510ddE583660dad902dcA", balance: _1e36Str }, + { privateKey: "0x97111bFbeB4ec008601C8c49Eb00b877d3Ed94DcdfbE1bFF440b41De6Fe1C1bA", balance: _1e36Str }, + { privateKey: "0xD44A809FCfD7ABBf0B1fb58926C6aFb8db0795AF1EC74335c0aE3cBc59bf7388", balance: _1e36Str }, + { privateKey: "0xf7AC785aFEe8C7C4CDE8a483DFfB9F04C7c2deCd40F1Ad6f7279b23eaeBDBceB", balance: _1e36Str }, + { privateKey: "0xAe3D5FC926ceBa3D8438fe04Cc67fCd3FAadBeAabD3daEB1F3B07981Ae8Bb8d2", balance: _1e36Str }, + { privateKey: "0xb97f6405A4AdE29fedf162382E24F072e3E44971c57b0270f57D3eD9D0bBC691", balance: _1e36Str }, + { privateKey: "0x5016cbe6af3F5eAffDeA93689BAB559cd62864be4D1f95f3433E80f85eEdd14B", balance: _1e36Str }, + { privateKey: "0x89Bb39638275e8FfEb9E3E1c288D8Bd9de9B03aDE02755AA35F5c2CaFd1Aca26", balance: _1e36Str }, + { privateKey: "0xEdEc58aa9b6FF626B39BA1A550AeDCF3f09DabdCE67f23a1d8dDd8e0B5D9ece2", balance: _1e36Str }, + { privateKey: "0x44E1F326d0F73CA83BfC5F4eFC6d38d923a7b7a5F50B2a5F2fb8f1A5Bfc6Ce37", balance: _1e36Str }, + { privateKey: "0x7002adf36a3aBE927CeC9Fd9E7D1A270E9Eb30Ad6E9A95c64c2bCF0DDa595579", balance: _1e36Str }, + { privateKey: "0xe49AafA75EAE2fcD27BCe40D95dFC1CA00dc6d8aD34E85070a2B209E02Aa8bBF", balance: _1e36Str }, + { privateKey: "0x93Ee5ddcEAbfEfae36f19bBEA9db08ce13AbF0eEA4366461CADE4B1a5F5F2Ffc", balance: _1e36Str }, + { privateKey: "0x7eEE1B08BBfc152fBFEe24bF1Ef24D74D7a99f53f505f94bF854bCAaC6fDD5AF", balance: _1e36Str }, + { privateKey: "0xfD7691E1C4e6eeE93dbFA56e471dD8Bf6d96d5B4c5772De222Cd3d743FDA4bbb", balance: _1e36Str }, + { privateKey: "0xC5bAa47DA0aDce4da81f415B7Fa1A2d265e6fbD2eEa9627eC627d13514551fb1", balance: _1e36Str }, + { privateKey: "0xC5dC2E62bE2Ac6Fde7c8bCfc8eeDBF1dA2023D1ebAF15c99445dADc8afA54aBD", balance: _1e36Str }, + { privateKey: "0xDA69F8cd86e65D9aa0bCc3Cc0770DFe8a92DA8c3c204DFBC59c8DF1bC7E8cfeE", balance: _1e36Str }, + { privateKey: "0xCfd8ad1dfc46Bbbec5acbB78a99dDD539CfDDF10dF33809EA2Fa14e829CFadc9", balance: _1e36Str }, + { privateKey: "0xFE2AdBd2Cd4aCf2A5420ccaa2Cc57488BbDafeFCc276CD260Ce57232B0fe8D9f", balance: _1e36Str }, + { privateKey: "0xfc5aAcf203DdA20d9ED026b021C38FA30f79dBd11c910B8cADCc22736Ac999aC", balance: _1e36Str }, + { privateKey: "0x8fF400ABf0EFFcEeDa96E1E9FEFF630b41fdc5dcC73385FE21BcAf4A6d13FCC0", balance: _1e36Str }, + { privateKey: "0x8FeEaa20716F2d9Cb4F24da2b946B73aDDa9CF0dC46D50fcCa3D9A8ed7A5B629", balance: _1e36Str }, + { privateKey: "0x39BFCfdc6336c3AED93e5E1fcDF6dC5aD5FfDFDd73DFDDF92EfC9a7ECd4F2B66", balance: _1e36Str }, + { privateKey: "0x89aF49cBBA73EC2cEDFaEe83E04fcd84CdD54bEaEd2DB5Dea004a4bD9b5f6D38", balance: _1e36Str }, + { privateKey: "0x97Bd585a8711Ff2b6dcefcF4DEa7a892dEbAd6cddB7A80E0FFbd77C735cf26Ed", balance: _1e36Str }, + { privateKey: "0xF3D378c1C1C16E4488DBA42CDC5EAEcCd6e91B527bDFFEe0cEce0C0731C1dCE8", balance: _1e36Str }, + { privateKey: "0xbDCfBc27af3dF84Ddb0C5c8C1eeA66EC4C4E71AbcEcF944488Aeb8ac0eBa6CFC", balance: _1e36Str }, + { privateKey: "0x8Ca7a2453F1228EE42A9bCfBe69D0ae77d160Ac6F3ccbedAE57bccD3697b5Ada", balance: _1e36Str }, + { privateKey: "0x2DDbc7BFb4CaF0eC15CA2CCEED167Ccf0871fDC0db7370840aBd731AaAEDc4b9", balance: _1e36Str }, + { privateKey: "0xFD74E4d721D5C19dFAbCFFC106EBeC0c68E07A0f96DaaCC25AD692Cfb49a5BE2", balance: _1e36Str }, + { privateKey: "0x2b60Af3b24957A2B647f862471F0f83C72b3DEba9487d55D3EAcEFd155b45F8f", balance: _1e36Str }, + { privateKey: "0x8F8b464533E34f5f682D8b5EdBb3da5D2dF0a00FeC80aFbFf6Dc96CFEae49bAA", balance: _1e36Str }, + { privateKey: "0x53faaD69Cd72AE36188fA114Ba0dBb5AeFca1bf433e6ACa7BD12adBC7C5F3d23", balance: _1e36Str }, + { privateKey: "0x154FB1bA5F534Afcad6c98dCCaF8E665cff789CEcC94b85eFb9BDA3AD0eF35F4", balance: _1e36Str }, + { privateKey: "0x3AAA215cC6E8feb99963Aad7afE59eb26deDfBF5f6B7daC368F6553Ff63Ad5a7", balance: _1e36Str }, + { privateKey: "0x32f2F965aDC3CA8e3aeC77A943bBAf7a4FbD2e6CAF263b0dec3522Eff5F82b81", balance: _1e36Str }, + { privateKey: "0x607964b9E9F2da42b9ef6f19Ab58916fbFad9f298f2C4dAa8D630AE0fEF49D57", balance: _1e36Str }, + { privateKey: "0xb1B538E586CEdDFe53Ba4E3BBb5c8c5Dfa2d6CFFe703363e3EA9AEB5b22A19bd", balance: _1e36Str }, + { privateKey: "0x1d541Bae5F4eaf7a8979dec6deb9e8d8B6A9ba83EeDa541dF4097BBdaDF029D3", balance: _1e36Str }, + { privateKey: "0xE9E1eFB646B66baA7EBa42C6BAe8C946f98c8a104d3Fc673Ae6Cb3Bf194bD65c", balance: _1e36Str }, + { privateKey: "0xcFFab4a6BC9d14b50dBFc07EcCD679751b796Cc49d68FBB94c97dEae4510d9E3", balance: _1e36Str }, + { privateKey: "0xE2d224d242CBa5b90F58086dda66FbE21F02Df0960aCDcbD4c06906dcddEC033", balance: _1e36Str }, + { privateKey: "0xF57D160bcDBcFAd1DC2c70Bdcd9cAAc45ef6f5161FAE09dCAA6e207421c1896C", balance: _1e36Str }, + { privateKey: "0xc3EED2E9f6F14f264ef4Ba78D50E672E99CDE6F8FA997FD7BdCFB413D5A67d66", balance: _1e36Str }, + { privateKey: "0x15Bf5A7aF7dAaa4505eC3DbBb28ec8F7E90023B2b5AC6f280efD3DE2dbAd473d", balance: _1e36Str }, + { privateKey: "0x042C399a9D186e615487Eb02D2fa362FD752Bb4dA5FDD9bbcBB45bD47C676b4C", balance: _1e36Str }, + { privateKey: "0xe8aDeCDaFDaefF5eEfAcDaA4Ed69fbfBd3eB9ca5ECAE7d0bB2d1ad8fE1595BD7", balance: _1e36Str }, + { privateKey: "0xBfa03fD857FbdE0EDAF4bFdbEcF24928A6F52B8233bCb8b2210fb1C7DC7Ee092", balance: _1e36Str }, + { privateKey: "0xbDd235E8e1F752804aCEBd95eF17beE4Ca6CA78cfFaE38df7fd4Ada7D258469c", balance: _1e36Str }, + { privateKey: "0x9Fe6D3ba6FF436Fe5b90aAaD9338aa3Ba10E0A1C8579b2dA4D7bF615ED61d3d2", balance: _1e36Str }, + { privateKey: "0xC58c288D955b6B5CDDb8f1D8a7c57AddB17CE9b44D0eBBa94De2EFe6DCF6e92e", balance: _1e36Str }, + { privateKey: "0x4aDedeecDc94fFaEA8BBe6Ce1f1DB97bACb54cbCa5dfCDcE7FFaaD940c603E93", balance: _1e36Str }, + { privateKey: "0x46c6dff2D4F9fBA00e995d0b1F3029a231ca9d2c6cfE2b92d085fF4deA627a88", balance: _1e36Str }, + { privateKey: "0x0AEF054C7FFB5b667BDf65F6a1C2d6FDFE4ee78Bc5B5Bbc0f290dCe5d70ccFa0", balance: _1e36Str }, + { privateKey: "0xF9B08fdeaF3E0FDae047009A4Ff8cfDecDdDCfc02aD9bdDf87DB1fd4CCf372Df", balance: _1e36Str }, + { privateKey: "0xC5cED5Aedbb1dfB3a0cA0e513c4Eeb2FaaFd69121eEFC98A975DeBbeb1fdd753", balance: _1e36Str }, + { privateKey: "0x9834b4e845Eae985b6A2c945F512bbBb0e5add70ecbd1cBBaFb5f0EEAEC1fef3", balance: _1e36Str }, + { privateKey: "0xA7dB2C1D8314eE670786aF1f9c7D95EfAB63a4cDFDa1CC24ad8f3F1E06D9bBaE", balance: _1e36Str }, + { privateKey: "0x2B57529bB2fC4bE6640bE2aFcAB9ED46A81DCfd37aFBaEAe38EbFccAfc4FC00b", balance: _1e36Str }, + { privateKey: "0xf5BE9e3EAeEcAD49Ffa90f9e14C9bfa03f1ac2D374E0fDe3F0EF02a6E889ACfE", balance: _1e36Str }, + { privateKey: "0xb6dFAEDFFB18bda3F3c9133ED658E857c5fdcD70241b5552cc3fb14DEC1c1D50", balance: _1e36Str }, + { privateKey: "0xeaa56dAf4Bb7d6cb1Ff91088C76bd1C0FCfDAD6cEd7A390E40aDfCe2dB4E0B4F", balance: _1e36Str }, + { privateKey: "0x9e3Ba740d7ca6dF7cfFDBd4ea1d5fe65a58789C40E4D55d1AB46628eEFad7c2B", balance: _1e36Str }, + { privateKey: "0xE650eC3FeAbf8ee1f33C7dfB0e76Fa5c4C9FE296B05A35dcbE37371EB475D5eD", balance: _1e36Str }, + { privateKey: "0xf011FAC998596eC1ae9BF4EcFdd9e978CdA2d5e0b8637a5cB45ba25FEe24cD38", balance: _1e36Str }, + { privateKey: "0xF02Ee58E87783b8c9BDa19cDB4faED322E207e3ca31C7ebC1Cc1eCeFed9c0Ea3", balance: _1e36Str }, + { privateKey: "0xE6366CfAa6adB597Cb5cA65d1aA4041Ae5683e699DDA5DB1277BecBc539e2A4e", balance: _1e36Str }, + { privateKey: "0xC5399FcEEDDDdd9BDf7D2e2cE9C155AC1FAB8edE90DfAE2D11b06c64508F6241", balance: _1e36Str }, + { privateKey: "0xDc3dc38fEaCe74b32AFb310C06B2FF8A41A05BCa0D6B9B6c26Ad08CAf2aD4F66", balance: _1e36Str }, + { privateKey: "0x81F59946bBa20D99baCbefA3FcBBEcEB72FF9d6D0d8EbDE58b4E07eB1BFcCeBA", balance: _1e36Str }, + { privateKey: "0xf10Ac9eeCdD02FF9A4E7fAC5Ecf7B3a22ca1DB38aca5d314CaeFe9ebFCedfd0e", balance: _1e36Str }, + { privateKey: "0xd5aA7D3CA7eB6Aa0eC9E1FeE8F1Fa199c1729fF6fcdAb28e0aC75fdb9eaBEBdb", balance: _1e36Str }, + { privateKey: "0x5c96f974E30FC75E6A75AbEAF46494cbad5B44Fc0A5E44EAcB72C8CeC8646220", balance: _1e36Str }, + { privateKey: "0x1B1f0a704d4aB06B759E5a3C62bA5afdfda53f83B3d01b03a73Ee8A24d4A71d7", balance: _1e36Str }, + { privateKey: "0xCbBDdc04bF5fFBF96a4e51a63076da86aDAB9BecCdd76ddF6085D38d8bE86eef", balance: _1e36Str }, + { privateKey: "0xfEd3CB1fdf95D164beFc0FeEe50346f58FC699A8Ef8527b37AdBCbd31f647ebB", balance: _1e36Str }, + { privateKey: "0xFDEbd46f370c9055Ebc7eee50d5B84b6CDb95C77A41fbDEbbEfdEdac2f981571", balance: _1e36Str }, + { privateKey: "0x6cf1ADcd3726ADC3cFD7C84cD5aAc5FAc82D646729C98aC6cfBf1Ae177F7695F", balance: _1e36Str }, + { privateKey: "0x4315bbD51b16006aBc5bB567fF405Fb12B61E88F5a726B2910E9ec4F7B150bbf", balance: _1e36Str }, + { privateKey: "0x24EECada5b7dEA79DcfAbDD3ACE64c3B87D501c3efD729A2CE8D2B5dFf749eb0", balance: _1e36Str }, + { privateKey: "0xfb8b4A9Ba3bBea70eaBe4BB1e2eF68F84E52Ad43C6A32eF6E2f4eaF5EAdaB4cB", balance: _1e36Str }, + { privateKey: "0x9d46Ab1aaDF99733F9BEDDbc5cdcBb7dfC2b7CA5dB44938a62853A550Ef2bFb6", balance: _1e36Str }, + { privateKey: "0xb671b3405c1b26f7dd8F4B6C1Ec89c53f2b738D3ADa063Ca47ABd58D874af384", balance: _1e36Str }, + { privateKey: "0xF281B870aF0b3db2AAA0BD6AcBd4Fb9EDb7c0B2B85dCe6fB06793e77fa061FA7", balance: _1e36Str }, + { privateKey: "0xEac5f06bf2e5A2Cab9122C0EcdEbDaBc37baB98b16dC5911953EB7F1e33CF2BE", balance: _1e36Str }, + { privateKey: "0xd5FBF5c421D0B6DFa2AcD0B4c9e5a6ed112Ae1F7d5AcfD93dd5D7c76C7eef59d", balance: _1e36Str }, + { privateKey: "0xC4935995C1Ba68ADAa646895fC4E1d94DcC4Cd7C1E54EBBE8606cC97e13b78Ef", balance: _1e36Str }, + { privateKey: "0x1acfd63F11ebAb6Ac1E55affF882c6C3B1ac2afc8BaAFdEDbF4768BAfeB714a4", balance: _1e36Str }, + { privateKey: "0xA5CD11077d5e2D16FC87D5eB8008BE72B9BDe45Cd22cc01eB45E216370F2bCff", balance: _1e36Str }, + { privateKey: "0x0AA0eD007652ee415413BaF5AddfE683EF6D0F4E7f24647FEBfA12D81EE2F4Fd", balance: _1e36Str }, + { privateKey: "0x8d245bDEE5919436aeE1426B8FDacED23dDe01bC5C06F6edC67bF4FcfF7E96Cf", balance: _1e36Str }, + { privateKey: "0x7cB44D888Db151dD249527b2ffCE0cF3d48B32157b2aa397f1d9D15E957F67A4", balance: _1e36Str }, + { privateKey: "0x286Ec624EDB1e0FAec5eE1dACbfdb44eEdEa4cEDFeED4DFF7a890329aac4A369", balance: _1e36Str }, + { privateKey: "0xcb62C6E9ada245c7866Fb1E6fA75Fb814111aaE0f9EB26a15ea63edD9fCFb385", balance: _1e36Str }, + { privateKey: "0xF41fEE133d02A47984F21Ee3857CA1bAc88EC18c17F9E3Bec43A68bbbAFffa8B", balance: _1e36Str }, + { privateKey: "0x8dA1FEBC1CbDBeE1CB2aca7A7D5c9DE8CFf087ca46577Db7DAaBf1bdfCEcbbED", balance: _1e36Str }, + { privateKey: "0x5d3e68BebDD3FC0bbf7eE339BeDA961Eae0b3D8944FA1bFF3081adA3Ab45E479", balance: _1e36Str }, + { privateKey: "0x4A63bC6b7DC1Ecb7262A599Bb76668ACd750600BdF37dcBB62f7D9aFA019B2B5", balance: _1e36Str }, + { privateKey: "0xB7B760c019AeB02c471DbcC21Eb3CeFdF251c9A47Cda9bdD1Ecd0Fd97ec9FD2c", balance: _1e36Str }, + { privateKey: "0xd3553a2Dd2Aae2248c7DB7CF1E4eEAE5dC6DE4164F4f62c336e88D0c487bF37b", balance: _1e36Str }, + { privateKey: "0xd1BcCBdD5444CF31BEBB6DaFAbfE281D8e221Ad6B7a1FCEa67e7E0125EfC8BFB", balance: _1e36Str }, + { privateKey: "0x2d78f860c5D1bE4544fCa5F1401bEcc39D37B7B5bBB6412Bc31dFe35DA5bC0BD", balance: _1e36Str }, + { privateKey: "0xD01A7Af0aa54C3d7c708C4Cc5caC7a24d1dbbfd7f689d596BD5DEFc4b76bcefB", balance: _1e36Str }, + { privateKey: "0xf72Cd9A5a7ede7db40bcaAB979c714BCBf86C654608AdD356b5035Ff2a2a05Fd", balance: _1e36Str }, + { privateKey: "0x6abB81eb8241547E49beEDcF16D24Ca9a6Ee7FaBcE460d1d12bfdAEc42a2F090", balance: _1e36Str }, + { privateKey: "0xa4bebf7AbFcBfa35922F5F9eb68554Ace294CeaB496072A0C885Bb40E3CB40A9", balance: _1e36Str }, + { privateKey: "0xdc2bCCAccF024fEEfB97CEf1aF59CFF4B5FDa68bA7BFCB588dC7d231F2797cb1", balance: _1e36Str }, + { privateKey: "0xDDd7fE15d1BeCfc036a9Cde7A8d6DC40fA5cb4766c9cFDbCAc2bfA49fFc448e5", balance: _1e36Str }, + { privateKey: "0xBFFb0fdb4a591bEDc109fbaaD48ca1F5cd2bcA945c4E8C3b9a9C1CAf3e9c518d", balance: _1e36Str }, + { privateKey: "0x70AeB6acdbcEE9bDfdaFadf43ebF1f45ED33bB8Ea746fA51bDFEaC1ac5ba991D", balance: _1e36Str }, + { privateKey: "0x9B6f2A0De81Ba07feFEeDBE7FF90Ff0f5Bb20CfbE3Df2edCBbfFc80CD1a528D2", balance: _1e36Str }, + { privateKey: "0xCdF04AF2814b4783ccE14FDbDe5e34E21DE511D3d3be9cAABcB3eCC1C612b2BA", balance: _1e36Str }, + { privateKey: "0xDe678D190EE8Da91eaDcfF72bF39f59bd6ecCBe2De5A06D706B1eFFC0F81faED", balance: _1e36Str }, + { privateKey: "0xeEf4E3efa4f8fE1F7B5811450Bab3dBA5CbEC3e853a9266f3D5f33799bA57f58", balance: _1e36Str }, + { privateKey: "0xE12FB1593a7C3DF3d2d1ee01a594b304bD4bB28Cbf0C224Dd024EfAF2ADc7BDD", balance: _1e36Str }, + { privateKey: "0x9ad0cfcc52f929cEC96faf1FfE16dBc3a0aA24c6C95Ec3cca3De26b0E012Df2B", balance: _1e36Str }, + { privateKey: "0x3bFdcCE82594eDf13A0D2B8dd8EA8A52e85bCc37c1A4cD80e604F6B566F78F9a", balance: _1e36Str }, + { privateKey: "0xBAebFbb2cc3Bb7b9aBCe0b03Ec6cCC0b011eD65FdEfac20dD39EDDF5f3C28Ebc", balance: _1e36Str }, + { privateKey: "0x84EBBF0D9d0159c6cE3F849da318b9a5e6A24553A8DC74b4fccC6AfcBFCad1be", balance: _1e36Str }, + { privateKey: "0x8b4cDFc2F87aEFea2d4aAb4eDdB575b30b73f2ccb06ECD7dCfe9C717C946fAFc", balance: _1e36Str }, + { privateKey: "0x4212FeaA6fE853aa6B51F464FC5b221dC9f658B2DfBABDE3CF8a5dFEB4c0615c", balance: _1e36Str }, + { privateKey: "0x8e08f6C0cEe2Db254bdA1e0DABF0a2f50A1575b6dfaB59253ACb49E5B2EC80d6", balance: _1e36Str }, + { privateKey: "0x4b95243CE2a7E8DE3dC70B34FD53F11BA6Fc9c08d0eCE1485af21011BC285df4", balance: _1e36Str }, + { privateKey: "0xc62Eb165FA73A038DA5BBaEFcE0dB83AFe4155248D23bAf9dad554ebF9E31Cd4", balance: _1e36Str }, + { privateKey: "0xe2c65919faBf8C3FEEdb632A706d4EEbEaAF4bFBf20caf6Af8AE7D1E8ED5e443", balance: _1e36Str }, + { privateKey: "0xB54AAA7c2C3DCFB665C8dfb2cBd5c5dc3c767ffbb1F1ccCb05b6D3C8ECe874f0", balance: _1e36Str }, + { privateKey: "0x93CBDaEC0A18E9e0B246D5A8D6bB0Ceb48FEf3fd76e5AeF80CF26B8E05b1989c", balance: _1e36Str }, + { privateKey: "0x08C0ACEdFCe20fFCae0Be436BFC3B5FcBcAedb921179BfeB8466A92BfF25f709", balance: _1e36Str }, + { privateKey: "0x799bbF4AD3fa5f733D7dcffaD1c4Ac1398E0C4BfA2a5Fe8bDc3c0F1cEFFB646B", balance: _1e36Str }, + { privateKey: "0xaF337ACffcD35BC135c0912aCAC2C3cdD7bda8D21BADCD90b0Da0d4d1610a625", balance: _1e36Str }, + { privateKey: "0x8bC8CE78c3AaEef8aFAAa0b5CAAaDd0c8Fc5fb9960be5FA720cBe70eBFa92FEe", balance: _1e36Str }, + { privateKey: "0x19348a82efC7ab72EF69AE65bb2f479762c73FBbed301dEd8976bD14AcdE0811", balance: _1e36Str }, + { privateKey: "0x9ACD0D449c9b9cb84c10dEa2bEeCEA0BcCD789CEeB6DbF60D22a064499b93d9d", balance: _1e36Str }, + { privateKey: "0xdf7C9F563eedceFf3Ebb447f01f5FdfCCe7bE2c32BBd481b75AFA9980EcAbE31", balance: _1e36Str }, + { privateKey: "0x7Bcd6Db2Df3d9ccFD8AC44ED594C0d756E96B6df4ec3F5Ba76d8B7a4b9aEAAfE", balance: _1e36Str }, + { privateKey: "0x7052Bb6CfC1bec1DD5aCC9adFb242F1AecD931CfE2f76E763e7938eb2508CFe5", balance: _1e36Str }, + { privateKey: "0xD6DBd46424AbabbBeE228ae2BA1ec46BdA7aDD5fB05ed1Db79228966Df8A2417", balance: _1e36Str }, + { privateKey: "0xeF220f3F165EeAA5eFAd93C7b06fc11ddE9efa7b17CEaabc3DFc21F3b89bdCBE", balance: _1e36Str }, + { privateKey: "0x48Ad0CBfe4B93ffd80c608B7ffb67C340a623158179b5F25882a969A5Bfe3eC6", balance: _1e36Str }, + { privateKey: "0xEADf05147fAB6EdADDCf57b347eA424cc6F05daE048Ddf8BCfd7B5DD8Fa33d69", balance: _1e36Str }, + { privateKey: "0x8429CeBE1DaF6fdb3f1cCf415f7Fbf86eDF4F81fCfAE8F4650BAc2CE6Ac4bcEB", balance: _1e36Str }, + { privateKey: "0xcBd6AfA18dBF4a4Fab4035Ea7acd94B0E157daEbdF6108bCe6afCC23ddD05EAD", balance: _1e36Str }, + { privateKey: "0x27cEBFf3ab89E5EfBe3Be377EdaCBA61D91d3E3A6a55aBDdAeABdE8155c1F3DC", balance: _1e36Str }, + { privateKey: "0x32bA9c7fFf4CBAD1BE29C18a6A4cc61EF9C58f253cf38cEf689F99AE73490D6a", balance: _1e36Str }, + { privateKey: "0x7BeD2ceC78a5f6Bdb3Cb3Da1CA564d8ccFD0E5915A8ea88a09AEAa38f7dcEfEA", balance: _1e36Str }, + { privateKey: "0x4cA474E60B6e76f2BA0C99eaBcFb2d8B3F51BCd1AAE7BbF723cff06dCCAbABfA", balance: _1e36Str }, + { privateKey: "0xA39A8Def4CEdCdb3d4064Cae8CeAb70dB1A80ccffE4909F77A8Eabe7A0B8Fd77", balance: _1e36Str }, + { privateKey: "0xDaFe6a2bDd8Eb330114EaCbFdEb7f5dA0dAF418d7c54919EedaacddECedcD9BE", balance: _1e36Str }, + { privateKey: "0x4D63df85AcC8Cceb275eC4DA2adBeE7d4eD211B4F77BfcedD4deCA1B7cea3cD4", balance: _1e36Str }, + { privateKey: "0xE3CCceaA12aA8cE6Ca83f6ce7dCEB81d7BF5e856458Febdcdfc203A50EA301aB", balance: _1e36Str }, + { privateKey: "0x3f71ACa0e91fe0acbfAad66d64AfeD2925C7eF69dc649f4da85AD99bbf93aDBE", balance: _1e36Str }, + { privateKey: "0x0fBfe96f189b3b6Efa9fd66aa5F93C6d3020D3C9d1fe28a2F74E13db1cBc7C5E", balance: _1e36Str }, + { privateKey: "0xFc0cA27f2F1Cc29C937ff4Fb175e34b496AC01728fDAcB28C94fED5C05BAb0e4", balance: _1e36Str }, + { privateKey: "0x0Db84beEa5bAb0DfafF155bDd0B1B00eCbdD3DC06fBA0dC84C51c0D3acCcB5d9", balance: _1e36Str }, + { privateKey: "0x4FFFEa9eC2D9CC1279fecFa2b85e32dA2CC9bCc3f9ae9Ec2dF8Bcd3Cb5CF3DEF", balance: _1e36Str }, + { privateKey: "0xCF45aD24Bc60833EfC83CEa0c2fB3EceaFfF364EDbcfc5Ed54fe1b27FC9Eb2dd", balance: _1e36Str }, + { privateKey: "0x341C87dfe6c55eDA97c089cCefFe25BaBf879DD979BD86D60BeFE0EE2cce7A2B", balance: _1e36Str }, + { privateKey: "0x72A3CB97891Cd21ecBfE493103E2ef3F553E7Bea45BDc8F8C69DF40d86B9c95b", balance: _1e36Str }, + { privateKey: "0x0BC05a1dB9730AaAABD63C83aae8c7ad7BD6caafAF5b1bDD7Cf2BDAE2AcE5B0d", balance: _1e36Str }, + { privateKey: "0xB1E43dc2fC4be2196Fbc2D1f598d8f8B3D48b0f4802d6a5752E8966F9E499baf", balance: _1e36Str }, + { privateKey: "0x6DfFAebEb0c92A74F180F03BDef5a58ceFee8C6C13df3F935BaE0942D84c91BE", balance: _1e36Str }, + { privateKey: "0x74D3eDdeFB3adAb9D80CD50FdBF96952bB9aBfD54C0B23aEbaCBdbB0aAa3222d", balance: _1e36Str }, + { privateKey: "0xABdc4CAb1dCA5B1F8dafab4EDDc8CA68A6Ccddc1Af3Ae81F7B877c4CeE1e2105", balance: _1e36Str }, + { privateKey: "0xAEE19407edbA64FCfaaCC787fe3BcDAf32c8d9FC26f818FeD4b134bCc769C798", balance: _1e36Str }, + { privateKey: "0xB1B36EbDec7bF057AA4EACf8f0fcA86Dea50dfCac52d000cD14504A7D7e5E6Dd", balance: _1e36Str }, + { privateKey: "0x073B112784Af33eB0c7CAbEbdE699EFcdcc88D0cCBCEa8Bad5f2060a1dCc9Efc", balance: _1e36Str }, + { privateKey: "0x4a9ef46CF1A4c1B0DCF590091EE4eeECF90365EBEf1BBd46CCf9bAE99802A72a", balance: _1e36Str }, + { privateKey: "0x31EeC3C6f0a09fb3c1cBdb97bee421b93af62505973eDC73B45efFDF2f5C1bfe", balance: _1e36Str }, + { privateKey: "0xCc85cbe0Dd6E20ef4b8EEBd1c5cBE1656A438ee0f95B0a92dA6BD4aCEA68633D", balance: _1e36Str }, + { privateKey: "0xbbfA2A317F66c5Ae8a1F4c3cd1df826aF868E6706CbFc53E8FFe186084d9BEd5", balance: _1e36Str }, + { privateKey: "0x5937F3Eb612DAF87D58b0dBBeAAfeaA0Bc3FeCdeD4D793EcaF64EaF0bEe662b7", balance: _1e36Str }, + { privateKey: "0xf5eb6EA30B43FC1ea1a1FfaC7b3Dc092cbDcb20ffC2ff7CAF7E9E136C0F9f8c4", balance: _1e36Str }, + { privateKey: "0x83f11ea15ADbE304d7b5acBbdAF56f65499b9ed2Eeaf705661FEAFC86EB79E4c", balance: _1e36Str }, + { privateKey: "0x5c0dD1bedA721b6f83EDcBb8bC977FbbeAa8affFFBbbBefdcE9dDbDddbc880fd", balance: _1e36Str }, + { privateKey: "0xF48B48F531C3c4F7C6Acbc0e8438862e48ABf954a6Dc38d1864aDeaCEfd546B6", balance: _1e36Str }, + { privateKey: "0x64EF5b40582DC0Ab3a088D26fECcF01EB72aD21facE5C59cDdD6E2ceF6AC4fdC", balance: _1e36Str }, + { privateKey: "0x47c8b737FDb3C90C3AAbb3aD14DDf4CFff8b5B493fABABA8af19e1F6e2d53883", balance: _1e36Str }, + { privateKey: "0x8e8A1eC2Fa5eFD739d97660FCA4d038fBde1bCFf7dbBef10b4cc66F84A25C1Ac", balance: _1e36Str }, + { privateKey: "0x984214f0F5834c25FDAd611fB217a14dD3f447A38dbBd1d6CfcC85A2ec01f73E", balance: _1e36Str }, + { privateKey: "0x58286d4C7aBfDAfba1Dea11EdcEC8B9b5d7D620F6AE7B6faDaA807F680D0b8c2", balance: _1e36Str }, + { privateKey: "0xD2dfdC0Aeb7aEE84AFcf8bAaA0ADfBBBf78A7cf2CfaC5AE91Fa3901D1eD4Db5C", balance: _1e36Str }, + { privateKey: "0xA4dDFc64d5Db52C59A3AAf1fF3Fdde718C84727344f73d17758845e3e28e3DDD", balance: _1e36Str }, + { privateKey: "0xdF252058bC5C6B869E870fE0b5eADEB3DfaA87ceb05C858001dab6BbFccCbF2E", balance: _1e36Str }, + { privateKey: "0x06E174ccBdc12cA9a178Bb77629c904cEFB648ceF6a7ADDDEFAc8C9C2bbEB8B7", balance: _1e36Str }, + { privateKey: "0x40F8Bede980cFCAFfAD95bbabBD07057ae3cd64B13a6F8B74BBFad7e225766E7", balance: _1e36Str }, + { privateKey: "0x4De250f8fc0edb17Bf9EF7acfd32ec4474a5Ac2E650C1FAbd0B2FE762e5D7da4", balance: _1e36Str }, + { privateKey: "0x8F5Df54A8Ceb0bCED8e1Ffd4dc7AdeAF278ddB9037bf9D757d4E4DaAe47f279d", balance: _1e36Str }, + { privateKey: "0xFaD0345fd1DE72bF3EC5aa6C54Af3E5Da3f92bffbAd8C4da57aaeCB41F2b1ACB", balance: _1e36Str }, + { privateKey: "0xcB7261aE8B8ACbc54c0a0be47fDd8Ff06f39eAE5F4B08eeeE0FbABFd624CD7cB", balance: _1e36Str }, + { privateKey: "0xe7d6E0f805a62De4eFEEc80Edacfb11dadFffB44Db5dfdcd1AbC13012d3cbaa7", balance: _1e36Str }, + { privateKey: "0x7ACcB0561bdae4305de1168C5a49bDACC5Ac546553c9b08CDCD4baedEABA7929", balance: _1e36Str }, + { privateKey: "0x8fA25cfCE5CeAeC559DC1a58D3d09C2Fe7E75B7146c0B67e9B21Fc8a5F844Dcd", balance: _1e36Str }, + { privateKey: "0xfD532Acd7c73d011F7bFe7aBF5c162159273eAEd1F5216eAAFfd142644C3DfcD", balance: _1e36Str }, + { privateKey: "0xbf8A88eCC0787db3e3424029CD9dCee3Db463Cdc09d1fB5546bc288DB2314AeF", balance: _1e36Str }, + { privateKey: "0x1A51dEBb170bc0C97CcdE4275DcC28DD5dc644Dcbe53F9Af3af802B260bcA51c", balance: _1e36Str }, + { privateKey: "0xAd4fe5Eda497ca6baAdE514cFD99E326A2a93A05CcbACB0f93CBbdf49efFceA1", balance: _1e36Str }, + { privateKey: "0x4b1BfCddBCaA2fbE0176aF72f6F124EBAc2dD4DF8c84796a0e482af9eBc1CAf0", balance: _1e36Str }, + { privateKey: "0xCDE5452CEE8AfBD44cb6EC160F751D8fBBf205Bc46dF6f22AaB47E4E60C7B8c1", balance: _1e36Str }, + { privateKey: "0xfB367Ae6DD221ce254dBABc4bEdff5F68253A8Bc0f9a92F738a1aAEfb0bB94dc", balance: _1e36Str }, + { privateKey: "0x2EDE8C08069aD642dE00Df66FC1c2Ac0A07Cdc277B2CF87A14e71E1b8f888D7A", balance: _1e36Str }, + { privateKey: "0xaF6Cea2f6faef4d5a143A7A55CdC6fF1384eE06b00a102c3BD3BedeAdeEA464C", balance: _1e36Str }, + { privateKey: "0xb14ed71bFc20EF511ef2f36739c57dae6AacB390FBafbDEdE8BC4930faF679c9", balance: _1e36Str }, + { privateKey: "0x41bDd2CafDeB7fF8b4a4A4D9BbeF75292E8860EAA2a814B0c67FaAa8a19935e1", balance: _1e36Str }, + { privateKey: "0xd0D8Ee7BD9C8982a6fA481Bee0faadEBcB8F01A373c6fbbb4eB0Eb9c9ADcc81C", balance: _1e36Str }, + { privateKey: "0xe9A8A904bE19e2dbf3707727Bba835BF553AaC2f873Ac0ab5d0fFFBc228e142D", balance: _1e36Str }, + { privateKey: "0x7D52E80b40Fd2f3AC874C734eb5b139aaeb66e7dE3F24dBC1Ff29Cec183E51a8", balance: _1e36Str }, + { privateKey: "0x19a4fFEac8cAEbb1eE1Af9C1DaEee2055efBC770B0a59cFc5cDdCAAEcbb4cDE6", balance: _1e36Str }, + { privateKey: "0xCA230f50B3abdaCae9E3fafcdE9d64abDF4e2DD4c7fed6CCEfB4e67d7eDE3B09", balance: _1e36Str }, + { privateKey: "0x3EdC018E9F11fEddECE9FBb6Aac9D5DDc1FCA0B3FA5717130f6CE91ce1eFd1E3", balance: _1e36Str }, + { privateKey: "0x9Ff6194cF7FAf32C3c1fCd9BCe54FE38388472C1E9bEc2c69B77169cd2A9A5E6", balance: _1e36Str }, + { privateKey: "0x4E827C860CC5Dea9b1fe0eaCaCB2c3B3ccB578bd3bb0531E9ebBA02517f6aAcA", balance: _1e36Str }, + { privateKey: "0xfDDDAeAfDEC458a2bA2787AceAAe4C7EbfdA08cc92Bd139F06e4Edbb650F73eF", balance: _1e36Str }, + { privateKey: "0xeBb1c685530027dEb3BcfF85EBc23fCffb07DF6dBc68136bc72C9fC42e7A76f3", balance: _1e36Str }, + { privateKey: "0x2Bd5dAC44b3ffD2Fa672feb9A766E0F82cDBdeFDce08dE6e254CAB19eED77F73", balance: _1e36Str }, + { privateKey: "0xaBF3eFEE7072A2EfC7b9ded386aBADB55bad5e08423fD1e8AAEF7DcEF1DBcFAE", balance: _1e36Str }, + { privateKey: "0x7D885F65ec6CBFcA7AcF4F5E88dc2e3ECcE6F075eBECCe37A7EDE1Cd40bC48EE", balance: _1e36Str }, + { privateKey: "0xd05Af8bcdcCf3baafD4B52880f5F91CcCA8F90DEA31a666EeDD87D2ED8ac92f5", balance: _1e36Str }, + { privateKey: "0xcDC74ee4A0d1b5f15bFC0cA41Acfa1E0833B3B3F0ddEb57bc40EadF8fA8384D6", balance: _1e36Str }, + { privateKey: "0x32A0EAEF8daf92eC02F8F4242Bb3cCbcca8bbC6dc7F2ae1D3bc4B9f06cAc6b03", balance: _1e36Str }, + { privateKey: "0x62983d7CC2f90eA7CBAaaADEB8d617FdE0f4E7DcEc738F1aC8F5c1261BF0abdD", balance: _1e36Str }, + { privateKey: "0xb20BD7d5594e824F0ab4Ec5A7FB9ab72DF6Fe52A4a4fb2d98cedD1bA5Ea125b9", balance: _1e36Str }, + { privateKey: "0xCb456dC2af0cb566Db66C6bceeF0E0eBd61deE09A4ED5dFD776aae97292DE4B4", balance: _1e36Str }, + { privateKey: "0xe7665B3bFB7E1a2cf34edFBfa0ebA7b30cf3AFBEFdCba19A955AB49e7C9ffbAF", balance: _1e36Str }, + { privateKey: "0x7d1cF82F776cA3cAFca53dC2AAA02f9bF0cf08c8b6E9DcaADa5325dE72d6fFBf", balance: _1e36Str }, + { privateKey: "0x21EBCbb4e0B2181aC733ACbc45fFAfE4DFEb8CfcAe7fC8Dd221F3aF3eBe2289d", balance: _1e36Str }, + { privateKey: "0x77fFDeAaf3FD0b3BaE033386b03279Cdf3Ef689Ce5C311fCFDbeBfDC4c1E49F8", balance: _1e36Str }, + { privateKey: "0xcfAb3C6Ed94e4E14FD27B8B9aCd864F75Fa49Eb9d38137e2DFACdcF389Fd96FE", balance: _1e36Str }, + { privateKey: "0xaeEd9f852DDd737A30DeABe895b2cc1f8aAb6dcEb30B95CC6bDCa26DFbB0dddF", balance: _1e36Str }, + { privateKey: "0x8E2dcD9ef26032bcaCCEd3b54eea37cB525B92Ac6dD6120bDFae15DBDA2Fa9dC", balance: _1e36Str }, + { privateKey: "0x1C2a5ad3861774EECCec2ea51D7C2EFd8add35E3dEDeb3edfAaE7068d17D8DAC", balance: _1e36Str }, + { privateKey: "0x151E3509bFFCB372A3CEA9cFC49a46ffEE7e0842c2Cf221cB7396De0E9aCefC7", balance: _1e36Str }, + { privateKey: "0xf5F129CbbD0B15FEbf5Dbe1e3eF1acB9E79d9fddA21c18E35fd3a3FBce4c631F", balance: _1e36Str }, + { privateKey: "0x1CC7AEe00DFf2548409dCe970DCA0BF4904F146e6A9C4daCd83edABadd18CA49", balance: _1e36Str }, + { privateKey: "0xeea28AdE7d17EA1DBc8f44d1D9BDFD1aEFeb8Ab8f14Ef89FaabD4667e6A7E8E6", balance: _1e36Str }, + { privateKey: "0xDaAa027C1D4dFD2AdDB697AcBF9456fCfFe7db1BbC442a86fa53F8DA6f686eC7", balance: _1e36Str }, + { privateKey: "0xf6fDFeE30bBFEFCBA8C2E88cC95CEC4BED0609A99BF54452dB5ce85d0cF40ea6", balance: _1e36Str }, + { privateKey: "0x6cafECCAB9399d4B9e14Bcb6Ceb28541a9D8eBBF9b4e50CFed8eaA64faB9BADb", balance: _1e36Str }, + { privateKey: "0x3f76dddEBCd9Db466DE7BEeC9ABAB7cFE45691bd8a2F0971D0A3eBD25C761A4e", balance: _1e36Str }, + { privateKey: "0x8FAFf3832Ea4e633ae1A41400ad93f90036eb562aF519dc3ECaFcb168e2DE09F", balance: _1e36Str }, + { privateKey: "0x8b6bDF8be23aedAAE1b3a16367C21713e781fEE4F4240F4effb3114b91AB1805", balance: _1e36Str }, + { privateKey: "0x84AC0F4d7eb6bBE867fF1B3CdE0feD6e9bc00Bb92DFA1c08f78E7BD25a389AE6", balance: _1e36Str }, + { privateKey: "0x9BCD0d5509E3A2e2E2dba094AC8eA3cD5cad438cAdDc8c3bFc6CD4bfaB252EAD", balance: _1e36Str }, + { privateKey: "0xB9eC9F24b8B3A51E8D7A2560678c59befE1beaD7d647aA46452c4Bc6c3cBC2FF", balance: _1e36Str }, + { privateKey: "0xFf3DbF3Eed63C32C59a2Cfd1bBDaDCAF3B444B396a5Be2CEF4efA65735eC53Cb", balance: _1e36Str }, + { privateKey: "0xb10252A7E9ca5cd1E9BCaA2233AC6Ff71fE09Fc7e4ACcDE5278Ed439d14F53cd", balance: _1e36Str }, + { privateKey: "0xaaFeFccE64d0ef75173b7fcb53DB34E7B4acfF6016b0D30BB605Ab751b4CfC78", balance: _1e36Str }, + { privateKey: "0x6C4f69B90c6fCEEebaE5BAe68DfD1535CD390acd9e02D4cB96d2F8af37032FbC", balance: _1e36Str }, + { privateKey: "0x81Ba7d23f7B4d1Ad3f645f31eb5abABAcA7AB54e1eAdCE67239FB32a10b2De3d", balance: _1e36Str }, + { privateKey: "0xe461ACB3c7CEd3aFF34d8b6fADED5cA6ce8361A8D73db9FcE4e4F03A03b8Be87", balance: _1e36Str }, + { privateKey: "0xB6DCb0f5Ce7a2dbA36E2eb924423Fb51D19D5c8e5CAaB35F42eCc770226bC27f", balance: _1e36Str }, + { privateKey: "0xDAa645f35c12feca2C7De49e40c8BeD2c201da5Dc9B9d95440A84502dc4eDea3", balance: _1e36Str }, + { privateKey: "0xfB2ACCFB24e50E39722dD32fAbb4d52AadA0a3BdE1B4D9dfD6bd034801D262ed", balance: _1e36Str }, + { privateKey: "0xEeEAe6bA3AD49D0a5EfaE4EC1ebDa40ec2B02ad344eF02D9aa3Dcc8B50AaCe5f", balance: _1e36Str }, + { privateKey: "0x4fDd5b085cC62175aAF5eDdCAEaa8B8e19e4d8FfAacA247B8Cf8BbCdB61f5d8E", balance: _1e36Str }, + { privateKey: "0xd69667eC0AeA62AD07BF92aA79DfaFC4D3B92EC7e96BEE2ab79c2eCAADdc87f6", balance: _1e36Str }, + { privateKey: "0x5AecD5c739D1Bf1d7bbf0d7baDcEdDcbCf254054a1fbc5f8628AD73fA85c9135", balance: _1e36Str }, + { privateKey: "0xDAAD7760d4CB227Ce91b29e507a6F19fFee1fEE531A6c01cE52Bd167DcAbE89c", balance: _1e36Str }, + { privateKey: "0x5DdCb703BeFd9EFeA7204dC3fd88262a0Eaed6bed541E32fcF9Ea88Eb433aFd2", balance: _1e36Str }, + { privateKey: "0x81438eFF3BFaBacE3aceCd8dECbF32FD8937f5DbeC8741F34e2AbCF9E4E32CE4", balance: _1e36Str }, + { privateKey: "0xaCA76E77F44f52e7ceC896c76cdaf9FB4490253F04f30d3E7EE4B1e48Ef56Dab", balance: _1e36Str }, + { privateKey: "0xCE0e5aA349CeF541b5BB0eD3AA04a1d5C9c2F299cc9E63fB9DdB9f1AcC5fe59A", balance: _1e36Str }, + { privateKey: "0x31ca9C9ED9eabFCAce8e6aBe34B1277Ccb9d743f1cbfeEeFa82E3FA07Bc8bfad", balance: _1e36Str }, + { privateKey: "0xBC75FbE1ea28eB4827e9b9baf9DCadB1381AadBF4a55E3ACA4180bBE7DDbddEF", balance: _1e36Str }, + { privateKey: "0x47Aedf783aD9f86ed2c7E2783caCACB3CF1f5c9baDBbdE43B8Dee9d81bE86A6b", balance: _1e36Str }, + { privateKey: "0xC93de2aE78fAfAc941a64602b7B256D2Ec01d9f8f9Bf0b83b861b5C0a7A731dd", balance: _1e36Str }, + { privateKey: "0xDeeF4C0cdDF5aEc8E78212bF0B3b8aAfa5cF4c97BF67f8A6D4cF37A88AF7Fa46", balance: _1e36Str }, + { privateKey: "0xc9D0A1272adBB544596D5FAaeFBb4816AF41F822b7C76fEf9AD7B6cBD0CF9B1B", balance: _1e36Str }, + { privateKey: "0xffEefbcb49b3B6177C6bF9e003322e6Bc20C363CF3E0DAF72137d35168f3501C", balance: _1e36Str }, + { privateKey: "0x82F54Ce8a7Fad3552fd33bA3fCe2add9aFb0B794BC65dFb7bE13372c57d93CeA", balance: _1e36Str }, + { privateKey: "0x98acfE2afc89b27f9c1B1Ff5a869B19F1fc21fEeFcddC7f3bCD938D16Cd2e95b", balance: _1e36Str }, + { privateKey: "0xBe06dcf785b0BA41eed9DE71AecB86927d9C236A71fC18fA2bCfc7121C3f3D77", balance: _1e36Str }, + { privateKey: "0x2eCfecffb9FbD34f54f1f20A1678cDaC2A2DFB598a8dfF0C96A9b4bf2f9c6cB6", balance: _1e36Str }, + { privateKey: "0x5ACdA4A2a8Ab9Ecb0AcBECcD57DCF2FbD54795F5bcffB8E461f52cdC7A1dA155", balance: _1e36Str }, + { privateKey: "0x64B70A2112F282d02CE53DC3DEEe2A5cA69F047bdDBF1Cb2bbfCbcE12efaCCbd", balance: _1e36Str }, + { privateKey: "0x1fECAEb9fFc0270eDdD2612aC6e2F540FE0C0eD07f62DDF5DF86Bc048Cce80dc", balance: _1e36Str }, + { privateKey: "0x69D5a3d4fFBFb6BdeCc9bDFFDCad6e8F8Db59092ddf4bfEcCbFa4E4Da1CdceC0", balance: _1e36Str }, + { privateKey: "0xDcD57d1DbdD088e9Ef87C8A21aD77331F6aCb50bBBCcb3cdeaeCBEEd581B8A8f", balance: _1e36Str }, + { privateKey: "0xeD844ab3E156fd4e8658723766EBdBa7C97bB6E8Da658Bc5EfCa1bbebF833d4d", balance: _1e36Str }, + { privateKey: "0x8f6CFEEd8d635faf9f0c13Bcf1EE6fE8fa2D71EE23d9Ce16b122b5BCA88Eaa0B", balance: _1e36Str }, + { privateKey: "0xe17081f3A374a51ceB0ADcb8D3bEdfc11e6dbF7e0e2f65bf1FBdb366C5Bdfd13", balance: _1e36Str }, + { privateKey: "0xcFAFa574Ca94fdD8c9aC45DDC76d167D8d0b6dA89f7FBdd315AF109F87d7fd40", balance: _1e36Str }, + { privateKey: "0xAa9CFf5FDB5C518D5bAaa64b02A6C9c4e12d20CB6b2dF8B84A1C56bbA8C3c8Fd", balance: _1e36Str }, + { privateKey: "0x817C6aCfAaf68Ad1fEadEadD5A5795A05bBDFc26BeeDbDbe69D4153E7A6fF16A", balance: _1e36Str }, + { privateKey: "0x050b9FF102EAe35d12E25DbaD5C12d4bC2e280C73D4AE0B7C9a6a5d99C2C2Add", balance: _1e36Str }, + { privateKey: "0x28c9e1ad7b6B314e8bd6ABB2E5dEe5fB7169bf2dA9D251bEdC60E9b4A571B6bf", balance: _1e36Str }, + { privateKey: "0x68e27B0dC1ada4fFbE55fDba88CaCb983Eba34dD40108aAdeb8eAE97884ff56A", balance: _1e36Str }, + { privateKey: "0x80ccE4C8d0f476C48bE18C3C0776676E0B5fBAAF0faafBfc8F1afB5bb86Ae21e", balance: _1e36Str }, + { privateKey: "0x34bbFC5495db569a94Ed5DE5747eE6ACCc7e7ba8C946791AA1ccF3e33a30Dc16", balance: _1e36Str }, + { privateKey: "0xBB8C5eeedDDb7aA142f1fFa6465e9da9FdEe97A1B73fbd7A8bC2BDdECa86CdC4", balance: _1e36Str }, + { privateKey: "0xEf82c09f5B1b96e6DDca8dcF4dBDAFfE8725b8566eC68A30dbdA2cD280edfff5", balance: _1e36Str }, + { privateKey: "0xBE512B2179Eaa64d5beb168A6DF2e05454ACE275a4DF4ed8Ce7c9edD4cBACCDB", balance: _1e36Str }, + { privateKey: "0x9bfC1d24Ce15BF4EDBAdA78A6e5Dfdd9aaBdbaB3c05Eeb86Ea1b771300e25F3c", balance: _1e36Str }, + { privateKey: "0xa0Ddb0Eac7ED144d2f88Cb9FaaD9aACDf74f4fAAc8C550F824dFb3ED5d7DF7C9", balance: _1e36Str }, + { privateKey: "0xdA41e0E1efBaCCB4ebA469372cF20B82aBDBf1a97C90f33c2B7d1e29F06FC25A", balance: _1e36Str }, + { privateKey: "0xCC807D5aDD9daCDAD981d9D4838493df59E304e2E2b8D6F23fc78Eca552D4679", balance: _1e36Str }, + { privateKey: "0xf8F18DdDc15eE16Ade324930E5b2941cfE6f857aEd7B3d0E912946d7681a0DeD", balance: _1e36Str }, + { privateKey: "0xCE3a8E365ef9DEb61D8D95cbEF92Bd7f93C4bEeBF50fCCCbC6a4ceBd6beFf5D5", balance: _1e36Str }, + { privateKey: "0xEd8C8bD61eDc84fe50D268aAf98ECD2c5EAae1931B49deaB5A7D13FF60c19558", balance: _1e36Str }, + { privateKey: "0xe7857579f93baF6813A5E23aDD34dd6eBb58B4b7902f77Fd87D0AF652cD7A898", balance: _1e36Str }, + { privateKey: "0x65dc072dcca87e1A79c008ce2eaff2270Bf049e0463796E1B3aEEe8Cf489Da99", balance: _1e36Str }, + { privateKey: "0xAEaCFcb0ca60cd81A28C860e84c0C531D42CAfd20B92F8b83cFd92bD0eC99AF5", balance: _1e36Str }, + { privateKey: "0xCBEae8B321DEb6BD2B4CbB6E1b6eFCbffaDFDde7751400ACCd0eC17bd36244Aa", balance: _1e36Str }, + { privateKey: "0xe72eABb7ce28ffcFe62b5D830C5051f1Ba3CffBE9caE9eB1F5EAeaf331A1b1cb", balance: _1e36Str }, + { privateKey: "0x577F6CE1fbB8a05F89aEBDe9964fB1ffAA2246FacC0Bbf853ddCDCD22D381a7E", balance: _1e36Str }, + { privateKey: "0xf9b099e16ecC12df5c2AAF2BFEB2CCdc09Ff7A22c791eA1420774B958ea043C9", balance: _1e36Str }, + { privateKey: "0x0bddacE2b0b08C0cAc3CCE46BF4bA7ec2BCC6eb3AA2DFc6C8F0fE1aeC9728b39", balance: _1e36Str }, + { privateKey: "0x84Ef4B5350f5DDc4aD8Ad3f1B8c1D6879eBC0b278e7721C251E0fa19177a9eAc", balance: _1e36Str }, + { privateKey: "0x1E0AEABDed46AcEEce6AFDd0Ec0f61d4CAaCfBE444DCFFd0f60F4Cbb13f85731", balance: _1e36Str }, + { privateKey: "0xF343894B68aE4dE6Afc91FEBeccc93388Fe97b052C232FcEa1CD5B7DcDbC3BEb", balance: _1e36Str }, + { privateKey: "0x60a402CECbBbC64De165d3c64fEFed7c0DBddFADAfFf948db17Ce4eF7a692F33", balance: _1e36Str }, + { privateKey: "0xd801b8CDcFec3c9E9F9cd6E034aDf5b78D9bb2be2060D87C9e85E8eEC4D2b968", balance: _1e36Str }, + { privateKey: "0xb7BCF6bAf7b4DCf376B6FC1f8ed0Ef4edc01d7B7Ae2c1B85E8AEee7bca6D53fb", balance: _1e36Str }, + { privateKey: "0xf9474f95B5Ebb1dE6A82F7dD2d0bbee7ABc29BDDd9FdAE3ECed9c152d6F1FCeE", balance: _1e36Str }, + { privateKey: "0xE93c61CA6EE13ede2bDb277E578C1FEdC5df77B20bd38bBefbCB3b150dc96DC9", balance: _1e36Str }, + { privateKey: "0xDACEEDd355a4FADCAfF83889ff47DfbA80Aa8B08620cC995e3bcb49AcEf68fAA", balance: _1e36Str }, + { privateKey: "0x3ec7CeDbaFD0Cb9Ec05bF9F7ccfA1E8b42b3E3A02c75AddFccbfeB328D1B383b", balance: _1e36Str }, + { privateKey: "0x72a88DafE5e4Bd140F730da7a8bAC3F15fEB006Fc1FBC37e1C1A82EFBEC80875", balance: _1e36Str }, + { privateKey: "0x91DEC3CB17104f6fD6eaAFbbD47Da6A2a9EcD57fcdCaeD07aB9Bf6Ad61F1EcfC", balance: _1e36Str }, + { privateKey: "0xB9253e5a74f3E2c9eAACd396fA367d2d999BB2DC1bbEFCF1AbD62d1f350b9Db8", balance: _1e36Str }, +]; - [ { privateKey: "0x60ddFE7f579aB6867cbE7A2Dc03853dC141d7A4aB6DBEFc0Dae2d2B1Bd4e487F", balance: _1e36Str }, -{ privateKey: "0xeaa445c85f7b438dEd6e831d06a4eD0CEBDc2f8527f84Fcda6EBB5fCfAd4C0e9", balance: _1e36Str }, -{ privateKey: "0x8b693607Bd68C4dEB7bcF976a473Cf998BDE9fBeDF08e1D8ADadAcDff4e5D1b6", balance: _1e36Str }, -{ privateKey: "0x519B6e4f493e532a1BEbfeB2a06eA25AAD691A17875cCB38607D4A4C28DFADC2", balance: _1e36Str }, -{ privateKey: "0x09CFF53c181C96B42255ccbCEB2CeE7012A532EcbcEaaBab4d55a47E1874FbFC", balance: _1e36Str }, -{ privateKey: "0x054ce61b1eA12d9Edb667ceFB001FADB07FE0C37b5A74542BB0DaBF5DDeEe5f0", balance: _1e36Str }, -{ privateKey: "0x42F55f0dFFE4e9e2C2BdfdE2FF98f3d1ea6d3F21A8bB0dA644f1c0e0Acd84FA0", balance: _1e36Str }, -{ privateKey: "0x8F3aFFEC01e78ea6925De62d68A5F3f2cFda7D0C1E7ED9b20d31eb88b9Ed6A58", balance: _1e36Str }, -{ privateKey: "0xBeBeF90A7E9A8e018F0F0baBb868Bc432C5e7F1EfaAe7e5B465d74afDD87c7cf", balance: _1e36Str }, -{ privateKey: "0xaD55BABd2FdceD7aa85eB1FEf47C455DBB7a57a46a16aC9ACFFBE66d7Caf83Ee", balance: _1e36Str }, -{ privateKey: "0x24AdB73C45C2EccEDE38B63E5B8F3D3bB396cf0eDFa4BB788231C8fd38d4cdd3", balance: _1e36Str }, -{ privateKey: "0xA7C2caCEACfdE954DebDAC9FE0dB6D587eA1FC66Ffa7B2E802D6021EeF9fACEe", balance: _1e36Str }, -{ privateKey: "0xab6b6fd0bcAc38E3453A751dB3D6eEa804aCfAc6782Acc19ec2ea225673fAC1C", balance: _1e36Str }, -{ privateKey: "0xBCdEd8cdAbf2FecDE7CD4cEb56E81B9eb8DDBA4fFA4d7D9b5daBD70BFfbacfDf", balance: _1e36Str }, -{ privateKey: "0x51B9F9A65ec3f86feDe3ac7cBAe613b6b2DEc64c93b0fb0CddADB6F6Ee3D9866", balance: _1e36Str }, -{ privateKey: "0xead23Cf6c3e1f61a5e390381A39E7c8c79B6d03F51b4823D83AFEEcabBc1A680", balance: _1e36Str }, -{ privateKey: "0xCCCB498D6AC5BB5AC0F963eCC80b8c54bBce8a0AfF3df4a240Dd07AF6529bcAc", balance: _1e36Str }, -{ privateKey: "0xf2F7299ACB815b5002BD2C36cdBccE59F6EfDe6ABDEB8b744E987cEdD5b3E5DF", balance: _1e36Str }, -{ privateKey: "0xbDea513EbCa2683eAE46DDDd6ADF8d8AEf11aE3bb59d4fabA5c01BB53B1caEAd", balance: _1e36Str }, -{ privateKey: "0x218b2BA39Cee417A3cE486CA87e3CA63B360731Ed7CEf15eda6DB88A872Ca4e5", balance: _1e36Str }, -{ privateKey: "0x9ebC3BA711E9C6dfDDBfD82c8aC29dDBFEbE51d4fB2D5773c1c9EE1A0afCc76b", balance: _1e36Str }, -{ privateKey: "0x82Ae62ffBAEA3cF930F3C310Ff8C9ec8AeA8cBcd4ABcD76d43d540EaaEb43Ae2", balance: _1e36Str }, -{ privateKey: "0xADbFcE089F7b0a1aeA10020d0B4EdCDDA8Fd13EB4BdFdd0b6EA3addfa79119f9", balance: _1e36Str }, -{ privateKey: "0x1Aa9d55DADDbd07c0ECf7ecCc8e5AACdeA5707B2F04a727ad60CF0D4D5CF21cF", balance: _1e36Str }, -{ privateKey: "0xBEFF95de2b6aDe8eE0fA6eaBF7c10feE9aFC1da7Ae9cCB2bdDcEEB318dEcA3ce", balance: _1e36Str }, -{ privateKey: "0x8B44f27AdF48A1a5c9bAda13971Ed6EeccDB7a223709c83b96af5cB89BD36F93", balance: _1e36Str }, -{ privateKey: "0xDC6E9936D3F49c26a73A4Ab7E1Ae2965F680adCaDC4DccafF11A48E18Bd63688", balance: _1e36Str }, -{ privateKey: "0xc07dF5fD6c4fF8be980d13ADDA3a86FC7b815BAbc091eCc23bBB27a1bfac22cE", balance: _1e36Str }, -{ privateKey: "0x64fBBd78Cb201a5eE06fDA113C4c91B85d8e0e2a5Dffa38CD541dfdF72A01D52", balance: _1e36Str }, -{ privateKey: "0xC28e7e4ce7BF6b7FDedd9483CDafC3a2cF1fEcdace5e8Ac3F81CCFa83e484f06", balance: _1e36Str }, -{ privateKey: "0xbcbDddCeffd3b395bc4e02ABC4cD464eBd3BA6f756BeEd414fb44E5Bda35b6D1", balance: _1e36Str }, -{ privateKey: "0x1Da12363E1Ea59cAc9f88E4aCebbdCA8cD25Be2C72da22C3dD9D05e193678dE8", balance: _1e36Str }, -{ privateKey: "0xCe3eA4b6aBfB9BaF5DeD76e6F6C67Dce9f18d6bcb8290b76C2DAcC87b2d63E0B", balance: _1e36Str }, -{ privateKey: "0x8bfDDCdb52717A0dcC8daf7bC0fCDf127BA09375CF6CE3DBbEe0c64E5dFCA60D", balance: _1e36Str }, -{ privateKey: "0x77CE7DD53edb5D85d734103af171a7c47140AB474Ae4D05AeaBF5bEaD6EfFFf9", balance: _1e36Str }, -{ privateKey: "0xb45dEE462c21Df583FA1baC536d41AfE4ef7d84a858aEC03F6d6D293f4881a9A", balance: _1e36Str }, -{ privateKey: "0x7b606a0c35deE9E81873F7e4fB1F73fcFfB2A3Cfd45eD12abcc08A3CeECAaFb5", balance: _1e36Str }, -{ privateKey: "0x8De4c0048aAC87fc0e61ceAF1503716cB8f25eDa4BE0DfddfD85568B052c6cC0", balance: _1e36Str }, -{ privateKey: "0xAcfA5C7bAFF9f01BE4cBeA6E399BcE609DECcEAC7e0B411bD9eD38CF177CD2bF", balance: _1e36Str }, -{ privateKey: "0xE8dD8FaaF0bBD00AAF2c5eaE481bfcE668e5aDef445Bb9Bc81fEF995542C3F2D", balance: _1e36Str }, -{ privateKey: "0xc115A7DCeEAf591C8dA3eF4cf9ECFCbcCba77585Bae56b755bAeFA714cDaa9bd", balance: _1e36Str }, -{ privateKey: "0xa302c71EF0D1d479EBBcAFF6BbC86146A26ba05c65Ba97EE915a5F62D30907c1", balance: _1e36Str }, -{ privateKey: "0xd1fEBbFd8D3C980ff369e62F8EBa9eDebccFeff12Ca1eEbe3777908E1c3e7cF8", balance: _1e36Str }, -{ privateKey: "0xc4D67EC0a5cB398E8cdc9F5bEDfF51fF63F6FF505A25C5a99616062131f7b402", balance: _1e36Str }, -{ privateKey: "0x602F39eDfd6c713Ee18aebE55d4e1f838CBA979FB4d0F9DaA6AebCAadAe7E1C9", balance: _1e36Str }, -{ privateKey: "0xCb30CBB18b1d15a6edA00DCF64EcD04f9E64fBcC7E2abBbe2f3AF1D44cBDDC9b", balance: _1e36Str }, -{ privateKey: "0x5dE6f3462cc76e97AbE877aCbFc2eF4CEd68e47DfA7A0255fEa2fBbE28b7F70F", balance: _1e36Str }, -{ privateKey: "0xb92Ff73D27cd9febDA3Ca62Bd3aEC38eA609Cd94b7fabEfA5A0e9BCebeDe9F6a", balance: _1e36Str }, -{ privateKey: "0xcb2b40b1691fFaB7cE472D1D7eD04C4f3AC1d597F01Abc1BeAfeFEA4eA470c4c", balance: _1e36Str }, -{ privateKey: "0x9B4A523E1d91954D31FcFb18Fdc28A0a7af6c45AC73B9CbbCCEebcafe980d510", balance: _1e36Str }, -{ privateKey: "0x8d90b7cAdf1A5EAEc001FEe70632CF151fdCDdA1c590BDd1E61Dfd0cE3219791", balance: _1e36Str }, -{ privateKey: "0xA65C0cbaef18A5A86aaFe44EC6932Ec0EAAB647fbCCE905cff1A125f5Bfe282D", balance: _1e36Str }, -{ privateKey: "0x09F36aeF4f0eFEC0DE56CBaa8aE4Ad71aC820C3f6d649Eb9d8fd3492aC0a83f3", balance: _1e36Str }, -{ privateKey: "0xEEfdcE15FC4add6CCcf53DFa37FBDfCba8f2caE454CB2cA433e26A8D396AE4ab", balance: _1e36Str }, -{ privateKey: "0xC0d9D291fB49F4fe3B2C6Cb44A8210D68Cc727d1ddc8DaC22A26CC9C3f5a5f4a", balance: _1e36Str }, -{ privateKey: "0x7b77defCB1fD1C81e1cBFfF38949852BFE0fb0eb8385c68D26bf9C2c6dECe380", balance: _1e36Str }, -{ privateKey: "0x0F6Fcf8E8A99BD10843445bEBEC6AEA5a8e5976451FBAC1d351c24f9d57Ef96F", balance: _1e36Str }, -{ privateKey: "0xC25ba8FEe461FEF1C5AD85Fef26aCFfddAa7B2aB5C91bD3FA8A4AaDA79dd8bDA", balance: _1e36Str }, -{ privateKey: "0x0aFAEfc59D19eFc6EEBBBFDFBE9d5DB87de7d50f8ce2023850770dD434B567CC", balance: _1e36Str }, -{ privateKey: "0x836Bb03Af64f04d0fAc574fab9a2C7E4a1bfbd2Fb0179e5BfA1198A2d58EcCcb", balance: _1e36Str }, -{ privateKey: "0xdbE59CA8dFCEbc17b899f5CbC4C2abAD9a2DcaA85bbCc2BbF92865a66cBCAcDa", balance: _1e36Str }, -{ privateKey: "0x6ccDfaAEA2bb1ea2F4b376Daec0645c3f3567682aD2f8fBD9BeaC4abB0489Dd3", balance: _1e36Str }, -{ privateKey: "0xD2bD2B8F3eDE84cB8f9B8aF6901f8F0a88cD1D7c41eCFfD8DDE67Dcb9521f15A", balance: _1e36Str }, -{ privateKey: "0x1dF8Ef7ea6Cc90DfC2Fb7F412e7d5A4aE8Dab3e538F8DF9edBbE41CEaC40F8aC", balance: _1e36Str }, -{ privateKey: "0xDfaD57f13d737cfecf50dBbb922eFcf97FB33c51fA4f9f967BEAdc892FE3fA5B", balance: _1e36Str }, -{ privateKey: "0x279AFC0e2B7A24CbAcC4F1ddA9eC763Ae6B5124da293dAB544cfC74E51d6c64E", balance: _1e36Str }, -{ privateKey: "0xDfCcDB4D1365E4b3FB419adf6BadC7b3886BEB2Bad2aB9b60872B2DCCbc3AaB1", balance: _1e36Str }, -{ privateKey: "0xBd3FFbDa8bc036a0D51ABBC8db61EA97812ed7e169ef7efBac1F66f38A45E2fb", balance: _1e36Str }, -{ privateKey: "0x79ED1a5a0b585Ef0e9Ef59439bbc3142e9c524FF95bcAecFa06eBb0FAca3f7Df", balance: _1e36Str }, -{ privateKey: "0x6E40ee4BFcB1be77b18e127d75a815DbFaFB3548857eEca6Dce730dAaA8e4fd1", balance: _1e36Str }, -{ privateKey: "0xbeDff07E874BECB31dFB022Ba6Ed6f626cae74E7F8E9Efb3752d1048edBAEB1f", balance: _1e36Str }, -{ privateKey: "0x744B70a65c6c01a262400fe6a82a5cfbB2E61249DccBC2Cfc8d6E19AC878fD06", balance: _1e36Str }, -{ privateKey: "0xcbb757EdeC8E19Bc2dffdCAeD2BD5ACBcA30CE97de34F6B3cB642edF8E8Afc85", balance: _1e36Str }, -{ privateKey: "0xdc32Ad57beaAAaE782ECC11344a1e2308bcdAd834635dD22FCA0C2Cb3ca2aabe", balance: _1e36Str }, -{ privateKey: "0x60ABF4ef24DC6B4Ec1aE1eCb0A2A8f7913b11f07db0e74ABe4c5a3FAdD35EF3E", balance: _1e36Str }, -{ privateKey: "0xf3F8AEeb4b3EFE42eF6C53403Ece1CC6AFcf7b677cE1cBe8fADf71ABffD00227", balance: _1e36Str }, -{ privateKey: "0xffbfC0fD2585fDFBeFf9CEB72e0Aa48f6bFD1ABBD585DcaB31DCc390b4Fea5Fe", balance: _1e36Str }, -{ privateKey: "0xd2FaE3Cc087239F1ECAd98e955a4E1ef4bfc1DaD7EBB2d78643ECF4351bFcbFC", balance: _1e36Str }, -{ privateKey: "0xF8b749a53cffb6BeB5b6F1Ba7BFd91cf98b3eC7Dd12D4DcFe75f1DE7b04E6CFf", balance: _1e36Str }, -{ privateKey: "0xe25fc5f8d3B25CBe560E6925B670225a8EB4A9d12Ce0345dB4b160d2DaCe3077", balance: _1e36Str }, -{ privateKey: "0xAc2534fcbeF95e4fFC7c83DEFCC85DcDE846aEeb7ef0542ADE15a6E4EdC6A32F", balance: _1e36Str }, -{ privateKey: "0x785eFbe723138c23108BAfd119fC3F99FcDd621C4320FB8c43D82AEdA3EffC59", balance: _1e36Str }, -{ privateKey: "0x5Ab36eFd957af3EEC90A4Cdcf72ba463F10EFC2CEF2CF4170211C26a2aDf5E26", balance: _1e36Str }, -{ privateKey: "0x74e2AebaC39Ec6B27Ca0ef2b238994f49Ee9489df1E0dABe1d69eE9DfD9B1fa0", balance: _1e36Str }, -{ privateKey: "0xcbF5c97E0E2112aF0D13d4F4eaDF0572f15eae16b1F6D1C355b6Db5eAc3Bdc0c", balance: _1e36Str }, -{ privateKey: "0xc9Ab29514391dBadf0bA35a3eEf00FC5D14D3a242d3B9564B2BDBB3b1dBAcd85", balance: _1e36Str }, -{ privateKey: "0x1376febf8Afe5fFeCEFe1902Cb28f8b7Ef7EEaFeEb5F3C5E37B9afd196eAec67", balance: _1e36Str }, -{ privateKey: "0xB90b7C6FaCCFe4b4F0DA0DDAe7cEDCFc5E5d09De2E496Ab4fE7b106F90F1ceAA", balance: _1e36Str }, -{ privateKey: "0xb8DFEE8b8cCaeCb2B0dbDf41E956e98EdD2A05DEffc533e49Df27AfDc5CC7a6c", balance: _1e36Str }, -{ privateKey: "0x2F25d6fC8E8E2AF8dC0BEB1EF3aA28fDb2DB6A9705BDcbdBd01cE7CABfeEACFc", balance: _1e36Str }, -{ privateKey: "0xE46aBCbB580A28CDBF7C01d740AAefBB5aDa79BD80aBDcE7bbe15dE199cfdfE0", balance: _1e36Str }, -{ privateKey: "0xECb78eb074b81Ade820f74a97DA3BaA8B33cbcAfeedc3314FEACC60CC2d65d09", balance: _1e36Str }, -{ privateKey: "0x888AD49fFbC6fdA307f67c5ABc14a1cCeCBaADaAFDE0dcCBe274Bbb3Ebc4Ed34", balance: _1e36Str }, -{ privateKey: "0xE6aee5027f5Abe06FE7A819067CaFf8eE5dbB76c8c6c3C4fdFA11fA7F6EA92d6", balance: _1e36Str }, -{ privateKey: "0xAfafa9f70DeBa03746f3CCcbBc76C1F1dF8E4a220aFadC55AE8BCE4dADfBc05f", balance: _1e36Str }, -{ privateKey: "0xc6f9DA2b1EcEC198B4eeCb97FA453BCCDD4aA1805303Bd9bbad6cAFbf02732Fe", balance: _1e36Str }, -{ privateKey: "0x5E66eaB19703dAC6fc85F07072241fABFa5FE9D161ae8D16EA9A2aDdEe4b8a7C", balance: _1e36Str }, -{ privateKey: "0xAbe72e623a6Baa5f8f0b1aE4bDAc8CdEaFd1Ecc5878B9eDcBC80aC61020F0E83", balance: _1e36Str }, -{ privateKey: "0x271ec8d6eb55A2ED2a5c97CECeEDEF59c2EEE5EA2EcCD3CbfeC455efa45578B3", balance: _1e36Str }, -{ privateKey: "0x2b8aaBcF28334Eed82EA8c6E4f18AcFfeEC9E32cd8Ed7cBd3DECbA271cb9C4c4", balance: _1e36Str }, -{ privateKey: "0xb13c1a6005BC02CCAeEC8E9fFfEb55e1B86A6ffb4f4DB48b5506904dEeCf7aFa", balance: _1e36Str }, -{ privateKey: "0xd37C35aBa93EB24Eb95A7D64C3508f415e864dEC8FfEDAd4BEfD873d192805fE", balance: _1e36Str }, -{ privateKey: "0x7C255436a3785ba78FCBfad4F5D49b9C5aDc96D0a34DA4AE879Fe9D72fcAdc4F", balance: _1e36Str }, -{ privateKey: "0x809325745E84a52BEeCf5920b8BF3Ff98F29B2A9ef5F72B7D3feF1f66fc7ED51", balance: _1e36Str }, -{ privateKey: "0xCED115dBC9d424DEa7fa684bA606DEFdF618eAdC40ff62affeABbc176b49A1FE", balance: _1e36Str }, -{ privateKey: "0xa55850D6ab8844d6D64B5daecb9350899d195107e0DaaBfF470c8BfaaF2cfF3a", balance: _1e36Str }, -{ privateKey: "0xE5B0b7AfA8f0d598EdD7DFa1290c9Ea9683b3DC7103C9AFc37B4BAB0f4D82bfb", balance: _1e36Str }, -{ privateKey: "0xfaBDC65325EB8c9F874bA1E6B9BaEc63a2D0E1ECF6b742AF6484fBEEcBC0922e", balance: _1e36Str }, -{ privateKey: "0xC8dDab45a8a2DC25fbC10Be780275e5fECF142abbDADB5FD1f2C89f80bC3C8B2", balance: _1e36Str }, -{ privateKey: "0xf9588Eb75e37f3D94B6Fe66eEe7AD3bCbe254ca3A802e8a4CeDEaBead7Deef0B", balance: _1e36Str }, -{ privateKey: "0xD5A1CFD2d684cA6F8ffbd95cBEBDbE0f7dF7aFd9b4Adc3Cd89Aa4F884E87766f", balance: _1e36Str }, -{ privateKey: "0xe5baeD62c0B6bcEd4bEd38Ea9ff7da0FdAEF1B96AE8aE1BFDbAff9FAaeaECe59", balance: _1e36Str }, -{ privateKey: "0xB5ADAaA2b8A8CfcDCdAe1a1C9B68fbf7DC59718527F422Ef8a22A47edfdefc0f", balance: _1e36Str }, -{ privateKey: "0xA6d530ECb9BfaB65db8f4eB78cf8dA0Ac85C2E19dD18cf9C3aA4F8dc8deE2A2A", balance: _1e36Str }, -{ privateKey: "0x858fbefDFAF3206BbbAEFF6311a04bC4F00e7a8a1f86A9C29BC4f99B3DfCA47B", balance: _1e36Str }, -{ privateKey: "0x3283CcA8E849AeEBa6D07fbCceF06DBFdD6C280bf6ACFe4EcEf8cD6Fe906AEdb", balance: _1e36Str }, -{ privateKey: "0xF19B146b83fD4dc48A7B5f463dCadE3C7027c99F54f05dcA9aE8cbB9Ff7ACc4b", balance: _1e36Str }, -{ privateKey: "0x1A89bcB5cC568e7Fb20d0ABE1dCD520Ac06FAFec6DFbF37BF2eCE7A042a1C8b1", balance: _1e36Str }, -{ privateKey: "0xb29ffFef1A19A6c20be9fDc524E2E3C4Bfbe91Cd5c8a5d54faB830bec9eDb76E", balance: _1e36Str }, -{ privateKey: "0xe7cBa50C7AF2eC5C23EdF60BaD08D4d7d3eF5cA0D632CFaFC6874F0c95BEDe3C", balance: _1e36Str }, -{ privateKey: "0xbEc3Ea7F6652dd0DDA2bF271F982aBCaBcBcD0cF76deD7B2c8508d515D47C20E", balance: _1e36Str }, -{ privateKey: "0x87d2510c6CA006bc5BfDafc1e11e2212cCd98F9D422A4E85c2bF18cfCEA2c9c3", balance: _1e36Str }, -{ privateKey: "0xFBBe285317dA7bDecdd5B935ce761e71CBe19f8B74fbBE598cD0a056bdac0aff", balance: _1e36Str }, -{ privateKey: "0x411D062e5f17f5Ec3e7317CbAdACcBDf0cD1CE6f62A3bf40596CE4132faFc9D8", balance: _1e36Str }, -{ privateKey: "0x8ec7fD8EedaA8b90eeC27Ddc5BFd6696d8Cff53b470ecC51CC0Dcb465a71B13a", balance: _1e36Str }, -{ privateKey: "0xd823D0AaE55f149FCcD564f506792889BdF8a1AA9f7E9bd3b2Bd0A7e1B1AFb6a", balance: _1e36Str }, -{ privateKey: "0x26d94c8fc2cfBEA48cEF0eBfd3cfcDCc770F1467A4fBa51BCD7e7e61250FDD8B", balance: _1e36Str }, -{ privateKey: "0xEc62792fc72B20b8b93d90A69b0565bceab06E90dDD3dEA23d1E9DE2ac39FF62", balance: _1e36Str }, -{ privateKey: "0xd7ccC3d570C74ae2e4F547D07752DbD6EfeD9c8B65c8cB4A3cFcbe492faE25aD", balance: _1e36Str }, -{ privateKey: "0x83C391713Cd7b0e0852bD84CAaDD1aB0B65CC1CF4CfdF6bd97A3008C2BCf59B3", balance: _1e36Str }, -{ privateKey: "0x8E39Ed10E2eafAbc1Faf548F5F8074Ddc0764Cf855f6ae8dEF115DB5bEB96B61", balance: _1e36Str }, -{ privateKey: "0xAD2E2cb68aB1D75BEedEFC47ECE963D1afbBFebd10C4Adf68AEC58dBfBfBCAFA", balance: _1e36Str }, -{ privateKey: "0x5ED318bF8A5Bb4DBD5BE9a47Fd6ec59E97C949a1DBc31BAcbE645F9Cfe4ea07c", balance: _1e36Str }, -{ privateKey: "0xdC30Dd994B8aCbE9F4374186c11EdcD85eebc4dBf4aFFedBBE9Afea2D9496a0C", balance: _1e36Str }, -{ privateKey: "0xd90e2a275F7e9f54F8bEC3EDFaed1A150fdB330475f6CeCe70EEbEA779dd44bA", balance: _1e36Str }, -{ privateKey: "0xA3d0DA6D5Af0fdaa033E1F885BC3dBf62b203a09Fb66CeCDbDbE0AD0Ad6f6F7d", balance: _1e36Str }, -{ privateKey: "0xeCD0A803DCcfA3AaD2cCdfBDd94318bAEbE3e14BBA4F0e770a447B43bB28FEFB", balance: _1e36Str }, -{ privateKey: "0xeBF2fbc9C6FE3Ecd58d1323Fd7Da610deFc5B10b73B585c432430ceA81c047ea", balance: _1e36Str }, -{ privateKey: "0xDb107Eca6ee69b73B4F0fd25FfbEF4d12671d267CBf6CE39cdAbCa68bB92741f", balance: _1e36Str }, -{ privateKey: "0xDf8DBC03A850D8b188CBEc934ffEEE5773A6F97cbcEc43dd6f45BAE437EFFCCd", balance: _1e36Str }, -{ privateKey: "0x92D958ce5F73F0Eca0A89adaC08C36eBac6547c3865545Ab054b16Eb1C0086cc", balance: _1e36Str }, -{ privateKey: "0xF6075f1BCE23B4fdB383c4051CeFBf8e2f9ACBCDf2FDef8Cbf54ff299Ebc05eA", balance: _1e36Str }, -{ privateKey: "0x2A9279DA5925e3b373C5Dd1addAadC86c318b12CdA3ACDF9D31c82FB4729aeeB", balance: _1e36Str }, -{ privateKey: "0xF6A342721bd931a8AeAeae750Ba5EFAffDFeBE4514AcC224fFeb6eEbe15d7CAE", balance: _1e36Str }, -{ privateKey: "0x29c8bB26ff7fFD3bcB884Ef9Dd77Ffa6Ab5F2C71A9c35e2CED3dEe4dcC5009AD", balance: _1e36Str }, -{ privateKey: "0x48f59c8Bc2D672A3Ffa394f5D9C90c65745aACf7Ceb9E32e1c36ED8Ead4af6b6", balance: _1e36Str }, -{ privateKey: "0xeaD4c3d9cFE4CDDd2ffB3aa647D40Fda9bC6d5aBA2F1b07edC89b47d78E34A8d", balance: _1e36Str }, -{ privateKey: "0x6adAdACCFa1cBD18eC5Defc58B0AFe331337CfCCbE1fDd76c2371697df7E243a", balance: _1e36Str }, -{ privateKey: "0xcFE0eB0aFbE7eF2DdA46B7f2fC127AC87C74E4aE3faAFebdDEEE6cC6cABdc2a7", balance: _1e36Str }, -{ privateKey: "0x8C9fe32563d3ed6B34A2Ab06271Bce4F55d42dA1EaC4db9b16ABF6ce71aACC76", balance: _1e36Str }, -{ privateKey: "0xdfDf9fEa42CF1AB0fbBBF52d5305Af1F6aaAf6AfBBCCA4a319ce1F3A908eb9E5", balance: _1e36Str }, -{ privateKey: "0xB6AfbE0eE5daffcF23facCaCcED35d15b3969fAbcD306eD6fABEd5E8eD6C5FBd", balance: _1e36Str }, -{ privateKey: "0x4FBb2FFDD3C3DB5F74E893577bA339cE5A8edbaf571E91adedEC50fa46c56864", balance: _1e36Str }, -{ privateKey: "0xeB417BE7ddeaeFfcF2fcb4F7bebde4FB23994B9F862C863a358fD37Ba929B2F8", balance: _1e36Str }, -{ privateKey: "0xDBA12Db5b29f01ACB45C0b051aD7cFaEb4BFe38abcCf13BA1F3bf2177dC51CFa", balance: _1e36Str }, -{ privateKey: "0x81D77Bb549aac5DfcD4EFFD5FB3Bb69FB48D7CEACc1fBCBc23Bae1DBbab0fdbC", balance: _1e36Str }, -{ privateKey: "0xb9BDdC1F838Eb3bF6B49b8bF32181Cf89D2D120bEB62CcAea9eAFbF4fdB0479F", balance: _1e36Str }, -{ privateKey: "0x02adf4DdCaAEE05D7A297f16FD5aA8dE9dCCE6d1Ff6cadfe4AB8E8d662BbbFAF", balance: _1e36Str }, -{ privateKey: "0x61231fcABe74Bc2faddeabCcad3CbEE5f7D09d9d0b2bDCfca8F9C190BCf8Ef04", balance: _1e36Str }, -{ privateKey: "0x68AeEF50Bb3dAdEf65DB5cE7ca6C049089Bd0267e8A37DFbcF7A683Bab5aA3Cf", balance: _1e36Str }, -{ privateKey: "0xDb941ec68825Ea73Bb4616F322c996b341c7ea06b1E5BA3D7Bd9Feeb4BE91196", balance: _1e36Str }, -{ privateKey: "0xc95FEaB1EbC4CBB2EBcAF92BDC0cBfa6fD0D9d5CdEDceEA71c9854711E3BEeBE", balance: _1e36Str }, -{ privateKey: "0xC3Fbeec5CB369d625ae086BECd0aEa2dB5Abb3Db2abca4df8fb185c43D272D8B", balance: _1e36Str }, -{ privateKey: "0xdFEfF3cA104bFDdB1a43649DbB469beECBb0efb1cc2E48eDEE41c57AeCB98BEa", balance: _1e36Str }, -{ privateKey: "0xeF28ddAB8a4ECA0a698aFA55bbeCa8Fe5Fc7FD5957d5eECa3A0238182f1Fb4dC", balance: _1e36Str }, -{ privateKey: "0x26B13acfBcACDf666530bB48BDe8AfF879F54cDd430fe435F0AE8C3fDEe4999D", balance: _1e36Str }, -{ privateKey: "0xc9648ccDD198f2caFa04Effb3fFa1A3c79dAb43d81BE301929cEDDF510f905Ee", balance: _1e36Str }, -{ privateKey: "0xfdF2fAaE2eBE07A011BACDcEB89326aEFD0c72AD95321aed4Cf00e017ecDA9d7", balance: _1e36Str }, -{ privateKey: "0xA0d8233a10f4Abf8ea141a3b75c8f6Bd31dcd9b385DD4517AE45a0ACAEE304a7", balance: _1e36Str }, -{ privateKey: "0xe7b9E1AdA2f0fdCd13C3beC11dfe7a2e41CCBd6b03a4448b8c46F53bdF29Eda1", balance: _1e36Str }, -{ privateKey: "0xDe341eFF3cd160cf06BF3c70CF958Face0fcCd5Fe0CeFa56a2AC8Fbc0495A26B", balance: _1e36Str }, -{ privateKey: "0xC7BD3DB19c0B8b8108B0dDF72F764A19F1C832Dd146DdcfBDbcdE0D4eB89811f", balance: _1e36Str }, -{ privateKey: "0x6DcA7C0ABeabADD22DE19Ae5a5F0627DF3e4DADa71aFFF7c7D5b60F76C1c56eA", balance: _1e36Str }, -{ privateKey: "0xA5B5eed86Ce56dDde6CCFAFBe64AD9aEA7cb114D5Cd7dc73f0E594D6A84c427f", balance: _1e36Str }, -{ privateKey: "0xDF023E46AA90213afEdcf4E79440ff80aDfFd5A31202baeCeaFcc0f66f8e9C16", balance: _1e36Str }, -{ privateKey: "0x76f2Df2CEA6Efcfa653Cb8db9A86D62c6F1E7007c6b7D3D0AD58c6B2dAfEC566", balance: _1e36Str }, -{ privateKey: "0x935e5Da5dfB39f3D18c3fBf6b76bafbA1b4EedCF382b27cfC95AafFfDC372222", balance: _1e36Str }, -{ privateKey: "0x2D8cFD5F5Efe89e21eD6B58678FDa53eFee92Ccaca1E4Dc792DbeaA378effD5C", balance: _1e36Str }, -{ privateKey: "0xabc2b1524F5b1Adc9c72D3Bb46bdba1D670c19cd9A57Bd6d3afC3d1F10D2F1Ef", balance: _1e36Str }, -{ privateKey: "0xCB2964Ca8f2fDC3A1CA02dEc3bf2Ae7C7d58b7805Aac4F838d148aefd0CEbeaC", balance: _1e36Str }, -{ privateKey: "0x620f7f5735c6d6bEF7d09120DFc96FD17DDB34c8fF8BC289AC55cBA6E5A4AbfD", balance: _1e36Str }, -{ privateKey: "0xEAeCbb75A2a35aAF9e6CE8ab03d66d9edA6471cB9bDd8Eb0F1Fc2F1C08767C17", balance: _1e36Str }, -{ privateKey: "0xEfc47CBaa0f5072cA756841a0C37D86eDA0cFe899bd67bAAE22c4BB70CfF81bd", balance: _1e36Str }, -{ privateKey: "0xE009dBd7233C4628D88A6E16B52566bcB73eecECBeD0Be18a0D4F42A5ce85c31", balance: _1e36Str }, -{ privateKey: "0xa07c6A0dD46bf1aFaf45fE5240EbbE4454aCEB1cde673dA5F5B35Ee8AECEec4B", balance: _1e36Str }, -{ privateKey: "0x13ca21fE6eE4Ac4e7e57EfdcB3e5E07c0f9A8F1d1Ac13d4beb8f1a4eDcFC75A5", balance: _1e36Str }, -{ privateKey: "0xe46f0aB26b6a79E8Ee0a3ECCFdda2e2bd6a1dc0Abc13BF0f125ADBB99B6ED32A", balance: _1e36Str }, -{ privateKey: "0x87CdA8638e872804D4eced78A0F061B476d5d12Fd2b4AE0498d0a625061fC8C1", balance: _1e36Str }, -{ privateKey: "0x8190a31fB8A00Ab8C8c1ff2E8b4995B131D6B8cdc6bCaEBd1eE8ABc4d988e0bD", balance: _1e36Str }, -{ privateKey: "0x635eD420F5e71aa6c4b2Fb1a7B1C43aAefB6e62C444fBFb85Fa61B146Ac7aDB7", balance: _1e36Str }, -{ privateKey: "0xDB5aD0baAff52ADEa9b0eAffEe2e5E6430266f400abACb8e4Fc4B01BcBB53990", balance: _1e36Str }, -{ privateKey: "0x8c4Bacbb40c2CBC12F5C52ae374ACf9242f9FDdDA74DCc7D9BfF9E435ea4b4b7", balance: _1e36Str }, -{ privateKey: "0xA5667ebaB8913048Fd49CE21450a36dFbBAD4b9fbDC8CDf7219c563aE2C776ED", balance: _1e36Str }, -{ privateKey: "0xd520fB1BcFA43F3b3B89CA3D78fe7effC13Dafaa7B631eEE16645cfbEAcC1a3d", balance: _1e36Str }, -{ privateKey: "0xBADb99bA75acA5B7cE4Ea6E043BCCFDCf12ba7eA682b11be6B8304608482ea9C", balance: _1e36Str }, -{ privateKey: "0x82Fefd7771474C22cCb1eA0A7Af04e9Ab8a3C0Cf94788574D172dc42a2Bde8E7", balance: _1e36Str }, -{ privateKey: "0x52DbF8e6265Fe0acDcc4AEF5f12dB5C6FfFFFAad3aC47CaaE352e9d4e0fd59cB", balance: _1e36Str }, -{ privateKey: "0xFfF2BF6C2BdCb0f1880eB376AcFD8d57c4AB416D69eb018470cB5fD1B5DcEE21", balance: _1e36Str }, -{ privateKey: "0xAFa217A623a8F47B9cbf81f0Dbaa0e938DE334BCE3dBEFBad6D53bAfB3Bc27C1", balance: _1e36Str }, -{ privateKey: "0xb9044CafEabC51eAAa4B6db03DDAF1e1A09dd3ADDcBcBD10C51e01ce03E5B28A", balance: _1e36Str }, -{ privateKey: "0xFCF41115B2E84db6f7adB20FDEF285e05faaFaD4C6E64AD64bb431e94C68d76E", balance: _1e36Str }, -{ privateKey: "0xCAeE2E543bDD9CCa1CCae5Bb371BAd0CaEafBdd3C08eCC2139BeBaA056b8dA2b", balance: _1e36Str }, -{ privateKey: "0x5aB04830e3fD0D84e75Fe0D4bCECEA18d0BEC3fEd3FAdCD89e4d3BE8ca0f1c58", balance: _1e36Str }, -{ privateKey: "0x9b4A28b18DCDA7f49C461eBb9A642CFe4285C4cbBE3dbad87d1Ef46FF991aEA3", balance: _1e36Str }, -{ privateKey: "0x47f924F4ffcbDb76551f4d851b5c22Bc6c5Ff7AEfb19F2f8cFEed3bDa0F8B881", balance: _1e36Str }, -{ privateKey: "0x963Ecea4132D30Aa859b4fa2847b37fdE0aCDbdc341DbDbF3dD2878F97BDEe2a", balance: _1e36Str }, -{ privateKey: "0xDd5d66Ba5eB9ed1D54E9A1aBAD9AD9CE95Ca370FA8c6fD3Eec3481fD09e96513", balance: _1e36Str }, -{ privateKey: "0xC5bEDaAb03101Ac6ea191f8cfEAfd35B0A6EBe6e0dB2bC8eA00ddd5b13EC4784", balance: _1e36Str }, -{ privateKey: "0xff80ABeA6bEF940c203cBA75eF32DAf3a86fBebF57DFAc7cfAACCc29aBa5F03f", balance: _1e36Str }, -{ privateKey: "0x2b48c1bA532D2bcFe5cFCFD04FE71C3cAE556CfA0CB46EcffC9bE72C8dF3E089", balance: _1e36Str }, -{ privateKey: "0xdC05D6BFEc3EDf1D90Af5F3C56CCeAEbcF24A1AcAEdd7F56eEeBAf623c0cBDe8", balance: _1e36Str }, -{ privateKey: "0x8DcAd29a5bEB85DAfb47C2dAF47F6EC467cBd60Fc46c8DC9EfbceE704CdB4b7b", balance: _1e36Str }, -{ privateKey: "0xDfCD2d0a0c958eEb0E037cCfaFCCc1Ac8F4eDb834a1db6312F8E794338ff96c8", balance: _1e36Str }, -{ privateKey: "0xFccb7b5c7A4734BdA79cCAd1ff8F8C5edbCf63B1F847A60aAdF2beaE162D741e", balance: _1e36Str }, -{ privateKey: "0x4A099adedeE538fF7EbBB17DCDEb7aE6E578146BB4eFF91CBe0cCB7eB095b3EB", balance: _1e36Str }, -{ privateKey: "0x5FC7c6f0F5A9fbAaa8F7DeB8cCD67E8FdCb6f6eb63aB5A4D7a954FDF88EDdB2b", balance: _1e36Str }, -{ privateKey: "0xc3cE2c20f7aBEe42a87745EC8fc95be7B2D54589f1C0c19BEa22A0D0A7Ad2504", balance: _1e36Str }, -{ privateKey: "0xed7C97003b0bbaE84Dd3b18cE2767dBbcDC8d01D3ab325f6acE1eC005AEA1CCE", balance: _1e36Str }, -{ privateKey: "0x14Ba7a5a5A55dC27808Bb5e3EbE6D033ef3d46E13e4EFE8cf3fa8ba8971C0EB7", balance: _1e36Str }, -{ privateKey: "0xFbd091bed8a7Fae294a63Ea339f77719bB22aed86B1eF8CbeAf11d35FD254efE", balance: _1e36Str }, -{ privateKey: "0x4AAa57f1fDdFbBdaB85bC49ffbDFb664Cb6F6Aa239A25fb1F3eCe6cDD9fA18Bb", balance: _1e36Str }, -{ privateKey: "0xcDBa7abD7b2Ded9DFFaA432C110654EeA5d85De566Ec6285cEEa156fFd47EFFd", balance: _1e36Str }, -{ privateKey: "0xD7081aa15efd8a6b9040F2B7f347fB9bb5521CD6cD2de3475A4ADD627BDB4E2f", balance: _1e36Str }, -{ privateKey: "0xd6acF81d926f9EFfbEE61C25A3dE28Ff9bb9CCEc6956eA2BFBe12a3C1A7ECe90", balance: _1e36Str }, -{ privateKey: "0x8449fA5BCAB9EE44EdE10b30073AAfb7a46a27c9C99Dc1C4D27b63Eb39e23A72", balance: _1e36Str }, -{ privateKey: "0xFAac3fcfEDfDA7f8ef5012C8d1b99EC5E3b3aB99Bf6E2dE20dbDaca213F08F4c", balance: _1e36Str }, -{ privateKey: "0xFdDD2EA9bfC0AC2aAc30a68680e3F10D3C25F43283B2e1DBcB3cCCa1efE5e5AD", balance: _1e36Str }, -{ privateKey: "0xcAcA0A140194d9a9563918B67c5f5f53cBB90F913ECAebF9Cc1A5ba1659edAa0", balance: _1e36Str }, -{ privateKey: "0x9eb24e1beEdBFF67f8676062aBff6f640C1BBEfD2AB9Ce6Dc508742c5de23dDF", balance: _1e36Str }, -{ privateKey: "0xe3d702eBaF9578B71DfF4d11168626bAbe46a215062eff30dF23bc9CCf841A57", balance: _1e36Str }, -{ privateKey: "0x64a67Fc14B6c40a8f3EdAf3C9B08a9bbd1FFBBd1e393FC0109C4AacFc6c48d2d", balance: _1e36Str }, -{ privateKey: "0xD26a8FBB7cc0AF46c4dCCCc637b1274e98F8B4AF07a7640D5c2bB2EaCFaD3ca9", balance: _1e36Str }, -{ privateKey: "0x9f8eB70DC7bDB7CfEe53cADEAE405CDA3830Ade584f7B079Bd86cacB33dcd493", balance: _1e36Str }, -{ privateKey: "0xfCeF8fFB7bf3f7475c50bCcFDbfb34C50dC9C854e2eAfb886Bd8d6Be2E1B3D70", balance: _1e36Str }, -{ privateKey: "0xB2070bfBb3fcb7778787247a2Ef4cc6e3B8E60d05ad4c0dAB0a7Ef4D770e476f", balance: _1e36Str }, -{ privateKey: "0xC3B58E2D70cD6D2ABbA9fcA671e1E9C1Fac82C7Bc87D264f698D98aEAdCaBeB4", balance: _1e36Str }, -{ privateKey: "0xad428589f9067Bcf33997fa626b2E4eBF1fe6F39cAc1CB77DcC553abdcb3f304", balance: _1e36Str }, -{ privateKey: "0x850eC6b80228Fb19dB5DDA1A5D0bbbc1AeF86AE74FE1D5FeD097CaF1F580FcE9", balance: _1e36Str }, -{ privateKey: "0xF11Aab831B47EadA7e9212d4caB8C4c2403Cbf28C689E0a90ba7F9C7BE00ceEd", balance: _1e36Str }, -{ privateKey: "0x2cF1B7e0BcE571E6ec22eeE45C5087aFa262d2FA18dC74E6f6ecdbB3Af3CB4DC", balance: _1e36Str }, -{ privateKey: "0xe5bBfA78FdB7B55EE4CC7bC9629ceA8Ff2919fd562BaDa69fAA42e8CD6EE04AB", balance: _1e36Str }, -{ privateKey: "0x83DF2cbCfc90dC6293A8c81E05c9d5CAa93F5cEBdEEa1FF026f7cdcaEEB3C2DB", balance: _1e36Str }, -{ privateKey: "0xd6BaA18Ecc09356bdbC66d12CEA18630aA7AcAE7E5CA03f6986240D4a9ea94E8", balance: _1e36Str }, -{ privateKey: "0x611fD2925b5246E2EDaaeD5C8bfea3fAc95CbFc3dEcAeF48BA04ad477609dbAa", balance: _1e36Str }, -{ privateKey: "0xc38A74dc73047221A6Cd5ca6Baa776BEffd02EadEaD0Ce4fFcfcfDBa037fc08b", balance: _1e36Str }, -{ privateKey: "0xA1afFCA7CF953E9baaf82cadCAf4318a3fAB4bcFF78Ab5B53C8970acf2259Ba1", balance: _1e36Str }, -{ privateKey: "0x7ebf90FefdCcEEbceaEa39BcC5bab05283467DE48f2Edcd6777D69712C8525Ae", balance: _1e36Str }, -{ privateKey: "0xf82bad12E793F8EFc5FDaCcEA8Ef76C3Fa2fCB0b493eE4dde43ab101eBC41294", balance: _1e36Str }, -{ privateKey: "0x5Bbb8de04c2f11AaFBFca6bed7b9075d1896C7bF2c17bBA8a0cB192099D33cf4", balance: _1e36Str }, -{ privateKey: "0xb6fe94F20d09AFED3bBad24A99daCcfb7E4D8edfBA1B24ED161Ce8B37a185CCc", balance: _1e36Str }, -{ privateKey: "0xFEdB8adf2b0D6FC96bbD27c1f7d5EDcDaa8BDe8a13BEBda29eA7ad368fe0d876", balance: _1e36Str }, -{ privateKey: "0xCc10FD27Efcad40AAF99a2c2Be7F6cCcAe236dfCbF460E95dFdB6b558A9C76af", balance: _1e36Str }, -{ privateKey: "0x1dBA5Eb675BcCc6DFa31b9F85de06C45Bac6C4d70D6e348b3cA2c1f4F70ab3a3", balance: _1e36Str }, -{ privateKey: "0xCD8604ec8dCb4b7335b7d6bD11f2AaD72E571B22cA9C5e0F411c3fB4098bf5d0", balance: _1e36Str }, -{ privateKey: "0x657E6ddeCc81fe6A799CD4DD8dEf804cAaD2Daddf65fc2AB8ccb8D6D9CADba0A", balance: _1e36Str }, -{ privateKey: "0x5B2A1dC96ad0D07eD9555A8d127D203dB228b0e85ccb0EeeCE059D6D3550A2ff", balance: _1e36Str }, -{ privateKey: "0xf0Cc97904e51F669F798cEf0bAFB6F5f6fe9018aF31Cb4624dC59DEf9DBb35F3", balance: _1e36Str }, -{ privateKey: "0xcB5cCAEC7aEf26f4A7aFD606FacAbB0564F395B1BB5F3D515bF47a4E2BFA340A", balance: _1e36Str }, -{ privateKey: "0x6Cf17C2AFa8466145995Dabd3ACbd4DC3BcDC8EB4Ebb54dfBddA00E1CB43CB97", balance: _1e36Str }, -{ privateKey: "0xD1ba29caA17aE0a3E2dFF5Bad21bBeeCAC5729D72F1cB8ac3a387FDB713d5f4b", balance: _1e36Str }, -{ privateKey: "0x435C5A1b8EEf03AB76153f15BEbC3A4858dD4C9f51F4BE655AAEB872ffbbD5C0", balance: _1e36Str }, -{ privateKey: "0xBBC4AEC42F4fB5775249Fee3C2a964AaBcC54aA61DE01febf8DD2b2Ca11Fa7B5", balance: _1e36Str }, -{ privateKey: "0xEc45f87EAF8F4D86Ea9A1a7D54eeaeb7cEe0cc56110A68FF0fF2f9e09D2e7A87", balance: _1e36Str }, -{ privateKey: "0x64ED2D99b7E3ad5aF62eB9e9eA130020128a1E84EcdFaC8BEb06fFbadE8ded0c", balance: _1e36Str }, -{ privateKey: "0xCad9aE5EaA22592ddbb2e9d1D14f07725Adde4FC4FDCbEd5CAB9C33C0aa5efdb", balance: _1e36Str }, -{ privateKey: "0xdb6A58229C79FcbBD64b0C1c79047d18b93843dEA35Faa402deb6BAFd7A0CBcD", balance: _1e36Str }, -{ privateKey: "0xB10D5E2F08ab9ab1Ef75bD944C8fF356BbbC9A121aCa16a4aBc5f9a3d3D52909", balance: _1e36Str }, -{ privateKey: "0x3c3481A9D16AAC4a1FC9De1c45DCB8fc4B3ee1E2dF731486f0F31c7c23de20fF", balance: _1e36Str }, -{ privateKey: "0xFeCFBed08A8B84B0F7F224CBd9c9B58b7e52395aeAbfFdedD5709B3b3a2619E4", balance: _1e36Str }, -{ privateKey: "0xb592011e9eDe1b7Ca0Ef45A4C2AeBCb365Eb9f0a012Dafa7E7825Aa0fe6e6B5A", balance: _1e36Str }, -{ privateKey: "0x9762dA0CF7399bC503D6DDcbba08fd165ffACEDcD825B64E5D73C970Ac0FAd14", balance: _1e36Str }, -{ privateKey: "0xC5a7D3d0bcAab84D4935CD69Dd30DfcAAA4cE89D17DE3aE83fbd725D1D46F0cf", balance: _1e36Str }, -{ privateKey: "0xD3E7eCE08EaDD3c9eaeB8098A4ed80bEB551C85B1FD6350cDdFEbfBDd71Ffc64", balance: _1e36Str }, -{ privateKey: "0x49bdBfBeD3808A80E0bc608333E24ED90AB63131eEa52aBF31308Cb0789c384d", balance: _1e36Str }, -{ privateKey: "0xEfad8cF9cD30f81B95AB92ffabbEF58cdc8f07cDAA09a1e446acfc22aF1bCD8E", balance: _1e36Str }, -{ privateKey: "0xaF1162EDeDa11eDb8Bd14b4bB084C5cf29B0dE6e5a67ccdC1bF3aab08Cf53d2f", balance: _1e36Str }, -{ privateKey: "0x6ac0FcC65dFc5d52efcEbEBFcDfFbd16A3e805C4aB398Cefc9fFF497D73317fa", balance: _1e36Str }, -{ privateKey: "0x43dbbeF32fcaBfCdE5f01e0E53C478D8BA770AbD199A43f3BE50fD150bFfcE9C", balance: _1e36Str }, -{ privateKey: "0x9A19fbC8BfFdCbe3a36BE081BFdDECd1a29A570F6ca52B98D0A0f1A808ABf583", balance: _1e36Str }, -{ privateKey: "0xD12caCec99Bcc7EEe2f62eCaf69EFfEEa832fb1992A9aC6Af615c3EfBF0e50DF", balance: _1e36Str }, -{ privateKey: "0x49A1DA6BD96Ec139BEED48d7Ba5e7B90eA609DBf0eEe8D72D6b747EB1428A507", balance: _1e36Str }, -{ privateKey: "0x8Abb9B51AeeDd2AEd69aA0Ba679e0d96aF4FD32F1F21F6F5Fd9fEdB1B9382b1E", balance: _1e36Str }, -{ privateKey: "0x2CEBBAf8F2Bd3E8A2bf3eA8AF4bf473aAaf0F6e0Ce7becCeeA93BaEADA7ac3a0", balance: _1e36Str }, -{ privateKey: "0x795EEC06f8aE4D5a55c4Bf6C19caa9D239Df95742732Ce8d9f5B2f6EfEB1F6d1", balance: _1e36Str }, -{ privateKey: "0xefD2986dE8ccDbd9a688fEA655eEEaEACee4be19Fc3DA64A5CbF06BeAFcfFddd", balance: _1e36Str }, -{ privateKey: "0xf95CBDaF9ECd36cf2878B87Ac4a5aF13CCdB33e8EcC98ECD5De1fA3aBc8DB8eF", balance: _1e36Str }, -{ privateKey: "0x3EbfaE1ea115E171df9A3E84BFfA86deC2e39FAcEbDdbaFAaDDED6DC34BB849f", balance: _1e36Str }, -{ privateKey: "0xdAeDf41eBB84ab2850d940FF0A6aeBBcf52a11CC1efb491EA7CE043f0Fb6468e", balance: _1e36Str }, -{ privateKey: "0x2AfE2FCcdA9EEEBF48B92cadbb8Ec190DB0d2D70A4aAe02bC42D02d76F525474", balance: _1e36Str }, -{ privateKey: "0xd5E3baa0d22e848C63026DdE3eF4ef4214A5B8EBDcDeB463aEcEeC8Cd6e1EA6b", balance: _1e36Str }, -{ privateKey: "0x15d5Ae1F55bCaf06Bc92dc88E26b0f3Fd0b62fDf0A966144F9a024EE3744C6Be", balance: _1e36Str }, -{ privateKey: "0x478ff7B3BD12ECCa3b5FadfBC1A88AD63c5cAeC92CcEcc5ADc28CDD258c78a0E", balance: _1e36Str }, -{ privateKey: "0xcB87C8399c122D6EA4a67bDE729bfE8c7Fb3a6EAF56ccFEfbeC51E60736Ae4FE", balance: _1e36Str }, -{ privateKey: "0x83e11dCCA8fC676A1D8Aba5DB1E59CDD5136C59EABF1E91A7AFf9cFd0e4Db1af", balance: _1e36Str }, -{ privateKey: "0xE49eA2Cfb1EF0fab3be76c57EBD21C3b01eE6dfE575d6FdD3acD76fbfEdbCe83", balance: _1e36Str }, -{ privateKey: "0x258f98880CE7fd13cbEAf3BF2f36840Dbb1d6A5ddA9e4C253aFccE1eB45Ff8d1", balance: _1e36Str }, -{ privateKey: "0x47fF1870B6ed45a62bac0FC5cCF8Ad5F7f4eFa6cFdF4b79dc94b91BE8BbaB56c", balance: _1e36Str }, -{ privateKey: "0xFE7496cc29dd0Db3867FF3c19a75bEfc97Ab578Be69F45deE928c3eCeA5f32ff", balance: _1e36Str }, -{ privateKey: "0x05BCa0C18c095cA829986BfAf120bff5C6978dCfCd9B2231cA9ccc4299B54ED5", balance: _1e36Str }, -{ privateKey: "0xeFcB5aA2EfB49368d2Ee95D5Ffb811d15B11C2BbFAEFcdE43bc5816A736F8f70", balance: _1e36Str }, -{ privateKey: "0x32Fd03F3f9870EbFA088fC6A9a14D1d7959Ce42E2c63eCA406C6D2fcA3A5844f", balance: _1e36Str }, -{ privateKey: "0xC5a1713dcDfB199DF2b0D1ECEf7A7E423cC118577d5Acf79B6455436b225E675", balance: _1e36Str }, -{ privateKey: "0xF5423CBDba6C5682Eb6C9d54ba74E7bcaF0fC083a5Dc7CAbAa1ADE1fb35ABC4B", balance: _1e36Str }, -{ privateKey: "0xFC5BEaDAC25fb74Da1BC119307F7F3BD6de38D9964f79Ae2670adD00531A50Bc", balance: _1e36Str }, -{ privateKey: "0x6212Fb393D8ca8eDFcaaeDd7BDeC90eD473eDDCBc7811aB8DB5feeEe05d6A4C4", balance: _1e36Str }, -{ privateKey: "0xFe1EF9ca7f6Ddd0E264AcB5E0aaEaAa7199FCfCdA04a03B40EcAae617aEa35Df", balance: _1e36Str }, -{ privateKey: "0x9A30a36dDDD76bf1ed2A3ab65c0E639c1D0be746AE57f3c3BB566c936240A4f5", balance: _1e36Str }, -{ privateKey: "0x3e4Ca98E9d9DDd2dc1fa1C00fe6A7DB4896dfC38cAFb24AC1Ac9D0f4eacc5DE5", balance: _1e36Str }, -{ privateKey: "0xe472e52e3b8C49ACAA8ADceA94Ddd0EFbf1fB9f34DDe6aFC2D18687a35769AEA", balance: _1e36Str }, -{ privateKey: "0x4F3Ec07DA07531ebC1aEA66c3aB9e3AC93FEFd0dA4aDA24Cf8f5Fa4EA61f0c75", balance: _1e36Str }, -{ privateKey: "0x4cb1BDfEF472aB068b9AeDfF08D4d76DDc163cB844d203EB31800FD8a0a3e1c2", balance: _1e36Str }, -{ privateKey: "0x8EdDe0dB5aCbcC0b16b10d28a537A5f2ae2d2aEc30b377a3e10FdaEF541A2cab", balance: _1e36Str }, -{ privateKey: "0xAe7Ec8A6B02da3123f90Ca1bd5407bdefcd80358003edBDa59f5D4E4C1fab7C1", balance: _1e36Str }, -{ privateKey: "0x65837A9aAF3AABC6ff079EbcB0a4D90C17e2abdbe1e895b6Ec095B3CeCF0aBb2", balance: _1e36Str }, -{ privateKey: "0xaCB3182e9001d05A6D0F9fdf9E886B30Abe5053da7Ee1d1CEAcA45fc1Fcc6a2B", balance: _1e36Str }, -{ privateKey: "0xbD59fac8caEA261b406f0C4E978dCFa8945f5063154F2fFaf785a2b76BDaD7cc", balance: _1e36Str }, -{ privateKey: "0xb5CB81BFCA9524F7aeefE1dB26cF06c75A39eDbbBe77acAbb5a11BCBbAC05bb8", balance: _1e36Str }, -{ privateKey: "0xe9c7218B4c26179e47aB408Cf31DE7265Ad47C9A6157b8cB9E1e6e015C4EfbAC", balance: _1e36Str }, -{ privateKey: "0x3B94B4a82BaF0dCbfedAA5d6Ea1F5c00e3e30F08A3a4FD4405EE31A203F63Cef", balance: _1e36Str }, -{ privateKey: "0x0877570EF12BfCe3e43dE6841156AF603Bc3238085E7AEa27F443aB7793bEa0c", balance: _1e36Str }, -{ privateKey: "0x41a0D98aC57bEa4b4F8d0EF16bd0e5E26AE6BDB4cef6149F332EFFFa6057BD55", balance: _1e36Str }, -{ privateKey: "0x893E406840AcBb079Bd5cbBA973EcecBAC8dfcd9F57B372b908c7a17c441122C", balance: _1e36Str }, -{ privateKey: "0xCb7731B1c0fC8B7d06bF573551b9BaDE1dAb5Cb76A3B7fa8bfDEFA529F40Ec9C", balance: _1e36Str }, -{ privateKey: "0x9C0C42bFd3FD592b962EfffaFaAdC3AEF09556eD44FBAA15224dE3ec15aD9fFb", balance: _1e36Str }, -{ privateKey: "0x986392Dd0e725B8F5bE34921E84Ef8aeB0F7c0791CaFE90AB6d1A0ad7132AC77", balance: _1e36Str }, -{ privateKey: "0xB95534c77C91Ea284eEdDeABD6e7c680d8ac1Ec9fc4CBB1f0b5BFB4aAF49f6EC", balance: _1e36Str }, -{ privateKey: "0xAd5cdA003FDaCafE2D7ADdC28Db2b5EC91b03B408Ca4c45C7aEa7FC997B441Cb", balance: _1e36Str }, -{ privateKey: "0xb07a16C47e76E03cA1E86B8f6aDC7e243493aa0c4dBbe5A4eA8B4DA9BEE3b3Af", balance: _1e36Str }, -{ privateKey: "0xce08FB939816bCc6AB3BdBbC4E6c85AB6BAF5d566C11Eb12e10a4B47F55Cff0C", balance: _1e36Str }, -{ privateKey: "0xbbf6228282958282Dc3Ea6CC9CF13EBA5f7974FF87e9501Bb7d1caDDB2E6FaB7", balance: _1e36Str }, -{ privateKey: "0xBCa581EeDF4b90c92eDcc7676873093A3Ef8b7637b7c8D235Ef6eCEECCbAe36B", balance: _1e36Str }, -{ privateKey: "0xAC4d6169d5e8Bba76A9BDfBB9F7eca5A51e6EfAe73Ac1Cb9Fb8aADd0F5EAFB47", balance: _1e36Str }, -{ privateKey: "0x0Eeb6fbe7f9fEb67869CB9F3f033dACc808FDbF6E3Ffd33d19c19667c0aF624a", balance: _1e36Str }, -{ privateKey: "0x07ce1543A9CcaC3aB71cEe48239aB5B0d21DfD90cBdADb7faF3a5bd9dD95CbB4", balance: _1e36Str }, -{ privateKey: "0x02C285e99FCda44a2D02A5046446df65D7Cf50bf7AA01e248efcBE3F7672Bf3D", balance: _1e36Str }, -{ privateKey: "0x8e831AECB96F17A87C21E9DdbfAed0cF2eb9d45E23aE70721ac9Ed2Ed38AdE62", balance: _1e36Str }, -{ privateKey: "0xdcCDB023Fe26BBcaBbea9980eC04ca1D0A5de539eB6Fd0dCC8cE3ccdc96f3Ea2", balance: _1e36Str }, -{ privateKey: "0xaccB5B6fF0c05FCb2DB1da059b1f44eCE8aaaDa0FB8a42d5F8a1bde8f97A8Cf7", balance: _1e36Str }, -{ privateKey: "0xE5c69bDEDa3dCf2dcf690cAC861D5C136E781cAdF921a6Cd7425f9A2a8FCcDc3", balance: _1e36Str }, -{ privateKey: "0xB00b9f98bE2DaCEC5137e479Be444eFEF6CcDb7788cCe03D0bCB7E1db2dEC5FA", balance: _1e36Str }, -{ privateKey: "0xAAe8DEC8Dd2F95B09aC30ecbCCCe4f9bC14424Ee713Ef2eDA7dADCc8AcBFd8aD", balance: _1e36Str }, -{ privateKey: "0xdaEEDAeADa4cbe12CbD3Fe331aA71EAD1aDA1bF60EB498001A83D9ae40Bbccd1", balance: _1e36Str }, -{ privateKey: "0xD5B92f9062c0941EBdDA48a12a0B78d9De536fCa3EdD06dcD9ADF0dbBc0A7c18", balance: _1e36Str }, -{ privateKey: "0xedfeA04C47f477C3F9Dad3Fe2eB689aDDcDa49CC0fbBCE7c294AECD2D55B2787", balance: _1e36Str }, -{ privateKey: "0xb4adE8deC014C6ca5f2De7D26BAaFDf23F22e12DD181439a481Fdcbe7CB7cED1", balance: _1e36Str }, -{ privateKey: "0x04a3B0ec8Bd5C56dc2eF79fAECcCC7bCf4B099fAd24c3dEd76dca4ADba4C5E7D", balance: _1e36Str }, -{ privateKey: "0x95BBD7e609a2E84D1DaDbEca85eBc2dDf4aD9a5f0F531C0acF73DFf70Cf4Dcaa", balance: _1e36Str }, -{ privateKey: "0x2CCfa05787c5eECf3C0FD38F21B7A705d21FB2b87aE58B0065beE0Aa5d7D7ceC", balance: _1e36Str }, -{ privateKey: "0x8AFeC65cD4fA2EAECf91Ac6942164d82f5D8C0dD4fAe5Ea4f3236C6E8f9fdFFb", balance: _1e36Str }, -{ privateKey: "0xDD72dd73A6Fe4BafcC11baD8D1eeA3f1FE3A5ED28faD1f9aDdD263359E56CdFA", balance: _1e36Str }, -{ privateKey: "0xcF4Ff1793f17A37FCEB5e2A3C01CE1880aAb76d10ED0CBefcFe8C013bba17f0A", balance: _1e36Str }, -{ privateKey: "0xB15F1B0880Cb1D1d0F03dB319CcA5Efa464A75CDF1cD0858de5BA9d5Ae528E65", balance: _1e36Str }, -{ privateKey: "0xdCD5Ff3C4bFBF02a8781eCeaFfabAfbF7d33d53FEa6c94B0A2A058E00E28f1CC", balance: _1e36Str }, -{ privateKey: "0x9aeB8f7D488E4d1DE1c9AdC1BaceCbBd5853aa5fEcBaCfDdb7AbD7b4FaE8e0D8", balance: _1e36Str }, -{ privateKey: "0xB1b1522Ee790AC7dCEEbF06020d07dC9233CBBEbCb5B2cf55Fc4D6cdA15eAFb9", balance: _1e36Str }, -{ privateKey: "0xcadaA8420fefC1cd9409CdcF3F07a1147bc49E1baCc4A114ce7EBdf62dc2b22D", balance: _1e36Str }, -{ privateKey: "0x9D5d734fC5dbea297e952bB52B3dd09a2B9bCec5De7dDEeffF57B18dD14EF9C2", balance: _1e36Str }, -{ privateKey: "0xcc0ABa7Ecc3a3557F80fD71Ad0aba8bd8147ED3a6dF0d8EfA74b818fdb5A1dF3", balance: _1e36Str }, -{ privateKey: "0xF56eeC80cd7aAD2F58FdaEb3ADdcfec9295bCA17cd6d31E162f1A3bfcf0fD8af", balance: _1e36Str }, -{ privateKey: "0xF0abc72a065D7aA67eceF7f6be74B38BFDaEd6dCa2a9F8FCac5Ec4567E0fe8E9", balance: _1e36Str }, -{ privateKey: "0xbaECfa197dfC3Ed3F507BAc6e9B60F2b045bbf94aF61b6C8c0e937F8B20c48b3", balance: _1e36Str }, -{ privateKey: "0xcd3F20e8d55BadB3a38C0dBBA812E87FF18981741B978FA36bB0acd1D36ACdf7", balance: _1e36Str }, -{ privateKey: "0xbfbAAa795EE4DD7cf93095D93AfeA278BcA8FA71196324eae5bC6Dc1B7eca2D7", balance: _1e36Str }, -{ privateKey: "0xDe0bAA1befbcBBB6a7575CCCed1C1dda51021A7e2ad9Cf4a8430eBb8F4A9e2f5", balance: _1e36Str }, -{ privateKey: "0xaDfd1e2bD9Cd1c8a7ff77a251d4BEe9Dd895FcC44dA8Cf5fEC38ad589dDA318F", balance: _1e36Str }, -{ privateKey: "0x4a8C6FAf6d67BDbb8cfE7dc5Faa0B1c55E7beB74ac1dd785AcB2b9e8Ae4C5F4d", balance: _1e36Str }, -{ privateKey: "0x02FF2d674e85Fcdc31eC5CECc6aD50dF954BF80c1b0B9bbC7B5a5FabAD5c837A", balance: _1e36Str }, -{ privateKey: "0x6E8c73bfF20abea2abDaEA799CeB862Cd9eb594b50f7FFc905eDdeceAAB916bA", balance: _1e36Str }, -{ privateKey: "0xa6Da0E05705Dfc0d1EBF8bDf2149d89FfE2fec452dBae23DF1a5CE2Cb5ffBcC2", balance: _1e36Str }, -{ privateKey: "0xf70dDfA9F3FF9Ba1b1BfAa5bEef5CBDDFD05faCFe4EDaD64AFADDeeC0d2Cb13E", balance: _1e36Str }, -{ privateKey: "0xCDCDAeD1Fefb7cbdb1dFbA7375258ae6Ade1cB66AeE7Aab49CAaCbae8eBC1caa", balance: _1e36Str }, -{ privateKey: "0x6d3Ba7d4495dC23852C14941fe2eD15EDebb7B013eE29aF3dAeAf8C10854d67c", balance: _1e36Str }, -{ privateKey: "0x5eD030C7F63b247cC3E7AEeadFB2cd93A434fB4Febb8faCaFAC17d73c6d80Bba", balance: _1e36Str }, -{ privateKey: "0xBE03c9dEC5Dd1D7DcDCdCe02DCc79F4fE2b6BAbea89AE2729bCbEdbE648eC3BE", balance: _1e36Str }, -{ privateKey: "0xdE54EAD54a435e2AEf033343e6D71424E5F1df7c571EA25DfC8E19bdbC363E8B", balance: _1e36Str }, -{ privateKey: "0x9deFf90bdd96f62FCDCF7bef37AF6fB6a7CF8FDa83e2096dDEF49fA9aD2DaF0F", balance: _1e36Str }, -{ privateKey: "0xEfEFfcbd049C5fecE4fdd34DaDdfbbbcFBc1ce0AbeB75a1Bee0a3aa4B5F375B2", balance: _1e36Str }, -{ privateKey: "0xeB2C63C51E32eF0CCEe5d8De127F8BcFfFCC74c7b28b1338e7E3C633dd9E75D4", balance: _1e36Str }, -{ privateKey: "0xeb36CbD33eCdFFE59c88ECED1b05cae5e4a9E2a57bcBC0EEA613C9c1baFA3B57", balance: _1e36Str }, -{ privateKey: "0xb437861fa0135F7498ffEE196d4a17dB7578f123C9349B6F23e7aAce7ADE2B77", balance: _1e36Str }, -{ privateKey: "0x539eAbDBe82Bc3B760C26bEff3EDBFc8e3Ad5c7ee7A0E25d4873DDAbDBcE57CE", balance: _1e36Str }, -{ privateKey: "0x0D5DbCe654fbaBD22A33F6d9D4EEAB7D38AD3a393c5d4466b85FC44bcaad9aFf", balance: _1e36Str }, -{ privateKey: "0x5efAD6CA153953AC6B7A9bD70Bfd64807cada5AF28B1a3ef3c4ae0fb857Cd2A8", balance: _1e36Str }, -{ privateKey: "0x57E34a08A8D8c15e78A0fAA49ee2b64b8EF2cF214d7E4d29cFd1B0AffE15EAB7", balance: _1e36Str }, -{ privateKey: "0xF96A3aBff0D46072F5FF5d7bcE87CB6c5baF6FA918bDFe2c62E0Db63C32E2Fb3", balance: _1e36Str }, -{ privateKey: "0xDc23ca3aD420eC99fb86BFcDbfcCdEDa1Ef5dFaBb3cd916575DA3faD2E9fC941", balance: _1e36Str }, -{ privateKey: "0xfFB7fcac543143FAaDF51459F6CFFC004DFE2eaDAcBBd3BceE9b0D96Bfb3599a", balance: _1e36Str }, -{ privateKey: "0xdEBAD6ee9C62e5b3ACc1804cE1B0c476c9DBFA8fBB5ADAab0BCA53cfD7b3DAf5", balance: _1e36Str }, -{ privateKey: "0xdAdC3E0cf4e1D0c4C7fFf2DFDC1F2EFEFADE72FDd1cBB5bB8DDE910C3Addde7a", balance: _1e36Str }, -{ privateKey: "0x2a1ced6C6eef98E64cA4a6Fb9CBcAB6CD8aCfc3Ff4bAceF7D13cC49bFb0B5291", balance: _1e36Str }, -{ privateKey: "0x11A92Ae865ebb683DedEF8a3F1Dc36E6cCa7ab65c01C14Aa90bAEfb0e44CbCE4", balance: _1e36Str }, -{ privateKey: "0xe93cEac824115De4aa7F296De256B9f59D6387E816cf13AFBEa4fFD3F7DdD4DD", balance: _1e36Str }, -{ privateKey: "0x00c420fABc31AFaffF56AE2D7f61f4c084b4dd82b0b4Ce6C738Fe55AEF2c7cD0", balance: _1e36Str }, -{ privateKey: "0x2eDfD942fd8EabCD4Cb1AD2Af7da6F9A6d0Dc9ECE75e96045e0C80Cca2Afd93C", balance: _1e36Str }, -{ privateKey: "0xad6D8e38f5D7b3672E5ec44d58b2cEfEF892Cf9acfCdbC4Ca5a302aEC9B027E2", balance: _1e36Str }, -{ privateKey: "0x96FEa8BA8c087eebd9EeAdDfaDFd7fA8b9FDe16CafBeE2bf1AcD8b0FfD4aEA0B", balance: _1e36Str }, -{ privateKey: "0xB28c67Bde7B82fb2c2fcB2e7FBbdCa2cDef4F76cf7A3Ac68FDecFCcC40350eaA", balance: _1e36Str }, -{ privateKey: "0x343Fc9C1A8aD6D8b555Ab2bf64B53ccae49e32A6b3c2ef18ed1123C206763e65", balance: _1e36Str }, -{ privateKey: "0xE4DB4E5CDd91a7c867fCa7a6bB8BFc556D50182855a26dEae386AcE1D198eC54", balance: _1e36Str }, -{ privateKey: "0x8F6bB7Bf8d1c4969Ce5cC5Cd9cdeCef276E0dEbCb05FaD2aacD433Dc0BA82faA", balance: _1e36Str }, -{ privateKey: "0xCdEbcB927AA80A7D15FebbE4BE72F4bDEc03Bb99aDfDb01217F4d1bB74EAF1a3", balance: _1e36Str }, -{ privateKey: "0xebfdBee6a8448Ebf99C9DAdb631f1C3ba1AdeE0B225011ae7f1A1FBbc8BfA716", balance: _1e36Str }, -{ privateKey: "0xFEeBC77DDB2b2babB5bf43F5CFECedaBbe8d0ffE63C7346FbF7bd17dbDF1aaC1", balance: _1e36Str }, -{ privateKey: "0x71bca70Fedfe8eDBC2b96Cdc94FBC2FaFFF5Ba576C9B99205e6458b1Ca41F862", balance: _1e36Str }, -{ privateKey: "0xA3ac00EB9ce8854C5FDDf4C8Dc7E28eEfad1e6dEFBe3a6eFA48dc16EE5dD5fb5", balance: _1e36Str }, -{ privateKey: "0xdF4dd17A0495c7bFEadcd9EbA921D8EE9c77e00fbea58d4Bd743D654aAbd8f11", balance: _1e36Str }, -{ privateKey: "0xDdEb8Afd1D22C3C8ef1d23004Ab61DFeF02ca9A1EEa3EBbc7625F80EF1ab800e", balance: _1e36Str }, -{ privateKey: "0xBd88E1185e4e686c784d0964E7df0dcd2cE4CfDcE7c3b851C69bCCdcC64e3FEd", balance: _1e36Str }, -{ privateKey: "0x64bC5Ec226b999f43e18E3BBe2d629A2E57ABf01Fe50Bfd7e21046CFFAeCba7B", balance: _1e36Str }, -{ privateKey: "0xb80167d4E6E38e14FCbE823b5cFfC57ef6Ab22ECa4Af5DA1fecea4EA39c7569e", balance: _1e36Str }, -{ privateKey: "0xaD0Ca081Cf3A78dC3dBbDEf04341aFdE11AbfEdAe8Caa5D2adFde545F0B9ec68", balance: _1e36Str }, -{ privateKey: "0x78aadbFBE6C525Ac0B99F4aa8F06D6bd2f6f0aE93F57eee5b8Af09eae79862fa", balance: _1e36Str }, -{ privateKey: "0x05AEdbaC579afa7C0BDEEBd34bD65eB3640A8BCBDDC97Bd706d2aD42F803cdF9", balance: _1e36Str }, -{ privateKey: "0x88cF1e9c4c619d195b150d86Cdb8752fe4DDC6F8732fAEAA3f4CaE0Bb11c26Ed", balance: _1e36Str }, -{ privateKey: "0x113ADA271d7BcE3D2AaF5A8B4CDc5AA4e0be4B5Ca5Bfd5cf40ebaff12ffe2e0a", balance: _1e36Str }, -{ privateKey: "0x335f1B38C6bb4AC7C4cD0C64C4dcA1808f42AF1aBbf7b86383bfe7C4609DA27f", balance: _1e36Str }, -{ privateKey: "0xD4238FffcccA74e77Bd0Cbf3B9C718db7eEFbE4ce56B6698F9e6b74Da2701AaB", balance: _1e36Str }, -{ privateKey: "0x240f0F7a8Ccf2E1aa4dFA7eFe5eeEEC636bB5d93DCc0278EdDF3f736Ebf8EE13", balance: _1e36Str }, -{ privateKey: "0xc3922E04120951CEE7aA3DFcEF4bad5064AA339ADD8fbC0e0Ff6812Ec10Be177", balance: _1e36Str }, -{ privateKey: "0xC3be7ff5A102F9810D9C56FcdceF5a4a852bAFe2A102462dCa91A0e9554e2E6c", balance: _1e36Str }, -{ privateKey: "0xEcCD90CedFa47a78B40b0D1BcE7eDDEcDAeb0C8b77bB7d6A575d2E5aE5afFEa6", balance: _1e36Str }, -{ privateKey: "0xFb3FaE50f3018B8FFa336fd4D6ab4D5BaEc88Af478f172F05fd3f42B2B8Dc663", balance: _1e36Str }, -{ privateKey: "0x4E7BCbDdABBE87d7DFA4FE6Adf7aafC5F4c1B1deD1Cae0C09eA76cEE280F8859", balance: _1e36Str }, -{ privateKey: "0xB91cE6FD3aC86aaed37810cCBff6e268fD9abAADC03ac75aC8eBD9CF3BEBfFb8", balance: _1e36Str }, -{ privateKey: "0x0bBb2F39F6809Db4abdb90FFA2A8D4DcB3cbadd4368D6f50aC0cBa4dc345cBf0", balance: _1e36Str }, -{ privateKey: "0x1A67B8E0961a9E93a8df461Dafe5EE29AF54ecb3c86442fF25642EF6B2CfC27d", balance: _1e36Str }, -{ privateKey: "0x4a4e011fCD1bfDaA5f4fF3f4c97A21fB2916E0AB76AaBbe78e3f08c31A6EcE25", balance: _1e36Str }, -{ privateKey: "0x300aeD3121CCE58ef47aFd9aD0C83Cbd0cDe99D3cDa6dcAa76ee5fADbba25Cb2", balance: _1e36Str }, -{ privateKey: "0x290F9763C01bBeCbe14F7c96F31e8D0aaD0ee9CeF04Ea3Cc8463eAf6A7c2afF6", balance: _1e36Str }, -{ privateKey: "0x4c2E96D6b4C97a1d9AB3Bc0CaedB1fb025B1Bb86cAef39221DDEFD7CbddD37Ac", balance: _1e36Str }, -{ privateKey: "0x61ccEc2cD7c8F8E4eA1aa98Fe620C623A0175e7da8CA627cF49fCd0f9Cb8fEcE", balance: _1e36Str }, -{ privateKey: "0x0940CbE7feFd431DfFC1A03cDFDc331efDF06DFeDD62A65C1E313eaD39f9e9A0", balance: _1e36Str }, -{ privateKey: "0x2b85eCE8bEDaB2db9a60916eeaB4a0Eb746ee904d01f86cCfAE4FF46e7CBc0CF", balance: _1e36Str }, -{ privateKey: "0xaEe4Ad6Cb3aF6ad600ebf0a4dafED8F7d42E708bA72A3cAAAD144cBeB23bEE41", balance: _1e36Str }, -{ privateKey: "0xe3aCDdbD9E8679F021EfaEc4F9BB83BA7c59fd8cFDf98b5AEbF1cA5DCA7E979a", balance: _1e36Str }, -{ privateKey: "0xedbb75AB5D1346A57C89cbD6eFF2dCA0CBd8E543FA3EaaDB403b2b53ac5bAB86", balance: _1e36Str }, -{ privateKey: "0xCf4b1BaACdae3F64774BA0aa1A1be28FFFe80B5cF1deE8BC0B4264FbaB71B57e", balance: _1e36Str }, -{ privateKey: "0xB01C5fefA5c19aE1B80322B0eD0B9719dB6dbc4E1aC1BdE42CAD0AaD5BEfd236", balance: _1e36Str }, -{ privateKey: "0xbbFa04eD7c73D4a1b4b42Ac3D9AB4e6cC28266b7943821Dfdde394D91a80Def2", balance: _1e36Str }, -{ privateKey: "0xeD031535D10eACb029D5Bf62BACEb52Ca1AB5db3d5bf1142d6Bfa3CeaceB0fDa", balance: _1e36Str }, -{ privateKey: "0xf9eD6f4b6265bFA2aF1b2A557CeA4Ae3e2ABFE92AfE4923Ecc69AaC908d4A1D7", balance: _1e36Str }, -{ privateKey: "0xA0f39D649F8dB00a83cEa6c66bD5FaDEe8e50FD9CaBbEb9BaD62625589Cc1A0A", balance: _1e36Str }, -{ privateKey: "0x5CBcF2be1C86814F3E386c62DA45C0F6B2d130c4F892Af85D68A3Eb09FCD6DD5", balance: _1e36Str }, -{ privateKey: "0xcfE1Ac3366A697eebE154D107FC76cCeE96B1BD09A0F2DaFf6b3afABD9acEd3E", balance: _1e36Str }, -{ privateKey: "0xbae045FAEFa834bD8e4EdAECD9bc4961dff4a79241AFE74c9e821CFD0cCd01ae", balance: _1e36Str }, -{ privateKey: "0xb93d6E2F60155bB9E03a3AcFCABa57FA9AF23D721E3c5E6fef67Aaa116Bdb3E5", balance: _1e36Str }, -{ privateKey: "0x5eeba0f13A9F9bb2de5E50C5edd3ec098793F4de8fEb3D41c5d2D8f9eC25e768", balance: _1e36Str }, -{ privateKey: "0xE2feA8fdD8818249b90b72df047696FbDAA4BC905CDb1fC3d144DE934782Eb0e", balance: _1e36Str }, -{ privateKey: "0x8B2CEEbdfBa5ef62276CC3C263A44cd6bb05B62c75cFf9464AbE41Ef18b0BFcc", balance: _1e36Str }, -{ privateKey: "0xD83EcEe10Cf4fb238C99FAEA6eEbc29E393C2d4F8d0F5D7C4a35eD151b8Cf9f5", balance: _1e36Str }, -{ privateKey: "0xdC96CEedbc4ac50449E7Dc8B83179CcEa1fF430aA7fd1601d5618D245758F5Bf", balance: _1e36Str }, -{ privateKey: "0xefdceb50eee1c83c69609E6Ad24be85498fcdA9dCB5ceb1c3Fe8332C6c7fAa8b", balance: _1e36Str }, -{ privateKey: "0x82E42eFEbcb4681E1A33d0Add0F24c369ecd29172fF1AE07325ceaD426dFCD43", balance: _1e36Str }, -{ privateKey: "0xCEc57Fba2FEff13b6205ACD6dE9C3EFBda4b2Cc92BfedfbDeE305Ac02973Ec1F", balance: _1e36Str }, -{ privateKey: "0x85AAed669aAea256Bd0b0BF1B5132B847dbCf6D65Eb4Ff9817ae1Dcd5F3DCB0A", balance: _1e36Str }, -{ privateKey: "0xDC3BCa1dC2bA0DfDC62df181AfDFCb4955d0c6B4eDA0cAAd9B5c8D9717EFc4C7", balance: _1e36Str }, -{ privateKey: "0xf24d3fC62c631Ec8Da12E23fb1Cb4cA5Ee0eE0ab5c018B062CA7fd969D5d3C29", balance: _1e36Str }, -{ privateKey: "0x0Fa1A21FB93e182CE3E0C1694Fffa1d4fEbf9eB64e6BDcd9Ec61468dfBfBf11F", balance: _1e36Str }, -{ privateKey: "0x75eb6FCaedaA965E142fc58dA7Ba2AeEB70eAB743B68362b889cFEBf8A5Bb402", balance: _1e36Str }, -{ privateKey: "0x58f35CFA953EAd63D7A91f9DC02A9E7B705DD9F7f68E871C77D9ae51aE8E947F", balance: _1e36Str }, -{ privateKey: "0x9Bbb5f01AC9dcD8eebA2Cbbe66D5CC0Cc2440793349d0ABfB29FD045cb3a81B0", balance: _1e36Str }, -{ privateKey: "0x65d25e05CE3b59ed30A32bC6c5d3D3582F4afF9Ed8531BB0497CBe03BbcCed04", balance: _1e36Str }, -{ privateKey: "0xA60fF413dDee59CAc3668CDdF43BA139EbF3ce25D339A708Fd1AbfFFD84b5Fa9", balance: _1e36Str }, -{ privateKey: "0x3Dcb34aDFAfb7264C6eFf0CbD6c7f3dAF9697dE5359e14dB3381ba0B5e16fAFF", balance: _1e36Str }, -{ privateKey: "0xc82C8EC3085abC46B9bb11378169CB601BdFaBD268Ae6Da9a004e8267CefAdA7", balance: _1e36Str }, -{ privateKey: "0x9ded4DC3cae050f2F77Ec0aDEdf42CA3DFce2BCBdb90EaE7D3841a21cB2AebEb", balance: _1e36Str }, -{ privateKey: "0xf9fBfb91Fe3F9B3aeEEdFE67fc6E0cBCCa2Bfd55D673B2925BDfE515AdCc552a", balance: _1e36Str }, -{ privateKey: "0x15d4963dCca3c5Ac7dc40b7a93e374232c6fFF4c8DD0938cc18F037F1CCb9aF2", balance: _1e36Str }, -{ privateKey: "0x316F2fd6269aFC40db5eB9Bf73dEaf6DbA2bfF6B57c0c5c337F16676aB4D16Ed", balance: _1e36Str }, -{ privateKey: "0x7BDef99122d2e331a1d62b3B513f7B99C12496d5d91Feab470fBbbe84aCC8b8b", balance: _1e36Str }, -{ privateKey: "0xc4C0F7D1bf6faFE6751e9A925Dbb285474D8741fa7023Da0e7dCBafc3EB2Fb04", balance: _1e36Str }, -{ privateKey: "0xfaBFee6994F798Eb3De97e4e30A7bD74DA2eef3f4013d2e46b3EcBa1Eb5Ad7dE", balance: _1e36Str }, -{ privateKey: "0xad9c9E2a4AD87BE8b238ACC11C9baA07B77f10E4bA2d7b1d107BB8F7e54CbCc9", balance: _1e36Str }, -{ privateKey: "0x6c177Ee68e8f8EAF8aCfDBAc9C8D1aCF5BAe0572e2Be7F6D1C47e69D09643B8A", balance: _1e36Str }, -{ privateKey: "0x13DD4Bb05deCfE86FcA027bee09b6f7a8D0366eBe09E4eF4d282b9b3377FbF6E", balance: _1e36Str }, -{ privateKey: "0x9d7e0Ec0bEC01Cf8aa2d1EC42a77891B41afEb4C71B9e98305cEF3EEdecCCbe6", balance: _1e36Str }, -{ privateKey: "0xeD30F0421Cc601EBe56869dEa0fDd9fEaCf14f8Dcf3F2CdC8C30F975c02cfF0f", balance: _1e36Str }, -{ privateKey: "0xfc523AEcc24EcB3B2Df032Ffdb310eC772Bb7adeDc03dc40fAFCBA2Aa7E3Ed39", balance: _1e36Str }, -{ privateKey: "0xc5Fa20bd3588FFd6B07211413BCecAd4A10a68b9e0ae0b47E309b8f2ACdbFd55", balance: _1e36Str }, -{ privateKey: "0x5f52aa6F0dEFE4a45F1d77BA643F58ac0755F429cd4eF5a2c4e23a836a4fA637", balance: _1e36Str }, -{ privateKey: "0x51fbb84aE10c8d3df2EbeCcA7187afeaec96C5aB4f7ad0E75EfC3f1C35a282e2", balance: _1e36Str }, -{ privateKey: "0xd8eebDe91D1bdd8e7D1740c20aE76378B87f3eBF50F6aF5b2cEBdaEBAF1A0dce", balance: _1e36Str }, -{ privateKey: "0xEDffFf17eBFeFFAB8567CAac5cebC5a7ebaf7E3fE2adfAacAF14CA08aAa40cd4", balance: _1e36Str }, -{ privateKey: "0xCFCC3E3D3DF0740Ea3BC11befD41Cba5AeCE8d28E544D5a6b3f85eb1ee5BcD66", balance: _1e36Str }, -{ privateKey: "0xEccEeaDcccd9A37480e41805f0a638A670FEDF66cD13fdBC9b5d7be8A95d198e", balance: _1e36Str }, -{ privateKey: "0x5713eaf9D14dc06ceBbfebD2B336Efc70B378A2aB4F9ec4e629A95Fae5dDf333", balance: _1e36Str }, -{ privateKey: "0x0e69dD311a1bb5E0A79bC94Ae2eABad7aa4F00F16CBAc8525d8a0e4EeCFD5821", balance: _1e36Str }, -{ privateKey: "0x7EA1dDbB6C24B2260371cEb4AA6ba3E785BE26983Dde0DdDAB96C1F9449e52F8", balance: _1e36Str }, -{ privateKey: "0xf526cB921D860c25aC3362ACEBcDa9D49acbb8F96938DEC65Fb5a8fdeBfeeb4f", balance: _1e36Str }, -{ privateKey: "0xFeefb2febC5813B14C21FDfE0a6AFf14bD75eD304eAbc0cb8ceAE71e94daAFcD", balance: _1e36Str }, -{ privateKey: "0x67Fd85B2dbf1E7bea8Ad223aEABE1Be9bFA5F683E20FfC55A8D6Cdf6fBc0c32D", balance: _1e36Str }, -{ privateKey: "0xfA46E5e445d98d1811fb274B9Df94e6Da9FB42384cFd99a9e5ec2bfA8eF3B66A", balance: _1e36Str }, -{ privateKey: "0xA53fBD12EfF27CF3066e7c7259045766F0ABF6cEAa51DfFdC0A7aB7644676b6A", balance: _1e36Str }, -{ privateKey: "0x6aFBe0E88470e60C599EDD5b1bF91d9ce8058ce14f6DA66e97F468eeF2e60C75", balance: _1e36Str }, -{ privateKey: "0xc551D35ab17a5Dabbe397DabC226b26ba6B7AB92E7D23c6928Ffb28d9Ca78ddB", balance: _1e36Str }, -{ privateKey: "0xEAa44aaDeb75ecD6c9b9EE565eFe204B76bBfAcb4BB192b0F21e1C6Fee69529D", balance: _1e36Str }, -{ privateKey: "0x5bD5fFF9eccAC7737CAF13AAE53860AD03cB47Dc7DCFD4db9fa82863AFfb98D3", balance: _1e36Str }, -{ privateKey: "0x22cDd3dbf85Dae5De249F0D4e2fe2CdD6dc03fb56a89Ec28bBE4dCd6D3c51B0f", balance: _1e36Str }, -{ privateKey: "0x12B55f6b5E3D84BC1F361E3f1DfdF0c126ba28B351054c8AfbF48430bEF94fbD", balance: _1e36Str }, -{ privateKey: "0xf7FF4bE3509F5aBeA0d764Db343dFDd32ABdFEEDCC471c9D81CE6a62FEe1dfc9", balance: _1e36Str }, -{ privateKey: "0xa3E1701fb68ecCEcB6BC3C721b6fF1dDc756180BbAB4FbF13beD088ebe6ceb9D", balance: _1e36Str }, -{ privateKey: "0x9DacDF8AB4d763bEfFcD7AC0c69bC967B1fc4C2Ecf189829E5911bCbACF95EaD", balance: _1e36Str }, -{ privateKey: "0xfD9aE7da5B1c0Ec85c99fb5c84FA0419F96aD0A04BCd900deA1C67B647081d43", balance: _1e36Str }, -{ privateKey: "0x4FE4BBd6225648e51Ab08A942CDe57AdaB25148A408beb7F64FaCAebd3BE9afd", balance: _1e36Str }, -{ privateKey: "0xdd280EF9deAD4D1FcDe31eFCB4A19D68e578e3DDF53Fe9Fa0E059ffb8a4D885C", balance: _1e36Str }, -{ privateKey: "0xf55b09BFCceF7Ad43DfCc3db77B771bf41A2bDbfaD1EBf7d7dF08B3Ec13ED606", balance: _1e36Str }, -{ privateKey: "0x7Aa1CE00F979a53B99C4a4DfcB3e5424A498A68bEF2fEdBBe77bFD1DFE8ad8e2", balance: _1e36Str }, -{ privateKey: "0x360CFfEAE6b95bAbA2D94058a7CB8e05bC21b4aBb4Dd2Ac0a900cf0bF60C8Aec", balance: _1e36Str }, -{ privateKey: "0xa300C85AcCDa0EbEF0E3e3c3f8b4d47D8ab990c7dbF3bFAB9eBCbFd0098fB79b", balance: _1e36Str }, -{ privateKey: "0xB3dEc4e5DB65a3284BaCAfBDE1b9CedD341A6B1C5DBBbfEe82Ca1ac6dBdAa58b", balance: _1e36Str }, -{ privateKey: "0x71bE0A33eBB0C6F6ff7683bfA817DCb33ECEbf9e9dc27fDE80DcF424AF762a35", balance: _1e36Str }, -{ privateKey: "0x5E453Ac8Aa2E1F68F7B40Db0c99D3Efd1FC8a8f64cD4e92f70C5be3FE71FAFCb", balance: _1e36Str }, -{ privateKey: "0x4cBfCcd198a24fD67f49323CAd01Fa8eb26025854f9c685eEFa38cE34573F01D", balance: _1e36Str }, -{ privateKey: "0x3bBcaC3435A5c4b8cDF220771adADcd4E9001248CffAd38baD48aF7970d5cBc8", balance: _1e36Str }, -{ privateKey: "0x5304D476AfB229abc5B262dBcb0fe2FDA4BdadF4FBfb1d1C5CB914BBD0420C86", balance: _1e36Str }, -{ privateKey: "0x381A1c8EEBaFAa47e9919ED41f6fA1f080e52913C69747f8D14eeD3aAB72b6aB", balance: _1e36Str }, -{ privateKey: "0xa8c78E8CeD4b5B72b4863C0ba77ff5C923C5Cabd75a6A1CE492F25FfB1a0ba2b", balance: _1e36Str }, -{ privateKey: "0x847998Ddc85aFACF68EE3bbEDB72D0FaFe62F00Ffc594b2CC2BE7A35D4149bD2", balance: _1e36Str }, -{ privateKey: "0x5B4a2dc7b4f9A4CDAcA01f5bCA5Cba988fC24fD161bD7efBbBCc7edef5EFFeD3", balance: _1e36Str }, -{ privateKey: "0xBF30C0C35BEFf44f882a05D5B2AB1187A5dff7b87Ac3B153D60C91Ea2b4Cca6A", balance: _1e36Str }, -{ privateKey: "0x4F3BAFEa2d1D1C7dbbdad6fFcabF653A5DaAEDD96BAca4bDB4d00c3b0eC7F4fe", balance: _1e36Str }, -{ privateKey: "0xCF6c0AC1fFDc45e8DBcFfB62FcF34C6CbB1c9c76efBa79669a0A5BB6b8daCBcD", balance: _1e36Str }, -{ privateKey: "0xe5192d3E40Eef9e32CaE43d368fa9f7A904Ff4a9d85C0d21CeA985C0dAacE8B0", balance: _1e36Str }, -{ privateKey: "0x4dEAba8FD79DEAf99bedF55e7DFDBcC4FdfecfbfE2DdFde3ffB358BF66ddf1b2", balance: _1e36Str }, -{ privateKey: "0x5D6Ee9B7c214027f306E154664D686CBbf3Ab5f78fbe4D120E90Ae2aC374Fbfb", balance: _1e36Str }, -{ privateKey: "0xfc1Ff408CbADDF4CcAb7DDD228EB0C8081a0fE4b5dE4482F5ad213d46BFDbf58", balance: _1e36Str }, -{ privateKey: "0x0fbf947Af0BEA2Bde98AfcFE64FABdefA7722AdAf1697AcF809AEe0c10d499DB", balance: _1e36Str }, -{ privateKey: "0xCD7aa5Ed190893DDe987c78c3Aa78585D42d0ee218652075c46E843D4acEb67E", balance: _1e36Str }, -{ privateKey: "0xD851A24Ed21bAAB91BEfc23Da36238c4dE111c04D6cF8c0b936F9815Dc961Eee", balance: _1e36Str }, -{ privateKey: "0xB22aee9dCAA25AeC10D7f7e492A4FeFa57EB8d4b720dEBaFfeBE6ffF451F913C", balance: _1e36Str }, -{ privateKey: "0x07f2aF34fE75eF8a0ac3Aa50be66B9ACbeB8AcEe3C5ddb82bbeab5D4f0aa31D6", balance: _1e36Str }, -{ privateKey: "0x9e2C27dBbcba1E8D013ddEA0E763d07cFba9DCc6dAA9EBBBC1bf4A4Fecf530a5", balance: _1e36Str }, -{ privateKey: "0x8F49172dA65Af38FEAb82E368325d5A2f9ceaA9a307640454fCB5Cd713BC3d8E", balance: _1e36Str }, -{ privateKey: "0x9de75dce14Ffd2e287Ad8aEbfe2c61Ae8c7E05C7eA527B730050eA225e8aEDAE", balance: _1e36Str }, -{ privateKey: "0xBAdC1641AEEeaF5830413D5F6A9e0eEBE77Ad07CF277707cACc4Cf27C1a8DBf0", balance: _1e36Str }, -{ privateKey: "0xdA0A11FACffd9e84b6e6A1749BDF44A9a345AB56746eBb96f949F66b5CAE5dcd", balance: _1e36Str }, -{ privateKey: "0x71C0DD9eFBDD0eCc1ebE9c9eDe0EcAaD9eECaeBDd9C29C76CE5FC4e9BEECDF4D", balance: _1e36Str }, -{ privateKey: "0x5aec16f84f0BC4b2a6D3D17475fB1B4a34A8255CaEF9dAA7cc30dca243429fC3", balance: _1e36Str }, -{ privateKey: "0xF486DB8f6B37bd28deDD326a5d210DAA1B535dcCEdEb17eeB1dd8472ba7f72FD", balance: _1e36Str }, -{ privateKey: "0xEDFB25ee763bD1FeCCaE7e29F7fEF5DBbafF9079FA7eaCba37fc9Ef518dBdC09", balance: _1e36Str }, -{ privateKey: "0xC0d7c8B35fD6fB4d628DbAfDf1bD7Aa4DCF72d2D4C9D9882dD0BcDA65E15D1de", balance: _1e36Str }, -{ privateKey: "0x7e61Dd4dB13E3E5b85DD06d6A9fb9d9eD5FDd41e1E92114eBACA0BeE4CEdfC3D", balance: _1e36Str }, -{ privateKey: "0xE15BC7A4d4CD07C2aC7Bc01b450Bf43dB99de1ef7Ad8ADA100BDC3aA844c8c54", balance: _1e36Str }, -{ privateKey: "0xa50f9d8f87bd4B6A71070FbEBf6660794CC803cBE6CebA8ffA8aBFd3A4779909", balance: _1e36Str }, -{ privateKey: "0xaDb034a6Af4CDCAcDF38431eE9b58AE34F680e5BfA6aA6a4ffDBC0bC6fFFF50D", balance: _1e36Str }, -{ privateKey: "0xdFc6Ed8a53faAE4FedF5723CA2E18eF93AE72Bb76B702dD63E7499bE172E348C", balance: _1e36Str }, -{ privateKey: "0xAC616489cb5E71bf3Ad40FC5CfbEbE9eDAB6C507fcDBe1755890C4310be8dfD9", balance: _1e36Str }, -{ privateKey: "0xCEACF0CFdCCC8FffA2cE2B4a046EE0ce0FF9789aeE959d414afE7321d75c2b3f", balance: _1e36Str }, -{ privateKey: "0x95ccD9BaEadfd1C8fbFC2CCbeB4e28DafcA26b1573fbBC585FA8f1c9faC02B76", balance: _1e36Str }, -{ privateKey: "0xb783CbC5fFdEb3ccbA0bE173652f959E5c6f4569e60E6d67161a8f38C5dF79d0", balance: _1e36Str }, -{ privateKey: "0x9c1F38DE9dCc0f34e60CeA9Cb4D992f176Cf0bDB18dE003df25D0aBbf38887D0", balance: _1e36Str }, -{ privateKey: "0x4AaB2dbE112CEc2Eed109DCe3d6EdCb3Da47Bf9C6E2880e09Cb9430baD5beB0c", balance: _1e36Str }, -{ privateKey: "0xec2FdEe3DFE78E6d9aa8FCBEAF3DBf82cc4C7BaBb1Dfda7b5208FEea6b8F038e", balance: _1e36Str }, -{ privateKey: "0x362fFEC3eEBfFAA78c81523e12c1eaCbF2F2E56B9Bff574f3440f44bb86BF23c", balance: _1e36Str }, -{ privateKey: "0x1c7EEBD1A7B3DBde93dD6E1292a70BB7532e5feE48b48b0E1239b9cEBf1b2f04", balance: _1e36Str }, -{ privateKey: "0xAEEb0b58AF1e4ABddCB08Ee8988baFe5Cc4efD74D1fafCC3F016F127fCcD38f1", balance: _1e36Str }, -{ privateKey: "0xFC45e0a8Ee248eCa2B4B4EF2443E46B5Deb8f42D51eF0f614bc0eD06ffEaf59f", balance: _1e36Str }, -{ privateKey: "0x3FC30Fe223AcF399f875d0a9E5775E81C7660EDAc9F12ce73B4A5B9b59CAa71E", balance: _1e36Str }, -{ privateKey: "0x6cfFE8d0b2B4fC44AB3ac8Bedb0eeCaC7D2c8ab7bC82BeD0E513B5963FaDCfDD", balance: _1e36Str }, -{ privateKey: "0x1141Da15ccB571bfcB1B036feCA1a4Dd8BdCEb488AD0ED41e970bbFBDddA85b7", balance: _1e36Str }, -{ privateKey: "0xF8eA6A0AA6553eEEa0Aa8d5dbC25Fc76ebb89d403EC849DEAAA7C3e8B18F9F3E", balance: _1e36Str }, -{ privateKey: "0xE8ae7fbcD7C4A82Cc99aAcA6D2E8A40a1dDa8Bc24CDfA40d8dA2D497F2afE4ab", balance: _1e36Str }, -{ privateKey: "0xfC5f4561C3FE1AAA57AE3b9fBCaAAEe7ADDEf18Eb91A43fda59a71562c09DDe8", balance: _1e36Str }, -{ privateKey: "0x0DF3aAc9bFf3a00AFe1c42dD14CccdC5b0CCE096C7c3cb1C75df92e521D67bbd", balance: _1e36Str }, -{ privateKey: "0xE52E8Bfff63164e08CCEbC5DBFbeebc53AEF3Abbc68bCbbF3D8F975cBfeb3fFB", balance: _1e36Str }, -{ privateKey: "0x38BeD53eD51c6ACcDA1E7bb29D6C7bFda1b5Ae0Ecd2Cb64049e0cAc4f4e2cCed", balance: _1e36Str }, -{ privateKey: "0xA7042EDD74a1A7B50eFcc0A7E24BdeB3b3f6209ddBE2A8c13E6Fe4Bd3556Fed9", balance: _1e36Str }, -{ privateKey: "0xFCdef0bc0F9FDb3fBaE3eED418cAAC9cf952bC7cf683Ff85C12DDFaBA2909D65", balance: _1e36Str }, -{ privateKey: "0x77e1bB2694BFdcdcFb9b7892E2D8C8d024B36fcbCB8Af3751BBEaf18e586ab57", balance: _1e36Str }, -{ privateKey: "0x0D9f2ef8bEdCfeecEB7B8FaeFCeEc01e4a94aEb4b9a5FacE4B5DC6B33aCbEb66", balance: _1e36Str }, -{ privateKey: "0xa4f76eCd7Cd3FDf80cA38A7E3bAa546842EF3589DFA73c4e7aD0aB3157DACDbF", balance: _1e36Str }, -{ privateKey: "0xb4EfcCf5846EA5d1aDfCb91FE65a16c8AD77eca4D76f156012D628fF663AAdfd", balance: _1e36Str }, -{ privateKey: "0xc51D482aceFA5Bc852004f41eEcF7de8cDF19136DEF8dBaDe254cbaBC5EBfB5e", balance: _1e36Str }, -{ privateKey: "0x0117FD1e4b504AeCDEE8A5E5d067DAEAdD57D9Bd2CF0b9FBfaAAA9AEF56fdc3e", balance: _1e36Str }, -{ privateKey: "0x37632ef7eBf4b853Eae97da9ddDeA5CD314CE7D6f80bf0A6EF6da115e846DC41", balance: _1e36Str }, -{ privateKey: "0xFb1a35e2758Fc3D9Fa5B7B9a7cEc89D2a77c66EaACD159CeAb3Ef9106892b84A", balance: _1e36Str }, -{ privateKey: "0x790787ABF562266ccf766aF01bD2A2dA9d89D45023A9Cccf62bb88a53CBCA6e7", balance: _1e36Str }, -{ privateKey: "0xFDBDfE26a0152FA0ECEA4EddFd5C0b995ca7aBDbE4c4c87ffcAFDB0610a8e361", balance: _1e36Str }, -{ privateKey: "0xc8bcD70c04DBE5d2dBB22ef6afF59b2D39d7cb170f0ff18be6a5cBFdDa1DDB04", balance: _1e36Str }, -{ privateKey: "0x64C9E95E2efdb216C70255b80bb341cAD2b3FaBFF9EC46D3a8BF5b2CDCFd773C", balance: _1e36Str }, -{ privateKey: "0xfDbBE1567F4AC280D7dF328087C50bC25E5A1f6E1B397Da9BcCbF4DFE3aBf7da", balance: _1e36Str }, -{ privateKey: "0xDE72c31ddBd3c4dB2eaAD2E7fC0616d3CB0c4b7F6cBEdE61dfBCAeF9153166Ac", balance: _1e36Str }, -{ privateKey: "0x7cfAD4eDbAC3FE9DFb04F0A3E9a0dD99A3323dbe77E9e22aa2BaceCBF67fbe60", balance: _1e36Str }, -{ privateKey: "0xffC11d3081abDef79F486fbCd6CbECa2cBbc2aA2Ddb765faAEA84A6cbEbc9eDF", balance: _1e36Str }, -{ privateKey: "0xC8dE6fF874D8C9900b4474baAF99b774545cE7Fa55D5cEd5085ff27bbB372cd3", balance: _1e36Str }, -{ privateKey: "0x25Ee75C172d0701bB5a076b8AcfA078A8B0f8fd2cEC3a6298A4eD62c8F8e6e4B", balance: _1e36Str }, -{ privateKey: "0xED80ad9e82Ba12f1b727aec0E1E6Ccd8C917eFC122f78ef682531a6Aa51b84C8", balance: _1e36Str }, -{ privateKey: "0x7fdB92e7eA164F8Ca9f4c5225Fa5F721Ca97DADC6722a4e0Be69F59F72E4406d", balance: _1e36Str }, -{ privateKey: "0xc35328ddB8CaCEcA33435c17931c1e43a0FD3eF9EdcCdf6EDe8e9A644F27b4CA", balance: _1e36Str }, -{ privateKey: "0x0b04baCCD0bd8D68aBDD0fFe86c33ace070A32ceE305D56c68D20B4dDBb97f0b", balance: _1e36Str }, -{ privateKey: "0xa2B90e1DdB40BAeae18cada7CDcAD4a8dCF1FdAb02fB0C7216A3A942b36A86FF", balance: _1e36Str }, -{ privateKey: "0xE4F62eBfbd48Af31Bb2cFfED2f6aDddbCEfE87C1DbC4c63Ded1F3E8a63a04331", balance: _1e36Str }, -{ privateKey: "0x3a9E54733E09a8bFAB3f4ba6bbCba20EE2feC9CC3d9C5e7fCBc87bb9eEFf97Be", balance: _1e36Str }, -{ privateKey: "0x4ef1a8934c1bBf33f7FE4C8cA9ec4aF94aEE14D859E89D5eea74c504D3cF8d8F", balance: _1e36Str }, -{ privateKey: "0x7b93B4EcA077fC5800f687b1fACCA6639c9ACbe7DFbD06a3D1Df8A398d880dAe", balance: _1e36Str }, -{ privateKey: "0x8d670FE6d77b49ACF6891A3FdbB3d5C602CDBbaa2f3dCB8FE22bdDd3beaf4164", balance: _1e36Str }, -{ privateKey: "0x360259E9b1FdFF304c02F737BFC8bfdEACF1D81dc6FFce8cd466FEe1dbb06404", balance: _1e36Str }, -{ privateKey: "0x88e70eBCca012CA3cCb742E64CdEDBDAd4af1f0b4ab74880402a7D9fd3afDf83", balance: _1e36Str }, -{ privateKey: "0x9A346ce2bAe43cDC0adffe850CEfc8b475599feC9308b51D98dDe01dEEdcD6e0", balance: _1e36Str }, -{ privateKey: "0x4B83CFBf5BEEf4c606FaE8159eDD8Ea40B9bFC9AB4c2689b9ABb5AB288C2b914", balance: _1e36Str }, -{ privateKey: "0xbdc41e9A1E6EbAC6E3aa3C308Ee64A8F4BBFe2Ad7CB0dbE2759fD7b07CdD65A2", balance: _1e36Str }, -{ privateKey: "0xcEB70dA0A7E2fd8fF89B0a4fD0ae43DC31dd071A966d56f97dddeb2DEcF2CDa1", balance: _1e36Str }, -{ privateKey: "0xbAc7edc59bFCb445BEd1Da8Fe114e4cbfBC8A4eE0F88EEA3119C77e7df582Ff6", balance: _1e36Str }, -{ privateKey: "0xdda27647F49dCbCB5539EAf062edE7d4336c19bBC7d8CABEE57c608A601B38dB", balance: _1e36Str }, -{ privateKey: "0xa6C7de9Eb7CC24c932e74bD1e60cb73dA4bC1BcBaDb04F1bC994762bBccF79A6", balance: _1e36Str }, -{ privateKey: "0xF983Dea7f9ffbdB56FBB5bE6CcF2F5f78D19F6e06E3DeEa6CBce179dF466B491", balance: _1e36Str }, -{ privateKey: "0x53f3f52Ab93a905133Ff9DEBa5A9bf924FFca4a2dCdcf5A7ccb1dB9565a778bA", balance: _1e36Str }, -{ privateKey: "0x760c6D438B5d8Cf8eF7a1eDEc6495AD1E08c5EE92f5d40beD0DEA1A1a03AC10b", balance: _1e36Str }, -{ privateKey: "0x8134EBec6C55C4ddf2B43E6eEe077b75fA1Cc5f1A8067CacfEc2e5bc9D515FfD", balance: _1e36Str }, -{ privateKey: "0xbaBCDB7eB36Cb45f8Bec0cf3E7CCe17AD93CdACDBb6edd75Bbb1C2cdad40f35f", balance: _1e36Str }, -{ privateKey: "0xC5bbBEB98bF5A71aBCB3acab7Ed3dFe9B7EA6DE3E2BE3235d1040EB0B3123cB9", balance: _1e36Str }, -{ privateKey: "0x9aEB8E9250dcAADc10D2C5b7CEF28bFB35071DceeE7fb188BF1Bab056f63f541", balance: _1e36Str }, -{ privateKey: "0x5055bD0b3104AAB674ecE2b93F9FdDcC784fF8AA2f0A55Ee5Fb9a9Ebcada99fB", balance: _1e36Str }, -{ privateKey: "0xAbFfEC11fac0cFEdEBA51F747FD88Ee62f8A4bFe7bCaA3fD497C9b837e4ad1Aa", balance: _1e36Str }, -{ privateKey: "0xf6cEBb8aCBF3FD9f3667B9aead92Fccbb15BaeE87a72F0FECd0a7C20a06ED11E", balance: _1e36Str }, -{ privateKey: "0x47ae2bDF44Ca0D93f5dF31EA0295d3ea6063f4EEbCD8DEBABbB774AdEF96a6A6", balance: _1e36Str }, -{ privateKey: "0xbEdc94dFFAA93AaEeF6AcC5dF5F4ccA82A7Ec5aE1bAfB1c58aDFb12fc95BDA08", balance: _1e36Str }, -{ privateKey: "0xAacd1B9658f1b0afaD72065c71dAfDfEA79745C8CdD7e26Ef9BeBe6D7dB82E0b", balance: _1e36Str }, -{ privateKey: "0xFCEB8B83D1a93CB8bcc3fDaEfFf3AD0c24e6F94dfe2B1CF78F33BDD3f887C132", balance: _1e36Str }, -{ privateKey: "0xa6BD72DDf5380e4b4953eE4d043CEE3975383E7dF60AE643f9627ce56695e3A1", balance: _1e36Str }, -{ privateKey: "0xB1EbAca4Ba4c4Ca75dEfD2b4aac124071bC4aAC6286AcF4E0A2502BfD1A50e1f", balance: _1e36Str }, -{ privateKey: "0xf713C1Bf9b4a5445e5a9a204cd7d001eF7ACa4821C9E6eDeb9e400E0FDdD28d8", balance: _1e36Str }, -{ privateKey: "0xF332226eD87251B4E2DEd35BF60F7fA2ebFacE23AFBff7F597eA3361CAFeFB50", balance: _1e36Str }, -{ privateKey: "0x7E10DEc7EADe42aB56e71f8ccaF7DEBe61A50C24026B23f20e3D93b5F8D5499e", balance: _1e36Str }, -{ privateKey: "0xB0F71066eDB5ECf26EE668237eC49F4B7A941de5f9bd752F3E91ff4DEDDaDA8a", balance: _1e36Str }, -{ privateKey: "0x4C4B4e674A591e2EAa123Ec9DDbcfB06E48c0CeaC66fAF64E8BbBA78E453C8ba", balance: _1e36Str }, -{ privateKey: "0x7c5C7e8FBb20b5d57182DFD2eAA53dB3591Cad8Db1c8920e353E2D5EACa3c553", balance: _1e36Str }, -{ privateKey: "0xA0F3Bc7fCeABe3a7CCa3ec6EA37bE1a1C368Ab19579B4A071F2c5c82E5abf1aB", balance: _1e36Str }, -{ privateKey: "0x722ddFefFcc5F2FE1403F1DccDe50dfA5F3fE16c7325d79877c6a128cE3E7f87", balance: _1e36Str }, -{ privateKey: "0xEA10Bb5B2Cd8dfEb419bAFD4c79C09DFD99FfE6a9c624FA6FcB6d68cdacfB7Ed", balance: _1e36Str }, -{ privateKey: "0xBbc5ec5a8Efa99FC95b6e221543827FF5dA6ADcF32EF8af1eb2CfD1fd66992dA", balance: _1e36Str }, -{ privateKey: "0xA8dD6690ec20CEA254C1eC1BA6Aea3fbeDfEEFEd6Ecb6a881Ddc37d3ED2EAF8e", balance: _1e36Str }, -{ privateKey: "0xb83a18baBaAD74c1Df4bBA435A75dCcA724De3AcA6DD4a0506FBEafcA91cdbFc", balance: _1e36Str }, -{ privateKey: "0x51656e0CFe8fEfeA8D4AacbF99f7dCCbF4e0FDD2c6BCa9dCce579c0b2fBbcAcC", balance: _1e36Str }, -{ privateKey: "0xe45a46745F2EB9F03D9DF6a13CE8DED8aEdfd6d8Be652BE0cdbD840F19dd6804", balance: _1e36Str }, -{ privateKey: "0x1BCD6E3d0479AAe3dA99e05b74a336add6aC8fcF93567c11AE57aAb392FFE0d3", balance: _1e36Str }, -{ privateKey: "0x41d5F5C0dE5c8ACF5E323AD8cfA2910fd9EA6fFfF7db64cfAc2caed19FECFEFF", balance: _1e36Str }, -{ privateKey: "0xA8aB14D7d3A65fe2b9b8F1F72c08f2D8ecCd6Cdf44bACD0abEeDC1fFeb7B0A3A", balance: _1e36Str }, -{ privateKey: "0x3dFCc3b02c494Ade3b0DA5D93CBbBFC4DCE4A2CBC2EEAe101Bc0e1EAF8baC8f5", balance: _1e36Str }, -{ privateKey: "0x71ebe2FaEE0AFCde26E9A2C5b6936dfD7aF371cf2672BDbeaAfe6079ca5D1F6a", balance: _1e36Str }, -{ privateKey: "0x7F0e9b58Ff6fe6aAeF2Af8aDECDBe3A6EbE0bDacA320cfe223fe812e16b4B4e5", balance: _1e36Str }, -{ privateKey: "0x20F385e9D63d673dDa61aDacd81f180C4F0bCa228cACb5fED81476faAAaafeca", balance: _1e36Str }, -{ privateKey: "0x7a24Cee8a184efD6C0BA5425da629B3ccb25C7CC9fC309A9bDfa7ff1C09F98bc", balance: _1e36Str }, -{ privateKey: "0xC7A100eF0acCfdbca6C7A3fD0A4BBdFEc07A89e060bCB3FDcDAAdDC8dcd808D8", balance: _1e36Str }, -{ privateKey: "0x0daF0e1C5c3CdeF967681AC7F2d5EF2Cc392b8A7b854dbc43180e1C9575FAB5a", balance: _1e36Str }, -{ privateKey: "0x5f8eCaf23e83E2cCeF9e4c4a3fbeF6Fdaf0d93A3C7B8bcFbBFB53643c8e5fcf8", balance: _1e36Str }, -{ privateKey: "0xaa3aCd68e0A1F0D1EDAd4A04dB88dfbAAd9E4813d0b59cA0bdACbfc74A1Ef73c", balance: _1e36Str }, -{ privateKey: "0x579F5eF50E2ffE41c1F2EF8E0D6DaBCC4a11a6B6CCe7cB5c88C37AA3Ad05036f", balance: _1e36Str }, -{ privateKey: "0xd4cAf9f374eED0D383AC52d45DC4dFCf94dfa7ADADab1382883075E45aeACcD3", balance: _1e36Str }, -{ privateKey: "0xAFfdD281e82cDce3cB97C74c36dF7FBe7219BB4d7982B667bdC9CB8Eae7dAbAF", balance: _1e36Str }, -{ privateKey: "0xbc6ff23B20bd7eD4eD3704dCBa96a1b4ECF2Cde3d32d384bB132C3aEEef197ec", balance: _1e36Str }, -{ privateKey: "0x1DD30db5F82Bd05F0Dc42117E1fbDA73965352dfBdfFBCa1Ca9F4CA4ABF09Afe", balance: _1e36Str }, -{ privateKey: "0x2Dc7bfB5f0D24f7abb3C908efb21e60bfd9BBC13bAdeFAAFEB4FbBF8FAb80A3a", balance: _1e36Str }, -{ privateKey: "0x0EAD4bB5f8C9e005dABe5BAa2CCd1DfF25c5D307DecB1F3F1cabeB79eFf77b27", balance: _1e36Str }, -{ privateKey: "0xab8083915ce11D1Fa61e6fe29b3fc8D76Afb88FfCEa4BFCBa3AEb0978cEFfAef", balance: _1e36Str }, -{ privateKey: "0xAdE83c02854bD99B1BA405b32a029Bcd28E932Bc3cDaBdBD97E6667b7DbB771d", balance: _1e36Str }, -{ privateKey: "0x2A7DA2F623A7874971dbA6DAeddEFca9DEc496CBDC38e4D162cD6CEd98d7d4Af", balance: _1e36Str }, -{ privateKey: "0xB179D6Dc4EFeAE071206eb0ea8cEaE1E590E57Dbcb517a1CB30AE81e4f5fBD9e", balance: _1e36Str }, -{ privateKey: "0x165D41E3fed53e016eFEC41cDc0E2AbDf494C3d3d25cf0EFCea9cA2Ef725B10c", balance: _1e36Str }, -{ privateKey: "0xb7ECAb70fd1106eE488DcB4605A8D7CeF0c81b1eBFB4DF1cD0cA92ffEF7Cdb12", balance: _1e36Str }, -{ privateKey: "0xdaAEA38aDD26DDaCBf286c5de2A8F4BA1c8ac9a3Ff3D7c1e4aa7C39Ed5d419b3", balance: _1e36Str }, -{ privateKey: "0xa5F3dfCad0e94dDDd3F85aEdfcCABaa1dcD5EECBEf53810Ebe81ca62D9FEb7a1", balance: _1e36Str }, -{ privateKey: "0xDD3D7EE4b3Ec894FB136a6bDAFAab17aeDfDB831DB402B7aC18Ae75EAb3FD5Cd", balance: _1e36Str }, -{ privateKey: "0x61Bddd6617fd7fB6Ac00bDd53cFF20e4FefE788a0484bfc43b5Bf68CCcbcC1A7", balance: _1e36Str }, -{ privateKey: "0x314cB5df8aFc22dB14fDA523d8CE9DB9Dfbc1F47741550F1CbC93eeDAc51c98b", balance: _1e36Str }, -{ privateKey: "0xefc1c960FDd6b932184aE8e5289dECa8fe4daBdD7a37EFf3Cc7Fc6B325b18C73", balance: _1e36Str }, -{ privateKey: "0x2d32fce95ACaCbd5D828E1ed7d4C8A3972FBe44EdEEFf6543b6Eb4E17F6b707F", balance: _1e36Str }, -{ privateKey: "0xAAC27ef0cFce20eCdEdBF36FC68BcBeFD173a7fCCa2b8bB1f6fCF523E2E4C013", balance: _1e36Str }, -{ privateKey: "0x2C58cED806BebcA8545b5C82D3c83EBc2dbBAC09Bd05Ca2c161bBa23afEFcFD5", balance: _1e36Str }, -{ privateKey: "0x6dFAAc5Ecf7A75dE0cF641ffFBEEcedD0B0Ef1e92aFA0b27EaEaE09ecE6aFfEf", balance: _1e36Str }, -{ privateKey: "0xaE68Db045b0AEA45c479eb5748398E9C9c4caf46E35Be3DbaF7D704e6DaD2de6", balance: _1e36Str }, -{ privateKey: "0xA99E6E06Db7c24870b6Cde3A0e7ae9a549Ff3aA1EFCDa67B8dD10DC2fAefdc4e", balance: _1e36Str }, -{ privateKey: "0xA2d88f9fFbd9F28E40feE9A0495fe7feD1Fc5e94Aef2EC8EFb4EC8fEdff1C9d8", balance: _1e36Str }, -{ privateKey: "0xFbd04C0A1b9e9BcD30DCf3e7EBf8ee069dEC6DDa3B8F53DAa0D20AB7CfdFAaEf", balance: _1e36Str }, -{ privateKey: "0xbeb56d2C10afe6eFd72Ce9DB0Fd3C6cB7Faac7d8bd3A9f5AEBA1ECF5eAB25946", balance: _1e36Str }, -{ privateKey: "0x9d7A1b51d76E7deC1c5B399E24edadf22af8DaCbc979E96b3dB7c2AaBdC6eC97", balance: _1e36Str }, -{ privateKey: "0x4a5De1a09038Eb0FBd2eBBDCAef58C1fd9B75bbFfbDaCC583027Db471B19A4E9", balance: _1e36Str }, -{ privateKey: "0xc118Ab3C4E4A06A42A69cb9bfBaa5B46dc255Ac83EFeED7Ed1A320AB49293D0e", balance: _1e36Str }, -{ privateKey: "0x706AD6CF0c307c7ef4A73b8D7dcA21F25bCcedcb5f4CFAFbCFc3C7C89F02aF34", balance: _1e36Str }, -{ privateKey: "0x3a6830dE5DD77b1CA96bFB22dE6d44B5bfbE328Db7A9e49A972a2FF95FEBEA09", balance: _1e36Str }, -{ privateKey: "0xC90da3CbAc8B72CCE8c93065D2AEcD1adFa36Fa7C19f7D4CDC6adcE3c8EA706D", balance: _1e36Str }, -{ privateKey: "0x40DB6C8B26ABe35153FCaDCd5FdF3eC5b6CA2bfabBcE85C4c7b63F6cea7Cad4C", balance: _1e36Str }, -{ privateKey: "0xcC4BEC1Be799561786bC2dcDCFDbeD1bECdBADbB7dfdFc029E1d9A4DABC0dbEb", balance: _1e36Str }, -{ privateKey: "0xacCaBe2b8b262aED34cD47B8d478eb3aadE3aF0a88C780E22a8Bc1B4CF909FF2", balance: _1e36Str }, -{ privateKey: "0xbfDddd91BE4a2cE3f87B7EF50Eb0F6f404e7A4898d2875dcdFbDFBc4d854Df2E", balance: _1e36Str }, -{ privateKey: "0xcD15CF93A8ABe2A00E7397a2874fb94bfcc2D4e2bdDACAFCbf7D3eC7F2210Cd9", balance: _1e36Str }, -{ privateKey: "0xB30F4eaf5cC0c59AE0f101c5ECF24A5b85BC88Cfb6B8E8fb3Acc9AAa94dAe99C", balance: _1e36Str }, -{ privateKey: "0xE8321F9566EEa282B7f507E96EfD1dC5ca2FfbAacdE3dFa601DFF20E1CF5DfB1", balance: _1e36Str }, -{ privateKey: "0xdB7EFec0D8D5B3Bbb1FB4fb0bFBd0D58b80FbcdFa190ccB1FC7dfb8a94AacDb7", balance: _1e36Str }, -{ privateKey: "0x01DFa03679b446FDD1f28Dc3c7e7EA37D59EaeBC4eeBae91fCd8d6eCaF8FbEec", balance: _1e36Str }, -{ privateKey: "0x67fe2A0c6290783f2F4717fbe0CF72aC7c3005aA8cBfAff0E7468F1D0Fa16D1d", balance: _1e36Str }, -{ privateKey: "0xA3C9292475ae245Baf25Ea8A355CF2DCb0feB787f8c7f9dE0933FD342b9aF2da", balance: _1e36Str }, -{ privateKey: "0xfAcad3cbD1e0c4F08914b2DAec072f1520eda4DcEb1ACdD4177AE40334aE3BCC", balance: _1e36Str }, -{ privateKey: "0x1e8aB5E10Bca132BA82EFFf198F9dc61Fac8bbCEF75a2ED3E1Af4DA3C924D7EA", balance: _1e36Str }, -{ privateKey: "0xDBca79F9ddB0D46A1556645De5685CA58c0aD52462b3AC46aADcAAFa2e4Ef9A9", balance: _1e36Str }, -{ privateKey: "0xB75B389d81E6D389BbDBf9bDffa74CD42D6a792dD1ee7aC85d597c284dc0eA2e", balance: _1e36Str }, -{ privateKey: "0x8bFeba2c1aD9fbEeeB4028d921Ed53Da51f15090Dc9736CC53eb5a05EB081eC6", balance: _1e36Str }, -{ privateKey: "0xB7B6e74adf1575c294b56FeEded6424DfD3fcdA1b0Bb9aff8Cfdaa9e4E350b80", balance: _1e36Str }, -{ privateKey: "0xB2922a2a63c7AC66AcDD8a3CaF0D0c50c1D158E70cFfdAcdEE831fBF9A8F3cB5", balance: _1e36Str }, -{ privateKey: "0x0Bebff8ad570a9fdF7B02F5Ce1bfe8b43DDd63bB85AE24C5dAb2DDccbeeC50A6", balance: _1e36Str }, -{ privateKey: "0x0786B5bAE18cf8Aa6bacBc7C67729E61bAeEaDcddC74BA8fdb4b6BF836B47d25", balance: _1e36Str }, -{ privateKey: "0xf3cbA5A83d53C5AFf3Ffcc799905F8Fffbb6AFD57e41CbDC6682d56E7EC2fEDC", balance: _1e36Str }, -{ privateKey: "0xDf71E23c590c94AFf5E173efD11E7daF4a4AA9a3F4C83cfd47dB117395A9a4dB", balance: _1e36Str }, -{ privateKey: "0x739c3570D0693FB9AdCedb90549FD7bEce1aa1333fc3db56eAFB4e61b8f0Bf8b", balance: _1e36Str }, -{ privateKey: "0xAbbbC5756EfaDCa73bBB4b610349891d110347Ba40cA7DDEcCa2c0f0ce334cbC", balance: _1e36Str }, -{ privateKey: "0x7b61317784B4256AEaA4aDc1490973a2E87CcB3D4D2F7F1Ab5DC6ddECD0e13a9", balance: _1e36Str }, -{ privateKey: "0x046176e33f7ab209C61F5b2D467e1aFB6e7BDECcbeCaeC8f826f7C1cf7C353CA", balance: _1e36Str }, -{ privateKey: "0x2b1CF29d3E6DFeC4Bc1CD3AAA9f5f52b3DAC55AA2eE7990eaEC3f6f658Eaf449", balance: _1e36Str }, -{ privateKey: "0x80cdf2b52aCb8bCc9cB0C9Ea36bC282Fb0721B37e2b81bDb745bA3aD2952cdBb", balance: _1e36Str }, -{ privateKey: "0x6d3eC8CABE7b1D1A2DCD2Eaae87FcFed3eF1E15bE7023e67BBD08c6AaF3B66a1", balance: _1e36Str }, -{ privateKey: "0xbBEA8Ef624E4a05275Ff02AAea6Cafb4dF12eCCAc5dBeCBb7A2896A151B0F662", balance: _1e36Str }, -{ privateKey: "0xA0FBdAc51dC0bAeeDfCa431F64aE55AB6625d7b781019EF9b1E53cA2b296f32B", balance: _1e36Str }, -{ privateKey: "0xf54dCA19D5c05dA0DC1E90e6A080ab8f30bdc0AAf42cc51feC78F5c29aBe774f", balance: _1e36Str }, -{ privateKey: "0xeffB7d1047cAC0CCD461c8bAB8765aB19c2F75EdAdfc51bcd6a2afea3afCBF2c", balance: _1e36Str }, -{ privateKey: "0x83eB7f66F7Db6addFbFe2C6Efc9C28fd7dc80D9F1befd45dEdaEf763EeA7de34", balance: _1e36Str }, -{ privateKey: "0xC2803AA8805FdCF4BDBa5e3fe8B04799D0E2BdbC4f6A9D3c5E0FDB2C1a3c5BEE", balance: _1e36Str }, -{ privateKey: "0x765427a2Ccc081D6bCBab3Aa049eA3EBBD39F8842FfA6bbb42b30372Cc843289", balance: _1e36Str }, -{ privateKey: "0xEeF5cFc1e4F658bFe9d8e4abDFc9203dEEBd363bA7ABc8cd2cee196dc1Dfdccd", balance: _1e36Str }, -{ privateKey: "0xbbb96cFcE91C83eAACcaffcb8eeBAcbEF2ec402D0223bd6a9b4fd2eb7CcA114f", balance: _1e36Str }, -{ privateKey: "0xA59c0C47C3cDbDC2d5BEbb77b388485cEa2ccA11C77De606C4A2EA88cE8Ee40F", balance: _1e36Str }, -{ privateKey: "0xC3Dc3FfBbcD3f3C9a87f05D7cB8e9e2e600eB4c8C074962fE5B04d5AF51a3Ab2", balance: _1e36Str }, -{ privateKey: "0x00acCf8c3A27a0E48bC74AC22B27EDBaC99bE3b6DaE2D5333c5DCdeE9A355bb8", balance: _1e36Str }, -{ privateKey: "0xBc5EEC7aA4Cddb5a5ddbAADEc538F7a30C7DAFE44fBb10aa9366f4FaaaCF3603", balance: _1e36Str }, -{ privateKey: "0x5DA43DA715bD0037F53DC7306ac9B259Dfea9bE88fB7fDbc61ad09e2DAF4faE5", balance: _1e36Str }, -{ privateKey: "0x5CcfD962C800CF256Ca7CBFAFE414dCf0ABDC733648b1bC7b1573a51aaDEeF7A", balance: _1e36Str }, -{ privateKey: "0xAFD5164CF56A03B1Ed5DDD1Eb87faBfecB035Cef3Ef07fFd2Cb87FDa5CdD7ACD", balance: _1e36Str }, -{ privateKey: "0xb4Ea584Dc36cc457983b385Ef5EEC4cD4eD113B8B1f38FBfE5aB702EcbfEDc5F", balance: _1e36Str }, -{ privateKey: "0xf1e0dF7c97eAa0d4d0b3A93ABcf04Feb6db356A54Fd5CFcfdcbe5c1FDf7Ac83a", balance: _1e36Str }, -{ privateKey: "0x19db7d8882Edd5c9AcbAB17FBDcCfC64E9f5Bc18BbdBc5fb5f2D00ECE02ad9E1", balance: _1e36Str }, -{ privateKey: "0xeb624cFcDb9EAa0cacC9BFB542Bfa0d75Abf0dAC1F2Bd7bbEB2daCD0E2DC17f4", balance: _1e36Str }, -{ privateKey: "0xF81bdbFBafE7e3E2C7DA1242E51040Acb85E74a5643A2C37f5EEB64eEB5c0291", balance: _1e36Str }, -{ privateKey: "0xcbE84DdD3feF1dbAa59Ebb3F1a53fC6Ea6Eb744b5faaAcCB606EbbfC92a7eC68", balance: _1e36Str }, -{ privateKey: "0x0ee4f59b9CDfCDf0dB0B1BCAfC2b0B93dA87b3d520AC984DAaFfCa8b7f4Cabf0", balance: _1e36Str }, -{ privateKey: "0x2CCafd718Ba7BFD8Ad9aF69c4acC529a9FCC7dB7ce8FaD91E76dd6eD13dBcEa8", balance: _1e36Str }, -{ privateKey: "0xb9e06CcB5F9DfEAACAC402477bC4cF3eEdaE72b69c9EfCB0f0BecB7FeFE2e615", balance: _1e36Str }, -{ privateKey: "0x83aeccADAb1F87AeF6684dddDd8b4d81dbdd48b951AdD2d9Aa8fC42E36a56434", balance: _1e36Str }, -{ privateKey: "0xB7C2A0b71F4d2D2C65fd17CC655dbB5FdceFE09C3Ba8b9174D546bdB307ECebD", balance: _1e36Str }, -{ privateKey: "0xd6A8E91cae9fE3B6A526ea5F7acBef7fA9915fA2Af1CddB4E85F44e061Af7bEF", balance: _1e36Str }, -{ privateKey: "0xbaB1ba450C3eEE71DB70F44224ffd87adc39EC138fBbAb2e0B193a80BaA7fcd3", balance: _1e36Str }, -{ privateKey: "0x60A56b9d521cAcBDBd619Cc90de09AC5CED4144cf2175802Af0dBA7ca1Caab68", balance: _1e36Str }, -{ privateKey: "0xE5FaF52Ad1141CdE8DC9655d67861fc70c4c7eEcBB3A906Fb37179fdc72c9ADE", balance: _1e36Str }, -{ privateKey: "0xaf5ac1Fea23e18FB7FA2bAfdADcEf70D6a3BBeD88aBDb4D0AbF4dAcbEa9CeaCf", balance: _1e36Str }, -{ privateKey: "0xa171DD68AeAFDa1A3c986DCBDbcF64BeFFBfD1C9CBD8497ED384Ee587BCe7EE6", balance: _1e36Str }, -{ privateKey: "0xF5c2A2A5EcE2CE1aa0ade6161cbAeCA6aE2a701ddf8DCdb52A42acE5EdBAcAd1", balance: _1e36Str }, -{ privateKey: "0x86B2cDf49df7F2CF1C8a9a6FC18eCfF5c7E1F76bE31cE7809945Aed21B32DB33", balance: _1e36Str }, -{ privateKey: "0x44B4A11ea7adca721E6b7ba90ffaa3dDB7d2F68De691Ab3A4A8acFbcDe0A8ceC", balance: _1e36Str }, -{ privateKey: "0xB21e7cD85947BbD0C7FeDbe2EF49E1bB5B72E44Dc03635F3DeCbFa986A43753A", balance: _1e36Str }, -{ privateKey: "0xeC8b0baddf5C218d3dbeF9f0A5D93353d2Fb0436c5DD61BFCbCbADfFCCa22edA", balance: _1e36Str }, -{ privateKey: "0xFD1DA8EB5152a03773eCE05Eee5816F31DeAfbaE938bEa0524C0D76B80683304", balance: _1e36Str }, -{ privateKey: "0x39AbCD617Edb085E4D4cB55bD8Aa6Adb05ACC290826AfdFdb6317d40D7b9dD3E", balance: _1e36Str }, -{ privateKey: "0xeF2c8d7fabCBaf8f02Db7DcEEEFE65cb4e1b5EAd36B83B475F73fBe7ff2CAAe8", balance: _1e36Str }, -{ privateKey: "0x955af80d35C74fdF8caea3BBDbfD9878e155DEf8a3D2817fe40E5fdd6e8781D5", balance: _1e36Str }, -{ privateKey: "0xF2528Cf6c3978c28C5F213B5e2cfbaB043A8Fa3aEfC6Cb090C9249E6ce3E8cae", balance: _1e36Str }, -{ privateKey: "0x3F698969DC0919e2AfdCFFeEE653c41cbAA198bdD5Edd519E6C70B391db2DDBF", balance: _1e36Str }, -{ privateKey: "0xcAAb8AD323CdC9BCAc02D99d6Ef6CBD1edB0B5658A2bCCF4Aad8511118EE46E6", balance: _1e36Str }, -{ privateKey: "0x48C43F2A235FAd0300ABb6B01F545b4D57EEf45102bdA7C127EAbD8d1FEAe4De", balance: _1e36Str }, -{ privateKey: "0xD7BBbc8c0dc1A27f0ad11F28FFF5c607EAD0Cdbd7fdFFf4AaDd7D1BebeFDaD40", balance: _1e36Str }, -{ privateKey: "0xe3aa97fa9Cf9bbBFAeb35B0315dF48f1C70dAD9b70B8d51EFe8f0dB37a975fA6", balance: _1e36Str }, -{ privateKey: "0xFA1bECc8da1d64FEf78d5Fed3CD8fD5Ea38cE396fA2fcf15AEC5a7a9ab883bA8", balance: _1e36Str }, -{ privateKey: "0xfeceEE2Db29E4Fd21298a836B6947c2Bf2aFb1DD2A2fBd647Da5fcfB8c24A3Cd", balance: _1e36Str }, -{ privateKey: "0xe7C1bFb15E70da8E2a66D7dc3dBadD8aDdDdb8cAebCdbB9eF3ECc86e3BE2BD71", balance: _1e36Str }, -{ privateKey: "0xeED40ad248d6BdeD632bCC709d1eedea1fF0783e6c43D5fEa3bdbAa78386eE7a", balance: _1e36Str }, -{ privateKey: "0x76aA17BC5B1e7aB3cB4BD7CCFcD0EEf25423caBdc17Faa8de18d0d788DFEeeF4", balance: _1e36Str }, -{ privateKey: "0x1E278CAdde9E743aB1ACd3e5Bd67e9b3A1E6c5EBA5d652a2125C1A53dc908B6a", balance: _1e36Str }, -{ privateKey: "0x581333F21Badefed148B1BdDbeaaeB432ccBDd15dAdD2d5FDEbBEd4E35397BC0", balance: _1e36Str }, -{ privateKey: "0xBdeC9E385Af6Aa8CBF8ba9f5fFd7Fc3aA2cbb6ceeA2Cb39b6a0B8124701535eC", balance: _1e36Str }, -{ privateKey: "0xdcb5d6e708e54b9B2C6CEEBaa50BE5aEF083bb63BEE8e1Be4d776DE7ED0e6A9B", balance: _1e36Str }, -{ privateKey: "0x0f36b74EB79f7eC92da5d9dAB78bAfBAd3f832930676e06d93267Bf5307B9B82", balance: _1e36Str }, -{ privateKey: "0x1cbEfEAaca37134789CEc3825F830f8545b6Abd4DCAba190DcAdDD214BE4C81f", balance: _1e36Str }, -{ privateKey: "0x1C5e8e9b422dCc516f3e5a7eED08E0aDF26960dde2EeEeECCF9feaCAB2fF2c86", balance: _1e36Str }, -{ privateKey: "0xa8F0BF0dEb341B46De7178eAdc7FbF8CbcE6f2dEdA152deddA6ea8BbdCfe0f32", balance: _1e36Str }, -{ privateKey: "0x39d8DdC1412F50e37a534583e6bbb8AdF5956d15543b30d83E991E0ADE4b56e1", balance: _1e36Str }, -{ privateKey: "0x217d366CEddc6F16cEAf1fED4BD40d99a10E0CAeeFd4dA8cB37D3D7F5AAEf9d3", balance: _1e36Str }, -{ privateKey: "0xCD3ce1a11b4F7BDAD40c2aF9A2B4FF7a25B88B5412bBF062077CE3AE6850fBbe", balance: _1e36Str }, -{ privateKey: "0x5BcBb1eC48DA3eaDCd03fEa74fA10ccc39E05fB64A89B6DA6b7b1aeF8CcA3cAc", balance: _1e36Str }, -{ privateKey: "0x05C03862F4dcD1fadeefc404A710DcEBecb3Dd8C16CAed5D3815e5d2C4530F10", balance: _1e36Str }, -{ privateKey: "0x21cbE7F5B2aA44ef61419EfcbEE2DacDA0599CE266FaebBCdbbB046f3Ed6F96a", balance: _1e36Str }, -{ privateKey: "0x2583FAF40B56ffdB0A08ceEe5D47Bb8CaED24c0ebE16FEF6D1a30AcdEC8A91Cd", balance: _1e36Str }, -{ privateKey: "0x8775Fde2ae0e0E9CFa960aC8F3407B2689eE4C9BCDA0ee4DBfbC77E2A0b21c82", balance: _1e36Str }, -{ privateKey: "0xC79CC10E021A48f220BF72Fe88A16fDFC004D001cB935BFbfE473AaE3BEEbE13", balance: _1e36Str }, -{ privateKey: "0x5e606FC7B5FCcF55182CBF7B0f6ccBbA2fd1d641E9b5e9f015f997B3cA8699D7", balance: _1e36Str }, -{ privateKey: "0xBc7AABD30Af8a160Ee509db8bf97b7951458EfAe22fB7Afe903F325C7Fd8AECE", balance: _1e36Str }, -{ privateKey: "0x478f33Cb5965B82DEd82f4400eC41FbAf718aeCB2900F3fA6E67e4B775AeE053", balance: _1e36Str }, -{ privateKey: "0x5EC972Dc270EFc7D2D38B76B9DAf010Eaa9f463Eda9E8aF8dDA96a74AbCBa2bE", balance: _1e36Str }, -{ privateKey: "0x02fE6A827EdB3E3bBFcA69F676C51e6c2baD47Ceb713B5E1E207bA9b56Bce1AB", balance: _1e36Str }, -{ privateKey: "0xfBF2b6e02E2b2A1bc4A8f748AbefAB67Bf8aDfD5f6cf3C1e7945C2aC7d1bDd86", balance: _1e36Str }, -{ privateKey: "0xfB5ddEBFCf053FDEB51A57361796dCdC62eD635B575Ea9BD9Fdb816610697cB1", balance: _1e36Str }, -{ privateKey: "0xEE28e00DEca7cffADe726d84fAAC894e9AAd3eBEa06CF338B7FEB58166B47Fc1", balance: _1e36Str }, -{ privateKey: "0x4Ea1C5C79bEdAcC1559eB1E3fDc83BC1e6c4964Ed6B9f1CB2bfEE3cE6f9bedeD", balance: _1e36Str }, -{ privateKey: "0xD6Ad0DfaB857f4D5dAcd3e1fb74CcfcCFCfdDE72D534b2f0605FBc8291Fc0f3B", balance: _1e36Str }, -{ privateKey: "0x6aefEaEbC7fFD5c6D6F1dA5cbC595195ef5cF9b459532d3Aaa5a1AcB0CD3c6BF", balance: _1e36Str }, -{ privateKey: "0x7d2a6c0629C80Ca7e513dEcE64f84d9A9E9d25Fe2F0D5F74fd4F0D99d053c9a2", balance: _1e36Str }, -{ privateKey: "0x6B3Ea2C23b7bdA45A14b724D486cbad761F556Cf64CAA2FEeCDdb95Ac3B5CBC2", balance: _1e36Str }, -{ privateKey: "0xF67031c0ECfeA3eEfda9D9A1e4bdc359DBfb077E1008cC3313ef962B39A25d8F", balance: _1e36Str }, -{ privateKey: "0xb29D4ae1AA3A8EDfAcEDFaBD09A95a65f1927C47989e9c4fDfAbD2Fb8d2bc8ea", balance: _1e36Str }, -{ privateKey: "0xE60ba2bF9EceB47DA9D9E23ad025D8c81c4c2FcA4ABF5785Fb27F9DafaAfEFFA", balance: _1e36Str }, -{ privateKey: "0xEC8fCc3Fcf89Aa1D8D26c661B39b5faf7e2D37dB7EC052acBB8Fe965fBDc4940", balance: _1e36Str }, -{ privateKey: "0xFFbCca52ca7e891369b98cEAAec71986a36bafbaBeEAde807eC8b1817f98C325", balance: _1e36Str }, -{ privateKey: "0xd57d2e5e8ee2E96b0187Ba795eA0dbbaE0b737FaBEf77C2AF767ae3fae4efDC5", balance: _1e36Str }, -{ privateKey: "0x4c8c324eE0bacae3BA642bFB75336cFE7e1B7185f4D24b30A1083a9BC10f308f", balance: _1e36Str }, -{ privateKey: "0xdc78AE3aCf5d085539aA83B0CCc7cecFbb73F8bf4795B2199dc58D912AC4C04C", balance: _1e36Str }, -{ privateKey: "0xDB264dE9c7B6188A0Fb1A91ccaa6Bf256294ffEB9E4Ab9B58624A0e45A0a2Eda", balance: _1e36Str }, -{ privateKey: "0xdFb18a34adbe760B9CBc8bc66b40c6EacCeCddaB7A2bc22115CbBF1c3A6C0dbb", balance: _1e36Str }, -{ privateKey: "0xcaB1AaBA163Cb5243b943172A51AdFcAd91EAB220eB89dD0cEC2f0A3c0FCcC97", balance: _1e36Str }, -{ privateKey: "0x07d8469f44C14f27bC6BF67Fe92FbFab3268Ed4824AaC00a4b3bbeEdC8afCaee", balance: _1e36Str }, -{ privateKey: "0xc7eF1eB85Fbb3308dB02a6bB3f37ED60b74DFEdbbfDB1eD5FEb92b6EF0d9eCa5", balance: _1e36Str }, -{ privateKey: "0xBF348cB60361C1FFBBdD1feF2DaeBc661B11Ef1517558fAFe7A1CcBAdeD2004C", balance: _1e36Str }, -{ privateKey: "0x2ce070a6fC4a96cac5A0B51A2FAa67aBdbeb0496DD841C417cB9Ee0E5663799f", balance: _1e36Str }, -{ privateKey: "0xeEe3B8abc45e2CF825FE651bfE9Ef33bAd1f2d78D5cBf7842AAAAA0bf9Efb197", balance: _1e36Str }, -{ privateKey: "0x741534d0300C8D4B3f55D412Bee30fe00A42A5D9dcc3f15C1ad5e5Dae7edd0c5", balance: _1e36Str }, -{ privateKey: "0x13DBe67fD98839DcEd106cB3E9C8cBc1C364B3EefEf3e29425e8D43207F22177", balance: _1e36Str }, -{ privateKey: "0xA85e142eDE2cB5a5cE11Eb9a45a0342B60611FF83c70EDC03fCaeC52Be32beb0", balance: _1e36Str }, -{ privateKey: "0x3cd3ddb1febd1058955cEcD12C0cb40a128Fd59957EbC3FfcaCfcdFaAf38CEE9", balance: _1e36Str }, -{ privateKey: "0xe8E0CBe60AfAc11bA06AC2cF50E103aA4afAFA3BbD6A7891e86aB21C1cA061AE", balance: _1e36Str }, -{ privateKey: "0x99f2F5443e5aCcc77c96C30eE5E9cDE260a1419B7B48e3ced99DFa52dee64dF1", balance: _1e36Str }, -{ privateKey: "0xeDDfAd4A07BB5B3BB6f41D646a81F6ac20EBcEc1E9B4CbEcEbEb106984aAac9B", balance: _1e36Str }, -{ privateKey: "0xFC980c13FFf7E5094BBfe8c1c0c33adadFAe77A2CdC3439D4F1e1F0B6afC14ef", balance: _1e36Str }, -{ privateKey: "0xfB03dFB6BAabd82Fe5B2C24bAe8cc81dF67962ecFa3d2a3f9fa22da3865D940A", balance: _1e36Str }, -{ privateKey: "0xeDd7bDda24D1Daa3E159acaEaB2F956cBECd202cdB6dE29D4c32Ed3C9c7E9dCC", balance: _1e36Str }, -{ privateKey: "0xbA6e256AfbDd0ac5D2FDA5fE34f64CCB1EfaCE6Ca7B43b1BBB8D334bc594aC1E", balance: _1e36Str }, -{ privateKey: "0xB5fAbDd1eEAaBCDaa3DA0d95eAC7749A6b68B8a4DE968CecCdF2144Cb7B0afcf", balance: _1e36Str }, -{ privateKey: "0xdf044c8c00a43ddf50c76c4d87CFDb5E8EdD7B9a224Bd0f67ED32ad643d69Dc2", balance: _1e36Str }, -{ privateKey: "0x8Fc2decC9De50973CE9df8C4Ef7DC28Cddf524beE9f2D64c38A7c50EfbcBA953", balance: _1e36Str }, -{ privateKey: "0x482Dc8b8c13a46fEd9ABf27bd6Cbb2D27cdED0cbde544582362ce7c6ef526FFC", balance: _1e36Str }, -{ privateKey: "0x4DFdc7ABe5D99FB6DeD2dEfab1B840aE4f0317c49FCb4c9b4FFCBBDCDE8f2019", balance: _1e36Str }, -{ privateKey: "0xcDAe7CCad2CFbcDDDb4Df56B6fDACFe677Bcc73BB1e69F79401CB3cDcCacff70", balance: _1e36Str }, -{ privateKey: "0xA56CB8163DA4556f6B549D505ECFDDEEEA8d70aE28EbBbdAdC0C402DB338De54", balance: _1e36Str }, -{ privateKey: "0xC64Bd0D608BA514B6a9dBBeaeceD0Bc7E9ecb5bA4D605A05d0b8fAB30e5bD23c", balance: _1e36Str }, -{ privateKey: "0xFBc3CBb28d9bEa8343Acca6D011fcCa5280DFFDceBa6795aa775Cd5b4Dd1B0A8", balance: _1e36Str }, -{ privateKey: "0x84FAE35ecFc38DC6cd5bE2ECfbF84eC5Df02C26cdcb3000ce6ce5cDa180A96ff", balance: _1e36Str }, -{ privateKey: "0xa3A78FbDf70fbD710E3AaAa9372bbF867bBEAd22C7f65A25A41e00a3Adb3dFFd", balance: _1e36Str }, -{ privateKey: "0x83bE5db4985000BafD5b0ff507B5CBbE41dA6bac7A0CBA4E6EDBA3A9cDDc0D6f", balance: _1e36Str }, -{ privateKey: "0x7DbA3D3f63e5AE576b3aBa9F1aCEa90c203ff6F073baB7E56acf427Ba8714F20", balance: _1e36Str }, -{ privateKey: "0x1cB68ecf092fbBdd79AcDB2E9cCd967689Ca1b8BaC9938dcCf459C2a4C7A5cf9", balance: _1e36Str }, -{ privateKey: "0x667e8E84cdF72241c68Ee15392431E5CC2D8C7ebAA4FEBd93E98D8DffeBBe50a", balance: _1e36Str }, -{ privateKey: "0x4b0a4FEd90A9d4db2Cd9E5e2cEbBD25dA2D54Aa73fEDe3fF2fB5a750E2D326D5", balance: _1e36Str }, -{ privateKey: "0xdF450b7DFefC7BFbBb46bF80A0eA5eE9ecB34A8eD1D113A05D66AbAAaF32AbD3", balance: _1e36Str }, -{ privateKey: "0xfFaddEcFcfC080ccfAfB24Aaf098922C43B601CE652adaEd8bc77Db4a2a2b07e", balance: _1e36Str }, -{ privateKey: "0xa20F4D5bB8FA67CAd6FbEaCa5a87BBcE6eB988D88aeC1e6Af84507Daf7Dbc439", balance: _1e36Str }, -{ privateKey: "0x2F6baa7FC9FdaeBaD346FE0B5d6F4E206BC948DEbcBAE8C195db1b8a6Dc62Ff4", balance: _1e36Str }, -{ privateKey: "0xBea684dfdcdE88eF05D6AF9De4Fce8EABE1e45C52C42A05cc9d1d704bBB201e9", balance: _1e36Str }, -{ privateKey: "0x6dEB631c04455D0EA1ec7EfAed0a69BCEE9C05AaD05ABEFc35aEABcaA699e153", balance: _1e36Str }, -{ privateKey: "0xfCC9b7Ec379c989dB3bAbFF10fa73B406dbe0Ca27bbc17bd8D92Ba5efc83DeBA", balance: _1e36Str }, -{ privateKey: "0x8a5D540001DCFEdc4f8a400B11e9379dC1f5ffbeAF30f66D81193dB5d9f6FB9C", balance: _1e36Str }, -{ privateKey: "0xeE03Eb8dD4adEB51DCdFFD60B71D8CA392CfDAf29D3fbE7270B3843fDe5acbfd", balance: _1e36Str }, -{ privateKey: "0x8fBed0269D9Eed8C0A6dDc1fccDBBbaDDfE61cE3FdB71eE7CA6fBd8755516beC", balance: _1e36Str }, -{ privateKey: "0xcCe27e128Fe331dBb07E34CCe2bF9fdBEB0a7E2Ac4ecBb3DE8Bdfaeea7FFA26e", balance: _1e36Str }, -{ privateKey: "0xF4C05d399cA72CeECbB60bE5cFadc8aceFfeFdeb0E05036AcEa73f1b3bbd7B23", balance: _1e36Str }, -{ privateKey: "0xD5a11C5fa09ffB8BE3d2C792EfD4d2Fc697aC2D6bb6d4Fa1fC8E14af5bE2f94A", balance: _1e36Str }, -{ privateKey: "0xa2F3EcDEcB7d7e770b41bf73e9B6b1EEe4af7646A7E5a2aC9a2ea55FCc808006", balance: _1e36Str }, -{ privateKey: "0xc2f92e25dB8ebbBa92daddEdCE3eDC41F7E8aedeb264724f32b433a742B9Aaf0", balance: _1e36Str }, -{ privateKey: "0xcfd5deFb1Dc02DA057dcEECcBE8D3e9b77b44cBBb17dFc70a4acD78Bb39BD3D4", balance: _1e36Str }, -{ privateKey: "0xef6FfEd3c0AE72B29A9D209e816fB5AA3CEBDBb174dA6bbfE5C801F4fAE61E0f", balance: _1e36Str }, -{ privateKey: "0x11e430C1Bf74ddCBf8fB4981397750fbE4Eb504ead6B9aa3aFc8a2b133C5fB2A", balance: _1e36Str }, -{ privateKey: "0xfEeAA3b0efcFFC42a3f1Ab6B155bfa4d4FB350fAA3ffEDcF9D7fb4dEd3C42f02", balance: _1e36Str }, -{ privateKey: "0xfacB3A1F68fCde53B8Acb2f8b4Cc934D50C7FBFE36Da3deD742b19e74Ed7a93b", balance: _1e36Str }, -{ privateKey: "0xc7aA3BeBAbCc4be5Bcc19bf0b34fb6c53aDf464C3EF572192072aeEBCadDdBDB", balance: _1e36Str }, -{ privateKey: "0xD5a8Bc556cF3EdbeAcc9F92C2E0B31Ecb68f45A79a0F998e9359BaccB20C8600", balance: _1e36Str }, -{ privateKey: "0x6BEeaa9A7D83e0aD79F1494FE254fB78685c11Bca93C3460E72fF6d9fFb8c505", balance: _1e36Str }, -{ privateKey: "0x8D649fBcEc39f21829fc7Cafe9DB7cd2BfdeF4aDDd6355ADeA5a15cab2eE2cff", balance: _1e36Str }, -{ privateKey: "0xba8BAD4B9ef23B43DaEc6777dC8D7Ba5d28Af9D83d3c5E8a6BaCa3A385Ce8b33", balance: _1e36Str }, -{ privateKey: "0xCC98cC2fe7D543C9ec3d55d0a09fbb4625bb905cFb7Ae93bBEC422FAdbeBb1bD", balance: _1e36Str }, -{ privateKey: "0xa95Be2aD481FA3dEECdB2BdB3CEfca7031f277be3C9FbCc6ff9752dc1613daf5", balance: _1e36Str }, -{ privateKey: "0xBCfB5cD7c756EF6b90F4a94cF53De5daA0b6A2dd1ED4b307A938596e06A75C0B", balance: _1e36Str }, -{ privateKey: "0xEfEe98C09a0E7E4F212FcdAa7C7deE072cc0Be3faacCBbc144e301B6f00b9518", balance: _1e36Str }, -{ privateKey: "0x714feCD1Db6cdcb7f1d7edB3A506BfE4f0b53aF84fde85D35eCdDe07aDF99575", balance: _1e36Str }, -{ privateKey: "0x438b8eAdA0fcfaf4EF21DFF136DE2CB7fBBeed9A9Bb5D6B6D4B8ddef025fBDD2", balance: _1e36Str }, -{ privateKey: "0x59Ae7adb4D90cEd4dB9E7CeeE7cEBCb3f5ED90cDeB32bF5AEef1C37647CDbbeB", balance: _1e36Str }, -{ privateKey: "0xBAFCFdEFFb3A78B39c0dfDef3860e1bCADD3DC87B4c8CCdf0b2DE8cDcbfa6Abe", balance: _1e36Str }, -{ privateKey: "0xcCF872dF3d7c80C1Afa2d150CF31D99d680acafFb3E4dF5b0aa1fBd9FFFabce9", balance: _1e36Str }, -{ privateKey: "0x707dbDc0b28E78004C7d47feE6F429eA9fa7fFd207c4B8A76A89cA276Ffb6E86", balance: _1e36Str }, -{ privateKey: "0x3Abf8eD21bd8dEF543d5C043D7a3EEdECdb46690eEF3E1A45A9F8048aAbF378F", balance: _1e36Str }, -{ privateKey: "0x163a0F9FA0e9e836D41ff0be900e3DAAC0e4CAb3A1817d7dAB0f9BBe5aAbD562", balance: _1e36Str }, -{ privateKey: "0x6cE372AC8f90d7D0BEb2Cc28F0d622C784e0a3cec6268dBB340B215BcedabE6A", balance: _1e36Str }, -{ privateKey: "0x40BFD3157bDB44af2a40099fEb896Fe68F8edCccE5f21a8C5c6C5B21e6C5dAdc", balance: _1e36Str }, -{ privateKey: "0x89aB4aBc8b3F26bf83Dac8bec001b6B8F65a7300f08aBAda73bC59cac4e4a43F", balance: _1e36Str }, -{ privateKey: "0xe5F066c5aA057CfdF1eE1e6D38c5A81C0c9b2Db1eEfd568d112f1bdf7AAe1944", balance: _1e36Str }, -{ privateKey: "0x6147D55BAE900ad6Fbeddf4c467bbd5af2703D95d7fAFeAb40113068761CC3Dd", balance: _1e36Str }, -{ privateKey: "0xD0ffE15EdD8D58653EfDcD4e88B27D880D40CFdF4c1836F67EBeBE6E31Bb6ef7", balance: _1e36Str }, -{ privateKey: "0xA3AF8c89e2b19dEa7eF201928D0Ff92061e4b76cdf1671b14F41Cbdd05FE1A0c", balance: _1e36Str }, -{ privateKey: "0x0dCd6eAF84147CFaa37FF5Dea20d4d95eEcAAdEa1F68CC2aFF8eeDfffCfba280", balance: _1e36Str }, -{ privateKey: "0x68CA0c1BdfD992Df69d2895CAc1Ec4Eb0eA6Ab5Ba62dEfFF13A0879Cb2c1Fcf3", balance: _1e36Str }, -{ privateKey: "0x30033ec8B92abceEa9B2Dcc5a27Ac2ddfaBe4765e3212A29DB8fff6B3b2Eca87", balance: _1e36Str }, -{ privateKey: "0xd4Cad344fb9598aA99790c0205FEE36c34a897AFb252DB12df42E0Fa0EC6abCd", balance: _1e36Str }, -{ privateKey: "0x0E385cC566BfB01fFF3C8FDE1F6AA96A9Df5f4AE925ac9FBfBFfbaE3c28C3e95", balance: _1e36Str }, -{ privateKey: "0xEaBE51DB88D85DB9e7ecBf2A22CBf5c1ff67e12fDfbf1F4fEF816EA0d4B91a00", balance: _1e36Str }, -{ privateKey: "0xCe9Fdb9bcb0C3B214580d5D4DBBf4D64f09C5c31AFc146B7FfaDa1f9Ba8Ec3Ba", balance: _1e36Str }, -{ privateKey: "0x108E5a56C8B3BE5887CCf2a3bFd7aF69C881FE45DbdF3aCD9CFde3189eEcE9Ab", balance: _1e36Str }, -{ privateKey: "0xBaC513AdE5b6c7cD4B8F4a010fa3bE71B8BFEA44d54ff0a6a5b6Fe96c3EB1F92", balance: _1e36Str }, -{ privateKey: "0x1ef1E7D95D1E2bdE4ad770A425A2Af8d9B2aa8BD2dFAbFa20C2872Fac35ddc7A", balance: _1e36Str }, -{ privateKey: "0x1cF35e42FC10FADFd0bC3E4A0C7ca60fbf9c4Fff34cAb91D8f3bfB36a4bD5853", balance: _1e36Str }, -{ privateKey: "0xADE6b8b2a9FBb8a12F3F6D5036F1d24fAD06EE72d8A94dDa9dCfbA492FCdbb83", balance: _1e36Str }, -{ privateKey: "0xE125Ac0eFBE41A6564D5840CCfc3F4F157fbeC0eCF117bdbfADEE63AED07EaC2", balance: _1e36Str }, -{ privateKey: "0x2BADfDBADf32fC384Ac1d8Ec76C3b7dfeE0c9Fe65e86e2eD9AF926Eaaf316D4D", balance: _1e36Str }, -{ privateKey: "0x63ADbE25a57726EDE7edD8A167C90005Ab887E644Ed153FC373d9D0E5b037AEf", balance: _1e36Str }, -{ privateKey: "0xEa9E947187bB7a746DADEd402EBba4DD79B2dc99e34109771Fd834bd74801e21", balance: _1e36Str }, -{ privateKey: "0x4cEfB3A9BC8046930dAca53FDEe4aDA68062569Ca7d9FfEE1CC0324481D64f9c", balance: _1e36Str }, -{ privateKey: "0xCB4C4c7b1e7D1CabbF9cAD7E158D007b8bEfcE16754DCBeD1c7Fe4DaDCfa3E9D", balance: _1e36Str }, -{ privateKey: "0x30dB9e898f60867761C95f8de8a36fDbaeB9e8C84EE6Ea584CaB8ceEcb264B54", balance: _1e36Str }, -{ privateKey: "0x81aBC14D2be047c44b2Bb3Bd9c15daD627EB1D22143Ca3fEae6E69ae1022eaF4", balance: _1e36Str }, -{ privateKey: "0xa26Ec0bFDbaBBDDCec564D8cB62fE5490aB35B8CAC7AdAEACae321dB78Cfaaa3", balance: _1e36Str }, -{ privateKey: "0xC9C8a8D5c8B54b93A2aE1be9fC3Ac84eBDBC2b5fB063cDBEf1E8cAc6c93B1a65", balance: _1e36Str }, -{ privateKey: "0x59D8bFaAFa292FBcb9f6BD86eF8E9e815bccB2eda7C0e938ABeC04CA0ecF0bdD", balance: _1e36Str }, -{ privateKey: "0xe94f6EFeA674AE551E5bbbe17C4dd9fAa8aB856dF11Da3FFcaB5fa1d5Ac82a60", balance: _1e36Str }, -{ privateKey: "0x3da8E7c26a0d5C01ABDE56aEaa5385D6ABdd968014C7daCe1FaF6946b408CD29", balance: _1e36Str }, -{ privateKey: "0x8bdcC823a4BBe8CCeC87db74B5Dbda1f7Fd7C65DAE441cE0fA02BbD878dBCE3C", balance: _1e36Str }, -{ privateKey: "0xDfCedDFfaEa1aD6C4F6Bc4c6DF5909cf14dD8d0a538D6a3A2c5Fd652BeD3D5aA", balance: _1e36Str }, -{ privateKey: "0xac0edA10193EECf3DaBE6a3FEEa65EdbA7717aAF20Da85B5D87BA1fFD1EE3397", balance: _1e36Str }, -{ privateKey: "0x0B9C8EeC93DAb3faaEcfBebad5beD8FbF3A7cF8dDAbc27308c30D9AE7Ea9F59B", balance: _1e36Str }, -{ privateKey: "0xF9D2BAFA0eFfF3dCBd91c2B0d72e9cFbD3a775CA2FaC0DeCcA1D8EcAc6030A6a", balance: _1e36Str }, -{ privateKey: "0xBC4F980Fcbe2C3A2350a9D0DBBC46A9ceCBCBa2fEB9FbcB4032bB3b49b48A7aD", balance: _1e36Str }, -{ privateKey: "0x1E3DbFEb6D6e9b9eafbb301AB8DE2A7f6BEC85F87fC1F84791dfCc0F4001f5c4", balance: _1e36Str }, -{ privateKey: "0x8a28fcd2B993BCe53af4aba4b7B82D575d3eEcBaB24ba5BE284D34ae772b1876", balance: _1e36Str }, -{ privateKey: "0x81CCa0cfAd64CD74DADdfc5e22EfDe58e995C7A2dF3AF7CAAa7FabF1aC35a0D0", balance: _1e36Str }, -{ privateKey: "0xfc94baF112AbA5e7bAcd557Fbd1BEAbdC19251Eb67808C5e0d7AAf3deaAD6C5b", balance: _1e36Str }, -{ privateKey: "0xAeb13248De4B28015c2F9f9AbABF95B9d5e0a7b7cB6eCffE35d4fcdfece1D4d8", balance: _1e36Str }, -{ privateKey: "0x8d1E2ea844eA4693A83A9e537CF024ffF2c6C4B1EFaEEd3f93d6FF39Ed52cE98", balance: _1e36Str }, -{ privateKey: "0x36cC5DcbE98FfFDf004bfd67ACC6FA0c66e159a42deC26a41c3aEe7EE45C3EF2", balance: _1e36Str }, -{ privateKey: "0x3094A1A521cd728D344EcDbffDBeF471fb3bE3eCCD10ccad528e1EAfDC5Ef9Dc", balance: _1e36Str }, -{ privateKey: "0x4AABdBBC0C1FD66dE45f75f1b4EaaeaBa1dFCf4FB15D6B04A4FC9eeb654BE736", balance: _1e36Str }, -{ privateKey: "0xE6d78BcC9Decc5c5fFA806eEf8d82B7ADf0CD3E498e5EBbb7d5Be5F845eb1AFC", balance: _1e36Str }, -{ privateKey: "0xdC5A99AAc3be7E854B1db468eFB4648ea842CA23FFDfaEDf7af0CABCAD2060f5", balance: _1e36Str }, -{ privateKey: "0xcAE5F28DBcd7B5c9f6ADEFC382D4C41bA8349B4b64ba1C8CaA0c80dA23b1A490", balance: _1e36Str }, -{ privateKey: "0xDC8985bFBBE4bCD6205Fb0AABE0cbBc77ECab3efBdA496C65724bed9CFbaC02c", balance: _1e36Str }, -{ privateKey: "0xDf1113e1B0FB2d60BFeaE72Cc9C891dEA47B1164fd88d0063E583FC5feEB45B1", balance: _1e36Str }, -{ privateKey: "0xD1f6bb4785A9e5bAce3cd950F4B179DF1B5FE26D0bf793FAC3c2F38A9D132bdB", balance: _1e36Str }, -{ privateKey: "0xBbc7fe8aDBA08Ea373E8f5e1fC0BFcFBDcd2919D2326060EF0ccBEDdc00ce3F1", balance: _1e36Str }, -{ privateKey: "0xfC6633fe0e0a3bbC8DF6b989CdEaF93ACF02ac7c7BF4f36cD9A9e3aFe4d605bD", balance: _1e36Str }, -{ privateKey: "0xAe02ae68Cf7f6DcCefAb4C5E37cd4F74dbFfa9f57da20E8b4a8aE1b5A9261AfC", balance: _1e36Str }, -{ privateKey: "0xAbe503E3daFcb8F51D5Ed329aCf868b737EC5a8Ad2cCF4eeAF42BeB1b61383c4", balance: _1e36Str }, -{ privateKey: "0x36aDb5f2fA4EaEeFb653cef8B69CEED7E0FcA9b29bb5B28186aa1b3bcc65Ff62", balance: _1e36Str }, -{ privateKey: "0xfcDC39E65FF1cAdDB4AaE5EA1f6ae4e0d0bA6aDC81BdAf1d80dbb75b8EA4d3E4", balance: _1e36Str }, -{ privateKey: "0xBbAab8EADbA1A5bebb62bfCf56f92F2ED375ae62E08E1dAE0Eea8ABEAE9B5DBD", balance: _1e36Str }, -{ privateKey: "0xD7CBBABC5E8815B2DfcD7bF47BF44cA30ebd3ce43BBcDcE732fC1BD0A5E84D0D", balance: _1e36Str }, -{ privateKey: "0x4E3a6818bDC3F6469cf01DeDBa0Bf380eD0874bC6b04D98C7BF3b8BAe6DCC51f", balance: _1e36Str }, -{ privateKey: "0x6dbe07DADDDbc10bA4eDFEe1BC825cBbbf796F92d0ECDBEcCAAc3E2e383a9d11", balance: _1e36Str }, -{ privateKey: "0xEf121cF484bdE3E42cdAFa125de30e19FF0C4b1cD03D83Aa33bAAbAfEA74B038", balance: _1e36Str }, -{ privateKey: "0x6AB6D5aa6a71ea5ccfeD170CD11b6C0ab976e738a0Cc048ba283EDd55cDBbaa8", balance: _1e36Str }, -{ privateKey: "0x32a82f4E3FFF6Ff896ae0ffd46D51bDD80FcaEebB3ced7e1fCdd2e5A89dBC28b", balance: _1e36Str }, -{ privateKey: "0xCbdc56AAAd7CF95fc02E30B14c3Aa8Dc9d2E078B824E94beCAf3843B1F57d51B", balance: _1e36Str }, -{ privateKey: "0x44A60ee9b417C401Da4fD5De70789DEA95F37af2bdFc9dAD6F8de134fED6A1A6", balance: _1e36Str }, -{ privateKey: "0xAC8cbDb16DcEe88Abea749eDA89AabEFCD2814d6d2A48f9bE89beE4dFdCe0Bd6", balance: _1e36Str }, -{ privateKey: "0x2e68EaC96BE8AEd9A03fc09a0E6c2f0FbBcF357407ddffb8B08f4FFebC7B31f0", balance: _1e36Str }, -{ privateKey: "0x85D8fcbAd8af4BFAe3B59c6E9fD66Ac7cE2CAA8d5CCBF5dcbd65BA80B6B0ecb9", balance: _1e36Str }, -{ privateKey: "0x9795cC55aFbFB6DACC555CEA9388C62c7efF6fB1E7CB2126bd8e28Ce3fdbD65F", balance: _1e36Str }, -{ privateKey: "0xaCCDdd03fE00938451D3Eda3E5AaCAee8e5c2760bFdC0F4401c550EE152A70BD", balance: _1e36Str }, -{ privateKey: "0xdE27885A3FfDDd579A1f2fC49CA2AdCb8FA9A2bf17f8Bb5C3bE206d3CEE2fA4F", balance: _1e36Str }, -{ privateKey: "0x16fddAC6f0c53A2f55deCb2DE1cb6a5dd5f163608cdFEcC2EDCeaf272df5C3E8", balance: _1e36Str }, -{ privateKey: "0xDDfa5Ca7834a41BD9B0CF9FD8b097bfB0E24BCF6369d5fBd1F4Ad8E2EDC91f0f", balance: _1e36Str }, -{ privateKey: "0xC5FbeA4fCe33DEFc62dA8aEbCeCaF0badCF0eA5c3a01bC7BEE4AC49dcaE2b6cf", balance: _1e36Str }, -{ privateKey: "0xf7375ADA2eE20Eb1AEaBD040fdEaF5746ec3c9fB63e1FC652DeC79ADBEc9dBeC", balance: _1e36Str }, -{ privateKey: "0xE4C4E3A179F9D7B43A20592edfff7cbEbFD5a37DA2cA7E43e3281dc3f5Faa53a", balance: _1e36Str }, -{ privateKey: "0xA91Fc6BFB5E71ec65b76bfddad77Eed99CBBEac0762C0A0DBeB5aaa7B9fdEA6a", balance: _1e36Str }, -{ privateKey: "0x9Af5Ce21D3F9FDff4D5564EFe53dAEeC8a3D49B29aB6A1DF0f59b2cf84EB047C", balance: _1e36Str }, -{ privateKey: "0xad882e65Fe7eD77587ADBFd69C3415C4CB7451cb48F0bFAEBbdc4cdAfaad9733", balance: _1e36Str }, -{ privateKey: "0xC7EE373ebEFEE7c50F88efd12EeAEda1C12A00CddA4dC5b3cBa0aE43cD7030ad", balance: _1e36Str }, -{ privateKey: "0xDd3faAb358f878AE18CfDbFaE341dFE5Ae5A258f7c414Aa49cE671840F3a36aD", balance: _1e36Str }, -{ privateKey: "0x6246D3aaeBE3D3b7EbeE7AaC17521AEA757E2dB5ac8fEfadb7CdA125758B0892", balance: _1e36Str }, -{ privateKey: "0xe7e7B752Fc1196BB1eFac88Ce4F52E4884bf64B72B626Bc0ED81d3dd86b75dAF", balance: _1e36Str }, -{ privateKey: "0xBEE65fF2ccfadC89C6E4632FB941fbb2F61D8207b6eFbc3ce0bb25E8d6ba0Bc9", balance: _1e36Str }, -{ privateKey: "0xb197Aa9Dc884ad7C337ACaD5bacdcBB561d382bDbe89cBBDaD01Dd27B8eedF32", balance: _1e36Str }, -{ privateKey: "0x9b7dEF7a3ed1edEa805391Eb26CBAFe2584F1cFCafcb4E1F5b9bE60Eda772B48", balance: _1e36Str }, -{ privateKey: "0x17caa6eF31F545E92513Ef94c298a44Dd92aDb43B3F9d72eED11AC5AdE6b4da8", balance: _1e36Str }, -{ privateKey: "0x51FadA00cDACfb9DD05f296abfE0EaFc626bB6ea7EB6211d643Bc7aA69cd1eFD", balance: _1e36Str }, -{ privateKey: "0xFaA73f397c75EA5A1f355fBDb2EE2A09FfEa65fdeC91D53aE3b2ED3fa00AF47d", balance: _1e36Str }, -{ privateKey: "0xAb84Ca0D5E4AAbE67F6d01F6bddA29aE4e7eBCd6c9cEff42FFc97929d7Fa6Fd5", balance: _1e36Str }, -{ privateKey: "0x7D9F8e884e55d0ddaBfAbd027C8b5aaCeD18d8992dB5AC40eFCF2Cada5a97Fe9", balance: _1e36Str }, -{ privateKey: "0xf7Db27Ebc50Bb1cDFFB36Bcc36Ef4fCe578CFd4249d6DCbF33D99cbFdb54D4b8", balance: _1e36Str }, -{ privateKey: "0xE91FC3FD5BecEBd1284bbe04b2e4C6bdC13B161623748D1ed8CABA358C9bAf3F", balance: _1e36Str }, -{ privateKey: "0x87FecbfAafCab372bd1cA2e2E2A2b96EE5f16B00D02dDDA1Fbb854D211dc5BeF", balance: _1e36Str }, -{ privateKey: "0x0e2eC3BbcE6eeeF0742d705053E16ad212A5798ccADc8FEEF5EFB3Dbd94dfb7E", balance: _1e36Str }, -{ privateKey: "0x8EAbBf1624c4cbEC1Af6cA2E2CCf0FcDeB3E0683D1f0D03FffDfae44BAfe220c", balance: _1e36Str }, -{ privateKey: "0xDFf624AA4B131BEd5E8A0dfBDEF7EF7ab0FfBAAF0fF6D2dd491fFF1eba9EBBD6", balance: _1e36Str }, -{ privateKey: "0x0Fc76fEFf2c59d55F47fD2B1ca5FeF7AbD0ab62dF8ee2BafE61178F0bea480Ca", balance: _1e36Str }, -{ privateKey: "0xD122150Ff0bdE00Fef37D3fac1BA923600C5e43A5DBC9CFB94D6c0eC31d61fDA", balance: _1e36Str }, -{ privateKey: "0x9DC8bB17BFDBab85EAa3C490c3Cb34ACf70566baBF4E8EC8c7B2C496EB0Bd026", balance: _1e36Str }, -{ privateKey: "0xee5d3bEfAcfBcD2DE7b4DB3D0eb5D3D5cd59aeC3ccC1a9AC7EBbBF16a3Dadd2B", balance: _1e36Str }, -{ privateKey: "0x2ddC7FcBD743C0bde774A984caf7C5f7F1bBD7F89EB2Bdcf8cACdde9eBeEFB43", balance: _1e36Str }, -{ privateKey: "0xB8DbfF5dd53E5db22Eb3FE52A4E9cD166FCfDFD5188d6AF9eb380c23eBc7dBb5", balance: _1e36Str }, -{ privateKey: "0xF7eAC55d10F1F1A4985cDcac40CD6997a8EAc06c30fA36a9Cec9BF5E08d807Fb", balance: _1e36Str }, -{ privateKey: "0x4FCB7674f9dCF4cF43dB8bf0fb576DffeAe0FB5Acd5C6cd9fC09E9dCF49ADB75", balance: _1e36Str }, -{ privateKey: "0xED0270A3a48Df5748EdAe6248e1bcEF19eFFeC9bc06B296DEEBfD5eACbdB232A", balance: _1e36Str }, -{ privateKey: "0xF11Bb3Bd5DE647A5ecEAff38fba477Bb628be67De259aC4604CBA9cEEa8DECEd", balance: _1e36Str }, -{ privateKey: "0xaf4FBaAEdF31F081Bb87423e9377a16eB9ad3cF2EE83613EAd3A45a9Ca6cD3bF", balance: _1e36Str }, -{ privateKey: "0xD4EEeBcD2Afe45Ec3bE688e75613Ad157EDcb639BEae0f50C3EF4a39Cf1Ae38c", balance: _1e36Str }, -{ privateKey: "0xF3Cb7434fEfEB2cb8F405fFFfDeD8cC9CBdAFa3f91EFab9fB0Ff3CAdC9dE7c8e", balance: _1e36Str }, -{ privateKey: "0x13B0C00CE33fF846a85e3BcCe2cE1af8Bf6F0aA970108D8428104bd9aAB37eeE", balance: _1e36Str }, -{ privateKey: "0x1A791413E030E3cf5cBAFb66F38be30f5cac2beAffaAC2e1b5ad90bac3dfd2a4", balance: _1e36Str }, -{ privateKey: "0xD1b9b1eD434f34d6d6AFAcF0F9F0d89bd393a312217fecDeeDbDb1816A3bAbD5", balance: _1e36Str }, -{ privateKey: "0x1A9B1DFF6b2f7D50a2f3cde98832Cb0afE104f0E3f5B3Eb13b3eE1a15aEdd351", balance: _1e36Str }, -{ privateKey: "0x119263fD5A3aFcD6045b342d6B8DDd550A5D5C434d9fE3f710AFC873cE1B8A65", balance: _1e36Str }, -{ privateKey: "0x4B58477C9A99abFB76b1534BF9A0E2B361fb7Bb24A012aebfCa9c04EAe0adb6f", balance: _1e36Str }, -{ privateKey: "0xc0E6805251EB7cAFFfd8142cEfDcB0A1ecc51e19Bfdda641FED9Cd4013aDA684", balance: _1e36Str }, -{ privateKey: "0xFfaa2e042bd5abfE8A9ADE87585c8fdF06B23e6D7cBb33dcfa54AcDeA232d6bE", balance: _1e36Str }, -{ privateKey: "0x6d9DE1d8DfFAB66920D681a29eDCbAfAb241Effba02D5D5E578E776C0baF2aFB", balance: _1e36Str }, -{ privateKey: "0xD54C84B9E06a7dfFF4D2a9B935E4388E431Ce2fEa129353FaFE7E1D1f60CdCcE", balance: _1e36Str }, -{ privateKey: "0xFC1EdC6EEFeBe9Bd2C1bd85Bd2b0dEe8CC1a3F244CB06EaDBfDa3374beC2009A", balance: _1e36Str }, -{ privateKey: "0x3cEBaAF9Eeb4D1e1Ae9DbF718C357f17181dDdEfFFC227012FA6848B37cF30FD", balance: _1e36Str }, -{ privateKey: "0x3A4CA9cc6cac7eFA8BEFD2b7B6cA4eD10deFb20EeE3FAA5B5fe75c2d28b9BB16", balance: _1e36Str }, -{ privateKey: "0xB1682AEFfa797bffedE3E04a7f0fbdfBbBBa68eD3F06b40B3bdD6Ee6a1b23AAd", balance: _1e36Str }, -{ privateKey: "0xacf0DacC07571dedeAED8Df7Aa2Ff4a3E55FaA4D5B7A6efC719bC5E6a2D2B8a8", balance: _1e36Str }, -{ privateKey: "0xB2004e04AD5Fddb4E42D6C7336eb631dE66faA7DAe26Fdf2933cB0DFF5081010", balance: _1e36Str }, -{ privateKey: "0xC0AEC7A3dB5De6d058D7AfAE9e3Fa27beb03E7C4013F30785EE5B4B3eb5Aa7e1", balance: _1e36Str }, -{ privateKey: "0x4e742f922E2e6D08382A92CD6b8C1DEC790C1491C2e8DfaC6aD4d8d8897BA4af", balance: _1e36Str }, -{ privateKey: "0x1CF97ac25A0FAffe1fCcA48cf8f3568C3efBD7cbA14bd31f6Ed12dd144cFE2Fc", balance: _1e36Str }, -{ privateKey: "0x4952D74Bad3Aad3af7dD72Be1eF4f2AfaA30Bf39dc2A9B385EE4bEFAc2C05ABE", balance: _1e36Str }, -{ privateKey: "0x569e4A45B022B6cFc6adfeC4C5fde36A6c02B016e6a6f5ea5FAeB5ABFC3B2b73", balance: _1e36Str }, -{ privateKey: "0x6Cb0f1b7f1306F1C8ffE4104bD8cCB7d58AFcf6ADBC4EDD952d2A0F1AD6fE3C2", balance: _1e36Str }, -{ privateKey: "0x75cA12bcFe6CdBe8eAdbCF5e06E3495fb07B4BcdDFE9A1C1CcF7114ae81B64FA", balance: _1e36Str }, -{ privateKey: "0x2A5DfFAAD6E68a1DDDC70AbD071B8e532Be99190cBA1E6A81C6A9C8a953E6f5D", balance: _1e36Str }, -{ privateKey: "0xE28eFDfcb5D7Fb1EB9f3BD3BE4398b6e104E83fed8717a12a5DD073fF9cFA445", balance: _1e36Str }, -{ privateKey: "0xdE1aaC5De2466Ff0d394b2CbEccaeaA18573e1BcbAb6B3D811e7ba49a2d44Fef", balance: _1e36Str }, -{ privateKey: "0x14DAB09e2e0E3aF98Dcf620A2Ee9bEE3b3EE20ABBA1023066965DAe04cFd89D3", balance: _1e36Str }, -{ privateKey: "0xedbfeaDCd77B0F227dC5d68FEce8fA37e7A5D21FdbAE052ACF57cb6FedC8eed1", balance: _1e36Str }, -{ privateKey: "0xbFAfe0DeBf83D6beAfc13DDeC6498b831BCD1E6AA6A8Bc693a9D31BD1AbC85aa", balance: _1e36Str }, -{ privateKey: "0xE640ee1a12DA75Ca5825Ae8aC6B6Edb0fC5DBa20AFf35aF03eac0179Ae5e2AAE", balance: _1e36Str }, -{ privateKey: "0xF64562e905E8FAE2a6447AFd0FAC02a3ff7e61147D388EaCFC48b0Bd9dA3094e", balance: _1e36Str }, -{ privateKey: "0x6cbaE40CDABd6Db182fD43FFadB7DEcA9bDCb1aa3FcC95bcfA899f26ACE23F32", balance: _1e36Str }, -{ privateKey: "0xe5eA053EAda1f6CdFFdC0A5f5Fe3c794e1Fc832288AA0Ee8Cc2b6C994FFAc27C", balance: _1e36Str }, -{ privateKey: "0xED17FaA5c1AF1EF2Ca7EfebE6C6cC6e7EE6277bbE07Daa9fBe9C3de50b4F6b5E", balance: _1e36Str }, -{ privateKey: "0x6c85fcbd6568c50b9Bbbd1ac670a090DEEb9354c7A55CD6DcFb9457015EB5aeE", balance: _1e36Str }, -{ privateKey: "0xdfc4F15EA695C3Fbce4DCc68a5fa1FAdA3e2Dd3Dd6efCa635b43Cb78bAb7e8DB", balance: _1e36Str }, -{ privateKey: "0x9CA9A803a72BDE625e88B4eE76417d76EEEBA06cc4D6A34eE21CcB8dE8355cAB", balance: _1e36Str }, -{ privateKey: "0x3aE0FCFe2D4dCEAef36ba8dd77d9FBaCdb0ABBb319Ab5E35bE5d066fa7F1A0bE", balance: _1e36Str }, -{ privateKey: "0xC9fb278eF294a4E76Ac6eAD7e07B5356aA1cFFa0398ca8917Ae50046AACA2d3c", balance: _1e36Str }, -{ privateKey: "0x5aBd85AdfEA6F6C0105A95bAe64245df89E3Dcb981A215DFB1cc8feBDbE51309", balance: _1e36Str }, -{ privateKey: "0x34eADBbEcaF8AcB847Ecb88C1FDc7DF7AAff7d29dA6056E7ff46ec6c2ddA1c83", balance: _1e36Str }, -{ privateKey: "0xcEA9CE18c75de3C9de8fEBECF7a4083B3682dAbB015cFa24ddb48403aBabbF44", balance: _1e36Str }, -{ privateKey: "0xd0D92cf7F48a1bAA7a191cbd14551DdC2298DC01Df41E00FEdDd4e332C0BcCc3", balance: _1e36Str }, -{ privateKey: "0x8C06fCDdcC8910Ffd0cF2BCbEAFadE311e07E41c6d1529ae8A9286708fbb419b", balance: _1e36Str }, -{ privateKey: "0xeAcc09aBF39adA7787ccBc0ce7614d4BF7B3fdebba62cA5fcA54bC6B8beBCDcd", balance: _1e36Str }, -{ privateKey: "0x43843a03FED086124E9E9412eD4c239cDC3c0f0d6a082Ee11Bcf619Fe7fc20C7", balance: _1e36Str }, -{ privateKey: "0xfE9afcc2b94aA9f36C7B5BbE2E38DEBB6fB2f1cdeEfed73cfEE7CBebA2dD75be", balance: _1e36Str }, -{ privateKey: "0x86dE879706AF8CEab8FF52e7B2f868aeC684CBD090DEF0c31Aef6ee883B6376D", balance: _1e36Str }, -{ privateKey: "0xfB3bdaB2695F8A83EDf72Ba8aCaE5C2B39Eee8E2E9d537DB096C6CbBeEE06eA3", balance: _1e36Str }, -{ privateKey: "0xEEe76B8a06dE1A1eb06caFe7Cc7BBeA3B6988a8c7F7A68F8FA15acb0e93d08cb", balance: _1e36Str }, -{ privateKey: "0x7c3B1b28cFbcdCEaFF3AB6571ddB6AE7F2b5a8dCDd662B3cF8B3A776DFD7F98D", balance: _1e36Str }, -{ privateKey: "0xB34a3a5D78f971EEb981fa80FB0e6A58Ce05A1Ba114aA5AEBea2eb9ffea11e31", balance: _1e36Str }, -{ privateKey: "0xaEecbf1997bFb16AABd10deDEC3e8E35607a9318EA674fd02AdCaEf2ADd6C5dE", balance: _1e36Str }, -{ privateKey: "0x5fA879ecacFc908Be85f4Cd86c9E7BabECCc1D370E15Eb43DE1c189EB1007D5b", balance: _1e36Str }, -{ privateKey: "0xDFcF7F9D2bA7a827Ab9a9C9efADE033DaE278F29D83C63F2ffFEEC0cAbEB53a5", balance: _1e36Str }, -{ privateKey: "0x2ea09ffbe13F7Ec873bbD2CabbbE03E03D890f7F1e945a5F5bbf3CEE1eEad2BD", balance: _1e36Str }, -{ privateKey: "0xdeE5D3565B304EcA2e6AFf98ef43D70Ecc6F8891f6E5439e587d2b6Aaa6eeAda", balance: _1e36Str }, -{ privateKey: "0xf5aC589Bc0F8f34EFD9040401CcAAB15E6A02bE705F9c4584e9edE95b9F1DEeC", balance: _1e36Str }, -{ privateKey: "0xEC37cdAceFAad773f471cDEf86B5ffeF71EBBcCA4A0fF216ec7145a6d3DA8cdF", balance: _1e36Str }, -{ privateKey: "0x9aCCDFBDEdf12FA7613cFa96C9Fd4BE2B5eE6C3880CCEAdD7A356a720ceE9b9B", balance: _1e36Str }, -{ privateKey: "0xaD5F5A875AB4DEE5aD3F93059ee23c9D2BB9d23A1ce2E5Add6Dc4F2CA3B5Bbb7", balance: _1e36Str }, -{ privateKey: "0x4215B8c7f0eCAdacaBD7d5Da87B8CcECFf74C4EB3E91BD27dcF7feb8fBD1dE3f", balance: _1e36Str }, -{ privateKey: "0x4c051E68E2B5b056379f500E95e312132C44DE84dd637ca4150EEfae41aCfBdc", balance: _1e36Str }, -{ privateKey: "0x3aa945266cDD97b4c19045562AFFb2D3bf0d4F63ACD5E15a0EeAcA65C2eD85fE", balance: _1e36Str }, -{ privateKey: "0xAC57f268eaBBA0e13ECeeea1780818c3cFac17623d287c5ad5Fcc4590fe82AcD", balance: _1e36Str }, -{ privateKey: "0x453a0dD29016dCFfd21C7BDaaF7783488FF6cC1FDa3fccEAA832F284fA9Be83f", balance: _1e36Str }, -{ privateKey: "0xAcA21387826da43e4aDaf540247D00bfd2cFd3323BDfebDE830449fb99FbC47F", balance: _1e36Str }, -{ privateKey: "0xFDeb8788BCE849c169ffb03880a88Dae1242aABDcAf4E4C87Bb7e1cfEC669D44", balance: _1e36Str }, -{ privateKey: "0xE82d0c7A0ACa07c38368f4Eaf5B84fFFFCA008de4FefA6a29DBA41ABeFaB33Ae", balance: _1e36Str }, -{ privateKey: "0xAb0C7f0Ec2b80fA1a9f24B33BB0E0DeFe6Ca9E59C73F4aDed9158Dd90c8c1d5f", balance: _1e36Str }, -{ privateKey: "0x83253fa82C8d1CE59AacE5A8bEAE8CeECcD67fFAEBacF5afcD852AFddcF6fEAe", balance: _1e36Str }, -{ privateKey: "0x333cF338D9B19B7F8fFEeD6e1b1DcFaEB3CA0ebF2B88E204cf94B8Caf1BfAf9c", balance: _1e36Str }, -{ privateKey: "0x8BA02c034fBDdE7AFa0bbb8B987a76CE64deBB9AC41F7ABFDEEE2B2Ed931F8F7", balance: _1e36Str }, -{ privateKey: "0xAd286026FBeA1Fc9Ea7BF3ea6ad8e9DcfCa906aBcdBee44652c6C7df8014dbfB", balance: _1e36Str }, -{ privateKey: "0xeB40c44Cea0AbAbD14ac3EC65ddc6A4E505D87cDa732932074a1Df3F960ED9Df", balance: _1e36Str }, -{ privateKey: "0xACDC321B9Aef943b39De3bEF9fb605515Fdf3ecD2C32aeEee164fCF2b2efBBee", balance: _1e36Str }, -{ privateKey: "0x8890f0F13CEaf7fB73F49C5b0aADD3875A3A7Db2aFdd5c265DF0B3DB95FeC8B0", balance: _1e36Str }, -{ privateKey: "0xE73A396E2e59b0c67AEac6aFbEb3317cf66e7b5Fcb01afCb7881c3D2Ac8FBb7d", balance: _1e36Str }, -{ privateKey: "0xAcFFEAD041586AAdBbc469FbF3f3ab3BBfC4c1fB9cD5EEb913Ef45CcBeb1c93f", balance: _1e36Str }, -{ privateKey: "0xABbBbBe029BFFB939ad609a964EA219fEB512B243EED4894f7BDBCE1EdCD22BA", balance: _1e36Str }, -{ privateKey: "0x9E65dBbeeA0Fdc8aD43de722a4c85f69Ec9Ea863BdaeBdf76A821cC1B8Fa6bEa", balance: _1e36Str }, -{ privateKey: "0xD6FbEe0391305458fbE2fAaba3db11Ad9B6Bf81ed82DFA8F41fb5662F178f35B", balance: _1e36Str }, -{ privateKey: "0x3b5a174AbC1E1a8191A9D325Eb867Bd97Ea790B9f4DA3a12EEb7E21dD76B328c", balance: _1e36Str }, -{ privateKey: "0x075EdAAfc15f218502Ab2561Dc8A89a374586bdB96d1d7bdBDdD0b281Fc715EE", balance: _1e36Str }, -{ privateKey: "0x52d92ea5Fd62aafe0fE96Ceaf8Acd5c6AcEa8Ecb9fD02148Ff23DA0AC8b9f21E", balance: _1e36Str }, -{ privateKey: "0xF2F0b801f0B4e939bc7DA32c95C84EBC5BBe59F4D0Fc7Bdd5E0EFbFbF8a64967", balance: _1e36Str }, -{ privateKey: "0xDc239FDA9a0859D0057CcC5F433EADCc49FA9Ee5503EbeFaCDeF4633CD14AB2F", balance: _1e36Str }, -{ privateKey: "0x6eA7F30feaf205c1868524a1ACc328B3Ce5f6f23d305A6b05aA28DB26BDa6EB2", balance: _1e36Str }, -{ privateKey: "0xFAba7a4845A9fEb3C79dA1F0EcaA2be7A4086289E3DDee49C7dDb72B1EA92dfd", balance: _1e36Str }, -{ privateKey: "0x9adE34b5469fC3eE9Da029eECbD06BA53cbad5FE4B0Ad8a03c9E0CEB7564faC6", balance: _1e36Str }, -{ privateKey: "0x3EC655DaC1e67FAd1833cBAA3A6BBA132837Cf1DB219Fd9CE91CA1742BF6a01a", balance: _1e36Str }, -{ privateKey: "0xB7BEA97eC2900C1a4F8e97A4c4FBFaf52Da3B0dEf9d82bDfa8Eaf4a56a7efdf7", balance: _1e36Str }, -{ privateKey: "0x1B63D8AA4Eb2EF8cFADE8E75917BeDFB6DcD62B9dcC5cDC562B7312d6E7BBeE2", balance: _1e36Str }, -{ privateKey: "0xae3E26D059aeE78FbbA2EA50FEBBaf8223069Ba0E2fCCb6AF91dCfEd0e3Ac160", balance: _1e36Str }, -{ privateKey: "0xf0Bc670B9d5ee77E4dB8Be87113fE2B838bc9BA5EC6AFcEA0B7b9E5E7c4BcAA3", balance: _1e36Str }, -{ privateKey: "0x834A781a2fdECbb5fdA18FAEEeBc2b8661C8C9528cA25fecEc2F8Dafa526c9AD", balance: _1e36Str }, -{ privateKey: "0x5dD92fdc8bBd655FDfF9C0D487f6153dB35EdDA66c0a99a3edefDFcd263b672b", balance: _1e36Str }, -{ privateKey: "0x5A3867C3D9cF4EeBcdAdCFc3B8ad620C2Ba1685ED1831C7E3Aa46a3a5edC81Aa", balance: _1e36Str }, -{ privateKey: "0x5Fc84BC3594C78b18fEfAcAe400d5bd8f92B9781c04F38f7f68b8Fa1e2Ba0F1a", balance: _1e36Str }, -{ privateKey: "0xBCF2af3BD42fDD11Bd6a7A1cBaA4C7eff1CDF0C7eeF772cca24Da8251C39EBfc", balance: _1e36Str }, -{ privateKey: "0x0CDC9ba2491f4a12BfDfbc88Fc3A5828DDd6CA0ed0c24192A4855aEAEd73feEf", balance: _1e36Str }, -{ privateKey: "0xbBa7af45Cf2ed5d0DDBca87eBaFf5c0FBD768c54ECcDb430F1bD86B66D253323", balance: _1e36Str }, -{ privateKey: "0xD73EF609380f56b17e51A58556155FAF1Ee459e0cf72Aa436fD6EEEaa8a2f9Ff", balance: _1e36Str }, -{ privateKey: "0x253Cc5febb863bB580fD5aeDC8CE7CB879F8aEBF1C2A503Bd909bA9B57D92136", balance: _1e36Str }, -{ privateKey: "0xB783db55DCfBc45dbdFFb60E612D04492eb7EE3e0B898a5a1e43D78e0eeea522", balance: _1e36Str }, -{ privateKey: "0x69c7Ea51aeaEFaf96212b2d28B1daEdA9Cb4fA21aDcdE06412afa12AfED45306", balance: _1e36Str }, -{ privateKey: "0xEc568dCFA000F1Cd0db8f17cD185AbBcFAdB88dDE8a64ad8dEc261913C6DBba8", balance: _1e36Str }, -{ privateKey: "0x9e631FCB88A2B593818DDA6cf81fEc447a5Af9deb77f3A986A0c7c74E7D3EF8a", balance: _1e36Str }, -{ privateKey: "0x5f0E9ab4B5CeFF6CDdD4F78C13E86cBaF4E4df5b729F1E16B9DFE2Ec5e46A1cF", balance: _1e36Str }, -{ privateKey: "0xDBaCC98111ba14Ee31e9ED8777660DCB97Ce40dc5cF5DE69F165c63adDC28Cb4", balance: _1e36Str }, -{ privateKey: "0xE87C91Bd989D5a9eb7d120ca25da7A25bf8ebE86d4a3B9cC1B3E09c1C58db3d7", balance: _1e36Str }, -{ privateKey: "0xDE4aD389dcF8DF1b1caE8cF4DdA4CfF7cDAdc5B5a23BBFca2ECCcF4AbD461FE8", balance: _1e36Str }, -{ privateKey: "0xfdE6633f3aBd558e28ADdd3d1aD3839E8713735cBdd85fAff7A3aBAb8cA691B8", balance: _1e36Str }, -{ privateKey: "0x3c96e806cEc3f4cCf876CfA37dcd53AeE1c1A5aE7CE39035B2bEf82362A1E830", balance: _1e36Str }, -{ privateKey: "0x40e68C840815FcaF97BdCeaf3beaDe6e03348c7BC3fD9bA8deD178aBc5233896", balance: _1e36Str }, -{ privateKey: "0xBdf2cdb7c0CbCF395eF6BAB2bFd1679eC5a82Bed061Ae52AbAee00AEc60C1CB2", balance: _1e36Str }, -{ privateKey: "0xDf1A11ccD21EdBe679d06f34efDe03068F171B6f47c71fa2E04fAcE00fCe43aA", balance: _1e36Str }, -{ privateKey: "0xAf69cc6B32E02B4Cf66Dea192AD06973E45ACadef2c9fA179adbD1CF02bc04C6", balance: _1e36Str }, -{ privateKey: "0x3dEF97AeB6FbE3495feE1F5925d8f3bE60aEB463E6dC39B8A586C1Fcc7603eba", balance: _1e36Str }, -{ privateKey: "0xCE8b10D29FB25EbDB566aFB6AbdaFF0C27E02c6A5F43E9625860638317F00dA0", balance: _1e36Str }, -{ privateKey: "0xBFCB6351C9bDEf5E1C6E4DF51EEBeD33edCFaca35cBf7B3B97c25cce7edAb380", balance: _1e36Str }, -{ privateKey: "0xF4A7591de59b833Aa4FDcaFe0ABA2C7eDF9DfA43DbcC6f7F568Af7ddDBDFF50d", balance: _1e36Str }, -{ privateKey: "0x6AB2d35FfEAFBC1BB2f13B5A6A308f97fFe11FE2e76F825A27794325DB2Ec1ca", balance: _1e36Str }, -{ privateKey: "0x4f32bdB88ADD636fEAdbd999b1c6a5EF378ae941fb6C0b77B3bD84E2EC0E875e", balance: _1e36Str }, -{ privateKey: "0x7cB5cee3f0653379F9AAFFCE0C7af0F454bC2299932DD2421ebcBc2EBAcbAAda", balance: _1e36Str }, -{ privateKey: "0x7448AAc0503965eFfbBCC446F6EeC7c1563B74c3FC9B62a95E011dac6A5a63E7", balance: _1e36Str }, -{ privateKey: "0x153E8F5C1DD71EDAF5B0B433f65bF19D36455Bf8185d6aFf59Dc62261852f7Ca", balance: _1e36Str }, -{ privateKey: "0xAf47350Bb5ddA5A2Fd36CbEfb32deCC587ceAcb4b4eF6fAeadf4e3Caa5A5cc90", balance: _1e36Str }, -{ privateKey: "0x251ffd49DEAAbABbFE4bCd027c0B2aa33B6f12Fe6E6b5afac4D4347D70831ca8", balance: _1e36Str }, -{ privateKey: "0x84CC45bF6dd0aE47D78F63b7BBEBBFE6d02c9eB1D69ec26Bd9c09c2fF7F3f8F1", balance: _1e36Str }, -{ privateKey: "0xd552e3E0B7aCfbB3876972Cd83E74eF5F4Fb30578d5DD959e4450EeaFDddeDfF", balance: _1e36Str }, -{ privateKey: "0xDd42AfaB5eDaA95ac60fbcF775dF9b6d9c4aabEFEBaA68420ECe4Aed056Bcef8", balance: _1e36Str }, -{ privateKey: "0xFb4CBEdD311b5AaF4D2e37800b6dB32DEb9394d03Bff0dDAfC1Cce59DaC1FFEa", balance: _1e36Str }, -{ privateKey: "0xe6CF9C7c5d3DD2cDcedAAB0CAc4dE85aF3e9347ddAdcBCFee3CA4Fe6D28cB88E", balance: _1e36Str }, -{ privateKey: "0xd3A4DeaFcFe539dfE8f1A6e8dc3a8dDaEb4516bC44d9bD6a9243DcBb30FB75A3", balance: _1e36Str }, -{ privateKey: "0x11EDAc3bC10EfecD0CD375A0BF13d89A983344bf9B22EbE2d9FC6EFfb80Bb2Bb", balance: _1e36Str }, -{ privateKey: "0x8E782d3EaeCdA8c54DA8ABAE38Cbfb2bfd602FF7215CEce826Af5Fbdf1fb467D", balance: _1e36Str }, -{ privateKey: "0x71f6eceF5AADB7Fab94bCf7D2A08F4B16ef68Eb0372a535442Ff83ca2b9B77A2", balance: _1e36Str }, -{ privateKey: "0xAFF096e96B9a7Bdfd6ccdc39AbF651fBe0eeD4E205Be3339A2Fb7fBf49e89E4a", balance: _1e36Str }, -{ privateKey: "0xc3Ff65464AeBCCD1a16Dab59fAaaFb19aBbd3a9125262e5fa9AfdBAF784cA0E6", balance: _1e36Str }, -{ privateKey: "0x5764DCeF70FD8D6d7B6f55c7eA5Ee62ea6bA43e930dDdF1E9DD9CCa85e8174Bb", balance: _1e36Str }, -{ privateKey: "0xD79BBBAAb8c3355C42b7c9FFb4F81EcAac4eC921fA0a05D91aee2f6EA00b61bd", balance: _1e36Str }, -{ privateKey: "0x63345BF93540bEDB80aBA3d19B51F5ffbc15A603C3a0EDC5E3a59b04fA991bd4", balance: _1e36Str }, -{ privateKey: "0x385dF5caB7d7bBbb9FbC92D1EDEf78588cBbD46719470f9f32Aa5cDD5A0c29Fb", balance: _1e36Str }, -{ privateKey: "0xfE7e1bA71e0F2Cb1c9dad07c9DDB980EF3Cdaf13cC57fE6CaBbecD8DF19ea99A", balance: _1e36Str }, -{ privateKey: "0xCce7F23c1d5DDF28fc6F2CEEf6C0d21042df9baCF769Cc20a218966e57006C4b", balance: _1e36Str }, -{ privateKey: "0xdCAd70Ff4468Ab5edFebfDedee5Bb10B27eee2Fb3eEbDfD5B8dedD6bB84AD9Ce", balance: _1e36Str }, -{ privateKey: "0x3BFB1b46E3CdF64469c8fF5A2C8A067eBEAa014fC8ae14B8A2BD6734be29d02D", balance: _1e36Str }, -{ privateKey: "0x3E82af9a9DC1EFFebFCA6DAA8Bb63EEC129D0eEDBC14D2ACcDfebfff11DBfbef", balance: _1e36Str }, -{ privateKey: "0xF4CB2d0A9a508BADDfCDa402CfE5dFB4AdE520BEa3daf1D6Ff5dEC4c35b7317d", balance: _1e36Str }, -{ privateKey: "0xd99d7eA3B33ddA5735A17b3B5eDeb11eA5c1Ee1F93dA9Ad3DA1f4ffC3a822Fb8", balance: _1e36Str }, -{ privateKey: "0x6cAd93AadE1442A94cDfFE0b7dA02e0C8dEB6eCEd501f2BD433F6852ECbC3bfa", balance: _1e36Str }, -{ privateKey: "0xb03f948e1731F97567BaffADEc55aBf3AAdee2dAD50bb10BC1b2b1abFABdEaeA", balance: _1e36Str }, -{ privateKey: "0xB39Fba81c809499dC8E4a343A0F0cdF7c5Bbed3cD2cbA693d1057Df9E7d0CE55", balance: _1e36Str }, -{ privateKey: "0x07A4E933B6aEbC27ccb0E8E2E099aFa0E5bAEf4f2Dd6dca97cE30293ebD424e5", balance: _1e36Str }, -{ privateKey: "0xEf03De1d11adCBfB8C5dFe5Bae858917b64B8CA3ce2EB66Bd838A4089a28FdDf", balance: _1e36Str }, -{ privateKey: "0xA3cCB3ECDb856eb1FEF7D254Ec3BB4B54eD5fF47deCB994630bBEC6bCba0DFB4", balance: _1e36Str }, -{ privateKey: "0xFdC9deAB83e6eF5c81fB93BBBc1dBC6b4Ccd4c70062729325D3BE4e38F3dDDea", balance: _1e36Str }, -{ privateKey: "0x5D0afC0b07AD3DB744FFe075FC8895BA2Fb65fBFa09e246B73b5ef1bDD1cA70d", balance: _1e36Str }, -{ privateKey: "0x6Eae1dE8A416E69Fa4EC1EBECC5f571C0DfeF491a4fd02FCCa42BDE0026Ccaee", balance: _1e36Str }, -{ privateKey: "0x9C2bf2fCBEAFAaCA4cB9403bfB3c8dd2C8b0840a498BBfa729CfFbFd3d8aE5FF", balance: _1e36Str }, -{ privateKey: "0xE23d7aA7e018ABD14Bf41E8aFcbd7CAed2D67e9b00e9402ADcdd156AbEeb8A9f", balance: _1e36Str }, -{ privateKey: "0x9F1aAccb4CFc39Ebf3F42E7dB0710ef526d869572Eb3dC22bbFACcbd252ae6C0", balance: _1e36Str }, -{ privateKey: "0xB8bcEc5ff2d4BA1f91e8Ed92D90D4CBb50e968dedb5a79acF4a3aa7A5fCcDa1c", balance: _1e36Str }, -{ privateKey: "0xD3aaee5ACcfB2DdCffA259065Bc184F4e7DEC1aE8DCABDf18C4b4fc2abA1c218", balance: _1e36Str }, -{ privateKey: "0x8A4948Bf12EdA92dEEa3Ec9338ce2Defc58af2bAaC99d5E50fA3fcEBBA542FAc", balance: _1e36Str }, -{ privateKey: "0xAc0bB26d9cD75969c31A2A2f8F6e4DFc6510B43A86d1679d04aba8cF8F225711", balance: _1e36Str }, -{ privateKey: "0xACbB5b5E6e1A61CaA2E53Ee1cFeb3A9458fae0C53EF764608aB0ed27305F5eFd", balance: _1e36Str }, -{ privateKey: "0xeBbaC1dbBba6a56A9FdaBD5FE9Af262c3C85B6467a364fbEc6E34d0FED1378B9", balance: _1e36Str }, -{ privateKey: "0xba802E4CE2EEE1EDBEb9a03Bc5d1fb6E99f1EcD5a107d2DDB5FDC3ADdFB7a6B5", balance: _1e36Str }, -{ privateKey: "0xaBbB7bA0e420F514FdbdBDc47fDB90C717eC0E6CB1c7E22e04feFf0DbB59B82b", balance: _1e36Str }, -{ privateKey: "0x0aDea8abf38abb72E1cd3352053eCcaE11FeddCbFC16Eee3EBf72FbCcf1cfb27", balance: _1e36Str }, -{ privateKey: "0xfC925DbA92ECd1ECfA8C25b85Bab5cdb790097e8Fba1F3bf49EB099Db5eFdEbc", balance: _1e36Str }, -{ privateKey: "0x1EE9b224DE0F846e03E51EBDF8fDf57E0D34E32bEAb9EFd5Ff8E57C1D90BCa8c", balance: _1e36Str }, -{ privateKey: "0x0eEA4Bdf42CAAB8CdacFA6cE3DCDc187F2E4F224b1cc156F337e7F819a213613", balance: _1e36Str }, -{ privateKey: "0x80E925DDBE74f1D9F7a9D2AB8Dd43EbeF3Bcf30DaCab99239C9d0bbB1FfdaCca", balance: _1e36Str }, -{ privateKey: "0xa2909a0CB5B868d46AeD0AB97fFaeEfE7B8A6778AebAf2c18bf0CfbCe2B22d99", balance: _1e36Str }, -{ privateKey: "0x52a8b153f9B7C8D6acF3Ce87DBb41f5f9B298EeedD788e23AF0a1B1ABEfCD42B", balance: _1e36Str }, -{ privateKey: "0xf0e36A9EDBc1E25376da9aDcdfBdF8aBA437BFaA96B4d8c08dFdc2abE036B9eA", balance: _1e36Str }, -{ privateKey: "0x94F1Cb0D4A2Cc8087fC4F3bEDf51bb6A0E2e3aD4aA8bCbF80eACb8e04ddA00eA", balance: _1e36Str }, -{ privateKey: "0xcCB0Cd6F2a01bF27fC92aCbCa927D14FC3c3f74E48Fb4FE0fcA8f2fDEEAcEDC0", balance: _1e36Str }, -{ privateKey: "0xaDa14CF43Dd2721D8Cffc0F1bE94e4256D282D3c6aC866f7a2Ed9cc9f10bdDDF", balance: _1e36Str }, -{ privateKey: "0xBEDd67fBeF5E0e11DAB1273023FEF56adaff0E5CeB1ba46beDa76AADDDffaF45", balance: _1e36Str }, -{ privateKey: "0x32e67E8A77ED16AC4aDbA35f86bCDeAc12A6eB1b4dF7FbBcDCE999fAb44Ed5F9", balance: _1e36Str }, -{ privateKey: "0xD483A0DcDB0B3a38e80AD9EfC5D581003Bea2FDDF6b6AC5bbf6baAfA4cA5C4Ab", balance: _1e36Str }, -{ privateKey: "0x9808eDBE3a4E167D5Ae7aE231D6968a02dBfFDbA0D43A625eb3d1BfBAfBa31E4", balance: _1e36Str }, -{ privateKey: "0x1D2ac2bFDAA05C0AbEa6E1Fd02acCaE2bEfb625749D8cde7762395e9CFdAeD93", balance: _1e36Str }, -{ privateKey: "0x719b0aA9aFa4fA4BF0DEbB5fC06AaD3C4F14199EF25a6D9Ba2E5e8dD24E07cF1", balance: _1e36Str }, -{ privateKey: "0x6be44Cf5f014dBf3Da3857dfbdAFBC1C9Fc53CBC8BB92b41c05ebD9fD418eeaB", balance: _1e36Str }, -{ privateKey: "0x9fd0135A35CdEfcDBaa2ACEEFaA13A3b27cc9E281e0b2BadadEbD039c2cC4aeE", balance: _1e36Str }, -{ privateKey: "0x7bDaeBcAAF701Acda8012E28BF6b75717fcc1CABbeE5aE4eecB7d440cAcbCe76", balance: _1e36Str }, -{ privateKey: "0xe92cEa5501d4F89f1DcC90FbbC41c3FddB62F3a8Eaf5b5cBEA0f311eb24Dd450", balance: _1e36Str }, -{ privateKey: "0xE79bF44Ea2eeBFce2FA0DeafE4aEB7da7deb7254E6686CB8C7Be4BA239CE4D8E", balance: _1e36Str }, -{ privateKey: "0x254ff08e9eaDAAFEC23B7AC60CDDEcd2E2b4d9a7fF0Caa8Bcbcb116a1A9b0e7c", balance: _1e36Str }, -{ privateKey: "0xACEB5dbf9E23BCaAE5C181BbeAE9e62E3cbD8CD0C64DaCDd0DFBcBeBFf0d5B61", balance: _1e36Str }, -{ privateKey: "0xEC2fB180f03d6f2Acb429E7BE539eD6CcAF9Df9b3D470265cbD13dfa35d87a80", balance: _1e36Str }, -{ privateKey: "0x3fcAb28FfC9bBbFf6De7bbf07aE5cD4de4cdB56F377adaBD5B16655C7151f8C6", balance: _1e36Str }, -{ privateKey: "0xe08efdca582B4eeB3A9bb0decc5630CFEAc0F4CEeFD7f0e29A7B8CB81EfEe344", balance: _1e36Str }, -{ privateKey: "0xfAC7ABC31b79E6FFeacf6917Ceda2ffa174A2fBD46d029a765BBabfEBc3d8Ee0", balance: _1e36Str }, -{ privateKey: "0xb3f3Af8a0919CcdC870DCa3B22510BAa798082dfa5f81E82af9CA9C78f107fa3", balance: _1e36Str }, -{ privateKey: "0x7BFBF12619BBFd18efb88e4c6a3eAD5Bd2EFf3902b3f4Bc7FAdc8ada3eB74939", balance: _1e36Str }, -{ privateKey: "0xDdeA634E20e9cdd148F43c1CbAAB0E3f690F2D188B9CaCa8f48A0c2268F70e7f", balance: _1e36Str }, -{ privateKey: "0xb2D834D50adEdF57ccbB1e94bE9BDDCF8daEd6Aab19b76a59E1c52eA26E13bF3", balance: _1e36Str }, -{ privateKey: "0x0BFcb562ADdFcEaa616F4FE11C911EdD7F2Ee274198260cBF7de55CB7bb0FeC4", balance: _1e36Str }, -{ privateKey: "0x33eeD6CE9F78220Fd4ECA8c25492C8e3A96d6c3ad2Ec11fAe8a7fBEdbC3a120D", balance: _1e36Str }, -{ privateKey: "0xDB28B7adaED1df7daAB8Bd5DaBBf42E0da2EE53bCFDaEdc2f2e49522DA003333", balance: _1e36Str }, -{ privateKey: "0xDcc25ce4dcff179c5487EBCdfF0ced69aC960cAbfFa3b9aDEEd870eebED6a48f", balance: _1e36Str }, -{ privateKey: "0xD053efcdE1E4d9deBAA0BaeC3c16B70f319Dc55C142C6fB92C53EDbe6be6cB11", balance: _1e36Str }, -{ privateKey: "0xB3f97862464ee31Edcc2dec54b52C30d00dDbc2bBbacdc14dF3cfEA4cEF8BEB2", balance: _1e36Str }, -{ privateKey: "0xC2b8C2f23159Ee3AEF1d295be9Dfed4CBbB89A4cB0764B9FaDb54C4FDDDd3a1e", balance: _1e36Str }, -{ privateKey: "0xA33037cF3b1fc82DE8a0063d9e9FcA3EdBcEAF2D4FB2D15c8ae05965De7b95fA", balance: _1e36Str }, -{ privateKey: "0x1dEF3B3f0C8E3AAC250b5b5A394036b5dA1BF4acA74D66A2d00A671503ACCcfD", balance: _1e36Str }, -{ privateKey: "0xCC4857E4F9E76c3DC9A714583831DFE83951e3ccf9F9fa4AcfCa57Cdae0aE841", balance: _1e36Str }, -{ privateKey: "0x451DFaBe73E615De55ecf7c0338d820c8dc3Cc92FFb565d0feCDcBFEa89AfacE", balance: _1e36Str }, -{ privateKey: "0xbbD7296EdAaEdc63bf6ea0bdd8EE3b59Aca28fa8A5bBab7c4bcFaFbe77ec60F7", balance: _1e36Str }, -{ privateKey: "0x47Efc980AaE4954A13Ce3b4cB6b6BB867cB9feA9ffB0a26e3BFC5799b3bace7b", balance: _1e36Str }, -{ privateKey: "0xf3E4753b1b4ea2F4BddBBBE74d6899780cAc522d9610CE9DCd246cdA63Aa53FC", balance: _1e36Str }, -{ privateKey: "0xD4bD7ad31cf23ed95d4be3bD46a61Ef1fa296f0b5c17c0FeCCF3077E5ecadb2F", balance: _1e36Str }, -{ privateKey: "0x4B1acCE143c98dC1CC130aCED1aCE9dd2624E93BeeFe99dcd40281fDb5B96E9A", balance: _1e36Str }, -{ privateKey: "0x0b7afB042f5c7D9FF25Cb9f68E34E019A5EBDcB6aF3f5fd9fDCd3AfDe095A8E2", balance: _1e36Str }, -{ privateKey: "0x0A52eec4DAA3ae0EA9919b791E0d29ffA1A8a3ABD1B9562e4a4AaA1B3BD8a59C", balance: _1e36Str }, -{ privateKey: "0xd1CdeAB1Cee995Cd6Ed7adBfd15E6b47Dee2E3ad8fEB5CaFBF58fAcF7bab3cE6", balance: _1e36Str }, -{ privateKey: "0x23aFd6F3Cf94C0bA770Acd3D089e4eEC1c59BbecB5f3e8155ac7AfE2bbc08FaD", balance: _1e36Str }, -{ privateKey: "0xd4f13a491beDE02FDbadd4EEef3C21A1D9b3a2adD92CD5Ab243EDdC6bb18D58F", balance: _1e36Str }, -{ privateKey: "0xEb8fcBD3b21D9D20cB4dc259F7FcD692CD7d83fa8f08D1AA40Edc9D05C13cE6e", balance: _1e36Str }, -{ privateKey: "0xFD0e23CaB82cfdA8Def215a53c764fEc45a15eEFf81CdFd39AD3da17EB8faBb6", balance: _1e36Str }, -{ privateKey: "0xbe92efb5a0022d8eb3Efb65cAEE4C3Dd5dBB8A997BEBec9FfDbAB7ec8B3Bfdf4", balance: _1e36Str }, -{ privateKey: "0x3EeA2daaE910BEbF6cAfe5FA37Db32aF680BdBc0A5f022d6746cDA456A1bad7C", balance: _1e36Str }, -{ privateKey: "0x66aE6623749693fF47732b5dD89A8F3f8C54C2FC6AA7546E7f8825D1de665fe2", balance: _1e36Str }, -{ privateKey: "0xc1b4c0D62dD7Dfc7aF4C2F67eFeBe6A986d3c9fcDc1D61d87E3ee27A40a7dD62", balance: _1e36Str }, -{ privateKey: "0x98b3e0AF5e8457Cd91CCB98a573cB5349E34A9B1B79f5cC70ebafCb0EC2D6eEa", balance: _1e36Str }, -{ privateKey: "0x2AaA360bB28FfaB6Dfb07DF6d749CcAB33f456feE8c48CA0C0aBabE505E1fcaE", balance: _1e36Str }, -{ privateKey: "0xF87Bf212BaB4cF22919E87CEe7314714d4DE04EDE0C6248bA20f9a3aeCd92A5E", balance: _1e36Str }, -{ privateKey: "0x7CAb6eD36E5ae319cA36a920AB40C4ACbaCBA11D6a2CD9A0463a2dd0ad0BAFff", balance: _1e36Str }, -{ privateKey: "0x8eBDDfB589EAb34B1dBef5401ceDEEb5A5356Ee99D397204C290dcdFE3bE0b1e", balance: _1e36Str }, -{ privateKey: "0x0c33C6c04431bde14BC2ED53Be3Dda82E46Bcc38E4C67DfCd7BDfcD0efDA0c1E", balance: _1e36Str }, -{ privateKey: "0x33E4cDc6E44DfEc4f3C61cEd7B619348Bdc4b7393A5BaFA0e6beF6a31D762187", balance: _1e36Str }, -{ privateKey: "0xB36C6Dc9d37eFC0dB35C82a4a6A2c1cFaFa1F8e22b5DdfE5eeF2Afabc1aF4F3F", balance: _1e36Str }, -{ privateKey: "0x81C0029779E4883CBbe3DdD1F0C7f70F1B8ECDd3ca6b1885F90aCec02dA57aa6", balance: _1e36Str }, -{ privateKey: "0xe0eE2Fb1AF4c7c0dfEc3cC74ed54f9fD5D19FDCb84e0E3B3dF98a6Db699f2FEd", balance: _1e36Str }, -{ privateKey: "0x59D1EB337E1b4F1fF7d00EAD7D535C0bEb7C537D2a57C50CABF8fBE7fbB13971", balance: _1e36Str }, -{ privateKey: "0xf4F7CabaAe9dB2B966C36F6CdF944ED105Dcd3c84bECca44EfbEcF3B3162e68a", balance: _1e36Str }, -{ privateKey: "0x5f0CC6F6B15aBb9E5caCeFeB5E94Db4d4600EFec15884e46Dacfca22bE7E1e4e", balance: _1e36Str }, -{ privateKey: "0x974b202d2210b72CE9Ed7d659dfF39459fB7567E6a0be03328f1d61E4392a8bb", balance: _1e36Str }, -{ privateKey: "0xf56f422f7da15e585b40Bcd03FDFD6F2B0B4bF75BcDdB332422AfCBce6dEbCeA", balance: _1e36Str }, -{ privateKey: "0x449dc1Fbda2aaE045B75cc8a1E1E3fdF2Fb0cEA8C8ae1FcC1e7240A89b7BE87c", balance: _1e36Str }, -{ privateKey: "0xDFAe5AbafAA1fD4DbA7bAe9C2B9B8Df6f8DEcD76e2e3D3FB452eFC074Adbc484", balance: _1e36Str }, -{ privateKey: "0x8edDbba6C5a25AD9f8b8f6538c5EC5b94cf4A8296AAe12D6ecC80e9B410451B0", balance: _1e36Str }, -{ privateKey: "0x4CFE4c147BEbbE59fBEEd822D42FDA8184a9Aa7bd1CFcaefcfC168F1CFDCcC87", balance: _1e36Str }, -{ privateKey: "0xEfCF38B4BE5dF38fC25B21fCdCa3Fb0DBCECa9d7F2b90Daaac2BDf3A927C3d2D", balance: _1e36Str }, -{ privateKey: "0x96Fb11d89fac2d81e199FC8bdEed8faedDEe940D69EBE9eed11cf59b09bf485f", balance: _1e36Str }, -{ privateKey: "0x0dEBBc5d2fEC31A9E6aeBF45eeA37f4d62ddff40C21Beb2fA91dFdCc5a74EdDB", balance: _1e36Str }, -{ privateKey: "0xe595009D54A442C3B8bab0aAa29Fc32f0a69c913e3CAE99Ed7cab8b30a767d30", balance: _1e36Str }, -{ privateKey: "0x8c131eFeC4aAf3767cedaC6aC9f397bD1cA75e401B6986F8Dc2c5A8A75a42C1e", balance: _1e36Str }, -{ privateKey: "0x9fEC48A5668Ae4a4FbE00B99f0A1916F312Ca67BCDcd982FB4cAB18A33fEBc8e", balance: _1e36Str }, -{ privateKey: "0x7afC439E54ABd363E8A16De0fdb0813DaDb00B7f478Df986Ecca78eBD8bABd99", balance: _1e36Str }, -{ privateKey: "0x2bFbE5B65F6fb237D0fCc3934E97baBbd762D6bf0019cdbFf61eA035cF698bb2", balance: _1e36Str }, -{ privateKey: "0xf1698BB19bcb2DD40C66d748e7d7e51BaA48e89A65FdDA83d0A412ffCe8ffbA7", balance: _1e36Str }, -{ privateKey: "0x7f13D5Ccb1CbBBCaDBfacaa9Cc75877A8c7cbAcCA678dBCfCE8bCAD0AAeefaBE", balance: _1e36Str }, -{ privateKey: "0xEb501dCb45243CbcccAcD9d5c4AFBEc6D674b3d8db1CcF6E2AA7eC8341DfacA2", balance: _1e36Str }, -{ privateKey: "0x5968a48B4459E42c153Cd0cF9dAfeaa3dEE7b345C1eC6eeeE3dB35d0eaE8525A", balance: _1e36Str }, -{ privateKey: "0xe1B04C5b3d81CD0d7a824f2AeDABdF3CaEB815EfDdbDb70Ef8a4aefA8AfAFe0D", balance: _1e36Str }, -{ privateKey: "0xEa3C3E1B971AF1A38acA8890c80f0988D46D476A7ebfEc8e4e4444d3BF220d5F", balance: _1e36Str }, -{ privateKey: "0xDfAB60bca7fCcadDf9CCa29b46acc55fBF47628Af7D9FF68AE4c3eaBf2773eCd", balance: _1e36Str }, -{ privateKey: "0x1d469c1c05FE7158F87F9AfA59C159dd1F35Fb842c4D75ceC3866Bd8E20B38cd", balance: _1e36Str }, -{ privateKey: "0xF6E9F70CDBEF23BD0f44C29cf3D46dBBCa41bC8E34243e8A8c6cB4a0b89d6faB", balance: _1e36Str }, -{ privateKey: "0xf9EBcF5CA7E7f4efFbb1B5b5908519BAD9dc881f3ce10F78D4A76cEb3bca7dd6", balance: _1e36Str }, -{ privateKey: "0x9Be1341Bd47BbeCD4DaaCFBFC6521Da3ca99cEBa2c015bDc5396D21f93fb083e", balance: _1e36Str }, -{ privateKey: "0xCF6cfA3bAFfdCbBBD21CcC26d8AdCdc7e73DCdeB3DbFc593aDe6eF7e0dCCd6b5", balance: _1e36Str }, -{ privateKey: "0xFCAAb2f51b7AdBFC85965E04FC7bCE43abdA62e9a550Eb03Ae3DeC9B3E9a6A3E", balance: _1e36Str }, -{ privateKey: "0x5373595F795F0bcA6C8DFb8059BdceCfeb0e1AC41bfadfe2ff30c44BFe028CFf", balance: _1e36Str }, -{ privateKey: "0xEFd1A59B43DA61b94F97f55e46b34fFd4B1Cd6aD5B13bfCbb0aB73cbE4b64648", balance: _1e36Str }, -{ privateKey: "0x0882d8FcBEc800CbbC274d05A4E80aFd03C48FbbdbbB82C0e393e3a1fd6bb3FE", balance: _1e36Str }, -{ privateKey: "0xb31bdF240e1AEfe9B38E6ce748Cff6Bd9a2caEdAD4Db6ff2ABBcb4BA0afc83Ff", balance: _1e36Str }, -{ privateKey: "0x48014eB47439A9B4D0BB9F674dcad87Cc2Db83C0DeBEecBf7891C46cEc7dCD2E", balance: _1e36Str }, -{ privateKey: "0x04CB5cEF0C97f3b1AFd402a57BDcefB9FD88D434eB3Ff682f214981fffd96ebC", balance: _1e36Str }, -{ privateKey: "0xbcE7f35a120b78876a96C9cb1DD00b60A43546c71e44337f25adcBd3FadfADaA", balance: _1e36Str }, -{ privateKey: "0xA375bB4751B5F4eDD7CB124dceF9501C8860bAa1Dcc56A4812DEeb9D2fEd483B", balance: _1e36Str }, -{ privateKey: "0x2DD6e6a53Ae0fA1d002F3b6aD2DCccc5cCBEd0829DEcED94e5D561AFCAc9ecFf", balance: _1e36Str }, -{ privateKey: "0xAA3beB7109c486ac7C65dce2f99F01dF380856159390922ed3fbf6A6AC0fBD32", balance: _1e36Str }, -{ privateKey: "0x6CCE77A62f6B35E44a1cEbCF4ADECaC9Fa6C5EBeaf552C6b2404D111F3AAC3EF", balance: _1e36Str }, -{ privateKey: "0xbb44B0CAf55be6FAADc841cCcA88eA227Dd096e65d1Bcb2e4c6c4edA2dfE90Cb", balance: _1e36Str }, -{ privateKey: "0xbF1498f7C2c8eb21Bb6b8f2B9dd4BDa92824569FBA9E2E1931dB82DDC33d67b4", balance: _1e36Str }, -{ privateKey: "0x8b6c6c6AC7EB3fb5de441d2a47EF9E22D42dEFea2ba5425A863cf76dcDCE7D88", balance: _1e36Str }, -{ privateKey: "0xA700f2aF7c094daae3D4FB3d4D571168e656eB5d2231A2522F13De953148f3EB", balance: _1e36Str }, -{ privateKey: "0x22BE4f11f0a663aFedd22E83746b171a02D9BD1A437DA212B9eF410A01EDEf7c", balance: _1e36Str }, -{ privateKey: "0x1d7cF08983fDD91A7ca0014dBB746483D0AE4Ed8167e8Ac226fceeFb9DC3dbC7", balance: _1e36Str }, -{ privateKey: "0x0dd0DBD1Ae6BA54384DB4Eb9C60DAa4de0a4Aa4dacfd3bA37cec9c67039CF66c", balance: _1e36Str }, -{ privateKey: "0x0ACB6aF4EFFdCF094Dcbc1Fc0F0AFF30AE0f24ff7b7D10BcfC7A92F30d19A78F", balance: _1e36Str }, -{ privateKey: "0xbCef26d02F68d1Bb0aA8f865fbD0Ed5bdc9b70AF4BdEf259C22fEdBBc14B4d88", balance: _1e36Str }, -{ privateKey: "0xdCec192ab72d80Cc6B1bAE5aFfad26C6Fbe65d65C20029DB4EdA4FE57dfF1fC4", balance: _1e36Str }, -{ privateKey: "0x7B37e5acA4d8DD3B5B24EF2443aDfEC9A10b849CA3AacB88eae2B210D3a91b9c", balance: _1e36Str }, -{ privateKey: "0xb58D6d00fFfEea1E97330E9cE375BF0EBEEeAABFc2C5fCAABEe92d9D98B993b8", balance: _1e36Str }, -{ privateKey: "0x74FB3B605CDDCefc0DCC289DBB6dad6FC5fd52C7bd71eBeBf563Da5CBDAfB7A3", balance: _1e36Str }, -{ privateKey: "0x37eaC4Bb1163f67cBE81bd55755E73ffFC0dC633EE44FD24Bb0B6cFD2fFab09e", balance: _1e36Str }, -{ privateKey: "0xbF2AFE9218BEC1B98f8A1b0780C7cFa0561dB06287fbDF6F842BCbFD0c85dc8c", balance: _1e36Str }, -{ privateKey: "0xdDFF5A7A11cd4ea21d8E0B8F70A8df2BBF54E6FbC44967D92BdCD4a054447bfF", balance: _1e36Str }, -{ privateKey: "0x351c54E13C5FddEA43268781A35E3AD5b8bB9bfEE423da7e9Eb72d9b0eeD0AFc", balance: _1e36Str }, -{ privateKey: "0x77c1984fF57afCaB30Efc287fB9ABfcFfDE46b3E3d63B6aaA1a8FAabcceCF5BA", balance: _1e36Str }, -{ privateKey: "0xb061aEEDdc5efFfBa3ceB16cd9e3d708eA81A8f692dbbAf9C5a0B4acb0eF2895", balance: _1e36Str }, -{ privateKey: "0xf46675572ECa0aEacBCE749E8B3fEb4A4434bF8fc4a17E99f93D3cAF4De08aac", balance: _1e36Str }, -{ privateKey: "0xe6FA5fA76AEA8F90db9Ab5Bba1BF25A2F98Af28aAcFE7eD3df7d2D657678Cd28", balance: _1e36Str }, -{ privateKey: "0xA1F35bBEBddadF8dD4FFbFF3FC1d1C9dF4C4CdCf07f3BDc554687Fb21b8EB7ee", balance: _1e36Str }, -{ privateKey: "0xfdFdE3c49dFbAf022b56dFC4d35660DB7fE5F89F5BCD3c1b3e7caab20DA30567", balance: _1e36Str }, -{ privateKey: "0x4c02AE2F7e7EaE3eb7fEeB80f377473c3E0C2B6FCBCF43E303a2CAE8EE0CB068", balance: _1e36Str }, -{ privateKey: "0xece75AF56E55bd379aEF2CbDaa632d1bE3C8f7D5e8dAE7047c1D3c6e37aec8d1", balance: _1e36Str }, -{ privateKey: "0xbECaCc33BAFFbCbadF6d8C41B3eb3CF760C39699BCf872C230BeD4cE89552D8C", balance: _1e36Str }, -{ privateKey: "0x9cfce0dEe4BcCD4ae742ec8B041f47aC0da8AEd59c3615BFBb7feDAef0E1FE99", balance: _1e36Str }, -{ privateKey: "0x6ecBA94ffd23aEeCF30Aa7ccf28D77b0Eb9Ed1Afbf5c9abD3E5b50CacB8c0BfA", balance: _1e36Str }, -{ privateKey: "0xe5d9dBF0284bF49a313c9f8cfC0453AFc087d88Ed69EEc8ab3CC8d1fBceeB689", balance: _1e36Str }, -{ privateKey: "0xADcF872FA85ECEedFEA3BdcC51A00AEF3CEAAF3610d9693Aa3B23Ba3FcBAFCeB", balance: _1e36Str }, -{ privateKey: "0xabDa7702CACa69A367aBfD0adddd45efFa4Df4D9eaCcbd75F89470c9cBDDa3EA", balance: _1e36Str }, -{ privateKey: "0xF0404Ea46c32D9c10c936dA2bcb42bB9AC6D6FF91eB57EFFc5bfECeCeEBf2fE7", balance: _1e36Str }, -{ privateKey: "0xA63633DeECC4A815c2575C1d42a2feFC153a667C566F429e1E9c54d13b4c0D50", balance: _1e36Str }, -{ privateKey: "0x58Ab12c9d92d2BDf674bEfCdc2bdd5305Dae2aaAa5fDf34C422BbAC80Df8d1DC", balance: _1e36Str }, -{ privateKey: "0xdE99Ef975619feF1Bcceed01CDABaeb4BefEebbBF5758DE3CaBf172ED917a99A", balance: _1e36Str }, -{ privateKey: "0xFDeB03179DA2CbaF223BB381eAaBcDE1aCd0BC3f8783Af8dD672408d83e5795d", balance: _1e36Str }, -{ privateKey: "0xD1be21f70434b2CdBE742cD1e6275c85c5d45dd6Eb288da346AEeB2C55cFfDdd", balance: _1e36Str }, -{ privateKey: "0xFBDc2B603C39E155c5F4FbA09ac9dBeABfc6cA0Ba567CAb9B5c4FAdCdC4E2e47", balance: _1e36Str }, -{ privateKey: "0xF13cA746556b11e1CfBEF3b816dDa8fb5A2f2FdA1cDD1CDFDdfC8957C9ABeEC4", balance: _1e36Str }, -{ privateKey: "0xC4FdFFaef0C0f5892c3C1bFD65b1C3A2dEb74f54eCe2A6bcaeBF48537FEDdad3", balance: _1e36Str }, -{ privateKey: "0x7F8Caa4bEa69B4CAaAC6BF44Ba9cfB4f0FA28e2e420f1E70dCAfFbe6E8B946ef", balance: _1e36Str }, -{ privateKey: "0xd988572CEa7e14685FDF5DC42Cd7c4aDfcFBa9A6bdb2Aa7DBDE410c26c5Aa9Dd", balance: _1e36Str }, -{ privateKey: "0xd2fC3E60e9dcd019eFdFC7B7b02aFDc4cC4BAdD1DD9bb3bCf7FbDE1EDCEcbaa5", balance: _1e36Str }, -{ privateKey: "0xC742bf81FFA5f41bD3Ff697aaF489cC9A29FAe9ad2c2744724bcD81e4DAeF9E1", balance: _1e36Str }, -{ privateKey: "0xE9c8B558B7d3CcEE64818cEE425218D53fC623dadaE1e5d17D0A87aDDCdB6B75", balance: _1e36Str }, -{ privateKey: "0xde09b86236EE80CEC1E1d4d4cdBAE9A6E5c1F7afAABD7ef0B7398F3Bac97f965", balance: _1e36Str }, -{ privateKey: "0xb5623027bb4bd4FFABB0AD9E5fBdF57b56D035ba357cC6e6BBbe682Cb1AEBA00", balance: _1e36Str }, -{ privateKey: "0xe04047CEe2Ccf64730A3Abcae3D4c65dfbceEfFfEa8f3cfE8D01EFa9D0b836A9", balance: _1e36Str }, -{ privateKey: "0xA9Cf7cD230FC2b35749248F8bCff88db7Fdaa8f6B057DD74dEcdC6246808FB71", balance: _1e36Str }, -{ privateKey: "0xECEB4B2ae4b710FD2dB276cEa350D7B8eCB5334eef26dDe43Adc8fDFf3DBe75B", balance: _1e36Str }, -{ privateKey: "0x5144DF6cfB7382cEA2E1a77dBE0a3f875EB1F6035dBAb72E6B50fAfb618dEDf4", balance: _1e36Str }, -{ privateKey: "0xE79BE252eF4bC59dF48c4fDC24ba816186ED33e8Ba5A0cADCF51ED76B7390cD2", balance: _1e36Str }, -{ privateKey: "0x8aa363A58bFfcdEbF64db5aA6cdBAa8D7e7CEaF41106abFE5Ca78edFaBA87696", balance: _1e36Str }, -{ privateKey: "0xd996AdC0fe328A103C909f9bCE1CedeC5dEbebFEaDBfa3F99B182dE3558Ed664", balance: _1e36Str }, -{ privateKey: "0xcAa4ABa7c2FC81D3fAE89B528fd45cBc9687E32bc0ddeBDefdE5eBA965e0cAEA", balance: _1e36Str }, -{ privateKey: "0x41b675527cD2AA6dCaAdf6E1BEF9ea356C1cCDBC61712Cf7C184ab9954a3BB4e", balance: _1e36Str }, -{ privateKey: "0xEFADCEF12AD0a8D8FDf5d4f91c023Df7d7daCfF6FebcDfc2fDC315C3d4C510cD", balance: _1e36Str }, -{ privateKey: "0xd04fDB5dfDB3B85afF09dAa5f6cFCEEA79d98cE9E6DCCFE98f8a4ee6Ea9dFF22", balance: _1e36Str }, -{ privateKey: "0xEf5a02Ad3c182ab2d36dC8daDea3ac81fEFBf869aEaCaF0cDbbB1EfacD18C103", balance: _1e36Str }, -{ privateKey: "0xFAd56f20E09D8eeA24b55d8Cec8e2eBA7409cA8EAA0FCf2e1c3Ec215e42a5D2D", balance: _1e36Str }, -{ privateKey: "0xC521B59cEaE40CC92C076fb05D3fFa61Bf3Fc88Ef58dDF60ae6Ef05fcB85aBC5", balance: _1e36Str }, -{ privateKey: "0x080BA7ce0c7Ce6EF9A3B0530CDeC20c5B3FAB022CF805A5bf0EB8120dC8CfBBb", balance: _1e36Str }, -{ privateKey: "0xC2d1FcCCb77aE4c830F6ebc9Cc59CCE59ceF03Bf025F18e34C2dFFA23d4DeEEF", balance: _1e36Str }, -{ privateKey: "0xc976dcC1Cc98F1eEBCBDf2BD068BAC9Fb7dB0eBB8487B2d0efe22b8FeC8b7d6F", balance: _1e36Str }, -{ privateKey: "0x3522eebD5fFbAD9913C2ead1De69a57EeeaCA6A1bF6583Fda3A8C7fdb6FaD2bd", balance: _1e36Str }, -{ privateKey: "0xFBEaEE4bEac56daf889FEeeFD62621470E5F8802193a572AAcdedEE237afdE81", balance: _1e36Str }, -{ privateKey: "0x46e1C0aE3fCB814bd1CcC59dBcdaed4BAB1EEe75b8ecF8f5bB12845da5C625A0", balance: _1e36Str }, -{ privateKey: "0x58eEec67F3dBc150a1dE3F8c6f35e5FFB3E0FB4023a58eEa0bF6023bCfECA589", balance: _1e36Str }, -{ privateKey: "0x4Fbde0CB188DbEaBB8dcb73407B9aFeD8cfE1CBDac971afDEcCe5e788AEfABFA", balance: _1e36Str }, -{ privateKey: "0xa0fE02FF8ca3Aa0096Cb6ec2DB67Ed0DF800147D925aFd8E8aC2BA0bbC37C4e6", balance: _1e36Str }, -{ privateKey: "0x79C6F4a42a4beC4bEf8DE257e60bee4b6BbDd7BfE8bF41b463b5Bc5aa43486cE", balance: _1e36Str }, -{ privateKey: "0x3d0352b4603fc5b7bB59C8a67f491b0CF3e1e09CFc7c8567e8083f32E5E63aCA", balance: _1e36Str }, -{ privateKey: "0xe2e998F3711fBE06287c81900BB93bDb2DafFEB9470513bfF991a72BB7BbfebF", balance: _1e36Str }, -{ privateKey: "0x9c9F5E71eba954d6004E86E25520C51Fe0736F473adC4dE9348Ae3EeCbAdeC62", balance: _1e36Str }, -{ privateKey: "0xcc1fBcd93d668e2cEC8b4f9E15fACC3013a182Ca779eDace4eF9aBDeaDdeB9BB", balance: _1e36Str }, -{ privateKey: "0xe03657CD9AaF72fF52c63339eBcBe85bFEde4d04a33D5Cbbbe9ffA7E8B3b4d2E", balance: _1e36Str }, -{ privateKey: "0x0CA1DD1aBfdBc0e5406E993e59b7C2d3A1433fD6a3cCeA8D0e68dA7B1a0Ba47b", balance: _1e36Str }, -{ privateKey: "0x9384AAeee8cba7Ab2463adB74e0d91Ae14613A496f53eB2EDfe82eD5a4Ab4a62", balance: _1e36Str }, -{ privateKey: "0x77B2f77Da640C7A983050B3fc0b1ed7D4d4d7aBbf8baFEBfea22AABCebBEEb45", balance: _1e36Str }, -{ privateKey: "0x59eeaf658A0de6c065ab80DDAB14e52f32bf7892e8515d5dAb1a6f1AcFB863ab", balance: _1e36Str }, -{ privateKey: "0x4eED08e85d9ab7Cf33aeECE4F21bb8ff45E6bE335afA8eBE3Edca2dC82786EC5", balance: _1e36Str }, -{ privateKey: "0xFcADfFdD4EEE8AAD5d596bF75f9753CDb2D1EF80CE3Faf8eaC8F8a8cB0ff8333", balance: _1e36Str }, -{ privateKey: "0x4aAc06Ce4B31AcaF9929784Cc5DbEBF0BD3C6f942dB0eDde8B895A04bC61f2bE", balance: _1e36Str }, -{ privateKey: "0xaeE2bCAcfa4B87B4cE4a5f2E1eA393310545FaC8B3C0AbDAa9f38ab7e94bF0eF", balance: _1e36Str }, -{ privateKey: "0x78e86D2A7edb3fC5dF7fDC702cAf80cEFd6DE9EcfeDaF175d685b29afA7EfAfe", balance: _1e36Str }, -{ privateKey: "0x2BCD6ca3B5dc74E47D31a6923aafa7e0210B5f9C26fD975a95Aa0Ca617861C06", balance: _1e36Str }, -{ privateKey: "0x10618f48F2b32CA4F092fbB46eeA2a687D158f4C8f74B4Bb8a5Bd3AA9eA9E72D", balance: _1e36Str }, -{ privateKey: "0xc75e53Eb4eB6D0FCb73Cc3B15A5518d585Ebd88D1aC5B1399ceeCCEed33d3c1e", balance: _1e36Str }, -{ privateKey: "0xd74ceF6af1AfA32C1Ac4CCb1D76DdC48156c8BDAbc6ADb5Cf24f9f92e764672C", balance: _1e36Str }, -{ privateKey: "0x451cfe2DaE14EDe9f2abD145745fa1fCe8CE9aa7eDE8dBe0EA31F6aE3390b61b", balance: _1e36Str }, -{ privateKey: "0xCdABCCcf69EB53fd3Ea0D7B4046a2C8E810f3e1F15CAb4BB3f83dAFd7769f2F4", balance: _1e36Str }, -{ privateKey: "0x63e5a9b960dcfBAfA1a2d3C7D7cBaBAF2f2Bca8eAeA9eb8FF21Bd5C9A3bfcD42", balance: _1e36Str }, -{ privateKey: "0xe39BEAF370353C03EA07EF86d903ABFec6eD1AC38F4b1D303D5E15AD4FC4Ea0c", balance: _1e36Str }, -{ privateKey: "0xBdff0efed98486239Ef209cDD6be6B73cDbBEC28848AFdF2564e7c0a9B4b2a74", balance: _1e36Str }, -{ privateKey: "0x4Ed3cc63C2B3De1C9c7BD6dAce69EBE20A4D7e4d8a76885Da5ffF90F4dDEcec5", balance: _1e36Str }, -{ privateKey: "0xD78BBd0Cc68E15BaB5D2CdeEe08a7AD18F8fbFC94A74A9ff271dcB3fCdcCDC29", balance: _1e36Str }, -{ privateKey: "0xCB4f539CfaBfbDCC06D4C9AdAECe862aE069CF3a4796dda93Fc89915A13cf85D", balance: _1e36Str }, -{ privateKey: "0x57abBc52e8A86024eA5A78553FAdd33cDe450C7a2B67De3CdaCCBc9e67FbdBCB", balance: _1e36Str }, -{ privateKey: "0x5D55DDdb69D2DA8eC74e3EC8aedAC69997dDf7a11DF11a8cdF9DDd1fF099CFbB", balance: _1e36Str }, -{ privateKey: "0xB65dfe2eb25ce5974cea6Acdaf6c36D9e1d78C0Dcec3f7bB6F7bE09CD3739E3B", balance: _1e36Str }, -{ privateKey: "0x86cf13C11061b5F3ddCBa6bC644EC633fCD7cC60A588f8A372B79990fdC5aF9F", balance: _1e36Str }, -{ privateKey: "0xa70a9769E14DeC9529093e6d5A8eFEbF2fCFc14a4d9eF8cE8F87554f3ac5ADC6", balance: _1e36Str }, -{ privateKey: "0xf2EEAF143ADbB899c56bD3f0a7Ae8FC1d0720fdfFFbbC1f9AD1227D34aA49d8A", balance: _1e36Str }, -{ privateKey: "0x8Bb38FDf9cC6F1f2B5F4f20Cdbd3Ca41a78cc3eDAfaeb9eeFF8a5e2dA8B4CB26", balance: _1e36Str }, -{ privateKey: "0xDEf80a9ac2FeBbdEcbA795B61Ee03ddad39aDaAb8A5a46e55dBF9FD7EDceE5b9", balance: _1e36Str }, -{ privateKey: "0x0AFE94263fBa9Eb0F8eCb783d0bCFdD3e0651Bdf4Ed8ECDE9d2CC629C0db4777", balance: _1e36Str }, -{ privateKey: "0x0F1c0cBFa21bB894e7597FaAEeB6cA26f782deae5eF65DD07c3DeF9b9f8E9f43", balance: _1e36Str }, -{ privateKey: "0xAAEd5A8aCdace7fd1ddDb3e82c328c65262ebDde518FE5baa2B9bd2c92cDA2E0", balance: _1e36Str }, -{ privateKey: "0xafba5BA3cf80ff4D7f20cDA1dD877fFe0A2aBa6cbb789Ee6f4efDEDc932eA5aB", balance: _1e36Str }, -{ privateKey: "0x5F667CBaE7eaDa4ca0c7aac1a7D3df90a0D34D1e6d964712F8ee757A0d841218", balance: _1e36Str }, -{ privateKey: "0xA912AceABfD7990BBf8f261ECD6755Ba4e0A20eD8BDB153dba990C7b3BD43cfe", balance: _1e36Str }, -{ privateKey: "0x06D1fa28eCBd31BF3E0d5b64F49E5Db5ca92Db926C39B90cC4197cEf5edf8Dfd", balance: _1e36Str }, -{ privateKey: "0xF784cFB68A3F28EC5C1401feB7ecc6AD1D16A00DF3aDAdF647fA72D5Dc4a0aA5", balance: _1e36Str }, -{ privateKey: "0x94a9c75dbdC7865E0Dbb7CA86Feff8baEecD693a307abBABFeFAec70fCAcacbb", balance: _1e36Str }, -{ privateKey: "0x01D9cec2d11FD73FEb7febF2adC3cABa7FFfa6860C4bF7FcB02C9CAEB512EdeA", balance: _1e36Str }, -{ privateKey: "0xC5A68DE449Accfac650b6a3C12D7895aEdFE9Dca4CD2df176AAA74D9055dA3e2", balance: _1e36Str }, -{ privateKey: "0x04c8d87fD5ABf56982f9af5C8EfFDB11Bf7BD2bcc29caC8fdfA99a73a8c3cE34", balance: _1e36Str }, -{ privateKey: "0x64C0618bB7d1868dEaB31FeA8DDee59EdEa9DC020Ee04a5A385DC06c7cef6DCA", balance: _1e36Str }, -{ privateKey: "0xB6646d2Fcd6EBB0BeBeeB06E30A6ecFE9B6dcA6Ba9005bfff6f4c7eDf0B23Fb3", balance: _1e36Str }, -{ privateKey: "0xdBbBdC9d7AFea4Ead5cFE21bEC7F1Abdc02AB61D54D1DF7394C823d38Fbe40dC", balance: _1e36Str }, -{ privateKey: "0xa03A3a0Fe1af1aaeec6882c9deFCab8C5ABCadE3F988F895EBfBA3EC13ffEC2a", balance: _1e36Str }, -{ privateKey: "0xDDbeDB0B062cf06EBECD0cc280C5Da78d3Eda7a24Aa13498D0B48FB6Fdd364c9", balance: _1e36Str }, -{ privateKey: "0xF99F24C7f56C1b01ABB0a14CBDf5eC1fB9DbfFE27c0e91EA98A5f1F5dEA6047E", balance: _1e36Str }, -{ privateKey: "0x5aF0e55A84318c5Fb8ABC6fBCAe4c4bEE12bc9F5dD8CBD9aDF07A3bd0De1ECf4", balance: _1e36Str }, -{ privateKey: "0xa2c4c38bbDe6aF5fd25bAD4f20f1fA12A2532A11967Cd0AfCEaaAaccFecaf9cc", balance: _1e36Str }, -{ privateKey: "0x14faceD70eB8b64d4f1509c1ACeDf87a9c09f9bC97C2D8A50d8cDbf6812c83D2", balance: _1e36Str }, -{ privateKey: "0x3033ED5Bae5bBD7bE1BdbDD3AAAF2A9a6C1EBEf1AcA18aB1Dc06423b40b3e5Be", balance: _1e36Str }, -{ privateKey: "0x051C0E1d9ea7FEcb8EeD7E6A2d47Aa72cF4de4EEeB725cE97FC4F9acA146067e", balance: _1e36Str }, -{ privateKey: "0x2bC84AbdecA9DF4EcFec4D65EE474DB9635d7E6d5B4F5Bb65D77d9dcE21b040C", balance: _1e36Str }, -{ privateKey: "0x8747d4E73c8Ba2dCe4Ea26b1B7efCD328cE04aCEEc4db9ceF037bA67ba5c47E8", balance: _1e36Str }, -{ privateKey: "0x7B937A9aa64B5135a1CCD49dD6D861C9962a6FCA45dfcD5D78E9DA3AdDEBCf3c", balance: _1e36Str }, -{ privateKey: "0x0A3FADB008dD80d9dDc31B5DdB82c71c9Cbe8CbA7a85A70acdb3a2BB5907ffcE", balance: _1e36Str }, -{ privateKey: "0xAADa8A68eFBCAa06C6CbAA6Baf5a07Ab4ee544DADC42f94Ac8A5dC836aaEFff3", balance: _1e36Str }, -{ privateKey: "0xDa03FeDb38b0CeF6d390b1CB7203Ef8dE77007Fb1aD9bF66feb418FFB5bD46dC", balance: _1e36Str }, -{ privateKey: "0x8c0C381A96A22fFab19FcC5DA9cd8F5aB4aDaFC2f3dEcbCf513C87E4dFEA08fF", balance: _1e36Str }, -{ privateKey: "0xDA6fad6d12defCE32BB28Cad7FBD54eAf06bA6756eFed03D9FFfaD779a98EaBC", balance: _1e36Str }, -{ privateKey: "0xcF93eF1F7d8a73C4eC1cB9E0AE1fFFFa6bA47C5FEfBBa89bF1EAFe669c9fCdca", balance: _1e36Str }, -{ privateKey: "0xbEA9A85A6F7aD3dA842f062FbC7Ae0eb8A57A7ca46fcbBd7e0ff411C1872AcD6", balance: _1e36Str }, -{ privateKey: "0xF7EE1f863A979A97d62dDBE72D025BCcaBC096Dc5FF325b1DAdaf0F9Fc4dbbE5", balance: _1e36Str }, -{ privateKey: "0xf63038937CD85A21EF5Ff643dAF85C6A1ed2fb74a7676C9d8F47C02fFeceDB82", balance: _1e36Str }, -{ privateKey: "0x69d7bBD48fa7aa9FfD4E3f5dCb3030ed8c76Be675aC2813Db82Bf5dc7b53f5AC", balance: _1e36Str }, -{ privateKey: "0xFceDddCe2B4BA5D1e5A194D56c56f3dB90926D1D1F8e8Cf4Aae1B21B0bdbfba2", balance: _1e36Str }, -{ privateKey: "0xbcbdD9a8462ae69FcCdeEDd838A25Ead9c65EEbc9ebC2CeAb7D5ad1c4AEfA0B6", balance: _1e36Str }, -{ privateKey: "0x480aAa813f77D5a76FF8D0Dd59678Ee30ffcBB9AACbBa1Cfe6846cCdAdDA40d2", balance: _1e36Str }, -{ privateKey: "0xd1836f0e438514127E3a7ecFd849F6Af2BEA1Ba60A6509160F6581bCeae08166", balance: _1e36Str }, -{ privateKey: "0x4C3EFe7D74D88aD180cEb0cFA8FbCE4DbdCFCFb1d2a7ab57860a99eD318Dd62c", balance: _1e36Str }, -{ privateKey: "0x98325e169f87cAA934F7477cDDEF08Ad0a5ddBD02a288B6C9Bd1793Aa1DAe548", balance: _1e36Str }, -{ privateKey: "0xAe6723fcFf9FE1Ea5ABd7Da31c85BdC3a64Ef04c1EaB0882210bB8467baAF6eC", balance: _1e36Str }, -{ privateKey: "0xE9f48fB2DF1fb5eFA3CBa1FaBef0DFe9A9bdAbdECc28bd52a7FaaeC6cDCdb702", balance: _1e36Str }, -{ privateKey: "0xe7fF762eEFE330c3b7001eBCAecD4576d283bdc6e7eEFbEC1F9e9b4015BBdcca", balance: _1e36Str }, -{ privateKey: "0xC3132EaaC185B46Bc24d6eebd0b9cd8db01121Feb6E00e08d1Ed9dA7d8565f1a", balance: _1e36Str }, -{ privateKey: "0x84eAcaDe988efD602aC0e1Df7895A61cBb2Cf353bEA0a730DE6DA6BDF6F666C6", balance: _1e36Str }, -{ privateKey: "0xd78FC7E7DB45f9E019fB990fE8f1Dbc7Fae98b015EE8DD223bC7a833F5cBeB1d", balance: _1e36Str }, -{ privateKey: "0x5aA68076bAa8fEAA1F93Bb47d1Ee4ebf92D8DF5BAC3FBB0CdFe251fEeC1bDfcc", balance: _1e36Str }, -{ privateKey: "0xCA99CdC2AAb75E58C262131d27E08BCB2115cB41daB2498EfaaCe32Dc1045134", balance: _1e36Str }, -{ privateKey: "0x6C7bcefF450caC1f5Eccc0e9eD627e154065D3BB756e0bA2488E894AEEae0Fa8", balance: _1e36Str }, -{ privateKey: "0x10882dfa6DdEddb0df651C8fE2eCfca788fcd1abF65a47bB71f21f9aad1BFDaf", balance: _1e36Str }, -{ privateKey: "0xF2eBA4cCc2D8cdDD9D51bD8eA4defAfB15a0Bc021a9707c7DDFf8ddFB1Bdc10D", balance: _1e36Str }, -{ privateKey: "0xaF58ce73775454dC1656727BE1BFe96ADC9d3aFf2D70AEedcE82bCa585fF3FCa", balance: _1e36Str }, -{ privateKey: "0x755b05779ce55c474dE78eaAE12B6BBA82714dD988B1dddBEfb21Dbcddb35fbA", balance: _1e36Str }, -{ privateKey: "0xb3aFcB5Cb47b2ca38a13e1aE835921DddfBdd40127bbF4Bc55cdb859FC7CA49C", balance: _1e36Str }, -{ privateKey: "0xb393Ce1CdEF6Cc0B0e90ea1B6d2eDC4d28Bf0Cd2c1BC4cD6cFF0A5D4f5ca1DdE", balance: _1e36Str }, -{ privateKey: "0xaeaA6BcEC770ED3FEB9f4e8FFcD6a6e4b8dBaE96f4b3ddade4abdaeef31bE1db", balance: _1e36Str }, -{ privateKey: "0x1B2d1a2F6eEc52FebaC6e57EaA390BCaf49A9ff75De4e2CFabD1c06fD42d36DD", balance: _1e36Str }, -{ privateKey: "0xec4A94847E0a62C6cCfd27eFe8bC4DBcFF2bA318AbCa23b79b41Eac296fe85Fc", balance: _1e36Str }, -{ privateKey: "0xd41654F3D2eb3dC6DE40b7a4EB25D2bEdB4CEC0Cc6FE6cf429ae67BbAdD56257", balance: _1e36Str }, -{ privateKey: "0xf5E26c8A50bBA4AeaDE9d10acF00FBb0e8E6eCB3abB8Ba9a70972D406007FCa5", balance: _1e36Str }, -{ privateKey: "0x8bA41A49dDABA343BC8a7Ca2182CE0DABA7e6bf90BcdDf9afe610c80B5ce3e7f", balance: _1e36Str }, -{ privateKey: "0xA8C7A18fd324aEdf046bbA28dC165bC16FA89C7af1FC9A65512Be5Ff7E9315ad", balance: _1e36Str }, -{ privateKey: "0xDBD3Ab09D4e56Cc6F2Ad3beB3fbfed3FB2d4C4a76d404fDb194FfF46c58C8878", balance: _1e36Str }, -{ privateKey: "0x8Bf9aC663ec64f3FDe669A389ec35F8fEFF288b8EA4C9A71F5a3f737D93f5D8f", balance: _1e36Str }, -{ privateKey: "0x64db9679e67DdF4E0EDdc276Da87EEB3fECdB2E4a4bfAF4A85e43d65c05afD00", balance: _1e36Str }, -{ privateKey: "0x3AD4Ea30bb27F09Fe4bbd3ec5A3Dce0C0a2CAF1A1a9EcE5d9e4e4B6DE2Bab7E2", balance: _1e36Str }, -{ privateKey: "0x80D1eacCB72Da4e372Ef8f1a35BEC9134b93c4A3fFe867eda21aE656dB80AFBa", balance: _1e36Str }, -{ privateKey: "0xaceCfd38eEfD48b1e7038AE7449aFB4Ff3EAf0cD14C3e86c48eF0F165715085c", balance: _1e36Str }, -{ privateKey: "0x4f56Dd0CA3FEBCCe05247c50749D2c10A2ECEEa5a66Dd4ec3e9C04ebeb13A34A", balance: _1e36Str }, -{ privateKey: "0x84EeeBC76B5978E08aAcEf16C2B6BF3A5EC450F96cff9Edbeed3dDcaad33CF2A", balance: _1e36Str }, -{ privateKey: "0x4f447EfB685ee6A0fD1ECf926EAcFABF60fdAfF836CC5995Dc3b8bD311ddED41", balance: _1e36Str }, -{ privateKey: "0x2aee12ca147cE6Fd16e1FDfBd6EB4Efd7b49d40cBCdCEEaDdC42a825Fb7B80AF", balance: _1e36Str }, -{ privateKey: "0x58d9254d3c3a93663feD5CaaF9e3D0CCd9ea0fea19EbC9e5df42dB1CBbAbD5bA", balance: _1e36Str }, -{ privateKey: "0x3d984A82d66dA7aCC63fc3cb2D99B2c37c1ecfeE55dF0Ba1A95C1100e7d5e249", balance: _1e36Str }, -{ privateKey: "0xBD09F7e89f45eF6cce4b40E0e78cEb3aDc1A27F9Ed9223A34aDfd0ff7d8EE6ED", balance: _1e36Str }, -{ privateKey: "0x2311cca4a594B6FAC5e26EDE725c842F9b94C52bCf0d684f6b8aFFE3dE0ADE78", balance: _1e36Str }, -{ privateKey: "0xe2E57F9ecf136bFc9C7bE4edF3d6B1F6CF86768353AB2C42BaE8cAB0b2F7e3df", balance: _1e36Str }, -{ privateKey: "0x69Df6ad9CC5A0b7D0F6DFf2c94ad7Ac386FC82EAbdAeDcEe4FEcC4df5Dd9F79a", balance: _1e36Str }, -{ privateKey: "0xC9EC6aDDeD2Aaee8f9965cb36515bb6aF9Aff19EAA55dcf528b6Aec2A4fD0eAF", balance: _1e36Str }, -{ privateKey: "0x4f18892E8e1FBC01ACAE6add931DDEFEd7D6cFd905dD0De02Fa58FFC53E1feF0", balance: _1e36Str }, -{ privateKey: "0xDe930aa8Cd6FAb91E2d539A3D1aca1c89f0C1E08BddDEE837fA8Cf2BdD434b41", balance: _1e36Str }, -{ privateKey: "0x95A98Ff8BfdA2ac3C1baA1FfAbF3b3928A0df36DeA7550DB3d8Ee2d3Fc8dF1Ee", balance: _1e36Str }, -{ privateKey: "0xf4DD8EE213FA29f28dCDfaBEcCc0695dCDa18eF19faE501d9D43aCDe0dA04C55", balance: _1e36Str }, -{ privateKey: "0x1ee1ef445fFd36F1cA6DcBa50DE1A3CC478c65FaCC471eAfBEbdc02F2b0eE3DB", balance: _1e36Str }, -{ privateKey: "0x9FEd7cA7f195757F62C1ed9D8A601B96A2F3b7Fe604088ECF3FD1bc5F5cc1Bf1", balance: _1e36Str }, -{ privateKey: "0xB49078f3364CCA5dc4DeE83dfA7bd5FF38FE89D6C58e5B08DC2c1FcDd91CeF5f", balance: _1e36Str }, -{ privateKey: "0x734fDCCAf02Db436964A9eFD597E8707292BF8bEEe8da9CCFff9953EdEFc5f6f", balance: _1e36Str }, -{ privateKey: "0x6Bd842Ba1Df4fB9A6d117969A518bce56c8d3dDA4abbedf3ca3ab0BdD2D3AeFb", balance: _1e36Str }, -{ privateKey: "0xcbA7EFB3acfa7Ae75A0d58a310D8AA9F14ceFe4CD9F72F0dbd2ddeBA5bcDAB39", balance: _1e36Str }, -{ privateKey: "0xDaaa1Af4Fd56C8C6e4B48D4177a66EEDa8cCecab491A3B3ecbC70A2Ef7C0EbB0", balance: _1e36Str }, -{ privateKey: "0x6EDbb899a11AcD370bcd56fCb0a3EE12dd5a41c4E5B2BC69efbd5d08B77CaBd6", balance: _1e36Str }, -{ privateKey: "0xc40EDe5891Dd94Dee1D61dAaF1eb2C13b7E7E2F28FeDd4F9cdFBFe923e6902AA", balance: _1e36Str }, -{ privateKey: "0xa25FcBf74B6bEff262E30b735BDD68cecCA02F63e04ee14dc4BB7f9DB8f42f9d", balance: _1e36Str }, -{ privateKey: "0xCFDAeE25Af4f61bee7B93DE2EAcabaec8C886D2ba0ECB2Daa3CdB8B247272CDf", balance: _1e36Str }, -{ privateKey: "0xbfaCf6aE590A98d8eaCEDF4280Fa6FAAEEc5a4Bb709026f457e9F47CA3165aE0", balance: _1e36Str }, -{ privateKey: "0x0bcBFBDaa02B377e9c4Be8dEfcd4dd1Ea644676D1fE0e11f3FcbbbEfF459Dba2", balance: _1e36Str }, -{ privateKey: "0xaF45d38fEd4b68911958590dC36EbfEA8e4E3A126Be2bf200dd0afaF41C2ec71", balance: _1e36Str }, -{ privateKey: "0x97d7cCF22d42b1FC4Cf7Fd1fcdDBBbedDccbC4BDa8e4A6C084cFbbE40951c5dc", balance: _1e36Str }, -{ privateKey: "0xBaFb273781f8e63e8d94aaA4BB43e401c7eF8936e3b32216c8442F67a1B69231", balance: _1e36Str }, -{ privateKey: "0x79f28732647dF2C3A7ff774e7FF4CD3C2f3DFdD6c5a8cAbaA9Dd8Da3bF51BAd9", balance: _1e36Str }, -{ privateKey: "0xeEB5EDCfB5b943E3758CF76Ea55aDf2FBda7625CD30feafF5fFeB0fAefCafa3e", balance: _1e36Str }, -{ privateKey: "0x5D4391a3Fb62BFCaf04021d41a5797Cbdd1EBCcDc16Bf0cbDe9d21Cfa18E996b", balance: _1e36Str }, -{ privateKey: "0xbde9185B23dC7Ebdb1Ca5CdA543CE2b21F1DF9ba667Bb16Df0EAEADaD6A5E91c", balance: _1e36Str }, -{ privateKey: "0xD18732F7A3DFec86d4dfAe75ED1f42cD9C8Bd9f5EE8a0FDaBECDB1D004AF6A1e", balance: _1e36Str }, -{ privateKey: "0xd852e02ACAaf5BEDd163585C46Af085125c3a3A9832Fa1Cd8BB7D5cE6B7Cba2B", balance: _1e36Str }, -{ privateKey: "0x6DcD73a0502616D619C1135A76B7FD7cBceCE81F01949EDf11DAd80AEBFBc960", balance: _1e36Str }, -{ privateKey: "0xC34f65a1a1F6D1247EdF15c115920DADEA3e4cB3CFF0C4d66DBacbbe4Fe2bd5c", balance: _1e36Str }, -{ privateKey: "0xc12FDc0D6e68675AF4CeE2eEA2dEC7b19Dcb3ADaFA1CE09bab4b4aDC37f075AE", balance: _1e36Str }, -{ privateKey: "0xeAec4D5B4Fdf63beC6BD54aBC9cB3Fe02B48fe94C69BFcf6b9BDFDcDaebe3ADa", balance: _1e36Str }, -{ privateKey: "0x9aaCcBDC0DcCEbBF2d3Cbd78dcEA590B07eDD66bC40EE4C268900B2e5dB5Dd81", balance: _1e36Str }, -{ privateKey: "0xffa84ABf279c1872Be58BDF23536AEB9C54d183D194DB1f62Ba2f876D1BaF4BC", balance: _1e36Str }, -{ privateKey: "0xFCECeC7E39EbA1dFcaBbeF933c2eAfD075BFeF6f6F2052019A90b73EFfC05b0c", balance: _1e36Str }, -{ privateKey: "0xB047aC9C80ff22BDb6ebEfd4eB5ac1d7b8f3cD2c91DEb240f99bb0cfeEACCB0f", balance: _1e36Str }, -{ privateKey: "0xE7FA65CfCb1DA7E1042D162De7675d027af9D5Ed74A5d4B97d89010cBF0Fba03", balance: _1e36Str }, -{ privateKey: "0xc45dD5acbD5Efcf3D0f04c5cAB54ea5caCFDAFFa5BA3F5470eAeDC8DcF7aedaf", balance: _1e36Str }, -{ privateKey: "0x3Fc11660Fb3DCB4F1E0085f9b6eBD9EF7D8f48FdBD93eBC1693D6d8FDf7aDCBd", balance: _1e36Str }, -{ privateKey: "0x3FeC76BA1E7dd231d95bCcecf12aeD4bF7793c9e5CD5a9dCC184DCF50EaaeCdd", balance: _1e36Str }, -{ privateKey: "0x11dC5Aa88cC54eCeBcE724dDFF3eAf212bf0B018A8C0E53dB54006fb930e5CFf", balance: _1e36Str }, -{ privateKey: "0xfafFFf9a68Ea5eDF4Db4dA32880Ce8e71DBbf95495b2379A028339A0c6B1d0aE", balance: _1e36Str }, -{ privateKey: "0x1e96a7A6A8262f377b98e381265Cb1Ab3dD5a0bA5A8aDFd29d2D53FaAbA36e4d", balance: _1e36Str }, -{ privateKey: "0x2E38D9e40185964f36B6E85eb7D2a6Bb3305F0E1EF69c77Da372e738D4E13EA1", balance: _1e36Str }, -{ privateKey: "0xF1E1dF380c20CdDAFABEF1F4e732cbDDA17E2933E1Dbe9f6aD20568a23A38F1b", balance: _1e36Str }, -{ privateKey: "0x1fd7D1DFcB08c1B364c1eCB3497A3d8fc4Cd7fC88904649F995Eed9ACC1FF42B", balance: _1e36Str }, -{ privateKey: "0xfAEc1beF7Fb49Ca0bdf55B205a49D1d3406Fafb4F3DeBf0c1a54c27Db5b26999", balance: _1e36Str }, -{ privateKey: "0x1D7D0cFAD91DE154B0df10dD11965c5C2851f066B68e3eFe707E69edBF6Fa4c1", balance: _1e36Str }, -{ privateKey: "0xa499cAFd8c3fFbD270fC8D310BaFd1b2cE9Bf8D4aba3e36dDAc4a176acd4FDD8", balance: _1e36Str }, -{ privateKey: "0xb7d5B4EEcAB5CC1C2eDF888e4Ba885F65A9DEBe7ECbc51Ad6ed133A59FF01c0F", balance: _1e36Str }, -{ privateKey: "0x5CE5dAbeAF26c7C3df6DCF8AEa8919B9bf2E0AC94739BA7C637deDB214874C63", balance: _1e36Str }, -{ privateKey: "0xD0E74eCEfDc0Ffc39ffF6D180dcdfEe350BD9220B8a6AEc3De5cb0fF9e6EF548", balance: _1e36Str }, -{ privateKey: "0xf9b91e2C3028b6F97CAaAE9E0e991Ad854Fa2ce0CbbCE829D5C545F8d001BD0e", balance: _1e36Str }, -{ privateKey: "0xDFd1C5cCF079B3e4BCd4Ddb1Ee6D1e14e2c6CDA05a6D0dbf02B221637701370b", balance: _1e36Str }, -{ privateKey: "0x1dC552efbD0d0f95A7C61DFE80407513fd2752e0De714dBe1Fe6dfBDB45a71Af", balance: _1e36Str }, -{ privateKey: "0x57f0043CDe7Fbd87592F45C8720d3cE4a6A2BcAabab6fc13a0E2F21b64806E2b", balance: _1e36Str }, -{ privateKey: "0xBBED1BdAC93D1DfB7fACea1CDdfD8eeaeBf7F01dEfedcdCcB8081aCFBDf5E093", balance: _1e36Str }, -{ privateKey: "0xB00140d90CA0C19B8dBE7ac383c3e48e091a569fA0BcDddD8DB7fBA3326829b9", balance: _1e36Str }, -{ privateKey: "0x43aF2b33cfCE8b700C20a039fb1dbFCeE46296c8a86F357D810BCfd84a5abACe", balance: _1e36Str }, -{ privateKey: "0x18BA2EEFBee115Eb1E9842018F5eD31ffC1D9cE0EfE5BEF7b9Cf2cd3AFCDEb37", balance: _1e36Str }, -{ privateKey: "0x8848fE0D7cd24D44FE93Eb07eEDbcBAFBe48468E192ed3ADD8CBDAF091FDDc6A", balance: _1e36Str }, -{ privateKey: "0x5CcFCd98DD6b00BC24FFC6bb68C323f9d0cdCfdC1e433e7073B0ceA4ff9E37A7", balance: _1e36Str }, -{ privateKey: "0xd1b9Cc572Ed2CD4B3a71a5d3D609f7fb714e7c9c8b48E00C5F4C9f163a7FA125", balance: _1e36Str }, -{ privateKey: "0x560FB81dBDFb2Ab9507fCC6ACCbB123cf6cA4fD03Db925f0dE588EdEF13b4778", balance: _1e36Str }, -{ privateKey: "0x011fd4e372Dca408eE865CDddEf808bbEefAe22F10BA98c7ddf5Da2DA7Ae69A5", balance: _1e36Str }, -{ privateKey: "0xd6706CefB83ee1dA3E6BBB7BD620fc4CcFF0cF048A7fA94f9bf41b5eEb1Ca1c8", balance: _1e36Str }, -{ privateKey: "0xdBE90BcdcE1fe2BfAdBD6A4B3deD84a39cBCa9F3DBCaB5Dccb800Df0a2cab072", balance: _1e36Str }, -{ privateKey: "0x25AD5ae641b2Fa4dcFCE2A707C5fCEBCfc1C13106E9751a17F62a6a40f94b3AA", balance: _1e36Str }, -{ privateKey: "0x8fe8296edC53Fa84aE72E3CD0AB3dcD1c0fC2eEb5993c4e46f66AedC0cea5bd3", balance: _1e36Str }, -{ privateKey: "0x24c57A6363DB4ae8aAC98457f2D686bCfbCC931fb4dAccE71daf9dAE8eeD9910", balance: _1e36Str }, -{ privateKey: "0x17304F39f8cF50aE3737fbbBdf5B479f60b4904203CBBfbF7d7e0aeeeBE5eA1a", balance: _1e36Str }, -{ privateKey: "0xD0Ec8D0Cb7E81c87c64841aACb4cd70eCf4acb0E3Eb5ccabb1B6dbF69b96aaA8", balance: _1e36Str }, -{ privateKey: "0xbFafa833cc9Ff4F303aA092B702bD8Cb187FFDed1bdE1F4993fDd54CC63d4fb3", balance: _1e36Str }, -{ privateKey: "0x8639e88A16F66F849bDEe7c4ECd3CF3e12f3D2edE621e6ED9C6DAD47Ba0Cb6BD", balance: _1e36Str }, -{ privateKey: "0xbeB0CF5F46bA2CeD21da8E0Ef9597895E6f2FaB93aabFC23f0Aa784391B2cf49", balance: _1e36Str }, -{ privateKey: "0xE85fbE9465ac30ECBaCda7d9Aac35aAA3191eaB7A88197733fFcA7cA93EDdE0A", balance: _1e36Str }, -{ privateKey: "0xa85a994534a5eC049bfE71Ff749EE021C80E727b8D8Aac00a3fEA873546BFFEa", balance: _1e36Str }, -{ privateKey: "0x3c84Ec6bff9feA5CDd20aecDBe72B64e20D59Fc66C8eBFcA3CE1df43522bb7DC", balance: _1e36Str }, -{ privateKey: "0xBeAdCF1f1650e26A903570D05b6504f30909988DE7d939726AAaE01FDf9c9dEF", balance: _1e36Str }, -{ privateKey: "0xdc1B7Fc7AA40df0cBffC278Bd73f74a8E7dC436C7a3FdbFbe0fdc733a87249C9", balance: _1e36Str }, -{ privateKey: "0xa19BAd9E47DE1AF2Ef6ebFaA5FF0BbDE14E1BDCAB6c121a5f30Eae2Afe713eC9", balance: _1e36Str }, -{ privateKey: "0x004493BE3AdcADA4688dd99102F40aeDea099fC438a9aB0d47DE6Cf9dC9aDaCF", balance: _1e36Str }, -{ privateKey: "0x6Aa7eBbCFaDc84DCE7EdFAAebf4EE1DCa6b5D3bC2a4aa2Ae60011C16c95F043b", balance: _1e36Str }, -{ privateKey: "0xfB1e593Aa1F596Cc425C7B5F1EdFFdBa8f246EBDE496470b9f6DeCc6aFE11f28", balance: _1e36Str }, -{ privateKey: "0x626CF73E7efBb7AEA721f60cd7AC92d70cd2B3880Bf9ef50AF8A25a162De1FB8", balance: _1e36Str }, -{ privateKey: "0xDB18BedFC7097Fbcf4fbeBFD19c9C2D42e2AaCEa9EF0f0dB7cDedb5fb7642Fab", balance: _1e36Str }, -{ privateKey: "0xf3b73FeDaDd064a4D8A6afCD44ec367364bFb7c92CDeA21e3020c4951318eDca", balance: _1e36Str }, -{ privateKey: "0xBF2Ebb19a3BD5d7A7d4c9f985bcB4DBA99B1F4ABc1C0F19c7FED11C2eB30f952", balance: _1e36Str }, -{ privateKey: "0x88Ccfe1b065Ae8CE69180977c64E97Aa6C7abBEaBaDA32d5c6B70FaAdf79B3A0", balance: _1e36Str }, -{ privateKey: "0xb94F8bBb5Aa4dC7681AC48262Cbe3875Ae7bbbc6EeDD0A680E2b4b48ffb7Df19", balance: _1e36Str }, -{ privateKey: "0xcd8CAe0CfcD892cFEd45DC80Bddafe2289CEa7BDe0FEC8CBbA1CB282Aad2CcC5", balance: _1e36Str }, -{ privateKey: "0x22EfBb2CEdb6Ad5aA9b7f9A2dC8bC5e457b223d50B0BCFe0Eea8A6AFAbAea9b7", balance: _1e36Str }, -{ privateKey: "0xa8e012cbEcAB6d157E4ad082dD5f99cCc02F0b5EABF04FD7dFa3a1ECc631E4bE", balance: _1e36Str }, -{ privateKey: "0xe5EC9FEB9205805d7b26Be4a00beF48FBBe56CcBaD7F0C8d0098Cf2A3e7EaDDb", balance: _1e36Str }, -{ privateKey: "0xA4E19934B3afAFED681d999Ca1d8eB681DfB05e9DEcdf53700aa7DC2E46c9b18", balance: _1e36Str }, -{ privateKey: "0x1C80Ac7e73D58A3fcA48Bf2aec5a8D136a7fF5Ce08BAEED5ffF352AeD63a35cC", balance: _1e36Str }, -{ privateKey: "0xCDD25b8ED4bff2Bb7e30be417Cea90dEBa69FAcf9e6C3ED33D96eca2C026ceeE", balance: _1e36Str }, -{ privateKey: "0xfAa21F300d9d39E5Af4D2b2ce11632ddeDacAba2C9BBed63A61f49DD0cbDD0Bd", balance: _1e36Str }, -{ privateKey: "0xaA2cE6Dc554BEC463DDE2123C9C31DDEFd8Ebfe5eaE88eC1dBC73101a074AB08", balance: _1e36Str }, -{ privateKey: "0xD7Cf1caE9b18dDd0D123cd5d73FC03CFF74CdAaF9F5BAeAA5Bc9CEd9C3a23bDd", balance: _1e36Str }, -{ privateKey: "0x0DF37FEd09aa15a93e8DEBdF8BBDDFa8b4d48BC2BbE1B87D4FC93DC9db6Dac3E", balance: _1e36Str }, -{ privateKey: "0xD0AcB70cA38a85EA5fCCE279C9E92cA46eB233df7ffEC0A5bA1C97d4Ec3a6cEe", balance: _1e36Str }, -{ privateKey: "0xEDf109A5f068C7f6a3827Af367c3d79FF78a467EFfaEAea3d50AF8CbFB0Fa01F", balance: _1e36Str }, -{ privateKey: "0x2FCFd3Ac43219d7E0CCfeDA9F822eDBB2b1fdc8bAd30958Eb7e67BBa8D9cdaED", balance: _1e36Str }, -{ privateKey: "0x18b7EfF47073CAe4Ded58b13aD87BdcfB8Ac5Ba829F8315573CEacA197C05DbF", balance: _1e36Str }, -{ privateKey: "0x5dB84dD1EC7Dfd875F1eeEACd338cA70cD7dF7DEecB4Ad90AEbCE172e1067db7", balance: _1e36Str }, -{ privateKey: "0x1c4EBDaa2Dda607C8b15eCeDff3765046BDfF74679aBc3a4bbFd34Dd0cE49deE", balance: _1e36Str }, -{ privateKey: "0x4ae4ac2dD45cAf96AB5Bb06ED3D6ed9693f54b0702dEe0b6f57Be446dAa0155e", balance: _1e36Str }, -{ privateKey: "0xde6D95DC5fB42d65c8a46A94e86C43cC57fA9DCA6Efa38F90BfB2c5c4F0eAb33", balance: _1e36Str }, -{ privateKey: "0xcfEA1C2bcBbF2fEAB3599a323Cd827f169759F0D02B9EE257415028f8F6dA0d5", balance: _1e36Str }, -{ privateKey: "0x54eF8FB2463DD13b79A27C156cca3b5be4b01FE8389FAfD2f997cD1B82ecfCFF", balance: _1e36Str }, -{ privateKey: "0x75A8AB521AAEeaf0E42e77cDaD4a4AfEAf7a2f8a150C9d1Ba62d13FbbFDcfD81", balance: _1e36Str }, -{ privateKey: "0xD60667da5feB3E0D8dcDF76D02fEFF6aCDa9e25BC5E77d97aafE4e8F2eD75eBe", balance: _1e36Str }, -{ privateKey: "0xf383a7EB9D9DB8e5efee7476afFBC04a7EFD509a34ddeb4558FcefAbDb212ea1", balance: _1e36Str }, -{ privateKey: "0xC9D0bda6b7782F6E3bE8b2Dfe2c6a980ce9295Ea5Ee4bf7aE639CB627FcEaB09", balance: _1e36Str }, -{ privateKey: "0xfeE3A4D514e4fECeD69ed8Da9f4AB5f5C1dcA48D6dc9cF2acB19787fe3BC79DB", balance: _1e36Str }, -{ privateKey: "0xAFCF716fbc2DD744bDc701FDB8fabD07B47BF8ef7Dca8303E951A39A4a9f9cE7", balance: _1e36Str }, -{ privateKey: "0xC97AebAF9C6bE1B0739BebFb46cEfaAE9b62A298A77DCfc19CD8fB1B9D0C3259", balance: _1e36Str }, -{ privateKey: "0x22ee2eAC806b1Ba3cCAf5f7DDb0F8CBc3Ba3D5315cEF878FD0f3dA6b2aD3E64b", balance: _1e36Str }, -{ privateKey: "0xeA10409ad8924df6fdCDD543327E823D7A62B6DDCdf44AbfA8fFa5581d816b2e", balance: _1e36Str }, -{ privateKey: "0x1A2BEBB1E3ed72B4ceD24b645Afbea43AeeD9fB64cec8Cac641BcD4dD4A1d7Fc", balance: _1e36Str }, -{ privateKey: "0xBA1E1C4Fb4BfBCe16cbbCd2A1307FfE3C3cc75AA6f7c9568e210E54761b043B2", balance: _1e36Str }, -{ privateKey: "0x0EDaD22FBa7F93b4BAC019e57eF6bB9839d9c347c01E865EEAdD2D35fcc8f13B", balance: _1e36Str }, -{ privateKey: "0xcb11eDE2faDca37ea4C20f3e3D75D61DcdcFeFFAEB28C82a38Ad789B3b3b23de", balance: _1e36Str }, -{ privateKey: "0xabe2B8EaedE6a50A21c8Eb7FFFcdd563d3e6AbaEBCF667D2168dFCcd0cc72d7E", balance: _1e36Str }, -{ privateKey: "0xcbE612CddeC30eF0f24FBb5CaDaBC731cFE11bE65eD66037fe2F410cDEFF3E0a", balance: _1e36Str }, -{ privateKey: "0xdCeACc56f3Cf9Adb2b0ebE28CCF40265DbAc01995b2A85679dc73C397b3C53AC", balance: _1e36Str }, -{ privateKey: "0x81ECa333Dd6Bb51eE5DD8eB863E0dfC60D7EaBE8f53E1998aF52FC2b331007aA", balance: _1e36Str }, -{ privateKey: "0xe84e0F0A1e5c21F298f07eDFBdBEbecE22A5c133Aeb9Dc32cccf6D0AFE3BFFAB", balance: _1e36Str }, -{ privateKey: "0xF60f98ce3DDCC98A3aa8EDDB68af5cb8aAAe29B1Af9d9C29cBcD6600C4dCB3f4", balance: _1e36Str }, -{ privateKey: "0xCf65fF4BF0cb9Ebd4a58bEb6355d6E15d3D4c94f2e2b5C830aF7dBEaCdB32bDf", balance: _1e36Str }, -{ privateKey: "0xAC0Ad3d4CCdEbbc0b8831Ea9D3D39e6f9c5161eb1ebB6CcdE7F03cc3A4De0DCb", balance: _1e36Str }, -{ privateKey: "0xA529bFDD67A161bf31010CB0C91744d8D51F37Ceecac742aEFc4CC94cFB14A7F", balance: _1e36Str }, -{ privateKey: "0xAB2471c4e05db5B1b7bd7595deC4BCBC4Ff2a21f975e8FF8b258BFBd90bAE9C2", balance: _1e36Str }, -{ privateKey: "0xf52753e7CA0FFFcEdb9f8bCFAC09ABDc4160aff7bF0cA8D9Aa970B892ea8E49b", balance: _1e36Str }, -{ privateKey: "0xdEbecAE057Ebc1E05783eCe8fc4f71a506880e55Ae15C1aEf5F40E5E8608d594", balance: _1e36Str }, -{ privateKey: "0x8a0b2C7E6ef8A478D9A8B0bB148e2BBba0d2cFee76Bf0860BB68f7C0F1d789ba", balance: _1e36Str }, -{ privateKey: "0x7EF23Eb49F7BA9C332b5c1ccFdADe4C4df55Da959fac3AB4BD8999BCdA027Ac5", balance: _1e36Str }, -{ privateKey: "0x5b8c99342De51EcaE5aeBE77fdafBFab3af4FeE6caDaf0fBFf9d968BDA9Ace3e", balance: _1e36Str }, -{ privateKey: "0xffAEd61eE70641dBFfECBAfdBb969752A9AEF3CB710DAbCCCCcdDDBDfDDCC2AB", balance: _1e36Str }, -{ privateKey: "0x6c8eB2AcF8800CBedbAfBE15a599c0ada55e5E3cdeE0Fd8cFd8CcC5A530FBCC2", balance: _1e36Str }, -{ privateKey: "0xdF99a988D79b4fA0835D53cFB35e48baB7b37990655E828aD8FA14Da763fdb17", balance: _1e36Str }, -{ privateKey: "0xFDAEC48AFAf55933dD0bc2Af9aaAdC157Cf192C936C5CCbAb37d5C860Ac7fC43", balance: _1e36Str }, -{ privateKey: "0x13624Efab7fE888abb7CD390043df2eee40Ddad2BAEf829Da7f29E8fE3AcEF43", balance: _1e36Str }, -{ privateKey: "0x4C1FD68F5dC6284AC1B63A933EaC2AcA182381aAF767ffBDc6D5eFAfEA70eec7", balance: _1e36Str }, -{ privateKey: "0xDdfe82EdDcA6b5be7E57Fa8a4a1eDAcFBF57E1fCC2D2f21F56E9F8F843b2e0a6", balance: _1e36Str }, -{ privateKey: "0x342aC2DeEEccbeb95dab2dE01ddabB6Fb8f82D5D1Cab4ea4B76212EC7D8d71b9", balance: _1e36Str }, -{ privateKey: "0xC002fE67B307403dfA95dB342F782d624CCCEa404B5DfCA2aed2a7d3A924dB42", balance: _1e36Str }, -{ privateKey: "0xa03e9eA52eB91Ec3e86bB4F738ae91Af94aB73Ce35F61e4D8f8Bbea6b0add32B", balance: _1e36Str }, -{ privateKey: "0xe45B47DbafdaF2E6bACC1D5Be61a25C8D0CfbF37eceED8Ece3Da51A397EF0d8D", balance: _1e36Str }, -{ privateKey: "0xd32EbDD5d0E087CC6b9dDCd22A1FBD133e413Ff05f8c1bAE9AB14D518FBdAF8a", balance: _1e36Str }, -{ privateKey: "0x3AAd6e9ADDdA9e1ca82AAa1cfEBbc7f4D7389df8Aa61bE5EA4D7aF12F3Cb20AD", balance: _1e36Str }, -{ privateKey: "0xF8A7794C011dA19ac8E96E591ECF6fbacd42AD857440deddA29bC9DdE0b74dc5", balance: _1e36Str }, -{ privateKey: "0xC2c5Bf5eCF3fDdAC33cEf257fb947BD83a5A84aaC2A5C55d71C9A542ce107Cdb", balance: _1e36Str }, -{ privateKey: "0xcd7c4fCDC448F8036AD952aFbD2E23aA5e4ffA2D9Fca58846dbbaab245bFbEFc", balance: _1e36Str }, -{ privateKey: "0xCCEa8a4FdA23ced29Cfb31DA636CaF39AF3eb0a4043a6D4b6B3fcFF1DAEcAF9c", balance: _1e36Str }, -{ privateKey: "0xbAdaB8aC29734aa6947CDcdEEAfe96563624eD9D4e59B6cd5D6043C71c8E74CA", balance: _1e36Str }, -{ privateKey: "0x1af40aa3d7510d1aA399c8aAaacfa5CefA2AA4d0eE9E7C398BC21baf66842C92", balance: _1e36Str }, -{ privateKey: "0xCDE3155F3f60538fAaE857Ae2EdEf6C3eB2C5AdEc4fF6dFfbBB874E1ECE3ffb3", balance: _1e36Str }, -{ privateKey: "0x86fbFCbBE7D15C66dE0d38fE05bFeD9D76442DAca1712dBDf3CEdBE8bE6B376e", balance: _1e36Str }, -{ privateKey: "0xF5f5E0EA43ac3A20390c6AC96BDCadA0cAcC151beDd8151F8A6446f0C9E44c9f", balance: _1e36Str }, -{ privateKey: "0x3cc7DdcADF43AFa8Aa90d1b1DC50c96B357Fb61A7C9f0A1d5C9B3bB64A0DfF1c", balance: _1e36Str }, -{ privateKey: "0x4aF1248a92D4c1bFBdbE17fa14fE8eC4FCf19Cf9CBfAE9281eeffb5b5F6192E7", balance: _1e36Str }, -{ privateKey: "0x883a24F9A39F3cdE5FF3E8Ea8D077E02D275ABf3Dcb4Fc47B8c1c4A10E637cbe", balance: _1e36Str }, -{ privateKey: "0xB69525b2B1FA9F2acBCafce11BcaEF34e04Ab2e9F6B0aafb5d1Ebe5cB829B8eb", balance: _1e36Str }, -{ privateKey: "0x9f9d2Ac96eDc59b2B0abD009BFccDE0Ec73c25bE9F3Dd19eBf58DED76aaB6CeD", balance: _1e36Str }, -{ privateKey: "0x3Fa5c25EdDdEBF3ef85Bc18D16Cffc00c82AbF5AfEDfdbD32950B7FC9D6bdB7B", balance: _1e36Str }, -{ privateKey: "0xde68FE37083dA72A5Cff769FED4bcACfefEdb30035BEac2e4F7A1bC8CAfe55bc", balance: _1e36Str }, -{ privateKey: "0xbe9f07De2B6A3a6Bf440e1392aBB9a757C1Fc96D0FA5D37FAde4E497792E6ACc", balance: _1e36Str }, -{ privateKey: "0xAEdEa91E82Ace1b58718CC4BAebF12c9b3Db2B7D0cD1cA4F95A2fd1cFa0Feabd", balance: _1e36Str }, -{ privateKey: "0xAA230ccD7e3CD6bE51cFCAAedeb3eb0e756BD54bC1b31E96A6baB17D4c52df4C", balance: _1e36Str }, -{ privateKey: "0xb234ffafAa1ECF70A49D5ef2A0c8697E1c8D9c51B2F9b0EED733CAd5fFDD1e5E", balance: _1e36Str }, -{ privateKey: "0xaEFbE7EFbedFE6d4D01e5dA9Fd1807AfF066BeADF853B3F27Db42dFfd357BfA0", balance: _1e36Str }, -{ privateKey: "0xbEF03d032BB1D40A980C4ad18B3Cbf0351aBfd2D82ffa0e3E0FFe67E8B4bCAb7", balance: _1e36Str }, -{ privateKey: "0x0470b2CE45A056FfcB30abCC1ef4D50Fced6b1E4EF70DC71f2D236840E9a4cC5", balance: _1e36Str }, -{ privateKey: "0x6EfAb05F9990dEFAeA019ED14e3deF0A1dF91EBcD96bC5Aa3A3AEac2e3fb51AF", balance: _1e36Str }, -{ privateKey: "0x3BedD06595d0fFc7955aEcCed8f5F8Cfb2feaAa1B2E1f67F2e3393Ac19DD4512", balance: _1e36Str }, -{ privateKey: "0xa50AAEaaBB4AD83B9cCdd5EAECc66bCac0ce3A3Ad5dEE4D45517BfdFa9c88F7F", balance: _1e36Str }, -{ privateKey: "0x6fc5Ee99c79beec4DCB3caEB86910c2BcDf71A5234c757A63ddbd7846a9d907A", balance: _1e36Str }, -{ privateKey: "0xBCc4fDDF957BC7c03cFcdaCa9E022597ecb37B3F0Fb13D86F2A8f7aC243b019B", balance: _1e36Str }, -{ privateKey: "0x1a7Bd2AcB4063c94dc71DcA24c90ba2610cCcd3A0CF01fD643255f95ACA2480c", balance: _1e36Str }, -{ privateKey: "0x1DEa423f0A9Be91A996ccdAb9640aaf69Db4C4eA92FAcF23DaDadA6a561273D3", balance: _1e36Str }, -{ privateKey: "0x9fd3D25E5581a083f7aED75c293415CDfb0C5e1AcB50A9eFcbE007bC9DF68edc", balance: _1e36Str }, -{ privateKey: "0xfC055ED6ADDD5a66FD34dE4B0248AA4Fb8Bd5eacAfecDCc9d885EB276AaE8EbC", balance: _1e36Str }, -{ privateKey: "0xCdc28dFD70Ea5C3F8DD2e501e280F6a8E7cAbAecE5a5d43751732CfEE2aCEE7e", balance: _1e36Str }, -{ privateKey: "0x9CA314D91caF6f676ab6b2B9AEB4F6CeAcBfe8eC4df23505AC0FaFBaC8CF7ef5", balance: _1e36Str }, -{ privateKey: "0xf29be03E90c3f0bFEAfACFb38668C6153e3BBaF47C916c059fE3287C2fC1925f", balance: _1e36Str }, -{ privateKey: "0xECB29908AdB1bAFb5fbeD1d10fcB896f4Fb3c3D26aFe2b1aaE24e02b0198E4d3", balance: _1e36Str }, -{ privateKey: "0xbBCF3d85d9bc8ec9ecdf7AB6DDb03634e79c94f9ff3d81fbCe7DB12f9663EA85", balance: _1e36Str }, -{ privateKey: "0xfe11FcFaaA3dcF9235572a3b956FE9bDddA631890fcc1BC70B5Aea6459ac05DD", balance: _1e36Str }, -{ privateKey: "0xBb7fef9f8bFec37cAFf5A8BD03dDb8bE1dA13ad22E42b0f76fc78D9E2E9d2932", balance: _1e36Str }, -{ privateKey: "0xcafCe7348aC1aeAdFfeb9faabF5944f4AB3ce6859DDcB5aa1b95BEc6a127fAeA", balance: _1e36Str }, -{ privateKey: "0xA58D4Dbf273c8FCDBAC765A5C03846060D21d599F95055ABF1bDBd3D5bCd478c", balance: _1e36Str }, -{ privateKey: "0x9446C99AF1fd38C5b76DfCAe1a7E87b98Cf627dc48Cc91dF4ddEa8f4Edc34FE2", balance: _1e36Str }, -{ privateKey: "0xba8986dDCAea2ca81fA3BfcC7A66C34Fd4ac67cFCb7aA89E19FCFE55ca82BeD1", balance: _1e36Str }, -{ privateKey: "0x5eE33FEa64dCc77C799A48065348BB956a79A0CffAAABdeE7edd2AE912E262c6", balance: _1e36Str }, -{ privateKey: "0x4d6cDBBC4c1dfe97E0383f47ab33C08fc47eEd7f448e9EA8e918ad0FC00aba36", balance: _1e36Str }, -{ privateKey: "0x2DBE32C1C5FEF03eb40Ab4ced59ca8DEef43a8e214802D4DDf6bD73c95f92ED0", balance: _1e36Str }, -{ privateKey: "0x2e929cEEfDaDF29AaEbF7142A9B34c68Bf3cfFcC8C0afa30927fd1E37d62B88B", balance: _1e36Str }, -{ privateKey: "0x859DFf9e0C84fD41820297B60448b074aABc7aae0AC69DDA287AdB53aB413Fc8", balance: _1e36Str }, -{ privateKey: "0x3eb17Eef6AF285e40d6D510dAc28de17a1B8665D5BCA78B765e8Bda4Dd0cEf3E", balance: _1e36Str }, -{ privateKey: "0x1c6caaD90EbDd5caEcCF3aDeBDA4F84DD8d097c8802dFDFaE187BD8EDeFEAC6C", balance: _1e36Str }, -{ privateKey: "0x9cE9CfaD02eBae4f35E7EdceDF675Be4511fc96BBfeecC5e60f00959217C8Bec", balance: _1e36Str }, -{ privateKey: "0xdc31f576C3F2EaF8a1cdC2Eaf927Db64377D8dbcE15ADc832C3C14a36BAfaF8b", balance: _1e36Str }, -{ privateKey: "0xf8EaDADBBEbDfc110Bc65E2c1F4B9Ded6f1AEB40B80Bf39C47DF4BcB75e0b956", balance: _1e36Str }, -{ privateKey: "0xbC5EF4a10aC7dC6BdFdE498CCd1FbE4BeE6a3EaE5997dacd4f9196BaB6c7bF33", balance: _1e36Str }, -{ privateKey: "0xcc61117Fe1Db61BdF74708Acc0ba6eD9C7DCDDd6FDD73D6847f4fdfAD955FDb3", balance: _1e36Str }, -{ privateKey: "0xCcbcFE001eab3CBB1bA87BCE8cE2E6645E1edcB46D91D67eAA0ffAd3a6C61cad", balance: _1e36Str }, -{ privateKey: "0xecdBec45f14F1Bbd4Cbec2AdccE87b9de2B9Eb2Be9a5E650bbE9F4846cda9451", balance: _1e36Str }, -{ privateKey: "0xc3aba0F13baBa70d7EddA7bA64a6656eD67D566E95B0BD57Dc6113cBF96Ba28C", balance: _1e36Str }, -{ privateKey: "0xf2Dc784baACc11b0E746d3fE7Bb102819a64d57B99Dd67be9DBcDe2D9Cb09BEf", balance: _1e36Str }, -{ privateKey: "0x4eF8935EFD03EFcf57ad026cdf7989BaBC3ECd50DD11aefBaAECb1256f600F68", balance: _1e36Str }, -{ privateKey: "0xcc08d111Bcec006D79987cAa3C48D0de1605D587B9CED3FA932CAea3dc632167", balance: _1e36Str }, -{ privateKey: "0xBF5E9dC5AF59FcFDa205D04310a1c66C847AD1fDfbd36C0dA080B182C1ebcf5D", balance: _1e36Str }, -{ privateKey: "0xFB86a7666F3fB8Bec6Ebc0fFd2b063bc4655e2FB38cD4582E32dDbC9e94FAAAC", balance: _1e36Str }, -{ privateKey: "0xD76CE6b726b4b50Dcbf864fde5EBBB7CFF212fB6A98F5bbB53D742AaDF24D838", balance: _1e36Str }, -{ privateKey: "0xE1DCc9952eC00aB57Dc9d63cFfa5befFec53e9eCd311EC4A9bE92a1ea6112fa5", balance: _1e36Str }, -{ privateKey: "0xF3b7cFADCf2Ca68CcfcF380abE18C7E69DeC01Ba48BAD783DffBfdfdaFEE6cDD", balance: _1e36Str }, -{ privateKey: "0xEf3A859bB1Ceee47a3f5D8ab57ff2CC6Efd3B1BDDF4b30c64A2A639b4bb926fD", balance: _1e36Str }, -{ privateKey: "0x4da5bDD86b0EeAA0F2A820Fe2AD1d7fFDf96Bfe4AcAbc1B23Bb0ACAEd8decf9D", balance: _1e36Str }, -{ privateKey: "0x95E5ae73033E9aB2CD56C3CeAE9E47Ac32Fe4244306c4dEebFfBc3da809dE1b3", balance: _1e36Str }, -{ privateKey: "0x249DFd85B8CBdcDceEAaD2Ad9Cebb92B1fF8D4bEb42f2262db1Eb18bdce081FE", balance: _1e36Str }, -{ privateKey: "0xbf24bD2A8732b0ff34aC466Ac8bDDFC79C2f2C5ED5acdfABEbDD71bb5fB8C230", balance: _1e36Str }, -{ privateKey: "0xe4cA41d0B9bEEAA6C1B5dC974421D02cC4f454D60dcAe06bfAC24A62edd1dDD5", balance: _1e36Str }, -{ privateKey: "0x47fcCC94c315e0B40acdB92B2660391fCF09E77C5cCf5fbdc54CC4DD1276C3ee", balance: _1e36Str }, -{ privateKey: "0x4AFc577d869ae8dDcAc01CCd10f4d006eBAe35c6809CD6eb8cB36f5dcB10E4df", balance: _1e36Str }, -{ privateKey: "0x24ced26ee55ee964D3Aa239db36606C0bf5fa2683E25D7C913923eF40c7C6C3e", balance: _1e36Str }, -{ privateKey: "0x3EAEaBd428D442b8Eb94f63824bDB7dBa3FB6BBCE02AC716EDE9a5c4ADb3aa8a", balance: _1e36Str }, -{ privateKey: "0x1058AfC84410FEEa779D797ac9712EB384AA32e1DAeDC05E9E1B5B6faB312D48", balance: _1e36Str }, -{ privateKey: "0xeF2D273f9113dE26fE9EE58e5cDD3b647D649713FcB510ddE583660dad902dcA", balance: _1e36Str }, -{ privateKey: "0x97111bFbeB4ec008601C8c49Eb00b877d3Ed94DcdfbE1bFF440b41De6Fe1C1bA", balance: _1e36Str }, -{ privateKey: "0xD44A809FCfD7ABBf0B1fb58926C6aFb8db0795AF1EC74335c0aE3cBc59bf7388", balance: _1e36Str }, -{ privateKey: "0xf7AC785aFEe8C7C4CDE8a483DFfB9F04C7c2deCd40F1Ad6f7279b23eaeBDBceB", balance: _1e36Str }, -{ privateKey: "0xAe3D5FC926ceBa3D8438fe04Cc67fCd3FAadBeAabD3daEB1F3B07981Ae8Bb8d2", balance: _1e36Str }, -{ privateKey: "0xb97f6405A4AdE29fedf162382E24F072e3E44971c57b0270f57D3eD9D0bBC691", balance: _1e36Str }, -{ privateKey: "0x5016cbe6af3F5eAffDeA93689BAB559cd62864be4D1f95f3433E80f85eEdd14B", balance: _1e36Str }, -{ privateKey: "0x89Bb39638275e8FfEb9E3E1c288D8Bd9de9B03aDE02755AA35F5c2CaFd1Aca26", balance: _1e36Str }, -{ privateKey: "0xEdEc58aa9b6FF626B39BA1A550AeDCF3f09DabdCE67f23a1d8dDd8e0B5D9ece2", balance: _1e36Str }, -{ privateKey: "0x44E1F326d0F73CA83BfC5F4eFC6d38d923a7b7a5F50B2a5F2fb8f1A5Bfc6Ce37", balance: _1e36Str }, -{ privateKey: "0x7002adf36a3aBE927CeC9Fd9E7D1A270E9Eb30Ad6E9A95c64c2bCF0DDa595579", balance: _1e36Str }, -{ privateKey: "0xe49AafA75EAE2fcD27BCe40D95dFC1CA00dc6d8aD34E85070a2B209E02Aa8bBF", balance: _1e36Str }, -{ privateKey: "0x93Ee5ddcEAbfEfae36f19bBEA9db08ce13AbF0eEA4366461CADE4B1a5F5F2Ffc", balance: _1e36Str }, -{ privateKey: "0x7eEE1B08BBfc152fBFEe24bF1Ef24D74D7a99f53f505f94bF854bCAaC6fDD5AF", balance: _1e36Str }, -{ privateKey: "0xfD7691E1C4e6eeE93dbFA56e471dD8Bf6d96d5B4c5772De222Cd3d743FDA4bbb", balance: _1e36Str }, -{ privateKey: "0xC5bAa47DA0aDce4da81f415B7Fa1A2d265e6fbD2eEa9627eC627d13514551fb1", balance: _1e36Str }, -{ privateKey: "0xC5dC2E62bE2Ac6Fde7c8bCfc8eeDBF1dA2023D1ebAF15c99445dADc8afA54aBD", balance: _1e36Str }, -{ privateKey: "0xDA69F8cd86e65D9aa0bCc3Cc0770DFe8a92DA8c3c204DFBC59c8DF1bC7E8cfeE", balance: _1e36Str }, -{ privateKey: "0xCfd8ad1dfc46Bbbec5acbB78a99dDD539CfDDF10dF33809EA2Fa14e829CFadc9", balance: _1e36Str }, -{ privateKey: "0xFE2AdBd2Cd4aCf2A5420ccaa2Cc57488BbDafeFCc276CD260Ce57232B0fe8D9f", balance: _1e36Str }, -{ privateKey: "0xfc5aAcf203DdA20d9ED026b021C38FA30f79dBd11c910B8cADCc22736Ac999aC", balance: _1e36Str }, -{ privateKey: "0x8fF400ABf0EFFcEeDa96E1E9FEFF630b41fdc5dcC73385FE21BcAf4A6d13FCC0", balance: _1e36Str }, -{ privateKey: "0x8FeEaa20716F2d9Cb4F24da2b946B73aDDa9CF0dC46D50fcCa3D9A8ed7A5B629", balance: _1e36Str }, -{ privateKey: "0x39BFCfdc6336c3AED93e5E1fcDF6dC5aD5FfDFDd73DFDDF92EfC9a7ECd4F2B66", balance: _1e36Str }, -{ privateKey: "0x89aF49cBBA73EC2cEDFaEe83E04fcd84CdD54bEaEd2DB5Dea004a4bD9b5f6D38", balance: _1e36Str }, -{ privateKey: "0x97Bd585a8711Ff2b6dcefcF4DEa7a892dEbAd6cddB7A80E0FFbd77C735cf26Ed", balance: _1e36Str }, -{ privateKey: "0xF3D378c1C1C16E4488DBA42CDC5EAEcCd6e91B527bDFFEe0cEce0C0731C1dCE8", balance: _1e36Str }, -{ privateKey: "0xbDCfBc27af3dF84Ddb0C5c8C1eeA66EC4C4E71AbcEcF944488Aeb8ac0eBa6CFC", balance: _1e36Str }, -{ privateKey: "0x8Ca7a2453F1228EE42A9bCfBe69D0ae77d160Ac6F3ccbedAE57bccD3697b5Ada", balance: _1e36Str }, -{ privateKey: "0x2DDbc7BFb4CaF0eC15CA2CCEED167Ccf0871fDC0db7370840aBd731AaAEDc4b9", balance: _1e36Str }, -{ privateKey: "0xFD74E4d721D5C19dFAbCFFC106EBeC0c68E07A0f96DaaCC25AD692Cfb49a5BE2", balance: _1e36Str }, -{ privateKey: "0x2b60Af3b24957A2B647f862471F0f83C72b3DEba9487d55D3EAcEFd155b45F8f", balance: _1e36Str }, -{ privateKey: "0x8F8b464533E34f5f682D8b5EdBb3da5D2dF0a00FeC80aFbFf6Dc96CFEae49bAA", balance: _1e36Str }, -{ privateKey: "0x53faaD69Cd72AE36188fA114Ba0dBb5AeFca1bf433e6ACa7BD12adBC7C5F3d23", balance: _1e36Str }, -{ privateKey: "0x154FB1bA5F534Afcad6c98dCCaF8E665cff789CEcC94b85eFb9BDA3AD0eF35F4", balance: _1e36Str }, -{ privateKey: "0x3AAA215cC6E8feb99963Aad7afE59eb26deDfBF5f6B7daC368F6553Ff63Ad5a7", balance: _1e36Str }, -{ privateKey: "0x32f2F965aDC3CA8e3aeC77A943bBAf7a4FbD2e6CAF263b0dec3522Eff5F82b81", balance: _1e36Str }, -{ privateKey: "0x607964b9E9F2da42b9ef6f19Ab58916fbFad9f298f2C4dAa8D630AE0fEF49D57", balance: _1e36Str }, -{ privateKey: "0xb1B538E586CEdDFe53Ba4E3BBb5c8c5Dfa2d6CFFe703363e3EA9AEB5b22A19bd", balance: _1e36Str }, -{ privateKey: "0x1d541Bae5F4eaf7a8979dec6deb9e8d8B6A9ba83EeDa541dF4097BBdaDF029D3", balance: _1e36Str }, -{ privateKey: "0xE9E1eFB646B66baA7EBa42C6BAe8C946f98c8a104d3Fc673Ae6Cb3Bf194bD65c", balance: _1e36Str }, -{ privateKey: "0xcFFab4a6BC9d14b50dBFc07EcCD679751b796Cc49d68FBB94c97dEae4510d9E3", balance: _1e36Str }, -{ privateKey: "0xE2d224d242CBa5b90F58086dda66FbE21F02Df0960aCDcbD4c06906dcddEC033", balance: _1e36Str }, -{ privateKey: "0xF57D160bcDBcFAd1DC2c70Bdcd9cAAc45ef6f5161FAE09dCAA6e207421c1896C", balance: _1e36Str }, -{ privateKey: "0xc3EED2E9f6F14f264ef4Ba78D50E672E99CDE6F8FA997FD7BdCFB413D5A67d66", balance: _1e36Str }, -{ privateKey: "0x15Bf5A7aF7dAaa4505eC3DbBb28ec8F7E90023B2b5AC6f280efD3DE2dbAd473d", balance: _1e36Str }, -{ privateKey: "0x042C399a9D186e615487Eb02D2fa362FD752Bb4dA5FDD9bbcBB45bD47C676b4C", balance: _1e36Str }, -{ privateKey: "0xe8aDeCDaFDaefF5eEfAcDaA4Ed69fbfBd3eB9ca5ECAE7d0bB2d1ad8fE1595BD7", balance: _1e36Str }, -{ privateKey: "0xBfa03fD857FbdE0EDAF4bFdbEcF24928A6F52B8233bCb8b2210fb1C7DC7Ee092", balance: _1e36Str }, -{ privateKey: "0xbDd235E8e1F752804aCEBd95eF17beE4Ca6CA78cfFaE38df7fd4Ada7D258469c", balance: _1e36Str }, -{ privateKey: "0x9Fe6D3ba6FF436Fe5b90aAaD9338aa3Ba10E0A1C8579b2dA4D7bF615ED61d3d2", balance: _1e36Str }, -{ privateKey: "0xC58c288D955b6B5CDDb8f1D8a7c57AddB17CE9b44D0eBBa94De2EFe6DCF6e92e", balance: _1e36Str }, -{ privateKey: "0x4aDedeecDc94fFaEA8BBe6Ce1f1DB97bACb54cbCa5dfCDcE7FFaaD940c603E93", balance: _1e36Str }, -{ privateKey: "0x46c6dff2D4F9fBA00e995d0b1F3029a231ca9d2c6cfE2b92d085fF4deA627a88", balance: _1e36Str }, -{ privateKey: "0x0AEF054C7FFB5b667BDf65F6a1C2d6FDFE4ee78Bc5B5Bbc0f290dCe5d70ccFa0", balance: _1e36Str }, -{ privateKey: "0xF9B08fdeaF3E0FDae047009A4Ff8cfDecDdDCfc02aD9bdDf87DB1fd4CCf372Df", balance: _1e36Str }, -{ privateKey: "0xC5cED5Aedbb1dfB3a0cA0e513c4Eeb2FaaFd69121eEFC98A975DeBbeb1fdd753", balance: _1e36Str }, -{ privateKey: "0x9834b4e845Eae985b6A2c945F512bbBb0e5add70ecbd1cBBaFb5f0EEAEC1fef3", balance: _1e36Str }, -{ privateKey: "0xA7dB2C1D8314eE670786aF1f9c7D95EfAB63a4cDFDa1CC24ad8f3F1E06D9bBaE", balance: _1e36Str }, -{ privateKey: "0x2B57529bB2fC4bE6640bE2aFcAB9ED46A81DCfd37aFBaEAe38EbFccAfc4FC00b", balance: _1e36Str }, -{ privateKey: "0xf5BE9e3EAeEcAD49Ffa90f9e14C9bfa03f1ac2D374E0fDe3F0EF02a6E889ACfE", balance: _1e36Str }, -{ privateKey: "0xb6dFAEDFFB18bda3F3c9133ED658E857c5fdcD70241b5552cc3fb14DEC1c1D50", balance: _1e36Str }, -{ privateKey: "0xeaa56dAf4Bb7d6cb1Ff91088C76bd1C0FCfDAD6cEd7A390E40aDfCe2dB4E0B4F", balance: _1e36Str }, -{ privateKey: "0x9e3Ba740d7ca6dF7cfFDBd4ea1d5fe65a58789C40E4D55d1AB46628eEFad7c2B", balance: _1e36Str }, -{ privateKey: "0xE650eC3FeAbf8ee1f33C7dfB0e76Fa5c4C9FE296B05A35dcbE37371EB475D5eD", balance: _1e36Str }, -{ privateKey: "0xf011FAC998596eC1ae9BF4EcFdd9e978CdA2d5e0b8637a5cB45ba25FEe24cD38", balance: _1e36Str }, -{ privateKey: "0xF02Ee58E87783b8c9BDa19cDB4faED322E207e3ca31C7ebC1Cc1eCeFed9c0Ea3", balance: _1e36Str }, -{ privateKey: "0xE6366CfAa6adB597Cb5cA65d1aA4041Ae5683e699DDA5DB1277BecBc539e2A4e", balance: _1e36Str }, -{ privateKey: "0xC5399FcEEDDDdd9BDf7D2e2cE9C155AC1FAB8edE90DfAE2D11b06c64508F6241", balance: _1e36Str }, -{ privateKey: "0xDc3dc38fEaCe74b32AFb310C06B2FF8A41A05BCa0D6B9B6c26Ad08CAf2aD4F66", balance: _1e36Str }, -{ privateKey: "0x81F59946bBa20D99baCbefA3FcBBEcEB72FF9d6D0d8EbDE58b4E07eB1BFcCeBA", balance: _1e36Str }, -{ privateKey: "0xf10Ac9eeCdD02FF9A4E7fAC5Ecf7B3a22ca1DB38aca5d314CaeFe9ebFCedfd0e", balance: _1e36Str }, -{ privateKey: "0xd5aA7D3CA7eB6Aa0eC9E1FeE8F1Fa199c1729fF6fcdAb28e0aC75fdb9eaBEBdb", balance: _1e36Str }, -{ privateKey: "0x5c96f974E30FC75E6A75AbEAF46494cbad5B44Fc0A5E44EAcB72C8CeC8646220", balance: _1e36Str }, -{ privateKey: "0x1B1f0a704d4aB06B759E5a3C62bA5afdfda53f83B3d01b03a73Ee8A24d4A71d7", balance: _1e36Str }, -{ privateKey: "0xCbBDdc04bF5fFBF96a4e51a63076da86aDAB9BecCdd76ddF6085D38d8bE86eef", balance: _1e36Str }, -{ privateKey: "0xfEd3CB1fdf95D164beFc0FeEe50346f58FC699A8Ef8527b37AdBCbd31f647ebB", balance: _1e36Str }, -{ privateKey: "0xFDEbd46f370c9055Ebc7eee50d5B84b6CDb95C77A41fbDEbbEfdEdac2f981571", balance: _1e36Str }, -{ privateKey: "0x6cf1ADcd3726ADC3cFD7C84cD5aAc5FAc82D646729C98aC6cfBf1Ae177F7695F", balance: _1e36Str }, -{ privateKey: "0x4315bbD51b16006aBc5bB567fF405Fb12B61E88F5a726B2910E9ec4F7B150bbf", balance: _1e36Str }, -{ privateKey: "0x24EECada5b7dEA79DcfAbDD3ACE64c3B87D501c3efD729A2CE8D2B5dFf749eb0", balance: _1e36Str }, -{ privateKey: "0xfb8b4A9Ba3bBea70eaBe4BB1e2eF68F84E52Ad43C6A32eF6E2f4eaF5EAdaB4cB", balance: _1e36Str }, -{ privateKey: "0x9d46Ab1aaDF99733F9BEDDbc5cdcBb7dfC2b7CA5dB44938a62853A550Ef2bFb6", balance: _1e36Str }, -{ privateKey: "0xb671b3405c1b26f7dd8F4B6C1Ec89c53f2b738D3ADa063Ca47ABd58D874af384", balance: _1e36Str }, -{ privateKey: "0xF281B870aF0b3db2AAA0BD6AcBd4Fb9EDb7c0B2B85dCe6fB06793e77fa061FA7", balance: _1e36Str }, -{ privateKey: "0xEac5f06bf2e5A2Cab9122C0EcdEbDaBc37baB98b16dC5911953EB7F1e33CF2BE", balance: _1e36Str }, -{ privateKey: "0xd5FBF5c421D0B6DFa2AcD0B4c9e5a6ed112Ae1F7d5AcfD93dd5D7c76C7eef59d", balance: _1e36Str }, -{ privateKey: "0xC4935995C1Ba68ADAa646895fC4E1d94DcC4Cd7C1E54EBBE8606cC97e13b78Ef", balance: _1e36Str }, -{ privateKey: "0x1acfd63F11ebAb6Ac1E55affF882c6C3B1ac2afc8BaAFdEDbF4768BAfeB714a4", balance: _1e36Str }, -{ privateKey: "0xA5CD11077d5e2D16FC87D5eB8008BE72B9BDe45Cd22cc01eB45E216370F2bCff", balance: _1e36Str }, -{ privateKey: "0x0AA0eD007652ee415413BaF5AddfE683EF6D0F4E7f24647FEBfA12D81EE2F4Fd", balance: _1e36Str }, -{ privateKey: "0x8d245bDEE5919436aeE1426B8FDacED23dDe01bC5C06F6edC67bF4FcfF7E96Cf", balance: _1e36Str }, -{ privateKey: "0x7cB44D888Db151dD249527b2ffCE0cF3d48B32157b2aa397f1d9D15E957F67A4", balance: _1e36Str }, -{ privateKey: "0x286Ec624EDB1e0FAec5eE1dACbfdb44eEdEa4cEDFeED4DFF7a890329aac4A369", balance: _1e36Str }, -{ privateKey: "0xcb62C6E9ada245c7866Fb1E6fA75Fb814111aaE0f9EB26a15ea63edD9fCFb385", balance: _1e36Str }, -{ privateKey: "0xF41fEE133d02A47984F21Ee3857CA1bAc88EC18c17F9E3Bec43A68bbbAFffa8B", balance: _1e36Str }, -{ privateKey: "0x8dA1FEBC1CbDBeE1CB2aca7A7D5c9DE8CFf087ca46577Db7DAaBf1bdfCEcbbED", balance: _1e36Str }, -{ privateKey: "0x5d3e68BebDD3FC0bbf7eE339BeDA961Eae0b3D8944FA1bFF3081adA3Ab45E479", balance: _1e36Str }, -{ privateKey: "0x4A63bC6b7DC1Ecb7262A599Bb76668ACd750600BdF37dcBB62f7D9aFA019B2B5", balance: _1e36Str }, -{ privateKey: "0xB7B760c019AeB02c471DbcC21Eb3CeFdF251c9A47Cda9bdD1Ecd0Fd97ec9FD2c", balance: _1e36Str }, -{ privateKey: "0xd3553a2Dd2Aae2248c7DB7CF1E4eEAE5dC6DE4164F4f62c336e88D0c487bF37b", balance: _1e36Str }, -{ privateKey: "0xd1BcCBdD5444CF31BEBB6DaFAbfE281D8e221Ad6B7a1FCEa67e7E0125EfC8BFB", balance: _1e36Str }, -{ privateKey: "0x2d78f860c5D1bE4544fCa5F1401bEcc39D37B7B5bBB6412Bc31dFe35DA5bC0BD", balance: _1e36Str }, -{ privateKey: "0xD01A7Af0aa54C3d7c708C4Cc5caC7a24d1dbbfd7f689d596BD5DEFc4b76bcefB", balance: _1e36Str }, -{ privateKey: "0xf72Cd9A5a7ede7db40bcaAB979c714BCBf86C654608AdD356b5035Ff2a2a05Fd", balance: _1e36Str }, -{ privateKey: "0x6abB81eb8241547E49beEDcF16D24Ca9a6Ee7FaBcE460d1d12bfdAEc42a2F090", balance: _1e36Str }, -{ privateKey: "0xa4bebf7AbFcBfa35922F5F9eb68554Ace294CeaB496072A0C885Bb40E3CB40A9", balance: _1e36Str }, -{ privateKey: "0xdc2bCCAccF024fEEfB97CEf1aF59CFF4B5FDa68bA7BFCB588dC7d231F2797cb1", balance: _1e36Str }, -{ privateKey: "0xDDd7fE15d1BeCfc036a9Cde7A8d6DC40fA5cb4766c9cFDbCAc2bfA49fFc448e5", balance: _1e36Str }, -{ privateKey: "0xBFFb0fdb4a591bEDc109fbaaD48ca1F5cd2bcA945c4E8C3b9a9C1CAf3e9c518d", balance: _1e36Str }, -{ privateKey: "0x70AeB6acdbcEE9bDfdaFadf43ebF1f45ED33bB8Ea746fA51bDFEaC1ac5ba991D", balance: _1e36Str }, -{ privateKey: "0x9B6f2A0De81Ba07feFEeDBE7FF90Ff0f5Bb20CfbE3Df2edCBbfFc80CD1a528D2", balance: _1e36Str }, -{ privateKey: "0xCdF04AF2814b4783ccE14FDbDe5e34E21DE511D3d3be9cAABcB3eCC1C612b2BA", balance: _1e36Str }, -{ privateKey: "0xDe678D190EE8Da91eaDcfF72bF39f59bd6ecCBe2De5A06D706B1eFFC0F81faED", balance: _1e36Str }, -{ privateKey: "0xeEf4E3efa4f8fE1F7B5811450Bab3dBA5CbEC3e853a9266f3D5f33799bA57f58", balance: _1e36Str }, -{ privateKey: "0xE12FB1593a7C3DF3d2d1ee01a594b304bD4bB28Cbf0C224Dd024EfAF2ADc7BDD", balance: _1e36Str }, -{ privateKey: "0x9ad0cfcc52f929cEC96faf1FfE16dBc3a0aA24c6C95Ec3cca3De26b0E012Df2B", balance: _1e36Str }, -{ privateKey: "0x3bFdcCE82594eDf13A0D2B8dd8EA8A52e85bCc37c1A4cD80e604F6B566F78F9a", balance: _1e36Str }, -{ privateKey: "0xBAebFbb2cc3Bb7b9aBCe0b03Ec6cCC0b011eD65FdEfac20dD39EDDF5f3C28Ebc", balance: _1e36Str }, -{ privateKey: "0x84EBBF0D9d0159c6cE3F849da318b9a5e6A24553A8DC74b4fccC6AfcBFCad1be", balance: _1e36Str }, -{ privateKey: "0x8b4cDFc2F87aEFea2d4aAb4eDdB575b30b73f2ccb06ECD7dCfe9C717C946fAFc", balance: _1e36Str }, -{ privateKey: "0x4212FeaA6fE853aa6B51F464FC5b221dC9f658B2DfBABDE3CF8a5dFEB4c0615c", balance: _1e36Str }, -{ privateKey: "0x8e08f6C0cEe2Db254bdA1e0DABF0a2f50A1575b6dfaB59253ACb49E5B2EC80d6", balance: _1e36Str }, -{ privateKey: "0x4b95243CE2a7E8DE3dC70B34FD53F11BA6Fc9c08d0eCE1485af21011BC285df4", balance: _1e36Str }, -{ privateKey: "0xc62Eb165FA73A038DA5BBaEFcE0dB83AFe4155248D23bAf9dad554ebF9E31Cd4", balance: _1e36Str }, -{ privateKey: "0xe2c65919faBf8C3FEEdb632A706d4EEbEaAF4bFBf20caf6Af8AE7D1E8ED5e443", balance: _1e36Str }, -{ privateKey: "0xB54AAA7c2C3DCFB665C8dfb2cBd5c5dc3c767ffbb1F1ccCb05b6D3C8ECe874f0", balance: _1e36Str }, -{ privateKey: "0x93CBDaEC0A18E9e0B246D5A8D6bB0Ceb48FEf3fd76e5AeF80CF26B8E05b1989c", balance: _1e36Str }, -{ privateKey: "0x08C0ACEdFCe20fFCae0Be436BFC3B5FcBcAedb921179BfeB8466A92BfF25f709", balance: _1e36Str }, -{ privateKey: "0x799bbF4AD3fa5f733D7dcffaD1c4Ac1398E0C4BfA2a5Fe8bDc3c0F1cEFFB646B", balance: _1e36Str }, -{ privateKey: "0xaF337ACffcD35BC135c0912aCAC2C3cdD7bda8D21BADCD90b0Da0d4d1610a625", balance: _1e36Str }, -{ privateKey: "0x8bC8CE78c3AaEef8aFAAa0b5CAAaDd0c8Fc5fb9960be5FA720cBe70eBFa92FEe", balance: _1e36Str }, -{ privateKey: "0x19348a82efC7ab72EF69AE65bb2f479762c73FBbed301dEd8976bD14AcdE0811", balance: _1e36Str }, -{ privateKey: "0x9ACD0D449c9b9cb84c10dEa2bEeCEA0BcCD789CEeB6DbF60D22a064499b93d9d", balance: _1e36Str }, -{ privateKey: "0xdf7C9F563eedceFf3Ebb447f01f5FdfCCe7bE2c32BBd481b75AFA9980EcAbE31", balance: _1e36Str }, -{ privateKey: "0x7Bcd6Db2Df3d9ccFD8AC44ED594C0d756E96B6df4ec3F5Ba76d8B7a4b9aEAAfE", balance: _1e36Str }, -{ privateKey: "0x7052Bb6CfC1bec1DD5aCC9adFb242F1AecD931CfE2f76E763e7938eb2508CFe5", balance: _1e36Str }, -{ privateKey: "0xD6DBd46424AbabbBeE228ae2BA1ec46BdA7aDD5fB05ed1Db79228966Df8A2417", balance: _1e36Str }, -{ privateKey: "0xeF220f3F165EeAA5eFAd93C7b06fc11ddE9efa7b17CEaabc3DFc21F3b89bdCBE", balance: _1e36Str }, -{ privateKey: "0x48Ad0CBfe4B93ffd80c608B7ffb67C340a623158179b5F25882a969A5Bfe3eC6", balance: _1e36Str }, -{ privateKey: "0xEADf05147fAB6EdADDCf57b347eA424cc6F05daE048Ddf8BCfd7B5DD8Fa33d69", balance: _1e36Str }, -{ privateKey: "0x8429CeBE1DaF6fdb3f1cCf415f7Fbf86eDF4F81fCfAE8F4650BAc2CE6Ac4bcEB", balance: _1e36Str }, -{ privateKey: "0xcBd6AfA18dBF4a4Fab4035Ea7acd94B0E157daEbdF6108bCe6afCC23ddD05EAD", balance: _1e36Str }, -{ privateKey: "0x27cEBFf3ab89E5EfBe3Be377EdaCBA61D91d3E3A6a55aBDdAeABdE8155c1F3DC", balance: _1e36Str }, -{ privateKey: "0x32bA9c7fFf4CBAD1BE29C18a6A4cc61EF9C58f253cf38cEf689F99AE73490D6a", balance: _1e36Str }, -{ privateKey: "0x7BeD2ceC78a5f6Bdb3Cb3Da1CA564d8ccFD0E5915A8ea88a09AEAa38f7dcEfEA", balance: _1e36Str }, -{ privateKey: "0x4cA474E60B6e76f2BA0C99eaBcFb2d8B3F51BCd1AAE7BbF723cff06dCCAbABfA", balance: _1e36Str }, -{ privateKey: "0xA39A8Def4CEdCdb3d4064Cae8CeAb70dB1A80ccffE4909F77A8Eabe7A0B8Fd77", balance: _1e36Str }, -{ privateKey: "0xDaFe6a2bDd8Eb330114EaCbFdEb7f5dA0dAF418d7c54919EedaacddECedcD9BE", balance: _1e36Str }, -{ privateKey: "0x4D63df85AcC8Cceb275eC4DA2adBeE7d4eD211B4F77BfcedD4deCA1B7cea3cD4", balance: _1e36Str }, -{ privateKey: "0xE3CCceaA12aA8cE6Ca83f6ce7dCEB81d7BF5e856458Febdcdfc203A50EA301aB", balance: _1e36Str }, -{ privateKey: "0x3f71ACa0e91fe0acbfAad66d64AfeD2925C7eF69dc649f4da85AD99bbf93aDBE", balance: _1e36Str }, -{ privateKey: "0x0fBfe96f189b3b6Efa9fd66aa5F93C6d3020D3C9d1fe28a2F74E13db1cBc7C5E", balance: _1e36Str }, -{ privateKey: "0xFc0cA27f2F1Cc29C937ff4Fb175e34b496AC01728fDAcB28C94fED5C05BAb0e4", balance: _1e36Str }, -{ privateKey: "0x0Db84beEa5bAb0DfafF155bDd0B1B00eCbdD3DC06fBA0dC84C51c0D3acCcB5d9", balance: _1e36Str }, -{ privateKey: "0x4FFFEa9eC2D9CC1279fecFa2b85e32dA2CC9bCc3f9ae9Ec2dF8Bcd3Cb5CF3DEF", balance: _1e36Str }, -{ privateKey: "0xCF45aD24Bc60833EfC83CEa0c2fB3EceaFfF364EDbcfc5Ed54fe1b27FC9Eb2dd", balance: _1e36Str }, -{ privateKey: "0x341C87dfe6c55eDA97c089cCefFe25BaBf879DD979BD86D60BeFE0EE2cce7A2B", balance: _1e36Str }, -{ privateKey: "0x72A3CB97891Cd21ecBfE493103E2ef3F553E7Bea45BDc8F8C69DF40d86B9c95b", balance: _1e36Str }, -{ privateKey: "0x0BC05a1dB9730AaAABD63C83aae8c7ad7BD6caafAF5b1bDD7Cf2BDAE2AcE5B0d", balance: _1e36Str }, -{ privateKey: "0xB1E43dc2fC4be2196Fbc2D1f598d8f8B3D48b0f4802d6a5752E8966F9E499baf", balance: _1e36Str }, -{ privateKey: "0x6DfFAebEb0c92A74F180F03BDef5a58ceFee8C6C13df3F935BaE0942D84c91BE", balance: _1e36Str }, -{ privateKey: "0x74D3eDdeFB3adAb9D80CD50FdBF96952bB9aBfD54C0B23aEbaCBdbB0aAa3222d", balance: _1e36Str }, -{ privateKey: "0xABdc4CAb1dCA5B1F8dafab4EDDc8CA68A6Ccddc1Af3Ae81F7B877c4CeE1e2105", balance: _1e36Str }, -{ privateKey: "0xAEE19407edbA64FCfaaCC787fe3BcDAf32c8d9FC26f818FeD4b134bCc769C798", balance: _1e36Str }, -{ privateKey: "0xB1B36EbDec7bF057AA4EACf8f0fcA86Dea50dfCac52d000cD14504A7D7e5E6Dd", balance: _1e36Str }, -{ privateKey: "0x073B112784Af33eB0c7CAbEbdE699EFcdcc88D0cCBCEa8Bad5f2060a1dCc9Efc", balance: _1e36Str }, -{ privateKey: "0x4a9ef46CF1A4c1B0DCF590091EE4eeECF90365EBEf1BBd46CCf9bAE99802A72a", balance: _1e36Str }, -{ privateKey: "0x31EeC3C6f0a09fb3c1cBdb97bee421b93af62505973eDC73B45efFDF2f5C1bfe", balance: _1e36Str }, -{ privateKey: "0xCc85cbe0Dd6E20ef4b8EEBd1c5cBE1656A438ee0f95B0a92dA6BD4aCEA68633D", balance: _1e36Str }, -{ privateKey: "0xbbfA2A317F66c5Ae8a1F4c3cd1df826aF868E6706CbFc53E8FFe186084d9BEd5", balance: _1e36Str }, -{ privateKey: "0x5937F3Eb612DAF87D58b0dBBeAAfeaA0Bc3FeCdeD4D793EcaF64EaF0bEe662b7", balance: _1e36Str }, -{ privateKey: "0xf5eb6EA30B43FC1ea1a1FfaC7b3Dc092cbDcb20ffC2ff7CAF7E9E136C0F9f8c4", balance: _1e36Str }, -{ privateKey: "0x83f11ea15ADbE304d7b5acBbdAF56f65499b9ed2Eeaf705661FEAFC86EB79E4c", balance: _1e36Str }, -{ privateKey: "0x5c0dD1bedA721b6f83EDcBb8bC977FbbeAa8affFFBbbBefdcE9dDbDddbc880fd", balance: _1e36Str }, -{ privateKey: "0xF48B48F531C3c4F7C6Acbc0e8438862e48ABf954a6Dc38d1864aDeaCEfd546B6", balance: _1e36Str }, -{ privateKey: "0x64EF5b40582DC0Ab3a088D26fECcF01EB72aD21facE5C59cDdD6E2ceF6AC4fdC", balance: _1e36Str }, -{ privateKey: "0x47c8b737FDb3C90C3AAbb3aD14DDf4CFff8b5B493fABABA8af19e1F6e2d53883", balance: _1e36Str }, -{ privateKey: "0x8e8A1eC2Fa5eFD739d97660FCA4d038fBde1bCFf7dbBef10b4cc66F84A25C1Ac", balance: _1e36Str }, -{ privateKey: "0x984214f0F5834c25FDAd611fB217a14dD3f447A38dbBd1d6CfcC85A2ec01f73E", balance: _1e36Str }, -{ privateKey: "0x58286d4C7aBfDAfba1Dea11EdcEC8B9b5d7D620F6AE7B6faDaA807F680D0b8c2", balance: _1e36Str }, -{ privateKey: "0xD2dfdC0Aeb7aEE84AFcf8bAaA0ADfBBBf78A7cf2CfaC5AE91Fa3901D1eD4Db5C", balance: _1e36Str }, -{ privateKey: "0xA4dDFc64d5Db52C59A3AAf1fF3Fdde718C84727344f73d17758845e3e28e3DDD", balance: _1e36Str }, -{ privateKey: "0xdF252058bC5C6B869E870fE0b5eADEB3DfaA87ceb05C858001dab6BbFccCbF2E", balance: _1e36Str }, -{ privateKey: "0x06E174ccBdc12cA9a178Bb77629c904cEFB648ceF6a7ADDDEFAc8C9C2bbEB8B7", balance: _1e36Str }, -{ privateKey: "0x40F8Bede980cFCAFfAD95bbabBD07057ae3cd64B13a6F8B74BBFad7e225766E7", balance: _1e36Str }, -{ privateKey: "0x4De250f8fc0edb17Bf9EF7acfd32ec4474a5Ac2E650C1FAbd0B2FE762e5D7da4", balance: _1e36Str }, -{ privateKey: "0x8F5Df54A8Ceb0bCED8e1Ffd4dc7AdeAF278ddB9037bf9D757d4E4DaAe47f279d", balance: _1e36Str }, -{ privateKey: "0xFaD0345fd1DE72bF3EC5aa6C54Af3E5Da3f92bffbAd8C4da57aaeCB41F2b1ACB", balance: _1e36Str }, -{ privateKey: "0xcB7261aE8B8ACbc54c0a0be47fDd8Ff06f39eAE5F4B08eeeE0FbABFd624CD7cB", balance: _1e36Str }, -{ privateKey: "0xe7d6E0f805a62De4eFEEc80Edacfb11dadFffB44Db5dfdcd1AbC13012d3cbaa7", balance: _1e36Str }, -{ privateKey: "0x7ACcB0561bdae4305de1168C5a49bDACC5Ac546553c9b08CDCD4baedEABA7929", balance: _1e36Str }, -{ privateKey: "0x8fA25cfCE5CeAeC559DC1a58D3d09C2Fe7E75B7146c0B67e9B21Fc8a5F844Dcd", balance: _1e36Str }, -{ privateKey: "0xfD532Acd7c73d011F7bFe7aBF5c162159273eAEd1F5216eAAFfd142644C3DfcD", balance: _1e36Str }, -{ privateKey: "0xbf8A88eCC0787db3e3424029CD9dCee3Db463Cdc09d1fB5546bc288DB2314AeF", balance: _1e36Str }, -{ privateKey: "0x1A51dEBb170bc0C97CcdE4275DcC28DD5dc644Dcbe53F9Af3af802B260bcA51c", balance: _1e36Str }, -{ privateKey: "0xAd4fe5Eda497ca6baAdE514cFD99E326A2a93A05CcbACB0f93CBbdf49efFceA1", balance: _1e36Str }, -{ privateKey: "0x4b1BfCddBCaA2fbE0176aF72f6F124EBAc2dD4DF8c84796a0e482af9eBc1CAf0", balance: _1e36Str }, -{ privateKey: "0xCDE5452CEE8AfBD44cb6EC160F751D8fBBf205Bc46dF6f22AaB47E4E60C7B8c1", balance: _1e36Str }, -{ privateKey: "0xfB367Ae6DD221ce254dBABc4bEdff5F68253A8Bc0f9a92F738a1aAEfb0bB94dc", balance: _1e36Str }, -{ privateKey: "0x2EDE8C08069aD642dE00Df66FC1c2Ac0A07Cdc277B2CF87A14e71E1b8f888D7A", balance: _1e36Str }, -{ privateKey: "0xaF6Cea2f6faef4d5a143A7A55CdC6fF1384eE06b00a102c3BD3BedeAdeEA464C", balance: _1e36Str }, -{ privateKey: "0xb14ed71bFc20EF511ef2f36739c57dae6AacB390FBafbDEdE8BC4930faF679c9", balance: _1e36Str }, -{ privateKey: "0x41bDd2CafDeB7fF8b4a4A4D9BbeF75292E8860EAA2a814B0c67FaAa8a19935e1", balance: _1e36Str }, -{ privateKey: "0xd0D8Ee7BD9C8982a6fA481Bee0faadEBcB8F01A373c6fbbb4eB0Eb9c9ADcc81C", balance: _1e36Str }, -{ privateKey: "0xe9A8A904bE19e2dbf3707727Bba835BF553AaC2f873Ac0ab5d0fFFBc228e142D", balance: _1e36Str }, -{ privateKey: "0x7D52E80b40Fd2f3AC874C734eb5b139aaeb66e7dE3F24dBC1Ff29Cec183E51a8", balance: _1e36Str }, -{ privateKey: "0x19a4fFEac8cAEbb1eE1Af9C1DaEee2055efBC770B0a59cFc5cDdCAAEcbb4cDE6", balance: _1e36Str }, -{ privateKey: "0xCA230f50B3abdaCae9E3fafcdE9d64abDF4e2DD4c7fed6CCEfB4e67d7eDE3B09", balance: _1e36Str }, -{ privateKey: "0x3EdC018E9F11fEddECE9FBb6Aac9D5DDc1FCA0B3FA5717130f6CE91ce1eFd1E3", balance: _1e36Str }, -{ privateKey: "0x9Ff6194cF7FAf32C3c1fCd9BCe54FE38388472C1E9bEc2c69B77169cd2A9A5E6", balance: _1e36Str }, -{ privateKey: "0x4E827C860CC5Dea9b1fe0eaCaCB2c3B3ccB578bd3bb0531E9ebBA02517f6aAcA", balance: _1e36Str }, -{ privateKey: "0xfDDDAeAfDEC458a2bA2787AceAAe4C7EbfdA08cc92Bd139F06e4Edbb650F73eF", balance: _1e36Str }, -{ privateKey: "0xeBb1c685530027dEb3BcfF85EBc23fCffb07DF6dBc68136bc72C9fC42e7A76f3", balance: _1e36Str }, -{ privateKey: "0x2Bd5dAC44b3ffD2Fa672feb9A766E0F82cDBdeFDce08dE6e254CAB19eED77F73", balance: _1e36Str }, -{ privateKey: "0xaBF3eFEE7072A2EfC7b9ded386aBADB55bad5e08423fD1e8AAEF7DcEF1DBcFAE", balance: _1e36Str }, -{ privateKey: "0x7D885F65ec6CBFcA7AcF4F5E88dc2e3ECcE6F075eBECCe37A7EDE1Cd40bC48EE", balance: _1e36Str }, -{ privateKey: "0xd05Af8bcdcCf3baafD4B52880f5F91CcCA8F90DEA31a666EeDD87D2ED8ac92f5", balance: _1e36Str }, -{ privateKey: "0xcDC74ee4A0d1b5f15bFC0cA41Acfa1E0833B3B3F0ddEb57bc40EadF8fA8384D6", balance: _1e36Str }, -{ privateKey: "0x32A0EAEF8daf92eC02F8F4242Bb3cCbcca8bbC6dc7F2ae1D3bc4B9f06cAc6b03", balance: _1e36Str }, -{ privateKey: "0x62983d7CC2f90eA7CBAaaADEB8d617FdE0f4E7DcEc738F1aC8F5c1261BF0abdD", balance: _1e36Str }, -{ privateKey: "0xb20BD7d5594e824F0ab4Ec5A7FB9ab72DF6Fe52A4a4fb2d98cedD1bA5Ea125b9", balance: _1e36Str }, -{ privateKey: "0xCb456dC2af0cb566Db66C6bceeF0E0eBd61deE09A4ED5dFD776aae97292DE4B4", balance: _1e36Str }, -{ privateKey: "0xe7665B3bFB7E1a2cf34edFBfa0ebA7b30cf3AFBEFdCba19A955AB49e7C9ffbAF", balance: _1e36Str }, -{ privateKey: "0x7d1cF82F776cA3cAFca53dC2AAA02f9bF0cf08c8b6E9DcaADa5325dE72d6fFBf", balance: _1e36Str }, -{ privateKey: "0x21EBCbb4e0B2181aC733ACbc45fFAfE4DFEb8CfcAe7fC8Dd221F3aF3eBe2289d", balance: _1e36Str }, -{ privateKey: "0x77fFDeAaf3FD0b3BaE033386b03279Cdf3Ef689Ce5C311fCFDbeBfDC4c1E49F8", balance: _1e36Str }, -{ privateKey: "0xcfAb3C6Ed94e4E14FD27B8B9aCd864F75Fa49Eb9d38137e2DFACdcF389Fd96FE", balance: _1e36Str }, -{ privateKey: "0xaeEd9f852DDd737A30DeABe895b2cc1f8aAb6dcEb30B95CC6bDCa26DFbB0dddF", balance: _1e36Str }, -{ privateKey: "0x8E2dcD9ef26032bcaCCEd3b54eea37cB525B92Ac6dD6120bDFae15DBDA2Fa9dC", balance: _1e36Str }, -{ privateKey: "0x1C2a5ad3861774EECCec2ea51D7C2EFd8add35E3dEDeb3edfAaE7068d17D8DAC", balance: _1e36Str }, -{ privateKey: "0x151E3509bFFCB372A3CEA9cFC49a46ffEE7e0842c2Cf221cB7396De0E9aCefC7", balance: _1e36Str }, -{ privateKey: "0xf5F129CbbD0B15FEbf5Dbe1e3eF1acB9E79d9fddA21c18E35fd3a3FBce4c631F", balance: _1e36Str }, -{ privateKey: "0x1CC7AEe00DFf2548409dCe970DCA0BF4904F146e6A9C4daCd83edABadd18CA49", balance: _1e36Str }, -{ privateKey: "0xeea28AdE7d17EA1DBc8f44d1D9BDFD1aEFeb8Ab8f14Ef89FaabD4667e6A7E8E6", balance: _1e36Str }, -{ privateKey: "0xDaAa027C1D4dFD2AdDB697AcBF9456fCfFe7db1BbC442a86fa53F8DA6f686eC7", balance: _1e36Str }, -{ privateKey: "0xf6fDFeE30bBFEFCBA8C2E88cC95CEC4BED0609A99BF54452dB5ce85d0cF40ea6", balance: _1e36Str }, -{ privateKey: "0x6cafECCAB9399d4B9e14Bcb6Ceb28541a9D8eBBF9b4e50CFed8eaA64faB9BADb", balance: _1e36Str }, -{ privateKey: "0x3f76dddEBCd9Db466DE7BEeC9ABAB7cFE45691bd8a2F0971D0A3eBD25C761A4e", balance: _1e36Str }, -{ privateKey: "0x8FAFf3832Ea4e633ae1A41400ad93f90036eb562aF519dc3ECaFcb168e2DE09F", balance: _1e36Str }, -{ privateKey: "0x8b6bDF8be23aedAAE1b3a16367C21713e781fEE4F4240F4effb3114b91AB1805", balance: _1e36Str }, -{ privateKey: "0x84AC0F4d7eb6bBE867fF1B3CdE0feD6e9bc00Bb92DFA1c08f78E7BD25a389AE6", balance: _1e36Str }, -{ privateKey: "0x9BCD0d5509E3A2e2E2dba094AC8eA3cD5cad438cAdDc8c3bFc6CD4bfaB252EAD", balance: _1e36Str }, -{ privateKey: "0xB9eC9F24b8B3A51E8D7A2560678c59befE1beaD7d647aA46452c4Bc6c3cBC2FF", balance: _1e36Str }, -{ privateKey: "0xFf3DbF3Eed63C32C59a2Cfd1bBDaDCAF3B444B396a5Be2CEF4efA65735eC53Cb", balance: _1e36Str }, -{ privateKey: "0xb10252A7E9ca5cd1E9BCaA2233AC6Ff71fE09Fc7e4ACcDE5278Ed439d14F53cd", balance: _1e36Str }, -{ privateKey: "0xaaFeFccE64d0ef75173b7fcb53DB34E7B4acfF6016b0D30BB605Ab751b4CfC78", balance: _1e36Str }, -{ privateKey: "0x6C4f69B90c6fCEEebaE5BAe68DfD1535CD390acd9e02D4cB96d2F8af37032FbC", balance: _1e36Str }, -{ privateKey: "0x81Ba7d23f7B4d1Ad3f645f31eb5abABAcA7AB54e1eAdCE67239FB32a10b2De3d", balance: _1e36Str }, -{ privateKey: "0xe461ACB3c7CEd3aFF34d8b6fADED5cA6ce8361A8D73db9FcE4e4F03A03b8Be87", balance: _1e36Str }, -{ privateKey: "0xB6DCb0f5Ce7a2dbA36E2eb924423Fb51D19D5c8e5CAaB35F42eCc770226bC27f", balance: _1e36Str }, -{ privateKey: "0xDAa645f35c12feca2C7De49e40c8BeD2c201da5Dc9B9d95440A84502dc4eDea3", balance: _1e36Str }, -{ privateKey: "0xfB2ACCFB24e50E39722dD32fAbb4d52AadA0a3BdE1B4D9dfD6bd034801D262ed", balance: _1e36Str }, -{ privateKey: "0xEeEAe6bA3AD49D0a5EfaE4EC1ebDa40ec2B02ad344eF02D9aa3Dcc8B50AaCe5f", balance: _1e36Str }, -{ privateKey: "0x4fDd5b085cC62175aAF5eDdCAEaa8B8e19e4d8FfAacA247B8Cf8BbCdB61f5d8E", balance: _1e36Str }, -{ privateKey: "0xd69667eC0AeA62AD07BF92aA79DfaFC4D3B92EC7e96BEE2ab79c2eCAADdc87f6", balance: _1e36Str }, -{ privateKey: "0x5AecD5c739D1Bf1d7bbf0d7baDcEdDcbCf254054a1fbc5f8628AD73fA85c9135", balance: _1e36Str }, -{ privateKey: "0xDAAD7760d4CB227Ce91b29e507a6F19fFee1fEE531A6c01cE52Bd167DcAbE89c", balance: _1e36Str }, -{ privateKey: "0x5DdCb703BeFd9EFeA7204dC3fd88262a0Eaed6bed541E32fcF9Ea88Eb433aFd2", balance: _1e36Str }, -{ privateKey: "0x81438eFF3BFaBacE3aceCd8dECbF32FD8937f5DbeC8741F34e2AbCF9E4E32CE4", balance: _1e36Str }, -{ privateKey: "0xaCA76E77F44f52e7ceC896c76cdaf9FB4490253F04f30d3E7EE4B1e48Ef56Dab", balance: _1e36Str }, -{ privateKey: "0xCE0e5aA349CeF541b5BB0eD3AA04a1d5C9c2F299cc9E63fB9DdB9f1AcC5fe59A", balance: _1e36Str }, -{ privateKey: "0x31ca9C9ED9eabFCAce8e6aBe34B1277Ccb9d743f1cbfeEeFa82E3FA07Bc8bfad", balance: _1e36Str }, -{ privateKey: "0xBC75FbE1ea28eB4827e9b9baf9DCadB1381AadBF4a55E3ACA4180bBE7DDbddEF", balance: _1e36Str }, -{ privateKey: "0x47Aedf783aD9f86ed2c7E2783caCACB3CF1f5c9baDBbdE43B8Dee9d81bE86A6b", balance: _1e36Str }, -{ privateKey: "0xC93de2aE78fAfAc941a64602b7B256D2Ec01d9f8f9Bf0b83b861b5C0a7A731dd", balance: _1e36Str }, -{ privateKey: "0xDeeF4C0cdDF5aEc8E78212bF0B3b8aAfa5cF4c97BF67f8A6D4cF37A88AF7Fa46", balance: _1e36Str }, -{ privateKey: "0xc9D0A1272adBB544596D5FAaeFBb4816AF41F822b7C76fEf9AD7B6cBD0CF9B1B", balance: _1e36Str }, -{ privateKey: "0xffEefbcb49b3B6177C6bF9e003322e6Bc20C363CF3E0DAF72137d35168f3501C", balance: _1e36Str }, -{ privateKey: "0x82F54Ce8a7Fad3552fd33bA3fCe2add9aFb0B794BC65dFb7bE13372c57d93CeA", balance: _1e36Str }, -{ privateKey: "0x98acfE2afc89b27f9c1B1Ff5a869B19F1fc21fEeFcddC7f3bCD938D16Cd2e95b", balance: _1e36Str }, -{ privateKey: "0xBe06dcf785b0BA41eed9DE71AecB86927d9C236A71fC18fA2bCfc7121C3f3D77", balance: _1e36Str }, -{ privateKey: "0x2eCfecffb9FbD34f54f1f20A1678cDaC2A2DFB598a8dfF0C96A9b4bf2f9c6cB6", balance: _1e36Str }, -{ privateKey: "0x5ACdA4A2a8Ab9Ecb0AcBECcD57DCF2FbD54795F5bcffB8E461f52cdC7A1dA155", balance: _1e36Str }, -{ privateKey: "0x64B70A2112F282d02CE53DC3DEEe2A5cA69F047bdDBF1Cb2bbfCbcE12efaCCbd", balance: _1e36Str }, -{ privateKey: "0x1fECAEb9fFc0270eDdD2612aC6e2F540FE0C0eD07f62DDF5DF86Bc048Cce80dc", balance: _1e36Str }, -{ privateKey: "0x69D5a3d4fFBFb6BdeCc9bDFFDCad6e8F8Db59092ddf4bfEcCbFa4E4Da1CdceC0", balance: _1e36Str }, -{ privateKey: "0xDcD57d1DbdD088e9Ef87C8A21aD77331F6aCb50bBBCcb3cdeaeCBEEd581B8A8f", balance: _1e36Str }, -{ privateKey: "0xeD844ab3E156fd4e8658723766EBdBa7C97bB6E8Da658Bc5EfCa1bbebF833d4d", balance: _1e36Str }, -{ privateKey: "0x8f6CFEEd8d635faf9f0c13Bcf1EE6fE8fa2D71EE23d9Ce16b122b5BCA88Eaa0B", balance: _1e36Str }, -{ privateKey: "0xe17081f3A374a51ceB0ADcb8D3bEdfc11e6dbF7e0e2f65bf1FBdb366C5Bdfd13", balance: _1e36Str }, -{ privateKey: "0xcFAFa574Ca94fdD8c9aC45DDC76d167D8d0b6dA89f7FBdd315AF109F87d7fd40", balance: _1e36Str }, -{ privateKey: "0xAa9CFf5FDB5C518D5bAaa64b02A6C9c4e12d20CB6b2dF8B84A1C56bbA8C3c8Fd", balance: _1e36Str }, -{ privateKey: "0x817C6aCfAaf68Ad1fEadEadD5A5795A05bBDFc26BeeDbDbe69D4153E7A6fF16A", balance: _1e36Str }, -{ privateKey: "0x050b9FF102EAe35d12E25DbaD5C12d4bC2e280C73D4AE0B7C9a6a5d99C2C2Add", balance: _1e36Str }, -{ privateKey: "0x28c9e1ad7b6B314e8bd6ABB2E5dEe5fB7169bf2dA9D251bEdC60E9b4A571B6bf", balance: _1e36Str }, -{ privateKey: "0x68e27B0dC1ada4fFbE55fDba88CaCb983Eba34dD40108aAdeb8eAE97884ff56A", balance: _1e36Str }, -{ privateKey: "0x80ccE4C8d0f476C48bE18C3C0776676E0B5fBAAF0faafBfc8F1afB5bb86Ae21e", balance: _1e36Str }, -{ privateKey: "0x34bbFC5495db569a94Ed5DE5747eE6ACCc7e7ba8C946791AA1ccF3e33a30Dc16", balance: _1e36Str }, -{ privateKey: "0xBB8C5eeedDDb7aA142f1fFa6465e9da9FdEe97A1B73fbd7A8bC2BDdECa86CdC4", balance: _1e36Str }, -{ privateKey: "0xEf82c09f5B1b96e6DDca8dcF4dBDAFfE8725b8566eC68A30dbdA2cD280edfff5", balance: _1e36Str }, -{ privateKey: "0xBE512B2179Eaa64d5beb168A6DF2e05454ACE275a4DF4ed8Ce7c9edD4cBACCDB", balance: _1e36Str }, -{ privateKey: "0x9bfC1d24Ce15BF4EDBAdA78A6e5Dfdd9aaBdbaB3c05Eeb86Ea1b771300e25F3c", balance: _1e36Str }, -{ privateKey: "0xa0Ddb0Eac7ED144d2f88Cb9FaaD9aACDf74f4fAAc8C550F824dFb3ED5d7DF7C9", balance: _1e36Str }, -{ privateKey: "0xdA41e0E1efBaCCB4ebA469372cF20B82aBDBf1a97C90f33c2B7d1e29F06FC25A", balance: _1e36Str }, -{ privateKey: "0xCC807D5aDD9daCDAD981d9D4838493df59E304e2E2b8D6F23fc78Eca552D4679", balance: _1e36Str }, -{ privateKey: "0xf8F18DdDc15eE16Ade324930E5b2941cfE6f857aEd7B3d0E912946d7681a0DeD", balance: _1e36Str }, -{ privateKey: "0xCE3a8E365ef9DEb61D8D95cbEF92Bd7f93C4bEeBF50fCCCbC6a4ceBd6beFf5D5", balance: _1e36Str }, -{ privateKey: "0xEd8C8bD61eDc84fe50D268aAf98ECD2c5EAae1931B49deaB5A7D13FF60c19558", balance: _1e36Str }, -{ privateKey: "0xe7857579f93baF6813A5E23aDD34dd6eBb58B4b7902f77Fd87D0AF652cD7A898", balance: _1e36Str }, -{ privateKey: "0x65dc072dcca87e1A79c008ce2eaff2270Bf049e0463796E1B3aEEe8Cf489Da99", balance: _1e36Str }, -{ privateKey: "0xAEaCFcb0ca60cd81A28C860e84c0C531D42CAfd20B92F8b83cFd92bD0eC99AF5", balance: _1e36Str }, -{ privateKey: "0xCBEae8B321DEb6BD2B4CbB6E1b6eFCbffaDFDde7751400ACCd0eC17bd36244Aa", balance: _1e36Str }, -{ privateKey: "0xe72eABb7ce28ffcFe62b5D830C5051f1Ba3CffBE9caE9eB1F5EAeaf331A1b1cb", balance: _1e36Str }, -{ privateKey: "0x577F6CE1fbB8a05F89aEBDe9964fB1ffAA2246FacC0Bbf853ddCDCD22D381a7E", balance: _1e36Str }, -{ privateKey: "0xf9b099e16ecC12df5c2AAF2BFEB2CCdc09Ff7A22c791eA1420774B958ea043C9", balance: _1e36Str }, -{ privateKey: "0x0bddacE2b0b08C0cAc3CCE46BF4bA7ec2BCC6eb3AA2DFc6C8F0fE1aeC9728b39", balance: _1e36Str }, -{ privateKey: "0x84Ef4B5350f5DDc4aD8Ad3f1B8c1D6879eBC0b278e7721C251E0fa19177a9eAc", balance: _1e36Str }, -{ privateKey: "0x1E0AEABDed46AcEEce6AFDd0Ec0f61d4CAaCfBE444DCFFd0f60F4Cbb13f85731", balance: _1e36Str }, -{ privateKey: "0xF343894B68aE4dE6Afc91FEBeccc93388Fe97b052C232FcEa1CD5B7DcDbC3BEb", balance: _1e36Str }, -{ privateKey: "0x60a402CECbBbC64De165d3c64fEFed7c0DBddFADAfFf948db17Ce4eF7a692F33", balance: _1e36Str }, -{ privateKey: "0xd801b8CDcFec3c9E9F9cd6E034aDf5b78D9bb2be2060D87C9e85E8eEC4D2b968", balance: _1e36Str }, -{ privateKey: "0xb7BCF6bAf7b4DCf376B6FC1f8ed0Ef4edc01d7B7Ae2c1B85E8AEee7bca6D53fb", balance: _1e36Str }, -{ privateKey: "0xf9474f95B5Ebb1dE6A82F7dD2d0bbee7ABc29BDDd9FdAE3ECed9c152d6F1FCeE", balance: _1e36Str }, -{ privateKey: "0xE93c61CA6EE13ede2bDb277E578C1FEdC5df77B20bd38bBefbCB3b150dc96DC9", balance: _1e36Str }, -{ privateKey: "0xDACEEDd355a4FADCAfF83889ff47DfbA80Aa8B08620cC995e3bcb49AcEf68fAA", balance: _1e36Str }, -{ privateKey: "0x3ec7CeDbaFD0Cb9Ec05bF9F7ccfA1E8b42b3E3A02c75AddFccbfeB328D1B383b", balance: _1e36Str }, -{ privateKey: "0x72a88DafE5e4Bd140F730da7a8bAC3F15fEB006Fc1FBC37e1C1A82EFBEC80875", balance: _1e36Str }, -{ privateKey: "0x91DEC3CB17104f6fD6eaAFbbD47Da6A2a9EcD57fcdCaeD07aB9Bf6Ad61F1EcfC", balance: _1e36Str }, -{ privateKey: "0xB9253e5a74f3E2c9eAACd396fA367d2d999BB2DC1bbEFCF1AbD62d1f350b9Db8", balance: _1e36Str } ] - module.exports = { -accountsList: accountsList + accountsList: accountsList, }; diff --git a/contracts/package.json b/contracts/package.json index dafef171..0f2d0f6f 100644 --- a/contracts/package.json +++ b/contracts/package.json @@ -1,5 +1,5 @@ { - "name": "bold", + "name": "bold-contracts", "version": "1.0.0", "description": "Bold decentralized stablecoin", "main": "index.js", @@ -7,18 +7,14 @@ "lib": "lib" }, "scripts": { + "format": "forge fmt && dprint fmt", "test": "hardhat test --parallel", "coverage": "hardhat coverage" }, - "repository": { - "type": "git", - "url": "git+https://github.com/liquity/bold.git" - }, + "repository": "github:liquity/bold", "author": "Liquity AG", "license": "GPL-3.0", - "bugs": { - "url": "https://github.com/liquity/bold/issues" - }, + "bugs": "https://github.com/liquity/bold/issues", "homepage": "https://github.com/liquity/bold#readme", "devDependencies": { "@nomicfoundation/hardhat-chai-matchers": "^1.0.0", diff --git a/contracts/pnpm-lock.yaml b/contracts/pnpm-lock.yaml deleted file mode 100644 index 1b032d65..00000000 --- a/contracts/pnpm-lock.yaml +++ /dev/null @@ -1,7435 +0,0 @@ -lockfileVersion: '6.0' - -settings: - autoInstallPeers: true - excludeLinksFromLockfile: false - -devDependencies: - '@nomicfoundation/hardhat-chai-matchers': - specifier: ^1.0.0 - version: 1.0.6(@nomiclabs/hardhat-ethers@2.2.3)(chai@4.4.1)(ethers@5.7.2)(hardhat@2.21.0) - '@nomicfoundation/hardhat-foundry': - specifier: ^1.0.1 - version: 1.1.1(hardhat@2.21.0) - '@nomicfoundation/hardhat-network-helpers': - specifier: ^1.0.0 - version: 1.0.10(hardhat@2.21.0) - '@nomicfoundation/hardhat-toolbox': - specifier: ^2.0.2 - version: 2.0.2(@ethersproject/abi@5.7.0)(@ethersproject/providers@5.7.2)(@nomicfoundation/hardhat-chai-matchers@1.0.6)(@nomicfoundation/hardhat-network-helpers@1.0.10)(@nomiclabs/hardhat-ethers@2.2.3)(@nomiclabs/hardhat-etherscan@3.1.8)(@typechain/ethers-v5@10.2.1)(@typechain/hardhat@6.1.6)(@types/chai@4.3.12)(@types/mocha@10.0.6)(@types/node@20.11.26)(chai@4.4.1)(ethers@5.7.2)(hardhat-gas-reporter@1.0.10)(hardhat@2.21.0)(solidity-coverage@0.8.11)(ts-node@10.9.2)(typechain@8.3.2)(typescript@5.4.2) - '@nomiclabs/hardhat-ethers': - specifier: ^2.0.0 - version: 2.2.3(ethers@5.7.2)(hardhat@2.21.0) - '@nomiclabs/hardhat-etherscan': - specifier: ^3.0.0 - version: 3.1.8(hardhat@2.21.0) - '@nomiclabs/hardhat-truffle5': - specifier: ^2.0.7 - version: 2.0.7(@nomiclabs/hardhat-web3@2.0.0)(hardhat@2.21.0)(web3-core-helpers@1.10.3)(web3-core-promievent@1.10.3)(web3-eth-abi@1.10.4)(web3-utils@1.10.4)(web3@1.10.4) - '@nomiclabs/hardhat-web3': - specifier: ^2.0.0 - version: 2.0.0(hardhat@2.21.0)(web3@1.10.4) - '@openzeppelin/contracts': - specifier: ^4.9.3 - version: 4.9.6 - '@openzeppelin/test-helpers': - specifier: ^0.5.16 - version: 0.5.16(bn.js@4.12.0) - '@typechain/ethers-v5': - specifier: ^10.1.0 - version: 10.2.1(@ethersproject/abi@5.7.0)(@ethersproject/providers@5.7.2)(ethers@5.7.2)(typechain@8.3.2)(typescript@5.4.2) - '@typechain/hardhat': - specifier: ^6.1.2 - version: 6.1.6(@ethersproject/abi@5.7.0)(@ethersproject/providers@5.7.2)(@typechain/ethers-v5@10.2.1)(ethers@5.7.2)(hardhat@2.21.0)(typechain@8.3.2) - '@types/chai': - specifier: ^4.2.0 - version: 4.3.12 - '@types/mocha': - specifier: '>=9.1.0' - version: 10.0.6 - chai: - specifier: ^4.2.0 - version: 4.4.1 - decimal.js: - specifier: ^10.4.3 - version: 10.4.3 - hardhat: - specifier: ^2.14.0 - version: 2.21.0(ts-node@10.9.2)(typescript@5.4.2) - hardhat-gas-reporter: - specifier: ^1.0.8 - version: 1.0.10(hardhat@2.21.0) - solidity-coverage: - specifier: ^0.8.8 - version: 0.8.11(hardhat@2.21.0) - ts-node: - specifier: '>=8.0.0' - version: 10.9.2(@types/node@20.11.26)(typescript@5.4.2) - tsx: - specifier: ^4.7.1 - version: 4.7.2 - typechain: - specifier: ^8.1.0 - version: 8.3.2(typescript@5.4.2) - typescript: - specifier: '>=4.5.0' - version: 5.4.2 - zod: - specifier: ^3.22.4 - version: 3.22.4 - zx: - specifier: ^7.2.3 - version: 7.2.3 - -packages: - - /@babel/runtime@7.24.0: - resolution: {integrity: sha512-Chk32uHMg6TnQdvw2e9IlqPpFX/6NLuK0Ys2PqLb7/gL5uFn9mXvK715FGLlOLQrcO4qIkNHkvPGktzzXexsFw==} - engines: {node: '>=6.9.0'} - dependencies: - regenerator-runtime: 0.14.1 - dev: true - - /@cspotcode/source-map-support@0.8.1: - resolution: {integrity: sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==} - engines: {node: '>=12'} - dependencies: - '@jridgewell/trace-mapping': 0.3.9 - dev: true - - /@ensdomains/address-encoder@0.1.9: - resolution: {integrity: sha512-E2d2gP4uxJQnDu2Kfg1tHNspefzbLT8Tyjrm5sEuim32UkU2sm5xL4VXtgc2X33fmPEw9+jUMpGs4veMbf+PYg==} - dependencies: - bech32: 1.1.4 - blakejs: 1.2.1 - bn.js: 4.12.0 - bs58: 4.0.1 - crypto-addr-codec: 0.1.8 - nano-base32: 1.0.1 - ripemd160: 2.0.2 - dev: true - - /@ensdomains/ens@0.4.5: - resolution: {integrity: sha512-JSvpj1iNMFjK6K+uVl4unqMoa9rf5jopb8cya5UGBWz23Nw8hSNT7efgUx4BTlAPAgpNlEioUfeTyQ6J9ZvTVw==} - deprecated: Please use @ensdomains/ens-contracts - dependencies: - bluebird: 3.7.2 - eth-ens-namehash: 2.0.8 - solc: 0.4.26 - testrpc: 0.0.1 - web3-utils: 1.10.4 - dev: true - - /@ensdomains/ensjs@2.1.0: - resolution: {integrity: sha512-GRbGPT8Z/OJMDuxs75U/jUNEC0tbL0aj7/L/QQznGYKm/tiasp+ndLOaoULy9kKJFC0TBByqfFliEHDgoLhyog==} - dependencies: - '@babel/runtime': 7.24.0 - '@ensdomains/address-encoder': 0.1.9 - '@ensdomains/ens': 0.4.5 - '@ensdomains/resolver': 0.2.4 - content-hash: 2.5.2 - eth-ens-namehash: 2.0.8 - ethers: 5.7.2 - js-sha3: 0.8.0 - transitivePeerDependencies: - - bufferutil - - utf-8-validate - dev: true - - /@ensdomains/resolver@0.2.4: - resolution: {integrity: sha512-bvaTH34PMCbv6anRa9I/0zjLJgY4EuznbEMgbV77JBCQ9KNC46rzi0avuxpOfu+xDjPEtSFGqVEOr5GlUSGudA==} - deprecated: Please use @ensdomains/ens-contracts - dev: true - - /@esbuild/aix-ppc64@0.19.12: - resolution: {integrity: sha512-bmoCYyWdEL3wDQIVbcyzRyeKLgk2WtWLTWz1ZIAZF/EGbNOwSA6ew3PftJ1PqMiOOGu0OyFMzG53L0zqIpPeNA==} - engines: {node: '>=12'} - cpu: [ppc64] - os: [aix] - requiresBuild: true - dev: true - optional: true - - /@esbuild/android-arm64@0.19.12: - resolution: {integrity: sha512-P0UVNGIienjZv3f5zq0DP3Nt2IE/3plFzuaS96vihvD0Hd6H/q4WXUGpCxD/E8YrSXfNyRPbpTq+T8ZQioSuPA==} - engines: {node: '>=12'} - cpu: [arm64] - os: [android] - requiresBuild: true - dev: true - optional: true - - /@esbuild/android-arm@0.19.12: - resolution: {integrity: sha512-qg/Lj1mu3CdQlDEEiWrlC4eaPZ1KztwGJ9B6J+/6G+/4ewxJg7gqj8eVYWvao1bXrqGiW2rsBZFSX3q2lcW05w==} - engines: {node: '>=12'} - cpu: [arm] - os: [android] - requiresBuild: true - dev: true - optional: true - - /@esbuild/android-x64@0.19.12: - resolution: {integrity: sha512-3k7ZoUW6Q6YqhdhIaq/WZ7HwBpnFBlW905Fa4s4qWJyiNOgT1dOqDiVAQFwBH7gBRZr17gLrlFCRzF6jFh7Kew==} - engines: {node: '>=12'} - cpu: [x64] - os: [android] - requiresBuild: true - dev: true - optional: true - - /@esbuild/darwin-arm64@0.19.12: - resolution: {integrity: sha512-B6IeSgZgtEzGC42jsI+YYu9Z3HKRxp8ZT3cqhvliEHovq8HSX2YX8lNocDn79gCKJXOSaEot9MVYky7AKjCs8g==} - engines: {node: '>=12'} - cpu: [arm64] - os: [darwin] - requiresBuild: true - dev: true - optional: true - - /@esbuild/darwin-x64@0.19.12: - resolution: {integrity: sha512-hKoVkKzFiToTgn+41qGhsUJXFlIjxI/jSYeZf3ugemDYZldIXIxhvwN6erJGlX4t5h417iFuheZ7l+YVn05N3A==} - engines: {node: '>=12'} - cpu: [x64] - os: [darwin] - requiresBuild: true - dev: true - optional: true - - /@esbuild/freebsd-arm64@0.19.12: - resolution: {integrity: sha512-4aRvFIXmwAcDBw9AueDQ2YnGmz5L6obe5kmPT8Vd+/+x/JMVKCgdcRwH6APrbpNXsPz+K653Qg8HB/oXvXVukA==} - engines: {node: '>=12'} - cpu: [arm64] - os: [freebsd] - requiresBuild: true - dev: true - optional: true - - /@esbuild/freebsd-x64@0.19.12: - resolution: {integrity: sha512-EYoXZ4d8xtBoVN7CEwWY2IN4ho76xjYXqSXMNccFSx2lgqOG/1TBPW0yPx1bJZk94qu3tX0fycJeeQsKovA8gg==} - engines: {node: '>=12'} - cpu: [x64] - os: [freebsd] - requiresBuild: true - dev: true - optional: true - - /@esbuild/linux-arm64@0.19.12: - resolution: {integrity: sha512-EoTjyYyLuVPfdPLsGVVVC8a0p1BFFvtpQDB/YLEhaXyf/5bczaGeN15QkR+O4S5LeJ92Tqotve7i1jn35qwvdA==} - engines: {node: '>=12'} - cpu: [arm64] - os: [linux] - requiresBuild: true - dev: true - optional: true - - /@esbuild/linux-arm@0.19.12: - resolution: {integrity: sha512-J5jPms//KhSNv+LO1S1TX1UWp1ucM6N6XuL6ITdKWElCu8wXP72l9MM0zDTzzeikVyqFE6U8YAV9/tFyj0ti+w==} - engines: {node: '>=12'} - cpu: [arm] - os: [linux] - requiresBuild: true - dev: true - optional: true - - /@esbuild/linux-ia32@0.19.12: - resolution: {integrity: sha512-Thsa42rrP1+UIGaWz47uydHSBOgTUnwBwNq59khgIwktK6x60Hivfbux9iNR0eHCHzOLjLMLfUMLCypBkZXMHA==} - engines: {node: '>=12'} - cpu: [ia32] - os: [linux] - requiresBuild: true - dev: true - optional: true - - /@esbuild/linux-loong64@0.19.12: - resolution: {integrity: sha512-LiXdXA0s3IqRRjm6rV6XaWATScKAXjI4R4LoDlvO7+yQqFdlr1Bax62sRwkVvRIrwXxvtYEHHI4dm50jAXkuAA==} - engines: {node: '>=12'} - cpu: [loong64] - os: [linux] - requiresBuild: true - dev: true - optional: true - - /@esbuild/linux-mips64el@0.19.12: - resolution: {integrity: sha512-fEnAuj5VGTanfJ07ff0gOA6IPsvrVHLVb6Lyd1g2/ed67oU1eFzL0r9WL7ZzscD+/N6i3dWumGE1Un4f7Amf+w==} - engines: {node: '>=12'} - cpu: [mips64el] - os: [linux] - requiresBuild: true - dev: true - optional: true - - /@esbuild/linux-ppc64@0.19.12: - resolution: {integrity: sha512-nYJA2/QPimDQOh1rKWedNOe3Gfc8PabU7HT3iXWtNUbRzXS9+vgB0Fjaqr//XNbd82mCxHzik2qotuI89cfixg==} - engines: {node: '>=12'} - cpu: [ppc64] - os: [linux] - requiresBuild: true - dev: true - optional: true - - /@esbuild/linux-riscv64@0.19.12: - resolution: {integrity: sha512-2MueBrlPQCw5dVJJpQdUYgeqIzDQgw3QtiAHUC4RBz9FXPrskyyU3VI1hw7C0BSKB9OduwSJ79FTCqtGMWqJHg==} - engines: {node: '>=12'} - cpu: [riscv64] - os: [linux] - requiresBuild: true - dev: true - optional: true - - /@esbuild/linux-s390x@0.19.12: - resolution: {integrity: sha512-+Pil1Nv3Umes4m3AZKqA2anfhJiVmNCYkPchwFJNEJN5QxmTs1uzyy4TvmDrCRNT2ApwSari7ZIgrPeUx4UZDg==} - engines: {node: '>=12'} - cpu: [s390x] - os: [linux] - requiresBuild: true - dev: true - optional: true - - /@esbuild/linux-x64@0.19.12: - resolution: {integrity: sha512-B71g1QpxfwBvNrfyJdVDexenDIt1CiDN1TIXLbhOw0KhJzE78KIFGX6OJ9MrtC0oOqMWf+0xop4qEU8JrJTwCg==} - engines: {node: '>=12'} - cpu: [x64] - os: [linux] - requiresBuild: true - dev: true - optional: true - - /@esbuild/netbsd-x64@0.19.12: - resolution: {integrity: sha512-3ltjQ7n1owJgFbuC61Oj++XhtzmymoCihNFgT84UAmJnxJfm4sYCiSLTXZtE00VWYpPMYc+ZQmB6xbSdVh0JWA==} - engines: {node: '>=12'} - cpu: [x64] - os: [netbsd] - requiresBuild: true - dev: true - optional: true - - /@esbuild/openbsd-x64@0.19.12: - resolution: {integrity: sha512-RbrfTB9SWsr0kWmb9srfF+L933uMDdu9BIzdA7os2t0TXhCRjrQyCeOt6wVxr79CKD4c+p+YhCj31HBkYcXebw==} - engines: {node: '>=12'} - cpu: [x64] - os: [openbsd] - requiresBuild: true - dev: true - optional: true - - /@esbuild/sunos-x64@0.19.12: - resolution: {integrity: sha512-HKjJwRrW8uWtCQnQOz9qcU3mUZhTUQvi56Q8DPTLLB+DawoiQdjsYq+j+D3s9I8VFtDr+F9CjgXKKC4ss89IeA==} - engines: {node: '>=12'} - cpu: [x64] - os: [sunos] - requiresBuild: true - dev: true - optional: true - - /@esbuild/win32-arm64@0.19.12: - resolution: {integrity: sha512-URgtR1dJnmGvX864pn1B2YUYNzjmXkuJOIqG2HdU62MVS4EHpU2946OZoTMnRUHklGtJdJZ33QfzdjGACXhn1A==} - engines: {node: '>=12'} - cpu: [arm64] - os: [win32] - requiresBuild: true - dev: true - optional: true - - /@esbuild/win32-ia32@0.19.12: - resolution: {integrity: sha512-+ZOE6pUkMOJfmxmBZElNOx72NKpIa/HFOMGzu8fqzQJ5kgf6aTGrcJaFsNiVMH4JKpMipyK+7k0n2UXN7a8YKQ==} - engines: {node: '>=12'} - cpu: [ia32] - os: [win32] - requiresBuild: true - dev: true - optional: true - - /@esbuild/win32-x64@0.19.12: - resolution: {integrity: sha512-T1QyPSDCyMXaO3pzBkF96E8xMkiRYbUEZADd29SyPGabqxMViNoii+NcK7eWJAEoU6RZyEm5lVSIjTmcdoB9HA==} - engines: {node: '>=12'} - cpu: [x64] - os: [win32] - requiresBuild: true - dev: true - optional: true - - /@ethereumjs/common@2.5.0: - resolution: {integrity: sha512-DEHjW6e38o+JmB/NO3GZBpW4lpaiBpkFgXF6jLcJ6gETBYpEyaA5nTimsWBUJR3Vmtm/didUEbNjajskugZORg==} - dependencies: - crc-32: 1.2.2 - ethereumjs-util: 7.1.5 - dev: true - - /@ethereumjs/common@2.6.5: - resolution: {integrity: sha512-lRyVQOeCDaIVtgfbowla32pzeDv2Obr8oR8Put5RdUBNRGr1VGPGQNGP6elWIpgK3YdpzqTOh4GyUGOureVeeA==} - dependencies: - crc-32: 1.2.2 - ethereumjs-util: 7.1.5 - dev: true - - /@ethereumjs/rlp@4.0.1: - resolution: {integrity: sha512-tqsQiBQDQdmPWE1xkkBq4rlSW5QZpLOUJ5RJh2/9fug+q9tnUhuZoVLk7s0scUIKTOzEtR72DFBXI4WiZcMpvw==} - engines: {node: '>=14'} - hasBin: true - dev: true - - /@ethereumjs/tx@3.3.2: - resolution: {integrity: sha512-6AaJhwg4ucmwTvw/1qLaZUX5miWrwZ4nLOUsKyb/HtzS3BMw/CasKhdi1ims9mBKeK9sOJCH4qGKOBGyJCeeog==} - dependencies: - '@ethereumjs/common': 2.5.0 - ethereumjs-util: 7.1.5 - dev: true - - /@ethereumjs/tx@3.5.2: - resolution: {integrity: sha512-gQDNJWKrSDGu2w7w0PzVXVBNMzb7wwdDOmOqczmhNjqFxFuIbhVJDwiGEnxFNC2/b8ifcZzY7MLcluizohRzNw==} - dependencies: - '@ethereumjs/common': 2.6.5 - ethereumjs-util: 7.1.5 - dev: true - - /@ethereumjs/util@8.1.0: - resolution: {integrity: sha512-zQ0IqbdX8FZ9aw11vP+dZkKDkS+kgIvQPHnSAXzP9pLu+Rfu3D3XEeLbicvoXJTYnhZiPmsZUxgdzXwNKxRPbA==} - engines: {node: '>=14'} - dependencies: - '@ethereumjs/rlp': 4.0.1 - ethereum-cryptography: 2.1.3 - micro-ftch: 0.3.1 - dev: true - - /@ethersproject/abi@5.7.0: - resolution: {integrity: sha512-351ktp42TiRcYB3H1OP8yajPeAQstMW/yCFokj/AthP9bLHzQFPlOrxOcwYEDkUAICmOHljvN4K39OMTMUa9RA==} - dependencies: - '@ethersproject/address': 5.7.0 - '@ethersproject/bignumber': 5.7.0 - '@ethersproject/bytes': 5.7.0 - '@ethersproject/constants': 5.7.0 - '@ethersproject/hash': 5.7.0 - '@ethersproject/keccak256': 5.7.0 - '@ethersproject/logger': 5.7.0 - '@ethersproject/properties': 5.7.0 - '@ethersproject/strings': 5.7.0 - dev: true - - /@ethersproject/abstract-provider@5.7.0: - resolution: {integrity: sha512-R41c9UkchKCpAqStMYUpdunjo3pkEvZC3FAwZn5S5MGbXoMQOHIdHItezTETxAO5bevtMApSyEhn9+CHcDsWBw==} - dependencies: - '@ethersproject/bignumber': 5.7.0 - '@ethersproject/bytes': 5.7.0 - '@ethersproject/logger': 5.7.0 - '@ethersproject/networks': 5.7.1 - '@ethersproject/properties': 5.7.0 - '@ethersproject/transactions': 5.7.0 - '@ethersproject/web': 5.7.1 - dev: true - - /@ethersproject/abstract-signer@5.7.0: - resolution: {integrity: sha512-a16V8bq1/Cz+TGCkE2OPMTOUDLS3grCpdjoJCYNnVBbdYEMSgKrU0+B90s8b6H+ByYTBZN7a3g76jdIJi7UfKQ==} - dependencies: - '@ethersproject/abstract-provider': 5.7.0 - '@ethersproject/bignumber': 5.7.0 - '@ethersproject/bytes': 5.7.0 - '@ethersproject/logger': 5.7.0 - '@ethersproject/properties': 5.7.0 - dev: true - - /@ethersproject/address@5.7.0: - resolution: {integrity: sha512-9wYhYt7aghVGo758POM5nqcOMaE168Q6aRLJZwUmiqSrAungkG74gSSeKEIR7ukixesdRZGPgVqme6vmxs1fkA==} - dependencies: - '@ethersproject/bignumber': 5.7.0 - '@ethersproject/bytes': 5.7.0 - '@ethersproject/keccak256': 5.7.0 - '@ethersproject/logger': 5.7.0 - '@ethersproject/rlp': 5.7.0 - dev: true - - /@ethersproject/base64@5.7.0: - resolution: {integrity: sha512-Dr8tcHt2mEbsZr/mwTPIQAf3Ai0Bks/7gTw9dSqk1mQvhW3XvRlmDJr/4n+wg1JmCl16NZue17CDh8xb/vZ0sQ==} - dependencies: - '@ethersproject/bytes': 5.7.0 - dev: true - - /@ethersproject/basex@5.7.0: - resolution: {integrity: sha512-ywlh43GwZLv2Voc2gQVTKBoVQ1mti3d8HK5aMxsfu/nRDnMmNqaSJ3r3n85HBByT8OpoY96SXM1FogC533T4zw==} - dependencies: - '@ethersproject/bytes': 5.7.0 - '@ethersproject/properties': 5.7.0 - dev: true - - /@ethersproject/bignumber@5.7.0: - resolution: {integrity: sha512-n1CAdIHRWjSucQO3MC1zPSVgV/6dy/fjL9pMrPP9peL+QxEg9wOsVqwD4+818B6LUEtaXzVHQiuivzRoxPxUGw==} - dependencies: - '@ethersproject/bytes': 5.7.0 - '@ethersproject/logger': 5.7.0 - bn.js: 5.2.1 - dev: true - - /@ethersproject/bytes@5.7.0: - resolution: {integrity: sha512-nsbxwgFXWh9NyYWo+U8atvmMsSdKJprTcICAkvbBffT75qDocbuggBU0SJiVK2MuTrp0q+xvLkTnGMPK1+uA9A==} - dependencies: - '@ethersproject/logger': 5.7.0 - dev: true - - /@ethersproject/constants@5.7.0: - resolution: {integrity: sha512-DHI+y5dBNvkpYUMiRQyxRBYBefZkJfo70VUkUAsRjcPs47muV9evftfZ0PJVCXYbAiCgght0DtcF9srFQmIgWA==} - dependencies: - '@ethersproject/bignumber': 5.7.0 - dev: true - - /@ethersproject/contracts@5.7.0: - resolution: {integrity: sha512-5GJbzEU3X+d33CdfPhcyS+z8MzsTrBGk/sc+G+59+tPa9yFkl6HQ9D6L0QMgNTA9q8dT0XKxxkyp883XsQvbbg==} - dependencies: - '@ethersproject/abi': 5.7.0 - '@ethersproject/abstract-provider': 5.7.0 - '@ethersproject/abstract-signer': 5.7.0 - '@ethersproject/address': 5.7.0 - '@ethersproject/bignumber': 5.7.0 - '@ethersproject/bytes': 5.7.0 - '@ethersproject/constants': 5.7.0 - '@ethersproject/logger': 5.7.0 - '@ethersproject/properties': 5.7.0 - '@ethersproject/transactions': 5.7.0 - dev: true - - /@ethersproject/hash@5.7.0: - resolution: {integrity: sha512-qX5WrQfnah1EFnO5zJv1v46a8HW0+E5xuBBDTwMFZLuVTx0tbU2kkx15NqdjxecrLGatQN9FGQKpb1FKdHCt+g==} - dependencies: - '@ethersproject/abstract-signer': 5.7.0 - '@ethersproject/address': 5.7.0 - '@ethersproject/base64': 5.7.0 - '@ethersproject/bignumber': 5.7.0 - '@ethersproject/bytes': 5.7.0 - '@ethersproject/keccak256': 5.7.0 - '@ethersproject/logger': 5.7.0 - '@ethersproject/properties': 5.7.0 - '@ethersproject/strings': 5.7.0 - dev: true - - /@ethersproject/hdnode@5.7.0: - resolution: {integrity: sha512-OmyYo9EENBPPf4ERhR7oj6uAtUAhYGqOnIS+jE5pTXvdKBS99ikzq1E7Iv0ZQZ5V36Lqx1qZLeak0Ra16qpeOg==} - dependencies: - '@ethersproject/abstract-signer': 5.7.0 - '@ethersproject/basex': 5.7.0 - '@ethersproject/bignumber': 5.7.0 - '@ethersproject/bytes': 5.7.0 - '@ethersproject/logger': 5.7.0 - '@ethersproject/pbkdf2': 5.7.0 - '@ethersproject/properties': 5.7.0 - '@ethersproject/sha2': 5.7.0 - '@ethersproject/signing-key': 5.7.0 - '@ethersproject/strings': 5.7.0 - '@ethersproject/transactions': 5.7.0 - '@ethersproject/wordlists': 5.7.0 - dev: true - - /@ethersproject/json-wallets@5.7.0: - resolution: {integrity: sha512-8oee5Xgu6+RKgJTkvEMl2wDgSPSAQ9MB/3JYjFV9jlKvcYHUXZC+cQp0njgmxdHkYWn8s6/IqIZYm0YWCjO/0g==} - dependencies: - '@ethersproject/abstract-signer': 5.7.0 - '@ethersproject/address': 5.7.0 - '@ethersproject/bytes': 5.7.0 - '@ethersproject/hdnode': 5.7.0 - '@ethersproject/keccak256': 5.7.0 - '@ethersproject/logger': 5.7.0 - '@ethersproject/pbkdf2': 5.7.0 - '@ethersproject/properties': 5.7.0 - '@ethersproject/random': 5.7.0 - '@ethersproject/strings': 5.7.0 - '@ethersproject/transactions': 5.7.0 - aes-js: 3.0.0 - scrypt-js: 3.0.1 - dev: true - - /@ethersproject/keccak256@5.7.0: - resolution: {integrity: sha512-2UcPboeL/iW+pSg6vZ6ydF8tCnv3Iu/8tUmLLzWWGzxWKFFqOBQFLo6uLUv6BDrLgCDfN28RJ/wtByx+jZ4KBg==} - dependencies: - '@ethersproject/bytes': 5.7.0 - js-sha3: 0.8.0 - dev: true - - /@ethersproject/logger@5.7.0: - resolution: {integrity: sha512-0odtFdXu/XHtjQXJYA3u9G0G8btm0ND5Cu8M7i5vhEcE8/HmF4Lbdqanwyv4uQTr2tx6b7fQRmgLrsnpQlmnig==} - dev: true - - /@ethersproject/networks@5.7.1: - resolution: {integrity: sha512-n/MufjFYv3yFcUyfhnXotyDlNdFb7onmkSy8aQERi2PjNcnWQ66xXxa3XlS8nCcA8aJKJjIIMNJTC7tu80GwpQ==} - dependencies: - '@ethersproject/logger': 5.7.0 - dev: true - - /@ethersproject/pbkdf2@5.7.0: - resolution: {integrity: sha512-oR/dBRZR6GTyaofd86DehG72hY6NpAjhabkhxgr3X2FpJtJuodEl2auADWBZfhDHgVCbu3/H/Ocq2uC6dpNjjw==} - dependencies: - '@ethersproject/bytes': 5.7.0 - '@ethersproject/sha2': 5.7.0 - dev: true - - /@ethersproject/properties@5.7.0: - resolution: {integrity: sha512-J87jy8suntrAkIZtecpxEPxY//szqr1mlBaYlQ0r4RCaiD2hjheqF9s1LVE8vVuJCXisjIP+JgtK/Do54ej4Sw==} - dependencies: - '@ethersproject/logger': 5.7.0 - dev: true - - /@ethersproject/providers@5.7.2: - resolution: {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.1 - '@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.1 - bech32: 1.1.4 - ws: 7.4.6 - transitivePeerDependencies: - - bufferutil - - utf-8-validate - dev: true - - /@ethersproject/random@5.7.0: - resolution: {integrity: sha512-19WjScqRA8IIeWclFme75VMXSBvi4e6InrUNuaR4s5pTF2qNhcGdCUwdxUVGtDDqC00sDLCO93jPQoDUH4HVmQ==} - dependencies: - '@ethersproject/bytes': 5.7.0 - '@ethersproject/logger': 5.7.0 - dev: true - - /@ethersproject/rlp@5.7.0: - resolution: {integrity: sha512-rBxzX2vK8mVF7b0Tol44t5Tb8gomOHkj5guL+HhzQ1yBh/ydjGnpw6at+X6Iw0Kp3OzzzkcKp8N9r0W4kYSs9w==} - dependencies: - '@ethersproject/bytes': 5.7.0 - '@ethersproject/logger': 5.7.0 - dev: true - - /@ethersproject/sha2@5.7.0: - resolution: {integrity: sha512-gKlH42riwb3KYp0reLsFTokByAKoJdgFCwI+CCiX/k+Jm2mbNs6oOaCjYQSlI1+XBVejwH2KrmCbMAT/GnRDQw==} - dependencies: - '@ethersproject/bytes': 5.7.0 - '@ethersproject/logger': 5.7.0 - hash.js: 1.1.7 - dev: true - - /@ethersproject/signing-key@5.7.0: - resolution: {integrity: sha512-MZdy2nL3wO0u7gkB4nA/pEf8lu1TlFswPNmy8AiYkfKTdO6eXBJyUdmHO/ehm/htHw9K/qF8ujnTyUAD+Ry54Q==} - dependencies: - '@ethersproject/bytes': 5.7.0 - '@ethersproject/logger': 5.7.0 - '@ethersproject/properties': 5.7.0 - bn.js: 5.2.1 - elliptic: 6.5.4 - hash.js: 1.1.7 - dev: true - - /@ethersproject/solidity@5.7.0: - resolution: {integrity: sha512-HmabMd2Dt/raavyaGukF4XxizWKhKQ24DoLtdNbBmNKUOPqwjsKQSdV9GQtj9CBEea9DlzETlVER1gYeXXBGaA==} - dependencies: - '@ethersproject/bignumber': 5.7.0 - '@ethersproject/bytes': 5.7.0 - '@ethersproject/keccak256': 5.7.0 - '@ethersproject/logger': 5.7.0 - '@ethersproject/sha2': 5.7.0 - '@ethersproject/strings': 5.7.0 - dev: true - - /@ethersproject/strings@5.7.0: - resolution: {integrity: sha512-/9nu+lj0YswRNSH0NXYqrh8775XNyEdUQAuf3f+SmOrnVewcJ5SBNAjF7lpgehKi4abvNNXyf+HX86czCdJ8Mg==} - dependencies: - '@ethersproject/bytes': 5.7.0 - '@ethersproject/constants': 5.7.0 - '@ethersproject/logger': 5.7.0 - dev: true - - /@ethersproject/transactions@5.7.0: - resolution: {integrity: sha512-kmcNicCp1lp8qanMTC3RIikGgoJ80ztTyvtsFvCYpSCfkjhD0jZ2LOrnbcuxuToLIUYYf+4XwD1rP+B/erDIhQ==} - dependencies: - '@ethersproject/address': 5.7.0 - '@ethersproject/bignumber': 5.7.0 - '@ethersproject/bytes': 5.7.0 - '@ethersproject/constants': 5.7.0 - '@ethersproject/keccak256': 5.7.0 - '@ethersproject/logger': 5.7.0 - '@ethersproject/properties': 5.7.0 - '@ethersproject/rlp': 5.7.0 - '@ethersproject/signing-key': 5.7.0 - dev: true - - /@ethersproject/units@5.7.0: - resolution: {integrity: sha512-pD3xLMy3SJu9kG5xDGI7+xhTEmGXlEqXU4OfNapmfnxLVY4EMSSRp7j1k7eezutBPH7RBN/7QPnwR7hzNlEFeg==} - dependencies: - '@ethersproject/bignumber': 5.7.0 - '@ethersproject/constants': 5.7.0 - '@ethersproject/logger': 5.7.0 - dev: true - - /@ethersproject/wallet@5.7.0: - resolution: {integrity: sha512-MhmXlJXEJFBFVKrDLB4ZdDzxcBxQ3rLyCkhNqVu3CDYvR97E+8r01UgrI+TI99Le+aYm/in/0vp86guJuM7FCA==} - dependencies: - '@ethersproject/abstract-provider': 5.7.0 - '@ethersproject/abstract-signer': 5.7.0 - '@ethersproject/address': 5.7.0 - '@ethersproject/bignumber': 5.7.0 - '@ethersproject/bytes': 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/properties': 5.7.0 - '@ethersproject/random': 5.7.0 - '@ethersproject/signing-key': 5.7.0 - '@ethersproject/transactions': 5.7.0 - '@ethersproject/wordlists': 5.7.0 - dev: true - - /@ethersproject/web@5.7.1: - resolution: {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 - dev: true - - /@ethersproject/wordlists@5.7.0: - resolution: {integrity: sha512-S2TFNJNfHWVHNE6cNDjbVlZ6MgE17MIxMbMg2zv3wn+3XSJGosL1m9ZVv3GXCf/2ymSsQ+hRI5IzoMJTG6aoVA==} - dependencies: - '@ethersproject/bytes': 5.7.0 - '@ethersproject/hash': 5.7.0 - '@ethersproject/logger': 5.7.0 - '@ethersproject/properties': 5.7.0 - '@ethersproject/strings': 5.7.0 - dev: true - - /@fastify/busboy@2.1.1: - resolution: {integrity: sha512-vBZP4NlzfOlerQTnba4aqZoMhE/a9HY7HRqoOPaETQcSQuWEIyZMHGfVu6w9wGtGK5fED5qRs2DteVCjOH60sA==} - engines: {node: '>=14'} - dev: true - - /@jridgewell/resolve-uri@3.1.2: - resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==} - engines: {node: '>=6.0.0'} - dev: true - - /@jridgewell/sourcemap-codec@1.4.15: - resolution: {integrity: sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==} - dev: true - - /@jridgewell/trace-mapping@0.3.9: - resolution: {integrity: sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==} - dependencies: - '@jridgewell/resolve-uri': 3.1.2 - '@jridgewell/sourcemap-codec': 1.4.15 - dev: true - - /@metamask/eth-sig-util@4.0.1: - resolution: {integrity: sha512-tghyZKLHZjcdlDqCA3gNZmLeR0XvOE9U1qoQO9ohyAZT6Pya+H9vkBPcsyXytmYLNgVoin7CKCmweo/R43V+tQ==} - engines: {node: '>=12.0.0'} - dependencies: - ethereumjs-abi: 0.6.8 - ethereumjs-util: 6.2.1 - ethjs-util: 0.1.6 - tweetnacl: 1.0.3 - tweetnacl-util: 0.15.1 - dev: true - - /@noble/curves@1.3.0: - resolution: {integrity: sha512-t01iSXPuN+Eqzb4eBX0S5oubSqXbK/xXa1Ne18Hj8f9pStxztHCE2gfboSp/dZRLSqfuLpRK2nDXDK+W9puocA==} - dependencies: - '@noble/hashes': 1.3.3 - dev: true - - /@noble/hashes@1.2.0: - resolution: {integrity: sha512-FZfhjEDbT5GRswV3C6uvLPHMiVD6lQBmpoX5+eSiPaMTXte/IKqI5dykDxzZB/WBeK/CDuQRBWarPdi3FNY2zQ==} - dev: true - - /@noble/hashes@1.3.3: - resolution: {integrity: sha512-V7/fPHgl+jsVPXqqeOzT8egNj2iBIVt+ECeMMG8TdcnTikP3oaBtUVqpT/gYCR68aEBJSF+XbYUxStjbFMqIIA==} - engines: {node: '>= 16'} - dev: true - - /@noble/secp256k1@1.7.1: - resolution: {integrity: sha512-hOUk6AyBFmqVrv7k5WAw/LpszxVbj9gGN4JRkIX52fdFAj1UA61KXmZDvqVEm+pOyec3+fIeZB02LYa/pWOArw==} - dev: true - - /@nodelib/fs.scandir@2.1.5: - resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} - engines: {node: '>= 8'} - dependencies: - '@nodelib/fs.stat': 2.0.5 - run-parallel: 1.2.0 - dev: true - - /@nodelib/fs.stat@2.0.5: - resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} - engines: {node: '>= 8'} - dev: true - - /@nodelib/fs.walk@1.2.8: - resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} - engines: {node: '>= 8'} - dependencies: - '@nodelib/fs.scandir': 2.1.5 - fastq: 1.17.1 - dev: true - - /@nomicfoundation/edr-darwin-arm64@0.2.1: - resolution: {integrity: sha512-aMYaRaZVQ/TmyNJIoXf1bU4k0zfinaL9Sy1day4yGlL6eiQPFfRGj9W6TZaZIoYG0XTx/mQWD7dkXJ7LdrleJA==} - engines: {node: '>= 18'} - cpu: [arm64] - os: [darwin] - requiresBuild: true - dev: true - optional: true - - /@nomicfoundation/edr-darwin-x64@0.2.1: - resolution: {integrity: sha512-ma0SLcjHm5L3nPHcKFJB0jv/gKGSKaxr5Z65rurX/eaYUQJ7YGMsb8er9bSCo9rjzOtxf4FoPj3grL3zGpOj8A==} - engines: {node: '>= 18'} - cpu: [x64] - os: [darwin] - requiresBuild: true - dev: true - optional: true - - /@nomicfoundation/edr-linux-arm64-gnu@0.2.1: - resolution: {integrity: sha512-NX3G4pBhRitWrjSGY3HTyCq3wKSm5YqrKVOCNQGl9/jcjSovqxlgzFMiTx4YZCzGntfJ/1om9AI84OWxYJjoDw==} - engines: {node: '>= 18'} - cpu: [arm64] - os: [linux] - requiresBuild: true - dev: true - optional: true - - /@nomicfoundation/edr-linux-arm64-musl@0.2.1: - resolution: {integrity: sha512-gdQ3QHkt9XRkdtOGQ8fMwS11MXdjLeZgLrqoial4V4qtMaamIMMhVczK+VEvUhD8p7G4BVmp6kmkvcsthmndmw==} - engines: {node: '>= 18'} - cpu: [arm64] - os: [linux] - requiresBuild: true - dev: true - optional: true - - /@nomicfoundation/edr-linux-x64-gnu@0.2.1: - resolution: {integrity: sha512-OqabFY37vji6mYbLD9CvG28lja68czeVw58oWByIhFV3BpBu/cyP1oAbhzk3LieylujabS3Ekpvjw2Tkf0A9RQ==} - engines: {node: '>= 18'} - cpu: [x64] - os: [linux] - requiresBuild: true - dev: true - optional: true - - /@nomicfoundation/edr-linux-x64-musl@0.2.1: - resolution: {integrity: sha512-vHfFFK2EPISuQUQge+bdjXamb0EUjfl8srYSog1qfiwyLwLeuSbpyyFzDeITAgPpkkFuedTfJW553K0Hipspyg==} - engines: {node: '>= 18'} - cpu: [x64] - os: [linux] - requiresBuild: true - dev: true - optional: true - - /@nomicfoundation/edr-win32-arm64-msvc@0.2.1: - resolution: {integrity: sha512-K/mui67RCKxghbSyvhvW3rvyVN1pa9M1Q9APUx1PtWjSSdXDFpqEY1NYsv2syb47Ca8ObJwVMF+LvnB6GvhUOQ==} - engines: {node: '>= 10'} - cpu: [arm64] - os: [win32] - requiresBuild: true - dev: true - optional: true - - /@nomicfoundation/edr-win32-ia32-msvc@0.2.1: - resolution: {integrity: sha512-HHK0mXEtjvfjJrJlqcYgQCy3lZIXS1KNl2GaP8bwEIuEwx++XxXs/ThLjPepM1nhCGICij8IGy7p3KrkzRelsw==} - engines: {node: '>= 18'} - cpu: [ia32] - os: [win32] - requiresBuild: true - dev: true - optional: true - - /@nomicfoundation/edr-win32-x64-msvc@0.2.1: - resolution: {integrity: sha512-FY4eQJdj1/y8ST0RyQycx63yr+lvdYNnUkzgWf4X+vPH1lOhXae+L2NDcNCQlTDAfQcD6yz0bkBUkLrlJ8pTww==} - engines: {node: '>= 18'} - cpu: [x64] - os: [win32] - requiresBuild: true - dev: true - optional: true - - /@nomicfoundation/edr@0.2.1: - resolution: {integrity: sha512-Dleau3ItHJh2n85G2J6AIPBoLgu/mOWkmrh26z3VsJE2tp/e00hUk/dqz85ncsVcBYEc6/YOn/DomWu0wSF9tQ==} - engines: {node: '>= 18'} - optionalDependencies: - '@nomicfoundation/edr-darwin-arm64': 0.2.1 - '@nomicfoundation/edr-darwin-x64': 0.2.1 - '@nomicfoundation/edr-linux-arm64-gnu': 0.2.1 - '@nomicfoundation/edr-linux-arm64-musl': 0.2.1 - '@nomicfoundation/edr-linux-x64-gnu': 0.2.1 - '@nomicfoundation/edr-linux-x64-musl': 0.2.1 - '@nomicfoundation/edr-win32-arm64-msvc': 0.2.1 - '@nomicfoundation/edr-win32-ia32-msvc': 0.2.1 - '@nomicfoundation/edr-win32-x64-msvc': 0.2.1 - dev: true - - /@nomicfoundation/ethereumjs-common@4.0.4: - resolution: {integrity: sha512-9Rgb658lcWsjiicr5GzNCjI1llow/7r0k50dLL95OJ+6iZJcVbi15r3Y0xh2cIO+zgX0WIHcbzIu6FeQf9KPrg==} - dependencies: - '@nomicfoundation/ethereumjs-util': 9.0.4 - transitivePeerDependencies: - - c-kzg - dev: true - - /@nomicfoundation/ethereumjs-rlp@5.0.4: - resolution: {integrity: sha512-8H1S3s8F6QueOc/X92SdrA4RDenpiAEqMg5vJH99kcQaCy/a3Q6fgseo75mgWlbanGJXSlAPtnCeG9jvfTYXlw==} - engines: {node: '>=18'} - hasBin: true - dev: true - - /@nomicfoundation/ethereumjs-tx@5.0.4: - resolution: {integrity: sha512-Xjv8wAKJGMrP1f0n2PeyfFCCojHd7iS3s/Ab7qzF1S64kxZ8Z22LCMynArYsVqiFx6rzYy548HNVEyI+AYN/kw==} - engines: {node: '>=18'} - peerDependencies: - c-kzg: ^2.1.2 - peerDependenciesMeta: - c-kzg: - optional: true - dependencies: - '@nomicfoundation/ethereumjs-common': 4.0.4 - '@nomicfoundation/ethereumjs-rlp': 5.0.4 - '@nomicfoundation/ethereumjs-util': 9.0.4 - ethereum-cryptography: 0.1.3 - dev: true - - /@nomicfoundation/ethereumjs-util@9.0.4: - resolution: {integrity: sha512-sLOzjnSrlx9Bb9EFNtHzK/FJFsfg2re6bsGqinFinH1gCqVfz9YYlXiMWwDM4C/L4ywuHFCYwfKTVr/QHQcU0Q==} - engines: {node: '>=18'} - peerDependencies: - c-kzg: ^2.1.2 - peerDependenciesMeta: - c-kzg: - optional: true - dependencies: - '@nomicfoundation/ethereumjs-rlp': 5.0.4 - ethereum-cryptography: 0.1.3 - dev: true - - /@nomicfoundation/hardhat-chai-matchers@1.0.6(@nomiclabs/hardhat-ethers@2.2.3)(chai@4.4.1)(ethers@5.7.2)(hardhat@2.21.0): - resolution: {integrity: sha512-f5ZMNmabZeZegEfuxn/0kW+mm7+yV7VNDxLpMOMGXWFJ2l/Ct3QShujzDRF9cOkK9Ui/hbDeOWGZqyQALDXVCQ==} - peerDependencies: - '@nomiclabs/hardhat-ethers': ^2.0.0 - chai: ^4.2.0 - ethers: ^5.0.0 - hardhat: ^2.9.4 - dependencies: - '@ethersproject/abi': 5.7.0 - '@nomiclabs/hardhat-ethers': 2.2.3(ethers@5.7.2)(hardhat@2.21.0) - '@types/chai-as-promised': 7.1.8 - chai: 4.4.1 - chai-as-promised: 7.1.1(chai@4.4.1) - deep-eql: 4.1.3 - ethers: 5.7.2 - hardhat: 2.21.0(ts-node@10.9.2)(typescript@5.4.2) - ordinal: 1.0.3 - dev: true - - /@nomicfoundation/hardhat-foundry@1.1.1(hardhat@2.21.0): - resolution: {integrity: sha512-cXGCBHAiXas9Pg9MhMOpBVQCkWRYoRFG7GJJAph+sdQsfd22iRs5U5Vs9XmpGEQd1yEvYISQZMeE68Nxj65iUQ==} - peerDependencies: - hardhat: ^2.17.2 - dependencies: - chalk: 2.4.2 - hardhat: 2.21.0(ts-node@10.9.2)(typescript@5.4.2) - dev: true - - /@nomicfoundation/hardhat-network-helpers@1.0.10(hardhat@2.21.0): - resolution: {integrity: sha512-R35/BMBlx7tWN5V6d/8/19QCwEmIdbnA4ZrsuXgvs8i2qFx5i7h6mH5pBS4Pwi4WigLH+upl6faYusrNPuzMrQ==} - peerDependencies: - hardhat: ^2.9.5 - dependencies: - ethereumjs-util: 7.1.5 - hardhat: 2.21.0(ts-node@10.9.2)(typescript@5.4.2) - dev: true - - /@nomicfoundation/hardhat-toolbox@2.0.2(@ethersproject/abi@5.7.0)(@ethersproject/providers@5.7.2)(@nomicfoundation/hardhat-chai-matchers@1.0.6)(@nomicfoundation/hardhat-network-helpers@1.0.10)(@nomiclabs/hardhat-ethers@2.2.3)(@nomiclabs/hardhat-etherscan@3.1.8)(@typechain/ethers-v5@10.2.1)(@typechain/hardhat@6.1.6)(@types/chai@4.3.12)(@types/mocha@10.0.6)(@types/node@20.11.26)(chai@4.4.1)(ethers@5.7.2)(hardhat-gas-reporter@1.0.10)(hardhat@2.21.0)(solidity-coverage@0.8.11)(ts-node@10.9.2)(typechain@8.3.2)(typescript@5.4.2): - resolution: {integrity: sha512-vnN1AzxbvpSx9pfdRHbUzTRIXpMLPXnUlkW855VaDk6N1pwRaQ2gNzEmFAABk4lWf11E00PKwFd/q27HuwYrYg==} - peerDependencies: - '@ethersproject/abi': ^5.4.7 - '@ethersproject/providers': ^5.4.7 - '@nomicfoundation/hardhat-chai-matchers': ^1.0.0 - '@nomicfoundation/hardhat-network-helpers': ^1.0.0 - '@nomiclabs/hardhat-ethers': ^2.0.0 - '@nomiclabs/hardhat-etherscan': ^3.0.0 - '@typechain/ethers-v5': ^10.1.0 - '@typechain/hardhat': ^6.1.2 - '@types/chai': ^4.2.0 - '@types/mocha': '>=9.1.0' - '@types/node': '>=12.0.0' - chai: ^4.2.0 - ethers: ^5.4.7 - hardhat: ^2.11.0 - hardhat-gas-reporter: ^1.0.8 - solidity-coverage: ^0.8.1 - ts-node: '>=8.0.0' - typechain: ^8.1.0 - typescript: '>=4.5.0' - dependencies: - '@ethersproject/abi': 5.7.0 - '@ethersproject/providers': 5.7.2 - '@nomicfoundation/hardhat-chai-matchers': 1.0.6(@nomiclabs/hardhat-ethers@2.2.3)(chai@4.4.1)(ethers@5.7.2)(hardhat@2.21.0) - '@nomicfoundation/hardhat-network-helpers': 1.0.10(hardhat@2.21.0) - '@nomiclabs/hardhat-ethers': 2.2.3(ethers@5.7.2)(hardhat@2.21.0) - '@nomiclabs/hardhat-etherscan': 3.1.8(hardhat@2.21.0) - '@typechain/ethers-v5': 10.2.1(@ethersproject/abi@5.7.0)(@ethersproject/providers@5.7.2)(ethers@5.7.2)(typechain@8.3.2)(typescript@5.4.2) - '@typechain/hardhat': 6.1.6(@ethersproject/abi@5.7.0)(@ethersproject/providers@5.7.2)(@typechain/ethers-v5@10.2.1)(ethers@5.7.2)(hardhat@2.21.0)(typechain@8.3.2) - '@types/chai': 4.3.12 - '@types/mocha': 10.0.6 - '@types/node': 20.11.26 - chai: 4.4.1 - ethers: 5.7.2 - hardhat: 2.21.0(ts-node@10.9.2)(typescript@5.4.2) - hardhat-gas-reporter: 1.0.10(hardhat@2.21.0) - solidity-coverage: 0.8.11(hardhat@2.21.0) - ts-node: 10.9.2(@types/node@20.11.26)(typescript@5.4.2) - typechain: 8.3.2(typescript@5.4.2) - typescript: 5.4.2 - dev: true - - /@nomicfoundation/solidity-analyzer-darwin-arm64@0.1.1: - resolution: {integrity: sha512-KcTodaQw8ivDZyF+D76FokN/HdpgGpfjc/gFCImdLUyqB6eSWVaZPazMbeAjmfhx3R0zm/NYVzxwAokFKgrc0w==} - engines: {node: '>= 10'} - cpu: [arm64] - os: [darwin] - requiresBuild: true - dev: true - optional: true - - /@nomicfoundation/solidity-analyzer-darwin-x64@0.1.1: - resolution: {integrity: sha512-XhQG4BaJE6cIbjAVtzGOGbK3sn1BO9W29uhk9J8y8fZF1DYz0Doj8QDMfpMu+A6TjPDs61lbsmeYodIDnfveSA==} - engines: {node: '>= 10'} - cpu: [x64] - os: [darwin] - requiresBuild: true - dev: true - optional: true - - /@nomicfoundation/solidity-analyzer-freebsd-x64@0.1.1: - resolution: {integrity: sha512-GHF1VKRdHW3G8CndkwdaeLkVBi5A9u2jwtlS7SLhBc8b5U/GcoL39Q+1CSO3hYqePNP+eV5YI7Zgm0ea6kMHoA==} - engines: {node: '>= 10'} - cpu: [x64] - os: [freebsd] - requiresBuild: true - dev: true - optional: true - - /@nomicfoundation/solidity-analyzer-linux-arm64-gnu@0.1.1: - resolution: {integrity: sha512-g4Cv2fO37ZsUENQ2vwPnZc2zRenHyAxHcyBjKcjaSmmkKrFr64yvzeNO8S3GBFCo90rfochLs99wFVGT/0owpg==} - engines: {node: '>= 10'} - cpu: [arm64] - os: [linux] - requiresBuild: true - dev: true - optional: true - - /@nomicfoundation/solidity-analyzer-linux-arm64-musl@0.1.1: - resolution: {integrity: sha512-WJ3CE5Oek25OGE3WwzK7oaopY8xMw9Lhb0mlYuJl/maZVo+WtP36XoQTb7bW/i8aAdHW5Z+BqrHMux23pvxG3w==} - engines: {node: '>= 10'} - cpu: [arm64] - os: [linux] - requiresBuild: true - dev: true - optional: true - - /@nomicfoundation/solidity-analyzer-linux-x64-gnu@0.1.1: - resolution: {integrity: sha512-5WN7leSr5fkUBBjE4f3wKENUy9HQStu7HmWqbtknfXkkil+eNWiBV275IOlpXku7v3uLsXTOKpnnGHJYI2qsdA==} - engines: {node: '>= 10'} - cpu: [x64] - os: [linux] - requiresBuild: true - dev: true - optional: true - - /@nomicfoundation/solidity-analyzer-linux-x64-musl@0.1.1: - resolution: {integrity: sha512-KdYMkJOq0SYPQMmErv/63CwGwMm5XHenEna9X9aB8mQmhDBrYrlAOSsIPgFCUSL0hjxE3xHP65/EPXR/InD2+w==} - engines: {node: '>= 10'} - cpu: [x64] - os: [linux] - requiresBuild: true - dev: true - optional: true - - /@nomicfoundation/solidity-analyzer-win32-arm64-msvc@0.1.1: - resolution: {integrity: sha512-VFZASBfl4qiBYwW5xeY20exWhmv6ww9sWu/krWSesv3q5hA0o1JuzmPHR4LPN6SUZj5vcqci0O6JOL8BPw+APg==} - engines: {node: '>= 10'} - cpu: [arm64] - os: [win32] - requiresBuild: true - dev: true - optional: true - - /@nomicfoundation/solidity-analyzer-win32-ia32-msvc@0.1.1: - resolution: {integrity: sha512-JnFkYuyCSA70j6Si6cS1A9Gh1aHTEb8kOTBApp/c7NRTFGNMH8eaInKlyuuiIbvYFhlXW4LicqyYuWNNq9hkpQ==} - engines: {node: '>= 10'} - cpu: [ia32] - os: [win32] - requiresBuild: true - dev: true - optional: true - - /@nomicfoundation/solidity-analyzer-win32-x64-msvc@0.1.1: - resolution: {integrity: sha512-HrVJr6+WjIXGnw3Q9u6KQcbZCtk0caVWhCdFADySvRyUxJ8PnzlaP+MhwNE8oyT8OZ6ejHBRrrgjSqDCFXGirw==} - engines: {node: '>= 10'} - cpu: [x64] - os: [win32] - requiresBuild: true - dev: true - optional: true - - /@nomicfoundation/solidity-analyzer@0.1.1: - resolution: {integrity: sha512-1LMtXj1puAxyFusBgUIy5pZk3073cNXYnXUpuNKFghHbIit/xZgbk0AokpUADbNm3gyD6bFWl3LRFh3dhVdREg==} - engines: {node: '>= 12'} - optionalDependencies: - '@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 - dev: true - - /@nomiclabs/hardhat-ethers@2.2.3(ethers@5.7.2)(hardhat@2.21.0): - resolution: {integrity: sha512-YhzPdzb612X591FOe68q+qXVXGG2ANZRvDo0RRUtimev85rCrAlv/TLMEZw5c+kq9AbzocLTVX/h2jVIFPL9Xg==} - peerDependencies: - ethers: ^5.0.0 - hardhat: ^2.0.0 - dependencies: - ethers: 5.7.2 - hardhat: 2.21.0(ts-node@10.9.2)(typescript@5.4.2) - dev: true - - /@nomiclabs/hardhat-etherscan@3.1.8(hardhat@2.21.0): - resolution: {integrity: sha512-v5F6IzQhrsjHh6kQz4uNrym49brK9K5bYCq2zQZ729RYRaifI9hHbtmK+KkIVevfhut7huQFEQ77JLRMAzWYjQ==} - deprecated: The @nomiclabs/hardhat-etherscan package is deprecated, please use @nomicfoundation/hardhat-verify instead - peerDependencies: - hardhat: ^2.0.4 - dependencies: - '@ethersproject/abi': 5.7.0 - '@ethersproject/address': 5.7.0 - cbor: 8.1.0 - chalk: 2.4.2 - debug: 4.3.4(supports-color@8.1.1) - fs-extra: 7.0.1 - hardhat: 2.21.0(ts-node@10.9.2)(typescript@5.4.2) - lodash: 4.17.21 - semver: 6.3.1 - table: 6.8.1 - undici: 5.28.3 - transitivePeerDependencies: - - supports-color - dev: true - - /@nomiclabs/hardhat-truffle5@2.0.7(@nomiclabs/hardhat-web3@2.0.0)(hardhat@2.21.0)(web3-core-helpers@1.10.3)(web3-core-promievent@1.10.3)(web3-eth-abi@1.10.4)(web3-utils@1.10.4)(web3@1.10.4): - resolution: {integrity: sha512-Pw8451IUZp1bTp0QqCHCYfCHs66sCnyxPcaorapu9mfOV9xnZsVaFdtutnhNEiXdiZwbed7LFKpRsde4BjFwig==} - peerDependencies: - '@nomiclabs/hardhat-web3': ^2.0.0 - hardhat: ^2.6.4 - web3: ^1.0.0-beta.36 - dependencies: - '@nomiclabs/hardhat-web3': 2.0.0(hardhat@2.21.0)(web3@1.10.4) - '@nomiclabs/truffle-contract': 4.5.10(web3-core-helpers@1.10.3)(web3-core-promievent@1.10.3)(web3-eth-abi@1.10.4)(web3-utils@1.10.4)(web3@1.10.4) - '@types/chai': 4.3.12 - chai: 4.4.1 - ethereumjs-util: 7.1.5 - fs-extra: 7.0.1 - hardhat: 2.21.0(ts-node@10.9.2)(typescript@5.4.2) - web3: 1.10.4 - transitivePeerDependencies: - - bufferutil - - encoding - - supports-color - - utf-8-validate - - web3-core-helpers - - web3-core-promievent - - web3-eth-abi - - web3-utils - dev: true - - /@nomiclabs/hardhat-web3@2.0.0(hardhat@2.21.0)(web3@1.10.4): - resolution: {integrity: sha512-zt4xN+D+fKl3wW2YlTX3k9APR3XZgPkxJYf36AcliJn3oujnKEVRZaHu0PhgLjO+gR+F/kiYayo9fgd2L8970Q==} - peerDependencies: - hardhat: ^2.0.0 - web3: ^1.0.0-beta.36 - dependencies: - '@types/bignumber.js': 5.0.0 - hardhat: 2.21.0(ts-node@10.9.2)(typescript@5.4.2) - web3: 1.10.4 - dev: true - - /@nomiclabs/truffle-contract@4.5.10(web3-core-helpers@1.10.3)(web3-core-promievent@1.10.3)(web3-eth-abi@1.10.4)(web3-utils@1.10.4)(web3@1.10.4): - resolution: {integrity: sha512-nF/6InFV+0hUvutyFgsdOMCoYlr//2fJbRER4itxYtQtc4/O1biTwZIKRu+5l2J5Sq6LU2WX7vZHtDgQdhWxIQ==} - peerDependencies: - web3: ^1.2.1 - web3-core-helpers: ^1.2.1 - web3-core-promievent: ^1.2.1 - web3-eth-abi: ^1.2.1 - web3-utils: ^1.2.1 - dependencies: - '@ensdomains/ensjs': 2.1.0 - '@truffle/blockchain-utils': 0.1.9 - '@truffle/contract-schema': 3.4.16 - '@truffle/debug-utils': 6.0.57 - '@truffle/error': 0.1.1 - '@truffle/interface-adapter': 0.5.37 - bignumber.js: 7.2.1 - ethereum-ens: 0.8.0 - ethers: 4.0.49 - source-map-support: 0.5.21 - web3: 1.10.4 - web3-core-helpers: 1.10.3 - web3-core-promievent: 1.10.3 - web3-eth-abi: 1.10.4 - web3-utils: 1.10.4 - transitivePeerDependencies: - - bufferutil - - encoding - - supports-color - - utf-8-validate - dev: true - - /@openzeppelin/contract-loader@0.6.3: - resolution: {integrity: sha512-cOFIjBjwbGgZhDZsitNgJl0Ye1rd5yu/Yx5LMgeq3u0ZYzldm4uObzHDFq4gjDdoypvyORjjJa3BlFA7eAnVIg==} - dependencies: - find-up: 4.1.0 - fs-extra: 8.1.0 - dev: true - - /@openzeppelin/contracts@4.9.6: - resolution: {integrity: sha512-xSmezSupL+y9VkHZJGDoCBpmnB2ogM13ccaYDWqJTfS3dbuHkgjuwDFUmaFauBCboQMGB/S5UqUl2y54X99BmA==} - dev: true - - /@openzeppelin/test-helpers@0.5.16(bn.js@4.12.0): - resolution: {integrity: sha512-T1EvspSfH1qQO/sgGlskLfYVBbqzJR23SZzYl/6B2JnT4EhThcI85UpvDk0BkLWKaDScQTabGHt4GzHW+3SfZg==} - dependencies: - '@openzeppelin/contract-loader': 0.6.3 - '@truffle/contract': 4.6.31 - ansi-colors: 3.2.4 - chai: 4.4.1 - chai-bn: 0.2.2(bn.js@4.12.0)(chai@4.4.1) - ethjs-abi: 0.2.1 - lodash.flatten: 4.4.0 - semver: 5.7.2 - web3: 1.10.4 - web3-utils: 1.10.4 - transitivePeerDependencies: - - bn.js - - bufferutil - - encoding - - supports-color - - utf-8-validate - dev: true - - /@scure/base@1.1.5: - resolution: {integrity: sha512-Brj9FiG2W1MRQSTB212YVPRrcbjkv48FoZi/u4l/zds/ieRrqsh7aUf6CLwkAq61oKXr/ZlTzlY66gLIj3TFTQ==} - dev: true - - /@scure/bip32@1.1.5: - resolution: {integrity: sha512-XyNh1rB0SkEqd3tXcXMi+Xe1fvg+kUIcoRIEujP1Jgv7DqW2r9lg3Ah0NkFaCs9sTkQAQA8kw7xiRXzENi9Rtw==} - dependencies: - '@noble/hashes': 1.2.0 - '@noble/secp256k1': 1.7.1 - '@scure/base': 1.1.5 - dev: true - - /@scure/bip32@1.3.3: - resolution: {integrity: sha512-LJaN3HwRbfQK0X1xFSi0Q9amqOgzQnnDngIt+ZlsBC3Bm7/nE7K0kwshZHyaru79yIVRv/e1mQAjZyuZG6jOFQ==} - dependencies: - '@noble/curves': 1.3.0 - '@noble/hashes': 1.3.3 - '@scure/base': 1.1.5 - dev: true - - /@scure/bip39@1.1.1: - resolution: {integrity: sha512-t+wDck2rVkh65Hmv280fYdVdY25J9YeEUIgn2LG1WM6gxFkGzcksoDiUkWVpVp3Oex9xGC68JU2dSbUfwZ2jPg==} - dependencies: - '@noble/hashes': 1.2.0 - '@scure/base': 1.1.5 - dev: true - - /@scure/bip39@1.2.2: - resolution: {integrity: sha512-HYf9TUXG80beW+hGAt3TRM8wU6pQoYur9iNypTROm42dorCGmLnFe3eWjz3gOq6G62H2WRh0FCzAR1PI+29zIA==} - dependencies: - '@noble/hashes': 1.3.3 - '@scure/base': 1.1.5 - dev: true - - /@sentry/core@5.30.0: - resolution: {integrity: sha512-TmfrII8w1PQZSZgPpUESqjB+jC6MvZJZdLtE/0hZ+SrnKhW3x5WlYLvTXZpcWePYBku7rl2wn1RZu6uT0qCTeg==} - engines: {node: '>=6'} - dependencies: - '@sentry/hub': 5.30.0 - '@sentry/minimal': 5.30.0 - '@sentry/types': 5.30.0 - '@sentry/utils': 5.30.0 - tslib: 1.14.1 - dev: true - - /@sentry/hub@5.30.0: - resolution: {integrity: sha512-2tYrGnzb1gKz2EkMDQcfLrDTvmGcQPuWxLnJKXJvYTQDGLlEvi2tWz1VIHjunmOvJrB5aIQLhm+dcMRwFZDCqQ==} - engines: {node: '>=6'} - dependencies: - '@sentry/types': 5.30.0 - '@sentry/utils': 5.30.0 - tslib: 1.14.1 - dev: true - - /@sentry/minimal@5.30.0: - resolution: {integrity: sha512-BwWb/owZKtkDX+Sc4zCSTNcvZUq7YcH3uAVlmh/gtR9rmUvbzAA3ewLuB3myi4wWRAMEtny6+J/FN/x+2wn9Xw==} - engines: {node: '>=6'} - dependencies: - '@sentry/hub': 5.30.0 - '@sentry/types': 5.30.0 - tslib: 1.14.1 - dev: true - - /@sentry/node@5.30.0: - resolution: {integrity: sha512-Br5oyVBF0fZo6ZS9bxbJZG4ApAjRqAnqFFurMVJJdunNb80brh7a5Qva2kjhm+U6r9NJAB5OmDyPkA1Qnt+QVg==} - engines: {node: '>=6'} - dependencies: - '@sentry/core': 5.30.0 - '@sentry/hub': 5.30.0 - '@sentry/tracing': 5.30.0 - '@sentry/types': 5.30.0 - '@sentry/utils': 5.30.0 - cookie: 0.4.2 - https-proxy-agent: 5.0.1 - lru_map: 0.3.3 - tslib: 1.14.1 - transitivePeerDependencies: - - supports-color - dev: true - - /@sentry/tracing@5.30.0: - resolution: {integrity: sha512-dUFowCr0AIMwiLD7Fs314Mdzcug+gBVo/+NCMyDw8tFxJkwWAKl7Qa2OZxLQ0ZHjakcj1hNKfCQJ9rhyfOl4Aw==} - engines: {node: '>=6'} - dependencies: - '@sentry/hub': 5.30.0 - '@sentry/minimal': 5.30.0 - '@sentry/types': 5.30.0 - '@sentry/utils': 5.30.0 - tslib: 1.14.1 - dev: true - - /@sentry/types@5.30.0: - resolution: {integrity: sha512-R8xOqlSTZ+htqrfteCWU5Nk0CDN5ApUTvrlvBuiH1DyP6czDZ4ktbZB0hAgBlVcK0U+qpD3ag3Tqqpa5Q67rPw==} - engines: {node: '>=6'} - dev: true - - /@sentry/utils@5.30.0: - resolution: {integrity: sha512-zaYmoH0NWWtvnJjC9/CBseXMtKHm/tm40sz3YfJRxeQjyzRqNQPgivpd9R/oDJCYj999mzdW382p/qi2ypjLww==} - engines: {node: '>=6'} - dependencies: - '@sentry/types': 5.30.0 - tslib: 1.14.1 - dev: true - - /@sindresorhus/is@4.6.0: - resolution: {integrity: sha512-t09vSN3MdfsyCHoFcTRCH/iUtG7OJ0CsjzB8cjAmKc/va/kIgeDI/TxsigdncE/4be734m0cvIYwNaV4i2XqAw==} - engines: {node: '>=10'} - dev: true - - /@solidity-parser/parser@0.14.5: - resolution: {integrity: sha512-6dKnHZn7fg/iQATVEzqyUOyEidbn05q7YA2mQ9hC0MMXhhV3/JrsxmFSYZAcr7j1yUP700LLhTruvJ3MiQmjJg==} - dependencies: - antlr4ts: 0.5.0-alpha.4 - dev: true - - /@solidity-parser/parser@0.18.0: - resolution: {integrity: sha512-yfORGUIPgLck41qyN7nbwJRAx17/jAIXCTanHOJZhB6PJ1iAk/84b/xlsVKFSyNyLXIj0dhppoE0+CRws7wlzA==} - dev: true - - /@szmarczak/http-timer@4.0.6: - resolution: {integrity: sha512-4BAffykYOgO+5nzBWYwE3W90sBgLJoUPRWWcL8wlyiM8IB8ipJz3UMJ9KXQd1RKQXpKp8Tutn80HZtWsu2u76w==} - engines: {node: '>=10'} - dependencies: - defer-to-connect: 2.0.1 - dev: true - - /@szmarczak/http-timer@5.0.1: - resolution: {integrity: sha512-+PmQX0PiAYPMeVYe237LJAYvOMYW1j2rH5YROyS3b4CTVJum34HfRvKvAzozHAQG0TnHNdUfY9nCeUyRAs//cw==} - engines: {node: '>=14.16'} - dependencies: - defer-to-connect: 2.0.1 - dev: true - - /@truffle/abi-utils@1.0.3: - resolution: {integrity: sha512-AWhs01HCShaVKjml7Z4AbVREr/u4oiWxCcoR7Cktm0mEvtT04pvnxW5xB/cI4znRkrbPdFQlFt67kgrAjesYkw==} - engines: {node: ^16.20 || ^18.16 || >=20} - deprecated: Package no longer supported. Contact Support at https://www.npmjs.com/support for more info. - dependencies: - change-case: 3.0.2 - fast-check: 3.1.1 - web3-utils: 1.10.0 - dev: true - - /@truffle/blockchain-utils@0.1.9: - resolution: {integrity: sha512-RHfumgbIVo68Rv9ofDYfynjnYZIfP/f1vZy4RoqkfYAO+fqfc58PDRzB1WAGq2U6GPuOnipOJxQhnqNnffORZg==} - engines: {node: ^16.20 || ^18.16 || >=20} - deprecated: Package no longer supported. Contact Support at https://www.npmjs.com/support for more info. - dev: true - - /@truffle/codec@0.17.3: - resolution: {integrity: sha512-Ko/+dsnntNyrJa57jUD9u4qx9nQby+H4GsUO6yjiCPSX0TQnEHK08XWqBSg0WdmCH2+h0y1nr2CXSx8gbZapxg==} - engines: {node: ^16.20 || ^18.16 || >=20} - deprecated: Package no longer supported. Contact Support at https://www.npmjs.com/support for more info. - dependencies: - '@truffle/abi-utils': 1.0.3 - '@truffle/compile-common': 0.9.8 - big.js: 6.2.1 - bn.js: 5.2.1 - cbor: 5.2.0 - debug: 4.3.4(supports-color@8.1.1) - lodash: 4.17.21 - semver: 7.6.0 - utf8: 3.0.0 - web3-utils: 1.10.0 - transitivePeerDependencies: - - supports-color - dev: true - - /@truffle/compile-common@0.9.8: - resolution: {integrity: sha512-DTpiyo32t/YhLI1spn84D3MHYHrnoVqO+Gp7ZHrYNwDs86mAxtNiH5lsVzSb8cPgiqlvNsRCU9nm9R0YmKMTBQ==} - engines: {node: ^16.20 || ^18.16 || >=20} - deprecated: Package no longer supported. Contact Support at https://www.npmjs.com/support for more info. - dependencies: - '@truffle/error': 0.2.2 - colors: 1.4.0 - dev: true - - /@truffle/contract-schema@3.4.16: - resolution: {integrity: sha512-g0WNYR/J327DqtJPI70ubS19K1Fth/1wxt2jFqLsPmz5cGZVjCwuhiie+LfBde4/Mc9QR8G+L3wtmT5cyoBxAg==} - engines: {node: ^16.20 || ^18.16 || >=20} - deprecated: Package no longer supported. Contact Support at https://www.npmjs.com/support for more info. - dependencies: - ajv: 6.12.6 - debug: 4.3.4(supports-color@8.1.1) - transitivePeerDependencies: - - supports-color - dev: true - - /@truffle/contract@4.6.31: - resolution: {integrity: sha512-s+oHDpXASnZosiCdzu+X1Tx5mUJUs1L1CYXIcgRmzMghzqJkaUFmR6NpNo7nJYliYbO+O9/aW8oCKqQ7rCHfmQ==} - engines: {node: ^16.20 || ^18.16 || >=20} - deprecated: Package no longer supported. Contact Support at https://www.npmjs.com/support for more info. - dependencies: - '@ensdomains/ensjs': 2.1.0 - '@truffle/blockchain-utils': 0.1.9 - '@truffle/contract-schema': 3.4.16 - '@truffle/debug-utils': 6.0.57 - '@truffle/error': 0.2.2 - '@truffle/interface-adapter': 0.5.37 - bignumber.js: 7.2.1 - debug: 4.3.4(supports-color@8.1.1) - ethers: 4.0.49 - web3: 1.10.0 - web3-core-helpers: 1.10.0 - web3-core-promievent: 1.10.0 - web3-eth-abi: 1.10.0 - web3-utils: 1.10.0 - transitivePeerDependencies: - - bufferutil - - encoding - - supports-color - - utf-8-validate - dev: true - - /@truffle/debug-utils@6.0.57: - resolution: {integrity: sha512-Q6oI7zLaeNLB69ixjwZk2UZEWBY6b2OD1sjLMGDKBGR7GaHYiw96GLR2PFgPH1uwEeLmV4N78LYaQCrDsHbNeA==} - engines: {node: ^16.20 || ^18.16 || >=20} - deprecated: Package no longer supported. Contact Support at https://www.npmjs.com/support for more info. - dependencies: - '@truffle/codec': 0.17.3 - '@trufflesuite/chromafi': 3.0.0 - bn.js: 5.2.1 - chalk: 2.4.2 - debug: 4.3.4(supports-color@8.1.1) - highlightjs-solidity: 2.0.6 - transitivePeerDependencies: - - supports-color - dev: true - - /@truffle/error@0.1.1: - resolution: {integrity: sha512-sE7c9IHIGdbK4YayH4BC8i8qMjoAOeg6nUXUDZZp8wlU21/EMpaG+CLx+KqcIPyR+GSWIW3Dm0PXkr2nlggFDA==} - deprecated: Package no longer supported. Contact Support at https://www.npmjs.com/support for more info. - dev: true - - /@truffle/error@0.2.2: - resolution: {integrity: sha512-TqbzJ0O8DHh34cu8gDujnYl4dUl6o2DE4PR6iokbybvnIm/L2xl6+Gv1VC+YJS45xfH83Yo3/Zyg/9Oq8/xZWg==} - engines: {node: ^16.20 || ^18.16 || >=20} - deprecated: Package no longer supported. Contact Support at https://www.npmjs.com/support for more info. - dev: true - - /@truffle/interface-adapter@0.5.37: - resolution: {integrity: sha512-lPH9MDgU+7sNDlJSClwyOwPCfuOimqsCx0HfGkznL3mcFRymc1pukAR1k17zn7ErHqBwJjiKAZ6Ri72KkS+IWw==} - engines: {node: ^16.20 || ^18.16 || >=20} - deprecated: Package no longer supported. Contact Support at https://www.npmjs.com/support for more info. - dependencies: - bn.js: 5.2.1 - ethers: 4.0.49 - web3: 1.10.0 - transitivePeerDependencies: - - bufferutil - - encoding - - supports-color - - utf-8-validate - dev: true - - /@trufflesuite/chromafi@3.0.0: - resolution: {integrity: sha512-oqWcOqn8nT1bwlPPfidfzS55vqcIDdpfzo3HbU9EnUmcSTX+I8z0UyUFI3tZQjByVJulbzxHxUGS3ZJPwK/GPQ==} - dependencies: - camelcase: 4.1.0 - chalk: 2.4.2 - cheerio: 1.0.0-rc.12 - detect-indent: 5.0.0 - highlight.js: 10.7.3 - lodash.merge: 4.6.2 - strip-ansi: 4.0.0 - strip-indent: 2.0.0 - dev: true - - /@tsconfig/node10@1.0.9: - resolution: {integrity: sha512-jNsYVVxU8v5g43Erja32laIDHXeoNvFEpX33OK4d6hljo3jDhCBDhx5dhCCTMWUojscpAagGiRkBKxpdl9fxqA==} - dev: true - - /@tsconfig/node12@1.0.11: - resolution: {integrity: sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==} - dev: true - - /@tsconfig/node14@1.0.3: - resolution: {integrity: sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==} - dev: true - - /@tsconfig/node16@1.0.4: - resolution: {integrity: sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==} - dev: true - - /@typechain/ethers-v5@10.2.1(@ethersproject/abi@5.7.0)(@ethersproject/providers@5.7.2)(ethers@5.7.2)(typechain@8.3.2)(typescript@5.4.2): - resolution: {integrity: sha512-n3tQmCZjRE6IU4h6lqUGiQ1j866n5MTCBJreNEHHVWXa2u9GJTaeYyU1/k+1qLutkyw+sS6VAN+AbeiTqsxd/A==} - peerDependencies: - '@ethersproject/abi': ^5.0.0 - '@ethersproject/providers': ^5.0.0 - ethers: ^5.1.3 - typechain: ^8.1.1 - typescript: '>=4.3.0' - dependencies: - '@ethersproject/abi': 5.7.0 - '@ethersproject/providers': 5.7.2 - ethers: 5.7.2 - lodash: 4.17.21 - ts-essentials: 7.0.3(typescript@5.4.2) - typechain: 8.3.2(typescript@5.4.2) - typescript: 5.4.2 - dev: true - - /@typechain/hardhat@6.1.6(@ethersproject/abi@5.7.0)(@ethersproject/providers@5.7.2)(@typechain/ethers-v5@10.2.1)(ethers@5.7.2)(hardhat@2.21.0)(typechain@8.3.2): - resolution: {integrity: sha512-BiVnegSs+ZHVymyidtK472syodx1sXYlYJJixZfRstHVGYTi8V1O7QG4nsjyb0PC/LORcq7sfBUcHto1y6UgJA==} - peerDependencies: - '@ethersproject/abi': ^5.4.7 - '@ethersproject/providers': ^5.4.7 - '@typechain/ethers-v5': ^10.2.1 - ethers: ^5.4.7 - hardhat: ^2.9.9 - typechain: ^8.1.1 - dependencies: - '@ethersproject/abi': 5.7.0 - '@ethersproject/providers': 5.7.2 - '@typechain/ethers-v5': 10.2.1(@ethersproject/abi@5.7.0)(@ethersproject/providers@5.7.2)(ethers@5.7.2)(typechain@8.3.2)(typescript@5.4.2) - ethers: 5.7.2 - fs-extra: 9.1.0 - hardhat: 2.21.0(ts-node@10.9.2)(typescript@5.4.2) - typechain: 8.3.2(typescript@5.4.2) - dev: true - - /@types/bignumber.js@5.0.0: - resolution: {integrity: sha512-0DH7aPGCClywOFaxxjE6UwpN2kQYe9LwuDQMv+zYA97j5GkOMo8e66LYT+a8JYU7jfmUFRZLa9KycxHDsKXJCA==} - deprecated: This is a stub types definition for bignumber.js (https://github.com/MikeMcl/bignumber.js/). bignumber.js provides its own type definitions, so you don't need @types/bignumber.js installed! - dependencies: - bignumber.js: 9.1.2 - dev: true - - /@types/bn.js@4.11.6: - resolution: {integrity: sha512-pqr857jrp2kPuO9uRjZ3PwnJTjoQy+fcdxvBTvHm6dkmEL9q+hDD/2j/0ELOBPtPnS8LjCX0gI9nbl8lVkadpg==} - dependencies: - '@types/node': 20.11.26 - dev: true - - /@types/bn.js@5.1.5: - resolution: {integrity: sha512-V46N0zwKRF5Q00AZ6hWtN0T8gGmDUaUzLWQvHFo5yThtVwK/VCenFY3wXVbOvNfajEpsTfQM4IN9k/d6gUVX3A==} - dependencies: - '@types/node': 20.11.26 - dev: true - - /@types/cacheable-request@6.0.3: - resolution: {integrity: sha512-IQ3EbTzGxIigb1I3qPZc1rWJnH0BmSKv5QYTalEwweFvyBDLSAe24zP0le/hyi7ecGfZVlIVAg4BZqb8WBwKqw==} - dependencies: - '@types/http-cache-semantics': 4.0.4 - '@types/keyv': 3.1.4 - '@types/node': 12.20.55 - '@types/responselike': 1.0.3 - dev: true - - /@types/chai-as-promised@7.1.8: - resolution: {integrity: sha512-ThlRVIJhr69FLlh6IctTXFkmhtP3NpMZ2QGq69StYLyKZFp/HOp1VdKZj7RvfNWYYcJ1xlbLGLLWj1UvP5u/Gw==} - dependencies: - '@types/chai': 4.3.12 - dev: true - - /@types/chai@4.3.12: - resolution: {integrity: sha512-zNKDHG/1yxm8Il6uCCVsm+dRdEsJlFoDu73X17y09bId6UwoYww+vFBsAcRzl8knM1sab3Dp1VRikFQwDOtDDw==} - dev: true - - /@types/concat-stream@1.6.1: - resolution: {integrity: sha512-eHE4cQPoj6ngxBZMvVf6Hw7Mh4jMW4U9lpGmS5GBPB9RYxlFg+CHaVN7ErNY4W9XfLIEn20b4VDYaIrbq0q4uA==} - dependencies: - '@types/node': 8.10.66 - dev: true - - /@types/form-data@0.0.33: - resolution: {integrity: sha512-8BSvG1kGm83cyJITQMZSulnl6QV8jqAGreJsc5tPu1Jq0vTSOiY/k24Wx82JRpWwZSqrala6sd5rWi6aNXvqcw==} - dependencies: - '@types/node': 8.10.66 - dev: true - - /@types/fs-extra@11.0.4: - resolution: {integrity: sha512-yTbItCNreRooED33qjunPthRcSjERP1r4MqCZc7wv0u2sUkzTFp45tgUfS5+r7FrZPdmCCNflLhVSP/o+SemsQ==} - dependencies: - '@types/jsonfile': 6.1.4 - '@types/node': 20.11.26 - dev: true - - /@types/glob@7.2.0: - resolution: {integrity: sha512-ZUxbzKl0IfJILTS6t7ip5fQQM/J3TJYubDm3nMbgubNNYS62eXeUpoLUC8/7fJNiFYHTrGPQn7hspDUzIHX3UA==} - dependencies: - '@types/minimatch': 5.1.2 - '@types/node': 20.11.26 - dev: true - - /@types/http-cache-semantics@4.0.4: - resolution: {integrity: sha512-1m0bIFVc7eJWyve9S0RnuRgcQqF/Xd5QsUZAZeQFr1Q3/p9JWoQQEqmVy+DPTNpGXwhgIetAoYF8JSc33q29QA==} - dev: true - - /@types/jsonfile@6.1.4: - resolution: {integrity: sha512-D5qGUYwjvnNNextdU59/+fI+spnwtTFmyQP0h+PfIOSkNfpU6AOICUOkm4i0OnSk+NyjdPJrxCDro0sJsWlRpQ==} - dependencies: - '@types/node': 20.11.26 - dev: true - - /@types/keyv@3.1.4: - resolution: {integrity: sha512-BQ5aZNSCpj7D6K2ksrRCTmKRLEpnPvWDiLPfoGyhZ++8YtiK9d/3DBKPJgry359X/P1PfruyYwvnvwFjuEiEIg==} - dependencies: - '@types/node': 12.20.55 - dev: true - - /@types/lru-cache@5.1.1: - resolution: {integrity: sha512-ssE3Vlrys7sdIzs5LOxCzTVMsU7i9oa/IaW92wF32JFb3CVczqOkru2xspuKczHEbG3nvmPY7IFqVmGGHdNbYw==} - dev: true - - /@types/minimatch@5.1.2: - resolution: {integrity: sha512-K0VQKziLUWkVKiRVrx4a40iPaxTUefQmjtkQofBkYRcoaaL/8rhwDWww9qWbrgicNOgnpIsMxyNIUM4+n6dUIA==} - dev: true - - /@types/minimist@1.2.5: - resolution: {integrity: sha512-hov8bUuiLiyFPGyFPE1lwWhmzYbirOXQNNo40+y3zow8aFVTeyn3VWL0VFFfdNddA8S4Vf0Tc062rzyNr7Paag==} - dev: true - - /@types/mocha@10.0.6: - resolution: {integrity: sha512-dJvrYWxP/UcXm36Qn36fxhUKu8A/xMRXVT2cliFF1Z7UA9liG5Psj3ezNSZw+5puH2czDXRLcXQxf8JbJt0ejg==} - dev: true - - /@types/node@10.17.60: - resolution: {integrity: sha512-F0KIgDJfy2nA3zMLmWGKxcH2ZVEtCZXHHdOQs2gSaQ27+lNeEfGxzkIw90aXswATX7AZ33tahPbzy6KAfUreVw==} - dev: true - - /@types/node@12.20.55: - resolution: {integrity: sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ==} - dev: true - - /@types/node@18.19.31: - resolution: {integrity: sha512-ArgCD39YpyyrtFKIqMDvjz79jto5fcI/SVUs2HwB+f0dAzq68yqOdyaSivLiLugSziTpNXLQrVb7RZFmdZzbhA==} - dependencies: - undici-types: 5.26.5 - dev: true - - /@types/node@20.11.26: - resolution: {integrity: sha512-YwOMmyhNnAWijOBQweOJnQPl068Oqd4K3OFbTc6AHJwzweUwwWG3GIFY74OKks2PJUDkQPeddOQES9mLn1CTEQ==} - dependencies: - undici-types: 5.26.5 - dev: true - - /@types/node@8.10.66: - resolution: {integrity: sha512-tktOkFUA4kXx2hhhrB8bIFb5TbwzS4uOhKEmwiD+NoiL0qtP2OQ9mFldbgD4dV1djrlBYP6eBuQZiWjuHUpqFw==} - dev: true - - /@types/pbkdf2@3.1.2: - resolution: {integrity: sha512-uRwJqmiXmh9++aSu1VNEn3iIxWOhd8AHXNSdlaLfdAAdSTY9jYVeGWnzejM3dvrkbqE3/hyQkQQ29IFATEGlew==} - dependencies: - '@types/node': 20.11.26 - dev: true - - /@types/prettier@2.7.3: - resolution: {integrity: sha512-+68kP9yzs4LMp7VNh8gdzMSPZFL44MLGqiHWvttYJe+6qnuVr4Ek9wSBQoveqY/r+LwjCcU29kNVkidwim+kYA==} - dev: true - - /@types/ps-tree@1.1.6: - resolution: {integrity: sha512-PtrlVaOaI44/3pl3cvnlK+GxOM3re2526TJvPvh7W+keHIXdV4TE0ylpPBAcvFQCbGitaTXwL9u+RF7qtVeazQ==} - dev: true - - /@types/qs@6.9.12: - resolution: {integrity: sha512-bZcOkJ6uWrL0Qb2NAWKa7TBU+mJHPzhx9jjLL1KHF+XpzEcR7EXHvjbHlGtR/IsP1vyPrehuS6XqkmaePy//mg==} - dev: true - - /@types/responselike@1.0.3: - resolution: {integrity: sha512-H/+L+UkTV33uf49PH5pCAUBVPNj2nDBXTN+qS1dOwyyg24l3CcicicCA7ca+HMvJBZcFgl5r8e+RR6elsb4Lyw==} - dependencies: - '@types/node': 12.20.55 - dev: true - - /@types/secp256k1@4.0.6: - resolution: {integrity: sha512-hHxJU6PAEUn0TP4S/ZOzuTUvJWuZ6eIKeNKb5RBpODvSl6hp1Wrw4s7ATY50rklRCScUDpHzVA/DQdSjJ3UoYQ==} - dependencies: - '@types/node': 20.11.26 - dev: true - - /@types/which@3.0.3: - resolution: {integrity: sha512-2C1+XoY0huExTbs8MQv1DuS5FS86+SEjdM9F/+GS61gg5Hqbtj8ZiDSx8MfWcyei907fIPbfPGCOrNUTnVHY1g==} - dev: true - - /abbrev@1.0.9: - resolution: {integrity: sha512-LEyx4aLEC3x6T0UguF6YILf+ntvmOaWsVfENmIW0E9H09vKlLDGelMjjSm0jkDHALj8A8quZ/HapKNigzwge+Q==} - dev: true - - /abortcontroller-polyfill@1.7.5: - resolution: {integrity: sha512-JMJ5soJWP18htbbxJjG7bG6yuI6pRhgJ0scHHTfkUjf6wjP912xZWvM+A4sJK3gqd9E8fcPbDnOefbA9Th/FIQ==} - dev: true - - /accepts@1.3.8: - resolution: {integrity: sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==} - engines: {node: '>= 0.6'} - dependencies: - mime-types: 2.1.35 - negotiator: 0.6.3 - dev: true - - /acorn-walk@8.3.2: - resolution: {integrity: sha512-cjkyv4OtNCIeqhHrfS81QWXoCBPExR/J62oyEqepVw8WaQeSqpW2uhuLPh1m9eWhDuOo/jUXVTlifvesOWp/4A==} - engines: {node: '>=0.4.0'} - dev: true - - /acorn@8.11.3: - resolution: {integrity: sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg==} - engines: {node: '>=0.4.0'} - hasBin: true - dev: true - - /adm-zip@0.4.16: - resolution: {integrity: sha512-TFi4HBKSGfIKsK5YCkKaaFG2m4PEDyViZmEwof3MTIgzimHLto6muaHVpbrljdIvIrFZzEq/p4nafOeLcYegrg==} - engines: {node: '>=0.3.0'} - dev: true - - /aes-js@3.0.0: - resolution: {integrity: sha512-H7wUZRn8WpTq9jocdxQ2c8x2sKo9ZVmzfRE13GiNJXfp7NcKYEdvl3vspKjXox6RIG2VtaRe4JFvxG4rqp2Zuw==} - dev: true - - /agent-base@6.0.2: - resolution: {integrity: sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==} - engines: {node: '>= 6.0.0'} - dependencies: - debug: 4.3.4(supports-color@8.1.1) - transitivePeerDependencies: - - supports-color - dev: true - - /aggregate-error@3.1.0: - resolution: {integrity: sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==} - engines: {node: '>=8'} - dependencies: - clean-stack: 2.2.0 - indent-string: 4.0.0 - dev: true - - /ajv@6.12.6: - resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} - dependencies: - fast-deep-equal: 3.1.3 - fast-json-stable-stringify: 2.1.0 - json-schema-traverse: 0.4.1 - uri-js: 4.4.1 - dev: true - - /ajv@8.12.0: - resolution: {integrity: sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==} - dependencies: - fast-deep-equal: 3.1.3 - json-schema-traverse: 1.0.0 - require-from-string: 2.0.2 - uri-js: 4.4.1 - dev: true - - /amdefine@1.0.1: - resolution: {integrity: sha512-S2Hw0TtNkMJhIabBwIojKL9YHO5T0n5eNqWJ7Lrlel/zDbftQpxpapi8tZs3X1HWa+u+QeydGmzzNU0m09+Rcg==} - engines: {node: '>=0.4.2'} - requiresBuild: true - dev: true - optional: true - - /ansi-align@3.0.1: - resolution: {integrity: sha512-IOfwwBF5iczOjp/WeY4YxyjqAFMQoZufdQWDd19SEExbVLNXqvpzSJ/M7Za4/sCPmQ0+GRquoA7bGcINcxew6w==} - dependencies: - string-width: 4.2.3 - dev: true - - /ansi-colors@3.2.4: - resolution: {integrity: sha512-hHUXGagefjN2iRrID63xckIvotOXOojhQKWIPUZ4mNUZ9nLZW+7FMNoE1lOkEhNWYsx/7ysGIuJYCiMAA9FnrA==} - engines: {node: '>=6'} - dev: true - - /ansi-colors@4.1.1: - resolution: {integrity: sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==} - engines: {node: '>=6'} - dev: true - - /ansi-colors@4.1.3: - resolution: {integrity: sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==} - engines: {node: '>=6'} - dev: true - - /ansi-escapes@4.3.2: - resolution: {integrity: sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==} - engines: {node: '>=8'} - dependencies: - type-fest: 0.21.3 - dev: true - - /ansi-regex@2.1.1: - resolution: {integrity: sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA==} - engines: {node: '>=0.10.0'} - dev: true - - /ansi-regex@3.0.1: - resolution: {integrity: sha512-+O9Jct8wf++lXxxFc4hc8LsjaSq0HFzzL7cVsw8pRDIPdjKD2mT4ytDZlLuSBZ4cLKZFXIrMGO7DbQCtMJJMKw==} - engines: {node: '>=4'} - dev: true - - /ansi-regex@5.0.1: - resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} - engines: {node: '>=8'} - dev: true - - /ansi-styles@3.2.1: - resolution: {integrity: sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==} - engines: {node: '>=4'} - dependencies: - color-convert: 1.9.3 - dev: true - - /ansi-styles@4.3.0: - resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} - engines: {node: '>=8'} - dependencies: - color-convert: 2.0.1 - dev: true - - /antlr4ts@0.5.0-alpha.4: - resolution: {integrity: sha512-WPQDt1B74OfPv/IMS2ekXAKkTZIHl88uMetg6q3OTqgFxZ/dxDXI0EWLyZid/1Pe6hTftyg5N7gel5wNAGxXyQ==} - dev: true - - /anymatch@3.1.3: - resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} - engines: {node: '>= 8'} - dependencies: - normalize-path: 3.0.0 - picomatch: 2.3.1 - dev: true - - /arg@4.1.3: - resolution: {integrity: sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==} - dev: true - - /argparse@1.0.10: - resolution: {integrity: sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==} - dependencies: - sprintf-js: 1.0.3 - dev: true - - /argparse@2.0.1: - resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} - dev: true - - /array-back@3.1.0: - resolution: {integrity: sha512-TkuxA4UCOvxuDK6NZYXCalszEzj+TLszyASooky+i742l9TqsOdYCMJJupxRic61hwquNtppB3hgcuq9SVSH1Q==} - engines: {node: '>=6'} - dev: true - - /array-back@4.0.2: - resolution: {integrity: sha512-NbdMezxqf94cnNfWLL7V/im0Ub+Anbb0IoZhvzie8+4HJ4nMQuzHuy49FkGYCJK2yAloZ3meiB6AVMClbrI1vg==} - engines: {node: '>=8'} - dev: true - - /array-flatten@1.1.1: - resolution: {integrity: sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==} - dev: true - - /array-union@2.1.0: - resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==} - engines: {node: '>=8'} - dev: true - - /array-uniq@1.0.3: - resolution: {integrity: sha512-MNha4BWQ6JbwhFhj03YK552f7cb3AzoE8SzeljgChvL1dl3IcvggXVz1DilzySZkCja+CXuZbdW7yATchWn8/Q==} - engines: {node: '>=0.10.0'} - dev: true - - /asap@2.0.6: - resolution: {integrity: sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==} - dev: true - - /asn1@0.2.6: - resolution: {integrity: sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ==} - dependencies: - safer-buffer: 2.1.2 - dev: true - - /assert-plus@1.0.0: - resolution: {integrity: sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw==} - engines: {node: '>=0.8'} - dev: true - - /assertion-error@1.1.0: - resolution: {integrity: sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==} - dev: true - - /astral-regex@2.0.0: - resolution: {integrity: sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==} - engines: {node: '>=8'} - dev: true - - /async-limiter@1.0.1: - resolution: {integrity: sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ==} - dev: true - - /async@1.5.2: - resolution: {integrity: sha512-nSVgobk4rv61R9PUSDtYt7mPVB2olxNR5RWJcAsH676/ef11bUZwvu7+RGYrYauVdDPcO519v68wRhXQtxsV9w==} - dev: true - - /asynckit@0.4.0: - resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==} - dev: true - - /at-least-node@1.0.0: - resolution: {integrity: sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==} - engines: {node: '>= 4.0.0'} - dev: true - - /available-typed-arrays@1.0.7: - resolution: {integrity: sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==} - engines: {node: '>= 0.4'} - dependencies: - possible-typed-array-names: 1.0.0 - dev: true - - /aws-sign2@0.7.0: - resolution: {integrity: sha512-08kcGqnYf/YmjoRhfxyu+CLxBjUtHLXLXX/vUfx9l2LYzG3c1m61nrpyFUZI6zeS+Li/wWMMidD9KgrqtGq3mA==} - dev: true - - /aws4@1.12.0: - resolution: {integrity: sha512-NmWvPnx0F1SfrQbYwOi7OeaNGokp9XhzNioJ/CSBs8Qa4vxug81mhJEAVZwxXuBmYB5KDRfMq/F3RR0BIU7sWg==} - dev: true - - /axios@1.6.7: - resolution: {integrity: sha512-/hDJGff6/c7u0hDkvkGxR/oy6CbCs8ziCsC7SqmhjfozqiJGc8Z11wrv9z9lYfY4K8l+H9TpjcMDX0xOZmx+RA==} - dependencies: - follow-redirects: 1.15.5(debug@4.3.4) - form-data: 4.0.0 - proxy-from-env: 1.1.0 - transitivePeerDependencies: - - debug - dev: true - - /balanced-match@1.0.2: - resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} - dev: true - - /base-x@3.0.9: - resolution: {integrity: sha512-H7JU6iBHTal1gp56aKoaa//YUxEaAOUiydvrV/pILqIHXTtqxSkATOnDA2u+jZ/61sD+L/412+7kzXRtWukhpQ==} - dependencies: - safe-buffer: 5.2.1 - dev: true - - /base64-js@1.5.1: - resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} - dev: true - - /bcrypt-pbkdf@1.0.2: - resolution: {integrity: sha512-qeFIXtP4MSoi6NLqO12WfqARWWuCKi2Rn/9hJLEmtB5yTNr9DqFWkJRCf2qShWzPeAMRnOgCrq0sg/KLv5ES9w==} - dependencies: - tweetnacl: 0.14.5 - dev: true - - /bech32@1.1.4: - resolution: {integrity: sha512-s0IrSOzLlbvX7yp4WBfPITzpAU8sqQcpsmwXDiKwrG4r491vwCO/XpejasRNl0piBMe/DvP4Tz0mIS/X1DPJBQ==} - dev: true - - /big-integer@1.6.36: - resolution: {integrity: sha512-t70bfa7HYEA1D9idDbmuv7YbsbVkQ+Hp+8KFSul4aE5e/i1bjCNIRYJZlA8Q8p0r9T8cF/RVvwUgRA//FydEyg==} - engines: {node: '>=0.6'} - dev: true - - /big.js@6.2.1: - resolution: {integrity: sha512-bCtHMwL9LeDIozFn+oNhhFoq+yQ3BNdnsLSASUxLciOb1vgvpHsIO1dsENiGMgbb4SkP5TrzWzRiLddn8ahVOQ==} - dev: true - - /bignumber.js@7.2.1: - resolution: {integrity: sha512-S4XzBk5sMB+Rcb/LNcpzXr57VRTxgAvaAEDAl1AwRx27j00hT84O6OkteE7u8UB3NuaaygCRrEpqox4uDOrbdQ==} - dev: true - - /bignumber.js@9.1.2: - resolution: {integrity: sha512-2/mKyZH9K85bzOEfhXDBFZTGd1CTs+5IHpeFQo9luiBG7hghdC851Pj2WAhb6E3R6b9tZj/XKhbg4fum+Kepug==} - dev: true - - /binary-extensions@2.2.0: - resolution: {integrity: sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==} - engines: {node: '>=8'} - dev: true - - /blakejs@1.2.1: - resolution: {integrity: sha512-QXUSXI3QVc/gJME0dBpXrag1kbzOqCjCX8/b54ntNyW6sjtoqxqRk3LTmXzaJoh71zMsDCjM+47jS7XiwN/+fQ==} - dev: true - - /bluebird@3.7.2: - resolution: {integrity: sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==} - dev: true - - /bn.js@4.11.6: - resolution: {integrity: sha512-XWwnNNFCuuSQ0m3r3C4LE3EiORltHd9M05pq6FOlVeiophzRbMo50Sbz1ehl8K3Z+jw9+vmgnXefY1hz8X+2wA==} - dev: true - - /bn.js@4.12.0: - resolution: {integrity: sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==} - dev: true - - /bn.js@5.2.1: - resolution: {integrity: sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ==} - dev: true - - /body-parser@1.20.2: - resolution: {integrity: sha512-ml9pReCu3M61kGlqoTm2umSXTlRTuGTx0bfYj+uIUKKYycG5NtSbeetV3faSU6R7ajOPw0g/J1PvK4qNy7s5bA==} - engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16} - dependencies: - bytes: 3.1.2 - content-type: 1.0.5 - debug: 2.6.9 - depd: 2.0.0 - destroy: 1.2.0 - http-errors: 2.0.0 - iconv-lite: 0.4.24 - on-finished: 2.4.1 - qs: 6.11.0 - raw-body: 2.5.2 - type-is: 1.6.18 - unpipe: 1.0.0 - transitivePeerDependencies: - - supports-color - dev: true - - /boolbase@1.0.0: - resolution: {integrity: sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==} - dev: true - - /boxen@5.1.2: - resolution: {integrity: sha512-9gYgQKXx+1nP8mP7CzFyaUARhg7D3n1dF/FnErWmu9l6JvGpNUN278h0aSb+QjoiKSWG+iZ3uHrcqk0qrY9RQQ==} - engines: {node: '>=10'} - dependencies: - ansi-align: 3.0.1 - camelcase: 6.3.0 - chalk: 4.1.2 - cli-boxes: 2.2.1 - string-width: 4.2.3 - type-fest: 0.20.2 - widest-line: 3.1.0 - wrap-ansi: 7.0.0 - dev: true - - /brace-expansion@1.1.11: - resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} - dependencies: - balanced-match: 1.0.2 - concat-map: 0.0.1 - dev: true - - /brace-expansion@2.0.1: - resolution: {integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==} - dependencies: - balanced-match: 1.0.2 - dev: true - - /braces@3.0.2: - resolution: {integrity: sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==} - engines: {node: '>=8'} - dependencies: - fill-range: 7.0.1 - dev: true - - /brorand@1.1.0: - resolution: {integrity: sha512-cKV8tMCEpQs4hK/ik71d6LrPOnpkpGBR0wzxqr68g2m/LB2GxVYQroAjMJZRVM1Y4BCjCKc3vAamxSzOY2RP+w==} - dev: true - - /browser-stdout@1.3.1: - resolution: {integrity: sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==} - dev: true - - /browserify-aes@1.2.0: - resolution: {integrity: sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==} - dependencies: - buffer-xor: 1.0.3 - cipher-base: 1.0.4 - create-hash: 1.2.0 - evp_bytestokey: 1.0.3 - inherits: 2.0.4 - safe-buffer: 5.2.1 - dev: true - - /bs58@4.0.1: - resolution: {integrity: sha512-Ok3Wdf5vOIlBrgCvTq96gBkJw+JUEzdBgyaza5HLtPm7yTHkjRy8+JzNyHF7BHa0bNWOQIp3m5YF0nnFcOIKLw==} - dependencies: - base-x: 3.0.9 - dev: true - - /bs58check@2.1.2: - resolution: {integrity: sha512-0TS1jicxdU09dwJMNZtVAfzPi6Q6QeN0pM1Fkzrjn+XYHvzMKPU3pHVpva+769iNVSfIYWf7LJ6WR+BuuMf8cA==} - dependencies: - bs58: 4.0.1 - create-hash: 1.2.0 - safe-buffer: 5.2.1 - dev: true - - /buffer-from@1.1.2: - resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} - dev: true - - /buffer-to-arraybuffer@0.0.5: - resolution: {integrity: sha512-3dthu5CYiVB1DEJp61FtApNnNndTckcqe4pFcLdvHtrpG+kcyekCJKg4MRiDcFW7A6AODnXB9U4dwQiCW5kzJQ==} - dev: true - - /buffer-xor@1.0.3: - resolution: {integrity: sha512-571s0T7nZWK6vB67HI5dyUF7wXiNcfaPPPTl6zYCNApANjIvYJTg7hlud/+cJpdAhS7dVzqMLmfhfHR3rAcOjQ==} - dev: true - - /buffer@5.7.1: - resolution: {integrity: sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==} - dependencies: - base64-js: 1.5.1 - ieee754: 1.2.1 - dev: true - - /buffer@6.0.3: - resolution: {integrity: sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==} - dependencies: - base64-js: 1.5.1 - ieee754: 1.2.1 - dev: true - - /bufferutil@4.0.8: - resolution: {integrity: sha512-4T53u4PdgsXqKaIctwF8ifXlRTTmEPJ8iEPWFdGZvcf7sbwYo6FKFEX9eNNAnzFZ7EzJAQ3CJeOtCRA4rDp7Pw==} - engines: {node: '>=6.14.2'} - requiresBuild: true - dependencies: - node-gyp-build: 4.8.0 - dev: true - - /bytes@3.1.2: - resolution: {integrity: sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==} - engines: {node: '>= 0.8'} - dev: true - - /cacheable-lookup@5.0.4: - resolution: {integrity: sha512-2/kNscPhpcxrOigMZzbiWF7dz8ilhb/nIHU3EyZiXWXpeq/au8qJ8VhdftMkty3n7Gj6HIGalQG8oiBNB3AJgA==} - engines: {node: '>=10.6.0'} - dev: true - - /cacheable-lookup@6.1.0: - resolution: {integrity: sha512-KJ/Dmo1lDDhmW2XDPMo+9oiy/CeqosPguPCrgcVzKyZrL6pM1gU2GmPY/xo6OQPTUaA/c0kwHuywB4E6nmT9ww==} - engines: {node: '>=10.6.0'} - dev: true - - /cacheable-request@7.0.4: - resolution: {integrity: sha512-v+p6ongsrp0yTGbJXjgxPow2+DL93DASP4kXCDKb8/bwRtt9OEF3whggkkDkGNzgcWy2XaF4a8nZglC7uElscg==} - engines: {node: '>=8'} - dependencies: - clone-response: 1.0.3 - get-stream: 5.2.0 - http-cache-semantics: 4.1.1 - keyv: 4.5.4 - lowercase-keys: 2.0.0 - normalize-url: 6.1.0 - responselike: 2.0.1 - dev: true - - /call-bind@1.0.7: - resolution: {integrity: sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==} - engines: {node: '>= 0.4'} - dependencies: - es-define-property: 1.0.0 - es-errors: 1.3.0 - function-bind: 1.1.2 - get-intrinsic: 1.2.4 - set-function-length: 1.2.2 - dev: true - - /camel-case@3.0.0: - resolution: {integrity: sha512-+MbKztAYHXPr1jNTSKQF52VpcFjwY5RkR7fxksV8Doo4KAYc5Fl4UJRgthBbTmEx8C54DqahhbLJkDwjI3PI/w==} - dependencies: - no-case: 2.3.2 - upper-case: 1.1.3 - dev: true - - /camelcase@3.0.0: - resolution: {integrity: sha512-4nhGqUkc4BqbBBB4Q6zLuD7lzzrHYrjKGeYaEji/3tFR5VdJu9v+LilhGIVe8wxEJPPOeWo7eg8dwY13TZ1BNg==} - engines: {node: '>=0.10.0'} - dev: true - - /camelcase@4.1.0: - resolution: {integrity: sha512-FxAv7HpHrXbh3aPo4o2qxHay2lkLY3x5Mw3KeE4KQE8ysVfziWeRZDwcjauvwBSGEC/nXUPzZy8zeh4HokqOnw==} - engines: {node: '>=4'} - dev: true - - /camelcase@6.3.0: - resolution: {integrity: sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==} - engines: {node: '>=10'} - dev: true - - /caseless@0.12.0: - resolution: {integrity: sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw==} - dev: true - - /cbor@5.2.0: - resolution: {integrity: sha512-5IMhi9e1QU76ppa5/ajP1BmMWZ2FHkhAhjeVKQ/EFCgYSEaeVaoGtL7cxJskf9oCCk+XjzaIdc3IuU/dbA/o2A==} - engines: {node: '>=6.0.0'} - dependencies: - bignumber.js: 9.1.2 - nofilter: 1.0.4 - dev: true - - /cbor@8.1.0: - resolution: {integrity: sha512-DwGjNW9omn6EwP70aXsn7FQJx5kO12tX0bZkaTjzdVFM6/7nhA4t0EENocKGx6D2Bch9PE2KzCUf5SceBdeijg==} - engines: {node: '>=12.19'} - dependencies: - nofilter: 3.1.0 - dev: true - - /chai-as-promised@7.1.1(chai@4.4.1): - resolution: {integrity: sha512-azL6xMoi+uxu6z4rhWQ1jbdUhOMhis2PvscD/xjLqNMkv3BPPp2JyyuTHOrf9BOosGpNQ11v6BKv/g57RXbiaA==} - peerDependencies: - chai: '>= 2.1.2 < 5' - dependencies: - chai: 4.4.1 - check-error: 1.0.3 - dev: true - - /chai-bn@0.2.2(bn.js@4.12.0)(chai@4.4.1): - resolution: {integrity: sha512-MzjelH0p8vWn65QKmEq/DLBG1Hle4WeyqT79ANhXZhn/UxRWO0OogkAxi5oGGtfzwU9bZR8mvbvYdoqNVWQwFg==} - peerDependencies: - bn.js: ^4.11.0 - chai: ^4.0.0 - dependencies: - bn.js: 4.12.0 - chai: 4.4.1 - dev: true - - /chai@4.4.1: - resolution: {integrity: sha512-13sOfMv2+DWduEU+/xbun3LScLoqN17nBeTLUsmDfKdoiC1fr0n9PU4guu4AhRcOVFk/sW8LyZWHuhWtQZiF+g==} - engines: {node: '>=4'} - dependencies: - assertion-error: 1.1.0 - check-error: 1.0.3 - deep-eql: 4.1.3 - get-func-name: 2.0.2 - loupe: 2.3.7 - pathval: 1.1.1 - type-detect: 4.0.8 - dev: true - - /chalk@2.4.2: - resolution: {integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==} - engines: {node: '>=4'} - dependencies: - ansi-styles: 3.2.1 - escape-string-regexp: 1.0.5 - supports-color: 5.5.0 - dev: true - - /chalk@4.1.2: - resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} - engines: {node: '>=10'} - dependencies: - ansi-styles: 4.3.0 - supports-color: 7.2.0 - dev: true - - /chalk@5.3.0: - resolution: {integrity: sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==} - engines: {node: ^12.17.0 || ^14.13 || >=16.0.0} - dev: true - - /change-case@3.0.2: - resolution: {integrity: sha512-Mww+SLF6MZ0U6kdg11algyKd5BARbyM4TbFBepwowYSR5ClfQGCGtxNXgykpN0uF/bstWeaGDT4JWaDh8zWAHA==} - dependencies: - camel-case: 3.0.0 - constant-case: 2.0.0 - dot-case: 2.1.1 - header-case: 1.0.1 - is-lower-case: 1.1.3 - is-upper-case: 1.1.2 - lower-case: 1.1.4 - lower-case-first: 1.0.2 - no-case: 2.3.2 - param-case: 2.1.1 - pascal-case: 2.0.1 - path-case: 2.1.1 - sentence-case: 2.1.1 - snake-case: 2.1.0 - swap-case: 1.1.2 - title-case: 2.1.1 - upper-case: 1.1.3 - upper-case-first: 1.1.2 - dev: true - - /charenc@0.0.2: - resolution: {integrity: sha512-yrLQ/yVUFXkzg7EDQsPieE/53+0RlaWTs+wBrvW36cyilJ2SaDWfl4Yj7MtLTXleV9uEKefbAGUPv2/iWSooRA==} - dev: true - - /check-error@1.0.3: - resolution: {integrity: sha512-iKEoDYaRmd1mxM90a2OEfWhjsjPpYPuQ+lMYsoxB126+t8fw7ySEO48nmDg5COTjxDI65/Y2OWpeEHk3ZOe8zg==} - dependencies: - get-func-name: 2.0.2 - dev: true - - /cheerio-select@2.1.0: - resolution: {integrity: sha512-9v9kG0LvzrlcungtnJtpGNxY+fzECQKhK4EGJX2vByejiMX84MFNQw4UxPJl3bFbTMw+Dfs37XaIkCwTZfLh4g==} - dependencies: - boolbase: 1.0.0 - css-select: 5.1.0 - css-what: 6.1.0 - domelementtype: 2.3.0 - domhandler: 5.0.3 - domutils: 3.1.0 - dev: true - - /cheerio@1.0.0-rc.12: - resolution: {integrity: sha512-VqR8m68vM46BNnuZ5NtnGBKIE/DfN0cRIzg9n40EIq9NOv90ayxLBXA8fXC5gquFRGJSTRqBq25Jt2ECLR431Q==} - engines: {node: '>= 6'} - dependencies: - cheerio-select: 2.1.0 - dom-serializer: 2.0.0 - domhandler: 5.0.3 - domutils: 3.1.0 - htmlparser2: 8.0.2 - parse5: 7.1.2 - parse5-htmlparser2-tree-adapter: 7.0.0 - dev: true - - /chokidar@3.5.3: - resolution: {integrity: sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==} - engines: {node: '>= 8.10.0'} - dependencies: - anymatch: 3.1.3 - braces: 3.0.2 - glob-parent: 5.1.2 - is-binary-path: 2.1.0 - is-glob: 4.0.3 - normalize-path: 3.0.0 - readdirp: 3.6.0 - optionalDependencies: - fsevents: 2.3.3 - dev: true - - /chokidar@3.6.0: - resolution: {integrity: sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==} - engines: {node: '>= 8.10.0'} - dependencies: - anymatch: 3.1.3 - braces: 3.0.2 - glob-parent: 5.1.2 - is-binary-path: 2.1.0 - is-glob: 4.0.3 - normalize-path: 3.0.0 - readdirp: 3.6.0 - optionalDependencies: - fsevents: 2.3.3 - dev: true - - /chownr@1.1.4: - resolution: {integrity: sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==} - dev: true - - /ci-info@2.0.0: - resolution: {integrity: sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==} - dev: true - - /cids@0.7.5: - resolution: {integrity: sha512-zT7mPeghoWAu+ppn8+BS1tQ5qGmbMfB4AregnQjA/qHY3GC1m1ptI9GkWNlgeu38r7CuRdXB47uY2XgAYt6QVA==} - engines: {node: '>=4.0.0', npm: '>=3.0.0'} - deprecated: This module has been superseded by the multiformats module - dependencies: - buffer: 5.7.1 - class-is: 1.1.0 - multibase: 0.6.1 - multicodec: 1.0.4 - multihashes: 0.4.21 - dev: true - - /cipher-base@1.0.4: - resolution: {integrity: sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==} - dependencies: - inherits: 2.0.4 - safe-buffer: 5.2.1 - dev: true - - /class-is@1.1.0: - resolution: {integrity: sha512-rhjH9AG1fvabIDoGRVH587413LPjTZgmDF9fOFCbFJQV4yuocX1mHxxvXI4g3cGwbVY9wAYIoKlg1N79frJKQw==} - dev: true - - /clean-stack@2.2.0: - resolution: {integrity: sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==} - engines: {node: '>=6'} - dev: true - - /cli-boxes@2.2.1: - resolution: {integrity: sha512-y4coMcylgSCdVinjiDBuR8PCC2bLjyGTwEmPb9NHR/QaNU6EUOXcTY/s6VjGMD6ENSEaeQYHCY0GNGS5jfMwPw==} - engines: {node: '>=6'} - dev: true - - /cli-table3@0.5.1: - resolution: {integrity: sha512-7Qg2Jrep1S/+Q3EceiZtQcDPWxhAvBw+ERf1162v4sikJrvojMHFqXt8QIVha8UlH9rgU0BeWPytZ9/TzYqlUw==} - engines: {node: '>=6'} - dependencies: - object-assign: 4.1.1 - string-width: 2.1.1 - optionalDependencies: - colors: 1.4.0 - dev: true - - /cliui@3.2.0: - resolution: {integrity: sha512-0yayqDxWQbqk3ojkYqUKqaAQ6AfNKeKWRNA8kR0WXzAsdHpP4BIaOmMAG87JGuO6qcobyW4GjxHd9PmhEd+T9w==} - dependencies: - string-width: 1.0.2 - strip-ansi: 3.0.1 - wrap-ansi: 2.1.0 - dev: true - - /cliui@7.0.4: - resolution: {integrity: sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==} - dependencies: - string-width: 4.2.3 - strip-ansi: 6.0.1 - wrap-ansi: 7.0.0 - dev: true - - /clone-response@1.0.3: - resolution: {integrity: sha512-ROoL94jJH2dUVML2Y/5PEDNaSHgeOdSDicUyS7izcF63G6sTc/FTjLub4b8Il9S8S0beOfYt0TaA5qvFK+w0wA==} - dependencies: - mimic-response: 1.0.1 - dev: true - - /code-point-at@1.1.0: - resolution: {integrity: sha512-RpAVKQA5T63xEj6/giIbUEtZwJ4UFIc3ZtvEkiaUERylqe8xb5IvqcgOurZLahv93CLKfxcw5YI+DZcUBRyLXA==} - engines: {node: '>=0.10.0'} - dev: true - - /color-convert@1.9.3: - resolution: {integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==} - dependencies: - color-name: 1.1.3 - dev: true - - /color-convert@2.0.1: - resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} - engines: {node: '>=7.0.0'} - dependencies: - color-name: 1.1.4 - dev: true - - /color-name@1.1.3: - resolution: {integrity: sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==} - dev: true - - /color-name@1.1.4: - resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} - dev: true - - /colors@1.4.0: - resolution: {integrity: sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA==} - engines: {node: '>=0.1.90'} - dev: true - - /combined-stream@1.0.8: - resolution: {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==} - engines: {node: '>= 0.8'} - dependencies: - delayed-stream: 1.0.0 - dev: true - - /command-exists@1.2.9: - resolution: {integrity: sha512-LTQ/SGc+s0Xc0Fu5WaKnR0YiygZkm9eKFvyS+fRsU7/ZWFF8ykFM6Pc9aCVf1+xasOOZpO3BAVgVrKvsqKHV7w==} - dev: true - - /command-line-args@5.2.1: - resolution: {integrity: sha512-H4UfQhZyakIjC74I9d34fGYDwk3XpSr17QhEd0Q3I9Xq1CETHo4Hcuo87WyWHpAF1aSLjLRf5lD9ZGX2qStUvg==} - engines: {node: '>=4.0.0'} - dependencies: - array-back: 3.1.0 - find-replace: 3.0.0 - lodash.camelcase: 4.3.0 - typical: 4.0.0 - dev: true - - /command-line-usage@6.1.3: - resolution: {integrity: sha512-sH5ZSPr+7UStsloltmDh7Ce5fb8XPlHyoPzTpyyMuYCtervL65+ubVZ6Q61cFtFl62UyJlc8/JwERRbAFPUqgw==} - engines: {node: '>=8.0.0'} - dependencies: - array-back: 4.0.2 - chalk: 2.4.2 - table-layout: 1.0.2 - typical: 5.2.0 - dev: true - - /commander@3.0.2: - resolution: {integrity: sha512-Gar0ASD4BDyKC4hl4DwHqDrmvjoxWKZigVnAbn5H1owvm4CxCPdb0HQDehwNYMJpla5+M2tPmPARzhtYuwpHow==} - dev: true - - /concat-map@0.0.1: - resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} - dev: true - - /concat-stream@1.6.2: - resolution: {integrity: sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==} - engines: {'0': node >= 0.8} - dependencies: - buffer-from: 1.1.2 - inherits: 2.0.4 - readable-stream: 2.3.8 - typedarray: 0.0.6 - dev: true - - /constant-case@2.0.0: - resolution: {integrity: sha512-eS0N9WwmjTqrOmR3o83F5vW8Z+9R1HnVz3xmzT2PMFug9ly+Au/fxRWlEBSb6LcZwspSsEn9Xs1uw9YgzAg1EQ==} - dependencies: - snake-case: 2.1.0 - upper-case: 1.1.3 - dev: true - - /content-disposition@0.5.4: - resolution: {integrity: sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==} - engines: {node: '>= 0.6'} - dependencies: - safe-buffer: 5.2.1 - dev: true - - /content-hash@2.5.2: - resolution: {integrity: sha512-FvIQKy0S1JaWV10sMsA7TRx8bpU+pqPkhbsfvOJAdjRXvYxEckAwQWGwtRjiaJfh+E0DvcWUGqcdjwMGFjsSdw==} - dependencies: - cids: 0.7.5 - multicodec: 0.5.7 - multihashes: 0.4.21 - dev: true - - /content-type@1.0.5: - resolution: {integrity: sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==} - engines: {node: '>= 0.6'} - dev: true - - /cookie-signature@1.0.6: - resolution: {integrity: sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==} - dev: true - - /cookie@0.4.2: - resolution: {integrity: sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA==} - engines: {node: '>= 0.6'} - dev: true - - /cookie@0.5.0: - resolution: {integrity: sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==} - engines: {node: '>= 0.6'} - dev: true - - /core-util-is@1.0.2: - resolution: {integrity: sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ==} - dev: true - - /core-util-is@1.0.3: - resolution: {integrity: sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==} - dev: true - - /cors@2.8.5: - resolution: {integrity: sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==} - engines: {node: '>= 0.10'} - dependencies: - object-assign: 4.1.1 - vary: 1.1.2 - dev: true - - /crc-32@1.2.2: - resolution: {integrity: sha512-ROmzCKrTnOwybPcJApAA6WBWij23HVfGVNKqqrZpuyZOHqK2CwHSvpGuyt/UNNvaIjEd8X5IFGp4Mh+Ie1IHJQ==} - engines: {node: '>=0.8'} - hasBin: true - dev: true - - /create-hash@1.2.0: - resolution: {integrity: sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==} - dependencies: - cipher-base: 1.0.4 - inherits: 2.0.4 - md5.js: 1.3.5 - ripemd160: 2.0.2 - sha.js: 2.4.11 - dev: true - - /create-hmac@1.1.7: - resolution: {integrity: sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==} - dependencies: - cipher-base: 1.0.4 - create-hash: 1.2.0 - inherits: 2.0.4 - ripemd160: 2.0.2 - safe-buffer: 5.2.1 - sha.js: 2.4.11 - dev: true - - /create-require@1.1.1: - resolution: {integrity: sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==} - dev: true - - /cross-fetch@3.1.8: - resolution: {integrity: sha512-cvA+JwZoU0Xq+h6WkMvAUqPEYy92Obet6UdKLfW60qn99ftItKjB5T+BkyWOFWe2pUyfQ+IJHmpOTznqk1M6Kg==} - dependencies: - node-fetch: 2.7.0 - transitivePeerDependencies: - - encoding - dev: true - - /cross-fetch@4.0.0: - resolution: {integrity: sha512-e4a5N8lVvuLgAWgnCrLr2PP0YyDOTHa9H/Rj54dirp61qXnNq46m82bRhNqIA5VccJtWBvPTFRV3TtvHUKPB1g==} - dependencies: - node-fetch: 2.7.0 - transitivePeerDependencies: - - encoding - dev: true - - /crypt@0.0.2: - resolution: {integrity: sha512-mCxBlsHFYh9C+HVpiEacem8FEBnMXgU9gy4zmNC+SXAZNB/1idgp/aulFJ4FgCi7GPEVbfyng092GqL2k2rmow==} - dev: true - - /crypto-addr-codec@0.1.8: - resolution: {integrity: sha512-GqAK90iLLgP3FvhNmHbpT3wR6dEdaM8hZyZtLX29SPardh3OA13RFLHDR6sntGCgRWOfiHqW6sIyohpNqOtV/g==} - dependencies: - base-x: 3.0.9 - big-integer: 1.6.36 - blakejs: 1.2.1 - bs58: 4.0.1 - ripemd160-min: 0.0.6 - safe-buffer: 5.2.1 - sha3: 2.1.4 - dev: true - - /css-select@5.1.0: - resolution: {integrity: sha512-nwoRF1rvRRnnCqqY7updORDsuqKzqYJ28+oSMaJMMgOauh3fvwHqMS7EZpIPqK8GL+g9mKxF1vP/ZjSeNjEVHg==} - dependencies: - boolbase: 1.0.0 - css-what: 6.1.0 - domhandler: 5.0.3 - domutils: 3.1.0 - nth-check: 2.1.1 - dev: true - - /css-what@6.1.0: - resolution: {integrity: sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==} - engines: {node: '>= 6'} - dev: true - - /d@1.0.2: - resolution: {integrity: sha512-MOqHvMWF9/9MX6nza0KgvFH4HpMU0EF5uUDXqX/BtxtU8NfB0QzRtJ8Oe/6SuS4kbhyzVJwjd97EA4PKrzJ8bw==} - engines: {node: '>=0.12'} - dependencies: - es5-ext: 0.10.64 - type: 2.7.2 - dev: true - - /dashdash@1.14.1: - resolution: {integrity: sha512-jRFi8UDGo6j+odZiEpjazZaWqEal3w/basFjQHQEwVtZJGDpxbH1MeYluwCS8Xq5wmLJooDlMgvVarmWfGM44g==} - engines: {node: '>=0.10'} - dependencies: - assert-plus: 1.0.0 - dev: true - - /data-uri-to-buffer@4.0.1: - resolution: {integrity: sha512-0R9ikRb668HB7QDxT1vkpuUBtqc53YyAwMwGeUFKRojY/NWKvdZ+9UYtRfGmhqNbRkTSVpMbmyhXipFFv2cb/A==} - engines: {node: '>= 12'} - dev: true - - /death@1.1.0: - resolution: {integrity: sha512-vsV6S4KVHvTGxbEcij7hkWRv0It+sGGWVOM67dQde/o5Xjnr+KmLjxWJii2uEObIrt1CcM9w0Yaovx+iOlIL+w==} - dev: true - - /debug@2.6.9: - resolution: {integrity: sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==} - peerDependencies: - supports-color: '*' - peerDependenciesMeta: - supports-color: - optional: true - dependencies: - ms: 2.0.0 - dev: true - - /debug@4.3.4(supports-color@8.1.1): - resolution: {integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==} - engines: {node: '>=6.0'} - peerDependencies: - supports-color: '*' - peerDependenciesMeta: - supports-color: - optional: true - dependencies: - ms: 2.1.2 - supports-color: 8.1.1 - dev: true - - /decamelize@1.2.0: - resolution: {integrity: sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==} - engines: {node: '>=0.10.0'} - dev: true - - /decamelize@4.0.0: - resolution: {integrity: sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ==} - engines: {node: '>=10'} - dev: true - - /decimal.js@10.4.3: - resolution: {integrity: sha512-VBBaLc1MgL5XpzgIP7ny5Z6Nx3UrRkIViUkPUdtl9aya5amy3De1gsUUSB1g3+3sExYNjCAsAznmukyxCb1GRA==} - dev: true - - /decode-uri-component@0.2.2: - resolution: {integrity: sha512-FqUYQ+8o158GyGTrMFJms9qh3CqTKvAqgqsTnkLI8sKu0028orqBhxNMFkFen0zGyg6epACD32pjVk58ngIErQ==} - engines: {node: '>=0.10'} - dev: true - - /decompress-response@3.3.0: - resolution: {integrity: sha512-BzRPQuY1ip+qDonAOz42gRm/pg9F768C+npV/4JOsxRC2sq+Rlk+Q4ZCAsOhnIaMrgarILY+RMUIvMmmX1qAEA==} - engines: {node: '>=4'} - dependencies: - mimic-response: 1.0.1 - dev: true - - /decompress-response@6.0.0: - resolution: {integrity: sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==} - engines: {node: '>=10'} - dependencies: - mimic-response: 3.1.0 - dev: true - - /deep-eql@4.1.3: - resolution: {integrity: sha512-WaEtAOpRA1MQ0eohqZjpGD8zdI0Ovsm8mmFhaDN8dvDZzyoUMcYDnf5Y6iu7HTXxf8JDS23qWa4a+hKCDyOPzw==} - engines: {node: '>=6'} - dependencies: - type-detect: 4.0.8 - dev: true - - /deep-extend@0.6.0: - resolution: {integrity: sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==} - engines: {node: '>=4.0.0'} - dev: true - - /deep-is@0.1.4: - resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} - dev: true - - /defer-to-connect@2.0.1: - resolution: {integrity: sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg==} - engines: {node: '>=10'} - dev: true - - /define-data-property@1.1.4: - resolution: {integrity: sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==} - engines: {node: '>= 0.4'} - dependencies: - es-define-property: 1.0.0 - es-errors: 1.3.0 - gopd: 1.0.1 - dev: true - - /delayed-stream@1.0.0: - resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==} - engines: {node: '>=0.4.0'} - dev: true - - /depd@2.0.0: - resolution: {integrity: sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==} - engines: {node: '>= 0.8'} - dev: true - - /destroy@1.2.0: - resolution: {integrity: sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==} - engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16} - dev: true - - /detect-indent@5.0.0: - resolution: {integrity: sha512-rlpvsxUtM0PQvy9iZe640/IWwWYyBsTApREbA1pHOpmOUIl9MkP/U4z7vTtg4Oaojvqhxt7sdufnT0EzGaR31g==} - engines: {node: '>=4'} - dev: true - - /diff@4.0.2: - resolution: {integrity: sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==} - engines: {node: '>=0.3.1'} - dev: true - - /diff@5.0.0: - resolution: {integrity: sha512-/VTCrvm5Z0JGty/BWHljh+BAiw3IK+2j87NGMu8Nwc/f48WoDAC395uomO9ZD117ZOBaHmkX1oyLvkVM/aIT3w==} - engines: {node: '>=0.3.1'} - dev: true - - /difflib@0.2.4: - resolution: {integrity: sha512-9YVwmMb0wQHQNr5J9m6BSj6fk4pfGITGQOOs+D9Fl+INODWFOfvhIU1hNv6GgR1RBoC/9NJcwu77zShxV0kT7w==} - dependencies: - heap: 0.2.7 - dev: true - - /dir-glob@3.0.1: - resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==} - engines: {node: '>=8'} - dependencies: - path-type: 4.0.0 - dev: true - - /dom-serializer@2.0.0: - resolution: {integrity: sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==} - dependencies: - domelementtype: 2.3.0 - domhandler: 5.0.3 - entities: 4.5.0 - dev: true - - /dom-walk@0.1.2: - resolution: {integrity: sha512-6QvTW9mrGeIegrFXdtQi9pk7O/nSK6lSdXW2eqUspN5LWD7UTji2Fqw5V2YLjBpHEoU9Xl/eUWNpDeZvoyOv2w==} - dev: true - - /domelementtype@2.3.0: - resolution: {integrity: sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==} - dev: true - - /domhandler@5.0.3: - resolution: {integrity: sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==} - engines: {node: '>= 4'} - dependencies: - domelementtype: 2.3.0 - dev: true - - /domutils@3.1.0: - resolution: {integrity: sha512-H78uMmQtI2AhgDJjWeQmHwJJ2bLPD3GMmO7Zja/ZZh84wkm+4ut+IUnUdRa8uCGX88DiVx1j6FRe1XfxEgjEZA==} - dependencies: - dom-serializer: 2.0.0 - domelementtype: 2.3.0 - domhandler: 5.0.3 - dev: true - - /dot-case@2.1.1: - resolution: {integrity: sha512-HnM6ZlFqcajLsyudHq7LeeLDr2rFAVYtDv/hV5qchQEidSck8j9OPUsXY9KwJv/lHMtYlX4DjRQqwFYa+0r8Ug==} - dependencies: - no-case: 2.3.2 - dev: true - - /duplexer@0.1.2: - resolution: {integrity: sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==} - dev: true - - /ecc-jsbn@0.1.2: - resolution: {integrity: sha512-eh9O+hwRHNbG4BLTjEl3nw044CkGm5X6LoaCf7LPp7UU8Qrt47JYNi6nPX8xjW97TKGKm1ouctg0QSpZe9qrnw==} - dependencies: - jsbn: 0.1.1 - safer-buffer: 2.1.2 - dev: true - - /ee-first@1.1.1: - resolution: {integrity: sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==} - dev: true - - /elliptic@6.5.4: - resolution: {integrity: sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ==} - dependencies: - bn.js: 4.12.0 - brorand: 1.1.0 - hash.js: 1.1.3 - hmac-drbg: 1.0.1 - inherits: 2.0.4 - minimalistic-assert: 1.0.1 - minimalistic-crypto-utils: 1.0.1 - dev: true - - /elliptic@6.5.5: - resolution: {integrity: sha512-7EjbcmUm17NQFu4Pmgmq2olYMj8nwMnpcddByChSUjArp8F5DQWcIcpriwO4ZToLNAJig0yiyjswfyGNje/ixw==} - dependencies: - bn.js: 4.12.0 - brorand: 1.1.0 - hash.js: 1.1.7 - hmac-drbg: 1.0.1 - inherits: 2.0.4 - minimalistic-assert: 1.0.1 - minimalistic-crypto-utils: 1.0.1 - dev: true - - /emoji-regex@8.0.0: - resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} - dev: true - - /encodeurl@1.0.2: - resolution: {integrity: sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==} - engines: {node: '>= 0.8'} - dev: true - - /end-of-stream@1.4.4: - resolution: {integrity: sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==} - dependencies: - once: 1.4.0 - dev: true - - /enquirer@2.4.1: - resolution: {integrity: sha512-rRqJg/6gd538VHvR3PSrdRBb/1Vy2YfzHqzvbhGIQpDRKIa4FgV/54b5Q1xYSxOOwKvjXweS26E0Q+nAMwp2pQ==} - engines: {node: '>=8.6'} - dependencies: - ansi-colors: 4.1.3 - strip-ansi: 6.0.1 - dev: true - - /entities@4.5.0: - resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==} - engines: {node: '>=0.12'} - dev: true - - /env-paths@2.2.1: - resolution: {integrity: sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==} - engines: {node: '>=6'} - dev: true - - /error-ex@1.3.2: - resolution: {integrity: sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==} - dependencies: - is-arrayish: 0.2.1 - dev: true - - /es-define-property@1.0.0: - resolution: {integrity: sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==} - engines: {node: '>= 0.4'} - dependencies: - get-intrinsic: 1.2.4 - dev: true - - /es-errors@1.3.0: - resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==} - engines: {node: '>= 0.4'} - dev: true - - /es5-ext@0.10.64: - resolution: {integrity: sha512-p2snDhiLaXe6dahss1LddxqEm+SkuDvV8dnIQG0MWjyHpcMNfXKPE+/Cc0y+PhxJX3A4xGNeFCj5oc0BUh6deg==} - engines: {node: '>=0.10'} - requiresBuild: true - dependencies: - es6-iterator: 2.0.3 - es6-symbol: 3.1.4 - esniff: 2.0.1 - next-tick: 1.1.0 - dev: true - - /es6-iterator@2.0.3: - resolution: {integrity: sha512-zw4SRzoUkd+cl+ZoE15A9o1oQd920Bb0iOJMQkQhl3jNc03YqVjAhG7scf9C5KWRU/R13Orf588uCC6525o02g==} - dependencies: - d: 1.0.2 - es5-ext: 0.10.64 - es6-symbol: 3.1.4 - dev: true - - /es6-promise@4.2.8: - resolution: {integrity: sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w==} - dev: true - - /es6-symbol@3.1.4: - resolution: {integrity: sha512-U9bFFjX8tFiATgtkJ1zg25+KviIXpgRvRHS8sau3GfhVzThRQrOeksPeT0BWW2MNZs1OEWJ1DPXOQMn0KKRkvg==} - engines: {node: '>=0.12'} - dependencies: - d: 1.0.2 - ext: 1.7.0 - dev: true - - /esbuild@0.19.12: - resolution: {integrity: sha512-aARqgq8roFBj054KvQr5f1sFu0D65G+miZRCuJyJ0G13Zwx7vRar5Zhn2tkQNzIXcBrNVsv/8stehpj+GAjgbg==} - engines: {node: '>=12'} - hasBin: true - requiresBuild: true - optionalDependencies: - '@esbuild/aix-ppc64': 0.19.12 - '@esbuild/android-arm': 0.19.12 - '@esbuild/android-arm64': 0.19.12 - '@esbuild/android-x64': 0.19.12 - '@esbuild/darwin-arm64': 0.19.12 - '@esbuild/darwin-x64': 0.19.12 - '@esbuild/freebsd-arm64': 0.19.12 - '@esbuild/freebsd-x64': 0.19.12 - '@esbuild/linux-arm': 0.19.12 - '@esbuild/linux-arm64': 0.19.12 - '@esbuild/linux-ia32': 0.19.12 - '@esbuild/linux-loong64': 0.19.12 - '@esbuild/linux-mips64el': 0.19.12 - '@esbuild/linux-ppc64': 0.19.12 - '@esbuild/linux-riscv64': 0.19.12 - '@esbuild/linux-s390x': 0.19.12 - '@esbuild/linux-x64': 0.19.12 - '@esbuild/netbsd-x64': 0.19.12 - '@esbuild/openbsd-x64': 0.19.12 - '@esbuild/sunos-x64': 0.19.12 - '@esbuild/win32-arm64': 0.19.12 - '@esbuild/win32-ia32': 0.19.12 - '@esbuild/win32-x64': 0.19.12 - dev: true - - /escalade@3.1.2: - resolution: {integrity: sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==} - engines: {node: '>=6'} - dev: true - - /escape-html@1.0.3: - resolution: {integrity: sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==} - dev: true - - /escape-string-regexp@1.0.5: - resolution: {integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==} - engines: {node: '>=0.8.0'} - dev: true - - /escape-string-regexp@4.0.0: - resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} - engines: {node: '>=10'} - dev: true - - /escodegen@1.8.1: - resolution: {integrity: sha512-yhi5S+mNTOuRvyW4gWlg5W1byMaQGWWSYHXsuFZ7GBo7tpyOwi2EdzMP/QWxh9hwkD2m+wDVHJsxhRIj+v/b/A==} - engines: {node: '>=0.12.0'} - hasBin: true - dependencies: - esprima: 2.7.3 - estraverse: 1.9.3 - esutils: 2.0.3 - optionator: 0.8.3 - optionalDependencies: - source-map: 0.2.0 - dev: true - - /esniff@2.0.1: - resolution: {integrity: sha512-kTUIGKQ/mDPFoJ0oVfcmyJn4iBDRptjNVIzwIFR7tqWXdVI9xfA2RMwY/gbSpJG3lkdWNEjLap/NqVHZiJsdfg==} - engines: {node: '>=0.10'} - dependencies: - d: 1.0.2 - es5-ext: 0.10.64 - event-emitter: 0.3.5 - type: 2.7.2 - dev: true - - /esprima@2.7.3: - resolution: {integrity: sha512-OarPfz0lFCiW4/AV2Oy1Rp9qu0iusTKqykwTspGCZtPxmF81JR4MmIebvF1F9+UOKth2ZubLQ4XGGaU+hSn99A==} - engines: {node: '>=0.10.0'} - hasBin: true - dev: true - - /esprima@4.0.1: - resolution: {integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==} - engines: {node: '>=4'} - hasBin: true - dev: true - - /estraverse@1.9.3: - resolution: {integrity: sha512-25w1fMXQrGdoquWnScXZGckOv+Wes+JDnuN/+7ex3SauFRS72r2lFDec0EKPt2YD1wUJ/IrfEex+9yp4hfSOJA==} - engines: {node: '>=0.10.0'} - dev: true - - /esutils@2.0.3: - resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} - engines: {node: '>=0.10.0'} - dev: true - - /etag@1.8.1: - resolution: {integrity: sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==} - engines: {node: '>= 0.6'} - dev: true - - /eth-ens-namehash@2.0.8: - resolution: {integrity: sha512-VWEI1+KJfz4Km//dadyvBBoBeSQ0MHTXPvr8UIXiLW6IanxvAV+DmlZAijZwAyggqGUfwQBeHf7tc9wzc1piSw==} - dependencies: - idna-uts46-hx: 2.3.1 - js-sha3: 0.5.7 - dev: true - - /eth-gas-reporter@0.2.27: - resolution: {integrity: sha512-femhvoAM7wL0GcI8ozTdxfuBtBFJ9qsyIAsmKVjlWAHUbdnnXHt+lKzz/kmldM5lA9jLuNHGwuIxorNpLbR1Zw==} - peerDependencies: - '@codechecks/client': ^0.1.0 - peerDependenciesMeta: - '@codechecks/client': - optional: true - dependencies: - '@solidity-parser/parser': 0.14.5 - axios: 1.6.7 - cli-table3: 0.5.1 - colors: 1.4.0 - ethereum-cryptography: 1.2.0 - ethers: 5.7.2 - fs-readdir-recursive: 1.1.0 - lodash: 4.17.21 - markdown-table: 1.1.3 - mocha: 10.3.0 - req-cwd: 2.0.0 - sha1: 1.1.1 - sync-request: 6.1.0 - transitivePeerDependencies: - - bufferutil - - debug - - utf-8-validate - dev: true - - /eth-lib@0.1.29: - resolution: {integrity: sha512-bfttrr3/7gG4E02HoWTDUcDDslN003OlOoBxk9virpAZQ1ja/jDgwkWB8QfJF7ojuEowrqy+lzp9VcJG7/k5bQ==} - dependencies: - bn.js: 4.12.0 - elliptic: 6.5.5 - nano-json-stream-parser: 0.1.2 - servify: 0.1.12 - ws: 3.3.3 - xhr-request-promise: 0.1.3 - transitivePeerDependencies: - - bufferutil - - supports-color - - utf-8-validate - dev: true - - /eth-lib@0.2.8: - resolution: {integrity: sha512-ArJ7x1WcWOlSpzdoTBX8vkwlkSQ85CjjifSZtV4co64vWxSV8geWfPI9x4SVYu3DSxnX4yWFVTtGL+j9DUFLNw==} - dependencies: - bn.js: 4.12.0 - elliptic: 6.5.5 - xhr-request-promise: 0.1.3 - dev: true - - /ethereum-bloom-filters@1.0.10: - resolution: {integrity: sha512-rxJ5OFN3RwjQxDcFP2Z5+Q9ho4eIdEmSc2ht0fCu8Se9nbXjZ7/031uXoUYJ87KHCOdVeiUuwSnoS7hmYAGVHA==} - dependencies: - js-sha3: 0.8.0 - dev: true - - /ethereum-cryptography@0.1.3: - resolution: {integrity: sha512-w8/4x1SGGzc+tO97TASLja6SLd3fRIK2tLVcV2Gx4IB21hE19atll5Cq9o3d0ZmAYC/8aw0ipieTSiekAea4SQ==} - dependencies: - '@types/pbkdf2': 3.1.2 - '@types/secp256k1': 4.0.6 - blakejs: 1.2.1 - browserify-aes: 1.2.0 - bs58check: 2.1.2 - create-hash: 1.2.0 - create-hmac: 1.1.7 - hash.js: 1.1.7 - keccak: 3.0.4 - pbkdf2: 3.1.2 - randombytes: 2.1.0 - safe-buffer: 5.2.1 - scrypt-js: 3.0.1 - secp256k1: 4.0.3 - setimmediate: 1.0.5 - dev: true - - /ethereum-cryptography@1.2.0: - resolution: {integrity: sha512-6yFQC9b5ug6/17CQpCyE3k9eKBMdhyVjzUy1WkiuY/E4vj/SXDBbCw8QEIaXqf0Mf2SnY6RmpDcwlUmBSS0EJw==} - dependencies: - '@noble/hashes': 1.2.0 - '@noble/secp256k1': 1.7.1 - '@scure/bip32': 1.1.5 - '@scure/bip39': 1.1.1 - dev: true - - /ethereum-cryptography@2.1.3: - resolution: {integrity: sha512-BlwbIL7/P45W8FGW2r7LGuvoEZ+7PWsniMvQ4p5s2xCyw9tmaDlpfsN9HjAucbF+t/qpVHwZUisgfK24TCW8aA==} - dependencies: - '@noble/curves': 1.3.0 - '@noble/hashes': 1.3.3 - '@scure/bip32': 1.3.3 - '@scure/bip39': 1.2.2 - dev: true - - /ethereum-ens@0.8.0: - resolution: {integrity: sha512-a8cBTF4AWw1Q1Y37V1LSCS9pRY4Mh3f8vCg5cbXCCEJ3eno1hbI/+Ccv9SZLISYpqQhaglP3Bxb/34lS4Qf7Bg==} - dependencies: - bluebird: 3.7.2 - eth-ens-namehash: 2.0.8 - js-sha3: 0.5.7 - pako: 1.0.11 - underscore: 1.13.6 - web3: 1.10.4 - transitivePeerDependencies: - - bufferutil - - encoding - - supports-color - - utf-8-validate - dev: true - - /ethereumjs-abi@0.6.8: - resolution: {integrity: sha512-Tx0r/iXI6r+lRsdvkFDlut0N08jWMnKRZ6Gkq+Nmw75lZe4e6o3EkSnkaBP5NF6+m5PTGAr9JP43N3LyeoglsA==} - dependencies: - bn.js: 4.12.0 - ethereumjs-util: 6.2.1 - dev: true - - /ethereumjs-util@6.2.1: - resolution: {integrity: sha512-W2Ktez4L01Vexijrm5EB6w7dg4n/TgpoYU4avuT5T3Vmnw/eCRtiBrJfQYS/DCSvDIOLn2k57GcHdeBcgVxAqw==} - dependencies: - '@types/bn.js': 4.11.6 - bn.js: 4.12.0 - create-hash: 1.2.0 - elliptic: 6.5.5 - ethereum-cryptography: 0.1.3 - ethjs-util: 0.1.6 - rlp: 2.2.7 - dev: true - - /ethereumjs-util@7.1.5: - resolution: {integrity: sha512-SDl5kKrQAudFBUe5OJM9Ac6WmMyYmXX/6sTmLZ3ffG2eY6ZIGBes3pEDxNN6V72WyOw4CPD5RomKdsa8DAAwLg==} - engines: {node: '>=10.0.0'} - dependencies: - '@types/bn.js': 5.1.5 - bn.js: 5.2.1 - create-hash: 1.2.0 - ethereum-cryptography: 0.1.3 - rlp: 2.2.7 - dev: true - - /ethers@4.0.49: - resolution: {integrity: sha512-kPltTvWiyu+OktYy1IStSO16i2e7cS9D9OxZ81q2UUaiNPVrm/RTcbxamCXF9VUSKzJIdJV68EAIhTEVBalRWg==} - dependencies: - aes-js: 3.0.0 - bn.js: 4.12.0 - elliptic: 6.5.4 - hash.js: 1.1.3 - js-sha3: 0.5.7 - scrypt-js: 2.0.4 - setimmediate: 1.0.4 - uuid: 2.0.1 - xmlhttprequest: 1.8.0 - dev: true - - /ethers@5.7.2: - resolution: {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 - transitivePeerDependencies: - - bufferutil - - utf-8-validate - dev: true - - /ethjs-abi@0.2.1: - resolution: {integrity: sha512-g2AULSDYI6nEJyJaEVEXtTimRY2aPC2fi7ddSy0W+LXvEVL8Fe1y76o43ecbgdUKwZD+xsmEgX1yJr1Ia3r1IA==} - engines: {node: '>=6.5.0', npm: '>=3'} - dependencies: - bn.js: 4.11.6 - js-sha3: 0.5.5 - number-to-bn: 1.7.0 - dev: true - - /ethjs-unit@0.1.6: - resolution: {integrity: sha512-/Sn9Y0oKl0uqQuvgFk/zQgR7aw1g36qX/jzSQ5lSwlO0GigPymk4eGQfeNTD03w1dPOqfz8V77Cy43jH56pagw==} - engines: {node: '>=6.5.0', npm: '>=3'} - dependencies: - bn.js: 4.11.6 - number-to-bn: 1.7.0 - dev: true - - /ethjs-util@0.1.6: - resolution: {integrity: sha512-CUnVOQq7gSpDHZVVrQW8ExxUETWrnrvXYvYz55wOU8Uj4VCgw56XC2B/fVqQN+f7gmrnRHSLVnFAwsCuNwji8w==} - engines: {node: '>=6.5.0', npm: '>=3'} - dependencies: - is-hex-prefixed: 1.0.0 - strip-hex-prefix: 1.0.0 - dev: true - - /event-emitter@0.3.5: - resolution: {integrity: sha512-D9rRn9y7kLPnJ+hMq7S/nhvoKwwvVJahBi2BPmx3bvbsEdK3W9ii8cBSGjP+72/LnM4n6fo3+dkCX5FeTQruXA==} - dependencies: - d: 1.0.2 - es5-ext: 0.10.64 - dev: true - - /event-stream@3.3.4: - resolution: {integrity: sha512-QHpkERcGsR0T7Qm3HNJSyXKEEj8AHNxkY3PK8TS2KJvQ7NiSHe3DDpwVKKtoYprL/AreyzFBeIkBIWChAqn60g==} - dependencies: - duplexer: 0.1.2 - from: 0.1.7 - map-stream: 0.1.0 - pause-stream: 0.0.11 - split: 0.3.3 - stream-combiner: 0.0.4 - through: 2.3.8 - dev: true - - /eventemitter3@4.0.4: - resolution: {integrity: sha512-rlaVLnVxtxvoyLsQQFBx53YmXHDxRIzzTLbdfxqi4yocpSjAxXwkU0cScM5JgSKMqEhrZpnvQ2D9gjylR0AimQ==} - dev: true - - /evp_bytestokey@1.0.3: - resolution: {integrity: sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==} - dependencies: - md5.js: 1.3.5 - safe-buffer: 5.2.1 - dev: true - - /express@4.18.3: - resolution: {integrity: sha512-6VyCijWQ+9O7WuVMTRBTl+cjNNIzD5cY5mQ1WM8r/LEkI2u8EYpOotESNwzNlyCn3g+dmjKYI6BmNneSr/FSRw==} - engines: {node: '>= 0.10.0'} - dependencies: - accepts: 1.3.8 - array-flatten: 1.1.1 - body-parser: 1.20.2 - content-disposition: 0.5.4 - content-type: 1.0.5 - cookie: 0.5.0 - cookie-signature: 1.0.6 - debug: 2.6.9 - depd: 2.0.0 - encodeurl: 1.0.2 - escape-html: 1.0.3 - etag: 1.8.1 - finalhandler: 1.2.0 - fresh: 0.5.2 - http-errors: 2.0.0 - merge-descriptors: 1.0.1 - methods: 1.1.2 - on-finished: 2.4.1 - parseurl: 1.3.3 - path-to-regexp: 0.1.7 - proxy-addr: 2.0.7 - qs: 6.11.0 - range-parser: 1.2.1 - safe-buffer: 5.2.1 - send: 0.18.0 - serve-static: 1.15.0 - setprototypeof: 1.2.0 - statuses: 2.0.1 - type-is: 1.6.18 - utils-merge: 1.0.1 - vary: 1.1.2 - transitivePeerDependencies: - - supports-color - dev: true - - /ext@1.7.0: - resolution: {integrity: sha512-6hxeJYaL110a9b5TEJSj0gojyHQAmA2ch5Os+ySCiA1QGdS697XWY1pzsrSjqA9LDEEgdB/KypIlR59RcLuHYw==} - dependencies: - type: 2.7.2 - dev: true - - /extend@3.0.2: - resolution: {integrity: sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==} - dev: true - - /extsprintf@1.3.0: - resolution: {integrity: sha512-11Ndz7Nv+mvAC1j0ktTa7fAb0vLyGGX+rMHNBYQviQDGU0Hw7lhctJANqbPhu9nV9/izT/IntTgZ7Im/9LJs9g==} - engines: {'0': node >=0.6.0} - dev: true - - /fast-check@3.1.1: - resolution: {integrity: sha512-3vtXinVyuUKCKFKYcwXhGE6NtGWkqF8Yh3rvMZNzmwz8EPrgoc/v4pDdLHyLnCyCI5MZpZZkDEwFyXyEONOxpA==} - engines: {node: '>=8.0.0'} - dependencies: - pure-rand: 5.0.5 - dev: true - - /fast-deep-equal@3.1.3: - resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} - dev: true - - /fast-glob@3.3.2: - resolution: {integrity: sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==} - engines: {node: '>=8.6.0'} - dependencies: - '@nodelib/fs.stat': 2.0.5 - '@nodelib/fs.walk': 1.2.8 - glob-parent: 5.1.2 - merge2: 1.4.1 - micromatch: 4.0.5 - dev: true - - /fast-json-stable-stringify@2.1.0: - resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} - dev: true - - /fast-levenshtein@2.0.6: - resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} - dev: true - - /fastq@1.17.1: - resolution: {integrity: sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==} - dependencies: - reusify: 1.0.4 - dev: true - - /fetch-blob@3.2.0: - resolution: {integrity: sha512-7yAQpD2UMJzLi1Dqv7qFYnPbaPx7ZfFK6PiIxQ4PfkGPyNyl2Ugx+a/umUonmKqjhM4DnfbMvdX6otXq83soQQ==} - engines: {node: ^12.20 || >= 14.13} - dependencies: - node-domexception: 1.0.0 - web-streams-polyfill: 3.3.3 - dev: true - - /fill-range@7.0.1: - resolution: {integrity: sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==} - engines: {node: '>=8'} - dependencies: - to-regex-range: 5.0.1 - dev: true - - /finalhandler@1.2.0: - resolution: {integrity: sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==} - engines: {node: '>= 0.8'} - dependencies: - debug: 2.6.9 - encodeurl: 1.0.2 - escape-html: 1.0.3 - on-finished: 2.4.1 - parseurl: 1.3.3 - statuses: 2.0.1 - unpipe: 1.0.0 - transitivePeerDependencies: - - supports-color - dev: true - - /find-replace@3.0.0: - resolution: {integrity: sha512-6Tb2myMioCAgv5kfvP5/PkZZ/ntTpVK39fHY7WkWBgvbeE+VHd/tZuZ4mrC+bxh4cfOZeYKVPaJIZtZXV7GNCQ==} - engines: {node: '>=4.0.0'} - dependencies: - array-back: 3.1.0 - dev: true - - /find-up@1.1.2: - resolution: {integrity: sha512-jvElSjyuo4EMQGoTwo1uJU5pQMwTW5lS1x05zzfJuTIyLR3zwO27LYrxNg+dlvKpGOuGy/MzBdXh80g0ve5+HA==} - engines: {node: '>=0.10.0'} - dependencies: - path-exists: 2.1.0 - pinkie-promise: 2.0.1 - dev: true - - /find-up@2.1.0: - resolution: {integrity: sha512-NWzkk0jSJtTt08+FBFMvXoeZnOJD+jTtsRmBYbAIzJdX6l7dLgR7CTubCM5/eDdPUBvLCeVasP1brfVR/9/EZQ==} - engines: {node: '>=4'} - dependencies: - locate-path: 2.0.0 - dev: true - - /find-up@4.1.0: - resolution: {integrity: sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==} - engines: {node: '>=8'} - dependencies: - locate-path: 5.0.0 - path-exists: 4.0.0 - dev: true - - /find-up@5.0.0: - resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} - engines: {node: '>=10'} - dependencies: - locate-path: 6.0.0 - path-exists: 4.0.0 - dev: true - - /flat@5.0.2: - resolution: {integrity: sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==} - hasBin: true - dev: true - - /follow-redirects@1.15.5(debug@4.3.4): - resolution: {integrity: sha512-vSFWUON1B+yAw1VN4xMfxgn5fTUiaOzAJCKBwIIgT/+7CuGy9+r+5gITvP62j3RmaD5Ph65UaERdOSRGUzZtgw==} - engines: {node: '>=4.0'} - peerDependencies: - debug: '*' - peerDependenciesMeta: - debug: - optional: true - dependencies: - debug: 4.3.4(supports-color@8.1.1) - dev: true - - /for-each@0.3.3: - resolution: {integrity: sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==} - dependencies: - is-callable: 1.2.7 - dev: true - - /forever-agent@0.6.1: - resolution: {integrity: sha512-j0KLYPhm6zeac4lz3oJ3o65qvgQCcPubiyotZrXqEaG4hNagNYO8qdlUrX5vwqv9ohqeT/Z3j6+yW067yWWdUw==} - dev: true - - /form-data-encoder@1.7.1: - resolution: {integrity: sha512-EFRDrsMm/kyqbTQocNvRXMLjc7Es2Vk+IQFx/YW7hkUH1eBl4J1fqiP34l74Yt0pFLCNpc06fkbVk00008mzjg==} - dev: true - - /form-data@2.3.3: - resolution: {integrity: sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==} - engines: {node: '>= 0.12'} - dependencies: - asynckit: 0.4.0 - combined-stream: 1.0.8 - mime-types: 2.1.35 - dev: true - - /form-data@2.5.1: - resolution: {integrity: sha512-m21N3WOmEEURgk6B9GLOE4RuWOFf28Lhh9qGYeNlGq4VDXUlJy2th2slBNU8Gp8EzloYZOibZJ7t5ecIrFSjVA==} - engines: {node: '>= 0.12'} - dependencies: - asynckit: 0.4.0 - combined-stream: 1.0.8 - mime-types: 2.1.35 - dev: true - - /form-data@4.0.0: - resolution: {integrity: sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==} - engines: {node: '>= 6'} - dependencies: - asynckit: 0.4.0 - combined-stream: 1.0.8 - mime-types: 2.1.35 - dev: true - - /formdata-polyfill@4.0.10: - resolution: {integrity: sha512-buewHzMvYL29jdeQTVILecSaZKnt/RJWjoZCF5OW60Z67/GmSLBkOFM7qh1PI3zFNtJbaZL5eQu1vLfazOwj4g==} - engines: {node: '>=12.20.0'} - dependencies: - fetch-blob: 3.2.0 - dev: true - - /forwarded@0.2.0: - resolution: {integrity: sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==} - engines: {node: '>= 0.6'} - dev: true - - /fp-ts@1.19.3: - resolution: {integrity: sha512-H5KQDspykdHuztLTg+ajGN0Z2qUjcEf3Ybxc6hLt0k7/zPkn29XnKnxlBPyW2XIddWrGaJBzBl4VLYOtk39yZg==} - dev: true - - /fresh@0.5.2: - resolution: {integrity: sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==} - engines: {node: '>= 0.6'} - dev: true - - /from@0.1.7: - resolution: {integrity: sha512-twe20eF1OxVxp/ML/kq2p1uc6KvFK/+vs8WjEbeKmV2He22MKm7YF2ANIt+EOqhJ5L3K/SuuPhk0hWQDjOM23g==} - dev: true - - /fs-extra@0.30.0: - resolution: {integrity: sha512-UvSPKyhMn6LEd/WpUaV9C9t3zATuqoqfWc3QdPhPLb58prN9tqYPlPWi8Krxi44loBoUzlobqZ3+8tGpxxSzwA==} - dependencies: - graceful-fs: 4.2.11 - jsonfile: 2.4.0 - klaw: 1.3.1 - path-is-absolute: 1.0.1 - rimraf: 2.7.1 - dev: true - - /fs-extra@11.2.0: - resolution: {integrity: sha512-PmDi3uwK5nFuXh7XDTlVnS17xJS7vW36is2+w3xcv8SVxiB4NyATf4ctkVY5bkSjX0Y4nbvZCq1/EjtEyr9ktw==} - engines: {node: '>=14.14'} - dependencies: - graceful-fs: 4.2.11 - jsonfile: 6.1.0 - universalify: 2.0.1 - dev: true - - /fs-extra@4.0.3: - resolution: {integrity: sha512-q6rbdDd1o2mAnQreO7YADIxf/Whx4AHBiRf6d+/cVT8h44ss+lHgxf1FemcqDnQt9X3ct4McHr+JMGlYSsK7Cg==} - dependencies: - graceful-fs: 4.2.11 - jsonfile: 4.0.0 - universalify: 0.1.2 - dev: true - - /fs-extra@7.0.1: - resolution: {integrity: sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==} - engines: {node: '>=6 <7 || >=8'} - dependencies: - graceful-fs: 4.2.11 - jsonfile: 4.0.0 - universalify: 0.1.2 - dev: true - - /fs-extra@8.1.0: - resolution: {integrity: sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==} - engines: {node: '>=6 <7 || >=8'} - dependencies: - graceful-fs: 4.2.11 - jsonfile: 4.0.0 - universalify: 0.1.2 - dev: true - - /fs-extra@9.1.0: - resolution: {integrity: sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==} - engines: {node: '>=10'} - dependencies: - at-least-node: 1.0.0 - graceful-fs: 4.2.11 - jsonfile: 6.1.0 - universalify: 2.0.1 - dev: true - - /fs-minipass@1.2.7: - resolution: {integrity: sha512-GWSSJGFy4e9GUeCcbIkED+bgAoFyj7XF1mV8rma3QW4NIqX9Kyx79N/PF61H5udOV3aY1IaMLs6pGbH71nlCTA==} - dependencies: - minipass: 2.9.0 - dev: true - - /fs-readdir-recursive@1.1.0: - resolution: {integrity: sha512-GNanXlVr2pf02+sPN40XN8HG+ePaNcvM0q5mZBd668Obwb0yD5GiUbZOFgwn8kGMY6I3mdyDJzieUy3PTYyTRA==} - dev: true - - /fs.realpath@1.0.0: - resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} - dev: true - - /fsevents@2.3.3: - resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} - engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} - os: [darwin] - requiresBuild: true - dev: true - optional: true - - /function-bind@1.1.2: - resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} - dev: true - - /fx@34.0.0: - resolution: {integrity: sha512-/fZih3/WLsrtlaj2mahjWxAmyuikmcl3D5kKPqLtFmEilLsy9wp0+/vEmfvYXXhwJc+ajtCFDCf+yttXmPMHSQ==} - hasBin: true - dev: true - - /get-caller-file@1.0.3: - resolution: {integrity: sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w==} - dev: true - - /get-caller-file@2.0.5: - resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} - engines: {node: 6.* || 8.* || >= 10.*} - dev: true - - /get-func-name@2.0.2: - resolution: {integrity: sha512-8vXOvuE167CtIc3OyItco7N/dpRtBbYOsPsXCz7X/PMnlGjYjSGuZJgM1Y7mmew7BKf9BqvLX2tnOVy1BBUsxQ==} - dev: true - - /get-intrinsic@1.2.4: - resolution: {integrity: sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==} - engines: {node: '>= 0.4'} - dependencies: - es-errors: 1.3.0 - function-bind: 1.1.2 - has-proto: 1.0.3 - has-symbols: 1.0.3 - hasown: 2.0.2 - dev: true - - /get-port@3.2.0: - resolution: {integrity: sha512-x5UJKlgeUiNT8nyo/AcnwLnZuZNcSjSw0kogRB+Whd1fjjFq4B1hySFxSFWWSn4mIBzg3sRNUDFYc4g5gjPoLg==} - engines: {node: '>=4'} - dev: true - - /get-stream@5.2.0: - resolution: {integrity: sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==} - engines: {node: '>=8'} - dependencies: - pump: 3.0.0 - dev: true - - /get-stream@6.0.1: - resolution: {integrity: sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==} - engines: {node: '>=10'} - dev: true - - /get-tsconfig@4.7.3: - resolution: {integrity: sha512-ZvkrzoUA0PQZM6fy6+/Hce561s+faD1rsNwhnO5FelNjyy7EMGJ3Rz1AQ8GYDWjhRs/7dBLOEJvhK8MiEJOAFg==} - dependencies: - resolve-pkg-maps: 1.0.0 - dev: true - - /getpass@0.1.7: - resolution: {integrity: sha512-0fzj9JxOLfJ+XGLhR8ze3unN0KZCgZwiSSDz168VERjK8Wl8kVSdcu2kspd4s4wtAa1y/qrVRiAA0WclVsu0ng==} - dependencies: - assert-plus: 1.0.0 - dev: true - - /ghost-testrpc@0.0.2: - resolution: {integrity: sha512-i08dAEgJ2g8z5buJIrCTduwPIhih3DP+hOCTyyryikfV8T0bNvHnGXO67i0DD1H4GBDETTclPy9njZbfluQYrQ==} - hasBin: true - dependencies: - chalk: 2.4.2 - node-emoji: 1.11.0 - dev: true - - /glob-parent@5.1.2: - resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} - engines: {node: '>= 6'} - dependencies: - is-glob: 4.0.3 - dev: true - - /glob@5.0.15: - resolution: {integrity: sha512-c9IPMazfRITpmAAKi22dK1VKxGDX9ehhqfABDriL/lzO92xcUKEJPQHrVA/2YHSNFB4iFlykVmWvwo48nr3OxA==} - dependencies: - inflight: 1.0.6 - inherits: 2.0.4 - minimatch: 3.1.2 - once: 1.4.0 - path-is-absolute: 1.0.1 - dev: true - - /glob@7.1.7: - resolution: {integrity: sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ==} - dependencies: - fs.realpath: 1.0.0 - inflight: 1.0.6 - inherits: 2.0.4 - minimatch: 3.1.2 - once: 1.4.0 - path-is-absolute: 1.0.1 - dev: true - - /glob@7.2.0: - resolution: {integrity: sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==} - dependencies: - fs.realpath: 1.0.0 - inflight: 1.0.6 - inherits: 2.0.4 - minimatch: 3.1.2 - once: 1.4.0 - path-is-absolute: 1.0.1 - dev: true - - /glob@7.2.3: - resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} - dependencies: - fs.realpath: 1.0.0 - inflight: 1.0.6 - inherits: 2.0.4 - minimatch: 3.1.2 - once: 1.4.0 - path-is-absolute: 1.0.1 - dev: true - - /glob@8.1.0: - resolution: {integrity: sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==} - engines: {node: '>=12'} - dependencies: - fs.realpath: 1.0.0 - inflight: 1.0.6 - inherits: 2.0.4 - minimatch: 5.0.1 - once: 1.4.0 - dev: true - - /global-modules@2.0.0: - resolution: {integrity: sha512-NGbfmJBp9x8IxyJSd1P+otYK8vonoJactOogrVfFRIAEY1ukil8RSKDz2Yo7wh1oihl51l/r6W4epkeKJHqL8A==} - engines: {node: '>=6'} - dependencies: - global-prefix: 3.0.0 - dev: true - - /global-prefix@3.0.0: - resolution: {integrity: sha512-awConJSVCHVGND6x3tmMaKcQvwXLhjdkmomy2W+Goaui8YPgYgXJZewhg3fWC+DlfqqQuWg8AwqjGTD2nAPVWg==} - engines: {node: '>=6'} - dependencies: - ini: 1.3.8 - kind-of: 6.0.3 - which: 1.3.1 - dev: true - - /global@4.4.0: - resolution: {integrity: sha512-wv/LAoHdRE3BeTGz53FAamhGlPLhlssK45usmGFThIi4XqnBmjKQ16u+RNbP7WvigRZDxUsM0J3gcQ5yicaL0w==} - dependencies: - min-document: 2.19.0 - process: 0.11.10 - dev: true - - /globby@10.0.2: - resolution: {integrity: sha512-7dUi7RvCoT/xast/o/dLN53oqND4yk0nsHkhRgn9w65C4PofCLOoJ39iSOg+qVDdWQPIEj+eszMHQ+aLVwwQSg==} - engines: {node: '>=8'} - dependencies: - '@types/glob': 7.2.0 - array-union: 2.1.0 - dir-glob: 3.0.1 - fast-glob: 3.3.2 - glob: 7.2.3 - ignore: 5.3.1 - merge2: 1.4.1 - slash: 3.0.0 - dev: true - - /globby@13.2.2: - resolution: {integrity: sha512-Y1zNGV+pzQdh7H39l9zgB4PJqjRNqydvdYCDG4HFXM4XuvSaQQlEc91IU1yALL8gUTDomgBAfz3XJdmUS+oo0w==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - dependencies: - dir-glob: 3.0.1 - fast-glob: 3.3.2 - ignore: 5.3.1 - merge2: 1.4.1 - slash: 4.0.0 - dev: true - - /gopd@1.0.1: - resolution: {integrity: sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==} - dependencies: - get-intrinsic: 1.2.4 - dev: true - - /got@11.8.6: - resolution: {integrity: sha512-6tfZ91bOr7bOXnK7PRDCGBLa1H4U080YHNaAQ2KsMGlLEzRbk44nsZF2E1IeRc3vtJHPVbKCYgdFbaGO2ljd8g==} - engines: {node: '>=10.19.0'} - dependencies: - '@sindresorhus/is': 4.6.0 - '@szmarczak/http-timer': 4.0.6 - '@types/cacheable-request': 6.0.3 - '@types/responselike': 1.0.3 - cacheable-lookup: 5.0.4 - cacheable-request: 7.0.4 - decompress-response: 6.0.0 - http2-wrapper: 1.0.3 - lowercase-keys: 2.0.0 - p-cancelable: 2.1.1 - responselike: 2.0.1 - dev: true - - /got@12.1.0: - resolution: {integrity: sha512-hBv2ty9QN2RdbJJMK3hesmSkFTjVIHyIDDbssCKnSmq62edGgImJWD10Eb1k77TiV1bxloxqcFAVK8+9pkhOig==} - engines: {node: '>=14.16'} - dependencies: - '@sindresorhus/is': 4.6.0 - '@szmarczak/http-timer': 5.0.1 - '@types/cacheable-request': 6.0.3 - '@types/responselike': 1.0.3 - cacheable-lookup: 6.1.0 - cacheable-request: 7.0.4 - decompress-response: 6.0.0 - form-data-encoder: 1.7.1 - get-stream: 6.0.1 - http2-wrapper: 2.2.1 - lowercase-keys: 3.0.0 - p-cancelable: 3.0.0 - responselike: 2.0.1 - dev: true - - /graceful-fs@4.2.11: - resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} - dev: true - - /handlebars@4.7.8: - resolution: {integrity: sha512-vafaFqs8MZkRrSX7sFVUdo3ap/eNiLnb4IakshzvP56X5Nr1iGKAIqdX6tMlm6HcNRIkr6AxO5jFEoJzzpT8aQ==} - engines: {node: '>=0.4.7'} - hasBin: true - dependencies: - minimist: 1.2.8 - neo-async: 2.6.2 - source-map: 0.6.1 - wordwrap: 1.0.0 - optionalDependencies: - uglify-js: 3.17.4 - dev: true - - /har-schema@2.0.0: - resolution: {integrity: sha512-Oqluz6zhGX8cyRaTQlFMPw80bSJVG2x/cFb8ZPhUILGgHka9SsokCCOQgpveePerqidZOrT14ipqfJb7ILcW5Q==} - engines: {node: '>=4'} - dev: true - - /har-validator@5.1.5: - resolution: {integrity: sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w==} - engines: {node: '>=6'} - deprecated: this library is no longer supported - dependencies: - ajv: 6.12.6 - har-schema: 2.0.0 - dev: true - - /hardhat-gas-reporter@1.0.10(hardhat@2.21.0): - resolution: {integrity: sha512-02N4+So/fZrzJ88ci54GqwVA3Zrf0C9duuTyGt0CFRIh/CdNwbnTgkXkRfojOMLBQ+6t+lBIkgbsOtqMvNwikA==} - peerDependencies: - hardhat: ^2.0.2 - dependencies: - array-uniq: 1.0.3 - eth-gas-reporter: 0.2.27 - hardhat: 2.21.0(ts-node@10.9.2)(typescript@5.4.2) - sha1: 1.1.1 - transitivePeerDependencies: - - '@codechecks/client' - - bufferutil - - debug - - utf-8-validate - dev: true - - /hardhat@2.21.0(ts-node@10.9.2)(typescript@5.4.2): - resolution: {integrity: sha512-8DlJAVJDEVHaV1sh9FLuKLLgCFv9EAJ+M+8IbjSIPgoeNo3ss5L1HgGBMfnI88c7OzMEZkdcuyGoobFeK3Orqw==} - hasBin: true - peerDependencies: - ts-node: '*' - typescript: '*' - peerDependenciesMeta: - ts-node: - optional: true - typescript: - optional: true - dependencies: - '@ethersproject/abi': 5.7.0 - '@metamask/eth-sig-util': 4.0.1 - '@nomicfoundation/edr': 0.2.1 - '@nomicfoundation/ethereumjs-common': 4.0.4 - '@nomicfoundation/ethereumjs-tx': 5.0.4 - '@nomicfoundation/ethereumjs-util': 9.0.4 - '@nomicfoundation/solidity-analyzer': 0.1.1 - '@sentry/node': 5.30.0 - '@types/bn.js': 5.1.5 - '@types/lru-cache': 5.1.1 - adm-zip: 0.4.16 - aggregate-error: 3.1.0 - ansi-escapes: 4.3.2 - boxen: 5.1.2 - chalk: 2.4.2 - chokidar: 3.6.0 - ci-info: 2.0.0 - debug: 4.3.4(supports-color@8.1.1) - enquirer: 2.4.1 - env-paths: 2.2.1 - ethereum-cryptography: 1.2.0 - ethereumjs-abi: 0.6.8 - find-up: 2.1.0 - fp-ts: 1.19.3 - fs-extra: 7.0.1 - glob: 7.2.0 - immutable: 4.3.5 - io-ts: 1.10.4 - keccak: 3.0.4 - lodash: 4.17.21 - mnemonist: 0.38.5 - mocha: 10.3.0 - p-map: 4.0.0 - raw-body: 2.5.2 - resolve: 1.17.0 - semver: 6.3.1 - solc: 0.7.3(debug@4.3.4) - source-map-support: 0.5.21 - stacktrace-parser: 0.1.10 - ts-node: 10.9.2(@types/node@20.11.26)(typescript@5.4.2) - tsort: 0.0.1 - typescript: 5.4.2 - undici: 5.28.3 - uuid: 8.3.2 - ws: 7.5.9 - transitivePeerDependencies: - - bufferutil - - c-kzg - - supports-color - - utf-8-validate - dev: true - - /has-flag@1.0.0: - resolution: {integrity: sha512-DyYHfIYwAJmjAjSSPKANxI8bFY9YtFrgkAfinBojQ8YJTOuOuav64tMUJv584SES4xl74PmuaevIyaLESHdTAA==} - engines: {node: '>=0.10.0'} - dev: true - - /has-flag@3.0.0: - resolution: {integrity: sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==} - engines: {node: '>=4'} - dev: true - - /has-flag@4.0.0: - resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} - engines: {node: '>=8'} - dev: true - - /has-property-descriptors@1.0.2: - resolution: {integrity: sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==} - dependencies: - es-define-property: 1.0.0 - dev: true - - /has-proto@1.0.3: - resolution: {integrity: sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==} - engines: {node: '>= 0.4'} - dev: true - - /has-symbols@1.0.3: - resolution: {integrity: sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==} - engines: {node: '>= 0.4'} - dev: true - - /has-tostringtag@1.0.2: - resolution: {integrity: sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==} - engines: {node: '>= 0.4'} - dependencies: - has-symbols: 1.0.3 - dev: true - - /hash-base@3.1.0: - resolution: {integrity: sha512-1nmYp/rhMDiE7AYkDw+lLwlAzz0AntGIe51F3RfFfEqyQ3feY2eI/NcwC6umIQVOASPMsWJLJScWKSSvzL9IVA==} - engines: {node: '>=4'} - dependencies: - inherits: 2.0.4 - readable-stream: 3.6.2 - safe-buffer: 5.2.1 - dev: true - - /hash.js@1.1.3: - resolution: {integrity: sha512-/UETyP0W22QILqS+6HowevwhEFJ3MBJnwTf75Qob9Wz9t0DPuisL8kW8YZMK62dHAKE1c1p+gY1TtOLY+USEHA==} - dependencies: - inherits: 2.0.4 - minimalistic-assert: 1.0.1 - dev: true - - /hash.js@1.1.7: - resolution: {integrity: sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==} - dependencies: - inherits: 2.0.4 - minimalistic-assert: 1.0.1 - dev: true - - /hasown@2.0.2: - resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==} - engines: {node: '>= 0.4'} - dependencies: - function-bind: 1.1.2 - dev: true - - /he@1.2.0: - resolution: {integrity: sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==} - hasBin: true - dev: true - - /header-case@1.0.1: - resolution: {integrity: sha512-i0q9mkOeSuhXw6bGgiQCCBgY/jlZuV/7dZXyZ9c6LcBrqwvT8eT719E9uxE5LiZftdl+z81Ugbg/VvXV4OJOeQ==} - dependencies: - no-case: 2.3.2 - upper-case: 1.1.3 - dev: true - - /heap@0.2.7: - resolution: {integrity: sha512-2bsegYkkHO+h/9MGbn6KWcE45cHZgPANo5LXF7EvWdT0yT2EguSVO1nDgU5c8+ZOPwp2vMNa7YFsJhVcDR9Sdg==} - dev: true - - /highlight.js@10.7.3: - resolution: {integrity: sha512-tzcUFauisWKNHaRkN4Wjl/ZA07gENAjFl3J/c480dprkGTg5EQstgaNFqBfUqCq54kZRIEcreTsAgF/m2quD7A==} - dev: true - - /highlightjs-solidity@2.0.6: - resolution: {integrity: sha512-DySXWfQghjm2l6a/flF+cteroJqD4gI8GSdL4PtvxZSsAHie8m3yVe2JFoRg03ROKT6hp2Lc/BxXkqerNmtQYg==} - dev: true - - /hmac-drbg@1.0.1: - resolution: {integrity: sha512-Tti3gMqLdZfhOQY1Mzf/AanLiqh1WTiJgEj26ZuYQ9fbkLomzGchCws4FyrSd4VkpBfiNhaE1On+lOz894jvXg==} - dependencies: - hash.js: 1.1.7 - minimalistic-assert: 1.0.1 - minimalistic-crypto-utils: 1.0.1 - dev: true - - /hosted-git-info@2.8.9: - resolution: {integrity: sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==} - dev: true - - /htmlparser2@8.0.2: - resolution: {integrity: sha512-GYdjWKDkbRLkZ5geuHs5NY1puJ+PXwP7+fHPRz06Eirsb9ugf6d8kkXav6ADhcODhFFPMIXyxkxSuMf3D6NCFA==} - dependencies: - domelementtype: 2.3.0 - domhandler: 5.0.3 - domutils: 3.1.0 - entities: 4.5.0 - dev: true - - /http-basic@8.1.3: - resolution: {integrity: sha512-/EcDMwJZh3mABI2NhGfHOGOeOZITqfkEO4p/xK+l3NpyncIHUQBoMvCSF/b5GqvKtySC2srL/GGG3+EtlqlmCw==} - engines: {node: '>=6.0.0'} - dependencies: - caseless: 0.12.0 - concat-stream: 1.6.2 - http-response-object: 3.0.2 - parse-cache-control: 1.0.1 - dev: true - - /http-cache-semantics@4.1.1: - resolution: {integrity: sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==} - dev: true - - /http-errors@2.0.0: - resolution: {integrity: sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==} - engines: {node: '>= 0.8'} - dependencies: - depd: 2.0.0 - inherits: 2.0.4 - setprototypeof: 1.2.0 - statuses: 2.0.1 - toidentifier: 1.0.1 - dev: true - - /http-https@1.0.0: - resolution: {integrity: sha512-o0PWwVCSp3O0wS6FvNr6xfBCHgt0m1tvPLFOCc2iFDKTRAXhB7m8klDf7ErowFH8POa6dVdGatKU5I1YYwzUyg==} - dev: true - - /http-response-object@3.0.2: - resolution: {integrity: sha512-bqX0XTF6fnXSQcEJ2Iuyr75yVakyjIDCqroJQ/aHfSdlM743Cwqoi2nDYMzLGWUcuTWGWy8AAvOKXTfiv6q9RA==} - dependencies: - '@types/node': 10.17.60 - dev: true - - /http-signature@1.2.0: - resolution: {integrity: sha512-CAbnr6Rz4CYQkLYUtSNXxQPUH2gK8f3iWexVlsnMeD+GjlsQ0Xsy1cOX+mN3dtxYomRy21CiOzU8Uhw6OwncEQ==} - engines: {node: '>=0.8', npm: '>=1.3.7'} - dependencies: - assert-plus: 1.0.0 - jsprim: 1.4.2 - sshpk: 1.18.0 - dev: true - - /http2-wrapper@1.0.3: - resolution: {integrity: sha512-V+23sDMr12Wnz7iTcDeJr3O6AIxlnvT/bmaAAAP/Xda35C90p9599p0F1eHR/N1KILWSoWVAiOMFjBBXaXSMxg==} - engines: {node: '>=10.19.0'} - dependencies: - quick-lru: 5.1.1 - resolve-alpn: 1.2.1 - dev: true - - /http2-wrapper@2.2.1: - resolution: {integrity: sha512-V5nVw1PAOgfI3Lmeaj2Exmeg7fenjhRUgz1lPSezy1CuhPYbgQtbQj4jZfEAEMlaL+vupsvhjqCyjzob0yxsmQ==} - engines: {node: '>=10.19.0'} - dependencies: - quick-lru: 5.1.1 - resolve-alpn: 1.2.1 - dev: true - - /https-proxy-agent@5.0.1: - resolution: {integrity: sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==} - engines: {node: '>= 6'} - dependencies: - agent-base: 6.0.2 - debug: 4.3.4(supports-color@8.1.1) - transitivePeerDependencies: - - supports-color - dev: true - - /iconv-lite@0.4.24: - resolution: {integrity: sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==} - engines: {node: '>=0.10.0'} - dependencies: - safer-buffer: 2.1.2 - dev: true - - /idna-uts46-hx@2.3.1: - resolution: {integrity: sha512-PWoF9Keq6laYdIRwwCdhTPl60xRqAloYNMQLiyUnG42VjT53oW07BXIRM+NK7eQjzXjAk2gUvX9caRxlnF9TAA==} - engines: {node: '>=4.0.0'} - dependencies: - punycode: 2.1.0 - dev: true - - /ieee754@1.2.1: - resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} - dev: true - - /ignore@5.3.1: - resolution: {integrity: sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw==} - engines: {node: '>= 4'} - dev: true - - /immutable@4.3.5: - resolution: {integrity: sha512-8eabxkth9gZatlwl5TBuJnCsoTADlL6ftEr7A4qgdaTsPyreilDSnUk57SO+jfKcNtxPa22U5KK6DSeAYhpBJw==} - dev: true - - /indent-string@4.0.0: - resolution: {integrity: sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==} - engines: {node: '>=8'} - dev: true - - /inflight@1.0.6: - resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} - dependencies: - once: 1.4.0 - wrappy: 1.0.2 - dev: true - - /inherits@2.0.4: - resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} - dev: true - - /ini@1.3.8: - resolution: {integrity: sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==} - dev: true - - /interpret@1.4.0: - resolution: {integrity: sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==} - engines: {node: '>= 0.10'} - dev: true - - /invert-kv@1.0.0: - resolution: {integrity: sha512-xgs2NH9AE66ucSq4cNG1nhSFghr5l6tdL15Pk+jl46bmmBapgoaY/AacXyaDznAqmGL99TiLSQgO/XazFSKYeQ==} - engines: {node: '>=0.10.0'} - dev: true - - /io-ts@1.10.4: - resolution: {integrity: sha512-b23PteSnYXSONJ6JQXRAlvJhuw8KOtkqa87W4wDtvMrud/DTJd5X+NpOOI+O/zZwVq6v0VLAaJ+1EDViKEuN9g==} - dependencies: - fp-ts: 1.19.3 - dev: true - - /ipaddr.js@1.9.1: - resolution: {integrity: sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==} - engines: {node: '>= 0.10'} - dev: true - - /is-arguments@1.1.1: - resolution: {integrity: sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==} - engines: {node: '>= 0.4'} - dependencies: - call-bind: 1.0.7 - has-tostringtag: 1.0.2 - dev: true - - /is-arrayish@0.2.1: - resolution: {integrity: sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==} - dev: true - - /is-binary-path@2.1.0: - resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} - engines: {node: '>=8'} - dependencies: - binary-extensions: 2.2.0 - dev: true - - /is-callable@1.2.7: - resolution: {integrity: sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==} - engines: {node: '>= 0.4'} - dev: true - - /is-core-module@2.13.1: - resolution: {integrity: sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==} - dependencies: - hasown: 2.0.2 - dev: true - - /is-extglob@2.1.1: - resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} - engines: {node: '>=0.10.0'} - dev: true - - /is-fullwidth-code-point@1.0.0: - resolution: {integrity: sha512-1pqUqRjkhPJ9miNq9SwMfdvi6lBJcd6eFxvfaivQhaH3SgisfiuudvFntdKOmxuee/77l+FPjKrQjWvmPjWrRw==} - engines: {node: '>=0.10.0'} - dependencies: - number-is-nan: 1.0.1 - dev: true - - /is-fullwidth-code-point@2.0.0: - resolution: {integrity: sha512-VHskAKYM8RfSFXwee5t5cbN5PZeq1Wrh6qd5bkyiXIf6UQcN6w/A0eXM9r6t8d+GYOh+o6ZhiEnb88LN/Y8m2w==} - engines: {node: '>=4'} - dev: true - - /is-fullwidth-code-point@3.0.0: - resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} - engines: {node: '>=8'} - dev: true - - /is-function@1.0.2: - resolution: {integrity: sha512-lw7DUp0aWXYg+CBCN+JKkcE0Q2RayZnSvnZBlwgxHBQhqt5pZNVy4Ri7H9GmmXkdu7LUthszM+Tor1u/2iBcpQ==} - dev: true - - /is-generator-function@1.0.10: - resolution: {integrity: sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A==} - engines: {node: '>= 0.4'} - dependencies: - has-tostringtag: 1.0.2 - dev: true - - /is-glob@4.0.3: - resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} - engines: {node: '>=0.10.0'} - dependencies: - is-extglob: 2.1.1 - dev: true - - /is-hex-prefixed@1.0.0: - resolution: {integrity: sha512-WvtOiug1VFrE9v1Cydwm+FnXd3+w9GaeVUss5W4v/SLy3UW00vP+6iNF2SdnfiBoLy4bTqVdkftNGTUeOFVsbA==} - engines: {node: '>=6.5.0', npm: '>=3'} - dev: true - - /is-lower-case@1.1.3: - resolution: {integrity: sha512-+5A1e/WJpLLXZEDlgz4G//WYSHyQBD32qa4Jd3Lw06qQlv3fJHnp3YIHjTQSGzHMgzmVKz2ZP3rBxTHkPw/lxA==} - dependencies: - lower-case: 1.1.4 - dev: true - - /is-number@7.0.0: - resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} - engines: {node: '>=0.12.0'} - dev: true - - /is-plain-obj@2.1.0: - resolution: {integrity: sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==} - engines: {node: '>=8'} - dev: true - - /is-typed-array@1.1.13: - resolution: {integrity: sha512-uZ25/bUAlUY5fR4OKT4rZQEBrzQWYV9ZJYGGsUmEJ6thodVJ1HX64ePQ6Z0qPWP+m+Uq6e9UugrE38jeYsDSMw==} - engines: {node: '>= 0.4'} - dependencies: - which-typed-array: 1.1.15 - dev: true - - /is-typedarray@1.0.0: - resolution: {integrity: sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==} - dev: true - - /is-unicode-supported@0.1.0: - resolution: {integrity: sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==} - engines: {node: '>=10'} - dev: true - - /is-upper-case@1.1.2: - resolution: {integrity: sha512-GQYSJMgfeAmVwh9ixyk888l7OIhNAGKtY6QA+IrWlu9MDTCaXmeozOZ2S9Knj7bQwBO/H6J2kb+pbyTUiMNbsw==} - dependencies: - upper-case: 1.1.3 - dev: true - - /is-utf8@0.2.1: - resolution: {integrity: sha512-rMYPYvCzsXywIsldgLaSoPlw5PfoB/ssr7hY4pLfcodrA5M/eArza1a9VmTiNIBNMjOGr1Ow9mTyU2o69U6U9Q==} - dev: true - - /isarray@1.0.0: - resolution: {integrity: sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==} - dev: true - - /isexe@2.0.0: - resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} - dev: true - - /isstream@0.1.2: - resolution: {integrity: sha512-Yljz7ffyPbrLpLngrMtZ7NduUgVvi6wG9RJ9IUcyCd59YQ911PBJphODUcbOVbqYfxe1wuYf/LJ8PauMRwsM/g==} - dev: true - - /js-sha3@0.5.5: - resolution: {integrity: sha512-yLLwn44IVeunwjpDVTDZmQeVbB0h+dZpY2eO68B/Zik8hu6dH+rKeLxwua79GGIvW6xr8NBAcrtiUbYrTjEFTA==} - dev: true - - /js-sha3@0.5.7: - resolution: {integrity: sha512-GII20kjaPX0zJ8wzkTbNDYMY7msuZcTWk8S5UOh6806Jq/wz1J8/bnr8uGU0DAUmYDjj2Mr4X1cW8v/GLYnR+g==} - dev: true - - /js-sha3@0.8.0: - resolution: {integrity: sha512-gF1cRrHhIzNfToc802P800N8PpXS+evLLXfsVpowqmAFR9uwbi89WvXg2QspOmXL8QL86J4T1EpFu+yUkwJY3Q==} - dev: true - - /js-yaml@3.14.1: - resolution: {integrity: sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==} - hasBin: true - dependencies: - argparse: 1.0.10 - esprima: 4.0.1 - dev: true - - /js-yaml@4.1.0: - resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} - hasBin: true - dependencies: - argparse: 2.0.1 - dev: true - - /jsbn@0.1.1: - resolution: {integrity: sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg==} - dev: true - - /json-buffer@3.0.1: - resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==} - dev: true - - /json-schema-traverse@0.4.1: - resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} - dev: true - - /json-schema-traverse@1.0.0: - resolution: {integrity: sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==} - dev: true - - /json-schema@0.4.0: - resolution: {integrity: sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==} - dev: true - - /json-stringify-safe@5.0.1: - resolution: {integrity: sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==} - dev: true - - /jsonfile@2.4.0: - resolution: {integrity: sha512-PKllAqbgLgxHaj8TElYymKCAgrASebJrWpTnEkOaTowt23VKXXN0sUeriJ+eh7y6ufb/CC5ap11pz71/cM0hUw==} - optionalDependencies: - graceful-fs: 4.2.11 - dev: true - - /jsonfile@4.0.0: - resolution: {integrity: sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==} - optionalDependencies: - graceful-fs: 4.2.11 - dev: true - - /jsonfile@6.1.0: - resolution: {integrity: sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==} - dependencies: - universalify: 2.0.1 - optionalDependencies: - graceful-fs: 4.2.11 - dev: true - - /jsonschema@1.4.1: - resolution: {integrity: sha512-S6cATIPVv1z0IlxdN+zUk5EPjkGCdnhN4wVSBlvoUO1tOLJootbo9CquNJmbIh4yikWHiUedhRYrNPn1arpEmQ==} - dev: true - - /jsprim@1.4.2: - resolution: {integrity: sha512-P2bSOMAc/ciLz6DzgjVlGJP9+BrJWu5UDGK70C2iweC5QBIeFf0ZXRvGjEj2uYgrY2MkAAhsSWHDWlFtEroZWw==} - engines: {node: '>=0.6.0'} - dependencies: - assert-plus: 1.0.0 - extsprintf: 1.3.0 - json-schema: 0.4.0 - verror: 1.10.0 - dev: true - - /keccak@3.0.4: - resolution: {integrity: sha512-3vKuW0jV8J3XNTzvfyicFR5qvxrSAGl7KIhvgOu5cmWwM7tZRj3fMbj/pfIf4be7aznbc+prBWGjywox/g2Y6Q==} - engines: {node: '>=10.0.0'} - requiresBuild: true - dependencies: - node-addon-api: 2.0.2 - node-gyp-build: 4.8.0 - readable-stream: 3.6.2 - dev: true - - /keyv@4.5.4: - resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==} - dependencies: - json-buffer: 3.0.1 - dev: true - - /kind-of@6.0.3: - resolution: {integrity: sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==} - engines: {node: '>=0.10.0'} - dev: true - - /klaw@1.3.1: - resolution: {integrity: sha512-TED5xi9gGQjGpNnvRWknrwAB1eL5GciPfVFOt3Vk1OJCVDQbzuSfrF3hkUQKlsgKrG1F+0t5W0m+Fje1jIt8rw==} - optionalDependencies: - graceful-fs: 4.2.11 - dev: true - - /lcid@1.0.0: - resolution: {integrity: sha512-YiGkH6EnGrDGqLMITnGjXtGmNtjoXw9SVUzcaos8RBi7Ps0VBylkq+vOcY9QE5poLasPCR849ucFUkl0UzUyOw==} - engines: {node: '>=0.10.0'} - dependencies: - invert-kv: 1.0.0 - dev: true - - /levn@0.3.0: - resolution: {integrity: sha512-0OO4y2iOHix2W6ujICbKIaEQXvFQHue65vUG3pb5EUomzPI90z9hsA1VsO/dbIIpC53J8gxM9Q4Oho0jrCM/yA==} - engines: {node: '>= 0.8.0'} - dependencies: - prelude-ls: 1.1.2 - type-check: 0.3.2 - dev: true - - /load-json-file@1.1.0: - resolution: {integrity: sha512-cy7ZdNRXdablkXYNI049pthVeXFurRyb9+hA/dZzerZ0pGTx42z+y+ssxBaVV2l70t1muq5IdKhn4UtcoGUY9A==} - engines: {node: '>=0.10.0'} - dependencies: - graceful-fs: 4.2.11 - parse-json: 2.2.0 - pify: 2.3.0 - pinkie-promise: 2.0.1 - strip-bom: 2.0.0 - dev: true - - /locate-path@2.0.0: - resolution: {integrity: sha512-NCI2kiDkyR7VeEKm27Kda/iQHyKJe1Bu0FlTbYp3CqJu+9IFe9bLyAjMxf5ZDDbEg+iMPzB5zYyUTSm8wVTKmA==} - engines: {node: '>=4'} - dependencies: - p-locate: 2.0.0 - path-exists: 3.0.0 - dev: true - - /locate-path@5.0.0: - resolution: {integrity: sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==} - engines: {node: '>=8'} - dependencies: - p-locate: 4.1.0 - dev: true - - /locate-path@6.0.0: - resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} - engines: {node: '>=10'} - dependencies: - p-locate: 5.0.0 - dev: true - - /lodash.assign@4.2.0: - resolution: {integrity: sha512-hFuH8TY+Yji7Eja3mGiuAxBqLagejScbG8GbG0j6o9vzn0YL14My+ktnqtZgFTosKymC9/44wP6s7xyuLfnClw==} - dev: true - - /lodash.camelcase@4.3.0: - resolution: {integrity: sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==} - dev: true - - /lodash.flatten@4.4.0: - resolution: {integrity: sha512-C5N2Z3DgnnKr0LOpv/hKCgKdb7ZZwafIrsesve6lmzvZIRZRGaZ/l6Q8+2W7NaT+ZwO3fFlSCzCzrDCFdJfZ4g==} - dev: true - - /lodash.merge@4.6.2: - resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} - dev: true - - /lodash.truncate@4.4.2: - resolution: {integrity: sha512-jttmRe7bRse52OsWIMDLaXxWqRAmtIUccAQ3garviCqJjafXOfNMO0yMfNpdD6zbGaTU0P5Nz7e7gAT6cKmJRw==} - dev: true - - /lodash@4.17.21: - resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} - dev: true - - /log-symbols@4.1.0: - resolution: {integrity: sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==} - engines: {node: '>=10'} - dependencies: - chalk: 4.1.2 - is-unicode-supported: 0.1.0 - dev: true - - /loupe@2.3.7: - resolution: {integrity: sha512-zSMINGVYkdpYSOBmLi0D1Uo7JU9nVdQKrHxC8eYlV+9YKK9WePqAlL7lSlorG/U2Fw1w0hTBmaa/jrQ3UbPHtA==} - dependencies: - get-func-name: 2.0.2 - dev: true - - /lower-case-first@1.0.2: - resolution: {integrity: sha512-UuxaYakO7XeONbKrZf5FEgkantPf5DUqDayzP5VXZrtRPdH86s4kN47I8B3TW10S4QKiE3ziHNf3kRN//okHjA==} - dependencies: - lower-case: 1.1.4 - dev: true - - /lower-case@1.1.4: - resolution: {integrity: sha512-2Fgx1Ycm599x+WGpIYwJOvsjmXFzTSc34IwDWALRA/8AopUKAVPwfJ+h5+f85BCp0PWmmJcWzEpxOpoXycMpdA==} - dev: true - - /lowercase-keys@2.0.0: - resolution: {integrity: sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==} - engines: {node: '>=8'} - dev: true - - /lowercase-keys@3.0.0: - resolution: {integrity: sha512-ozCC6gdQ+glXOQsveKD0YsDy8DSQFjDTz4zyzEHNV5+JP5D62LmfDZ6o1cycFx9ouG940M5dE8C8CTewdj2YWQ==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - dev: true - - /lru-cache@6.0.0: - resolution: {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==} - engines: {node: '>=10'} - dependencies: - yallist: 4.0.0 - dev: true - - /lru_map@0.3.3: - resolution: {integrity: sha512-Pn9cox5CsMYngeDbmChANltQl+5pi6XmTrraMSzhPmMBbmgcxmqWry0U3PGapCU1yB4/LqCcom7qhHZiF/jGfQ==} - dev: true - - /make-error@1.3.6: - resolution: {integrity: sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==} - dev: true - - /map-stream@0.1.0: - resolution: {integrity: sha512-CkYQrPYZfWnu/DAmVCpTSX/xHpKZ80eKh2lAkyA6AJTef6bW+6JpbQZN5rofum7da+SyN1bi5ctTm+lTfcCW3g==} - dev: true - - /markdown-table@1.1.3: - resolution: {integrity: sha512-1RUZVgQlpJSPWYbFSpmudq5nHY1doEIv89gBtF0s4gW1GF2XorxcA/70M5vq7rLv0a6mhOUccRsqkwhwLCIQ2Q==} - dev: true - - /md5.js@1.3.5: - resolution: {integrity: sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==} - dependencies: - hash-base: 3.1.0 - inherits: 2.0.4 - safe-buffer: 5.2.1 - dev: true - - /media-typer@0.3.0: - resolution: {integrity: sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==} - engines: {node: '>= 0.6'} - dev: true - - /memorystream@0.3.1: - resolution: {integrity: sha512-S3UwM3yj5mtUSEfP41UZmt/0SCoVYUcU1rkXv+BQ5Ig8ndL4sPoJNBUJERafdPb5jjHJGuMgytgKvKIf58XNBw==} - engines: {node: '>= 0.10.0'} - dev: true - - /merge-descriptors@1.0.1: - resolution: {integrity: sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==} - dev: true - - /merge2@1.4.1: - resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} - engines: {node: '>= 8'} - dev: true - - /methods@1.1.2: - resolution: {integrity: sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==} - engines: {node: '>= 0.6'} - dev: true - - /micro-ftch@0.3.1: - resolution: {integrity: sha512-/0LLxhzP0tfiR5hcQebtudP56gUurs2CLkGarnCiB/OqEyUFQ6U3paQi/tgLv0hBJYt2rnr9MNpxz4fiiugstg==} - dev: true - - /micromatch@4.0.5: - resolution: {integrity: sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==} - engines: {node: '>=8.6'} - dependencies: - braces: 3.0.2 - picomatch: 2.3.1 - dev: true - - /mime-db@1.52.0: - resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==} - engines: {node: '>= 0.6'} - dev: true - - /mime-types@2.1.35: - resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==} - engines: {node: '>= 0.6'} - dependencies: - mime-db: 1.52.0 - dev: true - - /mime@1.6.0: - resolution: {integrity: sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==} - engines: {node: '>=4'} - hasBin: true - dev: true - - /mimic-response@1.0.1: - resolution: {integrity: sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==} - engines: {node: '>=4'} - dev: true - - /mimic-response@3.1.0: - resolution: {integrity: sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==} - engines: {node: '>=10'} - dev: true - - /min-document@2.19.0: - resolution: {integrity: sha512-9Wy1B3m3f66bPPmU5hdA4DR4PB2OfDU/+GS3yAB7IQozE3tqXaVv2zOjgla7MEGSRv95+ILmOuvhLkOK6wJtCQ==} - dependencies: - dom-walk: 0.1.2 - dev: true - - /minimalistic-assert@1.0.1: - resolution: {integrity: sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==} - dev: true - - /minimalistic-crypto-utils@1.0.1: - resolution: {integrity: sha512-JIYlbt6g8i5jKfJ3xz7rF0LXmv2TkDxBLUkiBeZ7bAx4GnnNMr8xFpGnOxn6GhTEHx3SjRrZEoU+j04prX1ktg==} - dev: true - - /minimatch@3.1.2: - resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} - dependencies: - brace-expansion: 1.1.11 - dev: true - - /minimatch@5.0.1: - resolution: {integrity: sha512-nLDxIFRyhDblz3qMuq+SoRZED4+miJ/G+tdDrjkkkRnjAsBexeGpgjLEQ0blJy7rHhR2b93rhQY4SvyWu9v03g==} - engines: {node: '>=10'} - dependencies: - brace-expansion: 2.0.1 - dev: true - - /minimist@1.2.8: - resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} - dev: true - - /minipass@2.9.0: - resolution: {integrity: sha512-wxfUjg9WebH+CUDX/CdbRlh5SmfZiy/hpkxaRI16Y9W56Pa75sWgd/rvFilSgrauD9NyFymP/+JFV3KwzIsJeg==} - dependencies: - safe-buffer: 5.2.1 - yallist: 3.1.1 - dev: true - - /minizlib@1.3.3: - resolution: {integrity: sha512-6ZYMOEnmVsdCeTJVE0W9ZD+pVnE8h9Hma/iOwwRDsdQoePpoX56/8B6z3P9VNwppJuBKNRuFDRNRqRWexT9G9Q==} - dependencies: - minipass: 2.9.0 - dev: true - - /mkdirp-promise@5.0.1: - resolution: {integrity: sha512-Hepn5kb1lJPtVW84RFT40YG1OddBNTOVUZR2bzQUHc+Z03en8/3uX0+060JDhcEzyO08HmipsN9DcnFMxhIL9w==} - engines: {node: '>=4'} - deprecated: This package is broken and no longer maintained. 'mkdirp' itself supports promises now, please switch to that. - dependencies: - mkdirp: 3.0.1 - dev: true - - /mkdirp@0.5.6: - resolution: {integrity: sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==} - hasBin: true - dependencies: - minimist: 1.2.8 - dev: true - - /mkdirp@1.0.4: - resolution: {integrity: sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==} - engines: {node: '>=10'} - hasBin: true - dev: true - - /mkdirp@3.0.1: - resolution: {integrity: sha512-+NsyUUAZDmo6YVHzL/stxSu3t9YS1iljliy3BSDrXJ/dkn1KYdmtZODGGjLcc9XLgVVpH4KshHB8XmZgMhaBXg==} - engines: {node: '>=10'} - hasBin: true - dev: true - - /mnemonist@0.38.5: - resolution: {integrity: sha512-bZTFT5rrPKtPJxj8KSV0WkPyNxl72vQepqqVUAW2ARUpUSF2qXMB6jZj7hW5/k7C1rtpzqbD/IIbJwLXUjCHeg==} - dependencies: - obliterator: 2.0.4 - dev: true - - /mocha@10.3.0: - resolution: {integrity: sha512-uF2XJs+7xSLsrmIvn37i/wnc91nw7XjOQB8ccyx5aEgdnohr7n+rEiZP23WkCYHjilR6+EboEnbq/ZQDz4LSbg==} - engines: {node: '>= 14.0.0'} - hasBin: true - dependencies: - ansi-colors: 4.1.1 - browser-stdout: 1.3.1 - chokidar: 3.5.3 - debug: 4.3.4(supports-color@8.1.1) - diff: 5.0.0 - escape-string-regexp: 4.0.0 - find-up: 5.0.0 - glob: 8.1.0 - he: 1.2.0 - js-yaml: 4.1.0 - log-symbols: 4.1.0 - minimatch: 5.0.1 - ms: 2.1.3 - serialize-javascript: 6.0.0 - strip-json-comments: 3.1.1 - supports-color: 8.1.1 - workerpool: 6.2.1 - yargs: 16.2.0 - yargs-parser: 20.2.4 - yargs-unparser: 2.0.0 - dev: true - - /mock-fs@4.14.0: - resolution: {integrity: sha512-qYvlv/exQ4+svI3UOvPUpLDF0OMX5euvUH0Ny4N5QyRyhNdgAgUrVH3iUINSzEPLvx0kbo/Bp28GJKIqvE7URw==} - dev: true - - /ms@2.0.0: - resolution: {integrity: sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==} - dev: true - - /ms@2.1.2: - resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} - dev: true - - /ms@2.1.3: - resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} - dev: true - - /multibase@0.6.1: - resolution: {integrity: sha512-pFfAwyTjbbQgNc3G7D48JkJxWtoJoBMaR4xQUOuB8RnCgRqaYmWNFeJTTvrJ2w51bjLq2zTby6Rqj9TQ9elSUw==} - deprecated: This module has been superseded by the multiformats module - dependencies: - base-x: 3.0.9 - buffer: 5.7.1 - dev: true - - /multibase@0.7.0: - resolution: {integrity: sha512-TW8q03O0f6PNFTQDvh3xxH03c8CjGaaYrjkl9UQPG6rz53TQzzxJVCIWVjzcbN/Q5Y53Zd0IBQBMVktVgNx4Fg==} - deprecated: This module has been superseded by the multiformats module - dependencies: - base-x: 3.0.9 - buffer: 5.7.1 - dev: true - - /multicodec@0.5.7: - resolution: {integrity: sha512-PscoRxm3f+88fAtELwUnZxGDkduE2HD9Q6GHUOywQLjOGT/HAdhjLDYNZ1e7VR0s0TP0EwZ16LNUTFpoBGivOA==} - deprecated: This module has been superseded by the multiformats module - dependencies: - varint: 5.0.2 - dev: true - - /multicodec@1.0.4: - resolution: {integrity: sha512-NDd7FeS3QamVtbgfvu5h7fd1IlbaC4EQ0/pgU4zqE2vdHCmBGsUa0TiM8/TdSeG6BMPC92OOCf8F1ocE/Wkrrg==} - deprecated: This module has been superseded by the multiformats module - dependencies: - buffer: 5.7.1 - varint: 5.0.2 - dev: true - - /multihashes@0.4.21: - resolution: {integrity: sha512-uVSvmeCWf36pU2nB4/1kzYZjsXD9vofZKpgudqkceYY5g2aZZXJ5r9lxuzoRLl1OAp28XljXsEJ/X/85ZsKmKw==} - dependencies: - buffer: 5.7.1 - multibase: 0.7.0 - varint: 5.0.2 - dev: true - - /nano-base32@1.0.1: - resolution: {integrity: sha512-sxEtoTqAPdjWVGv71Q17koMFGsOMSiHsIFEvzOM7cNp8BXB4AnEwmDabm5dorusJf/v1z7QxaZYxUorU9RKaAw==} - dev: true - - /nano-json-stream-parser@0.1.2: - resolution: {integrity: sha512-9MqxMH/BSJC7dnLsEMPyfN5Dvoo49IsPFYMcHw3Bcfc2kN0lpHRBSzlMSVx4HGyJ7s9B31CyBTVehWJoQ8Ctew==} - dev: true - - /negotiator@0.6.3: - resolution: {integrity: sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==} - engines: {node: '>= 0.6'} - dev: true - - /neo-async@2.6.2: - resolution: {integrity: sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==} - dev: true - - /next-tick@1.1.0: - resolution: {integrity: sha512-CXdUiJembsNjuToQvxayPZF9Vqht7hewsvy2sOWafLvi2awflj9mOC6bHIg50orX8IJvWKY9wYQ/zB2kogPslQ==} - dev: true - - /no-case@2.3.2: - resolution: {integrity: sha512-rmTZ9kz+f3rCvK2TD1Ue/oZlns7OGoIWP4fc3llxxRXlOkHKoWPPWJOfFYpITabSow43QJbRIoHQXtt10VldyQ==} - dependencies: - lower-case: 1.1.4 - dev: true - - /node-addon-api@2.0.2: - resolution: {integrity: sha512-Ntyt4AIXyaLIuMHF6IOoTakB3K+RWxwtsHNRxllEoA6vPwP9o4866g6YWDLUdnucilZhmkxiHwHr11gAENw+QA==} - dev: true - - /node-domexception@1.0.0: - resolution: {integrity: sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ==} - engines: {node: '>=10.5.0'} - dev: true - - /node-emoji@1.11.0: - resolution: {integrity: sha512-wo2DpQkQp7Sjm2A0cq+sN7EHKO6Sl0ctXeBdFZrL9T9+UywORbufTcTZxom8YqpLQt/FqNMUkOpkZrJVYSKD3A==} - dependencies: - lodash: 4.17.21 - dev: true - - /node-fetch@2.7.0: - resolution: {integrity: sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==} - engines: {node: 4.x || >=6.0.0} - peerDependencies: - encoding: ^0.1.0 - peerDependenciesMeta: - encoding: - optional: true - dependencies: - whatwg-url: 5.0.0 - dev: true - - /node-fetch@3.3.1: - resolution: {integrity: sha512-cRVc/kyto/7E5shrWca1Wsea4y6tL9iYJE5FBCius3JQfb/4P4I295PfhgbJQBLTx6lATE4z+wK0rPM4VS2uow==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - dependencies: - data-uri-to-buffer: 4.0.1 - fetch-blob: 3.2.0 - formdata-polyfill: 4.0.10 - dev: true - - /node-gyp-build@4.8.0: - resolution: {integrity: sha512-u6fs2AEUljNho3EYTJNBfImO5QTo/J/1Etd+NVdCj7qWKUSN/bSLkZwhDv7I+w/MSC6qJ4cknepkAYykDdK8og==} - hasBin: true - dev: true - - /nofilter@1.0.4: - resolution: {integrity: sha512-N8lidFp+fCz+TD51+haYdbDGrcBWwuHX40F5+z0qkUjMJ5Tp+rdSuAkMJ9N9eoolDlEVTf6u5icM+cNKkKW2mA==} - engines: {node: '>=8'} - dev: true - - /nofilter@3.1.0: - resolution: {integrity: sha512-l2NNj07e9afPnhAhvgVrCD/oy2Ai1yfLpuo3EpiO1jFTsB4sFz6oIfAfSZyQzVpkZQ9xS8ZS5g1jCBgq4Hwo0g==} - engines: {node: '>=12.19'} - dev: true - - /nopt@3.0.6: - resolution: {integrity: sha512-4GUt3kSEYmk4ITxzB/b9vaIDfUVWN/Ml1Fwl11IlnIG2iaJ9O6WXZ9SrYM9NLI8OCBieN2Y8SWC2oJV0RQ7qYg==} - hasBin: true - dependencies: - abbrev: 1.0.9 - dev: true - - /normalize-package-data@2.5.0: - resolution: {integrity: sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==} - dependencies: - hosted-git-info: 2.8.9 - resolve: 1.22.8 - semver: 5.7.2 - validate-npm-package-license: 3.0.4 - dev: true - - /normalize-path@3.0.0: - resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} - engines: {node: '>=0.10.0'} - dev: true - - /normalize-url@6.1.0: - resolution: {integrity: sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A==} - engines: {node: '>=10'} - dev: true - - /nth-check@2.1.1: - resolution: {integrity: sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==} - dependencies: - boolbase: 1.0.0 - dev: true - - /number-is-nan@1.0.1: - resolution: {integrity: sha512-4jbtZXNAsfZbAHiiqjLPBiCl16dES1zI4Hpzzxw61Tk+loF+sBDBKx1ICKKKwIqQ7M0mFn1TmkN7euSncWgHiQ==} - engines: {node: '>=0.10.0'} - dev: true - - /number-to-bn@1.7.0: - resolution: {integrity: sha512-wsJ9gfSz1/s4ZsJN01lyonwuxA1tml6X1yBDnfpMglypcBRFZZkus26EdPSlqS5GJfYddVZa22p3VNb3z5m5Ig==} - engines: {node: '>=6.5.0', npm: '>=3'} - dependencies: - bn.js: 4.11.6 - strip-hex-prefix: 1.0.0 - dev: true - - /oauth-sign@0.9.0: - resolution: {integrity: sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==} - dev: true - - /object-assign@4.1.1: - resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} - engines: {node: '>=0.10.0'} - dev: true - - /object-inspect@1.13.1: - resolution: {integrity: sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==} - dev: true - - /obliterator@2.0.4: - resolution: {integrity: sha512-lgHwxlxV1qIg1Eap7LgIeoBWIMFibOjbrYPIPJZcI1mmGAI2m3lNYpK12Y+GBdPQ0U1hRwSord7GIaawz962qQ==} - dev: true - - /oboe@2.1.5: - resolution: {integrity: sha512-zRFWiF+FoicxEs3jNI/WYUrVEgA7DeET/InK0XQuudGHRg8iIob3cNPrJTKaz4004uaA9Pbe+Dwa8iluhjLZWA==} - dependencies: - http-https: 1.0.0 - dev: true - - /on-finished@2.4.1: - resolution: {integrity: sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==} - engines: {node: '>= 0.8'} - dependencies: - ee-first: 1.1.1 - dev: true - - /once@1.4.0: - resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} - dependencies: - wrappy: 1.0.2 - dev: true - - /optionator@0.8.3: - resolution: {integrity: sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==} - engines: {node: '>= 0.8.0'} - dependencies: - deep-is: 0.1.4 - fast-levenshtein: 2.0.6 - levn: 0.3.0 - prelude-ls: 1.1.2 - type-check: 0.3.2 - word-wrap: 1.2.5 - dev: true - - /ordinal@1.0.3: - resolution: {integrity: sha512-cMddMgb2QElm8G7vdaa02jhUNbTSrhsgAGUz1OokD83uJTwSUn+nKoNoKVVaRa08yF6sgfO7Maou1+bgLd9rdQ==} - dev: true - - /os-locale@1.4.0: - resolution: {integrity: sha512-PRT7ZORmwu2MEFt4/fv3Q+mEfN4zetKxufQrkShY2oGvUms9r8otu5HfdyIFHkYXjO7laNsoVGmM2MANfuTA8g==} - engines: {node: '>=0.10.0'} - dependencies: - lcid: 1.0.0 - dev: true - - /os-tmpdir@1.0.2: - resolution: {integrity: sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==} - engines: {node: '>=0.10.0'} - dev: true - - /p-cancelable@2.1.1: - resolution: {integrity: sha512-BZOr3nRQHOntUjTrH8+Lh54smKHoHyur8We1V8DSMVrl5A2malOOwuJRnKRDjSnkoeBh4at6BwEnb5I7Jl31wg==} - engines: {node: '>=8'} - dev: true - - /p-cancelable@3.0.0: - resolution: {integrity: sha512-mlVgR3PGuzlo0MmTdk4cXqXWlwQDLnONTAg6sm62XkMJEiRxN3GL3SffkYvqwonbkJBcrI7Uvv5Zh9yjvn2iUw==} - engines: {node: '>=12.20'} - dev: true - - /p-limit@1.3.0: - resolution: {integrity: sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==} - engines: {node: '>=4'} - dependencies: - p-try: 1.0.0 - dev: true - - /p-limit@2.3.0: - resolution: {integrity: sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==} - engines: {node: '>=6'} - dependencies: - p-try: 2.2.0 - dev: true - - /p-limit@3.1.0: - resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} - engines: {node: '>=10'} - dependencies: - yocto-queue: 0.1.0 - dev: true - - /p-locate@2.0.0: - resolution: {integrity: sha512-nQja7m7gSKuewoVRen45CtVfODR3crN3goVQ0DDZ9N3yHxgpkuBhZqsaiotSQRrADUrne346peY7kT3TSACykg==} - engines: {node: '>=4'} - dependencies: - p-limit: 1.3.0 - dev: true - - /p-locate@4.1.0: - resolution: {integrity: sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==} - engines: {node: '>=8'} - dependencies: - p-limit: 2.3.0 - dev: true - - /p-locate@5.0.0: - resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} - engines: {node: '>=10'} - dependencies: - p-limit: 3.1.0 - dev: true - - /p-map@4.0.0: - resolution: {integrity: sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==} - engines: {node: '>=10'} - dependencies: - aggregate-error: 3.1.0 - dev: true - - /p-try@1.0.0: - resolution: {integrity: sha512-U1etNYuMJoIz3ZXSrrySFjsXQTWOx2/jdi86L+2pRvph/qMKL6sbcCYdH23fqsbm8TH2Gn0OybpT4eSFlCVHww==} - engines: {node: '>=4'} - dev: true - - /p-try@2.2.0: - resolution: {integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==} - engines: {node: '>=6'} - dev: true - - /pako@1.0.11: - resolution: {integrity: sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==} - dev: true - - /param-case@2.1.1: - resolution: {integrity: sha512-eQE845L6ot89sk2N8liD8HAuH4ca6Vvr7VWAWwt7+kvvG5aBcPmmphQ68JsEG2qa9n1TykS2DLeMt363AAH8/w==} - dependencies: - no-case: 2.3.2 - dev: true - - /parse-cache-control@1.0.1: - resolution: {integrity: sha512-60zvsJReQPX5/QP0Kzfd/VrpjScIQ7SHBW6bFCYfEP+fp0Eppr1SHhIO5nd1PjZtvclzSzES9D/p5nFJurwfWg==} - dev: true - - /parse-headers@2.0.5: - resolution: {integrity: sha512-ft3iAoLOB/MlwbNXgzy43SWGP6sQki2jQvAyBg/zDFAgr9bfNWZIUj42Kw2eJIl8kEi4PbgE6U1Zau/HwI75HA==} - dev: true - - /parse-json@2.2.0: - resolution: {integrity: sha512-QR/GGaKCkhwk1ePQNYDRKYZ3mwU9ypsKhB0XyFnLQdomyEqk3e8wpW3V5Jp88zbxK4n5ST1nqo+g9juTpownhQ==} - engines: {node: '>=0.10.0'} - dependencies: - error-ex: 1.3.2 - dev: true - - /parse5-htmlparser2-tree-adapter@7.0.0: - resolution: {integrity: sha512-B77tOZrqqfUfnVcOrUvfdLbz4pu4RopLD/4vmu3HUPswwTA8OH0EMW9BlWR2B0RCoiZRAHEUu7IxeP1Pd1UU+g==} - dependencies: - domhandler: 5.0.3 - parse5: 7.1.2 - dev: true - - /parse5@7.1.2: - resolution: {integrity: sha512-Czj1WaSVpaoj0wbhMzLmWD69anp2WH7FXMB9n1Sy8/ZFF9jolSQVMu1Ij5WIyGmcBmhk7EOndpO4mIpihVqAXw==} - dependencies: - entities: 4.5.0 - dev: true - - /parseurl@1.3.3: - resolution: {integrity: sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==} - engines: {node: '>= 0.8'} - dev: true - - /pascal-case@2.0.1: - resolution: {integrity: sha512-qjS4s8rBOJa2Xm0jmxXiyh1+OFf6ekCWOvUaRgAQSktzlTbMotS0nmG9gyYAybCWBcuP4fsBeRCKNwGBnMe2OQ==} - dependencies: - camel-case: 3.0.0 - upper-case-first: 1.1.2 - dev: true - - /path-case@2.1.1: - resolution: {integrity: sha512-Ou0N05MioItesaLr9q8TtHVWmJ6fxWdqKB2RohFmNWVyJ+2zeKIeDNWAN6B/Pe7wpzWChhZX6nONYmOnMeJQ/Q==} - dependencies: - no-case: 2.3.2 - dev: true - - /path-exists@2.1.0: - resolution: {integrity: sha512-yTltuKuhtNeFJKa1PiRzfLAU5182q1y4Eb4XCJ3PBqyzEDkAZRzBrKKBct682ls9reBVHf9udYLN5Nd+K1B9BQ==} - engines: {node: '>=0.10.0'} - dependencies: - pinkie-promise: 2.0.1 - dev: true - - /path-exists@3.0.0: - resolution: {integrity: sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==} - engines: {node: '>=4'} - dev: true - - /path-exists@4.0.0: - resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} - engines: {node: '>=8'} - dev: true - - /path-is-absolute@1.0.1: - resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} - engines: {node: '>=0.10.0'} - dev: true - - /path-parse@1.0.7: - resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} - dev: true - - /path-to-regexp@0.1.7: - resolution: {integrity: sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==} - dev: true - - /path-type@1.1.0: - resolution: {integrity: sha512-S4eENJz1pkiQn9Znv33Q+deTOKmbl+jj1Fl+qiP/vYezj+S8x+J3Uo0ISrx/QoEvIlOaDWJhPaRd1flJ9HXZqg==} - engines: {node: '>=0.10.0'} - dependencies: - graceful-fs: 4.2.11 - pify: 2.3.0 - pinkie-promise: 2.0.1 - dev: true - - /path-type@4.0.0: - resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} - engines: {node: '>=8'} - dev: true - - /pathval@1.1.1: - resolution: {integrity: sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==} - dev: true - - /pause-stream@0.0.11: - resolution: {integrity: sha512-e3FBlXLmN/D1S+zHzanP4E/4Z60oFAa3O051qt1pxa7DEJWKAyil6upYVXCWadEnuoqa4Pkc9oUx9zsxYeRv8A==} - dependencies: - through: 2.3.8 - dev: true - - /pbkdf2@3.1.2: - resolution: {integrity: sha512-iuh7L6jA7JEGu2WxDwtQP1ddOpaJNC4KlDEFfdQajSGgGPNi4OyDc2R7QnbY2bR9QjBVGwgvTdNJZoE7RaxUMA==} - engines: {node: '>=0.12'} - dependencies: - create-hash: 1.2.0 - create-hmac: 1.1.7 - ripemd160: 2.0.2 - safe-buffer: 5.2.1 - sha.js: 2.4.11 - dev: true - - /performance-now@2.1.0: - resolution: {integrity: sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow==} - dev: true - - /picomatch@2.3.1: - resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} - engines: {node: '>=8.6'} - dev: true - - /pify@2.3.0: - resolution: {integrity: sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==} - engines: {node: '>=0.10.0'} - dev: true - - /pify@4.0.1: - resolution: {integrity: sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==} - engines: {node: '>=6'} - dev: true - - /pinkie-promise@2.0.1: - resolution: {integrity: sha512-0Gni6D4UcLTbv9c57DfxDGdr41XfgUjqWZu492f0cIGr16zDU06BWP/RAEvOuo7CQ0CNjHaLlM59YJJFm3NWlw==} - engines: {node: '>=0.10.0'} - dependencies: - pinkie: 2.0.4 - dev: true - - /pinkie@2.0.4: - resolution: {integrity: sha512-MnUuEycAemtSaeFSjXKW/aroV7akBbY+Sv+RkyqFjgAe73F+MR0TBWKBRDkmfWq/HiFmdavfZ1G7h4SPZXaCSg==} - engines: {node: '>=0.10.0'} - dev: true - - /possible-typed-array-names@1.0.0: - resolution: {integrity: sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q==} - engines: {node: '>= 0.4'} - dev: true - - /prelude-ls@1.1.2: - resolution: {integrity: sha512-ESF23V4SKG6lVSGZgYNpbsiaAkdab6ZgOxe52p7+Kid3W3u3bxR4Vfd/o21dmN7jSt0IwgZ4v5MUd26FEtXE9w==} - engines: {node: '>= 0.8.0'} - dev: true - - /prettier@2.8.8: - resolution: {integrity: sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==} - engines: {node: '>=10.13.0'} - hasBin: true - dev: true - - /process-nextick-args@2.0.1: - resolution: {integrity: sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==} - dev: true - - /process@0.11.10: - resolution: {integrity: sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==} - engines: {node: '>= 0.6.0'} - dev: true - - /promise@8.3.0: - resolution: {integrity: sha512-rZPNPKTOYVNEEKFaq1HqTgOwZD+4/YHS5ukLzQCypkj+OkYx7iv0mA91lJlpPPZ8vMau3IIGj5Qlwrx+8iiSmg==} - dependencies: - asap: 2.0.6 - dev: true - - /proxy-addr@2.0.7: - resolution: {integrity: sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==} - engines: {node: '>= 0.10'} - dependencies: - forwarded: 0.2.0 - ipaddr.js: 1.9.1 - dev: true - - /proxy-from-env@1.1.0: - resolution: {integrity: sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==} - dev: true - - /ps-tree@1.2.0: - resolution: {integrity: sha512-0VnamPPYHl4uaU/nSFeZZpR21QAWRz+sRv4iW9+v/GS/J5U5iZB5BNN6J0RMoOvdx2gWM2+ZFMIm58q24e4UYA==} - engines: {node: '>= 0.10'} - hasBin: true - dependencies: - event-stream: 3.3.4 - dev: true - - /psl@1.9.0: - resolution: {integrity: sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag==} - dev: true - - /pump@3.0.0: - resolution: {integrity: sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==} - dependencies: - end-of-stream: 1.4.4 - once: 1.4.0 - dev: true - - /punycode@2.1.0: - resolution: {integrity: sha512-Yxz2kRwT90aPiWEMHVYnEf4+rhwF1tBmmZ4KepCP+Wkium9JxtWnUm1nqGwpiAHr/tnTSeHqr3wb++jgSkXjhA==} - engines: {node: '>=6'} - dev: true - - /punycode@2.3.1: - resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} - engines: {node: '>=6'} - dev: true - - /pure-rand@5.0.5: - resolution: {integrity: sha512-BwQpbqxSCBJVpamI6ydzcKqyFmnd5msMWUGvzXLm1aXvusbbgkbOto/EUPM00hjveJEaJtdbhUjKSzWRhQVkaw==} - dev: true - - /qs@6.11.0: - resolution: {integrity: sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==} - engines: {node: '>=0.6'} - dependencies: - side-channel: 1.0.6 - dev: true - - /qs@6.12.0: - resolution: {integrity: sha512-trVZiI6RMOkO476zLGaBIzszOdFPnCCXHPG9kn0yuS1uz6xdVxPfZdB3vUig9pxPFDM9BRAgz/YUIVQ1/vuiUg==} - engines: {node: '>=0.6'} - dependencies: - side-channel: 1.0.6 - dev: true - - /qs@6.5.3: - resolution: {integrity: sha512-qxXIEh4pCGfHICj1mAJQ2/2XVZkjCDTcEgfoSQxc/fYivUZxTkk7L3bDBJSoNrEzXI17oUO5Dp07ktqE5KzczA==} - engines: {node: '>=0.6'} - dev: true - - /query-string@5.1.1: - resolution: {integrity: sha512-gjWOsm2SoGlgLEdAGt7a6slVOk9mGiXmPFMqrEhLQ68rhQuBnpfs3+EmlvqKyxnCo9/PPlF+9MtY02S1aFg+Jw==} - engines: {node: '>=0.10.0'} - dependencies: - decode-uri-component: 0.2.2 - object-assign: 4.1.1 - strict-uri-encode: 1.1.0 - dev: true - - /queue-microtask@1.2.3: - resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} - dev: true - - /quick-lru@5.1.1: - resolution: {integrity: sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==} - engines: {node: '>=10'} - dev: true - - /randombytes@2.1.0: - resolution: {integrity: sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==} - dependencies: - safe-buffer: 5.2.1 - dev: true - - /range-parser@1.2.1: - resolution: {integrity: sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==} - engines: {node: '>= 0.6'} - dev: true - - /raw-body@2.5.2: - resolution: {integrity: sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==} - engines: {node: '>= 0.8'} - dependencies: - bytes: 3.1.2 - http-errors: 2.0.0 - iconv-lite: 0.4.24 - unpipe: 1.0.0 - dev: true - - /read-pkg-up@1.0.1: - resolution: {integrity: sha512-WD9MTlNtI55IwYUS27iHh9tK3YoIVhxis8yKhLpTqWtml739uXc9NWTpxoHkfZf3+DkCCsXox94/VWZniuZm6A==} - engines: {node: '>=0.10.0'} - dependencies: - find-up: 1.1.2 - read-pkg: 1.1.0 - dev: true - - /read-pkg@1.1.0: - resolution: {integrity: sha512-7BGwRHqt4s/uVbuyoeejRn4YmFnYZiFl4AuaeXHlgZf3sONF0SOGlxs2Pw8g6hCKupo08RafIO5YXFNOKTfwsQ==} - engines: {node: '>=0.10.0'} - dependencies: - load-json-file: 1.1.0 - normalize-package-data: 2.5.0 - path-type: 1.1.0 - dev: true - - /readable-stream@2.3.8: - resolution: {integrity: sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==} - dependencies: - core-util-is: 1.0.3 - inherits: 2.0.4 - isarray: 1.0.0 - process-nextick-args: 2.0.1 - safe-buffer: 5.1.2 - string_decoder: 1.1.1 - util-deprecate: 1.0.2 - dev: true - - /readable-stream@3.6.2: - resolution: {integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==} - engines: {node: '>= 6'} - dependencies: - inherits: 2.0.4 - string_decoder: 1.3.0 - util-deprecate: 1.0.2 - dev: true - - /readdirp@3.6.0: - resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} - engines: {node: '>=8.10.0'} - dependencies: - picomatch: 2.3.1 - dev: true - - /rechoir@0.6.2: - resolution: {integrity: sha512-HFM8rkZ+i3zrV+4LQjwQ0W+ez98pApMGM3HUrN04j3CqzPOzl9nmP15Y8YXNm8QHGv/eacOVEjqhmWpkRV0NAw==} - engines: {node: '>= 0.10'} - dependencies: - resolve: 1.22.8 - dev: true - - /recursive-readdir@2.2.3: - resolution: {integrity: sha512-8HrF5ZsXk5FAH9dgsx3BlUer73nIhuj+9OrQwEbLTPOBzGkL1lsFCR01am+v+0m2Cmbs1nP12hLDl5FA7EszKA==} - engines: {node: '>=6.0.0'} - dependencies: - minimatch: 3.1.2 - dev: true - - /reduce-flatten@2.0.0: - resolution: {integrity: sha512-EJ4UNY/U1t2P/2k6oqotuX2Cc3T6nxJwsM0N0asT7dhrtH1ltUxDn4NalSYmPE2rCkVpcf/X6R0wDwcFpzhd4w==} - engines: {node: '>=6'} - dev: true - - /regenerator-runtime@0.14.1: - resolution: {integrity: sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==} - dev: true - - /req-cwd@2.0.0: - resolution: {integrity: sha512-ueoIoLo1OfB6b05COxAA9UpeoscNpYyM+BqYlA7H6LVF4hKGPXQQSSaD2YmvDVJMkk4UDpAHIeU1zG53IqjvlQ==} - engines: {node: '>=4'} - dependencies: - req-from: 2.0.0 - dev: true - - /req-from@2.0.0: - resolution: {integrity: sha512-LzTfEVDVQHBRfjOUMgNBA+V6DWsSnoeKzf42J7l0xa/B4jyPOuuF5MlNSmomLNGemWTnV2TIdjSSLnEn95fOQA==} - engines: {node: '>=4'} - dependencies: - resolve-from: 3.0.0 - dev: true - - /request@2.88.2: - resolution: {integrity: sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==} - engines: {node: '>= 6'} - deprecated: request has been deprecated, see https://github.com/request/request/issues/3142 - dependencies: - aws-sign2: 0.7.0 - aws4: 1.12.0 - caseless: 0.12.0 - combined-stream: 1.0.8 - extend: 3.0.2 - forever-agent: 0.6.1 - form-data: 2.3.3 - har-validator: 5.1.5 - http-signature: 1.2.0 - is-typedarray: 1.0.0 - isstream: 0.1.2 - json-stringify-safe: 5.0.1 - mime-types: 2.1.35 - oauth-sign: 0.9.0 - performance-now: 2.1.0 - qs: 6.5.3 - safe-buffer: 5.2.1 - tough-cookie: 2.5.0 - tunnel-agent: 0.6.0 - uuid: 3.4.0 - dev: true - - /require-directory@2.1.1: - resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} - engines: {node: '>=0.10.0'} - dev: true - - /require-from-string@1.2.1: - resolution: {integrity: sha512-H7AkJWMobeskkttHyhTVtS0fxpFLjxhbfMa6Bk3wimP7sdPRGL3EyCg3sAQenFfAe+xQ+oAc85Nmtvq0ROM83Q==} - engines: {node: '>=0.10.0'} - dev: true - - /require-from-string@2.0.2: - resolution: {integrity: sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==} - engines: {node: '>=0.10.0'} - dev: true - - /require-main-filename@1.0.1: - resolution: {integrity: sha512-IqSUtOVP4ksd1C/ej5zeEh/BIP2ajqpn8c5x+q99gvcIG/Qf0cud5raVnE/Dwd0ua9TXYDoDc0RE5hBSdz22Ug==} - dev: true - - /resolve-alpn@1.2.1: - resolution: {integrity: sha512-0a1F4l73/ZFZOakJnQ3FvkJ2+gSTQWz/r2KE5OdDY0TxPm5h4GkqkWWfM47T7HsbnOtcJVEF4epCVy6u7Q3K+g==} - dev: true - - /resolve-from@3.0.0: - resolution: {integrity: sha512-GnlH6vxLymXJNMBo7XP1fJIzBFbdYt49CuTwmB/6N53t+kMPRMFKz783LlQ4tv28XoQfMWinAJX6WCGf2IlaIw==} - engines: {node: '>=4'} - dev: true - - /resolve-pkg-maps@1.0.0: - resolution: {integrity: sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==} - dev: true - - /resolve@1.1.7: - resolution: {integrity: sha512-9znBF0vBcaSN3W2j7wKvdERPwqTxSpCq+if5C0WoTCyV9n24rua28jeuQ2pL/HOf+yUe/Mef+H/5p60K0Id3bg==} - dev: true - - /resolve@1.17.0: - resolution: {integrity: sha512-ic+7JYiV8Vi2yzQGFWOkiZD5Z9z7O2Zhm9XMaTxdJExKasieFCr+yXZ/WmXsckHiKl12ar0y6XiXDx3m4RHn1w==} - dependencies: - path-parse: 1.0.7 - dev: true - - /resolve@1.22.8: - resolution: {integrity: sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==} - hasBin: true - dependencies: - is-core-module: 2.13.1 - path-parse: 1.0.7 - supports-preserve-symlinks-flag: 1.0.0 - dev: true - - /responselike@2.0.1: - resolution: {integrity: sha512-4gl03wn3hj1HP3yzgdI7d3lCkF95F21Pz4BPGvKHinyQzALR5CapwC8yIi0Rh58DEMQ/SguC03wFj2k0M/mHhw==} - dependencies: - lowercase-keys: 2.0.0 - dev: true - - /reusify@1.0.4: - resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} - engines: {iojs: '>=1.0.0', node: '>=0.10.0'} - dev: true - - /rimraf@2.7.1: - resolution: {integrity: sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==} - hasBin: true - dependencies: - glob: 7.2.0 - dev: true - - /ripemd160-min@0.0.6: - resolution: {integrity: sha512-+GcJgQivhs6S9qvLogusiTcS9kQUfgR75whKuy5jIhuiOfQuJ8fjqxV6EGD5duH1Y/FawFUMtMhyeq3Fbnib8A==} - engines: {node: '>=8'} - dev: true - - /ripemd160@2.0.2: - resolution: {integrity: sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==} - dependencies: - hash-base: 3.1.0 - inherits: 2.0.4 - dev: true - - /rlp@2.2.7: - resolution: {integrity: sha512-d5gdPmgQ0Z+AklL2NVXr/IoSjNZFfTVvQWzL/AM2AOcSzYP2xjlb0AC8YyCLc41MSNf6P6QVtjgPdmVtzb+4lQ==} - hasBin: true - dependencies: - bn.js: 5.2.1 - dev: true - - /run-parallel@1.2.0: - resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} - dependencies: - queue-microtask: 1.2.3 - dev: true - - /safe-buffer@5.1.2: - resolution: {integrity: sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==} - dev: true - - /safe-buffer@5.2.1: - resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} - dev: true - - /safer-buffer@2.1.2: - resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} - dev: true - - /sc-istanbul@0.4.6: - resolution: {integrity: sha512-qJFF/8tW/zJsbyfh/iT/ZM5QNHE3CXxtLJbZsL+CzdJLBsPD7SedJZoUA4d8iAcN2IoMp/Dx80shOOd2x96X/g==} - hasBin: true - dependencies: - abbrev: 1.0.9 - async: 1.5.2 - escodegen: 1.8.1 - esprima: 2.7.3 - glob: 5.0.15 - handlebars: 4.7.8 - js-yaml: 3.14.1 - mkdirp: 0.5.6 - nopt: 3.0.6 - once: 1.4.0 - resolve: 1.1.7 - supports-color: 3.2.3 - which: 1.3.1 - wordwrap: 1.0.0 - dev: true - - /scrypt-js@2.0.4: - resolution: {integrity: sha512-4KsaGcPnuhtCZQCxFxN3GVYIhKFPTdLd8PLC552XwbMndtD0cjRFAhDuuydXQ0h08ZfPgzqe6EKHozpuH74iDw==} - dev: true - - /scrypt-js@3.0.1: - resolution: {integrity: sha512-cdwTTnqPu0Hyvf5in5asVdZocVDTNRmR7XEcJuIzMjJeSHybHl7vpB66AzwTaIg6CLSbtjcxc8fqcySfnTkccA==} - dev: true - - /secp256k1@4.0.3: - resolution: {integrity: sha512-NLZVf+ROMxwtEj3Xa562qgv2BK5e2WNmXPiOdVIPLgs6lyTzMvBq0aWTYMI5XCP9jZMVKOcqZLw/Wc4vDkuxhA==} - engines: {node: '>=10.0.0'} - requiresBuild: true - dependencies: - elliptic: 6.5.5 - node-addon-api: 2.0.2 - node-gyp-build: 4.8.0 - dev: true - - /semver@5.7.2: - resolution: {integrity: sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==} - hasBin: true - dev: true - - /semver@6.3.1: - resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} - hasBin: true - dev: true - - /semver@7.6.0: - resolution: {integrity: sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==} - engines: {node: '>=10'} - hasBin: true - dependencies: - lru-cache: 6.0.0 - dev: true - - /send@0.18.0: - resolution: {integrity: sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==} - engines: {node: '>= 0.8.0'} - dependencies: - debug: 2.6.9 - depd: 2.0.0 - destroy: 1.2.0 - encodeurl: 1.0.2 - escape-html: 1.0.3 - etag: 1.8.1 - fresh: 0.5.2 - http-errors: 2.0.0 - mime: 1.6.0 - ms: 2.1.3 - on-finished: 2.4.1 - range-parser: 1.2.1 - statuses: 2.0.1 - transitivePeerDependencies: - - supports-color - dev: true - - /sentence-case@2.1.1: - resolution: {integrity: sha512-ENl7cYHaK/Ktwk5OTD+aDbQ3uC8IByu/6Bkg+HDv8Mm+XnBnppVNalcfJTNsp1ibstKh030/JKQQWglDvtKwEQ==} - dependencies: - no-case: 2.3.2 - upper-case-first: 1.1.2 - dev: true - - /serialize-javascript@6.0.0: - resolution: {integrity: sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag==} - dependencies: - randombytes: 2.1.0 - dev: true - - /serve-static@1.15.0: - resolution: {integrity: sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==} - engines: {node: '>= 0.8.0'} - dependencies: - encodeurl: 1.0.2 - escape-html: 1.0.3 - parseurl: 1.3.3 - send: 0.18.0 - transitivePeerDependencies: - - supports-color - dev: true - - /servify@0.1.12: - resolution: {integrity: sha512-/xE6GvsKKqyo1BAY+KxOWXcLpPsUUyji7Qg3bVD7hh1eRze5bR1uYiuDA/k3Gof1s9BTzQZEJK8sNcNGFIzeWw==} - engines: {node: '>=6'} - dependencies: - body-parser: 1.20.2 - cors: 2.8.5 - express: 4.18.3 - request: 2.88.2 - xhr: 2.6.0 - transitivePeerDependencies: - - supports-color - dev: true - - /set-blocking@2.0.0: - resolution: {integrity: sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==} - dev: true - - /set-function-length@1.2.2: - resolution: {integrity: sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==} - engines: {node: '>= 0.4'} - dependencies: - define-data-property: 1.1.4 - es-errors: 1.3.0 - function-bind: 1.1.2 - get-intrinsic: 1.2.4 - gopd: 1.0.1 - has-property-descriptors: 1.0.2 - dev: true - - /setimmediate@1.0.4: - resolution: {integrity: sha512-/TjEmXQVEzdod/FFskf3o7oOAsGhHf2j1dZqRFbDzq4F3mvvxflIIi4Hd3bLQE9y/CpwqfSQam5JakI/mi3Pog==} - dev: true - - /setimmediate@1.0.5: - resolution: {integrity: sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==} - dev: true - - /setprototypeof@1.2.0: - resolution: {integrity: sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==} - dev: true - - /sha.js@2.4.11: - resolution: {integrity: sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==} - hasBin: true - dependencies: - inherits: 2.0.4 - safe-buffer: 5.2.1 - dev: true - - /sha1@1.1.1: - resolution: {integrity: sha512-dZBS6OrMjtgVkopB1Gmo4RQCDKiZsqcpAQpkV/aaj+FCrCg8r4I4qMkDPQjBgLIxlmu9k4nUbWq6ohXahOneYA==} - dependencies: - charenc: 0.0.2 - crypt: 0.0.2 - dev: true - - /sha3@2.1.4: - resolution: {integrity: sha512-S8cNxbyb0UGUM2VhRD4Poe5N58gJnJsLJ5vC7FYWGUmGhcsj4++WaIOBFVDxlG0W3To6xBuiRh+i0Qp2oNCOtg==} - dependencies: - buffer: 6.0.3 - dev: true - - /shelljs@0.8.5: - resolution: {integrity: sha512-TiwcRcrkhHvbrZbnRcFYMLl30Dfov3HKqzp5tO5b4pt6G/SezKcYhmDg15zXVBswHmctSAQKznqNW2LO5tTDow==} - engines: {node: '>=4'} - hasBin: true - dependencies: - glob: 7.2.3 - interpret: 1.4.0 - rechoir: 0.6.2 - dev: true - - /side-channel@1.0.6: - resolution: {integrity: sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==} - engines: {node: '>= 0.4'} - dependencies: - call-bind: 1.0.7 - es-errors: 1.3.0 - get-intrinsic: 1.2.4 - object-inspect: 1.13.1 - dev: true - - /simple-concat@1.0.1: - resolution: {integrity: sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==} - dev: true - - /simple-get@2.8.2: - resolution: {integrity: sha512-Ijd/rV5o+mSBBs4F/x9oDPtTx9Zb6X9brmnXvMW4J7IR15ngi9q5xxqWBKU744jTZiaXtxaPL7uHG6vtN8kUkw==} - dependencies: - decompress-response: 3.3.0 - once: 1.4.0 - simple-concat: 1.0.1 - dev: true - - /slash@3.0.0: - resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==} - engines: {node: '>=8'} - dev: true - - /slash@4.0.0: - resolution: {integrity: sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew==} - engines: {node: '>=12'} - dev: true - - /slice-ansi@4.0.0: - resolution: {integrity: sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==} - engines: {node: '>=10'} - dependencies: - ansi-styles: 4.3.0 - astral-regex: 2.0.0 - is-fullwidth-code-point: 3.0.0 - dev: true - - /snake-case@2.1.0: - resolution: {integrity: sha512-FMR5YoPFwOLuh4rRz92dywJjyKYZNLpMn1R5ujVpIYkbA9p01fq8RMg0FkO4M+Yobt4MjHeLTJVm5xFFBHSV2Q==} - dependencies: - no-case: 2.3.2 - dev: true - - /solc@0.4.26: - resolution: {integrity: sha512-o+c6FpkiHd+HPjmjEVpQgH7fqZ14tJpXhho+/bQXlXbliLIS/xjXb42Vxh+qQY1WCSTMQ0+a5vR9vi0MfhU6mA==} - hasBin: true - dependencies: - fs-extra: 0.30.0 - memorystream: 0.3.1 - require-from-string: 1.2.1 - semver: 5.7.2 - yargs: 4.8.1 - dev: true - - /solc@0.7.3(debug@4.3.4): - resolution: {integrity: sha512-GAsWNAjGzIDg7VxzP6mPjdurby3IkGCjQcM8GFYZT6RyaoUZKmMU6Y7YwG+tFGhv7dwZ8rmR4iwFDrrD99JwqA==} - engines: {node: '>=8.0.0'} - hasBin: true - dependencies: - command-exists: 1.2.9 - commander: 3.0.2 - follow-redirects: 1.15.5(debug@4.3.4) - fs-extra: 0.30.0 - js-sha3: 0.8.0 - memorystream: 0.3.1 - require-from-string: 2.0.2 - semver: 5.7.2 - tmp: 0.0.33 - transitivePeerDependencies: - - debug - dev: true - - /solidity-coverage@0.8.11(hardhat@2.21.0): - resolution: {integrity: sha512-yy0Yk+olovBbXn0Me8BWULmmv7A69ZKkP5aTOJGOO8u61Tu2zS989erfjtFlUjDnfWtxRAVkd8BsQD704yLWHw==} - hasBin: true - peerDependencies: - hardhat: ^2.11.0 - dependencies: - '@ethersproject/abi': 5.7.0 - '@solidity-parser/parser': 0.18.0 - chalk: 2.4.2 - death: 1.1.0 - difflib: 0.2.4 - fs-extra: 8.1.0 - ghost-testrpc: 0.0.2 - global-modules: 2.0.0 - globby: 10.0.2 - hardhat: 2.21.0(ts-node@10.9.2)(typescript@5.4.2) - jsonschema: 1.4.1 - lodash: 4.17.21 - mocha: 10.3.0 - node-emoji: 1.11.0 - pify: 4.0.1 - recursive-readdir: 2.2.3 - sc-istanbul: 0.4.6 - semver: 7.6.0 - shelljs: 0.8.5 - web3-utils: 1.10.4 - dev: true - - /source-map-support@0.5.21: - resolution: {integrity: sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==} - dependencies: - buffer-from: 1.1.2 - source-map: 0.6.1 - dev: true - - /source-map@0.2.0: - resolution: {integrity: sha512-CBdZ2oa/BHhS4xj5DlhjWNHcan57/5YuvfdLf17iVmIpd9KRm+DFLmC6nBNj+6Ua7Kt3TmOjDpQT1aTYOQtoUA==} - engines: {node: '>=0.8.0'} - requiresBuild: true - dependencies: - amdefine: 1.0.1 - dev: true - optional: true - - /source-map@0.6.1: - resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} - engines: {node: '>=0.10.0'} - dev: true - - /spdx-correct@3.2.0: - resolution: {integrity: sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==} - dependencies: - spdx-expression-parse: 3.0.1 - spdx-license-ids: 3.0.17 - dev: true - - /spdx-exceptions@2.5.0: - resolution: {integrity: sha512-PiU42r+xO4UbUS1buo3LPJkjlO7430Xn5SVAhdpzzsPHsjbYVflnnFdATgabnLude+Cqu25p6N+g2lw/PFsa4w==} - dev: true - - /spdx-expression-parse@3.0.1: - resolution: {integrity: sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==} - dependencies: - spdx-exceptions: 2.5.0 - spdx-license-ids: 3.0.17 - dev: true - - /spdx-license-ids@3.0.17: - resolution: {integrity: sha512-sh8PWc/ftMqAAdFiBu6Fy6JUOYjqDJBJvIhpfDMyHrr0Rbp5liZqd4TjtQ/RgfLjKFZb+LMx5hpml5qOWy0qvg==} - dev: true - - /split@0.3.3: - resolution: {integrity: sha512-wD2AeVmxXRBoX44wAycgjVpMhvbwdI2aZjCkvfNcH1YqHQvJVa1duWc73OyVGJUc05fhFaTZeQ/PYsrmyH0JVA==} - dependencies: - through: 2.3.8 - dev: true - - /sprintf-js@1.0.3: - resolution: {integrity: sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==} - dev: true - - /sshpk@1.18.0: - resolution: {integrity: sha512-2p2KJZTSqQ/I3+HX42EpYOa2l3f8Erv8MWKsy2I9uf4wA7yFIkXRffYdsx86y6z4vHtV8u7g+pPlr8/4ouAxsQ==} - engines: {node: '>=0.10.0'} - hasBin: true - dependencies: - asn1: 0.2.6 - assert-plus: 1.0.0 - bcrypt-pbkdf: 1.0.2 - dashdash: 1.14.1 - ecc-jsbn: 0.1.2 - getpass: 0.1.7 - jsbn: 0.1.1 - safer-buffer: 2.1.2 - tweetnacl: 0.14.5 - dev: true - - /stacktrace-parser@0.1.10: - resolution: {integrity: sha512-KJP1OCML99+8fhOHxwwzyWrlUuVX5GQ0ZpJTd1DFXhdkrvg1szxfHhawXUZ3g9TkXORQd4/WG68jMlQZ2p8wlg==} - engines: {node: '>=6'} - dependencies: - type-fest: 0.7.1 - dev: true - - /statuses@2.0.1: - resolution: {integrity: sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==} - engines: {node: '>= 0.8'} - dev: true - - /stream-combiner@0.0.4: - resolution: {integrity: sha512-rT00SPnTVyRsaSz5zgSPma/aHSOic5U1prhYdRy5HS2kTZviFpmDgzilbtsJsxiroqACmayynDN/9VzIbX5DOw==} - dependencies: - duplexer: 0.1.2 - dev: true - - /strict-uri-encode@1.1.0: - resolution: {integrity: sha512-R3f198pcvnB+5IpnBlRkphuE9n46WyVl8I39W/ZUTZLz4nqSP/oLYUrcnJrw462Ds8he4YKMov2efsTIw1BDGQ==} - engines: {node: '>=0.10.0'} - dev: true - - /string-format@2.0.0: - resolution: {integrity: sha512-bbEs3scLeYNXLecRRuk6uJxdXUSj6le/8rNPHChIJTn2V79aXVTR1EH2OH5zLKKoz0V02fOUKZZcw01pLUShZA==} - dev: true - - /string-width@1.0.2: - resolution: {integrity: sha512-0XsVpQLnVCXHJfyEs8tC0zpTVIr5PKKsQtkT29IwupnPTjtPmQ3xT/4yCREF9hYkV/3M3kzcUTSAZT6a6h81tw==} - engines: {node: '>=0.10.0'} - dependencies: - code-point-at: 1.1.0 - is-fullwidth-code-point: 1.0.0 - strip-ansi: 3.0.1 - dev: true - - /string-width@2.1.1: - resolution: {integrity: sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==} - engines: {node: '>=4'} - dependencies: - is-fullwidth-code-point: 2.0.0 - strip-ansi: 4.0.0 - dev: true - - /string-width@4.2.3: - resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} - engines: {node: '>=8'} - dependencies: - emoji-regex: 8.0.0 - is-fullwidth-code-point: 3.0.0 - strip-ansi: 6.0.1 - dev: true - - /string_decoder@1.1.1: - resolution: {integrity: sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==} - dependencies: - safe-buffer: 5.1.2 - dev: true - - /string_decoder@1.3.0: - resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==} - dependencies: - safe-buffer: 5.2.1 - dev: true - - /strip-ansi@3.0.1: - resolution: {integrity: sha512-VhumSSbBqDTP8p2ZLKj40UjBCV4+v8bUSEpUb4KjRgWk9pbqGF4REFj6KEagidb2f/M6AzC0EmFyDNGaw9OCzg==} - engines: {node: '>=0.10.0'} - dependencies: - ansi-regex: 2.1.1 - dev: true - - /strip-ansi@4.0.0: - resolution: {integrity: sha512-4XaJ2zQdCzROZDivEVIDPkcQn8LMFSa8kj8Gxb/Lnwzv9A8VctNZ+lfivC/sV3ivW8ElJTERXZoPBRrZKkNKow==} - engines: {node: '>=4'} - dependencies: - ansi-regex: 3.0.1 - dev: true - - /strip-ansi@6.0.1: - resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} - engines: {node: '>=8'} - dependencies: - ansi-regex: 5.0.1 - dev: true - - /strip-bom@2.0.0: - resolution: {integrity: sha512-kwrX1y7czp1E69n2ajbG65mIo9dqvJ+8aBQXOGVxqwvNbsXdFM6Lq37dLAY3mknUwru8CfcCbfOLL/gMo+fi3g==} - engines: {node: '>=0.10.0'} - dependencies: - is-utf8: 0.2.1 - dev: true - - /strip-hex-prefix@1.0.0: - resolution: {integrity: sha512-q8d4ue7JGEiVcypji1bALTos+0pWtyGlivAWyPuTkHzuTCJqrK9sWxYQZUq6Nq3cuyv3bm734IhHvHtGGURU6A==} - engines: {node: '>=6.5.0', npm: '>=3'} - dependencies: - is-hex-prefixed: 1.0.0 - dev: true - - /strip-indent@2.0.0: - resolution: {integrity: sha512-RsSNPLpq6YUL7QYy44RnPVTn/lcVZtb48Uof3X5JLbF4zD/Gs7ZFDv2HWol+leoQN2mT86LAzSshGfkTlSOpsA==} - engines: {node: '>=4'} - dev: true - - /strip-json-comments@3.1.1: - resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} - engines: {node: '>=8'} - dev: true - - /supports-color@3.2.3: - resolution: {integrity: sha512-Jds2VIYDrlp5ui7t8abHN2bjAu4LV/q4N2KivFPpGH0lrka0BMq/33AmECUXlKPcHigkNaqfXRENFju+rlcy+A==} - engines: {node: '>=0.8.0'} - dependencies: - has-flag: 1.0.0 - dev: true - - /supports-color@5.5.0: - resolution: {integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==} - engines: {node: '>=4'} - dependencies: - has-flag: 3.0.0 - dev: true - - /supports-color@7.2.0: - resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} - engines: {node: '>=8'} - dependencies: - has-flag: 4.0.0 - dev: true - - /supports-color@8.1.1: - resolution: {integrity: sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==} - engines: {node: '>=10'} - dependencies: - has-flag: 4.0.0 - dev: true - - /supports-preserve-symlinks-flag@1.0.0: - resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} - engines: {node: '>= 0.4'} - dev: true - - /swap-case@1.1.2: - resolution: {integrity: sha512-BAmWG6/bx8syfc6qXPprof3Mn5vQgf5dwdUNJhsNqU9WdPt5P+ES/wQ5bxfijy8zwZgZZHslC3iAsxsuQMCzJQ==} - dependencies: - lower-case: 1.1.4 - upper-case: 1.1.3 - dev: true - - /swarm-js@0.1.42: - resolution: {integrity: sha512-BV7c/dVlA3R6ya1lMlSSNPLYrntt0LUq4YMgy3iwpCIc6rZnS5W2wUoctarZ5pXlpKtxDDf9hNziEkcfrxdhqQ==} - dependencies: - bluebird: 3.7.2 - buffer: 5.7.1 - eth-lib: 0.1.29 - fs-extra: 4.0.3 - got: 11.8.6 - mime-types: 2.1.35 - mkdirp-promise: 5.0.1 - mock-fs: 4.14.0 - setimmediate: 1.0.5 - tar: 4.4.19 - xhr-request: 1.1.0 - transitivePeerDependencies: - - bufferutil - - supports-color - - utf-8-validate - dev: true - - /sync-request@6.1.0: - resolution: {integrity: sha512-8fjNkrNlNCrVc/av+Jn+xxqfCjYaBoHqCsDz6mt030UMxJGr+GSfCV1dQt2gRtlL63+VPidwDVLr7V2OcTSdRw==} - engines: {node: '>=8.0.0'} - dependencies: - http-response-object: 3.0.2 - sync-rpc: 1.3.6 - then-request: 6.0.2 - dev: true - - /sync-rpc@1.3.6: - resolution: {integrity: sha512-J8jTXuZzRlvU7HemDgHi3pGnh/rkoqR/OZSjhTyyZrEkkYQbk7Z33AXp37mkPfPpfdOuj7Ex3H/TJM1z48uPQw==} - dependencies: - get-port: 3.2.0 - dev: true - - /table-layout@1.0.2: - resolution: {integrity: sha512-qd/R7n5rQTRFi+Zf2sk5XVVd9UQl6ZkduPFC3S7WEGJAmetDTjY3qPN50eSKzwuzEyQKy5TN2TiZdkIjos2L6A==} - engines: {node: '>=8.0.0'} - dependencies: - array-back: 4.0.2 - deep-extend: 0.6.0 - typical: 5.2.0 - wordwrapjs: 4.0.1 - dev: true - - /table@6.8.1: - resolution: {integrity: sha512-Y4X9zqrCftUhMeH2EptSSERdVKt/nEdijTOacGD/97EKjhQ/Qs8RTlEGABSJNNN8lac9kheH+af7yAkEWlgneA==} - engines: {node: '>=10.0.0'} - dependencies: - ajv: 8.12.0 - lodash.truncate: 4.4.2 - slice-ansi: 4.0.0 - string-width: 4.2.3 - strip-ansi: 6.0.1 - dev: true - - /tar@4.4.19: - resolution: {integrity: sha512-a20gEsvHnWe0ygBY8JbxoM4w3SJdhc7ZAuxkLqh+nvNQN2IOt0B5lLgM490X5Hl8FF0dl0tOf2ewFYAlIFgzVA==} - engines: {node: '>=4.5'} - dependencies: - chownr: 1.1.4 - fs-minipass: 1.2.7 - minipass: 2.9.0 - minizlib: 1.3.3 - mkdirp: 0.5.6 - safe-buffer: 5.2.1 - yallist: 3.1.1 - dev: true - - /testrpc@0.0.1: - resolution: {integrity: sha512-afH1hO+SQ/VPlmaLUFj2636QMeDvPCeQMc/9RBMW0IfjNe9gFD9Ra3ShqYkB7py0do1ZcCna/9acHyzTJ+GcNA==} - deprecated: testrpc has been renamed to ganache-cli, please use this package from now on. - dev: true - - /then-request@6.0.2: - resolution: {integrity: sha512-3ZBiG7JvP3wbDzA9iNY5zJQcHL4jn/0BWtXIkagfz7QgOL/LqjCEOBQuJNZfu0XYnv5JhKh+cDxCPM4ILrqruA==} - engines: {node: '>=6.0.0'} - dependencies: - '@types/concat-stream': 1.6.1 - '@types/form-data': 0.0.33 - '@types/node': 8.10.66 - '@types/qs': 6.9.12 - caseless: 0.12.0 - concat-stream: 1.6.2 - form-data: 2.5.1 - http-basic: 8.1.3 - http-response-object: 3.0.2 - promise: 8.3.0 - qs: 6.12.0 - dev: true - - /through@2.3.8: - resolution: {integrity: sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==} - dev: true - - /timed-out@4.0.1: - resolution: {integrity: sha512-G7r3AhovYtr5YKOWQkta8RKAPb+J9IsO4uVmzjl8AZwfhs8UcUwTiD6gcJYSgOtzyjvQKrKYn41syHbUWMkafA==} - engines: {node: '>=0.10.0'} - dev: true - - /title-case@2.1.1: - resolution: {integrity: sha512-EkJoZ2O3zdCz3zJsYCsxyq2OC5hrxR9mfdd5I+w8h/tmFfeOxJ+vvkxsKxdmN0WtS9zLdHEgfgVOiMVgv+Po4Q==} - dependencies: - no-case: 2.3.2 - upper-case: 1.1.3 - dev: true - - /tmp@0.0.33: - resolution: {integrity: sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==} - engines: {node: '>=0.6.0'} - dependencies: - os-tmpdir: 1.0.2 - dev: true - - /to-regex-range@5.0.1: - resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} - engines: {node: '>=8.0'} - dependencies: - is-number: 7.0.0 - dev: true - - /toidentifier@1.0.1: - resolution: {integrity: sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==} - engines: {node: '>=0.6'} - dev: true - - /tough-cookie@2.5.0: - resolution: {integrity: sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==} - engines: {node: '>=0.8'} - dependencies: - psl: 1.9.0 - punycode: 2.3.1 - dev: true - - /tr46@0.0.3: - resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==} - dev: true - - /ts-command-line-args@2.5.1: - resolution: {integrity: sha512-H69ZwTw3rFHb5WYpQya40YAX2/w7Ut75uUECbgBIsLmM+BNuYnxsltfyyLMxy6sEeKxgijLTnQtLd0nKd6+IYw==} - hasBin: true - dependencies: - chalk: 4.1.2 - command-line-args: 5.2.1 - command-line-usage: 6.1.3 - string-format: 2.0.0 - dev: true - - /ts-essentials@7.0.3(typescript@5.4.2): - resolution: {integrity: sha512-8+gr5+lqO3G84KdiTSMRLtuyJ+nTBVRKuCrK4lidMPdVeEp0uqC875uE5NMcaA7YYMN7XsNiFQuMvasF8HT/xQ==} - peerDependencies: - typescript: '>=3.7.0' - dependencies: - typescript: 5.4.2 - dev: true - - /ts-node@10.9.2(@types/node@20.11.26)(typescript@5.4.2): - resolution: {integrity: sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ==} - hasBin: true - peerDependencies: - '@swc/core': '>=1.2.50' - '@swc/wasm': '>=1.2.50' - '@types/node': '*' - typescript: '>=2.7' - peerDependenciesMeta: - '@swc/core': - optional: true - '@swc/wasm': - optional: true - dependencies: - '@cspotcode/source-map-support': 0.8.1 - '@tsconfig/node10': 1.0.9 - '@tsconfig/node12': 1.0.11 - '@tsconfig/node14': 1.0.3 - '@tsconfig/node16': 1.0.4 - '@types/node': 20.11.26 - acorn: 8.11.3 - acorn-walk: 8.3.2 - arg: 4.1.3 - create-require: 1.1.1 - diff: 4.0.2 - make-error: 1.3.6 - typescript: 5.4.2 - v8-compile-cache-lib: 3.0.1 - yn: 3.1.1 - dev: true - - /tslib@1.14.1: - resolution: {integrity: sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==} - dev: true - - /tsort@0.0.1: - resolution: {integrity: sha512-Tyrf5mxF8Ofs1tNoxA13lFeZ2Zrbd6cKbuH3V+MQ5sb6DtBj5FjrXVsRWT8YvNAQTqNoz66dz1WsbigI22aEnw==} - dev: true - - /tsx@4.7.2: - resolution: {integrity: sha512-BCNd4kz6fz12fyrgCTEdZHGJ9fWTGeUzXmQysh0RVocDY3h4frk05ZNCXSy4kIenF7y/QnrdiVpTsyNRn6vlAw==} - engines: {node: '>=18.0.0'} - hasBin: true - dependencies: - esbuild: 0.19.12 - get-tsconfig: 4.7.3 - optionalDependencies: - fsevents: 2.3.3 - dev: true - - /tunnel-agent@0.6.0: - resolution: {integrity: sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==} - dependencies: - safe-buffer: 5.2.1 - dev: true - - /tweetnacl-util@0.15.1: - resolution: {integrity: sha512-RKJBIj8lySrShN4w6i/BonWp2Z/uxwC3h4y7xsRrpP59ZboCd0GpEVsOnMDYLMmKBpYhb5TgHzZXy7wTfYFBRw==} - dev: true - - /tweetnacl@0.14.5: - resolution: {integrity: sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA==} - dev: true - - /tweetnacl@1.0.3: - resolution: {integrity: sha512-6rt+RN7aOi1nGMyC4Xa5DdYiukl2UWCbcJft7YhxReBGQD7OAM8Pbxw6YMo4r2diNEA8FEmu32YOn9rhaiE5yw==} - dev: true - - /type-check@0.3.2: - resolution: {integrity: sha512-ZCmOJdvOWDBYJlzAoFkC+Q0+bUyEOS1ltgp1MGU03fqHG+dbi9tBFU2Rd9QKiDZFAYrhPh2JUf7rZRIuHRKtOg==} - engines: {node: '>= 0.8.0'} - dependencies: - prelude-ls: 1.1.2 - dev: true - - /type-detect@4.0.8: - resolution: {integrity: sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==} - engines: {node: '>=4'} - dev: true - - /type-fest@0.20.2: - resolution: {integrity: sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==} - engines: {node: '>=10'} - dev: true - - /type-fest@0.21.3: - resolution: {integrity: sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==} - engines: {node: '>=10'} - dev: true - - /type-fest@0.7.1: - resolution: {integrity: sha512-Ne2YiiGN8bmrmJJEuTWTLJR32nh/JdL1+PSicowtNb0WFpn59GK8/lfD61bVtzguz7b3PBt74nxpv/Pw5po5Rg==} - engines: {node: '>=8'} - dev: true - - /type-is@1.6.18: - resolution: {integrity: sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==} - engines: {node: '>= 0.6'} - dependencies: - media-typer: 0.3.0 - mime-types: 2.1.35 - dev: true - - /type@2.7.2: - resolution: {integrity: sha512-dzlvlNlt6AXU7EBSfpAscydQ7gXB+pPGsPnfJnZpiNJBDj7IaJzQlBZYGdEi4R9HmPdBv2XmWJ6YUtoTa7lmCw==} - dev: true - - /typechain@8.3.2(typescript@5.4.2): - resolution: {integrity: sha512-x/sQYr5w9K7yv3es7jo4KTX05CLxOf7TRWwoHlrjRh8H82G64g+k7VuWPJlgMo6qrjfCulOdfBjiaDtmhFYD/Q==} - hasBin: true - peerDependencies: - typescript: '>=4.3.0' - dependencies: - '@types/prettier': 2.7.3 - debug: 4.3.4(supports-color@8.1.1) - fs-extra: 7.0.1 - glob: 7.1.7 - js-sha3: 0.8.0 - lodash: 4.17.21 - mkdirp: 1.0.4 - prettier: 2.8.8 - ts-command-line-args: 2.5.1 - ts-essentials: 7.0.3(typescript@5.4.2) - typescript: 5.4.2 - transitivePeerDependencies: - - supports-color - dev: true - - /typedarray-to-buffer@3.1.5: - resolution: {integrity: sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==} - dependencies: - is-typedarray: 1.0.0 - dev: true - - /typedarray@0.0.6: - resolution: {integrity: sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==} - dev: true - - /typescript@5.4.2: - resolution: {integrity: sha512-+2/g0Fds1ERlP6JsakQQDXjZdZMM+rqpamFZJEKh4kwTIn3iDkgKtby0CeNd5ATNZ4Ry1ax15TMx0W2V+miizQ==} - engines: {node: '>=14.17'} - hasBin: true - dev: true - - /typical@4.0.0: - resolution: {integrity: sha512-VAH4IvQ7BDFYglMd7BPRDfLgxZZX4O4TFcRDA6EN5X7erNJJq+McIEp8np9aVtxrCJ6qx4GTYVfOWNjcqwZgRw==} - engines: {node: '>=8'} - dev: true - - /typical@5.2.0: - resolution: {integrity: sha512-dvdQgNDNJo+8B2uBQoqdb11eUCE1JQXhvjC/CZtgvZseVd5TYMXnq0+vuUemXbd/Se29cTaUuPX3YIc2xgbvIg==} - engines: {node: '>=8'} - dev: true - - /uglify-js@3.17.4: - resolution: {integrity: sha512-T9q82TJI9e/C1TAxYvfb16xO120tMVFZrGA3f9/P4424DNu6ypK103y0GPFVa17yotwSyZW5iYXgjYHkGrJW/g==} - engines: {node: '>=0.8.0'} - hasBin: true - requiresBuild: true - dev: true - optional: true - - /ultron@1.1.1: - resolution: {integrity: sha512-UIEXBNeYmKptWH6z8ZnqTeS8fV74zG0/eRU9VGkpzz+LIJNs8W/zM/L+7ctCkRrgbNnnR0xxw4bKOr0cW0N0Og==} - dev: true - - /underscore@1.13.6: - resolution: {integrity: sha512-+A5Sja4HP1M08MaXya7p5LvjuM7K6q/2EaC0+iovj/wOcMsTzMvDFbasi/oSapiwOlt252IqsKqPjCl7huKS0A==} - dev: true - - /undici-types@5.26.5: - resolution: {integrity: sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==} - dev: true - - /undici@5.28.3: - resolution: {integrity: sha512-3ItfzbrhDlINjaP0duwnNsKpDQk3acHI3gVJ1z4fmwMK31k5G9OVIAMLSIaP6w4FaGkaAkN6zaQO9LUvZ1t7VA==} - engines: {node: '>=14.0'} - dependencies: - '@fastify/busboy': 2.1.1 - dev: true - - /universalify@0.1.2: - resolution: {integrity: sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==} - engines: {node: '>= 4.0.0'} - dev: true - - /universalify@2.0.1: - resolution: {integrity: sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==} - engines: {node: '>= 10.0.0'} - dev: true - - /unpipe@1.0.0: - resolution: {integrity: sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==} - engines: {node: '>= 0.8'} - dev: true - - /upper-case-first@1.1.2: - resolution: {integrity: sha512-wINKYvI3Db8dtjikdAqoBbZoP6Q+PZUyfMR7pmwHzjC2quzSkUq5DmPrTtPEqHaz8AGtmsB4TqwapMTM1QAQOQ==} - dependencies: - upper-case: 1.1.3 - dev: true - - /upper-case@1.1.3: - resolution: {integrity: sha512-WRbjgmYzgXkCV7zNVpy5YgrHgbBv126rMALQQMrmzOVC4GM2waQ9x7xtm8VU+1yF2kWyPzI9zbZ48n4vSxwfSA==} - dev: true - - /uri-js@4.4.1: - resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} - dependencies: - punycode: 2.3.1 - dev: true - - /url-set-query@1.0.0: - resolution: {integrity: sha512-3AChu4NiXquPfeckE5R5cGdiHCMWJx1dwCWOmWIL4KHAziJNOFIYJlpGFeKDvwLPHovZRCxK3cYlwzqI9Vp+Gg==} - dev: true - - /utf-8-validate@5.0.10: - resolution: {integrity: sha512-Z6czzLq4u8fPOyx7TU6X3dvUZVvoJmxSQ+IcrlmagKhilxlhZgxPK6C5Jqbkw1IDUmFTM+cz9QDnnLTwDz/2gQ==} - engines: {node: '>=6.14.2'} - requiresBuild: true - dependencies: - node-gyp-build: 4.8.0 - dev: true - - /utf8@3.0.0: - resolution: {integrity: sha512-E8VjFIQ/TyQgp+TZfS6l8yp/xWppSAHzidGiRrqe4bK4XP9pTRyKFgGJpO3SN7zdX4DeomTrwaseCHovfpFcqQ==} - dev: true - - /util-deprecate@1.0.2: - resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} - dev: true - - /util@0.12.5: - resolution: {integrity: sha512-kZf/K6hEIrWHI6XqOFUiiMa+79wE/D8Q+NCNAWclkyg3b4d2k7s0QGepNjiABc+aR3N1PAyHL7p6UcLY6LmrnA==} - dependencies: - inherits: 2.0.4 - is-arguments: 1.1.1 - is-generator-function: 1.0.10 - is-typed-array: 1.1.13 - which-typed-array: 1.1.15 - dev: true - - /utils-merge@1.0.1: - resolution: {integrity: sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==} - engines: {node: '>= 0.4.0'} - dev: true - - /uuid@2.0.1: - resolution: {integrity: sha512-nWg9+Oa3qD2CQzHIP4qKUqwNfzKn8P0LtFhotaCTFchsV7ZfDhAybeip/HZVeMIpZi9JgY1E3nUlwaCmZT1sEg==} - deprecated: Please upgrade to version 7 or higher. Older versions may use Math.random() in certain circumstances, which is known to be problematic. See https://v8.dev/blog/math-random for details. - dev: true - - /uuid@3.4.0: - resolution: {integrity: sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==} - deprecated: Please upgrade to version 7 or higher. Older versions may use Math.random() in certain circumstances, which is known to be problematic. See https://v8.dev/blog/math-random for details. - hasBin: true - dev: true - - /uuid@8.3.2: - resolution: {integrity: sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==} - hasBin: true - dev: true - - /uuid@9.0.1: - resolution: {integrity: sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==} - hasBin: true - dev: true - - /v8-compile-cache-lib@3.0.1: - resolution: {integrity: sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==} - dev: true - - /validate-npm-package-license@3.0.4: - resolution: {integrity: sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==} - dependencies: - spdx-correct: 3.2.0 - spdx-expression-parse: 3.0.1 - dev: true - - /varint@5.0.2: - resolution: {integrity: sha512-lKxKYG6H03yCZUpAGOPOsMcGxd1RHCu1iKvEHYDPmTyq2HueGhD73ssNBqqQWfvYs04G9iUFRvmAVLW20Jw6ow==} - dev: true - - /vary@1.1.2: - resolution: {integrity: sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==} - engines: {node: '>= 0.8'} - dev: true - - /verror@1.10.0: - resolution: {integrity: sha512-ZZKSmDAEFOijERBLkmYfJ+vmk3w+7hOLYDNkRCuRuMJGEmqYNCNLyBBFwWKVMhfwaEF3WOd0Zlw86U/WC/+nYw==} - engines: {'0': node >=0.6.0} - dependencies: - assert-plus: 1.0.0 - core-util-is: 1.0.2 - extsprintf: 1.3.0 - dev: true - - /web-streams-polyfill@3.3.3: - resolution: {integrity: sha512-d2JWLCivmZYTSIoge9MsgFCZrt571BikcWGYkjC1khllbTeDlGqZ2D8vD8E/lJa8WGWbb7Plm8/XJYV7IJHZZw==} - engines: {node: '>= 8'} - dev: true - - /web3-bzz@1.10.0: - resolution: {integrity: sha512-o9IR59io3pDUsXTsps5pO5hW1D5zBmg46iNc2t4j2DkaYHNdDLwk2IP9ukoM2wg47QILfPEJYzhTfkS/CcX0KA==} - engines: {node: '>=8.0.0'} - requiresBuild: true - dependencies: - '@types/node': 12.20.55 - got: 12.1.0 - swarm-js: 0.1.42 - transitivePeerDependencies: - - bufferutil - - supports-color - - utf-8-validate - dev: true - - /web3-bzz@1.10.4: - resolution: {integrity: sha512-ZZ/X4sJ0Uh2teU9lAGNS8EjveEppoHNQiKlOXAjedsrdWuaMErBPdLQjXfcrYvN6WM6Su9PMsAxf3FXXZ+HwQw==} - engines: {node: '>=8.0.0'} - requiresBuild: true - dependencies: - '@types/node': 12.20.55 - got: 12.1.0 - swarm-js: 0.1.42 - transitivePeerDependencies: - - bufferutil - - supports-color - - utf-8-validate - dev: true - - /web3-core-helpers@1.10.0: - resolution: {integrity: sha512-pIxAzFDS5vnbXvfvLSpaA1tfRykAe9adw43YCKsEYQwH0gCLL0kMLkaCX3q+Q8EVmAh+e1jWL/nl9U0de1+++g==} - engines: {node: '>=8.0.0'} - dependencies: - web3-eth-iban: 1.10.0 - web3-utils: 1.10.0 - dev: true - - /web3-core-helpers@1.10.3: - resolution: {integrity: sha512-Yv7dQC3B9ipOc5sWm3VAz1ys70Izfzb8n9rSiQYIPjpqtJM+3V4EeK6ghzNR6CO2es0+Yu9CtCkw0h8gQhrTxA==} - engines: {node: '>=8.0.0'} - dependencies: - web3-eth-iban: 1.10.3 - web3-utils: 1.10.3 - dev: true - - /web3-core-helpers@1.10.4: - resolution: {integrity: sha512-r+L5ylA17JlD1vwS8rjhWr0qg7zVoVMDvWhajWA5r5+USdh91jRUYosp19Kd1m2vE034v7Dfqe1xYRoH2zvG0g==} - engines: {node: '>=8.0.0'} - dependencies: - web3-eth-iban: 1.10.4 - web3-utils: 1.10.4 - dev: true - - /web3-core-method@1.10.0: - resolution: {integrity: sha512-4R700jTLAMKDMhQ+nsVfIXvH6IGJlJzGisIfMKWAIswH31h5AZz7uDUW2YctI+HrYd+5uOAlS4OJeeT9bIpvkA==} - engines: {node: '>=8.0.0'} - dependencies: - '@ethersproject/transactions': 5.7.0 - web3-core-helpers: 1.10.0 - web3-core-promievent: 1.10.0 - web3-core-subscriptions: 1.10.0 - web3-utils: 1.10.0 - dev: true - - /web3-core-method@1.10.4: - resolution: {integrity: sha512-uZTb7flr+Xl6LaDsyTeE2L1TylokCJwTDrIVfIfnrGmnwLc6bmTWCCrm71sSrQ0hqs6vp/MKbQYIYqUN0J8WyA==} - engines: {node: '>=8.0.0'} - dependencies: - '@ethersproject/transactions': 5.7.0 - web3-core-helpers: 1.10.4 - web3-core-promievent: 1.10.4 - web3-core-subscriptions: 1.10.4 - web3-utils: 1.10.4 - dev: true - - /web3-core-promievent@1.10.0: - resolution: {integrity: sha512-68N7k5LWL5R38xRaKFrTFT2pm2jBNFaM4GioS00YjAKXRQ3KjmhijOMG3TICz6Aa5+6GDWYelDNx21YAeZ4YTg==} - engines: {node: '>=8.0.0'} - dependencies: - eventemitter3: 4.0.4 - dev: true - - /web3-core-promievent@1.10.3: - resolution: {integrity: sha512-HgjY+TkuLm5uTwUtaAfkTgRx/NzMxvVradCi02gy17NxDVdg/p6svBHcp037vcNpkuGeFznFJgULP+s2hdVgUQ==} - engines: {node: '>=8.0.0'} - dependencies: - eventemitter3: 4.0.4 - dev: true - - /web3-core-promievent@1.10.4: - resolution: {integrity: sha512-2de5WnJQ72YcIhYwV/jHLc4/cWJnznuoGTJGD29ncFQHAfwW/MItHFSVKPPA5v8AhJe+r6y4Y12EKvZKjQVBvQ==} - engines: {node: '>=8.0.0'} - dependencies: - eventemitter3: 4.0.4 - dev: true - - /web3-core-requestmanager@1.10.0: - resolution: {integrity: sha512-3z/JKE++Os62APml4dvBM+GAuId4h3L9ckUrj7ebEtS2AR0ixyQPbrBodgL91Sv7j7cQ3Y+hllaluqjguxvSaQ==} - engines: {node: '>=8.0.0'} - dependencies: - util: 0.12.5 - web3-core-helpers: 1.10.0 - web3-providers-http: 1.10.0 - web3-providers-ipc: 1.10.0 - web3-providers-ws: 1.10.0 - transitivePeerDependencies: - - encoding - - supports-color - dev: true - - /web3-core-requestmanager@1.10.4: - resolution: {integrity: sha512-vqP6pKH8RrhT/2MoaU+DY/OsYK9h7HmEBNCdoMj+4ZwujQtw/Mq2JifjwsJ7gits7Q+HWJwx8q6WmQoVZAWugg==} - engines: {node: '>=8.0.0'} - dependencies: - util: 0.12.5 - web3-core-helpers: 1.10.4 - web3-providers-http: 1.10.4 - web3-providers-ipc: 1.10.4 - web3-providers-ws: 1.10.4 - transitivePeerDependencies: - - encoding - - supports-color - dev: true - - /web3-core-subscriptions@1.10.0: - resolution: {integrity: sha512-HGm1PbDqsxejI075gxBc5OSkwymilRWZufIy9zEpnWKNmfbuv5FfHgW1/chtJP6aP3Uq2vHkvTDl3smQBb8l+g==} - engines: {node: '>=8.0.0'} - dependencies: - eventemitter3: 4.0.4 - web3-core-helpers: 1.10.0 - dev: true - - /web3-core-subscriptions@1.10.4: - resolution: {integrity: sha512-o0lSQo/N/f7/L76C0HV63+S54loXiE9fUPfHFcTtpJRQNDBVsSDdWRdePbWwR206XlsBqD5VHApck1//jEafTw==} - engines: {node: '>=8.0.0'} - dependencies: - eventemitter3: 4.0.4 - web3-core-helpers: 1.10.4 - dev: true - - /web3-core@1.10.0: - resolution: {integrity: sha512-fWySwqy2hn3TL89w5TM8wXF1Z2Q6frQTKHWmP0ppRQorEK8NcHJRfeMiv/mQlSKoTS1F6n/nv2uyZsixFycjYQ==} - engines: {node: '>=8.0.0'} - dependencies: - '@types/bn.js': 5.1.5 - '@types/node': 12.20.55 - bignumber.js: 9.1.2 - web3-core-helpers: 1.10.0 - web3-core-method: 1.10.0 - web3-core-requestmanager: 1.10.0 - web3-utils: 1.10.0 - transitivePeerDependencies: - - encoding - - supports-color - dev: true - - /web3-core@1.10.4: - resolution: {integrity: sha512-B6elffYm81MYZDTrat7aEhnhdtVE3lDBUZft16Z8awYMZYJDbnykEbJVS+l3mnA7AQTnSDr/1MjWofGDLBJPww==} - engines: {node: '>=8.0.0'} - dependencies: - '@types/bn.js': 5.1.5 - '@types/node': 12.20.55 - bignumber.js: 9.1.2 - web3-core-helpers: 1.10.4 - web3-core-method: 1.10.4 - web3-core-requestmanager: 1.10.4 - web3-utils: 1.10.4 - transitivePeerDependencies: - - encoding - - supports-color - dev: true - - /web3-eth-abi@1.10.0: - resolution: {integrity: sha512-cwS+qRBWpJ43aI9L3JS88QYPfFcSJJ3XapxOQ4j40v6mk7ATpA8CVK1vGTzpihNlOfMVRBkR95oAj7oL6aiDOg==} - engines: {node: '>=8.0.0'} - dependencies: - '@ethersproject/abi': 5.7.0 - web3-utils: 1.10.0 - dev: true - - /web3-eth-abi@1.10.4: - resolution: {integrity: sha512-cZ0q65eJIkd/jyOlQPDjr8X4fU6CRL1eWgdLwbWEpo++MPU/2P4PFk5ZLAdye9T5Sdp+MomePPJ/gHjLMj2VfQ==} - engines: {node: '>=8.0.0'} - dependencies: - '@ethersproject/abi': 5.7.0 - web3-utils: 1.10.4 - dev: true - - /web3-eth-accounts@1.10.0: - resolution: {integrity: sha512-wiq39Uc3mOI8rw24wE2n15hboLE0E9BsQLdlmsL4Zua9diDS6B5abXG0XhFcoNsXIGMWXVZz4TOq3u4EdpXF/Q==} - engines: {node: '>=8.0.0'} - dependencies: - '@ethereumjs/common': 2.5.0 - '@ethereumjs/tx': 3.3.2 - eth-lib: 0.2.8 - ethereumjs-util: 7.1.5 - scrypt-js: 3.0.1 - uuid: 9.0.1 - web3-core: 1.10.0 - web3-core-helpers: 1.10.0 - web3-core-method: 1.10.0 - web3-utils: 1.10.0 - transitivePeerDependencies: - - encoding - - supports-color - dev: true - - /web3-eth-accounts@1.10.4: - resolution: {integrity: sha512-ysy5sVTg9snYS7tJjxVoQAH6DTOTkRGR8emEVCWNGLGiB9txj+qDvSeT0izjurS/g7D5xlMAgrEHLK1Vi6I3yg==} - engines: {node: '>=8.0.0'} - dependencies: - '@ethereumjs/common': 2.6.5 - '@ethereumjs/tx': 3.5.2 - '@ethereumjs/util': 8.1.0 - eth-lib: 0.2.8 - scrypt-js: 3.0.1 - uuid: 9.0.1 - web3-core: 1.10.4 - web3-core-helpers: 1.10.4 - web3-core-method: 1.10.4 - web3-utils: 1.10.4 - transitivePeerDependencies: - - encoding - - supports-color - dev: true - - /web3-eth-contract@1.10.0: - resolution: {integrity: sha512-MIC5FOzP/+2evDksQQ/dpcXhSqa/2hFNytdl/x61IeWxhh6vlFeSjq0YVTAyIzdjwnL7nEmZpjfI6y6/Ufhy7w==} - engines: {node: '>=8.0.0'} - dependencies: - '@types/bn.js': 5.1.5 - web3-core: 1.10.0 - web3-core-helpers: 1.10.0 - web3-core-method: 1.10.0 - web3-core-promievent: 1.10.0 - web3-core-subscriptions: 1.10.0 - web3-eth-abi: 1.10.0 - web3-utils: 1.10.0 - transitivePeerDependencies: - - encoding - - supports-color - dev: true - - /web3-eth-contract@1.10.4: - resolution: {integrity: sha512-Q8PfolOJ4eV9TvnTj1TGdZ4RarpSLmHnUnzVxZ/6/NiTfe4maJz99R0ISgwZkntLhLRtw0C7LRJuklzGYCNN3A==} - engines: {node: '>=8.0.0'} - dependencies: - '@types/bn.js': 5.1.5 - web3-core: 1.10.4 - web3-core-helpers: 1.10.4 - web3-core-method: 1.10.4 - web3-core-promievent: 1.10.4 - web3-core-subscriptions: 1.10.4 - web3-eth-abi: 1.10.4 - web3-utils: 1.10.4 - transitivePeerDependencies: - - encoding - - supports-color - dev: true - - /web3-eth-ens@1.10.0: - resolution: {integrity: sha512-3hpGgzX3qjgxNAmqdrC2YUQMTfnZbs4GeLEmy8aCWziVwogbuqQZ+Gzdfrym45eOZodk+lmXyLuAdqkNlvkc1g==} - engines: {node: '>=8.0.0'} - dependencies: - content-hash: 2.5.2 - eth-ens-namehash: 2.0.8 - web3-core: 1.10.0 - web3-core-helpers: 1.10.0 - web3-core-promievent: 1.10.0 - web3-eth-abi: 1.10.0 - web3-eth-contract: 1.10.0 - web3-utils: 1.10.0 - transitivePeerDependencies: - - encoding - - supports-color - dev: true - - /web3-eth-ens@1.10.4: - resolution: {integrity: sha512-LLrvxuFeVooRVZ9e5T6OWKVflHPFgrVjJ/jtisRWcmI7KN/b64+D/wJzXqgmp6CNsMQcE7rpmf4CQmJCrTdsgg==} - engines: {node: '>=8.0.0'} - dependencies: - content-hash: 2.5.2 - eth-ens-namehash: 2.0.8 - web3-core: 1.10.4 - web3-core-helpers: 1.10.4 - web3-core-promievent: 1.10.4 - web3-eth-abi: 1.10.4 - web3-eth-contract: 1.10.4 - web3-utils: 1.10.4 - transitivePeerDependencies: - - encoding - - supports-color - dev: true - - /web3-eth-iban@1.10.0: - resolution: {integrity: sha512-0l+SP3IGhInw7Q20LY3IVafYEuufo4Dn75jAHT7c2aDJsIolvf2Lc6ugHkBajlwUneGfbRQs/ccYPQ9JeMUbrg==} - engines: {node: '>=8.0.0'} - dependencies: - bn.js: 5.2.1 - web3-utils: 1.10.0 - dev: true - - /web3-eth-iban@1.10.3: - resolution: {integrity: sha512-ZCfOjYKAjaX2TGI8uif5ah+J3BYFuo+47JOIV1RIz2l7kD9VfnxvRH5UiQDRyMALQC7KFd2hUqIEtHklapNyKA==} - engines: {node: '>=8.0.0'} - dependencies: - bn.js: 5.2.1 - web3-utils: 1.10.3 - dev: true - - /web3-eth-iban@1.10.4: - resolution: {integrity: sha512-0gE5iNmOkmtBmbKH2aTodeompnNE8jEyvwFJ6s/AF6jkw9ky9Op9cqfzS56AYAbrqEFuClsqB/AoRves7LDELw==} - engines: {node: '>=8.0.0'} - dependencies: - bn.js: 5.2.1 - web3-utils: 1.10.4 - dev: true - - /web3-eth-personal@1.10.0: - resolution: {integrity: sha512-anseKn98w/d703eWq52uNuZi7GhQeVjTC5/svrBWEKob0WZ5kPdo+EZoFN0sp5a5ubbrk/E0xSl1/M5yORMtpg==} - engines: {node: '>=8.0.0'} - dependencies: - '@types/node': 12.20.55 - web3-core: 1.10.0 - web3-core-helpers: 1.10.0 - web3-core-method: 1.10.0 - web3-net: 1.10.0 - web3-utils: 1.10.0 - transitivePeerDependencies: - - encoding - - supports-color - dev: true - - /web3-eth-personal@1.10.4: - resolution: {integrity: sha512-BRa/hs6jU1hKHz+AC/YkM71RP3f0Yci1dPk4paOic53R4ZZG4MgwKRkJhgt3/GPuPliwS46f/i5A7fEGBT4F9w==} - engines: {node: '>=8.0.0'} - dependencies: - '@types/node': 12.20.55 - web3-core: 1.10.4 - web3-core-helpers: 1.10.4 - web3-core-method: 1.10.4 - web3-net: 1.10.4 - web3-utils: 1.10.4 - transitivePeerDependencies: - - encoding - - supports-color - dev: true - - /web3-eth@1.10.0: - resolution: {integrity: sha512-Z5vT6slNMLPKuwRyKGbqeGYC87OAy8bOblaqRTgg94CXcn/mmqU7iPIlG4506YdcdK3x6cfEDG7B6w+jRxypKA==} - engines: {node: '>=8.0.0'} - dependencies: - web3-core: 1.10.0 - web3-core-helpers: 1.10.0 - web3-core-method: 1.10.0 - web3-core-subscriptions: 1.10.0 - web3-eth-abi: 1.10.0 - web3-eth-accounts: 1.10.0 - web3-eth-contract: 1.10.0 - web3-eth-ens: 1.10.0 - web3-eth-iban: 1.10.0 - web3-eth-personal: 1.10.0 - web3-net: 1.10.0 - web3-utils: 1.10.0 - transitivePeerDependencies: - - encoding - - supports-color - dev: true - - /web3-eth@1.10.4: - resolution: {integrity: sha512-Sql2kYKmgt+T/cgvg7b9ce24uLS7xbFrxE4kuuor1zSCGrjhTJ5rRNG8gTJUkAJGKJc7KgnWmgW+cOfMBPUDSA==} - engines: {node: '>=8.0.0'} - dependencies: - web3-core: 1.10.4 - web3-core-helpers: 1.10.4 - web3-core-method: 1.10.4 - web3-core-subscriptions: 1.10.4 - web3-eth-abi: 1.10.4 - web3-eth-accounts: 1.10.4 - web3-eth-contract: 1.10.4 - web3-eth-ens: 1.10.4 - web3-eth-iban: 1.10.4 - web3-eth-personal: 1.10.4 - web3-net: 1.10.4 - web3-utils: 1.10.4 - transitivePeerDependencies: - - encoding - - supports-color - dev: true - - /web3-net@1.10.0: - resolution: {integrity: sha512-NLH/N3IshYWASpxk4/18Ge6n60GEvWBVeM8inx2dmZJVmRI6SJIlUxbL8jySgiTn3MMZlhbdvrGo8fpUW7a1GA==} - engines: {node: '>=8.0.0'} - dependencies: - web3-core: 1.10.0 - web3-core-method: 1.10.0 - web3-utils: 1.10.0 - transitivePeerDependencies: - - encoding - - supports-color - dev: true - - /web3-net@1.10.4: - resolution: {integrity: sha512-mKINnhOOnZ4koA+yV2OT5s5ztVjIx7IY9a03w6s+yao/BUn+Luuty0/keNemZxTr1E8Ehvtn28vbOtW7Ids+Ow==} - engines: {node: '>=8.0.0'} - dependencies: - web3-core: 1.10.4 - web3-core-method: 1.10.4 - web3-utils: 1.10.4 - transitivePeerDependencies: - - encoding - - supports-color - dev: true - - /web3-providers-http@1.10.0: - resolution: {integrity: sha512-eNr965YB8a9mLiNrkjAWNAPXgmQWfpBfkkn7tpEFlghfww0u3I0tktMZiaToJVcL2+Xq+81cxbkpeWJ5XQDwOA==} - engines: {node: '>=8.0.0'} - dependencies: - abortcontroller-polyfill: 1.7.5 - cross-fetch: 3.1.8 - es6-promise: 4.2.8 - web3-core-helpers: 1.10.0 - transitivePeerDependencies: - - encoding - dev: true - - /web3-providers-http@1.10.4: - resolution: {integrity: sha512-m2P5Idc8hdiO0l60O6DSCPw0kw64Zgi0pMjbEFRmxKIck2Py57RQMu4bxvkxJwkF06SlGaEQF8rFZBmuX7aagQ==} - engines: {node: '>=8.0.0'} - dependencies: - abortcontroller-polyfill: 1.7.5 - cross-fetch: 4.0.0 - es6-promise: 4.2.8 - web3-core-helpers: 1.10.4 - transitivePeerDependencies: - - encoding - dev: true - - /web3-providers-ipc@1.10.0: - resolution: {integrity: sha512-OfXG1aWN8L1OUqppshzq8YISkWrYHaATW9H8eh0p89TlWMc1KZOL9vttBuaBEi96D/n0eYDn2trzt22bqHWfXA==} - engines: {node: '>=8.0.0'} - dependencies: - oboe: 2.1.5 - web3-core-helpers: 1.10.0 - dev: true - - /web3-providers-ipc@1.10.4: - resolution: {integrity: sha512-YRF/bpQk9z3WwjT+A6FI/GmWRCASgd+gC0si7f9zbBWLXjwzYAKG73bQBaFRAHex1hl4CVcM5WUMaQXf3Opeuw==} - engines: {node: '>=8.0.0'} - dependencies: - oboe: 2.1.5 - web3-core-helpers: 1.10.4 - dev: true - - /web3-providers-ws@1.10.0: - resolution: {integrity: sha512-sK0fNcglW36yD5xjnjtSGBnEtf59cbw4vZzJ+CmOWIKGIR96mP5l684g0WD0Eo+f4NQc2anWWXG74lRc9OVMCQ==} - engines: {node: '>=8.0.0'} - dependencies: - eventemitter3: 4.0.4 - web3-core-helpers: 1.10.0 - websocket: 1.0.34 - transitivePeerDependencies: - - supports-color - dev: true - - /web3-providers-ws@1.10.4: - resolution: {integrity: sha512-j3FBMifyuFFmUIPVQR4pj+t5ILhAexAui0opgcpu9R5LxQrLRUZxHSnU+YO25UycSOa/NAX8A+qkqZNpcFAlxA==} - engines: {node: '>=8.0.0'} - dependencies: - eventemitter3: 4.0.4 - web3-core-helpers: 1.10.4 - websocket: 1.0.34 - transitivePeerDependencies: - - supports-color - dev: true - - /web3-shh@1.10.0: - resolution: {integrity: sha512-uNUUuNsO2AjX41GJARV9zJibs11eq6HtOe6Wr0FtRUcj8SN6nHeYIzwstAvJ4fXA53gRqFMTxdntHEt9aXVjpg==} - engines: {node: '>=8.0.0'} - requiresBuild: true - dependencies: - web3-core: 1.10.0 - web3-core-method: 1.10.0 - web3-core-subscriptions: 1.10.0 - web3-net: 1.10.0 - transitivePeerDependencies: - - encoding - - supports-color - dev: true - - /web3-shh@1.10.4: - resolution: {integrity: sha512-cOH6iFFM71lCNwSQrC3niqDXagMqrdfFW85hC9PFUrAr3PUrIem8TNstTc3xna2bwZeWG6OBy99xSIhBvyIACw==} - engines: {node: '>=8.0.0'} - requiresBuild: true - dependencies: - web3-core: 1.10.4 - web3-core-method: 1.10.4 - web3-core-subscriptions: 1.10.4 - web3-net: 1.10.4 - transitivePeerDependencies: - - encoding - - supports-color - dev: true - - /web3-utils@1.10.0: - resolution: {integrity: sha512-kSaCM0uMcZTNUSmn5vMEhlo02RObGNRRCkdX0V9UTAU0+lrvn0HSaudyCo6CQzuXUsnuY2ERJGCGPfeWmv19Rg==} - engines: {node: '>=8.0.0'} - dependencies: - bn.js: 5.2.1 - ethereum-bloom-filters: 1.0.10 - ethereumjs-util: 7.1.5 - ethjs-unit: 0.1.6 - number-to-bn: 1.7.0 - randombytes: 2.1.0 - utf8: 3.0.0 - dev: true - - /web3-utils@1.10.3: - resolution: {integrity: sha512-OqcUrEE16fDBbGoQtZXWdavsPzbGIDc5v3VrRTZ0XrIpefC/viZ1ZU9bGEemazyS0catk/3rkOOxpzTfY+XsyQ==} - engines: {node: '>=8.0.0'} - dependencies: - '@ethereumjs/util': 8.1.0 - bn.js: 5.2.1 - ethereum-bloom-filters: 1.0.10 - ethereum-cryptography: 2.1.3 - ethjs-unit: 0.1.6 - number-to-bn: 1.7.0 - randombytes: 2.1.0 - utf8: 3.0.0 - dev: true - - /web3-utils@1.10.4: - resolution: {integrity: sha512-tsu8FiKJLk2PzhDl9fXbGUWTkkVXYhtTA+SmEFkKft+9BgwLxfCRpU96sWv7ICC8zixBNd3JURVoiR3dUXgP8A==} - engines: {node: '>=8.0.0'} - dependencies: - '@ethereumjs/util': 8.1.0 - bn.js: 5.2.1 - ethereum-bloom-filters: 1.0.10 - ethereum-cryptography: 2.1.3 - ethjs-unit: 0.1.6 - number-to-bn: 1.7.0 - randombytes: 2.1.0 - utf8: 3.0.0 - dev: true - - /web3@1.10.0: - resolution: {integrity: sha512-YfKY9wSkGcM8seO+daR89oVTcbu18NsVfvOngzqMYGUU0pPSQmE57qQDvQzUeoIOHAnXEBNzrhjQJmm8ER0rng==} - engines: {node: '>=8.0.0'} - requiresBuild: true - dependencies: - web3-bzz: 1.10.0 - web3-core: 1.10.0 - web3-eth: 1.10.0 - web3-eth-personal: 1.10.0 - web3-net: 1.10.0 - web3-shh: 1.10.0 - web3-utils: 1.10.0 - transitivePeerDependencies: - - bufferutil - - encoding - - supports-color - - utf-8-validate - dev: true - - /web3@1.10.4: - resolution: {integrity: sha512-kgJvQZjkmjOEKimx/tJQsqWfRDPTTcBfYPa9XletxuHLpHcXdx67w8EFn5AW3eVxCutE9dTVHgGa9VYe8vgsEA==} - engines: {node: '>=8.0.0'} - requiresBuild: true - dependencies: - web3-bzz: 1.10.4 - web3-core: 1.10.4 - web3-eth: 1.10.4 - web3-eth-personal: 1.10.4 - web3-net: 1.10.4 - web3-shh: 1.10.4 - web3-utils: 1.10.4 - transitivePeerDependencies: - - bufferutil - - encoding - - supports-color - - utf-8-validate - dev: true - - /webidl-conversions@3.0.1: - resolution: {integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==} - dev: true - - /webpod@0.0.2: - resolution: {integrity: sha512-cSwwQIeg8v4i3p4ajHhwgR7N6VyxAf+KYSSsY6Pd3aETE+xEU4vbitz7qQkB0I321xnhDdgtxuiSfk5r/FVtjg==} - hasBin: true - dev: true - - /websocket@1.0.34: - resolution: {integrity: sha512-PRDso2sGwF6kM75QykIesBijKSVceR6jL2G8NGYyq2XrItNC2P5/qL5XeR056GhA+Ly7JMFvJb9I312mJfmqnQ==} - engines: {node: '>=4.0.0'} - dependencies: - bufferutil: 4.0.8 - debug: 2.6.9 - es5-ext: 0.10.64 - typedarray-to-buffer: 3.1.5 - utf-8-validate: 5.0.10 - yaeti: 0.0.6 - transitivePeerDependencies: - - supports-color - dev: true - - /whatwg-url@5.0.0: - resolution: {integrity: sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==} - dependencies: - tr46: 0.0.3 - webidl-conversions: 3.0.1 - dev: true - - /which-module@1.0.0: - resolution: {integrity: sha512-F6+WgncZi/mJDrammbTuHe1q0R5hOXv/mBaiNA2TCNT/LTHusX0V+CJnj9XT8ki5ln2UZyyddDgHfCzyrOH7MQ==} - dev: true - - /which-typed-array@1.1.15: - resolution: {integrity: sha512-oV0jmFtUky6CXfkqehVvBP/LSWJ2sy4vWMioiENyJLePrBO/yKyV9OyJySfAKosh+RYkIl5zJCNZ8/4JncrpdA==} - engines: {node: '>= 0.4'} - dependencies: - available-typed-arrays: 1.0.7 - call-bind: 1.0.7 - for-each: 0.3.3 - gopd: 1.0.1 - has-tostringtag: 1.0.2 - dev: true - - /which@1.3.1: - resolution: {integrity: sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==} - hasBin: true - dependencies: - isexe: 2.0.0 - dev: true - - /which@3.0.1: - resolution: {integrity: sha512-XA1b62dzQzLfaEOSQFTCOd5KFf/1VSzZo7/7TUjnya6u0vGGKzU96UQBZTAThCb2j4/xjBAyii1OhRLJEivHvg==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} - hasBin: true - dependencies: - isexe: 2.0.0 - dev: true - - /widest-line@3.1.0: - resolution: {integrity: sha512-NsmoXalsWVDMGupxZ5R08ka9flZjjiLvHVAWYOKtiKM8ujtZWr9cRffak+uSE48+Ob8ObalXpwyeUiyDD6QFgg==} - engines: {node: '>=8'} - dependencies: - string-width: 4.2.3 - dev: true - - /window-size@0.2.0: - resolution: {integrity: sha512-UD7d8HFA2+PZsbKyaOCEy8gMh1oDtHgJh1LfgjQ4zVXmYjAT/kvz3PueITKuqDiIXQe7yzpPnxX3lNc+AhQMyw==} - engines: {node: '>= 0.10.0'} - hasBin: true - dev: true - - /word-wrap@1.2.5: - resolution: {integrity: sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==} - engines: {node: '>=0.10.0'} - dev: true - - /wordwrap@1.0.0: - resolution: {integrity: sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q==} - dev: true - - /wordwrapjs@4.0.1: - resolution: {integrity: sha512-kKlNACbvHrkpIw6oPeYDSmdCTu2hdMHoyXLTcUKala++lx5Y+wjJ/e474Jqv5abnVmwxw08DiTuHmw69lJGksA==} - engines: {node: '>=8.0.0'} - dependencies: - reduce-flatten: 2.0.0 - typical: 5.2.0 - dev: true - - /workerpool@6.2.1: - resolution: {integrity: sha512-ILEIE97kDZvF9Wb9f6h5aXK4swSlKGUcOEGiIYb2OOu/IrDU9iwj0fD//SsA6E5ibwJxpEvhullJY4Sl4GcpAw==} - dev: true - - /wrap-ansi@2.1.0: - resolution: {integrity: sha512-vAaEaDM946gbNpH5pLVNR+vX2ht6n0Bt3GXwVB1AuAqZosOvHNF3P7wDnh8KLkSqgUh0uh77le7Owgoz+Z9XBw==} - engines: {node: '>=0.10.0'} - dependencies: - string-width: 1.0.2 - strip-ansi: 3.0.1 - dev: true - - /wrap-ansi@7.0.0: - resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} - engines: {node: '>=10'} - dependencies: - ansi-styles: 4.3.0 - string-width: 4.2.3 - strip-ansi: 6.0.1 - dev: true - - /wrappy@1.0.2: - resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} - dev: true - - /ws@3.3.3: - resolution: {integrity: sha512-nnWLa/NwZSt4KQJu51MYlCcSQ5g7INpOrOMt4XV8j4dqTXdmlUmSHQ8/oLC069ckre0fRsgfvsKwbTdtKLCDkA==} - peerDependencies: - bufferutil: ^4.0.1 - utf-8-validate: ^5.0.2 - peerDependenciesMeta: - bufferutil: - optional: true - utf-8-validate: - optional: true - dependencies: - async-limiter: 1.0.1 - safe-buffer: 5.1.2 - ultron: 1.1.1 - dev: true - - /ws@7.4.6: - resolution: {integrity: sha512-YmhHDO4MzaDLB+M9ym/mDA5z0naX8j7SIlT8f8z+I0VtzsRbekxEutHSme7NPS2qE8StCYQNUnfWdXta/Yu85A==} - engines: {node: '>=8.3.0'} - peerDependencies: - bufferutil: ^4.0.1 - utf-8-validate: ^5.0.2 - peerDependenciesMeta: - bufferutil: - optional: true - utf-8-validate: - optional: true - dev: true - - /ws@7.5.9: - resolution: {integrity: sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q==} - engines: {node: '>=8.3.0'} - peerDependencies: - bufferutil: ^4.0.1 - utf-8-validate: ^5.0.2 - peerDependenciesMeta: - bufferutil: - optional: true - utf-8-validate: - optional: true - dev: true - - /xhr-request-promise@0.1.3: - resolution: {integrity: sha512-YUBytBsuwgitWtdRzXDDkWAXzhdGB8bYm0sSzMPZT7Z2MBjMSTHFsyCT1yCRATY+XC69DUrQraRAEgcoCRaIPg==} - dependencies: - xhr-request: 1.1.0 - dev: true - - /xhr-request@1.1.0: - resolution: {integrity: sha512-Y7qzEaR3FDtL3fP30k9wO/e+FBnBByZeybKOhASsGP30NIkRAAkKD/sCnLvgEfAIEC1rcmK7YG8f4oEnIrrWzA==} - dependencies: - buffer-to-arraybuffer: 0.0.5 - object-assign: 4.1.1 - query-string: 5.1.1 - simple-get: 2.8.2 - timed-out: 4.0.1 - url-set-query: 1.0.0 - xhr: 2.6.0 - dev: true - - /xhr@2.6.0: - resolution: {integrity: sha512-/eCGLb5rxjx5e3mF1A7s+pLlR6CGyqWN91fv1JgER5mVWg1MZmlhBvy9kjcsOdRk8RrIujotWyJamfyrp+WIcA==} - dependencies: - global: 4.4.0 - is-function: 1.0.2 - parse-headers: 2.0.5 - xtend: 4.0.2 - dev: true - - /xmlhttprequest@1.8.0: - resolution: {integrity: sha512-58Im/U0mlVBLM38NdZjHyhuMtCqa61469k2YP/AaPbvCoV9aQGUpbJBj1QRm2ytRiVQBD/fsw7L2bJGDVQswBA==} - engines: {node: '>=0.4.0'} - dev: true - - /xtend@4.0.2: - resolution: {integrity: sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==} - engines: {node: '>=0.4'} - dev: true - - /y18n@3.2.2: - resolution: {integrity: sha512-uGZHXkHnhF0XeeAPgnKfPv1bgKAYyVvmNL1xlKsPYZPaIHxGti2hHqvOCQv71XMsLxu1QjergkqogUnms5D3YQ==} - dev: true - - /y18n@5.0.8: - resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} - engines: {node: '>=10'} - dev: true - - /yaeti@0.0.6: - resolution: {integrity: sha512-MvQa//+KcZCUkBTIC9blM+CU9J2GzuTytsOUwf2lidtvkx/6gnEp1QvJv34t9vdjhFmha/mUiNDbN0D0mJWdug==} - engines: {node: '>=0.10.32'} - dev: true - - /yallist@3.1.1: - resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==} - dev: true - - /yallist@4.0.0: - resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} - dev: true - - /yaml@2.4.1: - resolution: {integrity: sha512-pIXzoImaqmfOrL7teGUBt/T7ZDnyeGBWyXQBvOVhLkWLN37GXv8NMLK406UY6dS51JfcQHsmcW5cJ441bHg6Lg==} - engines: {node: '>= 14'} - hasBin: true - dev: true - - /yargs-parser@2.4.1: - resolution: {integrity: sha512-9pIKIJhnI5tonzG6OnCFlz/yln8xHYcGl+pn3xR0Vzff0vzN1PbNRaelgfgRUwZ3s4i3jvxT9WhmUGL4whnasA==} - dependencies: - camelcase: 3.0.0 - lodash.assign: 4.2.0 - dev: true - - /yargs-parser@20.2.4: - resolution: {integrity: sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA==} - engines: {node: '>=10'} - dev: true - - /yargs-unparser@2.0.0: - resolution: {integrity: sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA==} - engines: {node: '>=10'} - dependencies: - camelcase: 6.3.0 - decamelize: 4.0.0 - flat: 5.0.2 - is-plain-obj: 2.1.0 - dev: true - - /yargs@16.2.0: - resolution: {integrity: sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==} - engines: {node: '>=10'} - dependencies: - cliui: 7.0.4 - escalade: 3.1.2 - get-caller-file: 2.0.5 - require-directory: 2.1.1 - string-width: 4.2.3 - y18n: 5.0.8 - yargs-parser: 20.2.4 - dev: true - - /yargs@4.8.1: - resolution: {integrity: sha512-LqodLrnIDM3IFT+Hf/5sxBnEGECrfdC1uIbgZeJmESCSo4HoCAaKEus8MylXHAkdacGc0ye+Qa+dpkuom8uVYA==} - dependencies: - cliui: 3.2.0 - decamelize: 1.2.0 - get-caller-file: 1.0.3 - lodash.assign: 4.2.0 - os-locale: 1.4.0 - read-pkg-up: 1.0.1 - require-directory: 2.1.1 - require-main-filename: 1.0.1 - set-blocking: 2.0.0 - string-width: 1.0.2 - which-module: 1.0.0 - window-size: 0.2.0 - y18n: 3.2.2 - yargs-parser: 2.4.1 - dev: true - - /yn@3.1.1: - resolution: {integrity: sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==} - engines: {node: '>=6'} - dev: true - - /yocto-queue@0.1.0: - resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} - engines: {node: '>=10'} - dev: true - - /zod@3.22.4: - resolution: {integrity: sha512-iC+8Io04lddc+mVqQ9AZ7OQ2MrUKGN+oIQyq1vemgt46jwCwLfhq7/pwnBnNXXXZb8VTVLKwp9EDkx+ryxIWmg==} - dev: true - - /zx@7.2.3: - resolution: {integrity: sha512-QODu38nLlYXg/B/Gw7ZKiZrvPkEsjPN3LQ5JFXM7h0JvwhEdPNNl+4Ao1y4+o3CLNiDUNcwzQYZ4/Ko7kKzCMA==} - engines: {node: '>= 16.0.0'} - hasBin: true - dependencies: - '@types/fs-extra': 11.0.4 - '@types/minimist': 1.2.5 - '@types/node': 18.19.31 - '@types/ps-tree': 1.1.6 - '@types/which': 3.0.3 - chalk: 5.3.0 - fs-extra: 11.2.0 - fx: 34.0.0 - globby: 13.2.2 - minimist: 1.2.8 - node-fetch: 3.3.1 - ps-tree: 1.2.0 - webpod: 0.0.2 - which: 3.0.1 - yaml: 2.4.1 - dev: true diff --git a/contracts/src/ActivePool.sol b/contracts/src/ActivePool.sol index 5be629ec..c048f7f3 100644 --- a/contracts/src/ActivePool.sol +++ b/contracts/src/ActivePool.sol @@ -4,13 +4,13 @@ pragma solidity 0.8.18; import "openzeppelin-contracts/contracts/token/ERC20/utils/SafeERC20.sol"; -import './Interfaces/IActivePool.sol'; -import './Interfaces/IBoldToken.sol'; +import "./Interfaces/IActivePool.sol"; +import "./Interfaces/IBoldToken.sol"; import "./Interfaces/IInterestRouter.sol"; import "./Dependencies/Ownable.sol"; import "./Dependencies/CheckContract.sol"; -import './Interfaces/IDefaultPool.sol'; -import './Interfaces/IActivePool.sol'; +import "./Interfaces/IDefaultPool.sol"; +import "./Interfaces/IActivePool.sol"; //import "forge-std/console2.sol"; @@ -24,7 +24,7 @@ import './Interfaces/IActivePool.sol'; contract ActivePool is Ownable, CheckContract, IActivePool { using SafeERC20 for IERC20; - string constant public NAME = "ActivePool"; + string public constant NAME = "ActivePool"; IERC20 public immutable ETH; address public borrowerOperationsAddress; @@ -36,9 +36,9 @@ contract ActivePool is Ownable, CheckContract, IActivePool { IInterestRouter public interestRouter; - uint256 constant public SECONDS_IN_ONE_YEAR = 31536000; // 60 * 60 * 24 * 365, + uint256 public constant SECONDS_IN_ONE_YEAR = 31536000; // 60 * 60 * 24 * 365, - uint256 internal ETHBalance; // deposited ether tracker + uint256 internal ETHBalance; // deposited ether tracker // Sum of individual recorded Trove debts. Updated only at individual Trove operations. // "G" in the spec. @@ -61,18 +61,17 @@ contract ActivePool is Ownable, CheckContract, IActivePool { event DefaultPoolAddressChanged(address _newDefaultPoolAddress); event StabilityPoolAddressChanged(address _newStabilityPoolAddress); - event EtherSent(address _to, uint _amount); + event EtherSent(address _to, uint256 _amount); event BorrowerOperationsAddressChanged(address _newBorrowerOperationsAddress); event TroveManagerAddressChanged(address _newTroveManagerAddress); - event ActivePoolBoldDebtUpdated(uint _recordedDebtSum); - event ActivePoolETHBalanceUpdated(uint _ETHBalance); + event ActivePoolBoldDebtUpdated(uint256 _recordedDebtSum); + event ActivePoolETHBalanceUpdated(uint256 _ETHBalance); constructor(address _ETHAddress) { checkContract(_ETHAddress); ETH = IERC20(_ETHAddress); } - // --- Contract setters --- function setAddresses( @@ -82,10 +81,7 @@ contract ActivePool is Ownable, CheckContract, IActivePool { address _defaultPoolAddress, address _boldTokenAddress, address _interestRouterAddress - ) - external - onlyOwner - { + ) external onlyOwner { checkContract(_borrowerOperationsAddress); checkContract(_troveManagerAddress); checkContract(_stabilityPoolAddress); @@ -118,11 +114,11 @@ contract ActivePool is Ownable, CheckContract, IActivePool { * *Not necessarily equal to the the contract's raw ETH balance - ether can be forcibly sent to contracts. */ - function getETHBalance() external view override returns (uint) { + function getETHBalance() external view override returns (uint256) { return ETHBalance; } - function getRecordedDebtSum() external view override returns (uint) { + function getRecordedDebtSum() external view override returns (uint256) { return recordedDebtSum; } @@ -137,7 +133,7 @@ contract ActivePool is Ownable, CheckContract, IActivePool { // --- Pool functionality --- - function sendETH(address _account, uint _amount) external override { + function sendETH(address _account, uint256 _amount) external override { _requireCallerIsBOorTroveMorSP(); _accountForSendETH(_account, _amount); @@ -145,7 +141,7 @@ contract ActivePool is Ownable, CheckContract, IActivePool { ETH.safeTransfer(_account, _amount); } - function sendETHToDefaultPool(uint _amount) external override { + function sendETHToDefaultPool(uint256 _amount) external override { _requireCallerIsTroveManager(); address defaultPoolAddressCached = defaultPoolAddress; @@ -154,7 +150,7 @@ contract ActivePool is Ownable, CheckContract, IActivePool { IDefaultPool(defaultPoolAddressCached).receiveETH(_amount); } - function _accountForSendETH(address _account, uint _amount) internal { + function _accountForSendETH(address _account, uint256 _amount) internal { uint256 newETHBalance = ETHBalance - _amount; ETHBalance = newETHBalance; emit ActivePoolETHBalanceUpdated(newETHBalance); @@ -192,7 +188,10 @@ contract ActivePool is Ownable, CheckContract, IActivePool { emit ActivePoolBoldDebtUpdated(newRecordedDebtSum); } - function _changeAggWeightedDebtSum( uint256 _newTroveWeightedRecordedTroveDebt, uint256 _oldWeightedRecordedTroveDebt) internal { + function _changeAggWeightedDebtSum( + uint256 _newTroveWeightedRecordedTroveDebt, + uint256 _oldWeightedRecordedTroveDebt + ) internal { // Do the arithmetic in 2 steps here to avoid overflow from the decrease uint256 newAggWeightedDebtSum = aggWeightedDebtSum + _newTroveWeightedRecordedTroveDebt; // 1 SLOAD newAggWeightedDebtSum -= _oldWeightedRecordedTroveDebt; @@ -209,26 +208,24 @@ contract ActivePool is Ownable, CheckContract, IActivePool { // The net Trove debt change could be positive or negative in a repayment (depending on whether its redistribution gain or repayment amount is larger), // so this function accepts both the increase and the decrease to avoid using (and converting to/from) signed ints. function mintAggInterest( - uint256 _troveDebtIncrease, + uint256 _troveDebtIncrease, uint256 _troveDebtDecrease, uint256 recordedSumIncrease, uint256 recordedSumDecrease, uint256 newWeightedRecordedTroveDebt, uint256 oldWeightedRecordedTroveDebt - ) - external - { + ) external { _requireCallerIsBOorTroveM(); - + // Do the arithmetic in 2 steps here to avoid overflow from the decrease uint256 newAggRecordedDebt = _mintAggInterestNoTroveChange() + _troveDebtIncrease; // 1 SLOAD - newAggRecordedDebt -=_troveDebtDecrease; + newAggRecordedDebt -= _troveDebtDecrease; aggRecordedDebt = newAggRecordedDebt; // 1 SSTORE // assert(aggRecordedDebt >= 0) // This should never be negative. If all redistribution gians and all aggregate interest was applied // and all Trove debts were repaid, it should become 0. _changeRecordedDebtSum(recordedSumIncrease, recordedSumDecrease); - _changeAggWeightedDebtSum(newWeightedRecordedTroveDebt, oldWeightedRecordedTroveDebt); + _changeAggWeightedDebtSum(newWeightedRecordedTroveDebt, oldWeightedRecordedTroveDebt); } function mintAggInterestNoTroveChange() external returns (uint256) { @@ -240,7 +237,7 @@ contract ActivePool is Ownable, CheckContract, IActivePool { uint256 aggInterest = calcPendingAggInterest(); // Mint the new BOLD interest to a mock interest router that would split it and send it onward to SP, LP staking, etc. // TODO: implement interest routing and SP Bold reward tracking - if (aggInterest > 0) {boldToken.mint(address(interestRouter), aggInterest);} + if (aggInterest > 0) boldToken.mint(address(interestRouter), aggInterest); lastAggUpdateTime = block.timestamp; return aggRecordedDebt + aggInterest; @@ -250,34 +247,31 @@ contract ActivePool is Ownable, CheckContract, IActivePool { function _requireCallerIsBorrowerOperationsOrDefaultPool() internal view { require( - msg.sender == borrowerOperationsAddress || - msg.sender == defaultPoolAddress, - "ActivePool: Caller is neither BO nor Default Pool"); + msg.sender == borrowerOperationsAddress || msg.sender == defaultPoolAddress, + "ActivePool: Caller is neither BO nor Default Pool" + ); } function _requireCallerIsBOorTroveMorSP() internal view { require( - msg.sender == borrowerOperationsAddress || - msg.sender == troveManagerAddress || - msg.sender == stabilityPoolAddress, - "ActivePool: Caller is neither BorrowerOperations nor TroveManager nor StabilityPool"); + msg.sender == borrowerOperationsAddress || msg.sender == troveManagerAddress + || msg.sender == stabilityPoolAddress, + "ActivePool: Caller is neither BorrowerOperations nor TroveManager nor StabilityPool" + ); } function _requireCallerIsSP() internal view { - require( - msg.sender == stabilityPoolAddress, "ActivePool: Caller is not StabilityPool"); + require(msg.sender == stabilityPoolAddress, "ActivePool: Caller is not StabilityPool"); } function _requireCallerIsBOorTroveM() internal view { require( - msg.sender == borrowerOperationsAddress || - msg.sender == troveManagerAddress, - "ActivePool: Caller is neither BorrowerOperations nor TroveManager"); + msg.sender == borrowerOperationsAddress || msg.sender == troveManagerAddress, + "ActivePool: Caller is neither BorrowerOperations nor TroveManager" + ); } function _requireCallerIsTroveManager() internal view { - require( - msg.sender == troveManagerAddress, - "ActivePool: Caller is not TroveManager"); + require(msg.sender == troveManagerAddress, "ActivePool: Caller is not TroveManager"); } } diff --git a/contracts/src/BoldToken.sol b/contracts/src/BoldToken.sol index fc2d66b0..a5fbc348 100644 --- a/contracts/src/BoldToken.sol +++ b/contracts/src/BoldToken.sol @@ -24,13 +24,13 @@ import "./Dependencies/CheckContract.sol"; contract BoldToken is CheckContract, IBoldToken { uint256 private _totalSupply; - string constant internal _NAME = "Bold Stablecoin"; - string constant internal _SYMBOL = "Bold"; - string constant internal _VERSION = "1"; - uint8 constant internal _DECIMALS = 18; - + string internal constant _NAME = "Bold Stablecoin"; + string internal constant _SYMBOL = "Bold"; + string internal constant _VERSION = "1"; + uint8 internal constant _DECIMALS = 18; + // --- Data for EIP2612 --- - + // keccak256("Permit(address owner,address spender,uint256 value,uint256 nonce,uint256 deadline)"); bytes32 private constant _PERMIT_TYPEHASH = 0x6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9; // keccak256("EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)"); @@ -43,29 +43,27 @@ contract BoldToken is CheckContract, IBoldToken { bytes32 private immutable _HASHED_NAME; bytes32 private immutable _HASHED_VERSION; - - mapping (address => uint256) private _nonces; - + + mapping(address => uint256) private _nonces; + uint256 public deploymentStartTime; // User data for Bold token - mapping (address => uint256) private _balances; - mapping (address => mapping (address => uint256)) private _allowances; - + mapping(address => uint256) private _balances; + mapping(address => mapping(address => uint256)) private _allowances; + // --- Addresses --- address public immutable troveManagerAddress; address public immutable stabilityPoolAddress; address public immutable borrowerOperationsAddress; address public immutable activePoolAddress; - // --- Events --- event TroveManagerAddressChanged(address _troveManagerAddress); event StabilityPoolAddressChanged(address _newStabilityPoolAddress); event BorrowerOperationsAddressChanged(address _newBorrowerOperationsAddress); - constructor - ( + constructor( address _troveManagerAddress, address _stabilityPoolAddress, address _borrowerOperationsAddress, @@ -82,14 +80,14 @@ contract BoldToken is CheckContract, IBoldToken { stabilityPoolAddress = _stabilityPoolAddress; emit StabilityPoolAddressChanged(_stabilityPoolAddress); - borrowerOperationsAddress = _borrowerOperationsAddress; + borrowerOperationsAddress = _borrowerOperationsAddress; emit BorrowerOperationsAddressChanged(_borrowerOperationsAddress); activePoolAddress = _activePoolAddress; - + bytes32 hashedName = keccak256(bytes(_NAME)); bytes32 hashedVersion = keccak256(bytes(_VERSION)); - + _HASHED_NAME = hashedName; _HASHED_VERSION = hashedVersion; _CACHED_CHAIN_ID = _chainID(); @@ -110,7 +108,7 @@ contract BoldToken is CheckContract, IBoldToken { _burn(_account, _amount); } - function sendToPool(address _sender, address _poolAddress, uint256 _amount) external override { + function sendToPool(address _sender, address _poolAddress, uint256 _amount) external override { _requireCallerIsStabilityPool(); _transfer(_sender, _poolAddress, _amount); } @@ -173,30 +171,25 @@ contract BoldToken is CheckContract, IBoldToken { } } - function permit - ( - address owner, - address spender, - uint amount, - uint deadline, - uint8 v, - bytes32 r, - bytes32 s - ) - external - override - { - require(deadline >= block.timestamp, 'Bold: expired deadline'); - bytes32 digest = keccak256(abi.encodePacked('\x19\x01', - DOMAIN_SEPARATOR(), keccak256(abi.encode( - _PERMIT_TYPEHASH, owner, spender, amount, - _nonces[owner]++, deadline)))); + function permit(address owner, address spender, uint256 amount, uint256 deadline, uint8 v, bytes32 r, bytes32 s) + external + override + { + require(deadline >= block.timestamp, "Bold: expired deadline"); + bytes32 digest = keccak256( + abi.encodePacked( + "\x19\x01", + DOMAIN_SEPARATOR(), + keccak256(abi.encode(_PERMIT_TYPEHASH, owner, spender, amount, _nonces[owner]++, deadline)) + ) + ); address recoveredAddress = ecrecover(digest, v, r, s); - require(recoveredAddress != address(0) && recoveredAddress == owner, 'Bold: invalid signature'); + require(recoveredAddress != address(0) && recoveredAddress == owner, "Bold: invalid signature"); _approve(owner, spender, amount); } - function nonces(address owner) external view override returns (uint256) { // FOR EIP 2612 + function nonces(address owner) external view override returns (uint256) { + // FOR EIP 2612 return _nonces[owner]; } @@ -207,7 +200,7 @@ contract BoldToken is CheckContract, IBoldToken { chainID := chainid() } } - + function _buildDomainSeparator(bytes32 _typeHash, bytes32 _name, bytes32 _version) private view returns (bytes32) { return keccak256(abi.encode(_typeHash, _name, _version, _chainID(), address(this))); } @@ -234,7 +227,7 @@ contract BoldToken is CheckContract, IBoldToken { function _burn(address account, uint256 amount) internal { assert(account != address(0)); - + _balances[account] = _balances[account] - amount; _totalSupply = _totalSupply - amount; emit Transfer(account, address(0), amount); @@ -252,29 +245,27 @@ contract BoldToken is CheckContract, IBoldToken { function _requireValidRecipient(address _recipient) internal view { require( - _recipient != address(0) && - _recipient != address(this), + _recipient != address(0) && _recipient != address(this), "Bold: Cannot transfer tokens directly to the Bold token contract or the zero address" ); require( - _recipient != stabilityPoolAddress && - _recipient != troveManagerAddress && - _recipient != borrowerOperationsAddress, + _recipient != stabilityPoolAddress && _recipient != troveManagerAddress + && _recipient != borrowerOperationsAddress, "Bold: Cannot transfer tokens directly to the StabilityPool, TroveManager or BorrowerOps" ); } function _requireCallerIsBOorAP() internal view { - require(msg.sender == borrowerOperationsAddress || - msg.sender == activePoolAddress, - "BoldToken: Caller is not BO or AP"); + require( + msg.sender == borrowerOperationsAddress || msg.sender == activePoolAddress, + "BoldToken: Caller is not BO or AP" + ); } function _requireCallerIsBOorTroveMorSP() internal view { require( - msg.sender == borrowerOperationsAddress || - msg.sender == troveManagerAddress || - msg.sender == stabilityPoolAddress, + msg.sender == borrowerOperationsAddress || msg.sender == troveManagerAddress + || msg.sender == stabilityPoolAddress, "Bold: Caller is neither BorrowerOperations nor TroveManager nor StabilityPool" ); } @@ -286,7 +277,8 @@ contract BoldToken is CheckContract, IBoldToken { function _requireCallerIsTroveMorSP() internal view { require( msg.sender == troveManagerAddress || msg.sender == stabilityPoolAddress, - "Bold: Caller is neither TroveManager nor StabilityPool"); + "Bold: Caller is neither TroveManager nor StabilityPool" + ); } // --- Optional functions --- diff --git a/contracts/src/BorrowerOperations.sol b/contracts/src/BorrowerOperations.sol index 3f78e126..beb62139 100644 --- a/contracts/src/BorrowerOperations.sol +++ b/contracts/src/BorrowerOperations.sol @@ -18,7 +18,7 @@ import "./Dependencies/CheckContract.sol"; contract BorrowerOperations is LiquityBase, Ownable, CheckContract, IBorrowerOperations { using SafeERC20 for IERC20; - string constant public NAME = "BorrowerOperations"; + string public constant NAME = "BorrowerOperations"; // --- Connected contract declarations --- @@ -36,19 +36,19 @@ contract BorrowerOperations is LiquityBase, Ownable, CheckContract, IBorrowerOpe Used to hold, return and assign variables inside a function, in order to avoid the error: "CompilerError: Stack too deep". */ - struct LocalVariables_adjustTrove { - uint price; - uint entireDebt; - uint entireColl; + struct LocalVariables_adjustTrove { + uint256 price; + uint256 entireDebt; + uint256 entireColl; uint256 redistDebtGain; uint256 accruedTroveInterest; - uint oldICR; - uint newICR; - uint newTCR; - uint BoldFee; // TODO - uint newEntireDebt; - uint newEntireColl; - uint stake; + uint256 oldICR; + uint256 newICR; + uint256 newTCR; + uint256 BoldFee; // TODO + uint256 newEntireDebt; + uint256 newEntireColl; + uint256 stake; uint256 initialWeightedRecordedTroveDebt; uint256 newWeightedTroveDebt; uint256 annualInterestRate; @@ -59,13 +59,13 @@ contract BorrowerOperations is LiquityBase, Ownable, CheckContract, IBorrowerOpe } struct LocalVariables_openTrove { - uint price; - uint BoldFee; // TODO - uint netDebt; - uint compositeDebt; - uint ICR; - uint stake; - uint arrayIndex; + uint256 price; + uint256 BoldFee; // TODO + uint256 netDebt; + uint256 compositeDebt; + uint256 ICR; + uint256 stake; + uint256 arrayIndex; } struct ContractsCacheTMAP { @@ -91,13 +91,15 @@ contract BorrowerOperations is LiquityBase, Ownable, CheckContract, IBorrowerOpe event StabilityPoolAddressChanged(address _stabilityPoolAddress); event GasPoolAddressChanged(address _gasPoolAddress); event CollSurplusPoolAddressChanged(address _collSurplusPoolAddress); - event PriceFeedAddressChanged(address _newPriceFeedAddress); + event PriceFeedAddressChanged(address _newPriceFeedAddress); event SortedTrovesAddressChanged(address _sortedTrovesAddress); event BoldTokenAddressChanged(address _boldTokenAddress); event TroveCreated(address indexed _owner, uint256 _troveId, uint256 _arrayIndex); - event TroveUpdated(uint256 indexed _troveId, uint _debt, uint _coll, uint stake, BorrowerOperation operation); - event BoldBorrowingFeePaid(uint256 indexed _troveId, uint _boldFee); + event TroveUpdated( + uint256 indexed _troveId, uint256 _debt, uint256 _coll, uint256 stake, BorrowerOperation operation + ); + event BoldBorrowingFeePaid(uint256 indexed _troveId, uint256 _boldFee); constructor(address _ETHAddress) { checkContract(_ETHAddress); @@ -116,11 +118,7 @@ contract BorrowerOperations is LiquityBase, Ownable, CheckContract, IBorrowerOpe address _priceFeedAddress, address _sortedTrovesAddress, address _boldTokenAddress - ) - external - override - onlyOwner - { + ) external override onlyOwner { // This makes impossible to open a trove with zero withdrawn Bold assert(MIN_NET_DEBT > 0); @@ -165,17 +163,13 @@ contract BorrowerOperations is LiquityBase, Ownable, CheckContract, IBorrowerOpe function openTrove( address _owner, uint256 _ownerIndex, - uint _maxFeePercentage, + uint256 _maxFeePercentage, uint256 _ETHAmount, - uint _boldAmount, + uint256 _boldAmount, uint256 _upperHint, uint256 _lowerHint, uint256 _annualInterestRate - ) - external - override - returns (uint256) - { + ) external override returns (uint256) { ContractsCacheTMAPBT memory contractsCache = ContractsCacheTMAPBT(troveManager, activePool, boldToken); LocalVariables_openTrove memory vars; @@ -203,22 +197,20 @@ contract BorrowerOperations is LiquityBase, Ownable, CheckContract, IBorrowerOpe _requireICRisAboveCCR(vars.ICR); } else { _requireICRisAboveMCR(vars.ICR); - uint newTCR = _getNewTCRFromTroveChange(_ETHAmount, true, vars.compositeDebt, true, vars.price); // bools: coll increase, debt increase + uint256 newTCR = _getNewTCRFromTroveChange(_ETHAmount, true, vars.compositeDebt, true, vars.price); // bools: coll increase, debt increase _requireNewTCRisAboveCCR(newTCR); } // --- Effects & interactions --- uint256 weightedRecordedTroveDebt = vars.compositeDebt * _annualInterestRate; - contractsCache.activePool.mintAggInterest(vars.compositeDebt, 0, vars.compositeDebt, 0, weightedRecordedTroveDebt, 0); + contractsCache.activePool.mintAggInterest( + vars.compositeDebt, 0, vars.compositeDebt, 0, weightedRecordedTroveDebt, 0 + ); // Set the stored Trove properties and mint the NFT vars.stake = contractsCache.troveManager.setTrovePropertiesOnOpen( - _owner, - troveId, - _ETHAmount, - vars.compositeDebt, - _annualInterestRate + _owner, troveId, _ETHAmount, vars.compositeDebt, _annualInterestRate ); sortedTroves.insert(troveId, _annualInterestRate, _upperHint, _lowerHint); @@ -251,35 +243,39 @@ contract BorrowerOperations is LiquityBase, Ownable, CheckContract, IBorrowerOpe } // Withdraw ETH collateral from a trove - function withdrawColl(uint256 _troveId, uint _collWithdrawal) external override { + function withdrawColl(uint256 _troveId, uint256 _collWithdrawal) external override { _adjustTrove(msg.sender, _troveId, _collWithdrawal, false, 0, false, 0); } // Withdraw Bold tokens from a trove: mint new Bold tokens to the owner, and increase the trove's debt accordingly - function withdrawBold(uint256 _troveId, uint _maxFeePercentage, uint _boldAmount ) external override { + function withdrawBold(uint256 _troveId, uint256 _maxFeePercentage, uint256 _boldAmount) external override { _adjustTrove(msg.sender, _troveId, 0, false, _boldAmount, true, _maxFeePercentage); } // Repay Bold tokens to a Trove: Burn the repaid Bold tokens, and reduce the trove's debt accordingly - function repayBold(uint256 _troveId, uint _boldAmount) external override { + function repayBold(uint256 _troveId, uint256 _boldAmount) external override { _adjustTrove(msg.sender, _troveId, 0, false, _boldAmount, false, 0); } function adjustTrove( uint256 _troveId, - uint _maxFeePercentage, - uint _collChange, + uint256 _maxFeePercentage, + uint256 _collChange, bool _isCollIncrease, - uint _boldChange, + uint256 _boldChange, bool _isDebtIncrease - ) - external - override - { - _adjustTrove(msg.sender, _troveId, _collChange, _isCollIncrease, _boldChange, _isDebtIncrease, _maxFeePercentage); + ) external override { + _adjustTrove( + msg.sender, _troveId, _collChange, _isCollIncrease, _boldChange, _isDebtIncrease, _maxFeePercentage + ); } - function adjustTroveInterestRate(uint256 _troveId, uint _newAnnualInterestRate, uint256 _upperHint, uint256 _lowerHint) external { + function adjustTroveInterestRate( + uint256 _troveId, + uint256 _newAnnualInterestRate, + uint256 _upperHint, + uint256 _lowerHint + ) external { _requireValidAnnualInterestRate(_newAnnualInterestRate); ITroveManager troveManagerCached = troveManager; _requireTroveisActive(troveManagerCached, _troveId); @@ -291,7 +287,9 @@ contract BorrowerOperations is LiquityBase, Ownable, CheckContract, IBorrowerOpe _requireValidAnnualInterestRate(_newAnnualInterestRate); _requireTroveisActive(contractsCache.troveManager, _troveId); - uint256 entireTroveDebt = _updateActivePoolTrackersNoDebtChange(contractsCache.troveManager, contractsCache.activePool, _troveId, _newAnnualInterestRate); + uint256 entireTroveDebt = _updateActivePoolTrackersNoDebtChange( + contractsCache.troveManager, contractsCache.activePool, _troveId, _newAnnualInterestRate + ); sortedTroves.reInsert(_troveId, _newAnnualInterestRate, _upperHint, _lowerHint); @@ -305,14 +303,12 @@ contract BorrowerOperations is LiquityBase, Ownable, CheckContract, IBorrowerOpe function _adjustTrove( address _sender, uint256 _troveId, - uint _collChange, + uint256 _collChange, bool _isCollIncrease, - uint _boldChange, + uint256 _boldChange, bool _isDebtIncrease, - uint _maxFeePercentage - ) - internal - { + uint256 _maxFeePercentage + ) internal { ContractsCacheTMAPBT memory contractsCache = ContractsCacheTMAPBT(troveManager, activePool, boldToken); LocalVariables_adjustTrove memory vars; @@ -338,23 +334,20 @@ contract BorrowerOperations is LiquityBase, Ownable, CheckContract, IBorrowerOpe // Confirm the operation is an ETH transfer if coming from the Stability Pool to a trove assert((msg.sender != stabilityPoolAddress || (_isCollIncrease && _boldChange == 0))); - (vars.entireDebt, vars.entireColl, vars.redistDebtGain, , vars.accruedTroveInterest) = contractsCache.troveManager.getEntireDebtAndColl(_troveId); + (vars.entireDebt, vars.entireColl, vars.redistDebtGain,, vars.accruedTroveInterest) = + contractsCache.troveManager.getEntireDebtAndColl(_troveId); // Get the trove's old ICR before the adjustment, and what its new ICR will be after the adjustment vars.oldICR = LiquityMath._computeCR(vars.entireColl, vars.entireDebt, vars.price); vars.newICR = _getNewICRFromTroveChange( - vars.entireColl, - vars.entireDebt, - _collChange, - _isCollIncrease, - _boldChange, - _isDebtIncrease, - vars.price + vars.entireColl, vars.entireDebt, _collChange, _isCollIncrease, _boldChange, _isDebtIncrease, vars.price ); assert(_isCollIncrease || _collChange <= vars.entireColl); // TODO: do we still need this? // Check the adjustment satisfies all conditions for the current system mode - _requireValidAdjustmentInCurrentMode(isRecoveryMode, _collChange, _isCollIncrease, _boldChange, _isDebtIncrease, vars); + _requireValidAdjustmentInCurrentMode( + isRecoveryMode, _collChange, _isCollIncrease, _boldChange, _isDebtIncrease, vars + ); // When the adjustment is a debt repayment, check it's a valid amount and that the caller has enough Bold if (!_isDebtIncrease && _boldChange > 0) { @@ -369,12 +362,7 @@ contract BorrowerOperations is LiquityBase, Ownable, CheckContract, IBorrowerOpe // Update the Trove's recorded coll and debt vars.newEntireColl = _updateTroveCollFromAdjustment( - contractsCache.troveManager, - _sender, - _troveId, - vars.entireColl, - _collChange, - _isCollIncrease + contractsCache.troveManager, _sender, _troveId, vars.entireColl, _collChange, _isCollIncrease ); vars.newEntireDebt = _updateTroveDebtFromAdjustment( contractsCache.troveManager, @@ -398,22 +386,22 @@ contract BorrowerOperations is LiquityBase, Ownable, CheckContract, IBorrowerOpe // Increase Trove debt by redist. gain and decrease by the repaid debt vars.troveDebtIncrease = vars.redistDebtGain; vars.troveDebtDecrease = _boldChange; - + vars.recordedDebtIncrease = vars.accruedTroveInterest; vars.recordedDebtDecrease = _boldChange; } activePool.mintAggInterest( - vars.troveDebtIncrease, - vars.troveDebtDecrease, - vars.recordedDebtIncrease, - vars.recordedDebtDecrease, - vars.newWeightedTroveDebt, + vars.troveDebtIncrease, + vars.troveDebtDecrease, + vars.recordedDebtIncrease, + vars.recordedDebtDecrease, + vars.newWeightedTroveDebt, vars.initialWeightedRecordedTroveDebt ); emit TroveUpdated(_troveId, vars.newEntireDebt, vars.newEntireColl, vars.stake, BorrowerOperation.adjustTrove); - emit BoldBorrowingFeePaid(_troveId, vars.BoldFee); // TODO + emit BoldBorrowingFeePaid(_troveId, vars.BoldFee); // TODO _moveTokensAndETHfromAdjustment( contractsCache.activePool, @@ -434,23 +422,25 @@ contract BorrowerOperations is LiquityBase, Ownable, CheckContract, IBorrowerOpe _requireCallerIsBorrower(contractsCache.troveManager, _troveId); _requireTroveisActive(contractsCache.troveManager, _troveId); - uint price = priceFeed.fetchPrice(); + uint256 price = priceFeed.fetchPrice(); _requireNotInRecoveryMode(price); uint256 initialWeightedRecordedTroveDebt = contractsCache.troveManager.getTroveWeightedRecordedDebt(_troveId); uint256 initialRecordedTroveDebt = contractsCache.troveManager.getTroveDebt(_troveId); - (uint256 entireTroveDebt, - uint256 entireTroveColl, - uint256 debtRedistGain, - , // ETHredist gain - uint256 accruedTroveInterest) = contractsCache.troveManager.getEntireDebtAndColl(_troveId); + ( + uint256 entireTroveDebt, + uint256 entireTroveColl, + uint256 debtRedistGain, + , // ETHredist gain + uint256 accruedTroveInterest + ) = contractsCache.troveManager.getEntireDebtAndColl(_troveId); // The borrower must repay their entire debt including accrued interest and redist. gains (and less the gas comp.) _requireSufficientBoldBalance(contractsCache.boldToken, msg.sender, entireTroveDebt - BOLD_GAS_COMPENSATION); // The TCR always includes A Trove's redist. gain and accrued interest, so we must use the Trove's entire debt here - uint newTCR = _getNewTCRFromTroveChange(entireTroveColl, false, entireTroveDebt, false, price); + uint256 newTCR = _getNewTCRFromTroveChange(entireTroveColl, false, entireTroveDebt, false, price); _requireNewTCRisAboveCCR(newTCR); // --- Effects and interactions --- @@ -467,7 +457,9 @@ contract BorrowerOperations is LiquityBase, Ownable, CheckContract, IBorrowerOpe // TODO: If/when redist. gains are gas-optimized, exclude them from here too. uint256 recordedDebtSumDecrease = initialRecordedTroveDebt + debtRedistGain; - contractsCache.activePool.mintAggInterest(0, troveDebtDecrease, 0, recordedDebtSumDecrease, 0, initialWeightedRecordedTroveDebt); + contractsCache.activePool.mintAggInterest( + 0, troveDebtDecrease, 0, recordedDebtSumDecrease, 0, initialWeightedRecordedTroveDebt + ); contractsCache.troveManager.removeStake(_troveId); contractsCache.troveManager.closeTrove(_troveId); @@ -490,7 +482,9 @@ contract BorrowerOperations is LiquityBase, Ownable, CheckContract, IBorrowerOpe uint256 annualInterestRate = contractsCache.troveManager.getTroveAnnualInterestRate(_troveId); - uint256 entireTroveDebt = _updateActivePoolTrackersNoDebtChange(contractsCache.troveManager, contractsCache.activePool, _troveId, annualInterestRate); + uint256 entireTroveDebt = _updateActivePoolTrackersNoDebtChange( + contractsCache.troveManager, contractsCache.activePool, _troveId, annualInterestRate + ); // Update Trove recorded debt contractsCache.troveManager.updateTroveDebtFromInterestApplication(_troveId, entireTroveDebt); @@ -516,19 +510,16 @@ contract BorrowerOperations is LiquityBase, Ownable, CheckContract, IBorrowerOpe // --- Helper functions --- - function _getUSDValue(uint _coll, uint _price) internal pure returns (uint) { - uint usdValue = _price * _coll / DECIMAL_PRECISION; + function _getUSDValue(uint256 _coll, uint256 _price) internal pure returns (uint256) { + uint256 usdValue = _price * _coll / DECIMAL_PRECISION; return usdValue; } - function _getCollChange( - uint _collReceived, - uint _requestedCollWithdrawal - ) + function _getCollChange(uint256 _collReceived, uint256 _requestedCollWithdrawal) internal pure - returns(uint collChange, bool isCollIncrease) + returns (uint256 collChange, bool isCollIncrease) { if (_collReceived != 0) { collChange = _collReceived; @@ -540,18 +531,14 @@ contract BorrowerOperations is LiquityBase, Ownable, CheckContract, IBorrowerOpe // Update Trove's coll whether they added or removed collateral. Assumes any ETH redistribution gain was already applied // to the Trove's coll. - function _updateTroveCollFromAdjustment - ( + function _updateTroveCollFromAdjustment( ITroveManager _troveManager, address _sender, uint256 _troveId, uint256 _oldEntireColl, - uint _collChange, + uint256 _collChange, bool _isCollIncrease - ) - internal - returns (uint256) - { + ) internal returns (uint256) { uint256 newEntireColl; if (_collChange > 0) { @@ -571,14 +558,11 @@ contract BorrowerOperations is LiquityBase, Ownable, CheckContract, IBorrowerOpe address _sender, uint256 _troveId, uint256 _oldEntireDebt, - uint256 _debtChange, + uint256 _debtChange, bool _isDebtIncrease, uint256 _accruedTroveInterest - ) - internal - returns (uint256) - { - uint newEntireDebt; + ) internal returns (uint256) { + uint256 newEntireDebt; if (_debtChange > 0) { newEntireDebt = _isDebtIncrease ? _oldEntireDebt + _debtChange : _oldEntireDebt - _debtChange; _troveManager.updateTroveDebt(_sender, _troveId, newEntireDebt, _isDebtIncrease); @@ -589,24 +573,21 @@ contract BorrowerOperations is LiquityBase, Ownable, CheckContract, IBorrowerOpe } } - return newEntireDebt; + return newEntireDebt; } - // This function mints the BOLD corresponding to the borrower's chosen debt increase + // This function mints the BOLD corresponding to the borrower's chosen debt increase // (it does not mint the accrued interest). - function _moveTokensAndETHfromAdjustment - ( + function _moveTokensAndETHfromAdjustment( IActivePool _activePool, IBoldToken _boldToken, ITroveManager _troveManager, uint256 _troveId, - uint _collChange, + uint256 _collChange, bool _isCollIncrease, - uint _boldChange, + uint256 _boldChange, bool _isDebtIncrease - ) - internal - { + ) internal { if (_isDebtIncrease) { address borrower = _troveManager.ownerOf(_troveId); _boldToken.mint(borrower, _boldChange); @@ -631,16 +612,12 @@ contract BorrowerOperations is LiquityBase, Ownable, CheckContract, IBorrowerOpe _activePool.receiveETH(_amount); } - function _updateActivePoolTrackersNoDebtChange - ( + function _updateActivePoolTrackersNoDebtChange( ITroveManager _troveManager, IActivePool _activePool, uint256 _troveId, uint256 _annualInterestRate - ) - internal - returns (uint256) - { + ) internal returns (uint256) { uint256 initialWeightedRecordedTroveDebt = _troveManager.getTroveWeightedRecordedDebt(_troveId); // --- Effects --- @@ -653,19 +630,26 @@ contract BorrowerOperations is LiquityBase, Ownable, CheckContract, IBorrowerOpe // Add only the Trove's accrued interest to the recorded debt tracker since we have already applied redist. gains. // No debt is issued/repaid, so the net Trove debt change is purely the redistribution gain // TODO: also include redist. gains here in the recordedSumIncrease arg if we gas-optimize them - _activePool.mintAggInterest(redistDebtGain, 0, accruedTroveInterest, 0, newWeightedTroveDebt, initialWeightedRecordedTroveDebt); - + _activePool.mintAggInterest( + redistDebtGain, 0, accruedTroveInterest, 0, newWeightedTroveDebt, initialWeightedRecordedTroveDebt + ); + return entireTroveDebt; } // --- 'Require' wrapper functions --- - function _requireCallerIsBorrower(ITroveManager _troveManager , uint256 _troveId) internal view { - require(msg.sender == _troveManager.ownerOf(_troveId), "BorrowerOps: Caller must be the borrower for a withdrawal"); + function _requireCallerIsBorrower(ITroveManager _troveManager, uint256 _troveId) internal view { + require( + msg.sender == _troveManager.ownerOf(_troveId), "BorrowerOps: Caller must be the borrower for a withdrawal" + ); } - function _requireNonZeroAdjustment(uint _collChange, uint _boldChange) internal pure { - require(_collChange != 0 || _boldChange != 0, "BorrowerOps: There must be either a collateral change or a debt change"); + function _requireNonZeroAdjustment(uint256 _collChange, uint256 _boldChange) internal pure { + require( + _collChange != 0 || _boldChange != 0, + "BorrowerOps: There must be either a collateral change or a debt change" + ); } function _requireIsOwner(uint256 _troveId) internal view { @@ -673,43 +657,41 @@ contract BorrowerOperations is LiquityBase, Ownable, CheckContract, IBorrowerOpe } function _requireTroveisActive(ITroveManager _troveManager, uint256 _troveId) internal view { - uint status = _troveManager.getTroveStatus(_troveId); + uint256 status = _troveManager.getTroveStatus(_troveId); require(status == 1, "BorrowerOps: Trove does not exist or is closed"); } function _requireTroveisNotActive(ITroveManager _troveManager, uint256 _troveId) internal view { - uint status = _troveManager.getTroveStatus(_troveId); + uint256 status = _troveManager.getTroveStatus(_troveId); require(status != 1, "BorrowerOps: Trove is active"); } - function _requireNonZeroCollChange(uint _collChange) internal pure { + function _requireNonZeroCollChange(uint256 _collChange) internal pure { require(_collChange > 0, "BorrowerOps: Coll increase requires non-zero collChange"); } - function _requireNonZeroDebtChange(uint _boldChange) internal pure { + function _requireNonZeroDebtChange(uint256 _boldChange) internal pure { require(_boldChange > 0, "BorrowerOps: Debt increase requires non-zero debtChange"); } - function _requireNotInRecoveryMode(uint _price) internal view { + function _requireNotInRecoveryMode(uint256 _price) internal view { require(!_checkRecoveryMode(_price), "BorrowerOps: Operation not permitted during Recovery Mode"); } - function _requireNoCollWithdrawal(uint _collWithdrawal, bool _isCollIncrease) internal pure { - require(_collWithdrawal == 0 || _isCollIncrease, "BorrowerOps: Collateral withdrawal not permitted Recovery Mode"); + function _requireNoCollWithdrawal(uint256 _collWithdrawal, bool _isCollIncrease) internal pure { + require( + _collWithdrawal == 0 || _isCollIncrease, "BorrowerOps: Collateral withdrawal not permitted Recovery Mode" + ); } - function _requireValidAdjustmentInCurrentMode - ( + function _requireValidAdjustmentInCurrentMode( bool _isRecoveryMode, - uint _collChange, + uint256 _collChange, bool _isCollIncrease, uint256 _boldChange, bool _isDebtIncrease, LocalVariables_adjustTrove memory _vars - ) - internal - view - { + ) internal view { /* *In Recovery Mode, only allow: * @@ -729,52 +711,64 @@ contract BorrowerOperations is LiquityBase, Ownable, CheckContract, IBorrowerOpe _requireICRisAboveCCR(_vars.newICR); _requireNewICRisAboveOldICR(_vars.newICR, _vars.oldICR); } - } else { // if Normal Mode + } else { + // if Normal Mode _requireICRisAboveMCR(_vars.newICR); - _vars.newTCR = _getNewTCRFromTroveChange(_collChange, _isCollIncrease, _boldChange, _isDebtIncrease, _vars.price); + _vars.newTCR = + _getNewTCRFromTroveChange(_collChange, _isCollIncrease, _boldChange, _isDebtIncrease, _vars.price); _requireNewTCRisAboveCCR(_vars.newTCR); } } - function _requireICRisAboveMCR(uint _newICR) internal pure { + function _requireICRisAboveMCR(uint256 _newICR) internal pure { require(_newICR >= MCR, "BorrowerOps: An operation that would result in ICR < MCR is not permitted"); } - function _requireICRisAboveCCR(uint _newICR) internal pure { + function _requireICRisAboveCCR(uint256 _newICR) internal pure { require(_newICR >= CCR, "BorrowerOps: Operation must leave trove with ICR >= CCR"); } - function _requireNewICRisAboveOldICR(uint _newICR, uint _oldICR) internal pure { + function _requireNewICRisAboveOldICR(uint256 _newICR, uint256 _oldICR) internal pure { require(_newICR >= _oldICR, "BorrowerOps: Cannot decrease your Trove's ICR in Recovery Mode"); } - function _requireNewTCRisAboveCCR(uint _newTCR) internal pure { + function _requireNewTCRisAboveCCR(uint256 _newTCR) internal pure { require(_newTCR >= CCR, "BorrowerOps: An operation that would result in TCR < CCR is not permitted"); } - function _requireAtLeastMinNetDebt(uint _netDebt) internal pure { - require (_netDebt >= MIN_NET_DEBT, "BorrowerOps: Trove's net debt must be greater than minimum"); + function _requireAtLeastMinNetDebt(uint256 _netDebt) internal pure { + require(_netDebt >= MIN_NET_DEBT, "BorrowerOps: Trove's net debt must be greater than minimum"); } - function _requireValidBoldRepayment(uint _currentDebt, uint _debtRepayment) internal pure { - require(_debtRepayment <= _currentDebt - BOLD_GAS_COMPENSATION, "BorrowerOps: Amount repaid must not be larger than the Trove's debt"); + function _requireValidBoldRepayment(uint256 _currentDebt, uint256 _debtRepayment) internal pure { + require( + _debtRepayment <= _currentDebt - BOLD_GAS_COMPENSATION, + "BorrowerOps: Amount repaid must not be larger than the Trove's debt" + ); } function _requireCallerIsStabilityPool() internal view { require(msg.sender == stabilityPoolAddress, "BorrowerOps: Caller is not Stability Pool"); } - function _requireSufficientBoldBalance(IBoldToken _boldToken, address _borrower, uint _debtRepayment) internal view { - require(_boldToken.balanceOf(_borrower) >= _debtRepayment, "BorrowerOps: Caller doesnt have enough Bold to make repayment"); + function _requireSufficientBoldBalance(IBoldToken _boldToken, address _borrower, uint256 _debtRepayment) + internal + view + { + require( + _boldToken.balanceOf(_borrower) >= _debtRepayment, + "BorrowerOps: Caller doesnt have enough Bold to make repayment" + ); } - function _requireValidMaxFeePercentage(uint _maxFeePercentage, bool _isRecoveryMode) internal pure { + function _requireValidMaxFeePercentage(uint256 _maxFeePercentage, bool _isRecoveryMode) internal pure { if (_isRecoveryMode) { - require(_maxFeePercentage <= DECIMAL_PRECISION, - "Max fee percentage must less than or equal to 100%"); + require(_maxFeePercentage <= DECIMAL_PRECISION, "Max fee percentage must less than or equal to 100%"); } else { - require(_maxFeePercentage >= BORROWING_FEE_FLOOR && _maxFeePercentage <= DECIMAL_PRECISION, - "Max fee percentage must be between 0.5% and 100%"); + require( + _maxFeePercentage >= BORROWING_FEE_FLOOR && _maxFeePercentage <= DECIMAL_PRECISION, + "Max fee percentage must be between 0.5% and 100%" + ); } } @@ -782,78 +776,65 @@ contract BorrowerOperations is LiquityBase, Ownable, CheckContract, IBorrowerOpe require(_annualInterestRate <= MAX_ANNUAL_INTEREST_RATE, "Interest rate must not be greater than max"); } - function _requireTroveIsStale(ITroveManager _troveManager, uint256 _troveId) internal view { + function _requireTroveIsStale(ITroveManager _troveManager, uint256 _troveId) internal view { require(_troveManager.troveIsStale(_troveId), "BO: Trove must be stale"); } // --- ICR and TCR getters --- // Compute the new collateral ratio, considering the change in coll and debt. Assumes 0 pending rewards. - function _getNewICRFromTroveChange - ( - uint _coll, - uint _debt, - uint _collChange, + function _getNewICRFromTroveChange( + uint256 _coll, + uint256 _debt, + uint256 _collChange, bool _isCollIncrease, - uint _debtChange, + uint256 _debtChange, bool _isDebtIncrease, - uint _price - ) - pure - internal - returns (uint) - { - (uint newColl, uint newDebt) = _getNewTroveAmounts(_coll, _debt, _collChange, _isCollIncrease, _debtChange, _isDebtIncrease); + uint256 _price + ) internal pure returns (uint256) { + (uint256 newColl, uint256 newDebt) = + _getNewTroveAmounts(_coll, _debt, _collChange, _isCollIncrease, _debtChange, _isDebtIncrease); - uint newICR = LiquityMath._computeCR(newColl, newDebt, _price); + uint256 newICR = LiquityMath._computeCR(newColl, newDebt, _price); return newICR; } function _getNewTroveAmounts( - uint _coll, - uint _debt, - uint _collChange, + uint256 _coll, + uint256 _debt, + uint256 _collChange, bool _isCollIncrease, - uint _debtChange, + uint256 _debtChange, bool _isDebtIncrease - ) - internal - pure - returns (uint, uint) - { - uint newColl = _coll; - uint newDebt = _debt; + ) internal pure returns (uint256, uint256) { + uint256 newColl = _coll; + uint256 newDebt = _debt; - newColl = _isCollIncrease ? _coll + _collChange : _coll - _collChange; + newColl = _isCollIncrease ? _coll + _collChange : _coll - _collChange; newDebt = _isDebtIncrease ? _debt + _debtChange : _debt - _debtChange; return (newColl, newDebt); } - function _getNewTCRFromTroveChange - ( - uint _collChange, + function _getNewTCRFromTroveChange( + uint256 _collChange, bool _isCollIncrease, - uint _debtChange, + uint256 _debtChange, bool _isDebtIncrease, - uint _price - ) - internal - view - returns (uint) - { - uint totalColl = getEntireSystemColl(); - uint totalDebt = getEntireSystemDebt(); + uint256 _price + ) internal view returns (uint256) { + uint256 totalColl = getEntireSystemColl(); + uint256 totalDebt = getEntireSystemDebt(); totalColl = _isCollIncrease ? totalColl + _collChange : totalColl - _collChange; totalDebt = _isDebtIncrease ? totalDebt + _debtChange : totalDebt - _debtChange; - uint newTCR = LiquityMath._computeCR(totalColl, totalDebt, _price); + uint256 newTCR = LiquityMath._computeCR(totalColl, totalDebt, _price); return newTCR; } - function getCompositeDebt(uint _debt) external pure override returns (uint) { + function getCompositeDebt(uint256 _debt) external pure override returns (uint256) { return _getCompositeDebt(_debt); } } diff --git a/contracts/src/CollSurplusPool.sol b/contracts/src/CollSurplusPool.sol index c277e4d4..76599a86 100644 --- a/contracts/src/CollSurplusPool.sol +++ b/contracts/src/CollSurplusPool.sol @@ -8,11 +8,10 @@ import "./Interfaces/ICollSurplusPool.sol"; import "./Dependencies/Ownable.sol"; import "./Dependencies/CheckContract.sol"; - contract CollSurplusPool is Ownable, CheckContract, ICollSurplusPool { using SafeERC20 for IERC20; - string constant public NAME = "CollSurplusPool"; + string public constant NAME = "CollSurplusPool"; IERC20 public immutable ETH; address public borrowerOperationsAddress; @@ -22,7 +21,7 @@ contract CollSurplusPool is Ownable, CheckContract, ICollSurplusPool { // deposited ether tracker uint256 internal ETHBalance; // Collateral surplus claimable by trove owners - mapping (uint256 => uint) internal balances; + mapping(uint256 => uint256) internal balances; // --- Events --- @@ -30,8 +29,8 @@ contract CollSurplusPool is Ownable, CheckContract, ICollSurplusPool { event TroveManagerAddressChanged(address _newTroveManagerAddress); event ActivePoolAddressChanged(address _newActivePoolAddress); - event CollBalanceUpdated(uint256 indexed _troveId, uint _newBalance); - event EtherSent(address _to, uint _amount); + event CollBalanceUpdated(uint256 indexed _troveId, uint256 _newBalance); + event EtherSent(address _to, uint256 _amount); constructor(address _ETHAddress) { checkContract(_ETHAddress); @@ -40,11 +39,7 @@ contract CollSurplusPool is Ownable, CheckContract, ICollSurplusPool { // --- Contract setters --- - function setAddresses( - address _borrowerOperationsAddress, - address _troveManagerAddress, - address _activePoolAddress - ) + function setAddresses(address _borrowerOperationsAddress, address _troveManagerAddress, address _activePoolAddress) external override onlyOwner @@ -66,20 +61,20 @@ contract CollSurplusPool is Ownable, CheckContract, ICollSurplusPool { /* Returns the ETHBalance state variable Not necessarily equal to the raw ether balance - ether can be forcibly sent to contracts. */ - function getETHBalance() external view override returns (uint) { + function getETHBalance() external view override returns (uint256) { return ETHBalance; } - function getCollateral(uint256 _troveId) external view override returns (uint) { + function getCollateral(uint256 _troveId) external view override returns (uint256) { return balances[_troveId]; } // --- Pool functionality --- - function accountSurplus(uint256 _troveId, uint _amount) external override { + function accountSurplus(uint256 _troveId, uint256 _amount) external override { _requireCallerIsTroveManager(); - uint newAmount = balances[_troveId] + _amount; + uint256 newAmount = balances[_troveId] + _amount; balances[_troveId] = newAmount; ETHBalance = ETHBalance + _amount; @@ -88,7 +83,7 @@ contract CollSurplusPool is Ownable, CheckContract, ICollSurplusPool { function claimColl(address _account, uint256 _troveId) external override { _requireCallerIsBorrowerOperations(); - uint claimableColl = balances[_troveId]; + uint256 claimableColl = balances[_troveId]; require(claimableColl > 0, "CollSurplusPool: No collateral available to claim"); balances[_troveId] = 0; @@ -103,20 +98,14 @@ contract CollSurplusPool is Ownable, CheckContract, ICollSurplusPool { // --- 'require' functions --- function _requireCallerIsBorrowerOperations() internal view { - require( - msg.sender == borrowerOperationsAddress, - "CollSurplusPool: Caller is not Borrower Operations"); + require(msg.sender == borrowerOperationsAddress, "CollSurplusPool: Caller is not Borrower Operations"); } function _requireCallerIsTroveManager() internal view { - require( - msg.sender == troveManagerAddress, - "CollSurplusPool: Caller is not TroveManager"); + require(msg.sender == troveManagerAddress, "CollSurplusPool: Caller is not TroveManager"); } function _requireCallerIsActivePool() internal view { - require( - msg.sender == activePoolAddress, - "CollSurplusPool: Caller is not Active Pool"); + require(msg.sender == activePoolAddress, "CollSurplusPool: Caller is not Active Pool"); } } diff --git a/contracts/src/DefaultPool.sol b/contracts/src/DefaultPool.sol index a2fa6936..df5be540 100644 --- a/contracts/src/DefaultPool.sol +++ b/contracts/src/DefaultPool.sol @@ -4,10 +4,10 @@ pragma solidity 0.8.18; import "openzeppelin-contracts/contracts/token/ERC20/utils/SafeERC20.sol"; -import './Interfaces/IActivePool.sol'; +import "./Interfaces/IActivePool.sol"; import "./Dependencies/Ownable.sol"; import "./Dependencies/CheckContract.sol"; -import './Interfaces/IDefaultPool.sol'; +import "./Interfaces/IDefaultPool.sol"; /* * The Default Pool holds the ETH and Bold debt (but not Bold tokens) from liquidations that have been redistributed @@ -19,19 +19,19 @@ import './Interfaces/IDefaultPool.sol'; contract DefaultPool is Ownable, CheckContract, IDefaultPool { using SafeERC20 for IERC20; - string constant public NAME = "DefaultPool"; + string public constant NAME = "DefaultPool"; IERC20 public immutable ETH; address public troveManagerAddress; address public activePoolAddress; - uint256 internal ETHBalance; // deposited ETH tracker - uint256 internal BoldDebt; // debt + uint256 internal ETHBalance; // deposited ETH tracker + uint256 internal BoldDebt; // debt event ActivePoolAddressChanged(address _newActivePoolAddress); - event EtherSent(address _to, uint _amount); + event EtherSent(address _to, uint256 _amount); event TroveManagerAddressChanged(address _newTroveManagerAddress); - event DefaultPoolBoldDebtUpdated(uint _boldDebt); - event DefaultPoolETHBalanceUpdated(uint _ETHBalance); + event DefaultPoolBoldDebtUpdated(uint256 _boldDebt); + event DefaultPoolETHBalanceUpdated(uint256 _ETHBalance); constructor(address _ETHAddress) { checkContract(_ETHAddress); @@ -40,13 +40,7 @@ contract DefaultPool is Ownable, CheckContract, IDefaultPool { // --- Dependency setters --- - function setAddresses( - address _troveManagerAddress, - address _activePoolAddress - ) - external - onlyOwner - { + function setAddresses(address _troveManagerAddress, address _activePoolAddress) external onlyOwner { checkContract(_troveManagerAddress); checkContract(_activePoolAddress); @@ -69,17 +63,17 @@ contract DefaultPool is Ownable, CheckContract, IDefaultPool { * * Not necessarily equal to the the contract's raw ETH balance - ether can be forcibly sent to contracts. */ - function getETHBalance() external view override returns (uint) { + function getETHBalance() external view override returns (uint256) { return ETHBalance; } - function getBoldDebt() external view override returns (uint) { + function getBoldDebt() external view override returns (uint256) { return BoldDebt; } // --- Pool functionality --- - function sendETHToActivePool(uint _amount) external override { + function sendETHToActivePool(uint256 _amount) external override { _requireCallerIsTroveManager(); address activePool = activePoolAddress; // cache to save an SLOAD uint256 newETHBalance = ETHBalance - _amount; @@ -103,13 +97,13 @@ contract DefaultPool is Ownable, CheckContract, IDefaultPool { emit DefaultPoolETHBalanceUpdated(newETHBalance); } - function increaseBoldDebt(uint _amount) external override { + function increaseBoldDebt(uint256 _amount) external override { _requireCallerIsTroveManager(); BoldDebt = BoldDebt + _amount; emit DefaultPoolBoldDebtUpdated(BoldDebt); } - function decreaseBoldDebt(uint _amount) external override { + function decreaseBoldDebt(uint256 _amount) external override { _requireCallerIsTroveManager(); BoldDebt = BoldDebt - _amount; emit DefaultPoolBoldDebtUpdated(BoldDebt); diff --git a/contracts/src/Dependencies/AggregatorV3Interface.sol b/contracts/src/Dependencies/AggregatorV3Interface.sol index 097fd6a8..9de8e85c 100644 --- a/contracts/src/Dependencies/AggregatorV3Interface.sol +++ b/contracts/src/Dependencies/AggregatorV3Interface.sol @@ -4,33 +4,20 @@ pragma solidity 0.8.18; interface AggregatorV3Interface { + function decimals() external view returns (uint8); + function description() external view returns (string memory); + function version() external view returns (uint256); - function decimals() external view returns (uint8); - function description() external view returns (string memory); - function version() external view returns (uint256); + // getRoundData and latestRoundData should both raise "No data present" + // if they do not have data to report, instead of returning unset values + // which could be misinterpreted as actual reported values. + function getRoundData(uint80 _roundId) + external + view + returns (uint80 roundId, int256 answer, uint256 startedAt, uint256 updatedAt, uint80 answeredInRound); - // getRoundData and latestRoundData should both raise "No data present" - // if they do not have data to report, instead of returning unset values - // which could be misinterpreted as actual reported values. - function getRoundData(uint80 _roundId) - external - view - returns ( - uint80 roundId, - int256 answer, - uint256 startedAt, - uint256 updatedAt, - uint80 answeredInRound - ); - - function latestRoundData() - external - view - returns ( - uint80 roundId, - int256 answer, - uint256 startedAt, - uint256 updatedAt, - uint80 answeredInRound - ); + function latestRoundData() + external + view + returns (uint80 roundId, int256 answer, uint256 startedAt, uint256 updatedAt, uint80 answeredInRound); } diff --git a/contracts/src/Dependencies/BaseMath.sol b/contracts/src/Dependencies/BaseMath.sol index 08ff0338..db68d982 100644 --- a/contracts/src/Dependencies/BaseMath.sol +++ b/contracts/src/Dependencies/BaseMath.sol @@ -1,7 +1,6 @@ // SPDX-License-Identifier: MIT pragma solidity 0.8.18; - contract BaseMath { - uint constant public DECIMAL_PRECISION = 1e18; + uint256 public constant DECIMAL_PRECISION = 1e18; } diff --git a/contracts/src/Dependencies/CheckContract.sol b/contracts/src/Dependencies/CheckContract.sol index 632746b4..6b933e7e 100644 --- a/contracts/src/Dependencies/CheckContract.sol +++ b/contracts/src/Dependencies/CheckContract.sol @@ -2,7 +2,6 @@ pragma solidity 0.8.18; - contract CheckContract { /** * Check that the account is an already deployed non-destroyed contract. @@ -13,7 +12,9 @@ contract CheckContract { uint256 size; // solhint-disable-next-line no-inline-assembly - assembly { size := extcodesize(_account) } + assembly { + size := extcodesize(_account) + } require(size > 0, "Account code size cannot be zero"); } } diff --git a/contracts/src/Dependencies/ITellor.sol b/contracts/src/Dependencies/ITellor.sol index 932c7903..3dad55e5 100644 --- a/contracts/src/Dependencies/ITellor.sol +++ b/contracts/src/Dependencies/ITellor.sol @@ -11,11 +11,7 @@ interface ITellor { * @param _minerIndex the index of the miner that submitted the value being disputed. Since each official value * requires 5 miners to submit a value. */ - function beginDispute( - uint256 _requestId, - uint256 _timestamp, - uint256 _minerIndex - ) external; + function beginDispute(uint256 _requestId, uint256 _timestamp, uint256 _minerIndex) external; /** * @dev Allows token holders to vote @@ -51,11 +47,7 @@ interface ITellor { * @param _value of api query * */ - function submitMiningSolution( - string calldata _nonce, - uint256 _requestId, - uint256 _value - ) external; + function submitMiningSolution(string calldata _nonce, uint256 _requestId, uint256 _value) external; /** * @dev This is called by the miner when they submit the PoW solution (proof of work and value) @@ -63,11 +55,8 @@ interface ITellor { * @param _requestId is the array of the 5 PSR's being mined * @param _value is an array of 5 values */ - function submitMiningSolution( - string calldata _nonce, - uint256[5] calldata _requestId, - uint256[5] calldata _value - ) external; + function submitMiningSolution(string calldata _nonce, uint256[5] calldata _requestId, uint256[5] calldata _value) + external; /** * @dev Allows the current owner to propose transfer control of the contract to a @@ -123,11 +112,7 @@ interface ITellor { * @param _amount The amount of tokens to be transferred * @return True if the transfer was successful */ - function transferFrom( - address _from, - address _to, - uint256 _amount - ) external returns (bool); + function transferFrom(address _from, address _to, uint256 _amount) external returns (bool); /** * @dev Allows users to access the token's name @@ -151,21 +136,13 @@ interface ITellor { function getNewCurrentVariables() external view - returns ( - bytes32 _challenge, - uint256[5] memory _requestIds, - uint256 _difficutly, - uint256 _tip - ); + returns (bytes32 _challenge, uint256[5] memory _requestIds, uint256 _difficutly, uint256 _tip); /** * @dev Getter for the top tipped 5 requests Id's * @return _requestIds the 5 requestsId */ - function getTopRequestIDs() - external - view - returns (uint256[5] memory _requestIds); + function getTopRequestIDs() external view returns (uint256[5] memory _requestIds); /** * @dev Getter for the 5 requests Id's next in line to get mined @@ -194,10 +171,7 @@ interface ITellor { * @param _spender address * @return Returns the remaining allowance of tokens granted to the _spender from the _user */ - function allowance(address _user, address _spender) - external - view - returns (uint256); + function allowance(address _user, address _spender) external view returns (uint256); /** * @dev This function returns whether or not a given user is allowed to trade a given amount @@ -205,10 +179,7 @@ interface ITellor { * @param _amount uint of amount * @return true if the user is alloed to trade the amount specified */ - function allowedToTrade(address _user, uint256 _amount) - external - view - returns (bool); + function allowedToTrade(address _user, uint256 _amount) external view returns (bool); /** * @dev Gets balance of owner specified @@ -223,10 +194,7 @@ interface ITellor { * @param _blockNumber The block number when the balance is queried * @return The balance at _blockNumber */ - function balanceOfAt(address _user, uint256 _blockNumber) - external - view - returns (uint256); + function balanceOfAt(address _user, uint256 _blockNumber) external view returns (uint256); /** * @dev This function tells you if a given challenge has been completed by a given miner @@ -234,10 +202,7 @@ interface ITellor { * @param _miner address that you want to know if they solved the challenge * @return true if the _miner address provided solved the */ - function didMine(bytes32 _challenge, address _miner) - external - view - returns (bool); + function didMine(bytes32 _challenge, address _miner) external view returns (bool); /** * @dev Checks if an address voted in a given dispute @@ -245,10 +210,7 @@ interface ITellor { * @param _address to look up * @return bool of whether or not party voted */ - function didVote(uint256 _disputeId, address _address) - external - view - returns (bool); + function didVote(uint256 _disputeId, address _address) external view returns (bool); /** * @dev allows Tellor to read data from the addressVars mapping @@ -284,43 +246,20 @@ interface ITellor { function getAllDisputeVars(uint256 _disputeId) external view - returns ( - bytes32, - bool, - bool, - bool, - address, - address, - address, - uint256[9] memory, - int256 - ); + returns (bytes32, bool, bool, bool, address, address, address, uint256[9] memory, int256); /** * @dev Getter function for variables for the requestId being currently mined(currentRequestId) * @return current challenge, curretnRequestId, level of difficulty, api/query string, and granularity(number of decimals requested), total tip for the request */ - function getCurrentVariables() - external - view - returns ( - bytes32, - uint256, - uint256, - string memory, - uint256, - uint256 - ); + function getCurrentVariables() external view returns (bytes32, uint256, uint256, string memory, uint256, uint256); /** * @dev Checks if a given hash of miner,requestId has been disputed * @param _hash is the sha256(abi.encodePacked(_miners[2],_requestId)); * @return uint disputeId */ - function getDisputeIdByDisputeHash(bytes32 _hash) - external - view - returns (uint256); + function getDisputeIdByDisputeHash(bytes32 _hash) external view returns (uint256); /** * @dev Checks for uint variables in the disputeUintVars mapping based on the disuputeId @@ -330,10 +269,7 @@ interface ITellor { * commented out under the disputeUintVars under the Dispute struct * @return uint value for the bytes32 data submitted */ - function getDisputeUintVars(uint256 _disputeId, bytes32 _data) - external - view - returns (uint256); + function getDisputeUintVars(uint256 _disputeId, bytes32 _data) external view returns (uint256); /** * @dev Gets the a value for the latest timestamp available @@ -347,10 +283,7 @@ interface ITellor { * @param _requestId being requested * @return value for timestamp of last proof of work submited and if true if it exist or 0 and false if it doesn't */ - function getLastNewValueById(uint256 _requestId) - external - view - returns (uint256, bool); + function getLastNewValueById(uint256 _requestId) external view returns (uint256, bool); /** * @dev Gets blocknumber for mined timestamp @@ -358,10 +291,7 @@ interface ITellor { * @param _timestamp is the timestamp to look up blocknumber * @return uint of the blocknumber which the dispute was mined */ - function getMinedBlockNum(uint256 _requestId, uint256 _timestamp) - external - view - returns (uint256); + function getMinedBlockNum(uint256 _requestId, uint256 _timestamp) external view returns (uint256); /** * @dev Gets the 5 miners who mined the value for the specified requestId/_timestamp @@ -369,10 +299,10 @@ interface ITellor { * @param _timestamp is the timestamp to look up miners for * @return the 5 miners' addresses */ - function getMinersByRequestIdAndTimestamp( - uint256 _requestId, - uint256 _timestamp - ) external view returns (address[5] memory); + function getMinersByRequestIdAndTimestamp(uint256 _requestId, uint256 _timestamp) + external + view + returns (address[5] memory); /** * @dev Counts the number of values that have been submited for the request @@ -381,40 +311,28 @@ interface ITellor { * @param _requestId the requestId to look up * @return uint count of the number of values received for the requestId */ - function getNewValueCountbyRequestId(uint256 _requestId) - external - view - returns (uint256); + function getNewValueCountbyRequestId(uint256 _requestId) external view returns (uint256); /** * @dev Getter function for the specified requestQ index * @param _index to look up in the requestQ array * @return uint of reqeuestId */ - function getRequestIdByRequestQIndex(uint256 _index) - external - view - returns (uint256); + function getRequestIdByRequestQIndex(uint256 _index) external view returns (uint256); /** * @dev Getter function for requestId based on timestamp * @param _timestamp to check requestId * @return uint of reqeuestId */ - function getRequestIdByTimestamp(uint256 _timestamp) - external - view - returns (uint256); + function getRequestIdByTimestamp(uint256 _timestamp) external view returns (uint256); /** * @dev Getter function for requestId based on the queryHash * @param _request is the hash(of string api and granularity) to check if a request already exists * @return uint requestId */ - function getRequestIdByQueryHash(bytes32 _request) - external - view - returns (uint256); + function getRequestIdByQueryHash(bytes32 _request) external view returns (uint256); /** * @dev Getter function for the requestQ array @@ -431,10 +349,7 @@ interface ITellor { * commented out under the apiUintVars under the requestDetails struct * @return uint value of the apiUintVars specified in _data for the requestId specified */ - function getRequestUintVars(uint256 _requestId, bytes32 _data) - external - view - returns (uint256); + function getRequestUintVars(uint256 _requestId, bytes32 _data) external view returns (uint256); /** * @dev Gets the API struct variables that are not mappings @@ -449,14 +364,7 @@ interface ITellor { function getRequestVars(uint256 _requestId) external view - returns ( - string memory, - string memory, - bytes32, - uint256, - uint256, - uint256 - ); + returns (string memory, string memory, bytes32, uint256, uint256, uint256); /** * @dev This function allows users to retireve all information about a staker @@ -464,10 +372,7 @@ interface ITellor { * @return uint current state of staker * @return uint startDate of staking */ - function getStakerInfo(address _staker) - external - view - returns (uint256, uint256); + function getStakerInfo(address _staker) external view returns (uint256, uint256); /** * @dev Gets the 5 miners who mined the value for the specified requestId/_timestamp @@ -486,10 +391,7 @@ interface ITellor { * @param _index is the value index to look up * @return uint timestamp */ - function getTimestampbyRequestIDandIndex(uint256 _requestID, uint256 _index) - external - view - returns (uint256); + function getTimestampbyRequestIDandIndex(uint256 _requestID, uint256 _index) external view returns (uint256); /** * @dev Getter for the variables saved under the TellorStorageStruct uintVars variable @@ -506,14 +408,7 @@ interface ITellor { * @dev Getter function for next requestId on queue/request with highest payout at time the function is called * @return onDeck/info on request with highest payout-- RequestId, Totaltips, and API query string */ - function getVariablesOnDeck() - external - view - returns ( - uint256, - uint256, - string memory - ); + function getVariablesOnDeck() external view returns (uint256, uint256, string memory); /** * @dev Gets the 5 miners who mined the value for the specified requestId/_timestamp @@ -521,10 +416,7 @@ interface ITellor { * @param _timestamp is the timestamp to look up miners for * @return bool true if requestId/timestamp is under dispute */ - function isInDispute(uint256 _requestId, uint256 _timestamp) - external - view - returns (bool); + function isInDispute(uint256 _requestId, uint256 _timestamp) external view returns (bool); /** * @dev Retreive value from oracle based on timestamp @@ -532,14 +424,11 @@ interface ITellor { * @param _timestamp to retreive data/value from * @return value for timestamp submitted */ - function retrieveData(uint256 _requestId, uint256 _timestamp) - external - view - returns (uint256); + function retrieveData(uint256 _requestId, uint256 _timestamp) external view returns (uint256); /** * @dev Getter for the total_supply of oracle tokens * @return uint total supply */ function totalSupply() external view returns (uint256); -} \ No newline at end of file +} diff --git a/contracts/src/Dependencies/LiquityBase.sol b/contracts/src/Dependencies/LiquityBase.sol index ea815148..950b6d1a 100644 --- a/contracts/src/Dependencies/LiquityBase.sol +++ b/contracts/src/Dependencies/LiquityBase.sol @@ -17,27 +17,27 @@ import "../Interfaces/ILiquityBase.sol"; */ contract LiquityBase is BaseMath, ILiquityBase { // TODO: Pull all constants out into a separate base contract - - uint constant public _100pct = 1000000000000000000; // 1e18 == 100% + + uint256 public constant _100pct = 1000000000000000000; // 1e18 == 100% // Minimum collateral ratio for individual troves - uint constant public MCR = 1100000000000000000; // 110% + uint256 public constant MCR = 1100000000000000000; // 110% // Critical system collateral ratio. If the system's total collateral ratio (TCR) falls below the CCR, Recovery Mode is triggered. - uint constant public CCR = 1500000000000000000; // 150% + uint256 public constant CCR = 1500000000000000000; // 150% // Amount of Bold to be locked in gas pool on opening troves - uint constant public BOLD_GAS_COMPENSATION = 200e18; + uint256 public constant BOLD_GAS_COMPENSATION = 200e18; // Minimum amount of net Bold debt a trove must have - uint constant public MIN_NET_DEBT = 1800e18; - // uint constant public MIN_NET_DEBT = 0; + uint256 public constant MIN_NET_DEBT = 1800e18; + // uint constant public MIN_NET_DEBT = 0; - uint256 constant public MAX_ANNUAL_INTEREST_RATE = 1e18; // 100% + uint256 public constant MAX_ANNUAL_INTEREST_RATE = 1e18; // 100% - uint constant public PERCENT_DIVISOR = 200; // dividing by 200 yields 0.5% + uint256 public constant PERCENT_DIVISOR = 200; // dividing by 200 yields 0.5% - uint constant public BORROWING_FEE_FLOOR = DECIMAL_PRECISION / 1000 * 5; // 0.5% + uint256 public constant BORROWING_FEE_FLOOR = DECIMAL_PRECISION / 1000 * 5; // 0.5% IActivePool public activePool; @@ -48,52 +48,52 @@ contract LiquityBase is BaseMath, ILiquityBase { // --- Gas compensation functions --- // Returns the composite debt (drawn debt + gas compensation) of a trove, for the purpose of ICR calculation - function _getCompositeDebt(uint _debt) internal pure returns (uint) { + function _getCompositeDebt(uint256 _debt) internal pure returns (uint256) { return _debt + BOLD_GAS_COMPENSATION; } - function _getNetDebt(uint _debt) internal pure returns (uint) { + function _getNetDebt(uint256 _debt) internal pure returns (uint256) { return _debt - BOLD_GAS_COMPENSATION; } // Return the amount of ETH to be drawn from a trove's collateral and sent as gas compensation. - function _getCollGasCompensation(uint _entireColl) internal pure returns (uint) { + function _getCollGasCompensation(uint256 _entireColl) internal pure returns (uint256) { return _entireColl / PERCENT_DIVISOR; } - function getEntireSystemColl() public view returns (uint entireSystemColl) { - uint activeColl = activePool.getETHBalance(); - uint liquidatedColl = defaultPool.getETHBalance(); + function getEntireSystemColl() public view returns (uint256 entireSystemColl) { + uint256 activeColl = activePool.getETHBalance(); + uint256 liquidatedColl = defaultPool.getETHBalance(); return activeColl + liquidatedColl; } - function getEntireSystemDebt() public view returns (uint entireSystemDebt) { - uint activeDebt = activePool.getTotalActiveDebt(); - uint closedDebt = defaultPool.getBoldDebt(); + function getEntireSystemDebt() public view returns (uint256 entireSystemDebt) { + uint256 activeDebt = activePool.getTotalActiveDebt(); + uint256 closedDebt = defaultPool.getBoldDebt(); // console2.log("SYS::activeDebt", activeDebt); // console2.log("SYS::closedDebt", closedDebt); - + return activeDebt + closedDebt; } - function _getTCR(uint _price) internal view returns (uint TCR) { - uint entireSystemColl = getEntireSystemColl(); - uint entireSystemDebt = getEntireSystemDebt(); + function _getTCR(uint256 _price) internal view returns (uint256 TCR) { + uint256 entireSystemColl = getEntireSystemColl(); + uint256 entireSystemDebt = getEntireSystemDebt(); TCR = LiquityMath._computeCR(entireSystemColl, entireSystemDebt, _price); return TCR; } - function _checkRecoveryMode(uint _price) internal view returns (bool) { - uint TCR = _getTCR(_price); + function _checkRecoveryMode(uint256 _price) internal view returns (bool) { + uint256 TCR = _getTCR(_price); return TCR < CCR; } - function _requireUserAcceptsFee(uint _fee, uint _amount, uint _maxFeePercentage) internal pure { - uint feePercentage = _fee * DECIMAL_PRECISION / _amount; + function _requireUserAcceptsFee(uint256 _fee, uint256 _amount, uint256 _maxFeePercentage) internal pure { + uint256 feePercentage = _fee * DECIMAL_PRECISION / _amount; require(feePercentage <= _maxFeePercentage, "Fee exceeded provided maximum"); } } diff --git a/contracts/src/Dependencies/LiquityMath.sol b/contracts/src/Dependencies/LiquityMath.sol index d7db9db7..a7c0718f 100644 --- a/contracts/src/Dependencies/LiquityMath.sol +++ b/contracts/src/Dependencies/LiquityMath.sol @@ -2,15 +2,14 @@ pragma solidity 0.8.18; - library LiquityMath { - uint internal constant DECIMAL_PRECISION = 1e18; + uint256 internal constant DECIMAL_PRECISION = 1e18; - function _min(uint _a, uint _b) internal pure returns (uint) { + function _min(uint256 _a, uint256 _b) internal pure returns (uint256) { return (_a < _b) ? _a : _b; } - function _max(uint _a, uint _b) internal pure returns (uint) { + function _max(uint256 _a, uint256 _b) internal pure returns (uint256) { return (_a >= _b) ? _a : _b; } @@ -21,8 +20,8 @@ library LiquityMath { * * Used only inside the exponentiation, _decPow(). */ - function decMul(uint x, uint y) internal pure returns (uint decProd) { - uint prod_xy = x * y; + function decMul(uint256 x, uint256 y) internal pure returns (uint256 decProd) { + uint256 prod_xy = x * y; decProd = (prod_xy + DECIMAL_PRECISION / 2) / DECIMAL_PRECISION; } @@ -45,22 +44,22 @@ library LiquityMath { * In function 1), the decayed base rate will be 0 for 1000 years or > 1000 years * In function 2), the difference in tokens issued at 1000 years and any time > 1000 years, will be negligible */ - function _decPow(uint _base, uint _minutes) internal pure returns (uint) { - - if (_minutes > 525600000) {_minutes = 525600000;} // cap to avoid overflow - - if (_minutes == 0) {return DECIMAL_PRECISION;} + function _decPow(uint256 _base, uint256 _minutes) internal pure returns (uint256) { + if (_minutes > 525600000) _minutes = 525600000; // cap to avoid overflow + + if (_minutes == 0) return DECIMAL_PRECISION; - uint y = DECIMAL_PRECISION; - uint x = _base; - uint n = _minutes; + uint256 y = DECIMAL_PRECISION; + uint256 x = _base; + uint256 n = _minutes; // Exponentiation-by-squaring while (n > 1) { if (n % 2 == 0) { x = decMul(x, x); n = n / 2; - } else { // if (n % 2 != 0) + } else { + // if (n % 2 != 0) y = decMul(x, y); x = decMul(x, x); n = (n - 1) / 2; @@ -68,21 +67,22 @@ library LiquityMath { } return decMul(x, y); - } + } - function _getAbsoluteDifference(uint _a, uint _b) internal pure returns (uint) { + function _getAbsoluteDifference(uint256 _a, uint256 _b) internal pure returns (uint256) { return (_a >= _b) ? _a - _b : _b - _a; } - function _computeCR(uint _coll, uint _debt, uint _price) internal pure returns (uint) { + function _computeCR(uint256 _coll, uint256 _debt, uint256 _price) internal pure returns (uint256) { if (_debt > 0) { - uint newCollRatio = _coll * _price / _debt; + uint256 newCollRatio = _coll * _price / _debt; return newCollRatio; } // Return the maximal value for uint256 if the debt is 0. Represents "infinite" CR. - else { // if (_debt == 0) - return 2**256 - 1; + else { + // if (_debt == 0) + return 2 ** 256 - 1; } } } diff --git a/contracts/src/Dependencies/Ownable.sol b/contracts/src/Dependencies/Ownable.sol index 0b41a706..be29425b 100644 --- a/contracts/src/Dependencies/Ownable.sol +++ b/contracts/src/Dependencies/Ownable.sol @@ -22,7 +22,7 @@ contract Ownable { /** * @dev Initializes the contract setting the deployer as the initial owner. */ - constructor () { + constructor() { _owner = msg.sender; emit OwnershipTransferred(address(0), msg.sender); } diff --git a/contracts/src/Dependencies/TellorCaller.sol b/contracts/src/Dependencies/TellorCaller.sol index a5e0a717..1773d2c6 100644 --- a/contracts/src/Dependencies/TellorCaller.sol +++ b/contracts/src/Dependencies/TellorCaller.sol @@ -14,10 +14,11 @@ import "./ITellor.sol"; * https://github.com/tellor-io/usingtellor/blob/master/contracts/UsingTellor.sol * */ + contract TellorCaller is ITellorCaller { ITellor public tellor; - constructor (address _tellorMasterAddress) { + constructor(address _tellorMasterAddress) { tellor = ITellor(_tellorMasterAddress); } @@ -34,15 +35,10 @@ contract TellorCaller is ITellorCaller { external view override - returns ( - bool ifRetrieve, - uint256 value, - uint256 _timestampRetrieved - ) + returns (bool ifRetrieve, uint256 value, uint256 _timestampRetrieved) { uint256 _count = tellor.getNewValueCountbyRequestId(_requestId); - uint256 _time = - tellor.getTimestampbyRequestIDandIndex(_requestId, _count - 1); + uint256 _time = tellor.getTimestampbyRequestIDandIndex(_requestId, _count - 1); uint256 _value = tellor.retrieveData(_requestId, _time); if (_value > 0) return (true, _value, _time); return (false, 0, _time); diff --git a/contracts/src/GasPool.sol b/contracts/src/GasPool.sol index 40ed1af1..1fcce4ea 100644 --- a/contracts/src/GasPool.sol +++ b/contracts/src/GasPool.sol @@ -12,5 +12,5 @@ pragma solidity 0.8.18; * See this issue for more context: https://github.com/liquity/dev/issues/186 */ contract GasPool { - // do nothing, as the core contracts have permission to send to and burn from this address +// do nothing, as the core contracts have permission to send to and burn from this address } diff --git a/contracts/src/HintHelpers.sol b/contracts/src/HintHelpers.sol index 16bd80cb..c6a6f6b2 100644 --- a/contracts/src/HintHelpers.sol +++ b/contracts/src/HintHelpers.sol @@ -8,9 +8,8 @@ import "./Dependencies/LiquityBase.sol"; import "./Dependencies/Ownable.sol"; import "./Dependencies/CheckContract.sol"; - contract HintHelpers is LiquityBase, Ownable, CheckContract { - string constant public NAME = "HintHelpers"; + string public constant NAME = "HintHelpers"; ISortedTroves public sortedTroves; ITroveManager public troveManager; @@ -22,13 +21,7 @@ contract HintHelpers is LiquityBase, Ownable, CheckContract { // --- Dependency setters --- - function setAddresses( - address _sortedTrovesAddress, - address _troveManagerAddress - ) - external - onlyOwner - { + function setAddresses(address _sortedTrovesAddress, address _troveManagerAddress) external onlyOwner { checkContract(_sortedTrovesAddress); checkContract(_troveManagerAddress); @@ -52,12 +45,12 @@ contract HintHelpers is LiquityBase, Ownable, CheckContract { Submitting numTrials = k * sqrt(length), with k = 15 makes it very, very likely that the ouput id will be <= sqrt(length) positions away from the correct insert position. */ - function getApproxHint(uint _interestRate, uint _numTrials, uint _inputRandomSeed) + function getApproxHint(uint256 _interestRate, uint256 _numTrials, uint256 _inputRandomSeed) external view - returns (uint256 hintId, uint diff, uint latestRandomSeed) + returns (uint256 hintId, uint256 diff, uint256 latestRandomSeed) { - uint arrayLength = troveManager.getTroveIdsCount(); + uint256 arrayLength = troveManager.getTroveIdsCount(); if (arrayLength == 0) { return (0, 0, _inputRandomSeed); @@ -67,17 +60,17 @@ contract HintHelpers is LiquityBase, Ownable, CheckContract { diff = LiquityMath._getAbsoluteDifference(_interestRate, troveManager.getTroveAnnualInterestRate(hintId)); latestRandomSeed = _inputRandomSeed; - uint i = 1; + uint256 i = 1; while (i < _numTrials) { - latestRandomSeed = uint(keccak256(abi.encodePacked(latestRandomSeed))); + latestRandomSeed = uint256(keccak256(abi.encodePacked(latestRandomSeed))); - uint arrayIndex = latestRandomSeed % arrayLength; + uint256 arrayIndex = latestRandomSeed % arrayLength; uint256 currentId = troveManager.getTroveFromTroveIdsArray(arrayIndex); - uint currentInterestRate = troveManager.getTroveAnnualInterestRate(currentId); + uint256 currentInterestRate = troveManager.getTroveAnnualInterestRate(currentId); // check if abs(current - IR) > abs(closest - IR), and update closest if current is closer - uint currentDiff = LiquityMath._getAbsoluteDifference(currentInterestRate, _interestRate); + uint256 currentDiff = LiquityMath._getAbsoluteDifference(currentInterestRate, _interestRate); if (currentDiff < diff) { diff = currentDiff; diff --git a/contracts/src/Integrations/LUSDUsdToLUSDEth.sol b/contracts/src/Integrations/LUSDUsdToLUSDEth.sol index c3f50984..fbbb6547 100644 --- a/contracts/src/Integrations/LUSDUsdToLUSDEth.sol +++ b/contracts/src/Integrations/LUSDUsdToLUSDEth.sol @@ -1,12 +1,10 @@ // SPDX-License-Identifier: MIT pragma solidity ^0.8.18; - interface IPriceFeed { function latestAnswer() external view returns (int256); } - contract BoldUsdToBoldEth is IPriceFeed { IPriceFeed public constant Bold_USD = IPriceFeed(0x3D7aE7E594f2f2091Ad8798313450130d0Aba3a0); IPriceFeed public constant ETH_USD = IPriceFeed(0x5f4eC3Df9cbd43714FE2740f5E3616155c5b8419); diff --git a/contracts/src/Interfaces/IActivePool.sol b/contracts/src/Interfaces/IActivePool.sol index f4682b40..ac858b03 100644 --- a/contracts/src/Interfaces/IActivePool.sol +++ b/contracts/src/Interfaces/IActivePool.sol @@ -3,6 +3,7 @@ pragma solidity 0.8.18; import "./IInterestRouter.sol"; + interface IActivePool { function stabilityPoolAddress() external view returns (address); function defaultPoolAddress() external view returns (address); @@ -25,9 +26,9 @@ interface IActivePool { function aggRecordedDebt() external view returns (uint256); function aggWeightedDebtSum() external view returns (uint256); function calcPendingAggInterest() external view returns (uint256); - + function mintAggInterest( - uint256 _troveDebtIncrease, + uint256 _troveDebtIncrease, uint256 _troveDebtDecrease, uint256 recordedSumIncrease, uint256 recordedSumDecrease, @@ -38,7 +39,7 @@ interface IActivePool { function mintAggInterestNoTroveChange() external returns (uint256); function increaseRecordedDebtSum(uint256 _amount) external; function decreaseRecordedDebtSum(uint256 _amount) external; - function sendETH(address _account, uint _amount) external; - function sendETHToDefaultPool(uint _amount) external; + function sendETH(address _account, uint256 _amount) external; + function sendETHToDefaultPool(uint256 _amount) external; function receiveETH(uint256 _amount) external; } diff --git a/contracts/src/Interfaces/IBoldToken.sol b/contracts/src/Interfaces/IBoldToken.sol index 04aa4ac4..7b556beb 100644 --- a/contracts/src/Interfaces/IBoldToken.sol +++ b/contracts/src/Interfaces/IBoldToken.sol @@ -6,12 +6,11 @@ import "openzeppelin-contracts/contracts/token/ERC20/IERC20.sol"; import "openzeppelin-contracts/contracts/token/ERC20/extensions/IERC20Metadata.sol"; import "openzeppelin-contracts/contracts/token/ERC20/extensions/IERC20Permit.sol"; - interface IBoldToken is IERC20, IERC20Metadata, IERC20Permit { function version() external pure returns (string memory); function deploymentStartTime() external view returns (uint256); - + function mint(address _account, uint256 _amount) external; function burn(address _account, uint256 _amount) external; @@ -20,7 +19,7 @@ interface IBoldToken is IERC20, IERC20Metadata, IERC20Permit { function decreaseAllowance(address spender, uint256 subtractedValue) external returns (bool); - function sendToPool(address _sender, address poolAddress, uint256 _amount) external; + function sendToPool(address _sender, address poolAddress, uint256 _amount) external; - function returnFromPool(address poolAddress, address user, uint256 _amount ) external; + function returnFromPool(address poolAddress, address user, uint256 _amount) external; } diff --git a/contracts/src/Interfaces/IBorrowerOperations.sol b/contracts/src/Interfaces/IBorrowerOperations.sol index 86efee1c..005e5198 100644 --- a/contracts/src/Interfaces/IBorrowerOperations.sol +++ b/contracts/src/Interfaces/IBorrowerOperations.sol @@ -24,21 +24,37 @@ interface IBorrowerOperations is ILiquityBase { address _boldTokenAddress ) external; - function openTrove(address _owner, uint256 _ownerIndex, uint _maxFee, uint256 _ETHAmount, uint _boldAmount, uint256 _upperHint, uint256 _lowerHint, uint256 _annualInterestRate) external returns (uint256); + function openTrove( + address _owner, + uint256 _ownerIndex, + uint256 _maxFee, + uint256 _ETHAmount, + uint256 _boldAmount, + uint256 _upperHint, + uint256 _lowerHint, + uint256 _annualInterestRate + ) external returns (uint256); function addColl(uint256 _troveId, uint256 _ETHAmount) external; function moveETHGainToTrove(address _sender, uint256 _troveId, uint256 _ETHAmount) external; - function withdrawColl(uint256 _troveId, uint _amount) external; + function withdrawColl(uint256 _troveId, uint256 _amount) external; - function withdrawBold(uint256 _troveId, uint _maxFee, uint _amount) external; + function withdrawBold(uint256 _troveId, uint256 _maxFee, uint256 _amount) external; - function repayBold(uint256 _troveId, uint _amount) external; + function repayBold(uint256 _troveId, uint256 _amount) external; function closeTrove(uint256 _troveId) external; - function adjustTrove(uint256 _troveId, uint _maxFee, uint _collChange, bool _isCollIncrease, uint _debtChange, bool isDebtIncrease) external; + function adjustTrove( + uint256 _troveId, + uint256 _maxFee, + uint256 _collChange, + bool _isCollIncrease, + uint256 _debtChange, + bool isDebtIncrease + ) external; function claimCollateral(uint256 _troveId) external; @@ -47,9 +63,14 @@ interface IBorrowerOperations is ILiquityBase { // TODO: addRepayWhitelistedAddress?(see github issue #64) - function getCompositeDebt(uint _debt) external pure returns (uint); + function getCompositeDebt(uint256 _debt) external pure returns (uint256); - function adjustTroveInterestRate(uint256 _troveId, uint _newAnnualInterestRate, uint256 _upperHint, uint256 _lowerHint) external; + function adjustTroveInterestRate( + uint256 _troveId, + uint256 _newAnnualInterestRate, + uint256 _upperHint, + uint256 _lowerHint + ) external; function applyTroveInterestPermissionless(uint256 _troveId) external; } diff --git a/contracts/src/Interfaces/ICollSurplusPool.sol b/contracts/src/Interfaces/ICollSurplusPool.sol index 6e8dd02e..bfb2866c 100644 --- a/contracts/src/Interfaces/ICollSurplusPool.sol +++ b/contracts/src/Interfaces/ICollSurplusPool.sol @@ -2,19 +2,15 @@ pragma solidity 0.8.18; - interface ICollSurplusPool { - function setAddresses( - address _borrowerOperationsAddress, - address _troveManagerAddress, - address _activePoolAddress - ) external; + function setAddresses(address _borrowerOperationsAddress, address _troveManagerAddress, address _activePoolAddress) + external; - function getETHBalance() external view returns (uint); + function getETHBalance() external view returns (uint256); - function getCollateral(uint256 _troveId) external view returns (uint); + function getCollateral(uint256 _troveId) external view returns (uint256); - function accountSurplus(uint256 _troveId, uint _amount) external; + function accountSurplus(uint256 _troveId, uint256 _amount) external; function claimColl(address _account, uint256 _troveId) external; } diff --git a/contracts/src/Interfaces/ICommunityIssuance.sol b/contracts/src/Interfaces/ICommunityIssuance.sol index 291d373a..3ee0c3fa 100644 --- a/contracts/src/Interfaces/ICommunityIssuance.sol +++ b/contracts/src/Interfaces/ICommunityIssuance.sol @@ -2,10 +2,10 @@ pragma solidity 0.8.18; -interface ICommunityIssuance { +interface ICommunityIssuance { function setAddresses(address _lqtyTokenAddress, address _stabilityPoolAddress) external; - function issueLQTY() external returns (uint); + function issueLQTY() external returns (uint256); - function sendLQTY(address _account, uint _LQTYamount) external; + function sendLQTY(address _account, uint256 _LQTYamount) external; } diff --git a/contracts/src/Interfaces/IDefaultPool.sol b/contracts/src/Interfaces/IDefaultPool.sol index 313c22ee..fb02ed19 100644 --- a/contracts/src/Interfaces/IDefaultPool.sol +++ b/contracts/src/Interfaces/IDefaultPool.sol @@ -9,9 +9,9 @@ interface IDefaultPool { // --- Functions --- function getETHBalance() external view returns (uint256); function getBoldDebt() external view returns (uint256); - function sendETHToActivePool(uint _amount) external; + function sendETHToActivePool(uint256 _amount) external; function receiveETH(uint256 _amount) external; - function increaseBoldDebt(uint _amount) external; - function decreaseBoldDebt(uint _amount) external; + function increaseBoldDebt(uint256 _amount) external; + function decreaseBoldDebt(uint256 _amount) external; } diff --git a/contracts/src/Interfaces/IInterestRouter.sol b/contracts/src/Interfaces/IInterestRouter.sol index 60fd652d..65985395 100644 --- a/contracts/src/Interfaces/IInterestRouter.sol +++ b/contracts/src/Interfaces/IInterestRouter.sol @@ -3,5 +3,5 @@ pragma solidity 0.8.18; interface IInterestRouter { - // TODO: functions that the interest router will have -} \ No newline at end of file +// TODO: functions that the interest router will have +} diff --git a/contracts/src/Interfaces/ILQTYStaking.sol b/contracts/src/Interfaces/ILQTYStaking.sol index 3efc9f31..b507340c 100644 --- a/contracts/src/Interfaces/ILQTYStaking.sol +++ b/contracts/src/Interfaces/ILQTYStaking.sol @@ -3,24 +3,23 @@ pragma solidity 0.8.18; interface ILQTYStaking { - function setAddresses - ( + function setAddresses( address _lqtyTokenAddress, address _boldTokenAddress, - address _troveManagerAddress, + address _troveManagerAddress, address _borrowerOperationsAddress, address _activePoolAddress - ) external; + ) external; - function stake(uint _LQTYamount) external; + function stake(uint256 _LQTYamount) external; - function unstake(uint _LQTYamount) external; + function unstake(uint256 _LQTYamount) external; - function increaseF_ETH(uint _ETHFee) external; + function increaseF_ETH(uint256 _ETHFee) external; - function increaseF_bold(uint _LQTYFee) external; + function increaseF_bold(uint256 _LQTYFee) external; - function getPendingETHGain(address _user) external view returns (uint); + function getPendingETHGain(address _user) external view returns (uint256); - function getPendingBoldGain(address _user) external view returns (uint); + function getPendingBoldGain(address _user) external view returns (uint256); } diff --git a/contracts/src/Interfaces/ILQTYToken.sol b/contracts/src/Interfaces/ILQTYToken.sol index c0da7ff6..b6cbfd7b 100644 --- a/contracts/src/Interfaces/ILQTYToken.sol +++ b/contracts/src/Interfaces/ILQTYToken.sol @@ -5,7 +5,6 @@ pragma solidity 0.8.18; import "openzeppelin-contracts/contracts/token/ERC20/IERC20.sol"; import "openzeppelin-contracts/contracts/token/ERC20/extensions/IERC20Permit.sol"; - interface ILQTYToken is IERC20, IERC20Permit { function sendToLQTYStaking(address _sender, uint256 _amount) external; diff --git a/contracts/src/Interfaces/ILockupContractFactory.sol b/contracts/src/Interfaces/ILockupContractFactory.sol index 46d03e6d..4d9d48d3 100644 --- a/contracts/src/Interfaces/ILockupContractFactory.sol +++ b/contracts/src/Interfaces/ILockupContractFactory.sol @@ -1,11 +1,11 @@ // SPDX-License-Identifier: MIT pragma solidity 0.8.18; - + interface ILockupContractFactory { function setLQTYTokenAddress(address _lqtyTokenAddress) external; - function deployLockupContract(address _beneficiary, uint _unlockTime) external; + function deployLockupContract(address _beneficiary, uint256 _unlockTime) external; function isRegisteredLockup(address _addr) external view returns (bool); } diff --git a/contracts/src/Interfaces/IPriceFeed.sol b/contracts/src/Interfaces/IPriceFeed.sol index 2f519eca..32e23da2 100644 --- a/contracts/src/Interfaces/IPriceFeed.sol +++ b/contracts/src/Interfaces/IPriceFeed.sol @@ -3,5 +3,5 @@ pragma solidity 0.8.18; interface IPriceFeed { - function fetchPrice() external returns (uint); + function fetchPrice() external returns (uint256); } diff --git a/contracts/src/Interfaces/ISortedTroves.sol b/contracts/src/Interfaces/ISortedTroves.sol index d3ed3887..61068d37 100644 --- a/contracts/src/Interfaces/ISortedTroves.sol +++ b/contracts/src/Interfaces/ISortedTroves.sol @@ -15,7 +15,13 @@ interface ISortedTroves { function setAddresses(address _troveManagerAddress, address _borrowerOperationsAddress) external; function insert(uint256 _id, uint256 _annualInterestRate, uint256 _prevId, uint256 _nextId) external; - function insertIntoBatch(uint256 _troveId, BatchId _batchId, uint256 _annualInterestRate, uint256 _prevId, uint256 _nextId) external; + function insertIntoBatch( + uint256 _troveId, + BatchId _batchId, + uint256 _annualInterestRate, + uint256 _prevId, + uint256 _nextId + ) external; function remove(uint256 _id) external; function removeFromBatch(uint256 _id) external; @@ -36,8 +42,14 @@ interface ISortedTroves { function getNext(uint256 _id) external view returns (uint256); function getPrev(uint256 _id) external view returns (uint256); - function validInsertPosition(uint256 _annualInterestRate, uint256 _prevId, uint256 _nextId) external view returns (bool); - function findInsertPosition(uint256 _annualInterestRate, uint256 _prevId, uint256 _nextId) external view returns (uint256, uint256); + function validInsertPosition(uint256 _annualInterestRate, uint256 _prevId, uint256 _nextId) + external + view + returns (bool); + function findInsertPosition(uint256 _annualInterestRate, uint256 _prevId, uint256 _nextId) + external + view + returns (uint256, uint256); // Public state variable getters function borrowerOperationsAddress() external view returns (address); diff --git a/contracts/src/Interfaces/IStabilityPool.sol b/contracts/src/Interfaces/IStabilityPool.sol index 532138bb..0f5c9d5b 100644 --- a/contracts/src/Interfaces/IStabilityPool.sol +++ b/contracts/src/Interfaces/IStabilityPool.sol @@ -45,15 +45,14 @@ interface IStabilityPool is ILiquityBase { address _sortedTrovesAddress, address _priceFeedAddress ) external; - + /* provideToSP(): * - Calculates depositor's ETH gain * - Calculates the compounded deposit * - Increases deposit, and takes new snapshots of accumulators P and S * - Sends depositor's accumulated ETH gains to depositor */ - function provideToSP(uint _amount) external; - + function provideToSP(uint256 _amount) external; /* withdrawFromSP(): * - Calculates depositor's ETH gain @@ -62,7 +61,7 @@ interface IStabilityPool is ILiquityBase { * - (If _amount > userDeposit, the user withdraws all of their compounded deposit) * - Decreases deposit by withdrawn amount and takes new snapshots of accumulators P and S */ - function withdrawFromSP(uint _amount) external; + function withdrawFromSP(uint256 _amount) external; /* withdrawETHGainToTrove(): * - Transfers the depositor's entire ETH gain from the Stability Pool to the caller's trove @@ -79,28 +78,28 @@ interface IStabilityPool is ILiquityBase { * and transfers the Trove's ETH collateral from ActivePool to StabilityPool. * Only called by liquidation functions in the TroveManager. */ - function offset(uint _debt, uint _coll) external; + function offset(uint256 _debt, uint256 _coll) external; /* * Returns the total amount of ETH held by the pool, accounted in an internal variable instead of `balance`, * to exclude edge cases like ETH received from a self-destruct. */ - function getETHBalance() external view returns (uint); + function getETHBalance() external view returns (uint256); /* * Returns Bold held in the pool. Changes when users deposit/withdraw, and when Trove debt is offset. */ - function getTotalBoldDeposits() external view returns (uint); + function getTotalBoldDeposits() external view returns (uint256); /* * Calculates the ETH gain earned by the deposit since its last snapshots were taken. */ - function getDepositorETHGain(address _depositor) external view returns (uint); + function getDepositorETHGain(address _depositor) external view returns (uint256); /* * Return the user's compounded deposit. */ - function getCompoundedBoldDeposit(address _depositor) external view returns (uint); + function getCompoundedBoldDeposit(address _depositor) external view returns (uint256); /* * Only callable by Active Pool, it pulls ETH and accounts for ETH received diff --git a/contracts/src/Interfaces/ITellorCaller.sol b/contracts/src/Interfaces/ITellorCaller.sol index ce9578df..4034fa5b 100644 --- a/contracts/src/Interfaces/ITellorCaller.sol +++ b/contracts/src/Interfaces/ITellorCaller.sol @@ -4,4 +4,4 @@ pragma solidity 0.8.18; interface ITellorCaller { function getTellorCurrentValue(uint256 _requestId) external view returns (bool, uint256, uint256); -} \ No newline at end of file +} diff --git a/contracts/src/Interfaces/ITroveManager.sol b/contracts/src/Interfaces/ITroveManager.sol index f616f4ca..6cc71935 100644 --- a/contracts/src/Interfaces/ITroveManager.sol +++ b/contracts/src/Interfaces/ITroveManager.sol @@ -25,46 +25,45 @@ interface ITroveManager is IERC721, ILiquityBase { function stabilityPool() external view returns (IStabilityPool); function boldToken() external view returns (IBoldToken); - function sortedTroves() external view returns(ISortedTroves); + function sortedTroves() external view returns (ISortedTroves); function borrowerOperationsAddress() external view returns (address); // function BOLD_GAS_COMPENSATION() external view returns (uint256); function baseRate() external view returns (uint256); - function getTroveIdsCount() external view returns (uint); + function getTroveIdsCount() external view returns (uint256); - function getTroveFromTroveIdsArray(uint _index) external view returns (uint256); + function getTroveFromTroveIdsArray(uint256 _index) external view returns (uint256); - function getCurrentICR(uint256 _troveId, uint _price) external view returns (uint); + function getCurrentICR(uint256 _troveId, uint256 _price) external view returns (uint256); function liquidate(uint256 _troveId) external; function batchLiquidateTroves(uint256[] calldata _troveArray) external; - function redeemCollateral( - uint _boldAmount, - uint _maxIterations, - uint _maxFee - ) external; + function redeemCollateral(uint256 _boldAmount, uint256 _maxIterations, uint256 _maxFee) external; - function updateStakeAndTotalStakes(uint256 _troveId) external returns (uint); + function updateStakeAndTotalStakes(uint256 _troveId) external returns (uint256); - function addTroveIdToArray(uint256 _troveId) external returns (uint index); + function addTroveIdToArray(uint256 _troveId) external returns (uint256 index); - function getPendingETHReward(uint256 _troveId) external view returns (uint); + function getPendingETHReward(uint256 _troveId) external view returns (uint256); - function getPendingBoldDebtReward(uint256 _troveId) external view returns (uint); + function getPendingBoldDebtReward(uint256 _troveId) external view returns (uint256); - function hasRedistributionGains(uint256 _troveId) external view returns (bool); + function hasRedistributionGains(uint256 _troveId) external view returns (bool); - function getEntireDebtAndColl(uint256 _troveId) external view returns ( - uint entireDebt, - uint entireColl, - uint pendingBoldDebtReward, - uint pendingETHReward, - uint pendingBoldInterest - ); + function getEntireDebtAndColl(uint256 _troveId) + external + view + returns ( + uint256 entireDebt, + uint256 entireColl, + uint256 pendingBoldDebtReward, + uint256 pendingETHReward, + uint256 pendingBoldInterest + ); function getTroveEntireDebt(uint256 _troveId) external view returns (uint256); @@ -76,50 +75,59 @@ interface ITroveManager is IERC721, ILiquityBase { function removeStake(uint256 _troveId) external; - function getRedemptionRate() external view returns (uint); - function getRedemptionRateWithDecay() external view returns (uint); + function getRedemptionRate() external view returns (uint256); + function getRedemptionRateWithDecay() external view returns (uint256); - function getRedemptionFeeWithDecay(uint _ETHDrawn) external view returns (uint); + function getRedemptionFeeWithDecay(uint256 _ETHDrawn) external view returns (uint256); - function getTroveStatus(uint256 _troveId) external view returns (uint); + function getTroveStatus(uint256 _troveId) external view returns (uint256); - function getTroveStake(uint256 _troveId) external view returns (uint); + function getTroveStake(uint256 _troveId) external view returns (uint256); - function getTroveDebt(uint256 _troveId) external view returns (uint); + function getTroveDebt(uint256 _troveId) external view returns (uint256); function getTroveWeightedRecordedDebt(uint256 _troveId) external returns (uint256); - function getTroveColl(uint256 _troveId) external view returns (uint); + function getTroveColl(uint256 _troveId) external view returns (uint256); - function getTroveAnnualInterestRate(uint256 _troveId) external view returns (uint); + function getTroveAnnualInterestRate(uint256 _troveId) external view returns (uint256); function calcTroveAccruedInterest(uint256 _troveId) external view returns (uint256); function TroveAddManagers(uint256 _troveId) external view returns (address); function TroveRemoveManagers(uint256 _troveId) external view returns (address); - function getTroveLastDebtUpdateTime(uint256 _troveId) external view returns (uint); + function getTroveLastDebtUpdateTime(uint256 _troveId) external view returns (uint256); - function setTrovePropertiesOnOpen(address _owner, uint256 _troveId, uint256 _coll, uint256 _debt, uint256 _annualInterestRate) external returns (uint256); + function setTrovePropertiesOnOpen( + address _owner, + uint256 _troveId, + uint256 _coll, + uint256 _debt, + uint256 _annualInterestRate + ) external returns (uint256); function troveIsStale(uint256 _troveId) external view returns (bool); function changeAnnualInterestRate(uint256 _troveId, uint256 _newAnnualInterestRate) external; - function updateTroveDebtAndInterest(uint256 _troveId, uint256 _entireTroveDebt, uint256 _newAnnualInterestRate) external; + function updateTroveDebtAndInterest(uint256 _troveId, uint256 _entireTroveDebt, uint256 _newAnnualInterestRate) + external; function updateTroveDebtFromInterestApplication(uint256 _troveId, uint256 _entireTroveDebt) external; - function updateTroveDebt(address _sender, uint256 _troveId, uint256 _entireTroveDebt, bool _isDebtIncrease) external; + function updateTroveDebt(address _sender, uint256 _troveId, uint256 _entireTroveDebt, bool _isDebtIncrease) + external; - function updateTroveColl(address _sender, uint256 _troveId, uint256 _entireTroveColl, bool _isCollIncrease) external; + function updateTroveColl(address _sender, uint256 _troveId, uint256 _entireTroveColl, bool _isCollIncrease) + external; function setAddManager(address _sender, uint256 _troveId, address _manager) external; function setRemoveManager(address _sender, uint256 _troveId, address _manager) external; - function getTCR(uint _price) external view returns (uint); + function getTCR(uint256 _price) external view returns (uint256); - function checkRecoveryMode(uint _price) external view returns (bool); + function checkRecoveryMode(uint256 _price) external view returns (bool); function checkTroveIsActive(uint256 _troveId) external view returns (bool); } diff --git a/contracts/src/MockInterestRouter.sol b/contracts/src/MockInterestRouter.sol index 625ad9b1..c848d926 100644 --- a/contracts/src/MockInterestRouter.sol +++ b/contracts/src/MockInterestRouter.sol @@ -4,4 +4,4 @@ pragma solidity 0.8.18; import "./Interfaces/IInterestRouter.sol"; -contract MockInterestRouter is IInterestRouter {} \ No newline at end of file +contract MockInterestRouter is IInterestRouter {} diff --git a/contracts/src/MultiTroveGetter.sol b/contracts/src/MultiTroveGetter.sol index ed3d35b9..b6f9d129 100644 --- a/contracts/src/MultiTroveGetter.sol +++ b/contracts/src/MultiTroveGetter.sol @@ -10,13 +10,11 @@ import "./SortedTroves.sol"; contract MultiTroveGetter { struct CombinedTroveData { uint256 id; - - uint debt; - uint coll; - uint stake; - - uint snapshotETH; - uint snapshotBoldDebt; + uint256 debt; + uint256 coll; + uint256 stake; + uint256 snapshotETH; + uint256 snapshotBoldDebt; } TroveManager public troveManager; // XXX Troves missing from ITroveManager? @@ -27,26 +25,28 @@ contract MultiTroveGetter { sortedTroves = _sortedTroves; } - function getMultipleSortedTroves(int _startIdx, uint _count) - external view returns (CombinedTroveData[] memory _troves) + function getMultipleSortedTroves(int256 _startIdx, uint256 _count) + external + view + returns (CombinedTroveData[] memory _troves) { - uint startIdx; + uint256 startIdx; bool descend; if (_startIdx >= 0) { - startIdx = uint(_startIdx); + startIdx = uint256(_startIdx); descend = true; } else { - startIdx = uint(-(_startIdx + 1)); + startIdx = uint256(-(_startIdx + 1)); descend = false; } - uint sortedTrovesSize = sortedTroves.getSize(); + uint256 sortedTrovesSize = sortedTroves.getSize(); if (startIdx >= sortedTrovesSize) { _troves = new CombinedTroveData[](0); } else { - uint maxCount = sortedTrovesSize - startIdx; + uint256 maxCount = sortedTrovesSize - startIdx; if (_count > maxCount) { _count = maxCount; @@ -60,63 +60,67 @@ contract MultiTroveGetter { } } - function _getMultipleSortedTrovesFromHead(uint _startIdx, uint _count) - internal view returns (CombinedTroveData[] memory _troves) + function _getMultipleSortedTrovesFromHead(uint256 _startIdx, uint256 _count) + internal + view + returns (CombinedTroveData[] memory _troves) { uint256 currentTroveId = sortedTroves.getFirst(); - for (uint idx = 0; idx < _startIdx; ++idx) { + for (uint256 idx = 0; idx < _startIdx; ++idx) { currentTroveId = sortedTroves.getNext(currentTroveId); } _troves = new CombinedTroveData[](_count); - for (uint idx = 0; idx < _count; ++idx) { + for (uint256 idx = 0; idx < _count; ++idx) { _troves[idx].id = currentTroveId; ( _troves[idx].debt, _troves[idx].coll, _troves[idx].stake, - /* status */, - /* arrayIndex */, - /* annualInterestRate */, + /* status */ + , + /* arrayIndex */ + , + /* annualInterestRate */ + , /* lastDebtUpdateTime */ ) = troveManager.Troves(currentTroveId); - ( - _troves[idx].snapshotETH, - _troves[idx].snapshotBoldDebt - ) = troveManager.rewardSnapshots(currentTroveId); + (_troves[idx].snapshotETH, _troves[idx].snapshotBoldDebt) = troveManager.rewardSnapshots(currentTroveId); currentTroveId = sortedTroves.getNext(currentTroveId); } } - function _getMultipleSortedTrovesFromTail(uint _startIdx, uint _count) - internal view returns (CombinedTroveData[] memory _troves) + function _getMultipleSortedTrovesFromTail(uint256 _startIdx, uint256 _count) + internal + view + returns (CombinedTroveData[] memory _troves) { uint256 currentTroveId = sortedTroves.getLast(); - for (uint idx = 0; idx < _startIdx; ++idx) { + for (uint256 idx = 0; idx < _startIdx; ++idx) { currentTroveId = sortedTroves.getPrev(currentTroveId); } _troves = new CombinedTroveData[](_count); - for (uint idx = 0; idx < _count; ++idx) { + for (uint256 idx = 0; idx < _count; ++idx) { _troves[idx].id = currentTroveId; ( _troves[idx].debt, _troves[idx].coll, _troves[idx].stake, - /* status */, - /* arrayIndex */, - /* annualInterestRate */, + /* status */ + , + /* arrayIndex */ + , + /* annualInterestRate */ + , /* lastDebtUpdateTime */ ) = troveManager.Troves(currentTroveId); - ( - _troves[idx].snapshotETH, - _troves[idx].snapshotBoldDebt - ) = troveManager.rewardSnapshots(currentTroveId); + (_troves[idx].snapshotETH, _troves[idx].snapshotBoldDebt) = troveManager.rewardSnapshots(currentTroveId); currentTroveId = sortedTroves.getPrev(currentTroveId); } diff --git a/contracts/src/PriceFeed.sol b/contracts/src/PriceFeed.sol index 26a92c59..66c9005a 100644 --- a/contracts/src/PriceFeed.sol +++ b/contracts/src/PriceFeed.sol @@ -19,35 +19,35 @@ import "./Dependencies/LiquityMath.sol"; * Chainlink oracle. */ contract PriceFeed is Ownable, CheckContract, BaseMath, IPriceFeed { - string constant public NAME = "PriceFeed"; + string public constant NAME = "PriceFeed"; - AggregatorV3Interface public priceAggregator; // Mainnet Chainlink aggregator - ITellorCaller public tellorCaller; // Wrapper contract that calls the Tellor system + AggregatorV3Interface public priceAggregator; // Mainnet Chainlink aggregator + ITellorCaller public tellorCaller; // Wrapper contract that calls the Tellor system // Core Liquity contracts address borrowerOperationsAddress; address troveManagerAddress; - uint constant public ETHUSD_TELLOR_REQ_ID = 1; + uint256 public constant ETHUSD_TELLOR_REQ_ID = 1; // Use to convert a price answer to an 18-digit precision uint - uint constant public TARGET_DIGITS = 18; - uint constant public TELLOR_DIGITS = 6; + uint256 public constant TARGET_DIGITS = 18; + uint256 public constant TELLOR_DIGITS = 6; // Maximum time period allowed since Chainlink's latest round data timestamp, beyond which Chainlink is considered frozen. - uint constant public TIMEOUT = 14400; // 4 hours: 60 * 60 * 4 - + uint256 public constant TIMEOUT = 14400; // 4 hours: 60 * 60 * 4 + // Maximum deviation allowed between two consecutive Chainlink oracle prices. 18-digit precision. - uint constant public MAX_PRICE_DEVIATION_FROM_PREVIOUS_ROUND = 5e17; // 50% + uint256 public constant MAX_PRICE_DEVIATION_FROM_PREVIOUS_ROUND = 5e17; // 50% /* * The maximum relative price difference between two oracle responses allowed in order for the PriceFeed * to return to using the Chainlink oracle. 18-digit precision. */ - uint constant public MAX_PRICE_DIFFERENCE_BETWEEN_ORACLES = 5e16; // 5% + uint256 public constant MAX_PRICE_DIFFERENCE_BETWEEN_ORACLES = 5e16; // 5% // The last good price seen from an oracle by Liquity - uint public lastGoodPrice; + uint256 public lastGoodPrice; struct ChainlinkResponse { uint80 roundId; @@ -65,31 +65,25 @@ contract PriceFeed is Ownable, CheckContract, BaseMath, IPriceFeed { } enum Status { - chainlinkWorking, - usingTellorChainlinkUntrusted, + chainlinkWorking, + usingTellorChainlinkUntrusted, bothOraclesUntrusted, - usingTellorChainlinkFrozen, + usingTellorChainlinkFrozen, usingChainlinkTellorUntrusted } // The current status of the PricFeed, which determines the conditions for the next price fetch attempt Status public status; - event LastGoodPriceUpdated(uint _lastGoodPrice); + event LastGoodPriceUpdated(uint256 _lastGoodPrice); event PriceFeedStatusChanged(Status newStatus); // --- Dependency setters --- - - function setAddresses( - address _priceAggregatorAddress, - address _tellorCallerAddress - ) - external - onlyOwner - { + + function setAddresses(address _priceAggregatorAddress, address _tellorCallerAddress) external onlyOwner { checkContract(_priceAggregatorAddress); checkContract(_tellorCallerAddress); - + priceAggregator = AggregatorV3Interface(_priceAggregatorAddress); tellorCaller = ITellorCaller(_tellorCallerAddress); @@ -98,10 +92,13 @@ contract PriceFeed is Ownable, CheckContract, BaseMath, IPriceFeed { // Get an initial price from Chainlink to serve as first reference for lastGoodPrice ChainlinkResponse memory chainlinkResponse = _getCurrentChainlinkResponse(); - ChainlinkResponse memory prevChainlinkResponse = _getPrevChainlinkResponse(chainlinkResponse.roundId, chainlinkResponse.decimals); - - require(!_chainlinkIsBroken(chainlinkResponse, prevChainlinkResponse) && !_chainlinkIsFrozen(chainlinkResponse), - "PriceFeed: Chainlink must be working and current"); + ChainlinkResponse memory prevChainlinkResponse = + _getPrevChainlinkResponse(chainlinkResponse.roundId, chainlinkResponse.decimals); + + require( + !_chainlinkIsBroken(chainlinkResponse, prevChainlinkResponse) && !_chainlinkIsFrozen(chainlinkResponse), + "PriceFeed: Chainlink must be working and current" + ); _storeChainlinkPrice(chainlinkResponse); @@ -122,10 +119,11 @@ contract PriceFeed is Ownable, CheckContract, BaseMath, IPriceFeed { * it uses the last good price seen by Liquity. * */ - function fetchPrice() external override returns (uint _lastGoodPrice) { + function fetchPrice() external override returns (uint256 _lastGoodPrice) { // Get current and previous price data from Chainlink, and current price data from Tellor ChainlinkResponse memory chainlinkResponse = _getCurrentChainlinkResponse(); - ChainlinkResponse memory prevChainlinkResponse = _getPrevChainlinkResponse(chainlinkResponse.roundId, chainlinkResponse.decimals); + ChainlinkResponse memory prevChainlinkResponse = + _getPrevChainlinkResponse(chainlinkResponse.roundId, chainlinkResponse.decimals); TellorResponse memory tellorResponse = _getCurrentTellorResponse(); // --- CASE 1: System fetched last price from Chainlink --- @@ -135,7 +133,7 @@ contract PriceFeed is Ownable, CheckContract, BaseMath, IPriceFeed { // If Tellor is broken then both oracles are untrusted, so return the last good price if (_tellorIsBroken(tellorResponse)) { _changeStatus(Status.bothOraclesUntrusted); - return lastGoodPrice; + return lastGoodPrice; } /* * If Tellor is only frozen but otherwise returning valid data, return the last good price. @@ -145,24 +143,24 @@ contract PriceFeed is Ownable, CheckContract, BaseMath, IPriceFeed { _changeStatus(Status.usingTellorChainlinkUntrusted); return lastGoodPrice; } - + // If Chainlink is broken and Tellor is working, switch to Tellor and return current Tellor price _changeStatus(Status.usingTellorChainlinkUntrusted); return _storeTellorPrice(tellorResponse); } // If Chainlink is frozen, try Tellor - if (_chainlinkIsFrozen(chainlinkResponse)) { + if (_chainlinkIsFrozen(chainlinkResponse)) { // If Tellor is broken too, remember Tellor broke, and return last good price if (_tellorIsBroken(tellorResponse)) { _changeStatus(Status.usingChainlinkTellorUntrusted); - return lastGoodPrice; + return lastGoodPrice; } // If Tellor is frozen or working, remember Chainlink froze, and switch to Tellor _changeStatus(Status.usingTellorChainlinkFrozen); - - if (_tellorIsFrozen(tellorResponse)) {return lastGoodPrice;} + + if (_tellorIsFrozen(tellorResponse)) return lastGoodPrice; // If Tellor is working, use it return _storeTellorPrice(tellorResponse); @@ -171,13 +169,13 @@ contract PriceFeed is Ownable, CheckContract, BaseMath, IPriceFeed { // If Chainlink price has changed by > 50% between two consecutive rounds, compare it to Tellor's price if (_chainlinkPriceChangeAboveMax(chainlinkResponse, prevChainlinkResponse)) { // If Tellor is broken, both oracles are untrusted, and return last good price - if (_tellorIsBroken(tellorResponse)) { + if (_tellorIsBroken(tellorResponse)) { _changeStatus(Status.bothOraclesUntrusted); - return lastGoodPrice; + return lastGoodPrice; } - // If Tellor is frozen, switch to Tellor and return last good price - if (_tellorIsFrozen(tellorResponse)) { + // If Tellor is frozen, switch to Tellor and return last good price + if (_tellorIsFrozen(tellorResponse)) { _changeStatus(Status.usingTellorChainlinkUntrusted); return lastGoodPrice; } @@ -188,7 +186,7 @@ contract PriceFeed is Ownable, CheckContract, BaseMath, IPriceFeed { */ if (_bothOraclesSimilarPrice(chainlinkResponse, tellorResponse)) { return _storeChainlinkPrice(chainlinkResponse); - } + } // If Tellor is live but the oracles differ too much in price, conclude that Chainlink's initial price deviation was // an oracle failure. Switch to Tellor, and use Tellor price @@ -198,16 +196,15 @@ contract PriceFeed is Ownable, CheckContract, BaseMath, IPriceFeed { // If Chainlink is working and Tellor is broken, remember Tellor is broken if (_tellorIsBroken(tellorResponse)) { - _changeStatus(Status.usingChainlinkTellorUntrusted); - } + _changeStatus(Status.usingChainlinkTellorUntrusted); + } // If Chainlink is working, return Chainlink current price (no status change) return _storeChainlinkPrice(chainlinkResponse); } - - // --- CASE 2: The system fetched last price from Tellor --- - if (status == Status.usingTellorChainlinkUntrusted) { + // --- CASE 2: The system fetched last price from Tellor --- + if (status == Status.usingTellorChainlinkUntrusted) { // If both Tellor and Chainlink are live, unbroken, and reporting similar prices, switch back to Chainlink if (_bothOraclesLiveAndUnbrokenAndSimilarPrice(chainlinkResponse, prevChainlinkResponse, tellorResponse)) { _changeStatus(Status.chainlinkWorking); @@ -216,15 +213,15 @@ contract PriceFeed is Ownable, CheckContract, BaseMath, IPriceFeed { if (_tellorIsBroken(tellorResponse)) { _changeStatus(Status.bothOraclesUntrusted); - return lastGoodPrice; + return lastGoodPrice; } /* * If Tellor is only frozen but otherwise returning valid data, just return the last good price. * Tellor may need to be tipped to return current data. */ - if (_tellorIsFrozen(tellorResponse)) {return lastGoodPrice;} - + if (_tellorIsFrozen(tellorResponse)) return lastGoodPrice; + // Otherwise, use Tellor price return _storeTellorPrice(tellorResponse); } @@ -238,7 +235,7 @@ contract PriceFeed is Ownable, CheckContract, BaseMath, IPriceFeed { if (_bothOraclesLiveAndUnbrokenAndSimilarPrice(chainlinkResponse, prevChainlinkResponse, tellorResponse)) { _changeStatus(Status.chainlinkWorking); return _storeChainlinkPrice(chainlinkResponse); - } + } // Otherwise, return the last good price - both oracles are still untrusted (no status change) return lastGoodPrice; @@ -256,7 +253,7 @@ contract PriceFeed is Ownable, CheckContract, BaseMath, IPriceFeed { // If Chainlink is broken, remember it and switch to using Tellor _changeStatus(Status.usingTellorChainlinkUntrusted); - if (_tellorIsFrozen(tellorResponse)) {return lastGoodPrice;} + if (_tellorIsFrozen(tellorResponse)) return lastGoodPrice; // If Tellor is working, return Tellor current price return _storeTellorPrice(tellorResponse); @@ -270,7 +267,7 @@ contract PriceFeed is Ownable, CheckContract, BaseMath, IPriceFeed { } // If both are frozen, just use lastGoodPrice - if (_tellorIsFrozen(tellorResponse)) {return lastGoodPrice;} + if (_tellorIsFrozen(tellorResponse)) return lastGoodPrice; // if Chainlink is frozen and Tellor is working, keep using Tellor (no status change) return _storeTellorPrice(tellorResponse); @@ -282,8 +279,8 @@ contract PriceFeed is Ownable, CheckContract, BaseMath, IPriceFeed { return _storeChainlinkPrice(chainlinkResponse); } - // If Chainlink is live and Tellor is frozen, just use last good price (no status change) since we have no basis for comparison - if (_tellorIsFrozen(tellorResponse)) {return lastGoodPrice;} + // If Chainlink is live and Tellor is frozen, just use last good price (no status change) since we have no basis for comparison + if (_tellorIsFrozen(tellorResponse)) return lastGoodPrice; // If Chainlink is live and Tellor is working, compare prices. Switch to Chainlink // if prices are within 5%, and return Chainlink price. @@ -298,7 +295,7 @@ contract PriceFeed is Ownable, CheckContract, BaseMath, IPriceFeed { } // --- CASE 5: Using Chainlink, Tellor is untrusted --- - if (status == Status.usingChainlinkTellorUntrusted) { + if (status == Status.usingChainlinkTellorUntrusted) { // If Chainlink breaks, now both oracles are untrusted if (_chainlinkIsBroken(chainlinkResponse, prevChainlinkResponse)) { _changeStatus(Status.bothOraclesUntrusted); @@ -316,14 +313,14 @@ contract PriceFeed is Ownable, CheckContract, BaseMath, IPriceFeed { return _storeChainlinkPrice(chainlinkResponse); } - // If Chainlink is live but deviated >50% from it's previous price and Tellor is still untrusted, switch + // If Chainlink is live but deviated >50% from it's previous price and Tellor is still untrusted, switch // to bothOraclesUntrusted and return last good price if (_chainlinkPriceChangeAboveMax(chainlinkResponse, prevChainlinkResponse)) { _changeStatus(Status.bothOraclesUntrusted); return lastGoodPrice; } - // Otherwise if Chainlink is live and deviated <50% from it's previous price and Tellor is still untrusted, + // Otherwise if Chainlink is live and deviated <50% from it's previous price and Tellor is still untrusted, // return Chainlink price (no status change) return _storeChainlinkPrice(chainlinkResponse); } @@ -339,19 +336,23 @@ contract PriceFeed is Ownable, CheckContract, BaseMath, IPriceFeed { * 2) Chainlink is the PriceFeed's preferred primary oracle - having two consecutive valid round responses adds * peace of mind when using or returning to Chainlink. */ - function _chainlinkIsBroken(ChainlinkResponse memory _currentResponse, ChainlinkResponse memory _prevResponse) internal view returns (bool) { + function _chainlinkIsBroken(ChainlinkResponse memory _currentResponse, ChainlinkResponse memory _prevResponse) + internal + view + returns (bool) + { return _badChainlinkResponse(_currentResponse) || _badChainlinkResponse(_prevResponse); } function _badChainlinkResponse(ChainlinkResponse memory _response) internal view returns (bool) { - // Check for response call reverted - if (!_response.success) {return true;} + // Check for response call reverted + if (!_response.success) return true; // Check for an invalid roundId that is 0 - if (_response.roundId == 0) {return true;} + if (_response.roundId == 0) return true; // Check for an invalid timeStamp that is 0, or in the future - if (_response.timestamp == 0 || _response.timestamp > block.timestamp) {return true;} + if (_response.timestamp == 0 || _response.timestamp > block.timestamp) return true; // Check for non-positive price - if (_response.answer <= 0) {return true;} + if (_response.answer <= 0) return true; return false; } @@ -360,19 +361,23 @@ contract PriceFeed is Ownable, CheckContract, BaseMath, IPriceFeed { return block.timestamp - _response.timestamp > TIMEOUT; } - function _chainlinkPriceChangeAboveMax(ChainlinkResponse memory _currentResponse, ChainlinkResponse memory _prevResponse) internal pure returns (bool) { - uint currentScaledPrice = _scaleChainlinkPriceByDigits(uint256(_currentResponse.answer), _currentResponse.decimals); - uint prevScaledPrice = _scaleChainlinkPriceByDigits(uint256(_prevResponse.answer), _prevResponse.decimals); + function _chainlinkPriceChangeAboveMax( + ChainlinkResponse memory _currentResponse, + ChainlinkResponse memory _prevResponse + ) internal pure returns (bool) { + uint256 currentScaledPrice = + _scaleChainlinkPriceByDigits(uint256(_currentResponse.answer), _currentResponse.decimals); + uint256 prevScaledPrice = _scaleChainlinkPriceByDigits(uint256(_prevResponse.answer), _prevResponse.decimals); - uint minPrice = LiquityMath._min(currentScaledPrice, prevScaledPrice); - uint maxPrice = LiquityMath._max(currentScaledPrice, prevScaledPrice); + uint256 minPrice = LiquityMath._min(currentScaledPrice, prevScaledPrice); + uint256 maxPrice = LiquityMath._max(currentScaledPrice, prevScaledPrice); /* * Use the larger price as the denominator: * - If price decreased, the percentage deviation is in relation to the the previous price. * - If price increased, the percentage deviation is in relation to the current price. */ - uint percentDeviation = (maxPrice - minPrice) * DECIMAL_PRECISION / maxPrice; + uint256 percentDeviation = (maxPrice - minPrice) * DECIMAL_PRECISION / maxPrice; // Return true if price has more than doubled, or more than halved. return percentDeviation > MAX_PRICE_DEVIATION_FROM_PREVIOUS_ROUND; @@ -380,52 +385,47 @@ contract PriceFeed is Ownable, CheckContract, BaseMath, IPriceFeed { function _tellorIsBroken(TellorResponse memory _response) internal view returns (bool) { // Check for response call reverted - if (!_response.success) {return true;} + if (!_response.success) return true; // Check for an invalid timeStamp that is 0, or in the future - if (_response.timestamp == 0 || _response.timestamp > block.timestamp) {return true;} + if (_response.timestamp == 0 || _response.timestamp > block.timestamp) return true; // Check for zero price - if (_response.value == 0) {return true;} + if (_response.value == 0) return true; return false; } - function _tellorIsFrozen(TellorResponse memory _tellorResponse) internal view returns (bool) { + function _tellorIsFrozen(TellorResponse memory _tellorResponse) internal view returns (bool) { return block.timestamp - _tellorResponse.timestamp > TIMEOUT; } - function _bothOraclesLiveAndUnbrokenAndSimilarPrice - ( + function _bothOraclesLiveAndUnbrokenAndSimilarPrice( ChainlinkResponse memory _chainlinkResponse, ChainlinkResponse memory _prevChainlinkResponse, TellorResponse memory _tellorResponse - ) - internal - view - returns (bool) - { + ) internal view returns (bool) { // Return false if either oracle is broken or frozen - if - ( - _tellorIsBroken(_tellorResponse) || - _tellorIsFrozen(_tellorResponse) || - _chainlinkIsBroken(_chainlinkResponse, _prevChainlinkResponse) || - _chainlinkIsFrozen(_chainlinkResponse) - ) - { + if ( + _tellorIsBroken(_tellorResponse) || _tellorIsFrozen(_tellorResponse) + || _chainlinkIsBroken(_chainlinkResponse, _prevChainlinkResponse) || _chainlinkIsFrozen(_chainlinkResponse) + ) { return false; } return _bothOraclesSimilarPrice(_chainlinkResponse, _tellorResponse); } - function _bothOraclesSimilarPrice( ChainlinkResponse memory _chainlinkResponse, TellorResponse memory _tellorResponse) internal pure returns (bool) { - uint scaledChainlinkPrice = _scaleChainlinkPriceByDigits(uint256(_chainlinkResponse.answer), _chainlinkResponse.decimals); - uint scaledTellorPrice = _scaleTellorPriceByDigits(_tellorResponse.value); + function _bothOraclesSimilarPrice( + ChainlinkResponse memory _chainlinkResponse, + TellorResponse memory _tellorResponse + ) internal pure returns (bool) { + uint256 scaledChainlinkPrice = + _scaleChainlinkPriceByDigits(uint256(_chainlinkResponse.answer), _chainlinkResponse.decimals); + uint256 scaledTellorPrice = _scaleTellorPriceByDigits(_tellorResponse.value); // Get the relative price difference between the oracles. Use the lower price as the denominator, i.e. the reference for the calculation. - uint minPrice = LiquityMath._min(scaledTellorPrice, scaledChainlinkPrice); - uint maxPrice = LiquityMath._max(scaledTellorPrice, scaledChainlinkPrice); - uint percentPriceDifference = (maxPrice - minPrice) * DECIMAL_PRECISION / minPrice; + uint256 minPrice = LiquityMath._min(scaledTellorPrice, scaledChainlinkPrice); + uint256 maxPrice = LiquityMath._max(scaledTellorPrice, scaledChainlinkPrice); + uint256 percentPriceDifference = (maxPrice - minPrice) * DECIMAL_PRECISION / minPrice; /* * Return true if the relative price difference is <= 3%: if so, we assume both oracles are probably reporting @@ -434,27 +434,26 @@ contract PriceFeed is Ownable, CheckContract, BaseMath, IPriceFeed { return percentPriceDifference <= MAX_PRICE_DIFFERENCE_BETWEEN_ORACLES; } - function _scaleChainlinkPriceByDigits(uint _price, uint _answerDigits) internal pure returns (uint) { + function _scaleChainlinkPriceByDigits(uint256 _price, uint256 _answerDigits) internal pure returns (uint256) { /* * Convert the price returned by the Chainlink oracle to an 18-digit decimal for use by Liquity. * At date of Liquity launch, Chainlink uses an 8-digit price, but we also handle the possibility of * future changes. * */ - uint price; + uint256 price; if (_answerDigits >= TARGET_DIGITS) { // Scale the returned price value down to Liquity's target precision price = _price / (10 ** (_answerDigits - TARGET_DIGITS)); - } - else if (_answerDigits < TARGET_DIGITS) { + } else if (_answerDigits < TARGET_DIGITS) { // Scale the returned price value up to Liquity's target precision price = _price * (10 ** (TARGET_DIGITS - _answerDigits)); } return price; } - function _scaleTellorPriceByDigits(uint _price) internal pure returns (uint) { - return _price * (10**(TARGET_DIGITS - TELLOR_DIGITS)); + function _scaleTellorPriceByDigits(uint256 _price) internal pure returns (uint256) { + return _price * (10 ** (TARGET_DIGITS - TELLOR_DIGITS)); } function _changeStatus(Status _status) internal { @@ -462,20 +461,21 @@ contract PriceFeed is Ownable, CheckContract, BaseMath, IPriceFeed { emit PriceFeedStatusChanged(_status); } - function _storePrice(uint _currentPrice) internal { + function _storePrice(uint256 _currentPrice) internal { lastGoodPrice = _currentPrice; emit LastGoodPriceUpdated(_currentPrice); } - function _storeTellorPrice(TellorResponse memory _tellorResponse) internal returns (uint) { - uint scaledTellorPrice = _scaleTellorPriceByDigits(_tellorResponse.value); + function _storeTellorPrice(TellorResponse memory _tellorResponse) internal returns (uint256) { + uint256 scaledTellorPrice = _scaleTellorPriceByDigits(_tellorResponse.value); _storePrice(scaledTellorPrice); return scaledTellorPrice; } - function _storeChainlinkPrice(ChainlinkResponse memory _chainlinkResponse) internal returns (uint) { - uint scaledChainlinkPrice = _scaleChainlinkPriceByDigits(uint256(_chainlinkResponse.answer), _chainlinkResponse.decimals); + function _storeChainlinkPrice(ChainlinkResponse memory _chainlinkResponse) internal returns (uint256) { + uint256 scaledChainlinkPrice = + _scaleChainlinkPriceByDigits(uint256(_chainlinkResponse.answer), _chainlinkResponse.decimals); _storePrice(scaledChainlinkPrice); return scaledChainlinkPrice; @@ -484,13 +484,9 @@ contract PriceFeed is Ownable, CheckContract, BaseMath, IPriceFeed { // --- Oracle response wrapper functions --- function _getCurrentTellorResponse() internal view returns (TellorResponse memory tellorResponse) { - try tellorCaller.getTellorCurrentValue(ETHUSD_TELLOR_REQ_ID) returns - ( - bool ifRetrieve, - uint256 value, - uint256 _timestampRetrieved - ) - { + try tellorCaller.getTellorCurrentValue(ETHUSD_TELLOR_REQ_ID) returns ( + bool ifRetrieve, uint256 value, uint256 _timestampRetrieved + ) { // If call to Tellor succeeds, return the response and success = true tellorResponse.ifRetrieve = ifRetrieve; tellorResponse.value = value; @@ -498,8 +494,8 @@ contract PriceFeed is Ownable, CheckContract, BaseMath, IPriceFeed { tellorResponse.success = true; return (tellorResponse); - }catch { - // If call to Tellor reverts, return a zero response with success = false + } catch { + // If call to Tellor reverts, return a zero response with success = false return (tellorResponse); } } @@ -515,15 +511,9 @@ contract PriceFeed is Ownable, CheckContract, BaseMath, IPriceFeed { } // Secondly, try to get latest price data: - try priceAggregator.latestRoundData() returns - ( - uint80 roundId, - int256 answer, - uint256 /* startedAt */, - uint256 timestamp, - uint80 /* answeredInRound */ - ) - { + try priceAggregator.latestRoundData() returns ( + uint80 roundId, int256 answer, uint256, /* startedAt */ uint256 timestamp, uint80 /* answeredInRound */ + ) { // If call to Chainlink succeeds, return the response and success = true chainlinkResponse.roundId = roundId; chainlinkResponse.answer = answer; @@ -536,22 +526,20 @@ contract PriceFeed is Ownable, CheckContract, BaseMath, IPriceFeed { } } - function _getPrevChainlinkResponse(uint80 _currentRoundId, uint8 _currentDecimals) internal view returns (ChainlinkResponse memory prevChainlinkResponse) { + function _getPrevChainlinkResponse(uint80 _currentRoundId, uint8 _currentDecimals) + internal + view + returns (ChainlinkResponse memory prevChainlinkResponse) + { /* * NOTE: Chainlink only offers a current decimals() value - there is no way to obtain the decimal precision used in a * previous round. We assume the decimals used in the previous round are the same as the current round. */ // Try to get the price data from the previous round: - try priceAggregator.getRoundData(_currentRoundId - 1) returns - ( - uint80 roundId, - int256 answer, - uint256 /* startedAt */, - uint256 timestamp, - uint80 /* answeredInRound */ - ) - { + try priceAggregator.getRoundData(_currentRoundId - 1) returns ( + uint80 roundId, int256 answer, uint256, /* startedAt */ uint256 timestamp, uint80 /* answeredInRound */ + ) { // If call to Chainlink succeeds, return the response and success = true prevChainlinkResponse.roundId = roundId; prevChainlinkResponse.answer = answer; @@ -565,4 +553,3 @@ contract PriceFeed is Ownable, CheckContract, BaseMath, IPriceFeed { } } } - diff --git a/contracts/src/SortedTroves.sol b/contracts/src/SortedTroves.sol index 9d979cb2..663bfac5 100644 --- a/contracts/src/SortedTroves.sol +++ b/contracts/src/SortedTroves.sol @@ -37,7 +37,7 @@ uint256 constant ROOT_NODE_ID = 0; * - Public functions with parameters have been made internal to save gas, and given an external wrapper function for external access */ contract SortedTroves is Ownable, CheckContract, ISortedTroves { - string constant public NAME = "SortedTroves"; + string public constant NAME = "SortedTroves"; // Constants used for documentation purposes uint256 constant UNINITIALIZED_ID = 0; @@ -51,8 +51,8 @@ contract SortedTroves is Ownable, CheckContract, ISortedTroves { // Information for a node in the list struct Node { - uint256 nextId; // Id of next node (smaller interest rate) in the list - uint256 prevId; // Id of previous node (larger interest rate) in the list + uint256 nextId; // Id of next node (smaller interest rate) in the list + uint256 prevId; // Id of previous node (larger interest rate) in the list BatchId batchId; // Id of this node's batch manager, or zero in case of non-batched nodes bool exists; } @@ -74,10 +74,10 @@ contract SortedTroves is Ownable, CheckContract, ISortedTroves { // nodes[ROOT_NODE_ID] holds the head and tail of the list. This avoids the need for special // handling when inserting into or removing from a terminal position (head or tail), inserting // into an empty list or removing the element of a singleton list. - mapping (uint256 => Node) public nodes; + mapping(uint256 => Node) public nodes; // Lookup batches by the address of their manager - mapping (BatchId => Batch) public batches; + mapping(BatchId => Batch) public batches; constructor() { // Technically, this is not needed as long as ROOT_NODE_ID is 0, but it doesn't hurt @@ -87,7 +87,11 @@ contract SortedTroves is Ownable, CheckContract, ISortedTroves { // --- Dependency setters --- - function setAddresses(address _troveManagerAddress, address _borrowerOperationsAddress) external override onlyOwner { + function setAddresses(address _troveManagerAddress, address _borrowerOperationsAddress) + external + override + onlyOwner + { checkContract(_troveManagerAddress); checkContract(_borrowerOperationsAddress); @@ -103,14 +107,23 @@ contract SortedTroves is Ownable, CheckContract, ISortedTroves { // Insert an entire list slice (such as a batch of Troves sharing the same interest rate) // between adjacent nodes `_prevId` and `_nextId`. // Can be used to insert a single node by passing its ID as both `_sliceHead` and `_sliceTail`. - function _insertSliceIntoVerifiedPosition(uint256 _sliceHead, uint256 _sliceTail, uint256 _prevId, uint256 _nextId) internal { + function _insertSliceIntoVerifiedPosition(uint256 _sliceHead, uint256 _sliceTail, uint256 _prevId, uint256 _nextId) + internal + { nodes[_prevId].nextId = _sliceHead; nodes[_sliceHead].prevId = _prevId; nodes[_sliceTail].nextId = _nextId; nodes[_nextId].prevId = _sliceTail; } - function _insertSlice(ITroveManager _troveManager, uint256 _sliceHead, uint256 _sliceTail, uint256 _annualInterestRate, uint256 _prevId, uint256 _nextId) internal { + function _insertSlice( + ITroveManager _troveManager, + uint256 _sliceHead, + uint256 _sliceTail, + uint256 _annualInterestRate, + uint256 _prevId, + uint256 _nextId + ) internal { if (!_validInsertPosition(_troveManager, _annualInterestRate, _prevId, _nextId)) { // Sender's hint was not a valid insert position // Use sender's hint to find a valid insert position @@ -160,7 +173,14 @@ contract SortedTroves is Ownable, CheckContract, ISortedTroves { --size; } - function _reInsertSlice(ITroveManager _troveManager, uint256 _sliceHead, uint256 _sliceTail, uint256 _annualInterestRate, uint256 _prevId, uint256 _nextId) internal { + function _reInsertSlice( + ITroveManager _troveManager, + uint256 _sliceHead, + uint256 _sliceTail, + uint256 _annualInterestRate, + uint256 _prevId, + uint256 _nextId + ) internal { if (!_validInsertPosition(_troveManager, _annualInterestRate, _prevId, _nextId)) { // Sender's hint was not a valid insert position // Use sender's hint to find a valid insert position @@ -181,7 +201,10 @@ contract SortedTroves is Ownable, CheckContract, ISortedTroves { * @param _prevId Id of previous Trove for the new insert position * @param _nextId Id of next Trove for the new insert position */ - function reInsert(uint256 _id, uint256 _newAnnualInterestRate, uint256 _prevId, uint256 _nextId) external override { + function reInsert(uint256 _id, uint256 _newAnnualInterestRate, uint256 _prevId, uint256 _nextId) + external + override + { _requireCallerIsBorrowerOperations(); require(contains(_id), "SortedTroves: List does not contain the id"); require(!isBatchedNode(_id), "SortedTroves: Must not reInsert() batched node"); @@ -197,7 +220,13 @@ contract SortedTroves is Ownable, CheckContract, ISortedTroves { * @param _prevId Id of previous Trove for the insert position, in case the Batch is empty * @param _nextId Id of next Trove for the insert position, in case the Batch is empty */ - function insertIntoBatch(uint256 _troveId, BatchId _batchId, uint256 _annualInterestRate, uint256 _prevId, uint256 _nextId) external override { + function insertIntoBatch( + uint256 _troveId, + BatchId _batchId, + uint256 _annualInterestRate, + uint256 _prevId, + uint256 _nextId + ) external override { _requireCallerIsBorrowerOperations(); require(!contains(_troveId), "SortedTroves: List already contains the node"); require(_troveId != ROOT_NODE_ID, "SortedTroves: _troveId cannot be the root node's ID"); @@ -211,12 +240,7 @@ contract SortedTroves is Ownable, CheckContract, ISortedTroves { batches[_batchId].head = _troveId; // (Tail will be set outside the "if") } else { - _insertSliceIntoVerifiedPosition( - _troveId, - _troveId, - batchTail, - nodes[batchTail].nextId - ); + _insertSliceIntoVerifiedPosition(_troveId, _troveId, batchTail, nodes[batchTail].nextId); } batches[_batchId].tail = _troveId; @@ -258,7 +282,10 @@ contract SortedTroves is Ownable, CheckContract, ISortedTroves { * @param _prevId Id of previous Trove for the new insert position * @param _nextId Id of next Trove for the new insert position */ - function reInsertBatch(BatchId _id, uint256 _newAnnualInterestRate, uint256 _prevId, uint256 _nextId) external override { + function reInsertBatch(BatchId _id, uint256 _newAnnualInterestRate, uint256 _prevId, uint256 _nextId) + external + override + { Batch memory batch = batches[_id]; _requireCallerIsBorrowerOperations(); @@ -331,26 +358,33 @@ contract SortedTroves is Ownable, CheckContract, ISortedTroves { * @param _prevId Id of previous node for the insert position * @param _nextId Id of next node for the insert position */ - function validInsertPosition(uint256 _annualInterestRate, uint256 _prevId, uint256 _nextId) external view override returns (bool) { + function validInsertPosition(uint256 _annualInterestRate, uint256 _prevId, uint256 _nextId) + external + view + override + returns (bool) + { return _validInsertPosition(troveManager, _annualInterestRate, _prevId, _nextId); } - function _validInsertPosition(ITroveManager _troveManager, uint256 _annualInterestRate, uint256 _prevId, uint256 _nextId) internal view returns (bool) { + function _validInsertPosition( + ITroveManager _troveManager, + uint256 _annualInterestRate, + uint256 _prevId, + uint256 _nextId + ) internal view returns (bool) { BatchId prevBatchId = nodes[_prevId].batchId; // `(_prevId, _nextId)` is a valid insert position if: - return ( - // they are adjacent nodes - nodes[_prevId].nextId == _nextId && - nodes[_nextId].prevId == _prevId && - ( - // they aren't part of the same batch - prevBatchId.notEquals(nodes[_nextId].batchId) || - prevBatchId.isZero() - ) && + return + // they are adjacent nodes + ( + nodes[_prevId].nextId == _nextId && nodes[_nextId].prevId == _prevId + // they aren't part of the same batch + && (prevBatchId.notEquals(nodes[_nextId].batchId) || prevBatchId.isZero()) // `_annualInterestRate` falls between the two nodes' interest rates - (_prevId == ROOT_NODE_ID || _troveManager.getTroveAnnualInterestRate(_prevId) >= _annualInterestRate) && - (_nextId == ROOT_NODE_ID || _annualInterestRate > _troveManager.getTroveAnnualInterestRate(_nextId)) + && (_prevId == ROOT_NODE_ID || _troveManager.getTroveAnnualInterestRate(_prevId) >= _annualInterestRate) + && (_nextId == ROOT_NODE_ID || _annualInterestRate > _troveManager.getTroveAnnualInterestRate(_nextId)) ); } @@ -364,8 +398,13 @@ contract SortedTroves is Ownable, CheckContract, ISortedTroves { return batchId.isNotZero() ? batches[batchId].head : _id; } - function _descendOne(ITroveManager _troveManager, uint256 _annualInterestRate, Position memory _pos) internal view returns (bool found) { - if (_pos.nextId == ROOT_NODE_ID || _annualInterestRate > _troveManager.getTroveAnnualInterestRate(_pos.nextId)) { + function _descendOne(ITroveManager _troveManager, uint256 _annualInterestRate, Position memory _pos) + internal + view + returns (bool found) + { + if (_pos.nextId == ROOT_NODE_ID || _annualInterestRate > _troveManager.getTroveAnnualInterestRate(_pos.nextId)) + { found = true; } else { _pos.prevId = _skipToBatchTail(_pos.nextId); @@ -373,8 +412,13 @@ contract SortedTroves is Ownable, CheckContract, ISortedTroves { } } - function _ascendOne(ITroveManager _troveManager, uint256 _annualInterestRate, Position memory _pos) internal view returns (bool found) { - if (_pos.prevId == ROOT_NODE_ID || _troveManager.getTroveAnnualInterestRate(_pos.prevId) >= _annualInterestRate) { + function _ascendOne(ITroveManager _troveManager, uint256 _annualInterestRate, Position memory _pos) + internal + view + returns (bool found) + { + if (_pos.prevId == ROOT_NODE_ID || _troveManager.getTroveAnnualInterestRate(_pos.prevId) >= _annualInterestRate) + { found = true; } else { _pos.nextId = _skipToBatchHead(_pos.prevId); @@ -388,7 +432,11 @@ contract SortedTroves is Ownable, CheckContract, ISortedTroves { * @param _annualInterestRate Node's annual interest rate * @param _startId Id of node to start descending the list from */ - function _descendList(ITroveManager _troveManager, uint256 _annualInterestRate, uint256 _startId) internal view returns (uint256, uint256) { + function _descendList(ITroveManager _troveManager, uint256 _annualInterestRate, uint256 _startId) + internal + view + returns (uint256, uint256) + { Position memory pos = Position(_startId, nodes[_startId].nextId); while (!_descendOne(_troveManager, _annualInterestRate, pos)) {} @@ -401,7 +449,11 @@ contract SortedTroves is Ownable, CheckContract, ISortedTroves { * @param _annualInterestRate Node's annual interest rate * @param _startId Id of node to start ascending the list from */ - function _ascendList(ITroveManager _troveManager, uint256 _annualInterestRate, uint256 _startId) internal view returns (uint256, uint256) { + function _ascendList(ITroveManager _troveManager, uint256 _annualInterestRate, uint256 _startId) + internal + view + returns (uint256, uint256) + { Position memory pos = Position(nodes[_startId].prevId, _startId); while (!_ascendOne(_troveManager, _annualInterestRate, pos)) {} @@ -436,14 +488,24 @@ contract SortedTroves is Ownable, CheckContract, ISortedTroves { * @param _prevId Id of previous node for the insert position * @param _nextId Id of next node for the insert position */ - function findInsertPosition(uint256 _annualInterestRate, uint256 _prevId, uint256 _nextId) external view override returns (uint256, uint256) { + function findInsertPosition(uint256 _annualInterestRate, uint256 _prevId, uint256 _nextId) + external + view + override + returns (uint256, uint256) + { return _findInsertPosition(troveManager, _annualInterestRate, _prevId, _nextId); } // This function is optimized under the assumption that only one of the original neighbours has been (re)moved. // In other words, we assume that the correct position can be found close to one of the two. // Nevertheless, the function will always find the correct position, regardless of hints or interference. - function _findInsertPosition(ITroveManager _troveManager, uint256 _annualInterestRate, uint256 _prevId, uint256 _nextId) internal view returns (uint256, uint256) { + function _findInsertPosition( + ITroveManager _troveManager, + uint256 _annualInterestRate, + uint256 _prevId, + uint256 _nextId + ) internal view returns (uint256, uint256) { if (_prevId == ROOT_NODE_ID) { // The original correct position was found before the head of the list. // Assuming minimal interference, the new correct position is still close to the head. @@ -483,7 +545,9 @@ contract SortedTroves is Ownable, CheckContract, ISortedTroves { // The correct position is still somewhere between the 2 hints, so it's not obvious // which of the 2 has been moved (assuming only one of them has been). // We simultaneously descend & ascend in the hope that one of them is very close. - return _descendAndAscendList(_troveManager, _annualInterestRate, _skipToBatchTail(_prevId), _skipToBatchHead(_nextId)); + return _descendAndAscendList( + _troveManager, _annualInterestRate, _skipToBatchTail(_prevId), _skipToBatchHead(_nextId) + ); } } diff --git a/contracts/src/StabilityPool.sol b/contracts/src/StabilityPool.sol index 94cc530f..67610e3b 100644 --- a/contracts/src/StabilityPool.sol +++ b/contracts/src/StabilityPool.sol @@ -4,12 +4,12 @@ pragma solidity 0.8.18; import "openzeppelin-contracts/contracts/token/ERC20/utils/SafeERC20.sol"; -import './Interfaces/IBorrowerOperations.sol'; -import './Interfaces/IStabilityPool.sol'; -import './Interfaces/IBorrowerOperations.sol'; -import './Interfaces/ITroveManager.sol'; -import './Interfaces/IBoldToken.sol'; -import './Interfaces/ISortedTroves.sol'; +import "./Interfaces/IBorrowerOperations.sol"; +import "./Interfaces/IStabilityPool.sol"; +import "./Interfaces/IBorrowerOperations.sol"; +import "./Interfaces/ITroveManager.sol"; +import "./Interfaces/IBoldToken.sol"; +import "./Interfaces/ISortedTroves.sol"; import "./Dependencies/LiquityBase.sol"; import "./Dependencies/Ownable.sol"; import "./Dependencies/CheckContract.sol"; @@ -133,7 +133,7 @@ import "./Dependencies/CheckContract.sol"; contract StabilityPool is LiquityBase, Ownable, CheckContract, IStabilityPool { using SafeERC20 for IERC20; - string constant public NAME = "StabilityPool"; + string public constant NAME = "StabilityPool"; IERC20 public immutable ETH; IBorrowerOperations public borrowerOperations; @@ -142,27 +142,27 @@ contract StabilityPool is LiquityBase, Ownable, CheckContract, IStabilityPool { // Needed to check if there are pending liquidations ISortedTroves public sortedTroves; - uint256 internal ETHBalance; // deposited ether tracker + uint256 internal ETHBalance; // deposited ether tracker // Tracker for Bold held in the pool. Changes when users deposit/withdraw, and when Trove debt is offset. uint256 internal totalBoldDeposits; - // --- Data structures --- + // --- Data structures --- struct Deposit { - uint initialValue; + uint256 initialValue; } struct Snapshots { - uint S; - uint P; - uint G; + uint256 S; + uint256 P; + uint256 G; uint128 scale; uint128 epoch; } - mapping (address => Deposit) public deposits; // depositor address -> Deposit struct - mapping (address => Snapshots) public depositSnapshots; // depositor address -> snapshots struct + mapping(address => Deposit) public deposits; // depositor address -> Deposit struct + mapping(address => Snapshots) public depositSnapshots; // depositor address -> snapshots struct /* Product 'P': Running product by which to multiply an initial deposit, in order to find the current compounded deposit, * after a series of liquidations have occurred, each of which cancel some Bold debt with the deposit. @@ -170,9 +170,9 @@ contract StabilityPool is LiquityBase, Ownable, CheckContract, IStabilityPool { * During its lifetime, a deposit's value evolves from d_t to d_t * P / P_t , where P_t * is the snapshot of P taken at the instant the deposit was made. 18-digit decimal. */ - uint public P = DECIMAL_PRECISION; + uint256 public P = DECIMAL_PRECISION; - uint public constant SCALE_FACTOR = 1e9; + uint256 public constant SCALE_FACTOR = 1e9; // Each time the scale of P shifts by SCALE_FACTOR, the scale is incremented by 1 uint128 public currentScale; @@ -188,16 +188,16 @@ contract StabilityPool is LiquityBase, Ownable, CheckContract, IStabilityPool { * - The inner mapping records the sum S at different scales * - The outer mapping records the (scale => sum) mappings, for different epochs. */ - mapping (uint128 => mapping(uint128 => uint)) public epochToScaleToSum; + mapping(uint128 => mapping(uint128 => uint256)) public epochToScaleToSum; // Error trackers for the error correction in the offset calculation - uint public lastETHError_Offset; - uint public lastBoldLossError_Offset; + uint256 public lastETHError_Offset; + uint256 public lastBoldLossError_Offset; // --- Events --- - event StabilityPoolETHBalanceUpdated(uint _newBalance); - event StabilityPoolBoldBalanceUpdated(uint _newBalance); + event StabilityPoolETHBalanceUpdated(uint256 _newBalance); + event StabilityPoolBoldBalanceUpdated(uint256 _newBalance); event BorrowerOperationsAddressChanged(address _newBorrowerOperationsAddress); event TroveManagerAddressChanged(address _newTroveManagerAddress); @@ -207,18 +207,18 @@ contract StabilityPool is LiquityBase, Ownable, CheckContract, IStabilityPool { event SortedTrovesAddressChanged(address _newSortedTrovesAddress); event PriceFeedAddressChanged(address _newPriceFeedAddress); - event P_Updated(uint _P); - event S_Updated(uint _S, uint128 _epoch, uint128 _scale); - event G_Updated(uint _G, uint128 _epoch, uint128 _scale); + event P_Updated(uint256 _P); + event S_Updated(uint256 _S, uint128 _epoch, uint128 _scale); + event G_Updated(uint256 _G, uint128 _epoch, uint128 _scale); event EpochUpdated(uint128 _currentEpoch); event ScaleUpdated(uint128 _currentScale); - event DepositSnapshotUpdated(address indexed _depositor, uint _P, uint _S); - event UserDepositChanged(address indexed _depositor, uint _newDeposit); + event DepositSnapshotUpdated(address indexed _depositor, uint256 _P, uint256 _S); + event UserDepositChanged(address indexed _depositor, uint256 _newDeposit); - event ETHGainWithdrawn(address indexed _depositor, uint _ETH, uint _boldLoss); + event ETHGainWithdrawn(address indexed _depositor, uint256 _ETH, uint256 _boldLoss); // TODO: Do we still need this, as we’ll likely have the ERC20 transfer event? - event EtherSent(address _to, uint _amount); + event EtherSent(address _to, uint256 _amount); constructor(address _ETHAddress) { checkContract(_ETHAddress); @@ -234,11 +234,7 @@ contract StabilityPool is LiquityBase, Ownable, CheckContract, IStabilityPool { address _boldTokenAddress, address _sortedTrovesAddress, address _priceFeedAddress - ) - external - override - onlyOwner - { + ) external override onlyOwner { checkContract(_borrowerOperationsAddress); checkContract(_troveManagerAddress); checkContract(_activePoolAddress); @@ -268,11 +264,11 @@ contract StabilityPool is LiquityBase, Ownable, CheckContract, IStabilityPool { // --- Getters for public variables. Required by IPool interface --- - function getETHBalance() external view override returns (uint) { + function getETHBalance() external view override returns (uint256) { return ETHBalance; } - function getTotalBoldDeposits() external view override returns (uint) { + function getTotalBoldDeposits() external view override returns (uint256) { return totalBoldDeposits; } @@ -284,27 +280,27 @@ contract StabilityPool is LiquityBase, Ownable, CheckContract, IStabilityPool { * - Increases deposit, and takes new snapshots of accumulators P and S * - Sends depositor's accumulated ETH gains to depositor */ - function provideToSP(uint _amount) external override { + function provideToSP(uint256 _amount) external override { _requireNonZeroAmount(_amount); activePool.mintAggInterestNoTroveChange(); - uint initialDeposit = deposits[msg.sender].initialValue; + uint256 initialDeposit = deposits[msg.sender].initialValue; - uint depositorETHGain = getDepositorETHGain(msg.sender); - uint compoundedBoldDeposit = getCompoundedBoldDeposit(msg.sender); - uint boldLoss = initialDeposit - compoundedBoldDeposit; // Needed only for event log + uint256 depositorETHGain = getDepositorETHGain(msg.sender); + uint256 compoundedBoldDeposit = getCompoundedBoldDeposit(msg.sender); + uint256 boldLoss = initialDeposit - compoundedBoldDeposit; // Needed only for event log _sendBoldtoStabilityPool(msg.sender, _amount); - uint newDeposit = compoundedBoldDeposit + _amount; + uint256 newDeposit = compoundedBoldDeposit + _amount; _updateDepositAndSnapshots(msg.sender, newDeposit); emit UserDepositChanged(msg.sender, newDeposit); emit ETHGainWithdrawn(msg.sender, depositorETHGain, boldLoss); // Bold Loss required for event log _sendETHGainToDepositor(depositorETHGain); - } + } /* withdrawFromSP(): * - Calculates depositor's ETH gain @@ -313,27 +309,27 @@ contract StabilityPool is LiquityBase, Ownable, CheckContract, IStabilityPool { * - (If _amount > userDeposit, the user withdraws all of their compounded deposit) * - Decreases deposit by withdrawn amount and takes new snapshots of accumulators P and S */ - function withdrawFromSP(uint _amount) external override { + function withdrawFromSP(uint256 _amount) external override { // TODO: if (_amount !=0) {_requireNoUnderCollateralizedTroves();} - uint initialDeposit = deposits[msg.sender].initialValue; + uint256 initialDeposit = deposits[msg.sender].initialValue; _requireUserHasDeposit(initialDeposit); activePool.mintAggInterestNoTroveChange(); - uint depositorETHGain = getDepositorETHGain(msg.sender); + uint256 depositorETHGain = getDepositorETHGain(msg.sender); - uint compoundedBoldDeposit = getCompoundedBoldDeposit(msg.sender); - uint BoldtoWithdraw = LiquityMath._min(_amount, compoundedBoldDeposit); - uint boldLoss = initialDeposit - compoundedBoldDeposit; // Needed only for event log + uint256 compoundedBoldDeposit = getCompoundedBoldDeposit(msg.sender); + uint256 BoldtoWithdraw = LiquityMath._min(_amount, compoundedBoldDeposit); + uint256 boldLoss = initialDeposit - compoundedBoldDeposit; // Needed only for event log _sendBoldToDepositor(msg.sender, BoldtoWithdraw); // Update deposit - uint newDeposit = compoundedBoldDeposit - BoldtoWithdraw; + uint256 newDeposit = compoundedBoldDeposit - BoldtoWithdraw; _updateDepositAndSnapshots(msg.sender, newDeposit); emit UserDepositChanged(msg.sender, newDeposit); - emit ETHGainWithdrawn(msg.sender, depositorETHGain, boldLoss); // Bold Loss required for event log + emit ETHGainWithdrawn(msg.sender, depositorETHGain, boldLoss); // Bold Loss required for event log _sendETHGainToDepositor(depositorETHGain); } @@ -344,15 +340,15 @@ contract StabilityPool is LiquityBase, Ownable, CheckContract, IStabilityPool { * - Takes new snapshots of accumulators P and S */ function withdrawETHGainToTrove(uint256 _troveId) external override { - uint initialDeposit = deposits[msg.sender].initialValue; + uint256 initialDeposit = deposits[msg.sender].initialValue; _requireUserHasDeposit(initialDeposit); _requireTroveIsActive(_troveId); _requireUserHasETHGain(msg.sender); - uint depositorETHGain = getDepositorETHGain(msg.sender); + uint256 depositorETHGain = getDepositorETHGain(msg.sender); - uint compoundedBoldDeposit = getCompoundedBoldDeposit(msg.sender); - uint boldLoss = initialDeposit - compoundedBoldDeposit; // Needed only for event log + uint256 compoundedBoldDeposit = getCompoundedBoldDeposit(msg.sender); + uint256 boldLoss = initialDeposit - compoundedBoldDeposit; // Needed only for event log _updateDepositAndSnapshots(msg.sender, compoundedBoldDeposit); @@ -367,7 +363,7 @@ contract StabilityPool is LiquityBase, Ownable, CheckContract, IStabilityPool { emit StabilityPoolETHBalanceUpdated(newETHBalance); emit EtherSent(msg.sender, depositorETHGain); - borrowerOperations.moveETHGainToTrove(msg.sender, _troveId, depositorETHGain); + borrowerOperations.moveETHGainToTrove(msg.sender, _troveId, depositorETHGain); } // --- Liquidation functions --- @@ -377,28 +373,24 @@ contract StabilityPool is LiquityBase, Ownable, CheckContract, IStabilityPool { * and transfers the Trove's ETH collateral from ActivePool to StabilityPool. * Only called by liquidation functions in the TroveManager. */ - function offset(uint _debtToOffset, uint _collToAdd) external override { + function offset(uint256 _debtToOffset, uint256 _collToAdd) external override { _requireCallerIsTroveManager(); - uint totalBold = totalBoldDeposits; // cached to save an SLOAD - if (totalBold == 0 || _debtToOffset == 0) { return; } + uint256 totalBold = totalBoldDeposits; // cached to save an SLOAD + if (totalBold == 0 || _debtToOffset == 0) return; - (uint ETHGainPerUnitStaked, - uint boldLossPerUnitStaked) = _computeRewardsPerUnitStaked(_collToAdd, _debtToOffset, totalBold); + (uint256 ETHGainPerUnitStaked, uint256 boldLossPerUnitStaked) = + _computeRewardsPerUnitStaked(_collToAdd, _debtToOffset, totalBold); - _updateRewardSumAndProduct(ETHGainPerUnitStaked, boldLossPerUnitStaked); // updates S and P + _updateRewardSumAndProduct(ETHGainPerUnitStaked, boldLossPerUnitStaked); // updates S and P _moveOffsetCollAndDebt(_collToAdd, _debtToOffset); } // --- Offset helper functions --- - function _computeRewardsPerUnitStaked( - uint _collToAdd, - uint _debtToOffset, - uint _totalBoldDeposits - ) + function _computeRewardsPerUnitStaked(uint256 _collToAdd, uint256 _debtToOffset, uint256 _totalBoldDeposits) internal - returns (uint ETHGainPerUnitStaked, uint boldLossPerUnitStaked) + returns (uint256 ETHGainPerUnitStaked, uint256 boldLossPerUnitStaked) { /* * Compute the Bold and ETH rewards. Uses a "feedback" error correction, to keep @@ -411,14 +403,14 @@ contract StabilityPool is LiquityBase, Ownable, CheckContract, IStabilityPool { * 4) Store these errors for use in the next correction when this function is called. * 5) Note: static analysis tools complain about this "division before multiplication", however, it is intended. */ - uint ETHNumerator = _collToAdd * DECIMAL_PRECISION + lastETHError_Offset; + uint256 ETHNumerator = _collToAdd * DECIMAL_PRECISION + lastETHError_Offset; assert(_debtToOffset <= _totalBoldDeposits); if (_debtToOffset == _totalBoldDeposits) { - boldLossPerUnitStaked = DECIMAL_PRECISION; // When the Pool depletes to 0, so does each deposit + boldLossPerUnitStaked = DECIMAL_PRECISION; // When the Pool depletes to 0, so does each deposit lastBoldLossError_Offset = 0; } else { - uint boldLossNumerator = _debtToOffset * DECIMAL_PRECISION - lastBoldLossError_Offset; + uint256 boldLossNumerator = _debtToOffset * DECIMAL_PRECISION - lastBoldLossError_Offset; /* * Add 1 to make error in quotient positive. We want "slightly too much" Bold loss, * which ensures the error in any given compoundedBoldDeposit favors the Stability Pool. @@ -434,20 +426,20 @@ contract StabilityPool is LiquityBase, Ownable, CheckContract, IStabilityPool { } // Update the Stability Pool reward sum S and product P - function _updateRewardSumAndProduct(uint _ETHGainPerUnitStaked, uint _boldLossPerUnitStaked) internal { - uint currentP = P; - uint newP; + function _updateRewardSumAndProduct(uint256 _ETHGainPerUnitStaked, uint256 _boldLossPerUnitStaked) internal { + uint256 currentP = P; + uint256 newP; assert(_boldLossPerUnitStaked <= DECIMAL_PRECISION); /* * The newProductFactor is the factor by which to change all deposits, due to the depletion of Stability Pool Bold in the liquidation. * We make the product factor 0 if there was a pool-emptying. Otherwise, it is (1 - boldLossPerUnitStaked) */ - uint newProductFactor = uint(DECIMAL_PRECISION) - _boldLossPerUnitStaked; + uint256 newProductFactor = uint256(DECIMAL_PRECISION) - _boldLossPerUnitStaked; uint128 currentScaleCached = currentScale; uint128 currentEpochCached = currentEpoch; - uint currentS = epochToScaleToSum[currentEpochCached][currentScaleCached]; + uint256 currentS = epochToScaleToSum[currentEpochCached][currentScaleCached]; /* * Calculate the new S first, before we update P. @@ -456,8 +448,8 @@ contract StabilityPool is LiquityBase, Ownable, CheckContract, IStabilityPool { * * Since S corresponds to ETH gain, and P to deposit loss, we update S first. */ - uint marginalETHGain = _ETHGainPerUnitStaked * currentP; - uint newS = currentS + marginalETHGain; + uint256 marginalETHGain = _ETHGainPerUnitStaked * currentP; + uint256 newS = currentS + marginalETHGain; epochToScaleToSum[currentEpochCached][currentScaleCached] = newS; emit S_Updated(newS, currentEpochCached, currentScaleCached); @@ -469,7 +461,7 @@ contract StabilityPool is LiquityBase, Ownable, CheckContract, IStabilityPool { emit ScaleUpdated(currentScale); newP = DECIMAL_PRECISION; - // If multiplying P by a non-zero product factor would reduce P below the scale boundary, increment the scale + // If multiplying P by a non-zero product factor would reduce P below the scale boundary, increment the scale } else if (currentP * newProductFactor / DECIMAL_PRECISION < SCALE_FACTOR) { newP = currentP * newProductFactor * SCALE_FACTOR / DECIMAL_PRECISION; currentScale = currentScaleCached + 1; @@ -484,7 +476,7 @@ contract StabilityPool is LiquityBase, Ownable, CheckContract, IStabilityPool { emit P_Updated(newP); } - function _moveOffsetCollAndDebt(uint _collToAdd, uint _debtToOffset) internal { + function _moveOffsetCollAndDebt(uint256 _collToAdd, uint256 _debtToOffset) internal { IActivePool activePoolCached = activePool; // Cancel the liquidated Bold debt with the Bold in the stability pool @@ -499,8 +491,8 @@ contract StabilityPool is LiquityBase, Ownable, CheckContract, IStabilityPool { activePoolCached.sendETH(address(this), _collToAdd); } - function _decreaseBold(uint _amount) internal { - uint newTotalBoldDeposits = totalBoldDeposits - _amount; + function _decreaseBold(uint256 _amount) internal { + uint256 newTotalBoldDeposits = totalBoldDeposits - _amount; totalBoldDeposits = newTotalBoldDeposits; emit StabilityPoolBoldBalanceUpdated(newTotalBoldDeposits); } @@ -512,18 +504,22 @@ contract StabilityPool is LiquityBase, Ownable, CheckContract, IStabilityPool { * where S(0) and P(0) are the depositor's snapshots of the sum S and product P, respectively. * d0 is the last recorded deposit value. */ - function getDepositorETHGain(address _depositor) public view override returns (uint) { - uint initialDeposit = deposits[_depositor].initialValue; + function getDepositorETHGain(address _depositor) public view override returns (uint256) { + uint256 initialDeposit = deposits[_depositor].initialValue; - if (initialDeposit == 0) { return 0; } + if (initialDeposit == 0) return 0; Snapshots memory snapshots = depositSnapshots[_depositor]; - uint ETHGain = _getETHGainFromSnapshots(initialDeposit, snapshots); + uint256 ETHGain = _getETHGainFromSnapshots(initialDeposit, snapshots); return ETHGain; } - function _getETHGainFromSnapshots(uint initialDeposit, Snapshots memory snapshots) internal view returns (uint) { + function _getETHGainFromSnapshots(uint256 initialDeposit, Snapshots memory snapshots) + internal + view + returns (uint256) + { /* * Grab the sum 'S' from the epoch at which the stake was made. The ETH gain may span up to one scale change. * If it does, the second portion of the ETH gain is scaled by 1e9. @@ -531,13 +527,13 @@ contract StabilityPool is LiquityBase, Ownable, CheckContract, IStabilityPool { */ uint128 epochSnapshot = snapshots.epoch; uint128 scaleSnapshot = snapshots.scale; - uint S_Snapshot = snapshots.S; - uint P_Snapshot = snapshots.P; + uint256 S_Snapshot = snapshots.S; + uint256 P_Snapshot = snapshots.P; - uint firstPortion = epochToScaleToSum[epochSnapshot][scaleSnapshot] - S_Snapshot; - uint secondPortion = epochToScaleToSum[epochSnapshot][scaleSnapshot + 1] / SCALE_FACTOR; + uint256 firstPortion = epochToScaleToSum[epochSnapshot][scaleSnapshot] - S_Snapshot; + uint256 secondPortion = epochToScaleToSum[epochSnapshot][scaleSnapshot + 1] / SCALE_FACTOR; - uint ETHGain = initialDeposit * (firstPortion + secondPortion) / P_Snapshot / DECIMAL_PRECISION; + uint256 ETHGain = initialDeposit * (firstPortion + secondPortion) / P_Snapshot / DECIMAL_PRECISION; return ETHGain; } @@ -548,33 +544,30 @@ contract StabilityPool is LiquityBase, Ownable, CheckContract, IStabilityPool { * Return the user's compounded deposit. Given by the formula: d = d0 * P/P(0) * where P(0) is the depositor's snapshot of the product P, taken when they last updated their deposit. */ - function getCompoundedBoldDeposit(address _depositor) public view override returns (uint) { - uint initialDeposit = deposits[_depositor].initialValue; - if (initialDeposit == 0) { return 0; } + function getCompoundedBoldDeposit(address _depositor) public view override returns (uint256) { + uint256 initialDeposit = deposits[_depositor].initialValue; + if (initialDeposit == 0) return 0; Snapshots memory snapshots = depositSnapshots[_depositor]; - uint compoundedDeposit = _getCompoundedStakeFromSnapshots(initialDeposit, snapshots); + uint256 compoundedDeposit = _getCompoundedStakeFromSnapshots(initialDeposit, snapshots); return compoundedDeposit; } // Internal function, used to calculcate compounded deposits and compounded front end stakes. - function _getCompoundedStakeFromSnapshots( - uint initialStake, - Snapshots memory snapshots - ) + function _getCompoundedStakeFromSnapshots(uint256 initialStake, Snapshots memory snapshots) internal view - returns (uint) + returns (uint256) { - uint snapshot_P = snapshots.P; + uint256 snapshot_P = snapshots.P; uint128 scaleSnapshot = snapshots.scale; uint128 epochSnapshot = snapshots.epoch; // If stake was made before a pool-emptying event, then it has been fully cancelled with debt -- so, return 0 - if (epochSnapshot < currentEpoch) { return 0; } + if (epochSnapshot < currentEpoch) return 0; - uint compoundedStake; + uint256 compoundedStake; uint128 scaleDiff = currentScale - scaleSnapshot; /* Compute the compounded stake. If a scale change in P was made during the stake's lifetime, @@ -585,7 +578,8 @@ contract StabilityPool is LiquityBase, Ownable, CheckContract, IStabilityPool { compoundedStake = initialStake * P / snapshot_P; } else if (scaleDiff == 1) { compoundedStake = initialStake * P / snapshot_P / SCALE_FACTOR; - } else { // if scaleDiff >= 2 + } else { + // if scaleDiff >= 2 compoundedStake = 0; } @@ -598,7 +592,7 @@ contract StabilityPool is LiquityBase, Ownable, CheckContract, IStabilityPool { * * Thus it's unclear whether this line is still really needed. */ - if (compoundedStake < initialStake / 1e9) {return 0;} + if (compoundedStake < initialStake / 1e9) return 0; return compoundedStake; } @@ -606,15 +600,15 @@ contract StabilityPool is LiquityBase, Ownable, CheckContract, IStabilityPool { // --- Sender functions for Bold deposit and ETH gains --- // Transfer the Bold tokens from the user to the Stability Pool's address, and update its recorded Bold - function _sendBoldtoStabilityPool(address _address, uint _amount) internal { + function _sendBoldtoStabilityPool(address _address, uint256 _amount) internal { boldToken.sendToPool(_address, address(this), _amount); - uint newTotalBoldDeposits = totalBoldDeposits + _amount; + uint256 newTotalBoldDeposits = totalBoldDeposits + _amount; totalBoldDeposits = newTotalBoldDeposits; emit StabilityPoolBoldBalanceUpdated(newTotalBoldDeposits); } - function _sendETHGainToDepositor(uint _amount) internal { - if (_amount == 0) {return;} + function _sendETHGainToDepositor(uint256 _amount) internal { + if (_amount == 0) return; uint256 newETHBalance = ETHBalance - _amount; ETHBalance = newETHBalance; emit StabilityPoolETHBalanceUpdated(newETHBalance); @@ -636,8 +630,8 @@ contract StabilityPool is LiquityBase, Ownable, CheckContract, IStabilityPool { } // Send Bold to user and decrease Bold in Pool - function _sendBoldToDepositor(address _depositor, uint BoldWithdrawal) internal { - if (BoldWithdrawal == 0) {return;} + function _sendBoldToDepositor(address _depositor, uint256 BoldWithdrawal) internal { + if (BoldWithdrawal == 0) return; boldToken.returnFromPool(address(this), _depositor, BoldWithdrawal); _decreaseBold(BoldWithdrawal); @@ -645,7 +639,7 @@ contract StabilityPool is LiquityBase, Ownable, CheckContract, IStabilityPool { // --- Stability Pool Deposit Functionality --- - function _updateDepositAndSnapshots(address _depositor, uint _newValue) internal { + function _updateDepositAndSnapshots(address _depositor, uint256 _newValue) internal { deposits[_depositor].initialValue = _newValue; if (_newValue == 0) { @@ -655,10 +649,10 @@ contract StabilityPool is LiquityBase, Ownable, CheckContract, IStabilityPool { } uint128 currentScaleCached = currentScale; uint128 currentEpochCached = currentEpoch; - uint currentP = P; + uint256 currentP = P; // Get S for the current epoch and current scale - uint currentS = epochToScaleToSum[currentEpochCached][currentScaleCached]; + uint256 currentS = epochToScaleToSum[currentEpochCached][currentScaleCached]; // Record new snapshots of the latest running product P and sum S for the depositor depositSnapshots[_depositor].P = currentP; @@ -672,7 +666,7 @@ contract StabilityPool is LiquityBase, Ownable, CheckContract, IStabilityPool { // --- 'require' functions --- function _requireCallerIsActivePool() internal view { - require( msg.sender == address(activePool), "StabilityPool: Caller is not ActivePool"); + require(msg.sender == address(activePool), "StabilityPool: Caller is not ActivePool"); } function _requireCallerIsTroveManager() internal view { @@ -688,17 +682,17 @@ contract StabilityPool is LiquityBase, Ownable, CheckContract, IStabilityPool { } */ - function _requireUserHasDeposit(uint _initialDeposit) internal pure { - require(_initialDeposit > 0, 'StabilityPool: User must have a non-zero deposit'); + function _requireUserHasDeposit(uint256 _initialDeposit) internal pure { + require(_initialDeposit > 0, "StabilityPool: User must have a non-zero deposit"); } - function _requireUserHasNoDeposit(address _address) internal view { - uint initialDeposit = deposits[_address].initialValue; - require(initialDeposit == 0, 'StabilityPool: User must have no deposit'); + function _requireUserHasNoDeposit(address _address) internal view { + uint256 initialDeposit = deposits[_address].initialValue; + require(initialDeposit == 0, "StabilityPool: User must have no deposit"); } - function _requireNonZeroAmount(uint _amount) internal pure { - require(_amount > 0, 'StabilityPool: Amount must be non-zero'); + function _requireNonZeroAmount(uint256 _amount) internal pure { + require(_amount > 0, "StabilityPool: Amount must be non-zero"); } function _requireTroveIsActive(uint256 _troveId) internal view { @@ -706,11 +700,11 @@ contract StabilityPool is LiquityBase, Ownable, CheckContract, IStabilityPool { } function _requireUserHasETHGain(address _depositor) internal view { - uint ETHGain = getDepositorETHGain(_depositor); + uint256 ETHGain = getDepositorETHGain(_depositor); require(ETHGain > 0, "StabilityPool: caller must have non-zero ETH Gain"); } - function _requireValidKickbackRate(uint _kickbackRate) internal pure { - require (_kickbackRate <= DECIMAL_PRECISION, "StabilityPool: Kickback rate must be in range [0,1]"); + function _requireValidKickbackRate(uint256 _kickbackRate) internal pure { + require(_kickbackRate <= DECIMAL_PRECISION, "StabilityPool: Kickback rate must be in range [0,1]"); } } diff --git a/contracts/src/TroveManager.sol b/contracts/src/TroveManager.sol index c874ec58..192362a5 100644 --- a/contracts/src/TroveManager.sol +++ b/contracts/src/TroveManager.sol @@ -16,8 +16,8 @@ import "./Dependencies/CheckContract.sol"; // import "forge-std/console2.sol"; contract TroveManager is ERC721, LiquityBase, Ownable, CheckContract, ITroveManager { - string constant public NAME = "TroveManager"; // TODO - string constant public SYMBOL = "Lv2T"; // TODO + string public constant NAME = "TroveManager"; // TODO + string public constant SYMBOL = "Lv2T"; // TODO // --- Connected contract declarations --- @@ -36,30 +36,29 @@ contract TroveManager is ERC721, LiquityBase, Ownable, CheckContract, ITroveMana // --- Data structures --- - uint constant public SECONDS_IN_ONE_MINUTE = 60; - uint256 constant public SECONDS_IN_ONE_YEAR = 31536000; // 60 * 60 * 24 * 365, - uint256 constant public STALE_TROVE_DURATION = 7776000; // 90 days: 60*60*24*90 = 7776000 + uint256 public constant SECONDS_IN_ONE_MINUTE = 60; + uint256 public constant SECONDS_IN_ONE_YEAR = 31536000; // 60 * 60 * 24 * 365, + uint256 public constant STALE_TROVE_DURATION = 7776000; // 90 days: 60*60*24*90 = 7776000 /* * Half-life of 12h. 12h = 720 min * (1/2) = d^720 => d = (1/2)^(1/720) */ - uint constant public MINUTE_DECAY_FACTOR = 999037758833783000; - uint constant public REDEMPTION_FEE_FLOOR = DECIMAL_PRECISION / 1000 * 5; // 0.5% + uint256 public constant MINUTE_DECAY_FACTOR = 999037758833783000; + uint256 public constant REDEMPTION_FEE_FLOOR = DECIMAL_PRECISION / 1000 * 5; // 0.5% // To prevent redemptions unless Bold depegs below 0.95 and allow the system to take off - uint constant public INITIAL_REDEMPTION_RATE = DECIMAL_PRECISION / 100 * 5; // 5% - + uint256 public constant INITIAL_REDEMPTION_RATE = DECIMAL_PRECISION / 100 * 5; // 5% /* * BETA: 18 digit decimal. Parameter by which to divide the redeemed fraction, in order to calc the new base rate from a redemption. * Corresponds to (1 / ALPHA) in the white paper. */ - uint constant public BETA = 2; + uint256 public constant BETA = 2; - uint public baseRate; + uint256 public baseRate; // The timestamp of the latest fee operation (redemption or new Bold issuance) - uint public lastFeeOperationTime; + uint256 public lastFeeOperationTime; enum Status { nonExistent, @@ -71,17 +70,17 @@ contract TroveManager is ERC721, LiquityBase, Ownable, CheckContract, ITroveMana // Store the necessary data for a trove struct Trove { - uint debt; - uint coll; - uint stake; + uint256 debt; + uint256 coll; + uint256 stake; Status status; uint128 arrayIndex; uint64 lastDebtUpdateTime; - uint256 annualInterestRate; - // TODO: optimize this struct packing for gas reduction, which may break v1 tests that assume a certain order of properties + uint256 annualInterestRate; } + // TODO: optimize this struct packing for gas reduction, which may break v1 tests that assume a certain order of properties - mapping (uint256 => Trove) public Troves; + mapping(uint256 => Trove) public Troves; /* * Mapping from TroveId to granted address for operations that “give” money to the trove (add collateral, pay debt). * Useful for instance for cold/hot wallet setups. @@ -89,7 +88,7 @@ contract TroveManager is ERC721, LiquityBase, Ownable, CheckContract, ITroveMana * Otherwise, only the address in this mapping (and the trove owner) will be allowed. * To restrict this permission to no one, trove owner should be set in this mapping. */ - mapping (uint256 => address) public TroveAddManagers; + mapping(uint256 => address) public TroveAddManagers; /* * Mapping from TroveId to granted address for operations that “withdraw” money from the trove (withdraw collateral, borrow). * Useful for instance for cold/hot wallet setups. @@ -98,15 +97,15 @@ contract TroveManager is ERC721, LiquityBase, Ownable, CheckContract, ITroveMana * Therefore, by default this permission is restricted to no one. * Trove owner be set in this mapping is equivalent to zero address. */ - mapping (uint256 => address) public TroveRemoveManagers; + mapping(uint256 => address) public TroveRemoveManagers; - uint public totalStakes; + uint256 public totalStakes; // Snapshot of the value of totalStakes, taken immediately after the latest liquidation - uint public totalStakesSnapshot; + uint256 public totalStakesSnapshot; // Snapshot of the total collateral across the ActivePool and DefaultPool, immediately after the latest liquidation. - uint public totalCollateralSnapshot; + uint256 public totalCollateralSnapshot; /* * L_ETH and L_boldDebt track the sums of accumulated liquidation rewards per unit staked. During its lifetime, each stake earns: @@ -116,21 +115,24 @@ contract TroveManager is ERC721, LiquityBase, Ownable, CheckContract, ITroveMana * * Where L_ETH(0) and L_boldDebt(0) are snapshots of L_ETH and L_boldDebt for the active Trove taken at the instant the stake was made */ - uint public L_ETH; - uint public L_boldDebt; + uint256 public L_ETH; + uint256 public L_boldDebt; // Map addresses with active troves to their RewardSnapshot - mapping (uint256 => RewardSnapshot) public rewardSnapshots; + mapping(uint256 => RewardSnapshot) public rewardSnapshots; // Object containing the ETH and Bold snapshots for a given active trove - struct RewardSnapshot { uint ETH; uint boldDebt;} + struct RewardSnapshot { + uint256 ETH; + uint256 boldDebt; + } // Array of all active trove addresses - used to to compute an approximate hint off-chain, for the sorted list insertion uint256[] public TroveIds; // Error trackers for the trove redistribution calculation - uint public lastETHError_Redistribution; - uint public lastBoldDebtError_Redistribution; + uint256 public lastETHError_Redistribution; + uint256 public lastBoldDebtError_Redistribution; /* * --- Variable container structs for liquidations --- @@ -140,40 +142,40 @@ contract TroveManager is ERC721, LiquityBase, Ownable, CheckContract, ITroveMana **/ struct LocalVariables_OuterLiquidationFunction { - uint price; - uint boldInStabPool; + uint256 price; + uint256 boldInStabPool; bool recoveryModeAtStart; - uint liquidatedDebt; - uint liquidatedColl; + uint256 liquidatedDebt; + uint256 liquidatedColl; uint256 totalRecordedDebtPlusInterestInSequence; } struct LocalVariables_InnerSingleLiquidateFunction { - uint collToLiquidate; - uint pendingDebtReward; - uint pendingCollReward; + uint256 collToLiquidate; + uint256 pendingDebtReward; + uint256 pendingCollReward; } struct LocalVariables_LiquidationSequence { - uint remainingBoldInStabPool; - uint i; - uint ICR; + uint256 remainingBoldInStabPool; + uint256 i; + uint256 ICR; uint256 troveId; bool backToNormalMode; - uint entireSystemDebt; - uint entireSystemColl; + uint256 entireSystemDebt; + uint256 entireSystemColl; } struct LiquidationValues { - uint entireTroveDebt; - uint entireTroveColl; - uint collGasCompensation; - uint BoldGasCompensation; - uint debtToOffset; - uint collToSendToSP; - uint debtToRedistribute; - uint collToRedistribute; - uint collSurplus; + uint256 entireTroveDebt; + uint256 entireTroveColl; + uint256 collGasCompensation; + uint256 BoldGasCompensation; + uint256 debtToOffset; + uint256 collToSendToSP; + uint256 debtToRedistribute; + uint256 collToRedistribute; + uint256 collSurplus; uint256 accruedTroveInterest; uint256 weightedRecordedTroveDebt; uint256 recordedTroveDebt; @@ -181,19 +183,19 @@ contract TroveManager is ERC721, LiquityBase, Ownable, CheckContract, ITroveMana } struct LiquidationTotals { - uint totalCollInSequence; - uint totalDebtInSequence; + uint256 totalCollInSequence; + uint256 totalDebtInSequence; uint256 totalRecordedDebtInSequence; uint256 totalRedistDebtGainsInSequence; uint256 totalWeightedRecordedDebtInSequence; uint256 totalAccruedInterestInSequence; - uint totalCollGasCompensation; - uint totalBoldGasCompensation; - uint totalDebtToOffset; - uint totalCollToSendToSP; - uint totalDebtToRedistribute; - uint totalCollToRedistribute; - uint totalCollSurplus; + uint256 totalCollGasCompensation; + uint256 totalBoldGasCompensation; + uint256 totalDebtToOffset; + uint256 totalCollToSendToSP; + uint256 totalDebtToRedistribute; + uint256 totalCollToRedistribute; + uint256 totalCollSurplus; } struct ContractsCache { @@ -207,14 +209,14 @@ contract TroveManager is ERC721, LiquityBase, Ownable, CheckContract, ITroveMana // --- Variable container structs for redemptions --- struct RedemptionTotals { - uint remainingBold; - uint totalBoldToRedeem; - uint totalETHDrawn; - uint ETHFee; - uint ETHToSendToRedeemer; - uint decayedBaseRate; - uint price; - uint totalBoldSupplyAtStart; + uint256 remainingBold; + uint256 totalBoldToRedeem; + uint256 totalETHDrawn; + uint256 ETHFee; + uint256 ETHToSendToRedeemer; + uint256 decayedBaseRate; + uint256 price; + uint256 totalBoldSupplyAtStart; uint256 totalRedistDebtGains; uint256 totalNewRecordedTroveDebts; uint256 totalOldRecordedTroveDebts; @@ -222,10 +224,9 @@ contract TroveManager is ERC721, LiquityBase, Ownable, CheckContract, ITroveMana uint256 totalOldWeightedRecordedTroveDebts; } - struct SingleRedemptionValues { - uint BoldLot; - uint ETHLot; + uint256 BoldLot; + uint256 ETHLot; uint256 redistDebtGain; uint256 oldRecordedTroveDebt; uint256 newRecordedTroveDebt; @@ -245,17 +246,21 @@ contract TroveManager is ERC721, LiquityBase, Ownable, CheckContract, ITroveMana event CollSurplusPoolAddressChanged(address _collSurplusPoolAddress); event SortedTrovesAddressChanged(address _sortedTrovesAddress); - event Liquidation(uint _liquidatedDebt, uint _liquidatedColl, uint _collGasCompensation, uint _boldGasCompensation); - event Redemption(uint _attemptedBoldAmount, uint _actualBoldAmount, uint _ETHSent, uint _ETHFee); - event TroveUpdated(uint256 indexed _troveId, uint _debt, uint _coll, uint _stake, TroveManagerOperation _operation); - event TroveLiquidated(uint256 indexed _troveId, uint _debt, uint _coll, TroveManagerOperation _operation); - event BaseRateUpdated(uint _baseRate); - event LastFeeOpTimeUpdated(uint _lastFeeOpTime); - event TotalStakesUpdated(uint _newTotalStakes); - event SystemSnapshotsUpdated(uint _totalStakesSnapshot, uint _totalCollateralSnapshot); - event LTermsUpdated(uint _L_ETH, uint _L_boldDebt); - event TroveSnapshotsUpdated(uint _L_ETH, uint _L_boldDebt); - event TroveIndexUpdated(uint256 _troveId, uint _newIndex); + event Liquidation( + uint256 _liquidatedDebt, uint256 _liquidatedColl, uint256 _collGasCompensation, uint256 _boldGasCompensation + ); + event Redemption(uint256 _attemptedBoldAmount, uint256 _actualBoldAmount, uint256 _ETHSent, uint256 _ETHFee); + event TroveUpdated( + uint256 indexed _troveId, uint256 _debt, uint256 _coll, uint256 _stake, TroveManagerOperation _operation + ); + event TroveLiquidated(uint256 indexed _troveId, uint256 _debt, uint256 _coll, TroveManagerOperation _operation); + event BaseRateUpdated(uint256 _baseRate); + event LastFeeOpTimeUpdated(uint256 _lastFeeOpTime); + event TotalStakesUpdated(uint256 _newTotalStakes); + event SystemSnapshotsUpdated(uint256 _totalStakesSnapshot, uint256 _totalCollateralSnapshot); + event LTermsUpdated(uint256 _L_ETH, uint256 _L_boldDebt); + event TroveSnapshotsUpdated(uint256 _L_ETH, uint256 _L_boldDebt); + event TroveIndexUpdated(uint256 _troveId, uint256 _newIndex); enum TroveManagerOperation { getAndApplyRedistributionGains, @@ -283,11 +288,7 @@ contract TroveManager is ERC721, LiquityBase, Ownable, CheckContract, ITroveMana address _priceFeedAddress, address _boldTokenAddress, address _sortedTrovesAddress - ) - external - override - onlyOwner - { + ) external override onlyOwner { checkContract(_borrowerOperationsAddress); checkContract(_activePoolAddress); checkContract(_defaultPoolAddress); @@ -323,11 +324,11 @@ contract TroveManager is ERC721, LiquityBase, Ownable, CheckContract, ITroveMana // --- Getters --- - function getTroveIdsCount() external view override returns (uint) { + function getTroveIdsCount() external view override returns (uint256) { return TroveIds.length; } - function getTroveFromTroveIdsArray(uint _index) external view override returns (uint256) { + function getTroveFromTroveIdsArray(uint256 _index) external view override returns (uint256) { return TroveIds[_index]; } @@ -349,37 +350,45 @@ contract TroveManager is ERC721, LiquityBase, Ownable, CheckContract, ITroveMana IActivePool _activePool, IDefaultPool _defaultPool, uint256 _troveId, - uint _boldInStabPool - ) - internal - returns (LiquidationValues memory singleLiquidation) - { + uint256 _boldInStabPool + ) internal returns (LiquidationValues memory singleLiquidation) { LocalVariables_InnerSingleLiquidateFunction memory vars; - (singleLiquidation.entireTroveDebt, - singleLiquidation.entireTroveColl, - singleLiquidation.pendingDebtReward, - vars.pendingCollReward, - singleLiquidation.accruedTroveInterest) = getEntireDebtAndColl(_troveId); + ( + singleLiquidation.entireTroveDebt, + singleLiquidation.entireTroveColl, + singleLiquidation.pendingDebtReward, + vars.pendingCollReward, + singleLiquidation.accruedTroveInterest + ) = getEntireDebtAndColl(_troveId); singleLiquidation.weightedRecordedTroveDebt = getTroveWeightedRecordedDebt(_troveId); //TODO - GAS: We already read this inside getEntireDebtAndColl - so add it to the returned vals? - singleLiquidation.recordedTroveDebt = Troves[_troveId].debt; + singleLiquidation.recordedTroveDebt = Troves[_troveId].debt; - _movePendingTroveRewardsToActivePool(_activePool, _defaultPool, singleLiquidation.pendingDebtReward, vars.pendingCollReward); + _movePendingTroveRewardsToActivePool( + _activePool, _defaultPool, singleLiquidation.pendingDebtReward, vars.pendingCollReward + ); _removeStake(_troveId); singleLiquidation.collGasCompensation = _getCollGasCompensation(singleLiquidation.entireTroveColl); singleLiquidation.BoldGasCompensation = BOLD_GAS_COMPENSATION; - uint collToLiquidate = singleLiquidation.entireTroveColl - singleLiquidation.collGasCompensation; + uint256 collToLiquidate = singleLiquidation.entireTroveColl - singleLiquidation.collGasCompensation; - (singleLiquidation.debtToOffset, - singleLiquidation.collToSendToSP, - singleLiquidation.debtToRedistribute, - singleLiquidation.collToRedistribute) = _getOffsetAndRedistributionVals(singleLiquidation.entireTroveDebt, collToLiquidate, _boldInStabPool); + ( + singleLiquidation.debtToOffset, + singleLiquidation.collToSendToSP, + singleLiquidation.debtToRedistribute, + singleLiquidation.collToRedistribute + ) = _getOffsetAndRedistributionVals(singleLiquidation.entireTroveDebt, collToLiquidate, _boldInStabPool); _closeTrove(_troveId, Status.closedByLiquidation); - emit TroveLiquidated(_troveId, singleLiquidation.entireTroveDebt, singleLiquidation.entireTroveColl, TroveManagerOperation.liquidateInNormalMode); + emit TroveLiquidated( + _troveId, + singleLiquidation.entireTroveDebt, + singleLiquidation.entireTroveColl, + TroveManagerOperation.liquidateInNormalMode + ); emit TroveUpdated(_troveId, 0, 0, 0, TroveManagerOperation.liquidateInNormalMode); return singleLiquidation; } @@ -389,20 +398,19 @@ contract TroveManager is ERC721, LiquityBase, Ownable, CheckContract, ITroveMana IActivePool _activePool, IDefaultPool _defaultPool, uint256 _troveId, - uint _ICR, - uint _boldInStabPool, - uint _TCR, - uint _price - ) - internal - returns (LiquidationValues memory singleLiquidation) - { + uint256 _ICR, + uint256 _boldInStabPool, + uint256 _TCR, + uint256 _price + ) internal returns (LiquidationValues memory singleLiquidation) { LocalVariables_InnerSingleLiquidateFunction memory vars; - if (TroveIds.length <= 1) {return singleLiquidation;} // don't liquidate if last trove - (singleLiquidation.entireTroveDebt, - singleLiquidation.entireTroveColl, - singleLiquidation.pendingDebtReward, - vars.pendingCollReward, ) = getEntireDebtAndColl(_troveId); + if (TroveIds.length <= 1) return singleLiquidation; // don't liquidate if last trove + ( + singleLiquidation.entireTroveDebt, + singleLiquidation.entireTroveColl, + singleLiquidation.pendingDebtReward, + vars.pendingCollReward, + ) = getEntireDebtAndColl(_troveId); singleLiquidation.weightedRecordedTroveDebt = getTroveWeightedRecordedDebt(_troveId); @@ -415,7 +423,9 @@ contract TroveManager is ERC721, LiquityBase, Ownable, CheckContract, ITroveMana // If ICR <= 100%, purely redistribute the Trove across all active Troves if (_ICR <= _100pct) { - _movePendingTroveRewardsToActivePool(_activePool, _defaultPool, singleLiquidation.pendingDebtReward, vars.pendingCollReward); + _movePendingTroveRewardsToActivePool( + _activePool, _defaultPool, singleLiquidation.pendingDebtReward, vars.pendingCollReward + ); _removeStake(_troveId); singleLiquidation.debtToOffset = 0; @@ -424,30 +434,48 @@ contract TroveManager is ERC721, LiquityBase, Ownable, CheckContract, ITroveMana singleLiquidation.collToRedistribute = vars.collToLiquidate; _closeTrove(_troveId, Status.closedByLiquidation); - emit TroveLiquidated(_troveId, singleLiquidation.entireTroveDebt, singleLiquidation.entireTroveColl, TroveManagerOperation.liquidateInRecoveryMode); + emit TroveLiquidated( + _troveId, + singleLiquidation.entireTroveDebt, + singleLiquidation.entireTroveColl, + TroveManagerOperation.liquidateInRecoveryMode + ); emit TroveUpdated(_troveId, 0, 0, 0, TroveManagerOperation.liquidateInRecoveryMode); - // If 100% < ICR < MCR, offset as much as possible, and redistribute the remainder + // If 100% < ICR < MCR, offset as much as possible, and redistribute the remainder } else if ((_ICR > _100pct) && (_ICR < MCR)) { - _movePendingTroveRewardsToActivePool(_activePool, _defaultPool, singleLiquidation.pendingDebtReward, vars.pendingCollReward); + _movePendingTroveRewardsToActivePool( + _activePool, _defaultPool, singleLiquidation.pendingDebtReward, vars.pendingCollReward + ); _removeStake(_troveId); - (singleLiquidation.debtToOffset, - singleLiquidation.collToSendToSP, - singleLiquidation.debtToRedistribute, - singleLiquidation.collToRedistribute) = _getOffsetAndRedistributionVals(singleLiquidation.entireTroveDebt, vars.collToLiquidate, _boldInStabPool); + ( + singleLiquidation.debtToOffset, + singleLiquidation.collToSendToSP, + singleLiquidation.debtToRedistribute, + singleLiquidation.collToRedistribute + ) = _getOffsetAndRedistributionVals( + singleLiquidation.entireTroveDebt, vars.collToLiquidate, _boldInStabPool + ); _closeTrove(_troveId, Status.closedByLiquidation); - emit TroveLiquidated(_troveId, singleLiquidation.entireTroveDebt, singleLiquidation.entireTroveColl, TroveManagerOperation.liquidateInRecoveryMode); + emit TroveLiquidated( + _troveId, + singleLiquidation.entireTroveDebt, + singleLiquidation.entireTroveColl, + TroveManagerOperation.liquidateInRecoveryMode + ); emit TroveUpdated(_troveId, 0, 0, 0, TroveManagerOperation.liquidateInRecoveryMode); - /* + /* * If 110% <= ICR < current TCR (accounting for the preceding liquidations in the current sequence) * and there is Bold in the Stability Pool, only offset, with no redistribution, * but at a capped rate of 1.1 and only if the whole debt can be liquidated. * The remainder due to the capped rate will be claimable as collateral surplus. */ } else if ((_ICR >= MCR) && (_ICR < _TCR) && (singleLiquidation.entireTroveDebt <= _boldInStabPool)) { - _movePendingTroveRewardsToActivePool(_activePool, _defaultPool, singleLiquidation.pendingDebtReward, vars.pendingCollReward); + _movePendingTroveRewardsToActivePool( + _activePool, _defaultPool, singleLiquidation.pendingDebtReward, vars.pendingCollReward + ); assert(_boldInStabPool != 0); _removeStake(_troveId); @@ -464,10 +492,15 @@ contract TroveManager is ERC721, LiquityBase, Ownable, CheckContract, ITroveMana collSurplusPool.accountSurplus(_troveId, singleLiquidation.collSurplus); } - emit TroveLiquidated(_troveId, singleLiquidation.entireTroveDebt, singleLiquidation.collToSendToSP, TroveManagerOperation.liquidateInRecoveryMode); + emit TroveLiquidated( + _troveId, + singleLiquidation.entireTroveDebt, + singleLiquidation.collToSendToSP, + TroveManagerOperation.liquidateInRecoveryMode + ); emit TroveUpdated(_troveId, 0, 0, 0, TroveManagerOperation.liquidateInRecoveryMode); - - } else { // if (_ICR >= MCR && ( _ICR >= _TCR || singleLiquidation.entireTroveDebt > _boldInStabPool)) + } else { + // if (_ICR >= MCR && ( _ICR >= _TCR || singleLiquidation.entireTroveDebt > _boldInStabPool)) LiquidationValues memory zeroVals; return zeroVals; } @@ -477,18 +510,17 @@ contract TroveManager is ERC721, LiquityBase, Ownable, CheckContract, ITroveMana /* In a full liquidation, returns the values for a trove's coll and debt to be offset, and coll and debt to be * redistributed to active troves. */ - function _getOffsetAndRedistributionVals - ( - uint _entireTroveDebt, - uint _collToLiquidate, - uint _boldInStabPool + function _getOffsetAndRedistributionVals( + uint256 _entireTroveDebt, + uint256 _collToLiquidate, + uint256 _boldInStabPool ) internal pure - returns (uint debtToOffset, uint collToSendToSP, uint debtToRedistribute, uint collToRedistribute) + returns (uint256 debtToOffset, uint256 collToSendToSP, uint256 debtToRedistribute, uint256 collToRedistribute) { if (_boldInStabPool > 0) { - /* + /* * Offset as much debt & collateral as possible against the Stability Pool, and redistribute the remainder * between all active troves. * @@ -513,23 +545,18 @@ contract TroveManager is ERC721, LiquityBase, Ownable, CheckContract, ITroveMana /* * Get its offset coll/debt and ETH gas comp. */ - function _getCappedOffsetVals - ( - uint _entireTroveDebt, - uint _entireTroveColl, + function _getCappedOffsetVals( + uint256 _entireTroveDebt, + uint256 _entireTroveColl, uint256 _recordedTroveDebt, uint256 _weightedRecordedTroveDebt, - uint _price - ) - internal - pure - returns (LiquidationValues memory singleLiquidation) - { + uint256 _price + ) internal pure returns (LiquidationValues memory singleLiquidation) { singleLiquidation.entireTroveDebt = _entireTroveDebt; singleLiquidation.entireTroveColl = _entireTroveColl; singleLiquidation.recordedTroveDebt = _recordedTroveDebt; singleLiquidation.weightedRecordedTroveDebt = _weightedRecordedTroveDebt; - uint cappedCollPortion = _entireTroveDebt * MCR / _price; + uint256 cappedCollPortion = _entireTroveDebt * MCR / _price; singleLiquidation.collGasCompensation = _getCollGasCompensation(cappedCollPortion); singleLiquidation.BoldGasCompensation = BOLD_GAS_COMPENSATION; @@ -545,16 +572,12 @@ contract TroveManager is ERC721, LiquityBase, Ownable, CheckContract, ITroveMana * This function is used when the liquidateTroves sequence starts during Recovery Mode. However, it * handle the case where the system *leaves* Recovery Mode, part way through the liquidation sequence */ - function _getTotalsFromLiquidateTrovesSequence_RecoveryMode - ( + function _getTotalsFromLiquidateTrovesSequence_RecoveryMode( ContractsCache memory _contractsCache, - uint _price, - uint _boldInStabPool, - uint _n - ) - internal - returns(LiquidationTotals memory totals) - { + uint256 _price, + uint256 _boldInStabPool, + uint256 _n + ) internal returns (LiquidationTotals memory totals) { LocalVariables_LiquidationSequence memory vars; LiquidationValues memory singleLiquidation; @@ -573,50 +596,55 @@ contract TroveManager is ERC721, LiquityBase, Ownable, CheckContract, ITroveMana if (!vars.backToNormalMode) { // Break the loop if ICR is greater than MCR and Stability Pool is empty - if (vars.ICR >= MCR && vars.remainingBoldInStabPool == 0) { break; } + if (vars.ICR >= MCR && vars.remainingBoldInStabPool == 0) break; - uint TCR = LiquityMath._computeCR(vars.entireSystemColl, vars.entireSystemDebt, _price); + uint256 TCR = LiquityMath._computeCR(vars.entireSystemColl, vars.entireSystemDebt, _price); - singleLiquidation = _liquidateRecoveryMode(_contractsCache.activePool, _contractsCache.defaultPool, vars.troveId, vars.ICR, vars.remainingBoldInStabPool, TCR, _price); + singleLiquidation = _liquidateRecoveryMode( + _contractsCache.activePool, + _contractsCache.defaultPool, + vars.troveId, + vars.ICR, + vars.remainingBoldInStabPool, + TCR, + _price + ); // Update aggregate trackers vars.remainingBoldInStabPool = vars.remainingBoldInStabPool - singleLiquidation.debtToOffset; vars.entireSystemDebt = vars.entireSystemDebt - singleLiquidation.debtToOffset; - vars.entireSystemColl = vars.entireSystemColl - - singleLiquidation.collToSendToSP - - singleLiquidation.collGasCompensation - - singleLiquidation.collSurplus; + vars.entireSystemColl = vars.entireSystemColl - singleLiquidation.collToSendToSP + - singleLiquidation.collGasCompensation - singleLiquidation.collSurplus; // Add liquidation values to their respective running totals totals = _addLiquidationValuesToTotals(totals, singleLiquidation); - vars.backToNormalMode = !_checkPotentialRecoveryMode(vars.entireSystemColl, vars.entireSystemDebt, _price); - } - else if (vars.backToNormalMode && vars.ICR < MCR) { - singleLiquidation = _liquidateNormalMode(_contractsCache.activePool, _contractsCache.defaultPool, vars.troveId, vars.remainingBoldInStabPool); + vars.backToNormalMode = + !_checkPotentialRecoveryMode(vars.entireSystemColl, vars.entireSystemDebt, _price); + } else if (vars.backToNormalMode && vars.ICR < MCR) { + singleLiquidation = _liquidateNormalMode( + _contractsCache.activePool, _contractsCache.defaultPool, vars.troveId, vars.remainingBoldInStabPool + ); vars.remainingBoldInStabPool = vars.remainingBoldInStabPool - singleLiquidation.debtToOffset; // Add liquidation values to their respective running totals totals = _addLiquidationValuesToTotals(totals, singleLiquidation); - - } else break; // break if the loop reaches a Trove with ICR >= MCR + } else { + break; + } // break if the loop reaches a Trove with ICR >= MCR vars.troveId = nextUser; } } - function _getTotalsFromLiquidateTrovesSequence_NormalMode - ( + function _getTotalsFromLiquidateTrovesSequence_NormalMode( IActivePool _activePool, IDefaultPool _defaultPool, - uint _price, - uint _boldInStabPool, - uint _n - ) - internal - returns(LiquidationTotals memory totals) - { + uint256 _price, + uint256 _boldInStabPool, + uint256 _n + ) internal returns (LiquidationTotals memory totals) { LocalVariables_LiquidationSequence memory vars; LiquidationValues memory singleLiquidation; ISortedTroves sortedTrovesCached = sortedTroves; @@ -628,14 +656,16 @@ contract TroveManager is ERC721, LiquityBase, Ownable, CheckContract, ITroveMana vars.ICR = getCurrentICR(vars.troveId, _price); if (vars.ICR < MCR) { - singleLiquidation = _liquidateNormalMode(_activePool, _defaultPool, vars.troveId, vars.remainingBoldInStabPool); + singleLiquidation = + _liquidateNormalMode(_activePool, _defaultPool, vars.troveId, vars.remainingBoldInStabPool); vars.remainingBoldInStabPool = vars.remainingBoldInStabPool - singleLiquidation.debtToOffset; // Add liquidation values to their respective running totals totals = _addLiquidationValuesToTotals(totals, singleLiquidation); - - } else break; // break if the loop reaches a Trove with ICR >= MCR + } else { + break; + } // break if the loop reaches a Trove with ICR >= MCR } } @@ -645,7 +675,6 @@ contract TroveManager is ERC721, LiquityBase, Ownable, CheckContract, ITroveMana function batchLiquidateTroves(uint256[] memory _troveArray) public override { require(_troveArray.length != 0, "TroveManager: Calldata address array must not be empty"); - IActivePool activePoolCached = activePool; IDefaultPool defaultPoolCached = defaultPool; IStabilityPool stabilityPoolCached = stabilityPool; @@ -659,27 +688,35 @@ contract TroveManager is ERC721, LiquityBase, Ownable, CheckContract, ITroveMana // Perform the appropriate liquidation sequence - tally values and obtain their totals. if (vars.recoveryModeAtStart) { - totals = _getTotalFromBatchLiquidate_RecoveryMode(activePoolCached, defaultPoolCached, vars.price, vars.boldInStabPool, _troveArray); - } else { // if !vars.recoveryModeAtStart - totals = _getTotalsFromBatchLiquidate_NormalMode(activePoolCached, defaultPoolCached, vars.price, vars.boldInStabPool, _troveArray); + totals = _getTotalFromBatchLiquidate_RecoveryMode( + activePoolCached, defaultPoolCached, vars.price, vars.boldInStabPool, _troveArray + ); + } else { + // if !vars.recoveryModeAtStart + totals = _getTotalsFromBatchLiquidate_NormalMode( + activePoolCached, defaultPoolCached, vars.price, vars.boldInStabPool, _troveArray + ); } require(totals.totalDebtInSequence > 0, "TroveManager: nothing to liquidate"); - vars.totalRecordedDebtPlusInterestInSequence = totals.totalRecordedDebtInSequence + totals.totalAccruedInterestInSequence; + vars.totalRecordedDebtPlusInterestInSequence = + totals.totalRecordedDebtInSequence + totals.totalAccruedInterestInSequence; activePool.mintAggInterest( - 0, - vars.totalRecordedDebtPlusInterestInSequence, - 0, + 0, + vars.totalRecordedDebtPlusInterestInSequence, + 0, totals.totalRecordedDebtInSequence + totals.totalRedistDebtGainsInSequence, 0, - totals.totalWeightedRecordedDebtInSequence + totals.totalWeightedRecordedDebtInSequence ); // Move liquidated ETH and Bold to the appropriate pools stabilityPoolCached.offset(totals.totalDebtToOffset, totals.totalCollToSendToSP); - _redistributeDebtAndColl(activePoolCached, defaultPoolCached, totals.totalDebtToRedistribute, totals.totalCollToRedistribute); + _redistributeDebtAndColl( + activePoolCached, defaultPoolCached, totals.totalDebtToRedistribute, totals.totalCollToRedistribute + ); if (totals.totalCollSurplus > 0) { activePoolCached.sendETH(address(collSurplusPool), totals.totalCollSurplus); } @@ -689,27 +726,27 @@ contract TroveManager is ERC721, LiquityBase, Ownable, CheckContract, ITroveMana vars.liquidatedDebt = totals.totalDebtInSequence; vars.liquidatedColl = totals.totalCollInSequence - totals.totalCollGasCompensation - totals.totalCollSurplus; - emit Liquidation(vars.liquidatedDebt, vars.liquidatedColl, totals.totalCollGasCompensation, totals.totalBoldGasCompensation); + emit Liquidation( + vars.liquidatedDebt, vars.liquidatedColl, totals.totalCollGasCompensation, totals.totalBoldGasCompensation + ); // Send gas compensation to caller - _sendGasCompensation(activePoolCached, msg.sender, totals.totalBoldGasCompensation, totals.totalCollGasCompensation); + _sendGasCompensation( + activePoolCached, msg.sender, totals.totalBoldGasCompensation, totals.totalCollGasCompensation + ); } /* * This function is used when the batch liquidation sequence starts during Recovery Mode. However, it * handle the case where the system *leaves* Recovery Mode, part way through the liquidation sequence */ - function _getTotalFromBatchLiquidate_RecoveryMode - ( + function _getTotalFromBatchLiquidate_RecoveryMode( IActivePool _activePool, IDefaultPool _defaultPool, - uint _price, - uint _boldInStabPool, + uint256 _price, + uint256 _boldInStabPool, uint256[] memory _troveArray - ) - internal - returns(LiquidationTotals memory totals) - { + ) internal returns (LiquidationTotals memory totals) { LocalVariables_LiquidationSequence memory vars; LiquidationValues memory singleLiquidation; @@ -721,54 +758,50 @@ contract TroveManager is ERC721, LiquityBase, Ownable, CheckContract, ITroveMana for (vars.i = 0; vars.i < _troveArray.length; vars.i++) { vars.troveId = _troveArray[vars.i]; // Skip non-active troves - if (Troves[vars.troveId].status != Status.active) { continue; } + if (Troves[vars.troveId].status != Status.active) continue; vars.ICR = getCurrentICR(vars.troveId, _price); if (!vars.backToNormalMode) { - // Skip this trove if ICR is greater than MCR and Stability Pool is empty - if (vars.ICR >= MCR && vars.remainingBoldInStabPool == 0) { continue; } + if (vars.ICR >= MCR && vars.remainingBoldInStabPool == 0) continue; - uint TCR = LiquityMath._computeCR(vars.entireSystemColl, vars.entireSystemDebt, _price); + uint256 TCR = LiquityMath._computeCR(vars.entireSystemColl, vars.entireSystemDebt, _price); - singleLiquidation = _liquidateRecoveryMode(_activePool, _defaultPool, vars.troveId, vars.ICR, vars.remainingBoldInStabPool, TCR, _price); + singleLiquidation = _liquidateRecoveryMode( + _activePool, _defaultPool, vars.troveId, vars.ICR, vars.remainingBoldInStabPool, TCR, _price + ); // Update aggregate trackers vars.remainingBoldInStabPool = vars.remainingBoldInStabPool - singleLiquidation.debtToOffset; vars.entireSystemDebt = vars.entireSystemDebt - singleLiquidation.debtToOffset; - vars.entireSystemColl = vars.entireSystemColl - - singleLiquidation.collToSendToSP - - singleLiquidation.collGasCompensation - - singleLiquidation.collSurplus; + vars.entireSystemColl = vars.entireSystemColl - singleLiquidation.collToSendToSP + - singleLiquidation.collGasCompensation - singleLiquidation.collSurplus; // Add liquidation values to their respective running totals totals = _addLiquidationValuesToTotals(totals, singleLiquidation); - vars.backToNormalMode = !_checkPotentialRecoveryMode(vars.entireSystemColl, vars.entireSystemDebt, _price); - } - - else if (vars.backToNormalMode && vars.ICR < MCR) { - singleLiquidation = _liquidateNormalMode(_activePool, _defaultPool, vars.troveId, vars.remainingBoldInStabPool); + vars.backToNormalMode = + !_checkPotentialRecoveryMode(vars.entireSystemColl, vars.entireSystemDebt, _price); + } else if (vars.backToNormalMode && vars.ICR < MCR) { + singleLiquidation = + _liquidateNormalMode(_activePool, _defaultPool, vars.troveId, vars.remainingBoldInStabPool); vars.remainingBoldInStabPool = vars.remainingBoldInStabPool - singleLiquidation.debtToOffset; // Add liquidation values to their respective running totals totals = _addLiquidationValuesToTotals(totals, singleLiquidation); - - } else continue; // In Normal Mode skip troves with ICR >= MCR + } else { + continue; + } // In Normal Mode skip troves with ICR >= MCR } } - function _getTotalsFromBatchLiquidate_NormalMode - ( + function _getTotalsFromBatchLiquidate_NormalMode( IActivePool _activePool, IDefaultPool _defaultPool, - uint _price, - uint _boldInStabPool, + uint256 _price, + uint256 _boldInStabPool, uint256[] memory _troveArray - ) - internal - returns(LiquidationTotals memory totals) - { + ) internal returns (LiquidationTotals memory totals) { LocalVariables_LiquidationSequence memory vars; LiquidationValues memory singleLiquidation; @@ -779,7 +812,8 @@ contract TroveManager is ERC721, LiquityBase, Ownable, CheckContract, ITroveMana vars.ICR = getCurrentICR(vars.troveId, _price); if (vars.ICR < MCR) { - singleLiquidation = _liquidateNormalMode(_activePool, _defaultPool, vars.troveId, vars.remainingBoldInStabPool); + singleLiquidation = + _liquidateNormalMode(_activePool, _defaultPool, vars.troveId, vars.remainingBoldInStabPool); vars.remainingBoldInStabPool = vars.remainingBoldInStabPool - singleLiquidation.debtToOffset; // Add liquidation values to their respective running totals @@ -790,30 +824,33 @@ contract TroveManager is ERC721, LiquityBase, Ownable, CheckContract, ITroveMana // --- Liquidation helper functions --- - function _addLiquidationValuesToTotals(LiquidationTotals memory oldTotals, LiquidationValues memory singleLiquidation) - internal pure returns(LiquidationTotals memory newTotals) { - + function _addLiquidationValuesToTotals( + LiquidationTotals memory oldTotals, + LiquidationValues memory singleLiquidation + ) internal pure returns (LiquidationTotals memory newTotals) { // Tally all the values with their respective running totals newTotals.totalCollGasCompensation = oldTotals.totalCollGasCompensation + singleLiquidation.collGasCompensation; newTotals.totalBoldGasCompensation = oldTotals.totalBoldGasCompensation + singleLiquidation.BoldGasCompensation; newTotals.totalDebtInSequence = oldTotals.totalDebtInSequence + singleLiquidation.entireTroveDebt; newTotals.totalCollInSequence = oldTotals.totalCollInSequence + singleLiquidation.entireTroveColl; - newTotals.totalRecordedDebtInSequence = oldTotals.totalRecordedDebtInSequence + singleLiquidation.recordedTroveDebt; - newTotals.totalRedistDebtGainsInSequence = oldTotals.totalRedistDebtGainsInSequence + singleLiquidation.pendingDebtReward; - newTotals.totalWeightedRecordedDebtInSequence = oldTotals.totalWeightedRecordedDebtInSequence + singleLiquidation.weightedRecordedTroveDebt; - newTotals.totalAccruedInterestInSequence = oldTotals.totalAccruedInterestInSequence + singleLiquidation.accruedTroveInterest; + newTotals.totalRecordedDebtInSequence = + oldTotals.totalRecordedDebtInSequence + singleLiquidation.recordedTroveDebt; + newTotals.totalRedistDebtGainsInSequence = + oldTotals.totalRedistDebtGainsInSequence + singleLiquidation.pendingDebtReward; + newTotals.totalWeightedRecordedDebtInSequence = + oldTotals.totalWeightedRecordedDebtInSequence + singleLiquidation.weightedRecordedTroveDebt; + newTotals.totalAccruedInterestInSequence = + oldTotals.totalAccruedInterestInSequence + singleLiquidation.accruedTroveInterest; newTotals.totalDebtToOffset = oldTotals.totalDebtToOffset + singleLiquidation.debtToOffset; newTotals.totalCollToSendToSP = oldTotals.totalCollToSendToSP + singleLiquidation.collToSendToSP; newTotals.totalDebtToRedistribute = oldTotals.totalDebtToRedistribute + singleLiquidation.debtToRedistribute; newTotals.totalCollToRedistribute = oldTotals.totalCollToRedistribute + singleLiquidation.collToRedistribute; newTotals.totalCollSurplus = oldTotals.totalCollSurplus + singleLiquidation.collSurplus; - - return newTotals; } - function _sendGasCompensation(IActivePool _activePool, address _liquidator, uint _bold, uint _ETH) internal { + function _sendGasCompensation(IActivePool _activePool, address _liquidator, uint256 _bold, uint256 _ETH) internal { if (_bold > 0) { boldToken.returnFromPool(gasPoolAddress, _liquidator, _bold); } @@ -824,7 +861,12 @@ contract TroveManager is ERC721, LiquityBase, Ownable, CheckContract, ITroveMana } // Move a Trove's pending debt and collateral rewards from distributions, from the Default Pool to the Active Pool - function _movePendingTroveRewardsToActivePool(IActivePool _activePool, IDefaultPool _defaultPool, uint _bold, uint _ETH) internal { + function _movePendingTroveRewardsToActivePool( + IActivePool _activePool, + IDefaultPool _defaultPool, + uint256 _bold, + uint256 _ETH + ) internal { _defaultPool.decreaseBoldDebt(_bold); _activePool.increaseRecordedDebtSum(_bold); _defaultPool.sendETHToActivePool(_ETH); @@ -836,17 +878,16 @@ contract TroveManager is ERC721, LiquityBase, Ownable, CheckContract, ITroveMana function _redeemCollateralFromTrove( ContractsCache memory _contractsCache, uint256 _troveId, - uint _maxBoldamount, - uint _price - ) - internal returns (SingleRedemptionValues memory singleRedemption) - { + uint256 _maxBoldamount, + uint256 _price + ) internal returns (SingleRedemptionValues memory singleRedemption) { singleRedemption.oldWeightedRecordedTroveDebt = getTroveWeightedRecordedDebt(_troveId); singleRedemption.oldRecordedTroveDebt = Troves[_troveId].debt; - (, singleRedemption.redistDebtGain) = _getAndApplyRedistributionGains(_contractsCache.activePool, _contractsCache.defaultPool, _troveId); + (, singleRedemption.redistDebtGain) = + _getAndApplyRedistributionGains(_contractsCache.activePool, _contractsCache.defaultPool, _troveId); - // TODO: Gas. We apply accrued interest here, but could gas optimize this, since all-but-one Trove in the sequence will have their + // TODO: Gas. We apply accrued interest here, but could gas optimize this, since all-but-one Trove in the sequence will have their // debt zero'd by redemption. However, gas optimization for redemption is not as critical as for borrower & SP ops. uint256 entireTroveDebt = getTroveEntireDebt(_troveId); _updateTroveDebt(_troveId, entireTroveDebt); @@ -860,7 +901,7 @@ contract TroveManager is ERC721, LiquityBase, Ownable, CheckContract, ITroveMana // Decrease the debt and collateral of the current Trove according to the Bold lot and corresponding ETH to send singleRedemption.newRecordedTroveDebt = entireTroveDebt - singleRedemption.BoldLot; - uint newColl = Troves[_troveId].coll - singleRedemption.ETHLot; + uint256 newColl = Troves[_troveId].coll - singleRedemption.ETHLot; if (singleRedemption.newRecordedTroveDebt <= MIN_NET_DEBT) { // TODO: tag it as a zombie Trove and remove from Sorted List @@ -875,7 +916,8 @@ contract TroveManager is ERC721, LiquityBase, Ownable, CheckContract, ITroveMana emit TroveUpdated( _troveId, - singleRedemption.newRecordedTroveDebt, newColl, + singleRedemption.newRecordedTroveDebt, + newColl, Troves[_troveId].stake, TroveManagerOperation.redeemCollateral ); @@ -904,22 +946,12 @@ contract TroveManager is ERC721, LiquityBase, Ownable, CheckContract, ITroveMana * redemption will stop after the last completely redeemed Trove and the sender will keep the remaining Bold amount, which they can attempt * to redeem later. */ - function redeemCollateral( - uint _boldamount, - uint _maxIterations, - uint _maxFeePercentage - ) + function redeemCollateral(uint256 _boldamount, uint256 _maxIterations, uint256 _maxFeePercentage) external override { - ContractsCache memory contractsCache = ContractsCache( - activePool, - defaultPool, - boldToken, - sortedTroves, - collSurplusPool, - gasPoolAddress - ); + ContractsCache memory contractsCache = + ContractsCache(activePool, defaultPool, boldToken, sortedTroves, collSurplusPool, gasPoolAddress); RedemptionTotals memory totals; _requireValidMaxFeePercentage(_maxFeePercentage); @@ -938,7 +970,7 @@ contract TroveManager is ERC721, LiquityBase, Ownable, CheckContract, ITroveMana currentTroveId = contractsCache.sortedTroves.getLast(); // Loop through the Troves starting from the one with lowest collateral ratio until _amount of Bold is exchanged for collateral - if (_maxIterations == 0) { _maxIterations = type(uint256).max; } + if (_maxIterations == 0) _maxIterations = type(uint256).max; while (currentTroveId != 0 && totals.remainingBold > 0 && _maxIterations > 0) { _maxIterations--; // Save the uint256 of the Trove preceding the current one @@ -949,22 +981,22 @@ contract TroveManager is ERC721, LiquityBase, Ownable, CheckContract, ITroveMana continue; } - SingleRedemptionValues memory singleRedemption = _redeemCollateralFromTrove( - contractsCache, - currentTroveId, - totals.remainingBold, - totals.price - ); - - totals.totalBoldToRedeem = totals.totalBoldToRedeem + singleRedemption.BoldLot; - totals.totalRedistDebtGains = totals.totalRedistDebtGains + singleRedemption.redistDebtGain; + SingleRedemptionValues memory singleRedemption = + _redeemCollateralFromTrove(contractsCache, currentTroveId, totals.remainingBold, totals.price); + + totals.totalBoldToRedeem = totals.totalBoldToRedeem + singleRedemption.BoldLot; + totals.totalRedistDebtGains = totals.totalRedistDebtGains + singleRedemption.redistDebtGain; // For recorded and weighted recorded debt totals, we need to capture the increases and decreases, - // since the net debt change for a given Trove could be positive or negative: redemptions decrease a Trove's recorded - // (and weighted recorded) debt, but the accrued interest increases it. - totals.totalNewRecordedTroveDebts = totals.totalNewRecordedTroveDebts + singleRedemption.newRecordedTroveDebt; - totals.totalOldRecordedTroveDebts = totals.totalOldRecordedTroveDebts + singleRedemption.oldRecordedTroveDebt; - totals.totalNewWeightedRecordedTroveDebts = totals.totalNewWeightedRecordedTroveDebts + singleRedemption.newWeightedRecordedTroveDebt; - totals.totalOldWeightedRecordedTroveDebts = totals.totalOldWeightedRecordedTroveDebts + singleRedemption.oldWeightedRecordedTroveDebt; + // since the net debt change for a given Trove could be positive or negative: redemptions decrease a Trove's recorded + // (and weighted recorded) debt, but the accrued interest increases it. + totals.totalNewRecordedTroveDebts = + totals.totalNewRecordedTroveDebts + singleRedemption.newRecordedTroveDebt; + totals.totalOldRecordedTroveDebts = + totals.totalOldRecordedTroveDebts + singleRedemption.oldRecordedTroveDebt; + totals.totalNewWeightedRecordedTroveDebts = + totals.totalNewWeightedRecordedTroveDebts + singleRedemption.newWeightedRecordedTroveDebt; + totals.totalOldWeightedRecordedTroveDebts = + totals.totalOldWeightedRecordedTroveDebts + singleRedemption.oldWeightedRecordedTroveDebt; totals.totalETHDrawn = totals.totalETHDrawn + singleRedemption.ETHLot; totals.remainingBold = totals.remainingBold - singleRedemption.BoldLot; @@ -988,8 +1020,8 @@ contract TroveManager is ERC721, LiquityBase, Ownable, CheckContract, ITroveMana emit Redemption(_boldamount, totals.totalBoldToRedeem, totals.totalETHDrawn, totals.ETHFee); activePool.mintAggInterest( - totals.totalRedistDebtGains, - totals.totalBoldToRedeem, + totals.totalRedistDebtGains, + totals.totalBoldToRedeem, totals.totalNewRecordedTroveDebts, totals.totalOldRecordedTroveDebts, totals.totalNewWeightedRecordedTroveDebts, @@ -1004,21 +1036,21 @@ contract TroveManager is ERC721, LiquityBase, Ownable, CheckContract, ITroveMana // --- Helper functions --- // Return the current collateral ratio (ICR) of a given Trove. Takes a trove's pending coll and debt rewards from redistributions into account. - function getCurrentICR(uint256 _troveId, uint _price) public view override returns (uint) { - (uint currentETH, uint currentBoldDebt) = _getCurrentTroveAmounts(_troveId); + function getCurrentICR(uint256 _troveId, uint256 _price) public view override returns (uint256) { + (uint256 currentETH, uint256 currentBoldDebt) = _getCurrentTroveAmounts(_troveId); - uint ICR = LiquityMath._computeCR(currentETH, currentBoldDebt, _price); + uint256 ICR = LiquityMath._computeCR(currentETH, currentBoldDebt, _price); return ICR; } - function _getCurrentTroveAmounts(uint256 _troveId) internal view returns (uint, uint) { - uint pendingETHReward = getPendingETHReward(_troveId); - uint pendingBoldDebtReward = getPendingBoldDebtReward(_troveId); + function _getCurrentTroveAmounts(uint256 _troveId) internal view returns (uint256, uint256) { + uint256 pendingETHReward = getPendingETHReward(_troveId); + uint256 pendingBoldDebtReward = getPendingBoldDebtReward(_troveId); uint256 accruedTroveInterest = calcTroveAccruedInterest(_troveId); - uint currentETH = Troves[_troveId].coll + pendingETHReward; - uint currentBoldDebt = Troves[_troveId].debt + pendingBoldDebtReward + accruedTroveInterest; + uint256 currentETH = Troves[_troveId].coll + pendingETHReward; + uint256 currentBoldDebt = Troves[_troveId].debt + pendingBoldDebtReward + accruedTroveInterest; return (currentETH, currentBoldDebt); } @@ -1029,7 +1061,10 @@ contract TroveManager is ERC721, LiquityBase, Ownable, CheckContract, ITroveMana } // Add the borrowers's coll and debt rewards earned from redistributions, to their Trove - function _getAndApplyRedistributionGains(IActivePool _activePool, IDefaultPool _defaultPool, uint256 _troveId) internal returns (uint256, uint256) { + function _getAndApplyRedistributionGains(IActivePool _activePool, IDefaultPool _defaultPool, uint256 _troveId) + internal + returns (uint256, uint256) + { uint256 pendingETHReward; uint256 pendingBoldDebtReward; @@ -1068,29 +1103,29 @@ contract TroveManager is ERC721, LiquityBase, Ownable, CheckContract, ITroveMana } // Get the borrower's pending accumulated ETH reward, earned by their stake - function getPendingETHReward(uint256 _troveId) public view override returns (uint) { - uint snapshotETH = rewardSnapshots[_troveId].ETH; - uint rewardPerUnitStaked = L_ETH - snapshotETH; + function getPendingETHReward(uint256 _troveId) public view override returns (uint256) { + uint256 snapshotETH = rewardSnapshots[_troveId].ETH; + uint256 rewardPerUnitStaked = L_ETH - snapshotETH; - if ( rewardPerUnitStaked == 0 || Troves[_troveId].status != Status.active) { return 0; } + if (rewardPerUnitStaked == 0 || Troves[_troveId].status != Status.active) return 0; - uint stake = Troves[_troveId].stake; + uint256 stake = Troves[_troveId].stake; - uint pendingETHReward = stake * rewardPerUnitStaked / DECIMAL_PRECISION; + uint256 pendingETHReward = stake * rewardPerUnitStaked / DECIMAL_PRECISION; return pendingETHReward; } // Get the borrower's pending accumulated Bold reward, earned by their stake - function getPendingBoldDebtReward(uint256 _troveId) public view override returns (uint) { - uint snapshotBoldDebt = rewardSnapshots[_troveId].boldDebt; - uint rewardPerUnitStaked = L_boldDebt - snapshotBoldDebt; + function getPendingBoldDebtReward(uint256 _troveId) public view override returns (uint256) { + uint256 snapshotBoldDebt = rewardSnapshots[_troveId].boldDebt; + uint256 rewardPerUnitStaked = L_boldDebt - snapshotBoldDebt; - if ( rewardPerUnitStaked == 0 || Troves[_troveId].status != Status.active) { return 0; } + if (rewardPerUnitStaked == 0 || Troves[_troveId].status != Status.active) return 0; - uint stake = Troves[_troveId].stake; + uint256 stake = Troves[_troveId].stake; - uint pendingBoldDebtReward = stake * rewardPerUnitStaked / DECIMAL_PRECISION; + uint256 pendingBoldDebtReward = stake * rewardPerUnitStaked / DECIMAL_PRECISION; return pendingBoldDebtReward; } @@ -1101,19 +1136,23 @@ contract TroveManager is ERC721, LiquityBase, Ownable, CheckContract, ITroveMana * this indicates that rewards have occured since the snapshot was made, and the user therefore has * redistribution gains */ - if (Troves[_troveId].status != Status.active) {return false;} + if (Troves[_troveId].status != Status.active) return false; return (rewardSnapshots[_troveId].ETH < L_ETH); } // Return the Troves entire debt and coll, including redistribution gains from redistributions. - function getEntireDebtAndColl( - uint256 _troveId - ) + function getEntireDebtAndColl(uint256 _troveId) public view override - returns (uint entireDebt, uint entireColl, uint pendingBoldDebtReward, uint pendingETHReward, uint accruedTroveInterest) + returns ( + uint256 entireDebt, + uint256 entireColl, + uint256 pendingBoldDebtReward, + uint256 pendingETHReward, + uint256 accruedTroveInterest + ) { uint256 recordedDebt = Troves[_troveId].debt; uint256 recordedColl = Troves[_troveId].coll; @@ -1127,12 +1166,12 @@ contract TroveManager is ERC721, LiquityBase, Ownable, CheckContract, ITroveMana } function getTroveEntireDebt(uint256 _troveId) public view returns (uint256) { - (uint256 entireTroveDebt, , , , ) = getEntireDebtAndColl(_troveId); + (uint256 entireTroveDebt,,,,) = getEntireDebtAndColl(_troveId); return entireTroveDebt; } function getTroveEntireColl(uint256 _troveId) external view returns (uint256) { - ( , uint256 entireTroveColl, , , ) = getEntireDebtAndColl(_troveId); + (, uint256 entireTroveColl,,,) = getEntireDebtAndColl(_troveId); return entireTroveColl; } @@ -1143,21 +1182,21 @@ contract TroveManager is ERC721, LiquityBase, Ownable, CheckContract, ITroveMana // Remove borrower's stake from the totalStakes sum, and set their stake to 0 function _removeStake(uint256 _troveId) internal { - uint stake = Troves[_troveId].stake; + uint256 stake = Troves[_troveId].stake; totalStakes = totalStakes - stake; Troves[_troveId].stake = 0; } - function updateStakeAndTotalStakes(uint256 _troveId) external override returns (uint) { + function updateStakeAndTotalStakes(uint256 _troveId) external override returns (uint256) { _requireCallerIsBorrowerOperations(); return _updateStakeAndTotalStakes(_troveId); } // Update borrower's stake based on their latest collateral value // TODO: Gas: can we pass current coll as a param here and remove an SLOAD? - function _updateStakeAndTotalStakes(uint256 _troveId) internal returns (uint) { - uint newStake = _computeNewStake(Troves[_troveId].coll); - uint oldStake = Troves[_troveId].stake; + function _updateStakeAndTotalStakes(uint256 _troveId) internal returns (uint256) { + uint256 newStake = _computeNewStake(Troves[_troveId].coll); + uint256 oldStake = Troves[_troveId].stake; Troves[_troveId].stake = newStake; totalStakes = totalStakes - oldStake + newStake; @@ -1167,8 +1206,8 @@ contract TroveManager is ERC721, LiquityBase, Ownable, CheckContract, ITroveMana } // Calculate a new stake based on the snapshots of the totalStakes and totalCollateral taken at the last liquidation - function _computeNewStake(uint _coll) internal view returns (uint) { - uint stake; + function _computeNewStake(uint256 _coll) internal view returns (uint256) { + uint256 stake; if (totalCollateralSnapshot == 0) { stake = _coll; } else { @@ -1184,8 +1223,13 @@ contract TroveManager is ERC721, LiquityBase, Ownable, CheckContract, ITroveMana return stake; } - function _redistributeDebtAndColl(IActivePool _activePool, IDefaultPool _defaultPool, uint _debtToRedistribute, uint _collToRedistribute) internal { - if (_debtToRedistribute == 0) { return; } + function _redistributeDebtAndColl( + IActivePool _activePool, + IDefaultPool _defaultPool, + uint256 _debtToRedistribute, + uint256 _collToRedistribute + ) internal { + if (_debtToRedistribute == 0) return; /* * Add distributed coll and debt rewards-per-unit-staked to the running totals. Division uses a "feedback" @@ -1198,12 +1242,12 @@ contract TroveManager is ERC721, LiquityBase, Ownable, CheckContract, ITroveMana * 4) Store these errors for use in the next correction when this function is called. * 5) Note: static analysis tools complain about this "division before multiplication", however, it is intended. */ - uint ETHNumerator = _collToRedistribute * DECIMAL_PRECISION + lastETHError_Redistribution; - uint boldDebtNumerator = _debtToRedistribute * DECIMAL_PRECISION + lastBoldDebtError_Redistribution; + uint256 ETHNumerator = _collToRedistribute * DECIMAL_PRECISION + lastETHError_Redistribution; + uint256 boldDebtNumerator = _debtToRedistribute * DECIMAL_PRECISION + lastBoldDebtError_Redistribution; // Get the per-unit-staked terms - uint ETHRewardPerUnitStaked = ETHNumerator / totalStakes; - uint boldDebtRewardPerUnitStaked = boldDebtNumerator / totalStakes; + uint256 ETHRewardPerUnitStaked = ETHNumerator / totalStakes; + uint256 boldDebtRewardPerUnitStaked = boldDebtNumerator / totalStakes; lastETHError_Redistribution = ETHNumerator - ETHRewardPerUnitStaked * totalStakes; lastBoldDebtError_Redistribution = boldDebtNumerator - boldDebtRewardPerUnitStaked * totalStakes; @@ -1226,7 +1270,7 @@ contract TroveManager is ERC721, LiquityBase, Ownable, CheckContract, ITroveMana function _closeTrove(uint256 _troveId, Status closedStatus) internal { assert(closedStatus != Status.nonExistent && closedStatus != Status.active); - uint TroveIdsArrayLength = TroveIds.length; + uint256 TroveIdsArrayLength = TroveIds.length; _requireMoreThanOneTroveInSystem(TroveIdsArrayLength); // Zero Trove properties @@ -1257,18 +1301,18 @@ contract TroveManager is ERC721, LiquityBase, Ownable, CheckContract, ITroveMana * * The ETH as compensation must be excluded as it is always sent out at the very end of the liquidation sequence. */ - function _updateSystemSnapshots_excludeCollRemainder(IActivePool _activePool, uint _collRemainder) internal { + function _updateSystemSnapshots_excludeCollRemainder(IActivePool _activePool, uint256 _collRemainder) internal { totalStakesSnapshot = totalStakes; - uint activeColl = _activePool.getETHBalance(); - uint liquidatedColl = defaultPool.getETHBalance(); + uint256 activeColl = _activePool.getETHBalance(); + uint256 liquidatedColl = defaultPool.getETHBalance(); totalCollateralSnapshot = activeColl - _collRemainder + liquidatedColl; emit SystemSnapshotsUpdated(totalStakesSnapshot, totalCollateralSnapshot); } // Push the trove's id to the Trove list, and record the corresponding array index on the Trove struct - function addTroveIdToArray(uint256 _troveId) external override returns (uint) { + function addTroveIdToArray(uint256 _troveId) external override returns (uint256) { _requireCallerIsBorrowerOperations(); /* Max array size is 2**128 - 1, i.e. ~3e30 troves. No risk of overflow, since troves have minimum Bold @@ -1288,14 +1332,14 @@ contract TroveManager is ERC721, LiquityBase, Ownable, CheckContract, ITroveMana * Remove a Trove owner from the TroveIds array, not preserving array order. Removing owner 'B' does the following: * [A B C D E] => [A E C D], and updates E's Trove struct to point to its new array index. */ - function _removeTroveId(uint256 _troveId, uint TroveIdsArrayLength) internal { + function _removeTroveId(uint256 _troveId, uint256 TroveIdsArrayLength) internal { Status troveStatus = Troves[_troveId].status; // It’s set in caller function `_closeTrove` assert(troveStatus != Status.nonExistent && troveStatus != Status.active); uint128 index = Troves[_troveId].arrayIndex; - uint length = TroveIdsArrayLength; - uint idxLast = length - 1; + uint256 length = TroveIdsArrayLength; + uint256 idxLast = length - 1; assert(index <= idxLast); @@ -1310,25 +1354,21 @@ contract TroveManager is ERC721, LiquityBase, Ownable, CheckContract, ITroveMana // --- Recovery Mode and TCR functions --- - function getTCR(uint _price) external view override returns (uint) { + function getTCR(uint256 _price) external view override returns (uint256) { return _getTCR(_price); } - function checkRecoveryMode(uint _price) external view override returns (bool) { + function checkRecoveryMode(uint256 _price) external view override returns (bool) { return _checkRecoveryMode(_price); } // Check whether or not the system *would be* in Recovery Mode, given an ETH:USD price, and the entire system coll and debt. - function _checkPotentialRecoveryMode( - uint _entireSystemColl, - uint _entireSystemDebt, - uint _price - ) + function _checkPotentialRecoveryMode(uint256 _entireSystemColl, uint256 _entireSystemDebt, uint256 _price) internal pure - returns (bool) + returns (bool) { - uint TCR = LiquityMath._computeCR(_entireSystemColl, _entireSystemDebt, _price); + uint256 TCR = LiquityMath._computeCR(_entireSystemColl, _entireSystemDebt, _price); return TCR < CCR; } @@ -1341,14 +1381,17 @@ contract TroveManager is ERC721, LiquityBase, Ownable, CheckContract, ITroveMana * then, * 2) increases the baseRate based on the amount redeemed, as a proportion of total supply */ - function _updateBaseRateFromRedemption(uint _ETHDrawn, uint _price, uint _totalBoldSupply) internal returns (uint) { - uint decayedBaseRate = _calcDecayedBaseRate(); + function _updateBaseRateFromRedemption(uint256 _ETHDrawn, uint256 _price, uint256 _totalBoldSupply) + internal + returns (uint256) + { + uint256 decayedBaseRate = _calcDecayedBaseRate(); /* Convert the drawn ETH back to Bold at face value rate (1 Bold:1 USD), in order to get * the fraction of total supply that was redeemed at face value. */ - uint redeemedBoldFraction = _ETHDrawn * _price / _totalBoldSupply; + uint256 redeemedBoldFraction = _ETHDrawn * _price / _totalBoldSupply; - uint newBaseRate = decayedBaseRate + redeemedBoldFraction / BETA; + uint256 newBaseRate = decayedBaseRate + redeemedBoldFraction / BETA; newBaseRate = LiquityMath._min(newBaseRate, DECIMAL_PRECISION); // cap baseRate at a maximum of 100% //assert(newBaseRate <= DECIMAL_PRECISION); // This is already enforced in the line above assert(newBaseRate > 0); // Base rate is always non-zero after redemption @@ -1362,31 +1405,31 @@ contract TroveManager is ERC721, LiquityBase, Ownable, CheckContract, ITroveMana return newBaseRate; } - function getRedemptionRate() public view override returns (uint) { + function getRedemptionRate() public view override returns (uint256) { return _calcRedemptionRate(baseRate); } - function getRedemptionRateWithDecay() public view override returns (uint) { + function getRedemptionRateWithDecay() public view override returns (uint256) { return _calcRedemptionRate(_calcDecayedBaseRate()); } - function _calcRedemptionRate(uint _baseRate) internal pure returns (uint) { + function _calcRedemptionRate(uint256 _baseRate) internal pure returns (uint256) { return LiquityMath._min( REDEMPTION_FEE_FLOOR + _baseRate, DECIMAL_PRECISION // cap at a maximum of 100% ); } - function _getRedemptionFee(uint _ETHDrawn) internal view returns (uint) { + function _getRedemptionFee(uint256 _ETHDrawn) internal view returns (uint256) { return _calcRedemptionFee(getRedemptionRate(), _ETHDrawn); } - function getRedemptionFeeWithDecay(uint _ETHDrawn) external view override returns (uint) { + function getRedemptionFeeWithDecay(uint256 _ETHDrawn) external view override returns (uint256) { return _calcRedemptionFee(getRedemptionRateWithDecay(), _ETHDrawn); } - function _calcRedemptionFee(uint _redemptionRate, uint _ETHDrawn) internal pure returns (uint) { - uint redemptionFee = _redemptionRate * _ETHDrawn / DECIMAL_PRECISION; + function _calcRedemptionFee(uint256 _redemptionRate, uint256 _ETHDrawn) internal pure returns (uint256) { + uint256 redemptionFee = _redemptionRate * _ETHDrawn / DECIMAL_PRECISION; require(redemptionFee < _ETHDrawn, "TroveManager: Fee would eat up all returned collateral"); return redemptionFee; } @@ -1395,7 +1438,7 @@ contract TroveManager is ERC721, LiquityBase, Ownable, CheckContract, ITroveMana // Update the last fee operation time only if time passed >= decay interval. This prevents base rate griefing. function _updateLastFeeOpTime() internal { - uint timePassed = block.timestamp - lastFeeOperationTime; + uint256 timePassed = block.timestamp - lastFeeOperationTime; if (timePassed >= SECONDS_IN_ONE_MINUTE) { lastFeeOperationTime = block.timestamp; @@ -1403,14 +1446,14 @@ contract TroveManager is ERC721, LiquityBase, Ownable, CheckContract, ITroveMana } } - function _calcDecayedBaseRate() internal view returns (uint) { - uint minutesPassed = _minutesPassedSinceLastFeeOp(); - uint decayFactor = LiquityMath._decPow(MINUTE_DECAY_FACTOR, minutesPassed); + function _calcDecayedBaseRate() internal view returns (uint256) { + uint256 minutesPassed = _minutesPassedSinceLastFeeOp(); + uint256 decayFactor = LiquityMath._decPow(MINUTE_DECAY_FACTOR, minutesPassed); return baseRate * decayFactor / DECIMAL_PRECISION; } - function _minutesPassedSinceLastFeeOp() internal view returns (uint) { + function _minutesPassedSinceLastFeeOp() internal view returns (uint256) { return (block.timestamp - lastFeeOperationTime) / SECONDS_IN_ONE_MINUTE; } @@ -1441,52 +1484,62 @@ contract TroveManager is ERC721, LiquityBase, Ownable, CheckContract, ITroveMana assert(_sender != address(0)); // TODO: remove require( _sender == ownerOf(_troveId) || _sender == TroveAddManagers[_troveId], - "TroveManager: sender is not trove owner nor manager"); + "TroveManager: sender is not trove owner nor manager" + ); } function _requireIsOwnerOrRemoveManager(uint256 _troveId, address _sender) internal view { assert(_sender != address(0)); // TODO: remove require( _sender == ownerOf(_troveId) || _sender == TroveRemoveManagers[_troveId], - "TroveManager: sender is not trove owner nor manager"); + "TroveManager: sender is not trove owner nor manager" + ); } function _requireTroveIsActive(uint256 _troveId) internal view { require(checkTroveIsActive(_troveId), "TroveManager: Trove does not exist or is closed"); } - function _requireBoldBalanceCoversRedemption(IBoldToken _boldToken, address _redeemer, uint _amount) internal view { - require(_boldToken.balanceOf(_redeemer) >= _amount, "TroveManager: Requested redemption amount must be <= user's Bold token balance"); + function _requireBoldBalanceCoversRedemption(IBoldToken _boldToken, address _redeemer, uint256 _amount) + internal + view + { + require( + _boldToken.balanceOf(_redeemer) >= _amount, + "TroveManager: Requested redemption amount must be <= user's Bold token balance" + ); } - function _requireMoreThanOneTroveInSystem(uint TroveIdsArrayLength) internal view { - require (TroveIdsArrayLength > 1 && sortedTroves.getSize() > 1, "TroveManager: Only one trove in the system"); + function _requireMoreThanOneTroveInSystem(uint256 TroveIdsArrayLength) internal view { + require(TroveIdsArrayLength > 1 && sortedTroves.getSize() > 1, "TroveManager: Only one trove in the system"); } - function _requireAmountGreaterThanZero(uint _amount) internal pure { + function _requireAmountGreaterThanZero(uint256 _amount) internal pure { require(_amount > 0, "TroveManager: Amount must be greater than zero"); } - function _requireTCRoverMCR(uint _price) internal view { + function _requireTCRoverMCR(uint256 _price) internal view { require(_getTCR(_price) >= MCR, "TroveManager: Cannot redeem when TCR < MCR"); } - function _requireValidMaxFeePercentage(uint _maxFeePercentage) internal pure { - require(_maxFeePercentage >= REDEMPTION_FEE_FLOOR && _maxFeePercentage <= DECIMAL_PRECISION, - "Max fee percentage must be between 0.5% and 100%"); + function _requireValidMaxFeePercentage(uint256 _maxFeePercentage) internal pure { + require( + _maxFeePercentage >= REDEMPTION_FEE_FLOOR && _maxFeePercentage <= DECIMAL_PRECISION, + "Max fee percentage must be between 0.5% and 100%" + ); } // --- Trove property getters --- - function getTroveStatus(uint256 _troveId) external view override returns (uint) { - return uint(Troves[_troveId].status); + function getTroveStatus(uint256 _troveId) external view override returns (uint256) { + return uint256(Troves[_troveId].status); } - function getTroveStake(uint256 _troveId) external view override returns (uint) { + function getTroveStake(uint256 _troveId) external view override returns (uint256) { return Troves[_troveId].stake; } - function getTroveDebt(uint256 _troveId) external view override returns (uint) { + function getTroveDebt(uint256 _troveId) external view override returns (uint256) { return Troves[_troveId].debt; } @@ -1494,15 +1547,15 @@ contract TroveManager is ERC721, LiquityBase, Ownable, CheckContract, ITroveMana return Troves[_troveId].debt * Troves[_troveId].annualInterestRate; } - function getTroveColl(uint256 _troveId) external view override returns (uint) { + function getTroveColl(uint256 _troveId) external view override returns (uint256) { return Troves[_troveId].coll; } - function getTroveAnnualInterestRate(uint256 _troveId) external view returns (uint) { + function getTroveAnnualInterestRate(uint256 _troveId) external view returns (uint256) { return Troves[_troveId].annualInterestRate; } - function getTroveLastDebtUpdateTime(uint256 _troveId) external view returns (uint) { + function getTroveLastDebtUpdateTime(uint256 _troveId) external view returns (uint256) { return Troves[_troveId].lastDebtUpdateTime; } @@ -1518,10 +1571,7 @@ contract TroveManager is ERC721, LiquityBase, Ownable, CheckContract, ITroveMana uint256 _coll, uint256 _debt, uint256 _annualInterestRate - ) - external - returns (uint256) - { + ) external returns (uint256) { _requireCallerIsBorrowerOperations(); // TODO: optimize gas for writing to this struct Troves[_troveId].status = Status.active; @@ -1538,12 +1588,16 @@ contract TroveManager is ERC721, LiquityBase, Ownable, CheckContract, ITroveMana return _updateStakeAndTotalStakes(_troveId); } - function updateTroveDebtAndInterest(uint256 _troveId, uint256 _entireTroveDebt, uint256 _newAnnualInterestRate) external { + function updateTroveDebtAndInterest(uint256 _troveId, uint256 _entireTroveDebt, uint256 _newAnnualInterestRate) + external + { _requireCallerIsBorrowerOperations(); _updateTroveDebtAndInterest(_troveId, _entireTroveDebt, _newAnnualInterestRate); } - function _updateTroveDebtAndInterest(uint256 _troveId, uint256 _entireTroveDebt, uint256 _newAnnualInterestRate) internal { + function _updateTroveDebtAndInterest(uint256 _troveId, uint256 _entireTroveDebt, uint256 _newAnnualInterestRate) + internal + { _updateTroveDebt(_troveId, _entireTroveDebt); Troves[_troveId].annualInterestRate = _newAnnualInterestRate; } @@ -1553,7 +1607,9 @@ contract TroveManager is ERC721, LiquityBase, Ownable, CheckContract, ITroveMana _updateTroveDebt(_troveId, _entireTroveDebt); } - function updateTroveDebt(address _sender, uint256 _troveId, uint256 _entireTroveDebt, bool _isDebtIncrease) external { + function updateTroveDebt(address _sender, uint256 _troveId, uint256 _entireTroveDebt, bool _isDebtIncrease) + external + { _requireCallerIsBorrowerOperations(); if (_isDebtIncrease) { _requireIsOwnerOrRemoveManager(_troveId, _sender); @@ -1568,7 +1624,10 @@ contract TroveManager is ERC721, LiquityBase, Ownable, CheckContract, ITroveMana Troves[_troveId].lastDebtUpdateTime = uint64(block.timestamp); } - function updateTroveColl(address _sender, uint256 _troveId, uint256 _entireTroveColl, bool _isCollIncrease) external override { + function updateTroveColl(address _sender, uint256 _troveId, uint256 _entireTroveColl, bool _isCollIncrease) + external + override + { _requireCallerIsBorrowerOperations(); if (_isCollIncrease) { _requireIsOwnerOrAddManager(_troveId, _sender); diff --git a/contracts/src/Types/TroveId.sol b/contracts/src/Types/TroveId.sol index dbed2c1c..ee62061d 100644 --- a/contracts/src/Types/TroveId.sol +++ b/contracts/src/Types/TroveId.sol @@ -2,7 +2,7 @@ pragma solidity 0.8.18; -import { ROOT_NODE_ID } from "../SortedTroves.sol"; +import {ROOT_NODE_ID} from "../SortedTroves.sol"; type TroveId is uint256; diff --git a/contracts/src/test/TestContracts/Accounts.sol b/contracts/src/test/TestContracts/Accounts.sol index a63ccb3f..add9755e 100644 --- a/contracts/src/test/TestContracts/Accounts.sol +++ b/contracts/src/test/TestContracts/Accounts.sol @@ -16,7 +16,7 @@ contract Accounts { 0xaD55BABd2FdceD7aa85eB1FEf47C455DBB7a57a46a16aC9ACFFBE66d7Caf83Ee ]; - function getAccountsCount() external view returns (uint) { + function getAccountsCount() external view returns (uint256) { return accountsPks.length; } -} \ No newline at end of file +} diff --git a/contracts/src/test/TestContracts/BaseTest.sol b/contracts/src/test/TestContracts/BaseTest.sol index 6e8d9606..a99a98c8 100644 --- a/contracts/src/test/TestContracts/BaseTest.sol +++ b/contracts/src/test/TestContracts/BaseTest.sol @@ -111,10 +111,7 @@ contract BaseTest is Test { uint256 _coll, uint256 _boldAmount, uint256 _annualInterestRate - ) - public - returns (uint256) - { + ) public returns (uint256) { return openTroveNoHints100pctMaxFeeWithIndex(_account, 0, _coll, _boldAmount, _annualInterestRate); } @@ -124,17 +121,14 @@ contract BaseTest is Test { uint256 _coll, uint256 _boldAmount, uint256 _annualInterestRate - ) - public - returns (uint256) - { + ) public returns (uint256) { vm.startPrank(_account); - uint256 troveId = borrowerOperations.openTrove(_account, _index, 1e18, _coll, _boldAmount, 0, 0, _annualInterestRate); + uint256 troveId = + borrowerOperations.openTrove(_account, _index, 1e18, _coll, _boldAmount, 0, 0, _annualInterestRate); vm.stopPrank(); return troveId; } - // (uint _maxFeePercentage, uint _collWithdrawal, uint _boldChange, bool _isDebtIncrease) function adjustTrove100pctMaxFee( address _account, @@ -143,11 +137,9 @@ contract BaseTest is Test { uint256 _boldChange, bool _isCollIncrease, bool _isDebtIncrease - ) - public - { + ) public { vm.startPrank(_account); - borrowerOperations.adjustTrove(_troveId, 1e18, _collChange, _isCollIncrease, _boldChange, _isDebtIncrease); + borrowerOperations.adjustTrove(_troveId, 1e18, _collChange, _isCollIncrease, _boldChange, _isDebtIncrease); vm.stopPrank(); } @@ -237,12 +229,12 @@ contract BaseTest is Test { vm.stopPrank(); } - function redeem(address _from, uint256 _boldAmount) public { vm.startPrank(_from); troveManager.redeemCollateral(_boldAmount, MAX_UINT256, 1e18); vm.stopPrank(); } + function logContractAddresses() public view { console.log("ActivePool addr: ", address(activePool)); console.log("BorrowerOps addr: ", address(borrowerOperations)); diff --git a/contracts/src/test/TestContracts/BorrowerOperationsTester.sol b/contracts/src/test/TestContracts/BorrowerOperationsTester.sol index 39a5b164..4194af10 100644 --- a/contracts/src/test/TestContracts/BorrowerOperationsTester.sol +++ b/contracts/src/test/TestContracts/BorrowerOperationsTester.sol @@ -7,54 +7,40 @@ import "../../BorrowerOperations.sol"; /* Tester contract inherits from BorrowerOperations, and provides external functions for testing the parent's internal functions. */ contract BorrowerOperationsTester is BorrowerOperations { - constructor(address _ETHAddress) BorrowerOperations(_ETHAddress) {} - function getNewICRFromTroveChange - ( - uint _coll, - uint _debt, - uint _collChange, - bool isCollIncrease, - uint _debtChange, - bool isDebtIncrease, - uint _price - ) - external - pure - returns (uint) - { + function getNewICRFromTroveChange( + uint256 _coll, + uint256 _debt, + uint256 _collChange, + bool isCollIncrease, + uint256 _debtChange, + bool isDebtIncrease, + uint256 _price + ) external pure returns (uint256) { return _getNewICRFromTroveChange(_coll, _debt, _collChange, isCollIncrease, _debtChange, isDebtIncrease, _price); } - function getNewTCRFromTroveChange - ( - uint _collChange, - bool isCollIncrease, - uint _debtChange, - bool isDebtIncrease, - uint _price - ) - external - view - returns (uint) - { + function getNewTCRFromTroveChange( + uint256 _collChange, + bool isCollIncrease, + uint256 _debtChange, + bool isDebtIncrease, + uint256 _price + ) external view returns (uint256) { return _getNewTCRFromTroveChange(_collChange, isCollIncrease, _debtChange, isDebtIncrease, _price); } - function getUSDValue(uint _coll, uint _price) external pure returns (uint) { + function getUSDValue(uint256 _coll, uint256 _price) external pure returns (uint256) { return _getUSDValue(_coll, _price); } - function callInternalAdjustLoan - ( + function callInternalAdjustLoan( uint256 _troveId, - uint _collWithdrawal, - uint _debtChange, + uint256 _collWithdrawal, + uint256 _debtChange, bool _isDebtIncrease - ) - external - { + ) external { // TODO: Add coll increase _adjustTrove(msg.sender, _troveId, _collWithdrawal, false, _debtChange, _isDebtIncrease, 0); } diff --git a/contracts/src/test/TestContracts/CommunityIssuanceMock.sol b/contracts/src/test/TestContracts/CommunityIssuanceMock.sol index b8410d5f..f61fe881 100644 --- a/contracts/src/test/TestContracts/CommunityIssuanceMock.sol +++ b/contracts/src/test/TestContracts/CommunityIssuanceMock.sol @@ -5,7 +5,7 @@ pragma solidity 0.8.18; contract CommunityIssuanceMock { function setAddresses(address _lqtyTokenAddress, address _stabilityPoolAddress) external {} - function issueLQTY() external returns (uint) {} + function issueLQTY() external returns (uint256) {} - function sendLQTY(address _account, uint _LQTYamount) external {} + function sendLQTY(address _account, uint256 _LQTYamount) external {} } diff --git a/contracts/src/test/TestContracts/DevTestSetup.sol b/contracts/src/test/TestContracts/DevTestSetup.sol index 65ff8679..59c5f686 100644 --- a/contracts/src/test/TestContracts/DevTestSetup.sol +++ b/contracts/src/test/TestContracts/DevTestSetup.sol @@ -1,4 +1,3 @@ - // SPDX-License-Identifier: GPL-3.0 pragma solidity 0.8.18; @@ -6,7 +5,6 @@ import "./BaseTest.sol"; import "../../deployment.sol"; contract DevTestSetup is BaseTest { - IERC20 WETH; function giveAndApproveETH(address _account, uint256 _amount) public { @@ -32,8 +30,15 @@ contract DevTestSetup is BaseTest { accounts = new Accounts(); createAccounts(); - (A, B, C, D, E, F, G) = - (accountsList[0], accountsList[1], accountsList[2], accountsList[3], accountsList[4], accountsList[5], accountsList[6]); + (A, B, C, D, E, F, G) = ( + accountsList[0], + accountsList[1], + accountsList[2], + accountsList[3], + accountsList[4], + accountsList[5], + accountsList[6] + ); LiquityContracts memory contracts = _deployAndConnectContracts(); WETH = contracts.WETH; @@ -51,7 +56,8 @@ contract DevTestSetup is BaseTest { // Give some ETH to test accounts, and approve it to BorrowerOperations uint256 initialETHAmount = 10_000e18; - for(uint256 i = 0; i < 6; i++) { // A to F + for (uint256 i = 0; i < 6; i++) { + // A to F giveAndApproveETH(accountsList[i], initialETHAmount); } } @@ -65,9 +71,9 @@ contract DevTestSetup is BaseTest { uint256 price = 2000e18; priceFeed.setPrice(price); - uint256 ATroveId = openTroveNoHints100pctMaxFee(A, 5 ether, troveDebtRequest_A, interestRate); - uint256 BTroveId = openTroveNoHints100pctMaxFee(B, 5 ether, troveDebtRequest_B, interestRate); - uint256 CTroveId = openTroveNoHints100pctMaxFee(C, 5 ether, troveDebtRequest_C, interestRate); + uint256 ATroveId = openTroveNoHints100pctMaxFee(A, 5 ether, troveDebtRequest_A, interestRate); + uint256 BTroveId = openTroveNoHints100pctMaxFee(B, 5 ether, troveDebtRequest_B, interestRate); + uint256 CTroveId = openTroveNoHints100pctMaxFee(C, 5 ether, troveDebtRequest_C, interestRate); console.log(troveManager.getTCR(price), "TCR"); console.log(troveManager.getCurrentICR(CTroveId, price), "C CR"); @@ -105,10 +111,10 @@ contract DevTestSetup is BaseTest { uint256 price = 2000e18; priceFeed.setPrice(price); - uint256 ATroveId = openTroveNoHints100pctMaxFee(A, 5 ether, troveDebtRequest_A, interestRate); - uint256 BTroveId = openTroveNoHints100pctMaxFee(B, 5 ether, troveDebtRequest_B, interestRate); - uint256 CTroveId = openTroveNoHints100pctMaxFee(C, 25e17, troveDebtRequest_C, interestRate); - uint256 DTroveId = openTroveNoHints100pctMaxFee(D, 25e17, troveDebtRequest_D, interestRate); + uint256 ATroveId = openTroveNoHints100pctMaxFee(A, 5 ether, troveDebtRequest_A, interestRate); + uint256 BTroveId = openTroveNoHints100pctMaxFee(B, 5 ether, troveDebtRequest_B, interestRate); + uint256 CTroveId = openTroveNoHints100pctMaxFee(C, 25e17, troveDebtRequest_C, interestRate); + uint256 DTroveId = openTroveNoHints100pctMaxFee(D, 25e17, troveDebtRequest_D, interestRate); // console.log(troveManager.getTCR(price), "TCR"); // console.log(troveManager.getCurrentICR(CTroveId, price), "C CR"); @@ -138,12 +144,12 @@ contract DevTestSetup is BaseTest { uint256 price = 2000e18; priceFeed.setPrice(price); - uint256 ATroveId = openTroveNoHints100pctMaxFee(A, 5 ether, troveDebtRequest_A, interestRate); - uint256 BTroveId = openTroveNoHints100pctMaxFee(B, 5 ether, troveDebtRequest_B, interestRate); - uint256 CTroveId = openTroveNoHints100pctMaxFee(C, 25e17, troveDebtRequest_C, interestRate); - uint256 DTroveId = openTroveNoHints100pctMaxFee(D, 25e17, troveDebtRequest_D, interestRate); + uint256 ATroveId = openTroveNoHints100pctMaxFee(A, 5 ether, troveDebtRequest_A, interestRate); + uint256 BTroveId = openTroveNoHints100pctMaxFee(B, 5 ether, troveDebtRequest_B, interestRate); + uint256 CTroveId = openTroveNoHints100pctMaxFee(C, 25e17, troveDebtRequest_C, interestRate); + uint256 DTroveId = openTroveNoHints100pctMaxFee(D, 25e17, troveDebtRequest_D, interestRate); - // Price drops, C and D become liquidateable + // Price drops, C and D become liquidateable price = 1050e18; priceFeed.setPrice(price); @@ -166,10 +172,10 @@ contract DevTestSetup is BaseTest { uint256 coll = 20 ether; uint256 debtRequest = 20000e18; // Open in increasing order of interst rate - troveIDs.A = openTroveNoHints100pctMaxFee(A, coll, debtRequest, interestRate_A); - troveIDs.B = openTroveNoHints100pctMaxFee(B, coll, debtRequest, interestRate_B); - troveIDs.C = openTroveNoHints100pctMaxFee(C, coll, debtRequest, interestRate_C); - troveIDs.D = openTroveNoHints100pctMaxFee(D, coll, debtRequest, interestRate_D); + troveIDs.A = openTroveNoHints100pctMaxFee(A, coll, debtRequest, interestRate_A); + troveIDs.B = openTroveNoHints100pctMaxFee(B, coll, debtRequest, interestRate_B); + troveIDs.C = openTroveNoHints100pctMaxFee(C, coll, debtRequest, interestRate_C); + troveIDs.D = openTroveNoHints100pctMaxFee(D, coll, debtRequest, interestRate_D); // fast-forward to pass bootstrap phase vm.warp(block.timestamp + 14 days); diff --git a/contracts/src/test/TestContracts/ERC20MinterMock.sol b/contracts/src/test/TestContracts/ERC20MinterMock.sol index 82f19e3b..b104ef5d 100644 --- a/contracts/src/test/TestContracts/ERC20MinterMock.sol +++ b/contracts/src/test/TestContracts/ERC20MinterMock.sol @@ -2,7 +2,6 @@ pragma solidity ^0.8.18; import "openzeppelin-contracts/contracts/token/ERC20/presets/ERC20PresetMinterPauser.sol"; - contract ERC20MinterMock is ERC20PresetMinterPauser { constructor(string memory name, string memory symbol) ERC20PresetMinterPauser(name, symbol) {} } diff --git a/contracts/src/test/TestContracts/Interfaces/IPriceFeedMock.sol b/contracts/src/test/TestContracts/Interfaces/IPriceFeedMock.sol index b6467691..2213958f 100644 --- a/contracts/src/test/TestContracts/Interfaces/IPriceFeedMock.sol +++ b/contracts/src/test/TestContracts/Interfaces/IPriceFeedMock.sol @@ -2,7 +2,6 @@ pragma solidity ^0.8.18; import "../../../Interfaces/IPriceFeed.sol"; - interface IPriceFeedMock is IPriceFeed { function setPrice(uint256 _price) external; } diff --git a/contracts/src/test/TestContracts/LQTYStakingMock.sol b/contracts/src/test/TestContracts/LQTYStakingMock.sol index 32075dd3..220481c2 100644 --- a/contracts/src/test/TestContracts/LQTYStakingMock.sol +++ b/contracts/src/test/TestContracts/LQTYStakingMock.sol @@ -3,24 +3,23 @@ pragma solidity 0.8.18; contract LQTYStakingMock { - function setAddresses - ( + function setAddresses( address _lqtyTokenAddress, address _boldTokenAddress, - address _troveManagerAddress, + address _troveManagerAddress, address _borrowerOperationsAddress, address _activePoolAddress - ) external {} + ) external {} - function stake(uint _LQTYamount) external {} + function stake(uint256 _LQTYamount) external {} - function unstake(uint _LQTYamount) external {} + function unstake(uint256 _LQTYamount) external {} - function increaseF_ETH(uint _ETHFee) external {} + function increaseF_ETH(uint256 _ETHFee) external {} - function increaseF_bold(uint _LQTYFee) external {} + function increaseF_bold(uint256 _LQTYFee) external {} - function getPendingETHGain(address _user) external view returns (uint) {} + function getPendingETHGain(address _user) external view returns (uint256) {} - function getPendingBoldGain(address _user) external view returns (uint) {} + function getPendingBoldGain(address _user) external view returns (uint256) {} } diff --git a/contracts/src/test/TestContracts/LQTYTokenMock.sol b/contracts/src/test/TestContracts/LQTYTokenMock.sol index 29afdfa9..e35599f6 100644 --- a/contracts/src/test/TestContracts/LQTYTokenMock.sol +++ b/contracts/src/test/TestContracts/LQTYTokenMock.sol @@ -5,8 +5,7 @@ pragma solidity 0.8.18; //import "../../Dependencies/IERC20.sol"; //import "../../Dependencies/IERC2612.sol"; - -contract LQTYTokenMock /*is IERC20, IERC2612*/ { +contract LQTYTokenMock { /*is IERC20, IERC2612*/ function sendToLQTYStaking(address _sender, uint256 _amount) external {} function getDeploymentStartTime() external view returns (uint256) {} diff --git a/contracts/src/test/TestContracts/LiquityMathTester.sol b/contracts/src/test/TestContracts/LiquityMathTester.sol index 7d914ebc..c5ad4fff 100644 --- a/contracts/src/test/TestContracts/LiquityMathTester.sol +++ b/contracts/src/test/TestContracts/LiquityMathTester.sol @@ -7,18 +7,17 @@ import "../../Dependencies/LiquityMath.sol"; /* Tester contract for math functions in Math.sol library. */ contract LiquityMathTester { - - function callMax(uint _a, uint _b) external pure returns (uint) { + function callMax(uint256 _a, uint256 _b) external pure returns (uint256) { return LiquityMath._max(_a, _b); } // Non-view wrapper for gas test - function callDecPowTx(uint _base, uint _n) external pure returns (uint) { + function callDecPowTx(uint256 _base, uint256 _n) external pure returns (uint256) { return LiquityMath._decPow(_base, _n); } // External wrapper - function callDecPow(uint _base, uint _n) external pure returns (uint) { + function callDecPow(uint256 _base, uint256 _n) external pure returns (uint256) { return LiquityMath._decPow(_base, _n); } } diff --git a/contracts/src/test/TestContracts/NonPayableSwitch.sol b/contracts/src/test/TestContracts/NonPayableSwitch.sol index 5438bf20..0fcf491d 100644 --- a/contracts/src/test/TestContracts/NonPayableSwitch.sol +++ b/contracts/src/test/TestContracts/NonPayableSwitch.sol @@ -5,7 +5,6 @@ pragma solidity 0.8.18; import "openzeppelin-contracts/contracts/token/ERC20/utils/SafeERC20.sol"; // import "forge-std/console.sol"; - contract NonPayableSwitch { using SafeERC20 for IERC20; @@ -22,7 +21,7 @@ contract NonPayableSwitch { function forward(address _dest, bytes calldata _data) external payable { //console.logBytes(_data); - (bool success, bytes memory returnData) = _dest.call{ value: msg.value }(_data); + (bool success, bytes memory returnData) = _dest.call{value: msg.value}(_data); //console.log(msg.value, "msg.value"); //console.log(success, "success"); //console.logBytes(returnData); diff --git a/contracts/src/test/TestContracts/PriceFeedMock.sol b/contracts/src/test/TestContracts/PriceFeedMock.sol index 75a4327d..931042c8 100644 --- a/contracts/src/test/TestContracts/PriceFeedMock.sol +++ b/contracts/src/test/TestContracts/PriceFeedMock.sol @@ -3,7 +3,6 @@ pragma solidity 0.8.18; import "./Interfaces/IPriceFeedMock.sol"; import "../../PriceFeed.sol"; - contract PriceFeedMock is IPriceFeedMock { uint256 private PRICE; diff --git a/contracts/src/test/TestContracts/PriceFeedTestnet.sol b/contracts/src/test/TestContracts/PriceFeedTestnet.sol index 41c0c332..712cd953 100644 --- a/contracts/src/test/TestContracts/PriceFeedTestnet.sol +++ b/contracts/src/test/TestContracts/PriceFeedTestnet.sol @@ -9,7 +9,7 @@ import "./Interfaces/IPriceFeedTestnet.sol"; * variable. The contract does not connect to a live Chainlink price feed. */ contract PriceFeedTestnet is IPriceFeedTestnet { - event LastGoodPriceUpdated(uint _lastGoodPrice); + event LastGoodPriceUpdated(uint256 _lastGoodPrice); uint256 private _price = 200 * 1e18; diff --git a/contracts/src/test/TestContracts/SortedTrovesTester.sol b/contracts/src/test/TestContracts/SortedTrovesTester.sol index 9075d419..79e9f923 100644 --- a/contracts/src/test/TestContracts/SortedTrovesTester.sol +++ b/contracts/src/test/TestContracts/SortedTrovesTester.sol @@ -4,7 +4,6 @@ pragma solidity 0.8.18; import "../../Interfaces/ISortedTroves.sol"; - // Used as both a wrapper for SortedTroves functions and a mock TroveManager. contract SortedTrovesTester { ISortedTroves sortedTroves; @@ -27,7 +26,7 @@ contract SortedTrovesTester { } // --- Mock TroveManager functions --- - function getTroveAnnualInterestRate(uint256) external pure returns (uint) { + function getTroveAnnualInterestRate(uint256) external pure returns (uint256) { return 1; } diff --git a/contracts/src/test/TestContracts/TroveManagerTester.sol b/contracts/src/test/TestContracts/TroveManagerTester.sol index 0a85729a..f3f2dfb6 100644 --- a/contracts/src/test/TestContracts/TroveManagerTester.sol +++ b/contracts/src/test/TestContracts/TroveManagerTester.sol @@ -8,32 +8,31 @@ import "../../TroveManager.sol"; for testing the parent's internal functions. */ contract TroveManagerTester is TroveManager { - - function computeICR(uint _coll, uint _debt, uint _price) external pure returns (uint) { + function computeICR(uint256 _coll, uint256 _debt, uint256 _price) external pure returns (uint256) { return LiquityMath._computeCR(_coll, _debt, _price); } - function getCollGasCompensation(uint _coll) external pure returns (uint) { + function getCollGasCompensation(uint256 _coll) external pure returns (uint256) { return _getCollGasCompensation(_coll); } - function getBoldGasCompensation() external pure returns (uint) { + function getBoldGasCompensation() external pure returns (uint256) { return BOLD_GAS_COMPENSATION; } - function getCompositeDebt(uint _debt) external pure returns (uint) { + function getCompositeDebt(uint256 _debt) external pure returns (uint256) { return _getCompositeDebt(_debt); } - function unprotectedDecayBaseRateFromBorrowing() external returns (uint) { + function unprotectedDecayBaseRateFromBorrowing() external returns (uint256) { baseRate = _calcDecayedBaseRate(); assert(baseRate >= 0 && baseRate <= DECIMAL_PRECISION); - + _updateLastFeeOpTime(); return baseRate; } - function minutesPassedSinceLastFeeOp() external view returns (uint) { + function minutesPassedSinceLastFeeOp() external view returns (uint256) { return _minutesPassedSinceLastFeeOp(); } @@ -41,20 +40,20 @@ contract TroveManagerTester is TroveManager { lastFeeOperationTime = block.timestamp; } - function setBaseRate(uint _baseRate) external { + function setBaseRate(uint256 _baseRate) external { baseRate = _baseRate; } - function callGetRedemptionFee(uint _ETHDrawn) external view returns (uint) { + function callGetRedemptionFee(uint256 _ETHDrawn) external view returns (uint256) { return _getRedemptionFee(_ETHDrawn); - } + } - function getActualDebtFromComposite(uint _debtVal) external pure returns (uint) { + function getActualDebtFromComposite(uint256 _debtVal) external pure returns (uint256) { return _getNetDebt(_debtVal); } function callInternalRemoveTroveId(uint256 _troveId) external { - uint troveOwnersArrayLength = TroveIds.length; + uint256 troveOwnersArrayLength = TroveIds.length; _removeTroveId(_troveId, troveOwnersArrayLength); } } diff --git a/contracts/src/test/basicOps.t.sol b/contracts/src/test/basicOps.t.sol index e622e2a4..6ab5d309 100644 --- a/contracts/src/test/basicOps.t.sol +++ b/contracts/src/test/basicOps.t.sol @@ -3,7 +3,6 @@ pragma solidity 0.8.18; import "./TestContracts/DevTestSetup.sol"; contract BasicOps is DevTestSetup { - function testOpenTroveFailsWithoutAllowance() public { priceFeed.setPrice(2000e18); @@ -35,7 +34,7 @@ contract BasicOps is DevTestSetup { assertEq(trovesCount, 1); } - function testCloseTrove() public { + function testCloseTrove() public { priceFeed.setPrice(2000e18); vm.startPrank(A); borrowerOperations.openTrove(A, 0, 1e18, 2e18, 2000e18, 0, 0, 0); @@ -68,7 +67,7 @@ contract BasicOps is DevTestSetup { assertGt(coll_1, 0); // Adjust trove - borrowerOperations.adjustTrove(A_Id, 1e18, 1e18, true, 500e18, true); + borrowerOperations.adjustTrove(A_Id, 1e18, 1e18, true, 500e18, true); // Check coll and debt altered uint256 debt_2 = troveManager.getTroveDebt(A_Id); @@ -95,15 +94,11 @@ contract BasicOps is DevTestSetup { // B is now first in line to get redeemed, as they both have the same interest rate, // but B's Trove is younger. - uint256 redemptionAmount = 1000e18; // 1k BOLD + uint256 redemptionAmount = 1000e18; // 1k BOLD // A redeems 1k BOLD vm.startPrank(A); - troveManager.redeemCollateral( - redemptionAmount, - 10, - 1e18 - ); + troveManager.redeemCollateral(redemptionAmount, 10, 1e18); // Check B's coll and debt reduced uint256 debt_2 = troveManager.getTroveDebt(B_Id); @@ -121,7 +116,7 @@ contract BasicOps is DevTestSetup { vm.startPrank(B); borrowerOperations.openTrove(B, 0, 1e18, 10e18, 2000e18, 0, 0, 0); - // Price drops + // Price drops priceFeed.setPrice(1200e18); uint256 price = priceFeed.fetchPrice(); diff --git a/contracts/src/test/borrowerOperations.t.sol b/contracts/src/test/borrowerOperations.t.sol index 7725f94a..1cb6c3d9 100644 --- a/contracts/src/test/borrowerOperations.t.sol +++ b/contracts/src/test/borrowerOperations.t.sol @@ -2,7 +2,6 @@ pragma solidity ^0.8.18; import "./TestContracts/DevTestSetup.sol"; - contract BorrowerOperationsTest is DevTestSetup { // closeTrove(): reverts when trove is the only one in the system", async () => function testCloseLastTroveReverts() public { diff --git a/contracts/src/test/borrowerOperationsOnBehalfTroveManagament.sol b/contracts/src/test/borrowerOperationsOnBehalfTroveManagament.sol index 4ed14e15..ab493d25 100644 --- a/contracts/src/test/borrowerOperationsOnBehalfTroveManagament.sol +++ b/contracts/src/test/borrowerOperationsOnBehalfTroveManagament.sol @@ -2,7 +2,6 @@ pragma solidity ^0.8.18; import "./TestContracts/DevTestSetup.sol"; - contract BorrowerOperationsOnBehalfTroveManagamentTest is DevTestSetup { function testSetAddManager() public { uint256 ATroveId = openTroveNoHints100pctMaxFee(A, 100 ether, 10000e18, 1e17); diff --git a/contracts/src/test/deployment.t.sol b/contracts/src/test/deployment.t.sol index eaab545c..43910540 100644 --- a/contracts/src/test/deployment.t.sol +++ b/contracts/src/test/deployment.t.sol @@ -1,10 +1,8 @@ - pragma solidity 0.8.18; import "./TestContracts/DevTestSetup.sol"; contract Deployment is DevTestSetup { - function testContractsDeployed() public { assertNotEq(address(activePool), address(0)); assertNotEq(address(boldToken), address(0)); @@ -181,4 +179,4 @@ contract Deployment is DevTestSetup { address recordedDefaultPoolAddress = address(borrowerOperations.defaultPool()); assertEq(defaultPoolAddress, recordedDefaultPoolAddress); } -} \ No newline at end of file +} diff --git a/contracts/src/test/interestRateAggregate.t.sol b/contracts/src/test/interestRateAggregate.t.sol index 02937e3a..3393b0c6 100644 --- a/contracts/src/test/interestRateAggregate.t.sol +++ b/contracts/src/test/interestRateAggregate.t.sol @@ -3,7 +3,6 @@ pragma solidity 0.8.18; import "./TestContracts/DevTestSetup.sol"; contract InterestRateAggregate is DevTestSetup { - // --- Pending aggregate interest calculator --- function testCalcPendingAggInterestReturns0For0TimePassedSinceLastUpdate() public { @@ -11,11 +10,11 @@ contract InterestRateAggregate is DevTestSetup { assertEq(activePool.lastAggUpdateTime(), 0); assertEq(activePool.calcPendingAggInterest(), 0); - openTroveNoHints100pctMaxFee(A, 2 ether, 2000e18, 0); + openTroveNoHints100pctMaxFee(A, 2 ether, 2000e18, 0); assertEq(activePool.lastAggUpdateTime(), block.timestamp); assertEq(activePool.calcPendingAggInterest(), 0); - openTroveNoHints100pctMaxFee(B, 2 ether, 2000e18, 5e17); + openTroveNoHints100pctMaxFee(B, 2 ether, 2000e18, 5e17); assertEq(activePool.lastAggUpdateTime(), block.timestamp); assertEq(activePool.calcPendingAggInterest(), 0); } @@ -37,16 +36,16 @@ contract InterestRateAggregate is DevTestSetup { // calcPendingAggInterest returns 0 when all troves have 0 interest rate function testCalcPendingAggInterestReturns0WhenAllTrovesHave0InterestRate() public { priceFeed.setPrice(2000e18); - openTroveNoHints100pctMaxFee(A, 2 ether, 2000e18, 0); - openTroveNoHints100pctMaxFee(B, 2 ether, 2000e18, 0); + openTroveNoHints100pctMaxFee(A, 2 ether, 2000e18, 0); + openTroveNoHints100pctMaxFee(B, 2 ether, 2000e18, 0); assertEq(activePool.calcPendingAggInterest(), 0); - + vm.warp(block.timestamp + 1000); assertEq(activePool.calcPendingAggInterest(), 0); - openTroveNoHints100pctMaxFee(C, 2 ether, 2000e18, 0); + openTroveNoHints100pctMaxFee(C, 2 ether, 2000e18, 0); assertEq(activePool.calcPendingAggInterest(), 0); @@ -61,31 +60,31 @@ contract InterestRateAggregate is DevTestSetup { uint256 _duration = 1 days; uint256 troveDebtRequest = 2000e18; - uint256 ATroveId = openTroveNoHints100pctMaxFee(A, 2 ether, troveDebtRequest, 25e16); // 25% annual interest - uint256 BTroveId = openTroveNoHints100pctMaxFee(B, 2 ether, troveDebtRequest, 75e16); // 75% annual interest + uint256 ATroveId = openTroveNoHints100pctMaxFee(A, 2 ether, troveDebtRequest, 25e16); // 25% annual interest + uint256 BTroveId = openTroveNoHints100pctMaxFee(B, 2 ether, troveDebtRequest, 75e16); // 75% annual interest uint256 expectedTroveDebt = troveDebtRequest + troveManager.BOLD_GAS_COMPENSATION(); assertEq(troveManager.getTroveDebt(ATroveId), expectedTroveDebt); assertEq(troveManager.getTroveDebt(BTroveId), expectedTroveDebt); - + vm.warp(block.timestamp + _duration); - + // Expect weighted average of 2 * troveDebt debt at 50% interest uint256 expectedPendingAggInterest = expectedTroveDebt * 2 * 5e17 * _duration / SECONDS_IN_1_YEAR / 1e18; - + assertEq(expectedPendingAggInterest, activePool.calcPendingAggInterest()); } // --- calcTroveAccruedInterest // returns 0 for non-existent trove - function testCalcTroveAccruedInterestReturns0When0AggRecordedDebt() public { + function testCalcTroveAccruedInterestReturns0When0AggRecordedDebt() public { priceFeed.setPrice(2000e18); assertEq(troveManager.calcTroveAccruedInterest(addressToTroveId(A)), 0); - openTroveNoHints100pctMaxFee(A, 2 ether, 2000e18, 25e16); - uint256 BTroveId = openTroveNoHints100pctMaxFee(B, 2 ether, 2000e18, 75e16); + openTroveNoHints100pctMaxFee(A, 2 ether, 2000e18, 25e16); + uint256 BTroveId = openTroveNoHints100pctMaxFee(B, 2 ether, 2000e18, 75e16); vm.warp(block.timestamp + 1 days); @@ -101,23 +100,23 @@ contract InterestRateAggregate is DevTestSetup { function testCalcTroveAccruedInterestReturns0For0TimePassed() public { priceFeed.setPrice(2000e18); - uint256 ATroveId = openTroveNoHints100pctMaxFee(A, 2 ether, 2000e18, 25e16); + uint256 ATroveId = openTroveNoHints100pctMaxFee(A, 2 ether, 2000e18, 25e16); assertEq(troveManager.calcTroveAccruedInterest(ATroveId), 0); - vm.warp(block.timestamp + 1 days); + vm.warp(block.timestamp + 1 days); - uint256 BTroveId = openTroveNoHints100pctMaxFee(B, 2 ether, 2000e18, 75e16); + uint256 BTroveId = openTroveNoHints100pctMaxFee(B, 2 ether, 2000e18, 75e16); assertEq(troveManager.calcTroveAccruedInterest(BTroveId), 0); } function testCalcTroveAccruedInterestReturns0For0InterestRate() public { priceFeed.setPrice(2000e18); - uint256 ATroveId = openTroveNoHints100pctMaxFee(A, 2 ether, 2000e18, 0); + uint256 ATroveId = openTroveNoHints100pctMaxFee(A, 2 ether, 2000e18, 0); assertEq(troveManager.calcTroveAccruedInterest(ATroveId), 0); - vm.warp(block.timestamp + 1 days); + vm.warp(block.timestamp + 1 days); assertEq(troveManager.calcTroveAccruedInterest(ATroveId), 0); } @@ -133,22 +132,22 @@ contract InterestRateAggregate is DevTestSetup { uint256 duration = 42 days; - uint256 ATroveId = openTroveNoHints100pctMaxFee(A, 2 ether, debtRequest_A, annualRate_A); + uint256 ATroveId = openTroveNoHints100pctMaxFee(A, 2 ether, debtRequest_A, annualRate_A); uint256 debt_A = troveManager.getTroveDebt(ATroveId); assertGt(debt_A, 0); assertEq(troveManager.calcTroveAccruedInterest(ATroveId), 0); - vm.warp(block.timestamp + duration); + vm.warp(block.timestamp + duration); uint256 expectedInterest_A = annualRate_A * debt_A * duration / 1e18 / SECONDS_IN_1_YEAR; assertEq(troveManager.calcTroveAccruedInterest(ATroveId), expectedInterest_A); - - uint256 BTroveId = openTroveNoHints100pctMaxFee(B, 2 ether, debtRequest_B, annualRate_B); + + uint256 BTroveId = openTroveNoHints100pctMaxFee(B, 2 ether, debtRequest_B, annualRate_B); uint256 debt_B = troveManager.getTroveDebt(BTroveId); assertGt(debt_B, 0); assertEq(troveManager.calcTroveAccruedInterest(BTroveId), 0); - vm.warp(block.timestamp + duration); + vm.warp(block.timestamp + duration); uint256 expectedInterest_B = annualRate_B * debt_B * duration / 1e18 / SECONDS_IN_1_YEAR; assertEq(troveManager.calcTroveAccruedInterest(BTroveId), expectedInterest_B); @@ -157,32 +156,32 @@ contract InterestRateAggregate is DevTestSetup { // --- mintAggInterest --- function testMintAggInterestRevertsWhenNotCalledByBOorTM() public { - // pass positive debt change + // pass positive debt change uint256 debtChange = 37e18; vm.startPrank(A); vm.expectRevert(); activePool.mintAggInterest(debtChange, 0, 0, 0, 0, 0); vm.stopPrank(); - vm.startPrank(address(borrowerOperations)); + vm.startPrank(address(borrowerOperations)); activePool.mintAggInterest(debtChange, 0, 0, 0, 0, 0); vm.stopPrank(); - vm.startPrank(address(troveManager)); + vm.startPrank(address(troveManager)); activePool.mintAggInterest(debtChange, 0, 0, 0, 0, 0); vm.stopPrank(); - + // pass negative debt change vm.startPrank(A); vm.expectRevert(); activePool.mintAggInterest(0, debtChange, 0, 0, 0, 0); vm.stopPrank(); - vm.startPrank(address(borrowerOperations)); + vm.startPrank(address(borrowerOperations)); activePool.mintAggInterest(0, debtChange, 0, 0, 0, 0); vm.stopPrank(); - vm.startPrank(address(troveManager)); + vm.startPrank(address(troveManager)); activePool.mintAggInterest(0, debtChange, 0, 0, 0, 0); vm.stopPrank(); @@ -192,11 +191,11 @@ contract InterestRateAggregate is DevTestSetup { activePool.mintAggInterest(0, 0, 0, 0, 0, 0); vm.stopPrank(); - vm.startPrank(address(borrowerOperations)); + vm.startPrank(address(borrowerOperations)); activePool.mintAggInterest(0, 0, 0, 0, 0, 0); vm.stopPrank(); - vm.startPrank(address(troveManager)); + vm.startPrank(address(troveManager)); activePool.mintAggInterest(0, 0, 0, 0, 0, 0); vm.stopPrank(); } @@ -207,9 +206,9 @@ contract InterestRateAggregate is DevTestSetup { function testOpenTroveIncreasesRecordedAggDebtByAggPendingInterestPlusTroveDebt() public { priceFeed.setPrice(2000e18); assertEq(activePool.aggRecordedDebt(), 0); - + uint256 troveDebtRequest = 2000e18; - openTroveNoHints100pctMaxFee(A, 2 ether, troveDebtRequest, 25e16); // 25% annual interest + openTroveNoHints100pctMaxFee(A, 2 ether, troveDebtRequest, 25e16); // 25% annual interest // Check aggregate recorded debt increased to non-zero uint256 aggREcordedDebt_1 = activePool.aggRecordedDebt(); @@ -223,19 +222,19 @@ contract InterestRateAggregate is DevTestSetup { assertGt(pendingInterest, 0); uint256 expectedTroveDebt_B = troveDebtRequest + troveManager.BOLD_GAS_COMPENSATION(); - uint256 BTroveId = openTroveNoHints100pctMaxFee(B, 2 ether, troveDebtRequest, 25e16); + uint256 BTroveId = openTroveNoHints100pctMaxFee(B, 2 ether, troveDebtRequest, 25e16); assertEq(troveManager.getTroveDebt(BTroveId), expectedTroveDebt_B); - // check that opening Trove B increased the agg. recorded debt by the pending agg. interest plus Trove B's debt + // check that opening Trove B increased the agg. recorded debt by the pending agg. interest plus Trove B's debt assertEq(activePool.aggRecordedDebt(), aggREcordedDebt_1 + pendingInterest + expectedTroveDebt_B); } function testOpenTroveIncreasesRecordedDebtSumByTroveDebt() public { priceFeed.setPrice(2000e18); assertEq(activePool.aggRecordedDebt(), 0); - + uint256 troveDebtRequest = 2000e18; - uint256 ATroveId = openTroveNoHints100pctMaxFee(A, 2 ether, troveDebtRequest, 25e16); // 25% annual interest + uint256 ATroveId = openTroveNoHints100pctMaxFee(A, 2 ether, troveDebtRequest, 25e16); // 25% annual interest // fast-forward time vm.warp(block.timestamp + 1 days); @@ -243,7 +242,7 @@ contract InterestRateAggregate is DevTestSetup { uint256 recordedDebt_1 = activePool.getRecordedDebtSum(); assertGt(recordedDebt_1, 0); - openTroveNoHints100pctMaxFee(B, 2 ether, troveDebtRequest, 25e16); + openTroveNoHints100pctMaxFee(B, 2 ether, troveDebtRequest, 25e16); uint256 troveDebt_A = troveManager.getTroveDebt(ATroveId); assertGt(troveDebt_A, 0); @@ -252,9 +251,9 @@ contract InterestRateAggregate is DevTestSetup { function testOpenTroveReducesPendingAggInterestTo0() public { priceFeed.setPrice(2000e18); - + uint256 troveDebtRequest = 2000e18; - openTroveNoHints100pctMaxFee(A, 2 ether, troveDebtRequest, 25e16); // 25% annual interest + openTroveNoHints100pctMaxFee(A, 2 ether, troveDebtRequest, 25e16); // 25% annual interest // fast-forward time vm.warp(block.timestamp + 1 days); @@ -262,24 +261,24 @@ contract InterestRateAggregate is DevTestSetup { // check there's pending agg. interest assertGt(activePool.calcPendingAggInterest(), 0); - openTroveNoHints100pctMaxFee(B, 2 ether, troveDebtRequest, 25e16); + openTroveNoHints100pctMaxFee(B, 2 ether, troveDebtRequest, 25e16); // Check pending agg. interest reduced to 0 assertEq(activePool.calcPendingAggInterest(), 0); } - + function testOpenTroveUpdatesTheLastAggUpdateTime() public { priceFeed.setPrice(2000e18); assertEq(activePool.lastAggUpdateTime(), 0); vm.warp(block.timestamp + 1 days); - openTroveNoHints100pctMaxFee(A, 2 ether, 2000e18, 25e16); // 25% annual interest - + openTroveNoHints100pctMaxFee(A, 2 ether, 2000e18, 25e16); // 25% annual interest + assertEq(activePool.lastAggUpdateTime(), block.timestamp); vm.warp(block.timestamp + 1 days); - openTroveNoHints100pctMaxFee(B, 2 ether, 2000e18, 25e16); // 25% annual interest + openTroveNoHints100pctMaxFee(B, 2 ether, 2000e18, 25e16); // 25% annual interest assertEq(activePool.lastAggUpdateTime(), block.timestamp); } @@ -289,15 +288,15 @@ contract InterestRateAggregate is DevTestSetup { assertEq(boldToken.balanceOf(address(mockInterestRouter)), 0); // Open initial Trove so that aggregate interest begins accruing - openTroveNoHints100pctMaxFee(A, 5 ether, 3000e18, 25e16); - + openTroveNoHints100pctMaxFee(A, 5 ether, 3000e18, 25e16); + vm.warp(block.timestamp + 1 days); uint256 pendingAggInterest_1 = activePool.calcPendingAggInterest(); assertGt(pendingAggInterest_1, 0); // Open 2nd trove - openTroveNoHints100pctMaxFee(B, 2 ether, 2000e18, 25e16); + openTroveNoHints100pctMaxFee(B, 2 ether, 2000e18, 25e16); // Check I-router Bold bal has increased as expected from 2nd trove opening uint256 boldBalRouter_1 = boldToken.balanceOf(address(mockInterestRouter)); @@ -308,7 +307,7 @@ contract InterestRateAggregate is DevTestSetup { uint256 pendingAggInterest_2 = activePool.calcPendingAggInterest(); // Open 3rd trove - openTroveNoHints100pctMaxFee(C, 2 ether, 2000e18, 25e16); + openTroveNoHints100pctMaxFee(C, 2 ether, 2000e18, 25e16); // Check I-router Bold bal has increased as expected from 3rd trove opening uint256 boldBalRouter_2 = boldToken.balanceOf(address(mockInterestRouter)); @@ -325,23 +324,23 @@ contract InterestRateAggregate is DevTestSetup { assertEq(activePool.aggWeightedDebtSum(), 0); // A opens trove - uint256 ATroveId = openTroveNoHints100pctMaxFee(A, 5 ether, troveDebtRequest_A, annualInterest_A); + uint256 ATroveId = openTroveNoHints100pctMaxFee(A, 5 ether, troveDebtRequest_A, annualInterest_A); uint256 troveDebt_A = troveManager.getTroveDebt(ATroveId); assertGt(troveDebt_A, 0); // // Trove's debt should be weighted by its annual interest rate - uint256 expectedWeightedDebt_A = troveDebt_A * annualInterest_A; + uint256 expectedWeightedDebt_A = troveDebt_A * annualInterest_A; assertEq(activePool.aggWeightedDebtSum(), expectedWeightedDebt_A); vm.warp(block.timestamp + 1000); // B opens Trove - uint256 BTroveId = openTroveNoHints100pctMaxFee(B, 5 ether, troveDebtRequest_B, annualInterest_B); + uint256 BTroveId = openTroveNoHints100pctMaxFee(B, 5 ether, troveDebtRequest_B, annualInterest_B); uint256 troveDebt_B = troveManager.getTroveDebt(BTroveId); assertGt(troveDebt_B, 0); - uint256 expectedWeightedDebt_B = troveDebt_B * annualInterest_B; + uint256 expectedWeightedDebt_B = troveDebt_B * annualInterest_B; assertEq(activePool.aggWeightedDebtSum(), expectedWeightedDebt_A + expectedWeightedDebt_B); } @@ -353,8 +352,8 @@ contract InterestRateAggregate is DevTestSetup { uint256 sPdeposit = 100e18; // A opens Trove to obtain BOLD priceFeed.setPrice(2000e18); - openTroveNoHints100pctMaxFee(A, 2 ether, troveDebtRequest, 25e16); - + openTroveNoHints100pctMaxFee(A, 2 ether, troveDebtRequest, 25e16); + // fast-forward time vm.warp(block.timestamp + 1 days); @@ -374,8 +373,8 @@ contract InterestRateAggregate is DevTestSetup { // A opens Trove to obtain BOLD priceFeed.setPrice(2000e18); - openTroveNoHints100pctMaxFee(A, 2 ether, troveDebtRequest, 25e16); - + openTroveNoHints100pctMaxFee(A, 2 ether, troveDebtRequest, 25e16); + // fast-forward time vm.warp(block.timestamp + 1 days); @@ -399,8 +398,8 @@ contract InterestRateAggregate is DevTestSetup { // A opens Trove to obtain BOLD priceFeed.setPrice(2000e18); - openTroveNoHints100pctMaxFee(A, 2 ether, troveDebtRequest, 25e16); - + openTroveNoHints100pctMaxFee(A, 2 ether, troveDebtRequest, 25e16); + // fast-forward time vm.warp(block.timestamp + 1 days); @@ -420,8 +419,8 @@ contract InterestRateAggregate is DevTestSetup { // A opens Trove to obtain BOLD priceFeed.setPrice(2000e18); - openTroveNoHints100pctMaxFee(A, 2 ether, troveDebtRequest, 25e16); - + openTroveNoHints100pctMaxFee(A, 2 ether, troveDebtRequest, 25e16); + // fast-forward time vm.warp(block.timestamp + 1 days); @@ -447,8 +446,8 @@ contract InterestRateAggregate is DevTestSetup { // A opens Trove to obtain BOLD priceFeed.setPrice(2000e18); - openTroveNoHints100pctMaxFee(A, 2 ether, troveDebtRequest, 25e16); - + openTroveNoHints100pctMaxFee(A, 2 ether, troveDebtRequest, 25e16); + // fast-forward time vm.warp(block.timestamp + 1 days); @@ -470,8 +469,8 @@ contract InterestRateAggregate is DevTestSetup { // A opens Trove to obtain BOLD priceFeed.setPrice(2000e18); - openTroveNoHints100pctMaxFee(A, 2 ether, troveDebtRequest, 25e16); - + openTroveNoHints100pctMaxFee(A, 2 ether, troveDebtRequest, 25e16); + // fast-forward time vm.warp(block.timestamp + 1 days); @@ -493,9 +492,9 @@ contract InterestRateAggregate is DevTestSetup { uint256 sPdeposit = 100e18; // A opens Trove to obtain BOLD and makes SP deposit priceFeed.setPrice(2000e18); - openTroveNoHints100pctMaxFee(A, 2 ether, troveDebtRequest, 25e16); + openTroveNoHints100pctMaxFee(A, 2 ether, troveDebtRequest, 25e16); makeSPDeposit(A, sPdeposit); - + // fast-forward time vm.warp(block.timestamp + 1 days); @@ -514,7 +513,7 @@ contract InterestRateAggregate is DevTestSetup { uint256 sPdeposit = 100e18; // A opens Trove to obtain BOLD and makes SP deposit priceFeed.setPrice(2000e18); - openTroveNoHints100pctMaxFee(A, 2 ether, troveDebtRequest, 25e16); + openTroveNoHints100pctMaxFee(A, 2 ether, troveDebtRequest, 25e16); makeSPDeposit(A, sPdeposit); // fast-forward time @@ -539,9 +538,9 @@ contract InterestRateAggregate is DevTestSetup { uint256 sPdeposit = 100e18; // A opens Trove to obtain BOLD and makes SP deposit priceFeed.setPrice(2000e18); - openTroveNoHints100pctMaxFee(A, 2 ether, troveDebtRequest, 25e16); + openTroveNoHints100pctMaxFee(A, 2 ether, troveDebtRequest, 25e16); makeSPDeposit(A, sPdeposit); - + // fast-forward time vm.warp(block.timestamp + 1 days); @@ -560,9 +559,9 @@ contract InterestRateAggregate is DevTestSetup { uint256 sPdeposit = 100e18; // A opens Trove to obtain BOLD and makes SP deposit priceFeed.setPrice(2000e18); - openTroveNoHints100pctMaxFee(A, 2 ether, troveDebtRequest, 25e16); + openTroveNoHints100pctMaxFee(A, 2 ether, troveDebtRequest, 25e16); makeSPDeposit(A, sPdeposit); - + // fast-forward time vm.warp(block.timestamp + 1 days); @@ -587,9 +586,9 @@ contract InterestRateAggregate is DevTestSetup { // A opens Trove to obtain BOLD priceFeed.setPrice(2000e18); - openTroveNoHints100pctMaxFee(A, 2 ether, troveDebtRequest, 25e16); + openTroveNoHints100pctMaxFee(A, 2 ether, troveDebtRequest, 25e16); makeSPDeposit(A, sPdeposit); - + // fast-forward time vm.warp(block.timestamp + 1 days); @@ -614,13 +613,13 @@ contract InterestRateAggregate is DevTestSetup { // A opens Trove to obtain BOLD priceFeed.setPrice(2000e18); - openTroveNoHints100pctMaxFee(A, 2 ether, troveDebtRequest, 25e16); + openTroveNoHints100pctMaxFee(A, 2 ether, troveDebtRequest, 25e16); makeSPDeposit(A, sPdeposit); - + // fast-forward time vm.warp(block.timestamp + 1 days); - // Get recorded sum before + // Get recorded sum before uint256 recordedDebt_1 = activePool.getRecordedDebtSum(); assertGt(recordedDebt_1, 0); @@ -636,14 +635,14 @@ contract InterestRateAggregate is DevTestSetup { // Reduces pending agg interest to 0 function testCloseTroveReducesPendingAggInterestTo0() public { uint256 troveDebtRequest = 2000e18; - // A, B open Troves + // A, B open Troves priceFeed.setPrice(2000e18); - openTroveNoHints100pctMaxFee(A, 2 ether, troveDebtRequest, 25e16); - uint256 BTroveId = openTroveNoHints100pctMaxFee(B, 5 ether, troveDebtRequest, 50e16); - + openTroveNoHints100pctMaxFee(A, 2 ether, troveDebtRequest, 25e16); + uint256 BTroveId = openTroveNoHints100pctMaxFee(B, 5 ether, troveDebtRequest, 50e16); + // A sends Bold to B so B can cover their interest and close their Trove transferBold(A, B, boldToken.balanceOf(A)); - + // fast-forward time vm.warp(block.timestamp + 1 days); @@ -652,7 +651,7 @@ contract InterestRateAggregate is DevTestSetup { // B closes Trove closeTrove(B, BTroveId); - + // // Check pending agg. interest reduced to 0 assertEq(activePool.calcPendingAggInterest(), 0); } @@ -661,14 +660,14 @@ contract InterestRateAggregate is DevTestSetup { function testCloseTroveAddsPendingAggInterestAndSubtractsRecordedDebtPlusInterestFromAggRecordedDebt() public { uint256 troveDebtRequest = 2000e18; - // A, B open Troves + // A, B open Troves priceFeed.setPrice(2000e18); - openTroveNoHints100pctMaxFee(A, 2 ether, troveDebtRequest, 25e16); - uint256 BTroveId = openTroveNoHints100pctMaxFee(B, 5 ether, troveDebtRequest, 50e16); - + openTroveNoHints100pctMaxFee(A, 2 ether, troveDebtRequest, 25e16); + uint256 BTroveId = openTroveNoHints100pctMaxFee(B, 5 ether, troveDebtRequest, 50e16); + // A sends Bold to B so B can cover their interest and close their Trove transferBold(A, B, boldToken.balanceOf(A)); - + // fast-forward time vm.warp(block.timestamp + 1 days); @@ -681,7 +680,7 @@ contract InterestRateAggregate is DevTestSetup { assertGt(activePool.calcPendingAggInterest(), 0); // Check Trove's entire debt is larger than their recorded debt: - (uint256 entireTroveDebt_B, , , , )= troveManager.getEntireDebtAndColl(BTroveId); + (uint256 entireTroveDebt_B,,,,) = troveManager.getEntireDebtAndColl(BTroveId); assertGt(entireTroveDebt_B, troveManager.getTroveDebt(BTroveId)); // B closes Trove @@ -694,14 +693,14 @@ contract InterestRateAggregate is DevTestSetup { // Updates last agg update time to now function testCloseTroveUpdatesLastAggUpdateTimeToNow() public { uint256 troveDebtRequest = 2000e18; - // A, B open Troves + // A, B open Troves priceFeed.setPrice(2000e18); - openTroveNoHints100pctMaxFee(A, 2 ether, troveDebtRequest, 25e16); - uint256 BTroveId = openTroveNoHints100pctMaxFee(B, 5 ether, troveDebtRequest, 50e16); - + openTroveNoHints100pctMaxFee(A, 2 ether, troveDebtRequest, 25e16); + uint256 BTroveId = openTroveNoHints100pctMaxFee(B, 5 ether, troveDebtRequest, 50e16); + // A sends Bold to B so B can cover their interest and close their Trove transferBold(A, B, boldToken.balanceOf(A)); - + // fast-forward time vm.warp(block.timestamp + 1 days); @@ -718,14 +717,14 @@ contract InterestRateAggregate is DevTestSetup { // mints interest to interest router function testCloseTroveMintsInterestToInterestRouter() public { uint256 troveDebtRequest = 2000e18; - // A, B open Troves + // A, B open Troves priceFeed.setPrice(2000e18); - openTroveNoHints100pctMaxFee(A, 2 ether, troveDebtRequest, 25e16); - uint256 BTroveId = openTroveNoHints100pctMaxFee(B, 5 ether, troveDebtRequest, 50e16); - + openTroveNoHints100pctMaxFee(A, 2 ether, troveDebtRequest, 25e16); + uint256 BTroveId = openTroveNoHints100pctMaxFee(B, 5 ether, troveDebtRequest, 50e16); + // A sends Bold to B so B can cover their interest and close their Trove transferBold(A, B, boldToken.balanceOf(A)); - + // fast-forward time vm.warp(block.timestamp + 1 days); @@ -748,14 +747,14 @@ contract InterestRateAggregate is DevTestSetup { function testCloseTroveReducesAggWeightedDebtSumByTrovesWeightedRecordedDebt() public { uint256 troveDebtRequest = 2000e18; - // A, B open Troves + // A, B open Troves priceFeed.setPrice(2000e18); - openTroveNoHints100pctMaxFee(A, 2 ether, troveDebtRequest, 25e16); - uint256 BTroveId = openTroveNoHints100pctMaxFee(B, 5 ether, troveDebtRequest, 50e16); - + openTroveNoHints100pctMaxFee(A, 2 ether, troveDebtRequest, 25e16); + uint256 BTroveId = openTroveNoHints100pctMaxFee(B, 5 ether, troveDebtRequest, 50e16); + // A sends Bold to B so B can cover their interest and close their Trove transferBold(A, B, boldToken.balanceOf(A)); - + // fast-forward time vm.warp(block.timestamp + 1 days); @@ -764,7 +763,7 @@ contract InterestRateAggregate is DevTestSetup { assertGt(recordedTroveDebt_B, 0); assertGt(annualInterestRate_B, 0); uint256 weightedTroveDebt = recordedTroveDebt_B * annualInterestRate_B; - + uint256 aggWeightedDebtSum_1 = activePool.aggWeightedDebtSum(); assertGt(aggWeightedDebtSum_1, 0); @@ -775,21 +774,21 @@ contract InterestRateAggregate is DevTestSetup { function testCloseTroveReducesRecordedDebtSumByInitialRecordedDebt() public { uint256 troveDebtRequest = 2000e18; - // A, B open Troves + // A, B open Troves priceFeed.setPrice(2000e18); - openTroveNoHints100pctMaxFee(A, 2 ether, troveDebtRequest, 25e16); - uint256 BTroveId = openTroveNoHints100pctMaxFee(B, 5 ether, troveDebtRequest, 50e16); + openTroveNoHints100pctMaxFee(A, 2 ether, troveDebtRequest, 25e16); + uint256 BTroveId = openTroveNoHints100pctMaxFee(B, 5 ether, troveDebtRequest, 50e16); uint256 recordedDebt_B = troveManager.getTroveDebt(BTroveId); - + uint256 activePoolRecordedDebt_1 = activePool.getRecordedDebtSum(); assertGt(activePoolRecordedDebt_1, 0); // A sends Bold to B so B can cover their interest and close their Trove transferBold(A, B, boldToken.balanceOf(A)); - + // fast-forward time vm.warp(block.timestamp + 1 days); - // B closes Trove + // B closes Trove closeTrove(B, BTroveId); // Check recorded debt sum reduced by B's recorded debt @@ -797,21 +796,21 @@ contract InterestRateAggregate is DevTestSetup { } function testCloseTroveReducesBorrowerBoldBalByEntireTroveDebtLessGasComp() public { - uint256 troveDebtRequest = 2000e18; + uint256 troveDebtRequest = 2000e18; // A, B opens Trove priceFeed.setPrice(2000e18); - openTroveNoHints100pctMaxFee(A, 2 ether, troveDebtRequest, 25e16); - uint256 BTroveId = openTroveNoHints100pctMaxFee(B, 5 ether, troveDebtRequest, 50e16); - + openTroveNoHints100pctMaxFee(A, 2 ether, troveDebtRequest, 25e16); + uint256 BTroveId = openTroveNoHints100pctMaxFee(B, 5 ether, troveDebtRequest, 50e16); + // A sends Bold to B so B can cover their interest and close their Trove transferBold(A, B, boldToken.balanceOf(A)); uint256 bal_B = boldToken.balanceOf(B); - + // fast-forward time vm.warp(block.timestamp + 1 days); - + // Get the up-to-date entire debt - (uint256 entireDebt_B, , , , ) = troveManager.getEntireDebtAndColl(BTroveId); + (uint256 entireDebt_B,,,,) = troveManager.getEntireDebtAndColl(BTroveId); // B closes Trove closeTrove(B, BTroveId); @@ -823,10 +822,10 @@ contract InterestRateAggregate is DevTestSetup { // --- adjustTroveInterestRate --- function testAdjustTroveInterestRateWithNoPendingDebtGainIncreasesAggRecordedDebtByPendingAggInterest() public { - uint256 troveDebtRequest = 2000e18; + uint256 troveDebtRequest = 2000e18; // A opens Trove priceFeed.setPrice(2000e18); - uint256 ATroveId = openTroveNoHints100pctMaxFee(A, 2 ether, troveDebtRequest, 25e16); + uint256 ATroveId = openTroveNoHints100pctMaxFee(A, 2 ether, troveDebtRequest, 25e16); vm.warp(block.timestamp + 1 days); @@ -841,10 +840,10 @@ contract InterestRateAggregate is DevTestSetup { } function testAdjustTroveInterestRateReducesPendingAggInterestTo0() public { - uint256 troveDebtRequest = 2000e18; + uint256 troveDebtRequest = 2000e18; // A opens Trove priceFeed.setPrice(2000e18); - uint256 ATroveId = openTroveNoHints100pctMaxFee(A, 2 ether, troveDebtRequest, 25e16); + uint256 ATroveId = openTroveNoHints100pctMaxFee(A, 2 ether, troveDebtRequest, 25e16); vm.warp(block.timestamp + 1 days); @@ -858,10 +857,10 @@ contract InterestRateAggregate is DevTestSetup { // Update last agg. update time to now function testAdjustTroveInterestRateUpdatesLastAggUpdateTimeToNow() public { uint256 troveDebtRequest = 2000e18; - // A opens Trove + // A opens Trove priceFeed.setPrice(2000e18); - uint256 ATroveId = openTroveNoHints100pctMaxFee(A, 2 ether, troveDebtRequest, 25e16); - + uint256 ATroveId = openTroveNoHints100pctMaxFee(A, 2 ether, troveDebtRequest, 25e16); + // fast-forward time vm.warp(block.timestamp + 1 days); @@ -878,10 +877,10 @@ contract InterestRateAggregate is DevTestSetup { // mints interest to router function testAdjustTroveInterestRateMintsAggInterestToRouter() public { uint256 troveDebtRequest = 2000e18; - // A opens Trove + // A opens Trove priceFeed.setPrice(2000e18); - uint256 ATroveId = openTroveNoHints100pctMaxFee(A, 2 ether, troveDebtRequest, 25e16); - + uint256 ATroveId = openTroveNoHints100pctMaxFee(A, 2 ether, troveDebtRequest, 25e16); + // fast-forward time vm.warp(block.timestamp + 1 days); @@ -904,10 +903,10 @@ contract InterestRateAggregate is DevTestSetup { function testAdjustTroveInterestRateAdjustsWeightedDebtSumCorrectly() public { uint256 troveDebtRequest = 2000e18; - // A opens Trove + // A opens Trove priceFeed.setPrice(2000e18); - uint256 ATroveId = openTroveNoHints100pctMaxFee(A, 2 ether, troveDebtRequest, 25e16); - + uint256 ATroveId = openTroveNoHints100pctMaxFee(A, 2 ether, troveDebtRequest, 25e16); + uint256 oldRecordedWeightedDebt = troveManager.getTroveWeightedRecordedDebt(ATroveId); // fast-forward time vm.warp(block.timestamp + 1 days); @@ -915,7 +914,7 @@ contract InterestRateAggregate is DevTestSetup { uint256 aggWeightedDebtSum_1 = activePool.aggWeightedDebtSum(); assertGt(aggWeightedDebtSum_1, 0); - (uint256 entireTroveDebt, , , , ) = troveManager.getEntireDebtAndColl(ATroveId); + (uint256 entireTroveDebt,,,,) = troveManager.getEntireDebtAndColl(ATroveId); uint256 newAnnualInterestRate = 75e16; uint256 expectedNewRecordedWeightedDebt = entireTroveDebt * newAnnualInterestRate; @@ -924,15 +923,18 @@ contract InterestRateAggregate is DevTestSetup { changeInterestRateNoHints(A, ATroveId, newAnnualInterestRate); // Expect weighted sum decreases by the old and increases by the new individual weighted Trove debt. - assertEq(activePool.aggWeightedDebtSum(), aggWeightedDebtSum_1 - oldRecordedWeightedDebt + expectedNewRecordedWeightedDebt); + assertEq( + activePool.aggWeightedDebtSum(), + aggWeightedDebtSum_1 - oldRecordedWeightedDebt + expectedNewRecordedWeightedDebt + ); } function testAdjustTroveInterestRateWithNoRedistGainsIncreasesRecordedDebtSumByTrovesAccruedInterest() public { uint256 troveDebtRequest = 2000e18; - // A opens Trove + // A opens Trove priceFeed.setPrice(2000e18); - uint256 ATroveId = openTroveNoHints100pctMaxFee(A, 2 ether, troveDebtRequest, 25e16); + uint256 ATroveId = openTroveNoHints100pctMaxFee(A, 2 ether, troveDebtRequest, 25e16); // fast-forward time vm.warp(block.timestamp + 1 days); @@ -954,13 +956,15 @@ contract InterestRateAggregate is DevTestSetup { // --- withdrawBold tests --- - function testWithdrawBoldWithNoRedistGainsIncreasesAggRecordedDebtByPendingAggInterestPlusBorrowerDebtChange() public { + function testWithdrawBoldWithNoRedistGainsIncreasesAggRecordedDebtByPendingAggInterestPlusBorrowerDebtChange() + public + { uint256 troveDebtRequest = 2000e18; - uint256 debtIncrease = 500e18; + uint256 debtIncrease = 500e18; - // A opens Trove + // A opens Trove priceFeed.setPrice(2000e18); - uint256 ATroveId = openTroveNoHints100pctMaxFee(A, 3 ether, troveDebtRequest, 25e16); + uint256 ATroveId = openTroveNoHints100pctMaxFee(A, 3 ether, troveDebtRequest, 25e16); // fast-forward time vm.warp(block.timestamp + 1 days); @@ -978,11 +982,11 @@ contract InterestRateAggregate is DevTestSetup { function testWithdrawBoldReducesPendingAggInterestTo0() public { uint256 troveDebtRequest = 2000e18; - uint256 debtIncrease = 500e18; + uint256 debtIncrease = 500e18; // A opens Trove priceFeed.setPrice(2000e18); - uint256 ATroveId = openTroveNoHints100pctMaxFee(A, 3 ether, troveDebtRequest, 25e16); + uint256 ATroveId = openTroveNoHints100pctMaxFee(A, 3 ether, troveDebtRequest, 25e16); vm.warp(block.timestamp + 1 days); @@ -996,11 +1000,11 @@ contract InterestRateAggregate is DevTestSetup { function testWithdrawBoldMintsAggInterestToRouter() public { uint256 troveDebtRequest = 2000e18; - uint256 debtIncrease = 500e18; + uint256 debtIncrease = 500e18; // A opens Trove priceFeed.setPrice(2000e18); - uint256 ATroveId = openTroveNoHints100pctMaxFee(A, 3 ether, troveDebtRequest, 25e16); + uint256 ATroveId = openTroveNoHints100pctMaxFee(A, 3 ether, troveDebtRequest, 25e16); vm.warp(block.timestamp + 1 days); @@ -1019,12 +1023,12 @@ contract InterestRateAggregate is DevTestSetup { // Updates last agg update time to now function testWithdrawBoldUpdatesLastAggUpdateTimeToNow() public { uint256 troveDebtRequest = 2000e18; - uint256 debtIncrease = 500e18; - - // A opens Trove + uint256 debtIncrease = 500e18; + + // A opens Trove priceFeed.setPrice(2000e18); - uint256 ATroveId = openTroveNoHints100pctMaxFee(A, 3 ether, troveDebtRequest, 25e16); - + uint256 ATroveId = openTroveNoHints100pctMaxFee(A, 3 ether, troveDebtRequest, 25e16); + // fast-forward time vm.warp(block.timestamp + 1 days); @@ -1042,11 +1046,11 @@ contract InterestRateAggregate is DevTestSetup { function testWithdrawBoldWithNoRedistGainsIncreasesRecordedDebtSumByTrovesAccruedInterestPlusDebtChange() public { uint256 troveDebtRequest = 2000e18; - uint256 debtIncrease = 500e18; + uint256 debtIncrease = 500e18; - // A opens Trove + // A opens Trove priceFeed.setPrice(2000e18); - uint256 ATroveId = openTroveNoHints100pctMaxFee(A, 3 ether, troveDebtRequest, 25e16); + uint256 ATroveId = openTroveNoHints100pctMaxFee(A, 3 ether, troveDebtRequest, 25e16); // fast-forward time vm.warp(block.timestamp + 1 days); @@ -1068,13 +1072,13 @@ contract InterestRateAggregate is DevTestSetup { function testWithdrawBoldAdjustsWeightedDebtSumCorrectly() public { uint256 troveDebtRequest = 2000e18; - uint256 debtIncrease = 500e18; + uint256 debtIncrease = 500e18; uint256 interestRate = 25e16; - // A opens Trove + // A opens Trove priceFeed.setPrice(2000e18); - uint256 ATroveId = openTroveNoHints100pctMaxFee(A, 3 ether, troveDebtRequest, interestRate); - + uint256 ATroveId = openTroveNoHints100pctMaxFee(A, 3 ether, troveDebtRequest, interestRate); + uint256 oldRecordedWeightedDebt = troveManager.getTroveWeightedRecordedDebt(ATroveId); // fast-forward time @@ -1086,22 +1090,27 @@ contract InterestRateAggregate is DevTestSetup { // A draws more debt withdrawBold100pctMaxFee(A, ATroveId, debtIncrease); - (uint256 entireTroveDebt, , , , ) = troveManager.getEntireDebtAndColl(ATroveId); + (uint256 entireTroveDebt,,,,) = troveManager.getEntireDebtAndColl(ATroveId); uint256 expectedNewRecordedWeightedDebt = entireTroveDebt * interestRate; // Expect weighted sum decreases by the old and increases by the new individual weighted Trove debt. - assertEq(activePool.aggWeightedDebtSum(), aggWeightedDebtSum_1 - oldRecordedWeightedDebt + expectedNewRecordedWeightedDebt); + assertEq( + activePool.aggWeightedDebtSum(), + aggWeightedDebtSum_1 - oldRecordedWeightedDebt + expectedNewRecordedWeightedDebt + ); } // --- repayBold tests --- - function testRepayBoldWithNoRedistGainsIncreasesAggRecordedDebtByPendingAggInterestMinusBorrowerDebtChange() public { + function testRepayBoldWithNoRedistGainsIncreasesAggRecordedDebtByPendingAggInterestMinusBorrowerDebtChange() + public + { uint256 troveDebtRequest = 3000e18; - uint256 debtDecrease = 500e18; + uint256 debtDecrease = 500e18; - // A opens Trove + // A opens Trove priceFeed.setPrice(2000e18); - uint256 ATroveId = openTroveNoHints100pctMaxFee(A, 3 ether, troveDebtRequest, 25e16); + uint256 ATroveId = openTroveNoHints100pctMaxFee(A, 3 ether, troveDebtRequest, 25e16); // fast-forward time vm.warp(block.timestamp + 1 days); @@ -1119,11 +1128,11 @@ contract InterestRateAggregate is DevTestSetup { function testRepayBoldReducesPendingAggInterestTo0() public { uint256 troveDebtRequest = 3000e18; - uint256 debtDecrease = 500e18; + uint256 debtDecrease = 500e18; // A opens Trove priceFeed.setPrice(2000e18); - uint256 ATroveId = openTroveNoHints100pctMaxFee(A, 3 ether, troveDebtRequest, 25e16); + uint256 ATroveId = openTroveNoHints100pctMaxFee(A, 3 ether, troveDebtRequest, 25e16); vm.warp(block.timestamp + 1 days); @@ -1135,16 +1144,16 @@ contract InterestRateAggregate is DevTestSetup { assertEq(activePool.calcPendingAggInterest(), 0); } - function testRepayBoldMintsAggInterestToRouter() public { + function testRepayBoldMintsAggInterestToRouter() public { uint256 troveDebtRequest = 3000e18; - uint256 debtDecrease = 500e18; + uint256 debtDecrease = 500e18; // A opens Trove priceFeed.setPrice(2000e18); - uint256 ATroveId = openTroveNoHints100pctMaxFee(A, 3 ether, troveDebtRequest, 25e16); + uint256 ATroveId = openTroveNoHints100pctMaxFee(A, 3 ether, troveDebtRequest, 25e16); vm.warp(block.timestamp + 1 days); - + // Check I-router balance is 0 assertEq(boldToken.balanceOf(address(mockInterestRouter)), 0); @@ -1159,32 +1168,32 @@ contract InterestRateAggregate is DevTestSetup { function testRepayBoldUpdatesLastAggUpdateTimeToNow() public { uint256 troveDebtRequest = 3000e18; - uint256 debtDecrease = 500e18; - - // A opens Trove + uint256 debtDecrease = 500e18; + + // A opens Trove priceFeed.setPrice(2000e18); - uint256 ATroveId = openTroveNoHints100pctMaxFee(A, 3 ether, troveDebtRequest, 25e16); - + uint256 ATroveId = openTroveNoHints100pctMaxFee(A, 3 ether, troveDebtRequest, 25e16); + // fast-forward time vm.warp(block.timestamp + 1 days); assertGt(activePool.lastAggUpdateTime(), 0); assertLt(activePool.lastAggUpdateTime(), block.timestamp); - // A repays debt + // A repays debt repayBold(A, ATroveId, debtDecrease); // Check last agg update time increased to now assertEq(activePool.lastAggUpdateTime(), block.timestamp); } - function testRepayBoldWithNoRedistGainsIncreasesRecordedDebtSumByTrovesAccruedInterestMinusDebtChange() public { + function testRepayBoldWithNoRedistGainsIncreasesRecordedDebtSumByTrovesAccruedInterestMinusDebtChange() public { uint256 troveDebtRequest = 3000e18; - uint256 debtDecrease = 500e18; + uint256 debtDecrease = 500e18; - // A opens Trove + // A opens Trove priceFeed.setPrice(2000e18); - uint256 ATroveId = openTroveNoHints100pctMaxFee(A, 3 ether, troveDebtRequest, 25e16); + uint256 ATroveId = openTroveNoHints100pctMaxFee(A, 3 ether, troveDebtRequest, 25e16); // fast-forward time vm.warp(block.timestamp + 1 days); @@ -1206,13 +1215,13 @@ contract InterestRateAggregate is DevTestSetup { function testRepayBoldAdjustsWeightedDebtSumCorrectly() public { uint256 troveDebtRequest = 3000e18; - uint256 debtDecrease = 500e18; + uint256 debtDecrease = 500e18; uint256 interestRate = 25e16; - // A opens Trove + // A opens Trove priceFeed.setPrice(2000e18); - uint256 ATroveId = openTroveNoHints100pctMaxFee(A, 3 ether, troveDebtRequest, interestRate); - + uint256 ATroveId = openTroveNoHints100pctMaxFee(A, 3 ether, troveDebtRequest, interestRate); + uint256 oldRecordedWeightedDebt = troveManager.getTroveWeightedRecordedDebt(ATroveId); // fast-forward time @@ -1224,11 +1233,14 @@ contract InterestRateAggregate is DevTestSetup { // A repays debt repayBold(A, ATroveId, debtDecrease); - (uint256 entireTroveDebt, , , , ) = troveManager.getEntireDebtAndColl(ATroveId); + (uint256 entireTroveDebt,,,,) = troveManager.getEntireDebtAndColl(ATroveId); uint256 expectedNewRecordedWeightedDebt = entireTroveDebt * interestRate; // Expect weighted sum decreases by the old and increases by the new individual weighted Trove debt. - assertEq(activePool.aggWeightedDebtSum(), aggWeightedDebtSum_1 - oldRecordedWeightedDebt + expectedNewRecordedWeightedDebt); + assertEq( + activePool.aggWeightedDebtSum(), + aggWeightedDebtSum_1 - oldRecordedWeightedDebt + expectedNewRecordedWeightedDebt + ); } // --- addColl tests --- @@ -1237,9 +1249,9 @@ contract InterestRateAggregate is DevTestSetup { uint256 troveDebtRequest = 3000e18; uint256 collIncrease = 1 ether; - // A opens Trove + // A opens Trove priceFeed.setPrice(2000e18); - uint256 ATroveId = openTroveNoHints100pctMaxFee(A, 3 ether, troveDebtRequest, 25e16); + uint256 ATroveId = openTroveNoHints100pctMaxFee(A, 3 ether, troveDebtRequest, 25e16); // fast-forward time vm.warp(block.timestamp + 1 days); @@ -1261,7 +1273,7 @@ contract InterestRateAggregate is DevTestSetup { // A opens Trove priceFeed.setPrice(2000e18); - uint256 ATroveId = openTroveNoHints100pctMaxFee(A, 3 ether, troveDebtRequest, 25e16); + uint256 ATroveId = openTroveNoHints100pctMaxFee(A, 3 ether, troveDebtRequest, 25e16); vm.warp(block.timestamp + 1 days); @@ -1273,13 +1285,13 @@ contract InterestRateAggregate is DevTestSetup { assertEq(activePool.calcPendingAggInterest(), 0); } - function testAddCollMintsAggInterestToRouter() public { + function testAddCollMintsAggInterestToRouter() public { uint256 troveDebtRequest = 3000e18; uint256 collIncrease = 1 ether; // A opens Trove priceFeed.setPrice(2000e18); - uint256 ATroveId = openTroveNoHints100pctMaxFee(A, 3 ether, troveDebtRequest, 25e16); + uint256 ATroveId = openTroveNoHints100pctMaxFee(A, 3 ether, troveDebtRequest, 25e16); vm.warp(block.timestamp + 1 days); @@ -1298,11 +1310,11 @@ contract InterestRateAggregate is DevTestSetup { function testAddCollUpdatesLastAggUpdateTimeToNow() public { uint256 troveDebtRequest = 3000e18; uint256 collIncrease = 1 ether; - - // A opens Trove + + // A opens Trove priceFeed.setPrice(2000e18); - uint256 ATroveId = openTroveNoHints100pctMaxFee(A, 3 ether, troveDebtRequest, 25e16); - + uint256 ATroveId = openTroveNoHints100pctMaxFee(A, 3 ether, troveDebtRequest, 25e16); + // fast-forward time vm.warp(block.timestamp + 1 days); @@ -1320,9 +1332,9 @@ contract InterestRateAggregate is DevTestSetup { uint256 troveDebtRequest = 3000e18; uint256 collIncrease = 1 ether; - // A opens Trove + // A opens Trove priceFeed.setPrice(2000e18); - uint256 ATroveId = openTroveNoHints100pctMaxFee(A, 3 ether, troveDebtRequest, 25e16); + uint256 ATroveId = openTroveNoHints100pctMaxFee(A, 3 ether, troveDebtRequest, 25e16); // fast-forward time vm.warp(block.timestamp + 1 days); @@ -1347,10 +1359,10 @@ contract InterestRateAggregate is DevTestSetup { uint256 collIncrease = 1 ether; uint256 interestRate = 25e16; - // A opens Trove + // A opens Trove priceFeed.setPrice(2000e18); - uint256 ATroveId = openTroveNoHints100pctMaxFee(A, 3 ether, troveDebtRequest, interestRate); - + uint256 ATroveId = openTroveNoHints100pctMaxFee(A, 3 ether, troveDebtRequest, interestRate); + uint256 oldRecordedWeightedDebt = troveManager.getTroveWeightedRecordedDebt(ATroveId); // fast-forward time @@ -1362,14 +1374,17 @@ contract InterestRateAggregate is DevTestSetup { // A adds coll addColl(A, ATroveId, collIncrease); - (uint256 entireTroveDebt, , , , ) = troveManager.getEntireDebtAndColl(ATroveId); + (uint256 entireTroveDebt,,,,) = troveManager.getEntireDebtAndColl(ATroveId); uint256 expectedNewRecordedWeightedDebt = entireTroveDebt * interestRate; // Weighted debt should have increased due to interest being applied assertGt(expectedNewRecordedWeightedDebt, oldRecordedWeightedDebt); // Expect weighted sum decreases by the old and increases by the new individual weighted Trove debt. - assertEq(activePool.aggWeightedDebtSum(), aggWeightedDebtSum_1 - oldRecordedWeightedDebt + expectedNewRecordedWeightedDebt); + assertEq( + activePool.aggWeightedDebtSum(), + aggWeightedDebtSum_1 - oldRecordedWeightedDebt + expectedNewRecordedWeightedDebt + ); } // --- withdrawColl --- @@ -1378,9 +1393,9 @@ contract InterestRateAggregate is DevTestSetup { uint256 troveDebtRequest = 2000e18; uint256 collDecrease = 1 ether; - // A opens Trove + // A opens Trove priceFeed.setPrice(2000e18); - uint256 ATroveId = openTroveNoHints100pctMaxFee(A, 3 ether, troveDebtRequest, 25e16); + uint256 ATroveId = openTroveNoHints100pctMaxFee(A, 3 ether, troveDebtRequest, 25e16); // fast-forward time vm.warp(block.timestamp + 1 days); @@ -1402,13 +1417,13 @@ contract InterestRateAggregate is DevTestSetup { // A opens Trove priceFeed.setPrice(2000e18); - uint256 ATroveId = openTroveNoHints100pctMaxFee(A, 3 ether, troveDebtRequest, 25e16); + uint256 ATroveId = openTroveNoHints100pctMaxFee(A, 3 ether, troveDebtRequest, 25e16); vm.warp(block.timestamp + 1 days); assertGt(activePool.calcPendingAggInterest(), 0); - // A withdraws coll + // A withdraws coll withdrawColl(A, ATroveId, collDecrease); assertEq(activePool.calcPendingAggInterest(), 0); @@ -1420,7 +1435,7 @@ contract InterestRateAggregate is DevTestSetup { // A opens Trove priceFeed.setPrice(2000e18); - uint256 ATroveId = openTroveNoHints100pctMaxFee(A, 3 ether, troveDebtRequest, 25e16); + uint256 ATroveId = openTroveNoHints100pctMaxFee(A, 3 ether, troveDebtRequest, 25e16); vm.warp(block.timestamp + 1 days); @@ -1439,11 +1454,11 @@ contract InterestRateAggregate is DevTestSetup { function testWithdrawCollUpdatesLastAggUpdateTimeToNow() public { uint256 troveDebtRequest = 2000e18; uint256 collDecrease = 1 ether; - - // A opens Trove + + // A opens Trove priceFeed.setPrice(2000e18); - uint256 ATroveId = openTroveNoHints100pctMaxFee(A, 3 ether, troveDebtRequest, 25e16); - + uint256 ATroveId = openTroveNoHints100pctMaxFee(A, 3 ether, troveDebtRequest, 25e16); + // fast-forward time vm.warp(block.timestamp + 1 days); @@ -1461,9 +1476,9 @@ contract InterestRateAggregate is DevTestSetup { uint256 troveDebtRequest = 2000e18; uint256 collDecrease = 1 ether; - // A opens Trove + // A opens Trove priceFeed.setPrice(2000e18); - uint256 ATroveId = openTroveNoHints100pctMaxFee(A, 3 ether, troveDebtRequest, 25e16); + uint256 ATroveId = openTroveNoHints100pctMaxFee(A, 3 ether, troveDebtRequest, 25e16); // fast-forward time vm.warp(block.timestamp + 1 days); @@ -1488,10 +1503,10 @@ contract InterestRateAggregate is DevTestSetup { uint256 collDecrease = 1 ether; uint256 interestRate = 25e16; - // A opens Trove + // A opens Trove priceFeed.setPrice(2000e18); - uint256 ATroveId = openTroveNoHints100pctMaxFee(A, 3 ether, troveDebtRequest, interestRate); - + uint256 ATroveId = openTroveNoHints100pctMaxFee(A, 3 ether, troveDebtRequest, interestRate); + uint256 oldRecordedWeightedDebt = troveManager.getTroveWeightedRecordedDebt(ATroveId); // fast-forward time @@ -1503,24 +1518,29 @@ contract InterestRateAggregate is DevTestSetup { // A withdraw coll withdrawColl(A, ATroveId, collDecrease); - (uint256 entireTroveDebt, , , , ) = troveManager.getEntireDebtAndColl(ATroveId); + (uint256 entireTroveDebt,,,,) = troveManager.getEntireDebtAndColl(ATroveId); uint256 expectedNewRecordedWeightedDebt = entireTroveDebt * interestRate; // Weighted debt should have increased due to interest being applied assertGt(expectedNewRecordedWeightedDebt, oldRecordedWeightedDebt); // Expect weighted sum decreases by the old and increases by the new individual weighted Trove debt. - assertEq(activePool.aggWeightedDebtSum(), aggWeightedDebtSum_1 - oldRecordedWeightedDebt + expectedNewRecordedWeightedDebt); + assertEq( + activePool.aggWeightedDebtSum(), + aggWeightedDebtSum_1 - oldRecordedWeightedDebt + expectedNewRecordedWeightedDebt + ); } - + // --- applyTroveInterestPermissionless --- - function testApplyTroveInterestPermissionlessWithNoRedistGainsIncreasesAggRecordedDebtByPendingAggInterest() public { + function testApplyTroveInterestPermissionlessWithNoRedistGainsIncreasesAggRecordedDebtByPendingAggInterest() + public + { uint256 troveDebtRequest = 2000e18; - // A opens Trove + // A opens Trove priceFeed.setPrice(2000e18); - uint256 ATroveId = openTroveNoHints100pctMaxFee(A, 3 ether, troveDebtRequest, 25e16); + uint256 ATroveId = openTroveNoHints100pctMaxFee(A, 3 ether, troveDebtRequest, 25e16); // fast-forward past such that trove is Stale vm.warp(block.timestamp + 90 days + 1); @@ -1543,7 +1563,7 @@ contract InterestRateAggregate is DevTestSetup { // A opens Trove priceFeed.setPrice(2000e18); - uint256 ATroveId = openTroveNoHints100pctMaxFee(A, 3 ether, troveDebtRequest, 25e16); + uint256 ATroveId = openTroveNoHints100pctMaxFee(A, 3 ether, troveDebtRequest, 25e16); // fast-forward time such that trove is Stale vm.warp(block.timestamp + 90 days + 1); @@ -1563,7 +1583,7 @@ contract InterestRateAggregate is DevTestSetup { // A opens Trove priceFeed.setPrice(2000e18); - uint256 ATroveId = openTroveNoHints100pctMaxFee(A, 3 ether, troveDebtRequest, 25e16); + uint256 ATroveId = openTroveNoHints100pctMaxFee(A, 3 ether, troveDebtRequest, 25e16); // fast-forward time such that trove is Stale vm.warp(block.timestamp + 90 days + 1); @@ -1585,11 +1605,11 @@ contract InterestRateAggregate is DevTestSetup { function testApplyTroveInterestPermissionlessUpdatesLastAggUpdateTimeToNow() public { uint256 troveDebtRequest = 2000e18; - - // A opens Trove + + // A opens Trove priceFeed.setPrice(2000e18); - uint256 ATroveId = openTroveNoHints100pctMaxFee(A, 3 ether, troveDebtRequest, 25e16); - + uint256 ATroveId = openTroveNoHints100pctMaxFee(A, 3 ether, troveDebtRequest, 25e16); + // fast-forward time such that trove is Stale vm.warp(block.timestamp + 90 days + 1); // Confirm Trove is stale @@ -1605,12 +1625,14 @@ contract InterestRateAggregate is DevTestSetup { assertEq(activePool.lastAggUpdateTime(), block.timestamp); } - function testApplyTroveInterestPermissionlessWithNoRedistGainsIncreasesRecordedDebtSumByTrovesAccruedInterest() public { + function testApplyTroveInterestPermissionlessWithNoRedistGainsIncreasesRecordedDebtSumByTrovesAccruedInterest() + public + { uint256 troveDebtRequest = 2000e18; - // A opens Trove + // A opens Trove priceFeed.setPrice(2000e18); - uint256 ATroveId = openTroveNoHints100pctMaxFee(A, 3 ether, troveDebtRequest, 25e16); + uint256 ATroveId = openTroveNoHints100pctMaxFee(A, 3 ether, troveDebtRequest, 25e16); // fast-forward time such that trove is Stale vm.warp(block.timestamp + 90 days + 1); @@ -1636,10 +1658,10 @@ contract InterestRateAggregate is DevTestSetup { uint256 troveDebtRequest = 2000e18; uint256 interestRate = 25e16; - // A opens Trove + // A opens Trove priceFeed.setPrice(2000e18); - uint256 ATroveId = openTroveNoHints100pctMaxFee(A, 3 ether, troveDebtRequest, interestRate); - + uint256 ATroveId = openTroveNoHints100pctMaxFee(A, 3 ether, troveDebtRequest, interestRate); + uint256 oldRecordedWeightedDebt = troveManager.getTroveWeightedRecordedDebt(ATroveId); // fast-forward time such that trove is Stale @@ -1653,14 +1675,17 @@ contract InterestRateAggregate is DevTestSetup { // B applies A's pending interest applyTroveInterestPermissionless(B, ATroveId); - (uint256 entireTroveDebt, , , , ) = troveManager.getEntireDebtAndColl(ATroveId); + (uint256 entireTroveDebt,,,,) = troveManager.getEntireDebtAndColl(ATroveId); uint256 expectedNewRecordedWeightedDebt = entireTroveDebt * interestRate; // Weighted debt should have increased due to interest being applied assertGt(expectedNewRecordedWeightedDebt, oldRecordedWeightedDebt); // Expect weighted sum decreases by the old and increases by the new individual weighted Trove debt. - assertEq(activePool.aggWeightedDebtSum(), aggWeightedDebtSum_1 - oldRecordedWeightedDebt + expectedNewRecordedWeightedDebt); + assertEq( + activePool.aggWeightedDebtSum(), + aggWeightedDebtSum_1 - oldRecordedWeightedDebt + expectedNewRecordedWeightedDebt + ); } // --- getTotalSystemDebt tests --- @@ -1674,6 +1699,7 @@ contract InterestRateAggregate is DevTestSetup { uint256 entireSystemDebt_2 = troveManager.getEntireSystemDebt(); assertEq(entireSystemDebt_2, 0); } + function testGetEntireSystemDebtWithNoInterestAndNoRedistGainsReturnsSumOfTroveRecordedDebts() public { uint256 troveDebtRequest_A = 2000e18; uint256 troveDebtRequest_B = 3000e18; @@ -1682,9 +1708,9 @@ contract InterestRateAggregate is DevTestSetup { priceFeed.setPrice(2000e18); - uint256 ATroveId = openTroveNoHints100pctMaxFee(A, 20 ether, troveDebtRequest_A, interestRate); - uint256 BTroveId = openTroveNoHints100pctMaxFee(B, 20 ether, troveDebtRequest_B, interestRate); - uint256 CTroveId = openTroveNoHints100pctMaxFee(C, 20 ether, troveDebtRequest_C, interestRate); + uint256 ATroveId = openTroveNoHints100pctMaxFee(A, 20 ether, troveDebtRequest_A, interestRate); + uint256 BTroveId = openTroveNoHints100pctMaxFee(B, 20 ether, troveDebtRequest_B, interestRate); + uint256 CTroveId = openTroveNoHints100pctMaxFee(C, 20 ether, troveDebtRequest_C, interestRate); uint256 recordedDebt_A = troveManager.getTroveDebt(ATroveId); uint256 recordedDebt_B = troveManager.getTroveDebt(BTroveId); @@ -1706,9 +1732,9 @@ contract InterestRateAggregate is DevTestSetup { priceFeed.setPrice(2000e18); - uint256 ATroveId = openTroveNoHints100pctMaxFee(A, 20 ether, troveDebtRequest_A, interestRate); - uint256 BTroveId = openTroveNoHints100pctMaxFee(B, 20 ether, troveDebtRequest_B, interestRate); - uint256 CTroveId = openTroveNoHints100pctMaxFee(C, 20 ether, troveDebtRequest_C, interestRate); + uint256 ATroveId = openTroveNoHints100pctMaxFee(A, 20 ether, troveDebtRequest_A, interestRate); + uint256 BTroveId = openTroveNoHints100pctMaxFee(B, 20 ether, troveDebtRequest_B, interestRate); + uint256 CTroveId = openTroveNoHints100pctMaxFee(C, 20 ether, troveDebtRequest_C, interestRate); // Fast-forward time, accrue interest vm.warp(block.timestamp + 1 days); @@ -1729,14 +1755,12 @@ contract InterestRateAggregate is DevTestSetup { uint256 entireSystemDebt = troveManager.getEntireSystemDebt(); - uint256 sumIndividualTroveDebts = - recordedDebt_A + accruedInterest_A + - recordedDebt_B + accruedInterest_B + - recordedDebt_C + accruedInterest_C; + uint256 sumIndividualTroveDebts = + recordedDebt_A + accruedInterest_A + recordedDebt_B + accruedInterest_B + recordedDebt_C + accruedInterest_C; assertApproximatelyEqual(entireSystemDebt, sumIndividualTroveDebts, 10); } - + // TODO: more thorough invariant test // --- withdrawETHGainToTrove --- @@ -1746,7 +1770,7 @@ contract InterestRateAggregate is DevTestSetup { // fast-forward time so interest accrues vm.warp(block.timestamp + 1 days); - + uint256 aggRecordedDebt_1 = activePool.aggRecordedDebt(); assertGt(aggRecordedDebt_1, 0); uint256 pendingAggInterest = activePool.calcPendingAggInterest(); @@ -1761,7 +1785,7 @@ contract InterestRateAggregate is DevTestSetup { function testWithdrawETHGainToTroveReducesPendingAggInterestTo0() public { (uint256 ATroveId,,) = _setupForWithdrawETHGainToTrove(); - // fast-forward time so interest accrues + // fast-forward time so interest accrues vm.warp(block.timestamp + 1 days); // check there's pending agg. interest @@ -1774,7 +1798,7 @@ contract InterestRateAggregate is DevTestSetup { assertEq(activePool.calcPendingAggInterest(), 0); } - function testWithdrawETHGainToTroveMintsInterestToRouter() public { + function testWithdrawETHGainToTroveMintsInterestToRouter() public { (uint256 ATroveId,,) = _setupForWithdrawETHGainToTrove(); // fast-forward time so interest accrues @@ -1797,7 +1821,7 @@ contract InterestRateAggregate is DevTestSetup { function testWithdrawETHGainToTroveUpdatesLastAggUpdateTimeToNow() public { (uint256 ATroveId,,) = _setupForWithdrawETHGainToTrove(); - + // fast-forward time so interest accrues vm.warp(block.timestamp + 1 days); @@ -1813,7 +1837,7 @@ contract InterestRateAggregate is DevTestSetup { function testWithdrawETHGainToTroveChangesAggWeightedDebtSumCorrectly() public { (uint256 ATroveId,,) = _setupForWithdrawETHGainToTrove(); - + // fast-forward time vm.warp(block.timestamp + 1 days); @@ -1824,20 +1848,20 @@ contract InterestRateAggregate is DevTestSetup { uint256 oldRecordedWeightedDebt = troveManager.getTroveWeightedRecordedDebt(ATroveId); assertGt(oldRecordedWeightedDebt, 0); - // A withdraws ETH gain to Trove + // A withdraws ETH gain to Trove withdrawETHGainToTrove(A, ATroveId); - // Expect recorded weighted debt to have increased due to accrued Trove interest being applied + // Expect recorded weighted debt to have increased due to accrued Trove interest being applied uint256 newRecordedWeightedDebt = troveManager.getTroveWeightedRecordedDebt(ATroveId); assertGt(newRecordedWeightedDebt, oldRecordedWeightedDebt); - - // Expect weighted sum decreases by the old and increases by the new individual weighted Trove debt. + + // Expect weighted sum decreases by the old and increases by the new individual weighted Trove debt. assertEq(activePool.aggWeightedDebtSum(), weightedDebtSum_1 - oldRecordedWeightedDebt + newRecordedWeightedDebt); } function testWithdrawETHGainToTroveChangesRecordedDebtSumCorrectly() public { (uint256 ATroveId,,) = _setupForWithdrawETHGainToTrove(); - + // fast-forward time vm.warp(block.timestamp + 1 days); @@ -1856,13 +1880,13 @@ contract InterestRateAggregate is DevTestSetup { assertGt(newTroveRecordedDebt, oldTroveRecordedDebt); // Get recorded sum after, check no change - assertEq(activePool.getRecordedDebtSum(), recordedDebt_1 - oldTroveRecordedDebt + newTroveRecordedDebt); + assertEq(activePool.getRecordedDebtSum(), recordedDebt_1 - oldTroveRecordedDebt + newTroveRecordedDebt); } // --- batchLiquidateTroves (Normal Mode, offset) --- function testBatchLiquidateTrovesPureOffsetChangesAggRecordedInterestCorrectly() public { - (,,uint256 CTroveId, uint256 DTroveId) = _setupForBatchLiquidateTrovesPureOffset(); + (,, uint256 CTroveId, uint256 DTroveId) = _setupForBatchLiquidateTrovesPureOffset(); // fast-forward time so interest accrues vm.warp(block.timestamp + 1 days); @@ -1871,19 +1895,19 @@ contract InterestRateAggregate is DevTestSetup { assertGt(aggRecordedDebt_1, 0); uint256 pendingAggInterest = activePool.calcPendingAggInterest(); assertGt(pendingAggInterest, 0); - + uint256 recordedDebt_C = troveManager.getTroveDebt(CTroveId); uint256 recordedDebt_D = troveManager.getTroveDebt(DTroveId); assertGt(recordedDebt_C, 0); assertGt(recordedDebt_D, 0); uint256 recordedDebtInLiq = recordedDebt_C + recordedDebt_D; - + uint256 accruedInterest_C = troveManager.calcTroveAccruedInterest(CTroveId); uint256 accruedInterest_D = troveManager.calcTroveAccruedInterest(DTroveId); assertGt(accruedInterest_C, 0); assertGt(accruedInterest_D, 0); uint256 accruedInterestInLiq = accruedInterest_C + accruedInterest_D; - + // A liquidates C and D uint256[] memory trovesToLiq = new uint256[](2); trovesToLiq[0] = CTroveId; @@ -1893,13 +1917,16 @@ contract InterestRateAggregate is DevTestSetup { // Check both Troves were closed by liquidation assertEq(troveManager.getTroveStatus(CTroveId), 3); assertEq(troveManager.getTroveStatus(DTroveId), 3); - + // // changes agg. recorded debt by: agg_accrued_interest - liq'd_troves_recorded_trove_debts - liq'd_troves_accrued_interest - assertEq(activePool.aggRecordedDebt(), aggRecordedDebt_1 + pendingAggInterest - recordedDebtInLiq - accruedInterestInLiq); + assertEq( + activePool.aggRecordedDebt(), + aggRecordedDebt_1 + pendingAggInterest - recordedDebtInLiq - accruedInterestInLiq + ); } function testBatchLiquidateTrovesPureOffsetReducesAggPendingInterestTo0() public { - (,,uint256 CTroveId, uint256 DTroveId) = _setupForBatchLiquidateTrovesPureOffset(); + (,, uint256 CTroveId, uint256 DTroveId) = _setupForBatchLiquidateTrovesPureOffset(); // fast-forward time so interest accrues vm.warp(block.timestamp + 1 days); @@ -1917,7 +1944,7 @@ contract InterestRateAggregate is DevTestSetup { // Mints interest to Router function testBatchLiquidateTrovesPureOffsetMintsAggInterestToRouter() public { - (,,uint256 CTroveId, uint256 DTroveId) = _setupForBatchLiquidateTrovesPureOffset(); + (,, uint256 CTroveId, uint256 DTroveId) = _setupForBatchLiquidateTrovesPureOffset(); // fast-forward time so interest accrues vm.warp(block.timestamp + 1 days); @@ -1928,7 +1955,7 @@ contract InterestRateAggregate is DevTestSetup { uint256 pendingAggInterest = activePool.calcPendingAggInterest(); assertGt(pendingAggInterest, 0); - // A liquidates C and D + // A liquidates C and D uint256[] memory trovesToLiq = new uint256[](2); trovesToLiq[0] = CTroveId; trovesToLiq[1] = DTroveId; @@ -1940,7 +1967,7 @@ contract InterestRateAggregate is DevTestSetup { } function testBatchLiquidateTrovesPureOffsetUpdatesLastAggInterestUpdateTimeToNow() public { - (,,uint256 CTroveId, uint256 DTroveId) = _setupForBatchLiquidateTrovesPureOffset(); + (,, uint256 CTroveId, uint256 DTroveId) = _setupForBatchLiquidateTrovesPureOffset(); // fast-forward time so interest accrues vm.warp(block.timestamp + 1 days); @@ -1956,12 +1983,13 @@ contract InterestRateAggregate is DevTestSetup { // Check last agg update time increased to now assertEq(activePool.lastAggUpdateTime(), block.timestamp); - } // Removes liq'd troves' weighted recorded debts from the weighted recorded debt sum - function testBatchLiquidateTrovesPureOffsetRemovesLiquidatedTrovesWeightedRecordedDebtsFromWeightedRecordedDebtSum() public { - (,,uint256 CTroveId, uint256 DTroveId) = _setupForBatchLiquidateTrovesPureOffset(); + function testBatchLiquidateTrovesPureOffsetRemovesLiquidatedTrovesWeightedRecordedDebtsFromWeightedRecordedDebtSum() + public + { + (,, uint256 CTroveId, uint256 DTroveId) = _setupForBatchLiquidateTrovesPureOffset(); // fast-forward time so interest accrues vm.warp(block.timestamp + 1 days); @@ -1977,7 +2005,7 @@ contract InterestRateAggregate is DevTestSetup { assertGt(recordedTroveDebt_D, 0); assertGt(annualInterestRate_D, 0); uint256 weightedTroveDebt_D = recordedTroveDebt_D * annualInterestRate_D; - + uint256 aggWeightedDebtSum_1 = activePool.aggWeightedDebtSum(); assertGt(aggWeightedDebtSum_1, 0); @@ -1991,19 +2019,20 @@ contract InterestRateAggregate is DevTestSetup { assertEq(activePool.aggWeightedDebtSum(), aggWeightedDebtSum_1 - (weightedTroveDebt_C + weightedTroveDebt_D)); } - function testBatchLiquidateTrovesPureOffsetWithNoRedistGainRemovesLiquidatedTrovesRecordedDebtsFromRecordedDebtSum() public { - (,,uint256 CTroveId, uint256 DTroveId) = _setupForBatchLiquidateTrovesPureOffset(); + function testBatchLiquidateTrovesPureOffsetWithNoRedistGainRemovesLiquidatedTrovesRecordedDebtsFromRecordedDebtSum() + public + { + (,, uint256 CTroveId, uint256 DTroveId) = _setupForBatchLiquidateTrovesPureOffset(); // fast-forward time so interest accrues vm.warp(block.timestamp + 1 days); - uint256 recordedTroveDebt_C = troveManager.getTroveDebt(CTroveId); assertGt(recordedTroveDebt_C, 0); - + uint256 recordedTroveDebt_D = troveManager.getTroveDebt(DTroveId); assertGt(recordedTroveDebt_D, 0); - + uint256 recordedDebtSum_1 = activePool.getRecordedDebtSum(); // A liquidates C and D @@ -2019,7 +2048,7 @@ contract InterestRateAggregate is DevTestSetup { // --- // --- batchLiquidateTroves (Normal Mode, redistribution) --- function testBatchLiquidateTrovesPureRedistChangesAggRecordedInterestCorrectly() public { - (uint256 ATroveId, , uint256 CTroveId, uint256 DTroveId) = _setupForBatchLiquidateTrovesPureRedist(); + (uint256 ATroveId,, uint256 CTroveId, uint256 DTroveId) = _setupForBatchLiquidateTrovesPureRedist(); // fast-forward time so interest accrues vm.warp(block.timestamp + 1 days); @@ -2028,19 +2057,19 @@ contract InterestRateAggregate is DevTestSetup { assertGt(aggRecordedDebt_1, 0); uint256 pendingAggInterest = activePool.calcPendingAggInterest(); assertGt(pendingAggInterest, 0); - + uint256 recordedDebt_C = troveManager.getTroveDebt(CTroveId); uint256 recordedDebt_D = troveManager.getTroveDebt(DTroveId); assertGt(recordedDebt_C, 0); assertGt(recordedDebt_D, 0); uint256 recordedDebtInLiq = recordedDebt_C + recordedDebt_D; - + uint256 accruedInterest_C = troveManager.calcTroveAccruedInterest(CTroveId); uint256 accruedInterest_D = troveManager.calcTroveAccruedInterest(DTroveId); assertGt(accruedInterest_C, 0); assertGt(accruedInterest_D, 0); uint256 accruedInterestInLiq = accruedInterest_C + accruedInterest_D; - + // A liquidates C and D uint256[] memory trovesToLiq = new uint256[](2); trovesToLiq[0] = CTroveId; @@ -2052,13 +2081,16 @@ contract InterestRateAggregate is DevTestSetup { // Check both Troves were closed by liquidation assertEq(troveManager.getTroveStatus(CTroveId), 3); assertEq(troveManager.getTroveStatus(DTroveId), 3); - + // // changes agg. recorded debt by: agg_accrued_interest - liq'd_troves_recorded_trove_debts - liq'd_troves_accrued_interest - assertEq(activePool.aggRecordedDebt(), aggRecordedDebt_1 + pendingAggInterest - recordedDebtInLiq - accruedInterestInLiq); + assertEq( + activePool.aggRecordedDebt(), + aggRecordedDebt_1 + pendingAggInterest - recordedDebtInLiq - accruedInterestInLiq + ); } function testBatchLiquidateTrovesPureRedistReducesAggPendingInterestTo0() public { - (uint256 ATroveId, , uint256 CTroveId, uint256 DTroveId) = _setupForBatchLiquidateTrovesPureRedist(); + (uint256 ATroveId,, uint256 CTroveId, uint256 DTroveId) = _setupForBatchLiquidateTrovesPureRedist(); // fast-forward time so interest accrues vm.warp(block.timestamp + 1 days); @@ -2078,7 +2110,7 @@ contract InterestRateAggregate is DevTestSetup { // Mints interest to Router function testBatchLiquidateTrovesPureRedistMintsAggInterestToRouter() public { - (uint256 ATroveId, , uint256 CTroveId, uint256 DTroveId) = _setupForBatchLiquidateTrovesPureRedist(); + (uint256 ATroveId,, uint256 CTroveId, uint256 DTroveId) = _setupForBatchLiquidateTrovesPureRedist(); // fast-forward time so interest accrues vm.warp(block.timestamp + 1 days); @@ -2089,7 +2121,7 @@ contract InterestRateAggregate is DevTestSetup { uint256 pendingAggInterest = activePool.calcPendingAggInterest(); assertGt(pendingAggInterest, 0); - // A liquidates C and D + // A liquidates C and D uint256[] memory trovesToLiq = new uint256[](2); trovesToLiq[0] = CTroveId; trovesToLiq[1] = DTroveId; @@ -2103,7 +2135,7 @@ contract InterestRateAggregate is DevTestSetup { } function testBatchLiquidateTrovesPureRedistUpdatesLastAggInterestUpdateTimeToNow() public { - (uint256 ATroveId, , uint256 CTroveId, uint256 DTroveId) = _setupForBatchLiquidateTrovesPureRedist(); + (uint256 ATroveId,, uint256 CTroveId, uint256 DTroveId) = _setupForBatchLiquidateTrovesPureRedist(); // fast-forward time so interest accrues vm.warp(block.timestamp + 1 days); @@ -2121,12 +2153,13 @@ contract InterestRateAggregate is DevTestSetup { // Check last agg update time increased to now assertEq(activePool.lastAggUpdateTime(), block.timestamp); - } // Removes liq'd troves' weighted recorded debts from the weighted recorded debt sum - function testBatchLiquidateTrovesPureRedistRemovesLiquidatedTrovesWeightedRecordedDebtsFromWeightedRecordedDebtSum() public { - (uint256 ATroveId, , uint256 CTroveId, uint256 DTroveId) = _setupForBatchLiquidateTrovesPureRedist(); + function testBatchLiquidateTrovesPureRedistRemovesLiquidatedTrovesWeightedRecordedDebtsFromWeightedRecordedDebtSum() + public + { + (uint256 ATroveId,, uint256 CTroveId, uint256 DTroveId) = _setupForBatchLiquidateTrovesPureRedist(); // fast-forward time so interest accrues vm.warp(block.timestamp + 1 days); @@ -2142,7 +2175,7 @@ contract InterestRateAggregate is DevTestSetup { assertGt(recordedTroveDebt_D, 0); assertGt(annualInterestRate_D, 0); uint256 weightedTroveDebt_D = recordedTroveDebt_D * annualInterestRate_D; - + uint256 aggWeightedDebtSum_1 = activePool.aggWeightedDebtSum(); assertGt(aggWeightedDebtSum_1, 0); @@ -2158,18 +2191,20 @@ contract InterestRateAggregate is DevTestSetup { assertEq(activePool.aggWeightedDebtSum(), aggWeightedDebtSum_1 - (weightedTroveDebt_C + weightedTroveDebt_D)); } - function testBatchLiquidateTrovesPureRedistWithNoRedistGainRemovesLiquidatedTrovesRecordedDebtsFromRecordedDebtSum() public { - (uint256 ATroveId, , uint256 CTroveId, uint256 DTroveId) = _setupForBatchLiquidateTrovesPureRedist(); + function testBatchLiquidateTrovesPureRedistWithNoRedistGainRemovesLiquidatedTrovesRecordedDebtsFromRecordedDebtSum() + public + { + (uint256 ATroveId,, uint256 CTroveId, uint256 DTroveId) = _setupForBatchLiquidateTrovesPureRedist(); // fast-forward time so interest accrues vm.warp(block.timestamp + 1 days); uint256 recordedTroveDebt_C = troveManager.getTroveDebt(CTroveId); assertGt(recordedTroveDebt_C, 0); - + uint256 recordedTroveDebt_D = troveManager.getTroveDebt(DTroveId); assertGt(recordedTroveDebt_D, 0); - + uint256 recordedDebtSum_1 = activePool.getRecordedDebtSum(); // A liquidates C and D @@ -2184,8 +2219,10 @@ contract InterestRateAggregate is DevTestSetup { assertEq(activePool.getRecordedDebtSum(), recordedDebtSum_1 - (recordedTroveDebt_C + recordedTroveDebt_D)); } - function testBatchLiquidateTrovesPureRedistWithNoRedistGainAddsLiquidatedTrovesEntireDebtsToDefaultPoolDebtSum() public { - (uint256 ATroveId, , uint256 CTroveId, uint256 DTroveId) = _setupForBatchLiquidateTrovesPureRedist(); + function testBatchLiquidateTrovesPureRedistWithNoRedistGainAddsLiquidatedTrovesEntireDebtsToDefaultPoolDebtSum() + public + { + (uint256 ATroveId,, uint256 CTroveId, uint256 DTroveId) = _setupForBatchLiquidateTrovesPureRedist(); // fast-forward time so interest accrues vm.warp(block.timestamp + 1 days); @@ -2194,14 +2231,14 @@ contract InterestRateAggregate is DevTestSetup { uint256 accruedInterest_C = troveManager.calcTroveAccruedInterest(CTroveId); assertGt(recordedTroveDebt_C, 0); assertGt(accruedInterest_C, 0); - + uint256 recordedTroveDebt_D = troveManager.getTroveDebt(DTroveId); uint256 accruedInterest_D = troveManager.calcTroveAccruedInterest(CTroveId); assertGt(recordedTroveDebt_D, 0); assertGt(accruedInterest_D, 0); uint256 debtInLiq = recordedTroveDebt_C + accruedInterest_C + recordedTroveDebt_D + accruedInterest_D; - + uint256 defaultPoolDebt = defaultPool.getBoldDebt(); assertEq(defaultPoolDebt, 0); @@ -2238,7 +2275,7 @@ contract InterestRateAggregate is DevTestSetup { uint256 expectedICR = coll * price / compositeDebt; assertEq(expectedICR, troveManager.getCurrentICR(ATroveId, price)); - assertEq(expectedICR,troveManager.getTCR(price)); + assertEq(expectedICR, troveManager.getTCR(price)); } function testGetTCRReturnsSizeWeightedRatioForSystemWithMultipleTroves() public { @@ -2252,14 +2289,15 @@ contract InterestRateAggregate is DevTestSetup { uint256 interestRate = 25e16; openTroveNoHints100pctMaxFee(A, coll_A, troveDebtRequest_A, interestRate); - openTroveNoHints100pctMaxFee(B, coll_B, troveDebtRequest_B, interestRate); - openTroveNoHints100pctMaxFee(C, coll_C, troveDebtRequest_C, interestRate); + openTroveNoHints100pctMaxFee(B, coll_B, troveDebtRequest_B, interestRate); + openTroveNoHints100pctMaxFee(C, coll_C, troveDebtRequest_C, interestRate); uint256 compositeDebt_A = troveDebtRequest_A + borrowerOperations.BOLD_GAS_COMPENSATION(); uint256 compositeDebt_B = troveDebtRequest_B + borrowerOperations.BOLD_GAS_COMPENSATION(); uint256 compositeDebt_C = troveDebtRequest_C + borrowerOperations.BOLD_GAS_COMPENSATION(); - uint256 sizeWeightedCR = (coll_A + coll_B + coll_C) * price / (compositeDebt_A + compositeDebt_B + compositeDebt_C); + uint256 sizeWeightedCR = + (coll_A + coll_B + coll_C) * price / (compositeDebt_A + compositeDebt_B + compositeDebt_C); assertEq(sizeWeightedCR, troveManager.getTCR(price)); } @@ -2272,9 +2310,9 @@ contract InterestRateAggregate is DevTestSetup { uint256 ATroveId = openTroveNoHints100pctMaxFee(A, coll, troveDebtRequest, interestRate); - // Fast-forward time + // Fast-forward time vm.warp(block.timestamp + 14 days); - + uint256 troveInterest = troveManager.calcTroveAccruedInterest(ATroveId); assertGt(troveInterest, 0); @@ -2282,7 +2320,7 @@ contract InterestRateAggregate is DevTestSetup { uint256 expectedICR = coll * price / compositeDebt; assertEq(expectedICR, troveManager.getCurrentICR(ATroveId, price)); - assertEq(expectedICR,troveManager.getTCR(price)); + assertEq(expectedICR, troveManager.getTCR(price)); } function testGetTCRIncorporatesAllTroveInterestForSystemWithMultipleTroves() public { @@ -2303,14 +2341,17 @@ contract InterestRateAggregate is DevTestSetup { troveInterestRates.B = 25e16; troveInterestRates.C = 25e16; - uint256 ATroveId = openTroveNoHints100pctMaxFee(A, troveCollAmounts.A, troveDebtRequests.A, troveInterestRates.A); - // Fast-forward time + uint256 ATroveId = + openTroveNoHints100pctMaxFee(A, troveCollAmounts.A, troveDebtRequests.A, troveInterestRates.A); + // Fast-forward time vm.warp(block.timestamp + 14 days); - uint256 BTroveId = openTroveNoHints100pctMaxFee(B, troveCollAmounts.B, troveDebtRequests.B, troveInterestRates.B); - // Fast-forward time + uint256 BTroveId = + openTroveNoHints100pctMaxFee(B, troveCollAmounts.B, troveDebtRequests.B, troveInterestRates.B); + // Fast-forward time vm.warp(block.timestamp + 14 days); - uint256 CTroveId = openTroveNoHints100pctMaxFee(C, troveCollAmounts.C, troveDebtRequests.C, troveInterestRates.C); - // Fast-forward time + uint256 CTroveId = + openTroveNoHints100pctMaxFee(C, troveCollAmounts.C, troveDebtRequests.C, troveInterestRates.C); + // Fast-forward time vm.warp(block.timestamp + 14 days); troveInterests.A = troveManager.calcTroveAccruedInterest(ATroveId); @@ -2329,8 +2370,11 @@ contract InterestRateAggregate is DevTestSetup { uint256 expectedTCR = (troveCollAmounts.A + troveCollAmounts.B + troveCollAmounts.C) * price / (compositeDebt_A + compositeDebt_B + compositeDebt_C); */ uint256 gasCompensation = borrowerOperations.BOLD_GAS_COMPENSATION(); - uint256 expectedTCR = (troveCollAmounts.A + troveCollAmounts.B + troveCollAmounts.C) * priceFeed.fetchPrice() / - (troveDebtRequests.A + troveDebtRequests.B + troveDebtRequests.C + 3 * gasCompensation + troveInterests.A + troveInterests.B + troveInterests.C); + uint256 expectedTCR = (troveCollAmounts.A + troveCollAmounts.B + troveCollAmounts.C) * priceFeed.fetchPrice() + / ( + troveDebtRequests.A + troveDebtRequests.B + troveDebtRequests.C + 3 * gasCompensation + troveInterests.A + + troveInterests.B + troveInterests.C + ); assertEq(expectedTCR, troveManager.getTCR(priceFeed.fetchPrice())); } @@ -2367,7 +2411,7 @@ contract InterestRateAggregate is DevTestSetup { uint256 ATroveId = openTroveNoHints100pctMaxFee(A, coll, troveDebtRequest, interestRate); - // Fast-forward time + // Fast-forward time vm.warp(block.timestamp + 14 days); uint256 troveInterest = troveManager.calcTroveAccruedInterest(ATroveId); @@ -2447,7 +2491,7 @@ contract InterestRateAggregate is DevTestSetup { // Get A and B's recorded debts before uint256 oldRecordedDebt_A = troveManager.getTroveDebt(troveIDs.A); - uint256 oldRecordedDebt_B = troveManager.getTroveDebt(troveIDs.B); + uint256 oldRecordedDebt_B = troveManager.getTroveDebt(troveIDs.B); assertGt(oldRecordedDebt_A, 0); assertGt(oldRecordedDebt_B, 0); @@ -2461,11 +2505,12 @@ contract InterestRateAggregate is DevTestSetup { assertEq(troveManager.getTroveEntireDebt(troveIDs.C), debt_C); uint256 newRecordedDebt_A = troveManager.getTroveDebt(troveIDs.A); - uint256 newRecordedDebt_B = troveManager.getTroveDebt(troveIDs.B); + uint256 newRecordedDebt_B = troveManager.getTroveDebt(troveIDs.B); assertNotEq(oldRecordedDebt_A, newRecordedDebt_A); assertNotEq(oldRecordedDebt_B, newRecordedDebt_B); - uint256 expectedRecordedDebtSum = recordedDebtSum_1 + newRecordedDebt_A + newRecordedDebt_B - oldRecordedDebt_A - oldRecordedDebt_B; + uint256 expectedRecordedDebtSum = + recordedDebtSum_1 + newRecordedDebt_A + newRecordedDebt_B - oldRecordedDebt_A - oldRecordedDebt_B; // Check recorded debt sum has changed correctly assertEq(activePool.getRecordedDebtSum(), expectedRecordedDebtSum); @@ -2479,7 +2524,7 @@ contract InterestRateAggregate is DevTestSetup { // Get A and B's weighted debts before uint256 oldWeightedRecordedDebt_A = troveManager.getTroveWeightedRecordedDebt(troveIDs.A); - uint256 oldWeightedRecordedDebt_B = troveManager.getTroveWeightedRecordedDebt(troveIDs.B); + uint256 oldWeightedRecordedDebt_B = troveManager.getTroveWeightedRecordedDebt(troveIDs.B); assertGt(oldWeightedRecordedDebt_A, 0); assertGt(oldWeightedRecordedDebt_B, 0); @@ -2493,16 +2538,12 @@ contract InterestRateAggregate is DevTestSetup { assertEq(troveManager.getTroveEntireDebt(troveIDs.C), debt_C); uint256 newWeightedRecordedDebt_A = troveManager.getTroveWeightedRecordedDebt(troveIDs.A); - uint256 newWeightedRecordedDebt_B = troveManager.getTroveWeightedRecordedDebt(troveIDs.B); + uint256 newWeightedRecordedDebt_B = troveManager.getTroveWeightedRecordedDebt(troveIDs.B); assertNotEq(oldWeightedRecordedDebt_A, newWeightedRecordedDebt_A); assertNotEq(oldWeightedRecordedDebt_B, newWeightedRecordedDebt_B); - uint256 expectedAggWeightedRecordedDebt = - aggWeightedDebtSum_1 + - newWeightedRecordedDebt_A + - newWeightedRecordedDebt_B - - oldWeightedRecordedDebt_A - - oldWeightedRecordedDebt_B; + uint256 expectedAggWeightedRecordedDebt = aggWeightedDebtSum_1 + newWeightedRecordedDebt_A + + newWeightedRecordedDebt_B - oldWeightedRecordedDebt_A - oldWeightedRecordedDebt_B; // Check recorded debt sum has changed correctly assertEq(activePool.aggWeightedDebtSum(), expectedAggWeightedRecordedDebt); @@ -2511,6 +2552,6 @@ contract InterestRateAggregate is DevTestSetup { // TODO: mixed collateral & debt adjustment opps // TODO: tests with pending debt redist. gain >0 // TODO: tests that show total debt change under user ops - // TODO: Test total debt invariant holds i.e. (D + S * delta_T) == sum_of_all_entire_trove_debts in + // TODO: Test total debt invariant holds i.e. (D + S * delta_T) == sum_of_all_entire_trove_debts in // more complex sequences of borrower ops and time passing } diff --git a/contracts/src/test/interestRateBasic.t.sol b/contracts/src/test/interestRateBasic.t.sol index 2f2c2fca..9ce642ab 100644 --- a/contracts/src/test/interestRateBasic.t.sol +++ b/contracts/src/test/interestRateBasic.t.sol @@ -2,22 +2,20 @@ pragma solidity 0.8.18; import "./TestContracts/DevTestSetup.sol"; - contract InterestRateBasic is DevTestSetup { - function testOpenTroveSetsInterestRate() public { priceFeed.setPrice(2000e18); - uint256 ATroveId = openTroveNoHints100pctMaxFee(A, 2 ether, 2000e18, 0); + uint256 ATroveId = openTroveNoHints100pctMaxFee(A, 2 ether, 2000e18, 0); assertEq(troveManager.getTroveAnnualInterestRate(ATroveId), 0); - uint256 BTroveId = openTroveNoHints100pctMaxFee(B, 2 ether, 2000e18, 1); + uint256 BTroveId = openTroveNoHints100pctMaxFee(B, 2 ether, 2000e18, 1); assertEq(troveManager.getTroveAnnualInterestRate(BTroveId), 1); - uint256 CTroveId = openTroveNoHints100pctMaxFee(C, 2 ether, 2000e18, 37e16); + uint256 CTroveId = openTroveNoHints100pctMaxFee(C, 2 ether, 2000e18, 37e16); assertEq(troveManager.getTroveAnnualInterestRate(CTroveId), 37e16); - uint256 DTroveId = openTroveNoHints100pctMaxFee(D, 2 ether, 2000e18, 1e18); + uint256 DTroveId = openTroveNoHints100pctMaxFee(D, 2 ether, 2000e18, 1e18); assertEq(troveManager.getTroveAnnualInterestRate(DTroveId), 1e18); } @@ -26,11 +24,11 @@ contract InterestRateBasic is DevTestSetup { assertEq(troveManager.getTroveLastDebtUpdateTime(addressToTroveId(A)), 0); assertEq(troveManager.getTroveLastDebtUpdateTime(addressToTroveId(B)), 0); - uint256 ATroveId = openTroveNoHints100pctMaxFee(A, 2 ether, 2000e18, 0); + uint256 ATroveId = openTroveNoHints100pctMaxFee(A, 2 ether, 2000e18, 0); assertEq(troveManager.getTroveLastDebtUpdateTime(ATroveId), block.timestamp); vm.warp(block.timestamp + 1000); - uint256 BTroveId = openTroveNoHints100pctMaxFee(B, 2 ether, 2000e18, 1); + uint256 BTroveId = openTroveNoHints100pctMaxFee(B, 2 ether, 2000e18, 1); assertEq(troveManager.getTroveLastDebtUpdateTime(BTroveId), block.timestamp); } @@ -45,8 +43,8 @@ contract InterestRateBasic is DevTestSetup { uint256 interestRate_E = 4e17; // B and D open - uint256 BTroveId = openTroveNoHints100pctMaxFee(B, 2 ether, 2000e18, interestRate_B); - uint256 DTroveId = openTroveNoHints100pctMaxFee(D, 2 ether, 2000e18, interestRate_D); + uint256 BTroveId = openTroveNoHints100pctMaxFee(B, 2 ether, 2000e18, interestRate_B); + uint256 DTroveId = openTroveNoHints100pctMaxFee(D, 2 ether, 2000e18, interestRate_D); // Check initial list order - expect [B, D] // B @@ -57,22 +55,21 @@ contract InterestRateBasic is DevTestSetup { assertEq(sortedTroves.getPrev(DTroveId), 0); // head // C opens. Expect to be inserted between B and D - uint256 CTroveId = openTroveNoHints100pctMaxFee(C, 2 ether, 2000e18, interestRate_C); + uint256 CTroveId = openTroveNoHints100pctMaxFee(C, 2 ether, 2000e18, interestRate_C); assertEq(sortedTroves.getNext(CTroveId), BTroveId); assertEq(sortedTroves.getPrev(CTroveId), DTroveId); // A opens. Expect to be inserted at the tail, below B - uint256 ATroveId = openTroveNoHints100pctMaxFee(A, 2 ether, 2000e18, interestRate_A); + uint256 ATroveId = openTroveNoHints100pctMaxFee(A, 2 ether, 2000e18, interestRate_A); assertEq(sortedTroves.getNext(ATroveId), 0); assertEq(sortedTroves.getPrev(ATroveId), BTroveId); // E opens. Expect to be inserted at the head, above D - uint256 ETroveId = openTroveNoHints100pctMaxFee(E, 2 ether, 2000e18, interestRate_E); + uint256 ETroveId = openTroveNoHints100pctMaxFee(E, 2 ether, 2000e18, interestRate_E); assertEq(sortedTroves.getNext(ETroveId), DTroveId); assertEq(sortedTroves.getPrev(ETroveId), 0); } - function testRevertWhenOpenTroveWithInterestRateGreaterThanMax() public { priceFeed.setPrice(2000e18); @@ -88,7 +85,7 @@ contract InterestRateBasic is DevTestSetup { priceFeed.setPrice(2000e18); // A opens Trove - uint256 A_Id = openTroveNoHints100pctMaxFee(A, 2 ether, 2000e18, 37e16); + uint256 A_Id = openTroveNoHints100pctMaxFee(A, 2 ether, 2000e18, 37e16); assertEq(troveManager.getTroveAnnualInterestRate(A_Id), 37e16); // B (who is not delegate) tries to adjust it @@ -102,7 +99,7 @@ contract InterestRateBasic is DevTestSetup { priceFeed.setPrice(2000e18); // A opens Trove with valid annual interest rate ... - uint256 ATroveId = openTroveNoHints100pctMaxFee(A, 2 ether, 2000e18, 37e16); + uint256 ATroveId = openTroveNoHints100pctMaxFee(A, 2 ether, 2000e18, 37e16); assertEq(troveManager.getTroveAnnualInterestRate(ATroveId), 37e16); // ... then tries to adjust it to an invalid value @@ -120,9 +117,9 @@ contract InterestRateBasic is DevTestSetup { priceFeed.setPrice(2000e18); // A, B, C opens Troves with valid annual interest rates - uint256 ATroveId = openTroveNoHints100pctMaxFee(A, 2 ether, 2000e18, 5e17); - uint256 BTroveId = openTroveNoHints100pctMaxFee(B, 2 ether, 2000e18, 5e17); - uint256 CTroveId = openTroveNoHints100pctMaxFee(C, 2 ether, 2000e18, 5e17); + uint256 ATroveId = openTroveNoHints100pctMaxFee(A, 2 ether, 2000e18, 5e17); + uint256 BTroveId = openTroveNoHints100pctMaxFee(B, 2 ether, 2000e18, 5e17); + uint256 CTroveId = openTroveNoHints100pctMaxFee(C, 2 ether, 2000e18, 5e17); assertEq(troveManager.getTroveAnnualInterestRate(ATroveId), 5e17); assertEq(troveManager.getTroveAnnualInterestRate(BTroveId), 5e17); assertEq(troveManager.getTroveAnnualInterestRate(CTroveId), 5e17); @@ -140,7 +137,7 @@ contract InterestRateBasic is DevTestSetup { function testAdjustTroveInterestRateSetsTroveLastDebtUpdateTimeToNow() public { priceFeed.setPrice(2000e18); - uint256 ATroveId = openTroveNoHints100pctMaxFee(A, 2 ether, 2000e18, 5e17); + uint256 ATroveId = openTroveNoHints100pctMaxFee(A, 2 ether, 2000e18, 5e17); vm.warp(block.timestamp + 1 days); @@ -154,7 +151,7 @@ contract InterestRateBasic is DevTestSetup { function testAdjustTroveInterestRateSetsReducesPendingInterestTo0() public { priceFeed.setPrice(2000e18); - uint256 ATroveId = openTroveNoHints100pctMaxFee(A, 2 ether, 2000e18, 5e17); + uint256 ATroveId = openTroveNoHints100pctMaxFee(A, 2 ether, 2000e18, 5e17); vm.warp(block.timestamp + 1 days); @@ -168,23 +165,23 @@ contract InterestRateBasic is DevTestSetup { function testAdjustTroveInterestRateDoesNotChangeEntireTroveDebt() public { priceFeed.setPrice(2000e18); - uint256 ATroveId = openTroveNoHints100pctMaxFee(A, 2 ether, 2000e18, 5e17); + uint256 ATroveId = openTroveNoHints100pctMaxFee(A, 2 ether, 2000e18, 5e17); vm.warp(block.timestamp + 1 days); - (uint256 entireTroveDebt_1, , , , ) = troveManager.getEntireDebtAndColl(ATroveId); + (uint256 entireTroveDebt_1,,,,) = troveManager.getEntireDebtAndColl(ATroveId); assertGt(entireTroveDebt_1, 0); changeInterestRateNoHints(A, ATroveId, 75e16); - (uint256 entireTroveDebt_2, , , , ) = troveManager.getEntireDebtAndColl(ATroveId); + (uint256 entireTroveDebt_2,,,,) = troveManager.getEntireDebtAndColl(ATroveId); assertEq(entireTroveDebt_1, entireTroveDebt_2); } function testAdjustTroveInterestRateNoRedistGainsIncreasesRecordedDebtByAccruedInterest() public { priceFeed.setPrice(2000e18); - uint256 ATroveId = openTroveNoHints100pctMaxFee(A, 2 ether, 2000e18, 5e17); + uint256 ATroveId = openTroveNoHints100pctMaxFee(A, 2 ether, 2000e18, 5e17); vm.warp(block.timestamp + 1 days); @@ -201,11 +198,11 @@ contract InterestRateBasic is DevTestSetup { function testAdjustTroveInterestRateInsertsToCorrectPositionInSortedList() public { priceFeed.setPrice(2000e18); - uint256 ATroveId = openTroveNoHints100pctMaxFee(A, 2 ether, 2000e18, 1e17); - uint256 BTroveId = openTroveNoHints100pctMaxFee(B, 2 ether, 2000e18, 2e17); - uint256 CTroveId = openTroveNoHints100pctMaxFee(C, 2 ether, 2000e18, 3e17); - uint256 DTroveId = openTroveNoHints100pctMaxFee(D, 2 ether, 2000e18, 4e17); - uint256 ETroveId = openTroveNoHints100pctMaxFee(E, 2 ether, 2000e18, 5e17); + uint256 ATroveId = openTroveNoHints100pctMaxFee(A, 2 ether, 2000e18, 1e17); + uint256 BTroveId = openTroveNoHints100pctMaxFee(B, 2 ether, 2000e18, 2e17); + uint256 CTroveId = openTroveNoHints100pctMaxFee(C, 2 ether, 2000e18, 3e17); + uint256 DTroveId = openTroveNoHints100pctMaxFee(D, 2 ether, 2000e18, 4e17); + uint256 ETroveId = openTroveNoHints100pctMaxFee(E, 2 ether, 2000e18, 5e17); // Check initial sorted list order - expect [A:10%, B:02%, C:30%, D:40%, E:50%] // A @@ -244,11 +241,11 @@ contract InterestRateBasic is DevTestSetup { priceFeed.setPrice(2000e18); // Troves opened in ascending order of interest rate - uint256 ATroveId = openTroveNoHints100pctMaxFee(A, 2 ether, 2000e18, 1e17); - uint256 BTroveId = openTroveNoHints100pctMaxFee(B, 2 ether, 2000e18, 2e17); - uint256 CTroveId = openTroveNoHints100pctMaxFee(C, 2 ether, 2000e18, 3e17); - uint256 DTroveId = openTroveNoHints100pctMaxFee(D, 2 ether, 2000e18, 4e17); - uint256 ETroveId = openTroveNoHints100pctMaxFee(E, 2 ether, 2000e18, 5e17); + uint256 ATroveId = openTroveNoHints100pctMaxFee(A, 2 ether, 2000e18, 1e17); + uint256 BTroveId = openTroveNoHints100pctMaxFee(B, 2 ether, 2000e18, 2e17); + uint256 CTroveId = openTroveNoHints100pctMaxFee(C, 2 ether, 2000e18, 3e17); + uint256 DTroveId = openTroveNoHints100pctMaxFee(D, 2 ether, 2000e18, 4e17); + uint256 ETroveId = openTroveNoHints100pctMaxFee(E, 2 ether, 2000e18, 5e17); // Check A's neighbors assertEq(sortedTroves.getNext(ATroveId), 0); // tail @@ -292,7 +289,7 @@ contract InterestRateBasic is DevTestSetup { uint256 interestRate = 25e16; uint256 boldWithdrawal = 500e18; - uint256 ATroveId = openTroveNoHints100pctMaxFee(A, 3 ether, troveDebtRequest, interestRate); + uint256 ATroveId = openTroveNoHints100pctMaxFee(A, 3 ether, troveDebtRequest, interestRate); vm.warp(block.timestamp + 1 days); @@ -309,7 +306,7 @@ contract InterestRateBasic is DevTestSetup { uint256 interestRate = 25e16; uint256 boldWithdrawal = 500e18; - uint256 ATroveId = openTroveNoHints100pctMaxFee(A, 3 ether, troveDebtRequest, interestRate); + uint256 ATroveId = openTroveNoHints100pctMaxFee(A, 3 ether, troveDebtRequest, interestRate); vm.warp(block.timestamp + 1 days); @@ -327,17 +324,17 @@ contract InterestRateBasic is DevTestSetup { uint256 interestRate = 25e16; uint256 boldWithdrawal = 500e18; - uint256 ATroveId = openTroveNoHints100pctMaxFee(A, 3 ether, troveDebtRequest, interestRate); + uint256 ATroveId = openTroveNoHints100pctMaxFee(A, 3 ether, troveDebtRequest, interestRate); vm.warp(block.timestamp + 1 days); - (uint256 entireTroveDebt_1, , , , ) = troveManager.getEntireDebtAndColl(ATroveId); + (uint256 entireTroveDebt_1,,,,) = troveManager.getEntireDebtAndColl(ATroveId); assertGt(entireTroveDebt_1, 0); // A draws more debt withdrawBold100pctMaxFee(A, ATroveId, boldWithdrawal); - (uint256 entireTroveDebt_2, , , , ) = troveManager.getEntireDebtAndColl(ATroveId); + (uint256 entireTroveDebt_2,,,,) = troveManager.getEntireDebtAndColl(ATroveId); assertEq(entireTroveDebt_2, entireTroveDebt_1 + boldWithdrawal); } @@ -348,7 +345,7 @@ contract InterestRateBasic is DevTestSetup { uint256 interestRate = 25e16; uint256 boldWithdrawal = 500e18; - uint256 ATroveId = openTroveNoHints100pctMaxFee(A, 3 ether, troveDebtRequest, interestRate); + uint256 ATroveId = openTroveNoHints100pctMaxFee(A, 3 ether, troveDebtRequest, interestRate); vm.warp(block.timestamp + 1 days); @@ -371,7 +368,7 @@ contract InterestRateBasic is DevTestSetup { uint256 interestRate = 25e16; uint256 boldRepayment = 500e18; - uint256 ATroveId = openTroveNoHints100pctMaxFee(A, 3 ether, troveDebtRequest, interestRate); + uint256 ATroveId = openTroveNoHints100pctMaxFee(A, 3 ether, troveDebtRequest, interestRate); vm.warp(block.timestamp + 1 days); @@ -389,7 +386,7 @@ contract InterestRateBasic is DevTestSetup { uint256 interestRate = 25e16; uint256 boldRepayment = 500e18; - uint256 ATroveId = openTroveNoHints100pctMaxFee(A, 3 ether, troveDebtRequest, interestRate); + uint256 ATroveId = openTroveNoHints100pctMaxFee(A, 3 ether, troveDebtRequest, interestRate); vm.warp(block.timestamp + 1 days); @@ -407,18 +404,17 @@ contract InterestRateBasic is DevTestSetup { uint256 interestRate = 25e16; uint256 boldRepayment = 500e18; - uint256 ATroveId = openTroveNoHints100pctMaxFee(A, 3 ether, troveDebtRequest, interestRate); + uint256 ATroveId = openTroveNoHints100pctMaxFee(A, 3 ether, troveDebtRequest, interestRate); vm.warp(block.timestamp + 1 days); - (uint256 entireTroveDebt_1, , , , ) = troveManager.getEntireDebtAndColl(ATroveId); + (uint256 entireTroveDebt_1,,,,) = troveManager.getEntireDebtAndColl(ATroveId); assertGt(entireTroveDebt_1, 0); // A repays bold repayBold(A, ATroveId, boldRepayment); - (uint256 entireTroveDebt_2, , , , ) = troveManager.getEntireDebtAndColl(ATroveId); - + (uint256 entireTroveDebt_2,,,,) = troveManager.getEntireDebtAndColl(ATroveId); assertEq(entireTroveDebt_2, entireTroveDebt_1 - boldRepayment); } @@ -429,7 +425,7 @@ contract InterestRateBasic is DevTestSetup { uint256 interestRate = 25e16; uint256 boldRepayment = 500e18; - uint256 ATroveId = openTroveNoHints100pctMaxFee(A, 3 ether, troveDebtRequest, interestRate); + uint256 ATroveId = openTroveNoHints100pctMaxFee(A, 3 ether, troveDebtRequest, interestRate); vm.warp(block.timestamp + 1 days); @@ -452,7 +448,7 @@ contract InterestRateBasic is DevTestSetup { uint256 interestRate = 25e16; uint256 collIncrease = 1 ether; - uint256 ATroveId = openTroveNoHints100pctMaxFee(A, 3 ether, troveDebtRequest, interestRate); + uint256 ATroveId = openTroveNoHints100pctMaxFee(A, 3 ether, troveDebtRequest, interestRate); vm.warp(block.timestamp + 1 days); @@ -470,7 +466,7 @@ contract InterestRateBasic is DevTestSetup { uint256 interestRate = 25e16; uint256 collIncrease = 1 ether; - uint256 ATroveId = openTroveNoHints100pctMaxFee(A, 3 ether, troveDebtRequest, interestRate); + uint256 ATroveId = openTroveNoHints100pctMaxFee(A, 3 ether, troveDebtRequest, interestRate); vm.warp(block.timestamp + 1 days); @@ -488,17 +484,17 @@ contract InterestRateBasic is DevTestSetup { uint256 interestRate = 25e16; uint256 collIncrease = 1 ether; - uint256 ATroveId = openTroveNoHints100pctMaxFee(A, 3 ether, troveDebtRequest, interestRate); + uint256 ATroveId = openTroveNoHints100pctMaxFee(A, 3 ether, troveDebtRequest, interestRate); vm.warp(block.timestamp + 1 days); - (uint256 entireTroveDebt_1, , , , ) = troveManager.getEntireDebtAndColl(ATroveId); + (uint256 entireTroveDebt_1,,,,) = troveManager.getEntireDebtAndColl(ATroveId); assertGt(entireTroveDebt_1, 0); // A adds coll addColl(A, ATroveId, collIncrease); - (uint256 entireTroveDebt_2, , , , ) = troveManager.getEntireDebtAndColl(ATroveId); + (uint256 entireTroveDebt_2,,,,) = troveManager.getEntireDebtAndColl(ATroveId); assertEq(entireTroveDebt_2, entireTroveDebt_1); } @@ -509,7 +505,7 @@ contract InterestRateBasic is DevTestSetup { uint256 interestRate = 25e16; uint256 collIncrease = 1 ether; - uint256 ATroveId = openTroveNoHints100pctMaxFee(A, 3 ether, troveDebtRequest, interestRate); + uint256 ATroveId = openTroveNoHints100pctMaxFee(A, 3 ether, troveDebtRequest, interestRate); vm.warp(block.timestamp + 1 days); @@ -532,7 +528,7 @@ contract InterestRateBasic is DevTestSetup { uint256 interestRate = 25e16; uint256 collDecrease = 1 ether; - uint256 ATroveId = openTroveNoHints100pctMaxFee(A, 3 ether, troveDebtRequest, interestRate); + uint256 ATroveId = openTroveNoHints100pctMaxFee(A, 3 ether, troveDebtRequest, interestRate); vm.warp(block.timestamp + 1 days); @@ -550,7 +546,7 @@ contract InterestRateBasic is DevTestSetup { uint256 interestRate = 25e16; uint256 collDecrease = 1 ether; - uint256 ATroveId = openTroveNoHints100pctMaxFee(A, 3 ether, troveDebtRequest, interestRate); + uint256 ATroveId = openTroveNoHints100pctMaxFee(A, 3 ether, troveDebtRequest, interestRate); vm.warp(block.timestamp + 1 days); @@ -568,17 +564,17 @@ contract InterestRateBasic is DevTestSetup { uint256 interestRate = 25e16; uint256 collDecrease = 1 ether; - uint256 ATroveId = openTroveNoHints100pctMaxFee(A, 3 ether, troveDebtRequest, interestRate); + uint256 ATroveId = openTroveNoHints100pctMaxFee(A, 3 ether, troveDebtRequest, interestRate); vm.warp(block.timestamp + 1 days); - (uint256 entireTroveDebt_1, , , , ) = troveManager.getEntireDebtAndColl(ATroveId); - assertGt(entireTroveDebt_1, 0); + (uint256 entireTroveDebt_1,,,,) = troveManager.getEntireDebtAndColl(ATroveId); + assertGt(entireTroveDebt_1, 0); // A withdraws coll withdrawColl(A, ATroveId, collDecrease); - (uint256 entireTroveDebt_2, , , , ) = troveManager.getEntireDebtAndColl(ATroveId); + (uint256 entireTroveDebt_2,,,,) = troveManager.getEntireDebtAndColl(ATroveId); assertEq(entireTroveDebt_2, entireTroveDebt_1); } @@ -589,7 +585,7 @@ contract InterestRateBasic is DevTestSetup { uint256 interestRate = 25e16; uint256 collDecrease = 1 ether; - uint256 ATroveId = openTroveNoHints100pctMaxFee(A, 3 ether, troveDebtRequest, interestRate); + uint256 ATroveId = openTroveNoHints100pctMaxFee(A, 3 ether, troveDebtRequest, interestRate); vm.warp(block.timestamp + 1 days); @@ -611,7 +607,7 @@ contract InterestRateBasic is DevTestSetup { uint256 troveDebtRequest = 2000e18; uint256 interestRate = 25e16; - uint256 ATroveId = openTroveNoHints100pctMaxFee(A, 3 ether, troveDebtRequest, interestRate); + uint256 ATroveId = openTroveNoHints100pctMaxFee(A, 3 ether, troveDebtRequest, interestRate); // Fast-forward time such that trove is Stale vm.warp(block.timestamp + 90 days + 1); @@ -631,7 +627,7 @@ contract InterestRateBasic is DevTestSetup { uint256 troveDebtRequest = 2000e18; uint256 interestRate = 25e16; - uint256 ATroveId = openTroveNoHints100pctMaxFee(A, 3 ether, troveDebtRequest, interestRate); + uint256 ATroveId = openTroveNoHints100pctMaxFee(A, 3 ether, troveDebtRequest, interestRate); // Fast-forward time such that trove is Stale vm.warp(block.timestamp + 90 days + 1); @@ -651,20 +647,20 @@ contract InterestRateBasic is DevTestSetup { uint256 troveDebtRequest = 2000e18; uint256 interestRate = 25e16; - uint256 ATroveId = openTroveNoHints100pctMaxFee(A, 3 ether, troveDebtRequest, interestRate); + uint256 ATroveId = openTroveNoHints100pctMaxFee(A, 3 ether, troveDebtRequest, interestRate); - // Fast-forward time such that trove is Stale + // Fast-forward time such that trove is Stale vm.warp(block.timestamp + 90 days + 1); // Confirm Trove is stale assertTrue(troveManager.troveIsStale(ATroveId)); - (uint256 entireTroveDebt_1, , , , ) = troveManager.getEntireDebtAndColl(ATroveId); - assertGt(entireTroveDebt_1, 0); + (uint256 entireTroveDebt_1,,,,) = troveManager.getEntireDebtAndColl(ATroveId); + assertGt(entireTroveDebt_1, 0); // B applies A's pending interest applyTroveInterestPermissionless(B, ATroveId); - (uint256 entireTroveDebt_2, , , , ) = troveManager.getEntireDebtAndColl(ATroveId); + (uint256 entireTroveDebt_2,,,,) = troveManager.getEntireDebtAndColl(ATroveId); assertEq(entireTroveDebt_2, entireTroveDebt_1); } @@ -674,7 +670,7 @@ contract InterestRateBasic is DevTestSetup { uint256 troveDebtRequest = 2000e18; uint256 interestRate = 25e16; - uint256 ATroveId = openTroveNoHints100pctMaxFee(A, 3 ether, troveDebtRequest, interestRate); + uint256 ATroveId = openTroveNoHints100pctMaxFee(A, 3 ether, troveDebtRequest, interestRate); // Fast-forward time such that trove is Stale vm.warp(block.timestamp + 90 days + 1); @@ -697,7 +693,7 @@ contract InterestRateBasic is DevTestSetup { uint256 troveDebtRequest = 2000e18; uint256 interestRate = 25e16; - uint256 ATroveId = openTroveNoHints100pctMaxFee(A, 3 ether, troveDebtRequest, interestRate); + uint256 ATroveId = openTroveNoHints100pctMaxFee(A, 3 ether, troveDebtRequest, interestRate); // No time passes. B tries to apply A's interest. expect revert vm.startPrank(B); @@ -718,8 +714,8 @@ contract InterestRateBasic is DevTestSetup { // --- withdrawETHGainToTrove tests --- - function testWithdrawETHGainToTroveSetsTroveLastDebtUpdateTimeToNow() public { - (uint256 ATroveId,,) = _setupForWithdrawETHGainToTrove(); + function testWithdrawETHGainToTroveSetsTroveLastDebtUpdateTimeToNow() public { + (uint256 ATroveId,,) = _setupForWithdrawETHGainToTrove(); // Fast-forward time vm.warp(block.timestamp + 1 days); @@ -735,8 +731,8 @@ contract InterestRateBasic is DevTestSetup { function testWithdrawETHGainToTroveReducesTroveAccruedInterestTo0() public { (uint256 ATroveId,,) = _setupForWithdrawETHGainToTrove(); - // Fast-forward time - vm.warp(block.timestamp + 1 days); + // Fast-forward time + vm.warp(block.timestamp + 1 days); assertGt(troveManager.calcTroveAccruedInterest(ATroveId), 0); @@ -752,13 +748,13 @@ contract InterestRateBasic is DevTestSetup { // Fast-forward time vm.warp(block.timestamp + 90 days); - (uint256 entireTroveDebt_1, , , , ) = troveManager.getEntireDebtAndColl(ATroveId); + (uint256 entireTroveDebt_1,,,,) = troveManager.getEntireDebtAndColl(ATroveId); assertGt(entireTroveDebt_1, 0); // A withdraws ETH gain to Trove withdrawETHGainToTrove(A, ATroveId); - (uint256 entireTroveDebt_2, , , , ) = troveManager.getEntireDebtAndColl(ATroveId); + (uint256 entireTroveDebt_2,,,,) = troveManager.getEntireDebtAndColl(ATroveId); assertEq(entireTroveDebt_2, entireTroveDebt_1); } diff --git a/contracts/src/test/redemptions.t.sol b/contracts/src/test/redemptions.t.sol index 8acf5f4d..2d9740b2 100644 --- a/contracts/src/test/redemptions.t.sol +++ b/contracts/src/test/redemptions.t.sol @@ -2,9 +2,7 @@ pragma solidity 0.8.18; import "./TestContracts/DevTestSetup.sol"; - contract Redemptions is DevTestSetup { - function testRedemptionIsInOrderOfInterestRate() public { (uint256 coll, uint256 debtRequest, TroveIDs memory troveIDs) = _setupForRedemption(); @@ -18,7 +16,7 @@ contract Redemptions is DevTestSetup { redeem(E, redeemAmount_1); // Check A's Trove debt equals gas comp - assertEq(troveManager.getTroveEntireDebt(troveIDs.A), troveManager.BOLD_GAS_COMPENSATION()); + assertEq(troveManager.getTroveEntireDebt(troveIDs.A), troveManager.BOLD_GAS_COMPENSATION()); // Check B coll and debt reduced assertLt(troveManager.getTroveEntireDebt(troveIDs.B), debt_B); assertLt(troveManager.getTroveEntireColl(troveIDs.B), coll); @@ -34,7 +32,7 @@ contract Redemptions is DevTestSetup { redeem(E, redeemAmount_2); // Check A's Trove debt equals gas comp - assertEq(troveManager.getTroveEntireDebt(troveIDs.B), troveManager.BOLD_GAS_COMPENSATION()); + assertEq(troveManager.getTroveEntireDebt(troveIDs.B), troveManager.BOLD_GAS_COMPENSATION()); // Check C coll and debt reduced assertLt(troveManager.getTroveEntireDebt(troveIDs.C), debt_C); assertLt(troveManager.getTroveEntireColl(troveIDs.C), coll); @@ -70,9 +68,9 @@ contract Redemptions is DevTestSetup { redeem(E, redeemAmount_1); // Check A and B's Trove debt equals gas comp - assertEq(troveManager.getTroveEntireDebt(troveIDs.A), troveManager.BOLD_GAS_COMPENSATION()); + assertEq(troveManager.getTroveEntireDebt(troveIDs.A), troveManager.BOLD_GAS_COMPENSATION()); assertEq(troveManager.getTroveEntireDebt(troveIDs.B), troveManager.BOLD_GAS_COMPENSATION()); - } + } function testFullRedemptionSkipsTrovesAtGasCompDebt() public { (uint256 coll, uint256 debtRequest, TroveIDs memory troveIDs) = _setupForRedemption(); @@ -86,7 +84,7 @@ contract Redemptions is DevTestSetup { redeem(E, redeemAmount_1); // Check A and B's Trove debt equals gas comp - assertEq(troveManager.getTroveEntireDebt(troveIDs.A), troveManager.BOLD_GAS_COMPENSATION()); + assertEq(troveManager.getTroveEntireDebt(troveIDs.A), troveManager.BOLD_GAS_COMPENSATION()); assertEq(troveManager.getTroveEntireDebt(troveIDs.B), troveManager.BOLD_GAS_COMPENSATION()); // E redeems again, enough to partially redeem C @@ -96,20 +94,21 @@ contract Redemptions is DevTestSetup { // Check A and B still open with debt == gas comp assertEq(troveManager.getTroveStatus(troveIDs.A), 1); // Status active assertEq(troveManager.getTroveStatus(troveIDs.B), 1); // Status active - assertEq(troveManager.getTroveEntireDebt(troveIDs.A), troveManager.BOLD_GAS_COMPENSATION()); + assertEq(troveManager.getTroveEntireDebt(troveIDs.A), troveManager.BOLD_GAS_COMPENSATION()); assertEq(troveManager.getTroveEntireDebt(troveIDs.B), troveManager.BOLD_GAS_COMPENSATION()); // Check C's debt and coll reduced assertLt(troveManager.getTroveEntireDebt(troveIDs.C), debt_C); assertLt(troveManager.getTroveEntireColl(troveIDs.C), coll); - } + } // - Accrued Trove interest contributes to redee into debt of a redeemed trove function testRedemptionIncludesAccruedTroveInterest() public { (uint256 coll, uint256 debtRequest, TroveIDs memory troveIDs) = _setupForRedemption(); - (uint256 entireDebt_A, , uint256 redistDebtGain_A, , uint accruedInterest_A) = troveManager.getEntireDebtAndColl(troveIDs.A); + (uint256 entireDebt_A,, uint256 redistDebtGain_A,, uint256 accruedInterest_A) = + troveManager.getEntireDebtAndColl(troveIDs.A); assertGt(accruedInterest_A, 0); assertEq(redistDebtGain_A, 0); @@ -117,19 +116,19 @@ contract Redemptions is DevTestSetup { uint256 debt_B = troveManager.getTroveEntireDebt(troveIDs.B); // E redeems again, enough to fully redeem A (recorded debt + interest - gas comp), without touching the next trove B - uint256 redeemAmount = troveManager.getTroveDebt(troveIDs.A) + accruedInterest_A - troveManager.BOLD_GAS_COMPENSATION(); + uint256 redeemAmount = + troveManager.getTroveDebt(troveIDs.A) + accruedInterest_A - troveManager.BOLD_GAS_COMPENSATION(); redeem(E, redeemAmount); // Check A reduced down to gas comp - assertEq(troveManager.getTroveEntireDebt(troveIDs.A), troveManager.BOLD_GAS_COMPENSATION()); + assertEq(troveManager.getTroveEntireDebt(troveIDs.A), troveManager.BOLD_GAS_COMPENSATION()); // Check B's debt unchanged assertEq(troveManager.getTroveEntireDebt(troveIDs.B), debt_B); } - // TODO: + // TODO: // individual Trove interest updates for redeemed Troves - - // - + // - } diff --git a/contracts/src/test/troveManager.t.sol b/contracts/src/test/troveManager.t.sol index 65e30887..0585f409 100644 --- a/contracts/src/test/troveManager.t.sol +++ b/contracts/src/test/troveManager.t.sol @@ -2,9 +2,7 @@ pragma solidity 0.8.18; import "./TestContracts/DevTestSetup.sol"; - contract TroveManagerTest is DevTestSetup { - function testRedeemSkipTrovesUnder100pct() public { priceFeed.setPrice(2000e18); uint256 ATroveId = openTroveNoHints100pctMaxFee(A, 2 ether, 2001e18, 1e17); @@ -26,15 +24,11 @@ contract TroveManagerTest is DevTestSetup { assertLt(troveManager.getCurrentICR(ATroveId, newPrice), _100pct); assertGt(troveManager.getCurrentICR(BTroveId, newPrice), _100pct); - uint256 redemptionAmount = 1000e18; // 1k BOLD + uint256 redemptionAmount = 1000e18; // 1k BOLD // C redeems 1k BOLD vm.startPrank(C); - troveManager.redeemCollateral( - redemptionAmount, - 10, - 1e18 - ); + troveManager.redeemCollateral(redemptionAmount, 10, 1e18); vm.stopPrank(); // Check A's coll and debt are the same @@ -64,11 +58,7 @@ contract TroveManagerTest is DevTestSetup { openTroveNoHints100pctMaxFee(A, 200 ether, 200000e18, 1e17); // A redeems 0.01 BOLD, base rate goes down to almost zero (it’s updated on redemption) vm.startPrank(A); - troveManager.redeemCollateral( - 1e16, - 10, - 1e18 - ); + troveManager.redeemCollateral(1e16, 10, 1e18); vm.stopPrank(); console.log(troveManager.baseRate(), "baseRate"); diff --git a/contracts/test/AccessControlTest.js b/contracts/test/AccessControlTest.js index d33be811..a1354e14 100644 --- a/contracts/test/AccessControlTest.js +++ b/contracts/test/AccessControlTest.js @@ -4,7 +4,7 @@ const TroveManagerTester = artifacts.require("TroveManagerTester"); const { dec, toBN } = th; -/* The majority of access control tests are contained in this file. However, tests for restrictions +/* The majority of access control tests are contained in this file. However, tests for restrictions on the Liquity admin address's capabilities during the first year are found in: test/launchSequenceTest/DuringLockupPeriodTest.js */ @@ -17,7 +17,7 @@ contract( const [owner, alice, bob, carol] = fundedAccounts; const [bountyAddress, lpRewardsAddress, multisig] = accounts.slice( 997, - 1000 + 1000, ); let contracts; @@ -36,13 +36,14 @@ contract( mocks: { TroveManager: TroveManagerTester }, callback: async (contracts) => { await Promise.all(fundedAccounts.map( - (account) => th.openTrove(contracts, { - extraBoldAmount: toBN(dec(20000, 18)), - ICR: toBN(dec(2, 18)), - extraParams: { from: account }, - }) - )) - } + (account) => + th.openTrove(contracts, { + extraBoldAmount: toBN(dec(20000, 18)), + ICR: toBN(dec(2, 18)), + extraParams: { from: account }, + }), + )); + }, }); beforeEach(async () => { @@ -67,7 +68,7 @@ contract( bob, th.addressToTroveId(bob), 1, - { from: bob } + { from: bob }, ); } catch (err) { assert.include(err.message, "revert"); @@ -175,7 +176,7 @@ contract( assert.include(err.message, "revert"); assert.include( err.message, - "Caller is neither BorrowerOperations nor TroveManager nor StabilityPool" + "Caller is neither BorrowerOperations nor TroveManager nor StabilityPool", ); } }); @@ -189,7 +190,7 @@ contract( assert.include(err.message, "revert"); assert.include( err.message, - "ActivePool: Caller is not TroveManager" + "ActivePool: Caller is not TroveManager", ); } }); @@ -205,7 +206,7 @@ contract( assert.include(err.message, "revert"); assert.include( err.message, - "ActivePool: Caller is not TroveManager" + "ActivePool: Caller is not TroveManager", ); } }); @@ -221,7 +222,7 @@ contract( assert.include(err.message, "revert"); assert.include( err.message, - "ActivePool: Caller is not TroveManager" + "ActivePool: Caller is not TroveManager", ); } }); @@ -235,7 +236,7 @@ contract( assert.include(err.message, "revert"); assert.include( err.message, - "ActivePool: Caller is neither BO nor Default Pool" + "ActivePool: Caller is neither BO nor Default Pool", ); } }); @@ -290,7 +291,7 @@ contract( assert.include(err.message, "revert"); assert.include( err.message, - "DefaultPool: Caller is not the ActivePool" + "DefaultPool: Caller is not the ActivePool", ); } }); @@ -322,7 +323,7 @@ contract( assert.include(err.message, "revert"); assert.include( err.message, - "StabilityPool: Caller is not ActivePool" + "StabilityPool: Caller is not ActivePool", ); } }); @@ -355,7 +356,7 @@ contract( bob, activePool.address, 100, - { from: alice } + { from: alice }, ); } catch (err) { assert.include(err.message, "revert"); @@ -371,7 +372,7 @@ contract( activePool.address, bob, 100, - { from: alice } + { from: alice }, ); } catch (err) { assert.include(err.message, "revert"); @@ -391,7 +392,7 @@ contract( "150000000000000000000", bob, bob, - { from: alice } + { from: alice }, ); } catch (err) { assert.include(err.message, "revert"); @@ -421,7 +422,7 @@ contract( "150000000000000000000", bob, bob, - { from: alice } + { from: alice }, ); } catch (err) { assert.include(err.message, "revert"); @@ -429,5 +430,5 @@ contract( } }); }); - } + }, ); diff --git a/contracts/test/BorrowerOperationsTest.js b/contracts/test/BorrowerOperationsTest.js index 56c9fb9c..3c800520 100644 --- a/contracts/test/BorrowerOperationsTest.js +++ b/contracts/test/BorrowerOperationsTest.js @@ -2,7 +2,7 @@ const { TestHelper: th } = require("../utils/testHelpers.js"); const { createDeployAndFundFixture } = require("../utils/testFixtures.js"); const BorrowerOperationsTester = artifacts.require( - "./BorrowerOperationsTester.sol" + "./BorrowerOperationsTester.sol", ); const TroveManagerTester = artifacts.require("TroveManagerTester"); @@ -33,7 +33,7 @@ contract("BorrowerOperations", async (accounts) => { const [bountyAddress, lpRewardsAddress, multisig] = accounts.slice(997, 1000); - let contracts + let contracts; let priceFeed; let boldToken; @@ -47,17 +47,12 @@ contract("BorrowerOperations", async (accounts) => { let MIN_NET_DEBT; let BORROWING_FEE_FLOOR; - const getOpenTroveBoldAmount = async (totalDebt) => - th.getOpenTroveBoldAmount(contracts, totalDebt); - const getNetBorrowingAmount = async (debtWithFee) => - th.getNetBorrowingAmount(contracts, debtWithFee); - const getActualDebtFromComposite = async (compositeDebt) => - th.getActualDebtFromComposite(compositeDebt, contracts); + const getOpenTroveBoldAmount = async (totalDebt) => th.getOpenTroveBoldAmount(contracts, totalDebt); + const getNetBorrowingAmount = async (debtWithFee) => th.getNetBorrowingAmount(contracts, debtWithFee); + const getActualDebtFromComposite = async (compositeDebt) => th.getActualDebtFromComposite(compositeDebt, contracts); const openTrove = async (params) => th.openTrove(contracts, params); - const getTroveEntireColl = async (trove) => - th.getTroveEntireColl(contracts, trove); - const getTroveEntireDebt = async (trove) => - th.getTroveEntireDebt(contracts, trove); + const getTroveEntireColl = async (trove) => th.getTroveEntireColl(contracts, trove); + const getTroveEntireDebt = async (trove) => th.getTroveEntireDebt(contracts, trove); const getTroveStake = async (trove) => th.getTroveStake(contracts, trove); const deployFixture = createDeployAndFundFixture({ @@ -81,26 +76,26 @@ contract("BorrowerOperations", async (accounts) => { BOLD_GAS_COMPENSATION, MIN_NET_DEBT, BORROWING_FEE_FLOOR, - } + }; }, }); const testCorpus = () => { beforeEach(async () => { - const result = await deployFixture() - - contracts = result.contracts - priceFeed = contracts.priceFeedTestnet - boldToken = contracts.boldToken - sortedTroves = contracts.sortedTroves - troveManager = contracts.troveManager - activePool = contracts.activePool - defaultPool = contracts.defaultPool - borrowerOperations = contracts.borrowerOperations - - BOLD_GAS_COMPENSATION = result.BOLD_GAS_COMPENSATION - MIN_NET_DEBT = result.MIN_NET_DEBT - BORROWING_FEE_FLOOR = result.BORROWING_FEE_FLOOR + const result = await deployFixture(); + + contracts = result.contracts; + priceFeed = contracts.priceFeedTestnet; + boldToken = contracts.boldToken; + sortedTroves = contracts.sortedTroves; + troveManager = contracts.troveManager; + activePool = contracts.activePool; + defaultPool = contracts.defaultPool; + borrowerOperations = contracts.borrowerOperations; + + BOLD_GAS_COMPENSATION = result.BOLD_GAS_COMPENSATION; + MIN_NET_DEBT = result.MIN_NET_DEBT; + BORROWING_FEE_FLOOR = result.BORROWING_FEE_FLOOR; }); it("addColl(): reverts when top-up would leave trove with ICR < MCR", async () => { @@ -114,7 +109,7 @@ contract("BorrowerOperations", async (accounts) => { assert.isFalse(await troveManager.checkRecoveryMode(price)); assert.isTrue( - (await troveManager.getCurrentICR(aliceTroveId, price)).lt(toBN(dec(110, 16))) + (await troveManager.getCurrentICR(aliceTroveId, price)).lt(toBN(dec(110, 16))), ); const collTopUp = 1; // 1 wei top up @@ -124,7 +119,7 @@ contract("BorrowerOperations", async (accounts) => { from: alice, value: collTopUp, }), - "BorrowerOps: An operation that would result in ICR < MCR is not permitted" + "BorrowerOps: An operation that would result in ICR < MCR is not permitted", ); }); @@ -136,7 +131,7 @@ contract("BorrowerOperations", async (accounts) => { const activePool_ETH_Before = await activePool.getETHBalance(); const activePool_RawEther_Before = toBN( - await contracts.WETH.balanceOf(activePool.address) + await contracts.WETH.balanceOf(activePool.address), ); assert.isTrue(activePool_ETH_Before.eq(aliceColl)); @@ -149,13 +144,13 @@ contract("BorrowerOperations", async (accounts) => { const activePool_ETH_After = await activePool.getETHBalance(); const activePool_RawEther_After = toBN( - await contracts.WETH.balanceOf(activePool.address) + await contracts.WETH.balanceOf(activePool.address), ); assert.isTrue( - activePool_ETH_After.eq(aliceColl.add(toBN(dec(1, "ether")))) + activePool_ETH_After.eq(aliceColl.add(toBN(dec(1, "ether")))), ); assert.isTrue( - activePool_RawEther_After.eq(aliceColl.add(toBN(dec(1, "ether")))) + activePool_RawEther_After.eq(aliceColl.add(toBN(dec(1, "ether")))), ); }); @@ -229,28 +224,26 @@ contract("BorrowerOperations", async (accounts) => { const totalStakes_After = await troveManager.totalStakes(); assert.isTrue( - alice_Stake_After.eq(alice_Stake_Before.add(toBN(dec(2, "ether")))) + alice_Stake_After.eq(alice_Stake_Before.add(toBN(dec(2, "ether")))), ); assert.isTrue( - totalStakes_After.eq(totalStakes_Before.add(toBN(dec(2, "ether")))) + totalStakes_After.eq(totalStakes_Before.add(toBN(dec(2, "ether")))), ); }); it("addColl(), active Trove: applies pending rewards and updates user's L_ETH, L_boldDebt snapshots", async () => { // --- SETUP --- - const { troveId: aliceTroveId, collateral: aliceCollBefore, totalDebt: aliceDebtBefore } = - await openTrove({ - extraBoldAmount: toBN(dec(15000, 18)), - ICR: toBN(dec(2, 18)), - extraParams: { from: alice }, - }); - const { troveId: bobTroveId, collateral: bobCollBefore, totalDebt: bobDebtBefore } = - await openTrove({ - extraBoldAmount: toBN(dec(10000, 18)), - ICR: toBN(dec(2, 18)), - extraParams: { from: bob }, - }); + const { troveId: aliceTroveId, collateral: aliceCollBefore, totalDebt: aliceDebtBefore } = await openTrove({ + extraBoldAmount: toBN(dec(15000, 18)), + ICR: toBN(dec(2, 18)), + extraParams: { from: alice }, + }); + const { troveId: bobTroveId, collateral: bobCollBefore, totalDebt: bobDebtBefore } = await openTrove({ + extraBoldAmount: toBN(dec(10000, 18)), + ICR: toBN(dec(2, 18)), + extraParams: { from: bob }, + }); const { troveId: carolTroveId } = await openTrove({ extraBoldAmount: toBN(dec(5000, 18)), ICR: toBN(dec(2, 18)), @@ -272,11 +265,10 @@ contract("BorrowerOperations", async (accounts) => { // check Alice and Bob's reward snapshots are zero before they alter their Troves const alice_rewardSnapshot_Before = await troveManager.rewardSnapshots( - alice + alice, ); const alice_ETHrewardSnapshot_Before = alice_rewardSnapshot_Before[0]; - const alice_BoldDebtRewardSnapshot_Before = - alice_rewardSnapshot_Before[1]; + const alice_BoldDebtRewardSnapshot_Before = alice_rewardSnapshot_Before[1]; const bob_rewardSnapshot_Before = await troveManager.rewardSnapshots(bobTroveId); const bob_ETHrewardSnapshot_Before = bob_rewardSnapshot_Before[0]; @@ -289,16 +281,16 @@ contract("BorrowerOperations", async (accounts) => { const alicePendingETHReward = await troveManager.getPendingETHReward(aliceTroveId); const bobPendingETHReward = await troveManager.getPendingETHReward(bobTroveId); - const alicePendingBoldDebtReward = - await troveManager.getPendingBoldDebtReward(aliceTroveId); - const bobPendingBoldDebtReward = - await troveManager.getPendingBoldDebtReward(bobTroveId); - for (const reward of [ - alicePendingETHReward, - bobPendingETHReward, - alicePendingBoldDebtReward, - bobPendingBoldDebtReward, - ]) { + const alicePendingBoldDebtReward = await troveManager.getPendingBoldDebtReward(aliceTroveId); + const bobPendingBoldDebtReward = await troveManager.getPendingBoldDebtReward(bobTroveId); + for ( + const reward of [ + alicePendingETHReward, + bobPendingETHReward, + alicePendingBoldDebtReward, + bobPendingBoldDebtReward, + ] + ) { assert.isTrue(reward.gt(toBN("0"))); } @@ -323,14 +315,14 @@ contract("BorrowerOperations", async (accounts) => { assert.isTrue( aliceNewColl.eq( - aliceCollBefore.add(alicePendingETHReward).add(aliceTopUp) - ) + aliceCollBefore.add(alicePendingETHReward).add(aliceTopUp), + ), ); assert.isTrue( - aliceNewDebt.eq(aliceDebtBefore.add(alicePendingBoldDebtReward)) + aliceNewDebt.eq(aliceDebtBefore.add(alicePendingBoldDebtReward)), ); assert.isTrue( - bobNewColl.eq(bobCollBefore.add(bobPendingETHReward).add(bobTopUp)) + bobNewColl.eq(bobCollBefore.add(bobPendingETHReward).add(bobTopUp)), ); assert.isTrue(bobNewDebt.eq(bobDebtBefore.add(bobPendingBoldDebtReward))); @@ -346,19 +338,19 @@ contract("BorrowerOperations", async (accounts) => { assert.isAtMost( th.getDifference(alice_ETHrewardSnapshot_After, L_ETH), - 100 + 100, ); assert.isAtMost( th.getDifference(alice_BoldDebtRewardSnapshot_After, L_boldDebt), - 100 + 100, ); assert.isAtMost( th.getDifference(bob_ETHrewardSnapshot_After, L_ETH), - 100 + 100, ); assert.isAtMost( th.getDifference(bob_BoldDebtRewardSnapshot_After, L_boldDebt), - 100 + 100, ); }); @@ -474,14 +466,14 @@ contract("BorrowerOperations", async (accounts) => { assert.isFalse(await troveManager.checkRecoveryMode(price)); assert.isTrue( - (await troveManager.getCurrentICR(aliceTroveId, price)).lt(toBN(dec(110, 16))) + (await troveManager.getCurrentICR(aliceTroveId, price)).lt(toBN(dec(110, 16))), ); const collWithdrawal = 1; // 1 wei withdrawal await assertRevert( - borrowerOperations.withdrawColl(aliceTroveId, 1, { from: alice }), - "BorrowerOps: An operation that would result in ICR < MCR is not permitted" + borrowerOperations.withdrawColl(aliceTroveId, 1, { from: alice }), + "BorrowerOps: An operation that would result in ICR < MCR is not permitted", ); }); @@ -502,7 +494,7 @@ contract("BorrowerOperations", async (accounts) => { const txBob = await borrowerOperations.withdrawColl( bobTroveId, dec(100, "finney"), - { from: bob } + { from: bob }, ); assert.isTrue(txBob.receipt.status); @@ -511,7 +503,7 @@ contract("BorrowerOperations", async (accounts) => { const txCarol = await borrowerOperations.withdrawColl( th.addressToTroveId(carol), dec(1, "ether"), - { from: carol } + { from: carol }, ); assert.isFalse(txCarol.receipt.status); } catch (err) { @@ -529,7 +521,7 @@ contract("BorrowerOperations", async (accounts) => { const txAlice = await borrowerOperations.withdrawColl( aliceTroveId, 1000, - { from: alice } + { from: alice }, ); assert.isTrue(txAlice.receipt.status); @@ -537,9 +529,9 @@ contract("BorrowerOperations", async (accounts) => { assert.isTrue(await th.checkRecoveryMode(contracts)); - //Check withdrawal impossible when recoveryMode == true + // Check withdrawal impossible when recoveryMode == true try { - const txBob = await borrowerOperations.withdrawColl(bobTroveId, 1000, { + const txBob = await borrowerOperations.withdrawColl(bobTroveId, 1000, { from: bob, }); assert.isFalse(txBob.receipt.status); @@ -557,10 +549,10 @@ contract("BorrowerOperations", async (accounts) => { const bobColl = await getTroveEntireColl(bobTroveId); // Carol withdraws exactly all her collateral await assertRevert( - borrowerOperations.withdrawColl(carol_Id, carolColl, { + borrowerOperations.withdrawColl(carol_Id, carolColl, { from: carol, }), - "BorrowerOps: An operation that would result in ICR < MCR is not permitted" + "BorrowerOps: An operation that would result in ICR < MCR is not permitted", ); // Bob attempts to withdraw 1 wei more than his collateral @@ -568,7 +560,7 @@ contract("BorrowerOperations", async (accounts) => { const txBob = await borrowerOperations.withdrawColl( bobTroveId, bobColl.add(toBN(1)), - { from: bob } + { from: bob }, ); assert.isFalse(txBob.receipt.status); } catch (err) { @@ -584,7 +576,7 @@ contract("BorrowerOperations", async (accounts) => { // Bob attempts to withdraws 1 wei, Which would leave him with < 110% ICR. try { - const txBob = await borrowerOperations.withdrawColl(bobTroveId, 1, { + const txBob = await borrowerOperations.withdrawColl(bobTroveId, 1, { from: bob, }); assert.isFalse(txBob.receipt.status); @@ -608,12 +600,12 @@ contract("BorrowerOperations", async (accounts) => { // price drops to 1ETH:150Bold, reducing TCR below 150% await priceFeed.setPrice("150000000000000000000"); - //Alice tries to withdraw collateral during Recovery Mode + // Alice tries to withdraw collateral during Recovery Mode try { const txData = await borrowerOperations.withdrawColl( aliceTroveId, "1", - { from: alice } + { from: alice }, ); assert.isFalse(txData.receipt.status); } catch (err) { @@ -635,10 +627,10 @@ contract("BorrowerOperations", async (accounts) => { // Alice attempts to withdraw all collateral await assertRevert( - borrowerOperations.withdrawColl(aliceTroveId, aliceColl, { + borrowerOperations.withdrawColl(aliceTroveId, aliceColl, { from: alice, }), - "BorrowerOps: An operation that would result in ICR < MCR is not permitted" + "BorrowerOps: An operation that would result in ICR < MCR is not permitted", ); }); @@ -653,7 +645,7 @@ contract("BorrowerOperations", async (accounts) => { assert.isTrue(await sortedTroves.contains(aliceTroveId)); // Withdraw some collateral - await borrowerOperations.withdrawColl(aliceTroveId, dec(100, "finney"), { + await borrowerOperations.withdrawColl(aliceTroveId, dec(100, "finney"), { from: alice, }); @@ -669,7 +661,7 @@ contract("BorrowerOperations", async (accounts) => { const aliceCollBefore = await getTroveEntireColl(aliceTroveId); // Alice withdraws 1 ether - await borrowerOperations.withdrawColl(aliceTroveId, dec(1, "ether"), { + await borrowerOperations.withdrawColl(aliceTroveId, dec(1, "ether"), { from: alice, }); @@ -678,7 +670,7 @@ contract("BorrowerOperations", async (accounts) => { const aliceCollAfter = await getTroveEntireColl(aliceTroveId); assert.isTrue( - aliceCollAfter.eq(aliceCollBefore.sub(toBN(dec(1, "ether")))) + aliceCollAfter.eq(aliceCollBefore.sub(toBN(dec(1, "ether")))), ); }); @@ -689,27 +681,27 @@ contract("BorrowerOperations", async (accounts) => { // check before const activePool_ETH_before = await activePool.getETHBalance(); const activePool_RawEther_before = toBN( - await contracts.WETH.balanceOf(activePool.address) + await contracts.WETH.balanceOf(activePool.address), ); - await borrowerOperations.withdrawColl(aliceTroveId, dec(1, "ether"), { + await borrowerOperations.withdrawColl(aliceTroveId, dec(1, "ether"), { from: alice, }); // check after const activePool_ETH_After = await activePool.getETHBalance(); const activePool_RawEther_After = toBN( - await contracts.WETH.balanceOf(activePool.address) + await contracts.WETH.balanceOf(activePool.address), ); assert.isTrue( activePool_ETH_After.eq( - activePool_ETH_before.sub(toBN(dec(1, "ether"))) - ) + activePool_ETH_before.sub(toBN(dec(1, "ether"))), + ), ); assert.isTrue( activePool_RawEther_After.eq( - activePool_RawEther_before.sub(toBN(dec(1, "ether"))) - ) + activePool_RawEther_before.sub(toBN(dec(1, "ether"))), + ), ); }); @@ -730,7 +722,7 @@ contract("BorrowerOperations", async (accounts) => { assert.isTrue(totalStakes_Before.eq(aliceColl)); // Alice withdraws 1 ether - await borrowerOperations.withdrawColl(aliceTroveId, dec(1, "ether"), { + await borrowerOperations.withdrawColl(aliceTroveId, dec(1, "ether"), { from: alice, }); @@ -740,10 +732,10 @@ contract("BorrowerOperations", async (accounts) => { const totalStakes_After = await troveManager.totalStakes(); assert.isTrue( - alice_Stake_After.eq(alice_Stake_Before.sub(toBN(dec(1, "ether")))) + alice_Stake_After.eq(alice_Stake_Before.sub(toBN(dec(1, "ether")))), ); assert.isTrue( - totalStakes_After.eq(totalStakes_Before.sub(toBN(dec(1, "ether")))) + totalStakes_After.eq(totalStakes_Before.sub(toBN(dec(1, "ether")))), ); }); @@ -754,15 +746,15 @@ contract("BorrowerOperations", async (accounts) => { }); const alice_ETHBalance_Before = toBN( - web3.utils.toBN(await contracts.WETH.balanceOf(alice)) + web3.utils.toBN(await contracts.WETH.balanceOf(alice)), ); - await borrowerOperations.withdrawColl(aliceTroveId, dec(1, "ether"), { + await borrowerOperations.withdrawColl(aliceTroveId, dec(1, "ether"), { from: alice, gasPrice: 0, }); const alice_ETHBalance_After = toBN( - web3.utils.toBN(await contracts.WETH.balanceOf(alice)) + web3.utils.toBN(await contracts.WETH.balanceOf(alice)), ); const balanceDiff = alice_ETHBalance_After.sub(alice_ETHBalance_Before); @@ -804,11 +796,10 @@ contract("BorrowerOperations", async (accounts) => { // check Alice and Bob's reward snapshots are zero before they alter their Troves const alice_rewardSnapshot_Before = await troveManager.rewardSnapshots( - aliceTroveId + aliceTroveId, ); const alice_ETHrewardSnapshot_Before = alice_rewardSnapshot_Before[0]; - const alice_BoldDebtRewardSnapshot_Before = - alice_rewardSnapshot_Before[1]; + const alice_BoldDebtRewardSnapshot_Before = alice_rewardSnapshot_Before[1]; const bob_rewardSnapshot_Before = await troveManager.rewardSnapshots(bobTroveId); const bob_ETHrewardSnapshot_Before = bob_rewardSnapshot_Before[0]; @@ -824,12 +815,14 @@ contract("BorrowerOperations", async (accounts) => { const pendingDebtReward_A = await troveManager.getPendingBoldDebtReward(aliceTroveId); const pendingCollReward_B = await troveManager.getPendingETHReward(bobTroveId); const pendingDebtReward_B = await troveManager.getPendingBoldDebtReward(bobTroveId); - for (const reward of [ - pendingCollReward_A, - pendingDebtReward_A, - pendingCollReward_B, - pendingDebtReward_B, - ]) { + for ( + const reward of [ + pendingCollReward_A, + pendingDebtReward_A, + pendingCollReward_B, + pendingDebtReward_B, + ] + ) { assert.isTrue(reward.gt(toBN("0"))); } @@ -837,10 +830,10 @@ contract("BorrowerOperations", async (accounts) => { const aliceCollWithdrawal = toBN(dec(5, "ether")); const bobCollWithdrawal = toBN(dec(1, "ether")); - await borrowerOperations.withdrawColl(aliceTroveId, aliceCollWithdrawal, { + await borrowerOperations.withdrawColl(aliceTroveId, aliceCollWithdrawal, { from: alice, }); - await borrowerOperations.withdrawColl(bobTroveId, bobCollWithdrawal, { + await borrowerOperations.withdrawColl(bobTroveId, bobCollWithdrawal, { from: bob, }); @@ -854,28 +847,28 @@ contract("BorrowerOperations", async (accounts) => { th.assertIsApproximatelyEqual( aliceCollAfter, aliceCollBefore.add(pendingCollReward_A).sub(aliceCollWithdrawal), - 10000 + 10000, ); th.assertIsApproximatelyEqual( aliceDebtAfter, aliceDebtBefore.add(pendingDebtReward_A), - 10000 + 10000, ); th.assertIsApproximatelyEqual( bobCollAfter, bobCollBefore.add(pendingCollReward_B).sub(bobCollWithdrawal), - 10000 + 10000, ); th.assertIsApproximatelyEqual( bobDebtAfter, bobDebtBefore.add(pendingDebtReward_B), - 10000 + 10000, ); /* After top up, both Alice and Bob's snapshots of the rewards-per-unit-staked metrics should be updated to the latest values of L_ETH and L_boldDebt */ const alice_rewardSnapshot_After = await troveManager.rewardSnapshots( - aliceTroveId + aliceTroveId, ); const alice_ETHrewardSnapshot_After = alice_rewardSnapshot_After[0]; const alice_BoldDebtRewardSnapshot_After = alice_rewardSnapshot_After[1]; @@ -886,19 +879,19 @@ contract("BorrowerOperations", async (accounts) => { assert.isAtMost( th.getDifference(alice_ETHrewardSnapshot_After, L_ETH), - 100 + 100, ); assert.isAtMost( th.getDifference(alice_BoldDebtRewardSnapshot_After, L_boldDebt), - 100 + 100, ); assert.isAtMost( th.getDifference(bob_ETHrewardSnapshot_After, L_ETH), - 100 + 100, ); assert.isAtMost( th.getDifference(bob_BoldDebtRewardSnapshot_After, L_boldDebt), - 100 + 100, ); }); @@ -915,7 +908,7 @@ contract("BorrowerOperations", async (accounts) => { assert.isFalse(await troveManager.checkRecoveryMode(price)); assert.isTrue( - (await troveManager.getCurrentICR(aliceTroveId, price)).lt(toBN(dec(110, 16))) + (await troveManager.getCurrentICR(aliceTroveId, price)).lt(toBN(dec(110, 16))), ); const Boldwithdrawal = 1; // withdraw 1 wei Bold @@ -925,9 +918,9 @@ contract("BorrowerOperations", async (accounts) => { aliceTroveId, th._100pct, Boldwithdrawal, - { from: alice } + { from: alice }, ), - "BorrowerOps: An operation that would result in ICR < MCR is not permitted" + "BorrowerOps: An operation that would result in ICR < MCR is not permitted", ); }); @@ -940,7 +933,7 @@ contract("BorrowerOperations", async (accounts) => { bobTroveId, th._100pct, dec(100, 18), - { from: bob } + { from: bob }, ); assert.isTrue(txBob.receipt.status); @@ -950,7 +943,7 @@ contract("BorrowerOperations", async (accounts) => { th.addressToTroveId(carol), th._100pct, dec(100, 18), - { from: carol } + { from: carol }, ); assert.isFalse(txCarol.receipt.status); } catch (err) { @@ -967,7 +960,7 @@ contract("BorrowerOperations", async (accounts) => { bobTroveId, th._100pct, 1, - { from: bob } + { from: bob }, ); assert.isTrue(txBob.receipt.status); @@ -977,7 +970,7 @@ contract("BorrowerOperations", async (accounts) => { aliceTroveId, th._100pct, 0, - { from: alice } + { from: alice }, ); assert.isFalse(txAlice.receipt.status); } catch (err) { @@ -997,7 +990,7 @@ contract("BorrowerOperations", async (accounts) => { aliceTroveId, th._100pct, dec(100, 18), - { from: alice } + { from: alice }, ); assert.isTrue(txAlice.receipt.status); @@ -1005,13 +998,13 @@ contract("BorrowerOperations", async (accounts) => { assert.isTrue(await th.checkRecoveryMode(contracts)); - //Check Bold withdrawal impossible when recoveryMode == true + // Check Bold withdrawal impossible when recoveryMode == true try { const txBob = await borrowerOperations.withdrawBold( bobTroveId, th._100pct, - 1, - { from: bob } + 1, + { from: bob }, ); assert.isFalse(txBob.receipt.status); } catch (err) { @@ -1029,7 +1022,7 @@ contract("BorrowerOperations", async (accounts) => { bobTroveId, th._100pct, 1, - { from: bob } + { from: bob }, ); assert.isFalse(txBob.receipt.status); } catch (err) { @@ -1055,7 +1048,7 @@ contract("BorrowerOperations", async (accounts) => { bobTroveId, th._100pct, dec(1, 18), - { from: bob } + { from: bob }, ); assert.isFalse(txBob.receipt.status); } catch (err) { @@ -1079,7 +1072,7 @@ contract("BorrowerOperations", async (accounts) => { aliceTroveId, th._100pct, "200", - { from: alice } + { from: alice }, ); assert.isFalse(txData.receipt.status); } catch (err) { @@ -1098,14 +1091,14 @@ contract("BorrowerOperations", async (accounts) => { aliceTroveId, th._100pct, await getNetBorrowingAmount(100), - { from: alice } + { from: alice }, ); // check after const aliceDebtAfter = await getTroveEntireDebt(aliceTroveId); th.assertIsApproximatelyEqual( aliceDebtAfter, - aliceDebtBefore.add(toBN(100)) + aliceDebtBefore.add(toBN(100)), ); }); @@ -1126,14 +1119,14 @@ contract("BorrowerOperations", async (accounts) => { aliceTroveId, th._100pct, await getNetBorrowingAmount(dec(10000, 18)), - { from: alice } + { from: alice }, ); // check after const activePool_Bold_After = await activePool.getRecordedDebtSum(); th.assertIsApproximatelyEqual( activePool_Bold_After, - activePool_Bold_Before.add(toBN(dec(10000, 18))) + activePool_Bold_Before.add(toBN(dec(10000, 18))), ); }); @@ -1150,15 +1143,15 @@ contract("BorrowerOperations", async (accounts) => { aliceTroveId, th._100pct, dec(10000, 18), - { from: alice } + { from: alice }, ); // check after const alice_BoldTokenBalance_After = await boldToken.balanceOf(alice); assert.isTrue( alice_BoldTokenBalance_After.eq( - alice_BoldTokenBalance_Before.add(toBN(dec(10000, 18))) - ) + alice_BoldTokenBalance_Before.add(toBN(dec(10000, 18))), + ), ); }); @@ -1174,39 +1167,40 @@ contract("BorrowerOperations", async (accounts) => { assert.isFalse(await troveManager.checkRecoveryMode(price)); assert.isTrue( - (await troveManager.getCurrentICR(aliceTroveId, price)).lt(toBN(dec(110, 16))) + (await troveManager.getCurrentICR(aliceTroveId, price)).lt(toBN(dec(110, 16))), ); const BoldRepayment = 1; // 1 wei repayment await assertRevert( - borrowerOperations.repayBold(aliceTroveId, BoldRepayment, { + borrowerOperations.repayBold(aliceTroveId, BoldRepayment, { from: alice, }), - "BorrowerOps: An operation that would result in ICR < MCR is not permitted" + "BorrowerOps: An operation that would result in ICR < MCR is not permitted", ); }); it("repayBold(): Succeeds when it would leave trove with net debt >= minimum net debt", async () => { // Make the Bold request 2 wei above min net debt to correct for floor division, and make net debt = min net debt + 1 wei - const ATroveId = await th.openTroveWrapper(contracts, + const ATroveId = await th.openTroveWrapper( + contracts, th._100pct, await getNetBorrowingAmount(MIN_NET_DEBT.add(toBN("2"))), A, A, 0, - { from: A, value: dec(100, 30) } + { from: A, value: dec(100, 30) }, ); const repayTxA = await borrowerOperations.repayBold(ATroveId, 1, { from: A }); assert.isTrue(repayTxA.receipt.status); - const BTroveId = await th.openTroveWrapper(contracts,th._100pct, dec(20, 25), B, B, 0, { + const BTroveId = await th.openTroveWrapper(contracts, th._100pct, dec(20, 25), B, B, 0, { from: B, - value: dec(100, 30) + value: dec(100, 30), }); - const repayTxB = await borrowerOperations.repayBold(BTroveId, dec(19, 25),{ + const repayTxB = await borrowerOperations.repayBold(BTroveId, dec(19, 25), { from: B, }); assert.isTrue(repayTxB.receipt.status); @@ -1214,13 +1208,14 @@ contract("BorrowerOperations", async (accounts) => { it("repayBold(): reverts when it would leave trove with net debt < minimum net debt", async () => { // Open the trove with min debt + 1 wei - const ATroveId = await th.openTroveWrapper(contracts, + const ATroveId = await th.openTroveWrapper( + contracts, th._100pct, await getNetBorrowingAmount(MIN_NET_DEBT.add(toBN("1"))), A, A, 0, - { from: A, value: dec(100, 30) } + { from: A, value: dec(100, 30) }, ); // Check Trove debt is 1 wei above min @@ -1233,7 +1228,7 @@ contract("BorrowerOperations", async (accounts) => { }); await assertRevert( repayTxAPromise, - "BorrowerOps: Trove's net debt must be greater than minimum" + "BorrowerOps: Trove's net debt must be greater than minimum", ); }); @@ -1261,9 +1256,9 @@ contract("BorrowerOperations", async (accounts) => { false, repayAmount, false, - { from: alice } + { from: alice }, ), - "SafeMath: subtraction overflow" + "SafeMath: subtraction overflow", ); }); @@ -1279,7 +1274,7 @@ contract("BorrowerOperations", async (accounts) => { extraParams: { from: bob }, }); // Bob successfully repays some Bold - const txBob = await borrowerOperations.repayBold(bobTroveId, dec(10, 18), { + const txBob = await borrowerOperations.repayBold(bobTroveId, dec(10, 18), { from: bob, }); assert.isTrue(txBob.receipt.status); @@ -1289,7 +1284,7 @@ contract("BorrowerOperations", async (accounts) => { const txCarol = await borrowerOperations.repayBold( th.addressToTroveId(carol), dec(10, 18), - { from: carol } + { from: carol }, ); assert.isFalse(txCarol.receipt.status); } catch (err) { @@ -1311,7 +1306,7 @@ contract("BorrowerOperations", async (accounts) => { const aliceDebt = await getTroveEntireDebt(aliceTroveId); // Bob successfully repays some Bold - const txBob = await borrowerOperations.repayBold(bobTroveId, dec(10, 18), { + const txBob = await borrowerOperations.repayBold(bobTroveId, dec(10, 18), { from: bob, }); assert.isTrue(txBob.receipt.status); @@ -1321,7 +1316,7 @@ contract("BorrowerOperations", async (accounts) => { const txAlice = await borrowerOperations.repayBold( aliceTroveId, aliceDebt.add(toBN(dec(1, 18))), - { from: alice } + { from: alice }, ); assert.isFalse(txAlice.receipt.status); } catch (err) { @@ -1329,7 +1324,7 @@ contract("BorrowerOperations", async (accounts) => { } }); - //repayBold: reduces Bold debt in Trove + // repayBold: reduces Bold debt in Trove it("repayBold(): reduces the Trove's Bold debt by the correct amount", async () => { const { troveId: aliceTroveId } = await openTrove({ extraBoldAmount: toBN(dec(10000, 18)), @@ -1347,7 +1342,7 @@ contract("BorrowerOperations", async (accounts) => { await borrowerOperations.repayBold( aliceTroveId, aliceDebtBefore.div(toBN(10)), - { from: alice } + { from: alice }, ); // Repays 1/10 her debt const aliceDebtAfter = await getTroveEntireDebt(aliceTroveId); @@ -1355,7 +1350,7 @@ contract("BorrowerOperations", async (accounts) => { th.assertIsApproximatelyEqual( aliceDebtAfter, - aliceDebtBefore.mul(toBN(9)).div(toBN(10)) + aliceDebtBefore.mul(toBN(9)).div(toBN(10)), ); // check 9/10 debt remaining }); @@ -1380,14 +1375,14 @@ contract("BorrowerOperations", async (accounts) => { await borrowerOperations.repayBold( aliceTroveId, aliceDebtBefore.div(toBN(10)), - { from: alice } + { from: alice }, ); // Repays 1/10 her debt // check after const activePool_Bold_After = await activePool.getRecordedDebtSum(); th.assertIsApproximatelyEqual( activePool_Bold_After, - activePool_Bold_Before.sub(aliceDebtBefore.div(toBN(10))) + activePool_Bold_Before.sub(aliceDebtBefore.div(toBN(10))), ); }); @@ -1412,14 +1407,14 @@ contract("BorrowerOperations", async (accounts) => { await borrowerOperations.repayBold( aliceTroveId, aliceDebtBefore.div(toBN(10)), - { from: alice } + { from: alice }, ); // Repays 1/10 her debt // check after const alice_BoldTokenBalance_After = await boldToken.balanceOf(alice); th.assertIsApproximatelyEqual( alice_BoldTokenBalance_After, - alice_BoldTokenBalance_Before.sub(aliceDebtBefore.div(toBN(10))) + alice_BoldTokenBalance_Before.sub(aliceDebtBefore.div(toBN(10))), ); }); @@ -1446,7 +1441,7 @@ contract("BorrowerOperations", async (accounts) => { const tx = await borrowerOperations.repayBold( aliceTroveId, aliceDebtBefore.div(toBN(10)), - { from: alice } + { from: alice }, ); assert.isTrue(tx.receipt.status); @@ -1454,7 +1449,7 @@ contract("BorrowerOperations", async (accounts) => { const aliceDebtAfter = await getTroveEntireDebt(aliceTroveId); th.assertIsApproximatelyEqual( aliceDebtAfter, - aliceDebtBefore.mul(toBN(9)).div(toBN(10)) + aliceDebtBefore.mul(toBN(9)).div(toBN(10)), ); }); @@ -1477,20 +1472,17 @@ contract("BorrowerOperations", async (accounts) => { from: B, }); - //Confirm B's Bold balance has decreased to 5 Bold + // Confirm B's Bold balance has decreased to 5 Bold const bobBalAfter = await boldToken.balanceOf(B); assert.isTrue(bobBalAfter.eq(toBN(dec(5, 18)))); // Bob tries to repay 6 Bold - const repayBoldPromise_B = borrowerOperations.repayBold(BTroveId, - toBN(dec(6, 18)), - { from: B } - ); + const repayBoldPromise_B = borrowerOperations.repayBold(BTroveId, toBN(dec(6, 18)), { from: B }); await assertRevert( repayBoldPromise_B, - "Caller doesnt have enough Bold to make repayment" + "Caller doesnt have enough Bold to make repayment", ); }); @@ -1507,7 +1499,7 @@ contract("BorrowerOperations", async (accounts) => { assert.isFalse(await troveManager.checkRecoveryMode(price)); assert.isTrue( - (await troveManager.getCurrentICR(aliceTroveId, price)).lt(toBN(dec(110, 16))) + (await troveManager.getCurrentICR(aliceTroveId, price)).lt(toBN(dec(110, 16))), ); const BoldRepayment = 1; // 1 wei repayment @@ -1523,9 +1515,9 @@ contract("BorrowerOperations", async (accounts) => { true, BoldRepayment, false, - { from: alice } + { from: alice }, ), - "BorrowerOps: An operation that would result in ICR < MCR is not permitted" + "BorrowerOps: An operation that would result in ICR < MCR is not permitted", ); }); @@ -1551,8 +1543,7 @@ contract("BorrowerOperations", async (accounts) => { true, dec(50, 18), true, - - { from: alice } + { from: alice }, ); try { @@ -1565,8 +1556,7 @@ contract("BorrowerOperations", async (accounts) => { true, dec(50, 18), true, - - { from: carol } + { from: carol }, ); assert.isFalse(txCarol.receipt.status); } catch (err) { @@ -1597,7 +1587,7 @@ contract("BorrowerOperations", async (accounts) => { true, dec(50, 18), true, - { from: alice } + { from: alice }, ); assert.isTrue(txAlice.receipt.status); @@ -1614,7 +1604,7 @@ contract("BorrowerOperations", async (accounts) => { false, 0, false, - { from: alice } + { from: alice }, ); assert.isFalse(txAlice.receipt.status); } catch (err) { @@ -1630,7 +1620,7 @@ contract("BorrowerOperations", async (accounts) => { false, dec(50, 18), true, - { from: bob } + { from: bob }, ); assert.isFalse(txBob.receipt.status); } catch (err) { @@ -1647,8 +1637,8 @@ contract("BorrowerOperations", async (accounts) => { dec(1, "ether"), true, dec(111, 18), - true, - { from: bob } + true, + { from: bob }, ); assert.isFalse(txBob.receipt.status); } catch (err) { @@ -1683,9 +1673,9 @@ contract("BorrowerOperations", async (accounts) => { false, dec(5000, 18), false, - { from: alice } + { from: alice }, ), - "BorrowerOps: Collateral withdrawal not permitted Recovery Mode" + "BorrowerOps: Collateral withdrawal not permitted Recovery Mode", ); }); @@ -1720,7 +1710,7 @@ contract("BorrowerOperations", async (accounts) => { const newICR = await troveManager.computeICR( aliceColl.add(collIncrease), aliceDebt.add(debtIncrease), - price + price, ); assert.isTrue(newICR.gt(ICR_A) && newICR.lt(CCR)); @@ -1735,9 +1725,9 @@ contract("BorrowerOperations", async (accounts) => { true, debtIncrease, true, - { from: alice } + { from: alice }, ), - "BorrowerOps: Operation must leave trove with ICR >= CCR" + "BorrowerOps: Operation must leave trove with ICR >= CCR", ); }); @@ -1761,7 +1751,7 @@ contract("BorrowerOperations", async (accounts) => { assert.isTrue(await th.checkRecoveryMode(contracts)); - //--- Alice with ICR > 150% tries to reduce her ICR --- + // --- Alice with ICR > 150% tries to reduce her ICR --- const ICR_A = await troveManager.getCurrentICR(aliceTroveId, price); @@ -1776,7 +1766,7 @@ contract("BorrowerOperations", async (accounts) => { const newICR_A = await troveManager.computeICR( aliceColl.add(aliceCollIncrease), aliceDebt.add(aliceDebtIncrease), - price + price, ); // Check Alice's new ICR would reduce but still be greater than 150% @@ -1792,12 +1782,12 @@ contract("BorrowerOperations", async (accounts) => { true, aliceDebtIncrease, true, - { from: alice } + { from: alice }, ), - "BorrowerOps: Cannot decrease your Trove's ICR in Recovery Mode" + "BorrowerOps: Cannot decrease your Trove's ICR in Recovery Mode", ); - //--- Bob with ICR < 150% tries to reduce his ICR --- + // --- Bob with ICR < 150% tries to reduce his ICR --- const ICR_B = await troveManager.getCurrentICR(bobTroveId, price); @@ -1812,7 +1802,7 @@ contract("BorrowerOperations", async (accounts) => { const newICR_B = await troveManager.computeICR( bobColl.add(bobCollIncrease), bobDebt.add(bobDebtIncrease), - price + price, ); // Check Bob's new ICR would reduce @@ -1828,9 +1818,9 @@ contract("BorrowerOperations", async (accounts) => { true, bobDebtIncrease, true, - { from: bob } + { from: bob }, ), - " BorrowerOps: Operation must leave trove with ICR >= CCR" + " BorrowerOps: Operation must leave trove with ICR >= CCR", ); }); @@ -1866,7 +1856,7 @@ contract("BorrowerOperations", async (accounts) => { const newICR = await troveManager.computeICR( aliceColl.add(collIncrease), aliceDebt.add(debtIncrease), - price + price, ); // Check new ICR would be > 150% @@ -1881,7 +1871,7 @@ contract("BorrowerOperations", async (accounts) => { true, debtIncrease, true, - { from: alice } + { from: alice }, ); assert.isTrue(tx.receipt.status); @@ -1921,7 +1911,7 @@ contract("BorrowerOperations", async (accounts) => { const newICR = await troveManager.computeICR( aliceColl.add(collIncrease), aliceDebt.add(debtIncrease), - price + price, ); // Check new ICR would be > old ICR @@ -1936,7 +1926,7 @@ contract("BorrowerOperations", async (accounts) => { true, debtIncrease, true, - { from: alice } + { from: alice }, ); assert.isTrue(tx.receipt.status); @@ -1964,7 +1954,7 @@ contract("BorrowerOperations", async (accounts) => { false, dec(1, 18), true, - { from: bob } + { from: bob }, ); assert.isFalse(txBob.receipt.status); } catch (err) { @@ -1983,7 +1973,7 @@ contract("BorrowerOperations", async (accounts) => { await boldToken.transfer(bob, th.toBN(dec(1, 18)), { from: alice }); const remainingDebt = (await troveManager.getTroveDebt(bobTroveId)).sub( - BOLD_GAS_COMPENSATION + BOLD_GAS_COMPENSATION, ); // Bob attempts an adjustment that would repay 1 wei more than his debt @@ -1997,9 +1987,9 @@ contract("BorrowerOperations", async (accounts) => { true, remainingDebt.add(toBN(1)), false, - { from: bob } + { from: bob }, ), - "revert" + "revert", ); }); @@ -2019,7 +2009,7 @@ contract("BorrowerOperations", async (accounts) => { false, 0, true, - { from: carol } + { from: carol }, ); assert.isFalse(txCarol.receipt.status); } catch (err) { @@ -2059,7 +2049,7 @@ contract("BorrowerOperations", async (accounts) => { true, dec(100, 18), true, - { from: bob } + { from: bob }, ); assert.isFalse(txBob.receipt.status); } catch (err) { @@ -2088,7 +2078,7 @@ contract("BorrowerOperations", async (accounts) => { false, dec(50, 18), true, - { from: alice } + { from: alice }, ); const aliceCollAfter = await getTroveEntireColl(aliceTroveId); @@ -2121,7 +2111,7 @@ contract("BorrowerOperations", async (accounts) => { true, 0, false, - { from: alice } + { from: alice }, ); const aliceDebtAfter = await getTroveEntireDebt(aliceTroveId); @@ -2159,7 +2149,7 @@ contract("BorrowerOperations", async (accounts) => { true, await getNetBorrowingAmount(dec(50, 18)), true, - { from: alice } + { from: alice }, ); const debtAfter = await getTroveEntireDebt(aliceTroveId); @@ -2168,12 +2158,12 @@ contract("BorrowerOperations", async (accounts) => { th.assertIsApproximatelyEqual( debtAfter, debtBefore.add(toBN(dec(50, 18))), - 10000 + 10000, ); th.assertIsApproximatelyEqual( collAfter, collBefore.add(toBN(dec(1, 18))), - 10000 + 10000, ); }); @@ -2203,7 +2193,7 @@ contract("BorrowerOperations", async (accounts) => { false, dec(50, 18), false, - { from: alice } + { from: alice }, ); const debtAfter = await getTroveEntireDebt(aliceTroveId); @@ -2241,7 +2231,7 @@ contract("BorrowerOperations", async (accounts) => { true, dec(50, 18), false, - { from: alice } + { from: alice }, ); const debtAfter = await getTroveEntireDebt(aliceTroveId); @@ -2250,12 +2240,12 @@ contract("BorrowerOperations", async (accounts) => { th.assertIsApproximatelyEqual( debtAfter, debtBefore.sub(toBN(dec(50, 18))), - 10000 + 10000, ); th.assertIsApproximatelyEqual( collAfter, collBefore.add(toBN(dec(5, 17))), - 10000 + 10000, ); }); @@ -2285,7 +2275,7 @@ contract("BorrowerOperations", async (accounts) => { false, await getNetBorrowingAmount(dec(1, 18)), true, - { from: alice } + { from: alice }, ); const debtAfter = await getTroveEntireDebt(aliceTroveId); @@ -2294,12 +2284,12 @@ contract("BorrowerOperations", async (accounts) => { th.assertIsApproximatelyEqual( debtAfter, debtBefore.add(toBN(dec(1, 18))), - 10000 + 10000, ); th.assertIsApproximatelyEqual( collAfter, collBefore.sub(toBN(dec(1, 17))), - 10000 + 10000, ); }); @@ -2331,7 +2321,7 @@ contract("BorrowerOperations", async (accounts) => { true, dec(50, 18), true, - { from: alice } + { from: alice }, ); const stakeAfter = await troveManager.getTroveStake(aliceTroveId); @@ -2339,7 +2329,7 @@ contract("BorrowerOperations", async (accounts) => { assert.isTrue(stakeAfter.eq(stakeBefore.add(toBN(dec(1, 18))))); assert.isTrue( - totalStakesAfter.eq(totalStakesBefore.add(toBN(dec(1, 18)))) + totalStakesAfter.eq(totalStakesBefore.add(toBN(dec(1, 18)))), ); }); @@ -2369,7 +2359,7 @@ contract("BorrowerOperations", async (accounts) => { false, dec(50, 18), false, - { from: alice } + { from: alice }, ); const stakeAfter = await troveManager.getTroveStake(aliceTroveId); @@ -2377,7 +2367,7 @@ contract("BorrowerOperations", async (accounts) => { assert.isTrue(stakeAfter.eq(stakeBefore.sub(toBN(dec(5, 17))))); assert.isTrue( - totalStakesAfter.eq(totalStakesBefore.sub(toBN(dec(5, 17)))) + totalStakesAfter.eq(totalStakesBefore.sub(toBN(dec(5, 17)))), ); }); @@ -2405,15 +2395,15 @@ contract("BorrowerOperations", async (accounts) => { false, dec(10, 18), false, - { from: alice } + { from: alice }, ); // check after const alice_BoldTokenBalance_After = await boldToken.balanceOf(alice); assert.isTrue( alice_BoldTokenBalance_After.eq( - alice_BoldTokenBalance_Before.sub(toBN(dec(10, 18))) - ) + alice_BoldTokenBalance_Before.sub(toBN(dec(10, 18))), + ), ); }); @@ -2443,15 +2433,15 @@ contract("BorrowerOperations", async (accounts) => { true, dec(100, 18), true, - { from: alice } + { from: alice }, ); // check after const alice_BoldTokenBalance_After = await boldToken.balanceOf(alice); assert.isTrue( alice_BoldTokenBalance_After.eq( - alice_BoldTokenBalance_Before.add(toBN(dec(100, 18))) - ) + alice_BoldTokenBalance_Before.add(toBN(dec(100, 18))), + ), ); }); @@ -2470,7 +2460,7 @@ contract("BorrowerOperations", async (accounts) => { const activePool_ETH_Before = await activePool.getETHBalance(); const activePool_RawEther_Before = toBN( - await contracts.WETH.balanceOf(activePool.address) + await contracts.WETH.balanceOf(activePool.address), ); assert.isTrue(activePool_ETH_Before.gt(toBN("0"))); assert.isTrue(activePool_RawEther_Before.gt(toBN("0"))); @@ -2483,20 +2473,20 @@ contract("BorrowerOperations", async (accounts) => { false, dec(10, 18), false, - { from: alice } + { from: alice }, ); const activePool_ETH_After = await activePool.getETHBalance(); const activePool_RawEther_After = toBN( - await contracts.WETH.balanceOf(activePool.address) + await contracts.WETH.balanceOf(activePool.address), ); assert.isTrue( - activePool_ETH_After.eq(activePool_ETH_Before.sub(toBN(dec(1, 17)))) + activePool_ETH_After.eq(activePool_ETH_Before.sub(toBN(dec(1, 17)))), ); assert.isTrue( activePool_RawEther_After.eq( - activePool_ETH_Before.sub(toBN(dec(1, 17))) - ) + activePool_ETH_Before.sub(toBN(dec(1, 17))), + ), ); }); @@ -2515,7 +2505,7 @@ contract("BorrowerOperations", async (accounts) => { const activePool_ETH_Before = await activePool.getETHBalance(); const activePool_RawEther_Before = toBN( - await contracts.WETH.balanceOf(activePool.address) + await contracts.WETH.balanceOf(activePool.address), ); assert.isTrue(activePool_ETH_Before.gt(toBN("0"))); assert.isTrue(activePool_RawEther_Before.gt(toBN("0"))); @@ -2530,20 +2520,20 @@ contract("BorrowerOperations", async (accounts) => { true, dec(100, 18), true, - { from: alice } + { from: alice }, ); const activePool_ETH_After = await activePool.getETHBalance(); const activePool_RawEther_After = toBN( - await contracts.WETH.balanceOf(activePool.address) + await contracts.WETH.balanceOf(activePool.address), ); assert.isTrue( - activePool_ETH_After.eq(activePool_ETH_Before.add(toBN(dec(1, 18)))) + activePool_ETH_After.eq(activePool_ETH_Before.add(toBN(dec(1, 18)))), ); assert.isTrue( activePool_RawEther_After.eq( - activePool_ETH_Before.add(toBN(dec(1, 18))) - ) + activePool_ETH_Before.add(toBN(dec(1, 18))), + ), ); }); @@ -2573,14 +2563,14 @@ contract("BorrowerOperations", async (accounts) => { true, dec(30, 18), false, - { from: alice } + { from: alice }, ); const activePool_BoldDebt_After = await activePool.getRecordedDebtSum(); assert.isTrue( activePool_BoldDebt_After.eq( - activePool_BoldDebt_Before.sub(toBN(dec(30, 18))) - ) + activePool_BoldDebt_Before.sub(toBN(dec(30, 18))), + ), ); }); @@ -2609,14 +2599,14 @@ contract("BorrowerOperations", async (accounts) => { true, await getNetBorrowingAmount(dec(100, 18)), true, - { from: alice } + { from: alice }, ); const activePool_BoldDebt_After = await activePool.getRecordedDebtSum(); th.assertIsApproximatelyEqual( activePool_BoldDebt_After, - activePool_BoldDebt_Before.add(toBN(dec(100, 18))) + activePool_BoldDebt_Before.add(toBN(dec(100, 18))), ); }); @@ -2648,9 +2638,9 @@ contract("BorrowerOperations", async (accounts) => { false, aliceDebt, true, - { from: alice } + { from: alice }, ), - "BorrowerOps: An operation that would result in ICR < MCR is not permitted" + "BorrowerOps: An operation that would result in ICR < MCR is not permitted", ); }); @@ -2667,10 +2657,10 @@ contract("BorrowerOperations", async (accounts) => { }); await assertRevert( - borrowerOperations.adjustTrove(aliceTroveId, th._100pct, 0, false, 0, true, { + borrowerOperations.adjustTrove(aliceTroveId, th._100pct, 0, false, 0, true, { from: alice, }), - "BorrowerOps: Debt increase requires non-zero debtChange" + "BorrowerOps: Debt increase requires non-zero debtChange", ); }); @@ -2682,10 +2672,10 @@ contract("BorrowerOperations", async (accounts) => { }); await assertRevert( - borrowerOperations.adjustTrove(aliceTroveId, th._100pct, 0, false, 0, false, { + borrowerOperations.adjustTrove(aliceTroveId, th._100pct, 0, false, 0, false, { from: alice, }), - "BorrowerOps: There must be either a collateral change or a debt change" + "BorrowerOps: There must be either a collateral change or a debt change", ); }); @@ -2712,8 +2702,8 @@ contract("BorrowerOperations", async (accounts) => { false, 0, false, - { from: alice } - ) + { from: alice }, + ), ); await assertRevert( borrowerOperations.adjustTrove( @@ -2722,9 +2712,9 @@ contract("BorrowerOperations", async (accounts) => { aliceColl.add(toBN(dec(37, "ether"))), false, 0, - false, - { from: alice } - ) + false, + { from: alice }, + ), ); }); @@ -2744,7 +2734,7 @@ contract("BorrowerOperations", async (accounts) => { // Bob transfers some Bold to carol await boldToken.transfer(C, dec(10, 18), { from: B }); - //Confirm B's Bold balance is less than 50 Bold + // Confirm B's Bold balance is less than 50 Bold const B_BoldBal = await boldToken.balanceOf(B); assert.isTrue(B_BoldBal.lt(bobDebt)); @@ -2755,7 +2745,7 @@ contract("BorrowerOperations", async (accounts) => { false, bobDebt, false, - { from: B } + { from: B }, ); // B attempts to repay all his debt @@ -2782,36 +2772,33 @@ contract("BorrowerOperations", async (accounts) => { dec(1, 18), dec(1, 18), true, - - { from: bob } + { from: bob }, ); await assertRevert( txPromise_A, - "BorrowerOps: Caller must be the borrower for a withdrawal" + "BorrowerOps: Caller must be the borrower for a withdrawal", ); const txPromise_B = borrowerOperations.callInternalAdjustLoan( bob, dec(1, 18), dec(1, 18), true, - - { from: owner } + { from: owner }, ); await assertRevert( txPromise_B, - "BorrowerOps: Caller must be the borrower for a withdrawal" + "BorrowerOps: Caller must be the borrower for a withdrawal", ); const txPromise_C = borrowerOperations.callInternalAdjustLoan( carol, dec(1, 18), dec(1, 18), true, - - { from: bob } + { from: bob }, ); await assertRevert( txPromise_C, - "BorrowerOps: Caller must be the borrower for a withdrawal" + "BorrowerOps: Caller must be the borrower for a withdrawal", ); }); @@ -2837,7 +2824,7 @@ contract("BorrowerOperations", async (accounts) => { await assertRevert( borrowerOperations.closeTrove(aliceTroveId, { from: alice }), - "BorrowerOps: An operation that would result in TCR < CCR is not permitted" + "BorrowerOps: An operation that would result in TCR < CCR is not permitted", ); }); @@ -2898,7 +2885,7 @@ contract("BorrowerOperations", async (accounts) => { // Carol attempts to close her trove during Recovery Mode await assertRevert( borrowerOperations.closeTrove(carolTroveId, { from: carol }), - "BorrowerOps: Operation not permitted during Recovery Mode" + "BorrowerOps: Operation not permitted during Recovery Mode", ); }); @@ -3134,7 +3121,7 @@ contract("BorrowerOperations", async (accounts) => { // Check active Pool ETH before const activePool_ETH_before = await activePool.getETHBalance(); const activePool_RawEther_before = toBN( - await contracts.WETH.balanceOf(activePool.address) + await contracts.WETH.balanceOf(activePool.address), ); assert.isTrue(activePool_ETH_before.eq(aliceColl.add(dennisColl))); assert.isTrue(activePool_ETH_before.gt(toBN("0"))); @@ -3151,7 +3138,7 @@ contract("BorrowerOperations", async (accounts) => { // Check after const activePool_ETH_After = await activePool.getETHBalance(); const activePool_RawEther_After = toBN( - await contracts.WETH.balanceOf(activePool.address) + await contracts.WETH.balanceOf(activePool.address), ); assert.isTrue(activePool_ETH_After.eq(dennisColl)); assert.isTrue(activePool_RawEther_After.eq(dennisColl)); @@ -3221,8 +3208,8 @@ contract("BorrowerOperations", async (accounts) => { assert.isTrue( totalStakesBefore.eq( - aliceStakeBefore.add(bobStakeBefore).add(dennisStakeBefore) - ) + aliceStakeBefore.add(bobStakeBefore).add(dennisStakeBefore), + ), ); // to compensate borrowing fees @@ -3239,7 +3226,7 @@ contract("BorrowerOperations", async (accounts) => { assert.equal(aliceStakeAfter, 0); assert.isTrue( - totalStakesAfter.eq(totalStakesBefore.sub(aliceStakeBefore)) + totalStakesAfter.eq(totalStakesBefore.sub(aliceStakeBefore)), ); }); @@ -3260,7 +3247,7 @@ contract("BorrowerOperations", async (accounts) => { assert.isTrue(aliceColl.gt(toBN("0"))); const alice_ETHBalance_Before = web3.utils.toBN( - await contracts.WETH.balanceOf(alice) + await contracts.WETH.balanceOf(alice), ); // to compensate borrowing fees @@ -3271,7 +3258,7 @@ contract("BorrowerOperations", async (accounts) => { await borrowerOperations.closeTrove(aliceTroveId, { from: alice, gasPrice: 0 }); const alice_ETHBalance_After = web3.utils.toBN( - await contracts.WETH.balanceOf(alice) + await contracts.WETH.balanceOf(alice), ); const balanceDiff = alice_ETHBalance_After.sub(alice_ETHBalance_Before); @@ -3308,7 +3295,7 @@ contract("BorrowerOperations", async (accounts) => { const alice_BoldBalance_After = await boldToken.balanceOf(alice); th.assertIsApproximatelyEqual( alice_BoldBalance_After, - alice_BoldBalance_Before.sub(aliceDebt.sub(BOLD_GAS_COMPENSATION)) + alice_BoldBalance_Before.sub(aliceDebt.sub(BOLD_GAS_COMPENSATION)), ); }); @@ -3355,8 +3342,7 @@ contract("BorrowerOperations", async (accounts) => { const liquidationTx = await troveManager.liquidate(carolTroveId, { from: owner, }); - const [liquidatedDebt_C, liquidatedColl_C, gasComp_C] = - th.getEmittedLiquidationValues(liquidationTx); + const [liquidatedDebt_C, liquidatedColl_C, gasComp_C] = th.getEmittedLiquidationValues(liquidationTx); // Carol opens a new Trove await openTrove({ @@ -3368,11 +3354,10 @@ contract("BorrowerOperations", async (accounts) => { // check Alice and Bob's reward snapshots are zero before they alter their Troves const alice_rewardSnapshot_Before = await troveManager.rewardSnapshots( - alice + alice, ); const alice_ETHrewardSnapshot_Before = alice_rewardSnapshot_Before[0]; - const alice_BoldDebtRewardSnapshot_Before = - alice_rewardSnapshot_Before[1]; + const alice_BoldDebtRewardSnapshot_Before = alice_rewardSnapshot_Before[1]; const bob_rewardSnapshot_Before = await troveManager.rewardSnapshots(bobTroveId); const bob_ETHrewardSnapshot_Before = bob_rewardSnapshot_Before[0]; @@ -3390,7 +3375,7 @@ contract("BorrowerOperations", async (accounts) => { assert.isAtMost(th.getDifference(defaultPool_ETH, liquidatedColl_C), 100); assert.isAtMost( th.getDifference(defaultPool_BoldDebt, liquidatedDebt_C), - 100 + 100, ); const pendingCollReward_A = await troveManager.getPendingETHReward(aliceTroveId); @@ -3402,22 +3387,21 @@ contract("BorrowerOperations", async (accounts) => { await borrowerOperations.closeTrove(aliceTroveId, { from: alice }); const defaultPool_ETH_afterAliceCloses = await defaultPool.getETHBalance(); - const defaultPool_BoldDebt_afterAliceCloses = - await defaultPool.getBoldDebt(); + const defaultPool_BoldDebt_afterAliceCloses = await defaultPool.getBoldDebt(); assert.isAtMost( th.getDifference( defaultPool_ETH_afterAliceCloses, - defaultPool_ETH.sub(pendingCollReward_A) + defaultPool_ETH.sub(pendingCollReward_A), ), - 1000 + 1000, ); assert.isAtMost( th.getDifference( defaultPool_BoldDebt_afterAliceCloses, - defaultPool_BoldDebt.sub(pendingDebtReward_A) + defaultPool_BoldDebt.sub(pendingDebtReward_A), ), - 1000 + 1000, ); // whale adjusts trove, pulling their rewards out of DefaultPool @@ -3428,23 +3412,22 @@ contract("BorrowerOperations", async (accounts) => { false, dec(1, 18), true, - { from: whale } + { from: whale }, ); // Close Bob's trove. Expect DefaultPool coll and debt to drop to 0, since closing pulls his rewards out. await borrowerOperations.closeTrove(bobTroveId, { from: bob }); const defaultPool_ETH_afterBobCloses = await defaultPool.getETHBalance(); - const defaultPool_BoldDebt_afterBobCloses = - await defaultPool.getBoldDebt(); + const defaultPool_BoldDebt_afterBobCloses = await defaultPool.getBoldDebt(); assert.isAtMost( th.getDifference(defaultPool_ETH_afterBobCloses, 0), - 100000 + 100000, ); assert.isAtMost( th.getDifference(defaultPool_BoldDebt_afterBobCloses, 0), - 100000 + 100000, ); }); @@ -3463,7 +3446,7 @@ contract("BorrowerOperations", async (accounts) => { // B sends away 1 Bold to A await boldToken.transfer(A, th.toBN(dec(1, 18)), { from: B }); - //Confirm B's Bold balance is less than his trove debt + // Confirm B's Bold balance is less than his trove debt const B_BoldBal = await boldToken.balanceOf(B); const B_troveDebt = await getTroveEntireDebt(BTroveId); @@ -3474,7 +3457,7 @@ contract("BorrowerOperations", async (accounts) => { // Check closing trove reverts await assertRevert( closeTrovePromise_B, - "BorrowerOps: Caller doesnt have enough Bold to make repayment" + "BorrowerOps: Caller doesnt have enough Bold to make repayment", ); }); @@ -3506,22 +3489,22 @@ contract("BorrowerOperations", async (accounts) => { const C_Debt = await getTroveEntireDebt(CTroveId); const A_emittedDebt = toBN( - th.getEventArgByName(txA, "TroveUpdated", "_debt") + th.getEventArgByName(txA, "TroveUpdated", "_debt"), ); const A_emittedColl = toBN( - th.getEventArgByName(txA, "TroveUpdated", "_coll") + th.getEventArgByName(txA, "TroveUpdated", "_coll"), ); const B_emittedDebt = toBN( - th.getEventArgByName(txB, "TroveUpdated", "_debt") + th.getEventArgByName(txB, "TroveUpdated", "_debt"), ); const B_emittedColl = toBN( - th.getEventArgByName(txB, "TroveUpdated", "_coll") + th.getEventArgByName(txB, "TroveUpdated", "_coll"), ); const C_emittedDebt = toBN( - th.getEventArgByName(txC, "TroveUpdated", "_debt") + th.getEventArgByName(txC, "TroveUpdated", "_debt"), ); const C_emittedColl = toBN( - th.getEventArgByName(txC, "TroveUpdated", "_coll") + th.getEventArgByName(txC, "TroveUpdated", "_coll"), ); // Check emitted debt values are correct @@ -3558,16 +3541,16 @@ contract("BorrowerOperations", async (accounts) => { const E_Debt = await getTroveEntireDebt(ETroveId); const D_emittedDebt = toBN( - th.getEventArgByName(txD, "TroveUpdated", "_debt") + th.getEventArgByName(txD, "TroveUpdated", "_debt"), ); const D_emittedColl = toBN( - th.getEventArgByName(txD, "TroveUpdated", "_coll") + th.getEventArgByName(txD, "TroveUpdated", "_coll"), ); const E_emittedDebt = toBN( - th.getEventArgByName(txE, "TroveUpdated", "_debt") + th.getEventArgByName(txE, "TroveUpdated", "_debt"), ); const E_emittedColl = toBN( - th.getEventArgByName(txE, "TroveUpdated", "_coll") + th.getEventArgByName(txE, "TroveUpdated", "_coll"), ); // Check emitted debt values are correct @@ -3581,52 +3564,51 @@ contract("BorrowerOperations", async (accounts) => { it("openTrove(): Opens a trove with net debt >= minimum net debt", async () => { // Add 1 wei to correct for rounding error in helper function - const ATroveId = await th.openTroveWrapper(contracts, + const ATroveId = await th.openTroveWrapper( + contracts, th._100pct, await getNetBorrowingAmount(MIN_NET_DEBT.add(toBN(1))), A, A, 0, - { from: A, value: dec(100, 30) } + { from: A, value: dec(100, 30) }, ); assert.isTrue(await sortedTroves.contains(ATroveId)); - const CTroveId = await th.openTroveWrapper(contracts, + const CTroveId = await th.openTroveWrapper( + contracts, th._100pct, await getNetBorrowingAmount(MIN_NET_DEBT.add(toBN(dec(47789898, 22)))), A, A, 0, - { from: C, value: dec(100, 30) } + { from: C, value: dec(100, 30) }, ); assert.isTrue(await sortedTroves.contains(CTroveId)); }); it("openTrove(): reverts if net debt < minimum net debt", async () => { - const txAPromise = th.openTroveWrapper(contracts,th._100pct, 0, A, A, 0, { + const txAPromise = th.openTroveWrapper(contracts, th._100pct, 0, A, A, 0, { from: A, value: dec(100, 30), }); await assertRevert(txAPromise, "revert"); - const txBPromise = th.openTroveWrapper(contracts, + const txBPromise = th.openTroveWrapper( + contracts, th._100pct, await getNetBorrowingAmount(MIN_NET_DEBT.sub(toBN(1))), B, B, 0, - { from: B, value: dec(100, 30) } + { from: B, value: dec(100, 30) }, ); await assertRevert(txBPromise, "revert"); - const txCPromise = th.openTroveWrapper(contracts, - th._100pct, - MIN_NET_DEBT.sub(toBN(dec(173, 18))), - C, - C, - 0, - { from: C, value: dec(100, 30) } - ); + const txCPromise = th.openTroveWrapper(contracts, th._100pct, MIN_NET_DEBT.sub(toBN(dec(173, 18))), C, C, 0, { + from: C, + value: dec(100, 30), + }); await assertRevert(txCPromise, "revert"); }); @@ -3800,13 +3782,11 @@ contract("BorrowerOperations", async (accounts) => { assert.isTrue(await th.checkRecoveryMode(contracts)); // Carol opens at 150% ICR in Recovery Mode - const { troveId: carolTroveId, tx: txCarol} = ( - await openTrove({ - extraBoldAmount: toBN(dec(5000, 18)), - ICR: toBN(dec(15, 17)), - extraParams: { from: carol }, - }) - ); + const { troveId: carolTroveId, tx: txCarol } = await openTrove({ + extraBoldAmount: toBN(dec(5000, 18)), + ICR: toBN(dec(15, 17)), + extraParams: { from: carol }, + }); assert.isTrue(txCarol.receipt.status); assert.isTrue(await sortedTroves.contains(carolTroveId)); @@ -3840,14 +3820,10 @@ contract("BorrowerOperations", async (accounts) => { assert.isTrue(await th.checkRecoveryMode(contracts)); await assertRevert( - th.openTroveWrapper(contracts, - th._100pct, - await getNetBorrowingAmount(MIN_NET_DEBT), - carol, - carol, - 0, - { from: carol, value: dec(1, "ether") } - ) + th.openTroveWrapper(contracts, th._100pct, await getNetBorrowingAmount(MIN_NET_DEBT), carol, carol, 0, { + from: carol, + value: dec(1, "ether"), + }), ); }); @@ -3866,7 +3842,7 @@ contract("BorrowerOperations", async (accounts) => { */ const BoldRequest = MIN_NET_DEBT; - const aliceTroveId = await th.openTroveWrapper(contracts,th._100pct, MIN_NET_DEBT, carol, carol, 0, { + const aliceTroveId = await th.openTroveWrapper(contracts, th._100pct, MIN_NET_DEBT, carol, carol, 0, { from: alice, value: dec(100, "ether"), }); @@ -3907,10 +3883,10 @@ contract("BorrowerOperations", async (accounts) => { }); it("openTrove(): creates a stake and adds it to total stakes", async () => { - //const aliceStakeBefore = await getTroveStake(aliceTroveId); + // const aliceStakeBefore = await getTroveStake(aliceTroveId); const totalStakesBefore = await troveManager.totalStakes(); - //assert.equal(aliceStakeBefore, "0"); + // assert.equal(aliceStakeBefore, "0"); assert.equal(totalStakesBefore, "0"); const { troveId: aliceTroveId } = await openTrove({ @@ -3930,9 +3906,9 @@ contract("BorrowerOperations", async (accounts) => { it("openTrove(): inserts Trove to Sorted Troves list", async () => { // Check before - //const aliceTroveInList_Before = await sortedTroves.contains(aliceTroveId); + // const aliceTroveInList_Before = await sortedTroves.contains(aliceTroveId); const listIsEmpty_Before = await sortedTroves.isEmpty(); - //assert.equal(aliceTroveInList_Before, false); + // assert.equal(aliceTroveInList_Before, false); assert.equal(listIsEmpty_Before, true); const { troveId: aliceTroveId } = await openTrove({ @@ -3951,7 +3927,7 @@ contract("BorrowerOperations", async (accounts) => { it("openTrove(): Increases the activePool ETH and raw ether balance by correct amount", async () => { const activePool_ETH_Before = await activePool.getETHBalance(); const activePool_RawEther_Before = await contracts.WETH.balanceOf( - activePool.address + activePool.address, ); assert.equal(activePool_ETH_Before, 0); assert.equal(activePool_RawEther_Before, 0); @@ -3965,7 +3941,7 @@ contract("BorrowerOperations", async (accounts) => { const activePool_ETH_After = await activePool.getETHBalance(); const activePool_RawEther_After = toBN( - await contracts.WETH.balanceOf(activePool.address) + await contracts.WETH.balanceOf(activePool.address), ); assert.isTrue(activePool_ETH_After.eq(aliceCollAfter)); assert.isTrue(activePool_RawEther_After.eq(aliceCollAfter)); @@ -3994,8 +3970,7 @@ contract("BorrowerOperations", async (accounts) => { const liquidationTx = await troveManager.liquidate(carolTroveId, { from: owner, }); - const [liquidatedDebt, liquidatedColl, gasComp] = - th.getEmittedLiquidationValues(liquidationTx); + const [liquidatedDebt, liquidatedColl, gasComp] = th.getEmittedLiquidationValues(liquidationTx); /* with total stakes = 10 ether, after liquidation, L_ETH should equal 1/10 ether per-ether-staked, and L_Bold should equal 18 Bold per-ether-staked. */ @@ -4021,7 +3996,7 @@ contract("BorrowerOperations", async (accounts) => { assert.isAtMost(th.getDifference(bob_ETHrewardSnapshot, L_ETH), 1000); assert.isAtMost( th.getDifference(bob_BoldDebtRewardSnapshot, L_Bold), - 1000 + 1000, ); }); @@ -4082,13 +4057,14 @@ contract("BorrowerOperations", async (accounts) => { const debt_Before = alice_Trove_Before[0]; assert.equal(debt_Before, 0); - const aliceTroveId = await th.openTroveWrapper(contracts, + const aliceTroveId = await th.openTroveWrapper( + contracts, th._100pct, await getOpenTroveBoldAmount(dec(10000, 18)), alice, alice, 0, - { from: alice, value: dec(100, "ether") } + { from: alice, value: dec(100, "ether") }, ); // check after @@ -4118,14 +4094,10 @@ contract("BorrowerOperations", async (accounts) => { const alice_BoldTokenBalance_Before = await boldToken.balanceOf(alice); assert.equal(alice_BoldTokenBalance_Before, 0); - await th.openTroveWrapper(contracts, - th._100pct, - dec(10000, 18), - alice, - alice, - 0, - { from: alice, value: dec(100, "ether") } - ); + await th.openTroveWrapper(contracts, th._100pct, dec(10000, 18), alice, alice, 0, { + from: alice, + value: dec(100, "ether"), + }); // check after const alice_BoldTokenBalance_After = await boldToken.balanceOf(alice); @@ -4151,7 +4123,7 @@ contract("BorrowerOperations", async (accounts) => { true, debtChange, true, - price + price, ) ).toString(); assert.equal(newICR, "2000000000000000000"); @@ -4173,7 +4145,7 @@ contract("BorrowerOperations", async (accounts) => { true, debtChange, true, - price + price, ) ).toString(); assert.isAtMost(th.getDifference(newICR, "1333333333333333333"), 100); @@ -4195,7 +4167,7 @@ contract("BorrowerOperations", async (accounts) => { true, debtChange, false, - price + price, ) ).toString(); assert.equal(newICR, "4000000000000000000"); @@ -4217,7 +4189,7 @@ contract("BorrowerOperations", async (accounts) => { true, debtChange, true, - price + price, ) ).toString(); assert.equal(newICR, "4000000000000000000"); @@ -4239,7 +4211,7 @@ contract("BorrowerOperations", async (accounts) => { false, debtChange, true, - price + price, ) ).toString(); assert.equal(newICR, "1000000000000000000"); @@ -4261,7 +4233,7 @@ contract("BorrowerOperations", async (accounts) => { false, debtChange, false, - price + price, ) ).toString(); assert.equal(newICR, "2000000000000000000"); @@ -4283,7 +4255,7 @@ contract("BorrowerOperations", async (accounts) => { true, debtChange, true, - price + price, ) ).toString(); assert.equal(newICR, "2000000000000000000"); @@ -4305,7 +4277,7 @@ contract("BorrowerOperations", async (accounts) => { true, debtChange, false, - price + price, ) ).toString(); assert.equal(newICR, "8000000000000000000"); @@ -4327,7 +4299,7 @@ contract("BorrowerOperations", async (accounts) => { false, debtChange, true, - price + price, ) ).toString(); assert.equal(newICR, "500000000000000000"); @@ -4343,15 +4315,15 @@ contract("BorrowerOperations", async (accounts) => { const res2 = await borrowerOperations.getCompositeDebt(dec(90, 18)); th.assertIsApproximatelyEqual( res2, - BOLD_GAS_COMPENSATION.add(toBN(dec(90, 18))) + BOLD_GAS_COMPENSATION.add(toBN(dec(90, 18))), ); const res3 = await borrowerOperations.getCompositeDebt( - dec(24423422357345049, 12) + dec(24423422357345049, 12), ); th.assertIsApproximatelyEqual( res3, - BOLD_GAS_COMPENSATION.add(toBN(dec(24423422357345049, 12))) + BOLD_GAS_COMPENSATION.add(toBN(dec(24423422357345049, 12))), ); }); @@ -4368,34 +4340,25 @@ contract("BorrowerOperations", async (accounts) => { const bobBoldAmount = await getOpenTroveBoldAmount(bobTotalDebt); const whaleBoldAmount = await getOpenTroveBoldAmount(whaleTotalDebt); - await th.openTroveWrapper(contracts, - th._100pct, - whaleBoldAmount, - whale, - whale, - 0, - { from: whale, value: whaleColl } - ); - const bobTroveId = await th.openTroveWrapper(contracts, - th._100pct, - bobBoldAmount, - bob, - bob, - 0, - { from: bob, value: bobColl } - ); + await th.openTroveWrapper(contracts, th._100pct, whaleBoldAmount, whale, whale, 0, { + from: whale, + value: whaleColl, + }); + const bobTroveId = await th.openTroveWrapper(contracts, th._100pct, bobBoldAmount, bob, bob, 0, { + from: bob, + value: bobColl, + }); - const liqPrice = th.toBN(dec(100,18)) + const liqPrice = th.toBN(dec(100, 18)); // th.logBN("Bob ICR before liq", await troveManager.getCurrentICR(bob, liqPrice)) await priceFeed.setPrice(liqPrice); // Confirm we are in Normal Mode - assert.isFalse(await troveManager.checkRecoveryMode(liqPrice)) + assert.isFalse(await troveManager.checkRecoveryMode(liqPrice)); const liquidationTx = await troveManager.liquidate(bobTroveId); assert.isFalse(await sortedTroves.contains(bobTroveId)); - const [liquidatedDebt, liquidatedColl, gasComp] = - th.getEmittedLiquidationValues(liquidationTx); + const [liquidatedDebt, liquidatedColl, gasComp] = th.getEmittedLiquidationValues(liquidationTx); // --- TEST --- const collChange = 0; @@ -4405,9 +4368,9 @@ contract("BorrowerOperations", async (accounts) => { true, debtChange, true, - liqPrice + liqPrice, ); - + const expectedTCR = whaleColl .add(liquidatedColl) .mul(liqPrice) @@ -4426,47 +4389,38 @@ contract("BorrowerOperations", async (accounts) => { const bobBoldAmount = await getOpenTroveBoldAmount(bobTotalDebt); const whaleBoldAmount = await getOpenTroveBoldAmount(whaleTotalDebt); - await th.openTroveWrapper(contracts, - th._100pct, - whaleBoldAmount, - whale, - whale, - 0, - { from: whale, value: whaleColl } - ); + await th.openTroveWrapper(contracts, th._100pct, whaleBoldAmount, whale, whale, 0, { + from: whale, + value: whaleColl, + }); - const bobTroveId = await th.openTroveWrapper(contracts, - th._100pct, - bobBoldAmount, - bob, - bob, - 0, - { from: bob, value: bobColl } - ); + const bobTroveId = await th.openTroveWrapper(contracts, th._100pct, bobBoldAmount, bob, bob, 0, { + from: bob, + value: bobColl, + }); - const liqPrice = th.toBN(dec(100,18)) + const liqPrice = th.toBN(dec(100, 18)); // th.logBN("Bob ICR before liq", await troveManager.getCurrentICR(bob, liqPrice)) await priceFeed.setPrice(liqPrice); // Confirm we are in Normal Mode - assert.isFalse(await troveManager.checkRecoveryMode(liqPrice)) + assert.isFalse(await troveManager.checkRecoveryMode(liqPrice)); const liquidationTx = await troveManager.liquidate(bobTroveId); assert.isFalse(await sortedTroves.contains(bobTroveId)); - const [liquidatedDebt, liquidatedColl, gasComp] = - th.getEmittedLiquidationValues(liquidationTx); + const [liquidatedDebt, liquidatedColl, gasComp] = th.getEmittedLiquidationValues(liquidationTx); // --- TEST --- const collChange = th.toBN(0); - const debtChange = th.toBN(dec(100, 18)) + const debtChange = th.toBN(dec(100, 18)); const newTCR = await borrowerOperations.getNewTCRFromTroveChange( collChange, true, debtChange, true, - liqPrice + liqPrice, ); - + const expectedTCR = whaleColl .add(liquidatedColl) .mul(liqPrice) @@ -4475,7 +4429,7 @@ contract("BorrowerOperations", async (accounts) => { assert.isTrue(newTCR.eq(expectedTCR)); }); - // 0, -ve + // 0, -ve it("collChange = 0, debtChange is negative", async () => { // --- SETUP --- Create a Liquity instance with an Active Pool and pending rewards (Default Pool) const bobColl = toBN(dec(1000, "ether")); @@ -4485,47 +4439,38 @@ contract("BorrowerOperations", async (accounts) => { const bobBoldAmount = await getOpenTroveBoldAmount(bobTotalDebt); const whaleBoldAmount = await getOpenTroveBoldAmount(whaleTotalDebt); - await th.openTroveWrapper(contracts, - th._100pct, - whaleBoldAmount, - whale, - whale, - 0, - { from: whale, value: whaleColl } - ); + await th.openTroveWrapper(contracts, th._100pct, whaleBoldAmount, whale, whale, 0, { + from: whale, + value: whaleColl, + }); - const bobTroveId = await th.openTroveWrapper(contracts, - th._100pct, - bobBoldAmount, - bob, - bob, - 0, - { from: bob, value: bobColl } - ); + const bobTroveId = await th.openTroveWrapper(contracts, th._100pct, bobBoldAmount, bob, bob, 0, { + from: bob, + value: bobColl, + }); - const liqPrice = th.toBN(dec(100,18)) + const liqPrice = th.toBN(dec(100, 18)); // th.logBN("Bob ICR before liq", await troveManager.getCurrentICR(bob, liqPrice)) await priceFeed.setPrice(liqPrice); // Confirm we are in Normal Mode - assert.isFalse(await troveManager.checkRecoveryMode(liqPrice)) + assert.isFalse(await troveManager.checkRecoveryMode(liqPrice)); const liquidationTx = await troveManager.liquidate(bobTroveId); assert.isFalse(await sortedTroves.contains(bobTroveId)); - const [liquidatedDebt, liquidatedColl, gasComp] = - th.getEmittedLiquidationValues(liquidationTx); + const [liquidatedDebt, liquidatedColl, gasComp] = th.getEmittedLiquidationValues(liquidationTx); // --- TEST --- const collChange = th.toBN(0); - const debtChange = th.toBN(dec(100, 18)) + const debtChange = th.toBN(dec(100, 18)); const newTCR = await borrowerOperations.getNewTCRFromTroveChange( collChange, true, debtChange, false, - liqPrice + liqPrice, ); - + const expectedTCR = whaleColl .add(liquidatedColl) .mul(liqPrice) @@ -4544,34 +4489,25 @@ contract("BorrowerOperations", async (accounts) => { const bobBoldAmount = await getOpenTroveBoldAmount(bobTotalDebt); const whaleBoldAmount = await getOpenTroveBoldAmount(whaleTotalDebt); - await th.openTroveWrapper(contracts, - th._100pct, - whaleBoldAmount, - whale, - whale, - 0, - { from: whale, value: whaleColl } - ); - const bobTroveId = await th.openTroveWrapper(contracts, - th._100pct, - bobBoldAmount, - bob, - bob, - 0, - { from: bob, value: bobColl } - ); + await th.openTroveWrapper(contracts, th._100pct, whaleBoldAmount, whale, whale, 0, { + from: whale, + value: whaleColl, + }); + const bobTroveId = await th.openTroveWrapper(contracts, th._100pct, bobBoldAmount, bob, bob, 0, { + from: bob, + value: bobColl, + }); - const liqPrice = th.toBN(dec(100,18)) + const liqPrice = th.toBN(dec(100, 18)); // th.logBN("Bob ICR before liq", await troveManager.getCurrentICR(bob, liqPrice)) await priceFeed.setPrice(liqPrice); // Confirm we are in Normal Mode - assert.isFalse(await troveManager.checkRecoveryMode(liqPrice)) + assert.isFalse(await troveManager.checkRecoveryMode(liqPrice)); const liquidationTx = await troveManager.liquidate(bobTroveId); assert.isFalse(await sortedTroves.contains(bobTroveId)); - const [liquidatedDebt, liquidatedColl, gasComp] = - th.getEmittedLiquidationValues(liquidationTx); + const [liquidatedDebt, liquidatedColl, gasComp] = th.getEmittedLiquidationValues(liquidationTx); // --- TEST --- const collChange = th.toBN(dec(100, 18)); @@ -4581,9 +4517,9 @@ contract("BorrowerOperations", async (accounts) => { true, debtChange, true, - liqPrice + liqPrice, ); - + const expectedTCR = whaleColl .add(liquidatedColl).add(collChange) .mul(liqPrice) @@ -4602,35 +4538,26 @@ contract("BorrowerOperations", async (accounts) => { const bobBoldAmount = await getOpenTroveBoldAmount(bobTotalDebt); const whaleBoldAmount = await getOpenTroveBoldAmount(whaleTotalDebt); - await th.openTroveWrapper(contracts, - th._100pct, - whaleBoldAmount, - whale, - whale, - 0, - { from: whale, value: whaleColl } - ); + await th.openTroveWrapper(contracts, th._100pct, whaleBoldAmount, whale, whale, 0, { + from: whale, + value: whaleColl, + }); - const bobTroveId = await th.openTroveWrapper(contracts, - th._100pct, - bobBoldAmount, - bob, - bob, - 0, - { from: bob, value: bobColl } - ); + const bobTroveId = await th.openTroveWrapper(contracts, th._100pct, bobBoldAmount, bob, bob, 0, { + from: bob, + value: bobColl, + }); - const liqPrice = th.toBN(dec(100,18)) + const liqPrice = th.toBN(dec(100, 18)); // th.logBN("Bob ICR before liq", await troveManager.getCurrentICR(bob, liqPrice)) await priceFeed.setPrice(liqPrice); // Confirm we are in Normal Mode - assert.isFalse(await troveManager.checkRecoveryMode(liqPrice)) + assert.isFalse(await troveManager.checkRecoveryMode(liqPrice)); const liquidationTx = await troveManager.liquidate(bobTroveId); assert.isFalse(await sortedTroves.contains(bobTroveId)); - const [liquidatedDebt, liquidatedColl, gasComp] = - th.getEmittedLiquidationValues(liquidationTx); + const [liquidatedDebt, liquidatedColl, gasComp] = th.getEmittedLiquidationValues(liquidationTx); // --- TEST --- const collChange = th.toBN(dec(100, 18)); @@ -4640,9 +4567,9 @@ contract("BorrowerOperations", async (accounts) => { false, debtChange, true, - liqPrice + liqPrice, ); - + const expectedTCR = whaleColl .add(liquidatedColl).sub(collChange) .mul(liqPrice) @@ -4661,35 +4588,26 @@ contract("BorrowerOperations", async (accounts) => { const bobBoldAmount = await getOpenTroveBoldAmount(bobTotalDebt); const whaleBoldAmount = await getOpenTroveBoldAmount(whaleTotalDebt); - await th.openTroveWrapper(contracts, - th._100pct, - whaleBoldAmount, - whale, - whale, - 0, - { from: whale, value: whaleColl } - ); + await th.openTroveWrapper(contracts, th._100pct, whaleBoldAmount, whale, whale, 0, { + from: whale, + value: whaleColl, + }); - const bobTroveId = await th.openTroveWrapper(contracts, - th._100pct, - bobBoldAmount, - bob, - bob, - 0, - { from: bob, value: bobColl } - ); + const bobTroveId = await th.openTroveWrapper(contracts, th._100pct, bobBoldAmount, bob, bob, 0, { + from: bob, + value: bobColl, + }); - const liqPrice = th.toBN(dec(100,18)) + const liqPrice = th.toBN(dec(100, 18)); // th.logBN("Bob ICR before liq", await troveManager.getCurrentICR(bob, liqPrice)) await priceFeed.setPrice(liqPrice); // Confirm we are in Normal Mode - assert.isFalse(await troveManager.checkRecoveryMode(liqPrice)) + assert.isFalse(await troveManager.checkRecoveryMode(liqPrice)); const liquidationTx = await troveManager.liquidate(bobTroveId); assert.isFalse(await sortedTroves.contains(bobTroveId)); - const [liquidatedDebt, liquidatedColl, gasComp] = - th.getEmittedLiquidationValues(liquidationTx); + const [liquidatedDebt, liquidatedColl, gasComp] = th.getEmittedLiquidationValues(liquidationTx); // --- TEST --- const collChange = th.toBN(dec(100, 18)); @@ -4699,9 +4617,9 @@ contract("BorrowerOperations", async (accounts) => { false, debtChange, false, - liqPrice + liqPrice, ); - + const expectedTCR = whaleColl .add(liquidatedColl).sub(collChange) .mul(liqPrice) @@ -4720,35 +4638,26 @@ contract("BorrowerOperations", async (accounts) => { const bobBoldAmount = await getOpenTroveBoldAmount(bobTotalDebt); const whaleBoldAmount = await getOpenTroveBoldAmount(whaleTotalDebt); - await th.openTroveWrapper(contracts, - th._100pct, - whaleBoldAmount, - whale, - whale, - 0, - { from: whale, value: whaleColl } - ); + await th.openTroveWrapper(contracts, th._100pct, whaleBoldAmount, whale, whale, 0, { + from: whale, + value: whaleColl, + }); - const bobTroveId = await th.openTroveWrapper(contracts, - th._100pct, - bobBoldAmount, - bob, - bob, - 0, - { from: bob, value: bobColl } - ); + const bobTroveId = await th.openTroveWrapper(contracts, th._100pct, bobBoldAmount, bob, bob, 0, { + from: bob, + value: bobColl, + }); - const liqPrice = th.toBN(dec(100,18)) + const liqPrice = th.toBN(dec(100, 18)); // th.logBN("Bob ICR before liq", await troveManager.getCurrentICR(bob, liqPrice)) await priceFeed.setPrice(liqPrice); // Confirm we are in Normal Mode - assert.isFalse(await troveManager.checkRecoveryMode(liqPrice)) + assert.isFalse(await troveManager.checkRecoveryMode(liqPrice)); const liquidationTx = await troveManager.liquidate(bobTroveId); assert.isFalse(await sortedTroves.contains(bobTroveId)); - const [liquidatedDebt, liquidatedColl, gasComp] = - th.getEmittedLiquidationValues(liquidationTx); + const [liquidatedDebt, liquidatedColl, gasComp] = th.getEmittedLiquidationValues(liquidationTx); // --- TEST --- const collChange = th.toBN(dec(100, 18)); @@ -4758,9 +4667,9 @@ contract("BorrowerOperations", async (accounts) => { true, debtChange, true, - liqPrice + liqPrice, ); - + const expectedTCR = whaleColl .add(liquidatedColl).add(collChange) .mul(liqPrice) @@ -4779,35 +4688,26 @@ contract("BorrowerOperations", async (accounts) => { const bobBoldAmount = await getOpenTroveBoldAmount(bobTotalDebt); const whaleBoldAmount = await getOpenTroveBoldAmount(whaleTotalDebt); - await th.openTroveWrapper(contracts, - th._100pct, - whaleBoldAmount, - whale, - whale, - 0, - { from: whale, value: whaleColl } - ); + await th.openTroveWrapper(contracts, th._100pct, whaleBoldAmount, whale, whale, 0, { + from: whale, + value: whaleColl, + }); - const bobTroveId = await th.openTroveWrapper(contracts, - th._100pct, - bobBoldAmount, - bob, - bob, - 0, - { from: bob, value: bobColl } - ); + const bobTroveId = await th.openTroveWrapper(contracts, th._100pct, bobBoldAmount, bob, bob, 0, { + from: bob, + value: bobColl, + }); - const liqPrice = th.toBN(dec(100,18)) + const liqPrice = th.toBN(dec(100, 18)); // th.logBN("Bob ICR before liq", await troveManager.getCurrentICR(bob, liqPrice)) await priceFeed.setPrice(liqPrice); // Confirm we are in Normal Mode - assert.isFalse(await troveManager.checkRecoveryMode(liqPrice)) + assert.isFalse(await troveManager.checkRecoveryMode(liqPrice)); const liquidationTx = await troveManager.liquidate(bobTroveId); assert.isFalse(await sortedTroves.contains(bobTroveId)); - const [liquidatedDebt, liquidatedColl, gasComp] = - th.getEmittedLiquidationValues(liquidationTx); + const [liquidatedDebt, liquidatedColl, gasComp] = th.getEmittedLiquidationValues(liquidationTx); // --- TEST --- const collChange = th.toBN(dec(100, 18)); @@ -4817,9 +4717,9 @@ contract("BorrowerOperations", async (accounts) => { true, debtChange, false, - liqPrice + liqPrice, ); - + const expectedTCR = whaleColl .add(liquidatedColl).add(collChange) .mul(liqPrice) @@ -4838,35 +4738,26 @@ contract("BorrowerOperations", async (accounts) => { const bobBoldAmount = await getOpenTroveBoldAmount(bobTotalDebt); const whaleBoldAmount = await getOpenTroveBoldAmount(whaleTotalDebt); - await th.openTroveWrapper(contracts, - th._100pct, - whaleBoldAmount, - whale, - whale, - 0, - { from: whale, value: whaleColl } - ); + await th.openTroveWrapper(contracts, th._100pct, whaleBoldAmount, whale, whale, 0, { + from: whale, + value: whaleColl, + }); - const bobTroveId = await th.openTroveWrapper(contracts, - th._100pct, - bobBoldAmount, - bob, - bob, - 0, - { from: bob, value: bobColl } - ); + const bobTroveId = await th.openTroveWrapper(contracts, th._100pct, bobBoldAmount, bob, bob, 0, { + from: bob, + value: bobColl, + }); - const liqPrice = th.toBN(dec(100,18)) + const liqPrice = th.toBN(dec(100, 18)); // th.logBN("Bob ICR before liq", await troveManager.getCurrentICR(bob, liqPrice)) await priceFeed.setPrice(liqPrice); // Confirm we are in Normal Mode - assert.isFalse(await troveManager.checkRecoveryMode(liqPrice)) + assert.isFalse(await troveManager.checkRecoveryMode(liqPrice)); const liquidationTx = await troveManager.liquidate(bobTroveId); assert.isFalse(await sortedTroves.contains(bobTroveId)); - const [liquidatedDebt, liquidatedColl, gasComp] = - th.getEmittedLiquidationValues(liquidationTx); + const [liquidatedDebt, liquidatedColl, gasComp] = th.getEmittedLiquidationValues(liquidationTx); // --- TEST --- const collChange = th.toBN(dec(100, 18)); @@ -4876,9 +4767,9 @@ contract("BorrowerOperations", async (accounts) => { false, debtChange, true, - liqPrice + liqPrice, ); - + const expectedTCR = whaleColl .add(liquidatedColl).sub(collChange) .mul(liqPrice) diff --git a/contracts/test/CollSurplusPool.js b/contracts/test/CollSurplusPool.js index 6e289483..a431eb11 100644 --- a/contracts/test/CollSurplusPool.js +++ b/contracts/test/CollSurplusPool.js @@ -1,4 +1,4 @@ -const { time } = require('@nomicfoundation/hardhat-network-helpers'); +const { time } = require("@nomicfoundation/hardhat-network-helpers"); const { createDeployAndFundFixture } = require("../utils/testFixtures.js"); const { MoneyValues: mv, @@ -22,8 +22,7 @@ contract("CollSurplusPool", async (accounts) => { let collSurplusPool; let priceFeed; - const getOpenTroveBoldAmount = async (totalDebt) => - th.getOpenTroveBoldAmount(contracts, totalDebt); + const getOpenTroveBoldAmount = async (totalDebt) => th.getOpenTroveBoldAmount(contracts, totalDebt); const openTrove = async (params) => th.openTrove(contracts, params); const deployFixture = createDeployAndFundFixture({ @@ -42,14 +41,14 @@ contract("CollSurplusPool", async (accounts) => { it("CollSurplusPool: claimColl(): Reverts if caller is not Borrower Operations", async () => { await th.assertRevert( collSurplusPool.claimColl(A, th.addressToTroveId(A), { from: A }), - "CollSurplusPool: Caller is not Borrower Operations" + "CollSurplusPool: Caller is not Borrower Operations", ); }); it("CollSurplusPool: claimColl(): Reverts if nothing to claim", async () => { await th.assertRevert( borrowerOperations.claimCollateral(th.addressToTroveId(A), { from: A }), - "CollSurplusPool: No collateral available to claim" + "CollSurplusPool: No collateral available to claim", ); }); @@ -60,14 +59,14 @@ contract("CollSurplusPool", async (accounts) => { to: collSurplusPool.address, value: 1, }), - "CollSurplusPool: Caller is not Active Pool" + "CollSurplusPool: Caller is not Active Pool", ); }); it("CollSurplusPool: accountSurplus: reverts if caller is not Trove Manager", async () => { await th.assertRevert( collSurplusPool.accountSurplus(A, 1), - "CollSurplusPool: Caller is not TroveManager" + "CollSurplusPool: Caller is not TroveManager", ); }); }); diff --git a/contracts/test/ConnectContractsTest.js b/contracts/test/ConnectContractsTest.js index d3aa84ca..27c2fe26 100644 --- a/contracts/test/ConnectContractsTest.js +++ b/contracts/test/ConnectContractsTest.js @@ -1,22 +1,20 @@ -const deploymentHelper = require("../utils/deploymentHelpers.js") +const deploymentHelper = require("../utils/deploymentHelpers.js"); -contract('Deployment script - Sets correct contract addresses dependencies after deployment', async accounts => { +contract("Deployment script - Sets correct contract addresses dependencies after deployment", async (accounts) => { const [owner] = accounts; - const [bountyAddress, lpRewardsAddress, multisig] = accounts.slice(997, 1000) - + const [bountyAddress, lpRewardsAddress, multisig] = accounts.slice(997, 1000); - let priceFeed - let boldToken - let sortedTroves - let troveManager - let activePool - let stabilityPool + let priceFeed; + let boldToken; + let sortedTroves; + let troveManager; + let activePool; + let stabilityPool; let defaultPool; let borrowerOperations; before(async () => { - const coreContracts = await deploymentHelper.deployLiquityCore(); priceFeed = coreContracts.priceFeedTestnet; @@ -59,8 +57,7 @@ contract('Deployment script - Sets correct contract addresses dependencies after it("Sets the correct BorrowerOperations address in TroveManager", async () => { const borrowerOperationsAddress = borrowerOperations.address; - const recordedBorrowerOperationsAddress = - await troveManager.borrowerOperationsAddress(); + const recordedBorrowerOperationsAddress = await troveManager.borrowerOperationsAddress(); assert.equal(borrowerOperationsAddress, recordedBorrowerOperationsAddress); }); @@ -92,14 +89,12 @@ contract('Deployment script - Sets correct contract addresses dependencies after assert.equal(stabilityPoolAddress, recordedStabilityPoolAddresss); }); - // Active Pool it("Sets the correct StabilityPool address in ActivePool", async () => { const stabilityPoolAddress = stabilityPool.address; - const recordedStabilityPoolAddress = - await activePool.stabilityPoolAddress(); + const recordedStabilityPoolAddress = await activePool.stabilityPoolAddress(); assert.equal(stabilityPoolAddress, recordedStabilityPoolAddress); }); @@ -115,8 +110,7 @@ contract('Deployment script - Sets correct contract addresses dependencies after it("Sets the correct BorrowerOperations address in ActivePool", async () => { const borrowerOperationsAddress = borrowerOperations.address; - const recordedBorrowerOperationsAddress = - await activePool.borrowerOperationsAddress(); + const recordedBorrowerOperationsAddress = await activePool.borrowerOperationsAddress(); assert.equal(borrowerOperationsAddress, recordedBorrowerOperationsAddress); }); @@ -140,8 +134,7 @@ contract('Deployment script - Sets correct contract addresses dependencies after it("Sets the correct BorrowerOperations address in StabilityPool", async () => { const borrowerOperationsAddress = borrowerOperations.address; - const recordedBorrowerOperationsAddress = - await stabilityPool.borrowerOperations(); + const recordedBorrowerOperationsAddress = await stabilityPool.borrowerOperations(); assert.equal(borrowerOperationsAddress, recordedBorrowerOperationsAddress); }); @@ -180,8 +173,7 @@ contract('Deployment script - Sets correct contract addresses dependencies after it("Sets the correct TroveManager address in SortedTroves", async () => { const borrowerOperationsAddress = borrowerOperations.address; - const recordedBorrowerOperationsAddress = - await sortedTroves.borrowerOperationsAddress(); + const recordedBorrowerOperationsAddress = await sortedTroves.borrowerOperationsAddress(); assert.equal(borrowerOperationsAddress, recordedBorrowerOperationsAddress); }); @@ -192,7 +184,7 @@ contract('Deployment script - Sets correct contract addresses dependencies after assert.equal(troveManagerAddress, recordedTroveManagerAddress); }); - //--- BorrowerOperations --- + // --- BorrowerOperations --- // TroveManager in BO it("Sets the correct TroveManager address in BorrowerOperations", async () => { @@ -233,4 +225,4 @@ contract('Deployment script - Sets correct contract addresses dependencies after const recordedDefaultPoolAddress = await borrowerOperations.defaultPool(); assert.equal(defaultPoolAddress, recordedDefaultPoolAddress); }); -}) +}); diff --git a/contracts/test/FeeArithmeticTest.js b/contracts/test/FeeArithmeticTest.js index 5ee8a5a5..2da8c064 100644 --- a/contracts/test/FeeArithmeticTest.js +++ b/contracts/test/FeeArithmeticTest.js @@ -1,23 +1,23 @@ -const { time } = require('@nomicfoundation/hardhat-network-helpers'); +const { time } = require("@nomicfoundation/hardhat-network-helpers"); const Decimal = require("decimal.js"); -const { BNConverter } = require("../utils/BNConverter.js") -const testHelpers = require("../utils/testHelpers.js") +const { BNConverter } = require("../utils/BNConverter.js"); +const testHelpers = require("../utils/testHelpers.js"); const { createDeployAndFundFixture } = require("../utils/testFixtures.js"); -const TroveManagerTester = artifacts.require("./TroveManagerTester.sol") -const LiquityMathTester = artifacts.require("./LiquityMathTester.sol") +const TroveManagerTester = artifacts.require("./TroveManagerTester.sol"); +const LiquityMathTester = artifacts.require("./LiquityMathTester.sol"); -const th = testHelpers.TestHelper -const timeValues = testHelpers.TimeValues -const dec = th.dec -const toBN = th.toBN -const getDifference = th.getDifference +const th = testHelpers.TestHelper; +const timeValues = testHelpers.TimeValues; +const dec = th.dec; +const toBN = th.toBN; +const getDifference = th.getDifference; -contract('Fee arithmetic tests', async accounts => { - let contracts - let troveManagerTester - let mathTester +contract("Fee arithmetic tests", async (accounts) => { + let contracts; + let troveManagerTester; + let mathTester; - const [bountyAddress, lpRewardsAddress, multisig] = accounts.slice(997, 1000) + const [bountyAddress, lpRewardsAddress, multisig] = accounts.slice(997, 1000); // see: https://docs.google.com/spreadsheets/d/1RbD8VGzq7xFgeK1GOkz_9bbKVIx-xkOz0VsVelnUFdc/edit#gid=0 // Results array, maps seconds to expected minutes passed output (rounded down to nearest hour). @@ -62,14 +62,13 @@ contract('Fee arithmetic tests', async accounts => { [31535999000, 525599983], [31536000000, 525600000], [50309080980, 838484683], - ] - + ]; /* Object holds arrays for seconds passed, and the corresponding expected decayed base rate, given an initial base rate */ const decayBaseRateResults = { - 'seconds': [ + "seconds": [ 0, 1, 3, @@ -78,39 +77,39 @@ contract('Fee arithmetic tests', async accounts => { 1179, 2343, 3547, - 3600, // 1 hour + 3600, // 1 hour 10000, 15000, 17900, - 18000, // 5 hours + 18000, // 5 hours 61328, 65932, 79420, 86147, - 86400, // 1 day + 86400, // 1 day 35405, 100000, 604342, - 604800, // 1 week + 604800, // 1 week 1092099, 2591349, - 2592000, // 1 month + 2592000, // 1 month 5940183, 8102940, 31535342, 31536000, // 1 year 56809809, - 315360000, // 10 years + 315360000, // 10 years 793450405, 1098098098, - 3153600000, // 100 years + 3153600000, // 100 years 4098977899, 9999999999, 31535999000, - 31536000000, // 1000 years + 31536000000, // 1000 years 50309080980, ], - '0.01': [ + "0.01": [ 10000000000000000, 10000000000000000, 10000000000000000, @@ -151,7 +150,7 @@ contract('Fee arithmetic tests', async accounts => { 0, 0, ], - '0.1': [ + "0.1": [ 100000000000000000, 100000000000000000, 100000000000000000, @@ -192,7 +191,7 @@ contract('Fee arithmetic tests', async accounts => { 0, 0, ], - '0.34539284': [ + "0.34539284": [ 345392840000000000, 345392840000000000, 345392840000000000, @@ -233,7 +232,7 @@ contract('Fee arithmetic tests', async accounts => { 0, 0, ], - '0.9976': [ + "0.9976": [ 997600000000000000, 997600000000000000, 997600000000000000, @@ -273,8 +272,8 @@ contract('Fee arithmetic tests', async accounts => { 0, 0, 0, - ] - } + ], + }; // Exponent in range [2, 300] const exponentiationResults = [ @@ -329,447 +328,460 @@ contract('Fee arithmetic tests', async accounts => { [457498365370101000, 40, 26036], [487046034636363000, 12, 178172281758289], [919877008002166000, 85, 826094891277916], - ] + ]; const deployFixture = createDeployAndFundFixture({ callback: async () => { - const troveManagerTester = await TroveManagerTester.new() - TroveManagerTester.setAsDeployed(troveManagerTester) + const troveManagerTester = await TroveManagerTester.new(); + TroveManagerTester.setAsDeployed(troveManagerTester); - const mathTester = await LiquityMathTester.new() - LiquityMathTester.setAsDeployed(mathTester) + const mathTester = await LiquityMathTester.new(); + LiquityMathTester.setAsDeployed(mathTester); - return { mathTester, troveManagerTester } - } + return { mathTester, troveManagerTester }; + }, }); beforeEach(async () => { - const result = await deployFixture() - contracts = result.contracts - troveManagerTester = result.troveManagerTester - mathTester = result.mathTester - }) + const result = await deployFixture(); + contracts = result.contracts; + troveManagerTester = result.troveManagerTester; + mathTester = result.mathTester; + }); it("minutesPassedSinceLastFeeOp(): returns minutes passed for no time increase", async () => { - await troveManagerTester.setLastFeeOpTimeToNow() - const minutesPassed = await troveManagerTester.minutesPassedSinceLastFeeOp() + await troveManagerTester.setLastFeeOpTimeToNow(); + const minutesPassed = await troveManagerTester.minutesPassedSinceLastFeeOp(); - assert.equal(minutesPassed, '0') - }) + assert.equal(minutesPassed, "0"); + }); it("minutesPassedSinceLastFeeOp(): returns minutes passed between time of last fee operation and current block.timestamp, rounded down to nearest minutes", async () => { for (const [seconds, expectedMinutesPassed] of secondsToMinutesRoundedDown) { - await troveManagerTester.setLastFeeOpTimeToNow() + await troveManagerTester.setLastFeeOpTimeToNow(); if (seconds > 0) { - await time.increase(seconds) + await time.increase(seconds); } - const minutesPassed = await troveManagerTester.minutesPassedSinceLastFeeOp() + const minutesPassed = await troveManagerTester.minutesPassedSinceLastFeeOp(); - assert.equal(expectedMinutesPassed.toString(), minutesPassed.toString()) + assert.equal(expectedMinutesPassed.toString(), minutesPassed.toString()); } - }) + }); // --- Exponentiation tests --- - describe('Basic exponentiation', async accounts => { + describe("Basic exponentiation", async (accounts) => { // for exponent = 0, returns 1 it("decPow(): for exponent = 0, returns 1, regardless of base", async () => { - const a = '0' - const b = '1' - const c = dec(1, 18) - const d = '123244254546' - const e = '990000000000000000' - const f = '897890990909098978678609090' - const g = dec(8789789, 27) - const maxUint256 = toBN('2').pow(toBN('256')).sub(toBN('1')) - - const res_a = await mathTester.callDecPow(a, 0) - const res_b = await mathTester.callDecPow(b, 0) - const res_c = await mathTester.callDecPow(c, 0) - const res_d = await mathTester.callDecPow(d, 0) - const res_e = await mathTester.callDecPow(e, 0) - const res_f = await mathTester.callDecPow(f, 0) - const res_g = await mathTester.callDecPow(f, 0) - const res_max = await mathTester.callDecPow(f, 0) - - assert.equal(res_a, dec(1, 18)) - assert.equal(res_b, dec(1, 18)) - assert.equal(res_c, dec(1, 18)) - assert.equal(res_d, dec(1, 18)) - assert.equal(res_e, dec(1, 18)) - assert.equal(res_f, dec(1, 18)) - assert.equal(res_g, dec(1, 18)) - assert.equal(res_max, dec(1, 18)) - }) + const a = "0"; + const b = "1"; + const c = dec(1, 18); + const d = "123244254546"; + const e = "990000000000000000"; + const f = "897890990909098978678609090"; + const g = dec(8789789, 27); + const maxUint256 = toBN("2").pow(toBN("256")).sub(toBN("1")); + + const res_a = await mathTester.callDecPow(a, 0); + const res_b = await mathTester.callDecPow(b, 0); + const res_c = await mathTester.callDecPow(c, 0); + const res_d = await mathTester.callDecPow(d, 0); + const res_e = await mathTester.callDecPow(e, 0); + const res_f = await mathTester.callDecPow(f, 0); + const res_g = await mathTester.callDecPow(f, 0); + const res_max = await mathTester.callDecPow(f, 0); + + assert.equal(res_a, dec(1, 18)); + assert.equal(res_b, dec(1, 18)); + assert.equal(res_c, dec(1, 18)); + assert.equal(res_d, dec(1, 18)); + assert.equal(res_e, dec(1, 18)); + assert.equal(res_f, dec(1, 18)); + assert.equal(res_g, dec(1, 18)); + assert.equal(res_max, dec(1, 18)); + }); // for exponent = 1, returns base it("decPow(): for exponent = 1, returns base, regardless of base", async () => { - const a = '0' - const b = '1' - const c = dec(1, 18) - const d = '123244254546' - const e = '990000000000000000' - const f = '897890990909098978678609090' - const g = dec(8789789, 27) - const maxUint128 = toBN('2').pow(toBN('128')).sub(toBN('1')) - const maxUint192 = toBN('2').pow(toBN('192')).sub(toBN('1')) - - const res_a = await mathTester.callDecPow(a, 1) - const res_b = await mathTester.callDecPow(b, 1) - const res_c = await mathTester.callDecPow(c, 1) - const res_d = await mathTester.callDecPow(d, 1) - const res_e = await mathTester.callDecPow(e, 1) - const res_f = await mathTester.callDecPow(f, 1) - const res_g = await mathTester.callDecPow(g, 1) - const res_max128 = await mathTester.callDecPow(maxUint128, 1) - const res_max192 = await mathTester.callDecPow(maxUint192, 1) - - assert.equal(res_a, a) - assert.equal(res_b, b) - assert.equal(res_c, c) - assert.equal(res_d, d) - assert.equal(res_e, e) - assert.equal(res_f, f) - assert.equal(res_g, g) - assert.isTrue(res_max128.eq(maxUint128)) - assert.isTrue(res_max192.eq(maxUint192)) - }) + const a = "0"; + const b = "1"; + const c = dec(1, 18); + const d = "123244254546"; + const e = "990000000000000000"; + const f = "897890990909098978678609090"; + const g = dec(8789789, 27); + const maxUint128 = toBN("2").pow(toBN("128")).sub(toBN("1")); + const maxUint192 = toBN("2").pow(toBN("192")).sub(toBN("1")); + + const res_a = await mathTester.callDecPow(a, 1); + const res_b = await mathTester.callDecPow(b, 1); + const res_c = await mathTester.callDecPow(c, 1); + const res_d = await mathTester.callDecPow(d, 1); + const res_e = await mathTester.callDecPow(e, 1); + const res_f = await mathTester.callDecPow(f, 1); + const res_g = await mathTester.callDecPow(g, 1); + const res_max128 = await mathTester.callDecPow(maxUint128, 1); + const res_max192 = await mathTester.callDecPow(maxUint192, 1); + + assert.equal(res_a, a); + assert.equal(res_b, b); + assert.equal(res_c, c); + assert.equal(res_d, d); + assert.equal(res_e, e); + assert.equal(res_f, f); + assert.equal(res_g, g); + assert.isTrue(res_max128.eq(maxUint128)); + assert.isTrue(res_max192.eq(maxUint192)); + }); // for base = 0, returns 0 for any exponent other than 1 it("decPow(): for base = 0, returns 0 for any exponent other than 0", async () => { - const res_a = await mathTester.callDecPow(0, 1) - const res_b = await mathTester.callDecPow(0, 3) - const res_c = await mathTester.callDecPow(0, 17) - const res_d = await mathTester.callDecPow(0, 44) - const res_e = await mathTester.callDecPow(0, 118) - const res_f = await mathTester.callDecPow(0, 1000) - const res_g = await mathTester.callDecPow(0, dec(1, 6)) - const res_h = await mathTester.callDecPow(0, dec(1, 9)) - const res_i = await mathTester.callDecPow(0, dec(1, 12)) - const res_j = await mathTester.callDecPow(0, dec(1, 18)) - - assert.equal(res_a, '0') - assert.equal(res_b, '0') - assert.equal(res_c, '0') - assert.equal(res_d, '0') - assert.equal(res_e, '0') - assert.equal(res_f, '0') - assert.equal(res_g, '0') - assert.equal(res_h, '0') - assert.equal(res_i, '0') - assert.equal(res_j, '0') - }) - + const res_a = await mathTester.callDecPow(0, 1); + const res_b = await mathTester.callDecPow(0, 3); + const res_c = await mathTester.callDecPow(0, 17); + const res_d = await mathTester.callDecPow(0, 44); + const res_e = await mathTester.callDecPow(0, 118); + const res_f = await mathTester.callDecPow(0, 1000); + const res_g = await mathTester.callDecPow(0, dec(1, 6)); + const res_h = await mathTester.callDecPow(0, dec(1, 9)); + const res_i = await mathTester.callDecPow(0, dec(1, 12)); + const res_j = await mathTester.callDecPow(0, dec(1, 18)); + + assert.equal(res_a, "0"); + assert.equal(res_b, "0"); + assert.equal(res_c, "0"); + assert.equal(res_d, "0"); + assert.equal(res_e, "0"); + assert.equal(res_f, "0"); + assert.equal(res_g, "0"); + assert.equal(res_h, "0"); + assert.equal(res_i, "0"); + assert.equal(res_j, "0"); + }); // for base = 1, returns 1 for any exponent it("decPow(): for base = 1, returns 1 for any exponent", async () => { - const ONE = dec(1, 18) - const res_a = await mathTester.callDecPow(ONE, 1) - const res_b = await mathTester.callDecPow(ONE, 3) - const res_c = await mathTester.callDecPow(ONE, 17) - const res_d = await mathTester.callDecPow(ONE, 44) - const res_e = await mathTester.callDecPow(ONE, 118) - const res_f = await mathTester.callDecPow(ONE, 1000) - const res_g = await mathTester.callDecPow(ONE, dec(1, 6)) - const res_h = await mathTester.callDecPow(ONE, dec(1, 9)) - const res_i = await mathTester.callDecPow(ONE, dec(1, 12)) - const res_j = await mathTester.callDecPow(ONE, dec(1, 18)) - const res_k = await mathTester.callDecPow(ONE, 0) - - assert.equal(res_a, ONE) - assert.equal(res_b, ONE) - assert.equal(res_c, ONE) - assert.equal(res_d, ONE) - assert.equal(res_e, ONE) - assert.equal(res_f, ONE) - assert.equal(res_g, ONE) - assert.equal(res_h, ONE) - assert.equal(res_i, ONE) - assert.equal(res_j, ONE) - assert.equal(res_k, ONE) - }) + const ONE = dec(1, 18); + const res_a = await mathTester.callDecPow(ONE, 1); + const res_b = await mathTester.callDecPow(ONE, 3); + const res_c = await mathTester.callDecPow(ONE, 17); + const res_d = await mathTester.callDecPow(ONE, 44); + const res_e = await mathTester.callDecPow(ONE, 118); + const res_f = await mathTester.callDecPow(ONE, 1000); + const res_g = await mathTester.callDecPow(ONE, dec(1, 6)); + const res_h = await mathTester.callDecPow(ONE, dec(1, 9)); + const res_i = await mathTester.callDecPow(ONE, dec(1, 12)); + const res_j = await mathTester.callDecPow(ONE, dec(1, 18)); + const res_k = await mathTester.callDecPow(ONE, 0); + + assert.equal(res_a, ONE); + assert.equal(res_b, ONE); + assert.equal(res_c, ONE); + assert.equal(res_d, ONE); + assert.equal(res_e, ONE); + assert.equal(res_f, ONE); + assert.equal(res_g, ONE); + assert.equal(res_h, ONE); + assert.equal(res_i, ONE); + assert.equal(res_j, ONE); + assert.equal(res_k, ONE); + }); // for exponent = 2, returns base**2 it("decPow(): for exponent = 2, returns the square of the base", async () => { - const a = dec(1, 18) // 1 - const b = dec(15, 17) // 1.5 - const c = dec(5, 17) // 0.5 - const d = dec(321, 15) // 0.321 - const e = dec(2, 18) // 4 - const f = dec(1, 17) // 0.1 - const g = dec(1, 16) // 0.01 - const h = dec(99, 16) // 0.99 - const i = dec(125435, 15) // 125.435 - const j = dec(99999, 18) // 99999 - - const res_a = await mathTester.callDecPow(a, 2) - const res_b = await mathTester.callDecPow(b, 2) - const res_c = await mathTester.callDecPow(c, 2) - const res_d = await mathTester.callDecPow(d, 2) - const res_e = await mathTester.callDecPow(e, 2) - const res_f = await mathTester.callDecPow(f, 2) - const res_g = await mathTester.callDecPow(g, 2) - const res_h = await mathTester.callDecPow(h, 2) - const res_i = await mathTester.callDecPow(i, 2) - const res_j = await mathTester.callDecPow(j, 2) - - assert.equal(res_a.toString(), '1000000000000000000') - assert.equal(res_b.toString(), '2250000000000000000') - assert.equal(res_c.toString(), '250000000000000000') - assert.equal(res_d.toString(), '103041000000000000') - assert.equal(res_e.toString(), '4000000000000000000') - assert.equal(res_f.toString(), '10000000000000000') - assert.equal(res_g.toString(), '100000000000000') - assert.equal(res_h.toString(), '980100000000000000') - assert.equal(res_i.toString(), '15733939225000000000000') - assert.equal(res_j.toString(), '9999800001000000000000000000') - }) + const a = dec(1, 18); // 1 + const b = dec(15, 17); // 1.5 + const c = dec(5, 17); // 0.5 + const d = dec(321, 15); // 0.321 + const e = dec(2, 18); // 4 + const f = dec(1, 17); // 0.1 + const g = dec(1, 16); // 0.01 + const h = dec(99, 16); // 0.99 + const i = dec(125435, 15); // 125.435 + const j = dec(99999, 18); // 99999 + + const res_a = await mathTester.callDecPow(a, 2); + const res_b = await mathTester.callDecPow(b, 2); + const res_c = await mathTester.callDecPow(c, 2); + const res_d = await mathTester.callDecPow(d, 2); + const res_e = await mathTester.callDecPow(e, 2); + const res_f = await mathTester.callDecPow(f, 2); + const res_g = await mathTester.callDecPow(g, 2); + const res_h = await mathTester.callDecPow(h, 2); + const res_i = await mathTester.callDecPow(i, 2); + const res_j = await mathTester.callDecPow(j, 2); + + assert.equal(res_a.toString(), "1000000000000000000"); + assert.equal(res_b.toString(), "2250000000000000000"); + assert.equal(res_c.toString(), "250000000000000000"); + assert.equal(res_d.toString(), "103041000000000000"); + assert.equal(res_e.toString(), "4000000000000000000"); + assert.equal(res_f.toString(), "10000000000000000"); + assert.equal(res_g.toString(), "100000000000000"); + assert.equal(res_h.toString(), "980100000000000000"); + assert.equal(res_i.toString(), "15733939225000000000000"); + assert.equal(res_j.toString(), "9999800001000000000000000000"); + }); it("decPow(): correct output for various bases and exponents", async () => { for (list of exponentiationResults) { - const base = list[0].toString() - const exponent = list[1].toString() - const expectedResult = list[2].toString() + const base = list[0].toString(); + const exponent = list[1].toString(); + const expectedResult = list[2].toString(); - const result = await mathTester.callDecPow(base, exponent) + const result = await mathTester.callDecPow(base, exponent); - assert.isAtMost(getDifference(expectedResult, result.toString()), 10000) // allow absolute error tolerance of 1e-14 + assert.isAtMost(getDifference(expectedResult, result.toString()), 10000); // allow absolute error tolerance of 1e-14 } - }) + }); it("decPow(): abs. error < 1e-9 for exponent = 7776000 (seconds in three months)", async () => { for (let i = 1; i <= 200; i++) { - const exponent = timeValues.SECONDS_IN_ONE_MONTH * 3 + const exponent = timeValues.SECONDS_IN_ONE_MONTH * 3; // Use a high base to fully test high exponent, without prematurely decaying to 0 - const base = th.randDecayFactor(0.999999, 0.999999999999999999) - const baseAsDecimal = BNConverter.makeDecimal(base, 18) + const base = th.randDecayFactor(0.999999, 0.999999999999999999); + const baseAsDecimal = BNConverter.makeDecimal(base, 18); // Calculate actual expected value - let expected = Decimal.pow(baseAsDecimal, exponent).toFixed(18) - expected = BNConverter.makeBN(expected) + let expected = Decimal.pow(baseAsDecimal, exponent).toFixed(18); + expected = BNConverter.makeBN(expected); - const res = await mathTester.callDecPow(base, exponent) + const res = await mathTester.callDecPow(base, exponent); - const error = expected.sub(res).abs() + const error = expected.sub(res).abs(); // console.log(`run: ${i}. base: ${base}, exp: ${exponent}, expected: ${expected}, res: ${res}, error: ${error}`) try { - assert.isAtMost(getDifference(expected, res.toString()), 1000000000) // allow absolute error tolerance of 1e-9 + assert.isAtMost(getDifference(expected, res.toString()), 1000000000); // allow absolute error tolerance of 1e-9 } catch (error) { - console.log(`run: ${i}. base: ${base}, exp: ${exponent}, expected: ${expected}, res: ${res}, error: ${error}`) + console.log( + `run: ${i}. base: ${base}, exp: ${exponent}, expected: ${expected}, res: ${res}, error: ${error}`, + ); } } - }) + }); it("decPow(): abs. error < 1e-9 for exponent = 2592000 (seconds in one month)", async () => { for (let i = 1; i <= 200; i++) { - const exponent = timeValues.SECONDS_IN_ONE_MONTH + const exponent = timeValues.SECONDS_IN_ONE_MONTH; // Use a high base to fully test high exponent, without prematurely decaying to 0 - const base = th.randDecayFactor(0.999995, 0.999999999999999999) - const baseAsDecimal = BNConverter.makeDecimal(base, 18) + const base = th.randDecayFactor(0.999995, 0.999999999999999999); + const baseAsDecimal = BNConverter.makeDecimal(base, 18); // Calculate actual expected value - let expected = Decimal.pow(baseAsDecimal, exponent).toFixed(18) - expected = BNConverter.makeBN(expected) + let expected = Decimal.pow(baseAsDecimal, exponent).toFixed(18); + expected = BNConverter.makeBN(expected); - const res = await mathTester.callDecPow(base, exponent) + const res = await mathTester.callDecPow(base, exponent); - const error = expected.sub(res).abs() + const error = expected.sub(res).abs(); // console.log(`run: ${i}. base: ${base}, exp: ${exponent}, expected: ${expected}, res: ${res}, error: ${error}`) try { - assert.isAtMost(getDifference(expected, res.toString()), 1000000000) // allow absolute error tolerance of 1e-9 + assert.isAtMost(getDifference(expected, res.toString()), 1000000000); // allow absolute error tolerance of 1e-9 } catch (error) { - console.log(`run: ${i}. base: ${base}, exp: ${exponent}, expected: ${expected}, res: ${res}, error: ${error}`) + console.log( + `run: ${i}. base: ${base}, exp: ${exponent}, expected: ${expected}, res: ${res}, error: ${error}`, + ); } } - }) + }); it("decPow(): abs. error < 1e-9 for exponent = 43200 (minutes in one month)", async () => { for (let i = 1; i <= 200; i++) { - const exponent = timeValues.MINUTES_IN_ONE_MONTH + const exponent = timeValues.MINUTES_IN_ONE_MONTH; // Use a high base to fully test high exponent, without prematurely decaying to 0 - const base = th.randDecayFactor(0.9997, 0.999999999999999999) - const baseAsDecimal = BNConverter.makeDecimal(base, 18) + const base = th.randDecayFactor(0.9997, 0.999999999999999999); + const baseAsDecimal = BNConverter.makeDecimal(base, 18); // Calculate actual expected value - let expected = Decimal.pow(baseAsDecimal, exponent).toFixed(18) - expected = BNConverter.makeBN(expected) + let expected = Decimal.pow(baseAsDecimal, exponent).toFixed(18); + expected = BNConverter.makeBN(expected); - const res = await mathTester.callDecPow(base, exponent) + const res = await mathTester.callDecPow(base, exponent); - const error = expected.sub(res).abs() + const error = expected.sub(res).abs(); // console.log(`run: ${i}. base: ${base}, exp: ${exponent}, expected: ${expected}, res: ${res}, error: ${error}`) try { - assert.isAtMost(getDifference(expected, res.toString()), 1000000000) // allow absolute error tolerance of 1e-9 + assert.isAtMost(getDifference(expected, res.toString()), 1000000000); // allow absolute error tolerance of 1e-9 } catch (error) { - console.log(`run: ${i}. base: ${base}, exp: ${exponent}, expected: ${expected}, res: ${res}, error: ${error}`) + console.log( + `run: ${i}. base: ${base}, exp: ${exponent}, expected: ${expected}, res: ${res}, error: ${error}`, + ); } } - }) + }); it("decPow(): abs. error < 1e-9 for exponent = 525600 (minutes in one year)", async () => { for (let i = 1; i <= 200; i++) { - const exponent = timeValues.MINUTES_IN_ONE_YEAR + const exponent = timeValues.MINUTES_IN_ONE_YEAR; // Use a high base to fully test high exponent, without prematurely decaying to 0 - const base = th.randDecayFactor(0.99999, 0.999999999999999999) - const baseAsDecimal = BNConverter.makeDecimal(base, 18) + const base = th.randDecayFactor(0.99999, 0.999999999999999999); + const baseAsDecimal = BNConverter.makeDecimal(base, 18); // Calculate actual expected value - let expected = Decimal.pow(baseAsDecimal, exponent).toFixed(18) - expected = BNConverter.makeBN(expected) + let expected = Decimal.pow(baseAsDecimal, exponent).toFixed(18); + expected = BNConverter.makeBN(expected); - const res = await mathTester.callDecPow(base, exponent) + const res = await mathTester.callDecPow(base, exponent); - const error = expected.sub(res).abs() + const error = expected.sub(res).abs(); // console.log(`run: ${i}. base: ${base}, exp: ${exponent}, expected: ${expected}, res: ${res}, error: ${error}`) try { - assert.isAtMost(getDifference(expected, res.toString()), 1000000000) // allow absolute error tolerance of 1e-9 + assert.isAtMost(getDifference(expected, res.toString()), 1000000000); // allow absolute error tolerance of 1e-9 } catch (error) { - console.log(`run: ${i}. base: ${base}, exp: ${exponent}, expected: ${expected}, res: ${res}, error: ${error}`) + console.log( + `run: ${i}. base: ${base}, exp: ${exponent}, expected: ${expected}, res: ${res}, error: ${error}`, + ); } } - }) + }); it("decPow(): abs. error < 1e-9 for exponent = 2628000 (minutes in five years)", async () => { for (let i = 1; i <= 200; i++) { - const exponent = timeValues.MINUTES_IN_ONE_YEAR * 5 + const exponent = timeValues.MINUTES_IN_ONE_YEAR * 5; // Use a high base to fully test high exponent, without prematurely decaying to 0 - const base = th.randDecayFactor(0.99999, 0.999999999999999999) - const baseAsDecimal = BNConverter.makeDecimal(base, 18) + const base = th.randDecayFactor(0.99999, 0.999999999999999999); + const baseAsDecimal = BNConverter.makeDecimal(base, 18); // Calculate actual expected value - let expected = Decimal.pow(baseAsDecimal, exponent).toFixed(18) - expected = BNConverter.makeBN(expected) + let expected = Decimal.pow(baseAsDecimal, exponent).toFixed(18); + expected = BNConverter.makeBN(expected); - const res = await mathTester.callDecPow(base, exponent) + const res = await mathTester.callDecPow(base, exponent); - const error = expected.sub(res).abs() + const error = expected.sub(res).abs(); // console.log(`run: ${i}. base: ${base}, exp: ${exponent}, expected: ${expected}, res: ${res}, error: ${error}`) try { - assert.isAtMost(getDifference(expected, res.toString()), 1000000000) // allow absolute error tolerance of 1e-9 + assert.isAtMost(getDifference(expected, res.toString()), 1000000000); // allow absolute error tolerance of 1e-9 } catch (error) { - console.log(`run: ${i}. base: ${base}, exp: ${exponent}, expected: ${expected}, res: ${res}, error: ${error}`) + console.log( + `run: ${i}. base: ${base}, exp: ${exponent}, expected: ${expected}, res: ${res}, error: ${error}`, + ); } } - }) + }); it("decPow(): abs. error < 1e-9 for exponent = minutes in ten years", async () => { for (let i = 1; i <= 200; i++) { - const exponent = timeValues.MINUTES_IN_ONE_YEAR * 10 + const exponent = timeValues.MINUTES_IN_ONE_YEAR * 10; // Use a high base to fully test high exponent, without prematurely decaying to 0 - const base = th.randDecayFactor(0.99999, 0.999999999999999999) - const baseAsDecimal = BNConverter.makeDecimal(base, 18) + const base = th.randDecayFactor(0.99999, 0.999999999999999999); + const baseAsDecimal = BNConverter.makeDecimal(base, 18); // Calculate actual expected value - let expected = Decimal.pow(baseAsDecimal, exponent).toFixed(18) - expected = BNConverter.makeBN(expected) + let expected = Decimal.pow(baseAsDecimal, exponent).toFixed(18); + expected = BNConverter.makeBN(expected); - const res = await mathTester.callDecPow(base, exponent) + const res = await mathTester.callDecPow(base, exponent); - const error = expected.sub(res).abs() + const error = expected.sub(res).abs(); // console.log(`run: ${i}. base: ${base}, exp: ${exponent}, expected: ${expected}, res: ${res}, error: ${error}`) try { - assert.isAtMost(getDifference(expected, res.toString()), 1000000000) // allow absolute error tolerance of 1e-9 + assert.isAtMost(getDifference(expected, res.toString()), 1000000000); // allow absolute error tolerance of 1e-9 } catch (error) { - console.log(`run: ${i}. base: ${base}, exp: ${exponent}, expected: ${expected}, res: ${res}, error: ${error}`) + console.log( + `run: ${i}. base: ${base}, exp: ${exponent}, expected: ${expected}, res: ${res}, error: ${error}`, + ); } } - }) + }); it("decPow(): abs. error < 1e-9 for exponent = minutes in one hundred years", async () => { for (let i = 1; i <= 200; i++) { - const exponent = timeValues.MINUTES_IN_ONE_YEAR * 100 + const exponent = timeValues.MINUTES_IN_ONE_YEAR * 100; // Use a high base to fully test high exponent, without prematurely decaying to 0 - const base = th.randDecayFactor(0.999999, 0.999999999999999999) - const baseAsDecimal = BNConverter.makeDecimal(base, 18) + const base = th.randDecayFactor(0.999999, 0.999999999999999999); + const baseAsDecimal = BNConverter.makeDecimal(base, 18); // Calculate actual expected value - let expected = Decimal.pow(baseAsDecimal, exponent).toFixed(18) - expected = BNConverter.makeBN(expected) + let expected = Decimal.pow(baseAsDecimal, exponent).toFixed(18); + expected = BNConverter.makeBN(expected); - const res = await mathTester.callDecPow(base, exponent) + const res = await mathTester.callDecPow(base, exponent); - const error = expected.sub(res).abs() + const error = expected.sub(res).abs(); // console.log(`run: ${i}. base: ${base}, exp: ${exponent}, expected: ${expected}, res: ${res}, error: ${error}`) try { - assert.isAtMost(getDifference(expected, res.toString()), 1000000000) // allow absolute error tolerance of 1e-9 + assert.isAtMost(getDifference(expected, res.toString()), 1000000000); // allow absolute error tolerance of 1e-9 } catch (error) { - console.log(`run: ${i}. base: ${base}, exp: ${exponent}, expected: ${expected}, res: ${res}, error: ${error}`) + console.log( + `run: ${i}. base: ${base}, exp: ${exponent}, expected: ${expected}, res: ${res}, error: ${error}`, + ); } } - }) + }); it.skip("decPow(): overflow test: doesn't overflow for exponent = minutes in 1000 years", async () => { - const exponent = (timeValues.MINUTES_IN_ONE_YEAR * 1000) + 9 + const exponent = (timeValues.MINUTES_IN_ONE_YEAR * 1000) + 9; // Test base = 0 - const response_0 = await mathTester.callDecPowTx(0, exponent) - console.log(response_0) - assert.isTrue(response_0.receipt.status) + const response_0 = await mathTester.callDecPowTx(0, exponent); + console.log(response_0); + assert.isTrue(response_0.receipt.status); // test base = 1 - const response_1 = await mathTester.callDecPowTx(1, exponent) - assert.isTrue(response_1.receipt.status) + const response_1 = await mathTester.callDecPowTx(1, exponent); + assert.isTrue(response_1.receipt.status); // test full range for (let i = 1; i <= 1000; i++) { - const base = th.randDecayFactor(0.000000000000000001, 0.999999999999999999) - const baseAsDecimal = BNConverter.makeDecimal(base, 18) + const base = th.randDecayFactor(0.000000000000000001, 0.999999999999999999); + const baseAsDecimal = BNConverter.makeDecimal(base, 18); // Calculate actual expected value - let expected = Decimal.pow(baseAsDecimal, exponent).toFixed(18) - expected = BNConverter.makeBN(expected) + let expected = Decimal.pow(baseAsDecimal, exponent).toFixed(18); + expected = BNConverter.makeBN(expected); + + const response = await mathTester.callDecPowTx(base, exponent); // non-view call, to check reversion + assert.isTrue(response.receipt.status); - const response = await mathTester.callDecPowTx(base, exponent) // non-view call, to check reversion - assert.isTrue(response.receipt.status) + const result = await mathTester.callDecPow(base, exponent); - const result = await mathTester.callDecPow(base, exponent) - - const error = expected.sub(result).abs() + const error = expected.sub(result).abs(); - console.log(`run: ${i}. base: ${base}, exp: ${exponent}, res: ${result}, error: ${error}`) + console.log(`run: ${i}. base: ${base}, exp: ${exponent}, res: ${result}, error: ${error}`); } // Use a high base to fully test high exponent, without prematurely decaying to 0 for (let i = 1; i <= 1000; i++) { - const base = th.randDecayFactor(0.9999999999999, 0.999999999999999999) - const baseAsDecimal = BNConverter.makeDecimal(base, 18) + const base = th.randDecayFactor(0.9999999999999, 0.999999999999999999); + const baseAsDecimal = BNConverter.makeDecimal(base, 18); // Calculate actual expected value - let expected = Decimal.pow(baseAsDecimal, exponent).toFixed(18) - expected = BNConverter.makeBN(expected) + let expected = Decimal.pow(baseAsDecimal, exponent).toFixed(18); + expected = BNConverter.makeBN(expected); - const response = await mathTester.callDecPowTx(base, exponent) // non-view call, to check reversion - assert.isTrue(response.receipt.status) + const response = await mathTester.callDecPowTx(base, exponent); // non-view call, to check reversion + assert.isTrue(response.receipt.status); - const result = await mathTester.callDecPow(base, exponent) - - const error = expected.sub(result).abs() + const result = await mathTester.callDecPow(base, exponent); - console.log(`run: ${i}. base: ${base}, exp: ${exponent}, res: ${result}, error: ${error}`) + const error = expected.sub(result).abs(); + + console.log(`run: ${i}. base: ${base}, exp: ${exponent}, res: ${result}, error: ${error}`); } - }) - }) -}) + }); + }); +}); diff --git a/contracts/test/GasCompensationTest.js b/contracts/test/GasCompensationTest.js index 5c65f77f..d956912a 100644 --- a/contracts/test/GasCompensationTest.js +++ b/contracts/test/GasCompensationTest.js @@ -2,7 +2,7 @@ const { TestHelper: th, MoneyValues: mv } = require("../utils/testHelpers.js"); const { createDeployAndFundFixture } = require("../utils/testFixtures.js"); const TroveManagerTester = artifacts.require("./TroveManagerTester.sol"); const BorrowerOperationsTester = artifacts.require( - "./BorrowerOperationsTester.sol" + "./BorrowerOperationsTester.sol", ); const ERC20 = artifacts.require("./ERC20MinterMock.sol"); @@ -45,8 +45,7 @@ contract("Gas compensation tests", async (accounts) => { let troveManagerTester; let borrowerOperationsTester; - const getOpenTroveBoldAmount = async (totalDebt) => - th.getOpenTroveBoldAmount(contracts, totalDebt); + const getOpenTroveBoldAmount = async (totalDebt) => th.getOpenTroveBoldAmount(contracts, totalDebt); const openTrove = async (params) => th.openTrove(contracts, params); const logICRs = (ICRList) => { @@ -82,7 +81,7 @@ contract("Gas compensation tests", async (accounts) => { // --- Raw gas compensation calculations --- it("_getCollGasCompensation(): returns the 0.5% of collaterall if it is < $10 in value", async () => { - /* + /* ETH:USD price = 1 coll = 1 ETH: $1 in value -> Expect 0.5% of collaterall as gas compensation */ @@ -93,7 +92,7 @@ contract("Gas compensation tests", async (accounts) => { ).toString(); assert.equal(gasCompensation_1, dec(5, 15)); - /* + /* ETH:USD price = 28.4 coll = 0.1 ETH: $2.84 in value -> Expect 0.5% of collaterall as gas compensation */ @@ -104,9 +103,9 @@ contract("Gas compensation tests", async (accounts) => { ).toString(); assert.equal(gasCompensation_2, dec(5, 14)); - /* + /* ETH:USD price = 1000000000 (1 billion) - coll = 0.000000005 ETH (5e9 wei): $5 in value + coll = 0.000000005 ETH (5e9 wei): $5 in value -> Expect 0.5% of collaterall as gas compensation */ await priceFeed.setPrice(dec(1, 27)); // const price_3 = await priceFeed.getPrice() @@ -120,9 +119,9 @@ contract("Gas compensation tests", async (accounts) => { const price = await priceFeed.getPrice(); assert.equal(price, dec(200, 18)); - /* + /* ETH:USD price = 200 - coll = 9.999 ETH + coll = 9.999 ETH 0.5% of coll = 0.04995 ETH. USD value: $9.99 -> Expect 0.5% of collaterall as gas compensation */ const gasCompensation_1 = ( @@ -131,7 +130,7 @@ contract("Gas compensation tests", async (accounts) => { assert.equal(gasCompensation_1, "49995000000000000"); /* ETH:USD price = 200 - coll = 0.055 ETH + coll = 0.055 ETH 0.5% of coll = 0.000275 ETH. USD value: $0.055 -> Expect 0.5% of collaterall as gas compensation */ const gasCompensation_2 = ( @@ -140,7 +139,7 @@ contract("Gas compensation tests", async (accounts) => { assert.equal(gasCompensation_2, dec(275, 12)); /* ETH:USD price = 200 - coll = 6.09232408808723580 ETH + coll = 6.09232408808723580 ETH 0.5% of coll = 0.004995 ETH. USD value: $6.09 -> Expect 0.5% of collaterall as gas compensation */ const gasCompensation_3 = ( @@ -153,9 +152,9 @@ contract("Gas compensation tests", async (accounts) => { const price = await priceFeed.getPrice(); assert.equal(price, dec(200, 18)); - /* + /* ETH:USD price = 200 - coll = 10 ETH + coll = 10 ETH 0.5% of coll = 0.5 ETH. USD value: $10 -> Expect 0.5% of collaterall as gas compensation */ const gasCompensation = ( @@ -168,9 +167,9 @@ contract("Gas compensation tests", async (accounts) => { const price = await priceFeed.getPrice(); assert.equal(price, dec(200, 18)); - /* + /* ETH:USD price = 200 $/E - coll = 100 ETH + coll = 100 ETH 0.5% of coll = 0.5 ETH. USD value: $100 -> Expect $100 gas compensation, i.e. 0.5 ETH */ const gasCompensation_1 = ( @@ -178,9 +177,9 @@ contract("Gas compensation tests", async (accounts) => { ).toString(); assert.equal(gasCompensation_1, dec(500, "finney")); - /* + /* ETH:USD price = 200 $/E - coll = 10.001 ETH + coll = 10.001 ETH 0.5% of coll = 0.050005 ETH. USD value: $10.001 -> Expect $100 gas compensation, i.e. 0.050005 ETH */ const gasCompensation_2 = ( @@ -188,9 +187,9 @@ contract("Gas compensation tests", async (accounts) => { ).toString(); assert.equal(gasCompensation_2, "50005000000000000"); - /* + /* ETH:USD price = 200 $/E - coll = 37.5 ETH + coll = 37.5 ETH 0.5% of coll = 0.1875 ETH. USD value: $37.5 -> Expect $37.5 gas compensation i.e. 0.1875 ETH */ const gasCompensation_3 = ( @@ -198,21 +197,21 @@ contract("Gas compensation tests", async (accounts) => { ).toString(); assert.equal(gasCompensation_3, "187500000000000000"); - /* + /* ETH:USD price = 45323.54542 $/E - coll = 94758.230582309850 ETH + coll = 94758.230582309850 ETH 0.5% of coll = 473.7911529 ETH. USD value: $21473894.84 -> Expect $21473894.8385808 gas compensation, i.e. 473.7911529115490 ETH */ await priceFeed.setPrice("45323545420000000000000"); const gasCompensation_4 = await troveManagerTester.getCollGasCompensation( - "94758230582309850000000" + "94758230582309850000000", ); assert.isAtMost( th.getDifference(gasCompensation_4, "473791152911549000000"), - 1000000 + 1000000, ); - /* + /* ETH:USD price = 1000000 $/E (1 million) coll = 300000000 ETH (300 million) 0.5% of coll = 1500000 ETH. USD value: $150000000000 @@ -221,7 +220,7 @@ contract("Gas compensation tests", async (accounts) => { const price_2 = await priceFeed.getPrice(); const gasCompensation_5 = ( await troveManagerTester.getCollGasCompensation( - "300000000000000000000000000" + "300000000000000000000000000", ) ).toString(); assert.equal(gasCompensation_5, "1500000000000000000000000"); @@ -234,19 +233,19 @@ contract("Gas compensation tests", async (accounts) => { const price = await priceFeed.getPrice(); assert.equal(price, dec(200, 18)); - /* + /* ETH:USD price = 200 - coll = 9.999 ETH + coll = 9.999 ETH debt = 10 Bold 0.5% of coll = 0.04995 ETH. USD value: $9.99 -> Expect composite debt = 10 + 200 = 2100 Bold*/ const compositeDebt_1 = await troveManagerTester.getCompositeDebt( - dec(10, 18) + dec(10, 18), ); assert.equal(compositeDebt_1, dec(210, 18)); /* ETH:USD price = 200 - coll = 0.055 ETH + coll = 0.055 ETH debt = 0 Bold 0.5% of coll = 0.000275 ETH. USD value: $0.055 -> Expect composite debt = 0 + 200 = 200 Bold*/ @@ -259,7 +258,7 @@ contract("Gas compensation tests", async (accounts) => { // 0.5% of coll = 0.004995 ETH. USD value: $6.09 // -> Expect composite debt = 200 + 200 = 400 Bold */ const compositeDebt_3 = await troveManagerTester.getCompositeDebt( - dec(200, 18) + dec(200, 18), ); assert.equal(compositeDebt_3, "400000000000000000000"); }); @@ -269,14 +268,14 @@ contract("Gas compensation tests", async (accounts) => { const price = await priceFeed.getPrice(); assert.equal(price, dec(200, 18)); - /* + /* ETH:USD price = 200 - coll = 10 ETH + coll = 10 ETH debt = 123.45 Bold 0.5% of coll = 0.5 ETH. USD value: $10 -> Expect composite debt = (123.45 + 200) = 323.45 Bold */ const compositeDebt = await troveManagerTester.getCompositeDebt( - "123450000000000000000" + "123450000000000000000", ); assert.equal(compositeDebt, "323450000000000000000"); }); @@ -288,9 +287,9 @@ contract("Gas compensation tests", async (accounts) => { const price = await priceFeed.getPrice(); assert.equal(price, dec(200, 18)); - /* + /* ETH:USD price = 200 $/E - coll = 100 ETH + coll = 100 ETH debt = 2000 Bold -> Expect composite debt = (2000 + 200) = 2200 Bold */ const compositeDebt_1 = ( @@ -298,9 +297,9 @@ contract("Gas compensation tests", async (accounts) => { ).toString(); assert.equal(compositeDebt_1, "2200000000000000000000"); - /* + /* ETH:USD price = 200 $/E - coll = 10.001 ETH + coll = 10.001 ETH debt = 200 Bold -> Expect composite debt = (200 + 200) = 400 Bold */ const compositeDebt_2 = ( @@ -308,9 +307,9 @@ contract("Gas compensation tests", async (accounts) => { ).toString(); assert.equal(compositeDebt_2, "400000000000000000000"); - /* + /* ETH:USD price = 200 $/E - coll = 37.5 ETH + coll = 37.5 ETH debt = 500 Bold -> Expect composite debt = (500 + 200) = 700 Bold */ const compositeDebt_3 = ( @@ -318,9 +317,9 @@ contract("Gas compensation tests", async (accounts) => { ).toString(); assert.equal(compositeDebt_3, "700000000000000000000"); - /* + /* ETH:USD price = 45323.54542 $/E - coll = 94758.230582309850 ETH + coll = 94758.230582309850 ETH debt = 1 billion Bold -> Expect composite debt = (1000000000 + 200) = 1000000200 Bold */ await priceFeed.setPrice("45323545420000000000000"); @@ -330,10 +329,10 @@ contract("Gas compensation tests", async (accounts) => { ).toString(); assert.isAtMost( th.getDifference(compositeDebt_4, "1000000200000000000000000000"), - 100000000000 + 100000000000, ); - /* + /* ETH:USD price = 1000000 $/E (1 million) coll = 300000000 ETH (300 million) debt = 54321.123456789 Bold @@ -454,7 +453,7 @@ contract("Gas compensation tests", async (accounts) => { }); await stabilityPool.provideToSP( B_totalDebt.add(C_totalDebt), - { from: erin, gasPrice: GAS_PRICE } + { from: erin, gasPrice: GAS_PRICE }, ); const BoldinSP_0 = await stabilityPool.getTotalBoldDeposits(); @@ -463,7 +462,7 @@ contract("Gas compensation tests", async (accounts) => { await priceFeed.setPrice("9990000000000000000"); const price_1 = await priceFeed.getPrice(); - /* + /* ETH:USD price = 9.99 -> Expect 0.5% of collaterall to be sent to liquidator, as gas compensation */ @@ -474,11 +473,11 @@ contract("Gas compensation tests", async (accounts) => { // Liquidate A (use 0 gas price to easily check the amount the compensation amount the liquidator receives) const liquidatorBalance_before_A = web3.utils.toBN( - await contracts.WETH.balanceOf(liquidator) + await contracts.WETH.balanceOf(liquidator), ); await troveManager.liquidate(aliceTroveId, { from: liquidator }); const liquidatorBalance_after_A = web3.utils.toBN( - await contracts.WETH.balanceOf(liquidator) + await contracts.WETH.balanceOf(liquidator), ); // Check liquidator's balance increases by 0.5% of A's coll (1 ETH) @@ -500,7 +499,7 @@ contract("Gas compensation tests", async (accounts) => { await priceFeed.setPrice(dec(3, 18)); const price_2 = await priceFeed.getPrice(); - /* + /* ETH:USD price = 3 -> Expect 0.5% of collaterall to be sent to liquidator, as gas compensation */ @@ -510,11 +509,11 @@ contract("Gas compensation tests", async (accounts) => { assert.isFalse(await th.checkRecoveryMode(contracts)); // Liquidate B (use 0 gas price to easily check the amount the compensation amount the liquidator receives) const liquidatorBalance_before_B = web3.utils.toBN( - await contracts.WETH.balanceOf(liquidator) + await contracts.WETH.balanceOf(liquidator), ); await troveManager.liquidate(bobTroveId, { from: liquidator }); const liquidatorBalance_after_B = web3.utils.toBN( - await contracts.WETH.balanceOf(liquidator) + await contracts.WETH.balanceOf(liquidator), ); // Check liquidator's balance increases by B's 0.5% of coll, 2 ETH @@ -535,14 +534,14 @@ contract("Gas compensation tests", async (accounts) => { aliceColl .sub(_0pt5percent_aliceColl) .add(bobColl) - .sub(_0pt5percent_bobColl) + .sub(_0pt5percent_bobColl), ); // (1 + 2 ETH) * 0.995 // --- Price drops to 3 --- await priceFeed.setPrice("3141592653589793238"); const price_3 = await priceFeed.getPrice(); - /* + /* ETH:USD price = 3.141592653589793238 Carol coll = 3 ETH. Value = (3 * 3.141592653589793238) = $6 -> Expect 0.5% of collaterall to be sent to liquidator, as gas compensation */ @@ -553,11 +552,11 @@ contract("Gas compensation tests", async (accounts) => { assert.isFalse(await th.checkRecoveryMode(contracts)); // Liquidate B (use 0 gas price to easily check the amount the compensation amount the liquidator receives) const liquidatorBalance_before_C = web3.utils.toBN( - await contracts.WETH.balanceOf(liquidator) + await contracts.WETH.balanceOf(liquidator), ); await troveManager.liquidate(carolTroveId, { from: liquidator }); const liquidatorBalance_after_C = web3.utils.toBN( - await contracts.WETH.balanceOf(liquidator) + await contracts.WETH.balanceOf(liquidator), ); // Check liquidator's balance increases by C's 0.5% of coll, 3 ETH @@ -580,7 +579,7 @@ contract("Gas compensation tests", async (accounts) => { .add(bobColl) .sub(_0pt5percent_bobColl) .add(carolColl) - .sub(_0pt5percent_carolColl) + .sub(_0pt5percent_carolColl), ); // (1+2+3 ETH) * 0.995 }); @@ -632,12 +631,12 @@ contract("Gas compensation tests", async (accounts) => { await priceFeed.setPrice("199999000000000000000"); const price_1 = await priceFeed.getPrice(); - /* + /* ETH:USD price = 199.999 Alice coll = 1 ETH. Value: $199.999 0.5% of coll = 0.05 ETH. Value: (0.05 * 199.999) = $9.99995 Minimum comp = $10 = 0.05000025000125001 ETH. - -> Expect 0.05000025000125001 ETH sent to liquidator, + -> Expect 0.05000025000125001 ETH sent to liquidator, and (1 - 0.05000025000125001) = 0.94999974999875 ETH remainder liquidated */ // Check collateral value in USD is > $10 @@ -650,11 +649,11 @@ contract("Gas compensation tests", async (accounts) => { // Liquidate A (use 0 gas price to easily check the amount the compensation amount the liquidator receives) const liquidatorBalance_before_A = web3.utils.toBN( - await contracts.WETH.balanceOf(liquidator) + await contracts.WETH.balanceOf(liquidator), ); await troveManager.liquidate(aliceTroveId, { from: liquidator }); const liquidatorBalance_after_A = web3.utils.toBN( - await contracts.WETH.balanceOf(liquidator) + await contracts.WETH.balanceOf(liquidator), ); // Check liquidator's balance increases by 0.5% of coll @@ -680,12 +679,12 @@ contract("Gas compensation tests", async (accounts) => { await priceFeed.setPrice(dec(15, 18)); const price_2 = await priceFeed.getPrice(); - /* + /* ETH:USD price = 15 Bob coll = 15 ETH. Value: $165 0.5% of coll = 0.75 ETH. Value: (0.75 * 11) = $8.25 Minimum comp = $10 = 0.66666...ETH. - -> Expect 0.666666666666666666 ETH sent to liquidator, + -> Expect 0.666666666666666666 ETH sent to liquidator, and (15 - 0.666666666666666666) ETH remainder liquidated */ // Check collateral value in USD is > $10 @@ -698,11 +697,11 @@ contract("Gas compensation tests", async (accounts) => { // Liquidate B (use 0 gas price to easily check the amount the compensation amount the liquidator receives) const liquidatorBalance_before_B = web3.utils.toBN( - await contracts.WETH.balanceOf(liquidator) + await contracts.WETH.balanceOf(liquidator), ); await troveManager.liquidate(bobTroveId, { from: liquidator }); const liquidatorBalance_after_B = web3.utils.toBN( - await contracts.WETH.balanceOf(liquidator) + await contracts.WETH.balanceOf(liquidator), ); // Check liquidator's balance increases by $10 worth of coll @@ -773,12 +772,12 @@ contract("Gas compensation tests", async (accounts) => { await priceFeed.setPrice(dec(200, 18)); const price_1 = await priceFeed.getPrice(); - /* + /* ETH:USD price = 200 Alice coll = 10.001 ETH. Value: $2000.2 0.5% of coll = 0.050005 ETH. Value: (0.050005 * 200) = $10.01 Minimum comp = $10 = 0.05 ETH. - -> Expect 0.050005 ETH sent to liquidator, + -> Expect 0.050005 ETH sent to liquidator, and (10.001 - 0.050005) ETH remainder liquidated */ // Check value of 0.5% of collateral in USD is > $10 @@ -792,11 +791,11 @@ contract("Gas compensation tests", async (accounts) => { // Liquidate A (use 0 gas price to easily check the amount the compensation amount the liquidator receives) const liquidatorBalance_before_A = web3.utils.toBN( - await contracts.WETH.balanceOf(liquidator) + await contracts.WETH.balanceOf(liquidator), ); await troveManager.liquidate(aliceTroveId, { from: liquidator }); const liquidatorBalance_after_A = web3.utils.toBN( - await contracts.WETH.balanceOf(liquidator) + await contracts.WETH.balanceOf(liquidator), ); // Check liquidator's balance increases by 0.5% of coll @@ -817,12 +816,12 @@ contract("Gas compensation tests", async (accounts) => { assert.isAtMost(th.getDifference(SPETHIncrease_A, collRemainder_A), 1000); - /* + /* ETH:USD price = 200 Bob coll = 37.5 ETH. Value: $7500 0.5% of coll = 0.1875 ETH. Value: (0.1875 * 200) = $37.5 Minimum comp = $10 = 0.05 ETH. - -> Expect 0.1875 ETH sent to liquidator, + -> Expect 0.1875 ETH sent to liquidator, and (37.5 - 0.1875 ETH) ETH remainder liquidated */ // Check value of 0.5% of collateral in USD is > $10 @@ -836,11 +835,11 @@ contract("Gas compensation tests", async (accounts) => { // Liquidate B (use 0 gas price to easily check the amount the compensation amount the liquidator receives) const liquidatorBalance_before_B = web3.utils.toBN( - await contracts.WETH.balanceOf(liquidator) + await contracts.WETH.balanceOf(liquidator), ); await troveManager.liquidate(bobTroveId, { from: liquidator }); const liquidatorBalance_after_B = web3.utils.toBN( - await contracts.WETH.balanceOf(liquidator) + await contracts.WETH.balanceOf(liquidator), ); // Check liquidator's balance increases by 0.5% of coll @@ -907,7 +906,7 @@ contract("Gas compensation tests", async (accounts) => { await priceFeed.setPrice("9990000000000000000"); const price_1 = await priceFeed.getPrice(); - /* + /* ETH:USD price = 9.99 -> Expect 0.5% of collaterall to be sent to liquidator, as gas compensation */ @@ -928,16 +927,15 @@ contract("Gas compensation tests", async (accounts) => { const expectedLiquidatedColl_A = aliceColl.sub(expectedGasComp_A); const expectedLiquidatedDebt_A = aliceDebt; - const [loggedDebt_A, loggedColl_A, loggedGasComp_A] = - th.getEmittedLiquidationValues(liquidationTxA); + const [loggedDebt_A, loggedColl_A, loggedGasComp_A] = th.getEmittedLiquidationValues(liquidationTxA); assert.isAtMost( th.getDifference(expectedLiquidatedDebt_A, loggedDebt_A), - 1000 + 1000, ); assert.isAtMost( th.getDifference(expectedLiquidatedColl_A, loggedColl_A), - 1000 + 1000, ); assert.isAtMost(th.getDifference(expectedGasComp_A, loggedGasComp_A), 1000); @@ -945,7 +943,7 @@ contract("Gas compensation tests", async (accounts) => { await priceFeed.setPrice(dec(3, 18)); const price_2 = await priceFeed.getPrice(); - /* + /* ETH:USD price = 3 -> Expect 0.5% of collaterall to be sent to liquidator, as gas compensation */ @@ -964,16 +962,15 @@ contract("Gas compensation tests", async (accounts) => { const expectedLiquidatedColl_B = bobColl.sub(expectedGasComp_B); const expectedLiquidatedDebt_B = bobDebt; - const [loggedDebt_B, loggedColl_B, loggedGasComp_B] = - th.getEmittedLiquidationValues(liquidationTxB); + const [loggedDebt_B, loggedColl_B, loggedGasComp_B] = th.getEmittedLiquidationValues(liquidationTxB); assert.isAtMost( th.getDifference(expectedLiquidatedDebt_B, loggedDebt_B), - 1000 + 1000, ); assert.isAtMost( th.getDifference(expectedLiquidatedColl_B, loggedColl_B), - 1000 + 1000, ); assert.isAtMost(th.getDifference(expectedGasComp_B, loggedGasComp_B), 1000); }); @@ -1020,12 +1017,12 @@ contract("Gas compensation tests", async (accounts) => { await priceFeed.setPrice("199999000000000000000"); const price_1 = await priceFeed.getPrice(); - /* + /* ETH:USD price = 199.999 Alice coll = 1 ETH. Value: $199.999 0.5% of coll = 0.05 ETH. Value: (0.05 * 199.999) = $9.99995 Minimum comp = $10 = 0.05000025000125001 ETH. - -> Expect 0.05000025000125001 ETH sent to liquidator, + -> Expect 0.05000025000125001 ETH sent to liquidator, and (1 - 0.05000025000125001) = 0.94999974999875 ETH remainder liquidated */ // Check collateral value in USD is > $10 @@ -1033,7 +1030,7 @@ contract("Gas compensation tests", async (accounts) => { const aliceDebt = (await troveManager.Troves(aliceTroveId))[0]; const aliceCollValueInUSD = await borrowerOperationsTester.getUSDValue( aliceColl, - price_1 + price_1, ); assert.isTrue(aliceCollValueInUSD.gt(th.toBN(dec(10, 18)))); @@ -1055,16 +1052,15 @@ contract("Gas compensation tests", async (accounts) => { const expectedLiquidatedColl_A = aliceColl.sub(expectedGasComp_A); const expectedLiquidatedDebt_A = aliceDebt; - const [loggedDebt_A, loggedColl_A, loggedGasComp_A] = - th.getEmittedLiquidationValues(liquidationTxA); + const [loggedDebt_A, loggedColl_A, loggedGasComp_A] = th.getEmittedLiquidationValues(liquidationTxA); assert.isAtMost( th.getDifference(expectedLiquidatedDebt_A, loggedDebt_A), - 1000 + 1000, ); assert.isAtMost( th.getDifference(expectedLiquidatedColl_A, loggedColl_A), - 1000 + 1000, ); assert.isAtMost(th.getDifference(expectedGasComp_A, loggedGasComp_A), 1000); @@ -1072,12 +1068,12 @@ contract("Gas compensation tests", async (accounts) => { await priceFeed.setPrice(dec(15, 18)); const price_2 = await priceFeed.getPrice(); - /* + /* ETH:USD price = 15 Bob coll = 15 ETH. Value: $165 0.5% of coll = 0.75 ETH. Value: (0.75 * 11) = $8.25 Minimum comp = $10 = 0.66666...ETH. - -> Expect 0.666666666666666666 ETH sent to liquidator, + -> Expect 0.666666666666666666 ETH sent to liquidator, and (15 - 0.666666666666666666) ETH remainder liquidated */ // Check collateral value in USD is > $10 @@ -1100,16 +1096,15 @@ contract("Gas compensation tests", async (accounts) => { const expectedLiquidatedColl_B = bobColl.sub(expectedGasComp_B); const expectedLiquidatedDebt_B = bobDebt; - const [loggedDebt_B, loggedColl_B, loggedGasComp_B] = - th.getEmittedLiquidationValues(liquidationTxB); + const [loggedDebt_B, loggedColl_B, loggedGasComp_B] = th.getEmittedLiquidationValues(liquidationTxB); assert.isAtMost( th.getDifference(expectedLiquidatedDebt_B, loggedDebt_B), - 1000 + 1000, ); assert.isAtMost( th.getDifference(expectedLiquidatedColl_B, loggedColl_B), - 1000 + 1000, ); assert.isAtMost(th.getDifference(expectedGasComp_B, loggedGasComp_B), 1000); }); @@ -1176,25 +1171,24 @@ contract("Gas compensation tests", async (accounts) => { const expectedLiquidatedColl_A = aliceColl.sub(_0pt5percent_aliceColl); const expectedLiquidatedDebt_A = aliceDebt; - const [loggedDebt_A, loggedColl_A, loggedGasComp_A] = - th.getEmittedLiquidationValues(liquidationTxA); + const [loggedDebt_A, loggedColl_A, loggedGasComp_A] = th.getEmittedLiquidationValues(liquidationTxA); assert.isAtMost( th.getDifference(expectedLiquidatedDebt_A, loggedDebt_A), - 1000 + 1000, ); assert.isAtMost( th.getDifference(expectedLiquidatedColl_A, loggedColl_A), - 1000 + 1000, ); assert.isAtMost(th.getDifference(expectedGasComp_A, loggedGasComp_A), 1000); - /* + /* ETH:USD price = 200 Bob coll = 37.5 ETH. Value: $7500 0.5% of coll = 0.1875 ETH. Value: (0.1875 * 200) = $37.5 Minimum comp = $10 = 0.05 ETH. - -> Expect 0.1875 ETH sent to liquidator, + -> Expect 0.1875 ETH sent to liquidator, and (37.5 - 0.1875 ETH) ETH remainder liquidated */ // Check value of 0.5% of collateral in USD is > $10 @@ -1217,16 +1211,15 @@ contract("Gas compensation tests", async (accounts) => { const expectedLiquidatedColl_B = bobColl.sub(_0pt5percent_bobColl); const expectedLiquidatedDebt_B = bobDebt; - const [loggedDebt_B, loggedColl_B, loggedGasComp_B] = - th.getEmittedLiquidationValues(liquidationTxB); + const [loggedDebt_B, loggedColl_B, loggedGasComp_B] = th.getEmittedLiquidationValues(liquidationTxB); assert.isAtMost( th.getDifference(expectedLiquidatedDebt_B, loggedDebt_B), - 1000 + 1000, ); assert.isAtMost( th.getDifference(expectedLiquidatedColl_B, loggedColl_B), - 1000 + 1000, ); assert.isAtMost(th.getDifference(expectedGasComp_B, loggedGasComp_B), 1000); }); @@ -1343,8 +1336,21 @@ contract("Gas compensation tests", async (accounts) => { it("Trove ordering: Constant raw collateral ratio (excluding virtual debt). Price successively increases. Troves should maintain ordering by ICR", async () => { let collVals = [ - 1, 5, 10, 25, 50, 100, 500, 1000, 5000, 10000, 50000, 100000, 500000, - 1000000, 5000000, + 1, + 5, + 10, + 25, + 50, + 100, + 500, + 1000, + 5000, + 10000, + 50000, + 100000, + 500000, + 1000000, + 5000000, ].map((v) => v * 20); const accountsList = accounts.slice(1, collVals.length + 1); diff --git a/contracts/test/HintHelpers_getApproxHintTest.js b/contracts/test/HintHelpers_getApproxHintTest.js index 81acfdee..3e14f028 100644 --- a/contracts/test/HintHelpers_getApproxHintTest.js +++ b/contracts/test/HintHelpers_getApproxHintTest.js @@ -24,11 +24,10 @@ contract.skip("HintHelpers", async (accounts) => { let numAccounts = 10; - const getNetBorrowingAmount = async (debtWithFee) => - th.getNetBorrowingAmount(contracts, debtWithFee); + const getNetBorrowingAmount = async (debtWithFee) => th.getNetBorrowingAmount(contracts, debtWithFee); /* Open a Trove for each account. BOLD debt is 200 BOLD each, with collateral beginning at - 1.5 ether, and rising by 0.01 ether per Trove. Hence, the ICR of account (i + 1) is always 1% greater than the ICR of account i. + 1.5 ether, and rising by 0.01 ether per Trove. Hence, the ICR of account (i + 1) is always 1% greater than the ICR of account i. */ // Open Troves in parallel, then withdraw BOLD in parallel @@ -37,13 +36,9 @@ contract.skip("HintHelpers", async (accounts) => { // console.log(`number of accounts used is: ${activeAccounts.length}`) await fundAccounts(activeAccounts, contracts.WETH); // console.time("makeTrovesInParallel") - const openTrovepromises = activeAccounts.map((account, index) => - openTrove(account, index) - ); + const openTrovepromises = activeAccounts.map((account, index) => openTrove(account, index)); await Promise.all(openTrovepromises); - const withdrawBoldpromises = activeAccounts.map((account) => - withdrawBoldfromTrove(account) - ); + const withdrawBoldpromises = activeAccounts.map((account) => withdrawBoldfromTrove(account)); await Promise.all(withdrawBoldpromises); // console.timeEnd("makeTrovesInParallel") }; @@ -63,7 +58,7 @@ contract.skip("HintHelpers", async (accounts) => { "100000000000000000000", account, account, - { from: account } + { from: account }, ); }; @@ -96,7 +91,7 @@ contract.skip("HintHelpers", async (accounts) => { await priceFeed.setPrice(INITIAL_PRICE); await makeTrovesInSequence(accounts, numAccounts); // await makeTrovesInParallel(accounts, numAccounts) - } + }, }); beforeEach(async () => { @@ -137,8 +132,8 @@ contract.skip("HintHelpers", async (accounts) => { it("getApproxHint(): returns the address of a Trove within sqrt(length) positions of the correct insert position", async () => { const sqrtLength = Math.ceil(Math.sqrt(numAccounts)); - /* As per the setup, the ICRs of Troves are monotonic and seperated by 1% intervals. Therefore, the difference in ICR between - the given CR and the ICR of the hint address equals the number of positions between the hint address and the correct insert position + /* As per the setup, the ICRs of Troves are monotonic and seperated by 1% intervals. Therefore, the difference in ICR between + the given CR and the ICR of the hint address equals the number of positions between the hint address and the correct insert position for a Trove with the given CR. */ // CR = 250% @@ -147,15 +142,14 @@ contract.skip("HintHelpers", async (accounts) => { let hintId; - // const hintId_250 = await functionCaller.troveManager_getApproxHint(CR_250, sqrtLength * 10) + // const hintId_250 = await functionCaller.troveManager_getApproxHint(CR_250, sqrtLength * 10) ({ hintId, latestRandomSeed } = await hintHelpers.getApproxHint( CR_250, sqrtLength * 10, - latestRandomSeed + latestRandomSeed, )); const ICR_hintId_250 = await troveManager.getCurrentICR(hintId, INITIAL_PRICE); - const ICRPercent_hintId_250 = - Number(web3.utils.fromWei(ICR_hintId_250, "ether")) * 100; + const ICRPercent_hintId_250 = Number(web3.utils.fromWei(ICR_hintId_250, "ether")) * 100; // check the hint position is at most sqrtLength positions away from the correct position ICR_Difference_250 = ICRPercent_hintId_250 - CRPercent_250; @@ -169,11 +163,10 @@ contract.skip("HintHelpers", async (accounts) => { ({ hintId, latestRandomSeed } = await hintHelpers.getApproxHint( CR_287, sqrtLength * 10, - latestRandomSeed + latestRandomSeed, )); const ICR_hintId_287 = await troveManager.getCurrentICR(hintId, INITIAL_PRICE); - const ICRPercent_hintId_287 = - Number(web3.utils.fromWei(ICR_hintId_287, "ether")) * 100; + const ICRPercent_hintId_287 = Number(web3.utils.fromWei(ICR_hintId_287, "ether")) * 100; // check the hint position is at most sqrtLength positions away from the correct position ICR_Difference_287 = ICRPercent_hintId_287 - CRPercent_287; @@ -187,11 +180,10 @@ contract.skip("HintHelpers", async (accounts) => { ({ hintId, latestRandomSeed } = await hintHelpers.getApproxHint( CR_213, sqrtLength * 10, - latestRandomSeed + latestRandomSeed, )); const ICR_hintId_213 = await troveManager.getCurrentICR(hintId, INITIAL_PRICE); - const ICRPercent_hintId_213 = - Number(web3.utils.fromWei(ICR_hintId_213, "ether")) * 100; + const ICRPercent_hintId_213 = Number(web3.utils.fromWei(ICR_hintId_213, "ether")) * 100; // check the hint position is at most sqrtLength positions away from the correct position ICR_Difference_213 = ICRPercent_hintId_213 - CRPercent_213; @@ -205,18 +197,17 @@ contract.skip("HintHelpers", async (accounts) => { ({ hintId, latestRandomSeed } = await hintHelpers.getApproxHint( CR_201, sqrtLength * 10, - latestRandomSeed + latestRandomSeed, )); const ICR_hintId_201 = await troveManager.getCurrentICR(hintId, INITIAL_PRICE); - const ICRPercent_hintId_201 = - Number(web3.utils.fromWei(ICR_hintId_201, "ether")) * 100; + const ICRPercent_hintId_201 = Number(web3.utils.fromWei(ICR_hintId_201, "ether")) * 100; // check the hint position is at most sqrtLength positions away from the correct position ICR_Difference_201 = ICRPercent_hintId_201 - CRPercent_201; assert.isBelow(ICR_Difference_201, sqrtLength); }); - /* Pass 100 random collateral ratios to getApproxHint(). For each, check whether the returned hint id is within + /* Pass 100 random collateral ratios to getApproxHint(). For each, check whether the returned hint id is within sqrt(length) positions of where a Trove with that CR should be inserted. */ // it("getApproxHint(): for 100 random CRs, returns the address of a Trove within sqrt(length) positions of the correct insert position", async () => { // const sqrtLength = Math.ceil(Math.sqrt(numAccounts)) @@ -244,26 +235,23 @@ contract.skip("HintHelpers", async (accounts) => { const sqrtLength = Math.ceil(Math.sqrt(numAccounts)); // CR = Maximum value, i.e. 2**256 -1 - const CR_Max = - "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"; + const CR_Max = "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"; let hintId; - // const hintId_Max = await functionCaller.troveManager_getApproxHint(CR_Max, sqrtLength * 10) + // const hintId_Max = await functionCaller.troveManager_getApproxHint(CR_Max, sqrtLength * 10) ({ hintId, latestRandomSeed } = await hintHelpers.getApproxHint( CR_Max, sqrtLength * 10, - latestRandomSeed + latestRandomSeed, )); const ICR_hintId_Max = await troveManager.getCurrentICR(hintId, INITIAL_PRICE); - const ICRPercent_hintId_Max = - Number(web3.utils.fromWei(ICR_hintId_Max, "ether")) * 100; + const ICRPercent_hintId_Max = Number(web3.utils.fromWei(ICR_hintId_Max, "ether")) * 100; const firstTrove = await sortedTroves.getFirst(); const ICR_FirstTrove = await troveManager.getCurrentICR(firstTrove, INITIAL_PRICE); - const ICRPercent_FirstTrove = - Number(web3.utils.fromWei(ICR_FirstTrove, "ether")) * 100; + const ICRPercent_FirstTrove = Number(web3.utils.fromWei(ICR_FirstTrove, "ether")) * 100; // check the hint position is at most sqrtLength positions away from the correct position ICR_Difference_Max = ICRPercent_hintId_Max - ICRPercent_FirstTrove; @@ -278,24 +266,21 @@ contract.skip("HintHelpers", async (accounts) => { let hintId; - // const hintId_Min = await functionCaller.troveManager_getApproxHint(CR_Min, sqrtLength * 10) + // const hintId_Min = await functionCaller.troveManager_getApproxHint(CR_Min, sqrtLength * 10) ({ hintId, latestRandomSeed } = await hintHelpers.getApproxHint( CR_Min, sqrtLength * 10, - latestRandomSeed + latestRandomSeed, )); const ICR_hintId_Min = await troveManager.getCurrentICR(hintId, INITIAL_PRICE); - const ICRPercent_hintId_Min = - Number(web3.utils.fromWei(ICR_hintId_Min, "ether")) * 100; + const ICRPercent_hintId_Min = Number(web3.utils.fromWei(ICR_hintId_Min, "ether")) * 100; const lastTrove = await sortedTroves.getLast(); const ICR_LastTrove = await troveManager.getCurrentICR(lastTrove, INITIAL_PRICE); - const ICRPercent_LastTrove = - Number(web3.utils.fromWei(ICR_LastTrove, "ether")) * 100; + const ICRPercent_LastTrove = Number(web3.utils.fromWei(ICR_LastTrove, "ether")) * 100; // check the hint position is at most sqrtLength positions away from the correct position - const ICR_Difference_Min = - ICRPercent_hintId_Min - ICRPercent_LastTrove; + const ICR_Difference_Min = ICRPercent_hintId_Min - ICRPercent_LastTrove; assert.isBelow(ICR_Difference_Min, sqrtLength); }); }); diff --git a/contracts/test/LiquityMathTest.js b/contracts/test/LiquityMathTest.js index c8032e1b..d2caaf21 100644 --- a/contracts/test/LiquityMathTest.js +++ b/contracts/test/LiquityMathTest.js @@ -1,24 +1,24 @@ -const LiquityMathTester = artifacts.require("./LiquityMathTester.sol") +const LiquityMathTester = artifacts.require("./LiquityMathTester.sol"); -contract('LiquityMath', async accounts => { - let liquityMathTester - beforeEach('deploy tester', async () => { - liquityMathTester = await LiquityMathTester.new() - }) +contract("LiquityMath", async (accounts) => { + let liquityMathTester; + beforeEach("deploy tester", async () => { + liquityMathTester = await LiquityMathTester.new(); + }); const checkFunction = async (func, cond, params) => { - assert.equal(await liquityMathTester[func](...params), cond(...params)) - } + assert.equal(await liquityMathTester[func](...params), cond(...params)); + }; - it('max works if a > b', async () => { - await checkFunction('callMax', (a, b) => Math.max(a, b), [2, 1]) - }) + it("max works if a > b", async () => { + await checkFunction("callMax", (a, b) => Math.max(a, b), [2, 1]); + }); - it('max works if a = b', async () => { - await checkFunction('callMax', (a, b) => Math.max(a, b), [2, 2]) - }) + it("max works if a = b", async () => { + await checkFunction("callMax", (a, b) => Math.max(a, b), [2, 2]); + }); - it('max works if a < b', async () => { - await checkFunction('callMax', (a, b) => Math.max(a, b), [1, 2]) - }) -}) + it("max works if a < b", async () => { + await checkFunction("callMax", (a, b) => Math.max(a, b), [1, 2]); + }); +}); diff --git a/contracts/test/OwnershipTest.js b/contracts/test/OwnershipTest.js index 139ca317..2639da5c 100644 --- a/contracts/test/OwnershipTest.js +++ b/contracts/test/OwnershipTest.js @@ -1,23 +1,22 @@ -const deploymentHelper = require("../utils/deploymentHelpers.js") -const { TestHelper: th, MoneyValues: mv } = require("../utils/testHelpers.js") +const deploymentHelper = require("../utils/deploymentHelpers.js"); +const { TestHelper: th, MoneyValues: mv } = require("../utils/testHelpers.js"); -const GasPool = artifacts.require("./GasPool.sol") -const BorrowerOperationsTester = artifacts.require("./BorrowerOperationsTester.sol") - -contract('All Liquity functions with onlyOwner modifier', async accounts => { +const GasPool = artifacts.require("./GasPool.sol"); +const BorrowerOperationsTester = artifacts.require("./BorrowerOperationsTester.sol"); +contract("All Liquity functions with onlyOwner modifier", async (accounts) => { const [owner, alice, bob] = accounts; - const [bountyAddress, lpRewardsAddress, multisig] = accounts.slice(997, 1000) - - let contracts - let boldToken - let sortedTroves - let troveManager - let activePool - let stabilityPool - let defaultPool - let borrowerOperations + const [bountyAddress, lpRewardsAddress, multisig] = accounts.slice(997, 1000); + + let contracts; + let boldToken; + let sortedTroves; + let troveManager; + let activePool; + let stabilityPool; + let defaultPool; + let borrowerOperations; before(async () => { contracts = await deploymentHelper.deployLiquityCore(); @@ -33,89 +32,88 @@ contract('All Liquity functions with onlyOwner modifier', async accounts => { borrowerOperations = contracts.borrowerOperations; }); - const testZeroAddress = async (contract, params, method = 'setAddresses', skip = 0) => { - await testWrongAddress(contract, params, th.ZERO_ADDRESS, method, skip, 'Account cannot be zero address') - } - const testNonContractAddress = async (contract, params, method = 'setAddresses', skip = 0) => { - await testWrongAddress(contract, params, bob, method, skip, 'Account code size cannot be zero') - } + const testZeroAddress = async (contract, params, method = "setAddresses", skip = 0) => { + await testWrongAddress(contract, params, th.ZERO_ADDRESS, method, skip, "Account cannot be zero address"); + }; + const testNonContractAddress = async (contract, params, method = "setAddresses", skip = 0) => { + await testWrongAddress(contract, params, bob, method, skip, "Account code size cannot be zero"); + }; const testWrongAddress = async (contract, params, address, method, skip, message) => { for (let i = skip; i < params.length; i++) { - const newParams = [...params] - newParams[i] = address - await th.assertRevert(contract[method](...newParams, { from: owner }), message) + const newParams = [...params]; + newParams[i] = address; + await th.assertRevert(contract[method](...newParams, { from: owner }), message); } - } + }; const testSetAddresses = async (contract, numberOfAddresses) => { - const dumbContract = await GasPool.new() - const params = Array(numberOfAddresses).fill(dumbContract.address) + const dumbContract = await GasPool.new(); + const params = Array(numberOfAddresses).fill(dumbContract.address); // Attempt call from alice - await th.assertRevert(contract.setAddresses(...params, { from: alice })) + await th.assertRevert(contract.setAddresses(...params, { from: alice })); // Attempt to use zero address - await testZeroAddress(contract, params) + await testZeroAddress(contract, params); // Attempt to use non contract - await testNonContractAddress(contract, params) + await testNonContractAddress(contract, params); // Owner can successfully set any address - const txOwner = await contract.setAddresses(...params, { from: owner }) - assert.isTrue(txOwner.receipt.status) + const txOwner = await contract.setAddresses(...params, { from: owner }); + assert.isTrue(txOwner.receipt.status); // fails if called twice - await th.assertRevert(contract.setAddresses(...params, { from: owner })) - } + await th.assertRevert(contract.setAddresses(...params, { from: owner })); + }; - describe('TroveManager', async accounts => { + describe("TroveManager", async (accounts) => { it("setAddresses(): reverts when called by non-owner, with wrong addresses, or twice", async () => { - await testSetAddresses(troveManager, 9) - }) - }) + await testSetAddresses(troveManager, 9); + }); + }); - describe('BorrowerOperations', async accounts => { + describe("BorrowerOperations", async (accounts) => { it("setAddresses(): reverts when called by non-owner, with wrong addresses, or twice", async () => { - await testSetAddresses(borrowerOperations, 9) - }) - }) + await testSetAddresses(borrowerOperations, 9); + }); + }); - describe('DefaultPool', async accounts => { + describe("DefaultPool", async (accounts) => { it("setAddresses(): reverts when called by non-owner, with wrong addresses, or twice", async () => { - await testSetAddresses(defaultPool, 2) - }) - }) + await testSetAddresses(defaultPool, 2); + }); + }); - describe('StabilityPool', async accounts => { + describe("StabilityPool", async (accounts) => { it("setAddresses(): reverts when called by non-owner, with wrong addresses, or twice", async () => { - await testSetAddresses(stabilityPool, 6) - }) - }) + await testSetAddresses(stabilityPool, 6); + }); + }); - describe('ActivePool', async accounts => { + describe("ActivePool", async (accounts) => { it("setAddresses(): reverts when called by non-owner, with wrong addresses, or twice", async () => { - await testSetAddresses(activePool, 6) - }) - }) + await testSetAddresses(activePool, 6); + }); + }); - describe('SortedTroves', async accounts => { + describe("SortedTroves", async (accounts) => { it("setAddresses(): reverts when called by non-owner, with wrong addresses, or twice", async () => { - const dumbContract = await GasPool.new() - const params = [dumbContract.address, dumbContract.address] + const dumbContract = await GasPool.new(); + const params = [dumbContract.address, dumbContract.address]; // Attempt call from alice - await th.assertRevert(sortedTroves.setAddresses(...params, { from: alice })) + await th.assertRevert(sortedTroves.setAddresses(...params, { from: alice })); // Attempt to use zero address - await testZeroAddress(sortedTroves, params, 'setAddresses', 1) + await testZeroAddress(sortedTroves, params, "setAddresses", 1); // Attempt to use non contract - await testNonContractAddress(sortedTroves, params, 'setAddresses', 1) + await testNonContractAddress(sortedTroves, params, "setAddresses", 1); // Owner can successfully set params - const txOwner = await sortedTroves.setAddresses(...params, { from: owner }) - assert.isTrue(txOwner.receipt.status) + const txOwner = await sortedTroves.setAddresses(...params, { from: owner }); + assert.isTrue(txOwner.receipt.status); // fails if called twice - await th.assertRevert(sortedTroves.setAddresses(...params, { from: owner })) - }) - }) -}) - + await th.assertRevert(sortedTroves.setAddresses(...params, { from: owner })); + }); + }); +}); diff --git a/contracts/test/PoolsTest.js b/contracts/test/PoolsTest.js index ccadd917..45f6daef 100644 --- a/contracts/test/PoolsTest.js +++ b/contracts/test/PoolsTest.js @@ -1,18 +1,17 @@ -const StabilityPool = artifacts.require("./StabilityPool.sol") -const ActivePool = artifacts.require("./ActivePool.sol") -const DefaultPool = artifacts.require("./DefaultPool.sol") -const NonPayableSwitch = artifacts.require("./NonPayableSwitch.sol") +const StabilityPool = artifacts.require("./StabilityPool.sol"); +const ActivePool = artifacts.require("./ActivePool.sol"); +const DefaultPool = artifacts.require("./DefaultPool.sol"); +const NonPayableSwitch = artifacts.require("./NonPayableSwitch.sol"); const ERC20 = artifacts.require("./ERC20MinterMock.sol"); const { loadFixture } = require("@nomicfoundation/hardhat-network-helpers"); -const { TestHelper: th } = require("../utils/testHelpers.js") +const { TestHelper: th } = require("../utils/testHelpers.js"); -const { dec } = th +const { dec } = th; -const _minus_1_Ether = web3.utils.toWei('-1', 'ether') - -contract('StabilityPool', async accounts => { +const _minus_1_Ether = web3.utils.toWei("-1", "ether"); +contract("StabilityPool", async (accounts) => { const [owner, alice] = accounts; const deployFixture = async () => { @@ -20,236 +19,254 @@ contract('StabilityPool', async accounts => { TODO: Replace with mock contracts, and later complete transactions from EOA */ const WETH = await ERC20.new("WETH", "WETH"); - const stabilityPool = await StabilityPool.new(WETH.address) - const { address: mockActivePoolAddress } = await NonPayableSwitch.new() - const { address: dumbContractAddress } = await NonPayableSwitch.new() - await stabilityPool.setAddresses(dumbContractAddress, dumbContractAddress, mockActivePoolAddress, dumbContractAddress, dumbContractAddress, dumbContractAddress) - - return stabilityPool - } - - it('getETHBalance(): gets the recorded ETH balance', async () => { - const stabilityPool = await loadFixture(deployFixture) - const recordedETHBalance = await stabilityPool.getETHBalance() - assert.equal(recordedETHBalance, 0) - }) - - it('getTotalBoldDeposits(): gets the recorded BOLD balance', async () => { - const stabilityPool = await loadFixture(deployFixture) - const recordedETHBalance = await stabilityPool.getTotalBoldDeposits() - assert.equal(recordedETHBalance, 0) - }) -}) - -contract('ActivePool', async accounts => { - - let activePool, mockBorrowerOperations, mockTroveManager, WETH + const stabilityPool = await StabilityPool.new(WETH.address); + const { address: mockActivePoolAddress } = await NonPayableSwitch.new(); + const { address: dumbContractAddress } = await NonPayableSwitch.new(); + await stabilityPool.setAddresses( + dumbContractAddress, + dumbContractAddress, + mockActivePoolAddress, + dumbContractAddress, + dumbContractAddress, + dumbContractAddress, + ); + + return stabilityPool; + }; + + it("getETHBalance(): gets the recorded ETH balance", async () => { + const stabilityPool = await loadFixture(deployFixture); + const recordedETHBalance = await stabilityPool.getETHBalance(); + assert.equal(recordedETHBalance, 0); + }); + + it("getTotalBoldDeposits(): gets the recorded BOLD balance", async () => { + const stabilityPool = await loadFixture(deployFixture); + const recordedETHBalance = await stabilityPool.getTotalBoldDeposits(); + assert.equal(recordedETHBalance, 0); + }); +}); + +contract("ActivePool", async (accounts) => { + let activePool, mockBorrowerOperations, mockTroveManager, WETH; const [owner, alice] = accounts; const deployFixture = async () => { const WETH = await ERC20.new("WETH", "WETH"); - const activePool = await ActivePool.new(WETH.address) - const mockBorrowerOperations = await NonPayableSwitch.new() - const mockTroveManager = await NonPayableSwitch.new() - const { address: dumbContractAddress } = await NonPayableSwitch.new() - await activePool.setAddresses(mockBorrowerOperations.address, mockTroveManager.address, dumbContractAddress, dumbContractAddress, dumbContractAddress, dumbContractAddress) - - return { activePool, mockBorrowerOperations, mockTroveManager, WETH } - } + const activePool = await ActivePool.new(WETH.address); + const mockBorrowerOperations = await NonPayableSwitch.new(); + const mockTroveManager = await NonPayableSwitch.new(); + const { address: dumbContractAddress } = await NonPayableSwitch.new(); + await activePool.setAddresses( + mockBorrowerOperations.address, + mockTroveManager.address, + dumbContractAddress, + dumbContractAddress, + dumbContractAddress, + dumbContractAddress, + ); + + return { activePool, mockBorrowerOperations, mockTroveManager, WETH }; + }; beforeEach(async () => { - const result = await loadFixture(deployFixture) - WETH = result.WETH - activePool = result.activePool - mockBorrowerOperations = result.mockBorrowerOperations - mockTroveManager = result.mockTroveManager - }) - - it('getETHBalance(): gets the recorded ETH balance', async () => { - const recordedETHBalance = await activePool.getETHBalance() - assert.equal(recordedETHBalance, 0) - }) - - it('getBoldDebt(): gets the recorded BOLD balance', async () => { - const recordedETHBalance = await activePool.getRecordedDebtSum() - assert.equal(recordedETHBalance, 0) - }) - - it('increaseRecordedDebtSum(): increases the recorded BOLD balance by the correct amount', async () => { - const recordedBold_balanceBefore = await activePool.getRecordedDebtSum() - assert.equal(recordedBold_balanceBefore, 0) + const result = await loadFixture(deployFixture); + WETH = result.WETH; + activePool = result.activePool; + mockBorrowerOperations = result.mockBorrowerOperations; + mockTroveManager = result.mockTroveManager; + }); + + it("getETHBalance(): gets the recorded ETH balance", async () => { + const recordedETHBalance = await activePool.getETHBalance(); + assert.equal(recordedETHBalance, 0); + }); + + it("getBoldDebt(): gets the recorded BOLD balance", async () => { + const recordedETHBalance = await activePool.getRecordedDebtSum(); + assert.equal(recordedETHBalance, 0); + }); + + it("increaseRecordedDebtSum(): increases the recorded BOLD balance by the correct amount", async () => { + const recordedBold_balanceBefore = await activePool.getRecordedDebtSum(); + assert.equal(recordedBold_balanceBefore, 0); // await activePool.increaseBoldDebt(100, { from: mockBorrowerOperationsAddress }) - const increaseBoldDebtData = th.getTransactionData('increaseRecordedDebtSum(uint256)', ['0x64']) - const tx = await mockTroveManager.forward(activePool.address, increaseBoldDebtData) - assert.isTrue(tx.receipt.status) - const recordedBold_balanceAfter = await activePool.getRecordedDebtSum() - assert.equal(recordedBold_balanceAfter, 100) - }) + const increaseBoldDebtData = th.getTransactionData("increaseRecordedDebtSum(uint256)", ["0x64"]); + const tx = await mockTroveManager.forward(activePool.address, increaseBoldDebtData); + assert.isTrue(tx.receipt.status); + const recordedBold_balanceAfter = await activePool.getRecordedDebtSum(); + assert.equal(recordedBold_balanceAfter, 100); + }); // Decrease - it('decreaseRecordedDebtSum(): decreases the recorded BOLD balance by the correct amount', async () => { + it("decreaseRecordedDebtSum(): decreases the recorded BOLD balance by the correct amount", async () => { // start the pool on 100 wei - //await activePool.increaseBoldDebt(100, { from: mockBorrowerOperationsAddress }) - const increaseBoldDebtData = th.getTransactionData('increaseRecordedDebtSum(uint256)', ['0x64']) - const tx1 = await mockTroveManager.forward(activePool.address, increaseBoldDebtData) - assert.isTrue(tx1.receipt.status) - - const recordedBold_balanceBefore = await activePool.getRecordedDebtSum() - assert.equal(recordedBold_balanceBefore, 100) - - //await activePool.decreaseBoldDebt(100, { from: mockBorrowerOperationsAddress }) - const decreaseBoldDebtData = th.getTransactionData('decreaseRecordedDebtSum(uint256)', ['0x64']) - const tx2 = await mockTroveManager.forward(activePool.address, decreaseBoldDebtData) - assert.isTrue(tx2.receipt.status) - const recordedBold_balanceAfter = await activePool.getRecordedDebtSum() - assert.equal(recordedBold_balanceAfter, 0) - }) + // await activePool.increaseBoldDebt(100, { from: mockBorrowerOperationsAddress }) + const increaseBoldDebtData = th.getTransactionData("increaseRecordedDebtSum(uint256)", ["0x64"]); + const tx1 = await mockTroveManager.forward(activePool.address, increaseBoldDebtData); + assert.isTrue(tx1.receipt.status); + + const recordedBold_balanceBefore = await activePool.getRecordedDebtSum(); + assert.equal(recordedBold_balanceBefore, 100); + + // await activePool.decreaseBoldDebt(100, { from: mockBorrowerOperationsAddress }) + const decreaseBoldDebtData = th.getTransactionData("decreaseRecordedDebtSum(uint256)", ["0x64"]); + const tx2 = await mockTroveManager.forward(activePool.address, decreaseBoldDebtData); + assert.isTrue(tx2.receipt.status); + const recordedBold_balanceAfter = await activePool.getRecordedDebtSum(); + assert.equal(recordedBold_balanceAfter, 0); + }); // send raw ether - it('sendETH(): decreases the recorded ETH balance by the correct amount', async () => { + it("sendETH(): decreases the recorded ETH balance by the correct amount", async () => { // setup: give pool 2 ether - const activePool_initialBalance = web3.utils.toBN(await WETH.balanceOf(activePool.address)) - assert.equal(activePool_initialBalance, 0) + const activePool_initialBalance = web3.utils.toBN(await WETH.balanceOf(activePool.address)); + assert.equal(activePool_initialBalance, 0); // start pool with 2 ether - //await web3.eth.sendTransaction({ from: mockBorrowerOperationsAddress, to: activePool.address, value: dec(2, 'ether') }) - const eth_amount = dec(2, 'ether'); + // await web3.eth.sendTransaction({ from: mockBorrowerOperationsAddress, to: activePool.address, value: dec(2, 'ether') }) + const eth_amount = dec(2, "ether"); await WETH.mint(mockBorrowerOperations.address, eth_amount); // approve - const approveData = th.getTransactionData('approve(address,uint256)', [activePool.address, web3.utils.toHex(eth_amount)]); + const approveData = th.getTransactionData("approve(address,uint256)", [ + activePool.address, + web3.utils.toHex(eth_amount), + ]); await mockBorrowerOperations.forward(WETH.address, approveData, { from: owner }); // call receiveETH - const receiveETHData = th.getTransactionData('receiveETH(uint256)', [web3.utils.toHex(eth_amount)]); + const receiveETHData = th.getTransactionData("receiveETH(uint256)", [web3.utils.toHex(eth_amount)]); const tx1 = await mockBorrowerOperations.forward(activePool.address, receiveETHData, { from: owner }); - assert.isTrue(tx1.receipt.status) + assert.isTrue(tx1.receipt.status); - const activePool_BalanceBeforeTx = web3.utils.toBN(await WETH.balanceOf(activePool.address)) - const alice_Balance_BeforeTx = web3.utils.toBN(await WETH.balanceOf(alice)) + const activePool_BalanceBeforeTx = web3.utils.toBN(await WETH.balanceOf(activePool.address)); + const alice_Balance_BeforeTx = web3.utils.toBN(await WETH.balanceOf(alice)); - assert.equal(activePool_BalanceBeforeTx, dec(2, 'ether')) + assert.equal(activePool_BalanceBeforeTx, dec(2, "ether")); // send ether from pool to alice // th.logBN("eth bal", await WETH.balanceOf(activePool.address)) - //await activePool.sendETH(alice, dec(1, 'ether'), { from: mockBorrowerOperationsAddress }) - const sendETHData = th.getTransactionData('sendETH(address,uint256)', [alice, web3.utils.toHex(dec(1, 'ether'))]) - const tx2 = await mockBorrowerOperations.forward(activePool.address, sendETHData, { from: owner }) - assert.isTrue(tx2.receipt.status) + // await activePool.sendETH(alice, dec(1, 'ether'), { from: mockBorrowerOperationsAddress }) + const sendETHData = th.getTransactionData("sendETH(address,uint256)", [alice, web3.utils.toHex(dec(1, "ether"))]); + const tx2 = await mockBorrowerOperations.forward(activePool.address, sendETHData, { from: owner }); + assert.isTrue(tx2.receipt.status); - const activePool_BalanceAfterTx = web3.utils.toBN(await WETH.balanceOf(activePool.address)) - const alice_Balance_AfterTx = web3.utils.toBN(await WETH.balanceOf(alice)) + const activePool_BalanceAfterTx = web3.utils.toBN(await WETH.balanceOf(activePool.address)); + const alice_Balance_AfterTx = web3.utils.toBN(await WETH.balanceOf(alice)); - const alice_BalanceChange = alice_Balance_AfterTx.sub(alice_Balance_BeforeTx) - const pool_BalanceChange = activePool_BalanceAfterTx.sub(activePool_BalanceBeforeTx) - assert.equal(alice_BalanceChange, dec(1, 'ether')) - assert.equal(pool_BalanceChange, _minus_1_Ether) - }) -}) + const alice_BalanceChange = alice_Balance_AfterTx.sub(alice_Balance_BeforeTx); + const pool_BalanceChange = activePool_BalanceAfterTx.sub(activePool_BalanceBeforeTx); + assert.equal(alice_BalanceChange, dec(1, "ether")); + assert.equal(pool_BalanceChange, _minus_1_Ether); + }); +}); -contract('DefaultPool', async accounts => { - - let defaultPool, mockTroveManager, mockActivePool, WETH +contract("DefaultPool", async (accounts) => { + let defaultPool, mockTroveManager, mockActivePool, WETH; const [owner, alice] = accounts; const deployFixture = async () => { const WETH = await ERC20.new("WETH", "WETH"); - const defaultPool = await DefaultPool.new(WETH.address) - const mockTroveManager = await NonPayableSwitch.new() - const mockActivePool = await NonPayableSwitch.new() - await mockActivePool.setETH(WETH.address) - await defaultPool.setAddresses(mockTroveManager.address, mockActivePool.address) + const defaultPool = await DefaultPool.new(WETH.address); + const mockTroveManager = await NonPayableSwitch.new(); + const mockActivePool = await NonPayableSwitch.new(); + await mockActivePool.setETH(WETH.address); + await defaultPool.setAddresses(mockTroveManager.address, mockActivePool.address); - return { defaultPool, mockTroveManager, mockActivePool, WETH } - } + return { defaultPool, mockTroveManager, mockActivePool, WETH }; + }; beforeEach(async () => { - const result = await loadFixture(deployFixture) - WETH = result.WETH - defaultPool = result.defaultPool - mockTroveManager = result.mockTroveManager - mockActivePool = result.mockActivePool - }) - - it('getETHBalance(): gets the recorded BOLD balance', async () => { - const recordedETHBalance = await defaultPool.getETHBalance() - assert.equal(recordedETHBalance, 0) - }) - - it('getBoldDebt(): gets the recorded BOLD balance', async () => { - const recordedETHBalance = await defaultPool.getBoldDebt() - assert.equal(recordedETHBalance, 0) - }) - - it('increaseBold(): increases the recorded BOLD balance by the correct amount', async () => { - const recordedBold_balanceBefore = await defaultPool.getBoldDebt() - assert.equal(recordedBold_balanceBefore, 0) + const result = await loadFixture(deployFixture); + WETH = result.WETH; + defaultPool = result.defaultPool; + mockTroveManager = result.mockTroveManager; + mockActivePool = result.mockActivePool; + }); + + it("getETHBalance(): gets the recorded BOLD balance", async () => { + const recordedETHBalance = await defaultPool.getETHBalance(); + assert.equal(recordedETHBalance, 0); + }); + + it("getBoldDebt(): gets the recorded BOLD balance", async () => { + const recordedETHBalance = await defaultPool.getBoldDebt(); + assert.equal(recordedETHBalance, 0); + }); + + it("increaseBold(): increases the recorded BOLD balance by the correct amount", async () => { + const recordedBold_balanceBefore = await defaultPool.getBoldDebt(); + assert.equal(recordedBold_balanceBefore, 0); // await defaultPool.increaseBoldDebt(100, { from: mockTroveManagerAddress }) - const increaseBoldDebtData = th.getTransactionData('increaseBoldDebt(uint256)', ['0x64']) - const tx = await mockTroveManager.forward(defaultPool.address, increaseBoldDebtData) - assert.isTrue(tx.receipt.status) - - const recordedBold_balanceAfter = await defaultPool.getBoldDebt() - assert.equal(recordedBold_balanceAfter, 100) - }) - - it('decreaseBold(): decreases the recorded BOLD balance by the correct amount', async () => { + const increaseBoldDebtData = th.getTransactionData("increaseBoldDebt(uint256)", ["0x64"]); + const tx = await mockTroveManager.forward(defaultPool.address, increaseBoldDebtData); + assert.isTrue(tx.receipt.status); + + const recordedBold_balanceAfter = await defaultPool.getBoldDebt(); + assert.equal(recordedBold_balanceAfter, 100); + }); + + it("decreaseBold(): decreases the recorded BOLD balance by the correct amount", async () => { // start the pool on 100 wei - //await defaultPool.increaseBoldDebt(100, { from: mockTroveManagerAddress }) - const increaseBoldDebtData = th.getTransactionData('increaseBoldDebt(uint256)', ['0x64']) - const tx1 = await mockTroveManager.forward(defaultPool.address, increaseBoldDebtData) - assert.isTrue(tx1.receipt.status) + // await defaultPool.increaseBoldDebt(100, { from: mockTroveManagerAddress }) + const increaseBoldDebtData = th.getTransactionData("increaseBoldDebt(uint256)", ["0x64"]); + const tx1 = await mockTroveManager.forward(defaultPool.address, increaseBoldDebtData); + assert.isTrue(tx1.receipt.status); - const recordedBold_balanceBefore = await defaultPool.getBoldDebt() - assert.equal(recordedBold_balanceBefore, 100) + const recordedBold_balanceBefore = await defaultPool.getBoldDebt(); + assert.equal(recordedBold_balanceBefore, 100); // await defaultPool.decreaseBoldDebt(100, { from: mockTroveManagerAddress }) - const decreaseBoldDebtData = th.getTransactionData('decreaseBoldDebt(uint256)', ['0x64']) - const tx2 = await mockTroveManager.forward(defaultPool.address, decreaseBoldDebtData) - assert.isTrue(tx2.receipt.status) + const decreaseBoldDebtData = th.getTransactionData("decreaseBoldDebt(uint256)", ["0x64"]); + const tx2 = await mockTroveManager.forward(defaultPool.address, decreaseBoldDebtData); + assert.isTrue(tx2.receipt.status); - const recordedBold_balanceAfter = await defaultPool.getBoldDebt() - assert.equal(recordedBold_balanceAfter, 0) - }) + const recordedBold_balanceAfter = await defaultPool.getBoldDebt(); + assert.equal(recordedBold_balanceAfter, 0); + }); // send raw ether - it('sendETHToActivePool(): decreases the recorded ETH balance by the correct amount', async () => { + it("sendETHToActivePool(): decreases the recorded ETH balance by the correct amount", async () => { // setup: give pool 2 ether - const defaultPool_initialBalance = web3.utils.toBN(await WETH.balanceOf(defaultPool.address)) - assert.equal(defaultPool_initialBalance, 0) + const defaultPool_initialBalance = web3.utils.toBN(await WETH.balanceOf(defaultPool.address)); + assert.equal(defaultPool_initialBalance, 0); // start pool with 2 ether - //await web3.eth.sendTransaction({ from: mockActivePool.address, to: defaultPool.address, value: dec(2, 'ether') }) - const eth_amount = dec(2, 'ether'); + // await web3.eth.sendTransaction({ from: mockActivePool.address, to: defaultPool.address, value: dec(2, 'ether') }) + const eth_amount = dec(2, "ether"); await WETH.mint(mockActivePool.address, eth_amount); // approve - const approveData = th.getTransactionData('approve(address,uint256)', [defaultPool.address, web3.utils.toHex(eth_amount)]); + const approveData = th.getTransactionData("approve(address,uint256)", [ + defaultPool.address, + web3.utils.toHex(eth_amount), + ]); await mockActivePool.forward(WETH.address, approveData, { from: owner }); // call receiveETH - const receiveETHData = th.getTransactionData('receiveETH(uint256)', [web3.utils.toHex(eth_amount)]); + const receiveETHData = th.getTransactionData("receiveETH(uint256)", [web3.utils.toHex(eth_amount)]); const tx1 = await mockActivePool.forward(defaultPool.address, receiveETHData, { from: owner }); - assert.isTrue(tx1.receipt.status) + assert.isTrue(tx1.receipt.status); - const defaultPool_BalanceBeforeTx = web3.utils.toBN(await WETH.balanceOf(defaultPool.address)) - const activePool_Balance_BeforeTx = web3.utils.toBN(await WETH.balanceOf(mockActivePool.address)) + const defaultPool_BalanceBeforeTx = web3.utils.toBN(await WETH.balanceOf(defaultPool.address)); + const activePool_Balance_BeforeTx = web3.utils.toBN(await WETH.balanceOf(mockActivePool.address)); - assert.equal(defaultPool_BalanceBeforeTx, dec(2, 'ether')) + assert.equal(defaultPool_BalanceBeforeTx, dec(2, "ether")); // send ether from pool to alice - //await defaultPool.sendETHToActivePool(dec(1, 'ether'), { from: mockTroveManagerAddress }) - const sendETHData = th.getTransactionData('sendETHToActivePool(uint256)', [web3.utils.toHex(dec(1, 'ether'))]) - await mockActivePool.setPayable(true) - const tx2 = await mockTroveManager.forward(defaultPool.address, sendETHData, { from: owner }) - assert.isTrue(tx2.receipt.status) - - const defaultPool_BalanceAfterTx = web3.utils.toBN(await WETH.balanceOf(defaultPool.address)) - const activePool_Balance_AfterTx = web3.utils.toBN(await WETH.balanceOf(mockActivePool.address)) - - const activePool_BalanceChange = activePool_Balance_AfterTx.sub(activePool_Balance_BeforeTx) - const defaultPool_BalanceChange = defaultPool_BalanceAfterTx.sub(defaultPool_BalanceBeforeTx) - //assert.equal(activePool_BalanceChange, dec(1, 'ether')) - //assert.equal(defaultPool_BalanceChange, _minus_1_Ether) - }) -}) - -contract('Reset chain state', async accounts => {}) + // await defaultPool.sendETHToActivePool(dec(1, 'ether'), { from: mockTroveManagerAddress }) + const sendETHData = th.getTransactionData("sendETHToActivePool(uint256)", [web3.utils.toHex(dec(1, "ether"))]); + await mockActivePool.setPayable(true); + const tx2 = await mockTroveManager.forward(defaultPool.address, sendETHData, { from: owner }); + assert.isTrue(tx2.receipt.status); + + const defaultPool_BalanceAfterTx = web3.utils.toBN(await WETH.balanceOf(defaultPool.address)); + const activePool_Balance_AfterTx = web3.utils.toBN(await WETH.balanceOf(mockActivePool.address)); + + const activePool_BalanceChange = activePool_Balance_AfterTx.sub(activePool_Balance_BeforeTx); + const defaultPool_BalanceChange = defaultPool_BalanceAfterTx.sub(defaultPool_BalanceBeforeTx); + // assert.equal(activePool_BalanceChange, dec(1, 'ether')) + // assert.equal(defaultPool_BalanceChange, _minus_1_Ether) + }); +}); + +contract("Reset chain state", async (accounts) => {}); diff --git a/contracts/test/SP_P_TruncationTest.js b/contracts/test/SP_P_TruncationTest.js index f1b90f64..3beb955b 100644 --- a/contracts/test/SP_P_TruncationTest.js +++ b/contracts/test/SP_P_TruncationTest.js @@ -26,11 +26,9 @@ contract("StabilityPool Scale Factor issue tests", async (accounts) => { const ZERO_ADDRESS = th.ZERO_ADDRESS; - const getOpenTroveBoldAmount = async (totalDebt) => - th.getOpenTroveBoldAmount(contracts, totalDebt); + const getOpenTroveBoldAmount = async (totalDebt) => th.getOpenTroveBoldAmount(contracts, totalDebt); const openTrove = async (params) => th.openTrove(contracts, params); - const getBoldAmountForDesiredDebt = async (desiredDebt) => - (await getOpenTroveBoldAmount(dec(desiredDebt, 18))); + const getBoldAmountForDesiredDebt = async (desiredDebt) => (await getOpenTroveBoldAmount(dec(desiredDebt, 18))); const deployFixture = createDeployAndFundFixture({ accounts: fundedAccounts, @@ -39,7 +37,7 @@ contract("StabilityPool Scale Factor issue tests", async (accounts) => { }, mocks: { TroveManager: TroveManagerTester, - } + }, }); beforeEach(async () => { @@ -56,31 +54,25 @@ contract("StabilityPool Scale Factor issue tests", async (accounts) => { describe("Scale Factor issue tests", async () => { it.skip("1. Liquidation succeeds after P reduced to 1", async () => { // Whale opens Trove with 100k ETH and sends 50k Bold to A - await th.openTroveWrapper(contracts, - th._100pct, - await getOpenTroveBoldAmount(dec(100000, 18)), - whale, - whale, - { from: whale, value: dec(100000, "ether") } - ); + await th.openTroveWrapper(contracts, th._100pct, await getOpenTroveBoldAmount(dec(100000, 18)), whale, whale, { + from: whale, + value: dec(100000, "ether"), + }); await boldToken.transfer(A, dec(50000, 18), { from: whale }); // Open 3 Troves with 2000 Bold debt for (const account of [A, B, C]) { - await th.openTroveWrapper(contracts, - th._100pct, - await getBoldAmountForDesiredDebt(2000), - account, - account, - { from: account, value: dec(15, "ether") } - ); + await th.openTroveWrapper(contracts, th._100pct, await getBoldAmountForDesiredDebt(2000), account, account, { + from: account, + value: dec(15, "ether"), + }); - //th.logBN("Trove debt", await th.getTroveEntireDebtByAddress(contracts, account)); + // th.logBN("Trove debt", await th.getTroveEntireDebtByAddress(contracts, account)); assert.isTrue( (await th.getTroveEntireDebtByAddress(contracts, account)).eq( - th.toBN(dec(2000, 18)) - ) + th.toBN(dec(2000, 18)), + ), ); } @@ -88,9 +80,9 @@ contract("StabilityPool Scale Factor issue tests", async (accounts) => { const deposit_0 = th.toBN("2000000000000000002001"); await stabilityPool.provideToSP(deposit_0, { from: A }); - //console.log("P0:"); + // console.log("P0:"); const P_0 = await stabilityPool.P(); - //console.log(P_0.toString()); + // console.log(P_0.toString()); assert.equal(P_0, dec(1, 18)); // Price drop -> liquidate Trove A -> price rises @@ -102,12 +94,12 @@ contract("StabilityPool Scale Factor issue tests", async (accounts) => { // Check P reduced by factor of 1e9 const P_1 = await stabilityPool.P(); assert.equal(P_1, dec(1, 9)); - //console.log("P1:"); - //console.log(P_1.toString()); + // console.log("P1:"); + // console.log(P_1.toString()); // A re-fills SP back up to deposit 0 level, i.e. just enough to reduce P by 1e9 from a 2k debt liq. const deposit_1 = deposit_0.sub( - await stabilityPool.getTotalBoldDeposits() + await stabilityPool.getTotalBoldDeposits(), ); await stabilityPool.provideToSP(deposit_1, { from: A }); @@ -120,12 +112,12 @@ contract("StabilityPool Scale Factor issue tests", async (accounts) => { // Check P reduced by factor of 1e9 const P_2 = await stabilityPool.P(); assert.isTrue(P_2.eq(th.toBN(1))); - //console.log("P2:"); - //console.log(P_2.toString()); + // console.log("P2:"); + // console.log(P_2.toString()); // A re-fills SP to same pre-liq level again const deposit_2 = deposit_0.sub( - await stabilityPool.getTotalBoldDeposits() + await stabilityPool.getTotalBoldDeposits(), ); await stabilityPool.provideToSP(deposit_2, { from: A }); @@ -136,36 +128,28 @@ contract("StabilityPool Scale Factor issue tests", async (accounts) => { await priceFeed.setPrice(dec(200, 18)); // This final liq fails. As expected, the 'assert' in SP line 618 reverts, since 'newP' equals 0 inside the final liq - // TODO: Fix this invariant violation whereby P can be reduced < 1e9 (but see v1 security advisory for liq workaround and + // TODO: Fix this invariant violation whereby P can be reduced < 1e9 (but see v1 security advisory for liq workaround and // low-severity assessment). }); it("2. New deposits can be made after P reduced to 1", async () => { // Whale opens Trove with 100k ETH and sends 50k Bold to A - await th.openTroveWrapper(contracts, - th._100pct, - await getOpenTroveBoldAmount(dec(100000, 18)), - whale, - whale, - 0, - { from: whale, value: dec(100000, "ether") } - ); + await th.openTroveWrapper(contracts, th._100pct, await getOpenTroveBoldAmount(dec(100000, 18)), whale, whale, 0, { + from: whale, + value: dec(100000, "ether"), + }); await boldToken.transfer(A, dec(50000, 18), { from: whale }); // Open 3 Troves with 2000 Bold debt for (const account of [A, B, C]) { - await th.openTroveWrapper(contracts, - th._100pct, - await getBoldAmountForDesiredDebt(2000), - account, - account, - 0, - { from: account, value: dec(15, "ether") } - ); + await th.openTroveWrapper(contracts, th._100pct, await getBoldAmountForDesiredDebt(2000), account, account, 0, { + from: account, + value: dec(15, "ether"), + }); assert.isTrue( (await th.getTroveEntireDebtByAddress(contracts, account)).eq( - th.toBN(dec(2000, 18)) - ) + th.toBN(dec(2000, 18)), + ), ); } @@ -173,9 +157,9 @@ contract("StabilityPool Scale Factor issue tests", async (accounts) => { const deposit_0 = th.toBN("2000000000000000002001"); await stabilityPool.provideToSP(deposit_0, { from: A }); - //console.log("P0:"); + // console.log("P0:"); const P_0 = await stabilityPool.P(); - //console.log(P_0.toString()); + // console.log(P_0.toString()); assert.equal(P_0, dec(1, 18)); // Price drop -> liquidate Trove A -> price rises @@ -187,12 +171,12 @@ contract("StabilityPool Scale Factor issue tests", async (accounts) => { // Check P reduced by factor of 1e9 const P_1 = await stabilityPool.P(); assert.equal(P_1, dec(1, 9)); - //console.log("P1:"); - //console.log(P_1.toString()); + // console.log("P1:"); + // console.log(P_1.toString()); // A re-fills SP back up to deposit 0 level, i.e. just enough to reduce P by 1e9 from a 2k debt liq. const deposit_1 = deposit_0.sub( - await stabilityPool.getTotalBoldDeposits() + await stabilityPool.getTotalBoldDeposits(), ); await stabilityPool.provideToSP(deposit_1, { from: A }); @@ -205,12 +189,12 @@ contract("StabilityPool Scale Factor issue tests", async (accounts) => { // Check P reduced by factor of 1e9 const P_2 = await stabilityPool.P(); assert.equal(P_2, dec(1, 0)); - //console.log("P2:"); - //console.log(P_2.toString()); + // console.log("P2:"); + // console.log(P_2.toString()); // A re-fills SP to same pre-liq level again const deposit_2 = deposit_0.sub( - await stabilityPool.getTotalBoldDeposits() + await stabilityPool.getTotalBoldDeposits(), ); await stabilityPool.provideToSP(deposit_2, { from: A }); @@ -231,38 +215,30 @@ contract("StabilityPool Scale Factor issue tests", async (accounts) => { }); assert.isTrue( (await stabilityPool.getCompoundedBoldDeposit(newDepositors[i])).eq( - newDeposits[i] - ) + newDeposits[i], + ), ); } }); it("3. Liquidation succeeds when P == 1 and liquidation has newProductFactor == 1e9", async () => { // Whale opens Trove with 100k ETH and sends 50k Bold to A - await th.openTroveWrapper(contracts, - th._100pct, - await getOpenTroveBoldAmount(dec(100000, 18)), - whale, - whale, - 0, - { from: whale, value: dec(100000, "ether") } - ); + await th.openTroveWrapper(contracts, th._100pct, await getOpenTroveBoldAmount(dec(100000, 18)), whale, whale, 0, { + from: whale, + value: dec(100000, "ether"), + }); await boldToken.transfer(A, dec(50000, 18), { from: whale }); // Open 3 Troves with 2000 Bold debt for (const account of [A, B, C]) { - await th.openTroveWrapper(contracts, - th._100pct, - await getBoldAmountForDesiredDebt(2000), - account, - account, - 0, - { from: account, value: dec(15, "ether") } - ); + await th.openTroveWrapper(contracts, th._100pct, await getBoldAmountForDesiredDebt(2000), account, account, 0, { + from: account, + value: dec(15, "ether"), + }); assert.isTrue( (await th.getTroveEntireDebtByAddress(contracts, account)).eq( - th.toBN(dec(2000, 18)) - ) + th.toBN(dec(2000, 18)), + ), ); } @@ -270,54 +246,54 @@ contract("StabilityPool Scale Factor issue tests", async (accounts) => { const deposit_0 = th.toBN("2000000000000000002001"); await stabilityPool.provideToSP(deposit_0, { from: A }); - //console.log("P0:"); + // console.log("P0:"); const P_0 = await stabilityPool.P(); - //console.log(P_0.toString()); + // console.log(P_0.toString()); assert.equal(P_0, dec(1, 18)); let scale = (await stabilityPool.currentScale()).toString(); assert.equal(scale, "0"); - //console.log("scale:"); - //console.log(scale); + // console.log("scale:"); + // console.log(scale); // Price drop -> liquidate Trove A -> price rises await priceFeed.setPrice(dec(100, 18)); await troveManager.liquidate(th.addressToTroveId(A), { from: owner }); - //console.log("LIQ 1"); + // console.log("LIQ 1"); assert.equal(await troveManager.getTroveStatus(th.addressToTroveId(A)), 3); // status: closed by liq await priceFeed.setPrice(dec(200, 18)); // Check P reduced by factor of 1e9 const P_1 = await stabilityPool.P(); assert.equal(P_1, dec(1, 9)); - //console.log("P1:"); - //console.log(P_1.toString()); + // console.log("P1:"); + // console.log(P_1.toString()); scale = (await stabilityPool.currentScale()).toString(); assert.equal(scale, "1"); - //console.log("scale:"); - //console.log(scale); + // console.log("scale:"); + // console.log(scale); // A re-fills SP back up to deposit 0 level, i.e. just enough to reduce P by 1e9 from a 2k debt liq. const deposit_1 = deposit_0.sub( - await stabilityPool.getTotalBoldDeposits() + await stabilityPool.getTotalBoldDeposits(), ); await stabilityPool.provideToSP(deposit_1, { from: A }); // Price drop -> liquidate Trove B -> price rises await priceFeed.setPrice(dec(100, 18)); await troveManager.liquidate(th.addressToTroveId(B), { from: owner }); - //console.log("LIQ 2"); + // console.log("LIQ 2"); assert.equal(await troveManager.getTroveStatus(th.addressToTroveId(B)), 3); // status: closed by liq await priceFeed.setPrice(dec(200, 18)); // Check P reduced by factor of 1e9 const P_2 = await stabilityPool.P(); assert.isTrue(P_2.eq(th.toBN(1))); - //console.log("P2:"); - //console.log(P_2.toString()); + // console.log("P2:"); + // console.log(P_2.toString()); scale = (await stabilityPool.currentScale()).toString(); assert.equal(scale, "2"); - //console.log("scale:"); - //console.log(scale); + // console.log("scale:"); + // console.log(scale); // A re-fills SP to ~1.000000001x pre-liq level, i.e. to trigger a newProductFactor == 1e9, // (and trigger scale change) @@ -329,7 +305,7 @@ contract("StabilityPool Scale Factor issue tests", async (accounts) => { // Price drop -> liquidate Trove C -> price rises await priceFeed.setPrice(dec(100, 18)); await troveManager.liquidate(th.addressToTroveId(C), { from: owner }); - //console.log("LIQ 3"); + // console.log("LIQ 3"); assert.equal(await troveManager.getTroveStatus(th.addressToTroveId(C)), 3); // status: closed by liq await priceFeed.setPrice(dec(200, 18)); @@ -337,40 +313,32 @@ contract("StabilityPool Scale Factor issue tests", async (accounts) => { // Due to scale change, raw value of P should equal (1 * 1e9 * 1e9 / 1e18) = 1, i.e. should not change. const P_3 = await stabilityPool.P(); assert.isTrue(P_3.eq(th.toBN(1))); - //console.log("P_3:"); - //console.log(P_3.toString()); + // console.log("P_3:"); + // console.log(P_3.toString()); scale = (await stabilityPool.currentScale()).toString(); assert.equal(scale, "3"); - //console.log("scale:"); - //console.log(scale); + // console.log("scale:"); + // console.log(scale); }); it("4. Liquidation succeeds when P == 1 and liquidation has newProductFactor > 1e9", async () => { // Whale opens Trove with 100k ETH and sends 50k Bold to A - await th.openTroveWrapper(contracts, - th._100pct, - await getOpenTroveBoldAmount(dec(100000, 18)), - whale, - whale, - 0, - { from: whale, value: dec(100000, "ether") } - ); + await th.openTroveWrapper(contracts, th._100pct, await getOpenTroveBoldAmount(dec(100000, 18)), whale, whale, 0, { + from: whale, + value: dec(100000, "ether"), + }); await boldToken.transfer(A, dec(50000, 18), { from: whale }); // Open 3 Troves with 2000 Bold debt for (const account of [A, B, C]) { - await th.openTroveWrapper(contracts, - th._100pct, - await getBoldAmountForDesiredDebt(2000), - account, - account, - 0, - { from: account, value: dec(15, "ether") } - ); + await th.openTroveWrapper(contracts, th._100pct, await getBoldAmountForDesiredDebt(2000), account, account, 0, { + from: account, + value: dec(15, "ether"), + }); assert.isTrue( (await th.getTroveEntireDebtByAddress(contracts, account)).eq( - th.toBN(dec(2000, 18)) - ) + th.toBN(dec(2000, 18)), + ), ); } @@ -378,54 +346,54 @@ contract("StabilityPool Scale Factor issue tests", async (accounts) => { const deposit_0 = th.toBN("2000000000000000002001"); await stabilityPool.provideToSP(deposit_0, { from: A }); - //console.log("P0:"); + // console.log("P0:"); const P_0 = await stabilityPool.P(); - //console.log(P_0.toString()); + // console.log(P_0.toString()); assert.equal(P_0, dec(1, 18)); let scale = (await stabilityPool.currentScale()).toString(); assert.equal(scale, "0"); - //console.log("scale:"); - //console.log(scale); + // console.log("scale:"); + // console.log(scale); // Price drop -> liquidate Trove A -> price rises await priceFeed.setPrice(dec(100, 18)); await troveManager.liquidate(th.addressToTroveId(A), { from: owner }); - //console.log("LIQ 1"); + // console.log("LIQ 1"); assert.equal(await troveManager.getTroveStatus(th.addressToTroveId(A)), 3); // status: closed by liq await priceFeed.setPrice(dec(200, 18)); // Check P reduced by factor of 1e9 const P_1 = await stabilityPool.P(); assert.equal(P_1, dec(1, 9)); - //console.log("P1:"); - //console.log(P_1.toString()); + // console.log("P1:"); + // console.log(P_1.toString()); scale = (await stabilityPool.currentScale()).toString(); assert.equal(scale, "1"); - //console.log("scale:"); - //console.log(scale); + // console.log("scale:"); + // console.log(scale); // A re-fills SP back up to deposit 0 level, i.e. just enough to reduce P by 1e9 from a 2k debt liq. const deposit_1 = deposit_0.sub( - await stabilityPool.getTotalBoldDeposits() + await stabilityPool.getTotalBoldDeposits(), ); await stabilityPool.provideToSP(deposit_1, { from: A }); // Price drop -> liquidate Trove B -> price rises await priceFeed.setPrice(dec(100, 18)); await troveManager.liquidate(th.addressToTroveId(B), { from: owner }); - //console.log("LIQ 2"); + // console.log("LIQ 2"); assert.equal(await troveManager.getTroveStatus(th.addressToTroveId(B)), 3); // status: closed by liq await priceFeed.setPrice(dec(200, 18)); // Check P reduced by factor of 1e9 const P_2 = await stabilityPool.P(); assert.isTrue(P_2.eq(th.toBN(1))); - //console.log("P2:"); - //console.log(P_2.toString()); + // console.log("P2:"); + // console.log(P_2.toString()); scale = (await stabilityPool.currentScale()).toString(); assert.equal(scale, "2"); - //console.log("scale:"); - //console.log(scale); + // console.log("scale:"); + // console.log(scale); // A re-fills SP to ~2x pre-liq level, i.e. to trigger a newProductFactor > 1e9, // and trigger scale change and *increase* raw value of P again. @@ -437,7 +405,7 @@ contract("StabilityPool Scale Factor issue tests", async (accounts) => { // Price drop -> liquidate Trove C -> price rises await priceFeed.setPrice(dec(100, 18)); await troveManager.liquidate(th.addressToTroveId(C), { from: owner }); - //console.log("LIQ 3"); + // console.log("LIQ 3"); assert.equal(await troveManager.getTroveStatus(th.addressToTroveId(C)), 3); // status: closed by liq await priceFeed.setPrice(dec(200, 18)); @@ -445,42 +413,34 @@ contract("StabilityPool Scale Factor issue tests", async (accounts) => { // Raw value of P should change from 1 to (1 * 5e17 * 1e9 / 1e18)= 5e8. const P_3 = await stabilityPool.P(); assert.isTrue(P_3.eq(th.toBN(dec(5, 8)))); - //console.log("P_3:"); - //console.log(P_3.toString()); + // console.log("P_3:"); + // console.log(P_3.toString()); scale = (await stabilityPool.currentScale()).toString(); assert.equal(scale, "3"); - //console.log("scale:"); - //console.log(scale); + // console.log("scale:"); + // console.log(scale); }); // --- Check depositors have correct stakes after experiencing scale change from depositing when P is tiny --- it("5. Depositor have correct depleted stake after deposit at P == 1 and scale changing liq (with newProductFactor == 1e9)", async () => { // Whale opens Trove with 100k ETH and sends 50k Bold to A - await th.openTroveWrapper(contracts, - th._100pct, - await getOpenTroveBoldAmount(dec(100000, 18)), - whale, - whale, - 0, - { from: whale, value: dec(100000, "ether") } - ); + await th.openTroveWrapper(contracts, th._100pct, await getOpenTroveBoldAmount(dec(100000, 18)), whale, whale, 0, { + from: whale, + value: dec(100000, "ether"), + }); await boldToken.transfer(A, dec(50000, 18), { from: whale }); // Open 3 Troves with 2000 Bold debt for (const account of [A, B, C]) { - await th.openTroveWrapper(contracts, - th._100pct, - await getBoldAmountForDesiredDebt(2000), - account, - account, - 0, - { from: account, value: dec(15, "ether") } - ); + await th.openTroveWrapper(contracts, th._100pct, await getBoldAmountForDesiredDebt(2000), account, account, 0, { + from: account, + value: dec(15, "ether"), + }); assert.isTrue( (await th.getTroveEntireDebtByAddress(contracts, account)).eq( - th.toBN(dec(2000, 18)) - ) + th.toBN(dec(2000, 18)), + ), ); } @@ -488,54 +448,54 @@ contract("StabilityPool Scale Factor issue tests", async (accounts) => { const deposit_0 = th.toBN("2000000000000000002001"); await stabilityPool.provideToSP(deposit_0, { from: A }); - //console.log("P0:"); + // console.log("P0:"); const P_0 = await stabilityPool.P(); - //console.log(P_0.toString()); + // console.log(P_0.toString()); assert.equal(P_0, dec(1, 18)); let scale = (await stabilityPool.currentScale()).toString(); assert.equal(scale, "0"); - //console.log("scale:"); - //console.log(scale); + // console.log("scale:"); + // console.log(scale); // Price drop -> liquidate Trove A -> price rises await priceFeed.setPrice(dec(100, 18)); await troveManager.liquidate(th.addressToTroveId(A), { from: owner }); - //console.log("LIQ 1"); + // console.log("LIQ 1"); assert.equal(await troveManager.getTroveStatus(th.addressToTroveId(A)), 3); // status: closed by liq await priceFeed.setPrice(dec(200, 18)); // Check P reduced by factor of 1e9 const P_1 = await stabilityPool.P(); assert.equal(P_1, dec(1, 9)); - //console.log("P1:"); - //console.log(P_1.toString()); + // console.log("P1:"); + // console.log(P_1.toString()); scale = (await stabilityPool.currentScale()).toString(); assert.equal(scale, "1"); - //console.log("scale:"); - //console.log(scale); + // console.log("scale:"); + // console.log(scale); // A re-fills SP back up to deposit 0 level, i.e. just enough to reduce P by 1e9 from a 2k debt liq. const deposit_1 = deposit_0.sub( - await stabilityPool.getTotalBoldDeposits() + await stabilityPool.getTotalBoldDeposits(), ); await stabilityPool.provideToSP(deposit_1, { from: A }); // Price drop -> liquidate Trove B -> price rises await priceFeed.setPrice(dec(100, 18)); await troveManager.liquidate(th.addressToTroveId(B), { from: owner }); - //console.log("LIQ 2"); + // console.log("LIQ 2"); assert.equal(await troveManager.getTroveStatus(th.addressToTroveId(B)), 3); // status: closed by liq await priceFeed.setPrice(dec(200, 18)); // Check P reduced by factor of 1e9 const P_2 = await stabilityPool.P(); assert.isTrue(P_2.eq(th.toBN(1))); - //console.log("P2:"); - //console.log(P_2.toString()); + // console.log("P2:"); + // console.log(P_2.toString()); scale = (await stabilityPool.currentScale()).toString(); assert.equal(scale, "2"); - //console.log("scale:"); - //console.log(scale); + // console.log("scale:"); + // console.log(scale); // D makes deposit of 1000 Bold const D_deposit = dec(1, 21); @@ -552,7 +512,7 @@ contract("StabilityPool Scale Factor issue tests", async (accounts) => { // Price drop -> liquidate Trove C -> price rises await priceFeed.setPrice(dec(100, 18)); await troveManager.liquidate(th.addressToTroveId(C), { from: owner }); - //console.log("LIQ 3"); + // console.log("LIQ 3"); assert.equal(await troveManager.getTroveStatus(th.addressToTroveId(C)), 3); // status: closed by liq await priceFeed.setPrice(dec(200, 18)); @@ -560,46 +520,38 @@ contract("StabilityPool Scale Factor issue tests", async (accounts) => { // Due to scale change, raw value of P should equal (1 * 1e9 * 1e9 / 1e18) = 1, i.e. should not change. const P_3 = await stabilityPool.P(); assert.isTrue(P_3.eq(th.toBN(1))); - //console.log("P_3:"); - //console.log(P_3.toString()); + // console.log("P_3:"); + // console.log(P_3.toString()); scale = (await stabilityPool.currentScale()).toString(); assert.equal(scale, "3"); - //console.log("scale:"); - //console.log(scale); + // console.log("scale:"); + // console.log(scale); // Check D's deposit has depleted to a billion'th of their initial deposit. That is, from 1e21 to 1e(21-9) = 1e12 const D_depletedDeposit = await stabilityPool.getCompoundedBoldDeposit(D); assert.isTrue(D_depletedDeposit.eq(th.toBN(dec(1, 12)))); - //console.log("D_depletedDeposit:"); - //console.log(D_depletedDeposit.toString()); + // console.log("D_depletedDeposit:"); + // console.log(D_depletedDeposit.toString()); }); it("6. Depositor have correct depleted stake after deposit at P == 1 and scale changing liq (with newProductFactor > 1e9)", async () => { // Whale opens Trove with 100k ETH and sends 50k Bold to A - await th.openTroveWrapper(contracts, - th._100pct, - await getOpenTroveBoldAmount(dec(100000, 18)), - whale, - whale, - 0, - { from: whale, value: dec(100000, "ether") } - ); + await th.openTroveWrapper(contracts, th._100pct, await getOpenTroveBoldAmount(dec(100000, 18)), whale, whale, 0, { + from: whale, + value: dec(100000, "ether"), + }); await boldToken.transfer(A, dec(50000, 18), { from: whale }); // Open 3 Troves with 2000 Bold debt for (const account of [A, B, C]) { - await th.openTroveWrapper(contracts, - th._100pct, - await getBoldAmountForDesiredDebt(2000), - account, - account, - 0, - { from: account, value: dec(15, "ether") } - ); + await th.openTroveWrapper(contracts, th._100pct, await getBoldAmountForDesiredDebt(2000), account, account, 0, { + from: account, + value: dec(15, "ether"), + }); assert.isTrue( (await th.getTroveEntireDebtByAddress(contracts, account)).eq( - th.toBN(dec(2000, 18)) - ) + th.toBN(dec(2000, 18)), + ), ); } @@ -607,54 +559,54 @@ contract("StabilityPool Scale Factor issue tests", async (accounts) => { const deposit_0 = th.toBN("2000000000000000002001"); await stabilityPool.provideToSP(deposit_0, { from: A }); - //console.log("P0:"); + // console.log("P0:"); const P_0 = await stabilityPool.P(); - //console.log(P_0.toString()); + // console.log(P_0.toString()); assert.equal(P_0, dec(1, 18)); let scale = (await stabilityPool.currentScale()).toString(); assert.equal(scale, "0"); - //console.log("scale:"); - //console.log(scale); + // console.log("scale:"); + // console.log(scale); // Price drop -> liquidate Trove A -> price rises await priceFeed.setPrice(dec(100, 18)); await troveManager.liquidate(th.addressToTroveId(A), { from: owner }); - //console.log("LIQ 1"); + // console.log("LIQ 1"); assert.equal(await troveManager.getTroveStatus(th.addressToTroveId(A)), 3); // status: closed by liq await priceFeed.setPrice(dec(200, 18)); // Check P reduced by factor of 1e9 const P_1 = await stabilityPool.P(); assert.equal(P_1, dec(1, 9)); - //console.log("P1:"); - //console.log(P_1.toString()); + // console.log("P1:"); + // console.log(P_1.toString()); scale = (await stabilityPool.currentScale()).toString(); assert.equal(scale, "1"); - //console.log("scale:"); - //console.log(scale); + // console.log("scale:"); + // console.log(scale); // A re-fills SP back up to deposit 0 level, i.e. just enough to reduce P by 1e9 from a 2k debt liq. const deposit_1 = deposit_0.sub( - await stabilityPool.getTotalBoldDeposits() + await stabilityPool.getTotalBoldDeposits(), ); await stabilityPool.provideToSP(deposit_1, { from: A }); // Price drop -> liquidate Trove B -> price rises await priceFeed.setPrice(dec(100, 18)); await troveManager.liquidate(th.addressToTroveId(B), { from: owner }); - //console.log("LIQ 2"); + // console.log("LIQ 2"); assert.equal(await troveManager.getTroveStatus(th.addressToTroveId(B)), 3); // status: closed by liq await priceFeed.setPrice(dec(200, 18)); // Check P reduced by factor of 1e9 const P_2 = await stabilityPool.P(); assert.isTrue(P_2.eq(th.toBN(1))); - //console.log("P2:"); - //console.log(P_2.toString()); + // console.log("P2:"); + // console.log(P_2.toString()); scale = (await stabilityPool.currentScale()).toString(); assert.equal(scale, "2"); - //console.log("scale:"); - //console.log(scale); + // console.log("scale:"); + // console.log(scale); // D makes deposit of 1000 Bold const D_deposit = dec(1, 21); @@ -671,7 +623,7 @@ contract("StabilityPool Scale Factor issue tests", async (accounts) => { // Price drop -> liquidate Trove C -> price rises await priceFeed.setPrice(dec(100, 18)); await troveManager.liquidate(th.addressToTroveId(C), { from: owner }); - //console.log("LIQ 3"); + // console.log("LIQ 3"); assert.equal(await troveManager.getTroveStatus(th.addressToTroveId(C)), 3); // status: closed by liq await priceFeed.setPrice(dec(200, 18)); @@ -679,18 +631,18 @@ contract("StabilityPool Scale Factor issue tests", async (accounts) => { // Raw value of P should change from 1 to (1 * 5e17 * 1e9 / 1e18)= 5e8. const P_3 = await stabilityPool.P(); assert.isTrue(P_3.eq(th.toBN(dec(5, 8)))); - //console.log("P_3:"); - //console.log(P_3.toString()); + // console.log("P_3:"); + // console.log(P_3.toString()); scale = (await stabilityPool.currentScale()).toString(); assert.equal(scale, "3"); - //console.log("scale:"); - //console.log(scale); + // console.log("scale:"); + // console.log(scale); // Check D's deposit has depleted to 50% their initial deposit. That is, from 1e21 to 5e20. const D_depletedDeposit = await stabilityPool.getCompoundedBoldDeposit(D); assert.isTrue(D_depletedDeposit.eq(th.toBN(dec(5, 20)))); - //console.log("D_depletedDeposit:"); - //console.log(D_depletedDeposit.toString()); + // console.log("D_depletedDeposit:"); + // console.log(D_depletedDeposit.toString()); }); }); }); diff --git a/contracts/test/StabilityPoolTest.js b/contracts/test/StabilityPoolTest.js index d19f4840..3062ae3f 100644 --- a/contracts/test/StabilityPoolTest.js +++ b/contracts/test/StabilityPoolTest.js @@ -1,4 +1,4 @@ -const { time } = require('@nomicfoundation/hardhat-network-helpers'); +const { time } = require("@nomicfoundation/hardhat-network-helpers"); const { MoneyValues: mv, TestHelper: th, @@ -61,19 +61,18 @@ contract("StabilityPool", async (accounts) => { let defaultPool; let borrowerOperations; - const getOpenTroveBoldAmount = async (totalDebt) => - th.getOpenTroveBoldAmount(contracts, totalDebt); + const getOpenTroveBoldAmount = async (totalDebt) => th.getOpenTroveBoldAmount(contracts, totalDebt); const openTrove = async (params) => th.openTrove(contracts, params); const assertRevert = th.assertRevert; const deployFixture = createDeployAndFundFixture({ accounts: fundedAccounts.slice(0, 20), - mocks: { TroveManager: TroveManagerTester } + mocks: { TroveManager: TroveManagerTester }, }); describe("Stability Pool Mechanisms", async () => { beforeEach(async () => { - const result = await deployFixture() + const result = await deployFixture(); contracts = result.contracts; priceFeed = contracts.priceFeed; boldToken = contracts.boldToken; @@ -101,8 +100,7 @@ contract("StabilityPool", async (accounts) => { await stabilityPool.provideToSP(200, { from: alice }); // check Bold balances after - const stabilityPool_Bold_After = - await stabilityPool.getTotalBoldDeposits(); + const stabilityPool_Bold_After = await stabilityPool.getTotalBoldDeposits(); assert.equal(stabilityPool_Bold_After, 200); }); @@ -123,9 +121,7 @@ contract("StabilityPool", async (accounts) => { await stabilityPool.provideToSP(200, { from: alice }); // check user's deposit record after - const alice_depositRecord_After = ( - await stabilityPool.deposits(alice) - ); + const alice_depositRecord_After = await stabilityPool.deposits(alice); assert.equal(alice_depositRecord_After, 200); }); @@ -148,7 +144,7 @@ contract("StabilityPool", async (accounts) => { const alice_BoldBalance_After = await boldToken.balanceOf(alice); assert.equal( alice_BoldBalance_Before.sub(alice_BoldBalance_After), - "200" + "200", ); }); @@ -295,8 +291,7 @@ contract("StabilityPool", async (accounts) => { await troveManager.liquidate(defaulter_1_TroveId, { from: owner }); // 180 Bold closed await troveManager.liquidate(defaulter_2_TroveId, { from: owner }); // 180 Bold closed - const alice_compoundedDeposit_1 = - await stabilityPool.getCompoundedBoldDeposit(alice); + const alice_compoundedDeposit_1 = await stabilityPool.getCompoundedBoldDeposit(alice); // Alice makes deposit #2 const alice_topUp_1 = toBN(dec(100, 18)); @@ -309,7 +304,7 @@ contract("StabilityPool", async (accounts) => { ).toString(); assert.equal( alice_compoundedDeposit_1.add(alice_topUp_1), - alice_newDeposit_1 + alice_newDeposit_1, ); // get system reward terms @@ -338,8 +333,7 @@ contract("StabilityPool", async (accounts) => { // Defaulter 3 Trove is closed await troveManager.liquidate(defaulter_3_TroveId, { from: owner }); - const alice_compoundedDeposit_2 = - await stabilityPool.getCompoundedBoldDeposit(alice); + const alice_compoundedDeposit_2 = await stabilityPool.getCompoundedBoldDeposit(alice); const P_2 = await stabilityPool.P(); const S_2 = await stabilityPool.epochToScaleToSum(0, 0); @@ -383,7 +377,7 @@ contract("StabilityPool", async (accounts) => { const aliceTxPromise = stabilityPool.provideToSP( aliceBoldbal.add(toBN(1)), - { from: alice } + { from: alice }, ); await assertRevert(aliceTxPromise, "revert"); @@ -391,7 +385,7 @@ contract("StabilityPool", async (accounts) => { const bobTxPromise = stabilityPool.provideToSP( bobBoldbal.add(toBN(dec(235534, 18))), - { from: bob } + { from: bob }, ); await assertRevert(bobTxPromise, "revert"); }); @@ -414,7 +408,7 @@ contract("StabilityPool", async (accounts) => { }); const maxBytes32 = web3.utils.toBN( - "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff" + "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", ); // Alice attempts to deposit 2^256-1 Bold @@ -466,11 +460,11 @@ contract("StabilityPool", async (accounts) => { const tx1 = await nonPayable.forward(stabilityPool.address, txData1); const gain_0 = await stabilityPool.getDepositorETHGain( - nonPayable.address + nonPayable.address, ); assert.isTrue( gain_0.eq(toBN(0)), - "NonPayableSwitch should not have accumulated gains" + "NonPayableSwitch should not have accumulated gains", ); // price drops: defaulters' Troves fall below MCR, nonPayable and whale Trove remain active @@ -481,11 +475,11 @@ contract("StabilityPool", async (accounts) => { await troveManager.liquidate(defaulter_2_TroveId, { from: owner }); const gain_1 = await stabilityPool.getDepositorETHGain( - nonPayable.address + nonPayable.address, ); assert.isTrue( gain_1.gt(toBN(0)), - "NonPayableSwitch should have some accumulated gains" + "NonPayableSwitch should have some accumulated gains", ); // NonPayableSwitch tries to make deposit #2: 100Bold (which also attempts to withdraw ETH gain) @@ -495,7 +489,7 @@ contract("StabilityPool", async (accounts) => { ]); await th.assertRevert( nonPayable.forward(stabilityPool.address, txData2), - "StabilityPool: sending ETH failed" + "StabilityPool: sending ETH failed", ); }); @@ -579,7 +573,7 @@ contract("StabilityPool", async (accounts) => { await stabilityPool.getDepositorETHGain(carol) ).toString(); - //check non-zero Bold and ETHGain in the Stability Pool + // check non-zero Bold and ETHGain in the Stability Pool const BoldinSP = await stabilityPool.getTotalBoldDeposits(); const ETHinSP = await stabilityPool.getETHBalance(); assert.isTrue(BoldinSP.gt(mv._zeroBN)); @@ -591,7 +585,7 @@ contract("StabilityPool", async (accounts) => { }); assert.equal( (await stabilityPool.getCompoundedBoldDeposit(dennis)).toString(), - dec(1000, 18) + dec(1000, 18), ); const alice_BoldDeposit_After = ( @@ -696,7 +690,7 @@ contract("StabilityPool", async (accounts) => { }); assert.equal( (await stabilityPool.getCompoundedBoldDeposit(dennis)).toString(), - dec(1000, 18) + dec(1000, 18), ); const activeDebt_After = (await activePool.getRecordedDebtSum()).toString(); @@ -805,7 +799,7 @@ contract("StabilityPool", async (accounts) => { }); assert.equal( (await stabilityPool.getCompoundedBoldDeposit(dennis)).toString(), - dec(1000, 18) + dec(1000, 18), ); const whale_Debt_After = (await troveManager.Troves(whaleTroveId))[0].toString(); @@ -896,7 +890,7 @@ contract("StabilityPool", async (accounts) => { // Confirm Bob has a Stability deposit assert.equal( (await stabilityPool.getCompoundedBoldDeposit(bob)).toString(), - dec(1000, 18) + dec(1000, 18), ); // Price drops @@ -995,25 +989,25 @@ contract("StabilityPool", async (accounts) => { await stabilityPool.provideToSP(dec(100, 18), { from: A, gasPrice: GAS_PRICE, - }) + }), ); const B_GAS_Used = th.gasUsed( await stabilityPool.provideToSP(dec(200, 18), { from: B, gasPrice: GAS_PRICE, - }) + }), ); const C_GAS_Used = th.gasUsed( await stabilityPool.provideToSP(dec(300, 18), { from: C, gasPrice: GAS_PRICE, - }) + }), ); const D_GAS_Used = th.gasUsed( await stabilityPool.provideToSP(dec(400, 18), { from: D, gasPrice: GAS_PRICE, - }) + }), ); // ETH balances before minus gas used @@ -1105,28 +1099,28 @@ contract("StabilityPool", async (accounts) => { from: A, gasPrice: GAS_PRICE, gasPrice: GAS_PRICE, - }) + }), ); const B_GAS_Used = th.gasUsed( await stabilityPool.provideToSP(dec(200, 18), { from: B, gasPrice: GAS_PRICE, gasPrice: GAS_PRICE, - }) + }), ); const C_GAS_Used = th.gasUsed( await stabilityPool.provideToSP(dec(300, 18), { from: C, gasPrice: GAS_PRICE, gasPrice: GAS_PRICE, - }) + }), ); const D_GAS_Used = th.gasUsed( await stabilityPool.provideToSP(dec(400, 18), { from: D, gasPrice: GAS_PRICE, gasPrice: GAS_PRICE, - }) + }), ); // ETH balances before minus gas used @@ -1177,19 +1171,19 @@ contract("StabilityPool", async (accounts) => { await th.assertRevert( txPromise_A, - "StabilityPool: Amount must be non-zero" + "StabilityPool: Amount must be non-zero", ); await th.assertRevert( txPromise_B, - "StabilityPool: Amount must be non-zero" + "StabilityPool: Amount must be non-zero", ); await th.assertRevert( txPromise_C, - "StabilityPool: Amount must be non-zero" + "StabilityPool: Amount must be non-zero", ); await th.assertRevert( txPromise_D, - "StabilityPool: Amount must be non-zero" + "StabilityPool: Amount must be non-zero", ); }); @@ -1211,7 +1205,7 @@ contract("StabilityPool", async (accounts) => { from: alice, }); - const alice_initialDeposit = ( + const alice_initialDeposit = ( await stabilityPool.deposits(alice) ).toString(); @@ -1235,7 +1229,7 @@ contract("StabilityPool", async (accounts) => { } catch (err) { assert.include(err.message, "revert"); // TODO: infamous issue #99 - //assert.include(err.message, "User must have a non-zero deposit") + // assert.include(err.message, "User must have a non-zero deposit") } }); @@ -1285,10 +1279,10 @@ contract("StabilityPool", async (accounts) => { }); // 170 Bold closed const [liquidatedDebt_1] = await th.getEmittedLiquidationValues( - liquidationTX_1 + liquidationTX_1, ); const [liquidatedDebt_2] = await th.getEmittedLiquidationValues( - liquidationTX_2 + liquidationTX_2, ); // Alice BoldLoss is ((15000/200000) * liquidatedDebt), for each liquidation @@ -1296,40 +1290,39 @@ contract("StabilityPool", async (accounts) => { .mul(toBN(dec(15000, 18))) .div(toBN(dec(200000, 18))) .add( - liquidatedDebt_2.mul(toBN(dec(15000, 18))).div(toBN(dec(200000, 18))) + liquidatedDebt_2.mul(toBN(dec(15000, 18))).div(toBN(dec(200000, 18))), ); const expectedCompoundedBoldDeposit_A = toBN(dec(15000, 18)).sub( - expectedBoldLoss_A + expectedBoldLoss_A, ); - const compoundedBoldDeposit_A = - await stabilityPool.getCompoundedBoldDeposit(alice); + const compoundedBoldDeposit_A = await stabilityPool.getCompoundedBoldDeposit(alice); assert.isAtMost( th.getDifference( expectedCompoundedBoldDeposit_A, - compoundedBoldDeposit_A + compoundedBoldDeposit_A, ), - 100000 + 100000, ); // Alice retrieves part of her entitled Bold: 9000 Bold await stabilityPool.withdrawFromSP(dec(9000, 18), { from: alice }); const expectedNewDeposit_A = compoundedBoldDeposit_A.sub( - toBN(dec(9000, 18)) + toBN(dec(9000, 18)), ); // check Alice's deposit has been updated to equal her compounded deposit minus her withdrawal */ const newDeposit = (await stabilityPool.deposits(alice)).toString(); assert.isAtMost( th.getDifference(newDeposit, expectedNewDeposit_A), - 100000 + 100000, ); // Expect Alice has withdrawn all ETH gain const alice_pendingETHGain = await stabilityPool.getDepositorETHGain( - alice + alice, ); assert.equal(alice_pendingETHGain, 0); }); @@ -1382,10 +1375,10 @@ contract("StabilityPool", async (accounts) => { }); const [liquidatedDebt_1] = await th.getEmittedLiquidationValues( - liquidationTX_1 + liquidationTX_1, ); const [liquidatedDebt_2] = await th.getEmittedLiquidationValues( - liquidationTX_2 + liquidationTX_2, ); // Alice retrieves part of her entitled Bold: 9000 Bold @@ -1454,10 +1447,10 @@ contract("StabilityPool", async (accounts) => { }); const [liquidatedDebt_1] = await th.getEmittedLiquidationValues( - liquidationTX_1 + liquidationTX_1, ); const [liquidatedDebt_2] = await th.getEmittedLiquidationValues( - liquidationTX_2 + liquidationTX_2, ); // Alice BoldLoss is ((15000/200000) * liquidatedDebt), for each liquidation @@ -1465,21 +1458,20 @@ contract("StabilityPool", async (accounts) => { .mul(toBN(dec(15000, 18))) .div(toBN(dec(200000, 18))) .add( - liquidatedDebt_2.mul(toBN(dec(15000, 18))).div(toBN(dec(200000, 18))) + liquidatedDebt_2.mul(toBN(dec(15000, 18))).div(toBN(dec(200000, 18))), ); const expectedCompoundedBoldDeposit_A = toBN(dec(15000, 18)).sub( - expectedBoldLoss_A + expectedBoldLoss_A, ); - const compoundedBoldDeposit_A = - await stabilityPool.getCompoundedBoldDeposit(alice); + const compoundedBoldDeposit_A = await stabilityPool.getCompoundedBoldDeposit(alice); assert.isAtMost( th.getDifference( expectedCompoundedBoldDeposit_A, - compoundedBoldDeposit_A + compoundedBoldDeposit_A, ), - 100000 + 100000, ); const BoldinSPBefore = await stabilityPool.getTotalBoldDeposits(); @@ -1492,7 +1484,7 @@ contract("StabilityPool", async (accounts) => { const BoldinSPAfter = await stabilityPool.getTotalBoldDeposits(); assert.isAtMost( th.getDifference(expectedBoldinSPAfter, BoldinSPAfter), - 100000 + 100000, ); }); @@ -1668,10 +1660,9 @@ contract("StabilityPool", async (accounts) => { const liquidationTx_1 = await troveManager.liquidate(defaulter_1_TroveId, { from: owner, }); // 180 Bold closed - const [, liquidatedColl] = - th.getEmittedLiquidationValues(liquidationTx_1); + const [, liquidatedColl] = th.getEmittedLiquidationValues(liquidationTx_1); - //Get ActivePool and StabilityPool Ether before retrieval: + // Get ActivePool and StabilityPool Ether before retrieval: const active_ETH_Before = await activePool.getETHBalance(); const stability_ETH_Before = await stabilityPool.getETHBalance(); @@ -1689,15 +1680,14 @@ contract("StabilityPool", async (accounts) => { const stability_ETH_After = await stabilityPool.getETHBalance(); const active_ETH_Difference = active_ETH_Before.sub(active_ETH_After); - const stability_ETH_Difference = - stability_ETH_Before.sub(stability_ETH_After); + const stability_ETH_Difference = stability_ETH_Before.sub(stability_ETH_After); assert.equal(active_ETH_Difference, "0"); // Expect StabilityPool to have decreased by Alice's ETHGain assert.isAtMost( th.getDifference(stability_ETH_Difference, aliceETHGain), - 10000 + 10000, ); }); @@ -1759,13 +1749,14 @@ contract("StabilityPool", async (accounts) => { }); // 1 defaulter opens trove - const defaulter_1_TroveId = await th.openTroveWrapper(contracts, + const defaulter_1_TroveId = await th.openTroveWrapper( + contracts, th._100pct, await getOpenTroveBoldAmount(dec(10000, 18)), defaulter_1, defaulter_1, 0, - { from: defaulter_1, value: dec(100, "ether") } + { from: defaulter_1, value: dec(100, "ether") }, ); const defaulterDebt = ( @@ -1801,11 +1792,7 @@ contract("StabilityPool", async (accounts) => { await priceFeed.setPrice(dec(200, 18)); // Bob issues a further 5000 Bold from his trove - await borrowerOperations.withdrawBold(th.addressToTroveId(bob), - th._100pct, - dec(5000, 18), - { from: bob } - ); + await borrowerOperations.withdrawBold(th.addressToTroveId(bob), th._100pct, dec(5000, 18), { from: bob }); // Expect Alice's Bold balance increase be very close to 8333.3333333333333333 Bold await stabilityPool.withdrawFromSP(dec(10000, 18), { from: alice }); @@ -1814,9 +1801,9 @@ contract("StabilityPool", async (accounts) => { assert.isAtMost( th.getDifference( aliceBalance.sub(aliceBalBefore), - "8333333333333333333333" + "8333333333333333333333", ), - 100000 + 100000, ); // expect Bob's Bold balance increase to be very close to 13333.33333333333333333 Bold @@ -1825,9 +1812,9 @@ contract("StabilityPool", async (accounts) => { assert.isAtMost( th.getDifference( bobBalance.sub(bobBalBefore), - "13333333333333333333333" + "13333333333333333333333", ), - 100000 + 100000, ); }); @@ -1898,7 +1885,7 @@ contract("StabilityPool", async (accounts) => { await stabilityPool.getDepositorETHGain(bob) ).toString(); - //check non-zero Bold and ETHGain in the Stability Pool + // check non-zero Bold and ETHGain in the Stability Pool const BoldinSP = await stabilityPool.getTotalBoldDeposits(); const ETHinSP = await stabilityPool.getETHBalance(); assert.isTrue(BoldinSP.gt(mv._zeroBN)); @@ -1910,7 +1897,7 @@ contract("StabilityPool", async (accounts) => { // Carol withdraws her Stability deposit assert.equal( (await stabilityPool.deposits(carol)).toString(), - dec(30000, 18) + dec(30000, 18), ); await stabilityPool.withdrawFromSP(dec(30000, 18), { from: carol }); assert.equal((await stabilityPool.deposits(carol)).toString(), "0"); @@ -2002,7 +1989,7 @@ contract("StabilityPool", async (accounts) => { // Carol withdraws her Stability deposit assert.equal( (await stabilityPool.deposits(carol)).toString(), - dec(30000, 18) + dec(30000, 18), ); await stabilityPool.withdrawFromSP(dec(30000, 18), { from: carol }); assert.equal((await stabilityPool.deposits(carol)).toString(), "0"); @@ -2102,7 +2089,7 @@ contract("StabilityPool", async (accounts) => { // Carol withdraws her Stability deposit assert.equal( (await stabilityPool.deposits(carol)).toString(), - dec(30000, 18) + dec(30000, 18), ); await stabilityPool.withdrawFromSP(dec(30000, 18), { from: carol }); assert.equal((await stabilityPool.deposits(carol)).toString(), "0"); @@ -2173,7 +2160,7 @@ contract("StabilityPool", async (accounts) => { await priceFeed.setPrice(dec(105, 18)); const price = await priceFeed.getPrice(); assert.isTrue( - await th.ICRbetween100and110(defaulter_1_TroveId, troveManager, price) + await th.ICRbetween100and110(defaulter_1_TroveId, troveManager, price), ); await time.increase(timeValues.MINUTES_IN_ONE_WEEK); @@ -2184,7 +2171,7 @@ contract("StabilityPool", async (accounts) => { // Check d2 is undercollateralized assert.isTrue( - await th.ICRbetween100and110(defaulter_2_TroveId, troveManager, price) + await th.ICRbetween100and110(defaulter_2_TroveId, troveManager, price), ); assert.isTrue(await sortedTroves.contains(defaulter_2_TroveId)); @@ -2398,10 +2385,10 @@ contract("StabilityPool", async (accounts) => { const bob_Bold_Balance_Before = await boldToken.balanceOf(bob); const alice_Deposit_Before = await stabilityPool.getCompoundedBoldDeposit( - alice + alice, ); const bob_Deposit_Before = await stabilityPool.getCompoundedBoldDeposit( - bob + bob, ); const BoldinSP_Before = await stabilityPool.getTotalBoldDeposits(); @@ -2498,13 +2485,13 @@ contract("StabilityPool", async (accounts) => { const bob_Bold_Balance_Before = await boldToken.balanceOf(bob); const bob_Deposit_Before = await stabilityPool.getCompoundedBoldDeposit( - bob + bob, ); const BoldinSP_Before = await stabilityPool.getTotalBoldDeposits(); const maxBytes32 = web3.utils.toBN( - "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff" + "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", ); // Price drops @@ -2523,8 +2510,7 @@ contract("StabilityPool", async (accounts) => { assert.equal(bob_Bold_Balance_After, bob_expectedBoldBalance); // Check Bold in Stability Pool has been reduced by only Bob's compounded deposit - const expectedBoldinSP = - BoldinSP_Before.sub(bob_Deposit_Before).toString(); + const expectedBoldinSP = BoldinSP_Before.sub(bob_Deposit_Before).toString(); const BoldinSP_After = ( await stabilityPool.getTotalBoldDeposits() ).toString(); @@ -2561,13 +2547,14 @@ contract("StabilityPool", async (accounts) => { extraParams: { from: carol }, }); - const defaulter_1_TroveId = await th.openTroveWrapper(contracts, + const defaulter_1_TroveId = await th.openTroveWrapper( + contracts, th._100pct, await getOpenTroveBoldAmount(dec(10000, 18)), defaulter_1, defaulter_1, 0, - { from: defaulter_1, value: dec(100, "ether") } + { from: defaulter_1, value: dec(100, "ether") }, ); // A, B, C provides 10000, 5000, 3000 Bold to SP @@ -2575,19 +2562,19 @@ contract("StabilityPool", async (accounts) => { await stabilityPool.provideToSP(dec(10000, 18), { from: alice, gasPrice: GAS_PRICE, - }) + }), ); const B_GAS_Used = th.gasUsed( await stabilityPool.provideToSP(dec(5000, 18), { from: bob, gasPrice: GAS_PRICE, - }) + }), ); const C_GAS_Used = th.gasUsed( await stabilityPool.provideToSP(dec(3000, 18), { from: carol, gasPrice: GAS_PRICE, - }) + }), ); // Price drops @@ -2605,31 +2592,31 @@ contract("StabilityPool", async (accounts) => { const carol_Bold_Balance_Before = await boldToken.balanceOf(carol); const alice_ETH_Balance_Before = web3.utils.toBN( - await contracts.WETH.balanceOf(alice) + await contracts.WETH.balanceOf(alice), ); const bob_ETH_Balance_Before = web3.utils.toBN( - await contracts.WETH.balanceOf(bob) + await contracts.WETH.balanceOf(bob), ); const carol_ETH_Balance_Before = web3.utils.toBN( - await contracts.WETH.balanceOf(carol) + await contracts.WETH.balanceOf(carol), ); const alice_Deposit_Before = await stabilityPool.getCompoundedBoldDeposit( - alice + alice, ); const bob_Deposit_Before = await stabilityPool.getCompoundedBoldDeposit( - bob + bob, ); const carol_Deposit_Before = await stabilityPool.getCompoundedBoldDeposit( - carol + carol, ); const alice_ETHGain_Before = await stabilityPool.getDepositorETHGain( - alice + alice, ); const bob_ETHGain_Before = await stabilityPool.getDepositorETHGain(bob); const carol_ETHGain_Before = await stabilityPool.getDepositorETHGain( - carol + carol, ); const BoldinSP_Before = await stabilityPool.getTotalBoldDeposits(); @@ -2644,19 +2631,19 @@ contract("StabilityPool", async (accounts) => { await stabilityPool.withdrawFromSP(dec(10000, 18), { from: alice, gasPrice: GAS_PRICE, - }) + }), ); const B_GAS_Deposit = th.gasUsed( await stabilityPool.withdrawFromSP(dec(5000, 18), { from: bob, gasPrice: GAS_PRICE, - }) + }), ); const C_GAS_Deposit = th.gasUsed( await stabilityPool.withdrawFromSP(dec(3000, 18), { from: carol, gasPrice: GAS_PRICE, - }) + }), ); // Check Bold balances of A, B, C have risen by the value of their compounded deposits, respectively @@ -2774,7 +2761,7 @@ contract("StabilityPool", async (accounts) => { }); await stabilityPool.provideToSP(dec(5000, 18), { from: bob }); - //price drops + // price drops await priceFeed.setPrice(dec(105, 18)); // Liquidate defaulter 1. Empties the Pool @@ -2874,7 +2861,7 @@ contract("StabilityPool", async (accounts) => { const S_Before = await stabilityPool.epochToScaleToSum( currentEpoch, - currentScale + currentScale, ); const P_Before = await stabilityPool.P(); @@ -2984,12 +2971,11 @@ contract("StabilityPool", async (accounts) => { await stabilityPool.withdrawFromSP(dec(10100, 18), { from: A }); // Confirm A's recorded deposit is 0 - const A_deposit = (await stabilityPool.deposits(A)); // get initialValue property on deposit struct + const A_deposit = await stabilityPool.deposits(A); // get initialValue property on deposit struct assert.equal(A_deposit, "0"); // --- TEST --- - const expectedRevertMessage = - "StabilityPool: User must have a non-zero deposit"; + const expectedRevertMessage = "StabilityPool: User must have a non-zero deposit"; // Further withdrawal attempt from A const withdrawalPromise_A = stabilityPool.withdrawFromSP(dec(10000, 18), { @@ -3101,12 +3087,11 @@ contract("StabilityPool", async (accounts) => { const liquidationTx_1 = await troveManager.liquidate(defaulter_1_TroveId, { from: owner, }); - const [liquidatedDebt, liquidatedColl, ,] = - th.getEmittedLiquidationValues(liquidationTx_1); + const [liquidatedDebt, liquidatedColl] = th.getEmittedLiquidationValues(liquidationTx_1); const ETHGain_A = await stabilityPool.getDepositorETHGain(alice); const compoundedDeposit_A = await stabilityPool.getCompoundedBoldDeposit( - alice + alice, ); // Alice should receive rewards proportional to her deposit as share of total deposits @@ -3117,25 +3102,25 @@ contract("StabilityPool", async (accounts) => { .mul(toBN(dec(15000, 18))) .div(toBN(dec(200000, 18))); const expectedCompoundedDeposit_A = toBN(dec(15000, 18)).sub( - expectedBoldLoss_A + expectedBoldLoss_A, ); assert.isAtMost( th.getDifference(expectedCompoundedDeposit_A, compoundedDeposit_A), - 100000 + 100000, ); // Alice sends her ETH Gains to her Trove await stabilityPool.withdrawETHGainToTrove(aliceTroveId, { from: alice }); // check Alice's BoldLoss has been applied to her deposit expectedCompoundedDeposit_A - const alice_deposit_afterDefault = (await stabilityPool.deposits(alice)); + const alice_deposit_afterDefault = await stabilityPool.deposits(alice); assert.isAtMost( th.getDifference( alice_deposit_afterDefault, - expectedCompoundedDeposit_A + expectedCompoundedDeposit_A, ), - 100000 + 100000, ); // check alice's Trove recorded ETH has increased by the expected reward amount @@ -3193,7 +3178,7 @@ contract("StabilityPool", async (accounts) => { // Alice attempts to her ETH Gains to her Trove await assertRevert( stabilityPool.withdrawETHGainToTrove(aliceTroveId, { from: alice }), - "BorrowerOps: An operation that would result in ICR < MCR is not permitted" + "BorrowerOps: An operation that would result in ICR < MCR is not permitted", ); }); @@ -3303,8 +3288,7 @@ contract("StabilityPool", async (accounts) => { // defaulter's Trove is closed. const liquidationTx = await troveManager.liquidate(defaulter_1_TroveId); - const [liquidatedDebt, liquidatedColl, gasComp] = - th.getEmittedLiquidationValues(liquidationTx); + const [liquidatedDebt, liquidatedColl, gasComp] = th.getEmittedLiquidationValues(liquidationTx); // Expect alice to be entitled to 15000/200000 of the liquidated coll const aliceExpectedETHGain = liquidatedColl @@ -3316,7 +3300,7 @@ contract("StabilityPool", async (accounts) => { // price bounces back await priceFeed.setPrice(dec(200, 18)); - //check activePool and StabilityPool Ether before retrieval: + // check activePool and StabilityPool Ether before retrieval: const active_ETH_Before = await activePool.getETHBalance(); const stability_ETH_Before = await stabilityPool.getETHBalance(); @@ -3327,17 +3311,16 @@ contract("StabilityPool", async (accounts) => { const stability_ETH_After = await stabilityPool.getETHBalance(); const active_ETH_Difference = active_ETH_After.sub(active_ETH_Before); // AP ETH should increase - const stability_ETH_Difference = - stability_ETH_Before.sub(stability_ETH_After); // SP ETH should decrease + const stability_ETH_Difference = stability_ETH_Before.sub(stability_ETH_After); // SP ETH should decrease // check Pool ETH values change by Alice's ETHGain, i.e 0.075 ETH assert.isAtMost( th.getDifference(active_ETH_Difference, aliceETHGain), - 10000 + 10000, ); assert.isAtMost( th.getDifference(stability_ETH_Difference, aliceETHGain), - 10000 + 10000, ); }); @@ -3431,13 +3414,12 @@ contract("StabilityPool", async (accounts) => { await priceFeed.setPrice(dec(105, 18)); const liquidationTx = await troveManager.liquidate(defaulter_1_TroveId); - const [, liquidatedColl, ,] = - th.getEmittedLiquidationValues(liquidationTx); + const [, liquidatedColl] = th.getEmittedLiquidationValues(liquidationTx); - /* All depositors attempt to withdraw their ETH gain to their Trove. Each depositor + /* All depositors attempt to withdraw their ETH gain to their Trove. Each depositor receives (liquidatedColl/ 6). - Thus, expected new collateral for each depositor with 1 Ether in their trove originally, is + Thus, expected new collateral for each depositor with 1 Ether in their trove originally, is (1 + liquidatedColl/6) */ @@ -3449,44 +3431,44 @@ contract("StabilityPool", async (accounts) => { const aliceCollAfter = (await troveManager.Troves(th.addressToTroveId(alice)))[1]; assert.isAtMost( th.getDifference(aliceCollAfter.sub(collBefore), expectedCollGain), - 10000 + 10000, ); await stabilityPool.withdrawETHGainToTrove(th.addressToTroveId(bob), { from: bob }); const bobCollAfter = (await troveManager.Troves(th.addressToTroveId(bob)))[1]; assert.isAtMost( th.getDifference(bobCollAfter.sub(collBefore), expectedCollGain), - 10000 + 10000, ); await stabilityPool.withdrawETHGainToTrove(th.addressToTroveId(carol), { from: carol }); const carolCollAfter = (await troveManager.Troves(th.addressToTroveId(carol)))[1]; assert.isAtMost( th.getDifference(carolCollAfter.sub(collBefore), expectedCollGain), - 10000 + 10000, ); - await stabilityPool.withdrawETHGainToTrove(th.addressToTroveId(dennis), { + await stabilityPool.withdrawETHGainToTrove(th.addressToTroveId(dennis), { from: dennis, }); const dennisCollAfter = (await troveManager.Troves(th.addressToTroveId(dennis)))[1]; assert.isAtMost( th.getDifference(dennisCollAfter.sub(collBefore), expectedCollGain), - 10000 + 10000, ); await stabilityPool.withdrawETHGainToTrove(th.addressToTroveId(erin), { from: erin }); const erinCollAfter = (await troveManager.Troves(th.addressToTroveId(erin)))[1]; assert.isAtMost( th.getDifference(erinCollAfter.sub(collBefore), expectedCollGain), - 10000 + 10000, ); await stabilityPool.withdrawETHGainToTrove(th.addressToTroveId(flyn), { from: flyn }); const flynCollAfter = (await troveManager.Troves(th.addressToTroveId(flyn)))[1]; assert.isAtMost( th.getDifference(flynCollAfter.sub(collBefore), expectedCollGain), - 10000 + 10000, ); }); @@ -3535,7 +3517,7 @@ contract("StabilityPool", async (accounts) => { // Check defaulter 1 has ICR: 100% < ICR < 110%. assert.isTrue( - await th.ICRbetween100and110(defaulter_1_TroveId, troveManager, price) + await th.ICRbetween100and110(defaulter_1_TroveId, troveManager, price), ); const alice_Collateral_Before = (await troveManager.Troves(aliceTroveId))[1]; @@ -3548,11 +3530,11 @@ contract("StabilityPool", async (accounts) => { assert.isFalse(await sortedTroves.contains(defaulter_1_TroveId)); const alice_ETHGain_Before = await stabilityPool.getDepositorETHGain( - alice + alice, ); const bob_ETHGain_Before = await stabilityPool.getDepositorETHGain(bob); const carol_ETHGain_Before = await stabilityPool.getDepositorETHGain( - carol + carol, ); // A, B, C withdraw their full ETH gain from the Stability Pool to their trove @@ -3622,10 +3604,10 @@ contract("StabilityPool", async (accounts) => { from: dennis, }); - //Price drops + // Price drops await priceFeed.setPrice(dec(105, 18)); - //Liquidate defaulter 1 + // Liquidate defaulter 1 await troveManager.liquidate(defaulter_1_TroveId); assert.isFalse(await sortedTroves.contains(defaulter_1_TroveId)); @@ -3634,7 +3616,7 @@ contract("StabilityPool", async (accounts) => { // D attempts to withdraw his ETH gain to Trove await th.assertRevert( stabilityPool.withdrawETHGainToTrove(th.addressToTroveId(dennis), { from: dennis }), - "caller must have an active trove to withdraw ETHGain to" + "caller must have an active trove to withdraw ETHGain to", ); }); diff --git a/contracts/test/StabilityPool_SPWithdrawalTest.js b/contracts/test/StabilityPool_SPWithdrawalTest.js index 1a3a719f..4413a389 100644 --- a/contracts/test/StabilityPool_SPWithdrawalTest.js +++ b/contracts/test/StabilityPool_SPWithdrawalTest.js @@ -1,11 +1,11 @@ -const testHelpers = require("../utils/testHelpers.js") +const testHelpers = require("../utils/testHelpers.js"); const { createDeployAndFundFixture } = require("../utils/testFixtures.js"); -const TroveManagerTester = artifacts.require("./TroveManagerTester.sol") +const TroveManagerTester = artifacts.require("./TroveManagerTester.sol"); -const { dec, toBN } = testHelpers.TestHelper -const th = testHelpers.TestHelper +const { dec, toBN } = testHelpers.TestHelper; +const th = testHelpers.TestHelper; -contract('StabilityPool - Withdrawal of stability deposit - Reward calculations', async accounts => { +contract("StabilityPool - Withdrawal of stability deposit - Reward calculations", async (accounts) => { const fundedAccounts = accounts.slice(0, 22); const [ @@ -31,37 +31,36 @@ contract('StabilityPool - Withdrawal of stability deposit - Reward calculations' C, D, E, - F + F, ] = fundedAccounts; - const [bountyAddress, lpRewardsAddress, multisig] = accounts.slice(997, 1000) + const [bountyAddress, lpRewardsAddress, multisig] = accounts.slice(997, 1000); - let contracts + let contracts; - let priceFeed - let boldToken - let troveManager - let stabilityPool + let priceFeed; + let boldToken; + let troveManager; + let stabilityPool; - const ZERO_ADDRESS = th.ZERO_ADDRESS + const ZERO_ADDRESS = th.ZERO_ADDRESS; - const getOpenTroveBoldAmount = async (totalDebt) => th.getOpenTroveBoldAmount(contracts, totalDebt) + const getOpenTroveBoldAmount = async (totalDebt) => th.getOpenTroveBoldAmount(contracts, totalDebt); const deployFixture = createDeployAndFundFixture({ accounts: fundedAccounts, - mocks: { TroveManager: TroveManagerTester } + mocks: { TroveManager: TroveManagerTester }, }); describe("Stability Pool Withdrawal", async () => { - beforeEach(async () => { - const result = await deployFixture() - contracts = result.contracts - priceFeed = contracts.priceFeedTestnet - boldToken = contracts.boldToken - troveManager = contracts.troveManager - stabilityPool = contracts.stabilityPool - }) + const result = await deployFixture(); + contracts = result.contracts; + priceFeed = contracts.priceFeedTestnet; + boldToken = contracts.boldToken; + troveManager = contracts.troveManager; + stabilityPool = contracts.stabilityPool; + }); // --- Compounding tests --- @@ -70,17 +69,28 @@ contract('StabilityPool - Withdrawal of stability deposit - Reward calculations' // --- Identical deposits, identical liquidation amounts--- it("withdrawFromSP(): Depositors with equal initial deposit withdraw correct compounded deposit and ETH Gain after one liquidation", async () => { // Whale opens Trove with 100k ETH - await th.openTroveWrapper(contracts, th._100pct, await getOpenTroveBoldAmount(dec(100000, 18)), whale, whale, 0,{ from: whale, value: dec(100000, 'ether') }) + await th.openTroveWrapper(contracts, th._100pct, await getOpenTroveBoldAmount(dec(100000, 18)), whale, whale, 0, { + from: whale, + value: dec(100000, "ether"), + }); // Whale transfers 10k Bold to A, B and C who then deposit it to the SP - const depositors = [alice, bob, carol] + const depositors = [alice, bob, carol]; for (const account of depositors) { - await boldToken.transfer(account, dec(10000, 18), { from: whale }) - await stabilityPool.provideToSP(dec(10000, 18), { from: account }) + await boldToken.transfer(account, dec(10000, 18), { from: whale }); + await stabilityPool.provideToSP(dec(10000, 18), { from: account }); } // Defaulter opens trove with 200% ICR and 10k Bold net debt - const defaulter_1_TroveId = await th.openTroveWrapper(contracts, th._100pct, await getOpenTroveBoldAmount(dec(10000, 18)), defaulter_1, defaulter_1, 0,{ from: defaulter_1, value: dec(100, 'ether') }) + const defaulter_1_TroveId = await th.openTroveWrapper( + contracts, + th._100pct, + await getOpenTroveBoldAmount(dec(10000, 18)), + defaulter_1, + defaulter_1, + 0, + { from: defaulter_1, value: dec(100, "ether") }, + ); // price drops by 50%: defaulter ICR falls to 100% await priceFeed.setPrice(dec(100, 18)); @@ -89,38 +99,57 @@ contract('StabilityPool - Withdrawal of stability deposit - Reward calculations' await troveManager.liquidate(defaulter_1_TroveId, { from: owner }); // Check depositors' compounded deposit is 6666.66 Bold and ETH Gain is 33.16 ETH - const txA = await stabilityPool.withdrawFromSP(dec(10000, 18), { from: alice }) - const txB = await stabilityPool.withdrawFromSP(dec(10000, 18), { from: bob }) - const txC = await stabilityPool.withdrawFromSP(dec(10000, 18), { from: carol }) + const txA = await stabilityPool.withdrawFromSP(dec(10000, 18), { from: alice }); + const txB = await stabilityPool.withdrawFromSP(dec(10000, 18), { from: bob }); + const txC = await stabilityPool.withdrawFromSP(dec(10000, 18), { from: carol }); // Grab the ETH gain from the emitted event in the tx log - const alice_ETHWithdrawn = th.getEventArgByName(txA, 'ETHGainWithdrawn', '_ETH').toString() - const bob_ETHWithdrawn = th.getEventArgByName(txB, 'ETHGainWithdrawn', '_ETH').toString() - const carol_ETHWithdrawn = th.getEventArgByName(txC, 'ETHGainWithdrawn', '_ETH').toString() + const alice_ETHWithdrawn = th.getEventArgByName(txA, "ETHGainWithdrawn", "_ETH").toString(); + const bob_ETHWithdrawn = th.getEventArgByName(txB, "ETHGainWithdrawn", "_ETH").toString(); + const carol_ETHWithdrawn = th.getEventArgByName(txC, "ETHGainWithdrawn", "_ETH").toString(); - assert.isAtMost(th.getDifference((await boldToken.balanceOf(alice)).toString(), '6666666666666666666666'), 10000) - assert.isAtMost(th.getDifference((await boldToken.balanceOf(bob)).toString(), '6666666666666666666666'), 10000) - assert.isAtMost(th.getDifference((await boldToken.balanceOf(carol)).toString(), '6666666666666666666666'), 10000) + assert.isAtMost(th.getDifference((await boldToken.balanceOf(alice)).toString(), "6666666666666666666666"), 10000); + assert.isAtMost(th.getDifference((await boldToken.balanceOf(bob)).toString(), "6666666666666666666666"), 10000); + assert.isAtMost(th.getDifference((await boldToken.balanceOf(carol)).toString(), "6666666666666666666666"), 10000); - assert.isAtMost(th.getDifference(alice_ETHWithdrawn, '33166666666666666667'), 10000) - assert.isAtMost(th.getDifference(bob_ETHWithdrawn, '33166666666666666667'), 10000) - assert.isAtMost(th.getDifference(carol_ETHWithdrawn, '33166666666666666667'), 10000) - }) + assert.isAtMost(th.getDifference(alice_ETHWithdrawn, "33166666666666666667"), 10000); + assert.isAtMost(th.getDifference(bob_ETHWithdrawn, "33166666666666666667"), 10000); + assert.isAtMost(th.getDifference(carol_ETHWithdrawn, "33166666666666666667"), 10000); + }); it("withdrawFromSP(): Depositors with equal initial deposit withdraw correct compounded deposit and ETH Gain after two identical liquidations", async () => { // Whale opens Trove with 100k ETH - await th.openTroveWrapper(contracts, th._100pct, await getOpenTroveBoldAmount(dec(100000, 18)), whale, whale, 0,{ from: whale, value: dec(100000, 'ether') }) + await th.openTroveWrapper(contracts, th._100pct, await getOpenTroveBoldAmount(dec(100000, 18)), whale, whale, 0, { + from: whale, + value: dec(100000, "ether"), + }); // Whale transfers 10k Bold to A, B and C who then deposit it to the SP - const depositors = [alice, bob, carol] + const depositors = [alice, bob, carol]; for (const account of depositors) { - await boldToken.transfer(account, dec(10000, 18), { from: whale }) - await stabilityPool.provideToSP(dec(10000, 18), { from: account }) + await boldToken.transfer(account, dec(10000, 18), { from: whale }); + await stabilityPool.provideToSP(dec(10000, 18), { from: account }); } // Defaulters open trove with 200% ICR - const defaulter_1_TroveId = await th.openTroveWrapper(contracts, th._100pct, await getOpenTroveBoldAmount(dec(10000, 18)), defaulter_1, defaulter_1, 0,{ from: defaulter_1, value: dec(100, 'ether') }) - const defaulter_2_TroveId = await th.openTroveWrapper(contracts, th._100pct, await getOpenTroveBoldAmount(dec(10000, 18)), defaulter_2, defaulter_2, 0, { from: defaulter_2, value: dec(100, 'ether') }) + const defaulter_1_TroveId = await th.openTroveWrapper( + contracts, + th._100pct, + await getOpenTroveBoldAmount(dec(10000, 18)), + defaulter_1, + defaulter_1, + 0, + { from: defaulter_1, value: dec(100, "ether") }, + ); + const defaulter_2_TroveId = await th.openTroveWrapper( + contracts, + th._100pct, + await getOpenTroveBoldAmount(dec(10000, 18)), + defaulter_2, + defaulter_2, + 0, + { from: defaulter_2, value: dec(100, "ether") }, + ); // price drops by 50%: defaulter ICR falls to 100% await priceFeed.setPrice(dec(100, 18)); @@ -130,38 +159,65 @@ contract('StabilityPool - Withdrawal of stability deposit - Reward calculations' await troveManager.liquidate(defaulter_2_TroveId, { from: owner }); // Check depositors' compounded deposit is 3333.33 Bold and ETH Gain is 66.33 ETH - const txA = await stabilityPool.withdrawFromSP(dec(10000, 18), { from: alice }) - const txB = await stabilityPool.withdrawFromSP(dec(10000, 18), { from: bob }) - const txC = await stabilityPool.withdrawFromSP(dec(10000, 18), { from: carol }) + const txA = await stabilityPool.withdrawFromSP(dec(10000, 18), { from: alice }); + const txB = await stabilityPool.withdrawFromSP(dec(10000, 18), { from: bob }); + const txC = await stabilityPool.withdrawFromSP(dec(10000, 18), { from: carol }); // Grab the ETH gain from the emitted event in the tx log - const alice_ETHWithdrawn = th.getEventArgByName(txA, 'ETHGainWithdrawn', '_ETH').toString() - const bob_ETHWithdrawn = th.getEventArgByName(txB, 'ETHGainWithdrawn', '_ETH').toString() - const carol_ETHWithdrawn = th.getEventArgByName(txC, 'ETHGainWithdrawn', '_ETH').toString() + const alice_ETHWithdrawn = th.getEventArgByName(txA, "ETHGainWithdrawn", "_ETH").toString(); + const bob_ETHWithdrawn = th.getEventArgByName(txB, "ETHGainWithdrawn", "_ETH").toString(); + const carol_ETHWithdrawn = th.getEventArgByName(txC, "ETHGainWithdrawn", "_ETH").toString(); - assert.isAtMost(th.getDifference((await boldToken.balanceOf(alice)).toString(), '3333333333333333333333'), 10000) - assert.isAtMost(th.getDifference((await boldToken.balanceOf(bob)).toString(), '3333333333333333333333'), 10000) - assert.isAtMost(th.getDifference((await boldToken.balanceOf(carol)).toString(), '3333333333333333333333'), 10000) + assert.isAtMost(th.getDifference((await boldToken.balanceOf(alice)).toString(), "3333333333333333333333"), 10000); + assert.isAtMost(th.getDifference((await boldToken.balanceOf(bob)).toString(), "3333333333333333333333"), 10000); + assert.isAtMost(th.getDifference((await boldToken.balanceOf(carol)).toString(), "3333333333333333333333"), 10000); - assert.isAtMost(th.getDifference(alice_ETHWithdrawn, '66333333333333333333'), 10000) - assert.isAtMost(th.getDifference(bob_ETHWithdrawn, '66333333333333333333'), 10000) - assert.isAtMost(th.getDifference(carol_ETHWithdrawn, '66333333333333333333'), 10000) - }) + assert.isAtMost(th.getDifference(alice_ETHWithdrawn, "66333333333333333333"), 10000); + assert.isAtMost(th.getDifference(bob_ETHWithdrawn, "66333333333333333333"), 10000); + assert.isAtMost(th.getDifference(carol_ETHWithdrawn, "66333333333333333333"), 10000); + }); it("withdrawFromSP(): Depositors with equal initial deposit withdraw correct compounded deposit and ETH Gain after three identical liquidations", async () => { // Whale opens Trove with 100k ETH - await th.openTroveWrapper(contracts, th._100pct, await getOpenTroveBoldAmount(dec(100000, 18)), whale, whale, 0,{ from: whale, value: dec(100000, 'ether') }) + await th.openTroveWrapper(contracts, th._100pct, await getOpenTroveBoldAmount(dec(100000, 18)), whale, whale, 0, { + from: whale, + value: dec(100000, "ether"), + }); // Whale transfers 10k Bold to A, B and C who then deposit it to the SP - const depositors = [alice, bob, carol] + const depositors = [alice, bob, carol]; for (account of depositors) { - await boldToken.transfer(account, dec(10000, 18), { from: whale }) - await stabilityPool.provideToSP(dec(10000, 18), { from: account }) + await boldToken.transfer(account, dec(10000, 18), { from: whale }); + await stabilityPool.provideToSP(dec(10000, 18), { from: account }); } // Defaulters open trove with 200% ICR - const defaulter_1_TroveId = await th.openTroveWrapper(contracts, th._100pct, await getOpenTroveBoldAmount(dec(10000, 18)), defaulter_1, defaulter_1, 0,{ from: defaulter_1, value: dec(100, 'ether') }) - const defaulter_2_TroveId = await th.openTroveWrapper(contracts, th._100pct, await getOpenTroveBoldAmount(dec(10000, 18)), defaulter_2, defaulter_2, 0, { from: defaulter_2, value: dec(100, 'ether') }) - const defaulter_3_TroveId = await th.openTroveWrapper(contracts, th._100pct, await getOpenTroveBoldAmount(dec(10000, 18)), defaulter_3, defaulter_3, 0, { from: defaulter_3, value: dec(100, 'ether') }) + const defaulter_1_TroveId = await th.openTroveWrapper( + contracts, + th._100pct, + await getOpenTroveBoldAmount(dec(10000, 18)), + defaulter_1, + defaulter_1, + 0, + { from: defaulter_1, value: dec(100, "ether") }, + ); + const defaulter_2_TroveId = await th.openTroveWrapper( + contracts, + th._100pct, + await getOpenTroveBoldAmount(dec(10000, 18)), + defaulter_2, + defaulter_2, + 0, + { from: defaulter_2, value: dec(100, "ether") }, + ); + const defaulter_3_TroveId = await th.openTroveWrapper( + contracts, + th._100pct, + await getOpenTroveBoldAmount(dec(10000, 18)), + defaulter_3, + defaulter_3, + 0, + { from: defaulter_3, value: dec(100, "ether") }, + ); // price drops by 50%: defaulter ICR falls to 100% await priceFeed.setPrice(dec(100, 18)); @@ -171,40 +227,59 @@ contract('StabilityPool - Withdrawal of stability deposit - Reward calculations' await troveManager.liquidate(defaulter_2_TroveId, { from: owner }); await troveManager.liquidate(defaulter_3_TroveId, { from: owner }); - // Check depositors' compounded deposit is 0 Bold and ETH Gain is 99.5 ETH - const txA = await stabilityPool.withdrawFromSP(dec(10000, 18), { from: alice }) - const txB = await stabilityPool.withdrawFromSP(dec(10000, 18), { from: bob }) - const txC = await stabilityPool.withdrawFromSP(dec(10000, 18), { from: carol }) + // Check depositors' compounded deposit is 0 Bold and ETH Gain is 99.5 ETH + const txA = await stabilityPool.withdrawFromSP(dec(10000, 18), { from: alice }); + const txB = await stabilityPool.withdrawFromSP(dec(10000, 18), { from: bob }); + const txC = await stabilityPool.withdrawFromSP(dec(10000, 18), { from: carol }); // Grab the ETH gain from the emitted event in the tx log - const alice_ETHWithdrawn = th.getEventArgByName(txA, 'ETHGainWithdrawn', '_ETH').toString() - const bob_ETHWithdrawn = th.getEventArgByName(txB, 'ETHGainWithdrawn', '_ETH').toString() - const carol_ETHWithdrawn = th.getEventArgByName(txC, 'ETHGainWithdrawn', '_ETH').toString() + const alice_ETHWithdrawn = th.getEventArgByName(txA, "ETHGainWithdrawn", "_ETH").toString(); + const bob_ETHWithdrawn = th.getEventArgByName(txB, "ETHGainWithdrawn", "_ETH").toString(); + const carol_ETHWithdrawn = th.getEventArgByName(txC, "ETHGainWithdrawn", "_ETH").toString(); - assert.isAtMost(th.getDifference((await boldToken.balanceOf(alice)).toString(), '0'), 10000) - assert.isAtMost(th.getDifference((await boldToken.balanceOf(bob)).toString(), '0'), 10000) - assert.isAtMost(th.getDifference((await boldToken.balanceOf(carol)).toString(), '0'), 10000) + assert.isAtMost(th.getDifference((await boldToken.balanceOf(alice)).toString(), "0"), 10000); + assert.isAtMost(th.getDifference((await boldToken.balanceOf(bob)).toString(), "0"), 10000); + assert.isAtMost(th.getDifference((await boldToken.balanceOf(carol)).toString(), "0"), 10000); - assert.isAtMost(th.getDifference(alice_ETHWithdrawn, dec(99500, 15)), 10000) - assert.isAtMost(th.getDifference(bob_ETHWithdrawn, dec(99500, 15)), 10000) - assert.isAtMost(th.getDifference(carol_ETHWithdrawn, dec(99500, 15)), 10000) - }) + assert.isAtMost(th.getDifference(alice_ETHWithdrawn, dec(99500, 15)), 10000); + assert.isAtMost(th.getDifference(bob_ETHWithdrawn, dec(99500, 15)), 10000); + assert.isAtMost(th.getDifference(carol_ETHWithdrawn, dec(99500, 15)), 10000); + }); // --- Identical deposits, increasing liquidation amounts --- it("withdrawFromSP(): Depositors with equal initial deposit withdraw correct compounded deposit and ETH Gain after two liquidations of increasing Bold", async () => { // Whale opens Trove with 100k ETH - await th.openTroveWrapper(contracts, th._100pct, await getOpenTroveBoldAmount(dec(100000, 18)), whale, whale, 0,{ from: whale, value: dec(100000, 'ether') }) + await th.openTroveWrapper(contracts, th._100pct, await getOpenTroveBoldAmount(dec(100000, 18)), whale, whale, 0, { + from: whale, + value: dec(100000, "ether"), + }); // Whale transfers 10k Bold to A, B and C who then deposit it to the SP - const depositors = [alice, bob, carol] + const depositors = [alice, bob, carol]; for (account of depositors) { - await boldToken.transfer(account, dec(10000, 18), { from: whale }) - await stabilityPool.provideToSP(dec(10000, 18), { from: account }) + await boldToken.transfer(account, dec(10000, 18), { from: whale }); + await stabilityPool.provideToSP(dec(10000, 18), { from: account }); } // Defaulters open trove with 200% ICR - const defaulter_1_TroveId = await th.openTroveWrapper(contracts, th._100pct, await getOpenTroveBoldAmount(dec(5000, 18)), defaulter_1, defaulter_1, 0,{ from: defaulter_1, value: '50000000000000000000' }) - const defaulter_2_TroveId = await th.openTroveWrapper(contracts, th._100pct, await getOpenTroveBoldAmount(dec(7000, 18)), defaulter_2, defaulter_2, 0, { from: defaulter_2, value: '70000000000000000000' }) + const defaulter_1_TroveId = await th.openTroveWrapper( + contracts, + th._100pct, + await getOpenTroveBoldAmount(dec(5000, 18)), + defaulter_1, + defaulter_1, + 0, + { from: defaulter_1, value: "50000000000000000000" }, + ); + const defaulter_2_TroveId = await th.openTroveWrapper( + contracts, + th._100pct, + await getOpenTroveBoldAmount(dec(7000, 18)), + defaulter_2, + defaulter_2, + 0, + { from: defaulter_2, value: "70000000000000000000" }, + ); // price drops by 50%: defaulter ICR falls to 100% await priceFeed.setPrice(dec(100, 18)); @@ -214,40 +289,67 @@ contract('StabilityPool - Withdrawal of stability deposit - Reward calculations' await troveManager.liquidate(defaulter_2_TroveId, { from: owner }); // Check depositors' compounded deposit - const txA = await stabilityPool.withdrawFromSP(dec(10000, 18), { from: alice }) - const txB = await stabilityPool.withdrawFromSP(dec(10000, 18), { from: bob }) - const txC = await stabilityPool.withdrawFromSP(dec(10000, 18), { from: carol }) + const txA = await stabilityPool.withdrawFromSP(dec(10000, 18), { from: alice }); + const txB = await stabilityPool.withdrawFromSP(dec(10000, 18), { from: bob }); + const txC = await stabilityPool.withdrawFromSP(dec(10000, 18), { from: carol }); // Grab the ETH gain from the emitted event in the tx log - const alice_ETHWithdrawn = th.getEventArgByName(txA, 'ETHGainWithdrawn', '_ETH').toString() - const bob_ETHWithdrawn = th.getEventArgByName(txB, 'ETHGainWithdrawn', '_ETH').toString() - const carol_ETHWithdrawn = th.getEventArgByName(txC, 'ETHGainWithdrawn', '_ETH').toString() + const alice_ETHWithdrawn = th.getEventArgByName(txA, "ETHGainWithdrawn", "_ETH").toString(); + const bob_ETHWithdrawn = th.getEventArgByName(txB, "ETHGainWithdrawn", "_ETH").toString(); + const carol_ETHWithdrawn = th.getEventArgByName(txC, "ETHGainWithdrawn", "_ETH").toString(); - assert.isAtMost(th.getDifference((await boldToken.balanceOf(alice)).toString(), '6000000000000000000000'), 10000) - assert.isAtMost(th.getDifference((await boldToken.balanceOf(bob)).toString(), '6000000000000000000000'), 10000) - assert.isAtMost(th.getDifference((await boldToken.balanceOf(carol)).toString(), '6000000000000000000000'), 10000) + assert.isAtMost(th.getDifference((await boldToken.balanceOf(alice)).toString(), "6000000000000000000000"), 10000); + assert.isAtMost(th.getDifference((await boldToken.balanceOf(bob)).toString(), "6000000000000000000000"), 10000); + assert.isAtMost(th.getDifference((await boldToken.balanceOf(carol)).toString(), "6000000000000000000000"), 10000); // (0.5 + 0.7) * 99.5 / 3 - assert.isAtMost(th.getDifference(alice_ETHWithdrawn, dec(398, 17)), 10000) - assert.isAtMost(th.getDifference(bob_ETHWithdrawn, dec(398, 17)), 10000) - assert.isAtMost(th.getDifference(carol_ETHWithdrawn, dec(398, 17)), 10000) - }) + assert.isAtMost(th.getDifference(alice_ETHWithdrawn, dec(398, 17)), 10000); + assert.isAtMost(th.getDifference(bob_ETHWithdrawn, dec(398, 17)), 10000); + assert.isAtMost(th.getDifference(carol_ETHWithdrawn, dec(398, 17)), 10000); + }); it("withdrawFromSP(): Depositors with equal initial deposit withdraw correct compounded deposit and ETH Gain after three liquidations of increasing Bold", async () => { // Whale opens Trove with 100k ETH - await th.openTroveWrapper(contracts, th._100pct, await getOpenTroveBoldAmount(dec(100000, 18)), whale, whale, 0, { from: whale, value: dec(100000, 'ether') }) + await th.openTroveWrapper(contracts, th._100pct, await getOpenTroveBoldAmount(dec(100000, 18)), whale, whale, 0, { + from: whale, + value: dec(100000, "ether"), + }); // Whale transfers 10k Bold to A, B and C who then deposit it to the SP - const depositors = [alice, bob, carol] + const depositors = [alice, bob, carol]; for (account of depositors) { - await boldToken.transfer(account, dec(10000, 18), { from: whale }) - await stabilityPool.provideToSP(dec(10000, 18), { from: account }) + await boldToken.transfer(account, dec(10000, 18), { from: whale }); + await stabilityPool.provideToSP(dec(10000, 18), { from: account }); } // Defaulters open trove with 200% ICR - const defaulter_1_TroveId = await th.openTroveWrapper(contracts, th._100pct, await getOpenTroveBoldAmount(dec(5000, 18)), defaulter_1, defaulter_1, 0,{ from: defaulter_1, value: '50000000000000000000' }) - const defaulter_2_TroveId = await th.openTroveWrapper(contracts, th._100pct, await getOpenTroveBoldAmount(dec(6000, 18)), defaulter_2, defaulter_2, 0, { from: defaulter_2, value: '60000000000000000000' }) - const defaulter_3_TroveId = await th.openTroveWrapper(contracts, th._100pct, await getOpenTroveBoldAmount(dec(7000, 18)), defaulter_3, defaulter_3, 0, { from: defaulter_3, value: '70000000000000000000' }) + const defaulter_1_TroveId = await th.openTroveWrapper( + contracts, + th._100pct, + await getOpenTroveBoldAmount(dec(5000, 18)), + defaulter_1, + defaulter_1, + 0, + { from: defaulter_1, value: "50000000000000000000" }, + ); + const defaulter_2_TroveId = await th.openTroveWrapper( + contracts, + th._100pct, + await getOpenTroveBoldAmount(dec(6000, 18)), + defaulter_2, + defaulter_2, + 0, + { from: defaulter_2, value: "60000000000000000000" }, + ); + const defaulter_3_TroveId = await th.openTroveWrapper( + contracts, + th._100pct, + await getOpenTroveBoldAmount(dec(7000, 18)), + defaulter_3, + defaulter_3, + 0, + { from: defaulter_3, value: "70000000000000000000" }, + ); // price drops by 50%: defaulter ICR falls to 100% await priceFeed.setPrice(dec(100, 18)); @@ -258,41 +360,60 @@ contract('StabilityPool - Withdrawal of stability deposit - Reward calculations' await troveManager.liquidate(defaulter_3_TroveId, { from: owner }); // Check depositors' compounded deposit - const txA = await stabilityPool.withdrawFromSP(dec(10000, 18), { from: alice }) - const txB = await stabilityPool.withdrawFromSP(dec(10000, 18), { from: bob }) - const txC = await stabilityPool.withdrawFromSP(dec(10000, 18), { from: carol }) + const txA = await stabilityPool.withdrawFromSP(dec(10000, 18), { from: alice }); + const txB = await stabilityPool.withdrawFromSP(dec(10000, 18), { from: bob }); + const txC = await stabilityPool.withdrawFromSP(dec(10000, 18), { from: carol }); // Grab the ETH gain from the emitted event in the tx log - const alice_ETHWithdrawn = th.getEventArgByName(txA, 'ETHGainWithdrawn', '_ETH').toString() - const bob_ETHWithdrawn = th.getEventArgByName(txB, 'ETHGainWithdrawn', '_ETH').toString() - const carol_ETHWithdrawn = th.getEventArgByName(txC, 'ETHGainWithdrawn', '_ETH').toString() + const alice_ETHWithdrawn = th.getEventArgByName(txA, "ETHGainWithdrawn", "_ETH").toString(); + const bob_ETHWithdrawn = th.getEventArgByName(txB, "ETHGainWithdrawn", "_ETH").toString(); + const carol_ETHWithdrawn = th.getEventArgByName(txC, "ETHGainWithdrawn", "_ETH").toString(); - assert.isAtMost(th.getDifference((await boldToken.balanceOf(alice)).toString(), '4000000000000000000000'), 10000) - assert.isAtMost(th.getDifference((await boldToken.balanceOf(bob)).toString(), '4000000000000000000000'), 10000) - assert.isAtMost(th.getDifference((await boldToken.balanceOf(carol)).toString(), '4000000000000000000000'), 10000) + assert.isAtMost(th.getDifference((await boldToken.balanceOf(alice)).toString(), "4000000000000000000000"), 10000); + assert.isAtMost(th.getDifference((await boldToken.balanceOf(bob)).toString(), "4000000000000000000000"), 10000); + assert.isAtMost(th.getDifference((await boldToken.balanceOf(carol)).toString(), "4000000000000000000000"), 10000); // (0.5 + 0.6 + 0.7) * 99.5 / 3 - assert.isAtMost(th.getDifference(alice_ETHWithdrawn, dec(597, 17)), 10000) - assert.isAtMost(th.getDifference(bob_ETHWithdrawn, dec(597, 17)), 10000) - assert.isAtMost(th.getDifference(carol_ETHWithdrawn, dec(597, 17)), 10000) - }) + assert.isAtMost(th.getDifference(alice_ETHWithdrawn, dec(597, 17)), 10000); + assert.isAtMost(th.getDifference(bob_ETHWithdrawn, dec(597, 17)), 10000); + assert.isAtMost(th.getDifference(carol_ETHWithdrawn, dec(597, 17)), 10000); + }); // --- Increasing deposits, identical liquidation amounts --- it("withdrawFromSP(): Depositors with varying deposits withdraw correct compounded deposit and ETH Gain after two identical liquidations", async () => { // Whale opens Trove with 100k ETH - await th.openTroveWrapper(contracts, th._100pct, await getOpenTroveBoldAmount(dec(100000, 18)), whale, whale, 0,{ from: whale, value: dec(100000, 'ether') }) + await th.openTroveWrapper(contracts, th._100pct, await getOpenTroveBoldAmount(dec(100000, 18)), whale, whale, 0, { + from: whale, + value: dec(100000, "ether"), + }); // Whale transfers 10k, 20k, 30k Bold to A, B and C respectively who then deposit it to the SP - await boldToken.transfer(alice, dec(10000, 18), { from: whale }) - await stabilityPool.provideToSP(dec(10000, 18), { from: alice }) - await boldToken.transfer(bob, dec(20000, 18), { from: whale }) - await stabilityPool.provideToSP(dec(20000, 18), { from: bob }) - await boldToken.transfer(carol, dec(30000, 18), { from: whale }) - await stabilityPool.provideToSP(dec(30000, 18), { from: carol }) + await boldToken.transfer(alice, dec(10000, 18), { from: whale }); + await stabilityPool.provideToSP(dec(10000, 18), { from: alice }); + await boldToken.transfer(bob, dec(20000, 18), { from: whale }); + await stabilityPool.provideToSP(dec(20000, 18), { from: bob }); + await boldToken.transfer(carol, dec(30000, 18), { from: whale }); + await stabilityPool.provideToSP(dec(30000, 18), { from: carol }); // 2 Defaulters open trove with 200% ICR - const defaulter_1_TroveId = await th.openTroveWrapper(contracts, th._100pct, await getOpenTroveBoldAmount(dec(10000, 18)), defaulter_1, defaulter_1, 0,{ from: defaulter_1, value: dec(100, 'ether') }) - const defaulter_2_TroveId = await th.openTroveWrapper(contracts, th._100pct, await getOpenTroveBoldAmount(dec(10000, 18)), defaulter_2, defaulter_2, 0, { from: defaulter_2, value: dec(100, 'ether') }) + const defaulter_1_TroveId = await th.openTroveWrapper( + contracts, + th._100pct, + await getOpenTroveBoldAmount(dec(10000, 18)), + defaulter_1, + defaulter_1, + 0, + { from: defaulter_1, value: dec(100, "ether") }, + ); + const defaulter_2_TroveId = await th.openTroveWrapper( + contracts, + th._100pct, + await getOpenTroveBoldAmount(dec(10000, 18)), + defaulter_2, + defaulter_2, + 0, + { from: defaulter_2, value: dec(100, "ether") }, + ); // price drops by 50%: defaulter ICR falls to 100% await priceFeed.setPrice(dec(100, 18)); @@ -302,40 +423,73 @@ contract('StabilityPool - Withdrawal of stability deposit - Reward calculations' await troveManager.liquidate(defaulter_2_TroveId, { from: owner }); // Depositors attempt to withdraw everything - const txA = await stabilityPool.withdrawFromSP(dec(10000, 18), { from: alice }) - const txB = await stabilityPool.withdrawFromSP(dec(20000, 18), { from: bob }) - const txC = await stabilityPool.withdrawFromSP(dec(30000, 18), { from: carol }) + const txA = await stabilityPool.withdrawFromSP(dec(10000, 18), { from: alice }); + const txB = await stabilityPool.withdrawFromSP(dec(20000, 18), { from: bob }); + const txC = await stabilityPool.withdrawFromSP(dec(30000, 18), { from: carol }); // Grab the ETH gain from the emitted event in the tx log - const alice_ETHWithdrawn = th.getEventArgByName(txA, 'ETHGainWithdrawn', '_ETH').toString() - const bob_ETHWithdrawn = th.getEventArgByName(txB, 'ETHGainWithdrawn', '_ETH').toString() - const carol_ETHWithdrawn = th.getEventArgByName(txC, 'ETHGainWithdrawn', '_ETH').toString() - - assert.isAtMost(th.getDifference((await boldToken.balanceOf(alice)).toString(), '6666666666666666666666'), 100000) - assert.isAtMost(th.getDifference((await boldToken.balanceOf(bob)).toString(), '13333333333333333333333'), 100000) - assert.isAtMost(th.getDifference((await boldToken.balanceOf(carol)).toString(), '20000000000000000000000'), 100000) - - assert.isAtMost(th.getDifference(alice_ETHWithdrawn, '33166666666666666667'), 100000) - assert.isAtMost(th.getDifference(bob_ETHWithdrawn, '66333333333333333333'), 100000) - assert.isAtMost(th.getDifference(carol_ETHWithdrawn, dec(995, 17)), 100000) - }) + const alice_ETHWithdrawn = th.getEventArgByName(txA, "ETHGainWithdrawn", "_ETH").toString(); + const bob_ETHWithdrawn = th.getEventArgByName(txB, "ETHGainWithdrawn", "_ETH").toString(); + const carol_ETHWithdrawn = th.getEventArgByName(txC, "ETHGainWithdrawn", "_ETH").toString(); + + assert.isAtMost( + th.getDifference((await boldToken.balanceOf(alice)).toString(), "6666666666666666666666"), + 100000, + ); + assert.isAtMost(th.getDifference((await boldToken.balanceOf(bob)).toString(), "13333333333333333333333"), 100000); + assert.isAtMost( + th.getDifference((await boldToken.balanceOf(carol)).toString(), "20000000000000000000000"), + 100000, + ); + + assert.isAtMost(th.getDifference(alice_ETHWithdrawn, "33166666666666666667"), 100000); + assert.isAtMost(th.getDifference(bob_ETHWithdrawn, "66333333333333333333"), 100000); + assert.isAtMost(th.getDifference(carol_ETHWithdrawn, dec(995, 17)), 100000); + }); it("withdrawFromSP(): Depositors with varying deposits withdraw correct compounded deposit and ETH Gain after three identical liquidations", async () => { // Whale opens Trove with 100k ETH - await th.openTroveWrapper(contracts, th._100pct, await getOpenTroveBoldAmount(dec(100000, 18)), whale, whale, 0,{ from: whale, value: dec(100000, 'ether') }) + await th.openTroveWrapper(contracts, th._100pct, await getOpenTroveBoldAmount(dec(100000, 18)), whale, whale, 0, { + from: whale, + value: dec(100000, "ether"), + }); // Whale transfers 10k, 20k, 30k Bold to A, B and C respectively who then deposit it to the SP - await boldToken.transfer(alice, dec(10000, 18), { from: whale }) - await stabilityPool.provideToSP(dec(10000, 18), { from: alice }) - await boldToken.transfer(bob, dec(20000, 18), { from: whale }) - await stabilityPool.provideToSP(dec(20000, 18), { from: bob }) - await boldToken.transfer(carol, dec(30000, 18), { from: whale }) - await stabilityPool.provideToSP(dec(30000, 18), { from: carol }) + await boldToken.transfer(alice, dec(10000, 18), { from: whale }); + await stabilityPool.provideToSP(dec(10000, 18), { from: alice }); + await boldToken.transfer(bob, dec(20000, 18), { from: whale }); + await stabilityPool.provideToSP(dec(20000, 18), { from: bob }); + await boldToken.transfer(carol, dec(30000, 18), { from: whale }); + await stabilityPool.provideToSP(dec(30000, 18), { from: carol }); // Defaulters open trove with 200% ICR - const defaulter_1_TroveId = await th.openTroveWrapper(contracts, th._100pct, await getOpenTroveBoldAmount(dec(10000, 18)), defaulter_1, defaulter_1, 0,{ from: defaulter_1, value: dec(100, 'ether') }) - const defaulter_2_TroveId = await th.openTroveWrapper(contracts, th._100pct, await getOpenTroveBoldAmount(dec(10000, 18)), defaulter_2, defaulter_2, 0, { from: defaulter_2, value: dec(100, 'ether') }) - const defaulter_3_TroveId = await th.openTroveWrapper(contracts, th._100pct, await getOpenTroveBoldAmount(dec(10000, 18)), defaulter_3, defaulter_3, 0, { from: defaulter_3, value: dec(100, 'ether') }) + const defaulter_1_TroveId = await th.openTroveWrapper( + contracts, + th._100pct, + await getOpenTroveBoldAmount(dec(10000, 18)), + defaulter_1, + defaulter_1, + 0, + { from: defaulter_1, value: dec(100, "ether") }, + ); + const defaulter_2_TroveId = await th.openTroveWrapper( + contracts, + th._100pct, + await getOpenTroveBoldAmount(dec(10000, 18)), + defaulter_2, + defaulter_2, + 0, + { from: defaulter_2, value: dec(100, "ether") }, + ); + const defaulter_3_TroveId = await th.openTroveWrapper( + contracts, + th._100pct, + await getOpenTroveBoldAmount(dec(10000, 18)), + defaulter_3, + defaulter_3, + 0, + { from: defaulter_3, value: dec(100, "ether") }, + ); // price drops by 50%: defaulter ICR falls to 100% await priceFeed.setPrice(dec(100, 18)); @@ -346,50 +500,88 @@ contract('StabilityPool - Withdrawal of stability deposit - Reward calculations' await troveManager.liquidate(defaulter_3_TroveId, { from: owner }); // Depositors attempt to withdraw everything - const txA = await stabilityPool.withdrawFromSP(dec(10000, 18), { from: alice }) - const txB = await stabilityPool.withdrawFromSP(dec(20000, 18), { from: bob }) - const txC = await stabilityPool.withdrawFromSP(dec(30000, 18), { from: carol }) + const txA = await stabilityPool.withdrawFromSP(dec(10000, 18), { from: alice }); + const txB = await stabilityPool.withdrawFromSP(dec(20000, 18), { from: bob }); + const txC = await stabilityPool.withdrawFromSP(dec(30000, 18), { from: carol }); // Grab the ETH gain from the emitted event in the tx log - const alice_ETHWithdrawn = th.getEventArgByName(txA, 'ETHGainWithdrawn', '_ETH').toString() - const bob_ETHWithdrawn = th.getEventArgByName(txB, 'ETHGainWithdrawn', '_ETH').toString() - const carol_ETHWithdrawn = th.getEventArgByName(txC, 'ETHGainWithdrawn', '_ETH').toString() - - assert.isAtMost(th.getDifference((await boldToken.balanceOf(alice)).toString(), '5000000000000000000000'), 100000) - assert.isAtMost(th.getDifference((await boldToken.balanceOf(bob)).toString(), '10000000000000000000000'), 100000) - assert.isAtMost(th.getDifference((await boldToken.balanceOf(carol)).toString(), '15000000000000000000000'), 100000) - - assert.isAtMost(th.getDifference(alice_ETHWithdrawn, '49750000000000000000'), 100000) - assert.isAtMost(th.getDifference(bob_ETHWithdrawn, dec(995, 17)), 100000) - assert.isAtMost(th.getDifference(carol_ETHWithdrawn, '149250000000000000000'), 100000) - }) + const alice_ETHWithdrawn = th.getEventArgByName(txA, "ETHGainWithdrawn", "_ETH").toString(); + const bob_ETHWithdrawn = th.getEventArgByName(txB, "ETHGainWithdrawn", "_ETH").toString(); + const carol_ETHWithdrawn = th.getEventArgByName(txC, "ETHGainWithdrawn", "_ETH").toString(); + + assert.isAtMost( + th.getDifference((await boldToken.balanceOf(alice)).toString(), "5000000000000000000000"), + 100000, + ); + assert.isAtMost(th.getDifference((await boldToken.balanceOf(bob)).toString(), "10000000000000000000000"), 100000); + assert.isAtMost( + th.getDifference((await boldToken.balanceOf(carol)).toString(), "15000000000000000000000"), + 100000, + ); + + assert.isAtMost(th.getDifference(alice_ETHWithdrawn, "49750000000000000000"), 100000); + assert.isAtMost(th.getDifference(bob_ETHWithdrawn, dec(995, 17)), 100000); + assert.isAtMost(th.getDifference(carol_ETHWithdrawn, "149250000000000000000"), 100000); + }); // --- Varied deposits and varied liquidation amount --- it("withdrawFromSP(): Depositors with varying deposits withdraw correct compounded deposit and ETH Gain after three varying liquidations", async () => { // Whale opens Trove with 1m ETH - await th.openTroveWrapper(contracts, th._100pct, await getOpenTroveBoldAmount(dec(1000000, 18)), whale, whale, 0,{ from: whale, value: dec(1000000, 'ether') }) + await th.openTroveWrapper( + contracts, + th._100pct, + await getOpenTroveBoldAmount(dec(1000000, 18)), + whale, + whale, + 0, + { from: whale, value: dec(1000000, "ether") }, + ); /* Depositors provide:- Alice: 2000 Bold Bob: 456000 Bold Carol: 13100 Bold */ // Whale transfers Bold to A, B and C respectively who then deposit it to the SP - await boldToken.transfer(alice, dec(2000, 18), { from: whale }) - await stabilityPool.provideToSP(dec(2000, 18), { from: alice }) - await boldToken.transfer(bob, dec(456000, 18), { from: whale }) - await stabilityPool.provideToSP(dec(456000, 18), { from: bob }) - await boldToken.transfer(carol, dec(13100, 18), { from: whale }) - await stabilityPool.provideToSP(dec(13100, 18), { from: carol }) + await boldToken.transfer(alice, dec(2000, 18), { from: whale }); + await stabilityPool.provideToSP(dec(2000, 18), { from: alice }); + await boldToken.transfer(bob, dec(456000, 18), { from: whale }); + await stabilityPool.provideToSP(dec(456000, 18), { from: bob }); + await boldToken.transfer(carol, dec(13100, 18), { from: whale }); + await stabilityPool.provideToSP(dec(13100, 18), { from: carol }); /* Defaulters open troves - + Defaulter 1: 207000 Bold & 2160 ETH Defaulter 2: 5000 Bold & 50 ETH Defaulter 3: 46700 Bold & 500 ETH */ - const defaulter_1_TroveId = await th.openTroveWrapper(contracts, th._100pct, await getOpenTroveBoldAmount('207000000000000000000000'), defaulter_1, defaulter_1, 0,{ from: defaulter_1, value: dec(2160, 18) }) - const defaulter_2_TroveId = await th.openTroveWrapper(contracts, th._100pct, await getOpenTroveBoldAmount(dec(5, 21)), defaulter_2, defaulter_2, 0, { from: defaulter_2, value: dec(50, 'ether') }) - const defaulter_3_TroveId = await th.openTroveWrapper(contracts, th._100pct, await getOpenTroveBoldAmount('46700000000000000000000'), defaulter_3, defaulter_3, 0, { from: defaulter_3, value: dec(500, 'ether') }) + const defaulter_1_TroveId = await th.openTroveWrapper( + contracts, + th._100pct, + await getOpenTroveBoldAmount("207000000000000000000000"), + defaulter_1, + defaulter_1, + 0, + { from: defaulter_1, value: dec(2160, 18) }, + ); + const defaulter_2_TroveId = await th.openTroveWrapper( + contracts, + th._100pct, + await getOpenTroveBoldAmount(dec(5, 21)), + defaulter_2, + defaulter_2, + 0, + { from: defaulter_2, value: dec(50, "ether") }, + ); + const defaulter_3_TroveId = await th.openTroveWrapper( + contracts, + th._100pct, + await getOpenTroveBoldAmount("46700000000000000000000"), + defaulter_3, + defaulter_3, + 0, + { from: defaulter_3, value: dec(500, "ether") }, + ); // price drops by 50%: defaulter ICR falls to 100% await priceFeed.setPrice(dec(100, 18)); @@ -400,43 +592,79 @@ contract('StabilityPool - Withdrawal of stability deposit - Reward calculations' await troveManager.liquidate(defaulter_3_TroveId, { from: owner }); // Depositors attempt to withdraw everything - const txA = await stabilityPool.withdrawFromSP(dec(500000, 18), { from: alice }) - const txB = await stabilityPool.withdrawFromSP(dec(500000, 18), { from: bob }) - const txC = await stabilityPool.withdrawFromSP(dec(500000, 18), { from: carol }) + const txA = await stabilityPool.withdrawFromSP(dec(500000, 18), { from: alice }); + const txB = await stabilityPool.withdrawFromSP(dec(500000, 18), { from: bob }); + const txC = await stabilityPool.withdrawFromSP(dec(500000, 18), { from: carol }); // Grab the ETH gain from the emitted event in the tx log - const alice_ETHWithdrawn = th.getEventArgByName(txA, 'ETHGainWithdrawn', '_ETH').toString() - const bob_ETHWithdrawn = th.getEventArgByName(txB, 'ETHGainWithdrawn', '_ETH').toString() - const carol_ETHWithdrawn = th.getEventArgByName(txC, 'ETHGainWithdrawn', '_ETH').toString() + const alice_ETHWithdrawn = th.getEventArgByName(txA, "ETHGainWithdrawn", "_ETH").toString(); + const bob_ETHWithdrawn = th.getEventArgByName(txB, "ETHGainWithdrawn", "_ETH").toString(); + const carol_ETHWithdrawn = th.getEventArgByName(txC, "ETHGainWithdrawn", "_ETH").toString(); // () - assert.isAtMost(th.getDifference((await boldToken.balanceOf(alice)).toString(), '901719380174061000000'), 100000000000) - assert.isAtMost(th.getDifference((await boldToken.balanceOf(bob)).toString(), '205592018679686000000000'), 10000000000) - assert.isAtMost(th.getDifference((await boldToken.balanceOf(carol)).toString(), '5906261940140100000000'), 10000000000) + assert.isAtMost( + th.getDifference((await boldToken.balanceOf(alice)).toString(), "901719380174061000000"), + 100000000000, + ); + assert.isAtMost( + th.getDifference((await boldToken.balanceOf(bob)).toString(), "205592018679686000000000"), + 10000000000, + ); + assert.isAtMost( + th.getDifference((await boldToken.balanceOf(carol)).toString(), "5906261940140100000000"), + 10000000000, + ); // 2710 * 0.995 * {2000, 456000, 13100}/4711 - assert.isAtMost(th.getDifference(alice_ETHWithdrawn, '11447463383570366500'), 10000000000) - assert.isAtMost(th.getDifference(bob_ETHWithdrawn, '2610021651454043834000'), 10000000000) - assert.isAtMost(th.getDifference(carol_ETHWithdrawn, '74980885162385912900'), 10000000000) - }) + assert.isAtMost(th.getDifference(alice_ETHWithdrawn, "11447463383570366500"), 10000000000); + assert.isAtMost(th.getDifference(bob_ETHWithdrawn, "2610021651454043834000"), 10000000000); + assert.isAtMost(th.getDifference(carol_ETHWithdrawn, "74980885162385912900"), 10000000000); + }); // --- Deposit enters at t > 0 it("withdrawFromSP(): A, B, C Deposit -> 2 liquidations -> D deposits -> 1 liquidation. All deposits and liquidations = 100 Bold. A, B, C, D withdraw correct Bold deposit and ETH Gain", async () => { // Whale opens Trove with 100k ETH - await th.openTroveWrapper(contracts, th._100pct, await getOpenTroveBoldAmount(dec(100000, 18)), whale, whale, 0,{ from: whale, value: dec(100000, 'ether') }) + await th.openTroveWrapper(contracts, th._100pct, await getOpenTroveBoldAmount(dec(100000, 18)), whale, whale, 0, { + from: whale, + value: dec(100000, "ether"), + }); // Whale transfers 10k Bold to A, B and C who then deposit it to the SP - const depositors = [alice, bob, carol] + const depositors = [alice, bob, carol]; for (account of depositors) { - await boldToken.transfer(account, dec(10000, 18), { from: whale }) - await stabilityPool.provideToSP(dec(10000, 18), { from: account }) + await boldToken.transfer(account, dec(10000, 18), { from: whale }); + await stabilityPool.provideToSP(dec(10000, 18), { from: account }); } // Defaulters open trove with 200% ICR - const defaulter_1_TroveId = await th.openTroveWrapper(contracts, th._100pct, await getOpenTroveBoldAmount(dec(10000, 18)), defaulter_1, defaulter_1, 0,{ from: defaulter_1, value: dec(100, 'ether') }) - const defaulter_2_TroveId = await th.openTroveWrapper(contracts, th._100pct, await getOpenTroveBoldAmount(dec(10000, 18)), defaulter_2, defaulter_2, 0, { from: defaulter_2, value: dec(100, 'ether') }) - const defaulter_3_TroveId = await th.openTroveWrapper(contracts, th._100pct, await getOpenTroveBoldAmount(dec(10000, 18)), defaulter_3, defaulter_3, 0, { from: defaulter_3, value: dec(100, 'ether') }) + const defaulter_1_TroveId = await th.openTroveWrapper( + contracts, + th._100pct, + await getOpenTroveBoldAmount(dec(10000, 18)), + defaulter_1, + defaulter_1, + 0, + { from: defaulter_1, value: dec(100, "ether") }, + ); + const defaulter_2_TroveId = await th.openTroveWrapper( + contracts, + th._100pct, + await getOpenTroveBoldAmount(dec(10000, 18)), + defaulter_2, + defaulter_2, + 0, + { from: defaulter_2, value: dec(100, "ether") }, + ); + const defaulter_3_TroveId = await th.openTroveWrapper( + contracts, + th._100pct, + await getOpenTroveBoldAmount(dec(10000, 18)), + defaulter_3, + defaulter_3, + 0, + { from: defaulter_3, value: dec(100, "ether") }, + ); // price drops by 50%: defaulter ICR falls to 100% await priceFeed.setPrice(dec(100, 18)); @@ -446,52 +674,96 @@ contract('StabilityPool - Withdrawal of stability deposit - Reward calculations' await troveManager.liquidate(defaulter_2_TroveId, { from: owner }); // Whale transfers 10k to Dennis who then provides to SP - await boldToken.transfer(dennis, dec(10000, 18), { from: whale }) - await stabilityPool.provideToSP(dec(10000, 18), { from: dennis }) + await boldToken.transfer(dennis, dec(10000, 18), { from: whale }); + await stabilityPool.provideToSP(dec(10000, 18), { from: dennis }); // Third defaulter liquidated await troveManager.liquidate(defaulter_3_TroveId, { from: owner }); - const txA = await stabilityPool.withdrawFromSP(dec(10000, 18), { from: alice }) - const txB = await stabilityPool.withdrawFromSP(dec(10000, 18), { from: bob }) - const txC = await stabilityPool.withdrawFromSP(dec(10000, 18), { from: carol }) - const txD = await stabilityPool.withdrawFromSP(dec(10000, 18), { from: dennis }) + const txA = await stabilityPool.withdrawFromSP(dec(10000, 18), { from: alice }); + const txB = await stabilityPool.withdrawFromSP(dec(10000, 18), { from: bob }); + const txC = await stabilityPool.withdrawFromSP(dec(10000, 18), { from: carol }); + const txD = await stabilityPool.withdrawFromSP(dec(10000, 18), { from: dennis }); // Grab the ETH gain from the emitted event in the tx log - const alice_ETHWithdrawn = th.getEventArgByName(txA, 'ETHGainWithdrawn', '_ETH').toString() - const bob_ETHWithdrawn = th.getEventArgByName(txB, 'ETHGainWithdrawn', '_ETH').toString() - const carol_ETHWithdrawn = th.getEventArgByName(txC, 'ETHGainWithdrawn', '_ETH').toString() - const dennis_ETHWithdrawn = th.getEventArgByName(txD, 'ETHGainWithdrawn', '_ETH').toString() - - assert.isAtMost(th.getDifference((await boldToken.balanceOf(alice)).toString(), '1666666666666666666666'), 100000) - assert.isAtMost(th.getDifference((await boldToken.balanceOf(bob)).toString(), '1666666666666666666666'), 100000) - assert.isAtMost(th.getDifference((await boldToken.balanceOf(carol)).toString(), '1666666666666666666666'), 100000) - - assert.isAtMost(th.getDifference((await boldToken.balanceOf(dennis)).toString(), '5000000000000000000000'), 100000) - - assert.isAtMost(th.getDifference(alice_ETHWithdrawn, '82916666666666666667'), 100000) - assert.isAtMost(th.getDifference(bob_ETHWithdrawn, '82916666666666666667'), 100000) - assert.isAtMost(th.getDifference(carol_ETHWithdrawn, '82916666666666666667'), 100000) - - assert.isAtMost(th.getDifference(dennis_ETHWithdrawn, '49750000000000000000'), 100000) - }) + const alice_ETHWithdrawn = th.getEventArgByName(txA, "ETHGainWithdrawn", "_ETH").toString(); + const bob_ETHWithdrawn = th.getEventArgByName(txB, "ETHGainWithdrawn", "_ETH").toString(); + const carol_ETHWithdrawn = th.getEventArgByName(txC, "ETHGainWithdrawn", "_ETH").toString(); + const dennis_ETHWithdrawn = th.getEventArgByName(txD, "ETHGainWithdrawn", "_ETH").toString(); + + assert.isAtMost( + th.getDifference((await boldToken.balanceOf(alice)).toString(), "1666666666666666666666"), + 100000, + ); + assert.isAtMost(th.getDifference((await boldToken.balanceOf(bob)).toString(), "1666666666666666666666"), 100000); + assert.isAtMost( + th.getDifference((await boldToken.balanceOf(carol)).toString(), "1666666666666666666666"), + 100000, + ); + + assert.isAtMost( + th.getDifference((await boldToken.balanceOf(dennis)).toString(), "5000000000000000000000"), + 100000, + ); + + assert.isAtMost(th.getDifference(alice_ETHWithdrawn, "82916666666666666667"), 100000); + assert.isAtMost(th.getDifference(bob_ETHWithdrawn, "82916666666666666667"), 100000); + assert.isAtMost(th.getDifference(carol_ETHWithdrawn, "82916666666666666667"), 100000); + + assert.isAtMost(th.getDifference(dennis_ETHWithdrawn, "49750000000000000000"), 100000); + }); it("withdrawFromSP(): A, B, C Deposit -> 2 liquidations -> D deposits -> 2 liquidations. All deposits and liquidations = 100 Bold. A, B, C, D withdraw correct Bold deposit and ETH Gain", async () => { // Whale opens Trove with 100k ETH - await th.openTroveWrapper(contracts, th._100pct, await getOpenTroveBoldAmount(dec(100000, 18)), whale, whale, 0,{ from: whale, value: dec(100000, 'ether') }) + await th.openTroveWrapper(contracts, th._100pct, await getOpenTroveBoldAmount(dec(100000, 18)), whale, whale, 0, { + from: whale, + value: dec(100000, "ether"), + }); // Whale transfers 10k Bold to A, B and C who then deposit it to the SP - const depositors = [alice, bob, carol] + const depositors = [alice, bob, carol]; for (account of depositors) { - await boldToken.transfer(account, dec(10000, 18), { from: whale }) - await stabilityPool.provideToSP(dec(10000, 18), { from: account }) + await boldToken.transfer(account, dec(10000, 18), { from: whale }); + await stabilityPool.provideToSP(dec(10000, 18), { from: account }); } // Defaulters open trove with 200% ICR - const defaulter_1_TroveId = await th.openTroveWrapper(contracts, th._100pct, await getOpenTroveBoldAmount(dec(10000, 18)), defaulter_1, defaulter_1, 0,{ from: defaulter_1, value: dec(100, 'ether') }) - const defaulter_2_TroveId = await th.openTroveWrapper(contracts, th._100pct, await getOpenTroveBoldAmount(dec(10000, 18)), defaulter_2, defaulter_2, 0, { from: defaulter_2, value: dec(100, 'ether') }) - const defaulter_3_TroveId = await th.openTroveWrapper(contracts, th._100pct, await getOpenTroveBoldAmount(dec(10000, 18)), defaulter_3, defaulter_3, 0, { from: defaulter_3, value: dec(100, 'ether') }) - const defaulter_4_TroveId = await th.openTroveWrapper(contracts, th._100pct, await getOpenTroveBoldAmount(dec(10000, 18)), defaulter_4, defaulter_4, 0, { from: defaulter_4, value: dec(100, 'ether') }) + const defaulter_1_TroveId = await th.openTroveWrapper( + contracts, + th._100pct, + await getOpenTroveBoldAmount(dec(10000, 18)), + defaulter_1, + defaulter_1, + 0, + { from: defaulter_1, value: dec(100, "ether") }, + ); + const defaulter_2_TroveId = await th.openTroveWrapper( + contracts, + th._100pct, + await getOpenTroveBoldAmount(dec(10000, 18)), + defaulter_2, + defaulter_2, + 0, + { from: defaulter_2, value: dec(100, "ether") }, + ); + const defaulter_3_TroveId = await th.openTroveWrapper( + contracts, + th._100pct, + await getOpenTroveBoldAmount(dec(10000, 18)), + defaulter_3, + defaulter_3, + 0, + { from: defaulter_3, value: dec(100, "ether") }, + ); + const defaulter_4_TroveId = await th.openTroveWrapper( + contracts, + th._100pct, + await getOpenTroveBoldAmount(dec(10000, 18)), + defaulter_4, + defaulter_4, + 0, + { from: defaulter_4, value: dec(100, "ether") }, + ); // price drops by 50%: defaulter ICR falls to 100% await priceFeed.setPrice(dec(100, 18)); @@ -501,38 +773,46 @@ contract('StabilityPool - Withdrawal of stability deposit - Reward calculations' await troveManager.liquidate(defaulter_2_TroveId, { from: owner }); // Dennis opens a trove and provides to SP - await boldToken.transfer(dennis, dec(10000, 18), { from: whale }) - await stabilityPool.provideToSP(dec(10000, 18), { from: dennis }) + await boldToken.transfer(dennis, dec(10000, 18), { from: whale }); + await stabilityPool.provideToSP(dec(10000, 18), { from: dennis }); // Third and fourth defaulters liquidated await troveManager.liquidate(defaulter_3_TroveId, { from: owner }); await troveManager.liquidate(defaulter_4_TroveId, { from: owner }); - const txA = await stabilityPool.withdrawFromSP(dec(10000, 18), { from: alice }) - const txB = await stabilityPool.withdrawFromSP(dec(10000, 18), { from: bob }) - const txC = await stabilityPool.withdrawFromSP(dec(10000, 18), { from: carol }) - const txD = await stabilityPool.withdrawFromSP(dec(10000, 18), { from: dennis }) + const txA = await stabilityPool.withdrawFromSP(dec(10000, 18), { from: alice }); + const txB = await stabilityPool.withdrawFromSP(dec(10000, 18), { from: bob }); + const txC = await stabilityPool.withdrawFromSP(dec(10000, 18), { from: carol }); + const txD = await stabilityPool.withdrawFromSP(dec(10000, 18), { from: dennis }); // Grab the ETH gain from the emitted event in the tx log - const alice_ETHWithdrawn = th.getEventArgByName(txA, 'ETHGainWithdrawn', '_ETH').toString() - const bob_ETHWithdrawn = th.getEventArgByName(txB, 'ETHGainWithdrawn', '_ETH').toString() - const carol_ETHWithdrawn = th.getEventArgByName(txC, 'ETHGainWithdrawn', '_ETH').toString() - const dennis_ETHWithdrawn = th.getEventArgByName(txD, 'ETHGainWithdrawn', '_ETH').toString() - - assert.isAtMost(th.getDifference((await boldToken.balanceOf(alice)).toString(), '0'), 100000) - assert.isAtMost(th.getDifference((await boldToken.balanceOf(bob)).toString(), '0'), 100000) - assert.isAtMost(th.getDifference((await boldToken.balanceOf(carol)).toString(), '0'), 100000) - assert.isAtMost(th.getDifference((await boldToken.balanceOf(dennis)).toString(), '0'), 100000) - - assert.isAtMost(th.getDifference(alice_ETHWithdrawn, dec(995, 17)), 100000) - assert.isAtMost(th.getDifference(bob_ETHWithdrawn, dec(995, 17)), 100000) - assert.isAtMost(th.getDifference(carol_ETHWithdrawn, dec(995, 17)), 100000) - assert.isAtMost(th.getDifference(dennis_ETHWithdrawn, dec(995, 17)), 100000) - }) + const alice_ETHWithdrawn = th.getEventArgByName(txA, "ETHGainWithdrawn", "_ETH").toString(); + const bob_ETHWithdrawn = th.getEventArgByName(txB, "ETHGainWithdrawn", "_ETH").toString(); + const carol_ETHWithdrawn = th.getEventArgByName(txC, "ETHGainWithdrawn", "_ETH").toString(); + const dennis_ETHWithdrawn = th.getEventArgByName(txD, "ETHGainWithdrawn", "_ETH").toString(); + + assert.isAtMost(th.getDifference((await boldToken.balanceOf(alice)).toString(), "0"), 100000); + assert.isAtMost(th.getDifference((await boldToken.balanceOf(bob)).toString(), "0"), 100000); + assert.isAtMost(th.getDifference((await boldToken.balanceOf(carol)).toString(), "0"), 100000); + assert.isAtMost(th.getDifference((await boldToken.balanceOf(dennis)).toString(), "0"), 100000); + + assert.isAtMost(th.getDifference(alice_ETHWithdrawn, dec(995, 17)), 100000); + assert.isAtMost(th.getDifference(bob_ETHWithdrawn, dec(995, 17)), 100000); + assert.isAtMost(th.getDifference(carol_ETHWithdrawn, dec(995, 17)), 100000); + assert.isAtMost(th.getDifference(dennis_ETHWithdrawn, dec(995, 17)), 100000); + }); it("withdrawFromSP(): A, B, C Deposit -> 2 liquidations -> D deposits -> 2 liquidations. Various deposit and liquidation vals. A, B, C, D withdraw correct Bold deposit and ETH Gain", async () => { // Whale opens Trove with 1m ETH - await th.openTroveWrapper(contracts, th._100pct, await getOpenTroveBoldAmount(dec(1000000, 18)), whale, whale, 0,{ from: whale, value: dec(1000000, 'ether') }) + await th.openTroveWrapper( + contracts, + th._100pct, + await getOpenTroveBoldAmount(dec(1000000, 18)), + whale, + whale, + 0, + { from: whale, value: dec(1000000, "ether") }, + ); /* Depositors open troves and make SP deposit: Alice: 60000 Bold @@ -540,12 +820,12 @@ contract('StabilityPool - Withdrawal of stability deposit - Reward calculations' Carol: 15000 Bold */ // Whale transfers Bold to A, B and C respectively who then deposit it to the SP - await boldToken.transfer(alice, dec(60000, 18), { from: whale }) - await stabilityPool.provideToSP(dec(60000, 18), { from: alice }) - await boldToken.transfer(bob, dec(20000, 18), { from: whale }) - await stabilityPool.provideToSP(dec(20000, 18), { from: bob }) - await boldToken.transfer(carol, dec(15000, 18), { from: whale }) - await stabilityPool.provideToSP(dec(15000, 18), { from: carol }) + await boldToken.transfer(alice, dec(60000, 18), { from: whale }); + await stabilityPool.provideToSP(dec(60000, 18), { from: alice }); + await boldToken.transfer(bob, dec(20000, 18), { from: whale }); + await stabilityPool.provideToSP(dec(20000, 18), { from: bob }); + await boldToken.transfer(carol, dec(15000, 18), { from: whale }); + await stabilityPool.provideToSP(dec(15000, 18), { from: carol }); /* Defaulters open troves: Defaulter 1: 10000 Bold, 100 ETH @@ -553,10 +833,42 @@ contract('StabilityPool - Withdrawal of stability deposit - Reward calculations' Defaulter 3: 5000 Bold, 50 ETH Defaulter 4: 40000 Bold, 400 ETH */ - const defaulter_1_TroveId = await th.openTroveWrapper(contracts, th._100pct, await getOpenTroveBoldAmount(dec(10000, 18)), defaulter_1, defaulter_1, 0,{ from: defaulter_1, value: dec(100, 'ether') }) - const defaulter_2_TroveId = await th.openTroveWrapper(contracts, th._100pct, await getOpenTroveBoldAmount(dec(25000, 18)), defaulter_2, defaulter_2, 0, { from: defaulter_2, value: '250000000000000000000' }) - const defaulter_3_TroveId = await th.openTroveWrapper(contracts, th._100pct, await getOpenTroveBoldAmount(dec(5000, 18)), defaulter_3, defaulter_3, 0, { from: defaulter_3, value: '50000000000000000000' }) - const defaulter_4_TroveId = await th.openTroveWrapper(contracts, th._100pct, await getOpenTroveBoldAmount(dec(40000, 18)), defaulter_4, defaulter_4, 0, { from: defaulter_4, value: dec(400, 'ether') }) + const defaulter_1_TroveId = await th.openTroveWrapper( + contracts, + th._100pct, + await getOpenTroveBoldAmount(dec(10000, 18)), + defaulter_1, + defaulter_1, + 0, + { from: defaulter_1, value: dec(100, "ether") }, + ); + const defaulter_2_TroveId = await th.openTroveWrapper( + contracts, + th._100pct, + await getOpenTroveBoldAmount(dec(25000, 18)), + defaulter_2, + defaulter_2, + 0, + { from: defaulter_2, value: "250000000000000000000" }, + ); + const defaulter_3_TroveId = await th.openTroveWrapper( + contracts, + th._100pct, + await getOpenTroveBoldAmount(dec(5000, 18)), + defaulter_3, + defaulter_3, + 0, + { from: defaulter_3, value: "50000000000000000000" }, + ); + const defaulter_4_TroveId = await th.openTroveWrapper( + contracts, + th._100pct, + await getOpenTroveBoldAmount(dec(40000, 18)), + defaulter_4, + defaulter_4, + 0, + { from: defaulter_4, value: dec(400, "ether") }, + ); // price drops by 50%: defaulter ICR falls to 100% await priceFeed.setPrice(dec(100, 18)); @@ -566,55 +878,102 @@ contract('StabilityPool - Withdrawal of stability deposit - Reward calculations' await troveManager.liquidate(defaulter_2_TroveId, { from: owner }); // Dennis provides 25000 Bold - await boldToken.transfer(dennis, dec(25000, 18), { from: whale }) - await stabilityPool.provideToSP(dec(25000, 18), { from: dennis }) + await boldToken.transfer(dennis, dec(25000, 18), { from: whale }); + await stabilityPool.provideToSP(dec(25000, 18), { from: dennis }); // Last two defaulters liquidated await troveManager.liquidate(defaulter_3_TroveId, { from: owner }); await troveManager.liquidate(defaulter_4_TroveId, { from: owner }); // Each depositor withdraws as much as possible - const txA = await stabilityPool.withdrawFromSP(dec(100000, 18), { from: alice }) - const txB = await stabilityPool.withdrawFromSP(dec(100000, 18), { from: bob }) - const txC = await stabilityPool.withdrawFromSP(dec(100000, 18), { from: carol }) - const txD = await stabilityPool.withdrawFromSP(dec(100000, 18), { from: dennis }) + const txA = await stabilityPool.withdrawFromSP(dec(100000, 18), { from: alice }); + const txB = await stabilityPool.withdrawFromSP(dec(100000, 18), { from: bob }); + const txC = await stabilityPool.withdrawFromSP(dec(100000, 18), { from: carol }); + const txD = await stabilityPool.withdrawFromSP(dec(100000, 18), { from: dennis }); // Grab the ETH gain from the emitted event in the tx log - const alice_ETHWithdrawn = th.getEventArgByName(txA, 'ETHGainWithdrawn', '_ETH').toString() - const bob_ETHWithdrawn = th.getEventArgByName(txB, 'ETHGainWithdrawn', '_ETH').toString() - const carol_ETHWithdrawn = th.getEventArgByName(txC, 'ETHGainWithdrawn', '_ETH').toString() - const dennis_ETHWithdrawn = th.getEventArgByName(txD, 'ETHGainWithdrawn', '_ETH').toString() - - assert.isAtMost(th.getDifference((await boldToken.balanceOf(alice)).toString(), '17832817337461300000000'), 100000000000) - assert.isAtMost(th.getDifference((await boldToken.balanceOf(bob)).toString(), '5944272445820430000000'), 100000000000) - assert.isAtMost(th.getDifference((await boldToken.balanceOf(carol)).toString(), '4458204334365320000000'), 100000000000) - assert.isAtMost(th.getDifference((await boldToken.balanceOf(dennis)).toString(), '11764705882352900000000'), 100000000000) + const alice_ETHWithdrawn = th.getEventArgByName(txA, "ETHGainWithdrawn", "_ETH").toString(); + const bob_ETHWithdrawn = th.getEventArgByName(txB, "ETHGainWithdrawn", "_ETH").toString(); + const carol_ETHWithdrawn = th.getEventArgByName(txC, "ETHGainWithdrawn", "_ETH").toString(); + const dennis_ETHWithdrawn = th.getEventArgByName(txD, "ETHGainWithdrawn", "_ETH").toString(); + + assert.isAtMost( + th.getDifference((await boldToken.balanceOf(alice)).toString(), "17832817337461300000000"), + 100000000000, + ); + assert.isAtMost( + th.getDifference((await boldToken.balanceOf(bob)).toString(), "5944272445820430000000"), + 100000000000, + ); + assert.isAtMost( + th.getDifference((await boldToken.balanceOf(carol)).toString(), "4458204334365320000000"), + 100000000000, + ); + assert.isAtMost( + th.getDifference((await boldToken.balanceOf(dennis)).toString(), "11764705882352900000000"), + 100000000000, + ); // 3.5*0.995 * {60000,20000,15000,0} / 95000 + 450*0.995 * {60000/950*{60000,20000,15000},25000} / (120000-35000) - assert.isAtMost(th.getDifference(alice_ETHWithdrawn, '419563467492260055900'), 100000000000) - assert.isAtMost(th.getDifference(bob_ETHWithdrawn, '139854489164086692700'), 100000000000) - assert.isAtMost(th.getDifference(carol_ETHWithdrawn, '104890866873065014000'), 100000000000) - assert.isAtMost(th.getDifference(dennis_ETHWithdrawn, '131691176470588233700'), 100000000000) - }) + assert.isAtMost(th.getDifference(alice_ETHWithdrawn, "419563467492260055900"), 100000000000); + assert.isAtMost(th.getDifference(bob_ETHWithdrawn, "139854489164086692700"), 100000000000); + assert.isAtMost(th.getDifference(carol_ETHWithdrawn, "104890866873065014000"), 100000000000); + assert.isAtMost(th.getDifference(dennis_ETHWithdrawn, "131691176470588233700"), 100000000000); + }); // --- Depositor leaves --- it("withdrawFromSP(): A, B, C, D deposit -> 2 liquidations -> D withdraws -> 2 liquidations. All deposits and liquidations = 100 Bold. A, B, C, D withdraw correct Bold deposit and ETH Gain", async () => { // Whale opens Trove with 100k ETH - await th.openTroveWrapper(contracts, th._100pct, await getOpenTroveBoldAmount(dec(100000, 18)), whale, whale, 0,{ from: whale, value: dec(100000, 'ether') }) + await th.openTroveWrapper(contracts, th._100pct, await getOpenTroveBoldAmount(dec(100000, 18)), whale, whale, 0, { + from: whale, + value: dec(100000, "ether"), + }); // Whale transfers 10k Bold to A, B and C who then deposit it to the SP - const depositors = [alice, bob, carol, dennis] + const depositors = [alice, bob, carol, dennis]; for (account of depositors) { - await boldToken.transfer(account, dec(10000, 18), { from: whale }) - await stabilityPool.provideToSP(dec(10000, 18), { from: account }) + await boldToken.transfer(account, dec(10000, 18), { from: whale }); + await stabilityPool.provideToSP(dec(10000, 18), { from: account }); } // Defaulters open trove with 200% ICR - const defaulter_1_TroveId = await th.openTroveWrapper(contracts, th._100pct, await getOpenTroveBoldAmount(dec(10000, 18)), defaulter_1, defaulter_1, 0,{ from: defaulter_1, value: dec(100, 'ether') }) - const defaulter_2_TroveId = await th.openTroveWrapper(contracts, th._100pct, await getOpenTroveBoldAmount(dec(10000, 18)), defaulter_2, defaulter_2, 0, { from: defaulter_2, value: dec(100, 'ether') }) - const defaulter_3_TroveId = await th.openTroveWrapper(contracts, th._100pct, await getOpenTroveBoldAmount(dec(10000, 18)), defaulter_3, defaulter_3, 0, { from: defaulter_3, value: dec(100, 'ether') }) - const defaulter_4_TroveId = await th.openTroveWrapper(contracts, th._100pct, await getOpenTroveBoldAmount(dec(10000, 18)), defaulter_4, defaulter_4, 0, { from: defaulter_4, value: dec(100, 'ether') }) + const defaulter_1_TroveId = await th.openTroveWrapper( + contracts, + th._100pct, + await getOpenTroveBoldAmount(dec(10000, 18)), + defaulter_1, + defaulter_1, + 0, + { from: defaulter_1, value: dec(100, "ether") }, + ); + const defaulter_2_TroveId = await th.openTroveWrapper( + contracts, + th._100pct, + await getOpenTroveBoldAmount(dec(10000, 18)), + defaulter_2, + defaulter_2, + 0, + { from: defaulter_2, value: dec(100, "ether") }, + ); + const defaulter_3_TroveId = await th.openTroveWrapper( + contracts, + th._100pct, + await getOpenTroveBoldAmount(dec(10000, 18)), + defaulter_3, + defaulter_3, + 0, + { from: defaulter_3, value: dec(100, "ether") }, + ); + const defaulter_4_TroveId = await th.openTroveWrapper( + contracts, + th._100pct, + await getOpenTroveBoldAmount(dec(10000, 18)), + defaulter_4, + defaulter_4, + 0, + { from: defaulter_4, value: dec(100, "ether") }, + ); // price drops by 50%: defaulter ICR falls to 100% await priceFeed.setPrice(dec(100, 18)); @@ -625,39 +984,45 @@ contract('StabilityPool - Withdrawal of stability deposit - Reward calculations' // Dennis withdraws his deposit and ETH gain // Increasing the price for a moment to avoid pending liquidations to block withdrawal - await priceFeed.setPrice(dec(200, 18)) - const txD = await stabilityPool.withdrawFromSP(dec(10000, 18), { from: dennis }) - await priceFeed.setPrice(dec(100, 18)) + await priceFeed.setPrice(dec(200, 18)); + const txD = await stabilityPool.withdrawFromSP(dec(10000, 18), { from: dennis }); + await priceFeed.setPrice(dec(100, 18)); - const dennis_ETHWithdrawn = th.getEventArgByName(txD, 'ETHGainWithdrawn', '_ETH').toString() - assert.isAtMost(th.getDifference((await boldToken.balanceOf(dennis)).toString(), '5000000000000000000000'), 100000) - assert.isAtMost(th.getDifference(dennis_ETHWithdrawn, '49750000000000000000'), 100000) + const dennis_ETHWithdrawn = th.getEventArgByName(txD, "ETHGainWithdrawn", "_ETH").toString(); + assert.isAtMost( + th.getDifference((await boldToken.balanceOf(dennis)).toString(), "5000000000000000000000"), + 100000, + ); + assert.isAtMost(th.getDifference(dennis_ETHWithdrawn, "49750000000000000000"), 100000); // Two more defaulters are liquidated await troveManager.liquidate(defaulter_3_TroveId, { from: owner }); await troveManager.liquidate(defaulter_4_TroveId, { from: owner }); - const txA = await stabilityPool.withdrawFromSP(dec(10000, 18), { from: alice }) - const txB = await stabilityPool.withdrawFromSP(dec(10000, 18), { from: bob }) - const txC = await stabilityPool.withdrawFromSP(dec(10000, 18), { from: carol }) + const txA = await stabilityPool.withdrawFromSP(dec(10000, 18), { from: alice }); + const txB = await stabilityPool.withdrawFromSP(dec(10000, 18), { from: bob }); + const txC = await stabilityPool.withdrawFromSP(dec(10000, 18), { from: carol }); // Grab the ETH gain from the emitted event in the tx log - const alice_ETHWithdrawn = th.getEventArgByName(txA, 'ETHGainWithdrawn', '_ETH').toString() - const bob_ETHWithdrawn = th.getEventArgByName(txB, 'ETHGainWithdrawn', '_ETH').toString() - const carol_ETHWithdrawn = th.getEventArgByName(txC, 'ETHGainWithdrawn', '_ETH').toString() + const alice_ETHWithdrawn = th.getEventArgByName(txA, "ETHGainWithdrawn", "_ETH").toString(); + const bob_ETHWithdrawn = th.getEventArgByName(txB, "ETHGainWithdrawn", "_ETH").toString(); + const carol_ETHWithdrawn = th.getEventArgByName(txC, "ETHGainWithdrawn", "_ETH").toString(); - assert.isAtMost(th.getDifference((await boldToken.balanceOf(alice)).toString(), '0'), 1000) - assert.isAtMost(th.getDifference((await boldToken.balanceOf(bob)).toString(), '0'), 1000) - assert.isAtMost(th.getDifference((await boldToken.balanceOf(carol)).toString(), '0'), 1000) + assert.isAtMost(th.getDifference((await boldToken.balanceOf(alice)).toString(), "0"), 1000); + assert.isAtMost(th.getDifference((await boldToken.balanceOf(bob)).toString(), "0"), 1000); + assert.isAtMost(th.getDifference((await boldToken.balanceOf(carol)).toString(), "0"), 1000); - assert.isAtMost(th.getDifference(alice_ETHWithdrawn, dec(995, 17)), 100000) - assert.isAtMost(th.getDifference(bob_ETHWithdrawn, dec(995, 17)), 100000) - assert.isAtMost(th.getDifference(carol_ETHWithdrawn, dec(995, 17)), 100000) - }) + assert.isAtMost(th.getDifference(alice_ETHWithdrawn, dec(995, 17)), 100000); + assert.isAtMost(th.getDifference(bob_ETHWithdrawn, dec(995, 17)), 100000); + assert.isAtMost(th.getDifference(carol_ETHWithdrawn, dec(995, 17)), 100000); + }); it("withdrawFromSP(): A, B, C, D deposit -> 2 liquidations -> D withdraws -> 2 liquidations. Various deposit and liquidation vals. A, B, C, D withdraw correct Bold deposit and ETH Gain", async () => { // Whale opens Trove with 100k ETH - await th.openTroveWrapper(contracts, th._100pct, await getOpenTroveBoldAmount(dec(100000, 18)), whale, whale, 0,{ from: whale, value: dec(100000, 'ether') }) + await th.openTroveWrapper(contracts, th._100pct, await getOpenTroveBoldAmount(dec(100000, 18)), whale, whale, 0, { + from: whale, + value: dec(100000, "ether"), + }); /* Initial deposits: Alice: 20000 Bold @@ -666,14 +1031,14 @@ contract('StabilityPool - Withdrawal of stability deposit - Reward calculations' Dennis: 40000 Bold */ // Whale transfers Bold to A, B,C and D respectively who then deposit it to the SP - await boldToken.transfer(alice, dec(20000, 18), { from: whale }) - await stabilityPool.provideToSP(dec(20000, 18), { from: alice }) - await boldToken.transfer(bob, dec(25000, 18), { from: whale }) - await stabilityPool.provideToSP(dec(25000, 18), { from: bob }) - await boldToken.transfer(carol, dec(12500, 18), { from: whale }) - await stabilityPool.provideToSP(dec(12500, 18), { from: carol }) - await boldToken.transfer(dennis, dec(40000, 18), { from: whale }) - await stabilityPool.provideToSP(dec(40000, 18), { from: dennis }) + await boldToken.transfer(alice, dec(20000, 18), { from: whale }); + await stabilityPool.provideToSP(dec(20000, 18), { from: alice }); + await boldToken.transfer(bob, dec(25000, 18), { from: whale }); + await stabilityPool.provideToSP(dec(25000, 18), { from: bob }); + await boldToken.transfer(carol, dec(12500, 18), { from: whale }); + await stabilityPool.provideToSP(dec(12500, 18), { from: carol }); + await boldToken.transfer(dennis, dec(40000, 18), { from: whale }); + await stabilityPool.provideToSP(dec(40000, 18), { from: dennis }); /* Defaulters open troves: Defaulter 1: 10000 Bold @@ -681,10 +1046,42 @@ contract('StabilityPool - Withdrawal of stability deposit - Reward calculations' Defaulter 3: 30000 Bold Defaulter 4: 5000 Bold */ - const defaulter_1_TroveId = await th.openTroveWrapper(contracts, th._100pct, await getOpenTroveBoldAmount(dec(10000, 18)), defaulter_1, defaulter_1, 0,{ from: defaulter_1, value: dec(100, 'ether') }) - const defaulter_2_TroveId = await th.openTroveWrapper(contracts, th._100pct, await getOpenTroveBoldAmount(dec(20000, 18)), defaulter_2, defaulter_2, 0, { from: defaulter_2, value: dec(200, 'ether') }) - const defaulter_3_TroveId = await th.openTroveWrapper(contracts, th._100pct, await getOpenTroveBoldAmount(dec(30000, 18)), defaulter_3, defaulter_3, 0, { from: defaulter_3, value: dec(300, 'ether') }) - const defaulter_4_TroveId = await th.openTroveWrapper(contracts, th._100pct, await getOpenTroveBoldAmount(dec(5000, 18)), defaulter_4, defaulter_4, 0, { from: defaulter_4, value: '50000000000000000000' }) + const defaulter_1_TroveId = await th.openTroveWrapper( + contracts, + th._100pct, + await getOpenTroveBoldAmount(dec(10000, 18)), + defaulter_1, + defaulter_1, + 0, + { from: defaulter_1, value: dec(100, "ether") }, + ); + const defaulter_2_TroveId = await th.openTroveWrapper( + contracts, + th._100pct, + await getOpenTroveBoldAmount(dec(20000, 18)), + defaulter_2, + defaulter_2, + 0, + { from: defaulter_2, value: dec(200, "ether") }, + ); + const defaulter_3_TroveId = await th.openTroveWrapper( + contracts, + th._100pct, + await getOpenTroveBoldAmount(dec(30000, 18)), + defaulter_3, + defaulter_3, + 0, + { from: defaulter_3, value: dec(300, "ether") }, + ); + const defaulter_4_TroveId = await th.openTroveWrapper( + contracts, + th._100pct, + await getOpenTroveBoldAmount(dec(5000, 18)), + defaulter_4, + defaulter_4, + 0, + { from: defaulter_4, value: "50000000000000000000" }, + ); // price drops by 50%: defaulter ICR falls to 100% await priceFeed.setPrice(dec(100, 18)); @@ -695,55 +1092,102 @@ contract('StabilityPool - Withdrawal of stability deposit - Reward calculations' // Dennis withdraws his deposit and ETH gain // Increasing the price for a moment to avoid pending liquidations to block withdrawal - await priceFeed.setPrice(dec(200, 18)) - const txD = await stabilityPool.withdrawFromSP(dec(40000, 18), { from: dennis }) - await priceFeed.setPrice(dec(100, 18)) + await priceFeed.setPrice(dec(200, 18)); + const txD = await stabilityPool.withdrawFromSP(dec(40000, 18), { from: dennis }); + await priceFeed.setPrice(dec(100, 18)); - const dennis_ETHWithdrawn = th.getEventArgByName(txD, 'ETHGainWithdrawn', '_ETH').toString() - assert.isAtMost(th.getDifference((await boldToken.balanceOf(dennis)).toString(), '27692307692307700000000'), 100000000000) + const dennis_ETHWithdrawn = th.getEventArgByName(txD, "ETHGainWithdrawn", "_ETH").toString(); + assert.isAtMost( + th.getDifference((await boldToken.balanceOf(dennis)).toString(), "27692307692307700000000"), + 100000000000, + ); // 300*0.995 * 40000/97500 - assert.isAtMost(th.getDifference(dennis_ETHWithdrawn, '122461538461538466100'), 100000000000) + assert.isAtMost(th.getDifference(dennis_ETHWithdrawn, "122461538461538466100"), 100000000000); // Two more defaulters are liquidated await troveManager.liquidate(defaulter_3_TroveId, { from: owner }); await troveManager.liquidate(defaulter_4_TroveId, { from: owner }); - const txA = await stabilityPool.withdrawFromSP(dec(100000, 18), { from: alice }) - const txB = await stabilityPool.withdrawFromSP(dec(100000, 18), { from: bob }) - const txC = await stabilityPool.withdrawFromSP(dec(100000, 18), { from: carol }) + const txA = await stabilityPool.withdrawFromSP(dec(100000, 18), { from: alice }); + const txB = await stabilityPool.withdrawFromSP(dec(100000, 18), { from: bob }); + const txC = await stabilityPool.withdrawFromSP(dec(100000, 18), { from: carol }); // Grab the ETH gain from the emitted event in the tx log - const alice_ETHWithdrawn = th.getEventArgByName(txA, 'ETHGainWithdrawn', '_ETH').toString() - const bob_ETHWithdrawn = th.getEventArgByName(txB, 'ETHGainWithdrawn', '_ETH').toString() - const carol_ETHWithdrawn = th.getEventArgByName(txC, 'ETHGainWithdrawn', '_ETH').toString() - - assert.isAtMost(th.getDifference((await boldToken.balanceOf(alice)).toString(), '1672240802675590000000'), 10000000000) - assert.isAtMost(th.getDifference((await boldToken.balanceOf(bob)).toString(), '2090301003344480000000'), 100000000000) - assert.isAtMost(th.getDifference((await boldToken.balanceOf(carol)).toString(), '1045150501672240000000'), 100000000000) + const alice_ETHWithdrawn = th.getEventArgByName(txA, "ETHGainWithdrawn", "_ETH").toString(); + const bob_ETHWithdrawn = th.getEventArgByName(txB, "ETHGainWithdrawn", "_ETH").toString(); + const carol_ETHWithdrawn = th.getEventArgByName(txC, "ETHGainWithdrawn", "_ETH").toString(); + + assert.isAtMost( + th.getDifference((await boldToken.balanceOf(alice)).toString(), "1672240802675590000000"), + 10000000000, + ); + assert.isAtMost( + th.getDifference((await boldToken.balanceOf(bob)).toString(), "2090301003344480000000"), + 100000000000, + ); + assert.isAtMost( + th.getDifference((await boldToken.balanceOf(carol)).toString(), "1045150501672240000000"), + 100000000000, + ); // 300*0.995 * {20000,25000,12500}/97500 + 350*0.995 * {20000,25000,12500}/57500 - assert.isAtMost(th.getDifference(alice_ETHWithdrawn, '182361204013377919900'), 100000000000) - assert.isAtMost(th.getDifference(bob_ETHWithdrawn, '227951505016722411000'), 100000000000) - assert.isAtMost(th.getDifference(carol_ETHWithdrawn, '113975752508361205500'), 100000000000) - }) + assert.isAtMost(th.getDifference(alice_ETHWithdrawn, "182361204013377919900"), 100000000000); + assert.isAtMost(th.getDifference(bob_ETHWithdrawn, "227951505016722411000"), 100000000000); + assert.isAtMost(th.getDifference(carol_ETHWithdrawn, "113975752508361205500"), 100000000000); + }); // --- One deposit enters at t > 0, and another leaves later --- it("withdrawFromSP(): A, B, D deposit -> 2 liquidations -> C makes deposit -> 1 liquidation -> D withdraws -> 1 liquidation. All deposits: 100 Bold. Liquidations: 100,100,100,50. A, B, C, D withdraw correct Bold deposit and ETH Gain", async () => { // Whale opens Trove with 100k ETH - await th.openTroveWrapper(contracts, th._100pct, await getOpenTroveBoldAmount(dec(100000, 18)), whale, whale, 0,{ from: whale, value: dec(100000, 'ether') }) + await th.openTroveWrapper(contracts, th._100pct, await getOpenTroveBoldAmount(dec(100000, 18)), whale, whale, 0, { + from: whale, + value: dec(100000, "ether"), + }); // Whale transfers 10k Bold to A, B and D who then deposit it to the SP - const depositors = [alice, bob, dennis] + const depositors = [alice, bob, dennis]; for (account of depositors) { - await boldToken.transfer(account, dec(10000, 18), { from: whale }) - await stabilityPool.provideToSP(dec(10000, 18), { from: account }) + await boldToken.transfer(account, dec(10000, 18), { from: whale }); + await stabilityPool.provideToSP(dec(10000, 18), { from: account }); } // Defaulters open troves - const defaulter_1_TroveId = await th.openTroveWrapper(contracts, th._100pct, await getOpenTroveBoldAmount(dec(10000, 18)), defaulter_1, defaulter_1, 0,{ from: defaulter_1, value: dec(100, 'ether') }) - const defaulter_2_TroveId = await th.openTroveWrapper(contracts, th._100pct, await getOpenTroveBoldAmount(dec(10000, 18)), defaulter_2, defaulter_2, 0, { from: defaulter_2, value: dec(100, 'ether') }) - const defaulter_3_TroveId = await th.openTroveWrapper(contracts, th._100pct, await getOpenTroveBoldAmount(dec(10000, 18)), defaulter_3, defaulter_3, 0, { from: defaulter_3, value: dec(100, 'ether') }) - const defaulter_4_TroveId = await th.openTroveWrapper(contracts, th._100pct, await getOpenTroveBoldAmount(dec(5000, 18)), defaulter_4, defaulter_4, 0, { from: defaulter_4, value: '50000000000000000000' }) + const defaulter_1_TroveId = await th.openTroveWrapper( + contracts, + th._100pct, + await getOpenTroveBoldAmount(dec(10000, 18)), + defaulter_1, + defaulter_1, + 0, + { from: defaulter_1, value: dec(100, "ether") }, + ); + const defaulter_2_TroveId = await th.openTroveWrapper( + contracts, + th._100pct, + await getOpenTroveBoldAmount(dec(10000, 18)), + defaulter_2, + defaulter_2, + 0, + { from: defaulter_2, value: dec(100, "ether") }, + ); + const defaulter_3_TroveId = await th.openTroveWrapper( + contracts, + th._100pct, + await getOpenTroveBoldAmount(dec(10000, 18)), + defaulter_3, + defaulter_3, + 0, + { from: defaulter_3, value: dec(100, "ether") }, + ); + const defaulter_4_TroveId = await th.openTroveWrapper( + contracts, + th._100pct, + await getOpenTroveBoldAmount(dec(5000, 18)), + defaulter_4, + defaulter_4, + 0, + { from: defaulter_4, value: "50000000000000000000" }, + ); // price drops by 50%: defaulter ICR falls to 100% await priceFeed.setPrice(dec(100, 18)); @@ -753,40 +1197,46 @@ contract('StabilityPool - Withdrawal of stability deposit - Reward calculations' await troveManager.liquidate(defaulter_2_TroveId, { from: owner }); // Carol makes deposit - await boldToken.transfer(carol, dec(10000, 18), { from: whale }) - await stabilityPool.provideToSP(dec(10000, 18), { from: carol }) + await boldToken.transfer(carol, dec(10000, 18), { from: whale }); + await stabilityPool.provideToSP(dec(10000, 18), { from: carol }); await troveManager.liquidate(defaulter_3_TroveId, { from: owner }); // Dennis withdraws his deposit and ETH gain // Increasing the price for a moment to avoid pending liquidations to block withdrawal - await priceFeed.setPrice(dec(200, 18)) - const txD = await stabilityPool.withdrawFromSP(dec(10000, 18), { from: dennis }) - await priceFeed.setPrice(dec(100, 18)) + await priceFeed.setPrice(dec(200, 18)); + const txD = await stabilityPool.withdrawFromSP(dec(10000, 18), { from: dennis }); + await priceFeed.setPrice(dec(100, 18)); - const dennis_ETHWithdrawn = th.getEventArgByName(txD, 'ETHGainWithdrawn', '_ETH').toString() - assert.isAtMost(th.getDifference((await boldToken.balanceOf(dennis)).toString(), '1666666666666666666666'), 100000) - assert.isAtMost(th.getDifference(dennis_ETHWithdrawn, '82916666666666666667'), 100000) + const dennis_ETHWithdrawn = th.getEventArgByName(txD, "ETHGainWithdrawn", "_ETH").toString(); + assert.isAtMost( + th.getDifference((await boldToken.balanceOf(dennis)).toString(), "1666666666666666666666"), + 100000, + ); + assert.isAtMost(th.getDifference(dennis_ETHWithdrawn, "82916666666666666667"), 100000); await troveManager.liquidate(defaulter_4_TroveId, { from: owner }); - const txA = await stabilityPool.withdrawFromSP(dec(10000, 18), { from: alice }) - const txB = await stabilityPool.withdrawFromSP(dec(10000, 18), { from: bob }) - const txC = await stabilityPool.withdrawFromSP(dec(10000, 18), { from: carol }) + const txA = await stabilityPool.withdrawFromSP(dec(10000, 18), { from: alice }); + const txB = await stabilityPool.withdrawFromSP(dec(10000, 18), { from: bob }); + const txC = await stabilityPool.withdrawFromSP(dec(10000, 18), { from: carol }); // Grab the ETH gain from the emitted event in the tx log - const alice_ETHWithdrawn = th.getEventArgByName(txA, 'ETHGainWithdrawn', '_ETH').toString() - const bob_ETHWithdrawn = th.getEventArgByName(txB, 'ETHGainWithdrawn', '_ETH').toString() - const carol_ETHWithdrawn = th.getEventArgByName(txC, 'ETHGainWithdrawn', '_ETH').toString() - - assert.isAtMost(th.getDifference((await boldToken.balanceOf(alice)).toString(), '666666666666666666666'), 100000) - assert.isAtMost(th.getDifference((await boldToken.balanceOf(bob)).toString(), '666666666666666666666'), 100000) - assert.isAtMost(th.getDifference((await boldToken.balanceOf(carol)).toString(), '2000000000000000000000'), 100000) - - assert.isAtMost(th.getDifference(alice_ETHWithdrawn, '92866666666666666667'), 100000) - assert.isAtMost(th.getDifference(bob_ETHWithdrawn, '92866666666666666667'), 100000) - assert.isAtMost(th.getDifference(carol_ETHWithdrawn, '79600000000000000000'), 100000) - }) + const alice_ETHWithdrawn = th.getEventArgByName(txA, "ETHGainWithdrawn", "_ETH").toString(); + const bob_ETHWithdrawn = th.getEventArgByName(txB, "ETHGainWithdrawn", "_ETH").toString(); + const carol_ETHWithdrawn = th.getEventArgByName(txC, "ETHGainWithdrawn", "_ETH").toString(); + + assert.isAtMost(th.getDifference((await boldToken.balanceOf(alice)).toString(), "666666666666666666666"), 100000); + assert.isAtMost(th.getDifference((await boldToken.balanceOf(bob)).toString(), "666666666666666666666"), 100000); + assert.isAtMost( + th.getDifference((await boldToken.balanceOf(carol)).toString(), "2000000000000000000000"), + 100000, + ); + + assert.isAtMost(th.getDifference(alice_ETHWithdrawn, "92866666666666666667"), 100000); + assert.isAtMost(th.getDifference(bob_ETHWithdrawn, "92866666666666666667"), 100000); + assert.isAtMost(th.getDifference(carol_ETHWithdrawn, "79600000000000000000"), 100000); + }); // --- Tests for full offset - Pool empties to 0 --- @@ -799,18 +1249,37 @@ contract('StabilityPool - Withdrawal of stability deposit - Reward calculations' // C, D withdraw 5000Bold & 500e it("withdrawFromSP(): Depositor withdraws correct compounded deposit after liquidation empties the pool", async () => { // Whale opens Trove with 100k ETH - await th.openTroveWrapper(contracts, th._100pct, await getOpenTroveBoldAmount(dec(100000, 18)), whale, whale, 0,{ from: whale, value: dec(100000, 'ether') }) + await th.openTroveWrapper(contracts, th._100pct, await getOpenTroveBoldAmount(dec(100000, 18)), whale, whale, 0, { + from: whale, + value: dec(100000, "ether"), + }); // Whale transfers 10k Bold to A, B who then deposit it to the SP - const depositors = [alice, bob] + const depositors = [alice, bob]; for (const account of depositors) { - await boldToken.transfer(account, dec(10000, 18), { from: whale }) - await stabilityPool.provideToSP(dec(10000, 18), { from: account }) + await boldToken.transfer(account, dec(10000, 18), { from: whale }); + await stabilityPool.provideToSP(dec(10000, 18), { from: account }); } // 2 Defaulters open trove with 200% ICR - const defaulter_1_TroveId = await th.openTroveWrapper(contracts, th._100pct, await getOpenTroveBoldAmount(dec(20000, 18)), defaulter_1, defaulter_1, 0,{ from: defaulter_1, value: dec(200, 'ether') }) - const defaulter_2_TroveId = await th.openTroveWrapper(contracts, th._100pct, await getOpenTroveBoldAmount(dec(10000, 18)), defaulter_2, defaulter_2, 0, { from: defaulter_2, value: dec(100, 'ether') }) + const defaulter_1_TroveId = await th.openTroveWrapper( + contracts, + th._100pct, + await getOpenTroveBoldAmount(dec(20000, 18)), + defaulter_1, + defaulter_1, + 0, + { from: defaulter_1, value: dec(200, "ether") }, + ); + const defaulter_2_TroveId = await th.openTroveWrapper( + contracts, + th._100pct, + await getOpenTroveBoldAmount(dec(10000, 18)), + defaulter_2, + defaulter_2, + 0, + { from: defaulter_2, value: dec(100, "ether") }, + ); // price drops by 50%: defaulter ICR falls to 100% await priceFeed.setPrice(dec(100, 18)); @@ -819,10 +1288,10 @@ contract('StabilityPool - Withdrawal of stability deposit - Reward calculations' await troveManager.liquidate(defaulter_1_TroveId, { from: owner }); // Carol, Dennis each deposit 10000 Bold - const depositors_2 = [carol, dennis] + const depositors_2 = [carol, dennis]; for (const account of depositors_2) { - await boldToken.transfer(account, dec(10000, 18), { from: whale }) - await stabilityPool.provideToSP(dec(10000, 18), { from: account }) + await boldToken.transfer(account, dec(10000, 18), { from: whale }); + await stabilityPool.provideToSP(dec(10000, 18), { from: account }); } // Defaulter 2 liquidated. 10000 Bold offset @@ -831,145 +1300,204 @@ contract('StabilityPool - Withdrawal of stability deposit - Reward calculations' // await th.openTroveWrapper(contracts, th._100pct, dec(1, 18), account, account, { from: erin, value: dec(2, 'ether') }) // await stabilityPool.provideToSP(dec(1, 18), { from: erin }) - const txA = await stabilityPool.withdrawFromSP(dec(10000, 18), { from: alice }) - const txB = await stabilityPool.withdrawFromSP(dec(10000, 18), { from: bob }) - const txC = await stabilityPool.withdrawFromSP(dec(10000, 18), { from: carol }) - const txD = await stabilityPool.withdrawFromSP(dec(10000, 18), { from: dennis }) + const txA = await stabilityPool.withdrawFromSP(dec(10000, 18), { from: alice }); + const txB = await stabilityPool.withdrawFromSP(dec(10000, 18), { from: bob }); + const txC = await stabilityPool.withdrawFromSP(dec(10000, 18), { from: carol }); + const txD = await stabilityPool.withdrawFromSP(dec(10000, 18), { from: dennis }); - const alice_ETHWithdrawn = th.getEventArgByName(txA, 'ETHGainWithdrawn', '_ETH').toString() - const bob_ETHWithdrawn = th.getEventArgByName(txB, 'ETHGainWithdrawn', '_ETH').toString() - const carol_ETHWithdrawn = th.getEventArgByName(txC, 'ETHGainWithdrawn', '_ETH').toString() - const dennis_ETHWithdrawn = th.getEventArgByName(txD, 'ETHGainWithdrawn', '_ETH').toString() + const alice_ETHWithdrawn = th.getEventArgByName(txA, "ETHGainWithdrawn", "_ETH").toString(); + const bob_ETHWithdrawn = th.getEventArgByName(txB, "ETHGainWithdrawn", "_ETH").toString(); + const carol_ETHWithdrawn = th.getEventArgByName(txC, "ETHGainWithdrawn", "_ETH").toString(); + const dennis_ETHWithdrawn = th.getEventArgByName(txD, "ETHGainWithdrawn", "_ETH").toString(); // Expect Alice And Bob's compounded deposit to be 0 Bold - assert.isAtMost(th.getDifference((await boldToken.balanceOf(alice)).toString(), '0'), 10000) - assert.isAtMost(th.getDifference((await boldToken.balanceOf(bob)).toString(), '0'), 10000) + assert.isAtMost(th.getDifference((await boldToken.balanceOf(alice)).toString(), "0"), 10000); + assert.isAtMost(th.getDifference((await boldToken.balanceOf(bob)).toString(), "0"), 10000); // Expect Alice and Bob's ETH Gain to be 100 ETH - assert.isAtMost(th.getDifference(alice_ETHWithdrawn, dec(995, 17)), 100000) - assert.isAtMost(th.getDifference(bob_ETHWithdrawn, dec(995, 17)), 100000) + assert.isAtMost(th.getDifference(alice_ETHWithdrawn, dec(995, 17)), 100000); + assert.isAtMost(th.getDifference(bob_ETHWithdrawn, dec(995, 17)), 100000); // Expect Carol And Dennis' compounded deposit to be 50 Bold - assert.isAtMost(th.getDifference((await boldToken.balanceOf(carol)).toString(), '5000000000000000000000'), 100000) - assert.isAtMost(th.getDifference((await boldToken.balanceOf(dennis)).toString(), '5000000000000000000000'), 100000) + assert.isAtMost( + th.getDifference((await boldToken.balanceOf(carol)).toString(), "5000000000000000000000"), + 100000, + ); + assert.isAtMost( + th.getDifference((await boldToken.balanceOf(dennis)).toString(), "5000000000000000000000"), + 100000, + ); // Expect Carol and and Dennis ETH Gain to be 50 ETH - assert.isAtMost(th.getDifference(carol_ETHWithdrawn, '49750000000000000000'), 100000) - assert.isAtMost(th.getDifference(dennis_ETHWithdrawn, '49750000000000000000'), 100000) - }) + assert.isAtMost(th.getDifference(carol_ETHWithdrawn, "49750000000000000000"), 100000); + assert.isAtMost(th.getDifference(dennis_ETHWithdrawn, "49750000000000000000"), 100000); + }); // A, B deposit 10000 // L1 cancels 10000, 1 // L2 10000, 200 empties Pool // C, D deposit 10000 - // L3 cancels 10000, 1 + // L3 cancels 10000, 1 // L2 20000, 200 empties Pool it("withdrawFromSP(): Pool-emptying liquidation increases epoch by one, resets scaleFactor to 0, and resets P to 1e18", async () => { // Whale opens Trove with 100k ETH - await th.openTroveWrapper(contracts, th._100pct, await getOpenTroveBoldAmount(dec(100000, 18)), whale, whale, 0,{ from: whale, value: dec(100000, 'ether') }) + await th.openTroveWrapper(contracts, th._100pct, await getOpenTroveBoldAmount(dec(100000, 18)), whale, whale, 0, { + from: whale, + value: dec(100000, "ether"), + }); // Whale transfers 10k Bold to A, B who then deposit it to the SP - const depositors = [alice, bob] + const depositors = [alice, bob]; for (const account of depositors) { - await boldToken.transfer(account, dec(10000, 18), { from: whale }) - await stabilityPool.provideToSP(dec(10000, 18), { from: account }) + await boldToken.transfer(account, dec(10000, 18), { from: whale }); + await stabilityPool.provideToSP(dec(10000, 18), { from: account }); } // 4 Defaulters open trove with 200% ICR - const defaulter_1_TroveId = await th.openTroveWrapper(contracts, th._100pct, await getOpenTroveBoldAmount(dec(10000, 18)), defaulter_1, defaulter_1, 0,{ from: defaulter_1, value: dec(100, 'ether') }) - const defaulter_2_TroveId = await th.openTroveWrapper(contracts, th._100pct, await getOpenTroveBoldAmount(dec(10000, 18)), defaulter_2, defaulter_2, 0, { from: defaulter_2, value: dec(100, 'ether') }) - const defaulter_3_TroveId = await th.openTroveWrapper(contracts, th._100pct, await getOpenTroveBoldAmount(dec(10000, 18)), defaulter_3, defaulter_3, 0, { from: defaulter_3, value: dec(100, 'ether') }) - const defaulter_4_TroveId = await th.openTroveWrapper(contracts, th._100pct, await getOpenTroveBoldAmount(dec(10000, 18)), defaulter_4, defaulter_4, 0, { from: defaulter_4, value: dec(100, 'ether') }) + const defaulter_1_TroveId = await th.openTroveWrapper( + contracts, + th._100pct, + await getOpenTroveBoldAmount(dec(10000, 18)), + defaulter_1, + defaulter_1, + 0, + { from: defaulter_1, value: dec(100, "ether") }, + ); + const defaulter_2_TroveId = await th.openTroveWrapper( + contracts, + th._100pct, + await getOpenTroveBoldAmount(dec(10000, 18)), + defaulter_2, + defaulter_2, + 0, + { from: defaulter_2, value: dec(100, "ether") }, + ); + const defaulter_3_TroveId = await th.openTroveWrapper( + contracts, + th._100pct, + await getOpenTroveBoldAmount(dec(10000, 18)), + defaulter_3, + defaulter_3, + 0, + { from: defaulter_3, value: dec(100, "ether") }, + ); + const defaulter_4_TroveId = await th.openTroveWrapper( + contracts, + th._100pct, + await getOpenTroveBoldAmount(dec(10000, 18)), + defaulter_4, + defaulter_4, + 0, + { from: defaulter_4, value: dec(100, "ether") }, + ); // price drops by 50%: defaulter ICR falls to 100% await priceFeed.setPrice(dec(100, 18)); - const epoch_0 = (await stabilityPool.currentEpoch()).toString() - const scale_0 = (await stabilityPool.currentScale()).toString() - const P_0 = (await stabilityPool.P()).toString() + const epoch_0 = (await stabilityPool.currentEpoch()).toString(); + const scale_0 = (await stabilityPool.currentScale()).toString(); + const P_0 = (await stabilityPool.P()).toString(); - assert.equal(epoch_0, '0') - assert.equal(scale_0, '0') - assert.equal(P_0, dec(1, 18)) + assert.equal(epoch_0, "0"); + assert.equal(scale_0, "0"); + assert.equal(P_0, dec(1, 18)); // Defaulter 1 liquidated. 10--0 Bold fully offset, Pool remains non-zero await troveManager.liquidate(defaulter_1_TroveId, { from: owner }); - //Check epoch, scale and sum - const epoch_1 = (await stabilityPool.currentEpoch()).toString() - const scale_1 = (await stabilityPool.currentScale()).toString() - const P_1 = (await stabilityPool.P()).toString() + // Check epoch, scale and sum + const epoch_1 = (await stabilityPool.currentEpoch()).toString(); + const scale_1 = (await stabilityPool.currentScale()).toString(); + const P_1 = (await stabilityPool.P()).toString(); - assert.equal(epoch_1, '0') - assert.equal(scale_1, '0') - assert.isAtMost(th.getDifference(P_1, dec(5, 17)), 1000) + assert.equal(epoch_1, "0"); + assert.equal(scale_1, "0"); + assert.isAtMost(th.getDifference(P_1, dec(5, 17)), 1000); // Defaulter 2 liquidated. 1--00 Bold, empties pool await troveManager.liquidate(defaulter_2_TroveId, { from: owner }); - //Check epoch, scale and sum - const epoch_2 = (await stabilityPool.currentEpoch()).toString() - const scale_2 = (await stabilityPool.currentScale()).toString() - const P_2 = (await stabilityPool.P()).toString() + // Check epoch, scale and sum + const epoch_2 = (await stabilityPool.currentEpoch()).toString(); + const scale_2 = (await stabilityPool.currentScale()).toString(); + const P_2 = (await stabilityPool.P()).toString(); - assert.equal(epoch_2, '1') - assert.equal(scale_2, '0') - assert.equal(P_2, dec(1, 18)) + assert.equal(epoch_2, "1"); + assert.equal(scale_2, "0"); + assert.equal(P_2, dec(1, 18)); // Carol, Dennis each deposit 10000 Bold - const depositors_2 = [carol, dennis] + const depositors_2 = [carol, dennis]; for (account of depositors) { - await boldToken.transfer(account, dec(10000, 18), { from: whale }) - await stabilityPool.provideToSP(dec(10000, 18), { from: account }) + await boldToken.transfer(account, dec(10000, 18), { from: whale }); + await stabilityPool.provideToSP(dec(10000, 18), { from: account }); } // Defaulter 3 liquidated. 10000 Bold fully offset, Pool remains non-zero await troveManager.liquidate(defaulter_3_TroveId, { from: owner }); - //Check epoch, scale and sum - const epoch_3 = (await stabilityPool.currentEpoch()).toString() - const scale_3 = (await stabilityPool.currentScale()).toString() - const P_3 = (await stabilityPool.P()).toString() + // Check epoch, scale and sum + const epoch_3 = (await stabilityPool.currentEpoch()).toString(); + const scale_3 = (await stabilityPool.currentScale()).toString(); + const P_3 = (await stabilityPool.P()).toString(); - assert.equal(epoch_3, '1') - assert.equal(scale_3, '0') - assert.isAtMost(th.getDifference(P_3, dec(5, 17)), 1000) + assert.equal(epoch_3, "1"); + assert.equal(scale_3, "0"); + assert.isAtMost(th.getDifference(P_3, dec(5, 17)), 1000); // Defaulter 4 liquidated. 10000 Bold, empties pool await troveManager.liquidate(defaulter_4_TroveId, { from: owner }); - //Check epoch, scale and sum - const epoch_4 = (await stabilityPool.currentEpoch()).toString() - const scale_4 = (await stabilityPool.currentScale()).toString() - const P_4 = (await stabilityPool.P()).toString() - - assert.equal(epoch_4, '2') - assert.equal(scale_4, '0') - assert.equal(P_4, dec(1, 18)) - }) + // Check epoch, scale and sum + const epoch_4 = (await stabilityPool.currentEpoch()).toString(); + const scale_4 = (await stabilityPool.currentScale()).toString(); + const P_4 = (await stabilityPool.P()).toString(); + assert.equal(epoch_4, "2"); + assert.equal(scale_4, "0"); + assert.equal(P_4, dec(1, 18)); + }); // A, B deposit 10000 // L1 cancels 20000, 200 // C, D, E deposit 10000, 20000, 30000 - // L2 cancels 10000,100 + // L2 cancels 10000,100 // A, B withdraw 0 Bold & 100e // C, D withdraw 5000 Bold & 50e it("withdrawFromSP(): Depositors withdraw correct compounded deposit after liquidation empties the pool", async () => { // Whale opens Trove with 100k ETH - await th.openTroveWrapper(contracts, th._100pct, await getOpenTroveBoldAmount(dec(100000, 18)), whale, whale, 0,{ from: whale, value: dec(100000, 'ether') }) + await th.openTroveWrapper(contracts, th._100pct, await getOpenTroveBoldAmount(dec(100000, 18)), whale, whale, 0, { + from: whale, + value: dec(100000, "ether"), + }); // Whale transfers 10k Bold to A, B who then deposit it to the SP - const depositors = [alice, bob] + const depositors = [alice, bob]; for (account of depositors) { - await boldToken.transfer(account, dec(10000, 18), { from: whale }) - await stabilityPool.provideToSP(dec(10000, 18), { from: account }) + await boldToken.transfer(account, dec(10000, 18), { from: whale }); + await stabilityPool.provideToSP(dec(10000, 18), { from: account }); } // 2 Defaulters open trove with 200% ICR - const defaulter_1_TroveId = await th.openTroveWrapper(contracts, th._100pct, await getOpenTroveBoldAmount(dec(20000, 18)), defaulter_1, defaulter_1, 0,{ from: defaulter_1, value: dec(200, 'ether') }) - const defaulter_2_TroveId = await th.openTroveWrapper(contracts, th._100pct, await getOpenTroveBoldAmount(dec(10000, 18)), defaulter_2, defaulter_2, 0, { from: defaulter_2, value: dec(100, 'ether') }) + const defaulter_1_TroveId = await th.openTroveWrapper( + contracts, + th._100pct, + await getOpenTroveBoldAmount(dec(20000, 18)), + defaulter_1, + defaulter_1, + 0, + { from: defaulter_1, value: dec(200, "ether") }, + ); + const defaulter_2_TroveId = await th.openTroveWrapper( + contracts, + th._100pct, + await getOpenTroveBoldAmount(dec(10000, 18)), + defaulter_2, + defaulter_2, + 0, + { from: defaulter_2, value: dec(100, "ether") }, + ); // price drops by 50% await priceFeed.setPrice(dec(100, 18)); @@ -978,46 +1506,55 @@ contract('StabilityPool - Withdrawal of stability deposit - Reward calculations' await troveManager.liquidate(defaulter_1_TroveId, { from: owner }); // Carol, Dennis, Erin each deposit 10000, 20000, 30000 Bold respectively - await boldToken.transfer(carol, dec(10000, 18), { from: whale }) - await stabilityPool.provideToSP(dec(10000, 18), { from: carol }) + await boldToken.transfer(carol, dec(10000, 18), { from: whale }); + await stabilityPool.provideToSP(dec(10000, 18), { from: carol }); - await boldToken.transfer(dennis, dec(20000, 18), { from: whale }) - await stabilityPool.provideToSP(dec(20000, 18), { from: dennis }) + await boldToken.transfer(dennis, dec(20000, 18), { from: whale }); + await stabilityPool.provideToSP(dec(20000, 18), { from: dennis }); - await boldToken.transfer(erin, dec(30000, 18), { from: whale }) - await stabilityPool.provideToSP(dec(30000, 18), { from: erin }) + await boldToken.transfer(erin, dec(30000, 18), { from: whale }); + await stabilityPool.provideToSP(dec(30000, 18), { from: erin }); // Defaulter 2 liquidated. 10000 Bold offset await troveManager.liquidate(defaulter_2_TroveId, { from: owner }); - const txA = await stabilityPool.withdrawFromSP(dec(10000, 18), { from: alice }) - const txB = await stabilityPool.withdrawFromSP(dec(10000, 18), { from: bob }) - const txC = await stabilityPool.withdrawFromSP(dec(10000, 18), { from: carol }) - const txD = await stabilityPool.withdrawFromSP(dec(20000, 18), { from: dennis }) - const txE = await stabilityPool.withdrawFromSP(dec(30000, 18), { from: erin }) + const txA = await stabilityPool.withdrawFromSP(dec(10000, 18), { from: alice }); + const txB = await stabilityPool.withdrawFromSP(dec(10000, 18), { from: bob }); + const txC = await stabilityPool.withdrawFromSP(dec(10000, 18), { from: carol }); + const txD = await stabilityPool.withdrawFromSP(dec(20000, 18), { from: dennis }); + const txE = await stabilityPool.withdrawFromSP(dec(30000, 18), { from: erin }); - const alice_ETHWithdrawn = th.getEventArgByName(txA, 'ETHGainWithdrawn', '_ETH').toString() - const bob_ETHWithdrawn = th.getEventArgByName(txB, 'ETHGainWithdrawn', '_ETH').toString() - const carol_ETHWithdrawn = th.getEventArgByName(txC, 'ETHGainWithdrawn', '_ETH').toString() - const dennis_ETHWithdrawn = th.getEventArgByName(txD, 'ETHGainWithdrawn', '_ETH').toString() - const erin_ETHWithdrawn = th.getEventArgByName(txE, 'ETHGainWithdrawn', '_ETH').toString() + const alice_ETHWithdrawn = th.getEventArgByName(txA, "ETHGainWithdrawn", "_ETH").toString(); + const bob_ETHWithdrawn = th.getEventArgByName(txB, "ETHGainWithdrawn", "_ETH").toString(); + const carol_ETHWithdrawn = th.getEventArgByName(txC, "ETHGainWithdrawn", "_ETH").toString(); + const dennis_ETHWithdrawn = th.getEventArgByName(txD, "ETHGainWithdrawn", "_ETH").toString(); + const erin_ETHWithdrawn = th.getEventArgByName(txE, "ETHGainWithdrawn", "_ETH").toString(); // Expect Alice And Bob's compounded deposit to be 0 Bold - assert.isAtMost(th.getDifference((await boldToken.balanceOf(alice)).toString(), '0'), 10000) - assert.isAtMost(th.getDifference((await boldToken.balanceOf(bob)).toString(), '0'), 10000) - - assert.isAtMost(th.getDifference((await boldToken.balanceOf(carol)).toString(), '8333333333333333333333'), 100000) - assert.isAtMost(th.getDifference((await boldToken.balanceOf(dennis)).toString(), '16666666666666666666666'), 100000) - assert.isAtMost(th.getDifference((await boldToken.balanceOf(erin)).toString(), '25000000000000000000000'), 100000) - - //Expect Alice and Bob's ETH Gain to be 1 ETH - assert.isAtMost(th.getDifference(alice_ETHWithdrawn, dec(995, 17)), 100000) - assert.isAtMost(th.getDifference(bob_ETHWithdrawn, dec(995, 17)), 100000) - - assert.isAtMost(th.getDifference(carol_ETHWithdrawn, '16583333333333333333'), 100000) - assert.isAtMost(th.getDifference(dennis_ETHWithdrawn, '33166666666666666667'), 100000) - assert.isAtMost(th.getDifference(erin_ETHWithdrawn, '49750000000000000000'), 100000) - }) + assert.isAtMost(th.getDifference((await boldToken.balanceOf(alice)).toString(), "0"), 10000); + assert.isAtMost(th.getDifference((await boldToken.balanceOf(bob)).toString(), "0"), 10000); + + assert.isAtMost( + th.getDifference((await boldToken.balanceOf(carol)).toString(), "8333333333333333333333"), + 100000, + ); + assert.isAtMost( + th.getDifference((await boldToken.balanceOf(dennis)).toString(), "16666666666666666666666"), + 100000, + ); + assert.isAtMost( + th.getDifference((await boldToken.balanceOf(erin)).toString(), "25000000000000000000000"), + 100000, + ); + + // Expect Alice and Bob's ETH Gain to be 1 ETH + assert.isAtMost(th.getDifference(alice_ETHWithdrawn, dec(995, 17)), 100000); + assert.isAtMost(th.getDifference(bob_ETHWithdrawn, dec(995, 17)), 100000); + + assert.isAtMost(th.getDifference(carol_ETHWithdrawn, "16583333333333333333"), 100000); + assert.isAtMost(th.getDifference(dennis_ETHWithdrawn, "33166666666666666667"), 100000); + assert.isAtMost(th.getDifference(erin_ETHWithdrawn, "49750000000000000000"), 100000); + }); // A deposits 10000 // L1, L2, L3 liquidated with 10000 Bold each @@ -1025,15 +1562,42 @@ contract('StabilityPool - Withdrawal of stability deposit - Reward calculations' // Expect A to withdraw 0 deposit and ether only from reward L1 it("withdrawFromSP(): single deposit fully offset. After subsequent liquidations, depositor withdraws 0 deposit and *only* the ETH Gain from one liquidation", async () => { // Whale opens Trove with 100k ETH - await th.openTroveWrapper(contracts, th._100pct, await getOpenTroveBoldAmount(dec(100000, 18)), whale, whale, 0,{ from: whale, value: dec(100000, 'ether') }) + await th.openTroveWrapper(contracts, th._100pct, await getOpenTroveBoldAmount(dec(100000, 18)), whale, whale, 0, { + from: whale, + value: dec(100000, "ether"), + }); - await boldToken.transfer(alice, dec(10000, 18), { from: whale }) - await stabilityPool.provideToSP(dec(10000, 18), { from: alice }) + await boldToken.transfer(alice, dec(10000, 18), { from: whale }); + await stabilityPool.provideToSP(dec(10000, 18), { from: alice }); // Defaulter 1,2,3 withdraw 10000 Bold - const defaulter_1_TroveId = await th.openTroveWrapper(contracts, th._100pct, await getOpenTroveBoldAmount(dec(10000, 18)), defaulter_1, defaulter_1, 0,{ from: defaulter_1, value: dec(100, 'ether') }) - const defaulter_2_TroveId = await th.openTroveWrapper(contracts, th._100pct, await getOpenTroveBoldAmount(dec(10000, 18)), defaulter_2, defaulter_2, 0, { from: defaulter_2, value: dec(100, 'ether') }) - const defaulter_3_TroveId = await th.openTroveWrapper(contracts, th._100pct, await getOpenTroveBoldAmount(dec(10000, 18)), defaulter_3, defaulter_3, 0, { from: defaulter_3, value: dec(100, 'ether') }) + const defaulter_1_TroveId = await th.openTroveWrapper( + contracts, + th._100pct, + await getOpenTroveBoldAmount(dec(10000, 18)), + defaulter_1, + defaulter_1, + 0, + { from: defaulter_1, value: dec(100, "ether") }, + ); + const defaulter_2_TroveId = await th.openTroveWrapper( + contracts, + th._100pct, + await getOpenTroveBoldAmount(dec(10000, 18)), + defaulter_2, + defaulter_2, + 0, + { from: defaulter_2, value: dec(100, "ether") }, + ); + const defaulter_3_TroveId = await th.openTroveWrapper( + contracts, + th._100pct, + await getOpenTroveBoldAmount(dec(10000, 18)), + defaulter_3, + defaulter_3, + 0, + { from: defaulter_3, value: dec(100, "ether") }, + ); // price drops by 50% await priceFeed.setPrice(dec(100, 18)); @@ -1043,16 +1607,16 @@ contract('StabilityPool - Withdrawal of stability deposit - Reward calculations' await troveManager.liquidate(defaulter_2_TroveId, { from: owner }); await troveManager.liquidate(defaulter_3_TroveId, { from: owner }); - const txA = await stabilityPool.withdrawFromSP(dec(10000, 18), { from: alice }) + const txA = await stabilityPool.withdrawFromSP(dec(10000, 18), { from: alice }); // Grab the ETH gain from the emitted event in the tx log - const alice_ETHWithdrawn = th.getEventArgByName(txA, 'ETHGainWithdrawn', '_ETH').toString() + const alice_ETHWithdrawn = th.getEventArgByName(txA, "ETHGainWithdrawn", "_ETH").toString(); - assert.isAtMost(th.getDifference((await boldToken.balanceOf(alice)).toString(), 0), 100000) - assert.isAtMost(th.getDifference(alice_ETHWithdrawn, dec(995, 17)), 100000) - }) + assert.isAtMost(th.getDifference((await boldToken.balanceOf(alice)).toString(), 0), 100000); + assert.isAtMost(th.getDifference(alice_ETHWithdrawn, dec(995, 17)), 100000); + }); - //--- Serial full offsets --- + // --- Serial full offsets --- // A,B deposit 10000 Bold // L1 cancels 20000 Bold, 2E @@ -1067,99 +1631,134 @@ contract('StabilityPool - Withdrawal of stability deposit - Reward calculations' it("withdrawFromSP(): Depositor withdraws correct compounded deposit after liquidation empties the pool", async () => { // Whale opens Trove with 100k ETH - await th.openTroveWrapper(contracts, th._100pct, await getOpenTroveBoldAmount(dec(100000, 18)), whale, whale, 0,{ from: whale, value: dec(100000, 'ether') }) + await th.openTroveWrapper(contracts, th._100pct, await getOpenTroveBoldAmount(dec(100000, 18)), whale, whale, 0, { + from: whale, + value: dec(100000, "ether"), + }); // 4 Defaulters open trove with 200% ICR - const defaulter_1_TroveId = await th.openTroveWrapper(contracts, th._100pct, await getOpenTroveBoldAmount(dec(20000, 18)), defaulter_1, defaulter_1, 0,{ from: defaulter_1, value: dec(200, 'ether') }) - const defaulter_2_TroveId = await th.openTroveWrapper(contracts, th._100pct, await getOpenTroveBoldAmount(dec(20000, 18)), defaulter_2, defaulter_2, 0, { from: defaulter_2, value: dec(200, 'ether') }) - const defaulter_3_TroveId = await th.openTroveWrapper(contracts, th._100pct, await getOpenTroveBoldAmount(dec(20000, 18)), defaulter_3, defaulter_3, 0, { from: defaulter_3, value: dec(200, 'ether') }) - const defaulter_4_TroveId = await th.openTroveWrapper(contracts, th._100pct, await getOpenTroveBoldAmount(dec(20000, 18)), defaulter_4, defaulter_4, 0, { from: defaulter_4, value: dec(200, 'ether') }) + const defaulter_1_TroveId = await th.openTroveWrapper( + contracts, + th._100pct, + await getOpenTroveBoldAmount(dec(20000, 18)), + defaulter_1, + defaulter_1, + 0, + { from: defaulter_1, value: dec(200, "ether") }, + ); + const defaulter_2_TroveId = await th.openTroveWrapper( + contracts, + th._100pct, + await getOpenTroveBoldAmount(dec(20000, 18)), + defaulter_2, + defaulter_2, + 0, + { from: defaulter_2, value: dec(200, "ether") }, + ); + const defaulter_3_TroveId = await th.openTroveWrapper( + contracts, + th._100pct, + await getOpenTroveBoldAmount(dec(20000, 18)), + defaulter_3, + defaulter_3, + 0, + { from: defaulter_3, value: dec(200, "ether") }, + ); + const defaulter_4_TroveId = await th.openTroveWrapper( + contracts, + th._100pct, + await getOpenTroveBoldAmount(dec(20000, 18)), + defaulter_4, + defaulter_4, + 0, + { from: defaulter_4, value: dec(200, "ether") }, + ); // price drops by 50%: defaulter ICR falls to 100% await priceFeed.setPrice(dec(100, 18)); // Alice, Bob each deposit 10k Bold - const depositors_1 = [alice, bob] + const depositors_1 = [alice, bob]; for (account of depositors_1) { - await boldToken.transfer(account, dec(10000, 18), { from: whale }) - await stabilityPool.provideToSP(dec(10000, 18), { from: account }) + await boldToken.transfer(account, dec(10000, 18), { from: whale }); + await stabilityPool.provideToSP(dec(10000, 18), { from: account }); } // Defaulter 1 liquidated. 20k Bold fully offset with pool. await troveManager.liquidate(defaulter_1_TroveId, { from: owner }); // Carol, Dennis each deposit 10000 Bold - const depositors_2 = [carol, dennis] + const depositors_2 = [carol, dennis]; for (account of depositors_2) { - await boldToken.transfer(account, dec(10000, 18), { from: whale }) - await stabilityPool.provideToSP(dec(10000, 18), { from: account }) + await boldToken.transfer(account, dec(10000, 18), { from: whale }); + await stabilityPool.provideToSP(dec(10000, 18), { from: account }); } // Defaulter 2 liquidated. 10000 Bold offset await troveManager.liquidate(defaulter_2_TroveId, { from: owner }); // Erin, Flyn each deposit 10000 Bold - const depositors_3 = [erin, flyn] + const depositors_3 = [erin, flyn]; for (account of depositors_3) { - await boldToken.transfer(account, dec(10000, 18), { from: whale }) - await stabilityPool.provideToSP(dec(10000, 18), { from: account }) + await boldToken.transfer(account, dec(10000, 18), { from: whale }); + await stabilityPool.provideToSP(dec(10000, 18), { from: account }); } // Defaulter 3 liquidated. 10000 Bold offset await troveManager.liquidate(defaulter_3_TroveId, { from: owner }); // Graham, Harriet each deposit 10000 Bold - const depositors_4 = [graham, harriet] + const depositors_4 = [graham, harriet]; for (account of depositors_4) { - await boldToken.transfer(account, dec(10000, 18), { from: whale }) - await stabilityPool.provideToSP(dec(10000, 18), { from: account }) + await boldToken.transfer(account, dec(10000, 18), { from: whale }); + await stabilityPool.provideToSP(dec(10000, 18), { from: account }); } // Defaulter 4 liquidated. 10k Bold offset await troveManager.liquidate(defaulter_4_TroveId, { from: owner }); - const txA = await stabilityPool.withdrawFromSP(dec(10000, 18), { from: alice }) - const txB = await stabilityPool.withdrawFromSP(dec(10000, 18), { from: bob }) - const txC = await stabilityPool.withdrawFromSP(dec(10000, 18), { from: carol }) - const txD = await stabilityPool.withdrawFromSP(dec(10000, 18), { from: dennis }) - const txE = await stabilityPool.withdrawFromSP(dec(10000, 18), { from: erin }) - const txF = await stabilityPool.withdrawFromSP(dec(10000, 18), { from: flyn }) - const txG = await stabilityPool.withdrawFromSP(dec(10000, 18), { from: graham }) - const txH = await stabilityPool.withdrawFromSP(dec(10000, 18), { from: harriet }) - - const alice_ETHWithdrawn = th.getEventArgByName(txA, 'ETHGainWithdrawn', '_ETH').toString() - const bob_ETHWithdrawn = th.getEventArgByName(txB, 'ETHGainWithdrawn', '_ETH').toString() - const carol_ETHWithdrawn = th.getEventArgByName(txC, 'ETHGainWithdrawn', '_ETH').toString() - const dennis_ETHWithdrawn = th.getEventArgByName(txD, 'ETHGainWithdrawn', '_ETH').toString() - const erin_ETHWithdrawn = th.getEventArgByName(txE, 'ETHGainWithdrawn', '_ETH').toString() - const flyn_ETHWithdrawn = th.getEventArgByName(txF, 'ETHGainWithdrawn', '_ETH').toString() - const graham_ETHWithdrawn = th.getEventArgByName(txG, 'ETHGainWithdrawn', '_ETH').toString() - const harriet_ETHWithdrawn = th.getEventArgByName(txH, 'ETHGainWithdrawn', '_ETH').toString() + const txA = await stabilityPool.withdrawFromSP(dec(10000, 18), { from: alice }); + const txB = await stabilityPool.withdrawFromSP(dec(10000, 18), { from: bob }); + const txC = await stabilityPool.withdrawFromSP(dec(10000, 18), { from: carol }); + const txD = await stabilityPool.withdrawFromSP(dec(10000, 18), { from: dennis }); + const txE = await stabilityPool.withdrawFromSP(dec(10000, 18), { from: erin }); + const txF = await stabilityPool.withdrawFromSP(dec(10000, 18), { from: flyn }); + const txG = await stabilityPool.withdrawFromSP(dec(10000, 18), { from: graham }); + const txH = await stabilityPool.withdrawFromSP(dec(10000, 18), { from: harriet }); + + const alice_ETHWithdrawn = th.getEventArgByName(txA, "ETHGainWithdrawn", "_ETH").toString(); + const bob_ETHWithdrawn = th.getEventArgByName(txB, "ETHGainWithdrawn", "_ETH").toString(); + const carol_ETHWithdrawn = th.getEventArgByName(txC, "ETHGainWithdrawn", "_ETH").toString(); + const dennis_ETHWithdrawn = th.getEventArgByName(txD, "ETHGainWithdrawn", "_ETH").toString(); + const erin_ETHWithdrawn = th.getEventArgByName(txE, "ETHGainWithdrawn", "_ETH").toString(); + const flyn_ETHWithdrawn = th.getEventArgByName(txF, "ETHGainWithdrawn", "_ETH").toString(); + const graham_ETHWithdrawn = th.getEventArgByName(txG, "ETHGainWithdrawn", "_ETH").toString(); + const harriet_ETHWithdrawn = th.getEventArgByName(txH, "ETHGainWithdrawn", "_ETH").toString(); // Expect all deposits to be 0 Bold - assert.isAtMost(th.getDifference((await boldToken.balanceOf(alice)).toString(), '0'), 100000) - assert.isAtMost(th.getDifference((await boldToken.balanceOf(bob)).toString(), '0'), 100000) - assert.isAtMost(th.getDifference((await boldToken.balanceOf(carol)).toString(), '0'), 100000) - assert.isAtMost(th.getDifference((await boldToken.balanceOf(dennis)).toString(), '0'), 100000) - assert.isAtMost(th.getDifference((await boldToken.balanceOf(erin)).toString(), '0'), 100000) - assert.isAtMost(th.getDifference((await boldToken.balanceOf(flyn)).toString(), '0'), 100000) - assert.isAtMost(th.getDifference((await boldToken.balanceOf(graham)).toString(), '0'), 100000) - assert.isAtMost(th.getDifference((await boldToken.balanceOf(harriet)).toString(), '0'), 100000) + assert.isAtMost(th.getDifference((await boldToken.balanceOf(alice)).toString(), "0"), 100000); + assert.isAtMost(th.getDifference((await boldToken.balanceOf(bob)).toString(), "0"), 100000); + assert.isAtMost(th.getDifference((await boldToken.balanceOf(carol)).toString(), "0"), 100000); + assert.isAtMost(th.getDifference((await boldToken.balanceOf(dennis)).toString(), "0"), 100000); + assert.isAtMost(th.getDifference((await boldToken.balanceOf(erin)).toString(), "0"), 100000); + assert.isAtMost(th.getDifference((await boldToken.balanceOf(flyn)).toString(), "0"), 100000); + assert.isAtMost(th.getDifference((await boldToken.balanceOf(graham)).toString(), "0"), 100000); + assert.isAtMost(th.getDifference((await boldToken.balanceOf(harriet)).toString(), "0"), 100000); /* Expect all ETH gains to be 100 ETH: Since each liquidation of empties the pool, depositors should only earn ETH from the single liquidation that cancelled with their deposit */ - assert.isAtMost(th.getDifference(alice_ETHWithdrawn, dec(995, 17)), 100000) - assert.isAtMost(th.getDifference(bob_ETHWithdrawn, dec(995, 17)), 100000) - assert.isAtMost(th.getDifference(carol_ETHWithdrawn, dec(995, 17)), 100000) - assert.isAtMost(th.getDifference(dennis_ETHWithdrawn, dec(995, 17)), 100000) - assert.isAtMost(th.getDifference(erin_ETHWithdrawn, dec(995, 17)), 100000) - assert.isAtMost(th.getDifference(flyn_ETHWithdrawn, dec(995, 17)), 100000) - assert.isAtMost(th.getDifference(graham_ETHWithdrawn, dec(995, 17)), 100000) - assert.isAtMost(th.getDifference(harriet_ETHWithdrawn, dec(995, 17)), 100000) - - const finalEpoch = (await stabilityPool.currentEpoch()).toString() - assert.equal(finalEpoch, 4) - }) + assert.isAtMost(th.getDifference(alice_ETHWithdrawn, dec(995, 17)), 100000); + assert.isAtMost(th.getDifference(bob_ETHWithdrawn, dec(995, 17)), 100000); + assert.isAtMost(th.getDifference(carol_ETHWithdrawn, dec(995, 17)), 100000); + assert.isAtMost(th.getDifference(dennis_ETHWithdrawn, dec(995, 17)), 100000); + assert.isAtMost(th.getDifference(erin_ETHWithdrawn, dec(995, 17)), 100000); + assert.isAtMost(th.getDifference(flyn_ETHWithdrawn, dec(995, 17)), 100000); + assert.isAtMost(th.getDifference(graham_ETHWithdrawn, dec(995, 17)), 100000); + assert.isAtMost(th.getDifference(harriet_ETHWithdrawn, dec(995, 17)), 100000); + + const finalEpoch = (await stabilityPool.currentEpoch()).toString(); + assert.equal(finalEpoch, 4); + }); // --- Scale factor tests --- @@ -1171,54 +1770,73 @@ contract('StabilityPool - Withdrawal of stability deposit - Reward calculations' // expect d(B) = d0(B)/100 // expect correct ETH gain, i.e. all of the reward - // - // TODO: Changes since v1 have introduced very slight precision error in this test. Potentially due to slightly different rounding + // + // TODO: Changes since v1 have introduced very slight precision error in this test. Potentially due to slightly different rounding // in helper functon getOpenTroveBoldAmount due to now-zero borrow fees. Double-check this when we write new SP arithmetic tests and fix the "P" issue. it.skip("withdrawFromSP(): deposit spans one scale factor change: Single depositor withdraws correct compounded deposit and ETH Gain after one liquidation", async () => { // Whale opens Trove with 100k ETH - await th.openTroveWrapper(contracts, th._100pct, await getOpenTroveBoldAmount(dec(100000, 18)), whale, whale, 0,{ from: whale, value: dec(100000, 'ether') }) + await th.openTroveWrapper(contracts, th._100pct, await getOpenTroveBoldAmount(dec(100000, 18)), whale, whale, 0, { + from: whale, + value: dec(100000, "ether"), + }); - await boldToken.transfer(alice, dec(10000, 18), { from: whale }) - await stabilityPool.provideToSP(dec(10000, 18), { from: alice }) + await boldToken.transfer(alice, dec(10000, 18), { from: whale }); + await stabilityPool.provideToSP(dec(10000, 18), { from: alice }); // Defaulter 1 withdraws 'almost' 10000 Bold: 9999.99991 Bold - const defaulter_1_TroveId = await th.openTroveWrapper(contracts, th._100pct, await getOpenTroveBoldAmount('9999999910000000000000'), defaulter_1, defaulter_1, 0,{ from: defaulter_1, value: dec(100, 'ether') }) - - assert.equal(await stabilityPool.currentScale(), '0') + const defaulter_1_TroveId = await th.openTroveWrapper( + contracts, + th._100pct, + await getOpenTroveBoldAmount("9999999910000000000000"), + defaulter_1, + defaulter_1, + 0, + { from: defaulter_1, value: dec(100, "ether") }, + ); + + assert.equal(await stabilityPool.currentScale(), "0"); // Defaulter 2 withdraws 9900 Bold - const defaulter_2_TroveId = await th.openTroveWrapper(contracts, th._100pct, await getOpenTroveBoldAmount(dec(9900, 18)), defaulter_2, defaulter_2, 0, { from: defaulter_2, value: dec(60, 'ether') }) + const defaulter_2_TroveId = await th.openTroveWrapper( + contracts, + th._100pct, + await getOpenTroveBoldAmount(dec(9900, 18)), + defaulter_2, + defaulter_2, + 0, + { from: defaulter_2, value: dec(60, "ether") }, + ); // price drops by 50% await priceFeed.setPrice(dec(100, 18)); // Defaulter 1 liquidated. Value of P reduced to 9e9. await troveManager.liquidate(defaulter_1_TroveId, { from: owner }); - assert.equal((await stabilityPool.P()).toString(), dec(9, 9)) + assert.equal((await stabilityPool.P()).toString(), dec(9, 9)); // Increasing the price for a moment to avoid pending liquidations to block withdrawal - await priceFeed.setPrice(dec(200, 18)) - const txA = await stabilityPool.withdrawFromSP(dec(10000, 18), { from: alice }) - await priceFeed.setPrice(dec(100, 18)) + await priceFeed.setPrice(dec(200, 18)); + const txA = await stabilityPool.withdrawFromSP(dec(10000, 18), { from: alice }); + await priceFeed.setPrice(dec(100, 18)); // Grab the ETH gain from the emitted event in the tx log - const alice_ETHWithdrawn = await th.getEventArgByName(txA, 'ETHGainWithdrawn', '_ETH').toString() + const alice_ETHWithdrawn = await th.getEventArgByName(txA, "ETHGainWithdrawn", "_ETH").toString(); - await boldToken.transfer(bob, dec(10000, 18), { from: whale }) - await stabilityPool.provideToSP(dec(10000, 18), { from: bob }) + await boldToken.transfer(bob, dec(10000, 18), { from: whale }); + await stabilityPool.provideToSP(dec(10000, 18), { from: bob }); // Defaulter 2 liquidated. 9900 Bold liquidated. P altered by a factor of 1-(9900/10000) = 0.01. Scale changed. await troveManager.liquidate(defaulter_2_TroveId, { from: owner }); - assert.equal(await stabilityPool.currentScale(), '1') + assert.equal(await stabilityPool.currentScale(), "1"); - const txB = await stabilityPool.withdrawFromSP(dec(10000, 18), { from: bob }) - const bob_ETHWithdrawn = await th.getEventArgByName(txB, 'ETHGainWithdrawn', '_ETH').toString() + const txB = await stabilityPool.withdrawFromSP(dec(10000, 18), { from: bob }); + const bob_ETHWithdrawn = await th.getEventArgByName(txB, "ETHGainWithdrawn", "_ETH").toString(); // Expect Bob to withdraw 1% of initial deposit (100 Bold) and all the liquidated ETH (60 ether) - assert.isAtMost(th.getDifference((await boldToken.balanceOf(bob)).toString(), '100000000000000000000'), 100000) - assert.isAtMost(th.getDifference(bob_ETHWithdrawn, '59700000000000000000'), 100000) - }) + assert.isAtMost(th.getDifference((await boldToken.balanceOf(bob)).toString(), "100000000000000000000"), 100000); + assert.isAtMost(th.getDifference(bob_ETHWithdrawn, "59700000000000000000"), 100000); + }); // A deposits 10000 // L1 brings P close to boundary, i.e. 9e-9: liquidate 9999.99991 Bold @@ -1228,77 +1846,96 @@ contract('StabilityPool - Withdrawal of stability deposit - Reward calculations' // expect d(B) = d0(B)/100 // expect correct ETH gain, i.e. all of the reward - // - // TODO: Changes since v1 have introduced very slight precision error in this test. Potentially due to slightly different rounding + // + // TODO: Changes since v1 have introduced very slight precision error in this test. Potentially due to slightly different rounding // in helper functon getOpenTroveBoldAmount due to now-zero borrow fees. Double-check this when we write new SP arithmetic tests and fix the "P" issue. it.skip("withdrawFromSP(): Several deposits of varying amounts span one scale factor change. Depositors withdraw correct compounded deposit and ETH Gain after one liquidation", async () => { // Whale opens Trove with 100k ETH - await th.openTroveWrapper(contracts, th._100pct, await getOpenTroveBoldAmount(dec(100000, 18)), whale, whale, 0,{ from: whale, value: dec(100000, 'ether') }) + await th.openTroveWrapper(contracts, th._100pct, await getOpenTroveBoldAmount(dec(100000, 18)), whale, whale, 0, { + from: whale, + value: dec(100000, "ether"), + }); - await boldToken.transfer(alice, dec(10000, 18), { from: whale }) - await stabilityPool.provideToSP(dec(10000, 18), { from: alice }) + await boldToken.transfer(alice, dec(10000, 18), { from: whale }); + await stabilityPool.provideToSP(dec(10000, 18), { from: alice }); // Defaulter 1 withdraws 'almost' 10k Bold. - const defaulter_1_TroveId = await th.openTroveWrapper(contracts, th._100pct, await getOpenTroveBoldAmount('9999999910000000000000'), defaulter_1, defaulter_1, 0,{ from: defaulter_1, value: dec(100, 'ether') }) + const defaulter_1_TroveId = await th.openTroveWrapper( + contracts, + th._100pct, + await getOpenTroveBoldAmount("9999999910000000000000"), + defaulter_1, + defaulter_1, + 0, + { from: defaulter_1, value: dec(100, "ether") }, + ); // Defaulter 2 withdraws 59400 Bold - const defaulter_2_TroveId = await th.openTroveWrapper(contracts, th._100pct, await getOpenTroveBoldAmount('59400000000000000000000'), defaulter_2, defaulter_2, 0, { from: defaulter_2, value: dec(330, 'ether') }) + const defaulter_2_TroveId = await th.openTroveWrapper( + contracts, + th._100pct, + await getOpenTroveBoldAmount("59400000000000000000000"), + defaulter_2, + defaulter_2, + 0, + { from: defaulter_2, value: dec(330, "ether") }, + ); // price drops by 50% await priceFeed.setPrice(dec(100, 18)); // Defaulter 1 liquidated. Value of P reduced to 9e9 await troveManager.liquidate(defaulter_1_TroveId, { from: owner }); - assert.equal((await stabilityPool.P()).toString(), dec(9, 9)) + assert.equal((await stabilityPool.P()).toString(), dec(9, 9)); - assert.equal(await stabilityPool.currentScale(), '0') + assert.equal(await stabilityPool.currentScale(), "0"); // Increasing the price for a moment to avoid pending liquidations to block withdrawal - await priceFeed.setPrice(dec(200, 18)) - const txA = await stabilityPool.withdrawFromSP(dec(10000, 18), { from: alice }) - await priceFeed.setPrice(dec(100, 18)) + await priceFeed.setPrice(dec(200, 18)); + const txA = await stabilityPool.withdrawFromSP(dec(10000, 18), { from: alice }); + await priceFeed.setPrice(dec(100, 18)); - //B, C, D deposit to Stability Pool - await boldToken.transfer(bob, dec(10000, 18), { from: whale }) - await stabilityPool.provideToSP(dec(10000, 18), { from: bob }) + // B, C, D deposit to Stability Pool + await boldToken.transfer(bob, dec(10000, 18), { from: whale }); + await stabilityPool.provideToSP(dec(10000, 18), { from: bob }); - await boldToken.transfer(carol, dec(20000, 18), { from: whale }) - await stabilityPool.provideToSP(dec(20000, 18), { from: carol }) + await boldToken.transfer(carol, dec(20000, 18), { from: whale }); + await stabilityPool.provideToSP(dec(20000, 18), { from: carol }); - await boldToken.transfer(dennis, dec(30000, 18), { from: whale }) - await stabilityPool.provideToSP(dec(30000, 18), { from: dennis }) + await boldToken.transfer(dennis, dec(30000, 18), { from: whale }); + await stabilityPool.provideToSP(dec(30000, 18), { from: dennis }); // 54000 Bold liquidated. P altered by a factor of 1-(59400/60000) = 0.01. Scale changed. const txL2 = await troveManager.liquidate(defaulter_2_TroveId, { from: owner }); - assert.isTrue(txL2.receipt.status) + assert.isTrue(txL2.receipt.status); - assert.equal(await stabilityPool.currentScale(), '1') + assert.equal(await stabilityPool.currentScale(), "1"); - const txB = await stabilityPool.withdrawFromSP(dec(10000, 18), { from: bob }) - const txC = await stabilityPool.withdrawFromSP(dec(20000, 18), { from: carol }) - const txD = await stabilityPool.withdrawFromSP(dec(30000, 18), { from: dennis }) + const txB = await stabilityPool.withdrawFromSP(dec(10000, 18), { from: bob }); + const txC = await stabilityPool.withdrawFromSP(dec(20000, 18), { from: carol }); + const txD = await stabilityPool.withdrawFromSP(dec(30000, 18), { from: dennis }); - /* Expect depositors to withdraw 1% of their initial deposit, and an ETH gain + /* Expect depositors to withdraw 1% of their initial deposit, and an ETH gain in proportion to their initial deposit: - + Bob: 1000 Bold, 55 Ether Carol: 2000 Bold, 110 Ether Dennis: 3000 Bold, 165 Ether - + Total: 6000 Bold, 300 Ether */ - assert.isAtMost(th.getDifference((await boldToken.balanceOf(bob)).toString(), dec(100, 18)), 100000) - assert.isAtMost(th.getDifference((await boldToken.balanceOf(carol)).toString(), dec(200, 18)), 100000) - assert.isAtMost(th.getDifference((await boldToken.balanceOf(dennis)).toString(), dec(300, 18)), 100000) + assert.isAtMost(th.getDifference((await boldToken.balanceOf(bob)).toString(), dec(100, 18)), 100000); + assert.isAtMost(th.getDifference((await boldToken.balanceOf(carol)).toString(), dec(200, 18)), 100000); + assert.isAtMost(th.getDifference((await boldToken.balanceOf(dennis)).toString(), dec(300, 18)), 100000); - const bob_ETHWithdrawn = await th.getEventArgByName(txB, 'ETHGainWithdrawn', '_ETH').toString() - const carol_ETHWithdrawn = await th.getEventArgByName(txC, 'ETHGainWithdrawn', '_ETH').toString() - const dennis_ETHWithdrawn = await th.getEventArgByName(txD, 'ETHGainWithdrawn', '_ETH').toString() + const bob_ETHWithdrawn = await th.getEventArgByName(txB, "ETHGainWithdrawn", "_ETH").toString(); + const carol_ETHWithdrawn = await th.getEventArgByName(txC, "ETHGainWithdrawn", "_ETH").toString(); + const dennis_ETHWithdrawn = await th.getEventArgByName(txD, "ETHGainWithdrawn", "_ETH").toString(); - assert.isAtMost(th.getDifference(bob_ETHWithdrawn, '54725000000000000000'), 100000) - assert.isAtMost(th.getDifference(carol_ETHWithdrawn, '109450000000000000000'), 100000) - assert.isAtMost(th.getDifference(dennis_ETHWithdrawn, '164175000000000000000'), 100000) - }) + assert.isAtMost(th.getDifference(bob_ETHWithdrawn, "54725000000000000000"), 100000); + assert.isAtMost(th.getDifference(carol_ETHWithdrawn, "109450000000000000000"), 100000); + assert.isAtMost(th.getDifference(dennis_ETHWithdrawn, "164175000000000000000"), 100000); + }); // Deposit's ETH reward spans one scale change - deposit reduced by correct amount @@ -1310,53 +1947,72 @@ contract('StabilityPool - Withdrawal of stability deposit - Reward calculations' // B withdraws // expect d(B) = d0(B) * 1e-5 // expect B gets entire ETH gain from L2 - // - // TODO: Changes since v1 have introduced very slight precision error in this test. Potentially due to slightly different rounding + // + // TODO: Changes since v1 have introduced very slight precision error in this test. Potentially due to slightly different rounding // in helper functon getOpenTroveBoldAmount due to now-zero borrow fees. Double-check this when we write new SP arithmetic tests and fix the "P" issue. it.skip("withdrawFromSP(): deposit spans one scale factor change: Single depositor withdraws correct compounded deposit and ETH Gain after one liquidation", async () => { // Whale opens Trove with 100k ETH - await th.openTroveWrapper(contracts, th._100pct, await getOpenTroveBoldAmount(dec(100000, 18)), whale, whale, 0,{ from: whale, value: dec(100000, 'ether') }) + await th.openTroveWrapper(contracts, th._100pct, await getOpenTroveBoldAmount(dec(100000, 18)), whale, whale, 0, { + from: whale, + value: dec(100000, "ether"), + }); - await boldToken.transfer(alice, dec(10000, 18), { from: whale }) - await stabilityPool.provideToSP(dec(10000, 18), { from: alice }) + await boldToken.transfer(alice, dec(10000, 18), { from: whale }); + await stabilityPool.provideToSP(dec(10000, 18), { from: alice }); // Defaulter 1 and default 2 each withdraw 9999.999999999 Bold - const defaulter_1_TroveId = await th.openTroveWrapper(contracts, th._100pct, await getOpenTroveBoldAmount(dec(99999, 17)), defaulter_1, defaulter_1, 0,{ from: defaulter_1, value: dec(100, 'ether') }) - const defaulter_2_TroveId = await th.openTroveWrapper(contracts, th._100pct, await getOpenTroveBoldAmount(dec(99999, 17)), defaulter_2, defaulter_2, 0, { from: defaulter_2, value: dec(100, 'ether') }) + const defaulter_1_TroveId = await th.openTroveWrapper( + contracts, + th._100pct, + await getOpenTroveBoldAmount(dec(99999, 17)), + defaulter_1, + defaulter_1, + 0, + { from: defaulter_1, value: dec(100, "ether") }, + ); + const defaulter_2_TroveId = await th.openTroveWrapper( + contracts, + th._100pct, + await getOpenTroveBoldAmount(dec(99999, 17)), + defaulter_2, + defaulter_2, + 0, + { from: defaulter_2, value: dec(100, "ether") }, + ); // price drops by 50%: defaulter 1 ICR falls to 100% await priceFeed.setPrice(dec(100, 18)); // Defaulter 1 liquidated. Value of P updated to to 1e13 const txL1 = await troveManager.liquidate(defaulter_1_TroveId, { from: owner }); - assert.isTrue(txL1.receipt.status) - th.logBN("P", await stabilityPool.P()) // 0.000009999999999999, so 1 wei less than expected - assert.equal(await stabilityPool.P(), dec(1, 13)) // P decreases. Expect P = 1e(18-5) = 1e13 - assert.equal(await stabilityPool.currentScale(), '0') + assert.isTrue(txL1.receipt.status); + th.logBN("P", await stabilityPool.P()); // 0.000009999999999999, so 1 wei less than expected + assert.equal(await stabilityPool.P(), dec(1, 13)); // P decreases. Expect P = 1e(18-5) = 1e13 + assert.equal(await stabilityPool.currentScale(), "0"); // Alice withdraws // Increasing the price for a moment to avoid pending liquidations to block withdrawal - await priceFeed.setPrice(dec(200, 18)) - const txA = await stabilityPool.withdrawFromSP(dec(10000, 18), { from: alice }) - await priceFeed.setPrice(dec(100, 18)) + await priceFeed.setPrice(dec(200, 18)); + const txA = await stabilityPool.withdrawFromSP(dec(10000, 18), { from: alice }); + await priceFeed.setPrice(dec(100, 18)); // Bob deposits 10k Bold - await boldToken.transfer(bob, dec(10000, 18), { from: whale }) - await stabilityPool.provideToSP(dec(10000, 18), { from: bob }) + await boldToken.transfer(bob, dec(10000, 18), { from: whale }); + await stabilityPool.provideToSP(dec(10000, 18), { from: bob }); // Defaulter 2 liquidated const txL2 = await troveManager.liquidate(defaulter_2_TroveId, { from: owner }); - assert.isTrue(txL2.receipt.status) - assert.equal(await stabilityPool.P(), dec(1, 17)) // Scale changes and P changes. P = 1e(13-5+9) = 1e17 - assert.equal(await stabilityPool.currentScale(), '1') + assert.isTrue(txL2.receipt.status); + assert.equal(await stabilityPool.P(), dec(1, 17)); // Scale changes and P changes. P = 1e(13-5+9) = 1e17 + assert.equal(await stabilityPool.currentScale(), "1"); - const txB = await stabilityPool.withdrawFromSP(dec(10000, 18), { from: bob }) - const bob_ETHWithdrawn = await th.getEventArgByName(txB, 'ETHGainWithdrawn', '_ETH').toString() + const txB = await stabilityPool.withdrawFromSP(dec(10000, 18), { from: bob }); + const bob_ETHWithdrawn = await th.getEventArgByName(txB, "ETHGainWithdrawn", "_ETH").toString(); // Bob should withdraw 1e-5 of initial deposit: 0.1 Bold and the full ETH gain of 100 ether - assert.isAtMost(th.getDifference((await boldToken.balanceOf(bob)).toString(), dec(1, 17)), 100000) - assert.isAtMost(th.getDifference(bob_ETHWithdrawn, dec(995, 17)), 100000000000) - }) + assert.isAtMost(th.getDifference((await boldToken.balanceOf(bob)).toString(), dec(1, 17)), 100000); + assert.isAtMost(th.getDifference(bob_ETHWithdrawn, dec(995, 17)), 100000000000); + }); // A make deposit 10000 Bold // L1 brings P to 1e-5*P. L1: 9999.9000000000000000 Bold @@ -1366,19 +2022,38 @@ contract('StabilityPool - Withdrawal of stability deposit - Reward calculations' // B withdraws // expect d(B) = d0(B) * 1e-5 // expect B gets entire ETH gain from L2 - // - // TODO: Changes since v1 have introduced very slight precision error in this test. Potentially due to slightly different rounding + // + // TODO: Changes since v1 have introduced very slight precision error in this test. Potentially due to slightly different rounding // in helper functon getOpenTroveBoldAmount due to now-zero borrow fees. Double-check this when we write new SP arithmetic tests and fix the "P" issue. it.skip("withdrawFromSP(): Several deposits of varying amounts span one scale factor change. Depositors withdraws correct compounded deposit and ETH Gain after one liquidation", async () => { // Whale opens Trove with 100k ETH - await th.openTroveWrapper(contracts, th._100pct, await getOpenTroveBoldAmount(dec(100000, 18)), whale, whale, 0,{ from: whale, value: dec(100000, 'ether') }) + await th.openTroveWrapper(contracts, th._100pct, await getOpenTroveBoldAmount(dec(100000, 18)), whale, whale, 0, { + from: whale, + value: dec(100000, "ether"), + }); - await boldToken.transfer(alice, dec(10000, 18), { from: whale }) - await stabilityPool.provideToSP(dec(10000, 18), { from: alice }) + await boldToken.transfer(alice, dec(10000, 18), { from: whale }); + await stabilityPool.provideToSP(dec(10000, 18), { from: alice }); // Defaulter 1 and default 2 withdraw up to debt of 9999.9 Bold and 59999.4 Bold - const defaulter_1_TroveId = await th.openTroveWrapper(contracts, th._100pct, await getOpenTroveBoldAmount('9999900000000000000000'), defaulter_1, defaulter_1, 0,{ from: defaulter_1, value: dec(100, 'ether') }) - const defaulter_2_TroveId = await th.openTroveWrapper(contracts, th._100pct, await getOpenTroveBoldAmount('59999400000000000000000'), defaulter_2, defaulter_2, 0, { from: defaulter_2, value: dec(600, 'ether') }) + const defaulter_1_TroveId = await th.openTroveWrapper( + contracts, + th._100pct, + await getOpenTroveBoldAmount("9999900000000000000000"), + defaulter_1, + defaulter_1, + 0, + { from: defaulter_1, value: dec(100, "ether") }, + ); + const defaulter_2_TroveId = await th.openTroveWrapper( + contracts, + th._100pct, + await getOpenTroveBoldAmount("59999400000000000000000"), + defaulter_2, + defaulter_2, + 0, + { from: defaulter_2, value: dec(600, "ether") }, + ); // price drops by 50% await priceFeed.setPrice(dec(100, 18)); @@ -1386,74 +2061,85 @@ contract('StabilityPool - Withdrawal of stability deposit - Reward calculations' // Defaulter 1 liquidated. Value of P updated to 1e13 const txL1 = await troveManager.liquidate(defaulter_1_TroveId, { from: owner }); th.logBN("P", await stabilityPool.P()); // P = 0.000009999999999999, i.e. 1 wei less than expected - assert.equal(await stabilityPool.P(), dec(1, 13)) // P decreases. Expect P = 1e(18-5) = 1e13 - assert.equal(await stabilityPool.currentScale(), '0') + assert.equal(await stabilityPool.P(), dec(1, 13)); // P decreases. Expect P = 1e(18-5) = 1e13 + assert.equal(await stabilityPool.currentScale(), "0"); // Alice withdraws // Increasing the price for a moment to avoid pending liquidations to block withdrawal - await priceFeed.setPrice(dec(200, 18)) - const txA = await stabilityPool.withdrawFromSP(dec(100, 18), { from: alice }) - await priceFeed.setPrice(dec(100, 18)) + await priceFeed.setPrice(dec(200, 18)); + const txA = await stabilityPool.withdrawFromSP(dec(100, 18), { from: alice }); + await priceFeed.setPrice(dec(100, 18)); // B, C, D deposit 10000, 20000, 30000 Bold - await boldToken.transfer(bob, dec(10000, 18), { from: whale }) - await stabilityPool.provideToSP(dec(10000, 18), { from: bob }) + await boldToken.transfer(bob, dec(10000, 18), { from: whale }); + await stabilityPool.provideToSP(dec(10000, 18), { from: bob }); - await boldToken.transfer(carol, dec(20000, 18), { from: whale }) - await stabilityPool.provideToSP(dec(20000, 18), { from: carol }) + await boldToken.transfer(carol, dec(20000, 18), { from: whale }); + await stabilityPool.provideToSP(dec(20000, 18), { from: carol }); - await boldToken.transfer(dennis, dec(30000, 18), { from: whale }) - await stabilityPool.provideToSP(dec(30000, 18), { from: dennis }) + await boldToken.transfer(dennis, dec(30000, 18), { from: whale }); + await stabilityPool.provideToSP(dec(30000, 18), { from: dennis }); // Defaulter 2 liquidated const txL2 = await troveManager.liquidate(defaulter_2_TroveId, { from: owner }); - assert.isTrue(txL2.receipt.status) - assert.equal(await stabilityPool.P(), dec(1, 17)) // P decreases. P = 1e(13-5+9) = 1e17 - assert.equal(await stabilityPool.currentScale(), '1') + assert.isTrue(txL2.receipt.status); + assert.equal(await stabilityPool.P(), dec(1, 17)); // P decreases. P = 1e(13-5+9) = 1e17 + assert.equal(await stabilityPool.currentScale(), "1"); - const txB = await stabilityPool.withdrawFromSP(dec(10000, 18), { from: bob }) - const bob_ETHWithdrawn = await th.getEventArgByName(txB, 'ETHGainWithdrawn', '_ETH').toString() + const txB = await stabilityPool.withdrawFromSP(dec(10000, 18), { from: bob }); + const bob_ETHWithdrawn = await th.getEventArgByName(txB, "ETHGainWithdrawn", "_ETH").toString(); - const txC = await stabilityPool.withdrawFromSP(dec(20000, 18), { from: carol }) - const carol_ETHWithdrawn = await th.getEventArgByName(txC, 'ETHGainWithdrawn', '_ETH').toString() + const txC = await stabilityPool.withdrawFromSP(dec(20000, 18), { from: carol }); + const carol_ETHWithdrawn = await th.getEventArgByName(txC, "ETHGainWithdrawn", "_ETH").toString(); - const txD = await stabilityPool.withdrawFromSP(dec(30000, 18), { from: dennis }) - const dennis_ETHWithdrawn = await th.getEventArgByName(txD, 'ETHGainWithdrawn', '_ETH').toString() + const txD = await stabilityPool.withdrawFromSP(dec(30000, 18), { from: dennis }); + const dennis_ETHWithdrawn = await th.getEventArgByName(txD, "ETHGainWithdrawn", "_ETH").toString(); // {B, C, D} should have a compounded deposit of {0.1, 0.2, 0.3} Bold - assert.isAtMost(th.getDifference((await boldToken.balanceOf(bob)).toString(), dec(1, 17)), 100000) - assert.isAtMost(th.getDifference((await boldToken.balanceOf(carol)).toString(), dec(2, 17)), 100000) - assert.isAtMost(th.getDifference((await boldToken.balanceOf(dennis)).toString(), dec(3, 17)), 100000) + assert.isAtMost(th.getDifference((await boldToken.balanceOf(bob)).toString(), dec(1, 17)), 100000); + assert.isAtMost(th.getDifference((await boldToken.balanceOf(carol)).toString(), dec(2, 17)), 100000); + assert.isAtMost(th.getDifference((await boldToken.balanceOf(dennis)).toString(), dec(3, 17)), 100000); - assert.isAtMost(th.getDifference(bob_ETHWithdrawn, dec(995, 17)), 10000000000) - assert.isAtMost(th.getDifference(carol_ETHWithdrawn, dec(1990, 17)), 100000000000) - assert.isAtMost(th.getDifference(dennis_ETHWithdrawn, dec(2985, 17)), 100000000000) - }) + assert.isAtMost(th.getDifference(bob_ETHWithdrawn, dec(995, 17)), 10000000000); + assert.isAtMost(th.getDifference(carol_ETHWithdrawn, dec(1990, 17)), 100000000000); + assert.isAtMost(th.getDifference(dennis_ETHWithdrawn, dec(2985, 17)), 100000000000); + }); // A make deposit 10000 Bold // L1 brings P to (~1e-10)*P. L1: 9999.9999999000000000 Bold // Expect A to withdraw 0 deposit it("withdrawFromSP(): Deposit that decreases to less than 1e-9 of it's original value is reduced to 0", async () => { // Whale opens Trove with 100k ETH - await th.openTroveWrapper(contracts, th._100pct, await getOpenTroveBoldAmount(dec(100000, 18)), whale, whale, 0,{ from: whale, value: dec(100000, 'ether') }) + await th.openTroveWrapper(contracts, th._100pct, await getOpenTroveBoldAmount(dec(100000, 18)), whale, whale, 0, { + from: whale, + value: dec(100000, "ether"), + }); // Defaulters 1 withdraws 9999.9999999 Bold - const defaulter_1_TroveId = await th.openTroveWrapper(contracts, th._100pct, await getOpenTroveBoldAmount('9999999999900000000000'), defaulter_1, defaulter_1, 0,{ from: defaulter_1, value: dec(100, 'ether') }) + const defaulter_1_TroveId = await th.openTroveWrapper( + contracts, + th._100pct, + await getOpenTroveBoldAmount("9999999999900000000000"), + defaulter_1, + defaulter_1, + 0, + { from: defaulter_1, value: dec(100, "ether") }, + ); // Price drops by 50% await priceFeed.setPrice(dec(100, 18)); - await boldToken.transfer(alice, dec(10000, 18), { from: whale }) - await stabilityPool.provideToSP(dec(10000, 18), { from: alice }) + await boldToken.transfer(alice, dec(10000, 18), { from: whale }); + await stabilityPool.provideToSP(dec(10000, 18), { from: alice }); // Defaulter 1 liquidated. P -> (~1e-10)*P const txL1 = await troveManager.liquidate(defaulter_1_TroveId, { from: owner }); - assert.isTrue(txL1.receipt.status) + assert.isTrue(txL1.receipt.status); - const aliceDeposit = (await stabilityPool.getCompoundedBoldDeposit(alice)).toString() + const aliceDeposit = (await stabilityPool.getCompoundedBoldDeposit(alice)).toString(); // console.log(`alice deposit: ${aliceDeposit}`) - assert.equal(aliceDeposit, 0) - }) + assert.equal(aliceDeposit, 0); + }); // --- Serial scale changes --- @@ -1467,305 +2153,424 @@ contract('StabilityPool - Withdrawal of stability deposit - Reward calculations' L4 decreases P by(~1e-5)P. L4: 9999.900000000000000000 Bold, 1 ETH expect A, B, C, D each withdraw ~100 Ether */ - // TODO: Changes since v1 have introduced very slight precision error in this test. Potentially due to slightly different rounding + // TODO: Changes since v1 have introduced very slight precision error in this test. Potentially due to slightly different rounding // in helper functon getOpenTroveBoldAmount due to now-zero borrow fees. Double-check this when we write new SP arithmetic tests and fix the "P" issue. it.skip("withdrawFromSP(): Several deposits of 10000 Bold span one scale factor change. Depositors withdraws correct compounded deposit and ETH Gain after one liquidation", async () => { // Whale opens Trove with 100k ETH - await th.openTroveWrapper(contracts, th._100pct, await getOpenTroveBoldAmount(dec(100000, 18)), whale, whale, 0,{ from: whale, value: dec(100000, 'ether') }) + await th.openTroveWrapper(contracts, th._100pct, await getOpenTroveBoldAmount(dec(100000, 18)), whale, whale, 0, { + from: whale, + value: dec(100000, "ether"), + }); // Defaulters 1-4 each withdraw 9999.9 Bold - const defaulter_1_TroveId = await th.openTroveWrapper(contracts, th._100pct, await getOpenTroveBoldAmount('9999900000000000000000'), defaulter_1, defaulter_1, 0,{ from: defaulter_1, value: dec(100, 'ether') }) - const defaulter_2_TroveId = await th.openTroveWrapper(contracts, th._100pct, await getOpenTroveBoldAmount('9999900000000000000000'), defaulter_2, defaulter_2, 0, { from: defaulter_2, value: dec(100, 'ether') }) - const defaulter_3_TroveId = await th.openTroveWrapper(contracts, th._100pct, await getOpenTroveBoldAmount('9999900000000000000000'), defaulter_3, defaulter_3, 0, { from: defaulter_3, value: dec(100, 'ether') }) - const defaulter_4_TroveId = await th.openTroveWrapper(contracts, th._100pct, await getOpenTroveBoldAmount('9999900000000000000000'), defaulter_4, defaulter_4, 0, { from: defaulter_4, value: dec(100, 'ether') }) + const defaulter_1_TroveId = await th.openTroveWrapper( + contracts, + th._100pct, + await getOpenTroveBoldAmount("9999900000000000000000"), + defaulter_1, + defaulter_1, + 0, + { from: defaulter_1, value: dec(100, "ether") }, + ); + const defaulter_2_TroveId = await th.openTroveWrapper( + contracts, + th._100pct, + await getOpenTroveBoldAmount("9999900000000000000000"), + defaulter_2, + defaulter_2, + 0, + { from: defaulter_2, value: dec(100, "ether") }, + ); + const defaulter_3_TroveId = await th.openTroveWrapper( + contracts, + th._100pct, + await getOpenTroveBoldAmount("9999900000000000000000"), + defaulter_3, + defaulter_3, + 0, + { from: defaulter_3, value: dec(100, "ether") }, + ); + const defaulter_4_TroveId = await th.openTroveWrapper( + contracts, + th._100pct, + await getOpenTroveBoldAmount("9999900000000000000000"), + defaulter_4, + defaulter_4, + 0, + { from: defaulter_4, value: dec(100, "ether") }, + ); // price drops by 50% await priceFeed.setPrice(dec(100, 18)); - await boldToken.transfer(alice, dec(10000, 18), { from: whale }) - await stabilityPool.provideToSP(dec(10000, 18), { from: alice }) + await boldToken.transfer(alice, dec(10000, 18), { from: whale }); + await stabilityPool.provideToSP(dec(10000, 18), { from: alice }); // Defaulter 1 liquidated. P updated to 1e13 const txL1 = await troveManager.liquidate(defaulter_1_TroveId, { from: owner }); - assert.isTrue(txL1.receipt.status) - th.logBN("P", await stabilityPool.P()) // P 0.000009999999999999, 1 wei less than expecteed - assert.equal(await stabilityPool.P(), dec(1, 13)) // Expect P decreases to 1e(18-5) = 1e13 - assert.equal(await stabilityPool.currentScale(), '0') + assert.isTrue(txL1.receipt.status); + th.logBN("P", await stabilityPool.P()); // P 0.000009999999999999, 1 wei less than expecteed + assert.equal(await stabilityPool.P(), dec(1, 13)); // Expect P decreases to 1e(18-5) = 1e13 + assert.equal(await stabilityPool.currentScale(), "0"); // B deposits 9999.9 Bold - await boldToken.transfer(bob, dec(99999, 17), { from: whale }) - await stabilityPool.provideToSP(dec(99999, 17), { from: bob }) + await boldToken.transfer(bob, dec(99999, 17), { from: whale }); + await stabilityPool.provideToSP(dec(99999, 17), { from: bob }); // Defaulter 2 liquidated const txL2 = await troveManager.liquidate(defaulter_2_TroveId, { from: owner }); - assert.isTrue(txL2.receipt.status) - assert.equal(await stabilityPool.P(), dec(1, 17)) // Scale changes and P changes to 1e(13-5+9) = 1e17 - assert.equal(await stabilityPool.currentScale(), '1') + assert.isTrue(txL2.receipt.status); + assert.equal(await stabilityPool.P(), dec(1, 17)); // Scale changes and P changes to 1e(13-5+9) = 1e17 + assert.equal(await stabilityPool.currentScale(), "1"); // C deposits 9999.9 Bold - await boldToken.transfer(carol, dec(99999, 17), { from: whale }) - await stabilityPool.provideToSP(dec(99999, 17), { from: carol }) + await boldToken.transfer(carol, dec(99999, 17), { from: whale }); + await stabilityPool.provideToSP(dec(99999, 17), { from: carol }); // Defaulter 3 liquidated const txL3 = await troveManager.liquidate(defaulter_3_TroveId, { from: owner }); - assert.isTrue(txL3.receipt.status) - assert.equal(await stabilityPool.P(), dec(1, 12)) // P decreases to 1e(17-5) = 1e12 - assert.equal(await stabilityPool.currentScale(), '1') + assert.isTrue(txL3.receipt.status); + assert.equal(await stabilityPool.P(), dec(1, 12)); // P decreases to 1e(17-5) = 1e12 + assert.equal(await stabilityPool.currentScale(), "1"); // D deposits 9999.9 Bold - await boldToken.transfer(dennis, dec(99999, 17), { from: whale }) - await stabilityPool.provideToSP(dec(99999, 17), { from: dennis }) + await boldToken.transfer(dennis, dec(99999, 17), { from: whale }); + await stabilityPool.provideToSP(dec(99999, 17), { from: dennis }); // Defaulter 4 liquidated const txL4 = await troveManager.liquidate(defaulter_4_TroveId, { from: owner }); - assert.isTrue(txL4.receipt.status) - assert.equal(await stabilityPool.P(), dec(1, 16)) // Scale changes and P changes to 1e(12-5+9) = 1e16 - assert.equal(await stabilityPool.currentScale(), '2') + assert.isTrue(txL4.receipt.status); + assert.equal(await stabilityPool.P(), dec(1, 16)); // Scale changes and P changes to 1e(12-5+9) = 1e16 + assert.equal(await stabilityPool.currentScale(), "2"); - const txA = await stabilityPool.withdrawFromSP(dec(10000, 18), { from: alice }) - const txB = await stabilityPool.withdrawFromSP(dec(10000, 18), { from: bob }) - const txC = await stabilityPool.withdrawFromSP(dec(10000, 18), { from: carol }) - const txD = await stabilityPool.withdrawFromSP(dec(10000, 18), { from: dennis }) + const txA = await stabilityPool.withdrawFromSP(dec(10000, 18), { from: alice }); + const txB = await stabilityPool.withdrawFromSP(dec(10000, 18), { from: bob }); + const txC = await stabilityPool.withdrawFromSP(dec(10000, 18), { from: carol }); + const txD = await stabilityPool.withdrawFromSP(dec(10000, 18), { from: dennis }); - const alice_ETHWithdrawn = await th.getEventArgByName(txA, 'ETHGainWithdrawn', '_ETH').toString() - const bob_ETHWithdrawn = await th.getEventArgByName(txB, 'ETHGainWithdrawn', '_ETH').toString() - const carol_ETHWithdrawn = await th.getEventArgByName(txC, 'ETHGainWithdrawn', '_ETH').toString() - const dennis_ETHWithdrawn = await th.getEventArgByName(txD, 'ETHGainWithdrawn', '_ETH').toString() + const alice_ETHWithdrawn = await th.getEventArgByName(txA, "ETHGainWithdrawn", "_ETH").toString(); + const bob_ETHWithdrawn = await th.getEventArgByName(txB, "ETHGainWithdrawn", "_ETH").toString(); + const carol_ETHWithdrawn = await th.getEventArgByName(txC, "ETHGainWithdrawn", "_ETH").toString(); + const dennis_ETHWithdrawn = await th.getEventArgByName(txD, "ETHGainWithdrawn", "_ETH").toString(); // A, B, C should withdraw 0 - their deposits have been completely used up - assert.equal(await boldToken.balanceOf(alice), '0') - assert.equal(await boldToken.balanceOf(alice), '0') - assert.equal(await boldToken.balanceOf(alice), '0') + assert.equal(await boldToken.balanceOf(alice), "0"); + assert.equal(await boldToken.balanceOf(alice), "0"); + assert.equal(await boldToken.balanceOf(alice), "0"); // D should withdraw around 0.9999 Bold, since his deposit of 9999.9 was reduced by a factor of 1e-5 - assert.isAtMost(th.getDifference((await boldToken.balanceOf(dennis)).toString(), dec(99999, 12)), 100000) + assert.isAtMost(th.getDifference((await boldToken.balanceOf(dennis)).toString(), dec(99999, 12)), 100000); // 99.5 ETH is offset at each L, 0.5 goes to gas comp // Each depositor gets ETH rewards of around 99.5 ETH - 1e17 error tolerance - assert.isTrue(toBN(alice_ETHWithdrawn).sub(toBN(dec(995, 17))).abs().lte(toBN(dec(1, 17)))) - assert.isTrue(toBN(bob_ETHWithdrawn).sub(toBN(dec(995, 17))).abs().lte(toBN(dec(1, 17)))) - assert.isTrue(toBN(carol_ETHWithdrawn).sub(toBN(dec(995, 17))).abs().lte(toBN(dec(1, 17)))) - assert.isTrue(toBN(dennis_ETHWithdrawn).sub(toBN(dec(995, 17))).abs().lte(toBN(dec(1, 17)))) - }) + assert.isTrue(toBN(alice_ETHWithdrawn).sub(toBN(dec(995, 17))).abs().lte(toBN(dec(1, 17)))); + assert.isTrue(toBN(bob_ETHWithdrawn).sub(toBN(dec(995, 17))).abs().lte(toBN(dec(1, 17)))); + assert.isTrue(toBN(carol_ETHWithdrawn).sub(toBN(dec(995, 17))).abs().lte(toBN(dec(1, 17)))); + assert.isTrue(toBN(dennis_ETHWithdrawn).sub(toBN(dec(995, 17))).abs().lte(toBN(dec(1, 17)))); + }); it("withdrawFromSP(): 2 depositors can withdraw after each receiving half of a pool-emptying liquidation", async () => { // Whale opens Trove with 100k ETH - await th.openTroveWrapper(contracts, th._100pct, await getOpenTroveBoldAmount(dec(100000, 18)), whale, whale, 0,{ from: whale, value: dec(100000, 'ether') }) + await th.openTroveWrapper(contracts, th._100pct, await getOpenTroveBoldAmount(dec(100000, 18)), whale, whale, 0, { + from: whale, + value: dec(100000, "ether"), + }); // Defaulters 1-3 each withdraw 24100, 24300, 24500 Bold (inc gas comp) - const defaulter_1_TroveId = await th.openTroveWrapper(contracts, th._100pct, await getOpenTroveBoldAmount(dec(24100, 18)), defaulter_1, defaulter_1, 0,{ from: defaulter_1, value: dec(200, 'ether') }) - const defaulter_2_TroveId = await th.openTroveWrapper(contracts, th._100pct, await getOpenTroveBoldAmount(dec(24300, 18)), defaulter_2, defaulter_2, 0, { from: defaulter_2, value: dec(200, 'ether') }) - const defaulter_3_TroveId = await th.openTroveWrapper(contracts, th._100pct, await getOpenTroveBoldAmount(dec(24500, 18)), defaulter_3, defaulter_3, 0, { from: defaulter_3, value: dec(200, 'ether') }) + const defaulter_1_TroveId = await th.openTroveWrapper( + contracts, + th._100pct, + await getOpenTroveBoldAmount(dec(24100, 18)), + defaulter_1, + defaulter_1, + 0, + { from: defaulter_1, value: dec(200, "ether") }, + ); + const defaulter_2_TroveId = await th.openTroveWrapper( + contracts, + th._100pct, + await getOpenTroveBoldAmount(dec(24300, 18)), + defaulter_2, + defaulter_2, + 0, + { from: defaulter_2, value: dec(200, "ether") }, + ); + const defaulter_3_TroveId = await th.openTroveWrapper( + contracts, + th._100pct, + await getOpenTroveBoldAmount(dec(24500, 18)), + defaulter_3, + defaulter_3, + 0, + { from: defaulter_3, value: dec(200, "ether") }, + ); // price drops by 50% await priceFeed.setPrice(dec(100, 18)); - // A, B provide 10k Bold - await boldToken.transfer(A, dec(10000, 18), { from: whale }) - await boldToken.transfer(B, dec(10000, 18), { from: whale }) - await stabilityPool.provideToSP(dec(10000, 18), { from: A }) - await stabilityPool.provideToSP(dec(10000, 18), { from: B }) + // A, B provide 10k Bold + await boldToken.transfer(A, dec(10000, 18), { from: whale }); + await boldToken.transfer(B, dec(10000, 18), { from: whale }); + await stabilityPool.provideToSP(dec(10000, 18), { from: A }); + await stabilityPool.provideToSP(dec(10000, 18), { from: B }); // Defaulter 1 liquidated. SP emptied const txL1 = await troveManager.liquidate(defaulter_1_TroveId, { from: owner }); - assert.isTrue(txL1.receipt.status) + assert.isTrue(txL1.receipt.status); // Check compounded deposits - const A_deposit = await stabilityPool.getCompoundedBoldDeposit(A) - const B_deposit = await stabilityPool.getCompoundedBoldDeposit(B) + const A_deposit = await stabilityPool.getCompoundedBoldDeposit(A); + const B_deposit = await stabilityPool.getCompoundedBoldDeposit(B); // console.log(`A_deposit: ${A_deposit}`) // console.log(`B_deposit: ${B_deposit}`) - assert.equal(A_deposit, '0') - assert.equal(B_deposit, '0') + assert.equal(A_deposit, "0"); + assert.equal(B_deposit, "0"); // Check SP tracker is zero - const BoldinSP_1 = await stabilityPool.getTotalBoldDeposits() + const BoldinSP_1 = await stabilityPool.getTotalBoldDeposits(); // console.log(`BoldinSP_1: ${BoldinSP_1}`) - assert.equal(BoldinSP_1, '0') + assert.equal(BoldinSP_1, "0"); // Check SP Bold balance is zero - const SPBoldBalance_1 = await boldToken.balanceOf(stabilityPool.address) + const SPBoldBalance_1 = await boldToken.balanceOf(stabilityPool.address); // console.log(`SPBoldBalance_1: ${SPBoldBalance_1}`) - assert.equal(SPBoldBalance_1, '0') + assert.equal(SPBoldBalance_1, "0"); // Attempt withdrawals // Increasing the price for a moment to avoid pending liquidations to block withdrawal - await priceFeed.setPrice(dec(200, 18)) - const txA = await stabilityPool.withdrawFromSP(dec(1000, 18), { from: A }) - const txB = await stabilityPool.withdrawFromSP(dec(1000, 18), { from: B }) - await priceFeed.setPrice(dec(100, 18)) + await priceFeed.setPrice(dec(200, 18)); + const txA = await stabilityPool.withdrawFromSP(dec(1000, 18), { from: A }); + const txB = await stabilityPool.withdrawFromSP(dec(1000, 18), { from: B }); + await priceFeed.setPrice(dec(100, 18)); - assert.isTrue(txA.receipt.status) - assert.isTrue(txB.receipt.status) + assert.isTrue(txA.receipt.status); + assert.isTrue(txB.receipt.status); // ========== - // C, D provide 10k Bold - await boldToken.transfer(C, dec(10000, 18), { from: whale }) - await boldToken.transfer(D, dec(10000, 18), { from: whale }) - await stabilityPool.provideToSP(dec(10000, 18), { from: C }) - await stabilityPool.provideToSP(dec(10000, 18), { from: D }) + // C, D provide 10k Bold + await boldToken.transfer(C, dec(10000, 18), { from: whale }); + await boldToken.transfer(D, dec(10000, 18), { from: whale }); + await stabilityPool.provideToSP(dec(10000, 18), { from: C }); + await stabilityPool.provideToSP(dec(10000, 18), { from: D }); // Defaulter 2 liquidated. SP emptied const txL2 = await troveManager.liquidate(defaulter_2_TroveId, { from: owner }); - assert.isTrue(txL2.receipt.status) + assert.isTrue(txL2.receipt.status); // Check compounded deposits - const C_deposit = await stabilityPool.getCompoundedBoldDeposit(C) - const D_deposit = await stabilityPool.getCompoundedBoldDeposit(D) + const C_deposit = await stabilityPool.getCompoundedBoldDeposit(C); + const D_deposit = await stabilityPool.getCompoundedBoldDeposit(D); // console.log(`A_deposit: ${C_deposit}`) // console.log(`B_deposit: ${D_deposit}`) - assert.equal(C_deposit, '0') - assert.equal(D_deposit, '0') + assert.equal(C_deposit, "0"); + assert.equal(D_deposit, "0"); // Check SP tracker is zero - const BoldinSP_2 = await stabilityPool.getTotalBoldDeposits() + const BoldinSP_2 = await stabilityPool.getTotalBoldDeposits(); // console.log(`BoldinSP_2: ${BoldinSP_2}`) - assert.equal(BoldinSP_2, '0') + assert.equal(BoldinSP_2, "0"); // Check SP Bold balance is zero - const SPBoldBalance_2 = await boldToken.balanceOf(stabilityPool.address) + const SPBoldBalance_2 = await boldToken.balanceOf(stabilityPool.address); // console.log(`SPBoldBalance_2: ${SPBoldBalance_2}`) - assert.equal(SPBoldBalance_2, '0') + assert.equal(SPBoldBalance_2, "0"); // Attempt withdrawals // Increasing the price for a moment to avoid pending liquidations to block withdrawal - await priceFeed.setPrice(dec(200, 18)) - const txC = await stabilityPool.withdrawFromSP(dec(1000, 18), { from: C }) - const txD = await stabilityPool.withdrawFromSP(dec(1000, 18), { from: D }) - await priceFeed.setPrice(dec(100, 18)) + await priceFeed.setPrice(dec(200, 18)); + const txC = await stabilityPool.withdrawFromSP(dec(1000, 18), { from: C }); + const txD = await stabilityPool.withdrawFromSP(dec(1000, 18), { from: D }); + await priceFeed.setPrice(dec(100, 18)); - assert.isTrue(txC.receipt.status) - assert.isTrue(txD.receipt.status) + assert.isTrue(txC.receipt.status); + assert.isTrue(txD.receipt.status); // ============ - // E, F provide 10k Bold - await boldToken.transfer(E, dec(10000, 18), { from: whale }) - await boldToken.transfer(F, dec(10000, 18), { from: whale }) - await stabilityPool.provideToSP(dec(10000, 18), { from: E }) - await stabilityPool.provideToSP(dec(10000, 18), { from: F }) + // E, F provide 10k Bold + await boldToken.transfer(E, dec(10000, 18), { from: whale }); + await boldToken.transfer(F, dec(10000, 18), { from: whale }); + await stabilityPool.provideToSP(dec(10000, 18), { from: E }); + await stabilityPool.provideToSP(dec(10000, 18), { from: F }); // Defaulter 3 liquidated. SP emptied const txL3 = await troveManager.liquidate(defaulter_3_TroveId, { from: owner }); - assert.isTrue(txL3.receipt.status) + assert.isTrue(txL3.receipt.status); // Check compounded deposits - const E_deposit = await stabilityPool.getCompoundedBoldDeposit(E) - const F_deposit = await stabilityPool.getCompoundedBoldDeposit(F) + const E_deposit = await stabilityPool.getCompoundedBoldDeposit(E); + const F_deposit = await stabilityPool.getCompoundedBoldDeposit(F); // console.log(`E_deposit: ${E_deposit}`) // console.log(`F_deposit: ${F_deposit}`) - assert.equal(E_deposit, '0') - assert.equal(F_deposit, '0') + assert.equal(E_deposit, "0"); + assert.equal(F_deposit, "0"); // Check SP tracker is zero - const BoldinSP_3 = await stabilityPool.getTotalBoldDeposits() - assert.equal(BoldinSP_3, '0') + const BoldinSP_3 = await stabilityPool.getTotalBoldDeposits(); + assert.equal(BoldinSP_3, "0"); // Check SP Bold balance is zero - const SPBoldBalance_3 = await boldToken.balanceOf(stabilityPool.address) + const SPBoldBalance_3 = await boldToken.balanceOf(stabilityPool.address); // console.log(`SPBoldBalance_3: ${SPBoldBalance_3}`) - assert.equal(SPBoldBalance_3, '0') + assert.equal(SPBoldBalance_3, "0"); // Attempt withdrawals - const txE = await stabilityPool.withdrawFromSP(dec(1000, 18), { from: E }) - const txF = await stabilityPool.withdrawFromSP(dec(1000, 18), { from: F }) - assert.isTrue(txE.receipt.status) - assert.isTrue(txF.receipt.status) - }) + const txE = await stabilityPool.withdrawFromSP(dec(1000, 18), { from: E }); + const txF = await stabilityPool.withdrawFromSP(dec(1000, 18), { from: F }); + assert.isTrue(txE.receipt.status); + assert.isTrue(txF.receipt.status); + }); - // TODO: Changes since v1 have introduced very slight precision error in this test. Potentially due to slightly different rounding + // TODO: Changes since v1 have introduced very slight precision error in this test. Potentially due to slightly different rounding // in helper functon getOpenTroveBoldAmount due to now-zero borrow fees. Double-check this when we write new SP arithmetic tests and fix the "P" issue. it.skip("withdrawFromSP(): Depositor's ETH gain stops increasing after two scale changes", async () => { // Whale opens Trove with 100k ETH - await th.openTroveWrapper(contracts, th._100pct, await getOpenTroveBoldAmount(dec(100000, 18)), whale, whale, 0,{ from: whale, value: dec(100000, 'ether') }) + await th.openTroveWrapper(contracts, th._100pct, await getOpenTroveBoldAmount(dec(100000, 18)), whale, whale, 0, { + from: whale, + value: dec(100000, "ether"), + }); // Defaulters 1-5 each withdraw up to debt of 9999.9999999 Bold - const defaulter_1_TroveId = await th.openTroveWrapper(contracts, th._100pct, await getOpenTroveBoldAmount(dec(99999, 17)), defaulter_1, defaulter_1, 0,{ from: defaulter_1, value: dec(100, 'ether') }) - const defaulter_2_TroveId = await th.openTroveWrapper(contracts, th._100pct, await getOpenTroveBoldAmount(dec(99999, 17)), defaulter_2, defaulter_2, 0, { from: defaulter_2, value: dec(100, 'ether') }) - const defaulter_3_TroveId = await th.openTroveWrapper(contracts, th._100pct, await getOpenTroveBoldAmount(dec(99999, 17)), defaulter_3, defaulter_3, 0, { from: defaulter_3, value: dec(100, 'ether') }) - const defaulter_4_TroveId = await th.openTroveWrapper(contracts, th._100pct, await getOpenTroveBoldAmount(dec(99999, 17)), defaulter_4, defaulter_4, 0, { from: defaulter_4, value: dec(100, 'ether') }) - const defaulter_5_TroveId = await th.openTroveWrapper(contracts, th._100pct, await getOpenTroveBoldAmount(dec(99999, 17)), defaulter_5, defaulter_5, 0, { from: defaulter_5, value: dec(100, 'ether') }) + const defaulter_1_TroveId = await th.openTroveWrapper( + contracts, + th._100pct, + await getOpenTroveBoldAmount(dec(99999, 17)), + defaulter_1, + defaulter_1, + 0, + { from: defaulter_1, value: dec(100, "ether") }, + ); + const defaulter_2_TroveId = await th.openTroveWrapper( + contracts, + th._100pct, + await getOpenTroveBoldAmount(dec(99999, 17)), + defaulter_2, + defaulter_2, + 0, + { from: defaulter_2, value: dec(100, "ether") }, + ); + const defaulter_3_TroveId = await th.openTroveWrapper( + contracts, + th._100pct, + await getOpenTroveBoldAmount(dec(99999, 17)), + defaulter_3, + defaulter_3, + 0, + { from: defaulter_3, value: dec(100, "ether") }, + ); + const defaulter_4_TroveId = await th.openTroveWrapper( + contracts, + th._100pct, + await getOpenTroveBoldAmount(dec(99999, 17)), + defaulter_4, + defaulter_4, + 0, + { from: defaulter_4, value: dec(100, "ether") }, + ); + const defaulter_5_TroveId = await th.openTroveWrapper( + contracts, + th._100pct, + await getOpenTroveBoldAmount(dec(99999, 17)), + defaulter_5, + defaulter_5, + 0, + { from: defaulter_5, value: dec(100, "ether") }, + ); // price drops by 50% await priceFeed.setPrice(dec(100, 18)); - await boldToken.transfer(alice, dec(10000, 18), { from: whale }) - await stabilityPool.provideToSP(dec(10000, 18), { from: alice }) + await boldToken.transfer(alice, dec(10000, 18), { from: whale }); + await stabilityPool.provideToSP(dec(10000, 18), { from: alice }); // Defaulter 1 liquidated. P updated to 1e13 const txL1 = await troveManager.liquidate(defaulter_1_TroveId, { from: owner }); - assert.isTrue(txL1.receipt.status) - th.logBN("P", await stabilityPool.P()); // P = 0.000009999999999999, 1 wei less than expected - assert.equal(await stabilityPool.P(), dec(1, 13)) // Expect P decreases to 1e(18-5) = 1e13 - assert.equal(await stabilityPool.currentScale(), '0') + assert.isTrue(txL1.receipt.status); + th.logBN("P", await stabilityPool.P()); // P = 0.000009999999999999, 1 wei less than expected + assert.equal(await stabilityPool.P(), dec(1, 13)); // Expect P decreases to 1e(18-5) = 1e13 + assert.equal(await stabilityPool.currentScale(), "0"); // B deposits 9999.9 Bold - await boldToken.transfer(bob, dec(99999, 17), { from: whale }) - await stabilityPool.provideToSP(dec(99999, 17), { from: bob }) + await boldToken.transfer(bob, dec(99999, 17), { from: whale }); + await stabilityPool.provideToSP(dec(99999, 17), { from: bob }); // Defaulter 2 liquidated const txL2 = await troveManager.liquidate(defaulter_2_TroveId, { from: owner }); - assert.isTrue(txL2.receipt.status) - assert.equal(await stabilityPool.P(), dec(1, 17)) // Scale changes and P changes to 1e(13-5+9) = 1e17 - assert.equal(await stabilityPool.currentScale(), '1') + assert.isTrue(txL2.receipt.status); + assert.equal(await stabilityPool.P(), dec(1, 17)); // Scale changes and P changes to 1e(13-5+9) = 1e17 + assert.equal(await stabilityPool.currentScale(), "1"); // C deposits 9999.9 Bold - await boldToken.transfer(carol, dec(99999, 17), { from: whale }) - await stabilityPool.provideToSP(dec(99999, 17), { from: carol }) + await boldToken.transfer(carol, dec(99999, 17), { from: whale }); + await stabilityPool.provideToSP(dec(99999, 17), { from: carol }); // Defaulter 3 liquidated const txL3 = await troveManager.liquidate(defaulter_3_TroveId, { from: owner }); - assert.isTrue(txL3.receipt.status) - assert.equal(await stabilityPool.P(), dec(1, 12)) // P decreases to 1e(17-5) = 1e12 - assert.equal(await stabilityPool.currentScale(), '1') + assert.isTrue(txL3.receipt.status); + assert.equal(await stabilityPool.P(), dec(1, 12)); // P decreases to 1e(17-5) = 1e12 + assert.equal(await stabilityPool.currentScale(), "1"); // D deposits 9999.9 Bold - await boldToken.transfer(dennis, dec(99999, 17), { from: whale }) - await stabilityPool.provideToSP(dec(99999, 17), { from: dennis }) + await boldToken.transfer(dennis, dec(99999, 17), { from: whale }); + await stabilityPool.provideToSP(dec(99999, 17), { from: dennis }); // Defaulter 4 liquidated const txL4 = await troveManager.liquidate(defaulter_4_TroveId, { from: owner }); - assert.isTrue(txL4.receipt.status) - assert.equal(await stabilityPool.P(), dec(1, 16)) // Scale changes and P changes to 1e(12-5+9) = 1e16 - assert.equal(await stabilityPool.currentScale(), '2') + assert.isTrue(txL4.receipt.status); + assert.equal(await stabilityPool.P(), dec(1, 16)); // Scale changes and P changes to 1e(12-5+9) = 1e16 + assert.equal(await stabilityPool.currentScale(), "2"); - const alice_ETHGainAt2ndScaleChange = (await stabilityPool.getDepositorETHGain(alice)).toString() + const alice_ETHGainAt2ndScaleChange = (await stabilityPool.getDepositorETHGain(alice)).toString(); // E deposits 9999.9 Bold - await boldToken.transfer(erin, dec(99999, 17), { from: whale }) - await stabilityPool.provideToSP(dec(99999, 17), { from: erin }) - + await boldToken.transfer(erin, dec(99999, 17), { from: whale }); + await stabilityPool.provideToSP(dec(99999, 17), { from: erin }); + // Defaulter 5 liquidated const txL5 = await troveManager.liquidate(defaulter_5_TroveId, { from: owner }); - assert.isTrue(txL5.receipt.status) - assert.equal(await stabilityPool.P(), dec(1, 11)) // P decreases to 1e(16-5) = 1e11 - assert.equal(await stabilityPool.currentScale(), '2') + assert.isTrue(txL5.receipt.status); + assert.equal(await stabilityPool.P(), dec(1, 11)); // P decreases to 1e(16-5) = 1e11 + assert.equal(await stabilityPool.currentScale(), "2"); - const alice_ETHGainAfterFurtherLiquidation = (await stabilityPool.getDepositorETHGain(alice)).toString() - - const alice_scaleSnapshot = (await stabilityPool.depositSnapshots(alice))[2].toString() + const alice_ETHGainAfterFurtherLiquidation = (await stabilityPool.getDepositorETHGain(alice)).toString(); - assert.equal(alice_scaleSnapshot, '0') - assert.equal(alice_ETHGainAt2ndScaleChange, alice_ETHGainAfterFurtherLiquidation) - }) + const alice_scaleSnapshot = (await stabilityPool.depositSnapshots(alice))[2].toString(); + + assert.equal(alice_scaleSnapshot, "0"); + assert.equal(alice_ETHGainAt2ndScaleChange, alice_ETHGainAfterFurtherLiquidation); + }); // --- Extreme values, confirm no overflows --- it("withdrawFromSP(): Large liquidated coll/debt, deposits and ETH price", async () => { // Whale opens Trove with 100k ETH - await th.openTroveWrapper(contracts, th._100pct, await getOpenTroveBoldAmount(dec(100000, 18)), whale, whale, 0, { from: whale, value: dec(100000, 'ether') }) + await th.openTroveWrapper(contracts, th._100pct, await getOpenTroveBoldAmount(dec(100000, 18)), whale, whale, 0, { + from: whale, + value: dec(100000, "ether"), + }); // ETH:USD price is $2 billion per ETH await priceFeed.setPrice(dec(2, 27)); - const depositors = [alice, bob] + const depositors = [alice, bob]; for (const account of depositors) { - await th.openTroveWrapper(contracts, th._100pct, dec(1, 36), account, account, 0, { from: account, value: dec(2, 27) }) - await stabilityPool.provideToSP(dec(1, 36), { from: account }) + await th.openTroveWrapper(contracts, th._100pct, dec(1, 36), account, account, 0, { + from: account, + value: dec(2, 27), + }); + await stabilityPool.provideToSP(dec(1, 36), { from: account }); } // Defaulter opens trove with 200% ICR - const defaulter_1_TroveId = await th.openTroveWrapper(contracts, th._100pct, await getOpenTroveBoldAmount(dec(1, 36)), defaulter_1, defaulter_1, 0,{ from: defaulter_1, value: dec(1, 27) }) + const defaulter_1_TroveId = await th.openTroveWrapper( + contracts, + th._100pct, + await getOpenTroveBoldAmount(dec(1, 36)), + defaulter_1, + defaulter_1, + 0, + { from: defaulter_1, value: dec(1, 27) }, + ); // ETH:USD price drops to $1 billion per ETH await priceFeed.setPrice(dec(1, 27)); @@ -1773,57 +2578,71 @@ contract('StabilityPool - Withdrawal of stability deposit - Reward calculations' // Defaulter liquidated await troveManager.liquidate(defaulter_1_TroveId, { from: owner }); - const txA = await stabilityPool.withdrawFromSP(dec(1, 36), { from: alice }) - const txB = await stabilityPool.withdrawFromSP(dec(1, 36), { from: bob }) + const txA = await stabilityPool.withdrawFromSP(dec(1, 36), { from: alice }); + const txB = await stabilityPool.withdrawFromSP(dec(1, 36), { from: bob }); // Grab the ETH gain from the emitted event in the tx log - const alice_ETHWithdrawn = th.getEventArgByName(txA, 'ETHGainWithdrawn', '_ETH') - const bob_ETHWithdrawn = th.getEventArgByName(txB, 'ETHGainWithdrawn', '_ETH') + const alice_ETHWithdrawn = th.getEventArgByName(txA, "ETHGainWithdrawn", "_ETH"); + const bob_ETHWithdrawn = th.getEventArgByName(txB, "ETHGainWithdrawn", "_ETH"); // Check Bold balances - const aliceBoldBalance = await boldToken.balanceOf(alice) - const aliceExpectedBoldBalance = web3.utils.toBN(dec(5, 35)) - const aliceBoldBalDiff = aliceBoldBalance.sub(aliceExpectedBoldBalance).abs() + const aliceBoldBalance = await boldToken.balanceOf(alice); + const aliceExpectedBoldBalance = web3.utils.toBN(dec(5, 35)); + const aliceBoldBalDiff = aliceBoldBalance.sub(aliceExpectedBoldBalance).abs(); - assert.isTrue(aliceBoldBalDiff.lte(toBN(dec(1, 18)))) // error tolerance of 1e18 + assert.isTrue(aliceBoldBalDiff.lte(toBN(dec(1, 18)))); // error tolerance of 1e18 - const bobBoldBalance = await boldToken.balanceOf(bob) - const bobExpectedBoldBalance = toBN(dec(5, 35)) - const bobBoldBalDiff = bobBoldBalance.sub(bobExpectedBoldBalance).abs() + const bobBoldBalance = await boldToken.balanceOf(bob); + const bobExpectedBoldBalance = toBN(dec(5, 35)); + const bobBoldBalDiff = bobBoldBalance.sub(bobExpectedBoldBalance).abs(); - assert.isTrue(bobBoldBalDiff.lte(toBN(dec(1, 18)))) + assert.isTrue(bobBoldBalDiff.lte(toBN(dec(1, 18)))); // Check ETH gains - const aliceExpectedETHGain = toBN(dec(4975, 23)) - const aliceETHDiff = aliceExpectedETHGain.sub(toBN(alice_ETHWithdrawn)) + const aliceExpectedETHGain = toBN(dec(4975, 23)); + const aliceETHDiff = aliceExpectedETHGain.sub(toBN(alice_ETHWithdrawn)); - assert.isTrue(aliceETHDiff.lte(toBN(dec(1, 18)))) + assert.isTrue(aliceETHDiff.lte(toBN(dec(1, 18)))); - const bobExpectedETHGain = toBN(dec(4975, 23)) - const bobETHDiff = bobExpectedETHGain.sub(toBN(bob_ETHWithdrawn)) + const bobExpectedETHGain = toBN(dec(4975, 23)); + const bobETHDiff = bobExpectedETHGain.sub(toBN(bob_ETHWithdrawn)); - assert.isTrue(bobETHDiff.lte(toBN(dec(1, 18)))) - }) + assert.isTrue(bobETHDiff.lte(toBN(dec(1, 18)))); + }); // TODO: Changes since v1 have made the error margin in this test i.e. aliceBoldBalanceDiff increase 100x (but still low relative to the huge values used in test). // Potentially due to slightly different rounding in helper getOpenTroveBoldAmount due to now-zero borrow fees. // Double-check this when we write new SP arithmetic tests and fix the "P" issue. it.skip("withdrawFromSP(): Small liquidated coll/debt, large deposits and ETH price", async () => { // Whale opens Trove with 100k ETH - await th.openTroveWrapper(contracts, th._100pct, await getOpenTroveBoldAmount(dec(100000, 18)), whale, whale, 0,{ from: whale, value: dec(100000, 'ether') }) + await th.openTroveWrapper(contracts, th._100pct, await getOpenTroveBoldAmount(dec(100000, 18)), whale, whale, 0, { + from: whale, + value: dec(100000, "ether"), + }); // ETH:USD price is $2 billion per ETH await priceFeed.setPrice(dec(2, 27)); - const price = await priceFeed.getPrice() + const price = await priceFeed.getPrice(); - const depositors = [alice, bob] + const depositors = [alice, bob]; for (const account of depositors) { - await th.openTroveWrapper(contracts, th._100pct, dec(1, 38), account, account, { from: account, value: dec(2, 29) }) - await stabilityPool.provideToSP(dec(1, 38), { from: account }) + await th.openTroveWrapper(contracts, th._100pct, dec(1, 38), account, account, { + from: account, + value: dec(2, 29), + }); + await stabilityPool.provideToSP(dec(1, 38), { from: account }); } // Defaulter opens trove with 50e-7 ETH and 5000 Bold. 200% ICR - const defaulter_1_TroveId = await th.openTroveWrapper(contracts, th._100pct, await getOpenTroveBoldAmount(dec(5000, 18)), defaulter_1, defaulter_1, 0,{ from: defaulter_1, value: '5000000000000' }) + const defaulter_1_TroveId = await th.openTroveWrapper( + contracts, + th._100pct, + await getOpenTroveBoldAmount(dec(5000, 18)), + defaulter_1, + defaulter_1, + 0, + { from: defaulter_1, value: "5000000000000" }, + ); // ETH:USD price drops to $1 billion per ETH await priceFeed.setPrice(dec(1, 27)); @@ -1831,30 +2650,30 @@ contract('StabilityPool - Withdrawal of stability deposit - Reward calculations' // Defaulter liquidated await troveManager.liquidate(defaulter_1_TroveId, { from: owner }); - const txA = await stabilityPool.withdrawFromSP(dec(1, 38), { from: alice }) - const txB = await stabilityPool.withdrawFromSP(dec(1, 38), { from: bob }) + const txA = await stabilityPool.withdrawFromSP(dec(1, 38), { from: alice }); + const txB = await stabilityPool.withdrawFromSP(dec(1, 38), { from: bob }); - const alice_ETHWithdrawn = th.getEventArgByName(txA, 'ETHGainWithdrawn', '_ETH') - const bob_ETHWithdrawn = th.getEventArgByName(txB, 'ETHGainWithdrawn', '_ETH') + const alice_ETHWithdrawn = th.getEventArgByName(txA, "ETHGainWithdrawn", "_ETH"); + const bob_ETHWithdrawn = th.getEventArgByName(txB, "ETHGainWithdrawn", "_ETH"); - const aliceBoldBalance = await boldToken.balanceOf(alice) - const aliceExpectedBoldBalance = toBN('99999999999999997500000000000000000000') - const aliceBoldBalDiff = aliceBoldBalance.sub(aliceExpectedBoldBalance).abs() + const aliceBoldBalance = await boldToken.balanceOf(alice); + const aliceExpectedBoldBalance = toBN("99999999999999997500000000000000000000"); + const aliceBoldBalDiff = aliceBoldBalance.sub(aliceExpectedBoldBalance).abs(); - th.logBN("aliceBoldBalDiff", aliceBoldBalDiff) - assert.isTrue(aliceBoldBalDiff.lte(toBN(dec(1, 18)))) + th.logBN("aliceBoldBalDiff", aliceBoldBalDiff); + assert.isTrue(aliceBoldBalDiff.lte(toBN(dec(1, 18)))); - const bobBoldBalance = await boldToken.balanceOf(bob) - const bobExpectedBoldBalance = toBN('99999999999999997500000000000000000000') - const bobBoldBalDiff = bobBoldBalance.sub(bobExpectedBoldBalance).abs() + const bobBoldBalance = await boldToken.balanceOf(bob); + const bobExpectedBoldBalance = toBN("99999999999999997500000000000000000000"); + const bobBoldBalDiff = bobBoldBalance.sub(bobExpectedBoldBalance).abs(); - assert.isTrue(bobBoldBalDiff.lte(toBN('100000000000000000000'))) + assert.isTrue(bobBoldBalDiff.lte(toBN("100000000000000000000"))); // Expect ETH gain per depositor of ~1e11 wei to be rounded to 0 by the ETHGainedPerUnitStaked calculation (e / D), where D is ~1e36. - assert.equal(alice_ETHWithdrawn.toString(), '0') - assert.equal(bob_ETHWithdrawn.toString(), '0') - }) - }) -}) + assert.equal(alice_ETHWithdrawn.toString(), "0"); + assert.equal(bob_ETHWithdrawn.toString(), "0"); + }); + }); +}); -contract('Reset chain state', async accounts => { }) +contract("Reset chain state", async (accounts) => {}); diff --git a/contracts/test/StabilityPool_SPWithdrawalToCDPTest.js b/contracts/test/StabilityPool_SPWithdrawalToCDPTest.js index 93e489cc..9b5a4563 100644 --- a/contracts/test/StabilityPool_SPWithdrawalToCDPTest.js +++ b/contracts/test/StabilityPool_SPWithdrawalToCDPTest.js @@ -1,11 +1,11 @@ -const testHelpers = require("../utils/testHelpers.js") +const testHelpers = require("../utils/testHelpers.js"); const { createDeployAndFundFixture } = require("../utils/testFixtures.js"); -const TroveManagerTester = artifacts.require("./TroveManagerTester.sol") +const TroveManagerTester = artifacts.require("./TroveManagerTester.sol"); -const { dec, toBN } = testHelpers.TestHelper -const th = testHelpers.TestHelper +const { dec, toBN } = testHelpers.TestHelper; +const th = testHelpers.TestHelper; -contract('StabilityPool - Withdrawal of stability deposit - Reward calculations', async accounts => { +contract("StabilityPool - Withdrawal of stability deposit - Reward calculations", async (accounts) => { const fundedAccounts = accounts.slice(0, 22); const [ @@ -31,43 +31,42 @@ contract('StabilityPool - Withdrawal of stability deposit - Reward calculations' C, D, E, - F + F, ] = fundedAccounts; - const [bountyAddress, lpRewardsAddress, multisig] = accounts.slice(997, 1000) + const [bountyAddress, lpRewardsAddress, multisig] = accounts.slice(997, 1000); - let contracts + let contracts; - let priceFeed - let boldToken - let troveManager - let stabilityPool + let priceFeed; + let boldToken; + let troveManager; + let stabilityPool; - let gasPriceInWei + let gasPriceInWei; - const ZERO_ADDRESS = th.ZERO_ADDRESS + const ZERO_ADDRESS = th.ZERO_ADDRESS; - const getOpenTroveBoldAmount = async (totalDebt) => th.getOpenTroveBoldAmount(contracts, totalDebt) + const getOpenTroveBoldAmount = async (totalDebt) => th.getOpenTroveBoldAmount(contracts, totalDebt); const deployFixture = createDeployAndFundFixture({ accounts: fundedAccounts, - mocks: { TroveManager: TroveManagerTester } + mocks: { TroveManager: TroveManagerTester }, }); describe("Stability Pool Withdrawal", async () => { - before(async () => { - gasPriceInWei = await web3.eth.getGasPrice() - }) + gasPriceInWei = await web3.eth.getGasPrice(); + }); beforeEach(async () => { - const result = await deployFixture() - contracts = result.contracts - priceFeed = contracts.priceFeedTestnet - boldToken = contracts.boldToken - troveManager = contracts.troveManager - stabilityPool = contracts.stabilityPool - }) + const result = await deployFixture(); + contracts = result.contracts; + priceFeed = contracts.priceFeedTestnet; + boldToken = contracts.boldToken; + troveManager = contracts.troveManager; + stabilityPool = contracts.stabilityPool; + }); // --- Compounding tests --- @@ -76,22 +75,57 @@ contract('StabilityPool - Withdrawal of stability deposit - Reward calculations' // --- Identical deposits, identical liquidation amounts--- it("withdrawETHGainToTrove(): Depositors with equal initial deposit withdraw correct compounded deposit and ETH Gain after one liquidation", async () => { // Whale opens Trove with 100k ETH - await th.openTroveWrapper(contracts, th._100pct, await getOpenTroveBoldAmount(dec(100000, 18)), whale, whale, 0, { from: whale, value: dec(100000, 'ether') }) + await th.openTroveWrapper(contracts, th._100pct, await getOpenTroveBoldAmount(dec(100000, 18)), whale, whale, 0, { + from: whale, + value: dec(100000, "ether"), + }); // A, B, C open troves - const aliceTroveId = await th.openTroveWrapper(contracts, th._100pct, await getOpenTroveBoldAmount(dec(10000, 18)), ZERO_ADDRESS, ZERO_ADDRESS, 0, { from: alice, value: dec(10000, 'ether') }) - const bobTroveId = await th.openTroveWrapper(contracts, th._100pct, await getOpenTroveBoldAmount(dec(10000, 18)), ZERO_ADDRESS, ZERO_ADDRESS, 0, { from: bob, value: dec(10000, 'ether') }) - const carolTroveId = await th.openTroveWrapper(contracts, th._100pct, await getOpenTroveBoldAmount(dec(10000, 18)), ZERO_ADDRESS, ZERO_ADDRESS, 0, { from: carol, value: dec(10000, 'ether') }) + const aliceTroveId = await th.openTroveWrapper( + contracts, + th._100pct, + await getOpenTroveBoldAmount(dec(10000, 18)), + ZERO_ADDRESS, + ZERO_ADDRESS, + 0, + { from: alice, value: dec(10000, "ether") }, + ); + const bobTroveId = await th.openTroveWrapper( + contracts, + th._100pct, + await getOpenTroveBoldAmount(dec(10000, 18)), + ZERO_ADDRESS, + ZERO_ADDRESS, + 0, + { from: bob, value: dec(10000, "ether") }, + ); + const carolTroveId = await th.openTroveWrapper( + contracts, + th._100pct, + await getOpenTroveBoldAmount(dec(10000, 18)), + ZERO_ADDRESS, + ZERO_ADDRESS, + 0, + { from: carol, value: dec(10000, "ether") }, + ); // Whale transfers 10k Bold to A, B and C who then deposit it to the SP - const depositors = [alice, bob, carol] + const depositors = [alice, bob, carol]; for (const account of depositors) { - await boldToken.transfer(account, dec(10000, 18), { from: whale }) - await stabilityPool.provideToSP(dec(10000, 18), { from: account }) + await boldToken.transfer(account, dec(10000, 18), { from: whale }); + await stabilityPool.provideToSP(dec(10000, 18), { from: account }); } // Defaulter opens trove with 200% ICR and 10k Bold net debt - const defaulter_1_TroveId = await th.openTroveWrapper(contracts, th._100pct, await getOpenTroveBoldAmount(dec(10000, 18)), defaulter_1, defaulter_1, 0, { from: defaulter_1, value: dec(100, 'ether') }) + const defaulter_1_TroveId = await th.openTroveWrapper( + contracts, + th._100pct, + await getOpenTroveBoldAmount(dec(10000, 18)), + defaulter_1, + defaulter_1, + 0, + { from: defaulter_1, value: dec(100, "ether") }, + ); // price drops by 50%: defaulter ICR falls to 100% await priceFeed.setPrice(dec(100, 18)); @@ -100,43 +134,95 @@ contract('StabilityPool - Withdrawal of stability deposit - Reward calculations' await troveManager.liquidate(defaulter_1_TroveId, { from: owner }); // Check depositors' compounded deposit is 6666.66 Bold and ETH Gain is 33.16 ETH - const txA = await stabilityPool.withdrawETHGainToTrove(aliceTroveId, { from: alice }) - const txB = await stabilityPool.withdrawETHGainToTrove(bobTroveId, { from: bob }) - const txC = await stabilityPool.withdrawETHGainToTrove(carolTroveId, { from: carol }) + const txA = await stabilityPool.withdrawETHGainToTrove(aliceTroveId, { from: alice }); + const txB = await stabilityPool.withdrawETHGainToTrove(bobTroveId, { from: bob }); + const txC = await stabilityPool.withdrawETHGainToTrove(carolTroveId, { from: carol }); // Grab the ETH gain from the emitted event in the tx log - const alice_ETHWithdrawn = th.getEventArgByName(txA, 'ETHGainWithdrawn', '_ETH').toString() - const bob_ETHWithdrawn = th.getEventArgByName(txB, 'ETHGainWithdrawn', '_ETH').toString() - const carol_ETHWithdrawn = th.getEventArgByName(txC, 'ETHGainWithdrawn', '_ETH').toString() - - assert.isAtMost(th.getDifference((await stabilityPool.getCompoundedBoldDeposit(alice)).toString(), '6666666666666666666666'), 10000) - assert.isAtMost(th.getDifference((await stabilityPool.getCompoundedBoldDeposit(bob)).toString(), '6666666666666666666666'), 10000) - assert.isAtMost(th.getDifference((await stabilityPool.getCompoundedBoldDeposit(carol)).toString(), '6666666666666666666666'), 10000) - - assert.isAtMost(th.getDifference(alice_ETHWithdrawn, '33166666666666666667'), 10000) - assert.isAtMost(th.getDifference(bob_ETHWithdrawn, '33166666666666666667'), 10000) - assert.isAtMost(th.getDifference(carol_ETHWithdrawn, '33166666666666666667'), 10000) - }) + const alice_ETHWithdrawn = th.getEventArgByName(txA, "ETHGainWithdrawn", "_ETH").toString(); + const bob_ETHWithdrawn = th.getEventArgByName(txB, "ETHGainWithdrawn", "_ETH").toString(); + const carol_ETHWithdrawn = th.getEventArgByName(txC, "ETHGainWithdrawn", "_ETH").toString(); + + assert.isAtMost( + th.getDifference((await stabilityPool.getCompoundedBoldDeposit(alice)).toString(), "6666666666666666666666"), + 10000, + ); + assert.isAtMost( + th.getDifference((await stabilityPool.getCompoundedBoldDeposit(bob)).toString(), "6666666666666666666666"), + 10000, + ); + assert.isAtMost( + th.getDifference((await stabilityPool.getCompoundedBoldDeposit(carol)).toString(), "6666666666666666666666"), + 10000, + ); + + assert.isAtMost(th.getDifference(alice_ETHWithdrawn, "33166666666666666667"), 10000); + assert.isAtMost(th.getDifference(bob_ETHWithdrawn, "33166666666666666667"), 10000); + assert.isAtMost(th.getDifference(carol_ETHWithdrawn, "33166666666666666667"), 10000); + }); it("withdrawETHGainToTrove(): Depositors with equal initial deposit withdraw correct compounded deposit and ETH Gain after two identical liquidations", async () => { // Whale opens Trove with 100k ETH - await th.openTroveWrapper(contracts, th._100pct, await getOpenTroveBoldAmount(dec(100000, 18)), whale, whale, 0, { from: whale, value: dec(100000, 'ether') }) + await th.openTroveWrapper(contracts, th._100pct, await getOpenTroveBoldAmount(dec(100000, 18)), whale, whale, 0, { + from: whale, + value: dec(100000, "ether"), + }); // A, B, C open troves - const aliceTroveId = await th.openTroveWrapper(contracts, th._100pct, await getOpenTroveBoldAmount(dec(10000, 18)), ZERO_ADDRESS, ZERO_ADDRESS, 0, { from: alice, value: dec(10000, 'ether') }) - const bobTroveId = await th.openTroveWrapper(contracts, th._100pct, await getOpenTroveBoldAmount(dec(10000, 18)), ZERO_ADDRESS, ZERO_ADDRESS, 0, { from: bob, value: dec(10000, 'ether') }) - const carolTroveId = await th.openTroveWrapper(contracts, th._100pct, await getOpenTroveBoldAmount(dec(10000, 18)), ZERO_ADDRESS, ZERO_ADDRESS, 0, { from: carol, value: dec(10000, 'ether') }) + const aliceTroveId = await th.openTroveWrapper( + contracts, + th._100pct, + await getOpenTroveBoldAmount(dec(10000, 18)), + ZERO_ADDRESS, + ZERO_ADDRESS, + 0, + { from: alice, value: dec(10000, "ether") }, + ); + const bobTroveId = await th.openTroveWrapper( + contracts, + th._100pct, + await getOpenTroveBoldAmount(dec(10000, 18)), + ZERO_ADDRESS, + ZERO_ADDRESS, + 0, + { from: bob, value: dec(10000, "ether") }, + ); + const carolTroveId = await th.openTroveWrapper( + contracts, + th._100pct, + await getOpenTroveBoldAmount(dec(10000, 18)), + ZERO_ADDRESS, + ZERO_ADDRESS, + 0, + { from: carol, value: dec(10000, "ether") }, + ); // Whale transfers 10k Bold to A, B and C who then deposit it to the SP - const depositors = [alice, bob, carol] + const depositors = [alice, bob, carol]; for (const account of depositors) { - await boldToken.transfer(account, dec(10000, 18), { from: whale }) - await stabilityPool.provideToSP(dec(10000, 18), { from: account }) + await boldToken.transfer(account, dec(10000, 18), { from: whale }); + await stabilityPool.provideToSP(dec(10000, 18), { from: account }); } // Defaulters open trove with 200% ICR - const defaulter_1_TroveId = await th.openTroveWrapper(contracts, th._100pct, await getOpenTroveBoldAmount(dec(10000, 18)), defaulter_1, defaulter_1, 0, { from: defaulter_1, value: dec(100, 'ether') }) - const defaulter_2_TroveId = await th.openTroveWrapper(contracts, th._100pct, await getOpenTroveBoldAmount(dec(10000, 18)), defaulter_2, defaulter_2, 0,{ from: defaulter_2, value: dec(100, 'ether') }) + const defaulter_1_TroveId = await th.openTroveWrapper( + contracts, + th._100pct, + await getOpenTroveBoldAmount(dec(10000, 18)), + defaulter_1, + defaulter_1, + 0, + { from: defaulter_1, value: dec(100, "ether") }, + ); + const defaulter_2_TroveId = await th.openTroveWrapper( + contracts, + th._100pct, + await getOpenTroveBoldAmount(dec(10000, 18)), + defaulter_2, + defaulter_2, + 0, + { from: defaulter_2, value: dec(100, "ether") }, + ); // price drops by 50%: defaulter ICR falls to 100% await priceFeed.setPrice(dec(100, 18)); @@ -146,43 +232,103 @@ contract('StabilityPool - Withdrawal of stability deposit - Reward calculations' await troveManager.liquidate(defaulter_2_TroveId, { from: owner }); // Check depositors' compounded deposit is 3333.33 Bold and ETH Gain is 66.33 ETH - const txA = await stabilityPool.withdrawETHGainToTrove(aliceTroveId, { from: alice }) - const txB = await stabilityPool.withdrawETHGainToTrove(bobTroveId, { from: bob }) - const txC = await stabilityPool.withdrawETHGainToTrove(carolTroveId, { from: carol }) + const txA = await stabilityPool.withdrawETHGainToTrove(aliceTroveId, { from: alice }); + const txB = await stabilityPool.withdrawETHGainToTrove(bobTroveId, { from: bob }); + const txC = await stabilityPool.withdrawETHGainToTrove(carolTroveId, { from: carol }); // Grab the ETH gain from the emitted event in the tx log - const alice_ETHWithdrawn = th.getEventArgByName(txA, 'ETHGainWithdrawn', '_ETH').toString() - const bob_ETHWithdrawn = th.getEventArgByName(txB, 'ETHGainWithdrawn', '_ETH').toString() - const carol_ETHWithdrawn = th.getEventArgByName(txC, 'ETHGainWithdrawn', '_ETH').toString() - - assert.isAtMost(th.getDifference((await stabilityPool.getCompoundedBoldDeposit(alice)).toString(), '3333333333333333333333'), 10000) - assert.isAtMost(th.getDifference((await stabilityPool.getCompoundedBoldDeposit(bob)).toString(), '3333333333333333333333'), 10000) - assert.isAtMost(th.getDifference((await stabilityPool.getCompoundedBoldDeposit(carol)).toString(), '3333333333333333333333'), 10000) - - assert.isAtMost(th.getDifference(alice_ETHWithdrawn, '66333333333333333333'), 10000) - assert.isAtMost(th.getDifference(bob_ETHWithdrawn, '66333333333333333333'), 10000) - assert.isAtMost(th.getDifference(carol_ETHWithdrawn, '66333333333333333333'), 10000) - }) + const alice_ETHWithdrawn = th.getEventArgByName(txA, "ETHGainWithdrawn", "_ETH").toString(); + const bob_ETHWithdrawn = th.getEventArgByName(txB, "ETHGainWithdrawn", "_ETH").toString(); + const carol_ETHWithdrawn = th.getEventArgByName(txC, "ETHGainWithdrawn", "_ETH").toString(); + + assert.isAtMost( + th.getDifference((await stabilityPool.getCompoundedBoldDeposit(alice)).toString(), "3333333333333333333333"), + 10000, + ); + assert.isAtMost( + th.getDifference((await stabilityPool.getCompoundedBoldDeposit(bob)).toString(), "3333333333333333333333"), + 10000, + ); + assert.isAtMost( + th.getDifference((await stabilityPool.getCompoundedBoldDeposit(carol)).toString(), "3333333333333333333333"), + 10000, + ); + + assert.isAtMost(th.getDifference(alice_ETHWithdrawn, "66333333333333333333"), 10000); + assert.isAtMost(th.getDifference(bob_ETHWithdrawn, "66333333333333333333"), 10000); + assert.isAtMost(th.getDifference(carol_ETHWithdrawn, "66333333333333333333"), 10000); + }); it("withdrawETHGainToTrove(): Depositors with equal initial deposit withdraw correct compounded deposit and ETH Gain after three identical liquidations", async () => { // Whale opens Trove with 100k ETH - await th.openTroveWrapper(contracts, th._100pct, await getOpenTroveBoldAmount(dec(100000, 18)), whale, whale, 0, { from: whale, value: dec(100000, 'ether') }) + await th.openTroveWrapper(contracts, th._100pct, await getOpenTroveBoldAmount(dec(100000, 18)), whale, whale, 0, { + from: whale, + value: dec(100000, "ether"), + }); // A, B, C open troves - const aliceTroveId = await th.openTroveWrapper(contracts, th._100pct, await getOpenTroveBoldAmount(dec(10000, 18)), ZERO_ADDRESS, ZERO_ADDRESS, 0, { from: alice, value: dec(10000, 'ether') }) - const bobTroveId = await th.openTroveWrapper(contracts, th._100pct, await getOpenTroveBoldAmount(dec(10000, 18)), ZERO_ADDRESS, ZERO_ADDRESS, 0, { from: bob, value: dec(10000, 'ether') }) - const carolTroveId = await th.openTroveWrapper(contracts, th._100pct, await getOpenTroveBoldAmount(dec(10000, 18)), ZERO_ADDRESS, ZERO_ADDRESS, 0, { from: carol, value: dec(10000, 'ether') }) + const aliceTroveId = await th.openTroveWrapper( + contracts, + th._100pct, + await getOpenTroveBoldAmount(dec(10000, 18)), + ZERO_ADDRESS, + ZERO_ADDRESS, + 0, + { from: alice, value: dec(10000, "ether") }, + ); + const bobTroveId = await th.openTroveWrapper( + contracts, + th._100pct, + await getOpenTroveBoldAmount(dec(10000, 18)), + ZERO_ADDRESS, + ZERO_ADDRESS, + 0, + { from: bob, value: dec(10000, "ether") }, + ); + const carolTroveId = await th.openTroveWrapper( + contracts, + th._100pct, + await getOpenTroveBoldAmount(dec(10000, 18)), + ZERO_ADDRESS, + ZERO_ADDRESS, + 0, + { from: carol, value: dec(10000, "ether") }, + ); // Whale transfers 10k Bold to A, B and C who then deposit it to the SP - const depositors = [alice, bob, carol] + const depositors = [alice, bob, carol]; for (const account of depositors) { - await boldToken.transfer(account, dec(10000, 18), { from: whale }) - await stabilityPool.provideToSP(dec(10000, 18), { from: account }) + await boldToken.transfer(account, dec(10000, 18), { from: whale }); + await stabilityPool.provideToSP(dec(10000, 18), { from: account }); } // Defaulters open trove with 200% ICR - const defaulter_1_TroveId = await th.openTroveWrapper(contracts, th._100pct, await getOpenTroveBoldAmount(dec(10000, 18)), defaulter_1, defaulter_1, 0, { from: defaulter_1, value: dec(100, 'ether') }) - const defaulter_2_TroveId = await th.openTroveWrapper(contracts, th._100pct, await getOpenTroveBoldAmount(dec(10000, 18)), defaulter_2, defaulter_2, 0,{ from: defaulter_2, value: dec(100, 'ether') }) - const defaulter_3_TroveId = await th.openTroveWrapper(contracts, th._100pct, await getOpenTroveBoldAmount(dec(10000, 18)), defaulter_3, defaulter_3, 0,{ from: defaulter_3, value: dec(100, 'ether') }) + const defaulter_1_TroveId = await th.openTroveWrapper( + contracts, + th._100pct, + await getOpenTroveBoldAmount(dec(10000, 18)), + defaulter_1, + defaulter_1, + 0, + { from: defaulter_1, value: dec(100, "ether") }, + ); + const defaulter_2_TroveId = await th.openTroveWrapper( + contracts, + th._100pct, + await getOpenTroveBoldAmount(dec(10000, 18)), + defaulter_2, + defaulter_2, + 0, + { from: defaulter_2, value: dec(100, "ether") }, + ); + const defaulter_3_TroveId = await th.openTroveWrapper( + contracts, + th._100pct, + await getOpenTroveBoldAmount(dec(10000, 18)), + defaulter_3, + defaulter_3, + 0, + { from: defaulter_3, value: dec(100, "ether") }, + ); // price drops by 50%: defaulter ICR falls to 100% await priceFeed.setPrice(dec(100, 18)); @@ -192,45 +338,88 @@ contract('StabilityPool - Withdrawal of stability deposit - Reward calculations' await troveManager.liquidate(defaulter_2_TroveId, { from: owner }); await troveManager.liquidate(defaulter_3_TroveId, { from: owner }); - // Check depositors' compounded deposit is 0 Bold and ETH Gain is 99.5 ETH - const txA = await stabilityPool.withdrawETHGainToTrove(aliceTroveId, { from: alice }) - const txB = await stabilityPool.withdrawETHGainToTrove(bobTroveId, { from: bob }) - const txC = await stabilityPool.withdrawETHGainToTrove(carolTroveId, { from: carol }) + // Check depositors' compounded deposit is 0 Bold and ETH Gain is 99.5 ETH + const txA = await stabilityPool.withdrawETHGainToTrove(aliceTroveId, { from: alice }); + const txB = await stabilityPool.withdrawETHGainToTrove(bobTroveId, { from: bob }); + const txC = await stabilityPool.withdrawETHGainToTrove(carolTroveId, { from: carol }); // Grab the ETH gain from the emitted event in the tx log - const alice_ETHWithdrawn = th.getEventArgByName(txA, 'ETHGainWithdrawn', '_ETH').toString() - const bob_ETHWithdrawn = th.getEventArgByName(txB, 'ETHGainWithdrawn', '_ETH').toString() - const carol_ETHWithdrawn = th.getEventArgByName(txC, 'ETHGainWithdrawn', '_ETH').toString() + const alice_ETHWithdrawn = th.getEventArgByName(txA, "ETHGainWithdrawn", "_ETH").toString(); + const bob_ETHWithdrawn = th.getEventArgByName(txB, "ETHGainWithdrawn", "_ETH").toString(); + const carol_ETHWithdrawn = th.getEventArgByName(txC, "ETHGainWithdrawn", "_ETH").toString(); - assert.isAtMost(th.getDifference((await stabilityPool.getCompoundedBoldDeposit(alice)).toString(), '0'), 10000) - assert.isAtMost(th.getDifference((await stabilityPool.getCompoundedBoldDeposit(bob)).toString(), '0'), 10000) - assert.isAtMost(th.getDifference((await stabilityPool.getCompoundedBoldDeposit(carol)).toString(), '0'), 10000) + assert.isAtMost(th.getDifference((await stabilityPool.getCompoundedBoldDeposit(alice)).toString(), "0"), 10000); + assert.isAtMost(th.getDifference((await stabilityPool.getCompoundedBoldDeposit(bob)).toString(), "0"), 10000); + assert.isAtMost(th.getDifference((await stabilityPool.getCompoundedBoldDeposit(carol)).toString(), "0"), 10000); - assert.isAtMost(th.getDifference(alice_ETHWithdrawn, dec(99500, 15)), 10000) - assert.isAtMost(th.getDifference(bob_ETHWithdrawn, dec(99500, 15)), 10000) - assert.isAtMost(th.getDifference(carol_ETHWithdrawn, dec(99500, 15)), 10000) - }) + assert.isAtMost(th.getDifference(alice_ETHWithdrawn, dec(99500, 15)), 10000); + assert.isAtMost(th.getDifference(bob_ETHWithdrawn, dec(99500, 15)), 10000); + assert.isAtMost(th.getDifference(carol_ETHWithdrawn, dec(99500, 15)), 10000); + }); // --- Identical deposits, increasing liquidation amounts --- it("withdrawETHGainToTrove(): Depositors with equal initial deposit withdraw correct compounded deposit and ETH Gain after two liquidations of increasing Bold", async () => { // Whale opens Trove with 100k ETH - await th.openTroveWrapper(contracts, th._100pct, await getOpenTroveBoldAmount(dec(100000, 18)), whale, whale, 0, { from: whale, value: dec(100000, 'ether') }) + await th.openTroveWrapper(contracts, th._100pct, await getOpenTroveBoldAmount(dec(100000, 18)), whale, whale, 0, { + from: whale, + value: dec(100000, "ether"), + }); // A, B, C open troves - const aliceTroveId = await th.openTroveWrapper(contracts, th._100pct, await getOpenTroveBoldAmount(dec(10000, 18)), ZERO_ADDRESS, ZERO_ADDRESS, 0, { from: alice, value: dec(10000, 'ether') }) - const bobTroveId = await th.openTroveWrapper(contracts, th._100pct, await getOpenTroveBoldAmount(dec(10000, 18)), ZERO_ADDRESS, ZERO_ADDRESS, 0, { from: bob, value: dec(10000, 'ether') }) - const carolTroveId = await th.openTroveWrapper(contracts, th._100pct, await getOpenTroveBoldAmount(dec(10000, 18)), ZERO_ADDRESS, ZERO_ADDRESS, 0, { from: carol, value: dec(10000, 'ether') }) + const aliceTroveId = await th.openTroveWrapper( + contracts, + th._100pct, + await getOpenTroveBoldAmount(dec(10000, 18)), + ZERO_ADDRESS, + ZERO_ADDRESS, + 0, + { from: alice, value: dec(10000, "ether") }, + ); + const bobTroveId = await th.openTroveWrapper( + contracts, + th._100pct, + await getOpenTroveBoldAmount(dec(10000, 18)), + ZERO_ADDRESS, + ZERO_ADDRESS, + 0, + { from: bob, value: dec(10000, "ether") }, + ); + const carolTroveId = await th.openTroveWrapper( + contracts, + th._100pct, + await getOpenTroveBoldAmount(dec(10000, 18)), + ZERO_ADDRESS, + ZERO_ADDRESS, + 0, + { from: carol, value: dec(10000, "ether") }, + ); // Whale transfers 10k Bold to A, B and C who then deposit it to the SP - const depositors = [alice, bob, carol] + const depositors = [alice, bob, carol]; for (const account of depositors) { - await boldToken.transfer(account, dec(10000, 18), { from: whale }) - await stabilityPool.provideToSP(dec(10000, 18), { from: account }) + await boldToken.transfer(account, dec(10000, 18), { from: whale }); + await stabilityPool.provideToSP(dec(10000, 18), { from: account }); } // Defaulters open trove with 200% ICR - const defaulter_1_TroveId = await th.openTroveWrapper(contracts, th._100pct, await getOpenTroveBoldAmount(dec(5000, 18)), defaulter_1, defaulter_1, 0, { from: defaulter_1, value: '50000000000000000000' }) - const defaulter_2_TroveId = await th.openTroveWrapper(contracts, th._100pct, await getOpenTroveBoldAmount(dec(7000, 18)), defaulter_2, defaulter_2, 0,{ from: defaulter_2, value: '70000000000000000000' }) + const defaulter_1_TroveId = await th.openTroveWrapper( + contracts, + th._100pct, + await getOpenTroveBoldAmount(dec(5000, 18)), + defaulter_1, + defaulter_1, + 0, + { from: defaulter_1, value: "50000000000000000000" }, + ); + const defaulter_2_TroveId = await th.openTroveWrapper( + contracts, + th._100pct, + await getOpenTroveBoldAmount(dec(7000, 18)), + defaulter_2, + defaulter_2, + 0, + { from: defaulter_2, value: "70000000000000000000" }, + ); // price drops by 50%: defaulter ICR falls to 100% await priceFeed.setPrice(dec(100, 18)); @@ -240,45 +429,105 @@ contract('StabilityPool - Withdrawal of stability deposit - Reward calculations' await troveManager.liquidate(defaulter_2_TroveId, { from: owner }); // Check depositors' compounded deposit - const txA = await stabilityPool.withdrawETHGainToTrove(aliceTroveId, { from: alice }) - const txB = await stabilityPool.withdrawETHGainToTrove(bobTroveId, { from: bob }) - const txC = await stabilityPool.withdrawETHGainToTrove(carolTroveId, { from: carol }) + const txA = await stabilityPool.withdrawETHGainToTrove(aliceTroveId, { from: alice }); + const txB = await stabilityPool.withdrawETHGainToTrove(bobTroveId, { from: bob }); + const txC = await stabilityPool.withdrawETHGainToTrove(carolTroveId, { from: carol }); // Grab the ETH gain from the emitted event in the tx log - const alice_ETHWithdrawn = th.getEventArgByName(txA, 'ETHGainWithdrawn', '_ETH').toString() - const bob_ETHWithdrawn = th.getEventArgByName(txB, 'ETHGainWithdrawn', '_ETH').toString() - const carol_ETHWithdrawn = th.getEventArgByName(txC, 'ETHGainWithdrawn', '_ETH').toString() - - assert.isAtMost(th.getDifference((await stabilityPool.getCompoundedBoldDeposit(alice)).toString(), '6000000000000000000000'), 10000) - assert.isAtMost(th.getDifference((await stabilityPool.getCompoundedBoldDeposit(bob)).toString(), '6000000000000000000000'), 10000) - assert.isAtMost(th.getDifference((await stabilityPool.getCompoundedBoldDeposit(carol)).toString(), '6000000000000000000000'), 10000) + const alice_ETHWithdrawn = th.getEventArgByName(txA, "ETHGainWithdrawn", "_ETH").toString(); + const bob_ETHWithdrawn = th.getEventArgByName(txB, "ETHGainWithdrawn", "_ETH").toString(); + const carol_ETHWithdrawn = th.getEventArgByName(txC, "ETHGainWithdrawn", "_ETH").toString(); + + assert.isAtMost( + th.getDifference((await stabilityPool.getCompoundedBoldDeposit(alice)).toString(), "6000000000000000000000"), + 10000, + ); + assert.isAtMost( + th.getDifference((await stabilityPool.getCompoundedBoldDeposit(bob)).toString(), "6000000000000000000000"), + 10000, + ); + assert.isAtMost( + th.getDifference((await stabilityPool.getCompoundedBoldDeposit(carol)).toString(), "6000000000000000000000"), + 10000, + ); // (0.5 + 0.7) * 99.5 / 3 - assert.isAtMost(th.getDifference(alice_ETHWithdrawn, dec(398, 17)), 10000) - assert.isAtMost(th.getDifference(bob_ETHWithdrawn, dec(398, 17)), 10000) - assert.isAtMost(th.getDifference(carol_ETHWithdrawn, dec(398, 17)), 10000) - }) + assert.isAtMost(th.getDifference(alice_ETHWithdrawn, dec(398, 17)), 10000); + assert.isAtMost(th.getDifference(bob_ETHWithdrawn, dec(398, 17)), 10000); + assert.isAtMost(th.getDifference(carol_ETHWithdrawn, dec(398, 17)), 10000); + }); it("withdrawETHGainToTrove(): Depositors with equal initial deposit withdraw correct compounded deposit and ETH Gain after three liquidations of increasing Bold", async () => { // Whale opens Trove with 100k ETH - await th.openTroveWrapper(contracts, th._100pct, await getOpenTroveBoldAmount(dec(100000, 18)), whale, whale, 0, { from: whale, value: dec(100000, 'ether') }) + await th.openTroveWrapper(contracts, th._100pct, await getOpenTroveBoldAmount(dec(100000, 18)), whale, whale, 0, { + from: whale, + value: dec(100000, "ether"), + }); // A, B, C open troves - const aliceTroveId = await th.openTroveWrapper(contracts, th._100pct, await getOpenTroveBoldAmount(dec(10000, 18)), ZERO_ADDRESS, ZERO_ADDRESS, 0, { from: alice, value: dec(10000, 'ether') }) - const bobTroveId = await th.openTroveWrapper(contracts, th._100pct, await getOpenTroveBoldAmount(dec(10000, 18)), ZERO_ADDRESS, ZERO_ADDRESS, 0, { from: bob, value: dec(10000, 'ether') }) - const carolTroveId = await th.openTroveWrapper(contracts, th._100pct, await getOpenTroveBoldAmount(dec(10000, 18)), ZERO_ADDRESS, ZERO_ADDRESS, 0, { from: carol, value: dec(10000, 'ether') }) + const aliceTroveId = await th.openTroveWrapper( + contracts, + th._100pct, + await getOpenTroveBoldAmount(dec(10000, 18)), + ZERO_ADDRESS, + ZERO_ADDRESS, + 0, + { from: alice, value: dec(10000, "ether") }, + ); + const bobTroveId = await th.openTroveWrapper( + contracts, + th._100pct, + await getOpenTroveBoldAmount(dec(10000, 18)), + ZERO_ADDRESS, + ZERO_ADDRESS, + 0, + { from: bob, value: dec(10000, "ether") }, + ); + const carolTroveId = await th.openTroveWrapper( + contracts, + th._100pct, + await getOpenTroveBoldAmount(dec(10000, 18)), + ZERO_ADDRESS, + ZERO_ADDRESS, + 0, + { from: carol, value: dec(10000, "ether") }, + ); // Whale transfers 10k Bold to A, B and C who then deposit it to the SP - const depositors = [alice, bob, carol] + const depositors = [alice, bob, carol]; for (const account of depositors) { - await boldToken.transfer(account, dec(10000, 18), { from: whale }) - await stabilityPool.provideToSP(dec(10000, 18), { from: account }) + await boldToken.transfer(account, dec(10000, 18), { from: whale }); + await stabilityPool.provideToSP(dec(10000, 18), { from: account }); } // Defaulters open trove with 200% ICR - const defaulter_1_TroveId = await th.openTroveWrapper(contracts, th._100pct, await getOpenTroveBoldAmount(dec(5000, 18)), defaulter_1, defaulter_1, 0, { from: defaulter_1, value: '50000000000000000000' }) - const defaulter_2_TroveId = await th.openTroveWrapper(contracts, th._100pct, await getOpenTroveBoldAmount(dec(6000, 18)), defaulter_2, defaulter_2, 0,{ from: defaulter_2, value: '60000000000000000000' }) - const defaulter_3_TroveId = await th.openTroveWrapper(contracts, th._100pct, await getOpenTroveBoldAmount(dec(7000, 18)), defaulter_3, defaulter_3, 0,{ from: defaulter_3, value: '70000000000000000000' }) + const defaulter_1_TroveId = await th.openTroveWrapper( + contracts, + th._100pct, + await getOpenTroveBoldAmount(dec(5000, 18)), + defaulter_1, + defaulter_1, + 0, + { from: defaulter_1, value: "50000000000000000000" }, + ); + const defaulter_2_TroveId = await th.openTroveWrapper( + contracts, + th._100pct, + await getOpenTroveBoldAmount(dec(6000, 18)), + defaulter_2, + defaulter_2, + 0, + { from: defaulter_2, value: "60000000000000000000" }, + ); + const defaulter_3_TroveId = await th.openTroveWrapper( + contracts, + th._100pct, + await getOpenTroveBoldAmount(dec(7000, 18)), + defaulter_3, + defaulter_3, + 0, + { from: defaulter_3, value: "70000000000000000000" }, + ); // price drops by 50%: defaulter ICR falls to 100% await priceFeed.setPrice(dec(100, 18)); @@ -289,46 +538,98 @@ contract('StabilityPool - Withdrawal of stability deposit - Reward calculations' await troveManager.liquidate(defaulter_3_TroveId, { from: owner }); // Check depositors' compounded deposit - const txA = await stabilityPool.withdrawETHGainToTrove(aliceTroveId, { from: alice }) - const txB = await stabilityPool.withdrawETHGainToTrove(bobTroveId, { from: bob }) - const txC = await stabilityPool.withdrawETHGainToTrove(carolTroveId, { from: carol }) + const txA = await stabilityPool.withdrawETHGainToTrove(aliceTroveId, { from: alice }); + const txB = await stabilityPool.withdrawETHGainToTrove(bobTroveId, { from: bob }); + const txC = await stabilityPool.withdrawETHGainToTrove(carolTroveId, { from: carol }); // Grab the ETH gain from the emitted event in the tx log - const alice_ETHWithdrawn = th.getEventArgByName(txA, 'ETHGainWithdrawn', '_ETH').toString() - const bob_ETHWithdrawn = th.getEventArgByName(txB, 'ETHGainWithdrawn', '_ETH').toString() - const carol_ETHWithdrawn = th.getEventArgByName(txC, 'ETHGainWithdrawn', '_ETH').toString() - - assert.isAtMost(th.getDifference((await stabilityPool.getCompoundedBoldDeposit(alice)).toString(), '4000000000000000000000'), 10000) - assert.isAtMost(th.getDifference((await stabilityPool.getCompoundedBoldDeposit(bob)).toString(), '4000000000000000000000'), 10000) - assert.isAtMost(th.getDifference((await stabilityPool.getCompoundedBoldDeposit(carol)).toString(), '4000000000000000000000'), 10000) + const alice_ETHWithdrawn = th.getEventArgByName(txA, "ETHGainWithdrawn", "_ETH").toString(); + const bob_ETHWithdrawn = th.getEventArgByName(txB, "ETHGainWithdrawn", "_ETH").toString(); + const carol_ETHWithdrawn = th.getEventArgByName(txC, "ETHGainWithdrawn", "_ETH").toString(); + + assert.isAtMost( + th.getDifference((await stabilityPool.getCompoundedBoldDeposit(alice)).toString(), "4000000000000000000000"), + 10000, + ); + assert.isAtMost( + th.getDifference((await stabilityPool.getCompoundedBoldDeposit(bob)).toString(), "4000000000000000000000"), + 10000, + ); + assert.isAtMost( + th.getDifference((await stabilityPool.getCompoundedBoldDeposit(carol)).toString(), "4000000000000000000000"), + 10000, + ); // (0.5 + 0.6 + 0.7) * 99.5 / 3 - assert.isAtMost(th.getDifference(alice_ETHWithdrawn, dec(597, 17)), 10000) - assert.isAtMost(th.getDifference(bob_ETHWithdrawn, dec(597, 17)), 10000) - assert.isAtMost(th.getDifference(carol_ETHWithdrawn, dec(597, 17)), 10000) - }) + assert.isAtMost(th.getDifference(alice_ETHWithdrawn, dec(597, 17)), 10000); + assert.isAtMost(th.getDifference(bob_ETHWithdrawn, dec(597, 17)), 10000); + assert.isAtMost(th.getDifference(carol_ETHWithdrawn, dec(597, 17)), 10000); + }); // --- Increasing deposits, identical liquidation amounts --- it("withdrawETHGainToTrove(): Depositors with varying deposits withdraw correct compounded deposit and ETH Gain after two identical liquidations", async () => { // Whale opens Trove with 100k ETH - await th.openTroveWrapper(contracts, th._100pct, await getOpenTroveBoldAmount(dec(100000, 18)), whale, whale, 0, { from: whale, value: dec(100000, 'ether') }) + await th.openTroveWrapper(contracts, th._100pct, await getOpenTroveBoldAmount(dec(100000, 18)), whale, whale, 0, { + from: whale, + value: dec(100000, "ether"), + }); // A, B, C open troves - const aliceTroveId = await th.openTroveWrapper(contracts, th._100pct, await getOpenTroveBoldAmount(dec(10000, 18)), ZERO_ADDRESS, ZERO_ADDRESS, 0, { from: alice, value: dec(10000, 'ether') }) - const bobTroveId = await th.openTroveWrapper(contracts, th._100pct, await getOpenTroveBoldAmount(dec(10000, 18)), ZERO_ADDRESS, ZERO_ADDRESS, 0, { from: bob, value: dec(10000, 'ether') }) - const carolTroveId = await th.openTroveWrapper(contracts, th._100pct, await getOpenTroveBoldAmount(dec(10000, 18)), ZERO_ADDRESS, ZERO_ADDRESS, 0, { from: carol, value: dec(10000, 'ether') }) + const aliceTroveId = await th.openTroveWrapper( + contracts, + th._100pct, + await getOpenTroveBoldAmount(dec(10000, 18)), + ZERO_ADDRESS, + ZERO_ADDRESS, + 0, + { from: alice, value: dec(10000, "ether") }, + ); + const bobTroveId = await th.openTroveWrapper( + contracts, + th._100pct, + await getOpenTroveBoldAmount(dec(10000, 18)), + ZERO_ADDRESS, + ZERO_ADDRESS, + 0, + { from: bob, value: dec(10000, "ether") }, + ); + const carolTroveId = await th.openTroveWrapper( + contracts, + th._100pct, + await getOpenTroveBoldAmount(dec(10000, 18)), + ZERO_ADDRESS, + ZERO_ADDRESS, + 0, + { from: carol, value: dec(10000, "ether") }, + ); // Whale transfers 10k, 20k, 30k Bold to A, B and C respectively who then deposit it to the SP - await boldToken.transfer(alice, dec(10000, 18), { from: whale }) - await stabilityPool.provideToSP(dec(10000, 18), { from: alice }) - await boldToken.transfer(bob, dec(20000, 18), { from: whale }) - await stabilityPool.provideToSP(dec(20000, 18), { from: bob }) - await boldToken.transfer(carol, dec(30000, 18), { from: whale }) - await stabilityPool.provideToSP(dec(30000, 18), { from: carol }) + await boldToken.transfer(alice, dec(10000, 18), { from: whale }); + await stabilityPool.provideToSP(dec(10000, 18), { from: alice }); + await boldToken.transfer(bob, dec(20000, 18), { from: whale }); + await stabilityPool.provideToSP(dec(20000, 18), { from: bob }); + await boldToken.transfer(carol, dec(30000, 18), { from: whale }); + await stabilityPool.provideToSP(dec(30000, 18), { from: carol }); // 2 Defaulters open trove with 200% ICR - const defaulter_1_TroveId = await th.openTroveWrapper(contracts, th._100pct, await getOpenTroveBoldAmount(dec(10000, 18)), defaulter_1, defaulter_1, 0, { from: defaulter_1, value: dec(100, 'ether') }) - const defaulter_2_TroveId = await th.openTroveWrapper(contracts, th._100pct, await getOpenTroveBoldAmount(dec(10000, 18)), defaulter_2, defaulter_2, 0,{ from: defaulter_2, value: dec(100, 'ether') }) + const defaulter_1_TroveId = await th.openTroveWrapper( + contracts, + th._100pct, + await getOpenTroveBoldAmount(dec(10000, 18)), + defaulter_1, + defaulter_1, + 0, + { from: defaulter_1, value: dec(100, "ether") }, + ); + const defaulter_2_TroveId = await th.openTroveWrapper( + contracts, + th._100pct, + await getOpenTroveBoldAmount(dec(10000, 18)), + defaulter_2, + defaulter_2, + 0, + { from: defaulter_2, value: dec(100, "ether") }, + ); // price drops by 50%: defaulter ICR falls to 100% await priceFeed.setPrice(dec(100, 18)); @@ -338,45 +639,105 @@ contract('StabilityPool - Withdrawal of stability deposit - Reward calculations' await troveManager.liquidate(defaulter_2_TroveId, { from: owner }); // Depositors attempt to withdraw everything - const txA = await stabilityPool.withdrawETHGainToTrove(aliceTroveId, { from: alice }) - const txB = await stabilityPool.withdrawETHGainToTrove(bobTroveId, { from: bob }) - const txC = await stabilityPool.withdrawETHGainToTrove(carolTroveId, { from: carol }) + const txA = await stabilityPool.withdrawETHGainToTrove(aliceTroveId, { from: alice }); + const txB = await stabilityPool.withdrawETHGainToTrove(bobTroveId, { from: bob }); + const txC = await stabilityPool.withdrawETHGainToTrove(carolTroveId, { from: carol }); // Grab the ETH gain from the emitted event in the tx log - const alice_ETHWithdrawn = th.getEventArgByName(txA, 'ETHGainWithdrawn', '_ETH').toString() - const bob_ETHWithdrawn = th.getEventArgByName(txB, 'ETHGainWithdrawn', '_ETH').toString() - const carol_ETHWithdrawn = th.getEventArgByName(txC, 'ETHGainWithdrawn', '_ETH').toString() - - assert.isAtMost(th.getDifference((await stabilityPool.getCompoundedBoldDeposit(alice)).toString(), '6666666666666666666666'), 100000) - assert.isAtMost(th.getDifference((await stabilityPool.getCompoundedBoldDeposit(bob)).toString(), '13333333333333333333333'), 100000) - assert.isAtMost(th.getDifference((await stabilityPool.getCompoundedBoldDeposit(carol)).toString(), '20000000000000000000000'), 100000) - - assert.isAtMost(th.getDifference(alice_ETHWithdrawn, '33166666666666666667'), 100000) - assert.isAtMost(th.getDifference(bob_ETHWithdrawn, '66333333333333333333'), 100000) - assert.isAtMost(th.getDifference(carol_ETHWithdrawn, dec(995, 17)), 100000) - }) + const alice_ETHWithdrawn = th.getEventArgByName(txA, "ETHGainWithdrawn", "_ETH").toString(); + const bob_ETHWithdrawn = th.getEventArgByName(txB, "ETHGainWithdrawn", "_ETH").toString(); + const carol_ETHWithdrawn = th.getEventArgByName(txC, "ETHGainWithdrawn", "_ETH").toString(); + + assert.isAtMost( + th.getDifference((await stabilityPool.getCompoundedBoldDeposit(alice)).toString(), "6666666666666666666666"), + 100000, + ); + assert.isAtMost( + th.getDifference((await stabilityPool.getCompoundedBoldDeposit(bob)).toString(), "13333333333333333333333"), + 100000, + ); + assert.isAtMost( + th.getDifference((await stabilityPool.getCompoundedBoldDeposit(carol)).toString(), "20000000000000000000000"), + 100000, + ); + + assert.isAtMost(th.getDifference(alice_ETHWithdrawn, "33166666666666666667"), 100000); + assert.isAtMost(th.getDifference(bob_ETHWithdrawn, "66333333333333333333"), 100000); + assert.isAtMost(th.getDifference(carol_ETHWithdrawn, dec(995, 17)), 100000); + }); it("withdrawETHGainToTrove(): Depositors with varying deposits withdraw correct compounded deposit and ETH Gain after three identical liquidations", async () => { // Whale opens Trove with 100k ETH - await th.openTroveWrapper(contracts, th._100pct, await getOpenTroveBoldAmount(dec(100000, 18)), whale, whale, 0, { from: whale, value: dec(100000, 'ether') }) + await th.openTroveWrapper(contracts, th._100pct, await getOpenTroveBoldAmount(dec(100000, 18)), whale, whale, 0, { + from: whale, + value: dec(100000, "ether"), + }); // A, B, C open troves - const aliceTroveId = await th.openTroveWrapper(contracts, th._100pct, await getOpenTroveBoldAmount(dec(10000, 18)), ZERO_ADDRESS, ZERO_ADDRESS, 0, { from: alice, value: dec(10000, 'ether') }) - const bobTroveId = await th.openTroveWrapper(contracts, th._100pct, await getOpenTroveBoldAmount(dec(10000, 18)), ZERO_ADDRESS, ZERO_ADDRESS, 0, { from: bob, value: dec(10000, 'ether') }) - const carolTroveId = await th.openTroveWrapper(contracts, th._100pct, await getOpenTroveBoldAmount(dec(10000, 18)), ZERO_ADDRESS, ZERO_ADDRESS, 0, { from: carol, value: dec(10000, 'ether') }) + const aliceTroveId = await th.openTroveWrapper( + contracts, + th._100pct, + await getOpenTroveBoldAmount(dec(10000, 18)), + ZERO_ADDRESS, + ZERO_ADDRESS, + 0, + { from: alice, value: dec(10000, "ether") }, + ); + const bobTroveId = await th.openTroveWrapper( + contracts, + th._100pct, + await getOpenTroveBoldAmount(dec(10000, 18)), + ZERO_ADDRESS, + ZERO_ADDRESS, + 0, + { from: bob, value: dec(10000, "ether") }, + ); + const carolTroveId = await th.openTroveWrapper( + contracts, + th._100pct, + await getOpenTroveBoldAmount(dec(10000, 18)), + ZERO_ADDRESS, + ZERO_ADDRESS, + 0, + { from: carol, value: dec(10000, "ether") }, + ); // Whale transfers 10k, 20k, 30k Bold to A, B and C respectively who then deposit it to the SP - await boldToken.transfer(alice, dec(10000, 18), { from: whale }) - await stabilityPool.provideToSP(dec(10000, 18), { from: alice }) - await boldToken.transfer(bob, dec(20000, 18), { from: whale }) - await stabilityPool.provideToSP(dec(20000, 18), { from: bob }) - await boldToken.transfer(carol, dec(30000, 18), { from: whale }) - await stabilityPool.provideToSP(dec(30000, 18), { from: carol }) + await boldToken.transfer(alice, dec(10000, 18), { from: whale }); + await stabilityPool.provideToSP(dec(10000, 18), { from: alice }); + await boldToken.transfer(bob, dec(20000, 18), { from: whale }); + await stabilityPool.provideToSP(dec(20000, 18), { from: bob }); + await boldToken.transfer(carol, dec(30000, 18), { from: whale }); + await stabilityPool.provideToSP(dec(30000, 18), { from: carol }); // Defaulters open trove with 200% ICR - const defaulter_1_TroveId = await th.openTroveWrapper(contracts, th._100pct, await getOpenTroveBoldAmount(dec(10000, 18)), defaulter_1, defaulter_1, 0, { from: defaulter_1, value: dec(100, 'ether') }) - const defaulter_2_TroveId = await th.openTroveWrapper(contracts, th._100pct, await getOpenTroveBoldAmount(dec(10000, 18)), defaulter_2, defaulter_2, 0,{ from: defaulter_2, value: dec(100, 'ether') }) - const defaulter_3_TroveId = await th.openTroveWrapper(contracts, th._100pct, await getOpenTroveBoldAmount(dec(10000, 18)), defaulter_3, defaulter_3, 0,{ from: defaulter_3, value: dec(100, 'ether') }) + const defaulter_1_TroveId = await th.openTroveWrapper( + contracts, + th._100pct, + await getOpenTroveBoldAmount(dec(10000, 18)), + defaulter_1, + defaulter_1, + 0, + { from: defaulter_1, value: dec(100, "ether") }, + ); + const defaulter_2_TroveId = await th.openTroveWrapper( + contracts, + th._100pct, + await getOpenTroveBoldAmount(dec(10000, 18)), + defaulter_2, + defaulter_2, + 0, + { from: defaulter_2, value: dec(100, "ether") }, + ); + const defaulter_3_TroveId = await th.openTroveWrapper( + contracts, + th._100pct, + await getOpenTroveBoldAmount(dec(10000, 18)), + defaulter_3, + defaulter_3, + 0, + { from: defaulter_3, value: dec(100, "ether") }, + ); // price drops by 50%: defaulter ICR falls to 100% await priceFeed.setPrice(dec(100, 18)); @@ -387,55 +748,120 @@ contract('StabilityPool - Withdrawal of stability deposit - Reward calculations' await troveManager.liquidate(defaulter_3_TroveId, { from: owner }); // Depositors attempt to withdraw everything - const txA = await stabilityPool.withdrawETHGainToTrove(aliceTroveId, { from: alice }) - const txB = await stabilityPool.withdrawETHGainToTrove(bobTroveId, { from: bob }) - const txC = await stabilityPool.withdrawETHGainToTrove(carolTroveId, { from: carol }) + const txA = await stabilityPool.withdrawETHGainToTrove(aliceTroveId, { from: alice }); + const txB = await stabilityPool.withdrawETHGainToTrove(bobTroveId, { from: bob }); + const txC = await stabilityPool.withdrawETHGainToTrove(carolTroveId, { from: carol }); // Grab the ETH gain from the emitted event in the tx log - const alice_ETHWithdrawn = th.getEventArgByName(txA, 'ETHGainWithdrawn', '_ETH').toString() - const bob_ETHWithdrawn = th.getEventArgByName(txB, 'ETHGainWithdrawn', '_ETH').toString() - const carol_ETHWithdrawn = th.getEventArgByName(txC, 'ETHGainWithdrawn', '_ETH').toString() - - assert.isAtMost(th.getDifference((await stabilityPool.getCompoundedBoldDeposit(alice)).toString(), '5000000000000000000000'), 100000) - assert.isAtMost(th.getDifference((await stabilityPool.getCompoundedBoldDeposit(bob)).toString(), '10000000000000000000000'), 100000) - assert.isAtMost(th.getDifference((await stabilityPool.getCompoundedBoldDeposit(carol)).toString(), '15000000000000000000000'), 100000) - - assert.isAtMost(th.getDifference(alice_ETHWithdrawn, '49750000000000000000'), 100000) - assert.isAtMost(th.getDifference(bob_ETHWithdrawn, dec(995, 17)), 100000) - assert.isAtMost(th.getDifference(carol_ETHWithdrawn, '149250000000000000000'), 100000) - }) + const alice_ETHWithdrawn = th.getEventArgByName(txA, "ETHGainWithdrawn", "_ETH").toString(); + const bob_ETHWithdrawn = th.getEventArgByName(txB, "ETHGainWithdrawn", "_ETH").toString(); + const carol_ETHWithdrawn = th.getEventArgByName(txC, "ETHGainWithdrawn", "_ETH").toString(); + + assert.isAtMost( + th.getDifference((await stabilityPool.getCompoundedBoldDeposit(alice)).toString(), "5000000000000000000000"), + 100000, + ); + assert.isAtMost( + th.getDifference((await stabilityPool.getCompoundedBoldDeposit(bob)).toString(), "10000000000000000000000"), + 100000, + ); + assert.isAtMost( + th.getDifference((await stabilityPool.getCompoundedBoldDeposit(carol)).toString(), "15000000000000000000000"), + 100000, + ); + + assert.isAtMost(th.getDifference(alice_ETHWithdrawn, "49750000000000000000"), 100000); + assert.isAtMost(th.getDifference(bob_ETHWithdrawn, dec(995, 17)), 100000); + assert.isAtMost(th.getDifference(carol_ETHWithdrawn, "149250000000000000000"), 100000); + }); // --- Varied deposits and varied liquidation amount --- it("withdrawETHGainToTrove(): Depositors with varying deposits withdraw correct compounded deposit and ETH Gain after three varying liquidations", async () => { // Whale opens Trove with 1m ETH - await th.openTroveWrapper(contracts, th._100pct, await getOpenTroveBoldAmount(dec(1000000, 18)), whale, whale, 0, { from: whale, value: dec(1000000, 'ether') }) + await th.openTroveWrapper( + contracts, + th._100pct, + await getOpenTroveBoldAmount(dec(1000000, 18)), + whale, + whale, + 0, + { from: whale, value: dec(1000000, "ether") }, + ); // A, B, C open troves - const aliceTroveId = await th.openTroveWrapper(contracts, th._100pct, await getOpenTroveBoldAmount(dec(10000, 18)), ZERO_ADDRESS, ZERO_ADDRESS, 0, { from: alice, value: dec(10000, 'ether') }) - const bobTroveId = await th.openTroveWrapper(contracts, th._100pct, await getOpenTroveBoldAmount(dec(10000, 18)), ZERO_ADDRESS, ZERO_ADDRESS, 0, { from: bob, value: dec(10000, 'ether') }) - const carolTroveId = await th.openTroveWrapper(contracts, th._100pct, await getOpenTroveBoldAmount(dec(10000, 18)), ZERO_ADDRESS, ZERO_ADDRESS, 0, { from: carol, value: dec(10000, 'ether') }) + const aliceTroveId = await th.openTroveWrapper( + contracts, + th._100pct, + await getOpenTroveBoldAmount(dec(10000, 18)), + ZERO_ADDRESS, + ZERO_ADDRESS, + 0, + { from: alice, value: dec(10000, "ether") }, + ); + const bobTroveId = await th.openTroveWrapper( + contracts, + th._100pct, + await getOpenTroveBoldAmount(dec(10000, 18)), + ZERO_ADDRESS, + ZERO_ADDRESS, + 0, + { from: bob, value: dec(10000, "ether") }, + ); + const carolTroveId = await th.openTroveWrapper( + contracts, + th._100pct, + await getOpenTroveBoldAmount(dec(10000, 18)), + ZERO_ADDRESS, + ZERO_ADDRESS, + 0, + { from: carol, value: dec(10000, "ether") }, + ); /* Depositors provide:- Alice: 2000 Bold Bob: 456000 Bold Carol: 13100 Bold */ // Whale transfers Bold to A, B and C respectively who then deposit it to the SP - await boldToken.transfer(alice, dec(2000, 18), { from: whale }) - await stabilityPool.provideToSP(dec(2000, 18), { from: alice }) - await boldToken.transfer(bob, dec(456000, 18), { from: whale }) - await stabilityPool.provideToSP(dec(456000, 18), { from: bob }) - await boldToken.transfer(carol, dec(13100, 18), { from: whale }) - await stabilityPool.provideToSP(dec(13100, 18), { from: carol }) + await boldToken.transfer(alice, dec(2000, 18), { from: whale }); + await stabilityPool.provideToSP(dec(2000, 18), { from: alice }); + await boldToken.transfer(bob, dec(456000, 18), { from: whale }); + await stabilityPool.provideToSP(dec(456000, 18), { from: bob }); + await boldToken.transfer(carol, dec(13100, 18), { from: whale }); + await stabilityPool.provideToSP(dec(13100, 18), { from: carol }); /* Defaulters open troves - + Defaulter 1: 207000 Bold & 2160 ETH Defaulter 2: 5000 Bold & 50 ETH Defaulter 3: 46700 Bold & 500 ETH */ - const defaulter_1_TroveId = await th.openTroveWrapper(contracts, th._100pct, await getOpenTroveBoldAmount('207000000000000000000000'), defaulter_1, defaulter_1, 0, { from: defaulter_1, value: dec(2160, 18) }) - const defaulter_2_TroveId = await th.openTroveWrapper(contracts, th._100pct, await getOpenTroveBoldAmount(dec(5, 21)), defaulter_2, defaulter_2, 0,{ from: defaulter_2, value: dec(50, 'ether') }) - const defaulter_3_TroveId = await th.openTroveWrapper(contracts, th._100pct, await getOpenTroveBoldAmount('46700000000000000000000'), defaulter_3, defaulter_3, 0,{ from: defaulter_3, value: dec(500, 'ether') }) + const defaulter_1_TroveId = await th.openTroveWrapper( + contracts, + th._100pct, + await getOpenTroveBoldAmount("207000000000000000000000"), + defaulter_1, + defaulter_1, + 0, + { from: defaulter_1, value: dec(2160, 18) }, + ); + const defaulter_2_TroveId = await th.openTroveWrapper( + contracts, + th._100pct, + await getOpenTroveBoldAmount(dec(5, 21)), + defaulter_2, + defaulter_2, + 0, + { from: defaulter_2, value: dec(50, "ether") }, + ); + const defaulter_3_TroveId = await th.openTroveWrapper( + contracts, + th._100pct, + await getOpenTroveBoldAmount("46700000000000000000000"), + defaulter_3, + defaulter_3, + 0, + { from: defaulter_3, value: dec(500, "ether") }, + ); // price drops by 50%: defaulter ICR falls to 100% await priceFeed.setPrice(dec(100, 18)); @@ -446,49 +872,117 @@ contract('StabilityPool - Withdrawal of stability deposit - Reward calculations' await troveManager.liquidate(defaulter_3_TroveId, { from: owner }); // Depositors attempt to withdraw everything - const txA = await stabilityPool.withdrawETHGainToTrove(aliceTroveId, { from: alice }) - const txB = await stabilityPool.withdrawETHGainToTrove(bobTroveId, { from: bob }) - const txC = await stabilityPool.withdrawETHGainToTrove(carolTroveId, { from: carol }) + const txA = await stabilityPool.withdrawETHGainToTrove(aliceTroveId, { from: alice }); + const txB = await stabilityPool.withdrawETHGainToTrove(bobTroveId, { from: bob }); + const txC = await stabilityPool.withdrawETHGainToTrove(carolTroveId, { from: carol }); // Grab the ETH gain from the emitted event in the tx log - const alice_ETHWithdrawn = th.getEventArgByName(txA, 'ETHGainWithdrawn', '_ETH').toString() - const bob_ETHWithdrawn = th.getEventArgByName(txB, 'ETHGainWithdrawn', '_ETH').toString() - const carol_ETHWithdrawn = th.getEventArgByName(txC, 'ETHGainWithdrawn', '_ETH').toString() + const alice_ETHWithdrawn = th.getEventArgByName(txA, "ETHGainWithdrawn", "_ETH").toString(); + const bob_ETHWithdrawn = th.getEventArgByName(txB, "ETHGainWithdrawn", "_ETH").toString(); + const carol_ETHWithdrawn = th.getEventArgByName(txC, "ETHGainWithdrawn", "_ETH").toString(); // () - assert.isAtMost(th.getDifference((await stabilityPool.getCompoundedBoldDeposit(alice)).toString(), '901719380174061000000'), 100000000000) - assert.isAtMost(th.getDifference((await stabilityPool.getCompoundedBoldDeposit(bob)).toString(), '205592018679686000000000'), 10000000000) - assert.isAtMost(th.getDifference((await stabilityPool.getCompoundedBoldDeposit(carol)).toString(), '5906261940140100000000'), 10000000000) + assert.isAtMost( + th.getDifference((await stabilityPool.getCompoundedBoldDeposit(alice)).toString(), "901719380174061000000"), + 100000000000, + ); + assert.isAtMost( + th.getDifference((await stabilityPool.getCompoundedBoldDeposit(bob)).toString(), "205592018679686000000000"), + 10000000000, + ); + assert.isAtMost( + th.getDifference((await stabilityPool.getCompoundedBoldDeposit(carol)).toString(), "5906261940140100000000"), + 10000000000, + ); // 2710 * 0.995 * {2000, 456000, 13100}/4711 - assert.isAtMost(th.getDifference(alice_ETHWithdrawn, '11447463383570366500'), 10000000000) - assert.isAtMost(th.getDifference(bob_ETHWithdrawn, '2610021651454043834000'), 10000000000) - assert.isAtMost(th.getDifference(carol_ETHWithdrawn, '74980885162385912900'), 10000000000) - }) + assert.isAtMost(th.getDifference(alice_ETHWithdrawn, "11447463383570366500"), 10000000000); + assert.isAtMost(th.getDifference(bob_ETHWithdrawn, "2610021651454043834000"), 10000000000); + assert.isAtMost(th.getDifference(carol_ETHWithdrawn, "74980885162385912900"), 10000000000); + }); // --- Deposit enters at t > 0 it("withdrawETHGainToTrove(): A, B, C Deposit -> 2 liquidations -> D deposits -> 1 liquidation. All deposits and liquidations = 100 Bold. A, B, C, D withdraw correct Bold deposit and ETH Gain", async () => { // Whale opens Trove with 100k ETH - await th.openTroveWrapper(contracts, th._100pct, await getOpenTroveBoldAmount(dec(100000, 18)), whale, whale, 0, { from: whale, value: dec(100000, 'ether') }) + await th.openTroveWrapper(contracts, th._100pct, await getOpenTroveBoldAmount(dec(100000, 18)), whale, whale, 0, { + from: whale, + value: dec(100000, "ether"), + }); // A, B, C open troves - const aliceTroveId = await th.openTroveWrapper(contracts, th._100pct, await getOpenTroveBoldAmount(dec(10000, 18)), ZERO_ADDRESS, ZERO_ADDRESS, 0, { from: alice, value: dec(10000, 'ether') }) - const bobTroveId = await th.openTroveWrapper(contracts, th._100pct, await getOpenTroveBoldAmount(dec(10000, 18)), ZERO_ADDRESS, ZERO_ADDRESS, 0, { from: bob, value: dec(10000, 'ether') }) - const carolTroveId = await th.openTroveWrapper(contracts, th._100pct, await getOpenTroveBoldAmount(dec(10000, 18)), ZERO_ADDRESS, ZERO_ADDRESS, 0, { from: carol, value: dec(10000, 'ether') }) - const dennisTroveId = await th.openTroveWrapper(contracts, th._100pct, await getOpenTroveBoldAmount(dec(10000, 18)), ZERO_ADDRESS, ZERO_ADDRESS, 0, { from: dennis, value: dec(10000, 'ether') }) + const aliceTroveId = await th.openTroveWrapper( + contracts, + th._100pct, + await getOpenTroveBoldAmount(dec(10000, 18)), + ZERO_ADDRESS, + ZERO_ADDRESS, + 0, + { from: alice, value: dec(10000, "ether") }, + ); + const bobTroveId = await th.openTroveWrapper( + contracts, + th._100pct, + await getOpenTroveBoldAmount(dec(10000, 18)), + ZERO_ADDRESS, + ZERO_ADDRESS, + 0, + { from: bob, value: dec(10000, "ether") }, + ); + const carolTroveId = await th.openTroveWrapper( + contracts, + th._100pct, + await getOpenTroveBoldAmount(dec(10000, 18)), + ZERO_ADDRESS, + ZERO_ADDRESS, + 0, + { from: carol, value: dec(10000, "ether") }, + ); + const dennisTroveId = await th.openTroveWrapper( + contracts, + th._100pct, + await getOpenTroveBoldAmount(dec(10000, 18)), + ZERO_ADDRESS, + ZERO_ADDRESS, + 0, + { from: dennis, value: dec(10000, "ether") }, + ); // Whale transfers 10k Bold to A, B and C who then deposit it to the SP - const depositors = [alice, bob, carol] + const depositors = [alice, bob, carol]; for (const account of depositors) { - await boldToken.transfer(account, dec(10000, 18), { from: whale }) - await stabilityPool.provideToSP(dec(10000, 18), { from: account }) + await boldToken.transfer(account, dec(10000, 18), { from: whale }); + await stabilityPool.provideToSP(dec(10000, 18), { from: account }); } // Defaulters open trove with 200% ICR - const defaulter_1_TroveId = await th.openTroveWrapper(contracts, th._100pct, await getOpenTroveBoldAmount(dec(10000, 18)), defaulter_1, defaulter_1, 0, { from: defaulter_1, value: dec(100, 'ether') }) - const defaulter_2_TroveId = await th.openTroveWrapper(contracts, th._100pct, await getOpenTroveBoldAmount(dec(10000, 18)), defaulter_2, defaulter_2, 0,{ from: defaulter_2, value: dec(100, 'ether') }) - const defaulter_3_TroveId = await th.openTroveWrapper(contracts, th._100pct, await getOpenTroveBoldAmount(dec(10000, 18)), defaulter_3, defaulter_3, 0,{ from: defaulter_3, value: dec(100, 'ether') }) + const defaulter_1_TroveId = await th.openTroveWrapper( + contracts, + th._100pct, + await getOpenTroveBoldAmount(dec(10000, 18)), + defaulter_1, + defaulter_1, + 0, + { from: defaulter_1, value: dec(100, "ether") }, + ); + const defaulter_2_TroveId = await th.openTroveWrapper( + contracts, + th._100pct, + await getOpenTroveBoldAmount(dec(10000, 18)), + defaulter_2, + defaulter_2, + 0, + { from: defaulter_2, value: dec(100, "ether") }, + ); + const defaulter_3_TroveId = await th.openTroveWrapper( + contracts, + th._100pct, + await getOpenTroveBoldAmount(dec(10000, 18)), + defaulter_3, + defaulter_3, + 0, + { from: defaulter_3, value: dec(100, "ether") }, + ); // price drops by 50%: defaulter ICR falls to 100% await priceFeed.setPrice(dec(100, 18)); @@ -498,58 +992,137 @@ contract('StabilityPool - Withdrawal of stability deposit - Reward calculations' await troveManager.liquidate(defaulter_2_TroveId, { from: owner }); // Whale transfers 10k to Dennis who then provides to SP - await boldToken.transfer(dennis, dec(10000, 18), { from: whale }) - await stabilityPool.provideToSP(dec(10000, 18), { from: dennis }) + await boldToken.transfer(dennis, dec(10000, 18), { from: whale }); + await stabilityPool.provideToSP(dec(10000, 18), { from: dennis }); // Third defaulter liquidated await troveManager.liquidate(defaulter_3_TroveId, { from: owner }); - const txA = await stabilityPool.withdrawETHGainToTrove(aliceTroveId, { from: alice }) - const txB = await stabilityPool.withdrawETHGainToTrove(bobTroveId, { from: bob }) - const txC = await stabilityPool.withdrawETHGainToTrove(carolTroveId, { from: carol }) - const txD = await stabilityPool.withdrawETHGainToTrove(dennisTroveId, { from: dennis }) + const txA = await stabilityPool.withdrawETHGainToTrove(aliceTroveId, { from: alice }); + const txB = await stabilityPool.withdrawETHGainToTrove(bobTroveId, { from: bob }); + const txC = await stabilityPool.withdrawETHGainToTrove(carolTroveId, { from: carol }); + const txD = await stabilityPool.withdrawETHGainToTrove(dennisTroveId, { from: dennis }); // Grab the ETH gain from the emitted event in the tx log - const alice_ETHWithdrawn = th.getEventArgByName(txA, 'ETHGainWithdrawn', '_ETH').toString() - const bob_ETHWithdrawn = th.getEventArgByName(txB, 'ETHGainWithdrawn', '_ETH').toString() - const carol_ETHWithdrawn = th.getEventArgByName(txC, 'ETHGainWithdrawn', '_ETH').toString() - const dennis_ETHWithdrawn = th.getEventArgByName(txD, 'ETHGainWithdrawn', '_ETH').toString() - - assert.isAtMost(th.getDifference((await stabilityPool.getCompoundedBoldDeposit(alice)).toString(), '1666666666666666666666'), 100000) - assert.isAtMost(th.getDifference((await stabilityPool.getCompoundedBoldDeposit(bob)).toString(), '1666666666666666666666'), 100000) - assert.isAtMost(th.getDifference((await stabilityPool.getCompoundedBoldDeposit(carol)).toString(), '1666666666666666666666'), 100000) - - assert.isAtMost(th.getDifference((await stabilityPool.getCompoundedBoldDeposit(dennis)).toString(), '5000000000000000000000'), 100000) - - assert.isAtMost(th.getDifference(alice_ETHWithdrawn, '82916666666666666667'), 100000) - assert.isAtMost(th.getDifference(bob_ETHWithdrawn, '82916666666666666667'), 100000) - assert.isAtMost(th.getDifference(carol_ETHWithdrawn, '82916666666666666667'), 100000) - - assert.isAtMost(th.getDifference(dennis_ETHWithdrawn, '49750000000000000000'), 100000) - }) + const alice_ETHWithdrawn = th.getEventArgByName(txA, "ETHGainWithdrawn", "_ETH").toString(); + const bob_ETHWithdrawn = th.getEventArgByName(txB, "ETHGainWithdrawn", "_ETH").toString(); + const carol_ETHWithdrawn = th.getEventArgByName(txC, "ETHGainWithdrawn", "_ETH").toString(); + const dennis_ETHWithdrawn = th.getEventArgByName(txD, "ETHGainWithdrawn", "_ETH").toString(); + + assert.isAtMost( + th.getDifference((await stabilityPool.getCompoundedBoldDeposit(alice)).toString(), "1666666666666666666666"), + 100000, + ); + assert.isAtMost( + th.getDifference((await stabilityPool.getCompoundedBoldDeposit(bob)).toString(), "1666666666666666666666"), + 100000, + ); + assert.isAtMost( + th.getDifference((await stabilityPool.getCompoundedBoldDeposit(carol)).toString(), "1666666666666666666666"), + 100000, + ); + + assert.isAtMost( + th.getDifference((await stabilityPool.getCompoundedBoldDeposit(dennis)).toString(), "5000000000000000000000"), + 100000, + ); + + assert.isAtMost(th.getDifference(alice_ETHWithdrawn, "82916666666666666667"), 100000); + assert.isAtMost(th.getDifference(bob_ETHWithdrawn, "82916666666666666667"), 100000); + assert.isAtMost(th.getDifference(carol_ETHWithdrawn, "82916666666666666667"), 100000); + + assert.isAtMost(th.getDifference(dennis_ETHWithdrawn, "49750000000000000000"), 100000); + }); it("withdrawETHGainToTrove(): A, B, C Deposit -> 2 liquidations -> D deposits -> 2 liquidations. All deposits and liquidations = 100 Bold. A, B, C, D withdraw correct Bold deposit and ETH Gain", async () => { // Whale opens Trove with 100k ETH - await th.openTroveWrapper(contracts, th._100pct, await getOpenTroveBoldAmount(dec(100000, 18)), whale, whale, 0, { from: whale, value: dec(100000, 'ether') }) + await th.openTroveWrapper(contracts, th._100pct, await getOpenTroveBoldAmount(dec(100000, 18)), whale, whale, 0, { + from: whale, + value: dec(100000, "ether"), + }); // A, B, C open troves - const aliceTroveId = await th.openTroveWrapper(contracts, th._100pct, await getOpenTroveBoldAmount(dec(10000, 18)), ZERO_ADDRESS, ZERO_ADDRESS, 0, { from: alice, value: dec(10000, 'ether') }) - const bobTroveId = await th.openTroveWrapper(contracts, th._100pct, await getOpenTroveBoldAmount(dec(10000, 18)), ZERO_ADDRESS, ZERO_ADDRESS, 0, { from: bob, value: dec(10000, 'ether') }) - const carolTroveId = await th.openTroveWrapper(contracts, th._100pct, await getOpenTroveBoldAmount(dec(10000, 18)), ZERO_ADDRESS, ZERO_ADDRESS, 0, { from: carol, value: dec(10000, 'ether') }) - const dennisTroveId = await th.openTroveWrapper(contracts, th._100pct, await getOpenTroveBoldAmount(dec(10000, 18)), ZERO_ADDRESS, ZERO_ADDRESS, 0, { from: dennis, value: dec(10000, 'ether') }) + const aliceTroveId = await th.openTroveWrapper( + contracts, + th._100pct, + await getOpenTroveBoldAmount(dec(10000, 18)), + ZERO_ADDRESS, + ZERO_ADDRESS, + 0, + { from: alice, value: dec(10000, "ether") }, + ); + const bobTroveId = await th.openTroveWrapper( + contracts, + th._100pct, + await getOpenTroveBoldAmount(dec(10000, 18)), + ZERO_ADDRESS, + ZERO_ADDRESS, + 0, + { from: bob, value: dec(10000, "ether") }, + ); + const carolTroveId = await th.openTroveWrapper( + contracts, + th._100pct, + await getOpenTroveBoldAmount(dec(10000, 18)), + ZERO_ADDRESS, + ZERO_ADDRESS, + 0, + { from: carol, value: dec(10000, "ether") }, + ); + const dennisTroveId = await th.openTroveWrapper( + contracts, + th._100pct, + await getOpenTroveBoldAmount(dec(10000, 18)), + ZERO_ADDRESS, + ZERO_ADDRESS, + 0, + { from: dennis, value: dec(10000, "ether") }, + ); // Whale transfers 10k Bold to A, B and C who then deposit it to the SP - const depositors = [alice, bob, carol] + const depositors = [alice, bob, carol]; for (const account of depositors) { - await boldToken.transfer(account, dec(10000, 18), { from: whale }) - await stabilityPool.provideToSP(dec(10000, 18), { from: account }) + await boldToken.transfer(account, dec(10000, 18), { from: whale }); + await stabilityPool.provideToSP(dec(10000, 18), { from: account }); } // Defaulters open trove with 200% ICR - const defaulter_1_TroveId = await th.openTroveWrapper(contracts, th._100pct, await getOpenTroveBoldAmount(dec(10000, 18)), defaulter_1, defaulter_1, 0, { from: defaulter_1, value: dec(100, 'ether') }) - const defaulter_2_TroveId = await th.openTroveWrapper(contracts, th._100pct, await getOpenTroveBoldAmount(dec(10000, 18)), defaulter_2, defaulter_2, 0,{ from: defaulter_2, value: dec(100, 'ether') }) - const defaulter_3_TroveId = await th.openTroveWrapper(contracts, th._100pct, await getOpenTroveBoldAmount(dec(10000, 18)), defaulter_3, defaulter_3, 0,{ from: defaulter_3, value: dec(100, 'ether') }) - const defaulter_4_TroveId = await th.openTroveWrapper(contracts, th._100pct, await getOpenTroveBoldAmount(dec(10000, 18)), defaulter_4, defaulter_4, 0,{ from: defaulter_4, value: dec(100, 'ether') }) + const defaulter_1_TroveId = await th.openTroveWrapper( + contracts, + th._100pct, + await getOpenTroveBoldAmount(dec(10000, 18)), + defaulter_1, + defaulter_1, + 0, + { from: defaulter_1, value: dec(100, "ether") }, + ); + const defaulter_2_TroveId = await th.openTroveWrapper( + contracts, + th._100pct, + await getOpenTroveBoldAmount(dec(10000, 18)), + defaulter_2, + defaulter_2, + 0, + { from: defaulter_2, value: dec(100, "ether") }, + ); + const defaulter_3_TroveId = await th.openTroveWrapper( + contracts, + th._100pct, + await getOpenTroveBoldAmount(dec(10000, 18)), + defaulter_3, + defaulter_3, + 0, + { from: defaulter_3, value: dec(100, "ether") }, + ); + const defaulter_4_TroveId = await th.openTroveWrapper( + contracts, + th._100pct, + await getOpenTroveBoldAmount(dec(10000, 18)), + defaulter_4, + defaulter_4, + 0, + { from: defaulter_4, value: dec(100, "ether") }, + ); // price drops by 50%: defaulter ICR falls to 100% await priceFeed.setPrice(dec(100, 18)); @@ -559,44 +1132,84 @@ contract('StabilityPool - Withdrawal of stability deposit - Reward calculations' await troveManager.liquidate(defaulter_2_TroveId, { from: owner }); // Dennis opens a trove and provides to SP - await boldToken.transfer(dennis, dec(10000, 18), { from: whale }) - await stabilityPool.provideToSP(dec(10000, 18), { from: dennis }) + await boldToken.transfer(dennis, dec(10000, 18), { from: whale }); + await stabilityPool.provideToSP(dec(10000, 18), { from: dennis }); // Third and fourth defaulters liquidated await troveManager.liquidate(defaulter_3_TroveId, { from: owner }); await troveManager.liquidate(defaulter_4_TroveId, { from: owner }); - const txA = await stabilityPool.withdrawETHGainToTrove(aliceTroveId, { from: alice }) - const txB = await stabilityPool.withdrawETHGainToTrove(bobTroveId, { from: bob }) - const txC = await stabilityPool.withdrawETHGainToTrove(carolTroveId, { from: carol }) - const txD = await stabilityPool.withdrawETHGainToTrove(dennisTroveId, { from: dennis }) + const txA = await stabilityPool.withdrawETHGainToTrove(aliceTroveId, { from: alice }); + const txB = await stabilityPool.withdrawETHGainToTrove(bobTroveId, { from: bob }); + const txC = await stabilityPool.withdrawETHGainToTrove(carolTroveId, { from: carol }); + const txD = await stabilityPool.withdrawETHGainToTrove(dennisTroveId, { from: dennis }); // Grab the ETH gain from the emitted event in the tx log - const alice_ETHWithdrawn = th.getEventArgByName(txA, 'ETHGainWithdrawn', '_ETH').toString() - const bob_ETHWithdrawn = th.getEventArgByName(txB, 'ETHGainWithdrawn', '_ETH').toString() - const carol_ETHWithdrawn = th.getEventArgByName(txC, 'ETHGainWithdrawn', '_ETH').toString() - const dennis_ETHWithdrawn = th.getEventArgByName(txD, 'ETHGainWithdrawn', '_ETH').toString() - - assert.isAtMost(th.getDifference((await stabilityPool.getCompoundedBoldDeposit(alice)).toString(), '0'), 100000) - assert.isAtMost(th.getDifference((await stabilityPool.getCompoundedBoldDeposit(bob)).toString(), '0'), 100000) - assert.isAtMost(th.getDifference((await stabilityPool.getCompoundedBoldDeposit(carol)).toString(), '0'), 100000) - assert.isAtMost(th.getDifference((await stabilityPool.getCompoundedBoldDeposit(dennis)).toString(), '0'), 100000) - - assert.isAtMost(th.getDifference(alice_ETHWithdrawn, dec(995, 17)), 100000) - assert.isAtMost(th.getDifference(bob_ETHWithdrawn, dec(995, 17)), 100000) - assert.isAtMost(th.getDifference(carol_ETHWithdrawn, dec(995, 17)), 100000) - assert.isAtMost(th.getDifference(dennis_ETHWithdrawn, dec(995, 17)), 100000) - }) + const alice_ETHWithdrawn = th.getEventArgByName(txA, "ETHGainWithdrawn", "_ETH").toString(); + const bob_ETHWithdrawn = th.getEventArgByName(txB, "ETHGainWithdrawn", "_ETH").toString(); + const carol_ETHWithdrawn = th.getEventArgByName(txC, "ETHGainWithdrawn", "_ETH").toString(); + const dennis_ETHWithdrawn = th.getEventArgByName(txD, "ETHGainWithdrawn", "_ETH").toString(); + + assert.isAtMost(th.getDifference((await stabilityPool.getCompoundedBoldDeposit(alice)).toString(), "0"), 100000); + assert.isAtMost(th.getDifference((await stabilityPool.getCompoundedBoldDeposit(bob)).toString(), "0"), 100000); + assert.isAtMost(th.getDifference((await stabilityPool.getCompoundedBoldDeposit(carol)).toString(), "0"), 100000); + assert.isAtMost(th.getDifference((await stabilityPool.getCompoundedBoldDeposit(dennis)).toString(), "0"), 100000); + + assert.isAtMost(th.getDifference(alice_ETHWithdrawn, dec(995, 17)), 100000); + assert.isAtMost(th.getDifference(bob_ETHWithdrawn, dec(995, 17)), 100000); + assert.isAtMost(th.getDifference(carol_ETHWithdrawn, dec(995, 17)), 100000); + assert.isAtMost(th.getDifference(dennis_ETHWithdrawn, dec(995, 17)), 100000); + }); it("withdrawETHGainToTrove(): A, B, C Deposit -> 2 liquidations -> D deposits -> 2 liquidations. Various deposit and liquidation vals. A, B, C, D withdraw correct Bold deposit and ETH Gain", async () => { // Whale opens Trove with 1m ETH - await th.openTroveWrapper(contracts, th._100pct, await getOpenTroveBoldAmount(dec(1000000, 18)), whale, whale, 0, { from: whale, value: dec(1000000, 'ether') }) + await th.openTroveWrapper( + contracts, + th._100pct, + await getOpenTroveBoldAmount(dec(1000000, 18)), + whale, + whale, + 0, + { from: whale, value: dec(1000000, "ether") }, + ); // A, B, C, D open troves - const aliceTroveId = await th.openTroveWrapper(contracts, th._100pct, await getOpenTroveBoldAmount(dec(10000, 18)), ZERO_ADDRESS, ZERO_ADDRESS, 0, { from: alice, value: dec(10000, 'ether') }) - const bobTroveId = await th.openTroveWrapper(contracts, th._100pct, await getOpenTroveBoldAmount(dec(10000, 18)), ZERO_ADDRESS, ZERO_ADDRESS, 0, { from: bob, value: dec(10000, 'ether') }) - const carolTroveId = await th.openTroveWrapper(contracts, th._100pct, await getOpenTroveBoldAmount(dec(10000, 18)), ZERO_ADDRESS, ZERO_ADDRESS, 0, { from: carol, value: dec(10000, 'ether') }) - const dennisTroveId = await th.openTroveWrapper(contracts, th._100pct, await getOpenTroveBoldAmount(dec(10000, 18)), ZERO_ADDRESS, ZERO_ADDRESS, 0, { from: dennis, value: dec(10000, 'ether') }) + const aliceTroveId = await th.openTroveWrapper( + contracts, + th._100pct, + await getOpenTroveBoldAmount(dec(10000, 18)), + ZERO_ADDRESS, + ZERO_ADDRESS, + 0, + { from: alice, value: dec(10000, "ether") }, + ); + const bobTroveId = await th.openTroveWrapper( + contracts, + th._100pct, + await getOpenTroveBoldAmount(dec(10000, 18)), + ZERO_ADDRESS, + ZERO_ADDRESS, + 0, + { from: bob, value: dec(10000, "ether") }, + ); + const carolTroveId = await th.openTroveWrapper( + contracts, + th._100pct, + await getOpenTroveBoldAmount(dec(10000, 18)), + ZERO_ADDRESS, + ZERO_ADDRESS, + 0, + { from: carol, value: dec(10000, "ether") }, + ); + const dennisTroveId = await th.openTroveWrapper( + contracts, + th._100pct, + await getOpenTroveBoldAmount(dec(10000, 18)), + ZERO_ADDRESS, + ZERO_ADDRESS, + 0, + { from: dennis, value: dec(10000, "ether") }, + ); /* Depositors open troves and make SP deposit: Alice: 60000 Bold @@ -604,12 +1217,12 @@ contract('StabilityPool - Withdrawal of stability deposit - Reward calculations' Carol: 15000 Bold */ // Whale transfers Bold to A, B and C respectively who then deposit it to the SP - await boldToken.transfer(alice, dec(60000, 18), { from: whale }) - await stabilityPool.provideToSP(dec(60000, 18), { from: alice }) - await boldToken.transfer(bob, dec(20000, 18), { from: whale }) - await stabilityPool.provideToSP(dec(20000, 18), { from: bob }) - await boldToken.transfer(carol, dec(15000, 18), { from: whale }) - await stabilityPool.provideToSP(dec(15000, 18), { from: carol }) + await boldToken.transfer(alice, dec(60000, 18), { from: whale }); + await stabilityPool.provideToSP(dec(60000, 18), { from: alice }); + await boldToken.transfer(bob, dec(20000, 18), { from: whale }); + await stabilityPool.provideToSP(dec(20000, 18), { from: bob }); + await boldToken.transfer(carol, dec(15000, 18), { from: whale }); + await stabilityPool.provideToSP(dec(15000, 18), { from: carol }); /* Defaulters open troves: Defaulter 1: 10000 Bold, 100 ETH @@ -617,10 +1230,42 @@ contract('StabilityPool - Withdrawal of stability deposit - Reward calculations' Defaulter 3: 5000 Bold, 50 ETH Defaulter 4: 40000 Bold, 400 ETH */ - const defaulter_1_TroveId = await th.openTroveWrapper(contracts, th._100pct, await getOpenTroveBoldAmount(dec(10000, 18)), defaulter_1, defaulter_1, 0, { from: defaulter_1, value: dec(100, 'ether') }) - const defaulter_2_TroveId = await th.openTroveWrapper(contracts, th._100pct, await getOpenTroveBoldAmount(dec(25000, 18)), defaulter_2, defaulter_2, 0,{ from: defaulter_2, value: '250000000000000000000' }) - const defaulter_3_TroveId = await th.openTroveWrapper(contracts, th._100pct, await getOpenTroveBoldAmount(dec(5000, 18)), defaulter_3, defaulter_3, 0,{ from: defaulter_3, value: '50000000000000000000' }) - const defaulter_4_TroveId = await th.openTroveWrapper(contracts, th._100pct, await getOpenTroveBoldAmount(dec(40000, 18)), defaulter_4, defaulter_4, 0,{ from: defaulter_4, value: dec(400, 'ether') }) + const defaulter_1_TroveId = await th.openTroveWrapper( + contracts, + th._100pct, + await getOpenTroveBoldAmount(dec(10000, 18)), + defaulter_1, + defaulter_1, + 0, + { from: defaulter_1, value: dec(100, "ether") }, + ); + const defaulter_2_TroveId = await th.openTroveWrapper( + contracts, + th._100pct, + await getOpenTroveBoldAmount(dec(25000, 18)), + defaulter_2, + defaulter_2, + 0, + { from: defaulter_2, value: "250000000000000000000" }, + ); + const defaulter_3_TroveId = await th.openTroveWrapper( + contracts, + th._100pct, + await getOpenTroveBoldAmount(dec(5000, 18)), + defaulter_3, + defaulter_3, + 0, + { from: defaulter_3, value: "50000000000000000000" }, + ); + const defaulter_4_TroveId = await th.openTroveWrapper( + contracts, + th._100pct, + await getOpenTroveBoldAmount(dec(40000, 18)), + defaulter_4, + defaulter_4, + 0, + { from: defaulter_4, value: dec(400, "ether") }, + ); // price drops by 50%: defaulter ICR falls to 100% await priceFeed.setPrice(dec(100, 18)); @@ -630,61 +1275,140 @@ contract('StabilityPool - Withdrawal of stability deposit - Reward calculations' await troveManager.liquidate(defaulter_2_TroveId, { from: owner }); // Dennis provides 25000 Bold - await boldToken.transfer(dennis, dec(25000, 18), { from: whale }) - await stabilityPool.provideToSP(dec(25000, 18), { from: dennis }) + await boldToken.transfer(dennis, dec(25000, 18), { from: whale }); + await stabilityPool.provideToSP(dec(25000, 18), { from: dennis }); // Last two defaulters liquidated await troveManager.liquidate(defaulter_3_TroveId, { from: owner }); await troveManager.liquidate(defaulter_4_TroveId, { from: owner }); // Each depositor withdraws as much as possible - const txA = await stabilityPool.withdrawETHGainToTrove(aliceTroveId, { from: alice }) - const txB = await stabilityPool.withdrawETHGainToTrove(bobTroveId, { from: bob }) - const txC = await stabilityPool.withdrawETHGainToTrove(carolTroveId, { from: carol }) - const txD = await stabilityPool.withdrawETHGainToTrove(dennisTroveId, { from: dennis }) + const txA = await stabilityPool.withdrawETHGainToTrove(aliceTroveId, { from: alice }); + const txB = await stabilityPool.withdrawETHGainToTrove(bobTroveId, { from: bob }); + const txC = await stabilityPool.withdrawETHGainToTrove(carolTroveId, { from: carol }); + const txD = await stabilityPool.withdrawETHGainToTrove(dennisTroveId, { from: dennis }); // Grab the ETH gain from the emitted event in the tx log - const alice_ETHWithdrawn = th.getEventArgByName(txA, 'ETHGainWithdrawn', '_ETH').toString() - const bob_ETHWithdrawn = th.getEventArgByName(txB, 'ETHGainWithdrawn', '_ETH').toString() - const carol_ETHWithdrawn = th.getEventArgByName(txC, 'ETHGainWithdrawn', '_ETH').toString() - const dennis_ETHWithdrawn = th.getEventArgByName(txD, 'ETHGainWithdrawn', '_ETH').toString() - - assert.isAtMost(th.getDifference((await stabilityPool.getCompoundedBoldDeposit(alice)).toString(), '17832817337461300000000'), 100000000000) - assert.isAtMost(th.getDifference((await stabilityPool.getCompoundedBoldDeposit(bob)).toString(), '5944272445820430000000'), 100000000000) - assert.isAtMost(th.getDifference((await stabilityPool.getCompoundedBoldDeposit(carol)).toString(), '4458204334365320000000'), 100000000000) - assert.isAtMost(th.getDifference((await stabilityPool.getCompoundedBoldDeposit(dennis)).toString(), '11764705882352900000000'), 100000000000) + const alice_ETHWithdrawn = th.getEventArgByName(txA, "ETHGainWithdrawn", "_ETH").toString(); + const bob_ETHWithdrawn = th.getEventArgByName(txB, "ETHGainWithdrawn", "_ETH").toString(); + const carol_ETHWithdrawn = th.getEventArgByName(txC, "ETHGainWithdrawn", "_ETH").toString(); + const dennis_ETHWithdrawn = th.getEventArgByName(txD, "ETHGainWithdrawn", "_ETH").toString(); + + assert.isAtMost( + th.getDifference((await stabilityPool.getCompoundedBoldDeposit(alice)).toString(), "17832817337461300000000"), + 100000000000, + ); + assert.isAtMost( + th.getDifference((await stabilityPool.getCompoundedBoldDeposit(bob)).toString(), "5944272445820430000000"), + 100000000000, + ); + assert.isAtMost( + th.getDifference((await stabilityPool.getCompoundedBoldDeposit(carol)).toString(), "4458204334365320000000"), + 100000000000, + ); + assert.isAtMost( + th.getDifference((await stabilityPool.getCompoundedBoldDeposit(dennis)).toString(), "11764705882352900000000"), + 100000000000, + ); // 3.5*0.995 * {60000,20000,15000,0} / 95000 + 450*0.995 * {60000/950*{60000,20000,15000},25000} / (120000-35000) - assert.isAtMost(th.getDifference(alice_ETHWithdrawn, '419563467492260055900'), 100000000000) - assert.isAtMost(th.getDifference(bob_ETHWithdrawn, '139854489164086692700'), 100000000000) - assert.isAtMost(th.getDifference(carol_ETHWithdrawn, '104890866873065014000'), 100000000000) - assert.isAtMost(th.getDifference(dennis_ETHWithdrawn, '131691176470588233700'), 100000000000) - }) + assert.isAtMost(th.getDifference(alice_ETHWithdrawn, "419563467492260055900"), 100000000000); + assert.isAtMost(th.getDifference(bob_ETHWithdrawn, "139854489164086692700"), 100000000000); + assert.isAtMost(th.getDifference(carol_ETHWithdrawn, "104890866873065014000"), 100000000000); + assert.isAtMost(th.getDifference(dennis_ETHWithdrawn, "131691176470588233700"), 100000000000); + }); // --- Depositor leaves --- it("withdrawETHGainToTrove(): A, B, C, D deposit -> 2 liquidations -> D withdraws -> 2 liquidations. All deposits and liquidations = 100 Bold. A, B, C, D withdraw correct Bold deposit and ETH Gain", async () => { // Whale opens Trove with 100k ETH - await th.openTroveWrapper(contracts, th._100pct, await getOpenTroveBoldAmount(dec(100000, 18)), whale, whale, 0, { from: whale, value: dec(100000, 'ether') }) + await th.openTroveWrapper(contracts, th._100pct, await getOpenTroveBoldAmount(dec(100000, 18)), whale, whale, 0, { + from: whale, + value: dec(100000, "ether"), + }); // A, B, C, D open troves - const aliceTroveId = await th.openTroveWrapper(contracts, th._100pct, await getOpenTroveBoldAmount(dec(10000, 18)), ZERO_ADDRESS, ZERO_ADDRESS, 0, { from: alice, value: dec(10000, 'ether') }) - const bobTroveId = await th.openTroveWrapper(contracts, th._100pct, await getOpenTroveBoldAmount(dec(10000, 18)), ZERO_ADDRESS, ZERO_ADDRESS, 0, { from: bob, value: dec(10000, 'ether') }) - const carolTroveId = await th.openTroveWrapper(contracts, th._100pct, await getOpenTroveBoldAmount(dec(10000, 18)), ZERO_ADDRESS, ZERO_ADDRESS, 0, { from: carol, value: dec(10000, 'ether') }) - const dennisTroveId = await th.openTroveWrapper(contracts, th._100pct, await getOpenTroveBoldAmount(dec(10000, 18)), ZERO_ADDRESS, ZERO_ADDRESS, 0, { from: dennis, value: dec(10000, 'ether') }) + const aliceTroveId = await th.openTroveWrapper( + contracts, + th._100pct, + await getOpenTroveBoldAmount(dec(10000, 18)), + ZERO_ADDRESS, + ZERO_ADDRESS, + 0, + { from: alice, value: dec(10000, "ether") }, + ); + const bobTroveId = await th.openTroveWrapper( + contracts, + th._100pct, + await getOpenTroveBoldAmount(dec(10000, 18)), + ZERO_ADDRESS, + ZERO_ADDRESS, + 0, + { from: bob, value: dec(10000, "ether") }, + ); + const carolTroveId = await th.openTroveWrapper( + contracts, + th._100pct, + await getOpenTroveBoldAmount(dec(10000, 18)), + ZERO_ADDRESS, + ZERO_ADDRESS, + 0, + { from: carol, value: dec(10000, "ether") }, + ); + const dennisTroveId = await th.openTroveWrapper( + contracts, + th._100pct, + await getOpenTroveBoldAmount(dec(10000, 18)), + ZERO_ADDRESS, + ZERO_ADDRESS, + 0, + { from: dennis, value: dec(10000, "ether") }, + ); // Whale transfers 10k Bold to A, B and C who then deposit it to the SP - const depositors = [alice, bob, carol, dennis] + const depositors = [alice, bob, carol, dennis]; for (const account of depositors) { - await boldToken.transfer(account, dec(10000, 18), { from: whale }) - await stabilityPool.provideToSP(dec(10000, 18), { from: account }) + await boldToken.transfer(account, dec(10000, 18), { from: whale }); + await stabilityPool.provideToSP(dec(10000, 18), { from: account }); } // Defaulters open trove with 200% ICR - const defaulter_1_TroveId = await th.openTroveWrapper(contracts, th._100pct, await getOpenTroveBoldAmount(dec(10000, 18)), defaulter_1, defaulter_1, 0, { from: defaulter_1, value: dec(100, 'ether') }) - const defaulter_2_TroveId = await th.openTroveWrapper(contracts, th._100pct, await getOpenTroveBoldAmount(dec(10000, 18)), defaulter_2, defaulter_2, 0,{ from: defaulter_2, value: dec(100, 'ether') }) - const defaulter_3_TroveId = await th.openTroveWrapper(contracts, th._100pct, await getOpenTroveBoldAmount(dec(10000, 18)), defaulter_3, defaulter_3, 0,{ from: defaulter_3, value: dec(100, 'ether') }) - const defaulter_4_TroveId = await th.openTroveWrapper(contracts, th._100pct, await getOpenTroveBoldAmount(dec(10000, 18)), defaulter_4, defaulter_4, 0,{ from: defaulter_4, value: dec(100, 'ether') }) + const defaulter_1_TroveId = await th.openTroveWrapper( + contracts, + th._100pct, + await getOpenTroveBoldAmount(dec(10000, 18)), + defaulter_1, + defaulter_1, + 0, + { from: defaulter_1, value: dec(100, "ether") }, + ); + const defaulter_2_TroveId = await th.openTroveWrapper( + contracts, + th._100pct, + await getOpenTroveBoldAmount(dec(10000, 18)), + defaulter_2, + defaulter_2, + 0, + { from: defaulter_2, value: dec(100, "ether") }, + ); + const defaulter_3_TroveId = await th.openTroveWrapper( + contracts, + th._100pct, + await getOpenTroveBoldAmount(dec(10000, 18)), + defaulter_3, + defaulter_3, + 0, + { from: defaulter_3, value: dec(100, "ether") }, + ); + const defaulter_4_TroveId = await th.openTroveWrapper( + contracts, + th._100pct, + await getOpenTroveBoldAmount(dec(10000, 18)), + defaulter_4, + defaulter_4, + 0, + { from: defaulter_4, value: dec(100, "ether") }, + ); // price drops by 50%: defaulter ICR falls to 100% await priceFeed.setPrice(dec(100, 18)); @@ -695,45 +1419,75 @@ contract('StabilityPool - Withdrawal of stability deposit - Reward calculations' // Dennis withdraws his deposit and ETH gain // Increasing the price for a moment to avoid pending liquidations to block withdrawal - await priceFeed.setPrice(dec(200, 18)) - const txD = await stabilityPool.withdrawETHGainToTrove(dennisTroveId, { from: dennis }) - await priceFeed.setPrice(dec(100, 18)) + await priceFeed.setPrice(dec(200, 18)); + const txD = await stabilityPool.withdrawETHGainToTrove(dennisTroveId, { from: dennis }); + await priceFeed.setPrice(dec(100, 18)); - const dennis_ETHWithdrawn = th.getEventArgByName(txD, 'ETHGainWithdrawn', '_ETH').toString() - assert.isAtMost(th.getDifference((await stabilityPool.getCompoundedBoldDeposit(dennis)).toString(), '5000000000000000000000'), 100000) - assert.isAtMost(th.getDifference(dennis_ETHWithdrawn, '49750000000000000000'), 100000) + const dennis_ETHWithdrawn = th.getEventArgByName(txD, "ETHGainWithdrawn", "_ETH").toString(); + assert.isAtMost( + th.getDifference((await stabilityPool.getCompoundedBoldDeposit(dennis)).toString(), "5000000000000000000000"), + 100000, + ); + assert.isAtMost(th.getDifference(dennis_ETHWithdrawn, "49750000000000000000"), 100000); // Two more defaulters are liquidated await troveManager.liquidate(defaulter_3_TroveId, { from: owner }); await troveManager.liquidate(defaulter_4_TroveId, { from: owner }); - const txA = await stabilityPool.withdrawETHGainToTrove(aliceTroveId, { from: alice }) - const txB = await stabilityPool.withdrawETHGainToTrove(bobTroveId, { from: bob }) - const txC = await stabilityPool.withdrawETHGainToTrove(carolTroveId, { from: carol }) + const txA = await stabilityPool.withdrawETHGainToTrove(aliceTroveId, { from: alice }); + const txB = await stabilityPool.withdrawETHGainToTrove(bobTroveId, { from: bob }); + const txC = await stabilityPool.withdrawETHGainToTrove(carolTroveId, { from: carol }); // Grab the ETH gain from the emitted event in the tx log - const alice_ETHWithdrawn = th.getEventArgByName(txA, 'ETHGainWithdrawn', '_ETH').toString() - const bob_ETHWithdrawn = th.getEventArgByName(txB, 'ETHGainWithdrawn', '_ETH').toString() - const carol_ETHWithdrawn = th.getEventArgByName(txC, 'ETHGainWithdrawn', '_ETH').toString() + const alice_ETHWithdrawn = th.getEventArgByName(txA, "ETHGainWithdrawn", "_ETH").toString(); + const bob_ETHWithdrawn = th.getEventArgByName(txB, "ETHGainWithdrawn", "_ETH").toString(); + const carol_ETHWithdrawn = th.getEventArgByName(txC, "ETHGainWithdrawn", "_ETH").toString(); - assert.isAtMost(th.getDifference((await stabilityPool.getCompoundedBoldDeposit(alice)).toString(), '0'), 1000) - assert.isAtMost(th.getDifference((await stabilityPool.getCompoundedBoldDeposit(bob)).toString(), '0'), 1000) - assert.isAtMost(th.getDifference((await stabilityPool.getCompoundedBoldDeposit(carol)).toString(), '0'), 1000) + assert.isAtMost(th.getDifference((await stabilityPool.getCompoundedBoldDeposit(alice)).toString(), "0"), 1000); + assert.isAtMost(th.getDifference((await stabilityPool.getCompoundedBoldDeposit(bob)).toString(), "0"), 1000); + assert.isAtMost(th.getDifference((await stabilityPool.getCompoundedBoldDeposit(carol)).toString(), "0"), 1000); - assert.isAtMost(th.getDifference(alice_ETHWithdrawn, dec(995, 17)), 100000) - assert.isAtMost(th.getDifference(bob_ETHWithdrawn, dec(995, 17)), 100000) - assert.isAtMost(th.getDifference(carol_ETHWithdrawn, dec(995, 17)), 100000) - }) + assert.isAtMost(th.getDifference(alice_ETHWithdrawn, dec(995, 17)), 100000); + assert.isAtMost(th.getDifference(bob_ETHWithdrawn, dec(995, 17)), 100000); + assert.isAtMost(th.getDifference(carol_ETHWithdrawn, dec(995, 17)), 100000); + }); it("withdrawETHGainToTrove(): A, B, C, D deposit -> 2 liquidations -> D withdraws -> 2 liquidations. Various deposit and liquidation vals. A, B, C, D withdraw correct Bold deposit and ETH Gain", async () => { // Whale opens Trove with 100k ETH - await th.openTroveWrapper(contracts, th._100pct, await getOpenTroveBoldAmount(dec(100000, 18)), whale, whale, 0, { from: whale, value: dec(100000, 'ether') }) + await th.openTroveWrapper(contracts, th._100pct, await getOpenTroveBoldAmount(dec(100000, 18)), whale, whale, 0, { + from: whale, + value: dec(100000, "ether"), + }); // A, B, C, D open troves - const aliceTroveId = await th.openTroveWrapper(contracts, th._100pct, await getOpenTroveBoldAmount(dec(10000, 18)), ZERO_ADDRESS, ZERO_ADDRESS, 0, { from: alice, value: dec(10000, 'ether') }) - const bobTroveId = await th.openTroveWrapper(contracts, th._100pct, await getOpenTroveBoldAmount(dec(10000, 18)), ZERO_ADDRESS, ZERO_ADDRESS, 0, { from: bob, value: dec(10000, 'ether') }) - const carolTroveId = await th.openTroveWrapper(contracts, th._100pct, await getOpenTroveBoldAmount(dec(10000, 18)), ZERO_ADDRESS, ZERO_ADDRESS, 0, { from: carol, value: dec(10000, 'ether') }) - + const aliceTroveId = await th.openTroveWrapper( + contracts, + th._100pct, + await getOpenTroveBoldAmount(dec(10000, 18)), + ZERO_ADDRESS, + ZERO_ADDRESS, + 0, + { from: alice, value: dec(10000, "ether") }, + ); + const bobTroveId = await th.openTroveWrapper( + contracts, + th._100pct, + await getOpenTroveBoldAmount(dec(10000, 18)), + ZERO_ADDRESS, + ZERO_ADDRESS, + 0, + { from: bob, value: dec(10000, "ether") }, + ); + const carolTroveId = await th.openTroveWrapper( + contracts, + th._100pct, + await getOpenTroveBoldAmount(dec(10000, 18)), + ZERO_ADDRESS, + ZERO_ADDRESS, + 0, + { from: carol, value: dec(10000, "ether") }, + ); + /* Initial deposits: Alice: 20000 Bold Bob: 25000 Bold @@ -741,14 +1495,14 @@ contract('StabilityPool - Withdrawal of stability deposit - Reward calculations' Dennis: 40000 Bold */ // Whale transfers Bold to A, B,C and D respectively who then deposit it to the SP - await boldToken.transfer(alice, dec(20000, 18), { from: whale }) - await stabilityPool.provideToSP(dec(20000, 18), { from: alice }) - await boldToken.transfer(bob, dec(25000, 18), { from: whale }) - await stabilityPool.provideToSP(dec(25000, 18), { from: bob }) - await boldToken.transfer(carol, dec(12500, 18), { from: whale }) - await stabilityPool.provideToSP(dec(12500, 18), { from: carol }) - await boldToken.transfer(dennis, dec(40000, 18), { from: whale }) - await stabilityPool.provideToSP(dec(40000, 18), { from: dennis }) + await boldToken.transfer(alice, dec(20000, 18), { from: whale }); + await stabilityPool.provideToSP(dec(20000, 18), { from: alice }); + await boldToken.transfer(bob, dec(25000, 18), { from: whale }); + await stabilityPool.provideToSP(dec(25000, 18), { from: bob }); + await boldToken.transfer(carol, dec(12500, 18), { from: whale }); + await stabilityPool.provideToSP(dec(12500, 18), { from: carol }); + await boldToken.transfer(dennis, dec(40000, 18), { from: whale }); + await stabilityPool.provideToSP(dec(40000, 18), { from: dennis }); /* Defaulters open troves: Defaulter 1: 10000 Bold @@ -756,10 +1510,42 @@ contract('StabilityPool - Withdrawal of stability deposit - Reward calculations' Defaulter 3: 30000 Bold Defaulter 4: 5000 Bold */ - const defaulter_1_TroveId = await th.openTroveWrapper(contracts, th._100pct, await getOpenTroveBoldAmount(dec(10000, 18)), defaulter_1, defaulter_1, 0, { from: defaulter_1, value: dec(100, 'ether') }) - const defaulter_2_TroveId = await th.openTroveWrapper(contracts, th._100pct, await getOpenTroveBoldAmount(dec(20000, 18)), defaulter_2, defaulter_2, 0,{ from: defaulter_2, value: dec(200, 'ether') }) - const defaulter_3_TroveId = await th.openTroveWrapper(contracts, th._100pct, await getOpenTroveBoldAmount(dec(30000, 18)), defaulter_3, defaulter_3, 0,{ from: defaulter_3, value: dec(300, 'ether') }) - const defaulter_4_TroveId = await th.openTroveWrapper(contracts, th._100pct, await getOpenTroveBoldAmount(dec(5000, 18)), defaulter_4, defaulter_4, 0,{ from: defaulter_4, value: '50000000000000000000' }) + const defaulter_1_TroveId = await th.openTroveWrapper( + contracts, + th._100pct, + await getOpenTroveBoldAmount(dec(10000, 18)), + defaulter_1, + defaulter_1, + 0, + { from: defaulter_1, value: dec(100, "ether") }, + ); + const defaulter_2_TroveId = await th.openTroveWrapper( + contracts, + th._100pct, + await getOpenTroveBoldAmount(dec(20000, 18)), + defaulter_2, + defaulter_2, + 0, + { from: defaulter_2, value: dec(200, "ether") }, + ); + const defaulter_3_TroveId = await th.openTroveWrapper( + contracts, + th._100pct, + await getOpenTroveBoldAmount(dec(30000, 18)), + defaulter_3, + defaulter_3, + 0, + { from: defaulter_3, value: dec(300, "ether") }, + ); + const defaulter_4_TroveId = await th.openTroveWrapper( + contracts, + th._100pct, + await getOpenTroveBoldAmount(dec(5000, 18)), + defaulter_4, + defaulter_4, + 0, + { from: defaulter_4, value: "50000000000000000000" }, + ); // price drops by 50%: defaulter ICR falls to 100% await priceFeed.setPrice(dec(100, 18)); @@ -770,60 +1556,131 @@ contract('StabilityPool - Withdrawal of stability deposit - Reward calculations' // Dennis withdraws his deposit and ETH gain // Increasing the price for a moment to avoid pending liquidations to block withdrawal - await priceFeed.setPrice(dec(200, 18)) - const txD = await stabilityPool.withdrawFromSP(dec(40000, 18), { from: dennis }) - await priceFeed.setPrice(dec(100, 18)) + await priceFeed.setPrice(dec(200, 18)); + const txD = await stabilityPool.withdrawFromSP(dec(40000, 18), { from: dennis }); + await priceFeed.setPrice(dec(100, 18)); - const dennis_ETHWithdrawn = th.getEventArgByName(txD, 'ETHGainWithdrawn', '_ETH').toString() - assert.isAtMost(th.getDifference((await boldToken.balanceOf(dennis)).toString(), '27692307692307700000000'), 100000000000) + const dennis_ETHWithdrawn = th.getEventArgByName(txD, "ETHGainWithdrawn", "_ETH").toString(); + assert.isAtMost( + th.getDifference((await boldToken.balanceOf(dennis)).toString(), "27692307692307700000000"), + 100000000000, + ); // 300*0.995 * 40000/97500 - assert.isAtMost(th.getDifference(dennis_ETHWithdrawn, '122461538461538466100'), 100000000000) + assert.isAtMost(th.getDifference(dennis_ETHWithdrawn, "122461538461538466100"), 100000000000); // Two more defaulters are liquidated await troveManager.liquidate(defaulter_3_TroveId, { from: owner }); await troveManager.liquidate(defaulter_4_TroveId, { from: owner }); - const txA = await stabilityPool.withdrawETHGainToTrove(aliceTroveId, { from: alice }) - const txB = await stabilityPool.withdrawETHGainToTrove(bobTroveId, { from: bob }) - const txC = await stabilityPool.withdrawETHGainToTrove(carolTroveId, { from: carol }) + const txA = await stabilityPool.withdrawETHGainToTrove(aliceTroveId, { from: alice }); + const txB = await stabilityPool.withdrawETHGainToTrove(bobTroveId, { from: bob }); + const txC = await stabilityPool.withdrawETHGainToTrove(carolTroveId, { from: carol }); // Grab the ETH gain from the emitted event in the tx log - const alice_ETHWithdrawn = th.getEventArgByName(txA, 'ETHGainWithdrawn', '_ETH').toString() - const bob_ETHWithdrawn = th.getEventArgByName(txB, 'ETHGainWithdrawn', '_ETH').toString() - const carol_ETHWithdrawn = th.getEventArgByName(txC, 'ETHGainWithdrawn', '_ETH').toString() - - assert.isAtMost(th.getDifference((await stabilityPool.getCompoundedBoldDeposit(alice)).toString(), '1672240802675590000000'), 10000000000) - assert.isAtMost(th.getDifference((await stabilityPool.getCompoundedBoldDeposit(bob)).toString(), '2090301003344480000000'), 100000000000) - assert.isAtMost(th.getDifference((await stabilityPool.getCompoundedBoldDeposit(carol)).toString(), '1045150501672240000000'), 100000000000) + const alice_ETHWithdrawn = th.getEventArgByName(txA, "ETHGainWithdrawn", "_ETH").toString(); + const bob_ETHWithdrawn = th.getEventArgByName(txB, "ETHGainWithdrawn", "_ETH").toString(); + const carol_ETHWithdrawn = th.getEventArgByName(txC, "ETHGainWithdrawn", "_ETH").toString(); + + assert.isAtMost( + th.getDifference((await stabilityPool.getCompoundedBoldDeposit(alice)).toString(), "1672240802675590000000"), + 10000000000, + ); + assert.isAtMost( + th.getDifference((await stabilityPool.getCompoundedBoldDeposit(bob)).toString(), "2090301003344480000000"), + 100000000000, + ); + assert.isAtMost( + th.getDifference((await stabilityPool.getCompoundedBoldDeposit(carol)).toString(), "1045150501672240000000"), + 100000000000, + ); // 300*0.995 * {20000,25000,12500}/97500 + 350*0.995 * {20000,25000,12500}/57500 - assert.isAtMost(th.getDifference(alice_ETHWithdrawn, '182361204013377919900'), 100000000000) - assert.isAtMost(th.getDifference(bob_ETHWithdrawn, '227951505016722411000'), 100000000000) - assert.isAtMost(th.getDifference(carol_ETHWithdrawn, '113975752508361205500'), 100000000000) - }) + assert.isAtMost(th.getDifference(alice_ETHWithdrawn, "182361204013377919900"), 100000000000); + assert.isAtMost(th.getDifference(bob_ETHWithdrawn, "227951505016722411000"), 100000000000); + assert.isAtMost(th.getDifference(carol_ETHWithdrawn, "113975752508361205500"), 100000000000); + }); // --- One deposit enters at t > 0, and another leaves later --- it("withdrawETHGainToTrove(): A, B, D deposit -> 2 liquidations -> C makes deposit -> 1 liquidation -> D withdraws -> 1 liquidation. All deposits: 100 Bold. Liquidations: 100,100,100,50. A, B, C, D withdraw correct Bold deposit and ETH Gain", async () => { // Whale opens Trove with 100k ETH - await th.openTroveWrapper(contracts, th._100pct, await getOpenTroveBoldAmount(dec(100000, 18)), whale, whale, 0, { from: whale, value: dec(100000, 'ether') }) + await th.openTroveWrapper(contracts, th._100pct, await getOpenTroveBoldAmount(dec(100000, 18)), whale, whale, 0, { + from: whale, + value: dec(100000, "ether"), + }); // A, B, C, D open troves - const aliceTroveId = await th.openTroveWrapper(contracts, th._100pct, await getOpenTroveBoldAmount(dec(10000, 18)), ZERO_ADDRESS, ZERO_ADDRESS, 0, { from: alice, value: dec(10000, 'ether') }) - const bobTroveId = await th.openTroveWrapper(contracts, th._100pct, await getOpenTroveBoldAmount(dec(10000, 18)), ZERO_ADDRESS, ZERO_ADDRESS, 0, { from: bob, value: dec(10000, 'ether') }) - const carolTroveId = await th.openTroveWrapper(contracts, th._100pct, await getOpenTroveBoldAmount(dec(10000, 18)), ZERO_ADDRESS, ZERO_ADDRESS, 0, { from: carol, value: dec(10000, 'ether') }) - + const aliceTroveId = await th.openTroveWrapper( + contracts, + th._100pct, + await getOpenTroveBoldAmount(dec(10000, 18)), + ZERO_ADDRESS, + ZERO_ADDRESS, + 0, + { from: alice, value: dec(10000, "ether") }, + ); + const bobTroveId = await th.openTroveWrapper( + contracts, + th._100pct, + await getOpenTroveBoldAmount(dec(10000, 18)), + ZERO_ADDRESS, + ZERO_ADDRESS, + 0, + { from: bob, value: dec(10000, "ether") }, + ); + const carolTroveId = await th.openTroveWrapper( + contracts, + th._100pct, + await getOpenTroveBoldAmount(dec(10000, 18)), + ZERO_ADDRESS, + ZERO_ADDRESS, + 0, + { from: carol, value: dec(10000, "ether") }, + ); + // Whale transfers 10k Bold to A, B and D who then deposit it to the SP - const depositors = [alice, bob, dennis] + const depositors = [alice, bob, dennis]; for (const account of depositors) { - await boldToken.transfer(account, dec(10000, 18), { from: whale }) - await stabilityPool.provideToSP(dec(10000, 18), { from: account }) + await boldToken.transfer(account, dec(10000, 18), { from: whale }); + await stabilityPool.provideToSP(dec(10000, 18), { from: account }); } // Defaulters open troves - const defaulter_1_TroveId = await th.openTroveWrapper(contracts, th._100pct, await getOpenTroveBoldAmount(dec(10000, 18)), defaulter_1, defaulter_1, 0, { from: defaulter_1, value: dec(100, 'ether') }) - const defaulter_2_TroveId = await th.openTroveWrapper(contracts, th._100pct, await getOpenTroveBoldAmount(dec(10000, 18)), defaulter_2, defaulter_2, 0, { from: defaulter_2, value: dec(100, 'ether') }) - const defaulter_3_TroveId = await th.openTroveWrapper(contracts, th._100pct, await getOpenTroveBoldAmount(dec(10000, 18)), defaulter_3, defaulter_3, 0, { from: defaulter_3, value: dec(100, 'ether') }) - const defaulter_4_TroveId = await th.openTroveWrapper(contracts, th._100pct, await getOpenTroveBoldAmount(dec(5000, 18)), defaulter_4, defaulter_4, 0, { from: defaulter_4, value: '50000000000000000000' }) + const defaulter_1_TroveId = await th.openTroveWrapper( + contracts, + th._100pct, + await getOpenTroveBoldAmount(dec(10000, 18)), + defaulter_1, + defaulter_1, + 0, + { from: defaulter_1, value: dec(100, "ether") }, + ); + const defaulter_2_TroveId = await th.openTroveWrapper( + contracts, + th._100pct, + await getOpenTroveBoldAmount(dec(10000, 18)), + defaulter_2, + defaulter_2, + 0, + { from: defaulter_2, value: dec(100, "ether") }, + ); + const defaulter_3_TroveId = await th.openTroveWrapper( + contracts, + th._100pct, + await getOpenTroveBoldAmount(dec(10000, 18)), + defaulter_3, + defaulter_3, + 0, + { from: defaulter_3, value: dec(100, "ether") }, + ); + const defaulter_4_TroveId = await th.openTroveWrapper( + contracts, + th._100pct, + await getOpenTroveBoldAmount(dec(5000, 18)), + defaulter_4, + defaulter_4, + 0, + { from: defaulter_4, value: "50000000000000000000" }, + ); // price drops by 50%: defaulter ICR falls to 100% await priceFeed.setPrice(dec(100, 18)); @@ -833,40 +1690,52 @@ contract('StabilityPool - Withdrawal of stability deposit - Reward calculations' await troveManager.liquidate(defaulter_2_TroveId, { from: owner }); // Carol makes deposit - await boldToken.transfer(carol, dec(10000, 18), { from: whale }) - await stabilityPool.provideToSP(dec(10000, 18), { from: carol }) + await boldToken.transfer(carol, dec(10000, 18), { from: whale }); + await stabilityPool.provideToSP(dec(10000, 18), { from: carol }); await troveManager.liquidate(defaulter_3_TroveId, { from: owner }); // Dennis withdraws his deposit and ETH gain // Increasing the price for a moment to avoid pending liquidations to block withdrawal - await priceFeed.setPrice(dec(200, 18)) - const txD = await stabilityPool.withdrawFromSP(dec(10000, 18), { from: dennis }) - await priceFeed.setPrice(dec(100, 18)) + await priceFeed.setPrice(dec(200, 18)); + const txD = await stabilityPool.withdrawFromSP(dec(10000, 18), { from: dennis }); + await priceFeed.setPrice(dec(100, 18)); - const dennis_ETHWithdrawn = th.getEventArgByName(txD, 'ETHGainWithdrawn', '_ETH').toString() - assert.isAtMost(th.getDifference((await boldToken.balanceOf(dennis)).toString(), '1666666666666666666666'), 100000) - assert.isAtMost(th.getDifference(dennis_ETHWithdrawn, '82916666666666666667'), 100000) + const dennis_ETHWithdrawn = th.getEventArgByName(txD, "ETHGainWithdrawn", "_ETH").toString(); + assert.isAtMost( + th.getDifference((await boldToken.balanceOf(dennis)).toString(), "1666666666666666666666"), + 100000, + ); + assert.isAtMost(th.getDifference(dennis_ETHWithdrawn, "82916666666666666667"), 100000); await troveManager.liquidate(defaulter_4_TroveId, { from: owner }); - const txA = await stabilityPool.withdrawETHGainToTrove(aliceTroveId, { from: alice }) - const txB = await stabilityPool.withdrawETHGainToTrove(bobTroveId, { from: bob }) - const txC = await stabilityPool.withdrawETHGainToTrove(carolTroveId, { from: carol }) + const txA = await stabilityPool.withdrawETHGainToTrove(aliceTroveId, { from: alice }); + const txB = await stabilityPool.withdrawETHGainToTrove(bobTroveId, { from: bob }); + const txC = await stabilityPool.withdrawETHGainToTrove(carolTroveId, { from: carol }); // Grab the ETH gain from the emitted event in the tx log - const alice_ETHWithdrawn = th.getEventArgByName(txA, 'ETHGainWithdrawn', '_ETH').toString() - const bob_ETHWithdrawn = th.getEventArgByName(txB, 'ETHGainWithdrawn', '_ETH').toString() - const carol_ETHWithdrawn = th.getEventArgByName(txC, 'ETHGainWithdrawn', '_ETH').toString() - - assert.isAtMost(th.getDifference((await stabilityPool.getCompoundedBoldDeposit(alice)).toString(), '666666666666666666666'), 100000) - assert.isAtMost(th.getDifference((await stabilityPool.getCompoundedBoldDeposit(bob)).toString(), '666666666666666666666'), 100000) - assert.isAtMost(th.getDifference((await stabilityPool.getCompoundedBoldDeposit(carol)).toString(), '2000000000000000000000'), 100000) - - assert.isAtMost(th.getDifference(alice_ETHWithdrawn, '92866666666666666667'), 100000) - assert.isAtMost(th.getDifference(bob_ETHWithdrawn, '92866666666666666667'), 100000) - assert.isAtMost(th.getDifference(carol_ETHWithdrawn, '79600000000000000000'), 100000) - }) + const alice_ETHWithdrawn = th.getEventArgByName(txA, "ETHGainWithdrawn", "_ETH").toString(); + const bob_ETHWithdrawn = th.getEventArgByName(txB, "ETHGainWithdrawn", "_ETH").toString(); + const carol_ETHWithdrawn = th.getEventArgByName(txC, "ETHGainWithdrawn", "_ETH").toString(); + + assert.isAtMost( + th.getDifference((await stabilityPool.getCompoundedBoldDeposit(alice)).toString(), "666666666666666666666"), + 100000, + ); + assert.isAtMost( + th.getDifference((await stabilityPool.getCompoundedBoldDeposit(bob)).toString(), "666666666666666666666"), + 100000, + ); + assert.isAtMost( + th.getDifference((await stabilityPool.getCompoundedBoldDeposit(carol)).toString(), "2000000000000000000000"), + 100000, + ); + + assert.isAtMost(th.getDifference(alice_ETHWithdrawn, "92866666666666666667"), 100000); + assert.isAtMost(th.getDifference(bob_ETHWithdrawn, "92866666666666666667"), 100000); + assert.isAtMost(th.getDifference(carol_ETHWithdrawn, "79600000000000000000"), 100000); + }); // --- Tests for full offset - Pool empties to 0 --- @@ -879,24 +1748,75 @@ contract('StabilityPool - Withdrawal of stability deposit - Reward calculations' // C, D withdraw 5000Bold & 500e it("withdrawETHGainToTrove(): Depositor withdraws correct compounded deposit after liquidation empties the pool", async () => { // Whale opens Trove with 100k ETH - await th.openTroveWrapper(contracts, th._100pct, await getOpenTroveBoldAmount(dec(100000, 18)), whale, whale, 0, { from: whale, value: dec(100000, 'ether') }) + await th.openTroveWrapper(contracts, th._100pct, await getOpenTroveBoldAmount(dec(100000, 18)), whale, whale, 0, { + from: whale, + value: dec(100000, "ether"), + }); // A, B, C, D open troves - const aliceTroveId = await th.openTroveWrapper(contracts, th._100pct, await getOpenTroveBoldAmount(dec(10000, 18)), ZERO_ADDRESS, ZERO_ADDRESS, 0, { from: alice, value: dec(10000, 'ether') }) - const bobTroveId = await th.openTroveWrapper(contracts, th._100pct, await getOpenTroveBoldAmount(dec(10000, 18)), ZERO_ADDRESS, ZERO_ADDRESS, 0, { from: bob, value: dec(10000, 'ether') }) - const carolTroveId = await th.openTroveWrapper(contracts, th._100pct, await getOpenTroveBoldAmount(dec(10000, 18)), ZERO_ADDRESS, ZERO_ADDRESS, 0, { from: carol, value: dec(10000, 'ether') }) - const dennisTroveId = await th.openTroveWrapper(contracts, th._100pct, await getOpenTroveBoldAmount(dec(10000, 18)), ZERO_ADDRESS, ZERO_ADDRESS, 0, { from: dennis, value: dec(10000, 'ether') }) + const aliceTroveId = await th.openTroveWrapper( + contracts, + th._100pct, + await getOpenTroveBoldAmount(dec(10000, 18)), + ZERO_ADDRESS, + ZERO_ADDRESS, + 0, + { from: alice, value: dec(10000, "ether") }, + ); + const bobTroveId = await th.openTroveWrapper( + contracts, + th._100pct, + await getOpenTroveBoldAmount(dec(10000, 18)), + ZERO_ADDRESS, + ZERO_ADDRESS, + 0, + { from: bob, value: dec(10000, "ether") }, + ); + const carolTroveId = await th.openTroveWrapper( + contracts, + th._100pct, + await getOpenTroveBoldAmount(dec(10000, 18)), + ZERO_ADDRESS, + ZERO_ADDRESS, + 0, + { from: carol, value: dec(10000, "ether") }, + ); + const dennisTroveId = await th.openTroveWrapper( + contracts, + th._100pct, + await getOpenTroveBoldAmount(dec(10000, 18)), + ZERO_ADDRESS, + ZERO_ADDRESS, + 0, + { from: dennis, value: dec(10000, "ether") }, + ); // Whale transfers 10k Bold to A, B who then deposit it to the SP - const depositors = [alice, bob] + const depositors = [alice, bob]; for (const account of depositors) { - await boldToken.transfer(account, dec(10000, 18), { from: whale }) - await stabilityPool.provideToSP(dec(10000, 18), { from: account }) + await boldToken.transfer(account, dec(10000, 18), { from: whale }); + await stabilityPool.provideToSP(dec(10000, 18), { from: account }); } // 2 Defaulters open trove with 200% ICR - const defaulter_1_TroveId = await th.openTroveWrapper(contracts, th._100pct, await getOpenTroveBoldAmount(dec(20000, 18)), defaulter_1, defaulter_1, 0, { from: defaulter_1, value: dec(200, 'ether') }) - const defaulter_2_TroveId = await th.openTroveWrapper(contracts, th._100pct, await getOpenTroveBoldAmount(dec(10000, 18)), defaulter_2, defaulter_2, 0,{ from: defaulter_2, value: dec(100, 'ether') }) + const defaulter_1_TroveId = await th.openTroveWrapper( + contracts, + th._100pct, + await getOpenTroveBoldAmount(dec(20000, 18)), + defaulter_1, + defaulter_1, + 0, + { from: defaulter_1, value: dec(200, "ether") }, + ); + const defaulter_2_TroveId = await th.openTroveWrapper( + contracts, + th._100pct, + await getOpenTroveBoldAmount(dec(10000, 18)), + defaulter_2, + defaulter_2, + 0, + { from: defaulter_2, value: dec(100, "ether") }, + ); // price drops by 50%: defaulter ICR falls to 100% await priceFeed.setPrice(dec(100, 18)); @@ -905,10 +1825,10 @@ contract('StabilityPool - Withdrawal of stability deposit - Reward calculations' await troveManager.liquidate(defaulter_1_TroveId, { from: owner }); // Carol, Dennis each deposit 10000 Bold - const depositors_2 = [carol, dennis] + const depositors_2 = [carol, dennis]; for (const account of depositors_2) { - await boldToken.transfer(account, dec(10000, 18), { from: whale }) - await stabilityPool.provideToSP(dec(10000, 18), { from: account }) + await boldToken.transfer(account, dec(10000, 18), { from: whale }); + await stabilityPool.provideToSP(dec(10000, 18), { from: account }); } // Defaulter 2 liquidated. 10000 Bold offset @@ -917,158 +1837,289 @@ contract('StabilityPool - Withdrawal of stability deposit - Reward calculations' // await th.openTroveWrapper(contracts, th._100pct, dec(1, 18), account, account, { from: erin, value: dec(2, 'ether') }) // await stabilityPool.provideToSP(dec(1, 18), { from: erin }) - const txA = await stabilityPool.withdrawETHGainToTrove(aliceTroveId, { from: alice }) - const txB = await stabilityPool.withdrawETHGainToTrove(bobTroveId, { from: bob }) - const txC = await stabilityPool.withdrawETHGainToTrove(carolTroveId, { from: carol }) - const txD = await stabilityPool.withdrawETHGainToTrove(dennisTroveId, { from: dennis }) + const txA = await stabilityPool.withdrawETHGainToTrove(aliceTroveId, { from: alice }); + const txB = await stabilityPool.withdrawETHGainToTrove(bobTroveId, { from: bob }); + const txC = await stabilityPool.withdrawETHGainToTrove(carolTroveId, { from: carol }); + const txD = await stabilityPool.withdrawETHGainToTrove(dennisTroveId, { from: dennis }); - const alice_ETHWithdrawn = th.getEventArgByName(txA, 'ETHGainWithdrawn', '_ETH').toString() - const bob_ETHWithdrawn = th.getEventArgByName(txB, 'ETHGainWithdrawn', '_ETH').toString() - const carol_ETHWithdrawn = th.getEventArgByName(txC, 'ETHGainWithdrawn', '_ETH').toString() - const dennis_ETHWithdrawn = th.getEventArgByName(txD, 'ETHGainWithdrawn', '_ETH').toString() + const alice_ETHWithdrawn = th.getEventArgByName(txA, "ETHGainWithdrawn", "_ETH").toString(); + const bob_ETHWithdrawn = th.getEventArgByName(txB, "ETHGainWithdrawn", "_ETH").toString(); + const carol_ETHWithdrawn = th.getEventArgByName(txC, "ETHGainWithdrawn", "_ETH").toString(); + const dennis_ETHWithdrawn = th.getEventArgByName(txD, "ETHGainWithdrawn", "_ETH").toString(); // Expect Alice And Bob's compounded deposit to be 0 Bold - assert.isAtMost(th.getDifference((await stabilityPool.getCompoundedBoldDeposit(alice)).toString(), '0'), 10000) - assert.isAtMost(th.getDifference((await stabilityPool.getCompoundedBoldDeposit(bob)).toString(), '0'), 10000) + assert.isAtMost(th.getDifference((await stabilityPool.getCompoundedBoldDeposit(alice)).toString(), "0"), 10000); + assert.isAtMost(th.getDifference((await stabilityPool.getCompoundedBoldDeposit(bob)).toString(), "0"), 10000); // Expect Alice and Bob's ETH Gain to be 100 ETH - assert.isAtMost(th.getDifference(alice_ETHWithdrawn, dec(995, 17)), 100000) - assert.isAtMost(th.getDifference(bob_ETHWithdrawn, dec(995, 17)), 100000) + assert.isAtMost(th.getDifference(alice_ETHWithdrawn, dec(995, 17)), 100000); + assert.isAtMost(th.getDifference(bob_ETHWithdrawn, dec(995, 17)), 100000); // Expect Carol And Dennis' compounded deposit to be 50 Bold - assert.isAtMost(th.getDifference((await stabilityPool.getCompoundedBoldDeposit(carol)).toString(), '5000000000000000000000'), 100000) - assert.isAtMost(th.getDifference((await stabilityPool.getCompoundedBoldDeposit(dennis)).toString(), '5000000000000000000000'), 100000) + assert.isAtMost( + th.getDifference((await stabilityPool.getCompoundedBoldDeposit(carol)).toString(), "5000000000000000000000"), + 100000, + ); + assert.isAtMost( + th.getDifference((await stabilityPool.getCompoundedBoldDeposit(dennis)).toString(), "5000000000000000000000"), + 100000, + ); // Expect Carol and and Dennis ETH Gain to be 50 ETH - assert.isAtMost(th.getDifference(carol_ETHWithdrawn, '49750000000000000000'), 100000) - assert.isAtMost(th.getDifference(dennis_ETHWithdrawn, '49750000000000000000'), 100000) - }) + assert.isAtMost(th.getDifference(carol_ETHWithdrawn, "49750000000000000000"), 100000); + assert.isAtMost(th.getDifference(dennis_ETHWithdrawn, "49750000000000000000"), 100000); + }); // A, B deposit 10000 // L1 cancels 10000, 1 // L2 10000, 200 empties Pool // C, D deposit 10000 - // L3 cancels 10000, 1 + // L3 cancels 10000, 1 // L2 20000, 200 empties Pool it("withdrawETHGainToTrove(): Pool-emptying liquidation increases epoch by one, resets scaleFactor to 0, and resets P to 1e18", async () => { // Whale opens Trove with 100k ETH - await th.openTroveWrapper(contracts, th._100pct, await getOpenTroveBoldAmount(dec(100000, 18)), whale, whale, 0, { from: whale, value: dec(100000, 'ether') }) + await th.openTroveWrapper(contracts, th._100pct, await getOpenTroveBoldAmount(dec(100000, 18)), whale, whale, 0, { + from: whale, + value: dec(100000, "ether"), + }); // A, B, C, D open troves - const aliceTroveId = await th.openTroveWrapper(contracts, th._100pct, await getOpenTroveBoldAmount(dec(10000, 18)), ZERO_ADDRESS, ZERO_ADDRESS, 0, { from: alice, value: dec(10000, 'ether') }) - const bobTroveId = await th.openTroveWrapper(contracts, th._100pct, await getOpenTroveBoldAmount(dec(10000, 18)), ZERO_ADDRESS, ZERO_ADDRESS, 0, { from: bob, value: dec(10000, 'ether') }) - const carolTroveId = await th.openTroveWrapper(contracts, th._100pct, await getOpenTroveBoldAmount(dec(10000, 18)), ZERO_ADDRESS, ZERO_ADDRESS, 0, { from: carol, value: dec(10000, 'ether') }) - const dennisTroveId = await th.openTroveWrapper(contracts, th._100pct, await getOpenTroveBoldAmount(dec(10000, 18)), ZERO_ADDRESS, ZERO_ADDRESS, 0, { from: dennis, value: dec(10000, 'ether') }) + const aliceTroveId = await th.openTroveWrapper( + contracts, + th._100pct, + await getOpenTroveBoldAmount(dec(10000, 18)), + ZERO_ADDRESS, + ZERO_ADDRESS, + 0, + { from: alice, value: dec(10000, "ether") }, + ); + const bobTroveId = await th.openTroveWrapper( + contracts, + th._100pct, + await getOpenTroveBoldAmount(dec(10000, 18)), + ZERO_ADDRESS, + ZERO_ADDRESS, + 0, + { from: bob, value: dec(10000, "ether") }, + ); + const carolTroveId = await th.openTroveWrapper( + contracts, + th._100pct, + await getOpenTroveBoldAmount(dec(10000, 18)), + ZERO_ADDRESS, + ZERO_ADDRESS, + 0, + { from: carol, value: dec(10000, "ether") }, + ); + const dennisTroveId = await th.openTroveWrapper( + contracts, + th._100pct, + await getOpenTroveBoldAmount(dec(10000, 18)), + ZERO_ADDRESS, + ZERO_ADDRESS, + 0, + { from: dennis, value: dec(10000, "ether") }, + ); // Whale transfers 10k Bold to A, B who then deposit it to the SP - const depositors = [alice, bob] + const depositors = [alice, bob]; for (const account of depositors) { - await boldToken.transfer(account, dec(10000, 18), { from: whale }) - await stabilityPool.provideToSP(dec(10000, 18), { from: account }) + await boldToken.transfer(account, dec(10000, 18), { from: whale }); + await stabilityPool.provideToSP(dec(10000, 18), { from: account }); } // 4 Defaulters open trove with 200% ICR - const defaulter_1_TroveId = await th.openTroveWrapper(contracts, th._100pct, await getOpenTroveBoldAmount(dec(10000, 18)), defaulter_1, defaulter_1, 0, { from: defaulter_1, value: dec(100, 'ether') }) - const defaulter_2_TroveId = await th.openTroveWrapper(contracts, th._100pct, await getOpenTroveBoldAmount(dec(10000, 18)), defaulter_2, defaulter_2, 0,{ from: defaulter_2, value: dec(100, 'ether') }) - const defaulter_3_TroveId = await th.openTroveWrapper(contracts, th._100pct, await getOpenTroveBoldAmount(dec(10000, 18)), defaulter_3, defaulter_3, 0,{ from: defaulter_3, value: dec(100, 'ether') }) - const defaulter_4_TroveId = await th.openTroveWrapper(contracts, th._100pct, await getOpenTroveBoldAmount(dec(10000, 18)), defaulter_4, defaulter_4, 0,{ from: defaulter_4, value: dec(100, 'ether') }) + const defaulter_1_TroveId = await th.openTroveWrapper( + contracts, + th._100pct, + await getOpenTroveBoldAmount(dec(10000, 18)), + defaulter_1, + defaulter_1, + 0, + { from: defaulter_1, value: dec(100, "ether") }, + ); + const defaulter_2_TroveId = await th.openTroveWrapper( + contracts, + th._100pct, + await getOpenTroveBoldAmount(dec(10000, 18)), + defaulter_2, + defaulter_2, + 0, + { from: defaulter_2, value: dec(100, "ether") }, + ); + const defaulter_3_TroveId = await th.openTroveWrapper( + contracts, + th._100pct, + await getOpenTroveBoldAmount(dec(10000, 18)), + defaulter_3, + defaulter_3, + 0, + { from: defaulter_3, value: dec(100, "ether") }, + ); + const defaulter_4_TroveId = await th.openTroveWrapper( + contracts, + th._100pct, + await getOpenTroveBoldAmount(dec(10000, 18)), + defaulter_4, + defaulter_4, + 0, + { from: defaulter_4, value: dec(100, "ether") }, + ); // price drops by 50%: defaulter ICR falls to 100% await priceFeed.setPrice(dec(100, 18)); - const epoch_0 = (await stabilityPool.currentEpoch()).toString() - const scale_0 = (await stabilityPool.currentScale()).toString() - const P_0 = (await stabilityPool.P()).toString() + const epoch_0 = (await stabilityPool.currentEpoch()).toString(); + const scale_0 = (await stabilityPool.currentScale()).toString(); + const P_0 = (await stabilityPool.P()).toString(); - assert.equal(epoch_0, '0') - assert.equal(scale_0, '0') - assert.equal(P_0, dec(1, 18)) + assert.equal(epoch_0, "0"); + assert.equal(scale_0, "0"); + assert.equal(P_0, dec(1, 18)); // Defaulter 1 liquidated. 10--0 Bold fully offset, Pool remains non-zero await troveManager.liquidate(defaulter_1_TroveId, { from: owner }); - //Check epoch, scale and sum - const epoch_1 = (await stabilityPool.currentEpoch()).toString() - const scale_1 = (await stabilityPool.currentScale()).toString() - const P_1 = (await stabilityPool.P()).toString() + // Check epoch, scale and sum + const epoch_1 = (await stabilityPool.currentEpoch()).toString(); + const scale_1 = (await stabilityPool.currentScale()).toString(); + const P_1 = (await stabilityPool.P()).toString(); - assert.equal(epoch_1, '0') - assert.equal(scale_1, '0') - assert.isAtMost(th.getDifference(P_1, dec(5, 17)), 1000) + assert.equal(epoch_1, "0"); + assert.equal(scale_1, "0"); + assert.isAtMost(th.getDifference(P_1, dec(5, 17)), 1000); // Defaulter 2 liquidated. 1--00 Bold, empties pool await troveManager.liquidate(defaulter_2_TroveId, { from: owner }); - //Check epoch, scale and sum - const epoch_2 = (await stabilityPool.currentEpoch()).toString() - const scale_2 = (await stabilityPool.currentScale()).toString() - const P_2 = (await stabilityPool.P()).toString() + // Check epoch, scale and sum + const epoch_2 = (await stabilityPool.currentEpoch()).toString(); + const scale_2 = (await stabilityPool.currentScale()).toString(); + const P_2 = (await stabilityPool.P()).toString(); - assert.equal(epoch_2, '1') - assert.equal(scale_2, '0') - assert.equal(P_2, dec(1, 18)) + assert.equal(epoch_2, "1"); + assert.equal(scale_2, "0"); + assert.equal(P_2, dec(1, 18)); // Carol, Dennis each deposit 10000 Bold - const depositors_2 = [carol, dennis] + const depositors_2 = [carol, dennis]; for (const account of depositors) { - await boldToken.transfer(account, dec(10000, 18), { from: whale }) - await stabilityPool.provideToSP(dec(10000, 18), { from: account }) + await boldToken.transfer(account, dec(10000, 18), { from: whale }); + await stabilityPool.provideToSP(dec(10000, 18), { from: account }); } // Defaulter 3 liquidated. 10000 Bold fully offset, Pool remains non-zero await troveManager.liquidate(defaulter_3_TroveId, { from: owner }); - //Check epoch, scale and sum - const epoch_3 = (await stabilityPool.currentEpoch()).toString() - const scale_3 = (await stabilityPool.currentScale()).toString() - const P_3 = (await stabilityPool.P()).toString() + // Check epoch, scale and sum + const epoch_3 = (await stabilityPool.currentEpoch()).toString(); + const scale_3 = (await stabilityPool.currentScale()).toString(); + const P_3 = (await stabilityPool.P()).toString(); - assert.equal(epoch_3, '1') - assert.equal(scale_3, '0') - assert.isAtMost(th.getDifference(P_3, dec(5, 17)), 1000) + assert.equal(epoch_3, "1"); + assert.equal(scale_3, "0"); + assert.isAtMost(th.getDifference(P_3, dec(5, 17)), 1000); // Defaulter 4 liquidated. 10000 Bold, empties pool await troveManager.liquidate(defaulter_4_TroveId, { from: owner }); - //Check epoch, scale and sum - const epoch_4 = (await stabilityPool.currentEpoch()).toString() - const scale_4 = (await stabilityPool.currentScale()).toString() - const P_4 = (await stabilityPool.P()).toString() - - assert.equal(epoch_4, '2') - assert.equal(scale_4, '0') - assert.equal(P_4, dec(1, 18)) - }) + // Check epoch, scale and sum + const epoch_4 = (await stabilityPool.currentEpoch()).toString(); + const scale_4 = (await stabilityPool.currentScale()).toString(); + const P_4 = (await stabilityPool.P()).toString(); + assert.equal(epoch_4, "2"); + assert.equal(scale_4, "0"); + assert.equal(P_4, dec(1, 18)); + }); // A, B deposit 10000 // L1 cancels 20000, 200 // C, D, E deposit 10000, 20000, 30000 - // L2 cancels 10000,100 + // L2 cancels 10000,100 // A, B withdraw 0 Bold & 100e // C, D withdraw 5000 Bold & 50e it("withdrawETHGainToTrove(): Depositors withdraw correct compounded deposit after liquidation empties the pool", async () => { // Whale opens Trove with 100k ETH - await th.openTroveWrapper(contracts, th._100pct, await getOpenTroveBoldAmount(dec(100000, 18)), whale, whale, 0, { from: whale, value: dec(100000, 'ether') }) + await th.openTroveWrapper(contracts, th._100pct, await getOpenTroveBoldAmount(dec(100000, 18)), whale, whale, 0, { + from: whale, + value: dec(100000, "ether"), + }); // A, B, C, D, E open troves - const aliceTroveId = await th.openTroveWrapper(contracts, th._100pct, await getOpenTroveBoldAmount(dec(10000, 18)), ZERO_ADDRESS, ZERO_ADDRESS, 0, { from: alice, value: dec(10000, 'ether') }) - const bobTroveId = await th.openTroveWrapper(contracts, th._100pct, await getOpenTroveBoldAmount(dec(10000, 18)), ZERO_ADDRESS, ZERO_ADDRESS, 0, { from: bob, value: dec(10000, 'ether') }) - const carolTroveId = await th.openTroveWrapper(contracts, th._100pct, await getOpenTroveBoldAmount(dec(10000, 18)), ZERO_ADDRESS, ZERO_ADDRESS, 0, { from: carol, value: dec(10000, 'ether') }) - const dennisTroveId = await th.openTroveWrapper(contracts, th._100pct, await getOpenTroveBoldAmount(dec(10000, 18)), ZERO_ADDRESS, ZERO_ADDRESS, 0, { from: dennis, value: dec(10000, 'ether') }) - const erinTroveId = await th.openTroveWrapper(contracts, th._100pct, await getOpenTroveBoldAmount(dec(10000, 18)), ZERO_ADDRESS, ZERO_ADDRESS, 0, { from: erin, value: dec(10000, 'ether') }) + const aliceTroveId = await th.openTroveWrapper( + contracts, + th._100pct, + await getOpenTroveBoldAmount(dec(10000, 18)), + ZERO_ADDRESS, + ZERO_ADDRESS, + 0, + { from: alice, value: dec(10000, "ether") }, + ); + const bobTroveId = await th.openTroveWrapper( + contracts, + th._100pct, + await getOpenTroveBoldAmount(dec(10000, 18)), + ZERO_ADDRESS, + ZERO_ADDRESS, + 0, + { from: bob, value: dec(10000, "ether") }, + ); + const carolTroveId = await th.openTroveWrapper( + contracts, + th._100pct, + await getOpenTroveBoldAmount(dec(10000, 18)), + ZERO_ADDRESS, + ZERO_ADDRESS, + 0, + { from: carol, value: dec(10000, "ether") }, + ); + const dennisTroveId = await th.openTroveWrapper( + contracts, + th._100pct, + await getOpenTroveBoldAmount(dec(10000, 18)), + ZERO_ADDRESS, + ZERO_ADDRESS, + 0, + { from: dennis, value: dec(10000, "ether") }, + ); + const erinTroveId = await th.openTroveWrapper( + contracts, + th._100pct, + await getOpenTroveBoldAmount(dec(10000, 18)), + ZERO_ADDRESS, + ZERO_ADDRESS, + 0, + { from: erin, value: dec(10000, "ether") }, + ); // Whale transfers 10k Bold to A, B who then deposit it to the SP - const depositors = [alice, bob] + const depositors = [alice, bob]; for (const account of depositors) { - await boldToken.transfer(account, dec(10000, 18), { from: whale }) - await stabilityPool.provideToSP(dec(10000, 18), { from: account }) + await boldToken.transfer(account, dec(10000, 18), { from: whale }); + await stabilityPool.provideToSP(dec(10000, 18), { from: account }); } // 2 Defaulters open trove with 200% ICR - const defaulter_1_TroveId = await th.openTroveWrapper(contracts, th._100pct, await getOpenTroveBoldAmount(dec(20000, 18)), defaulter_1, defaulter_1, 0, { from: defaulter_1, value: dec(200, 'ether') }) - const defaulter_2_TroveId = await th.openTroveWrapper(contracts, th._100pct, await getOpenTroveBoldAmount(dec(10000, 18)), defaulter_2, defaulter_2, 0,{ from: defaulter_2, value: dec(100, 'ether') }) + const defaulter_1_TroveId = await th.openTroveWrapper( + contracts, + th._100pct, + await getOpenTroveBoldAmount(dec(20000, 18)), + defaulter_1, + defaulter_1, + 0, + { from: defaulter_1, value: dec(200, "ether") }, + ); + const defaulter_2_TroveId = await th.openTroveWrapper( + contracts, + th._100pct, + await getOpenTroveBoldAmount(dec(10000, 18)), + defaulter_2, + defaulter_2, + 0, + { from: defaulter_2, value: dec(100, "ether") }, + ); // price drops by 50% await priceFeed.setPrice(dec(100, 18)); @@ -1077,46 +2128,55 @@ contract('StabilityPool - Withdrawal of stability deposit - Reward calculations' await troveManager.liquidate(defaulter_1_TroveId, { from: owner }); // Carol, Dennis, Erin each deposit 10000, 20000, 30000 Bold respectively - await boldToken.transfer(carol, dec(10000, 18), { from: whale }) - await stabilityPool.provideToSP(dec(10000, 18), { from: carol }) + await boldToken.transfer(carol, dec(10000, 18), { from: whale }); + await stabilityPool.provideToSP(dec(10000, 18), { from: carol }); - await boldToken.transfer(dennis, dec(20000, 18), { from: whale }) - await stabilityPool.provideToSP(dec(20000, 18), { from: dennis }) + await boldToken.transfer(dennis, dec(20000, 18), { from: whale }); + await stabilityPool.provideToSP(dec(20000, 18), { from: dennis }); - await boldToken.transfer(erin, dec(30000, 18), { from: whale }) - await stabilityPool.provideToSP(dec(30000, 18), { from: erin }) + await boldToken.transfer(erin, dec(30000, 18), { from: whale }); + await stabilityPool.provideToSP(dec(30000, 18), { from: erin }); // Defaulter 2 liquidated. 10000 Bold offset await troveManager.liquidate(defaulter_2_TroveId, { from: owner }); - const txA = await stabilityPool.withdrawETHGainToTrove(aliceTroveId, { from: alice }) - const txB = await stabilityPool.withdrawETHGainToTrove(bobTroveId, { from: bob }) - const txC = await stabilityPool.withdrawETHGainToTrove(carolTroveId, { from: carol }) - const txD = await stabilityPool.withdrawETHGainToTrove(dennisTroveId, { from: dennis }) - const txE = await stabilityPool.withdrawETHGainToTrove(erinTroveId, { from: erin }) + const txA = await stabilityPool.withdrawETHGainToTrove(aliceTroveId, { from: alice }); + const txB = await stabilityPool.withdrawETHGainToTrove(bobTroveId, { from: bob }); + const txC = await stabilityPool.withdrawETHGainToTrove(carolTroveId, { from: carol }); + const txD = await stabilityPool.withdrawETHGainToTrove(dennisTroveId, { from: dennis }); + const txE = await stabilityPool.withdrawETHGainToTrove(erinTroveId, { from: erin }); - const alice_ETHWithdrawn = th.getEventArgByName(txA, 'ETHGainWithdrawn', '_ETH').toString() - const bob_ETHWithdrawn = th.getEventArgByName(txB, 'ETHGainWithdrawn', '_ETH').toString() - const carol_ETHWithdrawn = th.getEventArgByName(txC, 'ETHGainWithdrawn', '_ETH').toString() - const dennis_ETHWithdrawn = th.getEventArgByName(txD, 'ETHGainWithdrawn', '_ETH').toString() - const erin_ETHWithdrawn = th.getEventArgByName(txE, 'ETHGainWithdrawn', '_ETH').toString() + const alice_ETHWithdrawn = th.getEventArgByName(txA, "ETHGainWithdrawn", "_ETH").toString(); + const bob_ETHWithdrawn = th.getEventArgByName(txB, "ETHGainWithdrawn", "_ETH").toString(); + const carol_ETHWithdrawn = th.getEventArgByName(txC, "ETHGainWithdrawn", "_ETH").toString(); + const dennis_ETHWithdrawn = th.getEventArgByName(txD, "ETHGainWithdrawn", "_ETH").toString(); + const erin_ETHWithdrawn = th.getEventArgByName(txE, "ETHGainWithdrawn", "_ETH").toString(); // Expect Alice And Bob's compounded deposit to be 0 Bold - assert.isAtMost(th.getDifference((await stabilityPool.getCompoundedBoldDeposit(alice)).toString(), '0'), 10000) - assert.isAtMost(th.getDifference((await stabilityPool.getCompoundedBoldDeposit(bob)).toString(), '0'), 10000) - - assert.isAtMost(th.getDifference((await stabilityPool.getCompoundedBoldDeposit(carol)).toString(), '8333333333333333333333'), 100000) - assert.isAtMost(th.getDifference((await stabilityPool.getCompoundedBoldDeposit(dennis)).toString(), '16666666666666666666666'), 100000) - assert.isAtMost(th.getDifference((await stabilityPool.getCompoundedBoldDeposit(erin)).toString(), '25000000000000000000000'), 100000) - - //Expect Alice and Bob's ETH Gain to be 1 ETH - assert.isAtMost(th.getDifference(alice_ETHWithdrawn, dec(995, 17)), 100000) - assert.isAtMost(th.getDifference(bob_ETHWithdrawn, dec(995, 17)), 100000) - - assert.isAtMost(th.getDifference(carol_ETHWithdrawn, '16583333333333333333'), 100000) - assert.isAtMost(th.getDifference(dennis_ETHWithdrawn, '33166666666666666667'), 100000) - assert.isAtMost(th.getDifference(erin_ETHWithdrawn, '49750000000000000000'), 100000) - }) + assert.isAtMost(th.getDifference((await stabilityPool.getCompoundedBoldDeposit(alice)).toString(), "0"), 10000); + assert.isAtMost(th.getDifference((await stabilityPool.getCompoundedBoldDeposit(bob)).toString(), "0"), 10000); + + assert.isAtMost( + th.getDifference((await stabilityPool.getCompoundedBoldDeposit(carol)).toString(), "8333333333333333333333"), + 100000, + ); + assert.isAtMost( + th.getDifference((await stabilityPool.getCompoundedBoldDeposit(dennis)).toString(), "16666666666666666666666"), + 100000, + ); + assert.isAtMost( + th.getDifference((await stabilityPool.getCompoundedBoldDeposit(erin)).toString(), "25000000000000000000000"), + 100000, + ); + + // Expect Alice and Bob's ETH Gain to be 1 ETH + assert.isAtMost(th.getDifference(alice_ETHWithdrawn, dec(995, 17)), 100000); + assert.isAtMost(th.getDifference(bob_ETHWithdrawn, dec(995, 17)), 100000); + + assert.isAtMost(th.getDifference(carol_ETHWithdrawn, "16583333333333333333"), 100000); + assert.isAtMost(th.getDifference(dennis_ETHWithdrawn, "33166666666666666667"), 100000); + assert.isAtMost(th.getDifference(erin_ETHWithdrawn, "49750000000000000000"), 100000); + }); // A deposits 10000 // L1, L2, L3 liquidated with 10000 Bold each @@ -1124,21 +2184,80 @@ contract('StabilityPool - Withdrawal of stability deposit - Reward calculations' // Expect A to withdraw 0 deposit and ether only from reward L1 it("withdrawETHGainToTrove(): single deposit fully offset. After subsequent liquidations, depositor withdraws 0 deposit and *only* the ETH Gain from one liquidation", async () => { // Whale opens Trove with 100k ETH - await th.openTroveWrapper(contracts, th._100pct, await getOpenTroveBoldAmount(dec(100000, 18)), whale, whale, 0, { from: whale, value: dec(100000, 'ether') }) + await th.openTroveWrapper(contracts, th._100pct, await getOpenTroveBoldAmount(dec(100000, 18)), whale, whale, 0, { + from: whale, + value: dec(100000, "ether"), + }); // A, B, C, D open troves - const aliceTroveId = await th.openTroveWrapper(contracts, th._100pct, await getOpenTroveBoldAmount(dec(10000, 18)), ZERO_ADDRESS, ZERO_ADDRESS, 0, { from: alice, value: dec(10000, 'ether') }) - const bobTroveId = await th.openTroveWrapper(contracts, th._100pct, await getOpenTroveBoldAmount(dec(10000, 18)), ZERO_ADDRESS, ZERO_ADDRESS, 0, { from: bob, value: dec(10000, 'ether') }) - const carolTroveId = await th.openTroveWrapper(contracts, th._100pct, await getOpenTroveBoldAmount(dec(10000, 18)), ZERO_ADDRESS, ZERO_ADDRESS, 0, { from: carol, value: dec(10000, 'ether') }) - const dennisTroveId = await th.openTroveWrapper(contracts, th._100pct, await getOpenTroveBoldAmount(dec(10000, 18)), ZERO_ADDRESS, ZERO_ADDRESS, 0, { from: dennis, value: dec(10000, 'ether') }) - - await boldToken.transfer(alice, dec(10000, 18), { from: whale }) - await stabilityPool.provideToSP(dec(10000, 18), { from: alice }) + const aliceTroveId = await th.openTroveWrapper( + contracts, + th._100pct, + await getOpenTroveBoldAmount(dec(10000, 18)), + ZERO_ADDRESS, + ZERO_ADDRESS, + 0, + { from: alice, value: dec(10000, "ether") }, + ); + const bobTroveId = await th.openTroveWrapper( + contracts, + th._100pct, + await getOpenTroveBoldAmount(dec(10000, 18)), + ZERO_ADDRESS, + ZERO_ADDRESS, + 0, + { from: bob, value: dec(10000, "ether") }, + ); + const carolTroveId = await th.openTroveWrapper( + contracts, + th._100pct, + await getOpenTroveBoldAmount(dec(10000, 18)), + ZERO_ADDRESS, + ZERO_ADDRESS, + 0, + { from: carol, value: dec(10000, "ether") }, + ); + const dennisTroveId = await th.openTroveWrapper( + contracts, + th._100pct, + await getOpenTroveBoldAmount(dec(10000, 18)), + ZERO_ADDRESS, + ZERO_ADDRESS, + 0, + { from: dennis, value: dec(10000, "ether") }, + ); + + await boldToken.transfer(alice, dec(10000, 18), { from: whale }); + await stabilityPool.provideToSP(dec(10000, 18), { from: alice }); // Defaulter 1,2,3 withdraw 10000 Bold - const defaulter_1_TroveId = await th.openTroveWrapper(contracts, th._100pct, await getOpenTroveBoldAmount(dec(10000, 18)), defaulter_1, defaulter_1, 0, { from: defaulter_1, value: dec(100, 'ether') }) - const defaulter_2_TroveId = await th.openTroveWrapper(contracts, th._100pct, await getOpenTroveBoldAmount(dec(10000, 18)), defaulter_2, defaulter_2, 0,{ from: defaulter_2, value: dec(100, 'ether') }) - const defaulter_3_TroveId = await th.openTroveWrapper(contracts, th._100pct, await getOpenTroveBoldAmount(dec(10000, 18)), defaulter_3, defaulter_3, 0,{ from: defaulter_3, value: dec(100, 'ether') }) + const defaulter_1_TroveId = await th.openTroveWrapper( + contracts, + th._100pct, + await getOpenTroveBoldAmount(dec(10000, 18)), + defaulter_1, + defaulter_1, + 0, + { from: defaulter_1, value: dec(100, "ether") }, + ); + const defaulter_2_TroveId = await th.openTroveWrapper( + contracts, + th._100pct, + await getOpenTroveBoldAmount(dec(10000, 18)), + defaulter_2, + defaulter_2, + 0, + { from: defaulter_2, value: dec(100, "ether") }, + ); + const defaulter_3_TroveId = await th.openTroveWrapper( + contracts, + th._100pct, + await getOpenTroveBoldAmount(dec(10000, 18)), + defaulter_3, + defaulter_3, + 0, + { from: defaulter_3, value: dec(100, "ether") }, + ); // price drops by 50% await priceFeed.setPrice(dec(100, 18)); @@ -1148,16 +2267,16 @@ contract('StabilityPool - Withdrawal of stability deposit - Reward calculations' await troveManager.liquidate(defaulter_2_TroveId, { from: owner }); await troveManager.liquidate(defaulter_3_TroveId, { from: owner }); - const txA = await stabilityPool.withdrawETHGainToTrove(aliceTroveId, { from: alice }) + const txA = await stabilityPool.withdrawETHGainToTrove(aliceTroveId, { from: alice }); // Grab the ETH gain from the emitted event in the tx log - const alice_ETHWithdrawn = th.getEventArgByName(txA, 'ETHGainWithdrawn', '_ETH').toString() + const alice_ETHWithdrawn = th.getEventArgByName(txA, "ETHGainWithdrawn", "_ETH").toString(); - assert.isAtMost(th.getDifference((await stabilityPool.getCompoundedBoldDeposit(alice)).toString(), 0), 100000) - assert.isAtMost(th.getDifference(alice_ETHWithdrawn, dec(995, 17)), 100000) - }) + assert.isAtMost(th.getDifference((await stabilityPool.getCompoundedBoldDeposit(alice)).toString(), 0), 100000); + assert.isAtMost(th.getDifference(alice_ETHWithdrawn, dec(995, 17)), 100000); + }); - //--- Serial full offsets --- + // --- Serial full offsets --- // A,B deposit 10000 Bold // L1 cancels 20000 Bold, 2E @@ -1172,113 +2291,215 @@ contract('StabilityPool - Withdrawal of stability deposit - Reward calculations' it("withdrawETHGainToTrove(): Depositor withdraws correct compounded deposit after liquidation empties the pool", async () => { // Whale opens Trove with 100k ETH - await th.openTroveWrapper(contracts, th._100pct, await getOpenTroveBoldAmount(dec(100000, 18)), whale, whale, 0, { from: whale, value: dec(100000, 'ether') }) + await th.openTroveWrapper(contracts, th._100pct, await getOpenTroveBoldAmount(dec(100000, 18)), whale, whale, 0, { + from: whale, + value: dec(100000, "ether"), + }); // A, B, C, D, E, F, G, H open troves - const aliceTroveId = await th.openTroveWrapper(contracts, th._100pct, await getOpenTroveBoldAmount(dec(10000, 18)), ZERO_ADDRESS, ZERO_ADDRESS, 0, { from: alice, value: dec(10000, 'ether') }) - const bobTroveId = await th.openTroveWrapper(contracts, th._100pct, await getOpenTroveBoldAmount(dec(10000, 18)), ZERO_ADDRESS, ZERO_ADDRESS, 0, { from: bob, value: dec(10000, 'ether') }) - const carolTroveId = await th.openTroveWrapper(contracts, th._100pct, await getOpenTroveBoldAmount(dec(10000, 18)), ZERO_ADDRESS, ZERO_ADDRESS, 0, { from: carol, value: dec(10000, 'ether') }) - const dennisTroveId = await th.openTroveWrapper(contracts, th._100pct, await getOpenTroveBoldAmount(dec(10000, 18)), ZERO_ADDRESS, ZERO_ADDRESS, 0, { from: dennis, value: dec(10000, 'ether') }) - const erinTroveId = await th.openTroveWrapper(contracts, th._100pct, await getOpenTroveBoldAmount(dec(10000, 18)), ZERO_ADDRESS, ZERO_ADDRESS, 0, { from: erin, value: dec(10000, 'ether') }) - const flynTroveId = await th.openTroveWrapper(contracts, th._100pct, await getOpenTroveBoldAmount(dec(10000, 18)), ZERO_ADDRESS, ZERO_ADDRESS, 0, { from: flyn, value: dec(10000, 'ether') }) - const harrietTroveId = await th.openTroveWrapper(contracts, th._100pct, await getOpenTroveBoldAmount(dec(10000, 18)), ZERO_ADDRESS, ZERO_ADDRESS, 0, { from: harriet, value: dec(10000, 'ether') }) - const grahamTroveId = await th.openTroveWrapper(contracts, th._100pct, await getOpenTroveBoldAmount(dec(10000, 18)), ZERO_ADDRESS, ZERO_ADDRESS, 0, { from: graham, value: dec(10000, 'ether') }) + const aliceTroveId = await th.openTroveWrapper( + contracts, + th._100pct, + await getOpenTroveBoldAmount(dec(10000, 18)), + ZERO_ADDRESS, + ZERO_ADDRESS, + 0, + { from: alice, value: dec(10000, "ether") }, + ); + const bobTroveId = await th.openTroveWrapper( + contracts, + th._100pct, + await getOpenTroveBoldAmount(dec(10000, 18)), + ZERO_ADDRESS, + ZERO_ADDRESS, + 0, + { from: bob, value: dec(10000, "ether") }, + ); + const carolTroveId = await th.openTroveWrapper( + contracts, + th._100pct, + await getOpenTroveBoldAmount(dec(10000, 18)), + ZERO_ADDRESS, + ZERO_ADDRESS, + 0, + { from: carol, value: dec(10000, "ether") }, + ); + const dennisTroveId = await th.openTroveWrapper( + contracts, + th._100pct, + await getOpenTroveBoldAmount(dec(10000, 18)), + ZERO_ADDRESS, + ZERO_ADDRESS, + 0, + { from: dennis, value: dec(10000, "ether") }, + ); + const erinTroveId = await th.openTroveWrapper( + contracts, + th._100pct, + await getOpenTroveBoldAmount(dec(10000, 18)), + ZERO_ADDRESS, + ZERO_ADDRESS, + 0, + { from: erin, value: dec(10000, "ether") }, + ); + const flynTroveId = await th.openTroveWrapper( + contracts, + th._100pct, + await getOpenTroveBoldAmount(dec(10000, 18)), + ZERO_ADDRESS, + ZERO_ADDRESS, + 0, + { from: flyn, value: dec(10000, "ether") }, + ); + const harrietTroveId = await th.openTroveWrapper( + contracts, + th._100pct, + await getOpenTroveBoldAmount(dec(10000, 18)), + ZERO_ADDRESS, + ZERO_ADDRESS, + 0, + { from: harriet, value: dec(10000, "ether") }, + ); + const grahamTroveId = await th.openTroveWrapper( + contracts, + th._100pct, + await getOpenTroveBoldAmount(dec(10000, 18)), + ZERO_ADDRESS, + ZERO_ADDRESS, + 0, + { from: graham, value: dec(10000, "ether") }, + ); // 4 Defaulters open trove with 200% ICR - const defaulter_1_TroveId = await th.openTroveWrapper(contracts, th._100pct, await getOpenTroveBoldAmount(dec(20000, 18)), defaulter_1, defaulter_1, 0, { from: defaulter_1, value: dec(200, 'ether') }) - const defaulter_2_TroveId = await th.openTroveWrapper(contracts, th._100pct, await getOpenTroveBoldAmount(dec(20000, 18)), defaulter_2, defaulter_2, 0,{ from: defaulter_2, value: dec(200, 'ether') }) - const defaulter_3_TroveId = await th.openTroveWrapper(contracts, th._100pct, await getOpenTroveBoldAmount(dec(20000, 18)), defaulter_3, defaulter_3, 0,{ from: defaulter_3, value: dec(200, 'ether') }) - const defaulter_4_TroveId = await th.openTroveWrapper(contracts, th._100pct, await getOpenTroveBoldAmount(dec(20000, 18)), defaulter_4, defaulter_4, 0,{ from: defaulter_4, value: dec(200, 'ether') }) + const defaulter_1_TroveId = await th.openTroveWrapper( + contracts, + th._100pct, + await getOpenTroveBoldAmount(dec(20000, 18)), + defaulter_1, + defaulter_1, + 0, + { from: defaulter_1, value: dec(200, "ether") }, + ); + const defaulter_2_TroveId = await th.openTroveWrapper( + contracts, + th._100pct, + await getOpenTroveBoldAmount(dec(20000, 18)), + defaulter_2, + defaulter_2, + 0, + { from: defaulter_2, value: dec(200, "ether") }, + ); + const defaulter_3_TroveId = await th.openTroveWrapper( + contracts, + th._100pct, + await getOpenTroveBoldAmount(dec(20000, 18)), + defaulter_3, + defaulter_3, + 0, + { from: defaulter_3, value: dec(200, "ether") }, + ); + const defaulter_4_TroveId = await th.openTroveWrapper( + contracts, + th._100pct, + await getOpenTroveBoldAmount(dec(20000, 18)), + defaulter_4, + defaulter_4, + 0, + { from: defaulter_4, value: dec(200, "ether") }, + ); // price drops by 50%: defaulter ICR falls to 100% await priceFeed.setPrice(dec(100, 18)); // Alice, Bob each deposit 10k Bold - const depositors_1 = [alice, bob] + const depositors_1 = [alice, bob]; for (const account of depositors_1) { - await boldToken.transfer(account, dec(10000, 18), { from: whale }) - await stabilityPool.provideToSP(dec(10000, 18), { from: account }) + await boldToken.transfer(account, dec(10000, 18), { from: whale }); + await stabilityPool.provideToSP(dec(10000, 18), { from: account }); } // Defaulter 1 liquidated. 20k Bold fully offset with pool. await troveManager.liquidate(defaulter_1_TroveId, { from: owner }); // Carol, Dennis each deposit 10000 Bold - const depositors_2 = [carol, dennis] + const depositors_2 = [carol, dennis]; for (const account of depositors_2) { - await boldToken.transfer(account, dec(10000, 18), { from: whale }) - await stabilityPool.provideToSP(dec(10000, 18), { from: account }) + await boldToken.transfer(account, dec(10000, 18), { from: whale }); + await stabilityPool.provideToSP(dec(10000, 18), { from: account }); } // Defaulter 2 liquidated. 10000 Bold offset await troveManager.liquidate(defaulter_2_TroveId, { from: owner }); // Erin, Flyn each deposit 10000 Bold - const depositors_3 = [erin, flyn] + const depositors_3 = [erin, flyn]; for (const account of depositors_3) { - await boldToken.transfer(account, dec(10000, 18), { from: whale }) - await stabilityPool.provideToSP(dec(10000, 18), { from: account }) + await boldToken.transfer(account, dec(10000, 18), { from: whale }); + await stabilityPool.provideToSP(dec(10000, 18), { from: account }); } // Defaulter 3 liquidated. 10000 Bold offset await troveManager.liquidate(defaulter_3_TroveId, { from: owner }); // Graham, Harriet each deposit 10000 Bold - const depositors_4 = [graham, harriet] + const depositors_4 = [graham, harriet]; for (const account of depositors_4) { - await boldToken.transfer(account, dec(10000, 18), { from: whale }) - await stabilityPool.provideToSP(dec(10000, 18), { from: account }) + await boldToken.transfer(account, dec(10000, 18), { from: whale }); + await stabilityPool.provideToSP(dec(10000, 18), { from: account }); } // Defaulter 4 liquidated. 10k Bold offset await troveManager.liquidate(defaulter_4_TroveId, { from: owner }); - const txA = await stabilityPool.withdrawETHGainToTrove(aliceTroveId, { from: alice }) - const txB = await stabilityPool.withdrawETHGainToTrove(bobTroveId, { from: bob }) - const txC = await stabilityPool.withdrawETHGainToTrove(carolTroveId, { from: carol }) - const txD = await stabilityPool.withdrawETHGainToTrove(dennisTroveId, { from: dennis }) - const txE = await stabilityPool.withdrawETHGainToTrove(erinTroveId, { from: erin }) - const txF = await stabilityPool.withdrawETHGainToTrove(flynTroveId, { from: flyn }) - const txG = await stabilityPool.withdrawETHGainToTrove(grahamTroveId, { from: graham }) - const txH = await stabilityPool.withdrawETHGainToTrove(harrietTroveId, { from: harriet }) - - const alice_ETHWithdrawn = th.getEventArgByName(txA, 'ETHGainWithdrawn', '_ETH').toString() - const bob_ETHWithdrawn = th.getEventArgByName(txB, 'ETHGainWithdrawn', '_ETH').toString() - const carol_ETHWithdrawn = th.getEventArgByName(txC, 'ETHGainWithdrawn', '_ETH').toString() - const dennis_ETHWithdrawn = th.getEventArgByName(txD, 'ETHGainWithdrawn', '_ETH').toString() - const erin_ETHWithdrawn = th.getEventArgByName(txE, 'ETHGainWithdrawn', '_ETH').toString() - const flyn_ETHWithdrawn = th.getEventArgByName(txF, 'ETHGainWithdrawn', '_ETH').toString() - const graham_ETHWithdrawn = th.getEventArgByName(txG, 'ETHGainWithdrawn', '_ETH').toString() - const harriet_ETHWithdrawn = th.getEventArgByName(txH, 'ETHGainWithdrawn', '_ETH').toString() + const txA = await stabilityPool.withdrawETHGainToTrove(aliceTroveId, { from: alice }); + const txB = await stabilityPool.withdrawETHGainToTrove(bobTroveId, { from: bob }); + const txC = await stabilityPool.withdrawETHGainToTrove(carolTroveId, { from: carol }); + const txD = await stabilityPool.withdrawETHGainToTrove(dennisTroveId, { from: dennis }); + const txE = await stabilityPool.withdrawETHGainToTrove(erinTroveId, { from: erin }); + const txF = await stabilityPool.withdrawETHGainToTrove(flynTroveId, { from: flyn }); + const txG = await stabilityPool.withdrawETHGainToTrove(grahamTroveId, { from: graham }); + const txH = await stabilityPool.withdrawETHGainToTrove(harrietTroveId, { from: harriet }); + + const alice_ETHWithdrawn = th.getEventArgByName(txA, "ETHGainWithdrawn", "_ETH").toString(); + const bob_ETHWithdrawn = th.getEventArgByName(txB, "ETHGainWithdrawn", "_ETH").toString(); + const carol_ETHWithdrawn = th.getEventArgByName(txC, "ETHGainWithdrawn", "_ETH").toString(); + const dennis_ETHWithdrawn = th.getEventArgByName(txD, "ETHGainWithdrawn", "_ETH").toString(); + const erin_ETHWithdrawn = th.getEventArgByName(txE, "ETHGainWithdrawn", "_ETH").toString(); + const flyn_ETHWithdrawn = th.getEventArgByName(txF, "ETHGainWithdrawn", "_ETH").toString(); + const graham_ETHWithdrawn = th.getEventArgByName(txG, "ETHGainWithdrawn", "_ETH").toString(); + const harriet_ETHWithdrawn = th.getEventArgByName(txH, "ETHGainWithdrawn", "_ETH").toString(); // Expect all deposits to be 0 Bold - assert.isAtMost(th.getDifference((await stabilityPool.getCompoundedBoldDeposit(alice)).toString(), '0'), 100000) - assert.isAtMost(th.getDifference((await stabilityPool.getCompoundedBoldDeposit(bob)).toString(), '0'), 100000) - assert.isAtMost(th.getDifference((await stabilityPool.getCompoundedBoldDeposit(carol)).toString(), '0'), 100000) - assert.isAtMost(th.getDifference((await stabilityPool.getCompoundedBoldDeposit(dennis)).toString(), '0'), 100000) - assert.isAtMost(th.getDifference((await stabilityPool.getCompoundedBoldDeposit(erin)).toString(), '0'), 100000) - assert.isAtMost(th.getDifference((await stabilityPool.getCompoundedBoldDeposit(flyn)).toString(), '0'), 100000) - assert.isAtMost(th.getDifference((await stabilityPool.getCompoundedBoldDeposit(graham)).toString(), '0'), 100000) - assert.isAtMost(th.getDifference((await stabilityPool.getCompoundedBoldDeposit(harriet)).toString(), '0'), 100000) + assert.isAtMost(th.getDifference((await stabilityPool.getCompoundedBoldDeposit(alice)).toString(), "0"), 100000); + assert.isAtMost(th.getDifference((await stabilityPool.getCompoundedBoldDeposit(bob)).toString(), "0"), 100000); + assert.isAtMost(th.getDifference((await stabilityPool.getCompoundedBoldDeposit(carol)).toString(), "0"), 100000); + assert.isAtMost(th.getDifference((await stabilityPool.getCompoundedBoldDeposit(dennis)).toString(), "0"), 100000); + assert.isAtMost(th.getDifference((await stabilityPool.getCompoundedBoldDeposit(erin)).toString(), "0"), 100000); + assert.isAtMost(th.getDifference((await stabilityPool.getCompoundedBoldDeposit(flyn)).toString(), "0"), 100000); + assert.isAtMost(th.getDifference((await stabilityPool.getCompoundedBoldDeposit(graham)).toString(), "0"), 100000); + assert.isAtMost( + th.getDifference((await stabilityPool.getCompoundedBoldDeposit(harriet)).toString(), "0"), + 100000, + ); /* Expect all ETH gains to be 100 ETH: Since each liquidation of empties the pool, depositors should only earn ETH from the single liquidation that cancelled with their deposit */ - assert.isAtMost(th.getDifference(alice_ETHWithdrawn, dec(995, 17)), 100000) - assert.isAtMost(th.getDifference(bob_ETHWithdrawn, dec(995, 17)), 100000) - assert.isAtMost(th.getDifference(carol_ETHWithdrawn, dec(995, 17)), 100000) - assert.isAtMost(th.getDifference(dennis_ETHWithdrawn, dec(995, 17)), 100000) - assert.isAtMost(th.getDifference(erin_ETHWithdrawn, dec(995, 17)), 100000) - assert.isAtMost(th.getDifference(flyn_ETHWithdrawn, dec(995, 17)), 100000) - assert.isAtMost(th.getDifference(graham_ETHWithdrawn, dec(995, 17)), 100000) - assert.isAtMost(th.getDifference(harriet_ETHWithdrawn, dec(995, 17)), 100000) - - const finalEpoch = (await stabilityPool.currentEpoch()).toString() - assert.equal(finalEpoch, 4) - }) + assert.isAtMost(th.getDifference(alice_ETHWithdrawn, dec(995, 17)), 100000); + assert.isAtMost(th.getDifference(bob_ETHWithdrawn, dec(995, 17)), 100000); + assert.isAtMost(th.getDifference(carol_ETHWithdrawn, dec(995, 17)), 100000); + assert.isAtMost(th.getDifference(dennis_ETHWithdrawn, dec(995, 17)), 100000); + assert.isAtMost(th.getDifference(erin_ETHWithdrawn, dec(995, 17)), 100000); + assert.isAtMost(th.getDifference(flyn_ETHWithdrawn, dec(995, 17)), 100000); + assert.isAtMost(th.getDifference(graham_ETHWithdrawn, dec(995, 17)), 100000); + assert.isAtMost(th.getDifference(harriet_ETHWithdrawn, dec(995, 17)), 100000); + + const finalEpoch = (await stabilityPool.currentEpoch()).toString(); + assert.equal(finalEpoch, 4); + }); // --- Scale factor tests --- - // A deposits 10000 + // A deposits 10000 // L1 brings P close to boundary, i.e. 9e-9: liquidate 9999.99991 // A withdraws all // B deposits 10000 @@ -1286,26 +2507,61 @@ contract('StabilityPool - Withdrawal of stability deposit - Reward calculations' // expect d(B) = d0(B)/100 // expect correct ETH gain, i.e. all of the reward - // - // TODO: Changes since v1 have introduced very slight precision error in this test. Potentially due to slightly different rounding + // + // TODO: Changes since v1 have introduced very slight precision error in this test. Potentially due to slightly different rounding // in helper functon getOpenTroveBoldAmount due to now-zero borrow fees. Double-check this when we write new SP arithmetic tests and fix the "P" issue. it.skip("withdrawETHGainToTrove(): deposit spans one scale factor change: Single depositor withdraws correct compounded deposit and ETH Gain after one liquidation", async () => { // Whale opens Trove with 100k ETH - await th.openTroveWrapper(contracts, th._100pct, await getOpenTroveBoldAmount(dec(100000, 18)), whale, whale, 0, { from: whale, value: dec(100000, 'ether') }) - - const aliceTroveId = await th.openTroveWrapper(contracts, th._100pct, await getOpenTroveBoldAmount(dec(10000, 18)), ZERO_ADDRESS, ZERO_ADDRESS, 0, { from: alice, value: dec(10000, 'ether') }) - const bobTroveId = await th.openTroveWrapper(contracts, th._100pct, await getOpenTroveBoldAmount(dec(10000, 18)), ZERO_ADDRESS, ZERO_ADDRESS, 0, { from: bob, value: dec(10000, 'ether') }) - - await boldToken.transfer(alice, dec(10000, 18), { from: whale }) - await stabilityPool.provideToSP(dec(10000, 18), { from: alice }) + await th.openTroveWrapper(contracts, th._100pct, await getOpenTroveBoldAmount(dec(100000, 18)), whale, whale, 0, { + from: whale, + value: dec(100000, "ether"), + }); + + const aliceTroveId = await th.openTroveWrapper( + contracts, + th._100pct, + await getOpenTroveBoldAmount(dec(10000, 18)), + ZERO_ADDRESS, + ZERO_ADDRESS, + 0, + { from: alice, value: dec(10000, "ether") }, + ); + const bobTroveId = await th.openTroveWrapper( + contracts, + th._100pct, + await getOpenTroveBoldAmount(dec(10000, 18)), + ZERO_ADDRESS, + ZERO_ADDRESS, + 0, + { from: bob, value: dec(10000, "ether") }, + ); + + await boldToken.transfer(alice, dec(10000, 18), { from: whale }); + await stabilityPool.provideToSP(dec(10000, 18), { from: alice }); // Defaulter 1 withdraws 'almost' 10000 Bold: 9999.99991 Bold - const defaulter_1_TroveId = await th.openTroveWrapper(contracts, th._100pct, await getOpenTroveBoldAmount('9999999910000000000000'), defaulter_1, defaulter_1, 0, { from: defaulter_1, value: dec(100, 'ether') }) - - assert.equal(await stabilityPool.currentScale(), '0') + const defaulter_1_TroveId = await th.openTroveWrapper( + contracts, + th._100pct, + await getOpenTroveBoldAmount("9999999910000000000000"), + defaulter_1, + defaulter_1, + 0, + { from: defaulter_1, value: dec(100, "ether") }, + ); + + assert.equal(await stabilityPool.currentScale(), "0"); // Defaulter 2 withdraws 9900 Bold - const defaulter_2_TroveId = await th.openTroveWrapper(contracts, th._100pct, await getOpenTroveBoldAmount(dec(9900, 18)), defaulter_2, defaulter_2, 0,{ from: defaulter_2, value: dec(60, 'ether') }) + const defaulter_2_TroveId = await th.openTroveWrapper( + contracts, + th._100pct, + await getOpenTroveBoldAmount(dec(9900, 18)), + defaulter_2, + defaulter_2, + 0, + { from: defaulter_2, value: dec(60, "ether") }, + ); // price drops by 50% await priceFeed.setPrice(dec(100, 18)); @@ -1313,32 +2569,34 @@ contract('StabilityPool - Withdrawal of stability deposit - Reward calculations' // Defaulter 1 liquidated. Value of P reduced to 9e9. await troveManager.liquidate(defaulter_1_TroveId, { from: owner }); th.logBN("P", await stabilityPool.P()); // 8999999999, i.e. 1 wei less than expected - assert.equal((await stabilityPool.P()).toString(), dec(9, 9)) + assert.equal((await stabilityPool.P()).toString(), dec(9, 9)); // Increasing the price for a moment to avoid pending liquidations to block withdrawal - await priceFeed.setPrice(dec(200, 18)) - const txA = await stabilityPool.withdrawFromSP(dec(10000, 18), { from: alice }) - await priceFeed.setPrice(dec(100, 18)) + await priceFeed.setPrice(dec(200, 18)); + const txA = await stabilityPool.withdrawFromSP(dec(10000, 18), { from: alice }); + await priceFeed.setPrice(dec(100, 18)); // Grab the ETH gain from the emitted event in the tx log - const alice_ETHWithdrawn = await th.getEventArgByName(txA, 'ETHGainWithdrawn', '_ETH').toString() + const alice_ETHWithdrawn = await th.getEventArgByName(txA, "ETHGainWithdrawn", "_ETH").toString(); - await boldToken.transfer(bob, dec(10000, 18), { from: whale }) - await stabilityPool.provideToSP(dec(10000, 18), { from: bob }) + await boldToken.transfer(bob, dec(10000, 18), { from: whale }); + await stabilityPool.provideToSP(dec(10000, 18), { from: bob }); // Defaulter 2 liquidated. 9900 Bold liquidated. P altered by a factor of 1-(9900/10000) = 0.01. Scale changed. await troveManager.liquidate(defaulter_2_TroveId, { from: owner }); - assert.equal(await stabilityPool.currentScale(), '1') + assert.equal(await stabilityPool.currentScale(), "1"); - const txB = await stabilityPool.withdrawETHGainToTrove(bobTroveId, { from: bob }) - const bob_ETHWithdrawn = await th.getEventArgByName(txB, 'ETHGainWithdrawn', '_ETH').toString() + const txB = await stabilityPool.withdrawETHGainToTrove(bobTroveId, { from: bob }); + const bob_ETHWithdrawn = await th.getEventArgByName(txB, "ETHGainWithdrawn", "_ETH").toString(); // Expect Bob to retain 1% of initial deposit (100 Bold) and all the liquidated ETH (60 ether) - assert.isAtMost(th.getDifference((await stabilityPool.getCompoundedBoldDeposit(bob)).toString(), '100000000000000000000'), 100000) - assert.isAtMost(th.getDifference(bob_ETHWithdrawn, '59700000000000000000'), 100000) - - }) + assert.isAtMost( + th.getDifference((await stabilityPool.getCompoundedBoldDeposit(bob)).toString(), "100000000000000000000"), + 100000, + ); + assert.isAtMost(th.getDifference(bob_ETHWithdrawn, "59700000000000000000"), 100000); + }); // A deposits 10000 // L1 brings P close to boundary, i.e. 9e-9: liquidate 9999.99991 Bold @@ -1348,83 +2606,143 @@ contract('StabilityPool - Withdrawal of stability deposit - Reward calculations' // expect d(B) = d0(B)/100 // expect correct ETH gain, i.e. all of the reward - // - // TODO: Changes since v1 have introduced very slight precision error in this test. Potentially due to slightly different rounding + // + // TODO: Changes since v1 have introduced very slight precision error in this test. Potentially due to slightly different rounding // in helper functon getOpenTroveBoldAmount due to now-zero borrow fees. Double-check this when we write new SP arithmetic tests and fix the "P" issue. it.skip("withdrawETHGainToTrove(): Several deposits of varying amounts span one scale factor change. Depositors withdraw correct compounded deposit and ETH Gain after one liquidation", async () => { // Whale opens Trove with 100k ETH - await th.openTroveWrapper(contracts, th._100pct, await getOpenTroveBoldAmount(dec(100000, 18)), whale, whale, 0, { from: whale, value: dec(100000, 'ether') }) - - const aliceTroveId = await th.openTroveWrapper(contracts, th._100pct, await getOpenTroveBoldAmount(dec(10000, 18)), ZERO_ADDRESS, ZERO_ADDRESS, 0, { from: alice, value: dec(10000, 'ether') }) - const bobTroveId = await th.openTroveWrapper(contracts, th._100pct, await getOpenTroveBoldAmount(dec(10000, 18)), ZERO_ADDRESS, ZERO_ADDRESS, 0, { from: bob, value: dec(10000, 'ether') }) - const carolTroveId = await th.openTroveWrapper(contracts, th._100pct, await getOpenTroveBoldAmount(dec(10000, 18)), ZERO_ADDRESS, ZERO_ADDRESS, 0, { from: carol, value: dec(10000, 'ether') }) - const dennisTroveId = await th.openTroveWrapper(contracts, th._100pct, await getOpenTroveBoldAmount(dec(10000, 18)), ZERO_ADDRESS, ZERO_ADDRESS, 0, { from: dennis, value: dec(10000, 'ether') }) - - await boldToken.transfer(alice, dec(10000, 18), { from: whale }) - await stabilityPool.provideToSP(dec(10000, 18), { from: alice }) + await th.openTroveWrapper(contracts, th._100pct, await getOpenTroveBoldAmount(dec(100000, 18)), whale, whale, 0, { + from: whale, + value: dec(100000, "ether"), + }); + + const aliceTroveId = await th.openTroveWrapper( + contracts, + th._100pct, + await getOpenTroveBoldAmount(dec(10000, 18)), + ZERO_ADDRESS, + ZERO_ADDRESS, + 0, + { from: alice, value: dec(10000, "ether") }, + ); + const bobTroveId = await th.openTroveWrapper( + contracts, + th._100pct, + await getOpenTroveBoldAmount(dec(10000, 18)), + ZERO_ADDRESS, + ZERO_ADDRESS, + 0, + { from: bob, value: dec(10000, "ether") }, + ); + const carolTroveId = await th.openTroveWrapper( + contracts, + th._100pct, + await getOpenTroveBoldAmount(dec(10000, 18)), + ZERO_ADDRESS, + ZERO_ADDRESS, + 0, + { from: carol, value: dec(10000, "ether") }, + ); + const dennisTroveId = await th.openTroveWrapper( + contracts, + th._100pct, + await getOpenTroveBoldAmount(dec(10000, 18)), + ZERO_ADDRESS, + ZERO_ADDRESS, + 0, + { from: dennis, value: dec(10000, "ether") }, + ); + + await boldToken.transfer(alice, dec(10000, 18), { from: whale }); + await stabilityPool.provideToSP(dec(10000, 18), { from: alice }); // Defaulter 1 withdraws 'almost' 10k Bold. - const defaulter_1_TroveId = await th.openTroveWrapper(contracts, th._100pct, await getOpenTroveBoldAmount('9999999910000000000000'), defaulter_1, defaulter_1, 0, { from: defaulter_1, value: dec(100, 'ether') }) + const defaulter_1_TroveId = await th.openTroveWrapper( + contracts, + th._100pct, + await getOpenTroveBoldAmount("9999999910000000000000"), + defaulter_1, + defaulter_1, + 0, + { from: defaulter_1, value: dec(100, "ether") }, + ); // Defaulter 2 withdraws 59400 Bold - const defaulter_2_TroveId = await th.openTroveWrapper(contracts, th._100pct, await getOpenTroveBoldAmount('59400000000000000000000'), defaulter_2, defaulter_2, 0,{ from: defaulter_2, value: dec(330, 'ether') }) + const defaulter_2_TroveId = await th.openTroveWrapper( + contracts, + th._100pct, + await getOpenTroveBoldAmount("59400000000000000000000"), + defaulter_2, + defaulter_2, + 0, + { from: defaulter_2, value: dec(330, "ether") }, + ); // price drops by 50% await priceFeed.setPrice(dec(100, 18)); // Defaulter 1 liquidated. Value of P reduced to 9e9 await troveManager.liquidate(defaulter_1_TroveId, { from: owner }); - th.logBN("P", await stabilityPool.P()) // P = 8999999999, i.e. 1 wei less than expected - assert.equal((await stabilityPool.P()).toString(), dec(9, 9)) + th.logBN("P", await stabilityPool.P()); // P = 8999999999, i.e. 1 wei less than expected + assert.equal((await stabilityPool.P()).toString(), dec(9, 9)); - assert.equal(await stabilityPool.currentScale(), '0') + assert.equal(await stabilityPool.currentScale(), "0"); // Increasing the price for a moment to avoid pending liquidations to block withdrawal - await priceFeed.setPrice(dec(200, 18)) - const txA = await stabilityPool.withdrawFromSP(dec(10000, 18), { from: alice }) - await priceFeed.setPrice(dec(100, 18)) + await priceFeed.setPrice(dec(200, 18)); + const txA = await stabilityPool.withdrawFromSP(dec(10000, 18), { from: alice }); + await priceFeed.setPrice(dec(100, 18)); - //B, C, D deposit to Stability Pool - await boldToken.transfer(bob, dec(10000, 18), { from: whale }) - await stabilityPool.provideToSP(dec(10000, 18), { from: bob }) + // B, C, D deposit to Stability Pool + await boldToken.transfer(bob, dec(10000, 18), { from: whale }); + await stabilityPool.provideToSP(dec(10000, 18), { from: bob }); - await boldToken.transfer(carol, dec(20000, 18), { from: whale }) - await stabilityPool.provideToSP(dec(20000, 18), { from: carol }) + await boldToken.transfer(carol, dec(20000, 18), { from: whale }); + await stabilityPool.provideToSP(dec(20000, 18), { from: carol }); - await boldToken.transfer(dennis, dec(30000, 18), { from: whale }) - await stabilityPool.provideToSP(dec(30000, 18), { from: dennis }) + await boldToken.transfer(dennis, dec(30000, 18), { from: whale }); + await stabilityPool.provideToSP(dec(30000, 18), { from: dennis }); // 54000 Bold liquidated. P altered by a factor of 1-(59400/60000) = 0.01. Scale changed. const txL2 = await troveManager.liquidate(defaulter_2_TroveId, { from: owner }); - assert.isTrue(txL2.receipt.status) + assert.isTrue(txL2.receipt.status); - assert.equal(await stabilityPool.currentScale(), '1') + assert.equal(await stabilityPool.currentScale(), "1"); - const txB = await stabilityPool.withdrawETHGainToTrove(bobTroveId, { from: bob }) - const txC = await stabilityPool.withdrawETHGainToTrove(carolTroveId, { from: carol }) - const txD = await stabilityPool.withdrawETHGainToTrove(dennisTroveId, { from: dennis }) + const txB = await stabilityPool.withdrawETHGainToTrove(bobTroveId, { from: bob }); + const txC = await stabilityPool.withdrawETHGainToTrove(carolTroveId, { from: carol }); + const txD = await stabilityPool.withdrawETHGainToTrove(dennisTroveId, { from: dennis }); - /* Expect depositors to retain 1% of their initial deposit, and an ETH gain + /* Expect depositors to retain 1% of their initial deposit, and an ETH gain in proportion to their initial deposit: - + Bob: 1000 Bold, 55 Ether Carol: 2000 Bold, 110 Ether Dennis: 3000 Bold, 165 Ether - + Total: 6000 Bold, 300 Ether */ - assert.isAtMost(th.getDifference((await stabilityPool.getCompoundedBoldDeposit(bob)).toString(), dec(100, 18)), 100000) - assert.isAtMost(th.getDifference((await stabilityPool.getCompoundedBoldDeposit(carol)).toString(), dec(200, 18)), 100000) - assert.isAtMost(th.getDifference((await stabilityPool.getCompoundedBoldDeposit(dennis)).toString(), dec(300, 18)), 100000) - - const bob_ETHWithdrawn = await th.getEventArgByName(txB, 'ETHGainWithdrawn', '_ETH').toString() - const carol_ETHWithdrawn = await th.getEventArgByName(txC, 'ETHGainWithdrawn', '_ETH').toString() - const dennis_ETHWithdrawn = await th.getEventArgByName(txD, 'ETHGainWithdrawn', '_ETH').toString() - - assert.isAtMost(th.getDifference(bob_ETHWithdrawn, '54725000000000000000'), 100000) - assert.isAtMost(th.getDifference(carol_ETHWithdrawn, '109450000000000000000'), 100000) - assert.isAtMost(th.getDifference(dennis_ETHWithdrawn, '164175000000000000000'), 100000) - }) + assert.isAtMost( + th.getDifference((await stabilityPool.getCompoundedBoldDeposit(bob)).toString(), dec(100, 18)), + 100000, + ); + assert.isAtMost( + th.getDifference((await stabilityPool.getCompoundedBoldDeposit(carol)).toString(), dec(200, 18)), + 100000, + ); + assert.isAtMost( + th.getDifference((await stabilityPool.getCompoundedBoldDeposit(dennis)).toString(), dec(300, 18)), + 100000, + ); + + const bob_ETHWithdrawn = await th.getEventArgByName(txB, "ETHGainWithdrawn", "_ETH").toString(); + const carol_ETHWithdrawn = await th.getEventArgByName(txC, "ETHGainWithdrawn", "_ETH").toString(); + const dennis_ETHWithdrawn = await th.getEventArgByName(txD, "ETHGainWithdrawn", "_ETH").toString(); + + assert.isAtMost(th.getDifference(bob_ETHWithdrawn, "54725000000000000000"), 100000); + assert.isAtMost(th.getDifference(carol_ETHWithdrawn, "109450000000000000000"), 100000); + assert.isAtMost(th.getDifference(dennis_ETHWithdrawn, "164175000000000000000"), 100000); + }); // Deposit's ETH reward spans one scale change - deposit reduced by correct amount @@ -1437,56 +2755,102 @@ contract('StabilityPool - Withdrawal of stability deposit - Reward calculations' // expect d(B) = d0(B) * 1e-5 // expect B gets entire ETH gain from L2 // - // TODO: Changes since v1 have introduced very slight precision error in this test. Potentially due to slightly different rounding + // TODO: Changes since v1 have introduced very slight precision error in this test. Potentially due to slightly different rounding // in helper functon getOpenTroveBoldAmount due to now-zero borrow fees. Double-check this when we write new SP arithmetic tests and fix the "P" issue. it.skip("withdrawETHGainToTrove(): deposit spans one scale factor change: Single depositor withdraws correct compounded deposit and ETH Gain after one liquidation", async () => { // Whale opens Trove with 100k ETH - await th.openTroveWrapper(contracts, th._100pct, await getOpenTroveBoldAmount(dec(100000, 18)), whale, whale, 0, { from: whale, value: dec(100000, 'ether') }) - - const aliceTroveId = await th.openTroveWrapper(contracts, th._100pct, await getOpenTroveBoldAmount(dec(10000, 18)), ZERO_ADDRESS, ZERO_ADDRESS, 0, { from: alice, value: dec(10000, 'ether') }) - const bobTroveId = await th.openTroveWrapper(contracts, th._100pct, await getOpenTroveBoldAmount(dec(10000, 18)), ZERO_ADDRESS, ZERO_ADDRESS, 0, { from: bob, value: dec(10000, 'ether') }) - const carolTroveId = await th.openTroveWrapper(contracts, th._100pct, await getOpenTroveBoldAmount(dec(10000, 18)), ZERO_ADDRESS, ZERO_ADDRESS, 0, { from: carol, value: dec(10000, 'ether') }) - - await boldToken.transfer(alice, dec(10000, 18), { from: whale }) - await stabilityPool.provideToSP(dec(10000, 18), { from: alice }) + await th.openTroveWrapper(contracts, th._100pct, await getOpenTroveBoldAmount(dec(100000, 18)), whale, whale, 0, { + from: whale, + value: dec(100000, "ether"), + }); + + const aliceTroveId = await th.openTroveWrapper( + contracts, + th._100pct, + await getOpenTroveBoldAmount(dec(10000, 18)), + ZERO_ADDRESS, + ZERO_ADDRESS, + 0, + { from: alice, value: dec(10000, "ether") }, + ); + const bobTroveId = await th.openTroveWrapper( + contracts, + th._100pct, + await getOpenTroveBoldAmount(dec(10000, 18)), + ZERO_ADDRESS, + ZERO_ADDRESS, + 0, + { from: bob, value: dec(10000, "ether") }, + ); + const carolTroveId = await th.openTroveWrapper( + contracts, + th._100pct, + await getOpenTroveBoldAmount(dec(10000, 18)), + ZERO_ADDRESS, + ZERO_ADDRESS, + 0, + { from: carol, value: dec(10000, "ether") }, + ); + + await boldToken.transfer(alice, dec(10000, 18), { from: whale }); + await stabilityPool.provideToSP(dec(10000, 18), { from: alice }); // Defaulter 1 and default 2 each withdraw 9999.999999999 Bold - const defaulter_1_TroveId = await th.openTroveWrapper(contracts, th._100pct, await getOpenTroveBoldAmount(dec(99999, 17)), defaulter_1, defaulter_1, 0, { from: defaulter_1, value: dec(100, 'ether') }) - const defaulter_2_TroveId = await th.openTroveWrapper(contracts, th._100pct, await getOpenTroveBoldAmount(dec(99999, 17)), defaulter_2, defaulter_2, 0,{ from: defaulter_2, value: dec(100, 'ether') }) + const defaulter_1_TroveId = await th.openTroveWrapper( + contracts, + th._100pct, + await getOpenTroveBoldAmount(dec(99999, 17)), + defaulter_1, + defaulter_1, + 0, + { from: defaulter_1, value: dec(100, "ether") }, + ); + const defaulter_2_TroveId = await th.openTroveWrapper( + contracts, + th._100pct, + await getOpenTroveBoldAmount(dec(99999, 17)), + defaulter_2, + defaulter_2, + 0, + { from: defaulter_2, value: dec(100, "ether") }, + ); // price drops by 50%: defaulter 1 ICR falls to 100% await priceFeed.setPrice(dec(100, 18)); // Defaulter 1 liquidated. Value of P updated to to 1e13 const txL1 = await troveManager.liquidate(defaulter_1_TroveId, { from: owner }); - assert.isTrue(txL1.receipt.status) - th.logBN("P", await stabilityPool.P()) // P = 0.000009999999999999 i.e. 1 wei less than expected - assert.equal(await stabilityPool.P(), dec(1, 13)) // P decreases. P = 1e(18-5) = 1e13 - assert.equal(await stabilityPool.currentScale(), '0') + assert.isTrue(txL1.receipt.status); + th.logBN("P", await stabilityPool.P()); // P = 0.000009999999999999 i.e. 1 wei less than expected + assert.equal(await stabilityPool.P(), dec(1, 13)); // P decreases. P = 1e(18-5) = 1e13 + assert.equal(await stabilityPool.currentScale(), "0"); // Alice withdraws // Increasing the price for a moment to avoid pending liquidations to block withdrawal - await priceFeed.setPrice(dec(200, 18)) - const txA = await stabilityPool.withdrawFromSP(dec(10000, 18), { from: alice }) - await priceFeed.setPrice(dec(100, 18)) + await priceFeed.setPrice(dec(200, 18)); + const txA = await stabilityPool.withdrawFromSP(dec(10000, 18), { from: alice }); + await priceFeed.setPrice(dec(100, 18)); // Bob deposits 10k Bold - await boldToken.transfer(bob, dec(10000, 18), { from: whale }) - await stabilityPool.provideToSP(dec(10000, 18), { from: bob }) + await boldToken.transfer(bob, dec(10000, 18), { from: whale }); + await stabilityPool.provideToSP(dec(10000, 18), { from: bob }); // Defaulter 2 liquidated const txL2 = await troveManager.liquidate(defaulter_2_TroveId, { from: owner }); - assert.isTrue(txL2.receipt.status) - assert.equal(await stabilityPool.P(), dec(1, 17)) // Scale changes and P changes. P = 1e(13-5+9) = 1e17 - assert.equal(await stabilityPool.currentScale(), '1') + assert.isTrue(txL2.receipt.status); + assert.equal(await stabilityPool.P(), dec(1, 17)); // Scale changes and P changes. P = 1e(13-5+9) = 1e17 + assert.equal(await stabilityPool.currentScale(), "1"); - const txB = await stabilityPool.withdrawETHGainToTrove(bobTroveId, { from: bob }) - const bob_ETHWithdrawn = await th.getEventArgByName(txB, 'ETHGainWithdrawn', '_ETH').toString() + const txB = await stabilityPool.withdrawETHGainToTrove(bobTroveId, { from: bob }); + const bob_ETHWithdrawn = await th.getEventArgByName(txB, "ETHGainWithdrawn", "_ETH").toString(); // Bob should withdraw 1e-5 of initial deposit: 0.1 Bold and the full ETH gain of 100 ether - assert.isAtMost(th.getDifference((await stabilityPool.getCompoundedBoldDeposit(bob)).toString(), dec(1, 17)), 100000) - assert.isAtMost(th.getDifference(bob_ETHWithdrawn, dec(995, 17)), 100000000000) - }) + assert.isAtMost( + th.getDifference((await stabilityPool.getCompoundedBoldDeposit(bob)).toString(), dec(1, 17)), + 100000, + ); + assert.isAtMost(th.getDifference(bob_ETHWithdrawn, dec(995, 17)), 100000000000); + }); // A make deposit 10000 Bold // L1 brings P to 1e-5*P. L1: 9999.9000000000000000 Bold @@ -1496,104 +2860,207 @@ contract('StabilityPool - Withdrawal of stability deposit - Reward calculations' // B withdraws // expect d(B) = d0(B) * 1e-5 // expect B gets entire ETH gain from L2 - // - // TODO: Changes since v1 have introduced very slight precision error in this test. Potentially due to slightly different rounding + // + // TODO: Changes since v1 have introduced very slight precision error in this test. Potentially due to slightly different rounding // in helper functon getOpenTroveBoldAmount due to now-zero borrow fees. Double-check this when we write new SP arithmetic tests and fix the "P" issue. it.skip("withdrawETHGainToTrove(): Several deposits of varying amounts span one scale factor change. Depositors withdraws correct compounded deposit and ETH Gain after one liquidation", async () => { // Whale opens Trove with 100k ETH - await th.openTroveWrapper(contracts, th._100pct, await getOpenTroveBoldAmount(dec(100000, 18)), whale, whale, 0, { from: whale, value: dec(100000, 'ether') }) - - const aliceTroveId = await th.openTroveWrapper(contracts, th._100pct, await getOpenTroveBoldAmount(dec(10000, 18)), ZERO_ADDRESS, ZERO_ADDRESS, 0, { from: alice, value: dec(10000, 'ether') }) - const bobTroveId = await th.openTroveWrapper(contracts, th._100pct, await getOpenTroveBoldAmount(dec(10000, 18)), ZERO_ADDRESS, ZERO_ADDRESS, 0, { from: bob, value: dec(10000, 'ether') }) - const carolTroveId = await th.openTroveWrapper(contracts, th._100pct, await getOpenTroveBoldAmount(dec(10000, 18)), ZERO_ADDRESS, ZERO_ADDRESS, 0, { from: carol, value: dec(10000, 'ether') }) - const dennisTroveId = await th.openTroveWrapper(contracts, th._100pct, await getOpenTroveBoldAmount(dec(10000, 18)), ZERO_ADDRESS, ZERO_ADDRESS, 0, { from: dennis, value: dec(10000, 'ether') }) - - await boldToken.transfer(alice, dec(10000, 18), { from: whale }) - await stabilityPool.provideToSP(dec(10000, 18), { from: alice }) + await th.openTroveWrapper(contracts, th._100pct, await getOpenTroveBoldAmount(dec(100000, 18)), whale, whale, 0, { + from: whale, + value: dec(100000, "ether"), + }); + + const aliceTroveId = await th.openTroveWrapper( + contracts, + th._100pct, + await getOpenTroveBoldAmount(dec(10000, 18)), + ZERO_ADDRESS, + ZERO_ADDRESS, + 0, + { from: alice, value: dec(10000, "ether") }, + ); + const bobTroveId = await th.openTroveWrapper( + contracts, + th._100pct, + await getOpenTroveBoldAmount(dec(10000, 18)), + ZERO_ADDRESS, + ZERO_ADDRESS, + 0, + { from: bob, value: dec(10000, "ether") }, + ); + const carolTroveId = await th.openTroveWrapper( + contracts, + th._100pct, + await getOpenTroveBoldAmount(dec(10000, 18)), + ZERO_ADDRESS, + ZERO_ADDRESS, + 0, + { from: carol, value: dec(10000, "ether") }, + ); + const dennisTroveId = await th.openTroveWrapper( + contracts, + th._100pct, + await getOpenTroveBoldAmount(dec(10000, 18)), + ZERO_ADDRESS, + ZERO_ADDRESS, + 0, + { from: dennis, value: dec(10000, "ether") }, + ); + + await boldToken.transfer(alice, dec(10000, 18), { from: whale }); + await stabilityPool.provideToSP(dec(10000, 18), { from: alice }); // Defaulter 1 and default 2 withdraw up to debt of 9999.9 Bold and 59999.4 Bold - const defaulter_1_TroveId = await th.openTroveWrapper(contracts, th._100pct, await getOpenTroveBoldAmount('9999900000000000000000'), defaulter_1, defaulter_1, 0, { from: defaulter_1, value: dec(100, 'ether') }) - const defaulter_2_TroveId = await th.openTroveWrapper(contracts, th._100pct, await getOpenTroveBoldAmount('59999400000000000000000'), defaulter_2, defaulter_2, 0,{ from: defaulter_2, value: dec(600, 'ether') }) + const defaulter_1_TroveId = await th.openTroveWrapper( + contracts, + th._100pct, + await getOpenTroveBoldAmount("9999900000000000000000"), + defaulter_1, + defaulter_1, + 0, + { from: defaulter_1, value: dec(100, "ether") }, + ); + const defaulter_2_TroveId = await th.openTroveWrapper( + contracts, + th._100pct, + await getOpenTroveBoldAmount("59999400000000000000000"), + defaulter_2, + defaulter_2, + 0, + { from: defaulter_2, value: dec(600, "ether") }, + ); // price drops by 50% await priceFeed.setPrice(dec(100, 18)); // Defaulter 1 liquidated. P updated to 1e13 const txL1 = await troveManager.liquidate(defaulter_1_TroveId, { from: owner }); - th.logBN("P",await stabilityPool.P()) // P: 0.000009999999999999, 1 wei less than expected - assert.equal(await stabilityPool.P(), dec(1, 13)) // P decreases. P = 1e(18-5) = 1e13 - assert.equal(await stabilityPool.currentScale(), '0') + th.logBN("P", await stabilityPool.P()); // P: 0.000009999999999999, 1 wei less than expected + assert.equal(await stabilityPool.P(), dec(1, 13)); // P decreases. P = 1e(18-5) = 1e13 + assert.equal(await stabilityPool.currentScale(), "0"); // Alice withdraws // Increasing the price for a moment to avoid pending liquidations to block withdrawal - await priceFeed.setPrice(dec(200, 18)) - const txA = await stabilityPool.withdrawFromSP(dec(100, 18), { from: alice }) - await priceFeed.setPrice(dec(100, 18)) + await priceFeed.setPrice(dec(200, 18)); + const txA = await stabilityPool.withdrawFromSP(dec(100, 18), { from: alice }); + await priceFeed.setPrice(dec(100, 18)); // B, C, D deposit 10000, 20000, 30000 Bold - await boldToken.transfer(bob, dec(10000, 18), { from: whale }) - await stabilityPool.provideToSP(dec(10000, 18), { from: bob }) + await boldToken.transfer(bob, dec(10000, 18), { from: whale }); + await stabilityPool.provideToSP(dec(10000, 18), { from: bob }); - await boldToken.transfer(carol, dec(20000, 18), { from: whale }) - await stabilityPool.provideToSP(dec(20000, 18), { from: carol }) + await boldToken.transfer(carol, dec(20000, 18), { from: whale }); + await stabilityPool.provideToSP(dec(20000, 18), { from: carol }); - await boldToken.transfer(dennis, dec(30000, 18), { from: whale }) - await stabilityPool.provideToSP(dec(30000, 18), { from: dennis }) + await boldToken.transfer(dennis, dec(30000, 18), { from: whale }); + await stabilityPool.provideToSP(dec(30000, 18), { from: dennis }); // Defaulter 2 liquidated const txL2 = await troveManager.liquidate(defaulter_2_TroveId, { from: owner }); - assert.isTrue(txL2.receipt.status) - assert.equal(await stabilityPool.P(), dec(1, 17)) // P decreases. P = 1e(13-5+9) = 1e17 - assert.equal(await stabilityPool.currentScale(), '1') + assert.isTrue(txL2.receipt.status); + assert.equal(await stabilityPool.P(), dec(1, 17)); // P decreases. P = 1e(13-5+9) = 1e17 + assert.equal(await stabilityPool.currentScale(), "1"); - const txB = await stabilityPool.withdrawETHGainToTrove(bobTroveId, { from: bob }) - const bob_ETHWithdrawn = await th.getEventArgByName(txB, 'ETHGainWithdrawn', '_ETH').toString() + const txB = await stabilityPool.withdrawETHGainToTrove(bobTroveId, { from: bob }); + const bob_ETHWithdrawn = await th.getEventArgByName(txB, "ETHGainWithdrawn", "_ETH").toString(); - const txC = await stabilityPool.withdrawETHGainToTrove(carolTroveId, { from: carol }) - const carol_ETHWithdrawn = await th.getEventArgByName(txC, 'ETHGainWithdrawn', '_ETH').toString() + const txC = await stabilityPool.withdrawETHGainToTrove(carolTroveId, { from: carol }); + const carol_ETHWithdrawn = await th.getEventArgByName(txC, "ETHGainWithdrawn", "_ETH").toString(); - const txD = await stabilityPool.withdrawETHGainToTrove(dennisTroveId, { from: dennis }) - const dennis_ETHWithdrawn = await th.getEventArgByName(txD, 'ETHGainWithdrawn', '_ETH').toString() + const txD = await stabilityPool.withdrawETHGainToTrove(dennisTroveId, { from: dennis }); + const dennis_ETHWithdrawn = await th.getEventArgByName(txD, "ETHGainWithdrawn", "_ETH").toString(); // {B, C, D} should have a compounded deposit of {0.1, 0.2, 0.3} Bold - assert.isAtMost(th.getDifference((await stabilityPool.getCompoundedBoldDeposit(bob)).toString(), dec(1, 17)), 100000) - assert.isAtMost(th.getDifference((await stabilityPool.getCompoundedBoldDeposit(carol)).toString(), dec(2, 17)), 100000) - assert.isAtMost(th.getDifference((await stabilityPool.getCompoundedBoldDeposit(dennis)).toString(), dec(3, 17)), 100000) - - assert.isAtMost(th.getDifference(bob_ETHWithdrawn, dec(995, 17)), 10000000000) - assert.isAtMost(th.getDifference(carol_ETHWithdrawn, dec(1990, 17)), 100000000000) - assert.isAtMost(th.getDifference(dennis_ETHWithdrawn, dec(2985, 17)), 100000000000) - }) + assert.isAtMost( + th.getDifference((await stabilityPool.getCompoundedBoldDeposit(bob)).toString(), dec(1, 17)), + 100000, + ); + assert.isAtMost( + th.getDifference((await stabilityPool.getCompoundedBoldDeposit(carol)).toString(), dec(2, 17)), + 100000, + ); + assert.isAtMost( + th.getDifference((await stabilityPool.getCompoundedBoldDeposit(dennis)).toString(), dec(3, 17)), + 100000, + ); + + assert.isAtMost(th.getDifference(bob_ETHWithdrawn, dec(995, 17)), 10000000000); + assert.isAtMost(th.getDifference(carol_ETHWithdrawn, dec(1990, 17)), 100000000000); + assert.isAtMost(th.getDifference(dennis_ETHWithdrawn, dec(2985, 17)), 100000000000); + }); // A make deposit 10000 Bold // L1 brings P to (~1e-10)*P. L1: 9999.9999999000000000 Bold // Expect A to withdraw 0 deposit it("withdrawETHGainToTrove(): Deposit that decreases to less than 1e-9 of it's original value is reduced to 0", async () => { // Whale opens Trove with 100k ETH - await th.openTroveWrapper(contracts, th._100pct, await getOpenTroveBoldAmount(dec(100000, 18)), whale, whale, 0, { from: whale, value: dec(100000, 'ether') }) + await th.openTroveWrapper(contracts, th._100pct, await getOpenTroveBoldAmount(dec(100000, 18)), whale, whale, 0, { + from: whale, + value: dec(100000, "ether"), + }); + + const aliceTroveId = await th.openTroveWrapper( + contracts, + th._100pct, + await getOpenTroveBoldAmount(dec(10000, 18)), + ZERO_ADDRESS, + ZERO_ADDRESS, + 0, + { from: alice, value: dec(10000, "ether") }, + ); + const bobTroveId = await th.openTroveWrapper( + contracts, + th._100pct, + await getOpenTroveBoldAmount(dec(10000, 18)), + ZERO_ADDRESS, + ZERO_ADDRESS, + 0, + { from: bob, value: dec(10000, "ether") }, + ); + const carolTroveId = await th.openTroveWrapper( + contracts, + th._100pct, + await getOpenTroveBoldAmount(dec(10000, 18)), + ZERO_ADDRESS, + ZERO_ADDRESS, + 0, + { from: carol, value: dec(10000, "ether") }, + ); + const dennisTroveId = await th.openTroveWrapper( + contracts, + th._100pct, + await getOpenTroveBoldAmount(dec(10000, 18)), + ZERO_ADDRESS, + ZERO_ADDRESS, + 0, + { from: dennis, value: dec(10000, "ether") }, + ); - const aliceTroveId = await th.openTroveWrapper(contracts, th._100pct, await getOpenTroveBoldAmount(dec(10000, 18)), ZERO_ADDRESS, ZERO_ADDRESS, 0, { from: alice, value: dec(10000, 'ether') }) - const bobTroveId = await th.openTroveWrapper(contracts, th._100pct, await getOpenTroveBoldAmount(dec(10000, 18)), ZERO_ADDRESS, ZERO_ADDRESS, 0, { from: bob, value: dec(10000, 'ether') }) - const carolTroveId = await th.openTroveWrapper(contracts, th._100pct, await getOpenTroveBoldAmount(dec(10000, 18)), ZERO_ADDRESS, ZERO_ADDRESS, 0, { from: carol, value: dec(10000, 'ether') }) - const dennisTroveId = await th.openTroveWrapper(contracts, th._100pct, await getOpenTroveBoldAmount(dec(10000, 18)), ZERO_ADDRESS, ZERO_ADDRESS, 0, { from: dennis, value: dec(10000, 'ether') }) - // Defaulters 1 withdraws 9999.9999999 Bold - const defaulter_1_TroveId = await th.openTroveWrapper(contracts, th._100pct, await getOpenTroveBoldAmount('9999999999900000000000'), defaulter_1, defaulter_1, 0, { from: defaulter_1, value: dec(100, 'ether') }) + const defaulter_1_TroveId = await th.openTroveWrapper( + contracts, + th._100pct, + await getOpenTroveBoldAmount("9999999999900000000000"), + defaulter_1, + defaulter_1, + 0, + { from: defaulter_1, value: dec(100, "ether") }, + ); // Price drops by 50% await priceFeed.setPrice(dec(100, 18)); - await boldToken.transfer(alice, dec(10000, 18), { from: whale }) - await stabilityPool.provideToSP(dec(10000, 18), { from: alice }) + await boldToken.transfer(alice, dec(10000, 18), { from: whale }); + await stabilityPool.provideToSP(dec(10000, 18), { from: alice }); // Defaulter 1 liquidated. P -> (~1e-10)*P const txL1 = await troveManager.liquidate(defaulter_1_TroveId, { from: owner }); - assert.isTrue(txL1.receipt.status) + assert.isTrue(txL1.receipt.status); - const aliceDeposit = (await stabilityPool.getCompoundedBoldDeposit(alice)).toString() + const aliceDeposit = (await stabilityPool.getCompoundedBoldDeposit(alice)).toString(); // console.log(`alice deposit: ${aliceDeposit}`) - assert.equal(aliceDeposit, 0) - }) + assert.equal(aliceDeposit, 0); + }); // --- Serial scale changes --- @@ -1607,242 +3074,402 @@ contract('StabilityPool - Withdrawal of stability deposit - Reward calculations' L4 decreases P by(~1e-5)P. L4: 9999.900000000000000000 Bold, 1 ETH expect A, B, C, D each withdraw ~100 Ether */ - // - // TODO: Changes since v1 have introduced very slight precision error in this test. Potentially due to slightly different rounding + // + // TODO: Changes since v1 have introduced very slight precision error in this test. Potentially due to slightly different rounding // in helper functon getOpenTroveBoldAmount due to now-zero borrow fees. Double-check this when we write new SP arithmetic tests and fix the "P" issue. it.skip("withdrawETHGainToTrove(): Several deposits of 10000 Bold span one scale factor change. Depositors withdraws correct compounded deposit and ETH Gain after one liquidation", async () => { // Whale opens Trove with 100k ETH - await th.openTroveWrapper(contracts, th._100pct, await getOpenTroveBoldAmount(dec(100000, 18)), whale, whale, 0, { from: whale, value: dec(100000, 'ether') }) + await th.openTroveWrapper(contracts, th._100pct, await getOpenTroveBoldAmount(dec(100000, 18)), whale, whale, 0, { + from: whale, + value: dec(100000, "ether"), + }); + + const aliceTroveId = await th.openTroveWrapper( + contracts, + th._100pct, + await getOpenTroveBoldAmount(dec(10000, 18)), + ZERO_ADDRESS, + ZERO_ADDRESS, + 0, + { from: alice, value: dec(10000, "ether") }, + ); + const bobTroveId = await th.openTroveWrapper( + contracts, + th._100pct, + await getOpenTroveBoldAmount(dec(10000, 18)), + ZERO_ADDRESS, + ZERO_ADDRESS, + 0, + { from: bob, value: dec(10000, "ether") }, + ); + const carolTroveId = await th.openTroveWrapper( + contracts, + th._100pct, + await getOpenTroveBoldAmount(dec(10000, 18)), + ZERO_ADDRESS, + ZERO_ADDRESS, + 0, + { from: carol, value: dec(10000, "ether") }, + ); + const dennisTroveId = await th.openTroveWrapper( + contracts, + th._100pct, + await getOpenTroveBoldAmount(dec(10000, 18)), + ZERO_ADDRESS, + ZERO_ADDRESS, + 0, + { from: dennis, value: dec(10000, "ether") }, + ); - const aliceTroveId = await th.openTroveWrapper(contracts, th._100pct, await getOpenTroveBoldAmount(dec(10000, 18)), ZERO_ADDRESS, ZERO_ADDRESS, 0, { from: alice, value: dec(10000, 'ether') }) - const bobTroveId = await th.openTroveWrapper(contracts, th._100pct, await getOpenTroveBoldAmount(dec(10000, 18)), ZERO_ADDRESS, ZERO_ADDRESS, 0, { from: bob, value: dec(10000, 'ether') }) - const carolTroveId = await th.openTroveWrapper(contracts, th._100pct, await getOpenTroveBoldAmount(dec(10000, 18)), ZERO_ADDRESS, ZERO_ADDRESS, 0, { from: carol, value: dec(10000, 'ether') }) - const dennisTroveId = await th.openTroveWrapper(contracts, th._100pct, await getOpenTroveBoldAmount(dec(10000, 18)), ZERO_ADDRESS, ZERO_ADDRESS, 0, { from: dennis, value: dec(10000, 'ether') }) - // Defaulters 1-4 each withdraw 9999.9 Bold - const defaulter_1_TroveId = await th.openTroveWrapper(contracts, th._100pct, await getOpenTroveBoldAmount('9999900000000000000000'), defaulter_1, defaulter_1, 0, { from: defaulter_1, value: dec(100, 'ether') }) - const defaulter_2_TroveId = await th.openTroveWrapper(contracts, th._100pct, await getOpenTroveBoldAmount('9999900000000000000000'), defaulter_2, defaulter_2, 0,{ from: defaulter_2, value: dec(100, 'ether') }) - const defaulter_3_TroveId = await th.openTroveWrapper(contracts, th._100pct, await getOpenTroveBoldAmount('9999900000000000000000'), defaulter_3, defaulter_3, 0,0,{ from: defaulter_3, value: dec(100, 'ether') }) - const defaulter_4_TroveId = await th.openTroveWrapper(contracts, th._100pct, await getOpenTroveBoldAmount('9999900000000000000000'), defaulter_4, defaulter_4, 0,{ from: defaulter_4, value: dec(100, 'ether') }) + const defaulter_1_TroveId = await th.openTroveWrapper( + contracts, + th._100pct, + await getOpenTroveBoldAmount("9999900000000000000000"), + defaulter_1, + defaulter_1, + 0, + { from: defaulter_1, value: dec(100, "ether") }, + ); + const defaulter_2_TroveId = await th.openTroveWrapper( + contracts, + th._100pct, + await getOpenTroveBoldAmount("9999900000000000000000"), + defaulter_2, + defaulter_2, + 0, + { from: defaulter_2, value: dec(100, "ether") }, + ); + const defaulter_3_TroveId = await th.openTroveWrapper( + contracts, + th._100pct, + await getOpenTroveBoldAmount("9999900000000000000000"), + defaulter_3, + defaulter_3, + 0, + 0, + { from: defaulter_3, value: dec(100, "ether") }, + ); + const defaulter_4_TroveId = await th.openTroveWrapper( + contracts, + th._100pct, + await getOpenTroveBoldAmount("9999900000000000000000"), + defaulter_4, + defaulter_4, + 0, + { from: defaulter_4, value: dec(100, "ether") }, + ); // price drops by 50% await priceFeed.setPrice(dec(100, 18)); - await boldToken.transfer(alice, dec(10000, 18), { from: whale }) - await stabilityPool.provideToSP(dec(10000, 18), { from: alice }) + await boldToken.transfer(alice, dec(10000, 18), { from: whale }); + await stabilityPool.provideToSP(dec(10000, 18), { from: alice }); // Defaulter 1 liquidated. P decreases to 1e13 const txL1 = await troveManager.liquidate(defaulter_1_TroveId, { from: owner }); - assert.isTrue(txL1.receipt.status) - th.logBN("P", await stabilityPool.P()) // P = 0.000009999999999999, 1 wei less than expected - assert.equal(await stabilityPool.P(), dec(1, 13)) // P decreases to 1e(18-5) = 1e13 - assert.equal(await stabilityPool.currentScale(), '0') + assert.isTrue(txL1.receipt.status); + th.logBN("P", await stabilityPool.P()); // P = 0.000009999999999999, 1 wei less than expected + assert.equal(await stabilityPool.P(), dec(1, 13)); // P decreases to 1e(18-5) = 1e13 + assert.equal(await stabilityPool.currentScale(), "0"); // B deposits 9999.9 Bold - await boldToken.transfer(bob, dec(99999, 17), { from: whale }) - await stabilityPool.provideToSP(dec(99999, 17), { from: bob }) + await boldToken.transfer(bob, dec(99999, 17), { from: whale }); + await stabilityPool.provideToSP(dec(99999, 17), { from: bob }); // Defaulter 2 liquidated const txL2 = await troveManager.liquidate(defaulter_2_TroveId, { from: owner }); - assert.isTrue(txL2.receipt.status) - assert.equal(await stabilityPool.P(), dec(1, 17)) // Scale changes and P changes to 1e(13-5+9) = 1e17 - assert.equal(await stabilityPool.currentScale(), '1') + assert.isTrue(txL2.receipt.status); + assert.equal(await stabilityPool.P(), dec(1, 17)); // Scale changes and P changes to 1e(13-5+9) = 1e17 + assert.equal(await stabilityPool.currentScale(), "1"); // C deposits 9999.9 Bold - await boldToken.transfer(carol, dec(99999, 17), { from: whale }) - await stabilityPool.provideToSP(dec(99999, 17), { from: carol }) + await boldToken.transfer(carol, dec(99999, 17), { from: whale }); + await stabilityPool.provideToSP(dec(99999, 17), { from: carol }); // Defaulter 3 liquidated const txL3 = await troveManager.liquidate(defaulter_3_TroveId, { from: owner }); - assert.isTrue(txL3.receipt.status) - assert.equal(await stabilityPool.P(), dec(1, 12)) // P decreases to 1e(17-5) = 1e12 - assert.equal(await stabilityPool.currentScale(), '1') + assert.isTrue(txL3.receipt.status); + assert.equal(await stabilityPool.P(), dec(1, 12)); // P decreases to 1e(17-5) = 1e12 + assert.equal(await stabilityPool.currentScale(), "1"); // D deposits 9999.9 Bold - await boldToken.transfer(dennis, dec(99999, 17), { from: whale }) - await stabilityPool.provideToSP(dec(99999, 17), { from: dennis }) + await boldToken.transfer(dennis, dec(99999, 17), { from: whale }); + await stabilityPool.provideToSP(dec(99999, 17), { from: dennis }); // Defaulter 4 liquidated const txL4 = await troveManager.liquidate(defaulter_4_TroveId, { from: owner }); - assert.isTrue(txL4.receipt.status) - assert.equal(await stabilityPool.P(), dec(1, 16)) // Scale changes and P changes to 1e(12-5+9) = 1e16 - assert.equal(await stabilityPool.currentScale(), '2') + assert.isTrue(txL4.receipt.status); + assert.equal(await stabilityPool.P(), dec(1, 16)); // Scale changes and P changes to 1e(12-5+9) = 1e16 + assert.equal(await stabilityPool.currentScale(), "2"); - const txA = await stabilityPool.withdrawETHGainToTrove(aliceTroveId, { from: alice }) - const txB = await stabilityPool.withdrawETHGainToTrove(bobTroveId, { from: bob }) - const txC = await stabilityPool.withdrawETHGainToTrove(carolTroveId, { from: carol }) - const txD = await stabilityPool.withdrawETHGainToTrove(dennisTroveId, { from: dennis }) + const txA = await stabilityPool.withdrawETHGainToTrove(aliceTroveId, { from: alice }); + const txB = await stabilityPool.withdrawETHGainToTrove(bobTroveId, { from: bob }); + const txC = await stabilityPool.withdrawETHGainToTrove(carolTroveId, { from: carol }); + const txD = await stabilityPool.withdrawETHGainToTrove(dennisTroveId, { from: dennis }); - const alice_ETHWithdrawn = await th.getEventArgByName(txA, 'ETHGainWithdrawn', '_ETH').toString() - const bob_ETHWithdrawn = await th.getEventArgByName(txB, 'ETHGainWithdrawn', '_ETH').toString() - const carol_ETHWithdrawn = await th.getEventArgByName(txC, 'ETHGainWithdrawn', '_ETH').toString() - const dennis_ETHWithdrawn = await th.getEventArgByName(txD, 'ETHGainWithdrawn', '_ETH').toString() + const alice_ETHWithdrawn = await th.getEventArgByName(txA, "ETHGainWithdrawn", "_ETH").toString(); + const bob_ETHWithdrawn = await th.getEventArgByName(txB, "ETHGainWithdrawn", "_ETH").toString(); + const carol_ETHWithdrawn = await th.getEventArgByName(txC, "ETHGainWithdrawn", "_ETH").toString(); + const dennis_ETHWithdrawn = await th.getEventArgByName(txD, "ETHGainWithdrawn", "_ETH").toString(); // A, B, C should retain 0 - their deposits have been completely used up - assert.equal(await stabilityPool.getCompoundedBoldDeposit(alice), '0') - assert.equal(await stabilityPool.getCompoundedBoldDeposit(alice), '0') - assert.equal(await stabilityPool.getCompoundedBoldDeposit(alice), '0') + assert.equal(await stabilityPool.getCompoundedBoldDeposit(alice), "0"); + assert.equal(await stabilityPool.getCompoundedBoldDeposit(alice), "0"); + assert.equal(await stabilityPool.getCompoundedBoldDeposit(alice), "0"); // D should retain around 0.9999 Bold, since his deposit of 9999.9 was reduced by a factor of 1e-5 - assert.isAtMost(th.getDifference((await stabilityPool.getCompoundedBoldDeposit(dennis)).toString(), dec(99999, 12)), 100000) + assert.isAtMost( + th.getDifference((await stabilityPool.getCompoundedBoldDeposit(dennis)).toString(), dec(99999, 12)), + 100000, + ); // 99.5 ETH is offset at each L, 0.5 goes to gas comp // Each depositor gets ETH rewards of around 99.5 ETH. 1e17 error tolerance - assert.isTrue(toBN(alice_ETHWithdrawn).sub(toBN(dec(995, 17))).abs().lte(toBN(dec(1, 17)))) - assert.isTrue(toBN(bob_ETHWithdrawn).sub(toBN(dec(995, 17))).abs().lte(toBN(dec(1, 17)))) - assert.isTrue(toBN(carol_ETHWithdrawn).sub(toBN(dec(995, 17))).abs().lte(toBN(dec(1, 17)))) - assert.isTrue(toBN(dennis_ETHWithdrawn).sub(toBN(dec(995, 17))).abs().lte(toBN(dec(1, 17)))) - }) + assert.isTrue(toBN(alice_ETHWithdrawn).sub(toBN(dec(995, 17))).abs().lte(toBN(dec(1, 17)))); + assert.isTrue(toBN(bob_ETHWithdrawn).sub(toBN(dec(995, 17))).abs().lte(toBN(dec(1, 17)))); + assert.isTrue(toBN(carol_ETHWithdrawn).sub(toBN(dec(995, 17))).abs().lte(toBN(dec(1, 17)))); + assert.isTrue(toBN(dennis_ETHWithdrawn).sub(toBN(dec(995, 17))).abs().lte(toBN(dec(1, 17)))); + }); it("withdrawETHGainToTrove(): 2 depositors can withdraw after each receiving half of a pool-emptying liquidation", async () => { // Whale opens Trove with 100k ETH - await th.openTroveWrapper(contracts, th._100pct, await getOpenTroveBoldAmount(dec(100000, 18)), whale, whale, 0, { from: whale, value: dec(100000, 'ether') }) - - const ATroveId = await th.openTroveWrapper(contracts, th._100pct, await getOpenTroveBoldAmount(dec(10000, 18)), ZERO_ADDRESS, ZERO_ADDRESS, 0, { from: A, value: dec(10000, 'ether') }) - const BTroveId = await th.openTroveWrapper(contracts, th._100pct, await getOpenTroveBoldAmount(dec(10000, 18)), ZERO_ADDRESS, ZERO_ADDRESS, 0, { from: B, value: dec(10000, 'ether') }) - const CTroveId = await th.openTroveWrapper(contracts, th._100pct, await getOpenTroveBoldAmount(dec(10000, 18)), ZERO_ADDRESS, ZERO_ADDRESS, 0, { from: C, value: dec(10000, 'ether') }) - const DTroveId = await th.openTroveWrapper(contracts, th._100pct, await getOpenTroveBoldAmount(dec(10000, 18)), ZERO_ADDRESS, ZERO_ADDRESS, 0, { from: D, value: dec(10000, 'ether') }) - const ETroveId = await th.openTroveWrapper(contracts, th._100pct, await getOpenTroveBoldAmount(dec(10000, 18)), ZERO_ADDRESS, ZERO_ADDRESS, 0, { from: E, value: dec(10000, 'ether') }) - const FTroveId = await th.openTroveWrapper(contracts, th._100pct, await getOpenTroveBoldAmount(dec(10000, 18)), ZERO_ADDRESS, ZERO_ADDRESS, 0, { from: F, value: dec(10000, 'ether') }) - + await th.openTroveWrapper(contracts, th._100pct, await getOpenTroveBoldAmount(dec(100000, 18)), whale, whale, 0, { + from: whale, + value: dec(100000, "ether"), + }); + + const ATroveId = await th.openTroveWrapper( + contracts, + th._100pct, + await getOpenTroveBoldAmount(dec(10000, 18)), + ZERO_ADDRESS, + ZERO_ADDRESS, + 0, + { from: A, value: dec(10000, "ether") }, + ); + const BTroveId = await th.openTroveWrapper( + contracts, + th._100pct, + await getOpenTroveBoldAmount(dec(10000, 18)), + ZERO_ADDRESS, + ZERO_ADDRESS, + 0, + { from: B, value: dec(10000, "ether") }, + ); + const CTroveId = await th.openTroveWrapper( + contracts, + th._100pct, + await getOpenTroveBoldAmount(dec(10000, 18)), + ZERO_ADDRESS, + ZERO_ADDRESS, + 0, + { from: C, value: dec(10000, "ether") }, + ); + const DTroveId = await th.openTroveWrapper( + contracts, + th._100pct, + await getOpenTroveBoldAmount(dec(10000, 18)), + ZERO_ADDRESS, + ZERO_ADDRESS, + 0, + { from: D, value: dec(10000, "ether") }, + ); + const ETroveId = await th.openTroveWrapper( + contracts, + th._100pct, + await getOpenTroveBoldAmount(dec(10000, 18)), + ZERO_ADDRESS, + ZERO_ADDRESS, + 0, + { from: E, value: dec(10000, "ether") }, + ); + const FTroveId = await th.openTroveWrapper( + contracts, + th._100pct, + await getOpenTroveBoldAmount(dec(10000, 18)), + ZERO_ADDRESS, + ZERO_ADDRESS, + 0, + { from: F, value: dec(10000, "ether") }, + ); + // Defaulters 1-3 each withdraw 24100, 24300, 24500 Bold (inc gas comp) - const defaulter_1_TroveId = await th.openTroveWrapper(contracts, th._100pct, await getOpenTroveBoldAmount(dec(24100, 18)), defaulter_1, defaulter_1, 0, { from: defaulter_1, value: dec(200, 'ether') }) - const defaulter_2_TroveId = await th.openTroveWrapper(contracts, th._100pct, await getOpenTroveBoldAmount(dec(24300, 18)), defaulter_2, defaulter_2, 0, { from: defaulter_2, value: dec(200, 'ether') }) - const defaulter_3_TroveId = await th.openTroveWrapper(contracts, th._100pct, await getOpenTroveBoldAmount(dec(24500, 18)), defaulter_3, defaulter_3, 0, { from: defaulter_3, value: dec(200, 'ether') }) + const defaulter_1_TroveId = await th.openTroveWrapper( + contracts, + th._100pct, + await getOpenTroveBoldAmount(dec(24100, 18)), + defaulter_1, + defaulter_1, + 0, + { from: defaulter_1, value: dec(200, "ether") }, + ); + const defaulter_2_TroveId = await th.openTroveWrapper( + contracts, + th._100pct, + await getOpenTroveBoldAmount(dec(24300, 18)), + defaulter_2, + defaulter_2, + 0, + { from: defaulter_2, value: dec(200, "ether") }, + ); + const defaulter_3_TroveId = await th.openTroveWrapper( + contracts, + th._100pct, + await getOpenTroveBoldAmount(dec(24500, 18)), + defaulter_3, + defaulter_3, + 0, + { from: defaulter_3, value: dec(200, "ether") }, + ); // price drops by 50% await priceFeed.setPrice(dec(100, 18)); - // A, B provide 10k Bold - await boldToken.transfer(A, dec(10000, 18), { from: whale }) - await boldToken.transfer(B, dec(10000, 18), { from: whale }) - await stabilityPool.provideToSP(dec(10000, 18), { from: A }) - await stabilityPool.provideToSP(dec(10000, 18), { from: B }) + // A, B provide 10k Bold + await boldToken.transfer(A, dec(10000, 18), { from: whale }); + await boldToken.transfer(B, dec(10000, 18), { from: whale }); + await stabilityPool.provideToSP(dec(10000, 18), { from: A }); + await stabilityPool.provideToSP(dec(10000, 18), { from: B }); // Defaulter 1 liquidated. SP emptied const txL1 = await troveManager.liquidate(defaulter_1_TroveId, { from: owner }); - assert.isTrue(txL1.receipt.status) + assert.isTrue(txL1.receipt.status); // Check compounded deposits - const A_deposit = await stabilityPool.getCompoundedBoldDeposit(A) - const B_deposit = await stabilityPool.getCompoundedBoldDeposit(B) + const A_deposit = await stabilityPool.getCompoundedBoldDeposit(A); + const B_deposit = await stabilityPool.getCompoundedBoldDeposit(B); // console.log(`A_deposit: ${A_deposit}`) // console.log(`B_deposit: ${B_deposit}`) - assert.equal(A_deposit, '0') - assert.equal(B_deposit, '0') + assert.equal(A_deposit, "0"); + assert.equal(B_deposit, "0"); // Check SP tracker is zero - const BoldinSP_1 = await stabilityPool.getTotalBoldDeposits() + const BoldinSP_1 = await stabilityPool.getTotalBoldDeposits(); // console.log(`BoldinSP_1: ${BoldinSP_1}`) - assert.equal(BoldinSP_1, '0') + assert.equal(BoldinSP_1, "0"); // Check SP Bold balance is zero - const SPBoldBalance_1 = await boldToken.balanceOf(stabilityPool.address) + const SPBoldBalance_1 = await boldToken.balanceOf(stabilityPool.address); // console.log(`SPBoldBalance_1: ${SPBoldBalance_1}`) - assert.equal(SPBoldBalance_1, '0') + assert.equal(SPBoldBalance_1, "0"); // Attempt withdrawals // Increasing the price for a moment to avoid pending liquidations to block withdrawal - await priceFeed.setPrice(dec(200, 18)) - const txA = await stabilityPool.withdrawETHGainToTrove(ATroveId, { from: A }) - const txB = await stabilityPool.withdrawETHGainToTrove(BTroveId, { from: B }) - await priceFeed.setPrice(dec(100, 18)) + await priceFeed.setPrice(dec(200, 18)); + const txA = await stabilityPool.withdrawETHGainToTrove(ATroveId, { from: A }); + const txB = await stabilityPool.withdrawETHGainToTrove(BTroveId, { from: B }); + await priceFeed.setPrice(dec(100, 18)); - assert.isTrue(txA.receipt.status) - assert.isTrue(txB.receipt.status) + assert.isTrue(txA.receipt.status); + assert.isTrue(txB.receipt.status); // ========== - // C, D provide 10k Bold - await boldToken.transfer(C, dec(10000, 18), { from: whale }) - await boldToken.transfer(D, dec(10000, 18), { from: whale }) - await stabilityPool.provideToSP(dec(10000, 18), { from: C }) - await stabilityPool.provideToSP(dec(10000, 18), { from: D }) + // C, D provide 10k Bold + await boldToken.transfer(C, dec(10000, 18), { from: whale }); + await boldToken.transfer(D, dec(10000, 18), { from: whale }); + await stabilityPool.provideToSP(dec(10000, 18), { from: C }); + await stabilityPool.provideToSP(dec(10000, 18), { from: D }); // Defaulter 2 liquidated. SP emptied const txL2 = await troveManager.liquidate(defaulter_2_TroveId, { from: owner }); - assert.isTrue(txL2.receipt.status) + assert.isTrue(txL2.receipt.status); // Check compounded deposits - const C_deposit = await stabilityPool.getCompoundedBoldDeposit(C) - const D_deposit = await stabilityPool.getCompoundedBoldDeposit(D) + const C_deposit = await stabilityPool.getCompoundedBoldDeposit(C); + const D_deposit = await stabilityPool.getCompoundedBoldDeposit(D); // console.log(`A_deposit: ${C_deposit}`) // console.log(`B_deposit: ${D_deposit}`) - assert.equal(C_deposit, '0') - assert.equal(D_deposit, '0') + assert.equal(C_deposit, "0"); + assert.equal(D_deposit, "0"); // Check SP tracker is zero - const BoldinSP_2 = await stabilityPool.getTotalBoldDeposits() + const BoldinSP_2 = await stabilityPool.getTotalBoldDeposits(); // console.log(`BoldinSP_2: ${BoldinSP_2}`) - assert.equal(BoldinSP_2, '0') + assert.equal(BoldinSP_2, "0"); // Check SP Bold balance is zero - const SPBoldBalance_2 = await boldToken.balanceOf(stabilityPool.address) + const SPBoldBalance_2 = await boldToken.balanceOf(stabilityPool.address); // console.log(`SPBoldBalance_2: ${SPBoldBalance_2}`) - assert.equal(SPBoldBalance_2, '0') + assert.equal(SPBoldBalance_2, "0"); // Attempt withdrawals // Increasing the price for a moment to avoid pending liquidations to block withdrawal - await priceFeed.setPrice(dec(200, 18)) - const txC = await stabilityPool.withdrawETHGainToTrove(CTroveId, { from: C }) - const txD = await stabilityPool.withdrawETHGainToTrove(DTroveId, { from: D }) - await priceFeed.setPrice(dec(100, 18)) + await priceFeed.setPrice(dec(200, 18)); + const txC = await stabilityPool.withdrawETHGainToTrove(CTroveId, { from: C }); + const txD = await stabilityPool.withdrawETHGainToTrove(DTroveId, { from: D }); + await priceFeed.setPrice(dec(100, 18)); - assert.isTrue(txC.receipt.status) - assert.isTrue(txD.receipt.status) + assert.isTrue(txC.receipt.status); + assert.isTrue(txD.receipt.status); // ============ - // E, F provide 10k Bold - await boldToken.transfer(E, dec(10000, 18), { from: whale }) - await boldToken.transfer(F, dec(10000, 18), { from: whale }) - await stabilityPool.provideToSP(dec(10000, 18), { from: E }) - await stabilityPool.provideToSP(dec(10000, 18), { from: F }) + // E, F provide 10k Bold + await boldToken.transfer(E, dec(10000, 18), { from: whale }); + await boldToken.transfer(F, dec(10000, 18), { from: whale }); + await stabilityPool.provideToSP(dec(10000, 18), { from: E }); + await stabilityPool.provideToSP(dec(10000, 18), { from: F }); // Defaulter 3 liquidated. SP emptied const txL3 = await troveManager.liquidate(defaulter_3_TroveId, { from: owner }); - assert.isTrue(txL3.receipt.status) + assert.isTrue(txL3.receipt.status); // Check compounded deposits - const E_deposit = await stabilityPool.getCompoundedBoldDeposit(E) - const F_deposit = await stabilityPool.getCompoundedBoldDeposit(F) + const E_deposit = await stabilityPool.getCompoundedBoldDeposit(E); + const F_deposit = await stabilityPool.getCompoundedBoldDeposit(F); // console.log(`E_deposit: ${E_deposit}`) // console.log(`F_deposit: ${F_deposit}`) - assert.equal(E_deposit, '0') - assert.equal(F_deposit, '0') + assert.equal(E_deposit, "0"); + assert.equal(F_deposit, "0"); // Check SP tracker is zero - const BoldinSP_3 = await stabilityPool.getTotalBoldDeposits() - assert.equal(BoldinSP_3, '0') + const BoldinSP_3 = await stabilityPool.getTotalBoldDeposits(); + assert.equal(BoldinSP_3, "0"); // Check SP Bold balance is zero - const SPBoldBalance_3 = await boldToken.balanceOf(stabilityPool.address) + const SPBoldBalance_3 = await boldToken.balanceOf(stabilityPool.address); // console.log(`SPBoldBalance_3: ${SPBoldBalance_3}`) - assert.equal(SPBoldBalance_3, '0') + assert.equal(SPBoldBalance_3, "0"); // Attempt withdrawals - const txE = await stabilityPool.withdrawETHGainToTrove(ETroveId, { from: E }) - const txF = await stabilityPool.withdrawETHGainToTrove(FTroveId, { from: F }) - assert.isTrue(txE.receipt.status) - assert.isTrue(txF.receipt.status) - }) + const txE = await stabilityPool.withdrawETHGainToTrove(ETroveId, { from: E }); + const txF = await stabilityPool.withdrawETHGainToTrove(FTroveId, { from: F }); + assert.isTrue(txE.receipt.status); + assert.isTrue(txF.receipt.status); + }); // --- Extreme values, confirm no overflows --- it("withdrawETHGainToTrove(): Large liquidated coll/debt, deposits and ETH price", async () => { // Whale opens Trove with 100k ETH - await th.openTroveWrapper(contracts, th._100pct, await getOpenTroveBoldAmount(dec(100000, 18)), whale, whale, 0, { from: whale, value: dec(100000, 'ether') }) + await th.openTroveWrapper(contracts, th._100pct, await getOpenTroveBoldAmount(dec(100000, 18)), whale, whale, 0, { + from: whale, + value: dec(100000, "ether"), + }); // ETH:USD price is $2 billion per ETH await priceFeed.setPrice(dec(2, 27)); - const depositors = [alice, bob] + const depositors = [alice, bob]; for (const account of depositors) { - await th.openTroveWrapper(contracts, th._100pct, dec(1, 36), account, account, 0, { from: account, value: dec(2, 27) }) - await stabilityPool.provideToSP(dec(1, 36), { from: account }) + await th.openTroveWrapper(contracts, th._100pct, dec(1, 36), account, account, 0, { + from: account, + value: dec(2, 27), + }); + await stabilityPool.provideToSP(dec(1, 36), { from: account }); } // Defaulter opens trove with 200% ICR - const defaulter_1_TroveId = await th.openTroveWrapper(contracts, th._100pct, await getOpenTroveBoldAmount(dec(1, 36)), defaulter_1, defaulter_1, 0, { from: defaulter_1, value: dec(1, 27) }) + const defaulter_1_TroveId = await th.openTroveWrapper( + contracts, + th._100pct, + await getOpenTroveBoldAmount(dec(1, 36)), + defaulter_1, + defaulter_1, + 0, + { from: defaulter_1, value: dec(1, 27) }, + ); // ETH:USD price drops to $1 billion per ETH await priceFeed.setPrice(dec(1, 27)); @@ -1850,87 +3477,101 @@ contract('StabilityPool - Withdrawal of stability deposit - Reward calculations' // Defaulter liquidated await troveManager.liquidate(defaulter_1_TroveId, { from: owner }); - const txA = await stabilityPool.withdrawETHGainToTrove(th.addressToTroveId(alice), { from: alice }) - const txB = await stabilityPool.withdrawETHGainToTrove(th.addressToTroveId(bob), { from: bob }) + const txA = await stabilityPool.withdrawETHGainToTrove(th.addressToTroveId(alice), { from: alice }); + const txB = await stabilityPool.withdrawETHGainToTrove(th.addressToTroveId(bob), { from: bob }); // Grab the ETH gain from the emitted event in the tx log - const alice_ETHWithdrawn = th.getEventArgByName(txA, 'ETHGainWithdrawn', '_ETH') - const bob_ETHWithdrawn = th.getEventArgByName(txB, 'ETHGainWithdrawn', '_ETH') + const alice_ETHWithdrawn = th.getEventArgByName(txA, "ETHGainWithdrawn", "_ETH"); + const bob_ETHWithdrawn = th.getEventArgByName(txB, "ETHGainWithdrawn", "_ETH"); // Check Bold balances - const aliceBoldBalance = await stabilityPool.getCompoundedBoldDeposit(alice) - const aliceExpectedBoldBalance = web3.utils.toBN(dec(5, 35)) - const aliceBoldBalDiff = aliceBoldBalance.sub(aliceExpectedBoldBalance).abs() + const aliceBoldBalance = await stabilityPool.getCompoundedBoldDeposit(alice); + const aliceExpectedBoldBalance = web3.utils.toBN(dec(5, 35)); + const aliceBoldBalDiff = aliceBoldBalance.sub(aliceExpectedBoldBalance).abs(); - assert.isTrue(aliceBoldBalDiff.lte(toBN(dec(1, 18)))) // error tolerance of 1e18 + assert.isTrue(aliceBoldBalDiff.lte(toBN(dec(1, 18)))); // error tolerance of 1e18 - const bobBoldBalance = await stabilityPool.getCompoundedBoldDeposit(bob) - const bobExpectedBoldBalance = toBN(dec(5, 35)) - const bobBoldBalDiff = bobBoldBalance.sub(bobExpectedBoldBalance).abs() + const bobBoldBalance = await stabilityPool.getCompoundedBoldDeposit(bob); + const bobExpectedBoldBalance = toBN(dec(5, 35)); + const bobBoldBalDiff = bobBoldBalance.sub(bobExpectedBoldBalance).abs(); - assert.isTrue(bobBoldBalDiff.lte(toBN(dec(1, 18)))) + assert.isTrue(bobBoldBalDiff.lte(toBN(dec(1, 18)))); // Check ETH gains - const aliceExpectedETHGain = toBN(dec(4975, 23)) - const aliceETHDiff = aliceExpectedETHGain.sub(toBN(alice_ETHWithdrawn)) + const aliceExpectedETHGain = toBN(dec(4975, 23)); + const aliceETHDiff = aliceExpectedETHGain.sub(toBN(alice_ETHWithdrawn)); - assert.isTrue(aliceETHDiff.lte(toBN(dec(1, 18)))) + assert.isTrue(aliceETHDiff.lte(toBN(dec(1, 18)))); - const bobExpectedETHGain = toBN(dec(4975, 23)) - const bobETHDiff = bobExpectedETHGain.sub(toBN(bob_ETHWithdrawn)) + const bobExpectedETHGain = toBN(dec(4975, 23)); + const bobETHDiff = bobExpectedETHGain.sub(toBN(bob_ETHWithdrawn)); - assert.isTrue(bobETHDiff.lte(toBN(dec(1, 18)))) - }) + assert.isTrue(bobETHDiff.lte(toBN(dec(1, 18)))); + }); // TODO: Changes since v1 have made the error margin in this test i.e. aliceBoldBalanceDiff increase 100x (but still low relative to the huge values used in test). // Potentially due to slightly different rounding in helper getOpenTroveBoldAmount due to now-zero borrow fees. // Double-check this when we write new SP arithmetic tests and fix the "P" issue. it.skip("withdrawETHGainToTrove(): Small liquidated coll/debt, large deposits and ETH price", async () => { // Whale opens Trove with 100k ETH - await th.openTroveWrapper(contracts, th._100pct, await getOpenTroveBoldAmount(dec(100000, 18)), whale, whale, 0, { from: whale, value: dec(100000, 'ether') }) + await th.openTroveWrapper(contracts, th._100pct, await getOpenTroveBoldAmount(dec(100000, 18)), whale, whale, 0, { + from: whale, + value: dec(100000, "ether"), + }); // ETH:USD price is $2 billion per ETH await priceFeed.setPrice(dec(2, 27)); - const price = await priceFeed.getPrice() + const price = await priceFeed.getPrice(); - const depositors = [alice, bob] + const depositors = [alice, bob]; for (const account of depositors) { - await th.openTroveWrapper(contracts, th._100pct, dec(1, 38), account, account, { from: account, value: dec(2, 29) }) - await stabilityPool.provideToSP(dec(1, 38), { from: account }) + await th.openTroveWrapper(contracts, th._100pct, dec(1, 38), account, account, { + from: account, + value: dec(2, 29), + }); + await stabilityPool.provideToSP(dec(1, 38), { from: account }); } // Defaulter opens trove with 50e-7 ETH and 5000 Bold. 200% ICR - const defaulter_1_TroveId = await th.openTroveWrapper(contracts, th._100pct, await getOpenTroveBoldAmount(dec(5000, 18)), defaulter_1, defaulter_1, 0, { from: defaulter_1, value: '5000000000000' }) - + const defaulter_1_TroveId = await th.openTroveWrapper( + contracts, + th._100pct, + await getOpenTroveBoldAmount(dec(5000, 18)), + defaulter_1, + defaulter_1, + 0, + { from: defaulter_1, value: "5000000000000" }, + ); + // ETH:USD price drops to $1 billion per ETH await priceFeed.setPrice(dec(1, 27)); // Defaulter liquidated await troveManager.liquidate(defaulter_1_TroveId, { from: owner }); - const txAPromise = stabilityPool.withdrawETHGainToTrove(th.addressToTroveId(alice), { from: alice }) - const txBPromise = stabilityPool.withdrawETHGainToTrove(th.addressToTroveId(bob), { from: bob }) + const txAPromise = stabilityPool.withdrawETHGainToTrove(th.addressToTroveId(alice), { from: alice }); + const txBPromise = stabilityPool.withdrawETHGainToTrove(th.addressToTroveId(bob), { from: bob }); // Expect ETH gain per depositor of ~1e11 wei to be rounded to 0 by the ETHGainedPerUnitStaked calculation (e / D), where D is ~1e36. - await th.assertRevert(txAPromise, 'StabilityPool: caller must have non-zero ETH Gain') - await th.assertRevert(txBPromise, 'StabilityPool: caller must have non-zero ETH Gain') + await th.assertRevert(txAPromise, "StabilityPool: caller must have non-zero ETH Gain"); + await th.assertRevert(txBPromise, "StabilityPool: caller must have non-zero ETH Gain"); - const aliceBoldBalance = await stabilityPool.getCompoundedBoldDeposit(alice) + const aliceBoldBalance = await stabilityPool.getCompoundedBoldDeposit(alice); // const aliceBoldBalance = await boldToken.balanceOf(alice) - const aliceExpectedBoldBalance = toBN('99999999999999997500000000000000000000') - const aliceBoldBalDiff = aliceBoldBalance.sub(aliceExpectedBoldBalance).abs() + const aliceExpectedBoldBalance = toBN("99999999999999997500000000000000000000"); + const aliceBoldBalDiff = aliceBoldBalance.sub(aliceExpectedBoldBalance).abs(); - th.logBN("aliceBoldBalDiff", aliceBoldBalDiff) // 100x bigger than expected + th.logBN("aliceBoldBalDiff", aliceBoldBalDiff); // 100x bigger than expected - assert.isTrue(aliceBoldBalDiff.lte(toBN(dec(1, 18)))) + assert.isTrue(aliceBoldBalDiff.lte(toBN(dec(1, 18)))); - const bobBoldBalance = await stabilityPool.getCompoundedBoldDeposit(bob) - const bobExpectedBoldBalance = toBN('99999999999999997500000000000000000000') - const bobBoldBalDiff = bobBoldBalance.sub(bobExpectedBoldBalance).abs() + const bobBoldBalance = await stabilityPool.getCompoundedBoldDeposit(bob); + const bobExpectedBoldBalance = toBN("99999999999999997500000000000000000000"); + const bobBoldBalDiff = bobBoldBalance.sub(bobExpectedBoldBalance).abs(); - assert.isTrue(bobBoldBalDiff.lte(toBN('100000000000000000000'))) - }) - }) -}) + assert.isTrue(bobBoldBalDiff.lte(toBN("100000000000000000000"))); + }); + }); +}); -contract('Reset chain state', async accounts => { }) +contract("Reset chain state", async (accounts) => {}); diff --git a/contracts/test/TroveManagerTest.js b/contracts/test/TroveManagerTest.js index 4cedbf19..2534c82e 100644 --- a/contracts/test/TroveManagerTest.js +++ b/contracts/test/TroveManagerTest.js @@ -1,5 +1,5 @@ -const { time } = require('@nomicfoundation/hardhat-network-helpers'); -const { +const { time } = require("@nomicfoundation/hardhat-network-helpers"); +const { MoneyValues: mv, TestHelper: th, TimeValues: timeValues, @@ -52,20 +52,20 @@ contract("TroveManager", async (accounts) => { E, ] = fundedAccounts; - let contracts + let contracts; - let priceFeed - let boldToken - let sortedTroves - let troveManager - let activePool - let stabilityPool - let defaultPool - let borrowerOperations + let priceFeed; + let boldToken; + let sortedTroves; + let troveManager; + let activePool; + let stabilityPool; + let defaultPool; + let borrowerOperations; const deployFixture = createDeployAndFundFixture({ accounts: fundedAccounts, - mocks: { TroveManager: TroveManagerTester, } + mocks: { TroveManager: TroveManagerTester }, }); const getOpenTroveTotalDebt = async (boldAmount) => th.getOpenTroveTotalDebt(contracts, boldAmount); const getOpenTroveBoldAmount = async (totalDebt) => th.getOpenTroveBoldAmount(contracts, totalDebt); @@ -75,16 +75,16 @@ contract("TroveManager", async (accounts) => { const withdrawBold = async (params) => th.withdrawBold(contracts, params); beforeEach(async () => { - const result = await deployFixture() - contracts = result.contracts - priceFeed = contracts.priceFeedTestnet - boldToken = contracts.boldToken - sortedTroves = contracts.sortedTroves - troveManager = contracts.troveManager - activePool = contracts.activePool - stabilityPool = contracts.stabilityPool - defaultPool = contracts.defaultPool - borrowerOperations = contracts.borrowerOperations + const result = await deployFixture(); + contracts = result.contracts; + priceFeed = contracts.priceFeedTestnet; + boldToken = contracts.boldToken; + sortedTroves = contracts.sortedTroves; + troveManager = contracts.troveManager; + activePool = contracts.activePool; + stabilityPool = contracts.stabilityPool; + defaultPool = contracts.defaultPool; + borrowerOperations = contracts.borrowerOperations; }); it("liquidate(): closes a Trove that has ICR < MCR", async () => { @@ -125,10 +125,14 @@ contract("TroveManager", async (accounts) => { it("liquidate(): decreases ActivePool ETH and BoldDebt by correct amounts", async () => { // --- SETUP --- - const { troveId: aliceTroveId, collateral: A_collateral, totalDebt: A_totalDebt } = - await openTrove({ ICR: toBN(dec(4, 18)), extraParams: { from: alice } }); - const { troveId: bobTroveId, collateral: B_collateral, totalDebt: B_totalDebt } = - await openTrove({ ICR: toBN(dec(21, 17)), extraParams: { from: bob } }); + const { troveId: aliceTroveId, collateral: A_collateral, totalDebt: A_totalDebt } = await openTrove({ + ICR: toBN(dec(4, 18)), + extraParams: { from: alice }, + }); + const { troveId: bobTroveId, collateral: B_collateral, totalDebt: B_totalDebt } = await openTrove({ + ICR: toBN(dec(21, 17)), + extraParams: { from: bob }, + }); // --- TEST --- @@ -145,7 +149,7 @@ contract("TroveManager", async (accounts) => { assert.equal(activePool_RawEther_Before, A_collateral.add(B_collateral)); th.assertIsApproximatelyEqual( activePool_BoldDebt_Before, - A_totalDebt.add(B_totalDebt) + A_totalDebt.add(B_totalDebt), ); // price drops to 1ETH:100Bold, reducing Bob's ICR below MCR @@ -154,7 +158,7 @@ contract("TroveManager", async (accounts) => { // Confirm system is not in Recovery Mode assert.isFalse(await th.checkRecoveryMode(contracts)); - /* close Bob's Trove. Should liquidate his ether and Bold, + /* close Bob's Trove. Should liquidate his ether and Bold, leaving Alice’s ether and Bold debt in the ActivePool. */ await troveManager.liquidate(bobTroveId, { from: owner }); @@ -174,10 +178,14 @@ contract("TroveManager", async (accounts) => { it("liquidate(): increases DefaultPool ETH and Bold debt by correct amounts", async () => { // --- SETUP --- - const { troveId: aliceTroveId, collateral: A_collateral, totalDebt: A_totalDebt } = - await openTrove({ ICR: toBN(dec(4, 18)), extraParams: { from: alice } }); - const { troveId: bobTroveId, collateral: B_collateral, totalDebt: B_totalDebt } = - await openTrove({ ICR: toBN(dec(21, 17)), extraParams: { from: bob } }); + const { troveId: aliceTroveId, collateral: A_collateral, totalDebt: A_totalDebt } = await openTrove({ + ICR: toBN(dec(4, 18)), + extraParams: { from: alice }, + }); + const { troveId: bobTroveId, collateral: B_collateral, totalDebt: B_totalDebt } = await openTrove({ + ICR: toBN(dec(21, 17)), + extraParams: { from: bob }, + }); // --- TEST --- @@ -220,10 +228,14 @@ contract("TroveManager", async (accounts) => { it("liquidate(): removes the Trove's stake from the total stakes", async () => { // --- SETUP --- - const { troveId: aliceTroveId, collateral: A_collateral, totalDebt: A_totalDebt } = - await openTrove({ ICR: toBN(dec(4, 18)), extraParams: { from: alice } }); - const { troveId: bobTroveId, collateral: B_collateral, totalDebt: B_totalDebt } = - await openTrove({ ICR: toBN(dec(21, 17)), extraParams: { from: bob } }); + const { troveId: aliceTroveId, collateral: A_collateral, totalDebt: A_totalDebt } = await openTrove({ + ICR: toBN(dec(4, 18)), + extraParams: { from: alice }, + }); + const { troveId: bobTroveId, collateral: B_collateral, totalDebt: B_totalDebt } = await openTrove({ + ICR: toBN(dec(21, 17)), + extraParams: { from: bob }, + }); // --- TEST --- @@ -277,10 +289,10 @@ contract("TroveManager", async (accounts) => { const arrayLength_After = await troveManager.getTroveIdsCount(); assert.equal(arrayLength_After, 5); - /* After Carol is removed from array, the last element (Erin's address) should have been moved to fill + /* After Carol is removed from array, the last element (Erin's address) should have been moved to fill the empty slot left by Carol, and the array length decreased by one. The final TroveIds array should be: - - [W, A, B, E, D] + + [W, A, B, E, D] Check all remaining troves in the array are in the correct order */ const trove_0 = await troveManager.TroveIds(0); @@ -312,10 +324,14 @@ contract("TroveManager", async (accounts) => { it("liquidate(): updates the snapshots of total stakes and total collateral", async () => { // --- SETUP --- - const { troveId: aliceTroveId, collateral: A_collateral, totalDebt: A_totalDebt } = - await openTrove({ ICR: toBN(dec(4, 18)), extraParams: { from: alice } }); - const { troveId: bobTroveId, collateral: B_collateral, totalDebt: B_totalDebt } = - await openTrove({ ICR: toBN(dec(21, 17)), extraParams: { from: bob } }); + const { troveId: aliceTroveId, collateral: A_collateral, totalDebt: A_totalDebt } = await openTrove({ + ICR: toBN(dec(4, 18)), + extraParams: { from: alice }, + }); + const { troveId: bobTroveId, collateral: B_collateral, totalDebt: B_totalDebt } = await openTrove({ + ICR: toBN(dec(21, 17)), + extraParams: { from: bob }, + }); // --- TEST --- @@ -338,9 +354,9 @@ contract("TroveManager", async (accounts) => { // close Bob's Trove. His ether*0.995 and Bold should be added to the DefaultPool. await troveManager.liquidate(bobTroveId, { from: owner }); - /* check snapshots after. Total stakes should be equal to the remaining stake then the system: + /* check snapshots after. Total stakes should be equal to the remaining stake then the system: 10 ether, Alice's stake. - + Total collateral should be equal to Alice's collateral plus her pending ETH reward (Bob’s collaterale*0.995 ether), earned from the liquidation of Bob's Trove */ const totalStakesSnapshot_After = ( @@ -353,21 +369,24 @@ contract("TroveManager", async (accounts) => { assert.equal(totalStakesSnapshot_After, A_collateral); assert.equal( totalCollateralSnapshot_After, - A_collateral.add(th.applyLiquidationFee(B_collateral)) + A_collateral.add(th.applyLiquidationFee(B_collateral)), ); }); it("liquidate(): updates the L_ETH and L_boldDebt reward-per-unit-staked totals", async () => { // --- SETUP --- - const { troveId: aliceTroveId, collateral: A_collateral, totalDebt: A_totalDebt } = - await openTrove({ ICR: toBN(dec(8, 18)), extraParams: { from: alice } }); - const { troveId: bobTroveId, collateral: B_collateral, totalDebt: B_totalDebt } = - await openTrove({ ICR: toBN(dec(4, 18)), extraParams: { from: bob } }); - const { troveId: carolTroveId, collateral: C_collateral, totalDebt: C_totalDebt } = - await openTrove({ - ICR: toBN(dec(111, 16)), - extraParams: { from: carol }, - }); + const { troveId: aliceTroveId, collateral: A_collateral, totalDebt: A_totalDebt } = await openTrove({ + ICR: toBN(dec(8, 18)), + extraParams: { from: alice }, + }); + const { troveId: bobTroveId, collateral: B_collateral, totalDebt: B_totalDebt } = await openTrove({ + ICR: toBN(dec(4, 18)), + extraParams: { from: bob }, + }); + const { troveId: carolTroveId, collateral: C_collateral, totalDebt: C_totalDebt } = await openTrove({ + ICR: toBN(dec(111, 16)), + extraParams: { from: carol }, + }); // --- TEST --- @@ -391,15 +410,15 @@ contract("TroveManager", async (accounts) => { .mul(mv._1e18BN) .div(A_collateral.add(B_collateral)); const L_boldDebt_expected_1 = C_totalDebt.mul(mv._1e18BN).div( - A_collateral.add(B_collateral) + A_collateral.add(B_collateral), ); assert.isAtMost( th.getDifference(L_ETH_AfterCarolLiquidated, L_ETH_expected_1), - 100 + 100, ); assert.isAtMost( th.getDifference(L_boldDebt_AfterCarolLiquidated, L_boldDebt_expected_1), - 100 + 100, ); assert.isTrue(await sortedTroves.contains(bobTroveId)); @@ -423,13 +442,13 @@ contract("TroveManager", async (accounts) => { assert.isFalse(await sortedTroves.contains(bobTroveId)); /* Alice now has all the active stake. totalStakes in the system is now 10 ether. - + Bob's pending collateral reward and debt reward are applied to his Trove before his liquidation. - His total collateral*0.995 and debt are then added to the DefaultPool. - + His total collateral*0.995 and debt are then added to the DefaultPool. + The system rewards-per-unit-staked should now be: - + L_ETH = (0.995 / 20) + (10.4975*0.995 / 10) = 1.09425125 ETH L_boldDebt = (180 / 20) + (890 / 10) = 98 Bold */ const L_ETH_AfterBobLiquidated = await troveManager.L_ETH(); @@ -438,24 +457,24 @@ contract("TroveManager", async (accounts) => { const L_ETH_expected_2 = L_ETH_expected_1.add( th .applyLiquidationFee( - B_collateral.add(B_collateral.mul(L_ETH_expected_1).div(mv._1e18BN)) + B_collateral.add(B_collateral.mul(L_ETH_expected_1).div(mv._1e18BN)), ) .mul(mv._1e18BN) - .div(A_collateral) + .div(A_collateral), ); const L_boldDebt_expected_2 = L_boldDebt_expected_1.add( B_totalDebt.add(B_increasedTotalDebt) .add(B_collateral.mul(L_boldDebt_expected_1).div(mv._1e18BN)) .mul(mv._1e18BN) - .div(A_collateral) + .div(A_collateral), ); assert.isAtMost( th.getDifference(L_ETH_AfterBobLiquidated, L_ETH_expected_2), - 100 + 100, ); assert.isAtMost( th.getDifference(L_boldDebt_AfterBobLiquidated, L_boldDebt_expected_2), - 100 + 100, ); }); @@ -466,8 +485,10 @@ contract("TroveManager", async (accounts) => { }); // Alice creates a single trove with 0.7 ETH and a debt of 70 Bold, and provides 10 Bold to SP - const { troveId: aliceTroveId, collateral: A_collateral, totalDebt: A_totalDebt } = - await openTrove({ ICR: toBN(dec(2, 18)), extraParams: { from: alice } }); + const { troveId: aliceTroveId, collateral: A_collateral, totalDebt: A_totalDebt } = await openTrove({ + ICR: toBN(dec(2, 18)), + extraParams: { from: alice }, + }); // Alice proves 10 Bold to SP await stabilityPool.provideToSP(dec(10, 18), { from: alice }); @@ -575,7 +596,7 @@ contract("TroveManager", async (accounts) => { // Attempt to liquidate bob await assertRevert( troveManager.liquidate(bobTroveId), - "TroveManager: nothing to liquidate" + "TroveManager: nothing to liquidate", ); // Check bob active, check whale active @@ -769,8 +790,7 @@ contract("TroveManager", async (accounts) => { // Check TCR does not decrease with each liquidation const liquidationTx_1 = await troveManager.liquidate(defaulter_1_TroveId); - const [liquidatedDebt_1, liquidatedColl_1, gasComp_1] = - th.getEmittedLiquidationValues(liquidationTx_1); + const [liquidatedDebt_1, liquidatedColl_1, gasComp_1] = th.getEmittedLiquidationValues(liquidationTx_1); assert.isFalse(await sortedTroves.contains(defaulter_1_TroveId)); const TCR_1 = await th.getTCR(contracts); @@ -783,8 +803,7 @@ contract("TroveManager", async (accounts) => { assert.isTrue(expectedTCR_1.eq(TCR_1)); const liquidationTx_2 = await troveManager.liquidate(defaulter_2_TroveId); - const [liquidatedDebt_2, liquidatedColl_2, gasComp_2] = - th.getEmittedLiquidationValues(liquidationTx_2); + const [liquidatedDebt_2, liquidatedColl_2, gasComp_2] = th.getEmittedLiquidationValues(liquidationTx_2); assert.isFalse(await sortedTroves.contains(defaulter_2_TroveId)); const TCR_2 = await th.getTCR(contracts); @@ -798,8 +817,7 @@ contract("TroveManager", async (accounts) => { assert.isTrue(expectedTCR_2.eq(TCR_2)); const liquidationTx_3 = await troveManager.liquidate(defaulter_3_TroveId); - const [liquidatedDebt_3, liquidatedColl_3, gasComp_3] = - th.getEmittedLiquidationValues(liquidationTx_3); + const [liquidatedDebt_3, liquidatedColl_3, gasComp_3] = th.getEmittedLiquidationValues(liquidationTx_3); assert.isFalse(await sortedTroves.contains(defaulter_3_TroveId)); @@ -815,8 +833,7 @@ contract("TroveManager", async (accounts) => { assert.isTrue(expectedTCR_3.eq(TCR_3)); const liquidationTx_4 = await troveManager.liquidate(defaulter_4_TroveId); - const [liquidatedDebt_4, liquidatedColl_4, gasComp_4] = - th.getEmittedLiquidationValues(liquidationTx_4); + const [liquidatedDebt_4, liquidatedColl_4, gasComp_4] = th.getEmittedLiquidationValues(liquidationTx_4); assert.isFalse(await sortedTroves.contains(defaulter_4_TroveId)); const TCR_4 = await th.getTCR(contracts); @@ -849,14 +866,13 @@ contract("TroveManager", async (accounts) => { // Bob sends tokens to Dennis, who has no trove await boldToken.transfer(dennis, spDeposit, { from: bob }); - //Dennis provides Bold to SP + // Dennis provides Bold to SP await stabilityPool.provideToSP(spDeposit, { from: dennis }); // Carol gets liquidated await priceFeed.setPrice(dec(100, 18)); const liquidationTX_C = await troveManager.liquidate(carolTroveId); - const [liquidatedDebt, liquidatedColl, gasComp] = - th.getEmittedLiquidationValues(liquidationTX_C); + const [liquidatedDebt, liquidatedColl, gasComp] = th.getEmittedLiquidationValues(liquidationTX_C); assert.isFalse(await sortedTroves.contains(carolTroveId)); // Check Dennis' SP deposit has absorbed Carol's debt, and he has received her liquidated ETH @@ -868,11 +884,11 @@ contract("TroveManager", async (accounts) => { ).toString(); assert.isAtMost( th.getDifference(dennis_Deposit_Before, spDeposit.sub(liquidatedDebt)), - 1000000 + 1000000, ); assert.isAtMost( th.getDifference(dennis_ETHGain_Before, liquidatedColl), - 1000 + 1000, ); // Confirm system is not in Recovery Mode @@ -912,14 +928,13 @@ contract("TroveManager", async (accounts) => { extraParams: { from: carol }, }); - //Bob provides Bold to SP + // Bob provides Bold to SP await stabilityPool.provideToSP(spDeposit, { from: bob }); // Carol gets liquidated await priceFeed.setPrice(dec(100, 18)); const liquidationTX_C = await troveManager.liquidate(carolTroveId); - const [liquidatedDebt, liquidatedColl, gasComp] = - th.getEmittedLiquidationValues(liquidationTX_C); + const [liquidatedDebt, liquidatedColl, gasComp] = th.getEmittedLiquidationValues(liquidationTX_C); assert.isFalse(await sortedTroves.contains(carolTroveId)); // price bounces back - Bob's trove is >110% ICR again @@ -936,7 +951,7 @@ contract("TroveManager", async (accounts) => { ).toString(); assert.isAtMost( th.getDifference(bob_Deposit_Before, spDeposit.sub(liquidatedDebt)), - 1000000 + 1000000, ); assert.isAtMost(th.getDifference(bob_ETHGain_Before, liquidatedColl), 1000); @@ -946,7 +961,7 @@ contract("TroveManager", async (accounts) => { // Attempt to liquidate Bob await assertRevert( troveManager.liquidate(bobTroveId), - "TroveManager: nothing to liquidate" + "TroveManager: nothing to liquidate", ); // Confirm Bob's trove is still active @@ -983,7 +998,7 @@ contract("TroveManager", async (accounts) => { extraParams: { from: carol }, }); - //Bob provides Bold to SP + // Bob provides Bold to SP await stabilityPool.provideToSP(B_spDeposit, { from: bob }); // Carol gets liquidated @@ -992,19 +1007,19 @@ contract("TroveManager", async (accounts) => { // Check Bob' SP deposit has absorbed Carol's debt, and he has received her liquidated ETH const bob_Deposit_Before = await stabilityPool.getCompoundedBoldDeposit( - bob + bob, ); const bob_ETHGain_Before = await stabilityPool.getDepositorETHGain(bob); assert.isAtMost( th.getDifference(bob_Deposit_Before, B_spDeposit.sub(C_debt)), - 1000000 + 1000000, ); assert.isAtMost( th.getDifference( bob_ETHGain_Before, - th.applyLiquidationFee(C_collateral) + th.applyLiquidationFee(C_collateral), ), - 1000 + 1000, ); // Alice provides Bold to SP @@ -1040,16 +1055,16 @@ contract("TroveManager", async (accounts) => { assert.isAtMost( th.getDifference( alice_Deposit_After, - A_spDeposit.sub(B_debt.mul(A_spDeposit).div(totalDeposits)) + A_spDeposit.sub(B_debt.mul(A_spDeposit).div(totalDeposits)), ), - 2000000 // TODO: Unclear why the error margin on these two asserts increased. Rewrite test in Solidity + 2000000, // TODO: Unclear why the error margin on these two asserts increased. Rewrite test in Solidity ); assert.isAtMost( th.getDifference( alice_ETHGain_After, - th.applyLiquidationFee(B_collateral).mul(A_spDeposit).div(totalDeposits) + th.applyLiquidationFee(B_collateral).mul(A_spDeposit).div(totalDeposits), ), - 2000000 // // TODO: Unclear why the error margin on these two asserts increased. Rewrite test in Solidity + 2000000, // // TODO: Unclear why the error margin on these two asserts increased. Rewrite test in Solidity ); const bob_Deposit_After = await stabilityPool.getCompoundedBoldDeposit(bob); @@ -1059,10 +1074,10 @@ contract("TroveManager", async (accounts) => { th.getDifference( bob_Deposit_After, bob_Deposit_Before.sub( - B_debt.mul(bob_Deposit_Before).div(totalDeposits) - ) + B_debt.mul(bob_Deposit_Before).div(totalDeposits), + ), ), - 1000000 + 1000000, ); assert.isAtMost( th.getDifference( @@ -1071,10 +1086,10 @@ contract("TroveManager", async (accounts) => { th .applyLiquidationFee(B_collateral) .mul(bob_Deposit_Before) - .div(totalDeposits) - ) + .div(totalDeposits), + ), ), - 1000000 + 1000000, ); }); @@ -1163,7 +1178,7 @@ contract("TroveManager", async (accounts) => { const bob_ICR_Before = await troveManager.getCurrentICR(bobTroveId, price); const carol_ICR_Before = await troveManager.getCurrentICR(carolTroveId, price); - /* Before liquidation: + /* Before liquidation: Alice ICR: = (2 * 100 / 50) = 400% Bob ICR: (1 * 100 / 90.5) = 110.5% Carol ICR: (1 * 100 / 100 ) = 100% @@ -1188,7 +1203,7 @@ contract("TroveManager", async (accounts) => { const bob_ICR_After = await troveManager.getCurrentICR(bobTroveId, price); const carol_ICR_After = await troveManager.getCurrentICR(carolTroveId, price); - /* After liquidation: + /* After liquidation: Alice ICR: (10.15 * 100 / 60) = 183.33% Bob ICR:(1.075 * 100 / 98) = 109.69% @@ -1200,7 +1215,7 @@ contract("TroveManager", async (accounts) => { assert.isTrue(bob_ICR_After.lte(mv._MCR)); assert.isTrue(carol_ICR_After.lte(mv._MCR)); - /* Though Bob's true ICR (including pending rewards) is below the MCR, + /* Though Bob's true ICR (including pending rewards) is below the MCR, check that Bob's raw coll and debt has not changed, and that his "raw" ICR is above the MCR */ const bob_Coll = (await troveManager.Troves(bobTroveId))[1]; const bob_Debt = (await troveManager.Troves(bobTroveId))[0]; @@ -1215,12 +1230,12 @@ contract("TroveManager", async (accounts) => { // Liquidate Alice, Bob, Carol await assertRevert( troveManager.liquidate(aliceTroveId), - "TroveManager: nothing to liquidate" + "TroveManager: nothing to liquidate", ); await troveManager.liquidate(bobTroveId); await troveManager.liquidate(carolTroveId); - /* Check Alice stays active, Carol gets liquidated, and Bob gets liquidated + /* Check Alice stays active, Carol gets liquidated, and Bob gets liquidated (because his pending rewards bring his ICR < MCR) */ assert.isTrue(await sortedTroves.contains(aliceTroveId)); assert.isFalse(await sortedTroves.contains(bobTroveId)); @@ -1251,7 +1266,7 @@ contract("TroveManager", async (accounts) => { const bob_ICR_Before = await troveManager.getCurrentICR(bobTroveId, price); const carol_ICR_Before = await troveManager.getCurrentICR(carolTroveId, price); - /* Before liquidation: + /* Before liquidation: Alice ICR: = (2 * 100 / 100) = 200% Bob ICR: (1 * 100 / 90.5) = 110.5% Carol ICR: (1 * 100 / 100 ) = 100% @@ -1268,7 +1283,7 @@ contract("TroveManager", async (accounts) => { const bob_ICR_After = await troveManager.getCurrentICR(bobTroveId, price); const carol_ICR_After = await troveManager.getCurrentICR(carolTroveId, price); - /* After liquidation: + /* After liquidation: Alice ICR: (1.0995 * 100 / 60) = 183.25% Bob ICR:(1.0995 * 100 / 100.5) = 109.40% @@ -1296,7 +1311,7 @@ contract("TroveManager", async (accounts) => { // Confirm system is not in Recovery Mode assert.isFalse(await th.checkRecoveryMode(contracts)); - //liquidate A, B, C + // liquidate A, B, C await troveManager.batchLiquidateTroves([aliceTroveId, bobTroveId, carolTroveId]); // Check A stays active, B and C get liquidated @@ -1350,8 +1365,16 @@ contract("TroveManager", async (accounts) => { // Confirm system is not in Recovery Mode assert.isFalse(await th.checkRecoveryMode(contracts)); - //Liquidate sequence - await troveManager.batchLiquidateTroves([aliceTroveId, bobTroveId, carolTroveId, dennisTroveId, erinTroveId, flynTroveId, whaleTroveId]); + // Liquidate sequence + await troveManager.batchLiquidateTroves([ + aliceTroveId, + bobTroveId, + carolTroveId, + dennisTroveId, + erinTroveId, + flynTroveId, + whaleTroveId, + ]); // check list size reduced to 4 assert.equal((await sortedTroves.getSize()).toString(), "4"); @@ -1390,7 +1413,7 @@ contract("TroveManager", async (accounts) => { // Confirm system is not in Recovery Mode assert.isFalse(await th.checkRecoveryMode(contracts)); - //Liquidate sequence + // Liquidate sequence await troveManager.batchLiquidateTroves([dennisTroveId, erinTroveId, flynTroveId, whaleTroveId]); // check list size reduced to 1 @@ -1407,7 +1430,7 @@ contract("TroveManager", async (accounts) => { // Check token balances of users whose troves were liquidated, have not changed assert.equal( (await boldToken.balanceOf(dennis)).toString(), - D_balanceBefore + D_balanceBefore, ); assert.equal((await boldToken.balanceOf(erin)).toString(), E_balanceBefore); assert.equal((await boldToken.balanceOf(flyn)).toString(), F_balanceBefore); @@ -1461,14 +1484,24 @@ contract("TroveManager", async (accounts) => { // Check pool has 500 Bold assert.equal( (await stabilityPool.getTotalBoldDeposits()).toString(), - dec(500, 18) + dec(500, 18), ); // Confirm system is not in Recovery Mode assert.isFalse(await th.checkRecoveryMode(contracts)); // Liquidate troves - await troveManager.batchLiquidateTroves([aliceTroveId, bobTroveId, carolTroveId, dennisTroveId, defaulter_1_TroveId, defaulter_2_TroveId, defaulter_3_TroveId, defaulter_4_TroveId, whaleTroveId]); + await troveManager.batchLiquidateTroves([ + aliceTroveId, + bobTroveId, + carolTroveId, + dennisTroveId, + defaulter_1_TroveId, + defaulter_2_TroveId, + defaulter_3_TroveId, + defaulter_4_TroveId, + whaleTroveId, + ]); // Check pool has been emptied by the liquidations assert.equal((await stabilityPool.getTotalBoldDeposits()).toString(), "0"); @@ -1555,7 +1588,7 @@ contract("TroveManager", async (accounts) => { const TCR_Before = await th.getTCR(contracts); assert.isAtMost( th.getDifference(TCR_Before, totalColl.mul(price).div(totalDebt)), - 1000 + 1000, ); // Check pool is empty before liquidation @@ -1565,7 +1598,17 @@ contract("TroveManager", async (accounts) => { assert.isFalse(await th.checkRecoveryMode(contracts)); // Liquidate - await troveManager.batchLiquidateTroves([aliceTroveId, bobTroveId, carolTroveId, dennisTroveId, defaulter_1_TroveId, defaulter_2_TroveId, defaulter_3_TroveId, defaulter_4_TroveId, whaleTroveId]); + await troveManager.batchLiquidateTroves([ + aliceTroveId, + bobTroveId, + carolTroveId, + dennisTroveId, + defaulter_1_TroveId, + defaulter_2_TroveId, + defaulter_3_TroveId, + defaulter_4_TroveId, + whaleTroveId, + ]); // Check all defaulters have been liquidated assert.isFalse(await sortedTroves.contains(defaulter_1_TroveId)); @@ -1587,7 +1630,7 @@ contract("TroveManager", async (accounts) => { .mul(price) .div(totalDebt), ), - 1000 + 1000, ); assert.isTrue(TCR_Before.gte(TCR_After)); assert.isTrue(TCR_After.gte(TCR_Before.mul(toBN(995)).div(toBN(1000)))); @@ -1638,7 +1681,7 @@ contract("TroveManager", async (accounts) => { const totalDeposits = whaleDeposit.add(A_deposit).add(B_deposit); assert.equal( (await stabilityPool.getTotalBoldDeposits()).toString(), - totalDeposits + totalDeposits, ); // Confirm system is not in Recovery Mode @@ -1663,7 +1706,7 @@ contract("TroveManager", async (accounts) => { Total Bold in Pool: 800 Bold - Then, liquidation hits A,B,C: + Then, liquidation hits A,B,C: Total liquidated debt = 150 + 350 + 150 = 650 Bold Total liquidated ETH = 1.1 + 3.1 + 1.1 = 5.3 ETH @@ -1685,10 +1728,10 @@ contract("TroveManager", async (accounts) => { // Check remaining Bold Deposits and ETH gain, for whale and depositors whose troves were liquidated const whale_Deposit_After = await stabilityPool.getCompoundedBoldDeposit( - whale + whale, ); const alice_Deposit_After = await stabilityPool.getCompoundedBoldDeposit( - alice + alice, ); const bob_Deposit_After = await stabilityPool.getCompoundedBoldDeposit(bob); @@ -1699,23 +1742,23 @@ contract("TroveManager", async (accounts) => { assert.isAtMost( th.getDifference( whale_Deposit_After, - whaleDeposit.sub(liquidatedDebt.mul(whaleDeposit).div(totalDeposits)) + whaleDeposit.sub(liquidatedDebt.mul(whaleDeposit).div(totalDeposits)), ), - 100000 + 100000, ); assert.isAtMost( th.getDifference( alice_Deposit_After, - A_deposit.sub(liquidatedDebt.mul(A_deposit).div(totalDeposits)) + A_deposit.sub(liquidatedDebt.mul(A_deposit).div(totalDeposits)), ), - 100000 + 100000, ); assert.isAtMost( th.getDifference( bob_Deposit_After, - B_deposit.sub(liquidatedDebt.mul(B_deposit).div(totalDeposits)) + B_deposit.sub(liquidatedDebt.mul(B_deposit).div(totalDeposits)), ), - 100000 + 100000, ); assert.isAtMost( @@ -1724,23 +1767,23 @@ contract("TroveManager", async (accounts) => { th .applyLiquidationFee(liquidatedColl) .mul(whaleDeposit) - .div(totalDeposits) + .div(totalDeposits), ), - 100000 + 100000, ); assert.isAtMost( th.getDifference( alice_ETHGain, - th.applyLiquidationFee(liquidatedColl).mul(A_deposit).div(totalDeposits) + th.applyLiquidationFee(liquidatedColl).mul(A_deposit).div(totalDeposits), ), - 100000 + 100000, ); assert.isAtMost( th.getDifference( bob_ETHGain, - th.applyLiquidationFee(liquidatedColl).mul(B_deposit).div(totalDeposits) + th.applyLiquidationFee(liquidatedColl).mul(B_deposit).div(totalDeposits), ), - 100000 + 100000, ); // Check total remaining deposits and ETH gain in Stability Pool @@ -1751,11 +1794,11 @@ contract("TroveManager", async (accounts) => { assert.isAtMost( th.getDifference(total_BoldinSP, totalDeposits.sub(liquidatedDebt)), - 1000 + 1000, ); assert.isAtMost( th.getDifference(total_ETHinSP, th.applyLiquidationFee(liquidatedColl)), - 1000 + 1000, ); }); @@ -1822,11 +1865,11 @@ contract("TroveManager", async (accounts) => { const defaultPoolBoldDebt = await defaultPool.getBoldDebt(); assert.isTrue(pendingETH_C.lte(defaultPoolETH)); assert.isTrue(pendingBoldDebt_C.lte(defaultPoolBoldDebt)); - //Check only difference is dust + // Check only difference is dust assert.isAtMost(th.getDifference(pendingETH_C, defaultPoolETH), 1000); assert.isAtMost( th.getDifference(pendingBoldDebt_C, defaultPoolBoldDebt), - 1000 + 1000, ); // Confirm system is still in Recovery Mode @@ -1884,13 +1927,13 @@ contract("TroveManager", async (accounts) => { // Confirm D-E are ICR > 110% assert.isTrue( - (await troveManager.getCurrentICR(dennisTroveId, price)).gte(mv._MCR) + (await troveManager.getCurrentICR(dennisTroveId, price)).gte(mv._MCR), ); assert.isTrue((await troveManager.getCurrentICR(erinTroveId, price)).gte(mv._MCR)); // Confirm Whale is ICR >= 110% assert.isTrue( - (await troveManager.getCurrentICR(whale, price)).gte(mv._MCR) + (await troveManager.getCurrentICR(whale, price)).gte(mv._MCR), ); const liquidationArray = [aliceTroveId, bobTroveId, carolTroveId, dennisTroveId, erinTroveId]; @@ -1950,7 +1993,7 @@ contract("TroveManager", async (accounts) => { assert.isTrue((await troveManager.getCurrentICR(bobTroveId, price)).lt(mv._MCR)); assert.isTrue((await troveManager.getCurrentICR(carolTroveId, price)).lt(mv._MCR)); assert.isTrue( - (await troveManager.getCurrentICR(dennisTroveId, price)).lt(mv._MCR) + (await troveManager.getCurrentICR(dennisTroveId, price)).lt(mv._MCR), ); assert.isTrue((await troveManager.getCurrentICR(erinTroveId, price)).lt(mv._MCR)); @@ -2016,13 +2059,13 @@ contract("TroveManager", async (accounts) => { // Confirm D-E are ICR >= 110% assert.isTrue( - (await troveManager.getCurrentICR(dennisTroveId, price)).gte(mv._MCR) + (await troveManager.getCurrentICR(dennisTroveId, price)).gte(mv._MCR), ); assert.isTrue((await troveManager.getCurrentICR(erinTroveId, price)).gte(mv._MCR)); // Confirm Whale is ICR > 110% assert.isTrue( - (await troveManager.getCurrentICR(whale, price)).gte(mv._MCR) + (await troveManager.getCurrentICR(whale, price)).gte(mv._MCR), ); const liquidationArray = [aliceTroveId, bobTroveId, carolTroveId, dennisTroveId, erinTroveId]; @@ -2079,7 +2122,7 @@ contract("TroveManager", async (accounts) => { } catch (error) { assert.include( error.message, - "TroveManager: Calldata address array must not be empty" + "TroveManager: Calldata address array must not be empty", ); } }); @@ -2130,13 +2173,13 @@ contract("TroveManager", async (accounts) => { // Confirm D-E are ICR > 110% assert.isTrue( - (await troveManager.getCurrentICR(dennisTroveId, price)).gte(mv._MCR) + (await troveManager.getCurrentICR(dennisTroveId, price)).gte(mv._MCR), ); assert.isTrue((await troveManager.getCurrentICR(erinTroveId, price)).gte(mv._MCR)); // Confirm Whale is ICR >= 110% assert.isTrue( - (await troveManager.getCurrentICR(whale, price)).gte(mv._MCR) + (await troveManager.getCurrentICR(whale, price)).gte(mv._MCR), ); // Liquidate - trove C in between the ones to be liquidated! @@ -2161,7 +2204,7 @@ contract("TroveManager", async (accounts) => { // Check Stability pool has only been reduced by A-B th.assertIsApproximatelyEqual( (await stabilityPool.getTotalBoldDeposits()).toString(), - spDeposit.sub(A_debt).sub(B_debt) + spDeposit.sub(A_debt).sub(B_debt), ); // Confirm system is not in Recovery Mode @@ -2226,13 +2269,13 @@ contract("TroveManager", async (accounts) => { // Confirm D-E are ICR > 110% assert.isTrue( - (await troveManager.getCurrentICR(dennisTroveId, price)).gte(mv._MCR) + (await troveManager.getCurrentICR(dennisTroveId, price)).gte(mv._MCR), ); assert.isTrue((await troveManager.getCurrentICR(erinTroveId, price)).gte(mv._MCR)); // Confirm Whale is ICR >= 110% assert.isTrue( - (await troveManager.getCurrentICR(whale, price)).gte(mv._MCR) + (await troveManager.getCurrentICR(whale, price)).gte(mv._MCR), ); // Liquidate - trove C in between the ones to be liquidated! @@ -2255,7 +2298,7 @@ contract("TroveManager", async (accounts) => { // Check Stability pool has only been reduced by A-B th.assertIsApproximatelyEqual( (await stabilityPool.getTotalBoldDeposits()).toString(), - spDeposit.sub(A_debt).sub(B_debt) + spDeposit.sub(A_debt).sub(B_debt), ); // Confirm system is not in Recovery Mode @@ -2292,8 +2335,11 @@ contract("TroveManager", async (accounts) => { // --- TEST --- const redemptionAmount = C_debt.add(B_debt).add(partialRedemptionAmount); - const { firstRedemptionHint, partialRedemptionHintNICR } = - await hintHelpers.getRedemptionHints(redemptionAmount, price, 0); + const { firstRedemptionHint, partialRedemptionHintNICR } = await hintHelpers.getRedemptionHints( + redemptionAmount, + price, + 0, + ); assert.equal(firstRedemptionHint, carol); const expectedICR = A_coll.mul(price) @@ -2318,7 +2364,7 @@ contract("TroveManager", async (accounts) => { const { partialRedemptionHintNICR } = await hintHelpers.getRedemptionHints( "210" + _18_zeros, price, - 2 + 2, ); // limit _maxIterations to 2 assert.equal(partialRedemptionHintNICR, "0"); @@ -2343,7 +2389,7 @@ contract("TroveManager", async (accounts) => { }); const partialRedemptionAmount = toBN(2); const redemptionAmount = C_netDebt.add(B_netDebt).add( - partialRedemptionAmount + partialRedemptionAmount, ); // start Dennis with a high ICR await openTrove({ @@ -2362,17 +2408,19 @@ contract("TroveManager", async (accounts) => { // --- TEST --- // Find hints for redeeming 20 Bold - const { firstRedemptionHint, partialRedemptionHintNICR } = - await hintHelpers.getRedemptionHints(redemptionAmount, price, 0); + const { firstRedemptionHint, partialRedemptionHintNICR } = await hintHelpers.getRedemptionHints( + redemptionAmount, + price, + 0, + ); // We don't need to use getApproxHint for this test, since it's not the subject of this // test case, and the list is very small, so the correct position is quickly found - const { 0: upperPartialRedemptionHint, 1: lowerPartialRedemptionHint } = - await sortedTroves.findInsertPosition( - partialRedemptionHintNICR, - dennis, - dennis - ); + const { 0: upperPartialRedemptionHint, 1: lowerPartialRedemptionHint } = await sortedTroves.findInsertPosition( + partialRedemptionHintNICR, + dennis, + dennis, + ); // skip bootstrapping phase await time.increase(timeValues.SECONDS_IN_ONE_WEEK * 2); @@ -2390,7 +2438,7 @@ contract("TroveManager", async (accounts) => { { from: dennis, gasPrice: GAS_PRICE, - } + }, ); const ETHFee = th.getEmittedRedemptionValues(redemptionTx)[3]; @@ -2408,7 +2456,7 @@ contract("TroveManager", async (accounts) => { It leaves her with (3) Bold debt + 50 for gas compensation. */ th.assertIsApproximatelyEqual( alice_debt_After, - A_totalDebt.sub(partialRedemptionAmount) + A_totalDebt.sub(partialRedemptionAmount), ); assert.equal(bob_debt_After, "0"); assert.equal(carol_debt_After, "0"); @@ -2417,7 +2465,7 @@ contract("TroveManager", async (accounts) => { const receivedETH = dennis_ETHBalance_After.sub(dennis_ETHBalance_Before); const expectedTotalETHDrawn = redemptionAmount.div(toBN(200)); // convert redemptionAmount Bold to ETH, at ETH:USD price 200 - const expectedReceivedETH = expectedTotalETHDrawn .sub(toBN(ETHFee)); + const expectedReceivedETH = expectedTotalETHDrawn.sub(toBN(ETHFee)); // console.log("*********************************************************************************") // console.log("ETHFee: " + ETHFee) @@ -2435,7 +2483,7 @@ contract("TroveManager", async (accounts) => { ).toString(); assert.equal( dennis_BoldBalance_After, - dennis_BoldBalance_Before.sub(redemptionAmount) + dennis_BoldBalance_Before.sub(redemptionAmount), ); }); @@ -2458,7 +2506,7 @@ contract("TroveManager", async (accounts) => { }); const partialRedemptionAmount = toBN(2); const redemptionAmount = C_netDebt.add(B_netDebt).add( - partialRedemptionAmount + partialRedemptionAmount, ); // start Dennis with a high ICR await openTrove({ @@ -2477,17 +2525,19 @@ contract("TroveManager", async (accounts) => { // --- TEST --- // Find hints for redeeming 20 Bold - const { firstRedemptionHint, partialRedemptionHintNICR } = - await hintHelpers.getRedemptionHints(redemptionAmount, price, 0); + const { firstRedemptionHint, partialRedemptionHintNICR } = await hintHelpers.getRedemptionHints( + redemptionAmount, + price, + 0, + ); // We don't need to use getApproxHint for this test, since it's not the subject of this // test case, and the list is very small, so the correct position is quickly found - const { 0: upperPartialRedemptionHint, 1: lowerPartialRedemptionHint } = - await sortedTroves.findInsertPosition( - partialRedemptionHintNICR, - dennis, - dennis - ); + const { 0: upperPartialRedemptionHint, 1: lowerPartialRedemptionHint } = await sortedTroves.findInsertPosition( + partialRedemptionHintNICR, + dennis, + dennis, + ); // skip bootstrapping phase await time.increase(timeValues.SECONDS_IN_ONE_WEEK * 2); @@ -2505,7 +2555,7 @@ contract("TroveManager", async (accounts) => { { from: dennis, gasPrice: GAS_PRICE, - } + }, ); const ETHFee = th.getEmittedRedemptionValues(redemptionTx)[3]; @@ -2523,7 +2573,7 @@ contract("TroveManager", async (accounts) => { It leaves her with (3) Bold debt + 50 for gas compensation. */ th.assertIsApproximatelyEqual( alice_debt_After, - A_totalDebt.sub(partialRedemptionAmount) + A_totalDebt.sub(partialRedemptionAmount), ); assert.equal(bob_debt_After, "0"); assert.equal(carol_debt_After, "0"); @@ -2541,7 +2591,7 @@ contract("TroveManager", async (accounts) => { ).toString(); assert.equal( dennis_BoldBalance_After, - dennis_BoldBalance_Before.sub(redemptionAmount) + dennis_BoldBalance_Before.sub(redemptionAmount), ); }); @@ -2564,7 +2614,7 @@ contract("TroveManager", async (accounts) => { }); const partialRedemptionAmount = toBN(2); const redemptionAmount = C_netDebt.add(B_netDebt).add( - partialRedemptionAmount + partialRedemptionAmount, ); // start Dennis with a high ICR await openTrove({ @@ -2583,17 +2633,19 @@ contract("TroveManager", async (accounts) => { // --- TEST --- // Find hints for redeeming 20 Bold - const { firstRedemptionHint, partialRedemptionHintNICR } = - await hintHelpers.getRedemptionHints(redemptionAmount, price, 0); + const { firstRedemptionHint, partialRedemptionHintNICR } = await hintHelpers.getRedemptionHints( + redemptionAmount, + price, + 0, + ); // We don't need to use getApproxHint for this test, since it's not the subject of this // test case, and the list is very small, so the correct position is quickly found - const { 0: upperPartialRedemptionHint, 1: lowerPartialRedemptionHint } = - await sortedTroves.findInsertPosition( - partialRedemptionHintNICR, - dennis, - dennis - ); + const { 0: upperPartialRedemptionHint, 1: lowerPartialRedemptionHint } = await sortedTroves.findInsertPosition( + partialRedemptionHintNICR, + dennis, + dennis, + ); // skip bootstrapping phase await time.increase(timeValues.SECONDS_IN_ONE_WEEK * 2); @@ -2611,7 +2663,7 @@ contract("TroveManager", async (accounts) => { { from: dennis, gasPrice: GAS_PRICE, - } + }, ); const ETHFee = th.getEmittedRedemptionValues(redemptionTx)[3]; @@ -2629,7 +2681,7 @@ contract("TroveManager", async (accounts) => { It leaves her with (3) Bold debt + 50 for gas compensation. */ th.assertIsApproximatelyEqual( alice_debt_After, - A_totalDebt.sub(partialRedemptionAmount) + A_totalDebt.sub(partialRedemptionAmount), ); assert.equal(bob_debt_After, "0"); assert.equal(carol_debt_After, "0"); @@ -2647,7 +2699,7 @@ contract("TroveManager", async (accounts) => { ).toString(); assert.equal( dennis_BoldBalance_After, - dennis_BoldBalance_Before.sub(redemptionAmount) + dennis_BoldBalance_Before.sub(redemptionAmount), ); }); @@ -2670,7 +2722,7 @@ contract("TroveManager", async (accounts) => { }); const partialRedemptionAmount = toBN(2); const redemptionAmount = C_netDebt.add(B_netDebt).add( - partialRedemptionAmount + partialRedemptionAmount, ); // start Dennis with a high ICR await openTrove({ @@ -2694,17 +2746,19 @@ contract("TroveManager", async (accounts) => { // --- TEST --- // Find hints for redeeming 20 Bold - const { firstRedemptionHint, partialRedemptionHintNICR } = - await hintHelpers.getRedemptionHints(redemptionAmount, price, 0); + const { firstRedemptionHint, partialRedemptionHintNICR } = await hintHelpers.getRedemptionHints( + redemptionAmount, + price, + 0, + ); // We don't need to use getApproxHint for this test, since it's not the subject of this // test case, and the list is very small, so the correct position is quickly found - const { 0: upperPartialRedemptionHint, 1: lowerPartialRedemptionHint } = - await sortedTroves.findInsertPosition( - partialRedemptionHintNICR, - dennis, - dennis - ); + const { 0: upperPartialRedemptionHint, 1: lowerPartialRedemptionHint } = await sortedTroves.findInsertPosition( + partialRedemptionHintNICR, + dennis, + dennis, + ); // skip bootstrapping phase await time.increase(timeValues.SECONDS_IN_ONE_WEEK * 2); @@ -2722,7 +2776,7 @@ contract("TroveManager", async (accounts) => { { from: dennis, gasPrice: GAS_PRICE, - } + }, ); const ETHFee = th.getEmittedRedemptionValues(redemptionTx)[3]; @@ -2740,7 +2794,7 @@ contract("TroveManager", async (accounts) => { It leaves her with (3) Bold debt + 50 for gas compensation. */ th.assertIsApproximatelyEqual( alice_debt_After, - A_totalDebt.sub(partialRedemptionAmount) + A_totalDebt.sub(partialRedemptionAmount), ); assert.equal(bob_debt_After, "0"); assert.equal(carol_debt_After, "0"); @@ -2758,7 +2812,7 @@ contract("TroveManager", async (accounts) => { ).toString(); assert.equal( dennis_BoldBalance_After, - dennis_BoldBalance_Before.sub(redemptionAmount) + dennis_BoldBalance_Before.sub(redemptionAmount), ); }); @@ -2815,14 +2869,14 @@ contract("TroveManager", async (accounts) => { 0, 0, th._100pct, - { from: flyn } + { from: flyn }, ); // Check Flyn's redemption has reduced his balance from 100 to (100-60) = 40 Bold const flynBalance = await boldToken.balanceOf(flyn); th.assertIsApproximatelyEqual( flynBalance, - F_boldAmount.sub(redemptionAmount) + F_boldAmount.sub(redemptionAmount), ); // Check debt of Alice, Bob, Carol @@ -2900,14 +2954,14 @@ contract("TroveManager", async (accounts) => { 0, 2, th._100pct, - { from: flyn } + { from: flyn }, ); // Check Flyn's redemption has reduced his balance from 100 to (100-40) = 60 Bold const flynBalance = (await boldToken.balanceOf(flyn)).toString(); th.assertIsApproximatelyEqual( flynBalance, - F_boldAmount.sub(redemptionAmount) + F_boldAmount.sub(redemptionAmount), ); // Check debt of Alice, Bob, Carol @@ -2929,26 +2983,29 @@ contract("TroveManager", async (accounts) => { }); it.skip("redeemCollateral(): performs partial redemption if resultant debt is > minimum net debt", async () => { - const ATroveId = await th.openTroveWrapper(contracts, + const ATroveId = await th.openTroveWrapper( + contracts, th._100pct, await getOpenTroveBoldAmount(dec(10000, 18)), A, A, - { from: A, value: dec(1000, "ether") } + { from: A, value: dec(1000, "ether") }, ); - const BTroveId = await th.openTroveWrapper(contracts, + const BTroveId = await th.openTroveWrapper( + contracts, th._100pct, await getOpenTroveBoldAmount(dec(20000, 18)), B, B, - { from: B, value: dec(1000, "ether") } + { from: B, value: dec(1000, "ether") }, ); - const CTroveId = await th.openTroveWrapper(contracts, + const CTroveId = await th.openTroveWrapper( + contracts, th._100pct, await getOpenTroveBoldAmount(dec(30000, 18)), C, C, - { from: C, value: dec(1000, "ether") } + { from: C, value: dec(1000, "ether") }, ); // A and C send all their tokens to B @@ -2966,7 +3023,7 @@ contract("TroveManager", async (accounts) => { B, contracts, BoldRedemption, - th._100pct + th._100pct, ); // Check B, C closed and A remains active @@ -2980,26 +3037,29 @@ contract("TroveManager", async (accounts) => { }); it.skip("redeemCollateral(): doesn't perform partial redemption if resultant debt would be < minimum net debt", async () => { - const ATroveId = await th.openTroveWrapper(contracts, + const ATroveId = await th.openTroveWrapper( + contracts, th._100pct, await getOpenTroveBoldAmount(dec(6000, 18)), A, A, - { from: A, value: dec(1000, "ether") } + { from: A, value: dec(1000, "ether") }, ); - const BTroveId = await th.openTroveWrapper(contracts, + const BTroveId = await th.openTroveWrapper( + contracts, th._100pct, await getOpenTroveBoldAmount(dec(20000, 18)), B, B, - { from: B, value: dec(1000, "ether") } + { from: B, value: dec(1000, "ether") }, ); - const CTroveId = await th.openTroveWrapper(contracts, + const CTroveId = await th.openTroveWrapper( + contracts, th._100pct, await getOpenTroveBoldAmount(dec(30000, 18)), C, C, - { from: C, value: dec(1000, "ether") } + { from: C, value: dec(1000, "ether") }, ); // A and C send all their tokens to B @@ -3017,7 +3077,7 @@ contract("TroveManager", async (accounts) => { B, contracts, BoldRedemption, - th._100pct + th._100pct, ); // Check B, C closed and A remains active @@ -3052,7 +3112,7 @@ contract("TroveManager", async (accounts) => { const partialRedemptionAmount = toBN(2); const fullfilledRedemptionAmount = C_netDebt.add(B_netDebt); const redemptionAmount = fullfilledRedemptionAmount.add( - partialRedemptionAmount + partialRedemptionAmount, ); await openTrove({ @@ -3070,28 +3130,32 @@ contract("TroveManager", async (accounts) => { // --- TEST --- - const { firstRedemptionHint, partialRedemptionHintNICR } = - await hintHelpers.getRedemptionHints(redemptionAmount, price, 0); + const { firstRedemptionHint, partialRedemptionHintNICR } = await hintHelpers.getRedemptionHints( + redemptionAmount, + price, + 0, + ); - const { 0: upperPartialRedemptionHint, 1: lowerPartialRedemptionHint } = - await sortedTroves.findInsertPosition( - partialRedemptionHintNICR, - dennis, - dennis - ); + const { 0: upperPartialRedemptionHint, 1: lowerPartialRedemptionHint } = await sortedTroves.findInsertPosition( + partialRedemptionHintNICR, + dennis, + dennis, + ); const frontRunRedepmtion = toBN(dec(1, 18)); // Oops, another transaction gets in the way { - const { firstRedemptionHint, partialRedemptionHintNICR } = - await hintHelpers.getRedemptionHints(dec(1, 18), price, 0); + const { firstRedemptionHint, partialRedemptionHintNICR } = await hintHelpers.getRedemptionHints( + dec(1, 18), + price, + 0, + ); - const { 0: upperPartialRedemptionHint, 1: lowerPartialRedemptionHint } = - await sortedTroves.findInsertPosition( - partialRedemptionHintNICR, - dennis, - dennis - ); + const { 0: upperPartialRedemptionHint, 1: lowerPartialRedemptionHint } = await sortedTroves.findInsertPosition( + partialRedemptionHintNICR, + dennis, + dennis, + ); // skip bootstrapping phase await time.increase(timeValues.SECONDS_IN_ONE_WEEK * 2); @@ -3105,7 +3169,7 @@ contract("TroveManager", async (accounts) => { partialRedemptionHintNICR, 0, th._100pct, - { from: alice } + { from: alice }, ); } @@ -3121,7 +3185,7 @@ contract("TroveManager", async (accounts) => { { from: dennis, gasPrice: GAS_PRICE, - } + }, ); const ETHFee = th.getEmittedRedemptionValues(redemptionTx)[3]; @@ -3152,8 +3216,8 @@ contract("TroveManager", async (accounts) => { th.assertIsApproximatelyEqual( dennis_BoldBalance_After, dennis_BoldBalance_Before.sub( - fullfilledRedemptionAmount.sub(frontRunRedepmtion) - ) + fullfilledRedemptionAmount.sub(frontRunRedepmtion), + ), ); }); @@ -3195,7 +3259,7 @@ contract("TroveManager", async (accounts) => { { from: carol, gasPrice: GAS_PRICE, - } + }, ); const ETHFee = th.getEmittedRedemptionValues(redemptionTx)[3]; @@ -3221,12 +3285,11 @@ contract("TroveManager", async (accounts) => { ICR: toBN(dec(13, 18)), extraParams: { from: alice }, }); - const { troveId: bobTroveId, boldAmount: B_boldAmount, totalDebt: B_totalDebt } = - await openTrove({ - ICR: toBN(dec(133, 16)), - extraBoldAmount: A_debt, - extraParams: { from: bob }, - }); + const { troveId: bobTroveId, boldAmount: B_boldAmount, totalDebt: B_totalDebt } = await openTrove({ + ICR: toBN(dec(133, 16)), + extraBoldAmount: A_debt, + extraParams: { from: bob }, + }); await boldToken.transfer(carol, B_boldAmount, { from: bob }); @@ -3247,7 +3310,7 @@ contract("TroveManager", async (accounts) => { 0, 0, th._100pct, - { from: carol } + { from: carol }, ); // Alice's Trove was cleared of debt @@ -3316,7 +3379,7 @@ contract("TroveManager", async (accounts) => { 0, 0, th._100pct, - { from: dennis } + { from: dennis }, ); const { debt: alice_Debt_After } = await troveManager.Troves(aliceTroveId); @@ -3351,7 +3414,7 @@ contract("TroveManager", async (accounts) => { await assertRevert( th.redeemCollateral(carolTroveId, contracts, GAS_PRICE, dec(270, 18)), - "TroveManager: Cannot redeem when TCR < MCR" + "TroveManager: Cannot redeem when TCR < MCR", ); }); @@ -3383,11 +3446,11 @@ contract("TroveManager", async (accounts) => { 0, 0, th._100pct, - { from: erin } + { from: erin }, ); await assertRevert( redemptionTxPromise, - "TroveManager: Amount must be greater than zero" + "TroveManager: Amount must be greater than zero", ); }); @@ -3422,9 +3485,9 @@ contract("TroveManager", async (accounts) => { contracts, dec(10, 18), GAS_PRICE, - dec(2, 18) + dec(2, 18), ), - "Max fee percentage must be between 0.5% and 100%" + "Max fee percentage must be between 0.5% and 100%", ); await assertRevert( th.redeemCollateralAndGetTxObject( @@ -3432,9 +3495,9 @@ contract("TroveManager", async (accounts) => { contracts, dec(10, 18), GAS_PRICE, - "1000000000000000001" + "1000000000000000001", ), - "Max fee percentage must be between 0.5% and 100%" + "Max fee percentage must be between 0.5% and 100%", ); }); @@ -3469,9 +3532,9 @@ contract("TroveManager", async (accounts) => { contracts, GAS_PRICE, dec(10, 18), - 0 + 0, ), - "Max fee percentage must be between 0.5% and 100%" + "Max fee percentage must be between 0.5% and 100%", ); await assertRevert( th.redeemCollateralAndGetTxObject( @@ -3479,9 +3542,9 @@ contract("TroveManager", async (accounts) => { contracts, GAS_PRICE, dec(10, 18), - 1 + 1, ), - "Max fee percentage must be between 0.5% and 100%" + "Max fee percentage must be between 0.5% and 100%", ); await assertRevert( th.redeemCollateralAndGetTxObject( @@ -3489,9 +3552,9 @@ contract("TroveManager", async (accounts) => { contracts, GAS_PRICE, dec(10, 18), - "4999999999999999" + "4999999999999999", ), - "Max fee percentage must be between 0.5% and 100%" + "Max fee percentage must be between 0.5% and 100%", ); }); @@ -3532,9 +3595,9 @@ contract("TroveManager", async (accounts) => { A, contracts, attemptedBoldRedemption, - lessThan5pct + lessThan5pct, ), - "Fee exceeded provided maximum" + "Fee exceeded provided maximum", ); await troveManager.setBaseRate(0); // artificially zero the baseRate @@ -3545,9 +3608,9 @@ contract("TroveManager", async (accounts) => { A, contracts, attemptedBoldRedemption, - dec(1, 16) + dec(1, 16), ), - "Fee exceeded provided maximum" + "Fee exceeded provided maximum", ); await troveManager.setBaseRate(0); @@ -3558,9 +3621,9 @@ contract("TroveManager", async (accounts) => { A, contracts, attemptedBoldRedemption, - dec(3754, 13) + dec(3754, 13), ), - "Fee exceeded provided maximum" + "Fee exceeded provided maximum", ); await troveManager.setBaseRate(0); @@ -3571,9 +3634,9 @@ contract("TroveManager", async (accounts) => { A, contracts, attemptedBoldRedemption, - dec(5, 15) + dec(5, 15), ), - "Fee exceeded provided maximum" + "Fee exceeded provided maximum", ); }); @@ -3765,15 +3828,17 @@ contract("TroveManager", async (accounts) => { await time.increase(timeValues.SECONDS_IN_ONE_WEEK * 2); // Erin attempts to redeem 400 Bold - const { firstRedemptionHint, partialRedemptionHintNICR } = - await hintHelpers.getRedemptionHints(dec(400, 18), price, 0); + const { firstRedemptionHint, partialRedemptionHintNICR } = await hintHelpers.getRedemptionHints( + dec(400, 18), + price, + 0, + ); - const { 0: upperPartialRedemptionHint, 1: lowerPartialRedemptionHint } = - await sortedTroves.findInsertPosition( - partialRedemptionHintNICR, - erin, - erin - ); + const { 0: upperPartialRedemptionHint, 1: lowerPartialRedemptionHint } = await sortedTroves.findInsertPosition( + partialRedemptionHintNICR, + erin, + erin, + ); await troveManager.redeemCollateral( dec(400, 18), @@ -3783,14 +3848,14 @@ contract("TroveManager", async (accounts) => { partialRedemptionHintNICR, 0, th._100pct, - { from: erin } + { from: erin }, ); // Check activePool debt reduced by 400 Bold const activePool_debt_after = await activePool.getRecordedDebtSum(); assert.equal( activePool_debt_before.sub(activePool_debt_after), - dec(400, 18) + dec(400, 18), ); /* Check ActivePool coll reduced by $400 worth of Ether: at ETH:USD price of $200, this should be 2 ETH. @@ -3800,7 +3865,7 @@ contract("TroveManager", async (accounts) => { // console.log(`activePool_coll_after: ${activePool_coll_after}`) assert.equal( activePool_coll_after.toString(), - activePool_coll_before.sub(toBN(dec(2, 18))) + activePool_coll_before.sub(toBN(dec(2, 18))), ); // Check Erin's balance after @@ -3866,8 +3931,11 @@ contract("TroveManager", async (accounts) => { // Erin tries to redeem 1000 Bold try { - ({ firstRedemptionHint, partialRedemptionHintNICR } = - await hintHelpers.getRedemptionHints(dec(1000, 18), price, 0)); + ({ firstRedemptionHint, partialRedemptionHintNICR } = await hintHelpers.getRedemptionHints( + dec(1000, 18), + price, + 0, + )); const { 0: upperPartialRedemptionHint_1, @@ -3875,7 +3943,7 @@ contract("TroveManager", async (accounts) => { } = await sortedTroves.findInsertPosition( partialRedemptionHintNICR, erin, - erin + erin, ); const redemptionTx = await troveManager.redeemCollateral( @@ -3886,7 +3954,7 @@ contract("TroveManager", async (accounts) => { partialRedemptionHintNICR, 0, th._100pct, - { from: erin } + { from: erin }, ); assert.isFalse(redemptionTx.receipt.status); @@ -3894,18 +3962,17 @@ contract("TroveManager", async (accounts) => { assert.include(error.message, "revert"); assert.include( error.message, - "Requested redemption amount must be <= user's Bold token balance" + "Requested redemption amount must be <= user's Bold token balance", ); } // Erin tries to redeem 401 Bold try { - ({ firstRedemptionHint, partialRedemptionHintNICR } = - await hintHelpers.getRedemptionHints( - "401000000000000000000", - price, - 0 - )); + ({ firstRedemptionHint, partialRedemptionHintNICR } = await hintHelpers.getRedemptionHints( + "401000000000000000000", + price, + 0, + )); const { 0: upperPartialRedemptionHint_2, @@ -3913,7 +3980,7 @@ contract("TroveManager", async (accounts) => { } = await sortedTroves.findInsertPosition( partialRedemptionHintNICR, erin, - erin + erin, ); const redemptionTx = await troveManager.redeemCollateral( @@ -3924,25 +3991,24 @@ contract("TroveManager", async (accounts) => { partialRedemptionHintNICR, 0, th._100pct, - { from: erin } + { from: erin }, ); assert.isFalse(redemptionTx.receipt.status); } catch (error) { assert.include(error.message, "revert"); assert.include( error.message, - "Requested redemption amount must be <= user's Bold token balance" + "Requested redemption amount must be <= user's Bold token balance", ); } // Erin tries to redeem 239482309 Bold try { - ({ firstRedemptionHint, partialRedemptionHintNICR } = - await hintHelpers.getRedemptionHints( - "239482309000000000000000000", - price, - 0 - )); + ({ firstRedemptionHint, partialRedemptionHintNICR } = await hintHelpers.getRedemptionHints( + "239482309000000000000000000", + price, + 0, + )); const { 0: upperPartialRedemptionHint_3, @@ -3950,7 +4016,7 @@ contract("TroveManager", async (accounts) => { } = await sortedTroves.findInsertPosition( partialRedemptionHintNICR, erin, - erin + erin, ); const redemptionTx = await troveManager.redeemCollateral( @@ -3961,29 +4027,28 @@ contract("TroveManager", async (accounts) => { partialRedemptionHintNICR, 0, th._100pct, - { from: erin } + { from: erin }, ); assert.isFalse(redemptionTx.receipt.status); } catch (error) { assert.include(error.message, "revert"); assert.include( error.message, - "Requested redemption amount must be <= user's Bold token balance" + "Requested redemption amount must be <= user's Bold token balance", ); } // Erin tries to redeem 2^256 - 1 Bold const maxBytes32 = toBN( - "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff" + "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", ); try { - ({ firstRedemptionHint, partialRedemptionHintNICR } = - await hintHelpers.getRedemptionHints( - "239482309000000000000000000", - price, - 0 - )); + ({ firstRedemptionHint, partialRedemptionHintNICR } = await hintHelpers.getRedemptionHints( + "239482309000000000000000000", + price, + 0, + )); const { 0: upperPartialRedemptionHint_4, @@ -3991,7 +4056,7 @@ contract("TroveManager", async (accounts) => { } = await sortedTroves.findInsertPosition( partialRedemptionHintNICR, erin, - erin + erin, ); const redemptionTx = await troveManager.redeemCollateral( @@ -4002,14 +4067,14 @@ contract("TroveManager", async (accounts) => { partialRedemptionHintNICR, 0, th._100pct, - { from: erin } + { from: erin }, ); assert.isFalse(redemptionTx.receipt.status); } catch (error) { assert.include(error.message, "revert"); assert.include( error.message, - "Requested redemption amount must be <= user's Bold token balance" + "Requested redemption amount must be <= user's Bold token balance", ); } }); @@ -4063,15 +4128,13 @@ contract("TroveManager", async (accounts) => { let partialRedemptionHintNICR; // Erin redeems 120 Bold - ({ firstRedemptionHint, partialRedemptionHintNICR } = - await hintHelpers.getRedemptionHints(_120_Bold, price, 0)); + ({ firstRedemptionHint, partialRedemptionHintNICR } = await hintHelpers.getRedemptionHints(_120_Bold, price, 0)); - const { 0: upperPartialRedemptionHint_1, 1: lowerPartialRedemptionHint_1 } = - await sortedTroves.findInsertPosition( - partialRedemptionHintNICR, - erin, - erin - ); + const { 0: upperPartialRedemptionHint_1, 1: lowerPartialRedemptionHint_1 } = await sortedTroves.findInsertPosition( + partialRedemptionHintNICR, + erin, + erin, + ); // skip bootstrapping phase await time.increase(timeValues.SECONDS_IN_ONE_WEEK * 2); @@ -4084,31 +4147,29 @@ contract("TroveManager", async (accounts) => { partialRedemptionHintNICR, 0, th._100pct, - { from: erin } + { from: erin }, ); assert.isTrue(redemption_1.receipt.status); - /* 120 Bold redeemed. Expect $120 worth of ETH removed. At ETH:USD price of $200, + /* 120 Bold redeemed. Expect $120 worth of ETH removed. At ETH:USD price of $200, ETH removed = (120/200) = 0.6 ETH Total active ETH = 280 - 0.6 = 279.4 ETH */ const activeETH_1 = await activePool.getETHBalance(); assert.equal( activeETH_1.toString(), - activeETH_0.sub(toBN(_120_Bold).mul(mv._1e18BN).div(price)) + activeETH_0.sub(toBN(_120_Bold).mul(mv._1e18BN).div(price)), ); // Flyn redeems 373 Bold - ({ firstRedemptionHint, partialRedemptionHintNICR } = - await hintHelpers.getRedemptionHints(_373_Bold, price, 0)); + ({ firstRedemptionHint, partialRedemptionHintNICR } = await hintHelpers.getRedemptionHints(_373_Bold, price, 0)); - const { 0: upperPartialRedemptionHint_2, 1: lowerPartialRedemptionHint_2 } = - await sortedTroves.findInsertPosition( - partialRedemptionHintNICR, - flyn, - flyn - ); + const { 0: upperPartialRedemptionHint_2, 1: lowerPartialRedemptionHint_2 } = await sortedTroves.findInsertPosition( + partialRedemptionHintNICR, + flyn, + flyn, + ); const redemption_2 = await troveManager.redeemCollateral( _373_Bold, @@ -4118,30 +4179,28 @@ contract("TroveManager", async (accounts) => { partialRedemptionHintNICR, 0, th._100pct, - { from: flyn } + { from: flyn }, ); assert.isTrue(redemption_2.receipt.status); - /* 373 Bold redeemed. Expect $373 worth of ETH removed. At ETH:USD price of $200, + /* 373 Bold redeemed. Expect $373 worth of ETH removed. At ETH:USD price of $200, ETH removed = (373/200) = 1.865 ETH Total active ETH = 279.4 - 1.865 = 277.535 ETH */ const activeETH_2 = await activePool.getETHBalance(); assert.equal( activeETH_2.toString(), - activeETH_1.sub(toBN(_373_Bold).mul(mv._1e18BN).div(price)) + activeETH_1.sub(toBN(_373_Bold).mul(mv._1e18BN).div(price)), ); // Graham redeems 950 Bold - ({ firstRedemptionHint, partialRedemptionHintNICR } = - await hintHelpers.getRedemptionHints(_950_Bold, price, 0)); + ({ firstRedemptionHint, partialRedemptionHintNICR } = await hintHelpers.getRedemptionHints(_950_Bold, price, 0)); - const { 0: upperPartialRedemptionHint_3, 1: lowerPartialRedemptionHint_3 } = - await sortedTroves.findInsertPosition( - partialRedemptionHintNICR, - graham, - graham - ); + const { 0: upperPartialRedemptionHint_3, 1: lowerPartialRedemptionHint_3 } = await sortedTroves.findInsertPosition( + partialRedemptionHintNICR, + graham, + graham, + ); const redemption_3 = await troveManager.redeemCollateral( _950_Bold, @@ -4151,18 +4210,18 @@ contract("TroveManager", async (accounts) => { partialRedemptionHintNICR, 0, th._100pct, - { from: graham } + { from: graham }, ); assert.isTrue(redemption_3.receipt.status); - /* 950 Bold redeemed. Expect $950 worth of ETH removed. At ETH:USD price of $200, + /* 950 Bold redeemed. Expect $950 worth of ETH removed. At ETH:USD price of $200, ETH removed = (950/200) = 4.75 ETH Total active ETH = 277.535 - 4.75 = 272.785 ETH */ const activeETH_3 = (await activePool.getETHBalance()).toString(); assert.equal( activeETH_3.toString(), - activeETH_2.sub(toBN(_950_Bold).mul(mv._1e18BN).div(price)) + activeETH_2.sub(toBN(_950_Bold).mul(mv._1e18BN).div(price)), ); }); @@ -4176,15 +4235,17 @@ contract("TroveManager", async (accounts) => { const price = await priceFeed.getPrice(); - const { firstRedemptionHint, partialRedemptionHintNICR } = - await hintHelpers.getRedemptionHints(dec(100, 18), price, 0); + const { firstRedemptionHint, partialRedemptionHintNICR } = await hintHelpers.getRedemptionHints( + dec(100, 18), + price, + 0, + ); - const { 0: upperPartialRedemptionHint, 1: lowerPartialRedemptionHint } = - await sortedTroves.findInsertPosition( - partialRedemptionHintNICR, - bob, - bob - ); + const { 0: upperPartialRedemptionHint, 1: lowerPartialRedemptionHint } = await sortedTroves.findInsertPosition( + partialRedemptionHintNICR, + bob, + bob, + ); // Bob tries to redeem his illegally obtained Bold try { @@ -4196,12 +4257,12 @@ contract("TroveManager", async (accounts) => { partialRedemptionHintNICR, 0, th._100pct, - { from: bob } + { from: bob }, ); } catch (error) { assert.include( error.message, - "VM Exception while processing transaction" + "VM Exception while processing transaction", ); } @@ -4228,19 +4289,21 @@ contract("TroveManager", async (accounts) => { const totalDebt = C_totalDebt.add(D_totalDebt); th.assertIsApproximatelyEqual( (await activePool.getRecordedDebtSum()).toString(), - totalDebt + totalDebt, ); const price = await priceFeed.getPrice(); - const { firstRedemptionHint, partialRedemptionHintNICR } = - await hintHelpers.getRedemptionHints("101000000000000000000", price, 0); + const { firstRedemptionHint, partialRedemptionHintNICR } = await hintHelpers.getRedemptionHints( + "101000000000000000000", + price, + 0, + ); - const { 0: upperPartialRedemptionHint, 1: lowerPartialRedemptionHint } = - await sortedTroves.findInsertPosition( - partialRedemptionHintNICR, - bob, - bob - ); + const { 0: upperPartialRedemptionHint, 1: lowerPartialRedemptionHint } = await sortedTroves.findInsertPosition( + partialRedemptionHintNICR, + bob, + bob, + ); // skip bootstrapping phase await time.increase(timeValues.SECONDS_IN_ONE_WEEK * 2); @@ -4255,12 +4318,12 @@ contract("TroveManager", async (accounts) => { partialRedemptionHintNICR, 0, th._100pct, - { from: bob } + { from: bob }, ); } catch (error) { assert.include( error.message, - "VM Exception while processing transaction" + "VM Exception while processing transaction", ); } }); @@ -4308,7 +4371,7 @@ contract("TroveManager", async (accounts) => { A, contracts, redemptionAmount, - GAS_PRICE + GAS_PRICE, ); /* @@ -4324,14 +4387,14 @@ contract("TroveManager", async (accounts) => { th.assertIsApproximatelyEqual( A_balanceAfter.sub(A_balanceBefore), ETHDrawn, - 100000 + 100000, ); }); it.skip("redeemCollateral(): a full redemption (leaving trove with 0 debt), closes the trove", async () => { // time fast-forwards 1 year, and multisig stakes 1 LQTY await time.increase(timeValues.SECONDS_IN_ONE_YEAR); - + const { netDebt: W_netDebt } = await openTrove({ ICR: toBN(dec(20, 18)), extraBoldAmount: dec(10000, 18), @@ -4470,11 +4533,11 @@ contract("TroveManager", async (accounts) => { // D is not closed, so cannot open trove await assertRevert( - th.openTroveWrapper(contracts,th._100pct, 0, ZERO_ADDRESS, ZERO_ADDRESS, { + th.openTroveWrapper(contracts, th._100pct, 0, ZERO_ADDRESS, ZERO_ADDRESS, { from: D, value: dec(10, 18), }), - "BorrowerOps: Trove is active" + "BorrowerOps: Trove is active", ); return { @@ -4528,7 +4591,7 @@ contract("TroveManager", async (accounts) => { contracts, redemptionAmount, GAS_PRICE, - th._100pct + th._100pct, ); // Check A, B, C have been closed @@ -4541,18 +4604,14 @@ contract("TroveManager", async (accounts) => { const troveUpdatedEvents = th.getAllEventsByName( redemptionTx, - "TroveUpdated" + "TroveUpdated", ); // Get each trove's emitted debt and coll - const [A_emittedDebt, A_emittedColl] = - th.getDebtAndCollFromTroveUpdatedEvents(troveUpdatedEvents, A); - const [B_emittedDebt, B_emittedColl] = - th.getDebtAndCollFromTroveUpdatedEvents(troveUpdatedEvents, B); - const [C_emittedDebt, C_emittedColl] = - th.getDebtAndCollFromTroveUpdatedEvents(troveUpdatedEvents, C); - const [D_emittedDebt, D_emittedColl] = - th.getDebtAndCollFromTroveUpdatedEvents(troveUpdatedEvents, D); + const [A_emittedDebt, A_emittedColl] = th.getDebtAndCollFromTroveUpdatedEvents(troveUpdatedEvents, A); + const [B_emittedDebt, B_emittedColl] = th.getDebtAndCollFromTroveUpdatedEvents(troveUpdatedEvents, B); + const [C_emittedDebt, C_emittedColl] = th.getDebtAndCollFromTroveUpdatedEvents(troveUpdatedEvents, C); + const [D_emittedDebt, D_emittedColl] = th.getDebtAndCollFromTroveUpdatedEvents(troveUpdatedEvents, D); // Expect A, B, C to have 0 emitted debt and coll, since they were closed assert.equal(A_emittedDebt, "0"); @@ -4562,22 +4621,21 @@ contract("TroveManager", async (accounts) => { assert.equal(C_emittedDebt, "0"); assert.equal(C_emittedColl, "0"); - /* Expect D to have lost 15 debt and (at ETH price of 200) 15/200 = 0.075 ETH. + /* Expect D to have lost 15 debt and (at ETH price of 200) 15/200 = 0.075 ETH. So, expect remaining debt = (85 - 15) = 70, and remaining ETH = 1 - 15/200 = 0.925 remaining. */ const price = await priceFeed.getPrice(); th.assertIsApproximatelyEqual( D_emittedDebt, - D_totalDebt.sub(partialAmount) + D_totalDebt.sub(partialAmount), ); th.assertIsApproximatelyEqual( D_emittedColl, - D_coll.sub(partialAmount.mul(mv._1e18BN).div(price)) + D_coll.sub(partialAmount.mul(mv._1e18BN).div(price)), ); }); it.skip("redeemCollateral(): a redemption that closes a trove leaves the trove's ETH surplus (collateral - ETH drawn) available for the trove owner to claim", async () => { - const { A_netDebt, A_coll, B_netDebt, B_coll, C_netDebt, C_coll } = - await redeemCollateral3Full1Partial(); + const { A_netDebt, A_coll, B_netDebt, B_coll, C_netDebt, C_coll } = await redeemCollateral3Full1Partial(); const A_balanceBefore = toBN(await contracts.WETH.balanceOf(A)); const B_balanceBefore = toBN(await contracts.WETH.balanceOf(B)); @@ -4586,7 +4644,7 @@ contract("TroveManager", async (accounts) => { // CollSurplusPool endpoint cannot be called directly await assertRevert( collSurplusPool.claimColl(ATroveId), - "CollSurplusPool: Caller is not Borrower Operations" + "CollSurplusPool: Caller is not Borrower Operations", ); const A_balanceAfter = toBN(await contracts.WETH.balanceOf(A)); @@ -4597,15 +4655,15 @@ contract("TroveManager", async (accounts) => { th.assertIsApproximatelyEqual( A_balanceAfter, - A_balanceBefore.add(A_coll.sub(A_netDebt.mul(mv._1e18BN).div(price))) + A_balanceBefore.add(A_coll.sub(A_netDebt.mul(mv._1e18BN).div(price))), ); th.assertIsApproximatelyEqual( B_balanceAfter, - B_balanceBefore.add(B_coll.sub(B_netDebt.mul(mv._1e18BN).div(price))) + B_balanceBefore.add(B_coll.sub(B_netDebt.mul(mv._1e18BN).div(price))), ); th.assertIsApproximatelyEqual( C_balanceAfter, - C_balanceBefore.add(C_coll.sub(C_netDebt.mul(mv._1e18BN).div(price))) + C_balanceBefore.add(C_coll.sub(C_netDebt.mul(mv._1e18BN).div(price))), ); }); @@ -4658,15 +4716,15 @@ contract("TroveManager", async (accounts) => { th.assertIsApproximatelyEqual( A_balanceAfter, - A_balanceBefore.add(A_surplus) + A_balanceBefore.add(A_surplus), ); th.assertIsApproximatelyEqual( B_balanceAfter, - B_balanceBefore.add(B_surplus) + B_balanceBefore.add(B_surplus), ); th.assertIsApproximatelyEqual( C_balanceAfter, - C_balanceBefore.add(C_surplus) + C_balanceBefore.add(C_surplus), ); }); @@ -4708,8 +4766,7 @@ contract("TroveManager", async (accounts) => { )[1]; assert.equal(carolSnapshot_L_boldDebt, 0); - const carol_PendingBoldDebtReward = - await troveManager.getPendingBoldDebtReward(carolTroveId); + const carol_PendingBoldDebtReward = await troveManager.getPendingBoldDebtReward(carolTroveId); assert.equal(carol_PendingBoldDebtReward, 0); }); @@ -4750,7 +4807,7 @@ contract("TroveManager", async (accounts) => { assert.equal(carolSnapshot_L_ETH, 0); const carol_PendingETHReward = await troveManager.getPendingETHReward( - carol + carol, ); assert.equal(carol_PendingETHReward, 0); }); @@ -4813,17 +4870,16 @@ contract("TroveManager", async (accounts) => { const debt = 0; const ICR = web3.utils.toHex( - await troveManager.computeICR(coll, debt, price) + await troveManager.computeICR(coll, debt, price), ); - const maxBytes32 = - "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"; + const maxBytes32 = "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"; assert.equal(ICR, maxBytes32); }); // --- checkRecoveryMode --- - //TCR < 150% + // TCR < 150% it("checkRecoveryMode(): Returns true when TCR < 150%", async () => { await priceFeed.setPrice(dec(100, 18)); diff --git a/contracts/test/TroveManager_LiquidationRewardsTest.js b/contracts/test/TroveManager_LiquidationRewardsTest.js index 7e217e19..9a244be5 100644 --- a/contracts/test/TroveManager_LiquidationRewardsTest.js +++ b/contracts/test/TroveManager_LiquidationRewardsTest.js @@ -5,126 +5,123 @@ const TroveManagerTester = artifacts.require("TroveManagerTester"); const { dec, getDifference, toBN } = th; -contract( "TroveManager - Redistribution reward calculations", - async (accounts) => { - const fundedAccounts = accounts.slice(0, 20); - - const [ - owner, - alice, - bob, - carol, - dennis, - erin, - freddy, - greta, - harry, - ida, - A, - B, - C, - D, - E, - whale, - defaulter_1, - defaulter_2, - defaulter_3, - defaulter_4, - ] = fundedAccounts; - - let contracts - - let priceFeed - let boldToken - let sortedTroves - let troveManager - let activePool - let stabilityPool - let defaultPool - let borrowerOperations - - const getOpenTroveBoldAmount = async (totalDebt) => - th.getOpenTroveBoldAmount(contracts, totalDebt); - const getNetBorrowingAmount = async (debtWithFee) => - th.getNetBorrowingAmount(contracts, debtWithFee); - const openTrove = async (params) => th.openTrove(contracts, params); - - const deployFixture = createDeployAndFundFixture({ - accounts: fundedAccounts, - mocks: { - TroveManager: TroveManagerTester, - } - }); - - beforeEach(async () => { - const result = await deployFixture(); - - contracts = result.contracts - priceFeed = contracts.priceFeed - boldToken = contracts.boldToken - sortedTroves = contracts.sortedTroves - troveManager = contracts.troveManager - activePool = contracts.activePool - stabilityPool = contracts.stabilityPool - defaultPool = contracts.defaultPool - borrowerOperations = contracts.borrowerOperations - }); - - it("redistribution: A, B Open. B Liquidated. C, D Open. D Liquidated. Distributes correct rewards", async () => { - // A, B open trove - const { troveId: aliceTroveId, collateral: A_coll } = await openTrove({ - ICR: toBN(dec(400, 16)), - extraParams: { from: alice }, - }); - const { troveId: bobTroveId, collateral: B_coll } = await openTrove({ - ICR: toBN(dec(210, 16)), - extraParams: { from: bob }, - }); - - // Price drops to 100 $/E - await priceFeed.setPrice(dec(100, 18)); - - // Confirm not in Recovery Mode - assert.isFalse(await th.checkRecoveryMode(contracts)); - - // L1: B liquidated - const txB = await troveManager.liquidate(bobTroveId); - assert.isTrue(txB.receipt.status); - assert.isFalse(await sortedTroves.contains(bobTroveId)); - - // Price bounces back to 200 $/E - await priceFeed.setPrice(dec(200, 18)); - - // C, D open troves - const { troveId: carolTroveId, collateral: C_coll } = await openTrove({ - ICR: toBN(dec(400, 16)), - extraParams: { from: carol }, - }); - const { troveId: dennisTroveId, collateral: D_coll } = await openTrove({ - ICR: toBN(dec(210, 16)), - extraParams: { from: dennis }, - }); - - // Price drops to 100 $/E - await priceFeed.setPrice(dec(100, 18)); - - // Confirm not in Recovery Mode - assert.isFalse(await th.checkRecoveryMode(contracts)); - - // L2: D Liquidated - const txD = await troveManager.liquidate(dennisTroveId); - assert.isTrue(txB.receipt.status); - assert.isFalse(await sortedTroves.contains(dennisTroveId)); - - // Get entire coll of A and C - const alice_Coll = (await troveManager.Troves(aliceTroveId))[1] - .add(await troveManager.getPendingETHReward(aliceTroveId)) - .toString(); - const carol_Coll = (await troveManager.Troves(carolTroveId))[1] - .add(await troveManager.getPendingETHReward(carolTroveId)) - .toString(); - - /* Expected collateral: +contract("TroveManager - Redistribution reward calculations", async (accounts) => { + const fundedAccounts = accounts.slice(0, 20); + + const [ + owner, + alice, + bob, + carol, + dennis, + erin, + freddy, + greta, + harry, + ida, + A, + B, + C, + D, + E, + whale, + defaulter_1, + defaulter_2, + defaulter_3, + defaulter_4, + ] = fundedAccounts; + + let contracts; + + let priceFeed; + let boldToken; + let sortedTroves; + let troveManager; + let activePool; + let stabilityPool; + let defaultPool; + let borrowerOperations; + + const getOpenTroveBoldAmount = async (totalDebt) => th.getOpenTroveBoldAmount(contracts, totalDebt); + const getNetBorrowingAmount = async (debtWithFee) => th.getNetBorrowingAmount(contracts, debtWithFee); + const openTrove = async (params) => th.openTrove(contracts, params); + + const deployFixture = createDeployAndFundFixture({ + accounts: fundedAccounts, + mocks: { + TroveManager: TroveManagerTester, + }, + }); + + beforeEach(async () => { + const result = await deployFixture(); + + contracts = result.contracts; + priceFeed = contracts.priceFeed; + boldToken = contracts.boldToken; + sortedTroves = contracts.sortedTroves; + troveManager = contracts.troveManager; + activePool = contracts.activePool; + stabilityPool = contracts.stabilityPool; + defaultPool = contracts.defaultPool; + borrowerOperations = contracts.borrowerOperations; + }); + + it("redistribution: A, B Open. B Liquidated. C, D Open. D Liquidated. Distributes correct rewards", async () => { + // A, B open trove + const { troveId: aliceTroveId, collateral: A_coll } = await openTrove({ + ICR: toBN(dec(400, 16)), + extraParams: { from: alice }, + }); + const { troveId: bobTroveId, collateral: B_coll } = await openTrove({ + ICR: toBN(dec(210, 16)), + extraParams: { from: bob }, + }); + + // Price drops to 100 $/E + await priceFeed.setPrice(dec(100, 18)); + + // Confirm not in Recovery Mode + assert.isFalse(await th.checkRecoveryMode(contracts)); + + // L1: B liquidated + const txB = await troveManager.liquidate(bobTroveId); + assert.isTrue(txB.receipt.status); + assert.isFalse(await sortedTroves.contains(bobTroveId)); + + // Price bounces back to 200 $/E + await priceFeed.setPrice(dec(200, 18)); + + // C, D open troves + const { troveId: carolTroveId, collateral: C_coll } = await openTrove({ + ICR: toBN(dec(400, 16)), + extraParams: { from: carol }, + }); + const { troveId: dennisTroveId, collateral: D_coll } = await openTrove({ + ICR: toBN(dec(210, 16)), + extraParams: { from: dennis }, + }); + + // Price drops to 100 $/E + await priceFeed.setPrice(dec(100, 18)); + + // Confirm not in Recovery Mode + assert.isFalse(await th.checkRecoveryMode(contracts)); + + // L2: D Liquidated + const txD = await troveManager.liquidate(dennisTroveId); + assert.isTrue(txB.receipt.status); + assert.isFalse(await sortedTroves.contains(dennisTroveId)); + + // Get entire coll of A and C + const alice_Coll = (await troveManager.Troves(aliceTroveId))[1] + .add(await troveManager.getPendingETHReward(aliceTroveId)) + .toString(); + const carol_Coll = (await troveManager.Troves(carolTroveId))[1] + .add(await troveManager.getPendingETHReward(carolTroveId)) + .toString(); + + /* Expected collateral: A: Alice receives 0.995 ETH from L1, and ~3/5*0.995 ETH from L2. expect aliceColl = 2 + 0.995 + 2.995/4.995 * 0.995 = 3.5916 ETH @@ -133,116 +130,116 @@ contract( "TroveManager - Redistribution reward calculations", Total coll = 4 + 2 * 0.995 ETH */ - const A_collAfterL1 = A_coll.add(th.applyLiquidationFee(B_coll)); - assert.isAtMost( - th.getDifference( - alice_Coll, - A_collAfterL1.add( - A_collAfterL1.mul(th.applyLiquidationFee(D_coll)).div( - A_collAfterL1.add(C_coll) - ) - ) + const A_collAfterL1 = A_coll.add(th.applyLiquidationFee(B_coll)); + assert.isAtMost( + th.getDifference( + alice_Coll, + A_collAfterL1.add( + A_collAfterL1.mul(th.applyLiquidationFee(D_coll)).div( + A_collAfterL1.add(C_coll), + ), ), - 1000 - ); - assert.isAtMost( - th.getDifference( - carol_Coll, - C_coll.add( - C_coll.mul(th.applyLiquidationFee(D_coll)).div( - A_collAfterL1.add(C_coll) - ) - ) + ), + 1000, + ); + assert.isAtMost( + th.getDifference( + carol_Coll, + C_coll.add( + C_coll.mul(th.applyLiquidationFee(D_coll)).div( + A_collAfterL1.add(C_coll), + ), ), - 1000 - ); + ), + 1000, + ); + + const entireSystemColl = (await activePool.getETHBalance()) + .add(await defaultPool.getETHBalance()) + .toString(); + assert.equal( + entireSystemColl, + A_coll.add(C_coll).add(th.applyLiquidationFee(B_coll.add(D_coll))), + ); + + // check Bold gas compensation + assert.equal((await boldToken.balanceOf(owner)).toString(), dec(400, 18)); + }); + + it("redistribution: A, B, C Open. C Liquidated. D, E, F Open. F Liquidated. Distributes correct rewards", async () => { + // A, B C open troves + const { troveId: aliceTroveId, collateral: A_coll } = await openTrove({ + ICR: toBN(dec(400, 16)), + extraParams: { from: alice }, + }); + const { troveId: bobTroveId, collateral: B_coll } = await openTrove({ + ICR: toBN(dec(400, 16)), + extraParams: { from: bob }, + }); + const { troveId: carolTroveId, collateral: C_coll } = await openTrove({ + ICR: toBN(dec(210, 16)), + extraParams: { from: carol }, + }); - const entireSystemColl = (await activePool.getETHBalance()) - .add(await defaultPool.getETHBalance()) - .toString(); - assert.equal( - entireSystemColl, - A_coll.add(C_coll).add(th.applyLiquidationFee(B_coll.add(D_coll))) - ); + // Price drops to 100 $/E + await priceFeed.setPrice(dec(100, 18)); + + // Confirm not in Recovery Mode + assert.isFalse(await th.checkRecoveryMode(contracts)); - // check Bold gas compensation - assert.equal((await boldToken.balanceOf(owner)).toString(), dec(400, 18)); - }); - - it("redistribution: A, B, C Open. C Liquidated. D, E, F Open. F Liquidated. Distributes correct rewards", async () => { - // A, B C open troves - const { troveId: aliceTroveId, collateral: A_coll } = await openTrove({ - ICR: toBN(dec(400, 16)), - extraParams: { from: alice }, - }); - const { troveId: bobTroveId, collateral: B_coll } = await openTrove({ - ICR: toBN(dec(400, 16)), - extraParams: { from: bob }, - }); - const { troveId: carolTroveId, collateral: C_coll } = await openTrove({ - ICR: toBN(dec(210, 16)), - extraParams: { from: carol }, - }); - - // Price drops to 100 $/E - await priceFeed.setPrice(dec(100, 18)); - - // Confirm not in Recovery Mode - assert.isFalse(await th.checkRecoveryMode(contracts)); - - // L1: C liquidated - const txC = await troveManager.liquidate(carolTroveId); - assert.isTrue(txC.receipt.status); - assert.isFalse(await sortedTroves.contains(carolTroveId)); - - // Price bounces back to 200 $/E - await priceFeed.setPrice(dec(200, 18)); - - // D, E, F open troves - const { troveId: dennisTroveId, collateral: D_coll } = await openTrove({ - ICR: toBN(dec(400, 16)), - extraParams: { from: dennis }, - }); - const { troveId: erinTroveId, collateral: E_coll } = await openTrove({ - ICR: toBN(dec(400, 16)), - extraParams: { from: erin }, - }); - const { troveId: freddyTroveId, collateral: F_coll } = await openTrove({ - ICR: toBN(dec(210, 16)), - extraParams: { from: freddy }, - }); - - // Price drops to 100 $/E - await priceFeed.setPrice(dec(100, 18)); - - // Confirm not in Recovery Mode - assert.isFalse(await th.checkRecoveryMode(contracts)); - - // L2: F Liquidated - const txF = await troveManager.liquidate(freddyTroveId); - assert.isTrue(txF.receipt.status); - assert.isFalse(await sortedTroves.contains(freddyTroveId)); - - // Get entire coll of A, B, D and E - const alice_Coll = (await troveManager.Troves(aliceTroveId))[1] - .add(await troveManager.getPendingETHReward(aliceTroveId)) - .toString(); - const bob_Coll = (await troveManager.Troves(bobTroveId))[1] - .add(await troveManager.getPendingETHReward(bobTroveId)) - .toString(); - const dennis_Coll = (await troveManager.Troves(dennisTroveId))[1] - .add(await troveManager.getPendingETHReward(dennisTroveId)) - .toString(); - const erin_Coll = (await troveManager.Troves(erinTroveId))[1] - .add(await troveManager.getPendingETHReward(erinTroveId)) - .toString(); - - /* Expected collateral: + // L1: C liquidated + const txC = await troveManager.liquidate(carolTroveId); + assert.isTrue(txC.receipt.status); + assert.isFalse(await sortedTroves.contains(carolTroveId)); + + // Price bounces back to 200 $/E + await priceFeed.setPrice(dec(200, 18)); + + // D, E, F open troves + const { troveId: dennisTroveId, collateral: D_coll } = await openTrove({ + ICR: toBN(dec(400, 16)), + extraParams: { from: dennis }, + }); + const { troveId: erinTroveId, collateral: E_coll } = await openTrove({ + ICR: toBN(dec(400, 16)), + extraParams: { from: erin }, + }); + const { troveId: freddyTroveId, collateral: F_coll } = await openTrove({ + ICR: toBN(dec(210, 16)), + extraParams: { from: freddy }, + }); + + // Price drops to 100 $/E + await priceFeed.setPrice(dec(100, 18)); + + // Confirm not in Recovery Mode + assert.isFalse(await th.checkRecoveryMode(contracts)); + + // L2: F Liquidated + const txF = await troveManager.liquidate(freddyTroveId); + assert.isTrue(txF.receipt.status); + assert.isFalse(await sortedTroves.contains(freddyTroveId)); + + // Get entire coll of A, B, D and E + const alice_Coll = (await troveManager.Troves(aliceTroveId))[1] + .add(await troveManager.getPendingETHReward(aliceTroveId)) + .toString(); + const bob_Coll = (await troveManager.Troves(bobTroveId))[1] + .add(await troveManager.getPendingETHReward(bobTroveId)) + .toString(); + const dennis_Coll = (await troveManager.Troves(dennisTroveId))[1] + .add(await troveManager.getPendingETHReward(dennisTroveId)) + .toString(); + const erin_Coll = (await troveManager.Troves(erinTroveId))[1] + .add(await troveManager.getPendingETHReward(erinTroveId)) + .toString(); + + /* Expected collateral: A and B receives 1/2 ETH * 0.995 from L1. total Coll: 3 A, B, receive (2.4975)/8.995 * 0.995 ETH from L2. - + D, E receive 2/8.995 * 0.995 ETH from L2. expect A, B coll = 2 + 0.4975 + 0.2763 = ETH @@ -250,649 +247,643 @@ contract( "TroveManager - Redistribution reward calculations", Total coll = 8 (non-liquidated) + 2 * 0.995 (liquidated and redistributed) */ - const A_collAfterL1 = A_coll.add( - A_coll.mul(th.applyLiquidationFee(C_coll)).div(A_coll.add(B_coll)) - ); - const B_collAfterL1 = B_coll.add( - B_coll.mul(th.applyLiquidationFee(C_coll)).div(A_coll.add(B_coll)) - ); - const totalBeforeL2 = A_collAfterL1.add(B_collAfterL1) + const A_collAfterL1 = A_coll.add( + A_coll.mul(th.applyLiquidationFee(C_coll)).div(A_coll.add(B_coll)), + ); + const B_collAfterL1 = B_coll.add( + B_coll.mul(th.applyLiquidationFee(C_coll)).div(A_coll.add(B_coll)), + ); + const totalBeforeL2 = A_collAfterL1.add(B_collAfterL1) + .add(D_coll) + .add(E_coll); + const expected_A = A_collAfterL1.add( + A_collAfterL1.mul(th.applyLiquidationFee(F_coll)).div(totalBeforeL2), + ); + const expected_B = B_collAfterL1.add( + B_collAfterL1.mul(th.applyLiquidationFee(F_coll)).div(totalBeforeL2), + ); + const expected_D = D_coll.add( + D_coll.mul(th.applyLiquidationFee(F_coll)).div(totalBeforeL2), + ); + const expected_E = E_coll.add( + E_coll.mul(th.applyLiquidationFee(F_coll)).div(totalBeforeL2), + ); + assert.isAtMost(th.getDifference(alice_Coll, expected_A), 1000); + assert.isAtMost(th.getDifference(bob_Coll, expected_B), 1000); + assert.isAtMost(th.getDifference(dennis_Coll, expected_D), 1000); + assert.isAtMost(th.getDifference(erin_Coll, expected_E), 1000); + + const entireSystemColl = (await activePool.getETHBalance()) + .add(await defaultPool.getETHBalance()) + .toString(); + assert.equal( + entireSystemColl, + A_coll.add(B_coll) .add(D_coll) - .add(E_coll); - const expected_A = A_collAfterL1.add( - A_collAfterL1.mul(th.applyLiquidationFee(F_coll)).div(totalBeforeL2) - ); - const expected_B = B_collAfterL1.add( - B_collAfterL1.mul(th.applyLiquidationFee(F_coll)).div(totalBeforeL2) - ); - const expected_D = D_coll.add( - D_coll.mul(th.applyLiquidationFee(F_coll)).div(totalBeforeL2) - ); - const expected_E = E_coll.add( - E_coll.mul(th.applyLiquidationFee(F_coll)).div(totalBeforeL2) - ); - assert.isAtMost(th.getDifference(alice_Coll, expected_A), 1000); - assert.isAtMost(th.getDifference(bob_Coll, expected_B), 1000); - assert.isAtMost(th.getDifference(dennis_Coll, expected_D), 1000); - assert.isAtMost(th.getDifference(erin_Coll, expected_E), 1000); - - const entireSystemColl = (await activePool.getETHBalance()) - .add(await defaultPool.getETHBalance()) - .toString(); - assert.equal( - entireSystemColl, - A_coll.add(B_coll) - .add(D_coll) - .add(E_coll) - .add(th.applyLiquidationFee(C_coll.add(F_coll))) - ); + .add(E_coll) + .add(th.applyLiquidationFee(C_coll.add(F_coll))), + ); + + // check Bold gas compensation + assert.equal((await boldToken.balanceOf(owner)).toString(), dec(400, 18)); + }); + //// + + it("redistribution: Sequence of alternate opening/liquidation: final surviving trove has ETH from all previously liquidated troves", async () => { + // A, B open troves + const { troveId: aliceTroveId, collateral: A_coll } = await openTrove({ + ICR: toBN(dec(400, 16)), + extraParams: { from: alice }, + }); + const { troveId: bobTroveId, collateral: B_coll } = await openTrove({ + ICR: toBN(dec(400, 16)), + extraParams: { from: bob }, + }); + + // Price drops to 1 $/E + await priceFeed.setPrice(dec(1, 18)); + + // L1: A liquidated + const txA = await troveManager.liquidate(aliceTroveId); + assert.isTrue(txA.receipt.status); + assert.isFalse(await sortedTroves.contains(aliceTroveId)); + + // Price bounces back to 200 $/E + await priceFeed.setPrice(dec(200, 18)); + // C, opens trove + const { troveId: carolTroveId, collateral: C_coll } = await openTrove({ + ICR: toBN(dec(210, 16)), + extraParams: { from: carol }, + }); + + // Price drops to 100 $/E + await priceFeed.setPrice(dec(1, 18)); + + // L2: B Liquidated + const txB = await troveManager.liquidate(bobTroveId); + assert.isTrue(txB.receipt.status); + assert.isFalse(await sortedTroves.contains(bobTroveId)); + + // Price bounces back to 200 $/E + await priceFeed.setPrice(dec(200, 18)); + // D opens trove + const { troveId: dennisTroveId, collateral: D_coll } = await openTrove({ + ICR: toBN(dec(210, 16)), + extraParams: { from: dennis }, + }); + + // Price drops to 100 $/E + await priceFeed.setPrice(dec(1, 18)); + + // L3: C Liquidated + const txC = await troveManager.liquidate(carolTroveId); + assert.isTrue(txC.receipt.status); + assert.isFalse(await sortedTroves.contains(carolTroveId)); + + // Price bounces back to 200 $/E + await priceFeed.setPrice(dec(200, 18)); + // E opens trove + const { troveId: erinTroveId, collateral: E_coll } = await openTrove({ + ICR: toBN(dec(210, 16)), + extraParams: { from: erin }, + }); + + // Price drops to 100 $/E + await priceFeed.setPrice(dec(1, 18)); + + // L4: D Liquidated + const txD = await troveManager.liquidate(dennisTroveId); + assert.isTrue(txD.receipt.status); + assert.isFalse(await sortedTroves.contains(dennisTroveId)); - // check Bold gas compensation - assert.equal((await boldToken.balanceOf(owner)).toString(), dec(400, 18)); - }); - //// - - it("redistribution: Sequence of alternate opening/liquidation: final surviving trove has ETH from all previously liquidated troves", async () => { - // A, B open troves - const { troveId: aliceTroveId, collateral: A_coll } = await openTrove({ - ICR: toBN(dec(400, 16)), - extraParams: { from: alice }, - }); - const { troveId: bobTroveId, collateral: B_coll } = await openTrove({ - ICR: toBN(dec(400, 16)), - extraParams: { from: bob }, - }); - - // Price drops to 1 $/E - await priceFeed.setPrice(dec(1, 18)); - - // L1: A liquidated - const txA = await troveManager.liquidate(aliceTroveId); - assert.isTrue(txA.receipt.status); - assert.isFalse(await sortedTroves.contains(aliceTroveId)); - - // Price bounces back to 200 $/E - await priceFeed.setPrice(dec(200, 18)); - // C, opens trove - const { troveId: carolTroveId, collateral: C_coll } = await openTrove({ - ICR: toBN(dec(210, 16)), - extraParams: { from: carol }, - }); - - // Price drops to 100 $/E - await priceFeed.setPrice(dec(1, 18)); - - // L2: B Liquidated - const txB = await troveManager.liquidate(bobTroveId); - assert.isTrue(txB.receipt.status); - assert.isFalse(await sortedTroves.contains(bobTroveId)); - - // Price bounces back to 200 $/E - await priceFeed.setPrice(dec(200, 18)); - // D opens trove - const { troveId: dennisTroveId, collateral: D_coll } = await openTrove({ - ICR: toBN(dec(210, 16)), - extraParams: { from: dennis }, - }); - - // Price drops to 100 $/E - await priceFeed.setPrice(dec(1, 18)); - - // L3: C Liquidated - const txC = await troveManager.liquidate(carolTroveId); - assert.isTrue(txC.receipt.status); - assert.isFalse(await sortedTroves.contains(carolTroveId)); - - // Price bounces back to 200 $/E - await priceFeed.setPrice(dec(200, 18)); - // E opens trove - const { troveId: erinTroveId, collateral: E_coll } = await openTrove({ - ICR: toBN(dec(210, 16)), - extraParams: { from: erin }, - }); - - // Price drops to 100 $/E - await priceFeed.setPrice(dec(1, 18)); - - // L4: D Liquidated - const txD = await troveManager.liquidate(dennisTroveId); - assert.isTrue(txD.receipt.status); - assert.isFalse(await sortedTroves.contains(dennisTroveId)); - - // Price bounces back to 200 $/E - await priceFeed.setPrice(dec(200, 18)); - // F opens trove - const { troveId: freddyTroveId, collateral: F_coll } = await openTrove({ - ICR: toBN(dec(210, 16)), - extraParams: { from: freddy }, - }); - - // Price drops to 100 $/E - await priceFeed.setPrice(dec(1, 18)); - - // L5: E Liquidated - const txE = await troveManager.liquidate(erinTroveId); - assert.isTrue(txE.receipt.status); - assert.isFalse(await sortedTroves.contains(erinTroveId)); - - // Get entire coll of A, B, D, E and F - const alice_Coll = (await troveManager.Troves(aliceTroveId))[1] - .add(await troveManager.getPendingETHReward(aliceTroveId)) - .toString(); - const bob_Coll = (await troveManager.Troves(bobTroveId))[1] - .add(await troveManager.getPendingETHReward(bobTroveId)) - .toString(); - const carol_Coll = (await troveManager.Troves(carolTroveId))[1] - .add(await troveManager.getPendingETHReward(carolTroveId)) - .toString(); - const dennis_Coll = (await troveManager.Troves(dennisTroveId))[1] - .add(await troveManager.getPendingETHReward(dennisTroveId)) - .toString(); - const erin_Coll = (await troveManager.Troves(erinTroveId))[1] - .add(await troveManager.getPendingETHReward(erinTroveId)) - .toString(); - - const freddy_rawColl = (await troveManager.Troves(freddyTroveId))[1].toString(); - const freddy_ETHReward = ( - await troveManager.getPendingETHReward(freddyTroveId) - ).toString(); - - /* Expected collateral: + // Price bounces back to 200 $/E + await priceFeed.setPrice(dec(200, 18)); + // F opens trove + const { troveId: freddyTroveId, collateral: F_coll } = await openTrove({ + ICR: toBN(dec(210, 16)), + extraParams: { from: freddy }, + }); + + // Price drops to 100 $/E + await priceFeed.setPrice(dec(1, 18)); + + // L5: E Liquidated + const txE = await troveManager.liquidate(erinTroveId); + assert.isTrue(txE.receipt.status); + assert.isFalse(await sortedTroves.contains(erinTroveId)); + + // Get entire coll of A, B, D, E and F + const alice_Coll = (await troveManager.Troves(aliceTroveId))[1] + .add(await troveManager.getPendingETHReward(aliceTroveId)) + .toString(); + const bob_Coll = (await troveManager.Troves(bobTroveId))[1] + .add(await troveManager.getPendingETHReward(bobTroveId)) + .toString(); + const carol_Coll = (await troveManager.Troves(carolTroveId))[1] + .add(await troveManager.getPendingETHReward(carolTroveId)) + .toString(); + const dennis_Coll = (await troveManager.Troves(dennisTroveId))[1] + .add(await troveManager.getPendingETHReward(dennisTroveId)) + .toString(); + const erin_Coll = (await troveManager.Troves(erinTroveId))[1] + .add(await troveManager.getPendingETHReward(erinTroveId)) + .toString(); + + const freddy_rawColl = (await troveManager.Troves(freddyTroveId))[1].toString(); + const freddy_ETHReward = ( + await troveManager.getPendingETHReward(freddyTroveId) + ).toString(); + + /* Expected collateral: A-E should have been liquidated trove F should have acquired all ETH in the system: 1 ETH initial coll, and 0.995^5+0.995^4+0.995^3+0.995^2+0.995 from rewards = 5.925 ETH */ - assert.isAtMost(th.getDifference(alice_Coll, "0"), 1000); - assert.isAtMost(th.getDifference(bob_Coll, "0"), 1000); - assert.isAtMost(th.getDifference(carol_Coll, "0"), 1000); - assert.isAtMost(th.getDifference(dennis_Coll, "0"), 1000); - assert.isAtMost(th.getDifference(erin_Coll, "0"), 1000); - - assert.isAtMost(th.getDifference(freddy_rawColl, F_coll), 1000); - const gainedETH = th.applyLiquidationFee( - E_coll.add( - th.applyLiquidationFee( - D_coll.add( - th.applyLiquidationFee( - C_coll.add( - th.applyLiquidationFee( - B_coll.add(th.applyLiquidationFee(A_coll)) - ) - ) - ) - ) - ) - ) - ); - assert.isAtMost(th.getDifference(freddy_ETHReward, gainedETH), 1000); - - const entireSystemColl = (await activePool.getETHBalance()) - .add(await defaultPool.getETHBalance()) - .toString(); - assert.isAtMost( - th.getDifference(entireSystemColl, F_coll.add(gainedETH)), - 1000 - ); + assert.isAtMost(th.getDifference(alice_Coll, "0"), 1000); + assert.isAtMost(th.getDifference(bob_Coll, "0"), 1000); + assert.isAtMost(th.getDifference(carol_Coll, "0"), 1000); + assert.isAtMost(th.getDifference(dennis_Coll, "0"), 1000); + assert.isAtMost(th.getDifference(erin_Coll, "0"), 1000); + + assert.isAtMost(th.getDifference(freddy_rawColl, F_coll), 1000); + const gainedETH = th.applyLiquidationFee( + E_coll.add( + th.applyLiquidationFee( + D_coll.add( + th.applyLiquidationFee( + C_coll.add( + th.applyLiquidationFee( + B_coll.add(th.applyLiquidationFee(A_coll)), + ), + ), + ), + ), + ), + ), + ); + assert.isAtMost(th.getDifference(freddy_ETHReward, gainedETH), 1000); + + const entireSystemColl = (await activePool.getETHBalance()) + .add(await defaultPool.getETHBalance()) + .toString(); + assert.isAtMost( + th.getDifference(entireSystemColl, F_coll.add(gainedETH)), + 1000, + ); + + // check Bold gas compensation + assert.equal( + (await boldToken.balanceOf(owner)).toString(), + dec(1000, 18), + ); + }); + + // ---Trove adds collateral --- + + // Test based on scenario in: https://docs.google.com/spreadsheets/d/1F5p3nZy749K5jwO-bwJeTsRoY7ewMfWIQ3QHtokxqzo/edit?usp=sharing + it("redistribution: A,B,C,D,E open. Liq(A). B adds coll. Liq(C). B and D have correct coll and debt", async () => { + // A, B, C, D, E open troves + const { troveId: ATroveId, collateral: A_coll } = await openTrove({ + ICR: toBN(dec(200, 16)), + extraBoldAmount: dec(100000, 18), + extraParams: { from: A }, + }); + const { troveId: BTroveId, collateral: B_coll } = await openTrove({ + ICR: toBN(dec(200, 16)), + extraBoldAmount: dec(100000, 18), + extraParams: { from: B }, + }); + const { troveId: CTroveId, collateral: C_coll } = await openTrove({ + ICR: toBN(dec(200, 16)), + extraBoldAmount: dec(100000, 18), + extraParams: { from: C }, + }); + const { troveId: DTroveId, collateral: D_coll } = await openTrove({ + ICR: toBN(dec(20000, 16)), + extraBoldAmount: dec(10, 18), + extraParams: { from: D }, + }); + const { troveId: ETroveId, collateral: E_coll } = await openTrove({ + ICR: toBN(dec(200, 16)), + extraBoldAmount: dec(100000, 18), + extraParams: { from: E }, + }); - // check Bold gas compensation - assert.equal( - (await boldToken.balanceOf(owner)).toString(), - dec(1000, 18) - ); + // Price drops to 100 $/E + await priceFeed.setPrice(dec(100, 18)); + + // Liquidate A + // console.log(`ICR A: ${await troveManager.getCurrentICR(A, price)}`) + const txA = await troveManager.liquidate(ATroveId); + assert.isTrue(txA.receipt.status); + assert.isFalse(await sortedTroves.contains(ATroveId)); + + // Check entireColl for each trove: + const B_entireColl_1 = (await th.getEntireCollAndDebtByAddress(contracts, B)) + .entireColl; + const C_entireColl_1 = (await th.getEntireCollAndDebtByAddress(contracts, C)) + .entireColl; + const D_entireColl_1 = (await th.getEntireCollAndDebtByAddress(contracts, D)) + .entireColl; + const E_entireColl_1 = (await th.getEntireCollAndDebtByAddress(contracts, E)) + .entireColl; + + const totalCollAfterL1 = B_coll.add(C_coll).add(D_coll).add(E_coll); + const B_collAfterL1 = B_coll.add( + th.applyLiquidationFee(A_coll).mul(B_coll).div(totalCollAfterL1), + ); + const C_collAfterL1 = C_coll.add( + th.applyLiquidationFee(A_coll).mul(C_coll).div(totalCollAfterL1), + ); + const D_collAfterL1 = D_coll.add( + th.applyLiquidationFee(A_coll).mul(D_coll).div(totalCollAfterL1), + ); + const E_collAfterL1 = E_coll.add( + th.applyLiquidationFee(A_coll).mul(E_coll).div(totalCollAfterL1), + ); + assert.isAtMost(getDifference(B_entireColl_1, B_collAfterL1), 1e8); + assert.isAtMost(getDifference(C_entireColl_1, C_collAfterL1), 1e8); + assert.isAtMost(getDifference(D_entireColl_1, D_collAfterL1), 1e8); + assert.isAtMost(getDifference(E_entireColl_1, E_collAfterL1), 1e8); + + // Bob adds 1 ETH to his trove + const addedColl1 = toBN(dec(1, "ether")); + await th.addCollWrapper(contracts, { from: B, value: addedColl1 }); + + // Liquidate C + const txC = await troveManager.liquidate(CTroveId); + assert.isTrue(txC.receipt.status); + assert.isFalse(await sortedTroves.contains(CTroveId)); + + const B_entireColl_2 = (await th.getEntireCollAndDebtByAddress(contracts, B)) + .entireColl; + const D_entireColl_2 = (await th.getEntireCollAndDebtByAddress(contracts, D)) + .entireColl; + const E_entireColl_2 = (await th.getEntireCollAndDebtByAddress(contracts, E)) + .entireColl; + + const totalCollAfterL2 = B_collAfterL1.add(addedColl1) + .add(D_collAfterL1) + .add(E_collAfterL1); + const B_collAfterL2 = B_collAfterL1.add(addedColl1).add( + th + .applyLiquidationFee(C_collAfterL1) + .mul(B_collAfterL1.add(addedColl1)) + .div(totalCollAfterL2), + ); + const D_collAfterL2 = D_collAfterL1.add( + th + .applyLiquidationFee(C_collAfterL1) + .mul(D_collAfterL1) + .div(totalCollAfterL2), + ); + const E_collAfterL2 = E_collAfterL1.add( + th + .applyLiquidationFee(C_collAfterL1) + .mul(E_collAfterL1) + .div(totalCollAfterL2), + ); + // console.log(`D_entireColl_2: ${D_entireColl_2}`) + // console.log(`E_entireColl_2: ${E_entireColl_2}`) + // assert.isAtMost(getDifference(B_entireColl_2, B_collAfterL2), 1e8) + assert.isAtMost(getDifference(D_entireColl_2, D_collAfterL2), 1e8); + assert.isAtMost(getDifference(E_entireColl_2, E_collAfterL2), 1e8); + + // Bob adds 1 ETH to his trove + const addedColl2 = toBN(dec(1, "ether")); + await th.addCollWrapper(contracts, { from: B, value: addedColl2 }); + + // Liquidate E + const txE = await troveManager.liquidate(ETroveId); + assert.isTrue(txE.receipt.status); + assert.isFalse(await sortedTroves.contains(ETroveId)); + + const totalCollAfterL3 = B_collAfterL2.add(addedColl2).add(D_collAfterL2); + const B_collAfterL3 = B_collAfterL2.add(addedColl2).add( + th + .applyLiquidationFee(E_collAfterL2) + .mul(B_collAfterL2.add(addedColl2)) + .div(totalCollAfterL3), + ); + const D_collAfterL3 = D_collAfterL2.add( + th + .applyLiquidationFee(E_collAfterL2) + .mul(D_collAfterL2) + .div(totalCollAfterL3), + ); + + const B_entireColl_3 = (await th.getEntireCollAndDebtByAddress(contracts, B)) + .entireColl; + const D_entireColl_3 = (await th.getEntireCollAndDebtByAddress(contracts, D)) + .entireColl; + + const diff_entireColl_B = getDifference(B_entireColl_3, B_collAfterL3); + const diff_entireColl_D = getDifference(D_entireColl_3, D_collAfterL3); + + assert.isAtMost(diff_entireColl_B, 1e8); + assert.isAtMost(diff_entireColl_D, 1e8); + }); + + // Test based on scenario in: https://docs.google.com/spreadsheets/d/1F5p3nZy749K5jwO-bwJeTsRoY7ewMfWIQ3QHtokxqzo/edit?usp=sharing + it("redistribution: A,B,C,D open. Liq(A). B adds coll. Liq(C). B and D have correct coll and debt", async () => { + // A, B, C, D, E open troves + const { troveId: ATroveId, collateral: A_coll } = await openTrove({ + ICR: toBN(dec(200, 16)), + extraBoldAmount: dec(100000, 18), + extraParams: { from: A }, + }); + const { troveId: BTroveId, collateral: B_coll } = await openTrove({ + ICR: toBN(dec(200, 16)), + extraBoldAmount: dec(100000, 18), + extraParams: { from: B }, + }); + const { troveId: CTroveId, collateral: C_coll } = await openTrove({ + ICR: toBN(dec(200, 16)), + extraBoldAmount: dec(100000, 18), + extraParams: { from: C }, + }); + const { troveId: DTroveId, collateral: D_coll } = await openTrove({ + ICR: toBN(dec(20000, 16)), + extraBoldAmount: dec(10, 18), + extraParams: { from: D }, + }); + const { troveId: ETroveId, collateral: E_coll } = await openTrove({ + ICR: toBN(dec(200, 16)), + extraBoldAmount: dec(100000, 18), + extraParams: { from: E }, }); - // ---Trove adds collateral --- - - // Test based on scenario in: https://docs.google.com/spreadsheets/d/1F5p3nZy749K5jwO-bwJeTsRoY7ewMfWIQ3QHtokxqzo/edit?usp=sharing - it("redistribution: A,B,C,D,E open. Liq(A). B adds coll. Liq(C). B and D have correct coll and debt", async () => { - // A, B, C, D, E open troves - const { troveId: ATroveId, collateral: A_coll } = await openTrove({ - ICR: toBN(dec(200, 16)), - extraBoldAmount: dec(100000, 18), - extraParams: { from: A }, - }); - const { troveId: BTroveId, collateral: B_coll } = await openTrove({ - ICR: toBN(dec(200, 16)), - extraBoldAmount: dec(100000, 18), - extraParams: { from: B }, - }); - const { troveId: CTroveId, collateral: C_coll } = await openTrove({ - ICR: toBN(dec(200, 16)), - extraBoldAmount: dec(100000, 18), - extraParams: { from: C }, - }); - const { troveId: DTroveId, collateral: D_coll } = await openTrove({ - ICR: toBN(dec(20000, 16)), - extraBoldAmount: dec(10, 18), - extraParams: { from: D }, - }); - const { troveId: ETroveId, collateral: E_coll } = await openTrove({ - ICR: toBN(dec(200, 16)), - extraBoldAmount: dec(100000, 18), - extraParams: { from: E }, - }); - - // Price drops to 100 $/E - await priceFeed.setPrice(dec(100, 18)); - - // Liquidate A - // console.log(`ICR A: ${await troveManager.getCurrentICR(A, price)}`) - const txA = await troveManager.liquidate(ATroveId); - assert.isTrue(txA.receipt.status); - assert.isFalse(await sortedTroves.contains(ATroveId)); - - // Check entireColl for each trove: - const B_entireColl_1 = (await th.getEntireCollAndDebtByAddress(contracts, B)) - .entireColl; - const C_entireColl_1 = (await th.getEntireCollAndDebtByAddress(contracts, C)) - .entireColl; - const D_entireColl_1 = (await th.getEntireCollAndDebtByAddress(contracts, D)) - .entireColl; - const E_entireColl_1 = (await th.getEntireCollAndDebtByAddress(contracts, E)) - .entireColl; - - const totalCollAfterL1 = B_coll.add(C_coll).add(D_coll).add(E_coll); - const B_collAfterL1 = B_coll.add( - th.applyLiquidationFee(A_coll).mul(B_coll).div(totalCollAfterL1) - ); - const C_collAfterL1 = C_coll.add( - th.applyLiquidationFee(A_coll).mul(C_coll).div(totalCollAfterL1) - ); - const D_collAfterL1 = D_coll.add( - th.applyLiquidationFee(A_coll).mul(D_coll).div(totalCollAfterL1) - ); - const E_collAfterL1 = E_coll.add( - th.applyLiquidationFee(A_coll).mul(E_coll).div(totalCollAfterL1) - ); - assert.isAtMost(getDifference(B_entireColl_1, B_collAfterL1), 1e8); - assert.isAtMost(getDifference(C_entireColl_1, C_collAfterL1), 1e8); - assert.isAtMost(getDifference(D_entireColl_1, D_collAfterL1), 1e8); - assert.isAtMost(getDifference(E_entireColl_1, E_collAfterL1), 1e8); - - // Bob adds 1 ETH to his trove - const addedColl1 = toBN(dec(1, "ether")); - await th.addCollWrapper(contracts, { from: B, value: addedColl1 }); - - // Liquidate C - const txC = await troveManager.liquidate(CTroveId); - assert.isTrue(txC.receipt.status); - assert.isFalse(await sortedTroves.contains(CTroveId)); - - const B_entireColl_2 = (await th.getEntireCollAndDebtByAddress(contracts, B)) - .entireColl; - const D_entireColl_2 = (await th.getEntireCollAndDebtByAddress(contracts, D)) - .entireColl; - const E_entireColl_2 = (await th.getEntireCollAndDebtByAddress(contracts, E)) - .entireColl; - - const totalCollAfterL2 = B_collAfterL1.add(addedColl1) - .add(D_collAfterL1) - .add(E_collAfterL1); - const B_collAfterL2 = B_collAfterL1.add(addedColl1).add( - th - .applyLiquidationFee(C_collAfterL1) - .mul(B_collAfterL1.add(addedColl1)) - .div(totalCollAfterL2) - ); - const D_collAfterL2 = D_collAfterL1.add( - th - .applyLiquidationFee(C_collAfterL1) - .mul(D_collAfterL1) - .div(totalCollAfterL2) - ); - const E_collAfterL2 = E_collAfterL1.add( - th - .applyLiquidationFee(C_collAfterL1) - .mul(E_collAfterL1) - .div(totalCollAfterL2) - ); - // console.log(`D_entireColl_2: ${D_entireColl_2}`) - // console.log(`E_entireColl_2: ${E_entireColl_2}`) - //assert.isAtMost(getDifference(B_entireColl_2, B_collAfterL2), 1e8) - assert.isAtMost(getDifference(D_entireColl_2, D_collAfterL2), 1e8); - assert.isAtMost(getDifference(E_entireColl_2, E_collAfterL2), 1e8); - - // Bob adds 1 ETH to his trove - const addedColl2 = toBN(dec(1, "ether")); - await th.addCollWrapper(contracts, { from: B, value: addedColl2 }); - - // Liquidate E - const txE = await troveManager.liquidate(ETroveId); - assert.isTrue(txE.receipt.status); - assert.isFalse(await sortedTroves.contains(ETroveId)); - - const totalCollAfterL3 = B_collAfterL2.add(addedColl2).add(D_collAfterL2); - const B_collAfterL3 = B_collAfterL2.add(addedColl2).add( - th - .applyLiquidationFee(E_collAfterL2) - .mul(B_collAfterL2.add(addedColl2)) - .div(totalCollAfterL3) - ); - const D_collAfterL3 = D_collAfterL2.add( - th - .applyLiquidationFee(E_collAfterL2) - .mul(D_collAfterL2) - .div(totalCollAfterL3) - ); + // Price drops to 100 $/E + await priceFeed.setPrice(dec(100, 18)); + + // Check entireColl for each trove: + const A_entireColl_0 = (await th.getEntireCollAndDebtByAddress(contracts, A)) + .entireColl; + const B_entireColl_0 = (await th.getEntireCollAndDebtByAddress(contracts, B)) + .entireColl; + const C_entireColl_0 = (await th.getEntireCollAndDebtByAddress(contracts, C)) + .entireColl; + const D_entireColl_0 = (await th.getEntireCollAndDebtByAddress(contracts, D)) + .entireColl; + const E_entireColl_0 = (await th.getEntireCollAndDebtByAddress(contracts, E)) + .entireColl; + + // entireSystemColl, excluding A + const denominatorColl_1 = (await troveManager.getEntireSystemColl()).sub( + A_entireColl_0, + ); + + // Liquidate A + // console.log(`ICR A: ${await troveManager.getCurrentICR(A, price)}`) + const txA = await troveManager.liquidate(ATroveId); + assert.isTrue(txA.receipt.status); + assert.isFalse(await sortedTroves.contains(ATroveId)); + + const A_collRedistribution = A_entireColl_0.mul(toBN(995)).div( + toBN(1000), + ); // remove the gas comp + + // console.log(`A_collRedistribution: ${A_collRedistribution}`) + // Check accumulated ETH gain for each trove + const B_ETHGain_1 = await troveManager.getPendingETHReward(BTroveId); + const C_ETHGain_1 = await troveManager.getPendingETHReward(CTroveId); + const D_ETHGain_1 = await troveManager.getPendingETHReward(DTroveId); + const E_ETHGain_1 = await troveManager.getPendingETHReward(ETroveId); + + // Check gains are what we'd expect from a distribution proportional to each trove's entire coll + const B_expectedPendingETH_1 = A_collRedistribution.mul(B_entireColl_0).div(denominatorColl_1); + const C_expectedPendingETH_1 = A_collRedistribution.mul(C_entireColl_0).div(denominatorColl_1); + const D_expectedPendingETH_1 = A_collRedistribution.mul(D_entireColl_0).div(denominatorColl_1); + const E_expectedPendingETH_1 = A_collRedistribution.mul(E_entireColl_0).div(denominatorColl_1); + + assert.isAtMost(getDifference(B_expectedPendingETH_1, B_ETHGain_1), 1e8); + assert.isAtMost(getDifference(C_expectedPendingETH_1, C_ETHGain_1), 1e8); + assert.isAtMost(getDifference(D_expectedPendingETH_1, D_ETHGain_1), 1e8); + assert.isAtMost(getDifference(E_expectedPendingETH_1, E_ETHGain_1), 1e8); + + // // Bob adds 1 ETH to his trove + await th.addCollWrapper(contracts, { + from: B, + value: dec(1, "ether"), + }); - const B_entireColl_3 = (await th.getEntireCollAndDebtByAddress(contracts, B)) - .entireColl; - const D_entireColl_3 = (await th.getEntireCollAndDebtByAddress(contracts, D)) - .entireColl; - - const diff_entireColl_B = getDifference(B_entireColl_3, B_collAfterL3); - const diff_entireColl_D = getDifference(D_entireColl_3, D_collAfterL3); - - assert.isAtMost(diff_entireColl_B, 1e8); - assert.isAtMost(diff_entireColl_D, 1e8); - }); - - // Test based on scenario in: https://docs.google.com/spreadsheets/d/1F5p3nZy749K5jwO-bwJeTsRoY7ewMfWIQ3QHtokxqzo/edit?usp=sharing - it("redistribution: A,B,C,D open. Liq(A). B adds coll. Liq(C). B and D have correct coll and debt", async () => { - // A, B, C, D, E open troves - const { troveId: ATroveId, collateral: A_coll } = await openTrove({ - ICR: toBN(dec(200, 16)), - extraBoldAmount: dec(100000, 18), - extraParams: { from: A }, - }); - const { troveId: BTroveId, collateral: B_coll } = await openTrove({ - ICR: toBN(dec(200, 16)), - extraBoldAmount: dec(100000, 18), - extraParams: { from: B }, - }); - const { troveId: CTroveId, collateral: C_coll } = await openTrove({ - ICR: toBN(dec(200, 16)), - extraBoldAmount: dec(100000, 18), - extraParams: { from: C }, - }); - const { troveId: DTroveId, collateral: D_coll } = await openTrove({ - ICR: toBN(dec(20000, 16)), - extraBoldAmount: dec(10, 18), - extraParams: { from: D }, - }); - const { troveId: ETroveId, collateral: E_coll } = await openTrove({ - ICR: toBN(dec(200, 16)), - extraBoldAmount: dec(100000, 18), - extraParams: { from: E }, - }); - - // Price drops to 100 $/E - await priceFeed.setPrice(dec(100, 18)); - - // Check entireColl for each trove: - const A_entireColl_0 = (await th.getEntireCollAndDebtByAddress(contracts, A)) - .entireColl; - const B_entireColl_0 = (await th.getEntireCollAndDebtByAddress(contracts, B)) - .entireColl; - const C_entireColl_0 = (await th.getEntireCollAndDebtByAddress(contracts, C)) - .entireColl; - const D_entireColl_0 = (await th.getEntireCollAndDebtByAddress(contracts, D)) - .entireColl; - const E_entireColl_0 = (await th.getEntireCollAndDebtByAddress(contracts, E)) - .entireColl; - - // entireSystemColl, excluding A - const denominatorColl_1 = (await troveManager.getEntireSystemColl()).sub( - A_entireColl_0 - ); + // Check entireColl for each trove + const B_entireColl_1 = (await th.getEntireCollAndDebtByAddress(contracts, B)) + .entireColl; + const C_entireColl_1 = (await th.getEntireCollAndDebtByAddress(contracts, C)) + .entireColl; + const D_entireColl_1 = (await th.getEntireCollAndDebtByAddress(contracts, D)) + .entireColl; + const E_entireColl_1 = (await th.getEntireCollAndDebtByAddress(contracts, E)) + .entireColl; + + // entireSystemColl, excluding C + const denominatorColl_2 = (await troveManager.getEntireSystemColl()).sub( + C_entireColl_1, + ); + + // Liquidate C + const txC = await troveManager.liquidate(CTroveId); + assert.isTrue(txC.receipt.status); + assert.isFalse(await sortedTroves.contains(CTroveId)); + + const C_collRedistribution = C_entireColl_1.mul(toBN(995)).div( + toBN(1000), + ); // remove the gas comp + // console.log(`C_collRedistribution: ${C_collRedistribution}`) + + const B_ETHGain_2 = await troveManager.getPendingETHReward(BTroveId); + const D_ETHGain_2 = await troveManager.getPendingETHReward(DTroveId); + const E_ETHGain_2 = await troveManager.getPendingETHReward(ETroveId); + + // Since B topped up, he has no previous pending ETH gain + const B_expectedPendingETH_2 = C_collRedistribution.mul(B_entireColl_1).div(denominatorColl_2); + + // D & E's accumulated pending ETH gain includes their previous gain + const D_expectedPendingETH_2 = C_collRedistribution.mul(D_entireColl_1) + .div(denominatorColl_2) + .add(D_expectedPendingETH_1); + + const E_expectedPendingETH_2 = C_collRedistribution.mul(E_entireColl_1) + .div(denominatorColl_2) + .add(E_expectedPendingETH_1); + + assert.isAtMost(getDifference(B_expectedPendingETH_2, B_ETHGain_2), 1e8); + assert.isAtMost(getDifference(D_expectedPendingETH_2, D_ETHGain_2), 1e8); + assert.isAtMost(getDifference(E_expectedPendingETH_2, E_ETHGain_2), 1e8); + + // // Bob adds 1 ETH to his trove + await th.addCollWrapper(contracts, { + from: B, + value: dec(1, "ether"), + }); - // Liquidate A - // console.log(`ICR A: ${await troveManager.getCurrentICR(A, price)}`) - const txA = await troveManager.liquidate(ATroveId); - assert.isTrue(txA.receipt.status); - assert.isFalse(await sortedTroves.contains(ATroveId)); - - const A_collRedistribution = A_entireColl_0.mul(toBN(995)).div( - toBN(1000) - ); // remove the gas comp - - // console.log(`A_collRedistribution: ${A_collRedistribution}`) - // Check accumulated ETH gain for each trove - const B_ETHGain_1 = await troveManager.getPendingETHReward(BTroveId); - const C_ETHGain_1 = await troveManager.getPendingETHReward(CTroveId); - const D_ETHGain_1 = await troveManager.getPendingETHReward(DTroveId); - const E_ETHGain_1 = await troveManager.getPendingETHReward(ETroveId); - - // Check gains are what we'd expect from a distribution proportional to each trove's entire coll - const B_expectedPendingETH_1 = - A_collRedistribution.mul(B_entireColl_0).div(denominatorColl_1); - const C_expectedPendingETH_1 = - A_collRedistribution.mul(C_entireColl_0).div(denominatorColl_1); - const D_expectedPendingETH_1 = - A_collRedistribution.mul(D_entireColl_0).div(denominatorColl_1); - const E_expectedPendingETH_1 = - A_collRedistribution.mul(E_entireColl_0).div(denominatorColl_1); - - assert.isAtMost(getDifference(B_expectedPendingETH_1, B_ETHGain_1), 1e8); - assert.isAtMost(getDifference(C_expectedPendingETH_1, C_ETHGain_1), 1e8); - assert.isAtMost(getDifference(D_expectedPendingETH_1, D_ETHGain_1), 1e8); - assert.isAtMost(getDifference(E_expectedPendingETH_1, E_ETHGain_1), 1e8); - - // // Bob adds 1 ETH to his trove - await th.addCollWrapper(contracts, { - from: B, - value: dec(1, "ether"), - }); - - // Check entireColl for each trove - const B_entireColl_1 = (await th.getEntireCollAndDebtByAddress(contracts, B)) - .entireColl; - const C_entireColl_1 = (await th.getEntireCollAndDebtByAddress(contracts, C)) - .entireColl; - const D_entireColl_1 = (await th.getEntireCollAndDebtByAddress(contracts, D)) - .entireColl; - const E_entireColl_1 = (await th.getEntireCollAndDebtByAddress(contracts, E)) - .entireColl; - - // entireSystemColl, excluding C - const denominatorColl_2 = (await troveManager.getEntireSystemColl()).sub( - C_entireColl_1 - ); + // Check entireColl for each trove + const B_entireColl_2 = (await th.getEntireCollAndDebtByAddress(contracts, B)) + .entireColl; + const D_entireColl_2 = (await th.getEntireCollAndDebtByAddress(contracts, D)) + .entireColl; + const E_entireColl_2 = (await th.getEntireCollAndDebtByAddress(contracts, E)) + .entireColl; + + // entireSystemColl, excluding E + const denominatorColl_3 = (await troveManager.getEntireSystemColl()).sub( + E_entireColl_2, + ); + + // Liquidate E + const txE = await troveManager.liquidate(ETroveId); + assert.isTrue(txE.receipt.status); + assert.isFalse(await sortedTroves.contains(ETroveId)); + + const E_collRedistribution = E_entireColl_2.mul(toBN(995)).div( + toBN(1000), + ); // remove the gas comp + // console.log(`E_collRedistribution: ${E_collRedistribution}`) + + const B_ETHGain_3 = await troveManager.getPendingETHReward(BTroveId); + const D_ETHGain_3 = await troveManager.getPendingETHReward(DTroveId); + + // Since B topped up, he has no previous pending ETH gain + const B_expectedPendingETH_3 = E_collRedistribution.mul(B_entireColl_2).div(denominatorColl_3); + + // D'S accumulated pending ETH gain includes their previous gain + const D_expectedPendingETH_3 = E_collRedistribution.mul(D_entireColl_2) + .div(denominatorColl_3) + .add(D_expectedPendingETH_2); + + assert.isAtMost(getDifference(B_expectedPendingETH_3, B_ETHGain_3), 1e8); + assert.isAtMost(getDifference(D_expectedPendingETH_3, D_ETHGain_3), 1e8); + }); + + it("redistribution: A,B,C Open. Liq(C). B adds coll. Liq(A). B acquires all coll and debt", async () => { + // A, B, C open troves + const { troveId: aliceTroveId, collateral: A_coll, totalDebt: A_totalDebt } = await openTrove({ + ICR: toBN(dec(400, 16)), + extraParams: { from: alice }, + }); + const { troveId: bobTroveId, collateral: B_coll, totalDebt: B_totalDebt } = await openTrove({ + ICR: toBN(dec(200, 16)), + extraBoldAmount: dec(110, 18), + extraParams: { from: bob }, + }); + const { troveId: carolTroveId, collateral: C_coll, totalDebt: C_totalDebt } = await openTrove({ + ICR: toBN(dec(200, 16)), + extraBoldAmount: dec(110, 18), + extraParams: { from: carol }, + }); - // Liquidate C - const txC = await troveManager.liquidate(CTroveId); - assert.isTrue(txC.receipt.status); - assert.isFalse(await sortedTroves.contains(CTroveId)); - - const C_collRedistribution = C_entireColl_1.mul(toBN(995)).div( - toBN(1000) - ); // remove the gas comp - // console.log(`C_collRedistribution: ${C_collRedistribution}`) - - const B_ETHGain_2 = await troveManager.getPendingETHReward(BTroveId); - const D_ETHGain_2 = await troveManager.getPendingETHReward(DTroveId); - const E_ETHGain_2 = await troveManager.getPendingETHReward(ETroveId); - - // Since B topped up, he has no previous pending ETH gain - const B_expectedPendingETH_2 = - C_collRedistribution.mul(B_entireColl_1).div(denominatorColl_2); - - // D & E's accumulated pending ETH gain includes their previous gain - const D_expectedPendingETH_2 = C_collRedistribution.mul(D_entireColl_1) - .div(denominatorColl_2) - .add(D_expectedPendingETH_1); - - const E_expectedPendingETH_2 = C_collRedistribution.mul(E_entireColl_1) - .div(denominatorColl_2) - .add(E_expectedPendingETH_1); - - assert.isAtMost(getDifference(B_expectedPendingETH_2, B_ETHGain_2), 1e8); - assert.isAtMost(getDifference(D_expectedPendingETH_2, D_ETHGain_2), 1e8); - assert.isAtMost(getDifference(E_expectedPendingETH_2, E_ETHGain_2), 1e8); - - // // Bob adds 1 ETH to his trove - await th.addCollWrapper(contracts, { - from: B, - value: dec(1, "ether"), - }); - - // Check entireColl for each trove - const B_entireColl_2 = (await th.getEntireCollAndDebtByAddress(contracts, B)) - .entireColl; - const D_entireColl_2 = (await th.getEntireCollAndDebtByAddress(contracts, D)) - .entireColl; - const E_entireColl_2 = (await th.getEntireCollAndDebtByAddress(contracts, E)) - .entireColl; - - // entireSystemColl, excluding E - const denominatorColl_3 = (await troveManager.getEntireSystemColl()).sub( - E_entireColl_2 - ); + // Price drops to 100 $/E + await priceFeed.setPrice(dec(100, 18)); - // Liquidate E - const txE = await troveManager.liquidate(ETroveId); - assert.isTrue(txE.receipt.status); - assert.isFalse(await sortedTroves.contains(ETroveId)); - - const E_collRedistribution = E_entireColl_2.mul(toBN(995)).div( - toBN(1000) - ); // remove the gas comp - // console.log(`E_collRedistribution: ${E_collRedistribution}`) - - const B_ETHGain_3 = await troveManager.getPendingETHReward(BTroveId); - const D_ETHGain_3 = await troveManager.getPendingETHReward(DTroveId); - - // Since B topped up, he has no previous pending ETH gain - const B_expectedPendingETH_3 = - E_collRedistribution.mul(B_entireColl_2).div(denominatorColl_3); - - // D'S accumulated pending ETH gain includes their previous gain - const D_expectedPendingETH_3 = E_collRedistribution.mul(D_entireColl_2) - .div(denominatorColl_3) - .add(D_expectedPendingETH_2); - - assert.isAtMost(getDifference(B_expectedPendingETH_3, B_ETHGain_3), 1e8); - assert.isAtMost(getDifference(D_expectedPendingETH_3, D_ETHGain_3), 1e8); - }); - - it("redistribution: A,B,C Open. Liq(C). B adds coll. Liq(A). B acquires all coll and debt", async () => { - // A, B, C open troves - const { troveId: aliceTroveId, collateral: A_coll, totalDebt: A_totalDebt } = await openTrove({ - ICR: toBN(dec(400, 16)), - extraParams: { from: alice }, - }); - const { troveId: bobTroveId, collateral: B_coll, totalDebt: B_totalDebt } = await openTrove({ - ICR: toBN(dec(200, 16)), - extraBoldAmount: dec(110, 18), - extraParams: { from: bob }, - }); - const { troveId: carolTroveId, collateral: C_coll, totalDebt: C_totalDebt } = await openTrove({ - ICR: toBN(dec(200, 16)), - extraBoldAmount: dec(110, 18), - extraParams: { from: carol }, - }); - - // Price drops to 100 $/E - await priceFeed.setPrice(dec(100, 18)); - - // Liquidate Carol - const txC = await troveManager.liquidate(carolTroveId); - assert.isTrue(txC.receipt.status); - assert.isFalse(await sortedTroves.contains(carolTroveId)); - - // Price bounces back to 200 $/E - await priceFeed.setPrice(dec(200, 18)); - - //Bob adds ETH to his trove - const addedColl = toBN(dec(1, "ether")); - await th.addCollWrapper(contracts, { - from: bob, - value: addedColl, - }); - - // Alice withdraws Bold - await borrowerOperations.withdrawBold( - aliceTroveId, - th._100pct, - await getNetBorrowingAmount(A_totalDebt), - { from: alice } - ); + // Liquidate Carol + const txC = await troveManager.liquidate(carolTroveId); + assert.isTrue(txC.receipt.status); + assert.isFalse(await sortedTroves.contains(carolTroveId)); + + // Price bounces back to 200 $/E + await priceFeed.setPrice(dec(200, 18)); + + // Bob adds ETH to his trove + const addedColl = toBN(dec(1, "ether")); + await th.addCollWrapper(contracts, { + from: bob, + value: addedColl, + }); - // Price drops to 100 $/E - await priceFeed.setPrice(dec(100, 18)); - - // Liquidate Alice - const txA = await troveManager.liquidate(aliceTroveId); - assert.isTrue(txA.receipt.status); - assert.isFalse(await sortedTroves.contains(aliceTroveId)); - - // Expect Bob now holds all Ether and BoldDebt in the system: 2 + 0.4975+0.4975*0.995+0.995 Ether and 110*3 Bold (10 each for gas compensation) - const bob_Coll = (await troveManager.Troves(bobTroveId))[1] - .add(await troveManager.getPendingETHReward(bobTroveId)) - .toString(); - - const bob_BoldDebt = (await troveManager.Troves(bobTroveId))[0] - .add(await troveManager.getPendingBoldDebtReward(bobTroveId)) - .toString(); - - const expected_B_coll = B_coll.add(addedColl) - .add(th.applyLiquidationFee(A_coll)) - .add(th.applyLiquidationFee(C_coll).mul(B_coll).div(A_coll.add(B_coll))) - .add( - th.applyLiquidationFee( - th.applyLiquidationFee(C_coll).mul(A_coll).div(A_coll.add(B_coll)) - ) - ); - assert.isAtMost(th.getDifference(bob_Coll, expected_B_coll), 1000); - assert.isAtMost( - th.getDifference( - bob_BoldDebt, - A_totalDebt.mul(toBN(2)).add(B_totalDebt).add(C_totalDebt) + // Alice withdraws Bold + await borrowerOperations.withdrawBold( + aliceTroveId, + th._100pct, + await getNetBorrowingAmount(A_totalDebt), + { from: alice }, + ); + + // Price drops to 100 $/E + await priceFeed.setPrice(dec(100, 18)); + + // Liquidate Alice + const txA = await troveManager.liquidate(aliceTroveId); + assert.isTrue(txA.receipt.status); + assert.isFalse(await sortedTroves.contains(aliceTroveId)); + + // Expect Bob now holds all Ether and BoldDebt in the system: 2 + 0.4975+0.4975*0.995+0.995 Ether and 110*3 Bold (10 each for gas compensation) + const bob_Coll = (await troveManager.Troves(bobTroveId))[1] + .add(await troveManager.getPendingETHReward(bobTroveId)) + .toString(); + + const bob_BoldDebt = (await troveManager.Troves(bobTroveId))[0] + .add(await troveManager.getPendingBoldDebtReward(bobTroveId)) + .toString(); + + const expected_B_coll = B_coll.add(addedColl) + .add(th.applyLiquidationFee(A_coll)) + .add(th.applyLiquidationFee(C_coll).mul(B_coll).div(A_coll.add(B_coll))) + .add( + th.applyLiquidationFee( + th.applyLiquidationFee(C_coll).mul(A_coll).div(A_coll.add(B_coll)), ), - 1000 ); + assert.isAtMost(th.getDifference(bob_Coll, expected_B_coll), 1000); + assert.isAtMost( + th.getDifference( + bob_BoldDebt, + A_totalDebt.mul(toBN(2)).add(B_totalDebt).add(C_totalDebt), + ), + 1000, + ); + }); + + it("redistribution: A,B,C Open. Liq(C). B tops up coll. D Opens. Liq(D). Distributes correct rewards.", async () => { + // A, B, C open troves + const { troveId: aliceTroveId, collateral: A_coll, totalDebt: A_totalDebt } = await openTrove({ + ICR: toBN(dec(400, 16)), + extraParams: { from: alice }, }); + const { troveId: bobTroveId, collateral: B_coll, totalDebt: B_totalDebt } = await openTrove({ + ICR: toBN(dec(200, 16)), + extraBoldAmount: dec(110, 18), + extraParams: { from: bob }, + }); + const { troveId: carolTroveId, collateral: C_coll, totalDebt: C_totalDebt } = await openTrove({ + ICR: toBN(dec(200, 16)), + extraBoldAmount: dec(110, 18), + extraParams: { from: carol }, + }); + + // Price drops to 100 $/E + await priceFeed.setPrice(dec(100, 18)); + + // Liquidate Carol + const txC = await troveManager.liquidate(carolTroveId); + assert.isTrue(txC.receipt.status); + assert.isFalse(await sortedTroves.contains(carolTroveId)); + + // Price bounces back to 200 $/E + await priceFeed.setPrice(dec(200, 18)); - it("redistribution: A,B,C Open. Liq(C). B tops up coll. D Opens. Liq(D). Distributes correct rewards.", async () => { - // A, B, C open troves - const { troveId: aliceTroveId, collateral: A_coll, totalDebt: A_totalDebt } = await openTrove({ - ICR: toBN(dec(400, 16)), - extraParams: { from: alice }, - }); - const { troveId: bobTroveId, collateral: B_coll, totalDebt: B_totalDebt } = await openTrove({ - ICR: toBN(dec(200, 16)), - extraBoldAmount: dec(110, 18), - extraParams: { from: bob }, - }); - const { troveId: carolTroveId, collateral: C_coll, totalDebt: C_totalDebt } = await openTrove({ - ICR: toBN(dec(200, 16)), - extraBoldAmount: dec(110, 18), - extraParams: { from: carol }, - }); - - // Price drops to 100 $/E - await priceFeed.setPrice(dec(100, 18)); - - // Liquidate Carol - const txC = await troveManager.liquidate(carolTroveId); - assert.isTrue(txC.receipt.status); - assert.isFalse(await sortedTroves.contains(carolTroveId)); - - // Price bounces back to 200 $/E - await priceFeed.setPrice(dec(200, 18)); - - //Bob adds ETH to his trove - const addedColl = toBN(dec(1, "ether")); - await th.addCollWrapper(contracts, { - from: bob, - value: addedColl, - }); - - // D opens trove - const { troveId: dennisTroveId, collateral: D_coll, totalDebt: D_totalDebt } = await openTrove({ - ICR: toBN(dec(200, 16)), - extraBoldAmount: dec(110, 18), - extraParams: { from: dennis }, - }); - - // Price drops to 100 $/E - await priceFeed.setPrice(dec(100, 18)); - - // Liquidate D - const txA = await troveManager.liquidate(dennisTroveId); - assert.isTrue(txA.receipt.status); - assert.isFalse(await sortedTroves.contains(dennisTroveId)); - - /* Bob rewards: + // Bob adds ETH to his trove + const addedColl = toBN(dec(1, "ether")); + await th.addCollWrapper(contracts, { + from: bob, + value: addedColl, + }); + + // D opens trove + const { troveId: dennisTroveId, collateral: D_coll, totalDebt: D_totalDebt } = await openTrove({ + ICR: toBN(dec(200, 16)), + extraBoldAmount: dec(110, 18), + extraParams: { from: dennis }, + }); + + // Price drops to 100 $/E + await priceFeed.setPrice(dec(100, 18)); + + // Liquidate D + const txA = await troveManager.liquidate(dennisTroveId); + assert.isTrue(txA.receipt.status); + assert.isFalse(await sortedTroves.contains(dennisTroveId)); + + /* Bob rewards: L1: 1/2*0.995 ETH, 55 Bold L2: (2.4975/3.995)*0.995 = 0.622 ETH , 110*(2.4975/3.995)= 68.77 BoldDebt @@ -909,145 +900,145 @@ contract( "TroveManager - Redistribution reward calculations", totalColl: 4.99 ETH totalDebt 380 Bold (includes 50 each for gas compensation) */ - const bob_Coll = (await troveManager.Troves(bobTroveId))[1] - .add(await troveManager.getPendingETHReward(bobTroveId)) - .toString(); - - const bob_BoldDebt = (await troveManager.Troves(bobTroveId))[0] - .add(await troveManager.getPendingBoldDebtReward(bobTroveId)) - .toString(); - - const alice_Coll = (await troveManager.Troves(aliceTroveId))[1] - .add(await troveManager.getPendingETHReward(aliceTroveId)) - .toString(); - - const alice_BoldDebt = (await troveManager.Troves(aliceTroveId))[0] - .add(await troveManager.getPendingBoldDebtReward(aliceTroveId)) - .toString(); - - const totalCollAfterL1 = A_coll.add(B_coll) - .add(addedColl) - .add(th.applyLiquidationFee(C_coll)); - const B_collAfterL1 = B_coll.add( - B_coll.mul(th.applyLiquidationFee(C_coll)).div(A_coll.add(B_coll)) - ).add(addedColl); - const expected_B_coll = B_collAfterL1.add( - B_collAfterL1.mul(th.applyLiquidationFee(D_coll)).div(totalCollAfterL1) - ); - const expected_B_debt = B_totalDebt.add( - B_coll.mul(C_totalDebt).div(A_coll.add(B_coll)) - ).add(B_collAfterL1.mul(D_totalDebt).div(totalCollAfterL1)); - assert.isAtMost(th.getDifference(bob_Coll, expected_B_coll), 1000); - assert.isAtMost(th.getDifference(bob_BoldDebt, expected_B_debt), 10000); - - const A_collAfterL1 = A_coll.add( - A_coll.mul(th.applyLiquidationFee(C_coll)).div(A_coll.add(B_coll)) - ); - const expected_A_coll = A_collAfterL1.add( - A_collAfterL1.mul(th.applyLiquidationFee(D_coll)).div(totalCollAfterL1) - ); - const expected_A_debt = A_totalDebt.add( - A_coll.mul(C_totalDebt).div(A_coll.add(B_coll)) - ).add(A_collAfterL1.mul(D_totalDebt).div(totalCollAfterL1)); - assert.isAtMost(th.getDifference(alice_Coll, expected_A_coll), 1000); - assert.isAtMost(th.getDifference(alice_BoldDebt, expected_A_debt), 10000); - - // check Bold gas compensation - assert.equal((await boldToken.balanceOf(owner)).toString(), dec(400, 18)); - }); - - it("redistribution: Trove with the majority stake tops up. A,B,C, D open. Liq(D). C tops up. E Enters, Liq(E). Distributes correct rewards", async () => { - const _998_Ether = toBN("998000000000000000000"); - // A, B, C, D open troves - const { troveId: aliceTroveId, collateral: A_coll } = await openTrove({ - ICR: toBN(dec(400, 16)), - extraParams: { from: alice }, - }); - const { troveId: bobTroveId, collateral: B_coll } = await openTrove({ - ICR: toBN(dec(400, 16)), - extraBoldAmount: dec(110, 18), - extraParams: { from: bob }, - }); - const { troveId: carolTroveId, collateral: C_coll } = await openTrove({ - extraBoldAmount: dec(110, 18), - extraParams: { from: carol, value: _998_Ether }, - }); - const { troveId: dennisTroveId, collateral: D_coll } = await openTrove({ - ICR: toBN(dec(200, 16)), - extraBoldAmount: dec(110, 18), - extraParams: { from: dennis, value: dec(1000, "ether") }, - }); - - // Price drops to 100 $/E - await priceFeed.setPrice(dec(100, 18)); - - // Liquidate Dennis - const txD = await troveManager.liquidate(dennisTroveId); - assert.isTrue(txD.receipt.status); - assert.isFalse(await sortedTroves.contains(dennisTroveId)); - - // Price bounces back to 200 $/E - await priceFeed.setPrice(dec(200, 18)); - - // Expected rewards: alice: 1 ETH, bob: 1 ETH, carol: 998 ETH - const alice_ETHReward_1 = await troveManager.getPendingETHReward(aliceTroveId); - const bob_ETHReward_1 = await troveManager.getPendingETHReward(bobTroveId); - const carol_ETHReward_1 = await troveManager.getPendingETHReward(carolTroveId); - - //Expect 1000 + 1000*0.995 ETH in system now - const entireSystemColl_1 = (await activePool.getETHBalance()) - .add(await defaultPool.getETHBalance()) - .toString(); - assert.equal( - entireSystemColl_1, - A_coll.add(B_coll).add(C_coll).add(th.applyLiquidationFee(D_coll)) - ); - - const totalColl = A_coll.add(B_coll).add(C_coll); - th.assertIsApproximatelyEqual( - alice_ETHReward_1.toString(), - th.applyLiquidationFee(D_coll).mul(A_coll).div(totalColl) - ); - th.assertIsApproximatelyEqual( - bob_ETHReward_1.toString(), - th.applyLiquidationFee(D_coll).mul(B_coll).div(totalColl) - ); - th.assertIsApproximatelyEqual( - carol_ETHReward_1.toString(), - th.applyLiquidationFee(D_coll).mul(C_coll).div(totalColl) - ); - - //Carol adds 1 ETH to her trove, brings it to 1992.01 total coll - const C_addedColl = toBN(dec(1, "ether")); - await th.addCollWrapper(contracts, { - from: carol, - value: dec(1, "ether"), - }); + const bob_Coll = (await troveManager.Troves(bobTroveId))[1] + .add(await troveManager.getPendingETHReward(bobTroveId)) + .toString(); + + const bob_BoldDebt = (await troveManager.Troves(bobTroveId))[0] + .add(await troveManager.getPendingBoldDebtReward(bobTroveId)) + .toString(); + + const alice_Coll = (await troveManager.Troves(aliceTroveId))[1] + .add(await troveManager.getPendingETHReward(aliceTroveId)) + .toString(); + + const alice_BoldDebt = (await troveManager.Troves(aliceTroveId))[0] + .add(await troveManager.getPendingBoldDebtReward(aliceTroveId)) + .toString(); + + const totalCollAfterL1 = A_coll.add(B_coll) + .add(addedColl) + .add(th.applyLiquidationFee(C_coll)); + const B_collAfterL1 = B_coll.add( + B_coll.mul(th.applyLiquidationFee(C_coll)).div(A_coll.add(B_coll)), + ).add(addedColl); + const expected_B_coll = B_collAfterL1.add( + B_collAfterL1.mul(th.applyLiquidationFee(D_coll)).div(totalCollAfterL1), + ); + const expected_B_debt = B_totalDebt.add( + B_coll.mul(C_totalDebt).div(A_coll.add(B_coll)), + ).add(B_collAfterL1.mul(D_totalDebt).div(totalCollAfterL1)); + assert.isAtMost(th.getDifference(bob_Coll, expected_B_coll), 1000); + assert.isAtMost(th.getDifference(bob_BoldDebt, expected_B_debt), 10000); + + const A_collAfterL1 = A_coll.add( + A_coll.mul(th.applyLiquidationFee(C_coll)).div(A_coll.add(B_coll)), + ); + const expected_A_coll = A_collAfterL1.add( + A_collAfterL1.mul(th.applyLiquidationFee(D_coll)).div(totalCollAfterL1), + ); + const expected_A_debt = A_totalDebt.add( + A_coll.mul(C_totalDebt).div(A_coll.add(B_coll)), + ).add(A_collAfterL1.mul(D_totalDebt).div(totalCollAfterL1)); + assert.isAtMost(th.getDifference(alice_Coll, expected_A_coll), 1000); + assert.isAtMost(th.getDifference(alice_BoldDebt, expected_A_debt), 10000); + + // check Bold gas compensation + assert.equal((await boldToken.balanceOf(owner)).toString(), dec(400, 18)); + }); + + it("redistribution: Trove with the majority stake tops up. A,B,C, D open. Liq(D). C tops up. E Enters, Liq(E). Distributes correct rewards", async () => { + const _998_Ether = toBN("998000000000000000000"); + // A, B, C, D open troves + const { troveId: aliceTroveId, collateral: A_coll } = await openTrove({ + ICR: toBN(dec(400, 16)), + extraParams: { from: alice }, + }); + const { troveId: bobTroveId, collateral: B_coll } = await openTrove({ + ICR: toBN(dec(400, 16)), + extraBoldAmount: dec(110, 18), + extraParams: { from: bob }, + }); + const { troveId: carolTroveId, collateral: C_coll } = await openTrove({ + extraBoldAmount: dec(110, 18), + extraParams: { from: carol, value: _998_Ether }, + }); + const { troveId: dennisTroveId, collateral: D_coll } = await openTrove({ + ICR: toBN(dec(200, 16)), + extraBoldAmount: dec(110, 18), + extraParams: { from: dennis, value: dec(1000, "ether") }, + }); - //Expect 1996 ETH in system now - const entireSystemColl_2 = (await activePool.getETHBalance()).add( - await defaultPool.getETHBalance() - ); - th.assertIsApproximatelyEqual( - entireSystemColl_2, - totalColl.add(th.applyLiquidationFee(D_coll)).add(C_addedColl) - ); + // Price drops to 100 $/E + await priceFeed.setPrice(dec(100, 18)); + + // Liquidate Dennis + const txD = await troveManager.liquidate(dennisTroveId); + assert.isTrue(txD.receipt.status); + assert.isFalse(await sortedTroves.contains(dennisTroveId)); + + // Price bounces back to 200 $/E + await priceFeed.setPrice(dec(200, 18)); + + // Expected rewards: alice: 1 ETH, bob: 1 ETH, carol: 998 ETH + const alice_ETHReward_1 = await troveManager.getPendingETHReward(aliceTroveId); + const bob_ETHReward_1 = await troveManager.getPendingETHReward(bobTroveId); + const carol_ETHReward_1 = await troveManager.getPendingETHReward(carolTroveId); + + // Expect 1000 + 1000*0.995 ETH in system now + const entireSystemColl_1 = (await activePool.getETHBalance()) + .add(await defaultPool.getETHBalance()) + .toString(); + assert.equal( + entireSystemColl_1, + A_coll.add(B_coll).add(C_coll).add(th.applyLiquidationFee(D_coll)), + ); + + const totalColl = A_coll.add(B_coll).add(C_coll); + th.assertIsApproximatelyEqual( + alice_ETHReward_1.toString(), + th.applyLiquidationFee(D_coll).mul(A_coll).div(totalColl), + ); + th.assertIsApproximatelyEqual( + bob_ETHReward_1.toString(), + th.applyLiquidationFee(D_coll).mul(B_coll).div(totalColl), + ); + th.assertIsApproximatelyEqual( + carol_ETHReward_1.toString(), + th.applyLiquidationFee(D_coll).mul(C_coll).div(totalColl), + ); + + // Carol adds 1 ETH to her trove, brings it to 1992.01 total coll + const C_addedColl = toBN(dec(1, "ether")); + await th.addCollWrapper(contracts, { + from: carol, + value: dec(1, "ether"), + }); - // E opens with another 1996 ETH - const { troveId: erinTroveId, collateral: E_coll } = await openTrove({ - ICR: toBN(dec(200, 16)), - extraParams: { from: erin, value: entireSystemColl_2 }, - }); + // Expect 1996 ETH in system now + const entireSystemColl_2 = (await activePool.getETHBalance()).add( + await defaultPool.getETHBalance(), + ); + th.assertIsApproximatelyEqual( + entireSystemColl_2, + totalColl.add(th.applyLiquidationFee(D_coll)).add(C_addedColl), + ); + + // E opens with another 1996 ETH + const { troveId: erinTroveId, collateral: E_coll } = await openTrove({ + ICR: toBN(dec(200, 16)), + extraParams: { from: erin, value: entireSystemColl_2 }, + }); - // Price drops to 100 $/E - await priceFeed.setPrice(dec(100, 18)); + // Price drops to 100 $/E + await priceFeed.setPrice(dec(100, 18)); - // Liquidate Erin - const txE = await troveManager.liquidate(erinTroveId); - assert.isTrue(txE.receipt.status); - assert.isFalse(await sortedTroves.contains(erinTroveId)); + // Liquidate Erin + const txE = await troveManager.liquidate(erinTroveId); + assert.isTrue(txE.receipt.status); + assert.isFalse(await sortedTroves.contains(erinTroveId)); - /* Expected ETH rewards: + /* Expected ETH rewards: Carol = 1992.01/1996 * 1996*0.995 = 1982.05 ETH Alice = 1.995/1996 * 1996*0.995 = 1.985025 ETH Bob = 1.995/1996 * 1996*0.995 = 1.985025 ETH @@ -1061,171 +1052,171 @@ contract( "TroveManager - Redistribution reward calculations", total = 3982.02 ETH */ - const alice_Coll = (await troveManager.Troves(aliceTroveId))[1] - .add(await troveManager.getPendingETHReward(aliceTroveId)) - .toString(); + const alice_Coll = (await troveManager.Troves(aliceTroveId))[1] + .add(await troveManager.getPendingETHReward(aliceTroveId)) + .toString(); + + const bob_Coll = (await troveManager.Troves(bobTroveId))[1] + .add(await troveManager.getPendingETHReward(bobTroveId)) + .toString(); + + const carol_Coll = (await troveManager.Troves(carolTroveId))[1] + .add(await troveManager.getPendingETHReward(carolTroveId)) + .toString(); + + const totalCollAfterL1 = A_coll.add(B_coll) + .add(C_coll) + .add(th.applyLiquidationFee(D_coll)) + .add(C_addedColl); + const A_collAfterL1 = A_coll.add( + A_coll.mul(th.applyLiquidationFee(D_coll)).div( + A_coll.add(B_coll).add(C_coll), + ), + ); + const expected_A_coll = A_collAfterL1.add( + A_collAfterL1.mul(th.applyLiquidationFee(E_coll)).div(totalCollAfterL1), + ); + const B_collAfterL1 = B_coll.add( + B_coll.mul(th.applyLiquidationFee(D_coll)).div( + A_coll.add(B_coll).add(C_coll), + ), + ); + const expected_B_coll = B_collAfterL1.add( + B_collAfterL1.mul(th.applyLiquidationFee(E_coll)).div(totalCollAfterL1), + ); + const C_collAfterL1 = C_coll.add( + C_coll.mul(th.applyLiquidationFee(D_coll)).div( + A_coll.add(B_coll).add(C_coll), + ), + ).add(C_addedColl); + const expected_C_coll = C_collAfterL1.add( + C_collAfterL1.mul(th.applyLiquidationFee(E_coll)).div(totalCollAfterL1), + ); + + assert.isAtMost(th.getDifference(alice_Coll, expected_A_coll), 1000); + assert.isAtMost(th.getDifference(bob_Coll, expected_B_coll), 1000); + assert.isAtMost(th.getDifference(carol_Coll, expected_C_coll), 1000); + + // Expect 3982.02 ETH in system now + const entireSystemColl_3 = (await activePool.getETHBalance()) + .add(await defaultPool.getETHBalance()) + .toString(); + th.assertIsApproximatelyEqual( + entireSystemColl_3, + totalCollAfterL1.add(th.applyLiquidationFee(E_coll)), + ); + + // check Bold gas compensation + th.assertIsApproximatelyEqual( + (await boldToken.balanceOf(owner)).toString(), + dec(400, 18), + ); + }); + + it("redistribution: Trove with the majority stake tops up. A,B,C, D open. Liq(D). A, B, C top up. E Enters, Liq(E). Distributes correct rewards", async () => { + const _998_Ether = toBN("998000000000000000000"); + // A, B, C open troves + const { troveId: aliceTroveId, collateral: A_coll } = await openTrove({ + ICR: toBN(dec(400, 16)), + extraParams: { from: alice }, + }); + const { troveId: bobTroveId, collateral: B_coll } = await openTrove({ + ICR: toBN(dec(400, 16)), + extraBoldAmount: dec(110, 18), + extraParams: { from: bob }, + }); + const { troveId: carolTroveId, collateral: C_coll } = await openTrove({ + extraBoldAmount: dec(110, 18), + extraParams: { from: carol, value: _998_Ether }, + }); + const { troveId: dennisTroveId, collateral: D_coll } = await openTrove({ + ICR: toBN(dec(200, 16)), + extraBoldAmount: dec(110, 18), + extraParams: { from: dennis, value: dec(1000, "ether") }, + }); - const bob_Coll = (await troveManager.Troves(bobTroveId))[1] - .add(await troveManager.getPendingETHReward(bobTroveId)) - .toString(); + // Price drops to 100 $/E + await priceFeed.setPrice(dec(100, 18)); + + // Liquidate Dennis + const txD = await troveManager.liquidate(dennisTroveId); + assert.isTrue(txD.receipt.status); + assert.isFalse(await sortedTroves.contains(dennisTroveId)); + + // Price bounces back to 200 $/E + await priceFeed.setPrice(dec(200, 18)); + + // Expected rewards: alice: 1 ETH, bob: 1 ETH, carol: 998 ETH (*0.995) + const alice_ETHReward_1 = await troveManager.getPendingETHReward(aliceTroveId); + const bob_ETHReward_1 = await troveManager.getPendingETHReward(bobTroveId); + const carol_ETHReward_1 = await troveManager.getPendingETHReward(carolTroveId); + + // Expect 1995 ETH in system now + const entireSystemColl_1 = (await activePool.getETHBalance()) + .add(await defaultPool.getETHBalance()) + .toString(); + assert.equal( + entireSystemColl_1, + A_coll.add(B_coll).add(C_coll).add(th.applyLiquidationFee(D_coll)), + ); + + const totalColl = A_coll.add(B_coll).add(C_coll); + th.assertIsApproximatelyEqual( + alice_ETHReward_1.toString(), + th.applyLiquidationFee(D_coll).mul(A_coll).div(totalColl), + ); + th.assertIsApproximatelyEqual( + bob_ETHReward_1.toString(), + th.applyLiquidationFee(D_coll).mul(B_coll).div(totalColl), + ); + th.assertIsApproximatelyEqual( + carol_ETHReward_1.toString(), + th.applyLiquidationFee(D_coll).mul(C_coll).div(totalColl), + ); + + /* Alice, Bob, Carol each adds 1 ETH to their troves, + bringing them to 2.995, 2.995, 1992.01 total coll each. */ - const carol_Coll = (await troveManager.Troves(carolTroveId))[1] - .add(await troveManager.getPendingETHReward(carolTroveId)) - .toString(); + const addedColl = toBN(dec(1, "ether")); + await th.addCollWrapper(contracts, { + from: alice, + value: addedColl, + }); + await th.addCollWrapper(contracts, { + from: bob, + value: addedColl, + }); + await th.addCollWrapper(contracts, { + from: carol, + value: addedColl, + }); - const totalCollAfterL1 = A_coll.add(B_coll) - .add(C_coll) + // Expect 1998 ETH in system now + const entireSystemColl_2 = (await activePool.getETHBalance()) + .add(await defaultPool.getETHBalance()) + .toString(); + th.assertIsApproximatelyEqual( + entireSystemColl_2, + totalColl .add(th.applyLiquidationFee(D_coll)) - .add(C_addedColl); - const A_collAfterL1 = A_coll.add( - A_coll.mul(th.applyLiquidationFee(D_coll)).div( - A_coll.add(B_coll).add(C_coll) - ) - ); - const expected_A_coll = A_collAfterL1.add( - A_collAfterL1.mul(th.applyLiquidationFee(E_coll)).div(totalCollAfterL1) - ); - const B_collAfterL1 = B_coll.add( - B_coll.mul(th.applyLiquidationFee(D_coll)).div( - A_coll.add(B_coll).add(C_coll) - ) - ); - const expected_B_coll = B_collAfterL1.add( - B_collAfterL1.mul(th.applyLiquidationFee(E_coll)).div(totalCollAfterL1) - ); - const C_collAfterL1 = C_coll.add( - C_coll.mul(th.applyLiquidationFee(D_coll)).div( - A_coll.add(B_coll).add(C_coll) - ) - ).add(C_addedColl); - const expected_C_coll = C_collAfterL1.add( - C_collAfterL1.mul(th.applyLiquidationFee(E_coll)).div(totalCollAfterL1) - ); - - assert.isAtMost(th.getDifference(alice_Coll, expected_A_coll), 1000); - assert.isAtMost(th.getDifference(bob_Coll, expected_B_coll), 1000); - assert.isAtMost(th.getDifference(carol_Coll, expected_C_coll), 1000); - - //Expect 3982.02 ETH in system now - const entireSystemColl_3 = (await activePool.getETHBalance()) - .add(await defaultPool.getETHBalance()) - .toString(); - th.assertIsApproximatelyEqual( - entireSystemColl_3, - totalCollAfterL1.add(th.applyLiquidationFee(E_coll)) - ); + .add(addedColl.mul(toBN(3))), + ); - // check Bold gas compensation - th.assertIsApproximatelyEqual( - (await boldToken.balanceOf(owner)).toString(), - dec(400, 18) - ); + // E opens with another 1998 ETH + const { troveId: erinTroveId, collateral: E_coll } = await openTrove({ + ICR: toBN(dec(200, 16)), + extraParams: { from: erin, value: entireSystemColl_2 }, }); - it("redistribution: Trove with the majority stake tops up. A,B,C, D open. Liq(D). A, B, C top up. E Enters, Liq(E). Distributes correct rewards", async () => { - const _998_Ether = toBN("998000000000000000000"); - // A, B, C open troves - const { troveId: aliceTroveId, collateral: A_coll } = await openTrove({ - ICR: toBN(dec(400, 16)), - extraParams: { from: alice }, - }); - const { troveId: bobTroveId, collateral: B_coll } = await openTrove({ - ICR: toBN(dec(400, 16)), - extraBoldAmount: dec(110, 18), - extraParams: { from: bob }, - }); - const { troveId: carolTroveId, collateral: C_coll } = await openTrove({ - extraBoldAmount: dec(110, 18), - extraParams: { from: carol, value: _998_Ether }, - }); - const { troveId: dennisTroveId, collateral: D_coll } = await openTrove({ - ICR: toBN(dec(200, 16)), - extraBoldAmount: dec(110, 18), - extraParams: { from: dennis, value: dec(1000, "ether") }, - }); - - // Price drops to 100 $/E - await priceFeed.setPrice(dec(100, 18)); - - // Liquidate Dennis - const txD = await troveManager.liquidate(dennisTroveId); - assert.isTrue(txD.receipt.status); - assert.isFalse(await sortedTroves.contains(dennisTroveId)); - - // Price bounces back to 200 $/E - await priceFeed.setPrice(dec(200, 18)); - - // Expected rewards: alice: 1 ETH, bob: 1 ETH, carol: 998 ETH (*0.995) - const alice_ETHReward_1 = await troveManager.getPendingETHReward(aliceTroveId); - const bob_ETHReward_1 = await troveManager.getPendingETHReward(bobTroveId); - const carol_ETHReward_1 = await troveManager.getPendingETHReward(carolTroveId); - - //Expect 1995 ETH in system now - const entireSystemColl_1 = (await activePool.getETHBalance()) - .add(await defaultPool.getETHBalance()) - .toString(); - assert.equal( - entireSystemColl_1, - A_coll.add(B_coll).add(C_coll).add(th.applyLiquidationFee(D_coll)) - ); - - const totalColl = A_coll.add(B_coll).add(C_coll); - th.assertIsApproximatelyEqual( - alice_ETHReward_1.toString(), - th.applyLiquidationFee(D_coll).mul(A_coll).div(totalColl) - ); - th.assertIsApproximatelyEqual( - bob_ETHReward_1.toString(), - th.applyLiquidationFee(D_coll).mul(B_coll).div(totalColl) - ); - th.assertIsApproximatelyEqual( - carol_ETHReward_1.toString(), - th.applyLiquidationFee(D_coll).mul(C_coll).div(totalColl) - ); - - /* Alice, Bob, Carol each adds 1 ETH to their troves, - bringing them to 2.995, 2.995, 1992.01 total coll each. */ - - const addedColl = toBN(dec(1, "ether")); - await th.addCollWrapper(contracts, { - from: alice, - value: addedColl, - }); - await th.addCollWrapper(contracts, { - from: bob, - value: addedColl, - }); - await th.addCollWrapper(contracts, { - from: carol, - value: addedColl, - }); - - //Expect 1998 ETH in system now - const entireSystemColl_2 = (await activePool.getETHBalance()) - .add(await defaultPool.getETHBalance()) - .toString(); - th.assertIsApproximatelyEqual( - entireSystemColl_2, - totalColl - .add(th.applyLiquidationFee(D_coll)) - .add(addedColl.mul(toBN(3))) - ); - - // E opens with another 1998 ETH - const { troveId: erinTroveId, collateral: E_coll } = await openTrove({ - ICR: toBN(dec(200, 16)), - extraParams: { from: erin, value: entireSystemColl_2 }, - }); - - // Price drops to 100 $/E - await priceFeed.setPrice(dec(100, 18)); + // Price drops to 100 $/E + await priceFeed.setPrice(dec(100, 18)); - // Liquidate Erin - const txE = await troveManager.liquidate(erinTroveId); - assert.isTrue(txE.receipt.status); - assert.isFalse(await sortedTroves.contains(erinTroveId)); + // Liquidate Erin + const txE = await troveManager.liquidate(erinTroveId); + assert.isTrue(txE.receipt.status); + assert.isFalse(await sortedTroves.contains(erinTroveId)); - /* Expected ETH rewards: + /* Expected ETH rewards: Carol = 1992.01/1998 * 1998*0.995 = 1982.04995 ETH Alice = 2.995/1998 * 1998*0.995 = 2.980025 ETH Bob = 2.995/1998 * 1998*0.995 = 2.980025 ETH @@ -1239,362 +1230,362 @@ contract( "TroveManager - Redistribution reward calculations", total = 3986.01 ETH */ - const alice_Coll = (await troveManager.Troves(aliceTroveId))[1] - .add(await troveManager.getPendingETHReward(aliceTroveId)) - .toString(); - - const bob_Coll = (await troveManager.Troves(bobTroveId))[1] - .add(await troveManager.getPendingETHReward(bobTroveId)) - .toString(); - - const carol_Coll = (await troveManager.Troves(carolTroveId))[1] - .add(await troveManager.getPendingETHReward(carolTroveId)) - .toString(); + const alice_Coll = (await troveManager.Troves(aliceTroveId))[1] + .add(await troveManager.getPendingETHReward(aliceTroveId)) + .toString(); + + const bob_Coll = (await troveManager.Troves(bobTroveId))[1] + .add(await troveManager.getPendingETHReward(bobTroveId)) + .toString(); + + const carol_Coll = (await troveManager.Troves(carolTroveId))[1] + .add(await troveManager.getPendingETHReward(carolTroveId)) + .toString(); + + const totalCollAfterL1 = A_coll.add(B_coll) + .add(C_coll) + .add(th.applyLiquidationFee(D_coll)) + .add(addedColl.mul(toBN(3))); + const A_collAfterL1 = A_coll.add( + A_coll.mul(th.applyLiquidationFee(D_coll)).div( + A_coll.add(B_coll).add(C_coll), + ), + ).add(addedColl); + const expected_A_coll = A_collAfterL1.add( + A_collAfterL1.mul(th.applyLiquidationFee(E_coll)).div(totalCollAfterL1), + ); + const B_collAfterL1 = B_coll.add( + B_coll.mul(th.applyLiquidationFee(D_coll)).div( + A_coll.add(B_coll).add(C_coll), + ), + ).add(addedColl); + const expected_B_coll = B_collAfterL1.add( + B_collAfterL1.mul(th.applyLiquidationFee(E_coll)).div(totalCollAfterL1), + ); + const C_collAfterL1 = C_coll.add( + C_coll.mul(th.applyLiquidationFee(D_coll)).div( + A_coll.add(B_coll).add(C_coll), + ), + ).add(addedColl); + const expected_C_coll = C_collAfterL1.add( + C_collAfterL1.mul(th.applyLiquidationFee(E_coll)).div(totalCollAfterL1), + ); + + assert.isAtMost(th.getDifference(alice_Coll, expected_A_coll), 1000); + assert.isAtMost(th.getDifference(bob_Coll, expected_B_coll), 1000); + assert.isAtMost(th.getDifference(carol_Coll, expected_C_coll), 1000); + + // Expect 3986.01 ETH in system now + const entireSystemColl_3 = (await activePool.getETHBalance()).add( + await defaultPool.getETHBalance(), + ); + th.assertIsApproximatelyEqual( + entireSystemColl_3, + totalCollAfterL1.add(th.applyLiquidationFee(E_coll)), + ); + + // check Bold gas compensation + th.assertIsApproximatelyEqual( + (await boldToken.balanceOf(owner)).toString(), + dec(400, 18), + ); + }); + + // --- Trove withdraws collateral --- + + it("redistribution: A,B,C Open. Liq(C). B withdraws coll. Liq(A). B acquires all coll and debt", async () => { + // A, B, C open troves + const { troveId: aliceTroveId, collateral: A_coll, totalDebt: A_totalDebt } = await openTrove({ + ICR: toBN(dec(400, 16)), + extraParams: { from: alice }, + }); + const { troveId: bobTroveId, collateral: B_coll, totalDebt: B_totalDebt } = await openTrove({ + ICR: toBN(dec(200, 16)), + extraBoldAmount: dec(110, 18), + extraParams: { from: bob }, + }); + const { troveId: carolTroveId, collateral: C_coll, totalDebt: C_totalDebt } = await openTrove({ + ICR: toBN(dec(200, 16)), + extraBoldAmount: dec(110, 18), + extraParams: { from: carol }, + }); - const totalCollAfterL1 = A_coll.add(B_coll) - .add(C_coll) - .add(th.applyLiquidationFee(D_coll)) - .add(addedColl.mul(toBN(3))); - const A_collAfterL1 = A_coll.add( - A_coll.mul(th.applyLiquidationFee(D_coll)).div( - A_coll.add(B_coll).add(C_coll) - ) - ).add(addedColl); - const expected_A_coll = A_collAfterL1.add( - A_collAfterL1.mul(th.applyLiquidationFee(E_coll)).div(totalCollAfterL1) - ); - const B_collAfterL1 = B_coll.add( - B_coll.mul(th.applyLiquidationFee(D_coll)).div( - A_coll.add(B_coll).add(C_coll) - ) - ).add(addedColl); - const expected_B_coll = B_collAfterL1.add( - B_collAfterL1.mul(th.applyLiquidationFee(E_coll)).div(totalCollAfterL1) - ); - const C_collAfterL1 = C_coll.add( - C_coll.mul(th.applyLiquidationFee(D_coll)).div( - A_coll.add(B_coll).add(C_coll) - ) - ).add(addedColl); - const expected_C_coll = C_collAfterL1.add( - C_collAfterL1.mul(th.applyLiquidationFee(E_coll)).div(totalCollAfterL1) - ); + // Price drops to 100 $/E + await priceFeed.setPrice(dec(100, 18)); - assert.isAtMost(th.getDifference(alice_Coll, expected_A_coll), 1000); - assert.isAtMost(th.getDifference(bob_Coll, expected_B_coll), 1000); - assert.isAtMost(th.getDifference(carol_Coll, expected_C_coll), 1000); + // Liquidate Carol + const txC = await troveManager.liquidate(carolTroveId); + assert.isTrue(txC.receipt.status); + assert.isFalse(await sortedTroves.contains(carolTroveId)); - //Expect 3986.01 ETH in system now - const entireSystemColl_3 = (await activePool.getETHBalance()).add( - await defaultPool.getETHBalance() - ); - th.assertIsApproximatelyEqual( - entireSystemColl_3, - totalCollAfterL1.add(th.applyLiquidationFee(E_coll)) - ); + // Price bounces back to 200 $/E + await priceFeed.setPrice(dec(200, 18)); - // check Bold gas compensation - th.assertIsApproximatelyEqual( - (await boldToken.balanceOf(owner)).toString(), - dec(400, 18) - ); + // Bob withdraws 0.5 ETH from his trove + const withdrawnColl = toBN(dec(500, "finney")); + await borrowerOperations.withdrawColl(bobTroveId, withdrawnColl, { + from: bob, }); - // --- Trove withdraws collateral --- - - it("redistribution: A,B,C Open. Liq(C). B withdraws coll. Liq(A). B acquires all coll and debt", async () => { - // A, B, C open troves - const { troveId: aliceTroveId, collateral: A_coll, totalDebt: A_totalDebt } = await openTrove({ - ICR: toBN(dec(400, 16)), - extraParams: { from: alice }, - }); - const { troveId: bobTroveId, collateral: B_coll, totalDebt: B_totalDebt } = await openTrove({ - ICR: toBN(dec(200, 16)), - extraBoldAmount: dec(110, 18), - extraParams: { from: bob }, - }); - const { troveId: carolTroveId, collateral: C_coll, totalDebt: C_totalDebt } = await openTrove({ - ICR: toBN(dec(200, 16)), - extraBoldAmount: dec(110, 18), - extraParams: { from: carol }, - }); - - // Price drops to 100 $/E - await priceFeed.setPrice(dec(100, 18)); - - // Liquidate Carol - const txC = await troveManager.liquidate(carolTroveId); - assert.isTrue(txC.receipt.status); - assert.isFalse(await sortedTroves.contains(carolTroveId)); - - // Price bounces back to 200 $/E - await priceFeed.setPrice(dec(200, 18)); - - //Bob withdraws 0.5 ETH from his trove - const withdrawnColl = toBN(dec(500, "finney")); - await borrowerOperations.withdrawColl(bobTroveId, withdrawnColl, { - from: bob, - }); - - // Alice withdraws Bold - await borrowerOperations.withdrawBold( - aliceTroveId, - th._100pct, - await getNetBorrowingAmount(A_totalDebt), - { from: alice } - ); - - // Price drops to 100 $/E - await priceFeed.setPrice(dec(100, 18)); - - // Liquidate Alice - const txA = await troveManager.liquidate(aliceTroveId); - assert.isTrue(txA.receipt.status); - assert.isFalse(await sortedTroves.contains(aliceTroveId)); - - // Expect Bob now holds all Ether and BoldDebt in the system: 2.5 Ether and 300 Bold - // 1 + 0.995/2 - 0.5 + 1.4975*0.995 - const bob_Coll = (await troveManager.Troves(bobTroveId))[1] - .add(await troveManager.getPendingETHReward(bobTroveId)) - .toString(); - - const bob_BoldDebt = (await troveManager.Troves(bobTroveId))[0] - .add(await troveManager.getPendingBoldDebtReward(bobTroveId)) - .toString(); - - const expected_B_coll = B_coll.sub(withdrawnColl) - .add(th.applyLiquidationFee(A_coll)) - .add(th.applyLiquidationFee(C_coll).mul(B_coll).div(A_coll.add(B_coll))) - .add( - th.applyLiquidationFee( - th.applyLiquidationFee(C_coll).mul(A_coll).div(A_coll.add(B_coll)) - ) - ); - assert.isAtMost(th.getDifference(bob_Coll, expected_B_coll), 1000); - assert.isAtMost( - th.getDifference( - bob_BoldDebt, - A_totalDebt.mul(toBN(2)).add(B_totalDebt).add(C_totalDebt) + // Alice withdraws Bold + await borrowerOperations.withdrawBold( + aliceTroveId, + th._100pct, + await getNetBorrowingAmount(A_totalDebt), + { from: alice }, + ); + + // Price drops to 100 $/E + await priceFeed.setPrice(dec(100, 18)); + + // Liquidate Alice + const txA = await troveManager.liquidate(aliceTroveId); + assert.isTrue(txA.receipt.status); + assert.isFalse(await sortedTroves.contains(aliceTroveId)); + + // Expect Bob now holds all Ether and BoldDebt in the system: 2.5 Ether and 300 Bold + // 1 + 0.995/2 - 0.5 + 1.4975*0.995 + const bob_Coll = (await troveManager.Troves(bobTroveId))[1] + .add(await troveManager.getPendingETHReward(bobTroveId)) + .toString(); + + const bob_BoldDebt = (await troveManager.Troves(bobTroveId))[0] + .add(await troveManager.getPendingBoldDebtReward(bobTroveId)) + .toString(); + + const expected_B_coll = B_coll.sub(withdrawnColl) + .add(th.applyLiquidationFee(A_coll)) + .add(th.applyLiquidationFee(C_coll).mul(B_coll).div(A_coll.add(B_coll))) + .add( + th.applyLiquidationFee( + th.applyLiquidationFee(C_coll).mul(A_coll).div(A_coll.add(B_coll)), ), - 1000 ); + assert.isAtMost(th.getDifference(bob_Coll, expected_B_coll), 1000); + assert.isAtMost( + th.getDifference( + bob_BoldDebt, + A_totalDebt.mul(toBN(2)).add(B_totalDebt).add(C_totalDebt), + ), + 1000, + ); + + // check Bold gas compensation + assert.equal((await boldToken.balanceOf(owner)).toString(), dec(400, 18)); + }); + + it("redistribution: A,B,C Open. Liq(C). B withdraws coll. D Opens. Liq(D). Distributes correct rewards.", async () => { + // A, B, C open troves + const { troveId: aliceTroveId, collateral: A_coll, totalDebt: A_totalDebt } = await openTrove({ + ICR: toBN(dec(500, 16)), + extraParams: { from: alice }, + }); + const { troveId: bobTroveId, collateral: B_coll, totalDebt: B_totalDebt } = await openTrove({ + ICR: toBN(dec(200, 16)), + extraBoldAmount: dec(110, 18), + extraParams: { from: bob }, + }); + const { troveId: carolTroveId, collateral: C_coll, totalDebt: C_totalDebt } = await openTrove({ + ICR: toBN(dec(110, 16)), + extraBoldAmount: dec(110, 18), + extraParams: { from: carol }, + }); - // check Bold gas compensation - assert.equal((await boldToken.balanceOf(owner)).toString(), dec(400, 18)); - }); - - it("redistribution: A,B,C Open. Liq(C). B withdraws coll. D Opens. Liq(D). Distributes correct rewards.", async () => { - // A, B, C open troves - const { troveId: aliceTroveId, collateral: A_coll, totalDebt: A_totalDebt } = await openTrove({ - ICR: toBN(dec(500, 16)), - extraParams: { from: alice }, - }); - const { troveId: bobTroveId, collateral: B_coll, totalDebt: B_totalDebt } = await openTrove({ - ICR: toBN(dec(200, 16)), - extraBoldAmount: dec(110, 18), - extraParams: { from: bob }, - }); - const { troveId: carolTroveId, collateral: C_coll, totalDebt: C_totalDebt } = await openTrove({ - ICR: toBN(dec(110, 16)), - extraBoldAmount: dec(110, 18), - extraParams: { from: carol }, - }); - - // Price drops to 110 $/E - const liqPrice = th.toBN(dec(190, 18)) - await priceFeed.setPrice(liqPrice); - assert.isFalse(await troveManager.checkRecoveryMode(liqPrice)) - - // Liquidate Carol - const txC = await troveManager.liquidate(carolTroveId); - assert.isTrue(txC.receipt.status); - assert.isFalse(await sortedTroves.contains(carolTroveId)); - - // Price bounces back to 200 $/E - await priceFeed.setPrice(dec(200, 18)); - - //Bob withdraws 0.5 ETH from his trove - const withdrawnColl = toBN(dec(500, "finney")); - await borrowerOperations.withdrawColl(bobTroveId, withdrawnColl, { - from: bob, - }); - - // D opens trove - const { troveId: dennisTroveId, collateral: D_coll, totalDebt: D_totalDebt } = await openTrove({ - ICR: toBN(dec(110, 16)), - extraBoldAmount: dec(110, 18), - extraParams: { from: dennis }, - }); - - // Price drops again - await priceFeed.setPrice(liqPrice); - assert.isFalse(await troveManager.checkRecoveryMode(liqPrice)) - - // Liquidate D - const txA = await troveManager.liquidate(dennisTroveId); - assert.isTrue(txA.receipt.status); - assert.isFalse(await sortedTroves.contains(dennisTroveId)); - - const bob_Coll = (await troveManager.Troves(bobTroveId))[1] - .add(await troveManager.getPendingETHReward(bobTroveId)) - .toString(); - - const bob_BoldDebt = (await troveManager.Troves(bobTroveId))[0] - .add(await troveManager.getPendingBoldDebtReward(bobTroveId)) - .toString(); - - const alice_Coll = (await troveManager.Troves(aliceTroveId))[1] - .add(await troveManager.getPendingETHReward(aliceTroveId)) - .toString(); - - const alice_BoldDebt = (await troveManager.Troves(aliceTroveId))[0] - .add(await troveManager.getPendingBoldDebtReward(aliceTroveId)) - .toString(); - - const totalCollAfterL1 = A_coll.add(B_coll) - .sub(withdrawnColl) - .add(th.applyLiquidationFee(C_coll)); - const B_collAfterL1 = B_coll.add( - B_coll.mul(th.applyLiquidationFee(C_coll)).div(A_coll.add(B_coll)) - ).sub(withdrawnColl); - const expected_B_coll = B_collAfterL1.add( - B_collAfterL1.mul(th.applyLiquidationFee(D_coll)).div(totalCollAfterL1) - ); - const expected_B_debt = B_totalDebt.add( - B_coll.mul(C_totalDebt).div(A_coll.add(B_coll)) - ).add(B_collAfterL1.mul(D_totalDebt).div(totalCollAfterL1)); - assert.isAtMost(th.getDifference(bob_Coll, expected_B_coll), 1000); - assert.isAtMost(th.getDifference(bob_BoldDebt, expected_B_debt), 10000); - - const A_collAfterL1 = A_coll.add( - A_coll.mul(th.applyLiquidationFee(C_coll)).div(A_coll.add(B_coll)) - ); - const expected_A_coll = A_collAfterL1.add( - A_collAfterL1.mul(th.applyLiquidationFee(D_coll)).div(totalCollAfterL1) - ); - const expected_A_debt = A_totalDebt.add( - A_coll.mul(C_totalDebt).div(A_coll.add(B_coll)) - ).add(A_collAfterL1.mul(D_totalDebt).div(totalCollAfterL1)); - assert.isAtMost(th.getDifference(alice_Coll, expected_A_coll), 1000); - assert.isAtMost(th.getDifference(alice_BoldDebt, expected_A_debt), 10000); - - const entireSystemColl = (await activePool.getETHBalance()).add( - await defaultPool.getETHBalance() - ); - th.assertIsApproximatelyEqual( - entireSystemColl, - A_coll.add(B_coll) - .add(th.applyLiquidationFee(C_coll)) - .sub(withdrawnColl) - .add(th.applyLiquidationFee(D_coll)) - ); - const entireSystemDebt = (await activePool.getRecordedDebtSum()).add( - await defaultPool.getBoldDebt() - ); + // Price drops to 110 $/E + const liqPrice = th.toBN(dec(190, 18)); + await priceFeed.setPrice(liqPrice); + assert.isFalse(await troveManager.checkRecoveryMode(liqPrice)); - th.assertIsApproximatelyEqual( - entireSystemDebt, - A_totalDebt.add(B_totalDebt).add(C_totalDebt).add(D_totalDebt) - ); + // Liquidate Carol + const txC = await troveManager.liquidate(carolTroveId); + assert.isTrue(txC.receipt.status); + assert.isFalse(await sortedTroves.contains(carolTroveId)); - // check Bold gas compensation - th.assertIsApproximatelyEqual( - (await boldToken.balanceOf(owner)).toString(), - dec(400, 18) - ); - }); + // Price bounces back to 200 $/E + await priceFeed.setPrice(dec(200, 18)); - it("redistribution: Trove with the majority stake withdraws. A,B,C,D open. Liq(D). C withdraws some coll. E Enters, Liq(E). Distributes correct rewards", async () => { - const _998_Ether = toBN("998000000000000000000"); - // A, B, C, D open troves - const { troveId: aliceTroveId, collateral: A_coll } = await openTrove({ - ICR: toBN(dec(400, 16)), - extraParams: { from: alice }, - }); - const { troveId: bobTroveId, collateral: B_coll } = await openTrove({ - ICR: toBN(dec(400, 16)), - extraBoldAmount: dec(110, 18), - extraParams: { from: bob }, - }); - const { troveId: carolTroveId, collateral: C_coll } = await openTrove({ - extraBoldAmount: dec(110, 18), - extraParams: { from: carol, value: _998_Ether }, - }); - const { troveId: dennisTroveId, collateral: D_coll } = await openTrove({ - ICR: toBN(dec(200, 16)), - extraBoldAmount: dec(110, 18), - extraParams: { from: dennis, value: dec(1000, "ether") }, - }); - - // Price drops to 100 $/E - await priceFeed.setPrice(dec(100, 18)); - - // Liquidate Dennis - const txD = await troveManager.liquidate(dennisTroveId); - assert.isTrue(txD.receipt.status); - assert.isFalse(await sortedTroves.contains(dennisTroveId)); - - // Price bounces back to 200 $/E - await priceFeed.setPrice(dec(200, 18)); - - // Expected rewards: alice: 1 ETH, bob: 1 ETH, carol: 998 ETH (*0.995) - const alice_ETHReward_1 = await troveManager.getPendingETHReward(aliceTroveId); - const bob_ETHReward_1 = await troveManager.getPendingETHReward(bobTroveId); - const carol_ETHReward_1 = await troveManager.getPendingETHReward(carolTroveId); - - //Expect 1995 ETH in system now - const entireSystemColl_1 = (await activePool.getETHBalance()).add( - await defaultPool.getETHBalance() - ); - th.assertIsApproximatelyEqual( - entireSystemColl_1, - A_coll.add(B_coll).add(C_coll).add(th.applyLiquidationFee(D_coll)) - ); + // Bob withdraws 0.5 ETH from his trove + const withdrawnColl = toBN(dec(500, "finney")); + await borrowerOperations.withdrawColl(bobTroveId, withdrawnColl, { + from: bob, + }); - const totalColl = A_coll.add(B_coll).add(C_coll); - th.assertIsApproximatelyEqual( - alice_ETHReward_1.toString(), - th.applyLiquidationFee(D_coll).mul(A_coll).div(totalColl) - ); - th.assertIsApproximatelyEqual( - bob_ETHReward_1.toString(), - th.applyLiquidationFee(D_coll).mul(B_coll).div(totalColl) - ); - th.assertIsApproximatelyEqual( - carol_ETHReward_1.toString(), - th.applyLiquidationFee(D_coll).mul(C_coll).div(totalColl) - ); + // D opens trove + const { troveId: dennisTroveId, collateral: D_coll, totalDebt: D_totalDebt } = await openTrove({ + ICR: toBN(dec(110, 16)), + extraBoldAmount: dec(110, 18), + extraParams: { from: dennis }, + }); - //Carol wthdraws 1 ETH from her trove, brings it to 1990.01 total coll - const C_withdrawnColl = toBN(dec(1, "ether")); - await borrowerOperations.withdrawColl(carolTroveId, C_withdrawnColl, { - from: carol, - }); + // Price drops again + await priceFeed.setPrice(liqPrice); + assert.isFalse(await troveManager.checkRecoveryMode(liqPrice)); + + // Liquidate D + const txA = await troveManager.liquidate(dennisTroveId); + assert.isTrue(txA.receipt.status); + assert.isFalse(await sortedTroves.contains(dennisTroveId)); + + const bob_Coll = (await troveManager.Troves(bobTroveId))[1] + .add(await troveManager.getPendingETHReward(bobTroveId)) + .toString(); + + const bob_BoldDebt = (await troveManager.Troves(bobTroveId))[0] + .add(await troveManager.getPendingBoldDebtReward(bobTroveId)) + .toString(); + + const alice_Coll = (await troveManager.Troves(aliceTroveId))[1] + .add(await troveManager.getPendingETHReward(aliceTroveId)) + .toString(); + + const alice_BoldDebt = (await troveManager.Troves(aliceTroveId))[0] + .add(await troveManager.getPendingBoldDebtReward(aliceTroveId)) + .toString(); + + const totalCollAfterL1 = A_coll.add(B_coll) + .sub(withdrawnColl) + .add(th.applyLiquidationFee(C_coll)); + const B_collAfterL1 = B_coll.add( + B_coll.mul(th.applyLiquidationFee(C_coll)).div(A_coll.add(B_coll)), + ).sub(withdrawnColl); + const expected_B_coll = B_collAfterL1.add( + B_collAfterL1.mul(th.applyLiquidationFee(D_coll)).div(totalCollAfterL1), + ); + const expected_B_debt = B_totalDebt.add( + B_coll.mul(C_totalDebt).div(A_coll.add(B_coll)), + ).add(B_collAfterL1.mul(D_totalDebt).div(totalCollAfterL1)); + assert.isAtMost(th.getDifference(bob_Coll, expected_B_coll), 1000); + assert.isAtMost(th.getDifference(bob_BoldDebt, expected_B_debt), 10000); + + const A_collAfterL1 = A_coll.add( + A_coll.mul(th.applyLiquidationFee(C_coll)).div(A_coll.add(B_coll)), + ); + const expected_A_coll = A_collAfterL1.add( + A_collAfterL1.mul(th.applyLiquidationFee(D_coll)).div(totalCollAfterL1), + ); + const expected_A_debt = A_totalDebt.add( + A_coll.mul(C_totalDebt).div(A_coll.add(B_coll)), + ).add(A_collAfterL1.mul(D_totalDebt).div(totalCollAfterL1)); + assert.isAtMost(th.getDifference(alice_Coll, expected_A_coll), 1000); + assert.isAtMost(th.getDifference(alice_BoldDebt, expected_A_debt), 10000); + + const entireSystemColl = (await activePool.getETHBalance()).add( + await defaultPool.getETHBalance(), + ); + th.assertIsApproximatelyEqual( + entireSystemColl, + A_coll.add(B_coll) + .add(th.applyLiquidationFee(C_coll)) + .sub(withdrawnColl) + .add(th.applyLiquidationFee(D_coll)), + ); + const entireSystemDebt = (await activePool.getRecordedDebtSum()).add( + await defaultPool.getBoldDebt(), + ); + + th.assertIsApproximatelyEqual( + entireSystemDebt, + A_totalDebt.add(B_totalDebt).add(C_totalDebt).add(D_totalDebt), + ); + + // check Bold gas compensation + th.assertIsApproximatelyEqual( + (await boldToken.balanceOf(owner)).toString(), + dec(400, 18), + ); + }); + + it("redistribution: Trove with the majority stake withdraws. A,B,C,D open. Liq(D). C withdraws some coll. E Enters, Liq(E). Distributes correct rewards", async () => { + const _998_Ether = toBN("998000000000000000000"); + // A, B, C, D open troves + const { troveId: aliceTroveId, collateral: A_coll } = await openTrove({ + ICR: toBN(dec(400, 16)), + extraParams: { from: alice }, + }); + const { troveId: bobTroveId, collateral: B_coll } = await openTrove({ + ICR: toBN(dec(400, 16)), + extraBoldAmount: dec(110, 18), + extraParams: { from: bob }, + }); + const { troveId: carolTroveId, collateral: C_coll } = await openTrove({ + extraBoldAmount: dec(110, 18), + extraParams: { from: carol, value: _998_Ether }, + }); + const { troveId: dennisTroveId, collateral: D_coll } = await openTrove({ + ICR: toBN(dec(200, 16)), + extraBoldAmount: dec(110, 18), + extraParams: { from: dennis, value: dec(1000, "ether") }, + }); - //Expect 1994 ETH in system now - const entireSystemColl_2 = (await activePool.getETHBalance()).add( - await defaultPool.getETHBalance() - ); - th.assertIsApproximatelyEqual( - entireSystemColl_2, - totalColl.add(th.applyLiquidationFee(D_coll)).sub(C_withdrawnColl) - ); + // Price drops to 100 $/E + await priceFeed.setPrice(dec(100, 18)); + + // Liquidate Dennis + const txD = await troveManager.liquidate(dennisTroveId); + assert.isTrue(txD.receipt.status); + assert.isFalse(await sortedTroves.contains(dennisTroveId)); + + // Price bounces back to 200 $/E + await priceFeed.setPrice(dec(200, 18)); + + // Expected rewards: alice: 1 ETH, bob: 1 ETH, carol: 998 ETH (*0.995) + const alice_ETHReward_1 = await troveManager.getPendingETHReward(aliceTroveId); + const bob_ETHReward_1 = await troveManager.getPendingETHReward(bobTroveId); + const carol_ETHReward_1 = await troveManager.getPendingETHReward(carolTroveId); + + // Expect 1995 ETH in system now + const entireSystemColl_1 = (await activePool.getETHBalance()).add( + await defaultPool.getETHBalance(), + ); + th.assertIsApproximatelyEqual( + entireSystemColl_1, + A_coll.add(B_coll).add(C_coll).add(th.applyLiquidationFee(D_coll)), + ); + + const totalColl = A_coll.add(B_coll).add(C_coll); + th.assertIsApproximatelyEqual( + alice_ETHReward_1.toString(), + th.applyLiquidationFee(D_coll).mul(A_coll).div(totalColl), + ); + th.assertIsApproximatelyEqual( + bob_ETHReward_1.toString(), + th.applyLiquidationFee(D_coll).mul(B_coll).div(totalColl), + ); + th.assertIsApproximatelyEqual( + carol_ETHReward_1.toString(), + th.applyLiquidationFee(D_coll).mul(C_coll).div(totalColl), + ); + + // Carol wthdraws 1 ETH from her trove, brings it to 1990.01 total coll + const C_withdrawnColl = toBN(dec(1, "ether")); + await borrowerOperations.withdrawColl(carolTroveId, C_withdrawnColl, { + from: carol, + }); - // E opens with another 1994 ETH - const { troveId: erinTroveId, collateral: E_coll } = await openTrove({ - ICR: toBN(dec(200, 16)), - extraParams: { from: erin, value: entireSystemColl_2 }, - }); + // Expect 1994 ETH in system now + const entireSystemColl_2 = (await activePool.getETHBalance()).add( + await defaultPool.getETHBalance(), + ); + th.assertIsApproximatelyEqual( + entireSystemColl_2, + totalColl.add(th.applyLiquidationFee(D_coll)).sub(C_withdrawnColl), + ); + + // E opens with another 1994 ETH + const { troveId: erinTroveId, collateral: E_coll } = await openTrove({ + ICR: toBN(dec(200, 16)), + extraParams: { from: erin, value: entireSystemColl_2 }, + }); - // Price drops to 100 $/E - await priceFeed.setPrice(dec(100, 18)); + // Price drops to 100 $/E + await priceFeed.setPrice(dec(100, 18)); - // Liquidate Erin - const txE = await troveManager.liquidate(erinTroveId); - assert.isTrue(txE.receipt.status); - assert.isFalse(await sortedTroves.contains(erinTroveId)); + // Liquidate Erin + const txE = await troveManager.liquidate(erinTroveId); + assert.isTrue(txE.receipt.status); + assert.isFalse(await sortedTroves.contains(erinTroveId)); - /* Expected ETH rewards: + /* Expected ETH rewards: Carol = 1990.01/1994 * 1994*0.995 = 1980.05995 ETH Alice = 1.995/1994 * 1994*0.995 = 1.985025 ETH Bob = 1.995/1994 * 1994*0.995 = 1.985025 ETH @@ -1608,205 +1599,205 @@ contract( "TroveManager - Redistribution reward calculations", total = 3978.03 ETH */ - const alice_Coll = (await troveManager.Troves(aliceTroveId))[1] - .add(await troveManager.getPendingETHReward(aliceTroveId)) - .toString(); - - const bob_Coll = (await troveManager.Troves(bobTroveId))[1] - .add(await troveManager.getPendingETHReward(bobTroveId)) - .toString(); - - const carol_Coll = (await troveManager.Troves(carolTroveId))[1] - .add(await troveManager.getPendingETHReward(carolTroveId)) - .toString(); - - const totalCollAfterL1 = A_coll.add(B_coll) - .add(C_coll) - .add(th.applyLiquidationFee(D_coll)) - .sub(C_withdrawnColl); - const A_collAfterL1 = A_coll.add( - A_coll.mul(th.applyLiquidationFee(D_coll)).div( - A_coll.add(B_coll).add(C_coll) - ) - ); - const expected_A_coll = A_collAfterL1.add( - A_collAfterL1.mul(th.applyLiquidationFee(E_coll)).div(totalCollAfterL1) - ); - const B_collAfterL1 = B_coll.add( - B_coll.mul(th.applyLiquidationFee(D_coll)).div( - A_coll.add(B_coll).add(C_coll) - ) - ); - const expected_B_coll = B_collAfterL1.add( - B_collAfterL1.mul(th.applyLiquidationFee(E_coll)).div(totalCollAfterL1) - ); - const C_collAfterL1 = C_coll.add( - C_coll.mul(th.applyLiquidationFee(D_coll)).div( - A_coll.add(B_coll).add(C_coll) - ) - ).sub(C_withdrawnColl); - const expected_C_coll = C_collAfterL1.add( - C_collAfterL1.mul(th.applyLiquidationFee(E_coll)).div(totalCollAfterL1) - ); - - assert.isAtMost(th.getDifference(alice_Coll, expected_A_coll), 1000); - assert.isAtMost(th.getDifference(bob_Coll, expected_B_coll), 1000); - assert.isAtMost(th.getDifference(carol_Coll, expected_C_coll), 1000); - - //Expect 3978.03 ETH in system now - const entireSystemColl_3 = (await activePool.getETHBalance()).add( - await defaultPool.getETHBalance() - ); - th.assertIsApproximatelyEqual( - entireSystemColl_3, - totalCollAfterL1.add(th.applyLiquidationFee(E_coll)) - ); - - // check Bold gas compensation - assert.equal((await boldToken.balanceOf(owner)).toString(), dec(400, 18)); - }); - - it("redistribution: Trove with the majority stake withdraws. A,B,C,D open. Liq(D). A, B, C withdraw. E Enters, Liq(E). Distributes correct rewards", async () => { - const _998_Ether = toBN("998000000000000000000"); - // A, B, C, D open troves - const { troveId: aliceTroveId, collateral: A_coll } = await openTrove({ - ICR: toBN(dec(400, 16)), - extraParams: { from: alice }, - }); - const { troveId: bobTroveId, collateral: B_coll } = await openTrove({ - ICR: toBN(dec(400, 16)), - extraBoldAmount: dec(110, 18), - extraParams: { from: bob }, - }); - const { troveId: carolTroveId, collateral: C_coll } = await openTrove({ - extraBoldAmount: dec(110, 18), - extraParams: { from: carol, value: _998_Ether }, - }); - const { troveId: dennisTroveId, collateral: D_coll } = await openTrove({ - ICR: toBN(dec(200, 16)), - extraBoldAmount: dec(110, 18), - extraParams: { from: dennis, value: dec(1000, "ether") }, - }); - - // Price drops to 100 $/E - await priceFeed.setPrice(dec(100, 18)); - - // Liquidate Dennis - const txD = await troveManager.liquidate(dennisTroveId); - assert.isTrue(txD.receipt.status); - assert.isFalse(await sortedTroves.contains(dennisTroveId)); - - // Price bounces back to 200 $/E - await priceFeed.setPrice(dec(200, 18)); - - // Expected rewards: alice: 1 ETH, bob: 1 ETH, carol: 998 ETH (*0.995) - const alice_ETHReward_1 = await troveManager.getPendingETHReward(aliceTroveId); - const bob_ETHReward_1 = await troveManager.getPendingETHReward(bobTroveId); - const carol_ETHReward_1 = await troveManager.getPendingETHReward(carolTroveId); - - //Expect 1995 ETH in system now - const entireSystemColl_1 = (await activePool.getETHBalance()).add( - await defaultPool.getETHBalance() - ); - th.assertIsApproximatelyEqual( - entireSystemColl_1, - A_coll.add(B_coll).add(C_coll).add(th.applyLiquidationFee(D_coll)) - ); - - const totalColl = A_coll.add(B_coll).add(C_coll); - th.assertIsApproximatelyEqual( - alice_ETHReward_1.toString(), - th.applyLiquidationFee(D_coll).mul(A_coll).div(totalColl) - ); - th.assertIsApproximatelyEqual( - bob_ETHReward_1.toString(), - th.applyLiquidationFee(D_coll).mul(B_coll).div(totalColl) - ); - th.assertIsApproximatelyEqual( - carol_ETHReward_1.toString(), - th.applyLiquidationFee(D_coll).mul(C_coll).div(totalColl) - ); + const alice_Coll = (await troveManager.Troves(aliceTroveId))[1] + .add(await troveManager.getPendingETHReward(aliceTroveId)) + .toString(); + + const bob_Coll = (await troveManager.Troves(bobTroveId))[1] + .add(await troveManager.getPendingETHReward(bobTroveId)) + .toString(); + + const carol_Coll = (await troveManager.Troves(carolTroveId))[1] + .add(await troveManager.getPendingETHReward(carolTroveId)) + .toString(); + + const totalCollAfterL1 = A_coll.add(B_coll) + .add(C_coll) + .add(th.applyLiquidationFee(D_coll)) + .sub(C_withdrawnColl); + const A_collAfterL1 = A_coll.add( + A_coll.mul(th.applyLiquidationFee(D_coll)).div( + A_coll.add(B_coll).add(C_coll), + ), + ); + const expected_A_coll = A_collAfterL1.add( + A_collAfterL1.mul(th.applyLiquidationFee(E_coll)).div(totalCollAfterL1), + ); + const B_collAfterL1 = B_coll.add( + B_coll.mul(th.applyLiquidationFee(D_coll)).div( + A_coll.add(B_coll).add(C_coll), + ), + ); + const expected_B_coll = B_collAfterL1.add( + B_collAfterL1.mul(th.applyLiquidationFee(E_coll)).div(totalCollAfterL1), + ); + const C_collAfterL1 = C_coll.add( + C_coll.mul(th.applyLiquidationFee(D_coll)).div( + A_coll.add(B_coll).add(C_coll), + ), + ).sub(C_withdrawnColl); + const expected_C_coll = C_collAfterL1.add( + C_collAfterL1.mul(th.applyLiquidationFee(E_coll)).div(totalCollAfterL1), + ); + + assert.isAtMost(th.getDifference(alice_Coll, expected_A_coll), 1000); + assert.isAtMost(th.getDifference(bob_Coll, expected_B_coll), 1000); + assert.isAtMost(th.getDifference(carol_Coll, expected_C_coll), 1000); + + // Expect 3978.03 ETH in system now + const entireSystemColl_3 = (await activePool.getETHBalance()).add( + await defaultPool.getETHBalance(), + ); + th.assertIsApproximatelyEqual( + entireSystemColl_3, + totalCollAfterL1.add(th.applyLiquidationFee(E_coll)), + ); + + // check Bold gas compensation + assert.equal((await boldToken.balanceOf(owner)).toString(), dec(400, 18)); + }); + + it("redistribution: Trove with the majority stake withdraws. A,B,C,D open. Liq(D). A, B, C withdraw. E Enters, Liq(E). Distributes correct rewards", async () => { + const _998_Ether = toBN("998000000000000000000"); + // A, B, C, D open troves + const { troveId: aliceTroveId, collateral: A_coll } = await openTrove({ + ICR: toBN(dec(400, 16)), + extraParams: { from: alice }, + }); + const { troveId: bobTroveId, collateral: B_coll } = await openTrove({ + ICR: toBN(dec(400, 16)), + extraBoldAmount: dec(110, 18), + extraParams: { from: bob }, + }); + const { troveId: carolTroveId, collateral: C_coll } = await openTrove({ + extraBoldAmount: dec(110, 18), + extraParams: { from: carol, value: _998_Ether }, + }); + const { troveId: dennisTroveId, collateral: D_coll } = await openTrove({ + ICR: toBN(dec(200, 16)), + extraBoldAmount: dec(110, 18), + extraParams: { from: dennis, value: dec(1000, "ether") }, + }); - /* Alice, Bob, Carol each withdraw 0.5 ETH to their troves, + // Price drops to 100 $/E + await priceFeed.setPrice(dec(100, 18)); + + // Liquidate Dennis + const txD = await troveManager.liquidate(dennisTroveId); + assert.isTrue(txD.receipt.status); + assert.isFalse(await sortedTroves.contains(dennisTroveId)); + + // Price bounces back to 200 $/E + await priceFeed.setPrice(dec(200, 18)); + + // Expected rewards: alice: 1 ETH, bob: 1 ETH, carol: 998 ETH (*0.995) + const alice_ETHReward_1 = await troveManager.getPendingETHReward(aliceTroveId); + const bob_ETHReward_1 = await troveManager.getPendingETHReward(bobTroveId); + const carol_ETHReward_1 = await troveManager.getPendingETHReward(carolTroveId); + + // Expect 1995 ETH in system now + const entireSystemColl_1 = (await activePool.getETHBalance()).add( + await defaultPool.getETHBalance(), + ); + th.assertIsApproximatelyEqual( + entireSystemColl_1, + A_coll.add(B_coll).add(C_coll).add(th.applyLiquidationFee(D_coll)), + ); + + const totalColl = A_coll.add(B_coll).add(C_coll); + th.assertIsApproximatelyEqual( + alice_ETHReward_1.toString(), + th.applyLiquidationFee(D_coll).mul(A_coll).div(totalColl), + ); + th.assertIsApproximatelyEqual( + bob_ETHReward_1.toString(), + th.applyLiquidationFee(D_coll).mul(B_coll).div(totalColl), + ); + th.assertIsApproximatelyEqual( + carol_ETHReward_1.toString(), + th.applyLiquidationFee(D_coll).mul(C_coll).div(totalColl), + ); + + /* Alice, Bob, Carol each withdraw 0.5 ETH to their troves, bringing them to 1.495, 1.495, 1990.51 total coll each. */ - const withdrawnColl = toBN(dec(500, "finney")); - await borrowerOperations.withdrawColl(aliceTroveId,withdrawnColl, { - from: alice, - }); - await borrowerOperations.withdrawColl(bobTroveId, withdrawnColl, { - from: bob, - }); - await borrowerOperations.withdrawColl(carolTroveId, withdrawnColl, { - from: carol, - }); - - const alice_Coll_1 = (await troveManager.Troves(aliceTroveId))[1] - .add(await troveManager.getPendingETHReward(aliceTroveId)) - .toString(); - - const bob_Coll_1 = (await troveManager.Troves(bobTroveId))[1] - .add(await troveManager.getPendingETHReward(bobTroveId)) - .toString(); - - const carol_Coll_1 = (await troveManager.Troves(carolTroveId))[1] - .add(await troveManager.getPendingETHReward(carolTroveId)) - .toString(); - - const totalColl_1 = A_coll.add(B_coll).add(C_coll); - assert.isAtMost( - th.getDifference( - alice_Coll_1, - A_coll.add( - th.applyLiquidationFee(D_coll).mul(A_coll).div(totalColl_1) - ).sub(withdrawnColl) - ), - 1000 - ); - assert.isAtMost( - th.getDifference( - bob_Coll_1, - B_coll.add( - th.applyLiquidationFee(D_coll).mul(B_coll).div(totalColl_1) - ).sub(withdrawnColl) - ), - 1000 - ); - assert.isAtMost( - th.getDifference( - carol_Coll_1, - C_coll.add( - th.applyLiquidationFee(D_coll).mul(C_coll).div(totalColl_1) - ).sub(withdrawnColl) - ), - 1000 - ); + const withdrawnColl = toBN(dec(500, "finney")); + await borrowerOperations.withdrawColl(aliceTroveId, withdrawnColl, { + from: alice, + }); + await borrowerOperations.withdrawColl(bobTroveId, withdrawnColl, { + from: bob, + }); + await borrowerOperations.withdrawColl(carolTroveId, withdrawnColl, { + from: carol, + }); - //Expect 1993.5 ETH in system now - const entireSystemColl_2 = (await activePool.getETHBalance()).add( - await defaultPool.getETHBalance() - ); - th.assertIsApproximatelyEqual( - entireSystemColl_2, - totalColl - .add(th.applyLiquidationFee(D_coll)) - .sub(withdrawnColl.mul(toBN(3))) - ); + const alice_Coll_1 = (await troveManager.Troves(aliceTroveId))[1] + .add(await troveManager.getPendingETHReward(aliceTroveId)) + .toString(); + + const bob_Coll_1 = (await troveManager.Troves(bobTroveId))[1] + .add(await troveManager.getPendingETHReward(bobTroveId)) + .toString(); + + const carol_Coll_1 = (await troveManager.Troves(carolTroveId))[1] + .add(await troveManager.getPendingETHReward(carolTroveId)) + .toString(); + + const totalColl_1 = A_coll.add(B_coll).add(C_coll); + assert.isAtMost( + th.getDifference( + alice_Coll_1, + A_coll.add( + th.applyLiquidationFee(D_coll).mul(A_coll).div(totalColl_1), + ).sub(withdrawnColl), + ), + 1000, + ); + assert.isAtMost( + th.getDifference( + bob_Coll_1, + B_coll.add( + th.applyLiquidationFee(D_coll).mul(B_coll).div(totalColl_1), + ).sub(withdrawnColl), + ), + 1000, + ); + assert.isAtMost( + th.getDifference( + carol_Coll_1, + C_coll.add( + th.applyLiquidationFee(D_coll).mul(C_coll).div(totalColl_1), + ).sub(withdrawnColl), + ), + 1000, + ); + + // Expect 1993.5 ETH in system now + const entireSystemColl_2 = (await activePool.getETHBalance()).add( + await defaultPool.getETHBalance(), + ); + th.assertIsApproximatelyEqual( + entireSystemColl_2, + totalColl + .add(th.applyLiquidationFee(D_coll)) + .sub(withdrawnColl.mul(toBN(3))), + ); - // E opens with another 1993.5 ETH - const { troveId: erinTroveId, collateral: E_coll } = await openTrove({ - ICR: toBN(dec(200, 16)), - extraParams: { from: erin, value: entireSystemColl_2 }, - }); + // E opens with another 1993.5 ETH + const { troveId: erinTroveId, collateral: E_coll } = await openTrove({ + ICR: toBN(dec(200, 16)), + extraParams: { from: erin, value: entireSystemColl_2 }, + }); - // Price drops to 100 $/E - await priceFeed.setPrice(dec(100, 18)); + // Price drops to 100 $/E + await priceFeed.setPrice(dec(100, 18)); - // Liquidate Erin - const txE = await troveManager.liquidate(erinTroveId); - assert.isTrue(txE.receipt.status); - assert.isFalse(await sortedTroves.contains(erinTroveId)); + // Liquidate Erin + const txE = await troveManager.liquidate(erinTroveId); + assert.isTrue(txE.receipt.status); + assert.isFalse(await sortedTroves.contains(erinTroveId)); - /* Expected ETH rewards: + /* Expected ETH rewards: Carol = 1990.51/1993.5 * 1993.5*0.995 = 1980.55745 ETH Alice = 1.495/1993.5 * 1993.5*0.995 = 1.487525 ETH Bob = 1.495/1993.5 * 1993.5*0.995 = 1.487525 ETH @@ -1820,649 +1811,648 @@ contract( "TroveManager - Redistribution reward calculations", total = 3977.0325 ETH */ - const alice_Coll_2 = (await troveManager.Troves(aliceTroveId))[1] - .add(await troveManager.getPendingETHReward(aliceTroveId)) - .toString(); - - const bob_Coll_2 = (await troveManager.Troves(bobTroveId))[1] - .add(await troveManager.getPendingETHReward(bobTroveId)) - .toString(); - - const carol_Coll_2 = (await troveManager.Troves(carolTroveId))[1] - .add(await troveManager.getPendingETHReward(carolTroveId)) - .toString(); - - const totalCollAfterL1 = A_coll.add(B_coll) - .add(C_coll) - .add(th.applyLiquidationFee(D_coll)) - .sub(withdrawnColl.mul(toBN(3))); - const A_collAfterL1 = A_coll.add( - A_coll.mul(th.applyLiquidationFee(D_coll)).div( - A_coll.add(B_coll).add(C_coll) - ) - ).sub(withdrawnColl); - const expected_A_coll = A_collAfterL1.add( - A_collAfterL1.mul(th.applyLiquidationFee(E_coll)).div(totalCollAfterL1) - ); - const B_collAfterL1 = B_coll.add( - B_coll.mul(th.applyLiquidationFee(D_coll)).div( - A_coll.add(B_coll).add(C_coll) - ) - ).sub(withdrawnColl); - const expected_B_coll = B_collAfterL1.add( - B_collAfterL1.mul(th.applyLiquidationFee(E_coll)).div(totalCollAfterL1) - ); - const C_collAfterL1 = C_coll.add( - C_coll.mul(th.applyLiquidationFee(D_coll)).div( - A_coll.add(B_coll).add(C_coll) - ) - ).sub(withdrawnColl); - const expected_C_coll = C_collAfterL1.add( - C_collAfterL1.mul(th.applyLiquidationFee(E_coll)).div(totalCollAfterL1) - ); - - assert.isAtMost(th.getDifference(alice_Coll_2, expected_A_coll), 1000); - assert.isAtMost(th.getDifference(bob_Coll_2, expected_B_coll), 1000); - assert.isAtMost(th.getDifference(carol_Coll_2, expected_C_coll), 1000); - - //Expect 3977.0325 ETH in system now - const entireSystemColl_3 = (await activePool.getETHBalance()).add( - await defaultPool.getETHBalance() - ); - th.assertIsApproximatelyEqual( - entireSystemColl_3, - totalCollAfterL1.add(th.applyLiquidationFee(E_coll)) - ); - - // check Bold gas compensation - assert.equal((await boldToken.balanceOf(owner)).toString(), dec(400, 18)); - }); - - // For calculations of correct values used in test, see scenario 1: - // https://docs.google.com/spreadsheets/d/1F5p3nZy749K5jwO-bwJeTsRoY7ewMfWIQ3QHtokxqzo/edit?usp=sharing - it("redistribution, all operations: A,B,C open. Liq(A). D opens. B adds, C withdraws. Liq(B). E & F open. D adds. Liq(F). Distributes correct rewards", async () => { - // A, B, C open troves - const { troveId: aliceTroveId, collateral: A_coll } = await openTrove({ - ICR: toBN(dec(200, 16)), - extraBoldAmount: dec(100, 18), - extraParams: { from: alice }, - }); - const { troveId: bobTroveId, collateral: B_coll } = await openTrove({ - ICR: toBN(dec(200, 16)), - extraBoldAmount: dec(100, 18), - extraParams: { from: bob }, - }); - const { troveId: carolTroveId, collateral: C_coll } = await openTrove({ - ICR: toBN(dec(200, 16)), - extraBoldAmount: dec(100, 18), - extraParams: { from: carol }, - }); - - // Price drops to 1 $/E - await priceFeed.setPrice(dec(1, 18)); - - // Liquidate A - const txA = await troveManager.liquidate(aliceTroveId); - assert.isTrue(txA.receipt.status); - assert.isFalse(await sortedTroves.contains(aliceTroveId)); - - // Check rewards for B and C - const B_pendingRewardsAfterL1 = th - .applyLiquidationFee(A_coll) - .mul(B_coll) - .div(B_coll.add(C_coll)); - const C_pendingRewardsAfterL1 = th - .applyLiquidationFee(A_coll) - .mul(C_coll) - .div(B_coll.add(C_coll)); - assert.isAtMost( - th.getDifference( - await troveManager.getPendingETHReward(bobTroveId), - B_pendingRewardsAfterL1 - ), - 1000000 - ); - assert.isAtMost( - th.getDifference( - await troveManager.getPendingETHReward(carolTroveId), - C_pendingRewardsAfterL1 - ), - 1000000 - ); - - const totalStakesSnapshotAfterL1 = B_coll.add(C_coll); - const totalCollateralSnapshotAfterL1 = totalStakesSnapshotAfterL1.add( - th.applyLiquidationFee(A_coll) - ); - th.assertIsApproximatelyEqual( - await troveManager.totalStakesSnapshot(), - totalStakesSnapshotAfterL1 - ); - th.assertIsApproximatelyEqual( - await troveManager.totalCollateralSnapshot(), - totalCollateralSnapshotAfterL1 - ); - - // Price rises to 1000 - await priceFeed.setPrice(dec(1000, 18)); - - // D opens trove - const { troveId: dennisTroveId, collateral: D_coll, totalDebt: D_totalDebt } = await openTrove({ - ICR: toBN(dec(200, 16)), - extraBoldAmount: dec(110, 18), - extraParams: { from: dennis }, - }); - - //Bob adds 1 ETH to his trove - const B_addedColl = toBN(dec(1, "ether")); - await th.addCollWrapper(contracts, { - from: bob, - value: B_addedColl, - }); - - //Carol withdraws 1 ETH from her trove - const C_withdrawnColl = toBN(dec(1, "ether")); - await borrowerOperations.withdrawColl(carolTroveId, C_withdrawnColl, { - from: carol, - }); - - const B_collAfterL1 = B_coll.add(B_pendingRewardsAfterL1).add( - B_addedColl - ); - const C_collAfterL1 = C_coll.add(C_pendingRewardsAfterL1).sub( - C_withdrawnColl - ); - - // Price drops - await priceFeed.setPrice(dec(1, 18)); - - // Liquidate B - const txB = await troveManager.liquidate(bobTroveId); - assert.isTrue(txB.receipt.status); - assert.isFalse(await sortedTroves.contains(bobTroveId)); - - // Check rewards for C and D - const C_pendingRewardsAfterL2 = C_collAfterL1.mul( - th.applyLiquidationFee(B_collAfterL1) - ).div(C_collAfterL1.add(D_coll)); - const D_pendingRewardsAfterL2 = D_coll.mul( - th.applyLiquidationFee(B_collAfterL1) - ).div(C_collAfterL1.add(D_coll)); - assert.isAtMost( - th.getDifference( - await troveManager.getPendingETHReward(carolTroveId), - C_pendingRewardsAfterL2 - ), - 1000000 - ); - assert.isAtMost( - th.getDifference( - await troveManager.getPendingETHReward(dennisTroveId), - D_pendingRewardsAfterL2 - ), - 1000000 - ); + const alice_Coll_2 = (await troveManager.Troves(aliceTroveId))[1] + .add(await troveManager.getPendingETHReward(aliceTroveId)) + .toString(); + + const bob_Coll_2 = (await troveManager.Troves(bobTroveId))[1] + .add(await troveManager.getPendingETHReward(bobTroveId)) + .toString(); + + const carol_Coll_2 = (await troveManager.Troves(carolTroveId))[1] + .add(await troveManager.getPendingETHReward(carolTroveId)) + .toString(); + + const totalCollAfterL1 = A_coll.add(B_coll) + .add(C_coll) + .add(th.applyLiquidationFee(D_coll)) + .sub(withdrawnColl.mul(toBN(3))); + const A_collAfterL1 = A_coll.add( + A_coll.mul(th.applyLiquidationFee(D_coll)).div( + A_coll.add(B_coll).add(C_coll), + ), + ).sub(withdrawnColl); + const expected_A_coll = A_collAfterL1.add( + A_collAfterL1.mul(th.applyLiquidationFee(E_coll)).div(totalCollAfterL1), + ); + const B_collAfterL1 = B_coll.add( + B_coll.mul(th.applyLiquidationFee(D_coll)).div( + A_coll.add(B_coll).add(C_coll), + ), + ).sub(withdrawnColl); + const expected_B_coll = B_collAfterL1.add( + B_collAfterL1.mul(th.applyLiquidationFee(E_coll)).div(totalCollAfterL1), + ); + const C_collAfterL1 = C_coll.add( + C_coll.mul(th.applyLiquidationFee(D_coll)).div( + A_coll.add(B_coll).add(C_coll), + ), + ).sub(withdrawnColl); + const expected_C_coll = C_collAfterL1.add( + C_collAfterL1.mul(th.applyLiquidationFee(E_coll)).div(totalCollAfterL1), + ); + + assert.isAtMost(th.getDifference(alice_Coll_2, expected_A_coll), 1000); + assert.isAtMost(th.getDifference(bob_Coll_2, expected_B_coll), 1000); + assert.isAtMost(th.getDifference(carol_Coll_2, expected_C_coll), 1000); + + // Expect 3977.0325 ETH in system now + const entireSystemColl_3 = (await activePool.getETHBalance()).add( + await defaultPool.getETHBalance(), + ); + th.assertIsApproximatelyEqual( + entireSystemColl_3, + totalCollAfterL1.add(th.applyLiquidationFee(E_coll)), + ); + + // check Bold gas compensation + assert.equal((await boldToken.balanceOf(owner)).toString(), dec(400, 18)); + }); + + // For calculations of correct values used in test, see scenario 1: + // https://docs.google.com/spreadsheets/d/1F5p3nZy749K5jwO-bwJeTsRoY7ewMfWIQ3QHtokxqzo/edit?usp=sharing + it("redistribution, all operations: A,B,C open. Liq(A). D opens. B adds, C withdraws. Liq(B). E & F open. D adds. Liq(F). Distributes correct rewards", async () => { + // A, B, C open troves + const { troveId: aliceTroveId, collateral: A_coll } = await openTrove({ + ICR: toBN(dec(200, 16)), + extraBoldAmount: dec(100, 18), + extraParams: { from: alice }, + }); + const { troveId: bobTroveId, collateral: B_coll } = await openTrove({ + ICR: toBN(dec(200, 16)), + extraBoldAmount: dec(100, 18), + extraParams: { from: bob }, + }); + const { troveId: carolTroveId, collateral: C_coll } = await openTrove({ + ICR: toBN(dec(200, 16)), + extraBoldAmount: dec(100, 18), + extraParams: { from: carol }, + }); - const totalStakesSnapshotAfterL2 = totalStakesSnapshotAfterL1 - .add( - D_coll.mul(totalStakesSnapshotAfterL1).div( - totalCollateralSnapshotAfterL1 - ) - ) - .sub(B_coll) - .sub( - C_withdrawnColl.mul(totalStakesSnapshotAfterL1).div( - totalCollateralSnapshotAfterL1 - ) - ); - const defaultedAmountAfterL2 = th - .applyLiquidationFee( - B_coll.add(B_addedColl).add(B_pendingRewardsAfterL1) - ) - .add(C_pendingRewardsAfterL1); - const totalCollateralSnapshotAfterL2 = C_coll.sub(C_withdrawnColl) - .add(D_coll) - .add(defaultedAmountAfterL2); - th.assertIsApproximatelyEqual( - await troveManager.totalStakesSnapshot(), - totalStakesSnapshotAfterL2 - ); - th.assertIsApproximatelyEqual( - await troveManager.totalCollateralSnapshot(), - totalCollateralSnapshotAfterL2 - ); + // Price drops to 1 $/E + await priceFeed.setPrice(dec(1, 18)); + + // Liquidate A + const txA = await troveManager.liquidate(aliceTroveId); + assert.isTrue(txA.receipt.status); + assert.isFalse(await sortedTroves.contains(aliceTroveId)); + + // Check rewards for B and C + const B_pendingRewardsAfterL1 = th + .applyLiquidationFee(A_coll) + .mul(B_coll) + .div(B_coll.add(C_coll)); + const C_pendingRewardsAfterL1 = th + .applyLiquidationFee(A_coll) + .mul(C_coll) + .div(B_coll.add(C_coll)); + assert.isAtMost( + th.getDifference( + await troveManager.getPendingETHReward(bobTroveId), + B_pendingRewardsAfterL1, + ), + 1000000, + ); + assert.isAtMost( + th.getDifference( + await troveManager.getPendingETHReward(carolTroveId), + C_pendingRewardsAfterL1, + ), + 1000000, + ); + + const totalStakesSnapshotAfterL1 = B_coll.add(C_coll); + const totalCollateralSnapshotAfterL1 = totalStakesSnapshotAfterL1.add( + th.applyLiquidationFee(A_coll), + ); + th.assertIsApproximatelyEqual( + await troveManager.totalStakesSnapshot(), + totalStakesSnapshotAfterL1, + ); + th.assertIsApproximatelyEqual( + await troveManager.totalCollateralSnapshot(), + totalCollateralSnapshotAfterL1, + ); + + // Price rises to 1000 + await priceFeed.setPrice(dec(1000, 18)); + + // D opens trove + const { troveId: dennisTroveId, collateral: D_coll, totalDebt: D_totalDebt } = await openTrove({ + ICR: toBN(dec(200, 16)), + extraBoldAmount: dec(110, 18), + extraParams: { from: dennis }, + }); - // Price rises to 1000 - await priceFeed.setPrice(dec(1000, 18)); - - // E and F open troves - const { troveId: erinTroveId, collateral: E_coll, totalDebt: E_totalDebt } = await openTrove({ - ICR: toBN(dec(200, 16)), - extraBoldAmount: dec(110, 18), - extraParams: { from: erin }, - }); - const { troveId: freddyTroveId, collateral: F_coll, totalDebt: F_totalDebt } = await openTrove({ - ICR: toBN(dec(200, 16)), - extraBoldAmount: dec(110, 18), - extraParams: { from: freddy }, - }); - - // D tops up - const D_addedColl = toBN(dec(1, "ether")); - await th.addCollWrapper(contracts, { - from: dennis, - value: D_addedColl, - }); - - // Price drops to 1 - await priceFeed.setPrice(dec(1, 18)); - - // Liquidate F - const txF = await troveManager.liquidate(freddyTroveId); - assert.isTrue(txF.receipt.status); - assert.isFalse(await sortedTroves.contains(freddyTroveId)); - - // Grab remaining troves' collateral - const carol_rawColl = (await troveManager.Troves(carolTroveId))[1].toString(); - const carol_pendingETHReward = ( - await troveManager.getPendingETHReward(carolTroveId) - ).toString(); - - const dennis_rawColl = (await troveManager.Troves(dennisTroveId))[1].toString(); - const dennis_pendingETHReward = ( - await troveManager.getPendingETHReward(dennisTroveId) - ).toString(); - - const erin_rawColl = (await troveManager.Troves(erinTroveId))[1].toString(); - const erin_pendingETHReward = ( - await troveManager.getPendingETHReward(erinTroveId) - ).toString(); - - // Check raw collateral of C, D, E - const C_collAfterL2 = C_collAfterL1.add(C_pendingRewardsAfterL2); - const D_collAfterL2 = D_coll.add(D_pendingRewardsAfterL2).add( - D_addedColl - ); - const totalCollForL3 = C_collAfterL2.add(D_collAfterL2).add(E_coll); - const C_collAfterL3 = C_collAfterL2.add( - C_collAfterL2.mul(th.applyLiquidationFee(F_coll)).div(totalCollForL3) - ); - const D_collAfterL3 = D_collAfterL2.add( - D_collAfterL2.mul(th.applyLiquidationFee(F_coll)).div(totalCollForL3) - ); - const E_collAfterL3 = E_coll.add( - E_coll.mul(th.applyLiquidationFee(F_coll)).div(totalCollForL3) - ); - assert.isAtMost(th.getDifference(carol_rawColl, C_collAfterL1), 1000); - assert.isAtMost(th.getDifference(dennis_rawColl, D_collAfterL2), 1000000); - assert.isAtMost(th.getDifference(erin_rawColl, E_coll), 1000); - - // Check pending ETH rewards of C, D, E - assert.isAtMost( - th.getDifference( - carol_pendingETHReward, - C_collAfterL3.sub(C_collAfterL1) - ), - 1000000 - ); - assert.isAtMost( - th.getDifference( - dennis_pendingETHReward, - D_collAfterL3.sub(D_collAfterL2) - ), - 1000000 - ); - assert.isAtMost( - th.getDifference(erin_pendingETHReward, E_collAfterL3.sub(E_coll)), - 1000000 - ); + // Bob adds 1 ETH to his trove + const B_addedColl = toBN(dec(1, "ether")); + await th.addCollWrapper(contracts, { + from: bob, + value: B_addedColl, + }); - // Check systemic collateral - const activeColl = (await activePool.getETHBalance()).toString(); - const defaultColl = (await defaultPool.getETHBalance()).toString(); + // Carol withdraws 1 ETH from her trove + const C_withdrawnColl = toBN(dec(1, "ether")); + await borrowerOperations.withdrawColl(carolTroveId, C_withdrawnColl, { + from: carol, + }); - assert.isAtMost( - th.getDifference( - activeColl, - C_collAfterL1.add(D_collAfterL2.add(E_coll)) + const B_collAfterL1 = B_coll.add(B_pendingRewardsAfterL1).add( + B_addedColl, + ); + const C_collAfterL1 = C_coll.add(C_pendingRewardsAfterL1).sub( + C_withdrawnColl, + ); + + // Price drops + await priceFeed.setPrice(dec(1, 18)); + + // Liquidate B + const txB = await troveManager.liquidate(bobTroveId); + assert.isTrue(txB.receipt.status); + assert.isFalse(await sortedTroves.contains(bobTroveId)); + + // Check rewards for C and D + const C_pendingRewardsAfterL2 = C_collAfterL1.mul( + th.applyLiquidationFee(B_collAfterL1), + ).div(C_collAfterL1.add(D_coll)); + const D_pendingRewardsAfterL2 = D_coll.mul( + th.applyLiquidationFee(B_collAfterL1), + ).div(C_collAfterL1.add(D_coll)); + assert.isAtMost( + th.getDifference( + await troveManager.getPendingETHReward(carolTroveId), + C_pendingRewardsAfterL2, + ), + 1000000, + ); + assert.isAtMost( + th.getDifference( + await troveManager.getPendingETHReward(dennisTroveId), + D_pendingRewardsAfterL2, + ), + 1000000, + ); + + const totalStakesSnapshotAfterL2 = totalStakesSnapshotAfterL1 + .add( + D_coll.mul(totalStakesSnapshotAfterL1).div( + totalCollateralSnapshotAfterL1, ), - 1000000 - ); - assert.isAtMost( - th.getDifference( - defaultColl, - C_collAfterL3.sub(C_collAfterL1) - .add(D_collAfterL3.sub(D_collAfterL2)) - .add(E_collAfterL3.sub(E_coll)) + ) + .sub(B_coll) + .sub( + C_withdrawnColl.mul(totalStakesSnapshotAfterL1).div( + totalCollateralSnapshotAfterL1, ), - 1000000 - ); - - // Check system snapshots - const totalStakesSnapshotAfterL3 = totalStakesSnapshotAfterL2.add( - D_addedColl.add(E_coll) - .mul(totalStakesSnapshotAfterL2) - .div(totalCollateralSnapshotAfterL2) - ); - const totalCollateralSnapshotAfterL3 = C_coll.sub(C_withdrawnColl) - .add(D_coll) - .add(D_addedColl) - .add(E_coll) - .add(defaultedAmountAfterL2) - .add(th.applyLiquidationFee(F_coll)); - const totalStakesSnapshot = ( - await troveManager.totalStakesSnapshot() - ).toString(); - const totalCollateralSnapshot = ( - await troveManager.totalCollateralSnapshot() - ).toString(); - th.assertIsApproximatelyEqual( - totalStakesSnapshot, - totalStakesSnapshotAfterL3 - ); - th.assertIsApproximatelyEqual( - totalCollateralSnapshot, - totalCollateralSnapshotAfterL3 ); + const defaultedAmountAfterL2 = th + .applyLiquidationFee( + B_coll.add(B_addedColl).add(B_pendingRewardsAfterL1), + ) + .add(C_pendingRewardsAfterL1); + const totalCollateralSnapshotAfterL2 = C_coll.sub(C_withdrawnColl) + .add(D_coll) + .add(defaultedAmountAfterL2); + th.assertIsApproximatelyEqual( + await troveManager.totalStakesSnapshot(), + totalStakesSnapshotAfterL2, + ); + th.assertIsApproximatelyEqual( + await troveManager.totalCollateralSnapshot(), + totalCollateralSnapshotAfterL2, + ); + + // Price rises to 1000 + await priceFeed.setPrice(dec(1000, 18)); + + // E and F open troves + const { troveId: erinTroveId, collateral: E_coll, totalDebt: E_totalDebt } = await openTrove({ + ICR: toBN(dec(200, 16)), + extraBoldAmount: dec(110, 18), + extraParams: { from: erin }, + }); + const { troveId: freddyTroveId, collateral: F_coll, totalDebt: F_totalDebt } = await openTrove({ + ICR: toBN(dec(200, 16)), + extraBoldAmount: dec(110, 18), + extraParams: { from: freddy }, + }); - // check Bold gas compensation - assert.equal((await boldToken.balanceOf(owner)).toString(), dec(600, 18)); + // D tops up + const D_addedColl = toBN(dec(1, "ether")); + await th.addCollWrapper(contracts, { + from: dennis, + value: D_addedColl, }); - // For calculations of correct values used in test, see scenario 2: - // https://docs.google.com/spreadsheets/d/1F5p3nZy749K5jwO-bwJeTsRoY7ewMfWIQ3QHtokxqzo/edit?usp=sharing - it("redistribution, all operations: A,B,C open. Liq(A). D opens. B adds, C withdraws. Liq(B). E & F open. D adds. Liq(F). Varying coll. Distributes correct rewards", async () => { - /* A, B, C open troves. + // Price drops to 1 + await priceFeed.setPrice(dec(1, 18)); + + // Liquidate F + const txF = await troveManager.liquidate(freddyTroveId); + assert.isTrue(txF.receipt.status); + assert.isFalse(await sortedTroves.contains(freddyTroveId)); + + // Grab remaining troves' collateral + const carol_rawColl = (await troveManager.Troves(carolTroveId))[1].toString(); + const carol_pendingETHReward = ( + await troveManager.getPendingETHReward(carolTroveId) + ).toString(); + + const dennis_rawColl = (await troveManager.Troves(dennisTroveId))[1].toString(); + const dennis_pendingETHReward = ( + await troveManager.getPendingETHReward(dennisTroveId) + ).toString(); + + const erin_rawColl = (await troveManager.Troves(erinTroveId))[1].toString(); + const erin_pendingETHReward = ( + await troveManager.getPendingETHReward(erinTroveId) + ).toString(); + + // Check raw collateral of C, D, E + const C_collAfterL2 = C_collAfterL1.add(C_pendingRewardsAfterL2); + const D_collAfterL2 = D_coll.add(D_pendingRewardsAfterL2).add( + D_addedColl, + ); + const totalCollForL3 = C_collAfterL2.add(D_collAfterL2).add(E_coll); + const C_collAfterL3 = C_collAfterL2.add( + C_collAfterL2.mul(th.applyLiquidationFee(F_coll)).div(totalCollForL3), + ); + const D_collAfterL3 = D_collAfterL2.add( + D_collAfterL2.mul(th.applyLiquidationFee(F_coll)).div(totalCollForL3), + ); + const E_collAfterL3 = E_coll.add( + E_coll.mul(th.applyLiquidationFee(F_coll)).div(totalCollForL3), + ); + assert.isAtMost(th.getDifference(carol_rawColl, C_collAfterL1), 1000); + assert.isAtMost(th.getDifference(dennis_rawColl, D_collAfterL2), 1000000); + assert.isAtMost(th.getDifference(erin_rawColl, E_coll), 1000); + + // Check pending ETH rewards of C, D, E + assert.isAtMost( + th.getDifference( + carol_pendingETHReward, + C_collAfterL3.sub(C_collAfterL1), + ), + 1000000, + ); + assert.isAtMost( + th.getDifference( + dennis_pendingETHReward, + D_collAfterL3.sub(D_collAfterL2), + ), + 1000000, + ); + assert.isAtMost( + th.getDifference(erin_pendingETHReward, E_collAfterL3.sub(E_coll)), + 1000000, + ); + + // Check systemic collateral + const activeColl = (await activePool.getETHBalance()).toString(); + const defaultColl = (await defaultPool.getETHBalance()).toString(); + + assert.isAtMost( + th.getDifference( + activeColl, + C_collAfterL1.add(D_collAfterL2.add(E_coll)), + ), + 1000000, + ); + assert.isAtMost( + th.getDifference( + defaultColl, + C_collAfterL3.sub(C_collAfterL1) + .add(D_collAfterL3.sub(D_collAfterL2)) + .add(E_collAfterL3.sub(E_coll)), + ), + 1000000, + ); + + // Check system snapshots + const totalStakesSnapshotAfterL3 = totalStakesSnapshotAfterL2.add( + D_addedColl.add(E_coll) + .mul(totalStakesSnapshotAfterL2) + .div(totalCollateralSnapshotAfterL2), + ); + const totalCollateralSnapshotAfterL3 = C_coll.sub(C_withdrawnColl) + .add(D_coll) + .add(D_addedColl) + .add(E_coll) + .add(defaultedAmountAfterL2) + .add(th.applyLiquidationFee(F_coll)); + const totalStakesSnapshot = ( + await troveManager.totalStakesSnapshot() + ).toString(); + const totalCollateralSnapshot = ( + await troveManager.totalCollateralSnapshot() + ).toString(); + th.assertIsApproximatelyEqual( + totalStakesSnapshot, + totalStakesSnapshotAfterL3, + ); + th.assertIsApproximatelyEqual( + totalCollateralSnapshot, + totalCollateralSnapshotAfterL3, + ); + + // check Bold gas compensation + assert.equal((await boldToken.balanceOf(owner)).toString(), dec(600, 18)); + }); + + // For calculations of correct values used in test, see scenario 2: + // https://docs.google.com/spreadsheets/d/1F5p3nZy749K5jwO-bwJeTsRoY7ewMfWIQ3QHtokxqzo/edit?usp=sharing + it("redistribution, all operations: A,B,C open. Liq(A). D opens. B adds, C withdraws. Liq(B). E & F open. D adds. Liq(F). Varying coll. Distributes correct rewards", async () => { + /* A, B, C open troves. A: 450 ETH B: 8901 ETH C: 23.902 ETH */ - const { troveId: aliceTroveId, collateral: A_coll } = await openTrove({ - ICR: toBN(dec(90000, 16)), - extraParams: { from: alice, value: toBN("450000000000000000000") }, - }); - const { troveId: bobTroveId, collateral: B_coll } = await openTrove({ - ICR: toBN(dec(1800000, 16)), - extraParams: { from: bob, value: toBN("8901000000000000000000") }, - }); - const { troveId: carolTroveId, collateral: C_coll } = await openTrove({ - ICR: toBN(dec(4600, 16)), - extraParams: { from: carol, value: toBN("23902000000000000000") }, - }); - - // Price drops - await priceFeed.setPrice("1"); - - // Liquidate A - const txA = await troveManager.liquidate(aliceTroveId); - assert.isTrue(txA.receipt.status); - assert.isFalse(await sortedTroves.contains(aliceTroveId)); - - // Check rewards for B and C - const B_pendingRewardsAfterL1 = th - .applyLiquidationFee(A_coll) - .mul(B_coll) - .div(B_coll.add(C_coll)); - const C_pendingRewardsAfterL1 = th - .applyLiquidationFee(A_coll) - .mul(C_coll) - .div(B_coll.add(C_coll)); - assert.isAtMost( - th.getDifference( - await troveManager.getPendingETHReward(bobTroveId), - B_pendingRewardsAfterL1 - ), - 1000000 - ); - assert.isAtMost( - th.getDifference( - await troveManager.getPendingETHReward(carolTroveId), - C_pendingRewardsAfterL1 - ), - 1000000 - ); + const { troveId: aliceTroveId, collateral: A_coll } = await openTrove({ + ICR: toBN(dec(90000, 16)), + extraParams: { from: alice, value: toBN("450000000000000000000") }, + }); + const { troveId: bobTroveId, collateral: B_coll } = await openTrove({ + ICR: toBN(dec(1800000, 16)), + extraParams: { from: bob, value: toBN("8901000000000000000000") }, + }); + const { troveId: carolTroveId, collateral: C_coll } = await openTrove({ + ICR: toBN(dec(4600, 16)), + extraParams: { from: carol, value: toBN("23902000000000000000") }, + }); - const totalStakesSnapshotAfterL1 = B_coll.add(C_coll); - const totalCollateralSnapshotAfterL1 = totalStakesSnapshotAfterL1.add( - th.applyLiquidationFee(A_coll) - ); - th.assertIsApproximatelyEqual( - await troveManager.totalStakesSnapshot(), - totalStakesSnapshotAfterL1 - ); - th.assertIsApproximatelyEqual( - await troveManager.totalCollateralSnapshot(), - totalCollateralSnapshotAfterL1 - ); + // Price drops + await priceFeed.setPrice("1"); + + // Liquidate A + const txA = await troveManager.liquidate(aliceTroveId); + assert.isTrue(txA.receipt.status); + assert.isFalse(await sortedTroves.contains(aliceTroveId)); + + // Check rewards for B and C + const B_pendingRewardsAfterL1 = th + .applyLiquidationFee(A_coll) + .mul(B_coll) + .div(B_coll.add(C_coll)); + const C_pendingRewardsAfterL1 = th + .applyLiquidationFee(A_coll) + .mul(C_coll) + .div(B_coll.add(C_coll)); + assert.isAtMost( + th.getDifference( + await troveManager.getPendingETHReward(bobTroveId), + B_pendingRewardsAfterL1, + ), + 1000000, + ); + assert.isAtMost( + th.getDifference( + await troveManager.getPendingETHReward(carolTroveId), + C_pendingRewardsAfterL1, + ), + 1000000, + ); + + const totalStakesSnapshotAfterL1 = B_coll.add(C_coll); + const totalCollateralSnapshotAfterL1 = totalStakesSnapshotAfterL1.add( + th.applyLiquidationFee(A_coll), + ); + th.assertIsApproximatelyEqual( + await troveManager.totalStakesSnapshot(), + totalStakesSnapshotAfterL1, + ); + th.assertIsApproximatelyEqual( + await troveManager.totalCollateralSnapshot(), + totalCollateralSnapshotAfterL1, + ); + + // Price rises + await priceFeed.setPrice(dec(1, 27)); + + // D opens trove: 0.035 ETH + const { troveId: dennisTroveId, collateral: D_coll, totalDebt: D_totalDebt } = await openTrove({ + extraBoldAmount: dec(100, 18), + extraParams: { from: dennis, value: toBN(dec(35, 15)) }, + }); - // Price rises - await priceFeed.setPrice(dec(1, 27)); - - // D opens trove: 0.035 ETH - const { troveId: dennisTroveId, collateral: D_coll, totalDebt: D_totalDebt } = await openTrove({ - extraBoldAmount: dec(100, 18), - extraParams: { from: dennis, value: toBN(dec(35, 15)) }, - }); - - // Bob adds 11.33909 ETH to his trove - const B_addedColl = toBN("11339090000000000000"); - await th.addCollWrapper(contracts, { - from: bob, - value: B_addedColl, - }); - - // Carol withdraws 15 ETH from her trove - const C_withdrawnColl = toBN(dec(15, "ether")); - await borrowerOperations.withdrawColl(carolTroveId, C_withdrawnColl, { - from: carol, - }); - - const B_collAfterL1 = B_coll.add(B_pendingRewardsAfterL1).add( - B_addedColl - ); - const C_collAfterL1 = C_coll.add(C_pendingRewardsAfterL1).sub( - C_withdrawnColl - ); + // Bob adds 11.33909 ETH to his trove + const B_addedColl = toBN("11339090000000000000"); + await th.addCollWrapper(contracts, { + from: bob, + value: B_addedColl, + }); + + // Carol withdraws 15 ETH from her trove + const C_withdrawnColl = toBN(dec(15, "ether")); + await borrowerOperations.withdrawColl(carolTroveId, C_withdrawnColl, { + from: carol, + }); - // Price drops - await priceFeed.setPrice("1"); - - // Liquidate B - const txB = await troveManager.liquidate(bobTroveId); - assert.isTrue(txB.receipt.status); - assert.isFalse(await sortedTroves.contains(bobTroveId)); - - // Check rewards for C and D - const C_pendingRewardsAfterL2 = C_collAfterL1.mul( - th.applyLiquidationFee(B_collAfterL1) - ).div(C_collAfterL1.add(D_coll)); - const D_pendingRewardsAfterL2 = D_coll.mul( - th.applyLiquidationFee(B_collAfterL1) - ).div(C_collAfterL1.add(D_coll)); - const C_collAfterL2 = C_collAfterL1.add(C_pendingRewardsAfterL2); - assert.isAtMost( - th.getDifference( - await troveManager.getPendingETHReward(carolTroveId), - C_pendingRewardsAfterL2 + const B_collAfterL1 = B_coll.add(B_pendingRewardsAfterL1).add( + B_addedColl, + ); + const C_collAfterL1 = C_coll.add(C_pendingRewardsAfterL1).sub( + C_withdrawnColl, + ); + + // Price drops + await priceFeed.setPrice("1"); + + // Liquidate B + const txB = await troveManager.liquidate(bobTroveId); + assert.isTrue(txB.receipt.status); + assert.isFalse(await sortedTroves.contains(bobTroveId)); + + // Check rewards for C and D + const C_pendingRewardsAfterL2 = C_collAfterL1.mul( + th.applyLiquidationFee(B_collAfterL1), + ).div(C_collAfterL1.add(D_coll)); + const D_pendingRewardsAfterL2 = D_coll.mul( + th.applyLiquidationFee(B_collAfterL1), + ).div(C_collAfterL1.add(D_coll)); + const C_collAfterL2 = C_collAfterL1.add(C_pendingRewardsAfterL2); + assert.isAtMost( + th.getDifference( + await troveManager.getPendingETHReward(carolTroveId), + C_pendingRewardsAfterL2, + ), + 10000000, + ); + assert.isAtMost( + th.getDifference( + await troveManager.getPendingETHReward(dennisTroveId), + D_pendingRewardsAfterL2, + ), + 10000000, + ); + + const totalStakesSnapshotAfterL2 = totalStakesSnapshotAfterL1 + .add( + D_coll.mul(totalStakesSnapshotAfterL1).div( + totalCollateralSnapshotAfterL1, ), - 10000000 - ); - assert.isAtMost( - th.getDifference( - await troveManager.getPendingETHReward(dennisTroveId), - D_pendingRewardsAfterL2 + ) + .sub(B_coll) + .sub( + C_withdrawnColl.mul(totalStakesSnapshotAfterL1).div( + totalCollateralSnapshotAfterL1, ), - 10000000 - ); - - const totalStakesSnapshotAfterL2 = totalStakesSnapshotAfterL1 - .add( - D_coll.mul(totalStakesSnapshotAfterL1).div( - totalCollateralSnapshotAfterL1 - ) - ) - .sub(B_coll) - .sub( - C_withdrawnColl.mul(totalStakesSnapshotAfterL1).div( - totalCollateralSnapshotAfterL1 - ) - ); - const defaultedAmountAfterL2 = th - .applyLiquidationFee( - B_coll.add(B_addedColl).add(B_pendingRewardsAfterL1) - ) - .add(C_pendingRewardsAfterL1); - const totalCollateralSnapshotAfterL2 = C_coll.sub(C_withdrawnColl) - .add(D_coll) - .add(defaultedAmountAfterL2); - th.assertIsApproximatelyEqual( - await troveManager.totalStakesSnapshot(), - totalStakesSnapshotAfterL2 - ); - th.assertIsApproximatelyEqual( - await troveManager.totalCollateralSnapshot(), - totalCollateralSnapshotAfterL2 ); - - // Price rises - await priceFeed.setPrice(dec(1, 27)); - - /* E and F open troves. + const defaultedAmountAfterL2 = th + .applyLiquidationFee( + B_coll.add(B_addedColl).add(B_pendingRewardsAfterL1), + ) + .add(C_pendingRewardsAfterL1); + const totalCollateralSnapshotAfterL2 = C_coll.sub(C_withdrawnColl) + .add(D_coll) + .add(defaultedAmountAfterL2); + th.assertIsApproximatelyEqual( + await troveManager.totalStakesSnapshot(), + totalStakesSnapshotAfterL2, + ); + th.assertIsApproximatelyEqual( + await troveManager.totalCollateralSnapshot(), + totalCollateralSnapshotAfterL2, + ); + + // Price rises + await priceFeed.setPrice(dec(1, 27)); + + /* E and F open troves. E: 10000 ETH F: 0.0007 ETH */ - const { troveId: erinTroveId, collateral: E_coll, totalDebt: E_totalDebt } = await openTrove({ - extraBoldAmount: dec(100, 18), - extraParams: { from: erin, value: toBN(dec(1, 22)) }, - }); - const { troveId: freddyTroveId, collateral: F_coll, totalDebt: F_totalDebt } = await openTrove({ - extraBoldAmount: dec(100, 18), - extraParams: { from: freddy, value: toBN("700000000000000") }, - }); - - // D tops up - const D_addedColl = toBN(dec(1, "ether")); - await th.addCollWrapper(contracts, { - from: dennis, - value: D_addedColl, - }); - - const D_collAfterL2 = D_coll.add(D_pendingRewardsAfterL2).add( - D_addedColl - ); - - // Price drops - await priceFeed.setPrice("1"); - - // Liquidate F - const txF = await troveManager.liquidate(freddyTroveId); - assert.isTrue(txF.receipt.status); - assert.isFalse(await sortedTroves.contains(freddyTroveId)); - - // Grab remaining troves' collateral - const carol_rawColl = (await troveManager.Troves(carolTroveId))[1].toString(); - const carol_pendingETHReward = ( - await troveManager.getPendingETHReward(carolTroveId) - ).toString(); - const carol_Stake = (await troveManager.Troves(carolTroveId))[2].toString(); - - const dennis_rawColl = (await troveManager.Troves(dennisTroveId))[1].toString(); - const dennis_pendingETHReward = ( - await troveManager.getPendingETHReward(dennisTroveId) - ).toString(); - const dennis_Stake = (await troveManager.Troves(dennisTroveId))[2].toString(); - - const erin_rawColl = (await troveManager.Troves(erinTroveId))[1].toString(); - const erin_pendingETHReward = ( - await troveManager.getPendingETHReward(erinTroveId) - ).toString(); - const erin_Stake = (await troveManager.Troves(erinTroveId))[2].toString(); - - // Check raw collateral of C, D, E - const totalCollForL3 = C_collAfterL2.add(D_collAfterL2).add(E_coll); - const C_collAfterL3 = C_collAfterL2.add( - C_collAfterL2.mul(th.applyLiquidationFee(F_coll)).div(totalCollForL3) - ); - const D_collAfterL3 = D_collAfterL2.add( - D_collAfterL2.mul(th.applyLiquidationFee(F_coll)).div(totalCollForL3) - ); - const E_collAfterL3 = E_coll.add( - E_coll.mul(th.applyLiquidationFee(F_coll)).div(totalCollForL3) - ); - assert.isAtMost(th.getDifference(carol_rawColl, C_collAfterL1), 1000); - assert.isAtMost(th.getDifference(dennis_rawColl, D_collAfterL2), 1000000); - assert.isAtMost(th.getDifference(erin_rawColl, E_coll), 1000); - - // Check pending ETH rewards of C, D, E - assert.isAtMost( - th.getDifference( - carol_pendingETHReward, - C_collAfterL3.sub(C_collAfterL1) - ), - 1000000 - ); - assert.isAtMost( - th.getDifference( - dennis_pendingETHReward, - D_collAfterL3.sub(D_collAfterL2) - ), - 1000000 - ); - assert.isAtMost( - th.getDifference(erin_pendingETHReward, E_collAfterL3.sub(E_coll)), - 1000000 - ); - - // Check systemic collateral - const activeColl = (await activePool.getETHBalance()).toString(); - const defaultColl = (await defaultPool.getETHBalance()).toString(); - - assert.isAtMost( - th.getDifference( - activeColl, - C_collAfterL1.add(D_collAfterL2.add(E_coll)) - ), - 1000000 - ); - assert.isAtMost( - th.getDifference( - defaultColl, - C_collAfterL3.sub(C_collAfterL1) - .add(D_collAfterL3.sub(D_collAfterL2)) - .add(E_collAfterL3.sub(E_coll)) - ), - 1000000 - ); - - // Check system snapshots - const totalStakesSnapshotAfterL3 = totalStakesSnapshotAfterL2.add( - D_addedColl.add(E_coll) - .mul(totalStakesSnapshotAfterL2) - .div(totalCollateralSnapshotAfterL2) - ); - const totalCollateralSnapshotAfterL3 = C_coll.sub(C_withdrawnColl) - .add(D_coll) - .add(D_addedColl) - .add(E_coll) - .add(defaultedAmountAfterL2) - .add(th.applyLiquidationFee(F_coll)); - const totalStakesSnapshot = ( - await troveManager.totalStakesSnapshot() - ).toString(); - const totalCollateralSnapshot = ( - await troveManager.totalCollateralSnapshot() - ).toString(); - th.assertIsApproximatelyEqual( - totalStakesSnapshot, - totalStakesSnapshotAfterL3 - ); - th.assertIsApproximatelyEqual( - totalCollateralSnapshot, - totalCollateralSnapshotAfterL3 - ); + const { troveId: erinTroveId, collateral: E_coll, totalDebt: E_totalDebt } = await openTrove({ + extraBoldAmount: dec(100, 18), + extraParams: { from: erin, value: toBN(dec(1, 22)) }, + }); + const { troveId: freddyTroveId, collateral: F_coll, totalDebt: F_totalDebt } = await openTrove({ + extraBoldAmount: dec(100, 18), + extraParams: { from: freddy, value: toBN("700000000000000") }, + }); - // check Bold gas compensation - assert.equal((await boldToken.balanceOf(owner)).toString(), dec(600, 18)); + // D tops up + const D_addedColl = toBN(dec(1, "ether")); + await th.addCollWrapper(contracts, { + from: dennis, + value: D_addedColl, }); - } -); + + const D_collAfterL2 = D_coll.add(D_pendingRewardsAfterL2).add( + D_addedColl, + ); + + // Price drops + await priceFeed.setPrice("1"); + + // Liquidate F + const txF = await troveManager.liquidate(freddyTroveId); + assert.isTrue(txF.receipt.status); + assert.isFalse(await sortedTroves.contains(freddyTroveId)); + + // Grab remaining troves' collateral + const carol_rawColl = (await troveManager.Troves(carolTroveId))[1].toString(); + const carol_pendingETHReward = ( + await troveManager.getPendingETHReward(carolTroveId) + ).toString(); + const carol_Stake = (await troveManager.Troves(carolTroveId))[2].toString(); + + const dennis_rawColl = (await troveManager.Troves(dennisTroveId))[1].toString(); + const dennis_pendingETHReward = ( + await troveManager.getPendingETHReward(dennisTroveId) + ).toString(); + const dennis_Stake = (await troveManager.Troves(dennisTroveId))[2].toString(); + + const erin_rawColl = (await troveManager.Troves(erinTroveId))[1].toString(); + const erin_pendingETHReward = ( + await troveManager.getPendingETHReward(erinTroveId) + ).toString(); + const erin_Stake = (await troveManager.Troves(erinTroveId))[2].toString(); + + // Check raw collateral of C, D, E + const totalCollForL3 = C_collAfterL2.add(D_collAfterL2).add(E_coll); + const C_collAfterL3 = C_collAfterL2.add( + C_collAfterL2.mul(th.applyLiquidationFee(F_coll)).div(totalCollForL3), + ); + const D_collAfterL3 = D_collAfterL2.add( + D_collAfterL2.mul(th.applyLiquidationFee(F_coll)).div(totalCollForL3), + ); + const E_collAfterL3 = E_coll.add( + E_coll.mul(th.applyLiquidationFee(F_coll)).div(totalCollForL3), + ); + assert.isAtMost(th.getDifference(carol_rawColl, C_collAfterL1), 1000); + assert.isAtMost(th.getDifference(dennis_rawColl, D_collAfterL2), 1000000); + assert.isAtMost(th.getDifference(erin_rawColl, E_coll), 1000); + + // Check pending ETH rewards of C, D, E + assert.isAtMost( + th.getDifference( + carol_pendingETHReward, + C_collAfterL3.sub(C_collAfterL1), + ), + 1000000, + ); + assert.isAtMost( + th.getDifference( + dennis_pendingETHReward, + D_collAfterL3.sub(D_collAfterL2), + ), + 1000000, + ); + assert.isAtMost( + th.getDifference(erin_pendingETHReward, E_collAfterL3.sub(E_coll)), + 1000000, + ); + + // Check systemic collateral + const activeColl = (await activePool.getETHBalance()).toString(); + const defaultColl = (await defaultPool.getETHBalance()).toString(); + + assert.isAtMost( + th.getDifference( + activeColl, + C_collAfterL1.add(D_collAfterL2.add(E_coll)), + ), + 1000000, + ); + assert.isAtMost( + th.getDifference( + defaultColl, + C_collAfterL3.sub(C_collAfterL1) + .add(D_collAfterL3.sub(D_collAfterL2)) + .add(E_collAfterL3.sub(E_coll)), + ), + 1000000, + ); + + // Check system snapshots + const totalStakesSnapshotAfterL3 = totalStakesSnapshotAfterL2.add( + D_addedColl.add(E_coll) + .mul(totalStakesSnapshotAfterL2) + .div(totalCollateralSnapshotAfterL2), + ); + const totalCollateralSnapshotAfterL3 = C_coll.sub(C_withdrawnColl) + .add(D_coll) + .add(D_addedColl) + .add(E_coll) + .add(defaultedAmountAfterL2) + .add(th.applyLiquidationFee(F_coll)); + const totalStakesSnapshot = ( + await troveManager.totalStakesSnapshot() + ).toString(); + const totalCollateralSnapshot = ( + await troveManager.totalCollateralSnapshot() + ).toString(); + th.assertIsApproximatelyEqual( + totalStakesSnapshot, + totalStakesSnapshotAfterL3, + ); + th.assertIsApproximatelyEqual( + totalCollateralSnapshot, + totalCollateralSnapshotAfterL3, + ); + + // check Bold gas compensation + assert.equal((await boldToken.balanceOf(owner)).toString(), dec(600, 18)); + }); +}); diff --git a/contracts/test/TroveManager_RecoveryModeTest.js b/contracts/test/TroveManager_RecoveryModeTest.js index 71fff691..56dc5ebe 100644 --- a/contracts/test/TroveManager_RecoveryModeTest.js +++ b/contracts/test/TroveManager_RecoveryModeTest.js @@ -1,4 +1,4 @@ -const { time } = require('@nomicfoundation/hardhat-network-helpers'); +const { time } = require("@nomicfoundation/hardhat-network-helpers"); const { MoneyValues: mv, TestHelper: th, @@ -68,10 +68,8 @@ contract.skip("TroveManager - in Recovery Mode", async (accounts) => { let contracts; - const getOpenTroveBoldAmount = async (totalDebt) => - th.getOpenTroveBoldAmount(contracts, totalDebt); - const getNetBorrowingAmount = async (debtWithFee) => - th.getNetBorrowingAmount(contracts, debtWithFee); + const getOpenTroveBoldAmount = async (totalDebt) => th.getOpenTroveBoldAmount(contracts, totalDebt); + const getNetBorrowingAmount = async (debtWithFee) => th.getNetBorrowingAmount(contracts, debtWithFee); const openTrove = async (params) => th.openTrove(contracts, params); const deployFixture = createDeployAndFundFixture({ @@ -134,7 +132,7 @@ contract.skip("TroveManager - in Recovery Mode", async (accounts) => { const recoveryMode_Before = await th.checkRecoveryMode(contracts); assert.isTrue(recoveryMode_Before); - await th.addCollWrapper(contracts,{ from: alice, value: "1" }); + await th.addCollWrapper(contracts, { from: alice, value: "1" }); const recoveryMode_After = await th.checkRecoveryMode(contracts); assert.isTrue(recoveryMode_After); @@ -151,7 +149,7 @@ contract.skip("TroveManager - in Recovery Mode", async (accounts) => { await borrowerOperations.withdrawColl(_1_Ether, { from: alice, - }); + }); const recoveryMode_After = await th.checkRecoveryMode(contracts); assert.isFalse(recoveryMode_After); @@ -175,7 +173,7 @@ contract.skip("TroveManager - in Recovery Mode", async (accounts) => { const recoveryMode_Before = await th.checkRecoveryMode(contracts); assert.isTrue(recoveryMode_Before); - await th.addCollWrapper(contracts,{ + await th.addCollWrapper(contracts, { from: alice, value: A_coll, }); @@ -269,7 +267,7 @@ contract.skip("TroveManager - in Recovery Mode", async (accounts) => { assert.equal(totalStakesSnaphot_before, A_coll.add(B_coll)); assert.equal( totalCollateralSnapshot_before, - A_coll.add(B_coll).add(th.applyLiquidationFee(D_coll)) + A_coll.add(B_coll).add(th.applyLiquidationFee(D_coll)), ); // 6 + 3*0.995 const A_reward = th @@ -285,17 +283,16 @@ contract.skip("TroveManager - in Recovery Mode", async (accounts) => { await troveManager.liquidate(bob, { from: owner }); const totalStakesSnaphot_After = await troveManager.totalStakesSnapshot(); - const totalCollateralSnapshot_After = - await troveManager.totalCollateralSnapshot(); + const totalCollateralSnapshot_After = await troveManager.totalCollateralSnapshot(); assert.equal(totalStakesSnaphot_After.toString(), A_coll); // total collateral should always be 9 minus gas compensations, as all liquidations in this test case are full redistributions assert.isAtMost( th.getDifference( totalCollateralSnapshot_After, - A_coll.add(A_reward).add(th.applyLiquidationFee(B_coll.add(B_reward))) + A_coll.add(A_reward).add(th.applyLiquidationFee(B_coll.add(B_reward))), ), - 1000 + 1000, ); // 3 + 4.5*0.995 + 1.5*0.995^2 }); @@ -359,7 +356,7 @@ contract.skip("TroveManager - in Recovery Mode", async (accounts) => { }); // Alice deposits to SP - await stabilityPool.provideToSP(spDeposit, {from: alice }); + await stabilityPool.provideToSP(spDeposit, { from: alice }); // check rewards-per-unit-staked before const P_Before = (await stabilityPool.P()).toString(); @@ -406,9 +403,9 @@ contract.skip("TroveManager - in Recovery Mode", async (accounts) => { assert.isAtMost( th.getDifference( TCR, - A_coll.add(B_coll).mul(price).div(A_totalDebt.add(B_totalDebt)) + A_coll.add(B_coll).mul(price).div(A_totalDebt.add(B_totalDebt)), ), - 1000 + 1000, ); const bob_Stake_Before = (await troveManager.Troves(bob))[2]; @@ -487,9 +484,9 @@ contract.skip("TroveManager - in Recovery Mode", async (accounts) => { .div(A_coll.add(B_coll)); /* - Prior to Dennis liquidation, total stakes and total collateral were each 27 ether. - - Check snapshots. Dennis' liquidated collateral is distributed and remains in the system. His + Prior to Dennis liquidation, total stakes and total collateral were each 27 ether. + + Check snapshots. Dennis' liquidated collateral is distributed and remains in the system. His stake is removed, leaving 24+3*0.995 ether total collateral, and 24 ether total stakes. */ const totalStakesSnaphot_2 = ( @@ -501,7 +498,7 @@ contract.skip("TroveManager - in Recovery Mode", async (accounts) => { assert.equal(totalStakesSnaphot_2, A_coll.add(B_coll)); assert.equal( totalCollateralSnapshot_2, - A_coll.add(B_coll).add(th.applyLiquidationFee(D_coll)) + A_coll.add(B_coll).add(th.applyLiquidationFee(D_coll)), ); // 24 + 3*0.995 // check Bob's ICR is now in range 100% < ICR 110% @@ -516,19 +513,18 @@ contract.skip("TroveManager - in Recovery Mode", async (accounts) => { // Liquidate Bob await troveManager.liquidate(bob, { from: owner }); - /* After Bob's liquidation, Bob's stake (21 ether) should be removed from total stakes, + /* After Bob's liquidation, Bob's stake (21 ether) should be removed from total stakes, but his collateral should remain in the system (*0.995). */ const totalStakesSnaphot_3 = await troveManager.totalStakesSnapshot(); - const totalCollateralSnapshot_3 = - await troveManager.totalCollateralSnapshot(); + const totalCollateralSnapshot_3 = await troveManager.totalCollateralSnapshot(); assert.equal(totalStakesSnaphot_3.toString(), A_coll); // total collateral should always be 27 minus gas compensations, as all liquidations in this test case are full redistributions assert.isAtMost( th.getDifference( totalCollateralSnapshot_3.toString(), - A_coll.add(A_reward).add(th.applyLiquidationFee(B_coll.add(B_reward))) + A_coll.add(A_reward).add(th.applyLiquidationFee(B_coll.add(B_reward))), ), - 1000 + 1000, ); }); @@ -594,7 +590,7 @@ contract.skip("TroveManager - in Recovery Mode", async (accounts) => { }); // Alice deposits 390Bold to the Stability Pool - await stabilityPool.provideToSP(spDeposit, {from: alice }); + await stabilityPool.provideToSP(spDeposit, { from: alice }); // --- TEST --- // price drops to 1ETH:100Bold, reducing TCR below 150% @@ -620,9 +616,9 @@ contract.skip("TroveManager - in Recovery Mode", async (accounts) => { assert.equal(P_Before, "1000000000000000000"); /* Now, liquidate Bob. Liquidated coll is 21 ether, and liquidated debt is 2000 Bold. - + With 390 Bold in the StabilityPool, 390 Bold should be offset with the pool, leaving 0 in the pool. - + Stability Pool rewards for alice should be: BoldLoss: 390Bold ETHGain: (390 / 2000) * 21*0.995 = 4.074525 ether @@ -642,11 +638,11 @@ contract.skip("TroveManager - in Recovery Mode", async (accounts) => { assert.equal(aliceETHGain.toString(), aliceExpectedETHGain); /* Now, check redistribution to active Troves. Remainders of 1610 Bold and 16.82 ether are distributed. - + Now, only Alice and Dennis have a stake in the system - 3 ether each, thus total stakes is 6 ether. - + Rewards-per-unit-staked from the redistribution should be: - + L_boldDebt = 1610 / 6 = 268.333 Bold L_ETH = 16.820475 /6 = 2.8034125 ether */ @@ -656,9 +652,9 @@ contract.skip("TroveManager - in Recovery Mode", async (accounts) => { assert.isAtMost( th.getDifference( L_boldDebt, - B_totalDebt.sub(spDeposit).mul(mv._1e18BN).div(A_coll.add(D_coll)) + B_totalDebt.sub(spDeposit).mul(mv._1e18BN).div(A_coll.add(D_coll)), ), - 100 + 100, ); assert.isAtMost( th.getDifference( @@ -666,10 +662,10 @@ contract.skip("TroveManager - in Recovery Mode", async (accounts) => { th.applyLiquidationFee( B_coll.sub(B_coll.mul(spDeposit).div(B_totalDebt)) .mul(mv._1e18BN) - .div(A_coll.add(D_coll)) - ) + .div(A_coll.add(D_coll)), + ), ), - 100 + 100, ); }); @@ -718,7 +714,7 @@ contract.skip("TroveManager - in Recovery Mode", async (accounts) => { // Try to liquidate Bob await assertRevert( troveManager.liquidate(bob, { from: owner }), - "TroveManager: nothing to liquidate" + "TroveManager: nothing to liquidate", ); // Check that Pool rewards don't change @@ -772,7 +768,7 @@ contract.skip("TroveManager - in Recovery Mode", async (accounts) => { // Alice deposits Bold in the Stability Pool const spDeposit = B_totalDebt.add(toBN(1)); - await stabilityPool.provideToSP(spDeposit, {from: alice }); + await stabilityPool.provideToSP(spDeposit, { from: alice }); // --- TEST --- // price drops to 1ETH:100Bold, reducing TCR below 150% @@ -795,35 +791,35 @@ contract.skip("TroveManager - in Recovery Mode", async (accounts) => { Alice's expected compounded deposit: (1490 - 250) = 1240Bold Alice's expected ETH gain: Bob's liquidated capped coll (minus gas comp), 2.75*0.995 ether - + */ const aliceExpectedDeposit = await stabilityPool.getCompoundedBoldDeposit( - alice + alice, ); const aliceExpectedETHGain = await stabilityPool.getDepositorETHGain(alice); assert.isAtMost( th.getDifference( aliceExpectedDeposit.toString(), - spDeposit.sub(B_totalDebt) + spDeposit.sub(B_totalDebt), ), - 2000 + 2000, ); assert.isAtMost( th.getDifference( aliceExpectedETHGain, - th.applyLiquidationFee(B_totalDebt.mul(th.toBN(dec(11, 17))).div(price)) + th.applyLiquidationFee(B_totalDebt.mul(th.toBN(dec(11, 17))).div(price)), ), - 3000 + 3000, ); // check Bob’s collateral surplus const bob_remainingCollateral = B_coll.sub( - B_totalDebt.mul(th.toBN(dec(11, 17))).div(price) + B_totalDebt.mul(th.toBN(dec(11, 17))).div(price), ); th.assertIsApproximatelyEqual( await collSurplusPool.getCollateral(bob), - bob_remainingCollateral + bob_remainingCollateral, ); // can claim collateral const bob_balanceBefore = th.toBN(await contracts.WETH.balanceOf(bob)); @@ -831,7 +827,7 @@ contract.skip("TroveManager - in Recovery Mode", async (accounts) => { const bob_balanceAfter = th.toBN(await contracts.WETH.balanceOf(bob)); th.assertIsApproximatelyEqual( bob_balanceAfter, - bob_balanceBefore.add(th.toBN(bob_remainingCollateral)) + bob_balanceBefore.add(th.toBN(bob_remainingCollateral)), ); }); @@ -857,7 +853,7 @@ contract.skip("TroveManager - in Recovery Mode", async (accounts) => { // Alice deposits Bold in the Stability Pool const spDeposit = B_totalDebt.add(toBN(1)); - await stabilityPool.provideToSP(spDeposit, {from: alice }); + await stabilityPool.provideToSP(spDeposit, { from: alice }); // --- TEST --- // price drops to 1ETH:100Bold, reducing TCR below 150% @@ -883,29 +879,29 @@ contract.skip("TroveManager - in Recovery Mode", async (accounts) => { */ const aliceExpectedDeposit = await stabilityPool.getCompoundedBoldDeposit( - alice + alice, ); const aliceExpectedETHGain = await stabilityPool.getDepositorETHGain(alice); assert.isAtMost( th.getDifference( aliceExpectedDeposit.toString(), - spDeposit.sub(B_totalDebt) + spDeposit.sub(B_totalDebt), ), - 2000 + 2000, ); assert.isAtMost( th.getDifference( aliceExpectedETHGain, - th.applyLiquidationFee(B_totalDebt.mul(th.toBN(dec(11, 17))).div(price)) + th.applyLiquidationFee(B_totalDebt.mul(th.toBN(dec(11, 17))).div(price)), ), - 3000 + 3000, ); // check Bob’s collateral surplus th.assertIsApproximatelyEqual( await collSurplusPool.getCollateral(bob), - "0" + "0", ); }); @@ -952,7 +948,7 @@ contract.skip("TroveManager - in Recovery Mode", async (accounts) => { // Check Bob's ICR is between 110 and 150 const bob_ICR = await troveManager.getCurrentICR(bob, price); assert.isTrue( - bob_ICR.gt(mv._MCR) && bob_ICR.lt(await th.getTCR(contracts)) + bob_ICR.gt(mv._MCR) && bob_ICR.lt(await th.getTCR(contracts)), ); // Liquidate Bob @@ -967,11 +963,11 @@ contract.skip("TroveManager - in Recovery Mode", async (accounts) => { // check Bob’s collateral surplus const bob_remainingCollateral = B_coll.sub( - B_totalDebt.mul(th.toBN(dec(11, 17))).div(price) + B_totalDebt.mul(th.toBN(dec(11, 17))).div(price), ); th.assertIsApproximatelyEqual( await collSurplusPool.getCollateral(bob), - bob_remainingCollateral + bob_remainingCollateral, ); // can claim collateral const bob_balanceBefore = th.toBN(await contracts.WETH.balanceOf(bob)); @@ -979,7 +975,7 @@ contract.skip("TroveManager - in Recovery Mode", async (accounts) => { const bob_balanceAfter = th.toBN(await contracts.WETH.balanceOf(bob)); th.assertIsApproximatelyEqual( bob_balanceAfter, - bob_balanceBefore.add(th.toBN(bob_remainingCollateral)) + bob_balanceBefore.add(th.toBN(bob_remainingCollateral)), ); }); @@ -1030,15 +1026,14 @@ contract.skip("TroveManager - in Recovery Mode", async (accounts) => { // Check Bob's ICR is between 110 and TCR const bob_ICR = await troveManager.getCurrentICR(bob, price); assert.isTrue( - bob_ICR.gt(mv._MCR) && bob_ICR.lt(await th.getTCR(contracts)) + bob_ICR.gt(mv._MCR) && bob_ICR.lt(await th.getTCR(contracts)), ); // Liquidate Bob await troveManager.liquidate(bob, { from: owner }); const totalStakesSnaphot_After = await troveManager.totalStakesSnapshot(); - const totalCollateralSnapshot_After = - await troveManager.totalCollateralSnapshot(); + const totalCollateralSnapshot_After = await troveManager.totalCollateralSnapshot(); // totalStakesSnapshot should have reduced to 22 ether - the sum of Alice's coll( 20 ether) and Dennis' coll (2 ether ) assert.equal(totalStakesSnaphot_After.toString(), A_coll.add(D_coll)); @@ -1089,7 +1084,7 @@ contract.skip("TroveManager - in Recovery Mode", async (accounts) => { // Check Bob's ICR is between 110 and TCR const bob_ICR = await troveManager.getCurrentICR(bob, price); assert.isTrue( - bob_ICR.gt(mv._MCR) && bob_ICR.lt(await th.getTCR(contracts)) + bob_ICR.gt(mv._MCR) && bob_ICR.lt(await th.getTCR(contracts)), ); // Liquidate Bob @@ -1104,11 +1099,11 @@ contract.skip("TroveManager - in Recovery Mode", async (accounts) => { // check Bob’s collateral surplus const bob_remainingCollateral = B_coll.sub( - B_totalDebt.mul(th.toBN(dec(11, 17))).div(price) + B_totalDebt.mul(th.toBN(dec(11, 17))).div(price), ); th.assertIsApproximatelyEqual( await collSurplusPool.getCollateral(bob), - bob_remainingCollateral + bob_remainingCollateral, ); // can claim collateral const bob_balanceBefore = th.toBN(await contracts.WETH.balanceOf(bob)); @@ -1116,7 +1111,7 @@ contract.skip("TroveManager - in Recovery Mode", async (accounts) => { const bob_balanceAfter = th.toBN(await contracts.WETH.balanceOf(bob)); th.assertIsApproximatelyEqual( bob_balanceAfter, - bob_balanceBefore.add(th.toBN(bob_remainingCollateral)) + bob_balanceBefore.add(th.toBN(bob_remainingCollateral)), ); }); @@ -1167,7 +1162,7 @@ contract.skip("TroveManager - in Recovery Mode", async (accounts) => { // Check Recovery Mode is active assert.isTrue(await th.checkRecoveryMode(contracts)); - + // Troves are ordered by ICR, low to high: A, B, C, D. // Liquidate out of ICR order: D, B, C. Prior to each, confirm that: @@ -1206,25 +1201,25 @@ contract.skip("TroveManager - in Recovery Mode", async (accounts) => { // check collateral surplus const dennis_remainingCollateral = D_coll.sub( - D_totalDebt.mul(th.toBN(dec(11, 17))).div(price) + D_totalDebt.mul(th.toBN(dec(11, 17))).div(price), ); const bob_remainingCollateral = B_coll.sub( - B_totalDebt.mul(th.toBN(dec(11, 17))).div(price) + B_totalDebt.mul(th.toBN(dec(11, 17))).div(price), ); const carol_remainingCollateral = C_coll.sub( - C_totalDebt.mul(th.toBN(dec(11, 17))).div(price) + C_totalDebt.mul(th.toBN(dec(11, 17))).div(price), ); th.assertIsApproximatelyEqual( await collSurplusPool.getCollateral(dennis), - dennis_remainingCollateral + dennis_remainingCollateral, ); th.assertIsApproximatelyEqual( await collSurplusPool.getCollateral(bob), - bob_remainingCollateral + bob_remainingCollateral, ); th.assertIsApproximatelyEqual( await collSurplusPool.getCollateral(carol), - carol_remainingCollateral + carol_remainingCollateral, ); // can claim collateral @@ -1233,8 +1228,8 @@ contract.skip("TroveManager - in Recovery Mode", async (accounts) => { const dennis_balanceAfter = th.toBN(await contracts.WETH.balanceOf(dennis)); assert.isTrue( dennis_balanceAfter.eq( - dennis_balanceBefore.add(th.toBN(dennis_remainingCollateral)) - ) + dennis_balanceBefore.add(th.toBN(dennis_remainingCollateral)), + ), ); const bob_balanceBefore = th.toBN(await contracts.WETH.balanceOf(bob)); @@ -1242,7 +1237,7 @@ contract.skip("TroveManager - in Recovery Mode", async (accounts) => { const bob_balanceAfter = th.toBN(await contracts.WETH.balanceOf(bob)); th.assertIsApproximatelyEqual( bob_balanceAfter, - bob_balanceBefore.add(th.toBN(bob_remainingCollateral)) + bob_balanceBefore.add(th.toBN(bob_remainingCollateral)), ); const carol_balanceBefore = th.toBN(await contracts.WETH.balanceOf(carol)); @@ -1250,11 +1245,11 @@ contract.skip("TroveManager - in Recovery Mode", async (accounts) => { const carol_balanceAfter = th.toBN(await contracts.WETH.balanceOf(carol)); th.assertIsApproximatelyEqual( carol_balanceAfter, - carol_balanceBefore.add(th.toBN(carol_remainingCollateral)) + carol_balanceBefore.add(th.toBN(carol_remainingCollateral)), ); }); - /* --- liquidate() applied to trove with ICR > 110% that has the lowest ICR, and Stability Pool + /* --- liquidate() applied to trove with ICR > 110% that has the lowest ICR, and Stability Pool Bold is LESS THAN the liquidated debt: a non fullfilled liquidation --- */ it("liquidate(), with ICR > 110%, and StabilityPool Bold < liquidated debt: Trove remains active", async () => { @@ -1299,7 +1294,7 @@ contract.skip("TroveManager - in Recovery Mode", async (accounts) => { // Try to liquidate Bob await assertRevert( troveManager.liquidate(bob, { from: owner }), - "TroveManager: nothing to liquidate" + "TroveManager: nothing to liquidate", ); /* Since the pool only contains 100 Bold, and Bob's pre-liquidation debt was 250 Bold, @@ -1354,10 +1349,10 @@ contract.skip("TroveManager - in Recovery Mode", async (accounts) => { // Try to liquidate Bob await assertRevert( troveManager.liquidate(bob, { from: owner }), - "TroveManager: nothing to liquidate" + "TroveManager: nothing to liquidate", ); - /* Since the pool only contains 100 Bold, and Bob's pre-liquidation debt was 250 Bold, + /* Since the pool only contains 100 Bold, and Bob's pre-liquidation debt was 250 Bold, expect Bob's trove to only be partially offset, and remain active after liquidation */ // Check Bob is in Trove owners array @@ -1415,7 +1410,7 @@ contract.skip("TroveManager - in Recovery Mode", async (accounts) => { // Try to liquidate Bob await assertRevert( troveManager.liquidate(bob, { from: owner }), - "TroveManager: nothing to liquidate" + "TroveManager: nothing to liquidate", ); /* Since Bob's debt (250 Bold) is larger than all Bold in the Stability Pool, Liquidation won’t happen @@ -1485,7 +1480,7 @@ contract.skip("TroveManager - in Recovery Mode", async (accounts) => { // Liquidate Bob, it won’t happen as there are no funds in the SP await assertRevert( troveManager.liquidate(bob, { from: owner }), - "TroveManager: nothing to liquidate" + "TroveManager: nothing to liquidate", ); /* After liquidation, totalStakes snapshot should still equal the total stake: 25 ether @@ -1538,20 +1533,20 @@ contract.skip("TroveManager - in Recovery Mode", async (accounts) => { // Try to liquidate Bob. Shouldn’t happen await assertRevert( troveManager.liquidate(bob, { from: owner }), - "TroveManager: nothing to liquidate" + "TroveManager: nothing to liquidate", ); // check Stability Pool rewards. Nothing happened, so everything should remain the same const aliceExpectedDeposit = await stabilityPool.getCompoundedBoldDeposit( - alice + alice, ); const aliceExpectedETHGain = await stabilityPool.getDepositorETHGain(alice); assert.equal(aliceExpectedDeposit.toString(), dec(100, 18)); assert.equal(aliceExpectedETHGain.toString(), "0"); - /* For this Recovery Mode test case with ICR > 110%, there should be no redistribution of remainder to active Troves. + /* For this Recovery Mode test case with ICR > 110%, there should be no redistribution of remainder to active Troves. Redistribution rewards-per-unit-staked should be zero. */ const L_boldDebt_After = (await troveManager.L_boldDebt()).toString(); @@ -1615,13 +1610,13 @@ contract.skip("TroveManager - in Recovery Mode", async (accounts) => { // L1: Try to liquidate Bob. Nothing happens await assertRevert( troveManager.liquidate(bob, { from: owner }), - "TroveManager: nothing to liquidate" + "TroveManager: nothing to liquidate", ); - //Check SP Bold has been completely emptied + // Check SP Bold has been completely emptied assert.equal( (await stabilityPool.getTotalBoldDeposits()).toString(), - dec(100, 18) + dec(100, 18), ); // Check Bob remains active @@ -1650,7 +1645,7 @@ contract.skip("TroveManager - in Recovery Mode", async (accounts) => { assert.isFalse(await sortedTroves.contains(bob)); // Alice provides another 50 Bold to pool - await stabilityPool.provideToSP(dec(50, 18), {from: alice }); + await stabilityPool.provideToSP(dec(50, 18), { from: alice }); assert.isTrue(await th.checkRecoveryMode(contracts)); @@ -1663,13 +1658,13 @@ contract.skip("TroveManager - in Recovery Mode", async (accounts) => { // L2: Try to liquidate Carol. Nothing happens await assertRevert( troveManager.liquidate(carol), - "TroveManager: nothing to liquidate" + "TroveManager: nothing to liquidate", ); - //Check SP Bold has been completely emptied + // Check SP Bold has been completely emptied assert.equal( (await stabilityPool.getTotalBoldDeposits()).toString(), - dec(150, 18) + dec(150, 18), ); // Check Carol's collateral and debt remains the same @@ -1685,7 +1680,7 @@ contract.skip("TroveManager - in Recovery Mode", async (accounts) => { // check Carol's ICR has not changed assert.equal(carol_ICR_After, carol_ICR_Before); - //Confirm liquidations have not led to any redistributions to troves + // Confirm liquidations have not led to any redistributions to troves const L_boldDebt_After = (await troveManager.L_boldDebt()).toString(); const L_ETH_After = (await troveManager.L_ETH()).toString(); @@ -1700,7 +1695,7 @@ contract.skip("TroveManager - in Recovery Mode", async (accounts) => { extraBoldAmount: dec(50, 18), extraParams: { from: whale }, }); - await stabilityPool.provideToSP(dec(50, 18), {from: whale }); + await stabilityPool.provideToSP(dec(50, 18), { from: whale }); const { collateral: A_coll } = await openTrove({ ICR: toBN(dec(200, 16)), @@ -1740,7 +1735,7 @@ contract.skip("TroveManager - in Recovery Mode", async (accounts) => { // Try to liquidate Alice await assertRevert( troveManager.liquidate(alice), - "TroveManager: nothing to liquidate" + "TroveManager: nothing to liquidate", ); // Expect system debt and system coll not reduced @@ -1748,10 +1743,10 @@ contract.skip("TroveManager - in Recovery Mode", async (accounts) => { const entireSystemDebtAfter = await troveManager.getEntireSystemDebt(); const changeInEntireSystemColl = entireSystemCollBefore.sub( - entireSystemCollAfter + entireSystemCollAfter, ); const changeInEntireSystemDebt = entireSystemDebtBefore.sub( - entireSystemDebtAfter + entireSystemDebtAfter, ); assert.equal(changeInEntireSystemColl, "0"); @@ -1763,7 +1758,7 @@ contract.skip("TroveManager - in Recovery Mode", async (accounts) => { it("liquidate(): Doesn't liquidate undercollateralized trove if it is the only trove in the system", async () => { // Alice creates a single trove with 0.62 ETH and a debt of 62 Bold, and provides 10 Bold to SP await openTrove({ ICR: toBN(dec(200, 16)), extraParams: { from: alice } }); - await stabilityPool.provideToSP(dec(10, 18), {from: alice }); + await stabilityPool.provideToSP(dec(10, 18), { from: alice }); assert.isFalse(await th.checkRecoveryMode(contracts)); @@ -1785,7 +1780,7 @@ contract.skip("TroveManager - in Recovery Mode", async (accounts) => { // Try to liquidate the trove await assertRevert( troveManager.liquidate(alice, { from: owner }), - "TroveManager: nothing to liquidate" + "TroveManager: nothing to liquidate", ); // Check Alice's trove has not been removed @@ -1803,7 +1798,7 @@ contract.skip("TroveManager - in Recovery Mode", async (accounts) => { await openTrove({ ICR: toBN(dec(200, 16)), extraParams: { from: alice } }); // Alice proves 10 Bold to SP - await stabilityPool.provideToSP(dec(10, 18), {from: alice }); + await stabilityPool.provideToSP(dec(10, 18), { from: alice }); assert.isFalse(await th.checkRecoveryMode(contracts)); @@ -1861,7 +1856,7 @@ contract.skip("TroveManager - in Recovery Mode", async (accounts) => { // Attempt to liquidate bob await assertRevert( troveManager.liquidate(bob), - "TroveManager: nothing to liquidate" + "TroveManager: nothing to liquidate", ); // check A, B, C remain active @@ -1883,7 +1878,7 @@ contract.skip("TroveManager - in Recovery Mode", async (accounts) => { await openTrove({ ICR: toBN(dec(142, 16)), extraParams: { from: C } }); // C fills SP with 130 Bold - await stabilityPool.provideToSP(dec(130, 18), {from: C }); + await stabilityPool.provideToSP(dec(130, 18), { from: C }); await priceFeed.setPrice(dec(150, 18)); const price = await priceFeed.getPrice(); @@ -1899,7 +1894,7 @@ contract.skip("TroveManager - in Recovery Mode", async (accounts) => { // Try to liquidate A await assertRevert( troveManager.liquidate(A), - "TroveManager: nothing to liquidate" + "TroveManager: nothing to liquidate", ); // Check liquidation of A does nothing - trove remains in system @@ -1987,7 +1982,7 @@ contract.skip("TroveManager - in Recovery Mode", async (accounts) => { const bob_ICR_Before = await troveManager.getCurrentICR(bob, price); const carol_ICR_Before = await troveManager.getCurrentICR(carol, price); - /* Before liquidation: + /* Before liquidation: Alice ICR: = (1 * 100 / 50) = 200% Bob ICR: (1 * 100 / 90.5) = 110.5% Carol ICR: (1 * 100 / 100 ) = 100% @@ -2004,7 +1999,7 @@ contract.skip("TroveManager - in Recovery Mode", async (accounts) => { const bob_ICR_After = await troveManager.getCurrentICR(bob, price); const carol_ICR_After = await troveManager.getCurrentICR(carol, price); - /* After liquidation: + /* After liquidation: Alice ICR: (1.1 * 100 / 60) = 183.33% Bob ICR:(1.1 * 100 / 100.5) = 109.45% @@ -2015,7 +2010,7 @@ contract.skip("TroveManager - in Recovery Mode", async (accounts) => { assert.isTrue(bob_ICR_After.lte(mv._MCR)); assert.isTrue(carol_ICR_After.lte(mv._MCR)); - /* Though Bob's true ICR (including pending rewards) is below the MCR, + /* Though Bob's true ICR (including pending rewards) is below the MCR, check that Bob's raw coll and debt has not changed, and that his "raw" ICR is above the MCR */ const bob_Coll = (await troveManager.Troves(bob))[1]; const bob_Debt = (await troveManager.Troves(bob))[0]; @@ -2023,16 +2018,16 @@ contract.skip("TroveManager - in Recovery Mode", async (accounts) => { const bob_rawICR = bob_Coll.mul(th.toBN(dec(100, 18))).div(bob_Debt); assert.isTrue(bob_rawICR.gte(mv._MCR)); - //liquidate A, B, C + // liquidate A, B, C await assertRevert( troveManager.liquidate(alice), - "TroveManager: nothing to liquidate" + "TroveManager: nothing to liquidate", ); await troveManager.liquidate(bob); await troveManager.liquidate(carol); /* Since there is 0 Bold in the stability Pool, A, with ICR >110%, should stay active. - Check Alice stays active, Carol gets liquidated, and Bob gets liquidated + Check Alice stays active, Carol gets liquidated, and Bob gets liquidated (because his pending rewards bring his ICR < MCR) */ assert.isTrue(await sortedTroves.contains(alice)); assert.isFalse(await sortedTroves.contains(bob)); @@ -2059,8 +2054,8 @@ contract.skip("TroveManager - in Recovery Mode", async (accounts) => { // Bob sends tokens to Dennis, who has no trove await boldToken.transfer(dennis, spDeposit, { from: bob }); - //Dennis provides 200 Bold to SP - await stabilityPool.provideToSP(spDeposit, {from: dennis }); + // Dennis provides 200 Bold to SP + await stabilityPool.provideToSP(spDeposit, { from: dennis }); // Price drop await priceFeed.setPrice(dec(105, 18)); @@ -2080,11 +2075,11 @@ contract.skip("TroveManager - in Recovery Mode", async (accounts) => { ).toString(); assert.isAtMost( th.getDifference(dennis_Deposit_Before, spDeposit.sub(C_totalDebt)), - 1000 + 1000, ); assert.isAtMost( th.getDifference(dennis_ETHGain_Before, th.applyLiquidationFee(C_coll)), - 1000 + 1000, ); // Attempt to liquidate Dennis @@ -2173,11 +2168,12 @@ contract.skip("TroveManager - in Recovery Mode", async (accounts) => { const { collateral: A_coll } = await openTrove({ ICR: toBN(dec(266, 16)), extraBoldAmount: B_totalDebt, - extraParams: { from: alice }, annualInterestRate: th.toBN(dec(5,17)) // 50% interest rate + extraParams: { from: alice }, + annualInterestRate: th.toBN(dec(5, 17)), // 50% interest rate }); // Alice deposits Bold in the Stability Pool - await stabilityPool.provideToSP(B_totalDebt, {from: alice }); + await stabilityPool.provideToSP(B_totalDebt, { from: alice }); // --- TEST --- // price drops to 1ETH:100Bold, reducing TCR below 150% @@ -2197,11 +2193,11 @@ contract.skip("TroveManager - in Recovery Mode", async (accounts) => { // check Bob’s collateral surplus: 5.76 * 100 - 480 * 1.1 const bob_remainingCollateral = B_coll.sub( - B_totalDebt.mul(th.toBN(dec(11, 17))).div(price) + B_totalDebt.mul(th.toBN(dec(11, 17))).div(price), ); th.assertIsApproximatelyEqual( await collSurplusPool.getCollateral(bob), - bob_remainingCollateral + bob_remainingCollateral, ); // can claim collateral const bob_balanceBefore = th.toBN(await contracts.WETH.balanceOf(bob)); @@ -2209,7 +2205,7 @@ contract.skip("TroveManager - in Recovery Mode", async (accounts) => { const bob_balanceAfter = th.toBN(await contracts.WETH.balanceOf(bob)); th.assertIsApproximatelyEqual( bob_balanceAfter, - bob_balanceBefore.add(th.toBN(bob_remainingCollateral)) + bob_balanceBefore.add(th.toBN(bob_remainingCollateral)), ); // skip bootstrapping phase @@ -2221,19 +2217,20 @@ contract.skip("TroveManager - in Recovery Mode", async (accounts) => { const { collateral: B_coll_2, netDebt: B_netDebt_2 } = await openTrove({ ICR: toBN(dec(150, 16)), extraBoldAmount: dec(480, 18), - extraParams: { from: bob, value: bob_remainingCollateral, annualInterestRate: 0} + extraParams: { from: bob, value: bob_remainingCollateral, annualInterestRate: 0 }, }); const { collateral: D_coll } = await openTrove({ ICR: toBN(dec(266, 16)), extraBoldAmount: B_netDebt_2, - extraParams: { from: dennis }, annualInterestRate: th.toBN(dec(5,17)) + extraParams: { from: dennis }, + annualInterestRate: th.toBN(dec(5, 17)), }); await th.redeemCollateral(dennis, contracts, B_netDebt_2); price = await priceFeed.getPrice(); const bob_surplus = B_coll_2.sub(B_netDebt_2.mul(mv._1e18BN).div(price)); th.assertIsApproximatelyEqual( await collSurplusPool.getCollateral(bob), - bob_surplus + bob_surplus, ); // can claim collateral const bob_balanceBefore_2 = th.toBN(await contracts.WETH.balanceOf(bob)); @@ -2241,7 +2238,7 @@ contract.skip("TroveManager - in Recovery Mode", async (accounts) => { const bob_balanceAfter_2 = th.toBN(await contracts.WETH.balanceOf(bob)); th.assertIsApproximatelyEqual( bob_balanceAfter_2, - bob_balanceBefore_2.add(th.toBN(bob_surplus)) + bob_balanceBefore_2.add(th.toBN(bob_surplus)), ); }); @@ -2252,16 +2249,16 @@ contract.skip("TroveManager - in Recovery Mode", async (accounts) => { const { collateral: B_coll, netDebt: B_netDebt } = await openTrove({ ICR: toBN(dec(222, 16)), extraBoldAmount: dec(90, 18), - extraParams: { from: bob, annualInterestRate: toBN(dec(5,16)) }, // 5% interest (lowest) + extraParams: { from: bob, annualInterestRate: toBN(dec(5, 16)) }, // 5% interest (lowest) }); let price = await priceFeed.getPrice(); - th.logBN("bob ICR start", await troveManager.getCurrentICR(bob, price)) + th.logBN("bob ICR start", await troveManager.getCurrentICR(bob, price)); // Dennis withdraws to 150 Bold of debt, resulting in ICRs of 266%. const { collateral: D_coll } = await openTrove({ ICR: toBN(dec(266, 16)), extraBoldAmount: B_netDebt, - extraParams: { from: dennis, annualInterestRate: toBN(dec(10,16)) }, // 10% interest + extraParams: { from: dennis, annualInterestRate: toBN(dec(10, 16)) }, // 10% interest }); // --- TEST --- @@ -2274,7 +2271,7 @@ contract.skip("TroveManager - in Recovery Mode", async (accounts) => { const bob_surplus = B_coll.sub(B_netDebt.mul(mv._1e18BN).div(price)); th.assertIsApproximatelyEqual( await collSurplusPool.getCollateral(bob), - bob_surplus + bob_surplus, ); // can claim collateral @@ -2283,7 +2280,7 @@ contract.skip("TroveManager - in Recovery Mode", async (accounts) => { const bob_balanceAfter = th.toBN(await contracts.WETH.balanceOf(bob)); th.assertIsApproximatelyEqual( bob_balanceAfter, - bob_balanceBefore.add(bob_surplus) + bob_balanceBefore.add(bob_surplus), ); // Bob re-opens the trove, price 200, total debt 250 Bold, interest = 5% (lowest one) @@ -2295,7 +2292,7 @@ contract.skip("TroveManager - in Recovery Mode", async (accounts) => { await openTrove({ ICR: toBN(dec(266, 16)), extraBoldAmount: B_totalDebt_2, - extraParams: { from: alice, annualInterestRate: th.toBN(dec(20, 16))}, + extraParams: { from: alice, annualInterestRate: th.toBN(dec(20, 16)) }, }); await stabilityPool.provideToSP(B_totalDebt_2, { from: alice, @@ -2322,11 +2319,11 @@ contract.skip("TroveManager - in Recovery Mode", async (accounts) => { // check Bob’s collateral surplus const bob_remainingCollateral = B_coll_2.sub( - B_totalDebt_2.mul(th.toBN(dec(11, 17))).div(price) + B_totalDebt_2.mul(th.toBN(dec(11, 17))).div(price), ); th.assertIsApproximatelyEqual( (await collSurplusPool.getCollateral(bob)).toString(), - bob_remainingCollateral.toString() + bob_remainingCollateral.toString(), ); // can claim collateral @@ -2335,7 +2332,7 @@ contract.skip("TroveManager - in Recovery Mode", async (accounts) => { const bob_balanceAfter_2 = th.toBN(await contracts.WETH.balanceOf(bob)); th.assertIsApproximatelyEqual( bob_balanceAfter_2, - bob_balanceBefore_2.add(th.toBN(bob_remainingCollateral)) + bob_balanceBefore_2.add(th.toBN(bob_remainingCollateral)), ); }); @@ -2376,7 +2373,7 @@ contract.skip("TroveManager - in Recovery Mode", async (accounts) => { }); // Alice deposits Bold to Stability Pool - await stabilityPool.provideToSP(spDeposit, {from: alice }); + await stabilityPool.provideToSP(spDeposit, { from: alice }); // price drops to 1ETH:85Bold, reducing TCR below 150% await priceFeed.setPrice("85000000000000000000"); @@ -2392,7 +2389,7 @@ contract.skip("TroveManager - in Recovery Mode", async (accounts) => { const TCR_Before = await th.getTCR(contracts); assert.isTrue(TCR_Before.lt(_150percent)); - /* + /* After the price drop and prior to any liquidations, ICR should be: Trove ICR @@ -2418,10 +2415,10 @@ contract.skip("TroveManager - in Recovery Mode", async (accounts) => { assert.isTrue(erin_ICR.lt(_150percent)); assert.isTrue(freddy_ICR.lt(_150percent)); - /* After liquidating Bob and Carol, the the TCR of the system rises above the CCR, to 154%. + /* After liquidating Bob and Carol, the the TCR of the system rises above the CCR, to 154%. (see calculations in Google Sheet) - Liquidations continue until all Troves with ICR < MCR have been closed. + Liquidations continue until all Troves with ICR < MCR have been closed. Only Alice should remain active - all others should be closed. */ // call batchLiquidateTroves @@ -2511,7 +2508,7 @@ contract.skip("TroveManager - in Recovery Mode", async (accounts) => { }); // Alice deposits Bold to Stability Pool - await stabilityPool.provideToSP(spDeposit, {from: alice }); + await stabilityPool.provideToSP(spDeposit, { from: alice }); // price drops to 1ETH:85Bold, reducing TCR below 150% await priceFeed.setPrice("85000000000000000000"); @@ -2553,10 +2550,10 @@ contract.skip("TroveManager - in Recovery Mode", async (accounts) => { assert.isTrue(erin_ICR.lt(_150percent)); assert.isTrue(freddy_ICR.lt(_150percent)); - /* After liquidating Bob and Carol, the the TCR of the system rises above the CCR, to 154%. + /* After liquidating Bob and Carol, the the TCR of the system rises above the CCR, to 154%. (see calculations in Google Sheet) - Liquidations continue until all Troves with ICR < MCR have been closed. + Liquidations continue until all Troves with ICR < MCR have been closed. Only Alice should remain active - all others should be closed. */ // call batchLiquidateTroves @@ -2645,7 +2642,7 @@ contract.skip("TroveManager - in Recovery Mode", async (accounts) => { }); // Alice deposits Bold to Stability Pool - await stabilityPool.provideToSP(spDeposit, {from: alice }); + await stabilityPool.provideToSP(spDeposit, { from: alice }); // to compensate borrowing fee await boldToken.transfer(alice, A_totalDebt, { from: whale }); @@ -2760,14 +2757,14 @@ contract.skip("TroveManager - in Recovery Mode", async (accounts) => { // Whale provides Bold to the SP const spDeposit = A_totalDebt.add(B_totalDebt).add( - C_totalDebt.div(toBN(2)) + C_totalDebt.div(toBN(2)), ); await openTrove({ ICR: toBN(dec(220, 16)), extraBoldAmount: spDeposit, extraParams: { from: whale }, }); - await stabilityPool.provideToSP(spDeposit, {from: whale }); + await stabilityPool.provideToSP(spDeposit, { from: whale }); // Price drops await priceFeed.setPrice(dec(120, 18)); @@ -2816,14 +2813,14 @@ contract.skip("TroveManager - in Recovery Mode", async (accounts) => { // Whale provides Bold to the SP const spDeposit = A_totalDebt.add(B_totalDebt).add( - C_totalDebt.div(toBN(2)) + C_totalDebt.div(toBN(2)), ); await openTrove({ ICR: toBN(dec(220, 16)), extraBoldAmount: spDeposit, extraParams: { from: whale }, }); - await stabilityPool.provideToSP(spDeposit, {from: whale }); + await stabilityPool.provideToSP(spDeposit, { from: whale }); // Price drops await priceFeed.setPrice(dec(120, 18)); @@ -2887,14 +2884,14 @@ contract.skip("TroveManager - in Recovery Mode", async (accounts) => { // Whale provides Bold to the SP const spDeposit = A_totalDebt.add(B_totalDebt).add( - C_totalDebt.div(toBN(2)) + C_totalDebt.div(toBN(2)), ); await openTrove({ ICR: toBN(dec(220, 16)), extraBoldAmount: spDeposit, extraParams: { from: whale }, }); - await stabilityPool.provideToSP(spDeposit, {from: whale }); + await stabilityPool.provideToSP(spDeposit, { from: whale }); // Price drops await priceFeed.setPrice(dec(120, 18)); @@ -2958,14 +2955,14 @@ contract.skip("TroveManager - in Recovery Mode", async (accounts) => { // Whale provides Bold to the SP const spDeposit = A_totalDebt.add(B_totalDebt).add( - C_totalDebt.div(toBN(2)) + C_totalDebt.div(toBN(2)), ); await openTrove({ ICR: toBN(dec(220, 16)), extraBoldAmount: spDeposit, extraParams: { from: whale }, }); - await stabilityPool.provideToSP(spDeposit, {from: whale }); + await stabilityPool.provideToSP(spDeposit, { from: whale }); // Price drops await priceFeed.setPrice(dec(120, 18)); @@ -3033,14 +3030,14 @@ contract.skip("TroveManager - in Recovery Mode", async (accounts) => { // Whale provides Bold to the SP const spDeposit = A_totalDebt.add(B_totalDebt).add( - C_totalDebt.div(toBN(2)) + C_totalDebt.div(toBN(2)), ); await openTrove({ ICR: toBN(dec(220, 16)), extraBoldAmount: spDeposit, extraParams: { from: whale }, }); - await stabilityPool.provideToSP(spDeposit, {from: whale }); + await stabilityPool.provideToSP(spDeposit, { from: whale }); // Price drops await priceFeed.setPrice(dec(120, 18)); @@ -3070,16 +3067,16 @@ contract.skip("TroveManager - in Recovery Mode", async (accounts) => { const entireSystemDebtAfter = await troveManager.getEntireSystemDebt(); const changeInEntireSystemColl = entireSystemCollBefore.sub( - entireSystemCollAfter + entireSystemCollAfter, ); const changeInEntireSystemDebt = entireSystemDebtBefore.sub( - entireSystemDebtAfter + entireSystemDebtAfter, ); assert.equal(changeInEntireSystemColl.toString(), A_coll.add(B_coll)); th.assertIsApproximatelyEqual( changeInEntireSystemDebt.toString(), - A_totalDebt.add(B_totalDebt) + A_totalDebt.add(B_totalDebt), ); }); @@ -3101,14 +3098,14 @@ contract.skip("TroveManager - in Recovery Mode", async (accounts) => { // Whale provides Bold to the SP const spDeposit = A_totalDebt.add(B_totalDebt).add( - C_totalDebt.div(toBN(2)) + C_totalDebt.div(toBN(2)), ); await openTrove({ ICR: toBN(dec(220, 16)), extraBoldAmount: spDeposit, extraParams: { from: whale }, }); - await stabilityPool.provideToSP(spDeposit, {from: whale }); + await stabilityPool.provideToSP(spDeposit, { from: whale }); // Price drops await priceFeed.setPrice(dec(120, 18)); @@ -3129,11 +3126,10 @@ contract.skip("TroveManager - in Recovery Mode", async (accounts) => { const trovesToLiquidate = [alice, bob, carol]; const liquidationTx = await troveManager.batchLiquidateTroves( - trovesToLiquidate + trovesToLiquidate, ); - const [liquidatedDebt, liquidatedColl, collGasComp, boldGasComp] = - th.getEmittedLiquidationValues(liquidationTx); + const [liquidatedDebt, liquidatedColl, collGasComp, boldGasComp] = th.getEmittedLiquidationValues(liquidationTx); th.assertIsApproximatelyEqual(liquidatedDebt, A_totalDebt.add(B_totalDebt)); const equivalentColl = A_totalDebt.add(B_totalDebt) @@ -3141,42 +3137,42 @@ contract.skip("TroveManager - in Recovery Mode", async (accounts) => { .div(price); th.assertIsApproximatelyEqual( liquidatedColl, - th.applyLiquidationFee(equivalentColl) + th.applyLiquidationFee(equivalentColl), ); th.assertIsApproximatelyEqual( collGasComp, - equivalentColl.sub(th.applyLiquidationFee(equivalentColl)) + equivalentColl.sub(th.applyLiquidationFee(equivalentColl)), ); // 0.5% of 283/120*1.1 assert.equal(boldGasComp.toString(), dec(400, 18)); // check collateral surplus const alice_remainingCollateral = A_coll.sub( - A_totalDebt.mul(th.toBN(dec(11, 17))).div(price) + A_totalDebt.mul(th.toBN(dec(11, 17))).div(price), ); const bob_remainingCollateral = B_coll.sub( - B_totalDebt.mul(th.toBN(dec(11, 17))).div(price) + B_totalDebt.mul(th.toBN(dec(11, 17))).div(price), ); th.assertIsApproximatelyEqual( await collSurplusPool.getCollateral(alice), - alice_remainingCollateral + alice_remainingCollateral, ); th.assertIsApproximatelyEqual( await collSurplusPool.getCollateral(bob), - bob_remainingCollateral + bob_remainingCollateral, ); // can claim collateral const alice_balanceBefore = th.toBN(await contracts.WETH.balanceOf(alice)); await borrowerOperations.claimCollateral({ from: alice }); const alice_balanceAfter = th.toBN(await contracts.WETH.balanceOf(alice)); - //th.assertIsApproximatelyEqual(alice_balanceAfter, alice_balanceBefore.add(th.toBN(alice_remainingCollateral))) + // th.assertIsApproximatelyEqual(alice_balanceAfter, alice_balanceBefore.add(th.toBN(alice_remainingCollateral))) const bob_balanceBefore = th.toBN(await contracts.WETH.balanceOf(bob)); await borrowerOperations.claimCollateral({ from: bob }); const bob_balanceAfter = th.toBN(await contracts.WETH.balanceOf(bob)); th.assertIsApproximatelyEqual( bob_balanceAfter, - bob_balanceBefore.add(th.toBN(bob_remainingCollateral)) + bob_balanceBefore.add(th.toBN(bob_remainingCollateral)), ); }); @@ -3198,14 +3194,14 @@ contract.skip("TroveManager - in Recovery Mode", async (accounts) => { // Whale provides Bold to the SP const spDeposit = A_totalDebt.add(B_totalDebt).add( - C_totalDebt.div(toBN(2)) + C_totalDebt.div(toBN(2)), ); await openTrove({ ICR: toBN(dec(220, 16)), extraBoldAmount: spDeposit, extraParams: { from: whale }, }); - await stabilityPool.provideToSP(spDeposit, {from: whale }); + await stabilityPool.provideToSP(spDeposit, { from: whale }); // Price drops await priceFeed.setPrice(dec(120, 18)); @@ -3266,7 +3262,7 @@ contract.skip("TroveManager - in Recovery Mode", async (accounts) => { extraBoldAmount: spDeposit, extraParams: { from: whale }, }); - await stabilityPool.provideToSP(spDeposit, {from: whale }); + await stabilityPool.provideToSP(spDeposit, { from: whale }); // Price drops await priceFeed.setPrice(dec(120, 18)); @@ -3293,7 +3289,7 @@ contract.skip("TroveManager - in Recovery Mode", async (accounts) => { const trovesToLiquidate = [dennis, bob, carol]; const liquidationTx = await troveManager.batchLiquidateTroves( - trovesToLiquidate + trovesToLiquidate, ); // Check transaction succeeded @@ -3354,7 +3350,7 @@ contract.skip("TroveManager - in Recovery Mode", async (accounts) => { const trovesToLiquidate = [dennis, bob, carol]; await assertRevert( troveManager.batchLiquidateTroves(trovesToLiquidate), - "TroveManager: nothing to liquidate" + "TroveManager: nothing to liquidate", ); // Confirm troves D, B, C remain in system @@ -3369,23 +3365,23 @@ contract.skip("TroveManager - in Recovery Mode", async (accounts) => { // Confirm D, B, C coll & debt have not changed const dennisDebt_After = (await troveManager.Troves(dennis))[0].add( - await troveManager.getPendingBoldDebtReward(dennis) + await troveManager.getPendingBoldDebtReward(dennis), ); const bobDebt_After = (await troveManager.Troves(bob))[0].add( - await troveManager.getPendingBoldDebtReward(bob) + await troveManager.getPendingBoldDebtReward(bob), ); const carolDebt_After = (await troveManager.Troves(carol))[0].add( - await troveManager.getPendingBoldDebtReward(carol) + await troveManager.getPendingBoldDebtReward(carol), ); const dennisColl_After = (await troveManager.Troves(dennis))[1].add( - await troveManager.getPendingETHReward(dennis) + await troveManager.getPendingETHReward(dennis), ); const bobColl_After = (await troveManager.Troves(bob))[1].add( - await troveManager.getPendingETHReward(bob) + await troveManager.getPendingETHReward(bob), ); const carolColl_After = (await troveManager.Troves(carol))[1].add( - await troveManager.getPendingETHReward(carol) + await troveManager.getPendingETHReward(carol), ); assert.isTrue(dennisColl_After.eq(dennisColl_Before)); @@ -3394,15 +3390,15 @@ contract.skip("TroveManager - in Recovery Mode", async (accounts) => { th.assertIsApproximatelyEqual( th.toBN(dennisDebt_Before).toString(), - dennisDebt_After.toString() + dennisDebt_After.toString(), ); th.assertIsApproximatelyEqual( th.toBN(bobDebt_Before).toString(), - bobDebt_After.toString() + bobDebt_After.toString(), ); th.assertIsApproximatelyEqual( th.toBN(carolDebt_Before).toString(), - carolDebt_After.toString() + carolDebt_After.toString(), ); }); @@ -3454,7 +3450,7 @@ contract.skip("TroveManager - in Recovery Mode", async (accounts) => { extraBoldAmount: spDeposit, extraParams: { from: whale }, }); - await stabilityPool.provideToSP(spDeposit, {from: whale }); + await stabilityPool.provideToSP(spDeposit, { from: whale }); // Price drops, but all troves remain active await priceFeed.setPrice(dec(110, 18)); @@ -3499,7 +3495,7 @@ contract.skip("TroveManager - in Recovery Mode", async (accounts) => { // Attempt to liquidate only troves with ICR > TCR% await assertRevert( troveManager.batchLiquidateTroves([G, H, I]), - "TroveManager: nothing to liquidate" + "TroveManager: nothing to liquidate", ); // Check G, H, I remain in system @@ -3550,7 +3546,7 @@ contract.skip("TroveManager - in Recovery Mode", async (accounts) => { await priceFeed.setPrice(dec(110, 18)); await stabilityPool.provideToSP( B_totalDebt.add(toBN(dec(50, 18))), - { from: whale } + { from: whale }, ); // B and E are still in range 110-TCR. @@ -3614,7 +3610,7 @@ contract.skip("TroveManager - in Recovery Mode", async (accounts) => { extraBoldAmount: spDeposit, extraParams: { from: whale }, }); - await stabilityPool.provideToSP(spDeposit, {from: whale }); + await stabilityPool.provideToSP(spDeposit, { from: whale }); // Price drops, but all troves remain active await priceFeed.setPrice(dec(100, 18)); @@ -3625,33 +3621,32 @@ contract.skip("TroveManager - in Recovery Mode", async (accounts) => { // Confirm all troves have ICR > MCR assert.isTrue( - (await troveManager.getCurrentICR(freddy, price)).gte(mv._MCR) + (await troveManager.getCurrentICR(freddy, price)).gte(mv._MCR), ); assert.isTrue( - (await troveManager.getCurrentICR(greta, price)).gte(mv._MCR) + (await troveManager.getCurrentICR(greta, price)).gte(mv._MCR), ); assert.isTrue( - (await troveManager.getCurrentICR(alice, price)).gte(mv._MCR) + (await troveManager.getCurrentICR(alice, price)).gte(mv._MCR), ); assert.isTrue((await troveManager.getCurrentICR(bob, price)).gte(mv._MCR)); assert.isTrue( - (await troveManager.getCurrentICR(carol, price)).gte(mv._MCR) + (await troveManager.getCurrentICR(carol, price)).gte(mv._MCR), ); // Confirm Bold in Stability Pool assert.equal( (await stabilityPool.getTotalBoldDeposits()).toString(), - spDeposit.toString() + spDeposit.toString(), ); const trovesToLiquidate = [freddy, greta, alice, bob, carol, dennis, whale]; // Attempt liqudation sequence const liquidationTx = await troveManager.batchLiquidateTroves( - trovesToLiquidate + trovesToLiquidate, ); - const [liquidatedDebt, liquidatedColl, gasComp] = - th.getEmittedLiquidationValues(liquidationTx); + const [liquidatedDebt, liquidatedColl, gasComp] = th.getEmittedLiquidationValues(liquidationTx); // Check F and G were liquidated assert.isFalse(await sortedTroves.contains(freddy)); @@ -3671,24 +3666,24 @@ contract.skip("TroveManager - in Recovery Mode", async (accounts) => { th.applyLiquidationFee( F_totalDebt.add(G_totalDebt) .mul(toBN(dec(11, 17))) - .div(price) - ) + .div(price), + ), ); // check collateral surplus const freddy_remainingCollateral = F_coll.sub( - F_totalDebt.mul(th.toBN(dec(11, 17))).div(price) + F_totalDebt.mul(th.toBN(dec(11, 17))).div(price), ); const greta_remainingCollateral = G_coll.sub( - G_totalDebt.mul(th.toBN(dec(11, 17))).div(price) + G_totalDebt.mul(th.toBN(dec(11, 17))).div(price), ); th.assertIsApproximatelyEqual( await collSurplusPool.getCollateral(freddy), - freddy_remainingCollateral + freddy_remainingCollateral, ); th.assertIsApproximatelyEqual( await collSurplusPool.getCollateral(greta), - greta_remainingCollateral + greta_remainingCollateral, ); // can claim collateral @@ -3697,7 +3692,7 @@ contract.skip("TroveManager - in Recovery Mode", async (accounts) => { const freddy_balanceAfter = th.toBN(await contracts.WETH.balanceOf(freddy)); th.assertIsApproximatelyEqual( freddy_balanceAfter, - freddy_balanceBefore.add(th.toBN(freddy_remainingCollateral)) + freddy_balanceBefore.add(th.toBN(freddy_remainingCollateral)), ); const greta_balanceBefore = th.toBN(await contracts.WETH.balanceOf(greta)); @@ -3705,7 +3700,7 @@ contract.skip("TroveManager - in Recovery Mode", async (accounts) => { const greta_balanceAfter = th.toBN(await contracts.WETH.balanceOf(greta)); th.assertIsApproximatelyEqual( greta_balanceAfter, - greta_balanceBefore.add(th.toBN(greta_remainingCollateral)) + greta_balanceBefore.add(th.toBN(greta_remainingCollateral)), ); }); @@ -3731,14 +3726,14 @@ contract.skip("TroveManager - in Recovery Mode", async (accounts) => { // Whale opens trove and adds 220 Bold to SP const spDeposit = F_totalDebt.add(G_totalDebt).add( - A_totalDebt.div(toBN(2)) + A_totalDebt.div(toBN(2)), ); await openTrove({ ICR: toBN(dec(285, 16)), extraBoldAmount: spDeposit, extraParams: { from: whale }, }); - await stabilityPool.provideToSP(spDeposit, {from: whale }); + await stabilityPool.provideToSP(spDeposit, { from: whale }); // Price drops, but all troves remain active await priceFeed.setPrice(dec(100, 18)); @@ -3749,33 +3744,32 @@ contract.skip("TroveManager - in Recovery Mode", async (accounts) => { // Confirm all troves have ICR > MCR assert.isTrue( - (await troveManager.getCurrentICR(freddy, price)).gte(mv._MCR) + (await troveManager.getCurrentICR(freddy, price)).gte(mv._MCR), ); assert.isTrue( - (await troveManager.getCurrentICR(greta, price)).gte(mv._MCR) + (await troveManager.getCurrentICR(greta, price)).gte(mv._MCR), ); assert.isTrue( - (await troveManager.getCurrentICR(alice, price)).gte(mv._MCR) + (await troveManager.getCurrentICR(alice, price)).gte(mv._MCR), ); assert.isTrue((await troveManager.getCurrentICR(bob, price)).gte(mv._MCR)); assert.isTrue( - (await troveManager.getCurrentICR(carol, price)).gte(mv._MCR) + (await troveManager.getCurrentICR(carol, price)).gte(mv._MCR), ); // Confirm Bold in Stability Pool assert.equal( (await stabilityPool.getTotalBoldDeposits()).toString(), - spDeposit.toString() + spDeposit.toString(), ); const trovesToLiquidate = [freddy, greta, alice, bob, carol, dennis, whale]; // Attempt liqudation sequence const liquidationTx = await troveManager.batchLiquidateTroves( - trovesToLiquidate + trovesToLiquidate, ); - const [liquidatedDebt, liquidatedColl, gasComp] = - th.getEmittedLiquidationValues(liquidationTx); + const [liquidatedDebt, liquidatedColl, gasComp] = th.getEmittedLiquidationValues(liquidationTx); // Check F and G were liquidated assert.isFalse(await sortedTroves.contains(freddy)); @@ -3790,10 +3784,10 @@ contract.skip("TroveManager - in Recovery Mode", async (accounts) => { // Check A's collateral and debt are the same const entireColl_A = (await troveManager.Troves(alice))[1].add( - await troveManager.getPendingETHReward(alice) + await troveManager.getPendingETHReward(alice), ); const entireDebt_A = (await troveManager.Troves(alice))[0].add( - await troveManager.getPendingBoldDebtReward(alice) + await troveManager.getPendingBoldDebtReward(alice), ); assert.equal(entireColl_A.toString(), A_coll); @@ -3808,24 +3802,24 @@ contract.skip("TroveManager - in Recovery Mode", async (accounts) => { th.applyLiquidationFee( F_totalDebt.add(G_totalDebt) .mul(toBN(dec(11, 17))) - .div(price) - ) + .div(price), + ), ); // check collateral surplus const freddy_remainingCollateral = F_coll.sub( - F_totalDebt.mul(th.toBN(dec(11, 17))).div(price) + F_totalDebt.mul(th.toBN(dec(11, 17))).div(price), ); const greta_remainingCollateral = G_coll.sub( - G_totalDebt.mul(th.toBN(dec(11, 17))).div(price) + G_totalDebt.mul(th.toBN(dec(11, 17))).div(price), ); th.assertIsApproximatelyEqual( await collSurplusPool.getCollateral(freddy), - freddy_remainingCollateral + freddy_remainingCollateral, ); th.assertIsApproximatelyEqual( await collSurplusPool.getCollateral(greta), - greta_remainingCollateral + greta_remainingCollateral, ); // can claim collateral @@ -3834,7 +3828,7 @@ contract.skip("TroveManager - in Recovery Mode", async (accounts) => { const freddy_balanceAfter = th.toBN(await contracts.WETH.balanceOf(freddy)); th.assertIsApproximatelyEqual( freddy_balanceAfter, - freddy_balanceBefore.add(th.toBN(freddy_remainingCollateral)) + freddy_balanceBefore.add(th.toBN(freddy_remainingCollateral)), ); const greta_balanceBefore = th.toBN(await contracts.WETH.balanceOf(greta)); @@ -3842,7 +3836,7 @@ contract.skip("TroveManager - in Recovery Mode", async (accounts) => { const greta_balanceAfter = th.toBN(await contracts.WETH.balanceOf(greta)); th.assertIsApproximatelyEqual( greta_balanceAfter, - greta_balanceBefore.add(th.toBN(greta_remainingCollateral)) + greta_balanceBefore.add(th.toBN(greta_remainingCollateral)), ); }); }); diff --git a/contracts/test/TroveManager_RecoveryMode_Batch_Liqudation_Test.js b/contracts/test/TroveManager_RecoveryMode_Batch_Liqudation_Test.js index b0084a67..7cd4374c 100644 --- a/contracts/test/TroveManager_RecoveryMode_Batch_Liqudation_Test.js +++ b/contracts/test/TroveManager_RecoveryMode_Batch_Liqudation_Test.js @@ -12,7 +12,7 @@ contract.skip( const [bountyAddress, lpRewardsAddress, multisig] = accounts.slice( 997, - 1000 + 1000, ); const [ owner, @@ -78,8 +78,7 @@ contract.skip( extraParams: { from: carol }, }); - const totalLiquidatedDebt = - A_totalDebt.add(B_totalDebt).add(C_totalDebt); + const totalLiquidatedDebt = A_totalDebt.add(B_totalDebt).add(C_totalDebt); await openTrove({ ICR: toBN(dec(340, 16)), @@ -173,7 +172,7 @@ contract.skip( // liquidate collaterals with the gas compensation fee subtracted const expectedCollateralLiquidatedA = th.applyLiquidationFee( - A_totalDebt.mul(mv._MCR).div(price) + A_totalDebt.mul(mv._MCR).div(price), ); const expectedCollateralLiquidatedC = th.applyLiquidationFee(C_coll); // Stability Pool gains @@ -190,17 +189,17 @@ contract.skip( assert.equal( spEthAfter.sub(spEthBefore).toString(), expectedCollateralLiquidatedA.toString(), - "Stability Pool ETH doesn’t match" + "Stability Pool ETH doesn’t match", ); assert.equal( spBoldBefore.sub(spBoldAfter).toString(), A_totalDebt.toString(), - "Stability Pool Bold doesn’t match" + "Stability Pool Bold doesn’t match", ); assert.equal( realGainInBold.toString(), expectedGainInBold.toString(), - "Stability Pool gains don’t match" + "Stability Pool gains don’t match", ); }); @@ -218,8 +217,7 @@ contract.skip( extraParams: { from: carol }, }); - const totalLiquidatedDebt = - A_totalDebt.add(B_totalDebt).add(C_totalDebt); + const totalLiquidatedDebt = A_totalDebt.add(B_totalDebt).add(C_totalDebt); await openTrove({ ICR: toBN(dec(310, 16)), @@ -264,5 +262,5 @@ contract.skip( assert.equal((await troveManager.Troves(carol))[3], "1"); }); }); - } + }, ); diff --git a/contracts/test/stakeDeclineTest.js b/contracts/test/stakeDeclineTest.js index 0063446c..8c07ff41 100644 --- a/contracts/test/stakeDeclineTest.js +++ b/contracts/test/stakeDeclineTest.js @@ -30,8 +30,7 @@ contract("TroveManager", async (accounts) => { let borrowerOperations; let hintHelpers; - const getOpenTroveBoldAmount = async (totalDebt) => - th.getOpenTroveBoldAmount(contracts, totalDebt); + const getOpenTroveBoldAmount = async (totalDebt) => th.getOpenTroveBoldAmount(contracts, totalDebt); const getSnapshotsRatio = async () => { const ratio = (await troveManager.totalStakesSnapshot()) @@ -65,55 +64,61 @@ contract("TroveManager", async (accounts) => { await priceFeed.setPrice(dec(100, 18)); // Make 1 mega troves A at ~50% total collateral - const ATroveId = await th.openTroveWrapper(contracts, + const ATroveId = await th.openTroveWrapper( + contracts, th._100pct, await getOpenTroveBoldAmount(dec(1, 31)), ZERO_ADDRESS, ZERO_ADDRESS, 0, - { from: A, value: dec(2, 29) } + { from: A, value: dec(2, 29) }, ); // Make 5 large troves B, C, D, E, F at ~10% total collateral - const BTroveId = await th.openTroveWrapper(contracts, + const BTroveId = await th.openTroveWrapper( + contracts, th._100pct, await getOpenTroveBoldAmount(dec(2, 30)), ZERO_ADDRESS, ZERO_ADDRESS, 0, - { from: B, value: dec(4, 28) } + { from: B, value: dec(4, 28) }, ); - await th.openTroveWrapper(contracts, + await th.openTroveWrapper( + contracts, th._100pct, await getOpenTroveBoldAmount(dec(2, 30)), ZERO_ADDRESS, ZERO_ADDRESS, 0, - { from: C, value: dec(4, 28) } + { from: C, value: dec(4, 28) }, ); - await th.openTroveWrapper(contracts, + await th.openTroveWrapper( + contracts, th._100pct, await getOpenTroveBoldAmount(dec(2, 30)), ZERO_ADDRESS, ZERO_ADDRESS, 0, - { from: D, value: dec(4, 28) } + { from: D, value: dec(4, 28) }, ); - await th.openTroveWrapper(contracts, + await th.openTroveWrapper( + contracts, th._100pct, await getOpenTroveBoldAmount(dec(2, 30)), ZERO_ADDRESS, ZERO_ADDRESS, 0, - { from: E, value: dec(4, 28) } + { from: E, value: dec(4, 28) }, ); - await th.openTroveWrapper(contracts, + await th.openTroveWrapper( + contracts, th._100pct, await getOpenTroveBoldAmount(dec(2, 30)), ZERO_ADDRESS, ZERO_ADDRESS, 0, - { from: F, value: dec(4, 28) } + { from: F, value: dec(4, 28) }, ); // Make 10 tiny troves at relatively negligible collateral (~1e-9 of total) @@ -121,20 +126,21 @@ contract("TroveManager", async (accounts) => { const eth_amount = dec(2, 20); for (const account of tinyTroves) { await contracts.WETH.mint(account, eth_amount); - await th.openTroveWrapper(contracts, + await th.openTroveWrapper( + contracts, th._100pct, await getOpenTroveBoldAmount(dec(1, 22)), ZERO_ADDRESS, ZERO_ADDRESS, 0, - { from: account, value: eth_amount } + { from: account, value: eth_amount }, ); } // liquidate 1 trove at ~50% total system collateral await priceFeed.setPrice(dec(50, 18)); assert.isTrue( - await troveManager.checkRecoveryMode(await priceFeed.getPrice()) + await troveManager.checkRecoveryMode(await priceFeed.getPrice()), ); await troveManager.liquidate(ATroveId); @@ -160,7 +166,7 @@ contract("TroveManager", async (accounts) => { false, 1, false, - { from: B } + { from: B }, ); // B repays 1 wei // console.log(`B stake after A1: ${(await troveManager.Troves(BTroveId))[2]}`); // console.log(`Snapshots ratio after A1: ${await getSnapshotsRatio()}`); @@ -183,7 +189,7 @@ contract("TroveManager", async (accounts) => { false, 1, false, - { from: B } + { from: B }, ); // A repays 1 wei // console.log( // `B stake after A${idx + 2}: ${(await troveManager.Troves(B))[2]}` diff --git a/contracts/utils/BNConverter.js b/contracts/utils/BNConverter.js index 8b799513..d6089b34 100644 --- a/contracts/utils/BNConverter.js +++ b/contracts/utils/BNConverter.js @@ -1,5 +1,5 @@ -const BN = require('bn.js'); -const Decimal = require('decimal.js'); +const BN = require("bn.js"); +const Decimal = require("decimal.js"); /* Helper functions for converting string-ified decimal numbers to uint-ified decimal representations. @@ -15,32 +15,32 @@ Input: makeBN18('1.000000000000000001') ----> Output: new BN('1000000000000000 class BNConverter { static makeBN(num, precision) { - let strNum = num.toString() + let strNum = num.toString(); this.checkOnlyNumericChars(strNum); - const intPart = strNum.split(".")[0] - const fractionPart = strNum.includes(".") ? strNum.split(".")[1] : "" + const intPart = strNum.split(".")[0]; + const fractionPart = strNum.includes(".") ? strNum.split(".")[1] : ""; if (fractionPart.length > precision) { - throw new Error(`MakeBN: argument must have <= ${precision} decimal places`) + throw new Error(`MakeBN: argument must have <= ${precision} decimal places`); } - const trailingZeros = "0".repeat(precision - fractionPart.length) - const bigNumArg = intPart + fractionPart + trailingZeros - return new BN(bigNumArg, 10) + const trailingZeros = "0".repeat(precision - fractionPart.length); + const bigNumArg = intPart + fractionPart + trailingZeros; + return new BN(bigNumArg, 10); } static checkOnlyNumericChars(input) { try { - let num = new Decimal(input) + let num = new Decimal(input); } catch (err) { - throw new Error(`MakeBN: input must be number or string-ified number, no non-numeric characters`) + throw new Error(`MakeBN: input must be number or string-ified number, no non-numeric characters`); } } static makeBN18(strNum) { - return this.makeBN(strNum, 18) + return this.makeBN(strNum, 18); } // Convert a BN uint representation to a 'Decimal' object, with the same number of decimal places @@ -51,21 +51,20 @@ class BNConverter { let resNum; if (strBN.length <= digits) { - const fractPartZeros = "0".repeat(digits - strBN.length) - fractPart = fractPartZeros + strBN - resNum = new Decimal("0." + fractPart) - + const fractPartZeros = "0".repeat(digits - strBN.length); + fractPart = fractPartZeros + strBN; + resNum = new Decimal("0." + fractPart); } else if (strBN.length > digits) { - fractPart = strBN.slice(-digits) // grab digits after decimal point - intPart = strBN.slice(0, strBN.length - digits) // grab digits preceding decimal point - resNum = new Decimal(intPart + "." + fractPart) + fractPart = strBN.slice(-digits); // grab digits after decimal point + intPart = strBN.slice(0, strBN.length - digits); // grab digits preceding decimal point + resNum = new Decimal(intPart + "." + fractPart); } - return resNum + return resNum; } static makeDecimal18(num) { - return this.makeDecimal(num, 18) + return this.makeDecimal(num, 18); } } -module.exports = { BNConverter: BNConverter } \ No newline at end of file +module.exports = { BNConverter: BNConverter }; diff --git a/contracts/utils/deploy-cli.ts b/contracts/utils/deploy-cli.ts index f8818327..157a7f1d 100644 --- a/contracts/utils/deploy-cli.ts +++ b/contracts/utils/deploy-cli.ts @@ -193,12 +193,12 @@ function isDeploymentLog(log: unknown): log is { && "transactions" in log && Array.isArray(log.transactions) && log.transactions - .filter(tx => ( + .filter((tx) => ( typeof tx === "object" && tx !== null && tx.transactionType === "CREATE" )) - .every(tx => ( + .every((tx) => ( typeof tx.contractName === "string" && typeof tx.contractAddress === "string" )) diff --git a/contracts/utils/deployment-artifacts-to-app-env.ts b/contracts/utils/deployment-artifacts-to-app-env.ts index ddc1b3dd..706bb9d2 100644 --- a/contracts/utils/deployment-artifacts-to-app-env.ts +++ b/contracts/utils/deployment-artifacts-to-app-env.ts @@ -41,7 +41,7 @@ export async function main() { const deploymentContext = parseDeploymentContext(await fs.readFile(argv._[0], "utf-8")); const outputEnv = objectToEnvironmentVariables( - deploymentContextToAppEnvVariables(deploymentContext) + deploymentContextToAppEnvVariables(deploymentContext), ); await fs.writeFile(argv._[1], outputEnv); diff --git a/contracts/utils/deploymentGasAndBytecode.js b/contracts/utils/deploymentGasAndBytecode.js index 03997cd5..0679eda1 100644 --- a/contracts/utils/deploymentGasAndBytecode.js +++ b/contracts/utils/deploymentGasAndBytecode.js @@ -14,13 +14,13 @@ const CommunityIssuance = artifacts.require("./LQTY/CommunityIssuance.sol"); const HintHelpers = artifacts.require("./HintHelpers.sol"); const CommunityIssuanceTester = artifacts.require( - "./LQTY/CommunityIssuanceTester.sol" + "./LQTY/CommunityIssuanceTester.sol", ); const ActivePoolTester = artifacts.require("./ActivePoolTester.sol"); const DefaultPoolTester = artifacts.require("./DefaultPoolTester.sol"); const LiquityMathTester = artifacts.require("./LiquityMathTester.sol"); const BorrowerOperationsTester = artifacts.require( - "./BorrowerOperationsTester.sol" + "./BorrowerOperationsTester.sol", ); const TroveManagerTester = artifacts.require("./TroveManagerTester.sol"); // const BoldTokenTester = artifacts.require("./BoldTokenTester.sol"); @@ -73,11 +73,11 @@ const getBytecodeSize = (contractABI) => { const getUSDCostFromGasCost = ( deploymentGasTotal, gasPriceInGwei, - ETHPrice + ETHPrice, ) => { const dollarCost = (deploymentGasTotal * gasPriceInGwei * ETHPrice) / 1e9; console.log( - `At gas price ${gasPriceInGwei} GWei, and ETH Price $${ETHPrice} per ETH, the total cost of deployment in USD is: $${dollarCost}` + `At gas price ${gasPriceInGwei} GWei, and ETH Price $${ETHPrice} per ETH, the total cost of deployment in USD is: $${dollarCost}`, ); }; @@ -87,7 +87,7 @@ const logContractDeploymentCosts = async (contracts) => { for (contractName of Object.keys(contracts)) { const gasCost = await getGasFromContractDeployment( contracts[contractName], - contractName + contractName, ); totalGasCost = totalGasCost + Number(gasCost); } @@ -101,7 +101,7 @@ const logContractObjects = async (contracts) => { for (contractName of Object.keys(contracts)) { const gasCost = await getGasFromContractDeployment( contracts[contractName], - contractName + contractName, ); totalGasCost = totalGasCost + Number(gasCost); } @@ -119,7 +119,7 @@ async function main() { const coreContracts = await dh.deployLiquityCoreHardhat(); const LQTYContracts = await dh.deployLQTYContractsHardhat( ARBITRARY_ADDRESS, - ARBITRARY_ADDRESS + ARBITRARY_ADDRESS, ); await dh.connectCoreContracts(coreContracts, LQTYContracts); diff --git a/contracts/utils/deploymentHelpers.js b/contracts/utils/deploymentHelpers.js index a53b88dd..6510c39a 100644 --- a/contracts/utils/deploymentHelpers.js +++ b/contracts/utils/deploymentHelpers.js @@ -15,7 +15,7 @@ const MockInterestRouter = artifacts.require("./MockInterestRouter.sol"); const ERC20 = artifacts.require("./ERC20MinterMock.sol"); // "@openzeppelin/contracts/token/ERC20/presets/ERC20PresetMinterPauser.sol" // "../node_modules/@openzeppelin/contracts/build/contracts/ERC20PresetMinterPauser.json" -//); +// ); const { web3, ethers } = require("hardhat"); const { accountsList } = require("../hardhatAccountsList2k.js"); @@ -49,10 +49,10 @@ class DeploymentHelper { BoldToken, HintHelpers, }) - .map(([name, contract]) => [ - name, - mocks[name] ?? contract - ]) + .map(([name, contract]) => [ + name, + mocks[name] ?? contract, + ]), ); // Borrowing contracts @@ -72,11 +72,11 @@ class DeploymentHelper { stabilityPool, borrowerOperations, activePool, - }, Contracts.BoldToken) + }, Contracts.BoldToken); const mockInterestRouter = await MockInterestRouter.new(); const hintHelpers = await Contracts.HintHelpers.new(); - + // // Needed? // const price = await priceFeed.getPrice(); // const uint128Max = web3.utils.toBN( @@ -87,7 +87,7 @@ class DeploymentHelper { // ); // TODO: setAsDeployed all above? - + Contracts.BoldToken.setAsDeployed(boldToken); Contracts.DefaultPool.setAsDeployed(defaultPool); Contracts.PriceFeedTestnet.setAsDeployed(priceFeedTestnet); @@ -114,7 +114,7 @@ class DeploymentHelper { collSurplusPool, borrowerOperations, hintHelpers, - mockInterestRouter + mockInterestRouter, }; return coreContracts; } @@ -124,25 +124,25 @@ class DeploymentHelper { contracts.troveManager.address, contracts.stabilityPool.address, contracts.borrowerOperations.address, - contracts.activePool.address + contracts.activePool.address, ); return contracts; } // Connect contracts to their dependencies static async connectCoreContracts(contracts) { - // set contracts in the Trove Manager - await contracts.troveManager.setAddresses( - contracts.borrowerOperations.address, - contracts.activePool.address, - contracts.defaultPool.address, - contracts.stabilityPool.address, - contracts.gasPool.address, - contracts.collSurplusPool.address, - contracts.priceFeedTestnet.address, - contracts.boldToken.address, - contracts.sortedTroves.address - ); + // set contracts in the Trove Manager + await contracts.troveManager.setAddresses( + contracts.borrowerOperations.address, + contracts.activePool.address, + contracts.defaultPool.address, + contracts.stabilityPool.address, + contracts.gasPool.address, + contracts.collSurplusPool.address, + contracts.priceFeedTestnet.address, + contracts.boldToken.address, + contracts.sortedTroves.address, + ); await contracts.stabilityPool.setAddresses( contracts.borrowerOperations.address, @@ -150,12 +150,12 @@ class DeploymentHelper { contracts.activePool.address, contracts.boldToken.address, contracts.sortedTroves.address, - contracts.priceFeedTestnet.address + contracts.priceFeedTestnet.address, ); // set TroveManager addr in SortedTroves await contracts.sortedTroves.setAddresses( contracts.troveManager.address, - contracts.borrowerOperations.address + contracts.borrowerOperations.address, ); // set contracts in BorrowerOperations @@ -168,8 +168,8 @@ class DeploymentHelper { contracts.collSurplusPool.address, contracts.priceFeedTestnet.address, contracts.sortedTroves.address, - contracts.boldToken.address - //contracts.stETH.address + contracts.boldToken.address, + // contracts.stETH.address ); await contracts.activePool.setAddresses( @@ -178,14 +178,14 @@ class DeploymentHelper { contracts.stabilityPool.address, contracts.defaultPool.address, contracts.boldToken.address, - contracts.mockInterestRouter.address - //contracts.stETH.address, + contracts.mockInterestRouter.address, + // contracts.stETH.address, ); await contracts.defaultPool.setAddresses( contracts.troveManager.address, contracts.activePool.address, - //contracts.stETH.address + // contracts.stETH.address ); await contracts.collSurplusPool.setAddresses( @@ -197,7 +197,7 @@ class DeploymentHelper { // set contracts in HintHelpers await contracts.hintHelpers.setAddresses( contracts.sortedTroves.address, - contracts.troveManager.address + contracts.troveManager.address, ); } } diff --git a/contracts/utils/fundAccounts.js b/contracts/utils/fundAccounts.js index 4f0f6e49..423491df 100644 --- a/contracts/utils/fundAccounts.js +++ b/contracts/utils/fundAccounts.js @@ -2,7 +2,7 @@ const fundAccounts = async (accounts, token) => { return Promise.all( accounts.map((account) => ( token.mint(account, String(10n ** 36n)) - )) + )), ); }; diff --git a/contracts/utils/hintExamples.js b/contracts/utils/hintExamples.js index 6b15d961..7b572006 100644 --- a/contracts/utils/hintExamples.js +++ b/contracts/utils/hintExamples.js @@ -1,124 +1,122 @@ - -const { TestHelper: th } = require("../utils/testHelpers.js") -const dh = require("./deploymentHelpers.js") +const { TestHelper: th } = require("../utils/testHelpers.js"); +const dh = require("./deploymentHelpers.js"); // const [borrower, A, B, C] = (() => Array.from(Array(4), x => web3.eth.accounts.create().address))() async function main() { - const accounts = await web3.eth.getAccounts() - const [borrower, A, B] = accounts + const accounts = await web3.eth.getAccounts(); + const [borrower, A, B] = accounts; - const coreContracts = await dh.deployLiquityCoreHardhat() - const ARBITRARY_ADDRESS = "0x5f4eC3Df9cbd43714FE2740f5E3616155c5b8419" + const coreContracts = await dh.deployLiquityCoreHardhat(); + const ARBITRARY_ADDRESS = "0x5f4eC3Df9cbd43714FE2740f5E3616155c5b8419"; const LQTYContracts = await dh.deployLQTYContractsHardhat( - ARBITRARY_ADDRESS, - ARBITRARY_ADDRESS, - ARBITRARY_ADDRESS - ) + ARBITRARY_ADDRESS, + ARBITRARY_ADDRESS, + ARBITRARY_ADDRESS, + ); - const { troveManager, borrowerOperations, hintHelpers, sortedTroves, priceFeedTestnet } = coreContracts + const { troveManager, borrowerOperations, hintHelpers, sortedTroves, priceFeedTestnet } = coreContracts; await dh.connectCoreContracts(coreContracts, LQTYContracts); - await dh.connectLQTYContractsToCore(LQTYContracts, coreContracts) + await dh.connectLQTYContractsToCore(LQTYContracts, coreContracts); // Examples of off-chain hint calculation for Open Trove - const toWei = web3.utils.toWei - const toBN = web3.utils.toBN + const toWei = web3.utils.toWei; + const toBN = web3.utils.toBN; - const price = toBN(toWei('2500')) - await priceFeedTestnet.setPrice(toBN(toWei('2500'))) + const price = toBN(toWei("2500")); + await priceFeedTestnet.setPrice(toBN(toWei("2500"))); - const LUSDAmount = toBN(toWei('2500')) // borrower wants to withdraw 2500 LUSD - const ETHColl = toBN(toWei('5')) // borrower wants to lock 5 ETH collateral + const LUSDAmount = toBN(toWei("2500")); // borrower wants to withdraw 2500 LUSD + const ETHColl = toBN(toWei("5")); // borrower wants to lock 5 ETH collateral // Call deployed TroveManager contract to read the liquidation reserve and latest borrowing fee - const liquidationReserve = await troveManager.LUSD_GAS_COMPENSATION() - const expectedFee = await troveManager.getBorrowingFeeWithDecay(LUSDAmount) - + const liquidationReserve = await troveManager.LUSD_GAS_COMPENSATION(); + const expectedFee = await troveManager.getBorrowingFeeWithDecay(LUSDAmount); + // Total debt of the new trove = LUSD amount drawn, plus fee, plus the liquidation reserve - const expectedDebt = LUSDAmount.add(expectedFee).add(liquidationReserve) + const expectedDebt = LUSDAmount.add(expectedFee).add(liquidationReserve); // Get the nominal NICR of the new trove - const _1e20 = toBN(toWei('100')) - let NICR = ETHColl.mul(_1e20).div(expectedDebt) + const _1e20 = toBN(toWei("100")); + let NICR = ETHColl.mul(_1e20).div(expectedDebt); - // Get an approximate address hint from the deployed HintHelper contract. Use (15 * number of troves) trials + // Get an approximate address hint from the deployed HintHelper contract. Use (15 * number of troves) trials // to get an approx. hint that is close to the right position. - let numTroves = await sortedTroves.getSize() - let numTrials = numTroves.mul(toBN('15')) - let { 0: approxHint } = await hintHelpers.getApproxHint(NICR, numTrials, 42) // random seed of 42 + let numTroves = await sortedTroves.getSize(); + let numTrials = numTroves.mul(toBN("15")); + let { 0: approxHint } = await hintHelpers.getApproxHint(NICR, numTrials, 42); // random seed of 42 // Use the approximate hint to get the exact upper and lower hints from the deployed SortedTroves contract - let { 0: upperHint, 1: lowerHint } = await sortedTroves.findInsertPosition(NICR, approxHint, approxHint) + let { 0: upperHint, 1: lowerHint } = await sortedTroves.findInsertPosition(NICR, approxHint, approxHint); // Finally, call openTrove with the exact upperHint and lowerHint - const maxFee = '5'.concat('0'.repeat(16)) // Slippage protection: 5% - await borrowerOperations.openTrove(maxFee, LUSDAmount, upperHint, lowerHint, { value: ETHColl }) + const maxFee = "5".concat("0".repeat(16)); // Slippage protection: 5% + await borrowerOperations.openTrove(maxFee, LUSDAmount, upperHint, lowerHint, { value: ETHColl }); - // --- adjust trove --- + // --- adjust trove --- - const collIncrease = toBN(toWei('1')) // borrower wants to add 1 ETH - const LUSDRepayment = toBN(toWei('230')) // borrower wants to repay 230 LUSD + const collIncrease = toBN(toWei("1")); // borrower wants to add 1 ETH + const LUSDRepayment = toBN(toWei("230")); // borrower wants to repay 230 LUSD // Get trove's current debt and coll - const {0: debt, 1: coll} = await troveManager.getEntireDebtAndColl(borrower) - - const newDebt = debt.sub(LUSDRepayment) - const newColl = coll.add(collIncrease) + const { 0: debt, 1: coll } = await troveManager.getEntireDebtAndColl(borrower); - NICR = newColl.mul(_1e20).div(newDebt) + const newDebt = debt.sub(LUSDRepayment); + const newColl = coll.add(collIncrease); - // Get an approximate address hint from the deployed HintHelper contract. Use (15 * number of troves) trials - // to get an approx. hint that is close to the right position. - numTroves = await sortedTroves.getSize() - numTrials = numTroves.mul(toBN('15')) - ({0: approxHint} = await hintHelpers.getApproxHint(NICR, numTrials, 42)) + NICR = newColl.mul(_1e20).div(newDebt); - // Use the approximate hint to get the exact upper and lower hints from the deployed SortedTroves contract - ({ 0: upperHint, 1: lowerHint } = await sortedTroves.findInsertPosition(NICR, approxHint, approxHint)) + // Get an approximate address hint from the deployed HintHelper contract. Use (15 * number of troves) trials + // to get an approx. hint that is close to the right position. + numTroves = await sortedTroves.getSize(); + numTrials = numTroves.mul(toBN("15"))({ 0: approxHint } = await hintHelpers.getApproxHint(NICR, numTrials, 42))// Use the approximate hint to get the exact upper and lower hints from the deployed SortedTroves contract + ({ 0: upperHint, 1: lowerHint } = await sortedTroves.findInsertPosition(NICR, approxHint, approxHint)); // Call adjustTrove with the exact upperHint and lowerHint - await borrowerOperations.adjustTrove(maxFee, 0, LUSDRepayment, false, upperHint, lowerHint, {value: collIncrease}) - + await borrowerOperations.adjustTrove(maxFee, 0, LUSDRepayment, false, upperHint, lowerHint, { value: collIncrease }); // --- RedeemCollateral --- // Get the redemptions hints from the deployed HintHelpers contract - const redemptionhint = await hintHelpers.getRedemptionHints(LUSDAmount, price, 50) + const redemptionhint = await hintHelpers.getRedemptionHints(LUSDAmount, price, 50); - const {0: firstRedemptionHint, 1: partialRedemptionNewICR, 2: truncatedLUSDAmount} = redemptionhint + const { 0: firstRedemptionHint, 1: partialRedemptionNewICR, 2: truncatedLUSDAmount } = redemptionhint; // Get the approximate partial redemption hint const { hintAddress: approxPartialRedemptionHint, - latestRandomSeed - } = await contracts.hintHelpers.getApproxHint(partialRedemptionNewICR, numTrials, 42) - - /* Use the approximate partial redemption hint to get the exact partial redemption hint from the + latestRandomSeed, + } = await contracts.hintHelpers.getApproxHint(partialRedemptionNewICR, numTrials, 42); + + /* Use the approximate partial redemption hint to get the exact partial redemption hint from the * deployed SortedTroves contract */ - const exactPartialRedemptionHint = (await sortedTroves.findInsertPosition(partialRedemptionNewICR, + const exactPartialRedemptionHint = await sortedTroves.findInsertPosition( + partialRedemptionNewICR, approxPartialRedemptionHint, - approxPartialRedemptionHint)) + approxPartialRedemptionHint, + ); /* Finally, perform the on-chain redemption, passing the truncated LUSD amount, the correct hints, and the expected - * ICR of the final partially redeemed trove in the sequence. + * ICR of the final partially redeemed trove in the sequence. */ - await troveManager.redeemCollateral(truncatedLUSDAmount, + await troveManager.redeemCollateral( + truncatedLUSDAmount, firstRedemptionHint, exactPartialRedemptionHint[0], exactPartialRedemptionHint[1], partialRedemptionNewICR, - 0, maxFee, + 0, + maxFee, { from: redeemer }, - ) + ); } main() .then(() => process.exit(0)) - .catch(error => { + .catch((error) => { console.error(error); process.exit(1); }); - diff --git a/contracts/utils/makeAccounts.js b/contracts/utils/makeAccounts.js index 5825f1be..f543bb4b 100644 --- a/contracts/utils/makeAccounts.js +++ b/contracts/utils/makeAccounts.js @@ -1,60 +1,63 @@ -const fs = require('fs') +const fs = require("fs"); // Make accounts with 1 trillion Ether const makeAccount = () => { - acc = `{ privateKey: "${randomHex()}", balance: "'0xc097ce7bc90715b34b9f1000000000'" }` - return acc -} + acc = `{ privateKey: "${randomHex()}", balance: "'0xc097ce7bc90715b34b9f1000000000'" }`; + return acc; +}; const randomHex = () => { - const hexChars = "abcdefABCDEF0123456789" - let hexCharArray = ["0x"] + const hexChars = "abcdefABCDEF0123456789"; + let hexCharArray = ["0x"]; for (i = 0; i < 64; i++) { - hexCharArray.push(randomChar(hexChars)) + hexCharArray.push(randomChar(hexChars)); } // console.log("hexarray is" + hexCharArray) - return hexCharArray.join("") -} + return hexCharArray.join(""); +}; const randomChar = (chars) => { - const len = chars.length - const idx = Math.floor(len * Math.random()) + const len = chars.length; + const idx = Math.floor(len * Math.random()); - return chars[idx] -} + return chars[idx]; +}; const makeHardhatAccountsList = (n) => { - accountsDict = {} - accounts = [] - + accountsDict = {}; + accounts = []; + let i = 0; let account; while (i < n) { - console.log(i) - account = makeAccount() + console.log(i); + account = makeAccount(); // console.log("account is" + account) if (Object.keys(accountsDict).includes(account)) { - i += 1 - continue + i += 1; + continue; } else { - accounts.push(account) - accountsDict[account] = true - i += 1 + accounts.push(account); + accountsDict[account] = true; + i += 1; } } - return( - `const accountsList = \n + return ( + `const accountsList = \n [ ${accounts.join(",\n")} ]\n module.exports = { accountsList: accountsList - };`) -} + };` + ); +}; // Construct accounts array data -const arrayList = makeHardhatAccountsList(80000) +const arrayList = makeHardhatAccountsList(80000); // console.log(arrayList) -fs.appendFile('../accountsList.js', arrayList, (err) => { if (err) console.log(err) }) +fs.appendFile("../accountsList.js", arrayList, (err) => { + if (err) console.log(err); +}); diff --git a/contracts/utils/oracleABIs.js b/contracts/utils/oracleABIs.js index 2a04a8c8..6dd3cd6d 100644 --- a/contracts/utils/oracleABIs.js +++ b/contracts/utils/oracleABIs.js @@ -1,374 +1,374 @@ const MainnetAggregatorABI = [ - { - "constant": true, - "inputs": [], - "name": "latestCompletedAnswer", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "payable": false, - "stateMutability": "view", - "type": "function" - }, - { - "constant": true, - "inputs": [], - "name": "currentAnswer", - "outputs": [ - { - "internalType": "int256", - "name": "", - "type": "int256" - } - ], - "payable": false, - "stateMutability": "view", - "type": "function" - }, - { - "constant": true, - "inputs": [], - "name": "updatedHeight", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "payable": false, - "stateMutability": "view", - "type": "function" - } - ] + { + "constant": true, + "inputs": [], + "name": "latestCompletedAnswer", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256", + }, + ], + "payable": false, + "stateMutability": "view", + "type": "function", + }, + { + "constant": true, + "inputs": [], + "name": "currentAnswer", + "outputs": [ + { + "internalType": "int256", + "name": "", + "type": "int256", + }, + ], + "payable": false, + "stateMutability": "view", + "type": "function", + }, + { + "constant": true, + "inputs": [], + "name": "updatedHeight", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256", + }, + ], + "payable": false, + "stateMutability": "view", + "type": "function", + }, +]; const TestnetAggregatorABI = [ - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "int256", - "name": "current", - "type": "int256" - }, - { - "indexed": true, - "internalType": "uint256", - "name": "roundId", - "type": "uint256" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "timestamp", - "type": "uint256" - } - ], - "name": "AnswerUpdated", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "uint256", - "name": "roundId", - "type": "uint256" - }, - { - "indexed": true, - "internalType": "address", - "name": "startedBy", - "type": "address" - } - ], - "name": "NewRound", - "type": "event" - }, - { - "constant": true, - "inputs": [], - "name": "latestAnswer", - "outputs": [ - { - "internalType": "int256", - "name": "", - "type": "int256" - } - ], - "payable": false, - "stateMutability": "view", - "type": "function" - }, - { - "constant": true, - "inputs": [], - "name": "latestTimestamp", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "payable": false, - "stateMutability": "view", - "type": "function" - }, - { - "constant": true, - "inputs": [], - "name": "latestRound", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "payable": false, - "stateMutability": "view", - "type": "function" - }, - { - "constant": true, - "inputs": [ - { - "internalType": "uint256", - "name": "roundId", - "type": "uint256" - } - ], - "name": "getAnswer", - "outputs": [ - { - "internalType": "int256", - "name": "", - "type": "int256" - } - ], - "payable": false, - "stateMutability": "view", - "type": "function" - }, - { - "constant": true, - "inputs": [ - { - "internalType": "uint256", - "name": "roundId", - "type": "uint256" - } - ], - "name": "getTimestamp", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "payable": false, - "stateMutability": "view", - "type": "function" - } - ] + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "int256", + "name": "current", + "type": "int256", + }, + { + "indexed": true, + "internalType": "uint256", + "name": "roundId", + "type": "uint256", + }, + { + "indexed": false, + "internalType": "uint256", + "name": "timestamp", + "type": "uint256", + }, + ], + "name": "AnswerUpdated", + "type": "event", + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "uint256", + "name": "roundId", + "type": "uint256", + }, + { + "indexed": true, + "internalType": "address", + "name": "startedBy", + "type": "address", + }, + ], + "name": "NewRound", + "type": "event", + }, + { + "constant": true, + "inputs": [], + "name": "latestAnswer", + "outputs": [ + { + "internalType": "int256", + "name": "", + "type": "int256", + }, + ], + "payable": false, + "stateMutability": "view", + "type": "function", + }, + { + "constant": true, + "inputs": [], + "name": "latestTimestamp", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256", + }, + ], + "payable": false, + "stateMutability": "view", + "type": "function", + }, + { + "constant": true, + "inputs": [], + "name": "latestRound", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256", + }, + ], + "payable": false, + "stateMutability": "view", + "type": "function", + }, + { + "constant": true, + "inputs": [ + { + "internalType": "uint256", + "name": "roundId", + "type": "uint256", + }, + ], + "name": "getAnswer", + "outputs": [ + { + "internalType": "int256", + "name": "", + "type": "int256", + }, + ], + "payable": false, + "stateMutability": "view", + "type": "function", + }, + { + "constant": true, + "inputs": [ + { + "internalType": "uint256", + "name": "roundId", + "type": "uint256", + }, + ], + "name": "getTimestamp", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256", + }, + ], + "payable": false, + "stateMutability": "view", + "type": "function", + }, +]; const MainnetPriceFeedABI = [ - { - "inputs": [ - { - "internalType": "address", - "name": "_priceAggregatorAddress", - "type": "address" - } - ], - "payable": false, - "stateMutability": "nonpayable", - "type": "constructor" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "address", - "name": "previousOwner", - "type": "address" - }, - { - "indexed": true, - "internalType": "address", - "name": "newOwner", - "type": "address" - } - ], - "name": "OwnershipTransferred", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": false, - "internalType": "uint256", - "name": "_price", - "type": "uint256" - } - ], - "name": "PriceUpdated", - "type": "event" - }, - { - "constant": true, - "inputs": [], - "name": "isOwner", - "outputs": [ - { - "internalType": "bool", - "name": "", - "type": "bool" - } - ], - "payable": false, - "stateMutability": "view", - "type": "function" - }, - { - "constant": true, - "inputs": [], - "name": "owner", - "outputs": [ - { - "internalType": "address", - "name": "", - "type": "address" - } - ], - "payable": false, - "stateMutability": "view", - "type": "function" - }, - { - "constant": true, - "inputs": [], - "name": "price", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "payable": false, - "stateMutability": "view", - "type": "function" - }, - { - "constant": true, - "inputs": [], - "name": "priceAggregatorAddress", - "outputs": [ - { - "internalType": "address", - "name": "", - "type": "address" - } - ], - "payable": false, - "stateMutability": "view", - "type": "function" - }, - { - "constant": false, - "inputs": [], - "name": "renounceOwnership", - "outputs": [], - "payable": false, - "stateMutability": "nonpayable", - "type": "function" - }, - { - "constant": false, - "inputs": [ - { - "internalType": "address", - "name": "newOwner", - "type": "address" - } - ], - "name": "transferOwnership", - "outputs": [], - "payable": false, - "stateMutability": "nonpayable", - "type": "function" - }, - { - "constant": false, - "inputs": [], - "name": "updatePrice", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "payable": false, - "stateMutability": "nonpayable", - "type": "function" - }, - { - "constant": true, - "inputs": [], - "name": "getLatestPrice", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "payable": false, - "stateMutability": "view", - "type": "function" - }, - { - "constant": true, - "inputs": [], - "name": "getLatestAnswerID", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "payable": false, - "stateMutability": "view", - "type": "function" - }, - { - "constant": true, - "inputs": [], - "name": "getLatestTimestamp", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "payable": false, - "stateMutability": "view", - "type": "function" - } - ] -const TestnetPriceFeedABI = [ + { + "inputs": [ + { + "internalType": "address", + "name": "_priceAggregatorAddress", + "type": "address", + }, + ], + "payable": false, + "stateMutability": "nonpayable", + "type": "constructor", + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "previousOwner", + "type": "address", + }, + { + "indexed": true, + "internalType": "address", + "name": "newOwner", + "type": "address", + }, + ], + "name": "OwnershipTransferred", + "type": "event", + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint256", + "name": "_price", + "type": "uint256", + }, + ], + "name": "PriceUpdated", + "type": "event", + }, + { + "constant": true, + "inputs": [], + "name": "isOwner", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool", + }, + ], + "payable": false, + "stateMutability": "view", + "type": "function", + }, + { + "constant": true, + "inputs": [], + "name": "owner", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address", + }, + ], + "payable": false, + "stateMutability": "view", + "type": "function", + }, + { + "constant": true, + "inputs": [], + "name": "price", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256", + }, + ], + "payable": false, + "stateMutability": "view", + "type": "function", + }, + { + "constant": true, + "inputs": [], + "name": "priceAggregatorAddress", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address", + }, + ], + "payable": false, + "stateMutability": "view", + "type": "function", + }, + { + "constant": false, + "inputs": [], + "name": "renounceOwnership", + "outputs": [], + "payable": false, + "stateMutability": "nonpayable", + "type": "function", + }, + { + "constant": false, + "inputs": [ + { + "internalType": "address", + "name": "newOwner", + "type": "address", + }, + ], + "name": "transferOwnership", + "outputs": [], + "payable": false, + "stateMutability": "nonpayable", + "type": "function", + }, + { + "constant": false, + "inputs": [], + "name": "updatePrice", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256", + }, + ], + "payable": false, + "stateMutability": "nonpayable", + "type": "function", + }, + { + "constant": true, + "inputs": [], + "name": "getLatestPrice", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256", + }, + ], + "payable": false, + "stateMutability": "view", + "type": "function", + }, + { + "constant": true, + "inputs": [], + "name": "getLatestAnswerID", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256", + }, + ], + "payable": false, + "stateMutability": "view", + "type": "function", + }, + { + "constant": true, + "inputs": [], + "name": "getLatestTimestamp", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256", + }, + ], + "payable": false, + "stateMutability": "view", + "type": "function", + }, +]; +const TestnetPriceFeedABI = [ { "anonymous": false, "inputs": [ @@ -376,11 +376,11 @@ const TestnetPriceFeedABI = [ "indexed": false, "internalType": "address", "name": "_troveManagerAddress", - "type": "address" - } + "type": "address", + }, ], "name": "TroveManagerAddressChanged", - "type": "event" + "type": "event", }, { "anonymous": false, @@ -389,17 +389,17 @@ const TestnetPriceFeedABI = [ "indexed": true, "internalType": "address", "name": "previousOwner", - "type": "address" + "type": "address", }, { "indexed": true, "internalType": "address", "name": "newOwner", - "type": "address" - } + "type": "address", + }, ], "name": "OwnershipTransferred", - "type": "event" + "type": "event", }, { "anonymous": false, @@ -408,11 +408,11 @@ const TestnetPriceFeedABI = [ "indexed": false, "internalType": "uint256", "name": "_newPrice", - "type": "uint256" - } + "type": "uint256", + }, ], "name": "PriceUpdated", - "type": "event" + "type": "event", }, { "constant": true, @@ -422,12 +422,12 @@ const TestnetPriceFeedABI = [ { "internalType": "address", "name": "", - "type": "address" - } + "type": "address", + }, ], "payable": false, "stateMutability": "view", - "type": "function" + "type": "function", }, { "constant": true, @@ -437,12 +437,12 @@ const TestnetPriceFeedABI = [ { "internalType": "bool", "name": "", - "type": "bool" - } + "type": "bool", + }, ], "payable": false, "stateMutability": "view", - "type": "function" + "type": "function", }, { "constant": true, @@ -452,12 +452,12 @@ const TestnetPriceFeedABI = [ { "internalType": "address", "name": "", - "type": "address" - } + "type": "address", + }, ], "payable": false, "stateMutability": "view", - "type": "function" + "type": "function", }, { "constant": true, @@ -467,12 +467,12 @@ const TestnetPriceFeedABI = [ { "internalType": "uint256", "name": "", - "type": "uint256" - } + "type": "uint256", + }, ], "payable": false, "stateMutability": "view", - "type": "function" + "type": "function", }, { "constant": true, @@ -482,12 +482,12 @@ const TestnetPriceFeedABI = [ { "internalType": "address", "name": "", - "type": "address" - } + "type": "address", + }, ], "payable": false, "stateMutability": "view", - "type": "function" + "type": "function", }, { "constant": true, @@ -497,12 +497,12 @@ const TestnetPriceFeedABI = [ { "internalType": "address", "name": "", - "type": "address" - } + "type": "address", + }, ], "payable": false, "stateMutability": "view", - "type": "function" + "type": "function", }, { "constant": false, @@ -511,7 +511,7 @@ const TestnetPriceFeedABI = [ "outputs": [], "payable": false, "stateMutability": "nonpayable", - "type": "function" + "type": "function", }, { "constant": false, @@ -519,14 +519,14 @@ const TestnetPriceFeedABI = [ { "internalType": "address", "name": "newOwner", - "type": "address" - } + "type": "address", + }, ], "name": "transferOwnership", "outputs": [], "payable": false, "stateMutability": "nonpayable", - "type": "function" + "type": "function", }, { "constant": false, @@ -534,14 +534,14 @@ const TestnetPriceFeedABI = [ { "internalType": "address", "name": "_troveManagerAddress", - "type": "address" - } + "type": "address", + }, ], "name": "setTroveManagerAddress", "outputs": [], "payable": false, "stateMutability": "nonpayable", - "type": "function" + "type": "function", }, { "constant": false, @@ -549,14 +549,14 @@ const TestnetPriceFeedABI = [ { "internalType": "address", "name": "_priceAggregatorAddress", - "type": "address" - } + "type": "address", + }, ], "name": "setAggregator", "outputs": [], "payable": false, "stateMutability": "nonpayable", - "type": "function" + "type": "function", }, { "constant": false, @@ -564,14 +564,14 @@ const TestnetPriceFeedABI = [ { "internalType": "address", "name": "_priceAggregatorAddress", - "type": "address" - } + "type": "address", + }, ], "name": "setAggregator_Testnet", "outputs": [], "payable": false, "stateMutability": "nonpayable", - "type": "function" + "type": "function", }, { "constant": true, @@ -581,12 +581,12 @@ const TestnetPriceFeedABI = [ { "internalType": "uint256", "name": "", - "type": "uint256" - } + "type": "uint256", + }, ], "payable": false, "stateMutability": "view", - "type": "function" + "type": "function", }, { "constant": false, @@ -594,20 +594,20 @@ const TestnetPriceFeedABI = [ { "internalType": "uint256", "name": "_price", - "type": "uint256" - } + "type": "uint256", + }, ], "name": "setPrice", "outputs": [ { "internalType": "bool", "name": "", - "type": "bool" - } + "type": "bool", + }, ], "payable": false, "stateMutability": "nonpayable", - "type": "function" + "type": "function", }, { "constant": false, @@ -617,12 +617,12 @@ const TestnetPriceFeedABI = [ { "internalType": "uint256", "name": "", - "type": "uint256" - } + "type": "uint256", + }, ], "payable": false, "stateMutability": "nonpayable", - "type": "function" + "type": "function", }, { "constant": true, @@ -632,12 +632,12 @@ const TestnetPriceFeedABI = [ { "internalType": "uint256", "name": "", - "type": "uint256" - } + "type": "uint256", + }, ], "payable": false, "stateMutability": "view", - "type": "function" + "type": "function", }, { "constant": true, @@ -647,12 +647,12 @@ const TestnetPriceFeedABI = [ { "internalType": "uint256", "name": "", - "type": "uint256" - } + "type": "uint256", + }, ], "payable": false, "stateMutability": "view", - "type": "function" + "type": "function", }, { "constant": true, @@ -662,12 +662,12 @@ const TestnetPriceFeedABI = [ { "internalType": "uint256", "name": "", - "type": "uint256" - } + "type": "uint256", + }, ], "payable": false, "stateMutability": "view", - "type": "function" + "type": "function", }, { "constant": false, @@ -677,12 +677,12 @@ const TestnetPriceFeedABI = [ { "internalType": "uint256", "name": "", - "type": "uint256" - } + "type": "uint256", + }, ], "payable": false, "stateMutability": "nonpayable", - "type": "function" + "type": "function", }, { "constant": true, @@ -692,12 +692,12 @@ const TestnetPriceFeedABI = [ { "internalType": "uint256", "name": "", - "type": "uint256" - } + "type": "uint256", + }, ], "payable": false, "stateMutability": "view", - "type": "function" + "type": "function", }, { "constant": true, @@ -707,12 +707,12 @@ const TestnetPriceFeedABI = [ { "internalType": "uint256", "name": "", - "type": "uint256" - } + "type": "uint256", + }, ], "payable": false, "stateMutability": "view", - "type": "function" + "type": "function", }, { "constant": true, @@ -720,20 +720,20 @@ const TestnetPriceFeedABI = [ { "internalType": "uint256", "name": "_n", - "type": "uint256" - } + "type": "uint256", + }, ], "name": "getPreviousPrice_Testnet", "outputs": [ { "internalType": "uint256", "name": "", - "type": "uint256" - } + "type": "uint256", + }, ], "payable": false, "stateMutability": "view", - "type": "function" + "type": "function", }, { "constant": true, @@ -741,26 +741,26 @@ const TestnetPriceFeedABI = [ { "internalType": "uint256", "name": "_n", - "type": "uint256" - } + "type": "uint256", + }, ], "name": "getPreviousTimestamp_Testnet", "outputs": [ { "internalType": "uint256", "name": "", - "type": "uint256" - } + "type": "uint256", + }, ], "payable": false, "stateMutability": "view", - "type": "function" - } -] + "type": "function", + }, +]; module.exports = { - MainnetAggregator: MainnetAggregatorABI, - TestnetAggregator: TestnetAggregatorABI, - MainnetPriceFeed: MainnetPriceFeedABI, - TestnetPriceFeed: TestnetPriceFeedABI -} \ No newline at end of file + MainnetAggregator: MainnetAggregatorABI, + TestnetAggregator: TestnetAggregatorABI, + MainnetPriceFeed: MainnetPriceFeedABI, + TestnetPriceFeed: TestnetPriceFeedABI, +}; diff --git a/contracts/utils/priceFeedInteractions.js b/contracts/utils/priceFeedInteractions.js index 0567b830..ad5d7af6 100644 --- a/contracts/utils/priceFeedInteractions.js +++ b/contracts/utils/priceFeedInteractions.js @@ -1,12 +1,10 @@ // Vanilla node.js script. -/* -* Script now deprecated. -* TODO: replace with a script that deploys a PriceFeed.sol instance to mainnet, and interacts with it -* (i.e. gets the price). -* -*/ - +/* + * Script now deprecated. + * TODO: replace with a script that deploys a PriceFeed.sol instance to mainnet, and interacts with it + * (i.e. gets the price). + */ // const ethers = require('ethers'); // const oracleABIs = require('./oracleABIs.js') @@ -58,7 +56,6 @@ // // res.wait() // const recordedTroveManagerAddressTestnet = await testnetPriceFeed.troveManagerAddress() // console.log(`recorded TroveManager Address is ${recordedTroveManagerAddressTestnet}`) - // // Call the testnet Chainlink aggregator directly // const price_aggregatorTestnet = (await testnetAggregator.latestAnswer()).toString(); @@ -75,7 +72,7 @@ // console.log(`Testnet: Latest ETH:USD price from deployed PriceFeed: ${price_PriceFeedTestnet}`) // console.log(`Testnet: Timestamp of latest price from deployed PriceFeed: ${timestamp_PriceFeedTestnet}`) // console.log('\n') - + // let price = await testnetPriceFeed.getPrice() // console.log (`stored'price' variable in testnet PriceFeed contract is ${price}`) @@ -90,7 +87,7 @@ // // // --- Mainnet --- -// // Calling the mainnet Chainlink aggregator directly +// // Calling the mainnet Chainlink aggregator directly // const price_aggregatorMainnet = (await mainnetAggregator.currentAnswer()).toString(); // const timestamp_aggregatorMainnet = (await mainnetAggregator.updatedHeight()).toString() // const latestAnswerID_aggregatorMainnet = (await mainnetAggregator.latestCompletedAnswer()).toString() @@ -132,9 +129,9 @@ // /* updatePrice() is a tx (21k) + SStore (5k) + emit event (1.5k) = 27.5k gas -// Therefore, expected gas cost of a getLatestPrice() call is within a Trove function is (35k - 27.5k) +// Therefore, expected gas cost of a getLatestPrice() call is within a Trove function is (35k - 27.5k) // = 7500 gas upper bound. - -// To check, deploy an instance of FunctionCaller contract to ropsten and mainnet, + +// To check, deploy an instance of FunctionCaller contract to ropsten and mainnet, // with a wrapped getLatestPrice() call. */ -// })(); \ No newline at end of file +// })(); diff --git a/contracts/utils/processGasOutput.js b/contracts/utils/processGasOutput.js index 564d2552..051415d6 100644 --- a/contracts/utils/processGasOutput.js +++ b/contracts/utils/processGasOutput.js @@ -1,53 +1,52 @@ -/* Script for processing logged gas outputs from tests. +/* Script for processing logged gas outputs from tests. -Gas profiling logs the 'gas left', which includes the cost of the previous console.log call in the .sol file. +Gas profiling logs the 'gas left', which includes the cost of the previous console.log call in the .sol file. A Hardhat console.log call of the form: - + console.log("01. gas left: %s", gasleft()); costs ~1900 gas in Solidity. This script converts gas left to gas used per step, accounting for and removing the logging gas costs. */ -const fs = require('fs') +const fs = require("fs"); -data = fs.readFileSync('./gasTest/outputs/gasTestOutput.txt', 'utf8').split('\n') +data = fs.readFileSync("./gasTest/outputs/gasTestOutput.txt", "utf8").split("\n"); // Grab the step numbers and gas left at each step -const gasUsed = [] +const gasUsed = []; for (line of data) { if (line.includes("gas left:")) { - - const newLine = line.slice(0, 4) + line.slice(14).trim() - gasUsed.push(newLine) + const newLine = line.slice(0, 4) + line.slice(14).trim(); + gasUsed.push(newLine); } } -console.log("Logged gas data is") -console.dir(gasUsed) +console.log("Logged gas data is"); +console.dir(gasUsed); // Convert 'gas left' at each step to to 'gas used' by each step -processedData = [] -totalGas = 0 +processedData = []; +totalGas = 0; for (i = 0; i < gasUsed.length; i++) { - line = gasUsed[i] - prevLine = gasUsed[i-1] + line = gasUsed[i]; + prevLine = gasUsed[i - 1]; - const step = line.slice(0,3) + const step = line.slice(0, 3); if (step === "00.") { - continue + continue; } - const gas = Number(prevLine.slice(4)) - Number(line.slice(4)) - 1900 - processedData.push(`Gas used at step ${step}: ${gas} \n`) - totalGas += gas + const gas = Number(prevLine.slice(4)) - Number(line.slice(4)) - 1900; + processedData.push(`Gas used at step ${step}: ${gas} \n`); + totalGas += gas; } -console.log("Processed gas data is") -console.log(processedData) -console.log(`Total gas usage of all steps is ${totalGas}`) +console.log("Processed gas data is"); +console.log(processedData); +console.log(`Total gas usage of all steps is ${totalGas}`); -fs.writeFile('./gasTest/outputs/gasTestOutput.txt', processedData, (err) => { - if (err) { console.log(err) } -}) +fs.writeFile("./gasTest/outputs/gasTestOutput.txt", processedData, (err) => { + if (err) console.log(err); +}); diff --git a/contracts/utils/testHelpers.js b/contracts/utils/testHelpers.js index 4538f761..d65b1b30 100644 --- a/contracts/utils/testHelpers.js +++ b/contracts/utils/testHelpers.js @@ -97,8 +97,7 @@ class TestHelper { // median is the middle element (for odd list size) or element adjacent-right of middle (for even list size) const sortedGasCostList = [...gasCostList].sort(); - const medianGas = - sortedGasCostList[Math.floor(sortedGasCostList.length / 2)]; + const medianGas = sortedGasCostList[Math.floor(sortedGasCostList.length / 2)]; return { gasCostList, minGas, maxGas, meanGas, medianGas }; } @@ -162,15 +161,15 @@ class TestHelper { const ICR = debtBN.eq(this.toBN("0")) ? this.toBN( - "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff" - ) + "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + ) : collBN.mul(priceBN).div(debtBN); return ICR; } - static addressToTroveId(address, index=0) { - return web3.utils.soliditySha3(web3.eth.abi.encodeParameters(['address', 'uint256'], [address, index])); + static addressToTroveId(address, index = 0) { + return web3.utils.soliditySha3(web3.eth.abi.encodeParameters(["address", "uint256"], [address, index])); } static async ICRbetween100and110(account, troveManager, price) { @@ -203,7 +202,7 @@ class TestHelper { min gas: ${gasResults.minGas} \n max gas: ${gasResults.maxGas} \n mean gas: ${gasResults.meanGas} \n - median gas: ${gasResults.medianGas} \n` + median gas: ${gasResults.medianGas} \n`, ); } @@ -214,7 +213,7 @@ class TestHelper { static logGas(gas, message) { console.log( `\n ${message} \n - gas used: ${gas} \n` + gas used: ${gas} \n`, ); } @@ -238,7 +237,7 @@ class TestHelper { const ICR = await contracts.troveManager.getCurrentICR(account, price); console.log( - `Acct: ${squeezedAddr} coll:${coll} debt: ${debt} ICR: ${ICR}` + `Acct: ${squeezedAddr} coll:${coll} debt: ${debt} ICR: ${ICR}`, ); if (account == head) { @@ -268,7 +267,7 @@ class TestHelper { const ICR = await troveManager.getCurrentICR(account, price); console.log( - `Acct: ${squeezedAddr} coll:${coll} debt: ${debt} ICR: ${ICR}` + `Acct: ${squeezedAddr} coll:${coll} debt: ${debt} ICR: ${ICR}`, ); } } @@ -306,7 +305,7 @@ class TestHelper { // Virtual debt = 50 Bold. static async getActualDebtFromComposite(compositeDebt, contracts) { const issuedDebt = await contracts.troveManager.getActualDebtFromComposite( - compositeDebt + compositeDebt, ); return issuedDebt; } @@ -323,7 +322,7 @@ class TestHelper { static async getTroveEntireColl(contracts, trove) { return this.toBN( - (await contracts.troveManager.getEntireDebtAndColl(trove))[1] + (await contracts.troveManager.getEntireDebtAndColl(trove))[1], ); } @@ -333,7 +332,7 @@ class TestHelper { static async getTroveEntireDebt(contracts, trove) { return this.toBN( - (await contracts.troveManager.getEntireDebtAndColl(trove))[0] + (await contracts.troveManager.getEntireDebtAndColl(trove))[0], ); } @@ -346,7 +345,7 @@ class TestHelper { * So, it adds the gas compensation and the borrowing fee */ static async getOpenTroveTotalDebt(contracts, boldAmount) { - return(await this.getCompositeDebt(contracts, boldAmount)); + return (await this.getCompositeDebt(contracts, boldAmount)); } /* @@ -356,7 +355,7 @@ class TestHelper { static async getOpenTroveBoldAmount(contracts, totalDebt) { const actualDebt = await this.getActualDebtFromComposite( totalDebt, - contracts + contracts, ); return this.getNetBorrowingAmount(contracts, actualDebt); } @@ -487,7 +486,7 @@ class TestHelper { static getDebtAndCollFromTroveUpdatedEvents(troveUpdatedEvents, address) { const event = troveUpdatedEvents.filter( - (event) => event.args[0] === address + (event) => event.args[0] === address, )[0]; return [event.args[1], event.args[2]]; } @@ -495,22 +494,20 @@ class TestHelper { static async getBorrowerOpsListHint(contracts, newColl, newDebt) { const newNICR = await contracts.hintHelpers.computeNominalCR( newColl, - newDebt + newDebt, + ); + const { hintAddress: approxfullListHint, latestRandomSeed } = await contracts.hintHelpers.getApproxHint( + newNICR, + 5, + this.latestRandomSeed, ); - const { hintAddress: approxfullListHint, latestRandomSeed } = - await contracts.hintHelpers.getApproxHint( - newNICR, - 5, - this.latestRandomSeed - ); this.latestRandomSeed = latestRandomSeed; - const { 0: upperHint, 1: lowerHint } = - await contracts.sortedTroves.findInsertPosition( - newNICR, - approxfullListHint, - approxfullListHint - ); + const { 0: upperHint, 1: lowerHint } = await contracts.sortedTroves.findInsertPosition( + newNICR, + approxfullListHint, + approxfullListHint, + ); return { upperHint, lowerHint }; } @@ -523,10 +520,9 @@ class TestHelper { const rawColl = (await contracts.troveManager.Troves(troveId))[1]; const rawDebt = (await contracts.troveManager.Troves(troveId))[0]; const pendingETHReward = await contracts.troveManager.getPendingETHReward( - troveId + troveId, ); - const pendingBoldDebtReward = - await contracts.troveManager.getPendingBoldDebtReward(troveId); + const pendingBoldDebtReward = await contracts.troveManager.getPendingBoldDebtReward(troveId); const entireColl = rawColl.add(pendingETHReward); const entireDebt = rawDebt.add(pendingBoldDebtReward); @@ -536,7 +532,7 @@ class TestHelper { static async getCollAndDebtFromAddColl(contracts, account, amount) { const { entireColl, entireDebt } = await this.getEntireCollAndDebt( contracts, - account + account, ); const newColl = entireColl.add(this.toBN(amount)); @@ -547,7 +543,7 @@ class TestHelper { static async getCollAndDebtFromWithdrawColl(contracts, account, amount) { const { entireColl, entireDebt } = await this.getEntireCollAndDebt( contracts, - account + account, ); // console.log(`entireColl ${entireColl}`) // console.log(`entireDebt ${entireDebt}`) @@ -561,7 +557,7 @@ class TestHelper { const fee = await contracts.troveManager.getBorrowingFee(amount); const { entireColl, entireDebt } = await this.getEntireCollAndDebt( contracts, - account + account, ); const newColl = entireColl; @@ -573,7 +569,7 @@ class TestHelper { static async getCollAndDebtFromRepayBold(contracts, account, amount) { const { entireColl, entireDebt } = await this.getEntireCollAndDebt( contracts, - account + account, ); const newColl = entireColl; @@ -586,11 +582,11 @@ class TestHelper { contracts, account, ETHChange, - BoldChange + BoldChange, ) { const { entireColl, entireDebt } = await this.getEntireCollAndDebt( contracts, - account + account, ); // const coll = (await contracts.troveManager.Troves(account))[1] @@ -611,7 +607,7 @@ class TestHelper { accounts, contracts, ETHAmount, - BoldAmount + BoldAmount, ) { const gasCostList = []; const totalDebt = await this.getOpenTroveTotalDebt(contracts, BoldAmount); @@ -620,7 +616,7 @@ class TestHelper { const { upperHint, lowerHint } = await this.getBorrowerOpsListHint( contracts, ETHAmount, - totalDebt + totalDebt, ); const tx = await contracts.borrowerOperations.openTrove( @@ -629,7 +625,7 @@ class TestHelper { BoldAmount, upperHint, lowerHint, - { from: account } + { from: account }, ); const gas = this.gasUsed(tx); gasCostList.push(gas); @@ -642,7 +638,7 @@ class TestHelper { maxETH, accounts, contracts, - BoldAmount + BoldAmount, ) { const gasCostList = []; const totalDebt = await this.getOpenTroveTotalDebt(contracts, BoldAmount); @@ -652,7 +648,7 @@ class TestHelper { const { upperHint, lowerHint } = await this.getBorrowerOpsListHint( contracts, randCollAmount, - totalDebt + totalDebt, ); const tx = await contracts.borrowerOperations.openTrove( @@ -661,7 +657,7 @@ class TestHelper { BoldAmount, upperHint, lowerHint, - { from: account } + { from: account }, ); const gas = this.gasUsed(tx); gasCostList.push(gas); @@ -674,7 +670,7 @@ class TestHelper { maxETH, accounts, contracts, - proportion + proportion, ) { const gasCostList = []; @@ -685,13 +681,13 @@ class TestHelper { .mul(web3.utils.toBN(randCollAmount)); const totalDebt = await this.getOpenTroveTotalDebt( contracts, - proportionalBold + proportionalBold, ); const { upperHint, lowerHint } = await this.getBorrowerOpsListHint( contracts, randCollAmount, - totalDebt + totalDebt, ); const tx = await contracts.borrowerOperations.openTrove( @@ -700,7 +696,7 @@ class TestHelper { proportionalBold, upperHint, lowerHint, - { from: account } + { from: account }, ); const gas = this.gasUsed(tx); gasCostList.push(gas); @@ -715,7 +711,7 @@ class TestHelper { contracts, minBoldProportion, maxBoldProportion, - logging = false + logging = false, ) { const gasCostList = []; const price = await contracts.priceFeedTestnet.getPrice(); @@ -727,19 +723,19 @@ class TestHelper { // console.log(`randCollAmount ${randCollAmount }`) const randBoldProportion = this.randAmountInWei( minBoldProportion, - maxBoldProportion + maxBoldProportion, ); const proportionalBold = web3.utils .toBN(randBoldProportion) .mul(web3.utils.toBN(randCollAmount).div(_1e18)); const totalDebt = await this.getOpenTroveTotalDebt( contracts, - proportionalBold + proportionalBold, ); const { upperHint, lowerHint } = await this.getBorrowerOpsListHint( contracts, randCollAmount, - totalDebt + totalDebt, ); const feeFloor = this.dec(5, 16); @@ -749,7 +745,7 @@ class TestHelper { proportionalBold, upperHint, lowerHint, - { from: account } + { from: account }, ); if (logging && tx.receipt.status) { @@ -768,7 +764,7 @@ class TestHelper { maxBold, accounts, contracts, - ETHAmount + ETHAmount, ) { const gasCostList = []; @@ -776,12 +772,12 @@ class TestHelper { const randBoldAmount = this.randAmountInWei(minBold, maxBold); const totalDebt = await this.getOpenTroveTotalDebt( contracts, - randBoldAmount + randBoldAmount, ); const { upperHint, lowerHint } = await this.getBorrowerOpsListHint( contracts, ETHAmount, - totalDebt + totalDebt, ); const tx = await contracts.borrowerOperations.openTrove( @@ -790,7 +786,7 @@ class TestHelper { randBoldAmount, upperHint, lowerHint, - { from: account } + { from: account }, ); const gas = this.gasUsed(tx); gasCostList.push(gas); @@ -815,7 +811,7 @@ class TestHelper { accounts, contracts, ETHAmount, - maxBoldAmount + maxBoldAmount, ) { const gasCostList = []; @@ -825,12 +821,12 @@ class TestHelper { const BoldAmountWei = web3.utils.toWei(BoldAmount, "ether"); const totalDebt = await this.getOpenTroveTotalDebt( contracts, - BoldAmountWei + BoldAmountWei, ); const { upperHint, lowerHint } = await this.getBorrowerOpsListHint( contracts, ETHAmount, - totalDebt + totalDebt, ); const tx = await contracts.borrowerOperations.openTrove( @@ -839,7 +835,7 @@ class TestHelper { BoldAmountWei, upperHint, lowerHint, - { account } + { account }, ); const gas = this.gasUsed(tx); gasCostList.push(gas); @@ -858,23 +854,22 @@ class TestHelper { lowerHint, ICR, extraParams, - } + }, ) { if (!troveIndex) troveIndex = 0; if (!maxFeePercentage) maxFeePercentage = this._100pct; if (!extraBoldAmount) extraBoldAmount = this.toBN(0); - else if (typeof extraBoldAmount == "string") + else if (typeof extraBoldAmount == "string") { extraBoldAmount = this.toBN(extraBoldAmount); + } if (!upperHint) upperHint = this.ZERO_ADDRESS; if (!lowerHint) lowerHint = this.ZERO_ADDRESS; if (!extraParams.annualInterestRate) extraParams.annualInterestRate = 0; - const MIN_DEBT = ( - await this.getNetBorrowingAmount( - contracts, - await contracts.borrowerOperations.MIN_NET_DEBT() - ) - ) + const MIN_DEBT = await this.getNetBorrowingAmount( + contracts, + await contracts.borrowerOperations.MIN_NET_DEBT(), + ); // Only needed for non-zero borrow fee: .add(this.toBN(1)); // add 1 to avoid rounding issues const boldAmount = MIN_DEBT.add(extraBoldAmount); @@ -904,13 +899,13 @@ class TestHelper { maxFeePercentage, extraParams.value, boldAmount, - //extraParams.value, // TODO: this is the stETH value - ensure its still working + // extraParams.value, // TODO: this is the stETH value - ensure its still working upperHint, lowerHint, extraParams.annualInterestRate, { from: extraParams.from, - } + }, ); const troveId = this.getTroveIdFromTx(tx); @@ -934,7 +929,7 @@ class TestHelper { lowerHint, annualInterestRate, extraParams, - ){ + ) { // approve ERC20 ETH await contracts.WETH.approve(contracts.borrowerOperations.address, extraParams.value, { from: extraParams.from }); @@ -949,7 +944,7 @@ class TestHelper { annualInterestRate, { from: extraParams.from, - } + }, ); const troveId = this.getTroveIdFromTx(tx); @@ -960,7 +955,7 @@ class TestHelper { static getTroveIdFromTx(tx) { for (let i = 0; i < tx.logs.length; i++) { if (tx.logs[i].event === "TroveCreated") { - const troveId = tx.logs[i].args['_troveId']; + const troveId = tx.logs[i].args["_troveId"]; return troveId; } @@ -970,14 +965,14 @@ class TestHelper { static async withdrawBold( contracts, - { troveId, maxFeePercentage, boldAmount, ICR, extraParams } + { troveId, maxFeePercentage, boldAmount, ICR, extraParams }, ) { if (!maxFeePercentage) maxFeePercentage = this._100pct; if (!troveId) troveId = this.addressToTroveId(extraParams.from); assert( !(boldAmount && ICR) && (boldAmount || ICR), - "Specify either bold amount or target ICR, but not both" + "Specify either bold amount or target ICR, but not both", ); let increasedTotalDebt; @@ -988,17 +983,17 @@ class TestHelper { const targetDebt = entireColl.mul(price).div(ICR); assert( targetDebt > entireDebt, - "ICR is already greater than or equal to target" + "ICR is already greater than or equal to target", ); increasedTotalDebt = targetDebt.sub(entireDebt); boldAmount = await this.getNetBorrowingAmount( contracts, - increasedTotalDebt + increasedTotalDebt, ); } else { increasedTotalDebt = await this.getAmountWithBorrowingFee( contracts, - boldAmount + boldAmount, ); } @@ -1006,7 +1001,7 @@ class TestHelper { troveId, maxFeePercentage, boldAmount, - extraParams + extraParams, ); return { @@ -1019,7 +1014,7 @@ class TestHelper { accounts, contracts, ETHAmount, - BoldAmount + BoldAmount, ) { const gasCostList = []; @@ -1033,12 +1028,12 @@ class TestHelper { contracts, account, ETHChangeBN, - BoldChangeBN + BoldChangeBN, ); const { upperHint, lowerHint } = await this.getBorrowerOpsListHint( contracts, newColl, - newDebt + newDebt, ); const zero = this.toBN("0"); @@ -1056,7 +1051,7 @@ class TestHelper { isDebtIncrease, upperHint, lowerHint, - { from: account } + { from: account }, ); // Withdraw ETH from trove } else if (ETHChangeBN.lt(zero)) { @@ -1069,7 +1064,7 @@ class TestHelper { isDebtIncrease, upperHint, lowerHint, - { from: account } + { from: account }, ); } @@ -1085,7 +1080,7 @@ class TestHelper { ETHMin, ETHMax, BoldMin, - BoldMax + BoldMax, ) { const gasCostList = []; @@ -1099,12 +1094,12 @@ class TestHelper { contracts, account, ETHChangeBN, - BoldChangeBN + BoldChangeBN, ); const { upperHint, lowerHint } = await this.getBorrowerOpsListHint( contracts, newColl, - newDebt + newDebt, ); const zero = this.toBN("0"); @@ -1122,7 +1117,7 @@ class TestHelper { isDebtIncrease, upperHint, lowerHint, - { from: account } + { from: account }, ); // Withdraw ETH from trove } else if (ETHChangeBN.lt(zero)) { @@ -1135,7 +1130,7 @@ class TestHelper { isDebtIncrease, lowerHint, upperHint, - { from: account } + { from: account }, ); } @@ -1153,18 +1148,18 @@ class TestHelper { const { newColl, newDebt } = await this.getCollAndDebtFromAddColl( contracts, account, - amount + amount, ); const { upperHint, lowerHint } = await this.getBorrowerOpsListHint( contracts, newColl, - newDebt + newDebt, ); const tx = await contracts.borrowerOperations.addColl( upperHint, lowerHint, - { from: account, value: amount } + { from: account, value: amount }, ); const gas = this.gasUsed(tx); gasCostList.push(gas); @@ -1180,18 +1175,18 @@ class TestHelper { const { newColl, newDebt } = await this.getCollAndDebtFromAddColl( contracts, account, - randCollAmount + randCollAmount, ); const { upperHint, lowerHint } = await this.getBorrowerOpsListHint( contracts, newColl, - newDebt + newDebt, ); const tx = await contracts.borrowerOperations.addColl( upperHint, lowerHint, - { from: account, value: randCollAmount } + { from: account, value: randCollAmount }, ); const gas = this.gasUsed(tx); gasCostList.push(gas); @@ -1201,7 +1196,7 @@ class TestHelper { static async addCollWrapper( contracts, - extraParams + extraParams, ) { // approve ERC20 ETH await contracts.WETH.approve(contracts.borrowerOperations.address, extraParams.value, { from: extraParams.from }); @@ -1213,10 +1208,9 @@ class TestHelper { extraParams.value, { from: extraParams.from, - } + }, ); return tx; - } static async withdrawColl_allAccounts(accounts, contracts, amount) { @@ -1225,21 +1219,21 @@ class TestHelper { const { newColl, newDebt } = await this.getCollAndDebtFromWithdrawColl( contracts, account, - amount + amount, ); // console.log(`newColl: ${newColl} `) // console.log(`newDebt: ${newDebt} `) const { upperHint, lowerHint } = await this.getBorrowerOpsListHint( contracts, newColl, - newDebt + newDebt, ); const tx = await contracts.borrowerOperations.withdrawColl( amount, upperHint, lowerHint, - { from: account } + { from: account }, ); const gas = this.gasUsed(tx); gasCostList.push(gas); @@ -1251,7 +1245,7 @@ class TestHelper { min, max, accounts, - contracts + contracts, ) { const gasCostList = []; @@ -1261,19 +1255,19 @@ class TestHelper { const { newColl, newDebt } = await this.getCollAndDebtFromWithdrawColl( contracts, account, - randCollAmount + randCollAmount, ); const { upperHint, lowerHint } = await this.getBorrowerOpsListHint( contracts, newColl, - newDebt + newDebt, ); const tx = await contracts.borrowerOperations.withdrawColl( randCollAmount, upperHint, lowerHint, - { from: account } + { from: account }, ); const gas = this.gasUsed(tx); gasCostList.push(gas); @@ -1289,12 +1283,12 @@ class TestHelper { const { newColl, newDebt } = await this.getCollAndDebtFromWithdrawBold( contracts, account, - amount + amount, ); const { upperHint, lowerHint } = await this.getBorrowerOpsListHint( contracts, newColl, - newDebt + newDebt, ); const tx = await contracts.borrowerOperations.withdrawBold( @@ -1302,7 +1296,7 @@ class TestHelper { amount, upperHint, lowerHint, - { from: account } + { from: account }, ); const gas = this.gasUsed(tx); gasCostList.push(gas); @@ -1314,7 +1308,7 @@ class TestHelper { min, max, accounts, - contracts + contracts, ) { const gasCostList = []; @@ -1324,12 +1318,12 @@ class TestHelper { const { newColl, newDebt } = await this.getCollAndDebtFromWithdrawBold( contracts, account, - randBoldAmount + randBoldAmount, ); const { upperHint, lowerHint } = await this.getBorrowerOpsListHint( contracts, newColl, - newDebt + newDebt, ); const tx = await contracts.borrowerOperations.withdrawBold( @@ -1337,7 +1331,7 @@ class TestHelper { randBoldAmount, upperHint, lowerHint, - { from: account } + { from: account }, ); const gas = this.gasUsed(tx); gasCostList.push(gas); @@ -1352,19 +1346,19 @@ class TestHelper { const { newColl, newDebt } = await this.getCollAndDebtFromRepayBold( contracts, account, - amount + amount, ); const { upperHint, lowerHint } = await this.getBorrowerOpsListHint( contracts, newColl, - newDebt + newDebt, ); const tx = await contracts.borrowerOperations.repayBold( amount, upperHint, lowerHint, - { from: account } + { from: account }, ); const gas = this.gasUsed(tx); gasCostList.push(gas); @@ -1376,7 +1370,7 @@ class TestHelper { min, max, accounts, - contracts + contracts, ) { const gasCostList = []; @@ -1386,19 +1380,19 @@ class TestHelper { const { newColl, newDebt } = await this.getCollAndDebtFromRepayBold( contracts, account, - randBoldAmount + randBoldAmount, ); const { upperHint, lowerHint } = await this.getBorrowerOpsListHint( contracts, newColl, - newDebt + newDebt, ); const tx = await contracts.borrowerOperations.repayBold( randBoldAmount, upperHint, lowerHint, - { from: account } + { from: account }, ); const gas = this.gasUsed(tx); gasCostList.push(gas); @@ -1413,7 +1407,7 @@ class TestHelper { for (const account of accounts) { const tx = await functionCaller.troveManager_getCurrentICR( account, - price + price, ); const gas = this.gasUsed(tx) - 21000; gasCostList.push(gas); @@ -1428,7 +1422,7 @@ class TestHelper { contracts, BoldAmount, gasPrice = 0, - maxFee = this._100pct + maxFee = this._100pct, ) { const price = await contracts.priceFeedTestnet.getPrice(); const tx = await this.performRedemptionTx( @@ -1437,7 +1431,7 @@ class TestHelper { contracts, BoldAmount, maxFee, - gasPrice + gasPrice, ); const gas = await this.gasUsed(tx); return gas; @@ -1448,7 +1442,7 @@ class TestHelper { contracts, BoldAmount, gasPrice, - maxFee = this._100pct + maxFee = this._100pct, ) { // console.log("GAS PRICE: " + gasPrice) if (gasPrice == undefined) { @@ -1461,7 +1455,7 @@ class TestHelper { contracts, BoldAmount, maxFee, - gasPrice + gasPrice, ); return tx; } @@ -1470,7 +1464,7 @@ class TestHelper { min, max, accounts, - contracts + contracts, ) { const gasCostList = []; const price = await contracts.priceFeedTestnet.getPrice(); @@ -1482,7 +1476,7 @@ class TestHelper { redeemer, price, contracts, - randBoldAmount + randBoldAmount, ); const gas = this.gasUsed(tx); gasCostList.push(gas); @@ -1496,13 +1490,13 @@ class TestHelper { contracts, BoldAmount, maxFee = 0, - gasPrice_toUse = 0 + gasPrice_toUse = 0, ) { const tx = await contracts.troveManager.redeemCollateral( BoldAmount, 0, maxFee, - { from: redeemer, gasPrice: gasPrice_toUse } + { from: redeemer, gasPrice: gasPrice_toUse }, ); return tx; @@ -1522,7 +1516,7 @@ class TestHelper { "200000000000000000000", account, account, - { from: account } + { from: account }, ); amountFinney += 10; @@ -1547,7 +1541,7 @@ class TestHelper { min, max, accounts, - stabilityPool + stabilityPool, ) { const gasCostList = []; for (const account of accounts) { @@ -1555,7 +1549,7 @@ class TestHelper { const tx = await stabilityPool.provideToSP( randomBoldAmount, this.ZERO_ADDRESS, - { from: account } + { from: account }, ); const gas = this.gasUsed(tx); gasCostList.push(gas); @@ -1577,7 +1571,7 @@ class TestHelper { min, max, accounts, - stabilityPool + stabilityPool, ) { const gasCostList = []; for (const account of accounts) { @@ -1596,24 +1590,24 @@ class TestHelper { for (const account of accounts) { let { entireColl, entireDebt } = await this.getEntireCollAndDebt( contracts, - account + account, ); console.log(`entireColl: ${entireColl}`); console.log(`entireDebt: ${entireDebt}`); const ETHGain = await contracts.stabilityPool.getDepositorETHGain( - account + account, ); const newColl = entireColl.add(ETHGain); const { upperHint, lowerHint } = await this.getBorrowerOpsListHint( contracts, newColl, - entireDebt + entireDebt, ); const tx = await contracts.stabilityPool.withdrawETHGainToTrove( upperHint, lowerHint, - { from: account } + { from: account }, ); const gas = this.gasUsed(tx); gasCostList.push(gas); @@ -1658,7 +1652,7 @@ class TestHelper { static async getTimeFromSystemDeployment( lqtyToken, web3, - timePassedSinceDeployment + timePassedSinceDeployment, ) { const deploymentTime = await lqtyToken.getDeploymentStartTime(); return this.toBN(deploymentTime).add(this.toBN(timePassedSinceDeployment)); @@ -1700,9 +1694,9 @@ class TestHelper { static formatParam(param) { let formattedParam = param; if ( - typeof param == "number" || - typeof param == "object" || - (typeof param == "string" && new RegExp("[0-9]*").test(param)) + typeof param == "number" + || typeof param == "object" + || (typeof param == "string" && new RegExp("[0-9]*").test(param)) ) { formattedParam = web3.utils.toHex(formattedParam); } else if (typeof param == "boolean") { @@ -1720,8 +1714,8 @@ class TestHelper { console.log('params: ', params.map(p => typeof p)) */ return ( - web3.utils.sha3(signatureString).slice(0, 10) + - params.reduce((acc, p) => acc + this.formatParam(p), "") + web3.utils.sha3(signatureString).slice(0, 10) + + params.reduce((acc, p) => acc + this.formatParam(p), "") ); } } diff --git a/frontend/dprint.json b/dprint.json similarity index 56% rename from frontend/dprint.json rename to dprint.json index 2305faf6..24a51e8f 100644 --- a/frontend/dprint.json +++ b/dprint.json @@ -1,20 +1,25 @@ { "typescript": { - "useBraces": "always" - }, - "json": { - }, - "markdown": { + "arrowFunction.useParentheses": "force" }, + "json": {}, + "markdown": {}, + "toml": {}, "includes": ["**/*.{ts,tsx,js,jsx,mjs,json,md,html,css}"], "excludes": [ "**/node_modules", - "**/*-lock.json" + "**/*-lock.json", + "/contracts/artifacts", + "/contracts/broadcast", + "/contracts/cache", + "/contracts/lib", + "/contracts/out" ], "plugins": [ "https://plugins.dprint.dev/typescript-0.89.3.wasm", "https://plugins.dprint.dev/json-0.19.2.wasm", "https://plugins.dprint.dev/markdown-0.16.4.wasm", + "https://plugins.dprint.dev/toml-0.6.1.wasm", "https://plugins.dprint.dev/g-plane/malva-v0.1.5.wasm" ] } diff --git a/frontend/package.json b/frontend/package.json index 4bbc6419..1e2903c0 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -1,13 +1,12 @@ { "name": "frontend", "version": "0.0.0", - "private": true, "scripts": { "build": "next build", "dev": "rm -rf ./.next && next dev", "fmt": "dprint fmt **/*.{ts,tsx,js,json,html,md}", "lint": "next lint", - "prepare": "panda codegen", + "prepare": "panda codegen --silent", "test": "vitest", "update-liquity-abis": "ts-node ./scripts/update-liquity-abis.ts" }, @@ -16,7 +15,6 @@ "@tanstack/react-query": "^5.28.6", "connectkit": "^1.7.2", "dnum": "^2.11.0", - "dprint": "^0.45.0", "focus-trap-react": "^10.2.3", "next": "14.1.4", "react": "^18", @@ -38,7 +36,6 @@ "@typescript-eslint/eslint-plugin": "^7.3.1", "@typescript-eslint/parser": "^7.3.1", "dax-sh": "^0.39.2", - "dprint": "^0.45.0", "eslint": "^8.57.0", "eslint-config-next": "14.1.4", "eslint-plugin-react-hooks": "^4.6.0", diff --git a/package.json b/package.json new file mode 100644 index 00000000..fb6a4378 --- /dev/null +++ b/package.json @@ -0,0 +1,12 @@ +{ + "name": "bold", + "private": true, + "author": "Liquity AG", + "license": "GPL-3.0", + "repository": "github:liquity/bold", + "bugs": "https://github.com/liquity/bold/issues", + "homepage": "https://github.com/liquity/bold#readme", + "devDependencies": { + "dprint": "^0.45.0" + } +} diff --git a/frontend/pnpm-lock.yaml b/pnpm-lock.yaml similarity index 62% rename from frontend/pnpm-lock.yaml rename to pnpm-lock.yaml index 8d5b7ae6..8a18f009 100644 --- a/frontend/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -4,105 +4,188 @@ settings: autoInstallPeers: true excludeLinksFromLockfile: false -dependencies: - '@react-spring/web': - specifier: ^9.7.3 - version: 9.7.3(react-dom@18.2.0)(react@18.2.0) - '@tanstack/react-query': - specifier: ^5.28.6 - version: 5.28.6(react@18.2.0) - connectkit: - specifier: ^1.7.2 - version: 1.7.2(@babel/core@7.24.3)(@tanstack/react-query@5.28.6)(react-dom@18.2.0)(react-is@18.2.0)(react@18.2.0)(viem@2.8.18)(wagmi@2.5.12) - dnum: - specifier: ^2.11.0 - version: 2.11.0 - dprint: - specifier: ^0.45.0 - version: 0.45.0 - focus-trap-react: - specifier: ^10.2.3 - version: 10.2.3(prop-types@15.8.1)(react-dom@18.2.0)(react@18.2.0) - next: - specifier: 14.1.4 - version: 14.1.4(@babel/core@7.24.3)(react-dom@18.2.0)(react@18.2.0) - react: - specifier: ^18 - version: 18.2.0 - react-dom: - specifier: ^18 - version: 18.2.0(react@18.2.0) - ts-pattern: - specifier: ^5.0.8 - version: 5.0.8 - viem: - specifier: ^2.8.18 - version: 2.8.18(typescript@5.4.3)(zod@3.22.4) - wagmi: - specifier: ^2.5.12 - version: 2.5.12(@tanstack/react-query@5.28.6)(@types/react@18.2.68)(react-dom@18.2.0)(react-native@0.73.6)(react@18.2.0)(typescript@5.4.3)(viem@2.8.18)(zod@3.22.4) - zod: - specifier: ^3.22.4 - version: 3.22.4 - -devDependencies: - '@babel/plugin-transform-private-methods': - specifier: ^7.24.1 - version: 7.24.1(@babel/core@7.24.3) - '@pandacss/dev': - specifier: ^0.36.0 - version: 0.36.0(jsdom@24.0.0)(typescript@5.4.3) - '@testing-library/jest-dom': - specifier: ^6.4.2 - version: 6.4.2(vitest@1.4.0) - '@testing-library/react': - specifier: ^14.2.2 - version: 14.2.2(react-dom@18.2.0)(react@18.2.0) - '@testing-library/user-event': - specifier: ^14.5.2 - version: 14.5.2(@testing-library/dom@9.3.4) - '@types/node': - specifier: ^20.11.30 - version: 20.11.30 - '@types/react': - specifier: ^18.2.68 - version: 18.2.68 - '@types/react-dom': - specifier: ^18.2.22 - version: 18.2.22 - '@typescript-eslint/eslint-plugin': - specifier: ^7.3.1 - version: 7.3.1(@typescript-eslint/parser@7.3.1)(eslint@8.57.0)(typescript@5.4.3) - '@typescript-eslint/parser': - specifier: ^7.3.1 - version: 7.3.1(eslint@8.57.0)(typescript@5.4.3) - dax-sh: - specifier: ^0.39.2 - version: 0.39.2 - eslint: - specifier: ^8.57.0 - version: 8.57.0 - eslint-config-next: - specifier: 14.1.4 - version: 14.1.4(eslint@8.57.0)(typescript@5.4.3) - eslint-plugin-react-hooks: - specifier: ^4.6.0 - version: 4.6.0(eslint@8.57.0) - eslint-plugin-react-refresh: - specifier: ^0.4.6 - version: 0.4.6(eslint@8.57.0) - jsdom: - specifier: ^24.0.0 - version: 24.0.0 - ts-node: - specifier: ^10.9.2 - version: 10.9.2(@types/node@20.11.30)(typescript@5.4.3) - typescript: - specifier: ^5.4.3 - version: 5.4.3 - vitest: - specifier: ^1.4.0 - version: 1.4.0(@types/node@20.11.30)(jsdom@24.0.0) +importers: + + .: + devDependencies: + dprint: + specifier: ^0.45.0 + version: 0.45.1 + + contracts: + devDependencies: + '@nomicfoundation/hardhat-chai-matchers': + specifier: ^1.0.0 + version: 1.0.6(@nomiclabs/hardhat-ethers@2.2.3)(chai@4.4.1)(ethers@5.7.2)(hardhat@2.22.2) + '@nomicfoundation/hardhat-foundry': + specifier: ^1.0.1 + version: 1.1.1(hardhat@2.22.2) + '@nomicfoundation/hardhat-network-helpers': + specifier: ^1.0.0 + version: 1.0.10(hardhat@2.22.2) + '@nomicfoundation/hardhat-toolbox': + specifier: ^2.0.2 + version: 2.0.2(@ethersproject/abi@5.7.0)(@ethersproject/providers@5.7.2)(@nomicfoundation/hardhat-chai-matchers@1.0.6)(@nomicfoundation/hardhat-network-helpers@1.0.10)(@nomiclabs/hardhat-ethers@2.2.3)(@nomiclabs/hardhat-etherscan@3.1.8)(@typechain/ethers-v5@10.2.1)(@typechain/hardhat@6.1.6)(@types/chai@4.3.14)(@types/mocha@10.0.6)(@types/node@20.12.5)(chai@4.4.1)(ethers@5.7.2)(hardhat-gas-reporter@1.0.10)(hardhat@2.22.2)(solidity-coverage@0.8.12)(ts-node@10.9.2)(typechain@8.3.2)(typescript@5.4.4) + '@nomiclabs/hardhat-ethers': + specifier: ^2.0.0 + version: 2.2.3(ethers@5.7.2)(hardhat@2.22.2) + '@nomiclabs/hardhat-etherscan': + specifier: ^3.0.0 + version: 3.1.8(hardhat@2.22.2) + '@nomiclabs/hardhat-truffle5': + specifier: ^2.0.7 + version: 2.0.7(@nomiclabs/hardhat-web3@2.0.0)(hardhat@2.22.2)(web3-core-helpers@1.10.3)(web3-core-promievent@1.10.3)(web3-eth-abi@1.10.4)(web3-utils@1.10.4)(web3@1.10.4) + '@nomiclabs/hardhat-web3': + specifier: ^2.0.0 + version: 2.0.0(hardhat@2.22.2)(web3@1.10.4) + '@openzeppelin/contracts': + specifier: ^4.9.3 + version: 4.9.6 + '@openzeppelin/test-helpers': + specifier: ^0.5.16 + version: 0.5.16(bn.js@4.12.0) + '@typechain/ethers-v5': + specifier: ^10.1.0 + version: 10.2.1(@ethersproject/abi@5.7.0)(@ethersproject/providers@5.7.2)(ethers@5.7.2)(typechain@8.3.2)(typescript@5.4.4) + '@typechain/hardhat': + specifier: ^6.1.2 + version: 6.1.6(@ethersproject/abi@5.7.0)(@ethersproject/providers@5.7.2)(@typechain/ethers-v5@10.2.1)(ethers@5.7.2)(hardhat@2.22.2)(typechain@8.3.2) + '@types/chai': + specifier: ^4.2.0 + version: 4.3.14 + '@types/mocha': + specifier: '>=9.1.0' + version: 10.0.6 + chai: + specifier: ^4.2.0 + version: 4.4.1 + decimal.js: + specifier: ^10.4.3 + version: 10.4.3 + hardhat: + specifier: ^2.14.0 + version: 2.22.2(ts-node@10.9.2)(typescript@5.4.4) + hardhat-gas-reporter: + specifier: ^1.0.8 + version: 1.0.10(hardhat@2.22.2) + solidity-coverage: + specifier: ^0.8.8 + version: 0.8.12(hardhat@2.22.2) + ts-node: + specifier: '>=8.0.0' + version: 10.9.2(@types/node@20.12.5)(typescript@5.4.4) + tsx: + specifier: ^4.7.1 + version: 4.7.2 + typechain: + specifier: ^8.1.0 + version: 8.3.2(typescript@5.4.4) + typescript: + specifier: '>=4.5.0' + version: 5.4.4 + zod: + specifier: ^3.22.4 + version: 3.22.4 + zx: + specifier: ^7.2.3 + version: 7.2.3 + + frontend: + dependencies: + '@react-spring/web': + specifier: ^9.7.3 + version: 9.7.3(react-dom@18.2.0)(react@18.2.0) + '@tanstack/react-query': + specifier: ^5.28.6 + version: 5.29.0(react@18.2.0) + connectkit: + specifier: ^1.7.2 + version: 1.7.3(@babel/core@7.24.4)(@tanstack/react-query@5.29.0)(react-dom@18.2.0)(react-is@18.2.0)(react@18.2.0)(viem@2.9.13)(wagmi@2.5.19) + dnum: + specifier: ^2.11.0 + version: 2.12.0 + focus-trap-react: + specifier: ^10.2.3 + version: 10.2.3(prop-types@15.8.1)(react-dom@18.2.0)(react@18.2.0) + next: + specifier: 14.1.4 + version: 14.1.4(@babel/core@7.24.4)(react-dom@18.2.0)(react@18.2.0) + react: + specifier: ^18 + version: 18.2.0 + react-dom: + specifier: ^18 + version: 18.2.0(react@18.2.0) + ts-pattern: + specifier: ^5.0.8 + version: 5.1.1 + viem: + specifier: ^2.8.18 + version: 2.9.13(typescript@5.4.4)(zod@3.22.4) + wagmi: + specifier: ^2.5.12 + version: 2.5.19(@tanstack/react-query@5.29.0)(@types/react@18.2.75)(react-dom@18.2.0)(react-native@0.73.6)(react@18.2.0)(typescript@5.4.4)(viem@2.9.13)(zod@3.22.4) + zod: + specifier: ^3.22.4 + version: 3.22.4 + devDependencies: + '@babel/plugin-transform-private-methods': + specifier: ^7.24.1 + version: 7.24.1(@babel/core@7.24.4) + '@pandacss/dev': + specifier: ^0.36.0 + version: 0.36.1(jsdom@24.0.0)(typescript@5.4.4) + '@testing-library/jest-dom': + specifier: ^6.4.2 + version: 6.4.2(vitest@1.4.0) + '@testing-library/react': + specifier: ^14.2.2 + version: 14.3.0(react-dom@18.2.0)(react@18.2.0) + '@testing-library/user-event': + specifier: ^14.5.2 + version: 14.5.2(@testing-library/dom@10.0.0) + '@types/node': + specifier: ^20.11.30 + version: 20.12.5 + '@types/react': + specifier: ^18.2.68 + version: 18.2.75 + '@types/react-dom': + specifier: ^18.2.22 + version: 18.2.24 + '@typescript-eslint/eslint-plugin': + specifier: ^7.3.1 + version: 7.6.0(@typescript-eslint/parser@7.6.0)(eslint@8.57.0)(typescript@5.4.4) + '@typescript-eslint/parser': + specifier: ^7.3.1 + version: 7.6.0(eslint@8.57.0)(typescript@5.4.4) + dax-sh: + specifier: ^0.39.2 + version: 0.39.2 + eslint: + specifier: ^8.57.0 + version: 8.57.0 + eslint-config-next: + specifier: 14.1.4 + version: 14.1.4(eslint@8.57.0)(typescript@5.4.4) + eslint-plugin-react-hooks: + specifier: ^4.6.0 + version: 4.6.0(eslint@8.57.0) + eslint-plugin-react-refresh: + specifier: ^0.4.6 + version: 0.4.6(eslint@8.57.0) + jsdom: + specifier: ^24.0.0 + version: 24.0.0 + ts-node: + specifier: ^10.9.2 + version: 10.9.2(@types/node@20.12.5)(typescript@5.4.4) + typescript: + specifier: ^5.4.3 + version: 5.4.4 + vitest: + specifier: ^1.4.0 + version: 1.4.0(@types/node@20.12.5)(jsdom@24.0.0) packages: @@ -126,13 +209,6 @@ packages: '@jridgewell/gen-mapping': 0.3.5 '@jridgewell/trace-mapping': 0.3.25 - /@babel/code-frame@7.23.5: - resolution: {integrity: sha512-CgH3s1a96LipHCmSUmYFPwY7MNx8C3avkq7i4Wl3cfa662ldtUe4VM1TPXX70pfmrlWTb6jLqTYrZyT2ZTJBgA==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/highlight': 7.23.4 - chalk: 2.4.2 - /@babel/code-frame@7.24.2: resolution: {integrity: sha512-y5+tLQyV8pg3fsiln67BVLD1P13Eg4lh5RW9mF0zUuvLrv9uIQ4MCL+CRT+FTsBlBjcIan6PGsLcBN0m3ClUyQ==} engines: {node: '>=6.9.0'} @@ -140,23 +216,23 @@ packages: '@babel/highlight': 7.24.2 picocolors: 1.0.0 - /@babel/compat-data@7.24.1: - resolution: {integrity: sha512-Pc65opHDliVpRHuKfzI+gSA4zcgr65O4cl64fFJIWEEh8JoHIHh0Oez1Eo8Arz8zq/JhgKodQaxEwUPRtZylVA==} + /@babel/compat-data@7.24.4: + resolution: {integrity: sha512-vg8Gih2MLK+kOkHJp4gBEIkyaIi00jgWot2D9QOmmfLC8jINSOzmCLta6Bvz/JSBCqnegV0L80jhxkol5GWNfQ==} engines: {node: '>=6.9.0'} - /@babel/core@7.24.3: - resolution: {integrity: sha512-5FcvN1JHw2sHJChotgx8Ek0lyuh4kCKelgMTTqhYJJtloNvUfpAFMeNQUtdlIaktwrSV9LtCdqwk48wL2wBacQ==} + /@babel/core@7.24.4: + resolution: {integrity: sha512-MBVlMXP+kkl5394RBLSxxk/iLTeVGuXTV3cIDXavPpMMqnSnt6apKgan/U8O3USWZCWZT/TbgfEpKa4uMgN4Dg==} engines: {node: '>=6.9.0'} dependencies: '@ampproject/remapping': 2.3.0 '@babel/code-frame': 7.24.2 - '@babel/generator': 7.24.1 + '@babel/generator': 7.24.4 '@babel/helper-compilation-targets': 7.23.6 - '@babel/helper-module-transforms': 7.23.3(@babel/core@7.24.3) - '@babel/helpers': 7.24.1 - '@babel/parser': 7.24.1 + '@babel/helper-module-transforms': 7.23.3(@babel/core@7.24.4) + '@babel/helpers': 7.24.4 + '@babel/parser': 7.24.4 '@babel/template': 7.24.0 - '@babel/traverse': 7.24.1 + '@babel/traverse': 7.24.1(supports-color@5.5.0) '@babel/types': 7.24.0 convert-source-map: 2.0.0 debug: 4.3.4(supports-color@5.5.0) @@ -166,18 +242,8 @@ packages: transitivePeerDependencies: - supports-color - /@babel/generator@7.23.6: - resolution: {integrity: sha512-qrSfCYxYQB5owCmGLbl8XRpX1ytXlpueOb0N0UmQwA073KZxejgQTzAmJezxvpwQD9uGtK2shHdi55QT+MbjIw==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/types': 7.24.0 - '@jridgewell/gen-mapping': 0.3.5 - '@jridgewell/trace-mapping': 0.3.25 - jsesc: 2.5.2 - dev: false - - /@babel/generator@7.24.1: - resolution: {integrity: sha512-DfCRfZsBcrPEHUfuBMgbJ1Ut01Y/itOs+hY2nFLgqsqXd52/iSiVq5TITtUasIUgm+IIKdY2/1I7auiQOEeC9A==} + /@babel/generator@7.24.4: + resolution: {integrity: sha512-Xd6+v6SnjWVx/nus+y0l1sxMOTOMBkyL4+BIdbALyatQnAe/SRVjANeDPSCYaX+i1iJmuGSKf3Z+E+V/va1Hvw==} engines: {node: '>=6.9.0'} dependencies: '@babel/types': 7.24.0 @@ -189,7 +255,7 @@ packages: resolution: {integrity: sha512-LvBTxu8bQSQkcyKOU+a1btnNFQ1dMAd0R6PyW3arXes06F6QLWLIrd681bxRPIXlrMGR3XYnW9JyML7dP3qgxg==} engines: {node: '>=6.9.0'} dependencies: - '@babel/types': 7.23.9 + '@babel/types': 7.24.0 /@babel/helper-builder-binary-assignment-operator-visitor@7.22.15: resolution: {integrity: sha512-QkBXwGgaoC2GtGZRoma6kv7Szfv06khvhFav67ZExau2RaXzy8MpHSMO2PNoP2XtmQphJQRHFfg77Bq731Yizw==} @@ -202,47 +268,47 @@ packages: resolution: {integrity: sha512-9JB548GZoQVmzrFgp8o7KxdgkTGm6xs9DW0o/Pim72UDjzr5ObUQ6ZzYPqA+g9OTS2bBQoctLJrky0RDCAWRgQ==} engines: {node: '>=6.9.0'} dependencies: - '@babel/compat-data': 7.24.1 + '@babel/compat-data': 7.24.4 '@babel/helper-validator-option': 7.23.5 browserslist: 4.23.0 lru-cache: 5.1.1 semver: 6.3.1 - /@babel/helper-create-class-features-plugin@7.24.1(@babel/core@7.24.3): - resolution: {integrity: sha512-1yJa9dX9g//V6fDebXoEfEsxkZHk3Hcbm+zLhyu6qVgYFLvmTALTeV+jNU9e5RnYtioBrGEOdoI2joMSNQ/+aA==} + /@babel/helper-create-class-features-plugin@7.24.4(@babel/core@7.24.4): + resolution: {integrity: sha512-lG75yeuUSVu0pIcbhiYMXBXANHrpUPaOfu7ryAzskCgKUHuAxRQI5ssrtmF0X9UXldPlvT0XM/A4F44OXRt6iQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 dependencies: - '@babel/core': 7.24.3 + '@babel/core': 7.24.4 '@babel/helper-annotate-as-pure': 7.22.5 '@babel/helper-environment-visitor': 7.22.20 '@babel/helper-function-name': 7.23.0 '@babel/helper-member-expression-to-functions': 7.23.0 '@babel/helper-optimise-call-expression': 7.22.5 - '@babel/helper-replace-supers': 7.24.1(@babel/core@7.24.3) + '@babel/helper-replace-supers': 7.24.1(@babel/core@7.24.4) '@babel/helper-skip-transparent-expression-wrappers': 7.22.5 '@babel/helper-split-export-declaration': 7.22.6 semver: 6.3.1 - /@babel/helper-create-regexp-features-plugin@7.22.15(@babel/core@7.24.3): + /@babel/helper-create-regexp-features-plugin@7.22.15(@babel/core@7.24.4): resolution: {integrity: sha512-29FkPLFjn4TPEa3RE7GpW+qbE8tlsu3jntNYNfcGsc49LphF1PQIiD+vMZ1z1xVOKt+93khA9tc2JBs3kBjA7w==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 dependencies: - '@babel/core': 7.24.3 + '@babel/core': 7.24.4 '@babel/helper-annotate-as-pure': 7.22.5 regexpu-core: 5.3.2 semver: 6.3.1 dev: false - /@babel/helper-define-polyfill-provider@0.6.1(@babel/core@7.24.3): + /@babel/helper-define-polyfill-provider@0.6.1(@babel/core@7.24.4): resolution: {integrity: sha512-o7SDgTJuvx5vLKD6SFvkydkSMBvahDKGiNJzG22IZYXhiqoe9efY7zocICBgzHV4IRg5wdgl2nEL/tulKIEIbA==} peerDependencies: '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 dependencies: - '@babel/core': 7.24.3 + '@babel/core': 7.24.4 '@babel/helper-compilation-targets': 7.23.6 '@babel/helper-plugin-utils': 7.24.0 debug: 4.3.4(supports-color@5.5.0) @@ -275,26 +341,19 @@ packages: dependencies: '@babel/types': 7.24.0 - /@babel/helper-module-imports@7.22.15: - resolution: {integrity: sha512-0pYVBnDKZO2fnSPCrgM/6WMc7eS20Fbok+0r88fp+YtWVLZrp4CkafFGIp+W0VKw4a22sgebPT99y+FDNMdP4w==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/types': 7.23.9 - dev: false - /@babel/helper-module-imports@7.24.3: resolution: {integrity: sha512-viKb0F9f2s0BCS22QSF308z/+1YWKV/76mwt61NBzS5izMzDPwdq1pTrzf+Li3npBWX9KdQbkeCt1jSAM7lZqg==} engines: {node: '>=6.9.0'} dependencies: '@babel/types': 7.24.0 - /@babel/helper-module-transforms@7.23.3(@babel/core@7.24.3): + /@babel/helper-module-transforms@7.23.3(@babel/core@7.24.4): resolution: {integrity: sha512-7bBs4ED9OmswdfDzpz4MpWgSrV7FXlc3zIagvLFjS5H+Mk7Snr21vQ6QwrsoCGMfNC4e4LQPdoULEt4ykz0SRQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 dependencies: - '@babel/core': 7.24.3 + '@babel/core': 7.24.4 '@babel/helper-environment-visitor': 7.22.20 '@babel/helper-module-imports': 7.24.3 '@babel/helper-simple-access': 7.22.5 @@ -311,25 +370,25 @@ packages: resolution: {integrity: sha512-9cUznXMG0+FxRuJfvL82QlTqIzhVW9sL0KjMPHhAOOvpQGL8QtdxnBKILjBqxlHyliz0yCa1G903ZXI/FuHy2w==} engines: {node: '>=6.9.0'} - /@babel/helper-remap-async-to-generator@7.22.20(@babel/core@7.24.3): + /@babel/helper-remap-async-to-generator@7.22.20(@babel/core@7.24.4): resolution: {integrity: sha512-pBGyV4uBqOns+0UvhsTO8qgl8hO89PmiDYv+/COyp1aeMcmfrfruz+/nCMFiYyFF/Knn0yfrC85ZzNFjembFTw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 dependencies: - '@babel/core': 7.24.3 + '@babel/core': 7.24.4 '@babel/helper-annotate-as-pure': 7.22.5 '@babel/helper-environment-visitor': 7.22.20 '@babel/helper-wrap-function': 7.22.20 dev: false - /@babel/helper-replace-supers@7.24.1(@babel/core@7.24.3): + /@babel/helper-replace-supers@7.24.1(@babel/core@7.24.4): resolution: {integrity: sha512-QCR1UqC9BzG5vZl8BMicmZ28RuUBnHhAMddD8yHFHDRH9lLTZ9uUPehX8ctVPT8l0TKblJidqcgUUKGVrePleQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 dependencies: - '@babel/core': 7.24.3 + '@babel/core': 7.24.4 '@babel/helper-environment-visitor': 7.22.20 '@babel/helper-member-expression-to-functions': 7.23.0 '@babel/helper-optimise-call-expression': 7.22.5 @@ -352,8 +411,8 @@ packages: dependencies: '@babel/types': 7.24.0 - /@babel/helper-string-parser@7.23.4: - resolution: {integrity: sha512-803gmbQdqwdf4olxrX4AJyFBV/RTr3rSmOj0rKwesmzlfhYNDEs+/iOcznzpNWlJlIlTJC2QfPFcHB6DlzdVLQ==} + /@babel/helper-string-parser@7.24.1: + resolution: {integrity: sha512-2ofRCjnnA9y+wk8b9IAREroeUP02KHp431N2mhKniy2yKIDKpbrHv9eXwm8cBeWQYcJmzv5qKCu65P47eCF7CQ==} engines: {node: '>=6.9.0'} /@babel/helper-validator-identifier@7.22.20: @@ -373,24 +432,16 @@ packages: '@babel/types': 7.24.0 dev: false - /@babel/helpers@7.24.1: - resolution: {integrity: sha512-BpU09QqEe6ZCHuIHFphEFgvNSrubve1FtyMton26ekZ85gRGi6LrTF7zArARp2YvyFxloeiRmtSCq5sjh1WqIg==} + /@babel/helpers@7.24.4: + resolution: {integrity: sha512-FewdlZbSiwaVGlgT1DPANDuCHaDMiOo+D/IDYRFYjHOuv66xMSJ7fQwwODwRNAPkADIO/z1EoF/l2BCWlWABDw==} engines: {node: '>=6.9.0'} dependencies: '@babel/template': 7.24.0 - '@babel/traverse': 7.24.1 + '@babel/traverse': 7.24.1(supports-color@5.5.0) '@babel/types': 7.24.0 transitivePeerDependencies: - supports-color - /@babel/highlight@7.23.4: - resolution: {integrity: sha512-acGdbYSfp2WheJoJm/EBBBLh/ID8KDc64ISZ9DYtBmC8/Q204PZJLHyzeB5qMzJ5trcOkybd78M4x2KWsUq++A==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/helper-validator-identifier': 7.22.20 - chalk: 2.4.2 - js-tokens: 4.0.0 - /@babel/highlight@7.24.2: resolution: {integrity: sha512-Yac1ao4flkTxTteCDZLEvdxg2fZfz1v8M4QpaGypq/WPDqg3ijHYbDfs+LG5hvzSoqaSZ9/Z9lKSP3CjZjv+pA==} engines: {node: '>=6.9.0'} @@ -400,1132 +451,1127 @@ packages: js-tokens: 4.0.0 picocolors: 1.0.0 - /@babel/parser@7.24.0: - resolution: {integrity: sha512-QuP/FxEAzMSjXygs8v4N9dvdXzEHN4W1oF3PxuWAtPo08UdM17u89RDMgjLn/mlc56iM0HlLmVkO/wgR+rDgHg==} + /@babel/parser@7.24.4: + resolution: {integrity: sha512-zTvEBcghmeBma9QIGunWevvBAp4/Qu9Bdq+2k0Ot4fVMD6v3dsC9WOcRSKk7tRRyBM/53yKMJko9xOatGQAwSg==} engines: {node: '>=6.0.0'} hasBin: true dependencies: '@babel/types': 7.24.0 - /@babel/parser@7.24.1: - resolution: {integrity: sha512-Zo9c7N3xdOIQrNip7Lc9wvRPzlRtovHVE4lkz8WEDr7uYh/GMQhSiIgFxGIArRHYdJE5kxtZjAf8rT0xhdLCzg==} - engines: {node: '>=6.0.0'} - hasBin: true + /@babel/plugin-bugfix-firefox-class-in-computed-class-key@7.24.4(@babel/core@7.24.4): + resolution: {integrity: sha512-qpl6vOOEEzTLLcsuqYYo8yDtrTocmu2xkGvgNebvPjT9DTtfFYGmgDqY+rBYXNlqL4s9qLDn6xkrJv4RxAPiTA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 dependencies: - '@babel/types': 7.24.0 + '@babel/core': 7.24.4 + '@babel/helper-environment-visitor': 7.22.20 + '@babel/helper-plugin-utils': 7.24.0 + dev: false - /@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@7.24.1(@babel/core@7.24.3): + /@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@7.24.1(@babel/core@7.24.4): resolution: {integrity: sha512-y4HqEnkelJIOQGd+3g1bTeKsA5c6qM7eOn7VggGVbBc0y8MLSKHacwcIE2PplNlQSj0PqS9rrXL/nkPVK+kUNg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 dependencies: - '@babel/core': 7.24.3 + '@babel/core': 7.24.4 '@babel/helper-plugin-utils': 7.24.0 dev: false - /@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@7.24.1(@babel/core@7.24.3): + /@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@7.24.1(@babel/core@7.24.4): resolution: {integrity: sha512-Hj791Ii4ci8HqnaKHAlLNs+zaLXb0EzSDhiAWp5VNlyvCNymYfacs64pxTxbH1znW/NcArSmwpmG9IKE/TUVVQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.13.0 dependencies: - '@babel/core': 7.24.3 + '@babel/core': 7.24.4 '@babel/helper-plugin-utils': 7.24.0 '@babel/helper-skip-transparent-expression-wrappers': 7.22.5 - '@babel/plugin-transform-optional-chaining': 7.24.1(@babel/core@7.24.3) + '@babel/plugin-transform-optional-chaining': 7.24.1(@babel/core@7.24.4) dev: false - /@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@7.24.1(@babel/core@7.24.3): + /@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@7.24.1(@babel/core@7.24.4): resolution: {integrity: sha512-m9m/fXsXLiHfwdgydIFnpk+7jlVbnvlK5B2EKiPdLUb6WX654ZaaEWJUjk8TftRbZpK0XibovlLWX4KIZhV6jw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 dependencies: - '@babel/core': 7.24.3 + '@babel/core': 7.24.4 '@babel/helper-environment-visitor': 7.22.20 '@babel/helper-plugin-utils': 7.24.0 dev: false - /@babel/plugin-proposal-async-generator-functions@7.20.7(@babel/core@7.24.3): + /@babel/plugin-proposal-async-generator-functions@7.20.7(@babel/core@7.24.4): resolution: {integrity: sha512-xMbiLsn/8RK7Wq7VeVytytS2L6qE69bXPB10YCmMdDZbKF4okCqY74pI/jJQ/8U0b/F6NrT2+14b8/P9/3AMGA==} engines: {node: '>=6.9.0'} deprecated: This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-async-generator-functions instead. peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.3 + '@babel/core': 7.24.4 '@babel/helper-environment-visitor': 7.22.20 '@babel/helper-plugin-utils': 7.24.0 - '@babel/helper-remap-async-to-generator': 7.22.20(@babel/core@7.24.3) - '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.24.3) + '@babel/helper-remap-async-to-generator': 7.22.20(@babel/core@7.24.4) + '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.24.4) dev: false - /@babel/plugin-proposal-class-properties@7.18.6(@babel/core@7.24.3): + /@babel/plugin-proposal-class-properties@7.18.6(@babel/core@7.24.4): resolution: {integrity: sha512-cumfXOF0+nzZrrN8Rf0t7M+tF6sZc7vhQwYQck9q1/5w2OExlD+b4v4RpMJFaV1Z7WcDRgO6FqvxqxGlwo+RHQ==} engines: {node: '>=6.9.0'} deprecated: This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-class-properties instead. peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.3 - '@babel/helper-create-class-features-plugin': 7.24.1(@babel/core@7.24.3) + '@babel/core': 7.24.4 + '@babel/helper-create-class-features-plugin': 7.24.4(@babel/core@7.24.4) '@babel/helper-plugin-utils': 7.24.0 dev: false - /@babel/plugin-proposal-export-default-from@7.24.1(@babel/core@7.24.3): + /@babel/plugin-proposal-export-default-from@7.24.1(@babel/core@7.24.4): resolution: {integrity: sha512-+0hrgGGV3xyYIjOrD/bUZk/iUwOIGuoANfRfVg1cPhYBxF+TIXSEcc42DqzBICmWsnAQ+SfKedY0bj8QD+LuMg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.3 + '@babel/core': 7.24.4 '@babel/helper-plugin-utils': 7.24.0 - '@babel/plugin-syntax-export-default-from': 7.24.1(@babel/core@7.24.3) + '@babel/plugin-syntax-export-default-from': 7.24.1(@babel/core@7.24.4) dev: false - /@babel/plugin-proposal-nullish-coalescing-operator@7.18.6(@babel/core@7.24.3): + /@babel/plugin-proposal-nullish-coalescing-operator@7.18.6(@babel/core@7.24.4): resolution: {integrity: sha512-wQxQzxYeJqHcfppzBDnm1yAY0jSRkUXR2z8RePZYrKwMKgMlE8+Z6LUno+bd6LvbGh8Gltvy74+9pIYkr+XkKA==} engines: {node: '>=6.9.0'} deprecated: This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-nullish-coalescing-operator instead. peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.3 + '@babel/core': 7.24.4 '@babel/helper-plugin-utils': 7.24.0 - '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.24.3) + '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.24.4) dev: false - /@babel/plugin-proposal-numeric-separator@7.18.6(@babel/core@7.24.3): + /@babel/plugin-proposal-numeric-separator@7.18.6(@babel/core@7.24.4): resolution: {integrity: sha512-ozlZFogPqoLm8WBr5Z8UckIoE4YQ5KESVcNudyXOR8uqIkliTEgJ3RoketfG6pmzLdeZF0H/wjE9/cCEitBl7Q==} engines: {node: '>=6.9.0'} deprecated: This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-numeric-separator instead. peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.3 + '@babel/core': 7.24.4 '@babel/helper-plugin-utils': 7.24.0 - '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.24.3) + '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.24.4) dev: false - /@babel/plugin-proposal-object-rest-spread@7.20.7(@babel/core@7.24.3): + /@babel/plugin-proposal-object-rest-spread@7.20.7(@babel/core@7.24.4): resolution: {integrity: sha512-d2S98yCiLxDVmBmE8UjGcfPvNEUbA1U5q5WxaWFUGRzJSVAZqm5W6MbPct0jxnegUZ0niLeNX+IOzEs7wYg9Dg==} engines: {node: '>=6.9.0'} deprecated: This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-object-rest-spread instead. peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/compat-data': 7.24.1 - '@babel/core': 7.24.3 + '@babel/compat-data': 7.24.4 + '@babel/core': 7.24.4 '@babel/helper-compilation-targets': 7.23.6 '@babel/helper-plugin-utils': 7.24.0 - '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.24.3) - '@babel/plugin-transform-parameters': 7.24.1(@babel/core@7.24.3) + '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.24.4) + '@babel/plugin-transform-parameters': 7.24.1(@babel/core@7.24.4) dev: false - /@babel/plugin-proposal-optional-catch-binding@7.18.6(@babel/core@7.24.3): + /@babel/plugin-proposal-optional-catch-binding@7.18.6(@babel/core@7.24.4): resolution: {integrity: sha512-Q40HEhs9DJQyaZfUjjn6vE8Cv4GmMHCYuMGIWUnlxH6400VGxOuwWsPt4FxXxJkC/5eOzgn0z21M9gMT4MOhbw==} engines: {node: '>=6.9.0'} deprecated: This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-optional-catch-binding instead. peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.3 + '@babel/core': 7.24.4 '@babel/helper-plugin-utils': 7.24.0 - '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.24.3) + '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.24.4) dev: false - /@babel/plugin-proposal-optional-chaining@7.21.0(@babel/core@7.24.3): + /@babel/plugin-proposal-optional-chaining@7.21.0(@babel/core@7.24.4): resolution: {integrity: sha512-p4zeefM72gpmEe2fkUr/OnOXpWEf8nAgk7ZYVqqfFiyIG7oFfVZcCrU64hWn5xp4tQ9LkV4bTIa5rD0KANpKNA==} engines: {node: '>=6.9.0'} deprecated: This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-optional-chaining instead. peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.3 + '@babel/core': 7.24.4 '@babel/helper-plugin-utils': 7.24.0 '@babel/helper-skip-transparent-expression-wrappers': 7.22.5 - '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.24.3) + '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.24.4) dev: false - /@babel/plugin-proposal-private-property-in-object@7.21.0-placeholder-for-preset-env.2(@babel/core@7.24.3): + /@babel/plugin-proposal-private-property-in-object@7.21.0-placeholder-for-preset-env.2(@babel/core@7.24.4): resolution: {integrity: sha512-SOSkfJDddaM7mak6cPEpswyTRnuRltl429hMraQEglW+OkovnCzsiszTmsrlY//qLFjCpQDFRvjdm2wA5pPm9w==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.3 + '@babel/core': 7.24.4 dev: false - /@babel/plugin-syntax-async-generators@7.8.4(@babel/core@7.24.3): + /@babel/plugin-syntax-async-generators@7.8.4(@babel/core@7.24.4): resolution: {integrity: sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.3 + '@babel/core': 7.24.4 '@babel/helper-plugin-utils': 7.24.0 dev: false - /@babel/plugin-syntax-class-properties@7.12.13(@babel/core@7.24.3): + /@babel/plugin-syntax-class-properties@7.12.13(@babel/core@7.24.4): resolution: {integrity: sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.3 + '@babel/core': 7.24.4 '@babel/helper-plugin-utils': 7.24.0 dev: false - /@babel/plugin-syntax-class-static-block@7.14.5(@babel/core@7.24.3): + /@babel/plugin-syntax-class-static-block@7.14.5(@babel/core@7.24.4): resolution: {integrity: sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.3 + '@babel/core': 7.24.4 '@babel/helper-plugin-utils': 7.24.0 dev: false - /@babel/plugin-syntax-dynamic-import@7.8.3(@babel/core@7.24.3): + /@babel/plugin-syntax-dynamic-import@7.8.3(@babel/core@7.24.4): resolution: {integrity: sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.3 + '@babel/core': 7.24.4 '@babel/helper-plugin-utils': 7.24.0 dev: false - /@babel/plugin-syntax-export-default-from@7.24.1(@babel/core@7.24.3): + /@babel/plugin-syntax-export-default-from@7.24.1(@babel/core@7.24.4): resolution: {integrity: sha512-cNXSxv9eTkGUtd0PsNMK8Yx5xeScxfpWOUAxE+ZPAXXEcAMOC3fk7LRdXq5fvpra2pLx2p1YtkAhpUbB2SwaRA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.3 + '@babel/core': 7.24.4 '@babel/helper-plugin-utils': 7.24.0 dev: false - /@babel/plugin-syntax-export-namespace-from@7.8.3(@babel/core@7.24.3): + /@babel/plugin-syntax-export-namespace-from@7.8.3(@babel/core@7.24.4): resolution: {integrity: sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.3 + '@babel/core': 7.24.4 '@babel/helper-plugin-utils': 7.24.0 dev: false - /@babel/plugin-syntax-flow@7.24.1(@babel/core@7.24.3): + /@babel/plugin-syntax-flow@7.24.1(@babel/core@7.24.4): resolution: {integrity: sha512-sxi2kLTI5DeW5vDtMUsk4mTPwvlUDbjOnoWayhynCwrw4QXRld4QEYwqzY8JmQXaJUtgUuCIurtSRH5sn4c7mA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.3 + '@babel/core': 7.24.4 '@babel/helper-plugin-utils': 7.24.0 dev: false - /@babel/plugin-syntax-import-assertions@7.24.1(@babel/core@7.24.3): + /@babel/plugin-syntax-import-assertions@7.24.1(@babel/core@7.24.4): resolution: {integrity: sha512-IuwnI5XnuF189t91XbxmXeCDz3qs6iDRO7GJ++wcfgeXNs/8FmIlKcpDSXNVyuLQxlwvskmI3Ct73wUODkJBlQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.3 + '@babel/core': 7.24.4 '@babel/helper-plugin-utils': 7.24.0 dev: false - /@babel/plugin-syntax-import-attributes@7.24.1(@babel/core@7.24.3): + /@babel/plugin-syntax-import-attributes@7.24.1(@babel/core@7.24.4): resolution: {integrity: sha512-zhQTMH0X2nVLnb04tz+s7AMuasX8U0FnpE+nHTOhSOINjWMnopoZTxtIKsd45n4GQ/HIZLyfIpoul8e2m0DnRA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.3 + '@babel/core': 7.24.4 '@babel/helper-plugin-utils': 7.24.0 dev: false - /@babel/plugin-syntax-import-meta@7.10.4(@babel/core@7.24.3): + /@babel/plugin-syntax-import-meta@7.10.4(@babel/core@7.24.4): resolution: {integrity: sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.3 + '@babel/core': 7.24.4 '@babel/helper-plugin-utils': 7.24.0 dev: false - /@babel/plugin-syntax-json-strings@7.8.3(@babel/core@7.24.3): + /@babel/plugin-syntax-json-strings@7.8.3(@babel/core@7.24.4): resolution: {integrity: sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.3 - '@babel/helper-plugin-utils': 7.24.0 - dev: false - - /@babel/plugin-syntax-jsx@7.23.3(@babel/core@7.24.3): - resolution: {integrity: sha512-EB2MELswq55OHUoRZLGg/zC7QWUKfNLpE57m/S2yr1uEneIgsTgrSzXP3NXEsMkVn76OlaVVnzN+ugObuYGwhg==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.24.3 + '@babel/core': 7.24.4 '@babel/helper-plugin-utils': 7.24.0 dev: false - /@babel/plugin-syntax-jsx@7.24.1(@babel/core@7.24.3): + /@babel/plugin-syntax-jsx@7.24.1(@babel/core@7.24.4): resolution: {integrity: sha512-2eCtxZXf+kbkMIsXS4poTvT4Yu5rXiRa+9xGVT56raghjmBTKMpFNc9R4IDiB4emao9eO22Ox7CxuJG7BgExqA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.3 + '@babel/core': 7.24.4 '@babel/helper-plugin-utils': 7.24.0 dev: false - /@babel/plugin-syntax-logical-assignment-operators@7.10.4(@babel/core@7.24.3): + /@babel/plugin-syntax-logical-assignment-operators@7.10.4(@babel/core@7.24.4): resolution: {integrity: sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.3 + '@babel/core': 7.24.4 '@babel/helper-plugin-utils': 7.24.0 dev: false - /@babel/plugin-syntax-nullish-coalescing-operator@7.8.3(@babel/core@7.24.3): + /@babel/plugin-syntax-nullish-coalescing-operator@7.8.3(@babel/core@7.24.4): resolution: {integrity: sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.3 + '@babel/core': 7.24.4 '@babel/helper-plugin-utils': 7.24.0 dev: false - /@babel/plugin-syntax-numeric-separator@7.10.4(@babel/core@7.24.3): + /@babel/plugin-syntax-numeric-separator@7.10.4(@babel/core@7.24.4): resolution: {integrity: sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.3 + '@babel/core': 7.24.4 '@babel/helper-plugin-utils': 7.24.0 dev: false - /@babel/plugin-syntax-object-rest-spread@7.8.3(@babel/core@7.24.3): + /@babel/plugin-syntax-object-rest-spread@7.8.3(@babel/core@7.24.4): resolution: {integrity: sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.3 + '@babel/core': 7.24.4 '@babel/helper-plugin-utils': 7.24.0 dev: false - /@babel/plugin-syntax-optional-catch-binding@7.8.3(@babel/core@7.24.3): + /@babel/plugin-syntax-optional-catch-binding@7.8.3(@babel/core@7.24.4): resolution: {integrity: sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.3 + '@babel/core': 7.24.4 '@babel/helper-plugin-utils': 7.24.0 dev: false - /@babel/plugin-syntax-optional-chaining@7.8.3(@babel/core@7.24.3): + /@babel/plugin-syntax-optional-chaining@7.8.3(@babel/core@7.24.4): resolution: {integrity: sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.3 + '@babel/core': 7.24.4 '@babel/helper-plugin-utils': 7.24.0 dev: false - /@babel/plugin-syntax-private-property-in-object@7.14.5(@babel/core@7.24.3): + /@babel/plugin-syntax-private-property-in-object@7.14.5(@babel/core@7.24.4): resolution: {integrity: sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.3 + '@babel/core': 7.24.4 '@babel/helper-plugin-utils': 7.24.0 dev: false - /@babel/plugin-syntax-top-level-await@7.14.5(@babel/core@7.24.3): + /@babel/plugin-syntax-top-level-await@7.14.5(@babel/core@7.24.4): resolution: {integrity: sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.3 + '@babel/core': 7.24.4 '@babel/helper-plugin-utils': 7.24.0 dev: false - /@babel/plugin-syntax-typescript@7.24.1(@babel/core@7.24.3): + /@babel/plugin-syntax-typescript@7.24.1(@babel/core@7.24.4): resolution: {integrity: sha512-Yhnmvy5HZEnHUty6i++gcfH1/l68AHnItFHnaCv6hn9dNh0hQvvQJsxpi4BMBFN5DLeHBuucT/0DgzXif/OyRw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.3 + '@babel/core': 7.24.4 '@babel/helper-plugin-utils': 7.24.0 dev: false - /@babel/plugin-syntax-unicode-sets-regex@7.18.6(@babel/core@7.24.3): + /@babel/plugin-syntax-unicode-sets-regex@7.18.6(@babel/core@7.24.4): resolution: {integrity: sha512-727YkEAPwSIQTv5im8QHz3upqp92JTWhidIC81Tdx4VJYIte/VndKf1qKrfnnhPLiPghStWfvC/iFaMCQu7Nqg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 dependencies: - '@babel/core': 7.24.3 - '@babel/helper-create-regexp-features-plugin': 7.22.15(@babel/core@7.24.3) + '@babel/core': 7.24.4 + '@babel/helper-create-regexp-features-plugin': 7.22.15(@babel/core@7.24.4) '@babel/helper-plugin-utils': 7.24.0 dev: false - /@babel/plugin-transform-arrow-functions@7.24.1(@babel/core@7.24.3): + /@babel/plugin-transform-arrow-functions@7.24.1(@babel/core@7.24.4): resolution: {integrity: sha512-ngT/3NkRhsaep9ck9uj2Xhv9+xB1zShY3tM3g6om4xxCELwCDN4g4Aq5dRn48+0hasAql7s2hdBOysCfNpr4fw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.3 + '@babel/core': 7.24.4 '@babel/helper-plugin-utils': 7.24.0 dev: false - /@babel/plugin-transform-async-generator-functions@7.24.3(@babel/core@7.24.3): + /@babel/plugin-transform-async-generator-functions@7.24.3(@babel/core@7.24.4): resolution: {integrity: sha512-Qe26CMYVjpQxJ8zxM1340JFNjZaF+ISWpr1Kt/jGo+ZTUzKkfw/pphEWbRCb+lmSM6k/TOgfYLvmbHkUQ0asIg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.3 + '@babel/core': 7.24.4 '@babel/helper-environment-visitor': 7.22.20 '@babel/helper-plugin-utils': 7.24.0 - '@babel/helper-remap-async-to-generator': 7.22.20(@babel/core@7.24.3) - '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.24.3) + '@babel/helper-remap-async-to-generator': 7.22.20(@babel/core@7.24.4) + '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.24.4) dev: false - /@babel/plugin-transform-async-to-generator@7.24.1(@babel/core@7.24.3): + /@babel/plugin-transform-async-to-generator@7.24.1(@babel/core@7.24.4): resolution: {integrity: sha512-AawPptitRXp1y0n4ilKcGbRYWfbbzFWz2NqNu7dacYDtFtz0CMjG64b3LQsb3KIgnf4/obcUL78hfaOS7iCUfw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.3 + '@babel/core': 7.24.4 '@babel/helper-module-imports': 7.24.3 '@babel/helper-plugin-utils': 7.24.0 - '@babel/helper-remap-async-to-generator': 7.22.20(@babel/core@7.24.3) + '@babel/helper-remap-async-to-generator': 7.22.20(@babel/core@7.24.4) dev: false - /@babel/plugin-transform-block-scoped-functions@7.24.1(@babel/core@7.24.3): + /@babel/plugin-transform-block-scoped-functions@7.24.1(@babel/core@7.24.4): resolution: {integrity: sha512-TWWC18OShZutrv9C6mye1xwtam+uNi2bnTOCBUd5sZxyHOiWbU6ztSROofIMrK84uweEZC219POICK/sTYwfgg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.3 + '@babel/core': 7.24.4 '@babel/helper-plugin-utils': 7.24.0 dev: false - /@babel/plugin-transform-block-scoping@7.24.1(@babel/core@7.24.3): - resolution: {integrity: sha512-h71T2QQvDgM2SmT29UYU6ozjMlAt7s7CSs5Hvy8f8cf/GM/Z4a2zMfN+fjVGaieeCrXR3EdQl6C4gQG+OgmbKw==} + /@babel/plugin-transform-block-scoping@7.24.4(@babel/core@7.24.4): + resolution: {integrity: sha512-nIFUZIpGKDf9O9ttyRXpHFpKC+X3Y5mtshZONuEUYBomAKoM4y029Jr+uB1bHGPhNmK8YXHevDtKDOLmtRrp6g==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.3 + '@babel/core': 7.24.4 '@babel/helper-plugin-utils': 7.24.0 dev: false - /@babel/plugin-transform-class-properties@7.24.1(@babel/core@7.24.3): + /@babel/plugin-transform-class-properties@7.24.1(@babel/core@7.24.4): resolution: {integrity: sha512-OMLCXi0NqvJfORTaPQBwqLXHhb93wkBKZ4aNwMl6WtehO7ar+cmp+89iPEQPqxAnxsOKTaMcs3POz3rKayJ72g==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.3 - '@babel/helper-create-class-features-plugin': 7.24.1(@babel/core@7.24.3) + '@babel/core': 7.24.4 + '@babel/helper-create-class-features-plugin': 7.24.4(@babel/core@7.24.4) '@babel/helper-plugin-utils': 7.24.0 dev: false - /@babel/plugin-transform-class-static-block@7.24.1(@babel/core@7.24.3): - resolution: {integrity: sha512-FUHlKCn6J3ERiu8Dv+4eoz7w8+kFLSyeVG4vDAikwADGjUCoHw/JHokyGtr8OR4UjpwPVivyF+h8Q5iv/JmrtA==} + /@babel/plugin-transform-class-static-block@7.24.4(@babel/core@7.24.4): + resolution: {integrity: sha512-B8q7Pz870Hz/q9UgP8InNpY01CSLDSCyqX7zcRuv3FcPl87A2G17lASroHWaCtbdIcbYzOZ7kWmXFKbijMSmFg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.12.0 dependencies: - '@babel/core': 7.24.3 - '@babel/helper-create-class-features-plugin': 7.24.1(@babel/core@7.24.3) + '@babel/core': 7.24.4 + '@babel/helper-create-class-features-plugin': 7.24.4(@babel/core@7.24.4) '@babel/helper-plugin-utils': 7.24.0 - '@babel/plugin-syntax-class-static-block': 7.14.5(@babel/core@7.24.3) + '@babel/plugin-syntax-class-static-block': 7.14.5(@babel/core@7.24.4) dev: false - /@babel/plugin-transform-classes@7.24.1(@babel/core@7.24.3): + /@babel/plugin-transform-classes@7.24.1(@babel/core@7.24.4): resolution: {integrity: sha512-ZTIe3W7UejJd3/3R4p7ScyyOoafetUShSf4kCqV0O7F/RiHxVj/wRaRnQlrGwflvcehNA8M42HkAiEDYZu2F1Q==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.3 + '@babel/core': 7.24.4 '@babel/helper-annotate-as-pure': 7.22.5 '@babel/helper-compilation-targets': 7.23.6 '@babel/helper-environment-visitor': 7.22.20 '@babel/helper-function-name': 7.23.0 '@babel/helper-plugin-utils': 7.24.0 - '@babel/helper-replace-supers': 7.24.1(@babel/core@7.24.3) + '@babel/helper-replace-supers': 7.24.1(@babel/core@7.24.4) '@babel/helper-split-export-declaration': 7.22.6 globals: 11.12.0 dev: false - /@babel/plugin-transform-computed-properties@7.24.1(@babel/core@7.24.3): + /@babel/plugin-transform-computed-properties@7.24.1(@babel/core@7.24.4): resolution: {integrity: sha512-5pJGVIUfJpOS+pAqBQd+QMaTD2vCL/HcePooON6pDpHgRp4gNRmzyHTPIkXntwKsq3ayUFVfJaIKPw2pOkOcTw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.3 + '@babel/core': 7.24.4 '@babel/helper-plugin-utils': 7.24.0 '@babel/template': 7.24.0 dev: false - /@babel/plugin-transform-destructuring@7.24.1(@babel/core@7.24.3): + /@babel/plugin-transform-destructuring@7.24.1(@babel/core@7.24.4): resolution: {integrity: sha512-ow8jciWqNxR3RYbSNVuF4U2Jx130nwnBnhRw6N6h1bOejNkABmcI5X5oz29K4alWX7vf1C+o6gtKXikzRKkVdw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.3 + '@babel/core': 7.24.4 '@babel/helper-plugin-utils': 7.24.0 dev: false - /@babel/plugin-transform-dotall-regex@7.24.1(@babel/core@7.24.3): + /@babel/plugin-transform-dotall-regex@7.24.1(@babel/core@7.24.4): resolution: {integrity: sha512-p7uUxgSoZwZ2lPNMzUkqCts3xlp8n+o05ikjy7gbtFJSt9gdU88jAmtfmOxHM14noQXBxfgzf2yRWECiNVhTCw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.3 - '@babel/helper-create-regexp-features-plugin': 7.22.15(@babel/core@7.24.3) + '@babel/core': 7.24.4 + '@babel/helper-create-regexp-features-plugin': 7.22.15(@babel/core@7.24.4) '@babel/helper-plugin-utils': 7.24.0 dev: false - /@babel/plugin-transform-duplicate-keys@7.24.1(@babel/core@7.24.3): + /@babel/plugin-transform-duplicate-keys@7.24.1(@babel/core@7.24.4): resolution: {integrity: sha512-msyzuUnvsjsaSaocV6L7ErfNsa5nDWL1XKNnDePLgmz+WdU4w/J8+AxBMrWfi9m4IxfL5sZQKUPQKDQeeAT6lA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.3 + '@babel/core': 7.24.4 '@babel/helper-plugin-utils': 7.24.0 dev: false - /@babel/plugin-transform-dynamic-import@7.24.1(@babel/core@7.24.3): + /@babel/plugin-transform-dynamic-import@7.24.1(@babel/core@7.24.4): resolution: {integrity: sha512-av2gdSTyXcJVdI+8aFZsCAtR29xJt0S5tas+Ef8NvBNmD1a+N/3ecMLeMBgfcK+xzsjdLDT6oHt+DFPyeqUbDA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.3 + '@babel/core': 7.24.4 '@babel/helper-plugin-utils': 7.24.0 - '@babel/plugin-syntax-dynamic-import': 7.8.3(@babel/core@7.24.3) + '@babel/plugin-syntax-dynamic-import': 7.8.3(@babel/core@7.24.4) dev: false - /@babel/plugin-transform-exponentiation-operator@7.24.1(@babel/core@7.24.3): + /@babel/plugin-transform-exponentiation-operator@7.24.1(@babel/core@7.24.4): resolution: {integrity: sha512-U1yX13dVBSwS23DEAqU+Z/PkwE9/m7QQy8Y9/+Tdb8UWYaGNDYwTLi19wqIAiROr8sXVum9A/rtiH5H0boUcTw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.3 + '@babel/core': 7.24.4 '@babel/helper-builder-binary-assignment-operator-visitor': 7.22.15 '@babel/helper-plugin-utils': 7.24.0 dev: false - /@babel/plugin-transform-export-namespace-from@7.24.1(@babel/core@7.24.3): + /@babel/plugin-transform-export-namespace-from@7.24.1(@babel/core@7.24.4): resolution: {integrity: sha512-Ft38m/KFOyzKw2UaJFkWG9QnHPG/Q/2SkOrRk4pNBPg5IPZ+dOxcmkK5IyuBcxiNPyyYowPGUReyBvrvZs7IlQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.3 + '@babel/core': 7.24.4 '@babel/helper-plugin-utils': 7.24.0 - '@babel/plugin-syntax-export-namespace-from': 7.8.3(@babel/core@7.24.3) + '@babel/plugin-syntax-export-namespace-from': 7.8.3(@babel/core@7.24.4) dev: false - /@babel/plugin-transform-flow-strip-types@7.24.1(@babel/core@7.24.3): + /@babel/plugin-transform-flow-strip-types@7.24.1(@babel/core@7.24.4): resolution: {integrity: sha512-iIYPIWt3dUmUKKE10s3W+jsQ3icFkw0JyRVyY1B7G4yK/nngAOHLVx8xlhA6b/Jzl/Y0nis8gjqhqKtRDQqHWQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.3 + '@babel/core': 7.24.4 '@babel/helper-plugin-utils': 7.24.0 - '@babel/plugin-syntax-flow': 7.24.1(@babel/core@7.24.3) + '@babel/plugin-syntax-flow': 7.24.1(@babel/core@7.24.4) dev: false - /@babel/plugin-transform-for-of@7.24.1(@babel/core@7.24.3): + /@babel/plugin-transform-for-of@7.24.1(@babel/core@7.24.4): resolution: {integrity: sha512-OxBdcnF04bpdQdR3i4giHZNZQn7cm8RQKcSwA17wAAqEELo1ZOwp5FFgeptWUQXFyT9kwHo10aqqauYkRZPCAg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.3 + '@babel/core': 7.24.4 '@babel/helper-plugin-utils': 7.24.0 '@babel/helper-skip-transparent-expression-wrappers': 7.22.5 dev: false - /@babel/plugin-transform-function-name@7.24.1(@babel/core@7.24.3): + /@babel/plugin-transform-function-name@7.24.1(@babel/core@7.24.4): resolution: {integrity: sha512-BXmDZpPlh7jwicKArQASrj8n22/w6iymRnvHYYd2zO30DbE277JO20/7yXJT3QxDPtiQiOxQBbZH4TpivNXIxA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.3 + '@babel/core': 7.24.4 '@babel/helper-compilation-targets': 7.23.6 '@babel/helper-function-name': 7.23.0 '@babel/helper-plugin-utils': 7.24.0 dev: false - /@babel/plugin-transform-json-strings@7.24.1(@babel/core@7.24.3): + /@babel/plugin-transform-json-strings@7.24.1(@babel/core@7.24.4): resolution: {integrity: sha512-U7RMFmRvoasscrIFy5xA4gIp8iWnWubnKkKuUGJjsuOH7GfbMkB+XZzeslx2kLdEGdOJDamEmCqOks6e8nv8DQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.3 + '@babel/core': 7.24.4 '@babel/helper-plugin-utils': 7.24.0 - '@babel/plugin-syntax-json-strings': 7.8.3(@babel/core@7.24.3) + '@babel/plugin-syntax-json-strings': 7.8.3(@babel/core@7.24.4) dev: false - /@babel/plugin-transform-literals@7.24.1(@babel/core@7.24.3): + /@babel/plugin-transform-literals@7.24.1(@babel/core@7.24.4): resolution: {integrity: sha512-zn9pwz8U7nCqOYIiBaOxoQOtYmMODXTJnkxG4AtX8fPmnCRYWBOHD0qcpwS9e2VDSp1zNJYpdnFMIKb8jmwu6g==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.3 + '@babel/core': 7.24.4 '@babel/helper-plugin-utils': 7.24.0 dev: false - /@babel/plugin-transform-logical-assignment-operators@7.24.1(@babel/core@7.24.3): + /@babel/plugin-transform-logical-assignment-operators@7.24.1(@babel/core@7.24.4): resolution: {integrity: sha512-OhN6J4Bpz+hIBqItTeWJujDOfNP+unqv/NJgyhlpSqgBTPm37KkMmZV6SYcOj+pnDbdcl1qRGV/ZiIjX9Iy34w==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.3 + '@babel/core': 7.24.4 '@babel/helper-plugin-utils': 7.24.0 - '@babel/plugin-syntax-logical-assignment-operators': 7.10.4(@babel/core@7.24.3) + '@babel/plugin-syntax-logical-assignment-operators': 7.10.4(@babel/core@7.24.4) dev: false - /@babel/plugin-transform-member-expression-literals@7.24.1(@babel/core@7.24.3): + /@babel/plugin-transform-member-expression-literals@7.24.1(@babel/core@7.24.4): resolution: {integrity: sha512-4ojai0KysTWXzHseJKa1XPNXKRbuUrhkOPY4rEGeR+7ChlJVKxFa3H3Bz+7tWaGKgJAXUWKOGmltN+u9B3+CVg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.3 + '@babel/core': 7.24.4 '@babel/helper-plugin-utils': 7.24.0 dev: false - /@babel/plugin-transform-modules-amd@7.24.1(@babel/core@7.24.3): + /@babel/plugin-transform-modules-amd@7.24.1(@babel/core@7.24.4): resolution: {integrity: sha512-lAxNHi4HVtjnHd5Rxg3D5t99Xm6H7b04hUS7EHIXcUl2EV4yl1gWdqZrNzXnSrHveL9qMdbODlLF55mvgjAfaQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.3 - '@babel/helper-module-transforms': 7.23.3(@babel/core@7.24.3) + '@babel/core': 7.24.4 + '@babel/helper-module-transforms': 7.23.3(@babel/core@7.24.4) '@babel/helper-plugin-utils': 7.24.0 dev: false - /@babel/plugin-transform-modules-commonjs@7.24.1(@babel/core@7.24.3): + /@babel/plugin-transform-modules-commonjs@7.24.1(@babel/core@7.24.4): resolution: {integrity: sha512-szog8fFTUxBfw0b98gEWPaEqF42ZUD/T3bkynW/wtgx2p/XCP55WEsb+VosKceRSd6njipdZvNogqdtI4Q0chw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.3 - '@babel/helper-module-transforms': 7.23.3(@babel/core@7.24.3) + '@babel/core': 7.24.4 + '@babel/helper-module-transforms': 7.23.3(@babel/core@7.24.4) '@babel/helper-plugin-utils': 7.24.0 '@babel/helper-simple-access': 7.22.5 dev: false - /@babel/plugin-transform-modules-systemjs@7.24.1(@babel/core@7.24.3): + /@babel/plugin-transform-modules-systemjs@7.24.1(@babel/core@7.24.4): resolution: {integrity: sha512-mqQ3Zh9vFO1Tpmlt8QPnbwGHzNz3lpNEMxQb1kAemn/erstyqw1r9KeOlOfo3y6xAnFEcOv2tSyrXfmMk+/YZA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.3 + '@babel/core': 7.24.4 '@babel/helper-hoist-variables': 7.22.5 - '@babel/helper-module-transforms': 7.23.3(@babel/core@7.24.3) + '@babel/helper-module-transforms': 7.23.3(@babel/core@7.24.4) '@babel/helper-plugin-utils': 7.24.0 '@babel/helper-validator-identifier': 7.22.20 dev: false - /@babel/plugin-transform-modules-umd@7.24.1(@babel/core@7.24.3): + /@babel/plugin-transform-modules-umd@7.24.1(@babel/core@7.24.4): resolution: {integrity: sha512-tuA3lpPj+5ITfcCluy6nWonSL7RvaG0AOTeAuvXqEKS34lnLzXpDb0dcP6K8jD0zWZFNDVly90AGFJPnm4fOYg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.3 - '@babel/helper-module-transforms': 7.23.3(@babel/core@7.24.3) + '@babel/core': 7.24.4 + '@babel/helper-module-transforms': 7.23.3(@babel/core@7.24.4) '@babel/helper-plugin-utils': 7.24.0 dev: false - /@babel/plugin-transform-named-capturing-groups-regex@7.22.5(@babel/core@7.24.3): + /@babel/plugin-transform-named-capturing-groups-regex@7.22.5(@babel/core@7.24.4): resolution: {integrity: sha512-YgLLKmS3aUBhHaxp5hi1WJTgOUb/NCuDHzGT9z9WTt3YG+CPRhJs6nprbStx6DnWM4dh6gt7SU3sZodbZ08adQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 dependencies: - '@babel/core': 7.24.3 - '@babel/helper-create-regexp-features-plugin': 7.22.15(@babel/core@7.24.3) + '@babel/core': 7.24.4 + '@babel/helper-create-regexp-features-plugin': 7.22.15(@babel/core@7.24.4) '@babel/helper-plugin-utils': 7.24.0 dev: false - /@babel/plugin-transform-new-target@7.24.1(@babel/core@7.24.3): + /@babel/plugin-transform-new-target@7.24.1(@babel/core@7.24.4): resolution: {integrity: sha512-/rurytBM34hYy0HKZQyA0nHbQgQNFm4Q/BOc9Hflxi2X3twRof7NaE5W46j4kQitm7SvACVRXsa6N/tSZxvPug==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.3 + '@babel/core': 7.24.4 '@babel/helper-plugin-utils': 7.24.0 dev: false - /@babel/plugin-transform-nullish-coalescing-operator@7.24.1(@babel/core@7.24.3): + /@babel/plugin-transform-nullish-coalescing-operator@7.24.1(@babel/core@7.24.4): resolution: {integrity: sha512-iQ+caew8wRrhCikO5DrUYx0mrmdhkaELgFa+7baMcVuhxIkN7oxt06CZ51D65ugIb1UWRQ8oQe+HXAVM6qHFjw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.3 + '@babel/core': 7.24.4 '@babel/helper-plugin-utils': 7.24.0 - '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.24.3) + '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.24.4) dev: false - /@babel/plugin-transform-numeric-separator@7.24.1(@babel/core@7.24.3): + /@babel/plugin-transform-numeric-separator@7.24.1(@babel/core@7.24.4): resolution: {integrity: sha512-7GAsGlK4cNL2OExJH1DzmDeKnRv/LXq0eLUSvudrehVA5Rgg4bIrqEUW29FbKMBRT0ztSqisv7kjP+XIC4ZMNw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.3 + '@babel/core': 7.24.4 '@babel/helper-plugin-utils': 7.24.0 - '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.24.3) + '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.24.4) dev: false - /@babel/plugin-transform-object-rest-spread@7.24.1(@babel/core@7.24.3): + /@babel/plugin-transform-object-rest-spread@7.24.1(@babel/core@7.24.4): resolution: {integrity: sha512-XjD5f0YqOtebto4HGISLNfiNMTTs6tbkFf2TOqJlYKYmbo+mN9Dnpl4SRoofiziuOWMIyq3sZEUqLo3hLITFEA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.3 + '@babel/core': 7.24.4 '@babel/helper-compilation-targets': 7.23.6 '@babel/helper-plugin-utils': 7.24.0 - '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.24.3) - '@babel/plugin-transform-parameters': 7.24.1(@babel/core@7.24.3) + '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.24.4) + '@babel/plugin-transform-parameters': 7.24.1(@babel/core@7.24.4) dev: false - /@babel/plugin-transform-object-super@7.24.1(@babel/core@7.24.3): + /@babel/plugin-transform-object-super@7.24.1(@babel/core@7.24.4): resolution: {integrity: sha512-oKJqR3TeI5hSLRxudMjFQ9re9fBVUU0GICqM3J1mi8MqlhVr6hC/ZN4ttAyMuQR6EZZIY6h/exe5swqGNNIkWQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.3 + '@babel/core': 7.24.4 '@babel/helper-plugin-utils': 7.24.0 - '@babel/helper-replace-supers': 7.24.1(@babel/core@7.24.3) + '@babel/helper-replace-supers': 7.24.1(@babel/core@7.24.4) dev: false - /@babel/plugin-transform-optional-catch-binding@7.24.1(@babel/core@7.24.3): + /@babel/plugin-transform-optional-catch-binding@7.24.1(@babel/core@7.24.4): resolution: {integrity: sha512-oBTH7oURV4Y+3EUrf6cWn1OHio3qG/PVwO5J03iSJmBg6m2EhKjkAu/xuaXaYwWW9miYtvbWv4LNf0AmR43LUA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.3 + '@babel/core': 7.24.4 '@babel/helper-plugin-utils': 7.24.0 - '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.24.3) + '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.24.4) dev: false - /@babel/plugin-transform-optional-chaining@7.24.1(@babel/core@7.24.3): + /@babel/plugin-transform-optional-chaining@7.24.1(@babel/core@7.24.4): resolution: {integrity: sha512-n03wmDt+987qXwAgcBlnUUivrZBPZ8z1plL0YvgQalLm+ZE5BMhGm94jhxXtA1wzv1Cu2aaOv1BM9vbVttrzSg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.3 + '@babel/core': 7.24.4 '@babel/helper-plugin-utils': 7.24.0 '@babel/helper-skip-transparent-expression-wrappers': 7.22.5 - '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.24.3) + '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.24.4) dev: false - /@babel/plugin-transform-parameters@7.24.1(@babel/core@7.24.3): + /@babel/plugin-transform-parameters@7.24.1(@babel/core@7.24.4): resolution: {integrity: sha512-8Jl6V24g+Uw5OGPeWNKrKqXPDw2YDjLc53ojwfMcKwlEoETKU9rU0mHUtcg9JntWI/QYzGAXNWEcVHZ+fR+XXg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.3 + '@babel/core': 7.24.4 '@babel/helper-plugin-utils': 7.24.0 dev: false - /@babel/plugin-transform-private-methods@7.24.1(@babel/core@7.24.3): + /@babel/plugin-transform-private-methods@7.24.1(@babel/core@7.24.4): resolution: {integrity: sha512-tGvisebwBO5em4PaYNqt4fkw56K2VALsAbAakY0FjTYqJp7gfdrgr7YX76Or8/cpik0W6+tj3rZ0uHU9Oil4tw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.3 - '@babel/helper-create-class-features-plugin': 7.24.1(@babel/core@7.24.3) + '@babel/core': 7.24.4 + '@babel/helper-create-class-features-plugin': 7.24.4(@babel/core@7.24.4) '@babel/helper-plugin-utils': 7.24.0 - /@babel/plugin-transform-private-property-in-object@7.24.1(@babel/core@7.24.3): + /@babel/plugin-transform-private-property-in-object@7.24.1(@babel/core@7.24.4): resolution: {integrity: sha512-pTHxDVa0BpUbvAgX3Gat+7cSciXqUcY9j2VZKTbSB6+VQGpNgNO9ailxTGHSXlqOnX1Hcx1Enme2+yv7VqP9bg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.3 + '@babel/core': 7.24.4 '@babel/helper-annotate-as-pure': 7.22.5 - '@babel/helper-create-class-features-plugin': 7.24.1(@babel/core@7.24.3) + '@babel/helper-create-class-features-plugin': 7.24.4(@babel/core@7.24.4) '@babel/helper-plugin-utils': 7.24.0 - '@babel/plugin-syntax-private-property-in-object': 7.14.5(@babel/core@7.24.3) + '@babel/plugin-syntax-private-property-in-object': 7.14.5(@babel/core@7.24.4) dev: false - /@babel/plugin-transform-property-literals@7.24.1(@babel/core@7.24.3): + /@babel/plugin-transform-property-literals@7.24.1(@babel/core@7.24.4): resolution: {integrity: sha512-LetvD7CrHmEx0G442gOomRr66d7q8HzzGGr4PMHGr+5YIm6++Yke+jxj246rpvsbyhJwCLxcTn6zW1P1BSenqA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.3 + '@babel/core': 7.24.4 '@babel/helper-plugin-utils': 7.24.0 dev: false - /@babel/plugin-transform-react-display-name@7.24.1(@babel/core@7.24.3): + /@babel/plugin-transform-react-display-name@7.24.1(@babel/core@7.24.4): resolution: {integrity: sha512-mvoQg2f9p2qlpDQRBC7M3c3XTr0k7cp/0+kFKKO/7Gtu0LSw16eKB+Fabe2bDT/UpsyasTBBkAnbdsLrkD5XMw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.3 + '@babel/core': 7.24.4 '@babel/helper-plugin-utils': 7.24.0 dev: false - /@babel/plugin-transform-react-jsx-self@7.24.1(@babel/core@7.24.3): + /@babel/plugin-transform-react-jsx-self@7.24.1(@babel/core@7.24.4): resolution: {integrity: sha512-kDJgnPujTmAZ/9q2CN4m2/lRsUUPDvsG3+tSHWUJIzMGTt5U/b/fwWd3RO3n+5mjLrsBrVa5eKFRVSQbi3dF1w==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.3 + '@babel/core': 7.24.4 '@babel/helper-plugin-utils': 7.24.0 dev: false - /@babel/plugin-transform-react-jsx-source@7.24.1(@babel/core@7.24.3): + /@babel/plugin-transform-react-jsx-source@7.24.1(@babel/core@7.24.4): resolution: {integrity: sha512-1v202n7aUq4uXAieRTKcwPzNyphlCuqHHDcdSNc+vdhoTEZcFMh+L5yZuCmGaIO7bs1nJUNfHB89TZyoL48xNA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.3 + '@babel/core': 7.24.4 '@babel/helper-plugin-utils': 7.24.0 dev: false - /@babel/plugin-transform-react-jsx@7.23.4(@babel/core@7.24.3): + /@babel/plugin-transform-react-jsx@7.23.4(@babel/core@7.24.4): resolution: {integrity: sha512-5xOpoPguCZCRbo/JeHlloSkTA8Bld1J/E1/kLfD1nsuiW1m8tduTA1ERCgIZokDflX/IBzKcqR3l7VlRgiIfHA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.3 + '@babel/core': 7.24.4 '@babel/helper-annotate-as-pure': 7.22.5 '@babel/helper-module-imports': 7.24.3 '@babel/helper-plugin-utils': 7.24.0 - '@babel/plugin-syntax-jsx': 7.24.1(@babel/core@7.24.3) + '@babel/plugin-syntax-jsx': 7.24.1(@babel/core@7.24.4) '@babel/types': 7.24.0 dev: false - /@babel/plugin-transform-regenerator@7.24.1(@babel/core@7.24.3): + /@babel/plugin-transform-regenerator@7.24.1(@babel/core@7.24.4): resolution: {integrity: sha512-sJwZBCzIBE4t+5Q4IGLaaun5ExVMRY0lYwos/jNecjMrVCygCdph3IKv0tkP5Fc87e/1+bebAmEAGBfnRD+cnw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.3 + '@babel/core': 7.24.4 '@babel/helper-plugin-utils': 7.24.0 regenerator-transform: 0.15.2 dev: false - /@babel/plugin-transform-reserved-words@7.24.1(@babel/core@7.24.3): + /@babel/plugin-transform-reserved-words@7.24.1(@babel/core@7.24.4): resolution: {integrity: sha512-JAclqStUfIwKN15HrsQADFgeZt+wexNQ0uLhuqvqAUFoqPMjEcFCYZBhq0LUdz6dZK/mD+rErhW71fbx8RYElg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.3 + '@babel/core': 7.24.4 '@babel/helper-plugin-utils': 7.24.0 dev: false - /@babel/plugin-transform-runtime@7.24.3(@babel/core@7.24.3): + /@babel/plugin-transform-runtime@7.24.3(@babel/core@7.24.4): resolution: {integrity: sha512-J0BuRPNlNqlMTRJ72eVptpt9VcInbxO6iP3jaxr+1NPhC0UkKL+6oeX6VXMEYdADnuqmMmsBspt4d5w8Y/TCbQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.3 + '@babel/core': 7.24.4 '@babel/helper-module-imports': 7.24.3 '@babel/helper-plugin-utils': 7.24.0 - babel-plugin-polyfill-corejs2: 0.4.10(@babel/core@7.24.3) - babel-plugin-polyfill-corejs3: 0.10.4(@babel/core@7.24.3) - babel-plugin-polyfill-regenerator: 0.6.1(@babel/core@7.24.3) + babel-plugin-polyfill-corejs2: 0.4.10(@babel/core@7.24.4) + babel-plugin-polyfill-corejs3: 0.10.4(@babel/core@7.24.4) + babel-plugin-polyfill-regenerator: 0.6.1(@babel/core@7.24.4) semver: 6.3.1 transitivePeerDependencies: - supports-color dev: false - /@babel/plugin-transform-shorthand-properties@7.24.1(@babel/core@7.24.3): + /@babel/plugin-transform-shorthand-properties@7.24.1(@babel/core@7.24.4): resolution: {integrity: sha512-LyjVB1nsJ6gTTUKRjRWx9C1s9hE7dLfP/knKdrfeH9UPtAGjYGgxIbFfx7xyLIEWs7Xe1Gnf8EWiUqfjLhInZA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.3 + '@babel/core': 7.24.4 '@babel/helper-plugin-utils': 7.24.0 dev: false - /@babel/plugin-transform-spread@7.24.1(@babel/core@7.24.3): + /@babel/plugin-transform-spread@7.24.1(@babel/core@7.24.4): resolution: {integrity: sha512-KjmcIM+fxgY+KxPVbjelJC6hrH1CgtPmTvdXAfn3/a9CnWGSTY7nH4zm5+cjmWJybdcPSsD0++QssDsjcpe47g==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.3 + '@babel/core': 7.24.4 '@babel/helper-plugin-utils': 7.24.0 '@babel/helper-skip-transparent-expression-wrappers': 7.22.5 dev: false - /@babel/plugin-transform-sticky-regex@7.24.1(@babel/core@7.24.3): + /@babel/plugin-transform-sticky-regex@7.24.1(@babel/core@7.24.4): resolution: {integrity: sha512-9v0f1bRXgPVcPrngOQvLXeGNNVLc8UjMVfebo9ka0WF3/7+aVUHmaJVT3sa0XCzEFioPfPHZiOcYG9qOsH63cw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.3 + '@babel/core': 7.24.4 '@babel/helper-plugin-utils': 7.24.0 dev: false - /@babel/plugin-transform-template-literals@7.24.1(@babel/core@7.24.3): + /@babel/plugin-transform-template-literals@7.24.1(@babel/core@7.24.4): resolution: {integrity: sha512-WRkhROsNzriarqECASCNu/nojeXCDTE/F2HmRgOzi7NGvyfYGq1NEjKBK3ckLfRgGc6/lPAqP0vDOSw3YtG34g==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.3 + '@babel/core': 7.24.4 '@babel/helper-plugin-utils': 7.24.0 dev: false - /@babel/plugin-transform-typeof-symbol@7.24.1(@babel/core@7.24.3): + /@babel/plugin-transform-typeof-symbol@7.24.1(@babel/core@7.24.4): resolution: {integrity: sha512-CBfU4l/A+KruSUoW+vTQthwcAdwuqbpRNB8HQKlZABwHRhsdHZ9fezp4Sn18PeAlYxTNiLMlx4xUBV3AWfg1BA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.3 + '@babel/core': 7.24.4 '@babel/helper-plugin-utils': 7.24.0 dev: false - /@babel/plugin-transform-typescript@7.24.1(@babel/core@7.24.3): - resolution: {integrity: sha512-liYSESjX2fZ7JyBFkYG78nfvHlMKE6IpNdTVnxmlYUR+j5ZLsitFbaAE+eJSK2zPPkNWNw4mXL51rQ8WrvdK0w==} + /@babel/plugin-transform-typescript@7.24.4(@babel/core@7.24.4): + resolution: {integrity: sha512-79t3CQ8+oBGk/80SQ8MN3Bs3obf83zJ0YZjDmDaEZN8MqhMI760apl5z6a20kFeMXBwJX99VpKT8CKxEBp5H1g==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.3 + '@babel/core': 7.24.4 '@babel/helper-annotate-as-pure': 7.22.5 - '@babel/helper-create-class-features-plugin': 7.24.1(@babel/core@7.24.3) + '@babel/helper-create-class-features-plugin': 7.24.4(@babel/core@7.24.4) '@babel/helper-plugin-utils': 7.24.0 - '@babel/plugin-syntax-typescript': 7.24.1(@babel/core@7.24.3) + '@babel/plugin-syntax-typescript': 7.24.1(@babel/core@7.24.4) dev: false - /@babel/plugin-transform-unicode-escapes@7.24.1(@babel/core@7.24.3): + /@babel/plugin-transform-unicode-escapes@7.24.1(@babel/core@7.24.4): resolution: {integrity: sha512-RlkVIcWT4TLI96zM660S877E7beKlQw7Ig+wqkKBiWfj0zH5Q4h50q6er4wzZKRNSYpfo6ILJ+hrJAGSX2qcNw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.3 + '@babel/core': 7.24.4 '@babel/helper-plugin-utils': 7.24.0 dev: false - /@babel/plugin-transform-unicode-property-regex@7.24.1(@babel/core@7.24.3): + /@babel/plugin-transform-unicode-property-regex@7.24.1(@babel/core@7.24.4): resolution: {integrity: sha512-Ss4VvlfYV5huWApFsF8/Sq0oXnGO+jB+rijFEFugTd3cwSObUSnUi88djgR5528Csl0uKlrI331kRqe56Ov2Ng==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.3 - '@babel/helper-create-regexp-features-plugin': 7.22.15(@babel/core@7.24.3) + '@babel/core': 7.24.4 + '@babel/helper-create-regexp-features-plugin': 7.22.15(@babel/core@7.24.4) '@babel/helper-plugin-utils': 7.24.0 dev: false - /@babel/plugin-transform-unicode-regex@7.24.1(@babel/core@7.24.3): + /@babel/plugin-transform-unicode-regex@7.24.1(@babel/core@7.24.4): resolution: {integrity: sha512-2A/94wgZgxfTsiLaQ2E36XAOdcZmGAaEEgVmxQWwZXWkGhvoHbaqXcKnU8zny4ycpu3vNqg0L/PcCiYtHtA13g==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.3 - '@babel/helper-create-regexp-features-plugin': 7.22.15(@babel/core@7.24.3) + '@babel/core': 7.24.4 + '@babel/helper-create-regexp-features-plugin': 7.22.15(@babel/core@7.24.4) '@babel/helper-plugin-utils': 7.24.0 dev: false - /@babel/plugin-transform-unicode-sets-regex@7.24.1(@babel/core@7.24.3): + /@babel/plugin-transform-unicode-sets-regex@7.24.1(@babel/core@7.24.4): resolution: {integrity: sha512-fqj4WuzzS+ukpgerpAoOnMfQXwUHFxXUZUE84oL2Kao2N8uSlvcpnAidKASgsNgzZHBsHWvcm8s9FPWUhAb8fA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 dependencies: - '@babel/core': 7.24.3 - '@babel/helper-create-regexp-features-plugin': 7.22.15(@babel/core@7.24.3) + '@babel/core': 7.24.4 + '@babel/helper-create-regexp-features-plugin': 7.22.15(@babel/core@7.24.4) '@babel/helper-plugin-utils': 7.24.0 dev: false - /@babel/preset-env@7.24.3(@babel/core@7.24.3): - resolution: {integrity: sha512-fSk430k5c2ff8536JcPvPWK4tZDwehWLGlBp0wrsBUjZVdeQV6lePbwKWZaZfK2vnh/1kQX1PzAJWsnBmVgGJA==} + /@babel/preset-env@7.24.4(@babel/core@7.24.4): + resolution: {integrity: sha512-7Kl6cSmYkak0FK/FXjSEnLJ1N9T/WA2RkMhu17gZ/dsxKJUuTYNIylahPTzqpLyJN4WhDif8X0XK1R8Wsguo/A==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/compat-data': 7.24.1 - '@babel/core': 7.24.3 + '@babel/compat-data': 7.24.4 + '@babel/core': 7.24.4 '@babel/helper-compilation-targets': 7.23.6 '@babel/helper-plugin-utils': 7.24.0 '@babel/helper-validator-option': 7.23.5 - '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression': 7.24.1(@babel/core@7.24.3) - '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining': 7.24.1(@babel/core@7.24.3) - '@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly': 7.24.1(@babel/core@7.24.3) - '@babel/plugin-proposal-private-property-in-object': 7.21.0-placeholder-for-preset-env.2(@babel/core@7.24.3) - '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.24.3) - '@babel/plugin-syntax-class-properties': 7.12.13(@babel/core@7.24.3) - '@babel/plugin-syntax-class-static-block': 7.14.5(@babel/core@7.24.3) - '@babel/plugin-syntax-dynamic-import': 7.8.3(@babel/core@7.24.3) - '@babel/plugin-syntax-export-namespace-from': 7.8.3(@babel/core@7.24.3) - '@babel/plugin-syntax-import-assertions': 7.24.1(@babel/core@7.24.3) - '@babel/plugin-syntax-import-attributes': 7.24.1(@babel/core@7.24.3) - '@babel/plugin-syntax-import-meta': 7.10.4(@babel/core@7.24.3) - '@babel/plugin-syntax-json-strings': 7.8.3(@babel/core@7.24.3) - '@babel/plugin-syntax-logical-assignment-operators': 7.10.4(@babel/core@7.24.3) - '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.24.3) - '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.24.3) - '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.24.3) - '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.24.3) - '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.24.3) - '@babel/plugin-syntax-private-property-in-object': 7.14.5(@babel/core@7.24.3) - '@babel/plugin-syntax-top-level-await': 7.14.5(@babel/core@7.24.3) - '@babel/plugin-syntax-unicode-sets-regex': 7.18.6(@babel/core@7.24.3) - '@babel/plugin-transform-arrow-functions': 7.24.1(@babel/core@7.24.3) - '@babel/plugin-transform-async-generator-functions': 7.24.3(@babel/core@7.24.3) - '@babel/plugin-transform-async-to-generator': 7.24.1(@babel/core@7.24.3) - '@babel/plugin-transform-block-scoped-functions': 7.24.1(@babel/core@7.24.3) - '@babel/plugin-transform-block-scoping': 7.24.1(@babel/core@7.24.3) - '@babel/plugin-transform-class-properties': 7.24.1(@babel/core@7.24.3) - '@babel/plugin-transform-class-static-block': 7.24.1(@babel/core@7.24.3) - '@babel/plugin-transform-classes': 7.24.1(@babel/core@7.24.3) - '@babel/plugin-transform-computed-properties': 7.24.1(@babel/core@7.24.3) - '@babel/plugin-transform-destructuring': 7.24.1(@babel/core@7.24.3) - '@babel/plugin-transform-dotall-regex': 7.24.1(@babel/core@7.24.3) - '@babel/plugin-transform-duplicate-keys': 7.24.1(@babel/core@7.24.3) - '@babel/plugin-transform-dynamic-import': 7.24.1(@babel/core@7.24.3) - '@babel/plugin-transform-exponentiation-operator': 7.24.1(@babel/core@7.24.3) - '@babel/plugin-transform-export-namespace-from': 7.24.1(@babel/core@7.24.3) - '@babel/plugin-transform-for-of': 7.24.1(@babel/core@7.24.3) - '@babel/plugin-transform-function-name': 7.24.1(@babel/core@7.24.3) - '@babel/plugin-transform-json-strings': 7.24.1(@babel/core@7.24.3) - '@babel/plugin-transform-literals': 7.24.1(@babel/core@7.24.3) - '@babel/plugin-transform-logical-assignment-operators': 7.24.1(@babel/core@7.24.3) - '@babel/plugin-transform-member-expression-literals': 7.24.1(@babel/core@7.24.3) - '@babel/plugin-transform-modules-amd': 7.24.1(@babel/core@7.24.3) - '@babel/plugin-transform-modules-commonjs': 7.24.1(@babel/core@7.24.3) - '@babel/plugin-transform-modules-systemjs': 7.24.1(@babel/core@7.24.3) - '@babel/plugin-transform-modules-umd': 7.24.1(@babel/core@7.24.3) - '@babel/plugin-transform-named-capturing-groups-regex': 7.22.5(@babel/core@7.24.3) - '@babel/plugin-transform-new-target': 7.24.1(@babel/core@7.24.3) - '@babel/plugin-transform-nullish-coalescing-operator': 7.24.1(@babel/core@7.24.3) - '@babel/plugin-transform-numeric-separator': 7.24.1(@babel/core@7.24.3) - '@babel/plugin-transform-object-rest-spread': 7.24.1(@babel/core@7.24.3) - '@babel/plugin-transform-object-super': 7.24.1(@babel/core@7.24.3) - '@babel/plugin-transform-optional-catch-binding': 7.24.1(@babel/core@7.24.3) - '@babel/plugin-transform-optional-chaining': 7.24.1(@babel/core@7.24.3) - '@babel/plugin-transform-parameters': 7.24.1(@babel/core@7.24.3) - '@babel/plugin-transform-private-methods': 7.24.1(@babel/core@7.24.3) - '@babel/plugin-transform-private-property-in-object': 7.24.1(@babel/core@7.24.3) - '@babel/plugin-transform-property-literals': 7.24.1(@babel/core@7.24.3) - '@babel/plugin-transform-regenerator': 7.24.1(@babel/core@7.24.3) - '@babel/plugin-transform-reserved-words': 7.24.1(@babel/core@7.24.3) - '@babel/plugin-transform-shorthand-properties': 7.24.1(@babel/core@7.24.3) - '@babel/plugin-transform-spread': 7.24.1(@babel/core@7.24.3) - '@babel/plugin-transform-sticky-regex': 7.24.1(@babel/core@7.24.3) - '@babel/plugin-transform-template-literals': 7.24.1(@babel/core@7.24.3) - '@babel/plugin-transform-typeof-symbol': 7.24.1(@babel/core@7.24.3) - '@babel/plugin-transform-unicode-escapes': 7.24.1(@babel/core@7.24.3) - '@babel/plugin-transform-unicode-property-regex': 7.24.1(@babel/core@7.24.3) - '@babel/plugin-transform-unicode-regex': 7.24.1(@babel/core@7.24.3) - '@babel/plugin-transform-unicode-sets-regex': 7.24.1(@babel/core@7.24.3) - '@babel/preset-modules': 0.1.6-no-external-plugins(@babel/core@7.24.3) - babel-plugin-polyfill-corejs2: 0.4.10(@babel/core@7.24.3) - babel-plugin-polyfill-corejs3: 0.10.4(@babel/core@7.24.3) - babel-plugin-polyfill-regenerator: 0.6.1(@babel/core@7.24.3) + '@babel/plugin-bugfix-firefox-class-in-computed-class-key': 7.24.4(@babel/core@7.24.4) + '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression': 7.24.1(@babel/core@7.24.4) + '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining': 7.24.1(@babel/core@7.24.4) + '@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly': 7.24.1(@babel/core@7.24.4) + '@babel/plugin-proposal-private-property-in-object': 7.21.0-placeholder-for-preset-env.2(@babel/core@7.24.4) + '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.24.4) + '@babel/plugin-syntax-class-properties': 7.12.13(@babel/core@7.24.4) + '@babel/plugin-syntax-class-static-block': 7.14.5(@babel/core@7.24.4) + '@babel/plugin-syntax-dynamic-import': 7.8.3(@babel/core@7.24.4) + '@babel/plugin-syntax-export-namespace-from': 7.8.3(@babel/core@7.24.4) + '@babel/plugin-syntax-import-assertions': 7.24.1(@babel/core@7.24.4) + '@babel/plugin-syntax-import-attributes': 7.24.1(@babel/core@7.24.4) + '@babel/plugin-syntax-import-meta': 7.10.4(@babel/core@7.24.4) + '@babel/plugin-syntax-json-strings': 7.8.3(@babel/core@7.24.4) + '@babel/plugin-syntax-logical-assignment-operators': 7.10.4(@babel/core@7.24.4) + '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.24.4) + '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.24.4) + '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.24.4) + '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.24.4) + '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.24.4) + '@babel/plugin-syntax-private-property-in-object': 7.14.5(@babel/core@7.24.4) + '@babel/plugin-syntax-top-level-await': 7.14.5(@babel/core@7.24.4) + '@babel/plugin-syntax-unicode-sets-regex': 7.18.6(@babel/core@7.24.4) + '@babel/plugin-transform-arrow-functions': 7.24.1(@babel/core@7.24.4) + '@babel/plugin-transform-async-generator-functions': 7.24.3(@babel/core@7.24.4) + '@babel/plugin-transform-async-to-generator': 7.24.1(@babel/core@7.24.4) + '@babel/plugin-transform-block-scoped-functions': 7.24.1(@babel/core@7.24.4) + '@babel/plugin-transform-block-scoping': 7.24.4(@babel/core@7.24.4) + '@babel/plugin-transform-class-properties': 7.24.1(@babel/core@7.24.4) + '@babel/plugin-transform-class-static-block': 7.24.4(@babel/core@7.24.4) + '@babel/plugin-transform-classes': 7.24.1(@babel/core@7.24.4) + '@babel/plugin-transform-computed-properties': 7.24.1(@babel/core@7.24.4) + '@babel/plugin-transform-destructuring': 7.24.1(@babel/core@7.24.4) + '@babel/plugin-transform-dotall-regex': 7.24.1(@babel/core@7.24.4) + '@babel/plugin-transform-duplicate-keys': 7.24.1(@babel/core@7.24.4) + '@babel/plugin-transform-dynamic-import': 7.24.1(@babel/core@7.24.4) + '@babel/plugin-transform-exponentiation-operator': 7.24.1(@babel/core@7.24.4) + '@babel/plugin-transform-export-namespace-from': 7.24.1(@babel/core@7.24.4) + '@babel/plugin-transform-for-of': 7.24.1(@babel/core@7.24.4) + '@babel/plugin-transform-function-name': 7.24.1(@babel/core@7.24.4) + '@babel/plugin-transform-json-strings': 7.24.1(@babel/core@7.24.4) + '@babel/plugin-transform-literals': 7.24.1(@babel/core@7.24.4) + '@babel/plugin-transform-logical-assignment-operators': 7.24.1(@babel/core@7.24.4) + '@babel/plugin-transform-member-expression-literals': 7.24.1(@babel/core@7.24.4) + '@babel/plugin-transform-modules-amd': 7.24.1(@babel/core@7.24.4) + '@babel/plugin-transform-modules-commonjs': 7.24.1(@babel/core@7.24.4) + '@babel/plugin-transform-modules-systemjs': 7.24.1(@babel/core@7.24.4) + '@babel/plugin-transform-modules-umd': 7.24.1(@babel/core@7.24.4) + '@babel/plugin-transform-named-capturing-groups-regex': 7.22.5(@babel/core@7.24.4) + '@babel/plugin-transform-new-target': 7.24.1(@babel/core@7.24.4) + '@babel/plugin-transform-nullish-coalescing-operator': 7.24.1(@babel/core@7.24.4) + '@babel/plugin-transform-numeric-separator': 7.24.1(@babel/core@7.24.4) + '@babel/plugin-transform-object-rest-spread': 7.24.1(@babel/core@7.24.4) + '@babel/plugin-transform-object-super': 7.24.1(@babel/core@7.24.4) + '@babel/plugin-transform-optional-catch-binding': 7.24.1(@babel/core@7.24.4) + '@babel/plugin-transform-optional-chaining': 7.24.1(@babel/core@7.24.4) + '@babel/plugin-transform-parameters': 7.24.1(@babel/core@7.24.4) + '@babel/plugin-transform-private-methods': 7.24.1(@babel/core@7.24.4) + '@babel/plugin-transform-private-property-in-object': 7.24.1(@babel/core@7.24.4) + '@babel/plugin-transform-property-literals': 7.24.1(@babel/core@7.24.4) + '@babel/plugin-transform-regenerator': 7.24.1(@babel/core@7.24.4) + '@babel/plugin-transform-reserved-words': 7.24.1(@babel/core@7.24.4) + '@babel/plugin-transform-shorthand-properties': 7.24.1(@babel/core@7.24.4) + '@babel/plugin-transform-spread': 7.24.1(@babel/core@7.24.4) + '@babel/plugin-transform-sticky-regex': 7.24.1(@babel/core@7.24.4) + '@babel/plugin-transform-template-literals': 7.24.1(@babel/core@7.24.4) + '@babel/plugin-transform-typeof-symbol': 7.24.1(@babel/core@7.24.4) + '@babel/plugin-transform-unicode-escapes': 7.24.1(@babel/core@7.24.4) + '@babel/plugin-transform-unicode-property-regex': 7.24.1(@babel/core@7.24.4) + '@babel/plugin-transform-unicode-regex': 7.24.1(@babel/core@7.24.4) + '@babel/plugin-transform-unicode-sets-regex': 7.24.1(@babel/core@7.24.4) + '@babel/preset-modules': 0.1.6-no-external-plugins(@babel/core@7.24.4) + babel-plugin-polyfill-corejs2: 0.4.10(@babel/core@7.24.4) + babel-plugin-polyfill-corejs3: 0.10.4(@babel/core@7.24.4) + babel-plugin-polyfill-regenerator: 0.6.1(@babel/core@7.24.4) core-js-compat: 3.36.1 semver: 6.3.1 transitivePeerDependencies: - supports-color dev: false - /@babel/preset-flow@7.24.1(@babel/core@7.24.3): + /@babel/preset-flow@7.24.1(@babel/core@7.24.4): resolution: {integrity: sha512-sWCV2G9pcqZf+JHyv/RyqEIpFypxdCSxWIxQjpdaQxenNog7cN1pr76hg8u0Fz8Qgg0H4ETkGcJnXL8d4j0PPA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.3 + '@babel/core': 7.24.4 '@babel/helper-plugin-utils': 7.24.0 '@babel/helper-validator-option': 7.23.5 - '@babel/plugin-transform-flow-strip-types': 7.24.1(@babel/core@7.24.3) + '@babel/plugin-transform-flow-strip-types': 7.24.1(@babel/core@7.24.4) dev: false - /@babel/preset-modules@0.1.6-no-external-plugins(@babel/core@7.24.3): + /@babel/preset-modules@0.1.6-no-external-plugins(@babel/core@7.24.4): resolution: {integrity: sha512-HrcgcIESLm9aIR842yhJ5RWan/gebQUJ6E/E5+rf0y9o6oj7w0Br+sWuL6kEQ/o/AdfvR1Je9jG18/gnpwjEyA==} peerDependencies: '@babel/core': ^7.0.0-0 || ^8.0.0-0 <8.0.0 dependencies: - '@babel/core': 7.24.3 + '@babel/core': 7.24.4 '@babel/helper-plugin-utils': 7.24.0 '@babel/types': 7.24.0 esutils: 2.0.3 dev: false - /@babel/preset-typescript@7.24.1(@babel/core@7.24.3): + /@babel/preset-typescript@7.24.1(@babel/core@7.24.4): resolution: {integrity: sha512-1DBaMmRDpuYQBPWD8Pf/WEwCrtgRHxsZnP4mIy9G/X+hFfbI47Q2G4t1Paakld84+qsk2fSsUPMKg71jkoOOaQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.3 + '@babel/core': 7.24.4 '@babel/helper-plugin-utils': 7.24.0 '@babel/helper-validator-option': 7.23.5 - '@babel/plugin-syntax-jsx': 7.24.1(@babel/core@7.24.3) - '@babel/plugin-transform-modules-commonjs': 7.24.1(@babel/core@7.24.3) - '@babel/plugin-transform-typescript': 7.24.1(@babel/core@7.24.3) + '@babel/plugin-syntax-jsx': 7.24.1(@babel/core@7.24.4) + '@babel/plugin-transform-modules-commonjs': 7.24.1(@babel/core@7.24.4) + '@babel/plugin-transform-typescript': 7.24.4(@babel/core@7.24.4) dev: false - /@babel/register@7.23.7(@babel/core@7.24.3): + /@babel/register@7.23.7(@babel/core@7.24.4): resolution: {integrity: sha512-EjJeB6+kvpk+Y5DAkEAmbOBEFkh9OASx0huoEkqYTFxAZHzOAX2Oh5uwAUuL2rUddqfM0SA+KPXV2TbzoZ2kvQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.3 + '@babel/core': 7.24.4 clone-deep: 4.0.1 find-cache-dir: 2.1.0 make-dir: 2.1.0 @@ -1537,15 +1583,8 @@ packages: resolution: {integrity: sha512-x/rqGMdzj+fWZvCOYForTghzbtqPDZ5gPwaoNGHdgDfF2QA/XZbCBp4Moo5scrkAMPhB7z26XM/AaHuIJdgauA==} dev: false - /@babel/runtime@7.23.9: - resolution: {integrity: sha512-0CX6F+BI2s9dkUqr08KFrAIZgNFj75rdBU/DjCyYLIaV/quFjkk6T+EJ2LkZHyZTbEV4L5p97mNkUsHl2wLFAw==} - engines: {node: '>=6.9.0'} - dependencies: - regenerator-runtime: 0.14.1 - dev: true - - /@babel/runtime@7.24.1: - resolution: {integrity: sha512-+BIznRzyqBf+2wCTxcKE3wDjfGeCoVE61KSHGpkzqrLi8qxqFwBeUFyId2cxkTmm55fzDGnm0+yCxaxygrLUnQ==} + /@babel/runtime@7.24.4: + resolution: {integrity: sha512-dkxf7+hn8mFBwKjs9bvBlArzLVxVbS8usaPUDd5p2a9JCL9tB8OaOVN1isD4+Xyk4ns89/xeOmbQvgdK7IIVdA==} engines: {node: '>=6.9.0'} dependencies: regenerator-runtime: 0.14.1 @@ -1554,58 +1593,32 @@ packages: resolution: {integrity: sha512-Bkf2q8lMB0AFpX0NFEqSbx1OkTHf0f+0j82mkw+ZpzBnkk7e9Ql0891vlfgi+kHwOk8tQjiQHpqh4LaSa0fKEA==} engines: {node: '>=6.9.0'} dependencies: - '@babel/code-frame': 7.23.5 - '@babel/parser': 7.24.0 - '@babel/types': 7.24.0 - - /@babel/traverse@7.24.0(supports-color@5.5.0): - resolution: {integrity: sha512-HfuJlI8qq3dEDmNU5ChzzpZRWq+oxCZQyMzIMEqLho+AQnhMnKQUzH6ydo3RBl/YjPCuk68Y6s0Gx0AeyULiWw==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/code-frame': 7.23.5 - '@babel/generator': 7.23.6 - '@babel/helper-environment-visitor': 7.22.20 - '@babel/helper-function-name': 7.23.0 - '@babel/helper-hoist-variables': 7.22.5 - '@babel/helper-split-export-declaration': 7.22.6 - '@babel/parser': 7.24.0 + '@babel/code-frame': 7.24.2 + '@babel/parser': 7.24.4 '@babel/types': 7.24.0 - debug: 4.3.4(supports-color@5.5.0) - globals: 11.12.0 - transitivePeerDependencies: - - supports-color - dev: false - /@babel/traverse@7.24.1: + /@babel/traverse@7.24.1(supports-color@5.5.0): resolution: {integrity: sha512-xuU6o9m68KeqZbQuDt2TcKSxUw/mrsvavlEqQ1leZ/B+C9tk6E4sRWy97WaXgvq5E+nU3cXMxv3WKOCanVMCmQ==} engines: {node: '>=6.9.0'} dependencies: '@babel/code-frame': 7.24.2 - '@babel/generator': 7.24.1 + '@babel/generator': 7.24.4 '@babel/helper-environment-visitor': 7.22.20 '@babel/helper-function-name': 7.23.0 '@babel/helper-hoist-variables': 7.22.5 '@babel/helper-split-export-declaration': 7.22.6 - '@babel/parser': 7.24.1 + '@babel/parser': 7.24.4 '@babel/types': 7.24.0 debug: 4.3.4(supports-color@5.5.0) globals: 11.12.0 transitivePeerDependencies: - supports-color - /@babel/types@7.23.9: - resolution: {integrity: sha512-dQjSq/7HaSjRM43FFGnv5keM2HsxpmyV1PfaSVm0nzzjwwTmjOe6J4bC8e3+pTEIgHaHj+1ZlLThRJ2auc/w1Q==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/helper-string-parser': 7.23.4 - '@babel/helper-validator-identifier': 7.22.20 - to-fast-properties: 2.0.0 - /@babel/types@7.24.0: resolution: {integrity: sha512-+j7a5c253RfKh8iABBhywc8NSfP5LURe7Uh4qpsh6jc+aLJguvmIUBdjSdEMQv2bENrCR5MfRdjGo7vzS/ob7w==} engines: {node: '>=6.9.0'} dependencies: - '@babel/helper-string-parser': 7.23.4 + '@babel/helper-string-parser': 7.24.1 '@babel/helper-validator-identifier': 7.22.20 to-fast-properties: 2.0.0 @@ -1636,7 +1649,7 @@ packages: eth-json-rpc-filters: 6.0.1 eventemitter3: 5.0.1 keccak: 3.0.4 - preact: 10.20.0 + preact: 10.20.1 sha.js: 2.4.11 transitivePeerDependencies: - supports-color @@ -1655,13 +1668,13 @@ packages: peerDependencies: postcss: ^8.4 dependencies: - '@csstools/selector-specificity': 3.0.2(postcss-selector-parser@6.0.15) + '@csstools/selector-specificity': 3.0.3(postcss-selector-parser@6.0.15) postcss: 8.4.35 postcss-selector-parser: 6.0.15 dev: true - /@csstools/selector-specificity@3.0.2(postcss-selector-parser@6.0.15): - resolution: {integrity: sha512-RpHaZ1h9LE7aALeQXmXrJkRG84ZxIsctEN2biEUmFyKpzFM3zZ35eUMcIzZFsw/2olQE6v69+esEqU2f1MKycg==} + /@csstools/selector-specificity@3.0.3(postcss-selector-parser@6.0.15): + resolution: {integrity: sha512-KEPNw4+WW5AVEIyzC80rTbWEUatTW2lXpN8+8ILC8PiPeWPjwUzrPZDIOZ2wwqDmeqOYTdSGyL3+vE5GC3FB3Q==} engines: {node: ^14 || ^16 || >=18} peerDependencies: postcss-selector-parser: ^6.0.13 @@ -1680,70 +1693,70 @@ packages: which: 4.0.0 dev: true - /@dprint/darwin-arm64@0.45.0: - resolution: {integrity: sha512-pkSSmixIKXr5t32bhXIUbpIBm8F8uhsJcUUvfkFNsRbQvNwRp71ribZpE8dKl0ZFOlAFeWD6WLE8smp/QtiGUA==} + /@dprint/darwin-arm64@0.45.1: + resolution: {integrity: sha512-pH0/uKLJ5SJPoHhOwLWFMhCmL0BY3FzWQbull8OGMK/FRkIPgOl2adZSovtUZpUMGWyDOzIWH1fW9X2DuMhnEg==} cpu: [arm64] os: [darwin] requiresBuild: true - dev: false + dev: true optional: true - /@dprint/darwin-x64@0.45.0: - resolution: {integrity: sha512-PHcXSrRO53KH9N+YPbPtr40NnDo2t7hO7KLMfl2ktRNLjrmKg6F8XDDsr2C7Z11k3jyEEU2Jq8hhpaKHwNapmQ==} + /@dprint/darwin-x64@0.45.1: + resolution: {integrity: sha512-YUj421LmBLDlxpIER3pORKfQmpmXD50n5mClHjpZrnl17WTiHtQ+jHvDJdJoxH2eS66W0mQyxLoGo5SfFfiM7A==} cpu: [x64] os: [darwin] requiresBuild: true - dev: false + dev: true optional: true - /@dprint/linux-arm64-glibc@0.45.0: - resolution: {integrity: sha512-NgIpvZHpiQaY4DxSygxknxBtvKE2KLK9dEbUNKNE098yTHhGq7ouPsoM7RtsO34RHJ3tEZLLJEuBHn20XP8LMg==} + /@dprint/linux-arm64-glibc@0.45.1: + resolution: {integrity: sha512-lJ7s/pOQWRJ0mstjZQnVyX2/3QRXZ9cpFHJDZ7e81Y8QSn/iqxTrnK0DPgxUrDG8hYKQmWQdQLU4sP5DKBz0Jg==} cpu: [arm64] os: [linux] requiresBuild: true - dev: false + dev: true optional: true - /@dprint/linux-arm64-musl@0.45.0: - resolution: {integrity: sha512-Y8p+FC0RNyKCGQjy99Uh1LSPrlQtUTvo4brdvU1THF3pyWu6Bg1p6NiP5a6SjE/6t9CMKZJz39zPreQtnDkSDA==} + /@dprint/linux-arm64-musl@0.45.1: + resolution: {integrity: sha512-un2awe1L1sAJLsCPSEUrE0/cgupdzbYFoyBOutyU1zHR9KQn47AtIDw+chvuinU4xleHDuEGyXGuJ6NE+Ky6vw==} cpu: [arm64] os: [linux] requiresBuild: true - dev: false + dev: true optional: true - /@dprint/linux-x64-glibc@0.45.0: - resolution: {integrity: sha512-u03NCZIpJhE5gIl9Q7jNL4sOPBFd/8BLVBiuLoLtbiTZQ+NNudHKgGNATJBU67q1MKpqKnt8/gQm139cJkHhrw==} + /@dprint/linux-x64-glibc@0.45.1: + resolution: {integrity: sha512-5Civht90S/g8zlyYB7n4oH78p+sLbNqeFCFuImJRK7uRxZwCRya7lji6RwlB6DQ7qngVqovTHj9RLOYfZzfVlg==} cpu: [x64] os: [linux] requiresBuild: true - dev: false + dev: true optional: true - /@dprint/linux-x64-musl@0.45.0: - resolution: {integrity: sha512-DQN8LPtxismkeU1X+sQywa80kWwCBcpQh9fXoJcvTEHrgzHBqbG2SEsUZpM12oKEua1KE/iBh+vgZ+4I3TdI2A==} + /@dprint/linux-x64-musl@0.45.1: + resolution: {integrity: sha512-p2/gjnHDd8GRCvtey5HZO4o/He6pSmY/zpcCuIXprFW9P0vNlEj3DFhz4FPpOKXM+csrsVWWs2E0T/xr5QZtVg==} cpu: [x64] os: [linux] requiresBuild: true - dev: false + dev: true optional: true - /@dprint/win32-x64@0.45.0: - resolution: {integrity: sha512-aZHIWG2jIlEp4BER1QG6YYqPd6TxT9S77AeUkWJixNiMEo+33mPRVCBcugRWI/WJWveX8yWFVXkToORtnSFeEA==} + /@dprint/win32-x64@0.45.1: + resolution: {integrity: sha512-2l78XM7KsW46P2Yv6uPB3fE+y92EsBlrCxi+RVQ0pbznPFdMdkLyGgaCuh683zdld14jHlaADpIQ7YchGAEMAg==} cpu: [x64] os: [win32] requiresBuild: true - dev: false + dev: true optional: true /@emotion/babel-plugin@11.11.0: resolution: {integrity: sha512-m4HEDZleaaCH+XgDDsPF15Ht6wTLsgDTeR3WYj9Q/k76JtWhrJjcP4+/XlG8LGT/Rol9qUfOIztXeA84ATpqPQ==} dependencies: '@babel/helper-module-imports': 7.24.3 - '@babel/runtime': 7.24.1 + '@babel/runtime': 7.24.4 '@emotion/hash': 0.9.1 '@emotion/memoize': 0.8.1 - '@emotion/serialize': 1.1.3 + '@emotion/serialize': 1.1.4 babel-plugin-macros: 3.1.0 convert-source-map: 1.9.0 escape-string-regexp: 4.0.0 @@ -1790,7 +1803,7 @@ packages: resolution: {integrity: sha512-W2P2c/VRW1/1tLox0mVUalvnWXxavmv/Oum2aPsRcoDJuob75FC3Y8FbpfLwUegRcxINtGUMPq0tFCvYNTBXNA==} dev: false - /@emotion/react@11.11.4(@types/react@18.2.68)(react@18.2.0): + /@emotion/react@11.11.4(@types/react@18.2.75)(react@18.2.0): resolution: {integrity: sha512-t8AjMlF0gHpvvxk5mAtCqR4vmxiGHCeJBaQO6gncUSdklELOgtwjerNY2yuJNfwnc6vi16U/+uMF+afIawJ9iw==} peerDependencies: '@types/react': '*' @@ -1799,20 +1812,20 @@ packages: '@types/react': optional: true dependencies: - '@babel/runtime': 7.24.1 + '@babel/runtime': 7.24.4 '@emotion/babel-plugin': 11.11.0 '@emotion/cache': 11.11.0 - '@emotion/serialize': 1.1.3 + '@emotion/serialize': 1.1.4 '@emotion/use-insertion-effect-with-fallbacks': 1.0.1(react@18.2.0) '@emotion/utils': 1.2.1 '@emotion/weak-memoize': 0.3.1 - '@types/react': 18.2.68 + '@types/react': 18.2.75 hoist-non-react-statics: 3.3.2 react: 18.2.0 dev: false - /@emotion/serialize@1.1.3: - resolution: {integrity: sha512-iD4D6QVZFDhcbH0RAG1uVu1CwVLMWUkCvAqqlewO/rxf8+87yIBAlt4+AxMiiKPLs5hFc0owNk/sLLAOROw3cA==} + /@emotion/serialize@1.1.4: + resolution: {integrity: sha512-RIN04MBT8g+FnDwgvIUi8czvr1LU1alUMI05LekWB5DGyTm8cCBMCRpq3GqaiyEDRptEXOyXnvZ58GZYu4kBxQ==} dependencies: '@emotion/hash': 0.9.1 '@emotion/memoize': 0.8.1 @@ -1825,8 +1838,8 @@ packages: resolution: {integrity: sha512-0QBtGvaqtWi+nx6doRwDdBIzhNdZrXUppvTM4dtZZWEGTXL/XE/yJxLMGlDT1Gt+UHH5IX1n+jkXyytE/av7OA==} dev: false - /@emotion/styled@11.11.0(@emotion/react@11.11.4)(@types/react@18.2.68)(react@18.2.0): - resolution: {integrity: sha512-hM5Nnvu9P3midq5aaXj4I+lnSfNi7Pmd4EWk1fOZ3pxookaQTNew6bp4JaCBYM4HVFZF9g7UjJmsUmC2JlxOng==} + /@emotion/styled@11.11.5(@emotion/react@11.11.4)(@types/react@18.2.75)(react@18.2.0): + resolution: {integrity: sha512-/ZjjnaNKvuMPxcIiUkf/9SHoG4Q196DRl1w82hQ3WCsjo1IUR8uaGWrC6a87CrYAW0Kb/pK7hk8BnLgLRi9KoQ==} peerDependencies: '@emotion/react': ^11.0.0-rc.0 '@types/react': '*' @@ -1835,14 +1848,14 @@ packages: '@types/react': optional: true dependencies: - '@babel/runtime': 7.24.1 + '@babel/runtime': 7.24.4 '@emotion/babel-plugin': 11.11.0 '@emotion/is-prop-valid': 1.2.2 - '@emotion/react': 11.11.4(@types/react@18.2.68)(react@18.2.0) - '@emotion/serialize': 1.1.3 + '@emotion/react': 11.11.4(@types/react@18.2.75)(react@18.2.0) + '@emotion/serialize': 1.1.4 '@emotion/use-insertion-effect-with-fallbacks': 1.0.1(react@18.2.0) '@emotion/utils': 1.2.1 - '@types/react': 18.2.68 + '@types/react': 18.2.75 react: 18.2.0 dev: false @@ -1874,6 +1887,50 @@ packages: resolution: {integrity: sha512-EsBwpc7hBUJWAsNPBmJy4hxWx12v6bshQsldrVmjxJoc3isbxhOrF2IcCpaXxfvq03NwkI7sbsOLXbYuqF/8Ww==} dev: false + /@ensdomains/address-encoder@0.1.9: + resolution: {integrity: sha512-E2d2gP4uxJQnDu2Kfg1tHNspefzbLT8Tyjrm5sEuim32UkU2sm5xL4VXtgc2X33fmPEw9+jUMpGs4veMbf+PYg==} + dependencies: + bech32: 1.1.4 + blakejs: 1.2.1 + bn.js: 4.12.0 + bs58: 4.0.1 + crypto-addr-codec: 0.1.8 + nano-base32: 1.0.1 + ripemd160: 2.0.2 + dev: true + + /@ensdomains/ens@0.4.5: + resolution: {integrity: sha512-JSvpj1iNMFjK6K+uVl4unqMoa9rf5jopb8cya5UGBWz23Nw8hSNT7efgUx4BTlAPAgpNlEioUfeTyQ6J9ZvTVw==} + deprecated: Please use @ensdomains/ens-contracts + dependencies: + bluebird: 3.7.2 + eth-ens-namehash: 2.0.8 + solc: 0.4.26 + testrpc: 0.0.1 + web3-utils: 1.10.4 + dev: true + + /@ensdomains/ensjs@2.1.0: + resolution: {integrity: sha512-GRbGPT8Z/OJMDuxs75U/jUNEC0tbL0aj7/L/QQznGYKm/tiasp+ndLOaoULy9kKJFC0TBByqfFliEHDgoLhyog==} + dependencies: + '@babel/runtime': 7.24.4 + '@ensdomains/address-encoder': 0.1.9 + '@ensdomains/ens': 0.4.5 + '@ensdomains/resolver': 0.2.4 + content-hash: 2.5.2 + eth-ens-namehash: 2.0.8 + ethers: 5.7.2 + js-sha3: 0.8.0 + transitivePeerDependencies: + - bufferutil + - utf-8-validate + dev: true + + /@ensdomains/resolver@0.2.4: + resolution: {integrity: sha512-bvaTH34PMCbv6anRa9I/0zjLJgY4EuznbEMgbV77JBCQ9KNC46rzi0avuxpOfu+xDjPEtSFGqVEOr5GlUSGudA==} + deprecated: Please use @ensdomains/ens-contracts + dev: true + /@esbuild/aix-ppc64@0.19.12: resolution: {integrity: sha512-bmoCYyWdEL3wDQIVbcyzRyeKLgk2WtWLTWz1ZIAZF/EGbNOwSA6ew3PftJ1PqMiOOGu0OyFMzG53L0zqIpPeNA==} engines: {node: '>=12'} @@ -2325,6 +2382,20 @@ packages: engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} dev: true + /@ethereumjs/common@2.5.0: + resolution: {integrity: sha512-DEHjW6e38o+JmB/NO3GZBpW4lpaiBpkFgXF6jLcJ6gETBYpEyaA5nTimsWBUJR3Vmtm/didUEbNjajskugZORg==} + dependencies: + crc-32: 1.2.2 + ethereumjs-util: 7.1.5 + dev: true + + /@ethereumjs/common@2.6.5: + resolution: {integrity: sha512-lRyVQOeCDaIVtgfbowla32pzeDv2Obr8oR8Put5RdUBNRGr1VGPGQNGP6elWIpgK3YdpzqTOh4GyUGOureVeeA==} + dependencies: + crc-32: 1.2.2 + ethereumjs-util: 7.1.5 + dev: true + /@ethereumjs/common@3.2.0: resolution: {integrity: sha512-pksvzI0VyLgmuEF2FA/JR/4/y6hcPq8OUail3/AvycBaW1d5VSauOZzqGvJ3RTmR4MU35lWE8KseKOsEhrFRBA==} dependencies: @@ -2336,7 +2407,20 @@ packages: resolution: {integrity: sha512-tqsQiBQDQdmPWE1xkkBq4rlSW5QZpLOUJ5RJh2/9fug+q9tnUhuZoVLk7s0scUIKTOzEtR72DFBXI4WiZcMpvw==} engines: {node: '>=14'} hasBin: true - dev: false + + /@ethereumjs/tx@3.3.2: + resolution: {integrity: sha512-6AaJhwg4ucmwTvw/1qLaZUX5miWrwZ4nLOUsKyb/HtzS3BMw/CasKhdi1ims9mBKeK9sOJCH4qGKOBGyJCeeog==} + dependencies: + '@ethereumjs/common': 2.5.0 + ethereumjs-util: 7.1.5 + dev: true + + /@ethereumjs/tx@3.5.2: + resolution: {integrity: sha512-gQDNJWKrSDGu2w7w0PzVXVBNMzb7wwdDOmOqczmhNjqFxFuIbhVJDwiGEnxFNC2/b8ifcZzY7MLcluizohRzNw==} + dependencies: + '@ethereumjs/common': 2.6.5 + ethereumjs-util: 7.1.5 + dev: true /@ethereumjs/tx@4.2.0: resolution: {integrity: sha512-1nc6VO4jtFd172BbSnTnDQVr9IYBFl1y4xPzZdtkrkKIncBCkdbgfdRV+MiTkJYAtTxvV12GRZLqBFT1PNK6Yw==} @@ -2355,7 +2439,326 @@ packages: '@ethereumjs/rlp': 4.0.1 ethereum-cryptography: 2.1.3 micro-ftch: 0.3.1 - dev: false + + /@ethersproject/abi@5.7.0: + resolution: {integrity: sha512-351ktp42TiRcYB3H1OP8yajPeAQstMW/yCFokj/AthP9bLHzQFPlOrxOcwYEDkUAICmOHljvN4K39OMTMUa9RA==} + dependencies: + '@ethersproject/address': 5.7.0 + '@ethersproject/bignumber': 5.7.0 + '@ethersproject/bytes': 5.7.0 + '@ethersproject/constants': 5.7.0 + '@ethersproject/hash': 5.7.0 + '@ethersproject/keccak256': 5.7.0 + '@ethersproject/logger': 5.7.0 + '@ethersproject/properties': 5.7.0 + '@ethersproject/strings': 5.7.0 + dev: true + + /@ethersproject/abstract-provider@5.7.0: + resolution: {integrity: sha512-R41c9UkchKCpAqStMYUpdunjo3pkEvZC3FAwZn5S5MGbXoMQOHIdHItezTETxAO5bevtMApSyEhn9+CHcDsWBw==} + dependencies: + '@ethersproject/bignumber': 5.7.0 + '@ethersproject/bytes': 5.7.0 + '@ethersproject/logger': 5.7.0 + '@ethersproject/networks': 5.7.1 + '@ethersproject/properties': 5.7.0 + '@ethersproject/transactions': 5.7.0 + '@ethersproject/web': 5.7.1 + dev: true + + /@ethersproject/abstract-signer@5.7.0: + resolution: {integrity: sha512-a16V8bq1/Cz+TGCkE2OPMTOUDLS3grCpdjoJCYNnVBbdYEMSgKrU0+B90s8b6H+ByYTBZN7a3g76jdIJi7UfKQ==} + dependencies: + '@ethersproject/abstract-provider': 5.7.0 + '@ethersproject/bignumber': 5.7.0 + '@ethersproject/bytes': 5.7.0 + '@ethersproject/logger': 5.7.0 + '@ethersproject/properties': 5.7.0 + dev: true + + /@ethersproject/address@5.7.0: + resolution: {integrity: sha512-9wYhYt7aghVGo758POM5nqcOMaE168Q6aRLJZwUmiqSrAungkG74gSSeKEIR7ukixesdRZGPgVqme6vmxs1fkA==} + dependencies: + '@ethersproject/bignumber': 5.7.0 + '@ethersproject/bytes': 5.7.0 + '@ethersproject/keccak256': 5.7.0 + '@ethersproject/logger': 5.7.0 + '@ethersproject/rlp': 5.7.0 + dev: true + + /@ethersproject/base64@5.7.0: + resolution: {integrity: sha512-Dr8tcHt2mEbsZr/mwTPIQAf3Ai0Bks/7gTw9dSqk1mQvhW3XvRlmDJr/4n+wg1JmCl16NZue17CDh8xb/vZ0sQ==} + dependencies: + '@ethersproject/bytes': 5.7.0 + dev: true + + /@ethersproject/basex@5.7.0: + resolution: {integrity: sha512-ywlh43GwZLv2Voc2gQVTKBoVQ1mti3d8HK5aMxsfu/nRDnMmNqaSJ3r3n85HBByT8OpoY96SXM1FogC533T4zw==} + dependencies: + '@ethersproject/bytes': 5.7.0 + '@ethersproject/properties': 5.7.0 + dev: true + + /@ethersproject/bignumber@5.7.0: + resolution: {integrity: sha512-n1CAdIHRWjSucQO3MC1zPSVgV/6dy/fjL9pMrPP9peL+QxEg9wOsVqwD4+818B6LUEtaXzVHQiuivzRoxPxUGw==} + dependencies: + '@ethersproject/bytes': 5.7.0 + '@ethersproject/logger': 5.7.0 + bn.js: 5.2.1 + dev: true + + /@ethersproject/bytes@5.7.0: + resolution: {integrity: sha512-nsbxwgFXWh9NyYWo+U8atvmMsSdKJprTcICAkvbBffT75qDocbuggBU0SJiVK2MuTrp0q+xvLkTnGMPK1+uA9A==} + dependencies: + '@ethersproject/logger': 5.7.0 + dev: true + + /@ethersproject/constants@5.7.0: + resolution: {integrity: sha512-DHI+y5dBNvkpYUMiRQyxRBYBefZkJfo70VUkUAsRjcPs47muV9evftfZ0PJVCXYbAiCgght0DtcF9srFQmIgWA==} + dependencies: + '@ethersproject/bignumber': 5.7.0 + dev: true + + /@ethersproject/contracts@5.7.0: + resolution: {integrity: sha512-5GJbzEU3X+d33CdfPhcyS+z8MzsTrBGk/sc+G+59+tPa9yFkl6HQ9D6L0QMgNTA9q8dT0XKxxkyp883XsQvbbg==} + dependencies: + '@ethersproject/abi': 5.7.0 + '@ethersproject/abstract-provider': 5.7.0 + '@ethersproject/abstract-signer': 5.7.0 + '@ethersproject/address': 5.7.0 + '@ethersproject/bignumber': 5.7.0 + '@ethersproject/bytes': 5.7.0 + '@ethersproject/constants': 5.7.0 + '@ethersproject/logger': 5.7.0 + '@ethersproject/properties': 5.7.0 + '@ethersproject/transactions': 5.7.0 + dev: true + + /@ethersproject/hash@5.7.0: + resolution: {integrity: sha512-qX5WrQfnah1EFnO5zJv1v46a8HW0+E5xuBBDTwMFZLuVTx0tbU2kkx15NqdjxecrLGatQN9FGQKpb1FKdHCt+g==} + dependencies: + '@ethersproject/abstract-signer': 5.7.0 + '@ethersproject/address': 5.7.0 + '@ethersproject/base64': 5.7.0 + '@ethersproject/bignumber': 5.7.0 + '@ethersproject/bytes': 5.7.0 + '@ethersproject/keccak256': 5.7.0 + '@ethersproject/logger': 5.7.0 + '@ethersproject/properties': 5.7.0 + '@ethersproject/strings': 5.7.0 + dev: true + + /@ethersproject/hdnode@5.7.0: + resolution: {integrity: sha512-OmyYo9EENBPPf4ERhR7oj6uAtUAhYGqOnIS+jE5pTXvdKBS99ikzq1E7Iv0ZQZ5V36Lqx1qZLeak0Ra16qpeOg==} + dependencies: + '@ethersproject/abstract-signer': 5.7.0 + '@ethersproject/basex': 5.7.0 + '@ethersproject/bignumber': 5.7.0 + '@ethersproject/bytes': 5.7.0 + '@ethersproject/logger': 5.7.0 + '@ethersproject/pbkdf2': 5.7.0 + '@ethersproject/properties': 5.7.0 + '@ethersproject/sha2': 5.7.0 + '@ethersproject/signing-key': 5.7.0 + '@ethersproject/strings': 5.7.0 + '@ethersproject/transactions': 5.7.0 + '@ethersproject/wordlists': 5.7.0 + dev: true + + /@ethersproject/json-wallets@5.7.0: + resolution: {integrity: sha512-8oee5Xgu6+RKgJTkvEMl2wDgSPSAQ9MB/3JYjFV9jlKvcYHUXZC+cQp0njgmxdHkYWn8s6/IqIZYm0YWCjO/0g==} + dependencies: + '@ethersproject/abstract-signer': 5.7.0 + '@ethersproject/address': 5.7.0 + '@ethersproject/bytes': 5.7.0 + '@ethersproject/hdnode': 5.7.0 + '@ethersproject/keccak256': 5.7.0 + '@ethersproject/logger': 5.7.0 + '@ethersproject/pbkdf2': 5.7.0 + '@ethersproject/properties': 5.7.0 + '@ethersproject/random': 5.7.0 + '@ethersproject/strings': 5.7.0 + '@ethersproject/transactions': 5.7.0 + aes-js: 3.0.0 + scrypt-js: 3.0.1 + dev: true + + /@ethersproject/keccak256@5.7.0: + resolution: {integrity: sha512-2UcPboeL/iW+pSg6vZ6ydF8tCnv3Iu/8tUmLLzWWGzxWKFFqOBQFLo6uLUv6BDrLgCDfN28RJ/wtByx+jZ4KBg==} + dependencies: + '@ethersproject/bytes': 5.7.0 + js-sha3: 0.8.0 + dev: true + + /@ethersproject/logger@5.7.0: + resolution: {integrity: sha512-0odtFdXu/XHtjQXJYA3u9G0G8btm0ND5Cu8M7i5vhEcE8/HmF4Lbdqanwyv4uQTr2tx6b7fQRmgLrsnpQlmnig==} + dev: true + + /@ethersproject/networks@5.7.1: + resolution: {integrity: sha512-n/MufjFYv3yFcUyfhnXotyDlNdFb7onmkSy8aQERi2PjNcnWQ66xXxa3XlS8nCcA8aJKJjIIMNJTC7tu80GwpQ==} + dependencies: + '@ethersproject/logger': 5.7.0 + dev: true + + /@ethersproject/pbkdf2@5.7.0: + resolution: {integrity: sha512-oR/dBRZR6GTyaofd86DehG72hY6NpAjhabkhxgr3X2FpJtJuodEl2auADWBZfhDHgVCbu3/H/Ocq2uC6dpNjjw==} + dependencies: + '@ethersproject/bytes': 5.7.0 + '@ethersproject/sha2': 5.7.0 + dev: true + + /@ethersproject/properties@5.7.0: + resolution: {integrity: sha512-J87jy8suntrAkIZtecpxEPxY//szqr1mlBaYlQ0r4RCaiD2hjheqF9s1LVE8vVuJCXisjIP+JgtK/Do54ej4Sw==} + dependencies: + '@ethersproject/logger': 5.7.0 + dev: true + + /@ethersproject/providers@5.7.2: + resolution: {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.1 + '@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.1 + bech32: 1.1.4 + ws: 7.4.6 + transitivePeerDependencies: + - bufferutil + - utf-8-validate + dev: true + + /@ethersproject/random@5.7.0: + resolution: {integrity: sha512-19WjScqRA8IIeWclFme75VMXSBvi4e6InrUNuaR4s5pTF2qNhcGdCUwdxUVGtDDqC00sDLCO93jPQoDUH4HVmQ==} + dependencies: + '@ethersproject/bytes': 5.7.0 + '@ethersproject/logger': 5.7.0 + dev: true + + /@ethersproject/rlp@5.7.0: + resolution: {integrity: sha512-rBxzX2vK8mVF7b0Tol44t5Tb8gomOHkj5guL+HhzQ1yBh/ydjGnpw6at+X6Iw0Kp3OzzzkcKp8N9r0W4kYSs9w==} + dependencies: + '@ethersproject/bytes': 5.7.0 + '@ethersproject/logger': 5.7.0 + dev: true + + /@ethersproject/sha2@5.7.0: + resolution: {integrity: sha512-gKlH42riwb3KYp0reLsFTokByAKoJdgFCwI+CCiX/k+Jm2mbNs6oOaCjYQSlI1+XBVejwH2KrmCbMAT/GnRDQw==} + dependencies: + '@ethersproject/bytes': 5.7.0 + '@ethersproject/logger': 5.7.0 + hash.js: 1.1.7 + dev: true + + /@ethersproject/signing-key@5.7.0: + resolution: {integrity: sha512-MZdy2nL3wO0u7gkB4nA/pEf8lu1TlFswPNmy8AiYkfKTdO6eXBJyUdmHO/ehm/htHw9K/qF8ujnTyUAD+Ry54Q==} + dependencies: + '@ethersproject/bytes': 5.7.0 + '@ethersproject/logger': 5.7.0 + '@ethersproject/properties': 5.7.0 + bn.js: 5.2.1 + elliptic: 6.5.4 + hash.js: 1.1.7 + dev: true + + /@ethersproject/solidity@5.7.0: + resolution: {integrity: sha512-HmabMd2Dt/raavyaGukF4XxizWKhKQ24DoLtdNbBmNKUOPqwjsKQSdV9GQtj9CBEea9DlzETlVER1gYeXXBGaA==} + dependencies: + '@ethersproject/bignumber': 5.7.0 + '@ethersproject/bytes': 5.7.0 + '@ethersproject/keccak256': 5.7.0 + '@ethersproject/logger': 5.7.0 + '@ethersproject/sha2': 5.7.0 + '@ethersproject/strings': 5.7.0 + dev: true + + /@ethersproject/strings@5.7.0: + resolution: {integrity: sha512-/9nu+lj0YswRNSH0NXYqrh8775XNyEdUQAuf3f+SmOrnVewcJ5SBNAjF7lpgehKi4abvNNXyf+HX86czCdJ8Mg==} + dependencies: + '@ethersproject/bytes': 5.7.0 + '@ethersproject/constants': 5.7.0 + '@ethersproject/logger': 5.7.0 + dev: true + + /@ethersproject/transactions@5.7.0: + resolution: {integrity: sha512-kmcNicCp1lp8qanMTC3RIikGgoJ80ztTyvtsFvCYpSCfkjhD0jZ2LOrnbcuxuToLIUYYf+4XwD1rP+B/erDIhQ==} + dependencies: + '@ethersproject/address': 5.7.0 + '@ethersproject/bignumber': 5.7.0 + '@ethersproject/bytes': 5.7.0 + '@ethersproject/constants': 5.7.0 + '@ethersproject/keccak256': 5.7.0 + '@ethersproject/logger': 5.7.0 + '@ethersproject/properties': 5.7.0 + '@ethersproject/rlp': 5.7.0 + '@ethersproject/signing-key': 5.7.0 + dev: true + + /@ethersproject/units@5.7.0: + resolution: {integrity: sha512-pD3xLMy3SJu9kG5xDGI7+xhTEmGXlEqXU4OfNapmfnxLVY4EMSSRp7j1k7eezutBPH7RBN/7QPnwR7hzNlEFeg==} + dependencies: + '@ethersproject/bignumber': 5.7.0 + '@ethersproject/constants': 5.7.0 + '@ethersproject/logger': 5.7.0 + dev: true + + /@ethersproject/wallet@5.7.0: + resolution: {integrity: sha512-MhmXlJXEJFBFVKrDLB4ZdDzxcBxQ3rLyCkhNqVu3CDYvR97E+8r01UgrI+TI99Le+aYm/in/0vp86guJuM7FCA==} + dependencies: + '@ethersproject/abstract-provider': 5.7.0 + '@ethersproject/abstract-signer': 5.7.0 + '@ethersproject/address': 5.7.0 + '@ethersproject/bignumber': 5.7.0 + '@ethersproject/bytes': 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/properties': 5.7.0 + '@ethersproject/random': 5.7.0 + '@ethersproject/signing-key': 5.7.0 + '@ethersproject/transactions': 5.7.0 + '@ethersproject/wordlists': 5.7.0 + dev: true + + /@ethersproject/web@5.7.1: + resolution: {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 + dev: true + + /@ethersproject/wordlists@5.7.0: + resolution: {integrity: sha512-S2TFNJNfHWVHNE6cNDjbVlZ6MgE17MIxMbMg2zv3wn+3XSJGosL1m9ZVv3GXCf/2ymSsQ+hRI5IzoMJTG6aoVA==} + dependencies: + '@ethersproject/bytes': 5.7.0 + '@ethersproject/hash': 5.7.0 + '@ethersproject/logger': 5.7.0 + '@ethersproject/properties': 5.7.0 + '@ethersproject/strings': 5.7.0 + dev: true + + /@fastify/busboy@2.1.1: + resolution: {integrity: sha512-vBZP4NlzfOlerQTnba4aqZoMhE/a9HY7HRqoOPaETQcSQuWEIyZMHGfVu6w9wGtGK5fED5qRs2DteVCjOH60sA==} + engines: {node: '>=14'} + dev: true /@hapi/hoek@9.3.0: resolution: {integrity: sha512-/c6rf4UJlmHlC9b5BaNvzAcFv7HZ2QHaV0D4/HNlBdvFnvQq8RI4kYdhyPCl7Xj+oWvTWQ8ujhqS53LIgAe6KQ==} @@ -2371,7 +2774,7 @@ packages: resolution: {integrity: sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg==} engines: {node: '>=10.10.0'} dependencies: - '@humanwhocodes/object-schema': 2.0.2 + '@humanwhocodes/object-schema': 2.0.3 debug: 4.3.4(supports-color@5.5.0) minimatch: 3.1.2 transitivePeerDependencies: @@ -2383,8 +2786,8 @@ packages: engines: {node: '>=12.22'} dev: true - /@humanwhocodes/object-schema@2.0.2: - resolution: {integrity: sha512-6EwiSjwWYP7pTckG6I5eyFANjPhmPjUX9JRLUSfNPC7FX7zK9gyZAfUEaECL6ALTpGX5AjnBq3C9XmVWPitNpw==} + /@humanwhocodes/object-schema@2.0.3: + resolution: {integrity: sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==} dev: true /@isaacs/cliui@8.0.2: @@ -2417,7 +2820,7 @@ packages: dependencies: '@jest/fake-timers': 29.7.0 '@jest/types': 29.6.3 - '@types/node': 20.11.30 + '@types/node': 20.12.5 jest-mock: 29.7.0 dev: false @@ -2427,7 +2830,7 @@ packages: dependencies: '@jest/types': 29.6.3 '@sinonjs/fake-timers': 10.3.0 - '@types/node': 20.11.30 + '@types/node': 20.12.5 jest-message-util: 29.7.0 jest-mock: 29.7.0 jest-util: 29.7.0 @@ -2445,7 +2848,7 @@ packages: dependencies: '@types/istanbul-lib-coverage': 2.0.6 '@types/istanbul-reports': 3.0.4 - '@types/node': 20.11.30 + '@types/node': 20.12.5 '@types/yargs': 15.0.19 chalk: 4.1.2 dev: false @@ -2457,7 +2860,7 @@ packages: '@jest/schemas': 29.6.3 '@types/istanbul-lib-coverage': 2.0.6 '@types/istanbul-reports': 3.0.4 - '@types/node': 20.11.30 + '@types/node': 20.12.5 '@types/yargs': 17.0.32 chalk: 4.1.2 dev: false @@ -2522,6 +2925,17 @@ packages: - supports-color dev: false + /@metamask/eth-sig-util@4.0.1: + resolution: {integrity: sha512-tghyZKLHZjcdlDqCA3gNZmLeR0XvOE9U1qoQO9ohyAZT6Pya+H9vkBPcsyXytmYLNgVoin7CKCmweo/R43V+tQ==} + engines: {node: '>=12.0.0'} + dependencies: + ethereumjs-abi: 0.6.8 + ethereumjs-util: 6.2.1 + ethjs-util: 0.1.6 + tweetnacl: 1.0.3 + tweetnacl-util: 0.15.1 + dev: true + /@metamask/json-rpc-engine@7.3.3: resolution: {integrity: sha512-dwZPq8wx9yV3IX2caLi9q9xZBw2XeIoYqdyihDDDpuHVCEiqadJLwqM3zy+uwf6F1QYQ65A8aOMQg1Uw7LMLNg==} engines: {node: '>=16.0.0'} @@ -2611,11 +3025,11 @@ packages: - supports-color dev: false - /@metamask/sdk-install-modal-web@0.14.1(@types/react@18.2.68)(react-native@0.73.6): + /@metamask/sdk-install-modal-web@0.14.1(@types/react@18.2.75)(react-native@0.73.6): resolution: {integrity: sha512-emT8HKbnfVwGhPxyUfMja6DWzvtJvDEBQxqCVx93H0HsyrrOzOC43iGCAosslw6o5h7gOfRKLqWmK8V7jQAS2Q==} dependencies: - '@emotion/react': 11.11.4(@types/react@18.2.68)(react@18.2.0) - '@emotion/styled': 11.11.0(@emotion/react@11.11.4)(@types/react@18.2.68)(react@18.2.0) + '@emotion/react': 11.11.4(@types/react@18.2.75)(react@18.2.0) + '@emotion/styled': 11.11.5(@emotion/react@11.11.4)(@types/react@18.2.75)(react@18.2.0) i18next: 22.5.1 qr-code-styling: 1.6.0-rc.1 react: 18.2.0 @@ -2626,7 +3040,7 @@ packages: - react-native dev: false - /@metamask/sdk@0.14.3(@types/react@18.2.68)(react-dom@18.2.0)(react-native@0.73.6)(react@18.2.0): + /@metamask/sdk@0.14.3(@types/react@18.2.75)(react-dom@18.2.0)(react-native@0.73.6)(react@18.2.0): resolution: {integrity: sha512-BYLs//nY2wioVSih78gOQI6sLIYY3vWkwVqXGYUgkBV+bi49bv+9S0m+hZ2cwiRaxfMYtKs0KvhAQ8weiYwDrg==} peerDependencies: react: ^18.2.0 @@ -2641,7 +3055,7 @@ packages: '@metamask/post-message-stream': 6.2.0 '@metamask/providers': 10.2.1 '@metamask/sdk-communication-layer': 0.14.3 - '@metamask/sdk-install-modal-web': 0.14.1(@types/react@18.2.68)(react-native@0.73.6) + '@metamask/sdk-install-modal-web': 0.14.1(@types/react@18.2.75)(react-native@0.73.6) '@react-native-async-storage/async-storage': 1.23.1(react-native@0.73.6) '@types/dom-screen-wake-lock': 1.0.3 bowser: 2.11.0 @@ -2651,13 +3065,13 @@ packages: eventemitter2: 6.4.9 extension-port-stream: 2.1.1 i18next: 22.5.1 - i18next-browser-languagedetector: 7.2.0 + i18next-browser-languagedetector: 7.2.1 obj-multiplex: 1.0.0 pump: 3.0.0 qrcode-terminal-nooctal: 0.12.1 react: 18.2.0 react-i18next: 13.5.0(i18next@22.5.1)(react-dom@18.2.0)(react-native@0.73.6)(react@18.2.0) - react-native: 0.73.6(@babel/core@7.24.3)(@babel/preset-env@7.24.3)(react@18.2.0) + react-native: 0.73.6(@babel/core@7.24.4)(@babel/preset-env@7.24.4)(react@18.2.0) react-native-webview: 11.26.1(react-native@0.73.6)(react@18.2.0) readable-stream: 2.3.8 rollup-plugin-visualizer: 5.12.0 @@ -2878,7 +3292,10 @@ packages: resolution: {integrity: sha512-t01iSXPuN+Eqzb4eBX0S5oubSqXbK/xXa1Ne18Hj8f9pStxztHCE2gfboSp/dZRLSqfuLpRK2nDXDK+W9puocA==} dependencies: '@noble/hashes': 1.3.3 - dev: false + + /@noble/hashes@1.2.0: + resolution: {integrity: sha512-FZfhjEDbT5GRswV3C6uvLPHMiVD6lQBmpoX5+eSiPaMTXte/IKqI5dykDxzZB/WBeK/CDuQRBWarPdi3FNY2zQ==} + dev: true /@noble/hashes@1.3.2: resolution: {integrity: sha512-MVC8EAQp7MvEcm30KWENFjgR+Mkmf+D189XJTkFIlwohU5hcBbn1ZkKq7KVTi2Hme3PMGF390DaL52beVrIihQ==} @@ -2888,13 +3305,16 @@ packages: /@noble/hashes@1.3.3: resolution: {integrity: sha512-V7/fPHgl+jsVPXqqeOzT8egNj2iBIVt+ECeMMG8TdcnTikP3oaBtUVqpT/gYCR68aEBJSF+XbYUxStjbFMqIIA==} engines: {node: '>= 16'} - dev: false /@noble/hashes@1.4.0: resolution: {integrity: sha512-V1JJ1WTRUqHHrOSh597hURcMqVKVGL/ea3kv0gSnEdsEZ0/+VyPghM1lMNGc00z7CIQorSvbKpuJkxvuHbvdbg==} engines: {node: '>= 16'} dev: false + /@noble/secp256k1@1.7.1: + resolution: {integrity: sha512-hOUk6AyBFmqVrv7k5WAw/LpszxVbj9gGN4JRkIX52fdFAj1UA61KXmZDvqVEm+pOyec3+fIeZB02LYa/pWOArw==} + dev: true + /@nodelib/fs.scandir@2.1.5: resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} engines: {node: '>= 8'} @@ -2916,85 +3336,541 @@ packages: fastq: 1.17.1 dev: true - /@pandacss/config@0.36.0: - resolution: {integrity: sha512-UFoIx7QYxGuFD8Rgp5ibkYMbO3XPzFKaDdEWo7X90yNP27ca0x1VauStdHZlGsmx0ZXSAhQogzQywSrJj+aOJw==} - dependencies: - '@pandacss/logger': 0.36.0 - '@pandacss/preset-base': 0.36.0 - '@pandacss/preset-panda': 0.36.0 - '@pandacss/shared': 0.36.0 - '@pandacss/types': 0.36.0 - bundle-n-require: 1.1.1 - escalade: 3.1.2 - merge-anything: 5.1.7 - microdiff: 1.3.2 - typescript: 5.3.3 + /@nomicfoundation/edr-darwin-arm64@0.3.4: + resolution: {integrity: sha512-tjavrUFLWnkn0PI+jk0D83hP2jjbmeXT1QLd5NtIleyGrJ00ZWVl+sfuA2Lle3kzfOceoI2VTR0n1pZB4KJGbQ==} + engines: {node: '>= 18'} + cpu: [arm64] + os: [darwin] + requiresBuild: true dev: true + optional: true - /@pandacss/core@0.36.0: - resolution: {integrity: sha512-IMwZTZ1fXaAnChALS+lDuelGJ8dqYeJNVl+svxYyQ/3ifWM8a71rQHkZiOm3WIHKX448QeljF1cu5FnFNK0g+g==} - dependencies: - '@csstools/postcss-cascade-layers': 4.0.3(postcss@8.4.35) - '@pandacss/is-valid-prop': 0.36.0 - '@pandacss/logger': 0.36.0 - '@pandacss/shared': 0.36.0 - '@pandacss/token-dictionary': 0.36.0 - '@pandacss/types': 0.36.0 - browserslist: 4.23.0 - hookable: 5.5.3 - lightningcss: 1.23.0 - lodash.merge: 4.6.2 - outdent: 0.8.0 - postcss: 8.4.35 - postcss-discard-duplicates: 6.0.1(postcss@8.4.35) - postcss-discard-empty: 6.0.1(postcss@8.4.35) - postcss-merge-rules: 6.0.3(postcss@8.4.35) - postcss-minify-selectors: 6.0.2(postcss@8.4.35) - postcss-nested: 6.0.1(postcss@8.4.35) - postcss-normalize-whitespace: 6.0.1(postcss@8.4.35) - postcss-selector-parser: 6.0.15 - ts-pattern: 5.0.8 + /@nomicfoundation/edr-darwin-x64@0.3.4: + resolution: {integrity: sha512-dXO0vlIoBosp8gf5/ah3dESMymjwit0Daef1E4Ew3gZ8q3LAdku0RC+YEQJi9f0I3QNfdgIrBTzibRZUoP+kVA==} + engines: {node: '>= 18'} + cpu: [x64] + os: [darwin] + requiresBuild: true dev: true + optional: true - /@pandacss/dev@0.36.0(jsdom@24.0.0)(typescript@5.4.3): - resolution: {integrity: sha512-Be6CuvBCgkiMkeXbj14i92ThkQMB0WttcVds52j1RQtu/G16HIRJVEp2l4lcjYvWVoiKZEi5r1/75P0nl7X5iQ==} - hasBin: true - dependencies: - '@clack/prompts': 0.7.0 - '@pandacss/config': 0.36.0 - '@pandacss/logger': 0.36.0 - '@pandacss/node': 0.36.0(jsdom@24.0.0)(typescript@5.4.3) - '@pandacss/postcss': 0.36.0(jsdom@24.0.0)(typescript@5.4.3) - '@pandacss/preset-panda': 0.36.0 - '@pandacss/shared': 0.36.0 - '@pandacss/token-dictionary': 0.36.0 - '@pandacss/types': 0.36.0 + /@nomicfoundation/edr-linux-arm64-gnu@0.3.4: + resolution: {integrity: sha512-dv38qmFUaqkkeeA9S0JjerqruytTfHav7gbPLpZUAEXPlJGo49R0+HQxd45I0msbm6NAXbkmKEchTLApp1ohaA==} + engines: {node: '>= 18'} + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@nomicfoundation/edr-linux-arm64-musl@0.3.4: + resolution: {integrity: sha512-CfEsb6gdCMVIlRSpWYTxoongEKHB60V6alE/y8mkfjIo7tA95wyiuvCtyo3fpiia3wQV7XoMYgIJHObHiKLKtA==} + engines: {node: '>= 18'} + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@nomicfoundation/edr-linux-x64-gnu@0.3.4: + resolution: {integrity: sha512-V0CpJA2lYWulgTR+zP11ftBAEwkpMAAki/AuMu3vd7HoPfjwIDzWDQR5KFU17qFmqAVz0ICRxsxDlvvBZ/PUxA==} + engines: {node: '>= 18'} + cpu: [x64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@nomicfoundation/edr-linux-x64-musl@0.3.4: + resolution: {integrity: sha512-0sgTrwZajarukerU/QSb+oRdlQLnJdd7of8OlXq2wtpeTNTqemgCOwY2l2qImbWboMpVrYgcmGbINXNVPCmuJw==} + engines: {node: '>= 18'} + cpu: [x64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@nomicfoundation/edr-win32-arm64-msvc@0.3.4: + resolution: {integrity: sha512-bOl3vhMtV0W9ozUMF5AZRBWw1183hhhx+e1YJdDLMaqNkBUFYi2CZbMYefDylq2OKQtOQ0gPLhZvn+z2D21Ztw==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [win32] + requiresBuild: true + dev: true + optional: true + + /@nomicfoundation/edr-win32-ia32-msvc@0.3.4: + resolution: {integrity: sha512-yKQCpAX0uB2dalsSwOkau3yfNXkwBJa/Ks2OPl9AjHqJ+E8AqvBEB9jRpfQrdPzElMsgZuN4mqE+wh+JxY+0Aw==} + engines: {node: '>= 18'} + cpu: [ia32] + os: [win32] + requiresBuild: true + dev: true + optional: true + + /@nomicfoundation/edr-win32-x64-msvc@0.3.4: + resolution: {integrity: sha512-fResvsL/fSucep1K5W6iOs8lqqKKovHLsAmigMzAYVovqkyZKgCGVS/D8IVxA0nxuGCOlNxFnVmwWtph3pbKWA==} + engines: {node: '>= 18'} + cpu: [x64] + os: [win32] + requiresBuild: true + dev: true + optional: true + + /@nomicfoundation/edr@0.3.4: + resolution: {integrity: sha512-e4jzVeJ+VTKBFzNgKDbSVnGVbHYNZHIfMdgifQBugXPiIa6QEUzZqleh2+y4lhkXcCthnFyrTYe3jiEpUzr3cA==} + engines: {node: '>= 18'} + optionalDependencies: + '@nomicfoundation/edr-darwin-arm64': 0.3.4 + '@nomicfoundation/edr-darwin-x64': 0.3.4 + '@nomicfoundation/edr-linux-arm64-gnu': 0.3.4 + '@nomicfoundation/edr-linux-arm64-musl': 0.3.4 + '@nomicfoundation/edr-linux-x64-gnu': 0.3.4 + '@nomicfoundation/edr-linux-x64-musl': 0.3.4 + '@nomicfoundation/edr-win32-arm64-msvc': 0.3.4 + '@nomicfoundation/edr-win32-ia32-msvc': 0.3.4 + '@nomicfoundation/edr-win32-x64-msvc': 0.3.4 + dev: true + + /@nomicfoundation/ethereumjs-common@4.0.4: + resolution: {integrity: sha512-9Rgb658lcWsjiicr5GzNCjI1llow/7r0k50dLL95OJ+6iZJcVbi15r3Y0xh2cIO+zgX0WIHcbzIu6FeQf9KPrg==} + dependencies: + '@nomicfoundation/ethereumjs-util': 9.0.4 + transitivePeerDependencies: + - c-kzg + dev: true + + /@nomicfoundation/ethereumjs-rlp@5.0.4: + resolution: {integrity: sha512-8H1S3s8F6QueOc/X92SdrA4RDenpiAEqMg5vJH99kcQaCy/a3Q6fgseo75mgWlbanGJXSlAPtnCeG9jvfTYXlw==} + engines: {node: '>=18'} + hasBin: true + dev: true + + /@nomicfoundation/ethereumjs-tx@5.0.4: + resolution: {integrity: sha512-Xjv8wAKJGMrP1f0n2PeyfFCCojHd7iS3s/Ab7qzF1S64kxZ8Z22LCMynArYsVqiFx6rzYy548HNVEyI+AYN/kw==} + engines: {node: '>=18'} + peerDependencies: + c-kzg: ^2.1.2 + peerDependenciesMeta: + c-kzg: + optional: true + dependencies: + '@nomicfoundation/ethereumjs-common': 4.0.4 + '@nomicfoundation/ethereumjs-rlp': 5.0.4 + '@nomicfoundation/ethereumjs-util': 9.0.4 + ethereum-cryptography: 0.1.3 + dev: true + + /@nomicfoundation/ethereumjs-util@9.0.4: + resolution: {integrity: sha512-sLOzjnSrlx9Bb9EFNtHzK/FJFsfg2re6bsGqinFinH1gCqVfz9YYlXiMWwDM4C/L4ywuHFCYwfKTVr/QHQcU0Q==} + engines: {node: '>=18'} + peerDependencies: + c-kzg: ^2.1.2 + peerDependenciesMeta: + c-kzg: + optional: true + dependencies: + '@nomicfoundation/ethereumjs-rlp': 5.0.4 + ethereum-cryptography: 0.1.3 + dev: true + + /@nomicfoundation/hardhat-chai-matchers@1.0.6(@nomiclabs/hardhat-ethers@2.2.3)(chai@4.4.1)(ethers@5.7.2)(hardhat@2.22.2): + resolution: {integrity: sha512-f5ZMNmabZeZegEfuxn/0kW+mm7+yV7VNDxLpMOMGXWFJ2l/Ct3QShujzDRF9cOkK9Ui/hbDeOWGZqyQALDXVCQ==} + peerDependencies: + '@nomiclabs/hardhat-ethers': ^2.0.0 + chai: ^4.2.0 + ethers: ^5.0.0 + hardhat: ^2.9.4 + dependencies: + '@ethersproject/abi': 5.7.0 + '@nomiclabs/hardhat-ethers': 2.2.3(ethers@5.7.2)(hardhat@2.22.2) + '@types/chai-as-promised': 7.1.8 + chai: 4.4.1 + chai-as-promised: 7.1.1(chai@4.4.1) + deep-eql: 4.1.3 + ethers: 5.7.2 + hardhat: 2.22.2(ts-node@10.9.2)(typescript@5.4.4) + ordinal: 1.0.3 + dev: true + + /@nomicfoundation/hardhat-foundry@1.1.1(hardhat@2.22.2): + resolution: {integrity: sha512-cXGCBHAiXas9Pg9MhMOpBVQCkWRYoRFG7GJJAph+sdQsfd22iRs5U5Vs9XmpGEQd1yEvYISQZMeE68Nxj65iUQ==} + peerDependencies: + hardhat: ^2.17.2 + dependencies: + chalk: 2.4.2 + hardhat: 2.22.2(ts-node@10.9.2)(typescript@5.4.4) + dev: true + + /@nomicfoundation/hardhat-network-helpers@1.0.10(hardhat@2.22.2): + resolution: {integrity: sha512-R35/BMBlx7tWN5V6d/8/19QCwEmIdbnA4ZrsuXgvs8i2qFx5i7h6mH5pBS4Pwi4WigLH+upl6faYusrNPuzMrQ==} + peerDependencies: + hardhat: ^2.9.5 + dependencies: + ethereumjs-util: 7.1.5 + hardhat: 2.22.2(ts-node@10.9.2)(typescript@5.4.4) + dev: true + + /@nomicfoundation/hardhat-toolbox@2.0.2(@ethersproject/abi@5.7.0)(@ethersproject/providers@5.7.2)(@nomicfoundation/hardhat-chai-matchers@1.0.6)(@nomicfoundation/hardhat-network-helpers@1.0.10)(@nomiclabs/hardhat-ethers@2.2.3)(@nomiclabs/hardhat-etherscan@3.1.8)(@typechain/ethers-v5@10.2.1)(@typechain/hardhat@6.1.6)(@types/chai@4.3.14)(@types/mocha@10.0.6)(@types/node@20.12.5)(chai@4.4.1)(ethers@5.7.2)(hardhat-gas-reporter@1.0.10)(hardhat@2.22.2)(solidity-coverage@0.8.12)(ts-node@10.9.2)(typechain@8.3.2)(typescript@5.4.4): + resolution: {integrity: sha512-vnN1AzxbvpSx9pfdRHbUzTRIXpMLPXnUlkW855VaDk6N1pwRaQ2gNzEmFAABk4lWf11E00PKwFd/q27HuwYrYg==} + peerDependencies: + '@ethersproject/abi': ^5.4.7 + '@ethersproject/providers': ^5.4.7 + '@nomicfoundation/hardhat-chai-matchers': ^1.0.0 + '@nomicfoundation/hardhat-network-helpers': ^1.0.0 + '@nomiclabs/hardhat-ethers': ^2.0.0 + '@nomiclabs/hardhat-etherscan': ^3.0.0 + '@typechain/ethers-v5': ^10.1.0 + '@typechain/hardhat': ^6.1.2 + '@types/chai': ^4.2.0 + '@types/mocha': '>=9.1.0' + '@types/node': '>=12.0.0' + chai: ^4.2.0 + ethers: ^5.4.7 + hardhat: ^2.11.0 + hardhat-gas-reporter: ^1.0.8 + solidity-coverage: ^0.8.1 + ts-node: '>=8.0.0' + typechain: ^8.1.0 + typescript: '>=4.5.0' + dependencies: + '@ethersproject/abi': 5.7.0 + '@ethersproject/providers': 5.7.2 + '@nomicfoundation/hardhat-chai-matchers': 1.0.6(@nomiclabs/hardhat-ethers@2.2.3)(chai@4.4.1)(ethers@5.7.2)(hardhat@2.22.2) + '@nomicfoundation/hardhat-network-helpers': 1.0.10(hardhat@2.22.2) + '@nomiclabs/hardhat-ethers': 2.2.3(ethers@5.7.2)(hardhat@2.22.2) + '@nomiclabs/hardhat-etherscan': 3.1.8(hardhat@2.22.2) + '@typechain/ethers-v5': 10.2.1(@ethersproject/abi@5.7.0)(@ethersproject/providers@5.7.2)(ethers@5.7.2)(typechain@8.3.2)(typescript@5.4.4) + '@typechain/hardhat': 6.1.6(@ethersproject/abi@5.7.0)(@ethersproject/providers@5.7.2)(@typechain/ethers-v5@10.2.1)(ethers@5.7.2)(hardhat@2.22.2)(typechain@8.3.2) + '@types/chai': 4.3.14 + '@types/mocha': 10.0.6 + '@types/node': 20.12.5 + chai: 4.4.1 + ethers: 5.7.2 + hardhat: 2.22.2(ts-node@10.9.2)(typescript@5.4.4) + hardhat-gas-reporter: 1.0.10(hardhat@2.22.2) + solidity-coverage: 0.8.12(hardhat@2.22.2) + ts-node: 10.9.2(@types/node@20.12.5)(typescript@5.4.4) + typechain: 8.3.2(typescript@5.4.4) + typescript: 5.4.4 + dev: true + + /@nomicfoundation/solidity-analyzer-darwin-arm64@0.1.1: + resolution: {integrity: sha512-KcTodaQw8ivDZyF+D76FokN/HdpgGpfjc/gFCImdLUyqB6eSWVaZPazMbeAjmfhx3R0zm/NYVzxwAokFKgrc0w==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [darwin] + requiresBuild: true + dev: true + optional: true + + /@nomicfoundation/solidity-analyzer-darwin-x64@0.1.1: + resolution: {integrity: sha512-XhQG4BaJE6cIbjAVtzGOGbK3sn1BO9W29uhk9J8y8fZF1DYz0Doj8QDMfpMu+A6TjPDs61lbsmeYodIDnfveSA==} + engines: {node: '>= 10'} + cpu: [x64] + os: [darwin] + requiresBuild: true + dev: true + optional: true + + /@nomicfoundation/solidity-analyzer-freebsd-x64@0.1.1: + resolution: {integrity: sha512-GHF1VKRdHW3G8CndkwdaeLkVBi5A9u2jwtlS7SLhBc8b5U/GcoL39Q+1CSO3hYqePNP+eV5YI7Zgm0ea6kMHoA==} + engines: {node: '>= 10'} + cpu: [x64] + os: [freebsd] + requiresBuild: true + dev: true + optional: true + + /@nomicfoundation/solidity-analyzer-linux-arm64-gnu@0.1.1: + resolution: {integrity: sha512-g4Cv2fO37ZsUENQ2vwPnZc2zRenHyAxHcyBjKcjaSmmkKrFr64yvzeNO8S3GBFCo90rfochLs99wFVGT/0owpg==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@nomicfoundation/solidity-analyzer-linux-arm64-musl@0.1.1: + resolution: {integrity: sha512-WJ3CE5Oek25OGE3WwzK7oaopY8xMw9Lhb0mlYuJl/maZVo+WtP36XoQTb7bW/i8aAdHW5Z+BqrHMux23pvxG3w==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@nomicfoundation/solidity-analyzer-linux-x64-gnu@0.1.1: + resolution: {integrity: sha512-5WN7leSr5fkUBBjE4f3wKENUy9HQStu7HmWqbtknfXkkil+eNWiBV275IOlpXku7v3uLsXTOKpnnGHJYI2qsdA==} + engines: {node: '>= 10'} + cpu: [x64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@nomicfoundation/solidity-analyzer-linux-x64-musl@0.1.1: + resolution: {integrity: sha512-KdYMkJOq0SYPQMmErv/63CwGwMm5XHenEna9X9aB8mQmhDBrYrlAOSsIPgFCUSL0hjxE3xHP65/EPXR/InD2+w==} + engines: {node: '>= 10'} + cpu: [x64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@nomicfoundation/solidity-analyzer-win32-arm64-msvc@0.1.1: + resolution: {integrity: sha512-VFZASBfl4qiBYwW5xeY20exWhmv6ww9sWu/krWSesv3q5hA0o1JuzmPHR4LPN6SUZj5vcqci0O6JOL8BPw+APg==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [win32] + requiresBuild: true + dev: true + optional: true + + /@nomicfoundation/solidity-analyzer-win32-ia32-msvc@0.1.1: + resolution: {integrity: sha512-JnFkYuyCSA70j6Si6cS1A9Gh1aHTEb8kOTBApp/c7NRTFGNMH8eaInKlyuuiIbvYFhlXW4LicqyYuWNNq9hkpQ==} + engines: {node: '>= 10'} + cpu: [ia32] + os: [win32] + requiresBuild: true + dev: true + optional: true + + /@nomicfoundation/solidity-analyzer-win32-x64-msvc@0.1.1: + resolution: {integrity: sha512-HrVJr6+WjIXGnw3Q9u6KQcbZCtk0caVWhCdFADySvRyUxJ8PnzlaP+MhwNE8oyT8OZ6ejHBRrrgjSqDCFXGirw==} + engines: {node: '>= 10'} + cpu: [x64] + os: [win32] + requiresBuild: true + dev: true + optional: true + + /@nomicfoundation/solidity-analyzer@0.1.1: + resolution: {integrity: sha512-1LMtXj1puAxyFusBgUIy5pZk3073cNXYnXUpuNKFghHbIit/xZgbk0AokpUADbNm3gyD6bFWl3LRFh3dhVdREg==} + engines: {node: '>= 12'} + optionalDependencies: + '@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 + dev: true + + /@nomiclabs/hardhat-ethers@2.2.3(ethers@5.7.2)(hardhat@2.22.2): + resolution: {integrity: sha512-YhzPdzb612X591FOe68q+qXVXGG2ANZRvDo0RRUtimev85rCrAlv/TLMEZw5c+kq9AbzocLTVX/h2jVIFPL9Xg==} + peerDependencies: + ethers: ^5.0.0 + hardhat: ^2.0.0 + dependencies: + ethers: 5.7.2 + hardhat: 2.22.2(ts-node@10.9.2)(typescript@5.4.4) + dev: true + + /@nomiclabs/hardhat-etherscan@3.1.8(hardhat@2.22.2): + resolution: {integrity: sha512-v5F6IzQhrsjHh6kQz4uNrym49brK9K5bYCq2zQZ729RYRaifI9hHbtmK+KkIVevfhut7huQFEQ77JLRMAzWYjQ==} + deprecated: The @nomiclabs/hardhat-etherscan package is deprecated, please use @nomicfoundation/hardhat-verify instead + peerDependencies: + hardhat: ^2.0.4 + dependencies: + '@ethersproject/abi': 5.7.0 + '@ethersproject/address': 5.7.0 + cbor: 8.1.0 + chalk: 2.4.2 + debug: 4.3.4(supports-color@5.5.0) + fs-extra: 7.0.1 + hardhat: 2.22.2(ts-node@10.9.2)(typescript@5.4.4) + lodash: 4.17.21 + semver: 6.3.1 + table: 6.8.2 + undici: 5.28.4 + transitivePeerDependencies: + - supports-color + dev: true + + /@nomiclabs/hardhat-truffle5@2.0.7(@nomiclabs/hardhat-web3@2.0.0)(hardhat@2.22.2)(web3-core-helpers@1.10.3)(web3-core-promievent@1.10.3)(web3-eth-abi@1.10.4)(web3-utils@1.10.4)(web3@1.10.4): + resolution: {integrity: sha512-Pw8451IUZp1bTp0QqCHCYfCHs66sCnyxPcaorapu9mfOV9xnZsVaFdtutnhNEiXdiZwbed7LFKpRsde4BjFwig==} + peerDependencies: + '@nomiclabs/hardhat-web3': ^2.0.0 + hardhat: ^2.6.4 + web3: ^1.0.0-beta.36 + dependencies: + '@nomiclabs/hardhat-web3': 2.0.0(hardhat@2.22.2)(web3@1.10.4) + '@nomiclabs/truffle-contract': 4.5.10(web3-core-helpers@1.10.3)(web3-core-promievent@1.10.3)(web3-eth-abi@1.10.4)(web3-utils@1.10.4)(web3@1.10.4) + '@types/chai': 4.3.14 + chai: 4.4.1 + ethereumjs-util: 7.1.5 + fs-extra: 7.0.1 + hardhat: 2.22.2(ts-node@10.9.2)(typescript@5.4.4) + web3: 1.10.4 + transitivePeerDependencies: + - bufferutil + - encoding + - supports-color + - utf-8-validate + - web3-core-helpers + - web3-core-promievent + - web3-eth-abi + - web3-utils + dev: true + + /@nomiclabs/hardhat-web3@2.0.0(hardhat@2.22.2)(web3@1.10.4): + resolution: {integrity: sha512-zt4xN+D+fKl3wW2YlTX3k9APR3XZgPkxJYf36AcliJn3oujnKEVRZaHu0PhgLjO+gR+F/kiYayo9fgd2L8970Q==} + peerDependencies: + hardhat: ^2.0.0 + web3: ^1.0.0-beta.36 + dependencies: + '@types/bignumber.js': 5.0.0 + hardhat: 2.22.2(ts-node@10.9.2)(typescript@5.4.4) + web3: 1.10.4 + dev: true + + /@nomiclabs/truffle-contract@4.5.10(web3-core-helpers@1.10.3)(web3-core-promievent@1.10.3)(web3-eth-abi@1.10.4)(web3-utils@1.10.4)(web3@1.10.4): + resolution: {integrity: sha512-nF/6InFV+0hUvutyFgsdOMCoYlr//2fJbRER4itxYtQtc4/O1biTwZIKRu+5l2J5Sq6LU2WX7vZHtDgQdhWxIQ==} + peerDependencies: + web3: ^1.2.1 + web3-core-helpers: ^1.2.1 + web3-core-promievent: ^1.2.1 + web3-eth-abi: ^1.2.1 + web3-utils: ^1.2.1 + dependencies: + '@ensdomains/ensjs': 2.1.0 + '@truffle/blockchain-utils': 0.1.9 + '@truffle/contract-schema': 3.4.16 + '@truffle/debug-utils': 6.0.57 + '@truffle/error': 0.1.1 + '@truffle/interface-adapter': 0.5.37 + bignumber.js: 7.2.1 + ethereum-ens: 0.8.0 + ethers: 4.0.49 + source-map-support: 0.5.21 + web3: 1.10.4 + web3-core-helpers: 1.10.3 + web3-core-promievent: 1.10.3 + web3-eth-abi: 1.10.4 + web3-utils: 1.10.4 + transitivePeerDependencies: + - bufferutil + - encoding + - supports-color + - utf-8-validate + dev: true + + /@openzeppelin/contract-loader@0.6.3: + resolution: {integrity: sha512-cOFIjBjwbGgZhDZsitNgJl0Ye1rd5yu/Yx5LMgeq3u0ZYzldm4uObzHDFq4gjDdoypvyORjjJa3BlFA7eAnVIg==} + dependencies: + find-up: 4.1.0 + fs-extra: 8.1.0 + dev: true + + /@openzeppelin/contracts@4.9.6: + resolution: {integrity: sha512-xSmezSupL+y9VkHZJGDoCBpmnB2ogM13ccaYDWqJTfS3dbuHkgjuwDFUmaFauBCboQMGB/S5UqUl2y54X99BmA==} + dev: true + + /@openzeppelin/test-helpers@0.5.16(bn.js@4.12.0): + resolution: {integrity: sha512-T1EvspSfH1qQO/sgGlskLfYVBbqzJR23SZzYl/6B2JnT4EhThcI85UpvDk0BkLWKaDScQTabGHt4GzHW+3SfZg==} + dependencies: + '@openzeppelin/contract-loader': 0.6.3 + '@truffle/contract': 4.6.31 + ansi-colors: 3.2.4 + chai: 4.4.1 + chai-bn: 0.2.2(bn.js@4.12.0)(chai@4.4.1) + ethjs-abi: 0.2.1 + lodash.flatten: 4.4.0 + semver: 5.7.2 + web3: 1.10.4 + web3-utils: 1.10.4 + transitivePeerDependencies: + - bn.js + - bufferutil + - encoding + - supports-color + - utf-8-validate + dev: true + + /@pandacss/config@0.36.1: + resolution: {integrity: sha512-umy8xQg8bf+xDuy9epRYOintfVjpdJxYAdW4MFYm+1SD2ANyAtyNjfaA/poq/WMu/uay6zE6B9kT7WKJHo0+9A==} + dependencies: + '@pandacss/logger': 0.36.1 + '@pandacss/preset-base': 0.36.1 + '@pandacss/preset-panda': 0.36.1 + '@pandacss/shared': 0.36.1 + '@pandacss/types': 0.36.1 + bundle-n-require: 1.1.1 + escalade: 3.1.2 + merge-anything: 5.1.7 + microdiff: 1.3.2 + typescript: 5.3.3 + dev: true + + /@pandacss/core@0.36.1: + resolution: {integrity: sha512-vEuTMH5hTZrjzelE3I1nURrbmhwvz5g1Pm9zvjseyie+VDOLaOqJoz3FE3MZVu0QBYJtJsVnN5By1vj4NYGvKg==} + dependencies: + '@csstools/postcss-cascade-layers': 4.0.3(postcss@8.4.35) + '@pandacss/is-valid-prop': 0.36.1 + '@pandacss/logger': 0.36.1 + '@pandacss/shared': 0.36.1 + '@pandacss/token-dictionary': 0.36.1 + '@pandacss/types': 0.36.1 + browserslist: 4.23.0 + hookable: 5.5.3 + lightningcss: 1.23.0 + lodash.merge: 4.6.2 + outdent: 0.8.0 + postcss: 8.4.35 + postcss-discard-duplicates: 6.0.1(postcss@8.4.35) + postcss-discard-empty: 6.0.1(postcss@8.4.35) + postcss-merge-rules: 6.0.3(postcss@8.4.35) + postcss-minify-selectors: 6.0.2(postcss@8.4.35) + postcss-nested: 6.0.1(postcss@8.4.35) + postcss-normalize-whitespace: 6.0.1(postcss@8.4.35) + postcss-selector-parser: 6.0.15 + ts-pattern: 5.0.8 + dev: true + + /@pandacss/dev@0.36.1(jsdom@24.0.0)(typescript@5.4.4): + resolution: {integrity: sha512-0ZCVFu17HNG2Vc8/NqpRv/lVmHL9dt5xEEGaMwv9TKx5s4FyJx/W5l0V8wQkkOQ5CHHNGA2Bkal9YSx7JGdAqQ==} + hasBin: true + dependencies: + '@clack/prompts': 0.7.0 + '@pandacss/config': 0.36.1 + '@pandacss/logger': 0.36.1 + '@pandacss/node': 0.36.1(jsdom@24.0.0)(typescript@5.4.4) + '@pandacss/postcss': 0.36.1(jsdom@24.0.0)(typescript@5.4.4) + '@pandacss/preset-panda': 0.36.1 + '@pandacss/shared': 0.36.1 + '@pandacss/token-dictionary': 0.36.1 + '@pandacss/types': 0.36.1 cac: 6.7.14 transitivePeerDependencies: - jsdom - typescript dev: true - /@pandacss/extractor@0.36.0(jsdom@24.0.0)(typescript@5.4.3): - resolution: {integrity: sha512-niYIMHokWwC/+h/IVK/aJPiTHSeLFFmG5rLB8M4+2MkpCCUyi7CNIHVtI4sUTdWHQxw2Pb+Zd8d8ZQgZwm9MVg==} + /@pandacss/extractor@0.36.1(jsdom@24.0.0)(typescript@5.4.4): + resolution: {integrity: sha512-Fm+yrTIUE+T0fHfekfYTUtIsbCsP5i4/jnvnlQavD/JX2+6x9yB83otP0TaVM1lpTCURtrSVZgEvXdc8OmZ2dA==} dependencies: - '@pandacss/shared': 0.36.0 - ts-evaluator: 1.2.0(jsdom@24.0.0)(typescript@5.4.3) + '@pandacss/shared': 0.36.1 + ts-evaluator: 1.2.0(jsdom@24.0.0)(typescript@5.4.4) ts-morph: 21.0.1 transitivePeerDependencies: - jsdom - typescript dev: true - /@pandacss/generator@0.36.0: - resolution: {integrity: sha512-m15i2myad59DVBHHfEYmu6GuYbD4+Ok4qLtstz1soIGltRiLco0DFwWGtuga58qGWAO9AKQ7UtFj2bao6PGQlA==} + /@pandacss/generator@0.36.1: + resolution: {integrity: sha512-XG442+N5Yp+kZaVvK94IvTp/Yt6GQ1e3SLg12Ou9fS99le/TPSOWyKxZEtPBgy4iOhgSn1CGRD+YsjjaBrRxiQ==} dependencies: - '@pandacss/core': 0.36.0 - '@pandacss/is-valid-prop': 0.36.0 - '@pandacss/logger': 0.36.0 - '@pandacss/shared': 0.36.0 - '@pandacss/token-dictionary': 0.36.0 - '@pandacss/types': 0.36.0 + '@pandacss/core': 0.36.1 + '@pandacss/is-valid-prop': 0.36.1 + '@pandacss/logger': 0.36.1 + '@pandacss/shared': 0.36.1 + '@pandacss/token-dictionary': 0.36.1 + '@pandacss/types': 0.36.1 javascript-stringify: 2.1.0 outdent: 0.8.0 pluralize: 8.0.0 @@ -3002,29 +3878,29 @@ packages: ts-pattern: 5.0.8 dev: true - /@pandacss/is-valid-prop@0.36.0: - resolution: {integrity: sha512-GgTy97wfdwRqP7mrQPXgpafhoT+BBWd4YVtgXX36+xVrWqKH7tDjU+LvDFrRu+RxT7Zrlv0PSG6+Zc6wmGCjBw==} + /@pandacss/is-valid-prop@0.36.1: + resolution: {integrity: sha512-bkkaM7+RaeZUlQLWXPbnScGaLzckF9ZDsqVRJml2AKCmLP8E3r1Ehjn/y1TxR3cs/PRlVqVJX4u8NGRFyitV8g==} dev: true - /@pandacss/logger@0.36.0: - resolution: {integrity: sha512-dVe/hGAQi9UUp1buCTkjsqAqEfyAgXbtLnSCAIH/CC0RZV/K82FcbEhTlsGwFw3rSt6A9tBL+G+Dlnfy42jBDQ==} + /@pandacss/logger@0.36.1: + resolution: {integrity: sha512-U6RGJIRGIEzyer97Nx/Zhyl4S8/5fB87pFtQuimYjDpiG+IKBhg9CTI9jFnXQ0tBiC8A53ATaf6m0BQ5ZFDNjg==} dependencies: - '@pandacss/types': 0.36.0 + '@pandacss/types': 0.36.1 kleur: 4.1.5 dev: true - /@pandacss/node@0.36.0(jsdom@24.0.0)(typescript@5.4.3): - resolution: {integrity: sha512-6dNdNYnPFm6/kEbOS6Ib0zn8oCSKRM91B65psImWC90xDk8QAdmhxIAUNb3lNPGbQqBho6y0wvo/Uc3GVDwQjw==} + /@pandacss/node@0.36.1(jsdom@24.0.0)(typescript@5.4.4): + resolution: {integrity: sha512-RU6UDMJrZcN76SX/mfoLACrGoYtXtFm9x/SEPdwYcu/GDCLh1cTF8zkcSY8s9C0U66fKNCx6NmQq+vDuHoA1bQ==} dependencies: - '@pandacss/config': 0.36.0 - '@pandacss/core': 0.36.0 - '@pandacss/extractor': 0.36.0(jsdom@24.0.0)(typescript@5.4.3) - '@pandacss/generator': 0.36.0 - '@pandacss/logger': 0.36.0 - '@pandacss/parser': 0.36.0(jsdom@24.0.0)(typescript@5.4.3) - '@pandacss/shared': 0.36.0 - '@pandacss/token-dictionary': 0.36.0 - '@pandacss/types': 0.36.0 + '@pandacss/config': 0.36.1 + '@pandacss/core': 0.36.1 + '@pandacss/extractor': 0.36.1(jsdom@24.0.0)(typescript@5.4.4) + '@pandacss/generator': 0.36.1 + '@pandacss/logger': 0.36.1 + '@pandacss/parser': 0.36.1(jsdom@24.0.0)(typescript@5.4.4) + '@pandacss/shared': 0.36.1 + '@pandacss/token-dictionary': 0.36.1 + '@pandacss/types': 0.36.1 browserslist: 4.23.0 chokidar: 3.6.0 fast-glob: 3.3.2 @@ -3044,21 +3920,21 @@ packages: prettier: 3.2.5 ts-morph: 21.0.1 ts-pattern: 5.0.8 - tsconfck: 3.0.2(typescript@5.4.3) + tsconfck: 3.0.2(typescript@5.4.4) transitivePeerDependencies: - jsdom - typescript dev: true - /@pandacss/parser@0.36.0(jsdom@24.0.0)(typescript@5.4.3): - resolution: {integrity: sha512-yJx0dICeuhkQtVw5Le5txEePF9KPJ9mijmCLg1GMksgcMW47IIY9NwEflezphMwTa1PLNTrAJy56NaVGetPdvg==} + /@pandacss/parser@0.36.1(jsdom@24.0.0)(typescript@5.4.4): + resolution: {integrity: sha512-clJKGT/qXGyX00n6vlUogB2hiXNu/B8JpWIYsQ4B9Ab/sU/ufo9F8nIDRYVch6eIn9gRZnNUjxG4wo8Na/eV6w==} dependencies: - '@pandacss/config': 0.36.0 - '@pandacss/core': 0.36.0 - '@pandacss/extractor': 0.36.0(jsdom@24.0.0)(typescript@5.4.3) - '@pandacss/logger': 0.36.0 - '@pandacss/shared': 0.36.0 - '@pandacss/types': 0.36.0 + '@pandacss/config': 0.36.1 + '@pandacss/core': 0.36.1 + '@pandacss/extractor': 0.36.1(jsdom@24.0.0)(typescript@5.4.4) + '@pandacss/logger': 0.36.1 + '@pandacss/shared': 0.36.1 + '@pandacss/types': 0.36.1 '@vue/compiler-sfc': 3.4.19 magic-string: 0.30.8 ts-morph: 21.0.1 @@ -3068,43 +3944,43 @@ packages: - typescript dev: true - /@pandacss/postcss@0.36.0(jsdom@24.0.0)(typescript@5.4.3): - resolution: {integrity: sha512-mFNMJQUVNS5PLzoiUQ4yw+74nsDLKA2UsdQ2SkrWjx2nehif0ZlSQCpVJuh/U6VtjfRiqLluqB9sIq+F5c4oCg==} + /@pandacss/postcss@0.36.1(jsdom@24.0.0)(typescript@5.4.4): + resolution: {integrity: sha512-Z/MzXNb6F3v77psERHaTOGUU+00CFAJU/2RpBBc22fZ/XTGKOg4m6/HuP/kBeYMZQHdnvAKQvEEORWdN5NWi1g==} dependencies: - '@pandacss/node': 0.36.0(jsdom@24.0.0)(typescript@5.4.3) + '@pandacss/node': 0.36.1(jsdom@24.0.0)(typescript@5.4.4) postcss: 8.4.35 transitivePeerDependencies: - jsdom - typescript dev: true - /@pandacss/preset-base@0.36.0: - resolution: {integrity: sha512-ZskbtBIR5Mgrj6XFra6zNI+pCGYoTUsU6gp4YZ/UxtxTCqrwsJAhjQ6AIYytZ369xsw8wWU2njWNrJ+Pt0kpKw==} + /@pandacss/preset-base@0.36.1: + resolution: {integrity: sha512-AJ8cmm5OgOBm890eAUjh+yoRtXVS7tm0R/XqGP5WxiWlkAeWxxHI8jrAViCOQZ8WSLWYv3ngqy5MncZxjQ0I7Q==} dependencies: - '@pandacss/types': 0.36.0 + '@pandacss/types': 0.36.1 dev: true - /@pandacss/preset-panda@0.36.0: - resolution: {integrity: sha512-dwv8avrBldcBX7v3cNIEqPShAb99ntNOVnpPjosCjULa69sHgqd8IWHh7L02oqj/fiY2IkRCHObkdQM0cYyLlA==} + /@pandacss/preset-panda@0.36.1: + resolution: {integrity: sha512-0pQ/0tRJIPss57t+IfRXH8efiKElTMfY9e/zNRyrT4RWVyZSQl72JcwMUWXGjs2XNnPB7ovNWlaKlW79otc5dA==} dependencies: - '@pandacss/types': 0.36.0 + '@pandacss/types': 0.36.1 dev: true - /@pandacss/shared@0.36.0: - resolution: {integrity: sha512-XL/UZPFK/QGwCFr6ALkQD2fuhTUTlDKjJ9gEufsEsx3KQkTRJkh6FS4QOqPF/O6n10fjGlzvmuzsydk2QK3L5w==} + /@pandacss/shared@0.36.1: + resolution: {integrity: sha512-yiGHfGNpOkphCsx8sYGsL8RhyPKeqcGgrrrQCNzwgkJRGXDqTVw9qNbD4tkILI8Qe+S+5aCiLkWCfoUtqJ+Btg==} dev: true - /@pandacss/token-dictionary@0.36.0: - resolution: {integrity: sha512-qR476xBdc7MrNoCaBhHSNTNbj2ALgIdVV7DtzkRC6w45pqPXmwUuoaxsg5csDckr8qC1s+j19RB+/kEakt5P1A==} + /@pandacss/token-dictionary@0.36.1: + resolution: {integrity: sha512-yM5Gip5g5oefHFIYe5VOvsW+ESiYbnkQ6KgLZXjoosICk9gbf+GQlveCQHNedQj0p/E6O6c6Sm0Z5Ax07F6Kcw==} dependencies: - '@pandacss/logger': 0.36.0 - '@pandacss/shared': 0.36.0 - '@pandacss/types': 0.36.0 + '@pandacss/logger': 0.36.1 + '@pandacss/shared': 0.36.1 + '@pandacss/types': 0.36.1 ts-pattern: 5.0.8 dev: true - /@pandacss/types@0.36.0: - resolution: {integrity: sha512-oFxoHnl3OdIuA7GWDoSPg/eVptyBbPQ4+eAl7vWN/Pf9fUZL+aW/zB3aSRYVjUWAiNiYIPAR5RaEe0Zi9m+iFA==} + /@pandacss/types@0.36.1: + resolution: {integrity: sha512-F0mGFtXT2j1hNFi5Z1AXPxEYcHoaedyJyScEbsGga4aa2KlJCEPEX9UDdgltMlrhSilM7nq7RbrDMToZ/cwvOg==} dev: true /@parcel/watcher-android-arm64@2.4.1: @@ -3261,7 +4137,7 @@ packages: react-native: ^0.0.0-0 || >=0.60 <1.0 dependencies: merge-options: 3.0.4 - react-native: 0.73.6(@babel/core@7.24.3)(@babel/preset-env@7.24.3)(react@18.2.0) + react-native: 0.73.6(@babel/core@7.24.4)(@babel/preset-env@7.24.4)(react@18.2.0) dev: false /@react-native-community/cli-clean@12.3.6: @@ -3282,7 +4158,7 @@ packages: cosmiconfig: 5.2.1 deepmerge: 4.3.1 glob: 7.2.3 - joi: 17.12.2 + joi: 17.12.3 transitivePeerDependencies: - encoding dev: false @@ -3305,7 +4181,7 @@ packages: chalk: 4.1.2 command-exists: 1.2.9 deepmerge: 4.3.1 - envinfo: 7.11.1 + envinfo: 7.12.0 execa: 5.1.1 hermes-profile-transformer: 0.0.6 node-stream-zip: 1.15.0 @@ -3398,7 +4274,7 @@ packages: /@react-native-community/cli-types@12.3.6: resolution: {integrity: sha512-xPqTgcUtZowQ8WKOkI9TLGBwH2bGggOC4d2FFaIRST3gTcjrEeGRNeR5aXCzJFIgItIft8sd7p2oKEdy90+01Q==} dependencies: - joi: 17.12.2 + joi: 17.12.3 dev: false /@react-native-community/cli@12.3.6: @@ -3436,100 +4312,100 @@ packages: engines: {node: '>=18'} dev: false - /@react-native/babel-plugin-codegen@0.73.4(@babel/preset-env@7.24.3): + /@react-native/babel-plugin-codegen@0.73.4(@babel/preset-env@7.24.4): resolution: {integrity: sha512-XzRd8MJGo4Zc5KsphDHBYJzS1ryOHg8I2gOZDAUCGcwLFhdyGu1zBNDJYH2GFyDrInn9TzAbRIf3d4O+eltXQQ==} engines: {node: '>=18'} dependencies: - '@react-native/codegen': 0.73.3(@babel/preset-env@7.24.3) + '@react-native/codegen': 0.73.3(@babel/preset-env@7.24.4) transitivePeerDependencies: - '@babel/preset-env' - supports-color dev: false - /@react-native/babel-preset@0.73.21(@babel/core@7.24.3)(@babel/preset-env@7.24.3): + /@react-native/babel-preset@0.73.21(@babel/core@7.24.4)(@babel/preset-env@7.24.4): resolution: {integrity: sha512-WlFttNnySKQMeujN09fRmrdWqh46QyJluM5jdtDNrkl/2Hx6N4XeDUGhABvConeK95OidVO7sFFf7sNebVXogA==} engines: {node: '>=18'} peerDependencies: '@babel/core': '*' dependencies: - '@babel/core': 7.24.3 - '@babel/plugin-proposal-async-generator-functions': 7.20.7(@babel/core@7.24.3) - '@babel/plugin-proposal-class-properties': 7.18.6(@babel/core@7.24.3) - '@babel/plugin-proposal-export-default-from': 7.24.1(@babel/core@7.24.3) - '@babel/plugin-proposal-nullish-coalescing-operator': 7.18.6(@babel/core@7.24.3) - '@babel/plugin-proposal-numeric-separator': 7.18.6(@babel/core@7.24.3) - '@babel/plugin-proposal-object-rest-spread': 7.20.7(@babel/core@7.24.3) - '@babel/plugin-proposal-optional-catch-binding': 7.18.6(@babel/core@7.24.3) - '@babel/plugin-proposal-optional-chaining': 7.21.0(@babel/core@7.24.3) - '@babel/plugin-syntax-dynamic-import': 7.8.3(@babel/core@7.24.3) - '@babel/plugin-syntax-export-default-from': 7.24.1(@babel/core@7.24.3) - '@babel/plugin-syntax-flow': 7.24.1(@babel/core@7.24.3) - '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.24.3) - '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.24.3) - '@babel/plugin-transform-arrow-functions': 7.24.1(@babel/core@7.24.3) - '@babel/plugin-transform-async-to-generator': 7.24.1(@babel/core@7.24.3) - '@babel/plugin-transform-block-scoping': 7.24.1(@babel/core@7.24.3) - '@babel/plugin-transform-classes': 7.24.1(@babel/core@7.24.3) - '@babel/plugin-transform-computed-properties': 7.24.1(@babel/core@7.24.3) - '@babel/plugin-transform-destructuring': 7.24.1(@babel/core@7.24.3) - '@babel/plugin-transform-flow-strip-types': 7.24.1(@babel/core@7.24.3) - '@babel/plugin-transform-function-name': 7.24.1(@babel/core@7.24.3) - '@babel/plugin-transform-literals': 7.24.1(@babel/core@7.24.3) - '@babel/plugin-transform-modules-commonjs': 7.24.1(@babel/core@7.24.3) - '@babel/plugin-transform-named-capturing-groups-regex': 7.22.5(@babel/core@7.24.3) - '@babel/plugin-transform-parameters': 7.24.1(@babel/core@7.24.3) - '@babel/plugin-transform-private-methods': 7.24.1(@babel/core@7.24.3) - '@babel/plugin-transform-private-property-in-object': 7.24.1(@babel/core@7.24.3) - '@babel/plugin-transform-react-display-name': 7.24.1(@babel/core@7.24.3) - '@babel/plugin-transform-react-jsx': 7.23.4(@babel/core@7.24.3) - '@babel/plugin-transform-react-jsx-self': 7.24.1(@babel/core@7.24.3) - '@babel/plugin-transform-react-jsx-source': 7.24.1(@babel/core@7.24.3) - '@babel/plugin-transform-runtime': 7.24.3(@babel/core@7.24.3) - '@babel/plugin-transform-shorthand-properties': 7.24.1(@babel/core@7.24.3) - '@babel/plugin-transform-spread': 7.24.1(@babel/core@7.24.3) - '@babel/plugin-transform-sticky-regex': 7.24.1(@babel/core@7.24.3) - '@babel/plugin-transform-typescript': 7.24.1(@babel/core@7.24.3) - '@babel/plugin-transform-unicode-regex': 7.24.1(@babel/core@7.24.3) + '@babel/core': 7.24.4 + '@babel/plugin-proposal-async-generator-functions': 7.20.7(@babel/core@7.24.4) + '@babel/plugin-proposal-class-properties': 7.18.6(@babel/core@7.24.4) + '@babel/plugin-proposal-export-default-from': 7.24.1(@babel/core@7.24.4) + '@babel/plugin-proposal-nullish-coalescing-operator': 7.18.6(@babel/core@7.24.4) + '@babel/plugin-proposal-numeric-separator': 7.18.6(@babel/core@7.24.4) + '@babel/plugin-proposal-object-rest-spread': 7.20.7(@babel/core@7.24.4) + '@babel/plugin-proposal-optional-catch-binding': 7.18.6(@babel/core@7.24.4) + '@babel/plugin-proposal-optional-chaining': 7.21.0(@babel/core@7.24.4) + '@babel/plugin-syntax-dynamic-import': 7.8.3(@babel/core@7.24.4) + '@babel/plugin-syntax-export-default-from': 7.24.1(@babel/core@7.24.4) + '@babel/plugin-syntax-flow': 7.24.1(@babel/core@7.24.4) + '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.24.4) + '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.24.4) + '@babel/plugin-transform-arrow-functions': 7.24.1(@babel/core@7.24.4) + '@babel/plugin-transform-async-to-generator': 7.24.1(@babel/core@7.24.4) + '@babel/plugin-transform-block-scoping': 7.24.4(@babel/core@7.24.4) + '@babel/plugin-transform-classes': 7.24.1(@babel/core@7.24.4) + '@babel/plugin-transform-computed-properties': 7.24.1(@babel/core@7.24.4) + '@babel/plugin-transform-destructuring': 7.24.1(@babel/core@7.24.4) + '@babel/plugin-transform-flow-strip-types': 7.24.1(@babel/core@7.24.4) + '@babel/plugin-transform-function-name': 7.24.1(@babel/core@7.24.4) + '@babel/plugin-transform-literals': 7.24.1(@babel/core@7.24.4) + '@babel/plugin-transform-modules-commonjs': 7.24.1(@babel/core@7.24.4) + '@babel/plugin-transform-named-capturing-groups-regex': 7.22.5(@babel/core@7.24.4) + '@babel/plugin-transform-parameters': 7.24.1(@babel/core@7.24.4) + '@babel/plugin-transform-private-methods': 7.24.1(@babel/core@7.24.4) + '@babel/plugin-transform-private-property-in-object': 7.24.1(@babel/core@7.24.4) + '@babel/plugin-transform-react-display-name': 7.24.1(@babel/core@7.24.4) + '@babel/plugin-transform-react-jsx': 7.23.4(@babel/core@7.24.4) + '@babel/plugin-transform-react-jsx-self': 7.24.1(@babel/core@7.24.4) + '@babel/plugin-transform-react-jsx-source': 7.24.1(@babel/core@7.24.4) + '@babel/plugin-transform-runtime': 7.24.3(@babel/core@7.24.4) + '@babel/plugin-transform-shorthand-properties': 7.24.1(@babel/core@7.24.4) + '@babel/plugin-transform-spread': 7.24.1(@babel/core@7.24.4) + '@babel/plugin-transform-sticky-regex': 7.24.1(@babel/core@7.24.4) + '@babel/plugin-transform-typescript': 7.24.4(@babel/core@7.24.4) + '@babel/plugin-transform-unicode-regex': 7.24.1(@babel/core@7.24.4) '@babel/template': 7.24.0 - '@react-native/babel-plugin-codegen': 0.73.4(@babel/preset-env@7.24.3) - babel-plugin-transform-flow-enums: 0.0.2(@babel/core@7.24.3) + '@react-native/babel-plugin-codegen': 0.73.4(@babel/preset-env@7.24.4) + babel-plugin-transform-flow-enums: 0.0.2(@babel/core@7.24.4) react-refresh: 0.14.0 transitivePeerDependencies: - '@babel/preset-env' - supports-color dev: false - /@react-native/codegen@0.73.3(@babel/preset-env@7.24.3): + /@react-native/codegen@0.73.3(@babel/preset-env@7.24.4): resolution: {integrity: sha512-sxslCAAb8kM06vGy9Jyh4TtvjhcP36k/rvj2QE2Jdhdm61KvfafCATSIsOfc0QvnduWFcpXUPvAVyYwuv7PYDg==} engines: {node: '>=18'} peerDependencies: '@babel/preset-env': ^7.1.6 dependencies: - '@babel/parser': 7.24.1 - '@babel/preset-env': 7.24.3(@babel/core@7.24.3) + '@babel/parser': 7.24.4 + '@babel/preset-env': 7.24.4(@babel/core@7.24.4) flow-parser: 0.206.0 glob: 7.2.3 invariant: 2.2.4 - jscodeshift: 0.14.0(@babel/preset-env@7.24.3) + jscodeshift: 0.14.0(@babel/preset-env@7.24.4) mkdirp: 0.5.6 nullthrows: 1.1.1 transitivePeerDependencies: - supports-color dev: false - /@react-native/community-cli-plugin@0.73.17(@babel/core@7.24.3)(@babel/preset-env@7.24.3): + /@react-native/community-cli-plugin@0.73.17(@babel/core@7.24.4)(@babel/preset-env@7.24.4): resolution: {integrity: sha512-F3PXZkcHg+1ARIr6FRQCQiB7ZAA+MQXGmq051metRscoLvgYJwj7dgC8pvgy0kexzUkHu5BNKrZeySzUft3xuQ==} engines: {node: '>=18'} dependencies: '@react-native-community/cli-server-api': 12.3.6 '@react-native-community/cli-tools': 12.3.6 '@react-native/dev-middleware': 0.73.8 - '@react-native/metro-babel-transformer': 0.73.15(@babel/core@7.24.3)(@babel/preset-env@7.24.3) + '@react-native/metro-babel-transformer': 0.73.15(@babel/core@7.24.4)(@babel/preset-env@7.24.4) chalk: 4.1.2 execa: 5.1.1 - metro: 0.80.7 - metro-config: 0.80.7 - metro-core: 0.80.7 + metro: 0.80.8 + metro-config: 0.80.8 + metro-core: 0.80.8 node-fetch: 2.7.0 readline: 1.3.0 transitivePeerDependencies: @@ -3578,14 +4454,14 @@ packages: engines: {node: '>=18'} dev: false - /@react-native/metro-babel-transformer@0.73.15(@babel/core@7.24.3)(@babel/preset-env@7.24.3): + /@react-native/metro-babel-transformer@0.73.15(@babel/core@7.24.4)(@babel/preset-env@7.24.4): resolution: {integrity: sha512-LlkSGaXCz+xdxc9819plmpsl4P4gZndoFtpjN3GMBIu6f7TBV0GVbyJAU4GE8fuAWPVSVL5ArOcdkWKSbI1klw==} engines: {node: '>=18'} peerDependencies: '@babel/core': '*' dependencies: - '@babel/core': 7.24.3 - '@react-native/babel-preset': 0.73.21(@babel/core@7.24.3)(@babel/preset-env@7.24.3) + '@babel/core': 7.24.4 + '@react-native/babel-preset': 0.73.21(@babel/core@7.24.4)(@babel/preset-env@7.24.4) hermes-parser: 0.15.0 nullthrows: 1.1.1 transitivePeerDependencies: @@ -3605,7 +4481,7 @@ packages: dependencies: invariant: 2.2.4 nullthrows: 1.1.1 - react-native: 0.73.6(@babel/core@7.24.3)(@babel/preset-env@7.24.3)(react@18.2.0) + react-native: 0.73.6(@babel/core@7.24.4)(@babel/preset-env@7.24.4)(react@18.2.0) dev: false /@react-spring/animated@9.7.3(react@18.2.0): @@ -3656,118 +4532,134 @@ packages: react-dom: 18.2.0(react@18.2.0) dev: false - /@rollup/rollup-android-arm-eabi@4.13.0: - resolution: {integrity: sha512-5ZYPOuaAqEH/W3gYsRkxQATBW3Ii1MfaT4EQstTnLKViLi2gLSQmlmtTpGucNP3sXEpOiI5tdGhjdE111ekyEg==} + /@rollup/rollup-android-arm-eabi@4.14.1: + resolution: {integrity: sha512-fH8/o8nSUek8ceQnT7K4EQbSiV7jgkHq81m9lWZFIXjJ7lJzpWXbQFpT/Zh6OZYnpFykvzC3fbEvEAFZu03dPA==} cpu: [arm] os: [android] requiresBuild: true dev: true optional: true - /@rollup/rollup-android-arm64@4.13.0: - resolution: {integrity: sha512-BSbaCmn8ZadK3UAQdlauSvtaJjhlDEjS5hEVVIN3A4bbl3X+otyf/kOJV08bYiRxfejP3DXFzO2jz3G20107+Q==} + /@rollup/rollup-android-arm64@4.14.1: + resolution: {integrity: sha512-Y/9OHLjzkunF+KGEoJr3heiD5X9OLa8sbT1lm0NYeKyaM3oMhhQFvPB0bNZYJwlq93j8Z6wSxh9+cyKQaxS7PQ==} cpu: [arm64] os: [android] requiresBuild: true dev: true optional: true - /@rollup/rollup-darwin-arm64@4.13.0: - resolution: {integrity: sha512-Ovf2evVaP6sW5Ut0GHyUSOqA6tVKfrTHddtmxGQc1CTQa1Cw3/KMCDEEICZBbyppcwnhMwcDce9ZRxdWRpVd6g==} + /@rollup/rollup-darwin-arm64@4.14.1: + resolution: {integrity: sha512-+kecg3FY84WadgcuSVm6llrABOdQAEbNdnpi5X3UwWiFVhZIZvKgGrF7kmLguvxHNQy+UuRV66cLVl3S+Rkt+Q==} cpu: [arm64] os: [darwin] requiresBuild: true dev: true optional: true - /@rollup/rollup-darwin-x64@4.13.0: - resolution: {integrity: sha512-U+Jcxm89UTK592vZ2J9st9ajRv/hrwHdnvyuJpa5A2ngGSVHypigidkQJP+YiGL6JODiUeMzkqQzbCG3At81Gg==} + /@rollup/rollup-darwin-x64@4.14.1: + resolution: {integrity: sha512-2pYRzEjVqq2TB/UNv47BV/8vQiXkFGVmPFwJb+1E0IFFZbIX8/jo1olxqqMbo6xCXf8kabANhp5bzCij2tFLUA==} cpu: [x64] os: [darwin] requiresBuild: true dev: true optional: true - /@rollup/rollup-linux-arm-gnueabihf@4.13.0: - resolution: {integrity: sha512-8wZidaUJUTIR5T4vRS22VkSMOVooG0F4N+JSwQXWSRiC6yfEsFMLTYRFHvby5mFFuExHa/yAp9juSphQQJAijQ==} + /@rollup/rollup-linux-arm-gnueabihf@4.14.1: + resolution: {integrity: sha512-mS6wQ6Do6/wmrF9aTFVpIJ3/IDXhg1EZcQFYHZLHqw6AzMBjTHWnCG35HxSqUNphh0EHqSM6wRTT8HsL1C0x5g==} cpu: [arm] os: [linux] requiresBuild: true dev: true optional: true - /@rollup/rollup-linux-arm64-gnu@4.13.0: - resolution: {integrity: sha512-Iu0Kno1vrD7zHQDxOmvweqLkAzjxEVqNhUIXBsZ8hu8Oak7/5VTPrxOEZXYC1nmrBVJp0ZcL2E7lSuuOVaE3+w==} + /@rollup/rollup-linux-arm64-gnu@4.14.1: + resolution: {integrity: sha512-p9rGKYkHdFMzhckOTFubfxgyIO1vw//7IIjBBRVzyZebWlzRLeNhqxuSaZ7kCEKVkm/kuC9fVRW9HkC/zNRG2w==} cpu: [arm64] os: [linux] requiresBuild: true dev: true optional: true - /@rollup/rollup-linux-arm64-musl@4.13.0: - resolution: {integrity: sha512-C31QrW47llgVyrRjIwiOwsHFcaIwmkKi3PCroQY5aVq4H0A5v/vVVAtFsI1nfBngtoRpeREvZOkIhmRwUKkAdw==} + /@rollup/rollup-linux-arm64-musl@4.14.1: + resolution: {integrity: sha512-nDY6Yz5xS/Y4M2i9JLQd3Rofh5OR8Bn8qe3Mv/qCVpHFlwtZSBYSPaU4mrGazWkXrdQ98GB//H0BirGR/SKFSw==} cpu: [arm64] os: [linux] requiresBuild: true dev: true optional: true - /@rollup/rollup-linux-riscv64-gnu@4.13.0: - resolution: {integrity: sha512-Oq90dtMHvthFOPMl7pt7KmxzX7E71AfyIhh+cPhLY9oko97Zf2C9tt/XJD4RgxhaGeAraAXDtqxvKE1y/j35lA==} + /@rollup/rollup-linux-powerpc64le-gnu@4.14.1: + resolution: {integrity: sha512-im7HE4VBL+aDswvcmfx88Mp1soqL9OBsdDBU8NqDEYtkri0qV0THhQsvZtZeNNlLeCUQ16PZyv7cqutjDF35qw==} + cpu: [ppc64le] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@rollup/rollup-linux-riscv64-gnu@4.14.1: + resolution: {integrity: sha512-RWdiHuAxWmzPJgaHJdpvUUlDz8sdQz4P2uv367T2JocdDa98iRw2UjIJ4QxSyt077mXZT2X6pKfT2iYtVEvOFw==} cpu: [riscv64] os: [linux] requiresBuild: true dev: true optional: true - /@rollup/rollup-linux-x64-gnu@4.13.0: - resolution: {integrity: sha512-yUD/8wMffnTKuiIsl6xU+4IA8UNhQ/f1sAnQebmE/lyQ8abjsVyDkyRkWop0kdMhKMprpNIhPmYlCxgHrPoXoA==} + /@rollup/rollup-linux-s390x-gnu@4.14.1: + resolution: {integrity: sha512-VMgaGQ5zRX6ZqV/fas65/sUGc9cPmsntq2FiGmayW9KMNfWVG/j0BAqImvU4KTeOOgYSf1F+k6at1UfNONuNjA==} + cpu: [s390x] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@rollup/rollup-linux-x64-gnu@4.14.1: + resolution: {integrity: sha512-9Q7DGjZN+hTdJomaQ3Iub4m6VPu1r94bmK2z3UeWP3dGUecRC54tmVu9vKHTm1bOt3ASoYtEz6JSRLFzrysKlA==} cpu: [x64] os: [linux] requiresBuild: true dev: true optional: true - /@rollup/rollup-linux-x64-musl@4.13.0: - resolution: {integrity: sha512-9RyNqoFNdF0vu/qqX63fKotBh43fJQeYC98hCaf89DYQpv+xu0D8QFSOS0biA7cGuqJFOc1bJ+m2rhhsKcw1hw==} + /@rollup/rollup-linux-x64-musl@4.14.1: + resolution: {integrity: sha512-JNEG/Ti55413SsreTguSx0LOVKX902OfXIKVg+TCXO6Gjans/k9O6ww9q3oLGjNDaTLxM+IHFMeXy/0RXL5R/g==} cpu: [x64] os: [linux] requiresBuild: true dev: true optional: true - /@rollup/rollup-win32-arm64-msvc@4.13.0: - resolution: {integrity: sha512-46ue8ymtm/5PUU6pCvjlic0z82qWkxv54GTJZgHrQUuZnVH+tvvSP0LsozIDsCBFO4VjJ13N68wqrKSeScUKdA==} + /@rollup/rollup-win32-arm64-msvc@4.14.1: + resolution: {integrity: sha512-ryS22I9y0mumlLNwDFYZRDFLwWh3aKaC72CWjFcFvxK0U6v/mOkM5Up1bTbCRAhv3kEIwW2ajROegCIQViUCeA==} cpu: [arm64] os: [win32] requiresBuild: true dev: true optional: true - /@rollup/rollup-win32-ia32-msvc@4.13.0: - resolution: {integrity: sha512-P5/MqLdLSlqxbeuJ3YDeX37srC8mCflSyTrUsgbU1c/U9j6l2g2GiIdYaGD9QjdMQPMSgYm7hgg0551wHyIluw==} + /@rollup/rollup-win32-ia32-msvc@4.14.1: + resolution: {integrity: sha512-TdloItiGk+T0mTxKx7Hp279xy30LspMso+GzQvV2maYePMAWdmrzqSNZhUpPj3CGw12aGj57I026PgLCTu8CGg==} cpu: [ia32] os: [win32] requiresBuild: true dev: true optional: true - /@rollup/rollup-win32-x64-msvc@4.13.0: - resolution: {integrity: sha512-UKXUQNbO3DOhzLRwHSpa0HnhhCgNODvfoPWv2FCXme8N/ANFfhIPMGuOT+QuKd16+B5yxZ0HdpNlqPvTMS1qfw==} + /@rollup/rollup-win32-x64-msvc@4.14.1: + resolution: {integrity: sha512-wQGI+LY/Py20zdUPq+XCem7JcPOyzIJBm3dli+56DJsQOHbnXZFEwgmnC6el1TPAfC8lBT3m+z69RmLykNUbew==} cpu: [x64] os: [win32] requiresBuild: true dev: true optional: true - /@rushstack/eslint-patch@1.8.0: - resolution: {integrity: sha512-0HejFckBN2W+ucM6cUOlwsByTKt9/+0tWhqUffNIcHqCXkthY/mZ7AuYPK/2IIaGWhdl0h+tICDO0ssLMd6XMQ==} + /@rushstack/eslint-patch@1.10.1: + resolution: {integrity: sha512-S3Kq8e7LqxkA9s7HKLqXGTGck1uwis5vAXan3FnU5yw1Ec5hsSGnq4s/UCaSqABPOnOTg7zASLyst7+ohgWexg==} dev: true - /@safe-global/safe-apps-provider@0.18.1(typescript@5.4.3)(zod@3.22.4): + /@safe-global/safe-apps-provider@0.18.1(typescript@5.4.4)(zod@3.22.4): resolution: {integrity: sha512-V4a05A3EgJcriqtDoJklDz1BOinWhC6P0hjUSxshA4KOZM7rGPCTto/usXs09zr1vvL28evl/NldSTv97j2bmg==} dependencies: - '@safe-global/safe-apps-sdk': 8.1.0(typescript@5.4.3)(zod@3.22.4) + '@safe-global/safe-apps-sdk': 8.1.0(typescript@5.4.4)(zod@3.22.4) events: 3.3.0 transitivePeerDependencies: - bufferutil @@ -3776,11 +4668,11 @@ packages: - zod dev: false - /@safe-global/safe-apps-sdk@8.1.0(typescript@5.4.3)(zod@3.22.4): + /@safe-global/safe-apps-sdk@8.1.0(typescript@5.4.4)(zod@3.22.4): resolution: {integrity: sha512-XJbEPuaVc7b9n23MqlF6c+ToYIS3f7P2Sel8f3cSBQ9WORE4xrSuvhMpK9fDSFqJ7by/brc+rmJR/5HViRr0/w==} dependencies: '@safe-global/safe-gateway-typescript-sdk': 3.19.0 - viem: 1.21.4(typescript@5.4.3)(zod@3.22.4) + viem: 1.21.4(typescript@5.4.4)(zod@3.22.4) transitivePeerDependencies: - bufferutil - typescript @@ -3795,7 +4687,14 @@ packages: /@scure/base@1.1.6: resolution: {integrity: sha512-ok9AWwhcgYuGG3Zfhyqg+zwl+Wn5uE+dwC0NV/2qQkx4dABbb/bx96vWu8NSj+BNjjSjno+JRYRjle1jV08k3g==} - dev: false + + /@scure/bip32@1.1.5: + resolution: {integrity: sha512-XyNh1rB0SkEqd3tXcXMi+Xe1fvg+kUIcoRIEujP1Jgv7DqW2r9lg3Ah0NkFaCs9sTkQAQA8kw7xiRXzENi9Rtw==} + dependencies: + '@noble/hashes': 1.2.0 + '@noble/secp256k1': 1.7.1 + '@scure/base': 1.1.6 + dev: true /@scure/bip32@1.3.2: resolution: {integrity: sha512-N1ZhksgwD3OBlwTv3R6KFEcPojl/W4ElJOeCZdi+vuI5QmTFwLq3OFf2zd2ROpKvxFdgZ6hUpb0dx9bVNEwYCA==} @@ -3811,7 +4710,13 @@ packages: '@noble/curves': 1.3.0 '@noble/hashes': 1.3.3 '@scure/base': 1.1.6 - dev: false + + /@scure/bip39@1.1.1: + resolution: {integrity: sha512-t+wDck2rVkh65Hmv280fYdVdY25J9YeEUIgn2LG1WM6gxFkGzcksoDiUkWVpVp3Oex9xGC68JU2dSbUfwZ2jPg==} + dependencies: + '@noble/hashes': 1.2.0 + '@scure/base': 1.1.6 + dev: true /@scure/bip39@1.2.1: resolution: {integrity: sha512-Z3/Fsz1yr904dduJD0NpiyRHhRYHdcnyh73FZWiV+/qhWi83wNJ3NWolYqCEN+ZWsUz2TWwajJggcRE9r1zUYg==} @@ -3825,7 +4730,76 @@ packages: dependencies: '@noble/hashes': 1.3.3 '@scure/base': 1.1.6 - dev: false + + /@sentry/core@5.30.0: + resolution: {integrity: sha512-TmfrII8w1PQZSZgPpUESqjB+jC6MvZJZdLtE/0hZ+SrnKhW3x5WlYLvTXZpcWePYBku7rl2wn1RZu6uT0qCTeg==} + engines: {node: '>=6'} + dependencies: + '@sentry/hub': 5.30.0 + '@sentry/minimal': 5.30.0 + '@sentry/types': 5.30.0 + '@sentry/utils': 5.30.0 + tslib: 1.14.1 + dev: true + + /@sentry/hub@5.30.0: + resolution: {integrity: sha512-2tYrGnzb1gKz2EkMDQcfLrDTvmGcQPuWxLnJKXJvYTQDGLlEvi2tWz1VIHjunmOvJrB5aIQLhm+dcMRwFZDCqQ==} + engines: {node: '>=6'} + dependencies: + '@sentry/types': 5.30.0 + '@sentry/utils': 5.30.0 + tslib: 1.14.1 + dev: true + + /@sentry/minimal@5.30.0: + resolution: {integrity: sha512-BwWb/owZKtkDX+Sc4zCSTNcvZUq7YcH3uAVlmh/gtR9rmUvbzAA3ewLuB3myi4wWRAMEtny6+J/FN/x+2wn9Xw==} + engines: {node: '>=6'} + dependencies: + '@sentry/hub': 5.30.0 + '@sentry/types': 5.30.0 + tslib: 1.14.1 + dev: true + + /@sentry/node@5.30.0: + resolution: {integrity: sha512-Br5oyVBF0fZo6ZS9bxbJZG4ApAjRqAnqFFurMVJJdunNb80brh7a5Qva2kjhm+U6r9NJAB5OmDyPkA1Qnt+QVg==} + engines: {node: '>=6'} + dependencies: + '@sentry/core': 5.30.0 + '@sentry/hub': 5.30.0 + '@sentry/tracing': 5.30.0 + '@sentry/types': 5.30.0 + '@sentry/utils': 5.30.0 + cookie: 0.4.2 + https-proxy-agent: 5.0.1 + lru_map: 0.3.3 + tslib: 1.14.1 + transitivePeerDependencies: + - supports-color + dev: true + + /@sentry/tracing@5.30.0: + resolution: {integrity: sha512-dUFowCr0AIMwiLD7Fs314Mdzcug+gBVo/+NCMyDw8tFxJkwWAKl7Qa2OZxLQ0ZHjakcj1hNKfCQJ9rhyfOl4Aw==} + engines: {node: '>=6'} + dependencies: + '@sentry/hub': 5.30.0 + '@sentry/minimal': 5.30.0 + '@sentry/types': 5.30.0 + '@sentry/utils': 5.30.0 + tslib: 1.14.1 + dev: true + + /@sentry/types@5.30.0: + resolution: {integrity: sha512-R8xOqlSTZ+htqrfteCWU5Nk0CDN5ApUTvrlvBuiH1DyP6czDZ4ktbZB0hAgBlVcK0U+qpD3ag3Tqqpa5Q67rPw==} + engines: {node: '>=6'} + dev: true + + /@sentry/utils@5.30.0: + resolution: {integrity: sha512-zaYmoH0NWWtvnJjC9/CBseXMtKHm/tm40sz3YfJRxeQjyzRqNQPgivpd9R/oDJCYj999mzdW382p/qi2ypjLww==} + engines: {node: '>=6'} + dependencies: + '@sentry/types': 5.30.0 + tslib: 1.14.1 + dev: true /@sideway/address@4.1.5: resolution: {integrity: sha512-IqO/DUQHUkPeixNQ8n0JA6102hT9CmaljNTPmQ1u8MEhBo/R4Q8eKLN/vGZxuebwOroDB4cbpjheD4+/sKFK4Q==} @@ -3844,6 +4818,11 @@ packages: /@sinclair/typebox@0.27.8: resolution: {integrity: sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==} + /@sindresorhus/is@4.6.0: + resolution: {integrity: sha512-t09vSN3MdfsyCHoFcTRCH/iUtG7OJ0CsjzB8cjAmKc/va/kIgeDI/TxsigdncE/4be734m0cvIYwNaV4i2XqAw==} + engines: {node: '>=10'} + dev: true + /@sinonjs/commons@3.0.1: resolution: {integrity: sha512-K3mCHKQ9sVh8o1C9cxkwxaOmXoAMlDxC1mYyHrjqOWEcBjYr76t96zL2zlj5dUGZ3HSw240X1qgH3Mjf1yJWpQ==} dependencies: @@ -3860,6 +4839,16 @@ packages: resolution: {integrity: sha512-+9jVqKhRSpsc591z5vX+X5Yyw+he/HCB4iQ/RYxw35CEPaY1gnsNE43nf9n9AaYjAQrTiI/mOwKUKdUs9vf7Xg==} dev: false + /@solidity-parser/parser@0.14.5: + resolution: {integrity: sha512-6dKnHZn7fg/iQATVEzqyUOyEidbn05q7YA2mQ9hC0MMXhhV3/JrsxmFSYZAcr7j1yUP700LLhTruvJ3MiQmjJg==} + dependencies: + antlr4ts: 0.5.0-alpha.4 + dev: true + + /@solidity-parser/parser@0.18.0: + resolution: {integrity: sha512-yfORGUIPgLck41qyN7nbwJRAx17/jAIXCTanHOJZhB6PJ1iAk/84b/xlsVKFSyNyLXIj0dhppoE0+CRws7wlzA==} + dev: true + /@stablelib/aead@1.0.1: resolution: {integrity: sha512-q39ik6sxGHewqtO0nP4BuSe3db5G1fEJE8ukvngS2gLkBXyy6E7pLubhbYgnkDFv6V8cWaxcE4Xn0t6LWcJkyg==} dev: false @@ -3982,25 +4971,53 @@ packages: tslib: 2.6.2 dev: false - /@tanstack/query-core@5.28.6: - resolution: {integrity: sha512-hnhotV+DnQtvtR3jPvbQMPNMW4KEK0J4k7c609zJ8muiNknm+yoDyMHmxTWM5ZnlZpsz0zOxYFr+mzRJNHWJsA==} + /@szmarczak/http-timer@4.0.6: + resolution: {integrity: sha512-4BAffykYOgO+5nzBWYwE3W90sBgLJoUPRWWcL8wlyiM8IB8ipJz3UMJ9KXQd1RKQXpKp8Tutn80HZtWsu2u76w==} + engines: {node: '>=10'} + dependencies: + defer-to-connect: 2.0.1 + dev: true + + /@szmarczak/http-timer@5.0.1: + resolution: {integrity: sha512-+PmQX0PiAYPMeVYe237LJAYvOMYW1j2rH5YROyS3b4CTVJum34HfRvKvAzozHAQG0TnHNdUfY9nCeUyRAs//cw==} + engines: {node: '>=14.16'} + dependencies: + defer-to-connect: 2.0.1 + dev: true + + /@tanstack/query-core@5.29.0: + resolution: {integrity: sha512-WgPTRs58hm9CMzEr5jpISe8HXa3qKQ8CxewdYZeVnA54JrPY9B1CZiwsCoLpLkf0dGRZq+LcX5OiJb0bEsOFww==} dev: false - /@tanstack/react-query@5.28.6(react@18.2.0): - resolution: {integrity: sha512-/DdYuDBSsA21Qbcder1R8Cr/3Nx0ZnA2lgtqKsLMvov8wL4+g0HBz/gWYZPlIsof7iyfQafyhg4wUVUsS3vWZw==} + /@tanstack/react-query@5.29.0(react@18.2.0): + resolution: {integrity: sha512-yxlhHB73jaBla6h5B6zPaGmQjokkzAhMHN4veotkPNiQ3Ac/mCxgABRZPsJJrgCTvhpcncBZcDBFxaR2B37vug==} peerDependencies: react: ^18.0.0 dependencies: - '@tanstack/query-core': 5.28.6 + '@tanstack/query-core': 5.29.0 react: 18.2.0 dev: false + /@testing-library/dom@10.0.0: + resolution: {integrity: sha512-PmJPnogldqoVFf+EwbHvbBJ98MmqASV8kLrBYgsDNxQcFMeIS7JFL48sfyXvuMtgmWO/wMhh25odr+8VhDmn4g==} + engines: {node: '>=18'} + dependencies: + '@babel/code-frame': 7.24.2 + '@babel/runtime': 7.24.4 + '@types/aria-query': 5.0.4 + aria-query: 5.3.0 + chalk: 4.1.2 + dom-accessibility-api: 0.5.16 + lz-string: 1.5.0 + pretty-format: 27.5.1 + dev: true + /@testing-library/dom@9.3.4: resolution: {integrity: sha512-FlS4ZWlp97iiNWig0Muq8p+3rVDjRiYE+YKGbAqXOu9nwJFFOdL00kFpz42M+4huzYi86vAK1sOOfyOG45muIQ==} engines: {node: '>=14'} dependencies: '@babel/code-frame': 7.24.2 - '@babel/runtime': 7.24.1 + '@babel/runtime': 7.24.4 '@types/aria-query': 5.0.4 aria-query: 5.1.3 chalk: 4.1.2 @@ -4031,50 +5048,185 @@ packages: optional: true dependencies: '@adobe/css-tools': 4.3.3 - '@babel/runtime': 7.23.9 + '@babel/runtime': 7.24.4 aria-query: 5.3.0 chalk: 3.0.0 css.escape: 1.5.1 dom-accessibility-api: 0.6.3 lodash: 4.17.21 redent: 3.0.0 - vitest: 1.4.0(@types/node@20.11.30)(jsdom@24.0.0) + vitest: 1.4.0(@types/node@20.12.5)(jsdom@24.0.0) dev: true - /@testing-library/react@14.2.2(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-SOUuM2ysCvjUWBXTNfQ/ztmnKDmqaiPV3SvoIuyxMUca45rbSWWAT/qB8CUs/JQ/ux/8JFs9DNdFQ3f6jH3crA==} + /@testing-library/react@14.3.0(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-AYJGvNFMbCa5vt1UtDCa/dcaABrXq8gph6VN+cffIx0UeA0qiGqS+sT60+sb+Gjc8tGXdECWYQgaF0khf8b+Lg==} engines: {node: '>=14'} peerDependencies: react: ^18.0.0 react-dom: ^18.0.0 dependencies: - '@babel/runtime': 7.24.1 + '@babel/runtime': 7.24.4 '@testing-library/dom': 9.3.4 - '@types/react-dom': 18.2.22 + '@types/react-dom': 18.2.24 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) dev: true - /@testing-library/user-event@14.5.2(@testing-library/dom@9.3.4): + /@testing-library/user-event@14.5.2(@testing-library/dom@10.0.0): resolution: {integrity: sha512-YAh82Wh4TIrxYLmfGcixwD18oIjyC1pFQC2Y01F2lzV2HTMiYrI0nze0FD0ocB//CKS/7jIUgae+adPqxK5yCQ==} engines: {node: '>=12', npm: '>=6'} peerDependencies: '@testing-library/dom': '>=7.21.4' dependencies: - '@testing-library/dom': 9.3.4 + '@testing-library/dom': 10.0.0 + dev: true + + /@truffle/abi-utils@1.0.3: + resolution: {integrity: sha512-AWhs01HCShaVKjml7Z4AbVREr/u4oiWxCcoR7Cktm0mEvtT04pvnxW5xB/cI4znRkrbPdFQlFt67kgrAjesYkw==} + engines: {node: ^16.20 || ^18.16 || >=20} + deprecated: Package no longer supported. Contact Support at https://www.npmjs.com/support for more info. + dependencies: + change-case: 3.0.2 + fast-check: 3.1.1 + web3-utils: 1.10.0 + dev: true + + /@truffle/blockchain-utils@0.1.9: + resolution: {integrity: sha512-RHfumgbIVo68Rv9ofDYfynjnYZIfP/f1vZy4RoqkfYAO+fqfc58PDRzB1WAGq2U6GPuOnipOJxQhnqNnffORZg==} + engines: {node: ^16.20 || ^18.16 || >=20} + deprecated: Package no longer supported. Contact Support at https://www.npmjs.com/support for more info. + dev: true + + /@truffle/codec@0.17.3: + resolution: {integrity: sha512-Ko/+dsnntNyrJa57jUD9u4qx9nQby+H4GsUO6yjiCPSX0TQnEHK08XWqBSg0WdmCH2+h0y1nr2CXSx8gbZapxg==} + engines: {node: ^16.20 || ^18.16 || >=20} + deprecated: Package no longer supported. Contact Support at https://www.npmjs.com/support for more info. + dependencies: + '@truffle/abi-utils': 1.0.3 + '@truffle/compile-common': 0.9.8 + big.js: 6.2.1 + bn.js: 5.2.1 + cbor: 5.2.0 + debug: 4.3.4(supports-color@5.5.0) + lodash: 4.17.21 + semver: 7.6.0 + utf8: 3.0.0 + web3-utils: 1.10.0 + transitivePeerDependencies: + - supports-color + dev: true + + /@truffle/compile-common@0.9.8: + resolution: {integrity: sha512-DTpiyo32t/YhLI1spn84D3MHYHrnoVqO+Gp7ZHrYNwDs86mAxtNiH5lsVzSb8cPgiqlvNsRCU9nm9R0YmKMTBQ==} + engines: {node: ^16.20 || ^18.16 || >=20} + deprecated: Package no longer supported. Contact Support at https://www.npmjs.com/support for more info. + dependencies: + '@truffle/error': 0.2.2 + colors: 1.4.0 + dev: true + + /@truffle/contract-schema@3.4.16: + resolution: {integrity: sha512-g0WNYR/J327DqtJPI70ubS19K1Fth/1wxt2jFqLsPmz5cGZVjCwuhiie+LfBde4/Mc9QR8G+L3wtmT5cyoBxAg==} + engines: {node: ^16.20 || ^18.16 || >=20} + deprecated: Package no longer supported. Contact Support at https://www.npmjs.com/support for more info. + dependencies: + ajv: 6.12.6 + debug: 4.3.4(supports-color@5.5.0) + transitivePeerDependencies: + - supports-color + dev: true + + /@truffle/contract@4.6.31: + resolution: {integrity: sha512-s+oHDpXASnZosiCdzu+X1Tx5mUJUs1L1CYXIcgRmzMghzqJkaUFmR6NpNo7nJYliYbO+O9/aW8oCKqQ7rCHfmQ==} + engines: {node: ^16.20 || ^18.16 || >=20} + deprecated: Package no longer supported. Contact Support at https://www.npmjs.com/support for more info. + dependencies: + '@ensdomains/ensjs': 2.1.0 + '@truffle/blockchain-utils': 0.1.9 + '@truffle/contract-schema': 3.4.16 + '@truffle/debug-utils': 6.0.57 + '@truffle/error': 0.2.2 + '@truffle/interface-adapter': 0.5.37 + bignumber.js: 7.2.1 + debug: 4.3.4(supports-color@5.5.0) + ethers: 4.0.49 + web3: 1.10.0 + web3-core-helpers: 1.10.0 + web3-core-promievent: 1.10.0 + web3-eth-abi: 1.10.0 + web3-utils: 1.10.0 + transitivePeerDependencies: + - bufferutil + - encoding + - supports-color + - utf-8-validate + dev: true + + /@truffle/debug-utils@6.0.57: + resolution: {integrity: sha512-Q6oI7zLaeNLB69ixjwZk2UZEWBY6b2OD1sjLMGDKBGR7GaHYiw96GLR2PFgPH1uwEeLmV4N78LYaQCrDsHbNeA==} + engines: {node: ^16.20 || ^18.16 || >=20} + deprecated: Package no longer supported. Contact Support at https://www.npmjs.com/support for more info. + dependencies: + '@truffle/codec': 0.17.3 + '@trufflesuite/chromafi': 3.0.0 + bn.js: 5.2.1 + chalk: 2.4.2 + debug: 4.3.4(supports-color@5.5.0) + highlightjs-solidity: 2.0.6 + transitivePeerDependencies: + - supports-color + dev: true + + /@truffle/error@0.1.1: + resolution: {integrity: sha512-sE7c9IHIGdbK4YayH4BC8i8qMjoAOeg6nUXUDZZp8wlU21/EMpaG+CLx+KqcIPyR+GSWIW3Dm0PXkr2nlggFDA==} + deprecated: Package no longer supported. Contact Support at https://www.npmjs.com/support for more info. + dev: true + + /@truffle/error@0.2.2: + resolution: {integrity: sha512-TqbzJ0O8DHh34cu8gDujnYl4dUl6o2DE4PR6iokbybvnIm/L2xl6+Gv1VC+YJS45xfH83Yo3/Zyg/9Oq8/xZWg==} + engines: {node: ^16.20 || ^18.16 || >=20} + deprecated: Package no longer supported. Contact Support at https://www.npmjs.com/support for more info. + dev: true + + /@truffle/interface-adapter@0.5.37: + resolution: {integrity: sha512-lPH9MDgU+7sNDlJSClwyOwPCfuOimqsCx0HfGkznL3mcFRymc1pukAR1k17zn7ErHqBwJjiKAZ6Ri72KkS+IWw==} + engines: {node: ^16.20 || ^18.16 || >=20} + deprecated: Package no longer supported. Contact Support at https://www.npmjs.com/support for more info. + dependencies: + bn.js: 5.2.1 + ethers: 4.0.49 + web3: 1.10.0 + transitivePeerDependencies: + - bufferutil + - encoding + - supports-color + - utf-8-validate + dev: true + + /@trufflesuite/chromafi@3.0.0: + resolution: {integrity: sha512-oqWcOqn8nT1bwlPPfidfzS55vqcIDdpfzo3HbU9EnUmcSTX+I8z0UyUFI3tZQjByVJulbzxHxUGS3ZJPwK/GPQ==} + dependencies: + camelcase: 4.1.0 + chalk: 2.4.2 + cheerio: 1.0.0-rc.12 + detect-indent: 5.0.0 + highlight.js: 10.7.3 + lodash.merge: 4.6.2 + strip-ansi: 4.0.0 + strip-indent: 2.0.0 dev: true /@ts-morph/common@0.22.0: resolution: {integrity: sha512-HqNBuV/oIlMKdkLshXd1zKBqNQCsuPEsgQOkfFQ/eUKjRlwndXW1AjN9LVkBEIukm00gGXSRmfkl0Wv5VXLnlw==} dependencies: fast-glob: 3.3.2 - minimatch: 9.0.3 + minimatch: 9.0.4 mkdirp: 3.0.1 path-browserify: 1.0.1 dev: true - /@tsconfig/node10@1.0.9: - resolution: {integrity: sha512-jNsYVVxU8v5g43Erja32laIDHXeoNvFEpX33OK4d6hljo3jDhCBDhx5dhCCTMWUojscpAagGiRkBKxpdl9fxqA==} + /@tsconfig/node10@1.0.11: + resolution: {integrity: sha512-DcRjDCujK/kCk/cUe8Xz8ZSpm8mS3mNNpta+jGCA6USEDfktlNvm1+IuZ9eTcDbNk41BHwpHHeW+N1lKCz4zOw==} dev: true /@tsconfig/node12@1.0.11: @@ -4089,10 +5241,85 @@ packages: resolution: {integrity: sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==} dev: true + /@typechain/ethers-v5@10.2.1(@ethersproject/abi@5.7.0)(@ethersproject/providers@5.7.2)(ethers@5.7.2)(typechain@8.3.2)(typescript@5.4.4): + resolution: {integrity: sha512-n3tQmCZjRE6IU4h6lqUGiQ1j866n5MTCBJreNEHHVWXa2u9GJTaeYyU1/k+1qLutkyw+sS6VAN+AbeiTqsxd/A==} + peerDependencies: + '@ethersproject/abi': ^5.0.0 + '@ethersproject/providers': ^5.0.0 + ethers: ^5.1.3 + typechain: ^8.1.1 + typescript: '>=4.3.0' + dependencies: + '@ethersproject/abi': 5.7.0 + '@ethersproject/providers': 5.7.2 + ethers: 5.7.2 + lodash: 4.17.21 + ts-essentials: 7.0.3(typescript@5.4.4) + typechain: 8.3.2(typescript@5.4.4) + typescript: 5.4.4 + dev: true + + /@typechain/hardhat@6.1.6(@ethersproject/abi@5.7.0)(@ethersproject/providers@5.7.2)(@typechain/ethers-v5@10.2.1)(ethers@5.7.2)(hardhat@2.22.2)(typechain@8.3.2): + resolution: {integrity: sha512-BiVnegSs+ZHVymyidtK472syodx1sXYlYJJixZfRstHVGYTi8V1O7QG4nsjyb0PC/LORcq7sfBUcHto1y6UgJA==} + peerDependencies: + '@ethersproject/abi': ^5.4.7 + '@ethersproject/providers': ^5.4.7 + '@typechain/ethers-v5': ^10.2.1 + ethers: ^5.4.7 + hardhat: ^2.9.9 + typechain: ^8.1.1 + dependencies: + '@ethersproject/abi': 5.7.0 + '@ethersproject/providers': 5.7.2 + '@typechain/ethers-v5': 10.2.1(@ethersproject/abi@5.7.0)(@ethersproject/providers@5.7.2)(ethers@5.7.2)(typechain@8.3.2)(typescript@5.4.4) + ethers: 5.7.2 + fs-extra: 9.1.0 + hardhat: 2.22.2(ts-node@10.9.2)(typescript@5.4.4) + typechain: 8.3.2(typescript@5.4.4) + dev: true + /@types/aria-query@5.0.4: resolution: {integrity: sha512-rfT93uj5s0PRL7EzccGMs3brplhcrghnDoV26NqKhCAS1hVo+WdNsPvE/yb6ilfr5hi2MEk6d5EWJTKdxg8jVw==} dev: true + /@types/bignumber.js@5.0.0: + resolution: {integrity: sha512-0DH7aPGCClywOFaxxjE6UwpN2kQYe9LwuDQMv+zYA97j5GkOMo8e66LYT+a8JYU7jfmUFRZLa9KycxHDsKXJCA==} + deprecated: This is a stub types definition for bignumber.js (https://github.com/MikeMcl/bignumber.js/). bignumber.js provides its own type definitions, so you don't need @types/bignumber.js installed! + dependencies: + bignumber.js: 9.1.2 + dev: true + + /@types/bn.js@4.11.6: + resolution: {integrity: sha512-pqr857jrp2kPuO9uRjZ3PwnJTjoQy+fcdxvBTvHm6dkmEL9q+hDD/2j/0ELOBPtPnS8LjCX0gI9nbl8lVkadpg==} + dependencies: + '@types/node': 20.12.5 + dev: true + + /@types/bn.js@5.1.5: + resolution: {integrity: sha512-V46N0zwKRF5Q00AZ6hWtN0T8gGmDUaUzLWQvHFo5yThtVwK/VCenFY3wXVbOvNfajEpsTfQM4IN9k/d6gUVX3A==} + dependencies: + '@types/node': 20.12.5 + dev: true + + /@types/cacheable-request@6.0.3: + resolution: {integrity: sha512-IQ3EbTzGxIigb1I3qPZc1rWJnH0BmSKv5QYTalEwweFvyBDLSAe24zP0le/hyi7ecGfZVlIVAg4BZqb8WBwKqw==} + dependencies: + '@types/http-cache-semantics': 4.0.4 + '@types/keyv': 3.1.4 + '@types/node': 20.12.5 + '@types/responselike': 1.0.3 + dev: true + + /@types/chai-as-promised@7.1.8: + resolution: {integrity: sha512-ThlRVIJhr69FLlh6IctTXFkmhtP3NpMZ2QGq69StYLyKZFp/HOp1VdKZj7RvfNWYYcJ1xlbLGLLWj1UvP5u/Gw==} + dependencies: + '@types/chai': 4.3.14 + dev: true + + /@types/chai@4.3.14: + resolution: {integrity: sha512-Wj71sXE4Q4AkGdG9Tvq1u/fquNz9EdG4LIJMwVVII7ashjD/8cf8fyIfJAjRr6YcsXnSE8cOGQPq1gqeR8z+3w==} + dev: true + /@types/chrome@0.0.136: resolution: {integrity: sha512-XDEiRhLkMd+SB7Iw3ZUIj/fov3wLd4HyTdLltVszkgl1dBfc3Rb7oPMVZ2Mz2TLqnF7Ow+StbR8E7r9lqpb4DA==} dependencies: @@ -4100,6 +5327,12 @@ packages: '@types/har-format': 1.2.15 dev: false + /@types/concat-stream@1.6.1: + resolution: {integrity: sha512-eHE4cQPoj6ngxBZMvVf6Hw7Mh4jMW4U9lpGmS5GBPB9RYxlFg+CHaVN7ErNY4W9XfLIEn20b4VDYaIrbq0q4uA==} + dependencies: + '@types/node': 20.12.5 + dev: true + /@types/debug@4.1.12: resolution: {integrity: sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ==} dependencies: @@ -4124,10 +5357,34 @@ packages: resolution: {integrity: sha512-xFU8ZXTw4gd358lb2jw25nxY9QAgqn2+bKKjKOYfNCzN4DKCFetK7sPtrlpg66Ywe3vWY9FNxprZawAh9wfJ3g==} dev: false + /@types/form-data@0.0.33: + resolution: {integrity: sha512-8BSvG1kGm83cyJITQMZSulnl6QV8jqAGreJsc5tPu1Jq0vTSOiY/k24Wx82JRpWwZSqrala6sd5rWi6aNXvqcw==} + dependencies: + '@types/node': 20.12.5 + dev: true + + /@types/fs-extra@11.0.4: + resolution: {integrity: sha512-yTbItCNreRooED33qjunPthRcSjERP1r4MqCZc7wv0u2sUkzTFp45tgUfS5+r7FrZPdmCCNflLhVSP/o+SemsQ==} + dependencies: + '@types/jsonfile': 6.1.4 + '@types/node': 20.12.5 + dev: true + + /@types/glob@7.2.0: + resolution: {integrity: sha512-ZUxbzKl0IfJILTS6t7ip5fQQM/J3TJYubDm3nMbgubNNYS62eXeUpoLUC8/7fJNiFYHTrGPQn7hspDUzIHX3UA==} + dependencies: + '@types/minimatch': 5.1.2 + '@types/node': 20.12.5 + dev: true + /@types/har-format@1.2.15: resolution: {integrity: sha512-RpQH4rXLuvTXKR0zqHq3go0RVXYv/YVqv4TnPH95VbwUxZdQlK1EtcMvQvMpDngHbt13Csh9Z4qT9AbkiQH5BA==} dev: false + /@types/http-cache-semantics@4.0.4: + resolution: {integrity: sha512-1m0bIFVc7eJWyve9S0RnuRgcQqF/Xd5QsUZAZeQFr1Q3/p9JWoQQEqmVy+DPTNpGXwhgIetAoYF8JSc33q29QA==} + dev: true + /@types/istanbul-lib-coverage@2.0.6: resolution: {integrity: sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w==} dev: false @@ -4152,47 +5409,112 @@ packages: resolution: {integrity: sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==} dev: true + /@types/jsonfile@6.1.4: + resolution: {integrity: sha512-D5qGUYwjvnNNextdU59/+fI+spnwtTFmyQP0h+PfIOSkNfpU6AOICUOkm4i0OnSk+NyjdPJrxCDro0sJsWlRpQ==} + dependencies: + '@types/node': 20.12.5 + dev: true + + /@types/keyv@3.1.4: + resolution: {integrity: sha512-BQ5aZNSCpj7D6K2ksrRCTmKRLEpnPvWDiLPfoGyhZ++8YtiK9d/3DBKPJgry359X/P1PfruyYwvnvwFjuEiEIg==} + dependencies: + '@types/node': 20.12.5 + dev: true + + /@types/lru-cache@5.1.1: + resolution: {integrity: sha512-ssE3Vlrys7sdIzs5LOxCzTVMsU7i9oa/IaW92wF32JFb3CVczqOkru2xspuKczHEbG3nvmPY7IFqVmGGHdNbYw==} + dev: true + + /@types/minimatch@5.1.2: + resolution: {integrity: sha512-K0VQKziLUWkVKiRVrx4a40iPaxTUefQmjtkQofBkYRcoaaL/8rhwDWww9qWbrgicNOgnpIsMxyNIUM4+n6dUIA==} + dev: true + + /@types/minimist@1.2.5: + resolution: {integrity: sha512-hov8bUuiLiyFPGyFPE1lwWhmzYbirOXQNNo40+y3zow8aFVTeyn3VWL0VFFfdNddA8S4Vf0Tc062rzyNr7Paag==} + dev: true + + /@types/mocha@10.0.6: + resolution: {integrity: sha512-dJvrYWxP/UcXm36Qn36fxhUKu8A/xMRXVT2cliFF1Z7UA9liG5Psj3ezNSZw+5puH2czDXRLcXQxf8JbJt0ejg==} + dev: true + /@types/ms@0.7.34: resolution: {integrity: sha512-nG96G3Wp6acyAgJqGasjODb+acrI7KltPiRxzHPXnP3NgI28bpQDRv53olbqGXbfcgF5aiiHmO3xpwEpS5Ld9g==} dev: false + /@types/node@10.17.60: + resolution: {integrity: sha512-F0KIgDJfy2nA3zMLmWGKxcH2ZVEtCZXHHdOQs2gSaQ27+lNeEfGxzkIw90aXswATX7AZ33tahPbzy6KAfUreVw==} + dev: true + + /@types/node@12.20.55: + resolution: {integrity: sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ==} + dev: true + /@types/node@17.0.45: resolution: {integrity: sha512-w+tIMs3rq2afQdsPJlODhoUEKzFP1ayaoyl1CcnwtIlsVe7K7bA1NGm4s3PraqTLlXnbIN84zuBlxBWo1u9BLw==} dev: true - /@types/node@20.11.30: - resolution: {integrity: sha512-dHM6ZxwlmuZaRmUPfv1p+KrdD1Dci04FbdEm/9wEMouFqxYoFl5aMkt0VMAUtYRQDyYvD41WJLukhq/ha3YuTw==} + /@types/node@18.19.31: + resolution: {integrity: sha512-ArgCD39YpyyrtFKIqMDvjz79jto5fcI/SVUs2HwB+f0dAzq68yqOdyaSivLiLugSziTpNXLQrVb7RZFmdZzbhA==} + dependencies: + undici-types: 5.26.5 + dev: true + + /@types/node@20.12.5: + resolution: {integrity: sha512-BD+BjQ9LS/D8ST9p5uqBxghlN+S42iuNxjsUGjeZobe/ciXzk2qb1B6IXc6AnRLS+yFJRpN2IPEHMzwspfDJNw==} dependencies: undici-types: 5.26.5 + /@types/node@8.10.66: + resolution: {integrity: sha512-tktOkFUA4kXx2hhhrB8bIFb5TbwzS4uOhKEmwiD+NoiL0qtP2OQ9mFldbgD4dV1djrlBYP6eBuQZiWjuHUpqFw==} + dev: true + /@types/parse-json@4.0.2: resolution: {integrity: sha512-dISoDXWWQwUquiKsyZ4Ng+HX2KsPL7LyHKHQwgGFEA3IaKac4Obd+h2a/a6waisAoepJlBcx9paWqjA8/HVjCw==} dev: false + /@types/pbkdf2@3.1.2: + resolution: {integrity: sha512-uRwJqmiXmh9++aSu1VNEn3iIxWOhd8AHXNSdlaLfdAAdSTY9jYVeGWnzejM3dvrkbqE3/hyQkQQ29IFATEGlew==} + dependencies: + '@types/node': 20.12.5 + dev: true + + /@types/prettier@2.7.3: + resolution: {integrity: sha512-+68kP9yzs4LMp7VNh8gdzMSPZFL44MLGqiHWvttYJe+6qnuVr4Ek9wSBQoveqY/r+LwjCcU29kNVkidwim+kYA==} + dev: true + /@types/prop-types@15.7.12: resolution: {integrity: sha512-5zvhXYtRNRluoE/jAp4GVsSduVUzNWKkOZrCDBWYtE7biZywwdC2AcEzg+cSMLFRfVgeAFqpfNabiPjxFddV1Q==} - /@types/react-dom@18.2.22: - resolution: {integrity: sha512-fHkBXPeNtfvri6gdsMYyW+dW7RXFo6Ad09nLFK0VQWR7yGLai/Cyvyj696gbwYvBnhGtevUG9cET0pmUbMtoPQ==} + /@types/ps-tree@1.1.6: + resolution: {integrity: sha512-PtrlVaOaI44/3pl3cvnlK+GxOM3re2526TJvPvh7W+keHIXdV4TE0ylpPBAcvFQCbGitaTXwL9u+RF7qtVeazQ==} + dev: true + + /@types/qs@6.9.14: + resolution: {integrity: sha512-5khscbd3SwWMhFqylJBLQ0zIu7c1K6Vz0uBIt915BI3zV0q1nfjRQD3RqSBcPaO6PHEF4ov/t9y89fSiyThlPA==} + dev: true + + /@types/react-dom@18.2.24: + resolution: {integrity: sha512-cN6upcKd8zkGy4HU9F1+/s98Hrp6D4MOcippK4PoE8OZRngohHZpbJn1GsaDLz87MqvHNoT13nHvNqM9ocRHZg==} dependencies: - '@types/react': 18.2.68 + '@types/react': 18.2.75 dev: true - /@types/react@18.2.68: - resolution: {integrity: sha512-Fj/BAR6LDSRkqinWfo9nGzW9ndpjEtP049oIW8KWToucUq7AJVCr/fyY9NFpaJaCXnGrKHLLs2mwiHYE1SxaxA==} + /@types/react@18.2.75: + resolution: {integrity: sha512-+DNnF7yc5y0bHkBTiLKqXFe+L4B3nvOphiMY3tuA5X10esmjqk7smyBZzbGTy2vsiy/Bnzj8yFIBL8xhRacoOg==} dependencies: '@types/prop-types': 15.7.12 - '@types/scheduler': 0.16.8 csstype: 3.1.3 - /@types/scheduler@0.16.8: - resolution: {integrity: sha512-WZLiwShhwLRmeV6zH+GkbOFT6Z6VklCItrDioxUnv+u4Ll+8vKeFySoFyK/0ctcRpOmwAicELfmys1sDc/Rw+A==} + /@types/responselike@1.0.3: + resolution: {integrity: sha512-H/+L+UkTV33uf49PH5pCAUBVPNj2nDBXTN+qS1dOwyyg24l3CcicicCA7ca+HMvJBZcFgl5r8e+RR6elsb4Lyw==} + dependencies: + '@types/node': 20.12.5 + dev: true /@types/secp256k1@4.0.6: resolution: {integrity: sha512-hHxJU6PAEUn0TP4S/ZOzuTUvJWuZ6eIKeNKb5RBpODvSl6hp1Wrw4s7ATY50rklRCScUDpHzVA/DQdSjJ3UoYQ==} dependencies: - '@types/node': 20.11.30 - dev: false + '@types/node': 20.12.5 /@types/semver@7.5.8: resolution: {integrity: sha512-I8EUhyrgfLrcTkzV3TSsGyl1tSuPrEDzr0yd5m90UgNxQkyDXULk3b6MlQqTCpZpNtWe1K0hzclnZkTcLBe2UQ==} @@ -4206,6 +5528,10 @@ packages: resolution: {integrity: sha512-ScaPdn1dQczgbl0QFTeTOmVHFULt394XJgOQNoyVhZ6r2vLnMLJfBPd53SB52T/3G36VI1/g2MZaX0cwDuXsfw==} dev: false + /@types/which@3.0.3: + resolution: {integrity: sha512-2C1+XoY0huExTbs8MQv1DuS5FS86+SEjdM9F/+GS61gg5Hqbtj8ZiDSx8MfWcyei907fIPbfPGCOrNUTnVHY1g==} + dev: true + /@types/yargs-parser@21.0.3: resolution: {integrity: sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ==} dev: false @@ -4222,8 +5548,8 @@ packages: '@types/yargs-parser': 21.0.3 dev: false - /@typescript-eslint/eslint-plugin@7.3.1(@typescript-eslint/parser@7.3.1)(eslint@8.57.0)(typescript@5.4.3): - resolution: {integrity: sha512-STEDMVQGww5lhCuNXVSQfbfuNII5E08QWkvAw5Qwf+bj2WT+JkG1uc+5/vXA3AOYMDHVOSpL+9rcbEUiHIm2dw==} + /@typescript-eslint/eslint-plugin@7.6.0(@typescript-eslint/parser@7.6.0)(eslint@8.57.0)(typescript@5.4.4): + resolution: {integrity: sha512-gKmTNwZnblUdnTIJu3e9kmeRRzV2j1a/LUO27KNNAnIC5zjy1aSvXSRp4rVNlmAoHlQ7HzX42NbKpcSr4jF80A==} engines: {node: ^18.18.0 || >=20.0.0} peerDependencies: '@typescript-eslint/parser': ^7.0.0 @@ -4234,24 +5560,24 @@ packages: optional: true dependencies: '@eslint-community/regexpp': 4.10.0 - '@typescript-eslint/parser': 7.3.1(eslint@8.57.0)(typescript@5.4.3) - '@typescript-eslint/scope-manager': 7.3.1 - '@typescript-eslint/type-utils': 7.3.1(eslint@8.57.0)(typescript@5.4.3) - '@typescript-eslint/utils': 7.3.1(eslint@8.57.0)(typescript@5.4.3) - '@typescript-eslint/visitor-keys': 7.3.1 + '@typescript-eslint/parser': 7.6.0(eslint@8.57.0)(typescript@5.4.4) + '@typescript-eslint/scope-manager': 7.6.0 + '@typescript-eslint/type-utils': 7.6.0(eslint@8.57.0)(typescript@5.4.4) + '@typescript-eslint/utils': 7.6.0(eslint@8.57.0)(typescript@5.4.4) + '@typescript-eslint/visitor-keys': 7.6.0 debug: 4.3.4(supports-color@5.5.0) eslint: 8.57.0 graphemer: 1.4.0 ignore: 5.3.1 natural-compare: 1.4.0 semver: 7.6.0 - ts-api-utils: 1.3.0(typescript@5.4.3) - typescript: 5.4.3 + ts-api-utils: 1.3.0(typescript@5.4.4) + typescript: 5.4.4 transitivePeerDependencies: - supports-color dev: true - /@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@5.4.3): + /@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@5.4.4): resolution: {integrity: sha512-tbsV1jPne5CkFQCgPBcDOt30ItF7aJoZL997JSF7MhGQqOeT3svWRYxiqlfA5RUdlHN6Fi+EI9bxqbdyAUZjYQ==} engines: {node: ^16.0.0 || >=18.0.0} peerDependencies: @@ -4263,17 +5589,17 @@ packages: dependencies: '@typescript-eslint/scope-manager': 6.21.0 '@typescript-eslint/types': 6.21.0 - '@typescript-eslint/typescript-estree': 6.21.0(typescript@5.4.3) + '@typescript-eslint/typescript-estree': 6.21.0(typescript@5.4.4) '@typescript-eslint/visitor-keys': 6.21.0 debug: 4.3.4(supports-color@5.5.0) eslint: 8.57.0 - typescript: 5.4.3 + typescript: 5.4.4 transitivePeerDependencies: - supports-color dev: true - /@typescript-eslint/parser@7.3.1(eslint@8.57.0)(typescript@5.4.3): - resolution: {integrity: sha512-Rq49+pq7viTRCH48XAbTA+wdLRrB/3sRq4Lpk0oGDm0VmnjBrAOVXH/Laalmwsv2VpekiEfVFwJYVk6/e8uvQw==} + /@typescript-eslint/parser@7.6.0(eslint@8.57.0)(typescript@5.4.4): + resolution: {integrity: sha512-usPMPHcwX3ZoPWnBnhhorc14NJw9J4HpSXQX4urF2TPKG0au0XhJoZyX62fmvdHONUkmyUe74Hzm1//XA+BoYg==} engines: {node: ^18.18.0 || >=20.0.0} peerDependencies: eslint: ^8.56.0 @@ -4282,13 +5608,13 @@ packages: typescript: optional: true dependencies: - '@typescript-eslint/scope-manager': 7.3.1 - '@typescript-eslint/types': 7.3.1 - '@typescript-eslint/typescript-estree': 7.3.1(typescript@5.4.3) - '@typescript-eslint/visitor-keys': 7.3.1 + '@typescript-eslint/scope-manager': 7.6.0 + '@typescript-eslint/types': 7.6.0 + '@typescript-eslint/typescript-estree': 7.6.0(typescript@5.4.4) + '@typescript-eslint/visitor-keys': 7.6.0 debug: 4.3.4(supports-color@5.5.0) eslint: 8.57.0 - typescript: 5.4.3 + typescript: 5.4.4 transitivePeerDependencies: - supports-color dev: true @@ -4301,16 +5627,16 @@ packages: '@typescript-eslint/visitor-keys': 6.21.0 dev: true - /@typescript-eslint/scope-manager@7.3.1: - resolution: {integrity: sha512-fVS6fPxldsKY2nFvyT7IP78UO1/I2huG+AYu5AMjCT9wtl6JFiDnsv4uad4jQ0GTFzcUV5HShVeN96/17bTBag==} + /@typescript-eslint/scope-manager@7.6.0: + resolution: {integrity: sha512-ngttyfExA5PsHSx0rdFgnADMYQi+Zkeiv4/ZxGYUWd0nLs63Ha0ksmp8VMxAIC0wtCFxMos7Lt3PszJssG/E6w==} engines: {node: ^18.18.0 || >=20.0.0} dependencies: - '@typescript-eslint/types': 7.3.1 - '@typescript-eslint/visitor-keys': 7.3.1 + '@typescript-eslint/types': 7.6.0 + '@typescript-eslint/visitor-keys': 7.6.0 dev: true - /@typescript-eslint/type-utils@7.3.1(eslint@8.57.0)(typescript@5.4.3): - resolution: {integrity: sha512-iFhaysxFsMDQlzJn+vr3OrxN8NmdQkHks4WaqD4QBnt5hsq234wcYdyQ9uquzJJIDAj5W4wQne3yEsYA6OmXGw==} + /@typescript-eslint/type-utils@7.6.0(eslint@8.57.0)(typescript@5.4.4): + resolution: {integrity: sha512-NxAfqAPNLG6LTmy7uZgpK8KcuiS2NZD/HlThPXQRGwz6u7MDBWRVliEEl1Gj6U7++kVJTpehkhZzCJLMK66Scw==} engines: {node: ^18.18.0 || >=20.0.0} peerDependencies: eslint: ^8.56.0 @@ -4319,12 +5645,12 @@ packages: typescript: optional: true dependencies: - '@typescript-eslint/typescript-estree': 7.3.1(typescript@5.4.3) - '@typescript-eslint/utils': 7.3.1(eslint@8.57.0)(typescript@5.4.3) + '@typescript-eslint/typescript-estree': 7.6.0(typescript@5.4.4) + '@typescript-eslint/utils': 7.6.0(eslint@8.57.0)(typescript@5.4.4) debug: 4.3.4(supports-color@5.5.0) eslint: 8.57.0 - ts-api-utils: 1.3.0(typescript@5.4.3) - typescript: 5.4.3 + ts-api-utils: 1.3.0(typescript@5.4.4) + typescript: 5.4.4 transitivePeerDependencies: - supports-color dev: true @@ -4334,12 +5660,12 @@ packages: engines: {node: ^16.0.0 || >=18.0.0} dev: true - /@typescript-eslint/types@7.3.1: - resolution: {integrity: sha512-2tUf3uWggBDl4S4183nivWQ2HqceOZh1U4hhu4p1tPiIJoRRXrab7Y+Y0p+dozYwZVvLPRI6r5wKe9kToF9FIw==} + /@typescript-eslint/types@7.6.0: + resolution: {integrity: sha512-h02rYQn8J+MureCvHVVzhl69/GAfQGPQZmOMjG1KfCl7o3HtMSlPaPUAPu6lLctXI5ySRGIYk94clD/AUMCUgQ==} engines: {node: ^18.18.0 || >=20.0.0} dev: true - /@typescript-eslint/typescript-estree@6.21.0(typescript@5.4.3): + /@typescript-eslint/typescript-estree@6.21.0(typescript@5.4.4): resolution: {integrity: sha512-6npJTkZcO+y2/kr+z0hc4HwNfrrP4kNYh57ek7yCNlrBjWQ1Y0OS7jiZTkgumrvkX5HkEKXFZkkdFNkaW2wmUQ==} engines: {node: ^16.0.0 || >=18.0.0} peerDependencies: @@ -4355,14 +5681,14 @@ packages: is-glob: 4.0.3 minimatch: 9.0.3 semver: 7.6.0 - ts-api-utils: 1.3.0(typescript@5.4.3) - typescript: 5.4.3 + ts-api-utils: 1.3.0(typescript@5.4.4) + typescript: 5.4.4 transitivePeerDependencies: - supports-color dev: true - /@typescript-eslint/typescript-estree@7.3.1(typescript@5.4.3): - resolution: {integrity: sha512-tLpuqM46LVkduWP7JO7yVoWshpJuJzxDOPYIVWUUZbW+4dBpgGeUdl/fQkhuV0A8eGnphYw3pp8d2EnvPOfxmQ==} + /@typescript-eslint/typescript-estree@7.6.0(typescript@5.4.4): + resolution: {integrity: sha512-+7Y/GP9VuYibecrCQWSKgl3GvUM5cILRttpWtnAu8GNL9j11e4tbuGZmZjJ8ejnKYyBRb2ddGQ3rEFCq3QjMJw==} engines: {node: ^18.18.0 || >=20.0.0} peerDependencies: typescript: '*' @@ -4370,21 +5696,21 @@ packages: typescript: optional: true dependencies: - '@typescript-eslint/types': 7.3.1 - '@typescript-eslint/visitor-keys': 7.3.1 + '@typescript-eslint/types': 7.6.0 + '@typescript-eslint/visitor-keys': 7.6.0 debug: 4.3.4(supports-color@5.5.0) globby: 11.1.0 is-glob: 4.0.3 - minimatch: 9.0.3 + minimatch: 9.0.4 semver: 7.6.0 - ts-api-utils: 1.3.0(typescript@5.4.3) - typescript: 5.4.3 + ts-api-utils: 1.3.0(typescript@5.4.4) + typescript: 5.4.4 transitivePeerDependencies: - supports-color dev: true - /@typescript-eslint/utils@7.3.1(eslint@8.57.0)(typescript@5.4.3): - resolution: {integrity: sha512-jIERm/6bYQ9HkynYlNZvXpzmXWZGhMbrOvq3jJzOSOlKXsVjrrolzWBjDW6/TvT5Q3WqaN4EkmcfdQwi9tDjBQ==} + /@typescript-eslint/utils@7.6.0(eslint@8.57.0)(typescript@5.4.4): + resolution: {integrity: sha512-x54gaSsRRI+Nwz59TXpCsr6harB98qjXYzsRxGqvA5Ue3kQH+FxS7FYU81g/omn22ML2pZJkisy6Q+ElK8pBCA==} engines: {node: ^18.18.0 || >=20.0.0} peerDependencies: eslint: ^8.56.0 @@ -4392,9 +5718,9 @@ packages: '@eslint-community/eslint-utils': 4.4.0(eslint@8.57.0) '@types/json-schema': 7.0.15 '@types/semver': 7.5.8 - '@typescript-eslint/scope-manager': 7.3.1 - '@typescript-eslint/types': 7.3.1 - '@typescript-eslint/typescript-estree': 7.3.1(typescript@5.4.3) + '@typescript-eslint/scope-manager': 7.6.0 + '@typescript-eslint/types': 7.6.0 + '@typescript-eslint/typescript-estree': 7.6.0(typescript@5.4.4) eslint: 8.57.0 semver: 7.6.0 transitivePeerDependencies: @@ -4410,11 +5736,11 @@ packages: eslint-visitor-keys: 3.4.3 dev: true - /@typescript-eslint/visitor-keys@7.3.1: - resolution: {integrity: sha512-9RMXwQF8knsZvfv9tdi+4D/j7dMG28X/wMJ8Jj6eOHyHWwDW4ngQJcqEczSsqIKKjFiLFr40Mnr7a5ulDD3vmw==} + /@typescript-eslint/visitor-keys@7.6.0: + resolution: {integrity: sha512-4eLB7t+LlNUmXzfOu1VAIAdkjbu5xNSerURS9X/S5TUKWFRpXRQZbmtPqgKmYx8bj3J0irtQXSiWAOY82v+cgw==} engines: {node: ^18.18.0 || >=20.0.0} dependencies: - '@typescript-eslint/types': 7.3.1 + '@typescript-eslint/types': 7.6.0 eslint-visitor-keys: 3.4.3 dev: true @@ -4441,7 +5767,7 @@ packages: /@vitest/snapshot@1.4.0: resolution: {integrity: sha512-saAFnt5pPIA5qDGxOHxJ/XxhMFKkUSBJmVt5VgDsAqPTX6JP326r5C/c9UuCMPoXNzuudTPsYDZCoJ5ilpqG2A==} dependencies: - magic-string: 0.30.8 + magic-string: 0.30.9 pathe: 1.1.2 pretty-format: 29.7.0 dev: true @@ -4464,7 +5790,7 @@ packages: /@vue/compiler-core@3.4.19: resolution: {integrity: sha512-gj81785z0JNzRcU0Mq98E56e4ltO1yf8k5PQ+tV/7YHnbZkrM0fyFyuttnN8ngJZjbpofWE/m4qjKBiLl8Ju4w==} dependencies: - '@babel/parser': 7.24.1 + '@babel/parser': 7.24.4 '@vue/shared': 3.4.19 entities: 4.5.0 estree-walker: 2.0.2 @@ -4481,7 +5807,7 @@ packages: /@vue/compiler-sfc@3.4.19: resolution: {integrity: sha512-LQ3U4SN0DlvV0xhr1lUsgLCYlwQfUfetyPxkKYu7dkfvx7g3ojrGAkw0AERLOKYXuAGnqFsEuytkdcComei3Yg==} dependencies: - '@babel/parser': 7.24.1 + '@babel/parser': 7.24.4 '@vue/compiler-core': 3.4.19 '@vue/compiler-dom': 3.4.19 '@vue/compiler-ssr': 3.4.19 @@ -4503,10 +5829,10 @@ packages: resolution: {integrity: sha512-/KliRRHMF6LoiThEy+4c1Z4KB/gbPrGjWwJR+crg2otgrf/egKzRaCPvJ51S5oetgsgXLfc4Rm5ZgrKHZrtMSw==} dev: true - /@wagmi/connectors@4.1.18(@types/react@18.2.68)(@wagmi/core@2.6.9)(react-dom@18.2.0)(react-native@0.73.6)(react@18.2.0)(typescript@5.4.3)(viem@2.8.18)(zod@3.22.4): - resolution: {integrity: sha512-K/iLH/Z8jwvgPAYESU/uCQtQBvcIR1Jrqk+t2uCDSxew/tYtkOo2yOjtaPuOb+xJ5OrMGg+0tVHhGChYXry9Ow==} + /@wagmi/connectors@4.1.25(@types/react@18.2.75)(@wagmi/core@2.6.16)(react-dom@18.2.0)(react-native@0.73.6)(react@18.2.0)(typescript@5.4.4)(viem@2.9.13)(zod@3.22.4): + resolution: {integrity: sha512-4Tot1Gtiv7uhiUAxZ9On37aai35l5S0sV7N2yQSNgzqXe55bAlI0cqyBAIJRvyKwOe1+hzKfoFqYQSaoCgj5Lg==} peerDependencies: - '@wagmi/core': 2.6.9 + '@wagmi/core': 2.6.16 typescript: '>=5.0.4' viem: 2.x peerDependenciesMeta: @@ -4514,14 +5840,14 @@ packages: optional: true dependencies: '@coinbase/wallet-sdk': 3.9.1 - '@metamask/sdk': 0.14.3(@types/react@18.2.68)(react-dom@18.2.0)(react-native@0.73.6)(react@18.2.0) - '@safe-global/safe-apps-provider': 0.18.1(typescript@5.4.3)(zod@3.22.4) - '@safe-global/safe-apps-sdk': 8.1.0(typescript@5.4.3)(zod@3.22.4) - '@wagmi/core': 2.6.9(@types/react@18.2.68)(react@18.2.0)(typescript@5.4.3)(viem@2.8.18)(zod@3.22.4) - '@walletconnect/ethereum-provider': 2.11.2(@types/react@18.2.68)(react@18.2.0) - '@walletconnect/modal': 2.6.2(@types/react@18.2.68)(react@18.2.0) - typescript: 5.4.3 - viem: 2.8.18(typescript@5.4.3)(zod@3.22.4) + '@metamask/sdk': 0.14.3(@types/react@18.2.75)(react-dom@18.2.0)(react-native@0.73.6)(react@18.2.0) + '@safe-global/safe-apps-provider': 0.18.1(typescript@5.4.4)(zod@3.22.4) + '@safe-global/safe-apps-sdk': 8.1.0(typescript@5.4.4)(zod@3.22.4) + '@wagmi/core': 2.6.16(@types/react@18.2.75)(react@18.2.0)(typescript@5.4.4)(viem@2.9.13)(zod@3.22.4) + '@walletconnect/ethereum-provider': 2.11.2(@types/react@18.2.75)(react@18.2.0) + '@walletconnect/modal': 2.6.2(@types/react@18.2.75)(react@18.2.0) + typescript: 5.4.4 + viem: 2.9.13(typescript@5.4.4)(zod@3.22.4) transitivePeerDependencies: - '@azure/app-configuration' - '@azure/cosmos' @@ -4549,8 +5875,8 @@ packages: - zod dev: false - /@wagmi/core@2.6.9(@types/react@18.2.68)(react@18.2.0)(typescript@5.4.3)(viem@2.8.18)(zod@3.22.4): - resolution: {integrity: sha512-AbNbHK+m60mfMTds0flv5YYJGp+JSz8O8ikzX+T7MdemFrYA9tZr6G+iSEnf+JLtcgiaCgQqUwac/WmmTkDiMA==} + /@wagmi/core@2.6.16(@types/react@18.2.75)(react@18.2.0)(typescript@5.4.4)(viem@2.9.13)(zod@3.22.4): + resolution: {integrity: sha512-95r+2CCf4Yz4CWG7UZMALIcGSUfpr9YbZ2HOqmz6gJEBaW9Cf9xUEZj2MXOHZIP+Ri/3CZJtbBEclDot4enZWA==} peerDependencies: '@tanstack/query-core': '>=5.0.0' typescript: '>=5.0.4' @@ -4562,10 +5888,10 @@ packages: optional: true dependencies: eventemitter3: 5.0.1 - mipd: 0.0.5(typescript@5.4.3)(zod@3.22.4) - typescript: 5.4.3 - viem: 2.8.18(typescript@5.4.3)(zod@3.22.4) - zustand: 4.4.1(@types/react@18.2.68)(react@18.2.0) + mipd: 0.0.5(typescript@5.4.4)(zod@3.22.4) + typescript: 5.4.4 + viem: 2.9.13(typescript@5.4.4)(zod@3.22.4) + zustand: 4.4.1(@types/react@18.2.75)(react@18.2.0) transitivePeerDependencies: - '@types/react' - bufferutil @@ -4584,7 +5910,7 @@ packages: '@walletconnect/jsonrpc-utils': 1.0.8 '@walletconnect/jsonrpc-ws-connection': 1.0.14 '@walletconnect/keyvaluestorage': 1.1.1 - '@walletconnect/logger': 2.0.1 + '@walletconnect/logger': 2.1.2 '@walletconnect/relay-api': 1.0.9 '@walletconnect/relay-auth': 1.0.4 '@walletconnect/safe-json': 1.0.2 @@ -4621,14 +5947,14 @@ packages: tslib: 1.14.1 dev: false - /@walletconnect/ethereum-provider@2.11.2(@types/react@18.2.68)(react@18.2.0): + /@walletconnect/ethereum-provider@2.11.2(@types/react@18.2.75)(react@18.2.0): resolution: {integrity: sha512-BUDqee0Uy2rCZVkW5Ao3q6Ado/3fePYnFdryVF+YL6bPhj+xQZ5OfKodl+uvs7Rwq++O5wTX2RqOTzpW7+v+Mg==} dependencies: '@walletconnect/jsonrpc-http-connection': 1.0.7 '@walletconnect/jsonrpc-provider': 1.0.13 '@walletconnect/jsonrpc-types': 1.0.3 '@walletconnect/jsonrpc-utils': 1.0.8 - '@walletconnect/modal': 2.6.2(@types/react@18.2.68)(react@18.2.0) + '@walletconnect/modal': 2.6.2(@types/react@18.2.75)(react@18.2.0) '@walletconnect/sign-client': 2.11.2 '@walletconnect/types': 2.11.2 '@walletconnect/universal-provider': 2.11.2 @@ -4744,26 +6070,26 @@ packages: - uWebSockets.js dev: false - /@walletconnect/logger@2.0.1: - resolution: {integrity: sha512-SsTKdsgWm+oDTBeNE/zHxxr5eJfZmE9/5yp/Ku+zJtcTAjELb3DXueWkDXmE9h8uHIbJzIb5wj5lPdzyrjT6hQ==} + /@walletconnect/logger@2.1.2: + resolution: {integrity: sha512-aAb28I3S6pYXZHQm5ESB+V6rDqIYfsnHaQyzFbwUUBFY4H0OXx/YtTl8lvhUNhMMfb9UxbwEBS253TlXUYJWSw==} dependencies: + '@walletconnect/safe-json': 1.0.2 pino: 7.11.0 - tslib: 1.14.1 dev: false - /@walletconnect/modal-core@2.6.2(@types/react@18.2.68)(react@18.2.0): + /@walletconnect/modal-core@2.6.2(@types/react@18.2.75)(react@18.2.0): resolution: {integrity: sha512-cv8ibvdOJQv2B+nyxP9IIFdxvQznMz8OOr/oR/AaUZym4hjXNL/l1a2UlSQBXrVjo3xxbouMxLb3kBsHoYP2CA==} dependencies: - valtio: 1.11.2(@types/react@18.2.68)(react@18.2.0) + valtio: 1.11.2(@types/react@18.2.75)(react@18.2.0) transitivePeerDependencies: - '@types/react' - react dev: false - /@walletconnect/modal-ui@2.6.2(@types/react@18.2.68)(react@18.2.0): + /@walletconnect/modal-ui@2.6.2(@types/react@18.2.75)(react@18.2.0): resolution: {integrity: sha512-rbdstM1HPGvr7jprQkyPggX7rP4XiCG85ZA+zWBEX0dVQg8PpAgRUqpeub4xQKDgY7pY/xLRXSiCVdWGqvG2HA==} dependencies: - '@walletconnect/modal-core': 2.6.2(@types/react@18.2.68)(react@18.2.0) + '@walletconnect/modal-core': 2.6.2(@types/react@18.2.75)(react@18.2.0) lit: 2.8.0 motion: 10.16.2 qrcode: 1.5.3 @@ -4772,11 +6098,11 @@ packages: - react dev: false - /@walletconnect/modal@2.6.2(@types/react@18.2.68)(react@18.2.0): + /@walletconnect/modal@2.6.2(@types/react@18.2.75)(react@18.2.0): resolution: {integrity: sha512-eFopgKi8AjKf/0U4SemvcYw9zlLpx9njVN8sf6DAkowC2Md0gPU/UNEbH1Wwj407pEKnEds98pKWib1NN1ACoA==} dependencies: - '@walletconnect/modal-core': 2.6.2(@types/react@18.2.68)(react@18.2.0) - '@walletconnect/modal-ui': 2.6.2(@types/react@18.2.68)(react@18.2.0) + '@walletconnect/modal-core': 2.6.2(@types/react@18.2.75)(react@18.2.0) + '@walletconnect/modal-ui': 2.6.2(@types/react@18.2.75)(react@18.2.0) transitivePeerDependencies: - '@types/react' - react @@ -4813,7 +6139,7 @@ packages: '@walletconnect/events': 1.0.1 '@walletconnect/heartbeat': 1.2.1 '@walletconnect/jsonrpc-utils': 1.0.8 - '@walletconnect/logger': 2.0.1 + '@walletconnect/logger': 2.1.2 '@walletconnect/time': 1.0.2 '@walletconnect/types': 2.11.2 '@walletconnect/utils': 2.11.2 @@ -4851,7 +6177,7 @@ packages: '@walletconnect/heartbeat': 1.2.1 '@walletconnect/jsonrpc-types': 1.0.3 '@walletconnect/keyvaluestorage': 1.1.1 - '@walletconnect/logger': 2.0.1 + '@walletconnect/logger': 2.1.2 events: 3.3.0 transitivePeerDependencies: - '@azure/app-configuration' @@ -4877,7 +6203,7 @@ packages: '@walletconnect/jsonrpc-provider': 1.0.13 '@walletconnect/jsonrpc-types': 1.0.3 '@walletconnect/jsonrpc-utils': 1.0.8 - '@walletconnect/logger': 2.0.1 + '@walletconnect/logger': 2.1.2 '@walletconnect/sign-client': 2.11.2 '@walletconnect/types': 2.11.2 '@walletconnect/utils': 2.11.2 @@ -4949,7 +6275,11 @@ packages: tslib: 1.14.1 dev: false - /abitype@0.9.8(typescript@5.4.3)(zod@3.22.4): + /abbrev@1.0.9: + resolution: {integrity: sha512-LEyx4aLEC3x6T0UguF6YILf+ntvmOaWsVfENmIW0E9H09vKlLDGelMjjSm0jkDHALj8A8quZ/HapKNigzwge+Q==} + dev: true + + /abitype@0.9.8(typescript@5.4.4)(zod@3.22.4): resolution: {integrity: sha512-puLifILdm+8sjyss4S+fsUN09obiT1g2YW6CtcQF+QDzxR0euzgEB29MZujC6zMk2a6SVmtttq1fc6+YFA7WYQ==} peerDependencies: typescript: '>=5.0.4' @@ -4960,11 +6290,11 @@ packages: zod: optional: true dependencies: - typescript: 5.4.3 + typescript: 5.4.4 zod: 3.22.4 dev: false - /abitype@1.0.0(typescript@5.4.3)(zod@3.22.4): + /abitype@1.0.0(typescript@5.4.4)(zod@3.22.4): resolution: {integrity: sha512-NMeMah//6bJ56H5XRj8QCV4AwuW6hB6zqz2LnhhLdcWVQOsXki6/Pn3APeqxCma62nXIcmZWdu1DlHWS74umVQ==} peerDependencies: typescript: '>=5.0.4' @@ -4975,7 +6305,7 @@ packages: zod: optional: true dependencies: - typescript: 5.4.3 + typescript: 5.4.4 zod: 3.22.4 dev: false @@ -4986,13 +6316,16 @@ packages: event-target-shim: 5.0.1 dev: false + /abortcontroller-polyfill@1.7.5: + resolution: {integrity: sha512-JMJ5soJWP18htbbxJjG7bG6yuI6pRhgJ0scHHTfkUjf6wjP912xZWvM+A4sJK3gqd9E8fcPbDnOefbA9Th/FIQ==} + dev: true + /accepts@1.3.8: resolution: {integrity: sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==} engines: {node: '>= 0.6'} dependencies: mime-types: 2.1.35 negotiator: 0.6.3 - dev: false /acorn-jsx@5.3.2(acorn@8.11.3): resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} @@ -5012,8 +6345,26 @@ packages: engines: {node: '>=0.4.0'} hasBin: true - /agent-base@7.1.0: - resolution: {integrity: sha512-o/zjMZRhJxny7OyEF+Op8X+efiELC7k7yOjMzgfzVqOzXqkBkWI79YoTdOtsuWd5BWhAGAuOY/Xa6xpiaWXiNg==} + /adm-zip@0.4.16: + resolution: {integrity: sha512-TFi4HBKSGfIKsK5YCkKaaFG2m4PEDyViZmEwof3MTIgzimHLto6muaHVpbrljdIvIrFZzEq/p4nafOeLcYegrg==} + engines: {node: '>=0.3.0'} + dev: true + + /aes-js@3.0.0: + resolution: {integrity: sha512-H7wUZRn8WpTq9jocdxQ2c8x2sKo9ZVmzfRE13GiNJXfp7NcKYEdvl3vspKjXox6RIG2VtaRe4JFvxG4rqp2Zuw==} + dev: true + + /agent-base@6.0.2: + resolution: {integrity: sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==} + engines: {node: '>= 6.0.0'} + dependencies: + debug: 4.3.4(supports-color@5.5.0) + transitivePeerDependencies: + - supports-color + dev: true + + /agent-base@7.1.1: + resolution: {integrity: sha512-H0TSyFNDMomMNJQBn8wFV5YC/2eJ+VXECwOadZJT554xP6cODZHPX3H9QMQECxvrgiSOP1pHjy1sMWQVYJOUOA==} engines: {node: '>= 14'} dependencies: debug: 4.3.4(supports-color@5.5.0) @@ -5021,6 +6372,14 @@ packages: - supports-color dev: true + /aggregate-error@3.1.0: + resolution: {integrity: sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==} + engines: {node: '>=8'} + dependencies: + clean-stack: 2.2.0 + indent-string: 4.0.0 + dev: true + /ajv@6.12.6: resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} dependencies: @@ -5030,15 +6389,54 @@ packages: uri-js: 4.4.1 dev: true + /ajv@8.12.0: + resolution: {integrity: sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==} + dependencies: + fast-deep-equal: 3.1.3 + json-schema-traverse: 1.0.0 + require-from-string: 2.0.2 + uri-js: 4.4.1 + dev: true + + /amdefine@1.0.1: + resolution: {integrity: sha512-S2Hw0TtNkMJhIabBwIojKL9YHO5T0n5eNqWJ7Lrlel/zDbftQpxpapi8tZs3X1HWa+u+QeydGmzzNU0m09+Rcg==} + engines: {node: '>=0.4.2'} + requiresBuild: true + dev: true + optional: true + /anser@1.4.10: resolution: {integrity: sha512-hCv9AqTQ8ycjpSd3upOJd7vFwW1JaoYQ7tpham03GJ1ca8/65rqn0RpaWpItOAd6ylW9wAw6luXYPJIyPFVOww==} dev: false + /ansi-align@3.0.1: + resolution: {integrity: sha512-IOfwwBF5iczOjp/WeY4YxyjqAFMQoZufdQWDd19SEExbVLNXqvpzSJ/M7Za4/sCPmQ0+GRquoA7bGcINcxew6w==} + dependencies: + string-width: 4.2.3 + dev: true + + /ansi-colors@3.2.4: + resolution: {integrity: sha512-hHUXGagefjN2iRrID63xckIvotOXOojhQKWIPUZ4mNUZ9nLZW+7FMNoE1lOkEhNWYsx/7ysGIuJYCiMAA9FnrA==} + engines: {node: '>=6'} + dev: true + + /ansi-colors@4.1.1: + resolution: {integrity: sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==} + engines: {node: '>=6'} + dev: true + /ansi-colors@4.1.3: resolution: {integrity: sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==} engines: {node: '>=6'} dev: true + /ansi-escapes@4.3.2: + resolution: {integrity: sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==} + engines: {node: '>=8'} + dependencies: + type-fest: 0.21.3 + dev: true + /ansi-fragments@0.2.1: resolution: {integrity: sha512-DykbNHxuXQwUDRv5ibc2b0x7uw7wmwOGLBUd5RmaQ5z8Lhx19vwvKV+FAsM5rEA6dEcHxX+/Ad5s9eF2k2bB+w==} dependencies: @@ -5047,10 +6445,20 @@ packages: strip-ansi: 5.2.0 dev: false - /ansi-regex@4.1.1: - resolution: {integrity: sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==} - engines: {node: '>=6'} - dev: false + /ansi-regex@2.1.1: + resolution: {integrity: sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA==} + engines: {node: '>=0.10.0'} + dev: true + + /ansi-regex@3.0.1: + resolution: {integrity: sha512-+O9Jct8wf++lXxxFc4hc8LsjaSq0HFzzL7cVsw8pRDIPdjKD2mT4ytDZlLuSBZ4cLKZFXIrMGO7DbQCtMJJMKw==} + engines: {node: '>=4'} + dev: true + + /ansi-regex@4.1.1: + resolution: {integrity: sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==} + engines: {node: '>=6'} + dev: false /ansi-regex@5.0.1: resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} @@ -5082,6 +6490,10 @@ packages: engines: {node: '>=12'} dev: true + /antlr4ts@0.5.0-alpha.4: + resolution: {integrity: sha512-WPQDt1B74OfPv/IMS2ekXAKkTZIHl88uMetg6q3OTqgFxZ/dxDXI0EWLyZid/1Pe6hTftyg5N7gel5wNAGxXyQ==} + dev: true + /anymatch@3.1.3: resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} engines: {node: '>= 8'} @@ -5118,6 +6530,16 @@ packages: dequal: 2.0.3 dev: true + /array-back@3.1.0: + resolution: {integrity: sha512-TkuxA4UCOvxuDK6NZYXCalszEzj+TLszyASooky+i742l9TqsOdYCMJJupxRic61hwquNtppB3hgcuq9SVSH1Q==} + engines: {node: '>=6'} + dev: true + + /array-back@4.0.2: + resolution: {integrity: sha512-NbdMezxqf94cnNfWLL7V/im0Ub+Anbb0IoZhvzie8+4HJ4nMQuzHuy49FkGYCJK2yAloZ3meiB6AVMClbrI1vg==} + engines: {node: '>=8'} + dev: true + /array-buffer-byte-length@1.0.1: resolution: {integrity: sha512-ahC5W1xgou+KTXix4sAO8Ki12Q+jf4i0+tmk3sC+zgcynshkHxzpXdImBehiUYKKKDwvfFiJl1tZt6ewscS1Mg==} engines: {node: '>= 0.4'} @@ -5126,13 +6548,17 @@ packages: is-array-buffer: 3.0.4 dev: true + /array-flatten@1.1.1: + resolution: {integrity: sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==} + dev: true + /array-includes@3.1.8: resolution: {integrity: sha512-itaWrbYbqpGXkGhZPGUulwnhVf5Hpy1xiCFsGqyIGglbBxmG5vSjxQen3/WGOjPpNEv1RtBLKxbmVXm8HpJStQ==} engines: {node: '>= 0.4'} dependencies: call-bind: 1.0.7 define-properties: 1.2.1 - es-abstract: 1.23.2 + es-abstract: 1.23.3 es-object-atoms: 1.0.0 get-intrinsic: 1.2.4 is-string: 1.0.7 @@ -5143,13 +6569,18 @@ packages: engines: {node: '>=8'} dev: true + /array-uniq@1.0.3: + resolution: {integrity: sha512-MNha4BWQ6JbwhFhj03YK552f7cb3AzoE8SzeljgChvL1dl3IcvggXVz1DilzySZkCja+CXuZbdW7yATchWn8/Q==} + engines: {node: '>=0.10.0'} + dev: true + /array.prototype.findlast@1.2.5: resolution: {integrity: sha512-CVvd6FHg1Z3POpBLxO6E6zr+rSKEQ9L6rZHAaY7lLfhKsWYUBBOuMs0e9o24oopj6H+geRCX0YJ+TJLBK2eHyQ==} engines: {node: '>= 0.4'} dependencies: call-bind: 1.0.7 define-properties: 1.2.1 - es-abstract: 1.23.2 + es-abstract: 1.23.3 es-errors: 1.3.0 es-object-atoms: 1.0.0 es-shim-unscopables: 1.0.2 @@ -5161,7 +6592,7 @@ packages: dependencies: call-bind: 1.0.7 define-properties: 1.2.1 - es-abstract: 1.23.2 + es-abstract: 1.23.3 es-errors: 1.3.0 es-object-atoms: 1.0.0 es-shim-unscopables: 1.0.2 @@ -5173,7 +6604,7 @@ packages: dependencies: call-bind: 1.0.7 define-properties: 1.2.1 - es-abstract: 1.22.5 + es-abstract: 1.23.3 es-shim-unscopables: 1.0.2 dev: true @@ -5183,7 +6614,7 @@ packages: dependencies: call-bind: 1.0.7 define-properties: 1.2.1 - es-abstract: 1.22.5 + es-abstract: 1.23.3 es-shim-unscopables: 1.0.2 dev: true @@ -5192,7 +6623,7 @@ packages: dependencies: call-bind: 1.0.7 define-properties: 1.2.1 - es-abstract: 1.22.5 + es-abstract: 1.23.3 es-shim-unscopables: 1.0.2 dev: true @@ -5201,7 +6632,7 @@ packages: dependencies: call-bind: 1.0.7 define-properties: 1.2.1 - es-abstract: 1.22.5 + es-abstract: 1.23.3 es-errors: 1.3.0 es-shim-unscopables: 1.0.2 dev: true @@ -5213,7 +6644,7 @@ packages: array-buffer-byte-length: 1.0.1 call-bind: 1.0.7 define-properties: 1.2.1 - es-abstract: 1.23.2 + es-abstract: 1.23.3 es-errors: 1.3.0 get-intrinsic: 1.2.4 is-array-buffer: 3.0.4 @@ -5222,7 +6653,17 @@ packages: /asap@2.0.6: resolution: {integrity: sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==} - dev: false + + /asn1@0.2.6: + resolution: {integrity: sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ==} + dependencies: + safer-buffer: 2.1.2 + dev: true + + /assert-plus@1.0.0: + resolution: {integrity: sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw==} + engines: {node: '>=0.8'} + dev: true /assertion-error@1.1.0: resolution: {integrity: sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==} @@ -5244,9 +6685,13 @@ packages: engines: {node: '>=4'} dev: false + /astral-regex@2.0.0: + resolution: {integrity: sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==} + engines: {node: '>=8'} + dev: true + /async-limiter@1.0.1: resolution: {integrity: sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ==} - dev: false /async-mutex@0.2.6: resolution: {integrity: sha512-Hs4R+4SPgamu6rSGW8C7cV9gaWUKEHykfzCCvIRuaVv636Ju10ZdeUbvb4TBEW0INuq2DHZqXbK4Nd3yG4RaRw==} @@ -5254,10 +6699,19 @@ packages: tslib: 2.6.2 dev: false + /async@1.5.2: + resolution: {integrity: sha512-nSVgobk4rv61R9PUSDtYt7mPVB2olxNR5RWJcAsH676/ef11bUZwvu7+RGYrYauVdDPcO519v68wRhXQtxsV9w==} + dev: true + /asynckit@0.4.0: resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==} dev: true + /at-least-node@1.0.0: + resolution: {integrity: sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==} + engines: {node: '>= 4.0.0'} + dev: true + /atomic-sleep@1.0.0: resolution: {integrity: sha512-kNOjDqAh7px0XWNI+4QbzoiR/nTkHAWNud2uvnJquD1/x5a7EQZMJT0AczqK0Qn67oY/TTQ1LbUKajZpp3I9tQ==} engines: {node: '>=8.0.0'} @@ -5269,89 +6723,107 @@ packages: dependencies: possible-typed-array-names: 1.0.0 + /aws-sign2@0.7.0: + resolution: {integrity: sha512-08kcGqnYf/YmjoRhfxyu+CLxBjUtHLXLXX/vUfx9l2LYzG3c1m61nrpyFUZI6zeS+Li/wWMMidD9KgrqtGq3mA==} + dev: true + + /aws4@1.12.0: + resolution: {integrity: sha512-NmWvPnx0F1SfrQbYwOi7OeaNGokp9XhzNioJ/CSBs8Qa4vxug81mhJEAVZwxXuBmYB5KDRfMq/F3RR0BIU7sWg==} + dev: true + /axe-core@4.7.0: resolution: {integrity: sha512-M0JtH+hlOL5pLQwHOLNYZaXuhqmvS8oExsqB1SBYgA4Dk7u/xx+YdGHXaK5pyUfed5mYXdlYiphWq3G8cRi5JQ==} engines: {node: '>=4'} dev: true + /axios@1.6.8: + resolution: {integrity: sha512-v/ZHtJDU39mDpyBoFVkETcd/uNdxrWRrg3bKpOKzXFA6Bvqopts6ALSMU3y6ijYxbw2B+wPrIv46egTzJXCLGQ==} + dependencies: + follow-redirects: 1.15.6(debug@4.3.4) + form-data: 4.0.0 + proxy-from-env: 1.1.0 + transitivePeerDependencies: + - debug + dev: true + /axobject-query@3.2.1: resolution: {integrity: sha512-jsyHu61e6N4Vbz/v18DHwWYKK0bSWLqn47eeDSKPB7m8tqMHF9YJ+mhIk2lVteyZrY8tnSj/jHOv4YiTCuCJgg==} dependencies: dequal: 2.0.3 dev: true - /babel-core@7.0.0-bridge.0(@babel/core@7.24.3): + /babel-core@7.0.0-bridge.0(@babel/core@7.24.4): resolution: {integrity: sha512-poPX9mZH/5CSanm50Q+1toVci6pv5KSRv/5TWCwtzQS5XEwn40BcCrgIeMFWP9CKKIniKXNxoIOnOq4VVlGXhg==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.3 + '@babel/core': 7.24.4 dev: false /babel-plugin-macros@3.1.0: resolution: {integrity: sha512-Cg7TFGpIr01vOQNODXOOaGz2NpCU5gl8x1qJFbb6hbZxR7XrcE2vtbAsTAbJ7/xwJtUuJEw8K8Zr/AE0LHlesg==} engines: {node: '>=10', npm: '>=6'} dependencies: - '@babel/runtime': 7.24.1 + '@babel/runtime': 7.24.4 cosmiconfig: 7.1.0 resolve: 1.22.8 dev: false - /babel-plugin-polyfill-corejs2@0.4.10(@babel/core@7.24.3): + /babel-plugin-polyfill-corejs2@0.4.10(@babel/core@7.24.4): resolution: {integrity: sha512-rpIuu//y5OX6jVU+a5BCn1R5RSZYWAl2Nar76iwaOdycqb6JPxediskWFMMl7stfwNJR4b7eiQvh5fB5TEQJTQ==} peerDependencies: '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 dependencies: - '@babel/compat-data': 7.24.1 - '@babel/core': 7.24.3 - '@babel/helper-define-polyfill-provider': 0.6.1(@babel/core@7.24.3) + '@babel/compat-data': 7.24.4 + '@babel/core': 7.24.4 + '@babel/helper-define-polyfill-provider': 0.6.1(@babel/core@7.24.4) semver: 6.3.1 transitivePeerDependencies: - supports-color dev: false - /babel-plugin-polyfill-corejs3@0.10.4(@babel/core@7.24.3): + /babel-plugin-polyfill-corejs3@0.10.4(@babel/core@7.24.4): resolution: {integrity: sha512-25J6I8NGfa5YkCDogHRID3fVCadIR8/pGl1/spvCkzb6lVn6SR3ojpx9nOn9iEBcUsjY24AmdKm5khcfKdylcg==} peerDependencies: '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 dependencies: - '@babel/core': 7.24.3 - '@babel/helper-define-polyfill-provider': 0.6.1(@babel/core@7.24.3) + '@babel/core': 7.24.4 + '@babel/helper-define-polyfill-provider': 0.6.1(@babel/core@7.24.4) core-js-compat: 3.36.1 transitivePeerDependencies: - supports-color dev: false - /babel-plugin-polyfill-regenerator@0.6.1(@babel/core@7.24.3): + /babel-plugin-polyfill-regenerator@0.6.1(@babel/core@7.24.4): resolution: {integrity: sha512-JfTApdE++cgcTWjsiCQlLyFBMbTUft9ja17saCc93lgV33h4tuCVj7tlvu//qpLwaG+3yEz7/KhahGrUMkVq9g==} peerDependencies: '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 dependencies: - '@babel/core': 7.24.3 - '@babel/helper-define-polyfill-provider': 0.6.1(@babel/core@7.24.3) + '@babel/core': 7.24.4 + '@babel/helper-define-polyfill-provider': 0.6.1(@babel/core@7.24.4) transitivePeerDependencies: - supports-color dev: false - /babel-plugin-styled-components@2.1.4(@babel/core@7.24.3)(styled-components@5.3.11): + /babel-plugin-styled-components@2.1.4(@babel/core@7.24.4)(styled-components@5.3.11): resolution: {integrity: sha512-Xgp9g+A/cG47sUyRwwYxGM4bR/jDRg5N6it/8+HxCnbT5XNKSKDT9xm4oag/osgqjC2It/vH0yXsomOG6k558g==} peerDependencies: styled-components: '>= 2' dependencies: '@babel/helper-annotate-as-pure': 7.22.5 - '@babel/helper-module-imports': 7.22.15 - '@babel/plugin-syntax-jsx': 7.23.3(@babel/core@7.24.3) + '@babel/helper-module-imports': 7.24.3 + '@babel/plugin-syntax-jsx': 7.24.1(@babel/core@7.24.4) lodash: 4.17.21 picomatch: 2.3.1 - styled-components: 5.3.11(@babel/core@7.24.3)(react-dom@18.2.0)(react-is@18.2.0)(react@18.2.0) + styled-components: 5.3.11(@babel/core@7.24.4)(react-dom@18.2.0)(react-is@18.2.0)(react@18.2.0) transitivePeerDependencies: - '@babel/core' dev: false - /babel-plugin-transform-flow-enums@0.0.2(@babel/core@7.24.3): + /babel-plugin-transform-flow-enums@0.0.2(@babel/core@7.24.4): resolution: {integrity: sha512-g4aaCrDDOsWjbm0PUUeVnkcVd6AKJsVc/MbnPhEotEpkeJQP6b8nzewohQi7+QS8UyPehOhGWn0nOwjvWpmMvQ==} dependencies: - '@babel/plugin-syntax-flow': 7.24.1(@babel/core@7.24.3) + '@babel/plugin-syntax-flow': 7.24.1(@babel/core@7.24.4) transitivePeerDependencies: - '@babel/core' dev: false @@ -5359,9 +6831,41 @@ packages: /balanced-match@1.0.2: resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} + /base-x@3.0.9: + resolution: {integrity: sha512-H7JU6iBHTal1gp56aKoaa//YUxEaAOUiydvrV/pILqIHXTtqxSkATOnDA2u+jZ/61sD+L/412+7kzXRtWukhpQ==} + dependencies: + safe-buffer: 5.2.1 + dev: true + /base64-js@1.5.1: resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} - dev: false + + /bcrypt-pbkdf@1.0.2: + resolution: {integrity: sha512-qeFIXtP4MSoi6NLqO12WfqARWWuCKi2Rn/9hJLEmtB5yTNr9DqFWkJRCf2qShWzPeAMRnOgCrq0sg/KLv5ES9w==} + dependencies: + tweetnacl: 0.14.5 + dev: true + + /bech32@1.1.4: + resolution: {integrity: sha512-s0IrSOzLlbvX7yp4WBfPITzpAU8sqQcpsmwXDiKwrG4r491vwCO/XpejasRNl0piBMe/DvP4Tz0mIS/X1DPJBQ==} + dev: true + + /big-integer@1.6.36: + resolution: {integrity: sha512-t70bfa7HYEA1D9idDbmuv7YbsbVkQ+Hp+8KFSul4aE5e/i1bjCNIRYJZlA8Q8p0r9T8cF/RVvwUgRA//FydEyg==} + engines: {node: '>=0.6'} + dev: true + + /big.js@6.2.1: + resolution: {integrity: sha512-bCtHMwL9LeDIozFn+oNhhFoq+yQ3BNdnsLSASUxLciOb1vgvpHsIO1dsENiGMgbb4SkP5TrzWzRiLddn8ahVOQ==} + dev: true + + /bignumber.js@7.2.1: + resolution: {integrity: sha512-S4XzBk5sMB+Rcb/LNcpzXr57VRTxgAvaAEDAl1AwRx27j00hT84O6OkteE7u8UB3NuaaygCRrEpqox4uDOrbdQ==} + dev: true + + /bignumber.js@9.1.2: + resolution: {integrity: sha512-2/mKyZH9K85bzOEfhXDBFZTGd1CTs+5IHpeFQo9luiBG7hghdC851Pj2WAhb6E3R6b9tZj/XKhbg4fum+Kepug==} + dev: true /binary-extensions@2.3.0: resolution: {integrity: sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==} @@ -5375,18 +6879,66 @@ packages: readable-stream: 3.6.2 dev: false + /blakejs@1.2.1: + resolution: {integrity: sha512-QXUSXI3QVc/gJME0dBpXrag1kbzOqCjCX8/b54ntNyW6sjtoqxqRk3LTmXzaJoh71zMsDCjM+47jS7XiwN/+fQ==} + dev: true + + /bluebird@3.7.2: + resolution: {integrity: sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==} + dev: true + + /bn.js@4.11.6: + resolution: {integrity: sha512-XWwnNNFCuuSQ0m3r3C4LE3EiORltHd9M05pq6FOlVeiophzRbMo50Sbz1ehl8K3Z+jw9+vmgnXefY1hz8X+2wA==} + dev: true + /bn.js@4.12.0: resolution: {integrity: sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==} - dev: false /bn.js@5.2.1: resolution: {integrity: sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ==} - dev: false + + /body-parser@1.20.2: + resolution: {integrity: sha512-ml9pReCu3M61kGlqoTm2umSXTlRTuGTx0bfYj+uIUKKYycG5NtSbeetV3faSU6R7ajOPw0g/J1PvK4qNy7s5bA==} + engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16} + dependencies: + bytes: 3.1.2 + content-type: 1.0.5 + debug: 2.6.9 + depd: 2.0.0 + destroy: 1.2.0 + http-errors: 2.0.0 + iconv-lite: 0.4.24 + on-finished: 2.4.1 + qs: 6.11.0 + raw-body: 2.5.2 + type-is: 1.6.18 + unpipe: 1.0.0 + transitivePeerDependencies: + - supports-color + dev: true + + /boolbase@1.0.0: + resolution: {integrity: sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==} + dev: true /bowser@2.11.0: resolution: {integrity: sha512-AlcaJBi/pqqJBIQ8U9Mcpc9i8Aqxn88Skv5d+xBX006BY5u8N3mGLHa5Lgppa7L/HfwgwLgZ6NYs+Ag6uUmJRA==} dev: false + /boxen@5.1.2: + resolution: {integrity: sha512-9gYgQKXx+1nP8mP7CzFyaUARhg7D3n1dF/FnErWmu9l6JvGpNUN278h0aSb+QjoiKSWG+iZ3uHrcqk0qrY9RQQ==} + engines: {node: '>=10'} + dependencies: + ansi-align: 3.0.1 + camelcase: 6.3.0 + chalk: 4.1.2 + cli-boxes: 2.2.1 + string-width: 4.2.3 + type-fest: 0.20.2 + widest-line: 3.1.0 + wrap-ansi: 7.0.0 + dev: true + /brace-expansion@1.1.11: resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} dependencies: @@ -5407,18 +6959,46 @@ packages: /brorand@1.1.0: resolution: {integrity: sha512-cKV8tMCEpQs4hK/ik71d6LrPOnpkpGBR0wzxqr68g2m/LB2GxVYQroAjMJZRVM1Y4BCjCKc3vAamxSzOY2RP+w==} - dev: false + + /browser-stdout@1.3.1: + resolution: {integrity: sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==} + dev: true + + /browserify-aes@1.2.0: + resolution: {integrity: sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==} + dependencies: + buffer-xor: 1.0.3 + cipher-base: 1.0.4 + create-hash: 1.2.0 + evp_bytestokey: 1.0.3 + inherits: 2.0.4 + safe-buffer: 5.2.1 + dev: true /browserslist@4.23.0: resolution: {integrity: sha512-QW8HiM1shhT2GuzkvklfjcKDiWFXHOeFCIA/huJPwHsslwcydgk7X+z2zXpEijP98UCY7HbubZt5J2Zgvf0CaQ==} engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} hasBin: true dependencies: - caniuse-lite: 1.0.30001599 - electron-to-chromium: 1.4.713 + caniuse-lite: 1.0.30001607 + electron-to-chromium: 1.4.730 node-releases: 2.0.14 update-browserslist-db: 1.0.13(browserslist@4.23.0) + /bs58@4.0.1: + resolution: {integrity: sha512-Ok3Wdf5vOIlBrgCvTq96gBkJw+JUEzdBgyaza5HLtPm7yTHkjRy8+JzNyHF7BHa0bNWOQIp3m5YF0nnFcOIKLw==} + dependencies: + base-x: 3.0.9 + dev: true + + /bs58check@2.1.2: + resolution: {integrity: sha512-0TS1jicxdU09dwJMNZtVAfzPi6Q6QeN0pM1Fkzrjn+XYHvzMKPU3pHVpva+769iNVSfIYWf7LJ6WR+BuuMf8cA==} + dependencies: + bs58: 4.0.1 + create-hash: 1.2.0 + safe-buffer: 5.2.1 + dev: true + /bser@2.1.1: resolution: {integrity: sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==} dependencies: @@ -5427,21 +7007,26 @@ packages: /buffer-from@1.1.2: resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} - dev: false + + /buffer-to-arraybuffer@0.0.5: + resolution: {integrity: sha512-3dthu5CYiVB1DEJp61FtApNnNndTckcqe4pFcLdvHtrpG+kcyekCJKg4MRiDcFW7A6AODnXB9U4dwQiCW5kzJQ==} + dev: true + + /buffer-xor@1.0.3: + resolution: {integrity: sha512-571s0T7nZWK6vB67HI5dyUF7wXiNcfaPPPTl6zYCNApANjIvYJTg7hlud/+cJpdAhS7dVzqMLmfhfHR3rAcOjQ==} + dev: true /buffer@5.7.1: resolution: {integrity: sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==} dependencies: base64-js: 1.5.1 ieee754: 1.2.1 - dev: false /buffer@6.0.3: resolution: {integrity: sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==} dependencies: base64-js: 1.5.1 ieee754: 1.2.1 - dev: false /bufferutil@4.0.8: resolution: {integrity: sha512-4T53u4PdgsXqKaIctwF8ifXlRTTmEPJ8iEPWFdGZvcf7sbwYo6FKFEX9eNNAnzFZ7EzJAQ3CJeOtCRA4rDp7Pw==} @@ -5449,7 +7034,6 @@ packages: requiresBuild: true dependencies: node-gyp-build: 4.8.0 - dev: false /bundle-n-require@1.1.1: resolution: {integrity: sha512-EB2wFjXF106LQLe/CYnKCMCdLeTW47AtcEtUfiqAOgr2a08k0+YgRklur2aLfEYHlhz6baMskZ8L2U92Hh0vyA==} @@ -5470,17 +7054,38 @@ packages: engines: {node: '>= 0.8'} dev: false + /bytes@3.1.2: + resolution: {integrity: sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==} + engines: {node: '>= 0.8'} + dev: true + /cac@6.7.14: resolution: {integrity: sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==} engines: {node: '>=8'} dev: true - /call-bind@1.0.5: - resolution: {integrity: sha512-C3nQxfFZxFRVoJoGKKI8y3MOEo129NQ+FgQ08iye+Mk4zNZZGdjfs06bVTr+DBSlA66Q2VEcMki/cUCP4SercQ==} + /cacheable-lookup@5.0.4: + resolution: {integrity: sha512-2/kNscPhpcxrOigMZzbiWF7dz8ilhb/nIHU3EyZiXWXpeq/au8qJ8VhdftMkty3n7Gj6HIGalQG8oiBNB3AJgA==} + engines: {node: '>=10.6.0'} + dev: true + + /cacheable-lookup@6.1.0: + resolution: {integrity: sha512-KJ/Dmo1lDDhmW2XDPMo+9oiy/CeqosPguPCrgcVzKyZrL6pM1gU2GmPY/xo6OQPTUaA/c0kwHuywB4E6nmT9ww==} + engines: {node: '>=10.6.0'} + dev: true + + /cacheable-request@7.0.4: + resolution: {integrity: sha512-v+p6ongsrp0yTGbJXjgxPow2+DL93DASP4kXCDKb8/bwRtt9OEF3whggkkDkGNzgcWy2XaF4a8nZglC7uElscg==} + engines: {node: '>=8'} dependencies: - function-bind: 1.1.2 - get-intrinsic: 1.2.3 - set-function-length: 1.2.0 + clone-response: 1.0.3 + get-stream: 5.2.0 + http-cache-semantics: 4.1.1 + keyv: 4.5.4 + lowercase-keys: 2.0.0 + normalize-url: 6.1.0 + responselike: 2.0.1 + dev: true /call-bind@1.0.7: resolution: {integrity: sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==} @@ -5490,7 +7095,7 @@ packages: es-errors: 1.3.0 function-bind: 1.1.2 get-intrinsic: 1.2.4 - set-function-length: 1.2.1 + set-function-length: 1.2.2 /caller-callsite@2.0.0: resolution: {integrity: sha512-JuG3qI4QOftFsZyOn1qq87fq5grLIyk1JYd5lJmdA+fG7aQ9pA/i3JIJGcO3q0MrRcHlOt1U+ZeHW8Dq9axALQ==} @@ -5515,6 +7120,23 @@ packages: resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} engines: {node: '>=6'} + /camel-case@3.0.0: + resolution: {integrity: sha512-+MbKztAYHXPr1jNTSKQF52VpcFjwY5RkR7fxksV8Doo4KAYc5Fl4UJRgthBbTmEx8C54DqahhbLJkDwjI3PI/w==} + dependencies: + no-case: 2.3.2 + upper-case: 1.1.3 + dev: true + + /camelcase@3.0.0: + resolution: {integrity: sha512-4nhGqUkc4BqbBBB4Q6zLuD7lzzrHYrjKGeYaEji/3tFR5VdJu9v+LilhGIVe8wxEJPPOeWo7eg8dwY13TZ1BNg==} + engines: {node: '>=0.10.0'} + dev: true + + /camelcase@4.1.0: + resolution: {integrity: sha512-FxAv7HpHrXbh3aPo4o2qxHay2lkLY3x5Mw3KeE4KQE8ysVfziWeRZDwcjauvwBSGEC/nXUPzZy8zeh4HokqOnw==} + engines: {node: '>=4'} + dev: true + /camelcase@5.3.1: resolution: {integrity: sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==} engines: {node: '>=6'} @@ -5523,7 +7145,6 @@ packages: /camelcase@6.3.0: resolution: {integrity: sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==} engines: {node: '>=10'} - dev: false /camelize@1.0.1: resolution: {integrity: sha512-dU+Tx2fsypxTgtLoE36npi3UqcjSSMNYfkqgmoEhtZrraP5VWq0K7FkWVTYa8eMPtnU/G2txVsfdCJTn9uzpuQ==} @@ -5533,13 +7154,51 @@ packages: resolution: {integrity: sha512-bsTwuIg/BZZK/vreVTYYbSWoe2F+71P7K5QGEX+pT250DZbfU1MQ5prOKpPR+LL6uWKK3KMwMCAS74QB3Um1uw==} dependencies: browserslist: 4.23.0 - caniuse-lite: 1.0.30001599 + caniuse-lite: 1.0.30001607 lodash.memoize: 4.1.2 lodash.uniq: 4.5.0 dev: true - /caniuse-lite@1.0.30001599: - resolution: {integrity: sha512-LRAQHZ4yT1+f9LemSMeqdMpMxZcc4RMWdj4tiFe3G8tNkWK+E58g+/tzotb5cU6TbcVJLr4fySiAW7XmxQvZQA==} + /caniuse-lite@1.0.30001607: + resolution: {integrity: sha512-WcvhVRjXLKFB/kmOFVwELtMxyhq3iM/MvmXcyCe2PNf166c39mptscOc/45TTS96n2gpNV2z7+NakArTWZCQ3w==} + + /caseless@0.12.0: + resolution: {integrity: sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw==} + dev: true + + /cbor@5.2.0: + resolution: {integrity: sha512-5IMhi9e1QU76ppa5/ajP1BmMWZ2FHkhAhjeVKQ/EFCgYSEaeVaoGtL7cxJskf9oCCk+XjzaIdc3IuU/dbA/o2A==} + engines: {node: '>=6.0.0'} + dependencies: + bignumber.js: 9.1.2 + nofilter: 1.0.4 + dev: true + + /cbor@8.1.0: + resolution: {integrity: sha512-DwGjNW9omn6EwP70aXsn7FQJx5kO12tX0bZkaTjzdVFM6/7nhA4t0EENocKGx6D2Bch9PE2KzCUf5SceBdeijg==} + engines: {node: '>=12.19'} + dependencies: + nofilter: 3.1.0 + dev: true + + /chai-as-promised@7.1.1(chai@4.4.1): + resolution: {integrity: sha512-azL6xMoi+uxu6z4rhWQ1jbdUhOMhis2PvscD/xjLqNMkv3BPPp2JyyuTHOrf9BOosGpNQ11v6BKv/g57RXbiaA==} + peerDependencies: + chai: '>= 2.1.2 < 5' + dependencies: + chai: 4.4.1 + check-error: 1.0.3 + dev: true + + /chai-bn@0.2.2(bn.js@4.12.0)(chai@4.4.1): + resolution: {integrity: sha512-MzjelH0p8vWn65QKmEq/DLBG1Hle4WeyqT79ANhXZhn/UxRWO0OogkAxi5oGGtfzwU9bZR8mvbvYdoqNVWQwFg==} + peerDependencies: + bn.js: ^4.11.0 + chai: ^4.0.0 + dependencies: + bn.js: 4.12.0 + chai: 4.4.1 + dev: true /chai@4.4.1: resolution: {integrity: sha512-13sOfMv2+DWduEU+/xbun3LScLoqN17nBeTLUsmDfKdoiC1fr0n9PU4guu4AhRcOVFk/sW8LyZWHuhWtQZiF+g==} @@ -5577,12 +7236,83 @@ packages: ansi-styles: 4.3.0 supports-color: 7.2.0 + /chalk@5.3.0: + resolution: {integrity: sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==} + engines: {node: ^12.17.0 || ^14.13 || >=16.0.0} + dev: true + + /change-case@3.0.2: + resolution: {integrity: sha512-Mww+SLF6MZ0U6kdg11algyKd5BARbyM4TbFBepwowYSR5ClfQGCGtxNXgykpN0uF/bstWeaGDT4JWaDh8zWAHA==} + dependencies: + camel-case: 3.0.0 + constant-case: 2.0.0 + dot-case: 2.1.1 + header-case: 1.0.1 + is-lower-case: 1.1.3 + is-upper-case: 1.1.2 + lower-case: 1.1.4 + lower-case-first: 1.0.2 + no-case: 2.3.2 + param-case: 2.1.1 + pascal-case: 2.0.1 + path-case: 2.1.1 + sentence-case: 2.1.1 + snake-case: 2.1.0 + swap-case: 1.1.2 + title-case: 2.1.1 + upper-case: 1.1.3 + upper-case-first: 1.1.2 + dev: true + + /charenc@0.0.2: + resolution: {integrity: sha512-yrLQ/yVUFXkzg7EDQsPieE/53+0RlaWTs+wBrvW36cyilJ2SaDWfl4Yj7MtLTXleV9uEKefbAGUPv2/iWSooRA==} + dev: true + /check-error@1.0.3: resolution: {integrity: sha512-iKEoDYaRmd1mxM90a2OEfWhjsjPpYPuQ+lMYsoxB126+t8fw7ySEO48nmDg5COTjxDI65/Y2OWpeEHk3ZOe8zg==} dependencies: get-func-name: 2.0.2 dev: true + /cheerio-select@2.1.0: + resolution: {integrity: sha512-9v9kG0LvzrlcungtnJtpGNxY+fzECQKhK4EGJX2vByejiMX84MFNQw4UxPJl3bFbTMw+Dfs37XaIkCwTZfLh4g==} + dependencies: + boolbase: 1.0.0 + css-select: 5.1.0 + css-what: 6.1.0 + domelementtype: 2.3.0 + domhandler: 5.0.3 + domutils: 3.1.0 + dev: true + + /cheerio@1.0.0-rc.12: + resolution: {integrity: sha512-VqR8m68vM46BNnuZ5NtnGBKIE/DfN0cRIzg9n40EIq9NOv90ayxLBXA8fXC5gquFRGJSTRqBq25Jt2ECLR431Q==} + engines: {node: '>= 6'} + dependencies: + cheerio-select: 2.1.0 + dom-serializer: 2.0.0 + domhandler: 5.0.3 + domutils: 3.1.0 + htmlparser2: 8.0.2 + parse5: 7.1.2 + parse5-htmlparser2-tree-adapter: 7.0.0 + dev: true + + /chokidar@3.5.3: + resolution: {integrity: sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==} + engines: {node: '>= 8.10.0'} + dependencies: + anymatch: 3.1.3 + braces: 3.0.2 + glob-parent: 5.1.2 + is-binary-path: 2.1.0 + is-glob: 4.0.3 + normalize-path: 3.0.0 + readdirp: 3.6.0 + optionalDependencies: + fsevents: 2.3.3 + dev: true + /chokidar@3.6.0: resolution: {integrity: sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==} engines: {node: '>= 8.10.0'} @@ -5597,12 +7327,16 @@ packages: optionalDependencies: fsevents: 2.3.3 + /chownr@1.1.4: + resolution: {integrity: sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==} + dev: true + /chrome-launcher@0.15.2: resolution: {integrity: sha512-zdLEwNo3aUVzIhKhTtXfxhdvZhUghrnmkvcAq2NoDd+LeOHKf03H5jwZ8T/STsAlzyALkBVK552iaG1fGf1xVQ==} engines: {node: '>=12.13.0'} hasBin: true dependencies: - '@types/node': 20.11.30 + '@types/node': 20.12.5 escape-string-regexp: 4.0.0 is-wsl: 2.2.0 lighthouse-logger: 1.4.2 @@ -5613,7 +7347,7 @@ packages: /chromium-edge-launcher@1.0.0: resolution: {integrity: sha512-pgtgjNKZ7i5U++1g1PWv75umkHvhVTDOQIZ+sjeUX9483S7Y6MUvO0lrd7ShGlQlFHMN4SwKTCq/X8hWrbv2KA==} dependencies: - '@types/node': 20.11.30 + '@types/node': 20.12.5 escape-string-regexp: 4.0.0 is-wsl: 2.2.0 lighthouse-logger: 1.4.2 @@ -5625,19 +7359,51 @@ packages: /ci-info@2.0.0: resolution: {integrity: sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==} - dev: false /ci-info@3.9.0: resolution: {integrity: sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==} engines: {node: '>=8'} dev: false + /cids@0.7.5: + resolution: {integrity: sha512-zT7mPeghoWAu+ppn8+BS1tQ5qGmbMfB4AregnQjA/qHY3GC1m1ptI9GkWNlgeu38r7CuRdXB47uY2XgAYt6QVA==} + engines: {node: '>=4.0.0', npm: '>=3.0.0'} + deprecated: This module has been superseded by the multiformats module + dependencies: + buffer: 5.7.1 + class-is: 1.1.0 + multibase: 0.6.1 + multicodec: 1.0.4 + multihashes: 0.4.21 + dev: true + + /cipher-base@1.0.4: + resolution: {integrity: sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==} + dependencies: + inherits: 2.0.4 + safe-buffer: 5.2.1 + dev: true + /citty@0.1.6: resolution: {integrity: sha512-tskPPKEs8D2KPafUypv2gxwJP8h/OaJmC82QQGGDQcHvXX43xF2VDACcJVmZ0EuSxkpO9Kc4MlrA3q0+FG58AQ==} dependencies: consola: 3.2.3 dev: false + /class-is@1.1.0: + resolution: {integrity: sha512-rhjH9AG1fvabIDoGRVH587413LPjTZgmDF9fOFCbFJQV4yuocX1mHxxvXI4g3cGwbVY9wAYIoKlg1N79frJKQw==} + dev: true + + /clean-stack@2.2.0: + resolution: {integrity: sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==} + engines: {node: '>=6'} + dev: true + + /cli-boxes@2.2.1: + resolution: {integrity: sha512-y4coMcylgSCdVinjiDBuR8PCC2bLjyGTwEmPb9NHR/QaNU6EUOXcTY/s6VjGMD6ENSEaeQYHCY0GNGS5jfMwPw==} + engines: {node: '>=6'} + dev: true + /cli-cursor@3.1.0: resolution: {integrity: sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==} engines: {node: '>=8'} @@ -5650,6 +7416,16 @@ packages: engines: {node: '>=6'} dev: false + /cli-table3@0.5.1: + resolution: {integrity: sha512-7Qg2Jrep1S/+Q3EceiZtQcDPWxhAvBw+ERf1162v4sikJrvojMHFqXt8QIVha8UlH9rgU0BeWPytZ9/TzYqlUw==} + engines: {node: '>=6'} + dependencies: + object-assign: 4.1.1 + string-width: 2.1.1 + optionalDependencies: + colors: 1.4.0 + dev: true + /client-only@0.0.1: resolution: {integrity: sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA==} dev: false @@ -5663,6 +7439,14 @@ packages: is64bit: 2.0.0 dev: false + /cliui@3.2.0: + resolution: {integrity: sha512-0yayqDxWQbqk3ojkYqUKqaAQ6AfNKeKWRNA8kR0WXzAsdHpP4BIaOmMAG87JGuO6qcobyW4GjxHd9PmhEd+T9w==} + dependencies: + string-width: 1.0.2 + strip-ansi: 3.0.1 + wrap-ansi: 2.1.0 + dev: true + /cliui@6.0.0: resolution: {integrity: sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==} dependencies: @@ -5671,6 +7455,14 @@ packages: wrap-ansi: 6.2.0 dev: false + /cliui@7.0.4: + resolution: {integrity: sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==} + dependencies: + string-width: 4.2.3 + strip-ansi: 6.0.1 + wrap-ansi: 7.0.0 + dev: true + /cliui@8.0.1: resolution: {integrity: sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==} engines: {node: '>=12'} @@ -5689,6 +7481,12 @@ packages: shallow-clone: 3.0.1 dev: false + /clone-response@1.0.3: + resolution: {integrity: sha512-ROoL94jJH2dUVML2Y/5PEDNaSHgeOdSDicUyS7izcF63G6sTc/FTjLub4b8Il9S8S0beOfYt0TaA5qvFK+w0wA==} + dependencies: + mimic-response: 1.0.1 + dev: true + /clone@1.0.4: resolution: {integrity: sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==} engines: {node: '>=0.8'} @@ -5703,6 +7501,11 @@ packages: resolution: {integrity: sha512-q4dMFMlXtKR3XNBHyMHt/3pwYNA69EDk00lloMOaaUMKPUXBw6lpXtbu3MMVG6/uOihGnRDOlkyqsONEUj60+w==} dev: true + /code-point-at@1.1.0: + resolution: {integrity: sha512-RpAVKQA5T63xEj6/giIbUEtZwJ4UFIc3ZtvEkiaUERylqe8xb5IvqcgOurZLahv93CLKfxcw5YI+DZcUBRyLXA==} + engines: {node: '>=0.10.0'} + dev: true + /color-convert@1.9.3: resolution: {integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==} dependencies: @@ -5724,6 +7527,11 @@ packages: resolution: {integrity: sha512-Y2oEozpomLn7Q3HFP7dpww7AtMJplbM9lGZP6RDfHqmbeRjiwRg4n6VM6j4KLmRke85uWEI7JqF17f3pqdRA0g==} dev: false + /colors@1.4.0: + resolution: {integrity: sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA==} + engines: {node: '>=0.1.90'} + dev: true + /combined-stream@1.0.8: resolution: {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==} engines: {node: '>= 0.8'} @@ -5733,12 +7541,35 @@ packages: /command-exists@1.2.9: resolution: {integrity: sha512-LTQ/SGc+s0Xc0Fu5WaKnR0YiygZkm9eKFvyS+fRsU7/ZWFF8ykFM6Pc9aCVf1+xasOOZpO3BAVgVrKvsqKHV7w==} - dev: false + + /command-line-args@5.2.1: + resolution: {integrity: sha512-H4UfQhZyakIjC74I9d34fGYDwk3XpSr17QhEd0Q3I9Xq1CETHo4Hcuo87WyWHpAF1aSLjLRf5lD9ZGX2qStUvg==} + engines: {node: '>=4.0.0'} + dependencies: + array-back: 3.1.0 + find-replace: 3.0.0 + lodash.camelcase: 4.3.0 + typical: 4.0.0 + dev: true + + /command-line-usage@6.1.3: + resolution: {integrity: sha512-sH5ZSPr+7UStsloltmDh7Ce5fb8XPlHyoPzTpyyMuYCtervL65+ubVZ6Q61cFtFl62UyJlc8/JwERRbAFPUqgw==} + engines: {node: '>=8.0.0'} + dependencies: + array-back: 4.0.2 + chalk: 2.4.2 + table-layout: 1.0.2 + typical: 5.2.0 + dev: true /commander@2.20.3: resolution: {integrity: sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==} dev: false + /commander@3.0.2: + resolution: {integrity: sha512-Gar0ASD4BDyKC4hl4DwHqDrmvjoxWKZigVnAbn5H1owvm4CxCPdb0HQDehwNYMJpla5+M2tPmPARzhtYuwpHow==} + dev: true + /commander@9.5.0: resolution: {integrity: sha512-KRs7WVDKg86PWiuAqhDrAQnTXZKraVcCc6vFdL14qrZ/DcWwuRo7VoiYXalXO7S5GKpqYiVEwCbgFDfxNHKJBQ==} engines: {node: ^12.20.0 || >=14} @@ -5773,6 +7604,16 @@ packages: /concat-map@0.0.1: resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} + /concat-stream@1.6.2: + resolution: {integrity: sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==} + engines: {'0': node >= 0.8} + dependencies: + buffer-from: 1.1.2 + inherits: 2.0.4 + readable-stream: 2.3.8 + typedarray: 0.0.6 + dev: true + /connect@3.7.0: resolution: {integrity: sha512-ZqRXc+tZukToSNmh5C2iWMSoV3X1YUcPbqEM4DkEG5tNQXrQUZCNVGGv3IuicnkMtPfGf3Xtp8WCXs295iQ1pQ==} engines: {node: '>= 0.10.0'} @@ -5785,8 +7626,8 @@ packages: - supports-color dev: false - /connectkit@1.7.2(@babel/core@7.24.3)(@tanstack/react-query@5.28.6)(react-dom@18.2.0)(react-is@18.2.0)(react@18.2.0)(viem@2.8.18)(wagmi@2.5.12): - resolution: {integrity: sha512-3a8Zr8VUYva6Ou4CQBf3PmiESOPLSSRHQ62DIBXQAoHXdmNL5l7ubhSQ+xZc56KcBjGVHEI1tBW1CF7KHSa8jA==} + /connectkit@1.7.3(@babel/core@7.24.4)(@tanstack/react-query@5.29.0)(react-dom@18.2.0)(react-is@18.2.0)(react@18.2.0)(viem@2.9.13)(wagmi@2.5.19): + resolution: {integrity: sha512-q357F3N2I0s+UyTzymWnijJnPp7yZp8z+Qg803OGE/p3TeAv9o9P4uLhiSavgOjeTOxLr0rj1pgPQc3yC7zApw==} engines: {node: '>=12.4'} peerDependencies: '@tanstack/react-query': '>=5.0.0' @@ -5795,7 +7636,7 @@ packages: viem: 2.x wagmi: 2.x dependencies: - '@tanstack/react-query': 5.28.6(react@18.2.0) + '@tanstack/react-query': 5.29.0(react@18.2.0) buffer: 6.0.3 detect-browser: 5.3.0 framer-motion: 6.5.1(react-dom@18.2.0)(react@18.2.0) @@ -5805,9 +7646,9 @@ packages: react-transition-state: 1.1.5(react-dom@18.2.0)(react@18.2.0) react-use-measure: 2.1.1(react-dom@18.2.0)(react@18.2.0) resize-observer-polyfill: 1.5.1 - styled-components: 5.3.11(@babel/core@7.24.3)(react-dom@18.2.0)(react-is@18.2.0)(react@18.2.0) - viem: 2.8.18(typescript@5.4.3)(zod@3.22.4) - wagmi: 2.5.12(@tanstack/react-query@5.28.6)(@types/react@18.2.68)(react-dom@18.2.0)(react-native@0.73.6)(react@18.2.0)(typescript@5.4.3)(viem@2.8.18)(zod@3.22.4) + styled-components: 5.3.11(@babel/core@7.24.4)(react-dom@18.2.0)(react-is@18.2.0)(react@18.2.0) + viem: 2.9.13(typescript@5.4.4)(zod@3.22.4) + wagmi: 2.5.19(@tanstack/react-query@5.29.0)(@types/react@18.2.75)(react-dom@18.2.0)(react-native@0.73.6)(react@18.2.0)(typescript@5.4.4)(viem@2.9.13)(zod@3.22.4) transitivePeerDependencies: - '@babel/core' - react-is @@ -5818,26 +7659,78 @@ packages: engines: {node: ^14.18.0 || >=16.10.0} dev: false - /convert-source-map@1.9.0: - resolution: {integrity: sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==} + /constant-case@2.0.0: + resolution: {integrity: sha512-eS0N9WwmjTqrOmR3o83F5vW8Z+9R1HnVz3xmzT2PMFug9ly+Au/fxRWlEBSb6LcZwspSsEn9Xs1uw9YgzAg1EQ==} + dependencies: + snake-case: 2.1.0 + upper-case: 1.1.3 + dev: true + + /content-disposition@0.5.4: + resolution: {integrity: sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==} + engines: {node: '>= 0.6'} + dependencies: + safe-buffer: 5.2.1 + dev: true + + /content-hash@2.5.2: + resolution: {integrity: sha512-FvIQKy0S1JaWV10sMsA7TRx8bpU+pqPkhbsfvOJAdjRXvYxEckAwQWGwtRjiaJfh+E0DvcWUGqcdjwMGFjsSdw==} + dependencies: + cids: 0.7.5 + multicodec: 0.5.7 + multihashes: 0.4.21 + dev: true + + /content-type@1.0.5: + resolution: {integrity: sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==} + engines: {node: '>= 0.6'} + dev: true + + /convert-source-map@1.9.0: + resolution: {integrity: sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==} dev: false /convert-source-map@2.0.0: resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==} - /cookie-es@1.0.0: - resolution: {integrity: sha512-mWYvfOLrfEc996hlKcdABeIiPHUPC6DM2QYZdGGOvhOTbA3tjm2eBwqlJpoFdjC89NI4Qt6h0Pu06Mp+1Pj5OQ==} + /cookie-es@1.1.0: + resolution: {integrity: sha512-L2rLOcK0wzWSfSDA33YR+PUHDG10a8px7rUHKWbGLP4YfbsMed2KFUw5fczvDPbT98DDe3LEzviswl810apTEw==} dev: false + /cookie-signature@1.0.6: + resolution: {integrity: sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==} + dev: true + + /cookie@0.4.2: + resolution: {integrity: sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA==} + engines: {node: '>= 0.6'} + dev: true + + /cookie@0.6.0: + resolution: {integrity: sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw==} + engines: {node: '>= 0.6'} + dev: true + /core-js-compat@3.36.1: resolution: {integrity: sha512-Dk997v9ZCt3X/npqzyGdTlq6t7lDBhZwGvV94PKzDArjp7BTRm7WlDAXYd/OWdeFHO8OChQYRJNJvUCqCbrtKA==} dependencies: browserslist: 4.23.0 dev: false + /core-util-is@1.0.2: + resolution: {integrity: sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ==} + dev: true + /core-util-is@1.0.3: resolution: {integrity: sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==} - dev: false + + /cors@2.8.5: + resolution: {integrity: sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==} + engines: {node: '>= 0.10'} + dependencies: + object-assign: 4.1.1 + vary: 1.1.2 + dev: true /cosmiconfig@5.2.1: resolution: {integrity: sha512-H65gsXo1SKjf8zmrJ67eJk8aIRKV5ff2D4uKZIBZShbhGSpEmsQOPW/SKMKYhSTrqR7ufy6RP69rPogdaPh/kA==} @@ -5864,7 +7757,27 @@ packages: resolution: {integrity: sha512-ROmzCKrTnOwybPcJApAA6WBWij23HVfGVNKqqrZpuyZOHqK2CwHSvpGuyt/UNNvaIjEd8X5IFGp4Mh+Ie1IHJQ==} engines: {node: '>=0.8'} hasBin: true - dev: false + + /create-hash@1.2.0: + resolution: {integrity: sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==} + dependencies: + cipher-base: 1.0.4 + inherits: 2.0.4 + md5.js: 1.3.5 + ripemd160: 2.0.2 + sha.js: 2.4.11 + dev: true + + /create-hmac@1.1.7: + resolution: {integrity: sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==} + dependencies: + cipher-base: 1.0.4 + create-hash: 1.2.0 + inherits: 2.0.4 + ripemd160: 2.0.2 + safe-buffer: 5.2.1 + sha.js: 2.4.11 + dev: true /create-require@1.1.1: resolution: {integrity: sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==} @@ -5876,7 +7789,6 @@ packages: node-fetch: 2.7.0 transitivePeerDependencies: - encoding - dev: false /cross-fetch@4.0.0: resolution: {integrity: sha512-e4a5N8lVvuLgAWgnCrLr2PP0YyDOTHa9H/Rj54dirp61qXnNq46m82bRhNqIA5VccJtWBvPTFRV3TtvHUKPB1g==} @@ -5884,7 +7796,6 @@ packages: node-fetch: 2.7.0 transitivePeerDependencies: - encoding - dev: false /cross-spawn@7.0.3: resolution: {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==} @@ -5910,11 +7821,37 @@ packages: optional: true dev: false + /crypt@0.0.2: + resolution: {integrity: sha512-mCxBlsHFYh9C+HVpiEacem8FEBnMXgU9gy4zmNC+SXAZNB/1idgp/aulFJ4FgCi7GPEVbfyng092GqL2k2rmow==} + dev: true + + /crypto-addr-codec@0.1.8: + resolution: {integrity: sha512-GqAK90iLLgP3FvhNmHbpT3wR6dEdaM8hZyZtLX29SPardh3OA13RFLHDR6sntGCgRWOfiHqW6sIyohpNqOtV/g==} + dependencies: + base-x: 3.0.9 + big-integer: 1.6.36 + blakejs: 1.2.1 + bs58: 4.0.1 + ripemd160-min: 0.0.6 + safe-buffer: 5.2.1 + sha3: 2.1.4 + dev: true + /css-color-keywords@1.0.0: resolution: {integrity: sha512-FyyrDHZKEjXDpNJYvVsV960FiqQyXc/LlYmsxl2BcdMb2WPx0OGRVgTg55rPSyLSNMqP52R9r8geSp7apN3Ofg==} engines: {node: '>=4'} dev: false + /css-select@5.1.0: + resolution: {integrity: sha512-nwoRF1rvRRnnCqqY7updORDsuqKzqYJ28+oSMaJMMgOauh3fvwHqMS7EZpIPqK8GL+g9mKxF1vP/ZjSeNjEVHg==} + dependencies: + boolbase: 1.0.0 + css-what: 6.1.0 + domhandler: 5.0.3 + domutils: 3.1.0 + nth-check: 2.1.1 + dev: true + /css-to-react-native@3.2.0: resolution: {integrity: sha512-e8RKaLXMOFii+02mOlqwjbD00KSEKqblnpO9e++1aXS1fPQOpS1YoqdVHBqPjHNoxeF2mimzVqawm2KCbEdtHQ==} dependencies: @@ -5923,6 +7860,11 @@ packages: postcss-value-parser: 4.2.0 dev: false + /css-what@6.1.0: + resolution: {integrity: sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==} + engines: {node: '>= 6'} + dev: true + /css.escape@1.5.1: resolution: {integrity: sha512-YUifsXXuknHlUsmlgyY0PKzgPOr7/FjCePfHNt0jxm83wHZi44VDMQ7/fGNkjY3/jV1MC+1CmZbaHzugyeRtpg==} dev: true @@ -5952,10 +7894,30 @@ packages: /csstype@3.1.3: resolution: {integrity: sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==} + /d@1.0.2: + resolution: {integrity: sha512-MOqHvMWF9/9MX6nza0KgvFH4HpMU0EF5uUDXqX/BtxtU8NfB0QzRtJ8Oe/6SuS4kbhyzVJwjd97EA4PKrzJ8bw==} + engines: {node: '>=0.12'} + dependencies: + es5-ext: 0.10.64 + type: 2.7.2 + dev: true + /damerau-levenshtein@1.0.8: resolution: {integrity: sha512-sdQSFB7+llfUcQHUQO3+B8ERRj0Oa4w9POWMI/puGtuf7gFywGmkaLCElnudfTiKZV+NvHqL0ifzdrI8Ro7ESA==} dev: true + /dashdash@1.14.1: + resolution: {integrity: sha512-jRFi8UDGo6j+odZiEpjazZaWqEal3w/basFjQHQEwVtZJGDpxbH1MeYluwCS8Xq5wmLJooDlMgvVarmWfGM44g==} + engines: {node: '>=0.10'} + dependencies: + assert-plus: 1.0.0 + dev: true + + /data-uri-to-buffer@4.0.1: + resolution: {integrity: sha512-0R9ikRb668HB7QDxT1vkpuUBtqc53YyAwMwGeUFKRojY/NWKvdZ+9UYtRfGmhqNbRkTSVpMbmyhXipFFv2cb/A==} + engines: {node: '>= 12'} + dev: true + /data-urls@5.0.0: resolution: {integrity: sha512-ZYP5VBHshaDAiVZxjbRVcFJpc+4xGgT0bK3vzy1HLN8jTO975HEbuYzZJcHoQEY5K1a0z8YayJkyVETa08eNTg==} engines: {node: '>=18'} @@ -5995,20 +7957,24 @@ packages: resolution: {integrity: sha512-fnULvOpxnC5/Vg3NCiWelDsLiUc9bRwAPs/+LfTLNvetFCtCTN+yQz15C/fs4AwX1R9K5GLtLfn8QW+dWisaAw==} engines: {node: '>=0.11'} dependencies: - '@babel/runtime': 7.24.1 + '@babel/runtime': 7.24.4 dev: false /dax-sh@0.39.2: resolution: {integrity: sha512-gpuGEkBQM+5y6p4cWaw9+ePy5TNon+fdwFVtTI8leU3UhwhsBfPewRxMXGuQNC+M2b/MDGMlfgpqynkcd0C3FQ==} dependencies: '@deno/shim-deno': 0.19.1 - undici-types: 5.26.5 + undici-types: 5.28.4 dev: true /dayjs@1.11.10: resolution: {integrity: sha512-vjAczensTgRcqDERK0SR2XMwsF/tSvnvlv6VcF2GIhg6Sx4yOIt/irsr1RDJsKiIyBzJDpCoXiWWq28MqH2cnQ==} dev: false + /death@1.1.0: + resolution: {integrity: sha512-vsV6S4KVHvTGxbEcij7hkWRv0It+sGGWVOM67dQde/o5Xjnr+KmLjxWJii2uEObIrt1CcM9w0Yaovx+iOlIL+w==} + dev: true + /debounce@1.2.1: resolution: {integrity: sha512-XRRe6Glud4rd/ZGQfiV1ruXSfbvfJedlV9Y6zOlP+2K04vBYiJEte6stfFkCP03aMnY5tsipamumUjL14fofug==} dev: false @@ -6022,7 +7988,6 @@ packages: optional: true dependencies: ms: 2.0.0 - dev: false /debug@3.2.7: resolution: {integrity: sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==} @@ -6047,10 +8012,27 @@ packages: ms: 2.1.2 supports-color: 5.5.0 + /debug@4.3.4(supports-color@8.1.1): + resolution: {integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==} + engines: {node: '>=6.0'} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + dependencies: + ms: 2.1.2 + supports-color: 8.1.1 + dev: true + /decamelize@1.2.0: resolution: {integrity: sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==} engines: {node: '>=0.10.0'} - dev: false + + /decamelize@4.0.0: + resolution: {integrity: sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ==} + engines: {node: '>=10'} + dev: true /decimal.js@10.4.3: resolution: {integrity: sha512-VBBaLc1MgL5XpzgIP7ny5Z6Nx3UrRkIViUkPUdtl9aya5amy3De1gsUUSB1g3+3sExYNjCAsAznmukyxCb1GRA==} @@ -6059,7 +8041,20 @@ packages: /decode-uri-component@0.2.2: resolution: {integrity: sha512-FqUYQ+8o158GyGTrMFJms9qh3CqTKvAqgqsTnkLI8sKu0028orqBhxNMFkFen0zGyg6epACD32pjVk58ngIErQ==} engines: {node: '>=0.10'} - dev: false + + /decompress-response@3.3.0: + resolution: {integrity: sha512-BzRPQuY1ip+qDonAOz42gRm/pg9F768C+npV/4JOsxRC2sq+Rlk+Q4ZCAsOhnIaMrgarILY+RMUIvMmmX1qAEA==} + engines: {node: '>=4'} + dependencies: + mimic-response: 1.0.1 + dev: true + + /decompress-response@6.0.0: + resolution: {integrity: sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==} + engines: {node: '>=10'} + dependencies: + mimic-response: 3.1.0 + dev: true /deep-eql@4.1.3: resolution: {integrity: sha512-WaEtAOpRA1MQ0eohqZjpGD8zdI0Ovsm8mmFhaDN8dvDZzyoUMcYDnf5Y6iu7HTXxf8JDS23qWa4a+hKCDyOPzw==} @@ -6092,6 +8087,11 @@ packages: which-typed-array: 1.1.15 dev: true + /deep-extend@0.6.0: + resolution: {integrity: sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==} + engines: {node: '>=4.0.0'} + dev: true + /deep-is@0.1.4: resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} dev: true @@ -6107,13 +8107,10 @@ packages: clone: 1.0.4 dev: false - /define-data-property@1.1.1: - resolution: {integrity: sha512-E7uGkTzkk1d0ByLeSc6ZsFS79Axg+m1P/VsgYsxHgiuc3tFSj+MjMIwe90FC4lOAZzNBdY7kkO2P2wKdsQ1vgQ==} - engines: {node: '>= 0.4'} - dependencies: - get-intrinsic: 1.2.3 - gopd: 1.0.1 - has-property-descriptors: 1.0.1 + /defer-to-connect@2.0.1: + resolution: {integrity: sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg==} + engines: {node: '>=10'} + dev: true /define-data-property@1.1.4: resolution: {integrity: sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==} @@ -6153,7 +8150,6 @@ packages: /depd@2.0.0: resolution: {integrity: sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==} engines: {node: '>= 0.8'} - dev: false /deprecated-react-native-prop-types@5.0.0: resolution: {integrity: sha512-cIK8KYiiGVOFsKdPMmm1L3tA/Gl+JopXL6F5+C7x39MyPsQYnP57Im/D6bNUzcborD7fcMwiwZqcBdBXXZucYQ==} @@ -6176,12 +8172,16 @@ packages: /destroy@1.2.0: resolution: {integrity: sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==} engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16} - dev: false /detect-browser@5.3.0: resolution: {integrity: sha512-53rsFbGdwMwlF7qvCt0ypLM5V5/Mbl0szB7GPN8y9NCcbknYOeVVXdrXEq+90IwAfrrzt6Hd+u2E2ntakICU8w==} dev: false + /detect-indent@5.0.0: + resolution: {integrity: sha512-rlpvsxUtM0PQvy9iZe640/IWwWYyBsTApREbA1pHOpmOUIl9MkP/U4z7vTtg4Oaojvqhxt7sdufnT0EzGaR31g==} + engines: {node: '>=4'} + dev: true + /detect-libc@1.0.3: resolution: {integrity: sha512-pGjwhsmsp4kL2RTz08wcOlGN83otlqHeD/Z5T8GXZB+/YcpQ/dgo+lbU8ZsGxV0HIvqqxo9l7mqYwyYMD9bKDg==} engines: {node: '>=0.10'} @@ -6197,6 +8197,17 @@ packages: engines: {node: '>=0.3.1'} dev: true + /diff@5.0.0: + resolution: {integrity: sha512-/VTCrvm5Z0JGty/BWHljh+BAiw3IK+2j87NGMu8Nwc/f48WoDAC395uomO9ZD117ZOBaHmkX1oyLvkVM/aIT3w==} + engines: {node: '>=0.3.1'} + dev: true + + /difflib@0.2.4: + resolution: {integrity: sha512-9YVwmMb0wQHQNr5J9m6BSj6fk4pfGITGQOOs+D9Fl+INODWFOfvhIU1hNv6GgR1RBoC/9NJcwu77zShxV0kT7w==} + dependencies: + heap: 0.2.7 + dev: true + /dijkstrajs@1.0.3: resolution: {integrity: sha512-qiSlmBq9+BCdCA/L46dw8Uy93mloxsPSbwnm5yrKn2vMPiy8KyAskTF6zuV/j5BMsmOGZDPs7KjU+mjb670kfA==} dev: false @@ -6208,8 +8219,8 @@ packages: path-type: 4.0.0 dev: true - /dnum@2.11.0: - resolution: {integrity: sha512-JaVo6HlaVC3xHqoKmiiqTqk2/z2khBmkQTaPw78WkDsJESVX0zPPAhQ3Zv/QKx4L18LkbbPHg6pKl5vdQA5YEA==} + /dnum@2.12.0: + resolution: {integrity: sha512-9KadprQFF6ftkN4MqVE2pbbvh7p5YL2z1EHon1j+OFzxTn+BhC9iufWJX0oDhLRzqzMpNramTspIS697lSfrSA==} dependencies: from-exponential: 1.1.1 dev: false @@ -6236,19 +8247,60 @@ packages: resolution: {integrity: sha512-7ZgogeTnjuHbo+ct10G9Ffp0mif17idi0IyWNVA/wcwcm7NPOD/WEHVP3n7n3MhXqxoIYm8d6MuZohYWIZ4T3w==} dev: true - /dprint@0.45.0: - resolution: {integrity: sha512-3444h7V47XoA16qgIWjw3CV/Eo/rQbT/XTGlbJ/6vJ+apQyuo0+M3Ai0GS3wu7X9HBUDcA0zIHA3mOxWNz6toA==} + /dom-serializer@2.0.0: + resolution: {integrity: sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==} + dependencies: + domelementtype: 2.3.0 + domhandler: 5.0.3 + entities: 4.5.0 + dev: true + + /dom-walk@0.1.2: + resolution: {integrity: sha512-6QvTW9mrGeIegrFXdtQi9pk7O/nSK6lSdXW2eqUspN5LWD7UTji2Fqw5V2YLjBpHEoU9Xl/eUWNpDeZvoyOv2w==} + dev: true + + /domelementtype@2.3.0: + resolution: {integrity: sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==} + dev: true + + /domhandler@5.0.3: + resolution: {integrity: sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==} + engines: {node: '>= 4'} + dependencies: + domelementtype: 2.3.0 + dev: true + + /domutils@3.1.0: + resolution: {integrity: sha512-H78uMmQtI2AhgDJjWeQmHwJJ2bLPD3GMmO7Zja/ZZh84wkm+4ut+IUnUdRa8uCGX88DiVx1j6FRe1XfxEgjEZA==} + dependencies: + dom-serializer: 2.0.0 + domelementtype: 2.3.0 + domhandler: 5.0.3 + dev: true + + /dot-case@2.1.1: + resolution: {integrity: sha512-HnM6ZlFqcajLsyudHq7LeeLDr2rFAVYtDv/hV5qchQEidSck8j9OPUsXY9KwJv/lHMtYlX4DjRQqwFYa+0r8Ug==} + dependencies: + no-case: 2.3.2 + dev: true + + /dprint@0.45.1: + resolution: {integrity: sha512-OYefcDgxd6jSdig/Cfkw1vdvyiOIRruCPnqGBbXpc95buDt9kvwL+Lic1OHc+SaQSsQub0BUZMd5+TNgy8Sh3A==} hasBin: true requiresBuild: true optionalDependencies: - '@dprint/darwin-arm64': 0.45.0 - '@dprint/darwin-x64': 0.45.0 - '@dprint/linux-arm64-glibc': 0.45.0 - '@dprint/linux-arm64-musl': 0.45.0 - '@dprint/linux-x64-glibc': 0.45.0 - '@dprint/linux-x64-musl': 0.45.0 - '@dprint/win32-x64': 0.45.0 - dev: false + '@dprint/darwin-arm64': 0.45.1 + '@dprint/darwin-x64': 0.45.1 + '@dprint/linux-arm64-glibc': 0.45.1 + '@dprint/linux-arm64-musl': 0.45.1 + '@dprint/linux-x64-glibc': 0.45.1 + '@dprint/linux-x64-musl': 0.45.1 + '@dprint/win32-x64': 0.45.1 + dev: true + + /duplexer@0.1.2: + resolution: {integrity: sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==} + dev: true /duplexify@4.1.3: resolution: {integrity: sha512-M3BmBhwJRZsSx38lZyhE53Csddgzl5R7xGJNk7CVddZD6CcmwMCH8J+7AprIrQKH7TonKxaCjcv27Qmf+sQ+oA==} @@ -6263,6 +8315,13 @@ packages: resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} dev: true + /ecc-jsbn@0.1.2: + resolution: {integrity: sha512-eh9O+hwRHNbG4BLTjEl3nw044CkGm5X6LoaCf7LPp7UU8Qrt47JYNi6nPX8xjW97TKGKm1ouctg0QSpZe9qrnw==} + dependencies: + jsbn: 0.1.1 + safer-buffer: 2.1.2 + dev: true + /eciesjs@0.3.18: resolution: {integrity: sha512-RQhegEtLSyIiGJmFTZfvCTHER/fymipXFVx6OwSRYD6hOuy+6Kjpk0dGvIfP9kxn/smBpxQy71uxpGO406ITCw==} dependencies: @@ -6273,10 +8332,21 @@ packages: /ee-first@1.1.1: resolution: {integrity: sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==} - dev: false - /electron-to-chromium@1.4.713: - resolution: {integrity: sha512-vDarADhwntXiULEdmWd77g2dV6FrNGa8ecAC29MZ4TwPut2fvosD0/5sJd1qWNNe8HcJFAC+F5Lf9jW1NPtWmw==} + /electron-to-chromium@1.4.730: + resolution: {integrity: sha512-oJRPo82XEqtQAobHpJIR3zW5YO3sSRRkPz2an4yxi1UvqhsGm54vR/wzTFV74a3soDOJ8CKW7ajOOX5ESzddwg==} + + /elliptic@6.5.4: + resolution: {integrity: sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ==} + dependencies: + bn.js: 4.12.0 + brorand: 1.1.0 + hash.js: 1.1.3 + hmac-drbg: 1.0.1 + inherits: 2.0.4 + minimalistic-assert: 1.0.1 + minimalistic-crypto-utils: 1.0.1 + dev: true /elliptic@6.5.5: resolution: {integrity: sha512-7EjbcmUm17NQFu4Pmgmq2olYMj8nwMnpcddByChSUjArp8F5DQWcIcpriwO4ZToLNAJig0yiyjswfyGNje/ixw==} @@ -6288,7 +8358,6 @@ packages: inherits: 2.0.4 minimalistic-assert: 1.0.1 minimalistic-crypto-utils: 1.0.1 - dev: false /emoji-regex@8.0.0: resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} @@ -6304,13 +8373,11 @@ packages: /encodeurl@1.0.2: resolution: {integrity: sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==} engines: {node: '>= 0.8'} - dev: false /end-of-stream@1.4.4: resolution: {integrity: sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==} dependencies: once: 1.4.0 - dev: false /engine.io-client@6.5.3(bufferutil@4.0.8)(utf-8-validate@6.0.3): resolution: {integrity: sha512-9Z0qLB0NIisTRt1DZ/8U2k12RJn8yls/nXMZLn+/N8hANT3TcYjKFKcwbw5zFQiN4NTde3TSY9zb79e1ij6j9Q==} @@ -6339,13 +8406,26 @@ packages: tapable: 2.2.1 dev: true + /enquirer@2.4.1: + resolution: {integrity: sha512-rRqJg/6gd538VHvR3PSrdRBb/1Vy2YfzHqzvbhGIQpDRKIa4FgV/54b5Q1xYSxOOwKvjXweS26E0Q+nAMwp2pQ==} + engines: {node: '>=8.6'} + dependencies: + ansi-colors: 4.1.3 + strip-ansi: 6.0.1 + dev: true + /entities@4.5.0: resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==} engines: {node: '>=0.12'} dev: true - /envinfo@7.11.1: - resolution: {integrity: sha512-8PiZgZNIB4q/Lw4AhOvAfB/ityHAd2bli3lESSWmWSzSsl5dKpy5N1d1Rfkd2teq/g9xN90lc6o98DOjMeYHpg==} + /env-paths@2.2.1: + resolution: {integrity: sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==} + engines: {node: '>=6'} + dev: true + + /envinfo@7.12.0: + resolution: {integrity: sha512-Iw9rQJBGpJRd3rwXm9ft/JiGoAZmLxxJZELYDQoPRZ4USVhkKtIcNBPw6U+/K2mBpaqM25JSV6Yl4Az9vO2wJg==} engines: {node: '>=4'} hasBin: true dev: false @@ -6354,7 +8434,6 @@ packages: resolution: {integrity: sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==} dependencies: is-arrayish: 0.2.1 - dev: false /error-stack-parser@2.1.4: resolution: {integrity: sha512-Sk5V6wVazPhq5MhpO+AUxJn5x7XSXGl1R93Vn7i+zS15KDVxQijejNCrz8340/2bgLBjR9GtEG8ZVKONDjcqGQ==} @@ -6370,55 +8449,8 @@ packages: escape-html: 1.0.3 dev: false - /es-abstract@1.22.5: - resolution: {integrity: sha512-oW69R+4q2wG+Hc3KZePPZxOiisRIqfKBVo/HLx94QcJeWGU/8sZhCvc829rd1kS366vlJbzBfXf9yWwf0+Ko7w==} - engines: {node: '>= 0.4'} - dependencies: - array-buffer-byte-length: 1.0.1 - arraybuffer.prototype.slice: 1.0.3 - available-typed-arrays: 1.0.7 - call-bind: 1.0.7 - es-define-property: 1.0.0 - es-errors: 1.3.0 - es-set-tostringtag: 2.0.3 - es-to-primitive: 1.2.1 - function.prototype.name: 1.1.6 - get-intrinsic: 1.2.4 - get-symbol-description: 1.0.2 - globalthis: 1.0.3 - gopd: 1.0.1 - has-property-descriptors: 1.0.2 - has-proto: 1.0.3 - has-symbols: 1.0.3 - hasown: 2.0.2 - internal-slot: 1.0.7 - is-array-buffer: 3.0.4 - is-callable: 1.2.7 - is-negative-zero: 2.0.3 - is-regex: 1.1.4 - is-shared-array-buffer: 1.0.3 - is-string: 1.0.7 - is-typed-array: 1.1.13 - is-weakref: 1.0.2 - object-inspect: 1.13.1 - object-keys: 1.1.1 - object.assign: 4.1.5 - regexp.prototype.flags: 1.5.2 - safe-array-concat: 1.1.2 - safe-regex-test: 1.0.3 - string.prototype.trim: 1.2.9 - string.prototype.trimend: 1.0.8 - string.prototype.trimstart: 1.0.7 - typed-array-buffer: 1.0.2 - typed-array-byte-length: 1.0.1 - typed-array-byte-offset: 1.0.2 - typed-array-length: 1.0.5 - unbox-primitive: 1.0.2 - which-typed-array: 1.1.15 - dev: true - - /es-abstract@1.23.2: - resolution: {integrity: sha512-60s3Xv2T2p1ICykc7c+DNDPLDMm9t4QxCOUU0K9JxiLjM3C1zB9YVdN7tjxrFd4+AkZ8CdX1ovUga4P2+1e+/w==} + /es-abstract@1.23.3: + resolution: {integrity: sha512-e+HfNH61Bj1X9/jLc5v1owaLYuHdeHHSQlkhCBiTK8rBvKaULl/beGMxwrMXjpYrv4pz22BlY570vVePA2ho4A==} engines: {node: '>= 0.4'} dependencies: array-buffer-byte-length: 1.0.1 @@ -6460,11 +8492,11 @@ packages: safe-regex-test: 1.0.3 string.prototype.trim: 1.2.9 string.prototype.trimend: 1.0.8 - string.prototype.trimstart: 1.0.7 + string.prototype.trimstart: 1.0.8 typed-array-buffer: 1.0.2 typed-array-byte-length: 1.0.1 typed-array-byte-offset: 1.0.2 - typed-array-length: 1.0.5 + typed-array-length: 1.0.6 unbox-primitive: 1.0.2 which-typed-array: 1.1.15 dev: true @@ -6499,7 +8531,7 @@ packages: dependencies: call-bind: 1.0.7 define-properties: 1.2.1 - es-abstract: 1.23.2 + es-abstract: 1.23.3 es-errors: 1.3.0 es-set-tostringtag: 2.0.3 function-bind: 1.1.2 @@ -6544,6 +8576,37 @@ packages: is-symbol: 1.0.4 dev: true + /es5-ext@0.10.64: + resolution: {integrity: sha512-p2snDhiLaXe6dahss1LddxqEm+SkuDvV8dnIQG0MWjyHpcMNfXKPE+/Cc0y+PhxJX3A4xGNeFCj5oc0BUh6deg==} + engines: {node: '>=0.10'} + requiresBuild: true + dependencies: + es6-iterator: 2.0.3 + es6-symbol: 3.1.4 + esniff: 2.0.1 + next-tick: 1.1.0 + dev: true + + /es6-iterator@2.0.3: + resolution: {integrity: sha512-zw4SRzoUkd+cl+ZoE15A9o1oQd920Bb0iOJMQkQhl3jNc03YqVjAhG7scf9C5KWRU/R13Orf588uCC6525o02g==} + dependencies: + d: 1.0.2 + es5-ext: 0.10.64 + es6-symbol: 3.1.4 + dev: true + + /es6-promise@4.2.8: + resolution: {integrity: sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w==} + dev: true + + /es6-symbol@3.1.4: + resolution: {integrity: sha512-U9bFFjX8tFiATgtkJ1zg25+KviIXpgRvRHS8sau3GfhVzThRQrOeksPeT0BWW2MNZs1OEWJ1DPXOQMn0KKRkvg==} + engines: {node: '>=0.12'} + dependencies: + d: 1.0.2 + ext: 1.7.0 + dev: true + /esbuild@0.19.12: resolution: {integrity: sha512-aARqgq8roFBj054KvQr5f1sFu0D65G+miZRCuJyJ0G13Zwx7vRar5Zhn2tkQNzIXcBrNVsv/8stehpj+GAjgbg==} engines: {node: '>=12'} @@ -6612,7 +8675,6 @@ packages: /escape-html@1.0.3: resolution: {integrity: sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==} - dev: false /escape-string-regexp@1.0.5: resolution: {integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==} @@ -6627,7 +8689,20 @@ packages: resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} engines: {node: '>=10'} - /eslint-config-next@14.1.4(eslint@8.57.0)(typescript@5.4.3): + /escodegen@1.8.1: + resolution: {integrity: sha512-yhi5S+mNTOuRvyW4gWlg5W1byMaQGWWSYHXsuFZ7GBo7tpyOwi2EdzMP/QWxh9hwkD2m+wDVHJsxhRIj+v/b/A==} + engines: {node: '>=0.12.0'} + hasBin: true + dependencies: + esprima: 2.7.3 + estraverse: 1.9.3 + esutils: 2.0.3 + optionator: 0.8.3 + optionalDependencies: + source-map: 0.2.0 + dev: true + + /eslint-config-next@14.1.4(eslint@8.57.0)(typescript@5.4.4): resolution: {integrity: sha512-cihIahbhYAWwXJwZkAaRPpUi5t9aOi/HdfWXOjZeUOqNWXHD8X22kd1KG58Dc3MVaRx3HoR/oMGk2ltcrqDn8g==} peerDependencies: eslint: ^7.23.0 || ^8.0.0 @@ -6637,16 +8712,16 @@ packages: optional: true dependencies: '@next/eslint-plugin-next': 14.1.4 - '@rushstack/eslint-patch': 1.8.0 - '@typescript-eslint/parser': 6.21.0(eslint@8.57.0)(typescript@5.4.3) + '@rushstack/eslint-patch': 1.10.1 + '@typescript-eslint/parser': 6.21.0(eslint@8.57.0)(typescript@5.4.4) eslint: 8.57.0 eslint-import-resolver-node: 0.3.9 eslint-import-resolver-typescript: 3.6.1(@typescript-eslint/parser@6.21.0)(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.29.1)(eslint@8.57.0) - eslint-plugin-import: 2.29.1(@typescript-eslint/parser@7.3.1)(eslint@8.57.0) + eslint-plugin-import: 2.29.1(@typescript-eslint/parser@7.6.0)(eslint@8.57.0) eslint-plugin-jsx-a11y: 6.8.0(eslint@8.57.0) eslint-plugin-react: 7.34.1(eslint@8.57.0) eslint-plugin-react-hooks: 4.6.0(eslint@8.57.0) - typescript: 5.4.3 + typescript: 5.4.4 transitivePeerDependencies: - eslint-import-resolver-webpack - supports-color @@ -6673,7 +8748,7 @@ packages: enhanced-resolve: 5.16.0 eslint: 8.57.0 eslint-module-utils: 2.8.1(@typescript-eslint/parser@6.21.0)(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.1)(eslint@8.57.0) - eslint-plugin-import: 2.29.1(@typescript-eslint/parser@7.3.1)(eslint@8.57.0) + eslint-plugin-import: 2.29.1(@typescript-eslint/parser@7.6.0)(eslint@8.57.0) fast-glob: 3.3.2 get-tsconfig: 4.7.3 is-core-module: 2.13.1 @@ -6706,7 +8781,7 @@ packages: eslint-import-resolver-webpack: optional: true dependencies: - '@typescript-eslint/parser': 6.21.0(eslint@8.57.0)(typescript@5.4.3) + '@typescript-eslint/parser': 6.21.0(eslint@8.57.0)(typescript@5.4.4) debug: 3.2.7 eslint: 8.57.0 eslint-import-resolver-node: 0.3.9 @@ -6715,7 +8790,7 @@ packages: - supports-color dev: true - /eslint-module-utils@2.8.1(@typescript-eslint/parser@7.3.1)(eslint-import-resolver-node@0.3.9)(eslint@8.57.0): + /eslint-module-utils@2.8.1(@typescript-eslint/parser@7.6.0)(eslint-import-resolver-node@0.3.9)(eslint@8.57.0): resolution: {integrity: sha512-rXDXR3h7cs7dy9RNpUlQf80nX31XWJEyGq1tRMo+6GsO5VmTe4UTwtmonAD4ZkAsrfMVDA2wlGJ3790Ys+D49Q==} engines: {node: '>=4'} peerDependencies: @@ -6736,7 +8811,7 @@ packages: eslint-import-resolver-webpack: optional: true dependencies: - '@typescript-eslint/parser': 7.3.1(eslint@8.57.0)(typescript@5.4.3) + '@typescript-eslint/parser': 7.6.0(eslint@8.57.0)(typescript@5.4.4) debug: 3.2.7 eslint: 8.57.0 eslint-import-resolver-node: 0.3.9 @@ -6744,7 +8819,7 @@ packages: - supports-color dev: true - /eslint-plugin-import@2.29.1(@typescript-eslint/parser@7.3.1)(eslint@8.57.0): + /eslint-plugin-import@2.29.1(@typescript-eslint/parser@7.6.0)(eslint@8.57.0): resolution: {integrity: sha512-BbPC0cuExzhiMo4Ff1BTVwHpjjv28C5R+btTOGaCRC7UEz801up0JadwkeSk5Ued6TG34uaczuVuH6qyy5YUxw==} engines: {node: '>=4'} peerDependencies: @@ -6754,7 +8829,7 @@ packages: '@typescript-eslint/parser': optional: true dependencies: - '@typescript-eslint/parser': 7.3.1(eslint@8.57.0)(typescript@5.4.3) + '@typescript-eslint/parser': 7.6.0(eslint@8.57.0)(typescript@5.4.4) array-includes: 3.1.8 array.prototype.findlastindex: 1.2.5 array.prototype.flat: 1.3.2 @@ -6763,7 +8838,7 @@ packages: doctrine: 2.1.0 eslint: 8.57.0 eslint-import-resolver-node: 0.3.9 - eslint-module-utils: 2.8.1(@typescript-eslint/parser@7.3.1)(eslint-import-resolver-node@0.3.9)(eslint@8.57.0) + eslint-module-utils: 2.8.1(@typescript-eslint/parser@7.6.0)(eslint-import-resolver-node@0.3.9)(eslint@8.57.0) hasown: 2.0.2 is-core-module: 2.13.1 is-glob: 4.0.3 @@ -6785,7 +8860,7 @@ packages: peerDependencies: eslint: ^3 || ^4 || ^5 || ^6 || ^7 || ^8 dependencies: - '@babel/runtime': 7.24.1 + '@babel/runtime': 7.24.4 aria-query: 5.3.0 array-includes: 3.1.8 array.prototype.flatmap: 1.3.2 @@ -6840,7 +8915,7 @@ packages: minimatch: 3.1.2 object.entries: 1.1.8 object.fromentries: 2.0.8 - object.hasown: 1.1.3 + object.hasown: 1.1.4 object.values: 1.2.0 prop-types: 15.8.1 resolve: 2.0.0-next.5 @@ -6908,6 +8983,16 @@ packages: - supports-color dev: true + /esniff@2.0.1: + resolution: {integrity: sha512-kTUIGKQ/mDPFoJ0oVfcmyJn4iBDRptjNVIzwIFR7tqWXdVI9xfA2RMwY/gbSpJG3lkdWNEjLap/NqVHZiJsdfg==} + engines: {node: '>=0.10'} + dependencies: + d: 1.0.2 + es5-ext: 0.10.64 + event-emitter: 0.3.5 + type: 2.7.2 + dev: true + /espree@9.6.1: resolution: {integrity: sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} @@ -6917,6 +9002,12 @@ packages: eslint-visitor-keys: 3.4.3 dev: true + /esprima@2.7.3: + resolution: {integrity: sha512-OarPfz0lFCiW4/AV2Oy1Rp9qu0iusTKqykwTspGCZtPxmF81JR4MmIebvF1F9+UOKth2ZubLQ4XGGaU+hSn99A==} + engines: {node: '>=0.10.0'} + hasBin: true + dev: true + /esprima@4.0.1: resolution: {integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==} engines: {node: '>=4'} @@ -6936,6 +9027,11 @@ packages: estraverse: 5.3.0 dev: true + /estraverse@1.9.3: + resolution: {integrity: sha512-25w1fMXQrGdoquWnScXZGckOv+Wes+JDnuN/+7ex3SauFRS72r2lFDec0EKPt2YD1wUJ/IrfEex+9yp4hfSOJA==} + engines: {node: '>=0.10.0'} + dev: true + /estraverse@5.3.0: resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} engines: {node: '>=4.0'} @@ -6958,7 +9054,6 @@ packages: /etag@1.8.1: resolution: {integrity: sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==} engines: {node: '>= 0.6'} - dev: false /eth-block-tracker@7.1.0: resolution: {integrity: sha512-8YdplnuE1IK4xfqpf4iU7oBxnOYAc35934o083G8ao+8WM8QQtt/mVlAY6yIAdY1eMeLqg4Z//PZjJGmWGPMRg==} @@ -6973,6 +9068,40 @@ packages: - supports-color dev: false + /eth-ens-namehash@2.0.8: + resolution: {integrity: sha512-VWEI1+KJfz4Km//dadyvBBoBeSQ0MHTXPvr8UIXiLW6IanxvAV+DmlZAijZwAyggqGUfwQBeHf7tc9wzc1piSw==} + dependencies: + idna-uts46-hx: 2.3.1 + js-sha3: 0.5.7 + dev: true + + /eth-gas-reporter@0.2.27: + resolution: {integrity: sha512-femhvoAM7wL0GcI8ozTdxfuBtBFJ9qsyIAsmKVjlWAHUbdnnXHt+lKzz/kmldM5lA9jLuNHGwuIxorNpLbR1Zw==} + peerDependencies: + '@codechecks/client': ^0.1.0 + peerDependenciesMeta: + '@codechecks/client': + optional: true + dependencies: + '@solidity-parser/parser': 0.14.5 + axios: 1.6.8 + cli-table3: 0.5.1 + colors: 1.4.0 + ethereum-cryptography: 1.2.0 + ethers: 5.7.2 + fs-readdir-recursive: 1.1.0 + lodash: 4.17.21 + markdown-table: 1.1.3 + mocha: 10.4.0 + req-cwd: 2.0.0 + sha1: 1.1.1 + sync-request: 6.1.0 + transitivePeerDependencies: + - bufferutil + - debug + - utf-8-validate + dev: true + /eth-json-rpc-filters@6.0.1: resolution: {integrity: sha512-ITJTvqoCw6OVMLs7pI8f4gG92n/St6x80ACtHodeS+IXmO0w+t1T5OOzfSt7KLSMLRkVUoexV7tztLgDxg+iig==} engines: {node: '>=14.0.0'} @@ -6984,7 +9113,30 @@ packages: pify: 5.0.0 dev: false - /eth-query@2.1.2: + /eth-lib@0.1.29: + resolution: {integrity: sha512-bfttrr3/7gG4E02HoWTDUcDDslN003OlOoBxk9virpAZQ1ja/jDgwkWB8QfJF7ojuEowrqy+lzp9VcJG7/k5bQ==} + dependencies: + bn.js: 4.12.0 + elliptic: 6.5.5 + nano-json-stream-parser: 0.1.2 + servify: 0.1.12 + ws: 3.3.3 + xhr-request-promise: 0.1.3 + transitivePeerDependencies: + - bufferutil + - supports-color + - utf-8-validate + dev: true + + /eth-lib@0.2.8: + resolution: {integrity: sha512-ArJ7x1WcWOlSpzdoTBX8vkwlkSQ85CjjifSZtV4co64vWxSV8geWfPI9x4SVYu3DSxnX4yWFVTtGL+j9DUFLNw==} + dependencies: + bn.js: 4.12.0 + elliptic: 6.5.5 + xhr-request-promise: 0.1.3 + dev: true + + /eth-query@2.1.2: resolution: {integrity: sha512-srES0ZcvwkR/wd5OQBRA1bIJMww1skfGS0s8wlwK3/oNP4+wnds60krvu5R1QbpRQjMmpG5OMIWro5s7gvDPsA==} dependencies: json-rpc-random-id: 1.0.1 @@ -6997,6 +9149,41 @@ packages: fast-safe-stringify: 2.1.1 dev: false + /ethereum-bloom-filters@1.0.10: + resolution: {integrity: sha512-rxJ5OFN3RwjQxDcFP2Z5+Q9ho4eIdEmSc2ht0fCu8Se9nbXjZ7/031uXoUYJ87KHCOdVeiUuwSnoS7hmYAGVHA==} + dependencies: + js-sha3: 0.8.0 + dev: true + + /ethereum-cryptography@0.1.3: + resolution: {integrity: sha512-w8/4x1SGGzc+tO97TASLja6SLd3fRIK2tLVcV2Gx4IB21hE19atll5Cq9o3d0ZmAYC/8aw0ipieTSiekAea4SQ==} + dependencies: + '@types/pbkdf2': 3.1.2 + '@types/secp256k1': 4.0.6 + blakejs: 1.2.1 + browserify-aes: 1.2.0 + bs58check: 2.1.2 + create-hash: 1.2.0 + create-hmac: 1.1.7 + hash.js: 1.1.7 + keccak: 3.0.4 + pbkdf2: 3.1.2 + randombytes: 2.1.0 + safe-buffer: 5.2.1 + scrypt-js: 3.0.1 + secp256k1: 4.0.3 + setimmediate: 1.0.5 + dev: true + + /ethereum-cryptography@1.2.0: + resolution: {integrity: sha512-6yFQC9b5ug6/17CQpCyE3k9eKBMdhyVjzUy1WkiuY/E4vj/SXDBbCw8QEIaXqf0Mf2SnY6RmpDcwlUmBSS0EJw==} + dependencies: + '@noble/hashes': 1.2.0 + '@noble/secp256k1': 1.7.1 + '@scure/bip32': 1.1.5 + '@scure/bip39': 1.1.1 + dev: true + /ethereum-cryptography@2.1.3: resolution: {integrity: sha512-BlwbIL7/P45W8FGW2r7LGuvoEZ+7PWsniMvQ4p5s2xCyw9tmaDlpfsN9HjAucbF+t/qpVHwZUisgfK24TCW8aA==} dependencies: @@ -7004,7 +9191,148 @@ packages: '@noble/hashes': 1.3.3 '@scure/bip32': 1.3.3 '@scure/bip39': 1.2.2 - dev: false + + /ethereum-ens@0.8.0: + resolution: {integrity: sha512-a8cBTF4AWw1Q1Y37V1LSCS9pRY4Mh3f8vCg5cbXCCEJ3eno1hbI/+Ccv9SZLISYpqQhaglP3Bxb/34lS4Qf7Bg==} + dependencies: + bluebird: 3.7.2 + eth-ens-namehash: 2.0.8 + js-sha3: 0.5.7 + pako: 1.0.11 + underscore: 1.13.6 + web3: 1.10.4 + transitivePeerDependencies: + - bufferutil + - encoding + - supports-color + - utf-8-validate + dev: true + + /ethereumjs-abi@0.6.8: + resolution: {integrity: sha512-Tx0r/iXI6r+lRsdvkFDlut0N08jWMnKRZ6Gkq+Nmw75lZe4e6o3EkSnkaBP5NF6+m5PTGAr9JP43N3LyeoglsA==} + dependencies: + bn.js: 4.12.0 + ethereumjs-util: 6.2.1 + dev: true + + /ethereumjs-util@6.2.1: + resolution: {integrity: sha512-W2Ktez4L01Vexijrm5EB6w7dg4n/TgpoYU4avuT5T3Vmnw/eCRtiBrJfQYS/DCSvDIOLn2k57GcHdeBcgVxAqw==} + dependencies: + '@types/bn.js': 4.11.6 + bn.js: 4.12.0 + create-hash: 1.2.0 + elliptic: 6.5.5 + ethereum-cryptography: 0.1.3 + ethjs-util: 0.1.6 + rlp: 2.2.7 + dev: true + + /ethereumjs-util@7.1.5: + resolution: {integrity: sha512-SDl5kKrQAudFBUe5OJM9Ac6WmMyYmXX/6sTmLZ3ffG2eY6ZIGBes3pEDxNN6V72WyOw4CPD5RomKdsa8DAAwLg==} + engines: {node: '>=10.0.0'} + dependencies: + '@types/bn.js': 5.1.5 + bn.js: 5.2.1 + create-hash: 1.2.0 + ethereum-cryptography: 0.1.3 + rlp: 2.2.7 + dev: true + + /ethers@4.0.49: + resolution: {integrity: sha512-kPltTvWiyu+OktYy1IStSO16i2e7cS9D9OxZ81q2UUaiNPVrm/RTcbxamCXF9VUSKzJIdJV68EAIhTEVBalRWg==} + dependencies: + aes-js: 3.0.0 + bn.js: 4.12.0 + elliptic: 6.5.4 + hash.js: 1.1.3 + js-sha3: 0.5.7 + scrypt-js: 2.0.4 + setimmediate: 1.0.4 + uuid: 2.0.1 + xmlhttprequest: 1.8.0 + dev: true + + /ethers@5.7.2: + resolution: {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 + transitivePeerDependencies: + - bufferutil + - utf-8-validate + dev: true + + /ethjs-abi@0.2.1: + resolution: {integrity: sha512-g2AULSDYI6nEJyJaEVEXtTimRY2aPC2fi7ddSy0W+LXvEVL8Fe1y76o43ecbgdUKwZD+xsmEgX1yJr1Ia3r1IA==} + engines: {node: '>=6.5.0', npm: '>=3'} + dependencies: + bn.js: 4.11.6 + js-sha3: 0.5.5 + number-to-bn: 1.7.0 + dev: true + + /ethjs-unit@0.1.6: + resolution: {integrity: sha512-/Sn9Y0oKl0uqQuvgFk/zQgR7aw1g36qX/jzSQ5lSwlO0GigPymk4eGQfeNTD03w1dPOqfz8V77Cy43jH56pagw==} + engines: {node: '>=6.5.0', npm: '>=3'} + dependencies: + bn.js: 4.11.6 + number-to-bn: 1.7.0 + dev: true + + /ethjs-util@0.1.6: + resolution: {integrity: sha512-CUnVOQq7gSpDHZVVrQW8ExxUETWrnrvXYvYz55wOU8Uj4VCgw56XC2B/fVqQN+f7gmrnRHSLVnFAwsCuNwji8w==} + engines: {node: '>=6.5.0', npm: '>=3'} + dependencies: + is-hex-prefixed: 1.0.0 + strip-hex-prefix: 1.0.0 + dev: true + + /event-emitter@0.3.5: + resolution: {integrity: sha512-D9rRn9y7kLPnJ+hMq7S/nhvoKwwvVJahBi2BPmx3bvbsEdK3W9ii8cBSGjP+72/LnM4n6fo3+dkCX5FeTQruXA==} + dependencies: + d: 1.0.2 + es5-ext: 0.10.64 + dev: true + + /event-stream@3.3.4: + resolution: {integrity: sha512-QHpkERcGsR0T7Qm3HNJSyXKEEj8AHNxkY3PK8TS2KJvQ7NiSHe3DDpwVKKtoYprL/AreyzFBeIkBIWChAqn60g==} + dependencies: + duplexer: 0.1.2 + from: 0.1.7 + map-stream: 0.1.0 + pause-stream: 0.0.11 + split: 0.3.3 + stream-combiner: 0.0.4 + through: 2.3.8 + dev: true /event-target-shim@5.0.1: resolution: {integrity: sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==} @@ -7015,6 +9343,10 @@ packages: resolution: {integrity: sha512-JEPTiaOt9f04oa6NOkc4aH+nVp5I3wEjpHbIPqfgCdD5v5bUzy7xQqwcVO2aDQgOWhI28da57HksMrzK9HlRxg==} dev: false + /eventemitter3@4.0.4: + resolution: {integrity: sha512-rlaVLnVxtxvoyLsQQFBx53YmXHDxRIzzTLbdfxqi4yocpSjAxXwkU0cScM5JgSKMqEhrZpnvQ2D9gjylR0AimQ==} + dev: true + /eventemitter3@5.0.1: resolution: {integrity: sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==} dev: false @@ -7024,6 +9356,13 @@ packages: engines: {node: '>=0.8.x'} dev: false + /evp_bytestokey@1.0.3: + resolution: {integrity: sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==} + dependencies: + md5.js: 1.3.5 + safe-buffer: 5.2.1 + dev: true + /execa@5.1.1: resolution: {integrity: sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==} engines: {node: '>=10'} @@ -7053,6 +9392,55 @@ packages: signal-exit: 4.1.0 strip-final-newline: 3.0.0 + /express@4.19.2: + resolution: {integrity: sha512-5T6nhjsT+EOMzuck8JjBHARTHfMht0POzlA60WV2pMD3gyXw2LZnZ+ueGdNxG+0calOJcWKbpFcuzLZ91YWq9Q==} + engines: {node: '>= 0.10.0'} + dependencies: + accepts: 1.3.8 + array-flatten: 1.1.1 + body-parser: 1.20.2 + content-disposition: 0.5.4 + content-type: 1.0.5 + cookie: 0.6.0 + cookie-signature: 1.0.6 + debug: 2.6.9 + depd: 2.0.0 + encodeurl: 1.0.2 + escape-html: 1.0.3 + etag: 1.8.1 + finalhandler: 1.2.0 + fresh: 0.5.2 + http-errors: 2.0.0 + merge-descriptors: 1.0.1 + methods: 1.1.2 + on-finished: 2.4.1 + parseurl: 1.3.3 + path-to-regexp: 0.1.7 + proxy-addr: 2.0.7 + qs: 6.11.0 + range-parser: 1.2.1 + safe-buffer: 5.2.1 + send: 0.18.0 + serve-static: 1.15.0 + setprototypeof: 1.2.0 + statuses: 2.0.1 + type-is: 1.6.18 + utils-merge: 1.0.1 + vary: 1.1.2 + transitivePeerDependencies: + - supports-color + dev: true + + /ext@1.7.0: + resolution: {integrity: sha512-6hxeJYaL110a9b5TEJSj0gojyHQAmA2ch5Os+ySCiA1QGdS697XWY1pzsrSjqA9LDEEgdB/KypIlR59RcLuHYw==} + dependencies: + type: 2.7.2 + dev: true + + /extend@3.0.2: + resolution: {integrity: sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==} + dev: true + /extension-port-stream@2.1.1: resolution: {integrity: sha512-qknp5o5rj2J9CRKfVB8KJr+uXQlrojNZzdESUPhKYLXf97TPcGf6qWWKmpsNNtUyOdzFhab1ON0jzouNxHHvow==} engines: {node: '>=12.0.0'} @@ -7060,6 +9448,18 @@ packages: webextension-polyfill: 0.10.0 dev: false + /extsprintf@1.3.0: + resolution: {integrity: sha512-11Ndz7Nv+mvAC1j0ktTa7fAb0vLyGGX+rMHNBYQviQDGU0Hw7lhctJANqbPhu9nV9/izT/IntTgZ7Im/9LJs9g==} + engines: {'0': node >=0.6.0} + dev: true + + /fast-check@3.1.1: + resolution: {integrity: sha512-3vtXinVyuUKCKFKYcwXhGE6NtGWkqF8Yh3rvMZNzmwz8EPrgoc/v4pDdLHyLnCyCI5MZpZZkDEwFyXyEONOxpA==} + engines: {node: '>=8.0.0'} + dependencies: + pure-rand: 5.0.5 + dev: true + /fast-deep-equal@2.0.1: resolution: {integrity: sha512-bCK/2Z4zLidyB4ReuIsvALH6w31YfAQDmXMqMx6FyfHqvBxtjC0eRumeSu4Bs3XtXwpyIywtSTrVT99BxY1f9w==} dev: false @@ -7115,6 +9515,14 @@ packages: bser: 2.1.1 dev: false + /fetch-blob@3.2.0: + resolution: {integrity: sha512-7yAQpD2UMJzLi1Dqv7qFYnPbaPx7ZfFK6PiIxQ4PfkGPyNyl2Ugx+a/umUonmKqjhM4DnfbMvdX6otXq83soQQ==} + engines: {node: ^12.20 || >= 14.13} + dependencies: + node-domexception: 1.0.0 + web-streams-polyfill: 3.3.3 + dev: true + /file-entry-cache@6.0.1: resolution: {integrity: sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==} engines: {node: ^10.12.0 || >=12.0.0} @@ -7157,6 +9565,21 @@ packages: - supports-color dev: false + /finalhandler@1.2.0: + resolution: {integrity: sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==} + engines: {node: '>= 0.8'} + dependencies: + debug: 2.6.9 + encodeurl: 1.0.2 + escape-html: 1.0.3 + on-finished: 2.4.1 + parseurl: 1.3.3 + statuses: 2.0.1 + unpipe: 1.0.0 + transitivePeerDependencies: + - supports-color + dev: true + /find-cache-dir@2.1.0: resolution: {integrity: sha512-Tq6PixE0w/VMFfCgbONnkiQIVol/JJL7nRMi20fqzA4NRs9AfeqMGeRdPi3wIhYkxjeBaWh2rxwapn5Tu3IqOQ==} engines: {node: '>=6'} @@ -7166,10 +9589,32 @@ packages: pkg-dir: 3.0.0 dev: false + /find-replace@3.0.0: + resolution: {integrity: sha512-6Tb2myMioCAgv5kfvP5/PkZZ/ntTpVK39fHY7WkWBgvbeE+VHd/tZuZ4mrC+bxh4cfOZeYKVPaJIZtZXV7GNCQ==} + engines: {node: '>=4.0.0'} + dependencies: + array-back: 3.1.0 + dev: true + /find-root@1.1.0: resolution: {integrity: sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng==} dev: false + /find-up@1.1.2: + resolution: {integrity: sha512-jvElSjyuo4EMQGoTwo1uJU5pQMwTW5lS1x05zzfJuTIyLR3zwO27LYrxNg+dlvKpGOuGy/MzBdXh80g0ve5+HA==} + engines: {node: '>=0.10.0'} + dependencies: + path-exists: 2.1.0 + pinkie-promise: 2.0.1 + dev: true + + /find-up@2.1.0: + resolution: {integrity: sha512-NWzkk0jSJtTt08+FBFMvXoeZnOJD+jTtsRmBYbAIzJdX6l7dLgR7CTubCM5/eDdPUBvLCeVasP1brfVR/9/EZQ==} + engines: {node: '>=4'} + dependencies: + locate-path: 2.0.0 + dev: true + /find-up@3.0.0: resolution: {integrity: sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==} engines: {node: '>=6'} @@ -7207,6 +9652,11 @@ packages: rimraf: 3.0.2 dev: true + /flat@5.0.2: + resolution: {integrity: sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==} + hasBin: true + dev: true + /flatted@3.3.1: resolution: {integrity: sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw==} dev: true @@ -7240,6 +9690,18 @@ packages: tabbable: 6.2.0 dev: false + /follow-redirects@1.15.6(debug@4.3.4): + resolution: {integrity: sha512-wWN62YITEaOpSK584EZXJafH1AGpO8RVgElfkuXbTOrPX4fIfOyEpW/CsiNd8JdYrAoOvafRTOEnvsO++qCqFA==} + engines: {node: '>=4.0'} + peerDependencies: + debug: '*' + peerDependenciesMeta: + debug: + optional: true + dependencies: + debug: 4.3.4(supports-color@5.5.0) + dev: true + /for-each@0.3.3: resolution: {integrity: sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==} dependencies: @@ -7253,6 +9715,32 @@ packages: signal-exit: 4.1.0 dev: true + /forever-agent@0.6.1: + resolution: {integrity: sha512-j0KLYPhm6zeac4lz3oJ3o65qvgQCcPubiyotZrXqEaG4hNagNYO8qdlUrX5vwqv9ohqeT/Z3j6+yW067yWWdUw==} + dev: true + + /form-data-encoder@1.7.1: + resolution: {integrity: sha512-EFRDrsMm/kyqbTQocNvRXMLjc7Es2Vk+IQFx/YW7hkUH1eBl4J1fqiP34l74Yt0pFLCNpc06fkbVk00008mzjg==} + dev: true + + /form-data@2.3.3: + resolution: {integrity: sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==} + engines: {node: '>= 0.12'} + dependencies: + asynckit: 0.4.0 + combined-stream: 1.0.8 + mime-types: 2.1.35 + dev: true + + /form-data@2.5.1: + resolution: {integrity: sha512-m21N3WOmEEURgk6B9GLOE4RuWOFf28Lhh9qGYeNlGq4VDXUlJy2th2slBNU8Gp8EzloYZOibZJ7t5ecIrFSjVA==} + engines: {node: '>= 0.12'} + dependencies: + asynckit: 0.4.0 + combined-stream: 1.0.8 + mime-types: 2.1.35 + dev: true + /form-data@4.0.0: resolution: {integrity: sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==} engines: {node: '>= 6'} @@ -7262,6 +9750,22 @@ packages: mime-types: 2.1.35 dev: true + /formdata-polyfill@4.0.10: + resolution: {integrity: sha512-buewHzMvYL29jdeQTVILecSaZKnt/RJWjoZCF5OW60Z67/GmSLBkOFM7qh1PI3zFNtJbaZL5eQu1vLfazOwj4g==} + engines: {node: '>=12.20.0'} + dependencies: + fetch-blob: 3.2.0 + dev: true + + /forwarded@0.2.0: + resolution: {integrity: sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==} + engines: {node: '>= 0.6'} + dev: true + + /fp-ts@1.19.3: + resolution: {integrity: sha512-H5KQDspykdHuztLTg+ajGN0Z2qUjcEf3Ybxc6hLt0k7/zPkn29XnKnxlBPyW2XIddWrGaJBzBl4VLYOtk39yZg==} + dev: true + /framer-motion@6.5.1(react-dom@18.2.0)(react@18.2.0): resolution: {integrity: sha512-o1BGqqposwi7cgDrtg0dNONhkmPsUFDaLcKXigzuTFC5x58mE8iyTazxSudFzmT6MEyJKfjjU8ItoMe3W+3fiw==} peerDependencies: @@ -7289,12 +9793,25 @@ packages: /fresh@0.5.2: resolution: {integrity: sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==} engines: {node: '>= 0.6'} - dev: false /from-exponential@1.1.1: resolution: {integrity: sha512-VBE7f5OVnYwdgB3LHa+Qo29h8qVpxhVO9Trlc+AWm+/XNAgks1tAwMFHb33mjeiof77GglsJzeYF7OqXrROP/A==} dev: false + /from@0.1.7: + resolution: {integrity: sha512-twe20eF1OxVxp/ML/kq2p1uc6KvFK/+vs8WjEbeKmV2He22MKm7YF2ANIt+EOqhJ5L3K/SuuPhk0hWQDjOM23g==} + dev: true + + /fs-extra@0.30.0: + resolution: {integrity: sha512-UvSPKyhMn6LEd/WpUaV9C9t3zATuqoqfWc3QdPhPLb58prN9tqYPlPWi8Krxi44loBoUzlobqZ3+8tGpxxSzwA==} + dependencies: + graceful-fs: 4.2.11 + jsonfile: 2.4.0 + klaw: 1.3.1 + path-is-absolute: 1.0.1 + rimraf: 2.7.1 + dev: true + /fs-extra@11.2.0: resolution: {integrity: sha512-PmDi3uwK5nFuXh7XDTlVnS17xJS7vW36is2+w3xcv8SVxiB4NyATf4ctkVY5bkSjX0Y4nbvZCq1/EjtEyr9ktw==} engines: {node: '>=14.14'} @@ -7304,6 +9821,23 @@ packages: universalify: 2.0.1 dev: true + /fs-extra@4.0.3: + resolution: {integrity: sha512-q6rbdDd1o2mAnQreO7YADIxf/Whx4AHBiRf6d+/cVT8h44ss+lHgxf1FemcqDnQt9X3ct4McHr+JMGlYSsK7Cg==} + dependencies: + graceful-fs: 4.2.11 + jsonfile: 4.0.0 + universalify: 0.1.2 + dev: true + + /fs-extra@7.0.1: + resolution: {integrity: sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==} + engines: {node: '>=6 <7 || >=8'} + dependencies: + graceful-fs: 4.2.11 + jsonfile: 4.0.0 + universalify: 0.1.2 + dev: true + /fs-extra@8.1.0: resolution: {integrity: sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==} engines: {node: '>=6 <7 || >=8'} @@ -7311,7 +9845,26 @@ packages: graceful-fs: 4.2.11 jsonfile: 4.0.0 universalify: 0.1.2 - dev: false + + /fs-extra@9.1.0: + resolution: {integrity: sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==} + engines: {node: '>=10'} + dependencies: + at-least-node: 1.0.0 + graceful-fs: 4.2.11 + jsonfile: 6.1.0 + universalify: 2.0.1 + dev: true + + /fs-minipass@1.2.7: + resolution: {integrity: sha512-GWSSJGFy4e9GUeCcbIkED+bgAoFyj7XF1mV8rma3QW4NIqX9Kyx79N/PF61H5udOV3aY1IaMLs6pGbH71nlCTA==} + dependencies: + minipass: 2.9.0 + dev: true + + /fs-readdir-recursive@1.1.0: + resolution: {integrity: sha512-GNanXlVr2pf02+sPN40XN8HG+ePaNcvM0q5mZBd668Obwb0yD5GiUbZOFgwn8kGMY6I3mdyDJzieUy3PTYyTRA==} + dev: true /fs.realpath@1.0.0: resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} @@ -7332,7 +9885,7 @@ packages: dependencies: call-bind: 1.0.7 define-properties: 1.2.1 - es-abstract: 1.23.2 + es-abstract: 1.23.3 functions-have-names: 1.2.3 dev: true @@ -7345,47 +9898,56 @@ packages: engines: {node: '>=8'} dev: false + /fx@34.0.0: + resolution: {integrity: sha512-/fZih3/WLsrtlaj2mahjWxAmyuikmcl3D5kKPqLtFmEilLsy9wp0+/vEmfvYXXhwJc+ajtCFDCf+yttXmPMHSQ==} + hasBin: true + dev: true + /gensync@1.0.0-beta.2: resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==} engines: {node: '>=6.9.0'} + /get-caller-file@1.0.3: + resolution: {integrity: sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w==} + dev: true + /get-caller-file@2.0.5: resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} engines: {node: 6.* || 8.* || >= 10.*} - dev: false /get-func-name@2.0.2: resolution: {integrity: sha512-8vXOvuE167CtIc3OyItco7N/dpRtBbYOsPsXCz7X/PMnlGjYjSGuZJgM1Y7mmew7BKf9BqvLX2tnOVy1BBUsxQ==} dev: true - /get-intrinsic@1.2.3: - resolution: {integrity: sha512-JIcZczvcMVE7AUOP+X72bh8HqHBRxFdz5PDHYtNG/lE3yk9b3KZBJlwFcTyPYjg3L4RLLmZJzvjxhaZVapxFrQ==} - engines: {node: '>= 0.4'} - dependencies: - es-errors: 1.3.0 - function-bind: 1.1.2 - has-proto: 1.0.1 - has-symbols: 1.0.3 - hasown: 2.0.0 - /get-intrinsic@1.2.4: resolution: {integrity: sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==} engines: {node: '>= 0.4'} dependencies: es-errors: 1.3.0 function-bind: 1.1.2 - has-proto: 1.0.1 + has-proto: 1.0.3 has-symbols: 1.0.3 - hasown: 2.0.0 + hasown: 2.0.2 /get-port-please@3.1.2: resolution: {integrity: sha512-Gxc29eLs1fbn6LQ4jSU4vXjlwyZhF5HsGuMAa7gqBP4Rw4yxxltyDUuF5MBclFzDTXO+ACchGQoeela4DSfzdQ==} dev: false + /get-port@3.2.0: + resolution: {integrity: sha512-x5UJKlgeUiNT8nyo/AcnwLnZuZNcSjSw0kogRB+Whd1fjjFq4B1hySFxSFWWSn4mIBzg3sRNUDFYc4g5gjPoLg==} + engines: {node: '>=4'} + dev: true + + /get-stream@5.2.0: + resolution: {integrity: sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==} + engines: {node: '>=8'} + dependencies: + pump: 3.0.0 + dev: true + /get-stream@6.0.1: resolution: {integrity: sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==} engines: {node: '>=10'} - dev: false /get-stream@8.0.1: resolution: {integrity: sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA==} @@ -7406,6 +9968,20 @@ packages: resolve-pkg-maps: 1.0.0 dev: true + /getpass@0.1.7: + resolution: {integrity: sha512-0fzj9JxOLfJ+XGLhR8ze3unN0KZCgZwiSSDz168VERjK8Wl8kVSdcu2kspd4s4wtAa1y/qrVRiAA0WclVsu0ng==} + dependencies: + assert-plus: 1.0.0 + dev: true + + /ghost-testrpc@0.0.2: + resolution: {integrity: sha512-i08dAEgJ2g8z5buJIrCTduwPIhih3DP+hOCTyyryikfV8T0bNvHnGXO67i0DD1H4GBDETTclPy9njZbfluQYrQ==} + hasBin: true + dependencies: + chalk: 2.4.2 + node-emoji: 1.11.0 + dev: true + /glob-parent@5.1.2: resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} engines: {node: '>= 6'} @@ -7426,30 +10002,96 @@ packages: dependencies: foreground-child: 3.1.1 jackspeak: 2.3.6 - minimatch: 9.0.3 + minimatch: 9.0.4 minipass: 7.0.4 - path-scurry: 1.10.1 + path-scurry: 1.10.2 dev: true - /glob@7.2.3: - resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} + /glob@5.0.15: + resolution: {integrity: sha512-c9IPMazfRITpmAAKi22dK1VKxGDX9ehhqfABDriL/lzO92xcUKEJPQHrVA/2YHSNFB4iFlykVmWvwo48nr3OxA==} dependencies: - fs.realpath: 1.0.0 inflight: 1.0.6 inherits: 2.0.4 minimatch: 3.1.2 once: 1.4.0 path-is-absolute: 1.0.1 + dev: true - /globals@11.12.0: - resolution: {integrity: sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==} - engines: {node: '>=4'} - - /globals@13.24.0: - resolution: {integrity: sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==} - engines: {node: '>=8'} + /glob@7.1.7: + resolution: {integrity: sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ==} dependencies: - type-fest: 0.20.2 + fs.realpath: 1.0.0 + inflight: 1.0.6 + inherits: 2.0.4 + minimatch: 3.1.2 + once: 1.4.0 + path-is-absolute: 1.0.1 + dev: true + + /glob@7.2.0: + resolution: {integrity: sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==} + dependencies: + fs.realpath: 1.0.0 + inflight: 1.0.6 + inherits: 2.0.4 + minimatch: 3.1.2 + once: 1.4.0 + path-is-absolute: 1.0.1 + dev: true + + /glob@7.2.3: + resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} + dependencies: + fs.realpath: 1.0.0 + inflight: 1.0.6 + inherits: 2.0.4 + minimatch: 3.1.2 + once: 1.4.0 + path-is-absolute: 1.0.1 + + /glob@8.1.0: + resolution: {integrity: sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==} + engines: {node: '>=12'} + dependencies: + fs.realpath: 1.0.0 + inflight: 1.0.6 + inherits: 2.0.4 + minimatch: 5.0.1 + once: 1.4.0 + dev: true + + /global-modules@2.0.0: + resolution: {integrity: sha512-NGbfmJBp9x8IxyJSd1P+otYK8vonoJactOogrVfFRIAEY1ukil8RSKDz2Yo7wh1oihl51l/r6W4epkeKJHqL8A==} + engines: {node: '>=6'} + dependencies: + global-prefix: 3.0.0 + dev: true + + /global-prefix@3.0.0: + resolution: {integrity: sha512-awConJSVCHVGND6x3tmMaKcQvwXLhjdkmomy2W+Goaui8YPgYgXJZewhg3fWC+DlfqqQuWg8AwqjGTD2nAPVWg==} + engines: {node: '>=6'} + dependencies: + ini: 1.3.8 + kind-of: 6.0.3 + which: 1.3.1 + dev: true + + /global@4.4.0: + resolution: {integrity: sha512-wv/LAoHdRE3BeTGz53FAamhGlPLhlssK45usmGFThIi4XqnBmjKQ16u+RNbP7WvigRZDxUsM0J3gcQ5yicaL0w==} + dependencies: + min-document: 2.19.0 + process: 0.11.10 + dev: true + + /globals@11.12.0: + resolution: {integrity: sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==} + engines: {node: '>=4'} + + /globals@13.24.0: + resolution: {integrity: sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==} + engines: {node: '>=8'} + dependencies: + type-fest: 0.20.2 dev: true /globalthis@1.0.3: @@ -7459,6 +10101,20 @@ packages: define-properties: 1.2.1 dev: true + /globby@10.0.2: + resolution: {integrity: sha512-7dUi7RvCoT/xast/o/dLN53oqND4yk0nsHkhRgn9w65C4PofCLOoJ39iSOg+qVDdWQPIEj+eszMHQ+aLVwwQSg==} + engines: {node: '>=8'} + dependencies: + '@types/glob': 7.2.0 + array-union: 2.1.0 + dir-glob: 3.0.1 + fast-glob: 3.3.2 + glob: 7.2.3 + ignore: 5.3.1 + merge2: 1.4.1 + slash: 3.0.0 + dev: true + /globby@11.1.0: resolution: {integrity: sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==} engines: {node: '>=10'} @@ -7471,10 +10127,57 @@ packages: slash: 3.0.0 dev: true + /globby@13.2.2: + resolution: {integrity: sha512-Y1zNGV+pzQdh7H39l9zgB4PJqjRNqydvdYCDG4HFXM4XuvSaQQlEc91IU1yALL8gUTDomgBAfz3XJdmUS+oo0w==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + dependencies: + dir-glob: 3.0.1 + fast-glob: 3.3.2 + ignore: 5.3.1 + merge2: 1.4.1 + slash: 4.0.0 + dev: true + /gopd@1.0.1: resolution: {integrity: sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==} dependencies: - get-intrinsic: 1.2.3 + get-intrinsic: 1.2.4 + + /got@11.8.6: + resolution: {integrity: sha512-6tfZ91bOr7bOXnK7PRDCGBLa1H4U080YHNaAQ2KsMGlLEzRbk44nsZF2E1IeRc3vtJHPVbKCYgdFbaGO2ljd8g==} + engines: {node: '>=10.19.0'} + dependencies: + '@sindresorhus/is': 4.6.0 + '@szmarczak/http-timer': 4.0.6 + '@types/cacheable-request': 6.0.3 + '@types/responselike': 1.0.3 + cacheable-lookup: 5.0.4 + cacheable-request: 7.0.4 + decompress-response: 6.0.0 + http2-wrapper: 1.0.3 + lowercase-keys: 2.0.0 + p-cancelable: 2.1.1 + responselike: 2.0.1 + dev: true + + /got@12.1.0: + resolution: {integrity: sha512-hBv2ty9QN2RdbJJMK3hesmSkFTjVIHyIDDbssCKnSmq62edGgImJWD10Eb1k77TiV1bxloxqcFAVK8+9pkhOig==} + engines: {node: '>=14.16'} + dependencies: + '@sindresorhus/is': 4.6.0 + '@szmarczak/http-timer': 5.0.1 + '@types/cacheable-request': 6.0.3 + '@types/responselike': 1.0.3 + cacheable-lookup: 6.1.0 + cacheable-request: 7.0.4 + decompress-response: 6.0.0 + form-data-encoder: 1.7.1 + get-stream: 6.0.1 + http2-wrapper: 2.2.1 + lowercase-keys: 3.0.0 + p-cancelable: 3.0.0 + responselike: 2.0.1 + dev: true /graceful-fs@4.2.11: resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} @@ -7486,13 +10189,13 @@ packages: /h3@1.11.1: resolution: {integrity: sha512-AbaH6IDnZN6nmbnJOH72y3c5Wwh9P97soSVdGSBbcDACRdkC0FEWf25pzx4f/NuOCK6quHmW18yF2Wx+G4Zi1A==} dependencies: - cookie-es: 1.0.0 + cookie-es: 1.1.0 crossws: 0.2.4 defu: 6.1.4 destr: 2.0.3 iron-webcrypto: 1.1.0 ohash: 1.1.3 - radix3: 1.1.1 + radix3: 1.1.2 ufo: 1.5.3 uncrypto: 0.1.3 unenv: 1.9.0 @@ -7500,10 +10203,122 @@ packages: - uWebSockets.js dev: false + /handlebars@4.7.8: + resolution: {integrity: sha512-vafaFqs8MZkRrSX7sFVUdo3ap/eNiLnb4IakshzvP56X5Nr1iGKAIqdX6tMlm6HcNRIkr6AxO5jFEoJzzpT8aQ==} + engines: {node: '>=0.4.7'} + hasBin: true + dependencies: + minimist: 1.2.8 + neo-async: 2.6.2 + source-map: 0.6.1 + wordwrap: 1.0.0 + optionalDependencies: + uglify-js: 3.17.4 + dev: true + + /har-schema@2.0.0: + resolution: {integrity: sha512-Oqluz6zhGX8cyRaTQlFMPw80bSJVG2x/cFb8ZPhUILGgHka9SsokCCOQgpveePerqidZOrT14ipqfJb7ILcW5Q==} + engines: {node: '>=4'} + dev: true + + /har-validator@5.1.5: + resolution: {integrity: sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w==} + engines: {node: '>=6'} + deprecated: this library is no longer supported + dependencies: + ajv: 6.12.6 + har-schema: 2.0.0 + dev: true + + /hardhat-gas-reporter@1.0.10(hardhat@2.22.2): + resolution: {integrity: sha512-02N4+So/fZrzJ88ci54GqwVA3Zrf0C9duuTyGt0CFRIh/CdNwbnTgkXkRfojOMLBQ+6t+lBIkgbsOtqMvNwikA==} + peerDependencies: + hardhat: ^2.0.2 + dependencies: + array-uniq: 1.0.3 + eth-gas-reporter: 0.2.27 + hardhat: 2.22.2(ts-node@10.9.2)(typescript@5.4.4) + sha1: 1.1.1 + transitivePeerDependencies: + - '@codechecks/client' + - bufferutil + - debug + - utf-8-validate + dev: true + + /hardhat@2.22.2(ts-node@10.9.2)(typescript@5.4.4): + resolution: {integrity: sha512-0xZ7MdCZ5sJem4MrvpQWLR3R3zGDoHw5lsR+pBFimqwagimIOn3bWuZv69KA+veXClwI1s/zpqgwPwiFrd4Dxw==} + hasBin: true + peerDependencies: + ts-node: '*' + typescript: '*' + peerDependenciesMeta: + ts-node: + optional: true + typescript: + optional: true + dependencies: + '@ethersproject/abi': 5.7.0 + '@metamask/eth-sig-util': 4.0.1 + '@nomicfoundation/edr': 0.3.4 + '@nomicfoundation/ethereumjs-common': 4.0.4 + '@nomicfoundation/ethereumjs-tx': 5.0.4 + '@nomicfoundation/ethereumjs-util': 9.0.4 + '@nomicfoundation/solidity-analyzer': 0.1.1 + '@sentry/node': 5.30.0 + '@types/bn.js': 5.1.5 + '@types/lru-cache': 5.1.1 + adm-zip: 0.4.16 + aggregate-error: 3.1.0 + ansi-escapes: 4.3.2 + boxen: 5.1.2 + chalk: 2.4.2 + chokidar: 3.6.0 + ci-info: 2.0.0 + debug: 4.3.4(supports-color@5.5.0) + enquirer: 2.4.1 + env-paths: 2.2.1 + ethereum-cryptography: 1.2.0 + ethereumjs-abi: 0.6.8 + find-up: 2.1.0 + fp-ts: 1.19.3 + fs-extra: 7.0.1 + glob: 7.2.0 + immutable: 4.3.5 + io-ts: 1.10.4 + keccak: 3.0.4 + lodash: 4.17.21 + mnemonist: 0.38.5 + mocha: 10.4.0 + p-map: 4.0.0 + raw-body: 2.5.2 + resolve: 1.17.0 + semver: 6.3.1 + solc: 0.7.3(debug@4.3.4) + source-map-support: 0.5.21 + stacktrace-parser: 0.1.10 + ts-node: 10.9.2(@types/node@20.12.5)(typescript@5.4.4) + tsort: 0.0.1 + typescript: 5.4.4 + undici: 5.28.4 + uuid: 8.3.2 + ws: 7.5.9 + transitivePeerDependencies: + - bufferutil + - c-kzg + - supports-color + - utf-8-validate + dev: true + /has-bigints@1.0.2: resolution: {integrity: sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==} dev: true + /has-flag@1.0.0: + resolution: {integrity: sha512-DyYHfIYwAJmjAjSSPKANxI8bFY9YtFrgkAfinBojQ8YJTOuOuav64tMUJv584SES4xl74PmuaevIyaLESHdTAA==} + engines: {node: '>=0.10.0'} + dev: true + /has-flag@3.0.0: resolution: {integrity: sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==} engines: {node: '>=4'} @@ -7512,25 +10327,14 @@ packages: resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} engines: {node: '>=8'} - /has-property-descriptors@1.0.1: - resolution: {integrity: sha512-VsX8eaIewvas0xnvinAe9bw4WfIeODpGYikiWYLH+dma0Jw6KHYqWiWfhQlgOVK8D6PvjubK5Uc4P0iIhIcNVg==} - dependencies: - get-intrinsic: 1.2.3 - /has-property-descriptors@1.0.2: resolution: {integrity: sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==} dependencies: es-define-property: 1.0.0 - dev: true - - /has-proto@1.0.1: - resolution: {integrity: sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==} - engines: {node: '>= 0.4'} /has-proto@1.0.3: resolution: {integrity: sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==} engines: {node: '>= 0.4'} - dev: true /has-symbols@1.0.3: resolution: {integrity: sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==} @@ -7542,18 +10346,26 @@ packages: dependencies: has-symbols: 1.0.3 - /hash.js@1.1.7: - resolution: {integrity: sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==} + /hash-base@3.1.0: + resolution: {integrity: sha512-1nmYp/rhMDiE7AYkDw+lLwlAzz0AntGIe51F3RfFfEqyQ3feY2eI/NcwC6umIQVOASPMsWJLJScWKSSvzL9IVA==} + engines: {node: '>=4'} + dependencies: + inherits: 2.0.4 + readable-stream: 3.6.2 + safe-buffer: 5.2.1 + dev: true + + /hash.js@1.1.3: + resolution: {integrity: sha512-/UETyP0W22QILqS+6HowevwhEFJ3MBJnwTf75Qob9Wz9t0DPuisL8kW8YZMK62dHAKE1c1p+gY1TtOLY+USEHA==} dependencies: inherits: 2.0.4 minimalistic-assert: 1.0.1 - dev: false - /hasown@2.0.0: - resolution: {integrity: sha512-vUptKVTpIJhcczKBbgnS+RtcuYMB8+oNzPK2/Hp3hanz8JmpATdmmgLgSaadVREkDm+e2giHwY3ZRkyjSIDDFA==} - engines: {node: '>= 0.4'} + /hash.js@1.1.7: + resolution: {integrity: sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==} dependencies: - function-bind: 1.1.2 + inherits: 2.0.4 + minimalistic-assert: 1.0.1 /hasown@2.0.2: resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==} @@ -7561,6 +10373,22 @@ packages: dependencies: function-bind: 1.1.2 + /he@1.2.0: + resolution: {integrity: sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==} + hasBin: true + dev: true + + /header-case@1.0.1: + resolution: {integrity: sha512-i0q9mkOeSuhXw6bGgiQCCBgY/jlZuV/7dZXyZ9c6LcBrqwvT8eT719E9uxE5LiZftdl+z81Ugbg/VvXV4OJOeQ==} + dependencies: + no-case: 2.3.2 + upper-case: 1.1.3 + dev: true + + /heap@0.2.7: + resolution: {integrity: sha512-2bsegYkkHO+h/9MGbn6KWcE45cHZgPANo5LXF7EvWdT0yT2EguSVO1nDgU5c8+ZOPwp2vMNa7YFsJhVcDR9Sdg==} + dev: true + /hermes-estree@0.15.0: resolution: {integrity: sha512-lLYvAd+6BnOqWdnNbP/Q8xfl8LOGw4wVjfrNd9Gt8eoFzhNBRVD95n4l2ksfMVOoxuVyegs85g83KS9QOsxbVQ==} dev: false @@ -7592,13 +10420,20 @@ packages: resolution: {integrity: sha512-COpmrF2NOg4TBWUJ5UVyaCU2A88wEMkUPK4hNqyCkqHbxT92BbvfjoSozkAIIm6XhicGlJHhFdullInrdhwU8Q==} dev: false + /highlight.js@10.7.3: + resolution: {integrity: sha512-tzcUFauisWKNHaRkN4Wjl/ZA07gENAjFl3J/c480dprkGTg5EQstgaNFqBfUqCq54kZRIEcreTsAgF/m2quD7A==} + dev: true + + /highlightjs-solidity@2.0.6: + resolution: {integrity: sha512-DySXWfQghjm2l6a/flF+cteroJqD4gI8GSdL4PtvxZSsAHie8m3yVe2JFoRg03ROKT6hp2Lc/BxXkqerNmtQYg==} + dev: true + /hmac-drbg@1.0.1: resolution: {integrity: sha512-Tti3gMqLdZfhOQY1Mzf/AanLiqh1WTiJgEj26ZuYQ9fbkLomzGchCws4FyrSd4VkpBfiNhaE1On+lOz894jvXg==} dependencies: - hash.js: 1.1.7 + hash.js: 1.1.3 minimalistic-assert: 1.0.1 minimalistic-crypto-utils: 1.0.1 - dev: false /hoist-non-react-statics@3.3.2: resolution: {integrity: sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==} @@ -7610,6 +10445,10 @@ packages: resolution: {integrity: sha512-Yc+BQe8SvoXH1643Qez1zqLRmbA5rCL+sSmk6TVos0LWVfNIB7PGncdlId77WzLGSIB5KaWgTaNTs2lNVEI6VQ==} dev: true + /hosted-git-info@2.8.9: + resolution: {integrity: sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==} + dev: true + /html-encoding-sniffer@4.0.0: resolution: {integrity: sha512-Y22oTqIU4uuPgEemfz7NDJz6OeKf12Lsu+QC+s3BVpda64lTiMYCyGwg5ki4vFxkMwQdeZDl2adZoqUgdFuTgQ==} engines: {node: '>=18'} @@ -7623,6 +10462,29 @@ packages: void-elements: 3.1.0 dev: false + /htmlparser2@8.0.2: + resolution: {integrity: sha512-GYdjWKDkbRLkZ5geuHs5NY1puJ+PXwP7+fHPRz06Eirsb9ugf6d8kkXav6ADhcODhFFPMIXyxkxSuMf3D6NCFA==} + dependencies: + domelementtype: 2.3.0 + domhandler: 5.0.3 + domutils: 3.1.0 + entities: 4.5.0 + dev: true + + /http-basic@8.1.3: + resolution: {integrity: sha512-/EcDMwJZh3mABI2NhGfHOGOeOZITqfkEO4p/xK+l3NpyncIHUQBoMvCSF/b5GqvKtySC2srL/GGG3+EtlqlmCw==} + engines: {node: '>=6.0.0'} + dependencies: + caseless: 0.12.0 + concat-stream: 1.6.2 + http-response-object: 3.0.2 + parse-cache-control: 1.0.1 + dev: true + + /http-cache-semantics@4.1.1: + resolution: {integrity: sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==} + dev: true + /http-errors@2.0.0: resolution: {integrity: sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==} engines: {node: '>= 0.8'} @@ -7632,28 +10494,72 @@ packages: setprototypeof: 1.2.0 statuses: 2.0.1 toidentifier: 1.0.1 - dev: false + + /http-https@1.0.0: + resolution: {integrity: sha512-o0PWwVCSp3O0wS6FvNr6xfBCHgt0m1tvPLFOCc2iFDKTRAXhB7m8klDf7ErowFH8POa6dVdGatKU5I1YYwzUyg==} + dev: true /http-proxy-agent@7.0.2: resolution: {integrity: sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==} engines: {node: '>= 14'} dependencies: - agent-base: 7.1.0 + agent-base: 7.1.1 debug: 4.3.4(supports-color@5.5.0) transitivePeerDependencies: - supports-color dev: true + /http-response-object@3.0.2: + resolution: {integrity: sha512-bqX0XTF6fnXSQcEJ2Iuyr75yVakyjIDCqroJQ/aHfSdlM743Cwqoi2nDYMzLGWUcuTWGWy8AAvOKXTfiv6q9RA==} + dependencies: + '@types/node': 10.17.60 + dev: true + /http-shutdown@1.2.2: resolution: {integrity: sha512-S9wWkJ/VSY9/k4qcjG318bqJNruzE4HySUhFYknwmu6LBP97KLLfwNf+n4V1BHurvFNkSKLFnK/RsuUnRTf9Vw==} engines: {iojs: '>= 1.0.0', node: '>= 0.12.0'} dev: false + /http-signature@1.2.0: + resolution: {integrity: sha512-CAbnr6Rz4CYQkLYUtSNXxQPUH2gK8f3iWexVlsnMeD+GjlsQ0Xsy1cOX+mN3dtxYomRy21CiOzU8Uhw6OwncEQ==} + engines: {node: '>=0.8', npm: '>=1.3.7'} + dependencies: + assert-plus: 1.0.0 + jsprim: 1.4.2 + sshpk: 1.18.0 + dev: true + + /http2-wrapper@1.0.3: + resolution: {integrity: sha512-V+23sDMr12Wnz7iTcDeJr3O6AIxlnvT/bmaAAAP/Xda35C90p9599p0F1eHR/N1KILWSoWVAiOMFjBBXaXSMxg==} + engines: {node: '>=10.19.0'} + dependencies: + quick-lru: 5.1.1 + resolve-alpn: 1.2.1 + dev: true + + /http2-wrapper@2.2.1: + resolution: {integrity: sha512-V5nVw1PAOgfI3Lmeaj2Exmeg7fenjhRUgz1lPSezy1CuhPYbgQtbQj4jZfEAEMlaL+vupsvhjqCyjzob0yxsmQ==} + engines: {node: '>=10.19.0'} + dependencies: + quick-lru: 5.1.1 + resolve-alpn: 1.2.1 + dev: true + + /https-proxy-agent@5.0.1: + resolution: {integrity: sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==} + engines: {node: '>= 6'} + dependencies: + agent-base: 6.0.2 + debug: 4.3.4(supports-color@5.5.0) + transitivePeerDependencies: + - supports-color + dev: true + /https-proxy-agent@7.0.4: resolution: {integrity: sha512-wlwpilI7YdjSkWaQ/7omYBMTliDcmCN8OLihO6I9B86g06lMyAoqgoDpV0XqoaPOKj+0DIdAvnsWfyAAhmimcg==} engines: {node: '>= 14'} dependencies: - agent-base: 7.1.0 + agent-base: 7.1.1 debug: 4.3.4(supports-color@5.5.0) transitivePeerDependencies: - supports-color @@ -7668,18 +10574,25 @@ packages: resolution: {integrity: sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ==} engines: {node: '>=16.17.0'} - /i18next-browser-languagedetector@7.2.0: - resolution: {integrity: sha512-U00DbDtFIYD3wkWsr2aVGfXGAj2TgnELzOX9qv8bT0aJtvPV9CRO77h+vgmHFBMe7LAxdwvT/7VkCWGya6L3tA==} + /i18next-browser-languagedetector@7.2.1: + resolution: {integrity: sha512-h/pM34bcH6tbz8WgGXcmWauNpQupCGr25XPp9cZwZInR9XHSjIFDYp1SIok7zSPsTOMxdvuLyu86V+g2Kycnfw==} dependencies: - '@babel/runtime': 7.24.1 + '@babel/runtime': 7.24.4 dev: false /i18next@22.5.1: resolution: {integrity: sha512-8TGPgM3pAD+VRsMtUMNknRz3kzqwp/gPALrWMsDnmC1mKqJwpWyooQRLMcbTwq8z8YwSmuj+ZYvc+xCuEpkssA==} dependencies: - '@babel/runtime': 7.24.1 + '@babel/runtime': 7.24.4 dev: false + /iconv-lite@0.4.24: + resolution: {integrity: sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==} + engines: {node: '>=0.10.0'} + dependencies: + safer-buffer: 2.1.2 + dev: true + /iconv-lite@0.6.3: resolution: {integrity: sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==} engines: {node: '>=0.10.0'} @@ -7691,9 +10604,15 @@ packages: resolution: {integrity: sha512-8Sb3veuYCyrZL+VBt9LJfZjLUPWVvqn8tG28VqYNFCo43KHcKuq+b4EiXGeuaLAQWL2YmyDgMp2aSpH9JHsEQg==} dev: false + /idna-uts46-hx@2.3.1: + resolution: {integrity: sha512-PWoF9Keq6laYdIRwwCdhTPl60xRqAloYNMQLiyUnG42VjT53oW07BXIRM+NK7eQjzXjAk2gUvX9caRxlnF9TAA==} + engines: {node: '>=4.0.0'} + dependencies: + punycode: 2.1.0 + dev: true + /ieee754@1.2.1: resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} - dev: false /ignore@5.3.1: resolution: {integrity: sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw==} @@ -7708,6 +10627,10 @@ packages: queue: 6.0.2 dev: false + /immutable@4.3.5: + resolution: {integrity: sha512-8eabxkth9gZatlwl5TBuJnCsoTADlL6ftEr7A4qgdaTsPyreilDSnUk57SO+jfKcNtxPa22U5KK6DSeAYhpBJw==} + dev: true + /import-fresh@2.0.0: resolution: {integrity: sha512-eZ5H8rcgYazHbKC3PG4ClHNykCSxtAhxSSEM+2mb+7evD2CKF5V7c0dNum7AdpDh0ZdICwZY9sRSn8f+KH96sg==} engines: {node: '>=4'} @@ -7741,6 +10664,10 @@ packages: /inherits@2.0.4: resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} + /ini@1.3.8: + resolution: {integrity: sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==} + dev: true + /internal-slot@1.0.7: resolution: {integrity: sha512-NGnrKwXzSms2qUUih/ILZ5JBqNTSa1+ZmP6flaIp6KmSElgE9qdndzS3cqjrDovwFdmwsGsLdeFgB6suw+1e9g==} engines: {node: '>= 0.4'} @@ -7750,12 +10677,33 @@ packages: side-channel: 1.0.6 dev: true + /interpret@1.4.0: + resolution: {integrity: sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==} + engines: {node: '>= 0.10'} + dev: true + /invariant@2.2.4: resolution: {integrity: sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==} dependencies: loose-envify: 1.4.0 dev: false + /invert-kv@1.0.0: + resolution: {integrity: sha512-xgs2NH9AE66ucSq4cNG1nhSFghr5l6tdL15Pk+jl46bmmBapgoaY/AacXyaDznAqmGL99TiLSQgO/XazFSKYeQ==} + engines: {node: '>=0.10.0'} + dev: true + + /io-ts@1.10.4: + resolution: {integrity: sha512-b23PteSnYXSONJ6JQXRAlvJhuw8KOtkqa87W4wDtvMrud/DTJd5X+NpOOI+O/zZwVq6v0VLAaJ+1EDViKEuN9g==} + dependencies: + fp-ts: 1.19.3 + dev: true + + /ipaddr.js@1.9.1: + resolution: {integrity: sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==} + engines: {node: '>= 0.10'} + dev: true + /iron-webcrypto@1.1.0: resolution: {integrity: sha512-5vgYsCakNlaQub1orZK5QmNYhwYtcllTkZBp5sfIaCqY93Cf6l+v2rtE+E4TMbcfjxDMCdrO8wmp7+ZvhDECLA==} dev: false @@ -7764,7 +10712,7 @@ packages: resolution: {integrity: sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==} engines: {node: '>= 0.4'} dependencies: - call-bind: 1.0.5 + call-bind: 1.0.7 has-tostringtag: 1.0.2 /is-array-buffer@3.0.4: @@ -7777,7 +10725,6 @@ packages: /is-arrayish@0.2.1: resolution: {integrity: sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==} - dev: false /is-async-function@2.0.0: resolution: {integrity: sha512-Y1JXKrfykRJGdlDwdKlLpLyMIiWqWvuSd17TvZk68PLAOGOoF4Xyav1z0Xhoi+gCYjZVeC5SI+hYFOfvXmGRCA==} @@ -7856,15 +10803,25 @@ packages: call-bind: 1.0.7 dev: true + /is-fullwidth-code-point@1.0.0: + resolution: {integrity: sha512-1pqUqRjkhPJ9miNq9SwMfdvi6lBJcd6eFxvfaivQhaH3SgisfiuudvFntdKOmxuee/77l+FPjKrQjWvmPjWrRw==} + engines: {node: '>=0.10.0'} + dependencies: + number-is-nan: 1.0.1 + dev: true + /is-fullwidth-code-point@2.0.0: resolution: {integrity: sha512-VHskAKYM8RfSFXwee5t5cbN5PZeq1Wrh6qd5bkyiXIf6UQcN6w/A0eXM9r6t8d+GYOh+o6ZhiEnb88LN/Y8m2w==} engines: {node: '>=4'} - dev: false /is-fullwidth-code-point@3.0.0: resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} engines: {node: '>=8'} + /is-function@1.0.2: + resolution: {integrity: sha512-lw7DUp0aWXYg+CBCN+JKkcE0Q2RayZnSvnZBlwgxHBQhqt5pZNVy4Ri7H9GmmXkdu7LUthszM+Tor1u/2iBcpQ==} + dev: true + /is-generator-function@1.0.10: resolution: {integrity: sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A==} engines: {node: '>= 0.4'} @@ -7877,6 +10834,11 @@ packages: dependencies: is-extglob: 2.1.1 + /is-hex-prefixed@1.0.0: + resolution: {integrity: sha512-WvtOiug1VFrE9v1Cydwm+FnXd3+w9GaeVUss5W4v/SLy3UW00vP+6iNF2SdnfiBoLy4bTqVdkftNGTUeOFVsbA==} + engines: {node: '>=6.5.0', npm: '>=3'} + dev: true + /is-inside-container@1.0.0: resolution: {integrity: sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA==} engines: {node: '>=14.16'} @@ -7890,6 +10852,12 @@ packages: engines: {node: '>=8'} dev: false + /is-lower-case@1.1.3: + resolution: {integrity: sha512-+5A1e/WJpLLXZEDlgz4G//WYSHyQBD32qa4Jd3Lw06qQlv3fJHnp3YIHjTQSGzHMgzmVKz2ZP3rBxTHkPw/lxA==} + dependencies: + lower-case: 1.1.4 + dev: true + /is-map@2.0.3: resolution: {integrity: sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==} engines: {node: '>= 0.4'} @@ -7919,7 +10887,6 @@ packages: /is-plain-obj@2.1.0: resolution: {integrity: sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==} engines: {node: '>=8'} - dev: false /is-plain-object@2.0.4: resolution: {integrity: sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==} @@ -7981,10 +10948,23 @@ packages: dependencies: which-typed-array: 1.1.15 + /is-typedarray@1.0.0: + resolution: {integrity: sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==} + dev: true + /is-unicode-supported@0.1.0: resolution: {integrity: sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==} engines: {node: '>=10'} - dev: false + + /is-upper-case@1.1.2: + resolution: {integrity: sha512-GQYSJMgfeAmVwh9ixyk888l7OIhNAGKtY6QA+IrWlu9MDTCaXmeozOZ2S9Knj7bQwBO/H6J2kb+pbyTUiMNbsw==} + dependencies: + upper-case: 1.1.3 + dev: true + + /is-utf8@0.2.1: + resolution: {integrity: sha512-rMYPYvCzsXywIsldgLaSoPlw5PfoB/ssr7hY4pLfcodrA5M/eArza1a9VmTiNIBNMjOGr1Ow9mTyU2o69U6U9Q==} + dev: true /is-weakmap@2.0.2: resolution: {integrity: sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==} @@ -8038,7 +11018,6 @@ packages: /isarray@1.0.0: resolution: {integrity: sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==} - dev: false /isarray@2.0.5: resolution: {integrity: sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==} @@ -8074,6 +11053,10 @@ packages: ws: 8.13.0 dev: false + /isstream@0.1.2: + resolution: {integrity: sha512-Yljz7ffyPbrLpLngrMtZ7NduUgVvi6wG9RJ9IUcyCd59YQ911PBJphODUcbOVbqYfxe1wuYf/LJ8PauMRwsM/g==} + dev: true + /iterator.prototype@1.1.2: resolution: {integrity: sha512-DR33HMMr8EzwuRL8Y9D3u2BMj8+RqSE850jfGu59kS7tbmPLzGkZmVSfyCFSDxuZiEY6Rzt3T2NA/qU+NwVj1w==} dependencies: @@ -8104,7 +11087,7 @@ packages: '@jest/environment': 29.7.0 '@jest/fake-timers': 29.7.0 '@jest/types': 29.6.3 - '@types/node': 20.11.30 + '@types/node': 20.12.5 jest-mock: 29.7.0 jest-util: 29.7.0 dev: false @@ -8134,7 +11117,7 @@ packages: engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: '@jest/types': 29.6.3 - '@types/node': 20.11.30 + '@types/node': 20.12.5 jest-util: 29.7.0 dev: false @@ -8143,7 +11126,7 @@ packages: engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: '@jest/types': 29.6.3 - '@types/node': 20.11.30 + '@types/node': 20.12.5 chalk: 4.1.2 ci-info: 3.9.0 graceful-fs: 4.2.11 @@ -8166,7 +11149,7 @@ packages: resolution: {integrity: sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: - '@types/node': 20.11.30 + '@types/node': 20.12.5 jest-util: 29.7.0 merge-stream: 2.0.0 supports-color: 8.1.1 @@ -8177,8 +11160,8 @@ packages: hasBin: true dev: false - /joi@17.12.2: - resolution: {integrity: sha512-RonXAIzCiHLc8ss3Ibuz45u28GOsWE1UpfDXLbN/9NKbL4tCJf8TWYVKsoYuuh+sAUt7fsSNpA+r2+TBA6Wjmw==} + /joi@17.12.3: + resolution: {integrity: sha512-2RRziagf555owrm9IRVtdKynOBeITiDpuZqIpgwqXShPncPKNiRQoiGsl/T8SQdq+8ugRzH2LqY67irr2y/d+g==} dependencies: '@hapi/hoek': 9.3.0 '@hapi/topo': 5.1.0 @@ -8187,14 +11170,26 @@ packages: '@sideway/pinpoint': 2.0.0 dev: false - /js-tokens@4.0.0: - resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} + /js-sha3@0.5.5: + resolution: {integrity: sha512-yLLwn44IVeunwjpDVTDZmQeVbB0h+dZpY2eO68B/Zik8hu6dH+rKeLxwua79GGIvW6xr8NBAcrtiUbYrTjEFTA==} + dev: true - /js-tokens@8.0.3: - resolution: {integrity: sha512-UfJMcSJc+SEXEl9lH/VLHSZbThQyLpw1vLO1Lb+j4RWDvG3N2f7yj3PVQA3cmkTBNldJ9eFnM+xEXxHIXrYiJw==} + /js-sha3@0.5.7: + resolution: {integrity: sha512-GII20kjaPX0zJ8wzkTbNDYMY7msuZcTWk8S5UOh6806Jq/wz1J8/bnr8uGU0DAUmYDjj2Mr4X1cW8v/GLYnR+g==} dev: true - /js-yaml@3.14.1: + /js-sha3@0.8.0: + resolution: {integrity: sha512-gF1cRrHhIzNfToc802P800N8PpXS+evLLXfsVpowqmAFR9uwbi89WvXg2QspOmXL8QL86J4T1EpFu+yUkwJY3Q==} + dev: true + + /js-tokens@4.0.0: + resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} + + /js-tokens@9.0.0: + resolution: {integrity: sha512-WriZw1luRMlmV3LGJaR6QOJjWwgLUTf89OwT2lUOyjX2dJGBwgmIkbcz+7WFZjrZM635JOIR517++e/67CP9dQ==} + dev: true + + /js-yaml@3.14.1: resolution: {integrity: sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==} hasBin: true dependencies: @@ -8208,6 +11203,10 @@ packages: argparse: 2.0.1 dev: true + /jsbn@0.1.1: + resolution: {integrity: sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg==} + dev: true + /jsc-android@250231.0.0: resolution: {integrity: sha512-rS46PvsjYmdmuz1OAWXY/1kCYG7pnf1TBqeTiOJr1iDz7s5DLxxC9n/ZMknLDxzYzNVfI7R95MH10emSSG1Wuw==} dev: false @@ -8216,23 +11215,23 @@ packages: resolution: {integrity: sha512-0wM3YBWtYePOjfyXQH5MWQ8H7sdk5EXSwZvmSLKk2RboVQ2Bu239jycHDz5J/8Blf3K0Qnoy2b6xD+z10MFB+Q==} dev: false - /jscodeshift@0.14.0(@babel/preset-env@7.24.3): + /jscodeshift@0.14.0(@babel/preset-env@7.24.4): resolution: {integrity: sha512-7eCC1knD7bLUPuSCwXsMZUH51O8jIcoVyKtI6P0XM0IVzlGjckPy3FIwQlorzbN0Sg79oK+RlohN32Mqf/lrYA==} hasBin: true peerDependencies: '@babel/preset-env': ^7.1.6 dependencies: - '@babel/core': 7.24.3 - '@babel/parser': 7.24.1 - '@babel/plugin-proposal-class-properties': 7.18.6(@babel/core@7.24.3) - '@babel/plugin-proposal-nullish-coalescing-operator': 7.18.6(@babel/core@7.24.3) - '@babel/plugin-proposal-optional-chaining': 7.21.0(@babel/core@7.24.3) - '@babel/plugin-transform-modules-commonjs': 7.24.1(@babel/core@7.24.3) - '@babel/preset-env': 7.24.3(@babel/core@7.24.3) - '@babel/preset-flow': 7.24.1(@babel/core@7.24.3) - '@babel/preset-typescript': 7.24.1(@babel/core@7.24.3) - '@babel/register': 7.23.7(@babel/core@7.24.3) - babel-core: 7.0.0-bridge.0(@babel/core@7.24.3) + '@babel/core': 7.24.4 + '@babel/parser': 7.24.4 + '@babel/plugin-proposal-class-properties': 7.18.6(@babel/core@7.24.4) + '@babel/plugin-proposal-nullish-coalescing-operator': 7.18.6(@babel/core@7.24.4) + '@babel/plugin-proposal-optional-chaining': 7.21.0(@babel/core@7.24.4) + '@babel/plugin-transform-modules-commonjs': 7.24.1(@babel/core@7.24.4) + '@babel/preset-env': 7.24.4(@babel/core@7.24.4) + '@babel/preset-flow': 7.24.1(@babel/core@7.24.4) + '@babel/preset-typescript': 7.24.1(@babel/core@7.24.4) + '@babel/register': 7.23.7(@babel/core@7.24.4) + babel-core: 7.0.0-bridge.0(@babel/core@7.24.4) chalk: 4.1.2 flow-parser: 0.206.0 graceful-fs: 4.2.11 @@ -8329,10 +11328,22 @@ packages: resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} dev: true + /json-schema-traverse@1.0.0: + resolution: {integrity: sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==} + dev: true + + /json-schema@0.4.0: + resolution: {integrity: sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==} + dev: true + /json-stable-stringify-without-jsonify@1.0.1: resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} dev: true + /json-stringify-safe@5.0.1: + resolution: {integrity: sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==} + dev: true + /json5@1.0.2: resolution: {integrity: sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==} hasBin: true @@ -8348,11 +11359,16 @@ packages: /jsonc-parser@3.2.1: resolution: {integrity: sha512-AilxAyFOAcK5wA1+LeaySVBrHsGQvUFCDWXKpZjzaL0PqW+xfBOttn8GNtWKFWqneyMZj41MWF9Kl6iPWLwgOA==} + /jsonfile@2.4.0: + resolution: {integrity: sha512-PKllAqbgLgxHaj8TElYymKCAgrASebJrWpTnEkOaTowt23VKXXN0sUeriJ+eh7y6ufb/CC5ap11pz71/cM0hUw==} + optionalDependencies: + graceful-fs: 4.2.11 + dev: true + /jsonfile@4.0.0: resolution: {integrity: sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==} optionalDependencies: graceful-fs: 4.2.11 - dev: false /jsonfile@6.1.0: resolution: {integrity: sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==} @@ -8362,6 +11378,20 @@ packages: graceful-fs: 4.2.11 dev: true + /jsonschema@1.4.1: + resolution: {integrity: sha512-S6cATIPVv1z0IlxdN+zUk5EPjkGCdnhN4wVSBlvoUO1tOLJootbo9CquNJmbIh4yikWHiUedhRYrNPn1arpEmQ==} + dev: true + + /jsprim@1.4.2: + resolution: {integrity: sha512-P2bSOMAc/ciLz6DzgjVlGJP9+BrJWu5UDGK70C2iweC5QBIeFf0ZXRvGjEj2uYgrY2MkAAhsSWHDWlFtEroZWw==} + engines: {node: '>=0.6.0'} + dependencies: + assert-plus: 1.0.0 + extsprintf: 1.3.0 + json-schema: 0.4.0 + verror: 1.10.0 + dev: true + /jsx-ast-utils@3.3.5: resolution: {integrity: sha512-ZZow9HBI5O6EPgSJLUb8n2NKgmVWTwCvHGwFuJlMjvLFqlGG6pjirPhtdsseaLZjSibD8eegzmYpUZwoIlj2cQ==} engines: {node: '>=4.0'} @@ -8380,7 +11410,6 @@ packages: node-addon-api: 2.0.2 node-gyp-build: 4.8.0 readable-stream: 3.6.2 - dev: false /keyv@4.5.4: resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==} @@ -8395,7 +11424,12 @@ packages: /kind-of@6.0.3: resolution: {integrity: sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==} engines: {node: '>=0.10.0'} - dev: false + + /klaw@1.3.1: + resolution: {integrity: sha512-TED5xi9gGQjGpNnvRWknrwAB1eL5GciPfVFOt3Vk1OJCVDQbzuSfrF3hkUQKlsgKrG1F+0t5W0m+Fje1jIt8rw==} + optionalDependencies: + graceful-fs: 4.2.11 + dev: true /kleur@3.0.3: resolution: {integrity: sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==} @@ -8418,11 +11452,26 @@ packages: language-subtag-registry: 0.3.22 dev: true + /lcid@1.0.0: + resolution: {integrity: sha512-YiGkH6EnGrDGqLMITnGjXtGmNtjoXw9SVUzcaos8RBi7Ps0VBylkq+vOcY9QE5poLasPCR849ucFUkl0UzUyOw==} + engines: {node: '>=0.10.0'} + dependencies: + invert-kv: 1.0.0 + dev: true + /leven@3.1.0: resolution: {integrity: sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==} engines: {node: '>=6'} dev: false + /levn@0.3.0: + resolution: {integrity: sha512-0OO4y2iOHix2W6ujICbKIaEQXvFQHue65vUG3pb5EUomzPI90z9hsA1VsO/dbIIpC53J8gxM9Q4Oho0jrCM/yA==} + engines: {node: '>= 0.8.0'} + dependencies: + prelude-ls: 1.1.2 + type-check: 0.3.2 + dev: true + /levn@0.4.1: resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} engines: {node: '>= 0.8.0'} @@ -8590,6 +11639,17 @@ packages: lit-html: 2.8.0 dev: false + /load-json-file@1.1.0: + resolution: {integrity: sha512-cy7ZdNRXdablkXYNI049pthVeXFurRyb9+hA/dZzerZ0pGTx42z+y+ssxBaVV2l70t1muq5IdKhn4UtcoGUY9A==} + engines: {node: '>=0.10.0'} + dependencies: + graceful-fs: 4.2.11 + parse-json: 2.2.0 + pify: 2.3.0 + pinkie-promise: 2.0.1 + strip-bom: 2.0.0 + dev: true + /load-yaml-file@0.2.0: resolution: {integrity: sha512-OfCBkGEw4nN6JLtgRidPX6QxjBQGQf72q3si2uvqyFEMbycSFFHwAZeXx6cJgFM9wmLrf9zBwCP3Ivqa+LLZPw==} engines: {node: '>=6'} @@ -8608,6 +11668,14 @@ packages: pkg-types: 1.0.3 dev: true + /locate-path@2.0.0: + resolution: {integrity: sha512-NCI2kiDkyR7VeEKm27Kda/iQHyKJe1Bu0FlTbYp3CqJu+9IFe9bLyAjMxf5ZDDbEg+iMPzB5zYyUTSm8wVTKmA==} + engines: {node: '>=4'} + dependencies: + p-locate: 2.0.0 + path-exists: 3.0.0 + dev: true + /locate-path@3.0.0: resolution: {integrity: sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==} engines: {node: '>=6'} @@ -8628,10 +11696,22 @@ packages: dependencies: p-locate: 5.0.0 + /lodash.assign@4.2.0: + resolution: {integrity: sha512-hFuH8TY+Yji7Eja3mGiuAxBqLagejScbG8GbG0j6o9vzn0YL14My+ktnqtZgFTosKymC9/44wP6s7xyuLfnClw==} + dev: true + + /lodash.camelcase@4.3.0: + resolution: {integrity: sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==} + dev: true + /lodash.debounce@4.0.8: resolution: {integrity: sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==} dev: false + /lodash.flatten@4.4.0: + resolution: {integrity: sha512-C5N2Z3DgnnKr0LOpv/hKCgKdb7ZZwafIrsesve6lmzvZIRZRGaZ/l6Q8+2W7NaT+ZwO3fFlSCzCzrDCFdJfZ4g==} + dev: true + /lodash.isequal@4.5.0: resolution: {integrity: sha512-pDo3lu8Jhfjqls6GkMgpahsF9kCyayhgykjyLMNFTKWrpVdAQtYyB4muAMWozBB4ig/dtWAmsMxLEI8wuz+DYQ==} dev: false @@ -8648,6 +11728,10 @@ packages: resolution: {integrity: sha512-wIkUCfVKpVsWo3JSZlc+8MB5it+2AN5W8J7YVMST30UrvcQNZ1Okbj+rbVniijTWE6FGYy4XJq/rHkas8qJMLQ==} dev: false + /lodash.truncate@4.4.2: + resolution: {integrity: sha512-jttmRe7bRse52OsWIMDLaXxWqRAmtIUccAQ3garviCqJjafXOfNMO0yMfNpdD6zbGaTU0P5Nz7e7gAT6cKmJRw==} + dev: true + /lodash.uniq@4.5.0: resolution: {integrity: sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ==} dev: true @@ -8661,7 +11745,6 @@ packages: dependencies: chalk: 4.1.2 is-unicode-supported: 0.1.0 - dev: false /logkitty@0.7.1: resolution: {integrity: sha512-/3ER20CTTbahrCrpYfPn7Xavv9diBROZpoXGVZDWMw4b/X4uuUwAC0ki85tgsdMRONURyIJbcOvS94QsUBYPbQ==} @@ -8688,6 +11771,26 @@ packages: get-func-name: 2.0.2 dev: true + /lower-case-first@1.0.2: + resolution: {integrity: sha512-UuxaYakO7XeONbKrZf5FEgkantPf5DUqDayzP5VXZrtRPdH86s4kN47I8B3TW10S4QKiE3ziHNf3kRN//okHjA==} + dependencies: + lower-case: 1.1.4 + dev: true + + /lower-case@1.1.4: + resolution: {integrity: sha512-2Fgx1Ycm599x+WGpIYwJOvsjmXFzTSc34IwDWALRA/8AopUKAVPwfJ+h5+f85BCp0PWmmJcWzEpxOpoXycMpdA==} + dev: true + + /lowercase-keys@2.0.0: + resolution: {integrity: sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==} + engines: {node: '>=8'} + dev: true + + /lowercase-keys@3.0.0: + resolution: {integrity: sha512-ozCC6gdQ+glXOQsveKD0YsDy8DSQFjDTz4zyzEHNV5+JP5D62LmfDZ6o1cycFx9ouG940M5dE8C8CTewdj2YWQ==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + dev: true + /lru-cache@10.2.0: resolution: {integrity: sha512-2bIM8x+VAf6JT4bKAljS1qUWgMsqZRPGJS6FSahIMPVvctcNhyVp7AJu7quxOW9jwkryBReKZY5tY5JYv2n/7Q==} engines: {node: 14 || >=16.14} @@ -8703,6 +11806,10 @@ packages: dependencies: yallist: 4.0.0 + /lru_map@0.3.3: + resolution: {integrity: sha512-Pn9cox5CsMYngeDbmChANltQl+5pi6XmTrraMSzhPmMBbmgcxmqWry0U3PGapCU1yB4/LqCcom7qhHZiF/jGfQ==} + dev: true + /lz-string@1.5.0: resolution: {integrity: sha512-h5bgJWpxJNswbU7qCrV0tIKQCaS3blPDrqKWx+QxzuzL1zGUzij9XCWLrSLsJPu5t+eWA/ycetzYAO5IOMcWAQ==} hasBin: true @@ -8715,6 +11822,13 @@ packages: '@jridgewell/sourcemap-codec': 1.4.15 dev: true + /magic-string@0.30.9: + resolution: {integrity: sha512-S1+hd+dIrC8EZqKyT9DstTH/0Z+f76kmmvZnkfQVmOpDEF9iVgdYif3Q/pIWHmCoo59bQVGW0kVL3e2nl+9+Sw==} + engines: {node: '>=12'} + dependencies: + '@jridgewell/sourcemap-codec': 1.4.15 + dev: true + /make-dir@2.1.0: resolution: {integrity: sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==} engines: {node: '>=6'} @@ -8733,14 +11847,40 @@ packages: tmpl: 1.0.5 dev: false + /map-stream@0.1.0: + resolution: {integrity: sha512-CkYQrPYZfWnu/DAmVCpTSX/xHpKZ80eKh2lAkyA6AJTef6bW+6JpbQZN5rofum7da+SyN1bi5ctTm+lTfcCW3g==} + dev: true + + /markdown-table@1.1.3: + resolution: {integrity: sha512-1RUZVgQlpJSPWYbFSpmudq5nHY1doEIv89gBtF0s4gW1GF2XorxcA/70M5vq7rLv0a6mhOUccRsqkwhwLCIQ2Q==} + dev: true + /marky@1.2.5: resolution: {integrity: sha512-q9JtQJKjpsVxCRVgQ+WapguSbKC3SQ5HEzFGPAJMStgh3QjCawp00UKv3MTTAArTmGmmPUvllHZoNbZ3gs0I+Q==} dev: false + /md5.js@1.3.5: + resolution: {integrity: sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==} + dependencies: + hash-base: 3.1.0 + inherits: 2.0.4 + safe-buffer: 5.2.1 + dev: true + + /media-typer@0.3.0: + resolution: {integrity: sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==} + engines: {node: '>= 0.6'} + dev: true + /memoize-one@5.2.1: resolution: {integrity: sha512-zYiwtZUcYyXKo/np96AGZAckk+FWWsUdJ3cHGGmld7+AhvcWmQyGCYUh1hc4Q/pkOhb65dQR/pqCyK0cOaHz4Q==} dev: false + /memorystream@0.3.1: + resolution: {integrity: sha512-S3UwM3yj5mtUSEfP41UZmt/0SCoVYUcU1rkXv+BQ5Ig8ndL4sPoJNBUJERafdPb5jjHJGuMgytgKvKIf58XNBw==} + engines: {node: '>= 0.10.0'} + dev: true + /merge-anything@5.1.7: resolution: {integrity: sha512-eRtbOb1N5iyH0tkQDAoQ4Ipsp/5qSR79Dzrz8hEPxRX10RWWR/iQXdoKmBSRCThY1Fh5EhISDtpSc93fpxUniQ==} engines: {node: '>=12.13'} @@ -8748,6 +11888,10 @@ packages: is-what: 4.1.16 dev: true + /merge-descriptors@1.0.1: + resolution: {integrity: sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==} + dev: true + /merge-options@3.0.4: resolution: {integrity: sha512-2Sug1+knBjkaMsMgf1ctR1Ujx+Ayku4EdJN4Z+C2+JzoeF7A3OZ9KM2GY0CpQS51NR61LTurMJrRKPhSs3ZRTQ==} engines: {node: '>=10'} @@ -8763,41 +11907,46 @@ packages: engines: {node: '>= 8'} dev: true - /metro-babel-transformer@0.80.7: - resolution: {integrity: sha512-b773yA16DsDQiM4OOzCsr1gwEd+iio9au98o3bj7F/bxVyoz1LuYox06BIdsiLL1o4kV5VtzTu3UXSJ2X0ZGXg==} + /methods@1.1.2: + resolution: {integrity: sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==} + engines: {node: '>= 0.6'} + dev: true + + /metro-babel-transformer@0.80.8: + resolution: {integrity: sha512-TTzNwRZb2xxyv4J/+yqgtDAP2qVqH3sahsnFu6Xv4SkLqzrivtlnyUbaeTdJ9JjtADJUEjCbgbFgUVafrXdR9Q==} engines: {node: '>=18'} dependencies: - '@babel/core': 7.24.3 + '@babel/core': 7.24.4 hermes-parser: 0.20.1 nullthrows: 1.1.1 transitivePeerDependencies: - supports-color dev: false - /metro-cache-key@0.80.7: - resolution: {integrity: sha512-sfCOtooMqmmm2v0a4EsYr5knYJGIArZJ5Y7MAcmsVU2pcqg+JQyPhYr/zqSkXBBipRxXr7aNXul9StKzKjsnbw==} + /metro-cache-key@0.80.8: + resolution: {integrity: sha512-qWKzxrLsRQK5m3oH8ePecqCc+7PEhR03cJE6Z6AxAj0idi99dHOSitTmY0dclXVB9vP2tQIAE8uTd8xkYGk8fA==} engines: {node: '>=18'} dev: false - /metro-cache@0.80.7: - resolution: {integrity: sha512-N6HyLjwDKusqJDaVyP57SVZKP51m1FFVcbIWQXu938W30nCXQEuWOx4e6adKgfEOZpscisWojfrCFN42/A8uug==} + /metro-cache@0.80.8: + resolution: {integrity: sha512-5svz+89wSyLo7BxdiPDlwDTgcB9kwhNMfNhiBZPNQQs1vLFXxOkILwQiV5F2EwYT9DEr6OPZ0hnJkZfRQ8lDYQ==} engines: {node: '>=18'} dependencies: - metro-core: 0.80.7 + metro-core: 0.80.8 rimraf: 3.0.2 dev: false - /metro-config@0.80.7: - resolution: {integrity: sha512-kpXCidthS/kFlEoXjWQp+IyCU5ICCOESVgwXEzViSDOv5bPJz2ytIr2lF623e50QzyrpFBSnOPjnyd1JbsVPvQ==} + /metro-config@0.80.8: + resolution: {integrity: sha512-VGQJpfJawtwRzGzGXVUoohpIkB0iPom4DmSbAppKfumdhtLA8uVeEPp2GM61kL9hRvdbMhdWA7T+hZFDlo4mJA==} engines: {node: '>=18'} dependencies: connect: 3.7.0 cosmiconfig: 5.2.1 jest-validate: 29.7.0 - metro: 0.80.7 - metro-cache: 0.80.7 - metro-core: 0.80.7 - metro-runtime: 0.80.7 + metro: 0.80.8 + metro-cache: 0.80.8 + metro-core: 0.80.8 + metro-runtime: 0.80.8 transitivePeerDependencies: - bufferutil - encoding @@ -8805,16 +11954,16 @@ packages: - utf-8-validate dev: false - /metro-core@0.80.7: - resolution: {integrity: sha512-bl3D6TtIa2mSdVTbkskMPcJSdoivO0F06u8ip/oS/T6RsbjkMTN3OZBjJXclY9I0FcN14q8I5YQt1oriySY/2Q==} + /metro-core@0.80.8: + resolution: {integrity: sha512-g6lud55TXeISRTleW6SHuPFZHtYrpwNqbyFIVd9j9Ofrb5IReiHp9Zl8xkAfZQp8v6ZVgyXD7c130QTsCz+vBw==} engines: {node: '>=18'} dependencies: lodash.throttle: 4.1.1 - metro-resolver: 0.80.7 + metro-resolver: 0.80.8 dev: false - /metro-file-map@0.80.7: - resolution: {integrity: sha512-A9IAmFZu/Ch7zJ4LzJChsvhedNOipuIXaOz6N8J44rqVZHI0uIqDKVGCne7lzc97djF1Ti4tH9nP64u4IdhpSg==} + /metro-file-map@0.80.8: + resolution: {integrity: sha512-eQXMFM9ogTfDs2POq7DT2dnG7rayZcoEgRbHPXvhUWkVwiKkro2ngcBE++ck/7A36Cj5Ljo79SOkYwHaWUDYDw==} engines: {node: '>=18'} dependencies: anymatch: 3.1.3 @@ -8833,48 +11982,48 @@ packages: - supports-color dev: false - /metro-minify-terser@0.80.7: - resolution: {integrity: sha512-9/mYV1tMGeoFSTMFr94oigJM2qMXJO3hvlibkaQ21HZjVyrfb54bSYyfIIRvAsjY2RCBRg9r2OrT+YbxnMypig==} + /metro-minify-terser@0.80.8: + resolution: {integrity: sha512-y8sUFjVvdeUIINDuW1sejnIjkZfEF+7SmQo0EIpYbWmwh+kq/WMj74yVaBWuqNjirmUp1YNfi3alT67wlbBWBQ==} engines: {node: '>=18'} dependencies: - terser: 5.29.2 + terser: 5.30.3 dev: false - /metro-resolver@0.80.7: - resolution: {integrity: sha512-xW7M0TITuKs2rYQqbIQn297+MVWfDuGptPnfZ+RBG9afdN//Zpmg14KFMIYU4r5AH2WS+nxwL57DbZft1MyoHg==} + /metro-resolver@0.80.8: + resolution: {integrity: sha512-JdtoJkP27GGoZ2HJlEsxs+zO7jnDUCRrmwXJozTlIuzLHMRrxgIRRby9fTCbMhaxq+iA9c+wzm3iFb4NhPmLbQ==} engines: {node: '>=18'} dev: false - /metro-runtime@0.80.7: - resolution: {integrity: sha512-gWqzfm9YQw9I08L23hcLmY7XNx48W0c0vLEkVEF5P7ZNIOSfX9CkEv0JvTTJWshRYkbgIqsdtpMAHq13LJJ6iA==} + /metro-runtime@0.80.8: + resolution: {integrity: sha512-2oScjfv6Yb79PelU1+p8SVrCMW9ZjgEiipxq7jMRn8mbbtWzyv3g8Mkwr+KwOoDFI/61hYPUbY8cUnu278+x1g==} engines: {node: '>=18'} dependencies: - '@babel/runtime': 7.24.1 + '@babel/runtime': 7.24.4 dev: false - /metro-source-map@0.80.7: - resolution: {integrity: sha512-6a1m/51ekkAl+ISNBcKQUXTU+AldbbPUHDE3DDDU17Y0HNoovkQR23DB/uH/SzUHQszYxK1fnwUTSxpzOjx+pw==} + /metro-source-map@0.80.8: + resolution: {integrity: sha512-+OVISBkPNxjD4eEKhblRpBf463nTMk3KMEeYS8Z4xM/z3qujGJGSsWUGRtH27+c6zElaSGtZFiDMshEb8mMKQg==} engines: {node: '>=18'} dependencies: - '@babel/traverse': 7.24.1 + '@babel/traverse': 7.24.1(supports-color@5.5.0) '@babel/types': 7.24.0 invariant: 2.2.4 - metro-symbolicate: 0.80.7 + metro-symbolicate: 0.80.8 nullthrows: 1.1.1 - ob1: 0.80.7 + ob1: 0.80.8 source-map: 0.5.7 vlq: 1.0.1 transitivePeerDependencies: - supports-color dev: false - /metro-symbolicate@0.80.7: - resolution: {integrity: sha512-WrBR5FQhVf/Y2N3zBS5TvNdwYzcQTLdJj9kcn0MIt+DpdgfLuUDjHXYaq4G9fZubofInx2dUcqr4WCn6fkIxuA==} + /metro-symbolicate@0.80.8: + resolution: {integrity: sha512-nwhYySk79jQhwjL9QmOUo4wS+/0Au9joEryDWw7uj4kz2yvw1uBjwmlql3BprQCBzRdB3fcqOP8kO8Es+vE31g==} engines: {node: '>=18'} hasBin: true dependencies: invariant: 2.2.4 - metro-source-map: 0.80.7 + metro-source-map: 0.80.8 nullthrows: 1.1.1 source-map: 0.5.7 through2: 2.0.5 @@ -8883,34 +12032,34 @@ packages: - supports-color dev: false - /metro-transform-plugins@0.80.7: - resolution: {integrity: sha512-ENGvQF7wZCtn2rO6jwsYy3XRSPrlm0G/1TgDC8AXdvz0yjfAe1ODSCYWxP8S3JXfjKL5m3b6j9RsV8sQIxsUjQ==} + /metro-transform-plugins@0.80.8: + resolution: {integrity: sha512-sSu8VPL9Od7w98MftCOkQ1UDeySWbsIAS5I54rW22BVpPnI3fQ42srvqMLaJUQPjLehUanq8St6OMBCBgH/UWw==} engines: {node: '>=18'} dependencies: - '@babel/core': 7.24.3 - '@babel/generator': 7.24.1 + '@babel/core': 7.24.4 + '@babel/generator': 7.24.4 '@babel/template': 7.24.0 - '@babel/traverse': 7.24.1 + '@babel/traverse': 7.24.1(supports-color@5.5.0) nullthrows: 1.1.1 transitivePeerDependencies: - supports-color dev: false - /metro-transform-worker@0.80.7: - resolution: {integrity: sha512-QcgKpx3WZo71jTtXMEeeFuGpA+nG8YuWjxPTIsIYTjgDxcArS8zDDRzS18mmYkP65yyzH4dT94B1FJH9+flRag==} + /metro-transform-worker@0.80.8: + resolution: {integrity: sha512-+4FG3TQk3BTbNqGkFb2uCaxYTfsbuFOCKMMURbwu0ehCP8ZJuTUramkaNZoATS49NSAkRgUltgmBa4YaKZ5mqw==} engines: {node: '>=18'} dependencies: - '@babel/core': 7.24.3 - '@babel/generator': 7.24.1 - '@babel/parser': 7.24.1 + '@babel/core': 7.24.4 + '@babel/generator': 7.24.4 + '@babel/parser': 7.24.4 '@babel/types': 7.24.0 - metro: 0.80.7 - metro-babel-transformer: 0.80.7 - metro-cache: 0.80.7 - metro-cache-key: 0.80.7 - metro-minify-terser: 0.80.7 - metro-source-map: 0.80.7 - metro-transform-plugins: 0.80.7 + metro: 0.80.8 + metro-babel-transformer: 0.80.8 + metro-cache: 0.80.8 + metro-cache-key: 0.80.8 + metro-minify-terser: 0.80.8 + metro-source-map: 0.80.8 + metro-transform-plugins: 0.80.8 nullthrows: 1.1.1 transitivePeerDependencies: - bufferutil @@ -8919,17 +12068,17 @@ packages: - utf-8-validate dev: false - /metro@0.80.7: - resolution: {integrity: sha512-con7RTEulmefHplqusjpoGD+r4CBuDLaeI261hFcSuTv6+Arm5FgSYmUcBa3MeqJbC/U8v0uT6MbdkEFCEl1xg==} + /metro@0.80.8: + resolution: {integrity: sha512-in7S0W11mg+RNmcXw+2d9S3zBGmCARDxIwoXJAmLUQOQoYsRP3cpGzyJtc7WOw8+FXfpgXvceD0u+PZIHXEL7g==} engines: {node: '>=18'} hasBin: true dependencies: '@babel/code-frame': 7.24.2 - '@babel/core': 7.24.3 - '@babel/generator': 7.24.1 - '@babel/parser': 7.24.1 + '@babel/core': 7.24.4 + '@babel/generator': 7.24.4 + '@babel/parser': 7.24.4 '@babel/template': 7.24.0 - '@babel/traverse': 7.24.1 + '@babel/traverse': 7.24.1(supports-color@5.5.0) '@babel/types': 7.24.0 accepts: 1.3.8 chalk: 4.1.2 @@ -8945,18 +12094,18 @@ packages: jest-worker: 29.7.0 jsc-safe-url: 0.2.4 lodash.throttle: 4.1.1 - metro-babel-transformer: 0.80.7 - metro-cache: 0.80.7 - metro-cache-key: 0.80.7 - metro-config: 0.80.7 - metro-core: 0.80.7 - metro-file-map: 0.80.7 - metro-resolver: 0.80.7 - metro-runtime: 0.80.7 - metro-source-map: 0.80.7 - metro-symbolicate: 0.80.7 - metro-transform-plugins: 0.80.7 - metro-transform-worker: 0.80.7 + metro-babel-transformer: 0.80.8 + metro-cache: 0.80.8 + metro-cache-key: 0.80.8 + metro-config: 0.80.8 + metro-core: 0.80.8 + metro-file-map: 0.80.8 + metro-resolver: 0.80.8 + metro-runtime: 0.80.8 + metro-source-map: 0.80.8 + metro-symbolicate: 0.80.8 + metro-transform-plugins: 0.80.8 + metro-transform-worker: 0.80.8 mime-types: 2.1.35 node-fetch: 2.7.0 nullthrows: 1.1.1 @@ -8976,7 +12125,6 @@ packages: /micro-ftch@0.3.1: resolution: {integrity: sha512-/0LLxhzP0tfiR5hcQebtudP56gUurs2CLkGarnCiB/OqEyUFQ6U3paQi/tgLv0hBJYt2rnr9MNpxz4fiiugstg==} - dev: false /microdiff@1.3.2: resolution: {integrity: sha512-pKy60S2febliZIbwdfEQKTtL5bLNxOyiRRmD400gueYl9XcHyNGxzHSlJWn9IMHwYXT0yohPYL08+bGozVk8cQ==} @@ -9003,7 +12151,6 @@ packages: resolution: {integrity: sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==} engines: {node: '>=4'} hasBin: true - dev: false /mime@2.6.0: resolution: {integrity: sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg==} @@ -9026,6 +12173,22 @@ packages: resolution: {integrity: sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==} engines: {node: '>=12'} + /mimic-response@1.0.1: + resolution: {integrity: sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==} + engines: {node: '>=4'} + dev: true + + /mimic-response@3.1.0: + resolution: {integrity: sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==} + engines: {node: '>=10'} + dev: true + + /min-document@2.19.0: + resolution: {integrity: sha512-9Wy1B3m3f66bPPmU5hdA4DR4PB2OfDU/+GS3yAB7IQozE3tqXaVv2zOjgla7MEGSRv95+ILmOuvhLkOK6wJtCQ==} + dependencies: + dom-walk: 0.1.2 + dev: true + /min-indent@1.0.1: resolution: {integrity: sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==} engines: {node: '>=4'} @@ -9033,17 +12196,22 @@ packages: /minimalistic-assert@1.0.1: resolution: {integrity: sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==} - dev: false /minimalistic-crypto-utils@1.0.1: resolution: {integrity: sha512-JIYlbt6g8i5jKfJ3xz7rF0LXmv2TkDxBLUkiBeZ7bAx4GnnNMr8xFpGnOxn6GhTEHx3SjRrZEoU+j04prX1ktg==} - dev: false /minimatch@3.1.2: resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} dependencies: brace-expansion: 1.1.11 + /minimatch@5.0.1: + resolution: {integrity: sha512-nLDxIFRyhDblz3qMuq+SoRZED4+miJ/G+tdDrjkkkRnjAsBexeGpgjLEQ0blJy7rHhR2b93rhQY4SvyWu9v03g==} + engines: {node: '>=10'} + dependencies: + brace-expansion: 2.0.1 + dev: true + /minimatch@9.0.3: resolution: {integrity: sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==} engines: {node: '>=16 || 14 >=14.17'} @@ -9051,15 +12219,35 @@ packages: brace-expansion: 2.0.1 dev: true + /minimatch@9.0.4: + resolution: {integrity: sha512-KqWh+VchfxcMNRAJjj2tnsSJdNbHsVgnkBhTNrW7AjVo6OvLtxw8zfT9oLw1JSohlFzJ8jCoTgaoXvJ+kHt6fw==} + engines: {node: '>=16 || 14 >=14.17'} + dependencies: + brace-expansion: 2.0.1 + dev: true + /minimist@1.2.8: resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} + /minipass@2.9.0: + resolution: {integrity: sha512-wxfUjg9WebH+CUDX/CdbRlh5SmfZiy/hpkxaRI16Y9W56Pa75sWgd/rvFilSgrauD9NyFymP/+JFV3KwzIsJeg==} + dependencies: + safe-buffer: 5.2.1 + yallist: 3.1.1 + dev: true + /minipass@7.0.4: resolution: {integrity: sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ==} engines: {node: '>=16 || 14 >=14.17'} dev: true - /mipd@0.0.5(typescript@5.4.3)(zod@3.22.4): + /minizlib@1.3.3: + resolution: {integrity: sha512-6ZYMOEnmVsdCeTJVE0W9ZD+pVnE8h9Hma/iOwwRDsdQoePpoX56/8B6z3P9VNwppJuBKNRuFDRNRqRWexT9G9Q==} + dependencies: + minipass: 2.9.0 + dev: true + + /mipd@0.0.5(typescript@5.4.4)(zod@3.22.4): resolution: {integrity: sha512-gbKA784D2WKb5H/GtqEv+Ofd1S9Zj+Z/PGDIl1u1QAbswkxD28BQ5bSXQxkeBzPBABg1iDSbiwGG1XqlOxRspA==} peerDependencies: typescript: '>=5.0.4' @@ -9067,26 +12255,32 @@ packages: typescript: optional: true dependencies: - typescript: 5.4.3 - viem: 1.21.4(typescript@5.4.3)(zod@3.22.4) + typescript: 5.4.4 + viem: 1.21.4(typescript@5.4.4)(zod@3.22.4) transitivePeerDependencies: - bufferutil - utf-8-validate - zod dev: false + /mkdirp-promise@5.0.1: + resolution: {integrity: sha512-Hepn5kb1lJPtVW84RFT40YG1OddBNTOVUZR2bzQUHc+Z03en8/3uX0+060JDhcEzyO08HmipsN9DcnFMxhIL9w==} + engines: {node: '>=4'} + deprecated: This package is broken and no longer maintained. 'mkdirp' itself supports promises now, please switch to that. + dependencies: + mkdirp: 3.0.1 + dev: true + /mkdirp@0.5.6: resolution: {integrity: sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==} hasBin: true dependencies: minimist: 1.2.8 - dev: false /mkdirp@1.0.4: resolution: {integrity: sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==} engines: {node: '>=10'} hasBin: true - dev: false /mkdirp@3.0.1: resolution: {integrity: sha512-+NsyUUAZDmo6YVHzL/stxSu3t9YS1iljliy3BSDrXJ/dkn1KYdmtZODGGjLcc9XLgVVpH4KshHB8XmZgMhaBXg==} @@ -9100,7 +12294,44 @@ packages: acorn: 8.11.3 pathe: 1.1.2 pkg-types: 1.0.3 - ufo: 1.5.2 + ufo: 1.5.3 + + /mnemonist@0.38.5: + resolution: {integrity: sha512-bZTFT5rrPKtPJxj8KSV0WkPyNxl72vQepqqVUAW2ARUpUSF2qXMB6jZj7hW5/k7C1rtpzqbD/IIbJwLXUjCHeg==} + dependencies: + obliterator: 2.0.4 + dev: true + + /mocha@10.4.0: + resolution: {integrity: sha512-eqhGB8JKapEYcC4ytX/xrzKforgEc3j1pGlAXVy3eRwrtAy5/nIfT1SvgGzfN0XZZxeLq0aQWkOUAmqIJiv+bA==} + engines: {node: '>= 14.0.0'} + hasBin: true + dependencies: + ansi-colors: 4.1.1 + browser-stdout: 1.3.1 + chokidar: 3.5.3 + debug: 4.3.4(supports-color@8.1.1) + diff: 5.0.0 + escape-string-regexp: 4.0.0 + find-up: 5.0.0 + glob: 8.1.0 + he: 1.2.0 + js-yaml: 4.1.0 + log-symbols: 4.1.0 + minimatch: 5.0.1 + ms: 2.1.3 + serialize-javascript: 6.0.0 + strip-json-comments: 3.1.1 + supports-color: 8.1.1 + workerpool: 6.2.1 + yargs: 16.2.0 + yargs-parser: 20.2.4 + yargs-unparser: 2.0.0 + dev: true + + /mock-fs@4.14.0: + resolution: {integrity: sha512-qYvlv/exQ4+svI3UOvPUpLDF0OMX5euvUH0Ny4N5QyRyhNdgAgUrVH3iUINSzEPLvx0kbo/Bp28GJKIqvE7URw==} + dev: true /motion@10.16.2: resolution: {integrity: sha512-p+PurYqfUdcJZvtnmAqu5fJgV2kR0uLFQuBKtLeFVTrYEVllI99tiOTSefVNYuip9ELTEkepIIDftNdze76NAQ==} @@ -9120,7 +12351,6 @@ packages: /ms@2.0.0: resolution: {integrity: sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==} - dev: false /ms@2.1.2: resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} @@ -9128,10 +12358,57 @@ packages: /ms@2.1.3: resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} + /multibase@0.6.1: + resolution: {integrity: sha512-pFfAwyTjbbQgNc3G7D48JkJxWtoJoBMaR4xQUOuB8RnCgRqaYmWNFeJTTvrJ2w51bjLq2zTby6Rqj9TQ9elSUw==} + deprecated: This module has been superseded by the multiformats module + dependencies: + base-x: 3.0.9 + buffer: 5.7.1 + dev: true + + /multibase@0.7.0: + resolution: {integrity: sha512-TW8q03O0f6PNFTQDvh3xxH03c8CjGaaYrjkl9UQPG6rz53TQzzxJVCIWVjzcbN/Q5Y53Zd0IBQBMVktVgNx4Fg==} + deprecated: This module has been superseded by the multiformats module + dependencies: + base-x: 3.0.9 + buffer: 5.7.1 + dev: true + + /multicodec@0.5.7: + resolution: {integrity: sha512-PscoRxm3f+88fAtELwUnZxGDkduE2HD9Q6GHUOywQLjOGT/HAdhjLDYNZ1e7VR0s0TP0EwZ16LNUTFpoBGivOA==} + deprecated: This module has been superseded by the multiformats module + dependencies: + varint: 5.0.2 + dev: true + + /multicodec@1.0.4: + resolution: {integrity: sha512-NDd7FeS3QamVtbgfvu5h7fd1IlbaC4EQ0/pgU4zqE2vdHCmBGsUa0TiM8/TdSeG6BMPC92OOCf8F1ocE/Wkrrg==} + deprecated: This module has been superseded by the multiformats module + dependencies: + buffer: 5.7.1 + varint: 5.0.2 + dev: true + /multiformats@9.9.0: resolution: {integrity: sha512-HoMUjhH9T8DDBNT+6xzkrd9ga/XiBI4xLr58LJACwK6G3HTOPeMz4nB4KJs33L2BelrIJa7P0VuNaVF3hMYfjg==} dev: false + /multihashes@0.4.21: + resolution: {integrity: sha512-uVSvmeCWf36pU2nB4/1kzYZjsXD9vofZKpgudqkceYY5g2aZZXJ5r9lxuzoRLl1OAp28XljXsEJ/X/85ZsKmKw==} + dependencies: + buffer: 5.7.1 + multibase: 0.7.0 + varint: 5.0.2 + dev: true + + /nano-base32@1.0.1: + resolution: {integrity: sha512-sxEtoTqAPdjWVGv71Q17koMFGsOMSiHsIFEvzOM7cNp8BXB4AnEwmDabm5dorusJf/v1z7QxaZYxUorU9RKaAw==} + dev: true + + /nano-json-stream-parser@0.1.2: + resolution: {integrity: sha512-9MqxMH/BSJC7dnLsEMPyfN5Dvoo49IsPFYMcHw3Bcfc2kN0lpHRBSzlMSVx4HGyJ7s9B31CyBTVehWJoQ8Ctew==} + dev: true + /nanoid@3.3.7: resolution: {integrity: sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==} engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} @@ -9144,13 +12421,15 @@ packages: /negotiator@0.6.3: resolution: {integrity: sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==} engines: {node: '>= 0.6'} - dev: false /neo-async@2.6.2: resolution: {integrity: sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==} - dev: false - /next@14.1.4(@babel/core@7.24.3)(react-dom@18.2.0)(react@18.2.0): + /next-tick@1.1.0: + resolution: {integrity: sha512-CXdUiJembsNjuToQvxayPZF9Vqht7hewsvy2sOWafLvi2awflj9mOC6bHIg50orX8IJvWKY9wYQ/zB2kogPslQ==} + dev: true + + /next@14.1.4(@babel/core@7.24.4)(react-dom@18.2.0)(react@18.2.0): resolution: {integrity: sha512-1WTaXeSrUwlz/XcnhGTY7+8eiaFvdet5z9u3V2jb+Ek1vFo0VhHKSAIJvDWfQpttWjnyw14kBeq28TPq7bTeEQ==} engines: {node: '>=18.17.0'} hasBin: true @@ -9168,12 +12447,12 @@ packages: '@next/env': 14.1.4 '@swc/helpers': 0.5.2 busboy: 1.6.0 - caniuse-lite: 1.0.30001599 + caniuse-lite: 1.0.30001607 graceful-fs: 4.2.11 postcss: 8.4.31 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) - styled-jsx: 5.1.1(@babel/core@7.24.3)(react@18.2.0) + styled-jsx: 5.1.1(@babel/core@7.24.4)(react@18.2.0) optionalDependencies: '@next/swc-darwin-arm64': 14.1.4 '@next/swc-darwin-x64': 14.1.4 @@ -9189,6 +12468,12 @@ packages: - babel-plugin-macros dev: false + /no-case@2.3.2: + resolution: {integrity: sha512-rmTZ9kz+f3rCvK2TD1Ue/oZlns7OGoIWP4fc3llxxRXlOkHKoWPPWJOfFYpITabSow43QJbRIoHQXtt10VldyQ==} + dependencies: + lower-case: 1.1.4 + dev: true + /nocache@3.0.4: resolution: {integrity: sha512-WDD0bdg9mbq6F4mRxEYcPWwfA1vxd0mrvKOyxI7Xj/atfRHVeutzuWByG//jfm4uPzp0y4Kj051EORCBSQMycw==} engines: {node: '>=12.0.0'} @@ -9200,7 +12485,6 @@ packages: /node-addon-api@2.0.2: resolution: {integrity: sha512-Ntyt4AIXyaLIuMHF6IOoTakB3K+RWxwtsHNRxllEoA6vPwP9o4866g6YWDLUdnucilZhmkxiHwHr11gAENw+QA==} - dev: false /node-addon-api@5.1.0: resolution: {integrity: sha512-eh0GgfEkpnoWDq+VY8OyvYhFEzBk6jIYbRKdIlyTiAXIVJ8PyBaKb0rp7oDtoddbdoHWhq8wwr+XZ81F1rpNdA==} @@ -9218,6 +12502,17 @@ packages: minimatch: 3.1.2 dev: false + /node-domexception@1.0.0: + resolution: {integrity: sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ==} + engines: {node: '>=10.5.0'} + dev: true + + /node-emoji@1.11.0: + resolution: {integrity: sha512-wo2DpQkQp7Sjm2A0cq+sN7EHKO6Sl0ctXeBdFZrL9T9+UywORbufTcTZxom8YqpLQt/FqNMUkOpkZrJVYSKD3A==} + dependencies: + lodash: 4.17.21 + dev: true + /node-eval@2.0.0: resolution: {integrity: sha512-Ap+L9HznXAVeJj3TJ1op6M6bg5xtTq8L5CU/PJxtkhea/DrIxdTknGKIECKd/v/Lgql95iuMAYvIzBNd0pmcMg==} engines: {node: '>= 4'} @@ -9239,7 +12534,15 @@ packages: optional: true dependencies: whatwg-url: 5.0.0 - dev: false + + /node-fetch@3.3.1: + resolution: {integrity: sha512-cRVc/kyto/7E5shrWca1Wsea4y6tL9iYJE5FBCius3JQfb/4P4I295PfhgbJQBLTx6lATE4z+wK0rPM4VS2uow==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + dependencies: + data-uri-to-buffer: 4.0.1 + fetch-blob: 3.2.0 + formdata-polyfill: 4.0.10 + dev: true /node-forge@1.3.1: resolution: {integrity: sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA==} @@ -9249,7 +12552,6 @@ packages: /node-gyp-build@4.8.0: resolution: {integrity: sha512-u6fs2AEUljNho3EYTJNBfImO5QTo/J/1Etd+NVdCj7qWKUSN/bSLkZwhDv7I+w/MSC6qJ4cknepkAYykDdK8og==} hasBin: true - dev: false /node-int64@0.4.0: resolution: {integrity: sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==} @@ -9263,10 +12565,41 @@ packages: engines: {node: '>=0.12.0'} dev: false + /nofilter@1.0.4: + resolution: {integrity: sha512-N8lidFp+fCz+TD51+haYdbDGrcBWwuHX40F5+z0qkUjMJ5Tp+rdSuAkMJ9N9eoolDlEVTf6u5icM+cNKkKW2mA==} + engines: {node: '>=8'} + dev: true + + /nofilter@3.1.0: + resolution: {integrity: sha512-l2NNj07e9afPnhAhvgVrCD/oy2Ai1yfLpuo3EpiO1jFTsB4sFz6oIfAfSZyQzVpkZQ9xS8ZS5g1jCBgq4Hwo0g==} + engines: {node: '>=12.19'} + dev: true + + /nopt@3.0.6: + resolution: {integrity: sha512-4GUt3kSEYmk4ITxzB/b9vaIDfUVWN/Ml1Fwl11IlnIG2iaJ9O6WXZ9SrYM9NLI8OCBieN2Y8SWC2oJV0RQ7qYg==} + hasBin: true + dependencies: + abbrev: 1.0.9 + dev: true + + /normalize-package-data@2.5.0: + resolution: {integrity: sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==} + dependencies: + hosted-git-info: 2.8.9 + resolve: 1.22.8 + semver: 5.7.2 + validate-npm-package-license: 3.0.4 + dev: true + /normalize-path@3.0.0: resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} engines: {node: '>=0.10.0'} + /normalize-url@6.1.0: + resolution: {integrity: sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A==} + engines: {node: '>=10'} + dev: true + /npm-run-path@4.0.1: resolution: {integrity: sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==} engines: {node: '>=8'} @@ -9280,16 +12613,39 @@ packages: dependencies: path-key: 4.0.0 + /nth-check@2.1.1: + resolution: {integrity: sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==} + dependencies: + boolbase: 1.0.0 + dev: true + /nullthrows@1.1.1: resolution: {integrity: sha512-2vPPEi+Z7WqML2jZYddDIfy5Dqb0r2fze2zTxNNknZaFpVHU3mFB3R+DWeJWGVx0ecvttSGlJTI+WG+8Z4cDWw==} dev: false + /number-is-nan@1.0.1: + resolution: {integrity: sha512-4jbtZXNAsfZbAHiiqjLPBiCl16dES1zI4Hpzzxw61Tk+loF+sBDBKx1ICKKKwIqQ7M0mFn1TmkN7euSncWgHiQ==} + engines: {node: '>=0.10.0'} + dev: true + + /number-to-bn@1.7.0: + resolution: {integrity: sha512-wsJ9gfSz1/s4ZsJN01lyonwuxA1tml6X1yBDnfpMglypcBRFZZkus26EdPSlqS5GJfYddVZa22p3VNb3z5m5Ig==} + engines: {node: '>=6.5.0', npm: '>=3'} + dependencies: + bn.js: 4.11.6 + strip-hex-prefix: 1.0.0 + dev: true + /nwsapi@2.2.7: resolution: {integrity: sha512-ub5E4+FBPKwAZx0UwIQOjYWGHTEq5sPqHQNRN8Z9e4A7u3Tj1weLJsL59yH9vmvqEtBHaOmT6cYQKIZOxp35FQ==} dev: true - /ob1@0.80.7: - resolution: {integrity: sha512-+m1cCNckRtDEnurNSVqywpN6LhFWc1Z3MdX7PX7boCwEdSzh4evlUjBIUzao1lBOpB7G5FvwfFagTVQGCMa0Yw==} + /oauth-sign@0.9.0: + resolution: {integrity: sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==} + dev: true + + /ob1@0.80.8: + resolution: {integrity: sha512-QHJQk/lXMmAW8I7AIM3in1MSlwe1umR72Chhi8B7Xnq6mzjhBKkA6Fy/zAhQnGkA4S912EPCEvTij5yh+EQTAA==} engines: {node: '>=18'} dev: false @@ -9352,7 +12708,7 @@ packages: dependencies: call-bind: 1.0.7 define-properties: 1.2.1 - es-abstract: 1.23.2 + es-abstract: 1.23.3 es-object-atoms: 1.0.0 dev: true @@ -9362,14 +12718,16 @@ packages: dependencies: call-bind: 1.0.7 define-properties: 1.2.1 - es-abstract: 1.23.2 + es-abstract: 1.23.3 dev: true - /object.hasown@1.1.3: - resolution: {integrity: sha512-fFI4VcYpRHvSLXxP7yiZOMAd331cPfd2p7PFDVbgUsYOfCT3tICVqXWngbjr4m49OvsBwUBQ6O2uQoJvy3RexA==} + /object.hasown@1.1.4: + resolution: {integrity: sha512-FZ9LZt9/RHzGySlBARE3VF+gE26TxR38SdmqOqliuTnl9wrKulaQs+4dee1V+Io8VfxqzAfHu6YuRgUy8OHoTg==} + engines: {node: '>= 0.4'} dependencies: define-properties: 1.2.1 - es-abstract: 1.22.5 + es-abstract: 1.23.3 + es-object-atoms: 1.0.0 dev: true /object.values@1.2.0: @@ -9381,6 +12739,16 @@ packages: es-object-atoms: 1.0.0 dev: true + /obliterator@2.0.4: + resolution: {integrity: sha512-lgHwxlxV1qIg1Eap7LgIeoBWIMFibOjbrYPIPJZcI1mmGAI2m3lNYpK12Y+GBdPQ0U1hRwSord7GIaawz962qQ==} + dev: true + + /oboe@2.1.5: + resolution: {integrity: sha512-zRFWiF+FoicxEs3jNI/WYUrVEgA7DeET/InK0XQuudGHRg8iIob3cNPrJTKaz4004uaA9Pbe+Dwa8iluhjLZWA==} + dependencies: + http-https: 1.0.0 + dev: true + /ofetch@1.3.4: resolution: {integrity: sha512-KLIET85ik3vhEfS+3fDlc/BAZiAp+43QEC/yCo5zkNoY2YaKvNkOaFr/6wCFgFH1kuYQM5pMNi0Tg8koiIemtw==} dependencies: @@ -9409,7 +12777,6 @@ packages: engines: {node: '>= 0.8'} dependencies: ee-first: 1.1.1 - dev: false /on-headers@1.0.2: resolution: {integrity: sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==} @@ -9458,6 +12825,18 @@ packages: is-wsl: 2.2.0 dev: false + /optionator@0.8.3: + resolution: {integrity: sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==} + engines: {node: '>= 0.8.0'} + dependencies: + deep-is: 0.1.4 + fast-levenshtein: 2.0.6 + levn: 0.3.0 + prelude-ls: 1.1.2 + type-check: 0.3.2 + word-wrap: 1.2.5 + dev: true + /optionator@0.9.3: resolution: {integrity: sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==} engines: {node: '>= 0.8.0'} @@ -9485,29 +12864,69 @@ packages: wcwidth: 1.0.1 dev: false - /outdent@0.8.0: - resolution: {integrity: sha512-KiOAIsdpUTcAXuykya5fnVVT+/5uS0Q1mrkRHcF89tpieSmY33O/tmc54CqwA+bfhbtEfZUNLHaPUiB9X3jt1A==} + /ordinal@1.0.3: + resolution: {integrity: sha512-cMddMgb2QElm8G7vdaa02jhUNbTSrhsgAGUz1OokD83uJTwSUn+nKoNoKVVaRa08yF6sgfO7Maou1+bgLd9rdQ==} dev: true - /p-limit@2.3.0: - resolution: {integrity: sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==} - engines: {node: '>=6'} + /os-locale@1.4.0: + resolution: {integrity: sha512-PRT7ZORmwu2MEFt4/fv3Q+mEfN4zetKxufQrkShY2oGvUms9r8otu5HfdyIFHkYXjO7laNsoVGmM2MANfuTA8g==} + engines: {node: '>=0.10.0'} dependencies: - p-try: 2.2.0 + lcid: 1.0.0 + dev: true - /p-limit@3.1.0: - resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} - engines: {node: '>=10'} - dependencies: - yocto-queue: 0.1.0 + /os-tmpdir@1.0.2: + resolution: {integrity: sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==} + engines: {node: '>=0.10.0'} + dev: true - /p-limit@5.0.0: - resolution: {integrity: sha512-/Eaoq+QyLSiXQ4lyYV23f14mZRQcXnxfHrN0vCai+ak9G0pp9iEQukIIZq5NccEvwRB8PUnZT0KsOoDCINS1qQ==} - engines: {node: '>=18'} + /outdent@0.8.0: + resolution: {integrity: sha512-KiOAIsdpUTcAXuykya5fnVVT+/5uS0Q1mrkRHcF89tpieSmY33O/tmc54CqwA+bfhbtEfZUNLHaPUiB9X3jt1A==} + dev: true + + /p-cancelable@2.1.1: + resolution: {integrity: sha512-BZOr3nRQHOntUjTrH8+Lh54smKHoHyur8We1V8DSMVrl5A2malOOwuJRnKRDjSnkoeBh4at6BwEnb5I7Jl31wg==} + engines: {node: '>=8'} + dev: true + + /p-cancelable@3.0.0: + resolution: {integrity: sha512-mlVgR3PGuzlo0MmTdk4cXqXWlwQDLnONTAg6sm62XkMJEiRxN3GL3SffkYvqwonbkJBcrI7Uvv5Zh9yjvn2iUw==} + engines: {node: '>=12.20'} + dev: true + + /p-limit@1.3.0: + resolution: {integrity: sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==} + engines: {node: '>=4'} + dependencies: + p-try: 1.0.0 + dev: true + + /p-limit@2.3.0: + resolution: {integrity: sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==} + engines: {node: '>=6'} + dependencies: + p-try: 2.2.0 + + /p-limit@3.1.0: + resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} + engines: {node: '>=10'} + dependencies: + yocto-queue: 0.1.0 + + /p-limit@5.0.0: + resolution: {integrity: sha512-/Eaoq+QyLSiXQ4lyYV23f14mZRQcXnxfHrN0vCai+ak9G0pp9iEQukIIZq5NccEvwRB8PUnZT0KsOoDCINS1qQ==} + engines: {node: '>=18'} dependencies: yocto-queue: 1.0.0 dev: true + /p-locate@2.0.0: + resolution: {integrity: sha512-nQja7m7gSKuewoVRen45CtVfODR3crN3goVQ0DDZ9N3yHxgpkuBhZqsaiotSQRrADUrne346peY7kT3TSACykg==} + engines: {node: '>=4'} + dependencies: + p-limit: 1.3.0 + dev: true + /p-locate@3.0.0: resolution: {integrity: sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==} engines: {node: '>=6'} @@ -9527,16 +12946,53 @@ packages: dependencies: p-limit: 3.1.0 + /p-map@4.0.0: + resolution: {integrity: sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==} + engines: {node: '>=10'} + dependencies: + aggregate-error: 3.1.0 + dev: true + + /p-try@1.0.0: + resolution: {integrity: sha512-U1etNYuMJoIz3ZXSrrySFjsXQTWOx2/jdi86L+2pRvph/qMKL6sbcCYdH23fqsbm8TH2Gn0OybpT4eSFlCVHww==} + engines: {node: '>=4'} + dev: true + /p-try@2.2.0: resolution: {integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==} engines: {node: '>=6'} + /pako@1.0.11: + resolution: {integrity: sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==} + dev: true + + /param-case@2.1.1: + resolution: {integrity: sha512-eQE845L6ot89sk2N8liD8HAuH4ca6Vvr7VWAWwt7+kvvG5aBcPmmphQ68JsEG2qa9n1TykS2DLeMt363AAH8/w==} + dependencies: + no-case: 2.3.2 + dev: true + /parent-module@1.0.1: resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} engines: {node: '>=6'} dependencies: callsites: 3.1.0 + /parse-cache-control@1.0.1: + resolution: {integrity: sha512-60zvsJReQPX5/QP0Kzfd/VrpjScIQ7SHBW6bFCYfEP+fp0Eppr1SHhIO5nd1PjZtvclzSzES9D/p5nFJurwfWg==} + dev: true + + /parse-headers@2.0.5: + resolution: {integrity: sha512-ft3iAoLOB/MlwbNXgzy43SWGP6sQki2jQvAyBg/zDFAgr9bfNWZIUj42Kw2eJIl8kEi4PbgE6U1Zau/HwI75HA==} + dev: true + + /parse-json@2.2.0: + resolution: {integrity: sha512-QR/GGaKCkhwk1ePQNYDRKYZ3mwU9ypsKhB0XyFnLQdomyEqk3e8wpW3V5Jp88zbxK4n5ST1nqo+g9juTpownhQ==} + engines: {node: '>=0.10.0'} + dependencies: + error-ex: 1.3.2 + dev: true + /parse-json@4.0.0: resolution: {integrity: sha512-aOIos8bujGN93/8Ox/jPLh7RwVnPEysynVFE+fQZyg6jKELEHwzgKdLRFHUgXJL6kylijVSBC4BvN9OmsB48Rw==} engines: {node: '>=4'} @@ -9555,6 +13011,13 @@ packages: lines-and-columns: 1.2.4 dev: false + /parse5-htmlparser2-tree-adapter@7.0.0: + resolution: {integrity: sha512-B77tOZrqqfUfnVcOrUvfdLbz4pu4RopLD/4vmu3HUPswwTA8OH0EMW9BlWR2B0RCoiZRAHEUu7IxeP1Pd1UU+g==} + dependencies: + domhandler: 5.0.3 + parse5: 7.1.2 + dev: true + /parse5@7.1.2: resolution: {integrity: sha512-Czj1WaSVpaoj0wbhMzLmWD69anp2WH7FXMB9n1Sy8/ZFF9jolSQVMu1Ij5WIyGmcBmhk7EOndpO4mIpihVqAXw==} dependencies: @@ -9564,16 +13027,34 @@ packages: /parseurl@1.3.3: resolution: {integrity: sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==} engines: {node: '>= 0.8'} - dev: false + + /pascal-case@2.0.1: + resolution: {integrity: sha512-qjS4s8rBOJa2Xm0jmxXiyh1+OFf6ekCWOvUaRgAQSktzlTbMotS0nmG9gyYAybCWBcuP4fsBeRCKNwGBnMe2OQ==} + dependencies: + camel-case: 3.0.0 + upper-case-first: 1.1.2 + dev: true /path-browserify@1.0.1: resolution: {integrity: sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==} dev: true + /path-case@2.1.1: + resolution: {integrity: sha512-Ou0N05MioItesaLr9q8TtHVWmJ6fxWdqKB2RohFmNWVyJ+2zeKIeDNWAN6B/Pe7wpzWChhZX6nONYmOnMeJQ/Q==} + dependencies: + no-case: 2.3.2 + dev: true + + /path-exists@2.1.0: + resolution: {integrity: sha512-yTltuKuhtNeFJKa1PiRzfLAU5182q1y4Eb4XCJ3PBqyzEDkAZRzBrKKBct682ls9reBVHf9udYLN5Nd+K1B9BQ==} + engines: {node: '>=0.10.0'} + dependencies: + pinkie-promise: 2.0.1 + dev: true + /path-exists@3.0.0: resolution: {integrity: sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==} engines: {node: '>=4'} - dev: false /path-exists@4.0.0: resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} @@ -9594,14 +13075,27 @@ packages: /path-parse@1.0.7: resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} - /path-scurry@1.10.1: - resolution: {integrity: sha512-MkhCqzzBEpPvxxQ71Md0b1Kk51W01lrYvlMzSUaIzNsODdd7mqhiimSZlr+VegAz5Z6Vzt9Xg2ttE//XBhH3EQ==} + /path-scurry@1.10.2: + resolution: {integrity: sha512-7xTavNy5RQXnsjANvVvMkEjvloOinkAjv/Z6Ildz9v2RinZ4SBKTWFOVRbaF8p0vpHnyjV/UwNDdKuUv6M5qcA==} engines: {node: '>=16 || 14 >=14.17'} dependencies: lru-cache: 10.2.0 minipass: 7.0.4 dev: true + /path-to-regexp@0.1.7: + resolution: {integrity: sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==} + dev: true + + /path-type@1.1.0: + resolution: {integrity: sha512-S4eENJz1pkiQn9Znv33Q+deTOKmbl+jj1Fl+qiP/vYezj+S8x+J3Uo0ISrx/QoEvIlOaDWJhPaRd1flJ9HXZqg==} + engines: {node: '>=0.10.0'} + dependencies: + graceful-fs: 4.2.11 + pify: 2.3.0 + pinkie-promise: 2.0.1 + dev: true + /path-type@4.0.0: resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} engines: {node: '>=8'} @@ -9613,10 +13107,31 @@ packages: resolution: {integrity: sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==} dev: true + /pause-stream@0.0.11: + resolution: {integrity: sha512-e3FBlXLmN/D1S+zHzanP4E/4Z60oFAa3O051qt1pxa7DEJWKAyil6upYVXCWadEnuoqa4Pkc9oUx9zsxYeRv8A==} + dependencies: + through: 2.3.8 + dev: true + + /pbkdf2@3.1.2: + resolution: {integrity: sha512-iuh7L6jA7JEGu2WxDwtQP1ddOpaJNC4KlDEFfdQajSGgGPNi4OyDc2R7QnbY2bR9QjBVGwgvTdNJZoE7RaxUMA==} + engines: {node: '>=0.12'} + dependencies: + create-hash: 1.2.0 + create-hmac: 1.1.7 + ripemd160: 2.0.2 + safe-buffer: 5.2.1 + sha.js: 2.4.11 + dev: true + /perfect-debounce@1.0.0: resolution: {integrity: sha512-xCy9V055GLEqoFaHoC1SoLIaLmWctgCUaBaWxDZ7/Zx4CTyX7cJQLJOok/orfjZAh9kEYpjJa4d0KcJmCbctZA==} dev: true + /performance-now@2.1.0: + resolution: {integrity: sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow==} + dev: true + /picocolors@1.0.0: resolution: {integrity: sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==} @@ -9624,6 +13139,11 @@ packages: resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} engines: {node: '>=8.6'} + /pify@2.3.0: + resolution: {integrity: sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==} + engines: {node: '>=0.10.0'} + dev: true + /pify@3.0.0: resolution: {integrity: sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg==} engines: {node: '>=4'} @@ -9638,6 +13158,18 @@ packages: engines: {node: '>=10'} dev: false + /pinkie-promise@2.0.1: + resolution: {integrity: sha512-0Gni6D4UcLTbv9c57DfxDGdr41XfgUjqWZu492f0cIGr16zDU06BWP/RAEvOuo7CQ0CNjHaLlM59YJJFm3NWlw==} + engines: {node: '>=0.10.0'} + dependencies: + pinkie: 2.0.4 + dev: true + + /pinkie@2.0.4: + resolution: {integrity: sha512-MnUuEycAemtSaeFSjXKW/aroV7akBbY+Sv+RkyqFjgAe73F+MR0TBWKBRDkmfWq/HiFmdavfZ1G7h4SPZXaCSg==} + engines: {node: '>=0.10.0'} + dev: true + /pino-abstract-transport@0.5.0: resolution: {integrity: sha512-+KAgmVeqXYbTtU2FScx1XS3kNyfZ5TrXY07V96QnUSFqo2gAqlvmaxH67Lj7SWazqsMabf+58ctdTcBgnOLUOQ==} dependencies: @@ -9810,17 +13342,17 @@ packages: source-map-js: 1.2.0 dev: true - /postcss@8.4.36: - resolution: {integrity: sha512-/n7eumA6ZjFHAsbX30yhHup/IMkOmlmvtEi7P+6RMYf+bGJSUHc3geH4a0NSZxAz/RJfiS9tooCTs9LAVYUZKw==} + /postcss@8.4.38: + resolution: {integrity: sha512-Wglpdk03BSfXkHoQa3b/oulrotAkwrlLDRSOb9D0bN86FdRyE9lppSp33aHNPgBa0JKCoB+drFLZkQoRRYae5A==} engines: {node: ^10 || ^12 || >=14} dependencies: nanoid: 3.3.7 picocolors: 1.0.0 - source-map-js: 1.1.0 + source-map-js: 1.2.0 dev: true - /preact@10.20.0: - resolution: {integrity: sha512-wU7iZw2BjsaKDal3pDRDy/HpPB6cuFOnVUCcw9aIPKG98+ZrXx3F+szkos8BVME5bquyKDKvRlOJFG8kMkcAbg==} + /preact@10.20.1: + resolution: {integrity: sha512-JIFjgFg9B2qnOoGiYMVBtrcFxHqn+dNXbq76bVmcaHYJFYR4lW67AOcXgAYQQTDYXDOg/kTZrKPNCdRgJ2UJmw==} dev: false /preferred-pm@3.1.2: @@ -9833,11 +13365,22 @@ packages: which-pm: 2.0.0 dev: true + /prelude-ls@1.1.2: + resolution: {integrity: sha512-ESF23V4SKG6lVSGZgYNpbsiaAkdab6ZgOxe52p7+Kid3W3u3bxR4Vfd/o21dmN7jSt0IwgZ4v5MUd26FEtXE9w==} + engines: {node: '>= 0.8.0'} + dev: true + /prelude-ls@1.2.1: resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} engines: {node: '>= 0.8.0'} dev: true + /prettier@2.8.8: + resolution: {integrity: sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==} + engines: {node: '>=10.13.0'} + hasBin: true + dev: true + /prettier@3.2.5: resolution: {integrity: sha512-3/GWa9aOC0YeD7LUfvOG2NiDyhOWRvt1k+rcKhOuYnMY24iiCphgneUfJDyFXd6rZCAnuLBv6UeAULtrhT/F4A==} engines: {node: '>=14'} @@ -9877,17 +13420,20 @@ packages: /process-nextick-args@2.0.1: resolution: {integrity: sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==} - dev: false /process-warning@1.0.0: resolution: {integrity: sha512-du4wfLyj4yCZq1VupnVSZmRsPJsNuxoDQFdCFHLaYiEbFBD7QE0a+I4D7hOxrVnh78QE/YipFAj9lXHiXocV+Q==} dev: false + /process@0.11.10: + resolution: {integrity: sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==} + engines: {node: '>= 0.6.0'} + dev: true + /promise@8.3.0: resolution: {integrity: sha512-rZPNPKTOYVNEEKFaq1HqTgOwZD+4/YHS5ukLzQCypkj+OkYx7iv0mA91lJlpPPZ8vMau3IIGj5Qlwrx+8iiSmg==} dependencies: asap: 2.0.6 - dev: false /prompts@2.4.2: resolution: {integrity: sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==} @@ -9904,10 +13450,30 @@ packages: object-assign: 4.1.1 react-is: 16.13.1 + /proxy-addr@2.0.7: + resolution: {integrity: sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==} + engines: {node: '>= 0.10'} + dependencies: + forwarded: 0.2.0 + ipaddr.js: 1.9.1 + dev: true + /proxy-compare@2.5.1: resolution: {integrity: sha512-oyfc0Tx87Cpwva5ZXezSp5V9vht1c7dZBhvuV/y3ctkgMVUmiAGDVeeB0dKhGSyT0v1ZTEQYpe/RXlBVBNuCLA==} dev: false + /proxy-from-env@1.1.0: + resolution: {integrity: sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==} + dev: true + + /ps-tree@1.2.0: + resolution: {integrity: sha512-0VnamPPYHl4uaU/nSFeZZpR21QAWRz+sRv4iW9+v/GS/J5U5iZB5BNN6J0RMoOvdx2gWM2+ZFMIm58q24e4UYA==} + engines: {node: '>= 0.10'} + hasBin: true + dependencies: + event-stream: 3.3.4 + dev: true + /psl@1.9.0: resolution: {integrity: sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag==} dev: true @@ -9917,13 +13483,21 @@ packages: dependencies: end-of-stream: 1.4.4 once: 1.4.0 - dev: false + + /punycode@2.1.0: + resolution: {integrity: sha512-Yxz2kRwT90aPiWEMHVYnEf4+rhwF1tBmmZ4KepCP+Wkium9JxtWnUm1nqGwpiAHr/tnTSeHqr3wb++jgSkXjhA==} + engines: {node: '>=6'} + dev: true /punycode@2.3.1: resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} engines: {node: '>=6'} dev: true + /pure-rand@5.0.5: + resolution: {integrity: sha512-BwQpbqxSCBJVpamI6ydzcKqyFmnd5msMWUGvzXLm1aXvusbbgkbOto/EUPM00hjveJEaJtdbhUjKSzWRhQVkaw==} + dev: true + /qr-code-styling@1.6.0-rc.1: resolution: {integrity: sha512-ModRIiW6oUnsP18QzrRYZSc/CFKFKIdj7pUs57AEVH20ajlglRpN3HukjHk0UbNMTlKGuaYl7Gt6/O5Gg2NU2Q==} dependencies: @@ -9950,6 +13524,34 @@ packages: yargs: 15.4.1 dev: false + /qs@6.11.0: + resolution: {integrity: sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==} + engines: {node: '>=0.6'} + dependencies: + side-channel: 1.0.6 + dev: true + + /qs@6.12.0: + resolution: {integrity: sha512-trVZiI6RMOkO476zLGaBIzszOdFPnCCXHPG9kn0yuS1uz6xdVxPfZdB3vUig9pxPFDM9BRAgz/YUIVQ1/vuiUg==} + engines: {node: '>=0.6'} + dependencies: + side-channel: 1.0.6 + dev: true + + /qs@6.5.3: + resolution: {integrity: sha512-qxXIEh4pCGfHICj1mAJQ2/2XVZkjCDTcEgfoSQxc/fYivUZxTkk7L3bDBJSoNrEzXI17oUO5Dp07ktqE5KzczA==} + engines: {node: '>=0.6'} + dev: true + + /query-string@5.1.1: + resolution: {integrity: sha512-gjWOsm2SoGlgLEdAGt7a6slVOk9mGiXmPFMqrEhLQ68rhQuBnpfs3+EmlvqKyxnCo9/PPlF+9MtY02S1aFg+Jw==} + engines: {node: '>=0.10.0'} + dependencies: + decode-uri-component: 0.2.2 + object-assign: 4.1.1 + strict-uri-encode: 1.1.0 + dev: true + /query-string@7.1.3: resolution: {integrity: sha512-hh2WYhq4fi8+b+/2Kg9CEge4fDPvHS534aOOvOZeQ3+Vf2mCFsaFBYj0i+iXcAq6I9Vzp5fjMFBlONvayDC1qg==} engines: {node: '>=6'} @@ -9978,14 +13580,34 @@ packages: resolution: {integrity: sha512-tYC1Q1hgyRuHgloV/YXs2w15unPVh8qfu/qCTfhTYamaw7fyhumKa2yGpdSo87vY32rIclj+4fWYQXUMs9EHvg==} dev: false - /radix3@1.1.1: - resolution: {integrity: sha512-yUUd5VTiFtcMEx0qFUxGAv5gbMc1un4RvEO1JZdP7ZUl/RHygZK6PknIKntmQRZxnMY3ZXD2ISaw1ij8GYW1yg==} + /quick-lru@5.1.1: + resolution: {integrity: sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==} + engines: {node: '>=10'} + dev: true + + /radix3@1.1.2: + resolution: {integrity: sha512-b484I/7b8rDEdSDKckSSBA8knMpcdsXudlE/LNL639wFoHKwLbEkQFZHWEYwDC0wa0FKUcCY+GAF73Z7wxNVFA==} dev: false + /randombytes@2.1.0: + resolution: {integrity: sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==} + dependencies: + safe-buffer: 5.2.1 + dev: true + /range-parser@1.2.1: resolution: {integrity: sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==} engines: {node: '>= 0.6'} - dev: false + + /raw-body@2.5.2: + resolution: {integrity: sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==} + engines: {node: '>= 0.8'} + dependencies: + bytes: 3.1.2 + http-errors: 2.0.0 + iconv-lite: 0.4.24 + unpipe: 1.0.0 + dev: true /react-devtools-core@4.28.5: resolution: {integrity: sha512-cq/o30z9W2Wb4rzBefjv5fBalHU0rJGZCHAkf/RHSBWSSYwh8PlQTqqOJmgIIbBtpj27T6FIPXeomIjZtCNVqA==} @@ -10019,12 +13641,12 @@ packages: react-native: optional: true dependencies: - '@babel/runtime': 7.24.1 + '@babel/runtime': 7.24.4 html-parse-stringify: 3.0.1 i18next: 22.5.1 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) - react-native: 0.73.6(@babel/core@7.24.3)(@babel/preset-env@7.24.3)(react@18.2.0) + react-native: 0.73.6(@babel/core@7.24.4)(@babel/preset-env@7.24.4)(react@18.2.0) dev: false /react-is@16.13.1: @@ -10045,10 +13667,10 @@ packages: escape-string-regexp: 2.0.0 invariant: 2.2.4 react: 18.2.0 - react-native: 0.73.6(@babel/core@7.24.3)(@babel/preset-env@7.24.3)(react@18.2.0) + react-native: 0.73.6(@babel/core@7.24.4)(@babel/preset-env@7.24.4)(react@18.2.0) dev: false - /react-native@0.73.6(@babel/core@7.24.3)(@babel/preset-env@7.24.3)(react@18.2.0): + /react-native@0.73.6(@babel/core@7.24.4)(@babel/preset-env@7.24.4)(react@18.2.0): resolution: {integrity: sha512-oqmZe8D2/VolIzSPZw+oUd6j/bEmeRHwsLn1xLA5wllEYsZ5zNuMsDus235ONOnCRwexqof/J3aztyQswSmiaA==} engines: {node: '>=18'} hasBin: true @@ -10060,8 +13682,8 @@ packages: '@react-native-community/cli-platform-android': 12.3.6 '@react-native-community/cli-platform-ios': 12.3.6 '@react-native/assets-registry': 0.73.1 - '@react-native/codegen': 0.73.3(@babel/preset-env@7.24.3) - '@react-native/community-cli-plugin': 0.73.17(@babel/core@7.24.3)(@babel/preset-env@7.24.3) + '@react-native/codegen': 0.73.3(@babel/preset-env@7.24.4) + '@react-native/community-cli-plugin': 0.73.17(@babel/core@7.24.4)(@babel/preset-env@7.24.4) '@react-native/gradle-plugin': 0.73.4 '@react-native/js-polyfills': 0.73.1 '@react-native/normalize-colors': 0.73.2 @@ -10078,8 +13700,8 @@ packages: jest-environment-node: 29.7.0 jsc-android: 250231.0.0 memoize-one: 5.2.1 - metro-runtime: 0.80.7 - metro-source-map: 0.80.7 + metro-runtime: 0.80.8 + metro-source-map: 0.80.8 mkdirp: 0.5.6 nullthrows: 1.1.1 pretty-format: 26.6.2 @@ -10145,6 +13767,23 @@ packages: dependencies: loose-envify: 1.4.0 + /read-pkg-up@1.0.1: + resolution: {integrity: sha512-WD9MTlNtI55IwYUS27iHh9tK3YoIVhxis8yKhLpTqWtml739uXc9NWTpxoHkfZf3+DkCCsXox94/VWZniuZm6A==} + engines: {node: '>=0.10.0'} + dependencies: + find-up: 1.1.2 + read-pkg: 1.1.0 + dev: true + + /read-pkg@1.1.0: + resolution: {integrity: sha512-7BGwRHqt4s/uVbuyoeejRn4YmFnYZiFl4AuaeXHlgZf3sONF0SOGlxs2Pw8g6hCKupo08RafIO5YXFNOKTfwsQ==} + engines: {node: '>=0.10.0'} + dependencies: + load-json-file: 1.1.0 + normalize-package-data: 2.5.0 + path-type: 1.1.0 + dev: true + /readable-stream@2.3.3: resolution: {integrity: sha512-m+qzzcn7KUxEmd1gMbchF+Y2eIUbieUaxkWtptyHywrX0rE8QEYqPC07Vuy4Wm32/xE16NcdBctb8S0Xe/5IeQ==} dependencies: @@ -10167,7 +13806,6 @@ packages: safe-buffer: 5.1.2 string_decoder: 1.1.1 util-deprecate: 1.0.2 - dev: false /readable-stream@3.6.2: resolution: {integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==} @@ -10176,7 +13814,6 @@ packages: inherits: 2.0.4 string_decoder: 1.3.0 util-deprecate: 1.0.2 - dev: false /readdirp@3.6.0: resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} @@ -10203,6 +13840,20 @@ packages: tslib: 2.6.2 dev: false + /rechoir@0.6.2: + resolution: {integrity: sha512-HFM8rkZ+i3zrV+4LQjwQ0W+ez98pApMGM3HUrN04j3CqzPOzl9nmP15Y8YXNm8QHGv/eacOVEjqhmWpkRV0NAw==} + engines: {node: '>= 0.10'} + dependencies: + resolve: 1.22.8 + dev: true + + /recursive-readdir@2.2.3: + resolution: {integrity: sha512-8HrF5ZsXk5FAH9dgsx3BlUer73nIhuj+9OrQwEbLTPOBzGkL1lsFCR01am+v+0m2Cmbs1nP12hLDl5FA7EszKA==} + engines: {node: '>=6.0.0'} + dependencies: + minimatch: 3.1.2 + dev: true + /redent@3.0.0: resolution: {integrity: sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==} engines: {node: '>=8'} @@ -10211,13 +13862,18 @@ packages: strip-indent: 3.0.0 dev: true + /reduce-flatten@2.0.0: + resolution: {integrity: sha512-EJ4UNY/U1t2P/2k6oqotuX2Cc3T6nxJwsM0N0asT7dhrtH1ltUxDn4NalSYmPE2rCkVpcf/X6R0wDwcFpzhd4w==} + engines: {node: '>=6'} + dev: true + /reflect.getprototypeof@1.0.6: resolution: {integrity: sha512-fmfw4XgoDke3kdI6h4xcUz1dG8uaiv5q9gcEwLS4Pnth2kxT+GZ7YehS1JTMGBQmtV7Y4GFGbs2re2NqhdozUg==} engines: {node: '>= 0.4'} dependencies: call-bind: 1.0.7 define-properties: 1.2.1 - es-abstract: 1.23.2 + es-abstract: 1.23.3 es-errors: 1.3.0 get-intrinsic: 1.2.4 globalthis: 1.0.3 @@ -10245,7 +13901,7 @@ packages: /regenerator-transform@0.15.2: resolution: {integrity: sha512-hfMp2BoF0qOk3uc5V20ALGDS2ddjQaLrdl7xrGXvAIow7qeWRM2VA2HuCHkUKk9slq3VwEwLNK3DFBqDfPGYtg==} dependencies: - '@babel/runtime': 7.24.1 + '@babel/runtime': 7.24.4 dev: false /regexp.prototype.flags@1.5.2: @@ -10277,10 +13933,64 @@ packages: jsesc: 0.5.0 dev: false + /req-cwd@2.0.0: + resolution: {integrity: sha512-ueoIoLo1OfB6b05COxAA9UpeoscNpYyM+BqYlA7H6LVF4hKGPXQQSSaD2YmvDVJMkk4UDpAHIeU1zG53IqjvlQ==} + engines: {node: '>=4'} + dependencies: + req-from: 2.0.0 + dev: true + + /req-from@2.0.0: + resolution: {integrity: sha512-LzTfEVDVQHBRfjOUMgNBA+V6DWsSnoeKzf42J7l0xa/B4jyPOuuF5MlNSmomLNGemWTnV2TIdjSSLnEn95fOQA==} + engines: {node: '>=4'} + dependencies: + resolve-from: 3.0.0 + dev: true + + /request@2.88.2: + resolution: {integrity: sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==} + engines: {node: '>= 6'} + deprecated: request has been deprecated, see https://github.com/request/request/issues/3142 + dependencies: + aws-sign2: 0.7.0 + aws4: 1.12.0 + caseless: 0.12.0 + combined-stream: 1.0.8 + extend: 3.0.2 + forever-agent: 0.6.1 + form-data: 2.3.3 + har-validator: 5.1.5 + http-signature: 1.2.0 + is-typedarray: 1.0.0 + isstream: 0.1.2 + json-stringify-safe: 5.0.1 + mime-types: 2.1.35 + oauth-sign: 0.9.0 + performance-now: 2.1.0 + qs: 6.5.3 + safe-buffer: 5.2.1 + tough-cookie: 2.5.0 + tunnel-agent: 0.6.0 + uuid: 3.4.0 + dev: true + /require-directory@2.1.1: resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} engines: {node: '>=0.10.0'} - dev: false + + /require-from-string@1.2.1: + resolution: {integrity: sha512-H7AkJWMobeskkttHyhTVtS0fxpFLjxhbfMa6Bk3wimP7sdPRGL3EyCg3sAQenFfAe+xQ+oAc85Nmtvq0ROM83Q==} + engines: {node: '>=0.10.0'} + dev: true + + /require-from-string@2.0.2: + resolution: {integrity: sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==} + engines: {node: '>=0.10.0'} + dev: true + + /require-main-filename@1.0.1: + resolution: {integrity: sha512-IqSUtOVP4ksd1C/ej5zeEh/BIP2ajqpn8c5x+q99gvcIG/Qf0cud5raVnE/Dwd0ua9TXYDoDc0RE5hBSdz22Ug==} + dev: true /require-main-filename@2.0.0: resolution: {integrity: sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==} @@ -10294,10 +14004,13 @@ packages: resolution: {integrity: sha512-LwZrotdHOo12nQuZlHEmtuXdqGoOD0OhaxopaNFxWzInpEgaLWoVuAMbTzixuosCx2nEG58ngzW3vxdWoxIgdg==} dev: false + /resolve-alpn@1.2.1: + resolution: {integrity: sha512-0a1F4l73/ZFZOakJnQ3FvkJ2+gSTQWz/r2KE5OdDY0TxPm5h4GkqkWWfM47T7HsbnOtcJVEF4epCVy6u7Q3K+g==} + dev: true + /resolve-from@3.0.0: resolution: {integrity: sha512-GnlH6vxLymXJNMBo7XP1fJIzBFbdYt49CuTwmB/6N53t+kMPRMFKz783LlQ4tv28XoQfMWinAJX6WCGf2IlaIw==} engines: {node: '>=4'} - dev: false /resolve-from@4.0.0: resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} @@ -10307,6 +14020,16 @@ packages: resolution: {integrity: sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==} dev: true + /resolve@1.1.7: + resolution: {integrity: sha512-9znBF0vBcaSN3W2j7wKvdERPwqTxSpCq+if5C0WoTCyV9n24rua28jeuQ2pL/HOf+yUe/Mef+H/5p60K0Id3bg==} + dev: true + + /resolve@1.17.0: + resolution: {integrity: sha512-ic+7JYiV8Vi2yzQGFWOkiZD5Z9z7O2Zhm9XMaTxdJExKasieFCr+yXZ/WmXsckHiKl12ar0y6XiXDx3m4RHn1w==} + dependencies: + path-parse: 1.0.7 + dev: true + /resolve@1.22.8: resolution: {integrity: sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==} hasBin: true @@ -10324,6 +14047,12 @@ packages: supports-preserve-symlinks-flag: 1.0.0 dev: true + /responselike@2.0.1: + resolution: {integrity: sha512-4gl03wn3hj1HP3yzgdI7d3lCkF95F21Pz4BPGvKHinyQzALR5CapwC8yIi0Rh58DEMQ/SguC03wFj2k0M/mHhw==} + dependencies: + lowercase-keys: 2.0.0 + dev: true + /restore-cursor@3.1.0: resolution: {integrity: sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==} engines: {node: '>=8'} @@ -10344,12 +14073,38 @@ packages: glob: 7.2.3 dev: false + /rimraf@2.7.1: + resolution: {integrity: sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==} + hasBin: true + dependencies: + glob: 7.2.0 + dev: true + /rimraf@3.0.2: resolution: {integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==} hasBin: true dependencies: glob: 7.2.3 + /ripemd160-min@0.0.6: + resolution: {integrity: sha512-+GcJgQivhs6S9qvLogusiTcS9kQUfgR75whKuy5jIhuiOfQuJ8fjqxV6EGD5duH1Y/FawFUMtMhyeq3Fbnib8A==} + engines: {node: '>=8'} + dev: true + + /ripemd160@2.0.2: + resolution: {integrity: sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==} + dependencies: + hash-base: 3.1.0 + inherits: 2.0.4 + dev: true + + /rlp@2.2.7: + resolution: {integrity: sha512-d5gdPmgQ0Z+AklL2NVXr/IoSjNZFfTVvQWzL/AM2AOcSzYP2xjlb0AC8YyCLc41MSNf6P6QVtjgPdmVtzb+4lQ==} + hasBin: true + dependencies: + bn.js: 5.2.1 + dev: true + /rollup-plugin-visualizer@5.12.0: resolution: {integrity: sha512-8/NU9jXcHRs7Nnj07PF2o4gjxmm9lXIrZ8r175bT9dK8qoLlvKTwRMArRCMgpMGlq8CTLugRvEmyMeMXIU2pNQ==} engines: {node: '>=14'} @@ -10366,26 +14121,28 @@ packages: yargs: 17.7.2 dev: false - /rollup@4.13.0: - resolution: {integrity: sha512-3YegKemjoQnYKmsBlOHfMLVPPA5xLkQ8MHLLSw/fBrFaVkEayL51DilPpNNLq1exr98F2B1TzrV0FUlN3gWRPg==} + /rollup@4.14.1: + resolution: {integrity: sha512-4LnHSdd3QK2pa1J6dFbfm1HN0D7vSK/ZuZTsdyUAlA6Rr1yTouUTL13HaDOGJVgby461AhrNGBS7sCGXXtT+SA==} engines: {node: '>=18.0.0', npm: '>=8.0.0'} hasBin: true dependencies: '@types/estree': 1.0.5 optionalDependencies: - '@rollup/rollup-android-arm-eabi': 4.13.0 - '@rollup/rollup-android-arm64': 4.13.0 - '@rollup/rollup-darwin-arm64': 4.13.0 - '@rollup/rollup-darwin-x64': 4.13.0 - '@rollup/rollup-linux-arm-gnueabihf': 4.13.0 - '@rollup/rollup-linux-arm64-gnu': 4.13.0 - '@rollup/rollup-linux-arm64-musl': 4.13.0 - '@rollup/rollup-linux-riscv64-gnu': 4.13.0 - '@rollup/rollup-linux-x64-gnu': 4.13.0 - '@rollup/rollup-linux-x64-musl': 4.13.0 - '@rollup/rollup-win32-arm64-msvc': 4.13.0 - '@rollup/rollup-win32-ia32-msvc': 4.13.0 - '@rollup/rollup-win32-x64-msvc': 4.13.0 + '@rollup/rollup-android-arm-eabi': 4.14.1 + '@rollup/rollup-android-arm64': 4.14.1 + '@rollup/rollup-darwin-arm64': 4.14.1 + '@rollup/rollup-darwin-x64': 4.14.1 + '@rollup/rollup-linux-arm-gnueabihf': 4.14.1 + '@rollup/rollup-linux-arm64-gnu': 4.14.1 + '@rollup/rollup-linux-arm64-musl': 4.14.1 + '@rollup/rollup-linux-powerpc64le-gnu': 4.14.1 + '@rollup/rollup-linux-riscv64-gnu': 4.14.1 + '@rollup/rollup-linux-s390x-gnu': 4.14.1 + '@rollup/rollup-linux-x64-gnu': 4.14.1 + '@rollup/rollup-linux-x64-musl': 4.14.1 + '@rollup/rollup-win32-arm64-msvc': 4.14.1 + '@rollup/rollup-win32-ia32-msvc': 4.14.1 + '@rollup/rollup-win32-x64-msvc': 4.14.1 fsevents: 2.3.3 dev: true @@ -10411,11 +14168,9 @@ packages: /safe-buffer@5.1.2: resolution: {integrity: sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==} - dev: false /safe-buffer@5.2.1: resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} - dev: false /safe-regex-test@1.0.3: resolution: {integrity: sha512-CdASjNJPvRa7roO6Ra/gLYBTzYzzPyyBXxIMdGW3USQLyjWEls2RgW5UBTXaQVp+OrpeCK3bLem8smtmheoRuw==} @@ -10442,6 +14197,26 @@ packages: xmlchars: 2.2.0 dev: true + /sc-istanbul@0.4.6: + resolution: {integrity: sha512-qJFF/8tW/zJsbyfh/iT/ZM5QNHE3CXxtLJbZsL+CzdJLBsPD7SedJZoUA4d8iAcN2IoMp/Dx80shOOd2x96X/g==} + hasBin: true + dependencies: + abbrev: 1.0.9 + async: 1.5.2 + escodegen: 1.8.1 + esprima: 2.7.3 + glob: 5.0.15 + handlebars: 4.7.8 + js-yaml: 3.14.1 + mkdirp: 0.5.6 + nopt: 3.0.6 + once: 1.4.0 + resolve: 1.1.7 + supports-color: 3.2.3 + which: 1.3.1 + wordwrap: 1.0.0 + dev: true + /scheduler@0.23.0: resolution: {integrity: sha512-CtuThmgHNg7zIZWAXi3AsyIzA3n4xx7aNyjwC2VJldO2LMVDhFK+63xGqq6CsJH4rTAt6/M+N4GhZiDYPx9eUw==} dependencies: @@ -10453,6 +14228,24 @@ packages: loose-envify: 1.4.0 dev: false + /scrypt-js@2.0.4: + resolution: {integrity: sha512-4KsaGcPnuhtCZQCxFxN3GVYIhKFPTdLd8PLC552XwbMndtD0cjRFAhDuuydXQ0h08ZfPgzqe6EKHozpuH74iDw==} + dev: true + + /scrypt-js@3.0.1: + resolution: {integrity: sha512-cdwTTnqPu0Hyvf5in5asVdZocVDTNRmR7XEcJuIzMjJeSHybHl7vpB66AzwTaIg6CLSbtjcxc8fqcySfnTkccA==} + dev: true + + /secp256k1@4.0.3: + resolution: {integrity: sha512-NLZVf+ROMxwtEj3Xa562qgv2BK5e2WNmXPiOdVIPLgs6lyTzMvBq0aWTYMI5XCP9jZMVKOcqZLw/Wc4vDkuxhA==} + engines: {node: '>=10.0.0'} + requiresBuild: true + dependencies: + elliptic: 6.5.5 + node-addon-api: 2.0.2 + node-gyp-build: 4.8.0 + dev: true + /secp256k1@5.0.0: resolution: {integrity: sha512-TKWX8xvoGHrxVdqbYeZM9w+izTF4b9z3NhSaDkdn81btvuh+ivbIMGT/zQvDtTFWhRlThpoz6LEYTr7n8A5GcA==} engines: {node: '>=14.0.0'} @@ -10466,7 +14259,6 @@ packages: /semver@5.7.2: resolution: {integrity: sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==} hasBin: true - dev: false /semver@6.3.1: resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} @@ -10498,13 +14290,25 @@ packages: statuses: 2.0.1 transitivePeerDependencies: - supports-color - dev: false + + /sentence-case@2.1.1: + resolution: {integrity: sha512-ENl7cYHaK/Ktwk5OTD+aDbQ3uC8IByu/6Bkg+HDv8Mm+XnBnppVNalcfJTNsp1ibstKh030/JKQQWglDvtKwEQ==} + dependencies: + no-case: 2.3.2 + upper-case-first: 1.1.2 + dev: true /serialize-error@2.1.0: resolution: {integrity: sha512-ghgmKt5o4Tly5yEG/UJp8qTd0AN7Xalw4XBtDEKP655B699qMEtra1WlXeE6WIvdEG481JvRxULKsInq/iNysw==} engines: {node: '>=0.10.0'} dev: false + /serialize-javascript@6.0.0: + resolution: {integrity: sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag==} + dependencies: + randombytes: 2.1.0 + dev: true + /serve-static@1.15.0: resolution: {integrity: sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==} engines: {node: '>= 0.8.0'} @@ -10515,24 +14319,25 @@ packages: send: 0.18.0 transitivePeerDependencies: - supports-color - dev: false + + /servify@0.1.12: + resolution: {integrity: sha512-/xE6GvsKKqyo1BAY+KxOWXcLpPsUUyji7Qg3bVD7hh1eRze5bR1uYiuDA/k3Gof1s9BTzQZEJK8sNcNGFIzeWw==} + engines: {node: '>=6'} + dependencies: + body-parser: 1.20.2 + cors: 2.8.5 + express: 4.19.2 + request: 2.88.2 + xhr: 2.6.0 + transitivePeerDependencies: + - supports-color + dev: true /set-blocking@2.0.0: resolution: {integrity: sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==} - dev: false - - /set-function-length@1.2.0: - resolution: {integrity: sha512-4DBHDoyHlM1IRPGYcoxexgh67y4ueR53FKV1yyxwFMY7aCqcN/38M1+SwZ/qJQ8iLv7+ck385ot4CcisOAPT9w==} - engines: {node: '>= 0.4'} - dependencies: - define-data-property: 1.1.1 - function-bind: 1.1.2 - get-intrinsic: 1.2.3 - gopd: 1.0.1 - has-property-descriptors: 1.0.1 - /set-function-length@1.2.1: - resolution: {integrity: sha512-j4t6ccc+VsKwYHso+kElc5neZpjtq9EnRICFZtWyBsLojhmeF/ZBd/elqm22WJh/BziDe/SBiOeAt0m2mfLD0g==} + /set-function-length@1.2.2: + resolution: {integrity: sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==} engines: {node: '>= 0.4'} dependencies: define-data-property: 1.1.4 @@ -10540,7 +14345,7 @@ packages: function-bind: 1.1.2 get-intrinsic: 1.2.4 gopd: 1.0.1 - has-property-descriptors: 1.0.1 + has-property-descriptors: 1.0.2 /set-function-name@2.0.2: resolution: {integrity: sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==} @@ -10552,9 +14357,16 @@ packages: has-property-descriptors: 1.0.2 dev: true + /setimmediate@1.0.4: + resolution: {integrity: sha512-/TjEmXQVEzdod/FFskf3o7oOAsGhHf2j1dZqRFbDzq4F3mvvxflIIi4Hd3bLQE9y/CpwqfSQam5JakI/mi3Pog==} + dev: true + + /setimmediate@1.0.5: + resolution: {integrity: sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==} + dev: true + /setprototypeof@1.2.0: resolution: {integrity: sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==} - dev: false /sha.js@2.4.11: resolution: {integrity: sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==} @@ -10562,7 +14374,19 @@ packages: dependencies: inherits: 2.0.4 safe-buffer: 5.2.1 - dev: false + + /sha1@1.1.1: + resolution: {integrity: sha512-dZBS6OrMjtgVkopB1Gmo4RQCDKiZsqcpAQpkV/aaj+FCrCg8r4I4qMkDPQjBgLIxlmu9k4nUbWq6ohXahOneYA==} + dependencies: + charenc: 0.0.2 + crypt: 0.0.2 + dev: true + + /sha3@2.1.4: + resolution: {integrity: sha512-S8cNxbyb0UGUM2VhRD4Poe5N58gJnJsLJ5vC7FYWGUmGhcsj4++WaIOBFVDxlG0W3To6xBuiRh+i0Qp2oNCOtg==} + dependencies: + buffer: 6.0.3 + dev: true /shallow-clone@3.0.1: resolution: {integrity: sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==} @@ -10589,6 +14413,16 @@ packages: resolution: {integrity: sha512-6j1W9l1iAs/4xYBI1SYOVZyFcCis9b4KCLQ8fgAGG07QvzaRLVVRQvAy85yNmmZSjYjg4MWh4gNvlPujU/5LpA==} dev: false + /shelljs@0.8.5: + resolution: {integrity: sha512-TiwcRcrkhHvbrZbnRcFYMLl30Dfov3HKqzp5tO5b4pt6G/SezKcYhmDg15zXVBswHmctSAQKznqNW2LO5tTDow==} + engines: {node: '>=4'} + hasBin: true + dependencies: + glob: 7.2.3 + interpret: 1.4.0 + rechoir: 0.6.2 + dev: true + /side-channel@1.0.6: resolution: {integrity: sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==} engines: {node: '>= 0.4'} @@ -10611,6 +14445,18 @@ packages: resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} engines: {node: '>=14'} + /simple-concat@1.0.1: + resolution: {integrity: sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==} + dev: true + + /simple-get@2.8.2: + resolution: {integrity: sha512-Ijd/rV5o+mSBBs4F/x9oDPtTx9Zb6X9brmnXvMW4J7IR15ngi9q5xxqWBKU744jTZiaXtxaPL7uHG6vtN8kUkw==} + dependencies: + decompress-response: 3.3.0 + once: 1.4.0 + simple-concat: 1.0.1 + dev: true + /sisteransi@1.0.5: resolution: {integrity: sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==} @@ -10618,6 +14464,11 @@ packages: resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==} engines: {node: '>=8'} + /slash@4.0.0: + resolution: {integrity: sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew==} + engines: {node: '>=12'} + dev: true + /slice-ansi@2.1.0: resolution: {integrity: sha512-Qu+VC3EwYLldKa1fCxuuvULvSJOKEgk9pi8dZeCVK7TqBfUNTH4sFkk4joj8afVSfAYgJoSOetjx9QWOJ5mYoQ==} engines: {node: '>=6'} @@ -10627,6 +14478,21 @@ packages: is-fullwidth-code-point: 2.0.0 dev: false + /slice-ansi@4.0.0: + resolution: {integrity: sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==} + engines: {node: '>=10'} + dependencies: + ansi-styles: 4.3.0 + astral-regex: 2.0.0 + is-fullwidth-code-point: 3.0.0 + dev: true + + /snake-case@2.1.0: + resolution: {integrity: sha512-FMR5YoPFwOLuh4rRz92dywJjyKYZNLpMn1R5ujVpIYkbA9p01fq8RMg0FkO4M+Yobt4MjHeLTJVm5xFFBHSV2Q==} + dependencies: + no-case: 2.3.2 + dev: true + /socket.io-client@4.7.5(bufferutil@4.0.8)(utf-8-validate@6.0.3): resolution: {integrity: sha512-sJ/tqHOCe7Z50JCBCXrsY3I2k03iOiUe+tj1OmKeD2lXPiGH/RUCdTZFoqVyN7l1MnpIzPrGtLcijffmeouNlQ==} engines: {node: '>=10.0.0'} @@ -10651,17 +14517,69 @@ packages: - supports-color dev: false + /solc@0.4.26: + resolution: {integrity: sha512-o+c6FpkiHd+HPjmjEVpQgH7fqZ14tJpXhho+/bQXlXbliLIS/xjXb42Vxh+qQY1WCSTMQ0+a5vR9vi0MfhU6mA==} + hasBin: true + dependencies: + fs-extra: 0.30.0 + memorystream: 0.3.1 + require-from-string: 1.2.1 + semver: 5.7.2 + yargs: 4.8.1 + dev: true + + /solc@0.7.3(debug@4.3.4): + resolution: {integrity: sha512-GAsWNAjGzIDg7VxzP6mPjdurby3IkGCjQcM8GFYZT6RyaoUZKmMU6Y7YwG+tFGhv7dwZ8rmR4iwFDrrD99JwqA==} + engines: {node: '>=8.0.0'} + hasBin: true + dependencies: + command-exists: 1.2.9 + commander: 3.0.2 + follow-redirects: 1.15.6(debug@4.3.4) + fs-extra: 0.30.0 + js-sha3: 0.8.0 + memorystream: 0.3.1 + require-from-string: 2.0.2 + semver: 5.7.2 + tmp: 0.0.33 + transitivePeerDependencies: + - debug + dev: true + + /solidity-coverage@0.8.12(hardhat@2.22.2): + resolution: {integrity: sha512-8cOB1PtjnjFRqOgwFiD8DaUsYJtVJ6+YdXQtSZDrLGf8cdhhh8xzTtGzVTGeBf15kTv0v7lYPJlV/az7zLEPJw==} + hasBin: true + peerDependencies: + hardhat: ^2.11.0 + dependencies: + '@ethersproject/abi': 5.7.0 + '@solidity-parser/parser': 0.18.0 + chalk: 2.4.2 + death: 1.1.0 + difflib: 0.2.4 + fs-extra: 8.1.0 + ghost-testrpc: 0.0.2 + global-modules: 2.0.0 + globby: 10.0.2 + hardhat: 2.22.2(ts-node@10.9.2)(typescript@5.4.4) + jsonschema: 1.4.1 + lodash: 4.17.21 + mocha: 10.4.0 + node-emoji: 1.11.0 + pify: 4.0.1 + recursive-readdir: 2.2.3 + sc-istanbul: 0.4.6 + semver: 7.6.0 + shelljs: 0.8.5 + web3-utils: 1.10.4 + dev: true + /sonic-boom@2.8.0: resolution: {integrity: sha512-kuonw1YOYYNOve5iHdSahXPOK49GqwA+LZhI6Wz/l0rP57iKyXXIHaRagOBHAPmGwJC6od2Z9zgvZ5loSgMlVg==} dependencies: atomic-sleep: 1.0.0 dev: false - /source-map-js@1.1.0: - resolution: {integrity: sha512-9vC2SfsJzlej6MAaMPLu8HiBSHGdRAJ9hVFYN1ibZoNkeanmDmLUcIrj6G9DGL7XMJ54AKg/G75akXl1/izTOw==} - engines: {node: '>=0.10.0'} - dev: true - /source-map-js@1.2.0: resolution: {integrity: sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg==} engines: {node: '>=0.10.0'} @@ -10671,7 +14589,15 @@ packages: dependencies: buffer-from: 1.1.2 source-map: 0.6.1 - dev: false + + /source-map@0.2.0: + resolution: {integrity: sha512-CBdZ2oa/BHhS4xj5DlhjWNHcan57/5YuvfdLf17iVmIpd9KRm+DFLmC6nBNj+6Ua7Kt3TmOjDpQT1aTYOQtoUA==} + engines: {node: '>=0.8.0'} + requiresBuild: true + dependencies: + amdefine: 1.0.1 + dev: true + optional: true /source-map@0.5.7: resolution: {integrity: sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==} @@ -10681,13 +14607,34 @@ packages: /source-map@0.6.1: resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} engines: {node: '>=0.10.0'} - dev: false /source-map@0.7.4: resolution: {integrity: sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==} engines: {node: '>= 8'} dev: false + /spdx-correct@3.2.0: + resolution: {integrity: sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==} + dependencies: + spdx-expression-parse: 3.0.1 + spdx-license-ids: 3.0.17 + dev: true + + /spdx-exceptions@2.5.0: + resolution: {integrity: sha512-PiU42r+xO4UbUS1buo3LPJkjlO7430Xn5SVAhdpzzsPHsjbYVflnnFdATgabnLude+Cqu25p6N+g2lw/PFsa4w==} + dev: true + + /spdx-expression-parse@3.0.1: + resolution: {integrity: sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==} + dependencies: + spdx-exceptions: 2.5.0 + spdx-license-ids: 3.0.17 + dev: true + + /spdx-license-ids@3.0.17: + resolution: {integrity: sha512-sh8PWc/ftMqAAdFiBu6Fy6JUOYjqDJBJvIhpfDMyHrr0Rbp5liZqd4TjtQ/RgfLjKFZb+LMx5hpml5qOWy0qvg==} + dev: true + /split-on-first@1.1.0: resolution: {integrity: sha512-43ZssAJaMusuKWL8sKUBQXHWOpq8d6CfN/u1p4gUzfJkM05C8rxTmYrkIPTXapZpORA6LkkzcUulJ8FqA7Uudw==} engines: {node: '>=6'} @@ -10698,9 +14645,31 @@ packages: engines: {node: '>= 10.x'} dev: false + /split@0.3.3: + resolution: {integrity: sha512-wD2AeVmxXRBoX44wAycgjVpMhvbwdI2aZjCkvfNcH1YqHQvJVa1duWc73OyVGJUc05fhFaTZeQ/PYsrmyH0JVA==} + dependencies: + through: 2.3.8 + dev: true + /sprintf-js@1.0.3: resolution: {integrity: sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==} + /sshpk@1.18.0: + resolution: {integrity: sha512-2p2KJZTSqQ/I3+HX42EpYOa2l3f8Erv8MWKsy2I9uf4wA7yFIkXRffYdsx86y6z4vHtV8u7g+pPlr8/4ouAxsQ==} + engines: {node: '>=0.10.0'} + hasBin: true + dependencies: + asn1: 0.2.6 + assert-plus: 1.0.0 + bcrypt-pbkdf: 1.0.2 + dashdash: 1.14.1 + ecc-jsbn: 0.1.2 + getpass: 0.1.7 + jsbn: 0.1.1 + safer-buffer: 2.1.2 + tweetnacl: 0.14.5 + dev: true + /stack-utils@2.0.6: resolution: {integrity: sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==} engines: {node: '>=10'} @@ -10721,7 +14690,6 @@ packages: engines: {node: '>=6'} dependencies: type-fest: 0.7.1 - dev: false /statuses@1.5.0: resolution: {integrity: sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==} @@ -10731,7 +14699,6 @@ packages: /statuses@2.0.1: resolution: {integrity: sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==} engines: {node: '>= 0.8'} - dev: false /std-env@3.7.0: resolution: {integrity: sha512-JPbdCEQLj1w5GilpiHAx3qJvFndqybBysA3qUOnznweH4QbNYUsW/ea8QzSrnh0vNsezMMw5bcVool8lM0gwzg==} @@ -10743,6 +14710,12 @@ packages: internal-slot: 1.0.7 dev: true + /stream-combiner@0.0.4: + resolution: {integrity: sha512-rT00SPnTVyRsaSz5zgSPma/aHSOic5U1prhYdRy5HS2kTZviFpmDgzilbtsJsxiroqACmayynDN/9VzIbX5DOw==} + dependencies: + duplexer: 0.1.2 + dev: true + /stream-shift@1.0.3: resolution: {integrity: sha512-76ORR0DO1o1hlKwTbi/DM3EXWGf3ZJYO8cXX5RJwnul2DEg2oyoZyjLNoQM8WsvZiFKCRfC1O0J7iCvie3RZmQ==} dev: false @@ -10752,11 +14725,37 @@ packages: engines: {node: '>=10.0.0'} dev: false + /strict-uri-encode@1.1.0: + resolution: {integrity: sha512-R3f198pcvnB+5IpnBlRkphuE9n46WyVl8I39W/ZUTZLz4nqSP/oLYUrcnJrw462Ds8he4YKMov2efsTIw1BDGQ==} + engines: {node: '>=0.10.0'} + dev: true + /strict-uri-encode@2.0.0: resolution: {integrity: sha512-QwiXZgpRcKkhTj2Scnn++4PKtWsH0kpzZ62L2R6c/LUVYv7hVnZqcg2+sMuT6R7Jusu1vviK/MFsu6kNJfWlEQ==} engines: {node: '>=4'} dev: false + /string-format@2.0.0: + resolution: {integrity: sha512-bbEs3scLeYNXLecRRuk6uJxdXUSj6le/8rNPHChIJTn2V79aXVTR1EH2OH5zLKKoz0V02fOUKZZcw01pLUShZA==} + dev: true + + /string-width@1.0.2: + resolution: {integrity: sha512-0XsVpQLnVCXHJfyEs8tC0zpTVIr5PKKsQtkT29IwupnPTjtPmQ3xT/4yCREF9hYkV/3M3kzcUTSAZT6a6h81tw==} + engines: {node: '>=0.10.0'} + dependencies: + code-point-at: 1.1.0 + is-fullwidth-code-point: 1.0.0 + strip-ansi: 3.0.1 + dev: true + + /string-width@2.1.1: + resolution: {integrity: sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==} + engines: {node: '>=4'} + dependencies: + is-fullwidth-code-point: 2.0.0 + strip-ansi: 4.0.0 + dev: true + /string-width@4.2.3: resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} engines: {node: '>=8'} @@ -10780,7 +14779,7 @@ packages: dependencies: call-bind: 1.0.7 define-properties: 1.2.1 - es-abstract: 1.23.2 + es-abstract: 1.23.3 es-errors: 1.3.0 es-object-atoms: 1.0.0 get-intrinsic: 1.2.4 @@ -10798,7 +14797,7 @@ packages: dependencies: call-bind: 1.0.7 define-properties: 1.2.1 - es-abstract: 1.23.2 + es-abstract: 1.23.3 es-object-atoms: 1.0.0 dev: true @@ -10810,12 +14809,13 @@ packages: es-object-atoms: 1.0.0 dev: true - /string.prototype.trimstart@1.0.7: - resolution: {integrity: sha512-NGhtDFu3jCEm7B4Fy0DpLewdJQOZcQ0rGbwQ/+stjnrp2i+rlKeCvos9hOIeCmqwratM47OBxY7uFZzjxHXmrg==} + /string.prototype.trimstart@1.0.8: + resolution: {integrity: sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==} + engines: {node: '>= 0.4'} dependencies: call-bind: 1.0.7 define-properties: 1.2.1 - es-abstract: 1.23.2 + es-object-atoms: 1.0.0 dev: true /string_decoder@1.0.3: @@ -10828,13 +14828,25 @@ packages: resolution: {integrity: sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==} dependencies: safe-buffer: 5.1.2 - dev: false /string_decoder@1.3.0: resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==} dependencies: safe-buffer: 5.2.1 - dev: false + + /strip-ansi@3.0.1: + resolution: {integrity: sha512-VhumSSbBqDTP8p2ZLKj40UjBCV4+v8bUSEpUb4KjRgWk9pbqGF4REFj6KEagidb2f/M6AzC0EmFyDNGaw9OCzg==} + engines: {node: '>=0.10.0'} + dependencies: + ansi-regex: 2.1.1 + dev: true + + /strip-ansi@4.0.0: + resolution: {integrity: sha512-4XaJ2zQdCzROZDivEVIDPkcQn8LMFSa8kj8Gxb/Lnwzv9A8VctNZ+lfivC/sV3ivW8ElJTERXZoPBRrZKkNKow==} + engines: {node: '>=4'} + dependencies: + ansi-regex: 3.0.1 + dev: true /strip-ansi@5.2.0: resolution: {integrity: sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==} @@ -10856,6 +14868,13 @@ packages: ansi-regex: 6.0.1 dev: true + /strip-bom@2.0.0: + resolution: {integrity: sha512-kwrX1y7czp1E69n2ajbG65mIo9dqvJ+8aBQXOGVxqwvNbsXdFM6Lq37dLAY3mknUwru8CfcCbfOLL/gMo+fi3g==} + engines: {node: '>=0.10.0'} + dependencies: + is-utf8: 0.2.1 + dev: true + /strip-bom@3.0.0: resolution: {integrity: sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==} engines: {node: '>=4'} @@ -10870,6 +14889,18 @@ packages: resolution: {integrity: sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==} engines: {node: '>=12'} + /strip-hex-prefix@1.0.0: + resolution: {integrity: sha512-q8d4ue7JGEiVcypji1bALTos+0pWtyGlivAWyPuTkHzuTCJqrK9sWxYQZUq6Nq3cuyv3bm734IhHvHtGGURU6A==} + engines: {node: '>=6.5.0', npm: '>=3'} + dependencies: + is-hex-prefixed: 1.0.0 + dev: true + + /strip-indent@2.0.0: + resolution: {integrity: sha512-RsSNPLpq6YUL7QYy44RnPVTn/lcVZtb48Uof3X5JLbF4zD/Gs7ZFDv2HWol+leoQN2mT86LAzSshGfkTlSOpsA==} + engines: {node: '>=4'} + dev: true + /strip-indent@3.0.0: resolution: {integrity: sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==} engines: {node: '>=8'} @@ -10882,10 +14913,10 @@ packages: engines: {node: '>=8'} dev: true - /strip-literal@2.0.0: - resolution: {integrity: sha512-f9vHgsCWBq2ugHAkGMiiYY+AYG0D/cbloKKg0nhaaaSNsujdGIpVXCNsrJpCKr5M0f4aI31mr13UjY6GAuXCKA==} + /strip-literal@2.1.0: + resolution: {integrity: sha512-Op+UycaUt/8FbN/Z2TWPBLge3jWrP3xj10f3fnYxf052bKuS3EKs1ZQcVGjnEMdsNVAM+plXRdmjrZ/KgG3Skw==} dependencies: - js-tokens: 8.0.3 + js-tokens: 9.0.0 dev: true /strnum@1.0.5: @@ -10899,7 +14930,7 @@ packages: tslib: 2.6.2 dev: false - /styled-components@5.3.11(@babel/core@7.24.3)(react-dom@18.2.0)(react-is@18.2.0)(react@18.2.0): + /styled-components@5.3.11(@babel/core@7.24.4)(react-dom@18.2.0)(react-is@18.2.0)(react@18.2.0): resolution: {integrity: sha512-uuzIIfnVkagcVHv9nE0VPlHPSCmXIUGKfJ42LNjxCCTDTL5sgnJ8Z7GZBq0EnLYGln77tPpEpExt2+qa+cZqSw==} engines: {node: '>=10'} peerDependencies: @@ -10907,12 +14938,12 @@ packages: react-dom: '>= 16.8.0' react-is: '>= 16.8.0' dependencies: - '@babel/helper-module-imports': 7.22.15 - '@babel/traverse': 7.24.0(supports-color@5.5.0) + '@babel/helper-module-imports': 7.24.3 + '@babel/traverse': 7.24.1(supports-color@5.5.0) '@emotion/is-prop-valid': 1.2.2 '@emotion/stylis': 0.8.5 '@emotion/unitless': 0.7.5 - babel-plugin-styled-components: 2.1.4(@babel/core@7.24.3)(styled-components@5.3.11) + babel-plugin-styled-components: 2.1.4(@babel/core@7.24.4)(styled-components@5.3.11) css-to-react-native: 3.2.0 hoist-non-react-statics: 3.3.2 react: 18.2.0 @@ -10924,7 +14955,7 @@ packages: - '@babel/core' dev: false - /styled-jsx@5.1.1(@babel/core@7.24.3)(react@18.2.0): + /styled-jsx@5.1.1(@babel/core@7.24.4)(react@18.2.0): resolution: {integrity: sha512-pW7uC1l4mBZ8ugbiZrcIsiIvVx1UmTfw7UkC3Um2tmfUq9Bhk8IiyEIPl6F8agHgjzku6j0xQEZbfA5uSgSaCw==} engines: {node: '>= 12.0.0'} peerDependencies: @@ -10937,7 +14968,7 @@ packages: babel-plugin-macros: optional: true dependencies: - '@babel/core': 7.24.3 + '@babel/core': 7.24.4 client-only: 0.0.1 react: 18.2.0 dev: false @@ -10955,6 +14986,13 @@ packages: engines: {node: '>=14.0.0'} dev: false + /supports-color@3.2.3: + resolution: {integrity: sha512-Jds2VIYDrlp5ui7t8abHN2bjAu4LV/q4N2KivFPpGH0lrka0BMq/33AmECUXlKPcHigkNaqfXRENFju+rlcy+A==} + engines: {node: '>=0.8.0'} + dependencies: + has-flag: 1.0.0 + dev: true + /supports-color@5.5.0: resolution: {integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==} engines: {node: '>=4'} @@ -10972,16 +15010,57 @@ packages: engines: {node: '>=10'} dependencies: has-flag: 4.0.0 - dev: false /supports-preserve-symlinks-flag@1.0.0: resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} engines: {node: '>= 0.4'} + /swap-case@1.1.2: + resolution: {integrity: sha512-BAmWG6/bx8syfc6qXPprof3Mn5vQgf5dwdUNJhsNqU9WdPt5P+ES/wQ5bxfijy8zwZgZZHslC3iAsxsuQMCzJQ==} + dependencies: + lower-case: 1.1.4 + upper-case: 1.1.3 + dev: true + + /swarm-js@0.1.42: + resolution: {integrity: sha512-BV7c/dVlA3R6ya1lMlSSNPLYrntt0LUq4YMgy3iwpCIc6rZnS5W2wUoctarZ5pXlpKtxDDf9hNziEkcfrxdhqQ==} + dependencies: + bluebird: 3.7.2 + buffer: 5.7.1 + eth-lib: 0.1.29 + fs-extra: 4.0.3 + got: 11.8.6 + mime-types: 2.1.35 + mkdirp-promise: 5.0.1 + mock-fs: 4.14.0 + setimmediate: 1.0.5 + tar: 4.4.19 + xhr-request: 1.1.0 + transitivePeerDependencies: + - bufferutil + - supports-color + - utf-8-validate + dev: true + /symbol-tree@3.2.4: resolution: {integrity: sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==} dev: true + /sync-request@6.1.0: + resolution: {integrity: sha512-8fjNkrNlNCrVc/av+Jn+xxqfCjYaBoHqCsDz6mt030UMxJGr+GSfCV1dQt2gRtlL63+VPidwDVLr7V2OcTSdRw==} + engines: {node: '>=8.0.0'} + dependencies: + http-response-object: 3.0.2 + sync-rpc: 1.3.6 + then-request: 6.0.2 + dev: true + + /sync-rpc@1.3.6: + resolution: {integrity: sha512-J8jTXuZzRlvU7HemDgHi3pGnh/rkoqR/OZSjhTyyZrEkkYQbk7Z33AXp37mkPfPpfdOuj7Ex3H/TJM1z48uPQw==} + dependencies: + get-port: 3.2.0 + dev: true + /system-architecture@0.1.0: resolution: {integrity: sha512-ulAk51I9UVUyJgxlv9M6lFot2WP3e7t8Kz9+IS6D4rVba1tR9kON+Ey69f+1R4Q8cd45Lod6a4IcJIxnzGc/zA==} engines: {node: '>=18'} @@ -10991,11 +15070,45 @@ packages: resolution: {integrity: sha512-Cat63mxsVJlzYvN51JmVXIgNoUokrIaT2zLclCXjRd8boZ0004U4KCs/sToJ75C6sdlByWxpYnb5Boif1VSFew==} dev: false + /table-layout@1.0.2: + resolution: {integrity: sha512-qd/R7n5rQTRFi+Zf2sk5XVVd9UQl6ZkduPFC3S7WEGJAmetDTjY3qPN50eSKzwuzEyQKy5TN2TiZdkIjos2L6A==} + engines: {node: '>=8.0.0'} + dependencies: + array-back: 4.0.2 + deep-extend: 0.6.0 + typical: 5.2.0 + wordwrapjs: 4.0.1 + dev: true + + /table@6.8.2: + resolution: {integrity: sha512-w2sfv80nrAh2VCbqR5AK27wswXhqcck2AhfnNW76beQXskGZ1V12GwS//yYVa3d3fcvAip2OUnbDAjW2k3v9fA==} + engines: {node: '>=10.0.0'} + dependencies: + ajv: 8.12.0 + lodash.truncate: 4.4.2 + slice-ansi: 4.0.0 + string-width: 4.2.3 + strip-ansi: 6.0.1 + dev: true + /tapable@2.2.1: resolution: {integrity: sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==} engines: {node: '>=6'} dev: true + /tar@4.4.19: + resolution: {integrity: sha512-a20gEsvHnWe0ygBY8JbxoM4w3SJdhc7ZAuxkLqh+nvNQN2IOt0B5lLgM490X5Hl8FF0dl0tOf2ewFYAlIFgzVA==} + engines: {node: '>=4.5'} + dependencies: + chownr: 1.1.4 + fs-minipass: 1.2.7 + minipass: 2.9.0 + minizlib: 1.3.3 + mkdirp: 0.5.6 + safe-buffer: 5.2.1 + yallist: 3.1.1 + dev: true + /temp-dir@2.0.0: resolution: {integrity: sha512-aoBAniQmmwtcKp/7BzsH8Cxzv8OL736p7v1ihGb5e9DJ9kTwGWHrQrVB5+lfVDzfGrdRzXch+ig7LHaY1JTOrg==} engines: {node: '>=8'} @@ -11008,8 +15121,8 @@ packages: rimraf: 2.6.3 dev: false - /terser@5.29.2: - resolution: {integrity: sha512-ZiGkhUBIM+7LwkNjXYJq8svgkd+QK3UUr0wJqY4MieaezBSAIPgbSPZyIx0idM6XWK5CMzSWa8MJIzmRcB8Caw==} + /terser@5.30.3: + resolution: {integrity: sha512-STdUgOUx8rLbMGO9IOwHLpCqolkDITFFQSMYYwKE1N2lY6MVSaeoi10z/EhWxRc6ybqoVmKSkhKYH/XUpl7vSA==} engines: {node: '>=10'} hasBin: true dependencies: @@ -11019,10 +15132,32 @@ packages: source-map-support: 0.5.21 dev: false + /testrpc@0.0.1: + resolution: {integrity: sha512-afH1hO+SQ/VPlmaLUFj2636QMeDvPCeQMc/9RBMW0IfjNe9gFD9Ra3ShqYkB7py0do1ZcCna/9acHyzTJ+GcNA==} + deprecated: testrpc has been renamed to ganache-cli, please use this package from now on. + dev: true + /text-table@0.2.0: resolution: {integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==} dev: true + /then-request@6.0.2: + resolution: {integrity: sha512-3ZBiG7JvP3wbDzA9iNY5zJQcHL4jn/0BWtXIkagfz7QgOL/LqjCEOBQuJNZfu0XYnv5JhKh+cDxCPM4ILrqruA==} + engines: {node: '>=6.0.0'} + dependencies: + '@types/concat-stream': 1.6.1 + '@types/form-data': 0.0.33 + '@types/node': 8.10.66 + '@types/qs': 6.9.14 + caseless: 0.12.0 + concat-stream: 1.6.2 + form-data: 2.5.1 + http-basic: 8.1.3 + http-response-object: 3.0.2 + promise: 8.3.0 + qs: 6.12.0 + dev: true + /thread-stream@0.15.2: resolution: {integrity: sha512-UkEhKIg2pD+fjkHQKyJO3yoIvAP3N6RlNFt2dUhcS1FGvCD1cQa1M/PGknCLFIyZdtJOWQjejp7bdNqmN7zwdA==} dependencies: @@ -11040,12 +15175,21 @@ packages: xtend: 4.0.2 dev: false + /through@2.3.8: + resolution: {integrity: sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==} + dev: true + + /timed-out@4.0.1: + resolution: {integrity: sha512-G7r3AhovYtr5YKOWQkta8RKAPb+J9IsO4uVmzjl8AZwfhs8UcUwTiD6gcJYSgOtzyjvQKrKYn41syHbUWMkafA==} + engines: {node: '>=0.10.0'} + dev: true + /tinybench@2.6.0: resolution: {integrity: sha512-N8hW3PG/3aOoZAN5V/NSAEDz0ZixDSSt5b/a05iqtpgfLWMSVuCo7w0k2vVvEjdrIoeGqZzweX2WlyioNIHchA==} dev: true - /tinypool@0.8.2: - resolution: {integrity: sha512-SUszKYe5wgsxnNOVlBYO6IC+8VGWdVGZWAqUxp3UErNBtptZvWbwyUOyzNL59zigz2rCA92QiL3wvG+JDSdJdQ==} + /tinypool@0.8.3: + resolution: {integrity: sha512-Ud7uepAklqRH1bvwy22ynrliC7Dljz7Tm8M/0RBUW+YRa4YHhZ6e4PpgE+fu1zr/WqB1kbeuVrdfeuyIBpy4tw==} engines: {node: '>=14.0.0'} dev: true @@ -11054,6 +15198,20 @@ packages: engines: {node: '>=14.0.0'} dev: true + /title-case@2.1.1: + resolution: {integrity: sha512-EkJoZ2O3zdCz3zJsYCsxyq2OC5hrxR9mfdd5I+w8h/tmFfeOxJ+vvkxsKxdmN0WtS9zLdHEgfgVOiMVgv+Po4Q==} + dependencies: + no-case: 2.3.2 + upper-case: 1.1.3 + dev: true + + /tmp@0.0.33: + resolution: {integrity: sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==} + engines: {node: '>=0.6.0'} + dependencies: + os-tmpdir: 1.0.2 + dev: true + /tmpl@1.0.5: resolution: {integrity: sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==} dev: false @@ -11071,7 +15229,14 @@ packages: /toidentifier@1.0.1: resolution: {integrity: sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==} engines: {node: '>=0.6'} - dev: false + + /tough-cookie@2.5.0: + resolution: {integrity: sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==} + engines: {node: '>=0.8'} + dependencies: + psl: 1.9.0 + punycode: 2.3.1 + dev: true /tough-cookie@4.1.3: resolution: {integrity: sha512-aX/y5pVRkfRnfmuX+OdbSdXvPe6ieKX/G2s7e98f4poJHnqH3281gDPm/metm6E/WRamfx7WC4HUqkWHfQHprw==} @@ -11085,7 +15250,6 @@ packages: /tr46@0.0.3: resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==} - dev: false /tr46@5.0.0: resolution: {integrity: sha512-tk2G5R2KRwBd+ZN0zaEXpmzdKyOYksXwywulIX95MBODjSzMIuQnQ3m8JxgbhnL1LeVo7lqQKsYa1O3Htl7K5g==} @@ -11094,16 +15258,34 @@ packages: punycode: 2.3.1 dev: true - /ts-api-utils@1.3.0(typescript@5.4.3): + /ts-api-utils@1.3.0(typescript@5.4.4): resolution: {integrity: sha512-UQMIo7pb8WRomKR1/+MFVLTroIvDVtMX3K6OUir8ynLyzB8Jeriont2bTAtmNPa1ekAgN7YPDyf6V+ygrdU+eQ==} engines: {node: '>=16'} peerDependencies: typescript: '>=4.2.0' dependencies: - typescript: 5.4.3 + typescript: 5.4.4 + dev: true + + /ts-command-line-args@2.5.1: + resolution: {integrity: sha512-H69ZwTw3rFHb5WYpQya40YAX2/w7Ut75uUECbgBIsLmM+BNuYnxsltfyyLMxy6sEeKxgijLTnQtLd0nKd6+IYw==} + hasBin: true + dependencies: + chalk: 4.1.2 + command-line-args: 5.2.1 + command-line-usage: 6.1.3 + string-format: 2.0.0 + dev: true + + /ts-essentials@7.0.3(typescript@5.4.4): + resolution: {integrity: sha512-8+gr5+lqO3G84KdiTSMRLtuyJ+nTBVRKuCrK4lidMPdVeEp0uqC875uE5NMcaA7YYMN7XsNiFQuMvasF8HT/xQ==} + peerDependencies: + typescript: '>=3.7.0' + dependencies: + typescript: 5.4.4 dev: true - /ts-evaluator@1.2.0(jsdom@24.0.0)(typescript@5.4.3): + /ts-evaluator@1.2.0(jsdom@24.0.0)(typescript@5.4.4): resolution: {integrity: sha512-ncSGek1p92bj2ifB7s9UBgryHCkU9vwC5d+Lplt12gT9DH+e41X8dMoHRQjIMeAvyG7j9dEnuHmwgOtuRIQL+Q==} engines: {node: '>=14.19.0'} peerDependencies: @@ -11117,7 +15299,7 @@ packages: crosspath: 2.0.0 jsdom: 24.0.0 object-path: 0.11.8 - typescript: 5.4.3 + typescript: 5.4.4 dev: true /ts-morph@21.0.1: @@ -11127,7 +15309,7 @@ packages: code-block-writer: 12.0.0 dev: true - /ts-node@10.9.2(@types/node@20.11.30)(typescript@5.4.3): + /ts-node@10.9.2(@types/node@20.12.5)(typescript@5.4.4): resolution: {integrity: sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ==} hasBin: true peerDependencies: @@ -11142,26 +15324,31 @@ packages: optional: true dependencies: '@cspotcode/source-map-support': 0.8.1 - '@tsconfig/node10': 1.0.9 + '@tsconfig/node10': 1.0.11 '@tsconfig/node12': 1.0.11 '@tsconfig/node14': 1.0.3 '@tsconfig/node16': 1.0.4 - '@types/node': 20.11.30 + '@types/node': 20.12.5 acorn: 8.11.3 acorn-walk: 8.3.2 arg: 4.1.3 create-require: 1.1.1 diff: 4.0.2 make-error: 1.3.6 - typescript: 5.4.3 + typescript: 5.4.4 v8-compile-cache-lib: 3.0.1 yn: 3.1.1 dev: true /ts-pattern@5.0.8: resolution: {integrity: sha512-aafbuAQOTEeWmA7wtcL94w6I89EgLD7F+IlWkr596wYxeb0oveWDO5dQpv85YP0CGbxXT/qXBIeV6IYLcoZ2uA==} + dev: true - /tsconfck@3.0.2(typescript@5.4.3): + /ts-pattern@5.1.1: + resolution: {integrity: sha512-i+owkHr5RYdQxj8olUgRrqpiWH9x27PuWVfXwDmJ/n/CoF/SAa7WW1i2oUpPDMQpJ4U+bGRUcZkVq7i1m3zFCg==} + dev: false + + /tsconfck@3.0.2(typescript@5.4.4): resolution: {integrity: sha512-6lWtFjwuhS3XI4HsX4Zg0izOI3FU/AI9EGVlPEUMDIhvLPMD4wkiof0WCoDgW7qY+Dy198g4d9miAqUHWHFH6Q==} engines: {node: ^18 || >=20} hasBin: true @@ -11171,7 +15358,7 @@ packages: typescript: optional: true dependencies: - typescript: 5.4.3 + typescript: 5.4.4 dev: true /tsconfig-paths@3.15.0: @@ -11185,12 +15372,51 @@ packages: /tslib@1.14.1: resolution: {integrity: sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==} - dev: false /tslib@2.6.2: resolution: {integrity: sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==} dev: false + /tsort@0.0.1: + resolution: {integrity: sha512-Tyrf5mxF8Ofs1tNoxA13lFeZ2Zrbd6cKbuH3V+MQ5sb6DtBj5FjrXVsRWT8YvNAQTqNoz66dz1WsbigI22aEnw==} + dev: true + + /tsx@4.7.2: + resolution: {integrity: sha512-BCNd4kz6fz12fyrgCTEdZHGJ9fWTGeUzXmQysh0RVocDY3h4frk05ZNCXSy4kIenF7y/QnrdiVpTsyNRn6vlAw==} + engines: {node: '>=18.0.0'} + hasBin: true + dependencies: + esbuild: 0.19.12 + get-tsconfig: 4.7.3 + optionalDependencies: + fsevents: 2.3.3 + dev: true + + /tunnel-agent@0.6.0: + resolution: {integrity: sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==} + dependencies: + safe-buffer: 5.2.1 + dev: true + + /tweetnacl-util@0.15.1: + resolution: {integrity: sha512-RKJBIj8lySrShN4w6i/BonWp2Z/uxwC3h4y7xsRrpP59ZboCd0GpEVsOnMDYLMmKBpYhb5TgHzZXy7wTfYFBRw==} + dev: true + + /tweetnacl@0.14.5: + resolution: {integrity: sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA==} + dev: true + + /tweetnacl@1.0.3: + resolution: {integrity: sha512-6rt+RN7aOi1nGMyC4Xa5DdYiukl2UWCbcJft7YhxReBGQD7OAM8Pbxw6YMo4r2diNEA8FEmu32YOn9rhaiE5yw==} + dev: true + + /type-check@0.3.2: + resolution: {integrity: sha512-ZCmOJdvOWDBYJlzAoFkC+Q0+bUyEOS1ltgp1MGU03fqHG+dbi9tBFU2Rd9QKiDZFAYrhPh2JUf7rZRIuHRKtOg==} + engines: {node: '>= 0.8.0'} + dependencies: + prelude-ls: 1.1.2 + dev: true + /type-check@0.4.0: resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} engines: {node: '>= 0.8.0'} @@ -11207,10 +15433,47 @@ packages: engines: {node: '>=10'} dev: true - /type-fest@0.7.1: + /type-fest@0.21.3: + resolution: {integrity: sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==} + engines: {node: '>=10'} + dev: true + + /type-fest@0.7.1: resolution: {integrity: sha512-Ne2YiiGN8bmrmJJEuTWTLJR32nh/JdL1+PSicowtNb0WFpn59GK8/lfD61bVtzguz7b3PBt74nxpv/Pw5po5Rg==} engines: {node: '>=8'} - dev: false + + /type-is@1.6.18: + resolution: {integrity: sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==} + engines: {node: '>= 0.6'} + dependencies: + media-typer: 0.3.0 + mime-types: 2.1.35 + dev: true + + /type@2.7.2: + resolution: {integrity: sha512-dzlvlNlt6AXU7EBSfpAscydQ7gXB+pPGsPnfJnZpiNJBDj7IaJzQlBZYGdEi4R9HmPdBv2XmWJ6YUtoTa7lmCw==} + dev: true + + /typechain@8.3.2(typescript@5.4.4): + resolution: {integrity: sha512-x/sQYr5w9K7yv3es7jo4KTX05CLxOf7TRWwoHlrjRh8H82G64g+k7VuWPJlgMo6qrjfCulOdfBjiaDtmhFYD/Q==} + hasBin: true + peerDependencies: + typescript: '>=4.3.0' + dependencies: + '@types/prettier': 2.7.3 + debug: 4.3.4(supports-color@5.5.0) + fs-extra: 7.0.1 + glob: 7.1.7 + js-sha3: 0.8.0 + lodash: 4.17.21 + mkdirp: 1.0.4 + prettier: 2.8.8 + ts-command-line-args: 2.5.1 + ts-essentials: 7.0.3(typescript@5.4.4) + typescript: 5.4.4 + transitivePeerDependencies: + - supports-color + dev: true /typed-array-buffer@1.0.2: resolution: {integrity: sha512-gEymJYKZtKXzzBzM4jqa9w6Q1Jjm7x2d+sh19AdsD4wqnMPDYyvwpsIc2Q/835kHuo3BEQ7CjelGhfTsoBb2MQ==} @@ -11244,8 +15507,8 @@ packages: is-typed-array: 1.1.13 dev: true - /typed-array-length@1.0.5: - resolution: {integrity: sha512-yMi0PlwuznKHxKmcpoOdeLwxBoVPkqZxd7q2FgMkmD3bNwvF5VW0+UlUQ1k1vmktTu4Yu13Q0RIxEP8+B+wloA==} + /typed-array-length@1.0.6: + resolution: {integrity: sha512-/OxDN6OtAk5KBpGb28T+HZc2M+ADtvRxXrKKbUwtsLgdoxgX13hyy7ek6bFRl5+aBs2yZzB0c4CnQfAtVypW/g==} engines: {node: '>= 0.4'} dependencies: call-bind: 1.0.7 @@ -11256,23 +15519,47 @@ packages: possible-typed-array-names: 1.0.0 dev: true + /typedarray-to-buffer@3.1.5: + resolution: {integrity: sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==} + dependencies: + is-typedarray: 1.0.0 + dev: true + + /typedarray@0.0.6: + resolution: {integrity: sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==} + dev: true + /typescript@5.3.3: resolution: {integrity: sha512-pXWcraxM0uxAS+tN0AG/BF2TyqmHO014Z070UsJ+pFvYuRSq8KH8DmWpnbXe0pEPDHXZV3FcAbJkijJ5oNEnWw==} engines: {node: '>=14.17'} hasBin: true dev: true - /typescript@5.4.3: - resolution: {integrity: sha512-KrPd3PKaCLr78MalgiwJnA25Nm8HAmdwN3mYUYZgG/wizIo9EainNVQI9/yDavtVFRN2h3k8uf3GLHuhDMgEHg==} + /typescript@5.4.4: + resolution: {integrity: sha512-dGE2Vv8cpVvw28v8HCPqyb08EzbBURxDpuhJvTrusShUfGnhHBafDsLdS1EhhxyL6BJQE+2cT3dDPAv+MQ6oLw==} engines: {node: '>=14.17'} hasBin: true - /ufo@1.5.2: - resolution: {integrity: sha512-eiutMaL0J2MKdhcOM1tUy13pIrYnyR87fEd8STJQFrrAwImwvlXkxlZEjaKah8r2viPohld08lt73QfLG1NxMg==} + /typical@4.0.0: + resolution: {integrity: sha512-VAH4IvQ7BDFYglMd7BPRDfLgxZZX4O4TFcRDA6EN5X7erNJJq+McIEp8np9aVtxrCJ6qx4GTYVfOWNjcqwZgRw==} + engines: {node: '>=8'} + dev: true + + /typical@5.2.0: + resolution: {integrity: sha512-dvdQgNDNJo+8B2uBQoqdb11eUCE1JQXhvjC/CZtgvZseVd5TYMXnq0+vuUemXbd/Se29cTaUuPX3YIc2xgbvIg==} + engines: {node: '>=8'} + dev: true /ufo@1.5.3: resolution: {integrity: sha512-Y7HYmWaFwPUmkoQCUIAYpKqkOf+SbVj/2fJJZ4RJMCfZp0rTGwRbzQD+HghfnhKOjL9E01okqz+ncJskGYfBNw==} - dev: false + + /uglify-js@3.17.4: + resolution: {integrity: sha512-T9q82TJI9e/C1TAxYvfb16xO120tMVFZrGA3f9/P4424DNu6ypK103y0GPFVa17yotwSyZW5iYXgjYHkGrJW/g==} + engines: {node: '>=0.8.0'} + hasBin: true + requiresBuild: true + dev: true + optional: true /uint8arrays@3.1.1: resolution: {integrity: sha512-+QJa8QRnbdXVpHYjLoTpJIdCTiw9Ir62nocClWuXIq2JIh4Uta0cQsTSpFL678p2CN8B+XSApwcU+pQEqVpKWg==} @@ -11280,6 +15567,10 @@ packages: multiformats: 9.9.0 dev: false + /ultron@1.1.1: + resolution: {integrity: sha512-UIEXBNeYmKptWH6z8ZnqTeS8fV74zG0/eRU9VGkpzz+LIJNs8W/zM/L+7ctCkRrgbNnnR0xxw4bKOr0cW0N0Og==} + dev: true + /unbox-primitive@1.0.2: resolution: {integrity: sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==} dependencies: @@ -11293,9 +15584,24 @@ packages: resolution: {integrity: sha512-Ql87qFHB3s/De2ClA9e0gsnS6zXG27SkTiSJwjCc9MebbfapQfuPzumMIUMi38ezPZVNFcHI9sUIepeQfw8J8Q==} dev: false + /underscore@1.13.6: + resolution: {integrity: sha512-+A5Sja4HP1M08MaXya7p5LvjuM7K6q/2EaC0+iovj/wOcMsTzMvDFbasi/oSapiwOlt252IqsKqPjCl7huKS0A==} + dev: true + /undici-types@5.26.5: resolution: {integrity: sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==} + /undici-types@5.28.4: + resolution: {integrity: sha512-3OeMF5Lyowe8VW0skf5qaIE7Or3yS9LS7fvMUI0gg4YxpIBVg0L8BxCmROw2CcYhSkpR68Epz7CGc8MPj94Uww==} + dev: true + + /undici@5.28.4: + resolution: {integrity: sha512-72RFADWFqKmUb2hmmvNODKL3p9hcB6Gt2DOQMis1SEBaV6a4MH8soBvzg+95CYhCKPFedut2JY9bMfrDl9D23g==} + engines: {node: '>=14.0'} + dependencies: + '@fastify/busboy': 2.1.1 + dev: true + /unenv@1.9.0: resolution: {integrity: sha512-QKnFNznRxmbOF1hDgzpqrlIf6NC5sbZ2OJ+5Wl3OX8uM+LUJXbj4TXvLJCtwbPTmbMHCLIz6JLKNinNsMShK9g==} dependencies: @@ -11336,7 +15642,6 @@ packages: /universalify@0.1.2: resolution: {integrity: sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==} engines: {node: '>= 4.0.0'} - dev: false /universalify@0.2.0: resolution: {integrity: sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg==} @@ -11351,7 +15656,6 @@ packages: /unpipe@1.0.0: resolution: {integrity: sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==} engines: {node: '>= 0.8'} - dev: false /unstorage@1.10.2(idb-keyval@6.2.1): resolution: {integrity: sha512-cULBcwDqrS8UhlIysUJs2Dk0Mmt8h7B0E6mtR+relW9nZvsf/u4SkAYyNliPiPW7XtFNb5u3IUMkxGxFTTRTgQ==} @@ -11431,6 +15735,16 @@ packages: escalade: 3.1.2 picocolors: 1.0.0 + /upper-case-first@1.1.2: + resolution: {integrity: sha512-wINKYvI3Db8dtjikdAqoBbZoP6Q+PZUyfMR7pmwHzjC2quzSkUq5DmPrTtPEqHaz8AGtmsB4TqwapMTM1QAQOQ==} + dependencies: + upper-case: 1.1.3 + dev: true + + /upper-case@1.1.3: + resolution: {integrity: sha512-WRbjgmYzgXkCV7zNVpy5YgrHgbBv126rMALQQMrmzOVC4GM2waQ9x7xtm8VU+1yF2kWyPzI9zbZ48n4vSxwfSA==} + dev: true + /uqr@0.1.2: resolution: {integrity: sha512-MJu7ypHq6QasgF5YRTjqscSzQp/W11zoUk6kvmlH+fmWEs63Y0Eib13hYFwAzagRJcVY8WVnlV+eBDUGMJ5IbA==} dev: false @@ -11448,6 +15762,10 @@ packages: requires-port: 1.0.0 dev: true + /url-set-query@1.0.0: + resolution: {integrity: sha512-3AChu4NiXquPfeckE5R5cGdiHCMWJx1dwCWOmWIL4KHAziJNOFIYJlpGFeKDvwLPHovZRCxK3cYlwzqI9Vp+Gg==} + dev: true + /use-sync-external-store@1.2.0(react@18.2.0): resolution: {integrity: sha512-eEgnFxGQ1Ife9bzYs6VLi8/4X6CObHMw9Qr9tPY43iKwsPw8xE8+EFsf/2cFZ5S3esXgpWgtSCtLNS41F+sKPA==} peerDependencies: @@ -11456,6 +15774,14 @@ packages: react: 18.2.0 dev: false + /utf-8-validate@5.0.10: + resolution: {integrity: sha512-Z6czzLq4u8fPOyx7TU6X3dvUZVvoJmxSQ+IcrlmagKhilxlhZgxPK6C5Jqbkw1IDUmFTM+cz9QDnnLTwDz/2gQ==} + engines: {node: '>=6.14.2'} + requiresBuild: true + dependencies: + node-gyp-build: 4.8.0 + dev: true + /utf-8-validate@6.0.3: resolution: {integrity: sha512-uIuGf9TWQ/y+0Lp+KGZCMuJWc3N9BHA+l/UmHd/oUHwJJDeysyTRxNQVkbzsIWfGFbRe3OcgML/i0mvVRPOyDA==} engines: {node: '>=6.14.2'} @@ -11464,6 +15790,10 @@ packages: node-gyp-build: 4.8.0 dev: false + /utf8@3.0.0: + resolution: {integrity: sha512-E8VjFIQ/TyQgp+TZfS6l8yp/xWppSAHzidGiRrqe4bK4XP9pTRyKFgGJpO3SN7zdX4DeomTrwaseCHovfpFcqQ==} + dev: true + /util-deprecate@1.0.2: resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} @@ -11475,28 +15805,42 @@ packages: is-generator-function: 1.0.10 is-typed-array: 1.1.13 which-typed-array: 1.1.15 - dev: false /utils-merge@1.0.1: resolution: {integrity: sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==} engines: {node: '>= 0.4.0'} - dev: false + + /uuid@2.0.1: + resolution: {integrity: sha512-nWg9+Oa3qD2CQzHIP4qKUqwNfzKn8P0LtFhotaCTFchsV7ZfDhAybeip/HZVeMIpZi9JgY1E3nUlwaCmZT1sEg==} + deprecated: Please upgrade to version 7 or higher. Older versions may use Math.random() in certain circumstances, which is known to be problematic. See https://v8.dev/blog/math-random for details. + dev: true + + /uuid@3.4.0: + resolution: {integrity: sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==} + deprecated: Please upgrade to version 7 or higher. Older versions may use Math.random() in certain circumstances, which is known to be problematic. See https://v8.dev/blog/math-random for details. + hasBin: true + dev: true /uuid@8.3.2: resolution: {integrity: sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==} hasBin: true - dev: false /uuid@9.0.1: resolution: {integrity: sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==} hasBin: true - dev: false /v8-compile-cache-lib@3.0.1: resolution: {integrity: sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==} dev: true - /valtio@1.11.2(@types/react@18.2.68)(react@18.2.0): + /validate-npm-package-license@3.0.4: + resolution: {integrity: sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==} + dependencies: + spdx-correct: 3.2.0 + spdx-expression-parse: 3.0.1 + dev: true + + /valtio@1.11.2(@types/react@18.2.75)(react@18.2.0): resolution: {integrity: sha512-1XfIxnUXzyswPAPXo1P3Pdx2mq/pIqZICkWN60Hby0d9Iqb+MEIpqgYVlbflvHdrp2YR/q3jyKWRPJJ100yxaw==} engines: {node: '>=12.20.0'} peerDependencies: @@ -11508,18 +15852,30 @@ packages: react: optional: true dependencies: - '@types/react': 18.2.68 + '@types/react': 18.2.75 proxy-compare: 2.5.1 react: 18.2.0 use-sync-external-store: 1.2.0(react@18.2.0) dev: false + /varint@5.0.2: + resolution: {integrity: sha512-lKxKYG6H03yCZUpAGOPOsMcGxd1RHCu1iKvEHYDPmTyq2HueGhD73ssNBqqQWfvYs04G9iUFRvmAVLW20Jw6ow==} + dev: true + /vary@1.1.2: resolution: {integrity: sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==} engines: {node: '>= 0.8'} - dev: false - /viem@1.21.4(typescript@5.4.3)(zod@3.22.4): + /verror@1.10.0: + resolution: {integrity: sha512-ZZKSmDAEFOijERBLkmYfJ+vmk3w+7hOLYDNkRCuRuMJGEmqYNCNLyBBFwWKVMhfwaEF3WOd0Zlw86U/WC/+nYw==} + engines: {'0': node >=0.6.0} + dependencies: + assert-plus: 1.0.0 + core-util-is: 1.0.2 + extsprintf: 1.3.0 + dev: true + + /viem@1.21.4(typescript@5.4.4)(zod@3.22.4): resolution: {integrity: sha512-BNVYdSaUjeS2zKQgPs+49e5JKocfo60Ib2yiXOWBT6LuVxY1I/6fFX3waEtpXvL1Xn4qu+BVitVtMh9lyThyhQ==} peerDependencies: typescript: '>=5.0.4' @@ -11532,9 +15888,9 @@ packages: '@noble/hashes': 1.3.2 '@scure/bip32': 1.3.2 '@scure/bip39': 1.2.1 - abitype: 0.9.8(typescript@5.4.3)(zod@3.22.4) + abitype: 0.9.8(typescript@5.4.4)(zod@3.22.4) isows: 1.0.3(ws@8.13.0) - typescript: 5.4.3 + typescript: 5.4.4 ws: 8.13.0 transitivePeerDependencies: - bufferutil @@ -11542,8 +15898,8 @@ packages: - zod dev: false - /viem@2.8.18(typescript@5.4.3)(zod@3.22.4): - resolution: {integrity: sha512-Kq3kwkKziJ8rQeLkmdbSLheHDnA+tx2EdLKLmQ3N4FVtjKYjBP9tPL1r+fI6KltVUM1TDOhIHOdslDSp57VMMg==} + /viem@2.9.13(typescript@5.4.4)(zod@3.22.4): + resolution: {integrity: sha512-TxNZOWFwr2Pc6CeY4tViFL2NRq9v86HofAPkhBgScP8DUn3EeSbQhmDXbjMZNkZvXoMqWVl0AZM81rEOlaKrbg==} peerDependencies: typescript: '>=5.0.4' peerDependenciesMeta: @@ -11555,9 +15911,9 @@ packages: '@noble/hashes': 1.3.2 '@scure/bip32': 1.3.2 '@scure/bip39': 1.2.1 - abitype: 1.0.0(typescript@5.4.3)(zod@3.22.4) + abitype: 1.0.0(typescript@5.4.4)(zod@3.22.4) isows: 1.0.3(ws@8.13.0) - typescript: 5.4.3 + typescript: 5.4.4 ws: 8.13.0 transitivePeerDependencies: - bufferutil @@ -11565,7 +15921,7 @@ packages: - zod dev: false - /vite-node@1.4.0(@types/node@20.11.30): + /vite-node@1.4.0(@types/node@20.12.5): resolution: {integrity: sha512-VZDAseqjrHgNd4Kh8icYHWzTKSCZMhia7GyHfhtzLW33fZlG9SwsB6CEhgyVOWkJfJ2pFLrp/Gj1FSfAiqH9Lw==} engines: {node: ^18.0.0 || >=20.0.0} hasBin: true @@ -11574,7 +15930,7 @@ packages: debug: 4.3.4(supports-color@5.5.0) pathe: 1.1.2 picocolors: 1.0.0 - vite: 5.1.6(@types/node@20.11.30) + vite: 5.2.8(@types/node@20.12.5) transitivePeerDependencies: - '@types/node' - less @@ -11586,8 +15942,8 @@ packages: - terser dev: true - /vite@5.1.6(@types/node@20.11.30): - resolution: {integrity: sha512-yYIAZs9nVfRJ/AiOLCA91zzhjsHUgMjB+EigzFb6W2XTLO8JixBCKCjvhKZaye+NKYHCrkv3Oh50dH9EdLU2RA==} + /vite@5.2.8(@types/node@20.12.5): + resolution: {integrity: sha512-OyZR+c1CE8yeHw5V5t59aXsUPPVTHMDjEZz8MgguLL/Q7NblxhZUlTu9xSPqlsUO/y+X7dlU05jdhvyycD55DA==} engines: {node: ^18.0.0 || >=20.0.0} hasBin: true peerDependencies: @@ -11614,15 +15970,15 @@ packages: terser: optional: true dependencies: - '@types/node': 20.11.30 - esbuild: 0.19.12 - postcss: 8.4.36 - rollup: 4.13.0 + '@types/node': 20.12.5 + esbuild: 0.20.2 + postcss: 8.4.38 + rollup: 4.14.1 optionalDependencies: fsevents: 2.3.3 dev: true - /vitest@1.4.0(@types/node@20.11.30)(jsdom@24.0.0): + /vitest@1.4.0(@types/node@20.12.5)(jsdom@24.0.0): resolution: {integrity: sha512-gujzn0g7fmwf83/WzrDTnncZt2UiXP41mHuFYFrdwaLRVQ6JYQEiME2IfEjU3vcFL3VKa75XhI3lFgn+hfVsQw==} engines: {node: ^18.0.0 || >=20.0.0} hasBin: true @@ -11647,7 +16003,7 @@ packages: jsdom: optional: true dependencies: - '@types/node': 20.11.30 + '@types/node': 20.12.5 '@vitest/expect': 1.4.0 '@vitest/runner': 1.4.0 '@vitest/snapshot': 1.4.0 @@ -11659,15 +16015,15 @@ packages: execa: 8.0.1 jsdom: 24.0.0 local-pkg: 0.5.0 - magic-string: 0.30.8 + magic-string: 0.30.9 pathe: 1.1.2 picocolors: 1.0.0 std-env: 3.7.0 - strip-literal: 2.0.0 + strip-literal: 2.1.0 tinybench: 2.6.0 - tinypool: 0.8.2 - vite: 5.1.6(@types/node@20.11.30) - vite-node: 1.4.0(@types/node@20.11.30) + tinypool: 0.8.3 + vite: 5.2.8(@types/node@20.12.5) + vite-node: 1.4.0(@types/node@20.12.5) why-is-node-running: 2.2.2 transitivePeerDependencies: - less @@ -11695,8 +16051,8 @@ packages: xml-name-validator: 5.0.0 dev: true - /wagmi@2.5.12(@tanstack/react-query@5.28.6)(@types/react@18.2.68)(react-dom@18.2.0)(react-native@0.73.6)(react@18.2.0)(typescript@5.4.3)(viem@2.8.18)(zod@3.22.4): - resolution: {integrity: sha512-n9XxiDgBUUzibZqFIdQI6/vKDjNlOTXH6mIHcuVO7ujYJuyw4aEjOJzDWivIGjVf2ygmb1aGryh2jx6W5KwjRw==} + /wagmi@2.5.19(@tanstack/react-query@5.29.0)(@types/react@18.2.75)(react-dom@18.2.0)(react-native@0.73.6)(react@18.2.0)(typescript@5.4.4)(viem@2.9.13)(zod@3.22.4): + resolution: {integrity: sha512-fy6s3qTuXpfrrghhoNXuV92yqOqJI7m/9iLIejHxEYxiddVDTR8BVdkt0BuBQZzoXSAutDkyIlJbtFcpX5dfrQ==} peerDependencies: '@tanstack/react-query': '>=5.0.0' react: '>=18' @@ -11706,13 +16062,13 @@ packages: typescript: optional: true dependencies: - '@tanstack/react-query': 5.28.6(react@18.2.0) - '@wagmi/connectors': 4.1.18(@types/react@18.2.68)(@wagmi/core@2.6.9)(react-dom@18.2.0)(react-native@0.73.6)(react@18.2.0)(typescript@5.4.3)(viem@2.8.18)(zod@3.22.4) - '@wagmi/core': 2.6.9(@types/react@18.2.68)(react@18.2.0)(typescript@5.4.3)(viem@2.8.18)(zod@3.22.4) + '@tanstack/react-query': 5.29.0(react@18.2.0) + '@wagmi/connectors': 4.1.25(@types/react@18.2.75)(@wagmi/core@2.6.16)(react-dom@18.2.0)(react-native@0.73.6)(react@18.2.0)(typescript@5.4.4)(viem@2.9.13)(zod@3.22.4) + '@wagmi/core': 2.6.16(@types/react@18.2.75)(react@18.2.0)(typescript@5.4.4)(viem@2.9.13)(zod@3.22.4) react: 18.2.0 - typescript: 5.4.3 + typescript: 5.4.4 use-sync-external-store: 1.2.0(react@18.2.0) - viem: 2.8.18(typescript@5.4.3)(zod@3.22.4) + viem: 2.9.13(typescript@5.4.4)(zod@3.22.4) transitivePeerDependencies: - '@azure/app-configuration' - '@azure/cosmos' @@ -11753,6 +16109,593 @@ packages: defaults: 1.0.4 dev: false + /web-streams-polyfill@3.3.3: + resolution: {integrity: sha512-d2JWLCivmZYTSIoge9MsgFCZrt571BikcWGYkjC1khllbTeDlGqZ2D8vD8E/lJa8WGWbb7Plm8/XJYV7IJHZZw==} + engines: {node: '>= 8'} + dev: true + + /web3-bzz@1.10.0: + resolution: {integrity: sha512-o9IR59io3pDUsXTsps5pO5hW1D5zBmg46iNc2t4j2DkaYHNdDLwk2IP9ukoM2wg47QILfPEJYzhTfkS/CcX0KA==} + engines: {node: '>=8.0.0'} + requiresBuild: true + dependencies: + '@types/node': 12.20.55 + got: 12.1.0 + swarm-js: 0.1.42 + transitivePeerDependencies: + - bufferutil + - supports-color + - utf-8-validate + dev: true + + /web3-bzz@1.10.4: + resolution: {integrity: sha512-ZZ/X4sJ0Uh2teU9lAGNS8EjveEppoHNQiKlOXAjedsrdWuaMErBPdLQjXfcrYvN6WM6Su9PMsAxf3FXXZ+HwQw==} + engines: {node: '>=8.0.0'} + requiresBuild: true + dependencies: + '@types/node': 12.20.55 + got: 12.1.0 + swarm-js: 0.1.42 + transitivePeerDependencies: + - bufferutil + - supports-color + - utf-8-validate + dev: true + + /web3-core-helpers@1.10.0: + resolution: {integrity: sha512-pIxAzFDS5vnbXvfvLSpaA1tfRykAe9adw43YCKsEYQwH0gCLL0kMLkaCX3q+Q8EVmAh+e1jWL/nl9U0de1+++g==} + engines: {node: '>=8.0.0'} + dependencies: + web3-eth-iban: 1.10.0 + web3-utils: 1.10.0 + dev: true + + /web3-core-helpers@1.10.3: + resolution: {integrity: sha512-Yv7dQC3B9ipOc5sWm3VAz1ys70Izfzb8n9rSiQYIPjpqtJM+3V4EeK6ghzNR6CO2es0+Yu9CtCkw0h8gQhrTxA==} + engines: {node: '>=8.0.0'} + dependencies: + web3-eth-iban: 1.10.3 + web3-utils: 1.10.3 + dev: true + + /web3-core-helpers@1.10.4: + resolution: {integrity: sha512-r+L5ylA17JlD1vwS8rjhWr0qg7zVoVMDvWhajWA5r5+USdh91jRUYosp19Kd1m2vE034v7Dfqe1xYRoH2zvG0g==} + engines: {node: '>=8.0.0'} + dependencies: + web3-eth-iban: 1.10.4 + web3-utils: 1.10.4 + dev: true + + /web3-core-method@1.10.0: + resolution: {integrity: sha512-4R700jTLAMKDMhQ+nsVfIXvH6IGJlJzGisIfMKWAIswH31h5AZz7uDUW2YctI+HrYd+5uOAlS4OJeeT9bIpvkA==} + engines: {node: '>=8.0.0'} + dependencies: + '@ethersproject/transactions': 5.7.0 + web3-core-helpers: 1.10.0 + web3-core-promievent: 1.10.0 + web3-core-subscriptions: 1.10.0 + web3-utils: 1.10.0 + dev: true + + /web3-core-method@1.10.4: + resolution: {integrity: sha512-uZTb7flr+Xl6LaDsyTeE2L1TylokCJwTDrIVfIfnrGmnwLc6bmTWCCrm71sSrQ0hqs6vp/MKbQYIYqUN0J8WyA==} + engines: {node: '>=8.0.0'} + dependencies: + '@ethersproject/transactions': 5.7.0 + web3-core-helpers: 1.10.4 + web3-core-promievent: 1.10.4 + web3-core-subscriptions: 1.10.4 + web3-utils: 1.10.4 + dev: true + + /web3-core-promievent@1.10.0: + resolution: {integrity: sha512-68N7k5LWL5R38xRaKFrTFT2pm2jBNFaM4GioS00YjAKXRQ3KjmhijOMG3TICz6Aa5+6GDWYelDNx21YAeZ4YTg==} + engines: {node: '>=8.0.0'} + dependencies: + eventemitter3: 4.0.4 + dev: true + + /web3-core-promievent@1.10.3: + resolution: {integrity: sha512-HgjY+TkuLm5uTwUtaAfkTgRx/NzMxvVradCi02gy17NxDVdg/p6svBHcp037vcNpkuGeFznFJgULP+s2hdVgUQ==} + engines: {node: '>=8.0.0'} + dependencies: + eventemitter3: 4.0.4 + dev: true + + /web3-core-promievent@1.10.4: + resolution: {integrity: sha512-2de5WnJQ72YcIhYwV/jHLc4/cWJnznuoGTJGD29ncFQHAfwW/MItHFSVKPPA5v8AhJe+r6y4Y12EKvZKjQVBvQ==} + engines: {node: '>=8.0.0'} + dependencies: + eventemitter3: 4.0.4 + dev: true + + /web3-core-requestmanager@1.10.0: + resolution: {integrity: sha512-3z/JKE++Os62APml4dvBM+GAuId4h3L9ckUrj7ebEtS2AR0ixyQPbrBodgL91Sv7j7cQ3Y+hllaluqjguxvSaQ==} + engines: {node: '>=8.0.0'} + dependencies: + util: 0.12.5 + web3-core-helpers: 1.10.0 + web3-providers-http: 1.10.0 + web3-providers-ipc: 1.10.0 + web3-providers-ws: 1.10.0 + transitivePeerDependencies: + - encoding + - supports-color + dev: true + + /web3-core-requestmanager@1.10.4: + resolution: {integrity: sha512-vqP6pKH8RrhT/2MoaU+DY/OsYK9h7HmEBNCdoMj+4ZwujQtw/Mq2JifjwsJ7gits7Q+HWJwx8q6WmQoVZAWugg==} + engines: {node: '>=8.0.0'} + dependencies: + util: 0.12.5 + web3-core-helpers: 1.10.4 + web3-providers-http: 1.10.4 + web3-providers-ipc: 1.10.4 + web3-providers-ws: 1.10.4 + transitivePeerDependencies: + - encoding + - supports-color + dev: true + + /web3-core-subscriptions@1.10.0: + resolution: {integrity: sha512-HGm1PbDqsxejI075gxBc5OSkwymilRWZufIy9zEpnWKNmfbuv5FfHgW1/chtJP6aP3Uq2vHkvTDl3smQBb8l+g==} + engines: {node: '>=8.0.0'} + dependencies: + eventemitter3: 4.0.4 + web3-core-helpers: 1.10.0 + dev: true + + /web3-core-subscriptions@1.10.4: + resolution: {integrity: sha512-o0lSQo/N/f7/L76C0HV63+S54loXiE9fUPfHFcTtpJRQNDBVsSDdWRdePbWwR206XlsBqD5VHApck1//jEafTw==} + engines: {node: '>=8.0.0'} + dependencies: + eventemitter3: 4.0.4 + web3-core-helpers: 1.10.4 + dev: true + + /web3-core@1.10.0: + resolution: {integrity: sha512-fWySwqy2hn3TL89w5TM8wXF1Z2Q6frQTKHWmP0ppRQorEK8NcHJRfeMiv/mQlSKoTS1F6n/nv2uyZsixFycjYQ==} + engines: {node: '>=8.0.0'} + dependencies: + '@types/bn.js': 5.1.5 + '@types/node': 12.20.55 + bignumber.js: 9.1.2 + web3-core-helpers: 1.10.0 + web3-core-method: 1.10.0 + web3-core-requestmanager: 1.10.0 + web3-utils: 1.10.0 + transitivePeerDependencies: + - encoding + - supports-color + dev: true + + /web3-core@1.10.4: + resolution: {integrity: sha512-B6elffYm81MYZDTrat7aEhnhdtVE3lDBUZft16Z8awYMZYJDbnykEbJVS+l3mnA7AQTnSDr/1MjWofGDLBJPww==} + engines: {node: '>=8.0.0'} + dependencies: + '@types/bn.js': 5.1.5 + '@types/node': 12.20.55 + bignumber.js: 9.1.2 + web3-core-helpers: 1.10.4 + web3-core-method: 1.10.4 + web3-core-requestmanager: 1.10.4 + web3-utils: 1.10.4 + transitivePeerDependencies: + - encoding + - supports-color + dev: true + + /web3-eth-abi@1.10.0: + resolution: {integrity: sha512-cwS+qRBWpJ43aI9L3JS88QYPfFcSJJ3XapxOQ4j40v6mk7ATpA8CVK1vGTzpihNlOfMVRBkR95oAj7oL6aiDOg==} + engines: {node: '>=8.0.0'} + dependencies: + '@ethersproject/abi': 5.7.0 + web3-utils: 1.10.0 + dev: true + + /web3-eth-abi@1.10.4: + resolution: {integrity: sha512-cZ0q65eJIkd/jyOlQPDjr8X4fU6CRL1eWgdLwbWEpo++MPU/2P4PFk5ZLAdye9T5Sdp+MomePPJ/gHjLMj2VfQ==} + engines: {node: '>=8.0.0'} + dependencies: + '@ethersproject/abi': 5.7.0 + web3-utils: 1.10.4 + dev: true + + /web3-eth-accounts@1.10.0: + resolution: {integrity: sha512-wiq39Uc3mOI8rw24wE2n15hboLE0E9BsQLdlmsL4Zua9diDS6B5abXG0XhFcoNsXIGMWXVZz4TOq3u4EdpXF/Q==} + engines: {node: '>=8.0.0'} + dependencies: + '@ethereumjs/common': 2.5.0 + '@ethereumjs/tx': 3.3.2 + eth-lib: 0.2.8 + ethereumjs-util: 7.1.5 + scrypt-js: 3.0.1 + uuid: 9.0.1 + web3-core: 1.10.0 + web3-core-helpers: 1.10.0 + web3-core-method: 1.10.0 + web3-utils: 1.10.0 + transitivePeerDependencies: + - encoding + - supports-color + dev: true + + /web3-eth-accounts@1.10.4: + resolution: {integrity: sha512-ysy5sVTg9snYS7tJjxVoQAH6DTOTkRGR8emEVCWNGLGiB9txj+qDvSeT0izjurS/g7D5xlMAgrEHLK1Vi6I3yg==} + engines: {node: '>=8.0.0'} + dependencies: + '@ethereumjs/common': 2.6.5 + '@ethereumjs/tx': 3.5.2 + '@ethereumjs/util': 8.1.0 + eth-lib: 0.2.8 + scrypt-js: 3.0.1 + uuid: 9.0.1 + web3-core: 1.10.4 + web3-core-helpers: 1.10.4 + web3-core-method: 1.10.4 + web3-utils: 1.10.4 + transitivePeerDependencies: + - encoding + - supports-color + dev: true + + /web3-eth-contract@1.10.0: + resolution: {integrity: sha512-MIC5FOzP/+2evDksQQ/dpcXhSqa/2hFNytdl/x61IeWxhh6vlFeSjq0YVTAyIzdjwnL7nEmZpjfI6y6/Ufhy7w==} + engines: {node: '>=8.0.0'} + dependencies: + '@types/bn.js': 5.1.5 + web3-core: 1.10.0 + web3-core-helpers: 1.10.0 + web3-core-method: 1.10.0 + web3-core-promievent: 1.10.0 + web3-core-subscriptions: 1.10.0 + web3-eth-abi: 1.10.0 + web3-utils: 1.10.0 + transitivePeerDependencies: + - encoding + - supports-color + dev: true + + /web3-eth-contract@1.10.4: + resolution: {integrity: sha512-Q8PfolOJ4eV9TvnTj1TGdZ4RarpSLmHnUnzVxZ/6/NiTfe4maJz99R0ISgwZkntLhLRtw0C7LRJuklzGYCNN3A==} + engines: {node: '>=8.0.0'} + dependencies: + '@types/bn.js': 5.1.5 + web3-core: 1.10.4 + web3-core-helpers: 1.10.4 + web3-core-method: 1.10.4 + web3-core-promievent: 1.10.4 + web3-core-subscriptions: 1.10.4 + web3-eth-abi: 1.10.4 + web3-utils: 1.10.4 + transitivePeerDependencies: + - encoding + - supports-color + dev: true + + /web3-eth-ens@1.10.0: + resolution: {integrity: sha512-3hpGgzX3qjgxNAmqdrC2YUQMTfnZbs4GeLEmy8aCWziVwogbuqQZ+Gzdfrym45eOZodk+lmXyLuAdqkNlvkc1g==} + engines: {node: '>=8.0.0'} + dependencies: + content-hash: 2.5.2 + eth-ens-namehash: 2.0.8 + web3-core: 1.10.0 + web3-core-helpers: 1.10.0 + web3-core-promievent: 1.10.0 + web3-eth-abi: 1.10.0 + web3-eth-contract: 1.10.0 + web3-utils: 1.10.0 + transitivePeerDependencies: + - encoding + - supports-color + dev: true + + /web3-eth-ens@1.10.4: + resolution: {integrity: sha512-LLrvxuFeVooRVZ9e5T6OWKVflHPFgrVjJ/jtisRWcmI7KN/b64+D/wJzXqgmp6CNsMQcE7rpmf4CQmJCrTdsgg==} + engines: {node: '>=8.0.0'} + dependencies: + content-hash: 2.5.2 + eth-ens-namehash: 2.0.8 + web3-core: 1.10.4 + web3-core-helpers: 1.10.4 + web3-core-promievent: 1.10.4 + web3-eth-abi: 1.10.4 + web3-eth-contract: 1.10.4 + web3-utils: 1.10.4 + transitivePeerDependencies: + - encoding + - supports-color + dev: true + + /web3-eth-iban@1.10.0: + resolution: {integrity: sha512-0l+SP3IGhInw7Q20LY3IVafYEuufo4Dn75jAHT7c2aDJsIolvf2Lc6ugHkBajlwUneGfbRQs/ccYPQ9JeMUbrg==} + engines: {node: '>=8.0.0'} + dependencies: + bn.js: 5.2.1 + web3-utils: 1.10.0 + dev: true + + /web3-eth-iban@1.10.3: + resolution: {integrity: sha512-ZCfOjYKAjaX2TGI8uif5ah+J3BYFuo+47JOIV1RIz2l7kD9VfnxvRH5UiQDRyMALQC7KFd2hUqIEtHklapNyKA==} + engines: {node: '>=8.0.0'} + dependencies: + bn.js: 5.2.1 + web3-utils: 1.10.3 + dev: true + + /web3-eth-iban@1.10.4: + resolution: {integrity: sha512-0gE5iNmOkmtBmbKH2aTodeompnNE8jEyvwFJ6s/AF6jkw9ky9Op9cqfzS56AYAbrqEFuClsqB/AoRves7LDELw==} + engines: {node: '>=8.0.0'} + dependencies: + bn.js: 5.2.1 + web3-utils: 1.10.4 + dev: true + + /web3-eth-personal@1.10.0: + resolution: {integrity: sha512-anseKn98w/d703eWq52uNuZi7GhQeVjTC5/svrBWEKob0WZ5kPdo+EZoFN0sp5a5ubbrk/E0xSl1/M5yORMtpg==} + engines: {node: '>=8.0.0'} + dependencies: + '@types/node': 12.20.55 + web3-core: 1.10.0 + web3-core-helpers: 1.10.0 + web3-core-method: 1.10.0 + web3-net: 1.10.0 + web3-utils: 1.10.0 + transitivePeerDependencies: + - encoding + - supports-color + dev: true + + /web3-eth-personal@1.10.4: + resolution: {integrity: sha512-BRa/hs6jU1hKHz+AC/YkM71RP3f0Yci1dPk4paOic53R4ZZG4MgwKRkJhgt3/GPuPliwS46f/i5A7fEGBT4F9w==} + engines: {node: '>=8.0.0'} + dependencies: + '@types/node': 12.20.55 + web3-core: 1.10.4 + web3-core-helpers: 1.10.4 + web3-core-method: 1.10.4 + web3-net: 1.10.4 + web3-utils: 1.10.4 + transitivePeerDependencies: + - encoding + - supports-color + dev: true + + /web3-eth@1.10.0: + resolution: {integrity: sha512-Z5vT6slNMLPKuwRyKGbqeGYC87OAy8bOblaqRTgg94CXcn/mmqU7iPIlG4506YdcdK3x6cfEDG7B6w+jRxypKA==} + engines: {node: '>=8.0.0'} + dependencies: + web3-core: 1.10.0 + web3-core-helpers: 1.10.0 + web3-core-method: 1.10.0 + web3-core-subscriptions: 1.10.0 + web3-eth-abi: 1.10.0 + web3-eth-accounts: 1.10.0 + web3-eth-contract: 1.10.0 + web3-eth-ens: 1.10.0 + web3-eth-iban: 1.10.0 + web3-eth-personal: 1.10.0 + web3-net: 1.10.0 + web3-utils: 1.10.0 + transitivePeerDependencies: + - encoding + - supports-color + dev: true + + /web3-eth@1.10.4: + resolution: {integrity: sha512-Sql2kYKmgt+T/cgvg7b9ce24uLS7xbFrxE4kuuor1zSCGrjhTJ5rRNG8gTJUkAJGKJc7KgnWmgW+cOfMBPUDSA==} + engines: {node: '>=8.0.0'} + dependencies: + web3-core: 1.10.4 + web3-core-helpers: 1.10.4 + web3-core-method: 1.10.4 + web3-core-subscriptions: 1.10.4 + web3-eth-abi: 1.10.4 + web3-eth-accounts: 1.10.4 + web3-eth-contract: 1.10.4 + web3-eth-ens: 1.10.4 + web3-eth-iban: 1.10.4 + web3-eth-personal: 1.10.4 + web3-net: 1.10.4 + web3-utils: 1.10.4 + transitivePeerDependencies: + - encoding + - supports-color + dev: true + + /web3-net@1.10.0: + resolution: {integrity: sha512-NLH/N3IshYWASpxk4/18Ge6n60GEvWBVeM8inx2dmZJVmRI6SJIlUxbL8jySgiTn3MMZlhbdvrGo8fpUW7a1GA==} + engines: {node: '>=8.0.0'} + dependencies: + web3-core: 1.10.0 + web3-core-method: 1.10.0 + web3-utils: 1.10.0 + transitivePeerDependencies: + - encoding + - supports-color + dev: true + + /web3-net@1.10.4: + resolution: {integrity: sha512-mKINnhOOnZ4koA+yV2OT5s5ztVjIx7IY9a03w6s+yao/BUn+Luuty0/keNemZxTr1E8Ehvtn28vbOtW7Ids+Ow==} + engines: {node: '>=8.0.0'} + dependencies: + web3-core: 1.10.4 + web3-core-method: 1.10.4 + web3-utils: 1.10.4 + transitivePeerDependencies: + - encoding + - supports-color + dev: true + + /web3-providers-http@1.10.0: + resolution: {integrity: sha512-eNr965YB8a9mLiNrkjAWNAPXgmQWfpBfkkn7tpEFlghfww0u3I0tktMZiaToJVcL2+Xq+81cxbkpeWJ5XQDwOA==} + engines: {node: '>=8.0.0'} + dependencies: + abortcontroller-polyfill: 1.7.5 + cross-fetch: 3.1.8 + es6-promise: 4.2.8 + web3-core-helpers: 1.10.0 + transitivePeerDependencies: + - encoding + dev: true + + /web3-providers-http@1.10.4: + resolution: {integrity: sha512-m2P5Idc8hdiO0l60O6DSCPw0kw64Zgi0pMjbEFRmxKIck2Py57RQMu4bxvkxJwkF06SlGaEQF8rFZBmuX7aagQ==} + engines: {node: '>=8.0.0'} + dependencies: + abortcontroller-polyfill: 1.7.5 + cross-fetch: 4.0.0 + es6-promise: 4.2.8 + web3-core-helpers: 1.10.4 + transitivePeerDependencies: + - encoding + dev: true + + /web3-providers-ipc@1.10.0: + resolution: {integrity: sha512-OfXG1aWN8L1OUqppshzq8YISkWrYHaATW9H8eh0p89TlWMc1KZOL9vttBuaBEi96D/n0eYDn2trzt22bqHWfXA==} + engines: {node: '>=8.0.0'} + dependencies: + oboe: 2.1.5 + web3-core-helpers: 1.10.0 + dev: true + + /web3-providers-ipc@1.10.4: + resolution: {integrity: sha512-YRF/bpQk9z3WwjT+A6FI/GmWRCASgd+gC0si7f9zbBWLXjwzYAKG73bQBaFRAHex1hl4CVcM5WUMaQXf3Opeuw==} + engines: {node: '>=8.0.0'} + dependencies: + oboe: 2.1.5 + web3-core-helpers: 1.10.4 + dev: true + + /web3-providers-ws@1.10.0: + resolution: {integrity: sha512-sK0fNcglW36yD5xjnjtSGBnEtf59cbw4vZzJ+CmOWIKGIR96mP5l684g0WD0Eo+f4NQc2anWWXG74lRc9OVMCQ==} + engines: {node: '>=8.0.0'} + dependencies: + eventemitter3: 4.0.4 + web3-core-helpers: 1.10.0 + websocket: 1.0.34 + transitivePeerDependencies: + - supports-color + dev: true + + /web3-providers-ws@1.10.4: + resolution: {integrity: sha512-j3FBMifyuFFmUIPVQR4pj+t5ILhAexAui0opgcpu9R5LxQrLRUZxHSnU+YO25UycSOa/NAX8A+qkqZNpcFAlxA==} + engines: {node: '>=8.0.0'} + dependencies: + eventemitter3: 4.0.4 + web3-core-helpers: 1.10.4 + websocket: 1.0.34 + transitivePeerDependencies: + - supports-color + dev: true + + /web3-shh@1.10.0: + resolution: {integrity: sha512-uNUUuNsO2AjX41GJARV9zJibs11eq6HtOe6Wr0FtRUcj8SN6nHeYIzwstAvJ4fXA53gRqFMTxdntHEt9aXVjpg==} + engines: {node: '>=8.0.0'} + requiresBuild: true + dependencies: + web3-core: 1.10.0 + web3-core-method: 1.10.0 + web3-core-subscriptions: 1.10.0 + web3-net: 1.10.0 + transitivePeerDependencies: + - encoding + - supports-color + dev: true + + /web3-shh@1.10.4: + resolution: {integrity: sha512-cOH6iFFM71lCNwSQrC3niqDXagMqrdfFW85hC9PFUrAr3PUrIem8TNstTc3xna2bwZeWG6OBy99xSIhBvyIACw==} + engines: {node: '>=8.0.0'} + requiresBuild: true + dependencies: + web3-core: 1.10.4 + web3-core-method: 1.10.4 + web3-core-subscriptions: 1.10.4 + web3-net: 1.10.4 + transitivePeerDependencies: + - encoding + - supports-color + dev: true + + /web3-utils@1.10.0: + resolution: {integrity: sha512-kSaCM0uMcZTNUSmn5vMEhlo02RObGNRRCkdX0V9UTAU0+lrvn0HSaudyCo6CQzuXUsnuY2ERJGCGPfeWmv19Rg==} + engines: {node: '>=8.0.0'} + dependencies: + bn.js: 5.2.1 + ethereum-bloom-filters: 1.0.10 + ethereumjs-util: 7.1.5 + ethjs-unit: 0.1.6 + number-to-bn: 1.7.0 + randombytes: 2.1.0 + utf8: 3.0.0 + dev: true + + /web3-utils@1.10.3: + resolution: {integrity: sha512-OqcUrEE16fDBbGoQtZXWdavsPzbGIDc5v3VrRTZ0XrIpefC/viZ1ZU9bGEemazyS0catk/3rkOOxpzTfY+XsyQ==} + engines: {node: '>=8.0.0'} + dependencies: + '@ethereumjs/util': 8.1.0 + bn.js: 5.2.1 + ethereum-bloom-filters: 1.0.10 + ethereum-cryptography: 2.1.3 + ethjs-unit: 0.1.6 + number-to-bn: 1.7.0 + randombytes: 2.1.0 + utf8: 3.0.0 + dev: true + + /web3-utils@1.10.4: + resolution: {integrity: sha512-tsu8FiKJLk2PzhDl9fXbGUWTkkVXYhtTA+SmEFkKft+9BgwLxfCRpU96sWv7ICC8zixBNd3JURVoiR3dUXgP8A==} + engines: {node: '>=8.0.0'} + dependencies: + '@ethereumjs/util': 8.1.0 + bn.js: 5.2.1 + ethereum-bloom-filters: 1.0.10 + ethereum-cryptography: 2.1.3 + ethjs-unit: 0.1.6 + number-to-bn: 1.7.0 + randombytes: 2.1.0 + utf8: 3.0.0 + dev: true + + /web3@1.10.0: + resolution: {integrity: sha512-YfKY9wSkGcM8seO+daR89oVTcbu18NsVfvOngzqMYGUU0pPSQmE57qQDvQzUeoIOHAnXEBNzrhjQJmm8ER0rng==} + engines: {node: '>=8.0.0'} + requiresBuild: true + dependencies: + web3-bzz: 1.10.0 + web3-core: 1.10.0 + web3-eth: 1.10.0 + web3-eth-personal: 1.10.0 + web3-net: 1.10.0 + web3-shh: 1.10.0 + web3-utils: 1.10.0 + transitivePeerDependencies: + - bufferutil + - encoding + - supports-color + - utf-8-validate + dev: true + + /web3@1.10.4: + resolution: {integrity: sha512-kgJvQZjkmjOEKimx/tJQsqWfRDPTTcBfYPa9XletxuHLpHcXdx67w8EFn5AW3eVxCutE9dTVHgGa9VYe8vgsEA==} + engines: {node: '>=8.0.0'} + requiresBuild: true + dependencies: + web3-bzz: 1.10.4 + web3-core: 1.10.4 + web3-eth: 1.10.4 + web3-eth-personal: 1.10.4 + web3-net: 1.10.4 + web3-shh: 1.10.4 + web3-utils: 1.10.4 + transitivePeerDependencies: + - bufferutil + - encoding + - supports-color + - utf-8-validate + dev: true + /webextension-polyfill-ts@0.25.0: resolution: {integrity: sha512-ikQhwwHYkpBu00pFaUzIKY26I6L87DeRI+Q6jBT1daZUNuu8dSrg5U9l/ZbqdaQ1M/TTSPKeAa3kolP5liuedw==} deprecated: This project has moved to @types/webextension-polyfill @@ -11770,13 +16713,31 @@ packages: /webidl-conversions@3.0.1: resolution: {integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==} - dev: false /webidl-conversions@7.0.0: resolution: {integrity: sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==} engines: {node: '>=12'} dev: true + /webpod@0.0.2: + resolution: {integrity: sha512-cSwwQIeg8v4i3p4ajHhwgR7N6VyxAf+KYSSsY6Pd3aETE+xEU4vbitz7qQkB0I321xnhDdgtxuiSfk5r/FVtjg==} + hasBin: true + dev: true + + /websocket@1.0.34: + resolution: {integrity: sha512-PRDso2sGwF6kM75QykIesBijKSVceR6jL2G8NGYyq2XrItNC2P5/qL5XeR056GhA+Ly7JMFvJb9I312mJfmqnQ==} + engines: {node: '>=4.0.0'} + dependencies: + bufferutil: 4.0.8 + debug: 2.6.9 + es5-ext: 0.10.64 + typedarray-to-buffer: 3.1.5 + utf-8-validate: 5.0.10 + yaeti: 0.0.6 + transitivePeerDependencies: + - supports-color + dev: true + /whatwg-encoding@3.1.1: resolution: {integrity: sha512-6qN4hJdMwfYBtE3YBTTHhoeuUrDBPZmbQaxWAqSALV/MeEnR5z1xd8UKud2RAkFoPkmB+hli1TZSnyi84xz1vQ==} engines: {node: '>=18'} @@ -11806,7 +16767,6 @@ packages: dependencies: tr46: 0.0.3 webidl-conversions: 3.0.1 - dev: false /which-boxed-primitive@1.0.2: resolution: {integrity: sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==} @@ -11846,6 +16806,10 @@ packages: is-weakset: 2.0.3 dev: true + /which-module@1.0.0: + resolution: {integrity: sha512-F6+WgncZi/mJDrammbTuHe1q0R5hOXv/mBaiNA2TCNT/LTHusX0V+CJnj9XT8ki5ln2UZyyddDgHfCzyrOH7MQ==} + dev: true + /which-module@2.0.1: resolution: {integrity: sha512-iBdZ57RDvnOR9AGBhML2vFZf7h8vmBjhoaZqODJBFWHVtKkDmKuHai3cx5PgVMrX5YDNp27AofYbAwctSS+vhQ==} dev: false @@ -11868,6 +16832,13 @@ packages: gopd: 1.0.1 has-tostringtag: 1.0.2 + /which@1.3.1: + resolution: {integrity: sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==} + hasBin: true + dependencies: + isexe: 2.0.0 + dev: true + /which@2.0.2: resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} engines: {node: '>= 8'} @@ -11875,6 +16846,14 @@ packages: dependencies: isexe: 2.0.0 + /which@3.0.1: + resolution: {integrity: sha512-XA1b62dzQzLfaEOSQFTCOd5KFf/1VSzZo7/7TUjnya6u0vGGKzU96UQBZTAThCb2j4/xjBAyii1OhRLJEivHvg==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + hasBin: true + dependencies: + isexe: 2.0.0 + dev: true + /which@4.0.0: resolution: {integrity: sha512-GlaYyEb07DPxYCKhKzplCWBJtvxZcZMrL+4UkrTSJHHPyZU4mYYTv3qaOe77H7EODLSSopAUFAc6W8U4yqvscg==} engines: {node: ^16.13.0 || >=18.0.0} @@ -11892,6 +16871,48 @@ packages: stackback: 0.0.2 dev: true + /widest-line@3.1.0: + resolution: {integrity: sha512-NsmoXalsWVDMGupxZ5R08ka9flZjjiLvHVAWYOKtiKM8ujtZWr9cRffak+uSE48+Ob8ObalXpwyeUiyDD6QFgg==} + engines: {node: '>=8'} + dependencies: + string-width: 4.2.3 + dev: true + + /window-size@0.2.0: + resolution: {integrity: sha512-UD7d8HFA2+PZsbKyaOCEy8gMh1oDtHgJh1LfgjQ4zVXmYjAT/kvz3PueITKuqDiIXQe7yzpPnxX3lNc+AhQMyw==} + engines: {node: '>= 0.10.0'} + hasBin: true + dev: true + + /word-wrap@1.2.5: + resolution: {integrity: sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==} + engines: {node: '>=0.10.0'} + dev: true + + /wordwrap@1.0.0: + resolution: {integrity: sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q==} + dev: true + + /wordwrapjs@4.0.1: + resolution: {integrity: sha512-kKlNACbvHrkpIw6oPeYDSmdCTu2hdMHoyXLTcUKala++lx5Y+wjJ/e474Jqv5abnVmwxw08DiTuHmw69lJGksA==} + engines: {node: '>=8.0.0'} + dependencies: + reduce-flatten: 2.0.0 + typical: 5.2.0 + dev: true + + /workerpool@6.2.1: + resolution: {integrity: sha512-ILEIE97kDZvF9Wb9f6h5aXK4swSlKGUcOEGiIYb2OOu/IrDU9iwj0fD//SsA6E5ibwJxpEvhullJY4Sl4GcpAw==} + dev: true + + /wrap-ansi@2.1.0: + resolution: {integrity: sha512-vAaEaDM946gbNpH5pLVNR+vX2ht6n0Bt3GXwVB1AuAqZosOvHNF3P7wDnh8KLkSqgUh0uh77le7Owgoz+Z9XBw==} + engines: {node: '>=0.10.0'} + dependencies: + string-width: 1.0.2 + strip-ansi: 3.0.1 + dev: true + /wrap-ansi@6.2.0: resolution: {integrity: sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==} engines: {node: '>=8'} @@ -11929,6 +16950,22 @@ packages: signal-exit: 3.0.7 dev: false + /ws@3.3.3: + resolution: {integrity: sha512-nnWLa/NwZSt4KQJu51MYlCcSQ5g7INpOrOMt4XV8j4dqTXdmlUmSHQ8/oLC069ckre0fRsgfvsKwbTdtKLCDkA==} + peerDependencies: + bufferutil: ^4.0.1 + utf-8-validate: ^5.0.2 + peerDependenciesMeta: + bufferutil: + optional: true + utf-8-validate: + optional: true + dependencies: + async-limiter: 1.0.1 + safe-buffer: 5.1.2 + ultron: 1.1.1 + dev: true + /ws@6.2.2: resolution: {integrity: sha512-zmhltoSR8u1cnDsD43TX59mzoMZsLKqUweyYBAIvTngR3shc0W6aOZylZmq/7hqyVxPdi+5Ud2QInblgyE72fw==} peerDependencies: @@ -11943,6 +16980,19 @@ packages: async-limiter: 1.0.1 dev: false + /ws@7.4.6: + resolution: {integrity: sha512-YmhHDO4MzaDLB+M9ym/mDA5z0naX8j7SIlT8f8z+I0VtzsRbekxEutHSme7NPS2qE8StCYQNUnfWdXta/Yu85A==} + engines: {node: '>=8.3.0'} + peerDependencies: + bufferutil: ^4.0.1 + utf-8-validate: ^5.0.2 + peerDependenciesMeta: + bufferutil: + optional: true + utf-8-validate: + optional: true + dev: true + /ws@7.5.9: resolution: {integrity: sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q==} engines: {node: '>=8.3.0'} @@ -11954,7 +17004,6 @@ packages: optional: true utf-8-validate: optional: true - dev: false /ws@8.11.0(bufferutil@4.0.8)(utf-8-validate@6.0.3): resolution: {integrity: sha512-HPG3wQd9sNQoT9xHyNCXoDUa+Xw/VevmY9FoHyQ+g+rrMn4j6FB4np7Z0OhdTgjx6MgQLK7jwSy1YecU1+4Asg==} @@ -11998,6 +17047,33 @@ packages: optional: true dev: true + /xhr-request-promise@0.1.3: + resolution: {integrity: sha512-YUBytBsuwgitWtdRzXDDkWAXzhdGB8bYm0sSzMPZT7Z2MBjMSTHFsyCT1yCRATY+XC69DUrQraRAEgcoCRaIPg==} + dependencies: + xhr-request: 1.1.0 + dev: true + + /xhr-request@1.1.0: + resolution: {integrity: sha512-Y7qzEaR3FDtL3fP30k9wO/e+FBnBByZeybKOhASsGP30NIkRAAkKD/sCnLvgEfAIEC1rcmK7YG8f4oEnIrrWzA==} + dependencies: + buffer-to-arraybuffer: 0.0.5 + object-assign: 4.1.1 + query-string: 5.1.1 + simple-get: 2.8.2 + timed-out: 4.0.1 + url-set-query: 1.0.0 + xhr: 2.6.0 + dev: true + + /xhr@2.6.0: + resolution: {integrity: sha512-/eCGLb5rxjx5e3mF1A7s+pLlR6CGyqWN91fv1JgER5mVWg1MZmlhBvy9kjcsOdRk8RrIujotWyJamfyrp+WIcA==} + dependencies: + global: 4.4.0 + is-function: 1.0.2 + parse-headers: 2.0.5 + xtend: 4.0.2 + dev: true + /xml-name-validator@5.0.0: resolution: {integrity: sha512-EvGK8EJ3DhaHfbRlETOWAS5pO9MZITeauHKJyb8wyajUfQUenkIg2MvLDTZ4T/TgIcm3HU0TFBgWWboAZ30UHg==} engines: {node: '>=18'} @@ -12012,10 +17088,18 @@ packages: engines: {node: '>=0.4.0'} dev: false + /xmlhttprequest@1.8.0: + resolution: {integrity: sha512-58Im/U0mlVBLM38NdZjHyhuMtCqa61469k2YP/AaPbvCoV9aQGUpbJBj1QRm2ytRiVQBD/fsw7L2bJGDVQswBA==} + engines: {node: '>=0.4.0'} + dev: true + /xtend@4.0.2: resolution: {integrity: sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==} engines: {node: '>=0.4'} - dev: false + + /y18n@3.2.2: + resolution: {integrity: sha512-uGZHXkHnhF0XeeAPgnKfPv1bgKAYyVvmNL1xlKsPYZPaIHxGti2hHqvOCQv71XMsLxu1QjergkqogUnms5D3YQ==} + dev: true /y18n@4.0.3: resolution: {integrity: sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==} @@ -12024,7 +17108,11 @@ packages: /y18n@5.0.8: resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} engines: {node: '>=10'} - dev: false + + /yaeti@0.0.6: + resolution: {integrity: sha512-MvQa//+KcZCUkBTIC9blM+CU9J2GzuTytsOUwf2lidtvkx/6gnEp1QvJv34t9vdjhFmha/mUiNDbN0D0mJWdug==} + engines: {node: '>=0.10.32'} + dev: true /yallist@3.1.1: resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==} @@ -12041,7 +17129,6 @@ packages: resolution: {integrity: sha512-pIXzoImaqmfOrL7teGUBt/T7ZDnyeGBWyXQBvOVhLkWLN37GXv8NMLK406UY6dS51JfcQHsmcW5cJ441bHg6Lg==} engines: {node: '>= 14'} hasBin: true - dev: false /yargs-parser@18.1.3: resolution: {integrity: sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==} @@ -12051,11 +17138,33 @@ packages: decamelize: 1.2.0 dev: false + /yargs-parser@2.4.1: + resolution: {integrity: sha512-9pIKIJhnI5tonzG6OnCFlz/yln8xHYcGl+pn3xR0Vzff0vzN1PbNRaelgfgRUwZ3s4i3jvxT9WhmUGL4whnasA==} + dependencies: + camelcase: 3.0.0 + lodash.assign: 4.2.0 + dev: true + + /yargs-parser@20.2.4: + resolution: {integrity: sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA==} + engines: {node: '>=10'} + dev: true + /yargs-parser@21.1.1: resolution: {integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==} engines: {node: '>=12'} dev: false + /yargs-unparser@2.0.0: + resolution: {integrity: sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA==} + engines: {node: '>=10'} + dependencies: + camelcase: 6.3.0 + decamelize: 4.0.0 + flat: 5.0.2 + is-plain-obj: 2.1.0 + dev: true + /yargs@15.4.1: resolution: {integrity: sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==} engines: {node: '>=8'} @@ -12073,6 +17182,19 @@ packages: yargs-parser: 18.1.3 dev: false + /yargs@16.2.0: + resolution: {integrity: sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==} + engines: {node: '>=10'} + dependencies: + cliui: 7.0.4 + escalade: 3.1.2 + get-caller-file: 2.0.5 + require-directory: 2.1.1 + string-width: 4.2.3 + y18n: 5.0.8 + yargs-parser: 20.2.4 + dev: true + /yargs@17.7.2: resolution: {integrity: sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==} engines: {node: '>=12'} @@ -12086,6 +17208,25 @@ packages: yargs-parser: 21.1.1 dev: false + /yargs@4.8.1: + resolution: {integrity: sha512-LqodLrnIDM3IFT+Hf/5sxBnEGECrfdC1uIbgZeJmESCSo4HoCAaKEus8MylXHAkdacGc0ye+Qa+dpkuom8uVYA==} + dependencies: + cliui: 3.2.0 + decamelize: 1.2.0 + get-caller-file: 1.0.3 + lodash.assign: 4.2.0 + os-locale: 1.4.0 + read-pkg-up: 1.0.1 + require-directory: 2.1.1 + require-main-filename: 1.0.1 + set-blocking: 2.0.0 + string-width: 1.0.2 + which-module: 1.0.0 + window-size: 0.2.0 + y18n: 3.2.2 + yargs-parser: 2.4.1 + dev: true + /yn@3.1.1: resolution: {integrity: sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==} engines: {node: '>=6'} @@ -12102,9 +17243,8 @@ packages: /zod@3.22.4: resolution: {integrity: sha512-iC+8Io04lddc+mVqQ9AZ7OQ2MrUKGN+oIQyq1vemgt46jwCwLfhq7/pwnBnNXXXZb8VTVLKwp9EDkx+ryxIWmg==} - dev: false - /zustand@4.4.1(@types/react@18.2.68)(react@18.2.0): + /zustand@4.4.1(@types/react@18.2.75)(react@18.2.0): resolution: {integrity: sha512-QCPfstAS4EBiTQzlaGP1gmorkh/UL1Leaj2tdj+zZCZ/9bm0WS7sI2wnfD5lpOszFqWJ1DcPnGoY8RDL61uokw==} engines: {node: '>=12.7.0'} peerDependencies: @@ -12119,7 +17259,29 @@ packages: react: optional: true dependencies: - '@types/react': 18.2.68 + '@types/react': 18.2.75 react: 18.2.0 use-sync-external-store: 1.2.0(react@18.2.0) dev: false + + /zx@7.2.3: + resolution: {integrity: sha512-QODu38nLlYXg/B/Gw7ZKiZrvPkEsjPN3LQ5JFXM7h0JvwhEdPNNl+4Ao1y4+o3CLNiDUNcwzQYZ4/Ko7kKzCMA==} + engines: {node: '>= 16.0.0'} + hasBin: true + dependencies: + '@types/fs-extra': 11.0.4 + '@types/minimist': 1.2.5 + '@types/node': 18.19.31 + '@types/ps-tree': 1.1.6 + '@types/which': 3.0.3 + chalk: 5.3.0 + fs-extra: 11.2.0 + fx: 34.0.0 + globby: 13.2.2 + minimist: 1.2.8 + node-fetch: 3.3.1 + ps-tree: 1.2.0 + webpod: 0.0.2 + which: 3.0.1 + yaml: 2.4.1 + dev: true diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml new file mode 100644 index 00000000..bbce6841 --- /dev/null +++ b/pnpm-workspace.yaml @@ -0,0 +1,3 @@ +packages: + - 'contracts/' + - 'frontend/'