Skip to content

Commit f6822c6

Browse files
committed
Add seeds for guardianSignatures
1 parent 98fbba2 commit f6822c6

File tree

6 files changed

+73
-51
lines changed

6 files changed

+73
-51
lines changed

solana/app/StakeConnection.ts

+21-7
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,7 @@ import {
3939
} from "./vote_weight_window_lengths";
4040
import { signaturesToSolanaArray } from "@wormhole-foundation/wormhole-query-sdk";
4141
import { deriveGuardianSetKey } from "./helpers/guardianSet";
42+
import crypto from "crypto";
4243

4344
let wasm = importedWasm;
4445
export { wasm };
@@ -679,16 +680,29 @@ export class StakeConnection {
679680
}
680681

681682
/** Post signatures */
682-
public async postSignatures(
683-
querySignatures: string[],
684-
signaturesKeypair: Keypair,
685-
) {
683+
public async postSignatures(querySignatures: string[]): Promise<PublicKey> {
686684
const signatureData = signaturesToSolanaArray(querySignatures);
685+
const randomSeed = crypto.randomBytes(32);
686+
687687
await this.program.methods
688-
.postSignatures(signatureData, signatureData.length)
689-
.accounts({ guardianSignatures: signaturesKeypair.publicKey })
690-
.signers([signaturesKeypair])
688+
.postSignatures(
689+
signatureData,
690+
signatureData.length,
691+
Array.from(randomSeed),
692+
)
693+
.accounts({ payer: this.userPublicKey() })
691694
.rpc();
695+
696+
const [guardianSignaturesPda] = PublicKey.findProgramAddressSync(
697+
[
698+
utils.bytes.utf8.encode(wasm.Constants.GUARDIAN_SIGNATURES_SEED()),
699+
this.userPublicKey().toBuffer(),
700+
randomSeed,
701+
],
702+
this.program.programId,
703+
);
704+
705+
return guardianSignaturesPda;
692706
}
693707

694708
public async addProposal(

solana/app/deploy/bridge-script.ts

+13-5
Original file line numberDiff line numberDiff line change
@@ -89,13 +89,12 @@ In Solana:
8989
1) save signatures in solana account:
9090
result.signatures: ${result.signatures}
9191
92-
const signaturesKeypair = Keypair.generate();
9392
const signatureData = signaturesToSolanaArray(result.signatures);
93+
const randomSeed = crypto.randomBytes(32);
9494
9595
program.methods
96-
.postSignatures(signatureData, signatureData.length)
97-
.accounts({ guardianSignatures: signaturesKeypair.publicKey })
98-
.signers([signaturesKeypair])
96+
.postSignatures(signatureData, signatureData.length, Array.from(randomSeed))
97+
.accounts({ payer: this.userPublicKey() })
9998
.rpc();
10099
2) call addProposal instruction:
101100
const ethProposalResponseBytes = Buffer.from(result.bytes, "hex");
@@ -109,6 +108,15 @@ In Solana:
109108
program.programId,
110109
)[0];
111110
111+
const [guardianSignaturesPda] = await PublicKey.findProgramAddress(
112+
[
113+
Buffer.from("guardian_signatures"),
114+
this.userPublicKey().toBuffer(),
115+
randomSeed,
116+
],
117+
program.programId
118+
);
119+
112120
program.methods
113121
.addProposal(
114122
ethProposalResponseBytes,
@@ -117,7 +125,7 @@ In Solana:
117125
)
118126
.accountsPartial({
119127
proposal: proposalAccount,
120-
guardianSignatures: signaturesKeypair.publicKey,
128+
guardianSignatures: guardianSignaturesPda,
121129
guardianSet: guardianSet,
122130
});
123131
`);

solana/programs/staking/src/context.rs

+5-2
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@ pub const MESSAGE_RECEIVED: &str = "message_received";
3232
pub const AIRLOCK_SEED: &str = "airlock";
3333
pub const SPOKE_METADATA_COLLECTOR_SEED: &str = "spoke_metadata_collector";
3434
pub const VOTE_WEIGHT_WINDOW_LENGTHS_SEED: &str = "vote_weight_window_lengths";
35+
pub const GUARDIAN_SIGNATURES_SEED: &str = "guardian_signatures";
3536

3637
#[derive(Accounts)]
3738
pub struct InitConfig<'info> {
@@ -225,15 +226,17 @@ pub struct UpdateHubProposalMetadata<'info> {
225226
}
226227

227228
#[derive(Accounts)]
228-
#[instruction(_guardian_signatures: Vec<[u8; 66]>, total_signatures: u8)]
229+
#[instruction(_guardian_signatures: Vec<[u8; 66]>, total_signatures: u8, random_seed: [u8; 32])]
229230
pub struct PostSignatures<'info> {
230231
#[account(mut)]
231232
pub payer: Signer<'info>,
232233

233234
#[account(
234235
init_if_needed,
235236
payer = payer,
236-
space = 8 + GuardianSignatures::compute_size(usize::from(total_signatures))
237+
space = 8 + GuardianSignatures::compute_size(usize::from(total_signatures)),
238+
seeds = [GUARDIAN_SIGNATURES_SEED.as_bytes(), payer.key().as_ref(), random_seed.as_ref()],
239+
bump
237240
)]
238241
pub guardian_signatures: Account<'info, GuardianSignatures>,
239242

solana/programs/staking/src/lib.rs

+1
Original file line numberDiff line numberDiff line change
@@ -844,6 +844,7 @@ pub mod staking {
844844
ctx: Context<PostSignatures>,
845845
guardian_signatures: Vec<[u8; 66]>,
846846
total_signatures: u8,
847+
_random_seed: [u8; 32],
847848
) -> Result<()> {
848849
_post_signatures(ctx, guardian_signatures, total_signatures)
849850
}

solana/programs/staking/src/wasm.rs

+1
Original file line numberDiff line numberDiff line change
@@ -177,6 +177,7 @@ reexport_seed_const!(VESTING_BALANCE_SEED);
177177
reexport_seed_const!(VEST_SEED);
178178
reexport_seed_const!(SPOKE_METADATA_COLLECTOR_SEED);
179179
reexport_seed_const!(VOTE_WEIGHT_WINDOW_LENGTHS_SEED);
180+
reexport_seed_const!(GUARDIAN_SIGNATURES_SEED);
180181

181182
#[wasm_bindgen]
182183
impl Constants {

solana/tests/api_test.ts

+32-37
Original file line numberDiff line numberDiff line change
@@ -166,15 +166,11 @@ describe("api", async () => {
166166
});
167167

168168
it("postSignatures", async () => {
169-
const signaturesKeypair = Keypair.generate();
170-
await stakeConnection.postSignatures(
169+
const guardianSignaturesPda = await await stakeConnection.postSignatures(
171170
ethProposalResponse.signatures,
172-
signaturesKeypair,
173171
);
174172
const { guardianSignaturesData } =
175-
await stakeConnection.fetchGuardianSignaturesData(
176-
signaturesKeypair.publicKey,
177-
);
173+
await stakeConnection.fetchGuardianSignaturesData(guardianSignaturesPda);
178174
const expectedSignatures = signaturesToSolanaArray(
179175
ethProposalResponse.signatures,
180176
);
@@ -196,16 +192,17 @@ describe("api", async () => {
196192
proposalIdInput,
197193
voteStart,
198194
);
199-
const signaturesKeypair = Keypair.generate();
195+
200196
const mock = new QueryProxyMock({});
201197
const mockSignatures = mock.sign(ethProposalResponseBytes);
202-
await stakeConnection.postSignatures(mockSignatures, signaturesKeypair);
198+
const guardianSignaturesPda =
199+
await stakeConnection.postSignatures(mockSignatures);
203200
const mockGuardianSetIndex = 5;
204201

205202
await stakeConnection.addProposal(
206203
proposalIdInput,
207204
ethProposalResponseBytes,
208-
signaturesKeypair.publicKey,
205+
guardianSignaturesPda,
209206
mockGuardianSetIndex,
210207
);
211208

@@ -234,16 +231,14 @@ describe("api", async () => {
234231
"hex",
235232
);
236233

237-
const signaturesKeypair = Keypair.generate();
238-
await stakeConnection.postSignatures(
234+
const guardianSignaturesPda = await stakeConnection.postSignatures(
239235
sepoliaEthProposalResponse.signatures,
240-
signaturesKeypair,
241236
);
242237

243238
await stakeConnection.addProposal(
244239
proposalIdArray,
245240
Buffer.from(sepoliaEthProposalResponse.bytes, "hex"),
246-
signaturesKeypair.publicKey,
241+
guardianSignaturesPda,
247242
0,
248243
);
249244

@@ -276,17 +271,17 @@ describe("api", async () => {
276271
voteStart,
277272
);
278273

279-
const signaturesKeypair = Keypair.generate();
280274
const mock = new QueryProxyMock({});
281275
const mockSignatures = mock.sign(nonFinalizedEthProposalResponseBytes);
282-
await stakeConnection.postSignatures(mockSignatures, signaturesKeypair);
276+
const guardianSignaturesPda =
277+
await stakeConnection.postSignatures(mockSignatures);
283278
const mockGuardianSetIndex = 5;
284279

285280
try {
286281
await stakeConnection.addProposal(
287282
proposalIdInput,
288283
nonFinalizedEthProposalResponseBytes,
289-
signaturesKeypair.publicKey,
284+
guardianSignaturesPda,
290285
mockGuardianSetIndex,
291286
true,
292287
);
@@ -312,17 +307,17 @@ describe("api", async () => {
312307
voteStart,
313308
);
314309

315-
const signaturesKeypair = Keypair.generate();
316310
const mock = new QueryProxyMock({});
317311
const mockSignatures = mock.sign(invalidQueryEthProposalResponseBytes);
318-
await stakeConnection.postSignatures(mockSignatures, signaturesKeypair);
312+
const guardianSignaturesPda =
313+
await stakeConnection.postSignatures(mockSignatures);
319314
const mockGuardianSetIndex = 5;
320315

321316
try {
322317
await stakeConnection.addProposal(
323318
proposalIdInput,
324319
invalidQueryEthProposalResponseBytes,
325-
signaturesKeypair.publicKey,
320+
guardianSignaturesPda,
326321
mockGuardianSetIndex,
327322
true,
328323
);
@@ -349,17 +344,17 @@ describe("api", async () => {
349344
voteStart,
350345
);
351346

352-
const signaturesKeypair = Keypair.generate();
353347
const mock = new QueryProxyMock({});
354348
const mockSignatures = mock.sign(invalidResponseEthProposalResponseBytes);
355-
await stakeConnection.postSignatures(mockSignatures, signaturesKeypair);
349+
const guardianSignaturesPda =
350+
await stakeConnection.postSignatures(mockSignatures);
356351
const mockGuardianSetIndex = 5;
357352

358353
try {
359354
await stakeConnection.addProposal(
360355
proposalIdInput,
361356
invalidResponseEthProposalResponseBytes,
362-
signaturesKeypair.publicKey,
357+
guardianSignaturesPda,
363358
mockGuardianSetIndex,
364359
true,
365360
);
@@ -386,19 +381,19 @@ describe("api", async () => {
386381
voteStart,
387382
);
388383

389-
const signaturesKeypair = Keypair.generate();
390384
const mock = new QueryProxyMock({});
391385
const mockSignatures = mock.sign(
392386
invalidFunctionSignatureEthProposalResponseBytes,
393387
);
394-
await stakeConnection.postSignatures(mockSignatures, signaturesKeypair);
388+
const guardianSignaturesPda =
389+
await stakeConnection.postSignatures(mockSignatures);
395390
const mockGuardianSetIndex = 5;
396391

397392
try {
398393
await stakeConnection.addProposal(
399394
proposalIdInput,
400395
invalidFunctionSignatureEthProposalResponseBytes,
401-
signaturesKeypair.publicKey,
396+
guardianSignaturesPda,
402397
mockGuardianSetIndex,
403398
true,
404399
);
@@ -422,17 +417,17 @@ describe("api", async () => {
422417
proposalIdInput,
423418
voteStart,
424419
);
425-
const signaturesKeypair = Keypair.generate();
426420
const mock = new QueryProxyMock({});
427421
const mockSignatures = mock.sign(ethProposalResponseBytes);
428-
await stakeConnection.postSignatures(mockSignatures, signaturesKeypair);
422+
const guardianSignaturesPda =
423+
await stakeConnection.postSignatures(mockSignatures);
429424
const mockGuardianSetIndex = 5;
430425

431426
try {
432427
await stakeConnection.addProposal(
433428
proposalIdInput,
434429
ethProposalResponseBytes,
435-
signaturesKeypair.publicKey,
430+
guardianSignaturesPda,
436431
mockGuardianSetIndex,
437432
true,
438433
);
@@ -457,17 +452,17 @@ describe("api", async () => {
457452
proposalIdInput,
458453
voteStart,
459454
);
460-
const signaturesKeypair = Keypair.generate();
461455
const mock = new QueryProxyMock({});
462456
const mockSignatures = mock.sign(ethProposalResponseBytes);
463-
await stakeConnection.postSignatures(mockSignatures, signaturesKeypair);
457+
const guardianSignaturesPda =
458+
await stakeConnection.postSignatures(mockSignatures);
464459
const mockGuardianSetIndex = 5;
465460

466461
try {
467462
await stakeConnection.addProposal(
468463
proposalIdInput,
469464
ethProposalResponseBytes,
470-
signaturesKeypair.publicKey,
465+
guardianSignaturesPda,
471466
mockGuardianSetIndex,
472467
true,
473468
);
@@ -493,16 +488,16 @@ describe("api", async () => {
493488
proposalIdInput,
494489
voteStart,
495490
);
496-
const signaturesKeypair = Keypair.generate();
497491
const mock = new QueryProxyMock({});
498492
const mockSignatures = mock.sign(ethProposalResponseBytes);
499-
await stakeConnection.postSignatures(mockSignatures, signaturesKeypair);
493+
const guardianSignaturesPda =
494+
await stakeConnection.postSignatures(mockSignatures);
500495
const mockGuardianSetIndex = 5;
501496

502497
await stakeConnection.addProposal(
503498
proposalIdInput,
504499
ethProposalResponseBytes,
505-
signaturesKeypair.publicKey,
500+
guardianSignaturesPda,
506501
mockGuardianSetIndex,
507502
);
508503

@@ -1210,16 +1205,16 @@ async function addTestProposal(
12101205
proposalIdInput,
12111206
voteStart,
12121207
);
1213-
const signaturesKeypair = Keypair.generate();
12141208
const mock = new QueryProxyMock({});
12151209
const mockSignatures = mock.sign(ethProposalResponseBytes);
1216-
await stakeConnection.postSignatures(mockSignatures, signaturesKeypair);
1210+
const guardianSignaturesPda =
1211+
await stakeConnection.postSignatures(mockSignatures);
12171212
const mockGuardianSetIndex = 5;
12181213

12191214
await stakeConnection.addProposal(
12201215
proposalIdInput,
12211216
ethProposalResponseBytes,
1222-
signaturesKeypair.publicKey,
1217+
guardianSignaturesPda,
12231218
mockGuardianSetIndex,
12241219
);
12251220

0 commit comments

Comments
 (0)