github.com/keybase/client/go@v0.0.0-20240309051027-028f7c731f8b/tools/getxlm/getxlm.go (about) 1 package main 2 3 import ( 4 "crypto/rand" 5 "flag" 6 "fmt" 7 "io" 8 "log" 9 "net/http" 10 "os/exec" 11 12 "github.com/buger/jsonparser" 13 ) 14 15 var howMany int 16 var destination string 17 var bin string 18 var home string 19 20 func main() { 21 flag.IntVar(&howMany, "n", 5, "number of accounts to create to fund base account") 22 flag.StringVar(&destination, "d", "", "destination account") 23 flag.StringVar(&bin, "bin", "/usr/local/bin/keybase", "keybase binary path") 24 flag.StringVar(&home, "home", "/tmp", "home directory") 25 flag.Parse() 26 if howMany <= 0 { 27 flag.PrintDefaults() 28 log.Fatal("n must be > 0") 29 } 30 if destination == "" { 31 flag.PrintDefaults() 32 log.Fatal("destination account required") 33 } 34 35 for i := 0; i < howMany; i++ { 36 _, err := createWalletUser() 37 if err != nil { 38 log.Printf("error creating wallet user: %s", err) 39 continue 40 } 41 } 42 } 43 44 func createStandardUser() (string, error) { 45 logout() 46 buf := make([]byte, 6) 47 if _, err := rand.Read(buf); err != nil { 48 return "", err 49 } 50 username := fmt.Sprintf("ad_%x", buf) 51 cmd := exec.Command(bin, "-home", home, "signup", "-batch", "-username", username, "-passphrase", "00000000", "-no-email", "-invite-code", "202020202020202020202020") 52 if out, err := cmd.CombinedOutput(); err != nil { 53 fmt.Printf("signup error: %s\n", err) 54 fmt.Printf("output: %s\n", string(out)) 55 return "", err 56 } 57 return username, nil 58 } 59 60 func createWalletUser() (string, error) { 61 username, err := createStandardUser() 62 if err != nil { 63 return "", err 64 } 65 66 // accept the disclaimer 67 cmd := exec.Command(bin, "-home", home, "wallet", "api", "-m", `{"method": "setup-wallet"}`) 68 if out, err := cmd.CombinedOutput(); err != nil { 69 fmt.Printf("setup-wallet error: %s\n", err) 70 fmt.Printf("output: %s\n", string(out)) 71 return "", err 72 } 73 74 // get the account id 75 in := fmt.Sprintf("{\"method\": \"lookup\", \"params\": {\"options\": {\"name\": %q}}}", username) 76 cmd = exec.Command(bin, "-home", home, "wallet", "api", "-m", in) 77 out, err := cmd.CombinedOutput() 78 if err != nil { 79 fmt.Printf("lookup error: %s\n", err) 80 return "", err 81 } 82 fmt.Printf("output: %s\n", string(out)) 83 acctID, err := jsonparser.GetString(out, "result", "accountID") 84 if err != nil { 85 return "", err 86 } 87 fmt.Printf("accountID: %s\n", acctID) 88 fu := fmt.Sprintf("https://friendbot.stellar.org/?addr=%s", acctID) 89 resp, err := http.Get(fu) 90 if err != nil { 91 return "", err 92 } 93 defer resp.Body.Close() 94 body, err := io.ReadAll(resp.Body) 95 fmt.Printf("friendbot body: %s\n", string(body)) 96 if err != nil { 97 return "", err 98 } 99 100 // send most of it to destination 101 in = fmt.Sprintf("{\"method\": \"send\", \"params\": {\"options\": {\"recipient\": %q, \"amount\": \"9900\"}}}", destination) 102 cmd = exec.Command(bin, "-home", home, "wallet", "api", "-m", in) 103 out, err = cmd.CombinedOutput() 104 if err != nil { 105 fmt.Printf("wallet send error: %s\n", err) 106 return "", err 107 } 108 fmt.Printf("output: %s\n", string(out)) 109 110 return username, nil 111 } 112 113 func logout() { 114 cmd := exec.Command(bin, "-home", home, "logout") 115 if out, err := cmd.CombinedOutput(); err != nil { 116 fmt.Printf("logout error: %s\n", err) 117 fmt.Printf("output: %s\n", string(out)) 118 } 119 }