diff --git a/scripts/deprecation/README.md b/scripts/deprecation/README.md new file mode 100644 index 000000000..15b111018 --- /dev/null +++ b/scripts/deprecation/README.md @@ -0,0 +1,159 @@ +# RToken Deprecation + +Deprecation permanently disables an RToken by executing a governance proposal that pauses issuance, stops auctions, redirects all revenue to RSR stakers, and renounces ownership. After deprecation, holders can still redeem their RTokens for underlying collateral, but no new issuance or governance actions are possible. + +## Deprecation Actions + +The proposal executes the following actions atomically through the timelock: + +1. **Set batch auction length to 0** — stops all batch auctions +2. **Set issuance throttle to 1e18 (minimum)** — minimizes issuance capacity +3. **Grant PAUSER role to timelock** — needed for the next two steps +4. **Unpause trading** — safety measure ensuring stakers can unstake after deprecation +5. **Pause issuance** — blocks new minting (redemptions remain open) +6. **Set distribution to 0% RToken / 100% RSR** — redirects all revenue +7. **Remove all PAUSER roles** — including the timelock grant from step 3 +8. **Remove all SHORT_FREEZER roles** +9. **Remove all LONG_FREEZER roles** +10. **Remove OWNER role from timelock** — **must be last** (irreversible) + +## Workflow + +### 1. Generate the Proposal JSON + +Add or update the RToken config in `generate-deprecation-proposals.py`, then run: + +```bash +cd scripts/deprecation +python3 generate-deprecation-proposals.py +``` + +This produces a Safe TX Builder JSON in `proposals/deprecate-.json` containing a single `Governor.propose()` call wrapping all the actions above. + +### 2. Pre-Submission Validation (Fork Test) + +Before submitting on-chain, validate the proposal using the fork test template: + +```bash +# Configure test/deprecation/deprecate-from-json.test.ts with: +# - PROPOSAL_JSON path +# - Contract addresses (GOVERNOR, TIMELOCK, MAIN, RTOKEN, BROKER) +# - Role holders (PAUSERS, SHORT_FREEZERS, LONG_FREEZERS) +# - RTOKEN_HOLDER for redemption test +# - RSR_WHALE or StRSR delegation addresses + +PROTO=p1 FORK=1 FORK_NETWORK= FORK_BLOCK= \ + npx hardhat test test/deprecation/deprecate-from-json.test.ts +``` + +The test validates 7 post-conditions: + +- Proposal executes through full governance lifecycle +- All roles removed (PAUSER, SHORT_FREEZER, LONG_FREEZER, OWNER) +- Issuance paused +- Batch auction length = 0 +- Redemption still works +- New issuance blocked +- **Unstake and withdraw work** (trading not paused) + +### 3. Submit via Safe TX Builder + +Import the generated JSON into the Safe Transaction Builder UI and submit. + +### 4. Post-Submission Validation + +After the proposal is on-chain, validate using the on-chain proposal template: + +```bash +# Configure test/deprecation/deprecate-onchain-proposal.test.ts with: +# - PROPOSAL_JSON path (must match what was submitted) +# - PROPOSAL_ID from on-chain +# - Same contract addresses and role holders +# - Use a FORK_BLOCK where the proposal exists + +PROTO=p1 FORK=1 FORK_NETWORK= FORK_BLOCK= \ + npx hardhat test test/deprecation/deprecate-onchain-proposal.test.ts +``` + +This verifies the JSON calldata matches the on-chain proposal ID before running the same 7 validations. + +## Governor Types + +Different RTokens use different governor implementations. The fork tests must advance time/blocks correctly: + +| Governor | Clock Mode | Voting Delay | Voting Period | +| ------------------------ | ----------- | ---------------------------------- | ---------------------------------- | +| **Governance** (Reserve) | timestamp | `advanceTime` | `advanceBlocks` | +| **Governor Anastasius** | timestamp | `advanceTime` + `advanceBlocks(2)` | `advanceTime` + `advanceBlocks(2)` | +| **Governor Alexios** | block-based | `advanceBlocks` | `advanceBlocks` | + +To identify the governor type: + +```bash +cast call "name()(string)" --rpc-url +cast call "CLOCK_MODE()(string)" --rpc-url # reverts for Alexios +``` + +## Voting Power + +### Mainnet + +Use the RSR whale `0x6bab6EB87Aa5a1e4A8310C73bDAAA8A5dAAd81C1` — transfer RSR to tester, stake, and delegate before proposing. + +### Base / Arbitrum + +No consistent RSR whale exists. Instead, delegate from existing StRSR holders: + +```bash +# Find StRSR holders via Alchemy +curl -s -X POST -H "Content-Type: application/json" \ + -d '{"jsonrpc":"2.0","id":1,"method":"alchemy_getAssetTransfers","params":[{"fromBlock":"0x0","toBlock":"latest","contractAddresses":[""],"category":["erc20"],"maxCount":"0x20","order":"desc"}]}' + +# Check balances +cast call "balanceOf(address)(uint256)" --rpc-url +``` + +Combined delegated StRSR must exceed `totalSupply * quorumNumerator / 100`. + +## Pre-Execution Checklist + +Before executing any deprecation proposal, verify: + +- [ ] **Trading is NOT paused** — `main.tradingPausedOrFrozen() == false` +- [ ] **No open trades** — `rsrTrader.tradesOpen() == 0 && rTokenTrader.tradesOpen() == 0` +- [ ] **Fork test passes all 7 checks** including unstake/withdraw +- [ ] **Proposal ID matches** JSON calldata (for post-submission validation) + +## Key Technical Notes + +- **`setDistribution` (singular)**: Deployed v3.4.0 Distributor uses `setDistribution(address,(uint16,uint16))` (selector `0x88594437`), NOT `setDistributions` (plural). The script uses two separate calls: FURNACE=address(1) to (0,0) and ST_RSR=address(2) to (0,10000). + +- **`pushOraclesForward`**: Required before `governor.execute()` and before redemption tests, as time advancement during the governance lifecycle causes oracle staleness. + +- **ethers.js `Result.values()`**: When decoding `governor.propose()` calldata, use positional access (`decoded[0]`, `decoded[1]`) — the named field `values` collides with the ethers.js `Result.values()` method. + +- **Redemption throttle**: Large redemptions on Base may hit the supply change throttle. Cap redemption amounts with `bal.gt(fp('1000')) ? fp('1000') : bal`. + +- **RPC rate limits**: Alchemy is recommended over Infura for fork tests (Infura hits 429 rate limits on heavy fork usage). + +## File Structure + +``` +scripts/deprecation/ +├── README.md # This file +├── generate-deprecation-proposals.py # Proposal generator script +└── proposals/ # Generated Safe TX Builder JSONs + ├── deprecate-BSDX.json + ├── deprecate-KNOX.json + ├── deprecate-MAAT.json + ├── deprecate-USDCplus.json + ├── deprecate-VAYA.json + ├── deprecate-dgnETH.json + ├── deprecate-hyUSD-base.json + ├── deprecate-hyUSD-mainnet.json + └── deprecate-rgUSD.json + +test/deprecation/ +├── deprecate-from-json.test.ts # Template: pre-submission validation +└── deprecate-onchain-proposal.test.ts # Template: post-submission validation +``` diff --git a/scripts/deprecation/generate-deprecation-proposals.py b/scripts/deprecation/generate-deprecation-proposals.py new file mode 100644 index 000000000..535ed755e --- /dev/null +++ b/scripts/deprecation/generate-deprecation-proposals.py @@ -0,0 +1,409 @@ +#!/usr/bin/env python3 +"""Generate Gnosis Safe Transaction Builder JSON files for RToken deprecation. + +Each file contains a single transaction: a call to Governor.propose() with the +full batch of deprecation actions encoded as targets/values/calldatas. + +The timelock (controlled by the governor) is the OWNER of Main and executes +the actions after the proposal passes and the timelock delay elapses. +""" + +import json +import os +import subprocess +import time + +# Pre-computed calldata for individual deprecation actions +SET_BATCH_AUCTION_LENGTH_0 = "0x8881615a0000000000000000000000000000000000000000000000000000000000000000" +SET_ISSUANCE_THROTTLE_MIN = "0x5beafb3d0000000000000000000000000000000000000000000000000de0b6b3a76400000000000000000000000000000000000000000000000000000000000000000000" +UNPAUSE_TRADING = "0x456068d2" +PAUSE_ISSUANCE = "0xdf23cbb1" +# setDistribution(address,(uint16,uint16)) — singular form for v3.4.0 deployed contracts +# FURNACE = address(1), share = (rTokenDist=0, rsrDist=0) +SET_DISTRIBUTION_FURNACE_0 = "0x88594437000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" +# ST_RSR = address(2), share = (rTokenDist=0, rsrDist=10000) +SET_DISTRIBUTION_STRSR_100 = "0x88594437000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002710" + +# Role bytes32 values +PAUSER_ROLE = "0x5041555345520000000000000000000000000000000000000000000000000000" +SHORT_FREEZER_ROLE = "0x53484f52545f465245455a455200000000000000000000000000000000000000" +LONG_FREEZER_ROLE = "0x4c4f4e475f465245455a45520000000000000000000000000000000000000000" +OWNER_ROLE = "0x4f574e4552000000000000000000000000000000000000000000000000000000" + + +def encode_grant_role(role_bytes32: str, account: str) -> str: + account_padded = account.lower().replace("0x", "").zfill(64) + role_padded = role_bytes32.replace("0x", "") + return f"0x2f2ff15d{role_padded}{account_padded}" + + +def encode_revoke_role(role_bytes32: str, account: str) -> str: + account_padded = account.lower().replace("0x", "").zfill(64) + role_padded = role_bytes32.replace("0x", "") + return f"0xd547741f{role_padded}{account_padded}" + + +def build_actions(timelock: str, main: str, rtoken: str, broker: str, + distributor: str, pausers: list, short_freezers: list, + long_freezers: list): + """Build the (targets, calldatas) arrays for all deprecation actions. + The timelock is the entity that executes these (it holds OWNER on Main). + """ + targets = [] + calldatas = [] + + # 1. Set batch auction length to 0 + targets.append(broker) + calldatas.append(SET_BATCH_AUCTION_LENGTH_0) + + # 2. Set issuance throttle to 1e18 (minimum) + targets.append(rtoken) + calldatas.append(SET_ISSUANCE_THROTTLE_MIN) + + # 3. Grant PAUSER role to timelock (so it can pause) + targets.append(main) + calldatas.append(encode_grant_role(PAUSER_ROLE, timelock)) + + # 4. Unpause trading (safety measure — ensures stakers can unstake after deprecation) + targets.append(main) + calldatas.append(UNPAUSE_TRADING) + + # 5. Pause minting + targets.append(main) + calldatas.append(PAUSE_ISSUANCE) + + # 6a. Set distribution: FURNACE (address(1)) to 0% RToken, 0% RSR + targets.append(distributor) + calldatas.append(SET_DISTRIBUTION_FURNACE_0) + + # 6b. Set distribution: ST_RSR (address(2)) to 0% RToken, 100% RSR + targets.append(distributor) + calldatas.append(SET_DISTRIBUTION_STRSR_100) + + # 7. Remove all PAUSER roles (including the timelock we just granted) + all_pausers = sorted(set([p.lower() for p in pausers] + [timelock.lower()])) + for pauser in all_pausers: + targets.append(main) + calldatas.append(encode_revoke_role(PAUSER_ROLE, pauser)) + + # 8. Remove all SHORT_FREEZER roles + for freezer in sorted(set([f.lower() for f in short_freezers])): + targets.append(main) + calldatas.append(encode_revoke_role(SHORT_FREEZER_ROLE, freezer)) + + # 9. Remove all LONG_FREEZER roles + for freezer in sorted(set([f.lower() for f in long_freezers])): + targets.append(main) + calldatas.append(encode_revoke_role(LONG_FREEZER_ROLE, freezer)) + + # 10. Remove all OWNER roles (MUST BE LAST) + targets.append(main) + calldatas.append(encode_revoke_role(OWNER_ROLE, timelock)) + + return targets, calldatas + + +def encode_propose(targets: list, calldatas: list, description: str) -> str: + """Use cast to ABI-encode Governor.propose(address[],uint256[],bytes[],string).""" + targets_str = "[" + ",".join(targets) + "]" + values_str = "[" + ",".join(["0"] * len(targets)) + "]" + calldatas_str = "[" + ",".join(calldatas) + "]" + + result = subprocess.run( + [ + "cast", "calldata", + "propose(address[],uint256[],bytes[],string)", + targets_str, + values_str, + calldatas_str, + description, + ], + capture_output=True, text=True, check=True, + ) + return result.stdout.strip() + + +def generate_proposal(name: str, chain_id: int, governor: str, timelock: str, + main: str, rtoken: str, broker: str, distributor: str, + pausers: list, short_freezers: list, long_freezers: list) -> dict: + targets, calldatas = build_actions( + timelock=timelock, main=main, rtoken=rtoken, broker=broker, + distributor=distributor, pausers=pausers, + short_freezers=short_freezers, long_freezers=long_freezers, + ) + + description = ( + f"Deprecate {name}\\n\\n" + f"Actions:\\n" + f"1. Set batch auction length to 0\\n" + f"2. Set issuance throttle to 1e18 (minimum)\\n" + f"3. Unpause trading (safety: ensures stakers can unstake after deprecation)\\n" + f"4. Pause minting\\n" + f"5. Set distribution to 0% RToken, 100% RSR\\n" + f"6. Remove all PAUSER roles\\n" + f"7. Remove all SHORT_FREEZER roles\\n" + f"8. Remove all LONG_FREEZER roles\\n" + f"9. Remove all OWNER roles" + ) + + propose_calldata = encode_propose(targets, calldatas, description) + + return { + "version": "1.0", + "chainId": str(chain_id), + "createdAt": int(time.time()), + "meta": { + "name": f"Deprecate {name}", + "description": f"Governance proposal to deprecate {name}", + "txBuilderVersion": "1.16.5", + "createdFromSafeAddress": "", + "createdFromOwnerAddress": "", + "checksum": "", + }, + "transactions": [ + { + "to": governor, + "value": "0", + "data": propose_calldata, + } + ], + } + + +# RToken definitions +# governor = Governor contract (where propose() is called) +# timelock = TimelockController (OWNER of Main, executor of proposals) +rtokens = [ + { + "name": "dgnETH", + "filename": "deprecate-dgnETH.json", + "chain_id": 1, + "governor": "0xb7cb3880564a1f8698018ecdc78972f93b2615e6", + "timelock": "0x05623fcee6fb48b7c8058022c48a72dbce09878e", + "main": "0x0A82c906E283FE813fa591D104E0Bfe75609cD35", + "rtoken": "0x005F893EcD7bF9667195642f7649DA8163e23658", + "broker": "0x9baDe46AC6b0c6e3460513Ec71e5B2636D8ddac0", + "distributor": "0x00365b8B3B2A3294554CfB70d288A8ac19d9e087", + "pausers": [ + "0xd5fe2780eb882d1da78f2136b81c2a4395488c98", + "0x9ca72f031f789f51bd35cc34583c7b7a7d0871a3", + ], + "short_freezers": [ + "0xd5fe2780eb882d1da78f2136b81c2a4395488c98", + "0xd733d4cc5b42206a62ed7b1ceec5b4d61898f429", + "0x03d03a026e71979be3b08d44b01eae4c5ff9da99", + "0x8785b3a82d1e3c067cee8ff830df56c78f13526d", + "0x9ca72f031f789f51bd35cc34583c7b7a7d0871a3", + ], + "long_freezers": [ + "0xd5fe2780eb882d1da78f2136b81c2a4395488c98", + ], + }, + { + "name": "hyUSD (mainnet)", + "filename": "deprecate-hyUSD-mainnet.json", + "chain_id": 1, + "governor": "0x3f26ef1460d21a99425569ef3148ca6059a7eeae", + "timelock": "0x788fd297b4d497e44e4bf25d642fbeca3018b5d2", + "main": "0x2cabaa8010b3fbbDEeBe4a2D0fEffC2ed155bf37", + "rtoken": "0xaCdf0DBA4B9839b96221a8487e9ca660a48212be", + "broker": "0x44344ca9014BE4bB622037224d107493586f35ed", + "distributor": "0x0297941cCB71f5595072C4fA34CE443b6C5b47A0", + "pausers": [ + "0xd5fe2780eb882d1da78f2136b81c2a4395488c98", + "0xadee783168faae3f5e1151de989ce3f252cc9a05", + "0x624f9f076ed42ba3b37c3011dc5a1761c2209e1c", + ], + "short_freezers": [ + "0xd5fe2780eb882d1da78f2136b81c2a4395488c98", + "0x624f9f076ed42ba3b37c3011dc5a1761c2209e1c", + ], + "long_freezers": [ + "0xd5fe2780eb882d1da78f2136b81c2a4395488c98", + "0x624f9f076ed42ba3b37c3011dc5a1761c2209e1c", + ], + }, + { + "name": "hyUSD (base)", + "filename": "deprecate-hyUSD-base.json", + "chain_id": 8453, + "governor": "0xffef97179f58a582def73e6d2e4bcd2bdc8ca128", + "timelock": "0x4284d76a03f9b398ff7aec58c9dec94b289070cf", + "main": "0xA582985c68ED30a052Ff0b07D74931140bd5a00F", + "rtoken": "0xCc7FF230365bD730eE4B352cC2492CEdAC49383e", + "broker": "0x0E05139662e0C8752a100DB08DA0C7E435B8aC94", + "distributor": "0xf0a83bC73E9bAeb69b2fBB1e48bCdabf9C1012ca", + "pausers": [ + "0xc3954aa47e469add8b5ad8c243e6c72abbe08549", + ], + "short_freezers": [ + "0xc3954aa47e469add8b5ad8c243e6c72abbe08549", + ], + "long_freezers": [ + "0x6f1d6b86d4ad705385e751e6e88b0fdfdbadf298", + ], + }, + { + "name": "MAAT", + "filename": "deprecate-MAAT.json", + "chain_id": 8453, + "governor": "0x0f7f1442da7f687bb877fbee0539fa8d6e4d1a02", + "timelock": "0xe67ceb03efdf9b3fb5c3febf3103e2efd3a76a1b", + "main": "0xDf699488CA4340F71d24Cff1424146c836407d4e", + "rtoken": "0x641B0453487C9D14c5df96d45a481ef1dc84e31f", + "broker": "0x6baffC6282fDC15fE6AF9e2698e4b6D664CbC65c", + "distributor": "0x0FF73c65202FA6d884065aE208A12a5d26B579c9", + "pausers": [], + "short_freezers": [], + "long_freezers": [], + }, + { + "name": "KNOX", + "filename": "deprecate-KNOX.json", + "chain_id": 42161, + "governor": "0x17a5fA0C4c682b86Cfb76FAd2A03B2328D4680fF", + "timelock": "0xccb548e8f74eb2f613f53dd2c389842dd4a13e22", + "main": "0xB0F377e58F4fA4bC42067868A699666bd7DAc565", + "rtoken": "0x0BBF664D46becc28593368c97236FAa0fb397595", + "broker": "0x8B96d8b68E33EB62558c5ff3B395F0AD24d3b5fF", + "distributor": "0xb8b83D56ab18E9bd5B554c2709B50DE290678785", + "pausers": [ + "0x7a58ef5205a7b5eb22259d0dc7917b24e72726ad", + "0x2e84581ef04700aa351b1184f2aa0bc1617fa989", + ], + "short_freezers": [ + "0x7a58ef5205a7b5eb22259d0dc7917b24e72726ad", + "0x75c832d2e3ad4c82af61293e12c71add7bc2831c", + ], + "long_freezers": [ + "0x7a58ef5205a7b5eb22259d0dc7917b24e72726ad", + ], + }, + { + "name": "USDC+", + "filename": "deprecate-USDCplus.json", + "chain_id": 1, + "governor": "0xc837c557071d604bcb1058c8c4891ddbe8fdd630", + "timelock": "0x6c957417cb6df6e821eec8555dee8b116c291999", + "main": "0xeC11Cf537497141aC820615F4f399be4a1638Af6", + "rtoken": "0xFc0B1EEf20e4c68B3DCF36c4537Cfa7Ce46CA70b", + "broker": "0x7aFc1d0bDFE2F3887466534516447bA4cE97B305", + "distributor": "0x348F00534b0aa8b575D24356E7C3e1a5e6403fA1", + "pausers": [ + "0x52ea58f4fc3ced48fa18e909226c1f8a0ef887dc", + "0xfdefe2e8ae439547a4ca4b2656715e5bbceb295b", + "0x8785b3a82d1e3c067cee8ff830df56c78f13526d", + ], + "short_freezers": [ + "0xfdefe2e8ae439547a4ca4b2656715e5bbceb295b", + "0x52ea58f4fc3ced48fa18e909226c1f8a0ef887dc", + "0x8785b3a82d1e3c067cee8ff830df56c78f13526d", + ], + "long_freezers": [ + "0xfdefe2e8ae439547a4ca4b2656715e5bbceb295b", + "0x52ea58f4fc3ced48fa18e909226c1f8a0ef887dc", + "0x8785b3a82d1e3c067cee8ff830df56c78f13526d", + ], + }, + { + "name": "BSDX", + "filename": "deprecate-BSDX.json", + "chain_id": 8453, + "governor": "0xe8699d59ddcec4c0eddba32dec148e593324b446", + "timelock": "0xfbb633436f9998ef030c3dd1f636cc92a669da8f", + "main": "0x9129E75ac2fF30C1FF6864aDf9c63C5767e4F044", + "rtoken": "0x8f0987DDb485219c767770e2080E5cC01ddc772a", + "broker": "0x7B587720921FeFdEE00ac01C2590f060E932bce9", + "distributor": "0x986377A8561B336e1C58FB370B3DF302eBbF21BC", + "pausers": [ + "0x27f67409b292fef1a6735c007e7f46e1ea374521", + "0x03d03a026e71979be3b08d44b01eae4c5ff9da99", + "0x8785b3a82d1e3c067cee8ff830df56c78f13526d", + "0x95fac8a1ad70c71abb31240c256aca0892bf55c3", + ], + "short_freezers": [ + "0x27f67409b292fef1a6735c007e7f46e1ea374521", + "0x03d03a026e71979be3b08d44b01eae4c5ff9da99", + "0x8785b3a82d1e3c067cee8ff830df56c78f13526d", + "0x95fac8a1ad70c71abb31240c256aca0892bf55c3", + ], + "long_freezers": [ + "0x27f67409b292fef1a6735c007e7f46e1ea374521", + ], + }, + { + "name": "VAYA", + "filename": "deprecate-VAYA.json", + "chain_id": 8453, + "governor": "0xeb583ea06501f92e994c353ad2741a35582987aa", + "timelock": "0xee3ec997a37e661a42673d7a489fbf0e5ed0c223", + "main": "0x6c678DE5334B86EAeEe6d9c8a2d59FfB9E4167F2", + "rtoken": "0xC9a3e2B3064c1c0546D3D0edc0A748E9f93Cf18d", + "broker": "0xe75111b9D5C1344D0edF5355bda384Dc36eB3F7e", + "distributor": "0x93aA969C89a102184938A05A8e16572A4DeB5873", + "pausers": [ + "0xce8c45b19bd2add516670698b9004b53dc39b71e", + ], + "short_freezers": [ + "0xce8c45b19bd2add516670698b9004b53dc39b71e", + ], + "long_freezers": [ + "0xce8c45b19bd2add516670698b9004b53dc39b71e", + ], + }, + { + "name": "rgUSD (2)", + "filename": "deprecate-rgUSD.json", + "chain_id": 1, + "governor": "0x409bac94c4207c6627ea5f4e4ffb7128e8f654fc", + "timelock": "0x9ad9e73e38c8506a664a3a37e8a9ce910b6fbeb4", + "main": "0xB436459251b144e6CfEDa33f8b814fFF450053B2", + "rtoken": "0x78da5799CF427Fee11e9996982F4150eCe7a99A7", + "broker": "0x1BED0098050CA52b8e2b855610DE64308f3CE336", + "distributor": "0x6f3803eE819579F385cAEa44978E2B6D15D823C4", + "pausers": [ + "0xbb73485ac579f5014a257aef535944f80cd3fa32", + "0x8785b3a82d1e3c067cee8ff830df56c78f13526d", + "0xe45c3179b135288dd8e1e3c20eafebb2b2e7d771", + "0x707778ae959e52acac25aaf28114ee04a5c0bf55", + ], + "short_freezers": [ + "0xbb73485ac579f5014a257aef535944f80cd3fa32", + "0x8785b3a82d1e3c067cee8ff830df56c78f13526d", + "0xe45c3179b135288dd8e1e3c20eafebb2b2e7d771", + "0x707778ae959e52acac25aaf28114ee04a5c0bf55", + ], + "long_freezers": [ + "0xbb73485ac579f5014a257aef535944f80cd3fa32", + ], + }, +] + + +if __name__ == "__main__": + os.makedirs("proposals", exist_ok=True) + + for rt in rtokens: + if rt["governor"].startswith("FILL_IN"): + print(f"SKIPPED {rt['filename']} — governor address missing for {rt['name']}") + continue + + proposal = generate_proposal( + name=rt["name"], + chain_id=rt["chain_id"], + governor=rt["governor"], + timelock=rt["timelock"], + main=rt["main"], + rtoken=rt["rtoken"], + broker=rt["broker"], + distributor=rt["distributor"], + pausers=rt["pausers"], + short_freezers=rt["short_freezers"], + long_freezers=rt["long_freezers"], + ) + + filepath = f"proposals/{rt['filename']}" + with open(filepath, "w") as f: + json.dump(proposal, f, indent=2) + + print(f"Generated {filepath} (chain {rt['chain_id']})") diff --git a/scripts/deprecation/proposals/deprecate-BSDX.json b/scripts/deprecation/proposals/deprecate-BSDX.json new file mode 100644 index 000000000..53bcc17c3 --- /dev/null +++ b/scripts/deprecation/proposals/deprecate-BSDX.json @@ -0,0 +1,20 @@ +{ + "version": "1.0", + "chainId": "8453", + "createdAt": 1775566082, + "meta": { + "name": "Deprecate BSDX", + "description": "Governance proposal to deprecate BSDX", + "txBuilderVersion": "1.16.5", + "createdFromSafeAddress": "", + "createdFromOwnerAddress": "", + "checksum": "" + }, + "transactions": [ + { + "to": "0xe8699d59ddcec4c0eddba32dec148e593324b446", + "value": "0", + "data": "0x7d5e81e2000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000002e00000000000000000000000000000000000000000000000000000000000000540000000000000000000000000000000000000000000000000000000000000104000000000000000000000000000000000000000000000000000000000000000120000000000000000000000007b587720921fefdee00ac01c2590f060e932bce90000000000000000000000008f0987ddb485219c767770e2080e5cc01ddc772a0000000000000000000000009129e75ac2ff30c1ff6864adf9c63c5767e4f0440000000000000000000000009129e75ac2ff30c1ff6864adf9c63c5767e4f0440000000000000000000000009129e75ac2ff30c1ff6864adf9c63c5767e4f044000000000000000000000000986377a8561b336e1c58fb370b3df302ebbf21bc000000000000000000000000986377a8561b336e1c58fb370b3df302ebbf21bc0000000000000000000000009129e75ac2ff30c1ff6864adf9c63c5767e4f0440000000000000000000000009129e75ac2ff30c1ff6864adf9c63c5767e4f0440000000000000000000000009129e75ac2ff30c1ff6864adf9c63c5767e4f0440000000000000000000000009129e75ac2ff30c1ff6864adf9c63c5767e4f0440000000000000000000000009129e75ac2ff30c1ff6864adf9c63c5767e4f0440000000000000000000000009129e75ac2ff30c1ff6864adf9c63c5767e4f0440000000000000000000000009129e75ac2ff30c1ff6864adf9c63c5767e4f0440000000000000000000000009129e75ac2ff30c1ff6864adf9c63c5767e4f0440000000000000000000000009129e75ac2ff30c1ff6864adf9c63c5767e4f0440000000000000000000000009129e75ac2ff30c1ff6864adf9c63c5767e4f0440000000000000000000000009129e75ac2ff30c1ff6864adf9c63c5767e4f04400000000000000000000000000000000000000000000000000000000000000120000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000012000000000000000000000000000000000000000000000000000000000000024000000000000000000000000000000000000000000000000000000000000002a0000000000000000000000000000000000000000000000000000000000000032000000000000000000000000000000000000000000000000000000000000003a000000000000000000000000000000000000000000000000000000000000003e0000000000000000000000000000000000000000000000000000000000000042000000000000000000000000000000000000000000000000000000000000004c0000000000000000000000000000000000000000000000000000000000000056000000000000000000000000000000000000000000000000000000000000005e0000000000000000000000000000000000000000000000000000000000000066000000000000000000000000000000000000000000000000000000000000006e0000000000000000000000000000000000000000000000000000000000000076000000000000000000000000000000000000000000000000000000000000007e0000000000000000000000000000000000000000000000000000000000000086000000000000000000000000000000000000000000000000000000000000008e0000000000000000000000000000000000000000000000000000000000000096000000000000000000000000000000000000000000000000000000000000009e00000000000000000000000000000000000000000000000000000000000000a6000000000000000000000000000000000000000000000000000000000000000248881615a00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000445beafb3d0000000000000000000000000000000000000000000000000de0b6b3a764000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000442f2ff15d5041555345520000000000000000000000000000000000000000000000000000000000000000000000000000fbb633436f9998ef030c3dd1f636cc92a669da8f000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004456068d2000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004df23cbb10000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000648859443700000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006488594437000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002710000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000044d547741f504155534552000000000000000000000000000000000000000000000000000000000000000000000000000003d03a026e71979be3b08d44b01eae4c5ff9da99000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000044d547741f504155534552000000000000000000000000000000000000000000000000000000000000000000000000000027f67409b292fef1a6735c007e7f46e1ea374521000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000044d547741f50415553455200000000000000000000000000000000000000000000000000000000000000000000000000008785b3a82d1e3c067cee8ff830df56c78f13526d000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000044d547741f504155534552000000000000000000000000000000000000000000000000000000000000000000000000000095fac8a1ad70c71abb31240c256aca0892bf55c3000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000044d547741f5041555345520000000000000000000000000000000000000000000000000000000000000000000000000000fbb633436f9998ef030c3dd1f636cc92a669da8f000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000044d547741f53484f52545f465245455a45520000000000000000000000000000000000000000000000000000000000000003d03a026e71979be3b08d44b01eae4c5ff9da99000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000044d547741f53484f52545f465245455a45520000000000000000000000000000000000000000000000000000000000000027f67409b292fef1a6735c007e7f46e1ea374521000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000044d547741f53484f52545f465245455a4552000000000000000000000000000000000000000000000000000000000000008785b3a82d1e3c067cee8ff830df56c78f13526d000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000044d547741f53484f52545f465245455a45520000000000000000000000000000000000000000000000000000000000000095fac8a1ad70c71abb31240c256aca0892bf55c3000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000044d547741f4c4f4e475f465245455a4552000000000000000000000000000000000000000000000000000000000000000027f67409b292fef1a6735c007e7f46e1ea374521000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000044d547741f4f574e4552000000000000000000000000000000000000000000000000000000000000000000000000000000fbb633436f9998ef030c3dd1f636cc92a669da8f00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000016e44657072656361746520425344585c6e5c6e416374696f6e733a5c6e312e205365742062617463682061756374696f6e206c656e67746820746f20305c6e322e205365742069737375616e6365207468726f74746c6520746f203165313820286d696e696d756d295c6e332e20556e70617573652074726164696e6720287361666574793a20656e7375726573207374616b6572732063616e20756e7374616b65206166746572206465707265636174696f6e295c6e342e205061757365206d696e74696e675c6e352e2053657420646973747269627574696f6e20746f2030252052546f6b656e2c2031303025205253525c6e362e2052656d6f766520616c6c2050415553455220726f6c65735c6e372e2052656d6f766520616c6c2053484f52545f465245455a455220726f6c65735c6e382e2052656d6f766520616c6c204c4f4e475f465245455a455220726f6c65735c6e392e2052656d6f766520616c6c204f574e455220726f6c6573000000000000000000000000000000000000" + } + ] +} diff --git a/scripts/deprecation/proposals/deprecate-KNOX.json b/scripts/deprecation/proposals/deprecate-KNOX.json new file mode 100644 index 000000000..b161d8e3f --- /dev/null +++ b/scripts/deprecation/proposals/deprecate-KNOX.json @@ -0,0 +1,20 @@ +{ + "version": "1.0", + "chainId": "42161", + "createdAt": 1775566082, + "meta": { + "name": "Deprecate KNOX", + "description": "Governance proposal to deprecate KNOX", + "txBuilderVersion": "1.16.5", + "createdFromSafeAddress": "", + "createdFromOwnerAddress": "", + "checksum": "" + }, + "transactions": [ + { + "to": "0x17a5fA0C4c682b86Cfb76FAd2A03B2328D4680fF", + "value": "0", + "data": "0x7d5e81e20000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000026000000000000000000000000000000000000000000000000000000000000004400000000000000000000000000000000000000000000000000000000000000cc0000000000000000000000000000000000000000000000000000000000000000e0000000000000000000000008b96d8b68e33eb62558c5ff3b395f0ad24d3b5ff0000000000000000000000000bbf664d46becc28593368c97236faa0fb397595000000000000000000000000b0f377e58f4fa4bc42067868a699666bd7dac565000000000000000000000000b0f377e58f4fa4bc42067868a699666bd7dac565000000000000000000000000b0f377e58f4fa4bc42067868a699666bd7dac565000000000000000000000000b8b83d56ab18e9bd5b554c2709b50de290678785000000000000000000000000b8b83d56ab18e9bd5b554c2709b50de290678785000000000000000000000000b0f377e58f4fa4bc42067868a699666bd7dac565000000000000000000000000b0f377e58f4fa4bc42067868a699666bd7dac565000000000000000000000000b0f377e58f4fa4bc42067868a699666bd7dac565000000000000000000000000b0f377e58f4fa4bc42067868a699666bd7dac565000000000000000000000000b0f377e58f4fa4bc42067868a699666bd7dac565000000000000000000000000b0f377e58f4fa4bc42067868a699666bd7dac565000000000000000000000000b0f377e58f4fa4bc42067868a699666bd7dac565000000000000000000000000000000000000000000000000000000000000000e00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e00000000000000000000000000000000000000000000000000000000000001c0000000000000000000000000000000000000000000000000000000000000022000000000000000000000000000000000000000000000000000000000000002a00000000000000000000000000000000000000000000000000000000000000320000000000000000000000000000000000000000000000000000000000000036000000000000000000000000000000000000000000000000000000000000003a0000000000000000000000000000000000000000000000000000000000000044000000000000000000000000000000000000000000000000000000000000004e0000000000000000000000000000000000000000000000000000000000000056000000000000000000000000000000000000000000000000000000000000005e0000000000000000000000000000000000000000000000000000000000000066000000000000000000000000000000000000000000000000000000000000006e0000000000000000000000000000000000000000000000000000000000000076000000000000000000000000000000000000000000000000000000000000007e000000000000000000000000000000000000000000000000000000000000000248881615a00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000445beafb3d0000000000000000000000000000000000000000000000000de0b6b3a764000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000442f2ff15d5041555345520000000000000000000000000000000000000000000000000000000000000000000000000000ccb548e8f74eb2f613f53dd2c389842dd4a13e22000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004456068d2000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004df23cbb10000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000648859443700000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006488594437000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002710000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000044d547741f50415553455200000000000000000000000000000000000000000000000000000000000000000000000000002e84581ef04700aa351b1184f2aa0bc1617fa989000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000044d547741f50415553455200000000000000000000000000000000000000000000000000000000000000000000000000007a58ef5205a7b5eb22259d0dc7917b24e72726ad000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000044d547741f5041555345520000000000000000000000000000000000000000000000000000000000000000000000000000ccb548e8f74eb2f613f53dd2c389842dd4a13e22000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000044d547741f53484f52545f465245455a45520000000000000000000000000000000000000000000000000000000000000075c832d2e3ad4c82af61293e12c71add7bc2831c000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000044d547741f53484f52545f465245455a4552000000000000000000000000000000000000000000000000000000000000007a58ef5205a7b5eb22259d0dc7917b24e72726ad000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000044d547741f4c4f4e475f465245455a455200000000000000000000000000000000000000000000000000000000000000007a58ef5205a7b5eb22259d0dc7917b24e72726ad000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000044d547741f4f574e4552000000000000000000000000000000000000000000000000000000000000000000000000000000ccb548e8f74eb2f613f53dd2c389842dd4a13e2200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000016e446570726563617465204b4e4f585c6e5c6e416374696f6e733a5c6e312e205365742062617463682061756374696f6e206c656e67746820746f20305c6e322e205365742069737375616e6365207468726f74746c6520746f203165313820286d696e696d756d295c6e332e20556e70617573652074726164696e6720287361666574793a20656e7375726573207374616b6572732063616e20756e7374616b65206166746572206465707265636174696f6e295c6e342e205061757365206d696e74696e675c6e352e2053657420646973747269627574696f6e20746f2030252052546f6b656e2c2031303025205253525c6e362e2052656d6f766520616c6c2050415553455220726f6c65735c6e372e2052656d6f766520616c6c2053484f52545f465245455a455220726f6c65735c6e382e2052656d6f766520616c6c204c4f4e475f465245455a455220726f6c65735c6e392e2052656d6f766520616c6c204f574e455220726f6c6573000000000000000000000000000000000000" + } + ] +} diff --git a/scripts/deprecation/proposals/deprecate-MAAT.json b/scripts/deprecation/proposals/deprecate-MAAT.json new file mode 100644 index 000000000..5d231616f --- /dev/null +++ b/scripts/deprecation/proposals/deprecate-MAAT.json @@ -0,0 +1,20 @@ +{ + "version": "1.0", + "chainId": "8453", + "createdAt": 1775566082, + "meta": { + "name": "Deprecate MAAT", + "description": "Governance proposal to deprecate MAAT", + "txBuilderVersion": "1.16.5", + "createdFromSafeAddress": "", + "createdFromOwnerAddress": "", + "checksum": "" + }, + "transactions": [ + { + "to": "0x0f7f1442da7f687bb877fbee0539fa8d6e4d1a02", + "value": "0", + "data": "0x7d5e81e2000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000001c00000000000000000000000000000000000000000000000000000000000000300000000000000000000000000000000000000000000000000000000000000086000000000000000000000000000000000000000000000000000000000000000090000000000000000000000006baffc6282fdc15fe6af9e2698e4b6d664cbc65c000000000000000000000000641b0453487c9d14c5df96d45a481ef1dc84e31f000000000000000000000000df699488ca4340f71d24cff1424146c836407d4e000000000000000000000000df699488ca4340f71d24cff1424146c836407d4e000000000000000000000000df699488ca4340f71d24cff1424146c836407d4e0000000000000000000000000ff73c65202fa6d884065ae208a12a5d26b579c90000000000000000000000000ff73c65202fa6d884065ae208a12a5d26b579c9000000000000000000000000df699488ca4340f71d24cff1424146c836407d4e000000000000000000000000df699488ca4340f71d24cff1424146c836407d4e00000000000000000000000000000000000000000000000000000000000000090000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009000000000000000000000000000000000000000000000000000000000000012000000000000000000000000000000000000000000000000000000000000001800000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000028000000000000000000000000000000000000000000000000000000000000002c0000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000000000003a0000000000000000000000000000000000000000000000000000000000000044000000000000000000000000000000000000000000000000000000000000004c000000000000000000000000000000000000000000000000000000000000000248881615a00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000445beafb3d0000000000000000000000000000000000000000000000000de0b6b3a764000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000442f2ff15d5041555345520000000000000000000000000000000000000000000000000000000000000000000000000000e67ceb03efdf9b3fb5c3febf3103e2efd3a76a1b000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004456068d2000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004df23cbb10000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000648859443700000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006488594437000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002710000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000044d547741f5041555345520000000000000000000000000000000000000000000000000000000000000000000000000000e67ceb03efdf9b3fb5c3febf3103e2efd3a76a1b000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000044d547741f4f574e4552000000000000000000000000000000000000000000000000000000000000000000000000000000e67ceb03efdf9b3fb5c3febf3103e2efd3a76a1b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000016e446570726563617465204d4141545c6e5c6e416374696f6e733a5c6e312e205365742062617463682061756374696f6e206c656e67746820746f20305c6e322e205365742069737375616e6365207468726f74746c6520746f203165313820286d696e696d756d295c6e332e20556e70617573652074726164696e6720287361666574793a20656e7375726573207374616b6572732063616e20756e7374616b65206166746572206465707265636174696f6e295c6e342e205061757365206d696e74696e675c6e352e2053657420646973747269627574696f6e20746f2030252052546f6b656e2c2031303025205253525c6e362e2052656d6f766520616c6c2050415553455220726f6c65735c6e372e2052656d6f766520616c6c2053484f52545f465245455a455220726f6c65735c6e382e2052656d6f766520616c6c204c4f4e475f465245455a455220726f6c65735c6e392e2052656d6f766520616c6c204f574e455220726f6c6573000000000000000000000000000000000000" + } + ] +} diff --git a/scripts/deprecation/proposals/deprecate-USDCplus.json b/scripts/deprecation/proposals/deprecate-USDCplus.json new file mode 100644 index 000000000..4255914a0 --- /dev/null +++ b/scripts/deprecation/proposals/deprecate-USDCplus.json @@ -0,0 +1,20 @@ +{ + "version": "1.0", + "chainId": "1", + "createdAt": 1775566082, + "meta": { + "name": "Deprecate USDC+", + "description": "Governance proposal to deprecate USDC+", + "txBuilderVersion": "1.16.5", + "createdFromSafeAddress": "", + "createdFromOwnerAddress": "", + "checksum": "" + }, + "transactions": [ + { + "to": "0xc837c557071d604bcb1058c8c4891ddbe8fdd630", + "value": "0", + "data": "0x7d5e81e2000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000002e00000000000000000000000000000000000000000000000000000000000000540000000000000000000000000000000000000000000000000000000000000104000000000000000000000000000000000000000000000000000000000000000120000000000000000000000007afc1d0bdfe2f3887466534516447ba4ce97b305000000000000000000000000fc0b1eef20e4c68b3dcf36c4537cfa7ce46ca70b000000000000000000000000ec11cf537497141ac820615f4f399be4a1638af6000000000000000000000000ec11cf537497141ac820615f4f399be4a1638af6000000000000000000000000ec11cf537497141ac820615f4f399be4a1638af6000000000000000000000000348f00534b0aa8b575d24356e7c3e1a5e6403fa1000000000000000000000000348f00534b0aa8b575d24356e7c3e1a5e6403fa1000000000000000000000000ec11cf537497141ac820615f4f399be4a1638af6000000000000000000000000ec11cf537497141ac820615f4f399be4a1638af6000000000000000000000000ec11cf537497141ac820615f4f399be4a1638af6000000000000000000000000ec11cf537497141ac820615f4f399be4a1638af6000000000000000000000000ec11cf537497141ac820615f4f399be4a1638af6000000000000000000000000ec11cf537497141ac820615f4f399be4a1638af6000000000000000000000000ec11cf537497141ac820615f4f399be4a1638af6000000000000000000000000ec11cf537497141ac820615f4f399be4a1638af6000000000000000000000000ec11cf537497141ac820615f4f399be4a1638af6000000000000000000000000ec11cf537497141ac820615f4f399be4a1638af6000000000000000000000000ec11cf537497141ac820615f4f399be4a1638af600000000000000000000000000000000000000000000000000000000000000120000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000012000000000000000000000000000000000000000000000000000000000000024000000000000000000000000000000000000000000000000000000000000002a0000000000000000000000000000000000000000000000000000000000000032000000000000000000000000000000000000000000000000000000000000003a000000000000000000000000000000000000000000000000000000000000003e0000000000000000000000000000000000000000000000000000000000000042000000000000000000000000000000000000000000000000000000000000004c0000000000000000000000000000000000000000000000000000000000000056000000000000000000000000000000000000000000000000000000000000005e0000000000000000000000000000000000000000000000000000000000000066000000000000000000000000000000000000000000000000000000000000006e0000000000000000000000000000000000000000000000000000000000000076000000000000000000000000000000000000000000000000000000000000007e0000000000000000000000000000000000000000000000000000000000000086000000000000000000000000000000000000000000000000000000000000008e0000000000000000000000000000000000000000000000000000000000000096000000000000000000000000000000000000000000000000000000000000009e00000000000000000000000000000000000000000000000000000000000000a6000000000000000000000000000000000000000000000000000000000000000248881615a00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000445beafb3d0000000000000000000000000000000000000000000000000de0b6b3a764000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000442f2ff15d50415553455200000000000000000000000000000000000000000000000000000000000000000000000000006c957417cb6df6e821eec8555dee8b116c291999000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004456068d2000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004df23cbb10000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000648859443700000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006488594437000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002710000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000044d547741f504155534552000000000000000000000000000000000000000000000000000000000000000000000000000052ea58f4fc3ced48fa18e909226c1f8a0ef887dc000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000044d547741f50415553455200000000000000000000000000000000000000000000000000000000000000000000000000006c957417cb6df6e821eec8555dee8b116c291999000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000044d547741f50415553455200000000000000000000000000000000000000000000000000000000000000000000000000008785b3a82d1e3c067cee8ff830df56c78f13526d000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000044d547741f5041555345520000000000000000000000000000000000000000000000000000000000000000000000000000fdefe2e8ae439547a4ca4b2656715e5bbceb295b000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000044d547741f53484f52545f465245455a45520000000000000000000000000000000000000000000000000000000000000052ea58f4fc3ced48fa18e909226c1f8a0ef887dc000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000044d547741f53484f52545f465245455a4552000000000000000000000000000000000000000000000000000000000000008785b3a82d1e3c067cee8ff830df56c78f13526d000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000044d547741f53484f52545f465245455a455200000000000000000000000000000000000000000000000000000000000000fdefe2e8ae439547a4ca4b2656715e5bbceb295b000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000044d547741f4c4f4e475f465245455a4552000000000000000000000000000000000000000000000000000000000000000052ea58f4fc3ced48fa18e909226c1f8a0ef887dc000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000044d547741f4c4f4e475f465245455a455200000000000000000000000000000000000000000000000000000000000000008785b3a82d1e3c067cee8ff830df56c78f13526d000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000044d547741f4c4f4e475f465245455a45520000000000000000000000000000000000000000000000000000000000000000fdefe2e8ae439547a4ca4b2656715e5bbceb295b000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000044d547741f4f574e45520000000000000000000000000000000000000000000000000000000000000000000000000000006c957417cb6df6e821eec8555dee8b116c29199900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000016f44657072656361746520555344432b5c6e5c6e416374696f6e733a5c6e312e205365742062617463682061756374696f6e206c656e67746820746f20305c6e322e205365742069737375616e6365207468726f74746c6520746f203165313820286d696e696d756d295c6e332e20556e70617573652074726164696e6720287361666574793a20656e7375726573207374616b6572732063616e20756e7374616b65206166746572206465707265636174696f6e295c6e342e205061757365206d696e74696e675c6e352e2053657420646973747269627574696f6e20746f2030252052546f6b656e2c2031303025205253525c6e362e2052656d6f766520616c6c2050415553455220726f6c65735c6e372e2052656d6f766520616c6c2053484f52545f465245455a455220726f6c65735c6e382e2052656d6f766520616c6c204c4f4e475f465245455a455220726f6c65735c6e392e2052656d6f766520616c6c204f574e455220726f6c65730000000000000000000000000000000000" + } + ] +} diff --git a/scripts/deprecation/proposals/deprecate-VAYA.json b/scripts/deprecation/proposals/deprecate-VAYA.json new file mode 100644 index 000000000..c129f8c6e --- /dev/null +++ b/scripts/deprecation/proposals/deprecate-VAYA.json @@ -0,0 +1,20 @@ +{ + "version": "1.0", + "chainId": "8453", + "createdAt": 1775566082, + "meta": { + "name": "Deprecate VAYA", + "description": "Governance proposal to deprecate VAYA", + "txBuilderVersion": "1.16.5", + "createdFromSafeAddress": "", + "createdFromOwnerAddress": "", + "checksum": "" + }, + "transactions": [ + { + "to": "0xeb583ea06501f92e994c353ad2741a35582987aa", + "value": "0", + "data": "0x7d5e81e20000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000022000000000000000000000000000000000000000000000000000000000000003c00000000000000000000000000000000000000000000000000000000000000b00000000000000000000000000000000000000000000000000000000000000000c000000000000000000000000e75111b9d5c1344d0edf5355bda384dc36eb3f7e000000000000000000000000c9a3e2b3064c1c0546d3d0edc0a748e9f93cf18d0000000000000000000000006c678de5334b86eaeee6d9c8a2d59ffb9e4167f20000000000000000000000006c678de5334b86eaeee6d9c8a2d59ffb9e4167f20000000000000000000000006c678de5334b86eaeee6d9c8a2d59ffb9e4167f200000000000000000000000093aa969c89a102184938a05a8e16572a4deb587300000000000000000000000093aa969c89a102184938a05a8e16572a4deb58730000000000000000000000006c678de5334b86eaeee6d9c8a2d59ffb9e4167f20000000000000000000000006c678de5334b86eaeee6d9c8a2d59ffb9e4167f20000000000000000000000006c678de5334b86eaeee6d9c8a2d59ffb9e4167f20000000000000000000000006c678de5334b86eaeee6d9c8a2d59ffb9e4167f20000000000000000000000006c678de5334b86eaeee6d9c8a2d59ffb9e4167f2000000000000000000000000000000000000000000000000000000000000000c000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c000000000000000000000000000000000000000000000000000000000000018000000000000000000000000000000000000000000000000000000000000001e0000000000000000000000000000000000000000000000000000000000000026000000000000000000000000000000000000000000000000000000000000002e000000000000000000000000000000000000000000000000000000000000003200000000000000000000000000000000000000000000000000000000000000360000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000004a0000000000000000000000000000000000000000000000000000000000000052000000000000000000000000000000000000000000000000000000000000005a0000000000000000000000000000000000000000000000000000000000000062000000000000000000000000000000000000000000000000000000000000006a000000000000000000000000000000000000000000000000000000000000000248881615a00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000445beafb3d0000000000000000000000000000000000000000000000000de0b6b3a764000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000442f2ff15d5041555345520000000000000000000000000000000000000000000000000000000000000000000000000000ee3ec997a37e661a42673d7a489fbf0e5ed0c223000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004456068d2000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004df23cbb10000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000648859443700000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006488594437000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002710000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000044d547741f5041555345520000000000000000000000000000000000000000000000000000000000000000000000000000ce8c45b19bd2add516670698b9004b53dc39b71e000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000044d547741f5041555345520000000000000000000000000000000000000000000000000000000000000000000000000000ee3ec997a37e661a42673d7a489fbf0e5ed0c223000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000044d547741f53484f52545f465245455a455200000000000000000000000000000000000000000000000000000000000000ce8c45b19bd2add516670698b9004b53dc39b71e000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000044d547741f4c4f4e475f465245455a45520000000000000000000000000000000000000000000000000000000000000000ce8c45b19bd2add516670698b9004b53dc39b71e000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000044d547741f4f574e4552000000000000000000000000000000000000000000000000000000000000000000000000000000ee3ec997a37e661a42673d7a489fbf0e5ed0c22300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000016e44657072656361746520564159415c6e5c6e416374696f6e733a5c6e312e205365742062617463682061756374696f6e206c656e67746820746f20305c6e322e205365742069737375616e6365207468726f74746c6520746f203165313820286d696e696d756d295c6e332e20556e70617573652074726164696e6720287361666574793a20656e7375726573207374616b6572732063616e20756e7374616b65206166746572206465707265636174696f6e295c6e342e205061757365206d696e74696e675c6e352e2053657420646973747269627574696f6e20746f2030252052546f6b656e2c2031303025205253525c6e362e2052656d6f766520616c6c2050415553455220726f6c65735c6e372e2052656d6f766520616c6c2053484f52545f465245455a455220726f6c65735c6e382e2052656d6f766520616c6c204c4f4e475f465245455a455220726f6c65735c6e392e2052656d6f766520616c6c204f574e455220726f6c6573000000000000000000000000000000000000" + } + ] +} diff --git a/scripts/deprecation/proposals/deprecate-dgnETH.json b/scripts/deprecation/proposals/deprecate-dgnETH.json new file mode 100644 index 000000000..fdcd9f027 --- /dev/null +++ b/scripts/deprecation/proposals/deprecate-dgnETH.json @@ -0,0 +1,20 @@ +{ + "version": "1.0", + "chainId": "1", + "createdAt": 1775566082, + "meta": { + "name": "Deprecate dgnETH", + "description": "Governance proposal to deprecate dgnETH", + "txBuilderVersion": "1.16.5", + "createdFromSafeAddress": "", + "createdFromOwnerAddress": "", + "checksum": "" + }, + "transactions": [ + { + "to": "0xb7cb3880564a1f8698018ecdc78972f93b2615e6", + "value": "0", + "data": "0x7d5e81e2000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000002c000000000000000000000000000000000000000000000000000000000000005000000000000000000000000000000000000000000000000000000000000000f6000000000000000000000000000000000000000000000000000000000000000110000000000000000000000009bade46ac6b0c6e3460513ec71e5b2636d8ddac0000000000000000000000000005f893ecd7bf9667195642f7649da8163e236580000000000000000000000000a82c906e283fe813fa591d104e0bfe75609cd350000000000000000000000000a82c906e283fe813fa591d104e0bfe75609cd350000000000000000000000000a82c906e283fe813fa591d104e0bfe75609cd3500000000000000000000000000365b8b3b2a3294554cfb70d288a8ac19d9e08700000000000000000000000000365b8b3b2a3294554cfb70d288a8ac19d9e0870000000000000000000000000a82c906e283fe813fa591d104e0bfe75609cd350000000000000000000000000a82c906e283fe813fa591d104e0bfe75609cd350000000000000000000000000a82c906e283fe813fa591d104e0bfe75609cd350000000000000000000000000a82c906e283fe813fa591d104e0bfe75609cd350000000000000000000000000a82c906e283fe813fa591d104e0bfe75609cd350000000000000000000000000a82c906e283fe813fa591d104e0bfe75609cd350000000000000000000000000a82c906e283fe813fa591d104e0bfe75609cd350000000000000000000000000a82c906e283fe813fa591d104e0bfe75609cd350000000000000000000000000a82c906e283fe813fa591d104e0bfe75609cd350000000000000000000000000a82c906e283fe813fa591d104e0bfe75609cd350000000000000000000000000000000000000000000000000000000000000011000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000011000000000000000000000000000000000000000000000000000000000000022000000000000000000000000000000000000000000000000000000000000002800000000000000000000000000000000000000000000000000000000000000300000000000000000000000000000000000000000000000000000000000000038000000000000000000000000000000000000000000000000000000000000003c0000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000004a0000000000000000000000000000000000000000000000000000000000000054000000000000000000000000000000000000000000000000000000000000005c0000000000000000000000000000000000000000000000000000000000000064000000000000000000000000000000000000000000000000000000000000006c0000000000000000000000000000000000000000000000000000000000000074000000000000000000000000000000000000000000000000000000000000007c0000000000000000000000000000000000000000000000000000000000000084000000000000000000000000000000000000000000000000000000000000008c0000000000000000000000000000000000000000000000000000000000000094000000000000000000000000000000000000000000000000000000000000009c000000000000000000000000000000000000000000000000000000000000000248881615a00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000445beafb3d0000000000000000000000000000000000000000000000000de0b6b3a764000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000442f2ff15d504155534552000000000000000000000000000000000000000000000000000000000000000000000000000005623fcee6fb48b7c8058022c48a72dbce09878e000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004456068d2000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004df23cbb10000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000648859443700000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006488594437000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002710000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000044d547741f504155534552000000000000000000000000000000000000000000000000000000000000000000000000000005623fcee6fb48b7c8058022c48a72dbce09878e000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000044d547741f50415553455200000000000000000000000000000000000000000000000000000000000000000000000000009ca72f031f789f51bd35cc34583c7b7a7d0871a3000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000044d547741f5041555345520000000000000000000000000000000000000000000000000000000000000000000000000000d5fe2780eb882d1da78f2136b81c2a4395488c98000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000044d547741f53484f52545f465245455a45520000000000000000000000000000000000000000000000000000000000000003d03a026e71979be3b08d44b01eae4c5ff9da99000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000044d547741f53484f52545f465245455a4552000000000000000000000000000000000000000000000000000000000000008785b3a82d1e3c067cee8ff830df56c78f13526d000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000044d547741f53484f52545f465245455a4552000000000000000000000000000000000000000000000000000000000000009ca72f031f789f51bd35cc34583c7b7a7d0871a3000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000044d547741f53484f52545f465245455a455200000000000000000000000000000000000000000000000000000000000000d5fe2780eb882d1da78f2136b81c2a4395488c98000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000044d547741f53484f52545f465245455a455200000000000000000000000000000000000000000000000000000000000000d733d4cc5b42206a62ed7b1ceec5b4d61898f429000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000044d547741f4c4f4e475f465245455a45520000000000000000000000000000000000000000000000000000000000000000d5fe2780eb882d1da78f2136b81c2a4395488c98000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000044d547741f4f574e455200000000000000000000000000000000000000000000000000000000000000000000000000000005623fcee6fb48b7c8058022c48a72dbce09878e0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001704465707265636174652064676e4554485c6e5c6e416374696f6e733a5c6e312e205365742062617463682061756374696f6e206c656e67746820746f20305c6e322e205365742069737375616e6365207468726f74746c6520746f203165313820286d696e696d756d295c6e332e20556e70617573652074726164696e6720287361666574793a20656e7375726573207374616b6572732063616e20756e7374616b65206166746572206465707265636174696f6e295c6e342e205061757365206d696e74696e675c6e352e2053657420646973747269627574696f6e20746f2030252052546f6b656e2c2031303025205253525c6e362e2052656d6f766520616c6c2050415553455220726f6c65735c6e372e2052656d6f766520616c6c2053484f52545f465245455a455220726f6c65735c6e382e2052656d6f766520616c6c204c4f4e475f465245455a455220726f6c65735c6e392e2052656d6f766520616c6c204f574e455220726f6c657300000000000000000000000000000000" + } + ] +} diff --git a/scripts/deprecation/proposals/deprecate-hyUSD-base.json b/scripts/deprecation/proposals/deprecate-hyUSD-base.json new file mode 100644 index 000000000..d115eb2d7 --- /dev/null +++ b/scripts/deprecation/proposals/deprecate-hyUSD-base.json @@ -0,0 +1,20 @@ +{ + "version": "1.0", + "chainId": "8453", + "createdAt": 1775566082, + "meta": { + "name": "Deprecate hyUSD (base)", + "description": "Governance proposal to deprecate hyUSD (base)", + "txBuilderVersion": "1.16.5", + "createdFromSafeAddress": "", + "createdFromOwnerAddress": "", + "checksum": "" + }, + "transactions": [ + { + "to": "0xffef97179f58a582def73e6d2e4bcd2bdc8ca128", + "value": "0", + "data": "0x7d5e81e20000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000022000000000000000000000000000000000000000000000000000000000000003c00000000000000000000000000000000000000000000000000000000000000b00000000000000000000000000000000000000000000000000000000000000000c0000000000000000000000000e05139662e0c8752a100db08da0c7e435b8ac94000000000000000000000000cc7ff230365bd730ee4b352cc2492cedac49383e000000000000000000000000a582985c68ed30a052ff0b07d74931140bd5a00f000000000000000000000000a582985c68ed30a052ff0b07d74931140bd5a00f000000000000000000000000a582985c68ed30a052ff0b07d74931140bd5a00f000000000000000000000000f0a83bc73e9baeb69b2fbb1e48bcdabf9c1012ca000000000000000000000000f0a83bc73e9baeb69b2fbb1e48bcdabf9c1012ca000000000000000000000000a582985c68ed30a052ff0b07d74931140bd5a00f000000000000000000000000a582985c68ed30a052ff0b07d74931140bd5a00f000000000000000000000000a582985c68ed30a052ff0b07d74931140bd5a00f000000000000000000000000a582985c68ed30a052ff0b07d74931140bd5a00f000000000000000000000000a582985c68ed30a052ff0b07d74931140bd5a00f000000000000000000000000000000000000000000000000000000000000000c000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c000000000000000000000000000000000000000000000000000000000000018000000000000000000000000000000000000000000000000000000000000001e0000000000000000000000000000000000000000000000000000000000000026000000000000000000000000000000000000000000000000000000000000002e000000000000000000000000000000000000000000000000000000000000003200000000000000000000000000000000000000000000000000000000000000360000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000004a0000000000000000000000000000000000000000000000000000000000000052000000000000000000000000000000000000000000000000000000000000005a0000000000000000000000000000000000000000000000000000000000000062000000000000000000000000000000000000000000000000000000000000006a000000000000000000000000000000000000000000000000000000000000000248881615a00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000445beafb3d0000000000000000000000000000000000000000000000000de0b6b3a764000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000442f2ff15d50415553455200000000000000000000000000000000000000000000000000000000000000000000000000004284d76a03f9b398ff7aec58c9dec94b289070cf000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004456068d2000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004df23cbb10000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000648859443700000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006488594437000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002710000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000044d547741f50415553455200000000000000000000000000000000000000000000000000000000000000000000000000004284d76a03f9b398ff7aec58c9dec94b289070cf000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000044d547741f5041555345520000000000000000000000000000000000000000000000000000000000000000000000000000c3954aa47e469add8b5ad8c243e6c72abbe08549000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000044d547741f53484f52545f465245455a455200000000000000000000000000000000000000000000000000000000000000c3954aa47e469add8b5ad8c243e6c72abbe08549000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000044d547741f4c4f4e475f465245455a455200000000000000000000000000000000000000000000000000000000000000006f1d6b86d4ad705385e751e6e88b0fdfdbadf298000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000044d547741f4f574e45520000000000000000000000000000000000000000000000000000000000000000000000000000004284d76a03f9b398ff7aec58c9dec94b289070cf000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000176446570726563617465206879555344202862617365295c6e5c6e416374696f6e733a5c6e312e205365742062617463682061756374696f6e206c656e67746820746f20305c6e322e205365742069737375616e6365207468726f74746c6520746f203165313820286d696e696d756d295c6e332e20556e70617573652074726164696e6720287361666574793a20656e7375726573207374616b6572732063616e20756e7374616b65206166746572206465707265636174696f6e295c6e342e205061757365206d696e74696e675c6e352e2053657420646973747269627574696f6e20746f2030252052546f6b656e2c2031303025205253525c6e362e2052656d6f766520616c6c2050415553455220726f6c65735c6e372e2052656d6f766520616c6c2053484f52545f465245455a455220726f6c65735c6e382e2052656d6f766520616c6c204c4f4e475f465245455a455220726f6c65735c6e392e2052656d6f766520616c6c204f574e455220726f6c657300000000000000000000" + } + ] +} diff --git a/scripts/deprecation/proposals/deprecate-hyUSD-mainnet.json b/scripts/deprecation/proposals/deprecate-hyUSD-mainnet.json new file mode 100644 index 000000000..77b35f7c2 --- /dev/null +++ b/scripts/deprecation/proposals/deprecate-hyUSD-mainnet.json @@ -0,0 +1,20 @@ +{ + "version": "1.0", + "chainId": "1", + "createdAt": 1775566082, + "meta": { + "name": "Deprecate hyUSD (mainnet)", + "description": "Governance proposal to deprecate hyUSD (mainnet)", + "txBuilderVersion": "1.16.5", + "createdFromSafeAddress": "", + "createdFromOwnerAddress": "", + "checksum": "" + }, + "transactions": [ + { + "to": "0x3f26ef1460d21a99425569ef3148ca6059a7eeae", + "value": "0", + "data": "0x7d5e81e2000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000002a000000000000000000000000000000000000000000000000000000000000004c00000000000000000000000000000000000000000000000000000000000000e80000000000000000000000000000000000000000000000000000000000000001000000000000000000000000044344ca9014be4bb622037224d107493586f35ed000000000000000000000000acdf0dba4b9839b96221a8487e9ca660a48212be0000000000000000000000002cabaa8010b3fbbdeebe4a2d0feffc2ed155bf370000000000000000000000002cabaa8010b3fbbdeebe4a2d0feffc2ed155bf370000000000000000000000002cabaa8010b3fbbdeebe4a2d0feffc2ed155bf370000000000000000000000000297941ccb71f5595072c4fa34ce443b6c5b47a00000000000000000000000000297941ccb71f5595072c4fa34ce443b6c5b47a00000000000000000000000002cabaa8010b3fbbdeebe4a2d0feffc2ed155bf370000000000000000000000002cabaa8010b3fbbdeebe4a2d0feffc2ed155bf370000000000000000000000002cabaa8010b3fbbdeebe4a2d0feffc2ed155bf370000000000000000000000002cabaa8010b3fbbdeebe4a2d0feffc2ed155bf370000000000000000000000002cabaa8010b3fbbdeebe4a2d0feffc2ed155bf370000000000000000000000002cabaa8010b3fbbdeebe4a2d0feffc2ed155bf370000000000000000000000002cabaa8010b3fbbdeebe4a2d0feffc2ed155bf370000000000000000000000002cabaa8010b3fbbdeebe4a2d0feffc2ed155bf370000000000000000000000002cabaa8010b3fbbdeebe4a2d0feffc2ed155bf370000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000026000000000000000000000000000000000000000000000000000000000000002e0000000000000000000000000000000000000000000000000000000000000036000000000000000000000000000000000000000000000000000000000000003a000000000000000000000000000000000000000000000000000000000000003e00000000000000000000000000000000000000000000000000000000000000480000000000000000000000000000000000000000000000000000000000000052000000000000000000000000000000000000000000000000000000000000005a0000000000000000000000000000000000000000000000000000000000000062000000000000000000000000000000000000000000000000000000000000006a0000000000000000000000000000000000000000000000000000000000000072000000000000000000000000000000000000000000000000000000000000007a0000000000000000000000000000000000000000000000000000000000000082000000000000000000000000000000000000000000000000000000000000008a0000000000000000000000000000000000000000000000000000000000000092000000000000000000000000000000000000000000000000000000000000000248881615a00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000445beafb3d0000000000000000000000000000000000000000000000000de0b6b3a764000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000442f2ff15d5041555345520000000000000000000000000000000000000000000000000000000000000000000000000000788fd297b4d497e44e4bf25d642fbeca3018b5d2000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004456068d2000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004df23cbb10000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000648859443700000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006488594437000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002710000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000044d547741f5041555345520000000000000000000000000000000000000000000000000000000000000000000000000000624f9f076ed42ba3b37c3011dc5a1761c2209e1c000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000044d547741f5041555345520000000000000000000000000000000000000000000000000000000000000000000000000000788fd297b4d497e44e4bf25d642fbeca3018b5d2000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000044d547741f5041555345520000000000000000000000000000000000000000000000000000000000000000000000000000adee783168faae3f5e1151de989ce3f252cc9a05000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000044d547741f5041555345520000000000000000000000000000000000000000000000000000000000000000000000000000d5fe2780eb882d1da78f2136b81c2a4395488c98000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000044d547741f53484f52545f465245455a455200000000000000000000000000000000000000000000000000000000000000624f9f076ed42ba3b37c3011dc5a1761c2209e1c000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000044d547741f53484f52545f465245455a455200000000000000000000000000000000000000000000000000000000000000d5fe2780eb882d1da78f2136b81c2a4395488c98000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000044d547741f4c4f4e475f465245455a45520000000000000000000000000000000000000000000000000000000000000000624f9f076ed42ba3b37c3011dc5a1761c2209e1c000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000044d547741f4c4f4e475f465245455a45520000000000000000000000000000000000000000000000000000000000000000d5fe2780eb882d1da78f2136b81c2a4395488c98000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000044d547741f4f574e4552000000000000000000000000000000000000000000000000000000000000000000000000000000788fd297b4d497e44e4bf25d642fbeca3018b5d200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000017944657072656361746520687955534420286d61696e6e6574295c6e5c6e416374696f6e733a5c6e312e205365742062617463682061756374696f6e206c656e67746820746f20305c6e322e205365742069737375616e6365207468726f74746c6520746f203165313820286d696e696d756d295c6e332e20556e70617573652074726164696e6720287361666574793a20656e7375726573207374616b6572732063616e20756e7374616b65206166746572206465707265636174696f6e295c6e342e205061757365206d696e74696e675c6e352e2053657420646973747269627574696f6e20746f2030252052546f6b656e2c2031303025205253525c6e362e2052656d6f766520616c6c2050415553455220726f6c65735c6e372e2052656d6f766520616c6c2053484f52545f465245455a455220726f6c65735c6e382e2052656d6f766520616c6c204c4f4e475f465245455a455220726f6c65735c6e392e2052656d6f766520616c6c204f574e455220726f6c657300000000000000" + } + ] +} diff --git a/scripts/deprecation/proposals/deprecate-rgUSD.json b/scripts/deprecation/proposals/deprecate-rgUSD.json new file mode 100644 index 000000000..208d28544 --- /dev/null +++ b/scripts/deprecation/proposals/deprecate-rgUSD.json @@ -0,0 +1,20 @@ +{ + "version": "1.0", + "chainId": "1", + "createdAt": 1775566082, + "meta": { + "name": "Deprecate rgUSD (2)", + "description": "Governance proposal to deprecate rgUSD (2)", + "txBuilderVersion": "1.16.5", + "createdFromSafeAddress": "", + "createdFromOwnerAddress": "", + "checksum": "" + }, + "transactions": [ + { + "to": "0x409bac94c4207c6627ea5f4e4ffb7128e8f654fc", + "value": "0", + "data": "0x7d5e81e2000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000002e00000000000000000000000000000000000000000000000000000000000000540000000000000000000000000000000000000000000000000000000000000104000000000000000000000000000000000000000000000000000000000000000120000000000000000000000001bed0098050ca52b8e2b855610de64308f3ce33600000000000000000000000078da5799cf427fee11e9996982f4150ece7a99a7000000000000000000000000b436459251b144e6cfeda33f8b814fff450053b2000000000000000000000000b436459251b144e6cfeda33f8b814fff450053b2000000000000000000000000b436459251b144e6cfeda33f8b814fff450053b20000000000000000000000006f3803ee819579f385caea44978e2b6d15d823c40000000000000000000000006f3803ee819579f385caea44978e2b6d15d823c4000000000000000000000000b436459251b144e6cfeda33f8b814fff450053b2000000000000000000000000b436459251b144e6cfeda33f8b814fff450053b2000000000000000000000000b436459251b144e6cfeda33f8b814fff450053b2000000000000000000000000b436459251b144e6cfeda33f8b814fff450053b2000000000000000000000000b436459251b144e6cfeda33f8b814fff450053b2000000000000000000000000b436459251b144e6cfeda33f8b814fff450053b2000000000000000000000000b436459251b144e6cfeda33f8b814fff450053b2000000000000000000000000b436459251b144e6cfeda33f8b814fff450053b2000000000000000000000000b436459251b144e6cfeda33f8b814fff450053b2000000000000000000000000b436459251b144e6cfeda33f8b814fff450053b2000000000000000000000000b436459251b144e6cfeda33f8b814fff450053b200000000000000000000000000000000000000000000000000000000000000120000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000012000000000000000000000000000000000000000000000000000000000000024000000000000000000000000000000000000000000000000000000000000002a0000000000000000000000000000000000000000000000000000000000000032000000000000000000000000000000000000000000000000000000000000003a000000000000000000000000000000000000000000000000000000000000003e0000000000000000000000000000000000000000000000000000000000000042000000000000000000000000000000000000000000000000000000000000004c0000000000000000000000000000000000000000000000000000000000000056000000000000000000000000000000000000000000000000000000000000005e0000000000000000000000000000000000000000000000000000000000000066000000000000000000000000000000000000000000000000000000000000006e0000000000000000000000000000000000000000000000000000000000000076000000000000000000000000000000000000000000000000000000000000007e0000000000000000000000000000000000000000000000000000000000000086000000000000000000000000000000000000000000000000000000000000008e0000000000000000000000000000000000000000000000000000000000000096000000000000000000000000000000000000000000000000000000000000009e00000000000000000000000000000000000000000000000000000000000000a6000000000000000000000000000000000000000000000000000000000000000248881615a00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000445beafb3d0000000000000000000000000000000000000000000000000de0b6b3a764000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000442f2ff15d50415553455200000000000000000000000000000000000000000000000000000000000000000000000000009ad9e73e38c8506a664a3a37e8a9ce910b6fbeb4000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004456068d2000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004df23cbb10000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000648859443700000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006488594437000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002710000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000044d547741f5041555345520000000000000000000000000000000000000000000000000000000000000000000000000000707778ae959e52acac25aaf28114ee04a5c0bf55000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000044d547741f50415553455200000000000000000000000000000000000000000000000000000000000000000000000000008785b3a82d1e3c067cee8ff830df56c78f13526d000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000044d547741f50415553455200000000000000000000000000000000000000000000000000000000000000000000000000009ad9e73e38c8506a664a3a37e8a9ce910b6fbeb4000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000044d547741f5041555345520000000000000000000000000000000000000000000000000000000000000000000000000000bb73485ac579f5014a257aef535944f80cd3fa32000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000044d547741f5041555345520000000000000000000000000000000000000000000000000000000000000000000000000000e45c3179b135288dd8e1e3c20eafebb2b2e7d771000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000044d547741f53484f52545f465245455a455200000000000000000000000000000000000000000000000000000000000000707778ae959e52acac25aaf28114ee04a5c0bf55000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000044d547741f53484f52545f465245455a4552000000000000000000000000000000000000000000000000000000000000008785b3a82d1e3c067cee8ff830df56c78f13526d000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000044d547741f53484f52545f465245455a455200000000000000000000000000000000000000000000000000000000000000bb73485ac579f5014a257aef535944f80cd3fa32000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000044d547741f53484f52545f465245455a455200000000000000000000000000000000000000000000000000000000000000e45c3179b135288dd8e1e3c20eafebb2b2e7d771000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000044d547741f4c4f4e475f465245455a45520000000000000000000000000000000000000000000000000000000000000000bb73485ac579f5014a257aef535944f80cd3fa32000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000044d547741f4f574e45520000000000000000000000000000000000000000000000000000000000000000000000000000009ad9e73e38c8506a664a3a37e8a9ce910b6fbeb4000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000173446570726563617465207267555344202832295c6e5c6e416374696f6e733a5c6e312e205365742062617463682061756374696f6e206c656e67746820746f20305c6e322e205365742069737375616e6365207468726f74746c6520746f203165313820286d696e696d756d295c6e332e20556e70617573652074726164696e6720287361666574793a20656e7375726573207374616b6572732063616e20756e7374616b65206166746572206465707265636174696f6e295c6e342e205061757365206d696e74696e675c6e352e2053657420646973747269627574696f6e20746f2030252052546f6b656e2c2031303025205253525c6e362e2052656d6f766520616c6c2050415553455220726f6c65735c6e372e2052656d6f766520616c6c2053484f52545f465245455a455220726f6c65735c6e382e2052656d6f766520616c6c204c4f4e475f465245455a455220726f6c65735c6e392e2052656d6f766520616c6c204f574e455220726f6c657300000000000000000000000000" + } + ] +} diff --git a/tasks/validation/utils/rewards.ts b/tasks/validation/utils/rewards.ts index 5abd4ddb2..9add088ab 100644 --- a/tasks/validation/utils/rewards.ts +++ b/tasks/validation/utils/rewards.ts @@ -3,7 +3,8 @@ import { advanceBlocks, advanceTime } from '#/utils/time' import { IRewardable } from '@typechain/IRewardable' import { formatEther } from 'ethers/lib/utils' import { HardhatRuntimeEnvironment } from 'hardhat/types' -import { runBatchTrade } from './trades' +import { runBatchTrade, runDutchTrade } from './trades' +import { pushOraclesForward } from './oracles' const claimRewards = async (claimer: IRewardable) => { const resp = await claimer.claimRewards() @@ -55,8 +56,20 @@ export const processRevenue = async (hre: HardhatRuntimeEnvironment, rtokenAddre await backingManager.forwardRevenue(rewards) - await rsrTrader.manageTokens([rToken.address], [TradeKind.BATCH_AUCTION]) - await runBatchTrade(hre, rsrTrader, rToken.address, false) + // Try batch auction first, fall back to Dutch auction (4.2.0+ disables batch) + try { + await rsrTrader.manageTokens([rToken.address], [TradeKind.BATCH_AUCTION]) + await runBatchTrade(hre, rsrTrader, rToken.address, false) + } catch (e: any) { + if (e.message?.includes('batch auctions not enabled')) { + console.log('Batch auctions not enabled, using Dutch auction...') + await pushOraclesForward(hre, rToken.address, []) + await rsrTrader.manageTokens([rToken.address], [TradeKind.DUTCH_AUCTION]) + await runDutchTrade(hre, rsrTrader, rToken.address) + } else { + throw e + } + } await strsr.payoutRewards() await advanceBlocks(hre, 100) diff --git a/test/deprecation/deprecate-from-json.test.ts b/test/deprecation/deprecate-from-json.test.ts new file mode 100644 index 000000000..4ea0acb4f --- /dev/null +++ b/test/deprecation/deprecate-from-json.test.ts @@ -0,0 +1,301 @@ +import { expect } from 'chai' +import hre, { ethers } from 'hardhat' +import { whileImpersonating } from '#/utils/impersonation' +import { advanceBlocks, advanceTime } from '#/utils/time' +import { formatEther } from 'ethers/lib/utils' +import { bn, fp } from '#/common/numbers' +import { ProposalState } from '#/common/constants' +import { pushOraclesForward } from '../../tasks/validation/utils/oracles' + +/** + * Deprecation Proposal Validation — from JSON (pre-submission) + * + * Template for validating a deprecation proposal BEFORE it's submitted on-chain. + * Decodes the proposal from the generated Safe TX Builder JSON, submits it via + * the governor, advances through the governance lifecycle, and validates all + * post-conditions including redemption and unstaking. + * + * === HOW TO ADAPT === + * 1. Set PROPOSAL_JSON to the path of your generated JSON + * 2. Fill in the contract addresses (GOVERNOR, TIMELOCK, MAIN, RTOKEN, BROKER) + * 3. Fill in role holders (PAUSERS, SHORT_FREEZERS, LONG_FREEZERS) + * 4. Set RTOKEN_HOLDER to an address with RToken balance for redemption test + * 5. Set RSR_WHALE or use StRSR delegation (see comments below) + * 6. Adjust governor time advancement for your governor type (see below) + * + * === GOVERNOR TYPES === + * - Governance (Reserve): time-based — advanceTime for delay, advanceBlocks for period + * - Governor Anastasius: time-based — advanceTime + advanceBlocks(2) for both + * - Governor Alexios: block-based — advanceBlocks for both + * + * === RUN === + * PROTO=p1 FORK=1 FORK_NETWORK= FORK_BLOCK= \ + * npx hardhat test test/deprecation/deprecate-from-json.test.ts + */ + +// ======================== CONFIGURE THESE ======================== + +const PROPOSAL_JSON = '../../scripts/deprecation/proposals/deprecate-USDCplus.json' + +// Contract addresses +const GOVERNOR = '0xc837c557071d604bcb1058c8c4891ddbe8fdd630' +const TIMELOCK = '0x6c957417cb6df6e821eec8555dee8b116c291999' +const MAIN = '0xeC11Cf537497141aC820615F4f399be4a1638Af6' +const RTOKEN = '0xFc0B1EEf20e4c68B3DCF36c4537Cfa7Ce46CA70b' +const BROKER = '0x7aFc1d0bDFE2F3887466534516447bA4cE97B305' + +// Role holders to verify removal (from generate-deprecation-proposals.py) +const PAUSERS = [ + '0x52ea58f4fc3ced48fa18e909226c1f8a0ef887dc', + '0x8785b3a82d1e3c067cee8ff830df56c78f13526d', + '0xfdefe2e8ae439547a4ca4b2656715e5bbceb295b', +] +const SHORT_FREEZERS = [ + '0x52ea58f4fc3ced48fa18e909226c1f8a0ef887dc', + '0x8785b3a82d1e3c067cee8ff830df56c78f13526d', + '0xfdefe2e8ae439547a4ca4b2656715e5bbceb295b', +] +const LONG_FREEZERS = [ + '0x52ea58f4fc3ced48fa18e909226c1f8a0ef887dc', + '0x8785b3a82d1e3c067cee8ff830df56c78f13526d', + '0xfdefe2e8ae439547a4ca4b2656715e5bbceb295b', +] + +// RToken holder for redemption test — must have balance at the fork block +const RTOKEN_HOLDER = '0xf2b25362a03f6eacca8de8d5350a9f37944c1e59' + +// RSR whale for staking voting power (mainnet only — for Base/Arbitrum use StRSR delegation) +const RSR_WHALE = '0x6bab6EB87Aa5a1e4A8310C73bDAAA8A5dAAd81C1' + +// ======================== END CONFIG ======================== + +const PAUSER_ROLE = '0x5041555345520000000000000000000000000000000000000000000000000000' +const SHORT_FREEZER_ROLE = '0x53484f52545f465245455a455200000000000000000000000000000000000000' +const LONG_FREEZER_ROLE = '0x4c4f4e475f465245455a45520000000000000000000000000000000000000000' +const OWNER_ROLE = '0x4f574e4552000000000000000000000000000000000000000000000000000000' + +describe('Deprecation Proposal (from JSON)', () => { + let targets: string[] + let values: any[] + let calldatas: string[] + let descriptionHash: string + let proposalId: string + + before(async () => { + // Decode proposal from generated JSON + // eslint-disable-next-line @typescript-eslint/no-var-requires + const proposalJson = require(PROPOSAL_JSON) + const iface = new ethers.utils.Interface([ + 'function propose(address[] targets, uint256[] values, bytes[] calldatas, string description) returns (uint256)', + ]) + const decoded = iface.decodeFunctionData('propose', proposalJson.transactions[0].data) + // IMPORTANT: Use positional access — decoded.values collides with ethers Result.values() + targets = Array.from(decoded[0]) + values = Array.from(decoded[1]) + calldatas = Array.from(decoded[2]) + descriptionHash = ethers.utils.keccak256(ethers.utils.toUtf8Bytes(decoded[3])) + + const governor = await ethers.getContractAt('Governance', GOVERNOR) + const main = await ethers.getContractAt('IMain', MAIN) + const stRSR = await ethers.getContractAt('StRSRP1Votes', await main.stRSR()) + const rsr = await ethers.getContractAt('ERC20Mock', await main.rsr()) + const [tester] = await ethers.getSigners() + + const pid = await governor.hashProposal(targets, values, calldatas, descriptionHash) + proposalId = pid.toString() + console.log(`Proposal ID: ${proposalId}`) + + // Get voting power: stake RSR and delegate + // For Base/Arbitrum where no RSR whale exists, replace this block with + // StRSR delegation from existing holders (see deprecate-rtoken.md skill) + const stakeAmount = (await stRSR.totalSupply()).mul(2) + await whileImpersonating(hre, RSR_WHALE, async (signer) => { + await rsr.connect(signer).transfer(tester.address, stakeAmount) + }) + await rsr.connect(tester).approve(stRSR.address, stakeAmount) + await stRSR.connect(tester).stake(stakeAmount) + await stRSR.connect(tester).delegate(tester.address) + await advanceBlocks(hre, 1) + console.log(`Staked ${formatEther(stakeAmount)} RSR and delegated`) + + // Submit proposal + await governor.connect(tester).propose(targets, values, calldatas, decoded[3]) + console.log('Proposal submitted') + }) + + it('should advance proposal through governance and execute', async () => { + const governor = await ethers.getContractAt('Governance', GOVERNOR) + const [tester] = await ethers.getSigners() + + let state = await governor.state(proposalId) + console.log(`Initial state: ${ProposalState[state]}`) + + // Advance past voting delay + // ADJUST for your governor type: + // Alexios (block-based): advanceBlocks(hre, votingDelay.add(1)) + // Anastasius (time-based): advanceTime(hre, votingDelay.toNumber()) + advanceBlocks(hre, 2) + // Governance (time-based): advanceTime(hre, votingDelay.toNumber()) + advanceBlocks(hre, 2) + if (state == ProposalState.Pending) { + const votingDelay = await governor.votingDelay() + await advanceBlocks(hre, votingDelay.add(1)) // Alexios (block-based) + state = await governor.state(proposalId) + console.log(`State after voting delay: ${ProposalState[state]}`) + } + + // Cast vote + if (state == ProposalState.Active) { + await governor.connect(tester).castVote(proposalId, 1) + console.log('Vote cast') + + const votingPeriod = await governor.votingPeriod() + await advanceBlocks(hre, votingPeriod.add(1)) + state = await governor.state(proposalId) + console.log(`State after voting period: ${ProposalState[state]}`) + } + + // Queue + if (state == ProposalState.Succeeded) { + console.log('Proposal SUCCEEDED') + await governor.queue(targets, values, calldatas, descriptionHash) + state = await governor.state(proposalId) + console.log('Proposal QUEUED') + } + + // Execute + if (state == ProposalState.Queued) { + const timelock = await ethers.getContractAt('TimelockController', TIMELOCK) + const minDelay = await timelock.getMinDelay() + await advanceTime(hre, minDelay.add(1).toNumber()) + await advanceBlocks(hre, 1) + + await pushOraclesForward(hre, RTOKEN, []) + + const tx = await governor.execute(targets, values, calldatas, descriptionHash) + const receipt = await tx.wait() + console.log(`Proposal EXECUTED (gas: ${receipt.gasUsed})`) + } + + expect(await governor.state(proposalId)).to.equal(ProposalState.Executed) + }) + + it('should have removed all roles', async () => { + const main = await ethers.getContractAt('IMain', MAIN) + + for (const addr of PAUSERS) { + expect(await main.hasRole(PAUSER_ROLE, addr)).to.equal(false) + } + expect(await main.hasRole(PAUSER_ROLE, TIMELOCK)).to.equal(false) + console.log('All PAUSER roles removed') + + for (const addr of SHORT_FREEZERS) { + expect(await main.hasRole(SHORT_FREEZER_ROLE, addr)).to.equal(false) + } + console.log('All SHORT_FREEZER roles removed') + + for (const addr of LONG_FREEZERS) { + expect(await main.hasRole(LONG_FREEZER_ROLE, addr)).to.equal(false) + } + console.log('All LONG_FREEZER roles removed') + + expect(await main.hasRole(OWNER_ROLE, TIMELOCK)).to.equal(false) + console.log('OWNER role removed from timelock') + }) + + it('should have paused issuance', async () => { + const main = await ethers.getContractAt('IMain', MAIN) + expect(await main.issuancePausedOrFrozen()).to.equal(true) + console.log('Issuance is paused') + }) + + it('should have set batch auction length to 0', async () => { + const broker = await ethers.getContractAt('BrokerP1', BROKER) + expect(await broker.batchAuctionLength()).to.equal(0) + console.log('Batch auction length is 0') + }) + + it('should still allow redemption', async () => { + const rToken = await ethers.getContractAt('RTokenP1', RTOKEN) + const main = await ethers.getContractAt('IMain', MAIN) + const basketHandler = await ethers.getContractAt('BasketHandlerP1', await main.basketHandler()) + const assetRegistry = await ethers.getContractAt('AssetRegistryP1', await main.assetRegistry()) + + await pushOraclesForward(hre, RTOKEN, []) + await assetRegistry.refresh() + + const totalSupply = await rToken.totalSupply() + console.log(`Total supply: ${formatEther(totalSupply)}`) + + const bal = await rToken.balanceOf(RTOKEN_HOLDER) + expect(bal).to.be.gt(0) + console.log(`Holder ${RTOKEN_HOLDER} has ${formatEther(bal)} RTokens`) + + await whileImpersonating(hre, RTOKEN_HOLDER, async (signer) => { + // Cap redemption to avoid throttle on high-supply tokens + const redeemAmt = bal.gt(fp('100')) ? fp('100') : bal + + const basketsNeeded = await rToken.basketsNeeded() + const [erc20s] = await basketHandler['quote(uint192,uint8)']( + redeemAmt.mul(basketsNeeded).div(totalSupply), + 0 + ) + + const preBals: { [key: string]: any } = {} + for (const erc20 of erc20s) { + const token = await ethers.getContractAt('IERC20Metadata', erc20) + preBals[erc20] = await token.balanceOf(signer.address) + } + + console.log(`Redeeming ${formatEther(redeemAmt)}...`) + await rToken.connect(signer).redeem(redeemAmt) + + for (const erc20 of erc20s) { + const token = await ethers.getContractAt('IERC20Metadata', erc20) + const received = (await token.balanceOf(signer.address)).sub(preBals[erc20]) + const symbol = await token.symbol() + console.log(` Received ${formatEther(received)} ${symbol}`) + expect(received).to.be.gt(0) + } + + console.log('Redemption successful!') + }) + }) + + it('should NOT allow new issuance', async () => { + const rToken = await ethers.getContractAt('RTokenP1', RTOKEN) + const [tester] = await ethers.getSigners() + + await expect(rToken.connect(tester).issue(fp('1'))).to.be.reverted + console.log('Issuance correctly blocked') + }) + + it('should allow unstake and withdraw', async () => { + const main = await ethers.getContractAt('IMain', MAIN) + const stRSR = await ethers.getContractAt('StRSRP1Votes', await main.stRSR()) + const rsr = await ethers.getContractAt('ERC20Mock', await main.rsr()) + const [tester] = await ethers.getSigners() + + // Critical: verify trading is not paused (rgUSD/KNOX incident) + expect(await main.tradingPausedOrFrozen()).to.equal(false) + console.log('Trading is NOT paused — unstake/withdraw should work') + + const stRSRBal = await stRSR.balanceOf(tester.address) + expect(stRSRBal).to.be.gt(0) + console.log(`Tester StRSR balance: ${formatEther(stRSRBal)}`) + + const rsrBalBefore = await rsr.balanceOf(tester.address) + await stRSR.connect(tester).unstake(stRSRBal) + console.log('Unstake successful') + + const unstakingDelay = await stRSR.unstakingDelay() + await advanceTime(hre, unstakingDelay + 1) + await advanceBlocks(hre, 1) + + await pushOraclesForward(hre, RTOKEN, []) + + await stRSR.connect(tester).withdraw(tester.address, 1) + const rsrBalAfter = await rsr.balanceOf(tester.address) + expect(rsrBalAfter).to.be.gt(rsrBalBefore) + console.log(`Withdrew ${formatEther(rsrBalAfter.sub(rsrBalBefore))} RSR`) + console.log('Unstake and withdraw successful!') + }) +}) diff --git a/test/deprecation/deprecate-onchain-proposal.test.ts b/test/deprecation/deprecate-onchain-proposal.test.ts new file mode 100644 index 000000000..ad15940a1 --- /dev/null +++ b/test/deprecation/deprecate-onchain-proposal.test.ts @@ -0,0 +1,303 @@ +import { expect } from 'chai' +import hre, { ethers } from 'hardhat' +import { whileImpersonating } from '#/utils/impersonation' +import { advanceBlocks, advanceTime } from '#/utils/time' +import { formatEther } from 'ethers/lib/utils' +import { bn, fp } from '#/common/numbers' +import { ProposalState } from '#/common/constants' +import { pushOraclesForward } from '../../tasks/validation/utils/oracles' + +/** + * Deprecation Proposal Validation — on-chain proposal (post-submission) + * + * Template for validating a deprecation proposal AFTER it's been submitted on-chain. + * Verifies the JSON matches the on-chain proposal ID, then advances the already-submitted + * proposal through governance, executes it, and validates all post-conditions. + * + * === HOW TO ADAPT === + * 1. Set PROPOSAL_JSON to the path of your generated JSON + * 2. Set PROPOSAL_ID to the real on-chain proposal ID + * 3. Fill in the contract addresses (GOVERNOR, TIMELOCK, MAIN, RTOKEN, BROKER) + * 4. Fill in role holders (PAUSERS, SHORT_FREEZERS, LONG_FREEZERS) + * 5. Set RTOKEN_HOLDER to an address with RToken balance for redemption test + * 6. Set RSR_WHALE or use StRSR delegation (see comments below) + * 7. Adjust governor time advancement for your governor type (see below) + * 8. Use a FORK_BLOCK where the proposal already exists on-chain + * + * === GOVERNOR TYPES === + * - Governance (Reserve): time-based — advanceTime for delay, advanceBlocks for period + * - Governor Anastasius: time-based — advanceTime + advanceBlocks(2) for both + * - Governor Alexios: block-based — advanceBlocks for both + * + * === RUN === + * PROTO=p1 FORK=1 FORK_NETWORK= FORK_BLOCK= \ + * npx hardhat test test/deprecation/deprecate-onchain-proposal.test.ts + */ + +// ======================== CONFIGURE THESE ======================== +// NOTE: PROPOSAL_JSON must match what was submitted on-chain. If the JSON was +// regenerated after submission (e.g. with new actions), the hash will differ. + +const PROPOSAL_JSON = '../../scripts/deprecation/proposals/deprecate-dgnETH.json' +const PROPOSAL_ID = '47338979468772114877208030107250016310660136334776747135689847485470102343203' + +// Contract addresses +const GOVERNOR = '0xb7cB3880564A1F8698018ECDc78972F93b2615e6' +const TIMELOCK = '0x05623fcEe6FB48b7C8058022C48A72dbce09878e' +const MAIN = '0x0A82c906E283FE813fa591D104E0Bfe75609cD35' +const RTOKEN = '0x005F893EcD7bF9667195642f7649DA8163e23658' +const BROKER = '0x9baDe46AC6b0c6e3460513Ec71e5B2636D8ddac0' + +// Role holders to verify removal +const PAUSERS = [ + '0x9ca72f031f789f51bd35cc34583c7b7a7d0871a3', + '0xd5fe2780eb882d1da78f2136b81c2a4395488c98', +] +const SHORT_FREEZERS = [ + '0x03d03a026e71979be3b08d44b01eae4c5ff9da99', + '0x8785b3a82d1e3c067cee8ff830df56c78f13526d', + '0x9ca72f031f789f51bd35cc34583c7b7a7d0871a3', + '0xd5fe2780eb882d1da78f2136b81c2a4395488c98', + '0xd733d4cc5b42206a62ed7b1ceec5b4d61898f429', +] +const LONG_FREEZERS = ['0xd5fe2780eb882d1da78f2136b81c2a4395488c98'] + +// RToken holder for redemption test — must have balance at the fork block +const RTOKEN_HOLDER = '0x9ca72f031f789f51bd35cc34583c7b7a7d0871a3' + +// RSR whale for staking voting power (mainnet only — for Base/Arbitrum use StRSR delegation) +const RSR_WHALE = '0x6bab6EB87Aa5a1e4A8310C73bDAAA8A5dAAd81C1' + +// ======================== END CONFIG ======================== + +const PAUSER_ROLE = '0x5041555345520000000000000000000000000000000000000000000000000000' +const SHORT_FREEZER_ROLE = '0x53484f52545f465245455a455200000000000000000000000000000000000000' +const LONG_FREEZER_ROLE = '0x4c4f4e475f465245455a45520000000000000000000000000000000000000000' +const OWNER_ROLE = '0x4f574e4552000000000000000000000000000000000000000000000000000000' + +describe('Deprecation Proposal (on-chain)', () => { + let targets: string[] + let values: any[] + let calldatas: string[] + let descriptionHash: string + let proposalId: string + + before(async () => { + // Decode proposal from generated JSON + // eslint-disable-next-line @typescript-eslint/no-var-requires + const proposalJson = require(PROPOSAL_JSON) + const iface = new ethers.utils.Interface([ + 'function propose(address[] targets, uint256[] values, bytes[] calldatas, string description) returns (uint256)', + ]) + const decoded = iface.decodeFunctionData('propose', proposalJson.transactions[0].data) + // IMPORTANT: Use positional access — decoded.values collides with ethers Result.values() + targets = Array.from(decoded[0]) + values = Array.from(decoded[1]) + calldatas = Array.from(decoded[2]) + descriptionHash = ethers.utils.keccak256(ethers.utils.toUtf8Bytes(decoded[3])) + + const governor = await ethers.getContractAt('Governance', GOVERNOR) + const main = await ethers.getContractAt('IMain', MAIN) + const stRSR = await ethers.getContractAt('StRSRP1Votes', await main.stRSR()) + const rsr = await ethers.getContractAt('ERC20Mock', await main.rsr()) + const [tester] = await ethers.getSigners() + + // Verify JSON matches on-chain proposal + proposalId = PROPOSAL_ID + const pid = await governor.hashProposal(targets, values, calldatas, descriptionHash) + expect(pid.toString()).to.equal(proposalId, 'JSON proposal does not match on-chain proposal') + console.log(`On-chain proposal ${proposalId}`) + + const state = await governor.state(proposalId) + console.log(`Current state: ${ProposalState[state]}`) + + // Stake RSR and delegate to vote the proposal through + // For Base/Arbitrum where no RSR whale exists, replace with StRSR delegation + const stakeAmount = (await stRSR.totalSupply()).mul(2) + await whileImpersonating(hre, RSR_WHALE, async (signer) => { + await rsr.connect(signer).transfer(tester.address, stakeAmount) + }) + await rsr.connect(tester).approve(stRSR.address, stakeAmount) + await stRSR.connect(tester).stake(stakeAmount) + await stRSR.connect(tester).delegate(tester.address) + await advanceBlocks(hre, 1) + console.log(`Staked ${formatEther(stakeAmount)} RSR and delegated`) + }) + + it('should advance proposal through governance and execute', async () => { + const governor = await ethers.getContractAt('Governance', GOVERNOR) + const [tester] = await ethers.getSigners() + + let state = await governor.state(proposalId) + console.log(`Initial state: ${ProposalState[state]}`) + + // Advance past voting delay + // ADJUST for your governor type: + // Alexios (block-based): advanceBlocks(hre, votingDelay.add(1)) + // Anastasius (time-based): advanceTime(hre, votingDelay.toNumber()) + advanceBlocks(hre, 2) + // Governance (time-based): advanceTime(hre, votingDelay.toNumber()) + advanceBlocks(hre, 2) + if (state == ProposalState.Pending) { + const votingDelay = await governor.votingDelay() + await advanceTime(hre, votingDelay.toNumber()) + await advanceBlocks(hre, 2) + state = await governor.state(proposalId) + console.log(`State after voting delay: ${ProposalState[state]}`) + } + + // Cast vote + if (state == ProposalState.Active) { + await governor.connect(tester).castVote(proposalId, 1) + console.log('Vote cast') + + const votingPeriod = await governor.votingPeriod() + await advanceBlocks(hre, votingPeriod.add(1)) + state = await governor.state(proposalId) + console.log(`State after voting period: ${ProposalState[state]}`) + } + + // Queue + if (state == ProposalState.Succeeded) { + console.log('Proposal SUCCEEDED') + await governor.queue(targets, values, calldatas, descriptionHash) + state = await governor.state(proposalId) + console.log('Proposal QUEUED') + } + + // Execute + if (state == ProposalState.Queued) { + const timelock = await ethers.getContractAt('TimelockController', TIMELOCK) + const minDelay = await timelock.getMinDelay() + await advanceTime(hre, minDelay.add(1).toNumber()) + await advanceBlocks(hre, 1) + + await pushOraclesForward(hre, RTOKEN, []) + + const tx = await governor.execute(targets, values, calldatas, descriptionHash) + const receipt = await tx.wait() + console.log(`Proposal EXECUTED (gas: ${receipt.gasUsed})`) + } + + expect(await governor.state(proposalId)).to.equal(ProposalState.Executed) + }) + + it('should have removed all roles', async () => { + const main = await ethers.getContractAt('IMain', MAIN) + + for (const addr of PAUSERS) { + expect(await main.hasRole(PAUSER_ROLE, addr)).to.equal(false) + } + expect(await main.hasRole(PAUSER_ROLE, TIMELOCK)).to.equal(false) + console.log('All PAUSER roles removed') + + for (const addr of SHORT_FREEZERS) { + expect(await main.hasRole(SHORT_FREEZER_ROLE, addr)).to.equal(false) + } + console.log('All SHORT_FREEZER roles removed') + + for (const addr of LONG_FREEZERS) { + expect(await main.hasRole(LONG_FREEZER_ROLE, addr)).to.equal(false) + } + console.log('All LONG_FREEZER roles removed') + + expect(await main.hasRole(OWNER_ROLE, TIMELOCK)).to.equal(false) + console.log('OWNER role removed from timelock') + }) + + it('should have paused issuance', async () => { + const main = await ethers.getContractAt('IMain', MAIN) + expect(await main.issuancePausedOrFrozen()).to.equal(true) + console.log('Issuance is paused') + }) + + it('should have set batch auction length to 0', async () => { + const broker = await ethers.getContractAt('BrokerP1', BROKER) + expect(await broker.batchAuctionLength()).to.equal(0) + console.log('Batch auction length is 0') + }) + + it('should still allow redemption', async () => { + const rToken = await ethers.getContractAt('RTokenP1', RTOKEN) + const main = await ethers.getContractAt('IMain', MAIN) + const basketHandler = await ethers.getContractAt('BasketHandlerP1', await main.basketHandler()) + const assetRegistry = await ethers.getContractAt('AssetRegistryP1', await main.assetRegistry()) + + await pushOraclesForward(hre, RTOKEN, []) + await assetRegistry.refresh() + + const totalSupply = await rToken.totalSupply() + console.log(`Total supply: ${formatEther(totalSupply)}`) + + const bal = await rToken.balanceOf(RTOKEN_HOLDER) + expect(bal).to.be.gt(0) + console.log(`Holder ${RTOKEN_HOLDER} has ${formatEther(bal)} RTokens`) + + await whileImpersonating(hre, RTOKEN_HOLDER, async (signer) => { + // Cap redemption to avoid throttle on high-supply tokens + const redeemAmt = bal.gt(fp('100')) ? fp('100') : bal + + const basketsNeeded = await rToken.basketsNeeded() + const [erc20s] = await basketHandler['quote(uint192,uint8)']( + redeemAmt.mul(basketsNeeded).div(totalSupply), + 0 + ) + + const preBals: { [key: string]: any } = {} + for (const erc20 of erc20s) { + const token = await ethers.getContractAt('IERC20Metadata', erc20) + preBals[erc20] = await token.balanceOf(signer.address) + } + + console.log(`Redeeming ${formatEther(redeemAmt)}...`) + await rToken.connect(signer).redeem(redeemAmt) + + for (const erc20 of erc20s) { + const token = await ethers.getContractAt('IERC20Metadata', erc20) + const received = (await token.balanceOf(signer.address)).sub(preBals[erc20]) + const symbol = await token.symbol() + console.log(` Received ${formatEther(received)} ${symbol}`) + expect(received).to.be.gt(0) + } + + console.log('Redemption successful!') + }) + }) + + it('should NOT allow new issuance', async () => { + const rToken = await ethers.getContractAt('RTokenP1', RTOKEN) + const [tester] = await ethers.getSigners() + + await expect(rToken.connect(tester).issue(fp('1'))).to.be.reverted + console.log('Issuance correctly blocked') + }) + + it('should allow unstake and withdraw', async () => { + const main = await ethers.getContractAt('IMain', MAIN) + const stRSR = await ethers.getContractAt('StRSRP1Votes', await main.stRSR()) + const rsr = await ethers.getContractAt('ERC20Mock', await main.rsr()) + const [tester] = await ethers.getSigners() + + // Critical: verify trading is not paused (rgUSD/KNOX incident) + expect(await main.tradingPausedOrFrozen()).to.equal(false) + console.log('Trading is NOT paused — unstake/withdraw should work') + + const stRSRBal = await stRSR.balanceOf(tester.address) + expect(stRSRBal).to.be.gt(0) + console.log(`Tester StRSR balance: ${formatEther(stRSRBal)}`) + + const rsrBalBefore = await rsr.balanceOf(tester.address) + await stRSR.connect(tester).unstake(stRSRBal) + console.log('Unstake successful') + + const unstakingDelay = await stRSR.unstakingDelay() + await advanceTime(hre, unstakingDelay + 1) + await advanceBlocks(hre, 1) + + await pushOraclesForward(hre, RTOKEN, []) + + await stRSR.connect(tester).withdraw(tester.address, 1) + const rsrBalAfter = await rsr.balanceOf(tester.address) + expect(rsrBalAfter).to.be.gt(rsrBalBefore) + console.log(`Withdrew ${formatEther(rsrBalAfter.sub(rsrBalBefore))} RSR`) + console.log('Unstake and withdraw successful!') + }) +})