diff --git a/.github/workflows/integration-tests.yml b/.github/workflows/integration-tests.yml index cede330f..641f3251 100644 --- a/.github/workflows/integration-tests.yml +++ b/.github/workflows/integration-tests.yml @@ -48,10 +48,10 @@ jobs: ] steps: - uses: actions/checkout@v3 - - name: Use Node.js 18.14.2 + - name: Use Node.js 21.1.0 uses: actions/setup-node@v3 with: - node-version: 18.14.2 + node-version: 21.1.0 - name: Build for testing run: | cd ./packages/common/ diff --git a/.github/workflows/unit-tests-contracts.yml b/.github/workflows/unit-tests-contracts.yml index 13546dc5..1b37d3ea 100644 --- a/.github/workflows/unit-tests-contracts.yml +++ b/.github/workflows/unit-tests-contracts.yml @@ -14,10 +14,10 @@ jobs: runs-on: ubuntu-latest steps: - uses: actions/checkout@v3 - - name: Use Node.js 18.14.2 + - name: Use Node.js 21.1.0 uses: actions/setup-node@v3 with: - node-version: 18.14.2 + node-version: 21.1.0 - name: Build for testing contracts run: | cd packages/contracts diff --git a/.github/workflows/unit-tests-router.yml b/.github/workflows/unit-tests-router.yml index 69e28a5a..678fb01e 100644 --- a/.github/workflows/unit-tests-router.yml +++ b/.github/workflows/unit-tests-router.yml @@ -14,10 +14,10 @@ jobs: runs-on: ubuntu-latest steps: - uses: actions/checkout@v3 - - name: Use Node.js 18.14.2 + - name: Use Node.js 21.1.0 uses: actions/setup-node@v3 with: - node-version: 18.14.2 + node-version: 21.1.0 - name: Build for testing router run: | cd packages/router diff --git a/.github/workflows/unit-tests-uniswap.yml b/.github/workflows/unit-tests-uniswap.yml index 005cdd15..f363b720 100644 --- a/.github/workflows/unit-tests-uniswap.yml +++ b/.github/workflows/unit-tests-uniswap.yml @@ -17,10 +17,10 @@ jobs: runs-on: ubuntu-latest steps: - uses: actions/checkout@v3 - - name: Use Node.js 18.14.2 + - name: Use Node.js 21.1.0 uses: actions/setup-node@v3 with: - node-version: 18.14.2 + node-version: 21.1.0 - name: Build for testing uniswap mock run: | cd packages/common diff --git a/packages/contracts/hardhat.config.ts b/packages/contracts/hardhat.config.ts index dea100c1..407a3ec0 100644 --- a/packages/contracts/hardhat.config.ts +++ b/packages/contracts/hardhat.config.ts @@ -47,6 +47,9 @@ const config = { blastSepolia: { url: 'https://sepolia.blast.io', }, + sonic: { + url: 'https://rpc.soniclabs.com', + }, }, etherscan: { apiKey: { @@ -58,6 +61,7 @@ const config = { x1Testnet: process.env.API_KEY, artioTestnet: 'artio_testnet', blastSepolia: 'blast_sepolia', + sonic: process.env.SONIC_API_KEY, }, customChains: [ { @@ -92,6 +96,14 @@ const config = { browserURL: 'https://testnet.blastscan.io', }, }, + { + network: 'sonic', + chainId: 146, + urls: { + apiURL: 'https://api.sonicscan.org/api', + browserURL: 'https://sonicscan.org', + }, + }, ], }, mocha: { diff --git a/packages/deploy/src/data/deploy/arbitrum-v1.5-pendle/config.json b/packages/deploy/src/data/deploy/arbitrum-v1.5-pendle/config.json deleted file mode 100644 index 9ae0bab0..00000000 --- a/packages/deploy/src/data/deploy/arbitrum-v1.5-pendle/config.json +++ /dev/null @@ -1,170 +0,0 @@ -{ - "systemContextDefaults": { - "ethNodeUri": "https://arb1.arbitrum.io/rpc" - }, - "connection": { - "assertChainId": 42161, - "ethOptions": {} - }, - "tokens": [ - { - "id": "weth", - "address": "0x82af49447d8a07e3bd95bd0d56f35241523fbab1", - "assertSymbol": "WETH", - "assertDecimals": 18 - }, - { - "id": "pt-weeth-27jun2024", - "address": "0x1c27ad8a19ba026adabd615f6bc77158130cfbe4", - "assertSymbol": "PT-weETH-27JUN2024", - "assertDecimals": 18 - }, - { - "id": "weeth", - "address": "0x35751007a407ca6FEFfE80b3cB397736D2cf4dbe", - "assertSymbol": "weETH", - "assertDecimals": 18 - }, - { - "id": "pt-usde-29aug2024", - "address": "0xad853EB4fB3Fe4a66CdFCD7b75922a0494955292", - "assertSymbol": "PT-USDe-29AUG2024", - "assertDecimals": 18 - }, - { - "id": "usde", - "address": "0x5d3a1Ff2b6BAb83b63cd9AD0787074081a52ef34", - "assertSymbol": "USDe", - "assertDecimals": 18 - }, - { - "id": "usdc", - "address": "0xaf88d065e77c8cc2239327c5edb3a432268e5831", - "assertSymbol": "USDC", - "assertDecimals": 6 - } - ], - "prices": [], - "priceOracles": [ - { - "id": "uniswapV3Oracle", - "type": "uniswapV3", - "factory": "0x1F98431c8aD98523631AE4a59f267346ea31F984", - "settings": [ - { - "quoteTokenId": "weth", - "baseTokenId": "weeth", - "secondsAgo": "15 min", - "secondsAgoLiquidation": "5 sec", - "uniswapFee": "0.01%" - } - ] - }, - { - "id": "algebraOracle", - "type": "algebra", - "factory": "0x1a3c9B1d2F0529D97f2afC5136Cc23e58f1FD35B", - "settings": [ - { - "quoteTokenId": "usdc", - "baseTokenId": "usde", - "secondsAgo": "15 min", - "secondsAgoLiquidation": "5 sec" - } - ] - }, - { - "id": "pendleOracle", - "type": "pendle", - "pendlePtLpOracle": "0x1Fd95db7B7C0067De8D45C0cb35D59796adfD187", - "settings": [ - { - "quoteTokenId": "weth", - "baseTokenId": "pt-weeth-27jun2024", - "pendleMarket": "0x952083cde7aaa11ab8449057f7de23a970aa8472", - "secondaryPoolOracleId": "uniswapV3Oracle", - "ibTokenId": "weeth", - "secondsAgo": "15 min", - "secondsAgoLiquidation": "5 sec" - }, - { - "quoteTokenId": "usdc", - "baseTokenId": "pt-usde-29aug2024", - "pendleMarket": "0x2dfaf9a5e4f293bceede49f2dba29aacdd88e0c4", - "secondaryPoolOracleId": "algebraOracle", - "ibTokenId": "usde", - "secondsAgo": "15 min", - "secondsAgoLiquidation": "5 sec" - } - ] - } - ], - "marginlyFactory": { - "feeHolder": "0x601A564628f9467ea76945fdDC6F9C7604eE1C1E", - "techPositionOwner": "0xd48658962b93aa404fD56baa7FD07977a0EB05a9", - "wethTokenId": "weth" - }, - "marginlyPools": [ - { - "id": "pt-weeth-27jun2024-weth", - "baseTokenId": "pt-weeth-27jun2024", - "quoteTokenId": "weth", - "priceOracleId": "pendleOracle", - "defaultSwapCallData": "18350081", - "params": { - "interestRate": "3%", - "maxLeverage": "20", - "swapFee": "0.1%", - "fee": "1.25%", - "mcSlippage": "1.0%", - "positionMinAmount": "0.001", - "quoteLimit": "200" - } - }, - { - "id": "pt-usde-29aug2024-usdc", - "baseTokenId": "pt-usde-29aug2024", - "quoteTokenId": "usdc", - "priceOracleId": "pendleOracle", - "defaultSwapCallData": "18350081", - "params": { - "interestRate": "3%", - "maxLeverage": "20", - "swapFee": "0.1%", - "fee": "1.25%", - "mcSlippage": "1.0%", - "positionMinAmount": "1", - "quoteLimit": "100000" - } - } - ], - "adapters": [ - { - "dexId": 17, - "adapterName": "PendleAdapter", - "pools": [ - { - "pendleMarket": "0x952083cde7aaa11ab8449057f7de23a970aa8472", - "poolAddress": "0x14353445c8329df76e6f15e9ead18fa2d45a8bb6", - "ibTokenId": "weeth", - "slippage": "20", - "tokenAId": "pt-weeth-27jun2024", - "tokenBId": "weth" - }, - { - "pendleMarket": "0x2dfaf9a5e4f293bceede49f2dba29aacdd88e0c4", - "poolAddress": "0xc23f308cf1bfa7efffb592920a619f00990f8d74", - "ibTokenId": "usde", - "slippage": "20", - "tokenAId": "pt-usde-29aug2024", - "tokenBId": "usdc" - } - ] - } - ], - "marginlyKeeper": { - "aaveKeeper": { - "aavePoolAddressesProvider": "0xa97684ead0e402dc232d5a977953df7ecbab3cdb" - } - } -} diff --git a/packages/deploy/src/data/deploy/arbitrum-v1.5-pendle/deployment.json b/packages/deploy/src/data/deploy/arbitrum-v1.5-pendle/deployment.json deleted file mode 100644 index 66142124..00000000 --- a/packages/deploy/src/data/deploy/arbitrum-v1.5-pendle/deployment.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "marginlyPools": [ - { - "id": "pt-usde-29aug2024-usdc", - "address": "0x79C37E226834Dc6BfB04Ba0b60f823515c32f50D" - }, - { - "id": "pt-weeth-27jun2024-weth", - "address": "0xcf848A30153506617B07207D2B3d054D4Fb72EBC" - } - ], - "aaveKeeperDeployResult": { - "address": "0xEfc060E66973a2cb16E77A80AD681244a855c0d0" - } -} \ No newline at end of file diff --git a/packages/deploy/src/data/deploy/arbitrum-v1.5-pendle/states/2024-04-23.json b/packages/deploy/src/data/deploy/arbitrum-v1.5-pendle/states/2024-04-23.json deleted file mode 100644 index 086c17b1..00000000 --- a/packages/deploy/src/data/deploy/arbitrum-v1.5-pendle/states/2024-04-23.json +++ /dev/null @@ -1,40 +0,0 @@ -{ - "contracts": { - "priceOracle_uniswapV3Oracle": { - "address": "0x72a92187173767235F268A0665B378b2cAb073bC", - "txHash": "0xdd63797a5f07a7fd5f20295a939e51fc44e03f4908d93ed2648626a41ca9d2e9" - }, - "priceOracle_pendleOracle": { - "address": "0x654588d549CA41dffeCF229E4d97078bd5f969C5", - "txHash": "0x1788be0311f0da40979bee1155ceb871c4f08dfe84058b161081060251a79d94" - }, - "UniswapV3Adapter_0": { - "address": "0xB3007462BAe7Cd5CB3CaB799B97Dab157283e2f0", - "txHash": "0xf7c80b365df35c0425a5301ba1160d44013447b96cc096dcfd69a06d504bed49" - }, - "MarginlyRouter": { - "address": "0x1eE74263c21C1Cab248944233eBA806D0F67e4E4", - "txHash": "0x671ac40c6b56920eb6c717ad6abbc668e79c57b36e4bf94ae993769f58a28ae1" - }, - "marginlyPoolImplementation": { - "address": "0xC9f7a2779a0bAc0E7a02e570F2D9b84371996065", - "txHash": "0x3eba89f5a6898178fc4ab8c1f1d2c56585ba2f2a306624895ed562e4053ca265" - }, - "marginlyFactory": { - "address": "0x0567d6523b472D80a700f5Ea96C560632545AE75", - "txHash": "0x76e04b8d9d8b594da31009fbadbfb6646e6c5212c25e0897ec4b9de4d66358fe" - }, - "marginlyPool_pt-weeth-27jun2024-weth": { - "address": "0x8CEdCF8b62458E48819e9F5101846aFaef4Eb40E", - "txHash": "0x74295fe0a2a4cfa78a8f006b4999af94d1600344c1f3efc241ccdf76cf6823d2" - }, - "marginlyKeeper": { - "address": "0x14adE4DA23049b0dB1368e36555Cdf79745FAd7c", - "txHash": "0x3f26687da14439598cb0bd340b835ae41254db35eb13c786c7af2e123d559316" - }, - "PendleAdapter_17": { - "address": "0x0ef17ba7F450dd331d9BA9fe83681Eac9D852111", - "txHash": "0x8e632b08968cf72bf2fb873f33357a3424147cf9123f6452a93918d40f5e0ac7" - } - } -} \ No newline at end of file diff --git a/packages/deploy/src/data/deploy/arbitrum-v1.5-pendle/states/2024-05-07.json b/packages/deploy/src/data/deploy/arbitrum-v1.5-pendle/states/2024-05-07.json deleted file mode 100644 index 4e534bbc..00000000 --- a/packages/deploy/src/data/deploy/arbitrum-v1.5-pendle/states/2024-05-07.json +++ /dev/null @@ -1,44 +0,0 @@ -{ - "contracts": { - "priceOracle_uniswapV3Oracle": { - "address": "0xAba9151d0c16012302D57b362539E56915958AE2", - "txHash": "0x7b84345084d5e226ad69f171e2734c8e7c137531cc70cd801d8f42bb68f9c78d" - }, - "priceOracle_algebraOracle": { - "address": "0x614045090C18459DdC455186DdeAA03422385c9a", - "txHash": "0x43090a170ae418285e1433db11a1536c189e762c3b4bb74906faf77151031c77" - }, - "priceOracle_pendleOracle": { - "address": "0x35035E86Ca9216544AB0056a1DE461f53617c476", - "txHash": "0xc9fe36000c35df4bac3296c47cf3493781b5b9e037620c4d883b300a985fce04" - }, - "PendleAdapter_17": { - "address": "0xac35a4A948B58670eABb1140C8b9145F5d105122", - "txHash": "0xe811200c8ea490af0826760224b15ef6fa64ee043fbaefb336ca5d2811a23bc3" - }, - "MarginlyRouter": { - "address": "0x8ed4F2Aa306e548ACb4215D85e6E6f69e2d61B0A", - "txHash": "0x8e1ba42f3fae8b26e0f68095a03b0aec2825567c9722a371997ab32513d2e54b" - }, - "marginlyKeeper": { - "address": "0xEfc060E66973a2cb16E77A80AD681244a855c0d0", - "txHash": "0xa74a1b0f62cf014093d175a530651fbed7edada23fe45ef3a657bc9057760dc9" - }, - "marginlyPoolImplementation": { - "address": "0x00DED21835df8B0975c51C04f52d4E1e0a3eea66", - "txHash": "0x06c378a18ec39194bdb01939913967f769a40ec179c9ddf7d225e784134ac821" - }, - "marginlyFactory": { - "address": "0x537A3417Fe03e28F4E9640Bece70887a6938ff92", - "txHash": "0xa66406ef18ba22379c3fc23ac384ad4055a4206f4b014726e09ce6fbe01e0e0b" - }, - "marginlyPool_pt-weeth-27jun2024-weth": { - "address": "0xcf848A30153506617B07207D2B3d054D4Fb72EBC", - "txHash": "0x24b538796201c76b50b37d97942e162992d0e2102465f57deae1ab5c110925eb" - }, - "marginlyPool_pt-usde-29aug2024-usdc": { - "address": "0x79C37E226834Dc6BfB04Ba0b60f823515c32f50D", - "txHash": "0xd6fcc2cb2154c5a7b55b7fbf3627138c633e4eb0a87ebd402a30151e0cd4289e" - } - } -} \ No newline at end of file diff --git a/packages/deploy/src/data/deploy/ethereum-v1.5-pendle/config.json b/packages/deploy/src/data/deploy/ethereum-v1.5-pendle/config.json deleted file mode 100644 index 3097d6c7..00000000 --- a/packages/deploy/src/data/deploy/ethereum-v1.5-pendle/config.json +++ /dev/null @@ -1,203 +0,0 @@ -{ - "systemContextDefaults": { - "ethNodeUri": "https://ethereum-rpc.publicnode.com" - }, - "connection": { - "assertChainId": 1, - "ethOptions": {} - }, - "tokens": [ - { - "id": "weth", - "address": "0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2", - "assertSymbol": "WETH", - "assertDecimals": 18 - }, - { - "id": "pt-weeth-27jun2024", - "address": "0xc69Ad9baB1dEE23F4605a82b3354F8E40d1E5966", - "assertSymbol": "PT-weETH-27JUN2024", - "assertDecimals": 18 - }, - { - "id": "pt-weeth-26dec2024", - "address": "0x6ee2b5e19ecba773a352e5b21415dc419a700d1d", - "assertSymbol": "PT-weETH-26DEC2024", - "assertDecimals": 18 - }, - { - "id": "weeth", - "address": "0xCd5fE23C85820F7B72D0926FC9b05b43E359b7ee", - "assertSymbol": "weETH", - "assertDecimals": 18 - }, - { - "id": "pt-usde-25jul2024", - "address": "0xa0021EF8970104c2d008F38D92f115ad56a9B8e1", - "assertSymbol": "PT-USDe-25JUL2024", - "assertDecimals": 18 - }, - { - "id": "usde", - "address": "0x4c9edd5852cd905f086c759e8383e09bff1e68b3", - "assertSymbol": "USDe", - "assertDecimals": 18 - }, - { - "id": "usdt", - "address": "0xdac17f958d2ee523a2206206994597c13d831ec7", - "assertSymbol": "USDT", - "assertDecimals": 6 - } - ], - "prices": [], - "priceOracles": [ - { - "id": "uniswapV3Oracle", - "type": "uniswapV3", - "factory": "0x1F98431c8aD98523631AE4a59f267346ea31F984", - "settings": [ - { - "quoteTokenId": "weth", - "baseTokenId": "weeth", - "secondsAgo": "15 min", - "secondsAgoLiquidation": "5 sec", - "uniswapFee": "0.05%" - }, - { - "quoteTokenId": "usdt", - "baseTokenId": "usde", - "secondsAgo": "15 min", - "secondsAgoLiquidation": "5 sec", - "uniswapFee": "0.01%" - } - ] - }, - { - "id": "pendleOracle", - "type": "pendle", - "pendlePtLpOracle": "0x66a1096C6366b2529274dF4f5D8247827fe4CEA8", - "settings": [ - { - "quoteTokenId": "weth", - "baseTokenId": "pt-weeth-27jun2024", - "pendleMarket": "0xf32e58f92e60f4b0a37a69b95d642a471365eae8", - "secondaryPoolOracleId": "uniswapV3Oracle", - "ibTokenId": "weeth", - "secondsAgo": "15 min", - "secondsAgoLiquidation": "5 sec" - }, - { - "quoteTokenId": "weth", - "baseTokenId": "pt-weeth-26dec2024", - "pendleMarket": "0x7d372819240d14fb477f17b964f95f33beb4c704", - "secondaryPoolOracleId": "uniswapV3Oracle", - "ibTokenId": "weeth", - "secondsAgo": "15 min", - "secondsAgoLiquidation": "5 sec" - }, - { - "quoteTokenId": "usdt", - "baseTokenId": "pt-usde-25jul2024", - "pendleMarket": "0x19588f29f9402bb508007feadd415c875ee3f19f", - "secondaryPoolOracleId": "uniswapV3Oracle", - "ibTokenId": "usde", - "secondsAgo": "15 min", - "secondsAgoLiquidation": "5 sec" - } - ] - } - ], - "marginlyFactory": { - "feeHolder": "0x601A564628f9467ea76945fdDC6F9C7604eE1C1E", - "techPositionOwner": "0xd48658962b93aa404fD56baa7FD07977a0EB05a9", - "wethTokenId": "weth" - }, - "marginlyPools": [ - { - "id": "pt-weeth-27jun2024-weth", - "baseTokenId": "pt-weeth-27jun2024", - "quoteTokenId": "weth", - "priceOracleId": "pendleOracle", - "defaultSwapCallData": "18350081", - "params": { - "interestRate": "1.5%", - "maxLeverage": "20", - "swapFee": "0.1%", - "fee": "1.25%", - "mcSlippage": "1.0%", - "positionMinAmount": "0.001", - "quoteLimit": "10000" - } - }, - { - "id": "pt-weeth-26dec2024-weth", - "baseTokenId": "pt-weeth-26dec2024", - "quoteTokenId": "weth", - "priceOracleId": "pendleOracle", - "defaultSwapCallData": "18350081", - "params": { - "interestRate": "1.0%", - "maxLeverage": "20", - "swapFee": "0.1%", - "fee": "1.25%", - "mcSlippage": "1.0%", - "positionMinAmount": "0.001", - "quoteLimit": "10000" - } - }, - { - "id": "pt-usde-25jul2024-usdt", - "baseTokenId": "pt-usde-25jul2024", - "quoteTokenId": "usdt", - "priceOracleId": "pendleOracle", - "defaultSwapCallData": "18350081", - "params": { - "interestRate": "2.0%", - "maxLeverage": "20", - "swapFee": "0.1%", - "fee": "1.25%", - "mcSlippage": "1.0%", - "positionMinAmount": "0.001", - "quoteLimit": "5000000" - } - } - ], - "adapters": [ - { - "dexId": 17, - "adapterName": "PendleAdapter", - "pools": [ - { - "pendleMarket": "0xf32e58f92e60f4b0a37a69b95d642a471365eae8", - "poolAddress": "0x7a415b19932c0105c82fdb6b720bb01b0cc2cae3", - "ibTokenId": "weeth", - "slippage": "20", - "tokenAId": "pt-weeth-27jun2024", - "tokenBId": "weth" - }, - { - "pendleMarket": "0x7d372819240d14fb477f17b964f95f33beb4c704", - "poolAddress": "0x7a415b19932c0105c82fdb6b720bb01b0cc2cae3", - "ibTokenId": "weeth", - "slippage": "20", - "tokenAId": "pt-weeth-26dec2024", - "tokenBId": "weth" - }, - { - "pendleMarket": "0x19588f29f9402bb508007feadd415c875ee3f19f", - "poolAddress": "0x435664008f38b0650fbc1c9fc971d0a3bc2f1e47", - "ibTokenId": "usde", - "slippage": "20", - "tokenAId": "pt-usde-25jul2024", - "tokenBId": "usdt" - } - ] - } - ], - "marginlyKeeper": { - "aaveKeeper": { - "aavePoolAddressesProvider": "0x2f39d218133AFaB8F2B819B1066c7E434Ad94E9e" - } - } -} diff --git a/packages/deploy/src/data/deploy/ethereum-v1.5-pendle/deployment.json b/packages/deploy/src/data/deploy/ethereum-v1.5-pendle/deployment.json deleted file mode 100644 index 7e199af0..00000000 --- a/packages/deploy/src/data/deploy/ethereum-v1.5-pendle/deployment.json +++ /dev/null @@ -1,19 +0,0 @@ -{ - "marginlyPools": [ - { - "id": "pt-usde-25jul2024-usdt", - "address": "0xbd4a9ca12c5f3c12d1378843c0b91585475aed51" - }, - { - "id": "pt-weeth-26dec2024-weth", - "address": "0xa77C2275C1F403056c7F73B44df69E374C299dd7" - }, - { - "id": "pt-weeth-27jun2024-weth", - "address": "0xE45FD040dCaF59276Be6AAC6A3C14e4707381AAC" - } - ], - "aaveKeeperDeployResult": { - "address": "0x623342afe5C8cA6a090F8F09399c2713107EEccF" - } -} \ No newline at end of file diff --git a/packages/deploy/src/data/deploy/ethereum-v1.5-pendle/states/2024-05-08.json b/packages/deploy/src/data/deploy/ethereum-v1.5-pendle/states/2024-05-08.json deleted file mode 100644 index 97c13997..00000000 --- a/packages/deploy/src/data/deploy/ethereum-v1.5-pendle/states/2024-05-08.json +++ /dev/null @@ -1,44 +0,0 @@ -{ - "contracts": { - "priceOracle_uniswapV3Oracle": { - "address": "0x1e36749E00229759dca262cB25Ad8d9B21bEB3F5", - "txHash": "0xd26dfe276d415aa230d82a1d3f1e6ab0a825860c7d0a7135d359473c1d98dcaf" - }, - "priceOracle_pendleOracle": { - "address": "0x953bCae95340b4f275c357a9d847E36617401f8e", - "txHash": "0xdf9e445ee8ccd18c851795316cb759f3c4ef704b67e4be836ee0cbbaaff39b9d" - }, - "PendleAdapter_17": { - "address": "0x193E76C78e1c02BF35c1F789Ce2a1aE39F865629", - "txHash": "0xe848530b2769703abf8910a5737dbe4846e73eae5f4049c8855f99ddf6c29318" - }, - "MarginlyRouter": { - "address": "0x6eC48569A33E9465c5325ff205Afa81209C33F31", - "txHash": "0x3811e84d249bf8e3c7386b2e845eb07697fe084dcdb0f2ece93ae878e5cb911a" - }, - "marginlyPoolImplementation": { - "address": "0x34aD008303b2c48668A1d567306Cc84f2E753b7f", - "txHash": "0xd7f04b669e10aab343eb9933797e80873baecde8e0df3128e41299bfc6e74b08" - }, - "marginlyFactory": { - "address": "0xF8D88A292B0afa85E5Cf0d1195d0D3728Cfd7070", - "txHash": "0x94cc565b96e1eb2bee6f7486d79f89f1cb6f217609b07aa02d0ccc1e50cd7d1e" - }, - "marginlyPool_pt-weeth-27jun2024-weth": { - "address": "0xE45FD040dCaF59276Be6AAC6A3C14e4707381AAC", - "txHash": "0x3145f9ed6eb1eefc5d22fb3e5d71cade68860dd8ea3811ca1741f57841801027" - }, - "marginlyPool_pt-weeth-26dec2024-weth": { - "address": "0xa77C2275C1F403056c7F73B44df69E374C299dd7", - "txHash": "0x610878bebd9be992305c76951f322944ce1c370ba3f17a690fbd194e59722f1e" - }, - "marginlyPool_pt-usde-25jul2024-usdt": { - "address": "0xbd4a9ca12c5f3c12d1378843c0b91585475aed51", - "txHash": "0x44f35ace072c59c4fffc1bd3e8bb7d06bf85d3112955e49a67e8c04b5ec82491" - }, - "marginlyKeeper": { - "address": "0x623342afe5C8cA6a090F8F09399c2713107EEccF", - "txHash": "0x608ad531bebf83111c47682cb2838d64748fc748536d5d4ee5353f58941e0413" - } - } -} \ No newline at end of file diff --git a/packages/deploy/src/data/deploy/ganache/config.json b/packages/deploy/src/data/deploy/ganache/config.json deleted file mode 100644 index e71379b7..00000000 --- a/packages/deploy/src/data/deploy/ganache/config.json +++ /dev/null @@ -1,67 +0,0 @@ -{ - "systemContextDefaults": { - "ethNodeUri": "https://ganache.equilab.io/" - }, - "connection": { - "assertChainId": 1337, - "ethOptions": {} - }, - "tokens": [ - { - "id": "usdc", - "address": "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48", - "assertSymbol": "USDC", - "assertDecimals": 6 - }, - { - "id": "weth", - "address": "0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2", - "assertSymbol": "WETH", - "assertDecimals": 18 - } - ], - "prices": [], - "uniswap": { - "factory": "0x1F98431c8aD98523631AE4a59f267346ea31F984", - "swapRouter": "0xE592427A0AEce92De3Edee1F18E0157C05861564", - "pools": [ - { - "id": "usdc-weth", - "tokenAId": "usdc", - "tokenBId": "weth", - "fee": "0.05%", - "allowCreate": false, - "assertAddress": "0x88e6a0c2ddd26feeb64f039a2c41296fcb3f5640" - } - ] - }, - "marginlyFactory": { - "feeHolder": "0x4c576Bf4BbF1d9AB9c359414e5D2b466bab085fa", - "techPositionOwner": "0xDda7021A2F58a2C6E0C800692Cde7893b4462FB3", - "wethTokenId": "weth" - }, - "marginlyPools": [ - { - "id": "usdc-weth", - "uniswapPoolId": "usdc-weth", - "baseTokenId": "weth", - "params": { - "interestRate": "5.4%", - "maxLeverage": "20", - "swapFee": "0.1%", - "fee": "2%", - "mcSlippage": "5.0%", - "priceAgo": "15 min", - "priceAgoMC": "1 min", - "positionMinAmount": "0.001", - "quoteLimit": "20000000" - } - } - ], - "routerPools": [], - "marginlyKeeper": { - "aavePoolAddressesProvider": { - "address": "0x2f39d218133AFaB8F2B819B1066c7E434Ad94E9e" - } - } -} diff --git a/packages/deploy/src/data/deploy/ganache/deployment.json b/packages/deploy/src/data/deploy/ganache/deployment.json deleted file mode 100644 index 37e9dc74..00000000 --- a/packages/deploy/src/data/deploy/ganache/deployment.json +++ /dev/null @@ -1,11 +0,0 @@ -{ - "marginlyPools": [ - { - "id": "usdc-weth", - "address": "0x84db3def01226b6F04B43A5Ac158c3592C887d10" - } - ], - "marginlyKeeper": { - "address": "0x45Af2ae9f26f518311438B7b81E871775C901128" - } -} \ No newline at end of file diff --git a/packages/deploy/src/data/deploy/ganache/states/2023-05-10.json b/packages/deploy/src/data/deploy/ganache/states/2023-05-10.json deleted file mode 100644 index f1421d0f..00000000 --- a/packages/deploy/src/data/deploy/ganache/states/2023-05-10.json +++ /dev/null @@ -1,23 +0,0 @@ -{ - "contracts": { - "marginlyPoolImplementation": { - "address": "0x584faCc1Fa5264164F0a162d6c49Be0A128CddB8", - "txHash": "0xae0b48c5bfc941d3c036ead3d8f5e55ec83e6dcc9036f25ae797012a0bf0fcb3" - }, - "marginlyFactory": { - "address": "0x2383483485ebFdC67F8b01476e193004D1A10C38", - "txHash": "0x17340caefba374c0f5e5ea13ec21e80d5f1dda49f76956b480fce8140b8ffb79" - }, - "uniswapPool_usdc-weth": { - "address": "0x88e6A0c2dDD26FEEb64F039a2c41296FcB3f5640" - }, - "marginlyPool_usdc-weth": { - "address": "0x84db3def01226b6F04B43A5Ac158c3592C887d10", - "txHash": "0xc2899db057027df8eb01e501e0f5164d463045fbfe203fbafd0a41c6ad1dac29" - }, - "marginlyKeeper": { - "address": "0x45Af2ae9f26f518311438B7b81E871775C901128", - "txHash": "0x061071509c165356805dcbd537558335c591dc33ff0b4bf216484385c1b99309" - } - } -} \ No newline at end of file diff --git a/packages/deploy/src/data/deploy/sonic-v1.5/config.json b/packages/deploy/src/data/deploy/sonic-v1.5/config.json new file mode 100644 index 00000000..79ef5d9d --- /dev/null +++ b/packages/deploy/src/data/deploy/sonic-v1.5/config.json @@ -0,0 +1,84 @@ +{ + "systemContextDefaults": { + "ethNodeUri": "https://rpc.soniclabs.com" + }, + "connection": { + "assertChainId": 146, + "ethOptions": {} + }, + "tokens": [ + { + "id": "ws", + "address": "0x039e2fb66102314ce7b64ce5ce3e5183bc94ad38", + "assertSymbol": "wS", + "assertDecimals": 18 + }, + { + "id": "usdc.e", + "address": "0x29219dd400f2bf60e5a23d13be72b486d4038894", + "assertSymbol": "USDC.e", + "assertDecimals": 6 + } + ], + "prices": [], + "priceOracles": [ + { + "id": "uniswapV3-oracle", + "type": "uniswapV3", + "factory": "0xcb2436774C3e191c85056d248EF4260ce5f27A9D", + "settings": [ + { + "quoteTokenId": "usdc.e", + "baseTokenId": "ws", + "secondsAgo": "30 min", + "secondsAgoLiquidation": "5 sec", + "uniswapFee": "0.3%" + } + ] + } + ], + "marginlyFactory": { + "feeHolder": "0x601A564628f9467ea76945fdDC6F9C7604eE1C1E", + "techPositionOwner": "0xd48658962b93aa404fD56baa7FD07977a0EB05a9", + "wethTokenId": "ws", + "timelockOwner": "0x51941B50c7F7059e9167B60eBFA8578b807b6fbc" + }, + "marginlyPools": [ + { + "id": "ws-usdc.e", + "baseTokenId": "ws", + "quoteTokenId": "usdc.e", + "priceOracleId": "uniswapV3-oracle", + "defaultSwapCallData": "0", + "params": { + "interestRate": "5.4%", + "maxLeverage": "20", + "swapFee": "0.1%", + "fee": "0%", + "mcSlippage": "0.5%", + "positionMinAmount": "1", + "quoteLimit": "500000" + } + } + ], + "adapters": [ + { + "dexId": 0, + "adapterName": "UniswapV3Adapter", + "pools": [ + { + "type": "general", + "poolAddress": "0xEcb04e075503Bd678241f00155AbCB532c0a15Eb", + "tokenAId": "ws", + "tokenBId": "usdc.e" + } + ] + } + ], + "marginlyKeeper": { + "aaveKeeper": { + "aavePoolAddressesProvider": "0x5C2e738F6E27bCE0F7558051Bf90605dD6176900" + }, + "uniswapKeeper": false + } +} diff --git a/packages/deploy/src/data/deploy/sonic-v1.5/deployment.json b/packages/deploy/src/data/deploy/sonic-v1.5/deployment.json new file mode 100644 index 00000000..d953ce69 --- /dev/null +++ b/packages/deploy/src/data/deploy/sonic-v1.5/deployment.json @@ -0,0 +1,11 @@ +{ + "marginlyPools": [ + { + "id": "ws-usdc.e", + "address": "0xE08Fa38f77041Aa8917CD5a5A758c18Ea54B5F62" + } + ], + "aaveKeeperDeployResult": { + "address": "0x0D889a355456963A416a0b8611fb76c2bB5c69D3" + } +} \ No newline at end of file diff --git a/packages/deploy/src/data/deploy/sonic-v1.5/states/2025-04-14.json b/packages/deploy/src/data/deploy/sonic-v1.5/states/2025-04-14.json new file mode 100644 index 00000000..57f5341b --- /dev/null +++ b/packages/deploy/src/data/deploy/sonic-v1.5/states/2025-04-14.json @@ -0,0 +1,32 @@ +{ + "contracts": { + "priceOracle_uniswapV3-oracle": { + "address": "0x491B373Bc80bC068BC63e5e7E5E57F0dfe9c84c5", + "txHash": "0xb9d86bb104f066a3af13982c2cd9e0269033ed7bd6cefbbde372703fcf927ddb" + }, + "UniswapV3Adapter_0": { + "address": "0x5D64b2eF00dAd0C6569AEcdB0D53B7fd77d894c7", + "txHash": "0x84ecf11e96016b06e4d3333956e366d653559b284d8c1338ad89c722ebc23bf5" + }, + "MarginlyRouter": { + "address": "0xb97Ee3d7D910d262e1E15e6E5c35b0aECF37c3C8", + "txHash": "0xf0f57dabdc4c97c068068522e60a087fcdc5d0c0e465f442a458621eca5510ca" + }, + "marginlyPoolImplementation": { + "address": "0x45Bc538D5FAaB8ac33a520c6acBD689575c2F082", + "txHash": "0x7eff3665d71000b053967dd56fbc78ea9cdf33558b43c8ef1b1e4f6c782bf99c" + }, + "marginlyFactory": { + "address": "0x798A2FEb73E82D44b2148e37f02367CFb6ea3674", + "txHash": "0x1dd0b4b962973a85099087cdee13374031bd9043d44d5b5fedfdf56e42abad93" + }, + "marginlyKeeperAave": { + "address": "0x0D889a355456963A416a0b8611fb76c2bB5c69D3", + "txHash": "0xec337a2cddbe55a0d08696b3d9cb69dbb6225553ea3c8814e29ee77849dd1ed3" + }, + "marginlyPool_ws-usdc.e": { + "address": "0xE08Fa38f77041Aa8917CD5a5A758c18Ea54B5F62", + "txHash": "0x426ee7b93f355d0f3f6ec0590f97edb9c88fe7352f98ba0e4db9955dd06132b3" + } + } +} \ No newline at end of file diff --git a/packages/int-tests/src/index.ts b/packages/int-tests/src/index.ts index 6a0c098b..66b31ba4 100644 --- a/packages/int-tests/src/index.ts +++ b/packages/int-tests/src/index.ts @@ -17,7 +17,7 @@ import { Web3Provider } from '@ethersproject/providers'; const forkBlockNumber = 17265384; const server = ganache.server({ fork: { - url: `https://rpc.ankr.com/eth@17265384`, + url: `https://ethereum-rpc.publicnode.com`, blockNumber: forkBlockNumber, }, wallet: { diff --git a/packages/periphery/hardhat-configs/hardhat.config.ts b/packages/periphery/hardhat-configs/hardhat.config.ts index a2d482a6..c341a1b1 100644 --- a/packages/periphery/hardhat-configs/hardhat.config.ts +++ b/packages/periphery/hardhat-configs/hardhat.config.ts @@ -38,12 +38,16 @@ const config = { artioTestnet: { url: 'https://artio.rpc.berachain.com', }, + sonic: { + url: 'https://rpc.soniclabs.com', + }, }, etherscan: { apiKey: { mainnet: process.env.API_KEY, arbitrumOne: process.env.API_KEY, artioTestnet: 'artio_testnet', + sonic: process.env.SONIC_API_KEY, }, customChains: [ { @@ -54,6 +58,14 @@ const config = { browserURL: 'https://artio.beratrail.io', }, }, + { + network: 'sonic', + chainId: 146, + urls: { + apiURL: 'https://api.sonicscan.org/api', + browserURL: 'https://sonicscan.org', + }, + }, ], }, mocha: { diff --git a/packages/router/hardhat.config.ts b/packages/router/hardhat.config.ts index 7c62c906..c8c9387c 100644 --- a/packages/router/hardhat.config.ts +++ b/packages/router/hardhat.config.ts @@ -33,6 +33,9 @@ const config = { arbitrumSepolia: { url: 'https://sepolia-rollup.arbitrum.io/rpc', }, + sonic: { + url: 'https://rpc.soniclabs.com', + }, }, etherscan: { apiKey: { @@ -41,6 +44,7 @@ const config = { arbitrumGoerli: process.env.API_KEY, arbitrumOne: process.env.API_KEY, artio_testnet: 'artio_testnet', + sonic: process.env.SONIC_API_KEY, }, customChains: [ { @@ -59,6 +63,14 @@ const config = { browserURL: 'https://artio.beratrail.io', }, }, + { + network: 'sonic', + chainId: 146, + urls: { + apiURL: 'https://api.sonicscan.org/api', + browserURL: 'https://sonicscan.org', + }, + }, ], }, mocha: { diff --git a/packages/timelock/deployment/sonic/deployment-TimelockWhitelist-2025-04-14.json b/packages/timelock/deployment/sonic/deployment-TimelockWhitelist-2025-04-14.json new file mode 100644 index 00000000..fbe6f72c --- /dev/null +++ b/packages/timelock/deployment/sonic/deployment-TimelockWhitelist-2025-04-14.json @@ -0,0 +1,7 @@ +{ + "TimelockControllerWhitelist": { + "address": "0x51941B50c7F7059e9167B60eBFA8578b807b6fbc", + "txHash": "0x3489ad46649bad381529013dd295e3c7a73f61da5e6488173c3f321b7458998c", + "blockNumber": 20174442 + } +} diff --git a/packages/timelock/hardhat.common.ts b/packages/timelock/hardhat.common.ts index 88667d95..e8a1da6e 100644 --- a/packages/timelock/hardhat.common.ts +++ b/packages/timelock/hardhat.common.ts @@ -21,7 +21,20 @@ const config: HardhatUserConfig & { contractSizer: any } = { ], }, etherscan: { - apiKey: process.env.API_KEY, + apiKey: { + ethereum: process.env.API_KEY, + sonic: process.env.SONIC_API_KEY, + }, + customChains: [ + { + network: 'sonic', + chainId: 146, + urls: { + apiURL: 'https://api.sonicscan.org/api', + browserURL: 'https://sonicscan.org', + }, + }, + ], }, mocha: { timeout: 2_000_000, diff --git a/packages/timelock/hardhat.config.ts b/packages/timelock/hardhat.config.ts index af39ecd1..65725f52 100644 --- a/packages/timelock/hardhat.config.ts +++ b/packages/timelock/hardhat.config.ts @@ -15,6 +15,9 @@ const config = { holesky: { url: 'https://1rpc.io/holesky', }, + sonic: { + url: 'https://rpc.soniclabs.com', + }, }, }; diff --git a/packages/timelock/package.json b/packages/timelock/package.json index 6e463140..2643bc20 100644 --- a/packages/timelock/package.json +++ b/packages/timelock/package.json @@ -22,6 +22,8 @@ "@typechain/hardhat": "^9.1.0", "@types/jest": "^29.2.5", "@types/mocha": "^10.0.7", + "@types/prompts": "^2.4.2", + "prompts": "2.4.2", "@typescript-eslint/eslint-plugin": "^7.17.0", "@typescript-eslint/parser": "^7.17.0", "@uniswap/snapshot-gas-cost": "^1.0.0", diff --git a/packages/timelock/tasks/timelock.ts b/packages/timelock/tasks/timelock.ts index 5c4c4d28..a2614708 100644 --- a/packages/timelock/tasks/timelock.ts +++ b/packages/timelock/tasks/timelock.ts @@ -11,20 +11,18 @@ import { TimelockController, } from '../typechain-types'; -import { saveDeploymentData, verifyContract } from './utils'; +import { getSigner, saveDeploymentData, SignerArgs, taskWithSigner, verifyContract } from './utils'; import { MarginlyParamsStruct } from '../typechain-types/contracts/test/MockMarginlyFactory.sol/MockMarginlyFactory'; interface DeployArgs { signer: string; } -//npx hardhat --network holesky --config hardhat.config.ts deploy-timelock-wl --signer -task('deploy-timelock-wl', 'Deploy timelock contract and transfer ownership from router') - .addParam('signer', 'Private key of contracts creator') - .setAction(async (taskArgs: DeployArgs, hre: HardhatRuntimeEnvironment) => { +//npx hardhat --network holesky --config hardhat.config.ts deploy-timelock-wl --keystore +taskWithSigner('deploy-timelock-wl', 'Deploy timelock contract and transfer ownership from router').setAction( + async (taskArgs: SignerArgs, hre: HardhatRuntimeEnvironment) => { const provider = hre.ethers.provider; - - let signer = new hre.ethers.Wallet(taskArgs.signer, provider); + let signer = await getSigner(taskArgs, provider); const configDir = `../deployment/${hre.network.name}`; @@ -40,29 +38,10 @@ task('deploy-timelock-wl', 'Deploy timelock contract and transfer ownership from const setParametersSignature = marginlyPoolInterface.getFunction('setParameters').selector; const whitelisted = [ - ['0xF8D88A292B0afa85E5Cf0d1195d0D3728Cfd7070', createPoolSignature], // factory - ['0xa77C2275C1F403056c7F73B44df69E374C299dd7', setParametersSignature], //pt-weeth-26dec2024-weth - ['0x4Cac44a1C50fea3F458f5F31529C0810AFcac497', setParametersSignature], //pt-weeth-26dec2024-weeth - ['0xb34DfB03973e148ED800F369EdE84b92803116CA', setParametersSignature], //pt-ezeth-26dec2024-ezeth - ['0x548F66BC804CB806ae5Ba3FeeE492a49FD8ef173', setParametersSignature], //pt-rseth-26dec2024-rseth - ['0xafcC4F047a1012c4b51B69c7C1bB39C5F38F0305', setParametersSignature], //pt-ageth-26dec2024-ageth - ['0xcAbAE9295e274c152b9DcCC124AB06cf78d079Eb', setParametersSignature], //pt-amphrlrt-26dec2024-amphrlrt - ['0x2F06faF2A2EEFfBd44a796b8c6d2D04841c6488C', setParametersSignature], //pt-ebtc-26dec2024-ebtc - ['0xee07F58A274Ebc50f79ccd1d67fF73426a317dAf', setParametersSignature], //pt-weeths-26dec2024-weeths - ['0x1F1A9004F00571Ea0Ed79e51bfd2Cdc3954abc40', setParametersSignature], //pt-pufeth-26dec2024-pufeth - ['0x530043876F37170468a9F366145E645BEE86da6C', setParametersSignature], //pt-amphreth-26dec2024-amphreth - ['0x2Df52e18e0fcA1E8CEE272cD034368278a49125f', setParametersSignature], //pt-re7lrt-26dec2024-re7lrt - ['0x32d850609FDc950bF6E23640d1EB0bbd60a5149c', setParametersSignature], //pt-cornlbtc-26dec2024-lbtc - ['0x49755E70285dE0c624e0750543046131CB7163de', setParametersSignature], //pt-corn-unibtc-26dec2024-unibtc - ['0x3D6f0097FA10f2e3855377daF2139dBeD66Fb343', setParametersSignature], //pt-cornlbtc-26dec2024-wbtc - ['0x056888DD4B31cA090E2FC7ca87AF62B588dD8207', setParametersSignature], //pt-corn-unibtc-26dec2024-wbtc - ['0xEe368c5014D218795F76DcDA58e8FD24D04E19Ff', setParametersSignature], //pt-corn-pumpbtc-26dec2024-wbtc - ['0xB95b9f7763de009a4E6c739855faCDfA960eB893', setParametersSignature], //pt-lbtc-27mar2025-wbtc - ['0xa692B4fb38f8e9aEA229DA05CC2FC9d748218CD3', setParametersSignature], //pt-pufeth-26dec2024-weth - ['0xaE2e6412d5c47e23c55c87e65cb2721Fa799Cb96', setParametersSignature], //pt-weeths-26dec2024-weth - ['0x49D7712f65B291E4574726d6e263a4E6Af2830F0', setParametersSignature], //pt-rseth-26dec2024-weth - ['0xf7710a79F2440423e5865EB3a7DF3e47a430859F', setParametersSignature], //pt-lbtc-27mar2025-lbtc - ['0xd88855292819e34388833A3cb5524eEDf25010AE', setParametersSignature], //pt-ebtc-27mar2025-ebtc + ['0x798A2FEb73E82D44b2148e37f02367CFb6ea3674', createPoolSignature], // factory trading + ['0xE08Fa38f77041Aa8917CD5a5A758c18Ea54B5F62', setParametersSignature], // wS / USDC.e pool + ['0x1768Faee0A63927FeB81100046f5D63BfE0f08dB', createPoolSignature], //factory farming + ['0xb312d61915c878938fce09d13dd3006c6835b3e5', setParametersSignature], // PT-asonUSDC-14Aug2025/USDC.e ]; const whitelistedTargets = whitelisted.map((x) => x[0]); @@ -100,15 +79,15 @@ task('deploy-timelock-wl', 'Deploy timelock contract and transfer ownership from whitelistedTargets, whitelistedMethods, ]); - }); + } +); //npx hardhat --network holesky --config hardhat.config.ts deploy-timelock --signer -task('deploy-timelock', 'Deploy timelock contract and transfer ownership from router') - .addParam('signer', 'Private key of contracts creator') - .setAction(async (taskArgs: DeployArgs, hre: HardhatRuntimeEnvironment) => { +taskWithSigner('deploy-timelock', 'Deploy timelock contract and transfer ownership from router').setAction( + async (taskArgs: SignerArgs, hre: HardhatRuntimeEnvironment) => { const provider = hre.ethers.provider; - let signer = new hre.ethers.Wallet(taskArgs.signer, provider); + let signer = await getSigner(taskArgs, provider); const configDir = `../deployment/${hre.network.name}`; @@ -151,101 +130,88 @@ task('deploy-timelock', 'Deploy timelock contract and transfer ownership from ro await saveDeploymentData('TimelockController', deploymentData, configDir); await verifyContract(hre, timelockAddress, [initialMinDelay, proposers, executors, admin]); - }); + } +); -//npx hardhat --network holesky --config hardhat.config.ts timelock-grant-role --signer -task('timelock-grant-role') - .addParam('signer', 'Private key of contracts creator') - .setAction(async (taskArgs: DeployArgs, hre: HardhatRuntimeEnvironment) => { - const provider = hre.ethers.provider; +//npx hardhat --network holesky --config hardhat.config.ts timelock-grant-role --keystore +taskWithSigner('timelock-grant-role').setAction(async (taskArgs: SignerArgs, hre: HardhatRuntimeEnvironment) => { + const provider = hre.ethers.provider; - let signer = new hre.ethers.Wallet(taskArgs.signer, provider); + let signer = await getSigner(taskArgs, provider); - const cancellers = []; - const timelockAddress = ''; + const cancellers = []; + const timelockAddress = ''; - const timelock = TimelockController__factory.connect(timelockAddress, signer) as any as TimelockController; - const role = await timelock.CANCELLER_ROLE(); + const timelock = TimelockController__factory.connect(timelockAddress, signer) as any as TimelockController; + const role = await timelock.CANCELLER_ROLE(); - const delay = await timelock.getMinDelay(); + const delay = await timelock.getMinDelay(); - for (let i = 0; i < cancellers.length; i++) { - const grantCancellerRole = await timelock.interface.encodeFunctionData('grantRole', [role, cancellers[i]]); - - const txReceipt = await timelock.schedule( - timelock, - 0, - grantCancellerRole, - ethers.ZeroHash, - ethers.ZeroHash, - delay - ); - if (delay == 0n) { - await txReceipt.wait(); - await timelock.execute(timelock, 0, grantCancellerRole, ethers.ZeroHash, ethers.ZeroHash); - } + for (let i = 0; i < cancellers.length; i++) { + const grantCancellerRole = await timelock.interface.encodeFunctionData('grantRole', [role, cancellers[i]]); + + const txReceipt = await timelock.schedule(timelock, 0, grantCancellerRole, ethers.ZeroHash, ethers.ZeroHash, delay); + if (delay == 0n) { + await txReceipt.wait(); + await timelock.execute(timelock, 0, grantCancellerRole, ethers.ZeroHash, ethers.ZeroHash); } - }); + } +}); //npx hardhat --network holesky --config hardhat.config.ts timelock-set-delay --signer -task('timelock-set-delay') - .addParam('signer', 'Private key of contracts creator') - .setAction(async (taskArgs: DeployArgs, hre: HardhatRuntimeEnvironment) => { - const provider = hre.ethers.provider; +taskWithSigner('timelock-set-delay').setAction(async (taskArgs: SignerArgs, hre: HardhatRuntimeEnvironment) => { + const provider = hre.ethers.provider; - let signer = new hre.ethers.Wallet(taskArgs.signer, provider); + let signer = await getSigner(taskArgs, provider); - const timelockAddress = ''; + const timelockAddress = ''; - const timelock = TimelockController__factory.connect(timelockAddress, signer) as any as TimelockController; - const delay = 259_200; // 3 * 24 * 60 * 60 + const timelock = TimelockController__factory.connect(timelockAddress, signer) as any as TimelockController; + const delay = 259_200; // 3 * 24 * 60 * 60 - const updateDelayData = await timelock.interface.encodeFunctionData('updateDelay', [delay]); + const updateDelayData = await timelock.interface.encodeFunctionData('updateDelay', [delay]); - const txReceipt = await timelock.schedule(timelock, 0, updateDelayData, ethers.ZeroHash, ethers.ZeroHash, 0); - await txReceipt.wait(); + const txReceipt = await timelock.schedule(timelock, 0, updateDelayData, ethers.ZeroHash, ethers.ZeroHash, 0); + await txReceipt.wait(); - await timelock.execute(timelock, 0, updateDelayData, ethers.ZeroHash, ethers.ZeroHash); - }); + await timelock.execute(timelock, 0, updateDelayData, ethers.ZeroHash, ethers.ZeroHash); +}); //npx hardhat --network holesky --config hardhat.config.ts timelock-accept-ownership --signer -task('timelock-accept-ownership') - .addParam('signer', 'Private key of contracts creator') - .setAction(async (taskArgs: DeployArgs, hre: HardhatRuntimeEnvironment) => { - const provider = hre.ethers.provider; +taskWithSigner('timelock-accept-ownership').setAction(async (taskArgs: SignerArgs, hre: HardhatRuntimeEnvironment) => { + const provider = hre.ethers.provider; - let signer = new hre.ethers.Wallet(taskArgs.signer, provider); + let signer = await getSigner(taskArgs, provider); - const ownableContractAddress = ''; - const ownableContract = Ownable2Step__factory.connect(ownableContractAddress, signer); - const timelockAddress = ''; + const ownableContractAddress = ''; + const ownableContract = Ownable2Step__factory.connect(ownableContractAddress, signer); + const timelockAddress = ''; - const timelock = TimelockController__factory.connect(timelockAddress, signer) as any as TimelockController; - const acceptOwnershipCallData = await ownableContract.interface.encodeFunctionData('acceptOwnership'); + const timelock = TimelockController__factory.connect(timelockAddress, signer) as any as TimelockController; + const acceptOwnershipCallData = await ownableContract.interface.encodeFunctionData('acceptOwnership'); - const delay = await timelock.getMinDelay(); - const txReceipt = await timelock.schedule( - ownableContract, - 0, - acceptOwnershipCallData, - ethers.ZeroHash, - ethers.ZeroHash, - delay - ); + const delay = await timelock.getMinDelay(); + const txReceipt = await timelock.schedule( + ownableContract, + 0, + acceptOwnershipCallData, + ethers.ZeroHash, + ethers.ZeroHash, + delay + ); - if (delay == 0n) { - await txReceipt.wait(); - await timelock.execute(ownableContract, 0, acceptOwnershipCallData, ethers.ZeroHash, ethers.ZeroHash); - } - }); + if (delay == 0n) { + await txReceipt.wait(); + await timelock.execute(ownableContract, 0, acceptOwnershipCallData, ethers.ZeroHash, ethers.ZeroHash); + } +}); //npx hardhat --network holesky --config hardhat.config.ts timelock-transfer-ownership --signer -task('timelock-transfer-ownership') - .addParam('signer', 'Private key of contracts creator') - .setAction(async (taskArgs: DeployArgs, hre: HardhatRuntimeEnvironment) => { +taskWithSigner('timelock-transfer-ownership').setAction( + async (taskArgs: SignerArgs, hre: HardhatRuntimeEnvironment) => { const provider = hre.ethers.provider; - let signer = new hre.ethers.Wallet(taskArgs.signer, provider); + let signer = await getSigner(taskArgs, provider); const ownableContractAddress = '0xe8632C0BA276B245988885A37E3B1A3CeeD0D469'; const ownableContract = Ownable2Step__factory.connect(ownableContractAddress, signer); @@ -271,15 +237,15 @@ task('timelock-transfer-ownership') await txReceipt.wait(); await timelock.execute(ownableContract, 0, transferOwnershipCallData, ethers.ZeroHash, ethers.ZeroHash); } - }); + } +); //npx hardhat --network holesky --config hardhat.config.ts factory-transfer-ownership --signer -task('factory-transfer-ownership', 'Change factory owner to timelock') - .addParam('signer', 'Private key of contracts creator') - .setAction(async (taskArgs: DeployArgs, hre: HardhatRuntimeEnvironment) => { +taskWithSigner('factory-transfer-ownership', 'Change factory owner to timelock').setAction( + async (taskArgs: SignerArgs, hre: HardhatRuntimeEnvironment) => { const provider = hre.ethers.provider; - let signer = new hre.ethers.Wallet(taskArgs.signer, provider); + let signer = await getSigner(taskArgs, provider); const timelockAddress = '0x8cDAf202eBe2f38488074DcFCa08c0B0cB7B8Aa5'; const factoryAddress = '0xF8D88A292B0afa85E5Cf0d1195d0D3728Cfd7070'; @@ -318,14 +284,14 @@ task('factory-transfer-ownership', 'Change factory owner to timelock') await timelock.connect(signer).execute(timelock, 0n, updateMinDelay, ethers.ZeroHash, ethers.ZeroHash) ).wait(); console.log('Executed update minDelay from 0 to 3 days'); - }); + } +); //npx hardhat --network holesky --config hardhat.config.ts timelock-execute --signer -task('timelock-execute', 'Timelock schedule and execute operation') - .addParam('signer', 'Private key of contracts creator') - .setAction(async (taskArgs: DeployArgs, hre: HardhatRuntimeEnvironment) => { +taskWithSigner('timelock-execute', 'Timelock schedule and execute operation').setAction( + async (taskArgs: SignerArgs, hre: HardhatRuntimeEnvironment) => { const provider = hre.ethers.provider; - const signer = new hre.ethers.Wallet(taskArgs.signer, provider); + const signer = await getSigner(taskArgs, provider); const timelockAddress = '0xc71968f413bF7EDa0d11629e0Cedca0831967cD3'; const timelock = TimelockWhitelist__factory.connect(timelockAddress, signer); @@ -369,4 +335,5 @@ task('timelock-execute', 'Timelock schedule and execute operation') const readyTimestamp = await timelock.getTimestamp(operationId); console.log('Operation pending. Ready at ', new Date(Number(readyTimestamp) * 1000)); } - }); + } +); diff --git a/packages/timelock/tasks/utils.ts b/packages/timelock/tasks/utils.ts index d9ec0dfd..398b419d 100644 --- a/packages/timelock/tasks/utils.ts +++ b/packages/timelock/tasks/utils.ts @@ -1,6 +1,9 @@ -import { HardhatRuntimeEnvironment } from 'hardhat/types'; +import { ConfigurableTaskDefinition, HardhatRuntimeEnvironment } from 'hardhat/types'; import * as fs from 'fs'; import path from 'path'; +import { ethers } from 'ethers'; +import prompts from 'prompts'; +import { task } from 'hardhat/config'; export async function saveDeploymentData(contractId: string, deploymentData: any, configDir: string): Promise { const date = new Date(); @@ -34,3 +37,69 @@ export async function verifyContract(hre: HardhatRuntimeEnvironment, address: st export function delay(ms: number) { return new Promise((resolve) => setTimeout(resolve, ms)); } + +export interface SignerArgs { + privateKey?: string; + keystore?: string; + keystorePassword?: string; +} + +/** + * Create a task with signer arguments + * @param name the name of the task + * @param description the description of the task + * @returns a task with signer arguments + */ +export function taskWithSigner(name: string, description?: string): ConfigurableTaskDefinition { + return task(name, description) + .addOptionalParam('privateKey', 'Private key of contracts creator') + .addOptionalParam('keystore', 'Keystore file path') + .addOptionalParam('keystorePassword', 'Keystore file password'); +} + +/** + * Returns a signer object from given signer arguments. + * If signer arguments contain a private key, it is used to create the signer. + * If signer arguments contain a keystore file path, the keystore is decrypted + * using the provided password and the wallet is created from it. + * If no keystore password is provided, the user is prompted to enter it interactively. + * If no private key or keystore is provided, the user is prompted to enter a private key interactively. + * @param signerArgs signer arguments + * @param provider optional provider to connect the wallet to + * @returns a signer object + */ +export async function getSigner(signerArgs: SignerArgs, provider?: ethers.Provider | null): Promise { + const readSensitiveData = async (label: string): Promise => { + const response = await prompts({ + type: 'invisible', + name: 'result', + message: label, + }); + + return response.result as string; + }; + + if (signerArgs.privateKey) { + console.warn('\n!!! Using private key in plain text is not recommended\n'); + return new ethers.Wallet(signerArgs.privateKey); + } else if (signerArgs.keystore) { + let keystorePassword = ''; + if (signerArgs.keystorePassword) { + console.warn('\n!!! Use interactive mode to enter keystore password\n'); + keystorePassword = signerArgs.keystorePassword; + } else { + keystorePassword = await readSensitiveData('Enter keystore password'); + } + const jsonKeystore = fs.readFileSync(signerArgs.keystore, 'utf8'); + + const wallet = ethers.Wallet.fromEncryptedJsonSync(jsonKeystore, keystorePassword) as ethers.Wallet; + if (!wallet) { + throw new Error('Could not create wallet from keystore'); + } + + return provider ? wallet.connect(provider) : wallet; + } else { + const privateKey = await readSensitiveData('Enter signer private key'); + return new ethers.Wallet(privateKey, provider); + } +} diff --git a/scripts/build_script.sh b/scripts/build_script.sh index 0d554b1e..1bff4404 100755 --- a/scripts/build_script.sh +++ b/scripts/build_script.sh @@ -46,11 +46,11 @@ echo "build oracle" yarn workspace @marginly/oracle install yarn workspace @marginly/oracle build -echo "build contest-winner-nft" -yarn workspace @marginly/contest-winner-nft install -yarn workspace @marginly/contest-winner-nft typechain -yarn workspace @marginly/contest-winner-nft compile -yarn workspace @marginly/contest-winner-nft build +# echo "build contest-winner-nft" +# yarn workspace @marginly/contest-winner-nft install +# yarn workspace @marginly/contest-winner-nft typechain +# yarn workspace @marginly/contest-winner-nft compile +# yarn workspace @marginly/contest-winner-nft build echo "build cli" yarn workspace @marginly/cli install diff --git a/yarn.lock b/yarn.lock index dee1c376..5d50f640 100644 --- a/yarn.lock +++ b/yarn.lock @@ -13661,7 +13661,7 @@ promise@^8.0.0, promise@^8.1.0: dependencies: asap "~2.0.6" -prompts@^2.0.1, prompts@^2.4.2: +prompts@2.4.2, prompts@^2.0.1, prompts@^2.4.2: version "2.4.2" resolved "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz" integrity sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==