Wallet functionalities to create raw transaction, to sign on unsigned transaction, to send signed transaction for BTC, BCH, ETH, XRP and so on.
- Bitcoin
- Bitcoin Cash
- Ethereum
- ERC-20 Token
- Ripple
- This project is under refactoring based on
Clean Code,Clean Architecture,Refactoring- ✅ Domain layer separated (
pkg/domain/) - Pure business logic with zero infrastructure dependencies - ✅ Application layer (
pkg/application/usecase/) - Use case implementations following Clean Architecture - ✅ Infrastructure layer (
pkg/infrastructure/) - External dependencies (API clients, database, repositories) - 🔄 Migration from legacy
pkg/wallet/service/to newpkg/application/usecase/in progress - ✅ Integration tests separated using build tags (
//go:build integration)
- ✅ Domain layer separated (
- Bitcoin Core version 22.0 is released. Signet environment is ongoing.
- Pubkey addresses are given to our users first.
- Users would want to deposit coins on our system.
- After users sent coins to their given addresses, these all amount of coins are sent to our safe addresses managed offline by cold wallet
- Users would want to withdraw their coins to specific addresses.
- Transaction is created and sent after payment is requested by users.
- Internal use. Each accounts can transfer coins among internal accounts.
This is explained for BTC/BCH for now.
There are mainly 3 wallets separately and these wallets are expected to be installed in each different devices.
- Only this wallet run online to access to BTC/BCH Nodes.
- Only pubkey address is stored. Private key is NOT stored for security reason. That's why this is called
watch only wallet. - Major functionalities are
- creating unsigned transaction
- sending signed transaction
- monitoring transaction status.
- Key management functionalities for accounts.
- This wallet is expected to work offline.
- Major functionalities are
- generating seed for accounts
- generating keys based on
HD Wallet - generating multisig addressed according to account setting
- exporting pubkey addresses as csv file which is imported from
Watch only wallet - signing on unsigned transaction as first sign. However, multisig addresses could not be completed by only this wallet.
- The internal authorization operators would use this wallet to sign on unsigned transaction for multisig addresses.
- Each of operators would be given own authorization account and Sing wallet apps.
- This wallet is expected to work offline.
- Major functionalities are
- generating seed for accounts for own auth account
- generating keys based on
HD Walletfor own auth account - exporting full-pubkey addresses as csv file which is imported from
Keygen walletto generate multisig address - signing on unsigned transaction as second or more signs for multisig addresses.
- Golang 1.25.5+
- golangci-lint 1.44.2+ (for development)
- direnv
- Docker
- MySQL 5.7
- Node Server
cmd... app directories includingmain.gokeygen... keygen walletsign... sign walletwatch... watch wallet
dataaddress... generated files by this CLIcerts... for docker volume directory used bydocker-compose.xrp.ymlconfig... config toml filescontract... generated token abi filedump... BTC wallet file generated byapi dumpwalletcommand. See Makefile.fullpubkey... generated files by this CLIgaiad... genesis.json for cosmos gaiadkeystore... keystore for Ethereumproto... proto files for ripple gRPC communication
docker... docker resourcesdocs... documentsimages... for only docspkg... go filesscripts... shell scriptsweberc20-token... erc20 token contractripple-lib-server... Ripple gRPC server
The project follows Clean Architecture principles with clear layer separation:
Pure business logic with zero infrastructure dependencies:
domain/account/... Account types, validators, and business rulesdomain/transaction/... Transaction types, state machine, validatorsdomain/wallet/... Wallet types and definitionsdomain/key/... Key value objects and validatorsdomain/multisig/... Multisig validators and business rulesdomain/coin/... Cryptocurrency type definitions
Use case layer following Clean Architecture:
application/usecase/keygen/... Key generation use cases (btc, eth, xrp, shared)application/usecase/sign/... Signing use cases (btc, eth, xrp, shared)application/usecase/watch/... Watch wallet use cases (btc, eth, xrp, shared)
External dependencies and implementations:
infrastructure/api/bitcoin/... Bitcoin/BCH Core RPC API clients. API Referencesinfrastructure/api/ethereum/... Ethereum JSON-RPC API clients. API Referencesinfrastructure/api/ripple/... Ripple gRPC API clients to communicate with ripple-lib-serverinfrastructure/database/... Database connections and generated code (MySQL, sqlc)infrastructure/repository/... Data persistence implementations (cold wallet, watch wallet)infrastructure/storage/... File storage implementations (address, transaction)infrastructure/network/... Network communication (WebSocket, gRPC)
wallet/service/... Legacy business logic orchestration (being migrated toapplication/usecase/)wallet/key/... Key generation logic (HD wallet, seeds)wallet/wallets/... Wallet implementations (btcwallet, ethwallet, xrpwallet)
command/... Command implementations (keygen, sign, watch)config/... Configuration managementlogger/... Logging utilitiesdi/... Dependency injection containeraddress/... Address formatting and utilitiesaccount/... Account-related utilities (backward compatibility type aliases)contract/... Smart contract utilities (ERC-20 token ABI)converter/... Data conversion utilitiestestutil/... Test utilities
- ripple-lib-server
- ./web/ripple-lib-server
- erc20-token
- ./web/erc20-token
- Makefile - Main Makefile with modular includes
- Makefile modules (in
make/directory):- watch_op.mk - Watch wallet operations
- keygen_op.mk - Keygen wallet operations
- sign_op.mk - Sign wallet operations
- And other specialized modules for builds, tests, Docker, etc.
- Remove github.com/cpacia/bchutil due to outdated code. Try to replace to github.com/gcash/bchd
- Separate dependent test as Integration Test using tag (
//go:build integration) - Complete migration from
pkg/wallet/service/topkg/application/usecase/ - Add ATOM tokens on Cosmos Hub
- Add Polkadot
- Various monitoring patterns to detect suspicious operations.
- Add Github Action as CI
- Generate mnemonic instead of seed. bip-0039
- Setup Signet environment for development use
- Fix
overpaying fee issueon Signet. It says 725% overpaying. - native SegWit-Bech32
- Multisig-address is used only once because of security reason, so after tx is sent, related receiver addresses should be updated by is_allocated=true.
- Sent tx is not proceeded in bitcoin network if fee is not enough comparatively. So re-sending tx functionality is required adding more fee.
- Add any useful APIs using contract equivalent to ETH APIs
- Monitoring for ERC20 token
- Make sure that
quantity-tagis used properly. e.g. when getting balance, which quantity-tag should be used, latest or pending. - Handling secret of private key properly. Password could be passed from command line argument.
- Handling secret of private key properly. Password could be passed from command line argument.
This project follows Clean Architecture principles with clear layer separation:
Application Layer (application/usecase, wallet/service, command)
↓ depends on
Domain Layer (domain/*)
↑ implements interfaces defined by
Infrastructure Layer (infrastructure/*, wallet/key)
- Domain Layer: Pure business logic with zero infrastructure dependencies
- Application Layer: Use cases orchestrate business logic by coordinating domain objects and infrastructure services
- Infrastructure Layer: Implements interfaces defined by domain layer (Dependency Inversion Principle)
- Dependency Direction: Outer layers depend on inner layers, never the reverse
For detailed architecture guidelines, see AGENTS.md.
- The
pkglayout pattern, refer to the linked URLs for details.