decred.org/dcrdex@v1.0.3/client/asset/btc/electrum/example/wallet/main.go (about) 1 // This code is available on the terms of the project LICENSE.md file, 2 // also available online at https://blueoakcouncil.org/license/1.0.0. 3 4 package main 5 6 import ( 7 "bytes" 8 "context" 9 "errors" 10 "fmt" 11 "os" 12 "time" 13 14 "decred.org/dcrdex/client/asset/btc/electrum" 15 dexltc "decred.org/dcrdex/dex/networks/ltc" 16 "github.com/btcsuite/btcd/btcutil" 17 "github.com/btcsuite/btcd/wire" 18 "github.com/davecgh/go-spew/spew" 19 ) 20 21 func main() { 22 err := run() 23 if err != nil { 24 fmt.Fprintln(os.Stderr, err) 25 os.Exit(1) 26 } 27 os.Exit(0) 28 } 29 30 func run() error { 31 ctx, cancel := context.WithTimeout(context.Background(), 20*time.Second) 32 defer cancel() 33 // .electrum-ltc/testnet/config: rpcuser, rpcpass, rpcport 34 const walletPass = "walletpass" // set me 35 const walletName = "~/.electrum-ltc/testnet/wallets/default_wallet" // passed directly to Electrum, not resolved 36 ec := electrum.NewWalletClient("user", "pass", "http://127.0.0.1:5678", walletName) 37 38 commands, err := ec.Commands(ctx) 39 if err != nil { 40 return err 41 } 42 fmt.Println(commands) 43 44 res, err := ec.GetInfo(ctx) 45 if err != nil { 46 return err 47 } 48 spew.Dump(res) 49 50 feeRate, err := ec.FeeRate(ctx, 1) 51 if err != nil { 52 return err 53 } 54 fmt.Println(feeRate) 55 56 addrHist, err := ec.GetAddressHistory(ctx, "Qe6bKuE2ZKxg6sCvLWb47kfgBdpjbbymtT") 57 if err != nil { 58 return err 59 } 60 spew.Dump(addrHist) 61 62 addrUnspent, err := ec.GetAddressUnspent(ctx, "Qe6bKuE2ZKxg6sCvLWb47kfgBdpjbbymtT") 63 if err != nil { 64 return err 65 } 66 spew.Dump(addrUnspent) 67 68 tx, err := ec.GetRawTransaction(ctx, "b8f5a301aee2d7bede7cfaeac8d6e13d095b3939e011ea2d259f7ccda3083ae7") 69 if err != nil { 70 return err 71 } 72 fmt.Printf("%x\n", tx) 73 msgTx := &wire.MsgTx{} 74 err = msgTx.Deserialize(bytes.NewReader(tx)) 75 if err != nil { 76 return err 77 } 78 spew.Dump(msgTx) 79 80 unspent, err := ec.ListUnspent(ctx) 81 if err != nil { 82 return err 83 } 84 spew.Dump(unspent) 85 86 // These addresses should be from your wallet. 87 myAddr := "tltc1q74fcwvn5ydl0ssf7pvdscx2gu6aaxzavf2u7lr" 88 valid, mine, err := ec.CheckAddress(ctx, myAddr) 89 if err != nil { 90 return err 91 } 92 fmt.Printf("valid: %v, mine: %v\n", valid, mine) 93 94 notMine := "tltc1qtmjdzc3xmju803e529jv9l2860w0h47c95h37f" 95 valid, mine, err = ec.CheckAddress(ctx, notMine) 96 if err != nil { 97 return err 98 } 99 fmt.Printf("valid: %v, mine: %v\n", valid, mine) 100 101 invalid := "tltc1qtmjdzc3xmju803e529jv9l2860w0h47c95xxxx" 102 valid, mine, err = ec.CheckAddress(ctx, invalid) 103 if err != nil { 104 return err 105 } 106 fmt.Printf("valid: %v, mine: %v\n", valid, mine) 107 108 wifStr, err := ec.GetPrivateKeys(ctx, walletPass, myAddr) 109 if err != nil { 110 return err 111 } 112 wif, err := btcutil.DecodeWIF(wifStr) 113 if err != nil { 114 return err 115 } 116 pkh := btcutil.Hash160(wif.SerializePubKey()) 117 p2wpkh, err := btcutil.NewAddressWitnessPubKeyHash(pkh, dexltc.TestNet4Params) 118 if err != nil { 119 return err 120 } 121 if addr := p2wpkh.String(); addr != myAddr { 122 return fmt.Errorf("%v != %v", addr, myAddr) 123 } 124 // fmt.Println(wif.PrivKey.Serialize()) 125 126 txRaw, err := ec.PayTo(ctx, walletPass, "tltc1qmk8uqqn37a2r5lu9jc86jnat6j0y28ydmfuadd", 1.21, 17.3454) 127 if err != nil { 128 return err 129 } 130 fmt.Printf("%x\n", txRaw) // this is signed 131 132 txid, err := ec.Broadcast(ctx, txRaw) 133 if err != nil { 134 return err 135 } 136 fmt.Println(txid) 137 138 confs, err := ec.GetWalletTxConfs(ctx, "6e1b5b3e9555507aab1ce18a6d2b327d0d6a624359543dd430eccbfefa3585dc") 139 if err != nil { 140 return err // if not a wallet txn: 'code 1: "Transaction not in wallet."' 141 } 142 fmt.Println("Confs:", confs) 143 144 _, err = ec.GetWalletTxConfs(ctx, "958e86e68a6d8c84e0fc9d1f0d7ca39cc411cf31388ef37420d048ffb99bb518") 145 if err == nil { 146 return errors.New("worked for non-wallet txn???") 147 } 148 149 bal, err := ec.GetBalance(ctx) 150 if err != nil { 151 return err 152 } 153 fmt.Println(bal.Confirmed, bal.Unconfirmed, bal.Immature) 154 155 addr, err := ec.GetUnusedAddress(ctx) 156 if err != nil { 157 return err 158 } 159 fmt.Println(addr) 160 return nil 161 }