Skip to content

Commit 279e490

Browse files
committed
feat: add channel out callback for enclave
1 parent 9e00f11 commit 279e490

File tree

8 files changed

+97
-64
lines changed

8 files changed

+97
-64
lines changed

op-batcher/batcher/channel.go

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -32,10 +32,12 @@ type channel struct {
3232
minInclusionBlock uint64
3333
// Inclusion block number of last confirmed TX
3434
maxInclusionBlock uint64
35+
36+
outFactory ChannelOutFactory
3537
}
3638

37-
func newChannel(log log.Logger, metr metrics.Metricer, cfg ChannelConfig, rollupCfg *rollup.Config, latestL1OriginBlockNum uint64) (*channel, error) {
38-
cb, err := NewChannelBuilder(cfg, *rollupCfg, latestL1OriginBlockNum)
39+
func newChannel(log log.Logger, metr metrics.Metricer, cfg ChannelConfig, rollupCfg *rollup.Config, outFactory ChannelOutFactory, latestL1OriginBlockNum uint64) (*channel, error) {
40+
cb, err := NewChannelBuilder(cfg, *rollupCfg, outFactory, latestL1OriginBlockNum)
3941
if err != nil {
4042
return nil, fmt.Errorf("creating new channel: %w", err)
4143
}
@@ -47,6 +49,7 @@ func newChannel(log log.Logger, metr metrics.Metricer, cfg ChannelConfig, rollup
4749
channelBuilder: cb,
4850
pendingTransactions: make(map[string]txData),
4951
confirmedTransactions: make(map[string]eth.BlockID),
52+
outFactory: outFactory,
5053
}, nil
5154
}
5255

op-batcher/batcher/channel_builder.go

Lines changed: 24 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -76,15 +76,20 @@ type ChannelBuilder struct {
7676
outputBytes int
7777
}
7878

79-
// NewChannelBuilder creates a new channel builder or returns an error if the
80-
// channel out could not be created.
81-
// it acts as a factory for either a span or singular channel out
82-
func NewChannelBuilder(cfg ChannelConfig, rollupCfg rollup.Config, latestL1OriginBlockNum uint64) (*ChannelBuilder, error) {
79+
type ChannelOutFactory func(cfg ChannelConfig, rollupCfg *rollup.Config) (derive.ChannelOut, error)
80+
81+
// NewChannelOut creates a new channel out based on the given configuration.
82+
func NewChannelOut(cfg ChannelConfig, rollupCfg *rollup.Config) (derive.ChannelOut, error) {
83+
var (
84+
co derive.ChannelOut
85+
err error
86+
)
87+
8388
c, err := cfg.CompressorConfig.NewCompressor()
8489
if err != nil {
8590
return nil, err
8691
}
87-
var co derive.ChannelOut
92+
8893
if cfg.BatchType == derive.SpanBatchType {
8994
co, err = derive.NewSpanChannelOut(rollupCfg.Genesis.L2Time, rollupCfg.L2ChainID, cfg.CompressorConfig.TargetOutputSize, cfg.CompressorConfig.CompressionAlgo)
9095
} else {
@@ -93,6 +98,20 @@ func NewChannelBuilder(cfg ChannelConfig, rollupCfg rollup.Config, latestL1Origi
9398
if err != nil {
9499
return nil, fmt.Errorf("creating channel out: %w", err)
95100
}
101+
return co, nil
102+
}
103+
104+
// NewChannelBuilder creates a new channel builder or returns an error if the
105+
// channel out could not be created.
106+
// it acts as a factory for either a span or singular channel out
107+
func NewChannelBuilder(cfg ChannelConfig, rollupCfg rollup.Config, outFactory ChannelOutFactory, latestL1OriginBlockNum uint64) (*ChannelBuilder, error) {
108+
if outFactory == nil {
109+
outFactory = NewChannelOut
110+
}
111+
co, err := outFactory(cfg, &rollupCfg)
112+
if err != nil {
113+
return nil, err
114+
}
96115

97116
cb := &ChannelBuilder{
98117
cfg: cfg,

op-batcher/batcher/channel_builder_test.go

Lines changed: 22 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -105,7 +105,7 @@ func FuzzDurationTimeoutZeroMaxChannelDuration(f *testing.F) {
105105
f.Fuzz(func(t *testing.T, l1BlockNum uint64) {
106106
channelConfig := defaultTestChannelConfig()
107107
channelConfig.MaxChannelDuration = 0
108-
cb, err := NewChannelBuilder(channelConfig, defaultTestRollupConfig, latestL1BlockOrigin)
108+
cb, err := NewChannelBuilder(channelConfig, defaultTestRollupConfig, nil, latestL1BlockOrigin)
109109
require.NoError(t, err)
110110
cb.timeout = 0
111111
cb.updateDurationTimeout(l1BlockNum)
@@ -128,7 +128,7 @@ func FuzzChannelBuilder_DurationZero(f *testing.F) {
128128
// Create the channel builder
129129
channelConfig := defaultTestChannelConfig()
130130
channelConfig.MaxChannelDuration = maxChannelDuration
131-
cb, err := NewChannelBuilder(channelConfig, defaultTestRollupConfig, latestL1BlockOrigin)
131+
cb, err := NewChannelBuilder(channelConfig, defaultTestRollupConfig, nil, latestL1BlockOrigin)
132132
require.NoError(t, err)
133133

134134
// Whenever the timeout is set to 0, the channel builder should have a duration timeout
@@ -155,7 +155,7 @@ func FuzzDurationTimeoutMaxChannelDuration(f *testing.F) {
155155
// Create the channel builder
156156
channelConfig := defaultTestChannelConfig()
157157
channelConfig.MaxChannelDuration = maxChannelDuration
158-
cb, err := NewChannelBuilder(channelConfig, defaultTestRollupConfig, latestL1BlockOrigin)
158+
cb, err := NewChannelBuilder(channelConfig, defaultTestRollupConfig, nil, latestL1BlockOrigin)
159159
require.NoError(t, err)
160160

161161
// Whenever the timeout is greater than the l1BlockNum,
@@ -189,7 +189,7 @@ func FuzzChannelCloseTimeout(f *testing.F) {
189189
channelConfig := defaultTestChannelConfig()
190190
channelConfig.ChannelTimeout = channelTimeout
191191
channelConfig.SubSafetyMargin = subSafetyMargin
192-
cb, err := NewChannelBuilder(channelConfig, defaultTestRollupConfig, latestL1BlockOrigin)
192+
cb, err := NewChannelBuilder(channelConfig, defaultTestRollupConfig, nil, latestL1BlockOrigin)
193193
require.NoError(t, err)
194194

195195
// Check the timeout
@@ -217,7 +217,7 @@ func FuzzChannelZeroCloseTimeout(f *testing.F) {
217217
channelConfig := defaultTestChannelConfig()
218218
channelConfig.ChannelTimeout = channelTimeout
219219
channelConfig.SubSafetyMargin = subSafetyMargin
220-
cb, err := NewChannelBuilder(channelConfig, defaultTestRollupConfig, latestL1BlockOrigin)
220+
cb, err := NewChannelBuilder(channelConfig, defaultTestRollupConfig, nil, latestL1BlockOrigin)
221221
require.NoError(t, err)
222222

223223
// Check the timeout
@@ -244,7 +244,7 @@ func FuzzSeqWindowClose(f *testing.F) {
244244
channelConfig := defaultTestChannelConfig()
245245
channelConfig.SeqWindowSize = seqWindowSize
246246
channelConfig.SubSafetyMargin = subSafetyMargin
247-
cb, err := NewChannelBuilder(channelConfig, defaultTestRollupConfig, latestL1BlockOrigin)
247+
cb, err := NewChannelBuilder(channelConfig, defaultTestRollupConfig, nil, latestL1BlockOrigin)
248248
require.NoError(t, err)
249249

250250
// Check the timeout
@@ -272,7 +272,7 @@ func FuzzSeqWindowZeroTimeoutClose(f *testing.F) {
272272
channelConfig := defaultTestChannelConfig()
273273
channelConfig.SeqWindowSize = seqWindowSize
274274
channelConfig.SubSafetyMargin = subSafetyMargin
275-
cb, err := NewChannelBuilder(channelConfig, defaultTestRollupConfig, latestL1BlockOrigin)
275+
cb, err := NewChannelBuilder(channelConfig, defaultTestRollupConfig, nil, latestL1BlockOrigin)
276276
require.NoError(t, err)
277277

278278
// Check the timeout
@@ -318,7 +318,7 @@ func TestChannelBuilder_NextFrame(t *testing.T) {
318318
channelConfig := defaultTestChannelConfig()
319319

320320
// Create a new channel builder
321-
cb, err := NewChannelBuilder(channelConfig, defaultTestRollupConfig, latestL1BlockOrigin)
321+
cb, err := NewChannelBuilder(channelConfig, defaultTestRollupConfig, nil, latestL1BlockOrigin)
322322
require.NoError(t, err)
323323

324324
// Mock the internals of `ChannelBuilder.outputFrame`
@@ -359,7 +359,7 @@ func ChannelBuilder_OutputWrongFramePanic(t *testing.T, batchType uint) {
359359
channelConfig.BatchType = batchType
360360

361361
// Construct a channel builder
362-
cb, err := NewChannelBuilder(channelConfig, defaultTestRollupConfig, latestL1BlockOrigin)
362+
cb, err := NewChannelBuilder(channelConfig, defaultTestRollupConfig, nil, latestL1BlockOrigin)
363363
require.NoError(t, err)
364364

365365
// Mock the internals of `ChannelBuilder.outputFrame`
@@ -395,7 +395,7 @@ func TestChannelBuilder_OutputFrames(t *testing.T) {
395395
channelConfig.InitNoneCompressor()
396396

397397
// Construct the channel builder
398-
cb, err := NewChannelBuilder(channelConfig, defaultTestRollupConfig, latestL1BlockOrigin)
398+
cb, err := NewChannelBuilder(channelConfig, defaultTestRollupConfig, nil, latestL1BlockOrigin)
399399
require.NoError(t, err)
400400
require.False(t, cb.IsFull())
401401
require.Equal(t, 0, cb.PendingFrames())
@@ -453,7 +453,7 @@ func ChannelBuilder_OutputFrames_SpanBatch(t *testing.T, algo derive.Compression
453453
channelConfig.InitRatioCompressor(1, algo)
454454

455455
// Construct the channel builder
456-
cb, err := NewChannelBuilder(channelConfig, defaultTestRollupConfig, latestL1BlockOrigin)
456+
cb, err := NewChannelBuilder(channelConfig, defaultTestRollupConfig, nil, latestL1BlockOrigin)
457457
require.NoError(t, err)
458458
require.False(t, cb.IsFull())
459459
require.Equal(t, 0, cb.PendingFrames())
@@ -510,7 +510,7 @@ func ChannelBuilder_MaxRLPBytesPerChannel(t *testing.T, batchType uint) {
510510
channelConfig.BatchType = batchType
511511

512512
// Construct the channel builder
513-
cb, err := NewChannelBuilder(channelConfig, defaultTestRollupConfig, latestL1BlockOrigin)
513+
cb, err := NewChannelBuilder(channelConfig, defaultTestRollupConfig, nil, latestL1BlockOrigin)
514514
require.NoError(t, err)
515515

516516
// Add a block that overflows the [ChannelOut]
@@ -532,7 +532,7 @@ func ChannelBuilder_OutputFramesMaxFrameIndex(t *testing.T, batchType uint) {
532532
// Continuously add blocks until the max frame index is reached
533533
// This should cause the [ChannelBuilder.OutputFrames] function
534534
// to error
535-
cb, err := NewChannelBuilder(channelConfig, defaultTestRollupConfig, latestL1BlockOrigin)
535+
cb, err := NewChannelBuilder(channelConfig, defaultTestRollupConfig, nil, latestL1BlockOrigin)
536536
require.NoError(t, err)
537537
require.False(t, cb.IsFull())
538538
require.Equal(t, 0, cb.PendingFrames())
@@ -568,7 +568,7 @@ func TestChannelBuilder_FullShadowCompressor(t *testing.T) {
568568
}
569569

570570
cfg.InitShadowCompressor(derive.Zlib)
571-
cb, err := NewChannelBuilder(cfg, defaultTestRollupConfig, latestL1BlockOrigin)
571+
cb, err := NewChannelBuilder(cfg, defaultTestRollupConfig, nil, latestL1BlockOrigin)
572572
require.NoError(err)
573573

574574
rng := rand.New(rand.NewSource(420))
@@ -600,7 +600,7 @@ func ChannelBuilder_AddBlock(t *testing.T, batchType uint) {
600600
channelConfig.InitRatioCompressor(1, derive.Zlib)
601601

602602
// Construct the channel builder
603-
cb, err := NewChannelBuilder(channelConfig, defaultTestRollupConfig, latestL1BlockOrigin)
603+
cb, err := NewChannelBuilder(channelConfig, defaultTestRollupConfig, nil, latestL1BlockOrigin)
604604
require.NoError(t, err)
605605

606606
// Add a nonsense block to the channel builder
@@ -626,7 +626,7 @@ func TestChannelBuilder_CheckTimeout(t *testing.T) {
626626
channelConfig := defaultTestChannelConfig()
627627

628628
// Construct the channel builder
629-
cb, err := NewChannelBuilder(channelConfig, defaultTestRollupConfig, latestL1BlockOrigin)
629+
cb, err := NewChannelBuilder(channelConfig, defaultTestRollupConfig, nil, latestL1BlockOrigin)
630630
require.NoError(t, err)
631631

632632
// Assert timeout is setup correctly
@@ -651,7 +651,7 @@ func TestChannelBuilder_CheckTimeoutZeroMaxChannelDuration(t *testing.T) {
651651
channelConfig.MaxChannelDuration = 0
652652

653653
// Construct the channel builder
654-
cb, err := NewChannelBuilder(channelConfig, defaultTestRollupConfig, latestL1BlockOrigin)
654+
cb, err := NewChannelBuilder(channelConfig, defaultTestRollupConfig, nil, latestL1BlockOrigin)
655655
require.NoError(t, err)
656656

657657
// Without a max channel duration, timeout should not be set
@@ -674,7 +674,7 @@ func TestChannelBuilder_FramePublished(t *testing.T) {
674674
cfg.SubSafetyMargin = 100
675675

676676
// Construct the channel builder
677-
cb, err := NewChannelBuilder(cfg, defaultTestRollupConfig, latestL1BlockOrigin)
677+
cb, err := NewChannelBuilder(cfg, defaultTestRollupConfig, nil, latestL1BlockOrigin)
678678
require.NoError(t, err)
679679
require.Equal(t, latestL1BlockOrigin+cfg.MaxChannelDuration, cb.timeout)
680680

@@ -691,7 +691,7 @@ func TestChannelBuilder_FramePublished(t *testing.T) {
691691
}
692692

693693
func TestChannelBuilder_LatestL1Origin(t *testing.T) {
694-
cb, err := NewChannelBuilder(defaultTestChannelConfig(), defaultTestRollupConfig, latestL1BlockOrigin)
694+
cb, err := NewChannelBuilder(defaultTestChannelConfig(), defaultTestRollupConfig, nil, latestL1BlockOrigin)
695695
require.NoError(t, err)
696696
require.Equal(t, eth.BlockID{}, cb.LatestL1Origin())
697697

@@ -721,7 +721,7 @@ func ChannelBuilder_PendingFrames_TotalFrames(t *testing.T, batchType uint) {
721721
cfg.TargetNumFrames = tnf
722722
cfg.BatchType = batchType
723723
cfg.InitShadowCompressor(derive.Zlib)
724-
cb, err := NewChannelBuilder(cfg, defaultTestRollupConfig, latestL1BlockOrigin)
724+
cb, err := NewChannelBuilder(cfg, defaultTestRollupConfig, nil, latestL1BlockOrigin)
725725
require.NoError(err)
726726

727727
// initial builder should be empty
@@ -766,7 +766,7 @@ func ChannelBuilder_InputBytes(t *testing.T, batchType uint) {
766766
chainId := big.NewInt(1234)
767767
spanBatch = derive.NewSpanBatch(uint64(0), chainId)
768768
}
769-
cb, err := NewChannelBuilder(cfg, defaultTestRollupConfig, latestL1BlockOrigin)
769+
cb, err := NewChannelBuilder(cfg, defaultTestRollupConfig, nil, latestL1BlockOrigin)
770770
require.NoError(err)
771771

772772
require.Zero(cb.InputBytes())
@@ -803,7 +803,7 @@ func ChannelBuilder_OutputBytes(t *testing.T, batchType uint) {
803803
cfg.TargetNumFrames = 16
804804
cfg.BatchType = batchType
805805
cfg.InitRatioCompressor(1.0, derive.Zlib)
806-
cb, err := NewChannelBuilder(cfg, defaultTestRollupConfig, latestL1BlockOrigin)
806+
cb, err := NewChannelBuilder(cfg, defaultTestRollupConfig, nil, latestL1BlockOrigin)
807807
require.NoError(err, "NewChannelBuilder")
808808

809809
require.Zero(cb.OutputBytes())

op-batcher/batcher/channel_manager.go

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -50,15 +50,18 @@ type channelManager struct {
5050
closed bool
5151

5252
isVolta bool
53+
54+
outFactory ChannelOutFactory
5355
}
5456

55-
func NewChannelManager(log log.Logger, metr metrics.Metricer, cfg ChannelConfig, rollupCfg *rollup.Config) *channelManager {
57+
func NewChannelManager(log log.Logger, metr metrics.Metricer, cfg ChannelConfig, rollupCfg *rollup.Config, outFactory ChannelOutFactory) *channelManager {
5658
return &channelManager{
5759
log: log,
5860
metr: metr,
5961
cfg: cfg,
6062
rollupCfg: rollupCfg,
6163
txChannels: make(map[string]*channel),
64+
outFactory: outFactory,
6265
}
6366
}
6467

@@ -206,7 +209,7 @@ func (s *channelManager) ensureChannelWithSpace(l1Head eth.BlockID) error {
206209
return nil
207210
}
208211

209-
pc, err := newChannel(s.log, s.metr, s.cfg, s.rollupCfg, s.l1OriginLastClosedChannel.Number)
212+
pc, err := newChannel(s.log, s.metr, s.cfg, s.rollupCfg, s.outFactory, s.l1OriginLastClosedChannel.Number)
210213
if err != nil {
211214
return fmt.Errorf("creating new channel: %w", err)
212215
}

op-batcher/batcher/channel_manager_test.go

Lines changed: 10 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -62,7 +62,7 @@ func TestChannelManagerBatchType(t *testing.T) {
6262
// detects a reorg when it has cached L1 blocks.
6363
func ChannelManagerReturnsErrReorg(t *testing.T, batchType uint) {
6464
log := testlog.Logger(t, log.LevelCrit)
65-
m := NewChannelManager(log, metrics.NoopMetrics, ChannelConfig{BatchType: batchType}, &rollup.Config{})
65+
m := NewChannelManager(log, metrics.NoopMetrics, ChannelConfig{BatchType: batchType}, &rollup.Config{}, nil)
6666
m.Clear(eth.BlockID{})
6767

6868
a := types.NewBlock(&types.Header{
@@ -95,7 +95,7 @@ func ChannelManagerReturnsErrReorgWhenDrained(t *testing.T, batchType uint) {
9595
log := testlog.Logger(t, log.LevelCrit)
9696
cfg := channelManagerTestConfig(120_000, batchType)
9797
cfg.CompressorConfig.TargetOutputSize = 1 // full on first block
98-
m := NewChannelManager(log, metrics.NoopMetrics, cfg, &rollup.Config{})
98+
m := NewChannelManager(log, metrics.NoopMetrics, cfg, &rollup.Config{}, nil)
9999
m.Clear(eth.BlockID{})
100100

101101
a := newMiniL2Block(0)
@@ -124,7 +124,7 @@ func ChannelManager_Clear(t *testing.T, batchType uint) {
124124
// clearing confirmed transactions, and resetting the pendingChannels map
125125
cfg.ChannelTimeout = 10
126126
cfg.InitRatioCompressor(1, derive.Zlib)
127-
m := NewChannelManager(log, metrics.NoopMetrics, cfg, &defaultTestRollupConfig)
127+
m := NewChannelManager(log, metrics.NoopMetrics, cfg, &defaultTestRollupConfig, nil)
128128

129129
// Channel Manager state should be empty by default
130130
require.Empty(m.blocks)
@@ -195,7 +195,7 @@ func ChannelManager_TxResend(t *testing.T, batchType uint) {
195195
log := testlog.Logger(t, log.LevelError)
196196
cfg := channelManagerTestConfig(120_000, batchType)
197197
cfg.CompressorConfig.TargetOutputSize = 1 // full on first block
198-
m := NewChannelManager(log, metrics.NoopMetrics, cfg, &defaultTestRollupConfig)
198+
m := NewChannelManager(log, metrics.NoopMetrics, cfg, &defaultTestRollupConfig, nil)
199199
m.Clear(eth.BlockID{})
200200

201201
a := derivetest.RandomL2BlockWithChainId(rng, 4, defaultTestRollupConfig.L2ChainID)
@@ -235,6 +235,7 @@ func ChannelManagerCloseBeforeFirstUse(t *testing.T, batchType uint) {
235235
m := NewChannelManager(log, metrics.NoopMetrics,
236236
channelManagerTestConfig(10000, batchType),
237237
&defaultTestRollupConfig,
238+
nil,
238239
)
239240
m.Clear(eth.BlockID{})
240241

@@ -258,7 +259,7 @@ func ChannelManagerCloseNoPendingChannel(t *testing.T, batchType uint) {
258259
cfg := channelManagerTestConfig(10000, batchType)
259260
cfg.CompressorConfig.TargetOutputSize = 1 // full on first block
260261
cfg.ChannelTimeout = 1000
261-
m := NewChannelManager(log, metrics.NoopMetrics, cfg, &defaultTestRollupConfig)
262+
m := NewChannelManager(log, metrics.NoopMetrics, cfg, &defaultTestRollupConfig, nil)
262263
m.Clear(eth.BlockID{})
263264
a := newMiniL2Block(0)
264265
b := newMiniL2BlockWithNumberParent(0, big.NewInt(1), a.Hash())
@@ -294,7 +295,7 @@ func ChannelManagerClosePendingChannel(t *testing.T, batchType uint) {
294295
log := testlog.Logger(t, log.LevelError)
295296
cfg := channelManagerTestConfig(10_000, batchType)
296297
cfg.ChannelTimeout = 1000
297-
m := NewChannelManager(log, metrics.NoopMetrics, cfg, &defaultTestRollupConfig)
298+
m := NewChannelManager(log, metrics.NoopMetrics, cfg, &defaultTestRollupConfig, nil)
298299
m.Clear(eth.BlockID{})
299300

300301
numTx := 20 // Adjust number of txs to make 2 frames
@@ -346,7 +347,7 @@ func TestChannelManager_Close_PartiallyPendingChannel(t *testing.T) {
346347
TargetNumFrames: 100,
347348
}
348349
cfg.InitNoneCompressor()
349-
m := NewChannelManager(log, metrics.NoopMetrics, cfg, &defaultTestRollupConfig)
350+
m := NewChannelManager(log, metrics.NoopMetrics, cfg, &defaultTestRollupConfig, nil)
350351
m.Clear(eth.BlockID{})
351352

352353
numTx := 3 // Adjust number of txs to make 2 frames
@@ -398,7 +399,7 @@ func ChannelManagerCloseAllTxsFailed(t *testing.T, batchType uint) {
398399
cfg := channelManagerTestConfig(100, batchType)
399400
cfg.TargetNumFrames = 1000
400401
cfg.InitNoneCompressor()
401-
m := NewChannelManager(log, metrics.NoopMetrics, cfg, &defaultTestRollupConfig)
402+
m := NewChannelManager(log, metrics.NoopMetrics, cfg, &defaultTestRollupConfig, nil)
402403
m.Clear(eth.BlockID{})
403404

404405
a := derivetest.RandomL2BlockWithChainId(rng, 1000, defaultTestRollupConfig.L2ChainID)
@@ -471,7 +472,7 @@ func TestChannelManager_ChannelCreation(t *testing.T) {
471472
} {
472473
test := tt
473474
t.Run(test.name, func(t *testing.T) {
474-
m := NewChannelManager(l, metrics.NoopMetrics, cfg, &defaultTestRollupConfig)
475+
m := NewChannelManager(l, metrics.NoopMetrics, cfg, &defaultTestRollupConfig, nil)
475476

476477
m.l1OriginLastClosedChannel = test.safeL1Block
477478
require.Nil(t, m.currentChannel)

0 commit comments

Comments
 (0)