Skip to content

Commit 4c82ea1

Browse files
authored
[solana] Scripts to update parameters and vesting tests (#253)
* Rename solana devnet test scripts * Update Program ID * Add GovernanceAuthority update script * Add config.vesting_admin update script * Add script for fetch GlobalConfig * Add script for fetch SpokeMetadataCollector * Add script for fetch VoteWeightWindowLengths * Add script for fetch SpokeMessageExecutor * Update scripts for vesting tests * Reorganization of scripts, constants, and folders. Remove unnecessary code * Update devnet test scripts for vesting. Add transferVesting script * Apply yarn format * Add scripts for initialize staking program in mainnet
1 parent f89a0b6 commit 4c82ea1

File tree

75 files changed

+1664
-483
lines changed

Some content is hidden

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

75 files changed

+1664
-483
lines changed

solana/.gitignore

+2
Original file line numberDiff line numberDiff line change
@@ -9,3 +9,5 @@ snapshots
99
/artifacts
1010
package-lock.json
1111
yarn.lock
12+
/app/e2e/log/*.json
13+
app/keypairs/deployer.json

solana/Anchor.toml

+2-2
Original file line numberDiff line numberDiff line change
@@ -7,10 +7,10 @@ seeds = true
77
members = ["programs/staking"]
88

99
[programs.localnet]
10-
staking = "DgCSKsLDXXufYeEkvf21YSX5DMnFK89xans5WdSsUbeY"
10+
staking = "AFuHPdrQGsW8rNQ4oEFF35sm5fg36gwrxyqjkjKvi6ap"
1111

1212
[programs.devnet]
13-
staking = "DgCSKsLDXXufYeEkvf21YSX5DMnFK89xans5WdSsUbeY"
13+
staking = "AFuHPdrQGsW8rNQ4oEFF35sm5fg36gwrxyqjkjKvi6ap"
1414
external_program = "eLUV8cwhgUC2Bcu4UA16uhuMwK8zPkx3XSzt4hd3JJ3"
1515

1616
[registry]

solana/app/StakeConnection.ts

+10-13
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ import BN from "bn.js";
2525
import { Staking } from "../target/types/staking";
2626
import IDL from "../target/idl/staking.json";
2727
import { WHTokenBalance } from "./whTokenBalance";
28-
import { CORE_BRIDGE_ADDRESS, STAKING_ADDRESS } from "./constants";
28+
import { contracts } from "@wormhole-foundation/sdk-base";
2929
import {
3030
PriorityFeeConfig,
3131
sendTransactions,
@@ -89,11 +89,7 @@ export class StakeConnection {
8989
connection: Connection,
9090
wallet: Wallet,
9191
): Promise<StakeConnection> {
92-
return await StakeConnection.createStakeConnection(
93-
connection,
94-
wallet,
95-
STAKING_ADDRESS,
96-
);
92+
return await StakeConnection.createStakeConnection(connection, wallet);
9793
}
9894

9995
/** Creates a program connection and loads the staking config
@@ -102,7 +98,6 @@ export class StakeConnection {
10298
public static async createStakeConnection(
10399
connection: Connection,
104100
wallet: Wallet,
105-
stakingProgramAddress: PublicKey,
106101
addressLookupTable?: PublicKey,
107102
priorityFeeConfig?: PriorityFeeConfig,
108103
): Promise<StakeConnection> {
@@ -386,7 +381,6 @@ export class StakeConnection {
386381
/** Creates a new stake account and sends the transaction for confirmation. */
387382
public async createStakeAccount(): Promise<void> {
388383
const instructions: TransactionInstruction[] = [];
389-
390384
instructions.push(
391385
await this.program.methods
392386
.createStakeAccount()
@@ -395,6 +389,7 @@ export class StakeConnection {
395389
})
396390
.instruction(),
397391
);
392+
398393
await this.sendAndConfirmAsVersionedTransaction(instructions);
399394
}
400395

@@ -754,7 +749,12 @@ export class StakeConnection {
754749
unoptimized?: boolean,
755750
): Promise<void> {
756751
const { proposalAccount } = await this.fetchProposalAccount(proposalId);
757-
752+
const networkType = this.provider.connection.rpcEndpoint.includes("mainnet")
753+
? "Mainnet"
754+
: "Testnet";
755+
const coreBridge = new PublicKey(
756+
contracts.coreBridge.get(networkType, "Solana"), // Testnet - 3u8hJUVTA4jH1wYAyUur7FFZVQ8H635K3tSHHF4ssjQ5
757+
);
758758
const methodsBuilder = this.program.methods
759759
.addProposal(
760760
Buffer.from(ethProposalResponseBytes),
@@ -764,10 +764,7 @@ export class StakeConnection {
764764
.accountsPartial({
765765
proposal: proposalAccount,
766766
guardianSignatures: guardianSignatures,
767-
guardianSet: deriveGuardianSetKey(
768-
CORE_BRIDGE_ADDRESS,
769-
guardianSetIndex,
770-
),
767+
guardianSet: deriveGuardianSetKey(coreBridge, guardianSetIndex),
771768
});
772769

773770
if (unoptimized) {

solana/app/deploy/devnet.ts

-28
This file was deleted.

solana/app/constants.ts solana/app/deploy/devnet/constants.ts

+47-3
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,21 @@
11
import { PublicKey } from "@solana/web3.js";
2+
import { homedir } from "os";
3+
import { loadKeypair } from "../../../tests/utils/keys";
4+
import { contracts } from "@wormhole-foundation/sdk-base";
5+
6+
export const RPC_NODE = "https://api.devnet.solana.com";
7+
8+
/// Wormhole Token (W) (devnet solana address)
9+
export const WORMHOLE_TOKEN = new PublicKey(
10+
"Exne2kdeGToBnC2WVSdt1gLy6fjnNftbPtsCPx8AuL7V",
11+
);
212

313
export const STAKING_ADDRESS = new PublicKey(
4-
"DgCSKsLDXXufYeEkvf21YSX5DMnFK89xans5WdSsUbeY",
14+
"AFuHPdrQGsW8rNQ4oEFF35sm5fg36gwrxyqjkjKvi6ap",
515
);
616

7-
export const CORE_BRIDGE_ADDRESS = new PublicKey(
8-
"3u8hJUVTA4jH1wYAyUur7FFZVQ8H635K3tSHHF4ssjQ5",
17+
export const CORE_BRIDGE_PID = new PublicKey(
18+
contracts.coreBridge.get("Testnet", "Solana")!, // 3u8hJUVTA4jH1wYAyUur7FFZVQ8H635K3tSHHF4ssjQ5
919
);
1020

1121
/// Wormhole Hub Proposal Metadata Contract (sepolia ethereum address)
@@ -19,11 +29,13 @@ export const hubProposalMetadataUint8Array = new Uint8Array(
1929
);
2030

2131
/// Wormhole Hub Chain ID
32+
// https://wormhole.com/docs/build/reference/chain-ids/#__tabbed_1_2
2233
export const HUB_CHAIN_ID = 10002; // SEPOLIA
2334

2435
export const CHECKPOINTS_ACCOUNT_LIMIT = 654998;
2536
export const TEST_CHECKPOINTS_ACCOUNT_LIMIT = 15;
2637

38+
/// Wormhole hubSolanaMessageDispatcher Contract (sepolia ethereum address)
2739
export const HUB_SOLANA_MESSAGE_DISPATCHER_ADDRESS =
2840
"0xaeb78fb7ddedbbcab908e91e94f1fb04a23fbce5";
2941
const hubSolanaMessageDispatcherHex20 =
@@ -53,3 +65,35 @@ export const HUB_SOLANA_SPOKE_VOTE_DECODER_ADDRESS =
5365
/// Wormhole HubVotePool Contract (sepolia ethereum address)
5466
export const HUB_VOTE_POOL_ADDRESS =
5567
"0x1004c781763c70f5f11aa64b0e5b34e1442a3c02";
68+
69+
export const DEPLOYER_AUTHORITY_PATH = "/.config/solana/deployer.json";
70+
export const DEPLOYER_AUTHORITY_KEYPAIR = loadKeypair(
71+
homedir() + DEPLOYER_AUTHORITY_PATH,
72+
);
73+
74+
export const GOVERNANCE_AUTHORITY_PATH =
75+
"/.config/solana/governanceAuthority.json";
76+
export const GOVERNANCE_AUTHORITY_KEYPAIR = loadKeypair(
77+
homedir() + GOVERNANCE_AUTHORITY_PATH,
78+
);
79+
80+
export const VESTING_ADMIN_PATH = "/.config/solana/vestingAdmin.json";
81+
export const VESTING_ADMIN_KEYPAIR = loadKeypair(
82+
homedir() + VESTING_ADMIN_PATH,
83+
);
84+
85+
export const USER_AUTHORITY_PATH = "/.config/solana/user.json";
86+
export const USER_AUTHORITY_KEYPAIR = loadKeypair(
87+
homedir() + USER_AUTHORITY_PATH,
88+
);
89+
90+
export const USER2_AUTHORITY_PATH = "/.config/solana/user2.json";
91+
export const USER2_AUTHORITY_KEYPAIR = loadKeypair(
92+
homedir() + USER2_AUTHORITY_PATH,
93+
);
94+
95+
export const AIRLOCK_PDA_ADDRESS = new PublicKey(
96+
"2ejzW2eFPedskg1KcrjcFs9g1JorRVcMes1TBPpGbhdy",
97+
);
98+
99+
export const VOTE_WEIGHT_WINDOW_LENGTHS = 10 * 60; // 10 minutes

solana/app/deploy/02_create_account_lookup_table.ts solana/app/deploy/devnet/initialize/initAddressLookupTable.ts

+9-3
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,14 @@
1-
// Usage: npx ts-node app/deploy/02_create_account_lookup_table.ts
1+
// Usage: npx ts-node app/deploy/devnet/initialize/initAddressLookupTable.ts
22

33
import { Wallet, AnchorProvider } from "@coral-xyz/anchor";
44
import { Connection } from "@solana/web3.js";
5-
import { DEPLOYER_AUTHORITY_KEYPAIR, WORMHOLE_TOKEN, RPC_NODE } from "./devnet";
6-
import { initAddressLookupTable } from "../../tests/utils/utils";
5+
import {
6+
DEPLOYER_AUTHORITY_KEYPAIR,
7+
RPC_NODE,
8+
STAKING_ADDRESS,
9+
WORMHOLE_TOKEN,
10+
} from "../constants";
11+
import { initAddressLookupTable } from "../../../helpers/utils/lookup_table";
712

813
async function main() {
914
try {
@@ -17,6 +22,7 @@ async function main() {
1722
const lookupTableAddress = await initAddressLookupTable(
1823
provider,
1924
WORMHOLE_TOKEN,
25+
STAKING_ADDRESS,
2026
);
2127

2228
console.log("Lookup table address: ", lookupTableAddress.toBase58());

solana/app/deploy/01_init_staking.ts solana/app/deploy/devnet/initialize/initConfig.ts

+10-7
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,19 @@
1-
// Usage: npx ts-node app/deploy/01_init_staking.ts
1+
// Usage: npx ts-node app/deploy/devnet/initialize/initConfig.ts
22

33
import { Wallet, AnchorProvider, Program } from "@coral-xyz/anchor";
44
import { Connection } from "@solana/web3.js";
5-
import { DEPLOYER_AUTHORITY_KEYPAIR, WORMHOLE_TOKEN, RPC_NODE } from "./devnet";
6-
import { CHECKPOINTS_ACCOUNT_LIMIT, STAKING_ADDRESS } from "../constants";
7-
import { Staking } from "../../target/types/staking";
8-
import fs from "fs";
5+
import {
6+
CHECKPOINTS_ACCOUNT_LIMIT,
7+
STAKING_ADDRESS,
8+
DEPLOYER_AUTHORITY_KEYPAIR,
9+
WORMHOLE_TOKEN,
10+
RPC_NODE,
11+
} from "../constants";
912

1013
async function main() {
11-
const client = new Connection(RPC_NODE);
14+
const connection = new Connection(RPC_NODE);
1215
const provider = new AnchorProvider(
13-
client,
16+
connection,
1417
new Wallet(DEPLOYER_AUTHORITY_KEYPAIR),
1518
{},
1619
);

solana/app/deploy/03_create_airlock.ts solana/app/deploy/devnet/initialize/initializeSpokeAirlock.ts

+3-4
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,9 @@
1-
// Usage: npx ts-node app/deploy/03_create_airlock.ts
1+
// Usage: npx ts-node app/deploy/devnet/initialize/initializeSpokeAirlock.ts
22

3-
import * as anchor from "@coral-xyz/anchor";
43
import { AnchorProvider, Program, Wallet } from "@coral-xyz/anchor";
54
import { Connection, PublicKey, SystemProgram } from "@solana/web3.js";
6-
import { DEPLOYER_AUTHORITY_KEYPAIR, RPC_NODE } from "./devnet";
7-
import { Staking } from "../../target/types/staking";
5+
import { DEPLOYER_AUTHORITY_KEYPAIR, RPC_NODE } from "../constants";
6+
import { Staking } from "../../../../target/types/staking";
87
import fs from "fs";
98

109
async function main() {

solana/app/deploy/06_create_message_executor.ts solana/app/deploy/devnet/initialize/initializeSpokeMessageExecutor.ts

+6-7
Original file line numberDiff line numberDiff line change
@@ -1,20 +1,19 @@
1-
// Usage: npx ts-node app/deploy/06_create_message_executor.ts
1+
// Usage: npx ts-node app/deploy/devnet/initialize/initializeSpokeMessageExecutor.ts
22

3-
import * as anchor from "@coral-xyz/anchor";
43
import { AnchorProvider, Program, Wallet } from "@coral-xyz/anchor";
54
import { Connection, PublicKey, SystemProgram } from "@solana/web3.js";
65
import {
6+
DEPLOYER_AUTHORITY_KEYPAIR,
77
hubSolanaMessageDispatcherPublicKey,
88
HUB_CHAIN_ID,
9+
RPC_NODE,
910
} from "../constants";
10-
import { DEPLOYER_AUTHORITY_KEYPAIR, RPC_NODE } from "./devnet";
11-
import { Staking } from "../../target/types/staking";
11+
import { Staking } from "../../../../target/types/staking";
1212
import fs from "fs";
13-
import { wasm } from "../StakeConnection";
13+
import { wasm } from "../../../StakeConnection";
1414

1515
async function main() {
1616
try {
17-
const DEBUG = true;
1817
const connection = new Connection(RPC_NODE);
1918
const provider = new AnchorProvider(
2019
connection,
@@ -47,7 +46,7 @@ async function main() {
4746
hubDispatcher: hubSolanaMessageDispatcherPublicKey,
4847
systemProgram: SystemProgram.programId,
4948
})
50-
.rpc({ skipPreflight: DEBUG });
49+
.rpc();
5150
} catch (err) {
5251
console.error("Error:", err);
5352
}

solana/app/deploy/04_create_spoke_metadata_collector.ts solana/app/deploy/devnet/initialize/initializeSpokeMetadataCollector.ts

+8-6
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,18 @@
1-
// Usage: npx ts-node app/deploy/04_create_spoke_metadata_collector.ts
1+
// Usage: npx ts-node app/deploy/devnet/initialize/initializeSpokeMetadataCollector.ts
22

3-
import * as anchor from "@coral-xyz/anchor";
43
import { AnchorProvider, Program, Wallet } from "@coral-xyz/anchor";
54
import { Connection } from "@solana/web3.js";
6-
import { HUB_CHAIN_ID, hubProposalMetadataUint8Array } from "../constants";
7-
import { DEPLOYER_AUTHORITY_KEYPAIR, RPC_NODE } from "./devnet";
8-
import { Staking } from "../../target/types/staking";
5+
import {
6+
DEPLOYER_AUTHORITY_KEYPAIR,
7+
HUB_CHAIN_ID,
8+
hubProposalMetadataUint8Array,
9+
RPC_NODE,
10+
} from "../constants";
11+
import { Staking } from "../../../../target/types/staking";
912
import fs from "fs";
1013

1114
async function main() {
1215
try {
13-
const DEBUG = true;
1416
const connection = new Connection(RPC_NODE);
1517
const provider = new AnchorProvider(
1618
connection,

solana/app/deploy/05_initializeVoteWeightWindowLengths.ts solana/app/deploy/devnet/initialize/initializeVoteWeightWindowLengths.ts

+10-6
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,18 @@
1-
// Usage: npx ts-node app/deploy/05_initializeVoteWeightWindowLengths.ts
1+
// Usage: npx ts-node app/deploy/devnet/initialize/initializeVoteWeightWindowLengths.ts
22

3-
import * as anchor from "@coral-xyz/anchor";
43
import { AnchorProvider, Program, Wallet } from "@coral-xyz/anchor";
54
import { Connection } from "@solana/web3.js";
6-
import { DEPLOYER_AUTHORITY_KEYPAIR, RPC_NODE } from "./devnet";
7-
import { Staking } from "../../target/types/staking";
5+
import {
6+
DEPLOYER_AUTHORITY_KEYPAIR,
7+
RPC_NODE,
8+
VOTE_WEIGHT_WINDOW_LENGTHS,
9+
} from "../constants";
10+
import { Staking } from "../../../../target/types/staking";
811
import fs from "fs";
912
import BN from "bn.js";
1013

1114
async function main() {
1215
try {
13-
const DEBUG = true;
1416
const connection = new Connection(RPC_NODE);
1517
const provider = new AnchorProvider(
1618
connection,
@@ -24,7 +26,9 @@ async function main() {
2426
provider,
2527
);
2628

27-
await program.methods.initializeVoteWeightWindowLengths(new BN(10)).rpc();
29+
await program.methods
30+
.initializeVoteWeightWindowLengths(new BN(VOTE_WEIGHT_WINDOW_LENGTHS))
31+
.rpc();
2832
} catch (err) {
2933
console.error("Error:", err);
3034
}

solana/app/deploy/08_create_stake_account.ts solana/app/deploy/devnet/tests/11_createStakeAccount.ts

+3-9
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,12 @@
1-
// Usage: npx ts-node app/deploy/08_create_stake_account.ts
1+
// Usage: npx ts-node app/deploy/devnet/tests/11_createStakeAccount.ts
22

3-
import * as anchor from "@coral-xyz/anchor";
43
import { AnchorProvider, Wallet } from "@coral-xyz/anchor";
54
import { Connection } from "@solana/web3.js";
6-
import * as wasm from "@wormhole/staking-wasm";
7-
import { StakeConnection } from "../StakeConnection";
8-
import { STAKING_ADDRESS } from "../constants";
9-
import { USER2_AUTHORITY_KEYPAIR, RPC_NODE } from "./devnet";
10-
import { Staking } from "../../target/types/staking";
5+
import { StakeConnection } from "../../../StakeConnection";
6+
import { RPC_NODE, USER2_AUTHORITY_KEYPAIR } from "../constants";
117

128
async function main() {
139
try {
14-
const DEBUG = true;
1510
const connection = new Connection(RPC_NODE);
1611
const provider = new AnchorProvider(
1712
connection,
@@ -22,7 +17,6 @@ async function main() {
2217
const stakeConnection = await StakeConnection.createStakeConnection(
2318
connection,
2419
provider.wallet as Wallet,
25-
STAKING_ADDRESS,
2620
);
2721

2822
await stakeConnection.createStakeAccount();

0 commit comments

Comments
 (0)