Skip to content

Commit 4624739

Browse files
authored
chore(scripts): refactor scripts (#134)
1 parent 9d386b1 commit 4624739

58 files changed

Lines changed: 864 additions & 5959 deletions

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

scripts/src/commands/sol/onchain/base-relayer/initialize.command.ts

Lines changed: 52 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -6,43 +6,30 @@ import { logger } from "@internal/logger";
66
import { argsSchema, handleInitialize } from "./initialize.handler";
77

88
type CommanderOptions = {
9-
cluster?: string;
10-
release?: string;
9+
deployEnv?: string;
1110
payerKp?: string;
11+
guardianKp?: string;
1212
};
1313

1414
async function collectInteractiveOptions(
1515
options: CommanderOptions
1616
): Promise<CommanderOptions> {
1717
let opts = { ...options };
1818

19-
if (!opts.cluster) {
20-
const cluster = await select({
21-
message: "Select target cluster:",
22-
options: [{ value: "devnet", label: "Devnet" }],
23-
initialValue: "devnet",
24-
});
25-
if (isCancel(cluster)) {
26-
cancel("Operation cancelled.");
27-
process.exit(1);
28-
}
29-
opts.cluster = cluster;
30-
}
31-
32-
if (!opts.release) {
33-
const release = await select({
34-
message: "Select release type:",
19+
if (!opts.deployEnv) {
20+
const deployEnv = await select({
21+
message: "Select target deploy environment:",
3522
options: [
36-
{ value: "prod", label: "Prod" },
37-
{ value: "alpha", label: "Alpha" },
23+
{ value: "development-alpha", label: "Development Alpha" },
24+
{ value: "development-prod", label: "Development Prod" },
3825
],
39-
initialValue: "prod",
26+
initialValue: "development-alpha",
4027
});
41-
if (isCancel(release)) {
28+
if (isCancel(deployEnv)) {
4229
cancel("Operation cancelled.");
4330
process.exit(1);
4431
}
45-
opts.release = release;
32+
opts.deployEnv = deployEnv;
4633
}
4734

4835
if (!opts.payerKp) {
@@ -79,17 +66,57 @@ async function collectInteractiveOptions(
7966
}
8067
}
8168

69+
if (!opts.guardianKp) {
70+
const usePayerAsGuardian = await confirm({
71+
message: "Use payer as guardian keypair?",
72+
initialValue: true,
73+
});
74+
if (isCancel(usePayerAsGuardian)) {
75+
cancel("Operation cancelled.");
76+
process.exit(1);
77+
}
78+
79+
if (usePayerAsGuardian) {
80+
opts.guardianKp = "payer";
81+
} else {
82+
const keypairPath = await text({
83+
message: "Enter path to guardian keypair:",
84+
placeholder: "/path/to/guardian.json",
85+
validate: (value) => {
86+
if (!value || value.trim().length === 0) {
87+
return "Keypair path cannot be empty";
88+
}
89+
const cleanPath = value.trim().replace(/^["']|["']$/g, "");
90+
if (!existsSync(cleanPath)) {
91+
return "Guardian keypair file does not exist";
92+
}
93+
},
94+
});
95+
if (isCancel(keypairPath)) {
96+
cancel("Operation cancelled.");
97+
process.exit(1);
98+
}
99+
opts.guardianKp = keypairPath.trim().replace(/^["']|["']$/g, "");
100+
}
101+
}
102+
82103
return opts;
83104
}
84105

85106
export const initializeCommand = new Command("initialize")
86107
.description("Initialize the Base Relayer program")
87-
.option("--cluster <cluster>", "Target cluster (devnet)")
88-
.option("--release <release>", "Release type (alpha | prod)")
108+
.option(
109+
"--deploy-env <deployEnv>",
110+
"Target deploy environment (development-alpha | development-prod)"
111+
)
89112
.option(
90113
"--payer-kp <path>",
91114
"Payer keypair: 'config' or custom payer keypair path"
92115
)
116+
.option(
117+
"--guardian-kp <path>",
118+
"Guardian keypair: 'payer' or custom guardian keypair path"
119+
)
93120
.action(async (options) => {
94121
const opts = await collectInteractiveOptions(options);
95122
const parsed = argsSchema.safeParse(opts);

scripts/src/commands/sol/onchain/base-relayer/initialize.handler.ts

Lines changed: 42 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,5 @@
11
import { z } from "zod";
22
import {
3-
createSignerFromKeyPair,
4-
generateKeyPair,
53
getProgramDerivedAddress,
64
devnet,
75
type Address,
@@ -23,49 +21,47 @@ import {
2321
buildAndSendTransaction,
2422
getSolanaCliConfigKeypairSigner,
2523
getKeypairSignerFromPath,
26-
CONSTANTS,
24+
getRelayerIdlConstant,
2725
} from "@internal/sol";
28-
import { getRelayerIdlConstant } from "@internal/sol/base-relayer-idl.constants";
26+
import { CONFIGS, DEPLOY_ENVS } from "@internal/constants";
2927

3028
export const argsSchema = z.object({
31-
cluster: z
32-
.enum(["devnet"], {
33-
message: "Cluster must be either 'devnet'",
29+
deployEnv: z
30+
.enum(DEPLOY_ENVS, {
31+
message:
32+
"Deploy environment must be either 'development-alpha' or 'development-prod'",
3433
})
35-
.default("devnet"),
36-
release: z
37-
.enum(["alpha", "prod"], {
38-
message: "Release must be either 'alpha' or 'prod'",
39-
})
40-
.default("prod"),
34+
.default("development-alpha"),
4135
payerKp: z
4236
.union([z.literal("config"), z.string().brand<"payerKp">()])
4337
.default("config"),
38+
guardianKp: z
39+
.union([z.literal("payer"), z.string().brand<"guardianKp">()])
40+
.default("payer"),
4441
});
4542

46-
type InitializeArgs = z.infer<typeof argsSchema>;
47-
type PayerKp = z.infer<typeof argsSchema.shape.payerKp>;
43+
type Args = z.infer<typeof argsSchema>;
44+
type PayerKpArg = Args["payerKp"];
45+
type GuardianKpArg = Args["guardianKp"];
4846

49-
export async function handleInitialize(args: InitializeArgs): Promise<void> {
47+
export async function handleInitialize(args: Args): Promise<void> {
5048
try {
5149
logger.info("--- Initialize base-relayer script ---");
5250

53-
const config = CONSTANTS[args.cluster][args.release];
54-
const rpcUrl = devnet(`https://${config.rpcUrl}`);
55-
const rpc = createSolanaRpc(rpcUrl);
51+
const config = CONFIGS[args.deployEnv];
52+
const rpcUrl = devnet(`https://${config.solana.rpcUrl}`);
5653
logger.info(`RPC URL: ${rpcUrl}`);
5754

5855
const payer = await resolvePayerKeypair(args.payerKp);
5956
logger.info(`Payer: ${payer.address}`);
6057

6158
const [cfgAddress] = await getProgramDerivedAddress({
62-
programAddress: config.baseRelayer,
59+
programAddress: config.solana.baseRelayerProgram,
6360
seeds: [Buffer.from(getRelayerIdlConstant("CFG_SEED"))],
6461
});
6562
logger.info(`Cfg PDA: ${cfgAddress}`);
6663

67-
// TODO: Use the real guardian.
68-
const guardian = await createSignerFromKeyPair(await generateKeyPair());
64+
const guardian = await resolveGuardianKeypair(args.guardianKp, payer);
6965

7066
const eip1559Config = {
7167
target: 5_000_000n,
@@ -92,18 +88,22 @@ export async function handleInitialize(args: InitializeArgs): Promise<void> {
9288
eip1559Config,
9389
gasConfig,
9490
},
95-
{ programAddress: config.baseRelayer }
91+
{ programAddress: config.solana.baseRelayerProgram }
9692
);
9793

9894
logger.info("Sending transaction...");
99-
const signature = await buildAndSendTransaction(rpcUrl, [ix], payer);
95+
const signature = await buildAndSendTransaction(
96+
args.deployEnv,
97+
[ix],
98+
payer
99+
);
100100
logger.success("Base Relayer initialization completed!");
101101
logger.info(
102102
`Transaction: https://explorer.solana.com/tx/${signature}?cluster=devnet`
103103
);
104104

105105
await assertInitialized(
106-
rpc,
106+
createSolanaRpc(rpcUrl),
107107
cfgAddress,
108108
guardian,
109109
eip1559Config,
@@ -115,14 +115,14 @@ export async function handleInitialize(args: InitializeArgs): Promise<void> {
115115
}
116116
}
117117

118-
async function resolvePayerKeypair(payerKp: PayerKp) {
119-
if (payerKp === "config") {
118+
async function resolvePayerKeypair(payerKpArg: PayerKpArg) {
119+
if (payerKpArg === "config") {
120120
logger.info("Using Solana CLI config for payer keypair");
121121
return await getSolanaCliConfigKeypairSigner();
122122
}
123123

124-
logger.info(`Using custom payer keypair: ${payerKp}`);
125-
return await getKeypairSignerFromPath(payerKp);
124+
logger.info(`Using custom payer keypair: ${payerKpArg}`);
125+
return await getKeypairSignerFromPath(payerKpArg);
126126
}
127127

128128
async function assertInitialized(
@@ -180,3 +180,16 @@ async function assertInitialized(
180180

181181
console.log("Base Relayer config confirmed!");
182182
}
183+
184+
async function resolveGuardianKeypair(
185+
guardianKpArg: GuardianKpArg,
186+
payer: KeyPairSigner
187+
) {
188+
if (guardianKpArg === "payer") {
189+
logger.info("Using payer as guardian keypair");
190+
return payer;
191+
}
192+
193+
logger.info(`Using custom guardian keypair: ${guardianKpArg}`);
194+
return await getKeypairSignerFromPath(guardianKpArg);
195+
}

scripts/src/commands/sol/onchain/bridge/base-to-solana/prove-message.command.ts

Lines changed: 14 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -7,8 +7,7 @@ import { argsSchema, handleProveMessage } from "./prove-message.handler";
77
import { handleRelayMessage } from "./relay-message.handler";
88

99
type CommanderOptions = {
10-
cluster?: string;
11-
release?: string;
10+
deployEnv?: string;
1211
transactionHash?: string;
1312
payerKp?: string;
1413
skipRelay?: boolean;
@@ -19,33 +18,20 @@ async function collectInteractiveOptions(
1918
): Promise<CommanderOptions> {
2019
let opts = { ...options };
2120

22-
if (!opts.cluster) {
23-
const cluster = await select({
24-
message: "Select target cluster:",
25-
options: [{ value: "devnet", label: "Devnet" }],
26-
initialValue: "devnet",
27-
});
28-
if (isCancel(cluster)) {
29-
cancel("Operation cancelled.");
30-
process.exit(1);
31-
}
32-
opts.cluster = cluster;
33-
}
34-
35-
if (!opts.release) {
36-
const release = await select({
37-
message: "Select release type:",
21+
if (!opts.deployEnv) {
22+
const deployEnv = await select({
23+
message: "Select target deploy environment:",
3824
options: [
39-
{ value: "prod", label: "Prod" },
40-
{ value: "alpha", label: "Alpha" },
25+
{ value: "development-alpha", label: "Development Alpha" },
26+
{ value: "development-prod", label: "Development Prod" },
4127
],
42-
initialValue: "prod",
28+
initialValue: "development-alpha",
4329
});
44-
if (isCancel(release)) {
30+
if (isCancel(deployEnv)) {
4531
cancel("Operation cancelled.");
4632
process.exit(1);
4733
}
48-
opts.release = release;
34+
opts.deployEnv = deployEnv;
4935
}
5036

5137
if (!opts.transactionHash) {
@@ -123,8 +109,10 @@ async function collectInteractiveOptions(
123109

124110
export const proveMessageCommand = new Command("prove-message")
125111
.description("Prove a message from Base transaction on Solana")
126-
.option("--cluster <cluster>", "Target cluster (devnet)")
127-
.option("--release <release>", "Release type (alpha | prod)")
112+
.option(
113+
"--deploy-env <deployEnv>",
114+
"Target deploy environment (development-alpha | development-prod)"
115+
)
128116
.option("--transaction-hash <hash>", "Base transaction hash to prove (0x...)")
129117
.option(
130118
"--payer-kp <path>",
@@ -147,8 +135,7 @@ export const proveMessageCommand = new Command("prove-message")
147135
if (!opts.skipRelay) {
148136
logger.info("Relaying message...");
149137
await handleRelayMessage({
150-
cluster: parsed.data.cluster,
151-
release: parsed.data.release,
138+
deployEnv: parsed.data.deployEnv,
152139
messageHash: messageHash as any,
153140
payerKp: parsed.data.payerKp,
154141
});

0 commit comments

Comments
 (0)