Skip to content

Commit b141cf8

Browse files
chrismareemd0x
andauthored
fix: svm ts script issues & update to work with new interfaces (#631)
Co-authored-by: Pablo Maldonado <pablomaldonadoturci@gmail.com>
1 parent 0003ef3 commit b141cf8

16 files changed

+257
-206
lines changed

package.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,7 @@
5252
"@solana-developers/helpers": "^2.4.0",
5353
"@solana/spl-token": "^0.4.6",
5454
"@solana/web3.js": "^1.31.0",
55+
"@types/yargs": "^17.0.33",
5556
"@uma/common": "^2.34.0",
5657
"@uma/contracts-node": "^0.4.17",
5758
"@uma/core": "^2.56.0",

scripts/svm/closeRelayerPdas.ts

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@ import { PublicKey, SystemProgram } from "@solana/web3.js";
44
import { SvmSpoke } from "../../target/types/svm_spoke";
55
import yargs from "yargs";
66
import { hideBin } from "yargs/helpers";
7-
import { ethers } from "ethers";
87
import { readProgramEvents } from "../../src/SvmUtils";
98
import { calculateRelayHashUint8Array } from "../../src/SvmUtils";
109

@@ -13,17 +12,18 @@ const provider = AnchorProvider.env();
1312
anchor.setProvider(provider);
1413
const idl = require("../../target/idl/svm_spoke.json");
1514
const program = new Program<SvmSpoke>(idl, provider);
16-
const programId = program.programId; // Use programId from the provider
15+
const programId = program.programId;
1716

1817
// Parse arguments
1918
const argv = yargs(hideBin(process.argv))
2019
.option("seed", { type: "string", demandOption: true, describe: "Seed for the state account PDA" })
2120
.option("relayer", { type: "string", demandOption: true, describe: "Relayer public key" }).argv;
2221

23-
const relayer = new PublicKey(argv.relayer);
24-
const seed = new BN(argv.seed);
25-
2622
async function closeExpiredRelays(): Promise<void> {
23+
const resolvedArgv = await argv;
24+
const relayer = new PublicKey(resolvedArgv.relayer);
25+
const seed = new BN(resolvedArgv.seed);
26+
2727
console.table([
2828
{ Property: "relayer", Value: relayer.toString() },
2929
{ Property: "seed", Value: seed.toString() },
@@ -46,7 +46,7 @@ async function closeExpiredRelays(): Promise<void> {
4646
for (const event of fillEvents) {
4747
const currentTime = Math.floor(Date.now() / 1000);
4848
if (currentTime > event.data.fillDeadline) {
49-
await closeFillPda(event.data);
49+
await closeFillPda(event.data, seed);
5050
} else {
5151
console.log(
5252
`Found relay with depositId: ${event.data.depositId} from source chain id: ${event.data.originChainId}, but it is not expired yet.`
@@ -58,7 +58,8 @@ async function closeExpiredRelays(): Promise<void> {
5858
}
5959
}
6060

61-
async function closeFillPda(eventData: any): Promise<void> {
61+
async function closeFillPda(eventData: any, seed: BN): Promise<void> {
62+
// Accept seed as a parameter
6263
const relayData = {
6364
depositor: new PublicKey(eventData.depositor),
6465
recipient: new PublicKey(eventData.recipient),

scripts/svm/enableRoute.ts

Lines changed: 18 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -20,27 +20,28 @@ const argv = yargs(hideBin(process.argv))
2020
.option("chainId", { type: "string", demandOption: true, describe: "Chain ID" })
2121
.option("enabled", { type: "boolean", demandOption: true, describe: "Enable or disable the route" }).argv;
2222

23-
const seed = new BN(argv.seed);
24-
const originToken = Array.from(new PublicKey(argv.originToken).toBytes()); // Convert to number[]
25-
const chainId = new BN(argv.chainId);
26-
const enabled = argv.enabled;
23+
async function enableRoute(): Promise<void> {
24+
const resolvedArgv = await argv;
25+
const seed = new BN(resolvedArgv.seed);
26+
const originToken = Array.from(new PublicKey(resolvedArgv.originToken).toBytes());
27+
const chainId = new BN(resolvedArgv.chainId);
28+
const enabled = resolvedArgv.enabled;
2729

28-
// Define the state account PDA
29-
const [statePda, _] = PublicKey.findProgramAddressSync(
30-
[Buffer.from("state"), seed.toArrayLike(Buffer, "le", 8)],
31-
programId
32-
);
30+
// Define the state account PDA
31+
const [statePda, _] = PublicKey.findProgramAddressSync(
32+
[Buffer.from("state"), seed.toArrayLike(Buffer, "le", 8)],
33+
programId
34+
);
3335

34-
// Define the route account PDA
35-
const [routePda] = PublicKey.findProgramAddressSync(
36-
[Buffer.from("route"), Buffer.from(originToken), chainId.toArrayLike(Buffer, "le", 8)],
37-
programId
38-
);
36+
// Define the route account PDA
37+
const [routePda] = PublicKey.findProgramAddressSync(
38+
[Buffer.from("route"), Buffer.from(originToken), statePda.toBytes(), chainId.toArrayLike(Buffer, "le", 8)],
39+
programId
40+
);
3941

40-
// Define the signer (replace with your actual signer)
41-
const signer = provider.wallet.publicKey;
42+
// Define the signer (replace with your actual signer)
43+
const signer = provider.wallet.publicKey;
4244

43-
async function enableRoute(): Promise<void> {
4445
console.log("Enabling route...");
4546
console.table([
4647
{ Property: "seed", Value: seed.toString() },

scripts/svm/initialize.ts

Lines changed: 38 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -19,25 +19,42 @@ const argv = yargs(hideBin(process.argv))
1919
.option("initNumbDeposits", { type: "string", demandOption: true, describe: "Init numb of deposits" })
2020
.option("chainId", { type: "string", demandOption: true, describe: "Chain ID" })
2121
.option("remoteDomain", { type: "number", demandOption: true, describe: "CCTP domain for Mainnet Ethereum" })
22-
.option("crossDomainAdmin", { type: "string", demandOption: true, describe: "HubPool on Mainnet Ethereum" }).argv;
22+
.option("crossDomainAdmin", { type: "string", demandOption: true, describe: "HubPool on Mainnet Ethereum" })
23+
.option("depositQuoteTimeBuffer", {
24+
type: "number",
25+
demandOption: false,
26+
default: 3600,
27+
describe: "Deposit quote time buffer",
28+
})
29+
.option("fillDeadlineBuffer", {
30+
type: "number",
31+
demandOption: false,
32+
default: 3600 * 4,
33+
describe: "Fill deadline buffer",
34+
}).argv;
2335

24-
const seed = new BN(argv.seed);
25-
const initialNumberOfDeposits = new BN(argv.initNumbDeposits);
26-
const chainId = new BN(argv.chainId);
27-
const remoteDomain = argv.remoteDomain;
28-
const crossDomainAdmin = evmAddressToPublicKey(argv.crossDomainAdmin); // Use the function to cast the value
29-
const testableMode = false; // Hardcode testableMode to false
36+
async function initialize(): Promise<void> {
37+
const resolvedArgv = await argv;
38+
const seed = new BN(resolvedArgv.seed);
39+
const initialNumberOfDeposits = new BN(resolvedArgv.initNumbDeposits);
40+
const chainId = new BN(resolvedArgv.chainId);
41+
const remoteDomain = resolvedArgv.remoteDomain;
42+
const crossDomainAdmin = evmAddressToPublicKey(resolvedArgv.crossDomainAdmin); // Use the function to cast the value
43+
const testableMode = false; // Hardcode testableMode to false
44+
const depositQuoteTimeBuffer = resolvedArgv.depositQuoteTimeBuffer;
45+
const fillDeadlineBuffer = resolvedArgv.fillDeadlineBuffer;
3046

31-
// Define the state account PDA
32-
const [statePda, _] = PublicKey.findProgramAddressSync(
33-
[Buffer.from("state"), seed.toArrayLike(Buffer, "le", 8)],
34-
programId
35-
);
47+
// Define the state account PDA
48+
console.log("Seed:", seed.toString());
49+
console.log("seed.toArrayLike(Buffer", new BN(seed).toArrayLike(Buffer, "le", 8));
50+
const [statePda, _] = PublicKey.findProgramAddressSync(
51+
[Buffer.from("state"), new BN(seed).toArrayLike(Buffer, "le", 8)],
52+
programId
53+
);
3654

37-
// Define the signer (replace with your actual signer)
38-
const signer = provider.wallet.publicKey;
55+
// Define the signer (replace with your actual signer)
56+
const signer = provider.wallet.publicKey;
3957

40-
async function initialize(): Promise<void> {
4158
console.log("Initializing...");
4259
console.table([
4360
{ Property: "seed", Value: seed.toString() },
@@ -49,16 +66,20 @@ async function initialize(): Promise<void> {
4966
{ Property: "remoteDomain", Value: remoteDomain.toString() },
5067
{ Property: "crossDomainAdmin", Value: crossDomainAdmin.toString() },
5168
{ Property: "testableMode", Value: testableMode.toString() },
69+
{ Property: "depositQuoteTimeBuffer", Value: depositQuoteTimeBuffer.toString() },
70+
{ Property: "fillDeadlineBuffer", Value: fillDeadlineBuffer.toString() },
5271
]);
5372

5473
const tx = await (
5574
program.methods.initialize(
5675
seed,
57-
initialNumberOfDeposits,
76+
initialNumberOfDeposits.toNumber(),
5877
chainId,
5978
remoteDomain,
6079
crossDomainAdmin,
61-
testableMode
80+
testableMode,
81+
depositQuoteTimeBuffer,
82+
fillDeadlineBuffer
6283
) as any
6384
)
6485
.accounts({

scripts/svm/queryDeposits.ts

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -14,21 +14,22 @@ const program = new Program<SvmSpoke>(idl, provider);
1414
const programId = program.programId;
1515

1616
// Parse arguments
17-
const argv = yargs(hideBin(process.argv)).option("seed", {
17+
const argvPromise = yargs(hideBin(process.argv)).option("seed", {
1818
type: "string",
1919
demandOption: true,
2020
describe: "Seed for the state account PDA",
2121
}).argv;
2222

23-
const seed = new BN(argv.seed);
23+
async function queryDeposits(): Promise<void> {
24+
const argv = await argvPromise;
25+
const seed = new BN(argv.seed);
2426

25-
// Define the state account PDA
26-
const [statePda, _] = PublicKey.findProgramAddressSync(
27-
[Buffer.from("state"), seed.toArrayLike(Buffer, "le", 8)],
28-
programId
29-
);
27+
// Define the state account PDA
28+
const [statePda, _] = PublicKey.findProgramAddressSync(
29+
[Buffer.from("state"), seed.toArrayLike(Buffer, "le", 8)],
30+
programId
31+
);
3032

31-
async function queryDeposits(): Promise<void> {
3233
console.table([
3334
{ Property: "seed", Value: seed.toString() },
3435
{ Property: "programId", Value: programId.toString() },
@@ -37,7 +38,6 @@ async function queryDeposits(): Promise<void> {
3738

3839
try {
3940
const events = await readProgramEvents(provider.connection, program);
40-
console.log("events", events);
4141
const depositEvents = events.filter((event) => event.name === "v3FundsDeposited");
4242

4343
if (depositEvents.length === 0) {

scripts/svm/queryFills.ts

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -20,15 +20,16 @@ const argv = yargs(hideBin(process.argv)).option("seed", {
2020
describe: "Seed for the state account PDA",
2121
}).argv;
2222

23-
const seed = new BN(argv.seed);
23+
async function queryFills(): Promise<void> {
24+
const resolvedArgv = await argv;
25+
const seed = new BN(resolvedArgv.seed);
2426

25-
// Define the state account PDA
26-
const [statePda, _] = PublicKey.findProgramAddressSync(
27-
[Buffer.from("state"), seed.toArrayLike(Buffer, "le", 8)],
28-
programId
29-
);
27+
// Define the state account PDA
28+
const [statePda, _] = PublicKey.findProgramAddressSync(
29+
[Buffer.from("state"), seed.toArrayLike(Buffer, "le", 8)],
30+
programId
31+
);
3032

31-
async function queryFills(): Promise<void> {
3233
console.table([
3334
{ Property: "seed", Value: seed.toString() },
3435
{ Property: "programId", Value: programId.toString() },

scripts/svm/queryRoute.ts

Lines changed: 27 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -20,40 +20,44 @@ const programId = program.programId;
2020

2121
// Parse arguments
2222
const argv = yargs(hideBin(process.argv))
23+
.option("seed", { type: "string", demandOption: true, describe: "Seed for the state account PDA" })
2324
.option("originToken", { type: "string", demandOption: true, describe: "Origin token public key" })
2425
.option("chainId", { type: "string", demandOption: true, describe: "Chain ID" }).argv;
2526

26-
const originToken = Array.from(new PublicKey(argv.originToken).toBytes()); // Convert to number[]
27-
const chainId = new BN(argv.chainId);
27+
async function queryRoute(): Promise<void> {
28+
const resolvedArgv = await argv;
29+
const seed = new BN(resolvedArgv.seed);
30+
const originToken = Array.from(new PublicKey(resolvedArgv.originToken).toBytes());
31+
const chainId = new BN(resolvedArgv.chainId);
2832

29-
// Define the route account PDA
30-
const [routePda] = PublicKey.findProgramAddressSync(
31-
[Buffer.from("route"), Buffer.from(originToken), chainId.toArrayLike(Buffer, "le", 8)],
32-
programId
33-
);
33+
// Define the state account PDA
34+
const [statePda, _] = PublicKey.findProgramAddressSync(
35+
[Buffer.from("state"), seed.toArrayLike(Buffer, "le", 8)],
36+
programId
37+
);
3438

35-
// Define the state account PDA (assuming the seed is known or can be derived)
36-
const seed = new BN(0); // Replace with actual seed if known
37-
const [statePda] = PublicKey.findProgramAddressSync(
38-
[Buffer.from("state"), seed.toArrayLike(Buffer, "le", 8)],
39-
programId
40-
);
39+
// Define the route account PDA
40+
const [routePda] = PublicKey.findProgramAddressSync(
41+
[Buffer.from("route"), Buffer.from(originToken), statePda.toBytes(), chainId.toArrayLike(Buffer, "le", 8)],
42+
programId
43+
);
4144

42-
// Compute the vault address
43-
const vault = getAssociatedTokenAddressSync(
44-
new PublicKey(originToken),
45-
statePda,
46-
true,
47-
TOKEN_PROGRAM_ID,
48-
ASSOCIATED_TOKEN_PROGRAM_ID
49-
);
45+
// Compute the vault address
46+
const vault = getAssociatedTokenAddressSync(
47+
new PublicKey(originToken),
48+
statePda,
49+
true,
50+
TOKEN_PROGRAM_ID,
51+
ASSOCIATED_TOKEN_PROGRAM_ID
52+
);
5053

51-
async function queryRoute(): Promise<void> {
5254
console.log("Querying route...");
5355
console.table([
56+
{ Property: "seed", Value: seed.toString() },
5457
{ Property: "originToken", Value: new PublicKey(originToken).toString() },
5558
{ Property: "chainId", Value: chainId.toString() },
5659
{ Property: "programId", Value: programId.toString() },
60+
{ Property: "statePda", Value: statePda.toString() },
5761
{ Property: "routePda", Value: routePda.toString() },
5862
{ Property: "vault", Value: vault.toString() },
5963
]);
@@ -67,7 +71,7 @@ async function queryRoute(): Promise<void> {
6771
{ Property: "Enabled", Value: route.enabled },
6872
{ Property: "vaultBalance", Value: vaultAccount.amount.toString() },
6973
]);
70-
} catch (error) {
74+
} catch (error: any) {
7175
if (error.message.includes("Account does not exist or has no data")) {
7276
console.log("No route has been created for the given origin token and chain ID.");
7377
} else {

scripts/svm/queryState.ts

Lines changed: 18 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -19,15 +19,17 @@ const argv = yargs(hideBin(process.argv)).option("seed", {
1919
describe: "Seed for the state account PDA",
2020
}).argv;
2121

22-
const seed = new BN(argv.seed);
22+
async function queryState(): Promise<void> {
23+
const resolvedArgv = await argv;
2324

24-
// Define the state account PDA
25-
const [statePda, _] = PublicKey.findProgramAddressSync(
26-
[Buffer.from("state"), seed.toArrayLike(Buffer, "le", 8)],
27-
programId
28-
);
25+
const seed = new BN(resolvedArgv.seed);
26+
27+
// Define the state account PDA
28+
const [statePda, _] = PublicKey.findProgramAddressSync(
29+
[Buffer.from("state"), seed.toArrayLike(Buffer, "le", 8)],
30+
programId
31+
);
2932

30-
async function queryState(): Promise<void> {
3133
console.log("Querying state...");
3234
console.table([
3335
{ Property: "seed", Value: seed.toString() },
@@ -40,9 +42,16 @@ async function queryState(): Promise<void> {
4042
console.log("State fetched successfully:");
4143
console.table([
4244
{ Property: "Owner", Value: state.owner.toString() },
43-
{ Property: "Deposits Enabled", Value: !state.pausedDeposits },
45+
{ Property: "Deposits Paused", Value: state.pausedDeposits },
46+
{ Property: "Fills Paused", Value: state.pausedFills },
4447
{ Property: "Number of Deposits", Value: state.numberOfDeposits.toString() },
45-
{ Property: "Chain ID", Value: state.chainId.toString() }, // Added chainId
48+
{ Property: "Chain ID", Value: state.chainId.toString() },
49+
{ Property: "Current Time", Value: state.currentTime.toString() },
50+
{ Property: "Remote Domain", Value: state.remoteDomain.toString() },
51+
{ Property: "Cross Domain Admin", Value: state.crossDomainAdmin.toString() },
52+
{ Property: "Root Bundle ID", Value: state.rootBundleId.toString() },
53+
{ Property: "Deposit Quote Time Buffer", Value: state.depositQuoteTimeBuffer.toString() },
54+
{ Property: "Fill Deadline Buffer", Value: state.fillDeadlineBuffer.toString() },
4655
]);
4756
} catch (error) {
4857
console.error("An error occurred while fetching the state:", error);

0 commit comments

Comments
 (0)