From 354c4dee55c1f416b2b6c475042b408a54941786 Mon Sep 17 00:00:00 2001 From: Albert Llimos <53186777+albert-llimos@users.noreply.github.com> Date: Wed, 19 Feb 2025 06:04:07 +0100 Subject: [PATCH] feat: add image with ALT Manager, additional nonces and ALT witnessing. (#5638) * Added versioned transaction and versioned message support * Added unit test for Versioned transactions with Address lookup table * Moved (almost) everything in sol_tx_core into sol-prim Moved ALT related stuff to its own file. * Initial commit for changing Solana Transaction to VersionedTransaction * Make solana api calls more consistent with the use of ALT * feat: update image with alt and add logic and migrations * chore: rebase and update * chore: run ci * chore: fix clippy and try removing symlink * chore: try running anza * chore: upgrade to 2.1.13 * chore: update bouncer expected number of nonces * chore: update compute units * chore: restore ci# * chore: fix ci * chore: nit * chore: update test * chore: fix tests and nit * chore: define MAX_CCM_USER_ALTS * Minor improvements. Fix build and tests --------- Co-authored-by: Roy Yang Co-authored-by: Daniel --- .cargo/config.toml | 2 +- .github/workflows/_40_post_check.yml | 5 +- .github/workflows/ci-development.yml | 2 +- .github/workflows/upgrade-test.yml | 18 +- bouncer/README.md | 2 + bouncer/commands/setup_vaults.ts | 1 - bouncer/shared/contract_interfaces.ts | 2 +- bouncer/shared/force_sol_nonces.ts | 180 +++++- bouncer/shared/initialize_new_chains.ts | 49 +- bouncer/shared/sol_vault_swap.ts | 2 +- bouncer/shared/utils.ts | 12 +- .../tests/solana_vault_settings_governance.ts | 2 +- .../download-sol-program-idls.sh | 1 + .../v0.1.1-alt-test/alt_manager.json | 371 ++++++++++++ .../cf_tester.json | 0 .../cf_tester.ts | 0 .../swap_endpoint.json | 0 .../swap_endpoint.ts | 0 .../vault.json | 0 .../vault.ts | 0 engine/src/witness/sol.rs | 5 +- engine/src/witness/sol/egress_witnessing.rs | 5 +- .../witness/sol/lookup_table_witnessing.rs | 226 ++++++++ ...itnessing.rs => vault_swaps_witnessing.rs} | 2 +- foreign-chains/solana/sol-prim/src/alt.rs | 4 +- foreign-chains/solana/sol-prim/src/consts.rs | 4 +- .../src/instructions/program_instructions.rs | 23 + foreign-chains/solana/sol-prim/src/lib.rs | 1 + localnet/common.sh | 3 - localnet/docker-compose.yml | 2 +- .../cf-integration-tests/src/solana.rs | 17 +- state-chain/chains/src/sol.rs | 14 +- state-chain/chains/src/sol/api.rs | 44 +- state-chain/chains/src/sol/sol_tx_core.rs | 11 +- .../chains/src/sol/transaction_builder.rs | 77 +-- state-chain/node/src/chain_spec.rs | 43 +- state-chain/node/src/chain_spec/berghain.rs | 234 ++++++++ .../node/src/chain_spec/perseverance.rs | 234 ++++++++ state-chain/node/src/chain_spec/sisyphos.rs | 234 ++++++++ state-chain/node/src/chain_spec/testnet.rs | 251 ++++++++- state-chain/pallets/cf-environment/src/lib.rs | 4 +- .../pallets/cf-environment/src/migrations.rs | 13 +- .../src/migrations/sol_api_environment.rs | 532 +++++++++++++++++- .../pallets/cf-environment/src/mock.rs | 18 +- state-chain/runtime/src/chainflip.rs | 15 +- 45 files changed, 2460 insertions(+), 205 deletions(-) create mode 100644 contract-interfaces/sol-program-idls/v0.1.1-alt-test/alt_manager.json rename contract-interfaces/sol-program-idls/{v1.0.1-swap-endpoint => v0.1.1-alt-test}/cf_tester.json (100%) rename contract-interfaces/sol-program-idls/{v1.0.1-swap-endpoint => v0.1.1-alt-test}/cf_tester.ts (100%) rename contract-interfaces/sol-program-idls/{v1.0.1-swap-endpoint => v0.1.1-alt-test}/swap_endpoint.json (100%) rename contract-interfaces/sol-program-idls/{v1.0.1-swap-endpoint => v0.1.1-alt-test}/swap_endpoint.ts (100%) rename contract-interfaces/sol-program-idls/{v1.0.1-swap-endpoint => v0.1.1-alt-test}/vault.json (100%) rename contract-interfaces/sol-program-idls/{v1.0.1-swap-endpoint => v0.1.1-alt-test}/vault.ts (100%) create mode 100644 engine/src/witness/sol/lookup_table_witnessing.rs rename engine/src/witness/sol/{program_swaps_witnessing.rs => vault_swaps_witnessing.rs} (99%) diff --git a/.cargo/config.toml b/.cargo/config.toml index b5365753225..030f30bd8bb 100644 --- a/.cargo/config.toml +++ b/.cargo/config.toml @@ -2,7 +2,7 @@ CF_ETH_CONTRACT_ABI_ROOT = { value = "contract-interfaces/eth-contract-abis", relative = true } CF_ETH_CONTRACT_ABI_TAG = "v1.1.2" CF_SOL_PROGRAM_IDL_ROOT = { value = "contract-interfaces/sol-program-idls", relative = true } -CF_SOL_PROGRAM_IDL_TAG = "v1.0.1-swap-endpoint" +CF_SOL_PROGRAM_IDL_TAG = "v0.1.1-alt-test" CF_ARB_CONTRACT_ABI_ROOT = { value = "contract-interfaces/arb-contract-abis", relative = true } CF_TEST_CONFIG_ROOT = { value = "engine/config/testing", relative = true } diff --git a/.github/workflows/_40_post_check.yml b/.github/workflows/_40_post_check.yml index f951c295ae0..a4aea4a26fc 100644 --- a/.github/workflows/_40_post_check.yml +++ b/.github/workflows/_40_post_check.yml @@ -18,7 +18,7 @@ on: env: FORCE_COLOR: 1 - SOLANA_VERSION: v1.18.17 + SOLANA_VERSION: v2.1.13 NODE_COUNT: "${{ inputs.node-count }}-node" permissions: @@ -81,8 +81,7 @@ jobs: - name: Install solana ☀️ run: | - sh -c "$(curl -sSfL https://release.solana.com/$SOLANA_VERSION/install)" - + sh -c "$(curl -sSfL https://release.anza.xyz/$SOLANA_VERSION/install)" - name: Start a localnet 🚀 env: BINARY_ROOT_PATH: . diff --git a/.github/workflows/ci-development.yml b/.github/workflows/ci-development.yml index eb20a5c53d7..78e24feaf83 100644 --- a/.github/workflows/ci-development.yml +++ b/.github/workflows/ci-development.yml @@ -5,7 +5,7 @@ on: branches: - main - "release/*" - - "feat/solana-versioned-transaction-base-branch" + - "feat/solana-versioned-transaction*" concurrency: group: ${{ github.ref }}-release-development cancel-in-progress: true diff --git a/.github/workflows/upgrade-test.yml b/.github/workflows/upgrade-test.yml index 05868f94909..bcfa000c0ca 100644 --- a/.github/workflows/upgrade-test.yml +++ b/.github/workflows/upgrade-test.yml @@ -22,8 +22,8 @@ on: default: true env: FORCE_COLOR: 1 - SOLANA_VERSION: v1.18.17 - SOLANA_PROGRAMS_VERSION: v1.0.1-swap-endpoint + SOLANA_VERSION: v2.1.13 + SOLANA_PROGRAMS_VERSION: v0.1.1-alt-test NODE_COUNT: "1-node" permissions: @@ -149,7 +149,7 @@ jobs: - name: Install solana ☀️ if: inputs.run-job run: | - sh -c "$(curl -sSfL https://release.solana.com/$SOLANA_VERSION/install)" + sh -c "$(curl -sSfL https://release.anza.xyz/$SOLANA_VERSION/install)" - name: Start a localnet from upgrade-from version 🚀 if: inputs.run-job @@ -173,9 +173,21 @@ jobs: echo "/usr/lib after copy of .so files" ls -l /usr/lib touch ./localnet/.setup_complete + # TODO: This is a temporary fix to allow the localnet docker-compose.yml from an older commit to run the latest solana programs version. + sed -i 's|ghcr.io/chainflip-io/solana-localnet-ledger:v[0-9.]*|ghcr.io/chainflip-io/solana-localnet-ledger:${{ env.SOLANA_PROGRAMS_VERSION }}|g' localnet/docker-compose.yml ./localnet/manage.sh git reset --hard + # TODO: This is a temporary workaround to insert the image nonces for versioned transactions. Remove after it's is released. + - name: Nonce workaround + if: inputs.run-job + run: | + git checkout ${{ github.sha }} + git rev-parse HEAD + cd bouncer + pnpm install --frozen-lockfile + ./shared/force_sol_nonces.ts + - name: Run bouncer on upgrade-from version 🙅‍♂️ if: inputs.run-job id: pre-upgrade-bouncer diff --git a/bouncer/README.md b/bouncer/README.md index 55dffeb79a4..06375b8f8b4 100644 --- a/bouncer/README.md +++ b/bouncer/README.md @@ -50,3 +50,5 @@ The following commands should be executed from the bouncer directory. `pnpm eslint:check` - Fix linting:
`pnpm eslint:fix` +- Type checking:
+ `pnpm tsc --noEmit` diff --git a/bouncer/commands/setup_vaults.ts b/bouncer/commands/setup_vaults.ts index 6febfdd4ed7..b4685aa32d5 100755 --- a/bouncer/commands/setup_vaults.ts +++ b/bouncer/commands/setup_vaults.ts @@ -71,7 +71,6 @@ async function main(): Promise { } if (result.isInBlock) { console.log('Polkadot Vault created'); - // TODO: figure out type inference so we don't have to coerce using `any` const pureCreated = result.findRecord('proxy', 'PureCreated')!; resolve({ vaultAddress: pureCreated.event.data[0] as AddressOrPair, diff --git a/bouncer/shared/contract_interfaces.ts b/bouncer/shared/contract_interfaces.ts index e9e081a97fc..4003ba4bb18 100644 --- a/bouncer/shared/contract_interfaces.ts +++ b/bouncer/shared/contract_interfaces.ts @@ -13,7 +13,7 @@ function loadContractCached(abiPath: string) { }; } const CF_ETH_CONTRACT_ABI_TAG = 'v1.1.2'; -const CF_SOL_PROGRAM_IDL_TAG = 'v1.0.1-swap-endpoint'; +const CF_SOL_PROGRAM_IDL_TAG = 'v0.1.1-alt-test'; export const getErc20abi = loadContractCached( '../contract-interfaces/eth-contract-abis/IERC20.json', ); diff --git a/bouncer/shared/force_sol_nonces.ts b/bouncer/shared/force_sol_nonces.ts index 9067796539b..7127406e684 100755 --- a/bouncer/shared/force_sol_nonces.ts +++ b/bouncer/shared/force_sol_nonces.ts @@ -16,43 +16,203 @@ async function forceRecoverSolNonce(nonceAddress: string, nonceValue: string) { async function main() { await forceRecoverSolNonce( '2cNMwUCF51djw2xAiiU54wz1WrU8uG4Q8Kp8nfEuwghw', - '2qVz58R5aPmF5Q61VaKXnpWQtngdh4Jgbeko32fEcECu', + 'A6PxZEnTwTrLQG8pVBwytG8YLRqPUeEdsXHJP2UQ5RSF', ); await forceRecoverSolNonce( 'HVG21SovGzMBJDB9AQNuWb6XYq4dDZ6yUwCbRUuFnYDo', - '6fxCujPRyyTPzcZWpkDRhvDC4NXf4GB5tCTbQRDnz2iw', + 'EtK5bRt2pDX3CJyDzsdDtzjRf7v15NPR8JVpMikh6sNh', ); await forceRecoverSolNonce( 'HDYArziNzyuNMrK89igisLrXFe78ti8cvkcxfx4qdU2p', - '2VUnNMpXzohc4284EyuhT7PEuUdqy9E7AfxAP8nrm9cv', + '3PkYapCizvyiFPBEg2pkiBAxnVYfpR2VWs7H6FQcD7rc', ); await forceRecoverSolNonce( 'HLPsNyxBqfq2tLE31v6RiViLp2dTXtJRgHgsWgNDRPs2', - '7bNgRtjaTgCiXwEagFv2cndco5aTzW1dEXGTZp9EDHgE', + 'HqPcXp31mYG1G4DP3c9F262pjXKeMzb4hbAwqsdLKrmM', ); await forceRecoverSolNonce( 'GKMP63TqzbueWTrFYjRwMNkAyTHpQ54notRbAbMDmePM', - 'DSSpXCVb6LU4a91TAkqyUHGXB1bspfLUxKzb5VhGUvyf', + '2cMqnuCCnGWm56LFPe9mZuGHdhzpFpwwv2io9Q99EMjE', ); await forceRecoverSolNonce( 'EpmHm2aSPsB5ZZcDjqDhQ86h1BV32GFCbGSMuC58Y2tn', - 'DEwmxJ6xUTXVMnZjvSsRBb9knA1JG3ETT1CQXz5q3yzY', + '7ZZpMge82HiNhhyv1LDzfwq7Ak9sF943TmLkQNuR7ZZh', ); await forceRecoverSolNonce( '9yBZNMrLrtspj4M7bEf2X6tqbqHxD2vNETw8qSdvJHMa', - 'ERJZ2GKvYB2f7MroWy8qEA3xdvMNHg2DUqjBJ6KVzXYE', + 'Ee2tKBQguV5Rfsa738jBTRCU7vczXkZYnddiqwSRz2Dz', ); await forceRecoverSolNonce( 'J9dT7asYJFGS68NdgDCYjzU2Wi8uBoBusSHN1Z6JLWna', - 'Ecqa1ZZwjS6Lz74k2kXvVKcrWXJNiVGzLqfe1ftBcCYj', + 'BhW9y8kkdBFiWnwzrYihhjhreovZd3TfZE7uaQnKz8ea', ); await forceRecoverSolNonce( 'GUMpVpQFNYJvSbyTtUarZVL7UDUgErKzDTSVJhekUX55', - 'HuksgAnauQ9wTextjMhHVB6oVSCT3GKGb6j1DniSS8eL', + '5CGa6yRJsVStdMR4PkUNGW5F13UeHBuqyurkmNByrgxj', ); await forceRecoverSolNonce( 'AUiHYbzH7qLZSkb3u7nAqtvqC7e41sEzgWjBEvXrpfGv', - '2TR5QRLhPzPzB6Gvs4iZsq6Dp8v5w2LamrE9BFrsNkzW', + 'DCrChXBpKFjq61yYdULyYEnfqtcYkf1ACQqDNkgfwhF9', + ); + await forceRecoverSolNonce( + 'BN2vyodNYQQTrx3gtaDAL2UGGVtZwFeF5M8krE5aYYES', + '4fjG6oYKadvnsbzAzomF5k2Zdc4DuuUyT71nueAeykMW', + ); + await forceRecoverSolNonce( + 'Gwq9TAQCjbJtdnmtxQa3PbHFfbr6YTUBMDjEP9x2uXnH', + 'GK29hbKjKWNwdF4KT11MzkrmQPsYPwE41qZMnLVcQPaS', + ); + await forceRecoverSolNonce( + '3pGbKatko2ckoLEy139McfKiirNgy9brYxieNqFGdN1W', + '5cinXdpw2KAGzmiXXegWJRdDDboXbDHaQaT3WFsH3txb', + ); + await forceRecoverSolNonce( + '9Mcd8BTievK2yTvyiqG9Ft4HfDFf6mjGFBWMnCSRQP8S', + 'DRoAyPDtsg9CCMBSN6egFsWsP2zsQBAxCzN6fAdtQxJU', + ); + await forceRecoverSolNonce( + 'AEZG74RoqM6sxf79eTizq5ShB4JTuCkMVwUgtnC8H94z', + 'G8ZKHMsWFSoKJAtVbm1xgv8VjT5F6YBeiZbbzpVHuuyM', + ); + await forceRecoverSolNonce( + 'APLkgyCWi8DFAMF4KikjTu8YnUG1r7sMjVEfDiaBRZnS', + 'BMUqNXhMoB6VWsR7jHgRcv7yio8L5vjHdGby7gEJ4Pd2', + ); + await forceRecoverSolNonce( + '4ShNXTTHvpVt6bQdZTRdyW6yWXDzrPupdMuxajbEoGE4', + '52yamKJdMiQ5tEUyhkngvjR3XFXp7dmJzYsVsLbPs9JX', + ); + await forceRecoverSolNonce( + 'FgZp6NJYWw15U51ynfXCfU9vq3eVgDDAHMSfJ8fFBZZ8', + 'AX3qKNMBRKZimeCsBEhtp7heeduKekj85a4UpdN34HFe', + ); + await forceRecoverSolNonce( + 'ENQ9Mmg87KFLX8ncXRPDBSd7jhKCtPBi8QzAh4rkREgP', + 'GGFme2ydkkbDzq7LhVDMX5SsFf2yGLf7uKNSLLhvrGMd', + ); + await forceRecoverSolNonce( + 'Hhay1UwkzkFUgrGUYuiCvUwv7kErNzAcZnVRQ2fetT7K', + 'HMN14axscHALAuknuwSpVkEmAJkZWeJoNAjJuXUjRQbN', + ); + await forceRecoverSolNonce( + '2fUVR42opcHgGLrY1eguDXLYfQPHQe9ReJNmRorVt9v8', + 'RWoH6shzxCS9dmW2mg37cujXxARBRBunbHEtZwUz1Gj', + ); + await forceRecoverSolNonce( + 'HfKr1wJASkW5UHs8yNWAqMeaYJdp8K2mdYwkbdVRdVrm', + '2dhBBWYQE2Fvm4ShUQjno8ydJb5H6rUmBZ1e6TJHDupL', + ); + await forceRecoverSolNonce( + 'DrpYkMpJWkpNqX9yYgQfc3uZrCVYobJ3RbTABcSkHJkM', + '6VCThFyLtFCKk35wihyrRUa6dubBU7skhJdRRDBfH4Md', + ); + await forceRecoverSolNonce( + 'HCXc3o2go1Y2KhfnykLYXEvofLifXTb7GT13w4GsFmGw', + 'EggsCqUiKJVxmN7a9s7RScXUAJRjekjwCAaeQvK9TcJ4', + ); + await forceRecoverSolNonce( + 'FFKYhae4HSnMmA6JJfe8NNtZeySA9yRWLaHzE2jqfhBr', + '2E8BayMrqL3on6bhcMms6dsm3PwKcxttFSuHDNe6vZ4B', + ); + await forceRecoverSolNonce( + 'AaRrJovR9Npna4fuCJ17AB3cJAMzoNDaZymRTbGGzUZm', + 'D5bhT4vxhrtkfPeyZbvCtwzAnHSwBaa287CZZU8F6fye', + ); + await forceRecoverSolNonce( + '5S8DzBBLvJUeyJccV4DekAK8KJA5PDcjwxRxCvgdyBEi', + '8o7RkbTeV9r1yMgXaTzjcPys2FEkqieHER6Z5Fdc8hbw', + ); + await forceRecoverSolNonce( + 'Cot1DQZpm859brrre7swrDhTYLj2NJbg3hdMKCHk5zSk', + 'Gd86jHRKKSxrho3WKni5HYe6runTFX4cyFUQtcmJeiuk', + ); + await forceRecoverSolNonce( + '4mfDv7PisvtMhiyGmvD6vxRdVpB842XbUhimAZYxMEn9', + '4YQLN6N7G9nFwT8UVdFE2ZniW1gf89Qjob16wxMThxqN', + ); + await forceRecoverSolNonce( + 'BHW7qFCNHTX5QD5yJpT1hn1VM817Ji5ksZqiXMfqGrsj', + 'Ft3vnX4KQBa22CVpPkmvk5QNMGwL2xhQVxQtFJwK5MvJ', + ); + await forceRecoverSolNonce( + 'EJqZLeaxi2gVsJgQW4nbmxyWJukK25n7jB8qWKoDgWUN', + '5tZeUYorHfdh9FYsA9yKjanFRwxjGxM9YLzNAfiwhZUf', + ); + await forceRecoverSolNonce( + 'BJqTPWyoqqgzhkLh1pbPh4KWBqg8kCUNzJ81avitSQrm', + '5ggDcExaPfgjsmrhBS3D2UnRaEPsCGKGDkJqzF7gr92A', + ); + await forceRecoverSolNonce( + 'EkmPmEmSbwm8EDDYtLtaDgcfuLNtW7MbKx5w3FUpaGjv', + '3G7D13ckfLCfDFC3VusXdittLHp6z6dZeUJBHTqcc2iR', + ); + await forceRecoverSolNonce( + 'CgwtCv8HQ67imnHEkz24TfXfyA2H5jurxcLGxAgDmNQj', + 'Gikpdfo6SwRqi3nTmQKuCmap3cGwupZd2poiYkUop4Sn', + ); + await forceRecoverSolNonce( + 'zfKsXSxJ4cTpKS7S6aHL1Hy3m1CEjQuySKSwkWvukQX', + '43Kn8Kevfy2cy2fpJEhEZSpmPNwFurL2ERG5FqdSeTsq', + ); + await forceRecoverSolNonce( + '2VvN1s6txNYyBdKpaC8b6AZKVqUQiQT2Exrpa7ffCgV6', + 'FVZKFoZ8WRdsFBp64LpTF1MrH36dHym2XZv7cJ2oYU5', + ); + await forceRecoverSolNonce( + 'A2DT1dc4rA1uMry7WCLwoUEQQNjCAsAMkB4X9Lgo88zd', + 'HjtHG8XRKyGiN8VXWmMh9oEviURAv5o2VygKTvsZjAPz', + ); + await forceRecoverSolNonce( + '9mNBRGfTMLsSsQUn4YZfRDBVXfQ6juEWbNUTwv2ir9gC', + '2S1aHds5wqUSyY4BmAK9YyBNGwzsQSsqGa2iyisF8t6h', + ); + await forceRecoverSolNonce( + '3jXiydxPx1P7Ggdja5yt384ryLJAW2c8LRGV8PPRT54C', + 'Hgu6wkD6aE3uuESdW9fCWoXX4sN3eLnxYJsM7QCtrZMk', + ); + await forceRecoverSolNonce( + '7ztGR1z28NpYjUaXyrGBzBGu62u1f9H9Pj9UVSKnT3yu', + '9wic99ejEMQubHea9KKZZk27EU7r4LL8672D5GNrpXRG', + ); + await forceRecoverSolNonce( + '4GdnDTr5X4eJFHuzTEBLrz3tsREo8rQro7S9YDqrbMZ9', + 'FCsgGf33ueodTVhLgQtTriNL5ZGfoaWoBkDwXSbDmLFd', + ); + await forceRecoverSolNonce( + 'ALxnH6TBKJPBFRfFZspQkxDjb9nGLUP5oxFFdZNRFgUu', + 'QkBgGAKFPtQzRj1v7sFECr8D2LMPb99AEy3w1RtKX5j', + ); + await forceRecoverSolNonce( + 'Bu3sdWtBh5TJishgK3vneh2zJg1rjLqWN5mFTHxWspwJ', + 'GWvckQW231Safveswww1GBSu4SzP5h5SgE6gugBn8upC', + ); + await forceRecoverSolNonce( + 'GvBbUTE312RXU5iXAcNWt6CuVbfsPs5Nk28D6qvU6NF3', + 'BnFsZdujQde7FnHGVcZTmvidRHBr5H87XRDDB6A5dn8D', + ); + await forceRecoverSolNonce( + '2LLct8SsnkW3sD9Gu8CfxmDEjKAWtFXqLvA8ymMyuq8u', + 'Bnt1CWn8SEwpNqFbNxby6ysoW49wmL95Ed28pbS9v4Nx', + ); + await forceRecoverSolNonce( + 'CQ9vUhC3dSa4LyZCpWVpNbXhSn6f7J3NQXWDDvMMk6aW', + '2yVSXvwXjtA5tqqWUKjxBuYjME6pKwJGA12NUc31x9VS', + ); + await forceRecoverSolNonce( + 'Cw8GqRmKzCbp7UFfafECC9sf9f936Chgx3BkbSgnXfmU', + 'FDPW3e2qPvNrmi1dqxsMaYAXLq9vMQYda5fKsVzNBUCv', + ); + await forceRecoverSolNonce( + 'GFJ6m6YdNT1tUfAxyD2BiPSx8gwt3xe4jVAKdtdSUt8W', + '4tUTcUePrDUu48ZyH584aYv8JAbPrc9aDcH6bjxhEJon', + ); + await forceRecoverSolNonce( + '7bphTuo5BKs4JJw5WPusCevmnoRk9ocFiB8EGgfwnh4c', + 'SyhFE8iYH9ZsZNBDWLvTDTBFBoEjxs12msF3xprikgf', + ); + await forceRecoverSolNonce( + 'EFbUq18Mcdi2gGauRzmbNeD5ixaB7EYVk5JZgAF34LoS', + '53EBQYjZ7yH3Zy6KCWjSGAUGTki2YjxsHkrfXnvsj9vT', ); } diff --git a/bouncer/shared/initialize_new_chains.ts b/bouncer/shared/initialize_new_chains.ts index 88d308fb5f3..d5af2c45eb9 100644 --- a/bouncer/shared/initialize_new_chains.ts +++ b/bouncer/shared/initialize_new_chains.ts @@ -12,6 +12,7 @@ import { getSolWhaleKeyPair, encodeSolAddress, solanaNumberOfNonces, + solanaNumberOfAdditionalNonces, } from '../shared/utils'; import { sendSol, signAndSendTxSol } from '../shared/send_sol'; import { getSolanaVaultIdl, getKeyManagerAbi } from '../shared/contract_interfaces'; @@ -156,31 +157,31 @@ export async function initializeSolanaPrograms(solClient: Connection, solKey: st programId: solanaVaultProgramId, }), ); - await signAndSendTxSol(tx); + await signAndSendTxSol(tx, false); // Set nonce authority to the new AggKey - tx = new Transaction(); - for (let i = 0; i < solanaNumberOfNonces; i++) { - // Using the index stringified as the seed ('0', '1', '2' ...) - const seed = i.toString(); - - // Deriving the nonceAccounts with index seeds to find the nonce accounts - const nonceAccountPubKey = await PublicKey.createWithSeed( - whaleKeypair.publicKey, - seed, - SystemProgram.programId, - ); - - // Set nonce authority to the new AggKey - tx.add( - SystemProgram.nonceAuthorize({ - noncePubkey: new PublicKey(nonceAccountPubKey), - authorizedPubkey: whaleKeypair.publicKey, - newAuthorizedPubkey: newAggKey, - }), - ); + for (const [nonceNumber, prefix] of [ + [solanaNumberOfNonces, ''], + [solanaNumberOfAdditionalNonces, '-add-nonce'], + ]) { + for (let i = 0; i < Number(nonceNumber); i++) { + const seed = prefix + i.toString(); + const nonceAccountPubKey = await PublicKey.createWithSeed( + whaleKeypair.publicKey, + seed, + SystemProgram.programId, + ); + + tx = new Transaction().add( + SystemProgram.nonceAuthorize({ + noncePubkey: new PublicKey(nonceAccountPubKey), + authorizedPubkey: whaleKeypair.publicKey, + newAuthorizedPubkey: newAggKey, + }), + ); + await signAndSendTxSol(tx, false); + } } - await signAndSendTxSol(tx); // Set Vault's upgrade authority to upgradeSignerPda and enable token support tx = new Transaction().add( @@ -219,7 +220,7 @@ export async function initializeSolanaPrograms(solClient: Connection, solKey: st programId: solanaVaultProgramId, }), ); - await signAndSendTxSol(tx); + await signAndSendTxSol(tx, false); // Set Governance authority to the new AggKey (State Chain) const setGovKeyWithGovKeyDiscriminatorString = vaultIdl.instructions.find( @@ -241,5 +242,5 @@ export async function initializeSolanaPrograms(solClient: Connection, solKey: st programId: solanaVaultProgramId, }), ); - await signAndSendTxSol(tx); + await signAndSendTxSol(tx, false); } diff --git a/bouncer/shared/sol_vault_swap.ts b/bouncer/shared/sol_vault_swap.ts index b6e5e602540..1d67848f340 100644 --- a/bouncer/shared/sol_vault_swap.ts +++ b/bouncer/shared/sol_vault_swap.ts @@ -26,7 +26,7 @@ import { } from './utils'; import { CcmDepositMetadata, DcaParams, FillOrKillParamsX128 } from './new_swap'; -import { SwapEndpoint } from '../../contract-interfaces/sol-program-idls/v1.0.1-swap-endpoint/swap_endpoint'; +import { SwapEndpoint } from '../../contract-interfaces/sol-program-idls/v0.1.1-alt-test/swap_endpoint'; import { getSolanaSwapEndpointIdl } from './contract_interfaces'; import { getChainflipApi } from './utils/substrate'; import { getBalance } from './get_balance'; diff --git a/bouncer/shared/utils.ts b/bouncer/shared/utils.ts index 88990ba0a5c..310dc3d9e28 100644 --- a/bouncer/shared/utils.ts +++ b/bouncer/shared/utils.ts @@ -61,7 +61,9 @@ export type VaultSwapParams = { const isSDKAsset = (asset: Asset): asset is SDKAsset => asset in assetConstants; const isSDKChain = (chain: Chain): chain is SDKChain => chain in chainConstants; -export const solanaNumberOfNonces = 10; +// Nonces deployed in two stages +export const solanaNumberOfNonces: number = 10; +export const solanaNumberOfAdditionalNonces: number = 40; const solCcmAccountsCodec = Struct({ cf_receiver: Struct({ @@ -149,6 +151,8 @@ export function getContractAddress(chain: Chain, contract: string): string { return '2tmtGLQcBd11BMiE9B1tAkQXwmPNgR79Meki2Eme4Ec9'; case 'SWAP_ENDPOINT_NATIVE_VAULT_ACCOUNT': return 'EWaGcrFXhf9Zq8yxSdpAa75kZmDXkRxaP17sYiL6UpZN'; + case 'USER_ADDRESS_LOOKUP_TABLE': + return '4eUGPyr3krnw8tD3rL3UBXXdy1cx8Sf9HKVESZUAatqv'; default: throw new Error(`Unsupported contract: ${contract}`); } @@ -1174,16 +1178,16 @@ export async function checkAvailabilityAllSolanaNonces() { // Check that all Solana nonces are available await using chainflip = await getChainflipApi(); - const maxRetries = 7; // 42 seconds + const maxRetries = 10; // 60 seconds for (let attempt = 0; attempt < maxRetries; attempt++) { const availableNonces = (await chainflip.query.environment.solanaAvailableNonceAccounts()) // eslint-disable-next-line @typescript-eslint/no-explicit-any .toJSON() as any[]; - if (availableNonces.length === solanaNumberOfNonces) { + if (availableNonces.length === solanaNumberOfNonces + solanaNumberOfAdditionalNonces) { break; } else if (attempt === maxRetries - 1) { throw new Error( - `Unexpected number of available nonces: ${availableNonces.length}, expected ${solanaNumberOfNonces}`, + `Unexpected number of available nonces: ${availableNonces.length}, expected ${solanaNumberOfNonces + solanaNumberOfAdditionalNonces}`, ); } else { await sleep(6000); diff --git a/bouncer/tests/solana_vault_settings_governance.ts b/bouncer/tests/solana_vault_settings_governance.ts index 3f22010ddec..a6b7e2ab9fc 100755 --- a/bouncer/tests/solana_vault_settings_governance.ts +++ b/bouncer/tests/solana_vault_settings_governance.ts @@ -9,7 +9,7 @@ import { import { submitGovernanceExtrinsic } from '../shared/cf_governance'; import { ExecutableTest } from '../shared/executable_test'; import { getSolanaVaultIdl } from '../shared/contract_interfaces'; -import { Vault } from '../../contract-interfaces/sol-program-idls/v1.0.1-swap-endpoint/vault'; +import { Vault } from '../../contract-interfaces/sol-program-idls/v0.1.1-alt-test/vault'; /* eslint-disable @typescript-eslint/no-use-before-define */ export const testSolanaVaultSettingsGovernance = new ExecutableTest( diff --git a/contract-interfaces/sol-program-idls/download-sol-program-idls.sh b/contract-interfaces/sol-program-idls/download-sol-program-idls.sh index 6bcd10b839c..6f0c5c18fc8 100755 --- a/contract-interfaces/sol-program-idls/download-sol-program-idls.sh +++ b/contract-interfaces/sol-program-idls/download-sol-program-idls.sh @@ -35,6 +35,7 @@ unzip -u ${ZIP_FILE} \ 'cf_tester.ts' \ 'swap_endpoint.json' \ 'swap_endpoint.ts' \ + 'alt_manager.json' \ -d $TARGET_DIR rm ${ZIP_FILE} \ No newline at end of file diff --git a/contract-interfaces/sol-program-idls/v0.1.1-alt-test/alt_manager.json b/contract-interfaces/sol-program-idls/v0.1.1-alt-test/alt_manager.json new file mode 100644 index 00000000000..7c50cb05293 --- /dev/null +++ b/contract-interfaces/sol-program-idls/v0.1.1-alt-test/alt_manager.json @@ -0,0 +1,371 @@ +{ + "address": "49XegQyykAXwzigc6u7gXbaLjhKfNadWMZwFiovzjwUw", + "metadata": { + "name": "alt_manager", + "version": "0.1.0", + "spec": "0.1.0", + "description": "Created with Anchor" + }, + "instructions": [ + { + "name": "check_remaining_accounts_ix", + "discriminator": [ + 59, + 191, + 203, + 214, + 176, + 149, + 65, + 76 + ], + "accounts": [ + { + "name": "data_account" + } + ], + "args": [] + }, + { + "name": "create_lookup_table", + "discriminator": [ + 74, + 26, + 45, + 214, + 23, + 155, + 143, + 153 + ], + "accounts": [ + { + "name": "data_account" + }, + { + "name": "agg_key", + "signer": true + }, + { + "name": "address_lookup_table_account", + "writable": true + }, + { + "name": "signer_pda", + "pda": { + "seeds": [ + { + "kind": "const", + "value": [ + 97, + 108, + 116, + 95, + 115, + 105, + 103, + 110, + 101, + 114 + ] + } + ] + } + }, + { + "name": "system_program", + "address": "11111111111111111111111111111111" + }, + { + "name": "address_lookup_table_program", + "address": "AddressLookupTab1e1111111111111111111111111" + } + ], + "args": [ + { + "name": "recent_slot", + "type": "u64" + } + ] + }, + { + "name": "extend_protocol_lookup_table", + "discriminator": [ + 7, + 227, + 198, + 1, + 107, + 113, + 31, + 88 + ], + "accounts": [ + { + "name": "data_account" + }, + { + "name": "agg_key", + "signer": true + }, + { + "name": "address_lookup_table_account", + "writable": true + }, + { + "name": "signer_pda", + "pda": { + "seeds": [ + { + "kind": "const", + "value": [ + 97, + 108, + 116, + 95, + 115, + 105, + 103, + 110, + 101, + 114 + ] + } + ] + } + }, + { + "name": "system_program", + "address": "11111111111111111111111111111111" + }, + { + "name": "address_lookup_table_program", + "address": "AddressLookupTab1e1111111111111111111111111" + } + ], + "args": [ + { + "name": "bump", + "type": "u8" + }, + { + "name": "new_addresses", + "type": { + "vec": "pubkey" + } + } + ] + }, + { + "name": "initialize_lookup_table", + "discriminator": [ + 149, + 120, + 10, + 249, + 212, + 185, + 177, + 216 + ], + "accounts": [ + { + "name": "signer", + "signer": true, + "address": "HfasueN6RNPjSM6rKGH5dga6kS2oUF8siGH3m4MXPURp" + }, + { + "name": "address_lookup_table_account", + "writable": true + }, + { + "name": "signer_pda", + "pda": { + "seeds": [ + { + "kind": "const", + "value": [ + 97, + 108, + 116, + 95, + 115, + 105, + 103, + 110, + 101, + 114 + ] + } + ] + } + }, + { + "name": "system_program", + "address": "11111111111111111111111111111111" + }, + { + "name": "address_lookup_table_program", + "address": "AddressLookupTab1e1111111111111111111111111" + } + ], + "args": [ + { + "name": "bump", + "type": "u8" + }, + { + "name": "new_addresses", + "type": { + "vec": "pubkey" + } + } + ] + }, + { + "name": "rotate_nonces", + "discriminator": [ + 98, + 245, + 73, + 119, + 165, + 90, + 57, + 203 + ], + "accounts": [ + { + "name": "data_account" + }, + { + "name": "agg_key", + "signer": true + }, + { + "name": "new_agg_key", + "docs": [ + "NonceAuthorize instruction. However, we pass it as an account to save bytes so only", + "the reference is needed compared to it's address for every instruction." + ] + }, + { + "name": "system_program", + "address": "11111111111111111111111111111111" + } + ], + "args": [] + } + ], + "accounts": [ + { + "name": "DataAccount", + "discriminator": [ + 85, + 240, + 182, + 158, + 76, + 7, + 18, + 233 + ] + } + ], + "errors": [ + { + "code": 6000, + "name": "CreateAltKeyMissmatch", + "msg": "Address lookup table doesn't match" + }, + { + "code": 6001, + "name": "ExtendAltInvalidKey", + "msg": "Address lookup table cant be extended with aggKey" + }, + { + "code": 6002, + "name": "CannotDeserializeAlt", + "msg": "Cant deserialize lookip table account" + }, + { + "code": 6003, + "name": "AddressExtensionLimitReached", + "msg": "Reached the maximum number of addresses that can be initialized" + }, + { + "code": 6004, + "name": "InvalidRemainingAccount", + "msg": "Invalid remaining accounts" + } + ], + "types": [ + { + "name": "DataAccount", + "docs": [ + "* ****************************************************************************\n * *************************** IMPORTANT NOTE *********************************\n * ****************************************************************************\n * If the vault is upgraded and the DataAccount struct is modified we need to\n * check the compatibility and ensure there is a proper migration process, given\n * that the Vault bytecode is the only thing being upgraded, not the data account.\n *\n * The easiest approach on upgrade is keeping the DataAccount unchanged and use\n * a new account struct for any new data that is required.\n *\n * DO NOT MODIFY THIS WITHOUT UNDERSTANDING THE CONSEQUENCES!\n * ****************************************************************************\n * ****************************************************************************" + ], + "type": { + "kind": "struct", + "fields": [ + { + "name": "agg_key", + "type": "pubkey" + }, + { + "name": "gov_key", + "type": "pubkey" + }, + { + "name": "token_vault_pda", + "type": "pubkey" + }, + { + "name": "token_vault_bump", + "type": "u8" + }, + { + "name": "upgrade_signer_pda", + "type": "pubkey" + }, + { + "name": "upgrade_signer_pda_bump", + "type": "u8" + }, + { + "name": "suspended", + "type": "bool" + }, + { + "name": "suspended_legacy_swaps", + "type": "bool" + }, + { + "name": "suspended_event_swaps", + "type": "bool" + }, + { + "name": "min_native_swap_amount", + "type": "u64" + }, + { + "name": "max_dst_address_len", + "type": "u16" + }, + { + "name": "max_ccm_message_len", + "type": "u32" + }, + { + "name": "max_cf_parameters_len", + "type": "u32" + }, + { + "name": "max_event_accounts", + "type": "u32" + } + ] + } + } + ] +} \ No newline at end of file diff --git a/contract-interfaces/sol-program-idls/v1.0.1-swap-endpoint/cf_tester.json b/contract-interfaces/sol-program-idls/v0.1.1-alt-test/cf_tester.json similarity index 100% rename from contract-interfaces/sol-program-idls/v1.0.1-swap-endpoint/cf_tester.json rename to contract-interfaces/sol-program-idls/v0.1.1-alt-test/cf_tester.json diff --git a/contract-interfaces/sol-program-idls/v1.0.1-swap-endpoint/cf_tester.ts b/contract-interfaces/sol-program-idls/v0.1.1-alt-test/cf_tester.ts similarity index 100% rename from contract-interfaces/sol-program-idls/v1.0.1-swap-endpoint/cf_tester.ts rename to contract-interfaces/sol-program-idls/v0.1.1-alt-test/cf_tester.ts diff --git a/contract-interfaces/sol-program-idls/v1.0.1-swap-endpoint/swap_endpoint.json b/contract-interfaces/sol-program-idls/v0.1.1-alt-test/swap_endpoint.json similarity index 100% rename from contract-interfaces/sol-program-idls/v1.0.1-swap-endpoint/swap_endpoint.json rename to contract-interfaces/sol-program-idls/v0.1.1-alt-test/swap_endpoint.json diff --git a/contract-interfaces/sol-program-idls/v1.0.1-swap-endpoint/swap_endpoint.ts b/contract-interfaces/sol-program-idls/v0.1.1-alt-test/swap_endpoint.ts similarity index 100% rename from contract-interfaces/sol-program-idls/v1.0.1-swap-endpoint/swap_endpoint.ts rename to contract-interfaces/sol-program-idls/v0.1.1-alt-test/swap_endpoint.ts diff --git a/contract-interfaces/sol-program-idls/v1.0.1-swap-endpoint/vault.json b/contract-interfaces/sol-program-idls/v0.1.1-alt-test/vault.json similarity index 100% rename from contract-interfaces/sol-program-idls/v1.0.1-swap-endpoint/vault.json rename to contract-interfaces/sol-program-idls/v0.1.1-alt-test/vault.json diff --git a/contract-interfaces/sol-program-idls/v1.0.1-swap-endpoint/vault.ts b/contract-interfaces/sol-program-idls/v0.1.1-alt-test/vault.ts similarity index 100% rename from contract-interfaces/sol-program-idls/v1.0.1-swap-endpoint/vault.ts rename to contract-interfaces/sol-program-idls/v0.1.1-alt-test/vault.ts diff --git a/engine/src/witness/sol.rs b/engine/src/witness/sol.rs index fc70f963128..5618b129356 100644 --- a/engine/src/witness/sol.rs +++ b/engine/src/witness/sol.rs @@ -1,7 +1,8 @@ mod egress_witnessing; +mod lookup_table_witnessing; mod nonce_witnessing; -mod program_swaps_witnessing; mod sol_deposits; +mod vault_swaps_witnessing; use crate::{ elections::voter_api::{CompositeVoter, VoterApi}, @@ -180,7 +181,7 @@ impl VoterApi for SolanaVaultSwapsVoter { settings: ::ElectoralSettings, properties: ::ElectionProperties, ) -> Result>, anyhow::Error> { - program_swaps_witnessing::get_program_swaps( + vault_swaps_witnessing::get_vault_swaps( &self.client, settings.swap_endpoint_data_account_address, properties diff --git a/engine/src/witness/sol/egress_witnessing.rs b/engine/src/witness/sol/egress_witnessing.rs index 67ff1517139..2148e1d9d9c 100644 --- a/engine/src/witness/sol/egress_witnessing.rs +++ b/engine/src/witness/sol/egress_witnessing.rs @@ -35,9 +35,8 @@ pub async fn get_finalized_fee_and_success_status( // doesn't get the tx. But "Processed" is timing out so we better // retry with finalized. commitment: Some(CommitmentConfig::finalized()), - // Using 0 as max_supported_transaction_version to ensure we query all - // transactions regardless of version. This is not strictly necessary, but - // ensures we don't miss anything. + // Query for both Legacy and Versioned transactions since we can + // build both types. max_supported_transaction_version: Some(0), }, ) diff --git a/engine/src/witness/sol/lookup_table_witnessing.rs b/engine/src/witness/sol/lookup_table_witnessing.rs new file mode 100644 index 00000000000..5e779eaad38 --- /dev/null +++ b/engine/src/witness/sol/lookup_table_witnessing.rs @@ -0,0 +1,226 @@ +use cf_chains::sol::SolAddress; +use itertools::Itertools; + +use crate::sol::{ + commitment_config::CommitmentConfig, + retry_rpc::SolRetryRpcApi, + rpc_client_api::{ + ParsedAccount, RpcAccountInfoConfig, UiAccount, UiAccountData, UiAccountEncoding, + }, +}; +use anyhow::{anyhow, Result}; +use serde_json::Value; +use sol_prim::Slot; +use std::str::FromStr; + +// We want to return None if the account is not found or there is any error. It should +// only error if the rpc call fails or returns an unrecognized format respons. That is +// because this address will be provided by the user (user alts) and in case of the address +// not being a valid ALT we still want to reach consensus. +#[allow(dead_code)] +pub async fn get_lookup_table_state( + sol_rpc: &SolRetryRpcClient, + lookup_table_address: SolAddress, +) -> Result>, anyhow::Error> +where + SolRetryRpcClient: SolRetryRpcApi + Send + Sync + Clone, +{ + let account_info = sol_rpc + .get_multiple_accounts( + &[lookup_table_address], + RpcAccountInfoConfig { + encoding: Some(UiAccountEncoding::JsonParsed), + data_slice: None, + commitment: Some(CommitmentConfig::finalized()), + min_context_slot: None, + }, + ) + .await + .value + .into_iter() + .exactly_one() + .expect("We queried for exactly one account."); + + match account_info { + Some(UiAccount { + data: UiAccountData::Json(ParsedAccount { program, space: _, parsed }), + owner, + .. + }) => { + if program != "address-lookup-table" { + tracing::info!("Program is not an address lookup table: {}", program); + return Ok(None); + } + + let owner_address = SolAddress::from_str(owner.as_str()).unwrap(); + + if owner_address != sol_prim::consts::ADDRESS_LOOKUP_TABLE_PROGRAM { + tracing::info!("Owner is not address lookup table program: {}", owner); + return Ok(None); + } + + let info = match parsed.get("info").and_then(Value::as_object) { + Some(value) => value, + None => { + tracing::info!("Failed to parse the info: {}", parsed); + return Ok(None); + }, + }; + + let deactivation_slot: Slot = Slot::from_str( + info.get("deactivationSlot").and_then(Value::as_str).ok_or(anyhow!( + "Deactivation slot not found in address lookup table account info: {:?}", + info + ))?, + )?; + + // Address lookup table is being deactivated + if deactivation_slot != Slot::MAX { + return Ok(None); + } + let addresses = info.get("addresses").and_then(Value::as_array).ok_or(anyhow!( + "Addresses not found in address lookup table account info: {:?}", + info + ))?; + + let addresses_vector: Vec = addresses + .iter() + .filter_map(|address| address.as_str()) + .map(|address| SolAddress::from_str(address).unwrap()) + .collect(); + + // We might want to return an AddressLookupTable Account type, it depends on how the + // elections are setup. + Ok(Some(addresses_vector)) + }, + // If the account is not JsonParsed as a Lookup Table we assume it's either empty or another + // account. We can also consider not returning an Option and instead return an empty + // vector if the ALT is not found. + Some(_) => { + tracing::info!( + "Address lookup table account encoding is not JsonParsed for account {:?}: {:?}", + lookup_table_address, + account_info + ); + Ok(None) + }, + None => Ok(None), + } +} + +#[cfg(test)] +mod tests { + use crate::{ + settings::{HttpEndpoint, NodeContainer}, + sol::retry_rpc::SolRetryRpcClient, + }; + + use cf_chains::{Chain, Solana}; + use cf_utilities::task_scope; + use futures_util::FutureExt; + use std::str::FromStr; + + use super::*; + + #[tokio::test] + #[ignore = "requires an external endpoint"] + async fn test_get_lookup_table_state() { + task_scope::task_scope(|scope| { + async { + let client = SolRetryRpcClient::new( + scope, + NodeContainer { + primary: HttpEndpoint { + // http_endpoint: "http://0.0.0.0:8899".into(), + http_endpoint: "https://api.mainnet-beta.solana.com".into(), + }, + backup: None, + }, + None, + Solana::WITNESS_PERIOD, + ) + .await + .unwrap(); + + // Mainnet-beta deployed address lookup table account + let mainnet_alt_address: SolAddress = + SolAddress::from_str("2immgwYNHBbyVQKVGCEkgWpi53bLwWNRMB5G2nbgYV17").unwrap(); + + let addresses = + get_lookup_table_state(&client, mainnet_alt_address).await.unwrap().unwrap(); + + // Check the first one just to make sure it's working + assert_eq!( + addresses.first().unwrap(), + &SolAddress::from_str("11111111111111111111111111111111").unwrap() + ); + + // Test that a program will return None and not error + let addresses = get_lookup_table_state( + &client, + SolAddress::from_str("JUP6LkbZbjS1jKKwapdHNy74zcZ3tLUZoi5QNyVTaV4").unwrap(), + ) + .await + .unwrap(); + assert_eq!(addresses, None); + + // Test a non existing address + let addresses = get_lookup_table_state( + &client, + SolAddress::from_str("6UzppnNP2baug3BisB9Mb1J5t43hV1YcawUtPXHchoHS").unwrap(), + ) + .await + .unwrap(); + assert_eq!(addresses, None); + + Ok(()) + } + .boxed() + }) + .await + .unwrap(); + } + + #[tokio::test] + #[ignore = "requires an external endpoint"] + async fn test_get_non_lookup_table() { + task_scope::task_scope(|scope| { + async { + let client = SolRetryRpcClient::new( + scope, + NodeContainer { + primary: HttpEndpoint { + http_endpoint: "https://api.mainnet-beta.solana.com".into(), + }, + backup: None, + }, + None, + Solana::WITNESS_PERIOD, + ) + .await + .unwrap(); + + let mainnet_empty_address: SolAddress = + SolAddress::from_str("ASriuNGwqUosyrUYNrpjMNUsGYAKFAVB4e3bVpeaRC7Y").unwrap(); + + let addresses = + get_lookup_table_state(&client, mainnet_empty_address).await.unwrap(); + + assert_eq!(addresses, None); + + let mainnet_nonce_account: SolAddress = + SolAddress::from_str("3bVqyf58hQHsxbjnqnSkopnoyEHB9v9KQwhZj7h1DucW").unwrap(); + + let addresses = + get_lookup_table_state(&client, mainnet_nonce_account).await.unwrap(); + + assert_eq!(addresses, None); + + Ok(()) + } + .boxed() + }) + .await + .unwrap(); + } +} diff --git a/engine/src/witness/sol/program_swaps_witnessing.rs b/engine/src/witness/sol/vault_swaps_witnessing.rs similarity index 99% rename from engine/src/witness/sol/program_swaps_witnessing.rs rename to engine/src/witness/sol/vault_swaps_witnessing.rs index c8a19d909a1..feca8db0f37 100644 --- a/engine/src/witness/sol/program_swaps_witnessing.rs +++ b/engine/src/witness/sol/vault_swaps_witnessing.rs @@ -39,7 +39,7 @@ const MAX_MULTIPLE_EVENT_ACCOUNTS_QUERY: usize = 10; // 5. If they are not seen in the SC we query the account data. Then we parse the account data and // ensure it's a valid a program swap. The new program swap needs to be reported to the SC. -pub async fn get_program_swaps( +pub async fn get_vault_swaps( sol_rpc: &SolRetryRpcClient, swap_endpoint_data_account_address: SolAddress, sc_open_accounts: HashSet, diff --git a/foreign-chains/solana/sol-prim/src/alt.rs b/foreign-chains/solana/sol-prim/src/alt.rs index a834961f376..197d9d7a19c 100644 --- a/foreign-chains/solana/sol-prim/src/alt.rs +++ b/foreign-chains/solana/sol-prim/src/alt.rs @@ -26,7 +26,9 @@ pub struct MessageAddressTableLookup { /// The definition of address lookup table accounts. /// /// As used by the `crate::message::v0` message format. -#[derive(Debug, PartialEq, Eq, Clone)] +#[derive( + Debug, PartialEq, Eq, Clone, Encode, Decode, Serialize, Deserialize, TypeInfo, Default, +)] pub struct AddressLookupTableAccount { pub key: Pubkey, pub addresses: Vec, diff --git a/foreign-chains/solana/sol-prim/src/consts.rs b/foreign-chains/solana/sol-prim/src/consts.rs index b52e02624ba..42bde45a112 100644 --- a/foreign-chains/solana/sol-prim/src/consts.rs +++ b/foreign-chains/solana/sol-prim/src/consts.rs @@ -44,6 +44,8 @@ pub const BPF_LOADER_UPGRADEABLE_ID: Address = const_address("BPFLoaderUpgradeab1e11111111111111111111111"); pub const COMPUTE_BUDGET_PROGRAM: Address = const_address("ComputeBudget111111111111111111111111111111"); +pub const ADDRESS_LOOKUP_TABLE_PROGRAM: Address = + const_address("AddressLookupTab1e1111111111111111111111111"); pub const MAX_TRANSACTION_LENGTH: usize = 1_232usize; pub const MAX_COMPUTE_UNITS_PER_TRANSACTION: u32 = 1_400_000u32; @@ -57,4 +59,4 @@ pub const SOL_USDC_DECIMAL: u8 = 6u8; pub const ACCOUNT_KEY_LENGTH_IN_TRANSACTION: usize = 32usize; pub const ACCOUNT_REFERENCE_LENGTH_IN_TRANSACTION: usize = 1usize; -pub const MAX_CCM_USER_ALTS: u8 = 5u8; // TODO: Albert come up with a good number for this +pub const MAX_CCM_USER_ALTS: u8 = 3u8; diff --git a/foreign-chains/solana/sol-prim/src/instructions/program_instructions.rs b/foreign-chains/solana/sol-prim/src/instructions/program_instructions.rs index f4663d77d61..8a89f994867 100644 --- a/foreign-chains/solana/sol-prim/src/instructions/program_instructions.rs +++ b/foreign-chains/solana/sol-prim/src/instructions/program_instructions.rs @@ -900,6 +900,29 @@ pub mod swap_endpoints { pub type SwapTokenParams = types::SwapTokenParams; } +pub mod alt_managers { + use super::*; + + solana_program!( + idl_path: concat!( + env!("CF_SOL_PROGRAM_IDL_ROOT"), "/", + env!("CF_SOL_PROGRAM_IDL_TAG"), "/" , + "alt_manager.json" + ), + AltManagerProgram { + rotate_nonces => RotateNonces { + args: [], + account_metas: [ + data_account: { signer: false, writable: false }, + agg_key: { signer: true, writable: false }, + new_agg_key: { signer: false, writable: false }, + system_program: { signer: false, writable: false }, + ] + }, + } + ); +} + #[cfg(test)] mod idl { use serde::{Deserialize, Serialize}; diff --git a/foreign-chains/solana/sol-prim/src/lib.rs b/foreign-chains/solana/sol-prim/src/lib.rs index b01db1bc012..8a1fcc86817 100644 --- a/foreign-chains/solana/sol-prim/src/lib.rs +++ b/foreign-chains/solana/sol-prim/src/lib.rs @@ -39,6 +39,7 @@ pub type Amount = u64; pub type SlotNumber = u64; pub type ComputeLimit = u32; pub type AccountBump = u8; +pub type Slot = u64; use crate::consts::{HASH_BYTES, MAX_BASE58_LEN, SOLANA_SIGNATURE_LEN}; diff --git a/localnet/common.sh b/localnet/common.sh index 95792117b2d..150cfb73b49 100644 --- a/localnet/common.sh +++ b/localnet/common.sh @@ -102,9 +102,6 @@ build-localnet() { REPLY=$(check_endpoint_health -H "Content-Type: application/json" -s -d '{"id":1, "jsonrpc":"2.0", "method": "chain_getBlockHash", "params":[0]}' 'http://localhost:9947') || [ -z $(echo $REPLY | grep -o '\"result\":\"0x[^"]*' | grep -o '0x.*') ] DOT_GENESIS_HASH=$(echo $REPLY | grep -o '\"result\":\"0x[^"]*' | grep -o '0x.*') - echo "🐛 Fix solana symlink issue ..." - ln -sf $SOLANA_BASE_PATH/test-ledger/accounts/snapshot/100 $SOLANA_BASE_PATH/test-ledger/snapshot/100/accounts_hardlinks/account_path_0 - if which solana-test-validator >>$DEBUG_OUTPUT_DESTINATION 2>&1; then echo "☀️ Waiting for Solana node to start" ./localnet/init/scripts/start-solana.sh diff --git a/localnet/docker-compose.yml b/localnet/docker-compose.yml index 3e5ec0f5022..c03293f0ffa 100644 --- a/localnet/docker-compose.yml +++ b/localnet/docker-compose.yml @@ -9,7 +9,7 @@ services: command: /bin/sh -c "cp -R /initial-state/* /localnet-initial-state" solana-init: - image: ghcr.io/chainflip-io/solana-localnet-ledger:v1.0.1-swap-endpoint + image: ghcr.io/chainflip-io/solana-localnet-ledger:v0.1.1-alt-test pull_policy: if_not_present container_name: init-solana platform: linux/amd64 diff --git a/state-chain/cf-integration-tests/src/solana.rs b/state-chain/cf-integration-tests/src/solana.rs index a0f0749603a..3eb75f0fe46 100644 --- a/state-chain/cf-integration-tests/src/solana.rs +++ b/state-chain/cf-integration-tests/src/solana.rs @@ -11,8 +11,7 @@ use cf_chains::{ api::{SolanaApi, SolanaEnvironment, SolanaTransactionBuildingError}, sol_tx_core::sol_test_values, transaction_builder::SolanaTransactionBuilder, - SolAddress, SolApiEnvironment, SolCcmAccounts, SolCcmAddress, SolHash, SolPubkey, - SolanaCrypto, + SolAddress, SolCcmAccounts, SolCcmAddress, SolHash, SolPubkey, SolanaCrypto, }, CcmChannelMetadata, CcmDepositMetadata, Chain, ChannelRefundParameters, ExecutexSwapAndCallError, ForeignChainAddress, RequiresSignatureRefresh, SetAggKeyWithAggKey, @@ -76,15 +75,7 @@ type SolanaElectionVote = BoundedBTreeMap< fn setup_sol_environments() { // Environment::SolanaApiEnvironment - pallet_cf_environment::SolanaApiEnvironment::::set(SolApiEnvironment { - vault_program: sol_test_values::VAULT_PROGRAM, - vault_program_data_account: sol_test_values::VAULT_PROGRAM_DATA_ACCOUNT, - token_vault_pda_account: sol_test_values::TOKEN_VAULT_PDA_ACCOUNT, - usdc_token_mint_pubkey: sol_test_values::USDC_TOKEN_MINT_PUB_KEY, - usdc_token_vault_ata: sol_test_values::USDC_TOKEN_VAULT_ASSOCIATED_TOKEN_ACCOUNT, - swap_endpoint_program: sol_test_values::SWAP_ENDPOINT_PROGRAM, - swap_endpoint_program_data_account: sol_test_values::SWAP_ENDPOINT_PROGRAM_DATA_ACCOUNT, - }); + pallet_cf_environment::SolanaApiEnvironment::::set(sol_test_values::api_env()); // Environment::AvailableDurableNonces pallet_cf_environment::SolanaAvailableNonceAccounts::::set( @@ -536,7 +527,7 @@ fn solana_ccm_fails_with_invalid_input() { } #[test] -fn failed_ccm_does_not_consume_durable_nonce() { +fn failed_rotation_does_not_consume_durable_nonce() { const EPOCH_BLOCKS: u32 = 100; const MAX_AUTHORITIES: AuthorityCount = 10; super::genesis::with_test_defaults() @@ -569,7 +560,7 @@ fn failed_ccm_does_not_consume_durable_nonce() { // Failed Rotate Key message does not consume DurableNonce // Add extra Durable nonces to make RotateAggkey too long - let available_nonces = (0..20) + let available_nonces = (0..100) .map(|x| (SolAddress([x as u8; 32]), SolHash::default())) .collect::>(); pallet_cf_environment::SolanaAvailableNonceAccounts::::set( diff --git a/state-chain/chains/src/sol.rs b/state-chain/chains/src/sol.rs index 607f41513b7..93ecfc91905 100644 --- a/state-chain/chains/src/sol.rs +++ b/state-chain/chains/src/sol.rs @@ -37,9 +37,10 @@ pub use sol_prim::{ VersionedTransaction as SolVersionedTransaction, }, Address as SolAddress, AddressLookupTableAccount as SolAddressLookupTableAccount, - Amount as SolAmount, ComputeLimit as SolComputeLimit, Digest as SolHash, Hash as RawSolHash, - Instruction as SolInstruction, InstructionRpc as SolInstructionRpc, Pubkey as SolPubkey, - Signature as SolSignature, SlotNumber as SolBlockNumber, + AddressLookupTableAccount, Amount as SolAmount, ComputeLimit as SolComputeLimit, + Digest as SolHash, Hash as RawSolHash, Instruction as SolInstruction, + InstructionRpc as SolInstructionRpc, Pubkey as SolPubkey, Signature as SolSignature, + SlotNumber as SolBlockNumber, }; pub use sol_tx_core::{ rpc_types, AccountMeta as SolAccountMeta, CcmAccounts as SolCcmAccounts, @@ -167,7 +168,8 @@ pub mod compute_units_costs { pub const COMPUTE_UNITS_PER_TRANSFER_NATIVE: SolComputeLimit = 150u32; pub const COMPUTE_UNITS_PER_FETCH_TOKEN: SolComputeLimit = 45_000u32; pub const COMPUTE_UNITS_PER_TRANSFER_TOKEN: SolComputeLimit = 50_000u32; - pub const COMPUTE_UNITS_PER_ROTATION: SolComputeLimit = 8_000u32; + pub const COMPUTE_UNITS_PER_ROTATION: SolComputeLimit = 5_000u32; + pub const COMPUTE_UNITS_PER_NONCE_ROTATION: SolComputeLimit = 4_000u32; pub const COMPUTE_UNITS_PER_SET_GOV_KEY: SolComputeLimit = 15_000u32; pub const COMPUTE_UNITS_PER_BUMP_DERIVATION: SolComputeLimit = 2_000u32; pub const COMPUTE_UNITS_PER_FETCH_AND_CLOSE_VAULT_SWAP_ACCOUNTS: SolComputeLimit = 20_000u32; @@ -451,7 +453,7 @@ pub mod signing_key { /// Solana Environment variables used when building the base API call. #[derive( - Encode, Decode, TypeInfo, Default, Copy, Clone, PartialEq, Eq, Debug, Serialize, Deserialize, + Encode, Decode, TypeInfo, Default, Clone, PartialEq, Eq, Debug, Serialize, Deserialize, )] pub struct SolApiEnvironment { // For native Sol API calls. @@ -468,6 +470,8 @@ pub struct SolApiEnvironment { // For program swaps API calls. pub swap_endpoint_program: SolAddress, pub swap_endpoint_program_data_account: SolAddress, + pub alt_manager_program: SolAddress, + pub address_lookup_table_account: AddressLookupTableAccount, } impl DepositDetailsToTransactionInId for () {} diff --git a/state-chain/chains/src/sol/api.rs b/state-chain/chains/src/sol/api.rs index de1085de940..016d83c2175 100644 --- a/state-chain/chains/src/sol/api.rs +++ b/state-chain/chains/src/sol/api.rs @@ -44,8 +44,6 @@ pub struct CurrentAggKey; pub struct CurrentOnChainKey; #[derive(Clone, Encode, Decode, PartialEq, Debug, TypeInfo)] pub struct SolanaAddressLookupTables(pub SwapRequestId); -#[derive(Clone, Encode, Decode, PartialEq, Debug, TypeInfo)] -pub struct ChainflipAddressLookupTable; pub type DurableNonceAndAccount = (SolAddress, SolHash); @@ -78,7 +76,6 @@ pub trait SolanaEnvironment: + ChainEnvironment + ChainEnvironment> + ChainEnvironment> - + ChainEnvironment + RecoverDurableNonce { fn compute_price() -> Result { @@ -110,18 +107,9 @@ pub trait SolanaEnvironment: .ok_or(SolanaTransactionBuildingError::NoNonceAccountsSet) } - /// Get all relevant Address lookup tables from the Environment. - /// Returns Chainflip's ALT proceeded with user's ALTs. - fn get_address_lookup_tables(id: Option) -> Vec { - let mut alts = Self::get_cf_address_lookup_table().map(|alt| vec![alt]).unwrap_or_default(); - if let Some(id) = id { - alts.extend(Self::lookup(SolanaAddressLookupTables(id)).unwrap_or_default()); - } - alts - } - - fn get_cf_address_lookup_table() -> Option { - Self::lookup(ChainflipAddressLookupTable) + /// Get any user-defined Address lookup tables from the Environment. + fn get_address_lookup_tables(id: SwapRequestId) -> Vec { + Self::lookup(SolanaAddressLookupTables(id)).unwrap_or_default() } } @@ -248,7 +236,6 @@ impl SolanaApi { let sol_api_environment = Environment::api_environment()?; let compute_price = Environment::compute_price()?; let durable_nonce = Environment::nonce_account()?; - let address_lookup_tables = Environment::get_address_lookup_tables(None); // Build the transaction let transaction = SolanaTransactionBuilder::fetch_from( @@ -257,7 +244,6 @@ impl SolanaApi { agg_key, durable_nonce, compute_price, - address_lookup_tables, )?; Ok(Self { @@ -275,7 +261,6 @@ impl SolanaApi { let agg_key = Environment::current_agg_key()?; let sol_api_environment = Environment::api_environment()?; let compute_price = Environment::compute_price()?; - let address_lookup_tables = Environment::get_address_lookup_tables(None); transfer_params .into_iter() @@ -308,7 +293,7 @@ impl SolanaApi { durable_nonce, compute_price, SOL_USDC_DECIMAL, - address_lookup_tables.clone(), + vec![sol_api_environment.address_lookup_table_account.clone()], ) }, }?; @@ -333,7 +318,6 @@ impl SolanaApi { let nonce_accounts = Environment::all_nonce_accounts()?; let compute_price = Environment::compute_price()?; let durable_nonce = Environment::nonce_account()?; - let address_lookup_tables = Environment::get_address_lookup_tables(None); // Build the transaction let transaction = SolanaTransactionBuilder::rotate_agg_key( @@ -342,9 +326,10 @@ impl SolanaApi { sol_api_environment.vault_program, sol_api_environment.vault_program_data_account, agg_key, + sol_api_environment.alt_manager_program, durable_nonce, compute_price, - address_lookup_tables, + vec![sol_api_environment.address_lookup_table_account], ) .inspect_err(|e| { // Vault Rotation call building NOT transactional - meaning when this fails, @@ -411,8 +396,11 @@ impl SolanaApi { let sol_api_environment = Environment::api_environment()?; let agg_key = Environment::current_agg_key()?; + + // Get the Address lookup tables. Chainflip's ALT is proceeded with the User's. // TODO roy: Coordinate with Ramiz on the interface for getting ALTS - let address_lookup_tables = Environment::get_address_lookup_tables(Some(swap_request_id)); + let mut address_lookup_tables = vec![sol_api_environment.address_lookup_table_account]; + address_lookup_tables.extend(Environment::get_address_lookup_tables(swap_request_id)); // Ensure the CCM parameters do not contain blacklisted accounts. check_ccm_for_blacklisted_accounts( @@ -510,7 +498,6 @@ impl SolanaApi { let sol_api_environment = Environment::api_environment()?; let compute_price = Environment::compute_price()?; let durable_nonce = Environment::nonce_account()?; - let address_lookup_tables = Environment::get_address_lookup_tables(None); // Build the transaction let transaction = SolanaTransactionBuilder::fetch_and_close_vault_swap_accounts( @@ -521,7 +508,7 @@ impl SolanaApi { agg_key, durable_nonce, compute_price, - address_lookup_tables, + vec![sol_api_environment.address_lookup_table_account], )?; Ok(Self { @@ -544,7 +531,6 @@ impl SolanaApi { let sol_api_environment = Environment::api_environment()?; let compute_price = Environment::compute_price()?; let durable_nonce = Environment::nonce_account()?; - let address_lookup_tables = Environment::get_address_lookup_tables(None); // Build the transaction let transaction = SolanaTransactionBuilder::set_program_swaps_parameters( @@ -560,7 +546,7 @@ impl SolanaApi { agg_key, durable_nonce, compute_price, - address_lookup_tables, + vec![sol_api_environment.address_lookup_table_account], )?; Ok(Self { @@ -579,7 +565,6 @@ impl SolanaApi { let sol_api_environment = Environment::api_environment()?; let compute_price = Environment::compute_price()?; let durable_nonce = Environment::nonce_account()?; - let address_lookup_tables = Environment::get_address_lookup_tables(None); // Build the transaction let transaction = SolanaTransactionBuilder::enable_token_support( @@ -592,7 +577,7 @@ impl SolanaApi { agg_key, durable_nonce, compute_price, - address_lookup_tables, + vec![sol_api_environment.address_lookup_table_account], )?; Ok(Self { @@ -734,7 +719,6 @@ impl SetGovKeyWithAggKey for Solan let sol_api_environment = Environment::api_environment().map_err(|_e| ())?; let compute_price = Environment::compute_price().map_err(|_e| ())?; let durable_nonce = Environment::nonce_account().map_err(|_e| ())?; - let address_lookup_tables = Environment::get_address_lookup_tables(None); // Build the transaction let transaction = SolanaTransactionBuilder::set_gov_key_with_agg_key( @@ -744,7 +728,7 @@ impl SetGovKeyWithAggKey for Solan agg_key, durable_nonce, compute_price, - address_lookup_tables, + vec![sol_api_environment.address_lookup_table_account], ) .map_err(|e| { // SetGovKeyWithAggKey call building NOT transactional - meaning when this fails, diff --git a/state-chain/chains/src/sol/sol_tx_core.rs b/state-chain/chains/src/sol/sol_tx_core.rs index d9a7132d64e..7fa6df23d69 100644 --- a/state-chain/chains/src/sol/sol_tx_core.rs +++ b/state-chain/chains/src/sol/sol_tx_core.rs @@ -166,6 +166,10 @@ pub mod sol_test_values { const_address("35uYgHdfZQT4kHkaaXQ6ZdCkK5LFrsk43btTLbGCRCNT"); pub const SWAP_ENDPOINT_PROGRAM_DATA_ACCOUNT: SolAddress = const_address("2tmtGLQcBd11BMiE9B1tAkQXwmPNgR79Meki2Eme4Ec9"); + pub const ALT_MANAGER_PROGRAM: SolAddress = + const_address("49XegQyykAXwzigc6u7gXbaLjhKfNadWMZwFiovzjwUw"); + pub const ADDRESS_LOOKUP_TABLE_ACCOUNT: SolAddress = + const_address("7drVSq2ymJLNnXyCciHbNqHyzuSt1SL4iQSEThiESN2c"); pub const EVENT_AND_SENDER_ACCOUNTS: [VaultSwapAccountAndSender; 11] = [ VaultSwapAccountAndSender { vault_swap_account: const_address("2cHcSNtikMpjxJfwwoYL3udpy7hedRExyhakk2eZ6cYA"), @@ -248,6 +252,8 @@ pub mod sol_test_values { usdc_token_vault_ata: USDC_TOKEN_VAULT_ASSOCIATED_TOKEN_ACCOUNT, swap_endpoint_program: SWAP_ENDPOINT_PROGRAM, swap_endpoint_program_data_account: SWAP_ENDPOINT_PROGRAM_DATA_ACCOUNT, + alt_manager_program: ALT_MANAGER_PROGRAM, + address_lookup_table_account: user_alt(), } } @@ -331,10 +337,7 @@ pub mod sol_test_values { } pub fn user_alt() -> SolAddressLookupTableAccount { - SolAddressLookupTableAccount { - key: const_address("3VBLeVu7rZciyk19M9V7VbHBM2uFm9YbnKKPB33mGRW8").into(), - addresses: vec![TRANSFER_TO_ACCOUNT.into()], - } + SolAddressLookupTableAccount { key: ADDRESS_LOOKUP_TABLE_ACCOUNT.into(), addresses: vec![] } } #[track_caller] diff --git a/state-chain/chains/src/sol/transaction_builder.rs b/state-chain/chains/src/sol/transaction_builder.rs index fed9c8aa220..0231fea6ca5 100644 --- a/state-chain/chains/src/sol/transaction_builder.rs +++ b/state-chain/chains/src/sol/transaction_builder.rs @@ -12,9 +12,10 @@ use crate::{ COMPUTE_UNITS_PER_BUMP_DERIVATION, COMPUTE_UNITS_PER_CLOSE_ACCOUNT, COMPUTE_UNITS_PER_ENABLE_TOKEN_SUPPORT, COMPUTE_UNITS_PER_FETCH_AND_CLOSE_VAULT_SWAP_ACCOUNTS, COMPUTE_UNITS_PER_FETCH_NATIVE, - COMPUTE_UNITS_PER_FETCH_TOKEN, COMPUTE_UNITS_PER_ROTATION, - COMPUTE_UNITS_PER_SET_GOV_KEY, COMPUTE_UNITS_PER_SET_PROGRAM_SWAPS_PARAMS, - COMPUTE_UNITS_PER_TRANSFER_NATIVE, COMPUTE_UNITS_PER_TRANSFER_TOKEN, + COMPUTE_UNITS_PER_FETCH_TOKEN, COMPUTE_UNITS_PER_NONCE_ROTATION, + COMPUTE_UNITS_PER_ROTATION, COMPUTE_UNITS_PER_SET_GOV_KEY, + COMPUTE_UNITS_PER_SET_PROGRAM_SWAPS_PARAMS, COMPUTE_UNITS_PER_TRANSFER_NATIVE, + COMPUTE_UNITS_PER_TRANSFER_TOKEN, }, sol_tx_core::{ address_derivation::{ @@ -27,8 +28,8 @@ use crate::{ TOKEN_PROGRAM_ID, }, program_instructions::{ - swap_endpoints::SwapEndpointProgram, InstructionExt, SystemProgramInstruction, - VaultProgram, + alt_managers::AltManagerProgram, swap_endpoints::SwapEndpointProgram, + InstructionExt, SystemProgramInstruction, VaultProgram, }, token_instructions::AssociatedTokenAccountInstruction, AccountMeta, @@ -119,7 +120,6 @@ impl SolanaTransactionBuilder { agg_key: SolAddress, durable_nonce: DurableNonceAndAccount, compute_price: SolAmount, - address_lookup_tables: Vec, ) -> Result { let mut compute_limit: SolComputeLimit = BASE_COMPUTE_UNITS_PER_TX; let instructions = fetch_params @@ -190,7 +190,7 @@ impl SolanaTransactionBuilder { agg_key.into(), compute_price, compute_limit_with_buffer(compute_limit), - address_lookup_tables, + vec![sol_api_environment.address_lookup_table_account], ) } @@ -271,31 +271,45 @@ impl SolanaTransactionBuilder { vault_program: SolAddress, vault_program_data_account: SolAddress, agg_key: SolAddress, + alt_manager: SolAddress, durable_nonce: DurableNonceAndAccount, compute_price: SolAmount, address_lookup_tables: Vec, ) -> Result { - let mut instructions = vec![VaultProgram::with_id(vault_program).rotate_agg_key( - false, - vault_program_data_account, - agg_key, - new_agg_key, - system_program_id(), - )]; - instructions.extend(all_nonce_accounts.into_iter().map(|nonce_account| { - SystemProgramInstruction::nonce_authorize( - &nonce_account.into(), - &agg_key.into(), - &new_agg_key.into(), - ) - })); + let number_of_nonces = all_nonce_accounts.len() as u32; + let all_nonce_accounts_meta: Vec = all_nonce_accounts + .into_iter() + .map(|nonce_account| AccountMeta::new(nonce_account.into(), false)) + .collect(); + + // Rotate nonces must come before the agg Key rotation, otherwise the aggKey + // validation will fail on the rotate nonces instruction. + let instructions = vec![ + AltManagerProgram::with_id(alt_manager) + .rotate_nonces( + vault_program_data_account, + agg_key, + new_agg_key, + system_program_id(), + ) + .with_additional_accounts(all_nonce_accounts_meta), + VaultProgram::with_id(vault_program).rotate_agg_key( + false, + vault_program_data_account, + agg_key, + new_agg_key, + system_program_id(), + ), + ]; Self::build( instructions, durable_nonce, agg_key.into(), compute_price, - compute_limit_with_buffer(COMPUTE_UNITS_PER_ROTATION), + compute_limit_with_buffer( + COMPUTE_UNITS_PER_ROTATION + COMPUTE_UNITS_PER_NONCE_ROTATION * number_of_nonces, + ), address_lookup_tables, ) } @@ -599,12 +613,11 @@ pub mod test { agg_key(), durable_nonce(), compute_price(), - vec![chainflip_alt()], ) .unwrap(); // Serialized tx built in `create_fetch_native` test - let expected_serialized_tx = hex_literal::hex!("014c9e86bf4a01223aaad71560605c3bf8925aebaec28dad02ae7008290cf3682e649ab82d087c387d5ae72d362852737ce5802d48b17e054500bf8ad40787890e8001000407f79d5e026f12edc6443a534b2cdd5072233989b415d7596573e743f3e5b386fb3a4539fbb757256442c16343f639b15db95c39a6d35721439f7f94f5c8776b7bfd35d0bf8686de2e369c3d97a8033b31e6bc33518629f59314bc3d9050956c8d00000000000000000000000000000000000000000000000000000000000000000306466fe5211732ffecadba72c39be7bc8ce5bbc5f7126b2c439b3a4000000006a7d517192c568ee08a845f73d29788cf035c3145b21ab344d8062ea940000072b5d2051d300b10b74314b7e25ace9998ca66eb2c7fbc10ef130dd67028293cc27e9074fac5e8d36cf04f94a0606fdd8ddbb420e99a489c7915ce5699e489000403030705000404000000040009038096980000000000040005021f95000006050800020103158e24658f6c59298c080000000b0c0d3700000000fc013001afd71da9456a977233960b08eba77d2e3690b8c7259637c8fb8f82cf58a101090102").to_vec(); + let expected_serialized_tx = hex_literal::hex!("0183f284c4160d449a41f0a7b30c3710a7e1876d514ef6d87b89a35ae203d50c6928b1dcd2f821496ac4027bfd84e07f921a912537e3d3f3cd4530935b0cae36028001000509f79d5e026f12edc6443a534b2cdd5072233989b415d7596573e743f3e5b386fb17eb2b10d3377bda2bc7bea65bec6b8372f4fc3463ec2cd6f9fde4b2c633d1923a4539fbb757256442c16343f639b15db95c39a6d35721439f7f94f5c8776b7bfd35d0bf8686de2e369c3d97a8033b31e6bc33518629f59314bc3d9050956c8d00000000000000000000000000000000000000000000000000000000000000000306466fe5211732ffecadba72c39be7bc8ce5bbc5f7126b2c439b3a4000000006a7d517192c568ee08a845f73d29788cf035c3145b21ab344d8062ea940000072b5d2051d300b10b74314b7e25ace9998ca66eb2c7fbc10ef130dd67028293ca1e031c8bc9bec3b610cf7b36eb3bf3aa40237c9e5be2c7893878578439eb00bc27e9074fac5e8d36cf04f94a0606fdd8ddbb420e99a489c7915ce5699e489000404030106000404000000050009038096980000000000050005021f95000007050800030204158e24658f6c59298c080000000b0c0d3700000000fc00").to_vec(); test_constructed_transaction(transaction, expected_serialized_tx); } @@ -622,12 +635,11 @@ pub mod test { agg_key(), durable_nonce(), compute_price(), - vec![chainflip_alt()], ) .unwrap(); // Serialized tx built in `create_fetch_native_in_batch` test - let expected_serialized_tx = hex_literal::hex!("012a95015c2c1a08af3013fd2575a7f61bf3a4faca1a010f7ec29f017ff10b52c49b9b8113e1adc89a9248c9537bff2eb3b2ca5bfafe9abbe4fbea753fccc139008001000409f79d5e026f12edc6443a534b2cdd5072233989b415d7596573e743f3e5b386fb38861d2f0bf5cd80031b701a6c25d13b4c812dd92f9d6301fafd9a58fb9e438646cd507258c10454d484e64ba59d3e7570658001c5f854b6b3ebb57be90e7a708d9871ed5fb2ee05765af23b7cabcc0d6b08ed370bb9f616a0d4dea40a25f870b5b9d633289c8fd72fb05f33349bf4cc44e82add5d865311ae346d7c9a67b7dd00000000000000000000000000000000000000000000000000000000000000000306466fe5211732ffecadba72c39be7bc8ce5bbc5f7126b2c439b3a4000000006a7d517192c568ee08a845f73d29788cf035c3145b21ab344d8062ea940000072b5d2051d300b10b74314b7e25ace9998ca66eb2c7fbc10ef130dd67028293cc27e9074fac5e8d36cf04f94a0606fdd8ddbb420e99a489c7915ce5699e48900050503090700040400000006000903809698000000000006000502c34a010008050a00020105158e24658f6c59298c080000000000000000000000ff08050a00030405158e24658f6c59298c080000000100000000000000ff013001afd71da9456a977233960b08eba77d2e3690b8c7259637c8fb8f82cf58a101090102").to_vec(); + let expected_serialized_tx = hex_literal::hex!("01f6a40d02eb553db89f9be4a37bfccd9c9a18ea6687c6e092cec5935863f8b4416c2a290cc474be118a404dc3035866e714dd70d4c77a6549b59a21a6bdb6bf06800100050bf79d5e026f12edc6443a534b2cdd5072233989b415d7596573e743f3e5b386fb17eb2b10d3377bda2bc7bea65bec6b8372f4fc3463ec2cd6f9fde4b2c633d19238861d2f0bf5cd80031b701a6c25d13b4c812dd92f9d6301fafd9a58fb9e438646cd507258c10454d484e64ba59d3e7570658001c5f854b6b3ebb57be90e7a708d9871ed5fb2ee05765af23b7cabcc0d6b08ed370bb9f616a0d4dea40a25f870b5b9d633289c8fd72fb05f33349bf4cc44e82add5d865311ae346d7c9a67b7dd00000000000000000000000000000000000000000000000000000000000000000306466fe5211732ffecadba72c39be7bc8ce5bbc5f7126b2c439b3a4000000006a7d517192c568ee08a845f73d29788cf035c3145b21ab344d8062ea940000072b5d2051d300b10b74314b7e25ace9998ca66eb2c7fbc10ef130dd67028293ca1e031c8bc9bec3b610cf7b36eb3bf3aa40237c9e5be2c7893878578439eb00bc27e9074fac5e8d36cf04f94a0606fdd8ddbb420e99a489c7915ce5699e48900050603010800040400000007000903809698000000000007000502c34a010009050a00030206158e24658f6c59298c080000000000000000000000ff09050a00040506158e24658f6c59298c080000000100000000000000ff00").to_vec(); test_constructed_transaction(transaction, expected_serialized_tx); } @@ -641,12 +653,11 @@ pub mod test { agg_key(), durable_nonce(), compute_price(), - vec![chainflip_alt()], ) .unwrap(); // Serialized tx built in `create_fetch_tokens` test - let expected_serialized_tx = hex_literal::hex!("0171e6c4881666cb11c8ab4402a1b0b5728c5a18acd668b0ffb524d913ff5bb717597564d05880a8e693ea3c6fd329750e88a0b6de6f97fa62a0c428b020cbea0e8001000609f79d5e026f12edc6443a534b2cdd5072233989b415d7596573e743f3e5b386fb42ff6863b52c3f8faf95739e6541bda5d0ac593f00c6c07d9ab37096bf26d910ae85f2fb6289c70bfe37df150dddb17dd84f403fd0b1aa1bfee85795159de21f00000000000000000000000000000000000000000000000000000000000000000306466fe5211732ffecadba72c39be7bc8ce5bbc5f7126b2c439b3a4000000006a7d517192c568ee08a845f73d29788cf035c3145b21ab344d8062ea940000006ddf6e1d765a193d9cbe146ceeb79ac1cb485ed5f5b37913a8cf5857eff00a946cd507258c10454d484e64ba59d3e7570658001c5f854b6b3ebb57be90e7a7072b5d2051d300b10b74314b7e25ace9998ca66eb2c7fbc10ef130dd67028293cc27e9074fac5e8d36cf04f94a0606fdd8ddbb420e99a489c7915ce5699e489000403030905000404000000040009038096980000000000040005024f0a010008090c0007010a0b06020316494710642cb0c646080000000000000000000000ff06013001afd71da9456a977233960b08eba77d2e3690b8c7259637c8fb8f82cf58a1020905020302").to_vec(); + let expected_serialized_tx = hex_literal::hex!("013f38d2f1a1669aabbc375de98a7030310f36e4482732ad92adc2fff31c1e63cf5713c92dd41f56b11fe2edf0679f3e095d88a5bb96055c1c84d5bfe0779e3606800100080df79d5e026f12edc6443a534b2cdd5072233989b415d7596573e743f3e5b386fb17eb2b10d3377bda2bc7bea65bec6b8372f4fc3463ec2cd6f9fde4b2c633d19242ff6863b52c3f8faf95739e6541bda5d0ac593f00c6c07d9ab37096bf26d910ae85f2fb6289c70bfe37df150dddb17dd84f403fd0b1aa1bfee85795159de21fe91372b3d301c202a633da0a92365a736e462131aecfad1fac47322cf8863ada00000000000000000000000000000000000000000000000000000000000000000306466fe5211732ffecadba72c39be7bc8ce5bbc5f7126b2c439b3a4000000006a7d517192c568ee08a845f73d29788cf035c3145b21ab344d8062ea940000006ddf6e1d765a193d9cbe146ceeb79ac1cb485ed5f5b37913a8cf5857eff00a90fb9ba52b1f09445f1e3a7508d59f0797923acf744fbe2da303fb06da859ee8746cd507258c10454d484e64ba59d3e7570658001c5f854b6b3ebb57be90e7a7072b5d2051d300b10b74314b7e25ace9998ca66eb2c7fbc10ef130dd67028293ca1e031c8bc9bec3b610cf7b36eb3bf3aa40237c9e5be2c7893878578439eb00bc27e9074fac5e8d36cf04f94a0606fdd8ddbb420e99a489c7915ce5699e489000405030107000404000000060009038096980000000000060005024f0a01000b090c000a02040908030516494710642cb0c646080000000000000000000000ff0600").to_vec(); test_constructed_transaction(transaction, expected_serialized_tx); } @@ -663,12 +674,11 @@ pub mod test { agg_key(), durable_nonce(), compute_price(), - vec![chainflip_alt()], ) .unwrap(); // Serialized tx built in `create_batch_fetch` test - let expected_serialized_tx = hex_literal::hex!("015eab79254444f6f235494a180b8c0c11fe4ee73c85656eda36b4dccf717ace5d0613540e9d3febb4b439f86b45bfdb26ba4810e17d224efd8ad13c2f34f09f0a800100070ef79d5e026f12edc6443a534b2cdd5072233989b415d7596573e743f3e5b386fb1ad0968d57ee79348476716f9b2cd44ec4284b8f52c36648d560949e41589a5540de1c0451cccb6edd1fda9b4a48c282b279350b55a7a9716800cc0132b6f0b042ff6863b52c3f8faf95739e6541bda5d0ac593f00c6c07d9ab37096bf26d910a140fd3d05766f0087d57bf99df05731e894392ffcc8e8d7e960ba73c09824aaae85f2fb6289c70bfe37df150dddb17dd84f403fd0b1aa1bfee85795159de21fb4baefcd4965beb1c71311a2ffe76419d4b8f8d35fbc4cf514b1bd02da2df2e300000000000000000000000000000000000000000000000000000000000000000306466fe5211732ffecadba72c39be7bc8ce5bbc5f7126b2c439b3a4000000006a7d517192c568ee08a845f73d29788cf035c3145b21ab344d8062ea940000006ddf6e1d765a193d9cbe146ceeb79ac1cb485ed5f5b37913a8cf5857eff00a946cd507258c10454d484e64ba59d3e7570658001c5f854b6b3ebb57be90e7a7072b5d2051d300b10b74314b7e25ace9998ca66eb2c7fbc10ef130dd67028293c8d9871ed5fb2ee05765af23b7cabcc0d6b08ed370bb9f616a0d4dea40a25f870c27e9074fac5e8d36cf04f94a0606fdd8ddbb420e99a489c7915ce5699e489000607030e0900040400000008000903809698000000000008000502e7bb02000c0911000b030f100a050716494710642cb0c646080000000000000000000000ff060c0911000d010f100a020716494710642cb0c646080000000100000000000000ff060c051100040607158e24658f6c59298c080000000200000000000000ff013001afd71da9456a977233960b08eba77d2e3690b8c7259637c8fb8f82cf58a1020905020302").to_vec(); + let expected_serialized_tx = hex_literal::hex!("01815a9e25f301f6877feb533c18b7ecaec40b2164ccffada07a0a228a7d67beb339b77a0146c5c44f18030ddadcce4ab6c18e9033d1b89ac7dcd0814d9ba7d6078001000912f79d5e026f12edc6443a534b2cdd5072233989b415d7596573e743f3e5b386fb17eb2b10d3377bda2bc7bea65bec6b8372f4fc3463ec2cd6f9fde4b2c633d1921ad0968d57ee79348476716f9b2cd44ec4284b8f52c36648d560949e41589a5540de1c0451cccb6edd1fda9b4a48c282b279350b55a7a9716800cc0132b6f0b042ff6863b52c3f8faf95739e6541bda5d0ac593f00c6c07d9ab37096bf26d910a140fd3d05766f0087d57bf99df05731e894392ffcc8e8d7e960ba73c09824aaae85f2fb6289c70bfe37df150dddb17dd84f403fd0b1aa1bfee85795159de21fb4baefcd4965beb1c71311a2ffe76419d4b8f8d35fbc4cf514b1bd02da2df2e3e91372b3d301c202a633da0a92365a736e462131aecfad1fac47322cf8863ada00000000000000000000000000000000000000000000000000000000000000000306466fe5211732ffecadba72c39be7bc8ce5bbc5f7126b2c439b3a4000000006a7d517192c568ee08a845f73d29788cf035c3145b21ab344d8062ea940000006ddf6e1d765a193d9cbe146ceeb79ac1cb485ed5f5b37913a8cf5857eff00a90fb9ba52b1f09445f1e3a7508d59f0797923acf744fbe2da303fb06da859ee8746cd507258c10454d484e64ba59d3e7570658001c5f854b6b3ebb57be90e7a7072b5d2051d300b10b74314b7e25ace9998ca66eb2c7fbc10ef130dd67028293c8d9871ed5fb2ee05765af23b7cabcc0d6b08ed370bb9f616a0d4dea40a25f870a1e031c8bc9bec3b610cf7b36eb3bf3aa40237c9e5be2c7893878578439eb00bc27e9074fac5e8d36cf04f94a0606fdd8ddbb420e99a489c7915ce5699e48900060903010b0004040000000a00090380969800000000000a000502e7bb02000f0911000e04080d0c060916494710642cb0c646080000000000000000000000ff060f0911001002080d0c030916494710642cb0c646080000000100000000000000ff060f051100050709158e24658f6c59298c080000000200000000000000ff00").to_vec(); test_constructed_transaction(transaction, expected_serialized_tx); } @@ -734,6 +744,7 @@ pub mod test { env.vault_program, env.vault_program_data_account, agg_key(), + env.alt_manager_program, durable_nonce(), compute_price(), vec![chainflip_alt()], @@ -741,7 +752,7 @@ pub mod test { .unwrap(); // Serialized tx built in `rotate_agg_key` test - let expected_serialized_tx = hex_literal::hex!("01ab37f60681ba0afe0aeda3c39f5021f49332695e63243af28769b59de314f4b62445271f2155e4d49c83153b63a9c64ddeb2feda66acf2ad6058f411c95cf7038001000406f79d5e026f12edc6443a534b2cdd5072233989b415d7596573e743f3e5b386fb6744e9d9790761c45a800a074687b5ff47b449a90c722a3852543be54399004400000000000000000000000000000000000000000000000000000000000000000306466fe5211732ffecadba72c39be7bc8ce5bbc5f7126b2c439b3a4000000006a7d517192c568ee08a845f73d29788cf035c3145b21ab344d8062ea940000072b5d2051d300b10b74314b7e25ace9998ca66eb2c7fbc10ef130dd67028293cc27e9074fac5e8d36cf04f94a0606fdd8ddbb420e99a489c7915ce5699e489000e0203060400040400000003000903809698000000000003000502e02e0000050409000102094e518fabdda5d68b000202060024070000006744e9d9790761c45a800a074687b5ff47b449a90c722a3852543be54399004402020f0024070000006744e9d9790761c45a800a074687b5ff47b449a90c722a3852543be54399004402020d0024070000006744e9d9790761c45a800a074687b5ff47b449a90c722a3852543be54399004402020e0024070000006744e9d9790761c45a800a074687b5ff47b449a90c722a3852543be54399004402020b0024070000006744e9d9790761c45a800a074687b5ff47b449a90c722a3852543be54399004402020a0024070000006744e9d9790761c45a800a074687b5ff47b449a90c722a3852543be5439900440202070024070000006744e9d9790761c45a800a074687b5ff47b449a90c722a3852543be5439900440202100024070000006744e9d9790761c45a800a074687b5ff47b449a90c722a3852543be54399004402020c0024070000006744e9d9790761c45a800a074687b5ff47b449a90c722a3852543be5439900440202080024070000006744e9d9790761c45a800a074687b5ff47b449a90c722a3852543be543990044013001afd71da9456a977233960b08eba77d2e3690b8c7259637c8fb8f82cf58a10b090f12020e0d110b0c0a1000").to_vec(); + let expected_serialized_tx = hex_literal::hex!("01906e22a60124f3bef2c1d1a3a597540cd92dd8ffb7c2b76490b172e3280172907693a54c12d3ffd760cd47e009794304bc24cca25fbb67ad35e098778f0796088001000507f79d5e026f12edc6443a534b2cdd5072233989b415d7596573e743f3e5b386fb6744e9d9790761c45a800a074687b5ff47b449a90c722a3852543be54399004400000000000000000000000000000000000000000000000000000000000000000306466fe5211732ffecadba72c39be7bc8ce5bbc5f7126b2c439b3a4000000006a7d517192c568ee08a845f73d29788cf035c3145b21ab344d8062ea94000002ec25ce83748eb28232064bd8f41d4f0e7e0cc1186b8704eabdb2461ef50e12c72b5d2051d300b10b74314b7e25ace9998ca66eb2c7fbc10ef130dd67028293cc27e9074fac5e8d36cf04f94a0606fdd8ddbb420e99a489c7915ce5699e48900050203070400040400000003000903809698000000000003000502ac070100050e0a00010207100e0f0c0b08110d090862f54977a55a39cb06040a000102094e518fabdda5d68b00013001afd71da9456a977233960b08eba77d2e3690b8c7259637c8fb8f82cf58a10b090f12020e0d110b0c0a1000").to_vec(); test_constructed_transaction(transaction, expected_serialized_tx); } @@ -901,7 +912,6 @@ pub mod test { agg_key(), durable_nonce(), compute_price(), - vec![chainflip_alt()], )); assert_err!( @@ -911,9 +921,8 @@ pub mod test { agg_key(), durable_nonce(), compute_price(), - vec![chainflip_alt()], ), - SolanaTransactionBuildingError::FinalTransactionExceededMaxLength(1260) + SolanaTransactionBuildingError::FinalTransactionExceededMaxLength(1288) ); } } diff --git a/state-chain/node/src/chain_spec.rs b/state-chain/node/src/chain_spec.rs index 8be4a6a87c4..1b1d3d4434b 100644 --- a/state-chain/node/src/chain_spec.rs +++ b/state-chain/node/src/chain_spec.rs @@ -4,7 +4,10 @@ use cf_chains::{ btc::{BitcoinFeeInfo, BitcoinTrackedData, BITCOIN_DUST_LIMIT}, dot::{PolkadotAccountId, PolkadotHash, PolkadotTrackedData, RuntimeVersion}, eth::EthereumTrackedData, - sol::{api::DurableNonceAndAccount, SolAddress, SolApiEnvironment, SolHash, SolTrackedData}, + sol::{ + api::DurableNonceAndAccount, AddressLookupTableAccount, SolAddress, SolApiEnvironment, + SolHash, SolTrackedData, + }, Arbitrum, Bitcoin, ChainState, Ethereum, Polkadot, }; use cf_primitives::{ @@ -108,11 +111,13 @@ pub struct StateChainEnvironment { sol_usdc_token_mint_pubkey: SolAddress, sol_token_vault_pda_account: SolAddress, sol_usdc_token_vault_ata: SolAddress, - sol_durable_nonces_and_accounts: [DurableNonceAndAccount; 10], /* we inject 10 nonce - * accounts - * at genesis */ + // We injected 10 nonce accounts at genesis and 40 more on an upgrade + sol_durable_nonces_and_accounts: [DurableNonceAndAccount; 50], sol_swap_endpoint_program: SolAddress, sol_swap_endpoint_program_data_account: SolAddress, + sol_alt_manager_program: SolAddress, + // Initialized with 65 accounts (50 of them nonces) + sol_address_lookup_table_account: (SolAddress, [SolAddress; 65]), } /// Get the values from the State Chain's environment variables. Else set them via the defaults @@ -164,6 +169,7 @@ pub fn get_environment_or_defaults(defaults: StateChainEnvironment) -> StateChai SOL_SWAP_ENDPOINT_PROGRAM_DATA_ACCOUNT, sol_swap_endpoint_program_data_account ); + from_env_var!(FromStr::from_str, SOL_ALT_MANAGER_PROGRAM, sol_alt_manager_program); let dot_genesis_hash = match env::var("DOT_GENESIS_HASH") { Ok(s) => hex_decode::<32>(&s).unwrap().into(), @@ -193,6 +199,11 @@ pub fn get_environment_or_defaults(defaults: StateChainEnvironment) -> StateChai Err(_) => defaults.sol_durable_nonces_and_accounts, }; + let sol_address_lookup_table_account = match env::var("SOL_ADDRESS_LOOKUP_TABLE_ACCOUNT") { + Ok(_) => unimplemented!("Solana address lookup table account should not be supplied via environment variables since its a complex type"), + Err(_) => defaults.sol_address_lookup_table_account, + }; + StateChainEnvironment { flip_token_address, eth_usdc_address, @@ -226,6 +237,8 @@ pub fn get_environment_or_defaults(defaults: StateChainEnvironment) -> StateChai sol_durable_nonces_and_accounts, sol_swap_endpoint_program, sol_swap_endpoint_program_data_account, + sol_alt_manager_program, + sol_address_lookup_table_account, } } @@ -295,6 +308,8 @@ pub fn inner_cf_development_config( sol_durable_nonces_and_accounts, sol_swap_endpoint_program, sol_swap_endpoint_program_data_account, + sol_alt_manager_program, + sol_address_lookup_table_account, } = get_environment_or_defaults(testnet::ENV); Ok(ChainSpec::builder(wasm_binary, Default::default()) .with_name("CF Develop") @@ -334,6 +349,15 @@ pub fn inner_cf_development_config( usdc_token_vault_ata: sol_usdc_token_vault_ata, swap_endpoint_program: sol_swap_endpoint_program, swap_endpoint_program_data_account: sol_swap_endpoint_program_data_account, + alt_manager_program: sol_alt_manager_program, + address_lookup_table_account: AddressLookupTableAccount { + key: sol_address_lookup_table_account.0.into(), + addresses: sol_address_lookup_table_account + .1 + .into_iter() + .map(|addr| addr.into()) + .collect(), + }, }, sol_durable_nonces_and_accounts: sol_durable_nonces_and_accounts.to_vec(), network_environment: NetworkEnvironment::Development, @@ -425,6 +449,8 @@ macro_rules! network_spec { sol_durable_nonces_and_accounts, sol_swap_endpoint_program, sol_swap_endpoint_program_data_account, + sol_alt_manager_program, + sol_address_lookup_table_account, } = env_override.unwrap_or(ENV); let protocol_id = format!( "{}-{}", @@ -497,6 +523,15 @@ macro_rules! network_spec { swap_endpoint_program: sol_swap_endpoint_program, swap_endpoint_program_data_account: sol_swap_endpoint_program_data_account, + alt_manager_program: sol_alt_manager_program, + address_lookup_table_account: AddressLookupTableAccount { + key: sol_address_lookup_table_account.0.into(), + addresses: sol_address_lookup_table_account + .1 + .into_iter() + .map(|addr| addr.into()) + .collect(), + }, }, network_environment: NETWORK_ENVIRONMENT, ..Default::default() diff --git a/state-chain/node/src/chain_spec/berghain.rs b/state-chain/node/src/chain_spec/berghain.rs index 1c46213256b..ef1a8807713 100644 --- a/state-chain/node/src/chain_spec/berghain.rs +++ b/state-chain/node/src/chain_spec/berghain.rs @@ -105,6 +105,168 @@ pub const ENV: StateChainEnvironment = StateChainEnvironment { const_address("14AwUr3FG75E66aaLy7jCbVGaxGCGLdqtpVyBNAFwKac"), const_hash("AEzmj9wq8jp7wF46Lrr3Jc2K7xRP58V5Y3cYRVEqtE5J"), ), + // TODO: Update with the real nonces even if we'll actually insert + // then via migration + ( + const_address("11111111111111111111111111111111"), + const_hash("3pMDqkhnibuv2ARQzjq4K1jn58EvCzC6uF28kiMCUoW2"), + ), + ( + const_address("11111111111111111111111111111111"), + const_hash("5rJzAL24yzaqPNE14xFuhdLtLLmUDF3JAfVbZHoBWAUB"), + ), + ( + const_address("11111111111111111111111111111111"), + const_hash("6ChBdxfZ4ZPLZ7zhVavtjXZrNojg1MdT3Du4VnSnhQ6u"), + ), + ( + const_address("11111111111111111111111111111111"), + const_hash("6FtBFnt4P25xUnATE6c6XeicKn1ZB6Q5MiGZq4xqqD2D"), + ), + ( + const_address("11111111111111111111111111111111"), + const_hash("8UZPPjjKVVjb7TRDx3ZVBnMqrdqYpp6HP2vQVUrxEhn1"), + ), + ( + const_address("11111111111111111111111111111111"), + const_hash("FtLgEitvpnSrcj4adHKcvbYG9SF1C7NLZCk2priDTA6e"), + ), + ( + const_address("11111111111111111111111111111111"), + const_hash("2xYo9Gv76GGgZs2ikCi8gSgkriEugv5wFhERowyvDx3H"), + ), + ( + const_address("11111111111111111111111111111111"), + const_hash("79NHKfzzZZ4Fmm5mK7D6E16KvwJKWWZpuqyHHiD1xdQ3"), + ), + ( + const_address("11111111111111111111111111111111"), + const_hash("CTyzyX8K9Wwo5zGEZmWxtGpYYwHpGv6YTsFRpi6syLJ4"), + ), + ( + const_address("11111111111111111111111111111111"), + const_hash("AEzmj9wq8jp7wF46Lrr3Jc2K7xRP58V5Y3cYRVEqtE5J"), + ), + ( + const_address("11111111111111111111111111111111"), + const_hash("3pMDqkhnibuv2ARQzjq4K1jn58EvCzC6uF28kiMCUoW2"), + ), + ( + const_address("11111111111111111111111111111111"), + const_hash("5rJzAL24yzaqPNE14xFuhdLtLLmUDF3JAfVbZHoBWAUB"), + ), + ( + const_address("11111111111111111111111111111111"), + const_hash("6ChBdxfZ4ZPLZ7zhVavtjXZrNojg1MdT3Du4VnSnhQ6u"), + ), + ( + const_address("11111111111111111111111111111111"), + const_hash("6FtBFnt4P25xUnATE6c6XeicKn1ZB6Q5MiGZq4xqqD2D"), + ), + ( + const_address("11111111111111111111111111111111"), + const_hash("8UZPPjjKVVjb7TRDx3ZVBnMqrdqYpp6HP2vQVUrxEhn1"), + ), + ( + const_address("11111111111111111111111111111111"), + const_hash("FtLgEitvpnSrcj4adHKcvbYG9SF1C7NLZCk2priDTA6e"), + ), + ( + const_address("11111111111111111111111111111111"), + const_hash("2xYo9Gv76GGgZs2ikCi8gSgkriEugv5wFhERowyvDx3H"), + ), + ( + const_address("11111111111111111111111111111111"), + const_hash("79NHKfzzZZ4Fmm5mK7D6E16KvwJKWWZpuqyHHiD1xdQ3"), + ), + ( + const_address("11111111111111111111111111111111"), + const_hash("CTyzyX8K9Wwo5zGEZmWxtGpYYwHpGv6YTsFRpi6syLJ4"), + ), + ( + const_address("11111111111111111111111111111111"), + const_hash("AEzmj9wq8jp7wF46Lrr3Jc2K7xRP58V5Y3cYRVEqtE5J"), + ), + ( + const_address("11111111111111111111111111111111"), + const_hash("3pMDqkhnibuv2ARQzjq4K1jn58EvCzC6uF28kiMCUoW2"), + ), + ( + const_address("11111111111111111111111111111111"), + const_hash("5rJzAL24yzaqPNE14xFuhdLtLLmUDF3JAfVbZHoBWAUB"), + ), + ( + const_address("11111111111111111111111111111111"), + const_hash("6ChBdxfZ4ZPLZ7zhVavtjXZrNojg1MdT3Du4VnSnhQ6u"), + ), + ( + const_address("11111111111111111111111111111111"), + const_hash("6FtBFnt4P25xUnATE6c6XeicKn1ZB6Q5MiGZq4xqqD2D"), + ), + ( + const_address("11111111111111111111111111111111"), + const_hash("8UZPPjjKVVjb7TRDx3ZVBnMqrdqYpp6HP2vQVUrxEhn1"), + ), + ( + const_address("11111111111111111111111111111111"), + const_hash("FtLgEitvpnSrcj4adHKcvbYG9SF1C7NLZCk2priDTA6e"), + ), + ( + const_address("11111111111111111111111111111111"), + const_hash("2xYo9Gv76GGgZs2ikCi8gSgkriEugv5wFhERowyvDx3H"), + ), + ( + const_address("11111111111111111111111111111111"), + const_hash("79NHKfzzZZ4Fmm5mK7D6E16KvwJKWWZpuqyHHiD1xdQ3"), + ), + ( + const_address("11111111111111111111111111111111"), + const_hash("CTyzyX8K9Wwo5zGEZmWxtGpYYwHpGv6YTsFRpi6syLJ4"), + ), + ( + const_address("11111111111111111111111111111111"), + const_hash("AEzmj9wq8jp7wF46Lrr3Jc2K7xRP58V5Y3cYRVEqtE5J"), + ), + ( + const_address("11111111111111111111111111111111"), + const_hash("3pMDqkhnibuv2ARQzjq4K1jn58EvCzC6uF28kiMCUoW2"), + ), + ( + const_address("11111111111111111111111111111111"), + const_hash("5rJzAL24yzaqPNE14xFuhdLtLLmUDF3JAfVbZHoBWAUB"), + ), + ( + const_address("11111111111111111111111111111111"), + const_hash("6ChBdxfZ4ZPLZ7zhVavtjXZrNojg1MdT3Du4VnSnhQ6u"), + ), + ( + const_address("11111111111111111111111111111111"), + const_hash("6FtBFnt4P25xUnATE6c6XeicKn1ZB6Q5MiGZq4xqqD2D"), + ), + ( + const_address("11111111111111111111111111111111"), + const_hash("8UZPPjjKVVjb7TRDx3ZVBnMqrdqYpp6HP2vQVUrxEhn1"), + ), + ( + const_address("11111111111111111111111111111111"), + const_hash("FtLgEitvpnSrcj4adHKcvbYG9SF1C7NLZCk2priDTA6e"), + ), + ( + const_address("11111111111111111111111111111111"), + const_hash("2xYo9Gv76GGgZs2ikCi8gSgkriEugv5wFhERowyvDx3H"), + ), + ( + const_address("11111111111111111111111111111111"), + const_hash("79NHKfzzZZ4Fmm5mK7D6E16KvwJKWWZpuqyHHiD1xdQ3"), + ), + ( + const_address("11111111111111111111111111111111"), + const_hash("CTyzyX8K9Wwo5zGEZmWxtGpYYwHpGv6YTsFRpi6syLJ4"), + ), + ( + const_address("11111111111111111111111111111111"), + const_hash("AEzmj9wq8jp7wF46Lrr3Jc2K7xRP58V5Y3cYRVEqtE5J"), + ), ], sol_swap_endpoint_program: SolAddress(bs58_array( "J88B7gmadHzTNGiy54c9Ms8BsEXNdB2fntFyhKpk3qoT", @@ -112,6 +274,78 @@ pub const ENV: StateChainEnvironment = StateChainEnvironment { sol_swap_endpoint_program_data_account: SolAddress(bs58_array( "FmAcjWaRFUxGWBfGT7G3CzcFeJFsewQ4KPJVG4f6fcob", )), + // TODO: To update with the right values + sol_alt_manager_program: SolAddress(bs58_array("11111111111111111111111111111111")), + sol_address_lookup_table_account: ( + SolAddress(bs58_array("11111111111111111111111111111111")), + [ + const_address("11111111111111111111111111111111"), + const_address("11111111111111111111111111111111"), + const_address("11111111111111111111111111111111"), + const_address("11111111111111111111111111111111"), + const_address("11111111111111111111111111111111"), + const_address("11111111111111111111111111111111"), + const_address("11111111111111111111111111111111"), + const_address("11111111111111111111111111111111"), + const_address("11111111111111111111111111111111"), + const_address("11111111111111111111111111111111"), + const_address("11111111111111111111111111111111"), + const_address("11111111111111111111111111111111"), + const_address("11111111111111111111111111111111"), + const_address("11111111111111111111111111111111"), + const_address("11111111111111111111111111111111"), + const_address("11111111111111111111111111111111"), + const_address("11111111111111111111111111111111"), + const_address("11111111111111111111111111111111"), + const_address("11111111111111111111111111111111"), + const_address("11111111111111111111111111111111"), + const_address("11111111111111111111111111111111"), + const_address("11111111111111111111111111111111"), + const_address("11111111111111111111111111111111"), + const_address("11111111111111111111111111111111"), + const_address("11111111111111111111111111111111"), + const_address("11111111111111111111111111111111"), + const_address("11111111111111111111111111111111"), + const_address("11111111111111111111111111111111"), + const_address("11111111111111111111111111111111"), + const_address("11111111111111111111111111111111"), + const_address("11111111111111111111111111111111"), + const_address("11111111111111111111111111111111"), + const_address("11111111111111111111111111111111"), + const_address("11111111111111111111111111111111"), + const_address("11111111111111111111111111111111"), + const_address("11111111111111111111111111111111"), + const_address("11111111111111111111111111111111"), + const_address("11111111111111111111111111111111"), + const_address("11111111111111111111111111111111"), + const_address("11111111111111111111111111111111"), + const_address("11111111111111111111111111111111"), + const_address("11111111111111111111111111111111"), + const_address("11111111111111111111111111111111"), + const_address("11111111111111111111111111111111"), + const_address("11111111111111111111111111111111"), + const_address("11111111111111111111111111111111"), + const_address("11111111111111111111111111111111"), + const_address("11111111111111111111111111111111"), + const_address("11111111111111111111111111111111"), + const_address("11111111111111111111111111111111"), + const_address("11111111111111111111111111111111"), + const_address("11111111111111111111111111111111"), + const_address("11111111111111111111111111111111"), + const_address("11111111111111111111111111111111"), + const_address("11111111111111111111111111111111"), + const_address("11111111111111111111111111111111"), + const_address("11111111111111111111111111111111"), + const_address("11111111111111111111111111111111"), + const_address("11111111111111111111111111111111"), + const_address("11111111111111111111111111111111"), + const_address("11111111111111111111111111111111"), + const_address("11111111111111111111111111111111"), + const_address("11111111111111111111111111111111"), + const_address("11111111111111111111111111111111"), + const_address("11111111111111111111111111111111"), + ], + ), }; pub const EPOCH_DURATION_BLOCKS: BlockNumber = 24 * HOURS; diff --git a/state-chain/node/src/chain_spec/perseverance.rs b/state-chain/node/src/chain_spec/perseverance.rs index d4d71cab1a5..dfea9c794fa 100644 --- a/state-chain/node/src/chain_spec/perseverance.rs +++ b/state-chain/node/src/chain_spec/perseverance.rs @@ -105,6 +105,168 @@ pub const ENV: StateChainEnvironment = StateChainEnvironment { const_address("6WcamLU38f1asFanFXYugVJuHN4TXHZicmJgPz9Xr6U7"), const_hash("FS1PdTqsDSEa9xUrLAS5k471MQsT28H2FW5CpUHiTmGF"), ), + // TODO: Update with the real nonces even if we'll actually insert + // then via migration + ( + const_address("11111111111111111111111111111111"), + const_hash("4DEDrSVk4FRKFQkU1p9Zywi5MK64AGxC16RQZvhyFngq"), + ), + ( + const_address("11111111111111111111111111111111"), + const_hash("5s1V7bXByHPquC1AYD94w4f8SgEhDjEnGeBtiPsuzXYU"), + ), + ( + const_address("11111111111111111111111111111111"), + const_hash("7Y1PvrW65rZp3RqmJksix3XxQ9MrFdQ62NNbhdB97qwc"), + ), + ( + const_address("11111111111111111111111111111111"), + const_hash("F1fe16vREumonQurbFAfmbKytfEE9khjy9UPjjgbGnG9"), + ), + ( + const_address("11111111111111111111111111111111"), + const_hash("D6osW2CyHmpLqg8ymDAeNEjZZETqHGWdQBekh3cVjAUQ"), + ), + ( + const_address("11111111111111111111111111111111"), + const_hash("7qDGqASPR3VannmDosTXUVMd5ZWbqDnawCA3auEHsq6r"), + ), + ( + const_address("11111111111111111111111111111111"), + const_hash("4TFDiBqjU5istaaAovdgKBNDKJFdZ318W6XuC9MZiDBC"), + ), + ( + const_address("11111111111111111111111111111111"), + const_hash("7ua7UjY1Csouw7K1nMDyWhL7Lx5PE9ernETcKciWALFH"), + ), + ( + const_address("11111111111111111111111111111111"), + const_hash("742EN3zJUt6Xcrs1KAH4jfyLLVp8BYV2bSmjEpsFpMFo"), + ), + ( + const_address("11111111111111111111111111111111"), + const_hash("FS1PdTqsDSEa9xUrLAS5k471MQsT28H2FW5CpUHiTmGF"), + ), + ( + const_address("11111111111111111111111111111111"), + const_hash("4DEDrSVk4FRKFQkU1p9Zywi5MK64AGxC16RQZvhyFngq"), + ), + ( + const_address("11111111111111111111111111111111"), + const_hash("5s1V7bXByHPquC1AYD94w4f8SgEhDjEnGeBtiPsuzXYU"), + ), + ( + const_address("11111111111111111111111111111111"), + const_hash("7Y1PvrW65rZp3RqmJksix3XxQ9MrFdQ62NNbhdB97qwc"), + ), + ( + const_address("11111111111111111111111111111111"), + const_hash("F1fe16vREumonQurbFAfmbKytfEE9khjy9UPjjgbGnG9"), + ), + ( + const_address("11111111111111111111111111111111"), + const_hash("D6osW2CyHmpLqg8ymDAeNEjZZETqHGWdQBekh3cVjAUQ"), + ), + ( + const_address("11111111111111111111111111111111"), + const_hash("7qDGqASPR3VannmDosTXUVMd5ZWbqDnawCA3auEHsq6r"), + ), + ( + const_address("11111111111111111111111111111111"), + const_hash("4TFDiBqjU5istaaAovdgKBNDKJFdZ318W6XuC9MZiDBC"), + ), + ( + const_address("11111111111111111111111111111111"), + const_hash("7ua7UjY1Csouw7K1nMDyWhL7Lx5PE9ernETcKciWALFH"), + ), + ( + const_address("11111111111111111111111111111111"), + const_hash("742EN3zJUt6Xcrs1KAH4jfyLLVp8BYV2bSmjEpsFpMFo"), + ), + ( + const_address("11111111111111111111111111111111"), + const_hash("FS1PdTqsDSEa9xUrLAS5k471MQsT28H2FW5CpUHiTmGF"), + ), + ( + const_address("11111111111111111111111111111111"), + const_hash("4DEDrSVk4FRKFQkU1p9Zywi5MK64AGxC16RQZvhyFngq"), + ), + ( + const_address("11111111111111111111111111111111"), + const_hash("5s1V7bXByHPquC1AYD94w4f8SgEhDjEnGeBtiPsuzXYU"), + ), + ( + const_address("11111111111111111111111111111111"), + const_hash("7Y1PvrW65rZp3RqmJksix3XxQ9MrFdQ62NNbhdB97qwc"), + ), + ( + const_address("11111111111111111111111111111111"), + const_hash("F1fe16vREumonQurbFAfmbKytfEE9khjy9UPjjgbGnG9"), + ), + ( + const_address("11111111111111111111111111111111"), + const_hash("D6osW2CyHmpLqg8ymDAeNEjZZETqHGWdQBekh3cVjAUQ"), + ), + ( + const_address("11111111111111111111111111111111"), + const_hash("7qDGqASPR3VannmDosTXUVMd5ZWbqDnawCA3auEHsq6r"), + ), + ( + const_address("11111111111111111111111111111111"), + const_hash("4TFDiBqjU5istaaAovdgKBNDKJFdZ318W6XuC9MZiDBC"), + ), + ( + const_address("11111111111111111111111111111111"), + const_hash("7ua7UjY1Csouw7K1nMDyWhL7Lx5PE9ernETcKciWALFH"), + ), + ( + const_address("11111111111111111111111111111111"), + const_hash("742EN3zJUt6Xcrs1KAH4jfyLLVp8BYV2bSmjEpsFpMFo"), + ), + ( + const_address("11111111111111111111111111111111"), + const_hash("FS1PdTqsDSEa9xUrLAS5k471MQsT28H2FW5CpUHiTmGF"), + ), + ( + const_address("11111111111111111111111111111111"), + const_hash("4DEDrSVk4FRKFQkU1p9Zywi5MK64AGxC16RQZvhyFngq"), + ), + ( + const_address("11111111111111111111111111111111"), + const_hash("5s1V7bXByHPquC1AYD94w4f8SgEhDjEnGeBtiPsuzXYU"), + ), + ( + const_address("11111111111111111111111111111111"), + const_hash("7Y1PvrW65rZp3RqmJksix3XxQ9MrFdQ62NNbhdB97qwc"), + ), + ( + const_address("11111111111111111111111111111111"), + const_hash("F1fe16vREumonQurbFAfmbKytfEE9khjy9UPjjgbGnG9"), + ), + ( + const_address("11111111111111111111111111111111"), + const_hash("D6osW2CyHmpLqg8ymDAeNEjZZETqHGWdQBekh3cVjAUQ"), + ), + ( + const_address("11111111111111111111111111111111"), + const_hash("7qDGqASPR3VannmDosTXUVMd5ZWbqDnawCA3auEHsq6r"), + ), + ( + const_address("11111111111111111111111111111111"), + const_hash("4TFDiBqjU5istaaAovdgKBNDKJFdZ318W6XuC9MZiDBC"), + ), + ( + const_address("11111111111111111111111111111111"), + const_hash("7ua7UjY1Csouw7K1nMDyWhL7Lx5PE9ernETcKciWALFH"), + ), + ( + const_address("11111111111111111111111111111111"), + const_hash("742EN3zJUt6Xcrs1KAH4jfyLLVp8BYV2bSmjEpsFpMFo"), + ), + ( + const_address("11111111111111111111111111111111"), + const_hash("FS1PdTqsDSEa9xUrLAS5k471MQsT28H2FW5CpUHiTmGF"), + ), ], sol_swap_endpoint_program: SolAddress(bs58_array( "DeL6iGV5RWrWh7cPoEa7tRHM8XURAaB4vPjfX5qVyuWE", @@ -112,6 +274,78 @@ pub const ENV: StateChainEnvironment = StateChainEnvironment { sol_swap_endpoint_program_data_account: SolAddress(bs58_array( "12MYcNumSQCn81yKRfrk5P5ThM5ivkLiZda979hhKJDR", )), + // TODO: To update with the right values + sol_alt_manager_program: SolAddress(bs58_array("11111111111111111111111111111111")), + sol_address_lookup_table_account: ( + SolAddress(bs58_array("11111111111111111111111111111111")), + [ + const_address("11111111111111111111111111111111"), + const_address("11111111111111111111111111111111"), + const_address("11111111111111111111111111111111"), + const_address("11111111111111111111111111111111"), + const_address("11111111111111111111111111111111"), + const_address("11111111111111111111111111111111"), + const_address("11111111111111111111111111111111"), + const_address("11111111111111111111111111111111"), + const_address("11111111111111111111111111111111"), + const_address("11111111111111111111111111111111"), + const_address("11111111111111111111111111111111"), + const_address("11111111111111111111111111111111"), + const_address("11111111111111111111111111111111"), + const_address("11111111111111111111111111111111"), + const_address("11111111111111111111111111111111"), + const_address("11111111111111111111111111111111"), + const_address("11111111111111111111111111111111"), + const_address("11111111111111111111111111111111"), + const_address("11111111111111111111111111111111"), + const_address("11111111111111111111111111111111"), + const_address("11111111111111111111111111111111"), + const_address("11111111111111111111111111111111"), + const_address("11111111111111111111111111111111"), + const_address("11111111111111111111111111111111"), + const_address("11111111111111111111111111111111"), + const_address("11111111111111111111111111111111"), + const_address("11111111111111111111111111111111"), + const_address("11111111111111111111111111111111"), + const_address("11111111111111111111111111111111"), + const_address("11111111111111111111111111111111"), + const_address("11111111111111111111111111111111"), + const_address("11111111111111111111111111111111"), + const_address("11111111111111111111111111111111"), + const_address("11111111111111111111111111111111"), + const_address("11111111111111111111111111111111"), + const_address("11111111111111111111111111111111"), + const_address("11111111111111111111111111111111"), + const_address("11111111111111111111111111111111"), + const_address("11111111111111111111111111111111"), + const_address("11111111111111111111111111111111"), + const_address("11111111111111111111111111111111"), + const_address("11111111111111111111111111111111"), + const_address("11111111111111111111111111111111"), + const_address("11111111111111111111111111111111"), + const_address("11111111111111111111111111111111"), + const_address("11111111111111111111111111111111"), + const_address("11111111111111111111111111111111"), + const_address("11111111111111111111111111111111"), + const_address("11111111111111111111111111111111"), + const_address("11111111111111111111111111111111"), + const_address("11111111111111111111111111111111"), + const_address("11111111111111111111111111111111"), + const_address("11111111111111111111111111111111"), + const_address("11111111111111111111111111111111"), + const_address("11111111111111111111111111111111"), + const_address("11111111111111111111111111111111"), + const_address("11111111111111111111111111111111"), + const_address("11111111111111111111111111111111"), + const_address("11111111111111111111111111111111"), + const_address("11111111111111111111111111111111"), + const_address("11111111111111111111111111111111"), + const_address("11111111111111111111111111111111"), + const_address("11111111111111111111111111111111"), + const_address("11111111111111111111111111111111"), + const_address("11111111111111111111111111111111"), + ], + ), }; pub const EPOCH_DURATION_BLOCKS: BlockNumber = 24 * HOURS; diff --git a/state-chain/node/src/chain_spec/sisyphos.rs b/state-chain/node/src/chain_spec/sisyphos.rs index 61d3aece7d0..1382559fea8 100644 --- a/state-chain/node/src/chain_spec/sisyphos.rs +++ b/state-chain/node/src/chain_spec/sisyphos.rs @@ -106,6 +106,168 @@ pub const ENV: StateChainEnvironment = StateChainEnvironment { const_address("DcEmNXySnth2FNhsHmt64oB15pjtakKhfG3nez7qB52w"), const_hash("3iiniRfNTFmBn6Y9ZhovefUDaGaJ7buB2vYemnbFoHN3"), ), + // TODO: Update with the real nonces even if we'll actually insert + // then via migration + ( + const_address("11111111111111111111111111111111"), + const_hash("9QVwTXtwGTbq4U3KPN9THdnxQ38bVFu6P15cwhURJqNC"), + ), + ( + const_address("11111111111111111111111111111111"), + const_hash("DkYbyJ5P576ekMQYUuWizejxoWHUUZN3nLrQzVFe2mjd"), + ), + ( + const_address("11111111111111111111111111111111"), + const_hash("FWUwBbVbRFtaWhpptZ9vsUtiZtc8c6MKKsAnQfRn6uRV"), + ), + ( + const_address("11111111111111111111111111111111"), + const_hash("3niQmTX5qKD69gdNRLwxRm1o4d65Vkw1QxQH27GLiDCD"), + ), + ( + const_address("11111111111111111111111111111111"), + const_hash("5ngBYFzxZ2sTFetLY92LiQVzjXZTYbqTjc58ShVZC19d"), + ), + ( + const_address("11111111111111111111111111111111"), + const_hash("9C1RDEeKLFT2txok1zvqZ3Fu5K1dxCqDCJc3KPfuBqTn"), + ), + ( + const_address("11111111111111111111111111111111"), + const_hash("B8PDaqM9TUjyuKwT8K2C4tiF2p5jTiBX7r1B9gogVen6"), + ), + ( + const_address("11111111111111111111111111111111"), + const_hash("Dne5GaxYgG2KzgpC7aD7XX3pFQp3qvj3vfCFy3kfjaJw"), + ), + ( + const_address("11111111111111111111111111111111"), + const_hash("FKU1qKCydv3TjE1ZDimvevA4khGakkJFRmyVorZvYR7D"), + ), + ( + const_address("11111111111111111111111111111111"), + const_hash("3iiniRfNTFmBn6Y9ZhovefUDaGaJ7buB2vYemnbFoHN3"), + ), + ( + const_address("11111111111111111111111111111111"), + const_hash("9QVwTXtwGTbq4U3KPN9THdnxQ38bVFu6P15cwhURJqNC"), + ), + ( + const_address("11111111111111111111111111111111"), + const_hash("DkYbyJ5P576ekMQYUuWizejxoWHUUZN3nLrQzVFe2mjd"), + ), + ( + const_address("11111111111111111111111111111111"), + const_hash("FWUwBbVbRFtaWhpptZ9vsUtiZtc8c6MKKsAnQfRn6uRV"), + ), + ( + const_address("11111111111111111111111111111111"), + const_hash("3niQmTX5qKD69gdNRLwxRm1o4d65Vkw1QxQH27GLiDCD"), + ), + ( + const_address("11111111111111111111111111111111"), + const_hash("5ngBYFzxZ2sTFetLY92LiQVzjXZTYbqTjc58ShVZC19d"), + ), + ( + const_address("11111111111111111111111111111111"), + const_hash("9C1RDEeKLFT2txok1zvqZ3Fu5K1dxCqDCJc3KPfuBqTn"), + ), + ( + const_address("11111111111111111111111111111111"), + const_hash("B8PDaqM9TUjyuKwT8K2C4tiF2p5jTiBX7r1B9gogVen6"), + ), + ( + const_address("11111111111111111111111111111111"), + const_hash("Dne5GaxYgG2KzgpC7aD7XX3pFQp3qvj3vfCFy3kfjaJw"), + ), + ( + const_address("11111111111111111111111111111111"), + const_hash("FKU1qKCydv3TjE1ZDimvevA4khGakkJFRmyVorZvYR7D"), + ), + ( + const_address("11111111111111111111111111111111"), + const_hash("3iiniRfNTFmBn6Y9ZhovefUDaGaJ7buB2vYemnbFoHN3"), + ), + ( + const_address("11111111111111111111111111111111"), + const_hash("9QVwTXtwGTbq4U3KPN9THdnxQ38bVFu6P15cwhURJqNC"), + ), + ( + const_address("11111111111111111111111111111111"), + const_hash("DkYbyJ5P576ekMQYUuWizejxoWHUUZN3nLrQzVFe2mjd"), + ), + ( + const_address("11111111111111111111111111111111"), + const_hash("FWUwBbVbRFtaWhpptZ9vsUtiZtc8c6MKKsAnQfRn6uRV"), + ), + ( + const_address("11111111111111111111111111111111"), + const_hash("3niQmTX5qKD69gdNRLwxRm1o4d65Vkw1QxQH27GLiDCD"), + ), + ( + const_address("11111111111111111111111111111111"), + const_hash("5ngBYFzxZ2sTFetLY92LiQVzjXZTYbqTjc58ShVZC19d"), + ), + ( + const_address("11111111111111111111111111111111"), + const_hash("9C1RDEeKLFT2txok1zvqZ3Fu5K1dxCqDCJc3KPfuBqTn"), + ), + ( + const_address("11111111111111111111111111111111"), + const_hash("B8PDaqM9TUjyuKwT8K2C4tiF2p5jTiBX7r1B9gogVen6"), + ), + ( + const_address("11111111111111111111111111111111"), + const_hash("Dne5GaxYgG2KzgpC7aD7XX3pFQp3qvj3vfCFy3kfjaJw"), + ), + ( + const_address("11111111111111111111111111111111"), + const_hash("FKU1qKCydv3TjE1ZDimvevA4khGakkJFRmyVorZvYR7D"), + ), + ( + const_address("11111111111111111111111111111111"), + const_hash("3iiniRfNTFmBn6Y9ZhovefUDaGaJ7buB2vYemnbFoHN3"), + ), + ( + const_address("11111111111111111111111111111111"), + const_hash("9QVwTXtwGTbq4U3KPN9THdnxQ38bVFu6P15cwhURJqNC"), + ), + ( + const_address("11111111111111111111111111111111"), + const_hash("DkYbyJ5P576ekMQYUuWizejxoWHUUZN3nLrQzVFe2mjd"), + ), + ( + const_address("11111111111111111111111111111111"), + const_hash("FWUwBbVbRFtaWhpptZ9vsUtiZtc8c6MKKsAnQfRn6uRV"), + ), + ( + const_address("11111111111111111111111111111111"), + const_hash("3niQmTX5qKD69gdNRLwxRm1o4d65Vkw1QxQH27GLiDCD"), + ), + ( + const_address("11111111111111111111111111111111"), + const_hash("5ngBYFzxZ2sTFetLY92LiQVzjXZTYbqTjc58ShVZC19d"), + ), + ( + const_address("11111111111111111111111111111111"), + const_hash("9C1RDEeKLFT2txok1zvqZ3Fu5K1dxCqDCJc3KPfuBqTn"), + ), + ( + const_address("11111111111111111111111111111111"), + const_hash("B8PDaqM9TUjyuKwT8K2C4tiF2p5jTiBX7r1B9gogVen6"), + ), + ( + const_address("11111111111111111111111111111111"), + const_hash("Dne5GaxYgG2KzgpC7aD7XX3pFQp3qvj3vfCFy3kfjaJw"), + ), + ( + const_address("11111111111111111111111111111111"), + const_hash("FKU1qKCydv3TjE1ZDimvevA4khGakkJFRmyVorZvYR7D"), + ), + ( + const_address("11111111111111111111111111111111"), + const_hash("3iiniRfNTFmBn6Y9ZhovefUDaGaJ7buB2vYemnbFoHN3"), + ), ], sol_swap_endpoint_program: SolAddress(bs58_array( "FtK6TR2ZqhChxXeDFoVzM9gYDPA18tGrKoBb3hX7nPwt", @@ -113,6 +275,78 @@ pub const ENV: StateChainEnvironment = StateChainEnvironment { sol_swap_endpoint_program_data_account: SolAddress(bs58_array( "EXeku7Q9AiAXBdH7cUHw2ue3okhrofvDZR7EBE1BVQZu", )), + // TODO: To update with the right values + sol_alt_manager_program: SolAddress(bs58_array("11111111111111111111111111111111")), + sol_address_lookup_table_account: ( + SolAddress(bs58_array("11111111111111111111111111111111")), + [ + const_address("11111111111111111111111111111111"), + const_address("11111111111111111111111111111111"), + const_address("11111111111111111111111111111111"), + const_address("11111111111111111111111111111111"), + const_address("11111111111111111111111111111111"), + const_address("11111111111111111111111111111111"), + const_address("11111111111111111111111111111111"), + const_address("11111111111111111111111111111111"), + const_address("11111111111111111111111111111111"), + const_address("11111111111111111111111111111111"), + const_address("11111111111111111111111111111111"), + const_address("11111111111111111111111111111111"), + const_address("11111111111111111111111111111111"), + const_address("11111111111111111111111111111111"), + const_address("11111111111111111111111111111111"), + const_address("11111111111111111111111111111111"), + const_address("11111111111111111111111111111111"), + const_address("11111111111111111111111111111111"), + const_address("11111111111111111111111111111111"), + const_address("11111111111111111111111111111111"), + const_address("11111111111111111111111111111111"), + const_address("11111111111111111111111111111111"), + const_address("11111111111111111111111111111111"), + const_address("11111111111111111111111111111111"), + const_address("11111111111111111111111111111111"), + const_address("11111111111111111111111111111111"), + const_address("11111111111111111111111111111111"), + const_address("11111111111111111111111111111111"), + const_address("11111111111111111111111111111111"), + const_address("11111111111111111111111111111111"), + const_address("11111111111111111111111111111111"), + const_address("11111111111111111111111111111111"), + const_address("11111111111111111111111111111111"), + const_address("11111111111111111111111111111111"), + const_address("11111111111111111111111111111111"), + const_address("11111111111111111111111111111111"), + const_address("11111111111111111111111111111111"), + const_address("11111111111111111111111111111111"), + const_address("11111111111111111111111111111111"), + const_address("11111111111111111111111111111111"), + const_address("11111111111111111111111111111111"), + const_address("11111111111111111111111111111111"), + const_address("11111111111111111111111111111111"), + const_address("11111111111111111111111111111111"), + const_address("11111111111111111111111111111111"), + const_address("11111111111111111111111111111111"), + const_address("11111111111111111111111111111111"), + const_address("11111111111111111111111111111111"), + const_address("11111111111111111111111111111111"), + const_address("11111111111111111111111111111111"), + const_address("11111111111111111111111111111111"), + const_address("11111111111111111111111111111111"), + const_address("11111111111111111111111111111111"), + const_address("11111111111111111111111111111111"), + const_address("11111111111111111111111111111111"), + const_address("11111111111111111111111111111111"), + const_address("11111111111111111111111111111111"), + const_address("11111111111111111111111111111111"), + const_address("11111111111111111111111111111111"), + const_address("11111111111111111111111111111111"), + const_address("11111111111111111111111111111111"), + const_address("11111111111111111111111111111111"), + const_address("11111111111111111111111111111111"), + const_address("11111111111111111111111111111111"), + const_address("11111111111111111111111111111111"), + ], + ), }; pub const BASHFUL_ACCOUNT_ID: &str = "cFLbasoV5juCGacy9LvvwSgkupFiFmwt8RmAuA3xcaY5YmkBe"; diff --git a/state-chain/node/src/chain_spec/testnet.rs b/state-chain/node/src/chain_spec/testnet.rs index a24e8953b3b..161c7f6c036 100644 --- a/state-chain/node/src/chain_spec/testnet.rs +++ b/state-chain/node/src/chain_spec/testnet.rs @@ -63,43 +63,203 @@ pub const ENV: StateChainEnvironment = StateChainEnvironment { sol_durable_nonces_and_accounts: [ ( const_address("2cNMwUCF51djw2xAiiU54wz1WrU8uG4Q8Kp8nfEuwghw"), - const_hash("2qVz58R5aPmF5Q61VaKXnpWQtngdh4Jgbeko32fEcECu"), + const_hash("A6PxZEnTwTrLQG8pVBwytG8YLRqPUeEdsXHJP2UQ5RSF"), ), ( const_address("HVG21SovGzMBJDB9AQNuWb6XYq4dDZ6yUwCbRUuFnYDo"), - const_hash("6fxCujPRyyTPzcZWpkDRhvDC4NXf4GB5tCTbQRDnz2iw"), + const_hash("EtK5bRt2pDX3CJyDzsdDtzjRf7v15NPR8JVpMikh6sNh"), ), ( const_address("HDYArziNzyuNMrK89igisLrXFe78ti8cvkcxfx4qdU2p"), - const_hash("2VUnNMpXzohc4284EyuhT7PEuUdqy9E7AfxAP8nrm9cv"), + const_hash("3PkYapCizvyiFPBEg2pkiBAxnVYfpR2VWs7H6FQcD7rc"), ), ( const_address("HLPsNyxBqfq2tLE31v6RiViLp2dTXtJRgHgsWgNDRPs2"), - const_hash("7bNgRtjaTgCiXwEagFv2cndco5aTzW1dEXGTZp9EDHgE"), + const_hash("HqPcXp31mYG1G4DP3c9F262pjXKeMzb4hbAwqsdLKrmM"), ), ( const_address("GKMP63TqzbueWTrFYjRwMNkAyTHpQ54notRbAbMDmePM"), - const_hash("DSSpXCVb6LU4a91TAkqyUHGXB1bspfLUxKzb5VhGUvyf"), + const_hash("2cMqnuCCnGWm56LFPe9mZuGHdhzpFpwwv2io9Q99EMjE"), ), ( const_address("EpmHm2aSPsB5ZZcDjqDhQ86h1BV32GFCbGSMuC58Y2tn"), - const_hash("DEwmxJ6xUTXVMnZjvSsRBb9knA1JG3ETT1CQXz5q3yzY"), + const_hash("7ZZpMge82HiNhhyv1LDzfwq7Ak9sF943TmLkQNuR7ZZh"), ), ( const_address("9yBZNMrLrtspj4M7bEf2X6tqbqHxD2vNETw8qSdvJHMa"), - const_hash("ERJZ2GKvYB2f7MroWy8qEA3xdvMNHg2DUqjBJ6KVzXYE"), + const_hash("Ee2tKBQguV5Rfsa738jBTRCU7vczXkZYnddiqwSRz2Dz"), ), ( const_address("J9dT7asYJFGS68NdgDCYjzU2Wi8uBoBusSHN1Z6JLWna"), - const_hash("Ecqa1ZZwjS6Lz74k2kXvVKcrWXJNiVGzLqfe1ftBcCYj"), + const_hash("BhW9y8kkdBFiWnwzrYihhjhreovZd3TfZE7uaQnKz8ea"), ), ( const_address("GUMpVpQFNYJvSbyTtUarZVL7UDUgErKzDTSVJhekUX55"), - const_hash("HuksgAnauQ9wTextjMhHVB6oVSCT3GKGb6j1DniSS8eL"), + const_hash("5CGa6yRJsVStdMR4PkUNGW5F13UeHBuqyurkmNByrgxj"), ), ( const_address("AUiHYbzH7qLZSkb3u7nAqtvqC7e41sEzgWjBEvXrpfGv"), - const_hash("2TR5QRLhPzPzB6Gvs4iZsq6Dp8v5w2LamrE9BFrsNkzW"), + const_hash("DCrChXBpKFjq61yYdULyYEnfqtcYkf1ACQqDNkgfwhF9"), + ), + ( + const_address("BN2vyodNYQQTrx3gtaDAL2UGGVtZwFeF5M8krE5aYYES"), + const_hash("4fjG6oYKadvnsbzAzomF5k2Zdc4DuuUyT71nueAeykMW"), + ), + ( + const_address("Gwq9TAQCjbJtdnmtxQa3PbHFfbr6YTUBMDjEP9x2uXnH"), + const_hash("GK29hbKjKWNwdF4KT11MzkrmQPsYPwE41qZMnLVcQPaS"), + ), + ( + const_address("3pGbKatko2ckoLEy139McfKiirNgy9brYxieNqFGdN1W"), + const_hash("5cinXdpw2KAGzmiXXegWJRdDDboXbDHaQaT3WFsH3txb"), + ), + ( + const_address("9Mcd8BTievK2yTvyiqG9Ft4HfDFf6mjGFBWMnCSRQP8S"), + const_hash("DRoAyPDtsg9CCMBSN6egFsWsP2zsQBAxCzN6fAdtQxJU"), + ), + ( + const_address("AEZG74RoqM6sxf79eTizq5ShB4JTuCkMVwUgtnC8H94z"), + const_hash("G8ZKHMsWFSoKJAtVbm1xgv8VjT5F6YBeiZbbzpVHuuyM"), + ), + ( + const_address("APLkgyCWi8DFAMF4KikjTu8YnUG1r7sMjVEfDiaBRZnS"), + const_hash("BMUqNXhMoB6VWsR7jHgRcv7yio8L5vjHdGby7gEJ4Pd2"), + ), + ( + const_address("4ShNXTTHvpVt6bQdZTRdyW6yWXDzrPupdMuxajbEoGE4"), + const_hash("52yamKJdMiQ5tEUyhkngvjR3XFXp7dmJzYsVsLbPs9JX"), + ), + ( + const_address("FgZp6NJYWw15U51ynfXCfU9vq3eVgDDAHMSfJ8fFBZZ8"), + const_hash("AX3qKNMBRKZimeCsBEhtp7heeduKekj85a4UpdN34HFe"), + ), + ( + const_address("ENQ9Mmg87KFLX8ncXRPDBSd7jhKCtPBi8QzAh4rkREgP"), + const_hash("GGFme2ydkkbDzq7LhVDMX5SsFf2yGLf7uKNSLLhvrGMd"), + ), + ( + const_address("Hhay1UwkzkFUgrGUYuiCvUwv7kErNzAcZnVRQ2fetT7K"), + const_hash("HMN14axscHALAuknuwSpVkEmAJkZWeJoNAjJuXUjRQbN"), + ), + ( + const_address("2fUVR42opcHgGLrY1eguDXLYfQPHQe9ReJNmRorVt9v8"), + const_hash("RWoH6shzxCS9dmW2mg37cujXxARBRBunbHEtZwUz1Gj"), + ), + ( + const_address("HfKr1wJASkW5UHs8yNWAqMeaYJdp8K2mdYwkbdVRdVrm"), + const_hash("2dhBBWYQE2Fvm4ShUQjno8ydJb5H6rUmBZ1e6TJHDupL"), + ), + ( + const_address("DrpYkMpJWkpNqX9yYgQfc3uZrCVYobJ3RbTABcSkHJkM"), + const_hash("6VCThFyLtFCKk35wihyrRUa6dubBU7skhJdRRDBfH4Md"), + ), + ( + const_address("HCXc3o2go1Y2KhfnykLYXEvofLifXTb7GT13w4GsFmGw"), + const_hash("EggsCqUiKJVxmN7a9s7RScXUAJRjekjwCAaeQvK9TcJ4"), + ), + ( + const_address("FFKYhae4HSnMmA6JJfe8NNtZeySA9yRWLaHzE2jqfhBr"), + const_hash("2E8BayMrqL3on6bhcMms6dsm3PwKcxttFSuHDNe6vZ4B"), + ), + ( + const_address("AaRrJovR9Npna4fuCJ17AB3cJAMzoNDaZymRTbGGzUZm"), + const_hash("D5bhT4vxhrtkfPeyZbvCtwzAnHSwBaa287CZZU8F6fye"), + ), + ( + const_address("5S8DzBBLvJUeyJccV4DekAK8KJA5PDcjwxRxCvgdyBEi"), + const_hash("8o7RkbTeV9r1yMgXaTzjcPys2FEkqieHER6Z5Fdc8hbw"), + ), + ( + const_address("Cot1DQZpm859brrre7swrDhTYLj2NJbg3hdMKCHk5zSk"), + const_hash("Gd86jHRKKSxrho3WKni5HYe6runTFX4cyFUQtcmJeiuk"), + ), + ( + const_address("4mfDv7PisvtMhiyGmvD6vxRdVpB842XbUhimAZYxMEn9"), + const_hash("4YQLN6N7G9nFwT8UVdFE2ZniW1gf89Qjob16wxMThxqN"), + ), + ( + const_address("BHW7qFCNHTX5QD5yJpT1hn1VM817Ji5ksZqiXMfqGrsj"), + const_hash("Ft3vnX4KQBa22CVpPkmvk5QNMGwL2xhQVxQtFJwK5MvJ"), + ), + ( + const_address("EJqZLeaxi2gVsJgQW4nbmxyWJukK25n7jB8qWKoDgWUN"), + const_hash("5tZeUYorHfdh9FYsA9yKjanFRwxjGxM9YLzNAfiwhZUf"), + ), + ( + const_address("BJqTPWyoqqgzhkLh1pbPh4KWBqg8kCUNzJ81avitSQrm"), + const_hash("5ggDcExaPfgjsmrhBS3D2UnRaEPsCGKGDkJqzF7gr92A"), + ), + ( + const_address("EkmPmEmSbwm8EDDYtLtaDgcfuLNtW7MbKx5w3FUpaGjv"), + const_hash("3G7D13ckfLCfDFC3VusXdittLHp6z6dZeUJBHTqcc2iR"), + ), + ( + const_address("CgwtCv8HQ67imnHEkz24TfXfyA2H5jurxcLGxAgDmNQj"), + const_hash("Gikpdfo6SwRqi3nTmQKuCmap3cGwupZd2poiYkUop4Sn"), + ), + ( + const_address("zfKsXSxJ4cTpKS7S6aHL1Hy3m1CEjQuySKSwkWvukQX"), + const_hash("43Kn8Kevfy2cy2fpJEhEZSpmPNwFurL2ERG5FqdSeTsq"), + ), + ( + const_address("2VvN1s6txNYyBdKpaC8b6AZKVqUQiQT2Exrpa7ffCgV6"), + const_hash("FVZKFoZ8WRdsFBp64LpTF1MrH36dHym2XZv7cJ2oYU5"), + ), + ( + const_address("A2DT1dc4rA1uMry7WCLwoUEQQNjCAsAMkB4X9Lgo88zd"), + const_hash("HjtHG8XRKyGiN8VXWmMh9oEviURAv5o2VygKTvsZjAPz"), + ), + ( + const_address("9mNBRGfTMLsSsQUn4YZfRDBVXfQ6juEWbNUTwv2ir9gC"), + const_hash("2S1aHds5wqUSyY4BmAK9YyBNGwzsQSsqGa2iyisF8t6h"), + ), + ( + const_address("3jXiydxPx1P7Ggdja5yt384ryLJAW2c8LRGV8PPRT54C"), + const_hash("Hgu6wkD6aE3uuESdW9fCWoXX4sN3eLnxYJsM7QCtrZMk"), + ), + ( + const_address("7ztGR1z28NpYjUaXyrGBzBGu62u1f9H9Pj9UVSKnT3yu"), + const_hash("9wic99ejEMQubHea9KKZZk27EU7r4LL8672D5GNrpXRG"), + ), + ( + const_address("4GdnDTr5X4eJFHuzTEBLrz3tsREo8rQro7S9YDqrbMZ9"), + const_hash("FCsgGf33ueodTVhLgQtTriNL5ZGfoaWoBkDwXSbDmLFd"), + ), + ( + const_address("ALxnH6TBKJPBFRfFZspQkxDjb9nGLUP5oxFFdZNRFgUu"), + const_hash("QkBgGAKFPtQzRj1v7sFECr8D2LMPb99AEy3w1RtKX5j"), + ), + ( + const_address("Bu3sdWtBh5TJishgK3vneh2zJg1rjLqWN5mFTHxWspwJ"), + const_hash("GWvckQW231Safveswww1GBSu4SzP5h5SgE6gugBn8upC"), + ), + ( + const_address("GvBbUTE312RXU5iXAcNWt6CuVbfsPs5Nk28D6qvU6NF3"), + const_hash("BnFsZdujQde7FnHGVcZTmvidRHBr5H87XRDDB6A5dn8D"), + ), + ( + const_address("2LLct8SsnkW3sD9Gu8CfxmDEjKAWtFXqLvA8ymMyuq8u"), + const_hash("Bnt1CWn8SEwpNqFbNxby6ysoW49wmL95Ed28pbS9v4Nx"), + ), + ( + const_address("CQ9vUhC3dSa4LyZCpWVpNbXhSn6f7J3NQXWDDvMMk6aW"), + const_hash("2yVSXvwXjtA5tqqWUKjxBuYjME6pKwJGA12NUc31x9VS"), + ), + ( + const_address("Cw8GqRmKzCbp7UFfafECC9sf9f936Chgx3BkbSgnXfmU"), + const_hash("FDPW3e2qPvNrmi1dqxsMaYAXLq9vMQYda5fKsVzNBUCv"), + ), + ( + const_address("GFJ6m6YdNT1tUfAxyD2BiPSx8gwt3xe4jVAKdtdSUt8W"), + const_hash("4tUTcUePrDUu48ZyH584aYv8JAbPrc9aDcH6bjxhEJon"), + ), + ( + const_address("7bphTuo5BKs4JJw5WPusCevmnoRk9ocFiB8EGgfwnh4c"), + const_hash("SyhFE8iYH9ZsZNBDWLvTDTBFBoEjxs12msF3xprikgf"), + ), + ( + const_address("EFbUq18Mcdi2gGauRzmbNeD5ixaB7EYVk5JZgAF34LoS"), + const_hash("53EBQYjZ7yH3Zy6KCWjSGAUGTki2YjxsHkrfXnvsj9vT"), ), ], sol_swap_endpoint_program: SolAddress(bs58_array( @@ -108,6 +268,77 @@ pub const ENV: StateChainEnvironment = StateChainEnvironment { sol_swap_endpoint_program_data_account: SolAddress(bs58_array( "2tmtGLQcBd11BMiE9B1tAkQXwmPNgR79Meki2Eme4Ec9", )), + sol_alt_manager_program: SolAddress(bs58_array("49XegQyykAXwzigc6u7gXbaLjhKfNadWMZwFiovzjwUw")), + sol_address_lookup_table_account: ( + SolAddress(bs58_array("7drVSq2ymJLNnXyCciHbNqHyzuSt1SL4iQSEThiESN2c")), + [ + const_address("BttvFNSRKrkHugwDP6SpnBejCKKskHowJif1HGgBtTfG"), + const_address("SysvarRecentB1ockHashes11111111111111111111"), + const_address("TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA"), + const_address("7B13iu7bUbBX88eVBqTZkQqrErnTMazPmGLdE5RqdyKZ"), + const_address("9CGLwcPknpYs3atgwtjMX7RhgvBgaqK8wwCvXnmjEoL9"), + const_address("24PNhTaNtomHhoy3fTRaMhAFCRj4uHqhZEEoWrKDbR5p"), + const_address("Sysvar1nstructions1111111111111111111111111"), + const_address("2tmtGLQcBd11BMiE9B1tAkQXwmPNgR79Meki2Eme4Ec9"), + const_address("EWaGcrFXhf9Zq8yxSdpAa75kZmDXkRxaP17sYiL6UpZN"), + const_address("So11111111111111111111111111111111111111112"), + const_address("ATokenGPvbdGVxr1b2hvZbsiqW5xWH25efTNsLJA8knL"), + const_address("11111111111111111111111111111111"), + const_address("8inHGLHXegST3EPLcpisQe9D1hDT9r7DJjS395L3yuYf"), + const_address("35uYgHdfZQT4kHkaaXQ6ZdCkK5LFrsk43btTLbGCRCNT"), + const_address("49XegQyykAXwzigc6u7gXbaLjhKfNadWMZwFiovzjwUw"), + const_address("2cNMwUCF51djw2xAiiU54wz1WrU8uG4Q8Kp8nfEuwghw"), + const_address("HVG21SovGzMBJDB9AQNuWb6XYq4dDZ6yUwCbRUuFnYDo"), + const_address("HDYArziNzyuNMrK89igisLrXFe78ti8cvkcxfx4qdU2p"), + const_address("HLPsNyxBqfq2tLE31v6RiViLp2dTXtJRgHgsWgNDRPs2"), + const_address("GKMP63TqzbueWTrFYjRwMNkAyTHpQ54notRbAbMDmePM"), + const_address("EpmHm2aSPsB5ZZcDjqDhQ86h1BV32GFCbGSMuC58Y2tn"), + const_address("9yBZNMrLrtspj4M7bEf2X6tqbqHxD2vNETw8qSdvJHMa"), + const_address("J9dT7asYJFGS68NdgDCYjzU2Wi8uBoBusSHN1Z6JLWna"), + const_address("GUMpVpQFNYJvSbyTtUarZVL7UDUgErKzDTSVJhekUX55"), + const_address("AUiHYbzH7qLZSkb3u7nAqtvqC7e41sEzgWjBEvXrpfGv"), + const_address("BN2vyodNYQQTrx3gtaDAL2UGGVtZwFeF5M8krE5aYYES"), + const_address("Gwq9TAQCjbJtdnmtxQa3PbHFfbr6YTUBMDjEP9x2uXnH"), + const_address("3pGbKatko2ckoLEy139McfKiirNgy9brYxieNqFGdN1W"), + const_address("9Mcd8BTievK2yTvyiqG9Ft4HfDFf6mjGFBWMnCSRQP8S"), + const_address("AEZG74RoqM6sxf79eTizq5ShB4JTuCkMVwUgtnC8H94z"), + const_address("APLkgyCWi8DFAMF4KikjTu8YnUG1r7sMjVEfDiaBRZnS"), + const_address("4ShNXTTHvpVt6bQdZTRdyW6yWXDzrPupdMuxajbEoGE4"), + const_address("FgZp6NJYWw15U51ynfXCfU9vq3eVgDDAHMSfJ8fFBZZ8"), + const_address("ENQ9Mmg87KFLX8ncXRPDBSd7jhKCtPBi8QzAh4rkREgP"), + const_address("Hhay1UwkzkFUgrGUYuiCvUwv7kErNzAcZnVRQ2fetT7K"), + const_address("2fUVR42opcHgGLrY1eguDXLYfQPHQe9ReJNmRorVt9v8"), + const_address("HfKr1wJASkW5UHs8yNWAqMeaYJdp8K2mdYwkbdVRdVrm"), + const_address("DrpYkMpJWkpNqX9yYgQfc3uZrCVYobJ3RbTABcSkHJkM"), + const_address("HCXc3o2go1Y2KhfnykLYXEvofLifXTb7GT13w4GsFmGw"), + const_address("FFKYhae4HSnMmA6JJfe8NNtZeySA9yRWLaHzE2jqfhBr"), + const_address("AaRrJovR9Npna4fuCJ17AB3cJAMzoNDaZymRTbGGzUZm"), + const_address("5S8DzBBLvJUeyJccV4DekAK8KJA5PDcjwxRxCvgdyBEi"), + const_address("Cot1DQZpm859brrre7swrDhTYLj2NJbg3hdMKCHk5zSk"), + const_address("4mfDv7PisvtMhiyGmvD6vxRdVpB842XbUhimAZYxMEn9"), + const_address("BHW7qFCNHTX5QD5yJpT1hn1VM817Ji5ksZqiXMfqGrsj"), + const_address("EJqZLeaxi2gVsJgQW4nbmxyWJukK25n7jB8qWKoDgWUN"), + const_address("BJqTPWyoqqgzhkLh1pbPh4KWBqg8kCUNzJ81avitSQrm"), + const_address("EkmPmEmSbwm8EDDYtLtaDgcfuLNtW7MbKx5w3FUpaGjv"), + const_address("CgwtCv8HQ67imnHEkz24TfXfyA2H5jurxcLGxAgDmNQj"), + const_address("zfKsXSxJ4cTpKS7S6aHL1Hy3m1CEjQuySKSwkWvukQX"), + const_address("2VvN1s6txNYyBdKpaC8b6AZKVqUQiQT2Exrpa7ffCgV6"), + const_address("A2DT1dc4rA1uMry7WCLwoUEQQNjCAsAMkB4X9Lgo88zd"), + const_address("9mNBRGfTMLsSsQUn4YZfRDBVXfQ6juEWbNUTwv2ir9gC"), + const_address("3jXiydxPx1P7Ggdja5yt384ryLJAW2c8LRGV8PPRT54C"), + const_address("7ztGR1z28NpYjUaXyrGBzBGu62u1f9H9Pj9UVSKnT3yu"), + const_address("4GdnDTr5X4eJFHuzTEBLrz3tsREo8rQro7S9YDqrbMZ9"), + const_address("ALxnH6TBKJPBFRfFZspQkxDjb9nGLUP5oxFFdZNRFgUu"), + const_address("Bu3sdWtBh5TJishgK3vneh2zJg1rjLqWN5mFTHxWspwJ"), + const_address("GvBbUTE312RXU5iXAcNWt6CuVbfsPs5Nk28D6qvU6NF3"), + const_address("2LLct8SsnkW3sD9Gu8CfxmDEjKAWtFXqLvA8ymMyuq8u"), + const_address("CQ9vUhC3dSa4LyZCpWVpNbXhSn6f7J3NQXWDDvMMk6aW"), + const_address("Cw8GqRmKzCbp7UFfafECC9sf9f936Chgx3BkbSgnXfmU"), + const_address("GFJ6m6YdNT1tUfAxyD2BiPSx8gwt3xe4jVAKdtdSUt8W"), + const_address("7bphTuo5BKs4JJw5WPusCevmnoRk9ocFiB8EGgfwnh4c"), + const_address("EFbUq18Mcdi2gGauRzmbNeD5ixaB7EYVk5JZgAF34LoS"), + ], + ), }; pub const EPOCH_DURATION_BLOCKS: BlockNumber = 3 * HOURS; diff --git a/state-chain/pallets/cf-environment/src/lib.rs b/state-chain/pallets/cf-environment/src/lib.rs index 3dd391b9bf8..3c0fd634dfe 100644 --- a/state-chain/pallets/cf-environment/src/lib.rs +++ b/state-chain/pallets/cf-environment/src/lib.rs @@ -39,7 +39,7 @@ pub mod weights; pub use weights::WeightInfo; pub mod migrations; -pub const PALLET_VERSION: StorageVersion = StorageVersion::new(13); +pub const PALLET_VERSION: StorageVersion = StorageVersion::new(14); const INITIAL_CONSOLIDATION_PARAMETERS: utxo_selection::ConsolidationParameters = utxo_selection::ConsolidationParameters { @@ -596,7 +596,7 @@ pub mod pallet { ArbitrumAddressCheckerAddress::::set(self.arb_address_checker_address); SolanaGenesisHash::::set(self.sol_genesis_hash); - SolanaApiEnvironment::::set(self.sol_api_env); + SolanaApiEnvironment::::set(self.sol_api_env.clone()); SolanaAvailableNonceAccounts::::set(self.sol_durable_nonces_and_accounts.clone()); ChainflipNetworkEnvironment::::set(self.network_environment); diff --git a/state-chain/pallets/cf-environment/src/migrations.rs b/state-chain/pallets/cf-environment/src/migrations.rs index 9ecc856b6e2..31a4aab96da 100644 --- a/state-chain/pallets/cf-environment/src/migrations.rs +++ b/state-chain/pallets/cf-environment/src/migrations.rs @@ -2,7 +2,7 @@ use crate::{Config, Pallet}; #[cfg(feature = "try-runtime")] use crate::{CurrentReleaseVersion, Get}; use cf_runtime_utilities::PlaceholderMigration; -use frame_support::traits::OnRuntimeUpgrade; +use frame_support::{migrations::VersionedMigration, traits::OnRuntimeUpgrade}; #[cfg(feature = "try-runtime")] use frame_support::{pallet_prelude::DispatchError, sp_runtime}; #[cfg(feature = "try-runtime")] @@ -38,7 +38,16 @@ impl OnRuntimeUpgrade for VersionUpdate { } // Migration for Updating Solana's Api Environments. -pub type PalletMigration = (PlaceholderMigration<13, Pallet>,); +pub type PalletMigration = ( + VersionedMigration< + 13, + 14, + SolApiEnvironmentMigration, + Pallet, + ::DbWeight, + >, + PlaceholderMigration<14, Pallet>, +); #[cfg(test)] mod tests { diff --git a/state-chain/pallets/cf-environment/src/migrations/sol_api_environment.rs b/state-chain/pallets/cf-environment/src/migrations/sol_api_environment.rs index bee2d75ac54..9b85636453c 100644 --- a/state-chain/pallets/cf-environment/src/migrations/sol_api_environment.rs +++ b/state-chain/pallets/cf-environment/src/migrations/sol_api_environment.rs @@ -2,7 +2,13 @@ use crate::*; use frame_support::{pallet_prelude::Weight, traits::UncheckedOnRuntimeUpgrade}; -use cf_chains::{evm::H256, sol::SolAddress}; +use cf_chains::{ + evm::H256, + sol::{ + sol_tx_core::consts::{const_address, const_hash}, + AddressLookupTableAccount, SolAddress, + }, +}; use cf_utilities::bs58_array; use codec::{Decode, Encode}; use scale_info::TypeInfo; @@ -18,6 +24,8 @@ pub mod old { pub token_vault_pda_account: SolAddress, pub usdc_token_mint_pubkey: SolAddress, pub usdc_token_vault_ata: SolAddress, + pub swap_endpoint_program: SolAddress, + pub swap_endpoint_program_data_account: SolAddress, } } @@ -34,40 +42,315 @@ impl> UncheckedOnRuntimeUpgrade for SolApiEnvironmentMigr token_vault_pda_account, usdc_token_mint_pubkey, usdc_token_vault_ata, + swap_endpoint_program, + swap_endpoint_program_data_account, }| { - let (swap_endpoint_program, swap_endpoint_program_data_account) = + let (alt_manager_program, address_lookup_table_account) = match cf_runtime_utilities::genesis_hashes::genesis_hash::() { + // TODO: To update with real values cf_runtime_utilities::genesis_hashes::BERGHAIN => ( SolAddress(bs58_array( "J88B7gmadHzTNGiy54c9Ms8BsEXNdB2fntFyhKpk3qoT", )), - SolAddress(bs58_array( - "FmAcjWaRFUxGWBfGT7G3CzcFeJFsewQ4KPJVG4f6fcob", - )), + ( + SolAddress(bs58_array( + "FmAcjWaRFUxGWBfGT7G3CzcFeJFsewQ4KPJVG4f6fcob", + )), + vec![], + ), ), + // TODO: To update with the right values cf_runtime_utilities::genesis_hashes::PERSEVERANCE => ( SolAddress(bs58_array( "DeL6iGV5RWrWh7cPoEa7tRHM8XURAaB4vPjfX5qVyuWE", )), - SolAddress(bs58_array( - "12MYcNumSQCn81yKRfrk5P5ThM5ivkLiZda979hhKJDR", - )), + ( + SolAddress(bs58_array( + "12MYcNumSQCn81yKRfrk5P5ThM5ivkLiZda979hhKJDR", + )), + vec![], + ), ), + // TODO: To update with the right values cf_runtime_utilities::genesis_hashes::SISYPHOS => ( SolAddress(bs58_array( "FtK6TR2ZqhChxXeDFoVzM9gYDPA18tGrKoBb3hX7nPwt", )), - SolAddress(bs58_array( - "EXeku7Q9AiAXBdH7cUHw2ue3okhrofvDZR7EBE1BVQZu", - )), + ( + SolAddress(bs58_array( + "EXeku7Q9AiAXBdH7cUHw2ue3okhrofvDZR7EBE1BVQZu", + )), + vec![], + ), ), _ => ( SolAddress(bs58_array( - "35uYgHdfZQT4kHkaaXQ6ZdCkK5LFrsk43btTLbGCRCNT", - )), - SolAddress(bs58_array( - "2tmtGLQcBd11BMiE9B1tAkQXwmPNgR79Meki2Eme4Ec9", + "49XegQyykAXwzigc6u7gXbaLjhKfNadWMZwFiovzjwUw", )), + ( + SolAddress(bs58_array( + "7drVSq2ymJLNnXyCciHbNqHyzuSt1SL4iQSEThiESN2c", + )), + vec![ + const_address( + "BttvFNSRKrkHugwDP6SpnBejCKKskHowJif1HGgBtTfG", + ) + .into(), + const_address( + "SysvarRecentB1ockHashes11111111111111111111", + ) + .into(), + const_address( + "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA", + ) + .into(), + const_address( + "7B13iu7bUbBX88eVBqTZkQqrErnTMazPmGLdE5RqdyKZ", + ) + .into(), + const_address( + "9CGLwcPknpYs3atgwtjMX7RhgvBgaqK8wwCvXnmjEoL9", + ) + .into(), + const_address( + "24PNhTaNtomHhoy3fTRaMhAFCRj4uHqhZEEoWrKDbR5p", + ) + .into(), + const_address( + "Sysvar1nstructions1111111111111111111111111", + ) + .into(), + const_address( + "2tmtGLQcBd11BMiE9B1tAkQXwmPNgR79Meki2Eme4Ec9", + ) + .into(), + const_address( + "EWaGcrFXhf9Zq8yxSdpAa75kZmDXkRxaP17sYiL6UpZN", + ) + .into(), + const_address( + "So11111111111111111111111111111111111111112", + ) + .into(), + const_address( + "ATokenGPvbdGVxr1b2hvZbsiqW5xWH25efTNsLJA8knL", + ) + .into(), + const_address("11111111111111111111111111111111").into(), + const_address( + "8inHGLHXegST3EPLcpisQe9D1hDT9r7DJjS395L3yuYf", + ) + .into(), + const_address( + "35uYgHdfZQT4kHkaaXQ6ZdCkK5LFrsk43btTLbGCRCNT", + ) + .into(), + const_address( + "49XegQyykAXwzigc6u7gXbaLjhKfNadWMZwFiovzjwUw", + ) + .into(), + const_address( + "2cNMwUCF51djw2xAiiU54wz1WrU8uG4Q8Kp8nfEuwghw", + ) + .into(), + const_address( + "HVG21SovGzMBJDB9AQNuWb6XYq4dDZ6yUwCbRUuFnYDo", + ) + .into(), + const_address( + "HDYArziNzyuNMrK89igisLrXFe78ti8cvkcxfx4qdU2p", + ) + .into(), + const_address( + "HLPsNyxBqfq2tLE31v6RiViLp2dTXtJRgHgsWgNDRPs2", + ) + .into(), + const_address( + "GKMP63TqzbueWTrFYjRwMNkAyTHpQ54notRbAbMDmePM", + ) + .into(), + const_address( + "EpmHm2aSPsB5ZZcDjqDhQ86h1BV32GFCbGSMuC58Y2tn", + ) + .into(), + const_address( + "9yBZNMrLrtspj4M7bEf2X6tqbqHxD2vNETw8qSdvJHMa", + ) + .into(), + const_address( + "J9dT7asYJFGS68NdgDCYjzU2Wi8uBoBusSHN1Z6JLWna", + ) + .into(), + const_address( + "GUMpVpQFNYJvSbyTtUarZVL7UDUgErKzDTSVJhekUX55", + ) + .into(), + const_address( + "AUiHYbzH7qLZSkb3u7nAqtvqC7e41sEzgWjBEvXrpfGv", + ) + .into(), + const_address( + "BN2vyodNYQQTrx3gtaDAL2UGGVtZwFeF5M8krE5aYYES", + ) + .into(), + const_address( + "Gwq9TAQCjbJtdnmtxQa3PbHFfbr6YTUBMDjEP9x2uXnH", + ) + .into(), + const_address( + "3pGbKatko2ckoLEy139McfKiirNgy9brYxieNqFGdN1W", + ) + .into(), + const_address( + "9Mcd8BTievK2yTvyiqG9Ft4HfDFf6mjGFBWMnCSRQP8S", + ) + .into(), + const_address( + "AEZG74RoqM6sxf79eTizq5ShB4JTuCkMVwUgtnC8H94z", + ) + .into(), + const_address( + "APLkgyCWi8DFAMF4KikjTu8YnUG1r7sMjVEfDiaBRZnS", + ) + .into(), + const_address( + "4ShNXTTHvpVt6bQdZTRdyW6yWXDzrPupdMuxajbEoGE4", + ) + .into(), + const_address( + "FgZp6NJYWw15U51ynfXCfU9vq3eVgDDAHMSfJ8fFBZZ8", + ) + .into(), + const_address( + "ENQ9Mmg87KFLX8ncXRPDBSd7jhKCtPBi8QzAh4rkREgP", + ) + .into(), + const_address( + "Hhay1UwkzkFUgrGUYuiCvUwv7kErNzAcZnVRQ2fetT7K", + ) + .into(), + const_address( + "2fUVR42opcHgGLrY1eguDXLYfQPHQe9ReJNmRorVt9v8", + ) + .into(), + const_address( + "HfKr1wJASkW5UHs8yNWAqMeaYJdp8K2mdYwkbdVRdVrm", + ) + .into(), + const_address( + "DrpYkMpJWkpNqX9yYgQfc3uZrCVYobJ3RbTABcSkHJkM", + ) + .into(), + const_address( + "HCXc3o2go1Y2KhfnykLYXEvofLifXTb7GT13w4GsFmGw", + ) + .into(), + const_address( + "FFKYhae4HSnMmA6JJfe8NNtZeySA9yRWLaHzE2jqfhBr", + ) + .into(), + const_address( + "AaRrJovR9Npna4fuCJ17AB3cJAMzoNDaZymRTbGGzUZm", + ) + .into(), + const_address( + "5S8DzBBLvJUeyJccV4DekAK8KJA5PDcjwxRxCvgdyBEi", + ) + .into(), + const_address( + "Cot1DQZpm859brrre7swrDhTYLj2NJbg3hdMKCHk5zSk", + ) + .into(), + const_address( + "4mfDv7PisvtMhiyGmvD6vxRdVpB842XbUhimAZYxMEn9", + ) + .into(), + const_address( + "BHW7qFCNHTX5QD5yJpT1hn1VM817Ji5ksZqiXMfqGrsj", + ) + .into(), + const_address( + "EJqZLeaxi2gVsJgQW4nbmxyWJukK25n7jB8qWKoDgWUN", + ) + .into(), + const_address( + "BJqTPWyoqqgzhkLh1pbPh4KWBqg8kCUNzJ81avitSQrm", + ) + .into(), + const_address( + "EkmPmEmSbwm8EDDYtLtaDgcfuLNtW7MbKx5w3FUpaGjv", + ) + .into(), + const_address( + "CgwtCv8HQ67imnHEkz24TfXfyA2H5jurxcLGxAgDmNQj", + ) + .into(), + const_address( + "zfKsXSxJ4cTpKS7S6aHL1Hy3m1CEjQuySKSwkWvukQX", + ) + .into(), + const_address( + "2VvN1s6txNYyBdKpaC8b6AZKVqUQiQT2Exrpa7ffCgV6", + ) + .into(), + const_address( + "A2DT1dc4rA1uMry7WCLwoUEQQNjCAsAMkB4X9Lgo88zd", + ) + .into(), + const_address( + "9mNBRGfTMLsSsQUn4YZfRDBVXfQ6juEWbNUTwv2ir9gC", + ) + .into(), + const_address( + "3jXiydxPx1P7Ggdja5yt384ryLJAW2c8LRGV8PPRT54C", + ) + .into(), + const_address( + "7ztGR1z28NpYjUaXyrGBzBGu62u1f9H9Pj9UVSKnT3yu", + ) + .into(), + const_address( + "4GdnDTr5X4eJFHuzTEBLrz3tsREo8rQro7S9YDqrbMZ9", + ) + .into(), + const_address( + "ALxnH6TBKJPBFRfFZspQkxDjb9nGLUP5oxFFdZNRFgUu", + ) + .into(), + const_address( + "Bu3sdWtBh5TJishgK3vneh2zJg1rjLqWN5mFTHxWspwJ", + ) + .into(), + const_address( + "GvBbUTE312RXU5iXAcNWt6CuVbfsPs5Nk28D6qvU6NF3", + ) + .into(), + const_address( + "2LLct8SsnkW3sD9Gu8CfxmDEjKAWtFXqLvA8ymMyuq8u", + ) + .into(), + const_address( + "CQ9vUhC3dSa4LyZCpWVpNbXhSn6f7J3NQXWDDvMMk6aW", + ) + .into(), + const_address( + "Cw8GqRmKzCbp7UFfafECC9sf9f936Chgx3BkbSgnXfmU", + ) + .into(), + const_address( + "GFJ6m6YdNT1tUfAxyD2BiPSx8gwt3xe4jVAKdtdSUt8W", + ) + .into(), + const_address( + "7bphTuo5BKs4JJw5WPusCevmnoRk9ocFiB8EGgfwnh4c", + ) + .into(), + const_address( + "EFbUq18Mcdi2gGauRzmbNeD5ixaB7EYVk5JZgAF34LoS", + ) + .into(), + ], + ), ), }; @@ -77,15 +360,230 @@ impl> UncheckedOnRuntimeUpgrade for SolApiEnvironmentMigr token_vault_pda_account, usdc_token_mint_pubkey, usdc_token_vault_ata, - - // Newly inserted values swap_endpoint_program, swap_endpoint_program_data_account, + + // Newly inserted values + alt_manager_program, + address_lookup_table_account: AddressLookupTableAccount { + key: address_lookup_table_account.0.into(), + addresses: address_lookup_table_account.1, + }, } }, ) }); + // Insert new nonces into storage + match cf_runtime_utilities::genesis_hashes::genesis_hash::() { + cf_runtime_utilities::genesis_hashes::BERGHAIN => (), + // TODO: To add the right values + cf_runtime_utilities::genesis_hashes::PERSEVERANCE => (), + // TODO: To add the right values + cf_runtime_utilities::genesis_hashes::SISYPHOS => (), + _ => { + SolanaAvailableNonceAccounts::::append(( + const_address("BN2vyodNYQQTrx3gtaDAL2UGGVtZwFeF5M8krE5aYYES"), + const_hash("4fjG6oYKadvnsbzAzomF5k2Zdc4DuuUyT71nueAeykMW"), + )); + + SolanaAvailableNonceAccounts::::append(( + const_address("Gwq9TAQCjbJtdnmtxQa3PbHFfbr6YTUBMDjEP9x2uXnH"), + const_hash("GK29hbKjKWNwdF4KT11MzkrmQPsYPwE41qZMnLVcQPaS"), + )); + + SolanaAvailableNonceAccounts::::append(( + const_address("3pGbKatko2ckoLEy139McfKiirNgy9brYxieNqFGdN1W"), + const_hash("5cinXdpw2KAGzmiXXegWJRdDDboXbDHaQaT3WFsH3txb"), + )); + + SolanaAvailableNonceAccounts::::append(( + const_address("9Mcd8BTievK2yTvyiqG9Ft4HfDFf6mjGFBWMnCSRQP8S"), + const_hash("DRoAyPDtsg9CCMBSN6egFsWsP2zsQBAxCzN6fAdtQxJU"), + )); + + SolanaAvailableNonceAccounts::::append(( + const_address("AEZG74RoqM6sxf79eTizq5ShB4JTuCkMVwUgtnC8H94z"), + const_hash("G8ZKHMsWFSoKJAtVbm1xgv8VjT5F6YBeiZbbzpVHuuyM"), + )); + + SolanaAvailableNonceAccounts::::append(( + const_address("APLkgyCWi8DFAMF4KikjTu8YnUG1r7sMjVEfDiaBRZnS"), + const_hash("BMUqNXhMoB6VWsR7jHgRcv7yio8L5vjHdGby7gEJ4Pd2"), + )); + + SolanaAvailableNonceAccounts::::append(( + const_address("4ShNXTTHvpVt6bQdZTRdyW6yWXDzrPupdMuxajbEoGE4"), + const_hash("52yamKJdMiQ5tEUyhkngvjR3XFXp7dmJzYsVsLbPs9JX"), + )); + + SolanaAvailableNonceAccounts::::append(( + const_address("FgZp6NJYWw15U51ynfXCfU9vq3eVgDDAHMSfJ8fFBZZ8"), + const_hash("AX3qKNMBRKZimeCsBEhtp7heeduKekj85a4UpdN34HFe"), + )); + + SolanaAvailableNonceAccounts::::append(( + const_address("ENQ9Mmg87KFLX8ncXRPDBSd7jhKCtPBi8QzAh4rkREgP"), + const_hash("GGFme2ydkkbDzq7LhVDMX5SsFf2yGLf7uKNSLLhvrGMd"), + )); + + SolanaAvailableNonceAccounts::::append(( + const_address("Hhay1UwkzkFUgrGUYuiCvUwv7kErNzAcZnVRQ2fetT7K"), + const_hash("HMN14axscHALAuknuwSpVkEmAJkZWeJoNAjJuXUjRQbN"), + )); + + SolanaAvailableNonceAccounts::::append(( + const_address("2fUVR42opcHgGLrY1eguDXLYfQPHQe9ReJNmRorVt9v8"), + const_hash("RWoH6shzxCS9dmW2mg37cujXxARBRBunbHEtZwUz1Gj"), + )); + + SolanaAvailableNonceAccounts::::append(( + const_address("HfKr1wJASkW5UHs8yNWAqMeaYJdp8K2mdYwkbdVRdVrm"), + const_hash("2dhBBWYQE2Fvm4ShUQjno8ydJb5H6rUmBZ1e6TJHDupL"), + )); + + SolanaAvailableNonceAccounts::::append(( + const_address("DrpYkMpJWkpNqX9yYgQfc3uZrCVYobJ3RbTABcSkHJkM"), + const_hash("6VCThFyLtFCKk35wihyrRUa6dubBU7skhJdRRDBfH4Md"), + )); + + SolanaAvailableNonceAccounts::::append(( + const_address("HCXc3o2go1Y2KhfnykLYXEvofLifXTb7GT13w4GsFmGw"), + const_hash("EggsCqUiKJVxmN7a9s7RScXUAJRjekjwCAaeQvK9TcJ4"), + )); + + SolanaAvailableNonceAccounts::::append(( + const_address("FFKYhae4HSnMmA6JJfe8NNtZeySA9yRWLaHzE2jqfhBr"), + const_hash("2E8BayMrqL3on6bhcMms6dsm3PwKcxttFSuHDNe6vZ4B"), + )); + + SolanaAvailableNonceAccounts::::append(( + const_address("AaRrJovR9Npna4fuCJ17AB3cJAMzoNDaZymRTbGGzUZm"), + const_hash("D5bhT4vxhrtkfPeyZbvCtwzAnHSwBaa287CZZU8F6fye"), + )); + + SolanaAvailableNonceAccounts::::append(( + const_address("5S8DzBBLvJUeyJccV4DekAK8KJA5PDcjwxRxCvgdyBEi"), + const_hash("8o7RkbTeV9r1yMgXaTzjcPys2FEkqieHER6Z5Fdc8hbw"), + )); + + SolanaAvailableNonceAccounts::::append(( + const_address("Cot1DQZpm859brrre7swrDhTYLj2NJbg3hdMKCHk5zSk"), + const_hash("Gd86jHRKKSxrho3WKni5HYe6runTFX4cyFUQtcmJeiuk"), + )); + + SolanaAvailableNonceAccounts::::append(( + const_address("4mfDv7PisvtMhiyGmvD6vxRdVpB842XbUhimAZYxMEn9"), + const_hash("4YQLN6N7G9nFwT8UVdFE2ZniW1gf89Qjob16wxMThxqN"), + )); + + SolanaAvailableNonceAccounts::::append(( + const_address("BHW7qFCNHTX5QD5yJpT1hn1VM817Ji5ksZqiXMfqGrsj"), + const_hash("Ft3vnX4KQBa22CVpPkmvk5QNMGwL2xhQVxQtFJwK5MvJ"), + )); + + SolanaAvailableNonceAccounts::::append(( + const_address("EJqZLeaxi2gVsJgQW4nbmxyWJukK25n7jB8qWKoDgWUN"), + const_hash("5tZeUYorHfdh9FYsA9yKjanFRwxjGxM9YLzNAfiwhZUf"), + )); + + SolanaAvailableNonceAccounts::::append(( + const_address("BJqTPWyoqqgzhkLh1pbPh4KWBqg8kCUNzJ81avitSQrm"), + const_hash("5ggDcExaPfgjsmrhBS3D2UnRaEPsCGKGDkJqzF7gr92A"), + )); + + SolanaAvailableNonceAccounts::::append(( + const_address("EkmPmEmSbwm8EDDYtLtaDgcfuLNtW7MbKx5w3FUpaGjv"), + const_hash("3G7D13ckfLCfDFC3VusXdittLHp6z6dZeUJBHTqcc2iR"), + )); + + SolanaAvailableNonceAccounts::::append(( + const_address("CgwtCv8HQ67imnHEkz24TfXfyA2H5jurxcLGxAgDmNQj"), + const_hash("Gikpdfo6SwRqi3nTmQKuCmap3cGwupZd2poiYkUop4Sn"), + )); + + SolanaAvailableNonceAccounts::::append(( + const_address("zfKsXSxJ4cTpKS7S6aHL1Hy3m1CEjQuySKSwkWvukQX"), + const_hash("43Kn8Kevfy2cy2fpJEhEZSpmPNwFurL2ERG5FqdSeTsq"), + )); + + SolanaAvailableNonceAccounts::::append(( + const_address("2VvN1s6txNYyBdKpaC8b6AZKVqUQiQT2Exrpa7ffCgV6"), + const_hash("FVZKFoZ8WRdsFBp64LpTF1MrH36dHym2XZv7cJ2oYU5"), + )); + + SolanaAvailableNonceAccounts::::append(( + const_address("A2DT1dc4rA1uMry7WCLwoUEQQNjCAsAMkB4X9Lgo88zd"), + const_hash("HjtHG8XRKyGiN8VXWmMh9oEviURAv5o2VygKTvsZjAPz"), + )); + + SolanaAvailableNonceAccounts::::append(( + const_address("9mNBRGfTMLsSsQUn4YZfRDBVXfQ6juEWbNUTwv2ir9gC"), + const_hash("2S1aHds5wqUSyY4BmAK9YyBNGwzsQSsqGa2iyisF8t6h"), + )); + + SolanaAvailableNonceAccounts::::append(( + const_address("3jXiydxPx1P7Ggdja5yt384ryLJAW2c8LRGV8PPRT54C"), + const_hash("Hgu6wkD6aE3uuESdW9fCWoXX4sN3eLnxYJsM7QCtrZMk"), + )); + + SolanaAvailableNonceAccounts::::append(( + const_address("7ztGR1z28NpYjUaXyrGBzBGu62u1f9H9Pj9UVSKnT3yu"), + const_hash("9wic99ejEMQubHea9KKZZk27EU7r4LL8672D5GNrpXRG"), + )); + + SolanaAvailableNonceAccounts::::append(( + const_address("4GdnDTr5X4eJFHuzTEBLrz3tsREo8rQro7S9YDqrbMZ9"), + const_hash("FCsgGf33ueodTVhLgQtTriNL5ZGfoaWoBkDwXSbDmLFd"), + )); + + SolanaAvailableNonceAccounts::::append(( + const_address("ALxnH6TBKJPBFRfFZspQkxDjb9nGLUP5oxFFdZNRFgUu"), + const_hash("QkBgGAKFPtQzRj1v7sFECr8D2LMPb99AEy3w1RtKX5j"), + )); + + SolanaAvailableNonceAccounts::::append(( + const_address("Bu3sdWtBh5TJishgK3vneh2zJg1rjLqWN5mFTHxWspwJ"), + const_hash("GWvckQW231Safveswww1GBSu4SzP5h5SgE6gugBn8upC"), + )); + + SolanaAvailableNonceAccounts::::append(( + const_address("GvBbUTE312RXU5iXAcNWt6CuVbfsPs5Nk28D6qvU6NF3"), + const_hash("BnFsZdujQde7FnHGVcZTmvidRHBr5H87XRDDB6A5dn8D"), + )); + + SolanaAvailableNonceAccounts::::append(( + const_address("2LLct8SsnkW3sD9Gu8CfxmDEjKAWtFXqLvA8ymMyuq8u"), + const_hash("Bnt1CWn8SEwpNqFbNxby6ysoW49wmL95Ed28pbS9v4Nx"), + )); + + SolanaAvailableNonceAccounts::::append(( + const_address("CQ9vUhC3dSa4LyZCpWVpNbXhSn6f7J3NQXWDDvMMk6aW"), + const_hash("2yVSXvwXjtA5tqqWUKjxBuYjME6pKwJGA12NUc31x9VS"), + )); + + SolanaAvailableNonceAccounts::::append(( + const_address("Cw8GqRmKzCbp7UFfafECC9sf9f936Chgx3BkbSgnXfmU"), + const_hash("FDPW3e2qPvNrmi1dqxsMaYAXLq9vMQYda5fKsVzNBUCv"), + )); + + SolanaAvailableNonceAccounts::::append(( + const_address("GFJ6m6YdNT1tUfAxyD2BiPSx8gwt3xe4jVAKdtdSUt8W"), + const_hash("4tUTcUePrDUu48ZyH584aYv8JAbPrc9aDcH6bjxhEJon"), + )); + + SolanaAvailableNonceAccounts::::append(( + const_address("7bphTuo5BKs4JJw5WPusCevmnoRk9ocFiB8EGgfwnh4c"), + const_hash("SyhFE8iYH9ZsZNBDWLvTDTBFBoEjxs12msF3xprikgf"), + )); + + SolanaAvailableNonceAccounts::::append(( + const_address("EFbUq18Mcdi2gGauRzmbNeD5ixaB7EYVk5JZgAF34LoS"), + const_hash("53EBQYjZ7yH3Zy6KCWjSGAUGTki2YjxsHkrfXnvsj9vT"), + )); + }, + }; + Weight::zero() } } diff --git a/state-chain/pallets/cf-environment/src/mock.rs b/state-chain/pallets/cf-environment/src/mock.rs index 4036b3dc247..27b3d7da30f 100644 --- a/state-chain/pallets/cf-environment/src/mock.rs +++ b/state-chain/pallets/cf-environment/src/mock.rs @@ -7,9 +7,9 @@ use cf_chains::{ eth, sol::{ api::{ - AllNonceAccounts, ApiEnvironment, ChainflipAddressLookupTable, ComputePrice, - CurrentAggKey, CurrentOnChainKey, DurableNonce, DurableNonceAndAccount, - RecoverDurableNonce, SolanaAddressLookupTables, SolanaApi, SolanaEnvironment, + AllNonceAccounts, ApiEnvironment, ComputePrice, CurrentAggKey, CurrentOnChainKey, + DurableNonce, DurableNonceAndAccount, RecoverDurableNonce, SolanaAddressLookupTables, + SolanaApi, SolanaEnvironment, }, SolAddress, SolAddressLookupTableAccount, SolAmount, SolApiEnvironment, SolHash, }, @@ -150,6 +150,11 @@ impl ChainEnvironment for MockSolEnvironment usdc_token_vault_ata: SolAddress([0x00; 32]), swap_endpoint_program: SolAddress([0x00; 32]), swap_endpoint_program_data_account: SolAddress([0x00; 32]), + alt_manager_program: SolAddress([0x00; 32]), + address_lookup_table_account: SolAddressLookupTableAccount { + key: SolAddress([0x00; 32]).into(), + addresses: vec![], + }, }) } } @@ -191,13 +196,6 @@ impl ChainEnvironment - for MockSolEnvironment -{ - fn lookup(_s: ChainflipAddressLookupTable) -> Option { - None - } -} impl SolanaEnvironment for MockSolEnvironment {} diff --git a/state-chain/runtime/src/chainflip.rs b/state-chain/runtime/src/chainflip.rs index 1b714cc6b48..37e1a7fbce3 100644 --- a/state-chain/runtime/src/chainflip.rs +++ b/state-chain/runtime/src/chainflip.rs @@ -50,9 +50,9 @@ use cf_chains::{ }, sol::{ api::{ - AllNonceAccounts, ApiEnvironment, ChainflipAddressLookupTable, ComputePrice, - CurrentAggKey, CurrentOnChainKey, DurableNonce, DurableNonceAndAccount, - RecoverDurableNonce, SolanaAddressLookupTables, SolanaApi, SolanaEnvironment, + AllNonceAccounts, ApiEnvironment, ComputePrice, CurrentAggKey, CurrentOnChainKey, + DurableNonce, DurableNonceAndAccount, RecoverDurableNonce, SolanaAddressLookupTables, + SolanaApi, SolanaEnvironment, }, SolAddress, SolAddressLookupTableAccount, SolAmount, SolApiEnvironment, SolanaCrypto, SolanaTransactionData, NONCE_AVAILABILITY_THRESHOLD_FOR_INITIATING_TRANSFER, @@ -605,15 +605,6 @@ impl ChainEnvironment - for SolEnvironment -{ - fn lookup(_s: ChainflipAddressLookupTable) -> Option { - // TODO Roy: Read Chainflip's ALT from the Environment pallet. - None - } -} - impl SolanaEnvironment for SolEnvironment {} pub struct TokenholderGovernanceBroadcaster;