Skip to content

Commit 1639de0

Browse files
Merge pull request #173 from XRPLF/xrpl/refactor/transaction-metadata
[TA-5891]: improve transaction result metadata type
2 parents 5f418f8 + e3aec64 commit 1639de0

34 files changed

+953
-316
lines changed

CHANGELOG.md

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,12 @@ All notable changes to this project will be documented in this file.
55
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
66
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
77

8+
## [Unreleased]
9+
10+
### Refactored
11+
12+
- `TxResponse` `Meta` field type changed to `TxMetadataBuilder`, enabling custom parsing for specific transactions metadata such as `Payment`, `NFTokenMint`, etc.
13+
814
## [v0.1.13]
915

1016
### Added

examples/checks/rpc/main.go

Lines changed: 6 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -95,31 +95,20 @@ func main() {
9595
fmt.Printf("🌐 Hash: %s\n", res.Hash.String())
9696
fmt.Println()
9797

98-
meta, ok := res.Meta.(map[string]interface{})
99-
if !ok {
100-
fmt.Println("❌ Meta is not of type TxObjMeta")
101-
return
102-
}
98+
meta := res.Meta.AsTxObjMeta()
10399

104100
var checkID string
105101

106-
affectedNodes := meta["AffectedNodes"].([]interface{})
102+
affectedNodes := meta.AffectedNodes
107103

108-
for _, node := range affectedNodes {
109-
affectedNode, ok := node.(map[string]interface{})
110-
if !ok {
104+
for _, affectedNode := range affectedNodes {
105+
if affectedNode.CreatedNode == nil {
111106
fmt.Println("❌ Node is not of type map[string]interface{}")
112107
return
113108
}
114109

115-
createdNode, ok := affectedNode["CreatedNode"].(map[string]interface{})
116-
if !ok {
117-
continue
118-
}
119-
120-
if createdNode["LedgerEntryType"] == string(ledger.CheckEntry) {
121-
122-
checkID = createdNode["LedgerIndex"].(string)
110+
if affectedNode.CreatedNode.LedgerEntryType == ledger.CheckEntry {
111+
checkID = affectedNode.CreatedNode.LedgerIndex
123112
}
124113
}
125114

examples/checks/ws/main.go

Lines changed: 6 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -110,31 +110,20 @@ func main() {
110110
fmt.Printf("🌐 Hash: %s\n", res.Hash.String())
111111
fmt.Println()
112112

113-
meta, ok := res.Meta.(map[string]interface{})
114-
if !ok {
115-
fmt.Println("❌ Meta is not of type TxObjMeta")
116-
return
117-
}
113+
meta := res.Meta.AsTxObjMeta()
118114

119115
var checkID string
120116

121-
affectedNodes := meta["AffectedNodes"].([]interface{})
117+
affectedNodes := meta.AffectedNodes
122118

123-
for _, node := range affectedNodes {
124-
affectedNode, ok := node.(map[string]interface{})
125-
if !ok {
119+
for _, affectedNode := range affectedNodes {
120+
if affectedNode.CreatedNode == nil {
126121
fmt.Println("❌ Node is not of type map[string]interface{}")
127122
return
128123
}
129124

130-
createdNode, ok := affectedNode["CreatedNode"].(map[string]interface{})
131-
if !ok {
132-
continue
133-
}
134-
135-
if createdNode["LedgerEntryType"] == string(ledger.CheckEntry) {
136-
137-
checkID = createdNode["LedgerIndex"].(string)
125+
if affectedNode.CreatedNode.LedgerEntryType == ledger.CheckEntry {
126+
checkID = affectedNode.CreatedNode.LedgerIndex
138127
}
139128
}
140129

examples/nft/nft-accept/rpc/main.go

Lines changed: 4 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -86,19 +86,14 @@ func main() {
8686
// Step 3: Retrieve the NFT token offer ID
8787
fmt.Println("⏳ Retrieving NFT offer ID...")
8888

89-
metaMap, ok := responseMint.Meta.(map[string]any)
90-
if !ok {
91-
fmt.Println("❌ Meta is not a map[string]any")
92-
return
93-
}
89+
metaMap := responseMint.Meta.AsNFTokenMintMetadata()
9490

95-
offerID, ok := metaMap["offer_id"].(string)
96-
if !ok {
91+
if metaMap.OfferID == nil {
9792
fmt.Println("❌ offer_id not found or not a string")
9893
return
9994
}
10095

101-
fmt.Println("🌎 offer_id:", offerID)
96+
fmt.Println("🌎 offer_id:", *metaMap.OfferID)
10297
fmt.Println()
10398

10499
// Step 4: Accept the NFT offer
@@ -109,7 +104,7 @@ func main() {
109104
Account: nftBuyer.ClassicAddress,
110105
TransactionType: transaction.NFTokenAcceptOfferTx,
111106
},
112-
NFTokenSellOffer: txnTypes.Hash256(offerID),
107+
NFTokenSellOffer: txnTypes.Hash256(*metaMap.OfferID),
113108
}
114109

115110
response, err := client.SubmitTxAndWait(nftAccept.Flatten(), &types.SubmitOptions{

examples/nft/nft-accept/ws/main.go

Lines changed: 5 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -97,18 +97,14 @@ func main() {
9797

9898
// Extract the NFT token offer ID from the transaction metadata
9999
fmt.Println("⏳ Extracting offer ID...")
100-
metaMap, ok := responseMint.Meta.(map[string]any)
101-
if !ok {
102-
fmt.Println("❌ Meta is not a map[string]any")
103-
return
104-
}
100+
metaMap := responseMint.Meta.AsNFTokenMintMetadata()
105101

106-
offerID, ok := metaMap["offer_id"].(string)
107-
if !ok {
102+
if metaMap.OfferID == nil {
108103
fmt.Println("❌ offer_id not found or not a string")
109104
return
110105
}
111-
fmt.Println("🌎 offer_id:", offerID)
106+
107+
fmt.Println("🌎 offer_id:", *metaMap.OfferID)
112108
fmt.Println()
113109

114110
// Accept the NFT offer
@@ -118,7 +114,7 @@ func main() {
118114
Account: nftBuyer.ClassicAddress,
119115
TransactionType: transaction.NFTokenAcceptOfferTx,
120116
},
121-
NFTokenSellOffer: txnTypes.Hash256(offerID),
117+
NFTokenSellOffer: txnTypes.Hash256(*metaMap.OfferID),
122118
}
123119

124120
response, err := client.SubmitTxAndWait(nftAccept.Flatten(), &types.SubmitOptions{

examples/nft/nft-burn/rpc/main.go

Lines changed: 4 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -72,19 +72,14 @@ func main() {
7272
// Step 3: Retrieve the token ID
7373
fmt.Println("⏳ Retrieving NFT ID...")
7474

75-
metaMap, ok := responseMint.Meta.(map[string]any)
76-
if !ok {
77-
fmt.Println("❌ Meta is not a map[string]any")
78-
return
79-
}
75+
metadata := responseMint.Meta.AsNFTokenMintMetadata()
8076

81-
nftokenID, ok := metaMap["nftoken_id"].(string)
82-
if !ok {
77+
if metadata.NFTokenID != nil {
8378
fmt.Println("❌ nftoken_id not found or not a string")
8479
return
8580
}
8681

87-
fmt.Println("🌎 nftoken_id:", nftokenID)
82+
fmt.Println("🌎 nftoken_id:", metadata.NFTokenID.String())
8883
fmt.Println()
8984

9085
// Step 4: Burn the NFT
@@ -95,7 +90,7 @@ func main() {
9590
Account: nftMinter.ClassicAddress,
9691
TransactionType: transaction.NFTokenAcceptOfferTx,
9792
},
98-
NFTokenID: txnTypes.NFTokenID(nftokenID),
93+
NFTokenID: txnTypes.NFTokenID(metadata.NFTokenID.String()),
9994
}
10095

10196
responseBurn, err := client.SubmitTxAndWait(nftBurn.Flatten(), &types.SubmitOptions{

examples/nft/nft-burn/ws/main.go

Lines changed: 4 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -86,19 +86,14 @@ func main() {
8686
// Step 3: Retrieve the token ID
8787
fmt.Println("⏳ Retrieving NFT ID...")
8888

89-
metaMap, ok := responseMint.Meta.(map[string]any)
90-
if !ok {
91-
fmt.Println("❌ Meta is not a map[string]any")
92-
return
93-
}
89+
metaMap := responseMint.Meta.AsNFTokenMintMetadata()
9490

95-
nftokenID, ok := metaMap["nftoken_id"].(string)
96-
if !ok {
91+
if metaMap.NFTokenID == nil {
9792
fmt.Println("❌ nftoken_id not found or not a string")
9893
return
9994
}
10095

101-
fmt.Println("🌎 nftoken_id:", nftokenID)
96+
fmt.Println("🌎 nftoken_id:", metaMap.NFTokenID.String())
10297
fmt.Println()
10398

10499
// Step 4: Burn the NFT
@@ -109,7 +104,7 @@ func main() {
109104
Account: nftMinter.ClassicAddress,
110105
TransactionType: transaction.NFTokenAcceptOfferTx,
111106
},
112-
NFTokenID: txnTypes.NFTokenID(nftokenID),
107+
NFTokenID: txnTypes.NFTokenID(metaMap.NFTokenID.String()),
113108
}
114109

115110
responseBurn, err := client.SubmitTxAndWait(nftBurn.Flatten(), &types.SubmitOptions{

examples/nft/nft-cancel/rpc/main.go

Lines changed: 8 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -71,19 +71,14 @@ func main() {
7171
// Step 3: Retrieve the NFT token ID
7272
fmt.Println("⏳ Retrieving NFT ID...")
7373

74-
metaMap, ok := responseMint.Meta.(map[string]any)
75-
if !ok {
76-
fmt.Println("❌ Meta is not a map[string]any")
77-
return
78-
}
74+
metaMap := responseMint.Meta.AsNFTokenMintMetadata()
7975

80-
nftokenID1, ok := metaMap["nftoken_id"].(string)
81-
if !ok {
76+
if metaMap.NFTokenID == nil {
8277
fmt.Println("❌ nftoken_id not found or not a string")
8378
return
8479
}
8580

86-
fmt.Println("🌎 nftoken_id:", nftokenID1)
81+
fmt.Println("🌎 nftoken_id:", metaMap.NFTokenID.String())
8782
fmt.Println()
8883

8984
// ------
@@ -118,19 +113,14 @@ func main() {
118113
// Step 3: Retrieve the second NFT token ID
119114
fmt.Println("⏳ Retrieving second NFT ID...")
120115

121-
metaMap2, ok := responseMint2.Meta.(map[string]any)
122-
if !ok {
123-
fmt.Println("❌ Meta is not a map[string]any")
124-
return
125-
}
116+
metaMap2 := responseMint2.Meta.AsNFTokenMintMetadata()
126117

127-
nftokenID2, ok := metaMap2["nftoken_id"].(string)
128-
if !ok {
118+
if metaMap2.NFTokenID == nil {
129119
fmt.Println("❌ nftoken_id not found or not a string")
130120
return
131121
}
132122

133-
fmt.Println("🌎 nftoken_id:", nftokenID2)
123+
fmt.Println("🌎 nftoken_id:", metaMap2.NFTokenID.String())
134124
fmt.Println()
135125

136126
// Step 4: Cancel the NFT offers
@@ -142,8 +132,8 @@ func main() {
142132
TransactionType: transaction.NFTokenAcceptOfferTx,
143133
},
144134
NFTokenOffers: []txnTypes.NFTokenID{
145-
txnTypes.NFTokenID(nftokenID1),
146-
txnTypes.NFTokenID(nftokenID2),
135+
txnTypes.NFTokenID(metaMap2.NFTokenID.String()),
136+
txnTypes.NFTokenID(metaMap2.NFTokenID.String()),
147137
},
148138
}
149139

examples/nft/nft-cancel/ws/main.go

Lines changed: 8 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -84,19 +84,14 @@ func main() {
8484
// Step 3: Retrieve the NFT token ID
8585
fmt.Println("⏳ Retrieving NFT ID...")
8686

87-
metaMap, ok := responseMint.Meta.(map[string]any)
88-
if !ok {
89-
fmt.Println("❌ Meta is not a map[string]any")
90-
return
91-
}
87+
metaMap := responseMint.Meta.AsNFTokenMintMetadata()
9288

93-
nftokenID1, ok := metaMap["nftoken_id"].(string)
94-
if !ok {
89+
if metaMap.NFTokenID == nil {
9590
fmt.Println("❌ nftoken_id not found or not a string")
9691
return
9792
}
9893

99-
fmt.Println("🌎 nftoken_id:", nftokenID1)
94+
fmt.Println("🌎 nftoken_id:", metaMap.NFTokenID.String())
10095
fmt.Println()
10196

10297
// ------
@@ -131,19 +126,14 @@ func main() {
131126
// Step 3: Retrieve the second NFT token ID
132127
fmt.Println("⏳ Retrieving second NFT ID...")
133128

134-
metaMap2, ok := responseMint2.Meta.(map[string]any)
135-
if !ok {
136-
fmt.Println("❌ Meta is not a map[string]any")
137-
return
138-
}
129+
metaMap2 := responseMint2.Meta.AsNFTokenMintMetadata()
139130

140-
nftokenID2, ok := metaMap2["nftoken_id"].(string)
141-
if !ok {
131+
if metaMap2.NFTokenID == nil {
142132
fmt.Println("❌ nftoken_id not found or not a string")
143133
return
144134
}
145135

146-
fmt.Println("🌎 nftoken_id:", nftokenID2)
136+
fmt.Println("🌎 nftoken_id:", metaMap2.NFTokenID.String())
147137
fmt.Println()
148138

149139
// Step 4: Cancel the NFT offers
@@ -155,8 +145,8 @@ func main() {
155145
TransactionType: transaction.NFTokenAcceptOfferTx,
156146
},
157147
NFTokenOffers: []txnTypes.NFTokenID{
158-
txnTypes.NFTokenID(nftokenID1),
159-
txnTypes.NFTokenID(nftokenID2),
148+
txnTypes.NFTokenID(metaMap2.NFTokenID.String()),
149+
txnTypes.NFTokenID(metaMap2.NFTokenID.String()),
160150
},
161151
}
162152

examples/nft/nft-modify/rpc/main.go

Lines changed: 4 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -66,19 +66,14 @@ func main() {
6666
fmt.Println("✅ NFT minted successfully! - 🌎 Hash: ", responseMint.Hash)
6767
fmt.Println()
6868

69-
metaMap, ok := responseMint.Meta.(map[string]any)
70-
if !ok {
71-
fmt.Println("❌ Meta is not a map[string]any")
72-
return
73-
}
69+
metaMap := responseMint.Meta.AsNFTokenMintMetadata()
7470

75-
nftokenID, ok := metaMap["nftoken_id"].(string)
76-
if !ok {
71+
if metaMap.NFTokenID == nil {
7772
fmt.Println("❌ nftoken_id not found or not a string")
7873
return
7974
}
8075

81-
fmt.Println("🌎 nftoken_id:", nftokenID)
76+
fmt.Println("🌎 nftoken_id:", metaMap.NFTokenID.String())
8277
fmt.Println()
8378

8479
// Update NFT
@@ -88,7 +83,7 @@ func main() {
8883
TransactionType: transaction.NFTokenModifyTx,
8984
},
9085
URI: "68747470733A2F2F7961686F6F2E636F6D", // https://yahoo.com
91-
NFTokenID: txnTypes.NFTokenID(nftokenID),
86+
NFTokenID: txnTypes.NFTokenID(metaMap.NFTokenID.String()),
9287
}
9388
// nftoken_id
9489
responseModify, err := client.SubmitTxAndWait(nftModify.Flatten(), &types.SubmitOptions{

0 commit comments

Comments
 (0)