diff --git a/scripts/src/commands/sol/base-relayer/initialize.handler.ts b/scripts/src/commands/sol/base-relayer/initialize.handler.ts index 8129b71..cfc7436 100644 --- a/scripts/src/commands/sol/base-relayer/initialize.handler.ts +++ b/scripts/src/commands/sol/base-relayer/initialize.handler.ts @@ -65,8 +65,7 @@ export async function handleInitialize(args: Args): Promise { try { logger.info("--- Initialize base-relayer script ---"); - const rpcUrl = devnet(args.rpcUrl); - logger.info(`RPC URL: ${rpcUrl}`); + logger.info(`RPC URL: ${args.rpcUrl}`); logger.info(`Program ID: ${args.programId}`); const payer = await resolvePayerKeypair(args.payerKp); @@ -127,7 +126,7 @@ export async function handleInitialize(args: Args): Promise { logger.success(`Signature: ${signature}`); await assertInitialized( - createSolanaRpc(rpcUrl), + createSolanaRpc(args.rpcUrl), cfgAddress, guardianAddress, eip1559Config, diff --git a/scripts/src/commands/sol/bridge/base-to-solana/prove-message.command.ts b/scripts/src/commands/sol/bridge/base-to-solana/prove-message.command.ts index ca4d654..c68392d 100644 --- a/scripts/src/commands/sol/bridge/base-to-solana/prove-message.command.ts +++ b/scripts/src/commands/sol/bridge/base-to-solana/prove-message.command.ts @@ -1,10 +1,10 @@ import { Command } from "commander"; import { - getInteractiveSelect, getInteractiveConfirm, getOrPromptHash, getOrPromptFilePath, + getOrPromptDeployEnv, validateAndExecute, } from "@internal/utils/cli"; import { logger } from "@internal/logger"; @@ -24,14 +24,7 @@ async function collectInteractiveOptions( let opts = { ...options }; if (!opts.deployEnv) { - opts.deployEnv = await getInteractiveSelect({ - message: "Select target deploy environment:", - options: [ - { value: "testnet-alpha", label: "Testnet Alpha" }, - { value: "testnet-prod", label: "Testnet Prod" }, - ], - initialValue: "testnet-alpha", - }); + opts.deployEnv = await getOrPromptDeployEnv(); } opts.transactionHash = await getOrPromptHash( @@ -60,7 +53,7 @@ export const proveMessageCommand = new Command("prove-message") .description("Prove a message from Base transaction on Solana") .option( "--deploy-env ", - "Target deploy environment (testnet-alpha | testnet-prod)" + "Target deploy environment (testnet-alpha | testnet-prod | mainnet)" ) .option("--transaction-hash ", "Base transaction hash to prove (0x...)") .option( diff --git a/scripts/src/commands/sol/bridge/base-to-solana/prove-message.handler.ts b/scripts/src/commands/sol/bridge/base-to-solana/prove-message.handler.ts index 2ab75aa..88c91b9 100644 --- a/scripts/src/commands/sol/bridge/base-to-solana/prove-message.handler.ts +++ b/scripts/src/commands/sol/bridge/base-to-solana/prove-message.handler.ts @@ -36,9 +36,9 @@ export const argsSchema = z.object({ deployEnv: z .enum(DEPLOY_ENVS, { message: - "Deploy environment must be either 'testnet-alpha' or 'testnet-prod'", + "Deploy environment must be 'testnet-alpha', 'testnet-prod', or 'mainnet'", }) - .default("testnet-alpha"), + .default("testnet-prod"), transactionHash: z .string() .regex(/^0x[a-fA-F0-9]{64}$/, { @@ -59,9 +59,8 @@ export async function handleProveMessage(args: Args) { logger.info("--- Prove message script ---"); const config = CONFIGS[args.deployEnv]; - const rpcUrl = devnet(config.solana.rpcUrl); - const rpc = createSolanaRpc(rpcUrl); - logger.info(`RPC URL: ${rpcUrl}`); + const rpc = createSolanaRpc(config.solana.rpcUrl); + logger.info(`RPC URL: ${config.solana.rpcUrl}`); const payer = await resolvePayerKeypair(args.payerKp); logger.info(`Payer: ${payer.address}`); diff --git a/scripts/src/commands/sol/bridge/base-to-solana/relay-message.command.ts b/scripts/src/commands/sol/bridge/base-to-solana/relay-message.command.ts index 86599f0..8688c49 100644 --- a/scripts/src/commands/sol/bridge/base-to-solana/relay-message.command.ts +++ b/scripts/src/commands/sol/bridge/base-to-solana/relay-message.command.ts @@ -1,9 +1,9 @@ import { Command } from "commander"; import { - getInteractiveSelect, getOrPromptHash, getOrPromptFilePath, + getOrPromptDeployEnv, validateAndExecute, } from "@internal/utils/cli"; import { argsSchema, handleRelayMessage } from "./relay-message.handler"; @@ -20,14 +20,7 @@ async function collectInteractiveOptions( let opts = { ...options }; if (!opts.deployEnv) { - opts.deployEnv = await getInteractiveSelect({ - message: "Select target deploy environment:", - options: [ - { value: "testnet-alpha", label: "Testnet Alpha" }, - { value: "testnet-prod", label: "Testnet Prod" }, - ], - initialValue: "testnet-alpha", - }); + opts.deployEnv = await getOrPromptDeployEnv(); } opts.messageHash = await getOrPromptHash( @@ -48,7 +41,7 @@ export const relayMessageCommand = new Command("relay-message") .description("Relay a message from Base to Solana") .option( "--deploy-env ", - "Target deploy environment (testnet-alpha | testnet-prod)" + "Target deploy environment (testnet-alpha | testnet-prod | mainnet)" ) .option("--message-hash ", "Message hash to relay (0x...)") .option( diff --git a/scripts/src/commands/sol/bridge/base-to-solana/relay-message.handler.ts b/scripts/src/commands/sol/bridge/base-to-solana/relay-message.handler.ts index 858d32f..276b252 100644 --- a/scripts/src/commands/sol/bridge/base-to-solana/relay-message.handler.ts +++ b/scripts/src/commands/sol/bridge/base-to-solana/relay-message.handler.ts @@ -37,9 +37,9 @@ export const argsSchema = z.object({ deployEnv: z .enum(DEPLOY_ENVS, { message: - "Deploy environment must be either 'testnet-alpha' or 'testnet-prod'", + "Deploy environment must be 'testnet-alpha', 'testnet-prod', or 'mainnet'", }) - .default("testnet-alpha"), + .default("testnet-prod"), messageHash: z .string() .regex(/^0x[a-fA-F0-9]{64}$/, { @@ -64,9 +64,8 @@ export async function handleRelayMessage(args: Args): Promise { logger.info("--- Relay message script ---"); const config = CONFIGS[args.deployEnv]; - const rpcUrl = devnet(config.solana.rpcUrl); - const rpc = createSolanaRpc(rpcUrl); - logger.info(`RPC URL: ${rpcUrl}`); + const rpc = createSolanaRpc(config.solana.rpcUrl); + logger.info(`RPC URL: ${config.solana.rpcUrl}`); const payer = await resolvePayerKeypair(args.payerKp); logger.info(`Payer: ${payer.address}`); diff --git a/scripts/src/commands/sol/bridge/initialize.handler.ts b/scripts/src/commands/sol/bridge/initialize.handler.ts index d955d0a..8afe6ed 100644 --- a/scripts/src/commands/sol/bridge/initialize.handler.ts +++ b/scripts/src/commands/sol/bridge/initialize.handler.ts @@ -108,8 +108,7 @@ export async function handleInitialize(args: InitializeArgs): Promise { try { logger.info("--- Initialize bridge script ---"); - const rpcUrl = devnet(args.rpcUrl); - logger.info(`RPC URL: ${rpcUrl}`); + logger.info(`RPC URL: ${args.rpcUrl}`); logger.info(`Program ID: ${args.programId}`); // Resolve payer keypair @@ -215,7 +214,7 @@ export async function handleInitialize(args: InitializeArgs): Promise { logger.success(`Signature: ${signature}`); await assertInitialized( - createSolanaRpc(rpcUrl), + createSolanaRpc(args.rpcUrl), bridgeAccountAddress, guardianAddress, eip1559Config, diff --git a/scripts/src/commands/sol/bridge/solana-to-base/bridge-call.command.ts b/scripts/src/commands/sol/bridge/solana-to-base/bridge-call.command.ts index eb1f451..c65ec96 100644 --- a/scripts/src/commands/sol/bridge/solana-to-base/bridge-call.command.ts +++ b/scripts/src/commands/sol/bridge/solana-to-base/bridge-call.command.ts @@ -7,6 +7,7 @@ import { getOrPromptHex, getOrPromptEvmAddress, getOrPromptFilePath, + getOrPromptDeployEnv, validateAndExecute, } from "@internal/utils/cli"; import { argsSchema, handleBridgeCall } from "./bridge-call.handler"; @@ -26,14 +27,7 @@ async function collectInteractiveOptions( let opts = { ...options }; if (!opts.deployEnv) { - opts.deployEnv = await getInteractiveSelect({ - message: "Select target deploy environment:", - options: [ - { value: "testnet-alpha", label: "Testnet Alpha" }, - { value: "testnet-prod", label: "Testnet Prod" }, - ], - initialValue: "testnet-alpha", - }); + opts.deployEnv = await getOrPromptDeployEnv(); } opts.payerKp = await getOrPromptFilePath( @@ -103,7 +97,7 @@ export const bridgeCallCommand = new Command("bridge-call") .description("Execute a bridge call from Solana to Base") .option( "--deploy-env ", - "Target deploy environment (testnet-alpha | testnet-prod)" + "Target deploy environment (testnet-alpha | testnet-prod | mainnet)" ) .option( "--payer-kp ", diff --git a/scripts/src/commands/sol/bridge/solana-to-base/bridge-call.handler.ts b/scripts/src/commands/sol/bridge/solana-to-base/bridge-call.handler.ts index 3d9588d..f63ab75 100644 --- a/scripts/src/commands/sol/bridge/solana-to-base/bridge-call.handler.ts +++ b/scripts/src/commands/sol/bridge/solana-to-base/bridge-call.handler.ts @@ -2,7 +2,6 @@ import { z } from "zod"; import { getProgramDerivedAddress, createSolanaRpc, - devnet, type Instruction, } from "@solana/kit"; import { SYSTEM_PROGRAM_ADDRESS } from "@solana-program/system"; @@ -31,9 +30,9 @@ export const argsSchema = z.object({ deployEnv: z .enum(DEPLOY_ENVS, { message: - "Deploy environment must be either 'testnet-alpha' or 'testnet-prod'", + "Deploy environment must be 'testnet-alpha', 'testnet-prod', or 'mainnet'", }) - .default("testnet-alpha"), + .default("testnet-prod"), payerKp: z .union([z.literal("config"), z.string().brand<"payerKp">()]) .default("config"), @@ -66,9 +65,8 @@ export async function handleBridgeCall(args: Args): Promise { logger.info("--- Bridge call script ---"); const config = CONFIGS[args.deployEnv]; - const rpcUrl = devnet(config.solana.rpcUrl); - const rpc = createSolanaRpc(rpcUrl); - logger.info(`RPC URL: ${rpcUrl}`); + const rpc = createSolanaRpc(config.solana.rpcUrl); + logger.info(`RPC URL: ${config.solana.rpcUrl}`); const payer = await resolvePayerKeypair(args.payerKp); logger.info(`Payer: ${payer.address}`); diff --git a/scripts/src/commands/sol/bridge/solana-to-base/bridge-sol.command.ts b/scripts/src/commands/sol/bridge/solana-to-base/bridge-sol.command.ts index d16da32..8972d3d 100644 --- a/scripts/src/commands/sol/bridge/solana-to-base/bridge-sol.command.ts +++ b/scripts/src/commands/sol/bridge/solana-to-base/bridge-sol.command.ts @@ -1,11 +1,11 @@ import { Command } from "commander"; import { - getInteractiveSelect, getInteractiveConfirm, getOrPromptEvmAddress, getOrPromptDecimal, getOrPromptFilePath, + getOrPromptDeployEnv, validateAndExecute, } from "@internal/utils/cli"; import { argsSchema, handleBridgeSol } from "./bridge-sol.handler"; @@ -24,14 +24,7 @@ async function collectInteractiveOptions( let opts = { ...options }; if (!opts.deployEnv) { - opts.deployEnv = await getInteractiveSelect({ - message: "Select target deploy environment:", - options: [ - { value: "testnet-alpha", label: "Testnet Alpha" }, - { value: "testnet-prod", label: "Testnet Prod" }, - ], - initialValue: "testnet-alpha", - }); + opts.deployEnv = await getOrPromptDeployEnv(); } opts.to = await getOrPromptEvmAddress( @@ -65,7 +58,7 @@ export const bridgeSolCommand = new Command("bridge-sol") .description("Bridge SOL from Solana to Base") .option( "--deploy-env ", - "Target deploy environment (testnet-alpha | testnet-prod)" + "Target deploy environment (testnet-alpha | testnet-prod | mainnet)" ) .option("--to
", "Recipient address on Base") .option("--amount ", "Amount to bridge in SOL") 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 d3ab948..ecb81a2 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 @@ -1,7 +1,6 @@ import { z } from "zod"; import { getProgramDerivedAddress, - devnet, type Instruction, createSolanaRpc, } from "@solana/kit"; @@ -28,9 +27,9 @@ export const argsSchema = z.object({ deployEnv: z .enum(DEPLOY_ENVS, { message: - "Deploy environment must be either 'testnet-alpha' or 'testnet-prod'", + "Deploy environment must be 'testnet-alpha', 'testnet-prod', or 'mainnet'", }) - .default("testnet-alpha"), + .default("testnet-prod"), to: z .string() .refine((value) => isEvmAddress(value), { @@ -57,9 +56,8 @@ export async function handleBridgeSol(args: Args): Promise { logger.info("--- Bridge SOL script ---"); const config = CONFIGS[args.deployEnv]; - const rpcUrl = devnet(config.solana.rpcUrl); - const rpc = createSolanaRpc(rpcUrl); - logger.info(`RPC URL: ${rpcUrl}`); + const rpc = createSolanaRpc(config.solana.rpcUrl); + logger.info(`RPC URL: ${config.solana.rpcUrl}`); const payer = await resolvePayerKeypair(args.payerKp); logger.info(`Payer: ${payer.address}`); diff --git a/scripts/src/commands/sol/bridge/solana-to-base/bridge-spl.command.ts b/scripts/src/commands/sol/bridge/solana-to-base/bridge-spl.command.ts index 0ed6c0b..b6785eb 100644 --- a/scripts/src/commands/sol/bridge/solana-to-base/bridge-spl.command.ts +++ b/scripts/src/commands/sol/bridge/solana-to-base/bridge-spl.command.ts @@ -1,12 +1,12 @@ import { Command } from "commander"; import { - getInteractiveSelect, getInteractiveConfirm, getOrPromptEvmAddress, getOrPromptSolanaAddress, getOrPromptDecimal, getOrPromptFilePath, + getOrPromptDeployEnv, validateAndExecute, } from "@internal/utils/cli"; import { argsSchema, handleBridgeSpl } from "./bridge-spl.handler"; @@ -28,14 +28,7 @@ async function collectInteractiveOptions( let opts = { ...options }; if (!opts.deployEnv) { - opts.deployEnv = await getInteractiveSelect({ - message: "Select target deploy environment:", - options: [ - { value: "testnet-alpha", label: "Testnet Alpha" }, - { value: "testnet-prod", label: "Testnet Prod" }, - ], - initialValue: "testnet-alpha", - }); + opts.deployEnv = await getOrPromptDeployEnv(); } if (!opts.mint) { @@ -130,7 +123,7 @@ export const bridgeSplCommand = new Command("bridge-spl") .description("Bridge SPL tokens from Solana to Base") .option( "--deploy-env ", - "Target deploy environment (testnet-alpha | testnet-prod)" + "Target deploy environment (testnet-alpha | testnet-prod | mainnet)" ) .option( "--mint
", diff --git a/scripts/src/commands/sol/bridge/solana-to-base/bridge-spl.handler.ts b/scripts/src/commands/sol/bridge/solana-to-base/bridge-spl.handler.ts index 8b58d82..3d723b7 100644 --- a/scripts/src/commands/sol/bridge/solana-to-base/bridge-spl.handler.ts +++ b/scripts/src/commands/sol/bridge/solana-to-base/bridge-spl.handler.ts @@ -2,7 +2,6 @@ import { z } from "zod"; import { getBase58Encoder, getProgramDerivedAddress, - devnet, address, createSolanaRpc, type Account, @@ -40,9 +39,9 @@ export const argsSchema = z.object({ deployEnv: z .enum(DEPLOY_ENVS, { message: - "Deploy environment must be either 'testnet-alpha' or 'testnet-prod'", + "Deploy environment must be 'testnet-alpha', 'testnet-prod', or 'mainnet'", }) - .default("testnet-alpha"), + .default("testnet-prod"), mint: z.union([z.literal("constant"), z.string().brand<"solanaAddress">()]), remoteToken: z.union([ z.literal("constant"), @@ -83,9 +82,8 @@ export async function handleBridgeSpl(args: Args): Promise { logger.info("--- Bridge SPL script ---"); const config = CONFIGS[args.deployEnv]; - const rpcUrl = devnet(config.solana.rpcUrl); - const rpc = createSolanaRpc(rpcUrl); - logger.info(`RPC URL: ${rpcUrl}`); + const rpc = createSolanaRpc(config.solana.rpcUrl); + logger.info(`RPC URL: ${config.solana.rpcUrl}`); const payer = await resolvePayerKeypair(args.payerKp); logger.info(`Payer: ${payer.address}`); diff --git a/scripts/src/commands/sol/bridge/solana-to-base/bridge-wrapped-token.command.ts b/scripts/src/commands/sol/bridge/solana-to-base/bridge-wrapped-token.command.ts index a3c388a..963ec81 100644 --- a/scripts/src/commands/sol/bridge/solana-to-base/bridge-wrapped-token.command.ts +++ b/scripts/src/commands/sol/bridge/solana-to-base/bridge-wrapped-token.command.ts @@ -7,6 +7,7 @@ import { getOrPromptSolanaAddress, getOrPromptDecimal, getOrPromptFilePath, + getOrPromptDeployEnv, validateAndExecute, } from "@internal/utils/cli"; import { @@ -30,14 +31,7 @@ async function collectInteractiveOptions( let opts = { ...options }; if (!opts.deployEnv) { - opts.deployEnv = await getInteractiveSelect({ - message: "Select target deploy environment:", - options: [ - { value: "testnet-alpha", label: "Testnet Alpha" }, - { value: "testnet-prod", label: "Testnet Prod" }, - ], - initialValue: "testnet-alpha", - }); + opts.deployEnv = await getOrPromptDeployEnv(); } if (!opts.mint) { @@ -113,7 +107,7 @@ export const bridgeWrappedTokenCommand = new Command("bridge-wrapped-token") .description("Bridge wrapped ERC20 tokens from Solana to Base") .option( "--deploy-env ", - "Target deploy environment (testnet-alpha | testnet-prod)" + "Target deploy environment (testnet-alpha | testnet-prod | mainnet)" ) .option( "--mint
", diff --git a/scripts/src/commands/sol/bridge/solana-to-base/bridge-wrapped-token.handler.ts b/scripts/src/commands/sol/bridge/solana-to-base/bridge-wrapped-token.handler.ts index 699c9b0..794686d 100644 --- a/scripts/src/commands/sol/bridge/solana-to-base/bridge-wrapped-token.handler.ts +++ b/scripts/src/commands/sol/bridge/solana-to-base/bridge-wrapped-token.handler.ts @@ -41,9 +41,9 @@ export const argsSchema = z.object({ deployEnv: z .enum(DEPLOY_ENVS, { message: - "Deploy environment must be either 'testnet-alpha' or 'testnet-prod'", + "Deploy environment must be 'testnet-alpha', 'testnet-prod', or 'mainnet'", }) - .default("testnet-alpha"), + .default("testnet-prod"), mint: z.union([ z.literal("constants-wErc20"), z.literal("constants-wEth"), @@ -81,9 +81,8 @@ export async function handleBridgeWrappedToken(args: Args): Promise { logger.info("--- Bridge Wrapped Token script ---"); const config = CONFIGS[args.deployEnv]; - const rpcUrl = devnet(config.solana.rpcUrl); - const rpc = createSolanaRpc(rpcUrl); - logger.info(`RPC URL: ${rpcUrl}`); + const rpc = createSolanaRpc(config.solana.rpcUrl); + logger.info(`RPC URL: ${config.solana.rpcUrl}`); const payer = await resolvePayerKeypair(args.payerKp); logger.info(`Payer: ${payer.address}`); diff --git a/scripts/src/commands/sol/bridge/solana-to-base/wrap-token.command.ts b/scripts/src/commands/sol/bridge/solana-to-base/wrap-token.command.ts index 528e2a8..0f8dcb0 100644 --- a/scripts/src/commands/sol/bridge/solana-to-base/wrap-token.command.ts +++ b/scripts/src/commands/sol/bridge/solana-to-base/wrap-token.command.ts @@ -1,12 +1,12 @@ import { Command } from "commander"; import { - getInteractiveSelect, getInteractiveConfirm, getOrPromptInteger, getOrPromptString, getOrPromptEvmAddress, getOrPromptFilePath, + getOrPromptDeployEnv, validateAndExecute, } from "@internal/utils/cli"; import { argsSchema, handleWrapToken } from "./wrap-token.handler"; @@ -28,14 +28,7 @@ async function collectInteractiveOptions( let opts = { ...options }; if (!opts.deployEnv) { - opts.deployEnv = await getInteractiveSelect({ - message: "Select target deploy environment:", - options: [ - { value: "testnet-alpha", label: "Testnet Alpha" }, - { value: "testnet-prod", label: "Testnet Prod" }, - ], - initialValue: "testnet-alpha", - }); + opts.deployEnv = await getOrPromptDeployEnv(); } opts.decimals = await getOrPromptInteger( @@ -103,7 +96,7 @@ export const wrapTokenCommand = new Command("wrap-token") .description("Wrap an ERC20 token from Base to Solana") .option( "--deploy-env ", - "Target deploy environment (testnet-alpha | testnet-prod)" + "Target deploy environment (testnet-alpha | testnet-prod | mainnet)" ) .option("--decimals ", "Token decimals") .option("--name ", "Token name") diff --git a/scripts/src/commands/sol/bridge/solana-to-base/wrap-token.handler.ts b/scripts/src/commands/sol/bridge/solana-to-base/wrap-token.handler.ts index a9f7138..ab3fa1e 100644 --- a/scripts/src/commands/sol/bridge/solana-to-base/wrap-token.handler.ts +++ b/scripts/src/commands/sol/bridge/solana-to-base/wrap-token.handler.ts @@ -35,9 +35,9 @@ export const argsSchema = z.object({ deployEnv: z .enum(DEPLOY_ENVS, { message: - "Deploy environment must be either 'testnet-alpha' or 'testnet-prod'", + "Deploy environment must be 'testnet-alpha', 'testnet-prod', or 'mainnet'", }) - .default("testnet-alpha"), + .default("testnet-prod"), decimals: z .string() .transform((val) => parseInt(val)) @@ -79,9 +79,8 @@ export async function handleWrapToken(args: Args): Promise { logger.info("--- Wrap token script ---"); const config = CONFIGS[args.deployEnv]; - const rpcUrl = devnet(config.solana.rpcUrl); - const rpc = createSolanaRpc(rpcUrl); - logger.info(`RPC URL: ${rpcUrl}`); + const rpc = createSolanaRpc(config.solana.rpcUrl); + logger.info(`RPC URL: ${config.solana.rpcUrl}`); const payer = await resolvePayerKeypair(args.payerKp); logger.info(`Payer: ${payer.address}`); diff --git a/scripts/src/commands/sol/build.command.ts b/scripts/src/commands/sol/build.command.ts index c63363f..d9b9378 100644 --- a/scripts/src/commands/sol/build.command.ts +++ b/scripts/src/commands/sol/build.command.ts @@ -1,9 +1,9 @@ import { Command } from "commander"; import { - getInteractiveSelect, getInteractiveConfirm, getOrPromptFilePath, + getOrPromptDeployEnv, validateAndExecute, } from "@internal/utils/cli"; import { argsSchema, handleBuild } from "./build.handler"; @@ -20,14 +20,7 @@ async function collectInteractiveOptions( let opts = { ...options }; if (!opts.deployEnv) { - opts.deployEnv = await getInteractiveSelect({ - message: "Select target deploy environment:", - options: [ - { value: "testnet-alpha", label: "Testnet Alpha" }, - { value: "testnet-prod", label: "Testnet Prod" }, - ], - initialValue: "testnet-alpha", - }); + opts.deployEnv = await getOrPromptDeployEnv(); } // Bridge program keypair with "protocol" as default @@ -71,7 +64,7 @@ export const buildCommand = new Command("build") .description("Build the Solana bridge and base-relayer programs") .option( "--deploy-env ", - "Target deploy environment (testnet-alpha | testnet-prod)" + "Target deploy environment (testnet-alpha | testnet-prod | mainnet)" ) .option( "--bridge-program-kp ", diff --git a/scripts/src/commands/sol/build.handler.ts b/scripts/src/commands/sol/build.handler.ts index 95769a8..2ef297b 100644 --- a/scripts/src/commands/sol/build.handler.ts +++ b/scripts/src/commands/sol/build.handler.ts @@ -17,9 +17,9 @@ export const argsSchema = z.object({ deployEnv: z .enum(DEPLOY_ENVS, { message: - "Deploy environment must be either 'testnet-alpha' or 'testnet-prod'", + "Deploy environment must be 'testnet-alpha', 'testnet-prod', or 'mainnet'", }) - .default("testnet-alpha"), + .default("testnet-prod"), bridgeProgramKp: programKeypairSchema.default("protocol"), baseRelayerProgramKp: programKeypairSchema.default("protocol"), }); diff --git a/scripts/src/commands/sol/deploy.command.ts b/scripts/src/commands/sol/deploy.command.ts index 5213d3c..12c643a 100644 --- a/scripts/src/commands/sol/deploy.command.ts +++ b/scripts/src/commands/sol/deploy.command.ts @@ -4,6 +4,7 @@ import { getInteractiveSelect, getInteractiveConfirm, getOrPromptFilePath, + getOrPromptDeployEnv, validateAndExecute, } from "@internal/utils/cli"; import { argsSchema, handleDeploy } from "./deploy.handler"; @@ -21,14 +22,7 @@ async function collectInteractiveOptions( let opts = { ...options }; if (!opts.deployEnv) { - opts.deployEnv = await getInteractiveSelect({ - message: "Select target deploy environment:", - options: [ - { value: "testnet-alpha", label: "Testnet Alpha" }, - { value: "testnet-prod", label: "Testnet Prod" }, - ], - initialValue: "testnet-alpha", - }); + opts.deployEnv = await getOrPromptDeployEnv(); } if (!opts.deployerKp) { @@ -91,7 +85,7 @@ export const deployCommand = new Command("deploy") .description("Deploy a Solana program (bridge | base-relayer)") .option( "--deploy-env ", - "Target deploy environment (testnet-alpha | testnet-prod)" + "Target deploy environment (testnet-alpha | testnet-prod | mainnet)" ) .option( "--deployer-kp ", diff --git a/scripts/src/commands/sol/deploy.handler.ts b/scripts/src/commands/sol/deploy.handler.ts index 5bce4d6..462af04 100644 --- a/scripts/src/commands/sol/deploy.handler.ts +++ b/scripts/src/commands/sol/deploy.handler.ts @@ -14,9 +14,9 @@ export const argsSchema = z.object({ deployEnv: z .enum(DEPLOY_ENVS, { message: - "Deploy environment must be either 'testnet-alpha' or 'testnet-prod'", + "Deploy environment must be 'testnet-alpha', 'testnet-prod', or 'mainnet'", }) - .default("testnet-alpha"), + .default("testnet-prod"), deployerKp: z .union([ z.literal("protocol"), diff --git a/scripts/src/commands/sol/spl/create-ata.command.ts b/scripts/src/commands/sol/spl/create-ata.command.ts index cb0885a..088c6cd 100644 --- a/scripts/src/commands/sol/spl/create-ata.command.ts +++ b/scripts/src/commands/sol/spl/create-ata.command.ts @@ -1,10 +1,10 @@ import { Command } from "commander"; import { - getInteractiveSelect, getInteractiveConfirm, getOrPromptSolanaAddress, getOrPromptFilePath, + getOrPromptDeployEnv, validateAndExecute, } from "@internal/utils/cli"; import { argsSchema, handleCreateAta } from "./create-ata.handler"; @@ -22,14 +22,7 @@ async function collectInteractiveOptions( let opts = { ...options }; if (!opts.deployEnv) { - opts.deployEnv = await getInteractiveSelect({ - message: "Select target deploy environment:", - options: [ - { value: "testnet-alpha", label: "Testnet Alpha" }, - { value: "testnet-prod", label: "Testnet Prod" }, - ], - initialValue: "testnet-alpha", - }); + opts.deployEnv = await getOrPromptDeployEnv(); } opts.mint = await getOrPromptSolanaAddress(opts.mint, "Enter mint address"); @@ -63,7 +56,7 @@ export const createAtaCommand = new Command("create-ata") .description("Create an Associated Token Account (ATA)") .option( "--deploy-env ", - "Target deploy environment (testnet-alpha | testnet-prod)" + "Target deploy environment (testnet-alpha | testnet-prod | mainnet)" ) .option("--mint
", "Mint address") .option("--owner
", "Owner address or 'payer'") diff --git a/scripts/src/commands/sol/spl/create-ata.handler.ts b/scripts/src/commands/sol/spl/create-ata.handler.ts index c9e6cbf..84d5cb9 100644 --- a/scripts/src/commands/sol/spl/create-ata.handler.ts +++ b/scripts/src/commands/sol/spl/create-ata.handler.ts @@ -20,9 +20,9 @@ export const argsSchema = z.object({ deployEnv: z .enum(DEPLOY_ENVS, { message: - "Deploy environment must be either 'testnet-alpha' or 'testnet-prod'", + "Deploy environment must be 'testnet-alpha', 'testnet-prod', or 'mainnet'", }) - .default("testnet-alpha"), + .default("testnet-prod"), mint: z.string().nonempty("Mint address cannot be empty"), owner: z .union([z.literal("payer"), z.string().brand<"owner">()]) @@ -41,9 +41,8 @@ export async function handleCreateAta(args: Args): Promise { const config = CONFIGS[args.deployEnv]; - const rpcUrl = devnet(config.solana.rpcUrl); - const rpc = createSolanaRpc(rpcUrl); - logger.info(`RPC URL: ${rpcUrl}`); + const rpc = createSolanaRpc(config.solana.rpcUrl); + logger.info(`RPC URL: ${config.solana.rpcUrl}`); // Resolve payer keypair const payer = await resolvePayerKeypair(args.payerKp); diff --git a/scripts/src/commands/sol/spl/create-mint.command.ts b/scripts/src/commands/sol/spl/create-mint.command.ts index 1fd8788..f8f3f11 100644 --- a/scripts/src/commands/sol/spl/create-mint.command.ts +++ b/scripts/src/commands/sol/spl/create-mint.command.ts @@ -1,10 +1,10 @@ import { Command } from "commander"; import { - getInteractiveSelect, getOrPromptInteger, getOrPromptSolanaAddress, getOrPromptFilePath, + getOrPromptDeployEnv, validateAndExecute, } from "@internal/utils/cli"; import { argsSchema, handleCreateMint } from "./create-mint.handler"; @@ -22,14 +22,7 @@ async function collectInteractiveOptions( let opts = { ...options }; if (!opts.deployEnv) { - opts.deployEnv = await getInteractiveSelect({ - message: "Select target deploy environment:", - options: [ - { value: "testnet-alpha", label: "Testnet Alpha" }, - { value: "testnet-prod", label: "Testnet Prod" }, - ], - initialValue: "testnet-alpha", - }); + opts.deployEnv = await getOrPromptDeployEnv(); } opts.decimals = await getOrPromptInteger( @@ -59,7 +52,7 @@ export const createMintCommand = new Command("create-mint") .description("Create a new SPL token mint") .option( "--deploy-env ", - "Target deploy environment (testnet-alpha | testnet-prod)" + "Target deploy environment (testnet-alpha | testnet-prod | mainnet)" ) .option("--decimals ", "Token decimals") .option( diff --git a/scripts/src/commands/sol/spl/create-mint.handler.ts b/scripts/src/commands/sol/spl/create-mint.handler.ts index 14dabe6..8fee243 100644 --- a/scripts/src/commands/sol/spl/create-mint.handler.ts +++ b/scripts/src/commands/sol/spl/create-mint.handler.ts @@ -25,9 +25,9 @@ export const argsSchema = z.object({ deployEnv: z .enum(DEPLOY_ENVS, { message: - "Deploy environment must be either 'testnet-alpha' or 'testnet-prod'", + "Deploy environment must be 'testnet-alpha', 'testnet-prod', or 'mainnet'", }) - .default("testnet-alpha"), + .default("testnet-prod"), decimals: z .string() .transform((val) => parseInt(val)) @@ -52,9 +52,8 @@ export async function handleCreateMint(args: Args): Promise { const config = CONFIGS[args.deployEnv]; - const rpcUrl = devnet(config.solana.rpcUrl); - const rpc = createSolanaRpc(rpcUrl); - logger.info(`RPC URL: ${rpcUrl}`); + const rpc = createSolanaRpc(config.solana.rpcUrl); + logger.info(`RPC URL: ${config.solana.rpcUrl}`); // Resolve payer keypair const payer = await resolvePayerKeypair(args.payerKp); diff --git a/scripts/src/commands/sol/spl/mint.command.ts b/scripts/src/commands/sol/spl/mint.command.ts index a407161..092e174 100644 --- a/scripts/src/commands/sol/spl/mint.command.ts +++ b/scripts/src/commands/sol/spl/mint.command.ts @@ -1,10 +1,10 @@ import { Command } from "commander"; import { - getInteractiveSelect, getOrPromptSolanaAddress, getOrPromptDecimal, getOrPromptFilePath, + getOrPromptDeployEnv, validateAndExecute, } from "@internal/utils/cli"; import { argsSchema, handleMint } from "./mint.handler"; @@ -24,14 +24,7 @@ async function collectInteractiveOptions( let opts = { ...options }; if (!opts.deployEnv) { - opts.deployEnv = await getInteractiveSelect({ - message: "Select target deploy environment:", - options: [ - { value: "testnet-alpha", label: "Testnet Alpha" }, - { value: "testnet-prod", label: "Testnet Prod" }, - ], - initialValue: "testnet-alpha", - }); + opts.deployEnv = await getOrPromptDeployEnv(); } opts.mint = await getOrPromptSolanaAddress(opts.mint, "Enter mint address"); @@ -68,7 +61,7 @@ export const mintCommand = new Command("mint") .description("Mint SPL tokens to an ATA") .option( "--deploy-env ", - "Target deploy environment (testnet-alpha | testnet-prod)" + "Target deploy environment (testnet-alpha | testnet-prod | mainnet)" ) .option("--mint
", "Mint address") .option( diff --git a/scripts/src/commands/sol/spl/mint.handler.ts b/scripts/src/commands/sol/spl/mint.handler.ts index 846add2..fd48137 100644 --- a/scripts/src/commands/sol/spl/mint.handler.ts +++ b/scripts/src/commands/sol/spl/mint.handler.ts @@ -22,9 +22,9 @@ export const argsSchema = z.object({ deployEnv: z .enum(DEPLOY_ENVS, { message: - "Deploy environment must be either 'testnet-alpha' or 'testnet-prod'", + "Deploy environment must be 'testnet-alpha', 'testnet-prod', or 'mainnet'", }) - .default("testnet-alpha"), + .default("testnet-prod"), mint: z.string().nonempty("Mint address cannot be empty"), to: z .union([z.literal("config"), z.string().brand<"to">()]) @@ -55,9 +55,8 @@ export async function handleMint(args: Args): Promise { const config = CONFIGS[args.deployEnv]; - const rpcUrl = devnet(config.solana.rpcUrl); - const rpc = createSolanaRpc(rpcUrl); - logger.info(`RPC URL: ${rpcUrl}`); + const rpc = createSolanaRpc(config.solana.rpcUrl); + logger.info(`RPC URL: ${config.solana.rpcUrl}`); // Resolve mint address const mintAddress = address(args.mint); diff --git a/scripts/src/internal/constants.ts b/scripts/src/internal/constants.ts index b21e98e..a61902c 100644 --- a/scripts/src/internal/constants.ts +++ b/scripts/src/internal/constants.ts @@ -1,10 +1,18 @@ -import { address, type Address as SolanaAddress } from "@solana/kit"; +import { + address, + type Address, + type Address as SolanaAddress, +} from "@solana/kit"; import type { Chain, Address as EvmAddress } from "viem"; -import { baseSepolia } from "viem/chains"; +import { base, baseSepolia } from "viem/chains"; export const ETH = "0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE"; -export const DEPLOY_ENVS = ["testnet-alpha", "testnet-prod"] as const; +export const DEPLOY_ENVS = [ + "testnet-alpha", + "testnet-prod", + "mainnet", +] as const; export type DeployEnv = (typeof DEPLOY_ENVS)[number]; @@ -122,4 +130,40 @@ export const CONFIGS = { wSpl: "0x955C7356776F9304feD38ed5AeC5699436C7C614", }, }, + mainnet: { + solana: { + cluster: "mainnet", + rpcUrl: "https://api.mainnet-beta.solana.com", + + // Keypairs + deployerKpPath: "keypairs/deployer.mainnet.json", + bridgeKpPath: "keypairs/bridge.mainnet.json", + baseRelayerKpPath: "keypairs/base-relayer.mainnet.json", + + // Base oracle signers + evmLocalKey: "0x", + evmKeychainKey: "0x", + + // Programs + bridgeProgram: "" as Address, + baseRelayerProgram: "" as Address, + + // SPLs + spl: "" as Address, + wEth: "" as Address, + wErc20: "" as Address, + }, + base: { + chain: base, + + // Contracts + bridgeContract: "0x", + counterContract: "0x", + + // ERC20s + erc20: "0x", + wSol: "0x", + wSpl: "0x", + }, + }, } as const satisfies Record; diff --git a/scripts/src/internal/sol/base-relayer.ts b/scripts/src/internal/sol/base-relayer.ts index 0b6caa6..3e62ef4 100644 --- a/scripts/src/internal/sol/base-relayer.ts +++ b/scripts/src/internal/sol/base-relayer.ts @@ -23,7 +23,7 @@ export async function buildPayForRelayInstruction( payer: KeyPairSigner ) { const config = CONFIGS[env]; - const solRpc = createSolanaRpc(devnet(config.solana.rpcUrl)); + const solRpc = createSolanaRpc(config.solana.rpcUrl); const [cfgAddress] = await getProgramDerivedAddress({ programAddress: config.solana.baseRelayerProgram, diff --git a/scripts/src/internal/sol/base.ts b/scripts/src/internal/sol/base.ts index b9369aa..0d77fab 100644 --- a/scripts/src/internal/sol/base.ts +++ b/scripts/src/internal/sol/base.ts @@ -39,7 +39,7 @@ export async function relayMessageToBase( ) { logger.info("Relaying message to Base..."); const config = CONFIGS[deployEnv]; - const solRpc = createSolanaRpc(devnet(config.solana.rpcUrl)); + const solRpc = createSolanaRpc(config.solana.rpcUrl); const outgoing = await fetchOutgoingMessage(solRpc, outgoingMessagePubkey); @@ -104,7 +104,7 @@ export async function monitorMessageExecution( logger.info("Monitoring message execution..."); const config = CONFIGS[deployEnv]; - const solRpc = createSolanaRpc(devnet(config.solana.rpcUrl)); + const solRpc = createSolanaRpc(config.solana.rpcUrl); const publicClient = createPublicClient({ chain: config.base.chain, diff --git a/scripts/src/internal/sol/transaction.ts b/scripts/src/internal/sol/transaction.ts index 6f8040c..1ffc7cd 100644 --- a/scripts/src/internal/sol/transaction.ts +++ b/scripts/src/internal/sol/transaction.ts @@ -33,9 +33,7 @@ export async function buildAndSendTransaction( const rpcHostName = rpcUrl.replace("https://", ""); const rpc = createSolanaRpc(`https://${rpcHostName}`); - const rpcSubscriptions = createSolanaRpcSubscriptions( - devnet(`wss://${rpcHostName}`) - ); + const rpcSubscriptions = createSolanaRpcSubscriptions(`wss://${rpcHostName}`); const sendAndConfirmTx = sendAndConfirmTransactionFactory({ rpc, diff --git a/scripts/src/internal/utils/cli.ts b/scripts/src/internal/utils/cli.ts index 0060be9..1121c9e 100644 --- a/scripts/src/internal/utils/cli.ts +++ b/scripts/src/internal/utils/cli.ts @@ -22,6 +22,7 @@ import { isAddress as isEvmAddress, isHash } from "viem"; import { z } from "zod"; import { logger } from "@internal/logger"; +import { DEPLOY_ENVS, type DeployEnv } from "@internal/constants"; export const bigintSchema = z .string() @@ -366,3 +367,18 @@ async function getOrPromptWithZod( return getInteractiveInput(label, placeholder, validate); } + +/** + * Prompts the user to select a deploy environment + */ +export async function getOrPromptDeployEnv(): Promise { + return await getInteractiveSelect({ + message: "Select target deploy environment:", + options: [ + { value: "testnet-alpha", label: "Testnet Alpha" }, + { value: "testnet-prod", label: "Testnet Prod" }, + { value: "mainnet", label: "Mainnet" }, + ], + initialValue: "testnet-prod", + }); +}