├── .deepsource.toml ├── .dockerignore ├── .github ├── FUNDING.yml └── workflows │ ├── build-push-docker.yml │ ├── code-analysis.yml │ └── releaser.yml ├── .gitignore ├── .golangci.yaml ├── Dockerfile ├── LICENSE ├── README.md ├── bip39 ├── bip39.go ├── bip39_test.go ├── wordlist.go └── wordlist.txt ├── db └── .gitkeep ├── go.mod ├── go.sum ├── internal ├── generators │ └── generators.go ├── progressbar │ └── progress_bar.go └── repository │ ├── gorm.go │ ├── repository.go │ └── stdout.go ├── main.go ├── utils ├── array.go ├── hex.go └── utils.go └── wallets ├── mnemonic.go ├── privatekey.go ├── wallet.go └── wallet_test.go /.deepsource.toml: -------------------------------------------------------------------------------- 1 | version = 1 2 | 3 | [[analyzers]] 4 | name = "go" 5 | enabled = true 6 | 7 | [analyzers.meta] 8 | import_root = "github.com/Planxnx/ethereum-wallet-generator" -------------------------------------------------------------------------------- /.dockerignore: -------------------------------------------------------------------------------- 1 | .git/ 2 | *.log 3 | 4 | *.exe 5 | *.exe~ 6 | *.dll 7 | *.so 8 | *.dylib 9 | 10 | *.test 11 | 12 | *.out 13 | 14 | *.db 15 | *.csv 16 | 17 | /volume* 18 | /wallet* 19 | -------------------------------------------------------------------------------- /.github/FUNDING.yml: -------------------------------------------------------------------------------- 1 | # These are supported funding model platforms 2 | 3 | github: [Planxnx] 4 | patreon: # Replace with a single Patreon username 5 | open_collective: # Replace with a single Open Collective username 6 | ko_fi: # Replace with a single Ko-fi username 7 | tidelift: # Replace with a single Tidelift platform-name/package-name e.g., npm/babel 8 | community_bridge: # Replace with a single Community Bridge project-name e.g., cloud-foundry 9 | liberapay: # Replace with a single Liberapay username 10 | issuehunt: # Replace with a single IssueHunt username 11 | otechie: # Replace with a single Otechie username 12 | lfx_crowdfunding: # Replace with a single LFX Crowdfunding project-name e.g., cloud-foundry 13 | custom: # Replace with up to 4 custom sponsorship URLs e.g., ['link1', 'link2'] 14 | -------------------------------------------------------------------------------- /.github/workflows/build-push-docker.yml: -------------------------------------------------------------------------------- 1 | name: Building and Push Docker Image to Docker Hub 2 | on: 3 | workflow_dispatch: 4 | release: 5 | types: [published] 6 | 7 | jobs: 8 | build: 9 | name: Build and Push Docker Image 10 | runs-on: ubuntu-latest 11 | env: 12 | IMAGE_NAME: ethereum-wallet-generator 13 | IMAGE_TAG: ${{ github.ref_name }} 14 | steps: 15 | - name: Set up QEMU 16 | uses: docker/setup-qemu-action@v2 17 | 18 | - name: Set default IMAGE_TAG environment variable 19 | if: env.IMAGE_TAG == null 20 | run: echo "IMAGE_TAG=latest" >> $GITHUB_ENV 21 | 22 | - name: Set up Docker Buildx 23 | uses: docker/setup-buildx-action@v2 24 | 25 | - name: Login to DockerHub 26 | uses: docker/login-action@v2 27 | with: 28 | username: ${{ secrets.DOCKERHUB_USERNAME }} 29 | password: ${{ secrets.DOCKERHUB_TOKEN }} 30 | 31 | - name: Build and push 32 | uses: docker/build-push-action@v3 33 | with: 34 | push: true 35 | tags: ${{ secrets.DOCKERHUB_USERNAME }}/${{ env.IMAGE_NAME }}:latest,${{ secrets.DOCKERHUB_USERNAME }}/${{ env.IMAGE_NAME }}:${{ env.IMAGE_TAG }} 36 | -------------------------------------------------------------------------------- /.github/workflows/code-analysis.yml: -------------------------------------------------------------------------------- 1 | name: Code Analysis & Tests 2 | on: 3 | workflow_dispatch: 4 | pull_request: 5 | branches: 6 | - main 7 | 8 | jobs: 9 | build: 10 | strategy: 11 | matrix: 12 | os: [ubuntu-latest, macos-latest] 13 | go-version: ["1.21.x", "1.x"] 14 | name: Lint, Test and Build (${{ matrix.os }}/${{ matrix.go-version }}) 15 | runs-on: ${{ matrix.os }} 16 | steps: 17 | - uses: actions/checkout@v4 18 | 19 | - name: Set up Go 20 | uses: actions/setup-go@v5 21 | with: 22 | go-version: ${{ matrix.go-version }} 23 | cache: true 24 | 25 | - name: Install dependencies 26 | run: go get ./... 27 | 28 | - name: Test 29 | run: go test ./... 30 | 31 | - name: Build 32 | run: go build 33 | 34 | - name: Run 35 | run: go run main.go 36 | 37 | - name: Display Go version 38 | run: go version 39 | 40 | - name: Lint 41 | uses: golangci/golangci-lint-action@v6 42 | with: 43 | version: latest 44 | args: --verbose 45 | -------------------------------------------------------------------------------- /.github/workflows/releaser.yml: -------------------------------------------------------------------------------- 1 | # WORK IN PROGRESS 2 | 3 | on: 4 | push: 5 | tags: 6 | - "v*" 7 | 8 | name: Release 9 | defaults: 10 | run: 11 | shell: bash 12 | jobs: 13 | # TODO: add `on.workflow_call` trigger in `code-analysis.yml` 14 | # lint: 15 | # name: Code Analysis & Tests 16 | # uses: planxnx/ethereum-wallet-generator/.github/workflows/code-analysis.yml@main 17 | release: 18 | name: Create Release 19 | runs-on: "ubuntu-latest" 20 | strategy: 21 | matrix: 22 | # List of GOOS and GOARCH pairs from `go tool dist list` 23 | goosarch: 24 | - "darwin/arm64" 25 | - "darwin/amd64" 26 | - "windows/amd64" 27 | # - "linux/amd64" 28 | # - "linux/arm64" 29 | steps: 30 | - name: Checkout code 31 | uses: actions/checkout@v4 32 | with: 33 | fetch-depth: 0 34 | - uses: actions/setup-go@v5 35 | with: 36 | go-version-file: "go.mod" 37 | cache: true # caching and restoring go modules and build outputs. 38 | - name: Prepare OS and Arch 39 | run: | 40 | GOOSARCH=${{matrix.goosarch}} 41 | GOOS=${GOOSARCH%/*} 42 | GOARCH=${GOOSARCH#*/} 43 | BINARY_NAME=${{github.repository}}-$GOOS-$GOARCH 44 | echo "BINARY_NAME=$BINARY_NAME" >> $GITHUB_ENV 45 | echo "GOOS=$GOOS" >> $GITHUB_ENV 46 | echo "GOARCH=$GOARCH" >> $GITHUB_ENV 47 | - name: Build 48 | run: | 49 | go build -o "$BINARY_NAME" -v 50 | - name: Release Notes 51 | run: git log $(git describe HEAD~ --tags --abbrev=0)..HEAD --pretty='format:* %h %s%n * %an <%ae>' --no-merges >> ".github/RELEASE-TEMPLATE.md" 52 | - name: Release with Notes 53 | uses: softprops/action-gh-release@v1 54 | with: 55 | body_path: ".github/RELEASE-TEMPLATE.md" 56 | draft: true 57 | files: ${{env.BINARY_NAME}} 58 | env: 59 | GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} 60 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Binaries for programs and plugins 2 | *.exe 3 | *.exe~ 4 | *.dll 5 | *.so 6 | *.dylib 7 | 8 | # Test binary, built with `go test -c` 9 | *.test 10 | test 11 | 12 | # Output of the go coverage tool, specifically when used with LiteIDE 13 | *.out 14 | 15 | # Dependency directories (remove the comment below to include it) 16 | # vendor/ 17 | 18 | # Wallets 19 | *.db 20 | *.csv 21 | 22 | /volume* 23 | 24 | -------------------------------------------------------------------------------- /.golangci.yaml: -------------------------------------------------------------------------------- 1 | # GolangCI-Lint 2 | # this workspace is using golangci-lint for linting, so you need to install it. 3 | ## MacOS Installation (HomeBrew) 4 | # $ brew install golangci-lint 5 | # See more: https://golangci-lint.run/usage/install/ 6 | ## VSCode Integrations (for User Settings) 7 | # 1. Open VSCode Settings (JSON) 8 | # 2. in configs, add field `go.lintTool` and value `golangci-lint` ("go.lintTool":"golangci-lint") 9 | # See more: https://golangci-lint.run/usage/integrations/ 10 | 11 | run: 12 | timeout: 5m 13 | tests: true 14 | allow-parallel-runners: true 15 | 16 | linters: # https://golangci-lint.run/usage/linters/ 17 | disable-all: true 18 | enable: 19 | ### Metalinter 20 | - staticcheck # bugs, metalinter - https://staticcheck.io 21 | - govet # bugs, metalinter 22 | - gocritic # style, metalinter - https://github.com/go-critic/go-critic 23 | - revive # style, metalinter - https://github.com/mgechev/revive 24 | # Enabled by Default 25 | - gocritic # style, metalinter - https://github.com/go-critic/go-critic 26 | - revive # style, metalinter - https://github.com/mgechev/revive 27 | - errcheck # bugs, error 28 | - gosimple # style 29 | - govet # bugs, metalinter 30 | - ineffassign # unused 31 | - typecheck # bugs 32 | - unused # unused 33 | # Other Linters 34 | # - dupl # style - code clone detection 35 | - bodyclose # performance, bugs - checks whether HTTP response body is closed successfully 36 | - decorder # format, style - check declaration order and count of types, constants, variables and functions 37 | - errorlint # bugs, error - find code that will cause problems with the error wrapping scheme introduced in Go 1.13. 38 | - goconst # style - Finds repeated strings that could be replaced by a constant 39 | - gosec # bugs - Inspects source code for security problems 40 | - misspell # style, comment - Finds commonly misspelled English words in comments. https://github.com/client9/misspell 41 | - noctx # performance, bugs - finds sending http request without context.Context 42 | - nosprintfhostport # style - Checks for misuse of Sprintf to construct a host with port in a URL. 43 | - prealloc # performance - Find slice declarations that could potentially be pre-allocated, https://github.com/alexkohler/prealloc 44 | - unconvert # style - unnecessary type conversions 45 | - usestdlibvars # style - detect the possibility to use variables/constants from the Go standard library 46 | - whitespace # style - detection of leading and trailing whitespace 47 | - wrapcheck # style, error - Checks that errors returned from external packages are wrapped, we should wrap the error from external library 48 | 49 | linters-settings: 50 | misspell: 51 | locale: US 52 | ignore-words: [] 53 | gocritic: 54 | enabled-tags: 55 | - diagnostic 56 | - style 57 | - performance 58 | - opinionated 59 | gosec: 60 | excludes: 61 | - G404 # Insecure random number source (rand) 62 | -------------------------------------------------------------------------------- /Dockerfile: -------------------------------------------------------------------------------- 1 | ############################ 2 | # STEP 1 build executable binary 3 | ############################ 4 | FROM golang:1.20.2-alpine AS builder 5 | RUN apk update && apk add build-base && apk add gcc 6 | WORKDIR /src/build 7 | COPY go.mod go.sum ./ 8 | RUN go mod download 9 | COPY . . 10 | ENV GOOS=linux 11 | ENV GOARCH=amd64 12 | RUN go build -o main . 13 | 14 | ############################ 15 | # STEP 2 build a small image 16 | ############################ 17 | FROM alpine:latest 18 | COPY --from=builder /src/build/main / 19 | WORKDIR / 20 | ENV GOGC= 21 | ENV GOMEMLIMIT= 22 | ENTRYPOINT ["./main","-compatible"] -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE 2 | Version 2, December 2004 3 | 4 | Copyright (C) 2023 Planxnx 5 | 6 | Everyone is permitted to copy and distribute verbatim or modified 7 | copies of this license document, and changing it is allowed as long 8 | as the name is changed. 9 | 10 | DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE 11 | TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION 12 | 13 | 0. You just DO WHAT THE FUCK YOU WANT TO. -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Ethereum Vanity Wallet Generator 2 | 3 |
4 |

5 | 6 | Ethereum Wallet Generator 7 |    8 | Ethereum Wallet Generator 9 |

10 |
11 |

12 | go ethereum 13 | go ethereum 14 | go ethereum 15 | go ethereum 16 | go ethereum 17 | go ethereum 18 | go ethereum 19 | go ethereum 20 | go ethereum 21 | go ethereum 22 |

23 |
24 | 25 | > **Blazing fast multiple Ethereum and Crypto Vanity Wallets Generator written in Go💰**
Generate a ten thousand crypto wallets (vanity address and mnemonic seed) in a sec ⚡️
Find beautiful and awesome vanity wallet addresses 🎨 26 | 27 | [![Golang](https://badges.aleen42.com/src/golang.svg)](https://golang.org/) 28 | [![Codacy Badge](https://app.codacy.com/project/badge/Grade/1d765b63df4b4266bdcf653d5a024458)](https://www.codacy.com/gh/Planxnx/ethereum-wallet-generator/dashboard?utm_source=github.com&utm_medium=referral&utm_content=Planxnx/ethereum-wallet-generator&utm_campaign=Badge_Grade) 29 | [![Docker Image Size (tag)](https://img.shields.io/docker/image-size/planxthanee/ethereum-wallet-generator/latest)](https://hub.docker.com/r/planxthanee/ethereum-wallet-generator) 30 | [![Code Analysis & Tests](https://github.com/planxnx/ethereum-wallet-generator/actions/workflows/code-analysis.yml/badge.svg)](https://github.com/planxnx/ethereum-wallet-generator/actions/workflows/code-analysis.yml) 31 | ![GitHub issues](https://img.shields.io/github/issues/Planxnx/ethereum-wallet-generator) 32 | [![DeepSource](https://deepsource.io/gh/Planxnx/ethereum-wallet-generator.svg/?label=active+issues)](https://deepsource.io/gh/Planxnx/ethereum-wallet-generator/?ref=repository-badge) 33 | [![license](https://img.shields.io/badge/license-WTFPL%20--%20Do%20What%20the%20Fuck%20You%20Want%20to%20Public%20License-green.svg)](https://github.com/planxnx/ethereum-wallet-generator/blob/main/LICENSE) 34 | 35 | ## Easy & Fast Way to create a million beauty Ethereum Vanity Wallets 🎨⚡️ 36 | 37 | ![ethereum and crypto wallets generated](https://user-images.githubusercontent.com/37617738/227807144-c1dc59ae-94fd-4fdf-9678-bf8c12e58cd4.png) 38 | 39 | - Awesome and Beautiful vanity wallet addresses supported! [regex, prefix, suffix, contains] 🎨 40 | - Blazing fast wallets generate. Speeding up to **+100k wallet/sec** (/w concurrency and only privatekey mode)⚡️ 41 | - Supports to generating until got the vanity wallet addresses you want 🤩 (using `-n -1` and `-limit ` flags) 42 | - ∞ Infinite wallet generating! (set number to 0 to active infinite loop) ∞ 43 | - Generate word seed phrase with BIP-39 mnemonic (support 12, 24 Word Seed Phrase) (Default is 128 bits for 12 words). 44 | - Embedded Database Supported! (with SQLite3). It's easiest to generate, manage, search a billion wallets without any pain. 45 | - Tiny Sizes and Superior Speed with Golang 🚀 (required go 1.21 or higher) 46 | - No Go? No Problem! [Docker images 🐳](https://hub.docker.com/r/planxthanee/ethereum-wallet-generator) or [exec files](https://github.com/Planxnx/ethereum-wallet-generator/releases/latest) are provided for you 47 | - You can benchmark generating speed by setting the `isDryrun` flag 📈 48 | - Default (HD Wallet)Hierarchical Deterministic Path - m/44'/60'/0'/0 . 49 | - We recommend every user of this application audit and verify every source code in this repository and every imported dependecies for its validity and clearness. 👮🏻‍♂️ 50 | 51 | ## What's a vanity address 🎨 52 | 53 | A vanity address is an address which part of it is chosen by yourself. Adding vanity to an address is used to give it personality, to reinforce a brand, to send a message, or to make the owner(s) feel cool 🤩 54 | 55 | Examples: `0x1111111254fb6c44bAC0beD2854e76F90643097d`, or `0x999999999aa3d5F44D48729b11c091Ed1f12f599` 56 | 57 | ## Installation 58 | 59 | gopher 60 | 61 | > **Homebrew is coming soon** 62 | 63 | 64 | 65 | ### Install from Source 66 | 67 | ```console 68 | $ go install github.com/planxnx/ethereum-wallet-generator@latest 69 | ``` 70 | 71 | ### Docker 72 | 73 | ```console 74 | $ docker pull planxthanee/ethereum-wallet-generator:latest 75 | ``` 76 | 77 | ### Download from latest release 78 | 79 | > supports only Windows x86-64 and macOs 80 | 81 | [Download](https://github.com/Planxnx/ethereum-wallet-generator/releases/latest) 82 | 83 | ## Modes 84 | 85 | We've provided 2 modes for you to generate wallets. 86 | 87 | - **[1] Normal Mode** - Generate wallets with mnemonic phrase. (default) 88 | - **[2] Only Private Key Mode⚡️** - Generate wallets with private key only. **Increase speed up to 20x (+100k wallet/sec), but you will not get a mnemonic phrase.** 89 | 90 | ## Usage 91 | 92 | ```console 93 | Usage of ethereum-wallet-generator: 94 | -n int set number of generate times (not number of result wallets) (set number to -1 for Infinite loop ∞, default 10) 95 | -limit int set limit number of result wallets. stop generate when result of vanity wallets reach the limit (set number to 0 for no limit, default 0) 96 | -db string set sqlite output file name eg. wallets.db (db file will create in `/db` folder) 97 | -c int set concurrency value (default 1) 98 | -bit int set number of entropy bits [128 for 12 words, 256 for 24 words] (default 128) 99 | -mode int set mode of wallet generator [1: normal mode, 2: only private key mode] 100 | -strict bool strict contains mode, resolve only the addresses that contain all the given letters (required contains to use) 101 | -contains string show only result that contained with the given letters (support for multiple characters) 102 | -prefix string show only result that prefix was matched with the given letters (support for single character) 103 | -suffix string show only result that suffix was matched with the given letters (support for single character) 104 | -regex string show only result that was matched with given regex (eg. ^0x99 or ^0x00) 105 | -dryrun bool generate wallet without a result (used for benchmark speed) 106 | -compatible bool logging compatible mode (turn this on to fix logging glitch) 107 | ``` 108 | 109 | ## Benchmark 110 | 111 | ### Normal Mode 112 | 113 | We've dryrun the generator on normal mode with 8 concurrents for 60,000 wallets on MacBook Air M1 2020 Memory 16 GB
114 | and got speed up to 6,468.58 wallet/sec. 115 | 116 | ```console 117 | ethereum-wallet-generator -n 60000 -dryrun -c 8 -mode 1 118 | ===============ETH Wallet Generator=============== 119 | 120 | 60000 / 60000 | [██████████████████████████████████████████████████████] | 100.00% | 6469 p/s | resolved: 60000 121 | 122 | Resolved Speed: 6468.58 w/s 123 | Total Duration: 9.275597416s 124 | Total Wallet Resolved: 60000 w 125 | 126 | Copyright (C) 2023 Planxnx 127 | ``` 128 | 129 | ### Only Private Key Mode ⚡️ 130 | 131 | We've dryrun the generator on only private key mode with 8 concurrents for 1,000,000 wallets on MacBook Air M1 2020 Memory 16 GB
132 | and got speed up to 111,778 wallet/sec. 133 | 134 | ```console 135 | ethereum-wallet-generator -n 1000000 -dryrun -c 8 -mode 2 136 | ===============ETH Wallet Generator=============== 137 | 138 | 1000000 / 1000000 | [███████████████████████████████████████████████] | 100.00% | 111778 p/s | resolved: 1000000 139 | 140 | Resolved Speed: 111778.55 w/s 141 | Total Duration: 8.94626016s 142 | Total Wallet Resolved: 1000000 w 143 | 144 | Copyright (C) 2023 Planxnx 145 | ``` 146 | 147 | ## Examples 148 | 149 | ### **Simple usgae:** 150 | 151 | ```console 152 | $ ethereum-wallet-generator 153 | # or 154 | $ ethereum-wallet-generator -mode 1 155 | ===============ETH Wallet Generator=============== 156 | 157 | 10 / 10 | [██████████████████████████████████████████████████████████████████████████████████████████] | 100.00% | 503 p/s | resovled: 10 158 | 159 | Address Seed 160 | ------------------------------------------ ------------------------------------------------------------------------------------------ 161 | 0x239ffa10fcd89b2359a5bd8c27c866cfad8eb75a lecture edge end come west mountain van wing zebra trumpet size wool 162 | 0x3addecebd6c63be1730205d249681a179e3c768b need decide earth farm punch crush banana unfold income month bread unhappy 163 | 0xc4f55b38e6e586cf974eb005e07482fd40274a26 hundred hundred canvas casual staff candy sign travel sort chat travel space 164 | 0xe8df7efc452801dc7c75137136c76006bbc2e6d6 gospel father funny pair catalog today champion maple valid feed loop write 165 | 0xdf2809a480e29a883a69beb6dedff095984f09eb poet impulse can undo vital stadium tattoo labor trap now blanket assume 166 | 0xabc91fd93be63474c14699a1697533410115824c aisle almost miracle coach practice ostrich thing solution ask kiss idle object 167 | 0xc9af163bbac66c1c75f3c5f67f758eed1c6077ba funny shift guilt lucky fringe install sugar forget wagon famous inject evoke 168 | 0xcf959644c8ee3c20ac9fbecc85610de067cca890 cupboard analyst remove sausage frame engage visual crowd deny boy firm stick 169 | 0xa8904e447afb9e0d9b601669aeca53c9b66fe058 sentence skin april wool huge dad bitter loyal perfect again document boring 170 | 0x107a842b628b999827730e4543314c6681c72b93 turkey shove mountain yellow ugly shoot crouch donor topple girl polar pelican 171 | 172 | 173 | Resolved Speed: 502.78 w/s 174 | Total Duration: 24.832485ms 175 | Total Wallet Resolved: 10 w 176 | 177 | ``` 178 | 179 | ### **🎨️⚡ Generate until got expected number of vanity addresses and Speeding up with concurrency:** 180 | 181 | ```console 182 | $ ethereum-wallet-generator -n -1 -limit 5 -contains 0x000,0x777 -c 8 183 | ===============ETH Wallet Generator=============== 184 | 185 | 12435 | [██████████████████████████████████████████████████████████████████████████████████████████] | 100.00% | 5073 p/s | resovled: 5 186 | 187 | Address Seed 188 | ------------------------------------------ ------------------------------------------------------------------------------------------ 189 | 0x0002e20a2528c4fe90af8dd10a38231d1d937531 jump skull butter topic bronze member feed wait flee oven deer rabbit 190 | 0x000ff528ae048f2cb71cea8cdeb0198ad45ff09f rotate change tooth design price milk derive olympic small sudden payment hover 191 | 0x000b98901463db593613e749d7a4803f24e3a7bb fish zone shift river sort visit begin hunt august trouble fatal easy 192 | 0x7772eef4d1f660d8cd0b89f4d6cdf90175b63b3a review today coil purity mouse lucky trip collect mail right weekend remove 193 | 0x77746fe800078d956b3176c367be88cdc39cd878 fiscal east exhibit arena expand indicate fury document vacuum mansion aisle garbage 194 | 195 | Resolved Speed: 1.48 w/s 196 | Total Duration: 2.4512123s 197 | Total Wallet Resolved: 5 w 198 | ``` 199 | 200 | ### **⚠⚡️ ️Extream speeding up with concurrency `Only Private Key mode` for generate vanity addresses:** 201 | 202 | ```console 203 | $ ethereum-wallet-generator -n -1 -limit 5 -contains 0x00000,0x11111 -c 8 -mode 2 204 | ===============ETH Wallet Generator=============== 205 | 206 | 252237 | [██████████████████████████████████████████████████████████████████████████████████████████] | ?% | 102903 p/s | resolved: 5 207 | Address Private Key 208 | ------------------------------------------ ------------------------------------------------------------------------------------------ 209 | 0x0000005927adc84c599084c48f50525617a76cf6 aaf26b1e0d137813bd221e59b3e072a5ad8b58e36c5d30ae19e8d0e5e19f287e 210 | 0x111111285bf095c0fa68bc170f9c23a43af9ead0 2826c6596897074a3545fce2904e961a69291efce09585c81417587603a6ca55 211 | 0x11111235eebd9d28420aaae50ac243e0be980618 7b1993e90956d929036918ddad9f5a4de3cd946bee569e01a0226be57de94862 212 | 0x000008a6481c0396d318c04417b4cdbc053aef1f d306a6f9808f073e455e11bddb206403d175874e327835dc06d6e81f325231b0 213 | 0x11111022d16444795ba8c5ee348f2f24650888af ec4263f4879837afa1c380b8252ffd0ddbe468b49a18254b47b4b1f22ea900da 214 | 215 | Resolved Speed: 1.48 w/s 216 | Total Duration: 2.4512123s 217 | Total Wallet Resolved: 5 w 218 | ``` 219 | 220 | ### **24 word seed prhase and filter vanity addresses with contains and strict options:** 221 | 222 | ```console 223 | $ ethereum-wallet-generator -n 50000 -limit 2 -contains 0x00,777,22 -strict -bit 256 224 | ===============ETH Wallet Generator=============== 225 | 226 | 31099 / 50000 | [██████████████████████████████████████████████████████████████████████████████████████████] | 100.00% | 2277 p/s | resovled: 2 227 | 228 | Address Seed 229 | ------------------------------------------ ------------------------------------------------------------------------------------------ 230 | 0x00325b7844a4c8612108f407c0ad722da3294777 delay pilot wall radio next uniform margin copper plunge kidney coil runway baby major token method arena brave expand route job raise budget buffalo 231 | 0x00ca8750521c2270e7776becd05d4a7d1b2ffdcb insect fashion original page stamp grow mean cinnamon embody favorite near useless relief crouch ranch nerve card captain situate truly cousin renew birth credit 232 | 233 | 234 | Resolved Speed: 0.14 w/s 235 | Total Duration: 13.857967333s 236 | Total Wallet Resolved: 2 w 237 | ``` 238 | 239 | ### **📚 Storing to embeded databse(SQLite3) to easily management:** 240 | 241 | ```console 242 | $ ethereum-wallet-generator -n 50000 -c 12 -db 0x77.db -prefix 0x77 243 | ===============ETH Wallet Generator=============== 244 | 245 | 50000 / 50000 | [██████████████████████████████████████████████████████████████████████████████████████████] | 100.00% | 5384 p/s | resovled: 178 246 | 247 | Resolved Speed: 16.04 w/s 248 | Total Duration: 11.09416725s 249 | Total Wallet Resolved: 178 w 250 | ``` 251 | 252 | ![image](https://user-images.githubusercontent.com/37617738/227806706-02a8a7fa-7d2b-43ca-b89b-c21cc51835ff.png) 253 | 254 | ### **🐳 Use Docker (recommend using concurrency for speed up):** 255 | 256 | ```console 257 | $ docker run --rm -v $PWD:/db planxthanee/ethereum-wallet-generator -n 50000 -db wallet.db -c 8 258 | ===============ETH Wallet Generator=============== 259 | 260 | 100% |██████████████████████████████████████| (50000/50000, 4651 w/s) [10s:95ms] 261 | 262 | Resolved Speed: 4563.50 w/s 263 | Total Duration: 10.9545307s 264 | Total Wallet Resolved: 50000 w 265 | 266 | ``` 267 | 268 | ## Thanks to 269 | 270 | - [conseweb/coinutil](https://github.com/conseweb/coinutil) - for BIP39 implementation in Go 271 | - [tyler-smith/go-bip39](https://github.com/tyler-smith/go-bip39) - for BIP39 implementation in Go 272 | 273 | ## Contributing ![eth](https://user-images.githubusercontent.com/37617738/120125730-1d1bd680-c1e4-11eb-83ad-45664245cae9.png) 274 | 275 | Pull requests are welcome! 276 | 277 | For contributions please create a new branch and submit a pull request for review. 278 | 279 | ## License 280 | 281 | This repo is released under the [WTFPL](http://www.wtfpl.net/) – Do What the Fuck You Want to Public License. 282 | -------------------------------------------------------------------------------- /bip39/bip39.go: -------------------------------------------------------------------------------- 1 | // Package bip39 is the Golang implementation of the BIP39 spec. 2 | // 3 | // This package is a optimized version of github.com/tyler-smith/go-bip39. 4 | // Thanks to Tyler Smith for the original implementation. 5 | // 6 | // The official BIP39 spec can be found at 7 | // https://github.com/bitcoin/bips/blob/master/bip-0039.mediawiki 8 | package bip39 9 | 10 | import ( 11 | "crypto/rand" 12 | "crypto/sha256" 13 | "crypto/sha512" 14 | "math/big" 15 | "strings" 16 | 17 | "github.com/pkg/errors" 18 | "golang.org/x/crypto/pbkdf2" 19 | ) 20 | 21 | var ( 22 | one = big.NewInt(1) 23 | two = big.NewInt(2) 24 | 25 | bitsChunkSize = 11 26 | shift11BitsMask = new(big.Int).Lsh(one, uint(bitsChunkSize)) // 2^11 = 2048 27 | last11BitsMask = new(big.Int).Sub(shift11BitsMask, one) // 2^11 - 1 = 2047 28 | ) 29 | 30 | // NewEntropy will create random entropy bytes 31 | // so long as the requested size bitSize is an appropriate size. 32 | // 33 | // bitSize has to be a multiple 32 and be within the inclusive range of {128, 256}. 34 | func NewEntropy(bitSize int) ([]byte, error) { 35 | if err := validateEntropyBitSize(bitSize); err != nil { 36 | return nil, errors.WithStack(err) 37 | } 38 | 39 | entropy := make([]byte, bitSize/8) 40 | if _, err := rand.Read(entropy); err != nil { 41 | return nil, errors.WithStack(err) 42 | } 43 | 44 | return entropy, nil 45 | } 46 | 47 | // NewMnemonic will return a string consisting of the mnemonic words for 48 | // the given entropy. 49 | // If the provide entropy is invalid, an error will be returned. 50 | func NewMnemonic(entropy []byte) (string, error) { 51 | // Compute some lengths for convenience. 52 | entropyBitLength := len(entropy) * 8 53 | checksumBitLength := entropyBitLength / 32 54 | sentenceLength := (entropyBitLength + checksumBitLength) / bitsChunkSize 55 | 56 | // Validate that the requested size is supported. 57 | err := validateEntropyBitSize(entropyBitLength) 58 | if err != nil { 59 | return "", err 60 | } 61 | 62 | // Add checksum to entropy. 63 | // Entropy as an int so we can bitmask without worrying about bytes slices. 64 | entropyInt := addChecksum(entropy) 65 | 66 | // Throw away big.Int for AND masking. 67 | word := big.NewInt(0) 68 | 69 | // Slice to hold words in. 70 | words := make([]string, sentenceLength) 71 | 72 | // Break entropy up into sentenceLength chunks of 11 bits. 73 | // For each word AND mask the rightmost 11 bits and find the word at that index. 74 | // Then bitshift entropy 11 bits right and repeat. 75 | // Add to the last empty slot so we can work with LSBs instead of MSB. 76 | for i := sentenceLength - 1; i >= 0; i-- { 77 | // Get 11 right most bits and bitshift 11 to the right for next time. 78 | word.And(entropyInt, last11BitsMask) 79 | entropyInt.Div(entropyInt, shift11BitsMask) 80 | 81 | // Convert bytes to an index and add that word to the list. 82 | words[i] = Words[word.Uint64()] 83 | } 84 | 85 | return strings.Join(words, " "), nil 86 | } 87 | 88 | // NewSeed creates a hashed seed output given a provided string and password. 89 | // No checking is performed to validate that the string provided is a valid mnemonic. 90 | func NewSeed(mnemonic, password string) []byte { 91 | return pbkdf2.Key([]byte(mnemonic), []byte("mnemonic"+password), 2048, 64, sha512.New) 92 | } 93 | 94 | // Appends to data the first (len(data) / 32)bits of the result of sha256(data) 95 | // abd returns the result as a big.Int. 96 | // 97 | // Currently only supports data up to 32 bytes. 98 | func addChecksum(data []byte) *big.Int { 99 | // Get first byte of sha256 100 | hash := computeChecksum(data) 101 | firstChecksumByte := hash[0] 102 | 103 | // len() is in bytes so we divide by 4 104 | checksumBitLength := uint(len(data) / 4) 105 | 106 | // For each bit of check sum we want we shift the data one the left 107 | // and then set the (new) right most bit equal to checksum bit at that index 108 | // staring from the left 109 | dataInt := new(big.Int).SetBytes(data) 110 | for i := uint(0); i < checksumBitLength; i++ { 111 | // Bitshift 1 left 112 | dataInt.Mul(dataInt, two) 113 | 114 | // Set rightmost bit if leftmost checksum bit is set 115 | if firstChecksumByte&(1<<(7-i)) > 0 { 116 | dataInt.Or(dataInt, one) 117 | } 118 | } 119 | 120 | return dataInt 121 | } 122 | 123 | func computeChecksum(data []byte) []byte { 124 | hasher := sha256.New() 125 | _, _ = hasher.Write(data) // This error is guaranteed to be nil 126 | return hasher.Sum(nil) 127 | } 128 | 129 | // validateEntropyBitSize ensures that entropy is the correct size for being a mnemonic. 130 | func validateEntropyBitSize(bitSize int) error { 131 | if (bitSize%32) != 0 || bitSize < 128 || bitSize > 256 { 132 | return errors.New("Entropy length must between range of [128,256] and a multiple of 32") 133 | } 134 | 135 | return nil 136 | } 137 | -------------------------------------------------------------------------------- /bip39/bip39_test.go: -------------------------------------------------------------------------------- 1 | package bip39 2 | 3 | import ( 4 | "fmt" 5 | "testing" 6 | 7 | "github.com/stretchr/testify/assert" 8 | "github.com/tyler-smith/go-bip39" 9 | ) 10 | 11 | // nolint: wrapcheck,gocritic 12 | func BenchmarkBIP39(b *testing.B) { 13 | bitSizes := []int{128, 256} 14 | 15 | generators := map[string]func(entropy []byte) (string, error){ 16 | "old": bip39.NewMnemonic, 17 | "new": NewMnemonic, 18 | } 19 | 20 | for name, generator := range generators { 21 | for _, bitSize := range bitSizes { 22 | b.Run(fmt.Sprintf("%s:%d", name, bitSize), func(b *testing.B) { 23 | b.ResetTimer() 24 | entropy, err := bip39.NewEntropy(bitSize) 25 | if err != nil { 26 | b.Fatal(err) 27 | } 28 | for i := 0; i < b.N; i++ { 29 | _, _ = generator(entropy) 30 | } 31 | }) 32 | } 33 | } 34 | } 35 | 36 | func TestGenerateFromEntropy(t *testing.T) { 37 | type TestSpec struct { 38 | entropy []byte 39 | expectedMnemonic string 40 | } 41 | 42 | testCases := map[string][]TestSpec{ 43 | "128bits": { 44 | { 45 | entropy: []byte{157, 167, 82, 14, 138, 57, 220, 233, 60, 83, 236, 19, 121, 207, 199, 151}, 46 | expectedMnemonic: "oval dentist lonely behave oven innocent vanish laugh beach solar vehicle connect", 47 | }, 48 | { 49 | entropy: []byte{103, 15, 41, 115, 192, 199, 222, 77, 33, 34, 50, 57, 174, 229, 13, 231}, 50 | expectedMnemonic: "grow junk friend light law charge loyal edge defy jaguar drop sort", 51 | }, 52 | { 53 | entropy: []byte{172, 237, 228, 119, 25, 39, 253, 133, 139, 151, 201, 62, 48, 247, 58, 15}, 54 | expectedMnemonic: "provide hundred build crane lemon security comic weird dilemma marble soldier butter", 55 | }, 56 | { 57 | entropy: []byte{41, 126, 238, 172, 119, 220, 20, 164, 174, 84, 12, 165, 14, 128, 206, 240}, 58 | expectedMnemonic: "city wash prison use scout false rich light pink inject crisp ticket", 59 | }, 60 | { 61 | entropy: []byte{21, 42, 240, 221, 4, 84, 149, 97, 139, 174, 9, 186, 150, 186, 144, 14}, 62 | expectedMnemonic: "benefit fiscal dance anger enable radio concert scorpion ritual remind piano bronze", 63 | }, 64 | }, 65 | "256bits": { 66 | { 67 | entropy: []byte{6, 137, 161, 26, 237, 39, 33, 110, 228, 193, 105, 245, 181, 108, 133, 38, 168, 102, 174, 148, 240, 219, 81, 74, 194, 162, 228, 218, 16, 148, 57, 156}, 68 | expectedMnemonic: "alley escape effort surge improve resist narrow coffee volcano problem candy essence major firm fatigue bread eyebrow figure post situate patient energy toy menu", 69 | }, 70 | { 71 | entropy: []byte{24, 191, 8, 191, 188, 214, 228, 149, 31, 99, 124, 92, 243, 25, 195, 46, 56, 206, 78, 177, 177, 183, 231, 19, 100, 156, 57, 0, 124, 102, 156, 96}, 72 | expectedMnemonic: "board weapon copper keen hour enhance laugh hurdle friend occur ignore fragile mind chef short dad train open check improve amazing crew immense bonus", 73 | }, 74 | }, 75 | } 76 | 77 | for name, testSpecs := range testCases { 78 | t.Run(name, func(t *testing.T) { 79 | for _, testSpec := range testSpecs { 80 | actualMnemonic, err := NewMnemonic(testSpec.entropy) 81 | if err != nil { 82 | t.Errorf("failed to generate mnemonic %+v", err) 83 | } 84 | 85 | assert.Equal(t, testSpec.expectedMnemonic, actualMnemonic) 86 | } 87 | }) 88 | } 89 | } 90 | -------------------------------------------------------------------------------- /bip39/wordlist.go: -------------------------------------------------------------------------------- 1 | // nolint 2 | package bip39 3 | 4 | import ( 5 | _ "embed" 6 | "hash/crc32" 7 | "strings" 8 | 9 | "github.com/pkg/errors" 10 | ) 11 | 12 | //go:embed wordlist.txt 13 | var words string 14 | 15 | // Words a slice of mnemonic words taken from the bip39 specification 16 | // https://raw.githubusercontent.com/bitcoin/bips/master/bip-0039/english.txt 17 | var ( 18 | Words = strings.Split(strings.TrimSpace(words), "\n") 19 | ) 20 | 21 | func init() { 22 | // Ensure word list is correct 23 | // $ wget https://raw.githubusercontent.com/bitcoin/bips/master/bip-0039/english.txt 24 | // $ crc32 english.txt 25 | // OUTPUT: c1dbd296 26 | checksum := crc32.ChecksumIEEE([]byte(words)) 27 | if checksum != 0xc1dbd296 { 28 | panic(errors.Errorf("wordlist checksum mismatch: expected %x, got %x", 0xc1dbd296, checksum)) 29 | } 30 | } 31 | -------------------------------------------------------------------------------- /bip39/wordlist.txt: -------------------------------------------------------------------------------- 1 | abandon 2 | ability 3 | able 4 | about 5 | above 6 | absent 7 | absorb 8 | abstract 9 | absurd 10 | abuse 11 | access 12 | accident 13 | account 14 | accuse 15 | achieve 16 | acid 17 | acoustic 18 | acquire 19 | across 20 | act 21 | action 22 | actor 23 | actress 24 | actual 25 | adapt 26 | add 27 | addict 28 | address 29 | adjust 30 | admit 31 | adult 32 | advance 33 | advice 34 | aerobic 35 | affair 36 | afford 37 | afraid 38 | again 39 | age 40 | agent 41 | agree 42 | ahead 43 | aim 44 | air 45 | airport 46 | aisle 47 | alarm 48 | album 49 | alcohol 50 | alert 51 | alien 52 | all 53 | alley 54 | allow 55 | almost 56 | alone 57 | alpha 58 | already 59 | also 60 | alter 61 | always 62 | amateur 63 | amazing 64 | among 65 | amount 66 | amused 67 | analyst 68 | anchor 69 | ancient 70 | anger 71 | angle 72 | angry 73 | animal 74 | ankle 75 | announce 76 | annual 77 | another 78 | answer 79 | antenna 80 | antique 81 | anxiety 82 | any 83 | apart 84 | apology 85 | appear 86 | apple 87 | approve 88 | april 89 | arch 90 | arctic 91 | area 92 | arena 93 | argue 94 | arm 95 | armed 96 | armor 97 | army 98 | around 99 | arrange 100 | arrest 101 | arrive 102 | arrow 103 | art 104 | artefact 105 | artist 106 | artwork 107 | ask 108 | aspect 109 | assault 110 | asset 111 | assist 112 | assume 113 | asthma 114 | athlete 115 | atom 116 | attack 117 | attend 118 | attitude 119 | attract 120 | auction 121 | audit 122 | august 123 | aunt 124 | author 125 | auto 126 | autumn 127 | average 128 | avocado 129 | avoid 130 | awake 131 | aware 132 | away 133 | awesome 134 | awful 135 | awkward 136 | axis 137 | baby 138 | bachelor 139 | bacon 140 | badge 141 | bag 142 | balance 143 | balcony 144 | ball 145 | bamboo 146 | banana 147 | banner 148 | bar 149 | barely 150 | bargain 151 | barrel 152 | base 153 | basic 154 | basket 155 | battle 156 | beach 157 | bean 158 | beauty 159 | because 160 | become 161 | beef 162 | before 163 | begin 164 | behave 165 | behind 166 | believe 167 | below 168 | belt 169 | bench 170 | benefit 171 | best 172 | betray 173 | better 174 | between 175 | beyond 176 | bicycle 177 | bid 178 | bike 179 | bind 180 | biology 181 | bird 182 | birth 183 | bitter 184 | black 185 | blade 186 | blame 187 | blanket 188 | blast 189 | bleak 190 | bless 191 | blind 192 | blood 193 | blossom 194 | blouse 195 | blue 196 | blur 197 | blush 198 | board 199 | boat 200 | body 201 | boil 202 | bomb 203 | bone 204 | bonus 205 | book 206 | boost 207 | border 208 | boring 209 | borrow 210 | boss 211 | bottom 212 | bounce 213 | box 214 | boy 215 | bracket 216 | brain 217 | brand 218 | brass 219 | brave 220 | bread 221 | breeze 222 | brick 223 | bridge 224 | brief 225 | bright 226 | bring 227 | brisk 228 | broccoli 229 | broken 230 | bronze 231 | broom 232 | brother 233 | brown 234 | brush 235 | bubble 236 | buddy 237 | budget 238 | buffalo 239 | build 240 | bulb 241 | bulk 242 | bullet 243 | bundle 244 | bunker 245 | burden 246 | burger 247 | burst 248 | bus 249 | business 250 | busy 251 | butter 252 | buyer 253 | buzz 254 | cabbage 255 | cabin 256 | cable 257 | cactus 258 | cage 259 | cake 260 | call 261 | calm 262 | camera 263 | camp 264 | can 265 | canal 266 | cancel 267 | candy 268 | cannon 269 | canoe 270 | canvas 271 | canyon 272 | capable 273 | capital 274 | captain 275 | car 276 | carbon 277 | card 278 | cargo 279 | carpet 280 | carry 281 | cart 282 | case 283 | cash 284 | casino 285 | castle 286 | casual 287 | cat 288 | catalog 289 | catch 290 | category 291 | cattle 292 | caught 293 | cause 294 | caution 295 | cave 296 | ceiling 297 | celery 298 | cement 299 | census 300 | century 301 | cereal 302 | certain 303 | chair 304 | chalk 305 | champion 306 | change 307 | chaos 308 | chapter 309 | charge 310 | chase 311 | chat 312 | cheap 313 | check 314 | cheese 315 | chef 316 | cherry 317 | chest 318 | chicken 319 | chief 320 | child 321 | chimney 322 | choice 323 | choose 324 | chronic 325 | chuckle 326 | chunk 327 | churn 328 | cigar 329 | cinnamon 330 | circle 331 | citizen 332 | city 333 | civil 334 | claim 335 | clap 336 | clarify 337 | claw 338 | clay 339 | clean 340 | clerk 341 | clever 342 | click 343 | client 344 | cliff 345 | climb 346 | clinic 347 | clip 348 | clock 349 | clog 350 | close 351 | cloth 352 | cloud 353 | clown 354 | club 355 | clump 356 | cluster 357 | clutch 358 | coach 359 | coast 360 | coconut 361 | code 362 | coffee 363 | coil 364 | coin 365 | collect 366 | color 367 | column 368 | combine 369 | come 370 | comfort 371 | comic 372 | common 373 | company 374 | concert 375 | conduct 376 | confirm 377 | congress 378 | connect 379 | consider 380 | control 381 | convince 382 | cook 383 | cool 384 | copper 385 | copy 386 | coral 387 | core 388 | corn 389 | correct 390 | cost 391 | cotton 392 | couch 393 | country 394 | couple 395 | course 396 | cousin 397 | cover 398 | coyote 399 | crack 400 | cradle 401 | craft 402 | cram 403 | crane 404 | crash 405 | crater 406 | crawl 407 | crazy 408 | cream 409 | credit 410 | creek 411 | crew 412 | cricket 413 | crime 414 | crisp 415 | critic 416 | crop 417 | cross 418 | crouch 419 | crowd 420 | crucial 421 | cruel 422 | cruise 423 | crumble 424 | crunch 425 | crush 426 | cry 427 | crystal 428 | cube 429 | culture 430 | cup 431 | cupboard 432 | curious 433 | current 434 | curtain 435 | curve 436 | cushion 437 | custom 438 | cute 439 | cycle 440 | dad 441 | damage 442 | damp 443 | dance 444 | danger 445 | daring 446 | dash 447 | daughter 448 | dawn 449 | day 450 | deal 451 | debate 452 | debris 453 | decade 454 | december 455 | decide 456 | decline 457 | decorate 458 | decrease 459 | deer 460 | defense 461 | define 462 | defy 463 | degree 464 | delay 465 | deliver 466 | demand 467 | demise 468 | denial 469 | dentist 470 | deny 471 | depart 472 | depend 473 | deposit 474 | depth 475 | deputy 476 | derive 477 | describe 478 | desert 479 | design 480 | desk 481 | despair 482 | destroy 483 | detail 484 | detect 485 | develop 486 | device 487 | devote 488 | diagram 489 | dial 490 | diamond 491 | diary 492 | dice 493 | diesel 494 | diet 495 | differ 496 | digital 497 | dignity 498 | dilemma 499 | dinner 500 | dinosaur 501 | direct 502 | dirt 503 | disagree 504 | discover 505 | disease 506 | dish 507 | dismiss 508 | disorder 509 | display 510 | distance 511 | divert 512 | divide 513 | divorce 514 | dizzy 515 | doctor 516 | document 517 | dog 518 | doll 519 | dolphin 520 | domain 521 | donate 522 | donkey 523 | donor 524 | door 525 | dose 526 | double 527 | dove 528 | draft 529 | dragon 530 | drama 531 | drastic 532 | draw 533 | dream 534 | dress 535 | drift 536 | drill 537 | drink 538 | drip 539 | drive 540 | drop 541 | drum 542 | dry 543 | duck 544 | dumb 545 | dune 546 | during 547 | dust 548 | dutch 549 | duty 550 | dwarf 551 | dynamic 552 | eager 553 | eagle 554 | early 555 | earn 556 | earth 557 | easily 558 | east 559 | easy 560 | echo 561 | ecology 562 | economy 563 | edge 564 | edit 565 | educate 566 | effort 567 | egg 568 | eight 569 | either 570 | elbow 571 | elder 572 | electric 573 | elegant 574 | element 575 | elephant 576 | elevator 577 | elite 578 | else 579 | embark 580 | embody 581 | embrace 582 | emerge 583 | emotion 584 | employ 585 | empower 586 | empty 587 | enable 588 | enact 589 | end 590 | endless 591 | endorse 592 | enemy 593 | energy 594 | enforce 595 | engage 596 | engine 597 | enhance 598 | enjoy 599 | enlist 600 | enough 601 | enrich 602 | enroll 603 | ensure 604 | enter 605 | entire 606 | entry 607 | envelope 608 | episode 609 | equal 610 | equip 611 | era 612 | erase 613 | erode 614 | erosion 615 | error 616 | erupt 617 | escape 618 | essay 619 | essence 620 | estate 621 | eternal 622 | ethics 623 | evidence 624 | evil 625 | evoke 626 | evolve 627 | exact 628 | example 629 | excess 630 | exchange 631 | excite 632 | exclude 633 | excuse 634 | execute 635 | exercise 636 | exhaust 637 | exhibit 638 | exile 639 | exist 640 | exit 641 | exotic 642 | expand 643 | expect 644 | expire 645 | explain 646 | expose 647 | express 648 | extend 649 | extra 650 | eye 651 | eyebrow 652 | fabric 653 | face 654 | faculty 655 | fade 656 | faint 657 | faith 658 | fall 659 | false 660 | fame 661 | family 662 | famous 663 | fan 664 | fancy 665 | fantasy 666 | farm 667 | fashion 668 | fat 669 | fatal 670 | father 671 | fatigue 672 | fault 673 | favorite 674 | feature 675 | february 676 | federal 677 | fee 678 | feed 679 | feel 680 | female 681 | fence 682 | festival 683 | fetch 684 | fever 685 | few 686 | fiber 687 | fiction 688 | field 689 | figure 690 | file 691 | film 692 | filter 693 | final 694 | find 695 | fine 696 | finger 697 | finish 698 | fire 699 | firm 700 | first 701 | fiscal 702 | fish 703 | fit 704 | fitness 705 | fix 706 | flag 707 | flame 708 | flash 709 | flat 710 | flavor 711 | flee 712 | flight 713 | flip 714 | float 715 | flock 716 | floor 717 | flower 718 | fluid 719 | flush 720 | fly 721 | foam 722 | focus 723 | fog 724 | foil 725 | fold 726 | follow 727 | food 728 | foot 729 | force 730 | forest 731 | forget 732 | fork 733 | fortune 734 | forum 735 | forward 736 | fossil 737 | foster 738 | found 739 | fox 740 | fragile 741 | frame 742 | frequent 743 | fresh 744 | friend 745 | fringe 746 | frog 747 | front 748 | frost 749 | frown 750 | frozen 751 | fruit 752 | fuel 753 | fun 754 | funny 755 | furnace 756 | fury 757 | future 758 | gadget 759 | gain 760 | galaxy 761 | gallery 762 | game 763 | gap 764 | garage 765 | garbage 766 | garden 767 | garlic 768 | garment 769 | gas 770 | gasp 771 | gate 772 | gather 773 | gauge 774 | gaze 775 | general 776 | genius 777 | genre 778 | gentle 779 | genuine 780 | gesture 781 | ghost 782 | giant 783 | gift 784 | giggle 785 | ginger 786 | giraffe 787 | girl 788 | give 789 | glad 790 | glance 791 | glare 792 | glass 793 | glide 794 | glimpse 795 | globe 796 | gloom 797 | glory 798 | glove 799 | glow 800 | glue 801 | goat 802 | goddess 803 | gold 804 | good 805 | goose 806 | gorilla 807 | gospel 808 | gossip 809 | govern 810 | gown 811 | grab 812 | grace 813 | grain 814 | grant 815 | grape 816 | grass 817 | gravity 818 | great 819 | green 820 | grid 821 | grief 822 | grit 823 | grocery 824 | group 825 | grow 826 | grunt 827 | guard 828 | guess 829 | guide 830 | guilt 831 | guitar 832 | gun 833 | gym 834 | habit 835 | hair 836 | half 837 | hammer 838 | hamster 839 | hand 840 | happy 841 | harbor 842 | hard 843 | harsh 844 | harvest 845 | hat 846 | have 847 | hawk 848 | hazard 849 | head 850 | health 851 | heart 852 | heavy 853 | hedgehog 854 | height 855 | hello 856 | helmet 857 | help 858 | hen 859 | hero 860 | hidden 861 | high 862 | hill 863 | hint 864 | hip 865 | hire 866 | history 867 | hobby 868 | hockey 869 | hold 870 | hole 871 | holiday 872 | hollow 873 | home 874 | honey 875 | hood 876 | hope 877 | horn 878 | horror 879 | horse 880 | hospital 881 | host 882 | hotel 883 | hour 884 | hover 885 | hub 886 | huge 887 | human 888 | humble 889 | humor 890 | hundred 891 | hungry 892 | hunt 893 | hurdle 894 | hurry 895 | hurt 896 | husband 897 | hybrid 898 | ice 899 | icon 900 | idea 901 | identify 902 | idle 903 | ignore 904 | ill 905 | illegal 906 | illness 907 | image 908 | imitate 909 | immense 910 | immune 911 | impact 912 | impose 913 | improve 914 | impulse 915 | inch 916 | include 917 | income 918 | increase 919 | index 920 | indicate 921 | indoor 922 | industry 923 | infant 924 | inflict 925 | inform 926 | inhale 927 | inherit 928 | initial 929 | inject 930 | injury 931 | inmate 932 | inner 933 | innocent 934 | input 935 | inquiry 936 | insane 937 | insect 938 | inside 939 | inspire 940 | install 941 | intact 942 | interest 943 | into 944 | invest 945 | invite 946 | involve 947 | iron 948 | island 949 | isolate 950 | issue 951 | item 952 | ivory 953 | jacket 954 | jaguar 955 | jar 956 | jazz 957 | jealous 958 | jeans 959 | jelly 960 | jewel 961 | job 962 | join 963 | joke 964 | journey 965 | joy 966 | judge 967 | juice 968 | jump 969 | jungle 970 | junior 971 | junk 972 | just 973 | kangaroo 974 | keen 975 | keep 976 | ketchup 977 | key 978 | kick 979 | kid 980 | kidney 981 | kind 982 | kingdom 983 | kiss 984 | kit 985 | kitchen 986 | kite 987 | kitten 988 | kiwi 989 | knee 990 | knife 991 | knock 992 | know 993 | lab 994 | label 995 | labor 996 | ladder 997 | lady 998 | lake 999 | lamp 1000 | language 1001 | laptop 1002 | large 1003 | later 1004 | latin 1005 | laugh 1006 | laundry 1007 | lava 1008 | law 1009 | lawn 1010 | lawsuit 1011 | layer 1012 | lazy 1013 | leader 1014 | leaf 1015 | learn 1016 | leave 1017 | lecture 1018 | left 1019 | leg 1020 | legal 1021 | legend 1022 | leisure 1023 | lemon 1024 | lend 1025 | length 1026 | lens 1027 | leopard 1028 | lesson 1029 | letter 1030 | level 1031 | liar 1032 | liberty 1033 | library 1034 | license 1035 | life 1036 | lift 1037 | light 1038 | like 1039 | limb 1040 | limit 1041 | link 1042 | lion 1043 | liquid 1044 | list 1045 | little 1046 | live 1047 | lizard 1048 | load 1049 | loan 1050 | lobster 1051 | local 1052 | lock 1053 | logic 1054 | lonely 1055 | long 1056 | loop 1057 | lottery 1058 | loud 1059 | lounge 1060 | love 1061 | loyal 1062 | lucky 1063 | luggage 1064 | lumber 1065 | lunar 1066 | lunch 1067 | luxury 1068 | lyrics 1069 | machine 1070 | mad 1071 | magic 1072 | magnet 1073 | maid 1074 | mail 1075 | main 1076 | major 1077 | make 1078 | mammal 1079 | man 1080 | manage 1081 | mandate 1082 | mango 1083 | mansion 1084 | manual 1085 | maple 1086 | marble 1087 | march 1088 | margin 1089 | marine 1090 | market 1091 | marriage 1092 | mask 1093 | mass 1094 | master 1095 | match 1096 | material 1097 | math 1098 | matrix 1099 | matter 1100 | maximum 1101 | maze 1102 | meadow 1103 | mean 1104 | measure 1105 | meat 1106 | mechanic 1107 | medal 1108 | media 1109 | melody 1110 | melt 1111 | member 1112 | memory 1113 | mention 1114 | menu 1115 | mercy 1116 | merge 1117 | merit 1118 | merry 1119 | mesh 1120 | message 1121 | metal 1122 | method 1123 | middle 1124 | midnight 1125 | milk 1126 | million 1127 | mimic 1128 | mind 1129 | minimum 1130 | minor 1131 | minute 1132 | miracle 1133 | mirror 1134 | misery 1135 | miss 1136 | mistake 1137 | mix 1138 | mixed 1139 | mixture 1140 | mobile 1141 | model 1142 | modify 1143 | mom 1144 | moment 1145 | monitor 1146 | monkey 1147 | monster 1148 | month 1149 | moon 1150 | moral 1151 | more 1152 | morning 1153 | mosquito 1154 | mother 1155 | motion 1156 | motor 1157 | mountain 1158 | mouse 1159 | move 1160 | movie 1161 | much 1162 | muffin 1163 | mule 1164 | multiply 1165 | muscle 1166 | museum 1167 | mushroom 1168 | music 1169 | must 1170 | mutual 1171 | myself 1172 | mystery 1173 | myth 1174 | naive 1175 | name 1176 | napkin 1177 | narrow 1178 | nasty 1179 | nation 1180 | nature 1181 | near 1182 | neck 1183 | need 1184 | negative 1185 | neglect 1186 | neither 1187 | nephew 1188 | nerve 1189 | nest 1190 | net 1191 | network 1192 | neutral 1193 | never 1194 | news 1195 | next 1196 | nice 1197 | night 1198 | noble 1199 | noise 1200 | nominee 1201 | noodle 1202 | normal 1203 | north 1204 | nose 1205 | notable 1206 | note 1207 | nothing 1208 | notice 1209 | novel 1210 | now 1211 | nuclear 1212 | number 1213 | nurse 1214 | nut 1215 | oak 1216 | obey 1217 | object 1218 | oblige 1219 | obscure 1220 | observe 1221 | obtain 1222 | obvious 1223 | occur 1224 | ocean 1225 | october 1226 | odor 1227 | off 1228 | offer 1229 | office 1230 | often 1231 | oil 1232 | okay 1233 | old 1234 | olive 1235 | olympic 1236 | omit 1237 | once 1238 | one 1239 | onion 1240 | online 1241 | only 1242 | open 1243 | opera 1244 | opinion 1245 | oppose 1246 | option 1247 | orange 1248 | orbit 1249 | orchard 1250 | order 1251 | ordinary 1252 | organ 1253 | orient 1254 | original 1255 | orphan 1256 | ostrich 1257 | other 1258 | outdoor 1259 | outer 1260 | output 1261 | outside 1262 | oval 1263 | oven 1264 | over 1265 | own 1266 | owner 1267 | oxygen 1268 | oyster 1269 | ozone 1270 | pact 1271 | paddle 1272 | page 1273 | pair 1274 | palace 1275 | palm 1276 | panda 1277 | panel 1278 | panic 1279 | panther 1280 | paper 1281 | parade 1282 | parent 1283 | park 1284 | parrot 1285 | party 1286 | pass 1287 | patch 1288 | path 1289 | patient 1290 | patrol 1291 | pattern 1292 | pause 1293 | pave 1294 | payment 1295 | peace 1296 | peanut 1297 | pear 1298 | peasant 1299 | pelican 1300 | pen 1301 | penalty 1302 | pencil 1303 | people 1304 | pepper 1305 | perfect 1306 | permit 1307 | person 1308 | pet 1309 | phone 1310 | photo 1311 | phrase 1312 | physical 1313 | piano 1314 | picnic 1315 | picture 1316 | piece 1317 | pig 1318 | pigeon 1319 | pill 1320 | pilot 1321 | pink 1322 | pioneer 1323 | pipe 1324 | pistol 1325 | pitch 1326 | pizza 1327 | place 1328 | planet 1329 | plastic 1330 | plate 1331 | play 1332 | please 1333 | pledge 1334 | pluck 1335 | plug 1336 | plunge 1337 | poem 1338 | poet 1339 | point 1340 | polar 1341 | pole 1342 | police 1343 | pond 1344 | pony 1345 | pool 1346 | popular 1347 | portion 1348 | position 1349 | possible 1350 | post 1351 | potato 1352 | pottery 1353 | poverty 1354 | powder 1355 | power 1356 | practice 1357 | praise 1358 | predict 1359 | prefer 1360 | prepare 1361 | present 1362 | pretty 1363 | prevent 1364 | price 1365 | pride 1366 | primary 1367 | print 1368 | priority 1369 | prison 1370 | private 1371 | prize 1372 | problem 1373 | process 1374 | produce 1375 | profit 1376 | program 1377 | project 1378 | promote 1379 | proof 1380 | property 1381 | prosper 1382 | protect 1383 | proud 1384 | provide 1385 | public 1386 | pudding 1387 | pull 1388 | pulp 1389 | pulse 1390 | pumpkin 1391 | punch 1392 | pupil 1393 | puppy 1394 | purchase 1395 | purity 1396 | purpose 1397 | purse 1398 | push 1399 | put 1400 | puzzle 1401 | pyramid 1402 | quality 1403 | quantum 1404 | quarter 1405 | question 1406 | quick 1407 | quit 1408 | quiz 1409 | quote 1410 | rabbit 1411 | raccoon 1412 | race 1413 | rack 1414 | radar 1415 | radio 1416 | rail 1417 | rain 1418 | raise 1419 | rally 1420 | ramp 1421 | ranch 1422 | random 1423 | range 1424 | rapid 1425 | rare 1426 | rate 1427 | rather 1428 | raven 1429 | raw 1430 | razor 1431 | ready 1432 | real 1433 | reason 1434 | rebel 1435 | rebuild 1436 | recall 1437 | receive 1438 | recipe 1439 | record 1440 | recycle 1441 | reduce 1442 | reflect 1443 | reform 1444 | refuse 1445 | region 1446 | regret 1447 | regular 1448 | reject 1449 | relax 1450 | release 1451 | relief 1452 | rely 1453 | remain 1454 | remember 1455 | remind 1456 | remove 1457 | render 1458 | renew 1459 | rent 1460 | reopen 1461 | repair 1462 | repeat 1463 | replace 1464 | report 1465 | require 1466 | rescue 1467 | resemble 1468 | resist 1469 | resource 1470 | response 1471 | result 1472 | retire 1473 | retreat 1474 | return 1475 | reunion 1476 | reveal 1477 | review 1478 | reward 1479 | rhythm 1480 | rib 1481 | ribbon 1482 | rice 1483 | rich 1484 | ride 1485 | ridge 1486 | rifle 1487 | right 1488 | rigid 1489 | ring 1490 | riot 1491 | ripple 1492 | risk 1493 | ritual 1494 | rival 1495 | river 1496 | road 1497 | roast 1498 | robot 1499 | robust 1500 | rocket 1501 | romance 1502 | roof 1503 | rookie 1504 | room 1505 | rose 1506 | rotate 1507 | rough 1508 | round 1509 | route 1510 | royal 1511 | rubber 1512 | rude 1513 | rug 1514 | rule 1515 | run 1516 | runway 1517 | rural 1518 | sad 1519 | saddle 1520 | sadness 1521 | safe 1522 | sail 1523 | salad 1524 | salmon 1525 | salon 1526 | salt 1527 | salute 1528 | same 1529 | sample 1530 | sand 1531 | satisfy 1532 | satoshi 1533 | sauce 1534 | sausage 1535 | save 1536 | say 1537 | scale 1538 | scan 1539 | scare 1540 | scatter 1541 | scene 1542 | scheme 1543 | school 1544 | science 1545 | scissors 1546 | scorpion 1547 | scout 1548 | scrap 1549 | screen 1550 | script 1551 | scrub 1552 | sea 1553 | search 1554 | season 1555 | seat 1556 | second 1557 | secret 1558 | section 1559 | security 1560 | seed 1561 | seek 1562 | segment 1563 | select 1564 | sell 1565 | seminar 1566 | senior 1567 | sense 1568 | sentence 1569 | series 1570 | service 1571 | session 1572 | settle 1573 | setup 1574 | seven 1575 | shadow 1576 | shaft 1577 | shallow 1578 | share 1579 | shed 1580 | shell 1581 | sheriff 1582 | shield 1583 | shift 1584 | shine 1585 | ship 1586 | shiver 1587 | shock 1588 | shoe 1589 | shoot 1590 | shop 1591 | short 1592 | shoulder 1593 | shove 1594 | shrimp 1595 | shrug 1596 | shuffle 1597 | shy 1598 | sibling 1599 | sick 1600 | side 1601 | siege 1602 | sight 1603 | sign 1604 | silent 1605 | silk 1606 | silly 1607 | silver 1608 | similar 1609 | simple 1610 | since 1611 | sing 1612 | siren 1613 | sister 1614 | situate 1615 | six 1616 | size 1617 | skate 1618 | sketch 1619 | ski 1620 | skill 1621 | skin 1622 | skirt 1623 | skull 1624 | slab 1625 | slam 1626 | sleep 1627 | slender 1628 | slice 1629 | slide 1630 | slight 1631 | slim 1632 | slogan 1633 | slot 1634 | slow 1635 | slush 1636 | small 1637 | smart 1638 | smile 1639 | smoke 1640 | smooth 1641 | snack 1642 | snake 1643 | snap 1644 | sniff 1645 | snow 1646 | soap 1647 | soccer 1648 | social 1649 | sock 1650 | soda 1651 | soft 1652 | solar 1653 | soldier 1654 | solid 1655 | solution 1656 | solve 1657 | someone 1658 | song 1659 | soon 1660 | sorry 1661 | sort 1662 | soul 1663 | sound 1664 | soup 1665 | source 1666 | south 1667 | space 1668 | spare 1669 | spatial 1670 | spawn 1671 | speak 1672 | special 1673 | speed 1674 | spell 1675 | spend 1676 | sphere 1677 | spice 1678 | spider 1679 | spike 1680 | spin 1681 | spirit 1682 | split 1683 | spoil 1684 | sponsor 1685 | spoon 1686 | sport 1687 | spot 1688 | spray 1689 | spread 1690 | spring 1691 | spy 1692 | square 1693 | squeeze 1694 | squirrel 1695 | stable 1696 | stadium 1697 | staff 1698 | stage 1699 | stairs 1700 | stamp 1701 | stand 1702 | start 1703 | state 1704 | stay 1705 | steak 1706 | steel 1707 | stem 1708 | step 1709 | stereo 1710 | stick 1711 | still 1712 | sting 1713 | stock 1714 | stomach 1715 | stone 1716 | stool 1717 | story 1718 | stove 1719 | strategy 1720 | street 1721 | strike 1722 | strong 1723 | struggle 1724 | student 1725 | stuff 1726 | stumble 1727 | style 1728 | subject 1729 | submit 1730 | subway 1731 | success 1732 | such 1733 | sudden 1734 | suffer 1735 | sugar 1736 | suggest 1737 | suit 1738 | summer 1739 | sun 1740 | sunny 1741 | sunset 1742 | super 1743 | supply 1744 | supreme 1745 | sure 1746 | surface 1747 | surge 1748 | surprise 1749 | surround 1750 | survey 1751 | suspect 1752 | sustain 1753 | swallow 1754 | swamp 1755 | swap 1756 | swarm 1757 | swear 1758 | sweet 1759 | swift 1760 | swim 1761 | swing 1762 | switch 1763 | sword 1764 | symbol 1765 | symptom 1766 | syrup 1767 | system 1768 | table 1769 | tackle 1770 | tag 1771 | tail 1772 | talent 1773 | talk 1774 | tank 1775 | tape 1776 | target 1777 | task 1778 | taste 1779 | tattoo 1780 | taxi 1781 | teach 1782 | team 1783 | tell 1784 | ten 1785 | tenant 1786 | tennis 1787 | tent 1788 | term 1789 | test 1790 | text 1791 | thank 1792 | that 1793 | theme 1794 | then 1795 | theory 1796 | there 1797 | they 1798 | thing 1799 | this 1800 | thought 1801 | three 1802 | thrive 1803 | throw 1804 | thumb 1805 | thunder 1806 | ticket 1807 | tide 1808 | tiger 1809 | tilt 1810 | timber 1811 | time 1812 | tiny 1813 | tip 1814 | tired 1815 | tissue 1816 | title 1817 | toast 1818 | tobacco 1819 | today 1820 | toddler 1821 | toe 1822 | together 1823 | toilet 1824 | token 1825 | tomato 1826 | tomorrow 1827 | tone 1828 | tongue 1829 | tonight 1830 | tool 1831 | tooth 1832 | top 1833 | topic 1834 | topple 1835 | torch 1836 | tornado 1837 | tortoise 1838 | toss 1839 | total 1840 | tourist 1841 | toward 1842 | tower 1843 | town 1844 | toy 1845 | track 1846 | trade 1847 | traffic 1848 | tragic 1849 | train 1850 | transfer 1851 | trap 1852 | trash 1853 | travel 1854 | tray 1855 | treat 1856 | tree 1857 | trend 1858 | trial 1859 | tribe 1860 | trick 1861 | trigger 1862 | trim 1863 | trip 1864 | trophy 1865 | trouble 1866 | truck 1867 | true 1868 | truly 1869 | trumpet 1870 | trust 1871 | truth 1872 | try 1873 | tube 1874 | tuition 1875 | tumble 1876 | tuna 1877 | tunnel 1878 | turkey 1879 | turn 1880 | turtle 1881 | twelve 1882 | twenty 1883 | twice 1884 | twin 1885 | twist 1886 | two 1887 | type 1888 | typical 1889 | ugly 1890 | umbrella 1891 | unable 1892 | unaware 1893 | uncle 1894 | uncover 1895 | under 1896 | undo 1897 | unfair 1898 | unfold 1899 | unhappy 1900 | uniform 1901 | unique 1902 | unit 1903 | universe 1904 | unknown 1905 | unlock 1906 | until 1907 | unusual 1908 | unveil 1909 | update 1910 | upgrade 1911 | uphold 1912 | upon 1913 | upper 1914 | upset 1915 | urban 1916 | urge 1917 | usage 1918 | use 1919 | used 1920 | useful 1921 | useless 1922 | usual 1923 | utility 1924 | vacant 1925 | vacuum 1926 | vague 1927 | valid 1928 | valley 1929 | valve 1930 | van 1931 | vanish 1932 | vapor 1933 | various 1934 | vast 1935 | vault 1936 | vehicle 1937 | velvet 1938 | vendor 1939 | venture 1940 | venue 1941 | verb 1942 | verify 1943 | version 1944 | very 1945 | vessel 1946 | veteran 1947 | viable 1948 | vibrant 1949 | vicious 1950 | victory 1951 | video 1952 | view 1953 | village 1954 | vintage 1955 | violin 1956 | virtual 1957 | virus 1958 | visa 1959 | visit 1960 | visual 1961 | vital 1962 | vivid 1963 | vocal 1964 | voice 1965 | void 1966 | volcano 1967 | volume 1968 | vote 1969 | voyage 1970 | wage 1971 | wagon 1972 | wait 1973 | walk 1974 | wall 1975 | walnut 1976 | want 1977 | warfare 1978 | warm 1979 | warrior 1980 | wash 1981 | wasp 1982 | waste 1983 | water 1984 | wave 1985 | way 1986 | wealth 1987 | weapon 1988 | wear 1989 | weasel 1990 | weather 1991 | web 1992 | wedding 1993 | weekend 1994 | weird 1995 | welcome 1996 | west 1997 | wet 1998 | whale 1999 | what 2000 | wheat 2001 | wheel 2002 | when 2003 | where 2004 | whip 2005 | whisper 2006 | wide 2007 | width 2008 | wife 2009 | wild 2010 | will 2011 | win 2012 | window 2013 | wine 2014 | wing 2015 | wink 2016 | winner 2017 | winter 2018 | wire 2019 | wisdom 2020 | wise 2021 | wish 2022 | witness 2023 | wolf 2024 | woman 2025 | wonder 2026 | wood 2027 | wool 2028 | word 2029 | work 2030 | world 2031 | worry 2032 | worth 2033 | wrap 2034 | wreck 2035 | wrestle 2036 | wrist 2037 | write 2038 | wrong 2039 | yard 2040 | year 2041 | yellow 2042 | you 2043 | young 2044 | youth 2045 | zebra 2046 | zero 2047 | zone 2048 | zoo 2049 | -------------------------------------------------------------------------------- /db/.gitkeep: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Planxnx/ethereum-wallet-generator/7d148b91d9616f00518bf5f5a94f95fc7f6134ff/db/.gitkeep -------------------------------------------------------------------------------- /go.mod: -------------------------------------------------------------------------------- 1 | module github.com/planxnx/ethereum-wallet-generator 2 | 3 | go 1.21 4 | 5 | require ( 6 | github.com/btcsuite/btcd v0.24.0 7 | github.com/btcsuite/btcd/btcutil v1.1.5 8 | github.com/cheggaaa/pb/v3 v3.1.5 9 | github.com/ethereum/go-ethereum v1.14.3 10 | github.com/glebarez/sqlite v1.11.0 11 | github.com/pkg/errors v0.9.1 12 | github.com/schollz/progressbar/v3 v3.14.2 13 | github.com/stretchr/testify v1.8.4 14 | github.com/tyler-smith/go-bip39 v1.1.0 15 | golang.org/x/crypto v0.23.0 16 | gorm.io/gorm v1.25.10 17 | ) 18 | 19 | require ( 20 | github.com/VividCortex/ewma v1.2.0 // indirect 21 | github.com/bits-and-blooms/bitset v1.13.0 // indirect 22 | github.com/btcsuite/btcd/btcec/v2 v2.3.3 // indirect 23 | github.com/btcsuite/btcd/chaincfg/chainhash v1.1.0 // indirect 24 | github.com/consensys/bavard v0.1.13 // indirect 25 | github.com/consensys/gnark-crypto v0.12.1 // indirect 26 | github.com/crate-crypto/go-kzg-4844 v1.0.0 // indirect 27 | github.com/davecgh/go-spew v1.1.1 // indirect 28 | github.com/decred/dcrd/dcrec/secp256k1/v4 v4.3.0 // indirect 29 | github.com/dustin/go-humanize v1.0.1 // indirect 30 | github.com/ethereum/c-kzg-4844 v1.0.2 // indirect 31 | github.com/fatih/color v1.17.0 // indirect 32 | github.com/glebarez/go-sqlite v1.22.0 // indirect 33 | github.com/google/uuid v1.6.0 // indirect 34 | github.com/holiman/uint256 v1.2.4 // indirect 35 | github.com/jinzhu/inflection v1.0.0 // indirect 36 | github.com/jinzhu/now v1.1.5 // indirect 37 | github.com/mattn/go-colorable v0.1.13 // indirect 38 | github.com/mattn/go-isatty v0.0.20 // indirect 39 | github.com/mattn/go-runewidth v0.0.15 // indirect 40 | github.com/mitchellh/colorstring v0.0.0-20190213212951-d06e56a500db // indirect 41 | github.com/mmcloughlin/addchain v0.4.0 // indirect 42 | github.com/ncruces/go-strftime v0.1.9 // indirect 43 | github.com/pmezard/go-difflib v1.0.0 // indirect 44 | github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec // indirect 45 | github.com/rivo/uniseg v0.4.7 // indirect 46 | github.com/supranational/blst v0.3.11 // indirect 47 | golang.org/x/exp v0.0.0-20240222234643-814bf88cf225 // indirect 48 | golang.org/x/sync v0.7.0 // indirect 49 | golang.org/x/sys v0.20.0 // indirect 50 | golang.org/x/term v0.20.0 // indirect 51 | gopkg.in/yaml.v3 v3.0.1 // indirect 52 | modernc.org/libc v1.50.5 // indirect 53 | modernc.org/mathutil v1.6.0 // indirect 54 | modernc.org/memory v1.8.0 // indirect 55 | modernc.org/sqlite v1.29.9 // indirect 56 | rsc.io/tmplfunc v0.0.3 // indirect 57 | ) 58 | -------------------------------------------------------------------------------- /go.sum: -------------------------------------------------------------------------------- 1 | github.com/DataDog/zstd v1.4.5 h1:EndNeuB0l9syBZhut0wns3gV1hL8zX8LIu6ZiVHWLIQ= 2 | github.com/DataDog/zstd v1.4.5/go.mod h1:1jcaCB/ufaK+sKp1NBhlGmpz41jOoPQ35bpF36t7BBo= 3 | github.com/StackExchange/wmi v1.2.1 h1:VIkavFPXSjcnS+O8yTq7NI32k0R5Aj+v39y29VYDOSA= 4 | github.com/StackExchange/wmi v1.2.1/go.mod h1:rcmrprowKIVzvc+NUiLncP2uuArMWLCbu9SBzvHz7e8= 5 | github.com/VictoriaMetrics/fastcache v1.12.1 h1:i0mICQuojGDL3KblA7wUNlY5lOK6a4bwt3uRKnkZU40= 6 | github.com/VictoriaMetrics/fastcache v1.12.1/go.mod h1:tX04vaqcNoQeGLD+ra5pU5sWkuxnzWhEzLwhP9w653o= 7 | github.com/VividCortex/ewma v1.2.0 h1:f58SaIzcDXrSy3kWaHNvuJgJ3Nmz59Zji6XoJR/q1ow= 8 | github.com/VividCortex/ewma v1.2.0/go.mod h1:nz4BbCtbLyFDeC9SUHbtcT5644juEuWfUAUnGx7j5l4= 9 | github.com/aead/siphash v1.0.1/go.mod h1:Nywa3cDsYNNK3gaciGTWPwHt0wlpNV15vwmswBAUSII= 10 | github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM= 11 | github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw= 12 | github.com/bits-and-blooms/bitset v1.13.0 h1:bAQ9OPNFYbGHV6Nez0tmNI0RiEu7/hxlYJRUA0wFAVE= 13 | github.com/bits-and-blooms/bitset v1.13.0/go.mod h1:7hO7Gc7Pp1vODcmWvKMRA9BNmbv6a/7QIWpPxHddWR8= 14 | github.com/btcsuite/btcd v0.20.1-beta/go.mod h1:wVuoA8VJLEcwgqHBwHmzLRazpKxTv13Px/pDuV7OomQ= 15 | github.com/btcsuite/btcd v0.22.0-beta.0.20220111032746-97732e52810c/go.mod h1:tjmYdS6MLJ5/s0Fj4DbLgSbDHbEqLJrtnHecBFkdz5M= 16 | github.com/btcsuite/btcd v0.23.5-0.20231215221805-96c9fd8078fd/go.mod h1:nm3Bko6zh6bWP60UxwoT5LzdGJsQJaPo6HjduXq9p6A= 17 | github.com/btcsuite/btcd v0.24.0 h1:gL3uHE/IaFj6fcZSu03SvqPMSx7s/dPzfpG/atRwWdo= 18 | github.com/btcsuite/btcd v0.24.0/go.mod h1:K4IDc1593s8jKXIF7yS7yCTSxrknB9z0STzc2j6XgE4= 19 | github.com/btcsuite/btcd/btcec/v2 v2.1.0/go.mod h1:2VzYrv4Gm4apmbVVsSq5bqf1Ec8v56E48Vt0Y/umPgA= 20 | github.com/btcsuite/btcd/btcec/v2 v2.1.3/go.mod h1:ctjw4H1kknNJmRN4iP1R7bTQ+v3GJkZBd6mui8ZsAZE= 21 | github.com/btcsuite/btcd/btcec/v2 v2.3.3 h1:6+iXlDKE8RMtKsvK0gshlXIuPbyWM/h84Ensb7o3sC0= 22 | github.com/btcsuite/btcd/btcec/v2 v2.3.3/go.mod h1:zYzJ8etWJQIv1Ogk7OzpWjowwOdXY1W/17j2MW85J04= 23 | github.com/btcsuite/btcd/btcutil v1.0.0/go.mod h1:Uoxwv0pqYWhD//tfTiipkxNfdhG9UrLwaeswfjfdF0A= 24 | github.com/btcsuite/btcd/btcutil v1.1.0/go.mod h1:5OapHB7A2hBBWLm48mmw4MOHNJCcUBTwmWH/0Jn8VHE= 25 | github.com/btcsuite/btcd/btcutil v1.1.5 h1:+wER79R5670vs/ZusMTF1yTcRYE5GUsFbdjdisflzM8= 26 | github.com/btcsuite/btcd/btcutil v1.1.5/go.mod h1:PSZZ4UitpLBWzxGd5VGOrLnmOjtPP/a6HaFo12zMs00= 27 | github.com/btcsuite/btcd/chaincfg/chainhash v1.0.0/go.mod h1:7SFka0XMvUgj3hfZtydOrQY2mwhPclbT2snogU7SQQc= 28 | github.com/btcsuite/btcd/chaincfg/chainhash v1.0.1/go.mod h1:7SFka0XMvUgj3hfZtydOrQY2mwhPclbT2snogU7SQQc= 29 | github.com/btcsuite/btcd/chaincfg/chainhash v1.1.0 h1:59Kx4K6lzOW5w6nFlA0v5+lk/6sjybR934QNHSJZPTQ= 30 | github.com/btcsuite/btcd/chaincfg/chainhash v1.1.0/go.mod h1:7SFka0XMvUgj3hfZtydOrQY2mwhPclbT2snogU7SQQc= 31 | github.com/btcsuite/btclog v0.0.0-20170628155309-84c8d2346e9f/go.mod h1:TdznJufoqS23FtqVCzL0ZqgP5MqXbb4fg/WgDys70nA= 32 | github.com/btcsuite/btcutil v0.0.0-20190425235716-9e5f4b9a998d/go.mod h1:+5NJ2+qvTyV9exUAL/rxXi3DcLg2Ts+ymUAY5y4NvMg= 33 | github.com/btcsuite/go-socks v0.0.0-20170105172521-4720035b7bfd/go.mod h1:HHNXQzUsZCxOoE+CPiyCTO6x34Zs86zZUiwtpXoGdtg= 34 | github.com/btcsuite/goleveldb v0.0.0-20160330041536-7834afc9e8cd/go.mod h1:F+uVaaLLH7j4eDXPRvw78tMflu7Ie2bzYOH4Y8rRKBY= 35 | github.com/btcsuite/goleveldb v1.0.0/go.mod h1:QiK9vBlgftBg6rWQIj6wFzbPfRjiykIEhBH4obrXJ/I= 36 | github.com/btcsuite/snappy-go v0.0.0-20151229074030-0bdef8d06723/go.mod h1:8woku9dyThutzjeg+3xrA5iCpBRH8XEEg3lh6TiUghc= 37 | github.com/btcsuite/snappy-go v1.0.0/go.mod h1:8woku9dyThutzjeg+3xrA5iCpBRH8XEEg3lh6TiUghc= 38 | github.com/btcsuite/websocket v0.0.0-20150119174127-31079b680792/go.mod h1:ghJtEyQwv5/p4Mg4C0fgbePVuGr935/5ddU9Z3TmDRY= 39 | github.com/btcsuite/winsvc v1.0.0/go.mod h1:jsenWakMcC0zFBFurPLEAyrnc/teJEM1O46fmI40EZs= 40 | github.com/cespare/xxhash/v2 v2.2.0 h1:DC2CZ1Ep5Y4k3ZQ899DldepgrayRUGE6BBZ/cd9Cj44= 41 | github.com/cespare/xxhash/v2 v2.2.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= 42 | github.com/cheggaaa/pb/v3 v3.1.5 h1:QuuUzeM2WsAqG2gMqtzaWithDJv0i+i6UlnwSCI4QLk= 43 | github.com/cheggaaa/pb/v3 v3.1.5/go.mod h1:CrxkeghYTXi1lQBEI7jSn+3svI3cuc19haAj6jM60XI= 44 | github.com/cockroachdb/errors v1.11.1 h1:xSEW75zKaKCWzR3OfxXUxgrk/NtT4G1MiOv5lWZazG8= 45 | github.com/cockroachdb/errors v1.11.1/go.mod h1:8MUxA3Gi6b25tYlFEBGLf+D8aISL+M4MIpiWMSNRfxw= 46 | github.com/cockroachdb/logtags v0.0.0-20230118201751-21c54148d20b h1:r6VH0faHjZeQy818SGhaone5OnYfxFR/+AzdY3sf5aE= 47 | github.com/cockroachdb/logtags v0.0.0-20230118201751-21c54148d20b/go.mod h1:Vz9DsVWQQhf3vs21MhPMZpMGSht7O/2vFW2xusFUVOs= 48 | github.com/cockroachdb/pebble v1.1.0 h1:pcFh8CdCIt2kmEpK0OIatq67Ln9uGDYY3d5XnE0LJG4= 49 | github.com/cockroachdb/pebble v1.1.0/go.mod h1:sEHm5NOXxyiAoKWhoFxT8xMgd/f3RA6qUqQ1BXKrh2E= 50 | github.com/cockroachdb/redact v1.1.5 h1:u1PMllDkdFfPWaNGMyLD1+so+aq3uUItthCFqzwPJ30= 51 | github.com/cockroachdb/redact v1.1.5/go.mod h1:BVNblN9mBWFyMyqK1k3AAiSxhvhfK2oOZZ2lK+dpvRg= 52 | github.com/cockroachdb/tokenbucket v0.0.0-20230807174530-cc333fc44b06 h1:zuQyyAKVxetITBuuhv3BI9cMrmStnpT18zmgmTxunpo= 53 | github.com/cockroachdb/tokenbucket v0.0.0-20230807174530-cc333fc44b06/go.mod h1:7nc4anLGjupUW/PeY5qiNYsdNXj7zopG+eqsS7To5IQ= 54 | github.com/consensys/bavard v0.1.13 h1:oLhMLOFGTLdlda/kma4VOJazblc7IM5y5QPd2A/YjhQ= 55 | github.com/consensys/bavard v0.1.13/go.mod h1:9ItSMtA/dXMAiL7BG6bqW2m3NdSEObYWoH223nGHukI= 56 | github.com/consensys/gnark-crypto v0.12.1 h1:lHH39WuuFgVHONRl3J0LRBtuYdQTumFSDtJF7HpyG8M= 57 | github.com/consensys/gnark-crypto v0.12.1/go.mod h1:v2Gy7L/4ZRosZ7Ivs+9SfUDr0f5UlG+EM5t7MPHiLuY= 58 | github.com/crate-crypto/go-ipa v0.0.0-20231025140028-3c0104f4b233 h1:d28BXYi+wUpz1KBmiF9bWrjEMacUEREV6MBi2ODnrfQ= 59 | github.com/crate-crypto/go-ipa v0.0.0-20231025140028-3c0104f4b233/go.mod h1:geZJZH3SzKCqnz5VT0q/DyIG/tvu/dZk+VIfXicupJs= 60 | github.com/crate-crypto/go-kzg-4844 v1.0.0 h1:TsSgHwrkTKecKJ4kadtHi4b3xHW5dCFUDFnUp1TsawI= 61 | github.com/crate-crypto/go-kzg-4844 v1.0.0/go.mod h1:1kMhvPgI0Ky3yIa+9lFySEBUBXkYxeOi8ZF1sYioxhc= 62 | github.com/davecgh/go-spew v0.0.0-20171005155431-ecdeabc65495/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= 63 | github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= 64 | github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= 65 | github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= 66 | github.com/decred/dcrd/crypto/blake256 v1.0.0/go.mod h1:sQl2p6Y26YV+ZOcSTP6thNdn47hh8kt6rqSlvmrXFAc= 67 | github.com/decred/dcrd/crypto/blake256 v1.0.1 h1:7PltbUIQB7u/FfZ39+DGa/ShuMyJ5ilcvdfma9wOH6Y= 68 | github.com/decred/dcrd/crypto/blake256 v1.0.1/go.mod h1:2OfgNZ5wDpcsFmHmCK5gZTPcCXqlm2ArzUIkw9czNJo= 69 | github.com/decred/dcrd/dcrec/secp256k1/v4 v4.0.1/go.mod h1:hyedUtir6IdtD/7lIxGeCxkaw7y45JueMRL4DIyJDKs= 70 | github.com/decred/dcrd/dcrec/secp256k1/v4 v4.3.0 h1:rpfIENRNNilwHwZeG5+P150SMrnNEcHYvcCuK6dPZSg= 71 | github.com/decred/dcrd/dcrec/secp256k1/v4 v4.3.0/go.mod h1:v57UDF4pDQJcEfFUCRop3lJL149eHGSe9Jvczhzjo/0= 72 | github.com/decred/dcrd/lru v1.0.0/go.mod h1:mxKOwFd7lFjN2GZYsiz/ecgqR6kkYAl+0pz0tEMk218= 73 | github.com/dustin/go-humanize v1.0.1 h1:GzkhY7T5VNhEkwH0PVJgjz+fX1rhBrR7pRT3mDkpeCY= 74 | github.com/dustin/go-humanize v1.0.1/go.mod h1:Mu1zIs6XwVuF/gI1OepvI0qD18qycQx+mFykh5fBlto= 75 | github.com/ethereum/c-kzg-4844 v1.0.2 h1:8tV84BCEiPeOkiVgW9mpYBeBUir2bkCNVqxPwwVeO+s= 76 | github.com/ethereum/c-kzg-4844 v1.0.2/go.mod h1:VewdlzQmpT5QSrVhbBuGoCdFJkpaJlO1aQputP83wc0= 77 | github.com/ethereum/go-ethereum v1.14.3 h1:5zvnAqLtnCZrU9uod1JCvHWJbPMURzYFHfc2eHz4PHA= 78 | github.com/ethereum/go-ethereum v1.14.3/go.mod h1:1STrq471D0BQbCX9He0hUj4bHxX2k6mt5nOQJhDNOJ8= 79 | github.com/fatih/color v1.17.0 h1:GlRw1BRJxkpqUCBKzKOw098ed57fEsKeNjpTe3cSjK4= 80 | github.com/fatih/color v1.17.0/go.mod h1:YZ7TlrGPkiz6ku9fK3TLD/pl3CpsiFyu8N92HLgmosI= 81 | github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= 82 | github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ= 83 | github.com/gballet/go-verkle v0.1.1-0.20231031103413-a67434b50f46 h1:BAIP2GihuqhwdILrV+7GJel5lyPV3u1+PgzrWLc0TkE= 84 | github.com/gballet/go-verkle v0.1.1-0.20231031103413-a67434b50f46/go.mod h1:QNpY22eby74jVhqH4WhDLDwxc/vqsern6pW+u2kbkpc= 85 | github.com/getsentry/sentry-go v0.18.0 h1:MtBW5H9QgdcJabtZcuJG80BMOwaBpkRDZkxRkNC1sN0= 86 | github.com/getsentry/sentry-go v0.18.0/go.mod h1:Kgon4Mby+FJ7ZWHFUAZgVaIa8sxHtnRJRLTXZr51aKQ= 87 | github.com/glebarez/go-sqlite v1.22.0 h1:uAcMJhaA6r3LHMTFgP0SifzgXg46yJkgxqyuyec+ruQ= 88 | github.com/glebarez/go-sqlite v1.22.0/go.mod h1:PlBIdHe0+aUEFn+r2/uthrWq4FxbzugL0L8Li6yQJbc= 89 | github.com/glebarez/sqlite v1.11.0 h1:wSG0irqzP6VurnMEpFGer5Li19RpIRi2qvQz++w0GMw= 90 | github.com/glebarez/sqlite v1.11.0/go.mod h1:h8/o8j5wiAsqSPoWELDUdJXhjAhsVliSn7bWZjOhrgQ= 91 | github.com/go-ole/go-ole v1.3.0 h1:Dt6ye7+vXGIKZ7Xtk4s6/xVdGDQynvom7xCFEdWr6uE= 92 | github.com/go-ole/go-ole v1.3.0/go.mod h1:5LS6F96DhAwUc7C+1HLexzMXY1xGRSryjyPPKW6zv78= 93 | github.com/gofrs/flock v0.8.1 h1:+gYjHKf32LDeiEEFhQaotPbLuUXjY5ZqxKgXy7n59aw= 94 | github.com/gofrs/flock v0.8.1/go.mod h1:F1TvTiK9OcQqauNUHlbJvyl9Qa1QvF/gOUDKA14jxHU= 95 | github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= 96 | github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= 97 | github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= 98 | github.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8= 99 | github.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA= 100 | github.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs= 101 | github.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w= 102 | github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0= 103 | github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= 104 | github.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek= 105 | github.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps= 106 | github.com/golang/snappy v0.0.4/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= 107 | github.com/golang/snappy v0.0.5-0.20220116011046-fa5810519dcb h1:PBC98N2aIaM3XXiurYmW7fx4GZkL8feAMVq7nEjURHk= 108 | github.com/golang/snappy v0.0.5-0.20220116011046-fa5810519dcb/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= 109 | github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= 110 | github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= 111 | github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= 112 | github.com/google/pprof v0.0.0-20240409012703-83162a5b38cd h1:gbpYu9NMq8jhDVbvlGkMFWCjLFlqqEZjEmObmhUy6Vo= 113 | github.com/google/pprof v0.0.0-20240409012703-83162a5b38cd/go.mod h1:kf6iHlnVGwgKolg33glAes7Yg/8iWP8ukqeldJSO7jw= 114 | github.com/google/subcommands v1.2.0/go.mod h1:ZjhPrFU+Olkh9WazFPsl27BQ4UPiG37m3yTrtFlrHVk= 115 | github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= 116 | github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= 117 | github.com/gorilla/websocket v1.5.0/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= 118 | github.com/holiman/uint256 v1.2.4 h1:jUc4Nk8fm9jZabQuqr2JzednajVmBpC+oiTiXZJEApU= 119 | github.com/holiman/uint256 v1.2.4/go.mod h1:EOMSn4q6Nyt9P6efbI3bueV4e1b3dGlUCXeiRV4ng7E= 120 | github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= 121 | github.com/jessevdk/go-flags v0.0.0-20141203071132-1679536dcc89/go.mod h1:4FA24M0QyGHXBuZZK/XkWh8h0e1EYbRYJSGM75WSRxI= 122 | github.com/jessevdk/go-flags v1.4.0/go.mod h1:4FA24M0QyGHXBuZZK/XkWh8h0e1EYbRYJSGM75WSRxI= 123 | github.com/jinzhu/inflection v1.0.0 h1:K317FqzuhWc8YvSVlFMCCUb36O/S9MCKRDI7QkRKD/E= 124 | github.com/jinzhu/inflection v1.0.0/go.mod h1:h+uFLlag+Qp1Va5pdKtLDYj+kHp5pxUVkryuEj+Srlc= 125 | github.com/jinzhu/now v1.1.5 h1:/o9tlHleP7gOFmsnYNz3RGnqzefHA47wQpKrrdTIwXQ= 126 | github.com/jinzhu/now v1.1.5/go.mod h1:d3SSVoowX0Lcu0IBviAWJpolVfI5UJVZZ7cO71lE/z8= 127 | github.com/jrick/logrotate v1.0.0/go.mod h1:LNinyqDIJnpAur+b8yyulnQw/wDuN1+BYKlTRt3OuAQ= 128 | github.com/k0kubun/go-ansi v0.0.0-20180517002512-3bf9e2903213/go.mod h1:vNUNkEQ1e29fT/6vq2aBdFsgNPmy8qMdSay1npru+Sw= 129 | github.com/kkdai/bstream v0.0.0-20161212061736-f391b8402d23/go.mod h1:J+Gs4SYgM6CZQHDETBtE9HaSEkGmuNXF86RwHhHUvq4= 130 | github.com/klauspost/compress v1.15.15 h1:EF27CXIuDsYJ6mmvtBRlEuB2UVOqHG1tAXgZ7yIO+lw= 131 | github.com/klauspost/compress v1.15.15/go.mod h1:ZcK2JAFqKOpnBlxcLsJzYfrS9X1akm9fHZNnD9+Vo/4= 132 | github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= 133 | github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= 134 | github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= 135 | github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= 136 | github.com/kylelemons/godebug v1.1.0 h1:RPNrshWIDI6G2gRW9EHilWtl7Z6Sb1BR0xunSBf0SNc= 137 | github.com/kylelemons/godebug v1.1.0/go.mod h1:9/0rRGxNHcop5bhtWyNeEfOS8JIWk580+fNqagV/RAw= 138 | github.com/leanovate/gopter v0.2.9 h1:fQjYxZaynp97ozCzfOyOuAGOU4aU/z37zf/tOujFk7c= 139 | github.com/leanovate/gopter v0.2.9/go.mod h1:U2L/78B+KVFIx2VmW6onHJQzXtFb+p5y3y2Sh+Jxxv8= 140 | github.com/mattn/go-colorable v0.1.13 h1:fFA4WZxdEF4tXPZVKMLwD8oUnCTTo08duU7wxecdEvA= 141 | github.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovkB8vQcUbaXHg= 142 | github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM= 143 | github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY= 144 | github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= 145 | github.com/mattn/go-runewidth v0.0.15 h1:UNAjwbU9l54TA3KzvqLGxwWjHmMgBUVhBiTjelZgg3U= 146 | github.com/mattn/go-runewidth v0.0.15/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w= 147 | github.com/matttproud/golang_protobuf_extensions v1.0.2-0.20181231171920-c182affec369 h1:I0XW9+e1XWDxdcEniV4rQAIOPUGDq67JSCiRCgGCZLI= 148 | github.com/matttproud/golang_protobuf_extensions v1.0.2-0.20181231171920-c182affec369/go.mod h1:BSXmuO+STAnVfrANrmjBb36TMTDstsz7MSK+HVaYKv4= 149 | github.com/mitchellh/colorstring v0.0.0-20190213212951-d06e56a500db h1:62I3jR2EmQ4l5rM/4FEfDWcRD+abF5XlKShorW5LRoQ= 150 | github.com/mitchellh/colorstring v0.0.0-20190213212951-d06e56a500db/go.mod h1:l0dey0ia/Uv7NcFFVbCLtqEBQbrT4OCwCSKTEv6enCw= 151 | github.com/mmcloughlin/addchain v0.4.0 h1:SobOdjm2xLj1KkXN5/n0xTIWyZA2+s99UCY1iPfkHRY= 152 | github.com/mmcloughlin/addchain v0.4.0/go.mod h1:A86O+tHqZLMNO4w6ZZ4FlVQEadcoqkyU72HC5wJ4RlU= 153 | github.com/mmcloughlin/profile v0.1.1/go.mod h1:IhHD7q1ooxgwTgjxQYkACGA77oFTDdFVejUS1/tS/qU= 154 | github.com/ncruces/go-strftime v0.1.9 h1:bY0MQC28UADQmHmaF5dgpLmImcShSi2kHU9XLdhx/f4= 155 | github.com/ncruces/go-strftime v0.1.9/go.mod h1:Fwc5htZGVVkseilnfgOVb9mKy6w1naJmn9CehxcKcls= 156 | github.com/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI8A= 157 | github.com/olekukonko/tablewriter v0.0.5 h1:P2Ga83D34wi1o9J6Wh1mRuqd4mF/x/lgBS7N7AbDhec= 158 | github.com/olekukonko/tablewriter v0.0.5/go.mod h1:hPp6KlRPjbx+hW8ykQs1w3UBbZlj6HuIJcUGPhkA7kY= 159 | github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= 160 | github.com/onsi/ginkgo v1.7.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= 161 | github.com/onsi/ginkgo v1.12.1/go.mod h1:zj2OWP4+oCPe1qIXoGWkgMRwljMUYCdkwsT2108oapk= 162 | github.com/onsi/ginkgo v1.14.0/go.mod h1:iSB4RoI2tjJc9BBv4NKIKWKya62Rps+oPG/Lv9klQyY= 163 | github.com/onsi/gomega v1.4.1/go.mod h1:C1qb7wdrVGGVU+Z6iS04AVkA3Q65CEZX59MT0QO5uiA= 164 | github.com/onsi/gomega v1.4.3/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= 165 | github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7JYyY= 166 | github.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo= 167 | github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= 168 | github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= 169 | github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= 170 | github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= 171 | github.com/prometheus/client_golang v1.12.0 h1:C+UIj/QWtmqY13Arb8kwMt5j34/0Z2iKamrJ+ryC0Gg= 172 | github.com/prometheus/client_golang v1.12.0/go.mod h1:3Z9XVyYiZYEO+YQWt3RD2R3jrbd179Rt297l4aS6nDY= 173 | github.com/prometheus/client_model v0.2.1-0.20210607210712-147c58e9608a h1:CmF68hwI0XsOQ5UwlBopMi2Ow4Pbg32akc4KIVCOm+Y= 174 | github.com/prometheus/client_model v0.2.1-0.20210607210712-147c58e9608a/go.mod h1:LDGWKZIo7rky3hgvBe+caln+Dr3dPggB5dvjtD7w9+w= 175 | github.com/prometheus/common v0.32.1 h1:hWIdL3N2HoUx3B8j3YN9mWor0qhY/NlEKZEaXxuIRh4= 176 | github.com/prometheus/common v0.32.1/go.mod h1:vu+V0TpY+O6vW9J44gczi3Ap/oXXR10b+M/gUGO4Hls= 177 | github.com/prometheus/procfs v0.7.3 h1:4jVXhlkAyzOScmCkXBTOLRLTz8EeU+eyjrwB/EPq0VU= 178 | github.com/prometheus/procfs v0.7.3/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA= 179 | github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec h1:W09IVJc94icq4NjY3clb7Lk8O1qJ8BdBEF8z0ibU0rE= 180 | github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec/go.mod h1:qqbHyh8v60DhA7CoWK5oRCqLrMHRGoxYCSS9EjAz6Eo= 181 | github.com/rivo/uniseg v0.2.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc= 182 | github.com/rivo/uniseg v0.4.7 h1:WUdvkW8uEhrYfLC4ZzdpI2ztxP1I582+49Oc5Mq64VQ= 183 | github.com/rivo/uniseg v0.4.7/go.mod h1:FN3SvrM+Zdj16jyLfmOkMNblXMcoc8DfTHruCPUcx88= 184 | github.com/rogpeppe/go-internal v1.9.0 h1:73kH8U+JUqXU8lRuOHeVHaa/SZPifC7BkcraZVejAe8= 185 | github.com/rogpeppe/go-internal v1.9.0/go.mod h1:WtVeX8xhTBvf0smdhujwtBcq4Qrzq/fJaraNFVN+nFs= 186 | github.com/schollz/progressbar/v3 v3.14.2 h1:EducH6uNLIWsr560zSV1KrTeUb/wZGAHqyMFIEa99ks= 187 | github.com/schollz/progressbar/v3 v3.14.2/go.mod h1:aQAZQnhF4JGFtRJiw/eobaXpsqpVQAftEQ+hLGXaRc4= 188 | github.com/shirou/gopsutil v3.21.4-0.20210419000835-c7a38de76ee5+incompatible h1:Bn1aCHHRnjv4Bl16T8rcaFjYSrGrIZvpiGO6P3Q4GpU= 189 | github.com/shirou/gopsutil v3.21.4-0.20210419000835-c7a38de76ee5+incompatible/go.mod h1:5b4v6he4MtMOwMlS0TUMTu2PcXUg8+E1lC7eC3UO/RA= 190 | github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= 191 | github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= 192 | github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= 193 | github.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk= 194 | github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= 195 | github.com/supranational/blst v0.3.11 h1:LyU6FolezeWAhvQk0k6O/d49jqgO52MSDDfYgbeoEm4= 196 | github.com/supranational/blst v0.3.11/go.mod h1:jZJtfjgudtNl4en1tzwPIV3KjUnQUvG3/j+w+fVonLw= 197 | github.com/syndtr/goleveldb v1.0.1-0.20210819022825-2ae1ddf74ef7 h1:epCh84lMvA70Z7CTTCmYQn2CKbY8j86K7/FAIr141uY= 198 | github.com/syndtr/goleveldb v1.0.1-0.20210819022825-2ae1ddf74ef7/go.mod h1:q4W45IWZaF22tdD+VEXcAWRA037jwmWEB5VWYORlTpc= 199 | github.com/tklauser/go-sysconf v0.3.12 h1:0QaGUFOdQaIVdPgfITYzaTegZvdCjmYO52cSFAEVmqU= 200 | github.com/tklauser/go-sysconf v0.3.12/go.mod h1:Ho14jnntGE1fpdOqQEEaiKRpvIavV0hSfmBq8nJbHYI= 201 | github.com/tklauser/numcpus v0.6.1 h1:ng9scYS7az0Bk4OZLvrNXNSAO2Pxr1XXRAPyjhIx+Fk= 202 | github.com/tklauser/numcpus v0.6.1/go.mod h1:1XfjsgE2zo8GVw7POkMbHENHzVg3GzmoZ9fESEdAacY= 203 | github.com/tyler-smith/go-bip39 v1.1.0 h1:5eUemwrMargf3BSLRRCalXT93Ns6pQJIjYQN2nyfOP8= 204 | github.com/tyler-smith/go-bip39 v1.1.0/go.mod h1:gUYDtqQw1JS3ZJ8UWVcGTGqqr6YIN3CWg+kkNaLt55U= 205 | golang.org/x/crypto v0.0.0-20170930174604-9419663f5a44/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= 206 | golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= 207 | golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= 208 | golang.org/x/crypto v0.23.0 h1:dIJU/v2J8Mdglj/8rJ6UUOM3Zc9zLZxVZwwxMooUSAI= 209 | golang.org/x/crypto v0.23.0/go.mod h1:CKFgDieR+mRhux2Lsu27y0fO304Db0wZe70UKqHu0v8= 210 | golang.org/x/exp v0.0.0-20240222234643-814bf88cf225 h1:LfspQV/FYTatPTr/3HzIcmiUFH7PGP+OQ6mgDYo3yuQ= 211 | golang.org/x/exp v0.0.0-20240222234643-814bf88cf225/go.mod h1:CxmFvTBINI24O/j8iY7H1xHzx2i4OsyguNBmN/uPtqc= 212 | golang.org/x/mod v0.17.0 h1:zY54UmvipHiNd+pm+m0x9KhZ9hl1/7QNMyxXbc6ICqA= 213 | golang.org/x/mod v0.17.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c= 214 | golang.org/x/net v0.0.0-20180719180050-a680a1efc54d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= 215 | golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= 216 | golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= 217 | golang.org/x/net v0.0.0-20200520004742-59133d7f0dd7/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= 218 | golang.org/x/net v0.0.0-20200813134508-3edf25e44fcc/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= 219 | golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= 220 | golang.org/x/sync v0.7.0 h1:YsImfSBoP9QPYL0xyKJPq0gcaJdG3rInoqxTWbfQu9M= 221 | golang.org/x/sync v0.7.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= 222 | golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= 223 | golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= 224 | golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= 225 | golang.org/x/sys v0.0.0-20190904154756-749cb33beabd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= 226 | golang.org/x/sys v0.0.0-20191005200804-aed5e4c7ecf9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= 227 | golang.org/x/sys v0.0.0-20191120155948-bd437916bb0e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= 228 | golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= 229 | golang.org/x/sys v0.0.0-20200519105757-fe76b779f299/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= 230 | golang.org/x/sys v0.0.0-20200814200057-3d37ad5750ed/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= 231 | golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= 232 | golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= 233 | golang.org/x/sys v0.17.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= 234 | golang.org/x/sys v0.20.0 h1:Od9JTbYCk261bKm4M/mw7AklTlFYIa0bIp9BgSm1S8Y= 235 | golang.org/x/sys v0.20.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= 236 | golang.org/x/term v0.17.0/go.mod h1:lLRBjIVuehSbZlaOtGMbcMncT+aqLLLmKrsjNrUguwk= 237 | golang.org/x/term v0.20.0 h1:VnkxpohqXaOBYJtBmEppKUG6mXpi+4O6purfc2+sMhw= 238 | golang.org/x/term v0.20.0/go.mod h1:8UkIAJTvZgivsXaD6/pH6U9ecQzZ45awqEOzuCvwpFY= 239 | golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= 240 | golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= 241 | golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= 242 | golang.org/x/text v0.15.0 h1:h1V/4gjBv8v9cjcR6+AR5+/cIYK5N/WAgiv4xlsEtAk= 243 | golang.org/x/text v0.15.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= 244 | golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= 245 | golang.org/x/tools v0.20.0 h1:hz/CVckiOxybQvFw6h7b/q80NTr9IUQb4s1IIzW7KNY= 246 | golang.org/x/tools v0.20.0/go.mod h1:WvitBU7JJf6A4jOdg4S1tviW9bhUxkgeCui/0JHctQg= 247 | golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= 248 | golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= 249 | google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= 250 | google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= 251 | google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM= 252 | google.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE= 253 | google.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo= 254 | google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= 255 | google.golang.org/protobuf v1.33.0 h1:uNO2rsAINq/JlFpSdYEKIZ0uKD/R9cpdv0T+yoGwGmI= 256 | google.golang.org/protobuf v1.33.0/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos= 257 | gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= 258 | gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= 259 | gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= 260 | gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys= 261 | gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw= 262 | gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= 263 | gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= 264 | gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= 265 | gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY= 266 | gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= 267 | gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= 268 | gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= 269 | gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= 270 | gorm.io/gorm v1.25.10 h1:dQpO+33KalOA+aFYGlK+EfxcI5MbO7EP2yYygwh9h+s= 271 | gorm.io/gorm v1.25.10/go.mod h1:hbnx/Oo0ChWMn1BIhpy1oYozzpM15i4YPuHDmfYtwg8= 272 | modernc.org/cc/v4 v4.21.0 h1:D/gLKtcztomvWbsbvBKo3leKQv+86f+DdqEZBBXhnag= 273 | modernc.org/cc/v4 v4.21.0/go.mod h1:HM7VJTZbUCR3rV8EYBi9wxnJ0ZBRiGE5OeGXNA0IsLQ= 274 | modernc.org/ccgo/v4 v4.17.3 h1:t2CQci84jnxKw3GGnHvjGKjiNZeZqyQx/023spkk4hU= 275 | modernc.org/ccgo/v4 v4.17.3/go.mod h1:1FCbAtWYJoKuc+AviS+dH+vGNtYmFJqBeRWjmnDWsIg= 276 | modernc.org/fileutil v1.3.0 h1:gQ5SIzK3H9kdfai/5x41oQiKValumqNTDXMvKo62HvE= 277 | modernc.org/fileutil v1.3.0/go.mod h1:XatxS8fZi3pS8/hKG2GH/ArUogfxjpEKs3Ku3aK4JyQ= 278 | modernc.org/gc/v2 v2.4.1 h1:9cNzOqPyMJBvrUipmynX0ZohMhcxPtMccYgGOJdOiBw= 279 | modernc.org/gc/v2 v2.4.1/go.mod h1:wzN5dK1AzVGoH6XOzc3YZ+ey/jPgYHLuVckd62P0GYU= 280 | modernc.org/libc v1.50.5 h1:ZzeUd0dIc/sUtoPTCYIrgypkuzoGzNu6kbEWj2VuEmk= 281 | modernc.org/libc v1.50.5/go.mod h1:rhzrUx5oePTSTIzBgM0mTftwWHK8tiT9aNFUt1mldl0= 282 | modernc.org/mathutil v1.6.0 h1:fRe9+AmYlaej+64JsEEhoWuAYBkOtQiMEU7n/XgfYi4= 283 | modernc.org/mathutil v1.6.0/go.mod h1:Ui5Q9q1TR2gFm0AQRqQUaBWFLAhQpCwNcuhBOSedWPo= 284 | modernc.org/memory v1.8.0 h1:IqGTL6eFMaDZZhEWwcREgeMXYwmW83LYW8cROZYkg+E= 285 | modernc.org/memory v1.8.0/go.mod h1:XPZ936zp5OMKGWPqbD3JShgd/ZoQ7899TUuQqxY+peU= 286 | modernc.org/opt v0.1.3 h1:3XOZf2yznlhC+ibLltsDGzABUGVx8J6pnFMS3E4dcq4= 287 | modernc.org/opt v0.1.3/go.mod h1:WdSiB5evDcignE70guQKxYUl14mgWtbClRi5wmkkTX0= 288 | modernc.org/sortutil v1.2.0 h1:jQiD3PfS2REGJNzNCMMaLSp/wdMNieTbKX920Cqdgqc= 289 | modernc.org/sortutil v1.2.0/go.mod h1:TKU2s7kJMf1AE84OoiGppNHJwvB753OYfNl2WRb++Ss= 290 | modernc.org/sqlite v1.29.9 h1:9RhNMklxJs+1596GNuAX+O/6040bvOwacTxuFcRuQow= 291 | modernc.org/sqlite v1.29.9/go.mod h1:ItX2a1OVGgNsFh6Dv60JQvGfJfTPHPVpV6DF59akYOA= 292 | modernc.org/strutil v1.2.0 h1:agBi9dp1I+eOnxXeiZawM8F4LawKv4NzGWSaLfyeNZA= 293 | modernc.org/strutil v1.2.0/go.mod h1:/mdcBmfOibveCTBxUl5B5l6W+TTH1FXPLHZE6bTosX0= 294 | modernc.org/token v1.1.0 h1:Xl7Ap9dKaEs5kLoOQeQmPWevfnk/DM5qcLcYlA8ys6Y= 295 | modernc.org/token v1.1.0/go.mod h1:UGzOrNV1mAFSEB63lOFHIpNRUVMvYTc6yu1SMY/XTDM= 296 | rsc.io/tmplfunc v0.0.3 h1:53XFQh69AfOa8Tw0Jm7t+GV7KZhOi6jzsCzTtKbMvzU= 297 | rsc.io/tmplfunc v0.0.3/go.mod h1:AG3sTPzElb1Io3Yg4voV9AGZJuleGAwaVRxL9M49PhA= 298 | -------------------------------------------------------------------------------- /internal/generators/generators.go: -------------------------------------------------------------------------------- 1 | package generators 2 | 3 | import ( 4 | "fmt" 5 | "log" 6 | "strings" 7 | "sync" 8 | "sync/atomic" 9 | "time" 10 | 11 | "github.com/planxnx/ethereum-wallet-generator/internal/progressbar" 12 | "github.com/planxnx/ethereum-wallet-generator/internal/repository" 13 | "github.com/planxnx/ethereum-wallet-generator/wallets" 14 | ) 15 | 16 | type Config struct { 17 | AddresValidator func(address string) bool 18 | ProgressBar progressbar.ProgressBar 19 | DryRun bool 20 | Concurrency int 21 | Number int 22 | Limit int 23 | } 24 | 25 | type Generator struct { 26 | walletGen wallets.Generator 27 | repo repository.Repository 28 | config Config 29 | 30 | isShutdown atomic.Bool 31 | shutdownSignal chan struct{} 32 | shutDownWg sync.WaitGroup 33 | } 34 | 35 | func New(walletGen wallets.Generator, repo repository.Repository, cfg Config) *Generator { 36 | return &Generator{ 37 | walletGen: walletGen, 38 | repo: repo, 39 | config: cfg, 40 | shutdownSignal: make(chan struct{}), 41 | } 42 | } 43 | 44 | func (g *Generator) Start() (err error) { 45 | g.isShutdown.Store(false) 46 | g.shutDownWg.Add(1) 47 | defer g.shutDownWg.Done() 48 | 49 | var ( 50 | bar = g.config.ProgressBar 51 | resolvedCount atomic.Int64 52 | start = time.Now() 53 | ) 54 | defer func() { 55 | _ = bar.Finish() 56 | 57 | if err := g.repo.Close(); err != nil { 58 | // Ignore error 59 | log.Printf("[ERROR] failed to close repository: %+v\n", err) 60 | } 61 | 62 | if w := g.repo.Result(); len(w) > 0 && !g.config.DryRun { 63 | col2Name := "Seed" 64 | var result strings.Builder 65 | for _, wallet := range w { 66 | col2 := wallet.Mnemonic 67 | if wallet.Mnemonic == "" { 68 | col2 = wallet.PrivateKey 69 | col2Name = "Private Key" 70 | } 71 | if _, err := fmt.Fprintf(&result, "%-42s %s\n", wallet.Address, col2); err != nil { 72 | continue 73 | } 74 | } 75 | fmt.Printf("\n%-42s %s\n", "Address", col2Name) 76 | fmt.Printf("%-42s %s\n", strings.Repeat("-", 42), strings.Repeat("-", 90)) 77 | fmt.Println(result.String()) 78 | } 79 | 80 | fmt.Printf("\nResolved Speed: %.2f w/s\n", float64(resolvedCount.Load())/time.Since(start).Seconds()) 81 | fmt.Printf("Total Duration: %v\n", time.Since(start)) 82 | fmt.Printf("Total Wallet Resolved: %d w\n", resolvedCount.Load()) 83 | fmt.Printf("\nCopyright (C) 2023 Planxnx \n") 84 | 85 | g.isShutdown.Store(true) 86 | }() 87 | 88 | var wg sync.WaitGroup 89 | commands := make(chan struct{}) 90 | for i := 0; i < g.config.Concurrency; i++ { 91 | wg.Add(1) 92 | go func() { 93 | defer wg.Done() 94 | for range commands { 95 | if !(resolvedCount.Load() < int64(g.config.Limit) || g.config.Limit < 0) { 96 | return 97 | } 98 | 99 | wallet, err := g.walletGen() 100 | if err != nil { 101 | // Ignore error 102 | log.Printf("[ERROR] failed to generate wallet: %+v\n", err) 103 | continue 104 | } 105 | 106 | isOk := true 107 | if g.config.AddresValidator != nil { 108 | isOk = g.config.AddresValidator(wallet.Address) 109 | } 110 | 111 | if isOk { 112 | if err := g.repo.Insert(wallet); err != nil { 113 | // Ignore error 114 | log.Printf("[ERROR] failed to insert wallet to db: %+v\n", err) 115 | continue 116 | } 117 | resolvedCount.Add(1) 118 | } 119 | 120 | _ = bar.SetResolved(int(resolvedCount.Load())) 121 | _ = bar.Increment() 122 | } 123 | }() 124 | } 125 | 126 | mainloop: 127 | for i := 0; (i < g.config.Number || g.config.Number < 0) && (resolvedCount.Load() < int64(g.config.Limit) || g.config.Limit < 0); i++ { 128 | select { 129 | case <-g.shutdownSignal: 130 | break mainloop 131 | default: 132 | commands <- struct{}{} 133 | } 134 | } 135 | 136 | close(commands) 137 | wg.Wait() 138 | return nil 139 | } 140 | 141 | func (g *Generator) Shutdown() (err error) { 142 | if g.isShutdown.Load() { 143 | return nil 144 | } 145 | go func() { 146 | g.shutdownSignal <- struct{}{} 147 | }() 148 | g.shutDownWg.Wait() 149 | return nil 150 | } 151 | -------------------------------------------------------------------------------- /internal/progressbar/progress_bar.go: -------------------------------------------------------------------------------- 1 | package progressbar 2 | 3 | import ( 4 | "fmt" 5 | 6 | "github.com/cheggaaa/pb/v3" 7 | "github.com/pkg/errors" 8 | "github.com/schollz/progressbar/v3" 9 | ) 10 | 11 | const DefaultStandardModeTemplate = `{{counters . }} | {{bar . "" "█" "█" "" "" | rndcolor}} | {{percent . }} | {{speed . }} | {{string . "resolved"}}` 12 | 13 | // ProgressBar progress bar interface 14 | type ProgressBar interface { 15 | Increment() error 16 | SetResolved(resolved int) error 17 | Finish() error 18 | } 19 | 20 | // progressBar progressbar logging with 2 mode. 21 | // TODO: extract to compateMode and standardMode adapters 22 | type progressBar struct { 23 | StandardMode *pb.ProgressBar 24 | CompatibleMode *progressbar.ProgressBar 25 | } 26 | 27 | // NewCompatibleProgressBar returns a new progress bar set to compatible mode. 28 | func NewCompatibleProgressBar(number int) ProgressBar { 29 | bar := progressbar.NewOptions(number, 30 | progressbar.OptionSetItsString("w"), 31 | progressbar.OptionSetPredictTime(true), 32 | progressbar.OptionShowIts(), 33 | progressbar.OptionShowCount(), 34 | progressbar.OptionFullWidth(), 35 | ) 36 | _ = bar.RenderBlank() 37 | return &progressBar{ 38 | CompatibleMode: bar, 39 | } 40 | } 41 | 42 | // NewStandardProgressBar returns a new progress bar set to standard mode. 43 | func NewStandardProgressBar(number int) ProgressBar { 44 | bar := &progressBar{ 45 | StandardMode: pb.StartNew(number), 46 | } 47 | bar.StandardMode.SetTemplate(pb.Default) 48 | bar.StandardMode.SetTemplateString(DefaultStandardModeTemplate) 49 | return bar 50 | } 51 | 52 | // Increment increment progress 53 | func (bar *progressBar) Increment() error { 54 | if bar.CompatibleMode != nil { 55 | return errors.WithStack(bar.CompatibleMode.Add(1)) 56 | } 57 | return errors.WithStack(bar.StandardMode.Increment().Err()) 58 | } 59 | 60 | // SetResolved set resolved wallet number 61 | func (bar *progressBar) SetResolved(resolved int) error { 62 | if bar.StandardMode != nil { 63 | return errors.WithStack(bar.StandardMode.Set("resolved", fmt.Sprintf("resolved: %v", resolved)).Err()) 64 | } 65 | return nil 66 | } 67 | 68 | // Finish close progress bar 69 | func (bar *progressBar) Finish() error { 70 | if bar.CompatibleMode != nil { 71 | return errors.WithStack(bar.CompatibleMode.Close()) 72 | } 73 | return errors.WithStack(bar.StandardMode.Finish().Err()) 74 | } 75 | -------------------------------------------------------------------------------- /internal/repository/gorm.go: -------------------------------------------------------------------------------- 1 | package repository 2 | 3 | import ( 4 | "sync" 5 | 6 | "github.com/pkg/errors" 7 | "github.com/planxnx/ethereum-wallet-generator/wallets" 8 | "gorm.io/gorm" 9 | ) 10 | 11 | type GormRepository struct { 12 | db *gorm.DB 13 | mu sync.Mutex 14 | tx *gorm.DB 15 | txSize uint64 16 | maxTxSize uint64 17 | } 18 | 19 | func NewGormRepository(db *gorm.DB, maxTxSize uint64) Repository { 20 | return &GormRepository{ 21 | db: db, 22 | maxTxSize: maxTxSize, 23 | } 24 | } 25 | 26 | func (r *GormRepository) Insert(wallet *wallets.Wallet) error { 27 | if r.db == nil { 28 | return nil 29 | } 30 | 31 | r.mu.Lock() 32 | defer r.mu.Unlock() 33 | 34 | if r.tx == nil { 35 | r.tx = r.db.Begin() 36 | } 37 | 38 | if err := r.tx.Create(wallet).Error; err != nil { 39 | return errors.WithStack(err) 40 | } 41 | r.txSize++ 42 | 43 | if r.txSize >= r.maxTxSize { 44 | if err := r.commit(); err != nil { 45 | return errors.WithStack(err) 46 | } 47 | } 48 | 49 | return nil 50 | } 51 | 52 | func (r *GormRepository) Result() []*wallets.Wallet { 53 | return nil 54 | } 55 | 56 | func (r *GormRepository) Close() error { 57 | if err := r.Commit(); err != nil { 58 | return errors.WithStack(err) 59 | } 60 | return nil 61 | } 62 | 63 | func (r *GormRepository) Commit() error { 64 | if r.db == nil { 65 | return nil 66 | } 67 | 68 | r.mu.Lock() 69 | defer r.mu.Unlock() 70 | 71 | if err := r.commit(); err != nil { 72 | return errors.WithStack(err) 73 | } 74 | return nil 75 | } 76 | 77 | // commit unsafe method, should be called inside package only 78 | func (r *GormRepository) commit() error { 79 | if r.tx != nil { 80 | if err := r.tx.Commit().Error; err != nil { 81 | return errors.WithStack(err) 82 | } 83 | r.txSize = 0 84 | r.tx = nil 85 | } 86 | return nil 87 | } 88 | -------------------------------------------------------------------------------- /internal/repository/repository.go: -------------------------------------------------------------------------------- 1 | package repository 2 | 3 | import "github.com/planxnx/ethereum-wallet-generator/wallets" 4 | 5 | type Repository interface { 6 | Insert(wallet *wallets.Wallet) error 7 | Result() []*wallets.Wallet 8 | Close() error 9 | } 10 | -------------------------------------------------------------------------------- /internal/repository/stdout.go: -------------------------------------------------------------------------------- 1 | package repository 2 | 3 | import ( 4 | "sync" 5 | 6 | "github.com/planxnx/ethereum-wallet-generator/wallets" 7 | ) 8 | 9 | type InMemoryRepository struct { 10 | walletsMu sync.Mutex 11 | wallets []*wallets.Wallet 12 | } 13 | 14 | func NewInMemoryRepository() Repository { 15 | return &InMemoryRepository{ 16 | wallets: make([]*wallets.Wallet, 0), 17 | } 18 | } 19 | 20 | func (r *InMemoryRepository) Insert(wallet *wallets.Wallet) error { 21 | r.walletsMu.Lock() 22 | defer r.walletsMu.Unlock() 23 | r.wallets = append(r.wallets, wallet) 24 | return nil 25 | } 26 | 27 | func (r *InMemoryRepository) Result() []*wallets.Wallet { 28 | return r.wallets 29 | } 30 | 31 | func (r *InMemoryRepository) Close() error { 32 | return nil 33 | } 34 | -------------------------------------------------------------------------------- /main.go: -------------------------------------------------------------------------------- 1 | package main 2 | 3 | import ( 4 | "context" 5 | "flag" 6 | "fmt" 7 | "log" 8 | "os" 9 | "os/signal" 10 | "regexp" 11 | "strings" 12 | "syscall" 13 | 14 | "github.com/glebarez/sqlite" 15 | "gorm.io/gorm" 16 | "gorm.io/gorm/logger" 17 | 18 | "github.com/planxnx/ethereum-wallet-generator/internal/generators" 19 | "github.com/planxnx/ethereum-wallet-generator/internal/progressbar" 20 | "github.com/planxnx/ethereum-wallet-generator/internal/repository" 21 | "github.com/planxnx/ethereum-wallet-generator/utils" 22 | "github.com/planxnx/ethereum-wallet-generator/wallets" 23 | ) 24 | 25 | func init() { 26 | if _, err := os.Stat("db"); os.IsNotExist(err) { 27 | if err := os.Mkdir("db", 0o750); err != nil { 28 | panic(err) 29 | } 30 | } 31 | } 32 | 33 | func main() { 34 | // Context with gracefully shutdown signal 35 | ctx, stop := signal.NotifyContext(context.Background(), 36 | syscall.SIGHUP, // kill -SIGHUP XXXX 37 | syscall.SIGINT, // kill -SIGINT XXXX or Ctrl+c 38 | syscall.SIGQUIT, // kill -SIGQUIT XXXX 39 | syscall.SIGTERM, // kill -SIGTERM XXXX 40 | ) 41 | defer stop() 42 | 43 | fmt.Println("===============ETH Wallet Generator===============") 44 | fmt.Println(" ") 45 | 46 | // Parse flags 47 | number := flag.Int("n", 10, "set number of generate times (not number of result wallets) (set number to -1 for Infinite loop ∞)") 48 | limit := flag.Int("limit", 0, "set limit number of result wallets. stop generate when result of vanity wallets reach the limit (set number to 0 for no limit)") 49 | dbPath := flag.String("db", "", "set sqlite output name eg. wallets.db (db file will create in /db)") 50 | concurrency := flag.Int("c", 1, "set concurrency value") 51 | bits := flag.Int("bit", 128, "set number of entropy bits [128, 256]") 52 | strict := flag.Bool("strict", false, "strict contains mode (required contains to use)") 53 | contain := flag.String("contains", "", "show only result that contained with the given letters (support for multiple characters)") 54 | prefix := flag.String("prefix", "", "show only result that prefix was matched with the given letters (support for single character)") 55 | suffix := flag.String("suffix", "", "show only result that suffix was matched with the given letters (support for single character)") 56 | regEx := flag.String("regex", "", "show only result that was matched with given regex (eg. ^0x99 or ^0x00)") 57 | isDryrun := flag.Bool("dryrun", false, "generate wallet without a result (used for benchmark speed)") 58 | isCompatible := flag.Bool("compatible", false, "logging compatible mode (turn this on to fix logging glitch)") 59 | mode := flag.Int("mode", 1, "wallet generate mode [1: normal mode, 2: only private key mode(generate only privatekey, this fastest mode)]") 60 | flag.Parse() 61 | 62 | // Wallet Address Validator 63 | r, err := regexp.Compile(*regEx) 64 | if err != nil { 65 | panic(err) 66 | } 67 | contains := strings.Split(*contain, ",") 68 | *prefix = utils.Add0xPrefix(*prefix) 69 | validateAddress := func(address string) bool { 70 | isValid := true 71 | if len(contains) > 0 { 72 | cb := func(contain string) bool { 73 | return strings.Contains(address, contain) 74 | } 75 | if *strict { 76 | if !utils.Have(contains, cb) { 77 | isValid = false 78 | } 79 | } else { 80 | if !utils.Some(contains, cb) { 81 | isValid = false 82 | } 83 | } 84 | } 85 | 86 | if *prefix != "" { 87 | if !strings.HasPrefix(address, *prefix) { 88 | isValid = false 89 | } 90 | } 91 | 92 | if *suffix != "" { 93 | if !strings.HasSuffix(address, *suffix) { 94 | isValid = false 95 | } 96 | } 97 | 98 | if *regEx != "" && !r.MatchString(address) { 99 | isValid = false 100 | } 101 | 102 | return isValid 103 | } 104 | if *number <= 0 { 105 | *number = -1 106 | } 107 | if *limit <= 0 { 108 | *limit = *number 109 | } 110 | 111 | // Progress bar 112 | var bar progressbar.ProgressBar 113 | if *isCompatible { 114 | bar = progressbar.NewCompatibleProgressBar(*number) 115 | } else { 116 | bar = progressbar.NewStandardProgressBar(*number) 117 | } 118 | 119 | // Repository 120 | var repo repository.Repository 121 | switch { 122 | case *dbPath != "": 123 | db, err := gorm.Open(sqlite.Open("./db/"+*dbPath), &gorm.Config{ 124 | Logger: logger.Default.LogMode(logger.Silent), 125 | DryRun: *isDryrun, 126 | SkipDefaultTransaction: true, 127 | }) 128 | if err != nil { 129 | panic(err) 130 | } 131 | 132 | defer func() { 133 | db, _ := db.DB() 134 | db.Close() 135 | }() 136 | 137 | if !*isDryrun { 138 | if err := db.AutoMigrate(&wallets.Wallet{}); err != nil { 139 | panic(err) 140 | } 141 | } 142 | 143 | repo = repository.NewGormRepository(db, uint64(*concurrency)) 144 | default: 145 | repo = repository.NewInMemoryRepository() 146 | } 147 | 148 | // Wallet generator 149 | var walletGenerator wallets.Generator 150 | switch *mode { 151 | case 1: 152 | walletGenerator = wallets.NewGeneratorMnemonic(*bits) 153 | case 2: 154 | walletGenerator = wallets.NewGeneratorPrivatekey() 155 | default: 156 | panic("Invalid mode. See: https://github.com/Planxnx/ethereum-wallet-generator#Modes") 157 | } 158 | 159 | generator := generators.New( 160 | walletGenerator, 161 | repo, 162 | generators.Config{ 163 | AddresValidator: validateAddress, 164 | ProgressBar: bar, 165 | DryRun: *isDryrun, 166 | Concurrency: *concurrency, 167 | Number: *number, 168 | Limit: *limit, 169 | }, 170 | ) 171 | 172 | go func() { 173 | <-ctx.Done() 174 | 175 | if err := generator.Shutdown(); err != nil { 176 | log.Printf("Generator Shutdown Error: %+v", err) 177 | } 178 | 179 | if err := repo.Close(); err != nil { 180 | log.Printf("WalletsRepo Close Error: %+v", err) 181 | } 182 | }() 183 | 184 | if err := generator.Start(); err != nil { 185 | log.Printf("Generator Error: %+v", err) 186 | } 187 | } 188 | -------------------------------------------------------------------------------- /utils/array.go: -------------------------------------------------------------------------------- 1 | package utils 2 | 3 | // forked this methods from core-js 4 | func Some[T any](arr []T, check func(T) bool) bool { 5 | for _, v := range arr { 6 | if check(v) { 7 | return true 8 | } 9 | } 10 | return false 11 | } 12 | 13 | func Have[T any](arr []T, check func(T) bool) bool { 14 | for _, v := range arr { 15 | if !check(v) { 16 | return false 17 | } 18 | } 19 | return true 20 | } 21 | -------------------------------------------------------------------------------- /utils/hex.go: -------------------------------------------------------------------------------- 1 | package utils 2 | 3 | // Has0xPrefix checks if the input string has 0x prefix or not. 4 | // 5 | // Returns `true“ if the input string has 0x prefix, otherwise `false`. 6 | func Has0xPrefix(input string) bool { 7 | return len(input) >= 2 && input[0] == '0' && (input[1] == 'x' || input[1] == 'X') 8 | } 9 | 10 | // Add0xPrefix returns the input string with 0x prefix. 11 | func Add0xPrefix(input string) string { 12 | if !Has0xPrefix(input) { 13 | return "0x" + input 14 | } 15 | return input 16 | } 17 | -------------------------------------------------------------------------------- /utils/utils.go: -------------------------------------------------------------------------------- 1 | package utils 2 | 3 | import "fmt" 4 | 5 | func MustError[T any](val T, err error) T { 6 | if err != nil { 7 | panic(err) 8 | } 9 | return val 10 | } 11 | 12 | func Must[T any](val T, err any) T { 13 | switch e := err.(type) { 14 | case bool: 15 | if !e { 16 | panic("not ok") 17 | } 18 | case error: 19 | if e != nil { 20 | panic(e) 21 | } 22 | default: 23 | if err != nil { 24 | panic(fmt.Sprintf("invalid error type, must be bool or error, got %T(%v)", err, err)) 25 | } 26 | } 27 | return val 28 | } 29 | -------------------------------------------------------------------------------- /wallets/mnemonic.go: -------------------------------------------------------------------------------- 1 | package wallets 2 | 3 | import ( 4 | "crypto/ecdsa" 5 | 6 | "github.com/btcsuite/btcd/btcutil/hdkeychain" 7 | "github.com/btcsuite/btcd/chaincfg" 8 | "github.com/ethereum/go-ethereum/accounts" 9 | "github.com/pkg/errors" 10 | "github.com/planxnx/ethereum-wallet-generator/bip39" 11 | ) 12 | 13 | var ( 14 | // DefaultBaseDerivationPath is the base path from which custom derivation endpoints 15 | // are incremented. As such, the first account will be at m/44'/60'/0'/0, the second 16 | // at m/44'/60'/0'/1, etc 17 | DefaultBaseDerivationPath = accounts.DefaultBaseDerivationPath 18 | DefaultBaseDerivationPathString = DefaultBaseDerivationPath.String() 19 | ) 20 | 21 | // NewGeneratorMnemonic returns a new wallet generator that uses a mnemonic(BIP39) and a derivation path(BIP44) to generate a wallet. 22 | func NewGeneratorMnemonic(bitSize int) Generator { 23 | return func() (*Wallet, error) { 24 | mnemonic, err := NewMnemonic(bitSize) 25 | if err != nil { 26 | return nil, err 27 | } 28 | 29 | privateKey, err := deriveWallet(bip39.NewSeed(mnemonic, ""), DefaultBaseDerivationPath) 30 | if err != nil { 31 | return nil, err 32 | } 33 | 34 | wallet, err := NewFromPrivatekey(privateKey) 35 | if err != nil { 36 | return nil, errors.WithStack(err) 37 | } 38 | 39 | wallet.Bits = bitSize 40 | wallet.Mnemonic = mnemonic 41 | wallet.HDPath = DefaultBaseDerivationPathString 42 | 43 | return wallet, nil 44 | } 45 | } 46 | 47 | // NewMnemonic returns a new mnemonic(BIP39) with the given bit size. 48 | func NewMnemonic(bitSize int) (string, error) { 49 | entropy, err := bip39.NewEntropy(bitSize) 50 | if err != nil { 51 | return "", errors.WithStack(err) 52 | } 53 | 54 | mnemonic, err := bip39.NewMnemonic(entropy) 55 | if err != nil { 56 | return "", errors.WithStack(err) 57 | } 58 | 59 | return mnemonic, nil 60 | } 61 | 62 | func deriveWallet(seed []byte, path accounts.DerivationPath) (*ecdsa.PrivateKey, error) { 63 | key, err := hdkeychain.NewMaster(seed, &chaincfg.MainNetParams) 64 | if err != nil { 65 | return nil, errors.WithStack(err) 66 | } 67 | 68 | for _, n := range path { 69 | key, err = key.Derive(n) 70 | if err != nil { 71 | return nil, errors.WithStack(err) 72 | } 73 | } 74 | 75 | privateKey, err := key.ECPrivKey() 76 | privateKeyECDSA := privateKey.ToECDSA() 77 | if err != nil { 78 | return nil, errors.WithStack(err) 79 | } 80 | 81 | return privateKeyECDSA, nil 82 | } 83 | -------------------------------------------------------------------------------- /wallets/privatekey.go: -------------------------------------------------------------------------------- 1 | package wallets 2 | 3 | import ( 4 | "github.com/ethereum/go-ethereum/crypto" 5 | "github.com/pkg/errors" 6 | ) 7 | 8 | func NewGeneratorPrivatekey() Generator { 9 | return func() (*Wallet, error) { 10 | privateKey, err := crypto.GenerateKey() 11 | if err != nil { 12 | return nil, errors.WithStack(err) 13 | } 14 | 15 | wallet, err := NewFromPrivatekey(privateKey) 16 | if err != nil { 17 | return nil, errors.WithStack(err) 18 | } 19 | 20 | return wallet, nil 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /wallets/wallet.go: -------------------------------------------------------------------------------- 1 | package wallets 2 | 3 | import ( 4 | "crypto/ecdsa" 5 | "encoding/hex" 6 | "errors" 7 | "unsafe" 8 | 9 | "github.com/ethereum/go-ethereum/common" 10 | "github.com/ethereum/go-ethereum/crypto" 11 | "gorm.io/gorm" 12 | ) 13 | 14 | type ( 15 | // Generator is a function that generates a wallet. 16 | Generator func() (*Wallet, error) 17 | 18 | // Wallet is a struct that contains the information of a wallet. 19 | Wallet struct { 20 | Address string 21 | PrivateKey string 22 | Mnemonic string 23 | HDPath string 24 | gorm.Model 25 | Bits int 26 | } 27 | ) 28 | 29 | const ( 30 | // DefaultMnemonicBits is the default number of bits to use when generating a mnemonic. default is 128 bits (12 words). 31 | DefaultMnemonicBits = 128 32 | ) 33 | 34 | // DefaultGenerator is the default wallet generator. 35 | var DefaultGenerator = NewGeneratorMnemonic(DefaultMnemonicBits) 36 | 37 | // NewWallet returns a new wallet using the default generator. 38 | func NewWallet() (*Wallet, error) { 39 | return DefaultGenerator() 40 | } 41 | 42 | // NewFromPrivatekey returns a new wallet from a given private key. 43 | func NewFromPrivatekey(privateKey *ecdsa.PrivateKey) (*Wallet, error) { 44 | if privateKey == nil { 45 | return nil, errors.New("private key is nil") 46 | } 47 | 48 | publicKey := &privateKey.PublicKey 49 | 50 | // toString PrivateKey 51 | priveKeyBytes := crypto.FromECDSA(privateKey) 52 | privHex := make([]byte, len(priveKeyBytes)*2) 53 | hex.Encode(privHex, priveKeyBytes) 54 | privString := b2s(privHex) 55 | 56 | // toString PublicKey 57 | publicKeyBytes := crypto.Keccak256(crypto.FromECDSAPub(publicKey)[1:])[12:] 58 | if len(publicKeyBytes) > common.AddressLength { 59 | publicKeyBytes = publicKeyBytes[len(publicKeyBytes)-common.AddressLength:] 60 | } 61 | pubHex := make([]byte, len(publicKeyBytes)*2+2) 62 | copy(pubHex[:2], "0x") 63 | hex.Encode(pubHex[2:], publicKeyBytes) 64 | pubString := b2s(pubHex) 65 | 66 | return &Wallet{ 67 | Address: pubString, 68 | PrivateKey: privString, 69 | }, nil 70 | } 71 | 72 | // b2s converts a byte slice to a string without memory allocation. 73 | func b2s(b []byte) string { 74 | return *(*string)(unsafe.Pointer(&b)) 75 | } 76 | -------------------------------------------------------------------------------- /wallets/wallet_test.go: -------------------------------------------------------------------------------- 1 | package wallets 2 | 3 | import ( 4 | "crypto/rand" 5 | "testing" 6 | ) 7 | 8 | func TestByteToString(t *testing.T) { 9 | { 10 | expectedBytes := []byte("hello world") 11 | expected := string(expectedBytes) 12 | actual := b2s(expectedBytes) 13 | if expected != actual { 14 | t.Errorf("expected: %s, actual: %s", expected, actual) 15 | } 16 | } 17 | { 18 | expectedBytes := make([]byte, 1024*1024) 19 | if _, err := rand.Read(expectedBytes); err != nil { 20 | t.Error(err) 21 | t.FailNow() 22 | } 23 | 24 | expected := string(expectedBytes) 25 | actual := b2s(expectedBytes) 26 | if expected != actual { 27 | t.Errorf("expected: %s, actual: %s", expected, actual) 28 | } 29 | } 30 | { 31 | expectedBytes := make([]byte, 1024*1024) 32 | expected := string(expectedBytes) 33 | actual := b2s(expectedBytes) 34 | if expected != actual { 35 | t.Errorf("expected: %s, actual: %s", expected, actual) 36 | } 37 | } 38 | } 39 | --------------------------------------------------------------------------------