@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,133 @@
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/Inbox.sol";
10
+ import "../bridge/Outbox.sol";
11
+ import "./RollupEventBridge.sol";
12
+ import "./BridgeCreator.sol";
13
+
14
+ import "@openzeppelin/contracts/proxy/transparent/ProxyAdmin.sol";
15
+ import "@openzeppelin/contracts/proxy/transparent/TransparentUpgradeableProxy.sol";
16
+ import "@openzeppelin/contracts/access/Ownable.sol";
17
+
18
+ import "../libraries/ArbitrumProxy.sol";
19
+ import "./RollupUserLogic.sol";
20
+ import "./RollupAdminLogic.sol";
21
+ import "../bridge/IBridge.sol";
22
+
23
+ import "./RollupLib.sol";
24
+
25
+ contract RollupCreator is Ownable {
26
+ event RollupCreated(
27
+ address indexed rollupAddress,
28
+ address inboxAddress,
29
+ address adminProxy,
30
+ address sequencerInbox,
31
+ address delayedBridge
32
+ );
33
+ event TemplatesUpdated();
34
+
35
+ BridgeCreator public bridgeCreator;
36
+ IOneStepProofEntry public osp;
37
+ IChallengeManager public challengeManagerTemplate;
38
+ IRollupAdmin public rollupAdminLogic;
39
+ IRollupUser public rollupUserLogic;
40
+
41
+ constructor() Ownable() {}
42
+
43
+ function setTemplates(
44
+ BridgeCreator _bridgeCreator,
45
+ IOneStepProofEntry _osp,
46
+ IChallengeManager _challengeManagerLogic,
47
+ IRollupAdmin _rollupAdminLogic,
48
+ IRollupUser _rollupUserLogic
49
+ ) external onlyOwner {
50
+ bridgeCreator = _bridgeCreator;
51
+ osp = _osp;
52
+ challengeManagerTemplate = _challengeManagerLogic;
53
+ rollupAdminLogic = _rollupAdminLogic;
54
+ rollupUserLogic = _rollupUserLogic;
55
+ emit TemplatesUpdated();
56
+ }
57
+
58
+ struct CreateRollupFrame {
59
+ ProxyAdmin admin;
60
+ Bridge delayedBridge;
61
+ SequencerInbox sequencerInbox;
62
+ Inbox inbox;
63
+ RollupEventBridge rollupEventBridge;
64
+ Outbox outbox;
65
+ ArbitrumProxy rollup;
66
+ }
67
+
68
+ // After this setup:
69
+ // Rollup should be the owner of bridge
70
+ // RollupOwner should be the owner of Rollup's ProxyAdmin
71
+ // RollupOwner should be the owner of Rollup
72
+ // Bridge should have a single inbox and outbox
73
+ function createRollup(Config memory config, address expectedRollupAddr)
74
+ external
75
+ returns (address)
76
+ {
77
+ CreateRollupFrame memory frame;
78
+ frame.admin = new ProxyAdmin();
79
+
80
+ (
81
+ frame.delayedBridge,
82
+ frame.sequencerInbox,
83
+ frame.inbox,
84
+ frame.rollupEventBridge,
85
+ frame.outbox
86
+ ) = bridgeCreator.createBridge(
87
+ address(frame.admin),
88
+ expectedRollupAddr,
89
+ config.sequencerInboxMaxTimeVariation
90
+ );
91
+
92
+ frame.admin.transferOwnership(config.owner);
93
+
94
+ IChallengeManager challengeManager = IChallengeManager(
95
+ address(
96
+ new TransparentUpgradeableProxy(
97
+ address(challengeManagerTemplate),
98
+ address(frame.admin),
99
+ ""
100
+ )
101
+ )
102
+ );
103
+ challengeManager.initialize(
104
+ IChallengeResultReceiver(expectedRollupAddr),
105
+ frame.sequencerInbox,
106
+ frame.delayedBridge,
107
+ osp
108
+ );
109
+
110
+ frame.rollup = new ArbitrumProxy(
111
+ config,
112
+ ContractDependencies({
113
+ delayedBridge: frame.delayedBridge,
114
+ sequencerInbox: frame.sequencerInbox,
115
+ outbox: frame.outbox,
116
+ rollupEventBridge: frame.rollupEventBridge,
117
+ challengeManager: challengeManager,
118
+ rollupAdminLogic: rollupAdminLogic,
119
+ rollupUserLogic: rollupUserLogic
120
+ })
121
+ );
122
+ require(address(frame.rollup) == expectedRollupAddr, "WRONG_ROLLUP_ADDR");
123
+
124
+ emit RollupCreated(
125
+ address(frame.rollup),
126
+ address(frame.inbox),
127
+ address(frame.admin),
128
+ address(frame.sequencerInbox),
129
+ address(frame.delayedBridge)
130
+ );
131
+ return address(frame.rollup);
132
+ }
133
+ }
@@ -0,0 +1,46 @@
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 "./IRollupLogic.sol";
8
+
9
+ import "../bridge/IBridge.sol";
10
+ import "../bridge/IMessageProvider.sol";
11
+ import "../libraries/DelegateCallAware.sol";
12
+ import {INITIALIZATION_MSG_TYPE} from "../libraries/MessageTypes.sol";
13
+
14
+ /**
15
+ * @title The inbox for rollup protocol events
16
+ */
17
+ contract RollupEventBridge is IMessageProvider, DelegateCallAware {
18
+ uint8 internal constant CREATE_NODE_EVENT = 0;
19
+ uint8 internal constant CONFIRM_NODE_EVENT = 1;
20
+ uint8 internal constant REJECT_NODE_EVENT = 2;
21
+ uint8 internal constant STAKE_CREATED_EVENT = 3;
22
+
23
+ IBridge public bridge;
24
+ address public rollup;
25
+
26
+ modifier onlyRollup() {
27
+ require(msg.sender == rollup, "ONLY_ROLLUP");
28
+ _;
29
+ }
30
+
31
+ function initialize(address _bridge, address _rollup) external onlyDelegated {
32
+ require(rollup == address(0), "ALREADY_INIT");
33
+ bridge = IBridge(_bridge);
34
+ rollup = _rollup;
35
+ }
36
+
37
+ function rollupInitialized(uint256 chainId) external onlyRollup {
38
+ bytes memory initMsg = abi.encodePacked(chainId);
39
+ uint256 num = bridge.enqueueDelayedMessage(
40
+ INITIALIZATION_MSG_TYPE,
41
+ address(0),
42
+ keccak256(initMsg)
43
+ );
44
+ emit InboxMessageDelivered(num, initMsg);
45
+ }
46
+ }
@@ -0,0 +1,135 @@
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 "../challenge/IChallengeManager.sol";
8
+ import "../challenge/ChallengeLib.sol";
9
+ import "../state/GlobalState.sol";
10
+ import "../bridge/ISequencerInbox.sol";
11
+
12
+ import "../bridge/IBridge.sol";
13
+ import "../bridge/IOutbox.sol";
14
+ import "./RollupEventBridge.sol";
15
+ import "./IRollupLogic.sol";
16
+
17
+ struct Config {
18
+ uint64 confirmPeriodBlocks;
19
+ uint64 extraChallengeTimeBlocks;
20
+ address stakeToken;
21
+ uint256 baseStake;
22
+ bytes32 wasmModuleRoot;
23
+ address owner;
24
+ address loserStakeEscrow;
25
+ uint256 chainId;
26
+ ISequencerInbox.MaxTimeVariation sequencerInboxMaxTimeVariation;
27
+ }
28
+
29
+ struct ContractDependencies {
30
+ IBridge delayedBridge;
31
+ ISequencerInbox sequencerInbox;
32
+ IOutbox outbox;
33
+ RollupEventBridge rollupEventBridge;
34
+ IChallengeManager challengeManager;
35
+ IRollupAdmin rollupAdminLogic;
36
+ IRollupUser rollupUserLogic;
37
+ }
38
+
39
+ library RollupLib {
40
+ using GlobalStateLib for GlobalState;
41
+
42
+ struct ExecutionState {
43
+ GlobalState globalState;
44
+ MachineStatus machineStatus;
45
+ }
46
+
47
+ function stateHash(ExecutionState calldata execState, uint256 inboxMaxCount)
48
+ internal
49
+ pure
50
+ returns (bytes32)
51
+ {
52
+ return
53
+ keccak256(
54
+ abi.encodePacked(
55
+ execState.globalState.hash(),
56
+ inboxMaxCount,
57
+ execState.machineStatus
58
+ )
59
+ );
60
+ }
61
+
62
+ /// @dev same as stateHash but expects execState in memory instead of calldata
63
+ function stateHashMem(ExecutionState memory execState, uint256 inboxMaxCount)
64
+ internal
65
+ pure
66
+ returns (bytes32)
67
+ {
68
+ return
69
+ keccak256(
70
+ abi.encodePacked(
71
+ execState.globalState.hash(),
72
+ inboxMaxCount,
73
+ execState.machineStatus
74
+ )
75
+ );
76
+ }
77
+
78
+ struct Assertion {
79
+ ExecutionState beforeState;
80
+ ExecutionState afterState;
81
+ uint64 numBlocks;
82
+ }
83
+
84
+ function executionHash(Assertion memory assertion) internal pure returns (bytes32) {
85
+ MachineStatus[2] memory statuses;
86
+ statuses[0] = assertion.beforeState.machineStatus;
87
+ statuses[1] = assertion.afterState.machineStatus;
88
+ GlobalState[2] memory globalStates;
89
+ globalStates[0] = assertion.beforeState.globalState;
90
+ globalStates[1] = assertion.afterState.globalState;
91
+ // TODO: benchmark how much this abstraction adds of gas overhead
92
+ return executionHash(statuses, globalStates, assertion.numBlocks);
93
+ }
94
+
95
+ function executionHash(
96
+ MachineStatus[2] memory statuses,
97
+ GlobalState[2] memory globalStates,
98
+ uint64 numBlocks
99
+ ) internal pure returns (bytes32) {
100
+ bytes32[] memory segments = new bytes32[](2);
101
+ segments[0] = ChallengeLib.blockStateHash(statuses[0], globalStates[0].hash());
102
+ segments[1] = ChallengeLib.blockStateHash(statuses[1], globalStates[1].hash());
103
+ return ChallengeLib.hashChallengeState(0, numBlocks, segments);
104
+ }
105
+
106
+ function challengeRootHash(
107
+ bytes32 execution,
108
+ uint256 proposedTime,
109
+ bytes32 wasmModuleRoot
110
+ ) internal pure returns (bytes32) {
111
+ return keccak256(abi.encodePacked(execution, proposedTime, wasmModuleRoot));
112
+ }
113
+
114
+ function confirmHash(Assertion memory assertion) internal pure returns (bytes32) {
115
+ return
116
+ confirmHash(
117
+ assertion.afterState.globalState.getBlockHash(),
118
+ assertion.afterState.globalState.getSendRoot()
119
+ );
120
+ }
121
+
122
+ function confirmHash(bytes32 blockHash, bytes32 sendRoot) internal pure returns (bytes32) {
123
+ return keccak256(abi.encodePacked(blockHash, sendRoot));
124
+ }
125
+
126
+ function nodeHash(
127
+ bool hasSibling,
128
+ bytes32 lastHash,
129
+ bytes32 assertionExecHash,
130
+ bytes32 inboxAcc
131
+ ) internal pure returns (bytes32) {
132
+ uint8 hasSiblingInt = hasSibling ? 1 : 0;
133
+ return keccak256(abi.encodePacked(hasSiblingInt, lastHash, assertionExecHash, inboxAcc));
134
+ }
135
+ }