From 1f57882c3d4407c16fffe1c3f94f1877c2054dc1 Mon Sep 17 00:00:00 2001 From: Baptiste Oueriagli Date: Tue, 21 Oct 2025 23:45:19 +0000 Subject: [PATCH] chore(scripts): update and fix scripts --- scripts/README.md | 32 +++++++++---------- scripts/bun.lock | 9 ------ scripts/package.json | 6 ++-- .../commands/sol/bridge/sol-vault.command.ts | 10 +----- .../commands/sol/bridge/sol-vault.handler.ts | 13 +------- .../solana-to-base/bridge-sol.handler.ts | 6 ++-- scripts/src/internal/constants.ts | 8 ++--- scripts/src/internal/sol/bridge.ts | 13 ++------ scripts/tsconfig.json | 4 ++- 9 files changed, 32 insertions(+), 69 deletions(-) diff --git a/scripts/README.md b/scripts/README.md index 28f5a94f..29b02b10 100644 --- a/scripts/README.md +++ b/scripts/README.md @@ -12,36 +12,36 @@ bun install ### Bridge Operations -- `bun cli sol onchain bridge wrap-token` - Create wrapped version of Base token on Solana -- `bun cli sol onchain bridge bridge-sol` - Bridge SOL from Solana to Base -- `bun cli sol onchain bridge bridge-spl` - Bridge SPL tokens from Solana to Base -- `bun cli sol onchain bridge bridge-wrapped-token` - Bridge wrapped tokens back to Base -- `bun cli sol onchain bridge bridge-call` - Bridge a call from Solana to Base -- `bun cli sol onchain bridge prove-message` - Prove message from Base and relay to Solana -- `bun cli sol onchain bridge relay-message` - Relay message from Base +- `bun cli sol bridge wrap-token` - Create wrapped version of Base token on Solana +- `bun cli sol bridge bridge-sol` - Bridge SOL from Solana to Base +- `bun cli sol bridge bridge-spl` - Bridge SPL tokens from Solana to Base +- `bun cli sol bridge bridge-wrapped-token` - Bridge wrapped tokens back to Base +- `bun cli sol bridge bridge-call` - Bridge a call from Solana to Base +- `bun cli sol bridge prove-message` - Prove message from Base and relay to Solana +- `bun cli sol bridge relay-message` - Relay message from Base ### Program Management -- `bun cli sol program build` - Build Solana program -- `bun cli sol program deploy` - Deploy Solana program -- `bun cli sol program generate-idl` - Generate program IDL -- `bun cli sol program generate-client` - Generate TypeScript client +- `bun cli sol build` - Build Solana program +- `bun cli sol deploy` - Deploy Solana program +- `bun cli sol generate-idl` - Generate programIDL +- `bun cli sol generate-client` - Generate TypeScript client ### SPL Token Operations -- `bun cli sol onchain spl create-mint` - Create new SPL token mint -- `bun cli sol onchain spl create-ata` - Create Associated Token Account -- `bun cli sol onchain spl mint` - Mint SPL tokens +- `bun cli sol spl create-mint` - Create new SPL token mint +- `bun cli sol spl create-ata` - Create Associated Token Account +- `bun cli sol spl mint` - Mint SPL tokens ### Utilities - `bun cli sol generate-keypair` - Generate new Solana keypair -- `bun cli utils pubkey-to-bytes32` - Convert Solana pubkey to bytes32 +- `bun cli sol pubkey-to-bytes32` - Convert Solana pubkey to bytes32 ## Non-Interactive Mode All commands support non-interactive execution by providing required arguments: ```bash -bun cli sol onchain bridge bridge-sol --cluster devnet --release prod --to 0x1234567890123456789012345678901234567890 --amount 10 --payer-kp config +bun cli sol bridge bridge-sol --deploy-env testnet-prod --to 0x1234567890123456789012345678901234567890 --amount 10 --payer-kp config --pay-for-relay ``` diff --git a/scripts/bun.lock b/scripts/bun.lock index 4f9b88ab..bfbd8b0c 100644 --- a/scripts/bun.lock +++ b/scripts/bun.lock @@ -4,7 +4,6 @@ "": { "name": "scripts", "devDependencies": { - "@base/bridge": "file:../clients/ts", "@clack/prompts": "0.11.0", "@codama/nodes-from-anchor": "1.2.9", "@codama/renderers-js": "1.4.3", @@ -30,8 +29,6 @@ "@babel/runtime": ["@babel/runtime@7.28.3", "", {}, "sha512-9uIQ10o0WGdpP6GDhXcdOJPJuDgFtIDtN/9+ArJQ2NAfAmiuhTQdzkaTGR33v43GYS2UrSA0eX2pPPHoFVvpxA=="], - "@base/bridge": ["@base/bridge@file:../clients/ts", { "devDependencies": { "@types/bun": "latest", "typescript": "5.9.3" }, "peerDependencies": { "@solana/kit": "4.0.0" } }], - "@clack/core": ["@clack/core@0.5.0", "", { "dependencies": { "picocolors": "^1.0.0", "sisteransi": "^1.0.5" } }, "sha512-p3y0FIOwaYRUPRcMO7+dlmLh8PSRcrjuTndsiA0WAFbWES0mLZlrjVoBRZ9DzkPFJZG6KGkJmoEAY0ZcVWTkow=="], "@clack/prompts": ["@clack/prompts@0.11.0", "", { "dependencies": { "@clack/core": "0.5.0", "picocolors": "^1.0.0", "sisteransi": "^1.0.5" } }, "sha512-pMN5FcrEw9hUkZA4f+zLlzivQSeQf5dRGJjSUbvVYDLvpKCdQx5OaknvKzgbtXOizhP+SJJJjqEbOe55uKKfAw=="], @@ -332,10 +329,6 @@ "zod": ["zod@4.1.12", "", {}, "sha512-JInaHOamG8pt5+Ey8kGmdcAcg3OL9reK8ltczgHTAwNhMys/6ThXHityHxVV2p3fkw/c+MAvBHFVYHFZDmjMCQ=="], - "@base/bridge/@types/bun": ["@types/bun@1.3.0", "", { "dependencies": { "bun-types": "1.3.0" } }, "sha512-+lAGCYjXjip2qY375xX/scJeVRmZ5cY0wyHYyCYxNcdEXrQ4AOe3gACgd4iQ8ksOslJtW4VNxBJ8llUwc3a6AA=="], - - "@base/bridge/typescript": ["typescript@5.9.3", "", { "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" } }, "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw=="], - "@scure/bip32/@noble/curves": ["@noble/curves@1.9.6", "", { "dependencies": { "@noble/hashes": "1.8.0" } }, "sha512-GIKz/j99FRthB8icyJQA51E8Uk5hXmdyThjgQXRKiv9h0zeRlzSCLIzFw6K1LotZ3XuB7yzlf76qk7uBmTdFqA=="], "@solana/accounts/@solana/codecs-core": ["@solana/codecs-core@4.0.0", "", { "dependencies": { "@solana/errors": "4.0.0" }, "peerDependencies": { "typescript": ">=5.3.3" } }, "sha512-28kNUsyIlhU3MO3/7ZLDqeJf2YAm32B4tnTjl5A9HrbBqsTZ+upT/RzxZGP1MMm7jnPuIKCMwmTpsyqyR6IUpw=="], @@ -404,8 +397,6 @@ "rpc-websockets/@types/ws": ["@types/ws@8.18.1", "", { "dependencies": { "@types/node": "*" } }, "sha512-ThVF6DCVhA8kUGy+aazFQ4kXQ7E1Ty7A3ypFOe0IcJV8O/M511G99AW24irKrW56Wt44yG9+ij8FaqoBGkuBXg=="], - "@base/bridge/@types/bun/bun-types": ["bun-types@1.3.0", "", { "dependencies": { "@types/node": "*" }, "peerDependencies": { "@types/react": "^19" } }, "sha512-u8X0thhx+yJ0KmkxuEo9HAtdfgCBaM/aI9K90VQcQioAmkVp3SG3FkwWGibUFz3WdXAdcsqOcbU40lK7tbHdkQ=="], - "@solana/codecs-core/@solana/errors/commander": ["commander@14.0.0", "", {}, "sha512-2uM9rYjPvyq39NwLRqaiLtWHyDC1FvryJDa2ATTVims5YAS4PupsEQsDvP14FqhFr0P49CYDugi59xaxJlTXRA=="], "@solana/codecs-data-structures/@solana/errors/commander": ["commander@14.0.0", "", {}, "sha512-2uM9rYjPvyq39NwLRqaiLtWHyDC1FvryJDa2ATTVims5YAS4PupsEQsDvP14FqhFr0P49CYDugi59xaxJlTXRA=="], diff --git a/scripts/package.json b/scripts/package.json index 928593b3..6e78fac6 100644 --- a/scripts/package.json +++ b/scripts/package.json @@ -4,7 +4,8 @@ "type": "module", "private": true, "scripts": { - "cli": "bun run src/bin.ts" + "cli": "bun run src/bin.ts", + "postinstall": "cd ../clients/ts && bun install && bun run build" }, "devDependencies": { "@codama/nodes-from-anchor": "1.2.9", @@ -20,8 +21,7 @@ "@types/bun": "latest", "viem": "2.38.0", "zod": "4.1.12", - "@clack/prompts": "0.11.0", - "@base/bridge": "file:../clients/ts" + "@clack/prompts": "0.11.0" }, "peerDependencies": { "typescript": "5.9.3" diff --git a/scripts/src/commands/sol/bridge/sol-vault.command.ts b/scripts/src/commands/sol/bridge/sol-vault.command.ts index ca5cfa76..03608384 100644 --- a/scripts/src/commands/sol/bridge/sol-vault.command.ts +++ b/scripts/src/commands/sol/bridge/sol-vault.command.ts @@ -1,7 +1,6 @@ import { Command } from "commander"; import { - getOrPromptEvmAddress, getOrPromptSolanaAddress, validateAndExecute, } from "@internal/utils/cli"; @@ -9,7 +8,6 @@ import { argsSchema, handleSolVault } from "./sol-vault.handler"; type CommanderOptions = { bridgeProgram?: string; - remoteToken?: string; }; async function collectInteractiveOptions( @@ -22,18 +20,12 @@ async function collectInteractiveOptions( "Enter bridge program address (Solana address)" ); - opts.remoteToken = await getOrPromptEvmAddress( - opts.remoteToken, - "Enter remote token address (Base EVM address)" - ); - return opts; } export const solVaultCommand = new Command("sol-vault") - .description("Display SOL vault PDA for a given remote token") + .description("Display SOL vault PDA") .option("--bridge-program
", "Bridge program address on Solana") - .option("--remote-token
", "Remote token address on Base") .action(async (options) => { const opts = await collectInteractiveOptions(options); await validateAndExecute(argsSchema, opts, handleSolVault); diff --git a/scripts/src/commands/sol/bridge/sol-vault.handler.ts b/scripts/src/commands/sol/bridge/sol-vault.handler.ts index 328d31ba..6e359197 100644 --- a/scripts/src/commands/sol/bridge/sol-vault.handler.ts +++ b/scripts/src/commands/sol/bridge/sol-vault.handler.ts @@ -1,5 +1,4 @@ import { z } from "zod"; -import { isAddress as isEvmAddress, type Address as EvmAddress } from "viem"; import { address as solanaAddress, isAddress as isSolanaAddress, @@ -15,12 +14,6 @@ export const argsSchema = z.object({ message: "Value must be a valid Solana address", }) .transform((value) => solanaAddress(value)), - remoteToken: z - .string() - .refine((value) => isEvmAddress(value), { - message: "Invalid Base/Ethereum address format", - }) - .transform((value) => value as EvmAddress), }); type Args = z.infer; @@ -30,12 +23,8 @@ export async function handleSolVault(args: Args): Promise { logger.info("--- SOL Vault PDA Lookup ---"); logger.info(`Bridge Program: ${args.bridgeProgram}`); - logger.info(`Remote token: ${args.remoteToken}`); - const vaultPubkey = await solVaultPubkey( - args.bridgeProgram, - args.remoteToken - ); + const vaultPubkey = await solVaultPubkey(args.bridgeProgram); logger.success(`SOL Vault PDA: ${vaultPubkey}`); } catch (error) { diff --git a/scripts/src/commands/sol/bridge/solana-to-base/bridge-sol.handler.ts b/scripts/src/commands/sol/bridge/solana-to-base/bridge-sol.handler.ts index 6f65223f..d3ab9484 100644 --- a/scripts/src/commands/sol/bridge/solana-to-base/bridge-sol.handler.ts +++ b/scripts/src/commands/sol/bridge/solana-to-base/bridge-sol.handler.ts @@ -20,6 +20,7 @@ import { monitorMessageExecution, buildPayForRelayInstruction, outgoingMessagePubkey, + solVaultPubkey, } from "@internal/sol"; import { CONFIGS, DEPLOY_ENVS } from "@internal/constants"; @@ -71,10 +72,7 @@ export async function handleBridgeSol(args: Args): Promise { const bridge = await fetchBridge(rpc, bridgeAccountAddress); - const [solVaultAddress] = await getProgramDerivedAddress({ - programAddress: config.solana.bridgeProgram, - seeds: [Buffer.from(getIdlConstant("SOL_VAULT_SEED"))], - }); + const solVaultAddress = await solVaultPubkey(config.solana.bridgeProgram); logger.info(`Sol Vault: ${solVaultAddress}`); // Calculate scaled amount (amount * 10^decimals) diff --git a/scripts/src/internal/constants.ts b/scripts/src/internal/constants.ts index d4d8f28b..373f8a7d 100644 --- a/scripts/src/internal/constants.ts +++ b/scripts/src/internal/constants.ts @@ -61,9 +61,9 @@ export const CONFIGS = { evmKeychainKey: "0xfc85de3f52047b993b2dda967b606a8b9caa2c29", // Programs - bridgeProgram: address("GaxAZQ3BSYjfG65e8mGnBnNpmhqRHDJ33aKEASHh3A3P"), + bridgeProgram: address("6YpL1h2a9u6LuNVi55vAes36xNszt2UDm3Zk1kj4WSBm"), baseRelayerProgram: address( - "HPLodLSVpcUX73cXxT7NNss1frnr2XWf6yK3KPChRTjJ" + "ETsFnoWdJK8N7VJW6XXjiciyB2xeQfCXMQWNa85Zi9cn" ), // SPLs @@ -75,12 +75,12 @@ export const CONFIGS = { chain: baseSepolia, // Contracts - bridgeContract: "0x9810d475E698aEc2E65B4941343A0eF76692CCaD", + bridgeContract: "0x64567a9147fa89B1edc987e36Eb6f4b6db71656b", counterContract: "0x5d3eB988Daa06151b68369cf957e917B4371d35d", // ERC20s erc20: "0x62C1332822983B8412A6Ffda0fd77cd7d5733Ee9", - wSol: "0xb0d5170e1962a40Ed2F04B86193698f85770A706", + wSol: "0x003512146Fd54b71f926C7Fd4B7bd20Fc84E22c5", wSpl: "0x80351342c4dd23C78c0837C640E041a239e67cD8", }, }, diff --git a/scripts/src/internal/sol/bridge.ts b/scripts/src/internal/sol/bridge.ts index 2c173e6a..7e1d5b1c 100644 --- a/scripts/src/internal/sol/bridge.ts +++ b/scripts/src/internal/sol/bridge.ts @@ -2,7 +2,6 @@ import { getProgramDerivedAddress, type Address as SolanaAddress, } from "@solana/kit"; -import { toBytes, type Address as EvmAddress } from "viem"; import { getIdlConstant } from "./bridge-idl.constants"; @@ -24,18 +23,10 @@ export async function outgoingMessagePubkey( return { salt: s, pubkey }; } -export async function solVaultPubkey( - bridgeProgram: SolanaAddress, - remoteToken: EvmAddress -) { - const remoteTokenBytes = toBytes(remoteToken); - +export async function solVaultPubkey(bridgeProgram: SolanaAddress) { const [pubkey] = await getProgramDerivedAddress({ programAddress: bridgeProgram, - seeds: [ - Buffer.from(getIdlConstant("SOL_VAULT_SEED")), - Buffer.from(remoteTokenBytes), - ], + seeds: [Buffer.from(getIdlConstant("SOL_VAULT_SEED"))], }); return pubkey; diff --git a/scripts/tsconfig.json b/scripts/tsconfig.json index c232c3ba..e0a77031 100644 --- a/scripts/tsconfig.json +++ b/scripts/tsconfig.json @@ -29,7 +29,9 @@ // Path mapping "baseUrl": ".", "paths": { - "@internal/*": ["src/internal/*"] + "@internal/*": ["src/internal/*"], + "@base/bridge": ["../clients/ts/src/index.ts"], + "@base/bridge/*": ["../clients/ts/src/*"] } } }