diff --git a/audit/auditLog.json b/audit/auditLog.json index 7223e2f0b..139bcc5d0 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)", @@ -57,6 +64,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 000000000..d1d9d46a9 Binary files /dev/null and b/audit/reports/2024.11.07_GasZip.pdf differ diff --git a/config/dexs.json b/config/dexs.json index 8cea44ae3..291892b43 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", @@ -366,7 +371,8 @@ "0x6140b987d6B51Fd75b66C3B07733Beb5167c42fc", "0x3D2f8ae0344d38525d2AE96Ab750B83480c0844F", "0x2214A42d8e2A1d20635c2cb0664422c528B6A432", - "0xf2614A233c7C3e7f08b1F887Ba133a13f1eb2c55", + "0x9a21E33F1a78b17DAd32010CeDB9Fd2F071C17d3", + "0xf2614A233c7C3e7f08b1F887Ba133a13f1eb2c55" "0xf332761c673b59b21ff6dfa8ada44d78c12def09", "0x70cBb871E8f30Fc8Ce23609E9E0Ea87B6b222F58" ], @@ -418,6 +424,7 @@ "0x6140b987d6B51Fd75b66C3B07733Beb5167c42fc", "0x1e9B24073183d5c6B7aE5FB4b8f0b1dd83FDC77a", "0xBBDe1d67297329148Fe1ED5e6B00114842728e65", + "0x9a21E33F1a78b17DAd32010CeDB9Fd2F071C17d3", "0xf2614A233c7C3e7f08b1F887Ba133a13f1eb2c55" ], "gravity": [ @@ -425,6 +432,7 @@ "0x7fA60f4A59Dd8285C5Fcd8fd2A92A2Ca45ef8a0C", "0x6140b987d6B51Fd75b66C3B07733Beb5167c42fc", "0x134f525AC05E4724e55C363A9C4FA35ceB13F88d", + "0x9a21E33F1a78b17DAd32010CeDB9Fd2F071C17d3", "0x6352a56caadc4f1e25cd6c75970fa768a3304e64" ], "immutablezkevm": [ @@ -493,6 +501,7 @@ "0x46b3fdf7b5cde91ac049936bf0bdb12c5d22202e", "0x000000000000175a8b9bc6d539b3708eed92ea6c", "0xcaA342e4f781d63EF41E220D7622B97E66BAEcF3", + "0x0ec6D2eEb94541C51620830D151995fCFf83Aa74", "0xf2614A233c7C3e7f08b1F887Ba133a13f1eb2c55", "0x6b2c0c7be2048daa9b5527982c29f48062b34d58", "0x57df6092665eb6058DE53939612413ff4B09114E" @@ -506,6 +515,8 @@ "0xF2ee649caB7a0edEdED7a27821B0aCDF77778aeD", "0x0263180888007D45340F86eC0b610d250BbDcB23", "0xEcf953290D36fA96236356e171044DC802EeC598", + "0x6140b987d6B51Fd75b66C3B07733Beb5167c42fc", + "0x9a21E33F1a78b17DAd32010CeDB9Fd2F071C17d3", "0x6131b5fae19ea4f9d964eac0408e4408b66337b5", "0x6b2c0c7be2048daa9b5527982c29f48062b34d58", "0x57df6092665eb6058DE53939612413ff4B09114E" @@ -515,6 +526,7 @@ "0x27f0e36dE6B1BA8232f6c2e87E00A50731048C6B", "0xB45e53277a7e0F1D35f2a77160e91e25507f1763", "0xf2614A233c7C3e7f08b1F887Ba133a13f1eb2c55", + "0x799525cE72B5cc9eb310dc8c7b9e7A3128a6dA79", "0x9E4c63c9a0EDE2Ca2e772ee48C819Ca5CB4529AC", "0x6b2c0c7be2048daa9b5527982c29f48062b34d58", "0x57df6092665eb6058DE53939612413ff4B09114E" @@ -528,6 +540,8 @@ "0xc02FFcdD914DbA646704439c6090BAbaD521d04C", "0x6352a56caadC4F1E25CD6c75970Fa768A3304e64", "0x6140b987d6B51Fd75b66C3B07733Beb5167c42fc", + "0x9a21E33F1a78b17DAd32010CeDB9Fd2F071C17d3", + "0xbbbbbBB520d69a9775E85b458C58c648259FAD5F" "0xd0f95fafa06de1b21e79db03c649919501e99ea9", "0xbd0ebe49779e154e5042b34d5bcfbc498e4b3249", "0x78bF01555bCF05e6B1d4dad017dBD0A105652DC9" @@ -645,12 +659,14 @@ "0x96E04591579f298681361C6122Dc4Ef405c19385", "0x4C5D5234f232BD2D76B96aA33F5AE4FCF0E4BFAb", "0xf2614A233c7C3e7f08b1F887Ba133a13f1eb2c55", - "0xbbbbbBB520d69a9775E85b458C58c648259FAD5F", - "0xf332761c673b59b21ff6dfa8ada44d78c12def09", - "0x68D6B739D2020067D1e2F713b999dA97E4d54812" + "0x9a21E33F1a78b17DAd32010CeDB9Fd2F071C17d3", + "0xbbbbbBB520d69a9775E85b458C58c648259FAD5F" ], "opbnb": [ "0x6140b987d6B51Fd75b66C3B07733Beb5167c42fc", + "0xbbbbbBB520d69a9775E85b458C58c648259FAD5F", + "0xf332761c673b59b21ff6dfa8ada44d78c12def09", + "0x68D6B739D2020067D1e2F713b999dA97E4d54812" "0x6A2420650139854F17964b8C3Bb60248470aB57E", "0xEc41F702d36b43a1E1d017Cb4da92F431dFA7a0E", "0x077A38b812e57E2e76849954c880E1a2f5e0A68d" @@ -702,6 +718,7 @@ "0x0dc8E47a1196bcB590485eE8bF832c5c68A52f4B", "0x0a6e511Fe663827b9cA7e2D2542b20B37fC217A6", "0xf2614A233c7C3e7f08b1F887Ba133a13f1eb2c55", + "0x9a21E33F1a78b17DAd32010CeDB9Fd2F071C17d3", "0xbbbbbBB520d69a9775E85b458C58c648259FAD5F", "0xa748d6573aca135af68f2635be60cb80278bd855", "0x3B86917369B83a6892f553609F3c2F439C184e31", @@ -760,7 +777,9 @@ "0xbfe03c9e20a9fc0b37de01a172f207004935e0b1", "0x0000000000005e88410ccdfade4a5efae4b49562", "0x6140b987d6B51Fd75b66C3B07733Beb5167c42fc", - "0x78bF01555bCF05e6B1d4dad017dBD0A105652DC9" + "0x78bF01555bCF05e6B1d4dad017dBD0A105652DC9", + "0x9a21E33F1a78b17DAd32010CeDB9Fd2F071C17d3", + "0xbbbbbBB520d69a9775E85b458C58c648259FAD5F", "0x6b2c0c7be2048daa9b5527982c29f48062b34d58", "0x57df6092665eb6058DE53939612413ff4B09114E" ], @@ -769,6 +788,7 @@ "0xff2F39692A90262b8Ed4DFD92799bB450425773F", "0xD989E929517B0e5eD0c8EfE7607Fa167B697cBa8", "0xcaA342e4f781d63EF41E220D7622B97E66BAEcF3", + "0x0ec6D2eEb94541C51620830D151995fCFf83Aa74", "0xbbbbbBB520d69a9775E85b458C58c648259FAD5F" ], "velas": [ @@ -786,6 +806,7 @@ "0xC69994fd72824ca98F8a0B1E2ABc954E65a91cf4", "0x12904D12A84702f9F079E1e393fdAbD313496e97", "0x833Be894C596b15FAe740C2D522d660084c48B05", + "0x9a21E33F1a78b17DAd32010CeDB9Fd2F071C17d3", "0x2321F1a63A683a1F3634Dbe1CbA0d657D5F56d54", "0x127a986ce31aa2ea8e1a6a0f0d5b7e5dbad7b0be", "0x8b773D83bc66Be128c60e07E17C8901f7a64F000" @@ -811,6 +832,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 e9635f1ca..8f284b456 100644 --- a/deployments/_deployments_log_file.json +++ b/deployments/_deployments_log_file.json @@ -25150,5 +25150,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 91628504c..a9dfac7f8 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 2ce73f194..908d2bae4 100644 --- a/deployments/mantle.json +++ b/deployments/mantle.json @@ -25,5 +25,7 @@ "StargateFacetV2": "0x6e378C84e657C57b2a8d183CFf30ee5CC8989b61", "ReceiverStargateV2": "0x1493e7B8d4DfADe0a178dAD9335470337A3a219A", "LiFiDEXAggregator": "0xEcf953290D36fA96236356e171044DC802EeC598", - "EmergencyPauseFacet": "0x6F2baA7cd5F156CA1B132F7FF11E0fa2aD775F61" + "EmergencyPauseFacet": "0x6F2baA7cd5F156CA1B132F7FF11E0fa2aD775F61", + "GasZipFacet": "0xF5c923a087fb3c554579e2DD10AB6E37E0f6F849", + "GasZipPeriphery": "0x9a21E33F1a78b17DAd32010CeDB9Fd2F071C17d3" } 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 85751d4ff..59a8bdc0f 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 d8093f6e9..137126dab 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"