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

[solana] Scripts to update parameters and vesting tests #253

Merged
merged 16 commits into from
Mar 6, 2025
Merged
Changes from 1 commit
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
Prev Previous commit
Next Next commit
Reorganization of scripts, constants, and folders. Remove unnecessary…
… code
zpoken committed Mar 5, 2025
commit 880b0c1492553d49bcb67c1eec5815c16d9ad225
15 changes: 9 additions & 6 deletions solana/app/StakeConnection.ts
Original file line number Diff line number Diff line change
@@ -25,7 +25,7 @@ import BN from "bn.js";
import { Staking } from "../target/types/staking";
import IDL from "../target/idl/staking.json";
import { WHTokenBalance } from "./whTokenBalance";
import { CORE_BRIDGE_ADDRESS, STAKING_ADDRESS } from "./constants";
import { contracts } from "@wormhole-foundation/sdk-base";
import {
PriorityFeeConfig,
sendTransactions,
@@ -92,7 +92,6 @@ export class StakeConnection {
return await StakeConnection.createStakeConnection(
connection,
wallet,
STAKING_ADDRESS,
);
}

@@ -102,7 +101,6 @@ export class StakeConnection {
public static async createStakeConnection(
connection: Connection,
wallet: Wallet,
stakingProgramAddress: PublicKey,
addressLookupTable?: PublicKey,
priorityFeeConfig?: PriorityFeeConfig,
): Promise<StakeConnection> {
@@ -386,7 +384,6 @@ export class StakeConnection {
/** Creates a new stake account and sends the transaction for confirmation. */
public async createStakeAccount(): Promise<void> {
const instructions: TransactionInstruction[] = [];

instructions.push(
await this.program.methods
.createStakeAccount()
@@ -395,6 +392,7 @@ export class StakeConnection {
})
.instruction(),
);

await this.sendAndConfirmAsVersionedTransaction(instructions);
}

@@ -754,7 +752,12 @@ export class StakeConnection {
unoptimized?: boolean,
): Promise<void> {
const { proposalAccount } = await this.fetchProposalAccount(proposalId);

const networkType = this.provider.connection.rpcEndpoint.includes('mainnet')
? 'Mainnet'
: 'Testnet';
const coreBridge = new PublicKey(
contracts.coreBridge.get(networkType, "Solana"), // Testnet - 3u8hJUVTA4jH1wYAyUur7FFZVQ8H635K3tSHHF4ssjQ5
);
const methodsBuilder = this.program.methods
.addProposal(
Buffer.from(ethProposalResponseBytes),
@@ -765,7 +768,7 @@ export class StakeConnection {
proposal: proposalAccount,
guardianSignatures: guardianSignatures,
guardianSet: deriveGuardianSetKey(
CORE_BRIDGE_ADDRESS,
coreBridge,
guardianSetIndex,
),
});
44 changes: 42 additions & 2 deletions solana/app/constants.ts → solana/app/deploy/devnet/constants.ts
Original file line number Diff line number Diff line change
@@ -1,11 +1,16 @@
import { PublicKey } from "@solana/web3.js";
import { homedir } from "os";
import { loadKeypair } from "../../../tests/utils/keys";
import { contracts } from "@wormhole-foundation/sdk-base";

export const RPC_NODE = "https://api.devnet.solana.com";

export const STAKING_ADDRESS = new PublicKey(
"AFuHPdrQGsW8rNQ4oEFF35sm5fg36gwrxyqjkjKvi6ap",
);

export const CORE_BRIDGE_ADDRESS = new PublicKey(
"3u8hJUVTA4jH1wYAyUur7FFZVQ8H635K3tSHHF4ssjQ5",
export const CORE_BRIDGE_PID = new PublicKey(
contracts.coreBridge.get("Testnet", "Solana")!, // 3u8hJUVTA4jH1wYAyUur7FFZVQ8H635K3tSHHF4ssjQ5
);

/// Wormhole Hub Proposal Metadata Contract (sepolia ethereum address)
@@ -53,3 +58,38 @@ export const HUB_SOLANA_SPOKE_VOTE_DECODER_ADDRESS =
/// Wormhole HubVotePool Contract (sepolia ethereum address)
export const HUB_VOTE_POOL_ADDRESS =
"0x1004c781763c70f5f11aa64b0e5b34e1442a3c02";

export const DEPLOYER_AUTHORITY_PATH = "/.config/solana/deployer.json";
export const DEPLOYER_AUTHORITY_KEYPAIR = loadKeypair(
homedir() + DEPLOYER_AUTHORITY_PATH,
);

export const GOVERNANCE_AUTHORITY_PATH = "/.config/solana/governanceAuthority.json";
export const GOVERNANCE_AUTHORITY_KEYPAIR = loadKeypair(
homedir() + GOVERNANCE_AUTHORITY_PATH,
);

export const VESTING_ADMIN_PATH = "/.config/solana/vestingAdmin.json";
export const VESTING_ADMIN_KEYPAIR = loadKeypair(
homedir() + VESTING_ADMIN_PATH,
);

export const USER_AUTHORITY_PATH = "/.config/solana/user.json";
export const USER_AUTHORITY_KEYPAIR = loadKeypair(
homedir() + USER_AUTHORITY_PATH,
);

export const USER2_AUTHORITY_PATH = "/.config/solana/secretKey_617X3kwJzjfAbr6zHMa4rzbjaHQN8mzST8VAb8oE8xo8.json";
export const USER2_AUTHORITY_KEYPAIR = loadKeypair(
homedir() + USER2_AUTHORITY_PATH,
);

export const WORMHOLE_TOKEN = new PublicKey(
"Exne2kdeGToBnC2WVSdt1gLy6fjnNftbPtsCPx8AuL7V",
);

export const AIRLOCK_PDA_ADDRESS = new PublicKey(
"2ejzW2eFPedskg1KcrjcFs9g1JorRVcMes1TBPpGbhdy",
);

export const VOTE_WEIGHT_WINDOW_LENGTHS = 10 * 60; // 10 minutes
Original file line number Diff line number Diff line change
@@ -1,9 +1,14 @@
// Usage: npx ts-node app/deploy/012_initAddressLookupTable.ts
// Usage: npx ts-node app/deploy/devnet/initialize/initAddressLookupTable.ts

import { Wallet, AnchorProvider } from "@coral-xyz/anchor";
import { Connection } from "@solana/web3.js";
import { DEPLOYER_AUTHORITY_KEYPAIR, WORMHOLE_TOKEN, RPC_NODE } from "./devnet_consts";
import { initAddressLookupTable } from "../../tests/utils/utils";
import {
DEPLOYER_AUTHORITY_KEYPAIR,
RPC_NODE,
STAKING_ADDRESS,
WORMHOLE_TOKEN,
} from "../constants";
import { initAddressLookupTable } from "../../../helpers/utils/lookup_table";

async function main() {
try {
@@ -17,6 +22,7 @@ async function main() {
const lookupTableAddress = await initAddressLookupTable(
provider,
WORMHOLE_TOKEN,
STAKING_ADDRESS,
);

console.log("Lookup table address: ", lookupTableAddress.toBase58());
Original file line number Diff line number Diff line change
@@ -1,11 +1,14 @@
// Usage: npx ts-node app/deploy/011_initConfig.ts
// Usage: npx ts-node app/deploy/devnet/initialize/initConfig.ts

import { Wallet, AnchorProvider, Program } from "@coral-xyz/anchor";
import { Connection } from "@solana/web3.js";
import { DEPLOYER_AUTHORITY_KEYPAIR, WORMHOLE_TOKEN, RPC_NODE } from "./devnet_consts";
import { CHECKPOINTS_ACCOUNT_LIMIT, STAKING_ADDRESS } from "../constants";
import { Staking } from "../../target/types/staking";
import fs from "fs";
import {
CHECKPOINTS_ACCOUNT_LIMIT,
STAKING_ADDRESS,
DEPLOYER_AUTHORITY_KEYPAIR,
WORMHOLE_TOKEN,
RPC_NODE,
} from "../constants";

async function main() {
const connection = new Connection(RPC_NODE);
Original file line number Diff line number Diff line change
@@ -1,10 +1,9 @@
// Usage: npx ts-node app/deploy/013_initializeSpokeAirlock.ts
// Usage: npx ts-node app/deploy/devnet/initialize/initializeSpokeAirlock.ts

import * as anchor from "@coral-xyz/anchor";
import { AnchorProvider, Program, Wallet } from "@coral-xyz/anchor";
import { Connection, PublicKey, SystemProgram } from "@solana/web3.js";
import { DEPLOYER_AUTHORITY_KEYPAIR, RPC_NODE } from "./devnet_consts";
import { Staking } from "../../target/types/staking";
import { DEPLOYER_AUTHORITY_KEYPAIR, RPC_NODE } from "../constants";
import { Staking } from "../../../../target/types/staking";
import fs from "fs";

async function main() {
Original file line number Diff line number Diff line change
@@ -1,20 +1,19 @@
// Usage: npx ts-node app/deploy/016_initializeSpokeMessageExecutor.ts
// Usage: npx ts-node app/deploy/devnet/initialize/initializeSpokeMessageExecutor.ts

import * as anchor from "@coral-xyz/anchor";
import { AnchorProvider, Program, Wallet } from "@coral-xyz/anchor";
import { Connection, PublicKey, SystemProgram } from "@solana/web3.js";
import {
DEPLOYER_AUTHORITY_KEYPAIR,
hubSolanaMessageDispatcherPublicKey,
HUB_CHAIN_ID,
RPC_NODE,
} from "../constants";
import { DEPLOYER_AUTHORITY_KEYPAIR, RPC_NODE } from "./devnet_consts";
import { Staking } from "../../target/types/staking";
import { Staking } from "../../../../target/types/staking";
import fs from "fs";
import { wasm } from "../StakeConnection";
import { wasm } from "../../../StakeConnection";

async function main() {
try {
const DEBUG = true;
const connection = new Connection(RPC_NODE);
const provider = new AnchorProvider(
connection,
@@ -47,7 +46,7 @@ async function main() {
hubDispatcher: hubSolanaMessageDispatcherPublicKey,
systemProgram: SystemProgram.programId,
})
.rpc({ skipPreflight: DEBUG });
.rpc();
} catch (err) {
console.error("Error:", err);
}
Original file line number Diff line number Diff line change
@@ -1,16 +1,18 @@
// Usage: npx ts-node app/deploy/014_initializeSpokeMetadataCollector.ts
// Usage: npx ts-node app/deploy/devnet/initialize/initializeSpokeMetadataCollector.ts

import * as anchor from "@coral-xyz/anchor";
import { AnchorProvider, Program, Wallet } from "@coral-xyz/anchor";
import { Connection } from "@solana/web3.js";
import { HUB_CHAIN_ID, hubProposalMetadataUint8Array } from "../constants";
import { DEPLOYER_AUTHORITY_KEYPAIR, RPC_NODE } from "./devnet_consts";
import { Staking } from "../../target/types/staking";
import {
DEPLOYER_AUTHORITY_KEYPAIR,
HUB_CHAIN_ID,
hubProposalMetadataUint8Array,
RPC_NODE,
} from "../constants";
import { Staking } from "../../../../target/types/staking";
import fs from "fs";

async function main() {
try {
const DEBUG = true;
const connection = new Connection(RPC_NODE);
const provider = new AnchorProvider(
connection,
Original file line number Diff line number Diff line change
@@ -1,16 +1,14 @@
// Usage: npx ts-node app/deploy/015_initializeVoteWeightWindowLengths.ts
// Usage: npx ts-node app/deploy/devnet/initialize/initializeVoteWeightWindowLengths.ts

import * as anchor from "@coral-xyz/anchor";
import { AnchorProvider, Program, Wallet } from "@coral-xyz/anchor";
import { Connection } from "@solana/web3.js";
import { DEPLOYER_AUTHORITY_KEYPAIR, RPC_NODE, VOTE_WEIGHT_WINDOW_LENGTHS } from "./devnet_consts";
import { Staking } from "../../target/types/staking";
import { DEPLOYER_AUTHORITY_KEYPAIR, RPC_NODE, VOTE_WEIGHT_WINDOW_LENGTHS } from "../constants";
import { Staking } from "../../../../target/types/staking";
import fs from "fs";
import BN from "bn.js";

async function main() {
try {
const DEBUG = true;
const connection = new Connection(RPC_NODE);
const provider = new AnchorProvider(
connection,
Original file line number Diff line number Diff line change
@@ -1,17 +1,12 @@
// Usage: npx ts-node app/deploy/031_createStakeAccount.ts
// Usage: npx ts-node app/deploy/devnet/tests/11_createStakeAccount.ts

import * as anchor from "@coral-xyz/anchor";
import { AnchorProvider, Wallet } from "@coral-xyz/anchor";
import { Connection } from "@solana/web3.js";
import * as wasm from "@wormhole/staking-wasm";
import { StakeConnection } from "../StakeConnection";
import { STAKING_ADDRESS } from "../constants";
import { USER2_AUTHORITY_KEYPAIR, RPC_NODE } from "./devnet_consts";
import { Staking } from "../../target/types/staking";
import { StakeConnection } from "../../../StakeConnection";
import { RPC_NODE, USER2_AUTHORITY_KEYPAIR } from "../constants";

async function main() {
try {
const DEBUG = true;
const connection = new Connection(RPC_NODE);
const provider = new AnchorProvider(
connection,
@@ -22,7 +17,6 @@ async function main() {
const stakeConnection = await StakeConnection.createStakeConnection(
connection,
provider.wallet as Wallet,
STAKING_ADDRESS,
);

await stakeConnection.createStakeAccount();
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
// Usage: npx ts-node app/deploy/032_deposit.ts
// Usage: npx ts-node app/deploy/devnet/tests/12_deposit.ts

import * as anchor from "@coral-xyz/anchor";
import { AnchorProvider, Program, Wallet } from "@coral-xyz/anchor";
@@ -8,8 +8,12 @@ import {
} from "@solana/spl-token";
import { PublicKey, Transaction, Connection } from "@solana/web3.js";
import * as wasm from "@wormhole/staking-wasm";
import { STAKING_ADDRESS } from "../constants";
import { USER_AUTHORITY_KEYPAIR, WORMHOLE_TOKEN, RPC_NODE } from "./devnet_consts";
import {
RPC_NODE,
STAKING_ADDRESS,
USER_AUTHORITY_KEYPAIR,
WORMHOLE_TOKEN,
} from "../constants";

async function main() {
try {
Original file line number Diff line number Diff line change
@@ -1,12 +1,10 @@
// Usage: npx ts-node app/deploy/033_withdrawTokens.ts
// Usage: npx ts-node app/deploy/devnet/tests/13_withdrawTokens.ts

import * as anchor from "@coral-xyz/anchor";
import { AnchorProvider, Wallet } from "@coral-xyz/anchor";
import { Connection } from "@solana/web3.js";
import { StakeConnection } from "../StakeConnection";
import { WHTokenBalance } from "../whTokenBalance";
import { STAKING_ADDRESS } from "../constants";
import { USER_AUTHORITY_KEYPAIR, RPC_NODE } from "./devnet_consts";
import { StakeConnection } from "../../../StakeConnection";
import { WHTokenBalance } from "../../../whTokenBalance";
import { RPC_NODE, USER_AUTHORITY_KEYPAIR } from "../constants";

async function main() {
try {
@@ -19,7 +17,6 @@ async function main() {
const stakeConnection = await StakeConnection.createStakeConnection(
connection,
provider.wallet as Wallet,
STAKING_ADDRESS,
);

const user = provider.wallet.publicKey;
@@ -30,6 +27,9 @@ async function main() {
stakeAccountMetadataAddress,
false,
);
if (!stakeAccountCheckpointsAddress) {
throw new Error(`stakeAccountCheckpointsAddress is not defined`);
}
let stakeAccount = await stakeConnection.loadStakeAccount(
stakeAccountCheckpointsAddress,
);
Original file line number Diff line number Diff line change
@@ -1,16 +1,14 @@
// Usage: npx ts-node app/deploy/034_delegate.ts
// Usage: npx ts-node app/deploy/devnet/tests/14_delegate.ts

import * as anchor from "@coral-xyz/anchor";
import { AnchorProvider, Wallet } from "@coral-xyz/anchor";
import { PublicKey, Connection } from "@solana/web3.js";
import { StakeConnection } from "../StakeConnection";
import { WHTokenBalance } from "../whTokenBalance";
import { STAKING_ADDRESS } from "../constants";
import { Connection } from "@solana/web3.js";
import { StakeConnection } from "../../../StakeConnection";
import { WHTokenBalance } from "../../../whTokenBalance";
import {
USER_AUTHORITY_KEYPAIR,
USER2_AUTHORITY_KEYPAIR,
RPC_NODE,
} from "./devnet_consts";
} from "../constants";

function sleep(ms) {
return new Promise((resolve) => setTimeout(resolve, ms));
@@ -27,7 +25,6 @@ async function main() {
const stakeConnection = await StakeConnection.createStakeConnection(
connection,
provider.wallet as Wallet,
STAKING_ADDRESS,
);

await stakeConnection.delegate(
@@ -44,7 +41,6 @@ async function main() {
const user2StakeConnection = await StakeConnection.createStakeConnection(
connection,
user2Provider.wallet as Wallet,
STAKING_ADDRESS,
);

await user2StakeConnection.delegate(
Original file line number Diff line number Diff line change
@@ -1,12 +1,15 @@
// Usage: npx ts-node app/deploy/041_addProposal.ts
// Usage: npx ts-node app/deploy/devnet/tests/15_addProposal.ts

import * as anchor from "@coral-xyz/anchor";
import { AnchorProvider, Wallet } from "@coral-xyz/anchor";
import { Connection, Keypair } from "@solana/web3.js";
import { StakeConnection } from "../StakeConnection";
import { STAKING_ADDRESS, CORE_BRIDGE_ADDRESS } from "../constants";
import { DEPLOYER_AUTHORITY_KEYPAIR, RPC_NODE } from "./devnet_consts";
import { getWormholeBridgeData } from "../helpers/wormholeBridgeConfig";
import { Connection } from "@solana/web3.js";
import { StakeConnection } from "../../../StakeConnection";
import {
CORE_BRIDGE_PID,
DEPLOYER_AUTHORITY_KEYPAIR,
RPC_NODE,
} from "../constants";
import { getWormholeBridgeData } from "../../../helpers/wormholeBridgeConfig";
import input from "@inquirer/input";

async function main() {
try {
@@ -21,10 +24,9 @@ async function main() {
const stakeConnection = await StakeConnection.createStakeConnection(
connection,
provider.wallet as Wallet,
STAKING_ADDRESS,
);

const info = await getWormholeBridgeData(connection, CORE_BRIDGE_ADDRESS);
const info = await getWormholeBridgeData(connection, CORE_BRIDGE_PID);
let guardianSetIndex = info.guardianSetIndex;

const sepoliaEthProposalResponse = {
Original file line number Diff line number Diff line change
@@ -1,11 +1,9 @@
// Usage: npx ts-node app/deploy/042_castVote.ts
// Usage: npx ts-node app/deploy/devnet/tests/16_castVote.ts

import * as anchor from "@coral-xyz/anchor";
import { AnchorProvider, Wallet } from "@coral-xyz/anchor";
import { Connection } from "@solana/web3.js";
import { StakeConnection } from "../StakeConnection";
import { STAKING_ADDRESS } from "../constants";
import { USER2_AUTHORITY_KEYPAIR, RPC_NODE } from "./devnet_consts";
import { StakeConnection } from "../../../StakeConnection";
import { USER2_AUTHORITY_KEYPAIR, RPC_NODE } from "../constants";
import BN from "bn.js";
import input from "@inquirer/input";

@@ -26,7 +24,6 @@ async function main() {
const user2StakeConnection = await StakeConnection.createStakeConnection(
connection,
user2Provider.wallet as Wallet,
STAKING_ADDRESS,
);

await user2StakeConnection.castVote(
Original file line number Diff line number Diff line change
@@ -1,11 +1,9 @@
// Usage: npx ts-node app/deploy/043_proposalVotes.ts
// Usage: npx ts-node app/deploy/devnet/tests/17_proposalVotes.ts

import * as anchor from "@coral-xyz/anchor";
import { AnchorProvider, Wallet } from "@coral-xyz/anchor";
import { Connection } from "@solana/web3.js";
import { StakeConnection } from "../StakeConnection";
import { STAKING_ADDRESS } from "../constants";
import { USER_AUTHORITY_KEYPAIR, RPC_NODE } from "./devnet_consts";
import { StakeConnection } from "../../../StakeConnection";
import { USER_AUTHORITY_KEYPAIR, RPC_NODE } from "../constants";

async function main() {
try {
@@ -19,7 +17,6 @@ async function main() {
const stakeConnection = await StakeConnection.createStakeConnection(
connection,
provider.wallet as Wallet,
STAKING_ADDRESS,
);

const proposalIdHex =
Original file line number Diff line number Diff line change
@@ -1,17 +1,17 @@
// Usage: npx ts-node app/deploy/061_fetchGlobalConfig.ts
// Usage: npx ts-node app/deploy/devnet/tests/21_fetchGlobalConfig.ts

import { Wallet, AnchorProvider, utils } from "@coral-xyz/anchor";
import { Connection, PublicKey } from "@solana/web3.js";
import * as wasm from "@wormhole/staking-wasm";
import {
CHECKPOINTS_ACCOUNT_LIMIT,
DEPLOYER_AUTHORITY_KEYPAIR,
WORMHOLE_TOKEN,
GOVERNANCE_AUTHORITY_KEYPAIR,
VESTING_ADMIN_KEYPAIR,
RPC_NODE
} from "./devnet_consts";
import { CHECKPOINTS_ACCOUNT_LIMIT, STAKING_ADDRESS } from "../constants";
import { StakeConnection } from "../StakeConnection";
RPC_NODE,
} from "../constants";
import { StakeConnection } from "../../../StakeConnection";

async function main() {
const connection = new Connection(RPC_NODE);
@@ -23,7 +23,6 @@ async function main() {
const stakeConnection = await StakeConnection.createStakeConnection(
connection,
provider.wallet as Wallet,
STAKING_ADDRESS,
);

console.log("DEPLOYER_AUTHORITY_KEYPAIR.publicKey:", DEPLOYER_AUTHORITY_KEYPAIR.publicKey);
Original file line number Diff line number Diff line change
@@ -1,14 +1,15 @@
// Usage: npx ts-node app/deploy/062_fetchSpokeMetadataCollector.ts
// Usage: npx ts-node app/deploy/devnet/tests/22_fetchSpokeMetadataCollector.ts

import { Wallet, AnchorProvider, utils } from "@coral-xyz/anchor";
import { Connection, PublicKey } from "@solana/web3.js";
import * as wasm from "@wormhole/staking-wasm";
import {
DEPLOYER_AUTHORITY_KEYPAIR,
RPC_NODE
} from "./devnet_consts";
import { STAKING_ADDRESS, HUB_CHAIN_ID, hubProposalMetadataUint8Array } from "../constants";
import { StakeConnection } from "../StakeConnection";
HUB_CHAIN_ID,
hubProposalMetadataUint8Array,
RPC_NODE,
} from "../constants";
import { StakeConnection } from "../../../StakeConnection";

async function main() {
const connection = new Connection(RPC_NODE);
@@ -20,7 +21,6 @@ async function main() {
const stakeConnection = await StakeConnection.createStakeConnection(
connection,
provider.wallet as Wallet,
STAKING_ADDRESS,
);

console.log("HUB_CHAIN_ID:", HUB_CHAIN_ID);
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
// Usage: npx ts-node app/deploy/063_fetchVoteWeightWindowLengths.ts
// Usage: npx ts-node app/deploy/devnet/tests/23_fetchVoteWeightWindowLengths.ts

import { Wallet, AnchorProvider, utils } from "@coral-xyz/anchor";
import { Connection, PublicKey } from "@solana/web3.js";
@@ -7,13 +7,12 @@ import {
DEPLOYER_AUTHORITY_KEYPAIR,
RPC_NODE,
VOTE_WEIGHT_WINDOW_LENGTHS
} from "./devnet_consts";
import { STAKING_ADDRESS } from "../constants";
import { StakeConnection } from "../StakeConnection";
} from "../constants";
import { StakeConnection } from "../../../StakeConnection";
import {
readWindowLengths,
WindowLengthsAccount,
} from "../vote_weight_window_lengths";
} from "../../../vote_weight_window_lengths";

async function main() {
const connection = new Connection(RPC_NODE);
@@ -25,7 +24,6 @@ async function main() {
const stakeConnection = await StakeConnection.createStakeConnection(
connection,
provider.wallet as Wallet,
STAKING_ADDRESS,
);

console.log("VOTE_WEIGHT_WINDOW_LENGTHS:", VOTE_WEIGHT_WINDOW_LENGTHS);
@@ -47,7 +45,7 @@ async function main() {
);
console.log("windowLengthsAccount.getWindowLengthCount():", windowLengthsAccount.getWindowLengthCount());
console.log("windowLengthsAccount.voteWeightWindowLengths.nextIndex:", windowLengthsAccount.voteWeightWindowLengths.nextIndex);
console.log("windowLengthsAccount.getLastWindowLength().value.toString():", windowLengthsAccount.getLastWindowLength().value.toString());
console.log("windowLengthsAccount.getLastWindowLength().value.toString():", windowLengthsAccount.getLastWindowLength()?.value.toString());
}

main();
Original file line number Diff line number Diff line change
@@ -1,12 +1,11 @@
// Usage: npx ts-node app/deploy/064_fetchProposalAccountData.ts
// Usage: npx ts-node app/deploy/devnet/tests/24_fetchProposalAccountData.ts

import * as anchor from "@coral-xyz/anchor";
import { AnchorProvider, Wallet } from "@coral-xyz/anchor";
import { Connection } from "@solana/web3.js";
import { StakeConnection } from "../StakeConnection";
import { STAKING_ADDRESS } from "../constants";
import { DEPLOYER_AUTHORITY_KEYPAIR, RPC_NODE } from "./devnet_consts";
import { StakeConnection } from "../../../StakeConnection";
import { DEPLOYER_AUTHORITY_KEYPAIR, RPC_NODE } from "../constants";
import { ethers } from "ethers";
import input from "@inquirer/input";

async function main() {
try {
@@ -17,15 +16,14 @@ async function main() {
{},
);

const proposalId = await input({ message: "Enter the proposal id:" });
const proposalIdHex = BigInt(proposalId).toString(16).padStart(64, "0");
const inputProposalId = await input({ message: "Enter the proposal id:" });
const proposalIdHex = BigInt(inputProposalId).toString(16).padStart(64, "0");
// console.log("proposalIdHex:", proposalIdHex);
const proposalIdArray = Buffer.from(proposalIdHex, "hex");

const stakeConnection = await StakeConnection.createStakeConnection(
connection,
provider.wallet as Wallet,
STAKING_ADDRESS,
);

const { proposalAccountData } =
Original file line number Diff line number Diff line change
@@ -1,18 +1,15 @@
// Usage: npx ts-node app/deploy/065_fetchSpokeMessageExecutor.ts
// Usage: npx ts-node app/deploy/devnet/tests/25_fetchSpokeMessageExecutor.ts

import { Wallet, AnchorProvider, utils } from "@coral-xyz/anchor";
import { Connection, PublicKey } from "@solana/web3.js";
import * as wasm from "@wormhole/staking-wasm";
import {
DEPLOYER_AUTHORITY_KEYPAIR,
RPC_NODE
} from "./devnet_consts";
import {
STAKING_ADDRESS,
HUB_CHAIN_ID,
hubSolanaMessageDispatcherPublicKey,
RPC_NODE,
} from "../constants";
import { StakeConnection } from "../StakeConnection";
import { StakeConnection } from "../../../StakeConnection";

async function main() {
const connection = new Connection(RPC_NODE);
@@ -24,7 +21,6 @@ async function main() {
const stakeConnection = await StakeConnection.createStakeConnection(
connection,
provider.wallet as Wallet,
STAKING_ADDRESS,
);

console.log("HUB_CHAIN_ID:", HUB_CHAIN_ID);
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
// Usage: npx ts-node app/deploy/051_tx_list.ts
// Usage: npx ts-node app/deploy/devnet/tests/31_tx_list.ts

import { Connection } from "@solana/web3.js";
import { RPC_NODE } from "./devnet_consts";
import { getProgramTransactions } from "../utils/parse_transactions";
import { RPC_NODE } from "../constants";
import { getProgramTransactions } from "../../../helpers/utils/parse_transactions";

async function main() {
const connection = new Connection(RPC_NODE, "confirmed");
Original file line number Diff line number Diff line change
@@ -1,11 +1,11 @@
// Usage: npx ts-node app/deploy/052_tx_events.ts
// Usage: npx ts-node app/deploy/devnet/tests/32_tx_events.ts

import { Connection } from "@solana/web3.js";
import { RPC_NODE } from "./devnet_consts";
import { RPC_NODE } from "../constants";
import {
getProgramTransactions,
printTransactionEvents,
} from "../utils/parse_transactions";
} from "../../../helpers/utils/parse_transactions";

async function main() {
const connection = new Connection(RPC_NODE, "confirmed");
Original file line number Diff line number Diff line change
@@ -1,11 +1,11 @@
// Usage: npx ts-node app/deploy/053_tx_details.ts
// Usage: npx ts-node app/deploy/devnet/tests/33_tx_details.ts

import { Connection } from "@solana/web3.js";
import { RPC_NODE } from "./devnet_consts";
import { RPC_NODE } from "../constants";
import {
getProgramTransactions,
printTransactionDetails,
} from "../utils/parse_transactions";
} from "../../../helpers/utils/parse_transactions";

async function main() {
const connection = new Connection(RPC_NODE, "confirmed");
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
// Usage: npx ts-node app/deploy/bridge-script.ts
// Usage: npx ts-node app/deploy/devnet/tests/bridge-script.ts

import {
EthCallData,
@@ -7,25 +7,22 @@ import {
QueryRequest,
signaturesToEvmStruct,
QueryResponse,
QueryProxyQueryResponse,
signaturesToSolanaArray,
} from "@wormhole-foundation/wormhole-query-sdk";
import axios from "axios";
import { ethers } from "ethers";
import select from "@inquirer/select";
import input from "@inquirer/input";
import "dotenv/config";

import { Keypair } from "@solana/web3.js";
import { Connection } from "@solana/web3.js";
import {
CORE_BRIDGE_ADDRESS,
HUB_CHAIN_ID,
CORE_BRIDGE_PID,
HUB_PROPOSAL_METADATA_ADDRESS,
RPC_NODE,
} from "../constants";
import { RPC_NODE } from "./devnet_consts";
import { getWormholeBridgeData } from "../helpers/wormholeBridgeConfig";
import { deriveGuardianSetKey } from "../helpers/guardianSet";
import { getWormholeBridgeData } from "../../../helpers/wormholeBridgeConfig";
import { deriveGuardianSetKey } from "../../../helpers/guardianSet";

const API_KEY = process.env.WORMHOLE_API_KEY as string;

@@ -76,11 +73,11 @@ const scripts: {

const connection = new Connection(RPC_NODE);

const info = await getWormholeBridgeData(connection, CORE_BRIDGE_ADDRESS);
const info = await getWormholeBridgeData(connection, CORE_BRIDGE_PID);
let guardianSetIndex = info.guardianSetIndex;

const guardianSet = deriveGuardianSetKey(
CORE_BRIDGE_ADDRESS,
CORE_BRIDGE_PID,
guardianSetIndex,
);

Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
// Usage: npx ts-node app/deploy/new_wallet.ts
// Usage: npx ts-node app/deploy/devnet/tests/new_wallet.ts

import { Keypair } from '@solana/web3.js';
import fs from 'fs';
Original file line number Diff line number Diff line change
@@ -1,16 +1,18 @@
import * as anchor from "@coral-xyz/anchor";
import { AnchorProvider, Program, Wallet } from "@coral-xyz/anchor";
import {
AccountMeta,
Connection,
PublicKey,
SystemProgram,
} from "@solana/web3.js";
import { DEPLOYER_AUTHORITY_KEYPAIR, RPC_NODE } from "./devnet_consts";
import { Staking } from "../../target/types/staking";
import {
CORE_BRIDGE_PID,
DEPLOYER_AUTHORITY_KEYPAIR,
RPC_NODE
} from "../constants";
import { Staking } from "../../../../target/types/staking";
import fs from "fs";
import BN from "bn.js";
import { CORE_BRIDGE_PID } from "../../tests/executor";
import {
hubSolanaMessageDispatcherPublicKey,
HUB_CHAIN_ID,
Original file line number Diff line number Diff line change
@@ -1,4 +1,3 @@
import * as anchor from "@coral-xyz/anchor";
import { AnchorProvider, Wallet } from "@coral-xyz/anchor";
import { PublicKey, Connection, Transaction } from "@solana/web3.js";
import {
@@ -7,7 +6,7 @@ import {
USER2_AUTHORITY_KEYPAIR,
WORMHOLE_TOKEN,
RPC_NODE,
} from "./devnet_consts";
} from "../constants";
import {
createTransferInstruction,
getAssociatedTokenAddressSync,
Original file line number Diff line number Diff line change
@@ -1,15 +1,13 @@
// Usage: npx ts-node app/deploy/022_updateGovernanceAuthority.ts
// Usage: npx ts-node app/deploy/devnet/update/updateGovernanceAuthority.ts

import * as anchor from "@coral-xyz/anchor";
import { AnchorProvider, Program, Wallet } from "@coral-xyz/anchor";
import { Connection } from "@solana/web3.js";
import { DEPLOYER_AUTHORITY_KEYPAIR, GOVERNANCE_AUTHORITY_KEYPAIR, RPC_NODE } from "./devnet_consts";
import { Staking } from "../../target/types/staking";
import { DEPLOYER_AUTHORITY_KEYPAIR, GOVERNANCE_AUTHORITY_KEYPAIR, RPC_NODE } from "../constants";
import { Staking } from "../../../../target/types/staking";
import fs from "fs";

async function main() {
try {
const DEBUG = true;
const connection = new Connection(RPC_NODE);
const provider = new AnchorProvider(
connection,
Original file line number Diff line number Diff line change
@@ -1,16 +1,17 @@
// Usage: npx ts-node app/deploy/021_updateHubProposalMetadata.ts
// Usage: npx ts-node app/deploy/devnet/update/updateHubProposalMetadata.ts

import * as anchor from "@coral-xyz/anchor";
import { AnchorProvider, Program, Wallet } from "@coral-xyz/anchor";
import { Connection, PublicKey, SystemProgram } from "@solana/web3.js";
import { hubProposalMetadataUint8Array } from "../constants";
import { DEPLOYER_AUTHORITY_KEYPAIR, RPC_NODE } from "./devnet_consts";
import { Staking } from "../../target/types/staking";
import { Connection, PublicKey } from "@solana/web3.js";
import {
DEPLOYER_AUTHORITY_KEYPAIR,
hubProposalMetadataUint8Array,
RPC_NODE,
} from "../constants";
import { Staking } from "../../../../target/types/staking";
import fs from "fs";

async function main() {
try {
const DEBUG = true;
const connection = new Connection(RPC_NODE);
const provider = new AnchorProvider(
connection,
Original file line number Diff line number Diff line change
@@ -1,10 +1,13 @@
// Usage: npx ts-node app/deploy/023_updateVestingAdmin.ts
// Usage: npx ts-node app/deploy/devnet/update/updateVestingAdmin.ts

import * as anchor from "@coral-xyz/anchor";
import { AnchorProvider, Program, Wallet } from "@coral-xyz/anchor";
import { Connection } from "@solana/web3.js";
import { DEPLOYER_AUTHORITY_KEYPAIR, VESTING_ADMIN_KEYPAIR, RPC_NODE } from "./devnet_consts";
import { Staking } from "../../target/types/staking";
import {
DEPLOYER_AUTHORITY_KEYPAIR,
RPC_NODE,
VESTING_ADMIN_KEYPAIR,
} from "../constants";
import { Staking } from "../../../../target/types/staking";
import fs from "fs";

async function main() {
Original file line number Diff line number Diff line change
@@ -1,28 +1,23 @@
// Usage: npx ts-node app/deploy/073_claimVesting.ts
// Usage: npx ts-node app/deploy/devnet/vesting/claimVesting.ts

import { Wallet, AnchorProvider } from "@coral-xyz/anchor";
import {
Connection,
PublicKey,
SystemProgram,
Transaction,
} from "@solana/web3.js";
import {
VESTING_ADMIN_KEYPAIR,
USER_AUTHORITY_KEYPAIR,
WORMHOLE_TOKEN,
RPC_NODE,
} from "./devnet_consts";
import { STAKING_ADDRESS } from "../constants";
import { StakeConnection } from "../StakeConnection";
import { WHTokenBalance } from "../whTokenBalance";
} from "../constants";
import { StakeConnection } from "../../../StakeConnection";
import BN from "bn.js";
import { randomBytes } from "crypto";
import * as wasm from "@wormhole/staking-wasm";
import {
ASSOCIATED_TOKEN_PROGRAM_ID,
TOKEN_PROGRAM_ID,
createTransferCheckedInstruction,
getAssociatedTokenAddressSync,
} from "@solana/spl-token";

@@ -35,7 +30,6 @@ async function main() {
const vesterStakeConnection = await StakeConnection.createStakeConnection(
connection,
vesterProvider.wallet as Wallet,
STAKING_ADDRESS,
);

const confirm = async (signature: string): Promise<string> => {
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
// Usage: npx ts-node app/deploy/071_createVestingConfig.ts
// Usage: npx ts-node app/deploy/devnet/vesting/createVestingConfig.ts

import { Wallet, AnchorProvider } from "@coral-xyz/anchor";
import {
@@ -12,10 +12,8 @@ import {
USER_AUTHORITY_KEYPAIR,
WORMHOLE_TOKEN,
RPC_NODE,
} from "./devnet_consts";
import { STAKING_ADDRESS } from "../constants";
import { StakeConnection } from "../StakeConnection";
import { WHTokenBalance } from "../whTokenBalance";
} from "../constants";
import { StakeConnection } from "../../../StakeConnection";
import BN from "bn.js";
import { randomBytes } from "crypto";
import * as wasm from "@wormhole/staking-wasm";
@@ -36,7 +34,6 @@ async function main() {
const stakeConnection = await StakeConnection.createStakeConnection(
connection,
provider.wallet as Wallet,
STAKING_ADDRESS,
);

const confirm = async (signature: string): Promise<string> => {
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
// Usage: npx ts-node app/deploy/072_delegateWithVest.ts
// Usage: npx ts-node app/deploy/devnet/vesting/delegateWithVest.ts

import { Wallet, AnchorProvider } from "@coral-xyz/anchor";
import {
@@ -8,10 +8,9 @@ import {
import {
USER_AUTHORITY_KEYPAIR,
RPC_NODE,
} from "./devnet_consts";
import { STAKING_ADDRESS } from "../constants";
import { StakeConnection } from "../StakeConnection";
import { WHTokenBalance } from "../whTokenBalance";
} from "../constants";
import { StakeConnection } from "../../../StakeConnection";
import { WHTokenBalance } from "../../../whTokenBalance";

async function main() {
const vester = USER_AUTHORITY_KEYPAIR;
@@ -21,7 +20,6 @@ async function main() {
const vesterStakeConnection = await StakeConnection.createStakeConnection(
connection,
vesterProvider.wallet as Wallet,
STAKING_ADDRESS,
);

const config = new PublicKey(
40 changes: 0 additions & 40 deletions solana/app/deploy/devnet_consts.ts

This file was deleted.

File renamed without changes.
10 changes: 4 additions & 6 deletions solana/app/e2e/01_createProposeWithSolanaExecution.ts
Original file line number Diff line number Diff line change
@@ -3,11 +3,6 @@
import { ethers } from "ethers";
import * as fs from "fs";
import "dotenv/config";
import {
HUB_SOLANA_MESSAGE_DISPATCHER_ADDRESS,
HUB_GOVERNOR_ADDRESS,
HUB_CHAIN_ID,
} from "../constants";
import { Connection } from "@solana/web3.js";
import { AnchorProvider, Program, Wallet } from "@coral-xyz/anchor";
import { ExternalProgram } from "./external_program/idl/external_program";
@@ -16,7 +11,10 @@ import {
DEPLOYER_AUTHORITY_KEYPAIR,
RPC_NODE,
AIRLOCK_PDA_ADDRESS,
} from "../deploy/devnet_consts";
HUB_SOLANA_MESSAGE_DISPATCHER_ADDRESS,
HUB_GOVERNOR_ADDRESS,
HUB_CHAIN_ID,
} from "../deploy/devnet/constants";
import { v4 as uuidv4 } from "uuid";

// Define the ABI types
19 changes: 9 additions & 10 deletions solana/app/e2e/02_addProposal.ts
Original file line number Diff line number Diff line change
@@ -14,14 +14,14 @@ import "dotenv/config";
import {
HUB_CHAIN_ID,
HUB_PROPOSAL_METADATA_ADDRESS,
STAKING_ADDRESS,
CORE_BRIDGE_ADDRESS,
} from "../constants";
import * as anchor from "@coral-xyz/anchor";
CORE_BRIDGE_PID,
DEPLOYER_AUTHORITY_KEYPAIR,
RPC_NODE,
} from "../deploy/devnet/constants";

import { AnchorProvider, Wallet } from "@coral-xyz/anchor";
import { Connection, Keypair } from "@solana/web3.js";
import { Connection } from "@solana/web3.js";
import { StakeConnection } from "../StakeConnection";
import { DEPLOYER_AUTHORITY_KEYPAIR, RPC_NODE } from "../deploy/devnet_consts";
import { getWormholeBridgeData } from "../helpers/wormholeBridgeConfig";
import * as fs from "fs";

@@ -118,7 +118,7 @@ async function getProposalMetadata(
data: encodeCalldata(encodedSignature, encodedParameters),
};

const latestFinalizedBlock = await getLatestFinalizedBlock(rpcUrl);
const latestFinalizedBlock = await getLatestFinalizedBlock(rpcUrl!);
console.log(
"latestFinalizedBlock:",
parseInt(latestFinalizedBlock.toString(), 16),
@@ -154,7 +154,6 @@ async function addProposal() {
const stakeConnection = await StakeConnection.createStakeConnection(
connection,
provider.wallet as Wallet,
STAKING_ADDRESS,
);

const proposalId = await input({ message: "Enter the proposal id:" });
@@ -169,7 +168,7 @@ async function addProposal() {

while (true) {
const latestFinalizedBlockInt = parseInt(
(await getLatestFinalizedBlock(rpcUrl)).toString(),
(await getLatestFinalizedBlock(rpcUrl!)).toString(),
16,
);
console.log("Latest finalized block:", latestFinalizedBlockInt);
@@ -203,7 +202,7 @@ async function addProposal() {
sepoliaEthProposalResponse.signatures,
);

const info = await getWormholeBridgeData(connection, CORE_BRIDGE_ADDRESS);
const info = await getWormholeBridgeData(connection, CORE_BRIDGE_PID);
const guardianSetIndex = info.guardianSetIndex;

await stakeConnection.addProposal(
9 changes: 4 additions & 5 deletions solana/app/e2e/03_castVote.ts
Original file line number Diff line number Diff line change
@@ -1,12 +1,12 @@
// Usage: npx ts-node app/e2e/03_castVote.ts

import * as anchor from "@coral-xyz/anchor";
import { AnchorProvider, Wallet } from "@coral-xyz/anchor";
import { Connection } from "@solana/web3.js";
import { StakeConnection } from "../StakeConnection";
import { STAKING_ADDRESS } from "../constants";
import { USER2_AUTHORITY_KEYPAIR, RPC_NODE } from "../deploy/devnet_consts";
import BN from "bn.js";
import {
USER2_AUTHORITY_KEYPAIR,
RPC_NODE,
} from "../deploy/devnet/constants";
import { WHTokenBalance } from "../whTokenBalance";
import input from "@inquirer/input";

@@ -27,7 +27,6 @@ async function castVote() {
const user2StakeConnection = await StakeConnection.createStakeConnection(
connection,
user2Provider.wallet as Wallet,
STAKING_ADDRESS,
);

await user2StakeConnection.castVote(
7 changes: 3 additions & 4 deletions solana/app/e2e/04_crossChainVoteSolana.ts
Original file line number Diff line number Diff line change
@@ -3,15 +3,13 @@
import { ethers } from "ethers";
import * as fs from "fs";
import "dotenv/config";
import { PublicKey } from "@solana/web3.js";
import axios from "axios";
import {
PerChainQueryRequest,
QueryProxyQueryResponse,
QueryRequest,
QueryResponse,
SolanaPdaQueryRequest,
SolanaPdaQueryResponse,
signaturesToEvmStruct,
} from "@wormhole-foundation/wormhole-query-sdk";
import {
@@ -20,7 +18,7 @@ import {
HUB_SOLANA_SPOKE_VOTE_DECODER_ADDRESS,
HUB_VOTE_POOL_ADDRESS,
HUB_CHAIN_ID,
} from "../constants";
} from "../deploy/devnet/constants";
import * as wasm from "@wormhole/staking-wasm";
import input from "@inquirer/input";

@@ -76,7 +74,8 @@ async function getSolanaQueryResponse(): Promise<{
).data;
// console.log("queryResponse: ", queryResponse);

// const queryResponseHex = QueryResponse.from(Buffer.from(queryResponse.bytes, "hex"));
const queryResponseHex = QueryResponse.from(Buffer.from(queryResponse.bytes, "hex"));
console.log("queryResponseHex: ", queryResponseHex);

const bytes = "0x" + queryResponse["bytes"];
const signatures = queryResponse["signatures"];
3 changes: 1 addition & 2 deletions solana/app/e2e/05_proposalQueue.ts
Original file line number Diff line number Diff line change
@@ -3,12 +3,11 @@
import { ethers } from "ethers";
import * as fs from "fs";
import "dotenv/config";
import { signaturesToEvmStruct } from "@wormhole-foundation/wormhole-query-sdk";
import {
HUB_SOLANA_MESSAGE_DISPATCHER_ADDRESS,
HUB_GOVERNOR_ADDRESS,
HUB_CHAIN_ID,
} from "../constants";
} from "../deploy/devnet/constants";
import input from "@inquirer/input";

const HubGovernorAbiPath = "./app/e2e/abi/HubGovernor.json";
3 changes: 1 addition & 2 deletions solana/app/e2e/06_proposalExecute.ts
Original file line number Diff line number Diff line change
@@ -3,12 +3,11 @@
import { ethers } from "ethers";
import * as fs from "fs";
import "dotenv/config";
import { signaturesToEvmStruct } from "@wormhole-foundation/wormhole-query-sdk";
import {
HUB_SOLANA_MESSAGE_DISPATCHER_ADDRESS,
HUB_GOVERNOR_ADDRESS,
HUB_CHAIN_ID,
} from "../constants";
} from "../deploy/devnet/constants";
import input from "@inquirer/input";

const HubGovernorAbiPath = "./app/e2e/abi/HubGovernor.json";
3 changes: 1 addition & 2 deletions solana/app/e2e/external_program/initializeConfigPDA.ts
Original file line number Diff line number Diff line change
@@ -1,11 +1,10 @@
import * as anchor from "@coral-xyz/anchor";
import { AnchorProvider, Program, Wallet } from "@coral-xyz/anchor";
import { Connection, PublicKey, SystemProgram } from "@solana/web3.js";
import {
USER2_AUTHORITY_KEYPAIR,
RPC_NODE,
AIRLOCK_PDA_ADDRESS,
} from "../../deploy/devnet_consts";
} from "../../deploy/devnet/constants";
import { ExternalProgram } from "./idl/external_program";
import externalProgramIdl from "./idl/external_program.json";

62 changes: 62 additions & 0 deletions solana/app/helpers/utils/lookup_table.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,62 @@
import {
TOKEN_PROGRAM_ID,
} from "@solana/spl-token";
import {
PublicKey,
SystemProgram,
AddressLookupTableProgram,
ComputeBudgetProgram,
SYSVAR_RENT_PUBKEY,
VersionedTransaction,
TransactionMessage,
} from "@solana/web3.js";
import * as anchor from "@coral-xyz/anchor";
import * as wasm from "@wormhole/staking-wasm";

function getConfigAccount(programId: PublicKey): PublicKey {
return PublicKey.findProgramAddressSync(
[anchor.utils.bytes.utf8.encode(wasm.Constants.CONFIG_SEED())],
programId,
)[0];
}

export async function initAddressLookupTable(
provider: anchor.AnchorProvider,
mint: PublicKey,
stakingPID: PublicKey,
) {
const configAccount = getConfigAccount(stakingPID);

const [loookupTableInstruction, lookupTableAddress] =
AddressLookupTableProgram.createLookupTable({
authority: provider.publicKey,
payer: provider.publicKey,
recentSlot: await provider.connection.getSlot(),
});
const extendInstruction = AddressLookupTableProgram.extendLookupTable({
payer: provider.publicKey,
authority: provider.publicKey,
lookupTable: lookupTableAddress,
addresses: [
ComputeBudgetProgram.programId,
SystemProgram.programId,
stakingPID,
mint,
configAccount,
SYSVAR_RENT_PUBKEY,
TOKEN_PROGRAM_ID,
],
});
const createLookupTableTx = new VersionedTransaction(
new TransactionMessage({
instructions: [loookupTableInstruction, extendInstruction],
payerKey: provider.publicKey,
recentBlockhash: (await provider.connection.getLatestBlockhash())
.blockhash,
}).compileToV0Message(),
);
await provider.sendAndConfirm(createLookupTableTx, [], {
skipPreflight: true,
});
return lookupTableAddress;
}
File renamed without changes.
1 change: 0 additions & 1 deletion solana/app/index.ts
Original file line number Diff line number Diff line change
@@ -1,3 +1,2 @@
export { StakeAccount, StakeConnection } from "./StakeConnection";
export * from "./constants";
export { WH_TOKEN_DECIMALS, WHTokenBalance } from "./whTokenBalance";
2 changes: 1 addition & 1 deletion solana/tests/api_test.ts
Original file line number Diff line number Diff line change
@@ -29,8 +29,8 @@ import {
import {
StakeConnection,
WHTokenBalance,
TEST_CHECKPOINTS_ACCOUNT_LIMIT,
} from "../app";
import { TEST_CHECKPOINTS_ACCOUNT_LIMIT } from "./utils/constants";
import { CheckpointAccount } from "../app/checkpoints";
import crypto from "crypto";
import {
16 changes: 7 additions & 9 deletions solana/tests/config.ts
Original file line number Diff line number Diff line change
@@ -12,16 +12,16 @@ import BN from "bn.js";
import path from "path";
import {
StakeConnection,
TEST_CHECKPOINTS_ACCOUNT_LIMIT,
WH_TOKEN_DECIMALS,
WHTokenBalance,
WH_TOKEN_DECIMALS,
} from "../app";
import {
CORE_BRIDGE_ADDRESS,
CORE_BRIDGE_PID,
HUB_CHAIN_ID,
hubProposalMetadataUint8Array,
} from "../app/constants";
import { StakeAccountMetadata } from "../app/StakeConnection.ts";
TEST_CHECKPOINTS_ACCOUNT_LIMIT,
} from "./utils/constants";
import { StakeAccountMetadata } from "../app/StakeConnection";
import {
readWindowLengths,
WindowLengthsAccount,
@@ -234,7 +234,7 @@ describe("config", async () => {
);
assert.equal(
spokeMetadataCollectorAccountData.wormholeCore.toString("hex"),
CORE_BRIDGE_ADDRESS.toString("hex"),
CORE_BRIDGE_PID.toString("hex"),
);
});

@@ -344,7 +344,7 @@ describe("config", async () => {
);
assert.equal(
spokeMetadataCollectorAccountData.wormholeCore.toString("hex"),
CORE_BRIDGE_ADDRESS.toString("hex"),
CORE_BRIDGE_PID.toString("hex"),
);
});

@@ -434,7 +434,6 @@ describe("config", async () => {
const samConnection = await StakeConnection.createStakeConnection(
program.provider.connection,
new Wallet(sam),
program.programId,
);

await samConnection.program.provider.connection.requestAirdrop(
@@ -467,7 +466,6 @@ describe("config", async () => {
const vestingAdminConnection = await StakeConnection.createStakeConnection(
program.provider.connection,
new Wallet(vestingAdminKeypair),
program.programId,
);

await vestingAdminConnection.program.provider.connection.requestAirdrop(
13 changes: 4 additions & 9 deletions solana/tests/executor.ts
Original file line number Diff line number Diff line change
@@ -26,29 +26,24 @@ import { mocks } from "@wormhole-foundation/sdk-definitions/testing";
import {
SolanaWormholeCore,
utils as coreUtils,
derivePostedVaaKey,
} from "@wormhole-foundation/sdk-solana-core";
import { SolanaSendSigner } from "@wormhole-foundation/sdk-solana";
import { signAndSendWait } from "@wormhole-foundation/sdk-connect";
import { Chain, contracts } from "@wormhole-foundation/sdk-base";
import { Chain } from "@wormhole-foundation/sdk-base";
import { AnchorError, Program, utils } from "@coral-xyz/anchor";
import { ExternalProgram } from "./artifacts/external_program.ts";
import { ExternalProgram } from "./artifacts/external_program";
import externalProgramIdl from "./artifacts/external_program.json";
import BN from "bn.js";
import * as wasm from "@wormhole/staking-wasm";
import {
readWindowLengths,
WindowLengthsAccount,
} from "../app/vote_weight_window_lengths.ts";
} from "../app/vote_weight_window_lengths";
import { CORE_BRIDGE_PID } from "./utils/constants";

// Define the port number for the test
const portNumber = getPortNumber(path.basename(__filename));

// Constants
export const CORE_BRIDGE_PID = new PublicKey(
contracts.coreBridge.get("Testnet", "Solana")!,
);

export const GUARDIAN_KEY =
"cfb12303a19cde580bb4dd771639b0d26bc68353645571a8cff516ab2ee113a0";
export const MOCK_GUARDIANS = new mocks.MockGuardians(0, [GUARDIAN_KEY]);
13 changes: 9 additions & 4 deletions solana/tests/utils/api_utils.ts
Original file line number Diff line number Diff line change
@@ -1,10 +1,10 @@
import { StakeAccount, StakeConnection } from "../../app/StakeConnection";
import { StakeConnection } from "../../app/StakeConnection";
import { PublicKey } from "@solana/web3.js";
import { WHTokenBalance } from "../../app";
import {
HUB_CHAIN_ID,
HUB_PROPOSAL_METADATA_ADDRESS,
} from "../../app/constants";
} from "./constants";
import assert from "assert";
import {
QueryRequest,
@@ -42,8 +42,13 @@ export async function assertBalanceMatches(
owner: PublicKey,
expected: WHTokenBalance,
) {
const stakeAccountCheckpointsAddress =
await stakeConnection.getStakeAccountCheckpointsAddress(owner);
let stakeAccountMetadataAddress =
await stakeConnection.getStakeMetadataAddress(owner);
let stakeAccountCheckpointsAddress =
await stakeConnection.getStakeAccountCheckpointsAddressByMetadata(
stakeAccountMetadataAddress,
false,
);
let stakeAccount = await stakeConnection.loadStakeAccount(
stakeAccountCheckpointsAddress,
);
15 changes: 8 additions & 7 deletions solana/tests/utils/before.ts
Original file line number Diff line number Diff line change
@@ -26,16 +26,17 @@ import {
StakeConnection,
WHTokenBalance,
WH_TOKEN_DECIMALS,
CHECKPOINTS_ACCOUNT_LIMIT,
TEST_CHECKPOINTS_ACCOUNT_LIMIT,
} from "../../app";
import { GlobalConfig } from "../../app/StakeConnection";
import { createMint, initAddressLookupTable } from "./utils";
import { createMint } from "./utils";
import { initAddressLookupTable } from "../../app/helpers/utils/lookup_table";
import { loadKeypair } from "./keys";
import {
HUB_CHAIN_ID,
hubProposalMetadataUint8Array,
} from "../../app/constants";
CHECKPOINTS_ACCOUNT_LIMIT,
TEST_CHECKPOINTS_ACCOUNT_LIMIT,
} from "./constants";

export const ANCHOR_CONFIG_PATH = "./Anchor.toml";
export interface AnchorConfig {
@@ -343,7 +344,6 @@ export async function newUserStakeConnection(
const userStakeConnection = await StakeConnection.createStakeConnection(
connection,
provider.wallet as Wallet,
new PublicKey(config.programs.localnet.staking),
);

await transferSolFromValidatorWallet(
@@ -438,8 +438,9 @@ export async function standardSetup(
const lookupTableAddress = await initAddressLookupTable(
provider,
whMintAccount.publicKey,
program.programId,
);
// console.log("Lookup table address: ", lookupTableAddress.toBase58());
// console.log("Lookup table address: ", lookupTableAddress.toBase58());

await program.methods
.initializeSpokeMetadataCollector(
@@ -475,7 +476,7 @@ export async function standardSetup(
const stakeConnection = await StakeConnection.createStakeConnection(
connection,
provider.wallet as Wallet,
new PublicKey(config.programs.localnet.staking),
lookupTableAddress,
);

return { controller, stakeConnection };
22 changes: 22 additions & 0 deletions solana/tests/utils/constants.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
import { contracts } from "@wormhole-foundation/sdk-base";
import { PublicKey } from "@solana/web3.js";

/// Wormhole Hub Proposal Metadata Contract (sepolia ethereum address)
export const HUB_PROPOSAL_METADATA_ADDRESS =
"0x1a3e5624769c3dc9106347a239523e4a08d85c38";
export const hubProposalMetadataUint8Array = new Uint8Array(
HUB_PROPOSAL_METADATA_ADDRESS.slice(2)
.toLowerCase()
.match(/.{1,2}/g)
?.map((byte) => parseInt(byte, 16)),
);

/// Wormhole Hub Chain ID
export const HUB_CHAIN_ID = 10002; // SEPOLIA

export const CHECKPOINTS_ACCOUNT_LIMIT = 654998;
export const TEST_CHECKPOINTS_ACCOUNT_LIMIT = 15;

export const CORE_BRIDGE_PID = new PublicKey(
contracts.coreBridge.get("Testnet", "Solana")!, // 3u8hJUVTA4jH1wYAyUur7FFZVQ8H635K3tSHHF4ssjQ5
);
55 changes: 0 additions & 55 deletions solana/tests/utils/utils.ts
Original file line number Diff line number Diff line change
@@ -9,25 +9,10 @@ import {
Keypair,
Transaction,
SystemProgram,
AddressLookupTableProgram,
ComputeBudgetProgram,
SYSVAR_RENT_PUBKEY,
VersionedTransaction,
TransactionMessage,
} from "@solana/web3.js";
import * as anchor from "@coral-xyz/anchor";
import { AnchorError } from "@coral-xyz/anchor";
import assert from "assert";
import * as wasm from "@wormhole/staking-wasm";
import { Staking } from "../../target/types/staking";
import { STAKING_ADDRESS } from "../../app";

export function getConfigAccount(programId: PublicKey): PublicKey {
return PublicKey.findProgramAddressSync(
[anchor.utils.bytes.utf8.encode(wasm.Constants.CONFIG_SEED())],
programId,
)[0];
}

/**
* Creates new spl-token at a random keypair
@@ -71,46 +56,6 @@ export async function createMint(
});
}

export async function initAddressLookupTable(
provider: anchor.AnchorProvider,
mint: PublicKey,
) {
const configAccount = getConfigAccount(STAKING_ADDRESS);

const [loookupTableInstruction, lookupTableAddress] =
AddressLookupTableProgram.createLookupTable({
authority: provider.publicKey,
payer: provider.publicKey,
recentSlot: await provider.connection.getSlot(),
});
const extendInstruction = AddressLookupTableProgram.extendLookupTable({
payer: provider.publicKey,
authority: provider.publicKey,
lookupTable: lookupTableAddress,
addresses: [
ComputeBudgetProgram.programId,
SystemProgram.programId,
STAKING_ADDRESS,
mint,
configAccount,
SYSVAR_RENT_PUBKEY,
TOKEN_PROGRAM_ID,
],
});
const createLookupTableTx = new VersionedTransaction(
new TransactionMessage({
instructions: [loookupTableInstruction, extendInstruction],
payerKey: provider.publicKey,
recentBlockhash: (await provider.connection.getLatestBlockhash())
.blockhash,
}).compileToV0Message(),
);
await provider.sendAndConfirm(createLookupTableTx, [], {
skipPreflight: true,
});
return lookupTableAddress;
}

/**
* Sends the rpc call and check whether the error message matches the provided string
* @param rpcCall : anchor rpc call
1 change: 0 additions & 1 deletion solana/tests/vesting.ts
Original file line number Diff line number Diff line change
@@ -385,7 +385,6 @@ describe("vesting", () => {
],
stakeConnection.program.programId,
)[0];

vestingBalanceWithoutAccount = PublicKey.findProgramAddressSync(
[
Buffer.from(wasm.Constants.VESTING_BALANCE_SEED()),
2 changes: 0 additions & 2 deletions solana/tests/voter_votes_test.ts
Original file line number Diff line number Diff line change
@@ -4,13 +4,11 @@ import {
getPortNumber,
makeDefaultConfig,
readAnchorConfig,
requestWHTokenAirdrop,
standardSetup,
} from "./utils/before";
import path from "path";
import { Keypair, PublicKey } from "@solana/web3.js";
import { StakeConnection, WHTokenBalance } from "../app";
import { BN, Wallet } from "@coral-xyz/anchor";
import assert from "assert";

const portNumber = getPortNumber(path.basename(__filename));