From 3f49c9b1205e87d8d20b9687c134ce854b5faf58 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tom=C3=A1s=20Migone?= Date: Thu, 23 Jul 2026 13:12:00 -0300 Subject: [PATCH 1/5] feat(deploy): reo and dips disabled script 1 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Tomás Migone --- packages/horizon/addresses.json | 66 +++++++++++- packages/issuance/addresses.json | 124 ++++++++++++++++++++--- packages/subgraph-service/addresses.json | 24 ++++- 3 files changed, 196 insertions(+), 18 deletions(-) diff --git a/packages/horizon/addresses.json b/packages/horizon/addresses.json index f0488947a..bab372c3a 100644 --- a/packages/horizon/addresses.json +++ b/packages/horizon/addresses.json @@ -13,12 +13,32 @@ "address": "0xf6Fcc27aAf1fcD8B254498c9794451d82afC673E", "proxy": "transparent", "proxyAdmin": "0x6465e08CD46669f8841641655186148b490B4b24", - "implementation": "0xc493e8EBedE3d1cC61632736108d943693DA11F7" + "implementation": "0xc493e8EBedE3d1cC61632736108d943693DA11F7", + "pendingImplementation": { + "address": "0x59678950d4766f90c916a82e658b65781228609f", + "deployment": { + "txHash": "0xd24e9a23abe2b26c00212b9a5d7cab9513a948e8aedb40cb1e31bbf4cce8e8b6", + "argsData": "0x0000000000000000000000000a8491544221dd212964fbb96487467291b2c97e0000000000000000000000000000000000000000000000000000000000278d00", + "bytecodeHash": "0x00c6fe965489c9fe484cc508e52c1a674170b16d2fd321fcda3f9c702553ead0", + "blockNumber": 486895397, + "timestamp": "2026-07-23T13:59:04.000Z" + } + } }, "L2Curation": { "address": "0x22d78fb4bc72e191C765807f8891B5e1785C8014", "proxy": "graph", - "implementation": "0xc4Ce508c8fda35C597CC78e3604261110fc4c957" + "implementation": "0xc4Ce508c8fda35C597CC78e3604261110fc4c957", + "pendingImplementation": { + "address": "0xd6e26e680fef5cec449b74298aa98b8ca67ecf96", + "deployment": { + "txHash": "0x3b5dbb4bcca7a26f851219d202799e03e7967eff6409c01dd65692f000fe0169", + "argsData": "0x", + "bytecodeHash": "0xaad16b82ef09b39624235fcc47361da5bd2c6cb0f3926a4aa2d9d11f88a3e238", + "blockNumber": 486895413, + "timestamp": "2026-07-23T13:59:08.000Z" + } + } }, "L2GNS": { "address": "0xec9A7fb6CbC2E41926127929c2dcE6e9c5D33Bec", @@ -31,12 +51,32 @@ "RewardsManager": { "address": "0x971B9d3d0Ae3ECa029CAB5eA1fB0F72c85e6a525", "proxy": "graph", - "implementation": "0xBcD7a231eAB1f4667AAbFdb482026f244bfBf101" + "implementation": "0xBcD7a231eAB1f4667AAbFdb482026f244bfBf101", + "pendingImplementation": { + "address": "0xa13cff50092c1c83d7d135bd0d2774cd4328ab01", + "deployment": { + "txHash": "0x509ac61e869638b05690fbb234b2e1293da6e645f622ebc07cfb98329e66a8c4", + "argsData": "0x", + "bytecodeHash": "0xd0cd3f4b7ce4ce4fe6ea8ee8ecd4e74bb683c64de2696c9e5ad7f74ef4c16f4e", + "blockNumber": 486895215, + "timestamp": "2026-07-23T13:58:19.000Z" + } + } }, "HorizonStaking": { "address": "0x00669A4CF01450B64E8A2A20E9b1FCB71E61eF03", "proxy": "graph", - "implementation": "0xaA3359434B534dE9964d4e72bE2782b076a1Eb5A" + "implementation": "0xaA3359434B534dE9964d4e72bE2782b076a1Eb5A", + "pendingImplementation": { + "address": "0xd3ba4a3bc240883a42819d0fa662148f9f035ea1", + "deployment": { + "txHash": "0xf91403458bcebdb894d12feb780968e304cbd4e8f99e707e040ed32b121fb89c", + "argsData": "0x0000000000000000000000000a8491544221dd212964fbb96487467291b2c97e000000000000000000000000b2bb92d0de618878e438b55d5846cfecd9301105", + "bytecodeHash": "0xed53dca54465c51e6778244bf3453b16ba5d1a79e494bb522c9dc8d1504d8ba8", + "blockNumber": 486895253, + "timestamp": "2026-07-23T13:58:28.000Z" + } + } }, "GraphTallyCollector": { "address": "0x8f69F5C07477Ac46FBc491B1E6D91E2bb0111A9e" @@ -58,6 +98,24 @@ "address": "0x65E1a5e8946e7E87d9774f5288f41c30a99fD302", "proxy": "graph", "implementation": "0x6f37b2AF8A0Cc74f1bFddf2E9302Cb226710127F" + }, + "RecurringCollector": { + "address": "0xff0dc7310fbfbcc2524dae230cd4f34727eb84ee", + "proxy": "transparent", + "proxyAdmin": "0xd216aa3a9edcb5a826b156196d4b720b5c4ff69c", + "implementation": "0x69315eb3e779dad209fbd0c70fa838c96fae488e", + "proxyDeployment": { + "txHash": "0xe750de639d4c90579e593f18ec16764bd43dc27d101c8fdd559c2407cdc35851", + "argsData": "0x00000000000000000000000069315eb3e779dad209fbd0c70fa838c96fae488e0000000000000000000000004528fd7868c91ef64b9907450ee8d82dc639612c000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000c44cd88b76000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000012526563757272696e67436f6c6c6563746f7200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001310000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "bytecodeHash": "0x6b4ba3015667741610274b7c196ec5d7767235d85865912f7ac680eac3011c54", + "blockNumber": 486895281 + }, + "implementationDeployment": { + "txHash": "0x4b70220b37e3dbe029e3a9161e9dd00a7afb271d8643080179fbb1a7fa49b20b", + "argsData": "0x0000000000000000000000000a8491544221dd212964fbb96487467291b2c97e0000000000000000000000000000000000000000000000000000000000007080", + "bytecodeHash": "0x47f042a65486346b451264af80bb4207b06252c1c5fda8689822662285f16437", + "blockNumber": 486895274 + } } }, "421614": { diff --git a/packages/issuance/addresses.json b/packages/issuance/addresses.json index 3a8ba429e..cf5d9c370 100644 --- a/packages/issuance/addresses.json +++ b/packages/issuance/addresses.json @@ -1,26 +1,126 @@ { "42161": { - "NetworkOperator": { - "address": "0xae656A0aa51cd465B7506F98F2e8FBb82aa79894" + "IssuanceAllocator": { + "address": "0xb64f29b2d81140ffc3a135e319561a1bd03b1a7e", + "proxy": "transparent", + "proxyAdmin": "0x1e1b7530a9ca487cecca47afeca803ead5761cdf", + "implementation": "0xf47b3a62f815121eadddc135f5515b274e2feff2", + "proxyDeployment": { + "txHash": "0x86f08681e64d43c5c82c1eebb70c40d6ea2494f7d61d39d26fd58afdb0807923", + "argsData": "0x000000000000000000000000f47b3a62f815121eadddc135f5515b274e2feff20000000000000000000000004528fd7868c91ef64b9907450ee8d82dc639612c00000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000024c4d66de80000000000000000000000004528fd7868c91ef64b9907450ee8d82dc639612c00000000000000000000000000000000000000000000000000000000", + "bytecodeHash": "0x6b4ba3015667741610274b7c196ec5d7767235d85865912f7ac680eac3011c54", + "blockNumber": 486895439 + }, + "implementationDeployment": { + "txHash": "0x0f01260443e2547458e157b945393de57368b2ad0c094e1d336b1cc84a6ae755", + "argsData": "0x0000000000000000000000009623063377ad1b27544c965ccd7342f7ea7e88c7", + "bytecodeHash": "0xede6adaf8c20503ed0be89cdd6cbbf166b517754ee077bdcd9d0c8c5ef6d9837", + "blockNumber": 486895432 + } + }, + "DirectAllocation_Implementation": { + "address": "0xa8db3fc2bc71fef20b7af143fcb58d014028c774", + "deployment": { + "txHash": "0x392fd65b2708f8a31b5b34f5bdc53b1a6d7332fa6ad7bc26883cbc60c8003b69", + "argsData": "0x0000000000000000000000009623063377ad1b27544c965ccd7342f7ea7e88c7", + "bytecodeHash": "0x1d65994aa7dc0e21ec53bc490e6420b354f4ec1ea03e06b41623395f9fe12292", + "blockNumber": 486895466 + } + }, + "DefaultAllocation": { + "address": "0x28cd50e9e02856908f4c1966ab035b1f6c4dde1e", + "proxy": "transparent", + "proxyAdmin": "0x9024b85f5aa87a8759a1489ec4195037da306fce", + "implementation": "0xa8db3fc2bc71fef20b7af143fcb58d014028c774", + "proxyDeployment": { + "txHash": "0x95c15a27676d94c59ee4277dc33e2df34192e4afe9cc1a6a697cb90402d7db80", + "argsData": "0x000000000000000000000000a8db3fc2bc71fef20b7af143fcb58d014028c7740000000000000000000000004528fd7868c91ef64b9907450ee8d82dc639612c00000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000024c4d66de80000000000000000000000004528fd7868c91ef64b9907450ee8d82dc639612c00000000000000000000000000000000000000000000000000000000", + "bytecodeHash": "0x6b4ba3015667741610274b7c196ec5d7767235d85865912f7ac680eac3011c54", + "blockNumber": 486895481 + } + }, + "ReclaimedRewards": { + "address": "0xe26cdc4ef915d12551ea67a7cbb838e91a24bb37", + "proxy": "transparent", + "proxyAdmin": "0x080be19f2496c9f852cde686ba39167e523b0b57", + "implementation": "0xa8db3fc2bc71fef20b7af143fcb58d014028c774", + "proxyDeployment": { + "txHash": "0x02d11835a2c98cfe1c9b041abd8dfa5592bab2d01cb6a5f24246754ea9542e91", + "argsData": "0x000000000000000000000000a8db3fc2bc71fef20b7af143fcb58d014028c7740000000000000000000000004528fd7868c91ef64b9907450ee8d82dc639612c00000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000024c4d66de80000000000000000000000004528fd7868c91ef64b9907450ee8d82dc639612c00000000000000000000000000000000000000000000000000000000", + "bytecodeHash": "0x6b4ba3015667741610274b7c196ec5d7767235d85865912f7ac680eac3011c54", + "blockNumber": 486895501 + } + }, + "RecurringAgreementManager": { + "address": "0x51f860b03dee6a6ea27392dcceccd908204149f2", + "proxy": "transparent", + "proxyAdmin": "0xd73965868a6c8dc31fbeb418a2d589a833e3d1fe", + "implementation": "0x09ac86ba5edef13673f9035eb76f7e1304413ca8", + "proxyDeployment": { + "txHash": "0xd286470d33f8b1d88a359b2aab2aab5ca20f98a6ba541e42aa7a09c1aabc4e3b", + "argsData": "0x00000000000000000000000009ac86ba5edef13673f9035eb76f7e1304413ca80000000000000000000000004528fd7868c91ef64b9907450ee8d82dc639612c00000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000024c4d66de80000000000000000000000004528fd7868c91ef64b9907450ee8d82dc639612c00000000000000000000000000000000000000000000000000000000", + "bytecodeHash": "0x6b4ba3015667741610274b7c196ec5d7767235d85865912f7ac680eac3011c54", + "blockNumber": 486895534 + }, + "implementationDeployment": { + "txHash": "0x7fbf12da008da09a8b6e962dc244600d2917f08362aefd66d0d469c9e6c8243a", + "argsData": "0x0000000000000000000000009623063377ad1b27544c965ccd7342f7ea7e88c7000000000000000000000000f6fcc27aaf1fcd8b254498c9794451d82afc673e", + "bytecodeHash": "0x82748ce78d63efac41792f4885a66924846d9e14b548c2fba4f934e20d5021d8", + "blockNumber": 486895527 + } }, "RewardsEligibilityOracleA": { - "address": "0x8ec2767a9d9ba02b4e09e8ff4fac2e14a340f304", + "address": "0x02753bae61c08abd4351bce7f48524935c2cc78e", "proxy": "transparent", - "proxyAdmin": "0x2c09de600d47f644d875876710882bb9de44369c", - "implementation": "0x7381f99a610f6c438206811183e2d3969ae7eb01", + "proxyAdmin": "0x633bad35597fa0c73bd532180cd8e658a6a63ce1", + "implementation": "0x66cebbec74d413ce45b85156dcb3d7a24724b95b", + "proxyDeployment": { + "txHash": "0x51a00b6cf1fe3ff3f4811697e7a86e8944c5dd1035ed3d25f84fe92ddc52d278", + "argsData": "0x00000000000000000000000066cebbec74d413ce45b85156dcb3d7a24724b95b0000000000000000000000004528fd7868c91ef64b9907450ee8d82dc639612c00000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000024c4d66de80000000000000000000000004528fd7868c91ef64b9907450ee8d82dc639612c00000000000000000000000000000000000000000000000000000000", + "bytecodeHash": "0x6b4ba3015667741610274b7c196ec5d7767235d85865912f7ac680eac3011c54", + "blockNumber": 486895566 + }, "implementationDeployment": { - "txHash": "0x8b0ed99957b01671e07fea920f5cae02dd9b64aaa87e317bc83e070604ae2e5e", + "txHash": "0xa68cdcfe8728118d4042bbe4a25c7d5d7d2e96c5a144181885521f31a874505d", "argsData": "0x0000000000000000000000009623063377ad1b27544c965ccd7342f7ea7e88c7", "bytecodeHash": "0x8ff7d1a6e22cf7f074c4688d9c84394ee151531de3f219ceabf66f0386201412", - "blockNumber": 442383753, - "verified": "https://arbiscan.io/address/0x7381f99a610f6c438206811183e2d3969ae7eb01#code" + "blockNumber": 486895559 + } + }, + "RewardsEligibilityOracleB": { + "address": "0xeebc4919a239c1315a7e0652e692812719bad591", + "proxy": "transparent", + "proxyAdmin": "0x9dfe880d1913b33e2dbe351a6a91ecbb46fd006b", + "implementation": "0x16e3d77048496a5dcbab1de924fd77569f8affba", + "proxyDeployment": { + "txHash": "0x1abd678a514fe0ec0b7824addccde258951a817d39394575250cb91762d3ec20", + "argsData": "0x00000000000000000000000016e3d77048496a5dcbab1de924fd77569f8affba0000000000000000000000004528fd7868c91ef64b9907450ee8d82dc639612c00000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000024c4d66de80000000000000000000000004528fd7868c91ef64b9907450ee8d82dc639612c00000000000000000000000000000000000000000000000000000000", + "bytecodeHash": "0x6b4ba3015667741610274b7c196ec5d7767235d85865912f7ac680eac3011c54", + "blockNumber": 486895606 }, + "implementationDeployment": { + "txHash": "0x4af6e16a5ca58d4054271c87c8690ba17db6b391ce5a535539a12f15e780811c", + "argsData": "0x0000000000000000000000009623063377ad1b27544c965ccd7342f7ea7e88c7", + "bytecodeHash": "0x8ff7d1a6e22cf7f074c4688d9c84394ee151531de3f219ceabf66f0386201412", + "blockNumber": 486895599 + } + }, + "RewardsEligibilityOracleMock": { + "address": "0x25fe42a6217596c47205242b5bed6a7a724cbce6", + "proxy": "transparent", + "proxyAdmin": "0xa3d4d5a6d609fa15f66d2f62470748f78471810d", + "implementation": "0x6f1faf85ade084dd94181acf9497ff6ff76e5e59", "proxyDeployment": { - "txHash": "0x6ea59d35433cb028aa0b54038eb38fca4475173f41f063382667b79e5b49f1ab", - "argsData": "0x0000000000000000000000007381f99a610f6c438206811183e2d3969ae7eb010000000000000000000000008c6de8f8d562f3382417340a6994601ee08d380900000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000024c4d66de80000000000000000000000004528fd7868c91ef64b9907450ee8d82dc639612c00000000000000000000000000000000000000000000000000000000", + "txHash": "0xc132cb8282f28dc24131e9c6a219debb30efbce557d00f0bbfae6213eac9c2d4", + "argsData": "0x0000000000000000000000006f1faf85ade084dd94181acf9497ff6ff76e5e590000000000000000000000004528fd7868c91ef64b9907450ee8d82dc639612c00000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000024c4d66de80000000000000000000000004528fd7868c91ef64b9907450ee8d82dc639612c00000000000000000000000000000000000000000000000000000000", "bytecodeHash": "0x6b4ba3015667741610274b7c196ec5d7767235d85865912f7ac680eac3011c54", - "blockNumber": 442383763, - "verified": "https://arbiscan.io/address/0x8ec2767a9d9ba02b4e09e8ff4fac2e14a340f304#code" + "blockNumber": 486895646 + }, + "implementationDeployment": { + "txHash": "0xe5c5b5591eda133455f18014722940a6ae04c2128a6110495ca8f1e2a2c2c799", + "argsData": "0x0000000000000000000000009623063377ad1b27544c965ccd7342f7ea7e88c7", + "bytecodeHash": "0x7048d139b92b2e2638c66eca026737eddd064e85ebf20e0438bdef81232ea320", + "blockNumber": 486895639 } } }, diff --git a/packages/subgraph-service/addresses.json b/packages/subgraph-service/addresses.json index 3e6b5d817..9335fef05 100644 --- a/packages/subgraph-service/addresses.json +++ b/packages/subgraph-service/addresses.json @@ -4,13 +4,33 @@ "address": "0xb2Bb92d0DE618878E438b55D5846cfecD9301105", "proxy": "transparent", "proxyAdmin": "0x49021Ada0806cabce24b73002EB4477fe4934215", - "implementation": "0x80D1a23472a4EcFa484c95779D5CE855C24747cD" + "implementation": "0x80D1a23472a4EcFa484c95779D5CE855C24747cD", + "pendingImplementation": { + "address": "0x03a2d29d5cac0373a73f29c8d03b08e634a86939", + "deployment": { + "txHash": "0x7ba886b1165987d011c381f483986612022781131414e9e6bd0bcb2dfbe838e4", + "argsData": "0x0000000000000000000000000a8491544221dd212964fbb96487467291b2c97e0000000000000000000000002fe023a575449acb698648ed21276293fa176f960000000000000000000000008f69f5c07477ac46fbc491b1e6d91e2bb0111a9e00000000000000000000000022d78fb4bc72e191c765807f8891b5e1785c8014000000000000000000000000ff0dc7310fbfbcc2524dae230cd4f34727eb84ee", + "bytecodeHash": "0x7a050c83c8b277775e875806c50b5d557902a9f3f8ab62d17e362ac57e954a84", + "blockNumber": 486895347, + "timestamp": "2026-07-23T13:58:52.000Z" + } + } }, "DisputeManager": { "address": "0x2FE023a575449AcB698648eD21276293Fa176f96", "proxy": "transparent", "proxyAdmin": "0x2cf40C92706943dCAE5E0Ba047a29563863C9d75", - "implementation": "0x0fa6925f21d0493072ad29f3aF66f4E11655faF1" + "implementation": "0x0fa6925f21d0493072ad29f3aF66f4E11655faF1", + "pendingImplementation": { + "address": "0x40b17388b078d24ccc6bd3d3d64e475a7b0383fb", + "deployment": { + "txHash": "0xc3ab39fc1e8a75a69b33ba6b000871b0d2ddaea3958aae80a484d096512de97c", + "argsData": "0x0000000000000000000000000a8491544221dd212964fbb96487467291b2c97e", + "bytecodeHash": "0xff6852f3bcaeb2e092067b1c8239a93f36d945f0bbca82cb721d65b5a953ab25", + "blockNumber": 486895371, + "timestamp": "2026-07-23T13:58:58.000Z" + } + } }, "L2Curation": { "address": "0x22d78fb4bc72e191C765807f8891B5e1785C8014", From cafa75964466451cc99e2bb05f5bda87c0a2f2dc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tom=C3=A1s=20Migone?= Date: Fri, 24 Jul 2026 15:52:19 -0300 Subject: [PATCH 2/5] feat(deploy): reo and dips scripts 2,3,4 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Tomás Migone --- package.json | 3 +- .../deploy/gip/0088/upgrade/04_upgrade.ts | 25 ++++++++--- packages/horizon/addresses.json | 27 +++++++++++- packages/issuance/addresses.json | 42 +++++++++++++------ packages/subgraph-service/addresses.json | 9 ++++ patches/@rocketh__read-execute@0.17.8.patch | 12 ++++++ pnpm-lock.yaml | 11 +++-- 7 files changed, 104 insertions(+), 25 deletions(-) create mode 100644 patches/@rocketh__read-execute@0.17.8.patch diff --git a/package.json b/package.json index c66f0334f..764c889c6 100644 --- a/package.json +++ b/package.json @@ -66,7 +66,8 @@ }, "patchedDependencies": { "typechain@8.3.2": "patches/typechain@8.3.2.patch", - "rocketh@0.17.13": "patches/rocketh@0.17.13.patch" + "rocketh@0.17.13": "patches/rocketh@0.17.13.patch", + "@rocketh/read-execute@0.17.8": "patches/@rocketh__read-execute@0.17.8.patch" } }, "lint-staged": { diff --git a/packages/deployment/deploy/gip/0088/upgrade/04_upgrade.ts b/packages/deployment/deploy/gip/0088/upgrade/04_upgrade.ts index 4a984342d..41375e46b 100644 --- a/packages/deployment/deploy/gip/0088/upgrade/04_upgrade.ts +++ b/packages/deployment/deploy/gip/0088/upgrade/04_upgrade.ts @@ -83,8 +83,22 @@ const func: DeployScriptModule = async (env) => { const settings = await getResolvedSettingsForEnv(env) + // RM-dependent config (setDefaultReclaimAddress / setRevertOnIneligible) can only + // run once RM is on its new implementation. If the RM upgrade is part of THIS batch, + // it executes (ordered before these config TXs) within the same atomic governance + // execution, so include them in the same bundle rather than deferring to a second + // governance round. + const rmUpgradeInBatch = gathered.sourceNames.some((n) => n.includes(Contracts.horizon.RewardsManager.name)) + env.showMessage('\nOutstanding configuration:') - const existingCount = await collectExistingContractConfig(env, builder, client, pauseGuardian, settings) + const existingCount = await collectExistingContractConfig( + env, + builder, + client, + pauseGuardian, + settings, + rmUpgradeInBatch, + ) const newCount = await collectDeferredNewContractConfig(env, builder, client, targetChainId, governor, pauseGuardian) const total = gathered.txCount + existingCount + newCount @@ -153,8 +167,8 @@ function gatherProxyUpgrades(txDir: string, builder: TxBuilder) { * horizon-Ignition infrastructure; the dynamic role check is the source of truth): * * - RC.setPauseGuardian - * - RM.setDefaultReclaimAddress (only when RM has been upgraded) - * - RM.setRevertOnIneligible (driven by config; only when RM has been upgraded) + * - RM.setDefaultReclaimAddress (when RM is upgraded, or its upgrade is in this batch) + * - RM.setRevertOnIneligible (driven by config; same RM-upgrade gating) */ async function collectExistingContractConfig( env: Environment, @@ -162,6 +176,7 @@ async function collectExistingContractConfig( client: PublicClient, pauseGuardian: string, settings: ResolvedSettings, + rmUpgradeInBatch: boolean, ): Promise { let added = 0 @@ -194,7 +209,7 @@ async function collectExistingContractConfig( const rm = env.getOrNull(Contracts.horizon.RewardsManager.name) if (reclaim && rm) { const reclaimRMCheck = await checkReclaimRMIntegration(client, rm.address, reclaim.address) - if (!reclaimRMCheck.done && reclaimRMCheck.reason !== 'RM not upgraded') { + if (!reclaimRMCheck.done && (reclaimRMCheck.reason !== 'RM not upgraded' || rmUpgradeInBatch)) { builder.addTx({ to: rm.address, value: '0', @@ -213,7 +228,7 @@ async function collectExistingContractConfig( if (rm) { const desiredRevert = settings.rewardsManager.revertOnIneligible const revertCheck = await checkRMRevertOnIneligible(client, rm.address, desiredRevert) - if (!revertCheck.done && revertCheck.reason !== 'RM not upgraded') { + if (!revertCheck.done && (revertCheck.reason !== 'RM not upgraded' || rmUpgradeInBatch)) { builder.addTx({ to: rm.address, value: '0', diff --git a/packages/horizon/addresses.json b/packages/horizon/addresses.json index bab372c3a..cd6a558d1 100644 --- a/packages/horizon/addresses.json +++ b/packages/horizon/addresses.json @@ -23,6 +23,12 @@ "blockNumber": 486895397, "timestamp": "2026-07-23T13:59:04.000Z" } + }, + "proxyDeployment": { + "verified": "https://arbiscan.io/address/0xf6Fcc27aAf1fcD8B254498c9794451d82afC673E#code" + }, + "implementationDeployment": { + "verified": "https://arbiscan.io/address/0xc493e8EBedE3d1cC61632736108d943693DA11F7#code" } }, "L2Curation": { @@ -38,6 +44,12 @@ "blockNumber": 486895413, "timestamp": "2026-07-23T13:59:08.000Z" } + }, + "proxyDeployment": { + "verified": "https://arbiscan.io/address/0x22d78fb4bc72e191C765807f8891B5e1785C8014#code" + }, + "implementationDeployment": { + "verified": "https://arbiscan.io/address/0xc4Ce508c8fda35C597CC78e3604261110fc4c957#code" } }, "L2GNS": { @@ -61,6 +73,12 @@ "blockNumber": 486895215, "timestamp": "2026-07-23T13:58:19.000Z" } + }, + "proxyDeployment": { + "verified": "https://arbiscan.io/address/0x971B9d3d0Ae3ECa029CAB5eA1fB0F72c85e6a525#code" + }, + "implementationDeployment": { + "verified": "https://arbiscan.io/address/0xBcD7a231eAB1f4667AAbFdb482026f244bfBf101#code" } }, "HorizonStaking": { @@ -76,6 +94,9 @@ "blockNumber": 486895253, "timestamp": "2026-07-23T13:58:28.000Z" } + }, + "implementationDeployment": { + "verified": "https://arbiscan.io/address/0xaA3359434B534dE9964d4e72bE2782b076a1Eb5A#code" } }, "GraphTallyCollector": { @@ -108,13 +129,15 @@ "txHash": "0xe750de639d4c90579e593f18ec16764bd43dc27d101c8fdd559c2407cdc35851", "argsData": "0x00000000000000000000000069315eb3e779dad209fbd0c70fa838c96fae488e0000000000000000000000004528fd7868c91ef64b9907450ee8d82dc639612c000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000c44cd88b76000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000012526563757272696e67436f6c6c6563746f7200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001310000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", "bytecodeHash": "0x6b4ba3015667741610274b7c196ec5d7767235d85865912f7ac680eac3011c54", - "blockNumber": 486895281 + "blockNumber": 486895281, + "verified": "https://arbiscan.io/address/0xff0dc7310fbfbcc2524dae230cd4f34727eb84ee#code" }, "implementationDeployment": { "txHash": "0x4b70220b37e3dbe029e3a9161e9dd00a7afb271d8643080179fbb1a7fa49b20b", "argsData": "0x0000000000000000000000000a8491544221dd212964fbb96487467291b2c97e0000000000000000000000000000000000000000000000000000000000007080", "bytecodeHash": "0x47f042a65486346b451264af80bb4207b06252c1c5fda8689822662285f16437", - "blockNumber": 486895274 + "blockNumber": 486895274, + "verified": "https://arbiscan.io/address/0x69315eb3e779dad209fbd0c70fa838c96fae488e#code" } } }, diff --git a/packages/issuance/addresses.json b/packages/issuance/addresses.json index cf5d9c370..970efc849 100644 --- a/packages/issuance/addresses.json +++ b/packages/issuance/addresses.json @@ -1,5 +1,8 @@ { "42161": { + "NetworkOperator": { + "address": "0xae656A0aa51cd465B7506F98F2e8FBb82aa79894" + }, "IssuanceAllocator": { "address": "0xb64f29b2d81140ffc3a135e319561a1bd03b1a7e", "proxy": "transparent", @@ -9,13 +12,15 @@ "txHash": "0x86f08681e64d43c5c82c1eebb70c40d6ea2494f7d61d39d26fd58afdb0807923", "argsData": "0x000000000000000000000000f47b3a62f815121eadddc135f5515b274e2feff20000000000000000000000004528fd7868c91ef64b9907450ee8d82dc639612c00000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000024c4d66de80000000000000000000000004528fd7868c91ef64b9907450ee8d82dc639612c00000000000000000000000000000000000000000000000000000000", "bytecodeHash": "0x6b4ba3015667741610274b7c196ec5d7767235d85865912f7ac680eac3011c54", - "blockNumber": 486895439 + "blockNumber": 486895439, + "verified": "https://arbiscan.io/address/0xb64f29b2d81140ffc3a135e319561a1bd03b1a7e#code" }, "implementationDeployment": { "txHash": "0x0f01260443e2547458e157b945393de57368b2ad0c094e1d336b1cc84a6ae755", "argsData": "0x0000000000000000000000009623063377ad1b27544c965ccd7342f7ea7e88c7", "bytecodeHash": "0xede6adaf8c20503ed0be89cdd6cbbf166b517754ee077bdcd9d0c8c5ef6d9837", - "blockNumber": 486895432 + "blockNumber": 486895432, + "verified": "https://arbiscan.io/address/0xf47b3a62f815121eadddc135f5515b274e2feff2#code" } }, "DirectAllocation_Implementation": { @@ -24,7 +29,8 @@ "txHash": "0x392fd65b2708f8a31b5b34f5bdc53b1a6d7332fa6ad7bc26883cbc60c8003b69", "argsData": "0x0000000000000000000000009623063377ad1b27544c965ccd7342f7ea7e88c7", "bytecodeHash": "0x1d65994aa7dc0e21ec53bc490e6420b354f4ec1ea03e06b41623395f9fe12292", - "blockNumber": 486895466 + "blockNumber": 486895466, + "verified": "https://arbiscan.io/address/0xa8db3fc2bc71fef20b7af143fcb58d014028c774#code" } }, "DefaultAllocation": { @@ -36,7 +42,8 @@ "txHash": "0x95c15a27676d94c59ee4277dc33e2df34192e4afe9cc1a6a697cb90402d7db80", "argsData": "0x000000000000000000000000a8db3fc2bc71fef20b7af143fcb58d014028c7740000000000000000000000004528fd7868c91ef64b9907450ee8d82dc639612c00000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000024c4d66de80000000000000000000000004528fd7868c91ef64b9907450ee8d82dc639612c00000000000000000000000000000000000000000000000000000000", "bytecodeHash": "0x6b4ba3015667741610274b7c196ec5d7767235d85865912f7ac680eac3011c54", - "blockNumber": 486895481 + "blockNumber": 486895481, + "verified": "https://arbiscan.io/address/0x28cd50e9e02856908f4c1966ab035b1f6c4dde1e#code" } }, "ReclaimedRewards": { @@ -48,7 +55,8 @@ "txHash": "0x02d11835a2c98cfe1c9b041abd8dfa5592bab2d01cb6a5f24246754ea9542e91", "argsData": "0x000000000000000000000000a8db3fc2bc71fef20b7af143fcb58d014028c7740000000000000000000000004528fd7868c91ef64b9907450ee8d82dc639612c00000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000024c4d66de80000000000000000000000004528fd7868c91ef64b9907450ee8d82dc639612c00000000000000000000000000000000000000000000000000000000", "bytecodeHash": "0x6b4ba3015667741610274b7c196ec5d7767235d85865912f7ac680eac3011c54", - "blockNumber": 486895501 + "blockNumber": 486895501, + "verified": "https://arbiscan.io/address/0xe26cdc4ef915d12551ea67a7cbb838e91a24bb37#code" } }, "RecurringAgreementManager": { @@ -60,13 +68,15 @@ "txHash": "0xd286470d33f8b1d88a359b2aab2aab5ca20f98a6ba541e42aa7a09c1aabc4e3b", "argsData": "0x00000000000000000000000009ac86ba5edef13673f9035eb76f7e1304413ca80000000000000000000000004528fd7868c91ef64b9907450ee8d82dc639612c00000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000024c4d66de80000000000000000000000004528fd7868c91ef64b9907450ee8d82dc639612c00000000000000000000000000000000000000000000000000000000", "bytecodeHash": "0x6b4ba3015667741610274b7c196ec5d7767235d85865912f7ac680eac3011c54", - "blockNumber": 486895534 + "blockNumber": 486895534, + "verified": "https://arbiscan.io/address/0x51f860b03dee6a6ea27392dcceccd908204149f2#code" }, "implementationDeployment": { "txHash": "0x7fbf12da008da09a8b6e962dc244600d2917f08362aefd66d0d469c9e6c8243a", "argsData": "0x0000000000000000000000009623063377ad1b27544c965ccd7342f7ea7e88c7000000000000000000000000f6fcc27aaf1fcd8b254498c9794451d82afc673e", "bytecodeHash": "0x82748ce78d63efac41792f4885a66924846d9e14b548c2fba4f934e20d5021d8", - "blockNumber": 486895527 + "blockNumber": 486895527, + "verified": "https://arbiscan.io/address/0x09ac86ba5edef13673f9035eb76f7e1304413ca8#code" } }, "RewardsEligibilityOracleA": { @@ -78,13 +88,15 @@ "txHash": "0x51a00b6cf1fe3ff3f4811697e7a86e8944c5dd1035ed3d25f84fe92ddc52d278", "argsData": "0x00000000000000000000000066cebbec74d413ce45b85156dcb3d7a24724b95b0000000000000000000000004528fd7868c91ef64b9907450ee8d82dc639612c00000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000024c4d66de80000000000000000000000004528fd7868c91ef64b9907450ee8d82dc639612c00000000000000000000000000000000000000000000000000000000", "bytecodeHash": "0x6b4ba3015667741610274b7c196ec5d7767235d85865912f7ac680eac3011c54", - "blockNumber": 486895566 + "blockNumber": 486895566, + "verified": "https://arbiscan.io/address/0x02753bae61c08abd4351bce7f48524935c2cc78e#code" }, "implementationDeployment": { "txHash": "0xa68cdcfe8728118d4042bbe4a25c7d5d7d2e96c5a144181885521f31a874505d", "argsData": "0x0000000000000000000000009623063377ad1b27544c965ccd7342f7ea7e88c7", "bytecodeHash": "0x8ff7d1a6e22cf7f074c4688d9c84394ee151531de3f219ceabf66f0386201412", - "blockNumber": 486895559 + "blockNumber": 486895559, + "verified": "https://arbiscan.io/address/0x66cebbec74d413ce45b85156dcb3d7a24724b95b#code" } }, "RewardsEligibilityOracleB": { @@ -96,13 +108,15 @@ "txHash": "0x1abd678a514fe0ec0b7824addccde258951a817d39394575250cb91762d3ec20", "argsData": "0x00000000000000000000000016e3d77048496a5dcbab1de924fd77569f8affba0000000000000000000000004528fd7868c91ef64b9907450ee8d82dc639612c00000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000024c4d66de80000000000000000000000004528fd7868c91ef64b9907450ee8d82dc639612c00000000000000000000000000000000000000000000000000000000", "bytecodeHash": "0x6b4ba3015667741610274b7c196ec5d7767235d85865912f7ac680eac3011c54", - "blockNumber": 486895606 + "blockNumber": 486895606, + "verified": "https://arbiscan.io/address/0xeebc4919a239c1315a7e0652e692812719bad591#code" }, "implementationDeployment": { "txHash": "0x4af6e16a5ca58d4054271c87c8690ba17db6b391ce5a535539a12f15e780811c", "argsData": "0x0000000000000000000000009623063377ad1b27544c965ccd7342f7ea7e88c7", "bytecodeHash": "0x8ff7d1a6e22cf7f074c4688d9c84394ee151531de3f219ceabf66f0386201412", - "blockNumber": 486895599 + "blockNumber": 486895599, + "verified": "https://arbiscan.io/address/0x16e3d77048496a5dcbab1de924fd77569f8affba#code" } }, "RewardsEligibilityOracleMock": { @@ -114,13 +128,15 @@ "txHash": "0xc132cb8282f28dc24131e9c6a219debb30efbce557d00f0bbfae6213eac9c2d4", "argsData": "0x0000000000000000000000006f1faf85ade084dd94181acf9497ff6ff76e5e590000000000000000000000004528fd7868c91ef64b9907450ee8d82dc639612c00000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000024c4d66de80000000000000000000000004528fd7868c91ef64b9907450ee8d82dc639612c00000000000000000000000000000000000000000000000000000000", "bytecodeHash": "0x6b4ba3015667741610274b7c196ec5d7767235d85865912f7ac680eac3011c54", - "blockNumber": 486895646 + "blockNumber": 486895646, + "verified": "https://arbiscan.io/address/0x25fe42a6217596c47205242b5bed6a7a724cbce6#code" }, "implementationDeployment": { "txHash": "0xe5c5b5591eda133455f18014722940a6ae04c2128a6110495ca8f1e2a2c2c799", "argsData": "0x0000000000000000000000009623063377ad1b27544c965ccd7342f7ea7e88c7", "bytecodeHash": "0x7048d139b92b2e2638c66eca026737eddd064e85ebf20e0438bdef81232ea320", - "blockNumber": 486895639 + "blockNumber": 486895639, + "verified": "https://arbiscan.io/address/0x6f1faf85ade084dd94181acf9497ff6ff76e5e59#code" } } }, diff --git a/packages/subgraph-service/addresses.json b/packages/subgraph-service/addresses.json index 9335fef05..862808f1e 100644 --- a/packages/subgraph-service/addresses.json +++ b/packages/subgraph-service/addresses.json @@ -14,6 +14,12 @@ "blockNumber": 486895347, "timestamp": "2026-07-23T13:58:52.000Z" } + }, + "proxyDeployment": { + "verified": "https://arbiscan.io/address/0xb2Bb92d0DE618878E438b55D5846cfecD9301105#code" + }, + "implementationDeployment": { + "verified": "https://arbiscan.io/address/0x80D1a23472a4EcFa484c95779D5CE855C24747cD#code" } }, "DisputeManager": { @@ -30,6 +36,9 @@ "blockNumber": 486895371, "timestamp": "2026-07-23T13:58:58.000Z" } + }, + "implementationDeployment": { + "verified": "https://arbiscan.io/address/0x0fa6925f21d0493072ad29f3aF66f4E11655faF1#code" } }, "L2Curation": { diff --git a/patches/@rocketh__read-execute@0.17.8.patch b/patches/@rocketh__read-execute@0.17.8.patch new file mode 100644 index 000000000..424cd04b3 --- /dev/null +++ b/patches/@rocketh__read-execute@0.17.8.patch @@ -0,0 +1,12 @@ +diff --git a/dist/index.js b/dist/index.js +index 166db4f708c7f4b4d232b5be25bfe64c6d25f448..c18de8ebc6c7ceab809c6354e990dc07ab382261 100644 +--- a/dist/index.js ++++ b/dist/index.js +@@ -125,6 +125,7 @@ export function read(env) { + data: calldata, + // value: `0x${viemArgs.value?.toString(16)}` as `0x${string}`, + }, ++ 'latest', // block parameter: strict RPC nodes (e.g. Arbitrum Nitro) require it on eth_call + ], // TODO fix eip-1193 ?,, + })); + const parsed = decodeFunctionResult({ diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 827936790..ed3e7e688 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -136,6 +136,9 @@ overrides: packageExtensionsChecksum: sha256-anBhQrlJaJ3Z62unAlKotKwV/itS9LEqUbuFem1Cbv8= patchedDependencies: + '@rocketh/read-execute@0.17.8': + hash: 3323e501a08c93d0099ce527aa6f2467b72cd181bc5da6256774f67fec431700 + path: patches/@rocketh__read-execute@0.17.8.patch rocketh@0.17.13: hash: 9922612567456c164edd9dd5a0c9304bfd66babcebfe7c39dca333659ff1248f path: patches/rocketh@0.17.13.patch @@ -797,7 +800,7 @@ importers: version: 0.17.12(bufferutil@4.0.9)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76) '@rocketh/read-execute': specifier: ^0.17.8 - version: 0.17.8(bufferutil@4.0.9)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76) + version: 0.17.8(patch_hash=3323e501a08c93d0099ce527aa6f2467b72cd181bc5da6256774f67fec431700)(bufferutil@4.0.9)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76) '@rocketh/verifier': specifier: ^0.17.16 version: 0.17.16(@rocketh/node@0.17.16(bufferutil@4.0.9)(rocketh@0.17.13(patch_hash=9922612567456c164edd9dd5a0c9304bfd66babcebfe7c39dca333659ff1248f)(bufferutil@4.0.9)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76))(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76))(bufferutil@4.0.9)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76) @@ -14699,7 +14702,7 @@ snapshots: dependencies: '@rocketh/core': 0.17.8(bufferutil@4.0.9)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76) '@rocketh/deploy': 0.17.8(bufferutil@4.0.9)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76) - '@rocketh/read-execute': 0.17.8(bufferutil@4.0.9)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76) + '@rocketh/read-execute': 0.17.8(patch_hash=3323e501a08c93d0099ce527aa6f2467b72cd181bc5da6256774f67fec431700)(bufferutil@4.0.9)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76) abitype: 1.2.3(typescript@5.9.3)(zod@3.25.76) eip-1193: 0.6.5 named-logs: 0.4.1 @@ -14767,7 +14770,7 @@ snapshots: dependencies: '@rocketh/core': 0.17.8(bufferutil@4.0.9)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76) '@rocketh/deploy': 0.17.8(bufferutil@4.0.9)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76) - '@rocketh/read-execute': 0.17.8(bufferutil@4.0.9)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76) + '@rocketh/read-execute': 0.17.8(patch_hash=3323e501a08c93d0099ce527aa6f2467b72cd181bc5da6256774f67fec431700)(bufferutil@4.0.9)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76) abitype: 1.2.3(typescript@5.9.3)(zod@3.25.76) eip-1193: 0.6.5 named-logs: 0.4.1 @@ -14778,7 +14781,7 @@ snapshots: - utf-8-validate - zod - '@rocketh/read-execute@0.17.8(bufferutil@4.0.9)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76)': + '@rocketh/read-execute@0.17.8(patch_hash=3323e501a08c93d0099ce527aa6f2467b72cd181bc5da6256774f67fec431700)(bufferutil@4.0.9)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76)': dependencies: '@rocketh/core': 0.17.8(bufferutil@4.0.9)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76) abitype: 1.2.3(typescript@5.9.3)(zod@3.25.76) From 7054f73ccc4a4875e3912d26761da9b380cfcd26 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tom=C3=A1s=20Migone?= Date: Fri, 24 Jul 2026 16:01:19 -0300 Subject: [PATCH 3/5] feat(deploy): support bypassing on chain assumptions for sequenced execution MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Tomás Migone --- .../deploy/gip/0088/eligibility_integrate.ts | 21 ++++++-- .../deploy/gip/0088/issuance_connect.ts | 48 +++++++++++++++-- packages/deployment/docs/Gip0088Runbook.md | 51 +++++++++++++++++++ .../deployment/lib/apply-configuration.ts | 46 +++++++++++++---- packages/deployment/lib/deployment-tags.ts | 22 ++++++++ 5 files changed, 171 insertions(+), 17 deletions(-) diff --git a/packages/deployment/deploy/gip/0088/eligibility_integrate.ts b/packages/deployment/deploy/gip/0088/eligibility_integrate.ts index 8c1fe8135..20a47f93a 100644 --- a/packages/deployment/deploy/gip/0088/eligibility_integrate.ts +++ b/packages/deployment/deploy/gip/0088/eligibility_integrate.ts @@ -9,7 +9,7 @@ import { } from '@graphprotocol/deployment/lib/contract-registry.js' import { canSignAsGovernor } from '@graphprotocol/deployment/lib/controller-utils.js' import { getResolvedSettingsForEnv } from '@graphprotocol/deployment/lib/deployment-config.js' -import { ComponentTags, GoalTags } from '@graphprotocol/deployment/lib/deployment-tags.js' +import { assumeUpgraded, ComponentTags, GoalTags } from '@graphprotocol/deployment/lib/deployment-tags.js' import { requireContracts } from '@graphprotocol/deployment/lib/issuance-deploy-utils.js' import { createActionModule } from '@graphprotocol/deployment/lib/script-factories.js' import { syncComponentsFromRegistry } from '@graphprotocol/deployment/lib/sync-utils.js' @@ -43,6 +43,23 @@ async function integrateOracle( await syncComponentsFromRegistry(env, [reoEntry, targetEntry]) const [reo, target] = requireContracts(env, [reoEntry, targetEntry]) + const { governor, canSign } = await canSignAsGovernor(env) + + // Sequenced-bundle generation: the target proxy isn't upgraded yet, so the + // oracle getter would revert. Skip the probe/idempotency read and emit the + // set-oracle TX unconditionally. The resulting bundle is sequenced-only — + // execute it after the upgrade bundle (nonce order enforces this). + if (assumeUpgraded()) { + await applyConfiguration(env, client, [createRMIntegrationCondition(reo.address)], { + contractName: `${target.name}-REO`, + contractAddress: target.address, + canExecuteDirectly: canSign, + executor: governor, + assumeUndone: true, + }) + return + } + // Skip only if the target isn't upgraded yet (no oracle getter). Once it // supports the getter, config is the source of truth: applyConfiguration is // idempotent — it re-points the oracle to the configured REO when the current @@ -59,8 +76,6 @@ async function integrateOracle( return } - const { governor, canSign } = await canSignAsGovernor(env) - await applyConfiguration(env, client, [createRMIntegrationCondition(reo.address)], { contractName: `${target.name}-REO`, contractAddress: target.address, diff --git a/packages/deployment/deploy/gip/0088/issuance_connect.ts b/packages/deployment/deploy/gip/0088/issuance_connect.ts index 152064165..ce7dda343 100644 --- a/packages/deployment/deploy/gip/0088/issuance_connect.ts +++ b/packages/deployment/deploy/gip/0088/issuance_connect.ts @@ -2,6 +2,7 @@ import { GRAPH_TOKEN_ABI, ISSUANCE_ALLOCATOR_ABI, ISSUANCE_TARGET_ABI, + REWARDS_MANAGER_DEPRECATED_ABI, SET_TARGET_ALLOCATION_ABI, } from '@graphprotocol/deployment/lib/abis.js' import { getTargetChainIdFromEnv } from '@graphprotocol/deployment/lib/address-book-utils.js' @@ -11,7 +12,7 @@ import { } from '@graphprotocol/deployment/lib/contract-checks.js' import { Contracts } from '@graphprotocol/deployment/lib/contract-registry.js' import { canSignAsGovernor } from '@graphprotocol/deployment/lib/controller-utils.js' -import { ComponentTags, GoalTags } from '@graphprotocol/deployment/lib/deployment-tags.js' +import { assumeUpgraded, ComponentTags, GoalTags } from '@graphprotocol/deployment/lib/deployment-tags.js' import { createGovernanceTxBuilder, executeTxBatchDirect, @@ -68,9 +69,18 @@ export default createActionModule( // Create viem client for direct contract calls const client = graph.getPublicClient(env) as PublicClient - // Check if RewardsManager supports IIssuanceTarget (has been upgraded) - // Throws error if not upgraded - await requireRewardsManagerUpgraded(client, rmAddress, env) + const sequenced = assumeUpgraded() + + // Check if RewardsManager supports IIssuanceTarget (has been upgraded). + // Throws if not upgraded — skipped under sequenced generation, where this + // bundle is built to execute right after the upgrade bundle (nonce order). + if (!sequenced) { + await requireRewardsManagerUpgraded(client, rmAddress, env) + } else { + env.showMessage( + '\n⚠ Sequenced generation: RM upgrade assumed — this bundle is SEQUENCED-ONLY and valid only AFTER the upgrade bundle executes (nonce order).\n', + ) + } const targetChainId = await getTargetChainIdFromEnv(env) @@ -86,7 +96,35 @@ export default createActionModule( // Sub-flags drive both the per-line status display and which TXs the build-batch needs. env.showMessage('📋 Checking current activation state...\n') - const connect = await checkIssuanceConnectComplete(client, iaAddress, rmAddress, gtAddress) + // Sequenced generation: RM isn't upgraded yet, so RM.getIssuanceAllocator (the + // iaIntegrated read inside checkIssuanceConnectComplete) would revert. Assume the + // RM-side wiring is undone and emit it. The rate invariant below is still enforced + // — both rates are readable on the un-upgraded RM. IA-side reads (default target) + // stay live in the TX-build section downstream. + const connect = sequenced + ? { + complete: false, + iaIntegrated: false, + iaMinter: false, + rmAllocationShape: false, + fullyAllocated: false, + iaRate: (await client.readContract({ + address: iaAddress as `0x${string}`, + abi: ISSUANCE_ALLOCATOR_ABI, + functionName: 'getIssuancePerBlock', + })) as bigint, + rmRate: (await client.readContract({ + address: rmAddress as `0x${string}`, + abi: REWARDS_MANAGER_DEPRECATED_ABI, + functionName: 'issuancePerBlock', + })) as bigint, + get ratesAligned(): boolean { + return this.iaRate === this.rmRate + }, + currentIssuanceAllocator: '(unknown — RM not upgraded)', + rmAllocation: { selfMintingRate: 0n, allocatorMintingRate: 0n }, + } + : await checkIssuanceConnectComplete(client, iaAddress, rmAddress, gtAddress) env.showMessage( ` IA integrated: ${connect.iaIntegrated ? '✓' : '✗'} (current: ${connect.currentIssuanceAllocator})`, diff --git a/packages/deployment/docs/Gip0088Runbook.md b/packages/deployment/docs/Gip0088Runbook.md index a6eb3b04a..489a01567 100644 --- a/packages/deployment/docs/Gip0088Runbook.md +++ b/packages/deployment/docs/Gip0088Runbook.md @@ -816,6 +816,57 @@ prior stage. Abort is clean before [G4](#gate-g4); after, recovery needs a follow-up governance batch — see [GovernanceWorkflow.md](GovernanceWorkflow.md). +## Sequenced bundle generation (single council signing session) + +The default flow generates each governance bundle only _after_ the previous one +executes on-chain — every activation goal reads live state and gates on the RM +upgrade ([S6](#stage-s6)/[S8](#stage-s8) skip or exit until RM is upgraded). On +mainnet, where the council signs M-of-N over days, that forces one signing round +per stage. To hand the council **every** GIP-0088 bundle at once, set +`GIP_0088_ASSUME_UPGRADED=1` when generating the activation bundles: + +```bash +# Upgrade bundle — generated normally (already carries the RM-gated config: +# setDefaultReclaimAddress + setRevertOnIneligible, ordered after the RM upgrade) +pnpm hardhat deploy --tags GIP-0088:upgrade,upgrade --network arbitrumOne + +# Activation bundles — generated ahead of the upgrade executing +GIP_0088_ASSUME_UPGRADED=1 pnpm hardhat deploy --tags GIP-0088:eligibility-integrate --network arbitrumOne +GIP_0088_ASSUME_UPGRADED=1 pnpm hardhat deploy --tags GIP-0088:issuance-connect --network arbitrumOne +``` + +With the flag, `eligibility-integrate` and `issuance-connect` skip the +"is RM upgraded on-chain" guard and the post-upgrade idempotency reads (which +would revert against the old implementation) and emit their full tx set. + +**Execution — nonce order is load-bearing.** These activation bundles are +**sequenced-only**: valid only when executed _after_ the upgrade bundle. Queue +them on the council Safe in order: + +| Safe nonce | Bundle | +| ---------- | ----------------------------------------------- | +| N | `gip-0088-upgrades.json` (upgrades + RM config) | +| N+1 | `eligibility-integrate` bundle | +| N+2 | `gip-0088-issuance-connect.json` | + +The Safe executes in strict nonce order, so RM is upgraded by the time N+1/N+2 +run, and the council reviews + signs all three in one session. If bundle N fails, +N+1/N+2 are blocked rather than executing against an un-upgraded RM. + +- **Kept:** the `issuance-connect` rate invariant + (`IA.issuancePerBlock == RM.issuancePerBlock`) is still enforced — it reads + `RM.issuancePerBlock`, which exists on the un-upgraded RM. +- **Dropped:** idempotency. The flag blind-emits the full set, so use it only for + the initial sequenced generation — **not** for re-runs or recovery, where the + default (guarded) mode reads live state and emits only the remaining work. +- **`issuance-allocate`** stays a no-op in the DIPs-dormant config (RM already + 100% from `issuance-connect`), so it needs no bundle. On a DIPs-active config, + generate it too, with the flag, as an `N+3` sequenced bundle. + +This mode trades the staged per-goal review gates ([G7](#gate-g7)/[G9](#gate-g9)) +for a single up-front review of all bundles — a deliberate choice for the +one-session council workflow, not the default. + ## Activating DIPs later DIPs ship dormant (see [Phase C](#phase-c--activation)). Turning them on is the diff --git a/packages/deployment/lib/apply-configuration.ts b/packages/deployment/lib/apply-configuration.ts index d9516ed1a..e79946263 100644 --- a/packages/deployment/lib/apply-configuration.ts +++ b/packages/deployment/lib/apply-configuration.ts @@ -34,6 +34,16 @@ export interface ApplyConfigurationOptions { /** Account to execute from (if canExecuteDirectly) */ executor?: string + + /** + * Skip the on-chain state check and treat every condition as un-applied, + * emitting a TX for each. Used by sequenced-bundle generation + * (`GIP_0088_ASSUME_UPGRADED`) where the target proxy isn't upgraded yet, so + * the getter reads that drive the normal idempotency check would revert + * against the old implementation. The resulting batch is sequenced-only — + * valid only after the upgrade bundle executes. + */ + assumeUndone?: boolean } /** @@ -77,16 +87,34 @@ export async function applyConfiguration( conditions: ConfigCondition[], options: ApplyConfigurationOptions, ): Promise> { - const { contractName, contractAddress, canExecuteDirectly, executor } = options - - // 1. Check all conditions - env.showMessage(`📋 Checking ${contractName} configuration...\n`) - - const status = await checkConditions(client, contractAddress, conditions) + const { contractName, contractAddress, canExecuteDirectly, executor, assumeUndone } = options + + // 1. Check all conditions — or, in sequenced-generation mode, skip the read and + // treat every condition as un-applied (the target proxy isn't upgraded yet, so + // the getter reads would revert). The resulting batch is sequenced-only. + let status: ConfigurationStatus + if (assumeUndone) { + env.showMessage( + `⚠ ${contractName}: sequenced generation — skipping on-chain check, emitting all configuration TXs\n`, + ) + status = { + allOk: false, + conditions: conditions.map((c) => ({ + name: c.name, + ok: false, + current: false, + target: false, + message: ` (assumed un-applied) ${c.name}`, + })), + } + } else { + env.showMessage(`📋 Checking ${contractName} configuration...\n`) + status = await checkConditions(client, contractAddress, conditions) - // Display results - for (const result of status.conditions) { - env.showMessage(` ${result.message}`) + // Display results + for (const result of status.conditions) { + env.showMessage(` ${result.message}`) + } } // 2. If all OK, no-op diff --git a/packages/deployment/lib/deployment-tags.ts b/packages/deployment/lib/deployment-tags.ts index 9db4bbdad..9c4c5dd55 100644 --- a/packages/deployment/lib/deployment-tags.ts +++ b/packages/deployment/lib/deployment-tags.ts @@ -81,6 +81,28 @@ export const GoalTags = { GIP_0088_ISSUANCE_CLOSE_GUARD: 'GIP-0088:issuance-close-guard', } as const +/** + * Sequenced-bundle generation flag (`GIP_0088_ASSUME_UPGRADED=1`). + * + * When set, the GIP-0088 activation goals (`eligibility-integrate`, + * `issuance-connect`) build their governance bundles as if the RewardsManager + * upgrade had already landed — skipping the "is RM upgraded on-chain" guard and + * the post-upgrade idempotency reads that would otherwise revert against the + * un-upgraded proxy. + * + * Purpose: generate the whole GIP-0088 governance sequence up front so a council + * multisig can review and sign every bundle in ONE session, executing them in + * nonce order (upgrade bundle first). The activation bundles produced this way + * are SEQUENCED-ONLY — valid only when executed after the upgrade bundle; the + * Safe's nonce ordering enforces that. + * + * Do NOT use for re-runs or recovery: it blind-emits the full tx set with no + * idempotency. Use the default (guarded) mode there. The rate-alignment + * invariant in `issuance-connect` is still enforced (it does not need the new + * implementation). + */ +export const assumeUpgraded = (): boolean => process.env.GIP_0088_ASSUME_UPGRADED === '1' + /** * Special tags */ From e05cd8009cc1e5e6eda0f5b67acb2377930c4464 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tom=C3=A1s=20Migone?= Date: Tue, 28 Jul 2026 11:58:25 -0300 Subject: [PATCH 4/5] feat(deploy): allow sequenced tx batching MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Tomás Migone --- packages/deployment/config/arbitrumOne.json5 | 7 ++ .../deploy/gip/0088/eligibility_integrate.ts | 72 ++++++++++++++----- .../deployment/lib/apply-configuration.ts | 28 +++++++- 3 files changed, 86 insertions(+), 21 deletions(-) diff --git a/packages/deployment/config/arbitrumOne.json5 b/packages/deployment/config/arbitrumOne.json5 index c8ff9d555..29e18fde9 100644 --- a/packages/deployment/config/arbitrumOne.json5 +++ b/packages/deployment/config/arbitrumOne.json5 @@ -5,6 +5,13 @@ eligibilityOracle: 'RewardsEligibilityOracleA', }, + RecurringAgreementManager: { + // Wired to the same REO as RewardsManager. RAM stays dormant at launch + // (0 issuance + RecurringCollector paused) — this only pre-configures its + // eligibility oracle so it matches RM. + eligibilityOracle: 'RewardsEligibilityOracleA', + }, + IssuanceAllocator: { // Explicit issuance allocation table, by target contract name. The rates must // sum to issuancePerBlock, which must equal RM's on-chain issuance rate — the diff --git a/packages/deployment/deploy/gip/0088/eligibility_integrate.ts b/packages/deployment/deploy/gip/0088/eligibility_integrate.ts index 20a47f93a..a3c2df84b 100644 --- a/packages/deployment/deploy/gip/0088/eligibility_integrate.ts +++ b/packages/deployment/deploy/gip/0088/eligibility_integrate.ts @@ -10,9 +10,15 @@ import { import { canSignAsGovernor } from '@graphprotocol/deployment/lib/controller-utils.js' import { getResolvedSettingsForEnv } from '@graphprotocol/deployment/lib/deployment-config.js' import { assumeUpgraded, ComponentTags, GoalTags } from '@graphprotocol/deployment/lib/deployment-tags.js' +import { + createGovernanceTxBuilder, + executeTxBatchDirect, + saveGovernanceTx, +} from '@graphprotocol/deployment/lib/execute-governance.js' import { requireContracts } from '@graphprotocol/deployment/lib/issuance-deploy-utils.js' import { createActionModule } from '@graphprotocol/deployment/lib/script-factories.js' import { syncComponentsFromRegistry } from '@graphprotocol/deployment/lib/sync-utils.js' +import type { TxBuilder } from '@graphprotocol/deployment/lib/tx-builder.js' import { graph } from '@graphprotocol/deployment/rocketh/deploy.js' import type { Environment } from '@rocketh/core/types' import type { PublicClient } from 'viem' @@ -30,34 +36,41 @@ import type { PublicClient } from 'viem' async function integrateOracle( env: Environment, client: PublicClient, + builder: TxBuilder, + governor: string, + canSign: boolean, targetLabel: string, targetEntry: RegistryEntry, oracleName: EligibilityOracleContractName | undefined, -): Promise { +): Promise { if (!oracleName) { env.showMessage(`\n ○ ${targetLabel}: no eligibility oracle configured — skipping\n`) - return + return false } const reoEntry = eligibilityOracleContract(oracleName) await syncComponentsFromRegistry(env, [reoEntry, targetEntry]) const [reo, target] = requireContracts(env, [reoEntry, targetEntry]) - const { governor, canSign } = await canSignAsGovernor(env) + const applyOpts = { + contractName: `${targetEntry.name}-REO`, + contractAddress: target.address, + canExecuteDirectly: canSign, + executor: governor, + // Append to the shared batch; the caller executes/saves once for all targets. + builder, + } // Sequenced-bundle generation: the target proxy isn't upgraded yet, so the // oracle getter would revert. Skip the probe/idempotency read and emit the // set-oracle TX unconditionally. The resulting bundle is sequenced-only — // execute it after the upgrade bundle (nonce order enforces this). if (assumeUpgraded()) { - await applyConfiguration(env, client, [createRMIntegrationCondition(reo.address)], { - contractName: `${target.name}-REO`, - contractAddress: target.address, - canExecuteDirectly: canSign, - executor: governor, + const result = await applyConfiguration(env, client, [createRMIntegrationCondition(reo.address)], { + ...applyOpts, assumeUndone: true, }) - return + return result.changesNeeded } // Skip only if the target isn't upgraded yet (no oracle getter). Once it @@ -73,15 +86,11 @@ async function integrateOracle( } catch { // Function not available — target not upgraded, skip env.showMessage(`\n ○ ${targetLabel} does not support getProviderEligibilityOracle — skipping\n`) - return + return false } - await applyConfiguration(env, client, [createRMIntegrationCondition(reo.address)], { - contractName: `${target.name}-REO`, - contractAddress: target.address, - canExecuteDirectly: canSign, - executor: governor, - }) + const result = await applyConfiguration(env, client, [createRMIntegrationCondition(reo.address)], applyOpts) + return result.changesNeeded } /** @@ -103,21 +112,48 @@ export default createActionModule( async (env) => { const settings = await getResolvedSettingsForEnv(env) const client = graph.getPublicClient(env) as PublicClient + const { governor, canSign } = await canSignAsGovernor(env) + + // One shared batch for every configured target (RM and/or RAM), so both + // setProviderEligibilityOracle TXs land in a single governance bundle. + const builder = await createGovernanceTxBuilder(env, 'gip-0088-eligibility-integrate', { + name: 'GIP-0088 Eligibility Integration', + description: 'Set the provider eligibility oracle on RewardsManager and RecurringAgreementManager', + }) - await integrateOracle( + const rmChanged = await integrateOracle( env, client, + builder, + governor, + canSign, 'RM', Contracts.horizon.RewardsManager, settings.rewardsManager.eligibilityOracle, ) - await integrateOracle( + const ramChanged = await integrateOracle( env, client, + builder, + governor, + canSign, 'RAM', Contracts.issuance.RecurringAgreementManager, settings.recurringAgreementManager.eligibilityOracle, ) + + if (!rmChanged && !ramChanged) { + env.showMessage('\n✅ Eligibility oracles already match config — nothing to do\n') + return + } + + if (canSign) { + env.showMessage('\n🔨 Executing eligibility integration batch...\n') + await executeTxBatchDirect(env, builder, governor) + env.showMessage('\n✅ Eligibility integration complete\n') + } else { + saveGovernanceTx(env, builder, 'GIP-0088 Eligibility Integration') + } }, { // Ordering anchor for a combined `--tags GIP-0088` run: REO-A always deploys diff --git a/packages/deployment/lib/apply-configuration.ts b/packages/deployment/lib/apply-configuration.ts index e79946263..24428bc0d 100644 --- a/packages/deployment/lib/apply-configuration.ts +++ b/packages/deployment/lib/apply-configuration.ts @@ -18,6 +18,7 @@ import { type RoleCondition, } from './contract-checks.js' import { createGovernanceTxBuilder, executeTxBatchDirect, saveGovernanceTx } from './execute-governance.js' +import type { TxBuilder } from './tx-builder.js' /** * Options for applyConfiguration @@ -44,6 +45,14 @@ export interface ApplyConfigurationOptions { * valid only after the upgrade bundle executes. */ assumeUndone?: boolean + + /** + * Optional shared TX builder. When provided, configuration TXs are appended to + * it and NOT executed or saved here — the caller owns executing/saving the + * combined batch once. Lets multiple applyConfiguration calls (e.g. across + * several contracts) contribute to a single governance bundle. + */ + builder?: TxBuilder } /** @@ -87,7 +96,14 @@ export async function applyConfiguration( conditions: ConfigCondition[], options: ApplyConfigurationOptions, ): Promise> { - const { contractName, contractAddress, canExecuteDirectly, executor, assumeUndone } = options + const { + contractName, + contractAddress, + canExecuteDirectly, + executor, + assumeUndone, + builder: externalBuilder, + } = options // 1. Check all conditions — or, in sequenced-generation mode, skip the read and // treat every condition as un-applied (the target proxy isn't upgraded yet, so @@ -126,7 +142,7 @@ export async function applyConfiguration( // 3. Build TX batch for failing conditions env.showMessage('\n🔨 Building configuration TX batch...\n') - const builder = await createGovernanceTxBuilder(env, `configure-${contractName}`) + const builder = externalBuilder ?? (await createGovernanceTxBuilder(env, `configure-${contractName}`)) const failingConditions = conditions.filter((_, i) => !status.conditions[i].ok) @@ -166,7 +182,13 @@ export async function applyConfiguration( } } - // 4/5. Execute or save based on access + // 4/5. When a shared builder was supplied, the caller owns executing/saving the + // combined batch — return with the TXs appended. + if (externalBuilder) { + return { status, changesNeeded: true, executedDirectly: false } + } + + // Otherwise execute or save based on access. if (canExecuteDirectly && executor) { env.showMessage('\n🔨 Executing configuration TX batch...\n') await executeTxBatchDirect(env, builder, executor) From 5ffe00ff3c85fbea45f064b3bf1666ef281ea433 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tom=C3=A1s=20Migone?= Date: Tue, 28 Jul 2026 14:46:44 -0300 Subject: [PATCH 5/5] feat(deploy): allow verifying pending implementations MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Tomás Migone --- packages/deployment/tasks/verify-contract.ts | 53 +++++++++++++++++++- packages/horizon/addresses.json | 3 ++ packages/subgraph-service/addresses.json | 3 ++ 3 files changed, 58 insertions(+), 1 deletion(-) diff --git a/packages/deployment/tasks/verify-contract.ts b/packages/deployment/tasks/verify-contract.ts index e6195008e..5e4879a48 100644 --- a/packages/deployment/tasks/verify-contract.ts +++ b/packages/deployment/tasks/verify-contract.ts @@ -353,6 +353,7 @@ async function verifySingleContract( apiKey: string, proxyOnly: boolean, implOnly: boolean, + includePending: boolean, ): Promise { const addressBook = getAddressBookForType(addressBookType, chainId) @@ -493,6 +494,47 @@ async function verifySingleContract( } } + // Verify the pending implementation (a new impl deployed but not yet live — + // the proxy still points at `implementation` until governance executes the + // upgrade). By default deploy:verify only covers the live implementation; + // --include-pending also verifies `pendingImplementation` so the new code is + // readable on the explorer before the upgrade is signed/executed. It's an + // implementation, so --proxy-only skips it and only proxied entries have one. + if (includePending && !proxyOnly && hasArtifact && entry.pendingImplementation) { + const pendingAddr = entry.pendingImplementation.address + const pendingArgs = entry.pendingImplementation.deployment?.argsData + + const existingPendingUrl = await checkEtherscanVerified(pendingAddr, apiKey, chainId) + if (existingPendingUrl) { + console.log(` ✓ Pending implementation already verified: ${existingPendingUrl}`) + } else { + const packageDir = getPackageDir(metadata.artifact!) + const isHHv3 = isHardhatV3Package(metadata.artifact!) + const artifact = loadArtifactFromSource(metadata.artifact!) + const fullyQualifiedName = getFullyQualifiedContractName(metadata.artifact!) + + console.log(` 📋 Verifying pending implementation at: ${pendingAddr}`) + const pendingResult = await runVerify( + packageDir, + networkName, + pendingAddr, + apiKey, + pendingArgs, + artifact, + isHHv3, + fullyQualifiedName, + ) + if (pendingResult.success) { + console.log( + ` ✅ Pending implementation verification complete${pendingResult.url ? `: ${pendingResult.url}` : ''}`, + ) + } else { + console.log(` ⚠️ Pending implementation verification failed (may already be verified)`) + verificationFailed = true + } + } + } + return { contract: contractName, addressBook: addressBookType, status: verificationFailed ? 'failed' : 'verified' } } @@ -501,6 +543,7 @@ interface TaskArgs { addressBook: string proxyOnly: boolean implOnly: boolean + includePending: boolean } /** @@ -518,9 +561,10 @@ interface TaskArgs { * npx hardhat deploy:verify --network arbitrumSepolia # verify all * npx hardhat deploy:verify --contract RewardsManager --network arbitrumSepolia # verify one * npx hardhat deploy:verify --impl-only --network arbitrumSepolia # implementations only + * npx hardhat deploy:verify --include-pending --network arbitrumOne # also verify pending (pre-upgrade) impls */ const action: NewTaskActionFunction = async (taskArgs, hre) => { - const { contract, proxyOnly, implOnly } = taskArgs + const { contract, proxyOnly, implOnly, includePending } = taskArgs const explicitAddressBook = taskArgs.addressBook || undefined if (proxyOnly && implOnly) { @@ -591,6 +635,7 @@ const action: NewTaskActionFunction = async (taskArgs, hre) => { apiKey, proxyOnly, implOnly, + includePending, ) results.push(result) @@ -656,6 +701,12 @@ const verifyContractTask = task('deploy:verify', 'Verify deployed contracts on E type: ArgumentType.FLAG, defaultValue: false, }) + .addOption({ + name: 'includePending', + description: 'Also verify pendingImplementation addresses (new impls awaiting a governance upgrade)', + type: ArgumentType.FLAG, + defaultValue: false, + }) .setAction(async () => ({ default: action })) .build() diff --git a/packages/horizon/addresses.json b/packages/horizon/addresses.json index cd6a558d1..6be081532 100644 --- a/packages/horizon/addresses.json +++ b/packages/horizon/addresses.json @@ -97,6 +97,9 @@ }, "implementationDeployment": { "verified": "https://arbiscan.io/address/0xaA3359434B534dE9964d4e72bE2782b076a1Eb5A#code" + }, + "proxyDeployment": { + "verified": "https://arbiscan.io/address/0x00669A4CF01450B64E8A2A20E9b1FCB71E61eF03#code" } }, "GraphTallyCollector": { diff --git a/packages/subgraph-service/addresses.json b/packages/subgraph-service/addresses.json index 862808f1e..167a7e019 100644 --- a/packages/subgraph-service/addresses.json +++ b/packages/subgraph-service/addresses.json @@ -39,6 +39,9 @@ }, "implementationDeployment": { "verified": "https://arbiscan.io/address/0x0fa6925f21d0493072ad29f3aF66f4E11655faF1#code" + }, + "proxyDeployment": { + "verified": "https://arbiscan.io/address/0x2FE023a575449AcB698648eD21276293Fa176f96#code" } }, "L2Curation": {