@@ -3,18 +3,27 @@ import { x25519 } from "@noble/curves/ed25519";
33import { hkdf } from "@noble/hashes/hkdf" ;
44import { sha256 } from "@noble/hashes/sha256" ;
55import { bytesToHex , hexToBytes , randomBytes } from "@noble/hashes/utils" ;
6+
7+ import {
8+ address ,
9+ getBase58Encoder ,
10+ getTransactionDecoder ,
11+ getTransactionEncoder ,
12+ } from "@solana/kit" ;
13+
614import type { TypedData } from "abitype" ;
715import * as jose from "jose" ;
8-
916import type {
1017 CheckedSignTypedDataPayload ,
1118 CreateAccessTokenPayload ,
1219 CreateEoaPayload ,
1320 CreateServiceAccountPayload ,
21+ CreateSolanaAccountPayload ,
1422 EncryptedPayload ,
1523 GetServiceAccountPayload ,
1624 ListAccessTokensPayload ,
1725 ListEoaPayload ,
26+ ListSolanaAccountsPayload ,
1827 Payload ,
1928 PingPayload ,
2029 PolicyComponent ,
@@ -23,6 +32,8 @@ import type {
2332 RotateServiceAccountPayload ,
2433 SignAuthorizationPayload ,
2534 SignMessagePayload ,
35+ SignSolanaMessagePayload ,
36+ SignSolanaTransactionPayload ,
2637 SignStructuredMessagePayload ,
2738 SignTransactionPayload ,
2839 UnencryptedErrorResponse ,
@@ -447,6 +458,96 @@ export function listAccessTokens({
447458 } ) ;
448459}
449460
461+ // ========== Solana Functions ==========
462+
463+ export function createSolanaAccount ( {
464+ client,
465+ request : options ,
466+ } : PayloadParams < CreateSolanaAccountPayload > ) {
467+ return sendRequest < CreateSolanaAccountPayload > ( {
468+ client,
469+ request : {
470+ operation : "solana:create" ,
471+ ...options ,
472+ } ,
473+ } ) ;
474+ }
475+
476+ export function listSolanaAccounts ( {
477+ client,
478+ request : options ,
479+ } : PayloadParams < ListSolanaAccountsPayload > ) {
480+ return sendRequest < ListSolanaAccountsPayload > ( {
481+ client,
482+ request : {
483+ operation : "solana:list" ,
484+ ...options ,
485+ } ,
486+ } ) ;
487+ }
488+
489+ export function signSolanaTransaction ( {
490+ client,
491+ request : options ,
492+ } : PayloadParams < SignSolanaTransactionPayload > ) {
493+ return sendRequest < SignSolanaTransactionPayload > ( {
494+ client,
495+ request : {
496+ operation : "solana:signTransaction" ,
497+ ...options ,
498+ } ,
499+ } ) ;
500+ }
501+
502+ /**
503+ * Reconstruct a signed solana transaction from the vault signature using @solana/kit
504+ */
505+ export function reconstructSolanaSignedTransaction (
506+ base64Transaction : string ,
507+ base58Signature : string ,
508+ signerPubkey : string ,
509+ ) : Uint8Array {
510+ // Decode the base64 transaction into bytes
511+ const base64TransactionBytes = new Uint8Array (
512+ Buffer . from ( base64Transaction , "base64" ) ,
513+ ) ;
514+ // Decode the transaction to get its structure
515+ const transactionDecoder = getTransactionDecoder ( ) ;
516+ const transaction = transactionDecoder . decode ( base64TransactionBytes ) ;
517+
518+ // Decode the base58 signature to bytes
519+ const base58Encoder = getBase58Encoder ( ) ;
520+ const signatureBytes = base58Encoder . encode ( base58Signature ) ;
521+
522+ // Add the signature to the transaction
523+ const signedTransaction = {
524+ ...transaction ,
525+ signatures : {
526+ ...transaction . signatures ,
527+ [ address ( signerPubkey ) ] : signatureBytes ,
528+ } ,
529+ } ;
530+
531+ // Re-encode the signed transaction
532+ const transactionEncoder = getTransactionEncoder ( ) ;
533+ const signedTransactionBytes = transactionEncoder . encode ( signedTransaction ) ;
534+
535+ return new Uint8Array ( signedTransactionBytes ) ;
536+ }
537+
538+ export function signSolanaMessage ( {
539+ client,
540+ request : options ,
541+ } : PayloadParams < SignSolanaMessagePayload > ) {
542+ return sendRequest < SignSolanaMessagePayload > ( {
543+ client,
544+ request : {
545+ operation : "solana:signMessage" ,
546+ ...options ,
547+ } ,
548+ } ) ;
549+ }
550+
450551const SIGNED_TOKEN_PREFIX = "vt_sat_" ;
451552const DEFAULT_SIGNING_CONTEXT = "encryption" ; // Default context for HKDF
452553
0 commit comments