@@ -16,6 +16,8 @@ import (
16
16
cmtypes "github.com/cometbft/cometbft/types"
17
17
"github.com/cosmos/cosmos-proto/anyutil"
18
18
gogoproto "github.com/cosmos/gogoproto/proto"
19
+ ibcclienttypes "github.com/cosmos/ibc-go/v8/modules/core/02-client/types"
20
+ ibctmlightclients "github.com/cosmos/ibc-go/v8/modules/light-clients/07-tendermint"
19
21
opchildv1 "github.com/initia-labs/OPinit/api/opinit/opchild/v1"
20
22
ophosttypes "github.com/initia-labs/OPinit/x/ophost/types"
21
23
executortypes "github.com/initia-labs/opinit-bots/executor/types"
@@ -35,7 +37,7 @@ func TestBatchReconstructionTest(t *testing.T) {
35
37
Gas : "auto" ,
36
38
GasPrices : "0.025uinit" ,
37
39
GasAdjustment : 1.2 ,
38
- TrustingPeriod : "168h " ,
40
+ TrustingPeriod : "1h " ,
39
41
NumValidators : 1 ,
40
42
NumFullNodes : 0 ,
41
43
}
@@ -49,7 +51,7 @@ func TestBatchReconstructionTest(t *testing.T) {
49
51
Gas : "auto" ,
50
52
GasPrices : "0.025umin" ,
51
53
GasAdjustment : 1.2 ,
52
- TrustingPeriod : "168h " ,
54
+ TrustingPeriod : "1h " ,
53
55
NumValidators : 1 ,
54
56
NumFullNodes : 0 ,
55
57
}
@@ -65,7 +67,24 @@ func TestBatchReconstructionTest(t *testing.T) {
65
67
cases := []struct {
66
68
name string
67
69
daChainConfig DAChainConfig
70
+ relayerImpl ibc.RelayerImplementation
68
71
}{
72
+ {
73
+ name : "initia with go relayer" ,
74
+ daChainConfig : DAChainConfig {
75
+ ChainConfig : * l1ChainConfig ,
76
+ ChainType : ophosttypes .BatchInfo_CHAIN_TYPE_INITIA ,
77
+ },
78
+ relayerImpl : ibc .CosmosRly ,
79
+ },
80
+ {
81
+ name : "initia with hermes relayer" ,
82
+ daChainConfig : DAChainConfig {
83
+ ChainConfig : * l1ChainConfig ,
84
+ ChainType : ophosttypes .BatchInfo_CHAIN_TYPE_INITIA ,
85
+ },
86
+ relayerImpl : ibc .Hermes ,
87
+ },
69
88
{
70
89
name : "celestia" ,
71
90
daChainConfig : DAChainConfig {
@@ -78,27 +97,21 @@ func TestBatchReconstructionTest(t *testing.T) {
78
97
Gas : "auto" ,
79
98
GasPrices : "0.25utia" ,
80
99
GasAdjustment : 1.5 ,
81
- TrustingPeriod : "168h " ,
100
+ TrustingPeriod : "1h " ,
82
101
NumValidators : 1 ,
83
102
NumFullNodes : 0 ,
84
103
},
85
104
ChainType : ophosttypes .BatchInfo_CHAIN_TYPE_CELESTIA ,
86
105
},
87
- },
88
- {
89
- name : "initia" ,
90
- daChainConfig : DAChainConfig {
91
- ChainConfig : * l1ChainConfig ,
92
- ChainType : ophosttypes .BatchInfo_CHAIN_TYPE_INITIA ,
93
- },
106
+ relayerImpl : ibc .CosmosRly ,
94
107
},
95
108
}
96
109
97
110
for _ , tc := range cases {
98
111
t .Run (tc .name , func (t * testing.T ) {
99
112
ctx := context .Background ()
100
113
101
- op := SetupTest (t , ctx , BotExecutor , l1ChainConfig , l2ChainConfig , & tc .daChainConfig , bridgeConfig )
114
+ op := SetupTest (t , ctx , BotExecutor , l1ChainConfig , l2ChainConfig , & tc .daChainConfig , bridgeConfig , tc . relayerImpl )
102
115
103
116
err := testutil .WaitForBlocks (ctx , 20 , op .Initia , op .Minitia )
104
117
require .NoError (t , err )
@@ -142,7 +155,7 @@ func TestBatchReconstructionTest(t *testing.T) {
142
155
require .NoError (t , err )
143
156
require .NotNil (t , block )
144
157
145
- err = fillOracleData (ctx , block , op .Initia )
158
+ err = fillData (ctx , block , op .Initia )
146
159
require .NoError (t , err )
147
160
148
161
pbb , err := block .ToProto ()
@@ -243,7 +256,7 @@ func BlockFromProtoWithNoValidation(bp *cmtproto.Block) (*cmtypes.Block, error)
243
256
return b , nil
244
257
}
245
258
246
- func fillOracleData (ctx context.Context , block * cmtypes.Block , chain * L1Chain ) error {
259
+ func fillData (ctx context.Context , block * cmtypes.Block , chain * L1Chain ) error {
247
260
for i , txBytes := range block .Txs {
248
261
var raw txv1beta1.TxRaw
249
262
if err := proto .Unmarshal (txBytes , & raw ); err != nil {
@@ -305,6 +318,91 @@ func fillOracleData(ctx context.Context, block *cmtypes.Block, chain *L1Chain) e
305
318
if err != nil {
306
319
return errors .Join (errors .New ("failed to marshal oracle msg" ), err )
307
320
}
321
+ case "/ibc.core.client.v1.MsgUpdateClient" :
322
+ updateClientMsg := new (ibcclienttypes.MsgUpdateClient )
323
+ err := updateClientMsg .Unmarshal (anyMsg .Value )
324
+ if err != nil {
325
+ return err
326
+ }
327
+
328
+ if updateClientMsg .ClientMessage .TypeUrl != "/ibc.lightclients.tendermint.v1.Header" {
329
+ continue
330
+ }
331
+
332
+ tmHeader := new (ibctmlightclients.Header )
333
+ err = tmHeader .Unmarshal (updateClientMsg .ClientMessage .Value )
334
+ if err != nil {
335
+ return err
336
+ }
337
+
338
+ // fill ValidatorSet
339
+ height := tmHeader .SignedHeader .Commit .Height
340
+ validators , err := getAllValidators (ctx , chain , height )
341
+ if err != nil {
342
+ return err
343
+ }
344
+ cmtValidators , _ , err := toCmtProtoValidators (validators )
345
+ if err != nil {
346
+ return err
347
+ }
348
+ if tmHeader .ValidatorSet == nil {
349
+ tmHeader .ValidatorSet = new (cmtproto.ValidatorSet )
350
+ }
351
+ tmHeader .ValidatorSet .Validators = cmtValidators
352
+ for _ , val := range cmtValidators {
353
+ if bytes .Equal (val .Address , tmHeader .SignedHeader .Header .ProposerAddress ) {
354
+ tmHeader .ValidatorSet .Proposer = val
355
+ }
356
+ }
357
+
358
+ // fill TrustedValidators
359
+ height = int64 (tmHeader .TrustedHeight .RevisionHeight )
360
+ validators , err = getAllValidators (ctx , chain , height )
361
+ if err != nil {
362
+ return err
363
+ }
364
+ cmtValidators , _ , err = toCmtProtoValidators (validators )
365
+ if err != nil {
366
+ return err
367
+ }
368
+ blockHeader , err := chain .GetFullNode ().Client .Header (ctx , & height )
369
+ if err != nil {
370
+ return err
371
+ }
372
+ if tmHeader .TrustedValidators == nil {
373
+ tmHeader .TrustedValidators = new (cmtproto.ValidatorSet )
374
+ }
375
+ tmHeader .TrustedValidators .Validators = cmtValidators
376
+ for _ , val := range cmtValidators {
377
+ if bytes .Equal (val .Address , blockHeader .Header .ProposerAddress .Bytes ()) {
378
+ tmHeader .TrustedValidators .Proposer = val
379
+ }
380
+ }
381
+
382
+ // fill commit signatures
383
+ height = tmHeader .SignedHeader .Commit .Height + 1
384
+ block , err := chain .GetFullNode ().Client .Block (ctx , & height )
385
+ if err != nil {
386
+ return err
387
+ }
388
+
389
+ for sigIndex , signature := range tmHeader .SignedHeader .Commit .Signatures {
390
+ if len (signature .Signature ) == 2 {
391
+ // fill signature
392
+ blockSigIndex := int (signature .Signature [0 ]) + int (signature .Signature [1 ])<< 8
393
+ tmHeader .SignedHeader .Commit .Signatures [sigIndex ] = * block .Block .LastCommit .Signatures [blockSigIndex ].ToProto ()
394
+ }
395
+ }
396
+
397
+ updateClientMsg .ClientMessage .Value , err = tmHeader .Marshal ()
398
+ if err != nil {
399
+ return errors .Join (errors .New ("failed to marshal tm header" ), err )
400
+ }
401
+
402
+ anyMsg .Value , err = updateClientMsg .Marshal ()
403
+ if err != nil {
404
+ return errors .Join (errors .New ("failed to marshal update client msg" ), err )
405
+ }
308
406
default :
309
407
continue
310
408
}
@@ -323,3 +421,39 @@ func fillOracleData(ctx context.Context, block *cmtypes.Block, chain *L1Chain) e
323
421
}
324
422
return nil
325
423
}
424
+
425
+ func getAllValidators (ctx context.Context , chain * L1Chain , height int64 ) ([]* cmtypes.Validator , error ) {
426
+ page := 1
427
+ perPage := 100
428
+
429
+ validators := make ([]* cmtypes.Validator , 0 )
430
+ for {
431
+ result , err := chain .GetFullNode ().Client .Validators (ctx , & height , & page , & perPage )
432
+ if err != nil {
433
+ return nil , err
434
+ }
435
+ validators = append (validators , result .Validators ... )
436
+ page ++
437
+ if len (validators ) >= result .Total {
438
+ break
439
+ }
440
+ }
441
+ return validators , nil
442
+ }
443
+
444
+ func toCmtProtoValidators (validators []* cmtypes.Validator ) ([]* cmtproto.Validator , int64 , error ) {
445
+ protoValidators := make ([]* cmtproto.Validator , 0 , len (validators ))
446
+ totalVotingPower := int64 (0 )
447
+
448
+ for i := range validators {
449
+ protoValidator , err := validators [i ].ToProto ()
450
+ if err != nil {
451
+ return nil , 0 , err
452
+ }
453
+ protoValidator .ProposerPriority = 0
454
+ totalVotingPower += protoValidator .VotingPower
455
+
456
+ protoValidators = append (protoValidators , protoValidator )
457
+ }
458
+ return protoValidators , totalVotingPower , nil
459
+ }
0 commit comments