├── db └── dbs.txt ├── cmd ├── main.go ├── utils │ ├── sys.go │ ├── title.go │ ├── wallets.go │ ├── results.go │ ├── ranges.go │ ├── bitcoin.go │ ├── lastkey.go │ └── base.go └── core │ ├── timerupdate.go │ ├── database.go │ ├── workers.go │ ├── app.go │ ├── console.go │ └── genkeys.go ├── Dockerfile ├── .gitignore ├── go.mod ├── README.md ├── data ├── wallets.json └── ranges.json └── go.sum /db/dbs.txt: -------------------------------------------------------------------------------- 1 | Lista de Tabelas para cada carteira -------------------------------------------------------------------------------- /cmd/main.go: -------------------------------------------------------------------------------- 1 | /** 2 | * App BTCGO 3 | * Versão Beta 4 | */ 5 | 6 | package main 7 | 8 | import ( 9 | app "btcgo/cmd/core" 10 | "btcgo/cmd/utils" 11 | ) 12 | 13 | func main() { 14 | 15 | version := "v0.6.1" 16 | 17 | utils.ClearConsole() 18 | utils.Title(version) 19 | app.NewApp() 20 | } 21 | -------------------------------------------------------------------------------- /Dockerfile: -------------------------------------------------------------------------------- 1 | FROM golang AS stage1 2 | WORKDIR /app 3 | COPY go.mod go.sum ./ 4 | RUN go mod download 5 | COPY . . 6 | RUN CGO_ENABLED=0 GOOS=linux go build -o btcgo ./cmd/main.go 7 | 8 | FROM scratch 9 | COPY --from=stage1 /app/btcgo / 10 | COPY --from=stage1 /app/data /data 11 | CMD ["./btcgo"] 12 | ENTRYPOINT [ "/btcgo" ] 13 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Go build artifacts 2 | *.exe 3 | *.exe~ 4 | *.dll 5 | *.so 6 | *.dylib 7 | *.test 8 | *.out 9 | 10 | # IDE/editor directories and files 11 | .vscode/ 12 | .idea/ 13 | *.swp 14 | *~ 15 | 16 | # Dependency directories (example for vendoring) 17 | vendor/ 18 | 19 | # Logs 20 | *.log 21 | 22 | # Ignore go build output 23 | bin/ 24 | 25 | # Ignore files backup tests 26 | backup/ 27 | 28 | # Ignore the executable 29 | btcgo 30 | btcgo.exe 31 | 32 | # Ignore files code 33 | chaves_encontradas.txt 34 | ultimaChavePorCarteira.txt 35 | -------------------------------------------------------------------------------- /cmd/utils/sys.go: -------------------------------------------------------------------------------- 1 | /** 2 | * BTCGO 3 | * 4 | * Modulo : System 5 | */ 6 | 7 | package utils 8 | 9 | import ( 10 | "os" 11 | "os/exec" 12 | "path/filepath" 13 | "runtime" 14 | ) 15 | 16 | // Get Exe Path 17 | func GetPath() (string, error) { 18 | // Find app path 19 | exePath, err := os.Executable() 20 | if err == nil { 21 | return filepath.Dir(exePath), nil 22 | } 23 | return "", err 24 | } 25 | 26 | // Clear Console 27 | func ClearConsole() { 28 | switch runtime.GOOS { 29 | case "windows": 30 | cmd := exec.Command("cmd", "/c", "cls") 31 | cmd.Stdout = os.Stdout 32 | cmd.Run() 33 | default: 34 | cmd := exec.Command("clear") 35 | cmd.Stdout = os.Stdout 36 | cmd.Run() 37 | } 38 | } 39 | 40 | // Get End of line 41 | func GetEndLineChar() rune { 42 | charReadline := '\n' 43 | if runtime.GOOS == "windows" { 44 | charReadline = '\r' 45 | } 46 | return charReadline 47 | } 48 | -------------------------------------------------------------------------------- /go.mod: -------------------------------------------------------------------------------- 1 | module btcgo 2 | 3 | go 1.22.3 4 | 5 | require ( 6 | github.com/decred/dcrd/dcrec/secp256k1/v4 v4.3.0 7 | github.com/dgraph-io/badger/v4 v4.2.0 8 | github.com/dustin/go-humanize v1.0.1 9 | github.com/fatih/color v1.17.0 10 | golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9 11 | ) 12 | 13 | require ( 14 | github.com/cespare/xxhash/v2 v2.2.0 // indirect 15 | github.com/dgraph-io/ristretto v0.1.1 // indirect 16 | github.com/gogo/protobuf v1.3.2 // indirect 17 | github.com/golang/glog v1.0.0 // indirect 18 | github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6 // indirect 19 | github.com/golang/protobuf v1.5.2 // indirect 20 | github.com/golang/snappy v0.0.3 // indirect 21 | github.com/google/flatbuffers v1.12.1 // indirect 22 | github.com/klauspost/compress v1.12.3 // indirect 23 | github.com/mattn/go-colorable v0.1.13 // indirect 24 | github.com/mattn/go-isatty v0.0.20 // indirect 25 | github.com/pkg/errors v0.9.1 // indirect 26 | go.opencensus.io v0.22.5 // indirect 27 | golang.org/x/net v0.7.0 // indirect 28 | golang.org/x/sys v0.18.0 // indirect 29 | google.golang.org/protobuf v1.28.1 // indirect 30 | ) 31 | -------------------------------------------------------------------------------- /cmd/utils/title.go: -------------------------------------------------------------------------------- 1 | package utils 2 | 3 | import "fmt" 4 | 5 | func Title(version string) { 6 | fmt.Println("\x1b[38;2;250;128;114m" + "╔═══════════════════════════════════════╗") 7 | fmt.Println("║\x1b[0m\x1b[36m" + " ____ _______ _____ _____ ____ " + "\x1b[0m\x1b[38;2;250;128;114m" + "║") 8 | fmt.Println("║\x1b[0m\x1b[36m" + " | _ \\__ __/ ____| / ____|/ __ \\ " + "\x1b[0m\x1b[38;2;250;128;114m" + "║") 9 | fmt.Println("║\x1b[0m\x1b[36m" + " | |_) | | | | | | | __| | | | " + "\x1b[0m\x1b[38;2;250;128;114m" + "║") 10 | fmt.Println("║\x1b[0m\x1b[36m" + " | _ < | | | | | | |_ | | | | " + "\x1b[0m\x1b[38;2;250;128;114m" + "║") 11 | fmt.Println("║\x1b[0m\x1b[36m" + " | |_) | | | | |____ | |__| | |__| | " + "\x1b[0m\x1b[38;2;250;128;114m" + "║") 12 | fmt.Println("║\x1b[0m\x1b[36m" + " |____/ |_| \\_____| \\_____|\\____/ " + "\x1b[0m\x1b[38;2;250;128;114m" + "║") 13 | fmt.Println("║\x1b[0m\x1b[36m" + " " + "\x1b[0m\x1b[38;2;250;128;114m" + "║") 14 | fmt.Println("╚════\x1b[32m" + "Investidor Internacional - " + version + "\x1b[0m\x1b[38;2;250;128;114m══╝" + "\x1b[0m") 15 | } 16 | -------------------------------------------------------------------------------- /cmd/core/timerupdate.go: -------------------------------------------------------------------------------- 1 | /** 2 | * BTCGO 3 | * 4 | * Modulo : Time Ticker Update 5 | */ 6 | 7 | package core 8 | 9 | import ( 10 | "context" 11 | "fmt" 12 | "time" 13 | 14 | "github.com/dustin/go-humanize" 15 | ) 16 | 17 | type TimerUpdater struct { 18 | Ctx context.Context 19 | Ticker *time.Ticker 20 | StartTime time.Time 21 | IsStarted bool 22 | } 23 | 24 | func NewTicker(ctx context.Context) *TimerUpdater { 25 | return &TimerUpdater{ 26 | Ctx: ctx, 27 | IsStarted: false, 28 | } 29 | } 30 | 31 | // Start 32 | func (t *TimerUpdater) Start(timerSeconds int) { 33 | t.IsStarted = true 34 | t.StartTime = time.Now() 35 | t.Ticker = time.NewTicker(time.Duration(timerSeconds) * time.Second) 36 | t.tickerProcessor() 37 | } 38 | 39 | // Stop 40 | func (t *TimerUpdater) Stop() { 41 | t.Ticker.Stop() 42 | t.IsStarted = false 43 | } 44 | 45 | // Ticker 46 | func (t TimerUpdater) tickerProcessor() { 47 | go func() { 48 | for { 49 | select { 50 | case <-t.Ticker.C: 51 | keyscheck := App.Keys.GetTotalKeys() 52 | elapsedTime := time.Since(t.StartTime).Seconds() 53 | fmt.Printf("Chaves checadas: %s Chaves por segundo: %s Ultima chave checada: %064x\n", humanize.Comma(int64(keyscheck)), humanize.Comma(int64(keyscheck/elapsedTime)), App.Keys.GetLastKey()) 54 | App.LastKey.SetSaveLastKey(App.Carteira, fmt.Sprintf("%064x", App.Keys.GetLastKey())) 55 | 56 | case <-t.Ctx.Done(): 57 | t.Stop() 58 | return 59 | } 60 | } 61 | }() 62 | } 63 | -------------------------------------------------------------------------------- /cmd/core/database.go: -------------------------------------------------------------------------------- 1 | /** 2 | * BTCGO 3 | * 4 | * Modulo : Database 5 | */ 6 | 7 | package core 8 | 9 | import ( 10 | "btcgo/cmd/utils" 11 | "log" 12 | "os" 13 | "path/filepath" 14 | "time" 15 | 16 | badger "github.com/dgraph-io/badger/v4" 17 | ) 18 | 19 | type dbase struct { 20 | dbConn *badger.DB 21 | DBName string 22 | isStart bool 23 | } 24 | 25 | // Criar instancia 26 | func NewDatabase() *dbase { 27 | return &dbase{ 28 | isStart: false, 29 | } 30 | } 31 | 32 | // Start 33 | func (db *dbase) Start(carteira string) { 34 | rootDir, _ := utils.GetPath() 35 | op := badger.DefaultOptions(filepath.Join(rootDir, "db", carteira+".db")) 36 | op.Logger = nil 37 | dbo, err := badger.Open(op) 38 | if err != nil { 39 | log.Fatal(err) 40 | } 41 | db.dbConn = dbo 42 | db.isStart = true 43 | } 44 | 45 | // Add Key to DB 46 | func (db *dbase) InsertKey(key string) error { 47 | err := db.dbConn.Update(func(tx *badger.Txn) error { 48 | err := tx.Set([]byte(key), []byte(time.Now().Format("2006-01-02 15:04:05"))) 49 | return err 50 | }) 51 | return err 52 | } 53 | 54 | // Verify if Exist key 55 | func (db *dbase) ExistKey(key string) bool { 56 | err := db.dbConn.View(func(tx *badger.Txn) error { 57 | _, err := tx.Get([]byte(key)) 58 | return err 59 | }) 60 | return err == nil 61 | } 62 | 63 | // Delete Db 64 | func (db *dbase) Remove(carteira string) error { 65 | rootDir, _ := utils.GetPath() 66 | return os.RemoveAll(filepath.Join(rootDir, "db", carteira+".db")) 67 | } 68 | 69 | // Stop 70 | func (db *dbase) Stop() { 71 | if db.isStart { 72 | db.dbConn.Close() 73 | } 74 | } 75 | -------------------------------------------------------------------------------- /cmd/utils/wallets.go: -------------------------------------------------------------------------------- 1 | /** 2 | * BTCGO 3 | * 4 | * Modulo : Carteiras 5 | */ 6 | 7 | package utils 8 | 9 | import ( 10 | "encoding/json" 11 | "fmt" 12 | "os" 13 | ) 14 | 15 | // Wallet Struct 16 | type Wallet struct { 17 | FileName string 18 | SearchingWallets string 19 | DataWallet map[string]bool 20 | DataWalletID map[int]string 21 | } 22 | 23 | // Cria uma instancia 24 | func NewWalletData(filename string) *Wallet { 25 | return &Wallet{ 26 | FileName: filename, 27 | SearchingWallets: "", 28 | DataWallet: make(map[string]bool), 29 | DataWalletID: make(map[int]string), 30 | } 31 | } 32 | 33 | // Ler Carteiras para memoria 34 | func (w *Wallet) Load() error { 35 | bytes, err := os.ReadFile(w.FileName) 36 | if err != nil { 37 | return err 38 | } 39 | type WalletsTemp struct { 40 | Addresses []string `json:"wallets"` 41 | } 42 | var walletsTemp WalletsTemp 43 | if err := json.Unmarshal(bytes, &walletsTemp); err != nil { 44 | return err 45 | } 46 | for i, address := range walletsTemp.Addresses { 47 | w.DataWallet[string(Decode(address)[1:21])] = true 48 | //w.DataWallet[address] = true 49 | w.DataWalletID[i] = address 50 | } 51 | return nil 52 | } 53 | 54 | // Verifica se a carteira Existe 55 | func (w Wallet) Exist(wallet string) bool { 56 | if _, ok := w.DataWallet[wallet]; ok { 57 | return true 58 | } 59 | return false 60 | } 61 | 62 | // Set Wallet to Find 63 | func (w *Wallet) SetFindWallet(walletid int) { 64 | w.SearchingWallets = w.DataWalletID[walletid-1] 65 | fmt.Println(w.DataWalletID[walletid-1]) 66 | } 67 | 68 | // Is this Wallet need Find 69 | func (w *Wallet) IsSearchWallet(wallet string) bool { 70 | return w.SearchingWallets == wallet 71 | } 72 | -------------------------------------------------------------------------------- /cmd/utils/results.go: -------------------------------------------------------------------------------- 1 | /** 2 | * BTCGO 3 | * 4 | * Modulo : Gravar Resultados 5 | */ 6 | 7 | package utils 8 | 9 | import ( 10 | "context" 11 | "fmt" 12 | "math/big" 13 | "os" 14 | 15 | "github.com/fatih/color" 16 | ) 17 | 18 | type ResultDataStruct struct { 19 | Wallet string 20 | Key *big.Int 21 | Wif string 22 | HoraData string 23 | } 24 | 25 | type Results struct { 26 | // Context 27 | Ctx context.Context 28 | Cancel context.CancelFunc 29 | // Channels 30 | ResultChannel chan *ResultDataStruct 31 | // Data 32 | FileName string 33 | IsStarted bool 34 | } 35 | 36 | // Cria uma instancia 37 | func NewResults(mainctx context.Context, resultChannel chan *ResultDataStruct, filename string) *Results { 38 | newContext, NewCancel := context.WithCancel(mainctx) 39 | return &Results{ 40 | FileName: filename, 41 | Ctx: newContext, 42 | Cancel: NewCancel, 43 | ResultChannel: resultChannel, 44 | IsStarted: false, 45 | } 46 | } 47 | 48 | // Save Data 49 | func (rs Results) saveData(data *ResultDataStruct) error { 50 | file, err := os.OpenFile(rs.FileName, os.O_APPEND|os.O_CREATE|os.O_WRONLY, 0644) 51 | if err == nil { 52 | defer file.Close() 53 | _, err = file.WriteString(fmt.Sprintf("Data/Hora: %s | Chave privada: %064x | WIF: %s | Wallet: %s\n", data.HoraData, data.Key, data.Wif, data.Wallet)) 54 | } 55 | return err 56 | } 57 | 58 | // Start 59 | func (rs *Results) Start() { 60 | go func() { 61 | for { 62 | select { 63 | case data := <-rs.ResultChannel: 64 | color.Yellow("Wallet: %s\n", data.Wallet) 65 | color.Yellow("Chave privada encontrada: %064x\n", data.Key) 66 | color.Yellow("WIF: %s", data.Wif) 67 | if err := rs.saveData(data); err != nil { 68 | fmt.Println("Erro ao escrever no arquivo:", err) 69 | } 70 | 71 | case <-rs.Ctx.Done(): 72 | return 73 | } 74 | } 75 | }() 76 | rs.IsStarted = true 77 | } 78 | 79 | // Stop 80 | func (rs *Results) Stop() { 81 | rs.IsStarted = false 82 | if rs.IsStarted { 83 | rs.Cancel() 84 | } 85 | } 86 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # BTC GO v0.6.0 2 | [![instalação do Go no Windows](https://img.youtube.com/vi/679Zc7ZQLtI/0.jpg)](https://www.youtube.com/watch?v=679Zc7ZQLtI) 3 | 4 | ## Requisitos 5 | - [Go][install-go] 6 | - [Git][install-git] 7 | - Terminal 8 | 9 | # Instruções para rodar o projeto no Windows. 10 | 11 | * Clona o repo e brota na pasta: 12 | ```bash 13 | git clone [git@github.com:lmajowka/btcgo.git](https://github.com/lmajowka/btcgo.git) && cd btcgo 14 | ``` 15 | 16 | * Instala as parada: 17 | ```bash 18 | go mod tidy 19 | ``` 20 | 21 | * Faz o build do projeto: 22 | ```bash 23 | go build -o btcgo.exe ./cmd/main.go 24 | ``` 25 | 26 | * Executa o que foi compilado: 27 | ```bash 28 | btcgo 29 | ``` 30 | 31 | 32 | # Instruções para rodar o projeto no Linux / MacOS. 33 | 34 | * Clona o repo e brota na pasta: 35 | ```bash 36 | git clone [git@github.com:lmajowka/btcgo.git](https://github.com/lmajowka/btcgo.git) && cd btcgo 37 | ``` 38 | 39 | * Instala as parada: 40 | ```bash 41 | go mod tidy 42 | ``` 43 | 44 | * Faz o build do projeto: 45 | ```bash 46 | go build -o btcgo ./cmd/main.go 47 | ``` 48 | 49 | * Executa o que foi compilado: 50 | ```bash 51 | ./btcgo 52 | ``` 53 | 54 | # Instruções para rodar o projeto em container. 55 | 56 | ## Requisitos 57 | - [Docker][install-docker] 58 | - [Docker-compose][install-docker-compose] 59 | - [Git][install-git] 60 | 61 | ## Execução da parada 62 | 63 | * Clona o repo: 64 | ```bash 65 | git clone git@github.com:lmajowka/btcgo.git && cd btcgo 66 | ``` 67 | * Build do Dockerfile: 68 | ```bash 69 | docker buildx build --no-cache -t btcgo . 70 | ``` 71 | * Executa a imagem contruída no passo anterior: 72 | ```bash 73 | docker run --rm -it --name btcgo btcgo 74 | ``` 75 | 76 | Este container será deletado se a aplicação parar, para executar novamente basta executar o último comando acima. 77 | 78 | 79 | [install-go]: https://go.dev/doc/install 80 | [install-git]: https://git-scm.com/download/win 81 | [install-docker]: https://www.docker.com/get-started/ 82 | [install-docker-compose]: https://docs.docker.com/compose/install/ 83 | -------------------------------------------------------------------------------- /cmd/utils/ranges.go: -------------------------------------------------------------------------------- 1 | /** 2 | * BTCGO 3 | * 4 | * Modulo : Ranges 5 | */ 6 | 7 | package utils 8 | 9 | import ( 10 | "encoding/json" 11 | "errors" 12 | "os" 13 | ) 14 | 15 | // Range struct to hold the minimum, maximum, and status 16 | type ranges struct { 17 | Min string `json:"min"` 18 | Max string `json:"max"` 19 | Status int `json:"status"` 20 | } 21 | 22 | // Ranges struct to hold an array of ranges 23 | type Range struct { 24 | FileName string 25 | DataRanges map[int]ranges 26 | } 27 | 28 | // Cria uma instancia 29 | func NewRanges(filename string) *Range { 30 | return &Range{ 31 | FileName: filename, 32 | DataRanges: make(map[int]ranges), 33 | } 34 | } 35 | 36 | // Ler os ranges para memoria 37 | func (r *Range) Load() error { 38 | data, err := os.ReadFile(r.FileName) 39 | if err != nil { 40 | return err 41 | } 42 | 43 | // Temp Struct 44 | var xTmpRanges struct { 45 | Rang []ranges `json:"ranges"` 46 | } 47 | if err := json.Unmarshal(data, &xTmpRanges); err != nil { 48 | return err 49 | } 50 | for i, rgd := range xTmpRanges.Rang { 51 | r.DataRanges[i+1] = rgd 52 | } 53 | 54 | return nil 55 | } 56 | 57 | // Get range data 58 | func (r Range) Get(rangeid int) (ranges, error) { 59 | if _, ok := r.DataRanges[rangeid]; ok { 60 | return r.DataRanges[rangeid], nil 61 | } 62 | return ranges{}, errors.New("range not found") 63 | } 64 | 65 | // Get Min 66 | func (r Range) GetMin(rangeid int) (string, error) { 67 | if _, ok := r.DataRanges[rangeid]; ok { 68 | return r.DataRanges[rangeid].Min, nil 69 | } 70 | return "", errors.New("range not found") 71 | } 72 | 73 | // Get Max 74 | func (r Range) GetMax(rangeid int) (string, error) { 75 | if _, ok := r.DataRanges[rangeid]; ok { 76 | return r.DataRanges[rangeid].Max, nil 77 | } 78 | return "", errors.New("range not found") 79 | } 80 | 81 | // Get Status 82 | func (r Range) GetStatus(rangeid int) (int, error) { 83 | if _, ok := r.DataRanges[rangeid]; ok { 84 | return r.DataRanges[rangeid].Status, nil 85 | } 86 | return -1, errors.New("range not found") 87 | } 88 | 89 | // Get Status 90 | func (r Range) Count() int { 91 | return len(r.DataRanges) 92 | } 93 | -------------------------------------------------------------------------------- /cmd/utils/bitcoin.go: -------------------------------------------------------------------------------- 1 | /** 2 | * BTCGO 3 | * 4 | * Modulo : Bitcoin functions 5 | */ 6 | 7 | package utils 8 | 9 | import ( 10 | "crypto/sha256" 11 | "encoding/hex" 12 | "fmt" 13 | "log" 14 | "math/big" 15 | 16 | "github.com/decred/dcrd/dcrec/secp256k1/v4" 17 | "golang.org/x/crypto/ripemd160" 18 | ) 19 | 20 | func GenerateWif(privKeyInt *big.Int) string { 21 | privKeyHex := fmt.Sprintf("%064x", privKeyInt) 22 | 23 | // Decode the hexadecimal private key 24 | privKeyBytes, err := hex.DecodeString(privKeyHex) 25 | if err != nil { 26 | log.Fatal(err) 27 | } 28 | 29 | // Add prefix and sufix 30 | extendedKey := append([]byte{byte(0x80)}, privKeyBytes...) 31 | extendedKey = append(extendedKey, byte(0x01)) 32 | 33 | // Calc checksum 34 | firstSHA := sha256.Sum256(extendedKey) 35 | secondSHA := sha256.Sum256(firstSHA[:]) 36 | checksum := secondSHA[:4] 37 | 38 | // Add checksum 39 | finalKey := append(extendedKey, checksum...) 40 | 41 | // Encode to base58 42 | wif := Encode(finalKey) 43 | 44 | return wif 45 | } 46 | 47 | func CreatePublicHash160(privKeyInt *big.Int) []byte { 48 | 49 | privKeyBytes := privKeyInt.Bytes() 50 | 51 | // Create a new private key using the secp256k1 package 52 | privKey := secp256k1.PrivKeyFromBytes(privKeyBytes) 53 | 54 | // Get the corresponding public key in compressed format 55 | compressedPubKey := privKey.PubKey().SerializeCompressed() 56 | 57 | // Generate a Bitcoin address from the public key 58 | pubKeyHash := hash160(compressedPubKey) 59 | 60 | return pubKeyHash 61 | 62 | } 63 | 64 | func checksum(payload []byte) []byte { 65 | hash1 := sha256.Sum256(payload) 66 | hash2 := sha256.Sum256(hash1[:]) 67 | return hash2[:4] 68 | } 69 | 70 | func Hash160ToAddress(hash160 []byte) string { 71 | versionedPayload := append([]byte{0x00}, hash160...) 72 | checksum := checksum(versionedPayload) 73 | fullPayload := append(versionedPayload, checksum...) 74 | return Encode(fullPayload) 75 | } 76 | 77 | // hash160 computes the RIPEMD160(SHA256(b)) hash. 78 | func hash160(b []byte) []byte { 79 | h := sha256.New() 80 | h.Write(b) 81 | sha256Hash := h.Sum(nil) 82 | 83 | r := ripemd160.New() 84 | r.Write(sha256Hash) 85 | return r.Sum(nil) 86 | } 87 | -------------------------------------------------------------------------------- /cmd/core/workers.go: -------------------------------------------------------------------------------- 1 | /** 2 | * BTCGO 3 | * 4 | * Modulo : Workers 5 | */ 6 | 7 | package core 8 | 9 | import ( 10 | "btcgo/cmd/utils" 11 | "context" 12 | "math/big" 13 | "sync" 14 | "time" 15 | ) 16 | 17 | type workerStruct struct { 18 | } 19 | 20 | type Workers struct { 21 | // Context 22 | Ctx context.Context 23 | CtxCancel context.CancelFunc 24 | 25 | // Channels 26 | ResultChannel chan *utils.ResultDataStruct 27 | KeyChannel chan *big.Int 28 | Wg sync.WaitGroup 29 | 30 | // Data 31 | worker []workerStruct 32 | IsStarted bool 33 | } 34 | 35 | // Criar Instancia 36 | func NewWorkers(ctx context.Context, keych chan *big.Int, resultChannel chan *utils.ResultDataStruct) *Workers { 37 | newCtx, newCancel := context.WithCancel(ctx) 38 | return &Workers{ 39 | Ctx: newCtx, 40 | CtxCancel: newCancel, 41 | worker: []workerStruct{}, 42 | KeyChannel: keych, 43 | ResultChannel: resultChannel, 44 | IsStarted: false, 45 | } 46 | } 47 | 48 | // Start 49 | func (w *Workers) Start() { 50 | for i := 0; i < App.MaxWorkers; i++ { 51 | w.Wg.Add(1) 52 | go func() { 53 | defer w.Wg.Done() 54 | w.run() 55 | }() 56 | } 57 | w.IsStarted = true 58 | 59 | <-w.Ctx.Done() 60 | w.IsStarted = false 61 | } 62 | 63 | // Start Workers 64 | func (w *Workers) run() { 65 | for privKeyInt := range w.KeyChannel { 66 | if w.Ctx.Err() != nil { // StopRequest 67 | return 68 | } 69 | address := utils.CreatePublicHash160(privKeyInt) 70 | //wallet := utils.Hash160ToAddress(address) 71 | 72 | // Verificar se a chave está na carteira 73 | //if App.Wallets.Exist(wallet) { 74 | if App.Wallets.Exist(string(address)) { 75 | wallet := utils.Hash160ToAddress(address) 76 | w.ResultChannel <- &utils.ResultDataStruct{ 77 | Wallet: wallet, 78 | Key: privKeyInt, 79 | Wif: utils.GenerateWif(privKeyInt), 80 | HoraData: time.Now().Format("2006-01-02 15:04:05"), 81 | } 82 | // Verifica se era esta a carteira que procurava 83 | if App.Wallets.IsSearchWallet(wallet) { 84 | App.Stop(true) 85 | return 86 | } 87 | } 88 | } 89 | } 90 | 91 | // Stop Workers 92 | func (w *Workers) Stop() { 93 | if w.IsStarted { 94 | w.CtxCancel() 95 | } 96 | } 97 | -------------------------------------------------------------------------------- /cmd/utils/lastkey.go: -------------------------------------------------------------------------------- 1 | /** 2 | * BTCGO 3 | * 4 | * Modulo : Processa Ultima Chave 5 | */ 6 | 7 | package utils 8 | 9 | import ( 10 | "encoding/json" 11 | "errors" 12 | "os" 13 | "time" 14 | ) 15 | 16 | // File Data 17 | type FileDataStuct struct { 18 | Chave string `json:"chave"` 19 | DataHora string `json:"datahora"` 20 | } 21 | 22 | // LastKeyWallet Struct 23 | type LastKeyWallet struct { 24 | FileName string 25 | Data map[string]FileDataStuct 26 | } 27 | 28 | // Cria uma instancia 29 | func NewLastKeyWallet(filename string) *LastKeyWallet { 30 | return &LastKeyWallet{ 31 | FileName: filename, 32 | Data: make(map[string]FileDataStuct), 33 | } 34 | } 35 | 36 | // Ler fichiero para memoria 37 | func (l *LastKeyWallet) Load() error { 38 | // Busca todo o conteúdo atual do arquivo 39 | data, err := os.ReadFile(l.FileName) 40 | if err != nil { 41 | return err 42 | } 43 | err = json.Unmarshal(data, &l.Data) 44 | if err != nil { 45 | return err 46 | } 47 | return nil 48 | } 49 | 50 | // Save memory to file 51 | func (l LastKeyWallet) Save() error { 52 | // salva no arquivo com as modificações 53 | xData, err := json.Marshal(l.Data) 54 | if err == nil { 55 | err = os.WriteFile(l.FileName, xData, 0644) 56 | if err == nil { 57 | return nil 58 | } 59 | } 60 | return err 61 | } 62 | 63 | // Get last key 64 | func (l LastKeyWallet) GetLastKey(carteira string) (string, error) { 65 | if _, ok := l.Data[carteira]; ok { 66 | return l.Data[carteira].Chave, nil 67 | } 68 | return "", errors.New("not found") 69 | } 70 | 71 | // Load and get last Key 72 | func (l LastKeyWallet) LoadGetLastKey(carteira string) (string, error) { 73 | err := l.Load() 74 | if err == nil { 75 | return l.GetLastKey(carteira) 76 | } 77 | return "", err 78 | } 79 | 80 | // Set last key 81 | func (l *LastKeyWallet) SetLastKey(carteira string, key string) { 82 | l.Data[carteira] = FileDataStuct{ 83 | Chave: key, 84 | DataHora: time.Now().Format("2006-01-02 15:04:05"), 85 | } 86 | } 87 | 88 | // Set and save last Key 89 | func (l LastKeyWallet) SetSaveLastKey(carteira string, key string) error { 90 | l.Data[carteira] = FileDataStuct{ 91 | Chave: key, 92 | DataHora: time.Now().Format("2006-01-02 15:04:05"), 93 | } 94 | return l.Save() 95 | } 96 | -------------------------------------------------------------------------------- /cmd/utils/base.go: -------------------------------------------------------------------------------- 1 | /** 2 | * BTCGO 3 | * 4 | * Modulo : base functions 5 | */ 6 | 7 | package utils 8 | 9 | import ( 10 | "math/big" 11 | ) 12 | 13 | // base58Encode encodes a byte slice to a base58-encoded string. 14 | var base58Alphabet = []byte("123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz") 15 | 16 | var b58 = [256]byte{ 17 | 255, 255, 255, 255, 255, 255, 255, 255, 18 | 255, 255, 255, 255, 255, 255, 255, 255, 19 | 255, 255, 255, 255, 255, 255, 255, 255, 20 | 255, 255, 255, 255, 255, 255, 255, 255, 21 | 255, 255, 255, 255, 255, 255, 255, 255, 22 | 255, 255, 255, 255, 255, 255, 255, 255, 23 | 255, 0, 1, 2, 3, 4, 5, 6, 24 | 7, 8, 255, 255, 255, 255, 255, 255, 25 | 255, 9, 10, 11, 12, 13, 14, 15, 26 | 16, 255, 17, 18, 19, 20, 21, 255, 27 | 22, 23, 24, 25, 26, 27, 28, 29, 28 | 30, 31, 32, 255, 255, 255, 255, 255, 29 | 255, 33, 34, 35, 36, 37, 38, 39, 30 | 40, 41, 42, 43, 255, 44, 45, 46, 31 | 47, 48, 49, 50, 51, 52, 53, 54, 32 | 55, 56, 57, 255, 255, 255, 255, 255, 33 | 255, 255, 255, 255, 255, 255, 255, 255, 34 | 255, 255, 255, 255, 255, 255, 255, 255, 35 | 255, 255, 255, 255, 255, 255, 255, 255, 36 | 255, 255, 255, 255, 255, 255, 255, 255, 37 | 255, 255, 255, 255, 255, 255, 255, 255, 38 | 255, 255, 255, 255, 255, 255, 255, 255, 39 | 255, 255, 255, 255, 255, 255, 255, 255, 40 | 255, 255, 255, 255, 255, 255, 255, 255, 41 | 255, 255, 255, 255, 255, 255, 255, 255, 42 | 255, 255, 255, 255, 255, 255, 255, 255, 43 | 255, 255, 255, 255, 255, 255, 255, 255, 44 | 255, 255, 255, 255, 255, 255, 255, 255, 45 | 255, 255, 255, 255, 255, 255, 255, 255, 46 | 255, 255, 255, 255, 255, 255, 255, 255, 47 | 255, 255, 255, 255, 255, 255, 255, 255, 48 | 255, 255, 255, 255, 255, 255, 255, 255, 49 | } 50 | 51 | var bigRadix10 = big.NewInt(58 * 58 * 58 * 58 * 58 * 58 * 58 * 58 * 58 * 58) // 58^10 52 | var bigRadix = [...]*big.Int{ 53 | big.NewInt(0), 54 | big.NewInt(58), 55 | big.NewInt(58 * 58), 56 | big.NewInt(58 * 58 * 58), 57 | big.NewInt(58 * 58 * 58 * 58), 58 | big.NewInt(58 * 58 * 58 * 58 * 58), 59 | big.NewInt(58 * 58 * 58 * 58 * 58 * 58), 60 | big.NewInt(58 * 58 * 58 * 58 * 58 * 58 * 58), 61 | big.NewInt(58 * 58 * 58 * 58 * 58 * 58 * 58 * 58), 62 | big.NewInt(58 * 58 * 58 * 58 * 58 * 58 * 58 * 58 * 58), 63 | bigRadix10, 64 | } 65 | 66 | func Encode(input []byte) string { 67 | var result []byte 68 | x := new(big.Int).SetBytes(input) 69 | 70 | base := big.NewInt(int64(len(base58Alphabet))) 71 | zero := big.NewInt(0) 72 | mod := &big.Int{} 73 | 74 | for x.Cmp(zero) != 0 { 75 | x.DivMod(x, base, mod) 76 | result = append(result, base58Alphabet[mod.Int64()]) 77 | } 78 | 79 | // Reverse the result 80 | for i, j := 0, len(result)-1; i < j; i, j = i+1, j-1 { 81 | result[i], result[j] = result[j], result[i] 82 | } 83 | 84 | // Add leading zeroes 85 | for _, b := range input { 86 | if b != 0 { 87 | break 88 | } 89 | result = append([]byte{base58Alphabet[0]}, result...) 90 | } 91 | 92 | return string(result) 93 | } 94 | 95 | func Decode(b string) []byte { 96 | answer := big.NewInt(0) 97 | scratch := new(big.Int) 98 | 99 | for t := b; len(t) > 0; { 100 | n := len(t) 101 | if n > 10 { 102 | n = 10 103 | } 104 | 105 | total := uint64(0) 106 | for _, v := range t[:n] { 107 | if v > 255 { 108 | return []byte("") 109 | } 110 | 111 | tmp := b58[v] 112 | if tmp == 255 { 113 | return []byte("") 114 | } 115 | total = total*58 + uint64(tmp) 116 | } 117 | 118 | answer.Mul(answer, bigRadix[n]) 119 | scratch.SetUint64(total) 120 | answer.Add(answer, scratch) 121 | 122 | t = t[n:] 123 | } 124 | 125 | tmpval := answer.Bytes() 126 | 127 | var numZeros int 128 | for numZeros = 0; numZeros < len(b); numZeros++ { 129 | if b[numZeros] != '1' { 130 | break 131 | } 132 | } 133 | flen := numZeros + len(tmpval) 134 | val := make([]byte, flen) 135 | copy(val[numZeros:], tmpval) 136 | 137 | return val 138 | } 139 | -------------------------------------------------------------------------------- /cmd/core/app.go: -------------------------------------------------------------------------------- 1 | /** 2 | * App BTCGO 3 | */ 4 | 5 | package core 6 | 7 | import ( 8 | "btcgo/cmd/utils" 9 | "context" 10 | "log" 11 | "math/big" 12 | "path/filepath" 13 | "runtime" 14 | "time" 15 | ) 16 | 17 | type AppStruct struct { 18 | Ctx context.Context 19 | CtxCancel context.CancelFunc 20 | 21 | LastKey *utils.LastKeyWallet 22 | Wallets *utils.Wallet 23 | Ranges *utils.Range 24 | Results *utils.Results 25 | Ticker *TimerUpdater 26 | Workers *Workers 27 | Keys *GenKeys 28 | DB *dbase 29 | 30 | // Channels 31 | ResultChannel chan *utils.ResultDataStruct 32 | KeyChannel chan *big.Int 33 | 34 | // Data 35 | Carteira string 36 | RangeNumber int // id range slice 37 | Modo int 38 | USEDB int 39 | MaxWorkers int 40 | DesdeInicio bool 41 | StartPosPercent float64 42 | } 43 | 44 | var App *AppStruct 45 | 46 | func NewApp() { 47 | // Create App Instance 48 | App = appInit() 49 | 50 | defer func() { 51 | close(App.ResultChannel) 52 | close(App.KeyChannel) 53 | App.DB.Stop() 54 | }() 55 | 56 | // Load Files 57 | err := App.loadData() 58 | if err != nil { 59 | log.Fatalln(err) 60 | } 61 | 62 | // Request Prompts 63 | App.consolePrompts() 64 | 65 | // Set Number Max of CPUs 66 | App.setCPUs() 67 | 68 | // Start 69 | App.start() 70 | 71 | <-App.Ctx.Done() 72 | log.Println("finished") 73 | } 74 | 75 | // Init Application 76 | func appInit() *AppStruct { 77 | rootDir, err := utils.GetPath() 78 | if err != nil { 79 | log.Panicln("Erro ao obter o caminho do executável") 80 | } 81 | 82 | newContext, newCancel := context.WithCancel(context.Background()) 83 | var resultChannel = make(chan *utils.ResultDataStruct, 1) 84 | var keych = make(chan *big.Int) 85 | 86 | return &AppStruct{ 87 | // Context 88 | Ctx: newContext, 89 | CtxCancel: newCancel, 90 | // Channels 91 | ResultChannel: resultChannel, 92 | KeyChannel: keych, 93 | 94 | // create instances 95 | LastKey: utils.NewLastKeyWallet(filepath.Join(rootDir, "data", "lastkeys.json")), 96 | Wallets: utils.NewWalletData(filepath.Join(rootDir, "data", "wallets.json")), 97 | Ranges: utils.NewRanges(filepath.Join(rootDir, "data", "ranges.json")), 98 | Results: utils.NewResults(newContext, resultChannel, filepath.Join(rootDir, "chaves_encontradas.txt")), 99 | Ticker: NewTicker(newContext), 100 | Workers: NewWorkers(newContext, keych, resultChannel), 101 | Keys: NewGenKeys(newContext, keych), 102 | DB: NewDatabase(), 103 | } 104 | } 105 | 106 | // Loading data 107 | func (a *AppStruct) loadData() error { 108 | // Ultimas Chaves Processadas 109 | a.LastKey.Load() 110 | // Carregar as carteiras em memoria 111 | if err := a.Wallets.Load(); err != nil { 112 | log.Println("Não foi possivel ler as carteiras") 113 | return err 114 | } 115 | // Carrega Ranges 116 | if err := a.Ranges.Load(); err != nil { 117 | log.Println("Não foi possivel ler oa ranges.") 118 | return err 119 | } 120 | return nil 121 | } 122 | 123 | // Get User request 124 | func (a *AppStruct) consolePrompts() { 125 | RequestData() 126 | } 127 | 128 | // Set CPUs 129 | func (a *AppStruct) setCPUs() { 130 | runtime.GOMAXPROCS(a.MaxWorkers) 131 | } 132 | 133 | // Start App Calc 134 | func (a *AppStruct) start() { 135 | // Change Channel Size 136 | a.KeyChannel = make(chan *big.Int, a.MaxWorkers) 137 | // Start 138 | if a.USEDB == 1 { 139 | a.DB.Start(a.Carteira) // Criar uma db para esta carteira 140 | } 141 | a.Results.Start() // Start Rotina que grava os resultados 142 | a.Ticker.Start(5) // Inicia as actualizaçóes da ultima chave 143 | a.Keys.Start() // Gerar Chaves 144 | a.Workers.Start() // Inicia os workers 145 | } 146 | 147 | // Stop App 148 | func (a *AppStruct) Stop(saveLastKey bool) { 149 | a.Keys.Stop() 150 | a.Workers.Stop() 151 | for { 152 | if !a.Workers.IsStarted { 153 | break 154 | } 155 | time.Sleep(100 * time.Millisecond) 156 | } 157 | a.Ticker.Stop() 158 | a.Results.Stop() 159 | a.CtxCancel() 160 | } 161 | -------------------------------------------------------------------------------- /cmd/core/console.go: -------------------------------------------------------------------------------- 1 | /** 2 | * BTCGO 3 | * 4 | * Modulo : Consola 5 | */ 6 | 7 | package core 8 | 9 | import ( 10 | "btcgo/cmd/utils" 11 | "bufio" 12 | "fmt" 13 | "os" 14 | "runtime" 15 | "strconv" 16 | "strings" 17 | 18 | "github.com/fatih/color" 19 | ) 20 | 21 | func RequestData() { 22 | green := color.New(color.FgGreen).SprintFunc() 23 | // Number of CPU cores to use 24 | fmt.Printf("\nCPUs detectados: %s", green(runtime.NumCPU())) 25 | App.MaxWorkers = readCPUsForUse() 26 | 27 | // Ask the user for the range number 28 | App.RangeNumber = promptRangeNumber() 29 | App.Carteira = fmt.Sprintf("%d", App.RangeNumber) 30 | 31 | // Set Search Wallet address 32 | App.Wallets.SetFindWallet(App.RangeNumber) 33 | 34 | // Pergunta sobre modos de usar 35 | App.Modo = promptMods(3) // quantidade de modos 36 | 37 | if App.Modo == 2 { 38 | App.DesdeInicio = false 39 | msSequencialouInicio := promptForIntInRange( 40 | "\n\nOpção 1: Deseja começar do inicio da busca (não efetivo) ou \nOpção 2: Escolher entre o range da carteira informada? \n\nPor favor numero entre 1 ou 2: ", 41 | "Número inválido. Escolha entre 1 ou 2.", 42 | 1, 2) 43 | if msSequencialouInicio == 1 { 44 | App.DesdeInicio = true 45 | } else { 46 | _, err := App.LastKey.GetLastKey(App.Carteira) 47 | if err != nil { 48 | // Solicitando a porcentagem do range da carteira como entrada 49 | var rangeCarteiraSequencialStr string 50 | fmt.Print("Informe a porcentagem do range da carteira entre 1 a 100: ") 51 | fmt.Scanln(&rangeCarteiraSequencialStr) 52 | // Substituindo vírgulas por pontos se necessário 53 | rangeCarteiraSequencialStr = strings.Replace(rangeCarteiraSequencialStr, ",", ".", -1) 54 | App.StartPosPercent, _ = strconv.ParseFloat(rangeCarteiraSequencialStr, 64) 55 | } 56 | } 57 | } else if App.Modo == 3 { 58 | App.USEDB = promptUseDB(2) 59 | App.Keys.SetRecs(promptNumRecsRandom()) 60 | } 61 | } 62 | 63 | // Quantos CPUs gostaria de usar? 64 | func readCPUsForUse() int { 65 | requestStr := "\n\nQuantos CPUs gostaria de usar?: " 66 | errorStr := "Numero invalido." 67 | return promptForIntInRange(requestStr, errorStr, 1, 50) 68 | } 69 | 70 | // promptRangeNumber prompts the user to select a range number 71 | func promptRangeNumber() int { 72 | totalRanges := App.Ranges.Count() 73 | requestStr := fmt.Sprintf("\n\nEscolha a carteira (1 a %d): ", totalRanges) 74 | errorStr := "Numero invalido." 75 | return promptForIntInRange(requestStr, errorStr, 1, totalRanges) 76 | } 77 | 78 | // PromptModos prompts the user to select a modo's 79 | func promptMods(totalModos int) int { 80 | requestStr := fmt.Sprintf("\n\nEscolha os modos que deseja de (1 a %d)\n\nModo do inicio: 1\nModo sequencial(chave do arquivo): 2\nModo Random: 3\n\nEscolha o modo: ", totalModos) 81 | errorStr := "Modo invalido." 82 | return promptForIntInRange(requestStr, errorStr, 1, totalModos) 83 | } 84 | 85 | // PromptModos prompts the user to select a modo's 86 | func promptUseDB(totalModos int) int { 87 | requestStr := "\nUtiliza BaseDados para controlar repetiçóes?\nModo Random com DB: 1\nModo Random sem DB: 2\n\nEscolha o modo: " 88 | errorStr := "Modo invalido." 89 | return promptForIntInRange(requestStr, errorStr, 1, totalModos) 90 | } 91 | 92 | // PromptModos prompts the user to select a modo's 93 | func promptNumRecsRandom() int { 94 | requestStr := "\nNumero registos por cada random (ex. 10000): " 95 | errorStr := "Modo invalido." 96 | return promptForIntInRange(requestStr, errorStr, 1, 0) 97 | } 98 | 99 | // PromptAuto solicita ao usuário a seleção de um número dentro de um intervalo específico. 100 | // Sera retornado um numero que necessariamente atenda a (min <= X <= max) onde X foi o numero escolhido do usuario 101 | func promptForIntInRange(request_str string, error_str string, mim int, max int) int { 102 | charReadline := utils.GetEndLineChar() 103 | reader := bufio.NewReader(os.Stdin) 104 | for { 105 | fmt.Print(request_str) 106 | input, _ := reader.ReadString(byte(charReadline)) 107 | input = strings.TrimSpace(input) 108 | resposta, err := strconv.Atoi(input) 109 | if max == 0 { 110 | if err == nil && resposta >= mim { 111 | return resposta 112 | } 113 | } 114 | if err == nil && resposta >= mim && resposta <= max { 115 | return resposta 116 | } 117 | fmt.Println(error_str) 118 | } 119 | } 120 | -------------------------------------------------------------------------------- /cmd/core/genkeys.go: -------------------------------------------------------------------------------- 1 | /** 2 | * BTCGO 3 | * 4 | * Modulo : Generate Keys 5 | */ 6 | 7 | package core 8 | 9 | import ( 10 | "context" 11 | "fmt" 12 | "math/big" 13 | "math/rand/v2" 14 | ) 15 | 16 | type GenKeys struct { 17 | // Context 18 | Ctx context.Context 19 | CtxCancel context.CancelFunc 20 | // Channels 21 | 22 | // Data 23 | TotalGenKeys float64 24 | KeyChannel chan *big.Int 25 | PrivKeyInt *big.Int 26 | IsStarted bool 27 | 28 | NumRecsRandom int 29 | } 30 | 31 | // Criar Instancia 32 | func NewGenKeys(ctx context.Context, keyChannel chan *big.Int) *GenKeys { 33 | newCtx, newCancel := context.WithCancel(ctx) 34 | return &GenKeys{ 35 | Ctx: newCtx, 36 | CtxCancel: newCancel, 37 | TotalGenKeys: 0, 38 | KeyChannel: keyChannel, 39 | PrivKeyInt: big.NewInt(0), 40 | IsStarted: false, 41 | } 42 | } 43 | 44 | // Find Start Position 45 | func (g *GenKeys) findStartPos() { 46 | switch App.Modo { 47 | case 1: 48 | g.posInicio() 49 | 50 | case 2: 51 | if !App.DesdeInicio { 52 | key, err := App.LastKey.GetLastKey(App.Carteira) 53 | if err != nil || key == "" { 54 | g.fromPercent() 55 | fmt.Printf("Range informado, iniciando: %s\n", key) 56 | } else { 57 | g.PrivKeyInt.SetString(key, 16) 58 | fmt.Printf("Encontrada chave no arquivo. Carteira %s: %s\n", App.Carteira, key) 59 | } 60 | } else { 61 | g.posInicio() 62 | } 63 | 64 | case 3: 65 | App.StartPosPercent = g.genRandom() 66 | g.fromPercent() 67 | App.Modo = 31 68 | //log.Println("Encotrada uma nova chave", App.StartPosPercent, "%") 69 | } 70 | } 71 | 72 | // Procura o inicio/random atravez de % 73 | func (g *GenKeys) fromPercent() { 74 | privKeyMinInt := new(big.Int) 75 | privKeyMaxInt := new(big.Int) 76 | privKeyMin, _ := App.Ranges.GetMin(App.RangeNumber) 77 | privKeyMax, _ := App.Ranges.GetMax(App.RangeNumber) 78 | privKeyMinInt.SetString(privKeyMin[2:], 16) 79 | privKeyMaxInt.SetString(privKeyMax[2:], 16) 80 | // Calculando a diferença entre privKeyMaxInt e privKeyMinInt 81 | rangeKey := new(big.Int).Sub(privKeyMaxInt, privKeyMinInt) 82 | // Calculando o valor de rangeKey multiplicado pela porcentagem 83 | rangeMultiplier := new(big.Float).Mul(new(big.Float).SetInt(rangeKey), big.NewFloat(App.StartPosPercent/100.0)) 84 | // Convertendo o resultado para inteiro (arredondamento para baixo) 85 | min := new(big.Int) 86 | rangeMultiplier.Int(min) 87 | // Adicionando rangeMultiplier ao valor mínimo (privKeyMinInt) 88 | min.Add(privKeyMinInt, min) 89 | // Verificando o valor final como uma string hexadecimal 90 | key := min.Text(16) 91 | g.PrivKeyInt.SetString(key, 16) 92 | } 93 | 94 | // Set o Range desde o inicio 95 | func (g *GenKeys) posInicio() { 96 | privKeyHex, _ := App.Ranges.GetMin(App.RangeNumber) 97 | //log.Println(privKeyHex, a.RangeNumber) 98 | g.PrivKeyInt.SetString(privKeyHex[2:], 16) 99 | } 100 | 101 | // Start 102 | func (g *GenKeys) Start() { 103 | // Find Start Position 104 | g.findStartPos() 105 | go func() { 106 | xTmpRandomCtrl := 0 // Despois de fazer random testa 10000 chaves seguintes 107 | for { 108 | if App.USEDB == 1 { 109 | if App.Modo == 3 || App.Modo == 31 { 110 | xFail := 0 111 | for { 112 | if App.Modo == 3 { 113 | if !App.DB.ExistKey(fmt.Sprintf("%064x", g.PrivKeyInt)) { 114 | break 115 | } else { 116 | //log.Println("(3)key tested", fmt.Sprintf("%064x", g.PrivKeyInt)) 117 | App.StartPosPercent = g.genRandom() 118 | g.fromPercent() 119 | //log.Println("(3)find other", fmt.Sprintf("%064x", g.PrivKeyInt)) 120 | } 121 | } else if App.Modo == 31 { 122 | if !App.DB.ExistKey(fmt.Sprintf("%064x", g.PrivKeyInt)) { 123 | break 124 | } else { 125 | if xFail > 100 { 126 | App.Modo = 3 127 | xFail = 0 128 | } else { 129 | //log.Println("(31)key tested", fmt.Sprintf("%064x", g.PrivKeyInt)) 130 | x := g.PrivKeyInt.Add(g.PrivKeyInt, big.NewInt(1)) 131 | g.PrivKeyInt = new(big.Int).Set(x) 132 | //log.Println("(31)find other", fmt.Sprintf("%064x \n %064x", x, g.PrivKeyInt)) 133 | xFail++ 134 | } 135 | } 136 | } 137 | } 138 | App.DB.InsertKey(fmt.Sprintf("%064x", g.PrivKeyInt)) 139 | } 140 | } 141 | 142 | privKeyCopy := new(big.Int).Set(g.PrivKeyInt) 143 | select { 144 | case g.KeyChannel <- privKeyCopy: 145 | if App.Modo == 3 { 146 | App.Modo = 31 147 | App.StartPosPercent = g.genRandom() 148 | g.fromPercent() 149 | } else { 150 | if App.Modo == 31 { 151 | if xTmpRandomCtrl > g.NumRecsRandom { 152 | // Na proxima chave volta a fazer um random 153 | App.Modo = 3 154 | xTmpRandomCtrl = 0 155 | } else { 156 | xTmpRandomCtrl++ 157 | } 158 | } 159 | g.PrivKeyInt.Add(g.PrivKeyInt, big.NewInt(1)) 160 | } 161 | g.TotalGenKeys++ 162 | 163 | case <-g.Ctx.Done(): 164 | return 165 | } 166 | } 167 | }() 168 | } 169 | 170 | // Get Total Gen Keys 171 | func (g GenKeys) GetTotalKeys() float64 { 172 | return g.TotalGenKeys 173 | } 174 | 175 | // Get Last Key 176 | func (g *GenKeys) GetLastKey() *big.Int { 177 | return g.PrivKeyInt 178 | } 179 | 180 | // Set Numero de Resc no Random 181 | func (g *GenKeys) SetRecs(recs int) { 182 | g.NumRecsRandom = recs 183 | } 184 | 185 | // Gerar um valor % random 186 | func (g *GenKeys) genRandom() float64 { 187 | min := float64(0) 188 | max := float64(100) 189 | ranF := (min + rand.Float64()*(max-min)) 190 | return ranF 191 | } 192 | 193 | // Stop 194 | func (g *GenKeys) Stop() { 195 | g.IsStarted = false 196 | if g.IsStarted { 197 | g.CtxCancel() 198 | } 199 | } 200 | -------------------------------------------------------------------------------- /data/wallets.json: -------------------------------------------------------------------------------- 1 | { 2 | "wallets": [ 3 | "1BgGZ9tcN4rm9KBzDn7KprQz87SZ26SAMH", 4 | "1CUNEBjYrCn2y1SdiUMohaKUi4wpP326Lb", 5 | "19ZewH8Kk1PDbSNdJ97FP4EiCjTRaZMZQA", 6 | "1EhqbyUMvvs7BfL8goY6qcPbD6YKfPqb7e", 7 | "1E6NuFjCi27W5zoXg8TRdcSRq84zJeBW3k", 8 | "1PitScNLyp2HCygzadCh7FveTnfmpPbfp8", 9 | "1McVt1vMtCC7yn5b9wgX1833yCcLXzueeC", 10 | "1M92tSqNmQLYw33fuBvjmeadirh1ysMBxK", 11 | "1CQFwcjw1dwhtkVWBttNLDtqL7ivBonGPV", 12 | "1LeBZP5QCwwgXRtmVUvTVrraqPUokyLHqe", 13 | "1PgQVLmst3Z314JrQn5TNiys8Hc38TcXJu", 14 | "1DBaumZxUkM4qMQRt2LVWyFJq5kDtSZQot", 15 | "1Pie8JkxBT6MGPz9Nvi3fsPkr2D8q3GBc1", 16 | "1ErZWg5cFCe4Vw5BzgfzB74VNLaXEiEkhk", 17 | "1QCbW9HWnwQWiQqVo5exhAnmfqKRrCRsvW", 18 | "1BDyrQ6WoF8VN3g9SAS1iKZcPzFfnDVieY", 19 | "1HduPEXZRdG26SUT5Yk83mLkPyjnZuJ7Bm", 20 | "1GnNTmTVLZiqQfLbAdp9DVdicEnB5GoERE", 21 | "1NWmZRpHH4XSPwsW6dsS3nrNWfL1yrJj4w", 22 | "1HsMJxNiV7TLxmoF6uJNkydxPFDog4NQum", 23 | "14oFNXucftsHiUMY8uctg6N487riuyXs4h", 24 | "1CfZWK1QTQE3eS9qn61dQjV89KDjZzfNcv", 25 | "1L2GM8eE7mJWLdo3HZS6su1832NX2txaac", 26 | "1rSnXMr63jdCuegJFuidJqWxUPV7AtUf7", 27 | "15JhYXn6Mx3oF4Y7PcTAv2wVVAuCFFQNiP", 28 | "1JVnST957hGztonaWK6FougdtjxzHzRMMg", 29 | "128z5d7nN7PkCuX5qoA4Ys6pmxUYnEy86k", 30 | "12jbtzBb54r97TCwW3G1gCFoumpckRAPdY", 31 | "19EEC52krRUK1RkUAEZmQdjTyHT7Gp1TYT", 32 | "1LHtnpd8nU5VHEMkG2TMYYNUjjLc992bps", 33 | "1LhE6sCTuGae42Axu1L1ZB7L96yi9irEBE", 34 | "1FRoHA9xewq7DjrZ1psWJVeTer8gHRqEvR", 35 | "187swFMjz1G54ycVU56B7jZFHFTNVQFDiu", 36 | "1PWABE7oUahG2AFFQhhvViQovnCr4rEv7Q", 37 | "1PWCx5fovoEaoBowAvF5k91m2Xat9bMgwb", 38 | "1Be2UF9NLfyLFbtm3TCbmuocc9N1Kduci1", 39 | "14iXhn8bGajVWegZHJ18vJLHhntcpL4dex", 40 | "1HBtApAFA9B2YZw3G2YKSMCtb3dVnjuNe2", 41 | "122AJhKLEfkFBaGAd84pLp1kfE7xK3GdT8", 42 | "1EeAxcprB2PpCnr34VfZdFrkUWuxyiNEFv", 43 | "1L5sU9qvJeuwQUdt4y1eiLmquFxKjtHr3E", 44 | "1E32GPWgDyeyQac4aJxm9HVoLrrEYPnM4N", 45 | "1PiFuqGpG8yGM5v6rNHWS3TjsG6awgEGA1", 46 | "1CkR2uS7LmFwc3T2jV8C1BhWb5mQaoxedF", 47 | "1NtiLNGegHWE3Mp9g2JPkgx6wUg4TW7bbk", 48 | "1F3JRMWudBaj48EhwcHDdpeuy2jwACNxjP", 49 | "1Pd8VvT49sHKsmqrQiP61RsVwmXCZ6ay7Z", 50 | "1DFYhaB2J9q1LLZJWKTnscPWos9VBqDHzv", 51 | "12CiUhYVTTH33w3SPUBqcpMoqnApAV4WCF", 52 | "1MEzite4ReNuWaL5Ds17ePKt2dCxWEofwk", 53 | "1NpnQyZ7x24ud82b7WiRNvPm6N8bqGQnaS", 54 | "15z9c9sVpu6fwNiK7dMAFgMYSK4GqsGZim", 55 | "15K1YKJMiJ4fpesTVUcByoz334rHmknxmT", 56 | "1KYUv7nSvXx4642TKeuC2SNdTk326uUpFy", 57 | "1LzhS3k3e9Ub8i2W1V8xQFdB8n2MYCHPCa", 58 | "17aPYR1m6pVAacXg1PTDDU7XafvK1dxvhi", 59 | "15c9mPGLku1HuW9LRtBf4jcHVpBUt8txKz", 60 | "1Dn8NF8qDyyfHMktmuoQLGyjWmZXgvosXf", 61 | "1HAX2n9Uruu9YDt4cqRgYcvtGvZj1rbUyt", 62 | "1Kn5h2qpgw9mWE5jKpk8PP4qvvJ1QVy8su", 63 | "1AVJKwzs9AskraJLGHAZPiaZcrpDr1U6AB", 64 | "1Me6EfpwZK5kQziBwBfvLiHjaPGxCKLoJi", 65 | "1NpYjtLira16LfGbGwZJ5JbDPh3ai9bjf4", 66 | "16jY7qLJnxb7CHZyqBP8qca9d51gAjyXQN", 67 | "18ZMbwUFLMHoZBbfpCjUJQTCMCbktshgpe", 68 | "13zb1hQbWVsc2S7ZTZnP2G4undNNpdh5so", 69 | "1BY8GQbnueYofwSuFAT3USAhGjPrkxDdW9", 70 | "1MVDYgVaSN6iKKEsbzRUAYFrYJadLYZvvZ", 71 | "19vkiEajfhuZ8bs8Zu2jgmC6oqZbWqhxhG", 72 | "19YZECXj3SxEZMoUeJ1yiPsw8xANe7M7QR", 73 | "1PWo3JeB9jrGwfHDNpdGK54CRas7fsVzXU", 74 | "1JTK7s9YVYywfm5XUH7RNhHJH1LshCaRFR", 75 | "12VVRNPi4SJqUTsp6FmqDqY5sGosDtysn4", 76 | "1FWGcVDK3JGzCC3WtkYetULPszMaK2Jksv", 77 | "1J36UjUByGroXcCvmj13U6uwaVv9caEeAt", 78 | "1DJh2eHFYQfACPmrvpyWc8MSTYKh7w9eRF", 79 | "1Bxk4CQdqL9p22JEtDfdXMsng1XacifUtE", 80 | "15qF6X51huDjqTmF9BJgxXdt1xcj46Jmhb", 81 | "1ARk8HWJMn8js8tQmGUJeQHjSE7KRkn2t8", 82 | "1BCf6rHUW6m3iH2ptsvnjgLruAiPQQepLe", 83 | "15qsCm78whspNQFydGJQk5rexzxTQopnHZ", 84 | "13zYrYhhJxp6Ui1VV7pqa5WDhNWM45ARAC", 85 | "14MdEb4eFcT3MVG5sPFG4jGLuHJSnt1Dk2", 86 | "1CMq3SvFcVEcpLMuuH8PUcNiqsK1oicG2D", 87 | "1Kh22PvXERd2xpTQk3ur6pPEqFeckCJfAr", 88 | "1K3x5L6G57Y494fDqBfrojD28UJv4s5JcK", 89 | "1PxH3K1Shdjb7gSEoTX7UPDZ6SH4qGPrvq", 90 | "16AbnZjZZipwHMkYKBSfswGWKDmXHjEpSf", 91 | "19QciEHbGVNY4hrhfKXmcBBCrJSBZ6TaVt", 92 | "1L12FHH2FHjvTviyanuiFVfmzCy46RRATU", 93 | "1EzVHtmbN4fs4MiNk3ppEnKKhsmXYJ4s74", 94 | "1AE8NzzgKE7Yhz7BWtAcAAxiFMbPo82NB5", 95 | "17Q7tuG2JwFFU9rXVj3uZqRtioH3mx2Jad", 96 | "1K6xGMUbs6ZTXBnhw1pippqwK6wjBWtNpL", 97 | "19eVSDuizydXxhohGh8Ki9WY9KsHdSwoQC", 98 | "15ANYzzCp5BFHcCnVFzXqyibpzgPLWaD8b", 99 | "18ywPwj39nGjqBrQJSzZVq2izR12MDpDr8", 100 | "1CaBVPrwUxbQYYswu32w7Mj4HR4maNoJSX", 101 | "1JWnE6p6UN7ZJBN7TtcbNDoRcjFtuDWoNL", 102 | "1KCgMv8fo2TPBpddVi9jqmMmcne9uSNJ5F", 103 | "1CKCVdbDJasYmhswB6HKZHEAnNaDpK7W4n", 104 | "1PXv28YxmYMaB8zxrKeZBW8dt2HK7RkRPX", 105 | "1AcAmB6jmtU6AiEcXkmiNE9TNVPsj9DULf", 106 | "1EQJvpsmhazYCcKX5Au6AZmZKRnzarMVZu", 107 | "1CMjscKB3QW7SDyQ4c3C3DEUHiHRhiZVib", 108 | "18KsfuHuzQaBTNLASyj15hy4LuqPUo1FNB", 109 | "15EJFC5ZTs9nhsdvSUeBXjLAuYq3SWaxTc", 110 | "1HB1iKUqeffnVsvQsbpC6dNi1XKbyNuqao", 111 | "1GvgAXVCbA8FBjXfWiAms4ytFeJcKsoyhL", 112 | "12JzYkkN76xkwvcPT6AWKZtGX6w2LAgsJg", 113 | "1824ZJQ7nKJ9QFTRBqn7z7dHV5EGpzUpH3", 114 | "18A7NA9FTsnJxWgkoFfPAFbQzuQxpRtCos", 115 | "1NeGn21dUDDeqFQ63xb2SpgUuXuBLA4WT4", 116 | "174SNxfqpdMGYy5YQcfLbSTK3MRNZEePoy", 117 | "1NLbHuJebVwUZ1XqDjsAyfTRUPwDQbemfv", 118 | "1MnJ6hdhvK37VLmqcdEwqC3iFxyWH2PHUV", 119 | "1KNRfGWw7Q9Rmwsc6NT5zsdvEb9M2Wkj5Z", 120 | "1PJZPzvGX19a7twf5HyD2VvNiPdHLzm9F6", 121 | "1GuBBhf61rnvRe4K8zu8vdQB3kHzwFqSy7", 122 | "17s2b9ksz5y7abUm92cHwG8jEPCzK3dLnT", 123 | "1GDSuiThEV64c166LUFC9uDcVdGjqkxKyh", 124 | "1Me3ASYt5JCTAK2XaC32RMeH34PdprrfDx", 125 | "1CdufMQL892A69KXgv6UNBD17ywWqYpKut", 126 | "1BkkGsX9ZM6iwL3zbqs7HWBV7SvosR6m8N", 127 | "1PXAyUB8ZoH3WD8n5zoAthYjN15yN5CVq5", 128 | "1AWCLZAjKbV1P7AHvaPNCKiB7ZWVDMxFiz", 129 | "1G6EFyBRU86sThN3SSt3GrHu1sA7w7nzi4", 130 | "1MZ2L1gFrCtkkn6DnTT2e4PFUTHw9gNwaj", 131 | "1Hz3uv3nNZzBVMXLGadCucgjiCs5W9vaGz", 132 | "1Fo65aKq8s8iquMt6weF1rku1moWVEd5Ua", 133 | "16zRPnT8znwq42q7XeMkZUhb1bKqgRogyy", 134 | "1KrU4dHE5WrW8rhWDsTRjR21r8t3dsrS3R", 135 | "17uDfp5r4n441xkgLFmhNoSW1KWp6xVLD", 136 | "13A3JrvXmvg5w9XGvyyR4JEJqiLz8ZySY3", 137 | "16RGFo6hjq9ym6Pj7N5H7L1NR1rVPJyw2v", 138 | "1UDHPdovvR985NrWSkdWQDEQ1xuRiTALq", 139 | "15nf31J46iLuK1ZkTnqHo7WgN5cARFK3RA", 140 | "1Ab4vzG6wEQBDNQM1B2bvUz4fqXXdFk2WT", 141 | "1Fz63c775VV9fNyj25d9Xfw3YHE6sKCxbt", 142 | "1QKBaU6WAeycb3DbKbLBkX7vJiaS8r42Xo", 143 | "1CD91Vm97mLQvXhrnoMChhJx4TP9MaQkJo", 144 | "15MnK2jXPqTMURX4xC3h4mAZxyCcaWWEDD", 145 | "13N66gCzWWHEZBxhVxG18P8wyjEWF9Yoi1", 146 | "1NevxKDYuDcCh1ZMMi6ftmWwGrZKC6j7Ux", 147 | "19GpszRNUej5yYqxXoLnbZWKew3KdVLkXg", 148 | "1M7ipcdYHey2Y5RZM34MBbpugghmjaV89P", 149 | "18aNhurEAJsw6BAgtANpexk5ob1aGTwSeL", 150 | "1FwZXt6EpRT7Fkndzv6K4b4DFoT4trbMrV", 151 | "1CXvTzR6qv8wJ7eprzUKeWxyGcHwDYP1i2", 152 | "1MUJSJYtGPVGkBCTqGspnxyHahpt5Te8jy", 153 | "13Q84TNNvgcL3HJiqQPvyBb9m4hxjS3jkV", 154 | "1LuUHyrQr8PKSvbcY1v1PiuGuqFjWpDumN", 155 | "18192XpzzdDi2K11QVHR7td2HcPS6Qs5vg", 156 | "1NgVmsCCJaKLzGyKLFJfVequnFW9ZvnMLN", 157 | "1AoeP37TmHdFh8uN72fu9AqgtLrUwcv2wJ", 158 | "1FTpAbQa4h8trvhQXjXnmNhqdiGBd1oraE", 159 | "14JHoRAdmJg3XR4RjMDh6Wed6ft6hzbQe9", 160 | "19z6waranEf8CcP8FqNgdwUe1QRxvUNKBG", 161 | "14u4nA5sugaswb6SZgn5av2vuChdMnD9E5", 162 | "1NBC8uXJy1GiJ6drkiZa1WuKn51ps7EPTv", 163 | "18bHfcm8kGoAhBaQXzzVcG5534mdpWK981" 164 | ] 165 | 166 | } -------------------------------------------------------------------------------- /go.sum: -------------------------------------------------------------------------------- 1 | cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= 2 | github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= 3 | github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= 4 | github.com/cespare/xxhash/v2 v2.2.0 h1:DC2CZ1Ep5Y4k3ZQ899DldepgrayRUGE6BBZ/cd9Cj44= 5 | github.com/cespare/xxhash/v2 v2.2.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= 6 | github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= 7 | github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= 8 | github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= 9 | github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= 10 | github.com/decred/dcrd/dcrec/secp256k1/v4 v4.3.0 h1:rpfIENRNNilwHwZeG5+P150SMrnNEcHYvcCuK6dPZSg= 11 | github.com/decred/dcrd/dcrec/secp256k1/v4 v4.3.0/go.mod h1:v57UDF4pDQJcEfFUCRop3lJL149eHGSe9Jvczhzjo/0= 12 | github.com/dgraph-io/badger/v4 v4.2.0 h1:kJrlajbXXL9DFTNuhhu9yCx7JJa4qpYWxtE8BzuWsEs= 13 | github.com/dgraph-io/badger/v4 v4.2.0/go.mod h1:qfCqhPoWDFJRx1gp5QwwyGo8xk1lbHUxvK9nK0OGAak= 14 | github.com/dgraph-io/ristretto v0.1.1 h1:6CWw5tJNgpegArSHpNHJKldNeq03FQCwYvfMVWajOK8= 15 | github.com/dgraph-io/ristretto v0.1.1/go.mod h1:S1GPSBCYCIhmVNfcth17y2zZtQT6wzkzgwUve0VDWWA= 16 | github.com/dgryski/go-farm v0.0.0-20190423205320-6a90982ecee2 h1:tdlZCpZ/P9DhczCTSixgIKmwPv6+wP5DGjqLYw5SUiA= 17 | github.com/dgryski/go-farm v0.0.0-20190423205320-6a90982ecee2/go.mod h1:SqUrOPUnsFjfmXRMNPybcSiG0BgUW2AuFH8PAnS2iTw= 18 | github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= 19 | github.com/dustin/go-humanize v1.0.1 h1:GzkhY7T5VNhEkwH0PVJgjz+fX1rhBrR7pRT3mDkpeCY= 20 | github.com/dustin/go-humanize v1.0.1/go.mod h1:Mu1zIs6XwVuF/gI1OepvI0qD18qycQx+mFykh5fBlto= 21 | github.com/fatih/color v1.17.0 h1:GlRw1BRJxkpqUCBKzKOw098ed57fEsKeNjpTe3cSjK4= 22 | github.com/fatih/color v1.17.0/go.mod h1:YZ7TlrGPkiz6ku9fK3TLD/pl3CpsiFyu8N92HLgmosI= 23 | github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= 24 | github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= 25 | github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= 26 | github.com/golang/glog v1.0.0 h1:nfP3RFugxnNRyKgeWd4oI1nYvXpxrx8ck8ZrcizshdQ= 27 | github.com/golang/glog v1.0.0/go.mod h1:EWib/APOK0SL3dFbYqvxE3UYd8E6s1ouQ7iEp/0LWV4= 28 | github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6 h1:ZgQEtGgCBiWRM39fZuwSd1LwSqqSW0hOdXCYYDX0R3I= 29 | github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= 30 | github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= 31 | github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= 32 | github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= 33 | github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk= 34 | github.com/golang/protobuf v1.5.2 h1:ROPKBNFfQgOUMifHyP+KYbvpjbdoFNs+aK7DXlji0Tw= 35 | github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= 36 | github.com/golang/snappy v0.0.3 h1:fHPg5GQYlCeLIPB9BZqMVR5nR9A+IM5zcgeTdjMYmLA= 37 | github.com/golang/snappy v0.0.3/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= 38 | github.com/google/flatbuffers v1.12.1 h1:MVlul7pQNoDzWRLTw5imwYsl+usrS1TXG2H4jg6ImGw= 39 | github.com/google/flatbuffers v1.12.1/go.mod h1:1AeVuKshWv4vARoZatz6mlQ0JxURH0Kv5+zNeJKJCa8= 40 | github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= 41 | github.com/google/go-cmp v0.5.5 h1:Khx7svrCpmxxtHBq5j2mp/xVjsi8hQMfNLvJFAlrGgU= 42 | github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= 43 | github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= 44 | github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= 45 | github.com/klauspost/compress v1.12.3 h1:G5AfA94pHPysR56qqrkO2pxEexdDzrpFJ6yt/VqWxVU= 46 | github.com/klauspost/compress v1.12.3/go.mod h1:8dP1Hq4DHOhN9w426knH3Rhby4rFm6D8eO+e+Dq5Gzg= 47 | github.com/mattn/go-colorable v0.1.13 h1:fFA4WZxdEF4tXPZVKMLwD8oUnCTTo08duU7wxecdEvA= 48 | github.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovkB8vQcUbaXHg= 49 | github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM= 50 | github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY= 51 | github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= 52 | github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= 53 | github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= 54 | github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= 55 | github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= 56 | github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= 57 | github.com/stretchr/testify v1.4.0 h1:2E4SXV/wtOkTonXsotYi4li6zVWxYlZuYNCXe9XRJyk= 58 | github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= 59 | github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= 60 | github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= 61 | go.opencensus.io v0.22.5 h1:dntmOdLpSpHlVqbW5Eay97DelsZHe+55D+xC6i0dDS0= 62 | go.opencensus.io v0.22.5/go.mod h1:5pWMHQbX5EPX2/62yrJeAkowc+lfs/XD7Uxpq3pI6kk= 63 | golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= 64 | golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= 65 | golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9 h1:psW17arqaxU48Z5kZ0CQnkZWQJsqcURM6tKiBApRjXI= 66 | golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= 67 | golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= 68 | golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= 69 | golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU= 70 | golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= 71 | golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= 72 | golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= 73 | golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= 74 | golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= 75 | golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= 76 | golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= 77 | golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= 78 | golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= 79 | golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= 80 | golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= 81 | golang.org/x/net v0.7.0 h1:rJrUqqhjsgNp7KqAIc25s9pZnjU7TUcSY7HcVZjdn1g= 82 | golang.org/x/net v0.7.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= 83 | golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= 84 | golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= 85 | golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= 86 | golang.org/x/sync v0.0.0-20190227155943-e225da77a7e6/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= 87 | golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= 88 | golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= 89 | golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= 90 | golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= 91 | golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= 92 | golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= 93 | golang.org/x/sys v0.0.0-20190502145724-3ef323f4f1fd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= 94 | golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= 95 | golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= 96 | golang.org/x/sys v0.0.0-20221010170243-090e33056c14/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= 97 | golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= 98 | golang.org/x/sys v0.18.0 h1:DBdB3niSjOA/O0blCZBqDefyWNYveAYMNF1Wum0DYQ4= 99 | golang.org/x/sys v0.18.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= 100 | golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= 101 | golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= 102 | golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= 103 | golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= 104 | golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= 105 | golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= 106 | golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= 107 | golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= 108 | golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= 109 | golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= 110 | golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= 111 | golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= 112 | golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1 h1:go1bK/D/BFZV2I8cIQd1NKEZ+0owSTG1fDTci4IqFcE= 113 | golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= 114 | google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= 115 | google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= 116 | google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= 117 | google.golang.org/genproto v0.0.0-20190425155659-357c62f0e4bb/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= 118 | google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= 119 | google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38= 120 | google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= 121 | google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= 122 | google.golang.org/protobuf v1.28.1 h1:d0NfwRgPtno5B1Wa6L2DAG+KivqkdutMf1UhdNx175w= 123 | google.golang.org/protobuf v1.28.1/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= 124 | gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= 125 | gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= 126 | gopkg.in/yaml.v2 v2.2.8 h1:obN1ZagJSUGI0Ek/LBmuj4SNLPfIny3KsKFopxRdj10= 127 | gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= 128 | honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= 129 | -------------------------------------------------------------------------------- /data/ranges.json: -------------------------------------------------------------------------------- 1 | { 2 | "ranges": [ 3 | { "min": "0x1", "max": "0x1", "status": 1 }, 4 | { "min": "0x2", "max": "0x3", "status": 1 }, 5 | { "min": "0x4", "max": "0x7", "status": 1 }, 6 | { "min": "0x8", "max": "0xf", "status": 1 }, 7 | { "min": "0x10", "max": "0x1f", "status": 1 }, 8 | { "min": "0x20", "max": "0x3f", "status": 1 }, 9 | { "min": "0x40", "max": "0x7f", "status": 1 }, 10 | { "min": "0x80", "max": "0xff", "status": 1 }, 11 | { "min": "0x100", "max": "0x1ff", "status": 1 }, 12 | { "min": "0x200", "max": "0x3ff", "status": 1 }, 13 | { "min": "0x400", "max": "0x7ff", "status": 1 }, 14 | { "min": "0x800", "max": "0xfff", "status": 1 }, 15 | { "min": "0x1000", "max": "0x1fff", "status": 1 }, 16 | { "min": "0x2000", "max": "0x3fff", "status": 1 }, 17 | { "min": "0x4000", "max": "0x7fff", "status": 1 }, 18 | { "min": "0x8000", "max": "0xffff", "status": 1}, 19 | { "min": "0x10000", "max": "0x1ffff", "status": 1 }, 20 | { "min": "0x20000", "max": "0x3ffff", "status": 1 }, 21 | { "min": "0x40000", "max": "0x7ffff", "status": 1 }, 22 | { "min": "0x80000", "max": "0xfffff", "status": 1 }, 23 | { "min": "0x100000", "max": "0x1fffff", "status": 1 }, 24 | { "min": "0x200000", "max": "0x3fffff", "status": 1 }, 25 | { "min": "0x400000", "max": "0x7fffff", "status": 1 }, 26 | { "min": "0x800000", "max": "0xffffff", "status": 1 }, 27 | { "min": "0x1000000", "max": "0x1ffffff", "status": 1 }, 28 | { "min": "0x2000000", "max": "0x3ffffff", "status": 1 }, 29 | { "min": "0x4000000", "max": "0x7ffffff", "status": 1 }, 30 | { "min": "0x8000000", "max": "0xfffffff", "status": 1 }, 31 | { "min": "0x10000000", "max": "0x1fffffff", "status": 1 }, 32 | { "min": "0x20000000", "max": "0x3fffffff", "status": 1 }, 33 | { "min": "0x40000000", "max": "0x7fffffff", "status": 1 }, 34 | { "min": "0x80000000", "max": "0xffffffff", "status": 1 }, 35 | { "min": "0x100000000", "max": "0x1ffffffff", "status": 1 }, 36 | { "min": "0x200000000", "max": "0x3ffffffff", "status": 1 }, 37 | { "min": "0x400000000", "max": "0x7ffffffff", "status": 1 }, 38 | { "min": "0x800000000", "max": "0xfffffffff", "status": 1 }, 39 | { "min": "0x1000000000", "max": "0x1fffffffff", "status": 1 }, 40 | { "min": "0x2000000000", "max": "0x3fffffffff", "status": 1 }, 41 | { "min": "0x4000000000", "max": "0x7fffffffff", "status": 1 }, 42 | { "min": "0x8000000000", "max": "0xffffffffff", "status": 1 }, 43 | { "min": "0x10000000000", "max": "0x1ffffffffff", "status": 1 }, 44 | { "min": "0x20000000000", "max": "0x3ffffffffff", "status": 1 }, 45 | { "min": "0x40000000000", "max": "0x7ffffffffff", "status": 1 }, 46 | { "min": "0x80000000000", "max": "0xfffffffffff", "status": 1 }, 47 | { "min": "0x100000000000", "max": "0x1fffffffffff", "status": 1 }, 48 | { "min": "0x200000000000", "max": "0x3fffffffffff", "status": 1 }, 49 | { "min": "0x400000000000", "max": "0x7fffffffffff", "status": 1 }, 50 | { "min": "0x800000000000", "max": "0xffffffffffff", "status": 1 }, 51 | { "min": "0x1000000000000", "max": "0x1ffffffffffff", "status": 1 }, 52 | { "min": "0x2000000000000", "max": "0x3ffffffffffff", "status": 1 }, 53 | { "min": "0x4000000000000", "max": "0x7ffffffffffff", "status": 1 }, 54 | { "min": "0x8000000000000", "max": "0xfffffffffffff", "status": 1 }, 55 | { "min": "0x10000000000000", "max": "0x1fffffffffffff", "status": 1 }, 56 | { "min": "0x20000000000000", "max": "0x3fffffffffffff", "status": 1 }, 57 | { "min": "0x40000000000000", "max": "0x7fffffffffffff", "status": 1 }, 58 | { "min": "0x80000000000000", "max": "0xffffffffffffff", "status": 1 }, 59 | { "min": "0x100000000000000", "max": "0x1ffffffffffffff", "status": 1 }, 60 | { "min": "0x200000000000000", "max": "0x3ffffffffffffff", "status": 1 }, 61 | { "min": "0x400000000000000", "max": "0x7ffffffffffffff", "status": 1 }, 62 | { "min": "0x800000000000000", "max": "0xfffffffffffffff", "status": 1 }, 63 | { "min": "0x1000000000000000", "max": "0x1fffffffffffffff", "status": 1 }, 64 | { "min": "0x2000000000000000", "max": "0x3fffffffffffffff", "status": 1 }, 65 | { "min": "0x4000000000000000", "max": "0x7fffffffffffffff", "status": 1 }, 66 | { "min": "0x8000000000000000", "max": "0xffffffffffffffff", "status": 1 }, 67 | { "min": "0x10000000000000000", "max": "0x1ffffffffffffffff", "status": 1 }, 68 | { "min": "0x20000000000000000", "max": "0x3ffffffffffffffff", "status": 0 }, 69 | { "min": "0x40000000000000000", "max": "0x7ffffffffffffffff", "status": 0 }, 70 | { "min": "0x80000000000000000", "max": "0xfffffffffffffffff", "status": 0 }, 71 | { "min": "0x100000000000000000", "max": "0x1fffffffffffffffff", "status": 0 }, 72 | { "min": "0x200000000000000000", "max": "0x3fffffffffffffffff", "status": 1 }, 73 | { "min": "0x400000000000000000", "max": "0x7fffffffffffffffff", "status": 0 }, 74 | { "min": "0x800000000000000000", "max": "0xffffffffffffffffff", "status": 0 }, 75 | { "min": "0x1000000000000000000", "max": "0x1ffffffffffffffffff", "status": 0 }, 76 | { "min": "0x2000000000000000000", "max": "0x3ffffffffffffffffff", "status": 0 }, 77 | { "min": "0x4000000000000000000", "max": "0x7ffffffffffffffffff", "status": 1 }, 78 | { "min": "0x8000000000000000000", "max": "0xfffffffffffffffffff", "status": 0 }, 79 | { "min": "0x10000000000000000000", "max": "0x1fffffffffffffffffff", "status": 0 }, 80 | { "min": "0x20000000000000000000", "max": "0x3fffffffffffffffffff", "status": 0 }, 81 | { "min": "0x40000000000000000000", "max": "0x7fffffffffffffffffff", "status": 0 }, 82 | { "min": "0x80000000000000000000", "max": "0xffffffffffffffffffff", "status": 1 }, 83 | { "min": "0x100000000000000000000", "max": "0x1ffffffffffffffffffff", "status": 0 }, 84 | { "min": "0x200000000000000000000", "max": "0x3ffffffffffffffffffff", "status": 0 }, 85 | { "min": "0x400000000000000000000", "max": "0x7ffffffffffffffffffff", "status": 0 }, 86 | { "min": "0x800000000000000000000", "max": "0xfffffffffffffffffffff", "status": 0 }, 87 | { "min": "0x1000000000000000000000", "max": "0x1fffffffffffffffffffff", "status": 1 }, 88 | { "min": "0x2000000000000000000000", "max": "0x3fffffffffffffffffffff", "status": 0 }, 89 | { "min": "0x4000000000000000000000", "max": "0x7fffffffffffffffffffff", "status": 0 }, 90 | { "min": "0x8000000000000000000000", "max": "0xffffffffffffffffffffff", "status": 0 }, 91 | { "min": "0x10000000000000000000000", "max": "0x1ffffffffffffffffffffff", "status": 0 }, 92 | { "min": "0x20000000000000000000000", "max": "0x3ffffffffffffffffffffff", "status": 1 }, 93 | { "min": "0x40000000000000000000000", "max": "0x7ffffffffffffffffffffff", "status": 0 }, 94 | { "min": "0x80000000000000000000000", "max": "0xfffffffffffffffffffffff", "status": 0 }, 95 | { "min": "0x100000000000000000000000", "max": "0x1fffffffffffffffffffffff", "status": 0 }, 96 | { "min": "0x200000000000000000000000", "max": "0x3fffffffffffffffffffffff", "status": 0 }, 97 | { "min": "0x400000000000000000000000", "max": "0x7fffffffffffffffffffffff", "status": 1 }, 98 | { "min": "0x800000000000000000000000", "max": "0xffffffffffffffffffffffff", "status": 0 }, 99 | { "min": "0x1000000000000000000000000", "max": "0x1ffffffffffffffffffffffff", "status": 0 }, 100 | { "min": "0x2000000000000000000000000", "max": "0x3ffffffffffffffffffffffff", "status": 0 }, 101 | { "min": "0x4000000000000000000000000", "max": "0x7ffffffffffffffffffffffff", "status": 0 }, 102 | { "min": "0x8000000000000000000000000", "max": "0xfffffffffffffffffffffffff", "status": 1 }, 103 | { "min": "0x10000000000000000000000000", "max": "0x1fffffffffffffffffffffffff", "status": 0 }, 104 | { "min": "0x20000000000000000000000000", "max": "0x3fffffffffffffffffffffffff", "status": 0 }, 105 | { "min": "0x40000000000000000000000000", "max": "0x7fffffffffffffffffffffffff", "status": 0 }, 106 | { "min": "0x80000000000000000000000000", "max": "0xffffffffffffffffffffffffff", "status": 0 }, 107 | { "min": "0x100000000000000000000000000", "max": "0x1fffffffffffffffffffffffffff", "status": 0 }, 108 | { "min": "0x200000000000000000000000000", "max": "0x3fffffffffffffffffffffffffff", "status": 0 }, 109 | { "min": "0x400000000000000000000000000", "max": "0x7fffffffffffffffffffffffffff", "status": 0 }, 110 | { "min": "0x800000000000000000000000000", "max": "0xfffffffffffffffffffffffffff", "status": 0 }, 111 | { "min": "0x1000000000000000000000000000", "max": "0x1ffffffffffffffffffffffffffff", "status": 0 }, 112 | { "min": "0x2000000000000000000000000000", "max": "0x3ffffffffffffffffffffffffffff", "status": 0 }, 113 | { "min": "0x4000000000000000000000000000", "max": "0x7ffffffffffffffffffffffffffff", "status": 0 }, 114 | { "min": "0x8000000000000000000000000000", "max": "0xffffffffffffffffffffffffffff", "status": 0 }, 115 | { "min": "0x10000000000000000000000000000", "max": "0x1fffffffffffffffffffffffffffff", "status": 0 }, 116 | { "min": "0x20000000000000000000000000000", "max": "0x3fffffffffffffffffffffffffffff", "status": 0 }, 117 | { "min": "0x40000000000000000000000000000", "max": "0x7fffffffffffffffffffffffffffff", "status": 1 }, 118 | { "min": "0x80000000000000000000000000000", "max": "0xfffffffffffffffffffffffffffff", "status": 0 }, 119 | { "min": "0x100000000000000000000000000000", "max": "0x1ffffffffffffffffffffffffffffff", "status": 0 }, 120 | { "min": "0x200000000000000000000000000000", "max": "0x3ffffffffffffffffffffffffffffff", "status": 0 }, 121 | { "min": "0x400000000000000000000000000000", "max": "0x7ffffffffffffffffffffffffffffff", "status": 0 }, 122 | { "min": "0x800000000000000000000000000000", "max": "0xfffffffffffffffffffffffffffffff", "status": 0 }, 123 | { "min": "0x1000000000000000000000000000000", "max": "0x1fffffffffffffffffffffffffffffff", "status": 0 }, 124 | { "min": "0x2000000000000000000000000000000", "max": "0x3fffffffffffffffffffffffffffffff", "status": 1 }, 125 | { "min": "0x4000000000000000000000000000000", "max": "0x7fffffffffffffffffffffffffffffff", "status": 0 }, 126 | { "min": "0x8000000000000000000000000000000", "max": "0xfffffffffffffffffffffffffffffff", "status": 0 }, 127 | { "min": "0x10000000000000000000000000000000", "max": "0x1fffffffffffffffffffffffffffffff", "status": 1 }, 128 | { "min": "0x20000000000000000000000000000000", "max": "0x3fffffffffffffffffffffffffffffff", "status": 0 }, 129 | { "min": "0x40000000000000000000000000000000", "max": "0x7fffffffffffffffffffffffffffffff", "status": 0 }, 130 | { "min": "0x80000000000000000000000000000000", "max": "0xffffffffffffffffffffffffffffffff", "status": 0 }, 131 | { "min": "0x100000000000000000000000000000000", "max": "0x1ffffffffffffffffffffffffffffffff", "status": 0 }, 132 | { "min": "0x200000000000000000000000000000000", "max": "0x3ffffffffffffffffffffffffffffffff", "status": 0 }, 133 | { "min": "0x400000000000000000000000000000000", "max": "0x7ffffffffffffffffffffffffffffffff", "status": 0 }, 134 | { "min": "0x800000000000000000000000000000000", "max": "0xfffffffffffffffffffffffffffffffff", "status": 0 }, 135 | { "min": "0x1000000000000000000000000000000000", "max": "0x1fffffffffffffffffffffffffffffffff", "status": 0 }, 136 | { "min": "0x2000000000000000000000000000000000", "max": "0x3fffffffffffffffffffffffffffffffff", "status": 0 }, 137 | { "min": "0x4000000000000000000000000000000000", "max": "0x7fffffffffffffffffffffffffffffffff", "status": 0 }, 138 | { "min": "0x8000000000000000000000000000000000", "max": "0xffffffffffffffffffffffffffffffffff", "status": 0 }, 139 | { "min": "0x10000000000000000000000000000000000", "max": "0x1ffffffffffffffffffffffffffffffffff", "status": 0 }, 140 | { "min": "0x20000000000000000000000000000000000", "max": "0x3ffffffffffffffffffffffffffffffffff", "status": 0 }, 141 | { "min": "0x40000000000000000000000000000000000", "max": "0x7ffffffffffffffffffffffffffffffffff", "status": 0 }, 142 | { "min": "0x80000000000000000000000000000000000", "max": "0xfffffffffffffffffffffffffffffffffff", "status": 0 }, 143 | { "min": "0x100000000000000000000000000000000000", "max": "0x1fffffffffffffffffffffffffffffffffff", "status": 0 }, 144 | { "min": "0x200000000000000000000000000000000000", "max": "0x3fffffffffffffffffffffffffffffffffff", "status": 0 }, 145 | { "min": "0x400000000000000000000000000000000000", "max": "0x7fffffffffffffffffffffffffffffffffff", "status": 0 }, 146 | { "min": "0x800000000000000000000000000000000000", "max": "0xffffffffffffffffffffffffffffffffffff", "status": 0 }, 147 | { "min": "0x1000000000000000000000000000000000000", "max": "0x1ffffffffffffffffffffffffffffffffffff", "status": 0 }, 148 | { "min": "0x2000000000000000000000000000000000000", "max": "0x3ffffffffffffffffffffffffffffffffffff", "status": 0 }, 149 | { "min": "0x4000000000000000000000000000000000000", "max": "0x7ffffffffffffffffffffffffffffffffffff", "status": 0 }, 150 | { "min": "0x8000000000000000000000000000000000000", "max": "0xfffffffffffffffffffffffffffffffffffff", "status": 1 }, 151 | { "min": "0x10000000000000000000000000000000000000", "max": "0x1fffffffffffffffffffffffffffffffffffff", "status": 0 }, 152 | { "min": "0x20000000000000000000000000000000000000", "max": "0x3fffffffffffffffffffffffffffffffffffff", "status": 0 }, 153 | { "min": "0x40000000000000000000000000000000000000", "max": "0x7fffffffffffffffffffffffffffffffffffff", "status": 0 }, 154 | { "min": "0x80000000000000000000000000000000000000", "max": "0xffffffffffffffffffffffffffffffffffffff", "status": 0 }, 155 | { "min": "0x100000000000000000000000000000000000000", "max": "0x1ffffffffffffffffffffffffffffffffffffff", "status": 0 }, 156 | { "min": "0x200000000000000000000000000000000000000", "max": "0x3ffffffffffffffffffffffffffffffffffffff", "status": 0 }, 157 | { "min": "0x400000000000000000000000000000000000000", "max": "0x7ffffffffffffffffffffffffffffffffffffff", "status": 0 }, 158 | { "min": "0x800000000000000000000000000000000000000", "max": "0xfffffffffffffffffffffffffffffffffffffff", "status": 0 }, 159 | { "min": "0x1000000000000000000000000000000000000000", "max": "0x1fffffffffffffffffffffffffffffffffffffff", "status": 0 }, 160 | { "min": "0x2000000000000000000000000000000000000000", "max": "0x3fffffffffffffffffffffffffffffffffffffff", "status": 0 }, 161 | { "min": "0x4000000000000000000000000000000000000000", "max": "0x7fffffffffffffffffffffffffffffffffffffff", "status": 0 }, 162 | { "min": "0x8000000000000000000000000000000000000000", "max": "0xffffffffffffffffffffffffffffffffffffffff", "status": 0 }, 163 | { "min": "0xC0DE000000000000000000000000000000000000000000003270000000000000", "max": "0xC0DE00000000000000000000000000000000000000000000327fffffffffffff", "status": 1 } 164 | ] 165 | } 166 | --------------------------------------------------------------------------------