@arbitrum/nitro-contracts 1.0.0-beta.5 → 1.0.0-beta.6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (54) hide show
  1. package/package.json +2 -1
  2. package/src/bridge/Bridge.sol +127 -32
  3. package/src/bridge/IBridge.sol +40 -6
  4. package/src/bridge/{IMessageProvider.sol → IDelayedMessageProvider.sol} +2 -3
  5. package/src/bridge/IInbox.sol +23 -2
  6. package/src/bridge/IOwnable.sol +9 -0
  7. package/src/bridge/ISequencerInbox.sol +36 -9
  8. package/src/bridge/Inbox.sol +131 -45
  9. package/src/bridge/Outbox.sol +134 -31
  10. package/src/bridge/SequencerInbox.sol +159 -60
  11. package/src/challenge/ChallengeLib.sol +0 -2
  12. package/src/challenge/ChallengeManager.sol +4 -8
  13. package/src/challenge/IChallengeManager.sol +1 -1
  14. package/src/libraries/Error.sol +6 -0
  15. package/src/libraries/IGasRefunder.sol +12 -13
  16. package/src/libraries/MerkleLib.sol +11 -2
  17. package/src/libraries/MessageTypes.sol +1 -0
  18. package/src/mocks/BridgeStub.sol +67 -21
  19. package/src/mocks/InboxStub.sol +3 -9
  20. package/src/mocks/SequencerInboxStub.sol +10 -8
  21. package/src/mocks/Simple.sol +8 -0
  22. package/src/node-interface/NodeInterface.sol +32 -5
  23. package/src/osp/IOneStepProver.sol +1 -2
  24. package/src/osp/OneStepProver0.sol +1 -87
  25. package/src/osp/OneStepProverHostIo.sol +5 -6
  26. package/src/osp/OneStepProverMath.sol +37 -27
  27. package/src/osp/OneStepProverMemory.sol +3 -4
  28. package/src/precompiles/ArbAggregator.sol +23 -33
  29. package/src/precompiles/ArbBLS.sol +1 -43
  30. package/src/precompiles/ArbGasInfo.sol +1 -19
  31. package/src/precompiles/ArbOwner.sol +12 -15
  32. package/src/precompiles/ArbRetryableTx.sol +10 -1
  33. package/src/precompiles/ArbosActs.sol +9 -2
  34. package/src/rollup/BridgeCreator.sol +23 -28
  35. package/src/rollup/IRollupCore.sol +3 -3
  36. package/src/rollup/{IRollupEventBridge.sol → IRollupEventInbox.sol} +2 -2
  37. package/src/rollup/IRollupLogic.sol +21 -18
  38. package/src/rollup/RollupAdminLogic.sol +30 -34
  39. package/src/rollup/RollupCore.sol +15 -7
  40. package/src/rollup/RollupCreator.sol +21 -11
  41. package/src/rollup/{RollupEventBridge.sol → RollupEventInbox.sol} +10 -10
  42. package/src/rollup/RollupLib.sol +20 -5
  43. package/src/rollup/RollupUserLogic.sol +9 -18
  44. package/src/rollup/ValidatorWallet.sol +124 -8
  45. package/src/rollup/ValidatorWalletCreator.sol +11 -6
  46. package/src/state/Deserialize.sol +3 -22
  47. package/src/state/Instructions.sol +2 -10
  48. package/src/state/Machine.sol +0 -4
  49. package/src/state/ModuleMemory.sol +2 -1
  50. package/src/state/Value.sol +2 -3
  51. package/src/test-helpers/BridgeTester.sol +223 -0
  52. package/src/test-helpers/OutboxWithoutOptTester.sol +188 -0
  53. package/src/test-helpers/RollupMock.sol +21 -0
  54. package/src/state/PcStack.sol +0 -32
@@ -8,24 +8,26 @@ import "../bridge/SequencerInbox.sol";
8
8
 
9
9
  contract SequencerInboxStub is SequencerInbox {
10
10
  constructor(
11
- IBridge delayedBridge_,
11
+ IBridge bridge_,
12
12
  address sequencer_,
13
13
  ISequencerInbox.MaxTimeVariation memory maxTimeVariation_
14
14
  ) {
15
- delayedBridge = delayedBridge_;
16
- rollup = msg.sender;
15
+ bridge = bridge_;
16
+ rollup = IOwnable(msg.sender);
17
17
  maxTimeVariation = maxTimeVariation_;
18
18
  isBatchPoster[sequencer_] = true;
19
19
  }
20
20
 
21
21
  function addInitMessage() external {
22
22
  (bytes32 dataHash, TimeBounds memory timeBounds) = formEmptyDataHash(0);
23
- (bytes32 beforeAcc, bytes32 delayedAcc, bytes32 afterAcc) = addSequencerL2BatchImpl(
24
- dataHash,
25
- 0
26
- );
23
+ (
24
+ uint256 sequencerMessageCount,
25
+ bytes32 beforeAcc,
26
+ bytes32 delayedAcc,
27
+ bytes32 afterAcc
28
+ ) = addSequencerL2BatchImpl(dataHash, 0, 0);
27
29
  emit SequencerBatchDelivered(
28
- inboxAccs.length - 1,
30
+ sequencerMessageCount,
29
31
  beforeAcc,
30
32
  afterAcc,
31
33
  delayedAcc,
@@ -4,10 +4,13 @@
4
4
 
5
5
  pragma solidity ^0.8.0;
6
6
 
7
+ import "../precompiles/ArbRetryableTx.sol";
8
+
7
9
  contract Simple {
8
10
  uint64 public counter;
9
11
 
10
12
  event CounterEvent(uint64 count);
13
+ event RedeemedEvent(address caller, address redeemer);
11
14
  event NullEvent();
12
15
 
13
16
  function increment() external {
@@ -19,6 +22,11 @@ contract Simple {
19
22
  emit CounterEvent(counter);
20
23
  }
21
24
 
25
+ function incrementRedeem() external {
26
+ counter++;
27
+ emit RedeemedEvent(msg.sender, ArbRetryableTx(address(110)).getCurrentRedeemer());
28
+ }
29
+
22
30
  function emitNullEvent() external {
23
31
  emit NullEvent();
24
32
  }
@@ -11,7 +11,8 @@ pragma solidity >=0.4.21 <0.9.0;
11
11
  */
12
12
  interface NodeInterface {
13
13
  /**
14
- * @notice Estimate the cost of putting a message in the L2 inbox that is reexecuted
14
+ * @notice Estimate the cost of putting a message in the L2 inbox that is reexecuted.
15
+ * Use eth_estimateGas to call.
15
16
  * @param sender sender of the L1 and L2 transaction
16
17
  * @param deposit amount to deposit to sender in L2
17
18
  * @param to destination L2 contract address
@@ -31,7 +32,8 @@ interface NodeInterface {
31
32
  ) external;
32
33
 
33
34
  /**
34
- * @notice Constructs an outbox proof of an l2->l1 send's existence in the outbox accumulator
35
+ * @notice Constructs an outbox proof of an l2->l1 send's existence in the outbox accumulator.
36
+ * Use eth_call to call.
35
37
  * @param size the number of elements in the accumulator
36
38
  * @param leaf the position of the send in the accumulator
37
39
  * @return send the l2->l1 send's hash
@@ -48,8 +50,9 @@ interface NodeInterface {
48
50
  );
49
51
 
50
52
  /**
51
- * @notice Finds the L1 batch containing a requested L2 block, reverting if none does
52
- * Throws if block doesn't exist, or if block number is 0
53
+ * @notice Finds the L1 batch containing a requested L2 block, reverting if none does.
54
+ * Use eth_call to call.
55
+ * Throws if block doesn't exist, or if block number is 0. Use eth_call
53
56
  * @param blockNum The L2 block being queried
54
57
  * @return batch The L1 block containing the requested L2 block
55
58
  */
@@ -59,9 +62,33 @@ interface NodeInterface {
59
62
  * @notice Gets the number of L1 confirmations of the sequencer batch producing the requested L2 block
60
63
  * This gets the number of L1 confirmations for the input message producing the L2 block,
61
64
  * which happens well before the L1 rollup contract confirms the L2 block.
62
- * Throws if block doesnt exist in the L2 chain.
65
+ * Throws if block doesnt exist in the L2 chain. Use eth_call to call.
63
66
  * @param blockHash The hash of the L2 block being queried
64
67
  * @return confirmations The number of L1 confirmations the sequencer batch has. Returns 0 if block not yet included in an L1 batch.
65
68
  */
66
69
  function getL1Confirmations(bytes32 blockHash) external view returns (uint64 confirmations);
70
+
71
+ /**
72
+ * @notice Same as native gas estimation, but with additional info on the l1 costs. Use eth_call to call.
73
+ * @param data the tx's calldata. Everything else like "From" and "Gas" are copied over
74
+ * @param to the tx's "To" (ignored when contractCreation is true)
75
+ * @param contractCreation whether "To" is omitted
76
+ * @return gasEstimate an estimate of the total amount of gas needed for this tx
77
+ * @return gasEstimateForL1 an estimate of the amount of gas needed for the l1 component of this tx
78
+ * @return baseFee the l2 base fee
79
+ * @return l1BaseFeeEstimate ArbOS's l1 estimate of the l1 base fee
80
+ */
81
+ function gasEstimateComponents(
82
+ address to,
83
+ bool contractCreation,
84
+ bytes calldata data
85
+ )
86
+ external
87
+ payable
88
+ returns (
89
+ uint64 gasEstimate,
90
+ uint64 gasEstimateForL1,
91
+ uint256 baseFee,
92
+ uint256 l1BaseFeeEstimate
93
+ );
67
94
  }
@@ -12,8 +12,7 @@ import "../bridge/IBridge.sol";
12
12
 
13
13
  struct ExecutionContext {
14
14
  uint256 maxInboxMessagesRead;
15
- ISequencerInbox sequencerInbox;
16
- IBridge delayedBridge;
15
+ IBridge bridge;
17
16
  }
18
17
 
19
18
  abstract contract IOneStepProver {
@@ -12,7 +12,6 @@ import "./IOneStepProver.sol";
12
12
 
13
13
  contract OneStepProver0 is IOneStepProver {
14
14
  using MerkleProofLib for MerkleProof;
15
- using PcStackLib for PcStack;
16
15
  using StackFrameLib for StackFrameWindow;
17
16
  using ValueLib for Value;
18
17
  using ValueStackLib for ValueStack;
@@ -51,8 +50,6 @@ contract OneStepProver0 is IOneStepProver {
51
50
  ty = ValueType.F32;
52
51
  } else if (opcode == Instructions.F64_CONST) {
53
52
  ty = ValueType.F64;
54
- } else if (opcode == Instructions.PUSH_STACK_BOUNDARY) {
55
- ty = ValueType.STACK_BOUNDARY;
56
53
  } else {
57
54
  revert("CONST_PUSH_INVALID_OPCODE");
58
55
  }
@@ -86,39 +83,6 @@ contract OneStepProver0 is IOneStepProver {
86
83
  }
87
84
  }
88
85
 
89
- function executeBlock(
90
- Machine memory mach,
91
- Module memory,
92
- Instruction calldata inst,
93
- bytes calldata
94
- ) internal pure {
95
- uint32 targetPc = uint32(inst.argumentData);
96
- require(targetPc == inst.argumentData, "BAD_BLOCK_PC");
97
- mach.blockStack.push(targetPc);
98
- }
99
-
100
- function executeBranch(
101
- Machine memory mach,
102
- Module memory,
103
- Instruction calldata,
104
- bytes calldata
105
- ) internal pure {
106
- mach.functionPc = mach.blockStack.pop();
107
- }
108
-
109
- function executeBranchIf(
110
- Machine memory mach,
111
- Module memory,
112
- Instruction calldata,
113
- bytes calldata
114
- ) internal pure {
115
- uint32 cond = mach.valueStack.pop().assumeI32();
116
- if (cond != 0) {
117
- // Jump to target
118
- mach.functionPc = mach.blockStack.pop();
119
- }
120
- }
121
-
122
86
  function executeReturn(
123
87
  Machine memory mach,
124
88
  Module memory,
@@ -419,27 +383,6 @@ contract OneStepProver0 is IOneStepProver {
419
383
  );
420
384
  }
421
385
 
422
- function executeEndBlock(
423
- Machine memory mach,
424
- Module memory,
425
- Instruction calldata,
426
- bytes calldata
427
- ) internal pure {
428
- mach.blockStack.pop();
429
- }
430
-
431
- function executeEndBlockIf(
432
- Machine memory mach,
433
- Module memory,
434
- Instruction calldata,
435
- bytes calldata
436
- ) internal pure {
437
- uint32 cond = mach.valueStack.peek().assumeI32();
438
- if (cond != 0) {
439
- mach.blockStack.pop();
440
- }
441
- }
442
-
443
386
  function executeInitFrame(
444
387
  Machine memory mach,
445
388
  Module memory,
@@ -476,20 +419,6 @@ contract OneStepProver0 is IOneStepProver {
476
419
  }
477
420
  }
478
421
 
479
- function executeIsStackBoundary(
480
- Machine memory mach,
481
- Module memory,
482
- Instruction calldata,
483
- bytes calldata
484
- ) internal pure {
485
- Value memory val = mach.valueStack.pop();
486
- uint32 newContents = 0;
487
- if (val.valueType == ValueType.STACK_BOUNDARY) {
488
- newContents = 1;
489
- }
490
- mach.valueStack.push(ValueLib.newI32(newContents));
491
- }
492
-
493
422
  function executeDup(
494
423
  Machine memory mach,
495
424
  Module memory,
@@ -519,12 +448,6 @@ contract OneStepProver0 is IOneStepProver {
519
448
  impl = executeUnreachable;
520
449
  } else if (opcode == Instructions.NOP) {
521
450
  impl = executeNop;
522
- } else if (opcode == Instructions.BLOCK) {
523
- impl = executeBlock;
524
- } else if (opcode == Instructions.BRANCH) {
525
- impl = executeBranch;
526
- } else if (opcode == Instructions.BRANCH_IF) {
527
- impl = executeBranchIf;
528
451
  } else if (opcode == Instructions.RETURN) {
529
452
  impl = executeReturn;
530
453
  } else if (opcode == Instructions.CALL) {
@@ -535,10 +458,6 @@ contract OneStepProver0 is IOneStepProver {
535
458
  impl = executeCallerModuleInternalCall;
536
459
  } else if (opcode == Instructions.CALL_INDIRECT) {
537
460
  impl = executeCallIndirect;
538
- } else if (opcode == Instructions.END_BLOCK) {
539
- impl = executeEndBlock;
540
- } else if (opcode == Instructions.END_BLOCK_IF) {
541
- impl = executeEndBlockIf;
542
461
  } else if (opcode == Instructions.ARBITRARY_JUMP) {
543
462
  impl = executeArbitraryJump;
544
463
  } else if (opcode == Instructions.ARBITRARY_JUMP_IF) {
@@ -557,18 +476,13 @@ contract OneStepProver0 is IOneStepProver {
557
476
  impl = executeDrop;
558
477
  } else if (opcode == Instructions.SELECT) {
559
478
  impl = executeSelect;
560
- } else if (
561
- (opcode >= Instructions.I32_CONST && opcode <= Instructions.F64_CONST) ||
562
- opcode == Instructions.PUSH_STACK_BOUNDARY
563
- ) {
479
+ } else if (opcode >= Instructions.I32_CONST && opcode <= Instructions.F64_CONST) {
564
480
  impl = executeConstPush;
565
481
  } else if (
566
482
  opcode == Instructions.MOVE_FROM_STACK_TO_INTERNAL ||
567
483
  opcode == Instructions.MOVE_FROM_INTERNAL_TO_STACK
568
484
  ) {
569
485
  impl = executeMoveInternal;
570
- } else if (opcode == Instructions.IS_STACK_BOUNDARY) {
571
- impl = executeIsStackBoundary;
572
486
  } else if (opcode == Instructions.DUP) {
573
487
  impl = executeDup;
574
488
  } else {
@@ -10,7 +10,6 @@ import "../state/Deserialize.sol";
10
10
  import "./IOneStepProver.sol";
11
11
  import "../bridge/Messages.sol";
12
12
  import "../bridge/IBridge.sol";
13
- import "../bridge/ISequencerInbox.sol";
14
13
 
15
14
  contract OneStepProverHostIo is IOneStepProver {
16
15
  using GlobalStateLib for GlobalState;
@@ -165,13 +164,13 @@ contract OneStepProverHostIo is IOneStepProver {
165
164
  bytes32 delayedAcc;
166
165
 
167
166
  if (msgIndex > 0) {
168
- beforeAcc = execCtx.sequencerInbox.inboxAccs(msgIndex - 1);
167
+ beforeAcc = execCtx.bridge.sequencerInboxAccs(msgIndex - 1);
169
168
  }
170
169
  if (afterDelayedMsg > 0) {
171
- delayedAcc = execCtx.delayedBridge.inboxAccs(afterDelayedMsg - 1);
170
+ delayedAcc = execCtx.bridge.delayedInboxAccs(afterDelayedMsg - 1);
172
171
  }
173
172
  bytes32 acc = keccak256(abi.encodePacked(beforeAcc, messageHash, delayedAcc));
174
- require(acc == execCtx.sequencerInbox.inboxAccs(msgIndex), "BAD_SEQINBOX_MESSAGE");
173
+ require(acc == execCtx.bridge.sequencerInboxAccs(msgIndex), "BAD_SEQINBOX_MESSAGE");
175
174
  return true;
176
175
  }
177
176
 
@@ -185,7 +184,7 @@ contract OneStepProverHostIo is IOneStepProver {
185
184
  bytes32 beforeAcc;
186
185
 
187
186
  if (msgIndex > 0) {
188
- beforeAcc = execCtx.delayedBridge.inboxAccs(msgIndex - 1);
187
+ beforeAcc = execCtx.bridge.delayedInboxAccs(msgIndex - 1);
189
188
  }
190
189
 
191
190
  bytes32 messageDataHash = keccak256(message[DELAYED_HEADER_LEN:]);
@@ -198,7 +197,7 @@ contract OneStepProverHostIo is IOneStepProver {
198
197
  );
199
198
  bytes32 acc = Messages.accumulateInboxMessage(beforeAcc, messageHash);
200
199
 
201
- require(acc == execCtx.delayedBridge.inboxAccs(msgIndex), "BAD_DELAYED_MESSAGE");
200
+ require(acc == execCtx.bridge.delayedInboxAccs(msgIndex), "BAD_DELAYED_MESSAGE");
202
201
  return true;
203
202
  }
204
203
 
@@ -210,38 +210,38 @@ contract OneStepProverMath is IOneStepProver {
210
210
  uint64 a,
211
211
  uint64 b,
212
212
  uint16 opcodeOffset
213
- ) internal pure returns (uint64) {
213
+ ) internal pure returns (uint64, bool) {
214
214
  unchecked {
215
215
  if (opcodeOffset == 0) {
216
216
  // add
217
- return a + b;
217
+ return (a + b, false);
218
218
  } else if (opcodeOffset == 1) {
219
219
  // sub
220
- return a - b;
220
+ return (a - b, false);
221
221
  } else if (opcodeOffset == 2) {
222
222
  // mul
223
- return a * b;
223
+ return (a * b, false);
224
224
  } else if (opcodeOffset == 4) {
225
225
  // div_u
226
226
  if (b == 0) {
227
- return 0;
227
+ return (0, true);
228
228
  }
229
- return a / b;
229
+ return (a / b, false);
230
230
  } else if (opcodeOffset == 6) {
231
231
  // rem_u
232
232
  if (b == 0) {
233
- return 0;
233
+ return (0, true);
234
234
  }
235
- return a % b;
235
+ return (a % b, false);
236
236
  } else if (opcodeOffset == 7) {
237
237
  // and
238
- return a & b;
238
+ return (a & b, false);
239
239
  } else if (opcodeOffset == 8) {
240
240
  // or
241
- return a | b;
241
+ return (a | b, false);
242
242
  } else if (opcodeOffset == 9) {
243
243
  // xor
244
- return a ^ b;
244
+ return (a ^ b, false);
245
245
  } else {
246
246
  revert("INVALID_GENERIC_BIN_OP");
247
247
  }
@@ -263,18 +263,18 @@ contract OneStepProverMath is IOneStepProver {
263
263
  unchecked {
264
264
  if (opcodeOffset == 3) {
265
265
  // div_s
266
- if (b == 0) {
267
- res = 0;
268
- } else {
269
- res = uint32(int32(a) / int32(b));
266
+ if (b == 0 || (int32(a) == -2147483648 && int32(b) == -1)) {
267
+ mach.status = MachineStatus.ERRORED;
268
+ return;
270
269
  }
270
+ res = uint32(int32(a) / int32(b));
271
271
  } else if (opcodeOffset == 5) {
272
272
  // rem_s
273
273
  if (b == 0) {
274
- res = 0;
275
- } else {
276
- res = uint32(int32(a) % int32(b));
274
+ mach.status = MachineStatus.ERRORED;
275
+ return;
277
276
  }
277
+ res = uint32(int32(a) % int32(b));
278
278
  } else if (opcodeOffset == 10) {
279
279
  // shl
280
280
  res = a << (b % 32);
@@ -291,7 +291,12 @@ contract OneStepProverMath is IOneStepProver {
291
291
  // rotr
292
292
  res = rotr32(a, b);
293
293
  } else {
294
- res = uint32(genericBinOp(a, b, opcodeOffset));
294
+ (uint64 computed, bool err) = genericBinOp(a, b, opcodeOffset);
295
+ if (err) {
296
+ mach.status = MachineStatus.ERRORED;
297
+ return;
298
+ }
299
+ res = uint32(computed);
295
300
  }
296
301
  }
297
302
 
@@ -313,18 +318,18 @@ contract OneStepProverMath is IOneStepProver {
313
318
  unchecked {
314
319
  if (opcodeOffset == 3) {
315
320
  // div_s
316
- if (b == 0) {
317
- res = 0;
318
- } else {
319
- res = uint64(int64(a) / int64(b));
321
+ if (b == 0 || (int64(a) == -9223372036854775808 && int64(b) == -1)) {
322
+ mach.status = MachineStatus.ERRORED;
323
+ return;
320
324
  }
325
+ res = uint64(int64(a) / int64(b));
321
326
  } else if (opcodeOffset == 5) {
322
327
  // rem_s
323
328
  if (b == 0) {
324
- res = 0;
325
- } else {
326
- res = uint64(int64(a) % int64(b));
329
+ mach.status = MachineStatus.ERRORED;
330
+ return;
327
331
  }
332
+ res = uint64(int64(a) % int64(b));
328
333
  } else if (opcodeOffset == 10) {
329
334
  // shl
330
335
  res = a << (b % 64);
@@ -341,7 +346,12 @@ contract OneStepProverMath is IOneStepProver {
341
346
  // rotr
342
347
  res = rotr64(a, b);
343
348
  } else {
344
- res = genericBinOp(a, b, opcodeOffset);
349
+ bool err;
350
+ (res, err) = genericBinOp(a, b, opcodeOffset);
351
+ if (err) {
352
+ mach.status = MachineStatus.ERRORED;
353
+ return;
354
+ }
345
355
  }
346
356
  }
347
357
 
@@ -271,10 +271,9 @@ contract OneStepProverMemory is IOneStepProver {
271
271
  uint32 oldPages = uint32(mod.moduleMemory.size / PAGE_SIZE);
272
272
  uint32 growingPages = mach.valueStack.pop().assumeI32();
273
273
  // Safe as the input integers are too small to overflow a uint256
274
- uint256 newSize = (uint256(oldPages) + uint256(growingPages)) * PAGE_SIZE;
275
- // Note: we require the size remain *below* 2^32, meaning the actual limit is 2^32-PAGE_SIZE
276
- if (newSize < (1 << 32)) {
277
- mod.moduleMemory.size = uint64(newSize);
274
+ uint256 newSize = uint256(oldPages) + uint256(growingPages);
275
+ if (newSize <= mod.moduleMemory.maxSize) {
276
+ mod.moduleMemory.size = uint64(newSize * PAGE_SIZE);
278
277
  mach.valueStack.push(ValueLib.newI32(oldPages));
279
278
  } else {
280
279
  mach.valueStack.push(ValueLib.newI32(~uint32(0)));
@@ -7,45 +7,35 @@ pragma solidity >=0.4.21 <0.9.0;
7
7
  /// @title Provides aggregators and their users methods for configuring how they participate in L1 aggregation.
8
8
  /// @notice Precompiled contract that exists in every Arbitrum chain at 0x000000000000000000000000000000000000006d
9
9
  interface ArbAggregator {
10
- /// @notice Get the preferred aggregator for an address.
11
- /// @param addr The address to fetch aggregator for
12
- /// @return (preferredAggregatorAddress, isDefault)
13
- /// isDefault is true if addr is set to prefer the default aggregator
10
+ /// @notice Deprecated, customization of preferred aggregator is no longer supported
11
+ /// @notice Get the address of an arbitrarily chosen batch poster.
12
+ /// @param addr ignored
13
+ /// @return (batchPosterAddress, true)
14
14
  function getPreferredAggregator(address addr) external view returns (address, bool);
15
15
 
16
- /// @notice Set the caller's preferred aggregator.
17
- /// @param prefAgg If prefAgg is zero, this sets the caller to prefer the default aggregator
18
- function setPreferredAggregator(address prefAgg) external;
19
-
16
+ /// @notice Deprecated, there is no longer a single preferred aggregator, use getBatchPosters instead
20
17
  /// @notice Get default aggregator.
21
18
  function getDefaultAggregator() external view returns (address);
22
19
 
23
- /// @notice Set the preferred aggregator.
24
- /// This reverts unless called by the aggregator, its fee collector, or a chain owner
25
- /// @param newDefault New default aggregator
26
- function setDefaultAggregator(address newDefault) external;
27
-
28
- /// @notice Get the aggregator's compression ratio
29
- /// @param aggregator The aggregator to fetch the compression ratio for
30
- /// @return The compression ratio, measured in basis points
31
- function getCompressionRatio(address aggregator) external view returns (uint64);
32
-
33
- /// @notice Set the aggregator's compression ratio
34
- /// This reverts unless called by the aggregator, its fee collector, or a chain owner
35
- /// @param aggregator The aggregator to set the compression ratio for
36
- /// @param ratio The compression ratio, measured in basis points
37
- function setCompressionRatio(address aggregator, uint64 ratio) external;
38
-
39
- /// @notice Get the address where fees to aggregator are sent.
40
- /// @param aggregator The aggregator to get the fee collector for
41
- /// @return The fee collectors address. This will often but not always be the same as the aggregator's address.
42
- function getFeeCollector(address aggregator) external view returns (address);
43
-
44
- /// @notice Set the address where fees to aggregator are sent.
45
- /// This reverts unless called by the aggregator, its fee collector, or a chain owner
46
- /// @param aggregator The aggregator to set the fee collector for
20
+ /// @notice Get a list of all current batch posters
21
+ /// @return Batch poster addresses
22
+ function getBatchPosters() external view returns (address[] memory);
23
+
24
+ /// @notice Adds newBatchPoster as a batch poster
25
+ /// This reverts unless called by a chain owner
26
+ /// @param newBatchPoster New batch poster
27
+ function addBatchPoster(address newBatchPoster) external;
28
+
29
+ /// @notice Get the address where fees to batchPoster are sent.
30
+ /// @param batchPoster The batch poster to get the fee collector for
31
+ /// @return The fee collectors address. This will sometimes but not always be the same as the batch poster's address.
32
+ function getFeeCollector(address batchPoster) external view returns (address);
33
+
34
+ /// @notice Set the address where fees to batchPoster are sent.
35
+ /// This reverts unless called by the batch poster, its fee collector, or a chain owner
36
+ /// @param batchPoster The batch poster to set the fee collector for
47
37
  /// @param newFeeCollector The new fee collector to set
48
- function setFeeCollector(address aggregator, address newFeeCollector) external;
38
+ function setFeeCollector(address batchPoster, address newFeeCollector) external;
49
39
 
50
40
  /// @notice Deprecated, always returns zero
51
41
  /// @notice Get the tx base fee (in approximate L1 gas) for aggregator
@@ -4,50 +4,8 @@
4
4
 
5
5
  pragma solidity >=0.4.21 <0.9.0;
6
6
 
7
- /// @title Provides a registry of BLS public keys for accounts.
7
+ /// @title Disabled precompile, formerly used to register BLS public keys.
8
8
  /// @notice Precompiled contract that exists in every Arbitrum chain at 0x0000000000000000000000000000000000000067.
9
9
  interface ArbBLS {
10
- /// @notice Deprecated -- equivalent to registerAltBN128
11
- function register(
12
- uint256 x0,
13
- uint256 x1,
14
- uint256 y0,
15
- uint256 y1
16
- ) external; // DEPRECATED
17
10
 
18
- /// @notice Deprecated -- equivalent to getAltBN128
19
- function getPublicKey(address addr)
20
- external
21
- view
22
- returns (
23
- uint256,
24
- uint256,
25
- uint256,
26
- uint256
27
- ); // DEPRECATED
28
-
29
- /// @notice Associate an AltBN128 public key with the caller's address
30
- function registerAltBN128(
31
- uint256 x0,
32
- uint256 x1,
33
- uint256 y0,
34
- uint256 y1
35
- ) external;
36
-
37
- /// @notice Get the AltBN128 public key associated with an address (revert if there isn't one)
38
- function getAltBN128(address addr)
39
- external
40
- view
41
- returns (
42
- uint256,
43
- uint256,
44
- uint256,
45
- uint256
46
- );
47
-
48
- /// @notice Associate a BLS 12-381 public key with the caller's address
49
- function registerBLS12381(bytes calldata key) external;
50
-
51
- /// @notice Get the BLS 12-381 public key associated with an address (revert if there isn't one)
52
- function getBLS12381(address addr) external view returns (bytes memory);
53
11
  }
@@ -75,7 +75,7 @@ interface ArbGasInfo {
75
75
  uint256
76
76
  );
77
77
 
78
- /// @notice Get the gas accounting parameters
78
+ /// @notice Get the gas accounting parameters. `gasPoolMax` is always zero, as the exponential pricing model has no such notion.
79
79
  /// @return (speedLimitPerSecond, gasPoolMax, maxTxGasLimit)
80
80
  function getGasAccountingParams()
81
81
  external
@@ -89,21 +89,6 @@ interface ArbGasInfo {
89
89
  /// @notice Get the minimum gas price needed for a tx to succeed
90
90
  function getMinimumGasPrice() external view returns (uint256);
91
91
 
92
- /// @notice Get the number of seconds worth of the speed limit the gas pool contains
93
- function getGasPoolSeconds() external view returns (uint64);
94
-
95
- /// @notice Get the target fullness in bips the pricing model will try to keep the pool at
96
- function getGasPoolTarget() external view returns (uint64);
97
-
98
- /// @notice Get the extent in bips to which the pricing model favors filling the pool over increasing speeds
99
- function getGasPoolWeight() external view returns (uint64);
100
-
101
- /// @notice Get ArbOS's estimate of the amount of gas being burnt per second
102
- function getRateEstimate() external view returns (uint64);
103
-
104
- /// @notice Get how slowly ArbOS updates its estimate the amount of gas being burnt per second
105
- function getRateEstimateInertia() external view returns (uint64);
106
-
107
92
  /// @notice Get ArbOS's estimate of the L1 basefee in wei
108
93
  function getL1BaseFeeEstimate() external view returns (uint256);
109
94
 
@@ -116,9 +101,6 @@ interface ArbGasInfo {
116
101
  /// @notice Get L1 gas fees paid by the current transaction
117
102
  function getCurrentTxL1GasFees() external view returns (uint256);
118
103
 
119
- /// @notice Get the amount of gas remaining in the gas pool
120
- function getGasPool() external view returns (int64);
121
-
122
104
  /// @notice Get the backlogged amount of gas burnt in excess of the speed limit
123
105
  function getGasBacklog() external view returns (uint64);
124
106