Skip to content

Commit 1b29581

Browse files
committed
feat: extract payment portion from address
1 parent 8f2eb43 commit 1b29581

File tree

2 files changed

+66
-3
lines changed

2 files changed

+66
-3
lines changed

ledger/common.go

Lines changed: 32 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -271,14 +271,43 @@ func (a *Address) MarshalCBOR() ([]byte, error) {
271271
return cbor.Encode(a.Bytes())
272272
}
273273

274+
// PaymentAddress returns a new Address with only the payment address portion. This will return nil for anything other than payment and script addresses
275+
func (a Address) PaymentAddress() *Address {
276+
var addrType uint8
277+
if a.addressType == AddressTypeKeyKey ||
278+
a.addressType == AddressTypeKeyNone {
279+
addrType = AddressTypeKeyNone
280+
} else if a.addressType == AddressTypeScriptKey ||
281+
a.addressType == AddressTypeScriptNone ||
282+
a.addressType == AddressTypeScriptScript {
283+
addrType = AddressTypeScriptNone
284+
} else {
285+
// Unsupported address type
286+
return nil
287+
}
288+
newAddr := &Address{
289+
addressType: addrType,
290+
networkId: a.networkId,
291+
paymentAddress: a.paymentAddress[:],
292+
}
293+
return newAddr
294+
}
295+
274296
// StakeAddress returns a new Address with only the stake key portion. This will return nil if the address is not a payment/staking key pair
275297
func (a Address) StakeAddress() *Address {
276-
if a.addressType != AddressTypeKeyKey &&
277-
a.addressType != AddressTypeScriptKey {
298+
var addrType uint8
299+
if a.addressType == AddressTypeKeyKey ||
300+
a.addressType == AddressTypeScriptKey {
301+
addrType = AddressTypeNoneKey
302+
} else if a.addressType == AddressTypeScriptScript ||
303+
a.addressType == AddressTypeNoneScript {
304+
addrType = AddressTypeNoneScript
305+
} else {
306+
// Unsupported address type
278307
return nil
279308
}
280309
newAddr := &Address{
281-
addressType: AddressTypeNoneKey,
310+
addressType: addrType,
282311
networkId: a.networkId,
283312
stakingAddress: a.stakingAddress[:],
284313
}

ledger/common_test.go

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -213,6 +213,40 @@ func TestAddressFromParts(t *testing.T) {
213213
}
214214
}
215215

216+
func TestAddressPaymentAddress(t *testing.T) {
217+
testDefs := []struct {
218+
address string
219+
expectedPaymentAddress string
220+
}{
221+
{
222+
address: "addr_test1qqawz5hm2tchtmarkfn2tamzvd2spatl89gtutgra6zwc3ktqj7p944ckc9lq7u36jrq99znwhzlq6jfv2j4ql92m4rq07hp8t",
223+
expectedPaymentAddress: "addr_test1vqawz5hm2tchtmarkfn2tamzvd2spatl89gtutgra6zwc3s5t5a7q",
224+
},
225+
{
226+
address: "addr_test1vpmwd5tk8quxnzxq46h8vztf00xtphrd7zd0al5ur5jsylg3r9v4l",
227+
expectedPaymentAddress: "addr_test1vpmwd5tk8quxnzxq46h8vztf00xtphrd7zd0al5ur5jsylg3r9v4l",
228+
},
229+
// Script address with script staking key
230+
{
231+
address: "addr1x8nz307k3sr60gu0e47cmajssy4fmld7u493a4xztjrll0aj764lvrxdayh2ux30fl0ktuh27csgmpevdu89jlxppvrswgxsta",
232+
expectedPaymentAddress: "addr1w8nz307k3sr60gu0e47cmajssy4fmld7u493a4xztjrll0cm9703s",
233+
},
234+
}
235+
for _, testDef := range testDefs {
236+
addr, err := NewAddress(testDef.address)
237+
if err != nil {
238+
t.Fatalf("failed to decode address: %s", err)
239+
}
240+
if addr.PaymentAddress().String() != testDef.expectedPaymentAddress {
241+
t.Fatalf(
242+
"payment address did not match expected value, got: %s, wanted: %s",
243+
addr.PaymentAddress().String(),
244+
testDef.expectedPaymentAddress,
245+
)
246+
}
247+
}
248+
}
249+
216250
func TestAddressStakeAddress(t *testing.T) {
217251
testDefs := []struct {
218252
address string

0 commit comments

Comments
 (0)