The world of blockchain and digital wallets demands secure, efficient, and portable tools — especially for mobile environments where performance and size matter. Enter wallet-core, a compact and powerful Golang-based SDK designed to handle cryptocurrency transaction signing across platforms. Whether you're building a hot wallet, cold wallet, or multi-signature solution, this open-source library streamlines core cryptographic operations while maintaining flexibility and minimal footprint.
This guide explores the features, use cases, integration strategies, and optimization tips for wallet-core — a developer-first tool that empowers cross-platform wallet development without sacrificing security or scalability.
What Is wallet-core?
wallet-core is a lightweight, open-source cryptocurrency signing library written in Golang. Its primary function is to enable offline transaction signing, making it ideal for secure environments such as cold wallets. While it can operate online, its design prioritizes air-gapped security.
Built with gomobile, the SDK compiles into native binaries:
- Android:
.aarfiles - iOS:
.frameworkbundles
This allows seamless integration into native apps and cross-platform frameworks like React Native and Flutter, enabling consistent behavior across devices.
Currently supported cryptocurrencies include:
- Bitcoin (BTC)
- Omni (including USDT on Bitcoin)
- Ethereum (ETH)
- ERC-20 tokens
Support for additional blockchains is planned, ensuring future extensibility.
👉 Discover how to integrate secure crypto signing into your app with powerful tools.
Key Features
✅ BIP39 & BIP44 Support
Generate and restore wallets using standard mnemonic phrases (BIP39), and derive hierarchical deterministic keys across multiple cryptocurrencies using BIP44.
✅ Multi-Currency Transaction Handling
Build raw transactions and sign them securely:
- BTC: Construct unsigned transactions, sign standard (non-SegWit) addresses, and support multi-signature scripts.
- Omni: Leverages Bitcoin’s infrastructure — all BTC capabilities apply, including Omni Layer USDT issuance and transfers.
- ETH: Create and sign Ethereum transactions, interact with smart contracts (including ERC20), and implement simple multi-sig logic via deployed contracts.
✅ Cross-Platform Compatibility
Compile once, deploy everywhere:
- Export as
.aarfor Android - Export as
.frameworkfor iOS - Integrate into Flutter or React Native apps using custom bridges
✅ Modular Architecture
Only include what you need. The SDK supports granular builds:
bip39module onlybtc+omniethstandalone
This modularity drastically reduces binary size — critical for mobile app optimization.
✅ Small Binary Footprint
Optimized for mobile deployment:
- Full build (all currencies): ~18MB (Android, multi-architecture)
- BTC-only: ~13MB
- ETH-only: ~9.7MB
Smaller single-architecture builds (e.g.,armeabi-v7a) go as low as 2.2–4MB, minimizing app bloat.
Note: iOS framework sizes are still under evaluation (TBD).
What It Doesn’t Include (By Design)
To maintain focus on security and minimalism, wallet-core intentionally excludes:
- Private key storage — Use secure platform-specific solutions like Android Keystore or iOS Keychain.
- Network communication — No balance queries, UTXO fetching, transaction broadcasting, or RPC handling. These must be implemented separately.
This separation of concerns ensures that sensitive signing operations remain isolated from network exposure — a best practice in wallet architecture.
How to Use wallet-core
Developing a full-featured wallet requires combining wallet-core’s signing power with your own backend or node services.
Core Capabilities Provided by SDK:
- Generate private keys and mnemonics
- Derive keys from mnemonics (BIP44)
- Build raw transactions
- Sign transactions offline
You Must Implement:
- Secure private key storage
Node/API connectivity for:
- Balance checks
- Fetching UTXOs (Bitcoin) or nonce (Ethereum)
- Broadcasting signed transactions
- Transaction history lookup
- Push notifications (if needed)
👉 Learn how modern crypto platforms handle secure key management and signing workflows.
Documentation & Learning Resources
Comprehensive guides are available in the docs directory, covering:
- Per-currency usage (BTC, ETH, Omni)
- Integration with native platforms
- Development setup and build configurations
Additionally:
- Android: Extract
xxx-sources.jarfor inline API documentation - iOS: Check the
Headersfolder in the generated.framework
Integration tests in the qa/ directory provide real-world usage examples, simulating complete wallet workflows.
Demo Projects
See wallet-core in action:
- A Flutter-based demo showcasing Ethereum multi-signature and cold wallet functionality is available at wallet-sdk-demo. This project demonstrates how to combine UI with secure signing logic in a cross-platform environment.
Frequently Asked Questions (FAQ)
Can I reduce the SDK size by including only specific modules?
Yes! Use the Makefile's build commands to export individual modules (e.g., only BTC or ETH). This modular approach lets you minimize app size based on required functionality.
How do I run tests?
- Unit tests: Run with
go test - Integration tests: Tagged with
+build integration, execute viago test -tags=integration
Some tests spin up local chains for validation. Requirements vary:
- Bitcoin: Set
BITCOIN_BIN_DIRto your bitcoin-core path - Omni: Set
OMNI_BIN_PATH - Ethereum: Install
ganache-cliglobally
Check the Makefile for integration test scripts.
Is there support for SegWit addresses?
No — current BTC implementation does not support Segregated Witness (SegWit) address signing. Only legacy Bitcoin address formats are supported.
Can I use this SDK alongside other gomobile-generated libraries?
Not easily. Due to Go's mobile toolchain limitations (golang/go#15956), linking multiple gomobile-built SDKs in one app can cause conflicts. Workarounds involve merging source code into a single build unit — though this hasn't been thoroughly tested.
Why avoid byte/int8 types when targeting iOS?
gomobile has known type restrictions when exporting to iOS. Using byte, int8, or uint8 may cause compilation issues. Prefer int64 or other compatible types for broader compatibility.
How should I handle architecture-specific builds?
For Android:
Build universal
.aarwith all ABIs (arm64-v8a, armeabi-v7a, x86, x86_64), then split during APK generation using:flutter build apk --target-platform android-arm --split-per-abi- Or compile
.aarfor a single target using-target=android/arm
Gradle configurations also allow ABI filtering.
Contributing & Extending
wallet-core welcomes community input:
- Open an issue to discuss ideas or request features
- Propose new coin integrations
- Submit PRs via fork → feature branch → pull request flow
While formal commercial support isn't offered yet, enterprise inquiries can be sent to [email protected].
Known Limitations of gomobile
As gomobile is not widely adopted in production at scale, consider these constraints:
- Type restrictions: Exported types must conform to gomobile’s allowed set (see docs)
- Naming conventions: Avoid all-uppercase struct names (
BTC) — use camelCase to prevent Java interoperability issues - Header errors: Older versions had
'libproc.h' file not foundissues; resolved after upgrading go-ethereum to v1.9.18
Always consult the official Go mobile issues page for updates.
Final Thoughts
wallet-core delivers a focused, secure, and modular approach to cryptocurrency transaction signing — perfect for developers building mobile-first wallets with Golang expertise. With strong support for BTC, ETH, Omni, and ERC20 tokens, plus seamless Android/iOS deployment via gomobile, it strikes a balance between functionality and minimalism.
Whether you're developing a cold storage solution or a multi-signature dApp interface, wallet-core gives you the foundation to build safely and efficiently.
👉 Explore next-gen crypto development tools used by leading platforms today.