Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat: Solana Versioned Transaction base PR #5635

Draft
wants to merge 4 commits into
base: main
Choose a base branch
from
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
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
1 change: 1 addition & 0 deletions .github/workflows/ci-development.yml
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ on:
branches:
- main
- "release/*"
- "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
1 change: 1 addition & 0 deletions Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

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
Loading