@arbitrum/nitro-contracts 1.0.0-beta.1

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 (113) hide show
  1. package/.prettierrc +5 -0
  2. package/.solhint.json +18 -0
  3. package/deploy/BridgeStubCreator.js +10 -0
  4. package/deploy/HashProofHelper.js +13 -0
  5. package/deploy/InboxStubCreator.js +17 -0
  6. package/deploy/OneStepProofEntryCreator.js +19 -0
  7. package/deploy/OneStepProver0Creator.js +14 -0
  8. package/deploy/OneStepProverHostIoCreator.js +14 -0
  9. package/deploy/OneStepProverMathCreator.js +14 -0
  10. package/deploy/OneStepProverMemoryCreator.js +14 -0
  11. package/deploy/SequencerInboxStubCreator.js +13 -0
  12. package/deploy/ValueArrayTesterCreator.js +13 -0
  13. package/hardhat.config.ts +47 -0
  14. package/hardhat.prod-config.js +18 -0
  15. package/package.json +49 -0
  16. package/scripts/build.bash +5 -0
  17. package/src/bridge/Bridge.sol +168 -0
  18. package/src/bridge/IBridge.sol +68 -0
  19. package/src/bridge/IInbox.sol +80 -0
  20. package/src/bridge/IMessageProvider.sol +11 -0
  21. package/src/bridge/IOutbox.sol +52 -0
  22. package/src/bridge/ISequencerInbox.sol +85 -0
  23. package/src/bridge/Inbox.sol +414 -0
  24. package/src/bridge/Messages.sol +38 -0
  25. package/src/bridge/Outbox.sol +188 -0
  26. package/src/bridge/SequencerInbox.sol +274 -0
  27. package/src/challenge/ChallengeLib.sol +135 -0
  28. package/src/challenge/ChallengeManager.sol +367 -0
  29. package/src/challenge/IChallengeManager.sol +75 -0
  30. package/src/challenge/IChallengeResultReceiver.sol +13 -0
  31. package/src/libraries/AddressAliasHelper.sol +29 -0
  32. package/src/libraries/AdminFallbackProxy.sol +153 -0
  33. package/src/libraries/ArbitrumProxy.sol +20 -0
  34. package/src/libraries/Constants.sol +10 -0
  35. package/src/libraries/CryptographyPrimitives.sol +323 -0
  36. package/src/libraries/DelegateCallAware.sol +44 -0
  37. package/src/libraries/Error.sol +38 -0
  38. package/src/libraries/IGasRefunder.sol +35 -0
  39. package/src/libraries/MerkleLib.sol +46 -0
  40. package/src/libraries/MessageTypes.sol +14 -0
  41. package/src/libraries/SecondaryLogicUUPSUpgradeable.sol +58 -0
  42. package/src/libraries/UUPSNotUpgradeable.sol +56 -0
  43. package/src/mocks/BridgeStub.sol +115 -0
  44. package/src/mocks/Counter.sol +13 -0
  45. package/src/mocks/ExecutionManager.sol +41 -0
  46. package/src/mocks/InboxStub.sol +131 -0
  47. package/src/mocks/MockResultReceiver.sol +59 -0
  48. package/src/mocks/SequencerInboxStub.sol +42 -0
  49. package/src/mocks/SimpleProxy.sol +19 -0
  50. package/src/node-interface/NodeInterface.sol +50 -0
  51. package/src/osp/HashProofHelper.sol +154 -0
  52. package/src/osp/IOneStepProofEntry.sol +20 -0
  53. package/src/osp/IOneStepProver.sol +27 -0
  54. package/src/osp/OneStepProofEntry.sol +129 -0
  55. package/src/osp/OneStepProver0.sol +566 -0
  56. package/src/osp/OneStepProverHostIo.sol +357 -0
  57. package/src/osp/OneStepProverMath.sol +514 -0
  58. package/src/osp/OneStepProverMemory.sol +313 -0
  59. package/src/precompiles/ArbAddressTable.sol +60 -0
  60. package/src/precompiles/ArbAggregator.sol +62 -0
  61. package/src/precompiles/ArbBLS.sol +53 -0
  62. package/src/precompiles/ArbDebug.sol +39 -0
  63. package/src/precompiles/ArbFunctionTable.sol +29 -0
  64. package/src/precompiles/ArbGasInfo.sol +121 -0
  65. package/src/precompiles/ArbInfo.sol +15 -0
  66. package/src/precompiles/ArbOwner.sol +65 -0
  67. package/src/precompiles/ArbOwnerPublic.sol +18 -0
  68. package/src/precompiles/ArbRetryableTx.sol +89 -0
  69. package/src/precompiles/ArbStatistics.sol +29 -0
  70. package/src/precompiles/ArbSys.sol +134 -0
  71. package/src/precompiles/ArbosActs.sol +41 -0
  72. package/src/precompiles/ArbosTest.sol +14 -0
  73. package/src/rollup/BridgeCreator.sol +120 -0
  74. package/src/rollup/IRollupCore.sol +152 -0
  75. package/src/rollup/IRollupLogic.sol +183 -0
  76. package/src/rollup/Node.sol +99 -0
  77. package/src/rollup/RollupAdminLogic.sol +322 -0
  78. package/src/rollup/RollupCore.sol +627 -0
  79. package/src/rollup/RollupCreator.sol +133 -0
  80. package/src/rollup/RollupEventBridge.sol +46 -0
  81. package/src/rollup/RollupLib.sol +135 -0
  82. package/src/rollup/RollupUserLogic.sol +712 -0
  83. package/src/rollup/ValidatorUtils.sol +243 -0
  84. package/src/rollup/ValidatorWallet.sol +76 -0
  85. package/src/rollup/ValidatorWalletCreator.sol +43 -0
  86. package/src/state/Deserialize.sol +321 -0
  87. package/src/state/GlobalState.sol +44 -0
  88. package/src/state/Instructions.sol +159 -0
  89. package/src/state/Machine.sol +65 -0
  90. package/src/state/MerkleProof.sol +99 -0
  91. package/src/state/Module.sol +33 -0
  92. package/src/state/ModuleMemory.sol +42 -0
  93. package/src/state/PcArray.sol +45 -0
  94. package/src/state/PcStack.sol +32 -0
  95. package/src/state/StackFrame.sol +63 -0
  96. package/src/state/Value.sol +65 -0
  97. package/src/state/ValueArray.sol +47 -0
  98. package/src/state/ValueStack.sol +39 -0
  99. package/src/test-helpers/CryptographyPrimitivesTester.sol +27 -0
  100. package/src/test-helpers/MessageTester.sol +34 -0
  101. package/src/test-helpers/ValueArrayTester.sol +34 -0
  102. package/test/contract/arbRollup.spec.ts +869 -0
  103. package/test/contract/common/challengeLib.ts +43 -0
  104. package/test/contract/common/globalStateLib.ts +17 -0
  105. package/test/contract/common/rolluplib.ts +259 -0
  106. package/test/contract/cryptographyPrimitives.spec.ts +82 -0
  107. package/test/contract/sequencerInboxForceInclude.spec.ts +516 -0
  108. package/test/contract/utils.ts +40 -0
  109. package/test/prover/hash-proofs.ts +75 -0
  110. package/test/prover/one-step-proof.ts +93 -0
  111. package/test/prover/proofs/.gitkeep +0 -0
  112. package/test/prover/value-arrays.ts +11 -0
  113. package/tsconfig.json +13 -0
@@ -0,0 +1,313 @@
1
+ // Copyright 2021-2022, Offchain Labs, Inc.
2
+ // For license information, see https://github.com/nitro/blob/master/LICENSE
3
+ // SPDX-License-Identifier: BUSL-1.1
4
+
5
+ pragma solidity ^0.8.0;
6
+
7
+ import "../state/Value.sol";
8
+ import "../state/Machine.sol";
9
+ import "../state/Deserialize.sol";
10
+ import "./IOneStepProver.sol";
11
+
12
+ contract OneStepProverMemory is IOneStepProver {
13
+ using MerkleProofLib for MerkleProof;
14
+ using ModuleMemoryLib for ModuleMemory;
15
+ using ValueLib for Value;
16
+ using ValueStackLib for ValueStack;
17
+
18
+ uint256 private constant LEAF_SIZE = 32;
19
+ uint64 private constant PAGE_SIZE = 65536;
20
+
21
+ function pullLeafByte(bytes32 leaf, uint256 idx) internal pure returns (uint8) {
22
+ require(idx < LEAF_SIZE, "BAD_PULL_LEAF_BYTE_IDX");
23
+ // Take into account that we are casting the leaf to a big-endian integer
24
+ uint256 leafShift = (LEAF_SIZE - 1 - idx) * 8;
25
+ return uint8(uint256(leaf) >> leafShift);
26
+ }
27
+
28
+ function setLeafByte(
29
+ bytes32 oldLeaf,
30
+ uint256 idx,
31
+ uint8 val
32
+ ) internal pure returns (bytes32) {
33
+ require(idx < LEAF_SIZE, "BAD_SET_LEAF_BYTE_IDX");
34
+ // Take into account that we are casting the leaf to a big-endian integer
35
+ uint256 leafShift = (LEAF_SIZE - 1 - idx) * 8;
36
+ uint256 newLeaf = uint256(oldLeaf);
37
+ newLeaf &= ~(0xFF << leafShift);
38
+ newLeaf |= uint256(val) << leafShift;
39
+ return bytes32(newLeaf);
40
+ }
41
+
42
+ function executeMemoryLoad(
43
+ Machine memory mach,
44
+ Module memory mod,
45
+ Instruction calldata inst,
46
+ bytes calldata proof
47
+ ) internal pure {
48
+ ValueType ty;
49
+ uint256 readBytes;
50
+ bool signed;
51
+ if (inst.opcode == Instructions.I32_LOAD) {
52
+ ty = ValueType.I32;
53
+ readBytes = 4;
54
+ signed = false;
55
+ } else if (inst.opcode == Instructions.I64_LOAD) {
56
+ ty = ValueType.I64;
57
+ readBytes = 8;
58
+ signed = false;
59
+ } else if (inst.opcode == Instructions.F32_LOAD) {
60
+ ty = ValueType.F32;
61
+ readBytes = 4;
62
+ signed = false;
63
+ } else if (inst.opcode == Instructions.F64_LOAD) {
64
+ ty = ValueType.F64;
65
+ readBytes = 8;
66
+ signed = false;
67
+ } else if (inst.opcode == Instructions.I32_LOAD8_S) {
68
+ ty = ValueType.I32;
69
+ readBytes = 1;
70
+ signed = true;
71
+ } else if (inst.opcode == Instructions.I32_LOAD8_U) {
72
+ ty = ValueType.I32;
73
+ readBytes = 1;
74
+ signed = false;
75
+ } else if (inst.opcode == Instructions.I32_LOAD16_S) {
76
+ ty = ValueType.I32;
77
+ readBytes = 2;
78
+ signed = true;
79
+ } else if (inst.opcode == Instructions.I32_LOAD16_U) {
80
+ ty = ValueType.I32;
81
+ readBytes = 2;
82
+ signed = false;
83
+ } else if (inst.opcode == Instructions.I64_LOAD8_S) {
84
+ ty = ValueType.I64;
85
+ readBytes = 1;
86
+ signed = true;
87
+ } else if (inst.opcode == Instructions.I64_LOAD8_U) {
88
+ ty = ValueType.I64;
89
+ readBytes = 1;
90
+ signed = false;
91
+ } else if (inst.opcode == Instructions.I64_LOAD16_S) {
92
+ ty = ValueType.I64;
93
+ readBytes = 2;
94
+ signed = true;
95
+ } else if (inst.opcode == Instructions.I64_LOAD16_U) {
96
+ ty = ValueType.I64;
97
+ readBytes = 2;
98
+ signed = false;
99
+ } else if (inst.opcode == Instructions.I64_LOAD32_S) {
100
+ ty = ValueType.I64;
101
+ readBytes = 4;
102
+ signed = true;
103
+ } else if (inst.opcode == Instructions.I64_LOAD32_U) {
104
+ ty = ValueType.I64;
105
+ readBytes = 4;
106
+ signed = false;
107
+ } else {
108
+ revert("INVALID_MEMORY_LOAD_OPCODE");
109
+ }
110
+
111
+ // Neither of these can overflow as they're computed with much less than 256 bit integers.
112
+ uint256 startIdx = inst.argumentData + mach.valueStack.pop().assumeI32();
113
+ if (startIdx + readBytes > mod.moduleMemory.size) {
114
+ mach.status = MachineStatus.ERRORED;
115
+ return;
116
+ }
117
+
118
+ uint256 proofOffset = 0;
119
+ uint256 lastProvedLeafIdx = ~uint256(0);
120
+ bytes32 lastProvedLeafContents;
121
+ uint64 readValue;
122
+ for (uint256 i = 0; i < readBytes; i++) {
123
+ uint256 idx = startIdx + i;
124
+ uint256 leafIdx = idx / LEAF_SIZE;
125
+ if (leafIdx != lastProvedLeafIdx) {
126
+ // This hits the stack size if we phrase it as mod.moduleMemory.proveLeaf(...)
127
+ (lastProvedLeafContents, proofOffset, ) = ModuleMemoryLib.proveLeaf(
128
+ mod.moduleMemory,
129
+ leafIdx,
130
+ proof,
131
+ proofOffset
132
+ );
133
+ lastProvedLeafIdx = leafIdx;
134
+ }
135
+ uint256 indexWithinLeaf = idx % LEAF_SIZE;
136
+ readValue |=
137
+ uint64(pullLeafByte(lastProvedLeafContents, indexWithinLeaf)) <<
138
+ uint64(i * 8);
139
+ }
140
+
141
+ if (signed) {
142
+ // Go down to the original uint size, change to signed, go up to correct size, convert back to unsigned
143
+ if (readBytes == 1 && ty == ValueType.I32) {
144
+ readValue = uint32(int32(int8(uint8(readValue))));
145
+ } else if (readBytes == 1 && ty == ValueType.I64) {
146
+ readValue = uint64(int64(int8(uint8(readValue))));
147
+ } else if (readBytes == 2 && ty == ValueType.I32) {
148
+ readValue = uint32(int32(int16(uint16(readValue))));
149
+ } else if (readBytes == 2 && ty == ValueType.I64) {
150
+ readValue = uint64(int64(int16(uint16(readValue))));
151
+ } else if (readBytes == 4 && ty == ValueType.I64) {
152
+ readValue = uint64(int64(int32(uint32(readValue))));
153
+ } else {
154
+ revert("BAD_READ_BYTES_SIGNED");
155
+ }
156
+ }
157
+
158
+ mach.valueStack.push(Value({valueType: ty, contents: readValue}));
159
+ }
160
+
161
+ function executeMemoryStore(
162
+ Machine memory mach,
163
+ Module memory mod,
164
+ Instruction calldata inst,
165
+ bytes calldata proof
166
+ ) internal pure {
167
+ uint64 writeBytes;
168
+ uint64 toWrite;
169
+ {
170
+ ValueType ty;
171
+ if (inst.opcode == Instructions.I32_STORE) {
172
+ ty = ValueType.I32;
173
+ writeBytes = 4;
174
+ } else if (inst.opcode == Instructions.I64_STORE) {
175
+ ty = ValueType.I64;
176
+ writeBytes = 8;
177
+ } else if (inst.opcode == Instructions.F32_STORE) {
178
+ ty = ValueType.F32;
179
+ writeBytes = 4;
180
+ } else if (inst.opcode == Instructions.F64_STORE) {
181
+ ty = ValueType.F64;
182
+ writeBytes = 8;
183
+ } else if (inst.opcode == Instructions.I32_STORE8) {
184
+ ty = ValueType.I32;
185
+ writeBytes = 1;
186
+ } else if (inst.opcode == Instructions.I32_STORE16) {
187
+ ty = ValueType.I32;
188
+ writeBytes = 2;
189
+ } else if (inst.opcode == Instructions.I64_STORE8) {
190
+ ty = ValueType.I64;
191
+ writeBytes = 1;
192
+ } else if (inst.opcode == Instructions.I64_STORE16) {
193
+ ty = ValueType.I64;
194
+ writeBytes = 2;
195
+ } else if (inst.opcode == Instructions.I64_STORE32) {
196
+ ty = ValueType.I64;
197
+ writeBytes = 4;
198
+ } else {
199
+ revert("INVALID_MEMORY_STORE_OPCODE");
200
+ }
201
+
202
+ Value memory writingVal = mach.valueStack.pop();
203
+ require(writingVal.valueType == ty, "BAD_STORE_TYPE");
204
+ toWrite = uint64(writingVal.contents);
205
+ if (writeBytes < 8) {
206
+ toWrite &= (uint64(1) << (writeBytes * 8)) - 1;
207
+ }
208
+ }
209
+
210
+ // Neither of these can overflow as they're computed with much less than 256 bit integers.
211
+ uint256 startIdx = inst.argumentData + mach.valueStack.pop().assumeI32();
212
+ if (startIdx + writeBytes > mod.moduleMemory.size) {
213
+ mach.status = MachineStatus.ERRORED;
214
+ return;
215
+ }
216
+
217
+ uint256 proofOffset = 0;
218
+ uint256 lastProvedLeafIdx = ~uint256(0);
219
+ MerkleProof memory lastProvedMerkle;
220
+ bytes32 lastProvedLeafContents;
221
+ for (uint256 i = 0; i < writeBytes; i++) {
222
+ uint256 idx = startIdx + i;
223
+ uint256 leafIdx = idx / LEAF_SIZE;
224
+ if (leafIdx != lastProvedLeafIdx) {
225
+ if (lastProvedLeafIdx != ~uint256(0)) {
226
+ // Apply the last leaf update
227
+ mod.moduleMemory.merkleRoot = lastProvedMerkle.computeRootFromMemory(
228
+ lastProvedLeafIdx,
229
+ lastProvedLeafContents
230
+ );
231
+ }
232
+ // This hits the stack size if we phrase it as mod.moduleMemory.proveLeaf(...)
233
+ (lastProvedLeafContents, proofOffset, lastProvedMerkle) = ModuleMemoryLib.proveLeaf(
234
+ mod.moduleMemory,
235
+ leafIdx,
236
+ proof,
237
+ proofOffset
238
+ );
239
+ lastProvedLeafIdx = leafIdx;
240
+ }
241
+ uint256 indexWithinLeaf = idx % LEAF_SIZE;
242
+ lastProvedLeafContents = setLeafByte(
243
+ lastProvedLeafContents,
244
+ indexWithinLeaf,
245
+ uint8(toWrite)
246
+ );
247
+ toWrite >>= 8;
248
+ }
249
+ mod.moduleMemory.merkleRoot = lastProvedMerkle.computeRootFromMemory(
250
+ lastProvedLeafIdx,
251
+ lastProvedLeafContents
252
+ );
253
+ }
254
+
255
+ function executeMemorySize(
256
+ Machine memory mach,
257
+ Module memory mod,
258
+ Instruction calldata,
259
+ bytes calldata
260
+ ) internal pure {
261
+ uint32 pages = uint32(mod.moduleMemory.size / PAGE_SIZE);
262
+ mach.valueStack.push(ValueLib.newI32(pages));
263
+ }
264
+
265
+ function executeMemoryGrow(
266
+ Machine memory mach,
267
+ Module memory mod,
268
+ Instruction calldata,
269
+ bytes calldata
270
+ ) internal pure {
271
+ uint32 oldPages = uint32(mod.moduleMemory.size / PAGE_SIZE);
272
+ uint32 growingPages = mach.valueStack.pop().assumeI32();
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);
278
+ mach.valueStack.push(ValueLib.newI32(oldPages));
279
+ } else {
280
+ mach.valueStack.push(ValueLib.newI32(~uint32(0)));
281
+ }
282
+ }
283
+
284
+ function executeOneStep(
285
+ ExecutionContext calldata,
286
+ Machine calldata startMach,
287
+ Module calldata startMod,
288
+ Instruction calldata inst,
289
+ bytes calldata proof
290
+ ) external pure override returns (Machine memory mach, Module memory mod) {
291
+ mach = startMach;
292
+ mod = startMod;
293
+
294
+ uint16 opcode = inst.opcode;
295
+
296
+ function(Machine memory, Module memory, Instruction calldata, bytes calldata)
297
+ internal
298
+ pure impl;
299
+ if (opcode >= Instructions.I32_LOAD && opcode <= Instructions.I64_LOAD32_U) {
300
+ impl = executeMemoryLoad;
301
+ } else if (opcode >= Instructions.I32_STORE && opcode <= Instructions.I64_STORE32) {
302
+ impl = executeMemoryStore;
303
+ } else if (opcode == Instructions.MEMORY_SIZE) {
304
+ impl = executeMemorySize;
305
+ } else if (opcode == Instructions.MEMORY_GROW) {
306
+ impl = executeMemoryGrow;
307
+ } else {
308
+ revert("INVALID_MEMORY_OPCODE");
309
+ }
310
+
311
+ impl(mach, mod, inst, proof);
312
+ }
313
+ }
@@ -0,0 +1,60 @@
1
+ // Copyright 2021-2022, Offchain Labs, Inc.
2
+ // For license information, see https://github.com/nitro/blob/master/LICENSE
3
+ // SPDX-License-Identifier: BUSL-1.1
4
+
5
+ pragma solidity >=0.4.21 <0.9.0;
6
+
7
+ /**
8
+ * @title Allows registering / retrieving addresses at uint indices, saving calldata.
9
+ * @notice Precompiled contract that exists in every Arbitrum chain at 0x0000000000000000000000000000000000000066.
10
+ */
11
+ interface ArbAddressTable {
12
+ /**
13
+ * @notice Check whether an address exists in the address table
14
+ * @param addr address to check for presence in table
15
+ * @return true if address is in table
16
+ */
17
+ function addressExists(address addr) external view returns (bool);
18
+
19
+ /**
20
+ * @notice compress an address and return the result
21
+ * @param addr address to compress
22
+ * @return compressed address bytes
23
+ */
24
+ function compress(address addr) external returns (bytes memory);
25
+
26
+ /**
27
+ * @notice read a compressed address from a bytes buffer
28
+ * @param buf bytes buffer containing an address
29
+ * @param offset offset of target address
30
+ * @return resulting address and updated offset into the buffer (revert if buffer is too short)
31
+ */
32
+ function decompress(bytes calldata buf, uint256 offset)
33
+ external
34
+ view
35
+ returns (address, uint256);
36
+
37
+ /**
38
+ * @param addr address to lookup
39
+ * @return index of an address in the address table (revert if address isn't in the table)
40
+ */
41
+ function lookup(address addr) external view returns (uint256);
42
+
43
+ /**
44
+ * @param index index to lookup address
45
+ * @return address at a given index in address table (revert if index is beyond end of table)
46
+ */
47
+ function lookupIndex(uint256 index) external view returns (address);
48
+
49
+ /**
50
+ * @notice Register an address in the address table
51
+ * @param addr address to register
52
+ * @return index of the address (existing index, or newly created index if not already registered)
53
+ */
54
+ function register(address addr) external returns (uint256);
55
+
56
+ /**
57
+ * @return size of address table (= first unused index)
58
+ */
59
+ function size() external view returns (uint256);
60
+ }
@@ -0,0 +1,62 @@
1
+ // Copyright 2021-2022, Offchain Labs, Inc.
2
+ // For license information, see https://github.com/nitro/blob/master/LICENSE
3
+ // SPDX-License-Identifier: BUSL-1.1
4
+
5
+ pragma solidity >=0.4.21 <0.9.0;
6
+
7
+ /// @title Provides aggregators and their users methods for configuring how they participate in L1 aggregation.
8
+ /// @notice Precompiled contract that exists in every Arbitrum chain at 0x000000000000000000000000000000000000006d
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
14
+ function getPreferredAggregator(address addr) external view returns (address, bool);
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
+
20
+ /// @notice Get default aggregator.
21
+ function getDefaultAggregator() external view returns (address);
22
+
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
47
+ /// @param newFeeCollector The new fee collector to set
48
+ function setFeeCollector(address aggregator, address newFeeCollector) external;
49
+
50
+ /// @notice Deprecated, always returns zero
51
+ /// @notice Get the tx base fee (in approximate L1 gas) for aggregator
52
+ /// @param aggregator The aggregator to get the base fee for
53
+ function getTxBaseFee(address aggregator) external view returns (uint256);
54
+
55
+ /// @notice Deprecated, is now a no-op
56
+ /// @notice Set the tx base fee (in approximate L1 gas) for aggregator
57
+ /// Revert unless called by aggregator or the chain owner
58
+ /// Revert if feeInL1Gas is outside the chain's allowed bounds
59
+ /// @param aggregator The aggregator to set the fee for
60
+ /// @param feeInL1Gas The base fee in L1 gas
61
+ function setTxBaseFee(address aggregator, uint256 feeInL1Gas) external;
62
+ }
@@ -0,0 +1,53 @@
1
+ // Copyright 2021-2022, Offchain Labs, Inc.
2
+ // For license information, see https://github.com/nitro/blob/master/LICENSE
3
+ // SPDX-License-Identifier: BUSL-1.1
4
+
5
+ pragma solidity >=0.4.21 <0.9.0;
6
+
7
+ /// @title Provides a registry of BLS public keys for accounts.
8
+ /// @notice Precompiled contract that exists in every Arbitrum chain at 0x0000000000000000000000000000000000000067.
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
+
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
+ }
@@ -0,0 +1,39 @@
1
+ // Copyright 2021-2022, Offchain Labs, Inc.
2
+ // For license information, see https://github.com/nitro/blob/master/LICENSE
3
+ // SPDX-License-Identifier: BUSL-1.1
4
+
5
+ pragma solidity >=0.4.21 <0.9.0;
6
+
7
+ /**
8
+ * @title A test contract whose methods are only accessible in debug mode
9
+ * @notice Precompiled contract that exists in every Arbitrum chain at 0x00000000000000000000000000000000000000ff.
10
+ */
11
+ interface ArbDebug {
12
+ /// @notice Caller becomes a chain owner
13
+ function becomeChainOwner() external;
14
+
15
+ /// @notice Emit events with values based on the args provided
16
+ function events(bool flag, bytes32 value) external payable returns (address, uint256);
17
+
18
+ // Events that exist for testing log creation and pricing
19
+ event Basic(bool flag, bytes32 indexed value);
20
+ event Mixed(
21
+ bool indexed flag,
22
+ bool not,
23
+ bytes32 indexed value,
24
+ address conn,
25
+ address indexed caller
26
+ );
27
+ event Store(
28
+ bool indexed flag,
29
+ address indexed field,
30
+ uint24 number,
31
+ bytes32 value,
32
+ bytes store
33
+ );
34
+
35
+ function customRevert(uint64 number) external pure;
36
+
37
+ error Custom(uint64, string, bool);
38
+ error Unused();
39
+ }
@@ -0,0 +1,29 @@
1
+ // Copyright 2021-2022, Offchain Labs, Inc.
2
+ // For license information, see https://github.com/nitro/blob/master/LICENSE
3
+ // SPDX-License-Identifier: BUSL-1.1
4
+
5
+ pragma solidity >=0.4.21 <0.9.0;
6
+
7
+ /// @title Deprecated - Provided aggregator's the ability to manage function tables,
8
+ // this enables one form of transaction compression.
9
+ /// @notice The Nitro aggregator implementation does not use these,
10
+ // so these methods have been stubbed and their effects disabled.
11
+ /// They are kept for backwards compatibility.
12
+ /// Precompiled contract that exists in every Arbitrum chain at 0x0000000000000000000000000000000000000068.
13
+ interface ArbFunctionTable {
14
+ /// @notice Reverts since the table is empty
15
+ function upload(bytes calldata buf) external;
16
+
17
+ /// @notice Returns the empty table's size, which is 0
18
+ function size(address addr) external view returns (uint256);
19
+
20
+ /// @notice No-op
21
+ function get(address addr, uint256 index)
22
+ external
23
+ view
24
+ returns (
25
+ uint256,
26
+ bool,
27
+ uint256
28
+ );
29
+ }
@@ -0,0 +1,121 @@
1
+ // Copyright 2021-2022, Offchain Labs, Inc.
2
+ // For license information, see https://github.com/nitro/blob/master/LICENSE
3
+ // SPDX-License-Identifier: BUSL-1.1
4
+
5
+ pragma solidity >=0.4.21 <0.9.0;
6
+
7
+ /// @title Provides insight into the cost of using the chain.
8
+ /// @notice These methods have been adjusted to account for Nitro's heavy use of calldata compression.
9
+ /// Of note to end-users, we no longer make a distinction between non-zero and zero-valued calldata bytes.
10
+ /// Precompiled contract that exists in every Arbitrum chain at 0x000000000000000000000000000000000000006c.
11
+ interface ArbGasInfo {
12
+ /// @notice Get gas prices for a provided aggregator
13
+ /// @return return gas prices in wei
14
+ /// (
15
+ /// per L2 tx,
16
+ /// per L1 calldata unit, (a byte, non-zero or otherwise, is 16 units)
17
+ /// per storage allocation,
18
+ /// per ArbGas base,
19
+ /// per ArbGas congestion,
20
+ /// per ArbGas total
21
+ /// )
22
+ function getPricesInWeiWithAggregator(address aggregator)
23
+ external
24
+ view
25
+ returns (
26
+ uint256,
27
+ uint256,
28
+ uint256,
29
+ uint256,
30
+ uint256,
31
+ uint256
32
+ );
33
+
34
+ /// @notice Get gas prices. Uses the caller's preferred aggregator, or the default if the caller doesn't have a preferred one.
35
+ /// @return return gas prices in wei
36
+ /// (
37
+ /// per L2 tx,
38
+ /// per L1 calldata unit, (a byte, non-zero or otherwise, is 16 units)
39
+ /// per storage allocation,
40
+ /// per ArbGas base,
41
+ /// per ArbGas congestion,
42
+ /// per ArbGas total
43
+ /// )
44
+ function getPricesInWei()
45
+ external
46
+ view
47
+ returns (
48
+ uint256,
49
+ uint256,
50
+ uint256,
51
+ uint256,
52
+ uint256,
53
+ uint256
54
+ );
55
+
56
+ /// @notice Get prices in ArbGas for the supplied aggregator
57
+ /// @return (per L2 tx, per L1 calldata unit, per storage allocation)
58
+ function getPricesInArbGasWithAggregator(address aggregator)
59
+ external
60
+ view
61
+ returns (
62
+ uint256,
63
+ uint256,
64
+ uint256
65
+ );
66
+
67
+ /// @notice Get prices in ArbGas. Assumes the callers preferred validator, or the default if caller doesn't have a preferred one.
68
+ /// @return (per L2 tx, per L1 calldata unit, per storage allocation)
69
+ function getPricesInArbGas()
70
+ external
71
+ view
72
+ returns (
73
+ uint256,
74
+ uint256,
75
+ uint256
76
+ );
77
+
78
+ /// @notice Get the gas accounting parameters
79
+ /// @return (speedLimitPerSecond, gasPoolMax, maxTxGasLimit)
80
+ function getGasAccountingParams()
81
+ external
82
+ view
83
+ returns (
84
+ uint256,
85
+ uint256,
86
+ uint256
87
+ );
88
+
89
+ /// @notice Get the minimum gas price needed for a tx to succeed
90
+ function getMinimumGasPrice() external view returns (uint256);
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
+ /// @notice Get ArbOS's estimate of the L1 basefee in wei
108
+ function getL1BaseFeeEstimate() external view returns (uint256);
109
+
110
+ /// @notice Get how slowly ArbOS updates its estimate of the L1 basefee
111
+ function getL1BaseFeeEstimateInertia() external view returns (uint64);
112
+
113
+ /// @notice Deprecated -- Same as getL1BaseFeeEstimate()
114
+ function getL1GasPriceEstimate() external view returns (uint256);
115
+
116
+ /// @notice Get L1 gas fees paid by the current transaction
117
+ function getCurrentTxL1GasFees() external view returns (uint256);
118
+
119
+ /// @notice Get the amount of gas remaining in the gas pool
120
+ function getGasPool() external view returns (int64);
121
+ }