Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
47 changes: 47 additions & 0 deletions cgo/addresses.go
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ import (
dcrwallet "decred.org/dcrwallet/v4/wallet"
"decred.org/dcrwallet/v4/wallet/udb"
"github.com/decred/dcrd/txscript/v4/stdaddr"
"github.com/decred/libwallet/dcr"
)

//export currentReceiveAddress
Expand Down Expand Up @@ -187,3 +188,49 @@ func defaultPubkey(cName *C.char) *C.char {

return successCResponse("%s", pubkey)
}

//export addrFromExtendedKey
func addrFromExtendedKey(cAddrFromExtKeyJSON *C.char) *C.char {
fromExtJSON := goString(cAddrFromExtKeyJSON)
var fromExt AddrFromExtKey
if err := json.Unmarshal([]byte(fromExtJSON), &fromExt); err != nil {
return errCResponse("malformed create addr json: %v", err)
}
addr, err := dcr.AddrFromExtendedKey(fromExt.Key, fromExt.Path, fromExt.AddrType, fromExt.UseChildBIP32Std)
if err != nil {
return errCResponse("unable to create address: %v", err)
}
return successCResponse("%s", addr)
}

//export createExtendedKey
func createExtendedKey(cCreateExtendedKeyJSON *C.char) *C.char {
createExtJSON := goString(cCreateExtendedKeyJSON)
var createExt CreateExtendedKey
if err := json.Unmarshal([]byte(createExtJSON), &createExt); err != nil {
return errCResponse("malformed ceate extended key json: %v", err)
}
extKey, err := dcr.CreateExtendedKey(createExt.Key, createExt.ParentKey, createExt.ChainCode,
createExt.Network, createExt.Depth, createExt.ChildN, createExt.IsPrivate)
if err != nil {
return errCResponse("unable to create key: %v", err)
}
return successCResponse("%s", extKey)
}

//export validateAddr
func validateAddr(cName, cAddr *C.char) *C.char {
w, exists := loadedWallet(cName)
if !exists {
return errCResponse("wallet with name %q does not exist", goString(cName))
}
validated, err := w.ValidateAddr(w.ctx, goString(cAddr))
if err != nil {
return errCResponse("unable to validate address: %v", err)
}
b, err := json.Marshal(validated)
if err != nil {
return errCResponse("unable to marshal validate address: %v", err)
}
return successCResponse("%s", b)
}
90 changes: 78 additions & 12 deletions cgo/transactions.go
Original file line number Diff line number Diff line change
Expand Up @@ -8,20 +8,21 @@ import (
"strconv"

dcrwallet "decred.org/dcrwallet/v4/wallet"
"github.com/decred/dcrd/chaincfg/chainhash"
"github.com/decred/dcrd/txscript/v4/stdaddr"
"github.com/decred/libwallet/dcr"
)

const defaultAccount = "default"

//export createSignedTransaction
func createSignedTransaction(cName, cCreateSignedTxJSONReq *C.char) *C.char {
//export createTransaction
func createTransaction(cName, cCreateTxJSONReq *C.char) *C.char {
w, exists := loadedWallet(cName)
if !exists {
return errCResponse("wallet with name %q does not exist", goString(cName))
}
signSendJSONReq := goString(cCreateSignedTxJSONReq)
var req CreateSignedTxReq
signSendJSONReq := goString(cCreateTxJSONReq)
var req CreateTxReq
if err := json.Unmarshal([]byte(signSendJSONReq), &req); err != nil {
return errCResponse("malformed sign send request: %v", err)
}
Expand Down Expand Up @@ -53,19 +54,21 @@ func createSignedTransaction(cName, cCreateSignedTxJSONReq *C.char) *C.char {
ignoreInputs[i] = o
}

if err := w.MainWallet().Unlock(w.ctx, []byte(req.Password), nil); err != nil {
return errCResponse("cannot unlock wallet: %v", err)
if req.Sign {
if err := w.MainWallet().Unlock(w.ctx, []byte(req.Password), nil); err != nil {
return errCResponse("cannot unlock wallet: %v", err)
}
defer w.MainWallet().Lock()
}
defer w.MainWallet().Lock()

txBytes, txhash, fee, err := w.CreateSignedTransaction(w.ctx, outputs, inputs, ignoreInputs, uint64(req.FeeRate), req.SendAll)
txBytes, txhash, fee, err := w.CreateTransaction(w.ctx, outputs, inputs, ignoreInputs, uint64(req.FeeRate), req.SendAll, req.Sign)
if err != nil {
return errCResponse("unable to sign send transaction: %v", err)
}
res := &CreateSignedTxRes{
SignedHex: hex.EncodeToString(txBytes),
Txid: txhash.String(),
Fee: int(fee),
res := &CreateTxRes{
Hex: hex.EncodeToString(txBytes),
Txid: txhash.String(),
Fee: int(fee),
}

b, err := json.Marshal(res)
Expand Down Expand Up @@ -214,3 +217,66 @@ func bestBlock(cName *C.char) *C.char {
}
return successCResponse("%s", b)
}

//export decodeTx
func decodeTx(cName, cTxHex *C.char) *C.char {
w, exists := loadedWallet(cName)
if !exists {
return errCResponse("wallet with name %q does not exist", goString(cName))
}
decoded, err := w.DecodeTx(goString(cTxHex))
if err != nil {
return errCResponse("unable to decode tx: %v", err)
}
b, err := json.Marshal(decoded)
if err != nil {
return errCResponse("unable to marshal decoded tx: %v", err)
}
return successCResponse("%s", b)
}

//export getTxn
func getTxn(cName, cHashes *C.char) *C.char {
w, exists := loadedWallet(cName)
if !exists {
return errCResponse("wallet with name %q does not exist", goString(cName))
}
var txIDs []string
if err := json.Unmarshal([]byte(goString(cHashes)), &txIDs); err != nil {
return errCResponse("unable to unmarshal hashes: %v", err)
}
txHashes := make([]*chainhash.Hash, len(txIDs))
for i, txID := range txIDs {
txHash, err := chainhash.NewHashFromStr(txID)
if err != nil {
return errCResponse("unable to create tx hash: %v", err)
}
txHashes[i] = txHash
}
hexes, err := w.GetTxn(w.ctx, txHashes)
if err != nil {
return errCResponse("unable to get txn: %v", err)
}
b, err := json.Marshal(hexes)
if err != nil {
return errCResponse("unable to marshal txn: %v", err)
}
return successCResponse("%s", b)
}

//export addSigs
func addSigs(cName, cTxHex, cSigScripts *C.char) *C.char {
w, exists := loadedWallet(cName)
if !exists {
return errCResponse("wallet with name %q does not exist", goString(cName))
}
var sigScripts []string
if err := json.Unmarshal([]byte(goString(cSigScripts)), &sigScripts); err != nil {
return errCResponse("unable to unmarshal sig scripts: %v", err)
}
signedHex, err := w.AddSigs(goString(cTxHex), sigScripts)
if err != nil {
return errCResponse("unable sign tx: %v", err)
}
return successCResponse("%s", signedHex)
}
29 changes: 24 additions & 5 deletions cgo/types.go
Original file line number Diff line number Diff line change
Expand Up @@ -104,19 +104,20 @@ type Output struct {
Amount int `json:"amount"`
}

type CreateSignedTxReq struct {
type CreateTxReq struct {
Outputs []Output `json:"outputs"`
Inputs []Input `json:"inputs"`
IgnoreInputs []Input `json:"ignoreinputs"`
FeeRate int `json:"feerate"`
SendAll bool `json:"sendall"`
Password string `json:"password"`
Sign bool `json:"sign"`
}

type CreateSignedTxRes struct {
SignedHex string `json:"signedhex"`
Txid string `json:"txid"`
Fee int `json:"fee"`
type CreateTxRes struct {
Hex string `json:"hex"`
Txid string `json:"txid"`
Fee int `json:"fee"`
}

type ListUnspentRes struct {
Expand Down Expand Up @@ -171,3 +172,21 @@ type Config struct {
// Only needed during watching only creation.
PubKey string `json:"pubkey"`
}

type AddrFromExtKey struct {
Key string `json:"key"`
Path string `json:"path"`
// Currently support types: P2PKH
AddrType string `json:"addrtype"`
UseChildBIP32Std bool `json:"usechildbip32std"`
}

type CreateExtendedKey struct {
Key string `json:"key"`
ParentKey string `json:"parentkey"`
ChainCode string `json:"chaincode"`
Network string `json:"network"`
Depth uint8 `json:"depth"`
ChildN uint32 `json:"childn"`
IsPrivate bool `json:"isprivate"`
}
Loading