From 2e520da81721be347e3b09fb65737a4c28e7db02 Mon Sep 17 00:00:00 2001 From: Aremu Shinigami <117478951+aremys@users.noreply.github.com> Date: Thu, 21 Nov 2024 00:20:27 +0100 Subject: [PATCH 1/2] feat: Add action verification utility. --- src/utils/verifySignedAction.js. | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) create mode 100644 src/utils/verifySignedAction.js. diff --git a/src/utils/verifySignedAction.js. b/src/utils/verifySignedAction.js. new file mode 100644 index 0000000..0be701c --- /dev/null +++ b/src/utils/verifySignedAction.js. @@ -0,0 +1,20 @@ +import { PublicKey } from '@solana/web3.js'; +import nacl from 'tweetnacl'; +import bs58 from 'bs58'; + +/** + * Verifies the signed action payload. + * + * @param {Object} signedAction - The signed action payload with signature and publicKey. + * @returns {boolean} True if the signature is valid, false otherwise. + */ +export function verifySignedAction(signedAction) { + const { payload, signature, publicKey } = signedAction; + const message = new TextEncoder().encode(JSON.stringify(payload)); + + return nacl.sign.detached.verify( + message, + bs58.decode(signature), + new PublicKey(publicKey).toBytes() + ); +} From d0555d2f3ec4caf73a3e73adfe26df1df213e34c Mon Sep 17 00:00:00 2001 From: Aremu Shinigami <117478951+aremys@users.noreply.github.com> Date: Thu, 21 Nov 2024 00:23:58 +0100 Subject: [PATCH 2/2] chore: Add example usage for action signing --- examples/src/examples/exampleUsage.js. | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) create mode 100644 examples/src/examples/exampleUsage.js. diff --git a/examples/src/examples/exampleUsage.js. b/examples/src/examples/exampleUsage.js. new file mode 100644 index 0000000..b31443b --- /dev/null +++ b/examples/src/examples/exampleUsage.js. @@ -0,0 +1,24 @@ +import { signActionPayload } from '../utils/signActionPayload'; + +const actionPayload = { + actionType: 'transfer', + amount: 500, + destination: 'G7huw9ZxyV6HX...Xnb6Vhvqpk', +}; + +async function signActionExample() { + const wallet = window.solana; + + if (!wallet.isConnected) { + await wallet.connect(); + } + + try { + const signedAction = await signActionPayload(actionPayload, wallet); + console.log('Signed Action:', signedAction); + } catch (error) { + console.error('Error signing action:', error.message); + } +} + +signActionExample();