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] Update external_program. Update scripts #257

Merged
merged 4 commits into from
Mar 9, 2025
Merged
Show file tree
Hide file tree
Changes from all commits
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
5 changes: 4 additions & 1 deletion solana/Anchor.toml
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,10 @@ anchor_version = "0.30.1"
seeds = true

[workspace]
members = ["programs/staking"]
members = [
"programs/staking",
"programs/external_program_for_testing"
]

[programs.localnet]
staking = "AFuHPdrQGsW8rNQ4oEFF35sm5fg36gwrxyqjkjKvi6ap"
Expand Down
28 changes: 28 additions & 0 deletions solana/app/deploy/devnet.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
import { PublicKey } from "@solana/web3.js";
import { homedir } from "os";
import { loadKeypair } from "../../tests/utils/keys";

export const DEPLOYER_AUTHORITY_PATH = "/.config/solana/deployer.json";
export const DEPLOYER_AUTHORITY_KEYPAIR = loadKeypair(
homedir() + DEPLOYER_AUTHORITY_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/user2.json";
export const USER2_AUTHORITY_KEYPAIR = loadKeypair(
homedir() + USER2_AUTHORITY_PATH,
);

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

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

export const AIRLOCK_PDA_ADDRESS = new PublicKey(
"CiZYRpbpwC21ULotSYUyfNELALFf2KWpAuBx4v7iNkCQ",
);
36 changes: 22 additions & 14 deletions solana/app/deploy/devnet/tests/11_createStakeAccount.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,23 +3,31 @@
import { AnchorProvider, Wallet } from "@coral-xyz/anchor";
import { Connection } from "@solana/web3.js";
import { StakeConnection } from "../../../StakeConnection";
import { RPC_NODE, USER2_AUTHORITY_KEYPAIR } from "../constants";
import { USER_AUTHORITY_KEYPAIR, USER2_AUTHORITY_KEYPAIR, RPC_NODE } from "../constants";

async function main() {
try {
const connection = new Connection(RPC_NODE);
const provider = new AnchorProvider(
connection,
new Wallet(USER2_AUTHORITY_KEYPAIR),
{},
);
async function createStakeAccount(userKeypair: anchor.web3.Keypair) {
const connection = new Connection(RPC_NODE);
const provider = new AnchorProvider(
connection,
new Wallet(userKeypair),
{},
);

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

await stakeConnection.createStakeAccount();
const tx = await stakeConnection.createStakeAccount();

console.log(`Stake account created successfully for user: ${provider.wallet.publicKey.toBase58()}`);
console.log("Transaction signature:", tx);
}

async function main() {
try {
await createStakeAccount(USER_AUTHORITY_KEYPAIR);
await createStakeAccount(USER2_AUTHORITY_KEYPAIR);
} catch (err) {
console.error("Error:", err);
}
Expand Down
81 changes: 45 additions & 36 deletions solana/app/deploy/devnet/tests/12_deposit.ts
Original file line number Diff line number Diff line change
Expand Up @@ -11,48 +11,57 @@ import * as wasm from "@wormhole/staking-wasm";
import {
RPC_NODE,
STAKING_ADDRESS,
USER_AUTHORITY_KEYPAIR,
USER2_AUTHORITY_KEYPAIR,
WORMHOLE_TOKEN,
} from "../constants";

async function performDeposit(userKeypair: anchor.web3.Keypair) {
const connection = new Connection(RPC_NODE);
const provider = new AnchorProvider(
connection,
new Wallet(userKeypair),
{},
);
const user = provider.wallet.publicKey;
const idl = (await Program.fetchIdl(STAKING_ADDRESS, provider))!;
const program = new Program(idl, provider);

const transaction = new Transaction();
const fromAccount = await getAssociatedTokenAddress(
WORMHOLE_TOKEN,
provider.wallet.publicKey,
true,
);

const toAccount = PublicKey.findProgramAddressSync(
[
anchor.utils.bytes.utf8.encode(wasm.Constants.CUSTODY_SEED()),
user.toBuffer(),
],
program.programId,
)[0];

const ix = createTransferInstruction(
fromAccount,
toAccount,
provider.wallet.publicKey,
500000000,
);
transaction.add(ix);

const tx = await provider.sendAndConfirm(transaction, [], {
skipPreflight: false,
});

console.log(`Deposit transaction completed successfully for user: ${user.toBase58()}`);
console.log("Transaction signature:", tx);
}

async function main() {
try {
const connection = new Connection(RPC_NODE);
const provider = new AnchorProvider(
connection,
new Wallet(USER2_AUTHORITY_KEYPAIR),
{},
);
const user = provider.wallet.publicKey;
const idl = (await Program.fetchIdl(STAKING_ADDRESS, provider))!;
const program = new Program(idl, provider);

const transaction = new Transaction();
const from_account = await getAssociatedTokenAddress(
WORMHOLE_TOKEN,
provider.wallet.publicKey,
true,
);

const toAccount = PublicKey.findProgramAddressSync(
[
anchor.utils.bytes.utf8.encode(wasm.Constants.CUSTODY_SEED()),
user.toBuffer(),
],
program.programId,
)[0];

const ix = createTransferInstruction(
from_account,
toAccount,
provider.wallet.publicKey,
500000000,
);
transaction.add(ix);

const tx = await provider.sendAndConfirm(transaction, [], {
skipPreflight: false,
});
await performDeposit(USER_AUTHORITY_KEYPAIR);
await performDeposit(USER2_AUTHORITY_KEYPAIR);
} catch (err) {
console.error("Error:", err);
}
Expand Down
71 changes: 33 additions & 38 deletions solana/app/deploy/devnet/tests/14_delegate.ts
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
// Usage: npx ts-node app/deploy/devnet/tests/14_delegate.ts

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

async function delegateStake(
userKeypair: Keypair,
amount: string,
delegateTo?: PublicKey,
) {
const connection = new Connection(RPC_NODE);
const provider = new AnchorProvider(
connection,
new Wallet(userKeypair),
{},
);

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

await sleep(2000);
await stakeConnection.delegate(delegateTo, WHTokenBalance.fromString(amount));

console.log(`Delegation successful for user: ${provider.wallet.publicKey.toBase58()}`);
if (delegateTo) {
console.log(`Delegated to: ${delegateTo.toBase58()}`);
}
}

async function main() {
try {
const connection = new Connection(RPC_NODE);
const provider = new AnchorProvider(
connection,
new Wallet(USER_AUTHORITY_KEYPAIR),
{},
);
const stakeConnection = await StakeConnection.createStakeConnection(
connection,
provider.wallet as Wallet,
);

await stakeConnection.delegate(
undefined,
WHTokenBalance.fromString("10000000"),
);
await sleep(10000);

const user2Provider = new AnchorProvider(
connection,
new Wallet(USER2_AUTHORITY_KEYPAIR),
{},
);
const user2StakeConnection = await StakeConnection.createStakeConnection(
connection,
user2Provider.wallet as Wallet,
);

await user2StakeConnection.delegate(
undefined,
WHTokenBalance.fromString("10000000"),
);
await sleep(10000);

await stakeConnection.delegate(
user2StakeConnection.userPublicKey(),
WHTokenBalance.fromString("10000000"),
);
// First user delegates to himself
await delegateStake(USER_AUTHORITY_KEYPAIR, "10000000");
// Second user delegates to himself
await delegateStake(USER2_AUTHORITY_KEYPAIR, "10000000");
// First user delegates to second user
await delegateStake(USER_AUTHORITY_KEYPAIR, "10000000", USER2_AUTHORITY_KEYPAIR.publicKey);
} catch (err) {
console.error("Error:", err);
}
Expand Down
4 changes: 2 additions & 2 deletions solana/app/deploy/devnet/tests/24_fetchProposalAccountData.ts
Original file line number Diff line number Diff line change
Expand Up @@ -31,12 +31,12 @@ async function main() {
const { proposalAccountData } =
await stakeConnection.fetchProposalAccountData(proposalIdArray);

const proposalId = new ethers.AbiCoder()
const proposalIdFromAccount = new ethers.AbiCoder()
.decode(["uint256"], Buffer.from(proposalAccountData.id))[0]
.toString();

console.log("Parse proposalAccountData:");
console.log("proposalId:", proposalId);
console.log("proposalId:", proposalIdFromAccount);
console.log("againstVotes:", proposalAccountData.againstVotes.toNumber());
console.log("forVotes:", proposalAccountData.forVotes.toNumber());
console.log("abstainVotes:", proposalAccountData.abstainVotes.toNumber());
Expand Down
17 changes: 17 additions & 0 deletions solana/app/deploy/devnet/tests/getProgramIdBytes32Hex.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
// Usage: npx ts-node app/deploy/getProgramIdBytes32Hex.ts
// AFuHPdrQGsW8rNQ4oEFF35sm5fg36gwrxyqjkjKvi6ap

import { PublicKey } from "@solana/web3.js";
import input from "@inquirer/input";

async function main() {
try {
const programId = await input({ message: "Enter the program id:" });
const programIdPublicKey = new PublicKey(programId);
console.log('Program ID:', "0x" + Buffer.from(programIdPublicKey.toBytes()).toString('hex'))
} catch (err) {
console.error("Error:", err);
}
}

main();
2 changes: 1 addition & 1 deletion solana/app/e2e/02_addProposal.ts
Original file line number Diff line number Diff line change
Expand Up @@ -44,7 +44,7 @@ function sleep(ms) {
}

const MAX_RETRIES = 5;
const RETRY_DELAY = 5000; // 5 seconds
const RETRY_DELAY = 10000; // 10 seconds
async function getLatestFinalizedBlock(rpcUrl: string): Promise<number> {
let attempt = 0;

Expand Down
Loading