AI-friendly docs: shipped via@sodax/skills—skillsCLI recommended; npm +AGENTS.mdpointer 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-exportsfromsrc/types/library-exports.ts(types and a few runtime values re-exported from upstream chain SDKs)
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
typefield in config): EVM, Solana, Sui, Near, Stacks, Icon, Injective - Explicit uppercase
typefield: Bitcoin, Stellar ('PRIVATE_KEY' | 'BROWSER_EXTENSION')
EVM
Solana
Bitcoin
Sui
Sui usesmnemonics (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 uppercasetype field ('PRIVATE_KEY' | 'BROWSER_EXTENSION').
Stacks
Stacks discriminates by field presence (notype 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 optionalwalletAddress field (not a client object); rpcUrl is required in both modes.
Injective
Injective discriminates by field presence. The private-key config uses a nestedsecret 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 requiresrpcUrl, accountId, and privateKey; the browser-extension config wraps a NearConnector.
Defaults and merge semantics
Each provider accepts optionaldefaults, 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.
undefinedlayers are skipped.undefinedvalues 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: