Skip to content

Commit a26104a

Browse files
committed
feat(lazer): add utils for adding and checking ed25519 signers to solana contract
1 parent 9a343f7 commit a26104a

File tree

5 files changed

+146
-38
lines changed

5 files changed

+146
-38
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: 6 additions & 8 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,
@@ -60,14 +60,13 @@ async function main() {
6060
).toISOString()}`,
6161
);
6262
console.log(
63-
`Active: ${
64-
signer.expiresAt.toNumber() > Date.now() / 1000 ? "Yes" : "No"
63+
`Active: ${signer.expiresAt.toNumber() > Date.now() / 1000 ? "Yes" : "No"
6564
}`,
6665
);
6766
}
6867

6968
console.log("\nTrusted ECDSA Signers:");
70-
console.log("----------------");
69+
console.log("----------------------");
7170

7271
const trustedEcdsaSigners = storage.trustedEcdsaSigners.slice(
7372
0,
@@ -83,8 +82,7 @@ async function main() {
8382
).toISOString()}`,
8483
);
8584
console.log(
86-
`Active: ${
87-
signer.expiresAt.toNumber() > Date.now() / 1000 ? "Yes" : "No"
85+
`Active: ${signer.expiresAt.toNumber() > Date.now() / 1000 ? "Yes" : "No"
8886
}`,
8987
);
9088
}
Lines changed: 64 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,64 @@
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 { sendAndConfirmTransaction, SendTransactionError, SYSVAR_INSTRUCTIONS_PUBKEY, Transaction } from "@solana/web3.js";
10+
11+
async function main() {
12+
let argv = await yargs(process.argv.slice(2))
13+
.options({
14+
url: { type: "string", demandOption: true },
15+
"keypair-path": { type: "string", demandOption: true },
16+
message: { type: "string", demandOption: true },
17+
})
18+
.parse();
19+
20+
const keypair = anchor.web3.Keypair.fromSecretKey(
21+
new Uint8Array(JSON.parse(readFileSync(argv.keypairPath, "ascii"))),
22+
);
23+
24+
const wallet = new NodeWallet(keypair);
25+
const connection = new anchor.web3.Connection(argv.url, {
26+
commitment: "confirmed",
27+
});
28+
const provider = new anchor.AnchorProvider(connection, wallet);
29+
30+
const program: Program<PythLazerSolanaContract> = new Program(
31+
pythLazerSolanaContractIdl as PythLazerSolanaContract,
32+
provider,
33+
);
34+
35+
const instructionMessage = Buffer.from(argv.message, "hex");
36+
const ed25519Instruction = createEd25519Instruction(instructionMessage, 1, 12);
37+
const lazerInstruction = await program.methods
38+
.verifyMessage(instructionMessage, 0, 0)
39+
.accounts({
40+
payer: wallet.publicKey,
41+
instructionsSysvar: SYSVAR_INSTRUCTIONS_PUBKEY,
42+
}).instruction();
43+
44+
const transaction = new Transaction().add(ed25519Instruction, lazerInstruction);
45+
console.log("transaction:", transaction);
46+
47+
try {
48+
const signature = await sendAndConfirmTransaction(
49+
connection,
50+
transaction,
51+
[wallet.payer],
52+
{
53+
skipPreflight: true,
54+
},
55+
);
56+
console.log("Transaction confirmed with signature:", signature);
57+
} catch (e) {
58+
console.log("error", e);
59+
console.log(e.getLogs());
60+
}
61+
62+
}
63+
64+
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)