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