Skip to content

Commit 5506c43

Browse files
committed
fix: add domainID check to transactionStatus check
1 parent 9639d70 commit 5506c43

3 files changed

Lines changed: 72 additions & 5 deletions

File tree

internal/xrp/entities.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,8 +10,8 @@ type Transaction struct {
1010
BlockNumber uint64 `gorm:"index;index:idx_payref_block,priority:2;index:idx_dest_block,priority:2"`
1111
Timestamp uint64 `gorm:"index"`
1212
// TransactionStatus is true when the transaction result is tesSUCCESS or a
13-
// destination-related failure (tecDST_TAG_NEEDED, tecNO_DST, tecNO_DST_INSUF_XRP,
14-
// tecNO_PERMISSION), and false for all other results.
13+
// destination-related failure (tecDST_TAG_NEEDED, tecNO_DST, tecNO_DST_INSUF_XRP, and
14+
// tecNO_PERMISSION without defined DomainID), and false for all other results.
1515
TransactionStatus bool `gorm:"index"`
1616
PaymentReference string `gorm:"index:idx_payref_block,priority:1;type:varchar(64);default:null"`
1717
Response string `gorm:"type:varchar"`

internal/xrp/transaction.go

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@ type transaction struct {
2929
Account string `json:"Account"`
3030
Amount json.RawMessage `json:"Amount"`
3131
MetaData json.RawMessage `json:"metaData"`
32+
DomainID *string `json:"DomainID"`
3233
Destination string `json:"Destination"`
3334
DestinationTag *uint32 `json:"DestinationTag"`
3435
}
@@ -107,8 +108,8 @@ func (tx *transaction) destinationAddressHash() *string {
107108
}
108109

109110
// transactionStatus returns true when the transaction result is tesSUCCESS or a
110-
// destination-related failure (tecDST_TAG_NEEDED, tecNO_DST, tecNO_DST_INSUF_XRP,
111-
// tecNO_PERMISSION), and false for all other results.
111+
// destination-related failure (tecDST_TAG_NEEDED, tecNO_DST, tecNO_DST_INSUF_XRP, and
112+
// tecNO_PERMISSION without set DomainID), and false for all other results.
112113
func (tx *transaction) transactionStatus() (bool, error) {
113114
var meta struct {
114115
TransactionResult string `json:"TransactionResult"`
@@ -122,7 +123,12 @@ func (tx *transaction) transactionStatus() (bool, error) {
122123
switch meta.TransactionResult {
123124
case "tesSUCCESS":
124125
return true, nil
125-
case "tecDST_TAG_NEEDED", "tecNO_DST", "tecNO_DST_INSUF_XRP", "tecNO_PERMISSION":
126+
case "tecDST_TAG_NEEDED", "tecNO_DST", "tecNO_DST_INSUF_XRP":
127+
return true, nil
128+
case "tecNO_PERMISSION":
129+
if tx.DomainID != nil {
130+
return false, nil
131+
}
126132
return true, nil
127133

128134
default:

internal/xrp/transaction_test.go

Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,11 @@ func TestTransactionStatus(t *testing.T) {
2828
metaData: `{"AffectedNodes":[],"TransactionResult":"tecNO_DST"}`,
2929
expected: true,
3030
},
31+
{
32+
name: "tecNO_PERMISSION without DomainID",
33+
metaData: `{"AffectedNodes":[],"TransactionResult":"tecNO_PERMISSION"}`,
34+
expected: true,
35+
},
3136
{
3237
name: "unknown result",
3338
metaData: `{"AffectedNodes":[],"TransactionResult":"temBAD_AMOUNT"}`,
@@ -45,6 +50,62 @@ func TestTransactionStatus(t *testing.T) {
4550
}
4651
}
4752

53+
// TestTransactionStatusFromRawTx verifies transactionStatus end-to-end on the raw
54+
// JSON of testnet tx C935D183BC7D63C3D91AD8AE73564A42315E2EE0C5C9A4E0B1F67A28F517FE25:
55+
// a Payment with DomainID that the ledger rejected with tecNO_PERMISSION. This also
56+
// exercises the JSON binding of the DomainID field.
57+
func TestTransactionStatusFromRawTx(t *testing.T) {
58+
raw := `{
59+
"Account": "rGqCqM1djMK19wgn4PwoEmGrpit8T4Akmt",
60+
"Amount": "1000000",
61+
"DeliverMax": "1000000",
62+
"Destination": "rUvJftL8ZkvLveY4b2E2rfkyiG2VPfDTFe",
63+
"DomainID": "87BC3EBBE3DB4AE7F40822037BCFF4FDED8B59F949594AC8BE4A0E40CF9DA226",
64+
"Fee": "12",
65+
"Flags": 0,
66+
"LastLedgerSequence": 17501605,
67+
"Sequence": 17501583,
68+
"SigningPubKey": "EDEE63EC44DC59A8C5CAA91268446E0BAAD96F8D2601CF329F3E572B294D60BC7F",
69+
"TransactionType": "Payment",
70+
"TxnSignature": "5CA4E52DAC85708B77529FB4857A944171A82BBA152F8DFECB90E99C542105560864DC20F8F1AA414144E96ACFA5DA6443E4FF962BD0D8FDDE1E887481F8AD06",
71+
"hash": "C935D183BC7D63C3D91AD8AE73564A42315E2EE0C5C9A4E0B1F67A28F517FE25",
72+
"metaData": {
73+
"AffectedNodes": [
74+
{
75+
"ModifiedNode": {
76+
"FinalFields": {
77+
"Account": "rGqCqM1djMK19wgn4PwoEmGrpit8T4Akmt",
78+
"Balance": "99999988",
79+
"Flags": 0,
80+
"OwnerCount": 0,
81+
"Sequence": 17501584
82+
},
83+
"LedgerEntryType": "AccountRoot",
84+
"LedgerIndex": "BC30C5B2B5C55A57E7EB170058627077E9EA175C194AF60A015B996DF4C564EF",
85+
"PreviousFields": {
86+
"Balance": "100000000",
87+
"Sequence": 17501583
88+
},
89+
"PreviousTxnID": "EFBB0CDC7F819909876D997F845C35DA193B5BA8BE6D82D3ED3BA09D0F66285D",
90+
"PreviousTxnLgrSeq": 17501583
91+
}
92+
}
93+
],
94+
"TransactionIndex": 1,
95+
"TransactionResult": "tecNO_PERMISSION"
96+
}
97+
}`
98+
99+
var tx transaction
100+
require.NoError(t, json.Unmarshal([]byte(raw), &tx))
101+
require.NotNil(t, tx.DomainID)
102+
require.Equal(t, "87BC3EBBE3DB4AE7F40822037BCFF4FDED8B59F949594AC8BE4A0E40CF9DA226", *tx.DomainID)
103+
104+
status, err := tx.transactionStatus()
105+
require.NoError(t, err)
106+
require.False(t, status)
107+
}
108+
48109
func TestIntendedReceivingAmount(t *testing.T) {
49110
tests := []struct {
50111
name string

0 commit comments

Comments
 (0)