@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,15 @@
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 Lookup for basic info about accounts and contracts.
8
+ /// @notice Precompiled contract that exists in every Arbitrum chain at 0x0000000000000000000000000000000000000065.
9
+ interface ArbInfo {
10
+ /// @notice Retrieves an account's balance
11
+ function getBalance(address account) external view returns (uint256);
12
+
13
+ /// @notice Retrieves a contract's deployed code
14
+ function getCode(address account) external view returns (bytes memory);
15
+ }
@@ -0,0 +1,65 @@
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 owners with tools for managing the rollup.
8
+ /// @notice Calls by non-owners will always revert.
9
+ /// Most of Arbitrum Classic's owner methods have been removed since they no longer make sense in Nitro:
10
+ /// - What were once chain parameters are now parts of ArbOS's state, and those that remain are set at genesis.
11
+ /// - ArbOS upgrades happen with the rest of the system rather than being independent
12
+ /// - Exemptions to address aliasing are no longer offered. Exemptions were intended to support backward compatibility for contracts deployed before aliasing was introduced, but no exemptions were ever requested.
13
+ /// Precompiled contract that exists in every Arbitrum chain at 0x0000000000000000000000000000000000000070.
14
+ interface ArbOwner {
15
+ /// @notice Add account as a chain owner
16
+ function addChainOwner(address newOwner) external;
17
+
18
+ /// @notice Remove account from the list of chain owners
19
+ function removeChainOwner(address ownerToRemove) external;
20
+
21
+ /// @notice See if the user is a chain owner
22
+ function isChainOwner(address addr) external view returns (bool);
23
+
24
+ /// @notice Retrieves the list of chain owners
25
+ function getAllChainOwners() external view returns (address[] memory);
26
+
27
+ /// @notice Set the L1 basefee estimate directly, bypassing the autoregression
28
+ function setL1BaseFeeEstimate(uint256 priceInWei) external;
29
+
30
+ /// @notice Set how slowly ArbOS updates its estimate of the L1 basefee
31
+ function setL1BaseFeeEstimateInertia(uint64 inertia) external;
32
+
33
+ /// @notice Set the L2 basefee directly, bypassing the pool calculus
34
+ function setL2BaseFee(uint256 priceInWei) external;
35
+
36
+ /// @notice Set the minimum basefee needed for a transaction to succeed
37
+ function setMinimumL2BaseFee(uint256 priceInWei) external;
38
+
39
+ /// @notice Set the computational speed limit for the chain
40
+ function setSpeedLimit(uint64 limit) external;
41
+
42
+ /// @notice Set the number of seconds worth of the speed limit the gas pool contains
43
+ function setGasPoolSeconds(uint64 factor) external;
44
+
45
+ /// @notice Set the target fullness in bips the pricing model will try to keep the pool at
46
+ function setGasPoolTarget(uint64 target) external;
47
+
48
+ /// @notice Set the extent in bips to which the pricing model favors filling the pool over increasing speeds
49
+ function setGasPoolWeight(uint64 weight) external;
50
+
51
+ /// @notice Set how slowly ArbOS updates its estimate the amount of gas being burnt per second
52
+ function setRateEstimateInertia(uint64 inertia) external;
53
+
54
+ /// @notice Set the maximum size a tx (and block) can be
55
+ function setMaxTxGasLimit(uint64 limit) external;
56
+
57
+ /// @notice Get the network fee collector
58
+ function getNetworkFeeAccount() external view returns (address);
59
+
60
+ /// @notice Set the network fee collector
61
+ function setNetworkFeeAccount(address newNetworkFeeAccount) external;
62
+
63
+ // Emitted when a successful call is made to this precompile
64
+ event OwnerActs(bytes4 indexed method, address indexed owner, bytes data);
65
+ }
@@ -0,0 +1,18 @@
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 non-owners with info about the current chain owners.
8
+ /// @notice Precompiled contract that exists in every Arbitrum chain at 0x000000000000000000000000000000000000006b.
9
+ interface ArbOwnerPublic {
10
+ /// @notice See if the user is a chain owner
11
+ function isChainOwner(address addr) external view returns (bool);
12
+
13
+ /// @notice Retrieves the list of chain owners
14
+ function getAllChainOwners() external view returns (address[] memory);
15
+
16
+ /// @notice Gets the network fee collector
17
+ function getNetworkFeeAccount() external view returns (address);
18
+ }
@@ -0,0 +1,89 @@
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 Methods for managing retryables.
9
+ * @notice Precompiled contract in every Arbitrum chain for retryable transaction related data retrieval and interactions. Exists at 0x000000000000000000000000000000000000006e
10
+ */
11
+ interface ArbRetryableTx {
12
+ /**
13
+ * @notice Schedule an attempt to redeem a redeemable tx, donating all of the call's gas to the redeem.
14
+ * Revert if ticketId does not exist.
15
+ * @param ticketId unique identifier of retryable message: keccak256(keccak256(ArbchainId, inbox-sequence-number), uint(0) )
16
+ * @return txId that the redeem attempt will have
17
+ */
18
+ function redeem(bytes32 ticketId) external returns (bytes32);
19
+
20
+ /**
21
+ * @notice Return the minimum lifetime of redeemable txn.
22
+ * @return lifetime in seconds
23
+ */
24
+ function getLifetime() external view returns (uint256);
25
+
26
+ /**
27
+ * @notice Return the timestamp when ticketId will age out, reverting if it does not exist
28
+ * @param ticketId unique ticket identifier
29
+ * @return timestamp for ticket's deadline
30
+ */
31
+ function getTimeout(bytes32 ticketId) external view returns (uint256);
32
+
33
+ /**
34
+ * @notice Adds one lifetime period to the life of ticketId.
35
+ * Donate gas to pay for the lifetime extension.
36
+ * If successful, emits LifetimeExtended event.
37
+ * Revert if ticketId does not exist, or if the timeout of ticketId is already at least one lifetime period in the future.
38
+ * @param ticketId unique ticket identifier
39
+ * @return new timeout of ticketId
40
+ */
41
+ function keepalive(bytes32 ticketId) external returns (uint256);
42
+
43
+ /**
44
+ * @notice Return the beneficiary of ticketId.
45
+ * Revert if ticketId doesn't exist.
46
+ * @param ticketId unique ticket identifier
47
+ * @return address of beneficiary for ticket
48
+ */
49
+ function getBeneficiary(bytes32 ticketId) external view returns (address);
50
+
51
+ /**
52
+ * @notice Cancel ticketId and refund its callvalue to its beneficiary.
53
+ * Revert if ticketId doesn't exist, or if called by anyone other than ticketId's beneficiary.
54
+ * @param ticketId unique ticket identifier
55
+ */
56
+ function cancel(bytes32 ticketId) external;
57
+
58
+ /**
59
+ * @notice Do not call. This method represents a retryable submission to aid explorers.
60
+ * Calling it will always revert.
61
+ */
62
+ function submitRetryable(
63
+ bytes32 requestId,
64
+ uint256 l1BaseFee,
65
+ uint256 deposit,
66
+ uint256 callvalue,
67
+ uint256 gasFeeCap,
68
+ uint64 gasLimit,
69
+ uint256 maxSubmissionFee,
70
+ address feeRefundAddress,
71
+ address beneficiary,
72
+ address retryTo,
73
+ bytes calldata retryData
74
+ ) external;
75
+
76
+ event TicketCreated(bytes32 indexed ticketId);
77
+ event LifetimeExtended(bytes32 indexed ticketId, uint256 newTimeout);
78
+ event RedeemScheduled(
79
+ bytes32 indexed ticketId,
80
+ bytes32 indexed retryTxHash,
81
+ uint64 indexed sequenceNum,
82
+ uint64 donatedGas,
83
+ address gasDonor
84
+ );
85
+ event Canceled(bytes32 indexed ticketId);
86
+
87
+ error NoTicketWithID();
88
+ error NotCallable();
89
+ }
@@ -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 - Info about the rollup just prior to the Nitro upgrade
8
+ /// @notice Precompiled contract in every Arbitrum chain for retryable transaction related data retrieval and interactions. Exists at 0x000000000000000000000000000000000000006f
9
+ interface ArbStatistics {
10
+ /// @notice Get Arbitrum block number and other statistics as they were right before the Nitro upgrade.
11
+ /// @return (
12
+ /// Number of accounts,
13
+ /// Total storage allocated (includes storage that was later deallocated),
14
+ /// Total ArbGas used,
15
+ /// Number of transaction receipt issued,
16
+ /// Number of contracts created,
17
+ /// )
18
+ function getStats()
19
+ external
20
+ view
21
+ returns (
22
+ uint256,
23
+ uint256,
24
+ uint256,
25
+ uint256,
26
+ uint256,
27
+ uint256
28
+ );
29
+ }
@@ -0,0 +1,134 @@
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 System level functionality
9
+ * @notice For use by contracts to interact with core L2-specific functionality.
10
+ * Precompiled contract that exists in every Arbitrum chain at address(100), 0x0000000000000000000000000000000000000064.
11
+ */
12
+ interface ArbSys {
13
+ /**
14
+ * @notice Get Arbitrum block number (distinct from L1 block number; Arbitrum genesis block has block number 0)
15
+ * @return block number as int
16
+ */
17
+ function arbBlockNumber() external view returns (uint256);
18
+
19
+ /**
20
+ * @notice Get Arbitrum block hash (reverts unless currentBlockNum-256 <= arbBlockNum < currentBlockNum)
21
+ * @return block hash
22
+ */
23
+ function arbBlockHash(uint256 arbBlockNum) external view returns (bytes32);
24
+
25
+ /**
26
+ * @notice Gets the rollup's unique chain identifier
27
+ * @return Chain identifier as int
28
+ */
29
+ function arbChainID() external view returns (uint256);
30
+
31
+ /**
32
+ * @notice Get internal version number identifying an ArbOS build
33
+ * @return version number as int
34
+ */
35
+ function arbOSVersion() external view returns (uint256);
36
+
37
+ /**
38
+ * @notice Returns 0 since Nitro has no concept of storage gas
39
+ * @return int 0
40
+ */
41
+ function getStorageGasAvailable() external returns (uint256);
42
+
43
+ /**
44
+ * @notice check if current call is coming from l1
45
+ * @return true if the caller of this was called directly from L1
46
+ */
47
+ function isTopLevelCall() external view returns (bool);
48
+
49
+ /**
50
+ * @notice map L1 sender contract address to its L2 alias
51
+ * @param sender sender address
52
+ * @param unused argument no longer used
53
+ * @return aliased sender address
54
+ */
55
+ function mapL1SenderContractAddressToL2Alias(address sender, address unused)
56
+ external
57
+ pure
58
+ returns (address);
59
+
60
+ /**
61
+ * @notice check if the caller (of this caller of this) is an aliased L1 contract address
62
+ * @return true iff the caller's address is an alias for an L1 contract address
63
+ */
64
+ function wasMyCallersAddressAliased() external view returns (bool);
65
+
66
+ /**
67
+ * @notice return the address of the caller (of this caller of this), without applying L1 contract address aliasing
68
+ * @return address of the caller's caller, without applying L1 contract address aliasing
69
+ */
70
+ function myCallersAddressWithoutAliasing() external view returns (address);
71
+
72
+ /**
73
+ * @notice Send given amount of Eth to dest from sender.
74
+ * This is a convenience function, which is equivalent to calling sendTxToL1 with empty data.
75
+ * @param destination recipient address on L1
76
+ * @return unique identifier for this L2-to-L1 transaction.
77
+ */
78
+ function withdrawEth(address destination) external payable returns (uint256);
79
+
80
+ /**
81
+ * @notice Send a transaction to L1
82
+ * @param destination recipient address on L1
83
+ * @param data (optional) calldata for L1 contract call
84
+ * @return a unique identifier for this L2-to-L1 transaction.
85
+ */
86
+ function sendTxToL1(address destination, bytes calldata data)
87
+ external
88
+ payable
89
+ returns (uint256);
90
+
91
+ /**
92
+ * @notice Get send Merkle tree state
93
+ * @return size number of sends in the history
94
+ * @return root root hash of the send history
95
+ * @return partials hashes of partial subtrees in the send history tree
96
+ */
97
+ function sendMerkleTreeState()
98
+ external
99
+ view
100
+ returns (
101
+ uint256 size,
102
+ bytes32 root,
103
+ bytes32[] memory partials
104
+ );
105
+
106
+ /**
107
+ * @notice creates a send txn from L2 to L1
108
+ * @param position = (level << 192) + leaf = (0 << 192) + leaf = leaf
109
+ */
110
+ event L2ToL1Transaction(
111
+ address caller,
112
+ address indexed destination,
113
+ uint256 indexed hash,
114
+ uint256 indexed position,
115
+ uint256 indexInBatch,
116
+ uint256 arbBlockNum,
117
+ uint256 ethBlockNum,
118
+ uint256 timestamp,
119
+ uint256 callvalue,
120
+ bytes data
121
+ );
122
+
123
+ /**
124
+ * @notice logs a merkle branch for proof sythesis
125
+ * @param reserved an index meant only to align the 4th index with L2ToL1Transaction's 4th event
126
+ * @param hash the merkle hash
127
+ * @param position = (level << 192) + leaf
128
+ */
129
+ event SendMerkleUpdate(
130
+ uint256 indexed reserved,
131
+ bytes32 indexed hash,
132
+ uint256 indexed position
133
+ );
134
+ }
@@ -0,0 +1,41 @@
1
+ // SPDX-License-Identifier: Apache-2.0
2
+
3
+ /*
4
+ * Copyright 2020, Offchain Labs, Inc.
5
+ *
6
+ * Licensed under the Apache License, Version 2.0 (the "License");
7
+ * you may not use this file except in compliance with the License.
8
+ * You may obtain a copy of the License at
9
+ *
10
+ * http://www.apache.org/licenses/LICENSE-2.0
11
+ *
12
+ * Unless required by applicable law or agreed to in writing, software
13
+ * distributed under the License is distributed on an "AS IS" BASIS,
14
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15
+ * See the License for the specific language governing permissions and
16
+ * limitations under the License.
17
+ */
18
+
19
+ pragma solidity >=0.4.21 <0.9.0;
20
+
21
+ /**
22
+ * @title This precompile represents ArbOS's internal actions as calls it makes to itself
23
+ * @notice Calling this precompile will always revert and should not be done.
24
+ */
25
+ interface ArbosActs {
26
+ /**
27
+ * @notice ArbOS "calls" this when starting a block
28
+ * @param l1BaseFee the L1 BaseFee
29
+ * @param l2BaseFeeLastBlock the L2 BaseFee in the last block's header
30
+ * @param l1BlockNumber the L1 block number
31
+ * @param timePassed number of seconds since the last block
32
+ */
33
+ function startBlock(
34
+ uint256 l1BaseFee,
35
+ uint256 l2BaseFeeLastBlock,
36
+ uint64 l1BlockNumber,
37
+ uint64 timePassed
38
+ ) external;
39
+
40
+ error CallerNotArbOS();
41
+ }
@@ -0,0 +1,14 @@
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 - Provides a method of burning arbitrary amounts of gas,
8
+ /// @notice This exists for historical reasons. Pre-Nitro, `ArbosTest` had additional methods only the zero address could call.
9
+ /// These have been removed since users don't use them and calls to missing methods revert.
10
+ /// Precompiled contract that exists in every Arbitrum chain at 0x0000000000000000000000000000000000000069.
11
+ interface ArbosTest {
12
+ /// @notice Unproductively burns the amount of L2 ArbGas
13
+ function burnArbGas(uint256 gasAmount) external pure;
14
+ }
@@ -0,0 +1,120 @@
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 "../bridge/Bridge.sol";
8
+ import "../bridge/SequencerInbox.sol";
9
+ import "../bridge/ISequencerInbox.sol";
10
+ import "../bridge/Inbox.sol";
11
+ import "../bridge/Outbox.sol";
12
+ import "./RollupEventBridge.sol";
13
+
14
+ import "../bridge/IBridge.sol";
15
+ import "@openzeppelin/contracts/access/Ownable.sol";
16
+ import "@openzeppelin/contracts/proxy/transparent/ProxyAdmin.sol";
17
+
18
+ contract BridgeCreator is Ownable {
19
+ Bridge public delayedBridgeTemplate;
20
+ SequencerInbox public sequencerInboxTemplate;
21
+ Inbox public inboxTemplate;
22
+ RollupEventBridge public rollupEventBridgeTemplate;
23
+ Outbox public outboxTemplate;
24
+
25
+ event TemplatesUpdated();
26
+
27
+ constructor() Ownable() {
28
+ delayedBridgeTemplate = new Bridge();
29
+ sequencerInboxTemplate = new SequencerInbox();
30
+ inboxTemplate = new Inbox();
31
+ rollupEventBridgeTemplate = new RollupEventBridge();
32
+ outboxTemplate = new Outbox();
33
+ }
34
+
35
+ function updateTemplates(
36
+ address _delayedBridgeTemplate,
37
+ address _sequencerInboxTemplate,
38
+ address _inboxTemplate,
39
+ address _rollupEventBridgeTemplate,
40
+ address _outboxTemplate
41
+ ) external onlyOwner {
42
+ delayedBridgeTemplate = Bridge(_delayedBridgeTemplate);
43
+ sequencerInboxTemplate = SequencerInbox(_sequencerInboxTemplate);
44
+ inboxTemplate = Inbox(_inboxTemplate);
45
+ rollupEventBridgeTemplate = RollupEventBridge(_rollupEventBridgeTemplate);
46
+ outboxTemplate = Outbox(_outboxTemplate);
47
+
48
+ emit TemplatesUpdated();
49
+ }
50
+
51
+ struct CreateBridgeFrame {
52
+ ProxyAdmin admin;
53
+ Bridge delayedBridge;
54
+ SequencerInbox sequencerInbox;
55
+ Inbox inbox;
56
+ RollupEventBridge rollupEventBridge;
57
+ Outbox outbox;
58
+ }
59
+
60
+ function createBridge(
61
+ address adminProxy,
62
+ address rollup,
63
+ ISequencerInbox.MaxTimeVariation memory maxTimeVariation
64
+ )
65
+ external
66
+ returns (
67
+ Bridge,
68
+ SequencerInbox,
69
+ Inbox,
70
+ RollupEventBridge,
71
+ Outbox
72
+ )
73
+ {
74
+ CreateBridgeFrame memory frame;
75
+ {
76
+ frame.delayedBridge = Bridge(
77
+ address(
78
+ new TransparentUpgradeableProxy(address(delayedBridgeTemplate), adminProxy, "")
79
+ )
80
+ );
81
+ frame.sequencerInbox = SequencerInbox(
82
+ address(
83
+ new TransparentUpgradeableProxy(address(sequencerInboxTemplate), adminProxy, "")
84
+ )
85
+ );
86
+ frame.inbox = Inbox(
87
+ address(new TransparentUpgradeableProxy(address(inboxTemplate), adminProxy, ""))
88
+ );
89
+ frame.rollupEventBridge = RollupEventBridge(
90
+ address(
91
+ new TransparentUpgradeableProxy(
92
+ address(rollupEventBridgeTemplate),
93
+ adminProxy,
94
+ ""
95
+ )
96
+ )
97
+ );
98
+ frame.outbox = Outbox(
99
+ address(new TransparentUpgradeableProxy(address(outboxTemplate), adminProxy, ""))
100
+ );
101
+ }
102
+
103
+ frame.delayedBridge.initialize();
104
+ frame.sequencerInbox.initialize(IBridge(frame.delayedBridge), rollup, maxTimeVariation);
105
+ frame.inbox.initialize(IBridge(frame.delayedBridge));
106
+ frame.rollupEventBridge.initialize(address(frame.delayedBridge), rollup);
107
+ frame.outbox.initialize(rollup, IBridge(frame.delayedBridge));
108
+
109
+ frame.delayedBridge.setInbox(address(frame.inbox), true);
110
+ frame.delayedBridge.transferOwnership(rollup);
111
+
112
+ return (
113
+ frame.delayedBridge,
114
+ frame.sequencerInbox,
115
+ frame.inbox,
116
+ frame.rollupEventBridge,
117
+ frame.outbox
118
+ );
119
+ }
120
+ }
@@ -0,0 +1,152 @@
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 "./Node.sol";
8
+ import "./RollupLib.sol";
9
+
10
+ import "../osp/IOneStepProofEntry.sol";
11
+
12
+ interface IRollupCore {
13
+ struct Staker {
14
+ uint256 amountStaked;
15
+ uint64 index;
16
+ uint64 latestStakedNode;
17
+ // currentChallenge is 0 if staker is not in a challenge
18
+ uint64 currentChallenge;
19
+ bool isStaked;
20
+ }
21
+
22
+ event RollupInitialized(bytes32 machineHash, uint256 chainId);
23
+
24
+ event NodeCreated(
25
+ uint64 indexed nodeNum,
26
+ bytes32 indexed parentNodeHash,
27
+ bytes32 indexed nodeHash,
28
+ bytes32 executionHash,
29
+ RollupLib.Assertion assertion,
30
+ bytes32 afterInboxBatchAcc,
31
+ bytes32 wasmModuleRoot,
32
+ uint256 inboxMaxCount
33
+ );
34
+
35
+ event NodeConfirmed(uint64 indexed nodeNum, bytes32 blockHash, bytes32 sendRoot);
36
+
37
+ event NodeRejected(uint64 indexed nodeNum);
38
+
39
+ event RollupChallengeStarted(
40
+ uint64 indexed challengeIndex,
41
+ address asserter,
42
+ address challenger,
43
+ uint64 challengedNode
44
+ );
45
+
46
+ event UserStakeUpdated(address indexed user, uint256 initialBalance, uint256 finalBalance);
47
+
48
+ event UserWithdrawableFundsUpdated(
49
+ address indexed user,
50
+ uint256 initialBalance,
51
+ uint256 finalBalance
52
+ );
53
+
54
+ function challengeManager() external view returns (IChallengeManager);
55
+
56
+ /**
57
+ * @notice Get the Node for the given index.
58
+ */
59
+ function getNode(uint64 nodeNum) external view returns (Node memory);
60
+
61
+ /**
62
+ * @notice Check if the specified node has been staked on by the provided staker.
63
+ * Only accurate at the latest confirmed node and afterwards.
64
+ */
65
+ function nodeHasStaker(uint64 nodeNum, address staker) external view returns (bool);
66
+
67
+ /**
68
+ * @notice Get the address of the staker at the given index
69
+ * @param stakerNum Index of the staker
70
+ * @return Address of the staker
71
+ */
72
+ function getStakerAddress(uint64 stakerNum) external view returns (address);
73
+
74
+ /**
75
+ * @notice Check whether the given staker is staked
76
+ * @param staker Staker address to check
77
+ * @return True or False for whether the staker was staked
78
+ */
79
+ function isStaked(address staker) external view returns (bool);
80
+
81
+ /**
82
+ * @notice Get the latest staked node of the given staker
83
+ * @param staker Staker address to lookup
84
+ * @return Latest node staked of the staker
85
+ */
86
+ function latestStakedNode(address staker) external view returns (uint64);
87
+
88
+ /**
89
+ * @notice Get the current challenge of the given staker
90
+ * @param staker Staker address to lookup
91
+ * @return Current challenge of the staker
92
+ */
93
+ function currentChallenge(address staker) external view returns (uint64);
94
+
95
+ /**
96
+ * @notice Get the amount staked of the given staker
97
+ * @param staker Staker address to lookup
98
+ * @return Amount staked of the staker
99
+ */
100
+ function amountStaked(address staker) external view returns (uint256);
101
+
102
+ /**
103
+ * @notice Retrieves stored information about a requested staker
104
+ * @param staker Staker address to retrieve
105
+ * @return A structure with information about the requested staker
106
+ */
107
+ function getStaker(address staker) external view returns (Staker memory);
108
+
109
+ /**
110
+ * @notice Get the original staker address of the zombie at the given index
111
+ * @param zombieNum Index of the zombie to lookup
112
+ * @return Original staker address of the zombie
113
+ */
114
+ function zombieAddress(uint256 zombieNum) external view returns (address);
115
+
116
+ /**
117
+ * @notice Get Latest node that the given zombie at the given index is staked on
118
+ * @param zombieNum Index of the zombie to lookup
119
+ * @return Latest node that the given zombie is staked on
120
+ */
121
+ function zombieLatestStakedNode(uint256 zombieNum) external view returns (uint64);
122
+
123
+ /// @return Current number of un-removed zombies
124
+ function zombieCount() external view returns (uint256);
125
+
126
+ function isZombie(address staker) external view returns (bool);
127
+
128
+ /**
129
+ * @notice Get the amount of funds withdrawable by the given address
130
+ * @param owner Address to check the funds of
131
+ * @return Amount of funds withdrawable by owner
132
+ */
133
+ function withdrawableFunds(address owner) external view returns (uint256);
134
+
135
+ /**
136
+ * @return Index of the first unresolved node
137
+ * @dev If all nodes have been resolved, this will be latestNodeCreated + 1
138
+ */
139
+ function firstUnresolvedNode() external view returns (uint64);
140
+
141
+ /// @return Index of the latest confirmed node
142
+ function latestConfirmed() external view returns (uint64);
143
+
144
+ /// @return Index of the latest rollup node created
145
+ function latestNodeCreated() external view returns (uint64);
146
+
147
+ /// @return Ethereum block that the most recent stake was created
148
+ function lastStakeBlock() external view returns (uint64);
149
+
150
+ /// @return Number of active stakers currently staked
151
+ function stakerCount() external view returns (uint64);
152
+ }