From b8d731c7c9989c3852330f90ce25a000820cca49 Mon Sep 17 00:00:00 2001 From: Evan Gray Date: Tue, 16 Jul 2024 14:10:47 -0400 Subject: [PATCH] add close_signatures instruction --- .../example-queries-solana-verify/src/lib.rs | 4 +++ .../src/processor/close_signatures.rs | 17 +++++++++++ .../src/processor/mod.rs | 3 ++ tests/example-queries-solana-verify.ts | 29 +++++++++++++++---- tests/helpers/GuardianSignature.ts | 15 ---------- 5 files changed, 47 insertions(+), 21 deletions(-) create mode 100644 programs/example-queries-solana-verify/src/processor/close_signatures.rs delete mode 100644 tests/helpers/GuardianSignature.ts diff --git a/programs/example-queries-solana-verify/src/lib.rs b/programs/example-queries-solana-verify/src/lib.rs index 25a9b6f..907ca6b 100644 --- a/programs/example-queries-solana-verify/src/lib.rs +++ b/programs/example-queries-solana-verify/src/lib.rs @@ -17,6 +17,10 @@ pub mod example_queries_solana_verify { Ok(()) } + pub fn close_signatures(ctx: Context) -> Result<()> { + processor::close_signatures(ctx) + } + pub fn post_signatures( ctx: Context, guardian_signatures: Vec<[u8; 66]>, diff --git a/programs/example-queries-solana-verify/src/processor/close_signatures.rs b/programs/example-queries-solana-verify/src/processor/close_signatures.rs new file mode 100644 index 0000000..424f410 --- /dev/null +++ b/programs/example-queries-solana-verify/src/processor/close_signatures.rs @@ -0,0 +1,17 @@ +use anchor_lang::prelude::*; + +use crate::state::GuardianSignatures; + +#[derive(Accounts)] +pub struct CloseSignatures<'info> { + #[account(mut, has_one = refund_recipient, close = refund_recipient)] + guardian_signatures: Account<'info, GuardianSignatures>, + + #[account(address = guardian_signatures.refund_recipient)] + refund_recipient: Signer<'info>, +} + +/// Allows the initial payer to close the signature account in case the query was invalid. +pub fn close_signatures(_ctx: Context) -> Result<()> { + Ok(()) +} diff --git a/programs/example-queries-solana-verify/src/processor/mod.rs b/programs/example-queries-solana-verify/src/processor/mod.rs index de09c20..a44707f 100644 --- a/programs/example-queries-solana-verify/src/processor/mod.rs +++ b/programs/example-queries-solana-verify/src/processor/mod.rs @@ -1,3 +1,6 @@ +mod close_signatures; +pub use close_signatures::*; + mod post_signatures; pub use post_signatures::*; diff --git a/tests/example-queries-solana-verify.ts b/tests/example-queries-solana-verify.ts index 49cc933..d74618a 100644 --- a/tests/example-queries-solana-verify.ts +++ b/tests/example-queries-solana-verify.ts @@ -9,12 +9,6 @@ import { deriveGuardianSetKey } from "./helpers/guardianSet"; use(chaiAsPromised); -// borrowed from https://github.com/wormhole-foundation/wormhole-circle-integration/blob/solana/integration/solana/ts/tests/helpers/consts.ts -export const PAYER_PRIVATE_KEY = Buffer.from( - "7037e963e55b4455cf3f0a2e670031fa16bd1ea79d921a94af9bd46856b6b9c00c1a5886fe1093df9fc438c296f9f7275b7718b6bc0e156d8d336c58f083996d", - "hex" -); - // TODO: PR to @wormhole-foundation/wormhole-query-sdk export function signaturesToSolanaArray(signatures: string[]) { return signatures.map((s) => [ @@ -407,4 +401,27 @@ describe("example-queries-solana-verify", () => { "Error Code: InvalidGuardianKeyRecovery. Error Number: 7800. Error Message: InvalidGuardianKeyRecovery." ); }); + it("Closes signaure accounts!", async () => { + const signatureData = signaturesToSolanaArray(wethNameResponse.signatures); + const signatureKeypair = anchor.web3.Keypair.generate(); + await program.methods + .postSignatures(signatureData, signatureData.length) + .accounts({ guardianSignatures: signatureKeypair.publicKey }) + .signers([signatureKeypair]) + .rpc(); + await expect( + program.account.guardianSignatures.fetch(signatureKeypair.publicKey) + ).to.be.fulfilled; + await expect( + program.methods + .closeSignatures() + .accounts({ + guardianSignatures: signatureKeypair.publicKey, + }) + .rpc() + ).to.be.fulfilled; + await expect( + program.account.guardianSignatures.fetch(signatureKeypair.publicKey) + ).to.be.rejectedWith("Account does not exist or has no data"); + }); }); diff --git a/tests/helpers/GuardianSignature.ts b/tests/helpers/GuardianSignature.ts deleted file mode 100644 index fedc331..0000000 --- a/tests/helpers/GuardianSignature.ts +++ /dev/null @@ -1,15 +0,0 @@ -export interface GuardianSignature { - index: number; - signature: Buffer; -} - -export const responseSignaturesToGuardianSignature = ( - signatures: string[] -): GuardianSignature[] => - signatures.map((s) => { - const b = Buffer.from(s, "hex"); - return { - index: b[b.length - 1], - signature: b.subarray(0, b.length - 1), - }; - });