Skip to content

Conversation

@lcovar
Copy link
Contributor

@lcovar lcovar commented Jan 21, 2026

No description provided.

@lcovar lcovar requested a review from a team as a code owner January 21, 2026 06:10
@lcovar lcovar force-pushed the BTC-2955 branch 3 times, most recently from 8d2ef40 to e601542 Compare January 21, 2026 06:30
Add comprehensive Solana transaction parsing capabilities via WASM,
providing types and structures compatible with BitGoJS's sdk-coin-sol.

## Rust Layer

### Transaction Deserialization (src/transaction.rs)
- Deserialize legacy Solana transactions from wire format
- Extract fee payer, blockhash, signatures, and account keys
- Provide signable payload for signing operations

### Instruction Decoding (src/instructions/)
- Decode System Program: Transfer, CreateAccount, NonceAdvance, NonceInitialize
- Decode Stake Program: Initialize, Delegate, Deactivate, Withdraw, Authorize
- Decode ComputeBudget: SetComputeUnitLimit, SetComputeUnitPrice
- Decode SPL Token: TransferChecked via token and token-2022 programs
- Decode ATA Program: CreateAssociatedTokenAccount, CloseAccount
- Decode Memo Program
- Unknown instruction fallback with raw data preservation

### High-Level Parser (src/parser.rs)
- Combine CreateAccount + NonceInitialize into CreateNonceAccount
- Combine CreateAccount + StakeInitialize + DelegateStake into StakingActivate
- Detect durable nonce transactions and populate durableNonce field
- Add stakingType field (NATIVE, JITO, MARINADE) to StakingActivate

### WASM Bindings (src/wasm/)
- ParserNamespace::parse_transaction - returns ParsedTransaction as JsValue
- TransactionNamespace - transaction inspection methods

## TypeScript Layer

### Transaction Wrapper (js/transaction.ts)
- Transaction class wrapping WASM with typed methods
- Access to fee payer, blockhash, signatures, instructions, account keys

### Parser Types (js/parser.ts)
- Full TypeScript interfaces matching BitGoJS InstructionParams
- ParsedTransaction interface with feePayer, nonce, durableNonce, instructionsData
- parseTransaction() function with BigInt conversion for SetPriorityFee.fee

### Exports (js/index.ts)
- Export Transaction class and parseTransaction function
- Re-export all instruction parameter types

## Tests
- BitGoJS compatibility tests using actual transaction fixtures
- Transaction deserialization and inspection tests
- Parser instruction type discrimination tests

TICKET: BTC-2929
Add support for decoding SPL Stake Pool instructions used by Jito
liquid staking. This enables WASM-based parsing of Jito staking
transactions for parity with BitGoJS.

Changes:
- Add spl-stake-pool dependency for official Borsh deserialization
- Add STAKE_POOL_PROGRAM_ID constant for SPoo1Ku8WFXoNDMHPsrGSTSG1Y47rzgn41SLUNakuHy
- Add StakePoolDepositSol and StakePoolWithdrawStake instruction types
- Add decode_stake_pool_instruction using official StakePoolInstruction enum
- Add TypeScript interfaces for stake pool instructions
- Add Jito transaction parsing tests using BitGoJS test fixtures

Ticket: BTC-2932
@lcovar lcovar changed the base branch from BTC-2932 to BTC-2929 January 23, 2026 23:10
@lcovar lcovar changed the base branch from BTC-2929 to master January 23, 2026 23:10
Implements the core transaction building functionality using Solana SDK:

- types.rs: TransactionIntent, Nonce (blockhash/durable), Instruction variants
- build.rs: Transaction builder using solana-sdk 3.x types
- Uses SDK instruction builders: system_ix::transfer(), advance_nonce_account(), etc.
- Uses ComputeBudgetInstruction for priority fees

Supported instructions:
- Transfer, CreateAccount, NonceAdvance, NonceInitialize
- Allocate, Assign, Memo, ComputeBudget

Ticket: BTC-2955
@lcovar lcovar changed the base branch from master to BTC-2929 January 23, 2026 23:29
lcovar and others added 4 commits January 23, 2026 15:41
Add support for building native staking instructions:
- StakeInitialize: Initialize stake account with authorized staker/withdrawer
- StakeDelegate: Delegate stake to a validator
- StakeDeactivate: Deactivate a stake account
- StakeWithdraw: Withdraw from a stake account
- StakeAuthorize: Change stake account authorization

Ticket: BTC-2955
Add support for building SPL Token instructions:
- TokenTransfer: Transfer tokens using TransferChecked for safety
- CreateAssociatedTokenAccount: Create ATAs with automatic address derivation
- CloseAssociatedTokenAccount: Close token accounts and reclaim rent

Supports both Token Program and Token-2022 via configurable program ID.

Ticket: BTC-2955
Add transaction building support for SPL Stake Pool (Jito liquid staking):
- StakePoolDepositSol: deposit SOL into stake pool, receive pool tokens
- StakePoolWithdrawStake: withdraw stake by burning pool tokens

Uses spl-stake-pool crate with BorshSerialize for proper instruction
data encoding. Includes all required account metas for both operations.

BTC-2955
…nd Jito

- Add TypeScript interfaces for all builder instruction types:
  - Stake Program: StakeInitialize, StakeDelegate, StakeDeactivate,
    StakeWithdraw, StakeAuthorize
  - SPL Token: TokenTransfer, CreateAssociatedTokenAccount,
    CloseAssociatedTokenAccount
  - Jito Stake Pool: StakePoolDepositSol, StakePoolWithdrawStake

- Update parser types to include decimalPlaces and programId for
  TokenTransferParams, and add StakeInitializeParams

- Add comprehensive TypeScript tests for all new instruction types:
  - Stake Program tests (initialize, delegate, deactivate, withdraw,
    full staking flow)
  - SPL Token tests (transfer, create ATA, close ATA, transfer with ATA)
  - Jito Stake Pool tests (deposit sol, withdraw stake, deposit with ATA)

All 73 tests passing.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
@lcovar lcovar force-pushed the BTC-2929 branch 8 times, most recently from 1a49cef to 7e6fe43 Compare January 24, 2026 06:27
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants