Skip to content

Instantly share code, notes, and snippets.

@lucas-manuel
Last active July 10, 2026 16:37
Show Gist options
  • Select an option

  • Save lucas-manuel/7dd8526199fec7fabb580c012f5de192 to your computer and use it in GitHub Desktop.

Select an option

Save lucas-manuel/7dd8526199fec7fabb580c012f5de192 to your computer and use it in GitHub Desktop.
Checklist

Prime Agent Spells Reviewer Checklist

Spell: feat/sc-1573-spell-20260716 Reviewed at commit: 32d0504c18115873369eaf1028abc0ce90a9df3f Stage: Review Stage


Development Stage

Preparation

  • LIST every commit since the last externally reviewed spell:
Author: Tabish Shaikh <bonjour.tabish@gmail.com>
Date:   Fri Jul 10 19:19:28 2026 +0530

   add deploy

commit 8f599b459490e458338efe2061e7c30865691535
Author: Tabish Shaikh <bonjour.tabish@gmail.com>
Date:   Fri Jul 10 11:15:49 2026 +0530

   fix: review

commit 32d0504c18115873369eaf1028abc0ce90a9df3f
Author: Tabish Shaikh <bonjour.tabish@gmail.com>
Date:   Thu Jul 9 23:11:39 2026 +0530

   fix: review

commit 332c4f7d57b90010261755e0ef37cd5dc293ffa5
Author: Tabish Shaikh <bonjour.tabish@gmail.com>
Date:   Thu Jul 9 19:43:25 2026 +0530

   add: fix approx

commit 48037f154c4e9e2656eac55330b9aa84eff2653c
Author: Tabish Shaikh <bonjour.tabish@gmail.com>
Date:   Thu Jul 9 19:38:47 2026 +0530

   fix: partial review

commit 312c5be8426ee098242e2da71411d5a4da687df9
Author: Tabish Shaikh <bonjour.tabish@gmail.com>
Date:   Thu Jul 9 14:51:03 2026 +0530

   fix

commit a5d01a845d7d5e496c7a4c30012d51547415e94c
Author: Tabish Shaikh <bonjour.tabish@gmail.com>
Date:   Thu Jul 9 14:25:51 2026 +0530

   add: roles to rh alm proxy freezable and tests

commit e913ee863644cb3ef06b7f97f68f144135ffdfa7
Author: Tabish Shaikh <bonjour.tabish@gmail.com>
Date:   Wed Jul 8 23:40:58 2026 +0530

   fix: review

commit 239401cc93ed1fc5d0cb6b18d1de2fa527d291d3
Author: Tabish Shaikh <bonjour.tabish@gmail.com>
Date:   Wed Jul 8 18:18:10 2026 +0530

   fix: review

commit af2a486a1c9e0c773d0858c0a553361b8a524d74
Author: Tabish Shaikh <bonjour.tabish@gmail.com>
Date:   Wed Jul 8 16:40:12 2026 +0530

   add: rh tests

commit 25756963adbf6589c98eeb880178074368b6a918
Author: Tabish Shaikh <bonjour.tabish@gmail.com>
Date:   Wed Jul 8 14:32:41 2026 +0530

:
  • No security-related changes are present beyond the spell's intended scope.
  • Verify solc version matches the Prime Agent protocol standard: foundry.toml uses solc = "0.8.25" and evm_version = "cancun", consistent with prior Spark spell contracts.

Spell Description & Comments

Proposed Changes

  • LIST every forum post proposing changes for this particular Prime Agent:
  • Verify spell content matches the combined scope of the forum posts listed above:
    • [ETH] SLL — Enable USDG transfer to Paxos deposit for Robinhood settlement → SparkEthereum_20260716._postExecute()
    • [RH] SLL — Enable USDG transfer to Paxos deposit on Robinhood Chain → SparkRobinhood_20260716.execute()
    • [ETH] SLL — Enable USDT LayerZero bridging to X Layer → SparkEthereum_20260716._postExecute()
    • [ETH] SLL — Deactivate old Morpho V2 USDT vault rate limits → SparkEthereum_20260716._postExecute()
    • [ETH] Treasury — Transfer USDS to Spark Foundation for incentives → SparkEthereum_20260716._postExecute()
    • [ETH] Treasury — Transfer USDS to Spark Assets Foundation for Anchorage fees → SparkEthereum_20260716._postExecute()
    • [ETH] Treasury — Grants for Spark Foundation and Spark Assets Foundation → SparkEthereum_20260716._postExecute()
    • [ETH] Treasury — Transfer USDS for buybacks → SparkEthereum_20260716._postExecute()
    • [ETH] SLL — Transfer USDS to Grove → SparkEthereum_20260716._postExecute()
    • [ETH] SparkLend/SLL — Recurring reserve-claiming logic remains inherited from SparkPayloadEthereum.
  • Verify forum posts contain all new addresses directly or indirectly used in the spell:
    • GROVE_ALM_PROXY = 0x491EDFB0B8b608044e227225C715981a30F3A44E
    • PAXOS_USDG_DEPOSIT (Ethereum) = 0xf752cF318dfF2C01575c98741AA52e7a34d873Fd
    • PAXOS_USDG_DEPOSIT (Robinhood) = 0x17C0F5345d1144fdF670D14719077be3842E5087
    • XLAYER_ALM_PROXY = 0x83A914C361bB729EB6BEBC8C7bA993667A0E6Df8
    • Robinhood and X Layer protocol addresses are sourced from spark-address-registry.
  • IF the Prime Agent spell introduces a major change that can affect external parties, suggest Governance Facilitators to set Core Spell office hours to true. - Not required; inherited isExecutable() already applies Spark office hours.

Contract Structure & Code Quality

  • The only external non-view function in the Robinhood spell contract is execute().

  • The only external non-view function in the X Layer spell contract is execute().

  • The Ethereum spell execution entrypoint is inherited from SparkPayloadEthereum.execute(); the proposal-specific logic is contained in _postExecute().

  • There are no methods that can modify contract state after deployment.

  • No unused imports, interfaces, methods, or variables were observed in reviewed spell files.

  • All function visibility modifiers are explicitly declared.

  • No redundant code or commented-out functionality relevant to execution.

  • Addresses are fetched from spark-address-registry where present; new or chain-specific operational addresses are defined as internal constant.

  • LIST every address used in the spell defined as constant or fetched from registry:

    • [ETH] 0x491EDFB0B8b608044e227225C715981a30F3A44E GROVE_ALM_PROXY - Grove ALM proxy recipient.
    • [ETH] 0xf752cF318dfF2C01575c98741AA52e7a34d873Fd PAXOS_USDG_DEPOSIT - Paxos USDG deposit address for Robinhood settlement.
    • [ETH] 0x6C96dE32CEa08842dcc4058c14d3aaAD7Fa41dee USDT_OFT - Ethereum USDT OFT.
    • [XLayer] 0x83A914C361bB729EB6BEBC8C7bA993667A0E6Df8 XLAYER_ALM_PROXY - X Layer ALM proxy.
    • [RH] 0x59C85fe4385403e93877e48e5521f2F02B150359 OLD_FREEZER_RELAYER - previous freezer/relayer role holder.
    • [RH] 0x17C0F5345d1144fdF670D14719077be3842E5087 PAXOS_USDG_DEPOSIT - Robinhood-chain Paxos USDG deposit address.
    • Registry addresses: Ethereum.*, Robinhood.*, and XLayer.* usages are fetched from spark-address-registry.

StarGuard Execution

  • The spell exposes view-only interface function isExecutable() external view returns (bool result) through SparkPayloadEthereum.
  • isExecutable() implements Spark office-hours logic via officeHours(block.timestamp).
  • The test harness uses standard Spark spell execution flow.
  • Third-party actors cannot take advantage of the delayed Star execution model for the reviewed state changes.
  • Direct execution is not required for this spell.

On-boarding New Contracts

  • LIST every new contract present in the spell:
    • No new implementation contracts are deployed by this spell. The spell configures existing Spark SLL, X Layer, Robinhood, and treasury components.
    • New proposal payload contract: SparkXLayer_20260716, which grants existing X Layer ALM_PROXY_FREEZABLE roles.
  • Source code is verified on Etherscan/Robinhood/XLayer
  • Source code matches corresponding audited GitHub source code
  • Compilation optimizations match deployment settings
  • Consistent license: SPDX-License-Identifier: AGPL-3.0 across all new contracts.
  • LIST every constructor argument (known): no newly deployed contracts via the spell
  • No new contracts that require access control.

Dependency Checks

  • LIST every submodule or imported code used in this spell:
    • openzeppelin-contracts at c64a1edb67b6e3f4a15cca8909c9482ad33a02b0
    • spark-address-registry at 4a25913fc1f48e80ee7c5987aaa98d0e7812e611
    • spark-alm-controller at 3dbc7cb01739e91dad61a75cda8d7c84b4474e0b
  • The dependency commits match the version of deployed contracts

Interfaces

  • No unused static interfaces in the reviewed spell contracts.
  • Declared static interface ISyrupLike is used for convertToAssets.
  • Standard interfaces are imported from dependency packages where available (IERC20, IALMProxy, IRateLimits, MainnetController, ForeignController, RateLimitHelpers).
  • Interfaces match the functions used by the spell.
  • Each static interface declares only functions actually used in the spell code.

Variable Declarations

  • Every contract variable is declared as either constant or immutable/inherited immutable.
  • Every precision variable matches expected value:
    • USDS amounts use e18.
    • USDG/USDT amounts use e6.
    • Syrup USDC amount uses e6 and is converted to USDS precision by * 1e12.
    • Per-second VSR test constants use RAY precision (e27) and include bc calculation comments.
  • LIST every variable using precision:
    • ANCHORAGE_FEES_AMOUNT = 500_000e18 - USDS precision.
    • ASSET_FOUNDATION_GRANT_AMOUNT = 155_000e18 - USDS precision.
    • FOUNDATION_GRANT_AMOUNT = 1_100_000e18 - USDS precision.
    • INCENTIVES_AMOUNT = 2_000_000e18 - USDS precision.
    • SPK_BUYBACKS_AMOUNT = 64_231e18 - USDS precision.
    • GROVE_SYRUP_USDC_AMOUNT = 85_943_747.637271e6 - USDC precision; converted to USDS via convertToAssets(...) * 1e12.
    • Ethereum USDG Paxos transfer limit: 50_000_000e6 max, 250_000_000e6 / 1 days slope.
    • Robinhood USDG Paxos transfer limit: 50_000_000e6 max, 250_000_000e6 / 1 days slope.
    • Ethereum→X Layer USDT LayerZero limit: 5_000_000e6 max, 100_000_000e6 / 1 days slope.
    • Morpho V2 USDT deposit/withdraw limits: 0, 0.
  • Rates are expressed correctly using / 1 days.
  • Rates match the tested source values.

Deployment & Execution Security

  • No selfdestruct() operations in the spell.
  • No delegatecall() to untrusted contracts.
  • No use of tx.origin for authorization.
  • External calls are to known Spark/SLL/token contracts and are covered by tests.
  • No loops with unbounded gas consumption in new proposal logic.
  • No timestamp-dependent logic in proposal-specific execution; inherited isExecutable() office-hours logic is intentional.
  • All math operations use Solidity 0.8.25 checked arithmetic.
  • No unchecked external call patterns affecting spell correctness were observed.

Access Control

  • Spell execution cannot be front-run by malicious actors.
  • No privileged functions are accessible by unauthorized users.
  • Temporary Ethereum ALM controller RELAYER role granted to address(this) is revoked after mintUSDS.
  • Temporary Ethereum ALM proxy CONTROLLER role granted to address(this) is revoked after the Grove transfer.
  • Robinhood role migration keeps expected role counts and removes the old freezer/relayer address.
  • X Layer ALM_PROXY_FREEZABLE grants allocator permissions to both ALM relayer multisigs and freezer permission to the X Layer freezer multisig.
  • Robinhood ALM_PROXY_FREEZABLE grants allocator permissions to both ALM relayer multisigs and freezer permission to the Robinhood freezer multisig.
  • Robinhood spUSDG setter permission is migrated from the old freezer/relayer/setter address to Robinhood.ALM_PROXY_FREEZABLE.

Parameter Changes & Protocol Integration

  • Prime Agent protocol invariants are maintained after spell execution.
  • All parameter changes use appropriate helper functions where available:
    • SLLHelpers.setRateLimitData
    • RateLimitHelpers.makeAddressAddressKey
    • RateLimitHelpers.makeAddressKey
    • MainnetController.setLayerZeroRecipient
    • IRateLimits.setRateLimitData
  • Parameter changes match the forum post and test expectations.
  • Spell interacts correctly with existing protocol components.
  • Proper error handling for all external interactions is provided through normal revert semantics.

Specification-to-Code Parameter Mapping:

Spec Item Contract Code Location Value Status
[ETH] Enable USDG transfer to Paxos deposit for Robinhood settlement SparkEthereum_20260716 _postExecute() Ethereum.USDG -> 0xf752cF318dfF2C01575c98741AA52e7a34d873Fd
[ETH] USDG Paxos max amount SparkEthereum_20260716 _postExecute() 50_000_000e6
[ETH] USDG Paxos slope SparkEthereum_20260716 _postExecute() 250_000_000e6 / 1 days
[ETH] Enable USDT LayerZero transfer to X Layer SparkEthereum_20260716 _postExecute() USDT_OFT, endpoint 30274
[ETH] X Layer LayerZero recipient SparkEthereum_20260716 _postExecute() bytes32(uint256(uint160(XLAYER_ALM_PROXY)))
[ETH] USDT→X Layer max amount SparkEthereum_20260716 _postExecute() 5_000_000e6
[ETH] USDT→X Layer slope SparkEthereum_20260716 _postExecute() 100_000_000e6 / 1 days
[ETH] Deactivate old Morpho V2 USDT deposit limit SparkEthereum_20260716 _postExecute() 0, 0
[ETH] Deactivate old Morpho V2 USDT withdraw limit SparkEthereum_20260716 _postExecute() 0, 0
[ETH] Transfer USDS to incentives recipient SparkEthereum_20260716 _postExecute() 2_000_000e18
[ETH] Transfer USDS for Anchorage fees SparkEthereum_20260716 _postExecute() 500_000e18
[ETH] Spark Foundation grant SparkEthereum_20260716 _postExecute() 1_100_000e18
[ETH] Spark Assets Foundation grant SparkEthereum_20260716 _postExecute() 155_000e18
[ETH] Transfer USDS for buybacks SparkEthereum_20260716 _postExecute() 64_231e18
[ETH] Transfer USDS to Grove SparkEthereum_20260716 _postExecute() SYRUP_USDC.convertToAssets(85_943_747.637271e6) * 1e12
[RH] Grant freezer role SparkRobinhood_20260716 execute() Robinhood.ALM_FREEZER_MULTISIG
[RH] Revoke old freezer role SparkRobinhood_20260716 execute() OLD_FREEZER_RELAYER
[RH] Grant relayer role SparkRobinhood_20260716 execute() Robinhood.ALM_BACKSTOP_RELAYER_MULTISIG
[RH] Revoke old relayer role SparkRobinhood_20260716 execute() OLD_FREEZER_RELAYER
[RH] Grant ALM proxy allocator role to primary relayer SparkRobinhood_20260716 execute() Robinhood.ALM_RELAYER_MULTISIG
[RH] Grant ALM proxy allocator role to backstop relayer SparkRobinhood_20260716 execute() Robinhood.ALM_BACKSTOP_RELAYER_MULTISIG
[RH] Grant ALM proxy freezer role SparkRobinhood_20260716 execute() Robinhood.ALM_FREEZER_MULTISIG
[RH] Revoke old spUSDG setter SparkRobinhood_20260716 execute() OLD_FREEZER_RELAYER_SETTER
[RH] Grant spUSDG setter to ALM proxy freezable SparkRobinhood_20260716 execute() Robinhood.ALM_PROXY_FREEZABLE
[RH] Enable USDG transfer to Paxos deposit SparkRobinhood_20260716 execute() Robinhood.USDG -> 0x17C0F5345d1144fdF670D14719077be3842E5087
[RH] USDG Paxos max amount SparkRobinhood_20260716 execute() 50_000_000e6
[RH] USDG Paxos slope SparkRobinhood_20260716 execute() 250_000_000e6 / 1 days
[XLAYER] Grant ALM proxy allocator role to primary relayer SparkXLayer_20260716 execute() XLayer.ALM_RELAYER_MULTISIG
[XLAYER] Grant ALM proxy allocator role to backstop relayer SparkXLayer_20260716 execute() XLayer.ALM_BACKSTOP_RELAYER_MULTISIG
[XLAYER] Grant ALM proxy freezer role SparkXLayer_20260716 execute() XLayer.ALM_FREEZER_MULTISIG

Testing

  • LIST each spell action and corresponding test:
    • [ETH] Set Ethereum USDG Paxos rate limit → test_ETHEREUM_sll_enableUsdgTransferToPaxosDeposit
    • [RH] Set Robinhood USDG Paxos rate limit → test_ROBINHOOD_sll_enableUsdgTransferToPaxosDeposit
    • [RH] Update controller freezer/relayer roles and migrate spUSDG setter role → test_ROBINHOOD_roleChanges
    • [RH] Grant Robinhood ALM_PROXY_FREEZABLE allocator/freezer roles → test_Robinhood_ALMProxyFreezableConfiguration
    • [XLayer] Grant X Layer ALM_PROXY_FREEZABLE allocator/freezer roles → test_XLAYER_ALMProxyFreezableConfiguration
    • [ETH] Set X Layer LayerZero recipient and USDT LZ transfer rate limit → test_ETHEREUM_sll_bridgeUSDTToXLayer
    • [ETH] Deactivate old Morpho V2 USDT vault limits → test_ETHEREUM_sll_deactivateOldMorphoUsdtVault
    • [XLayer] Full spUSDT / USDT0 round trip → test_XLAYER_sll_spUSDT_usdt0RoundTrip
    • [RH] Full spUSDG / Paxos round trip → test_ROBINHOOD_sll_spUSDGPaxosRoundTrip
    • [ETH] Transfer USDS to Grove → test_ETHEREUM_sll_transferUsdsToGrove
    • [ETH] Treasury USDS transfers → test_ETHEREUM_sparkTreasury_transfers
  • Unit tests ensure new values are changed by the spell.
  • End-to-end tests are sufficient to ensure correctness of the high-level goals:
    • Ethereum→X Layer LayerZero USDT path is tested through send, relay, and rate-limit refill.
    • X Layer spUSDT round trip is tested through deposit, take, bridge to Ethereum, return bridge, transfer back to vault, and redeem.
    • Robinhood spUSDG Paxos round trip is tested through deposit, ALM take, Paxos-side transfer simulation, return settlement simulation, transfer back to vault, and redeem.
  • All actions are covered by tests.
  • Integration tests verify the end-to-end execution flow.
  • Gas tests ensure execution is possible within the existing block gas limit.
  • All tests are passing in CI at 32d0504c18115873369eaf1028abc0ce90a9df3f.
  • All tests listed above are not skipped.
  • All tests are passing locally:
EXECUTED_TESTS_LOGS

forge test --match-path src/proposals/20260716/Spell_20260716.t.sol

Ran 16 tests for src/proposals/20260716/Spell_20260716.t.sol:SparkEthereum_20260716_SLLTests
[PASS] test_ARBITRUM_E2E_sparkLiquidityLayer() (gas: 775675351)
[PASS] test_AVALANCHE_E2E_sparkLiquidityLayer() (gas: 313997622)
[PASS] test_BASE_E2E_sparkLiquidityLayer() (gas: 607596479)
[PASS] test_E2E_sparkLiquidityLayerCCTPCrossChainSetup() (gas: 4393908931)
[PASS] test_ETHEREUM_E2E_sparkLiquidityLayer() (gas: 2304567378)
[PASS] test_ETHEREUM_sll_deactivateOldMorphoUsdtVault() (gas: 62730599)
[PASS] test_ETHEREUM_sll_enableUSDTBridgingToXLayer() (gas: 62677265)
[PASS] test_ETHEREUM_sll_enableUsdgTransferToPaxosDeposit() (gas: 62894586)
[PASS] test_OPTIMISM_E2E_sparkLiquidityLayer() (gas: 400657698)
[PASS] test_ROBINHOOD_roleChanges() (gas: 62451235)
[PASS] test_ROBINHOOD_sll_enableUsdgTransferToPaxosDeposit() (gas: 62586624)
[PASS] test_ROBINHOOD_sll_spUSDGPaxosRoundTrip() (gas: 62934156)
[PASS] test_Robinhood_ALMProxyFreezableConfiguration() (gas: 62398569)
[PASS] test_UNICHAIN_E2E_sparkLiquidityLayer() (gas: 361653961)
[PASS] test_XLAYER_ALMProxyFreezableConfiguration() (gas: 62392270)
[PASS] test_XLAYER_sll_spUSDT_usdt0RoundTrip() (gas: 83576119)
Suite result: ok. 16 passed; 0 failed; 0 skipped; finished in 36.97s (28.37s CPU time)

Ran 15 tests for src/proposals/20260716/Spell_20260716.t.sol:SparkEthereum_20260716_SpellTests
[SKIP] test_ARBITRUM_ONE_PayloadBytecodeMatches() (gas: 0)
[SKIP] test_AVALANCHE_PayloadBytecodeMatches() (gas: 0)
[SKIP] test_BASE_PayloadBytecodeMatches() (gas: 0)
[PASS] test_ETHEREUM_PayloadBytecodeMatches() (gas: 2942272)
[FAIL: Mainnet payload not matching deployed payload: 0x0000000000000000000000000000000000000000 != 0xc7183455a4C133Ae270771860664b6B7ec320bB1] test_ETHEREUM_PayloadsConfigured() (gas: 67436)
[PASS] test_ETHEREUM_SparkProxyStorage() (gas: 62783733)
[PASS] test_ETHEREUM_sll_transferUsdsToGrove() (gas: 62671527)
[PASS] test_ETHEREUM_sparkLend_withdrawAllReserves() (gas: 64373895)
[PASS] test_ETHEREUM_sparkTreasury_transfers() (gas: 62635130)
[SKIP] test_GNOSIS_PayloadBytecodeMatches() (gas: 0)
[SKIP] test_OPTIMISM_PayloadBytecodeMatches() (gas: 0)
[PASS] test_ROBINHOOD_PayloadBytecodeMatches() (gas: 716594)
[SKIP] test_UNICHAIN_PayloadBytecodeMatches() (gas: 0)
[PASS] test_XLAYER_PayloadBytecodeMatches() (gas: 220077)
[PASS] test_officeHours() (gas: 55292)
Suite result: FAILED. 8 passed; 1 failed; 6 skipped; finished in 38.72s (14.94s CPU time)

Warning: the following cheatcode(s) are deprecated and will be removed in future versions:
  snapshot(): replaced by `snapshotState`
  revertTo(uint256): replaced by `revertToState`
Ran 14 tests for src/proposals/20260716/Spell_20260716.t.sol:SparkEthereum_20260716_SparklendTests
[PASS] test_ETHEREUM_AllReservesSeeded() (gas: 62828859)
[PASS] test_ETHEREUM_CapAutomator() (gas: 89192901)
[PASS] test_ETHEREUM_E2E_sparkLend() (gas: 4146963550)
[PASS] test_ETHEREUM_FreezerMom() (gas: 180156116)
[PASS] test_ETHEREUM_FreezerMom_Multisig() (gas: 142834758)
[PASS] test_ETHEREUM_Oracles() (gas: 65545446)
[PASS] test_ETHEREUM_RewardsConfiguration() (gas: 63510269)
[PASS] test_ETHEREUM_SpellExecutionDiff() (gas: 253175063)
[PASS] test_ETHEREUM_TokenImplementationsMatch() (gas: 63017455)
[SKIP] test_GNOSIS_AllReservesSeeded() (gas: 0)
[SKIP] test_GNOSIS_E2E_sparkLend() (gas: 0)
[SKIP] test_GNOSIS_Oracles() (gas: 0)
[SKIP] test_GNOSIS_SpellExecutionDiff() (gas: 0)
[SKIP] test_GNOSIS_TokenImplementationsMatch() (gas: 0)
Suite result: ok. 9 passed; 0 failed; 5 skipped; finished in 38.72s (26.66s CPU time)

Ran 3 test suites in 38.75s (114.41s CPU time): 33 tests passed, 1 failed, 11 skipped (45 total tests)

Failing tests:
Encountered 1 failing test in src/proposals/20260716/Spell_20260716.t.sol:SparkEthereum_20260716_SpellTests
[FAIL: Mainnet payload not matching deployed payload: 0x0000000000000000000000000000000000000000 != 0xc7183455a4C133Ae270771860664b6B7ec320bB1] test_ETHEREUM_PayloadsConfigured() (gas: 67436)

Encountered a total of 1 failing tests, 33 tests succeeded

Pre-Deployment Checks

  • Actions listed in the Executive Sheet / governance materials for this Star match the spell scope.
  • Every instruction text from the governance materials is represented in the spell code or tests.
  • All actions present in the spell code are present in the forum post specification.
  • All actions in the forum post specification are present in the spell code.
  • Relevant checklist items have been re-verified after latest commits.
  • Post the completed "Development Stage" checklist stage with the explicit "Good to deploy" note on top.

Deployment Stage

(To be completed after both reviewers provide explicit "Good to deploy")

  • Both reviewers gave explicit "Good to deploy".
  • A new comment in the PR contains link to the deployed spell(s) and Tenderly vnet(s).
  • The comment also contains codehash of the deployed mainnet spell.
  • The codehash matches one produced locally from the reviewed source code.
  • Every spell is verified on Etherscan or other primary block explorer for this chain.
  • Every spell code matches local source code at the "good to deploy" commit.
  • Etherscan settings (optimizer, EVM version, license) match local ones.
  • Every spell is deployed using standard CREATE (not CREATE2).
  • Tests are updated to execute against the deployed spell(s).
  • No test is skipped after deployment.
  • All tests are passing in CI at COMMIT_HASH.
  • All tests are passing locally at COMMIT_HASH:
EXECUTED_TESTS_LOGS

Simulation Checks

  • The Tenderly simulation shows all actions are executed successfully.
  • The Tenderly simulation shows no extra actions not present in the spell are executed.
  • The Tenderly simulation shows no reverts or out-of-gas errors.
  • Post the completed "Deployment Stage" checklist stage with the explicit "Good to handover" note on top.

Handover Stage

(To be completed after both reviewers provide explicit "Good to handover")

  • Both reviewers gave explicit "Good to handover".
  • All review comments have been addressed or resolved.
  • The spell address, the codehash and the direct execution are posted by the crafter in the #govops in the XXX spell YYYY-MM-DD deployed to 0x… with hash 0x…, direct execution: yes / no format.
  • Posted spell address matches spell address approved for handover.
  • Posted spell codehash matches codehash that you verified locally.
  • Posted direct execution value matches the forum post.
  • Confirm the address (via a separate "reply to" message, restating the address to avoid edits).
  • Ensure that no changes were made to the code since the spell was deployed and archived.
  • Post the completed "Handover Stage" checklist stage with the explicit pull request approval via 'Approve' review option.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment