Skip to content

Commit b450b5c

Browse files
authored
feat: add Utxorpc support for cardano.PParams in other eras (#769)
Signed-off-by: Ales Verbic <[email protected]>
1 parent 98ac789 commit b450b5c

File tree

10 files changed

+552
-7
lines changed

10 files changed

+552
-7
lines changed

ledger/allegra/pparams.go

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,5 @@ func (u *AllegraProtocolParameterUpdate) UnmarshalCBOR(data []byte) error {
4040
}
4141

4242
func (p *AllegraProtocolParameters) Utxorpc() *cardano.PParams {
43-
// TODO: Implement the conversion logic to cardano.PParams
44-
return &cardano.PParams{}
43+
return p.ShelleyProtocolParameters.Utxorpc()
4544
}

ledger/allegra/pparams_test.go

Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ import (
2323
"github.com/blinklabs-io/gouroboros/cbor"
2424
"github.com/blinklabs-io/gouroboros/ledger/allegra"
2525
"github.com/blinklabs-io/gouroboros/ledger/shelley"
26+
"github.com/utxorpc/go-codegen/utxorpc/v1alpha/cardano"
2627
)
2728

2829
func TestAllegraProtocolParamsUpdate(t *testing.T) {
@@ -78,3 +79,59 @@ func TestAllegraProtocolParamsUpdate(t *testing.T) {
7879
}
7980
}
8081
}
82+
83+
func TestAllegraUtxorpc(t *testing.T) {
84+
inputParams := allegra.AllegraProtocolParameters{
85+
ShelleyProtocolParameters: shelley.ShelleyProtocolParameters{
86+
MinFeeA: 500,
87+
MinFeeB: 2,
88+
MaxBlockBodySize: 65536,
89+
MaxTxSize: 16384,
90+
MaxBlockHeaderSize: 1024,
91+
KeyDeposit: 2000,
92+
PoolDeposit: 500000,
93+
MaxEpoch: 2160,
94+
NOpt: 100,
95+
A0: &cbor.Rat{Rat: big.NewRat(1, 2)},
96+
Rho: &cbor.Rat{Rat: big.NewRat(3, 4)},
97+
Tau: &cbor.Rat{Rat: big.NewRat(5, 6)},
98+
ProtocolMajor: 8,
99+
ProtocolMinor: 0,
100+
MinUtxoValue: 1000000,
101+
},
102+
}
103+
104+
expectedUtxorpc := &cardano.PParams{
105+
MinFeeCoefficient: 500,
106+
MinFeeConstant: 2,
107+
MaxBlockBodySize: 65536,
108+
MaxTxSize: 16384,
109+
MaxBlockHeaderSize: 1024,
110+
StakeKeyDeposit: 2000,
111+
PoolDeposit: 500000,
112+
PoolRetirementEpochBound: 2160,
113+
DesiredNumberOfPools: 100,
114+
PoolInfluence: &cardano.RationalNumber{
115+
Numerator: int32(1),
116+
Denominator: uint32(2),
117+
},
118+
MonetaryExpansion: &cardano.RationalNumber{
119+
Numerator: int32(3),
120+
Denominator: uint32(4),
121+
},
122+
TreasuryExpansion: &cardano.RationalNumber{
123+
Numerator: int32(5),
124+
Denominator: uint32(6),
125+
},
126+
ProtocolVersion: &cardano.ProtocolVersion{
127+
Major: 8,
128+
Minor: 0,
129+
},
130+
}
131+
132+
result := inputParams.Utxorpc()
133+
134+
if !reflect.DeepEqual(result, expectedUtxorpc) {
135+
t.Fatalf("Utxorpc() test failed for Allegra:\nExpected: %#v\nGot: %#v", expectedUtxorpc, result)
136+
}
137+
}

ledger/alonzo/pparams.go

Lines changed: 51 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -113,6 +113,55 @@ func (u *AlonzoProtocolParameterUpdate) UnmarshalCBOR(data []byte) error {
113113
}
114114

115115
func (p *AlonzoProtocolParameters) Utxorpc() *cardano.PParams {
116-
// TODO: Implement the conversion logic to cardano.PParams
117-
return &cardano.PParams{}
116+
return &cardano.PParams{
117+
CoinsPerUtxoByte: p.AdaPerUtxoByte,
118+
MaxTxSize: uint64(p.MaxTxSize),
119+
MinFeeCoefficient: uint64(p.MinFeeA),
120+
MinFeeConstant: uint64(p.MinFeeB),
121+
MaxBlockBodySize: uint64(p.MaxBlockBodySize),
122+
MaxBlockHeaderSize: uint64(p.MaxBlockHeaderSize),
123+
StakeKeyDeposit: uint64(p.KeyDeposit),
124+
PoolDeposit: uint64(p.PoolDeposit),
125+
PoolRetirementEpochBound: uint64(p.MaxEpoch),
126+
DesiredNumberOfPools: uint64(p.NOpt),
127+
PoolInfluence: &cardano.RationalNumber{
128+
Numerator: int32(p.A0.Num().Int64()),
129+
Denominator: uint32(p.A0.Denom().Int64()),
130+
},
131+
MonetaryExpansion: &cardano.RationalNumber{
132+
Numerator: int32(p.Rho.Num().Int64()),
133+
Denominator: uint32(p.Rho.Denom().Int64()),
134+
},
135+
TreasuryExpansion: &cardano.RationalNumber{
136+
Numerator: int32(p.Tau.Num().Int64()),
137+
Denominator: uint32(p.Tau.Denom().Int64()),
138+
},
139+
MinPoolCost: p.MinPoolCost,
140+
ProtocolVersion: &cardano.ProtocolVersion{
141+
Major: uint32(p.ProtocolMajor),
142+
Minor: uint32(p.ProtocolMinor),
143+
},
144+
MaxValueSize: uint64(p.MaxValueSize),
145+
CollateralPercentage: uint64(p.CollateralPercentage),
146+
MaxCollateralInputs: uint64(p.MaxCollateralInputs),
147+
CostModels: common.ConvertToUtxorpcCardanoCostModels(p.CostModels),
148+
Prices: &cardano.ExPrices{
149+
Memory: &cardano.RationalNumber{
150+
Numerator: int32(p.ExecutionCosts.MemPrice.Num().Int64()),
151+
Denominator: uint32(p.ExecutionCosts.MemPrice.Denom().Int64()),
152+
},
153+
Steps: &cardano.RationalNumber{
154+
Numerator: int32(p.ExecutionCosts.StepPrice.Num().Int64()),
155+
Denominator: uint32(p.ExecutionCosts.StepPrice.Denom().Int64()),
156+
},
157+
},
158+
MaxExecutionUnitsPerTransaction: &cardano.ExUnits{
159+
Memory: uint64(p.MaxTxExUnits.Mem),
160+
Steps: uint64(p.MaxTxExUnits.Steps),
161+
},
162+
MaxExecutionUnitsPerBlock: &cardano.ExUnits{
163+
Memory: uint64(p.MaxBlockExUnits.Mem),
164+
Steps: uint64(p.MaxBlockExUnits.Steps),
165+
},
166+
}
118167
}

ledger/alonzo/pparams_test.go

Lines changed: 116 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@ import (
2727
"github.com/blinklabs-io/gouroboros/ledger/common"
2828
"github.com/blinklabs-io/gouroboros/ledger/mary"
2929
"github.com/blinklabs-io/gouroboros/ledger/shelley"
30+
"github.com/utxorpc/go-codegen/utxorpc/v1alpha/cardano"
3031
)
3132

3233
func TestAlonzoProtocolParamsUpdate(t *testing.T) {
@@ -181,3 +182,118 @@ func TestAlonzoProtocolParamsUpdateFromGenesis(t *testing.T) {
181182
}
182183
}
183184
}
185+
186+
func TestAlonzoUtxorpc(t *testing.T) {
187+
inputParams := alonzo.AlonzoProtocolParameters{
188+
MaryProtocolParameters: mary.MaryProtocolParameters{
189+
AllegraProtocolParameters: allegra.AllegraProtocolParameters{
190+
ShelleyProtocolParameters: shelley.ShelleyProtocolParameters{
191+
MaxTxSize: 16384,
192+
MinFeeA: 500,
193+
MinFeeB: 2,
194+
MaxBlockBodySize: 65536,
195+
MaxBlockHeaderSize: 1024,
196+
KeyDeposit: 2000,
197+
PoolDeposit: 500000,
198+
MaxEpoch: 2160,
199+
NOpt: 100,
200+
A0: &cbor.Rat{Rat: big.NewRat(1, 2)},
201+
Rho: &cbor.Rat{Rat: big.NewRat(3, 4)},
202+
Tau: &cbor.Rat{Rat: big.NewRat(5, 6)},
203+
ProtocolMajor: 8,
204+
ProtocolMinor: 0,
205+
},
206+
},
207+
},
208+
AdaPerUtxoByte: 44,
209+
MinPoolCost: 340000000,
210+
MaxValueSize: 1024,
211+
CollateralPercentage: 150,
212+
MaxCollateralInputs: 5,
213+
ExecutionCosts: common.ExUnitPrice{
214+
MemPrice: &cbor.Rat{Rat: big.NewRat(1, 2)},
215+
StepPrice: &cbor.Rat{Rat: big.NewRat(2, 3)},
216+
},
217+
MaxTxExUnits: common.ExUnit{
218+
Mem: 1000000,
219+
Steps: 200000,
220+
},
221+
MaxBlockExUnits: common.ExUnit{
222+
Mem: 5000000,
223+
Steps: 1000000,
224+
},
225+
CostModels: map[uint][]int64{
226+
1: {100, 200, 300},
227+
2: {400, 500, 600},
228+
3: {700, 800, 900},
229+
},
230+
}
231+
232+
expectedUtxorpc := &cardano.PParams{
233+
CoinsPerUtxoByte: 44,
234+
MaxTxSize: 16384,
235+
MinFeeCoefficient: 500,
236+
MinFeeConstant: 2,
237+
MaxBlockBodySize: 65536,
238+
MaxBlockHeaderSize: 1024,
239+
StakeKeyDeposit: 2000,
240+
PoolDeposit: 500000,
241+
PoolRetirementEpochBound: 2160,
242+
DesiredNumberOfPools: 100,
243+
PoolInfluence: &cardano.RationalNumber{
244+
Numerator: int32(1),
245+
Denominator: uint32(2),
246+
},
247+
MonetaryExpansion: &cardano.RationalNumber{
248+
Numerator: int32(3),
249+
Denominator: uint32(4),
250+
},
251+
TreasuryExpansion: &cardano.RationalNumber{
252+
Numerator: int32(5),
253+
Denominator: uint32(6),
254+
},
255+
MinPoolCost: 340000000,
256+
ProtocolVersion: &cardano.ProtocolVersion{
257+
Major: 8,
258+
Minor: 0,
259+
},
260+
MaxValueSize: 1024,
261+
CollateralPercentage: 150,
262+
MaxCollateralInputs: 5,
263+
CostModels: &cardano.CostModels{
264+
PlutusV1: &cardano.CostModel{
265+
Values: []int64{100, 200, 300},
266+
},
267+
PlutusV2: &cardano.CostModel{
268+
Values: []int64{400, 500, 600},
269+
},
270+
PlutusV3: &cardano.CostModel{
271+
Values: []int64{700, 800, 900},
272+
},
273+
},
274+
Prices: &cardano.ExPrices{
275+
Memory: &cardano.RationalNumber{
276+
Numerator: int32(1),
277+
Denominator: uint32(2),
278+
},
279+
Steps: &cardano.RationalNumber{
280+
Numerator: int32(2),
281+
Denominator: uint32(3),
282+
},
283+
},
284+
MaxExecutionUnitsPerTransaction: &cardano.ExUnits{
285+
Memory: 1000000,
286+
Steps: 200000,
287+
},
288+
MaxExecutionUnitsPerBlock: &cardano.ExUnits{
289+
Memory: 5000000,
290+
Steps: 1000000,
291+
},
292+
}
293+
294+
result := inputParams.Utxorpc()
295+
296+
if !reflect.DeepEqual(result, expectedUtxorpc) {
297+
t.Fatalf("Utxorpc() test failed for Alonzo:\nExpected: %#v\nGot: %#v", expectedUtxorpc, result)
298+
}
299+
}

ledger/babbage/pparams.go

Lines changed: 53 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -153,6 +153,57 @@ func (u *BabbageProtocolParameterUpdate) UnmarshalCBOR(data []byte) error {
153153
}
154154

155155
func (p *BabbageProtocolParameters) Utxorpc() *cardano.PParams {
156-
// TODO: Implement the conversion logic to cardano.PParams
157-
return &cardano.PParams{}
156+
return &cardano.PParams{
157+
CoinsPerUtxoByte: p.AdaPerUtxoByte,
158+
MaxTxSize: uint64(p.MaxTxSize),
159+
MinFeeCoefficient: uint64(p.MinFeeA),
160+
MinFeeConstant: uint64(p.MinFeeB),
161+
MaxBlockBodySize: uint64(p.MaxBlockBodySize),
162+
MaxBlockHeaderSize: uint64(p.MaxBlockHeaderSize),
163+
StakeKeyDeposit: uint64(p.KeyDeposit),
164+
PoolDeposit: uint64(p.PoolDeposit),
165+
PoolRetirementEpochBound: uint64(p.MaxEpoch),
166+
DesiredNumberOfPools: uint64(p.NOpt),
167+
PoolInfluence: &cardano.RationalNumber{
168+
Numerator: int32(p.A0.Num().Int64()),
169+
Denominator: uint32(p.A0.Denom().Int64()),
170+
},
171+
MonetaryExpansion: &cardano.RationalNumber{
172+
Numerator: int32(p.Rho.Num().Int64()),
173+
Denominator: uint32(p.Rho.Denom().Int64()),
174+
},
175+
TreasuryExpansion: &cardano.RationalNumber{
176+
Numerator: int32(p.Tau.Num().Int64()),
177+
Denominator: uint32(p.Tau.Denom().Int64()),
178+
},
179+
MinPoolCost: p.MinPoolCost,
180+
ProtocolVersion: &cardano.ProtocolVersion{
181+
Major: uint32(p.ProtocolMajor),
182+
Minor: uint32(p.ProtocolMinor),
183+
},
184+
MaxValueSize: uint64(p.MaxValueSize),
185+
CollateralPercentage: uint64(p.CollateralPercentage),
186+
MaxCollateralInputs: uint64(p.MaxCollateralInputs),
187+
CostModels: common.ConvertToUtxorpcCardanoCostModels(
188+
p.CostModels,
189+
),
190+
Prices: &cardano.ExPrices{
191+
Memory: &cardano.RationalNumber{
192+
Numerator: int32(p.ExecutionCosts.MemPrice.Num().Int64()),
193+
Denominator: uint32(p.ExecutionCosts.MemPrice.Denom().Int64()),
194+
},
195+
Steps: &cardano.RationalNumber{
196+
Numerator: int32(p.ExecutionCosts.StepPrice.Num().Int64()),
197+
Denominator: uint32(p.ExecutionCosts.StepPrice.Denom().Int64()),
198+
},
199+
},
200+
MaxExecutionUnitsPerTransaction: &cardano.ExUnits{
201+
Memory: uint64(p.MaxTxExUnits.Mem),
202+
Steps: uint64(p.MaxTxExUnits.Steps),
203+
},
204+
MaxExecutionUnitsPerBlock: &cardano.ExUnits{
205+
Memory: uint64(p.MaxBlockExUnits.Mem),
206+
Steps: uint64(p.MaxBlockExUnits.Steps),
207+
},
208+
}
158209
}

0 commit comments

Comments
 (0)