@arbitrum/nitro-contracts 2.1.0 → 2.1.1-beta.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (232) hide show
  1. package/LICENSE.md +1 -1
  2. package/build/contracts/@openzeppelin/contracts/access/Ownable.sol/Ownable.dbg.json +1 -1
  3. package/build/contracts/@openzeppelin/contracts/interfaces/draft-IERC1822.sol/IERC1822Proxiable.dbg.json +1 -1
  4. package/build/contracts/@openzeppelin/contracts/proxy/ERC1967/ERC1967Proxy.sol/ERC1967Proxy.dbg.json +1 -1
  5. package/build/contracts/@openzeppelin/contracts/proxy/ERC1967/ERC1967Upgrade.sol/ERC1967Upgrade.dbg.json +1 -1
  6. package/build/contracts/@openzeppelin/contracts/proxy/Proxy.sol/Proxy.dbg.json +1 -1
  7. package/build/contracts/@openzeppelin/contracts/proxy/beacon/IBeacon.sol/IBeacon.dbg.json +1 -1
  8. package/build/contracts/@openzeppelin/contracts/proxy/beacon/UpgradeableBeacon.sol/UpgradeableBeacon.dbg.json +1 -1
  9. package/build/contracts/@openzeppelin/contracts/proxy/transparent/ProxyAdmin.sol/ProxyAdmin.dbg.json +1 -1
  10. package/build/contracts/@openzeppelin/contracts/proxy/transparent/TransparentUpgradeableProxy.sol/TransparentUpgradeableProxy.dbg.json +1 -1
  11. package/build/contracts/@openzeppelin/contracts/proxy/utils/UUPSUpgradeable.sol/UUPSUpgradeable.dbg.json +1 -1
  12. package/build/contracts/@openzeppelin/contracts/security/ReentrancyGuard.sol/ReentrancyGuard.dbg.json +1 -1
  13. package/build/contracts/@openzeppelin/contracts/token/ERC20/ERC20.sol/ERC20.dbg.json +1 -1
  14. package/build/contracts/@openzeppelin/contracts/token/ERC20/IERC20.sol/IERC20.dbg.json +1 -1
  15. package/build/contracts/@openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol/IERC20Metadata.dbg.json +1 -1
  16. package/build/contracts/@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol/SafeERC20.dbg.json +1 -1
  17. package/build/contracts/@openzeppelin/contracts/utils/Address.sol/Address.dbg.json +1 -1
  18. package/build/contracts/@openzeppelin/contracts/utils/Context.sol/Context.dbg.json +1 -1
  19. package/build/contracts/@openzeppelin/contracts/utils/StorageSlot.sol/StorageSlot.dbg.json +1 -1
  20. package/build/contracts/@openzeppelin/contracts/utils/Strings.sol/Strings.dbg.json +1 -1
  21. package/build/contracts/@openzeppelin/contracts/utils/cryptography/ECDSA.sol/ECDSA.dbg.json +4 -0
  22. package/build/contracts/@openzeppelin/contracts/utils/cryptography/ECDSA.sol/ECDSA.json +10 -0
  23. package/build/contracts/@openzeppelin/contracts-upgradeable/access/AccessControlEnumerableUpgradeable.sol/AccessControlEnumerableUpgradeable.dbg.json +4 -0
  24. package/build/contracts/@openzeppelin/contracts-upgradeable/access/AccessControlEnumerableUpgradeable.sol/AccessControlEnumerableUpgradeable.json +258 -0
  25. package/build/contracts/@openzeppelin/contracts-upgradeable/access/AccessControlUpgradeable.sol/AccessControlUpgradeable.dbg.json +1 -1
  26. package/build/contracts/@openzeppelin/contracts-upgradeable/access/IAccessControlEnumerableUpgradeable.sol/IAccessControlEnumerableUpgradeable.dbg.json +4 -0
  27. package/build/contracts/@openzeppelin/contracts-upgradeable/access/IAccessControlEnumerableUpgradeable.sol/IAccessControlEnumerableUpgradeable.json +226 -0
  28. package/build/contracts/@openzeppelin/contracts-upgradeable/access/IAccessControlUpgradeable.sol/IAccessControlUpgradeable.dbg.json +1 -1
  29. package/build/contracts/@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol/OwnableUpgradeable.dbg.json +1 -1
  30. package/build/contracts/@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol/Initializable.dbg.json +1 -1
  31. package/build/contracts/@openzeppelin/contracts-upgradeable/security/PausableUpgradeable.sol/PausableUpgradeable.dbg.json +1 -1
  32. package/build/contracts/@openzeppelin/contracts-upgradeable/token/ERC20/ERC20Upgradeable.sol/ERC20Upgradeable.dbg.json +4 -0
  33. package/build/contracts/@openzeppelin/contracts-upgradeable/token/ERC20/ERC20Upgradeable.sol/ERC20Upgradeable.json +281 -0
  34. package/build/contracts/@openzeppelin/contracts-upgradeable/token/ERC20/IERC20Upgradeable.sol/IERC20Upgradeable.dbg.json +1 -1
  35. package/build/contracts/@openzeppelin/contracts-upgradeable/token/ERC20/extensions/ERC20BurnableUpgradeable.sol/ERC20BurnableUpgradeable.dbg.json +4 -0
  36. package/build/contracts/@openzeppelin/contracts-upgradeable/token/ERC20/extensions/ERC20BurnableUpgradeable.sol/ERC20BurnableUpgradeable.json +312 -0
  37. package/build/contracts/@openzeppelin/contracts-upgradeable/token/ERC20/extensions/IERC20MetadataUpgradeable.sol/IERC20MetadataUpgradeable.dbg.json +4 -0
  38. package/build/contracts/@openzeppelin/contracts-upgradeable/token/ERC20/extensions/IERC20MetadataUpgradeable.sol/IERC20MetadataUpgradeable.json +233 -0
  39. package/build/contracts/@openzeppelin/contracts-upgradeable/utils/AddressUpgradeable.sol/AddressUpgradeable.dbg.json +1 -1
  40. package/build/contracts/@openzeppelin/contracts-upgradeable/utils/ContextUpgradeable.sol/ContextUpgradeable.dbg.json +1 -1
  41. package/build/contracts/@openzeppelin/contracts-upgradeable/utils/StorageSlotUpgradeable.sol/StorageSlotUpgradeable.dbg.json +1 -1
  42. package/build/contracts/@openzeppelin/contracts-upgradeable/utils/StringsUpgradeable.sol/StringsUpgradeable.dbg.json +1 -1
  43. package/build/contracts/@openzeppelin/contracts-upgradeable/utils/cryptography/ECDSAUpgradeable.sol/ECDSAUpgradeable.dbg.json +4 -0
  44. package/build/contracts/@openzeppelin/contracts-upgradeable/utils/cryptography/ECDSAUpgradeable.sol/ECDSAUpgradeable.json +10 -0
  45. package/build/contracts/@openzeppelin/contracts-upgradeable/utils/cryptography/draft-EIP712Upgradeable.sol/EIP712Upgradeable.dbg.json +4 -0
  46. package/build/contracts/@openzeppelin/contracts-upgradeable/utils/cryptography/draft-EIP712Upgradeable.sol/EIP712Upgradeable.json +10 -0
  47. package/build/contracts/@openzeppelin/contracts-upgradeable/utils/introspection/ERC165Upgradeable.sol/ERC165Upgradeable.dbg.json +1 -1
  48. package/build/contracts/@openzeppelin/contracts-upgradeable/utils/introspection/IERC165Upgradeable.sol/IERC165Upgradeable.dbg.json +1 -1
  49. package/build/contracts/@openzeppelin/contracts-upgradeable/utils/structs/EnumerableSetUpgradeable.sol/EnumerableSetUpgradeable.dbg.json +4 -0
  50. package/build/contracts/@openzeppelin/contracts-upgradeable/utils/structs/EnumerableSetUpgradeable.sol/EnumerableSetUpgradeable.json +10 -0
  51. package/build/contracts/src/bridge/AbsBridge.sol/AbsBridge.dbg.json +1 -1
  52. package/build/contracts/src/bridge/AbsInbox.sol/AbsInbox.dbg.json +1 -1
  53. package/build/contracts/src/bridge/AbsOutbox.sol/AbsOutbox.dbg.json +1 -1
  54. package/build/contracts/src/bridge/Bridge.sol/Bridge.dbg.json +1 -1
  55. package/build/contracts/src/bridge/ERC20Bridge.sol/ERC20Bridge.dbg.json +1 -1
  56. package/build/contracts/src/bridge/ERC20Inbox.sol/ERC20Inbox.dbg.json +1 -1
  57. package/build/contracts/src/bridge/ERC20Outbox.sol/ERC20Outbox.dbg.json +1 -1
  58. package/build/contracts/src/bridge/GasRefunder.sol/GasRefunder.dbg.json +1 -1
  59. package/build/contracts/src/bridge/IBridge.sol/IBridge.dbg.json +1 -1
  60. package/build/contracts/src/bridge/IDelayedMessageProvider.sol/IDelayedMessageProvider.dbg.json +1 -1
  61. package/build/contracts/src/bridge/IERC20Bridge.sol/IERC20Bridge.dbg.json +1 -1
  62. package/build/contracts/src/bridge/IERC20Inbox.sol/IERC20Inbox.dbg.json +1 -1
  63. package/build/contracts/src/bridge/IEthBridge.sol/IEthBridge.dbg.json +1 -1
  64. package/build/contracts/src/bridge/IInbox.sol/IInbox.dbg.json +1 -1
  65. package/build/contracts/src/bridge/IInboxBase.sol/IInboxBase.dbg.json +1 -1
  66. package/build/contracts/src/bridge/IOutbox.sol/IOutbox.dbg.json +1 -1
  67. package/build/contracts/src/bridge/IOwnable.sol/IOwnable.dbg.json +1 -1
  68. package/build/contracts/src/bridge/ISequencerInbox.sol/ISequencerInbox.dbg.json +1 -1
  69. package/build/contracts/src/bridge/Inbox.sol/Inbox.dbg.json +1 -1
  70. package/build/contracts/src/bridge/Inbox.sol/Inbox.json +2 -2
  71. package/build/contracts/src/bridge/Messages.sol/Messages.dbg.json +1 -1
  72. package/build/contracts/src/bridge/Outbox.sol/Outbox.dbg.json +1 -1
  73. package/build/contracts/src/bridge/SequencerInbox.sol/SequencerInbox.dbg.json +1 -1
  74. package/build/contracts/src/bridge/SequencerInbox.sol/SequencerInbox.json +2 -2
  75. package/build/contracts/src/chain/CacheManager.sol/CacheManager.dbg.json +1 -1
  76. package/build/contracts/src/chain/CacheManager.sol/CacheManager.json +2 -2
  77. package/build/contracts/src/challenge/ChallengeLib.sol/ChallengeLib.dbg.json +1 -1
  78. package/build/contracts/src/challenge/ChallengeManager.sol/ChallengeManager.dbg.json +1 -1
  79. package/build/contracts/src/challenge/IChallengeManager.sol/IChallengeManager.dbg.json +1 -1
  80. package/build/contracts/src/challenge/IChallengeResultReceiver.sol/IChallengeResultReceiver.dbg.json +1 -1
  81. package/build/contracts/src/express-lane-auction/Balance.sol/BalanceLib.dbg.json +4 -0
  82. package/build/contracts/src/express-lane-auction/Balance.sol/BalanceLib.json +10 -0
  83. package/build/contracts/src/express-lane-auction/Burner.sol/Burner.dbg.json +4 -0
  84. package/build/contracts/src/express-lane-auction/Burner.sol/Burner.json +47 -0
  85. package/build/contracts/src/express-lane-auction/ELCRound.sol/LatestELCRoundsLib.dbg.json +4 -0
  86. package/build/contracts/src/express-lane-auction/ELCRound.sol/LatestELCRoundsLib.json +10 -0
  87. package/build/contracts/src/express-lane-auction/ExpressLaneAuction.sol/ExpressLaneAuction.dbg.json +4 -0
  88. package/build/contracts/src/express-lane-auction/ExpressLaneAuction.sol/ExpressLaneAuction.json +1588 -0
  89. package/build/contracts/src/express-lane-auction/IExpressLaneAuction.sol/IExpressLaneAuction.dbg.json +4 -0
  90. package/build/contracts/src/express-lane-auction/IExpressLaneAuction.sol/IExpressLaneAuction.json +1296 -0
  91. package/build/contracts/src/express-lane-auction/RoundTimingInfo.sol/RoundTimingInfoLib.dbg.json +4 -0
  92. package/build/contracts/src/express-lane-auction/RoundTimingInfo.sol/RoundTimingInfoLib.json +10 -0
  93. package/build/contracts/src/libraries/AddressAliasHelper.sol/AddressAliasHelper.dbg.json +1 -1
  94. package/build/contracts/src/libraries/AdminFallbackProxy.sol/AdminFallbackProxy.dbg.json +1 -1
  95. package/build/contracts/src/libraries/AdminFallbackProxy.sol/DoubleLogicERC1967Upgrade.dbg.json +1 -1
  96. package/build/contracts/src/libraries/ArbitrumChecker.sol/ArbitrumChecker.dbg.json +1 -1
  97. package/build/contracts/src/libraries/ArbitrumChecker.sol/ArbitrumChecker.json +2 -2
  98. package/build/contracts/src/libraries/CryptographyPrimitives.sol/CryptographyPrimitives.dbg.json +1 -1
  99. package/build/contracts/src/libraries/DecimalsConverterHelper.sol/DecimalsConverterHelper.dbg.json +1 -1
  100. package/build/contracts/src/libraries/DelegateCallAware.sol/DelegateCallAware.dbg.json +1 -1
  101. package/build/contracts/src/libraries/DoubleLogicUUPSUpgradeable.sol/DoubleLogicUUPSUpgradeable.dbg.json +1 -1
  102. package/build/contracts/src/libraries/GasRefundEnabled.sol/GasRefundEnabled.dbg.json +1 -1
  103. package/build/contracts/src/libraries/IGasRefunder.sol/IGasRefunder.dbg.json +1 -1
  104. package/build/contracts/src/libraries/IReader4844.sol/IReader4844.dbg.json +1 -1
  105. package/build/contracts/src/libraries/MerkleLib.sol/MerkleLib.dbg.json +1 -1
  106. package/build/contracts/src/libraries/UUPSNotUpgradeable.sol/UUPSNotUpgradeable.dbg.json +1 -1
  107. package/build/contracts/src/mocks/Benchmarks.sol/Benchmarks.dbg.json +1 -1
  108. package/build/contracts/src/mocks/BridgeStub.sol/BridgeStub.dbg.json +1 -1
  109. package/build/contracts/src/mocks/BridgeUnproxied.sol/BridgeUnproxied.dbg.json +1 -1
  110. package/build/contracts/src/mocks/BridgeUnproxied.sol/BridgeUnproxied.json +15 -2
  111. package/build/contracts/src/mocks/CreateTest.sol/CreateTest.dbg.json +4 -0
  112. package/build/contracts/src/mocks/CreateTest.sol/CreateTest.json +15 -0
  113. package/build/contracts/src/mocks/HostioTest.sol/HostioTest.dbg.json +4 -0
  114. package/build/contracts/src/mocks/HostioTest.sol/HostioTest.json +513 -0
  115. package/build/contracts/src/mocks/InboxStub.sol/InboxStub.dbg.json +1 -1
  116. package/build/contracts/src/mocks/MockResultReceiver.sol/MockResultReceiver.dbg.json +1 -1
  117. package/build/contracts/src/mocks/MultiCallTest.sol/MultiCallTest.dbg.json +1 -1
  118. package/build/contracts/src/mocks/PendingBlkTimeAndNrAdvanceCheck.sol/PendingBlkTimeAndNrAdvanceCheck.dbg.json +1 -1
  119. package/build/contracts/src/mocks/PendingBlkTimeAndNrAdvanceCheck.sol/PendingBlkTimeAndNrAdvanceCheck.json +2 -2
  120. package/build/contracts/src/mocks/Program.sol/ProgramTest.dbg.json +1 -1
  121. package/build/contracts/src/mocks/Program.sol/ProgramTest.json +2 -2
  122. package/build/contracts/src/mocks/ProxyAdminForBinding.sol/ProxyAdminForBinding.dbg.json +1 -1
  123. package/build/contracts/src/mocks/SdkStorage.sol/SdkStorage.dbg.json +1 -1
  124. package/build/contracts/src/mocks/SequencerInboxStub.sol/SequencerInboxStub.dbg.json +1 -1
  125. package/build/contracts/src/mocks/SequencerInboxStub.sol/SequencerInboxStub.json +2 -2
  126. package/build/contracts/src/mocks/Simple.sol/Simple.dbg.json +1 -1
  127. package/build/contracts/src/mocks/Simple.sol/Simple.json +2 -2
  128. package/build/contracts/src/mocks/SimpleCacheManager.sol/SimpleCacheManager.dbg.json +1 -1
  129. package/build/contracts/src/mocks/SimpleProxy.sol/SimpleProxy.dbg.json +1 -1
  130. package/build/contracts/src/mocks/SingleExecutionChallenge.sol/SingleExecutionChallenge.dbg.json +1 -1
  131. package/build/contracts/src/mocks/TimedOutChallengeManager.sol/TimedOutChallengeManager.dbg.json +1 -1
  132. package/build/contracts/src/mocks/UpgradeExecutorMock.sol/UpgradeExecutorMock.dbg.json +1 -1
  133. package/build/contracts/src/node-interface/NodeInterface.sol/NodeInterface.dbg.json +1 -1
  134. package/build/contracts/src/node-interface/NodeInterfaceDebug.sol/NodeInterfaceDebug.dbg.json +1 -1
  135. package/build/contracts/src/osp/HashProofHelper.sol/HashProofHelper.dbg.json +1 -1
  136. package/build/contracts/src/osp/IOneStepProofEntry.sol/IOneStepProofEntry.dbg.json +1 -1
  137. package/build/contracts/src/osp/IOneStepProofEntry.sol/OneStepProofEntryLib.dbg.json +1 -1
  138. package/build/contracts/src/osp/IOneStepProver.sol/IOneStepProver.dbg.json +1 -1
  139. package/build/contracts/src/osp/OneStepProofEntry.sol/OneStepProofEntry.dbg.json +1 -1
  140. package/build/contracts/src/osp/OneStepProver0.sol/OneStepProver0.dbg.json +1 -1
  141. package/build/contracts/src/osp/OneStepProverHostIo.sol/OneStepProverHostIo.dbg.json +1 -1
  142. package/build/contracts/src/osp/OneStepProverMath.sol/OneStepProverMath.dbg.json +1 -1
  143. package/build/contracts/src/osp/OneStepProverMemory.sol/OneStepProverMemory.dbg.json +1 -1
  144. package/build/contracts/src/precompiles/ArbAddressTable.sol/ArbAddressTable.dbg.json +1 -1
  145. package/build/contracts/src/precompiles/ArbAggregator.sol/ArbAggregator.dbg.json +1 -1
  146. package/build/contracts/src/precompiles/ArbBLS.sol/ArbBLS.dbg.json +1 -1
  147. package/build/contracts/src/precompiles/ArbDebug.sol/ArbDebug.dbg.json +1 -1
  148. package/build/contracts/src/precompiles/ArbFunctionTable.sol/ArbFunctionTable.dbg.json +1 -1
  149. package/build/contracts/src/precompiles/ArbGasInfo.sol/ArbGasInfo.dbg.json +1 -1
  150. package/build/contracts/src/precompiles/ArbInfo.sol/ArbInfo.dbg.json +1 -1
  151. package/build/contracts/src/precompiles/ArbOwner.sol/ArbOwner.dbg.json +1 -1
  152. package/build/contracts/src/precompiles/ArbOwnerPublic.sol/ArbOwnerPublic.dbg.json +1 -1
  153. package/build/contracts/src/precompiles/ArbRetryableTx.sol/ArbRetryableTx.dbg.json +1 -1
  154. package/build/contracts/src/precompiles/ArbStatistics.sol/ArbStatistics.dbg.json +1 -1
  155. package/build/contracts/src/precompiles/ArbSys.sol/ArbSys.dbg.json +1 -1
  156. package/build/contracts/src/precompiles/ArbWasm.sol/ArbWasm.dbg.json +1 -1
  157. package/build/contracts/src/precompiles/ArbWasm.sol/ArbWasm.json +4 -4
  158. package/build/contracts/src/precompiles/ArbWasmCache.sol/ArbWasmCache.dbg.json +1 -1
  159. package/build/contracts/src/precompiles/ArbosActs.sol/ArbosActs.dbg.json +1 -1
  160. package/build/contracts/src/precompiles/ArbosTest.sol/ArbosTest.dbg.json +1 -1
  161. package/build/contracts/src/rollup/AbsRollupEventInbox.sol/AbsRollupEventInbox.dbg.json +1 -1
  162. package/build/contracts/src/rollup/BridgeCreator.sol/BridgeCreator.dbg.json +1 -1
  163. package/build/contracts/src/rollup/BridgeCreator.sol/BridgeCreator.json +2 -2
  164. package/build/contracts/src/rollup/DeployHelper.sol/DeployHelper.dbg.json +1 -1
  165. package/build/contracts/src/rollup/ERC20RollupEventInbox.sol/ERC20RollupEventInbox.dbg.json +1 -1
  166. package/build/contracts/src/rollup/ERC20RollupEventInbox.sol/ERC20RollupEventInbox.json +2 -2
  167. package/build/contracts/src/rollup/FactoryDeployerHelper.sol/FactoryDeployerHelper.dbg.json +1 -1
  168. package/build/contracts/src/rollup/FactoryDeployerHelper.sol/IDeployHelper.dbg.json +1 -1
  169. package/build/contracts/src/rollup/FactoryDeployerHelper.sol/IERC20.dbg.json +1 -1
  170. package/build/contracts/src/rollup/FactoryDeployerHelper.sol/IERC20Bridge.dbg.json +1 -1
  171. package/build/contracts/src/rollup/FactoryDeployerHelper.sol/IInboxBase.dbg.json +1 -1
  172. package/build/contracts/src/rollup/IRollupAdmin.sol/IRollupAdmin.dbg.json +1 -1
  173. package/build/contracts/src/rollup/IRollupCore.sol/IRollupCore.dbg.json +1 -1
  174. package/build/contracts/src/rollup/IRollupEventInbox.sol/IRollupEventInbox.dbg.json +1 -1
  175. package/build/contracts/src/rollup/IRollupLogic.sol/IRollupUser.dbg.json +1 -1
  176. package/build/contracts/src/rollup/IRollupLogic.sol/IRollupUserAbs.dbg.json +1 -1
  177. package/build/contracts/src/rollup/IRollupLogic.sol/IRollupUserERC20.dbg.json +1 -1
  178. package/build/contracts/src/rollup/Node.sol/NodeLib.dbg.json +1 -1
  179. package/build/contracts/src/rollup/RollupAdminLogic.sol/RollupAdminLogic.dbg.json +1 -1
  180. package/build/contracts/src/rollup/RollupAdminLogic.sol/RollupAdminLogic.json +2 -2
  181. package/build/contracts/src/rollup/RollupCore.sol/RollupCore.dbg.json +1 -1
  182. package/build/contracts/src/rollup/RollupCreator.sol/RollupCreator.dbg.json +1 -1
  183. package/build/contracts/src/rollup/RollupCreator.sol/RollupCreator.json +2 -2
  184. package/build/contracts/src/rollup/RollupEventInbox.sol/RollupEventInbox.dbg.json +1 -1
  185. package/build/contracts/src/rollup/RollupEventInbox.sol/RollupEventInbox.json +2 -2
  186. package/build/contracts/src/rollup/RollupLib.sol/RollupLib.dbg.json +1 -1
  187. package/build/contracts/src/rollup/RollupProxy.sol/RollupProxy.dbg.json +1 -1
  188. package/build/contracts/src/rollup/RollupUserLogic.sol/AbsRollupUserLogic.dbg.json +1 -1
  189. package/build/contracts/src/rollup/RollupUserLogic.sol/ERC20RollupUserLogic.dbg.json +1 -1
  190. package/build/contracts/src/rollup/RollupUserLogic.sol/ERC20RollupUserLogic.json +2 -2
  191. package/build/contracts/src/rollup/RollupUserLogic.sol/RollupUserLogic.dbg.json +1 -1
  192. package/build/contracts/src/rollup/RollupUserLogic.sol/RollupUserLogic.json +2 -2
  193. package/build/contracts/src/rollup/ValidatorUtils.sol/ValidatorUtils.dbg.json +1 -1
  194. package/build/contracts/src/rollup/ValidatorWallet.sol/ValidatorWallet.dbg.json +1 -1
  195. package/build/contracts/src/rollup/ValidatorWalletCreator.sol/ValidatorWalletCreator.dbg.json +1 -1
  196. package/build/contracts/src/state/Deserialize.sol/Deserialize.dbg.json +1 -1
  197. package/build/contracts/src/state/GlobalState.sol/GlobalStateLib.dbg.json +1 -1
  198. package/build/contracts/src/state/Instructions.sol/Instructions.dbg.json +1 -1
  199. package/build/contracts/src/state/Machine.sol/MachineLib.dbg.json +1 -1
  200. package/build/contracts/src/state/MerkleProof.sol/MerkleProofLib.dbg.json +1 -1
  201. package/build/contracts/src/state/Module.sol/ModuleLib.dbg.json +1 -1
  202. package/build/contracts/src/state/ModuleMemory.sol/ModuleMemoryLib.dbg.json +1 -1
  203. package/build/contracts/src/state/ModuleMemoryCompact.sol/ModuleMemoryCompactLib.dbg.json +1 -1
  204. package/build/contracts/src/state/MultiStack.sol/MultiStackLib.dbg.json +1 -1
  205. package/build/contracts/src/state/PcArray.sol/PcArrayLib.dbg.json +1 -1
  206. package/build/contracts/src/state/StackFrame.sol/StackFrameLib.dbg.json +1 -1
  207. package/build/contracts/src/state/Value.sol/ValueLib.dbg.json +1 -1
  208. package/build/contracts/src/state/ValueArray.sol/ValueArrayLib.dbg.json +1 -1
  209. package/build/contracts/src/state/ValueStack.sol/ValueStackLib.dbg.json +1 -1
  210. package/build/contracts/src/test-helpers/BridgeTester.sol/BridgeTester.dbg.json +1 -1
  211. package/build/contracts/src/test-helpers/CryptographyPrimitivesTester.sol/CryptographyPrimitivesTester.dbg.json +1 -1
  212. package/build/contracts/src/test-helpers/EthVault.sol/EthVault.dbg.json +1 -1
  213. package/build/contracts/src/test-helpers/MessageTester.sol/MessageTester.dbg.json +1 -1
  214. package/build/contracts/src/test-helpers/OutboxWithoutOptTester.sol/OutboxWithoutOptTester.dbg.json +1 -1
  215. package/build/contracts/src/test-helpers/RollupMock.sol/RollupMock.dbg.json +1 -1
  216. package/build/contracts/src/test-helpers/TestToken.sol/TestToken.dbg.json +1 -1
  217. package/build/contracts/src/test-helpers/ValueArrayTester.sol/ValueArrayTester.dbg.json +1 -1
  218. package/out/yul/Reader4844.yul/Reader4844.json +1 -1
  219. package/package.json +5 -2
  220. package/src/express-lane-auction/Balance.sol +142 -0
  221. package/src/express-lane-auction/Burner.sol +25 -0
  222. package/src/express-lane-auction/ELCRound.sol +73 -0
  223. package/src/express-lane-auction/Errors.sol +31 -0
  224. package/src/express-lane-auction/ExpressLaneAuction.sol +565 -0
  225. package/src/express-lane-auction/IExpressLaneAuction.sol +421 -0
  226. package/src/express-lane-auction/RoundTimingInfo.sol +115 -0
  227. package/src/mocks/BridgeUnproxied.sol +2 -0
  228. package/src/mocks/CreateTest.sol +42 -0
  229. package/src/mocks/HostioTest.sol +196 -0
  230. package/src/precompiles/ArbSys.sol +2 -1
  231. package/src/precompiles/ArbWasm.sol +1 -1
  232. package/src/rollup/RollupCreator.sol +4 -4
@@ -0,0 +1,565 @@
1
+ // SPDX-License-Identifier: BUSL-1.1
2
+ pragma solidity ^0.8.0;
3
+
4
+ import "./Errors.sol";
5
+ import {Balance, BalanceLib} from "./Balance.sol";
6
+ import {SafeERC20, IERC20} from "@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol";
7
+ import {ECDSA} from "@openzeppelin/contracts/utils/cryptography/ECDSA.sol";
8
+ import {
9
+ AccessControlEnumerableUpgradeable
10
+ } from "@openzeppelin/contracts-upgradeable/access/AccessControlEnumerableUpgradeable.sol";
11
+ import {DelegateCallAware} from "../libraries/DelegateCallAware.sol";
12
+ import {IExpressLaneAuction, Bid, InitArgs, Transferor} from "./IExpressLaneAuction.sol";
13
+ import {ELCRound, LatestELCRoundsLib} from "./ELCRound.sol";
14
+ import {RoundTimingInfo, RoundTimingInfoLib} from "./RoundTimingInfo.sol";
15
+ import {
16
+ EIP712Upgradeable
17
+ } from "@openzeppelin/contracts-upgradeable/utils/cryptography/draft-EIP712Upgradeable.sol";
18
+
19
+ /// @title ExpressLaneAuction
20
+ /// @notice The express lane allows a controller to submit undelayed transactions to the sequencer
21
+ /// The right to be the express lane controller are auctioned off in rounds, by an offchain auctioneer.
22
+ /// The auctioneer then submits the winning bids to this control to deduct funds from the bidders and register the winner
23
+ contract ExpressLaneAuction is
24
+ IExpressLaneAuction,
25
+ AccessControlEnumerableUpgradeable,
26
+ DelegateCallAware,
27
+ EIP712Upgradeable
28
+ {
29
+ using SafeERC20 for IERC20;
30
+ using RoundTimingInfoLib for RoundTimingInfo;
31
+ using BalanceLib for Balance;
32
+ using ECDSA for bytes32;
33
+ using ECDSA for bytes;
34
+ using LatestELCRoundsLib for ELCRound[2];
35
+
36
+ /// @inheritdoc IExpressLaneAuction
37
+ bytes32 public constant AUCTIONEER_ROLE = keccak256("AUCTIONEER");
38
+ /// @inheritdoc IExpressLaneAuction
39
+ bytes32 public constant AUCTIONEER_ADMIN_ROLE = keccak256("AUCTIONEER_ADMIN");
40
+ /// @inheritdoc IExpressLaneAuction
41
+ bytes32 public constant MIN_RESERVE_SETTER_ROLE = keccak256("MIN_RESERVE_SETTER");
42
+ /// @inheritdoc IExpressLaneAuction
43
+ bytes32 public constant RESERVE_SETTER_ROLE = keccak256("RESERVE_SETTER");
44
+ /// @inheritdoc IExpressLaneAuction
45
+ bytes32 public constant RESERVE_SETTER_ADMIN_ROLE = keccak256("RESERVE_SETTER_ADMIN");
46
+ /// @inheritdoc IExpressLaneAuction
47
+ bytes32 public constant BENEFICIARY_SETTER_ROLE = keccak256("BENEFICIARY_SETTER");
48
+ /// @inheritdoc IExpressLaneAuction
49
+ bytes32 public constant ROUND_TIMING_SETTER_ROLE = keccak256("ROUND_TIMING_SETTER");
50
+
51
+ /// @notice The balances of each address
52
+ mapping(address => Balance) internal _balanceOf;
53
+
54
+ /// @dev Recently resolved round information. Contains the two most recently resolved rounds
55
+ ELCRound[2] internal latestResolvedRounds;
56
+
57
+ /// @inheritdoc IExpressLaneAuction
58
+ address public beneficiary;
59
+
60
+ /// @inheritdoc IExpressLaneAuction
61
+ IERC20 public biddingToken;
62
+
63
+ /// @inheritdoc IExpressLaneAuction
64
+ uint256 public reservePrice;
65
+
66
+ /// @inheritdoc IExpressLaneAuction
67
+ uint256 public minReservePrice;
68
+
69
+ /// @inheritdoc IExpressLaneAuction
70
+ RoundTimingInfo public roundTimingInfo;
71
+
72
+ /// @inheritdoc IExpressLaneAuction
73
+ uint256 public beneficiaryBalance;
74
+
75
+ /// @inheritdoc IExpressLaneAuction
76
+ mapping(address => Transferor) public transferorOf;
77
+
78
+ /// @inheritdoc IExpressLaneAuction
79
+ function initialize(InitArgs calldata args) public initializer onlyDelegated {
80
+ __AccessControl_init();
81
+ __EIP712_init("ExpressLaneAuction", "1");
82
+
83
+ if (address(args._biddingToken) == address(0)) {
84
+ revert ZeroBiddingToken();
85
+ }
86
+ biddingToken = IERC20(args._biddingToken);
87
+
88
+ beneficiary = args._beneficiary;
89
+ emit SetBeneficiary(address(0), args._beneficiary);
90
+
91
+ minReservePrice = args._minReservePrice;
92
+ emit SetMinReservePrice(0, args._minReservePrice);
93
+
94
+ reservePrice = args._minReservePrice;
95
+ emit SetReservePrice(0, args._minReservePrice);
96
+
97
+ // the initial timestamp cannot be negative
98
+ if (args._roundTimingInfo.offsetTimestamp < 0) {
99
+ revert NegativeOffset();
100
+ }
101
+ setRoundTimingInfoInternal(args._roundTimingInfo);
102
+
103
+ // roles without a custom role admin set will have this as the admin
104
+ _grantRole(DEFAULT_ADMIN_ROLE, args._masterAdmin);
105
+ _grantRole(MIN_RESERVE_SETTER_ROLE, args._minReservePriceSetter);
106
+ _grantRole(BENEFICIARY_SETTER_ROLE, args._beneficiarySetter);
107
+
108
+ // the following roles are expected to be controlled by hot wallets, so we add
109
+ // additional custom admin role for each of them to allow for key rotation management
110
+ setRoleAndAdmin(
111
+ AUCTIONEER_ROLE,
112
+ args._auctioneer,
113
+ AUCTIONEER_ADMIN_ROLE,
114
+ args._auctioneerAdmin
115
+ );
116
+ setRoleAndAdmin(
117
+ RESERVE_SETTER_ROLE,
118
+ args._reservePriceSetter,
119
+ RESERVE_SETTER_ADMIN_ROLE,
120
+ args._reservePriceSetterAdmin
121
+ );
122
+ _grantRole(ROUND_TIMING_SETTER_ROLE, args._roundTimingSetter);
123
+ }
124
+
125
+ /// @notice Set an address for a role, an admin role for the role, and an address for the admin role
126
+ function setRoleAndAdmin(
127
+ bytes32 role,
128
+ address roleAddr,
129
+ bytes32 adminRole,
130
+ address adminRoleAddr
131
+ ) internal {
132
+ _grantRole(role, roleAddr);
133
+ _grantRole(adminRole, adminRoleAddr);
134
+ _setRoleAdmin(role, adminRole);
135
+ }
136
+
137
+ /// @inheritdoc IExpressLaneAuction
138
+ function currentRound() external view returns (uint64) {
139
+ return roundTimingInfo.currentRound();
140
+ }
141
+
142
+ /// @inheritdoc IExpressLaneAuction
143
+ function isAuctionRoundClosed() external view returns (bool) {
144
+ return roundTimingInfo.isAuctionRoundClosed();
145
+ }
146
+
147
+ /// @inheritdoc IExpressLaneAuction
148
+ function isReserveBlackout() external view returns (bool) {
149
+ (ELCRound storage lastRoundResolved, ) = latestResolvedRounds.latestELCRound();
150
+ return roundTimingInfo.isReserveBlackout(lastRoundResolved.round);
151
+ }
152
+
153
+ /// @inheritdoc IExpressLaneAuction
154
+ function roundTimestamps(uint64 round) external view returns (uint64, uint64) {
155
+ return roundTimingInfo.roundTimestamps(round);
156
+ }
157
+
158
+ /// @inheritdoc IExpressLaneAuction
159
+ function setBeneficiary(address newBeneficiary) external onlyRole(BENEFICIARY_SETTER_ROLE) {
160
+ emit SetBeneficiary(beneficiary, newBeneficiary);
161
+ beneficiary = newBeneficiary;
162
+ }
163
+
164
+ function _setReservePrice(uint256 newReservePrice) private {
165
+ if (newReservePrice < minReservePrice) {
166
+ revert ReservePriceTooLow(newReservePrice, minReservePrice);
167
+ }
168
+
169
+ emit SetReservePrice(reservePrice, newReservePrice);
170
+ reservePrice = newReservePrice;
171
+ }
172
+
173
+ function setRoundTimingInfoInternal(RoundTimingInfo calldata newRoundTimingInfo) internal {
174
+ // auction closing seconds of 0 wouldnt make sense as it would then be impossible to close the round
175
+ // due to the check below this also causes round duration > 0
176
+ if (newRoundTimingInfo.auctionClosingSeconds == 0) {
177
+ revert ZeroAuctionClosingSeconds();
178
+ }
179
+
180
+ // ensure that round duration cannot be too high, other wise this could be used to lock balances
181
+ // in the contract by setting round duration = uint.max
182
+ if (newRoundTimingInfo.roundDurationSeconds > 1 days) {
183
+ revert RoundTooLong(newRoundTimingInfo.roundDurationSeconds);
184
+ }
185
+
186
+ // the same check as in initialization - reserve submission and auction closing are non overlapping
187
+ // sub sections of a round, so must fit within it
188
+ if (
189
+ newRoundTimingInfo.reserveSubmissionSeconds + newRoundTimingInfo.auctionClosingSeconds >
190
+ newRoundTimingInfo.roundDurationSeconds
191
+ ) {
192
+ revert RoundDurationTooShort();
193
+ }
194
+
195
+ roundTimingInfo = newRoundTimingInfo;
196
+ emit SetRoundTimingInfo(
197
+ newRoundTimingInfo.currentRound(),
198
+ newRoundTimingInfo.offsetTimestamp,
199
+ newRoundTimingInfo.roundDurationSeconds,
200
+ newRoundTimingInfo.auctionClosingSeconds,
201
+ newRoundTimingInfo.reserveSubmissionSeconds
202
+ );
203
+ }
204
+
205
+ /// @inheritdoc IExpressLaneAuction
206
+ function setRoundTimingInfo(RoundTimingInfo calldata newRoundTimingInfo)
207
+ external
208
+ onlyRole(ROUND_TIMING_SETTER_ROLE)
209
+ {
210
+ RoundTimingInfo memory currentRoundTimingInfo = roundTimingInfo;
211
+ uint64 currentCurrentRound = currentRoundTimingInfo.currentRound();
212
+ uint64 newCurrentRound = newRoundTimingInfo.currentRound();
213
+ // updating round timing info needs to be synchronised
214
+ // so we ensure that the current round won't change
215
+ if (currentCurrentRound != newCurrentRound) {
216
+ revert InvalidNewRound(currentCurrentRound, newCurrentRound);
217
+ }
218
+
219
+ (uint64 currentStart, ) = currentRoundTimingInfo.roundTimestamps(currentCurrentRound + 1);
220
+ (uint64 newStart, ) = newRoundTimingInfo.roundTimestamps(newCurrentRound + 1);
221
+ // we also ensure that the current round end time/next round start time, will not change
222
+ if (currentStart != newStart) {
223
+ revert InvalidNewStart(currentStart, newStart);
224
+ }
225
+
226
+ setRoundTimingInfoInternal(newRoundTimingInfo);
227
+ }
228
+
229
+ /// @inheritdoc IExpressLaneAuction
230
+ function setMinReservePrice(uint256 newMinReservePrice)
231
+ external
232
+ onlyRole(MIN_RESERVE_SETTER_ROLE)
233
+ {
234
+ emit SetMinReservePrice(minReservePrice, newMinReservePrice);
235
+
236
+ minReservePrice = newMinReservePrice;
237
+
238
+ if (newMinReservePrice > reservePrice) {
239
+ _setReservePrice(newMinReservePrice);
240
+ }
241
+ }
242
+
243
+ /// @inheritdoc IExpressLaneAuction
244
+ function setReservePrice(uint256 newReservePrice) external onlyRole(RESERVE_SETTER_ROLE) {
245
+ (ELCRound storage lastRoundResolved, ) = latestResolvedRounds.latestELCRound();
246
+ if (roundTimingInfo.isReserveBlackout(lastRoundResolved.round)) {
247
+ revert ReserveBlackout();
248
+ }
249
+
250
+ _setReservePrice(newReservePrice);
251
+ }
252
+
253
+ /// @inheritdoc IExpressLaneAuction
254
+ function balanceOf(address account) external view returns (uint256) {
255
+ return _balanceOf[account].balanceAtRound(roundTimingInfo.currentRound());
256
+ }
257
+
258
+ /// @inheritdoc IExpressLaneAuction
259
+ function balanceOfAtRound(address account, uint64 round) external view returns (uint256) {
260
+ if (round < roundTimingInfo.currentRound()) {
261
+ revert RoundTooOld(round, roundTimingInfo.currentRound());
262
+ }
263
+ return _balanceOf[account].balanceAtRound(round);
264
+ }
265
+
266
+ /// @inheritdoc IExpressLaneAuction
267
+ function withdrawableBalance(address account) external view returns (uint256) {
268
+ return _balanceOf[account].withdrawableBalanceAtRound(roundTimingInfo.currentRound());
269
+ }
270
+
271
+ /// @inheritdoc IExpressLaneAuction
272
+ function withdrawableBalanceAtRound(address account, uint64 round)
273
+ external
274
+ view
275
+ returns (uint256)
276
+ {
277
+ if (round < roundTimingInfo.currentRound()) {
278
+ revert RoundTooOld(round, roundTimingInfo.currentRound());
279
+ }
280
+ return _balanceOf[account].withdrawableBalanceAtRound(round);
281
+ }
282
+
283
+ /// @inheritdoc IExpressLaneAuction
284
+ function deposit(uint256 amount) external {
285
+ _balanceOf[msg.sender].increase(amount);
286
+ biddingToken.safeTransferFrom(msg.sender, address(this), amount);
287
+ emit Deposit(msg.sender, amount);
288
+ }
289
+
290
+ /// @inheritdoc IExpressLaneAuction
291
+ function initiateWithdrawal() external {
292
+ // The withdrawal can be finalized 2 rounds for now. We dont make it round + 1 in
293
+ // case the initiation were to occur right at the end of a round. Doing round + 2 ensures
294
+ // observers always have at least one full round to become aware of the future balance change.
295
+ uint64 withdrawalRound = roundTimingInfo.currentRound() + 2;
296
+ uint256 amount = _balanceOf[msg.sender].balance;
297
+ _balanceOf[msg.sender].initiateWithdrawal(withdrawalRound);
298
+ emit WithdrawalInitiated(msg.sender, amount, withdrawalRound);
299
+ }
300
+
301
+ /// @inheritdoc IExpressLaneAuction
302
+ function finalizeWithdrawal() external {
303
+ uint256 amountReduced = _balanceOf[msg.sender].finalizeWithdrawal(
304
+ roundTimingInfo.currentRound()
305
+ );
306
+ biddingToken.safeTransfer(msg.sender, amountReduced);
307
+ emit WithdrawalFinalized(msg.sender, amountReduced);
308
+ }
309
+
310
+ /// @inheritdoc IExpressLaneAuction
311
+ function flushBeneficiaryBalance() external {
312
+ uint256 bal = beneficiaryBalance;
313
+ if (bal == 0) {
314
+ revert ZeroAmount();
315
+ }
316
+ beneficiaryBalance = 0;
317
+ biddingToken.safeTransfer(beneficiary, bal);
318
+ }
319
+
320
+ /// @dev Update local state to resolve an auction
321
+ /// @param isMultiBid Where the auction should be resolved from multiple bids
322
+ /// @param firstPriceBid The winning bid
323
+ /// @param firstPriceBidder The winning bidder
324
+ /// @param priceToPay The price that needs to be paid by the winner
325
+ /// @param biddingInRound The round bidding is taking place in. This is not the round the bidding is taking place for, which is biddingInRound + 1
326
+ /// @param roundStart The timestamp at which the bidding for round starts
327
+ /// @param roundEnd The timestamp at which the bidding for round ends
328
+ function resolveAuction(
329
+ bool isMultiBid,
330
+ Bid calldata firstPriceBid,
331
+ address firstPriceBidder,
332
+ uint256 priceToPay,
333
+ uint64 biddingInRound,
334
+ uint64 roundStart,
335
+ uint64 roundEnd
336
+ ) internal {
337
+ // store that a round has been resolved
338
+ uint64 biddingForRound = biddingInRound + 1;
339
+ latestResolvedRounds.setResolvedRound(biddingForRound, firstPriceBid.expressLaneController);
340
+
341
+ // first price bidder pays the beneficiary
342
+ _balanceOf[firstPriceBidder].reduce(priceToPay, biddingInRound);
343
+ beneficiaryBalance += priceToPay;
344
+
345
+ // emit events so that the offchain sequencer knows a new express lane controller has been selected
346
+ emit SetExpressLaneController(
347
+ biddingForRound,
348
+ address(0),
349
+ firstPriceBid.expressLaneController,
350
+ address(0),
351
+ roundStart,
352
+ roundEnd
353
+ );
354
+ emit AuctionResolved(
355
+ isMultiBid,
356
+ biddingForRound,
357
+ firstPriceBidder,
358
+ firstPriceBid.expressLaneController,
359
+ firstPriceBid.amount,
360
+ priceToPay,
361
+ roundStart,
362
+ roundEnd
363
+ );
364
+ }
365
+
366
+ /// @inheritdoc IExpressLaneAuction
367
+ function domainSeparator() external view returns (bytes32) {
368
+ return _domainSeparatorV4();
369
+ }
370
+
371
+ /// @dev Internal bid domain hash
372
+ bytes32 private constant BID_DOMAIN =
373
+ keccak256("Bid(uint64 round,address expressLaneController,uint256 amount)");
374
+
375
+ /// @inheritdoc IExpressLaneAuction
376
+ function getBidHash(
377
+ uint64 round,
378
+ address expressLaneController,
379
+ uint256 amount
380
+ ) public view returns (bytes32) {
381
+ return
382
+ _hashTypedDataV4(
383
+ keccak256(abi.encode(BID_DOMAIN, round, expressLaneController, amount))
384
+ );
385
+ }
386
+
387
+ /// @notice Recover the signing address of the provided bid, and check that that address has enough funds to fulfil that bid
388
+ /// Returns the signing address and the bid hash that was signed
389
+ /// @param bid The bid to recover the signing address of
390
+ /// @param biddingForRound The round the bid is for the control of
391
+ function recoverAndCheckBalance(Bid memory bid, uint64 biddingForRound)
392
+ internal
393
+ view
394
+ returns (address, bytes32)
395
+ {
396
+ bytes32 bidHash = getBidHash(biddingForRound, bid.expressLaneController, bid.amount);
397
+ address bidder = bidHash.recover(bid.signature);
398
+ // we are always bidding for in the current round for the next round
399
+ uint64 curRnd = biddingForRound - 1;
400
+ // always check that the bidder has as much as they're claiming
401
+ if (_balanceOf[bidder].balanceAtRound(curRnd) < bid.amount) {
402
+ revert InsufficientBalanceAcc(
403
+ bidder,
404
+ bid.amount,
405
+ _balanceOf[bidder].balanceAtRound(curRnd)
406
+ );
407
+ }
408
+
409
+ return (bidder, bidHash);
410
+ }
411
+
412
+ /// @inheritdoc IExpressLaneAuction
413
+ function resolveSingleBidAuction(Bid calldata firstPriceBid)
414
+ external
415
+ onlyRole(AUCTIONEER_ROLE)
416
+ {
417
+ RoundTimingInfo memory info = roundTimingInfo;
418
+ if (!info.isAuctionRoundClosed()) {
419
+ revert AuctionNotClosed();
420
+ }
421
+
422
+ if (firstPriceBid.amount < reservePrice) {
423
+ revert ReservePriceNotMet(firstPriceBid.amount, reservePrice);
424
+ }
425
+
426
+ uint64 biddingInRound = info.currentRound();
427
+ uint64 biddingForRound = biddingInRound + 1;
428
+ (address firstPriceBidder, ) = recoverAndCheckBalance(firstPriceBid, biddingForRound);
429
+
430
+ (uint64 roundStart, uint64 roundEnd) = info.roundTimestamps(biddingForRound);
431
+ resolveAuction(
432
+ false,
433
+ firstPriceBid,
434
+ firstPriceBidder,
435
+ reservePrice,
436
+ biddingInRound,
437
+ roundStart,
438
+ roundEnd
439
+ );
440
+ }
441
+
442
+ /// @inheritdoc IExpressLaneAuction
443
+ function resolveMultiBidAuction(Bid calldata firstPriceBid, Bid calldata secondPriceBid)
444
+ external
445
+ onlyRole(AUCTIONEER_ROLE)
446
+ {
447
+ RoundTimingInfo memory info = roundTimingInfo;
448
+ if (!info.isAuctionRoundClosed()) {
449
+ revert AuctionNotClosed();
450
+ }
451
+
452
+ if (firstPriceBid.amount < secondPriceBid.amount) {
453
+ revert BidsWrongOrder();
454
+ }
455
+
456
+ // second amount must be greater than or equal the reserve
457
+ if (secondPriceBid.amount < reservePrice) {
458
+ revert ReservePriceNotMet(secondPriceBid.amount, reservePrice);
459
+ }
460
+
461
+ uint64 biddingInRound = info.currentRound();
462
+ uint64 biddingForRound = biddingInRound + 1;
463
+ // check the signatures and balances of both bids
464
+ // even the second price bid must have the balance it's claiming
465
+ (address firstPriceBidder, bytes32 firstBidHash) = recoverAndCheckBalance(
466
+ firstPriceBid,
467
+ biddingForRound
468
+ );
469
+ (address secondPriceBidder, bytes32 secondBidHash) = recoverAndCheckBalance(
470
+ secondPriceBid,
471
+ biddingForRound
472
+ );
473
+
474
+ // The bidders must be different so that our balance check isnt fooled into thinking
475
+ // that the same balance is valid for both the first and second bid
476
+ if (firstPriceBidder == secondPriceBidder) {
477
+ revert SameBidder();
478
+ }
479
+
480
+ // when bids have the same amount we break ties based on the bid hash
481
+ // although we include equality in the check we know this isnt possible due
482
+ // to the check above that ensures the first price bidder and second price bidder are different
483
+ if (
484
+ firstPriceBid.amount == secondPriceBid.amount &&
485
+ uint256(keccak256(abi.encodePacked(firstPriceBidder, firstBidHash))) <
486
+ uint256(keccak256(abi.encodePacked(secondPriceBidder, secondBidHash)))
487
+ ) {
488
+ revert TieBidsWrongOrder();
489
+ }
490
+
491
+ (uint64 roundStart, uint64 roundEnd) = info.roundTimestamps(biddingForRound);
492
+ resolveAuction(
493
+ true,
494
+ firstPriceBid,
495
+ firstPriceBidder,
496
+ secondPriceBid.amount,
497
+ biddingInRound,
498
+ roundStart,
499
+ roundEnd
500
+ );
501
+ }
502
+
503
+ /// @inheritdoc IExpressLaneAuction
504
+ function setTransferor(Transferor calldata transferor) external {
505
+ // if a transferor has already been set, it may be fixed until a future round
506
+ Transferor storage currentTransferor = transferorOf[msg.sender];
507
+ if (
508
+ currentTransferor.addr != address(0) &&
509
+ currentTransferor.fixedUntilRound > roundTimingInfo.currentRound()
510
+ ) {
511
+ revert FixedTransferor(currentTransferor.fixedUntilRound);
512
+ }
513
+
514
+ transferorOf[msg.sender] = transferor;
515
+
516
+ emit SetTransferor(msg.sender, transferor.addr, transferor.fixedUntilRound);
517
+ }
518
+
519
+ /// @inheritdoc IExpressLaneAuction
520
+ function transferExpressLaneController(uint64 round, address newExpressLaneController)
521
+ external
522
+ {
523
+ // past rounds cannot be transferred
524
+ RoundTimingInfo memory info = roundTimingInfo;
525
+ uint64 curRnd = info.currentRound();
526
+ if (round < curRnd) {
527
+ revert RoundTooOld(round, curRnd);
528
+ }
529
+
530
+ // only resolved rounds can be transferred
531
+ ELCRound storage resolvedRound = latestResolvedRounds.resolvedRound(round);
532
+
533
+ address resolvedELC = resolvedRound.expressLaneController;
534
+ address transferor = transferorOf[resolvedELC].addr;
535
+ // can only be the transferor if one has been set
536
+ // otherwise we default to the express lane controller to do the transfer
537
+ if (transferor != address(0)) {
538
+ if (transferor != msg.sender) {
539
+ revert NotTransferor(round, transferor, msg.sender);
540
+ }
541
+ } else if (resolvedELC != msg.sender) {
542
+ revert NotExpressLaneController(round, resolvedELC, msg.sender);
543
+ }
544
+
545
+ resolvedRound.expressLaneController = newExpressLaneController;
546
+
547
+ (uint64 start, uint64 end) = info.roundTimestamps(round);
548
+ emit SetExpressLaneController(
549
+ round,
550
+ resolvedELC,
551
+ newExpressLaneController,
552
+ transferor != address(0) ? transferor : resolvedELC,
553
+ start < uint64(block.timestamp) ? uint64(block.timestamp) : start,
554
+ end
555
+ );
556
+ }
557
+
558
+ /// @inheritdoc IExpressLaneAuction
559
+ function resolvedRounds() external view returns (ELCRound memory, ELCRound memory) {
560
+ return
561
+ latestResolvedRounds[0].round > latestResolvedRounds[1].round
562
+ ? (latestResolvedRounds[0], latestResolvedRounds[1])
563
+ : (latestResolvedRounds[1], latestResolvedRounds[0]);
564
+ }
565
+ }