decred.org/dcrdex@v1.0.5/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  }