Skip to content

Commit 42c4125

Browse files
committed
feat: helper function to convert Address to PlutusData
Fixes #1103 Signed-off-by: Aurora Gaffney <[email protected]>
1 parent 4a6c664 commit 42c4125

File tree

8 files changed

+144
-17
lines changed

8 files changed

+144
-17
lines changed

go.mod

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ toolchain go1.24.1
77
require (
88
filippo.io/edwards25519 v1.1.0
99
github.com/blinklabs-io/ouroboros-mock v0.3.8
10-
github.com/blinklabs-io/plutigo v0.0.2-0.20250716022656-7418e5ead692
10+
github.com/blinklabs-io/plutigo v0.0.2-0.20250717183329-b331a97fb319
1111
github.com/btcsuite/btcd/btcutil v1.1.6
1212
github.com/fxamacker/cbor/v2 v2.9.0
1313
github.com/jinzhu/copier v0.4.0

go.sum

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3,10 +3,8 @@ filippo.io/edwards25519 v1.1.0/go.mod h1:BxyFTGdWcka3PhytdK4V28tE5sGfRvvvRV7EaN4
33
github.com/aead/siphash v1.0.1/go.mod h1:Nywa3cDsYNNK3gaciGTWPwHt0wlpNV15vwmswBAUSII=
44
github.com/blinklabs-io/ouroboros-mock v0.3.8 h1:+DAt2rx0ouZUxee5DBMgZq3I1+ZdxFSHG9g3tYl/FKU=
55
github.com/blinklabs-io/ouroboros-mock v0.3.8/go.mod h1:UwQIf4KqZwO13P9d90fbi3UL/X7JaJfeEbqk+bEeFQA=
6-
github.com/blinklabs-io/plutigo v0.0.1 h1:IBM3+dm7Sy92zgm9SBvIwVXN/73Jvg/ipDwbgRDeVFo=
7-
github.com/blinklabs-io/plutigo v0.0.1/go.mod h1:N7id3F9kjRcvm/BMxwZsBWUSJTGsUEwVRfFz3Tt5LPM=
8-
github.com/blinklabs-io/plutigo v0.0.2-0.20250716022656-7418e5ead692 h1:irMl0GGNv5heP8LpYBG4Z+a/RYqmmHVESZEa/Ba/67s=
9-
github.com/blinklabs-io/plutigo v0.0.2-0.20250716022656-7418e5ead692/go.mod h1:Bh2zD801zEN90MIFv78HF1d3c/RpG/GD18wQrbdeN+0=
6+
github.com/blinklabs-io/plutigo v0.0.2-0.20250717183329-b331a97fb319 h1:1LDEbQwobPtbaZYJ+imWoDQ0n5aAKKbFQocek2HxXXU=
7+
github.com/blinklabs-io/plutigo v0.0.2-0.20250717183329-b331a97fb319/go.mod h1:Bh2zD801zEN90MIFv78HF1d3c/RpG/GD18wQrbdeN+0=
108
github.com/btcsuite/btcd v0.20.1-beta/go.mod h1:wVuoA8VJLEcwgqHBwHmzLRazpKxTv13Px/pDuV7OomQ=
119
github.com/btcsuite/btcd v0.22.0-beta.0.20220111032746-97732e52810c/go.mod h1:tjmYdS6MLJ5/s0Fj4DbLgSbDHbEqLJrtnHecBFkdz5M=
1210
github.com/btcsuite/btcd v0.23.5-0.20231215221805-96c9fd8078fd/go.mod h1:nm3Bko6zh6bWP60UxwoT5LzdGJsQJaPo6HjduXq9p6A=

ledger/byron/byron.go

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -383,10 +383,8 @@ func (i ByronTransactionInput) ToPlutusData() data.PlutusData {
383383
// This will never actually get called, but it's identical to Shelley
384384
return data.NewConstr(
385385
0,
386-
[]data.PlutusData{
387-
data.NewByteString(i.TxId.Bytes()),
388-
data.NewInteger(big.NewInt(int64(i.OutputIndex))),
389-
},
386+
data.NewByteString(i.TxId.Bytes()),
387+
data.NewInteger(big.NewInt(int64(i.OutputIndex))),
390388
)
391389
}
392390

ledger/common/address.go

Lines changed: 64 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ import (
2121
"strings"
2222

2323
"github.com/blinklabs-io/gouroboros/cbor"
24+
"github.com/blinklabs-io/plutigo/pkg/data"
2425
"github.com/btcsuite/btcd/btcutil/base58"
2526
"github.com/btcsuite/btcd/btcutil/bech32"
2627
"golang.org/x/crypto/sha3"
@@ -285,6 +286,69 @@ func (a *Address) MarshalCBOR() ([]byte, error) {
285286
return cbor.Encode(addrBytes)
286287
}
287288

289+
func (a *Address) ToPlutusData() data.PlutusData {
290+
if a.addressType == AddressTypeByron {
291+
// There is no PlutusData representation for Byron addresses
292+
return nil
293+
}
294+
// Build payment part
295+
var paymentPd data.PlutusData
296+
switch a.addressType {
297+
case AddressTypeKeyKey, AddressTypeKeyScript, AddressTypeKeyPointer, AddressTypeKeyNone:
298+
tmpCred := &Credential{
299+
CredType: CredentialTypeAddrKeyHash,
300+
Credential: NewBlake2b224(a.paymentAddress),
301+
}
302+
paymentPd = data.NewConstr(
303+
0,
304+
tmpCred.ToPlutusData(),
305+
)
306+
case AddressTypeScriptKey, AddressTypeScriptScript, AddressTypeScriptPointer, AddressTypeScriptNone:
307+
tmpCred := &Credential{
308+
CredType: CredentialTypeScriptHash,
309+
Credential: NewBlake2b224(a.paymentAddress),
310+
}
311+
paymentPd = data.NewConstr(
312+
1,
313+
tmpCred.ToPlutusData(),
314+
)
315+
default:
316+
return nil
317+
}
318+
// Build stake part
319+
var stakePd data.PlutusData
320+
switch a.addressType {
321+
case AddressTypeKeyKey, AddressTypeScriptKey, AddressTypeNoneKey:
322+
tmpCred := &Credential{
323+
CredType: CredentialTypeAddrKeyHash,
324+
Credential: NewBlake2b224(a.stakingAddress),
325+
}
326+
stakePd = data.NewConstr(
327+
0,
328+
tmpCred.ToPlutusData(),
329+
)
330+
case AddressTypeKeyScript, AddressTypeScriptScript, AddressTypeNoneScript:
331+
tmpCred := &Credential{
332+
CredType: CredentialTypeScriptHash,
333+
Credential: NewBlake2b224(a.stakingAddress),
334+
}
335+
stakePd = data.NewConstr(
336+
0,
337+
tmpCred.ToPlutusData(),
338+
)
339+
case AddressTypeKeyNone, AddressTypeScriptNone:
340+
stakePd = data.NewConstr(1)
341+
// TODO: add support for pointer addresses once we add it to Address
342+
default:
343+
return nil
344+
}
345+
return data.NewConstr(
346+
0,
347+
paymentPd,
348+
stakePd,
349+
)
350+
}
351+
288352
func (a Address) NetworkId() uint {
289353
if a.addressType == AddressTypeByron {
290354
// Use Shelley network ID convention

ledger/common/address_test.go

Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,9 +15,11 @@
1515
package common
1616

1717
import (
18+
"reflect"
1819
"testing"
1920

2021
"github.com/blinklabs-io/gouroboros/internal/test"
22+
"github.com/blinklabs-io/plutigo/pkg/data"
2123
"github.com/stretchr/testify/assert"
2224
)
2325

@@ -323,3 +325,55 @@ func TestAddressNetworkId(t *testing.T) {
323325
}
324326
}
325327
}
328+
329+
func TestAddressToPlutusData(t *testing.T) {
330+
testDefs := []struct {
331+
address string
332+
expectedData data.PlutusData
333+
}{
334+
// Payment-only address
335+
// This was adapted from the Aiken tests
336+
{
337+
address: "addr_test1vqg3zyg3zyg3zyg3zyg3zyg3zyg3zyg3zyg3zyg3zyg3zygxrcya6",
338+
expectedData: data.NewConstr(
339+
0,
340+
data.NewConstr(
341+
0,
342+
data.NewConstr(
343+
0,
344+
data.NewByteString(
345+
[]byte{
346+
0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11,
347+
},
348+
),
349+
),
350+
),
351+
data.NewConstr(
352+
1,
353+
),
354+
),
355+
},
356+
/*
357+
{
358+
address: "addr1qyln2c2cx5jc4hw768pwz60n5245462dvp4auqcw09rl2xz07huw84puu6cea3qe0ce3apks7hjckqkh5ad4uax0l9ws0q9xty",
359+
},
360+
{
361+
address: "addr1wysmmrpwphe0h6fpxlmcmw46frmzxz89yvpsf8cdv29kcnqsw3vw6",
362+
},
363+
// Script address with script staking key
364+
{
365+
address: "addr1x8nz307k3sr60gu0e47cmajssy4fmld7u493a4xztjrll0aj764lvrxdayh2ux30fl0ktuh27csgmpevdu89jlxppvrswgxsta",
366+
},
367+
*/
368+
}
369+
for _, testDef := range testDefs {
370+
tmpAddr, err := NewAddress(testDef.address)
371+
if err != nil {
372+
t.Fatalf("unexpected error: %s", err)
373+
}
374+
tmpPd := tmpAddr.ToPlutusData()
375+
if !reflect.DeepEqual(tmpPd, testDef.expectedData) {
376+
t.Errorf("did not get expected PlutusData\n got: %#v\n wanted: %#v", tmpPd, testDef.expectedData)
377+
}
378+
}
379+
}

ledger/common/credentials.go

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ import (
1818
"fmt"
1919

2020
"github.com/blinklabs-io/gouroboros/cbor"
21+
"github.com/blinklabs-io/plutigo/pkg/data"
2122
utxorpc "github.com/utxorpc/go-codegen/utxorpc/v1alpha/cardano"
2223
"golang.org/x/crypto/blake2b"
2324
)
@@ -77,3 +78,19 @@ func (c *Credential) Utxorpc() (*utxorpc.StakeCredential, error) {
7778
}
7879
return ret, nil
7980
}
81+
82+
func (c *Credential) ToPlutusData() data.PlutusData {
83+
switch c.CredType {
84+
case CredentialTypeAddrKeyHash:
85+
return data.NewConstr(
86+
0,
87+
data.NewByteString(c.Credential.Bytes()),
88+
)
89+
case CredentialTypeScriptHash:
90+
return data.NewConstr(
91+
1,
92+
data.NewByteString(c.Credential.Bytes()),
93+
)
94+
}
95+
return nil
96+
}

ledger/shelley/shelley.go

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -372,10 +372,8 @@ func (i ShelleyTransactionInput) Utxorpc() (*utxorpc.TxInput, error) {
372372
func (i ShelleyTransactionInput) ToPlutusData() data.PlutusData {
373373
return data.NewConstr(
374374
0,
375-
[]data.PlutusData{
376-
data.NewByteString(i.TxId.Bytes()),
377-
data.NewInteger(big.NewInt(int64(i.OutputIndex))),
378-
},
375+
data.NewByteString(i.TxId.Bytes()),
376+
data.NewInteger(big.NewInt(int64(i.OutputIndex))),
379377
)
380378
}
381379

ledger/shelley/tx_test.go

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -37,10 +37,8 @@ func TestShelleyTransactionInputToPlutusData(t *testing.T) {
3737
}
3838
expectedData := data.NewConstr(
3939
0,
40-
[]data.PlutusData{
41-
data.NewByteString(testTxId),
42-
data.NewInteger(big.NewInt(int64(testTxOutputIdx))),
43-
},
40+
data.NewByteString(testTxId),
41+
data.NewInteger(big.NewInt(int64(testTxOutputIdx))),
4442
)
4543
tmpData := testInput.ToPlutusData()
4644
if !reflect.DeepEqual(tmpData, expectedData) {

0 commit comments

Comments
 (0)