Skip to content

Commit 6c30d6a

Browse files
authored
[solana] Update external_program. Update scripts (#257)
* Re-deploy and update deploy scripts * Update external_program. Update e2e scripts
1 parent 4c82ea1 commit 6c30d6a

15 files changed

+654
-268
lines changed

solana/Anchor.toml

+4-1
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,10 @@ anchor_version = "0.30.1"
44
seeds = true
55

66
[workspace]
7-
members = ["programs/staking"]
7+
members = [
8+
"programs/staking",
9+
"programs/external_program_for_testing"
10+
]
811

912
[programs.localnet]
1013
staking = "AFuHPdrQGsW8rNQ4oEFF35sm5fg36gwrxyqjkjKvi6ap"

solana/app/deploy/devnet.ts

+28
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
import { PublicKey } from "@solana/web3.js";
2+
import { homedir } from "os";
3+
import { loadKeypair } from "../../tests/utils/keys";
4+
5+
export const DEPLOYER_AUTHORITY_PATH = "/.config/solana/deployer.json";
6+
export const DEPLOYER_AUTHORITY_KEYPAIR = loadKeypair(
7+
homedir() + DEPLOYER_AUTHORITY_PATH,
8+
);
9+
10+
export const USER_AUTHORITY_PATH = "/.config/solana/user.json";
11+
export const USER_AUTHORITY_KEYPAIR = loadKeypair(
12+
homedir() + USER_AUTHORITY_PATH,
13+
);
14+
15+
export const USER2_AUTHORITY_PATH = "/.config/solana/user2.json";
16+
export const USER2_AUTHORITY_KEYPAIR = loadKeypair(
17+
homedir() + USER2_AUTHORITY_PATH,
18+
);
19+
20+
export const WORMHOLE_TOKEN = new PublicKey(
21+
"Exne2kdeGToBnC2WVSdt1gLy6fjnNftbPtsCPx8AuL7V",
22+
);
23+
24+
export const RPC_NODE = "https://api.devnet.solana.com";
25+
26+
export const AIRLOCK_PDA_ADDRESS = new PublicKey(
27+
"CiZYRpbpwC21ULotSYUyfNELALFf2KWpAuBx4v7iNkCQ",
28+
);

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

+22-14
Original file line numberDiff line numberDiff line change
@@ -3,23 +3,31 @@
33
import { AnchorProvider, Wallet } from "@coral-xyz/anchor";
44
import { Connection } from "@solana/web3.js";
55
import { StakeConnection } from "../../../StakeConnection";
6-
import { RPC_NODE, USER2_AUTHORITY_KEYPAIR } from "../constants";
6+
import { USER_AUTHORITY_KEYPAIR, USER2_AUTHORITY_KEYPAIR, RPC_NODE } from "../constants";
77

8-
async function main() {
9-
try {
10-
const connection = new Connection(RPC_NODE);
11-
const provider = new AnchorProvider(
12-
connection,
13-
new Wallet(USER2_AUTHORITY_KEYPAIR),
14-
{},
15-
);
8+
async function createStakeAccount(userKeypair: anchor.web3.Keypair) {
9+
const connection = new Connection(RPC_NODE);
10+
const provider = new AnchorProvider(
11+
connection,
12+
new Wallet(userKeypair),
13+
{},
14+
);
1615

17-
const stakeConnection = await StakeConnection.createStakeConnection(
18-
connection,
19-
provider.wallet as Wallet,
20-
);
16+
const stakeConnection = await StakeConnection.createStakeConnection(
17+
connection,
18+
provider.wallet as Wallet,
19+
);
2120

22-
await stakeConnection.createStakeAccount();
21+
const tx = await stakeConnection.createStakeAccount();
22+
23+
console.log(`Stake account created successfully for user: ${provider.wallet.publicKey.toBase58()}`);
24+
console.log("Transaction signature:", tx);
25+
}
26+
27+
async function main() {
28+
try {
29+
await createStakeAccount(USER_AUTHORITY_KEYPAIR);
30+
await createStakeAccount(USER2_AUTHORITY_KEYPAIR);
2331
} catch (err) {
2432
console.error("Error:", err);
2533
}

solana/app/deploy/devnet/tests/12_deposit.ts

+45-36
Original file line numberDiff line numberDiff line change
@@ -11,48 +11,57 @@ import * as wasm from "@wormhole/staking-wasm";
1111
import {
1212
RPC_NODE,
1313
STAKING_ADDRESS,
14+
USER_AUTHORITY_KEYPAIR,
1415
USER2_AUTHORITY_KEYPAIR,
1516
WORMHOLE_TOKEN,
1617
} from "../constants";
1718

19+
async function performDeposit(userKeypair: anchor.web3.Keypair) {
20+
const connection = new Connection(RPC_NODE);
21+
const provider = new AnchorProvider(
22+
connection,
23+
new Wallet(userKeypair),
24+
{},
25+
);
26+
const user = provider.wallet.publicKey;
27+
const idl = (await Program.fetchIdl(STAKING_ADDRESS, provider))!;
28+
const program = new Program(idl, provider);
29+
30+
const transaction = new Transaction();
31+
const fromAccount = await getAssociatedTokenAddress(
32+
WORMHOLE_TOKEN,
33+
provider.wallet.publicKey,
34+
true,
35+
);
36+
37+
const toAccount = PublicKey.findProgramAddressSync(
38+
[
39+
anchor.utils.bytes.utf8.encode(wasm.Constants.CUSTODY_SEED()),
40+
user.toBuffer(),
41+
],
42+
program.programId,
43+
)[0];
44+
45+
const ix = createTransferInstruction(
46+
fromAccount,
47+
toAccount,
48+
provider.wallet.publicKey,
49+
500000000,
50+
);
51+
transaction.add(ix);
52+
53+
const tx = await provider.sendAndConfirm(transaction, [], {
54+
skipPreflight: false,
55+
});
56+
57+
console.log(`Deposit transaction completed successfully for user: ${user.toBase58()}`);
58+
console.log("Transaction signature:", tx);
59+
}
60+
1861
async function main() {
1962
try {
20-
const connection = new Connection(RPC_NODE);
21-
const provider = new AnchorProvider(
22-
connection,
23-
new Wallet(USER2_AUTHORITY_KEYPAIR),
24-
{},
25-
);
26-
const user = provider.wallet.publicKey;
27-
const idl = (await Program.fetchIdl(STAKING_ADDRESS, provider))!;
28-
const program = new Program(idl, provider);
29-
30-
const transaction = new Transaction();
31-
const from_account = await getAssociatedTokenAddress(
32-
WORMHOLE_TOKEN,
33-
provider.wallet.publicKey,
34-
true,
35-
);
36-
37-
const toAccount = PublicKey.findProgramAddressSync(
38-
[
39-
anchor.utils.bytes.utf8.encode(wasm.Constants.CUSTODY_SEED()),
40-
user.toBuffer(),
41-
],
42-
program.programId,
43-
)[0];
44-
45-
const ix = createTransferInstruction(
46-
from_account,
47-
toAccount,
48-
provider.wallet.publicKey,
49-
500000000,
50-
);
51-
transaction.add(ix);
52-
53-
const tx = await provider.sendAndConfirm(transaction, [], {
54-
skipPreflight: false,
55-
});
63+
await performDeposit(USER_AUTHORITY_KEYPAIR);
64+
await performDeposit(USER2_AUTHORITY_KEYPAIR);
5665
} catch (err) {
5766
console.error("Error:", err);
5867
}

solana/app/deploy/devnet/tests/14_delegate.ts

+33-38
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
// Usage: npx ts-node app/deploy/devnet/tests/14_delegate.ts
22

33
import { AnchorProvider, Wallet } from "@coral-xyz/anchor";
4-
import { Connection } from "@solana/web3.js";
4+
import { Connection, PublicKey, Keypair } from "@solana/web3.js";
55
import { StakeConnection } from "../../../StakeConnection";
66
import { WHTokenBalance } from "../../../whTokenBalance";
77
import {
@@ -14,45 +14,40 @@ function sleep(ms) {
1414
return new Promise((resolve) => setTimeout(resolve, ms));
1515
}
1616

17+
async function delegateStake(
18+
userKeypair: Keypair,
19+
amount: string,
20+
delegateTo?: PublicKey,
21+
) {
22+
const connection = new Connection(RPC_NODE);
23+
const provider = new AnchorProvider(
24+
connection,
25+
new Wallet(userKeypair),
26+
{},
27+
);
28+
29+
const stakeConnection = await StakeConnection.createStakeConnection(
30+
connection,
31+
provider.wallet as Wallet,
32+
);
33+
34+
await sleep(2000);
35+
await stakeConnection.delegate(delegateTo, WHTokenBalance.fromString(amount));
36+
37+
console.log(`Delegation successful for user: ${provider.wallet.publicKey.toBase58()}`);
38+
if (delegateTo) {
39+
console.log(`Delegated to: ${delegateTo.toBase58()}`);
40+
}
41+
}
42+
1743
async function main() {
1844
try {
19-
const connection = new Connection(RPC_NODE);
20-
const provider = new AnchorProvider(
21-
connection,
22-
new Wallet(USER_AUTHORITY_KEYPAIR),
23-
{},
24-
);
25-
const stakeConnection = await StakeConnection.createStakeConnection(
26-
connection,
27-
provider.wallet as Wallet,
28-
);
29-
30-
await stakeConnection.delegate(
31-
undefined,
32-
WHTokenBalance.fromString("10000000"),
33-
);
34-
await sleep(10000);
35-
36-
const user2Provider = new AnchorProvider(
37-
connection,
38-
new Wallet(USER2_AUTHORITY_KEYPAIR),
39-
{},
40-
);
41-
const user2StakeConnection = await StakeConnection.createStakeConnection(
42-
connection,
43-
user2Provider.wallet as Wallet,
44-
);
45-
46-
await user2StakeConnection.delegate(
47-
undefined,
48-
WHTokenBalance.fromString("10000000"),
49-
);
50-
await sleep(10000);
51-
52-
await stakeConnection.delegate(
53-
user2StakeConnection.userPublicKey(),
54-
WHTokenBalance.fromString("10000000"),
55-
);
45+
// First user delegates to himself
46+
await delegateStake(USER_AUTHORITY_KEYPAIR, "10000000");
47+
// Second user delegates to himself
48+
await delegateStake(USER2_AUTHORITY_KEYPAIR, "10000000");
49+
// First user delegates to second user
50+
await delegateStake(USER_AUTHORITY_KEYPAIR, "10000000", USER2_AUTHORITY_KEYPAIR.publicKey);
5651
} catch (err) {
5752
console.error("Error:", err);
5853
}

solana/app/deploy/devnet/tests/24_fetchProposalAccountData.ts

+2-2
Original file line numberDiff line numberDiff line change
@@ -31,12 +31,12 @@ async function main() {
3131
const { proposalAccountData } =
3232
await stakeConnection.fetchProposalAccountData(proposalIdArray);
3333

34-
const proposalId = new ethers.AbiCoder()
34+
const proposalIdFromAccount = new ethers.AbiCoder()
3535
.decode(["uint256"], Buffer.from(proposalAccountData.id))[0]
3636
.toString();
3737

3838
console.log("Parse proposalAccountData:");
39-
console.log("proposalId:", proposalId);
39+
console.log("proposalId:", proposalIdFromAccount);
4040
console.log("againstVotes:", proposalAccountData.againstVotes.toNumber());
4141
console.log("forVotes:", proposalAccountData.forVotes.toNumber());
4242
console.log("abstainVotes:", proposalAccountData.abstainVotes.toNumber());
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
// Usage: npx ts-node app/deploy/getProgramIdBytes32Hex.ts
2+
// AFuHPdrQGsW8rNQ4oEFF35sm5fg36gwrxyqjkjKvi6ap
3+
4+
import { PublicKey } from "@solana/web3.js";
5+
import input from "@inquirer/input";
6+
7+
async function main() {
8+
try {
9+
const programId = await input({ message: "Enter the program id:" });
10+
const programIdPublicKey = new PublicKey(programId);
11+
console.log('Program ID:', "0x" + Buffer.from(programIdPublicKey.toBytes()).toString('hex'))
12+
} catch (err) {
13+
console.error("Error:", err);
14+
}
15+
}
16+
17+
main();

solana/app/e2e/02_addProposal.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,7 @@ function sleep(ms) {
4444
}
4545

4646
const MAX_RETRIES = 5;
47-
const RETRY_DELAY = 5000; // 5 seconds
47+
const RETRY_DELAY = 10000; // 10 seconds
4848
async function getLatestFinalizedBlock(rpcUrl: string): Promise<number> {
4949
let attempt = 0;
5050

0 commit comments

Comments
 (0)