From de51c4035eb6307d50c4936baa4bef1634421d5b Mon Sep 17 00:00:00 2001 From: Daniel <77058885+0xDEnYO@users.noreply.github.com> Date: Wed, 4 Dec 2024 13:37:26 +0700 Subject: [PATCH] Gas zip facet revisited [GasZipFacet v2.0.0,IGasZip v1.0.0,GasZipPeriphery v1.0.0] (#807) * wip zip * feat: zip erc20 with libswap * chore: update bsc gaszip address * clean * chore: updated gaszip routers + add docs * chore: deployRequirements * chore: remove allowedToken * chore: withdraw wallet from global config * chore: comments * chore: import * chore: remove owner * chore: unused import * chore: remove unused errors * forge install: solady v0.0.208 * forge install: solady v0.0.208 * added test and fixed some issues in the contract * adds refundAddress parameter for ERC20 * forge install: solady v0.0.208 * forge install: solady v0.0.208 * tests updated * gasZip redeployed to BSC staging * update .gitmodules file * removes ERC20 refund handling and adds complex test case * removes coverage files * cleanup * update docs * adds complex native test case * deploys GasZipFacet to BSC staging * fixes issue in deploy log file * adds a function with deposit for standalone gas-zip only calls * adds the usual startBridge... functions to the facet + tests * adds a amountOutMin parameter for ERC20 deposit function * redeployed gasZipFacet to bsc staging * feat: removes destinationChains parameter from GasZipData * docs: updates GasZipFacet docs * updates facet (startBridge => nativeOnly) * replaces amountOutMin parameter with balance checks & updates tests * updates docs * fixes typo in URL and adds link to config file * restricts swapAndBridge.. function to native only + updates tests * restricts swapAndBridge.. function to native only + updates tests * redeployed gasZipFacet to bsc staging * Gas.Zip split into facet & periphery, tests and docs added * remove receiver address from GasZipData struct * minor fixes * some changes based on coderabbit review comments * opens swapAndBridge on GasZipFacet for both ERC20 and native * deployed to bsc staging * updated gasZip to use V2 router * updates git actions and docs * adds an amount parameter to native deposit function in periphery * redeployed GasZipPeriphery to bsc staging * returns leftover native funds to msg.sender after deposit plus bsc staging redeployment * bugfix + bsc staging redeploy * bugfix#2 + bsc staging redeploy * adds a test case to increase coverage to 100% * minor fixes * gas optimization of helper function (audit issue #1) * remove unused error (audit issue #2) * adds check for msg.value==amount and removes refundExcessNative mod (audit issue#4) * replaces require with custom error (audit issue#6) * adds WithdrawablePeriphery for stuck token withdrawals (audit issue#8) * adds WithdrawablePeriphery base contract for token withdrawals * adds receiverAddress check (audit issue#9) * fix test * adds version tag to contract * ensures last swap output is native before bridging (audit issue#5) * removes validateBridgeData modifier and adds dedicated bridgeData checks (audit issue#3) * redeployed gasZipPeriphery with PROD LiFiDEXAggregator address * audit report added * change facet variable to constant * change parameter name and order in GasZipData * redeployed to BSC staging * test coverage back to 100% * redeployed to BSC staging * add complex testcase for destinationChains value * adjust test case * fix staging diamond log * replaces low-level native transfer with function from solady lib * removes unused import (re-audit issue#11) * update (re-)audit report * remove old gaszip audit entry * fix incorrect path in audit log * Redeploy to production (except zksync) * Update pragma * update audit * deploy to zksync * adds GasZipPeriphery addresses to dexs.json * make error message more visible in console output * update some diamond logs * remove old openzeppelin lib * forge install: openzeppelin-contracts v4.9.2 * reinstall openzeppelin contracts 4.9.2 * add gasZipPeriphery sigs * fix json * fix json * fix logs * diamond logs updated * undo (wording) changes in git action --------- Co-authored-by: Leonardo Cascianelli Co-authored-by: Daniela Chybisova Co-authored-by: Max Klenk Co-authored-by: Ed Zynda Co-authored-by: Ed Zynda --- audit/auditLog.json | 16 + audit/reports/2024.11.07_GasZip.pdf | Bin 0 -> 31309 bytes config/dexs.json | 36 +- config/gaszip.json | 24 + config/global.json | 2 +- config/sigs.json | 4 +- deployments/_deployments_log_file.json | 570 ++++++++++++++++++ deployments/arbitrum.diamond.json | 7 +- deployments/arbitrum.json | 4 +- deployments/avalanche.diamond.json | 7 +- deployments/avalanche.json | 2 + deployments/base.diamond.json | 7 +- deployments/base.json | 2 + deployments/blast.diamond.json | 3 +- deployments/blast.json | 2 + deployments/bsc.diamond.json | 3 +- deployments/bsc.diamond.staging.json | 11 +- deployments/bsc.json | 2 + deployments/bsc.staging.json | 7 +- deployments/fantom.diamond.json | 3 +- deployments/fantom.json | 4 +- deployments/gnosis.diamond.json | 3 +- deployments/gnosis.json | 4 +- deployments/gravity.diamond.json | 7 +- deployments/gravity.json | 4 +- deployments/linea.diamond.json | 7 +- deployments/linea.json | 6 +- deployments/mainnet.diamond.json | 3 +- deployments/mainnet.json | 2 + deployments/mantle.diamond.json | 1 + deployments/mantle.json | 4 +- deployments/metis.diamond.json | 3 +- deployments/metis.json | 4 +- deployments/mode.diamond.json | 3 +- deployments/mode.json | 6 +- deployments/optimism.diamond.json | 3 +- deployments/optimism.json | 4 +- deployments/polygon.diamond.json | 7 +- deployments/polygon.json | 2 + deployments/scroll.diamond.json | 3 +- deployments/scroll.json | 6 +- deployments/taiko.diamond.json | 3 +- deployments/taiko.json | 4 +- deployments/xlayer.diamond.json | 7 +- deployments/xlayer.json | 4 +- deployments/zksync.diamond.json | 7 +- deployments/zksync.json | 2 + docs/GasZipFacet.md | 52 ++ docs/GasZipPeriphery.md | 57 ++ package.json | 1 + script/deploy/_targetState.json | 150 +++-- script/deploy/facets/DeployGasZipFacet.s.sol | 36 ++ .../deploy/facets/DeployGasZipPeriphery.s.sol | 59 ++ script/deploy/facets/UpdateGasZipFacet.s.sol | 13 + .../deploy/resources/deployRequirements.json | 23 + script/deploy/safe/propose-to-safe.ts | 29 +- script/deploy/zksync/DeployGasZipFacet.s.sol | 36 ++ .../deploy/zksync/DeployGasZipPeriphery.s.sol | 59 ++ script/tasks/diamondSyncDEXs.sh | 2 +- src/Facets/GasZipFacet.sol | 142 +++++ src/Interfaces/IGasZip.sol | 20 + src/Periphery/GasZipPeriphery.sol | 125 ++++ test/solidity/Facets/GasZipFacet.t.sol | 494 +++++++++++++++ test/solidity/Facets/MayanFacet.t.sol | 1 - test/solidity/Periphery/GasZipPeriphery.t.sol | 531 ++++++++++++++++ test/solidity/utils/TestBase.sol | 2 +- yarn.lock | 468 +++++++++++++- 67 files changed, 2986 insertions(+), 139 deletions(-) create mode 100644 audit/reports/2024.11.07_GasZip.pdf create mode 100644 config/gaszip.json create mode 100644 docs/GasZipFacet.md create mode 100644 docs/GasZipPeriphery.md create mode 100644 script/deploy/facets/DeployGasZipFacet.s.sol create mode 100644 script/deploy/facets/DeployGasZipPeriphery.s.sol create mode 100644 script/deploy/facets/UpdateGasZipFacet.s.sol create mode 100644 script/deploy/zksync/DeployGasZipFacet.s.sol create mode 100644 script/deploy/zksync/DeployGasZipPeriphery.s.sol create mode 100644 src/Facets/GasZipFacet.sol create mode 100644 src/Interfaces/IGasZip.sol create mode 100644 src/Periphery/GasZipPeriphery.sol create mode 100644 test/solidity/Facets/GasZipFacet.t.sol create mode 100644 test/solidity/Periphery/GasZipPeriphery.t.sol diff --git a/audit/auditLog.json b/audit/auditLog.json index 7e73b0108..37337d342 100644 --- a/audit/auditLog.json +++ b/audit/auditLog.json @@ -35,6 +35,13 @@ "auditReportPath": "./audit/reports/2024.11.05_EmergencyPauseFacet_ReAudit.pdf", "auditCommitHash": "da61880ba3847c07c35b64a78b957ff845ec18ac" }, + "audit20241107": { + "auditCompletedOn": "07.11.2024", + "auditedBy": "Sujith Somraaj (individual security researcher)", + "auditorGitHandle": "sujithsomraaj", + "auditReportPath": "./audit/reports/2024.11.07_GasZip.pdf", + "auditCommitHash": "2d8927ababff6ace0c577d92407bcf289ebb89c0" + }, "audit20241122": { "auditCompletedOn": "22.11.2024", "auditedBy": "Sujith Somraaj (individual security researcher)", @@ -50,6 +57,15 @@ "AcrossFacetPackedV3": { "1.0.0": ["audit20241007"] }, + "GasZipFacet": { + "2.0.0": ["audit20241107"] + }, + "GasZipPeriphery": { + "1.0.0": ["audit20241107"] + }, + "IGasZip": { + "1.0.0": ["audit20241107"] + }, "EmergencyPauseFacet": { "1.0.0": ["audit20240913"], "1.0.1": ["audit20241105"] diff --git a/audit/reports/2024.11.07_GasZip.pdf b/audit/reports/2024.11.07_GasZip.pdf new file mode 100644 index 0000000000000000000000000000000000000000..d1d9d46a9332cb51fe7c0ba2c124f2f10d73f3b0 GIT binary patch literal 31309 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 bM<;y;C%2z!6^faGgP8$}lvG4c6zcx~PwOyJ literal 0 HcmV?d00001 diff --git a/config/dexs.json b/config/dexs.json index c0f907558..7e4cacf6d 100644 --- a/config/dexs.json +++ b/config/dexs.json @@ -41,7 +41,8 @@ "0x19dBa5df5383168f760617aaDD23322BC5F9Ff7b", "0x827179dD56d07A7eeA32e3873493835da2866976", "0xf2614A233c7C3e7f08b1F887Ba133a13f1eb2c55", - "0xbbbbbBB520d69a9775E85b458C58c648259FAD5F", + "0x9a21E33F1a78b17DAd32010CeDB9Fd2F071C17d3", + "0xbbbbbBB520d69a9775E85b458C58c648259FAD5F" "0x7d0ccaa3fac1e5a943c5168b6ced828691b46b36", "0x40aA958dd87FC8305b97f2BA922CDdCa374bcD7f", "0xFe837A3530dD566401d35beFCd55582AF7c4dfFC" @@ -88,6 +89,7 @@ "0x9c6522117e2ed1fE5bdb72bb0eD5E3f2bdE7DBe0", "0xfc506AaA1340b4dedFfd88bE278bEe058952D674", "0xf2614A233c7C3e7f08b1F887Ba133a13f1eb2c55", + "0x9a21E33F1a78b17DAd32010CeDB9Fd2F071C17d3", "0xbbbbbBB520d69a9775E85b458C58c648259FAD5F", "0xf332761c673b59b21ff6dfa8ada44d78c12def09", "0x70cBb871E8f30Fc8Ce23609E9E0Ea87B6b222F58" @@ -152,6 +154,7 @@ "0x6140b987d6B51Fd75b66C3B07733Beb5167c42fc", "0x400d75dAb26bBc18D163AEA3e83D9Ea68F6c1804", "0x717b7948AA264DeCf4D780aa6914482e5F46Da3e", + "0x9a21E33F1a78b17DAd32010CeDB9Fd2F071C17d3", "0xf2614A233c7C3e7f08b1F887Ba133a13f1eb2c55", "0x1dac23e41fc8ce857e86fd8c1ae5b6121c67d96d", "0x40aA958dd87FC8305b97f2BA922CDdCa374bcD7f", @@ -180,7 +183,8 @@ "0x0000000000001ff3684f28c67538d4d072c22734", "0xf2614A233c7C3e7f08b1F887Ba133a13f1eb2c55", "0x6140b987d6B51Fd75b66C3B07733Beb5167c42fc", - "0xbbbbbBB520d69a9775E85b458C58c648259FAD5F", + "0x9a21E33F1a78b17DAd32010CeDB9Fd2F071C17d3", + "0xbbbbbBB520d69a9775E85b458C58c648259FAD5F" "0x6b2c0c7be2048daa9b5527982c29f48062b34d58", "0x57df6092665eb6058DE53939612413ff4B09114E" ], @@ -197,7 +201,7 @@ "0xCdBCd51a5E8728E0AF4895ce5771b7d17fF71959", "0xf2614A233c7C3e7f08b1F887Ba133a13f1eb2c55", "0x6140b987d6B51Fd75b66C3B07733Beb5167c42fc", - "0xbbbbbBB520d69a9775E85b458C58c648259FAD5F", + "0x9a21E33F1a78b17DAd32010CeDB9Fd2F071C17d3", "0x2e86f54943fafd2cb62958c3deed36c879e3e944", "0x5fD2Dc91FF1dE7FF4AEB1CACeF8E9911bAAECa68" ], @@ -267,6 +271,7 @@ "0x7cf167390E2526Bc03F3CF6852A7AF1CEC3e243d", "0x400d75dAb26bBc18D163AEA3e83D9Ea68F6c1804", "0xf2614A233c7C3e7f08b1F887Ba133a13f1eb2c55", + "0x9a21E33F1a78b17DAd32010CeDB9Fd2F071C17d3", "0xbbbbbBB520d69a9775E85b458C58c648259FAD5F", "0x9333c74bdd1e118634fe5664aca7a9710b108bab", "0x2c34A2Fb1d0b4f55de51E1d0bDEfaDDce6b7cDD6", @@ -365,7 +370,8 @@ "0x6140b987d6B51Fd75b66C3B07733Beb5167c42fc", "0x3D2f8ae0344d38525d2AE96Ab750B83480c0844F", "0x2214A42d8e2A1d20635c2cb0664422c528B6A432", - "0xf2614A233c7C3e7f08b1F887Ba133a13f1eb2c55", + "0x9a21E33F1a78b17DAd32010CeDB9Fd2F071C17d3", + "0xf2614A233c7C3e7f08b1F887Ba133a13f1eb2c55" "0xf332761c673b59b21ff6dfa8ada44d78c12def09", "0x70cBb871E8f30Fc8Ce23609E9E0Ea87B6b222F58" ], @@ -417,6 +423,7 @@ "0x6140b987d6B51Fd75b66C3B07733Beb5167c42fc", "0x1e9B24073183d5c6B7aE5FB4b8f0b1dd83FDC77a", "0xBBDe1d67297329148Fe1ED5e6B00114842728e65", + "0x9a21E33F1a78b17DAd32010CeDB9Fd2F071C17d3", "0xf2614A233c7C3e7f08b1F887Ba133a13f1eb2c55" ], "gravity": [ @@ -424,6 +431,7 @@ "0x7fA60f4A59Dd8285C5Fcd8fd2A92A2Ca45ef8a0C", "0x6140b987d6B51Fd75b66C3B07733Beb5167c42fc", "0x134f525AC05E4724e55C363A9C4FA35ceB13F88d", + "0x9a21E33F1a78b17DAd32010CeDB9Fd2F071C17d3", "0x6352a56caadc4f1e25cd6c75970fa768a3304e64" ], "immutablezkevm": [ @@ -492,6 +500,7 @@ "0x46b3fdf7b5cde91ac049936bf0bdb12c5d22202e", "0x000000000000175a8b9bc6d539b3708eed92ea6c", "0xcaA342e4f781d63EF41E220D7622B97E66BAEcF3", + "0x0ec6D2eEb94541C51620830D151995fCFf83Aa74", "0xf2614A233c7C3e7f08b1F887Ba133a13f1eb2c55", "0x6b2c0c7be2048daa9b5527982c29f48062b34d58", "0x57df6092665eb6058DE53939612413ff4B09114E" @@ -505,6 +514,7 @@ "0xF2ee649caB7a0edEdED7a27821B0aCDF77778aeD", "0x0263180888007D45340F86eC0b610d250BbDcB23", "0x6140b987d6B51Fd75b66C3B07733Beb5167c42fc", + "0x9a21E33F1a78b17DAd32010CeDB9Fd2F071C17d3", "0x6131b5fae19ea4f9d964eac0408e4408b66337b5", "0x6b2c0c7be2048daa9b5527982c29f48062b34d58", "0x57df6092665eb6058DE53939612413ff4B09114E" @@ -514,6 +524,7 @@ "0x27f0e36dE6B1BA8232f6c2e87E00A50731048C6B", "0xB45e53277a7e0F1D35f2a77160e91e25507f1763", "0xf2614A233c7C3e7f08b1F887Ba133a13f1eb2c55", + "0x799525cE72B5cc9eb310dc8c7b9e7A3128a6dA79", "0x9E4c63c9a0EDE2Ca2e772ee48C819Ca5CB4529AC", "0x6b2c0c7be2048daa9b5527982c29f48062b34d58", "0x57df6092665eb6058DE53939612413ff4B09114E" @@ -527,6 +538,8 @@ "0xc02FFcdD914DbA646704439c6090BAbaD521d04C", "0x6352a56caadC4F1E25CD6c75970Fa768A3304e64", "0x6140b987d6B51Fd75b66C3B07733Beb5167c42fc", + "0x9a21E33F1a78b17DAd32010CeDB9Fd2F071C17d3", + "0xbbbbbBB520d69a9775E85b458C58c648259FAD5F" "0xd0f95fafa06de1b21e79db03c649919501e99ea9", "0xbd0ebe49779e154e5042b34d5bcfbc498e4b3249" ], @@ -643,12 +656,14 @@ "0x96E04591579f298681361C6122Dc4Ef405c19385", "0x4C5D5234f232BD2D76B96aA33F5AE4FCF0E4BFAb", "0xf2614A233c7C3e7f08b1F887Ba133a13f1eb2c55", - "0xbbbbbBB520d69a9775E85b458C58c648259FAD5F", - "0xf332761c673b59b21ff6dfa8ada44d78c12def09", - "0x68D6B739D2020067D1e2F713b999dA97E4d54812" + "0x9a21E33F1a78b17DAd32010CeDB9Fd2F071C17d3", + "0xbbbbbBB520d69a9775E85b458C58c648259FAD5F" ], "opbnb": [ "0x6140b987d6B51Fd75b66C3B07733Beb5167c42fc", + "0xbbbbbBB520d69a9775E85b458C58c648259FAD5F", + "0xf332761c673b59b21ff6dfa8ada44d78c12def09", + "0x68D6B739D2020067D1e2F713b999dA97E4d54812" "0x6A2420650139854F17964b8C3Bb60248470aB57E", "0xEc41F702d36b43a1E1d017Cb4da92F431dFA7a0E", "0x077A38b812e57E2e76849954c880E1a2f5e0A68d" @@ -700,6 +715,7 @@ "0x0dc8E47a1196bcB590485eE8bF832c5c68A52f4B", "0x0a6e511Fe663827b9cA7e2D2542b20B37fC217A6", "0xf2614A233c7C3e7f08b1F887Ba133a13f1eb2c55", + "0x9a21E33F1a78b17DAd32010CeDB9Fd2F071C17d3", "0xbbbbbBB520d69a9775E85b458C58c648259FAD5F", "0xa748d6573aca135af68f2635be60cb80278bd855", "0x3B86917369B83a6892f553609F3c2F439C184e31", @@ -758,6 +774,8 @@ "0xbfe03c9e20a9fc0b37de01a172f207004935e0b1", "0x0000000000005e88410ccdfade4a5efae4b49562", "0x6140b987d6B51Fd75b66C3B07733Beb5167c42fc", + "0x9a21E33F1a78b17DAd32010CeDB9Fd2F071C17d3", + "0xbbbbbBB520d69a9775E85b458C58c648259FAD5F" "0x6b2c0c7be2048daa9b5527982c29f48062b34d58", "0x57df6092665eb6058DE53939612413ff4B09114E" ], @@ -766,6 +784,7 @@ "0xff2F39692A90262b8Ed4DFD92799bB450425773F", "0xD989E929517B0e5eD0c8EfE7607Fa167B697cBa8", "0xcaA342e4f781d63EF41E220D7622B97E66BAEcF3", + "0x0ec6D2eEb94541C51620830D151995fCFf83Aa74", "0xbbbbbBB520d69a9775E85b458C58c648259FAD5F" ], "velas": [ @@ -783,6 +802,7 @@ "0xC69994fd72824ca98F8a0B1E2ABc954E65a91cf4", "0x12904D12A84702f9F079E1e393fdAbD313496e97", "0x833Be894C596b15FAe740C2D522d660084c48B05", + "0x9a21E33F1a78b17DAd32010CeDB9Fd2F071C17d3", "0x2321F1a63A683a1F3634Dbe1CbA0d657D5F56d54", "0x127a986ce31aa2ea8e1a6a0f0d5b7e5dbad7b0be", "0x8b773D83bc66Be128c60e07E17C8901f7a64F000" @@ -808,6 +828,8 @@ "0xe832e655E4C3c36b2be5256915ECF8536a642f59", "0x6fd4383cb451173d5f9304f041c7bcbf27d561ff", "0x1F683faf1E2a770aa75f7B2e92117A5c11183E9C", + "0x4000f76450d9d40558fd60F66863F583B7A5BCCb", + "0xbbbbbBB520d69a9775E85b458C58c648259FAD5F" "0xb9061e38fee7d30134f56aef7117e2f6d1580666", "0xc67879F4065d3B9fe1C09EE990B891Aa8E3a4c2f" ], diff --git a/config/gaszip.json b/config/gaszip.json new file mode 100644 index 000000000..3b3ce4dac --- /dev/null +++ b/config/gaszip.json @@ -0,0 +1,24 @@ +{ + "gasZipRouters": { + "---ListOfRouterAddresses---": "https://dev.gas.zip/gas/chain-support/inbound", + "mainnet": "0x2a37D63EAdFe4b4682a3c28C1c2cD4F109Cc2762", + "arbitrum": "0x2a37D63EAdFe4b4682a3c28C1c2cD4F109Cc2762", + "avalanche": "0x2a37D63EAdFe4b4682a3c28C1c2cD4F109Cc2762", + "base": "0x2a37D63EAdFe4b4682a3c28C1c2cD4F109Cc2762", + "bsc": "0x2a37D63EAdFe4b4682a3c28C1c2cD4F109Cc2762", + "blast": "0x2a37D63EAdFe4b4682a3c28C1c2cD4F109Cc2762", + "fantom": "0xA60768b03eB14d940F6c9a8553329B7F9037C91b", + "gnosis": "0x2a37D63EAdFe4b4682a3c28C1c2cD4F109Cc2762", + "gravity": "0x6Efc6Ead40786bD87A884382b6EA4BcA3C985e99", + "linea": "0xA60768b03eB14d940F6c9a8553329B7F9037C91b", + "mantle": "0x2a37D63EAdFe4b4682a3c28C1c2cD4F109Cc2762", + "metis": "0x2a37D63EAdFe4b4682a3c28C1c2cD4F109Cc2762", + "mode": "0x2a37D63EAdFe4b4682a3c28C1c2cD4F109Cc2762", + "optimism": "0x2a37D63EAdFe4b4682a3c28C1c2cD4F109Cc2762", + "polygon": "0x2a37D63EAdFe4b4682a3c28C1c2cD4F109Cc2762", + "scroll": "0x2a37D63EAdFe4b4682a3c28C1c2cD4F109Cc2762", + "taiko": "0x2a37D63EAdFe4b4682a3c28C1c2cD4F109Cc2762", + "xlayer": "0x2a37D63EAdFe4b4682a3c28C1c2cD4F109Cc2762", + "zksync": "0x252fb662e4d7435d2a5ded8ec94d8932cf76c178" + } +} \ No newline at end of file diff --git a/config/global.json b/config/global.json index 1a6bb16e9..8a2946dea 100644 --- a/config/global.json +++ b/config/global.json @@ -83,7 +83,7 @@ "aurora": "https://safe-transaction-aurora.safe.global/api", "avalanche": "https://safe-transaction-avalanche.safe.global/api", "base": "https://safe-transaction-base.safe.global/api", - "blast": "https://transaction.blast-safe.io/api", + "blast": "https://safe-transaction-blast.safe.global/api", "boba": "https://safe-transaction.mainnet.boba.network/api", "bsc": "https://safe-transaction-bsc.safe.global/api", "celo": "https://safe-transaction-celo.safe.global/api", diff --git a/config/sigs.json b/config/sigs.json index 955649d18..042d9107b 100644 --- a/config/sigs.json +++ b/config/sigs.json @@ -147,8 +147,10 @@ "0x6678ec1f", "0x30eef8bd", "0x4dcebcba", + "0x8b71ae6c", + "0xc4af5a74", "0x03b87e5f", "0x0d5f0e3b", "0x08298b5a" ] -} +} \ No newline at end of file diff --git a/deployments/_deployments_log_file.json b/deployments/_deployments_log_file.json index 1db7a71aa..815e9cccc 100644 --- a/deployments/_deployments_log_file.json +++ b/deployments/_deployments_log_file.json @@ -25090,5 +25090,575 @@ ] } } + }, + "GasZipFacet": { + "bsc": { + "staging": { + "1.0.0": [ + { + "ADDRESS": "0xA269cb81E6bBB86683558e449cb1bAFFdb155Bfc", + "OPTIMIZER_RUNS": "1000000", + "TIMESTAMP": "2024-07-03 09:43:10", + "CONSTRUCTOR_ARGS": "0x00000000000000000000000085e5fb57844be79b42997c898d177a39f328ccf0", + "SALT": "", + "VERIFIED": "true" + } + ], + "2.0.0": [ + { + "ADDRESS": "0x0DAff7e73fDb2bbaDa232A16a5BEA72463893E35", + "OPTIMIZER_RUNS": "1000000", + "TIMESTAMP": "2024-10-22 09:32:31", + "CONSTRUCTOR_ARGS": "0x0000000000000000000000002a37d63eadfe4b4682a3c28c1c2cd4f109cc2762", + "SALT": "", + "VERIFIED": "true" + } + ] + }, + "production": { + "2.0.0": [ + { + "ADDRESS": "0xF5c923a087fb3c554579e2DD10AB6E37E0f6F849", + "OPTIMIZER_RUNS": "1000000", + "TIMESTAMP": "2024-11-11 17:22:00", + "CONSTRUCTOR_ARGS": "0x0000000000000000000000002a37d63eadfe4b4682a3c28c1c2cd4f109cc2762", + "SALT": "", + "VERIFIED": "true" + } + ] + } + }, + "mainnet": { + "production": { + "2.0.0": [ + { + "ADDRESS": "0xF5c923a087fb3c554579e2DD10AB6E37E0f6F849", + "OPTIMIZER_RUNS": "1000000", + "TIMESTAMP": "2024-11-11 17:18:35", + "CONSTRUCTOR_ARGS": "0x0000000000000000000000002a37d63eadfe4b4682a3c28c1c2cd4f109cc2762", + "SALT": "", + "VERIFIED": "true" + } + ] + } + }, + "arbitrum": { + "production": { + "2.0.0": [ + { + "ADDRESS": "0xF5c923a087fb3c554579e2DD10AB6E37E0f6F849", + "OPTIMIZER_RUNS": "1000000", + "TIMESTAMP": "2024-11-11 17:19:32", + "CONSTRUCTOR_ARGS": "0x0000000000000000000000002a37d63eadfe4b4682a3c28c1c2cd4f109cc2762", + "SALT": "", + "VERIFIED": "true" + } + ] + } + }, + "avalanche": { + "production": { + "2.0.0": [ + { + "ADDRESS": "0xF5c923a087fb3c554579e2DD10AB6E37E0f6F849", + "OPTIMIZER_RUNS": "1000000", + "TIMESTAMP": "2024-11-11 17:19:48", + "CONSTRUCTOR_ARGS": "0x0000000000000000000000002a37d63eadfe4b4682a3c28c1c2cd4f109cc2762", + "SALT": "", + "VERIFIED": "true" + } + ] + } + }, + "base": { + "production": { + "2.0.0": [ + { + "ADDRESS": "0xF5c923a087fb3c554579e2DD10AB6E37E0f6F849", + "OPTIMIZER_RUNS": "1000000", + "TIMESTAMP": "2024-11-11 17:20:08", + "CONSTRUCTOR_ARGS": "0x0000000000000000000000002a37d63eadfe4b4682a3c28c1c2cd4f109cc2762", + "SALT": "", + "VERIFIED": "true" + } + ] + } + }, + "blast": { + "production": { + "2.0.0": [ + { + "ADDRESS": "0xF5c923a087fb3c554579e2DD10AB6E37E0f6F849", + "OPTIMIZER_RUNS": "1000000", + "TIMESTAMP": "2024-11-11 17:20:36", + "CONSTRUCTOR_ARGS": "0x0000000000000000000000002a37d63eadfe4b4682a3c28c1c2cd4f109cc2762", + "SALT": "", + "VERIFIED": "true" + } + ] + } + }, + "gnosis": { + "production": { + "2.0.0": [ + { + "ADDRESS": "0xF5c923a087fb3c554579e2DD10AB6E37E0f6F849", + "OPTIMIZER_RUNS": "1000000", + "TIMESTAMP": "2024-11-11 17:22:31", + "CONSTRUCTOR_ARGS": "0x0000000000000000000000002a37d63eadfe4b4682a3c28c1c2cd4f109cc2762", + "SALT": "", + "VERIFIED": "true" + } + ] + } + }, + "linea": { + "production": { + "2.0.0": [ + { + "ADDRESS": "0x75943d7305310635945736D00235d825181018f3", + "OPTIMIZER_RUNS": "1000000", + "TIMESTAMP": "2024-11-11 16:33:11", + "CONSTRUCTOR_ARGS": "0x000000000000000000000000a60768b03eb14d940f6c9a8553329b7f9037c91b", + "SALT": "", + "VERIFIED": "true" + } + ] + } + }, + "mantle": { + "production": { + "2.0.0": [ + { + "ADDRESS": "0xF5c923a087fb3c554579e2DD10AB6E37E0f6F849", + "OPTIMIZER_RUNS": "1000000", + "TIMESTAMP": "2024-11-11 16:33:44", + "CONSTRUCTOR_ARGS": "0x0000000000000000000000002a37d63eadfe4b4682a3c28c1c2cd4f109cc2762", + "SALT": "", + "VERIFIED": "true" + } + ] + } + }, + "metis": { + "production": { + "2.0.0": [ + { + "ADDRESS": "0xb518364B2F4e480eCc64998Da12F072A63a25093", + "OPTIMIZER_RUNS": "1000000", + "TIMESTAMP": "2024-11-11 17:23:33", + "CONSTRUCTOR_ARGS": "0x0000000000000000000000002a37d63eadfe4b4682a3c28c1c2cd4f109cc2762", + "SALT": "", + "VERIFIED": "true" + } + ] + } + }, + "mode": { + "production": { + "2.0.0": [ + { + "ADDRESS": "0xF5c923a087fb3c554579e2DD10AB6E37E0f6F849", + "OPTIMIZER_RUNS": "1000000", + "TIMESTAMP": "2024-11-11 17:24:55", + "CONSTRUCTOR_ARGS": "0x0000000000000000000000002a37d63eadfe4b4682a3c28c1c2cd4f109cc2762", + "SALT": "", + "VERIFIED": "true" + } + ] + } + }, + "optimism": { + "production": { + "2.0.0": [ + { + "ADDRESS": "0xF5c923a087fb3c554579e2DD10AB6E37E0f6F849", + "OPTIMIZER_RUNS": "1000000", + "TIMESTAMP": "2024-11-11 17:25:37", + "CONSTRUCTOR_ARGS": "0x0000000000000000000000002a37d63eadfe4b4682a3c28c1c2cd4f109cc2762", + "SALT": "", + "VERIFIED": "true" + } + ] + } + }, + "polygon": { + "production": { + "2.0.0": [ + { + "ADDRESS": "0xF5c923a087fb3c554579e2DD10AB6E37E0f6F849", + "OPTIMIZER_RUNS": "1000000", + "TIMESTAMP": "2024-11-11 17:27:27", + "CONSTRUCTOR_ARGS": "0x0000000000000000000000002a37d63eadfe4b4682a3c28c1c2cd4f109cc2762", + "SALT": "", + "VERIFIED": "true" + } + ] + } + }, + "scroll": { + "production": { + "2.0.0": [ + { + "ADDRESS": "0xF5c923a087fb3c554579e2DD10AB6E37E0f6F849", + "OPTIMIZER_RUNS": "1000000", + "TIMESTAMP": "2024-11-11 17:29:08", + "CONSTRUCTOR_ARGS": "0x0000000000000000000000002a37d63eadfe4b4682a3c28c1c2cd4f109cc2762", + "SALT": "", + "VERIFIED": "true" + } + ] + } + }, + "xlayer": { + "production": { + "2.0.0": [ + { + "ADDRESS": "0xF5c923a087fb3c554579e2DD10AB6E37E0f6F849", + "OPTIMIZER_RUNS": "1000000", + "TIMESTAMP": "2024-11-11 17:29:57", + "CONSTRUCTOR_ARGS": "0x0000000000000000000000002a37d63eadfe4b4682a3c28c1c2cd4f109cc2762", + "SALT": "", + "VERIFIED": "true" + } + ] + } + }, + "gravity": { + "production": { + "2.0.0": [ + { + "ADDRESS": "0xF5c923a087fb3c554579e2DD10AB6E37E0f6F849", + "OPTIMIZER_RUNS": "1000000", + "TIMESTAMP": "2024-11-12 11:01:12", + "CONSTRUCTOR_ARGS": "0x0000000000000000000000006efc6ead40786bd87a884382b6ea4bca3c985e99", + "SALT": "", + "VERIFIED": "true" + } + ] + } + }, + "taiko": { + "production": { + "2.0.0": [ + { + "ADDRESS": "0x75943d7305310635945736D00235d825181018f3", + "OPTIMIZER_RUNS": "1000000", + "TIMESTAMP": "2024-11-12 11:04:08", + "CONSTRUCTOR_ARGS": "0x0000000000000000000000002a37d63eadfe4b4682a3c28c1c2cd4f109cc2762", + "SALT": "", + "VERIFIED": "true" + } + ] + } + }, + "fantom": { + "production": { + "2.0.0": [ + { + "ADDRESS": "0xF5c923a087fb3c554579e2DD10AB6E37E0f6F849", + "OPTIMIZER_RUNS": "1000000", + "TIMESTAMP": "2024-11-12 11:04:53", + "CONSTRUCTOR_ARGS": "0x000000000000000000000000a60768b03eb14d940f6c9a8553329b7f9037c91b", + "SALT": "", + "VERIFIED": "true" + } + ] + } + }, + "zksync": { + "production": { + "2.0.0": [ + { + "ADDRESS": "0x313c27Aad40c7e0A0b923b539F05617D8114566D", + "OPTIMIZER_RUNS": "1000000", + "TIMESTAMP": "2024-11-13 16:42:46", + "CONSTRUCTOR_ARGS": "0x000000000000000000000000252fb662e4d7435d2a5ded8ec94d8932cf76c178", + "SALT": "", + "VERIFIED": "true" + } + ] + } + } + }, + "GasZipPeriphery": { + "bsc": { + "staging": { + "1.0.0": [ + { + "ADDRESS": "0x46d8Aa20D5aD98927Cf885De9eBf9436E8E551c2", + "OPTIMIZER_RUNS": "1000000", + "TIMESTAMP": "2024-10-24 08:49:38", + "CONSTRUCTOR_ARGS": "0x0000000000000000000000002a37d63eadfe4b4682a3c28c1c2cd4f109cc27620000000000000000000000006140b987d6b51fd75b66c3b07733beb5167c42fc00000000000000000000000020b6b31d76e054c3e4de6154feca385ca58c7c15", + "SALT": "20241024", + "VERIFIED": "false" + } + ] + }, + "production": { + "1.0.0": [ + { + "ADDRESS": "0x9a21E33F1a78b17DAd32010CeDB9Fd2F071C17d3", + "OPTIMIZER_RUNS": "1000000", + "TIMESTAMP": "2024-11-12 11:28:56", + "CONSTRUCTOR_ARGS": "0x0000000000000000000000002a37d63eadfe4b4682a3c28c1c2cd4f109cc27620000000000000000000000006140b987d6b51fd75b66c3b07733beb5167c42fc00000000000000000000000020b6b31d76e054c3e4de6154feca385ca58c7c15", + "SALT": "", + "VERIFIED": "true" + } + ] + } + }, + "mainnet": { + "production": { + "1.0.0": [ + { + "ADDRESS": "0x9a21E33F1a78b17DAd32010CeDB9Fd2F071C17d3", + "OPTIMIZER_RUNS": "1000000", + "TIMESTAMP": "2024-11-12 11:27:02", + "CONSTRUCTOR_ARGS": "0x0000000000000000000000002a37d63eadfe4b4682a3c28c1c2cd4f109cc27620000000000000000000000006140b987d6b51fd75b66c3b07733beb5167c42fc00000000000000000000000037347dd595c49212c5fc2d95ea10d1085896f51e", + "SALT": "", + "VERIFIED": "true" + } + ] + } + }, + "arbitrum": { + "production": { + "1.0.0": [ + { + "ADDRESS": "0x9a21E33F1a78b17DAd32010CeDB9Fd2F071C17d3", + "OPTIMIZER_RUNS": "1000000", + "TIMESTAMP": "2024-11-12 11:27:13", + "CONSTRUCTOR_ARGS": "0x0000000000000000000000002a37d63eadfe4b4682a3c28c1c2cd4f109cc27620000000000000000000000006140b987d6b51fd75b66c3b07733beb5167c42fc0000000000000000000000009e606d0d2bba344b911e2f4eab95d9235a83fe15", + "SALT": "", + "VERIFIED": "true" + } + ] + } + }, + "avalanche": { + "production": { + "1.0.0": [ + { + "ADDRESS": "0x9a21E33F1a78b17DAd32010CeDB9Fd2F071C17d3", + "OPTIMIZER_RUNS": "1000000", + "TIMESTAMP": "2024-11-12 11:27:25", + "CONSTRUCTOR_ARGS": "0x0000000000000000000000002a37d63eadfe4b4682a3c28c1c2cd4f109cc27620000000000000000000000006140b987d6b51fd75b66c3b07733beb5167c42fc00000000000000000000000027d4eb2854d93a1a7df8e2aed1a535b080a6f6e4", + "SALT": "", + "VERIFIED": "true" + } + ] + } + }, + "base": { + "production": { + "1.0.0": [ + { + "ADDRESS": "0x9a21E33F1a78b17DAd32010CeDB9Fd2F071C17d3", + "OPTIMIZER_RUNS": "1000000", + "TIMESTAMP": "2024-11-12 11:27:34", + "CONSTRUCTOR_ARGS": "0x0000000000000000000000002a37d63eadfe4b4682a3c28c1c2cd4f109cc27620000000000000000000000006140b987d6b51fd75b66c3b07733beb5167c42fc0000000000000000000000001f6974c11b833eb52ea07e0b442510165d87d82e", + "SALT": "", + "VERIFIED": "true" + } + ] + } + }, + "blast": { + "production": { + "1.0.0": [ + { + "ADDRESS": "0x9a21E33F1a78b17DAd32010CeDB9Fd2F071C17d3", + "OPTIMIZER_RUNS": "1000000", + "TIMESTAMP": "2024-11-12 11:27:43", + "CONSTRUCTOR_ARGS": "0x0000000000000000000000002a37d63eadfe4b4682a3c28c1c2cd4f109cc27620000000000000000000000006140b987d6b51fd75b66c3b07733beb5167c42fc000000000000000000000000df61270fdc1a892874fd3c0143a0a4cba74f4ef1", + "SALT": "", + "VERIFIED": "true" + } + ] + } + }, + "fantom": { + "production": { + "1.0.0": [ + { + "ADDRESS": "0x9a21E33F1a78b17DAd32010CeDB9Fd2F071C17d3", + "OPTIMIZER_RUNS": "1000000", + "TIMESTAMP": "2024-11-12 11:29:11", + "CONSTRUCTOR_ARGS": "0x000000000000000000000000a60768b03eb14d940f6c9a8553329b7f9037c91b0000000000000000000000006140b987d6b51fd75b66c3b07733beb5167c42fc0000000000000000000000009b325b1c43bb3c018fcdb24a64e05ef4b8b8057b", + "SALT": "", + "VERIFIED": "true" + } + ] + } + }, + "gnosis": { + "production": { + "1.0.0": [ + { + "ADDRESS": "0x9a21E33F1a78b17DAd32010CeDB9Fd2F071C17d3", + "OPTIMIZER_RUNS": "1000000", + "TIMESTAMP": "2024-11-12 11:29:24", + "CONSTRUCTOR_ARGS": "0x0000000000000000000000002a37d63eadfe4b4682a3c28c1c2cd4f109cc27620000000000000000000000006140b987d6b51fd75b66c3b07733beb5167c42fc0000000000000000000000002bc523875b59a1ddd03ceb1f1b28c5b0e8e6654a", + "SALT": "", + "VERIFIED": "true" + } + ] + } + }, + "gravity": { + "production": { + "1.0.0": [ + { + "ADDRESS": "0x9a21E33F1a78b17DAd32010CeDB9Fd2F071C17d3", + "OPTIMIZER_RUNS": "1000000", + "TIMESTAMP": "2024-11-12 11:29:35", + "CONSTRUCTOR_ARGS": "0x0000000000000000000000006efc6ead40786bd87a884382b6ea4bca3c985e990000000000000000000000006140b987d6b51fd75b66c3b07733beb5167c42fc000000000000000000000000245b16cace8730b009c5352186dce7d73c3037a1", + "SALT": "", + "VERIFIED": "true" + } + ] + } + }, + "linea": { + "production": { + "1.0.0": [ + { + "ADDRESS": "0x0ec6D2eEb94541C51620830D151995fCFf83Aa74", + "OPTIMIZER_RUNS": "1000000", + "TIMESTAMP": "2024-11-12 11:14:56", + "CONSTRUCTOR_ARGS": "0x000000000000000000000000a60768b03eb14d940f6c9a8553329b7f9037c91b000000000000000000000000caa342e4f781d63ef41e220d7622b97e66baecf3000000000000000000000000df61270fdc1a892874fd3c0143a0a4cba74f4ef1", + "SALT": "", + "VERIFIED": "true" + } + ] + } + }, + "mantle": { + "production": { + "1.0.0": [ + { + "ADDRESS": "0x9a21E33F1a78b17DAd32010CeDB9Fd2F071C17d3", + "OPTIMIZER_RUNS": "1000000", + "TIMESTAMP": "2024-11-12 11:15:29", + "CONSTRUCTOR_ARGS": "0x0000000000000000000000002a37d63eadfe4b4682a3c28c1c2cd4f109cc27620000000000000000000000006140b987d6b51fd75b66c3b07733beb5167c42fc000000000000000000000000a89a87986e8ee1ac8fdacc5ac91627010ec9f772", + "SALT": "", + "VERIFIED": "true" + } + ] + } + }, + "metis": { + "production": { + "1.0.0": [ + { + "ADDRESS": "0x799525cE72B5cc9eb310dc8c7b9e7A3128a6dA79", + "OPTIMIZER_RUNS": "1000000", + "TIMESTAMP": "2024-11-12 11:22:29", + "CONSTRUCTOR_ARGS": "0x0000000000000000000000002a37d63eadfe4b4682a3c28c1c2cd4f109cc27620000000000000000000000009e4c63c9a0ede2ca2e772ee48c819ca5cb4529ac000000000000000000000000925cd8289ac2d617f52974da8338867f3bb62d56", + "SALT": "", + "VERIFIED": "true" + } + ] + } + }, + "mode": { + "production": { + "1.0.0": [ + { + "ADDRESS": "0x9a21E33F1a78b17DAd32010CeDB9Fd2F071C17d3", + "OPTIMIZER_RUNS": "1000000", + "TIMESTAMP": "2024-11-12 11:23:06", + "CONSTRUCTOR_ARGS": "0x0000000000000000000000002a37d63eadfe4b4682a3c28c1c2cd4f109cc27620000000000000000000000006140b987d6b51fd75b66c3b07733beb5167c42fc000000000000000000000000df61270fdc1a892874fd3c0143a0a4cba74f4ef1", + "SALT": "", + "VERIFIED": "true" + } + ] + } + }, + "optimism": { + "production": { + "1.0.0": [ + { + "ADDRESS": "0x9a21E33F1a78b17DAd32010CeDB9Fd2F071C17d3", + "OPTIMIZER_RUNS": "1000000", + "TIMESTAMP": "2024-11-12 11:31:29", + "CONSTRUCTOR_ARGS": "0x0000000000000000000000002a37d63eadfe4b4682a3c28c1c2cd4f109cc27620000000000000000000000006140b987d6b51fd75b66c3b07733beb5167c42fc000000000000000000000000a8892ea3fddef2aa8afb1e3643a3284f978a5114", + "SALT": "", + "VERIFIED": "true" + } + ] + } + }, + "polygon": { + "production": { + "1.0.0": [ + { + "ADDRESS": "0x9a21E33F1a78b17DAd32010CeDB9Fd2F071C17d3", + "OPTIMIZER_RUNS": "1000000", + "TIMESTAMP": "2024-11-12 11:31:44", + "CONSTRUCTOR_ARGS": "0x0000000000000000000000002a37d63eadfe4b4682a3c28c1c2cd4f109cc27620000000000000000000000006140b987d6b51fd75b66c3b07733beb5167c42fc0000000000000000000000008bcc385948c73736423d38cc567cfede0f1826a3", + "SALT": "", + "VERIFIED": "true" + } + ] + } + }, + "scroll": { + "production": { + "1.0.0": [ + { + "ADDRESS": "0x9a21E33F1a78b17DAd32010CeDB9Fd2F071C17d3", + "OPTIMIZER_RUNS": "1000000", + "TIMESTAMP": "2024-11-12 11:32:50", + "CONSTRUCTOR_ARGS": "0x0000000000000000000000002a37d63eadfe4b4682a3c28c1c2cd4f109cc27620000000000000000000000006140b987d6b51fd75b66c3b07733beb5167c42fc000000000000000000000000df61270fdc1a892874fd3c0143a0a4cba74f4ef1", + "SALT": "", + "VERIFIED": "true" + } + ] + } + }, + "taiko": { + "production": { + "1.0.0": [ + { + "ADDRESS": "0x0ec6D2eEb94541C51620830D151995fCFf83Aa74", + "OPTIMIZER_RUNS": "1000000", + "TIMESTAMP": "2024-11-12 11:34:04", + "CONSTRUCTOR_ARGS": "0x0000000000000000000000002a37d63eadfe4b4682a3c28c1c2cd4f109cc2762000000000000000000000000caa342e4f781d63ef41e220d7622b97e66baecf3000000000000000000000000a89a87986e8ee1ac8fdacc5ac91627010ec9f772", + "SALT": "", + "VERIFIED": "true" + } + ] + } + }, + "xlayer": { + "production": { + "1.0.0": [ + { + "ADDRESS": "0x9a21E33F1a78b17DAd32010CeDB9Fd2F071C17d3", + "OPTIMIZER_RUNS": "1000000", + "TIMESTAMP": "2024-11-12 11:34:56", + "CONSTRUCTOR_ARGS": "0x0000000000000000000000002a37d63eadfe4b4682a3c28c1c2cd4f109cc27620000000000000000000000002321f1a63a683a1f3634dbe1cba0d657d5f56d540000000000000000000000003fd21b437b5e0a903a8376d33824f9ba658756c2", + "SALT": "", + "VERIFIED": "true" + } + ] + } + }, + "zksync": { + "production": { + "1.0.0": [ + { + "ADDRESS": "0x4000f76450d9d40558fd60F66863F583B7A5BCCb", + "OPTIMIZER_RUNS": "1000000", + "TIMESTAMP": "2024-11-13 16:47:48", + "CONSTRUCTOR_ARGS": "0x000000000000000000000000252fb662e4d7435d2a5ded8ec94d8932cf76c1780000000000000000000000001f683faf1e2a770aa75f7b2e92117a5c11183e9c00000000000000000000000002f1272aeacaf7bd8b30278bc2aa381cc623a744", + "SALT": "", + "VERIFIED": "true" + } + ] + } + } } } \ No newline at end of file diff --git a/deployments/arbitrum.diamond.json b/deployments/arbitrum.diamond.json index b6c95d690..19e5cceaf 100644 --- a/deployments/arbitrum.diamond.json +++ b/deployments/arbitrum.diamond.json @@ -147,21 +147,22 @@ }, "0xF5c923a087fb3c554579e2DD10AB6E37E0f6F849": { "Name": "GasZipFacet", - "Version": "1.0.0" + "Version": "2.0.0" } }, "Periphery": { "ERC20Proxy": "0x5741A7FfE7c39Ca175546a54985fA79211290b51", "Executor": "0x2dfaDAB8266483beD9Fd9A292Ce56596a2D1378D", "FeeCollector": "0xB0210dE78E28e2633Ca200609D9f528c13c26cD9", + "GasZipPeriphery": "0x9a21E33F1a78b17DAd32010CeDB9Fd2F071C17d3", "LiFiDEXAggregator": "0x6140b987d6B51Fd75b66C3B07733Beb5167c42fc", "LiFuelFeeCollector": "0xc02FFcdD914DbA646704439c6090BAbaD521d04C", "Permit2Proxy": "0x6307119078556Fc8aD77781DFC67df20d75FB4f9", - "Receiver": "0x050e198E36A73a1e32F15C3afC58C4506d82f657", "ReceiverAcrossV3": "0xB9CEc304899037E661F49DdFa7f64943b5920072", + "Receiver": "0x050e198E36A73a1e32F15C3afC58C4506d82f657", "ReceiverStargateV2": "0x1493e7B8d4DfADe0a178dAD9335470337A3a219A", "RelayerCelerIM": "0x6a8b11bF29C0546991DEcD6E0Db8cC7Fda22bA97", "TokenWrapper": "0x5215E9fd223BC909083fbdB2860213873046e45d" } } -} +} \ No newline at end of file diff --git a/deployments/arbitrum.json b/deployments/arbitrum.json index be4f46d1d..570c0c5db 100644 --- a/deployments/arbitrum.json +++ b/deployments/arbitrum.json @@ -52,5 +52,7 @@ "EmergencyPauseFacet": "0x6F2baA7cd5F156CA1B132F7FF11E0fa2aD775F61", "AcrossFacetV3": "0x6e00e0a7685Ca22c288d56D9E7924746B5043Ee7", "ReceiverAcrossV3": "0xB9CEc304899037E661F49DdFa7f64943b5920072", - "AcrossFacetPackedV3": "0x20F3FFf5A89e988c4109A6e496a839480B1B558f" + "AcrossFacetPackedV3": "0x20F3FFf5A89e988c4109A6e496a839480B1B558f", + "GasZipFacet": "0xF5c923a087fb3c554579e2DD10AB6E37E0f6F849", + "GasZipPeriphery": "0x9a21E33F1a78b17DAd32010CeDB9Fd2F071C17d3" } \ No newline at end of file diff --git a/deployments/avalanche.diamond.json b/deployments/avalanche.diamond.json index 44cc0e583..649710359 100644 --- a/deployments/avalanche.diamond.json +++ b/deployments/avalanche.diamond.json @@ -118,19 +118,20 @@ "Version": "1.0.0" }, "0xF5c923a087fb3c554579e2DD10AB6E37E0f6F849": { - "Name": "", - "Version": "" + "Name": "GasZipFacet", + "Version": "2.0.0" } }, "Periphery": { "ERC20Proxy": "0x5741A7FfE7c39Ca175546a54985fA79211290b51", "Executor": "0x2dfaDAB8266483beD9Fd9A292Ce56596a2D1378D", "FeeCollector": "0xB0210dE78E28e2633Ca200609D9f528c13c26cD9", + "GasZipPeriphery": "0x9a21E33F1a78b17DAd32010CeDB9Fd2F071C17d3", "LiFiDEXAggregator": "0x6140b987d6B51Fd75b66C3B07733Beb5167c42fc", "LiFuelFeeCollector": "0xc02FFcdD914DbA646704439c6090BAbaD521d04C", "Permit2Proxy": "0x6307119078556Fc8aD77781DFC67df20d75FB4f9", - "Receiver": "0x050e198E36A73a1e32F15C3afC58C4506d82f657", "ReceiverAcrossV3": "", + "Receiver": "0x050e198E36A73a1e32F15C3afC58C4506d82f657", "ReceiverStargateV2": "0x1493e7B8d4DfADe0a178dAD9335470337A3a219A", "RelayerCelerIM": "0x6a8b11bF29C0546991DEcD6E0Db8cC7Fda22bA97", "TokenWrapper": "0x5215E9fd223BC909083fbdB2860213873046e45d" diff --git a/deployments/avalanche.json b/deployments/avalanche.json index 07d97a104..78c378314 100644 --- a/deployments/avalanche.json +++ b/deployments/avalanche.json @@ -46,5 +46,7 @@ "ReceiverStargateV2": "0x1493e7B8d4DfADe0a178dAD9335470337A3a219A", "LiFiDEXAggregator": "0x6140b987d6B51Fd75b66C3B07733Beb5167c42fc", "EmergencyPauseFacet": "0x6F2baA7cd5F156CA1B132F7FF11E0fa2aD775F61", + "GasZipFacet": "0xF5c923a087fb3c554579e2DD10AB6E37E0f6F849", + "GasZipPeriphery": "0x9a21E33F1a78b17DAd32010CeDB9Fd2F071C17d3", "Permit2Proxy": "0x6307119078556Fc8aD77781DFC67df20d75FB4f9" } \ No newline at end of file diff --git a/deployments/base.diamond.json b/deployments/base.diamond.json index 1a4cfab47..88eb383ab 100644 --- a/deployments/base.diamond.json +++ b/deployments/base.diamond.json @@ -134,8 +134,8 @@ "Version": "1.0.0" }, "0xF5c923a087fb3c554579e2DD10AB6E37E0f6F849": { - "Name": "", - "Version": "" + "Name": "GasZipFacet", + "Version": "2.0.0" }, "0x6e00e0a7685Ca22c288d56D9E7924746B5043Ee7": { "Name": "AcrossFacetV3", @@ -146,11 +146,12 @@ "ERC20Proxy": "0x74a55CaDb12501A3707E9F3C5dfd8b563C6A5940", "Executor": "0x4DaC9d1769b9b304cb04741DCDEb2FC14aBdF110", "FeeCollector": "0x0A6d96E7f4D7b96CFE42185DF61E64d255c12DFf", + "GasZipPeriphery": "0x9a21E33F1a78b17DAd32010CeDB9Fd2F071C17d3", "LiFiDEXAggregator": "0x6140b987d6B51Fd75b66C3B07733Beb5167c42fc", "LiFuelFeeCollector": "0xc02FFcdD914DbA646704439c6090BAbaD521d04C", "Permit2Proxy": "0x6307119078556Fc8aD77781DFC67df20d75FB4f9", - "Receiver": "0xeC03B65CbDc5f8858b02F44EBa54C90664249fb1", "ReceiverAcrossV3": "0xB9CEc304899037E661F49DdFa7f64943b5920072", + "Receiver": "0xeC03B65CbDc5f8858b02F44EBa54C90664249fb1", "ReceiverStargateV2": "0x1493e7B8d4DfADe0a178dAD9335470337A3a219A", "RelayerCelerIM": "", "TokenWrapper": "0x5215E9fd223BC909083fbdB2860213873046e45d" diff --git a/deployments/base.json b/deployments/base.json index e239176b5..640f520a4 100644 --- a/deployments/base.json +++ b/deployments/base.json @@ -42,5 +42,7 @@ "AcrossFacetV3": "0x6e00e0a7685Ca22c288d56D9E7924746B5043Ee7", "ReceiverAcrossV3": "0xB9CEc304899037E661F49DdFa7f64943b5920072", "AcrossFacetPackedV3": "0x20F3FFf5A89e988c4109A6e496a839480B1B558f", + "GasZipFacet": "0xF5c923a087fb3c554579e2DD10AB6E37E0f6F849", + "GasZipPeriphery": "0x9a21E33F1a78b17DAd32010CeDB9Fd2F071C17d3", "Permit2Proxy": "0x6307119078556Fc8aD77781DFC67df20d75FB4f9" } \ No newline at end of file diff --git a/deployments/blast.diamond.json b/deployments/blast.diamond.json index 872130e8c..dd301a901 100644 --- a/deployments/blast.diamond.json +++ b/deployments/blast.diamond.json @@ -93,7 +93,8 @@ "ReceiverAcrossV3": "0xB9CEc304899037E661F49DdFa7f64943b5920072", "ReceiverStargateV2": "", "RelayerCelerIM": "", - "TokenWrapper": "0xF2ee649caB7a0edEdED7a27821B0aCDF77778aeD" + "TokenWrapper": "0xF2ee649caB7a0edEdED7a27821B0aCDF77778aeD", + "GasZipPeriphery": "0x9a21E33F1a78b17DAd32010CeDB9Fd2F071C17d3" } } } \ No newline at end of file diff --git a/deployments/blast.json b/deployments/blast.json index 7ef518cf1..692da772b 100644 --- a/deployments/blast.json +++ b/deployments/blast.json @@ -29,5 +29,7 @@ "AcrossFacetV3": "0x6e00e0a7685Ca22c288d56D9E7924746B5043Ee7", "ReceiverAcrossV3": "0xB9CEc304899037E661F49DdFa7f64943b5920072", "AcrossFacetPackedV3": "0x20F3FFf5A89e988c4109A6e496a839480B1B558f", + "GasZipFacet": "0xF5c923a087fb3c554579e2DD10AB6E37E0f6F849", + "GasZipPeriphery": "0x9a21E33F1a78b17DAd32010CeDB9Fd2F071C17d3", "Permit2Proxy": "0x6307119078556Fc8aD77781DFC67df20d75FB4f9" } \ No newline at end of file diff --git a/deployments/bsc.diamond.json b/deployments/bsc.diamond.json index 8a9a182c4..90bd9baef 100644 --- a/deployments/bsc.diamond.json +++ b/deployments/bsc.diamond.json @@ -137,7 +137,8 @@ "ReceiverAcrossV3": "", "ReceiverStargateV2": "0x1493e7B8d4DfADe0a178dAD9335470337A3a219A", "RelayerCelerIM": "0x6a8b11bF29C0546991DEcD6E0Db8cC7Fda22bA97", - "TokenWrapper": "0x5215E9fd223BC909083fbdB2860213873046e45d" + "TokenWrapper": "0x5215E9fd223BC909083fbdB2860213873046e45d", + "GasZipPeriphery": "0x9a21E33F1a78b17DAd32010CeDB9Fd2F071C17d3" } } } \ No newline at end of file diff --git a/deployments/bsc.diamond.staging.json b/deployments/bsc.diamond.staging.json index d94710630..f89fccfee 100644 --- a/deployments/bsc.diamond.staging.json +++ b/deployments/bsc.diamond.staging.json @@ -82,21 +82,22 @@ "Version": "1.0.1" }, "0x0DAff7e73fDb2bbaDa232A16a5BEA72463893E35": { - "Name": "", - "Version": "" + "Name": "GasZipFacet", + "Version": "2.0.0" } }, "Periphery": { "ERC20Proxy": "0xf90a432dD1D0541470BC9C440d9dEc3659755238", "Executor": "0x4f3B1b1075cC19daA15b7cc681b28e2fB82145eD", "FeeCollector": "0x7f98D45c7902f079fDb65811B633522e2d227BB6", + "GasZipPeriphery": "0x46d8Aa20D5aD98927Cf885De9eBf9436E8E551c2", "LiFiDEXAggregator": "0xD6f02718B9df9FAd2665c7304BC5b26D5bbD8642", "LiFuelFeeCollector": "0xc4f7A34b8d283f66925eF0f5CCdFC2AF3030DeaE", "Receiver": "0x76EE0F8fb09047284B6ea89881595Fc6F5B09E12", - "ReceiverAcrossV3": "", + "ReceiverAcrossV3": "0x76EE0F8fb09047284B6ea89881595Fc6F5B09E12", "ReceiverStargateV2": "", "RelayerCelerIM": "", - "TokenWrapper": "0x5215E9fd223BC909083fbdB2860213873046e45d" + "TokenWrapper": "" } } -} \ No newline at end of file +} diff --git a/deployments/bsc.json b/deployments/bsc.json index 87d20f70a..b11ce7df0 100644 --- a/deployments/bsc.json +++ b/deployments/bsc.json @@ -47,5 +47,7 @@ "StargateFacetV2": "0x6e378C84e657C57b2a8d183CFf30ee5CC8989b61", "LiFiDEXAggregator": "0x6140b987d6B51Fd75b66C3B07733Beb5167c42fc", "EmergencyPauseFacet": "0x6F2baA7cd5F156CA1B132F7FF11E0fa2aD775F61", + "GasZipFacet": "0xF5c923a087fb3c554579e2DD10AB6E37E0f6F849", + "GasZipPeriphery": "0x9a21E33F1a78b17DAd32010CeDB9Fd2F071C17d3", "Permit2Proxy": "0x6307119078556Fc8aD77781DFC67df20d75FB4f9" } \ No newline at end of file diff --git a/deployments/bsc.staging.json b/deployments/bsc.staging.json index cba680d41..5b5014a94 100644 --- a/deployments/bsc.staging.json +++ b/deployments/bsc.staging.json @@ -25,10 +25,13 @@ "StargateFacet": "0xAfcC5c55d5Ec3082675D51331E7Ed9AdE195db48", "ThorSwapFacet": "0xa6aAe470E7B8E8916e692882A5db25bB40C398A7", "AmarokFacetPacked": "0x7ac3EB2D191EBAb9E925CAbFD4F8155be066b3aa", + "GasZip": "0xD9a07743138b6a76A8a56F305048D17f1175B11A", "MayanBridgeFacet": "0x5Ba4FeD1DAd2fD057A9f687B399B8e4cF2368214", "MayanFacet": "0xd596C903d78870786c5DB0E448ce7F87A65A0daD", + "GasZipFacet": "0x0DAff7e73fDb2bbaDa232A16a5BEA72463893E35", "GenericSwapFacetV3": "0xE871874D8AC30E8aCD0eC67529b4a5dDD73Bf0d6", "EmergencyPauseFacet": "0xf03AFcA857918BE01EBD6C6800Fc2974b8a9eBA2", "StargateFacetV2": "0x089153117bffd37CBbE0c604dAE8e493D4743fA8", - "LiFiDEXAggregator": "0xD6f02718B9df9FAd2665c7304BC5b26D5bbD8642" -} + "LiFiDEXAggregator": "0x6140b987d6b51fd75b66c3b07733beb5167c42fc", + "GasZipPeriphery": "0x46d8Aa20D5aD98927Cf885De9eBf9436E8E551c2" +} \ No newline at end of file diff --git a/deployments/fantom.diamond.json b/deployments/fantom.diamond.json index 1fccb133a..5dc3da18d 100644 --- a/deployments/fantom.diamond.json +++ b/deployments/fantom.diamond.json @@ -105,7 +105,8 @@ "ReceiverAcrossV3": "", "ReceiverStargateV2": "", "RelayerCelerIM": "0x6a8b11bF29C0546991DEcD6E0Db8cC7Fda22bA97", - "TokenWrapper": "0x5215E9fd223BC909083fbdB2860213873046e45d" + "TokenWrapper": "0x5215E9fd223BC909083fbdB2860213873046e45d", + "GasZipPeriphery": "0x9a21E33F1a78b17DAd32010CeDB9Fd2F071C17d3" } } } \ No newline at end of file diff --git a/deployments/fantom.json b/deployments/fantom.json index d33576473..68c91daa6 100644 --- a/deployments/fantom.json +++ b/deployments/fantom.json @@ -35,5 +35,7 @@ "SquidFacet": "0x5C2C3F56e33F45389aa4e1DA4D3a807A532a910c", "GenericSwapFacetV3": "0x31a9b1835864706Af10103b31Ea2b79bdb995F5F", "LiFiDEXAggregator": "0x6140b987d6B51Fd75b66C3B07733Beb5167c42fc", - "EmergencyPauseFacet": "0x6F2baA7cd5F156CA1B132F7FF11E0fa2aD775F61" + "EmergencyPauseFacet": "0x6F2baA7cd5F156CA1B132F7FF11E0fa2aD775F61", + "GasZipFacet": "0xF5c923a087fb3c554579e2DD10AB6E37E0f6F849", + "GasZipPeriphery": "0x9a21E33F1a78b17DAd32010CeDB9Fd2F071C17d3" } \ No newline at end of file diff --git a/deployments/gnosis.diamond.json b/deployments/gnosis.diamond.json index c0ba88aea..85abda5a8 100644 --- a/deployments/gnosis.diamond.json +++ b/deployments/gnosis.diamond.json @@ -109,7 +109,8 @@ "ReceiverAcrossV3": "", "ReceiverStargateV2": "", "RelayerCelerIM": "", - "TokenWrapper": "0x5215E9fd223BC909083fbdB2860213873046e45d" + "TokenWrapper": "0x5215E9fd223BC909083fbdB2860213873046e45d", + "GasZipPeriphery": "0x9a21E33F1a78b17DAd32010CeDB9Fd2F071C17d3" } } } \ No newline at end of file diff --git a/deployments/gnosis.json b/deployments/gnosis.json index 14cb386c5..90e89c8ac 100644 --- a/deployments/gnosis.json +++ b/deployments/gnosis.json @@ -31,5 +31,7 @@ "TokenWrapper": "0x5215E9fd223BC909083fbdB2860213873046e45d", "GenericSwapFacetV3": "0x31a9b1835864706Af10103b31Ea2b79bdb995F5F", "LiFiDEXAggregator": "0x6140b987d6B51Fd75b66C3B07733Beb5167c42fc", - "EmergencyPauseFacet": "0x6F2baA7cd5F156CA1B132F7FF11E0fa2aD775F61" + "EmergencyPauseFacet": "0x6F2baA7cd5F156CA1B132F7FF11E0fa2aD775F61", + "GasZipFacet": "0xF5c923a087fb3c554579e2DD10AB6E37E0f6F849", + "GasZipPeriphery": "0x9a21E33F1a78b17DAd32010CeDB9Fd2F071C17d3" } \ No newline at end of file diff --git a/deployments/gravity.diamond.json b/deployments/gravity.diamond.json index f028bf2a5..dca76a341 100644 --- a/deployments/gravity.diamond.json +++ b/deployments/gravity.diamond.json @@ -58,8 +58,8 @@ "Version": "1.0.0" }, "0xF5c923a087fb3c554579e2DD10AB6E37E0f6F849": { - "Name": "", - "Version": "" + "Name": "GasZipFacet", + "Version": "2.0.0" }, "0x49e93F6A99c590a8E70138D2710B9eDd88C077FF": { "Name": "", @@ -74,6 +74,7 @@ "ERC20Proxy": "0x4307ca7Eca98daF86D4f65b4367B273C628A39B7", "Executor": "0xCdE9376F284d5CA9aaec69dD4D0761278b4ae034", "FeeCollector": "0x79540403cdE176Ca5f1fb95bE84A7ec91fFDEF76", + "GasZipPeriphery": "0x9a21E33F1a78b17DAd32010CeDB9Fd2F071C17d3", "LiFiDEXAggregator": "0x6140b987d6B51Fd75b66C3B07733Beb5167c42fc", "LiFuelFeeCollector": "0x134f525AC05E4724e55C363A9C4FA35ceB13F88d", "Permit2Proxy": "", @@ -84,4 +85,4 @@ "TokenWrapper": "0x7fA60f4A59Dd8285C5Fcd8fd2A92A2Ca45ef8a0C" } } -} \ No newline at end of file +} diff --git a/deployments/gravity.json b/deployments/gravity.json index 9852a454b..d7707e159 100644 --- a/deployments/gravity.json +++ b/deployments/gravity.json @@ -21,5 +21,7 @@ "ReceiverStargateV2": "0x6A3d6652fb7be72200a47313C092342218aAeb72", "LiFiDEXAggregator": "0x6140b987d6B51Fd75b66C3B07733Beb5167c42fc", "Receiver": "0x2DeB3bFa2b19024A0c1Ba299b6b79276f1F77b14", - "EmergencyPauseFacet": "0x6F2baA7cd5F156CA1B132F7FF11E0fa2aD775F61" + "EmergencyPauseFacet": "0x6F2baA7cd5F156CA1B132F7FF11E0fa2aD775F61", + "GasZipFacet": "0xF5c923a087fb3c554579e2DD10AB6E37E0f6F849", + "GasZipPeriphery": "0x9a21E33F1a78b17DAd32010CeDB9Fd2F071C17d3" } \ No newline at end of file diff --git a/deployments/linea.diamond.json b/deployments/linea.diamond.json index c807cf439..3502dbf03 100644 --- a/deployments/linea.diamond.json +++ b/deployments/linea.diamond.json @@ -118,8 +118,8 @@ "Version": "1.0.0" }, "0x75943d7305310635945736D00235d825181018f3": { - "Name": "", - "Version": "" + "Name": "GasZipFacet", + "Version": "2.0.0" }, "0x2531368BAca8c5E85031FC0a9a2f148b65da389A": { "Name": "AcrossFacetV3", @@ -130,6 +130,7 @@ "ERC20Proxy": "0x57ec2C57fA654aABAeCc63c8dad47cb6efaCCC24", "Executor": "0x2a202Ed587F0BC7dfa80ea1DD943d8470492Dd0F", "FeeCollector": "0xA4A24BdD4608D7dFC496950850f9763B674F0DB2", + "GasZipPeriphery": "0x0ec6D2eEb94541C51620830D151995fCFf83Aa74", "LiFiDEXAggregator": "", "LiFuelFeeCollector": "0x68B21d21509446Bf5449B6F5F8aBD4b3cfcbc3f8", "Permit2Proxy": "", @@ -140,4 +141,4 @@ "TokenWrapper": "0xf6C9605c6E231C1547b7a6545d93e7233f97322a" } } -} \ No newline at end of file +} diff --git a/deployments/linea.json b/deployments/linea.json index e18d577d8..3943a1634 100644 --- a/deployments/linea.json +++ b/deployments/linea.json @@ -38,5 +38,7 @@ "EmergencyPauseFacet": "0xe07c030dDC7Fb9ca23b633b1028106DAA5fdbF96", "AcrossFacetV3": "0x2531368BAca8c5E85031FC0a9a2f148b65da389A", "ReceiverAcrossV3": "0x4BB377A1A624bDeF72d352891dc5E64087345fe6", - "AcrossFacetPackedV3": "0x922D1c381Cb5b0AFAAe9E7C86ed34FDE337766b0" -} \ No newline at end of file + "AcrossFacetPackedV3": "0x922D1c381Cb5b0AFAAe9E7C86ed34FDE337766b0", + "GasZipFacet": "0x75943d7305310635945736D00235d825181018f3", + "GasZipPeriphery": "0x0ec6D2eEb94541C51620830D151995fCFf83Aa74" +} diff --git a/deployments/mainnet.diamond.json b/deployments/mainnet.diamond.json index 91eada7e8..c8875fd41 100644 --- a/deployments/mainnet.diamond.json +++ b/deployments/mainnet.diamond.json @@ -189,7 +189,8 @@ "ReceiverAcrossV3": "0xB9CEc304899037E661F49DdFa7f64943b5920072", "ReceiverStargateV2": "0x1493e7B8d4DfADe0a178dAD9335470337A3a219A", "RelayerCelerIM": "0x6a8b11bF29C0546991DEcD6E0Db8cC7Fda22bA97", - "TokenWrapper": "0x5215E9fd223BC909083fbdB2860213873046e45d" + "TokenWrapper": "0x5215E9fd223BC909083fbdB2860213873046e45d", + "GasZipPeriphery": "0x9a21E33F1a78b17DAd32010CeDB9Fd2F071C17d3" } } } \ No newline at end of file diff --git a/deployments/mainnet.json b/deployments/mainnet.json index 9e2949597..6cdca6796 100644 --- a/deployments/mainnet.json +++ b/deployments/mainnet.json @@ -60,5 +60,7 @@ "AcrossFacetV3": "0x6e00e0a7685Ca22c288d56D9E7924746B5043Ee7", "ReceiverAcrossV3": "0xB9CEc304899037E661F49DdFa7f64943b5920072", "AcrossFacetPackedV3": "0x20F3FFf5A89e988c4109A6e496a839480B1B558f", + "GasZipFacet": "0xF5c923a087fb3c554579e2DD10AB6E37E0f6F849", + "GasZipPeriphery": "0x9a21E33F1a78b17DAd32010CeDB9Fd2F071C17d3", "Permit2Proxy": "0x6307119078556Fc8aD77781DFC67df20d75FB4f9" } \ No newline at end of file diff --git a/deployments/mantle.diamond.json b/deployments/mantle.diamond.json index c76fddcc6..32defd7a8 100644 --- a/deployments/mantle.diamond.json +++ b/deployments/mantle.diamond.json @@ -78,6 +78,7 @@ "ERC20Proxy": "0xA950Ac46b0b844c0564d18A54A9685e614B9086C", "Executor": "0x7078d1DE45C7D3e87f71D5DA663db2a8Ee1dfEbe", "FeeCollector": "0xF048e5816B0C7951AC179f656C5B86e5a79Bd7b5", + "GasZipPeriphery": "0x9a21E33F1a78b17DAd32010CeDB9Fd2F071C17d3", "LiFiDEXAggregator": "0x6140b987d6B51Fd75b66C3B07733Beb5167c42fc", "LiFuelFeeCollector": "0xc02FFcdD914DbA646704439c6090BAbaD521d04C", "Permit2Proxy": "", diff --git a/deployments/mantle.json b/deployments/mantle.json index a386b2bd4..e2d6757b9 100644 --- a/deployments/mantle.json +++ b/deployments/mantle.json @@ -25,5 +25,7 @@ "StargateFacetV2": "0x6e378C84e657C57b2a8d183CFf30ee5CC8989b61", "ReceiverStargateV2": "0x1493e7B8d4DfADe0a178dAD9335470337A3a219A", "LiFiDEXAggregator": "0x6140b987d6B51Fd75b66C3B07733Beb5167c42fc", - "EmergencyPauseFacet": "0x6F2baA7cd5F156CA1B132F7FF11E0fa2aD775F61" + "EmergencyPauseFacet": "0x6F2baA7cd5F156CA1B132F7FF11E0fa2aD775F61", + "GasZipFacet": "0xF5c923a087fb3c554579e2DD10AB6E37E0f6F849", + "GasZipPeriphery": "0x9a21E33F1a78b17DAd32010CeDB9Fd2F071C17d3" } \ No newline at end of file diff --git a/deployments/metis.diamond.json b/deployments/metis.diamond.json index fa6d3ab51..fc5cfce75 100644 --- a/deployments/metis.diamond.json +++ b/deployments/metis.diamond.json @@ -89,7 +89,8 @@ "ReceiverAcrossV3": "", "ReceiverStargateV2": "0xe7392Fc0f61503dB53C70789c6F2c34C0675C929", "RelayerCelerIM": "", - "TokenWrapper": "0x01bDf46A673FC3c081ddBD21cb51fBA4972d00aC" + "TokenWrapper": "0x01bDf46A673FC3c081ddBD21cb51fBA4972d00aC", + "GasZipPeriphery": "0x799525cE72B5cc9eb310dc8c7b9e7A3128a6dA79" } } } \ No newline at end of file diff --git a/deployments/metis.json b/deployments/metis.json index 0b5d346da..59b8f51b6 100644 --- a/deployments/metis.json +++ b/deployments/metis.json @@ -25,5 +25,7 @@ "StargateFacetV2": "0xCb667deA2894ab64e8e75EACB0d5d027AC672e25", "ReceiverStargateV2": "0xe7392Fc0f61503dB53C70789c6F2c34C0675C929", "LiFiDEXAggregator": "0x9E4c63c9a0EDE2Ca2e772ee48C819Ca5CB4529AC", - "EmergencyPauseFacet": "0xD5734b44Bb7Ada52ea6503088612E70a2a612371" + "EmergencyPauseFacet": "0xD5734b44Bb7Ada52ea6503088612E70a2a612371", + "GasZipFacet": "0xb518364B2F4e480eCc64998Da12F072A63a25093", + "GasZipPeriphery": "0x799525cE72B5cc9eb310dc8c7b9e7A3128a6dA79" } \ No newline at end of file diff --git a/deployments/mode.diamond.json b/deployments/mode.diamond.json index 0655024fa..fe73413a8 100644 --- a/deployments/mode.diamond.json +++ b/deployments/mode.diamond.json @@ -97,7 +97,8 @@ "ReceiverAcrossV3": "0xB9CEc304899037E661F49DdFa7f64943b5920072", "ReceiverStargateV2": "", "RelayerCelerIM": "", - "TokenWrapper": "0x5215E9fd223BC909083fbdB2860213873046e45d" + "TokenWrapper": "0x5215E9fd223BC909083fbdB2860213873046e45d", + "GasZipPeriphery": "0x9a21E33F1a78b17DAd32010CeDB9Fd2F071C17d3" } } } \ No newline at end of file diff --git a/deployments/mode.json b/deployments/mode.json index 5c2cb696c..ccd77f5bc 100644 --- a/deployments/mode.json +++ b/deployments/mode.json @@ -28,5 +28,7 @@ "EmergencyPauseFacet": "0x6F2baA7cd5F156CA1B132F7FF11E0fa2aD775F61", "AcrossFacetV3": "0x6e00e0a7685Ca22c288d56D9E7924746B5043Ee7", "ReceiverAcrossV3": "0xB9CEc304899037E661F49DdFa7f64943b5920072", - "AcrossFacetPackedV3": "0x20F3FFf5A89e988c4109A6e496a839480B1B558f" -} + "AcrossFacetPackedV3": "0x20F3FFf5A89e988c4109A6e496a839480B1B558f", + "GasZipFacet": "0xF5c923a087fb3c554579e2DD10AB6E37E0f6F849", + "GasZipPeriphery": "0x9a21E33F1a78b17DAd32010CeDB9Fd2F071C17d3" +} \ No newline at end of file diff --git a/deployments/optimism.diamond.json b/deployments/optimism.diamond.json index b70f99ec2..d098cf278 100644 --- a/deployments/optimism.diamond.json +++ b/deployments/optimism.diamond.json @@ -165,7 +165,8 @@ "ReceiverAcrossV3": "0xB9CEc304899037E661F49DdFa7f64943b5920072", "ReceiverStargateV2": "0x1493e7B8d4DfADe0a178dAD9335470337A3a219A", "RelayerCelerIM": "0x6a8b11bF29C0546991DEcD6E0Db8cC7Fda22bA97", - "TokenWrapper": "0x5215E9fd223BC909083fbdB2860213873046e45d" + "TokenWrapper": "0x5215E9fd223BC909083fbdB2860213873046e45d", + "GasZipPeriphery": "0x9a21E33F1a78b17DAd32010CeDB9Fd2F071C17d3" } } } \ No newline at end of file diff --git a/deployments/optimism.json b/deployments/optimism.json index 1d43fc913..1e158644e 100644 --- a/deployments/optimism.json +++ b/deployments/optimism.json @@ -51,5 +51,7 @@ "EmergencyPauseFacet": "0x6F2baA7cd5F156CA1B132F7FF11E0fa2aD775F61", "AcrossFacetV3": "0x6e00e0a7685Ca22c288d56D9E7924746B5043Ee7", "ReceiverAcrossV3": "0xB9CEc304899037E661F49DdFa7f64943b5920072", - "AcrossFacetPackedV3": "0x20F3FFf5A89e988c4109A6e496a839480B1B558f" + "AcrossFacetPackedV3": "0x20F3FFf5A89e988c4109A6e496a839480B1B558f", + "GasZipFacet": "0xF5c923a087fb3c554579e2DD10AB6E37E0f6F849", + "GasZipPeriphery": "0x9a21E33F1a78b17DAd32010CeDB9Fd2F071C17d3" } \ No newline at end of file diff --git a/deployments/polygon.diamond.json b/deployments/polygon.diamond.json index bf5bb2900..44626fb1c 100644 --- a/deployments/polygon.diamond.json +++ b/deployments/polygon.diamond.json @@ -146,8 +146,8 @@ "Version": "1.0.0" }, "0xF5c923a087fb3c554579e2DD10AB6E37E0f6F849": { - "Name": "", - "Version": "" + "Name": "GasZipFacet", + "Version": "2.0.0" }, "0x6e00e0a7685Ca22c288d56D9E7924746B5043Ee7": { "Name": "AcrossFacetV3", @@ -158,11 +158,12 @@ "ERC20Proxy": "0x5741A7FfE7c39Ca175546a54985fA79211290b51", "Executor": "0x2dfaDAB8266483beD9Fd9A292Ce56596a2D1378D", "FeeCollector": "0xbD6C7B0d2f68c2b7805d88388319cfB6EcB50eA9", + "GasZipPeriphery": "0x9a21E33F1a78b17DAd32010CeDB9Fd2F071C17d3", "LiFiDEXAggregator": "0x6140b987d6B51Fd75b66C3B07733Beb5167c42fc", "LiFuelFeeCollector": "0xc02FFcdD914DbA646704439c6090BAbaD521d04C", "Permit2Proxy": "0x6307119078556Fc8aD77781DFC67df20d75FB4f9", - "Receiver": "0x050e198E36A73a1e32F15C3afC58C4506d82f657", "ReceiverAcrossV3": "0xB9CEc304899037E661F49DdFa7f64943b5920072", + "Receiver": "0x050e198E36A73a1e32F15C3afC58C4506d82f657", "ReceiverStargateV2": "0x1493e7B8d4DfADe0a178dAD9335470337A3a219A", "RelayerCelerIM": "0x6a8b11bF29C0546991DEcD6E0Db8cC7Fda22bA97", "TokenWrapper": "0x5215E9fd223BC909083fbdB2860213873046e45d" diff --git a/deployments/polygon.json b/deployments/polygon.json index 63741bcb8..d9b402b6a 100644 --- a/deployments/polygon.json +++ b/deployments/polygon.json @@ -55,5 +55,7 @@ "AcrossFacetV3": "0x6e00e0a7685Ca22c288d56D9E7924746B5043Ee7", "ReceiverAcrossV3": "0xB9CEc304899037E661F49DdFa7f64943b5920072", "AcrossFacetPackedV3": "0x20F3FFf5A89e988c4109A6e496a839480B1B558f", + "GasZipFacet": "0xF5c923a087fb3c554579e2DD10AB6E37E0f6F849", + "GasZipPeriphery": "0x9a21E33F1a78b17DAd32010CeDB9Fd2F071C17d3", "Permit2Proxy": "0x6307119078556Fc8aD77781DFC67df20d75FB4f9" } \ No newline at end of file diff --git a/deployments/scroll.diamond.json b/deployments/scroll.diamond.json index 6a4b71f5e..79f7c9235 100644 --- a/deployments/scroll.diamond.json +++ b/deployments/scroll.diamond.json @@ -113,7 +113,8 @@ "ReceiverAcrossV3": "0xB9CEc304899037E661F49DdFa7f64943b5920072", "ReceiverStargateV2": "0x1493e7B8d4DfADe0a178dAD9335470337A3a219A", "RelayerCelerIM": "", - "TokenWrapper": "0x5215E9fd223BC909083fbdB2860213873046e45d" + "TokenWrapper": "0x5215E9fd223BC909083fbdB2860213873046e45d", + "GasZipPeriphery": "0x9a21E33F1a78b17DAd32010CeDB9Fd2F071C17d3" } } } \ No newline at end of file diff --git a/deployments/scroll.json b/deployments/scroll.json index d4053ff43..aa461cf09 100644 --- a/deployments/scroll.json +++ b/deployments/scroll.json @@ -32,5 +32,7 @@ "EmergencyPauseFacet": "0x6F2baA7cd5F156CA1B132F7FF11E0fa2aD775F61", "AcrossFacetV3": "0x6e00e0a7685Ca22c288d56D9E7924746B5043Ee7", "ReceiverAcrossV3": "0xB9CEc304899037E661F49DdFa7f64943b5920072", - "AcrossFacetPackedV3": "0x20F3FFf5A89e988c4109A6e496a839480B1B558f" -} + "AcrossFacetPackedV3": "0x20F3FFf5A89e988c4109A6e496a839480B1B558f", + "GasZipFacet": "0xF5c923a087fb3c554579e2DD10AB6E37E0f6F849", + "GasZipPeriphery": "0x9a21E33F1a78b17DAd32010CeDB9Fd2F071C17d3" +} \ No newline at end of file diff --git a/deployments/taiko.diamond.json b/deployments/taiko.diamond.json index 8e928bc2f..d0c010982 100644 --- a/deployments/taiko.diamond.json +++ b/deployments/taiko.diamond.json @@ -73,7 +73,8 @@ "ReceiverAcrossV3": "", "ReceiverStargateV2": "0x6CA57d9846f9a1fd48368762b743a047eC4f81A6", "RelayerCelerIM": "", - "TokenWrapper": "0xD989E929517B0e5eD0c8EfE7607Fa167B697cBa8" + "TokenWrapper": "0xD989E929517B0e5eD0c8EfE7607Fa167B697cBa8", + "GasZipPeriphery": "" } } } \ No newline at end of file diff --git a/deployments/taiko.json b/deployments/taiko.json index 65a865d66..b4c0620aa 100644 --- a/deployments/taiko.json +++ b/deployments/taiko.json @@ -22,5 +22,7 @@ "ReceiverStargateV2": "0x6CA57d9846f9a1fd48368762b743a047eC4f81A6", "TokenWrapper": "0xD989E929517B0e5eD0c8EfE7607Fa167B697cBa8", "Receiver": "0xe38326Ae727e3fA6669249063Ce7b8ea1754e756", - "EmergencyPauseFacet": "0xe07c030dDC7Fb9ca23b633b1028106DAA5fdbF96" + "EmergencyPauseFacet": "0xe07c030dDC7Fb9ca23b633b1028106DAA5fdbF96", + "GasZipFacet": "0x75943d7305310635945736D00235d825181018f3", + "GasZipPeriphery": "0x0ec6D2eEb94541C51620830D151995fCFf83Aa74" } \ No newline at end of file diff --git a/deployments/xlayer.diamond.json b/deployments/xlayer.diamond.json index 7fbb18f54..1d03e3af7 100644 --- a/deployments/xlayer.diamond.json +++ b/deployments/xlayer.diamond.json @@ -62,14 +62,15 @@ "Version": "1.0.0" }, "0xF5c923a087fb3c554579e2DD10AB6E37E0f6F849": { - "Name": "", - "Version": "" + "Name": "GasZipFacet", + "Version": "2.0.0" } }, "Periphery": { "ERC20Proxy": "0x32f9EBAEA88bfE6b965108A2315AC2bE6253cC82", "Executor": "0x4c2fd9A794ac2337aD7AD547158B68397B6458A7", "FeeCollector": "0xC69994fd72824ca98F8a0B1E2ABc954E65a91cf4", + "GasZipPeriphery": "0x9a21E33F1a78b17DAd32010CeDB9Fd2F071C17d3", "LiFiDEXAggregator": "0x2321F1a63A683a1F3634Dbe1CbA0d657D5F56d54", "LiFuelFeeCollector": "0x12904D12A84702f9F079E1e393fdAbD313496e97", "Permit2Proxy": "", @@ -80,4 +81,4 @@ "TokenWrapper": "0x833Be894C596b15FAe740C2D522d660084c48B05" } } -} \ No newline at end of file +} diff --git a/deployments/xlayer.json b/deployments/xlayer.json index b7873a0bd..5f7932c95 100644 --- a/deployments/xlayer.json +++ b/deployments/xlayer.json @@ -21,5 +21,7 @@ "LiFuelFeeCollector": "0x12904D12A84702f9F079E1e393fdAbD313496e97", "TokenWrapper": "0x833Be894C596b15FAe740C2D522d660084c48B05", "LiFiDEXAggregator": "0x2321F1a63A683a1F3634Dbe1CbA0d657D5F56d54", - "EmergencyPauseFacet": "0x6F2baA7cd5F156CA1B132F7FF11E0fa2aD775F61" + "EmergencyPauseFacet": "0x6F2baA7cd5F156CA1B132F7FF11E0fa2aD775F61", + "GasZipFacet": "0xF5c923a087fb3c554579e2DD10AB6E37E0f6F849", + "GasZipPeriphery": "0x9a21E33F1a78b17DAd32010CeDB9Fd2F071C17d3" } \ No newline at end of file diff --git a/deployments/zksync.diamond.json b/deployments/zksync.diamond.json index 24ad7db90..ae9fc63b8 100644 --- a/deployments/zksync.diamond.json +++ b/deployments/zksync.diamond.json @@ -74,19 +74,20 @@ "Version": "1.0.0" }, "0x313c27Aad40c7e0A0b923b539F05617D8114566D": { - "Name": "", - "Version": "" + "Name": "GasZipFacet", + "Version": "2.0.0" } }, "Periphery": { "ERC20Proxy": "0x8E1cf39Df64D9DCAdA7831d90CC852e02663410a", "Executor": "0xa9bfa49F26733271f4FD34A4b57bB7C563Ae056A", "FeeCollector": "0x8dBf6f59187b2EB36B980F3D8F4cFC6DC4E4642e", + "GasZipPeriphery": "0x4000f76450d9d40558fd60F66863F583B7A5BCCb", "LiFiDEXAggregator": "0x1F683faf1E2a770aa75f7B2e92117A5c11183E9C", "LiFuelFeeCollector": "0xB87C536E048Cfc082187E559fCFeFc3f1c89aEc7", "Permit2Proxy": "0x6275f6631c955DC5dA9fBe8Dc7f24a3A5919443A", - "Receiver": "0xdeDB2DAe4a9BC63910a722a3b7DC930C7E6f6421", "ReceiverAcrossV3": "0xFa94c1A99799B3cA89DE6cbB3ccCDEcf1da62aFE", + "Receiver": "0xdeDB2DAe4a9BC63910a722a3b7DC930C7E6f6421", "ReceiverStargateV2": "", "RelayerCelerIM": "0xFf9565e1C4f01C368444D2bE4B9ef36ce7E95541", "TokenWrapper": "0xf15485ada1a1826fA46225032b13F6A972eC73C1" diff --git a/deployments/zksync.json b/deployments/zksync.json index 5642cdaba..750531be8 100644 --- a/deployments/zksync.json +++ b/deployments/zksync.json @@ -23,5 +23,7 @@ "AcrossFacetV3": "0x2e47355B70D6935C6A69d5F67e0aFe437791138e", "ReceiverAcrossV3": "0xFa94c1A99799B3cA89DE6cbB3ccCDEcf1da62aFE", "AcrossFacetPackedV3": "0x9243578F60a2A3821642481b5851578cE92d9a78", + "GasZipFacet": "0x313c27Aad40c7e0A0b923b539F05617D8114566D", + "GasZipPeriphery": "0x4000f76450d9d40558fd60F66863F583B7A5BCCb", "Permit2Proxy": "0x6275f6631c955DC5dA9fBe8Dc7f24a3A5919443A" } \ No newline at end of file diff --git a/docs/GasZipFacet.md b/docs/GasZipFacet.md new file mode 100644 index 000000000..e3af721d0 --- /dev/null +++ b/docs/GasZipFacet.md @@ -0,0 +1,52 @@ +# GasZipFacet + +## Description + +The GasZipFacet offers functionality to send native gas tokens to other chains using the Gas.Zip protocol (https://www.gas.zip/) +If gas is sent to several chains, each chain will receive an equal amount + +## How To Use + +### Functions for bridging + +- `function startBridgeTokensViaGasZip(BridgeData memory _bridgeData, GasZipData calldata _gasZipData)` + - Simply deposits native tokens to Gas.zip protocol (this function can only be used for native tokens) +- `function swapAndStartBridgeTokensViaGasZip(BridgeData memory _bridgeData, SwapData[] calldata _swapData, GasZipData calldata _gasZipData)` + - Performs swap(s) from ERC20 to native before depositing to Gas.zip protocol. The last receiving token must be native. + +## Bridge Specific Parameters + +Some of the methods listed above take a variable labeled `_gasZipData`. + +This data is specific to Gas.Zip and is represented as the following struct type: + +```solidity +/// @dev GasZip-specific bridge data +/// @param receiverAddress the address on destination chain(s) where gas should be sent to +/// @param destinationChains a value that represents a list of chains to which gas should be distributed (see https://dev.gas.zip/gas/code-examples/deposit for more details) +struct GasZipData { + bytes32 receiverAddress; + // EVM addresses need to be padded with trailing 0s, e.g.: + // 0x391E7C679D29BD940D63BE94AD22A25D25B5A604000000000000000000000000 (correct) + // 0x000000000000000000000000391E7C679D29BD940D63BE94AD22A25D25B5A604 (incorrect) + uint256 destinationChains; +} +``` + +## Swap Data + +Some methods accept a `SwapData _swapData` parameter. + +Swapping is performed by a swap specific library that expects an array of calldata to can be run on various DEXs (i.e. Uniswap) to make one or multiple swaps before performing another action. + +The swap library can be found [here](../src/Libraries/LibSwap.sol). + +## LiFi Data + +Most of the methods accept a `BridgeData _bridgeData` parameter. + +The facet uses the `destinationChainId` parameter to determine which chain to send gas to. +It will send the `minAmount` to this chain (or convert it to native before in case of ERC20). +The funds will be sent to the `receiver` address. + +The `_bridgeData` also used to emit events that we can later track and index in our subgraphs and provide data on how our contracts are being used. `BridgeData` and the events we can emit can be found [here](../src/Interfaces/ILiFi.sol). diff --git a/docs/GasZipPeriphery.md b/docs/GasZipPeriphery.md new file mode 100644 index 000000000..b4f2edd82 --- /dev/null +++ b/docs/GasZipPeriphery.md @@ -0,0 +1,57 @@ +# GasZipPeriphery + +## Description + +The GasZipPeriphery contract offers functionality to send native gas tokens to other chains using the Gas.Zip protocol (https://www.gas.zip/) +It can be used as (LibSwap.SwapData) swap step prior to bridging. + +## How To Use + +### Functions for using this facet as a LibSwap.SwapData step + +The contract provides two public methods: +One for ERC20 tokens (these will be swapped into native before depositing to Gas.zip using the LiFiDEXAggregator) + +```solidity +/// @notice Swaps ERC20 tokens to native and deposits these native tokens in the GasZip router contract +/// Swaps are only allowed via the LiFiDEXAggregator +/// @dev this function can be used as a LibSwap.SwapData protocol step to combine it with any other bridge +/// @param _swapData The swap data that executes the swap from ERC20 to native +/// @param _gasZipData contains information which chains and address gas should be sent to +function depositToGasZipERC20( + LibSwap.SwapData calldata _swapData, + IGasZip.GasZipData calldata _gasZipData, +) +``` + +and another for native tokens (these will be directly deposited) + +```solidity +/// @notice Deposits native tokens to the GasZip router contract +/// @dev this function can be used as a LibSwap.SwapData protocol step to combine it with any other bridge +/// @param _gasZipData contains information which chains and address gas should be sent to +/// @param _amount the total amount to be deposited (will be split equally across all chains) +function depositToGasZipNative( + IGasZip.GasZipData calldata _gasZipData, + uint256 _amount +) +``` + +## Bridge Specific Parameters + +Some of the methods listed above take a variable labeled `_gasZipData`. + +This data is specific to Gas.Zip and is represented as the following struct type: + +```solidity +/// @dev GasZip-specific bridge data +/// @param receiverAddress the address on destination chain(s) where gas should be sent to +/// @param destinationChains a value that represents a list of chains to which gas should be distributed (see https://dev.gas.zip/gas/code-examples/deposit for more details) +struct GasZipData { + bytes32 receiverAddress; + // EVM addresses need to be padded with trailing 0s, e.g.: + // 0x391E7C679D29BD940D63BE94AD22A25D25B5A604000000000000000000000000 (correct) + // 0x000000000000000000000000391E7C679D29BD940D63BE94AD22A25D25B5A604 (incorrect) + uint256 destinationChains; +} +``` diff --git a/package.json b/package.json index 1be232436..d680ca00c 100644 --- a/package.json +++ b/package.json @@ -44,6 +44,7 @@ "hardhat-preprocessor": "^0.1.5", "husky": "^8.0.1", "lint-staged": "^13.2.3", + "node-gyp": "^10.2.0", "patch-package": "^6.4.7", "plop": "^3.1.2", "postinstall-postinstall": "^2.1.0", diff --git a/script/deploy/_targetState.json b/script/deploy/_targetState.json index 189be8d69..a14a13941 100644 --- a/script/deploy/_targetState.json +++ b/script/deploy/_targetState.json @@ -46,13 +46,13 @@ "OmniBridgeFacet": "1.0.0", "OptimismBridgeFacet": "1.0.0", "PolygonBridgeFacet": "1.0.0", - "RelayFacet": "\u001b[31m[error] the following filepath is invalid: \u001b[31m[error] could not find src FILE path for contract RelayFacet\u001b[0m\u001b[0m", "SquidFacet": "1.0.0", "StargateFacet": "2.2.0", "StargateFacetV2": "1.0.1", "ReceiverStargateV2": "1.0.0", "SymbiosisFacet": "1.0.0", - "ThorSwapFacet": "1.2.0" + "ThorSwapFacet": "1.2.0", + "GasZipPeriphery": "1.0.0" } } }, @@ -98,12 +98,12 @@ "HopFacetPacked": "1.0.6", "HopFacetOptimized": "2.0.0", "MayanFacet": "1.0.0", - "RelayFacet": "\u001b[31m[error] the following filepath is invalid: \u001b[31m[error] could not find src FILE path for contract RelayFacet\u001b[0m\u001b[0m", "SquidFacet": "1.0.0", "StargateFacet": "2.2.0", "StargateFacetV2": "1.0.1", "ReceiverStargateV2": "1.0.0", - "SymbiosisFacet": "1.0.0" + "SymbiosisFacet": "1.0.0", + "GasZipPeriphery": "1.0.0" } } }, @@ -140,8 +140,84 @@ "RelayerCelerIM": "2.0.0", "CelerIMFacetMutable": "2.0.0", "MayanFacet": "1.0.0", - "OpBNBBridgeFacet": "\u001b[31m[error] the following filepath is invalid: \u001b[31m[error] could not find src FILE path for contract OpBNBBridgeFacet\u001b[0m\u001b[0m", - "RelayFacet": "\u001b[31m[error] the following filepath is invalid: \u001b[31m[error] could not find src FILE path for contract RelayFacet\u001b[0m\u001b[0m", + "SquidFacet": "1.0.0", + "StargateFacet": "2.2.0", + "StargateFacetV2": "1.0.1", + "ReceiverStargateV2": "1.0.0", + "SymbiosisFacet": "1.0.0", + "ThorSwapFacet": "1.2.0", + "GasZipPeriphery": "1.0.0" + } + }, + "staging": { + "LiFiDiamond": { + "DiamondCutFacet": "1.0.0", + "DiamondLoupeFacet": "1.0.0", + "OwnershipFacet": "1.0.0", + "DexManagerFacet": "1.0.1", + "AccessManagerFacet": "1.0.0", + "WithdrawFacet": "1.0.0", + "PeripheryRegistryFacet": "1.0.0", + "GenericSwapFacet": "1.0.0", + "GenericSwapFacetV3": "1.0.1", + "LIFuelFacet": "1.0.1", + "CalldataVerificationFacet": "1.1.1", + "StandardizedCallFacet": "1.1.0", + "LiFiDiamond": "1.0.0", + "ERC20Proxy": "1.0.0", + "Executor": "2.0.0", + "FeeCollector": "1.0.0", + "Receiver": "2.0.2", + "LiFuelFeeCollector": "1.0.1", + "TokenWrapper": "1.0.0", + "LiFiDEXAggregator": "1.0.0", + "AllBridgeFacet": "2.0.0", + "AmarokFacet": "3.0.0", + "AmarokFacetPacked": "1.0.0", + "CBridgeFacet": "1.0.0", + "CBridgeFacetPacked": "1.0.3", + "RelayerCelerIM": "2.0.0", + "CelerIMFacetMutable": "2.0.0", + "HyphenFacet": "1.0.0", + "MayanFacet": "1.0.0", + "SquidFacet": "1.0.0", + "StargateFacet": "2.2.0", + "StargateFacetV2": "1.0.1", + "ReceiverStargateV2": "1.0.0", + "SymbiosisFacet": "1.0.0", + "ThorSwapFacet": "1.2.0", + "GasZipPeriphery": "1.0.0" + }, + "LiFiDiamondImmutable": { + "DiamondCutFacet": "1.0.0", + "DiamondLoupeFacet": "1.0.0", + "OwnershipFacet": "1.0.0", + "DexManagerFacet": "1.0.1", + "AccessManagerFacet": "1.0.0", + "WithdrawFacet": "1.0.0", + "PeripheryRegistryFacet": "1.0.0", + "GenericSwapFacet": "1.0.0", + "GenericSwapFacetV3": "1.0.1", + "LIFuelFacet": "1.0.1", + "CalldataVerificationFacet": "1.1.1", + "StandardizedCallFacet": "1.1.0", + "LiFiDiamondImmutable": "1.0.0", + "ERC20Proxy": "1.0.0", + "Executor": "2.0.0", + "FeeCollector": "1.0.0", + "Receiver": "2.0.2", + "LiFuelFeeCollector": "1.0.1", + "TokenWrapper": "1.0.0", + "LiFiDEXAggregator": "1.0.0", + "AllBridgeFacet": "2.0.0", + "AmarokFacet": "3.0.0", + "AmarokFacetPacked": "1.0.0", + "CBridgeFacet": "1.0.0", + "CBridgeFacetPacked": "1.0.3", + "RelayerCelerIM": "2.0.0", + "CelerIMFacetImmutable": "2.0.0", + "HyphenFacet": "1.0.0", + "MayanFacet": "1.0.0", "SquidFacet": "1.0.0", "StargateFacet": "2.2.0", "StargateFacetV2": "1.0.1", @@ -181,7 +257,8 @@ "HopFacet": "2.0.0", "HopFacetPacked": "1.0.6", "HopFacetOptimized": "2.0.0", - "OmniBridgeFacet": "1.0.0" + "OmniBridgeFacet": "1.0.0", + "GasZipPeriphery": "1.0.0" } } }, @@ -213,7 +290,8 @@ "RelayerCelerIM": "2.0.0", "CelerIMFacetMutable": "2.0.0", "SquidFacet": "1.0.0", - "StargateFacet": "2.2.0" + "StargateFacet": "2.2.0", + "GasZipPeriphery": "1.0.0" } } }, @@ -250,13 +328,13 @@ "RelayerCelerIM": "2.0.0", "CelerIMFacetMutable": "2.0.0", "MayanFacet": "1.0.0", - "RelayFacet": "\u001b[31m[error] the following filepath is invalid: \u001b[31m[error] could not find src FILE path for contract RelayFacet\u001b[0m\u001b[0m", "SquidFacet": "1.0.0", "StargateFacet": "2.2.0", "StargateFacetV2": "1.0.1", "ReceiverStargateV2": "1.0.0", "SymbiosisFacet": "1.0.0", - "ThorSwapFacet": "1.2.0" + "ThorSwapFacet": "1.2.0", + "GasZipPeriphery": "1.0.0" } } }, @@ -302,12 +380,12 @@ "HopFacetPacked": "1.0.6", "HopFacetOptimized": "2.0.0", "MayanFacet": "1.0.0", - "RelayFacet": "\u001b[31m[error] the following filepath is invalid: \u001b[31m[error] could not find src FILE path for contract RelayFacet\u001b[0m\u001b[0m", "SquidFacet": "1.0.0", "StargateFacet": "2.2.0", "StargateFacetV2": "1.0.1", "ReceiverStargateV2": "1.0.0", - "SymbiosisFacet": "1.0.0" + "SymbiosisFacet": "1.0.0", + "GasZipPeriphery": "1.0.0" } } }, @@ -352,11 +430,11 @@ "HopFacet": "2.0.0", "HopFacetPacked": "1.0.6", "HopFacetOptimized": "2.0.0", - "RelayFacet": "\u001b[31m[error] the following filepath is invalid: \u001b[31m[error] could not find src FILE path for contract RelayFacet\u001b[0m\u001b[0m", "StargateFacet": "2.2.0", "StargateFacetV2": "1.0.1", "ReceiverStargateV2": "1.0.0", - "SymbiosisFacet": "1.0.0" + "SymbiosisFacet": "1.0.0", + "GasZipPeriphery": "1.0.0" } } }, @@ -544,8 +622,8 @@ "CBridgeFacet": "1.0.0", "CBridgeFacetPacked": "1.0.3", "CelerIMFacetMutable": "2.0.0", - "RelayFacet": "\u001b[31m[error] the following filepath is invalid: \u001b[31m[error] could not find src FILE path for contract RelayFacet\u001b[0m\u001b[0m", - "SymbiosisFacet": "1.0.0" + "SymbiosisFacet": "1.0.0", + "GasZipPeriphery": "1.0.0" } } }, @@ -578,7 +656,6 @@ "CelerIMFacetMutable": "2.0.0", "HopFacet": "2.0.0", "HopFacetPacked": "1.0.6", - "RelayFacet": "\u001b[31m[error] the following filepath is invalid: \u001b[31m[error] could not find src FILE path for contract RelayFacet\u001b[0m\u001b[0m", "SymbiosisFacet": "1.0.0" } } @@ -613,11 +690,11 @@ "HopFacet": "2.0.0", "HopFacetPacked": "1.0.6", "HopFacetOptimized": "2.0.0", - "RelayFacet": "\u001b[31m[error] the following filepath is invalid: \u001b[31m[error] could not find src FILE path for contract RelayFacet\u001b[0m\u001b[0m", "StargateFacet": "2.2.0", "StargateFacetV2": "1.0.1", "ReceiverStargateV2": "1.0.0", - "SymbiosisFacet": "1.0.0" + "SymbiosisFacet": "1.0.0", + "GasZipPeriphery": "1.0.0" } } }, @@ -659,11 +736,11 @@ "HopFacet": "2.0.0", "HopFacetPacked": "1.0.6", "HopFacetOptimized": "2.0.0", - "RelayFacet": "\u001b[31m[error] the following filepath is invalid: \u001b[31m[error] could not find src FILE path for contract RelayFacet\u001b[0m\u001b[0m", "StargateFacet": "2.2.0", "StargateFacetV2": "1.0.1", "ReceiverStargateV2": "1.0.0", - "SymbiosisFacet": "1.0.0" + "SymbiosisFacet": "1.0.0", + "GasZipPeriphery": "1.0.0" } } }, @@ -722,7 +799,8 @@ "StargateFacet": "2.2.0", "StargateFacetV2": "1.0.1", "ReceiverStargateV2": "1.0.0", - "SymbiosisFacet": "1.0.0" + "SymbiosisFacet": "1.0.0", + "GasZipPeriphery": "1.0.0" } } }, @@ -757,11 +835,11 @@ "ReceiverAcrossV3": "1.0.0", "CBridgeFacet": "1.0.0", "CBridgeFacetPacked": "1.0.3", - "RelayFacet": "\u001b[31m[error] the following filepath is invalid: \u001b[31m[error] could not find src FILE path for contract RelayFacet\u001b[0m\u001b[0m", "StargateFacet": "2.2.0", "StargateFacetV2": "1.0.1", "ReceiverStargateV2": "1.0.0", - "SymbiosisFacet": "1.0.0" + "SymbiosisFacet": "1.0.0", + "GasZipPeriphery": "1.0.0" } } }, @@ -795,8 +873,8 @@ "AcrossFacetPackedV3": "1.0.0", "ReceiverAcrossV3": "1.0.0", "AmarokFacet": "3.0.0", - "RelayFacet": "\u001b[31m[error] the following filepath is invalid: \u001b[31m[error] could not find src FILE path for contract RelayFacet\u001b[0m\u001b[0m", - "SymbiosisFacet": "1.0.0" + "SymbiosisFacet": "1.0.0", + "GasZipPeriphery": "1.0.0" } } }, @@ -828,7 +906,8 @@ "StargateFacet": "2.2.0", "StargateFacetV2": "1.0.1", "ReceiverStargateV2": "1.0.0", - "SymbiosisFacet": "1.0.0" + "SymbiosisFacet": "1.0.0", + "GasZipPeriphery": "1.0.0" } } }, @@ -894,9 +973,9 @@ "ReceiverAcrossV3": "1.0.0", "CBridgeFacet": "1.0.0", "CBridgeFacetPacked": "1.0.3", - "RelayFacet": "\u001b[31m[error] the following filepath is invalid: \u001b[31m[error] could not find src FILE path for contract RelayFacet\u001b[0m\u001b[0m", "SquidFacet": "1.0.0", - "SymbiosisFacet": "1.0.0" + "SymbiosisFacet": "1.0.0", + "GasZipPeriphery": "1.0.0" } } }, @@ -985,7 +1064,8 @@ "LiFiDEXAggregator": "1.0.0", "StargateFacetV2": "1.0.1", "ReceiverStargateV2": "1.0.0", - "SymbiosisFacet": "1.0.0" + "SymbiosisFacet": "1.0.0", + "GasZipPeriphery": "1.0.0" } } }, @@ -1018,7 +1098,8 @@ "RelayerCelerIM": "2.0.0", "StargateFacetV2": "1.0.1", "ReceiverStargateV2": "1.0.0", - "SymbiosisFacet": "1.0.0" + "SymbiosisFacet": "1.0.0", + "GasZipPeriphery": "1.0.0" } } }, @@ -1249,7 +1330,8 @@ "TokenWrapper": "1.0.0", "LiFiDEXAggregator": "1.0.0", "CBridgeFacet": "1.0.0", - "CBridgeFacetPacked": "1.0.3" + "CBridgeFacetPacked": "1.0.3", + "GasZipPeriphery": "1.0.0" } } }, @@ -1333,8 +1415,7 @@ "LiFiDEXAggregator": "1.0.0", "AcrossFacetV3": "1.0.0", "AcrossFacetPackedV3": "1.0.0", - "ReceiverAcrossV3": "1.0.0", - "RelayFacet": "\u001b[31m[error] the following filepath is invalid: \u001b[31m[error] could not find src FILE path for contract RelayFacet\u001b[0m\u001b[0m" + "ReceiverAcrossV3": "1.0.0" } } }, @@ -1395,7 +1476,6 @@ "AcrossFacetV3": "1.0.0", "AcrossFacetPackedV3": "1.0.0", "ReceiverAcrossV3": "1.0.0", - "RelayFacet": "\u001b[31m[error] the following filepath is invalid: \u001b[31m[error] could not find src FILE path for contract RelayFacet\u001b[0m\u001b[0m", "StargateFacetV2": "1.0.1", "ReceiverStargateV2": "1.0.1" } diff --git a/script/deploy/facets/DeployGasZipFacet.s.sol b/script/deploy/facets/DeployGasZipFacet.s.sol new file mode 100644 index 000000000..627bb265f --- /dev/null +++ b/script/deploy/facets/DeployGasZipFacet.s.sol @@ -0,0 +1,36 @@ +// SPDX-License-Identifier: UNLICENSED +pragma solidity ^0.8.17; + +import { DeployScriptBase } from "./utils/DeployScriptBase.sol"; +import { GasZipFacet } from "lifi/Facets/GasZipFacet.sol"; +import { stdJson } from "forge-std/Script.sol"; + +contract DeployScript is DeployScriptBase { + using stdJson for string; + + constructor() DeployScriptBase("GasZipFacet") {} + + function run() + public + returns (GasZipFacet deployed, bytes memory constructorArgs) + { + constructorArgs = getConstructorArgs(); + + deployed = GasZipFacet(deploy(type(GasZipFacet).creationCode)); + } + + function getConstructorArgs() internal override returns (bytes memory) { + string memory gasZipConfig = string.concat( + root, + "/config/gaszip.json" + ); + + string memory gasZipConfigJson = vm.readFile(gasZipConfig); + + address gasZipRouter = gasZipConfigJson.readAddress( + string.concat(".gasZipRouters.", network) + ); + + return abi.encode(gasZipRouter); + } +} diff --git a/script/deploy/facets/DeployGasZipPeriphery.s.sol b/script/deploy/facets/DeployGasZipPeriphery.s.sol new file mode 100644 index 000000000..0bef977e4 --- /dev/null +++ b/script/deploy/facets/DeployGasZipPeriphery.s.sol @@ -0,0 +1,59 @@ +// SPDX-License-Identifier: UNLICENSED +pragma solidity ^0.8.17; + +import { DeployScriptBase } from "./utils/DeployScriptBase.sol"; +import { GasZipPeriphery } from "lifi/Periphery/GasZipPeriphery.sol"; +import { stdJson } from "forge-std/Script.sol"; + +contract DeployScript is DeployScriptBase { + using stdJson for string; + + constructor() DeployScriptBase("GasZipPeriphery") {} + + function run() + public + returns (GasZipPeriphery deployed, bytes memory constructorArgs) + { + constructorArgs = getConstructorArgs(); + + deployed = GasZipPeriphery(deploy(type(GasZipPeriphery).creationCode)); + } + + function getConstructorArgs() internal override returns (bytes memory) { + // get gasZipRouter address + string memory gasZipConfig = string.concat( + root, + "/config/gaszip.json" + ); + + string memory gasZipConfigJson = vm.readFile(gasZipConfig); + + address gasZipRouter = gasZipConfigJson.readAddress( + string.concat(".gasZipRouters.", network) + ); + + // get LiFiDEXAggregator address + string memory deployLog = string.concat( + root, + "/deployments/", + network, + ".", + fileSuffix, + "json" + ); + string memory json = vm.readFile(deployLog); + + address liFiDEXAggregator = json.readAddress(".LiFiDEXAggregator"); + + // get network's SAFE address to become contract owner for potential fund withdrawals + string memory networks = string.concat(root, "/config/networks.json"); + + string memory networksJson = vm.readFile(networks); + + address safeAddress = networksJson.readAddress( + string.concat(".", network, ".safeAddress") + ); + + return abi.encode(gasZipRouter, liFiDEXAggregator, safeAddress); + } +} diff --git a/script/deploy/facets/UpdateGasZipFacet.s.sol b/script/deploy/facets/UpdateGasZipFacet.s.sol new file mode 100644 index 000000000..8433024ee --- /dev/null +++ b/script/deploy/facets/UpdateGasZipFacet.s.sol @@ -0,0 +1,13 @@ +// SPDX-License-Identifier: UNLICENSED +pragma solidity ^0.8.17; + +import { UpdateScriptBase } from "./utils/UpdateScriptBase.sol"; + +contract DeployScript is UpdateScriptBase { + function run() + public + returns (address[] memory facets, bytes memory cutData) + { + return update("GasZipFacet"); + } +} diff --git a/script/deploy/resources/deployRequirements.json b/script/deploy/resources/deployRequirements.json index 2fd4bda7c..2fcb8bd11 100644 --- a/script/deploy/resources/deployRequirements.json +++ b/script/deploy/resources/deployRequirements.json @@ -532,5 +532,28 @@ "allowToDeployWithZeroAddress": "false" } } + }, + "GasZipFacet": { + "configData": { + "_gasZipRouter": { + "configFileName": "gaszip.json", + "keyInConfigFile": ".gasZipRouters.", + "allowToDeployWithZeroAddress": "false" + } + } + }, + "GasZipPeriphery": { + "configData": { + "_gasZipRouter": { + "configFileName": "gaszip.json", + "keyInConfigFile": ".gasZipRouters.", + "allowToDeployWithZeroAddress": "false" + } + }, + "contractAddresses": { + "LiFiDEXAggregator": { + "allowToDeployWithZeroAddress": "false" + } + } } } \ No newline at end of file diff --git a/script/deploy/safe/propose-to-safe.ts b/script/deploy/safe/propose-to-safe.ts index 58def0d61..6a3239a02 100644 --- a/script/deploy/safe/propose-to-safe.ts +++ b/script/deploy/safe/propose-to-safe.ts @@ -11,6 +11,21 @@ import { import * as chains from 'viem/chains' import { getSafeUtilityContracts, safeAddresses, safeApiUrls } from './config' import { getViemChainForNetworkName } from '../../utils/viemScriptHelpers' +import consola from 'consola' + +const retry = async (func: () => Promise, retries = 3): Promise => { + try { + const result = await func() + return result + } catch (e) { + if (retries > 0) { + consola.error('Retry after error:', e) + return retry(func, retries - 1) + } + + throw e + } +} const chainMap: Record = {} for (const [k, v] of Object.entries(chains)) { @@ -99,12 +114,14 @@ const main = defineCommand({ console.info('Proposing transaction to', args.to) // Propose transaction to the service - await safeService.proposeTransaction({ - safeAddress: await protocolKit.getAddress(), - safeTransactionData: safeTransaction.data, - safeTxHash, - senderAddress, - senderSignature: signature.data, + await retry(async () => { + safeService.proposeTransaction({ + safeAddress: await protocolKit.getAddress(), + safeTransactionData: safeTransaction.data, + safeTxHash, + senderAddress, + senderSignature: signature.data, + }) }) console.info('Transaction proposed') diff --git a/script/deploy/zksync/DeployGasZipFacet.s.sol b/script/deploy/zksync/DeployGasZipFacet.s.sol new file mode 100644 index 000000000..627bb265f --- /dev/null +++ b/script/deploy/zksync/DeployGasZipFacet.s.sol @@ -0,0 +1,36 @@ +// SPDX-License-Identifier: UNLICENSED +pragma solidity ^0.8.17; + +import { DeployScriptBase } from "./utils/DeployScriptBase.sol"; +import { GasZipFacet } from "lifi/Facets/GasZipFacet.sol"; +import { stdJson } from "forge-std/Script.sol"; + +contract DeployScript is DeployScriptBase { + using stdJson for string; + + constructor() DeployScriptBase("GasZipFacet") {} + + function run() + public + returns (GasZipFacet deployed, bytes memory constructorArgs) + { + constructorArgs = getConstructorArgs(); + + deployed = GasZipFacet(deploy(type(GasZipFacet).creationCode)); + } + + function getConstructorArgs() internal override returns (bytes memory) { + string memory gasZipConfig = string.concat( + root, + "/config/gaszip.json" + ); + + string memory gasZipConfigJson = vm.readFile(gasZipConfig); + + address gasZipRouter = gasZipConfigJson.readAddress( + string.concat(".gasZipRouters.", network) + ); + + return abi.encode(gasZipRouter); + } +} diff --git a/script/deploy/zksync/DeployGasZipPeriphery.s.sol b/script/deploy/zksync/DeployGasZipPeriphery.s.sol new file mode 100644 index 000000000..0bef977e4 --- /dev/null +++ b/script/deploy/zksync/DeployGasZipPeriphery.s.sol @@ -0,0 +1,59 @@ +// SPDX-License-Identifier: UNLICENSED +pragma solidity ^0.8.17; + +import { DeployScriptBase } from "./utils/DeployScriptBase.sol"; +import { GasZipPeriphery } from "lifi/Periphery/GasZipPeriphery.sol"; +import { stdJson } from "forge-std/Script.sol"; + +contract DeployScript is DeployScriptBase { + using stdJson for string; + + constructor() DeployScriptBase("GasZipPeriphery") {} + + function run() + public + returns (GasZipPeriphery deployed, bytes memory constructorArgs) + { + constructorArgs = getConstructorArgs(); + + deployed = GasZipPeriphery(deploy(type(GasZipPeriphery).creationCode)); + } + + function getConstructorArgs() internal override returns (bytes memory) { + // get gasZipRouter address + string memory gasZipConfig = string.concat( + root, + "/config/gaszip.json" + ); + + string memory gasZipConfigJson = vm.readFile(gasZipConfig); + + address gasZipRouter = gasZipConfigJson.readAddress( + string.concat(".gasZipRouters.", network) + ); + + // get LiFiDEXAggregator address + string memory deployLog = string.concat( + root, + "/deployments/", + network, + ".", + fileSuffix, + "json" + ); + string memory json = vm.readFile(deployLog); + + address liFiDEXAggregator = json.readAddress(".LiFiDEXAggregator"); + + // get network's SAFE address to become contract owner for potential fund withdrawals + string memory networks = string.concat(root, "/config/networks.json"); + + string memory networksJson = vm.readFile(networks); + + address safeAddress = networksJson.readAddress( + string.concat(".", network, ".safeAddress") + ); + + return abi.encode(gasZipRouter, liFiDEXAggregator, safeAddress); + } +} diff --git a/script/tasks/diamondSyncDEXs.sh b/script/tasks/diamondSyncDEXs.sh index de0fc38ee..3ee3d9623 100755 --- a/script/tasks/diamondSyncDEXs.sh +++ b/script/tasks/diamondSyncDEXs.sh @@ -114,7 +114,7 @@ function diamondSyncDEXs { CHECKSUMMED=$(cast --to-checksum-address "$DEX_ADDRESS") CODE=$(cast code $CHECKSUMMED --rpc-url "$RPC_URL") if [[ "$CODE" == "0x" ]]; then - echo "[warning] DEX $CHECKSUMMED is not deployed on network $NETWORK - skipping" + error "DEX $CHECKSUMMED is not deployed on network $NETWORK - skipping" echo "$NETWORK - $CHECKSUMMED" >>.invalid-dexs continue fi diff --git a/src/Facets/GasZipFacet.sol b/src/Facets/GasZipFacet.sol new file mode 100644 index 000000000..7af03cd92 --- /dev/null +++ b/src/Facets/GasZipFacet.sol @@ -0,0 +1,142 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.17; + +import { ILiFi } from "../Interfaces/ILiFi.sol"; +import { IGasZip } from "../Interfaces/IGasZip.sol"; +import { LibSwap } from "../Libraries/LibSwap.sol"; +import { LibAsset } from "../Libraries/LibAsset.sol"; +import { ReentrancyGuard } from "../Helpers/ReentrancyGuard.sol"; +import { SwapperV2 } from "../Helpers/SwapperV2.sol"; +import { Validatable } from "../Helpers/Validatable.sol"; +import { SafeTransferLib } from "solady/utils/SafeTransferLib.sol"; +import { InvalidCallData, CannotBridgeToSameNetwork, InvalidAmount } from "lifi/Errors/GenericErrors.sol"; + +/// @title GasZipFacet +/// @author LI.FI (https://li.fi) +/// @notice Provides functionality to swap ERC20 tokens to native and deposit them to the gas.zip protocol (https://www.gas.zip/) +/// @custom:version 2.0.0 +contract GasZipFacet is ILiFi, ReentrancyGuard, SwapperV2, Validatable { + using SafeTransferLib for address; + + error OnlyNativeAllowed(); + error TooManyChainIds(); + + /// State /// + address public constant NON_EVM_RECEIVER_IDENTIFIER = + 0x11f111f111f111F111f111f111F111f111f111F1; + IGasZip public immutable gasZipRouter; + + /// Constructor /// + constructor(address _gasZipRouter) { + gasZipRouter = IGasZip(_gasZipRouter); + } + + /// @notice Bridges tokens using the gas.zip protocol + /// @dev this function only supports native flow. For ERC20 flows this facet should be used as a protocol step instead + /// @param _bridgeData The core information needed for bridging + /// @param _gasZipData contains information which chains and address gas should be sent to + function startBridgeTokensViaGasZip( + ILiFi.BridgeData memory _bridgeData, + IGasZip.GasZipData calldata _gasZipData + ) + external + payable + nonReentrant + doesNotContainSourceSwaps(_bridgeData) + doesNotContainDestinationCalls(_bridgeData) + { + // this function / path shall only be used for native assets + if (!LibAsset.isNativeAsset(_bridgeData.sendingAssetId)) + revert OnlyNativeAllowed(); + + // make sure that msg.value matches the to-be-deposited amount + if (msg.value != _bridgeData.minAmount) revert InvalidAmount(); + + // deposit native to Gas.zip + _startBridge(_bridgeData, _gasZipData); + } + + /// @notice Performs one or multiple actions (e.g. fee collection, swapping) that must end with the native token before depositing to the gas.zip protocol + /// @param _bridgeData The core information needed for depositing + /// @param _swapData An array of swap related data for performing swaps before bridging + /// @param _gasZipData contains information which chains and address gas should be sent to + function swapAndStartBridgeTokensViaGasZip( + ILiFi.BridgeData memory _bridgeData, + LibSwap.SwapData[] calldata _swapData, + IGasZip.GasZipData calldata _gasZipData + ) + external + payable + nonReentrant + refundExcessNative(payable(msg.sender)) + containsSourceSwaps(_bridgeData) + doesNotContainDestinationCalls(_bridgeData) + { + // make sure that the output of the last swap step is native + if ( + !LibAsset.isNativeAsset( + _swapData[_swapData.length - 1].receivingAssetId + ) + ) revert InvalidCallData(); + + // deposit and swap ERC20 tokens to native + _bridgeData.minAmount = _depositAndSwap( + _bridgeData.transactionId, + _bridgeData.minAmount, + _swapData, + payable(msg.sender) + ); + + // deposit native to Gas.zip + _startBridge(_bridgeData, _gasZipData); + } + + /// @dev Contains the business logic for depositing to GasZip protocol + /// @param _bridgeData The core information needed for bridging + /// @param _gasZipData contains information which chains and address gas should be sent to + function _startBridge( + ILiFi.BridgeData memory _bridgeData, + IGasZip.GasZipData calldata _gasZipData + ) internal { + // make sure receiver address has a value to prevent potential loss of funds + if (_gasZipData.receiverAddress == bytes32(0)) + revert InvalidCallData(); + + // validate that receiverAddress matches with bridgeData in case of EVM target chain + if ( + _bridgeData.receiver != NON_EVM_RECEIVER_IDENTIFIER && + _gasZipData.receiverAddress != + bytes32(uint256(uint160(_bridgeData.receiver))) + ) revert InvalidCallData(); + + // validate bridgeData + // make sure destinationChainId is of a different network + if (_bridgeData.destinationChainId == block.chainid) + revert CannotBridgeToSameNetwork(); + + // We are depositing to a new contract that supports deposits for EVM chains + Solana (therefore 'receiver' address is bytes32) + gasZipRouter.deposit{ value: _bridgeData.minAmount }( + _gasZipData.destinationChains, + _gasZipData.receiverAddress + ); + + emit LiFiTransferStarted(_bridgeData); + } + + /// @dev Returns a value that signals to Gas.zip to which chains gas should be sent in equal parts + /// @param _chainIds a list of Gas.zip-specific chainIds (not the original chainIds), see https://dev.gas.zip/gas/chain-support/outbound + function getDestinationChainsValue( + uint8[] calldata _chainIds + ) external pure returns (uint256 destinationChains) { + uint256 length = _chainIds.length; + + if (length > 32) revert TooManyChainIds(); + + for (uint256 i; i < length; ++i) { + // Shift destinationChains left by 8 bits and add the next chainID + destinationChains = + (destinationChains << 8) | + uint256(_chainIds[i]); + } + } +} diff --git a/src/Interfaces/IGasZip.sol b/src/Interfaces/IGasZip.sol new file mode 100644 index 000000000..5a92a65ea --- /dev/null +++ b/src/Interfaces/IGasZip.sol @@ -0,0 +1,20 @@ +// SPDX-License-Identifier: MIT +/// @custom:version 1.0.0 +pragma solidity ^0.8.17; + +/// @title Interface for GasZip +/// @author LI.FI (https://li.fi) +interface IGasZip { + /// @dev GasZip-specific bridge data + /// @param receiverAddress the address on destination chain(s) where gas should be sent to + /// @param destinationChains a value that represents a list of chains to which gas should be distributed (see https://dev.gas.zip/gas/code-examples/deposit for more details) + struct GasZipData { + bytes32 receiverAddress; + // EVM addresses need to be padded with trailing 0s, e.g.: + // 0x391E7C679D29BD940D63BE94AD22A25D25B5A604000000000000000000000000 (correct) + // 0x000000000000000000000000391E7C679D29BD940D63BE94AD22A25D25B5A604 (incorrect) + uint256 destinationChains; + } + + function deposit(uint256 destinationChains, bytes32 to) external payable; +} diff --git a/src/Periphery/GasZipPeriphery.sol b/src/Periphery/GasZipPeriphery.sol new file mode 100644 index 000000000..1c4617597 --- /dev/null +++ b/src/Periphery/GasZipPeriphery.sol @@ -0,0 +1,125 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.17; + +import { ILiFi } from "../Interfaces/ILiFi.sol"; +import { IGasZip } from "../Interfaces/IGasZip.sol"; +import { LibSwap } from "../Libraries/LibSwap.sol"; +import { LibAsset, IERC20 } from "../Libraries/LibAsset.sol"; +import { LibUtil } from "../Libraries/LibUtil.sol"; +import { ReentrancyGuard } from "../Helpers/ReentrancyGuard.sol"; +import { SwapperV2 } from "../Helpers/SwapperV2.sol"; +import { WithdrawablePeriphery } from "../Helpers/WithdrawablePeriphery.sol"; +import { Validatable } from "../Helpers/Validatable.sol"; +import { SafeTransferLib } from "solady/utils/SafeTransferLib.sol"; +import { InvalidCallData } from "../Errors/GenericErrors.sol"; + +/// @title GasZipPeriphery +/// @author LI.FI (https://li.fi) +/// @notice Provides functionality to swap ERC20 tokens to use the gas.zip protocol as a pre-bridge step (https://www.gas.zip/) +/// @custom:version 1.0.0 +contract GasZipPeriphery is + ILiFi, + ReentrancyGuard, + SwapperV2, + Validatable, + WithdrawablePeriphery +{ + using SafeTransferLib for address; + + /// State /// + IGasZip public immutable gasZipRouter; + address public immutable liFiDEXAggregator; + + /// Errors /// + error TooManyChainIds(); + + /// Constructor /// + constructor( + address _gasZipRouter, + address _liFiDEXAggregator, + address _owner + ) WithdrawablePeriphery(_owner) { + gasZipRouter = IGasZip(_gasZipRouter); + liFiDEXAggregator = _liFiDEXAggregator; + } + + /// @notice Swaps ERC20 tokens to native and deposits these native tokens in the GasZip router contract + /// Swaps are only allowed via the LiFiDEXAggregator + /// @dev this function can be used as a LibSwap.SwapData protocol step to combine it with any other bridge + /// @param _swapData The swap data that executes the swap from ERC20 to native + /// @param _gasZipData contains information about which chains gas should be sent to + function depositToGasZipERC20( + LibSwap.SwapData calldata _swapData, + IGasZip.GasZipData calldata _gasZipData + ) public { + // deposit ERC20 asset from diamond + LibAsset.depositAsset(_swapData.sendingAssetId, _swapData.fromAmount); + + // max approve to DEX, if not already done + LibAsset.maxApproveERC20( + IERC20(_swapData.sendingAssetId), + liFiDEXAggregator, + type(uint256).max + ); + + // execute swap using LiFiDEXAggregator + // solhint-disable-next-line avoid-low-level-calls + (bool success, bytes memory res) = liFiDEXAggregator.call( + _swapData.callData + ); + if (!success) { + LibUtil.revertWith(res); + } + // extract the swap output amount from the call return value + uint256 swapOutputAmount = abi.decode(res, (uint256)); + + // deposit native tokens to Gas.zip protocol + depositToGasZipNative(_gasZipData, swapOutputAmount); + } + + /// @notice Deposits native tokens to the GasZip router contract + /// @dev this function can be used as a LibSwap.SwapData protocol step to combine it with any other bridge + /// @param _gasZipData contains information which chains and address gas should be sent to + /// @param _amount the total amount to be deposited (will be split equally across all chains) + function depositToGasZipNative( + IGasZip.GasZipData calldata _gasZipData, + uint256 _amount + ) public payable { + // make sure that receiverAddress is not 0 + if (_gasZipData.receiverAddress == bytes32(0)) + revert InvalidCallData(); + + // We are depositing to a new contract that supports deposits for EVM chains + Solana (therefore 'receiver' address is bytes32) + gasZipRouter.deposit{ value: _amount }( + _gasZipData.destinationChains, + _gasZipData.receiverAddress + ); + + // return unused native value to msg.sender, if any + // this is required due to LI.FI backend-internal requirements (money flow) + uint256 remainingNativeBalance = address(this).balance; + if (remainingNativeBalance > 0) { + msg.sender.safeTransferETH(remainingNativeBalance); + } + } + + /// @dev Returns a value that signals to Gas.zip to which chains gas should be sent in equal parts + /// @param _chainIds a list of Gas.zip-specific chainIds (not the original chainIds), see https://dev.gas.zip/gas/chain-support/outbound + function getDestinationChainsValue( + uint8[] calldata _chainIds + ) external pure returns (uint256 destinationChains) { + uint256 length = _chainIds.length; + + if (length > 32) revert TooManyChainIds(); + + for (uint256 i; i < length; ++i) { + // Shift destinationChains left by 8 bits and add the next chainID + destinationChains = + (destinationChains << 8) | + uint256(_chainIds[i]); + } + } + + // Required to receive ETH from ERC20-to-Native swaps + receive() external payable {} +} diff --git a/test/solidity/Facets/GasZipFacet.t.sol b/test/solidity/Facets/GasZipFacet.t.sol new file mode 100644 index 000000000..5973e6787 --- /dev/null +++ b/test/solidity/Facets/GasZipFacet.t.sol @@ -0,0 +1,494 @@ +// SPDX-License-Identifier: Unlicense +pragma solidity 0.8.17; +import { GasZipFacet } from "lifi/Facets/GasZipFacet.sol"; +import { IGasZip } from "lifi/Interfaces/IGasZip.sol"; +import { ILiFi, LibSwap, LibAllowList, TestBaseFacet, console, ERC20 } from "../utils/TestBaseFacet.sol"; +import { InvalidCallData, CannotBridgeToSameNetwork, InvalidAmount, InvalidReceiver } from "lifi/Errors/GenericErrors.sol"; + +// Stub GenericSwapFacet Contract +contract TestGasZipFacet is GasZipFacet { + constructor(address gasZipRouter) GasZipFacet(gasZipRouter) {} + + function addDex(address _dex) external { + LibAllowList.addAllowedContract(_dex); + } + + function removeDex(address _dex) external { + LibAllowList.removeAllowedContract(_dex); + } + + function setFunctionApprovalBySignature(bytes4 _signature) external { + LibAllowList.addAllowedSelector(_signature); + } +} + +contract GasZipFacetTest is TestBaseFacet { + address public constant GAS_ZIP_ROUTER_MAINNET = + 0x2a37D63EAdFe4b4682a3c28C1c2cD4F109Cc2762; + address public constant NON_EVM_RECEIVER_IDENTIFIER = + 0x11f111f111f111F111f111f111F111f111f111F1; + + TestGasZipFacet internal gasZipFacet; + IGasZip.GasZipData internal gasZipData; + + uint256 public defaultDestinationChains = 96; + uint256 internal defaultNativeDepositAmount = 1e16; + uint256 internal defaultERC20DepositAmount = 1e8; + address public defaultRecipientAddress = address(12345); + address public defaultRefundAddress = address(56789); + bytes32 internal defaultReceiverBytes32 = + bytes32(uint256(uint160(USER_RECEIVER))); + + event Deposit(address from, uint256 chains, uint256 amount, bytes32 to); + + error OnlyNativeAllowed(); + error TooManyChainIds(); + + function setUp() public { + // set custom block no for mainnet forking + customBlockNumberForForking = 20828620; + + initTestBase(); + + // deploy contracts + gasZipFacet = new TestGasZipFacet(GAS_ZIP_ROUTER_MAINNET); + + // add gasZipFacet to diamond + bytes4[] memory functionSelectors = new bytes4[](6); + functionSelectors[0] = gasZipFacet.startBridgeTokensViaGasZip.selector; + functionSelectors[1] = gasZipFacet + .swapAndStartBridgeTokensViaGasZip + .selector; + functionSelectors[2] = gasZipFacet.getDestinationChainsValue.selector; + + functionSelectors[3] = gasZipFacet.addDex.selector; + functionSelectors[4] = gasZipFacet.removeDex.selector; + functionSelectors[5] = gasZipFacet + .setFunctionApprovalBySignature + .selector; + addFacet(diamond, address(gasZipFacet), functionSelectors); + + gasZipFacet = TestGasZipFacet(payable(address(diamond))); + + // whitelist uniswap dex with function selectors + gasZipFacet.addDex(address(uniswap)); + gasZipFacet.addDex(address(gasZipFacet)); + gasZipFacet.setFunctionApprovalBySignature( + uniswap.swapExactTokensForTokens.selector + ); + gasZipFacet.setFunctionApprovalBySignature( + uniswap.swapTokensForExactETH.selector + ); + gasZipFacet.setFunctionApprovalBySignature( + uniswap.swapExactTokensForETH.selector + ); + gasZipFacet.setFunctionApprovalBySignature( + uniswap.swapETHForExactTokens.selector + ); + + setFacetAddressInTestBase(address(gasZipFacet), "GasZipFacet"); + + // produce valid GasZipData + uint8[] memory chainIds = new uint8[](1); + chainIds[0] = 17; // polygon + gasZipData = IGasZip.GasZipData({ + receiverAddress: bytes32(uint256(uint160(USER_RECEIVER))), + destinationChains: defaultDestinationChains + }); + + bridgeData.bridge = "GasZip"; + + vm.label(address(gasZipFacet), "LiFiDiamond"); + vm.label(ADDRESS_WRAPPED_NATIVE, "WRAPPED_NATIVE_TOKEN"); + vm.label(ADDRESS_USDC, "USDC_TOKEN"); + vm.label(ADDRESS_UNISWAP, "UNISWAP_V2_ROUTER"); + } + + function initiateBridgeTxWithFacet(bool isNative) internal override { + if (isNative) { + gasZipFacet.startBridgeTokensViaGasZip{ + value: bridgeData.minAmount + }(bridgeData, gasZipData); + } else { + gasZipFacet.startBridgeTokensViaGasZip(bridgeData, gasZipData); + } + } + + function initiateSwapAndBridgeTxWithFacet( + bool isNative + ) internal override { + if (isNative) { + gasZipFacet.swapAndStartBridgeTokensViaGasZip{ + value: swapData[0].fromAmount + }(bridgeData, swapData, gasZipData); + } else { + gasZipFacet.swapAndStartBridgeTokensViaGasZip( + bridgeData, + swapData, + gasZipData + ); + } + } + + function test_WillStoreConstructorParametersCorrectly() public { + gasZipFacet = new TestGasZipFacet(GAS_ZIP_ROUTER_MAINNET); + + assertEq(address(gasZipFacet.gasZipRouter()), GAS_ZIP_ROUTER_MAINNET); + } + + function testBase_CanBridgeTokens_fuzzed(uint256 amount) public override { + // deactivated for this facet since we would have to update the calldata that swaps from ERC20 to native for every amount + } + + function testBase_CanBridgeTokens() public override { + // the startBridgeTokensViaGasZip can only be used for native tokens, therefore we need to adapt this test case + vm.startPrank(USER_SENDER); + + // update bridgeData to use native + bridgeData.sendingAssetId = address(0); + bridgeData.minAmount = defaultNativeDepositAmount; + + //prepare check for events + vm.expectEmit(true, true, true, true, GAS_ZIP_ROUTER_MAINNET); + emit Deposit( + address(gasZipFacet), + defaultDestinationChains, + defaultNativeDepositAmount, + defaultReceiverBytes32 + ); + vm.expectEmit(true, true, true, true, _facetTestContractAddress); + emit LiFiTransferStarted(bridgeData); + + initiateBridgeTxWithFacet(true); + vm.stopPrank(); + } + + function testBase_CanBridgeNativeTokens() public override { + // defaultNativeAmount is too high, therefore we need to override this test + vm.startPrank(USER_SENDER); + // customize bridgeData + bridgeData.sendingAssetId = address(0); + bridgeData.minAmount = defaultNativeDepositAmount; // ~2 USD + + //prepare check for events + vm.expectEmit(true, true, true, true, GAS_ZIP_ROUTER_MAINNET); + emit Deposit( + address(gasZipFacet), + defaultDestinationChains, + defaultNativeDepositAmount, + defaultReceiverBytes32 + ); + vm.expectEmit(true, true, true, true, _facetTestContractAddress); + emit LiFiTransferStarted(bridgeData); + + initiateBridgeTxWithFacet(true); + vm.stopPrank(); + } + + function testBase_Revert_CallerHasInsufficientFunds() public override { + // the startBridgeTokensViaGasZip can only be used for native tokens, therefore this test case is not applicable + } + + function testRevert_WillFailWhenTryingToBridgeERC20() public { + vm.startPrank(USER_SENDER); + + // approval + usdc.approve(_facetTestContractAddress, bridgeData.minAmount); + + // expect the call to revert + vm.expectRevert(OnlyNativeAllowed.selector); + + initiateBridgeTxWithFacet(false); + vm.stopPrank(); + } + + function testBase_Revert_SwapAndBridgeWithInvalidSwapData() + public + override + { + // since the facets accesses the swapData parameter already before trying to execute the swap, we need to override the expected error message + vm.startPrank(USER_SENDER); + + // prepare bridgeData + bridgeData.hasSourceSwaps = true; + + // reset swap data + delete swapData; + + vm.expectRevert(); + + // execute call in child contract + initiateSwapAndBridgeTxWithFacet(false); + } + + function testBase_CanSwapAndBridgeTokens() public override { + vm.startPrank(USER_SENDER); + + // prepare bridgeData + bridgeData.hasSourceSwaps = true; + + // reset create swapData (5 DAI to native) + uint256 daiAmount = 5 * 10 ** dai.decimals(); + + // Swap DAI -> ETH + address[] memory path = new address[](2); + path[0] = ADDRESS_DAI; + path[1] = ADDRESS_WRAPPED_NATIVE; + + // Calculate DAI amount + uint256[] memory amounts = uniswap.getAmountsOut(daiAmount, path); + uint256 amountOut = amounts[1]; + bridgeData.minAmount = amountOut; + + delete swapData; + swapData.push( + LibSwap.SwapData({ + callTo: address(uniswap), + approveTo: address(uniswap), + sendingAssetId: ADDRESS_DAI, + receivingAssetId: address(0), + fromAmount: daiAmount, + callData: abi.encodeWithSelector( + uniswap.swapExactTokensForETH.selector, + daiAmount, + amountOut, + path, + _facetTestContractAddress, + block.timestamp + 20 minutes + ), + requiresDeposit: true + }) + ); + + // approval + dai.approve(_facetTestContractAddress, daiAmount); + + //prepare check for events + vm.expectEmit(true, true, true, true, _facetTestContractAddress); + emit AssetSwapped( + bridgeData.transactionId, + ADDRESS_UNISWAP, + ADDRESS_DAI, + address(0), + daiAmount, + bridgeData.minAmount, + block.timestamp + ); + + vm.expectEmit(true, true, true, true, _facetTestContractAddress); + emit LiFiTransferStarted(bridgeData); + + // execute call in child contract + initiateSwapAndBridgeTxWithFacet(false); + } + + function testBase_Revert_BridgeAndSwapWithInvalidReceiverAddress() + public + override + { + // since the 'validateBridgeData' modifier is not used, a different error is thrown here + + vm.startPrank(USER_SENDER); + // prepare bridgeData + bridgeData.receiver = address(0); + bridgeData.hasSourceSwaps = true; + + setDefaultSwapDataSingleDAItoUSDC(); + + vm.expectRevert(InvalidCallData.selector); + + initiateSwapAndBridgeTxWithFacet(false); + vm.stopPrank(); + } + + function testBase_Revert_SwapAndBridgeWithInvalidAmount() public override { + // since the '' modifier is not used, a different error is thrown here + + vm.startPrank(USER_SENDER); + // prepare bridgeData + bridgeData.hasSourceSwaps = true; + bridgeData.minAmount = 0; + + setDefaultSwapDataSingleDAItoUSDC(); + + vm.expectRevert(InvalidCallData.selector); + + initiateSwapAndBridgeTxWithFacet(false); + vm.stopPrank(); + } + + function testBase_Revert_BridgeToSameChainId() public override { + // we need to test this with native instead of ERC20 for this facet, therefore override + + vm.startPrank(USER_SENDER); + // customize bridgeData + bridgeData.sendingAssetId = address(0); + bridgeData.minAmount = defaultNativeDepositAmount; // ~2 USD + bridgeData.destinationChainId = block.chainid; + + vm.expectRevert(CannotBridgeToSameNetwork.selector); + + initiateBridgeTxWithFacet(true); + vm.stopPrank(); + } + + function testBase_Revert_BridgeWithInvalidAmount() public override { + // we need to test this with native instead of ERC20 for this facet, therefore override + + vm.startPrank(USER_SENDER); + // customize bridgeData + bridgeData.sendingAssetId = address(0); + bridgeData.minAmount = 0; + + // will fail when trying to send value that it doesnt have + vm.expectRevert(); + + initiateBridgeTxWithFacet(true); + vm.stopPrank(); + } + + function testBase_Revert_BridgeWithInvalidReceiverAddress() + public + override + { + // we need to test this with native instead of ERC20 for this facet, therefore override + + vm.startPrank(USER_SENDER); + // prepare bridgeData + bridgeData.sendingAssetId = address(0); + bridgeData.minAmount = defaultNativeDepositAmount; // ~2 USD + gasZipData.receiverAddress = bytes32(0); + + vm.expectRevert(InvalidCallData.selector); + + initiateBridgeTxWithFacet(true); + vm.stopPrank(); + } + + function testBase_Revert_SwapAndBridgeToSameChainId() public override { + // we need to test this with native swap output instead of ERC20 for this facet, therefore override + + vm.startPrank(USER_SENDER); + // prepare bridgeData + bridgeData.destinationChainId = block.chainid; + bridgeData.hasSourceSwaps = true; + + setDefaultSwapDataSingleDAItoETH(); // changed to native output calldata + dai.approve(_facetTestContractAddress, swapData[0].fromAmount); + + vm.expectRevert(CannotBridgeToSameNetwork.selector); + + initiateSwapAndBridgeTxWithFacet(false); + vm.stopPrank(); + } + + function test_getDestinationChainsValueReturnsCorrectValues() public { + // case 1 + uint8[] memory chainIds = new uint8[](1); + chainIds[0] = 17; // Polygon + + assertEq(gasZipFacet.getDestinationChainsValue(chainIds), 17); + + // case 2 + chainIds = new uint8[](2); + chainIds[0] = 51; + chainIds[1] = 52; + + assertEq(gasZipFacet.getDestinationChainsValue(chainIds), 13108); + + // case 3 + chainIds = new uint8[](5); + chainIds[0] = 15; // Avalanche + chainIds[1] = 54; // Base + chainIds[2] = 96; // Blast + chainIds[3] = 14; // BSC + chainIds[4] = 59; // Linea + + assertEq(gasZipFacet.getDestinationChainsValue(chainIds), 65336774203); + + chainIds = new uint8[](28); + chainIds[0] = 255; // Chain ID 255 + chainIds[1] = 57; // Chain ID 57 + chainIds[2] = 62; // Chain ID 62 + chainIds[3] = 15; // Chain ID 15 + chainIds[4] = 54; // Chain ID 54 + chainIds[5] = 96; // Chain ID 96 + chainIds[6] = 140; // Chain ID 140 + chainIds[7] = 148; // Chain ID 148 + chainIds[8] = 21; // Chain ID 21 + chainIds[9] = 20; // Chain ID 20 + chainIds[10] = 10; // Chain ID 10 + chainIds[11] = 31; // Chain ID 31 + chainIds[12] = 16; // Chain ID 16 + chainIds[13] = 59; // Chain ID 59 + chainIds[14] = 13; // Chain ID 13 + chainIds[15] = 30; // Chain ID 30 + chainIds[16] = 73; // Chain ID 73 + chainIds[17] = 28; // Chain ID 28 + chainIds[18] = 29; // Chain ID 29 + chainIds[19] = 55; // Chain ID 55 + chainIds[20] = 17; // Chain ID 17 + chainIds[21] = 52; // Chain ID 52 + chainIds[22] = 254; // Chain ID 254 + chainIds[23] = 41; // Chain ID 41 + chainIds[24] = 246; // Chain ID 246 + chainIds[25] = 249; // Chain ID 249 + chainIds[26] = 146; // Chain ID 146 + chainIds[27] = 51; // Chain ID 51 + + assertEq( + gasZipFacet.getDestinationChainsValue(chainIds), + 26878182541072503599461683703464409408182428609391216984945776497203 + ); + } + + function testRevert_WillFailIfMsgValueDoesNotMatchBridgeDataAmount() + public + { + vm.startPrank(USER_SENDER); + + // update bridgeData to use native + bridgeData.sendingAssetId = address(0); + bridgeData.minAmount = defaultERC20DepositAmount; + + vm.expectRevert(InvalidAmount.selector); + + gasZipFacet.startBridgeTokensViaGasZip{ + value: bridgeData.minAmount - 1 + }(bridgeData, gasZipData); + } + + function testRevert_WillFailIfMoreThan32ChainIds() public { + vm.startPrank(USER_SENDER); + + uint8[] memory chainIds = new uint8[](33); + + vm.expectRevert(TooManyChainIds.selector); + + gasZipFacet.getDestinationChainsValue(chainIds); + } + + function testRevert_WillFailIfEVMReceiverAddressesDontMatch() public { + vm.startPrank(USER_SENDER); + // customize bridgeData + bridgeData.sendingAssetId = address(0); + bridgeData.minAmount = defaultNativeDepositAmount; // ~2 USD + bridgeData.receiver = USER_PAUSER; + + vm.expectRevert(InvalidCallData.selector); + + initiateBridgeTxWithFacet(true); + vm.stopPrank(); + } + + function test_WillNotFailIfNonEVMReceiverAddressesDontMatch() public { + vm.startPrank(USER_SENDER); + // customize bridgeData + bridgeData.sendingAssetId = address(0); + bridgeData.minAmount = defaultNativeDepositAmount; // ~2 USD + bridgeData.receiver = NON_EVM_RECEIVER_IDENTIFIER; + + initiateBridgeTxWithFacet(true); + vm.stopPrank(); + } +} diff --git a/test/solidity/Facets/MayanFacet.t.sol b/test/solidity/Facets/MayanFacet.t.sol index 802c502c8..e30d67897 100644 --- a/test/solidity/Facets/MayanFacet.t.sol +++ b/test/solidity/Facets/MayanFacet.t.sol @@ -291,7 +291,6 @@ contract MayanFacetTest is TestBaseFacet { validMayanData = invalidMayanDataEVM2Solana; vm.startPrank(USER_SENDER); - console.log(USER_RECEIVER); usdc.approve(_facetTestContractAddress, type(uint256).max); vm.expectRevert( diff --git a/test/solidity/Periphery/GasZipPeriphery.t.sol b/test/solidity/Periphery/GasZipPeriphery.t.sol new file mode 100644 index 000000000..2de0cfb02 --- /dev/null +++ b/test/solidity/Periphery/GasZipPeriphery.t.sol @@ -0,0 +1,531 @@ +// SPDX-License-Identifier: Unlicense +pragma solidity 0.8.17; + +import { GasZipPeriphery } from "lifi/Periphery/GasZipPeriphery.sol"; +import { LibSwap } from "lifi/Libraries/LibSwap.sol"; +import { LibAllowList } from "lifi/Libraries/LibAllowList.sol"; +import { FeeCollector } from "lifi/Periphery/FeeCollector.sol"; +import { GnosisBridgeFacet } from "lifi/Facets/GnosisBridgeFacet.sol"; +import { TestGnosisBridgeFacet } from "test/solidity/Facets/GnosisBridgeFacet.t.sol"; +import { TestBase, console, ILiFi, ERC20 } from "../utils/TestBase.sol"; +import { IXDaiBridge } from "lifi/Interfaces/IXDaiBridge.sol"; +import { IGasZip } from "lifi/Interfaces/IGasZip.sol"; +import { NonETHReceiver } from "../utils/TestHelpers.sol"; +import { NativeAssetTransferFailed, InvalidCallData } from "lifi/Errors/GenericErrors.sol"; + +// Stub GenericSwapFacet Contract +contract TestGasZipPeriphery is GasZipPeriphery { + constructor( + address gasZipRouter, + address liFiDEXAggregator, + address owner + ) GasZipPeriphery(gasZipRouter, liFiDEXAggregator, owner) {} + + function addDex(address _dex) external { + LibAllowList.addAllowedContract(_dex); + } + + function removeDex(address _dex) external { + LibAllowList.removeAllowedContract(_dex); + } + + function setFunctionApprovalBySignature(bytes4 _signature) external { + LibAllowList.addAllowedSelector(_signature); + } +} + +contract GasZipPeripheryTest is TestBase { + address public constant GAS_ZIP_ROUTER_MAINNET = + 0x2a37D63EAdFe4b4682a3c28C1c2cD4F109Cc2762; + address public constant LIFI_DEX_AGGREGATOR_MAINNET = + 0xe43ca1Dee3F0fc1e2df73A0745674545F11A59F5; + address internal constant XDAI_BRIDGE = + 0x4aa42145Aa6Ebf72e164C9bBC74fbD3788045016; + + TestGnosisBridgeFacet internal gnosisBridgeFacet; + TestGasZipPeriphery internal gasZipPeriphery; + IGasZip.GasZipData internal defaultGasZipData; + address internal liFiDEXAggregator = LIFI_DEX_AGGREGATOR_MAINNET; + bytes32 internal defaultReceiverBytes32 = + bytes32(uint256(uint160(USER_RECEIVER))); + uint256 internal defaultNativeDepositAmount = 1e16; + + uint256 public defaultDestinationChains = 96; + + event Deposit(address from, uint256 chains, uint256 amount, bytes32 to); + + error TooManyChainIds(); + error ETHTransferFailed(); + + function setUp() public { + customBlockNumberForForking = 20931877; + initTestBase(); + + // deploy contracts + gasZipPeriphery = new TestGasZipPeriphery( + GAS_ZIP_ROUTER_MAINNET, + LIFI_DEX_AGGREGATOR_MAINNET, + USER_DIAMOND_OWNER + ); + defaultUSDCAmount = 10 * 10 ** usdc.decimals(); // 10 USDC + + // set up diamond with GnosisBridgeFacet so we have a bridge to test with + gnosisBridgeFacet = _getGnosisBridgeFacet(); + + defaultGasZipData = IGasZip.GasZipData({ + receiverAddress: defaultReceiverBytes32, + destinationChains: defaultDestinationChains + }); + + bridgeData.bridge = "gnosis"; + bridgeData.sendingAssetId = ADDRESS_DAI; + bridgeData.minAmount = defaultDAIAmount; + bridgeData.destinationChainId = 100; + + vm.label(address(gasZipPeriphery), "GasZipPeriphery"); + vm.label(LIFI_DEX_AGGREGATOR_MAINNET, "LiFiDEXAggregator"); + } + + function test_WillStoreConstructorParametersCorrectly() public { + gasZipPeriphery = new TestGasZipPeriphery( + GAS_ZIP_ROUTER_MAINNET, + LIFI_DEX_AGGREGATOR_MAINNET, + USER_DIAMOND_OWNER + ); + + assertEq( + address(gasZipPeriphery.gasZipRouter()), + GAS_ZIP_ROUTER_MAINNET + ); + assertEq( + gasZipPeriphery.liFiDEXAggregator(), + LIFI_DEX_AGGREGATOR_MAINNET + ); + } + + function test_CanDepositNative() public { + // set up expected event + vm.expectEmit(true, true, true, true, GAS_ZIP_ROUTER_MAINNET); + emit Deposit( + address(gasZipPeriphery), + defaultDestinationChains, + defaultNativeDepositAmount, + defaultReceiverBytes32 + ); + + // deposit via GasZip periphery contract + gasZipPeriphery.depositToGasZipNative{ + value: defaultNativeDepositAmount + }(defaultGasZipData, defaultNativeDepositAmount); + } + + function test_WillReturnAnyExcessNativeValueAfterDeposit() public { + vm.startPrank(USER_SENDER); + uint256 balanceBefore = USER_SENDER.balance; + // set up expected event + vm.expectEmit(true, true, true, true, GAS_ZIP_ROUTER_MAINNET); + emit Deposit( + address(gasZipPeriphery), + defaultDestinationChains, + defaultNativeDepositAmount, + defaultReceiverBytes32 + ); + + // deposit via GasZip periphery contract + gasZipPeriphery.depositToGasZipNative{ + value: defaultNativeDepositAmount * 5 + }(defaultGasZipData, defaultNativeDepositAmount); // sending 5 times the amount, expecting 4 times to be refunded + uint256 balanceAfter = USER_SENDER.balance; + assertEq(balanceBefore - defaultNativeDepositAmount, balanceAfter); + } + + function testRevert_WillFailIfRemainingNativeCannotBeReturned() public { + // deploy contract that cannot receive ETH + NonETHReceiver nonETHReceiver = new NonETHReceiver(); + + deal(address(nonETHReceiver), 1 ether); + + vm.startPrank(address(nonETHReceiver)); + + // set up expected event + vm.expectRevert(ETHTransferFailed.selector); + + // deposit via GasZip periphery contract + gasZipPeriphery.depositToGasZipNative{ + value: defaultNativeDepositAmount * 2 + }(defaultGasZipData, defaultNativeDepositAmount); // send twice the nativeAmount that is being deposited to trigger a refund + } + + function test_canCollectERC20FeesThenSwapToERC20ThenDepositThenBridge() + public + { + // Testcase: + // 1. pay 1 USDC fee to FeeCollector in USDC + // 2. swap remaining (9) USDC to DAI + // 3. deposit 2 DAI to gasZip + // 4. bridge remaining DAI to Gnosis using GnosisBridgeFacet + + deal(ADDRESS_USDC, address(this), defaultUSDCAmount); + + // get swapData for feeCollection + LibSwap.SwapData[] memory swapData = new LibSwap.SwapData[](3); + uint256 feeCollectionAmount = 1 * 10 ** usdc.decimals(); // 1 USD + + swapData[0] = LibSwap.SwapData( + address(feeCollector), + address(feeCollector), + ADDRESS_USDC, + ADDRESS_USDC, + defaultUSDCAmount, + abi.encodeWithSelector( + feeCollector.collectTokenFees.selector, + ADDRESS_USDC, + feeCollectionAmount, + 0, + address(this) + ), + true + ); + + // get swapData for USDC to DAI swap + uint256 swapInputAmount = defaultUSDCAmount - feeCollectionAmount; + // prepare swap data + address[] memory path = new address[](2); + path[0] = ADDRESS_USDC; + path[1] = ADDRESS_DAI; + + // Calculate USDC input amount + uint256[] memory amounts = uniswap.getAmountsOut( + swapInputAmount, + path + ); + uint256 swapOutputAmount = amounts[1]; + + swapData[1] = LibSwap.SwapData( + address(uniswap), + address(uniswap), + ADDRESS_USDC, + ADDRESS_DAI, + swapInputAmount, + abi.encodeWithSelector( + uniswap.swapExactTokensForTokens.selector, + swapInputAmount, + swapOutputAmount, + path, + address(diamond), + block.timestamp + 20 minutes + ), + false // not required since tokens are already in diamond + ); + + // // get swapData for gas zip + uint256 gasZipERC20Amount = 2 * 10 ** dai.decimals(); + ( + LibSwap.SwapData memory gasZipSwapData, + + ) = _getLiFiDEXAggregatorCalldataForERC20ToNativeSwap( + ADDRESS_DAI, + gasZipERC20Amount + ); + + swapData[2] = LibSwap.SwapData( + address(gasZipPeriphery), + address(gasZipPeriphery), + ADDRESS_DAI, + ADDRESS_DAI, + gasZipERC20Amount, + abi.encodeWithSelector( + gasZipPeriphery.depositToGasZipERC20.selector, + gasZipSwapData, + defaultGasZipData + ), + false // not required since tokens are already in the diamond + ); + + // get BridgeData + ILiFi.BridgeData memory bridgeData = ILiFi.BridgeData({ + transactionId: "", + bridge: "GnosisBridge", + integrator: "", + referrer: address(0), + sendingAssetId: ADDRESS_DAI, + receiver: USER_RECEIVER, + minAmount: swapOutputAmount - gasZipERC20Amount, + destinationChainId: 100, + hasSourceSwaps: true, + hasDestinationCall: false + }); + + // whitelist gasZipPeriphery and FeeCollector + gasZipPeriphery.addDex(address(gasZipPeriphery)); + gasZipPeriphery.setFunctionApprovalBySignature( + gasZipPeriphery.depositToGasZipERC20.selector + ); + gasZipPeriphery.addDex(address(feeCollector)); + gasZipPeriphery.setFunctionApprovalBySignature( + feeCollector.collectTokenFees.selector + ); + + // set approval for bridging + usdc.approve(address(gnosisBridgeFacet), defaultUSDCAmount); + + gnosisBridgeFacet.swapAndStartBridgeTokensViaXDaiBridge( + bridgeData, + swapData + ); + } + + function test_canDepositNativeThenSwapThenBridge() public { + // Testcase: + // 1. deposit small native amount to gasZip + // 2. swap remaining native to DAI + // 3. bridge remaining DAI to Gnosis using GnosisBridgeFacet + + uint256 nativeFromAmount = 1 ether; + + vm.deal(address(this), nativeFromAmount); + + uint256 nativeZipAmount = 1e14; + + // get swapData for gas zip + LibSwap.SwapData[] memory swapData = new LibSwap.SwapData[](2); + swapData[0] = LibSwap.SwapData( + address(gasZipPeriphery), + address(gasZipPeriphery), + address(0), + address(0), + nativeZipAmount, + abi.encodeWithSelector( + gasZipPeriphery.depositToGasZipNative.selector, + defaultGasZipData, + nativeZipAmount + ), + false + ); + + // get swapData for swap + uint256 swapInputAmount = nativeFromAmount - nativeZipAmount; + + // prepare swap data + address[] memory path = new address[](2); + path[0] = ADDRESS_WRAPPED_NATIVE; + path[1] = ADDRESS_DAI; + + // Calculate expected amountOut + uint256[] memory amounts = uniswap.getAmountsOut( + swapInputAmount, + path + ); + uint256 swapOutputAmount = amounts[1]; + + swapData[1] = LibSwap.SwapData( + address(uniswap), + address(uniswap), + address(0), + ADDRESS_DAI, + swapInputAmount, + abi.encodeWithSelector( + uniswap.swapExactETHForTokens.selector, + swapOutputAmount, + path, + address(diamond), + block.timestamp + 20 minutes + ), + false // not required since tokens are already in diamond + ); + + // get BridgeData + ILiFi.BridgeData memory bridgeData = ILiFi.BridgeData({ + transactionId: "", + bridge: "GnosisBridge", + integrator: "", + referrer: address(0), + sendingAssetId: ADDRESS_DAI, + receiver: USER_RECEIVER, + minAmount: swapOutputAmount, + destinationChainId: 100, + hasSourceSwaps: true, + hasDestinationCall: false + }); + + // whitelist gasZipPeriphery and FeeCollector + gasZipPeriphery.addDex(address(gasZipPeriphery)); + gasZipPeriphery.setFunctionApprovalBySignature( + gasZipPeriphery.depositToGasZipNative.selector + ); + + gnosisBridgeFacet.swapAndStartBridgeTokensViaXDaiBridge{ + value: nativeFromAmount + }(bridgeData, swapData); + } + + function test_getDestinationChainsValueReturnsCorrectValues() public { + // case 1 + uint8[] memory chainIds = new uint8[](1); + chainIds[0] = 17; // Polygon + + assertEq(gasZipPeriphery.getDestinationChainsValue(chainIds), 17); + + // case 2 + chainIds = new uint8[](2); + chainIds[0] = 51; + chainIds[1] = 52; + + assertEq(gasZipPeriphery.getDestinationChainsValue(chainIds), 13108); + + // case 3 + chainIds = new uint8[](5); + chainIds[0] = 15; // Avalanche + chainIds[1] = 54; // Base + chainIds[2] = 96; // Blast + chainIds[3] = 14; // BSC + chainIds[4] = 59; // Linea + + assertEq( + gasZipPeriphery.getDestinationChainsValue(chainIds), + 65336774203 + ); + } + + function testRevert_WillFailIfSwapViaLiFiDEXAggregatorIsUnsuccessful() + public + { + vm.startPrank(USER_SENDER); + + // set DAI approval for GasZipPeriphery + dai.approve(address(gasZipPeriphery), type(uint256).max); + + // // get swapData for gas zip + uint256 gasZipERC20Amount = 2 * 10 ** dai.decimals(); + ( + LibSwap.SwapData memory gasZipSwapData, + + ) = _getLiFiDEXAggregatorCalldataForERC20ToNativeSwap( + ADDRESS_DAI, + gasZipERC20Amount + ); + + // use an invalid function selector to force the call to LiFiDEXAggregator to fail + gasZipSwapData.callData = hex"3a3f7332"; + + // expect the following call to fail without an error reason + vm.expectRevert(); + + // execute the call + gasZipPeriphery.depositToGasZipERC20( + gasZipSwapData, + defaultGasZipData + ); + } + + function testRevert_WillFailIfMoreThan32ChainIds() public { + vm.startPrank(USER_SENDER); + + uint8[] memory chainIds = new uint8[](33); + + vm.expectRevert(TooManyChainIds.selector); + + gasZipPeriphery.getDestinationChainsValue(chainIds); + } + + function testRevert_WillFailIfCalledWithInvalidReceiverAddress() public { + vm.startPrank(USER_SENDER); + + defaultGasZipData.receiverAddress = bytes32(0); + + vm.expectRevert(InvalidCallData.selector); + + // deposit via GasZip periphery contract + gasZipPeriphery.depositToGasZipNative{ + value: defaultNativeDepositAmount + }(defaultGasZipData, defaultNativeDepositAmount); + } + + function _getGnosisBridgeFacet() + internal + returns (TestGnosisBridgeFacet _gnosisBridgeFacet) + { + _gnosisBridgeFacet = new TestGnosisBridgeFacet( + IXDaiBridge(XDAI_BRIDGE) + ); + + bytes4[] memory functionSelectors = new bytes4[](4); + functionSelectors[0] = _gnosisBridgeFacet + .startBridgeTokensViaXDaiBridge + .selector; + functionSelectors[1] = _gnosisBridgeFacet + .swapAndStartBridgeTokensViaXDaiBridge + .selector; + functionSelectors[2] = _gnosisBridgeFacet.addDex.selector; + functionSelectors[3] = _gnosisBridgeFacet + .setFunctionApprovalBySignature + .selector; + + addFacet(diamond, address(_gnosisBridgeFacet), functionSelectors); + + _gnosisBridgeFacet = TestGnosisBridgeFacet(address(diamond)); + + // whitelist DEXs / Periphery contracts + _gnosisBridgeFacet.addDex(address(uniswap)); + _gnosisBridgeFacet.addDex(address(gasZipPeriphery)); + _gnosisBridgeFacet.addDex(address(feeCollector)); + + // add function selectors for GasZipPeriphery + _gnosisBridgeFacet.setFunctionApprovalBySignature( + gasZipPeriphery.depositToGasZipERC20.selector + ); + _gnosisBridgeFacet.setFunctionApprovalBySignature( + gasZipPeriphery.depositToGasZipNative.selector + ); + + // add function selectors for FeeCollector + _gnosisBridgeFacet.setFunctionApprovalBySignature( + feeCollector.collectTokenFees.selector + ); + + // add function selectors for Uniswap + _gnosisBridgeFacet.setFunctionApprovalBySignature( + uniswap.swapExactTokensForTokens.selector + ); + _gnosisBridgeFacet.setFunctionApprovalBySignature( + uniswap.swapExactTokensForETH.selector + ); + _gnosisBridgeFacet.setFunctionApprovalBySignature( + uniswap.swapETHForExactTokens.selector + ); + _gnosisBridgeFacet.setFunctionApprovalBySignature( + uniswap.swapExactETHForTokens.selector + ); + + setFacetAddressInTestBase(address(gnosisBridgeFacet), "GnosisFacet"); + } + + function _getLiFiDEXAggregatorCalldataForERC20ToNativeSwap( + address sendingAssetId, + uint256 fromAmount + ) + internal + view + returns (LibSwap.SwapData memory swapData, uint256 amountOutMin) + { + // prepare swap data + address[] memory path = new address[](2); + path[0] = sendingAssetId; + path[1] = ADDRESS_WRAPPED_NATIVE; + + // Calculate USDC input amount + uint256[] memory amounts = uniswap.getAmountsOut(fromAmount, path); + amountOutMin = amounts[1]; + + swapData = LibSwap.SwapData( + liFiDEXAggregator, + liFiDEXAggregator, + sendingAssetId, + address(0), + fromAmount, + // this is calldata for the DEXAggregator to swap 2 DAI to native + hex"2646478b0000000000000000000000006b175474e89094c44da98b954eedeac495271d0f0000000000000000000000000000000000000000000000001bc16d674ec80000000000000000000000000000eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee0000000000000000000000000000000000000000000000000002f70244563dc70000000000000000000000007f2922c09dd671055c5abbc4f5657f874c18062900000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000073026B175474E89094C44Da98b954EedeAC495271d0F01ffff00A478c2975Ab1Ea89e8196811F51A7B7Ade33eB1101e43ca1Dee3F0fc1e2df73A0745674545F11A59F5000bb801C02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc201ffff02007F2922c09DD671055C5aBBC4F5657f874c18062900000000000000000000000000", + true + ); + } +} diff --git a/test/solidity/utils/TestBase.sol b/test/solidity/utils/TestBase.sol index 386f7821b..14813f95d 100644 --- a/test/solidity/utils/TestBase.sol +++ b/test/solidity/utils/TestBase.sol @@ -412,7 +412,7 @@ abstract contract TestBase is Test, DiamondTest, ILiFi { //@dev: be careful that _facetTestContractAddress is set before calling this function function setDefaultSwapDataSingleDAItoETH() internal virtual { delete swapData; - // Swap DAI -> USDC + // Swap DAI -> ETH address[] memory path = new address[](2); path[0] = ADDRESS_DAI; path[1] = ADDRESS_WRAPPED_NATIVE; diff --git a/yarn.lock b/yarn.lock index 0f30a8f38..668ed8ad6 100644 --- a/yarn.lock +++ b/yarn.lock @@ -766,6 +766,18 @@ resolved "https://registry.yarnpkg.com/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz#b520529ec21d8e5945a1851dfd1c32e94e39ff45" integrity sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA== +"@isaacs/cliui@^8.0.2": + version "8.0.2" + resolved "https://registry.yarnpkg.com/@isaacs/cliui/-/cliui-8.0.2.tgz#b37667b7bc181c168782259bab42474fbf52b550" + integrity sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA== + dependencies: + string-width "^5.1.2" + string-width-cjs "npm:string-width@^4.2.0" + strip-ansi "^7.0.1" + strip-ansi-cjs "npm:strip-ansi@^6.0.1" + wrap-ansi "^8.1.0" + wrap-ansi-cjs "npm:wrap-ansi@^7.0.0" + "@jridgewell/resolve-uri@^3.0.3": version "3.1.0" resolved "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz#2203b118c157721addfe69d47b70465463066d78" @@ -1194,6 +1206,24 @@ resolved "https://registry.yarnpkg.com/@nomiclabs/hardhat-waffle/-/hardhat-waffle-2.0.5.tgz#97c217f1db795395c04404291937edb528f3f218" integrity sha512-U1RH9OQ1mWYQfb+moX5aTgGjpVVlOcpiFI47wwnaGG4kLhcTy90cNiapoqZenxcRAITVbr0/+QSduINL5EsUIQ== +"@npmcli/agent@^2.0.0": + version "2.2.2" + resolved "https://registry.yarnpkg.com/@npmcli/agent/-/agent-2.2.2.tgz#967604918e62f620a648c7975461c9c9e74fc5d5" + integrity sha512-OrcNPXdpSl9UX7qPVRWbmWMCSXrcDa2M9DvrbOTj7ao1S4PlqVFYv9/yLKMkrJKZ/V5A/kDBC690or307i26Og== + dependencies: + agent-base "^7.1.0" + http-proxy-agent "^7.0.0" + https-proxy-agent "^7.0.1" + lru-cache "^10.0.1" + socks-proxy-agent "^8.0.3" + +"@npmcli/fs@^3.1.0": + version "3.1.1" + resolved "https://registry.yarnpkg.com/@npmcli/fs/-/fs-3.1.1.tgz#59cdaa5adca95d135fc00f2bb53f5771575ce726" + integrity sha512-q9CRWjpHCMIh5sVyefoD1cA7PkvILqCZsnSOEUUivORLjxCO/Irmue2DprETiNgEqktDBZaM1Bi+jrarx1XdCg== + dependencies: + semver "^7.3.5" + "@octokit/auth-token@^5.0.0": version "5.1.1" resolved "https://registry.yarnpkg.com/@octokit/auth-token/-/auth-token-5.1.1.tgz#3bbfe905111332a17f72d80bd0b51a3e2fa2cf07" @@ -1287,6 +1317,11 @@ dependencies: "@octokit/openapi-types" "^22.2.0" +"@pkgjs/parseargs@^0.11.0": + version "0.11.0" + resolved "https://registry.yarnpkg.com/@pkgjs/parseargs/-/parseargs-0.11.0.tgz#a77ea742fab25775145434eb1d2328cf5013ac33" + integrity sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg== + "@protobufjs/aspromise@^1.1.1", "@protobufjs/aspromise@^1.1.2": version "1.1.2" resolved "https://registry.yarnpkg.com/@protobufjs/aspromise/-/aspromise-1.1.2.tgz#9b8b0cc663d669a7d8f6f5d0893a14d348f30fbf" @@ -2147,6 +2182,11 @@ abbrev@1.0.x: resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.0.9.tgz#91b4792588a7738c25f35dd6f63752a2f8776135" integrity sha512-LEyx4aLEC3x6T0UguF6YILf+ntvmOaWsVfENmIW0E9H09vKlLDGelMjjSm0jkDHALj8A8quZ/HapKNigzwge+Q== +abbrev@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-2.0.0.tgz#cf59829b8b4f03f89dda2771cb7f3653828c89bf" + integrity sha512-6/mh1E2u2YgEsCHdY0Yx5oW+61gZU+1vXaoiHHrpKeuRNNgFvS+/jrwHiQhB5apAf5oB7UB7E19ol2R2LKH8hQ== + abitype@0.9.8: version "0.9.8" resolved "https://registry.yarnpkg.com/abitype/-/abitype-0.9.8.tgz#1f120b6b717459deafd213dfbf3a3dd1bf10ae8c" @@ -2251,6 +2291,13 @@ agent-base@6: dependencies: debug "4" +agent-base@^7.0.2, agent-base@^7.1.0, agent-base@^7.1.1: + version "7.1.1" + resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-7.1.1.tgz#bdbded7dfb096b751a2a087eeeb9664725b2e317" + integrity sha512-H0TSyFNDMomMNJQBn8wFV5YC/2eJ+VXECwOadZJT554xP6cODZHPX3H9QMQECxvrgiSOP1pHjy1sMWQVYJOUOA== + dependencies: + debug "^4.3.4" + agentkeepalive@^4.5.0: version "4.5.0" resolved "https://registry.yarnpkg.com/agentkeepalive/-/agentkeepalive-4.5.0.tgz#2673ad1389b3c418c5a20c5d7364f93ca04be923" @@ -2358,7 +2405,7 @@ ansi-styles@^4.0.0, ansi-styles@^4.1.0: dependencies: color-convert "^2.0.1" -ansi-styles@^6.0.0: +ansi-styles@^6.0.0, ansi-styles@^6.1.0: version "6.2.1" resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-6.2.1.tgz#0e62320cf99c21afff3b3012192546aacbfb05c5" integrity sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug== @@ -2955,6 +3002,24 @@ bytes@3.1.2: resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.1.2.tgz#8b0beeb98605adf1b128fa4386403c009e0221a5" integrity sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg== +cacache@^18.0.0: + version "18.0.4" + resolved "https://registry.yarnpkg.com/cacache/-/cacache-18.0.4.tgz#4601d7578dadb59c66044e157d02a3314682d6a5" + integrity sha512-B+L5iIa9mgcjLbliir2th36yEwPftrzteHYujzsx3dFP/31GCHcIeS8f5MGd80odLOjaOvSpU3EEAmRQptkxLQ== + dependencies: + "@npmcli/fs" "^3.1.0" + fs-minipass "^3.0.0" + glob "^10.2.2" + lru-cache "^10.0.1" + minipass "^7.0.3" + minipass-collect "^2.0.1" + minipass-flush "^1.0.5" + minipass-pipeline "^1.2.4" + p-map "^4.0.0" + ssri "^10.0.0" + tar "^6.1.11" + unique-filename "^3.0.0" + cacheable-lookup@^5.0.3: version "5.0.4" resolved "https://registry.yarnpkg.com/cacheable-lookup/-/cacheable-lookup-5.0.4.tgz#5a6b865b2c44357be3d5ebc2a467b032719a7005" @@ -3155,6 +3220,11 @@ chownr@^1.0.1, chownr@^1.1.1, chownr@^1.1.4: resolved "https://registry.yarnpkg.com/chownr/-/chownr-1.1.4.tgz#6fc9d7b42d32a583596337666e7d08084da2cc6b" integrity sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg== +chownr@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/chownr/-/chownr-2.0.0.tgz#15bfbe53d2eab4cf70f18a8cd68ebe5b3cb1dece" + integrity sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ== + ci-info@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-2.0.0.tgz#67a9e964be31a51e15e5010d58e6f12834002f46" @@ -3562,7 +3632,7 @@ cross-spawn@^6.0.5: shebang-command "^1.2.0" which "^1.2.9" -cross-spawn@^7.0.1, cross-spawn@^7.0.2, cross-spawn@^7.0.3: +cross-spawn@^7.0.0, cross-spawn@^7.0.1, cross-spawn@^7.0.2, cross-spawn@^7.0.3: version "7.0.3" resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.3.tgz#f73a85b9d5d41d045551c177e2882d4ac85728a6" integrity sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w== @@ -3990,6 +4060,13 @@ encodeurl@~1.0.2: resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.2.tgz#ad3ff4c86ec2d029322f5a02c3a9a606c95b3f59" integrity sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w== +encoding@^0.1.13: + version "0.1.13" + resolved "https://registry.yarnpkg.com/encoding/-/encoding-0.1.13.tgz#56574afdd791f54a8e9b2785c0582a2d26210fa9" + integrity sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A== + dependencies: + iconv-lite "^0.6.2" + end-of-stream@^1.0.0, end-of-stream@^1.1.0, end-of-stream@^1.4.1: version "1.4.4" resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.4.tgz#5ae64a5f45057baf3626ec14da0ca5e4b2431eb0" @@ -4017,6 +4094,11 @@ env-paths@^2.2.0: resolved "https://registry.yarnpkg.com/env-paths/-/env-paths-2.2.1.tgz#420399d416ce1fbe9bc0a07c62fa68d67fd0f8f2" integrity sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A== +err-code@^2.0.2: + version "2.0.3" + resolved "https://registry.yarnpkg.com/err-code/-/err-code-2.0.3.tgz#23c2f3b756ffdfc608d30e27c9a941024807e7f9" + integrity sha512-2bmlRpNKBxT/CRmPOlyISQpNj+qSeYvcym/uT0Jx2bMOlKLtSy1ZmLuVxSEKKyor/N5yhvp/ZiG1oE3DEYMSFA== + errno@~0.1.1: version "0.1.8" resolved "https://registry.yarnpkg.com/errno/-/errno-0.1.8.tgz#8bb3e9c7d463be4976ff888f76b4809ebc2e811f" @@ -4735,6 +4817,11 @@ expand-tilde@^2.0.0, expand-tilde@^2.0.2: dependencies: homedir-polyfill "^1.0.1" +exponential-backoff@^3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/exponential-backoff/-/exponential-backoff-3.1.1.tgz#64ac7526fe341ab18a39016cd22c787d01e00bf6" + integrity sha512-dX7e/LHVJ6W3DE1MHWi9S1EYzDESENfLrYohG2G++ovZrYOkm4Knwa0mc1cn84xJOR4KEU0WSchhLbd0UklbHw== + express@^4.14.0: version "4.18.2" resolved "https://registry.yarnpkg.com/express/-/express-4.18.2.tgz#3fabe08296e930c796c19e3c516979386ba9fd59" @@ -5047,6 +5134,14 @@ for-own@^1.0.0: dependencies: for-in "^1.0.1" +foreground-child@^3.1.0: + version "3.3.0" + resolved "https://registry.yarnpkg.com/foreground-child/-/foreground-child-3.3.0.tgz#0ac8644c06e431439f8561db8ecf29a7b5519c77" + integrity sha512-Ld2g8rrAyMYFXBhEqMz8ZAHBi4J4uS1i/CxGMDnjyFWddMXLVcDp051DZfu+t7+ab7Wv6SMqpWmyFIj5UbfFvg== + dependencies: + cross-spawn "^7.0.0" + signal-exit "^4.0.1" + forever-agent@~0.6.1: version "0.6.1" resolved "https://registry.yarnpkg.com/forever-agent/-/forever-agent-0.6.1.tgz#fbc71f0c41adeb37f96c577ad1ed42d8fdacca91" @@ -5164,6 +5259,20 @@ fs-minipass@^1.2.7: dependencies: minipass "^2.6.0" +fs-minipass@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/fs-minipass/-/fs-minipass-2.1.0.tgz#7f5036fdbf12c63c169190cbe4199c852271f9fb" + integrity sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg== + dependencies: + minipass "^3.0.0" + +fs-minipass@^3.0.0: + version "3.0.3" + resolved "https://registry.yarnpkg.com/fs-minipass/-/fs-minipass-3.0.3.tgz#79a85981c4dc120065e96f62086bf6f9dc26cc54" + integrity sha512-XUBA9XClHbnJWSfBzjkm6RvPsyg3sryZt06BEQoXcF7EK/xpGaQYJgQKDJSUH5SGZ76Y7pFx1QBnXz09rU5Fbw== + dependencies: + minipass "^7.0.3" + fs.realpath@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" @@ -5329,6 +5438,18 @@ glob@7.2.0: once "^1.3.0" path-is-absolute "^1.0.0" +glob@^10.2.2, glob@^10.3.10: + version "10.4.5" + resolved "https://registry.yarnpkg.com/glob/-/glob-10.4.5.tgz#f4d9f0b90ffdbab09c9d77f5f29b4262517b0956" + integrity sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg== + dependencies: + foreground-child "^3.1.0" + jackspeak "^3.1.2" + minimatch "^9.0.4" + minipass "^7.1.2" + package-json-from-dist "^1.0.0" + path-scurry "^1.11.1" + glob@^5.0.15: version "5.0.15" resolved "https://registry.yarnpkg.com/glob/-/glob-5.0.15.tgz#1bc936b9e02f4a603fcc222ecf7633d30b8b93b1" @@ -5551,7 +5672,7 @@ graceful-fs@^4.1.11, graceful-fs@^4.1.9: resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.10.tgz#147d3a006da4ca3ce14728c7aefc287c367d7a6c" integrity sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA== -graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.2.0, graceful-fs@^4.2.4: +graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.2.0, graceful-fs@^4.2.4, graceful-fs@^4.2.6: version "4.2.11" resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.11.tgz#4183e4e8bf08bb6e05bbb2f7d2e0c8f712ca40e3" integrity sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ== @@ -5803,6 +5924,11 @@ http-cache-semantics@^4.0.0: resolved "https://registry.yarnpkg.com/http-cache-semantics/-/http-cache-semantics-4.1.0.tgz#49e91c5cbf36c9b94bcfcd71c23d5249ec74e390" integrity sha512-carPklcUh7ROWRK7Cv27RPtdhYhUsela/ue5/jKzjegVvXDqM2ILE9Q2BGn9JZJh1g87cp56su/FgQSzcWS8cQ== +http-cache-semantics@^4.1.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/http-cache-semantics/-/http-cache-semantics-4.1.1.tgz#abe02fcb2985460bf0323be664436ec3476a6d5a" + integrity sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ== + http-errors@2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-2.0.0.tgz#b7774a1486ef73cf7667ac9ae0858c012c57b9d3" @@ -5819,6 +5945,14 @@ http-https@^1.0.0: resolved "https://registry.yarnpkg.com/http-https/-/http-https-1.0.0.tgz#2f908dd5f1db4068c058cd6e6d4ce392c913389b" integrity sha512-o0PWwVCSp3O0wS6FvNr6xfBCHgt0m1tvPLFOCc2iFDKTRAXhB7m8klDf7ErowFH8POa6dVdGatKU5I1YYwzUyg== +http-proxy-agent@^7.0.0: + version "7.0.2" + resolved "https://registry.yarnpkg.com/http-proxy-agent/-/http-proxy-agent-7.0.2.tgz#9a8b1f246866c028509486585f62b8f2c18c270e" + integrity sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig== + dependencies: + agent-base "^7.1.0" + debug "^4.3.4" + http-signature@~1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/http-signature/-/http-signature-1.2.0.tgz#9aecd925114772f3d95b65a60abb8f7c18fbace1" @@ -5852,6 +5986,14 @@ https-proxy-agent@^5.0.0: agent-base "6" debug "4" +https-proxy-agent@^7.0.1: + version "7.0.5" + resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-7.0.5.tgz#9e8b5013873299e11fab6fd548405da2d6c602b2" + integrity sha512-1e4Wqeblerz+tMKPIq2EMGiiWW1dIjZOksyHWSUm1rmuvw/how9hBHZ38lAGj5ID4Ik6EdkOw7NmWPy6LAwalw== + dependencies: + agent-base "^7.0.2" + debug "4" + human-signals@^4.3.0: version "4.3.1" resolved "https://registry.yarnpkg.com/human-signals/-/human-signals-4.3.1.tgz#ab7f811e851fca97ffbd2c1fe9a958964de321b2" @@ -5876,6 +6018,13 @@ iconv-lite@0.4.24, iconv-lite@^0.4.24: dependencies: safer-buffer ">= 2.1.2 < 3" +iconv-lite@^0.6.2: + version "0.6.3" + resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.6.3.tgz#a52f80bf38da1952eb5c681790719871a1a72501" + integrity sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw== + dependencies: + safer-buffer ">= 2.1.2 < 3.0.0" + idna-uts46-hx@^2.3.1: version "2.3.1" resolved "https://registry.yarnpkg.com/idna-uts46-hx/-/idna-uts46-hx-2.3.1.tgz#a1dc5c4df37eee522bf66d969cc980e00e8711f9" @@ -6028,6 +6177,14 @@ io-ts@1.10.4: dependencies: fp-ts "^1.0.0" +ip-address@^9.0.5: + version "9.0.5" + resolved "https://registry.yarnpkg.com/ip-address/-/ip-address-9.0.5.tgz#117a960819b08780c3bd1f14ef3c1cc1d3f3ea5a" + integrity sha512-zHtQzGojZXTwZTHQqra+ETKd4Sn3vgi7uBmlPoXVWZqYvuKmtI0l/VZTjqGmJY9x88GGOaZ9+G9ES8hC4T4X8g== + dependencies: + jsbn "1.1.0" + sprintf-js "^1.1.3" + ipaddr.js@1.9.1: version "1.9.1" resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-1.9.1.tgz#bff38543eeb8984825079ff3a2a8e6cbd46781b3" @@ -6171,6 +6328,11 @@ is-interactive@^2.0.0: resolved "https://registry.yarnpkg.com/is-interactive/-/is-interactive-2.0.0.tgz#40c57614593826da1100ade6059778d597f16e90" integrity sha512-qP1vozQRI+BMOPcjFzrjXuQvdak2pHNUMZoeG2eRbiSqyvbEf/wQtEOTOX1guk6E3t36RkaqiSt8A/6YElNxLQ== +is-lambda@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-lambda/-/is-lambda-1.0.1.tgz#3d9877899e6a53efc0160504cde15f82e6f061d5" + integrity sha512-z7CMFGNrENq5iFB9Bqo64Xk6Y9sg+epq1myIcdHaGnbMTYOxvzsEtdYqQUylB7LxfkvgrrjP32T6Ywciio9UIQ== + is-negative-zero@^2.0.2: version "2.0.2" resolved "https://registry.yarnpkg.com/is-negative-zero/-/is-negative-zero-2.0.2.tgz#7bf6f03a28003b8b3965de3ac26f664d765f3150" @@ -6336,6 +6498,11 @@ isexe@^2.0.0: resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" integrity sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw== +isexe@^3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/isexe/-/isexe-3.1.1.tgz#4a407e2bd78ddfb14bea0c27c6f7072dde775f0d" + integrity sha512-LpB/54B+/2J5hqQ7imZHfdU31OlgQqx7ZicVlkm9kzg9/w8GKLEcFfJl/t7DCEDueOyBAD6zCCwTO6Fzs0NoEQ== + isobject@^3.0.0, isobject@^3.0.1: version "3.0.1" resolved "https://registry.yarnpkg.com/isobject/-/isobject-3.0.1.tgz#4e431e92b11a9731636aa1f9c8d1ccbcfdab78df" @@ -6377,6 +6544,15 @@ isstream@~0.1.2: resolved "https://registry.yarnpkg.com/isstream/-/isstream-0.1.2.tgz#47e63f7af55afa6f92e1500e690eb8b8529c099a" integrity sha512-Yljz7ffyPbrLpLngrMtZ7NduUgVvi6wG9RJ9IUcyCd59YQ911PBJphODUcbOVbqYfxe1wuYf/LJ8PauMRwsM/g== +jackspeak@^3.1.2: + version "3.4.3" + resolved "https://registry.yarnpkg.com/jackspeak/-/jackspeak-3.4.3.tgz#8833a9d89ab4acde6188942bd1c53b6390ed5a8a" + integrity sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw== + dependencies: + "@isaacs/cliui" "^8.0.2" + optionalDependencies: + "@pkgjs/parseargs" "^0.11.0" + jayson@^4.1.0: version "4.1.0" resolved "https://registry.yarnpkg.com/jayson/-/jayson-4.1.0.tgz#60dc946a85197317f2b1439d672a8b0a99cea2f9" @@ -6458,6 +6634,11 @@ jsbi@^3.1.1: resolved "https://registry.yarnpkg.com/jsbi/-/jsbi-3.2.5.tgz#b37bb90e0e5c2814c1c2a1bcd8c729888a2e37d6" integrity sha512-aBE4n43IPvjaddScbvWRA2YlTzKEynHzu7MqOyTipdHucf/VxS63ViCjxYRg86M8Rxwbt/GfzHl1kKERkt45fQ== +jsbn@1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-1.1.0.tgz#b01307cb29b618a1ed26ec79e911f803c4da0040" + integrity sha512-4bYVV3aAMtDTTu4+xsDYa6sy9GyJ69/amsu9sYF2zqjiEoZA5xJi3BrfX3uY+/IekIu7MwdObdbDWpoZdBv3/A== + jsbn@~0.1.0: version "0.1.1" resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-0.1.1.tgz#a5e654c2e5a2deb5f201d96cefbca80c0ef2f513" @@ -6873,6 +7054,11 @@ lowercase-keys@^3.0.0: resolved "https://registry.yarnpkg.com/lowercase-keys/-/lowercase-keys-3.0.0.tgz#c5e7d442e37ead247ae9db117a9d0a467c89d4f2" integrity sha512-ozCC6gdQ+glXOQsveKD0YsDy8DSQFjDTz4zyzEHNV5+JP5D62LmfDZ6o1cycFx9ouG940M5dE8C8CTewdj2YWQ== +lru-cache@^10.0.1, lru-cache@^10.2.0: + version "10.4.3" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-10.4.3.tgz#410fc8a17b70e598013df257c2446b7f3383f119" + integrity sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ== + lru-cache@^5.1.1: version "5.1.1" resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-5.1.1.tgz#1da27e6710271947695daf6848e847f01d84b920" @@ -6907,6 +7093,24 @@ make-error@^1.1.1: resolved "https://registry.yarnpkg.com/make-error/-/make-error-1.3.6.tgz#2eb2e37ea9b67c4891f684a1394799af484cf7a2" integrity sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw== +make-fetch-happen@^13.0.0: + version "13.0.1" + resolved "https://registry.yarnpkg.com/make-fetch-happen/-/make-fetch-happen-13.0.1.tgz#273ba2f78f45e1f3a6dca91cede87d9fa4821e36" + integrity sha512-cKTUFc/rbKUd/9meOvgrpJ2WrNzymt6jfRDdwg5UCnVzv9dTpEj9JS5m3wtziXVCjluIXyL8pcaukYqezIzZQA== + dependencies: + "@npmcli/agent" "^2.0.0" + cacache "^18.0.0" + http-cache-semantics "^4.1.1" + is-lambda "^1.0.1" + minipass "^7.0.2" + minipass-fetch "^3.0.0" + minipass-flush "^1.0.5" + minipass-pipeline "^1.2.4" + negotiator "^0.6.3" + proc-log "^4.2.0" + promise-retry "^2.0.1" + ssri "^10.0.0" + make-iterator@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/make-iterator/-/make-iterator-1.0.1.tgz#29b33f312aa8f547c4a5e490f56afcec99133ad6" @@ -7120,6 +7324,45 @@ minimist@^1.2.0, minimist@^1.2.5, minimist@^1.2.6: resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.7.tgz#daa1c4d91f507390437c6a8bc01078e7000c4d18" integrity sha512-bzfL1YUZsP41gmu/qjrEk0Q6i2ix/cVeAhbCbqH9u3zYutS1cLg00qhrD0M2MVdCcx4Sc0UpP2eBWo9rotpq6g== +minipass-collect@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/minipass-collect/-/minipass-collect-2.0.1.tgz#1621bc77e12258a12c60d34e2276ec5c20680863" + integrity sha512-D7V8PO9oaz7PWGLbCACuI1qEOsq7UKfLotx/C0Aet43fCUB/wfQ7DYeq2oR/svFJGYDHPr38SHATeaj/ZoKHKw== + dependencies: + minipass "^7.0.3" + +minipass-fetch@^3.0.0: + version "3.0.5" + resolved "https://registry.yarnpkg.com/minipass-fetch/-/minipass-fetch-3.0.5.tgz#f0f97e40580affc4a35cc4a1349f05ae36cb1e4c" + integrity sha512-2N8elDQAtSnFV0Dk7gt15KHsS0Fyz6CbYZ360h0WTYV1Ty46li3rAXVOQj1THMNLdmrD9Vt5pBPtWtVkpwGBqg== + dependencies: + minipass "^7.0.3" + minipass-sized "^1.0.3" + minizlib "^2.1.2" + optionalDependencies: + encoding "^0.1.13" + +minipass-flush@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/minipass-flush/-/minipass-flush-1.0.5.tgz#82e7135d7e89a50ffe64610a787953c4c4cbb373" + integrity sha512-JmQSYYpPUqX5Jyn1mXaRwOda1uQ8HP5KAT/oDSLCzt1BYRhQU0/hDtsB1ufZfEEzMZ9aAVmsBw8+FWsIXlClWw== + dependencies: + minipass "^3.0.0" + +minipass-pipeline@^1.2.4: + version "1.2.4" + resolved "https://registry.yarnpkg.com/minipass-pipeline/-/minipass-pipeline-1.2.4.tgz#68472f79711c084657c067c5c6ad93cddea8214c" + integrity sha512-xuIq7cIOt09RPRJ19gdi4b+RiNvDFYe5JH+ggNvBqGqpQXcru3PcRmOZuHBKWK1Txf9+cQ+HMVN4d6z46LZP7A== + dependencies: + minipass "^3.0.0" + +minipass-sized@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/minipass-sized/-/minipass-sized-1.0.3.tgz#70ee5a7c5052070afacfbc22977ea79def353b70" + integrity sha512-MbkQQ2CTiBMlA2Dm/5cY+9SWFEN8pzzOXi6rlM5Xxq0Yqbda5ZQy9sU75a673FE9ZK0Zsbr6Y5iP6u9nktfg2g== + dependencies: + minipass "^3.0.0" + minipass@^2.6.0, minipass@^2.9.0: version "2.9.0" resolved "https://registry.yarnpkg.com/minipass/-/minipass-2.9.0.tgz#e713762e7d3e32fed803115cf93e04bca9fcc9a6" @@ -7128,6 +7371,23 @@ minipass@^2.6.0, minipass@^2.9.0: safe-buffer "^5.1.2" yallist "^3.0.0" +minipass@^3.0.0: + version "3.3.6" + resolved "https://registry.yarnpkg.com/minipass/-/minipass-3.3.6.tgz#7bba384db3a1520d18c9c0e5251c3444e95dd94a" + integrity sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw== + dependencies: + yallist "^4.0.0" + +minipass@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/minipass/-/minipass-5.0.0.tgz#3e9788ffb90b694a5d0ec94479a45b5d8738133d" + integrity sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ== + +"minipass@^5.0.0 || ^6.0.2 || ^7.0.0", minipass@^7.0.2, minipass@^7.0.3, minipass@^7.1.2: + version "7.1.2" + resolved "https://registry.yarnpkg.com/minipass/-/minipass-7.1.2.tgz#93a9626ce5e5e66bd4db86849e7515e92340a707" + integrity sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw== + minizlib@^1.3.3: version "1.3.3" resolved "https://registry.yarnpkg.com/minizlib/-/minizlib-1.3.3.tgz#2290de96818a34c29551c8a8d301216bd65a861d" @@ -7135,6 +7395,14 @@ minizlib@^1.3.3: dependencies: minipass "^2.9.0" +minizlib@^2.1.1, minizlib@^2.1.2: + version "2.1.2" + resolved "https://registry.yarnpkg.com/minizlib/-/minizlib-2.1.2.tgz#e90d3466ba209b932451508a11ce3d3632145931" + integrity sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg== + dependencies: + minipass "^3.0.0" + yallist "^4.0.0" + mkdirp-classic@^0.5.2: version "0.5.3" resolved "https://registry.yarnpkg.com/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz#fa10c9115cc6d8865be221ba47ee9bed78601113" @@ -7147,7 +7415,7 @@ mkdirp-promise@^5.0.1: dependencies: mkdirp "*" -mkdirp@*, mkdirp@^1.0.4: +mkdirp@*, mkdirp@^1.0.3, mkdirp@^1.0.4: version "1.0.4" resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-1.0.4.tgz#3eb5ed62622756d79a5f0e2a221dfebad75c2f7e" integrity sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw== @@ -7312,7 +7580,7 @@ natural-compare@^1.4.0: resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" integrity sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw== -negotiator@0.6.3: +negotiator@0.6.3, negotiator@^0.6.3: version "0.6.3" resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.3.tgz#58e323a72fedc0d6f9cd4d31fe49f51479590ccd" integrity sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg== @@ -7376,6 +7644,22 @@ node-gyp-build@^4.2.0, node-gyp-build@^4.3.0: resolved "https://registry.yarnpkg.com/node-gyp-build/-/node-gyp-build-4.5.0.tgz#7a64eefa0b21112f89f58379da128ac177f20e40" integrity sha512-2iGbaQBV+ITgCz76ZEjmhUKAKVf7xfY1sRl4UiKQspfZMH2h06SyhNsnSVy50cwkFQDGLyif6m/6uFXHkOZ6rg== +node-gyp@^10.2.0: + version "10.2.0" + resolved "https://registry.yarnpkg.com/node-gyp/-/node-gyp-10.2.0.tgz#80101c4aa4f7ab225f13fcc8daaaac4eb1a8dd86" + integrity sha512-sp3FonBAaFe4aYTcFdZUn2NYkbP7xroPGYvQmP4Nl5PxamznItBnNCgjrVTKrEfQynInMsJvZrdmqUnysCJ8rw== + dependencies: + env-paths "^2.2.0" + exponential-backoff "^3.1.1" + glob "^10.3.10" + graceful-fs "^4.2.6" + make-fetch-happen "^13.0.0" + nopt "^7.0.0" + proc-log "^4.1.0" + semver "^7.3.5" + tar "^6.2.1" + which "^4.0.0" + node-plop@^0.31.1: version "0.31.1" resolved "https://registry.yarnpkg.com/node-plop/-/node-plop-0.31.1.tgz#20dd03e6ffe6d5c56bc38fc0b04df3475c33c7d5" @@ -7407,6 +7691,13 @@ nopt@3.x: dependencies: abbrev "1" +nopt@^7.0.0: + version "7.2.1" + resolved "https://registry.yarnpkg.com/nopt/-/nopt-7.2.1.tgz#1cac0eab9b8e97c9093338446eddd40b2c8ca1e7" + integrity sha512-taM24ViiimT/XntxbPyJQzCG+p4EKOpgD3mxFwW38mGjVUrfERQOeY4EDHjdnptttfHuHQXFx+lTP08Q+mLa/w== + dependencies: + abbrev "^2.0.0" + normalize-path@^3.0.0, normalize-path@~3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65" @@ -7713,6 +8004,11 @@ p-try@^1.0.0: resolved "https://registry.yarnpkg.com/p-try/-/p-try-1.0.0.tgz#cbc79cdbaf8fd4228e13f621f2b1a237c1b207b3" integrity sha512-U1etNYuMJoIz3ZXSrrySFjsXQTWOx2/jdi86L+2pRvph/qMKL6sbcCYdH23fqsbm8TH2Gn0OybpT4eSFlCVHww== +package-json-from-dist@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/package-json-from-dist/-/package-json-from-dist-1.0.0.tgz#e501cd3094b278495eb4258d4c9f6d5ac3019f00" + integrity sha512-dATvCeZN/8wQsGywez1mzHtTlP22H8OEfPrVMLNr4/eGa+ijtLn/6M5f0dY8UKNrC2O9UCU6SSoG3qRKnt7STw== + param-case@^3.0.4: version "3.0.4" resolved "https://registry.yarnpkg.com/param-case/-/param-case-3.0.4.tgz#7d17fe4aa12bde34d4a77d91acfb6219caad01c5" @@ -7859,6 +8155,14 @@ path-root@^0.1.1: dependencies: path-root-regex "^0.1.0" +path-scurry@^1.11.1: + version "1.11.1" + resolved "https://registry.yarnpkg.com/path-scurry/-/path-scurry-1.11.1.tgz#7960a668888594a0720b12a911d1a742ab9f11d2" + integrity sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA== + dependencies: + lru-cache "^10.2.0" + minipass "^5.0.0 || ^6.0.2 || ^7.0.0" + path-to-regexp@0.1.7: version "0.1.7" resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-0.1.7.tgz#df604178005f522f15eb4490e7247a1bfaa67f8c" @@ -8033,6 +8337,11 @@ prettier@^2.3.1: resolved "https://registry.yarnpkg.com/prettier/-/prettier-2.8.8.tgz#e8c5d7e98a4305ffe3de2e1fc4aca1a71c28b1da" integrity sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q== +proc-log@^4.1.0, proc-log@^4.2.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/proc-log/-/proc-log-4.2.0.tgz#b6f461e4026e75fdfe228b265e9f7a00779d7034" + integrity sha512-g8+OnU/L2v+wyiVK+D5fA34J7EH8jZ8DDlvwhRCMxmMj7UCBvxiO1mGeN+36JXIKF4zevU4kRBd8lVgG9vLelA== + process-nextick-args@~2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.1.tgz#7820d9b16120cc55ca9ae7792680ae7dba6d7fe2" @@ -8058,6 +8367,14 @@ progress@^2.0.0: resolved "https://registry.yarnpkg.com/progress/-/progress-2.0.3.tgz#7e8cf8d8f5b8f239c1bc68beb4eb78567d572ef8" integrity sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA== +promise-retry@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/promise-retry/-/promise-retry-2.0.1.tgz#ff747a13620ab57ba688f5fc67855410c370da22" + integrity sha512-y+WKFlBR8BGXnsNlIHFGPZmyDf3DFMoLhaflAnyZgV6rG6xu+JwesTo2Q9R6XwYmtmwAFCkAk3e35jEdoeh/3g== + dependencies: + err-code "^2.0.2" + retry "^0.12.0" + proto3-json-serializer@^0.1.8: version "0.1.9" resolved "https://registry.yarnpkg.com/proto3-json-serializer/-/proto3-json-serializer-0.1.9.tgz#705ddb41b009dd3e6fcd8123edd72926abf65a34" @@ -8524,6 +8841,11 @@ retry@0.13.1: resolved "https://registry.yarnpkg.com/retry/-/retry-0.13.1.tgz#185b1587acf67919d63b357349e03537b2484658" integrity sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg== +retry@^0.12.0: + version "0.12.0" + resolved "https://registry.yarnpkg.com/retry/-/retry-0.12.0.tgz#1b42a6266a21f07421d1b0b54b7dc167b01c013b" + integrity sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow== + reusify@^1.0.4: version "1.0.4" resolved "https://registry.yarnpkg.com/reusify/-/reusify-1.0.4.tgz#90da382b1e126efc02146e90845a88db12925d76" @@ -8667,7 +8989,7 @@ safe-stable-stringify@^2.1.0, safe-stable-stringify@^2.3.1: resolved "https://registry.yarnpkg.com/safe-stable-stringify/-/safe-stable-stringify-2.4.1.tgz#34694bd8a30575b7f94792aa51527551bd733d61" integrity sha512-dVHE6bMtS/bnL2mwualjc6IxEv1F+OCUpA46pKUj6F8uDbUM0jCCulPqRNPSnWwGNKx5etqMjZYdXtrm5KJZGA== -"safer-buffer@>= 2.1.2 < 3", safer-buffer@^2.0.2, safer-buffer@^2.1.0, safer-buffer@~2.1.0: +"safer-buffer@>= 2.1.2 < 3", "safer-buffer@>= 2.1.2 < 3.0.0", safer-buffer@^2.0.2, safer-buffer@^2.1.0, safer-buffer@~2.1.0: version "2.1.2" resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== @@ -8733,6 +9055,11 @@ semver@^7.3.4, semver@^7.3.7, semver@^7.3.8: dependencies: lru-cache "^6.0.0" +semver@^7.3.5: + version "7.6.3" + resolved "https://registry.yarnpkg.com/semver/-/semver-7.6.3.tgz#980f7b5550bc175fb4dc09403085627f9eb33143" + integrity sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A== + semver@^7.5.4, semver@^7.6.0: version "7.6.0" resolved "https://registry.yarnpkg.com/semver/-/semver-7.6.0.tgz#1a46a4db4bffcccd97b743b5005c8325f23d4e2d" @@ -8871,6 +9198,11 @@ signal-exit@^3.0.2, signal-exit@^3.0.7: resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.7.tgz#a9a1767f8af84155114eaabd73f99273c8f59ad9" integrity sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ== +signal-exit@^4.0.1: + version "4.1.0" + resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-4.1.0.tgz#952188c1cbd546070e2dd20d0f41c0ae0530cb04" + integrity sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw== + simple-concat@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/simple-concat/-/simple-concat-1.0.1.tgz#f46976082ba35c2263f1c8ab5edfe26c41c9552f" @@ -8935,6 +9267,11 @@ slice-ansi@^5.0.0: ansi-styles "^6.0.0" is-fullwidth-code-point "^4.0.0" +smart-buffer@^4.2.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/smart-buffer/-/smart-buffer-4.2.0.tgz#6e1d71fa4f18c05f7d0ff216dd16a481d0e8d9ae" + integrity sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg== + snake-case@^3.0.4: version "3.0.4" resolved "https://registry.yarnpkg.com/snake-case/-/snake-case-3.0.4.tgz#4f2bbd568e9935abdfd593f34c691dadb49c452c" @@ -8943,6 +9280,23 @@ snake-case@^3.0.4: dot-case "^3.0.4" tslib "^2.0.3" +socks-proxy-agent@^8.0.3: + version "8.0.4" + resolved "https://registry.yarnpkg.com/socks-proxy-agent/-/socks-proxy-agent-8.0.4.tgz#9071dca17af95f483300316f4b063578fa0db08c" + integrity sha512-GNAq/eg8Udq2x0eNiFkr9gRg5bA7PXEWagQdeRX4cPSG+X/8V38v637gim9bjFptMk1QWsCTr0ttrJEiXbNnRw== + dependencies: + agent-base "^7.1.1" + debug "^4.3.4" + socks "^2.8.3" + +socks@^2.8.3: + version "2.8.3" + resolved "https://registry.yarnpkg.com/socks/-/socks-2.8.3.tgz#1ebd0f09c52ba95a09750afe3f3f9f724a800cb5" + integrity sha512-l5x7VUUWbjVFbafGLxPWkYsHIhEvmF85tbIeFZWc8ZPtoMyybuEhL7Jye/ooC4/d48FgOjSJXgsF/AJPYCW8Zw== + dependencies: + ip-address "^9.0.5" + smart-buffer "^4.2.0" + solc@0.7.3: version "0.7.3" resolved "https://registry.yarnpkg.com/solc/-/solc-0.7.3.tgz#04646961bd867a744f63d2b4e3c0701ffdc7d78a" @@ -9072,6 +9426,11 @@ split2@^4.0.0: resolved "https://registry.yarnpkg.com/split2/-/split2-4.1.0.tgz#101907a24370f85bb782f08adaabe4e281ecf809" integrity sha512-VBiJxFkxiXRlUIeyMQi8s4hgvKCSjtknJv/LVYbrgALPwf5zSKmEwV9Lst25AkvMDnvxODugjdl6KZgwKM1WYQ== +sprintf-js@^1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.1.3.tgz#4914b903a2f8b685d17fdf78a70e917e872e444a" + integrity sha512-Oo+0REFV59/rz3gfJNKQiBlwfHaSESl1pcGyABQsnnIfWOFt6JNj5gCog2U6MLZ//IGYD+nA8nI+mTShREReaA== + sprintf-js@~1.0.2: version "1.0.3" resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" @@ -9103,6 +9462,13 @@ sshpk@^1.7.0: safer-buffer "^2.0.2" tweetnacl "~0.14.0" +ssri@^10.0.0: + version "10.0.6" + resolved "https://registry.yarnpkg.com/ssri/-/ssri-10.0.6.tgz#a8aade2de60ba2bce8688e3fa349bad05c7dc1e5" + integrity sha512-MGrFH9Z4NP9Iyhqn16sDtBpRRNJ0Y2hNa6D65h736fVSaPCHr4DM4sWUNvVaSuC+0OBGhwsrydQwmgfg5LncqQ== + dependencies: + minipass "^7.0.3" + stacktrace-parser@^0.1.10: version "0.1.10" resolved "https://registry.yarnpkg.com/stacktrace-parser/-/stacktrace-parser-0.1.10.tgz#29fb0cae4e0d0b85155879402857a1639eb6051a" @@ -9159,6 +9525,15 @@ string-format@^2.0.0: resolved "https://registry.yarnpkg.com/string-format/-/string-format-2.0.0.tgz#f2df2e7097440d3b65de31b6d40d54c96eaffb9b" integrity sha512-bbEs3scLeYNXLecRRuk6uJxdXUSj6le/8rNPHChIJTn2V79aXVTR1EH2OH5zLKKoz0V02fOUKZZcw01pLUShZA== +"string-width-cjs@npm:string-width@^4.2.0", string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3: + version "4.2.3" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" + integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== + dependencies: + emoji-regex "^8.0.0" + is-fullwidth-code-point "^3.0.0" + strip-ansi "^6.0.1" + string-width@^2.1.0: version "2.1.1" resolved "https://registry.yarnpkg.com/string-width/-/string-width-2.1.1.tgz#ab93f27a8dc13d28cac815c462143a6d9012ae9e" @@ -9176,16 +9551,7 @@ string-width@^3.0.0: is-fullwidth-code-point "^2.0.0" strip-ansi "^5.1.0" -string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3: - version "4.2.3" - resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" - integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== - dependencies: - emoji-regex "^8.0.0" - is-fullwidth-code-point "^3.0.0" - strip-ansi "^6.0.1" - -string-width@^5.0.0: +string-width@^5.0.0, string-width@^5.0.1, string-width@^5.1.2: version "5.1.2" resolved "https://registry.yarnpkg.com/string-width/-/string-width-5.1.2.tgz#14f8daec6d81e7221d2a357e668cab73bdbca794" integrity sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA== @@ -9231,6 +9597,13 @@ string_decoder@~1.1.1: dependencies: safe-buffer "~5.1.0" +"strip-ansi-cjs@npm:strip-ansi@^6.0.1", strip-ansi@^6.0.0, strip-ansi@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" + integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== + dependencies: + ansi-regex "^5.0.1" + strip-ansi@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-4.0.0.tgz#a8479022eb1ac368a871389b635262c505ee368f" @@ -9245,13 +9618,6 @@ strip-ansi@^5.1.0: dependencies: ansi-regex "^4.1.0" -strip-ansi@^6.0.0, strip-ansi@^6.0.1: - version "6.0.1" - resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" - integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== - dependencies: - ansi-regex "^5.0.1" - strip-ansi@^7.0.1: version "7.1.0" resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-7.1.0.tgz#d5b6568ca689d8561370b0707685d22434faff45" @@ -9439,6 +9805,18 @@ tar@^4.0.2: safe-buffer "^5.2.1" yallist "^3.1.1" +tar@^6.1.11, tar@^6.2.1: + version "6.2.1" + resolved "https://registry.yarnpkg.com/tar/-/tar-6.2.1.tgz#717549c541bc3c2af15751bea94b1dd068d4b03a" + integrity sha512-DZ4yORTwrbTj/7MZYq2w+/ZFdI6OZ/f9SFHR+71gIVUZhOQPHzVCLpvRnPgyaMpfWxxk/4ONva3GQSyNIKRv6A== + dependencies: + chownr "^2.0.0" + fs-minipass "^2.0.0" + minipass "^5.0.0" + minizlib "^2.1.1" + mkdirp "^1.0.3" + yallist "^4.0.0" + text-encoding-utf-8@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/text-encoding-utf-8/-/text-encoding-utf-8-1.0.2.tgz#585b62197b0ae437e3c7b5d0af27ac1021e10d13" @@ -9822,6 +10200,20 @@ unfetch@^4.2.0: resolved "https://registry.yarnpkg.com/unfetch/-/unfetch-4.2.0.tgz#7e21b0ef7d363d8d9af0fb929a5555f6ef97a3be" integrity sha512-F9p7yYCn6cIW9El1zi0HI6vqpeIvBsr3dSuRO6Xuppb1u5rXpCPmMvLSyECLhybr9isec8Ohl0hPekMVrEinDA== +unique-filename@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/unique-filename/-/unique-filename-3.0.0.tgz#48ba7a5a16849f5080d26c760c86cf5cf05770ea" + integrity sha512-afXhuC55wkAmZ0P18QsVE6kp8JaxrEokN2HGIoIVv2ijHQd419H0+6EigAFcIzXeMIkcIkNBpB3L/DXB3cTS/g== + dependencies: + unique-slug "^4.0.0" + +unique-slug@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/unique-slug/-/unique-slug-4.0.0.tgz#6bae6bb16be91351badd24cdce741f892a6532e3" + integrity sha512-WrcA6AyEfqDX5bWige/4NQfPZMtASNVxdmWR76WESYQVAACSgWcR6e9i0mofqqBxYFtL4oAxPIptY73/0YE1DQ== + dependencies: + imurmurhash "^0.1.4" + universal-user-agent@^7.0.0, universal-user-agent@^7.0.2: version "7.0.2" resolved "https://registry.yarnpkg.com/universal-user-agent/-/universal-user-agent-7.0.2.tgz#52e7d0e9b3dc4df06cc33cb2b9fd79041a54827e" @@ -10761,6 +11153,13 @@ which@^2.0.1: dependencies: isexe "^2.0.0" +which@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/which/-/which-4.0.0.tgz#cd60b5e74503a3fbcfbf6cd6b4138a8bae644c1a" + integrity sha512-GlaYyEb07DPxYCKhKzplCWBJtvxZcZMrL+4UkrTSJHHPyZU4mYYTv3qaOe77H7EODLSSopAUFAc6W8U4yqvscg== + dependencies: + isexe "^3.1.1" + word-wrap@^1.2.3, word-wrap@~1.2.3: version "1.2.3" resolved "https://registry.yarnpkg.com/word-wrap/-/word-wrap-1.2.3.tgz#610636f6b1f703891bd34771ccb17fb93b47079c" @@ -10784,6 +11183,15 @@ workerpool@6.2.1: resolved "https://registry.yarnpkg.com/workerpool/-/workerpool-6.2.1.tgz#46fc150c17d826b86a008e5a4508656777e9c343" integrity sha512-ILEIE97kDZvF9Wb9f6h5aXK4swSlKGUcOEGiIYb2OOu/IrDU9iwj0fD//SsA6E5ibwJxpEvhullJY4Sl4GcpAw== +"wrap-ansi-cjs@npm:wrap-ansi@^7.0.0", wrap-ansi@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" + integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== + dependencies: + ansi-styles "^4.0.0" + string-width "^4.1.0" + strip-ansi "^6.0.0" + wrap-ansi@^6.2.0: version "6.2.0" resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-6.2.0.tgz#e9393ba07102e6c91a3b221478f0257cd2856e53" @@ -10793,14 +11201,14 @@ wrap-ansi@^6.2.0: string-width "^4.1.0" strip-ansi "^6.0.0" -wrap-ansi@^7.0.0: - version "7.0.0" - resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" - integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== +wrap-ansi@^8.1.0: + version "8.1.0" + resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-8.1.0.tgz#56dc22368ee570face1b49819975d9b9a5ead214" + integrity sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ== dependencies: - ansi-styles "^4.0.0" - string-width "^4.1.0" - strip-ansi "^6.0.0" + ansi-styles "^6.1.0" + string-width "^5.0.1" + strip-ansi "^7.0.1" wrappy@1: version "1.0.2"