Add context to RPC wrapper (#53)
This commit is contained in:
parent
869b68fad5
commit
68e3fca59c
10
main.go
10
main.go
@ -102,7 +102,7 @@ func run(ctx context.Context) error {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Ensure the wallet account for collecting fees exists and matches config.
|
// Ensure the wallet account for collecting fees exists and matches config.
|
||||||
err = setupFeeAccount(ctx, feeWalletClient, cfg.FeeXPub)
|
err = setupFeeAccount(feeWalletClient, cfg.FeeXPub)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Errorf("Fee account error: %v", err)
|
log.Errorf("Fee account error: %v", err)
|
||||||
requestShutdown()
|
requestShutdown()
|
||||||
@ -133,16 +133,16 @@ func run(ctx context.Context) error {
|
|||||||
return ctx.Err()
|
return ctx.Err()
|
||||||
}
|
}
|
||||||
|
|
||||||
func setupFeeAccount(ctx context.Context, walletClient *rpc.FeeWalletRPC, feeXpub string) error {
|
func setupFeeAccount(walletClient *rpc.FeeWalletRPC, feeXpub string) error {
|
||||||
// Check if account for fee collection already exists.
|
// Check if account for fee collection already exists.
|
||||||
accounts, err := walletClient.ListAccounts(ctx)
|
accounts, err := walletClient.ListAccounts()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("ListAccounts error: %v", err)
|
return fmt.Errorf("ListAccounts error: %v", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
if _, ok := accounts[feeAccountName]; ok {
|
if _, ok := accounts[feeAccountName]; ok {
|
||||||
// Account already exists. Check xpub matches xpub from config.
|
// Account already exists. Check xpub matches xpub from config.
|
||||||
existingXPub, err := walletClient.GetMasterPubKey(ctx, feeAccountName)
|
existingXPub, err := walletClient.GetMasterPubKey(feeAccountName)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("GetMasterPubKey error: %v", err)
|
return fmt.Errorf("GetMasterPubKey error: %v", err)
|
||||||
}
|
}
|
||||||
@ -155,7 +155,7 @@ func setupFeeAccount(ctx context.Context, walletClient *rpc.FeeWalletRPC, feeXpu
|
|||||||
|
|
||||||
} else {
|
} else {
|
||||||
// Account does not exist. Create it using xpub from config.
|
// Account does not exist. Create it using xpub from config.
|
||||||
if err = walletClient.ImportXPub(ctx, feeAccountName, feeXpub); err != nil {
|
if err = walletClient.ImportXPub(feeAccountName, feeXpub); err != nil {
|
||||||
log.Errorf("ImportXPub error: %v", err)
|
log.Errorf("ImportXPub error: %v", err)
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|||||||
@ -16,6 +16,7 @@ const (
|
|||||||
// of JSON encoding.
|
// of JSON encoding.
|
||||||
type FeeWalletRPC struct {
|
type FeeWalletRPC struct {
|
||||||
Caller
|
Caller
|
||||||
|
ctx context.Context
|
||||||
}
|
}
|
||||||
|
|
||||||
// FeeWalletClient creates a new WalletRPC client instance from a caller.
|
// FeeWalletClient creates a new WalletRPC client instance from a caller.
|
||||||
@ -48,64 +49,64 @@ func FeeWalletClient(ctx context.Context, c Caller) (*FeeWalletRPC, error) {
|
|||||||
|
|
||||||
// TODO: Ensure correct network.
|
// TODO: Ensure correct network.
|
||||||
|
|
||||||
return &FeeWalletRPC{c}, nil
|
return &FeeWalletRPC{c, ctx}, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (c *FeeWalletRPC) ImportXPub(ctx context.Context, account, xpub string) error {
|
func (c *FeeWalletRPC) ImportXPub(account, xpub string) error {
|
||||||
return c.Call(ctx, "importxpub", nil, account, xpub)
|
return c.Call(c.ctx, "importxpub", nil, account, xpub)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (c *FeeWalletRPC) GetMasterPubKey(ctx context.Context, account string) (string, error) {
|
func (c *FeeWalletRPC) GetMasterPubKey(account string) (string, error) {
|
||||||
var pubKey string
|
var pubKey string
|
||||||
err := c.Call(ctx, "getmasterpubkey", &pubKey, account)
|
err := c.Call(c.ctx, "getmasterpubkey", &pubKey, account)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return "", err
|
return "", err
|
||||||
}
|
}
|
||||||
return pubKey, nil
|
return pubKey, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (c *FeeWalletRPC) ListAccounts(ctx context.Context) (map[string]float64, error) {
|
func (c *FeeWalletRPC) ListAccounts() (map[string]float64, error) {
|
||||||
var accounts map[string]float64
|
var accounts map[string]float64
|
||||||
err := c.Call(ctx, "listaccounts", &accounts)
|
err := c.Call(c.ctx, "listaccounts", &accounts)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
return accounts, nil
|
return accounts, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (c *FeeWalletRPC) GetNewAddress(ctx context.Context, account string) (string, error) {
|
func (c *FeeWalletRPC) GetNewAddress(account string) (string, error) {
|
||||||
var newAddress string
|
var newAddress string
|
||||||
err := c.Call(ctx, "getnewaddress", &newAddress, account)
|
err := c.Call(c.ctx, "getnewaddress", &newAddress, account)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return "", err
|
return "", err
|
||||||
}
|
}
|
||||||
return newAddress, nil
|
return newAddress, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (c *FeeWalletRPC) GetBlockHeader(ctx context.Context, blockHash string) (*dcrdtypes.GetBlockHeaderVerboseResult, error) {
|
func (c *FeeWalletRPC) GetBlockHeader(blockHash string) (*dcrdtypes.GetBlockHeaderVerboseResult, error) {
|
||||||
verbose := true
|
verbose := true
|
||||||
var blockHeader dcrdtypes.GetBlockHeaderVerboseResult
|
var blockHeader dcrdtypes.GetBlockHeaderVerboseResult
|
||||||
err := c.Call(ctx, "getblockheader", &blockHeader, blockHash, verbose)
|
err := c.Call(c.ctx, "getblockheader", &blockHeader, blockHash, verbose)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
return &blockHeader, nil
|
return &blockHeader, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (c *FeeWalletRPC) GetRawTransaction(ctx context.Context, txHash string) (*dcrdtypes.TxRawResult, error) {
|
func (c *FeeWalletRPC) GetRawTransaction(txHash string) (*dcrdtypes.TxRawResult, error) {
|
||||||
verbose := 1
|
verbose := 1
|
||||||
var resp dcrdtypes.TxRawResult
|
var resp dcrdtypes.TxRawResult
|
||||||
err := c.Call(ctx, "getrawtransaction", &resp, txHash, verbose)
|
err := c.Call(c.ctx, "getrawtransaction", &resp, txHash, verbose)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
return &resp, nil
|
return &resp, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (c *FeeWalletRPC) SendRawTransaction(ctx context.Context, txHex string) (string, error) {
|
func (c *FeeWalletRPC) SendRawTransaction(txHex string) (string, error) {
|
||||||
allowHighFees := false
|
allowHighFees := false
|
||||||
var txHash string
|
var txHash string
|
||||||
err := c.Call(ctx, "sendrawtransaction", &txHash, txHex, allowHighFees)
|
err := c.Call(c.ctx, "sendrawtransaction", &txHash, txHex, allowHighFees)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return "", err
|
return "", err
|
||||||
}
|
}
|
||||||
|
|||||||
@ -16,6 +16,7 @@ const (
|
|||||||
// of JSON encoding.
|
// of JSON encoding.
|
||||||
type VotingWalletRPC struct {
|
type VotingWalletRPC struct {
|
||||||
Caller
|
Caller
|
||||||
|
ctx context.Context
|
||||||
}
|
}
|
||||||
|
|
||||||
// VotingWalletClient creates a new VotingWalletRPC client instance from a caller.
|
// VotingWalletClient creates a new VotingWalletRPC client instance from a caller.
|
||||||
@ -54,20 +55,20 @@ func VotingWalletClient(ctx context.Context, c Caller) (*VotingWalletRPC, error)
|
|||||||
|
|
||||||
// TODO: Ensure correct network.
|
// TODO: Ensure correct network.
|
||||||
|
|
||||||
return &VotingWalletRPC{c}, nil
|
return &VotingWalletRPC{c, ctx}, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (c *VotingWalletRPC) AddTransaction(ctx context.Context, blockHash, txHex string) error {
|
func (c *VotingWalletRPC) AddTransaction(blockHash, txHex string) error {
|
||||||
return c.Call(ctx, "addtransaction", nil, blockHash, txHex)
|
return c.Call(c.ctx, "addtransaction", nil, blockHash, txHex)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (c *VotingWalletRPC) ImportPrivKey(ctx context.Context, votingWIF string) error {
|
func (c *VotingWalletRPC) ImportPrivKey(votingWIF string) error {
|
||||||
label := "imported"
|
label := "imported"
|
||||||
rescan := false
|
rescan := false
|
||||||
scanFrom := 0
|
scanFrom := 0
|
||||||
return c.Call(ctx, "importprivkey", nil, votingWIF, label, rescan, scanFrom)
|
return c.Call(c.ctx, "importprivkey", nil, votingWIF, label, rescan, scanFrom)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (c *VotingWalletRPC) SetVoteChoice(ctx context.Context, agenda, choice, ticketHash string) error {
|
func (c *VotingWalletRPC) SetVoteChoice(agenda, choice, ticketHash string) error {
|
||||||
return c.Call(ctx, "setvotechoice", nil, agenda, choice, ticketHash)
|
return c.Call(c.ctx, "setvotechoice", nil, agenda, choice, ticketHash)
|
||||||
}
|
}
|
||||||
|
|||||||
@ -96,7 +96,7 @@ func feeAddress(c *gin.Context) {
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
resp, err := fWalletClient.GetRawTransaction(ctx, txHash.String())
|
resp, err := fWalletClient.GetRawTransaction(txHash.String())
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Warnf("Could not retrieve tx %s for %s: %v", txHash, c.ClientIP(), err)
|
log.Warnf("Could not retrieve tx %s for %s: %v", txHash, c.ClientIP(), err)
|
||||||
sendErrorResponse("unknown transaction", http.StatusBadRequest, c)
|
sendErrorResponse("unknown transaction", http.StatusBadRequest, c)
|
||||||
@ -157,7 +157,7 @@ func feeAddress(c *gin.Context) {
|
|||||||
// get blockheight and sdiff which is required by
|
// get blockheight and sdiff which is required by
|
||||||
// txrules.StakePoolTicketFee, and store them in the database
|
// txrules.StakePoolTicketFee, and store them in the database
|
||||||
// for processing by payfee
|
// for processing by payfee
|
||||||
blockHeader, err := fWalletClient.GetBlockHeader(ctx, resp.BlockHash)
|
blockHeader, err := fWalletClient.GetBlockHeader(resp.BlockHash)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Errorf("GetBlockHeader error: %v", err)
|
log.Errorf("GetBlockHeader error: %v", err)
|
||||||
sendErrorResponse("dcrwallet RPC error", http.StatusInternalServerError, c)
|
sendErrorResponse("dcrwallet RPC error", http.StatusInternalServerError, c)
|
||||||
@ -165,7 +165,7 @@ func feeAddress(c *gin.Context) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// TODO: Generate this within dcrvsp without an RPC call?
|
// TODO: Generate this within dcrvsp without an RPC call?
|
||||||
newAddress, err := fWalletClient.GetNewAddress(ctx, cfg.FeeAccountName)
|
newAddress, err := fWalletClient.GetNewAddress(cfg.FeeAccountName)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Errorf("GetNewAddress error: %v", err)
|
log.Errorf("GetNewAddress error: %v", err)
|
||||||
sendErrorResponse("unable to generate fee address", http.StatusInternalServerError, c)
|
sendErrorResponse("unable to generate fee address", http.StatusInternalServerError, c)
|
||||||
|
|||||||
@ -146,7 +146,7 @@ findAddress:
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
rawTicket, err := fWalletClient.GetRawTransaction(ctx, ticketHash.String())
|
rawTicket, err := fWalletClient.GetRawTransaction(ticketHash.String())
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Warnf("Could not retrieve tx %s for %s: %v", ticketHash.String(), c.ClientIP(), err)
|
log.Warnf("Could not retrieve tx %s for %s: %v", ticketHash.String(), c.ClientIP(), err)
|
||||||
sendErrorResponse("unknown transaction", http.StatusBadRequest, c)
|
sendErrorResponse("unknown transaction", http.StatusBadRequest, c)
|
||||||
@ -166,14 +166,14 @@ findAddress:
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
err = vWalletClient.AddTransaction(ctx, rawTicket.BlockHash, rawTicket.Hex)
|
err = vWalletClient.AddTransaction(rawTicket.BlockHash, rawTicket.Hex)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Errorf("AddTransaction failed: %v", err)
|
log.Errorf("AddTransaction failed: %v", err)
|
||||||
sendErrorResponse("dcrwallet RPC error", http.StatusInternalServerError, c)
|
sendErrorResponse("dcrwallet RPC error", http.StatusInternalServerError, c)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
err = vWalletClient.ImportPrivKey(ctx, votingWIF.String())
|
err = vWalletClient.ImportPrivKey(votingWIF.String())
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Errorf("ImportPrivKey failed: %v", err)
|
log.Errorf("ImportPrivKey failed: %v", err)
|
||||||
sendErrorResponse("dcrwallet RPC error", http.StatusInternalServerError, c)
|
sendErrorResponse("dcrwallet RPC error", http.StatusInternalServerError, c)
|
||||||
@ -182,7 +182,7 @@ findAddress:
|
|||||||
|
|
||||||
// Update vote choices on voting wallets.
|
// Update vote choices on voting wallets.
|
||||||
for agenda, choice := range voteChoices {
|
for agenda, choice := range voteChoices {
|
||||||
err = vWalletClient.SetVoteChoice(ctx, agenda, choice, ticket.Hash)
|
err = vWalletClient.SetVoteChoice(agenda, choice, ticket.Hash)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Errorf("SetVoteChoice failed: %v", err)
|
log.Errorf("SetVoteChoice failed: %v", err)
|
||||||
sendErrorResponse("dcrwallet RPC error", http.StatusInternalServerError, c)
|
sendErrorResponse("dcrwallet RPC error", http.StatusInternalServerError, c)
|
||||||
@ -199,7 +199,7 @@ findAddress:
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
sendTxHash, err := fWalletClient.SendRawTransaction(ctx, hex.EncodeToString(feeTxBuf.Bytes()))
|
sendTxHash, err := fWalletClient.SendRawTransaction(hex.EncodeToString(feeTxBuf.Bytes()))
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Errorf("SendRawTransaction failed: %v", err)
|
log.Errorf("SendRawTransaction failed: %v", err)
|
||||||
sendErrorResponse("dcrwallet RPC error", http.StatusInternalServerError, c)
|
sendErrorResponse("dcrwallet RPC error", http.StatusInternalServerError, c)
|
||||||
|
|||||||
@ -79,7 +79,7 @@ func setVoteChoices(c *gin.Context) {
|
|||||||
|
|
||||||
// Update vote choices on voting wallets.
|
// Update vote choices on voting wallets.
|
||||||
for agenda, choice := range voteChoices {
|
for agenda, choice := range voteChoices {
|
||||||
err = vWalletClient.SetVoteChoice(ctx, agenda, choice, ticket.Hash)
|
err = vWalletClient.SetVoteChoice(agenda, choice, ticket.Hash)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Errorf("SetVoteChoice failed: %v", err)
|
log.Errorf("SetVoteChoice failed: %v", err)
|
||||||
sendErrorResponse("dcrwallet RPC error", http.StatusInternalServerError, c)
|
sendErrorResponse("dcrwallet RPC error", http.StatusInternalServerError, c)
|
||||||
|
|||||||
@ -142,9 +142,9 @@ func sendJSONResponse(resp interface{}, c *gin.Context) {
|
|||||||
sig := ed25519.Sign(cfg.SignKey, dec)
|
sig := ed25519.Sign(cfg.SignKey, dec)
|
||||||
c.Writer.Header().Set("VSP-Signature", hex.EncodeToString(sig))
|
c.Writer.Header().Set("VSP-Signature", hex.EncodeToString(sig))
|
||||||
|
|
||||||
c.JSON(http.StatusOK, resp)
|
c.AbortWithStatusJSON(http.StatusOK, resp)
|
||||||
}
|
}
|
||||||
|
|
||||||
func sendErrorResponse(errMsg string, code int, c *gin.Context) {
|
func sendErrorResponse(errMsg string, code int, c *gin.Context) {
|
||||||
c.JSON(code, gin.H{"error": errMsg})
|
c.AbortWithStatusJSON(code, gin.H{"error": errMsg})
|
||||||
}
|
}
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user