Skip to main content
The SODAX wallet-sdk-core is a core wallet SDK package containing implementations of wallet providers that enable multi-chain wallet connectivity. This package provides TypeScript implementations of wallet providers for various blockchain networks, making them compatible with the Core SODAX SDK (@sodax/sdk).
AI-friendly docs: shipped via @sodax/skills — skills CLI recommended; npm + AGENTS.md pointer as fallback. See docs/ai-integration-guide.md for all install modes and per-tool wiring.

Installation

Features

  • Multi-chain Support: Wallet provider implementations for multiple blockchain networks
  • TypeScript Compatibility: Fully typed implementations compatible with @sodax/sdk
  • Wallet Provider Interface: Standardized interface for wallet connectivity across different chains
  • Core Integration: Seamless integration with the Core SODAX SDK

Supported Wallet Providers

The package includes wallet provider implementations for:
  • EVM-compatible chains ✅
  • Solana ✅
  • Sui ✅
  • Stellar ✅
  • ICON ✅
  • Injective ✅
  • Near ✅
  • Stacks ✅
  • Bitcoin ✅

Public API surface

The package root exports:
  • Wallet providers from src/wallet-providers/* (e.g. EvmWalletProvider, SolanaWalletProvider, BitcoinWalletProvider)
  • library-exports from src/types/library-exports.ts (types and a few runtime values re-exported from upstream chain SDKs)
Internal utilities (e.g. shallowMerge in src/utils/merge.ts) are not exported from the package root.

Config variants (private key vs browser/extension)

All providers support two modes, but the union discriminant depends on the provider:
  • Field presence (no type field in config): EVM, Solana, Sui, Near, Stacks, Icon, Injective
  • Explicit uppercase type field: Bitcoin, Stellar ('PRIVATE_KEY' | 'BROWSER_EXTENSION')

EVM

Solana

Bitcoin

Sui

Sui uses mnemonics (not privateKey) for private-key mode. Both modes speak gRPC-web — Mysten’s public fullnodes stopped serving JSON-RPC in July 2026, and sui-node drops it in October 2026. Browser extension supplies the connected address plus a signer callback; the provider builds its own client. signTransaction takes the transaction positionally. dAppKit.signTransaction is options-shaped, so wrap it rather than assigning it directly — and pass account explicitly, since dApp Kit otherwise signs with whatever account is currently connected, which need not be the address given here. myWalletAccount is dApp Kit’s own UiWalletAccount, from useCurrentAccount() in React.

Stellar

Stellar uses an explicit uppercase type field ('PRIVATE_KEY' | 'BROWSER_EXTENSION').

Stacks

Stacks discriminates by field presence (no type field). The private-key config has privateKey; the browser-extension config has address (and optionally a StacksProvider).

ICON

ICON discriminates by field presence. The browser-extension config uses an optional walletAddress field (not a client object); rpcUrl is required in both modes.

Injective

Injective discriminates by field presence. The private-key config uses a nested secret object that accepts either { privateKey } or { mnemonics } — it is named SecretInjectiveWalletConfig rather than PrivateKey* to reflect this dual credential shape.

NEAR

NEAR discriminates by field presence. The private-key config requires rpcUrl, accountId, and privateKey; the browser-extension config wraps a NearConnector.

Defaults and merge semantics

Each provider accepts optional defaults, and most methods accept per-call options. The SDK combines layers using a shallow merge:
  • Only top-level keys are merged; nested objects are replaced, not deep-merged.
  • undefined layers are skipped.
  • undefined values inside a layer are skipped (so { field: undefined } means “don’t override the previous layer”).

library-exports

library-exports re-exports types (and a few runtime values) from underlying chain SDKs so consumers can reduce direct dependencies. Example: