Skip to content

Commit 3b50457

Browse files
committed
feat(lazer): add utils for adding and checking ed25519 signers to solana contract
1 parent c673261 commit 3b50457

File tree

5 files changed

+156
-34
lines changed

5 files changed

+156
-34
lines changed

lazer/contracts/solana/package.json

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,9 @@
1010
"check-trusted-signer": "pnpm ts-node scripts/check_trusted_signer.ts"
1111
},
1212
"dependencies": {
13-
"@coral-xyz/anchor": "^0.30.1"
13+
"@coral-xyz/anchor": "^0.30.1",
14+
"@pythnetwork/pyth-lazer-sdk": "^0.3.1",
15+
"@solana/web3.js": "^1.98.0"
1416
},
1517
"devDependencies": {
1618
"@types/bn.js": "^5.1.0",
Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
import * as anchor from "@coral-xyz/anchor";
2+
import { Program } from "@coral-xyz/anchor";
3+
import { PythLazerSolanaContract } from "../target/types/pyth_lazer_solana_contract";
4+
import * as pythLazerSolanaContractIdl from "../target/idl/pyth_lazer_solana_contract.json";
5+
import yargs from "yargs/yargs";
6+
import { readFileSync } from "fs";
7+
import NodeWallet from "@coral-xyz/anchor/dist/cjs/nodewallet";
8+
9+
// Add a trusted signer or change its expiry time.
10+
//
11+
// Example:
12+
// pnpm ts-node scripts/add_ed25519_signer.ts --url 'https://api.testnet.solana.com' \
13+
// --keypair-path .../key.json --trusted-signer HaXscpSUcbCLSnPQB8Z7H6idyANxp1mZAXTbHeYpfrJJ \
14+
// --expiry-time-seconds 2057930841
15+
async function main() {
16+
let argv = await yargs(process.argv.slice(2))
17+
.options({
18+
url: { type: "string", demandOption: true },
19+
"keypair-path": { type: "string", demandOption: true },
20+
"trusted-signer": { type: "string", demandOption: true },
21+
"expiry-time-seconds": { type: "number", demandOption: true },
22+
})
23+
.parse();
24+
25+
const keypair = anchor.web3.Keypair.fromSecretKey(
26+
new Uint8Array(JSON.parse(readFileSync(argv.keypairPath, "ascii"))),
27+
);
28+
29+
const wallet = new NodeWallet(keypair);
30+
const connection = new anchor.web3.Connection(argv.url, {
31+
commitment: "confirmed",
32+
});
33+
const provider = new anchor.AnchorProvider(connection, wallet);
34+
35+
const program: Program<PythLazerSolanaContract> = new Program(
36+
pythLazerSolanaContractIdl as PythLazerSolanaContract,
37+
provider,
38+
);
39+
40+
await program.methods
41+
.update(
42+
new anchor.web3.PublicKey(argv.trustedSigner),
43+
new anchor.BN(argv.expiryTimeSeconds),
44+
)
45+
.accounts({})
46+
.rpc();
47+
console.log("signer updated");
48+
}
49+
50+
main();

lazer/contracts/solana/scripts/check_trusted_signer.ts

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -40,11 +40,11 @@ async function main() {
4040

4141
// Print storage info
4242
console.log("Storage Account Info:");
43-
console.log("--------------------");
43+
console.log("---------------------");
4444
console.log("Top Authority:", storage.topAuthority.toBase58());
4545
console.log("Treasury:", storage.treasury.toBase58());
46-
console.log("\nTrusted Signers:");
47-
console.log("----------------");
46+
console.log("\nTrusted Ed25519 Signers:");
47+
console.log("------------------------");
4848

4949
const trustedSigners = storage.trustedSigners.slice(
5050
0,
@@ -67,7 +67,7 @@ async function main() {
6767
}
6868

6969
console.log("\nTrusted ECDSA Signers:");
70-
console.log("----------------");
70+
console.log("----------------------");
7171

7272
const trustedEcdsaSigners = storage.trustedEcdsaSigners.slice(
7373
0,
Lines changed: 76 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,76 @@
1+
import * as anchor from "@coral-xyz/anchor";
2+
import { Program } from "@coral-xyz/anchor";
3+
import { PythLazerSolanaContract } from "../target/types/pyth_lazer_solana_contract";
4+
import * as pythLazerSolanaContractIdl from "../target/idl/pyth_lazer_solana_contract.json";
5+
import yargs from "yargs/yargs";
6+
import { readFileSync } from "fs";
7+
import NodeWallet from "@coral-xyz/anchor/dist/cjs/nodewallet";
8+
import { createEd25519Instruction } from "@pythnetwork/pyth-lazer-sdk";
9+
import {
10+
sendAndConfirmTransaction,
11+
SendTransactionError,
12+
SYSVAR_INSTRUCTIONS_PUBKEY,
13+
Transaction,
14+
} from "@solana/web3.js";
15+
16+
async function main() {
17+
let argv = await yargs(process.argv.slice(2))
18+
.options({
19+
url: { type: "string", demandOption: true },
20+
"keypair-path": { type: "string", demandOption: true },
21+
message: { type: "string", demandOption: true },
22+
})
23+
.parse();
24+
25+
const keypair = anchor.web3.Keypair.fromSecretKey(
26+
new Uint8Array(JSON.parse(readFileSync(argv.keypairPath, "ascii"))),
27+
);
28+
29+
const wallet = new NodeWallet(keypair);
30+
const connection = new anchor.web3.Connection(argv.url, {
31+
commitment: "confirmed",
32+
});
33+
const provider = new anchor.AnchorProvider(connection, wallet);
34+
35+
const program: Program<PythLazerSolanaContract> = new Program(
36+
pythLazerSolanaContractIdl as PythLazerSolanaContract,
37+
provider,
38+
);
39+
40+
const instructionMessage = Buffer.from(argv.message, "hex");
41+
const ed25519Instruction = createEd25519Instruction(
42+
instructionMessage,
43+
1,
44+
12,
45+
);
46+
const lazerInstruction = await program.methods
47+
.verifyMessage(instructionMessage, 0, 0)
48+
.accounts({
49+
payer: wallet.publicKey,
50+
instructionsSysvar: SYSVAR_INSTRUCTIONS_PUBKEY,
51+
})
52+
.instruction();
53+
54+
const transaction = new Transaction().add(
55+
ed25519Instruction,
56+
lazerInstruction,
57+
);
58+
console.log("transaction:", transaction);
59+
60+
try {
61+
const signature = await sendAndConfirmTransaction(
62+
connection,
63+
transaction,
64+
[wallet.payer],
65+
{
66+
skipPreflight: true,
67+
},
68+
);
69+
console.log("Transaction confirmed with signature:", signature);
70+
} catch (e) {
71+
console.log("error", e);
72+
console.log(e.getLogs());
73+
}
74+
}
75+
76+
main();

pnpm-lock.yaml

Lines changed: 23 additions & 29 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)