Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
28 changes: 2 additions & 26 deletions package-lock.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

3 changes: 3 additions & 0 deletions packages/wasm-solana/js/parser.ts
Original file line number Diff line number Diff line change
Expand Up @@ -255,6 +255,9 @@ export interface ParsedTransaction {

/** All account keys (base58 strings) */
accountKeys: string[];

/** All signatures (base58 strings). Non-empty signatures indicate signed transaction. */
signatures: string[];
}

// =============================================================================
Expand Down
15 changes: 14 additions & 1 deletion packages/wasm-solana/src/parser.rs
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,9 @@ pub struct ParsedTransaction {

/// All account keys (base58 strings).
pub account_keys: Vec<String>,

/// All signatures (base58 strings). Non-empty signatures indicate signed transaction.
pub signatures: Vec<String>,
}

/// Durable nonce information for nonce-based transactions.
Expand Down Expand Up @@ -64,7 +67,8 @@ impl TryIntoJsValue for ParsedTransaction {
"nonce" => self.nonce,
"durableNonce" => self.durable_nonce,
"instructionsData" => self.instructions_data,
"accountKeys" => self.account_keys
"accountKeys" => self.account_keys,
"signatures" => self.signatures
)
}
}
Expand Down Expand Up @@ -139,13 +143,17 @@ pub fn parse_transaction(bytes: &[u8]) -> Result<ParsedTransaction, String> {
// (which is the nonce value from the nonce account)
let nonce = message.recent_blockhash.to_string();

// Extract signatures as base58 strings
let signatures: Vec<String> = tx.signatures.iter().map(|s| s.to_string()).collect();

Ok(ParsedTransaction {
fee_payer,
num_signatures: message.header.num_required_signatures,
nonce,
durable_nonce,
instructions_data,
account_keys,
signatures,
})
}

Expand All @@ -168,6 +176,11 @@ mod tests {
assert!(!parsed.nonce.is_empty());
assert_eq!(parsed.instructions_data.len(), 1);

// Check signatures are returned
assert_eq!(parsed.signatures.len(), 1);
// Unsigned transactions have all-zero signatures (base58 encoded)
assert!(!parsed.signatures[0].is_empty());

// Check the instruction is a Transfer
match &parsed.instructions_data[0] {
ParsedInstruction::Transfer(params) => {
Expand Down
14 changes: 14 additions & 0 deletions packages/wasm-solana/test/parser.ts
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,20 @@ describe("parseTransaction", () => {
assert.ok(parsed.accountKeys.length > 0);
});

it("should include signatures as base58 strings", () => {
const parsed = parseTransaction(TEST_TX_BYTES);

// Should have signatures array
assert.ok(Array.isArray(parsed.signatures));
assert.strictEqual(parsed.signatures.length, parsed.numSignatures);

// Each signature should be a non-empty string (base58 encoded)
for (const sig of parsed.signatures) {
assert.strictEqual(typeof sig, "string");
assert.ok(sig.length > 0);
}
});

it("should decode SOL transfer instruction correctly", () => {
const parsed = parseTransaction(TEST_TX_BYTES);

Expand Down