Skip to content

Commit

Permalink
feat: add image with ALT Manager, additional nonces and ALT witnessin…
Browse files Browse the repository at this point in the history
…g. (#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 <roy@chainflip.io>
Co-authored-by: Daniel <daniel@chainflip.io>
  • Loading branch information
3 people authored Feb 19, 2025
1 parent aabd86c commit 354c4de
Show file tree
Hide file tree
Showing 45 changed files with 2,460 additions and 205 deletions.
2 changes: 1 addition & 1 deletion .cargo/config.toml
Original file line number Diff line number Diff line change
Expand Up @@ -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 }

Expand Down
5 changes: 2 additions & 3 deletions .github/workflows/_40_post_check.yml
Original file line number Diff line number Diff line change
Expand Up @@ -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:
Expand Down Expand Up @@ -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: .
Expand Down
2 changes: 1 addition & 1 deletion .github/workflows/ci-development.yml
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
18 changes: 15 additions & 3 deletions .github/workflows/upgrade-test.yml
Original file line number Diff line number Diff line change
Expand Up @@ -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:
Expand Down Expand Up @@ -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
Expand All @@ -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
Expand Down
2 changes: 2 additions & 0 deletions bouncer/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -50,3 +50,5 @@ The following commands should be executed from the bouncer directory.
`pnpm eslint:check`
- Fix linting:<br>
`pnpm eslint:fix`
- Type checking:<br>
`pnpm tsc --noEmit`
1 change: 0 additions & 1 deletion bouncer/commands/setup_vaults.ts
Original file line number Diff line number Diff line change
Expand Up @@ -71,7 +71,6 @@ async function main(): Promise<void> {
}
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,
Expand Down
2 changes: 1 addition & 1 deletion bouncer/shared/contract_interfaces.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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',
);
Expand Down
180 changes: 170 additions & 10 deletions bouncer/shared/force_sol_nonces.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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',
);
}

Expand Down
49 changes: 25 additions & 24 deletions bouncer/shared/initialize_new_chains.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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';
Expand Down Expand Up @@ -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(
Expand Down Expand Up @@ -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(
Expand All @@ -241,5 +242,5 @@ export async function initializeSolanaPrograms(solClient: Connection, solKey: st
programId: solanaVaultProgramId,
}),
);
await signAndSendTxSol(tx);
await signAndSendTxSol(tx, false);
}
Loading

0 comments on commit 354c4de

Please sign in to comment.