Skip to content

Commit 7ba8802

Browse files
committed
feat: support for proposing in script context
* un-embed ConwayProtocolParameterUpdate * fix PlutusData encodings for various gov types * create Conway-specific version of pparam update gov action * PlutusData encoding for Conway pparam update * port script_context_propose_* tests from Aiken Signed-off-by: Aurora Gaffney <[email protected]>
1 parent 9be8367 commit 7ba8802

File tree

8 files changed

+491
-121
lines changed

8 files changed

+491
-121
lines changed

ledger/common/gov.go

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

1717
import (
18-
"fmt"
1918
"math/big"
2019

2120
"github.com/blinklabs-io/gouroboros/cbor"
@@ -129,21 +128,18 @@ func (id *GovActionId) ToPlutusData() data.PlutusData {
129128
)
130129
}
131130

132-
type ProposalProcedure struct {
133-
cbor.StructAsArray
134-
Deposit uint64
135-
RewardAccount Address
136-
GovAction GovActionWrapper
137-
Anchor GovAnchor
131+
type ProposalProcedure interface {
132+
isProposalProcedure()
133+
ToPlutusData() data.PlutusData
134+
Deposit() uint64
135+
RewardAccount() Address
136+
GovAction() GovAction
137+
Anchor() GovAnchor
138138
}
139139

140-
func (p *ProposalProcedure) ToPlutusData() data.PlutusData {
141-
return data.NewConstr(0,
142-
data.NewInteger(new(big.Int).SetUint64(p.Deposit)),
143-
p.RewardAccount.ToPlutusData(),
144-
p.GovAction.ToPlutusData(),
145-
)
146-
}
140+
type ProposalProcedureBase struct{}
141+
142+
func (ProposalProcedureBase) isProposalProcedure() {}
147143

148144
const (
149145
GovActionTypeParameterChange = 0
@@ -155,76 +151,14 @@ const (
155151
GovActionTypeInfo = 6
156152
)
157153

158-
type GovActionWrapper struct {
159-
Type uint
160-
Action GovAction
161-
}
162-
163-
func (g *GovActionWrapper) ToPlutusData() data.PlutusData {
164-
return g.Action.ToPlutusData()
165-
}
166-
167-
func (g *GovActionWrapper) UnmarshalCBOR(data []byte) error {
168-
// Determine action type
169-
actionType, err := cbor.DecodeIdFromList(data)
170-
if err != nil {
171-
return err
172-
}
173-
var tmpAction GovAction
174-
switch actionType {
175-
case GovActionTypeParameterChange:
176-
tmpAction = &ParameterChangeGovAction{}
177-
case GovActionTypeHardForkInitiation:
178-
tmpAction = &HardForkInitiationGovAction{}
179-
case GovActionTypeTreasuryWithdrawal:
180-
tmpAction = &TreasuryWithdrawalGovAction{}
181-
case GovActionTypeNoConfidence:
182-
tmpAction = &NoConfidenceGovAction{}
183-
case GovActionTypeUpdateCommittee:
184-
tmpAction = &UpdateCommitteeGovAction{}
185-
case GovActionTypeNewConstitution:
186-
tmpAction = &NewConstitutionGovAction{}
187-
case GovActionTypeInfo:
188-
tmpAction = &InfoGovAction{}
189-
default:
190-
return fmt.Errorf("unknown governance action type: %d", actionType)
191-
}
192-
// Decode action
193-
if _, err := cbor.Decode(data, tmpAction); err != nil {
194-
return err
195-
}
196-
// action type is known within uint range
197-
g.Type = uint(actionType) // #nosec G115
198-
g.Action = tmpAction
199-
return nil
200-
}
201-
202-
func (g *GovActionWrapper) MarshalCBOR() ([]byte, error) {
203-
return cbor.Encode(g.Action)
204-
}
205-
206154
type GovAction interface {
207155
isGovAction()
208156
ToPlutusData() data.PlutusData
209157
}
210158

211-
type ParameterChangeGovAction struct {
212-
cbor.StructAsArray
213-
Type uint
214-
ActionId *GovActionId
215-
ParamUpdate cbor.RawMessage // NOTE: we use raw to defer processing to account for per-era types
216-
PolicyHash []byte
217-
}
218-
219-
func (a *ParameterChangeGovAction) ToPlutusData() data.PlutusData {
220-
return data.NewConstr(0,
221-
a.ActionId.ToPlutusData(),
222-
data.NewByteString(a.ParamUpdate),
223-
data.NewByteString(a.PolicyHash),
224-
)
225-
}
159+
type GovActionBase struct{}
226160

227-
func (a ParameterChangeGovAction) isGovAction() {}
161+
func (GovActionBase) isGovAction() {}
228162

229163
type HardForkInitiationGovAction struct {
230164
cbor.StructAsArray
@@ -238,8 +172,12 @@ type HardForkInitiationGovAction struct {
238172
}
239173

240174
func (a *HardForkInitiationGovAction) ToPlutusData() data.PlutusData {
175+
actionId := data.NewConstr(1)
176+
if a.ActionId != nil {
177+
actionId = data.NewConstr(0, a.ActionId.ToPlutusData())
178+
}
241179
return data.NewConstr(1,
242-
a.ActionId.ToPlutusData(),
180+
actionId,
243181
data.NewConstr(
244182
0,
245183
data.NewInteger(
@@ -265,13 +203,20 @@ func (a *TreasuryWithdrawalGovAction) ToPlutusData() data.PlutusData {
265203
pairs := make([][2]data.PlutusData, 0, len(a.Withdrawals))
266204
for addr, amount := range a.Withdrawals {
267205
pairs = append(pairs, [2]data.PlutusData{
268-
data.NewConstr(0, addr.ToPlutusData()),
206+
addr.ToPlutusData(),
269207
data.NewInteger(new(big.Int).SetUint64(amount)),
270208
})
271209
}
210+
policyHash := data.NewConstr(1)
211+
if len(a.PolicyHash) > 0 {
212+
policyHash = data.NewConstr(
213+
0,
214+
data.NewByteString(a.PolicyHash),
215+
)
216+
}
272217
return data.NewConstr(2,
273218
data.NewMap(pairs),
274-
data.NewByteString(a.PolicyHash),
219+
policyHash,
275220
)
276221
}
277222

@@ -284,8 +229,12 @@ type NoConfidenceGovAction struct {
284229
}
285230

286231
func (a *NoConfidenceGovAction) ToPlutusData() data.PlutusData {
232+
actionId := data.NewConstr(1)
233+
if a.ActionId != nil {
234+
actionId = data.NewConstr(0, a.ActionId.ToPlutusData())
235+
}
287236
return data.NewConstr(3,
288-
a.ActionId.ToPlutusData(),
237+
actionId,
289238
)
290239
}
291240

@@ -301,6 +250,10 @@ type UpdateCommitteeGovAction struct {
301250
}
302251

303252
func (a *UpdateCommitteeGovAction) ToPlutusData() data.PlutusData {
253+
actionId := data.NewConstr(1)
254+
if a.ActionId != nil {
255+
actionId = data.NewConstr(0, a.ActionId.ToPlutusData())
256+
}
304257
removedItems := make([]data.PlutusData, 0, len(a.Credentials))
305258
for _, cred := range a.Credentials {
306259
removedItems = append(removedItems, cred.ToPlutusData())
@@ -325,11 +278,14 @@ func (a *UpdateCommitteeGovAction) ToPlutusData() data.PlutusData {
325278
}
326279

327280
return data.NewConstr(4,
328-
a.ActionId.ToPlutusData(),
281+
actionId,
329282
data.NewList(removedItems...),
330283
data.NewMap(addedPairs),
331-
data.NewInteger(num),
332-
data.NewInteger(den),
284+
data.NewConstr(
285+
0,
286+
data.NewInteger(num),
287+
data.NewInteger(den),
288+
),
333289
)
334290
}
335291

@@ -347,11 +303,21 @@ type NewConstitutionGovAction struct {
347303
}
348304

349305
func (a *NewConstitutionGovAction) ToPlutusData() data.PlutusData {
306+
actionId := data.NewConstr(1)
307+
if a.ActionId != nil {
308+
actionId = data.NewConstr(0, a.ActionId.ToPlutusData())
309+
}
310+
scriptHash := data.NewConstr(1)
311+
if len(a.Constitution.ScriptHash) > 0 {
312+
scriptHash = data.NewConstr(
313+
0,
314+
data.NewByteString(a.Constitution.ScriptHash),
315+
)
316+
}
350317
return data.NewConstr(5,
351-
a.ActionId.ToPlutusData(),
318+
actionId,
352319
data.NewConstr(0,
353-
a.Constitution.Anchor.ToPlutusData(),
354-
data.NewByteString(a.Constitution.ScriptHash),
320+
scriptHash,
355321
),
356322
)
357323
}

ledger/common/script/context.go

Lines changed: 15 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -161,8 +161,7 @@ func (t TxInfoV3) ToPlutusData() data.PlutusData {
161161
t.Data.ToPlutusData(),
162162
data.NewByteString(t.Id.Bytes()),
163163
t.Votes.ToPlutusData(),
164-
// TODO: proposal procedures
165-
toPlutusData([]any{}),
164+
toPlutusData(t.ProposalProcedures),
166165
t.CurrentTreasuryAmount.ToPlutusData(),
167166
t.TreasuryDonation.ToPlutusData(),
168167
)
@@ -188,6 +187,7 @@ func NewTxInfoV3FromTransaction(
188187
inputs := sortInputs(tx.Inputs())
189188
withdrawals := withdrawalsInfo(tx.Withdrawals())
190189
votes := votingInfo(tx.VotingProcedures())
190+
proposalProcedures := tx.ProposalProcedures()
191191
redeemers := redeemersInfo(
192192
tx.Witnesses(),
193193
scriptPurposeBuilder(
@@ -196,8 +196,8 @@ func NewTxInfoV3FromTransaction(
196196
*assetMint,
197197
tx.Certificates(),
198198
withdrawals,
199-
// TODO: proposal procedures
200199
votes,
200+
proposalProcedures,
201201
),
202202
)
203203
tmpData := dataInfo(tx.Witnesses())
@@ -207,18 +207,18 @@ func NewTxInfoV3FromTransaction(
207207
sortInputs(tx.ReferenceInputs()),
208208
resolvedInputs,
209209
),
210-
Outputs: collapseOutputs(tx.Produced()),
211-
Fee: tx.Fee(),
212-
Mint: *assetMint,
213-
ValidRange: validityRange,
214-
Certificates: tx.Certificates(),
215-
Withdrawals: withdrawals,
216-
Signatories: signatoriesInfo(tx.RequiredSigners()),
217-
Redeemers: redeemers,
218-
Data: tmpData,
219-
Id: tx.Hash(),
220-
Votes: votes,
221-
// TODO: ProposalProcedures
210+
Outputs: collapseOutputs(tx.Produced()),
211+
Fee: tx.Fee(),
212+
Mint: *assetMint,
213+
ValidRange: validityRange,
214+
Certificates: tx.Certificates(),
215+
Withdrawals: withdrawals,
216+
Signatories: signatoriesInfo(tx.RequiredSigners()),
217+
Redeemers: redeemers,
218+
Data: tmpData,
219+
Id: tx.Hash(),
220+
Votes: votes,
221+
ProposalProcedures: proposalProcedures,
222222
}
223223
if amt := tx.CurrentTreasuryValue(); amt > 0 {
224224
ret.CurrentTreasuryAmount.Value = amt

ledger/common/script/context_test.go

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -247,6 +247,24 @@ var scriptContextV3TestDefs = []struct {
247247
// uses indef-length encoding while the in-TX redeemer datum uses def-length encoding
248248
expectedCbor: "d8799fd8799f9fd8799fd8799f5820000000000000000000000000000000000000000000000000000000000000000000ffd8799fd8799fd8799f581c00000000000000000000000000000000000000000000000000000000ffd87a80ffa140a1401a000f4240d87980d87a80ffffff8080182aa080a0d8799fd8799fd87980d87a80ffd8799fd87b80d87a80ffff80a2d87d9fd8799fd87a9f581c43fa47afc68a7913fbe2f400e3849cb492d9a2610c85966de0f2ba1effffffd87981182ad87d9fd87a9fd87a9f581c43fa47afc68a7913fbe2f400e3849cb492d9a2610c85966de0f2ba1effffffd87980a05820e042ea3e95cf8156842e35639778441becaf3c862cb9459ee74b44aeeb88c673a5d8799fd87a9f581c43fa47afc68a7913fbe2f400e3849cb492d9a2610c85966de0f2ba1effffa1d8799f5820999999999999999999999999999999999999999999999999999999999999999901ffd87a80d8799fd8799f581c00000000000000000000000000000000000000000000000000000000ffffa1d8799f582099999999999999999999999999999999999999999999999999999999999999991898ffd87980d87a9fd87a9f581c43fa47afc68a7913fbe2f400e3849cb492d9a2610c85966de0f2ba1effffa1d8799f5820999999999999999999999999999999999999999999999999999999999999999903ffd87980d87a9fd8799f581c00000000000000000000000000000000000000000000000000000000ffffa3d8799f5820777777777777777777777777777777777777777777777777777777777777777702ffd87b80d8799f5820888888888888888888888888888888888888888888888888888888888888888801ffd87b80d8799f5820999999999999999999999999999999999999999999999999999999999999999900ffd87b80d87b9f581c00000000000000000000000000000000000000000000000000000000ffa1d8799f5820999999999999999999999999999999999999999999999999999999999999999904ffd87a8080d87a80d87a80ffd87981182ad87d9fd8799fd87a9f581c43fa47afc68a7913fbe2f400e3849cb492d9a2610c85966de0f2ba1effffffff",
249249
},
250+
{
251+
name: "ProposeAllButPparams",
252+
txHex: "84a40081825820000000000000000000000000000000000000000000000000000000000000000000018002182a14d9010289841a001e8480581df0000000000000000000000000000000000000000000000000000000008301f6820a00827668747470733a2f2f61696b656e2d6c616e672e6f726758200000000000000000000000000000000000000000000000000000000000000000841a001e8480581df0000000000000000000000000000000000000000000000000000000008301825820000000000000000000000000000000000000000000000000000000000000000000820b00827668747470733a2f2f61696b656e2d6c616e672e6f726758200000000000000000000000000000000000000000000000000000000000000000841a001e8480581df0000000000000000000000000000000000000000000000000000000008302a1581de0111111111111111111111111111111111111111111111111111111111a000f4240f6827668747470733a2f2f61696b656e2d6c616e672e6f726758200000000000000000000000000000000000000000000000000000000000000000841a001e8480581df0000000000000000000000000000000000000000000000000000000008302a1581de0222222222222222222222222222222222222222222222222222222221a000f4240581c9b24324046544393443e1fb35c8b72c3c39e18a516a95df5f6654101827668747470733a2f2f61696b656e2d6c616e672e6f726758200000000000000000000000000000000000000000000000000000000000000000841a001e8480581df0000000000000000000000000000000000000000000000000000000008203f6827668747470733a2f2f61696b656e2d6c616e672e6f726758200000000000000000000000000000000000000000000000000000000000000000841a001e8480581df0000000000000000000000000000000000000000000000000000000008504f6818200581c00000000000000000000000000000000000000000000000000000000a18200581c000000000000000000000000000000000000000000000000000000001901f4d81e820102827668747470733a2f2f61696b656e2d6c616e672e6f726758200000000000000000000000000000000000000000000000000000000000000000841a001e8480581df0000000000000000000000000000000000000000000000000000000008305f68282782068747470733a2f2f636f6e737469747574696f6e2e63617264616e6f2e6f726758200000000000000000000000000000000000000000000000000000000000000000f6827668747470733a2f2f61696b656e2d6c616e672e6f726758200000000000000000000000000000000000000000000000000000000000000000841a001e8480581df0000000000000000000000000000000000000000000000000000000008305f68282782068747470733a2f2f636f6e737469747574696f6e2e63617264616e6f2e6f726758200000000000000000000000000000000000000000000000000000000000000000581c00000000000000000000000000000000000000000000000000000000827668747470733a2f2f61696b656e2d6c616e672e6f726758200000000000000000000000000000000000000000000000000000000000000000841a001e8480581de0000000000000000000000000000000000000000000000000000000008106827668747470733a2f2f61696b656e2d6c616e672e6f726758200000000000000000000000000000000000000000000000000000000000000000a20581840503d87980821a000f42401a05f5e1000781587d587b0101003232323232323225333333008001153330033370e900018029baa001153330073006375400224a66600894452615330054911856616c696461746f722072657475726e65642066616c73650013656002002002002002002153300249010b5f746d70313a20566f696400165734ae7155ceaab9e5573eae91f5f6",
253+
inputsHex: "81825820000000000000000000000000000000000000000000000000000000000000000000",
254+
outputsHex: "81a200581d6000000000000000000000000000000000000000000000000000000000011a000f4240",
255+
redeemerTag: lcommon.RedeemerTagProposing,
256+
redeemerIndex: 3,
257+
expectedCbor: "d8799fd8799f9fd8799fd8799f5820000000000000000000000000000000000000000000000000000000000000000000ffd8799fd8799fd8799f581c00000000000000000000000000000000000000000000000000000000ffd87a80ffa140a1401a000f4240d87980d87a80ffffff8080182aa080a0d8799fd8799fd87980d87a80ffd8799fd87b80d87a80ffff80a1d87e9f03d8799f1a001e8480d87a9f581c00000000000000000000000000000000000000000000000000000000ffd87b9fa1d8799f581c22222222222222222222222222222222222222222222222222222222ff1a000f4240d8799f581c9b24324046544393443e1fb35c8b72c3c39e18a516a95df5f6654101ffffffffd87980a05820644c54128c2d5a09a7b5cf1f533ffabac64975224bd6e8f6443d2932ba61fccda09fd8799f1a001e8480d87a9f581c00000000000000000000000000000000000000000000000000000000ffd87a9fd87a80d8799f0a00ffffffd8799f1a001e8480d87a9f581c00000000000000000000000000000000000000000000000000000000ffd87a9fd8799fd8799f5820000000000000000000000000000000000000000000000000000000000000000000ffffd8799f0b00ffffffd8799f1a001e8480d87a9f581c00000000000000000000000000000000000000000000000000000000ffd87b9fa1d8799f581c11111111111111111111111111111111111111111111111111111111ff1a000f4240d87a80ffffd8799f1a001e8480d87a9f581c00000000000000000000000000000000000000000000000000000000ffd87b9fa1d8799f581c22222222222222222222222222222222222222222222222222222222ff1a000f4240d8799f581c9b24324046544393443e1fb35c8b72c3c39e18a516a95df5f6654101ffffffd8799f1a001e8480d87a9f581c00000000000000000000000000000000000000000000000000000000ffd87c9fd87a80ffffd8799f1a001e8480d87a9f581c00000000000000000000000000000000000000000000000000000000ffd87d9fd87a809fd8799f581c00000000000000000000000000000000000000000000000000000000ffffa1d8799f581c00000000000000000000000000000000000000000000000000000000ff1901f4d8799f0102ffffffd8799f1a001e8480d87a9f581c00000000000000000000000000000000000000000000000000000000ffd87e9fd87a80d8799fd87a80ffffffd8799f1a001e8480d87a9f581c00000000000000000000000000000000000000000000000000000000ffd87e9fd87a80d8799fd8799f581c00000000000000000000000000000000000000000000000000000000ffffffffd8799f1a001e8480d8799f581c00000000000000000000000000000000000000000000000000000000ffd87f80ffffd87a80d87a80ffd87980d87e9f03d8799f1a001e8480d87a9f581c00000000000000000000000000000000000000000000000000000000ffd87b9fa1d8799f581c22222222222222222222222222222222222222222222222222222222ff1a000f4240d8799f581c9b24324046544393443e1fb35c8b72c3c39e18a516a95df5f6654101ffffffffff",
258+
},
259+
{
260+
name: "ProposePparamsNoCostModels",
261+
txHex: "84a40081825820000000000000000000000000000000000000000000000000000000000000000000018002182a14d9010281841a001e8480581df0000000000000000000000000000000000000000000000000000000008400f6b81d00182c011a00025ef50712081901f409d81e82030a0ad81e82031903e80bd81e82020a021a00016000031940000419044c051a001e8480061a1dcd650010190154111910d61382d81e821902411903e8d81e821902d11a000f424014821a00d59f801b00000002540be40015821a03b20b801b00000004a817c80016191388171896181803181985d81e8218331864d81e8218341864d81e8218351864d81e8218361864d81e8218371864181a8ad81e8218431864d81e8218431864d81e82183c1864d81e82184b1864d81e82183c1864d81e8218431864d81e8218431864d81e8218431864d81e82184b1864d81e8218431864181b07181c1892181d06181e1b000000174876e800181f1a1dcd65001820141821d81e820f01581c9b24324046544393443e1fb35c8b72c3c39e18a516a95df5f6654101827668747470733a2f2f61696b656e2d6c616e672e6f726758200000000000000000000000000000000000000000000000000000000000000000a20581840500d87980821a000f42401a05f5e1000781587d587b0101003232323232323225333333008001153330033370e900018029baa001153330073006375400224a66600894452615330054911856616c696461746f722072657475726e65642066616c73650013656002002002002002002153300249010b5f746d70313a20566f696400165734ae7155ceaab9e5573eae91f5f6",
262+
inputsHex: "81825820000000000000000000000000000000000000000000000000000000000000000000",
263+
outputsHex: "81a200581d6000000000000000000000000000000000000000000000000000000000011a000f4240",
264+
redeemerTag: lcommon.RedeemerTagProposing,
265+
redeemerIndex: 0,
266+
expectedCbor: "d8799fd8799f9fd8799fd8799f5820000000000000000000000000000000000000000000000000000000000000000000ffd8799fd8799fd8799f581c00000000000000000000000000000000000000000000000000000000ffd87a80ffa140a1401a000f4240d87980d87a80ffffff8080182aa080a0d8799fd8799fd87980d87a80ffd8799fd87b80d87a80ffff80a1d87e9f00d8799f1a001e8480d87a9f581c00000000000000000000000000000000000000000000000000000000ffd8799fd87a80b81d00182c011a00025ef5021a00016000031940000419044c051a001e8480061a1dcd65000712081901f4099f030aff0a9f031903e8ff0b9f0105ff10190154111910d6139f9f1902411903e8ff9f1902d11a000f4240ffff149f1a00d59f801b00000002540be400ff159f1a03b20b801b00000004a817c800ff1619138817189618180318199f9f18331864ff9f0d1819ff9f18351864ff9f181b1832ff9f0b14ffff181a9f9f18431864ff9f18431864ff9f0305ff9f0304ff9f0305ff9f18431864ff9f18431864ff9f18431864ff9f0304ff9f18431864ffff181b07181c1892181d06181e1b000000174876e800181f1a1dcd650018201418219f0f01ffd8799f581c9b24324046544393443e1fb35c8b72c3c39e18a516a95df5f6654101ffffffffd87980a05820a88a9bf8af51ea738bf212fe204e5ef2fd05312c995dad1ec194dcdc5aa07737a09fd8799f1a001e8480d87a9f581c00000000000000000000000000000000000000000000000000000000ffd8799fd87a80b81d00182c011a00025ef5021a00016000031940000419044c051a001e8480061a1dcd65000712081901f4099f030aff0a9f031903e8ff0b9f0105ff10190154111910d6139f9f1902411903e8ff9f1902d11a000f4240ffff149f1a00d59f801b00000002540be400ff159f1a03b20b801b00000004a817c800ff1619138817189618180318199f9f18331864ff9f0d1819ff9f18351864ff9f181b1832ff9f0b14ffff181a9f9f18431864ff9f18431864ff9f0305ff9f0304ff9f0305ff9f18431864ff9f18431864ff9f18431864ff9f0304ff9f18431864ffff181b07181c1892181d06181e1b000000174876e800181f1a1dcd650018201418219f0f01ffd8799f581c9b24324046544393443e1fb35c8b72c3c39e18a516a95df5f6654101ffffffffd87a80d87a80ffd87980d87e9f00d8799f1a001e8480d87a9f581c00000000000000000000000000000000000000000000000000000000ffd8799fd87a80b81d00182c011a00025ef5021a00016000031940000419044c051a001e8480061a1dcd65000712081901f4099f030aff0a9f031903e8ff0b9f0105ff10190154111910d6139f9f1902411903e8ff9f1902d11a000f4240ffff149f1a00d59f801b00000002540be400ff159f1a03b20b801b00000004a817c800ff1619138817189618180318199f9f18331864ff9f0d1819ff9f18351864ff9f181b1832ff9f0b14ffff181a9f9f18431864ff9f18431864ff9f0305ff9f0304ff9f0305ff9f18431864ff9f18431864ff9f18431864ff9f0304ff9f18431864ffff181b07181c1892181d06181e1b000000174876e800181f1a1dcd650018201418219f0f01ffd8799f581c9b24324046544393443e1fb35c8b72c3c39e18a516a95df5f6654101ffffffffff",
267+
},
250268
}
251269

252270
func TestScriptContextV3(t *testing.T) {

0 commit comments

Comments
 (0)