@@ -213,6 +213,7 @@ type Address struct {
213213 networkId uint8
214214 paymentAddress []byte
215215 stakingAddress []byte
216+ extraData []byte
216217}
217218
218219// NewAddress returns an Address based on the provided bech32 address string
@@ -236,16 +237,32 @@ func NewAddressFromParts(
236237 networkId uint8 ,
237238 paymentAddr []byte ,
238239 stakingAddr []byte ,
239- ) Address {
240+ ) (Address , error ) {
241+ if len (paymentAddr ) != AddressHashSize {
242+ return Address {}, fmt .Errorf ("invalid payment address hash length: %d" , len (paymentAddr ))
243+ }
244+ if len (stakingAddr ) > 0 && len (stakingAddr ) != AddressHashSize {
245+ return Address {}, fmt .Errorf ("invalid staking address hash length: %d" , len (stakingAddr ))
246+ }
240247 return Address {
241248 addressType : addrType ,
242249 networkId : networkId ,
243- paymentAddress : paymentAddr ,
244- stakingAddress : stakingAddr ,
245- }
250+ paymentAddress : paymentAddr [:] ,
251+ stakingAddress : stakingAddr [:] ,
252+ }, nil
246253}
247254
248- func (a * Address ) populateFromBytes (data []byte ) {
255+ func (a * Address ) populateFromBytes (data []byte ) error {
256+ // Check length
257+ dataLen := len (data )
258+ if dataLen < (AddressHashSize + 1 ) {
259+ return fmt .Errorf ("invalid address length: %d" , dataLen )
260+ }
261+ if dataLen > (AddressHashSize + 1 ) {
262+ if dataLen < (AddressHashSize + AddressHashSize + 1 ) {
263+ return fmt .Errorf ("invalid address length: %d" , dataLen )
264+ }
265+ }
249266 // Extract header info
250267 header := data [0 ]
251268 a .addressType = (header & AddressHeaderTypeMask ) >> 4
@@ -254,13 +271,22 @@ func (a *Address) populateFromBytes(data []byte) {
254271 // NOTE: this is probably incorrect for Byron
255272 payload := data [1 :]
256273 a .paymentAddress = payload [:AddressHashSize ]
257- a .stakingAddress = payload [AddressHashSize :]
274+ if len (payload ) > AddressHashSize {
275+ a .stakingAddress = payload [AddressHashSize : AddressHashSize + AddressHashSize ]
276+ }
277+ // Store any extra address data
278+ // This is needed to handle the case describe in:
279+ // https://github.com/IntersectMBO/cardano-ledger/issues/2729
280+ if len (payload ) > (AddressHashSize + AddressHashSize ) {
281+ a .extraData = payload [AddressHashSize + AddressHashSize :]
282+ }
258283 // Adjust stake addresses
259284 if a .addressType == AddressTypeNoneKey ||
260285 a .addressType == AddressTypeNoneScript {
261286 a .stakingAddress = a .paymentAddress [:]
262287 a .paymentAddress = make ([]byte , 0 )
263288 }
289+ return nil
264290}
265291
266292func (a * Address ) UnmarshalCBOR (data []byte ) error {
@@ -344,6 +370,7 @@ func (a Address) Bytes() []byte {
344370 )
345371 ret = append (ret , a .paymentAddress ... )
346372 ret = append (ret , a .stakingAddress ... )
373+ ret = append (ret , a .extraData ... )
347374 return ret
348375}
349376
0 commit comments