Skip to content

Commit 33ee0d8

Browse files
committed
feat(ledger): Ensured original address string is preserved in output instead of addr.String() and removed the placeholder for assets
Signed-off-by: Akhil Repala <[email protected]>
1 parent be52da6 commit 33ee0d8

File tree

9 files changed

+65
-20
lines changed

9 files changed

+65
-20
lines changed

ledger/alonzo/alonzo.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -450,7 +450,7 @@ func (o AlonzoTransactionOutput) Utxorpc() (*utxorpc.TxOutput, error) {
450450
func (o AlonzoTransactionOutput) String() string {
451451
assets := ""
452452
if o.OutputAmount.Assets != nil && len(o.OutputAmount.Assets.Policies()) > 0 {
453-
assets = " assets=..."
453+
assets = fmt.Sprintf(" assets=%s", o.OutputAmount.Assets.String())
454454
}
455455
return fmt.Sprintf(
456456
"(AlonzoTransactionOutput address=%s amount=%d%s)",

ledger/alonzo/alonzo_test.go

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
package alonzo
1616

1717
import (
18+
"encoding/hex"
1819
"math/big"
1920
"reflect"
2021
"testing"
@@ -279,9 +280,8 @@ func TestAlonzoRedeemersIter(t *testing.T) {
279280
}
280281

281282
func TestAlonzoTransactionOutputString(t *testing.T) {
282-
addr, _ := common.NewAddress(
283-
"addr1qytna5k2fq9ler0fuk45j7zfwv7t2zwhp777nvdjqqfr5tz8ztpwnk8zq5ngetcz5k5mckgkajnygtsra9aej2h3ek5seupmvd",
284-
)
283+
addrStr := "addr1qytna5k2fq9ler0fuk45j7zfwv7t2zwhp777nvdjqqfr5tz8ztpwnk8zq5ngetcz5k5mckgkajnygtsra9aej2h3ek5seupmvd"
284+
addr, _ := common.NewAddress(addrStr)
285285
ma := common.NewMultiAsset[common.MultiAssetTypeOutput](
286286
map[common.Blake2b224]map[cbor.ByteString]uint64{
287287
common.NewBlake2b224(make([]byte, 28)): {cbor.NewByteString([]byte("t")): 2},
@@ -292,7 +292,9 @@ func TestAlonzoTransactionOutputString(t *testing.T) {
292292
OutputAmount: mary.MaryTransactionOutputValue{Amount: 456, Assets: &ma},
293293
}
294294
s := out.String()
295-
expected := "(AlonzoTransactionOutput address=" + addr.String() + " amount=456 assets=...)"
295+
policyStr := common.NewBlake2b224(make([]byte, 28)).String()
296+
assetsStr := "[" + policyStr + "." + hex.EncodeToString([]byte("t")) + "=2]"
297+
expected := "(AlonzoTransactionOutput address=" + addrStr + " amount=456 assets=" + assetsStr + ")"
296298
if s != expected {
297299
t.Fatalf("unexpected string: %s", s)
298300
}

ledger/babbage/babbage.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -652,7 +652,7 @@ func (o BabbageTransactionOutput) Utxorpc() (*utxorpc.TxOutput, error) {
652652
func (o BabbageTransactionOutput) String() string {
653653
assets := ""
654654
if o.OutputAmount.Assets != nil && len(o.OutputAmount.Assets.Policies()) > 0 {
655-
assets = " assets=..."
655+
assets = fmt.Sprintf(" assets=%s", o.OutputAmount.Assets.String())
656656
}
657657
return fmt.Sprintf(
658658
"(BabbageTransactionOutput address=%s amount=%d%s)",

ledger/babbage/babbage_test.go

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2972,9 +2972,8 @@ func TestBabbageTransactionOutputToPlutusDataCoinAssets(t *testing.T) {
29722972
}
29732973

29742974
func TestBabbageTransactionOutputString(t *testing.T) {
2975-
addr, _ := common.NewAddress(
2976-
"addr1qytna5k2fq9ler0fuk45j7zfwv7t2zwhp777nvdjqqfr5tz8ztpwnk8zq5ngetcz5k5mckgkajnygtsra9aej2h3ek5seupmvd",
2977-
)
2975+
addrStr := "addr1qytna5k2fq9ler0fuk45j7zfwv7t2zwhp777nvdjqqfr5tz8ztpwnk8zq5ngetcz5k5mckgkajnygtsra9aej2h3ek5seupmvd"
2976+
addr, _ := common.NewAddress(addrStr)
29782977
ma := common.NewMultiAsset[common.MultiAssetTypeOutput](
29792978
map[common.Blake2b224]map[cbor.ByteString]uint64{
29802979
common.NewBlake2b224(make([]byte, 28)): {cbor.NewByteString([]byte("x")): 2},
@@ -2985,7 +2984,7 @@ func TestBabbageTransactionOutputString(t *testing.T) {
29852984
OutputAmount: mary.MaryTransactionOutputValue{Amount: 456, Assets: &ma},
29862985
}
29872986
s := out.String()
2988-
expected := "(BabbageTransactionOutput address=" + addr.String() + " amount=456 assets=...)"
2987+
expected := "(BabbageTransactionOutput address=" + addrStr + " amount=456 assets=" + ma.String() + ")"
29892988
if s != expected {
29902989
t.Fatalf("unexpected string: %s", s)
29912990
}

ledger/byron/byron_test.go

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -114,12 +114,13 @@ func TestByronTransactionOutputString(t *testing.T) {
114114
if err != nil {
115115
t.Fatalf("address: %v", err)
116116
}
117+
addrStr := addr.String()
117118
out := byron.ByronTransactionOutput{
118119
OutputAddress: addr,
119120
OutputAmount: 456,
120121
}
121122
s := out.String()
122-
expected := "(ByronTransactionOutput address=" + addr.String() + " amount=456)"
123+
expected := "(ByronTransactionOutput address=" + addrStr + " amount=456)"
123124
if s != expected {
124125
t.Fatalf("unexpected string: %s", s)
125126
}

ledger/common/common.go

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ import (
2222
"maps"
2323
"math/big"
2424
"slices"
25+
"strings"
2526

2627
"github.com/blinklabs-io/gouroboros/cbor"
2728
"github.com/blinklabs-io/plutigo/data"
@@ -325,6 +326,44 @@ func (m *MultiAsset[T]) normalize() map[Blake2b224]map[cbor.ByteString]T {
325326
return ret
326327
}
327328

329+
// String returns a stable, human-friendly representation of the MultiAsset.
330+
// Output format: [<policyId>.<assetNameHex>=<amount>, ...] sorted by policyId, then asset name
331+
func (m *MultiAsset[T]) String() string {
332+
if m == nil {
333+
return "[]"
334+
}
335+
norm := m.normalize()
336+
if len(norm) == 0 {
337+
return "[]"
338+
}
339+
340+
policies := slices.Collect(maps.Keys(norm))
341+
slices.SortFunc(policies, func(a, b Blake2b224) int { return bytes.Compare(a.Bytes(), b.Bytes()) })
342+
343+
var b strings.Builder
344+
b.WriteByte('[')
345+
first := true
346+
for _, pid := range policies {
347+
assets := norm[pid]
348+
names := slices.Collect(maps.Keys(assets))
349+
slices.SortFunc(names, func(a, b cbor.ByteString) int { return bytes.Compare(a.Bytes(), b.Bytes()) })
350+
351+
for _, name := range names {
352+
if !first {
353+
b.WriteString(", ")
354+
}
355+
first = false
356+
b.WriteString(pid.String())
357+
b.WriteByte('.')
358+
b.WriteString(hex.EncodeToString(name.Bytes()))
359+
b.WriteByte('=')
360+
fmt.Fprintf(&b, "%d", assets[name])
361+
}
362+
}
363+
b.WriteByte(']')
364+
return b.String()
365+
}
366+
328367
type AssetFingerprint struct {
329368
policyId []byte
330369
assetName []byte

ledger/mary/mary.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -493,7 +493,7 @@ func (o MaryTransactionOutput) Utxorpc() (*utxorpc.TxOutput, error) {
493493
func (o MaryTransactionOutput) String() string {
494494
assets := ""
495495
if o.OutputAmount.Assets != nil && len(o.OutputAmount.Assets.Policies()) > 0 {
496-
assets = " assets=..."
496+
assets = fmt.Sprintf(" assets=%s", o.OutputAmount.Assets.String())
497497
}
498498
return fmt.Sprintf(
499499
"(MaryTransactionOutput address=%s amount=%d%s)",

ledger/mary/mary_test.go

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -118,7 +118,8 @@ func TestMaryTransactionOutputValueEncodeDecode(t *testing.T) {
118118
}
119119

120120
func TestMaryTransactionOutputString(t *testing.T) {
121-
addr, _ := common.NewAddress("addr1qytna5k2fq9ler0fuk45j7zfwv7t2zwhp777nvdjqqfr5tz8ztpwnk8zq5ngetcz5k5mckgkajnygtsra9aej2h3ek5seupmvd")
121+
addrStr := "addr1qytna5k2fq9ler0fuk45j7zfwv7t2zwhp777nvdjqqfr5tz8ztpwnk8zq5ngetcz5k5mckgkajnygtsra9aej2h3ek5seupmvd"
122+
addr, _ := common.NewAddress(addrStr)
122123
ma := common.NewMultiAsset[common.MultiAssetTypeOutput](
123124
map[common.Blake2b224]map[cbor.ByteString]uint64{
124125
common.NewBlake2b224(make([]byte, 28)): {cbor.NewByteString([]byte("token")): 2},
@@ -129,20 +130,21 @@ func TestMaryTransactionOutputString(t *testing.T) {
129130
OutputAmount: MaryTransactionOutputValue{Amount: 456, Assets: &ma},
130131
}
131132
s := out.String()
132-
expected := fmt.Sprintf("(MaryTransactionOutput address=%s amount=456 assets=...)", addr.String())
133+
expected := fmt.Sprintf("(MaryTransactionOutput address=%s amount=456 assets=%s)", addrStr, ma.String())
133134
if s != expected {
134135
t.Fatalf("unexpected string: %s", s)
135136
}
136137
}
137138

138139
func TestMaryOutputTooBigErrorFormatting(t *testing.T) {
139-
addr, _ := common.NewAddress("addr1qytna5k2fq9ler0fuk45j7zfwv7t2zwhp777nvdjqqfr5tz8ztpwnk8zq5ngetcz5k5mckgkajnygtsra9aej2h3ek5seupmvd")
140+
addrStr := "addr1qytna5k2fq9ler0fuk45j7zfwv7t2zwhp777nvdjqqfr5tz8ztpwnk8zq5ngetcz5k5mckgkajnygtsra9aej2h3ek5seupmvd"
141+
addr, _ := common.NewAddress(addrStr)
140142
out := &MaryTransactionOutput{
141143
OutputAddress: addr,
142144
OutputAmount: MaryTransactionOutputValue{Amount: 456},
143145
}
144146
errStr := OutputTooBigUtxoError{Outputs: []common.TransactionOutput{out}}.Error()
145-
expected := fmt.Sprintf("output value too large: (MaryTransactionOutput address=%s amount=456)", addr.String())
147+
expected := fmt.Sprintf("output value too large: (MaryTransactionOutput address=%s amount=456)", addrStr)
146148
if errStr != expected {
147149
t.Fatalf("unexpected error: %s", errStr)
148150
}

ledger/shelley/shelley_test.go

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -9,26 +9,28 @@ import (
99
)
1010

1111
func TestShelleyTransactionOutputString(t *testing.T) {
12-
addr, _ := common.NewAddress("addr1qytna5k2fq9ler0fuk45j7zfwv7t2zwhp777nvdjqqfr5tz8ztpwnk8zq5ngetcz5k5mckgkajnygtsra9aej2h3ek5seupmvd")
12+
addrStr := "addr1qytna5k2fq9ler0fuk45j7zfwv7t2zwhp777nvdjqqfr5tz8ztpwnk8zq5ngetcz5k5mckgkajnygtsra9aej2h3ek5seupmvd"
13+
addr, _ := common.NewAddress(addrStr)
1314
out := shelley.ShelleyTransactionOutput{
1415
OutputAddress: addr,
1516
OutputAmount: 456,
1617
}
1718
s := out.String()
18-
expected := fmt.Sprintf("(ShelleyTransactionOutput address=%s amount=456)", addr.String())
19+
expected := fmt.Sprintf("(ShelleyTransactionOutput address=%s amount=456)", addrStr)
1920
if s != expected {
2021
t.Fatalf("unexpected string: %s", s)
2122
}
2223
}
2324

2425
func TestShelleyOutputTooSmallErrorFormatting(t *testing.T) {
25-
addr, _ := common.NewAddress("addr1qytna5k2fq9ler0fuk45j7zfwv7t2zwhp777nvdjqqfr5tz8ztpwnk8zq5ngetcz5k5mckgkajnygtsra9aej2h3ek5seupmvd")
26+
addrStr := "addr1qytna5k2fq9ler0fuk45j7zfwv7t2zwhp777nvdjqqfr5tz8ztpwnk8zq5ngetcz5k5mckgkajnygtsra9aej2h3ek5seupmvd"
27+
addr, _ := common.NewAddress(addrStr)
2628
out := &shelley.ShelleyTransactionOutput{
2729
OutputAddress: addr,
2830
OutputAmount: 456,
2931
}
3032
errStr := shelley.OutputTooSmallUtxoError{Outputs: []common.TransactionOutput{out}}.Error()
31-
expected := fmt.Sprintf("output too small: (ShelleyTransactionOutput address=%s amount=456)", addr.String())
33+
expected := fmt.Sprintf("output too small: (ShelleyTransactionOutput address=%s amount=456)", addrStr)
3234
if errStr != expected {
3335
t.Fatalf("unexpected error: %s", errStr)
3436
}

0 commit comments

Comments
 (0)