Skip to content

Commit

Permalink
add transaction ID to precheck status error
Browse files Browse the repository at this point in the history
  • Loading branch information
QuestofIranon committed Feb 12, 2020
1 parent e712c19 commit a8647e3
Show file tree
Hide file tree
Showing 3 changed files with 33 additions and 19 deletions.
13 changes: 7 additions & 6 deletions errors.go
Original file line number Diff line number Diff line change
Expand Up @@ -58,18 +58,19 @@ func (e ErrHederaNetwork) Error() string {
return fmt.Sprintf("transport error occurred while accessing the Hedera network: %s", e.Error())
}

// ErrHederaPrecheckStatus is returned by Transaction.Execute and QueryBuilder.Execute if an exceptional status is
// ErrHederaPreCheckStatus is returned by Transaction.Execute and QueryBuilder.Execute if an exceptional status is
// returned during network side validation of the sent transaction.
type ErrHederaPrecheckStatus struct {
type ErrHederaPreCheckStatus struct {
TxID TransactionID
Status Status
}

func newErrHederaPrecheckStatus(status Status) ErrHederaPrecheckStatus {
return ErrHederaPrecheckStatus{Status: status}
func newErrHederaPreCheckStatus(id TransactionID, status Status) ErrHederaPreCheckStatus {
return ErrHederaPreCheckStatus{TxID: id, Status: status}
}

func (e ErrHederaPrecheckStatus) Error() string {
return e.Status.String()
func (e ErrHederaPreCheckStatus) Error() string {
return fmt.Sprintf("exceptional precheck status %s received for transaction %v", e.Status.String(), e.TxID)
}

// ErrHederaReceiptStatus is returned by TransactionID.GetReceipt if the status of the receipt is exceptional.
Expand Down
35 changes: 24 additions & 11 deletions query_builder.go
Original file line number Diff line number Diff line change
Expand Up @@ -77,7 +77,7 @@ func (builder *QueryBuilder) Cost(client *Client) (Hbar, error) {

builder.pbHeader.Payment = tx.pb

resp, err := execute(node, builder.pb, time.Now().Add(10*time.Second))
resp, err := execute(node, &tx.ID, builder.pb, time.Now().Add(10*time.Second))
if err != nil {
return ZeroHbar, err
}
Expand All @@ -99,6 +99,7 @@ func (builder *QueryBuilder) Cost(client *Client) (Hbar, error) {

func (builder *QueryBuilder) execute(client *Client) (*proto.Response, error) {
var node *node
var payment *TransactionID

if builder.isPaymentRequired() {
if builder.pbHeader.Payment != nil {
Expand All @@ -111,13 +112,18 @@ func (builder *QueryBuilder) execute(client *Client) (*proto.Response, error) {
}

nodeID := accountIDFromProto(paymentBody.NodeAccountID)
txID := transactionIDFromProto(paymentBody.TransactionID)
payment = &txID
node = client.node(nodeID)
} else if builder.payment != nil {
node = client.randomNode()
err := builder.generatePaymentTransaction(client, node, *builder.payment)
txID, err := builder.generatePaymentTransaction(client, node, *builder.payment)

if err != nil {
return nil, err
}

payment = &txID
} else if builder.maxPayment.AsTinybar() > 0 || client.maxQueryPayment.AsTinybar() > 0 {
node = client.randomNode()

Expand All @@ -136,10 +142,13 @@ func (builder *QueryBuilder) execute(client *Client) (*proto.Response, error) {
return nil, newErrorMaxQueryPaymentExceeded(builder, actualCost, maxPayment)
}

err = builder.generatePaymentTransaction(client, node, actualCost)
txID, err := builder.generatePaymentTransaction(client, node, actualCost)
if err != nil {
return nil, err
}

payment = &txID

}
} else {
node = client.randomNode()
Expand All @@ -157,10 +166,10 @@ func (builder *QueryBuilder) execute(client *Client) (*proto.Response, error) {
deadline = time.Now().Add(10 * time.Second)
}

return execute(node, builder.pb, deadline)
return execute(node, payment, builder.pb, deadline)
}

func (builder *QueryBuilder) generatePaymentTransaction(client *Client, node *node, amount Hbar) error {
func (builder *QueryBuilder) generatePaymentTransaction(client *Client, node *node, amount Hbar) (TransactionID, error) {
tx, err := NewCryptoTransferTransaction().
SetNodeAccountID(node.id).
AddRecipient(node.id, amount).
Expand All @@ -169,7 +178,7 @@ func (builder *QueryBuilder) generatePaymentTransaction(client *Client, node *no
Build(client)

if err != nil {
return err
return TransactionID{}, err
}

if client.operator != nil {
Expand All @@ -178,7 +187,7 @@ func (builder *QueryBuilder) generatePaymentTransaction(client *Client, node *no

builder.pbHeader.Payment = tx.pb

return nil
return tx.ID, nil
}

func (builder *QueryBuilder) isPaymentRequired() bool {
Expand Down Expand Up @@ -321,7 +330,7 @@ func isResponseUnknown(resp *proto.Response) bool {
return false
}

func execute(node *node, pb *proto.Query, deadline time.Time) (*proto.Response, error) {
func execute(node *node, paymentID *TransactionID, pb *proto.Query, deadline time.Time) (*proto.Response, error) {
methodName := methodName(pb)
resp := new(proto.Response)

Expand Down Expand Up @@ -357,8 +366,8 @@ func execute(node *node, pb *proto.Query, deadline time.Time) (*proto.Response,
status := Status(respHeader.NodeTransactionPrecheckCode)

if status.isExceptional(true) {
// precheck failed
return resp, newErrHederaPrecheckStatus(status)
// precheck failed, paymentID should never be nil in this case
return resp, newErrHederaPreCheckStatus(*paymentID, status)
}

// success
Expand All @@ -367,5 +376,9 @@ func execute(node *node, pb *proto.Query, deadline time.Time) (*proto.Response,

// Timed out
respHeader := mapResponseHeader(resp)
return nil, newErrHederaPrecheckStatus(Status(respHeader.NodeTransactionPrecheckCode))
if paymentID != nil {
return nil, newErrHederaPreCheckStatus(*paymentID, Status(respHeader.NodeTransactionPrecheckCode))
}

return nil, newErrHederaNetwork(fmt.Errorf("timed out with status %v", Status(respHeader.NodeTransactionPrecheckCode)))
}
4 changes: 2 additions & 2 deletions transaction.go
Original file line number Diff line number Diff line change
Expand Up @@ -164,15 +164,15 @@ func (transaction Transaction) Execute(client *Client) (TransactionID, error) {

if status.isExceptional(true) {
// precheck failed
return id, newErrHederaPrecheckStatus(status)
return id, newErrHederaPreCheckStatus(transaction.ID, status)
}

// success
return id, nil
}

// Timed out
return id, newErrHederaPrecheckStatus(Status(resp.NodeTransactionPrecheckCode))
return id, newErrHederaPreCheckStatus(transaction.ID, Status(resp.NodeTransactionPrecheckCode))
}

func (transaction Transaction) String() string {
Expand Down

0 comments on commit a8647e3

Please sign in to comment.