Skip to content

hiromaily/go-crypto-wallet

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

go-crypto-wallet

Go Report Card codebeat badge GitHub release MIT License

Wallet functionalities to create raw transaction, to sign on unsigned transaction, to send signed transaction for BTC, BCH, ETH, XRP and so on.

What kind of coin can be used?

  • Bitcoin
  • Bitcoin Cash
  • Ethereum
  • ERC-20 Token
  • Ripple

Current development

  • 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 new pkg/application/usecase/ in progress
    • ✅ Integration tests separated using build tags (//go:build integration)
  • Bitcoin Core version 22.0 is released. Signet environment is ongoing.

Expected use cases

1.Deposit functionality

  • 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

2.Payment functionality

  • Users would want to withdraw their coins to specific addresses.
  • Transaction is created and sent after payment is requested by users.

3.Transfer functionality

  • Internal use. Each accounts can transfer coins among internal accounts.

Wallet Type

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.

1.Watch only wallet

  • 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.

2.Keygen wallet as cold wallet

  • 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.

3.Sign wallet as cold wallet (Auth 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 Wallet for own auth account
    • exporting full-pubkey addresses as csv file which is imported from Keygen wallet to generate multisig address
    • signing on unsigned transaction as second or more signs for multisig addresses.

Workflow diagram

BTC

1. Generate keys

generate keys

2. Create unsigned transaction, Sign on unsigned tx, Send signed tx for non-multisig address

create tx

3. Create unsigned transaction, Sign on unsigned tx, Send signed tx for multisig address

create tx for multisig

Requirements

Directory Structure

  • cmd ... app directories including main.go
    • keygen ... keygen wallet
    • sign ... sign wallet
    • watch ... watch wallet
  • data
    • address ... generated files by this CLI
    • certs ... for docker volume directory used by docker-compose.xrp.yml
    • config ... config toml files
    • contract ... generated token abi file
    • dump ... BTC wallet file generated by api dumpwallet command. See Makefile.
    • fullpubkey ... generated files by this CLI
    • gaiad ... genesis.json for cosmos gaiad
    • keystore ... keystore for Ethereum
    • proto ... proto files for ripple gRPC communication
  • docker ... docker resources
  • docs ... documents
  • images ... for only docs
  • pkg ... go files
  • scripts ... shell scripts
  • web
    • erc20-token ... erc20 token contract
    • ripple-lib-server ... Ripple gRPC server

pkg Directory Structure

The project follows Clean Architecture principles with clear layer separation:

Domain Layer (pkg/domain/)

Pure business logic with zero infrastructure dependencies:

  • domain/account/ ... Account types, validators, and business rules
  • domain/transaction/ ... Transaction types, state machine, validators
  • domain/wallet/ ... Wallet types and definitions
  • domain/key/ ... Key value objects and validators
  • domain/multisig/ ... Multisig validators and business rules
  • domain/coin/ ... Cryptocurrency type definitions

Application Layer (pkg/application/)

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)

Infrastructure Layer (pkg/infrastructure/)

External dependencies and implementations:

  • infrastructure/api/bitcoin/ ... Bitcoin/BCH Core RPC API clients. API References
  • infrastructure/api/ethereum/ ... Ethereum JSON-RPC API clients. API References
  • infrastructure/api/ripple/ ... Ripple gRPC API clients to communicate with ripple-lib-server
  • infrastructure/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)

Legacy/Transitional Packages

  • wallet/service/ ... Legacy business logic orchestration (being migrated to application/usecase/)
  • wallet/key/ ... Key generation logic (HD wallet, seeds)
  • wallet/wallets/ ... Wallet implementations (btcwallet, ethwallet, xrpwallet)

Shared Utilities

  • command/ ... Command implementations (keygen, sign, watch)
  • config/ ... Configuration management
  • logger/ ... Logging utilities
  • di/ ... Dependency injection container
  • address/ ... Address formatting and utilities
  • account/ ... Account-related utilities (backward compatibility type aliases)
  • contract/ ... Smart contract utilities (ERC-20 token ABI)
  • converter/ ... Data conversion utilities
  • testutil/ ... Test utilities

Components inside repository

  • ripple-lib-server
    • ./web/ripple-lib-server
  • erc20-token
    • ./web/erc20-token

Installation

Installation

Operation example

Command example

  • 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.

TODO

Basics

  • 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/ to pkg/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

For BTC/BCH

  • Setup Signet environment for development use
  • Fix overpaying fee issue on 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.

For ERC20 token

  • Add any useful APIs using contract equivalent to ETH APIs
  • Monitoring for ERC20 token

For ETH

  • Make sure that quantity-tag is 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.

For XRP

  • Handling secret of private key properly. Password could be passed from command line argument.

Architecture

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)

Key Principles

  • 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.

Project layout patterns

  • The pkg layout pattern, refer to the linked URLs for details.

About

Cryptocurrency wallet for trading for Bitcoin, Bitcoin cash, Ethereum, ERC20, Ripple

Topics

Resources

License

Stars

Watchers

Forks

Packages

No packages published

Contributors 3

  •  
  •  
  •