123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520 |
- package bitcoin
- import (
- "bitcoin/bitcoinRpc"
- "encoding/json"
- "errors"
- "fmt"
- "strconv"
- )
- type BitCoinApi struct {
- }
- //get a new taddr
- func (m *BitCoinApi) WalletNewAddr() (string, error) {
- var newaddr RpcResult
- result, err := bitcoinRpc.RunCall("getnewaddress")
- if err != nil {
- fmt.Println("Call getnewaddress fail:", err.Error())
- return "", err
- }
- if err := json.Unmarshal([]byte(result), &newaddr); err != nil {
- fmt.Println("Unmarshal err :", err.Error())
- return "", err
- }
- // success
- if len(newaddr.Error.Message) == 0 {
- return newaddr.Result, nil
- }
- err = errors.New(newaddr.Error.Message)
- return "", err
- }
- //get PrivKey by taddr
- func (m *BitCoinApi) WalletDumpPrivKey(address string) (string, error) {
- var key RpcResult
- if len(address) == 0 {
- fmt.Println("input address err:")
- err := errors.New("input address error:")
- return "", err
- }
- //
- result, err := bitcoinRpc.RunCall("dumpprivkey", address)
- if err != nil {
- fmt.Println("Call dumpprivkey fail:", err.Error())
- return "", err
- }
- if err := json.Unmarshal([]byte(result), &key); err != nil {
- fmt.Println("Unmarshal err :", err.Error())
- return "", err
- }
- // success
- if len(key.Error.Message) == 0 {
- return key.Result, nil
- }
- err = errors.New(key.Error.Message)
- return "", err
- }
- //get block hash by index
- func (m BitCoinApi) WalletGetBlockHash(index uint64) (string, error) {
- var Blockhash RpcResult
- //get block hash by index
- result, err := bitcoinRpc.RunCall("getblockhash", index)
- if err != nil {
- fmt.Println("Call getblockhash fail:", err.Error())
- return "", err
- }
- if err := json.Unmarshal([]byte(result), &Blockhash); err != nil {
- fmt.Println("Unmarshal err :", err.Error())
- return "", err
- }
- // success
- if len(Blockhash.Error.Message) == 0 {
- return Blockhash.Result, nil
- }
- err = errors.New(Blockhash.Error.Message)
- return "", err
- }
- //get block time by hash;return:blocktime
- func (m BitCoinApi) WalletGetBlockTime(blockhash string) (uint64, error) {
- var blockresult BlockResult
- if len(blockhash) == 0 {
- fmt.Println("input para err:")
- err := errors.New("input para err")
- return 0, err
- }
- //get block info by blockhash
- result, err := bitcoinRpc.RunCall("getblock", blockhash)
- if err != nil {
- fmt.Println("Call getblock fail:", err.Error())
- return 0, err
- }
- if err := json.Unmarshal([]byte(result), &blockresult); err != nil {
- fmt.Println("Unmarshal err :", err.Error())
- return 0, err
- }
- // success
- if len(blockresult.Error.Message) == 0 {
- return uint64(blockresult.Result.Time), nil
- }
- err = errors.New(blockresult.Error.Message)
- return 0, err
- }
- //get block Height by hash;return:blocktime
- func (m BitCoinApi) WalletGetBlockHeight(blockhash string) (uint64, error) {
- var blockresult BlockResult
- if len(blockhash) == 0 {
- fmt.Println("input para err:")
- err := errors.New("input para err")
- return 0, err
- }
- //get block info by blockhash
- result, err := bitcoinRpc.RunCall("getblock", blockhash)
- if err != nil {
- fmt.Println("Call getblock fail:", err.Error())
- return 0, err
- }
- if err := json.Unmarshal([]byte(result), &blockresult); err != nil {
- fmt.Println("Unmarshal err :", err.Error())
- return 0, err
- }
- // success
- if len(blockresult.Error.Message) == 0 {
- return uint64(blockresult.Result.Height), nil
- }
- err = errors.New(blockresult.Error.Message)
- return 0, err
- }
- func (m *BitCoinApi) WalleListSinceBlock(blockhash string) ([]byte, error) {
- var listtransactionsresult Listtransactionsresult
- if len(blockhash) == 0 {
- fmt.Println("input blockhash err:")
- err := errors.New("input blockhash err")
- return nil, err
- }
- //
- result, err := bitcoinRpc.RunCall("listsinceblock", blockhash, 1, true)
- if err != nil {
- fmt.Println("Call listsinceblock fail:", err.Error())
- return nil, err
- }
- if err := json.Unmarshal([]byte(result), &listtransactionsresult); err != nil {
- fmt.Println("Unmarshal err :", err.Error())
- return nil, err
- }
- // success
- if len(listtransactionsresult.Error.Message) == 0 {
- var jbuf []byte
- if jbuf, err = json.Marshal(listtransactionsresult.Result.Transactions); err != nil {
- return nil, err
- }
- return jbuf, nil
- }
- err = errors.New(listtransactionsresult.Error.Message)
- return nil, err
- }
- //get the server's total available balance
- func (m BitCoinApi) WalleGetBalance(account string) (float64, error) {
- var liteBalance BalanceResult
- // getbalance all
- result, err := bitcoinRpc.RunCall("getbalance", "*")
- if err != nil {
- fmt.Println("Call getbalance fail:", err.Error())
- return 0, err
- }
- if err := json.Unmarshal([]byte(result), &liteBalance); err != nil {
- fmt.Println("Unmarshal err :", err.Error())
- return 0, err
- }
- // success
- if len(liteBalance.Error.Message) == 0 {
- return float64(liteBalance.Result), nil
- }
- err = errors.New(liteBalance.Error.Message)
- return 0, err
- }
- //get the server's total unconfirmed balance
- func (m BitCoinApi) WalleGetUnconfirmedBalance(account string) (float64, error) {
- var UnconfirmedBalance BalanceResult
- //
- result, err := bitcoinRpc.RunCall("getunconfirmedbalance")
- if err != nil {
- fmt.Println("Call getunconfirmedbalance fail:", err.Error())
- return 0, err
- }
- if err := json.Unmarshal([]byte(result), &UnconfirmedBalance); err != nil {
- fmt.Println("Unmarshal err :", err.Error())
- return 0, err
- }
- // success
- if len(UnconfirmedBalance.Error.Message) == 0 {
- return float64(UnconfirmedBalance.Result), nil
- }
- err = errors.New(UnconfirmedBalance.Error.Message)
- return 0, err
- }
- //Sent an amount from an account to a zcash address.
- //The amount is a real and is rounded to the nearest 0.00000001.
- //Result:"transactionid" (string) The transaction id.
- func (m *BitCoinApi) WalleSendFrom(fromaccount string, tozcashaddress string, amount float64, minconf int, comment string, commentto string) (string, error) {
- var SendResult RpcResult
- if len(tozcashaddress) == 0 {
- fmt.Println("input tozcashaddress err:")
- err := errors.New("input tozcashaddress err")
- return "", err
- }
- //
- result, err := bitcoinRpc.RunCall("sendfrom", fromaccount, tozcashaddress, amount, minconf, "", "")
- if err != nil {
- fmt.Println("Call sendfrom fail:", err.Error())
- return "", err
- }
- if err := json.Unmarshal([]byte(result), &SendResult); err != nil {
- fmt.Println("Unmarshal err :", err.Error())
- return "", err
- }
- // success
- if len(SendResult.Error.Message) == 0 {
- return SendResult.Result, nil
- }
- err = errors.New(SendResult.Error.Message)
- return "", err
- }
- //get the number of blocks in the longest block chain
- func (m BitCoinApi) WalleGetBlockCount() (uint64, error) {
- var blockcount Blockcountresult
- //
- result, err := bitcoinRpc.RunCall("getblockcount")
- if err != nil {
- fmt.Println("Call getblockcount fail:", err.Error())
- return 0, err
- }
- if err := json.Unmarshal([]byte(result), &blockcount); err != nil {
- fmt.Println("Unmarshal err :", err.Error())
- return 0, err
- }
- // success
- if len(blockcount.Error.Message) == 0 {
- return uint64(blockcount.Result), nil
- }
- err = errors.New(blockcount.Error.Message)
- return 0, err
- }
- //Set the transaction fee per kB. Overwrites the paytxfee parameter.
- func (m BitCoinApi) WalletSetTxFee(amount float64) (bool, error) {
- var settxfee Setfeeresult
- //
- result, err := bitcoinRpc.RunCall("settxfee", amount)
- if err != nil {
- fmt.Println("Call settxfee fail:", err.Error())
- return false, err
- }
- if err := json.Unmarshal([]byte(result), &settxfee); err != nil {
- fmt.Println("Unmarshal err :", err.Error())
- return false, err
- }
- // success
- if len(settxfee.Error.Message) == 0 {
- return settxfee.Result, nil
- }
- err = errors.New(settxfee.Error.Message)
- return false, err
- }
- //Result:
- // "walletversion": xxxxx, 钱包的额版本
- // "balance": xxxxxxx, 钱包中已经确认的LTC余额
- // "unconfirmed_balance": xxx, 钱包中未经确认的LTC余额
- // "immature_balance": xxxxxx, 钱包中不成熟的余额
- // "txcount": xxxxxxx, 钱包中交易的总数
- // "keypoololdest": xxxxxx, 密钥池中最早的预生成密钥的时间戳
- // "keypoolsize": xxxx, 预先生成了多少个新密匙
- // "unlocked_until": ttt, (numeric) the timestamp in seconds since epoch (midnight Jan 1 1970 GMT)
- // that the wallet is unlocked for transfers, or 0 if the wallet is locked
- // "paytxfee": x.xxxx, 交易费用的配置 set in LTC/KB
- // "hdmasterkeyid": "<hash160>", (string) the Hash160 of the HD master pubkey
- func (m BitCoinApi) WalletInfo() ([]byte, error) {
- var walletinfoResult WalletinfoResult
- //
- result, err := bitcoinRpc.RunCall("getwalletinfo")
- if err != nil {
- fmt.Println("Call getwalletinfo fail:", err.Error())
- return nil, err
- }
- if err := json.Unmarshal([]byte(result), &walletinfoResult); err != nil {
- fmt.Println("Unmarshal err :", err.Error())
- return nil, err
- }
- // success
- if len(walletinfoResult.Error.Message) == 0 {
- var jbuf []byte
- if jbuf, err = json.Marshal(walletinfoResult.Result); err != nil {
- return nil, err
- }
- return jbuf, nil
- }
- err = errors.New(walletinfoResult.Error.Message)
- return nil, err
- }
- func (m BitCoinApi) InitRpcConf(rpcuser string, rpcpassword string, rpchost string, rpcport int) bool {
- bitcoinRpc.InitRpcConfig(rpcuser, rpcpassword, rpchost, rpcport)
- return true
- }
- //Adds a script (in hex) or address that can be watched as if it were in your wallet but cannot be used to spend.
- func (m BitCoinApi) WalletImportAddress(address string, rescan bool) (bool, error) {
- var rpcResult RpcResult
- var err error
- var result []byte
- if len(address) == 0 {
- fmt.Println("Call WalletImportAddress address is null:")
- err = errors.New("address is null")
- return false, err
- }
- // import address in Wallet
- result, err = bitcoinRpc.RunCall("importaddress", address, "", rescan)
- if err != nil {
- fmt.Println("WalletImportAddress call bitcoinRpc.RunCall fail:", err.Error(), address)
- return false, err
- }
- if err = json.Unmarshal([]byte(result), &rpcResult); err != nil {
- fmt.Println("Unmarshal err :", err.Error())
- return false, err
- }
- // success
- if len(rpcResult.Error.Message) == 0 {
- return true, nil
- }
- err = errors.New(rpcResult.Error.Message)
- return false, err
- }
- /*
- //list unspent transaction outputs
- func (m BitCoinApi) Listunspent(address []string) ([]UnspentInfo, error) {
- var unspentResult RpcUnspentResult
- result, err := bitcoinRpc.RunCall("listunspent",1,9999999,address)
- if err != nil {
- fmt.Println("Call listunspent fail:", err.Error())
- return nil, err
- }
- if err := json.Unmarshal([]byte(result), &unspentResult); err != nil {
- fmt.Println("Unmarshal err :", err.Error())
- return nil, err
- }
- // success
- if len(unspentResult.Error.Message) == 0 {
- return unspentResult.Result, nil
- }
- err = errors.New(unspentResult.Error.Message)
- return nil, err
- }
- */
- //list unspent transaction outputs
- func (m BitCoinApi) Listunspent(address []string) ([]map[string]interface{}, error) {
- var unspentResult RpcUnspentResult
- result, err := bitcoinRpc.RunCall("listunspent", 1, 9999999, address)
- if err != nil {
- fmt.Println("Call listunspent fail:", err.Error())
- return nil, err
- }
- if err := json.Unmarshal([]byte(result), &unspentResult); err != nil {
- fmt.Println("Unmarshal err :", err.Error())
- return nil, err
- }
- // success
- if len(unspentResult.Error.Message) != 0 {
- err = errors.New(unspentResult.Error.Message)
- return nil, err
- }
- //地址里面有相同的过滤
- //var ilistunspent listunspent
- unspentValue := map[string]*listunspent{}
- for _, unspentInfo := range unspentResult.Result {
- addr := unspentInfo.Address
- if addr == "" {
- break
- }
- if unspentValue[addr] == nil {
- unspentValue[addr] = &listunspent{unspentInfo.Amount, unspentInfo.Spendable}
- } else {
- unspentValue[addr].amout += unspentInfo.Amount
- }
- }
- outputsArr := make([]map[string]interface{}, 0)
- for k, v := range unspentValue {
- requestData := make(map[string]interface{})
- requestData["address"] = k
- valuestr := fmt.Sprintf("%.8f", v.amout)
- value, _ := strconv.ParseFloat(valuestr, 64)
- requestData["Amount"] = value
- requestData["spendable"] = v.spendable
- outputsArr = append(outputsArr, requestData)
- }
- return outputsArr, nil
- }
- //Send Raw Transaction
- func (m BitCoinApi) SendRawTransaction(hexstring string) (string, error) {
- var rawtransactioninfo RpcResult
- if len(hexstring) == 0 {
- fmt.Println("input para err:")
- err := errors.New("input para err")
- return "", err
- }
- result, err := bitcoinRpc.RunCall("sendrawtransaction", hexstring)
- if err != nil {
- fmt.Println("Call sendrawtransaction fail:", err.Error())
- return "", err
- }
- if err := json.Unmarshal([]byte(result), &rawtransactioninfo); err != nil {
- fmt.Println("Unmarshal err :", err.Error())
- return "", err
- }
- if len(rawtransactioninfo.Error.Message) == 0 {
- return rawtransactioninfo.Result, nil
- }
- err = errors.New(rawtransactioninfo.Error.Message)
- return "", err
- }
|