// SPDX-License-Identifier: MIT// OpenZeppelin Contracts (last updated v4.5.0) (utils/Address.sol)pragmasolidity ^0.8.1;/**
* @dev Collection of functions related to the address type
*/libraryAddress{
/**
* @dev Returns true if `account` is a contract.
*
* [IMPORTANT]
* ====
* It is unsafe to assume that an address for which this function returns
* false is an externally-owned account (EOA) and not a contract.
*
* Among others, `isContract` will return false for the following
* types of addresses:
*
* - an externally-owned account
* - a contract in construction
* - an address where a contract will be created
* - an address where a contract lived, but was destroyed
* ====
*
* [IMPORTANT]
* ====
* You shouldn't rely on `isContract` to protect against flash loan attacks!
*
* Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets
* like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract
* constructor.
* ====
*/functionisContract(address account) internalviewreturns (bool) {
// This method relies on extcodesize/address.code.length, which returns 0// for contracts in construction, since the code is only stored at the end// of the constructor execution.return account.code.length>0;
}
/**
* @dev Replacement for Solidity's `transfer`: sends `amount` wei to
* `recipient`, forwarding all available gas and reverting on errors.
*
* https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost
* of certain opcodes, possibly making contracts go over the 2300 gas limit
* imposed by `transfer`, making them unable to receive funds via
* `transfer`. {sendValue} removes this limitation.
*
* https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more].
*
* IMPORTANT: because control is transferred to `recipient`, care must be
* taken to not create reentrancy vulnerabilities. Consider using
* {ReentrancyGuard} or the
* https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].
*/functionsendValue(addresspayable recipient, uint256 amount) internal{
require(address(this).balance>= amount, "Address: insufficient balance");
(bool success, ) = recipient.call{value: amount}("");
require(success, "Address: unable to send value, recipient may have reverted");
}
/**
* @dev Performs a Solidity function call using a low level `call`. A
* plain `call` is an unsafe replacement for a function call: use this
* function instead.
*
* If `target` reverts with a revert reason, it is bubbled up by this
* function (like regular Solidity function calls).
*
* Returns the raw returned data. To convert to the expected return value,
* use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].
*
* Requirements:
*
* - `target` must be a contract.
* - calling `target` with `data` must not revert.
*
* _Available since v3.1._
*/functionfunctionCall(address target, bytesmemory data) internalreturns (bytesmemory) {
return functionCall(target, data, "Address: low-level call failed");
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with
* `errorMessage` as a fallback revert reason when `target` reverts.
*
* _Available since v3.1._
*/functionfunctionCall(address target,
bytesmemory data,
stringmemory errorMessage
) internalreturns (bytesmemory) {
return functionCallWithValue(target, data, 0, errorMessage);
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
* but also transferring `value` wei to `target`.
*
* Requirements:
*
* - the calling contract must have an ETH balance of at least `value`.
* - the called Solidity function must be `payable`.
*
* _Available since v3.1._
*/functionfunctionCallWithValue(address target,
bytesmemory data,
uint256 value
) internalreturns (bytesmemory) {
return functionCallWithValue(target, data, value, "Address: low-level call with value failed");
}
/**
* @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but
* with `errorMessage` as a fallback revert reason when `target` reverts.
*
* _Available since v3.1._
*/functionfunctionCallWithValue(address target,
bytesmemory data,
uint256 value,
stringmemory errorMessage
) internalreturns (bytesmemory) {
require(address(this).balance>= value, "Address: insufficient balance for call");
require(isContract(target), "Address: call to non-contract");
(bool success, bytesmemory returndata) = target.call{value: value}(data);
return verifyCallResult(success, returndata, errorMessage);
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
* but performing a static call.
*
* _Available since v3.3._
*/functionfunctionStaticCall(address target, bytesmemory data) internalviewreturns (bytesmemory) {
return functionStaticCall(target, data, "Address: low-level static call failed");
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
* but performing a static call.
*
* _Available since v3.3._
*/functionfunctionStaticCall(address target,
bytesmemory data,
stringmemory errorMessage
) internalviewreturns (bytesmemory) {
require(isContract(target), "Address: static call to non-contract");
(bool success, bytesmemory returndata) = target.staticcall(data);
return verifyCallResult(success, returndata, errorMessage);
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
* but performing a delegate call.
*
* _Available since v3.4._
*/functionfunctionDelegateCall(address target, bytesmemory data) internalreturns (bytesmemory) {
return functionDelegateCall(target, data, "Address: low-level delegate call failed");
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
* but performing a delegate call.
*
* _Available since v3.4._
*/functionfunctionDelegateCall(address target,
bytesmemory data,
stringmemory errorMessage
) internalreturns (bytesmemory) {
require(isContract(target), "Address: delegate call to non-contract");
(bool success, bytesmemory returndata) = target.delegatecall(data);
return verifyCallResult(success, returndata, errorMessage);
}
/**
* @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the
* revert reason using the provided one.
*
* _Available since v4.3._
*/functionverifyCallResult(bool success,
bytesmemory returndata,
stringmemory errorMessage
) internalpurereturns (bytesmemory) {
if (success) {
return returndata;
} else {
// Look for revert reason and bubble it up if presentif (returndata.length>0) {
// The easiest way to bubble the revert reason is using memory via assemblyassembly {
let returndata_size :=mload(returndata)
revert(add(32, returndata), returndata_size)
}
} else {
revert(errorMessage);
}
}
}
}
Contract Source Code
File 2 of 35: AdminFallbackProxy.sol
// Copyright 2021-2022, Offchain Labs, Inc.// For license information, see https://github.com/OffchainLabs/nitro-contracts/blob/main/LICENSE// SPDX-License-Identifier: BUSL-1.1pragmasolidity ^0.8.0;import"@openzeppelin/contracts/proxy/Proxy.sol";
import"@openzeppelin/contracts/proxy/ERC1967/ERC1967Upgrade.sol";
import"@openzeppelin/contracts/utils/Address.sol";
import"@openzeppelin/contracts/utils/StorageSlot.sol";
/// @notice An extension to OZ's ERC1967Upgrade implementation to support two logic contractsabstractcontractDoubleLogicERC1967UpgradeisERC1967Upgrade{
// This is the keccak-256 hash of "eip1967.proxy.implementation.secondary" subtracted by 1bytes32internalconstant _IMPLEMENTATION_SECONDARY_SLOT =0x2b1dbce74324248c222f0ec2d5ed7bd323cfc425b336f0253c5ccfda7265546d;
// This is the keccak-256 hash of "eip1967.proxy.rollback.secondary" subtracted by 1bytes32privateconstant _ROLLBACK_SECONDARY_SLOT =0x49bd798cd84788856140a4cd5030756b4d08a9e4d55db725ec195f232d262a89;
/**
* @dev Emitted when the secondary implementation is upgraded.
*/eventUpgradedSecondary(addressindexed implementation);
/**
* @dev Returns the current secondary implementation address.
*/function_getSecondaryImplementation() internalviewreturns (address) {
return StorageSlot.getAddressSlot(_IMPLEMENTATION_SECONDARY_SLOT).value;
}
/**
* @dev Stores a new address in the EIP1967 implementation slot.
*/function_setSecondaryImplementation(address newImplementation) private{
require(
Address.isContract(newImplementation),
"ERC1967: new secondary implementation is not a contract"
);
StorageSlot.getAddressSlot(_IMPLEMENTATION_SECONDARY_SLOT).value= newImplementation;
}
/**
* @dev Perform secondary implementation upgrade
*
* Emits an {UpgradedSecondary} event.
*/function_upgradeSecondaryTo(address newImplementation) internal{
_setSecondaryImplementation(newImplementation);
emit UpgradedSecondary(newImplementation);
}
/**
* @dev Perform secondary implementation upgrade with additional setup call.
*
* Emits an {UpgradedSecondary} event.
*/function_upgradeSecondaryToAndCall(address newImplementation,
bytesmemory data,
bool forceCall
) internal{
_upgradeSecondaryTo(newImplementation);
if (data.length>0|| forceCall) {
Address.functionDelegateCall(newImplementation, data);
}
}
/**
* @dev Perform secondary implementation upgrade with security checks for UUPS proxies, and additional setup call.
*
* Emits an {UpgradedSecondary} event.
*/function_upgradeSecondaryToAndCallUUPS(address newImplementation,
bytesmemory data,
bool forceCall
) internal{
// Upgrades from old implementations will perform a rollback test. This test requires the new// implementation to upgrade back to the old, non-ERC1822 compliant, implementation. Removing// this special case will break upgrade paths from old UUPS implementation to new ones.if (StorageSlot.getBooleanSlot(_ROLLBACK_SECONDARY_SLOT).value) {
_setSecondaryImplementation(newImplementation);
} else {
try IERC1822Proxiable(newImplementation).proxiableUUID() returns (bytes32 slot) {
require(
slot == _IMPLEMENTATION_SECONDARY_SLOT,
"ERC1967Upgrade: unsupported secondary proxiableUUID"
);
} catch {
revert("ERC1967Upgrade: new secondary implementation is not UUPS");
}
_upgradeSecondaryToAndCall(newImplementation, data, forceCall);
}
}
}
/// @notice similar to TransparentUpgradeableProxy but allows the admin to fallback to a separate logic contract using DoubleLogicERC1967Upgrade/// @dev this follows the UUPS pattern for upgradeability - read more at https://github.com/OpenZeppelin/openzeppelin-contracts/tree/v4.5.0/contracts/proxy#transparent-vs-uups-proxiescontractAdminFallbackProxyisProxy, DoubleLogicERC1967Upgrade{
/**
* @dev Initializes the upgradeable proxy with an initial implementation specified by `adminLogic` and a secondary
* logic implementation specified by `userLogic`
*
* Only the `adminAddr` is able to use the `adminLogic` functions
* All other addresses can interact with the `userLogic` functions
*/function_initialize(address adminLogic,
bytesmemory adminData,
address userLogic,
bytesmemory userData,
address adminAddr
) internal{
assert(_ADMIN_SLOT ==bytes32(uint256(keccak256("eip1967.proxy.admin")) -1));
assert(
_IMPLEMENTATION_SLOT ==bytes32(uint256(keccak256("eip1967.proxy.implementation")) -1)
);
assert(
_IMPLEMENTATION_SECONDARY_SLOT ==bytes32(uint256(keccak256("eip1967.proxy.implementation.secondary")) -1)
);
_changeAdmin(adminAddr);
_upgradeToAndCall(adminLogic, adminData, false);
_upgradeSecondaryToAndCall(userLogic, userData, false);
}
/// @inheritdoc Proxyfunction_implementation() internalviewoverridereturns (address) {
require(msg.data.length >=4, "NO_FUNC_SIG");
// if the sender is the proxy's admin, delegate to admin logic// if the admin is disabled, all calls will be forwarded to user logic// admin affordances can be disabled by setting to a no-op smart contract// since there is a check for contract code before updating the valueaddress target = _getAdmin() !=msg.sender
? DoubleLogicERC1967Upgrade._getSecondaryImplementation()
: ERC1967Upgrade._getImplementation();
// implementation setters do an existence check, but we protect against selfdestructs this wayrequire(Address.isContract(target), "TARGET_NOT_CONTRACT");
return target;
}
/**
* @dev unlike transparent upgradeable proxies, this does allow the admin to fallback to a logic contract
* the admin is expected to interact only with the primary logic contract, which handles contract
* upgrades using the UUPS approach
*/function_beforeFallback() internaloverride{
super._beforeFallback();
}
}
// SPDX-License-Identifier: MIT// OpenZeppelin Contracts (last updated v4.5.0) (proxy/ERC1967/ERC1967Upgrade.sol)pragmasolidity ^0.8.2;import"../beacon/IBeacon.sol";
import"../../interfaces/draft-IERC1822.sol";
import"../../utils/Address.sol";
import"../../utils/StorageSlot.sol";
/**
* @dev This abstract contract provides getters and event emitting update functions for
* https://eips.ethereum.org/EIPS/eip-1967[EIP1967] slots.
*
* _Available since v4.1._
*
* @custom:oz-upgrades-unsafe-allow delegatecall
*/abstractcontractERC1967Upgrade{
// This is the keccak-256 hash of "eip1967.proxy.rollback" subtracted by 1bytes32privateconstant _ROLLBACK_SLOT =0x4910fdfa16fed3260ed0e7147f7cc6da11a60208b5b9406d12a635614ffd9143;
/**
* @dev Storage slot with the address of the current implementation.
* This is the keccak-256 hash of "eip1967.proxy.implementation" subtracted by 1, and is
* validated in the constructor.
*/bytes32internalconstant _IMPLEMENTATION_SLOT =0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc;
/**
* @dev Emitted when the implementation is upgraded.
*/eventUpgraded(addressindexed implementation);
/**
* @dev Returns the current implementation address.
*/function_getImplementation() internalviewreturns (address) {
return StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value;
}
/**
* @dev Stores a new address in the EIP1967 implementation slot.
*/function_setImplementation(address newImplementation) private{
require(Address.isContract(newImplementation), "ERC1967: new implementation is not a contract");
StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value= newImplementation;
}
/**
* @dev Perform implementation upgrade
*
* Emits an {Upgraded} event.
*/function_upgradeTo(address newImplementation) internal{
_setImplementation(newImplementation);
emit Upgraded(newImplementation);
}
/**
* @dev Perform implementation upgrade with additional setup call.
*
* Emits an {Upgraded} event.
*/function_upgradeToAndCall(address newImplementation,
bytesmemory data,
bool forceCall
) internal{
_upgradeTo(newImplementation);
if (data.length>0|| forceCall) {
Address.functionDelegateCall(newImplementation, data);
}
}
/**
* @dev Perform implementation upgrade with security checks for UUPS proxies, and additional setup call.
*
* Emits an {Upgraded} event.
*/function_upgradeToAndCallUUPS(address newImplementation,
bytesmemory data,
bool forceCall
) internal{
// Upgrades from old implementations will perform a rollback test. This test requires the new// implementation to upgrade back to the old, non-ERC1822 compliant, implementation. Removing// this special case will break upgrade paths from old UUPS implementation to new ones.if (StorageSlot.getBooleanSlot(_ROLLBACK_SLOT).value) {
_setImplementation(newImplementation);
} else {
try IERC1822Proxiable(newImplementation).proxiableUUID() returns (bytes32 slot) {
require(slot == _IMPLEMENTATION_SLOT, "ERC1967Upgrade: unsupported proxiableUUID");
} catch {
revert("ERC1967Upgrade: new implementation is not UUPS");
}
_upgradeToAndCall(newImplementation, data, forceCall);
}
}
/**
* @dev Storage slot with the admin of the contract.
* This is the keccak-256 hash of "eip1967.proxy.admin" subtracted by 1, and is
* validated in the constructor.
*/bytes32internalconstant _ADMIN_SLOT =0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103;
/**
* @dev Emitted when the admin account has changed.
*/eventAdminChanged(address previousAdmin, address newAdmin);
/**
* @dev Returns the current admin.
*/function_getAdmin() internalviewreturns (address) {
return StorageSlot.getAddressSlot(_ADMIN_SLOT).value;
}
/**
* @dev Stores a new address in the EIP1967 admin slot.
*/function_setAdmin(address newAdmin) private{
require(newAdmin !=address(0), "ERC1967: new admin is the zero address");
StorageSlot.getAddressSlot(_ADMIN_SLOT).value= newAdmin;
}
/**
* @dev Changes the admin of the proxy.
*
* Emits an {AdminChanged} event.
*/function_changeAdmin(address newAdmin) internal{
emit AdminChanged(_getAdmin(), newAdmin);
_setAdmin(newAdmin);
}
/**
* @dev The storage slot of the UpgradeableBeacon contract which defines the implementation for this proxy.
* This is bytes32(uint256(keccak256('eip1967.proxy.beacon')) - 1)) and is validated in the constructor.
*/bytes32internalconstant _BEACON_SLOT =0xa3f0ad74e5423aebfd80d3ef4346578335a9a72aeaee59ff6cb3582b35133d50;
/**
* @dev Emitted when the beacon is upgraded.
*/eventBeaconUpgraded(addressindexed beacon);
/**
* @dev Returns the current beacon.
*/function_getBeacon() internalviewreturns (address) {
return StorageSlot.getAddressSlot(_BEACON_SLOT).value;
}
/**
* @dev Stores a new beacon in the EIP1967 beacon slot.
*/function_setBeacon(address newBeacon) private{
require(Address.isContract(newBeacon), "ERC1967: new beacon is not a contract");
require(
Address.isContract(IBeacon(newBeacon).implementation()),
"ERC1967: beacon implementation is not a contract"
);
StorageSlot.getAddressSlot(_BEACON_SLOT).value= newBeacon;
}
/**
* @dev Perform beacon upgrade with additional setup call. Note: This upgrades the address of the beacon, it does
* not upgrade the implementation contained in the beacon (see {UpgradeableBeacon-_setImplementation} for that).
*
* Emits a {BeaconUpgraded} event.
*/function_upgradeBeaconToAndCall(address newBeacon,
bytesmemory data,
bool forceCall
) internal{
_setBeacon(newBeacon);
emit BeaconUpgraded(newBeacon);
if (data.length>0|| forceCall) {
Address.functionDelegateCall(IBeacon(newBeacon).implementation(), data);
}
}
}
// SPDX-License-Identifier: MIT// OpenZeppelin Contracts v4.4.1 (proxy/beacon/IBeacon.sol)pragmasolidity ^0.8.0;/**
* @dev This is the interface that {BeaconProxy} expects of its beacon.
*/interfaceIBeacon{
/**
* @dev Must return an address that can be used as a delegate call target.
*
* {BeaconProxy} will check that this address is a contract.
*/functionimplementation() externalviewreturns (address);
}
Contract Source Code
File 8 of 35: IBridge.sol
// Copyright 2021-2022, Offchain Labs, Inc.// For license information, see https://github.com/OffchainLabs/nitro-contracts/blob/main/LICENSE// SPDX-License-Identifier: BUSL-1.1// solhint-disable-next-line compiler-versionpragmasolidity >=0.6.9 <0.9.0;import"./IOwnable.sol";
interfaceIBridge{
eventMessageDelivered(uint256indexed messageIndex,
bytes32indexed beforeInboxAcc,
address inbox,
uint8 kind,
address sender,
bytes32 messageDataHash,
uint256 baseFeeL1,
uint64 timestamp
);
eventBridgeCallTriggered(addressindexed outbox,
addressindexed to,
uint256 value,
bytes data
);
eventInboxToggle(addressindexed inbox, bool enabled);
eventOutboxToggle(addressindexed outbox, bool enabled);
eventSequencerInboxUpdated(address newSequencerInbox);
eventRollupUpdated(address rollup);
functionallowedDelayedInboxList(uint256) externalreturns (address);
functionallowedOutboxList(uint256) externalreturns (address);
/// @dev Accumulator for delayed inbox messages; tail represents hash of the current state; each element represents the inclusion of a new message.functiondelayedInboxAccs(uint256) externalviewreturns (bytes32);
/// @dev Accumulator for sequencer inbox messages; tail represents hash of the current state; each element represents the inclusion of a new message.functionsequencerInboxAccs(uint256) externalviewreturns (bytes32);
functionrollup() externalviewreturns (IOwnable);
functionsequencerInbox() externalviewreturns (address);
functionactiveOutbox() externalviewreturns (address);
functionallowedDelayedInboxes(address inbox) externalviewreturns (bool);
functionallowedOutboxes(address outbox) externalviewreturns (bool);
functionsequencerReportedSubMessageCount() externalviewreturns (uint256);
functionexecuteCall(address to,
uint256 value,
bytescalldata data
) externalreturns (bool success, bytesmemory returnData);
functiondelayedMessageCount() externalviewreturns (uint256);
functionsequencerMessageCount() externalviewreturns (uint256);
// ---------- onlySequencerInbox functions ----------functionenqueueSequencerMessage(bytes32 dataHash,
uint256 afterDelayedMessagesRead,
uint256 prevMessageCount,
uint256 newMessageCount
)
externalreturns (uint256 seqMessageIndex,
bytes32 beforeAcc,
bytes32 delayedAcc,
bytes32 acc
);
/**
* @dev Allows the sequencer inbox to submit a delayed message of the batchPostingReport type
* This is done through a separate function entrypoint instead of allowing the sequencer inbox
* to call `enqueueDelayedMessage` to avoid the gas overhead of an extra SLOAD in either
* every delayed inbox or every sequencer inbox call.
*/functionsubmitBatchSpendingReport(address batchPoster, bytes32 dataHash)
externalreturns (uint256 msgNum);
// ---------- onlyRollupOrOwner functions ----------functionsetSequencerInbox(address _sequencerInbox) external;
functionsetDelayedInbox(address inbox, bool enabled) external;
functionsetOutbox(address inbox, bool enabled) external;
functionupdateRollupAddress(IOwnable _rollup) external;
}
// Copyright 2021-2022, Offchain Labs, Inc.// For license information, see https://github.com/OffchainLabs/nitro-contracts/blob/main/LICENSE// SPDX-License-Identifier: BUSL-1.1// solhint-disable-next-line compiler-versionpragmasolidity >=0.6.9 <0.9.0;interfaceIDelayedMessageProvider{
/// @dev event emitted when a inbox message is added to the Bridge's delayed accumulatoreventInboxMessageDelivered(uint256indexed messageNum, bytes data);
/// @dev event emitted when a inbox message is added to the Bridge's delayed accumulator/// same as InboxMessageDelivered but the batch data is available in tx.inputeventInboxMessageDeliveredFromOrigin(uint256indexed messageNum);
}
Contract Source Code
File 12 of 35: IGasRefunder.sol
// Copyright 2021-2022, Offchain Labs, Inc.// For license information, see https://github.com/OffchainLabs/nitro-contracts/blob/main/LICENSE// SPDX-License-Identifier: BUSL-1.1// solhint-disable-next-line compiler-versionpragmasolidity >=0.6.9 <0.9.0;interfaceIGasRefunder{
functiononGasSpent(addresspayable spender,
uint256 gasUsed,
uint256 calldataSize
) externalreturns (bool success);
}
abstractcontractGasRefundEnabled{
/// @dev this refunds the sender for execution costs of the tx/// calldata costs are only refunded if `msg.sender == tx.origin` to guarantee the value refunded relates to charging/// for the `tx.input`. this avoids a possible attack where you generate large calldata from a contract and get over-refundedmodifierrefundsGas(IGasRefunder gasRefunder) {
uint256 startGasLeft =gasleft();
_;
if (address(gasRefunder) !=address(0)) {
uint256 calldataSize =msg.data.length;
uint256 calldataWords = (calldataSize +31) /32;
// account for the CALLDATACOPY cost of the proxy contract, including the memory expansion cost
startGasLeft += calldataWords *6+ (calldataWords**2) /512;
// if triggered in a contract call, the spender may be overrefunded by appending dummy data to the call// so we check if it is a top level call, which would mean the sender paid calldata as part of tx.input// solhint-disable-next-line avoid-tx-originif (msg.sender!=tx.origin) {
// We can't be sure if this calldata came from the top level tx,// so to be safe we tell the gas refunder there was no calldata.
calldataSize =0;
}
gasRefunder.onGasSpent(payable(msg.sender), startGasLeft -gasleft(), calldataSize);
}
}
}
Contract Source Code
File 13 of 35: IInboxBase.sol
// Copyright 2021-2022, Offchain Labs, Inc.// For license information, see https://github.com/OffchainLabs/nitro-contracts/blob/main/LICENSE// SPDX-License-Identifier: BUSL-1.1// solhint-disable-next-line compiler-versionpragmasolidity >=0.6.9 <0.9.0;import"./IBridge.sol";
import"./IDelayedMessageProvider.sol";
import"./ISequencerInbox.sol";
interfaceIInboxBaseisIDelayedMessageProvider{
functionbridge() externalviewreturns (IBridge);
functionsequencerInbox() externalviewreturns (ISequencerInbox);
functionmaxDataSize() externalviewreturns (uint256);
/**
* @notice Send a generic L2 message to the chain
* @dev This method is an optimization to avoid having to emit the entirety of the messageData in a log. Instead validators are expected to be able to parse the data from the transaction's input
* @param messageData Data of the message being sent
*/functionsendL2MessageFromOrigin(bytescalldata messageData) externalreturns (uint256);
/**
* @notice Send a generic L2 message to the chain
* @dev This method can be used to send any type of message that doesn't require L1 validation
* @param messageData Data of the message being sent
*/functionsendL2Message(bytescalldata messageData) externalreturns (uint256);
functionsendUnsignedTransaction(uint256 gasLimit,
uint256 maxFeePerGas,
uint256 nonce,
address to,
uint256 value,
bytescalldata data
) externalreturns (uint256);
functionsendContractTransaction(uint256 gasLimit,
uint256 maxFeePerGas,
address to,
uint256 value,
bytescalldata data
) externalreturns (uint256);
/**
* @notice Get the L1 fee for submitting a retryable
* @dev This fee can be paid by funds already in the L2 aliased address or by the current message value
* @dev This formula may change in the future, to future proof your code query this method instead of inlining!!
* @param dataLength The length of the retryable's calldata, in bytes
* @param baseFee The block basefee when the retryable is included in the chain, if 0 current block.basefee will be used
*/functioncalculateRetryableSubmissionFee(uint256 dataLength, uint256 baseFee)
externalviewreturns (uint256);
// ---------- onlyRollupOrOwner functions ----------/// @notice pauses all inbox functionalityfunctionpause() external;
/// @notice unpauses all inbox functionalityfunctionunpause() external;
/// @notice add or remove users from allowListfunctionsetAllowList(address[] memory user, bool[] memory val) external;
/// @notice enable or disable allowListfunctionsetAllowListEnabled(bool _allowListEnabled) external;
/// @notice check if user is in allowListfunctionisAllowed(address user) externalviewreturns (bool);
/// @notice check if allowList is enabledfunctionallowListEnabled() externalviewreturns (bool);
functioninitialize(IBridge _bridge, ISequencerInbox _sequencerInbox) external;
/// @notice returns the current adminfunctiongetProxyAdmin() externalviewreturns (address);
}
// Copyright 2021-2022, Offchain Labs, Inc.// For license information, see https://github.com/OffchainLabs/nitro-contracts/blob/main/LICENSE// SPDX-License-Identifier: BUSL-1.1// solhint-disable-next-line compiler-versionpragmasolidity >=0.6.9 <0.9.0;import"./IBridge.sol";
interfaceIOutbox{
eventSendRootUpdated(bytes32indexed outputRoot, bytes32indexed l2BlockHash);
eventOutBoxTransactionExecuted(addressindexed to,
addressindexed l2Sender,
uint256indexed zero,
uint256 transactionIndex
);
functioninitialize(IBridge _bridge) external;
functionrollup() externalviewreturns (address); // the rollup contractfunctionbridge() externalviewreturns (IBridge); // the bridge contractfunctionspent(uint256) externalviewreturns (bytes32); // packed spent bitmapfunctionroots(bytes32) externalviewreturns (bytes32); // maps root hashes => L2 block hash// solhint-disable-next-line func-name-mixedcasefunctionOUTBOX_VERSION() externalviewreturns (uint128); // the outbox versionfunctionupdateSendRoot(bytes32 sendRoot, bytes32 l2BlockHash) external;
functionupdateRollupAddress() external;
/// @notice When l2ToL1Sender returns a nonzero address, the message was originated by an L2 account/// When the return value is zero, that means this is a system message/// @dev the l2ToL1Sender behaves as the tx.origin, the msg.sender should be validated to protect against reentranciesfunctionl2ToL1Sender() externalviewreturns (address);
/// @return l2Block return L2 block when the L2 tx was initiated or 0 if no L2 to L1 transaction is activefunctionl2ToL1Block() externalviewreturns (uint256);
/// @return l1Block return L1 block when the L2 tx was initiated or 0 if no L2 to L1 transaction is activefunctionl2ToL1EthBlock() externalviewreturns (uint256);
/// @return timestamp return L2 timestamp when the L2 tx was initiated or 0 if no L2 to L1 transaction is activefunctionl2ToL1Timestamp() externalviewreturns (uint256);
/// @return outputId returns the unique output identifier of the L2 to L1 tx or 0 if no L2 to L1 transaction is activefunctionl2ToL1OutputId() externalviewreturns (bytes32);
/**
* @notice Executes a messages in an Outbox entry.
* @dev Reverts if dispute period hasn't expired, since the outbox entry
* is only created once the rollup confirms the respective assertion.
* @dev it is not possible to execute any L2-to-L1 transaction which contains data
* to a contract address without any code (as enforced by the Bridge contract).
* @param proof Merkle proof of message inclusion in send root
* @param index Merkle path to message
* @param l2Sender sender if original message (i.e., caller of ArbSys.sendTxToL1)
* @param to destination address for L1 contract call
* @param l2Block l2 block number at which sendTxToL1 call was made
* @param l1Block l1 block number at which sendTxToL1 call was made
* @param l2Timestamp l2 Timestamp at which sendTxToL1 call was made
* @param value wei in L1 message
* @param data abi-encoded L1 message data
*/functionexecuteTransaction(bytes32[] calldata proof,
uint256 index,
address l2Sender,
address to,
uint256 l2Block,
uint256 l1Block,
uint256 l2Timestamp,
uint256 value,
bytescalldata data
) external;
/**
* @dev function used to simulate the result of a particular function call from the outbox
* it is useful for things such as gas estimates. This function includes all costs except for
* proof validation (which can be considered offchain as a somewhat of a fixed cost - it's
* not really a fixed cost, but can be treated as so with a fixed overhead for gas estimation).
* We can't include the cost of proof validation since this is intended to be used to simulate txs
* that are included in yet-to-be confirmed merkle roots. The simulation entrypoint could instead pretend
* to confirm a pending merkle root, but that would be less practical for integrating with tooling.
* It is only possible to trigger it when the msg sender is address zero, which should be impossible
* unless under simulation in an eth_call or eth_estimateGas
*/functionexecuteTransactionSimulation(uint256 index,
address l2Sender,
address to,
uint256 l2Block,
uint256 l1Block,
uint256 l2Timestamp,
uint256 value,
bytescalldata data
) external;
/**
* @param index Merkle path to message
* @return true if the message has been spent
*/functionisSpent(uint256 index) externalviewreturns (bool);
functioncalculateItemHash(address l2Sender,
address to,
uint256 l2Block,
uint256 l1Block,
uint256 l2Timestamp,
uint256 value,
bytescalldata data
) externalpurereturns (bytes32);
functioncalculateMerkleRoot(bytes32[] memory proof,
uint256 path,
bytes32 item
) externalpurereturns (bytes32);
/**
* @dev function to be called one time during the outbox upgrade process
* this is used to fix the storage slots
*/functionpostUpgradeInit() external;
}
// Copyright 2021-2022, Offchain Labs, Inc.// For license information, see https://github.com/OffchainLabs/nitro-contracts/blob/main/LICENSE// SPDX-License-Identifier: BUSL-1.1pragmasolidity ^0.8.0;import"./IRollupCore.sol";
import"../bridge/ISequencerInbox.sol";
import"../bridge/IOutbox.sol";
import"../bridge/IOwnable.sol";
import"./Config.sol";
interfaceIRollupAdmin{
eventOwnerFunctionCalled(uint256indexed id);
functioninitialize(Config calldata config, ContractDependencies calldata connectedContracts)
external;
/**
* @notice Add a contract authorized to put messages into this rollup's inbox
* @param _outbox Outbox contract to add
*/functionsetOutbox(IOutbox _outbox) external;
/**
* @notice Disable an old outbox from interacting with the bridge
* @param _outbox Outbox contract to remove
*/functionremoveOldOutbox(address _outbox) external;
/**
* @notice Enable or disable an inbox contract
* @param _inbox Inbox contract to add or remove
* @param _enabled New status of inbox
*/functionsetDelayedInbox(address _inbox, bool _enabled) external;
/**
* @notice Pause interaction with the rollup contract
*/functionpause() external;
/**
* @notice Resume interaction with the rollup contract
*/functionresume() external;
/**
* @notice Set the addresses of the validator whitelist
* @dev It is expected that both arrays are same length, and validator at
* position i corresponds to the value at position i
* @param _validator addresses to set in the whitelist
* @param _val value to set in the whitelist for corresponding address
*/functionsetValidator(address[] memory _validator, bool[] memory _val) external;
/**
* @notice Set a new owner address for the rollup proxy
* @param newOwner address of new rollup owner
*/functionsetOwner(address newOwner) external;
/**
* @notice Set minimum assertion period for the rollup
* @param newPeriod new minimum period for assertions
*/functionsetMinimumAssertionPeriod(uint256 newPeriod) external;
/**
* @notice Set number of blocks until a node is considered confirmed
* @param newConfirmPeriod new number of blocks until a node is confirmed
*/functionsetConfirmPeriodBlocks(uint64 newConfirmPeriod) external;
/**
* @notice Set number of extra blocks after a challenge
* @param newExtraTimeBlocks new number of blocks
*/functionsetExtraChallengeTimeBlocks(uint64 newExtraTimeBlocks) external;
/**
* @notice Set base stake required for an assertion
* @param newBaseStake maximum avmgas to be used per block
*/functionsetBaseStake(uint256 newBaseStake) external;
/**
* @notice Set the token used for stake, where address(0) == eth
* @dev Before changing the base stake token, you might need to change the
* implementation of the Rollup User logic!
* @param newStakeToken address of token used for staking
*/functionsetStakeToken(address newStakeToken) external;
/**
* @notice Upgrades the implementation of a beacon controlled by the rollup
* @param beacon address of beacon to be upgraded
* @param newImplementation new address of implementation
*/functionupgradeBeacon(address beacon, address newImplementation) external;
functionforceResolveChallenge(address[] memory stackerA, address[] memory stackerB) external;
functionforceRefundStaker(address[] memory stacker) external;
functionforceCreateNode(uint64 prevNode,
uint256 prevNodeInboxMaxCount,
Assertion memory assertion,
bytes32 expectedNodeHash
) external;
functionforceConfirmNode(uint64 nodeNum,
bytes32 blockHash,
bytes32 sendRoot
) external;
functionsetLoserStakeEscrow(address newLoserStakerEscrow) external;
/**
* @notice Set the proving WASM module root
* @param newWasmModuleRoot new module root
*/functionsetWasmModuleRoot(bytes32 newWasmModuleRoot) external;
/**
* @notice set a new sequencer inbox contract
* @param _sequencerInbox new address of sequencer inbox
*/functionsetSequencerInbox(address _sequencerInbox) external;
/**
* @notice set the validatorWhitelistDisabled flag
* @param _validatorWhitelistDisabled new value of validatorWhitelistDisabled, i.e. true = disabled
*/functionsetValidatorWhitelistDisabled(bool _validatorWhitelistDisabled) external;
}
Contract Source Code
File 19 of 35: IRollupCore.sol
// Copyright 2021-2022, Offchain Labs, Inc.// For license information, see https://github.com/OffchainLabs/nitro-contracts/blob/main/LICENSE// SPDX-License-Identifier: BUSL-1.1pragmasolidity ^0.8.0;import"./Node.sol";
import"../bridge/IBridge.sol";
import"../bridge/IOutbox.sol";
import"../bridge/IInboxBase.sol";
import"./IRollupEventInbox.sol";
import"../challenge/IChallengeManager.sol";
interfaceIRollupCore{
structStaker {
uint256 amountStaked;
uint64 index;
uint64 latestStakedNode;
// currentChallenge is 0 if staker is not in a challengeuint64 currentChallenge;
bool isStaked;
}
eventRollupInitialized(bytes32 machineHash, uint256 chainId);
eventNodeCreated(uint64indexed nodeNum,
bytes32indexed parentNodeHash,
bytes32indexed nodeHash,
bytes32 executionHash,
Assertion assertion,
bytes32 afterInboxBatchAcc,
bytes32 wasmModuleRoot,
uint256 inboxMaxCount
);
eventNodeConfirmed(uint64indexed nodeNum, bytes32 blockHash, bytes32 sendRoot);
eventNodeRejected(uint64indexed nodeNum);
eventRollupChallengeStarted(uint64indexed challengeIndex,
address asserter,
address challenger,
uint64 challengedNode
);
eventUserStakeUpdated(addressindexed user, uint256 initialBalance, uint256 finalBalance);
eventUserWithdrawableFundsUpdated(addressindexed user,
uint256 initialBalance,
uint256 finalBalance
);
functionconfirmPeriodBlocks() externalviewreturns (uint64);
functionextraChallengeTimeBlocks() externalviewreturns (uint64);
functionchainId() externalviewreturns (uint256);
functionbaseStake() externalviewreturns (uint256);
functionwasmModuleRoot() externalviewreturns (bytes32);
functionbridge() externalviewreturns (IBridge);
functionsequencerInbox() externalviewreturns (ISequencerInbox);
functionoutbox() externalviewreturns (IOutbox);
functionrollupEventInbox() externalviewreturns (IRollupEventInbox);
functionchallengeManager() externalviewreturns (IChallengeManager);
functionloserStakeEscrow() externalviewreturns (address);
functionstakeToken() externalviewreturns (address);
functionminimumAssertionPeriod() externalviewreturns (uint256);
functionisValidator(address) externalviewreturns (bool);
functionvalidatorWhitelistDisabled() externalviewreturns (bool);
/**
* @notice Get the Node for the given index.
*/functiongetNode(uint64 nodeNum) externalviewreturns (Node memory);
/**
* @notice Returns the block in which the given node was created for looking up its creation event.
* Unlike the Node's createdAtBlock field, this will be the ArbSys blockNumber if the host chain is an Arbitrum chain.
* That means that the block number returned for this is usable for event queries.
* This function will revert if the given node number does not exist.
* @dev This function is meant for internal use only and has no stability guarantees.
*/functiongetNodeCreationBlockForLogLookup(uint64 nodeNum) externalviewreturns (uint256);
/**
* @notice Check if the specified node has been staked on by the provided staker.
* Only accurate at the latest confirmed node and afterwards.
*/functionnodeHasStaker(uint64 nodeNum, address staker) externalviewreturns (bool);
/**
* @notice Get the address of the staker at the given index
* @param stakerNum Index of the staker
* @return Address of the staker
*/functiongetStakerAddress(uint64 stakerNum) externalviewreturns (address);
/**
* @notice Check whether the given staker is staked
* @param staker Staker address to check
* @return True or False for whether the staker was staked
*/functionisStaked(address staker) externalviewreturns (bool);
/**
* @notice Get the latest staked node of the given staker
* @param staker Staker address to lookup
* @return Latest node staked of the staker
*/functionlatestStakedNode(address staker) externalviewreturns (uint64);
/**
* @notice Get the current challenge of the given staker
* @param staker Staker address to lookup
* @return Current challenge of the staker
*/functioncurrentChallenge(address staker) externalviewreturns (uint64);
/**
* @notice Get the amount staked of the given staker
* @param staker Staker address to lookup
* @return Amount staked of the staker
*/functionamountStaked(address staker) externalviewreturns (uint256);
/**
* @notice Retrieves stored information about a requested staker
* @param staker Staker address to retrieve
* @return A structure with information about the requested staker
*/functiongetStaker(address staker) externalviewreturns (Staker memory);
/**
* @notice Get the original staker address of the zombie at the given index
* @param zombieNum Index of the zombie to lookup
* @return Original staker address of the zombie
*/functionzombieAddress(uint256 zombieNum) externalviewreturns (address);
/**
* @notice Get Latest node that the given zombie at the given index is staked on
* @param zombieNum Index of the zombie to lookup
* @return Latest node that the given zombie is staked on
*/functionzombieLatestStakedNode(uint256 zombieNum) externalviewreturns (uint64);
/// @return Current number of un-removed zombiesfunctionzombieCount() externalviewreturns (uint256);
functionisZombie(address staker) externalviewreturns (bool);
/**
* @notice Get the amount of funds withdrawable by the given address
* @param owner Address to check the funds of
* @return Amount of funds withdrawable by owner
*/functionwithdrawableFunds(address owner) externalviewreturns (uint256);
/**
* @return Index of the first unresolved node
* @dev If all nodes have been resolved, this will be latestNodeCreated + 1
*/functionfirstUnresolvedNode() externalviewreturns (uint64);
/// @return Index of the latest confirmed nodefunctionlatestConfirmed() externalviewreturns (uint64);
/// @return Index of the latest rollup node createdfunctionlatestNodeCreated() externalviewreturns (uint64);
/// @return Ethereum block that the most recent stake was createdfunctionlastStakeBlock() externalviewreturns (uint64);
/// @return Number of active stakers currently stakedfunctionstakerCount() externalviewreturns (uint64);
}
// Copyright 2021-2022, Offchain Labs, Inc.// For license information, see https://github.com/OffchainLabs/nitro-contracts/blob/main/LICENSE// SPDX-License-Identifier: BUSL-1.1// solhint-disable-next-line compiler-versionpragmasolidity >=0.6.9 <0.9.0;pragmaexperimentalABIEncoderV2;import"../libraries/IGasRefunder.sol";
import"./IDelayedMessageProvider.sol";
import"./IBridge.sol";
interfaceISequencerInboxisIDelayedMessageProvider{
structMaxTimeVariation {
uint256 delayBlocks;
uint256 futureBlocks;
uint256 delaySeconds;
uint256 futureSeconds;
}
structTimeBounds {
uint64 minTimestamp;
uint64 maxTimestamp;
uint64 minBlockNumber;
uint64 maxBlockNumber;
}
enumBatchDataLocation {
TxInput,
SeparateBatchEvent,
NoData
}
eventSequencerBatchDelivered(uint256indexed batchSequenceNumber,
bytes32indexed beforeAcc,
bytes32indexed afterAcc,
bytes32 delayedAcc,
uint256 afterDelayedMessagesRead,
TimeBounds timeBounds,
BatchDataLocation dataLocation
);
eventOwnerFunctionCalled(uint256indexed id);
/// @dev a separate event that emits batch data when this isn't easily accessible in the tx.inputeventSequencerBatchData(uint256indexed batchSequenceNumber, bytes data);
/// @dev a valid keyset was addedeventSetValidKeyset(bytes32indexed keysetHash, bytes keysetBytes);
/// @dev a keyset was invalidatedeventInvalidateKeyset(bytes32indexed keysetHash);
functiontotalDelayedMessagesRead() externalviewreturns (uint256);
functionbridge() externalviewreturns (IBridge);
/// @dev The size of the batch header// solhint-disable-next-line func-name-mixedcasefunctionHEADER_LENGTH() externalviewreturns (uint256);
/// @dev If the first batch data byte after the header has this bit set,/// the sequencer inbox has authenticated the data. Currently not used.// solhint-disable-next-line func-name-mixedcasefunctionDATA_AUTHENTICATED_FLAG() externalviewreturns (bytes1);
functionrollup() externalviewreturns (IOwnable);
functionisBatchPoster(address) externalviewreturns (bool);
functionisSequencer(address) externalviewreturns (bool);
functionmaxDataSize() externalviewreturns (uint256);
structDasKeySetInfo {
bool isValidKeyset;
uint64 creationBlock;
}
functionmaxTimeVariation()
externalviewreturns (uint256,
uint256,
uint256,
uint256);
functiondasKeySetInfo(bytes32) externalviewreturns (bool, uint64);
/// @notice Remove force inclusion delay after a L1 chainId forkfunctionremoveDelayAfterFork() external;
/// @notice Force messages from the delayed inbox to be included in the chain/// Callable by any address, but message can only be force-included after maxTimeVariation.delayBlocks and/// maxTimeVariation.delaySeconds has elapsed. As part of normal behaviour the sequencer will include these/// messages so it's only necessary to call this if the sequencer is down, or not including any delayed messages./// @param _totalDelayedMessagesRead The total number of messages to read up to/// @param kind The kind of the last message to be included/// @param l1BlockAndTime The l1 block and the l1 timestamp of the last message to be included/// @param baseFeeL1 The l1 gas price of the last message to be included/// @param sender The sender of the last message to be included/// @param messageDataHash The messageDataHash of the last message to be includedfunctionforceInclusion(uint256 _totalDelayedMessagesRead,
uint8 kind,
uint64[2] calldata l1BlockAndTime,
uint256 baseFeeL1,
address sender,
bytes32 messageDataHash
) external;
functioninboxAccs(uint256 index) externalviewreturns (bytes32);
functionbatchCount() externalviewreturns (uint256);
functionisValidKeysetHash(bytes32 ksHash) externalviewreturns (bool);
/// @notice the creation block is intended to still be available after a keyset is deletedfunctiongetKeysetCreationBlock(bytes32 ksHash) externalviewreturns (uint256);
// ---------- BatchPoster functions ----------functionaddSequencerL2BatchFromOrigin(uint256 sequenceNumber,
bytescalldata data,
uint256 afterDelayedMessagesRead,
IGasRefunder gasRefunder
) external;
functionaddSequencerL2Batch(uint256 sequenceNumber,
bytescalldata data,
uint256 afterDelayedMessagesRead,
IGasRefunder gasRefunder,
uint256 prevMessageCount,
uint256 newMessageCount
) external;
// ---------- onlyRollupOrOwner functions ----------/**
* @notice Set max delay for sequencer inbox
* @param maxTimeVariation_ the maximum time variation parameters
*/functionsetMaxTimeVariation(MaxTimeVariation memory maxTimeVariation_) external;
/**
* @notice Updates whether an address is authorized to be a batch poster at the sequencer inbox
* @param addr the address
* @param isBatchPoster_ if the specified address should be authorized as a batch poster
*/functionsetIsBatchPoster(address addr, bool isBatchPoster_) external;
/**
* @notice Makes Data Availability Service keyset valid
* @param keysetBytes bytes of the serialized keyset
*/functionsetValidKeyset(bytescalldata keysetBytes) external;
/**
* @notice Invalidates a Data Availability Service keyset
* @param ksHash hash of the keyset
*/functioninvalidateKeysetHash(bytes32 ksHash) external;
/**
* @notice Updates whether an address is authorized to be a sequencer.
* @dev The IsSequencer information is used only off-chain by the nitro node to validate sequencer feed signer.
* @param addr the address
* @param isSequencer_ if the specified address should be authorized as a sequencer
*/functionsetIsSequencer(address addr, bool isSequencer_) external;
// ---------- initializer ----------functioninitialize(IBridge bridge_, MaxTimeVariation calldata maxTimeVariation_) external;
functionupdateRollupAddress() external;
}
// Copyright 2021-2022, Offchain Labs, Inc.// For license information, see https://github.com/OffchainLabs/nitro-contracts/blob/main/LICENSE// SPDX-License-Identifier: BUSL-1.1pragmasolidity ^0.8.0;import"../state/GlobalState.sol";
import"../state/Machine.sol";
structExecutionState {
GlobalState globalState;
MachineStatus machineStatus;
}
structAssertion {
ExecutionState beforeState;
ExecutionState afterState;
uint64 numBlocks;
}
structNode {
// Hash of the state of the chain as of this nodebytes32 stateHash;
// Hash of the data that can be challengedbytes32 challengeHash;
// Hash of the data that will be committed if this node is confirmedbytes32 confirmData;
// Index of the node previous to this oneuint64 prevNum;
// Deadline at which this node can be confirmeduint64 deadlineBlock;
// Deadline at which a child of this node can be confirmeduint64 noChildConfirmedBeforeBlock;
// Number of stakers staked on this node. This includes real stakers and zombiesuint64 stakerCount;
// Number of stakers staked on a child node. This includes real stakers and zombiesuint64 childStakerCount;
// This value starts at zero and is set to a value when the first child is created. After that it is constant until the node is destroyed or the owner destroys pending nodesuint64 firstChildBlock;
// The number of the latest child of this node to be createduint64 latestChildNumber;
// The block number when this node was createduint64 createdAtBlock;
// A hash of all the data needed to determine this node's validity, to protect against reorgsbytes32 nodeHash;
}
/**
* @notice Utility functions for Node
*/libraryNodeLib{
/**
* @notice Initialize a Node
* @param _stateHash Initial value of stateHash
* @param _challengeHash Initial value of challengeHash
* @param _confirmData Initial value of confirmData
* @param _prevNum Initial value of prevNum
* @param _deadlineBlock Initial value of deadlineBlock
* @param _nodeHash Initial value of nodeHash
*/functioncreateNode(bytes32 _stateHash,
bytes32 _challengeHash,
bytes32 _confirmData,
uint64 _prevNum,
uint64 _deadlineBlock,
bytes32 _nodeHash
) internalviewreturns (Node memory) {
Node memory node;
node.stateHash = _stateHash;
node.challengeHash = _challengeHash;
node.confirmData = _confirmData;
node.prevNum = _prevNum;
node.deadlineBlock = _deadlineBlock;
node.noChildConfirmedBeforeBlock = _deadlineBlock;
node.createdAtBlock =uint64(block.number);
node.nodeHash = _nodeHash;
return node;
}
/**
* @notice Update child properties
* @param number The child number to set
*/functionchildCreated(Node storageself, uint64 number) internal{
if (self.firstChildBlock ==0) {
self.firstChildBlock =uint64(block.number);
}
self.latestChildNumber = number;
}
/**
* @notice Update the child confirmed deadline
* @param deadline The new deadline to set
*/functionnewChildConfirmDeadline(Node storageself, uint64 deadline) internal{
self.noChildConfirmedBeforeBlock = deadline;
}
/**
* @notice Check whether the current block number has met or passed the node's deadline
*/functionrequirePastDeadline(Node memoryself) internalview{
require(block.number>=self.deadlineBlock, "BEFORE_DEADLINE");
}
/**
* @notice Check whether the current block number has met or passed deadline for children of this node to be confirmed
*/functionrequirePastChildConfirmDeadline(Node memoryself) internalview{
require(block.number>=self.noChildConfirmedBeforeBlock, "CHILD_TOO_RECENT");
}
}
Contract Source Code
File 28 of 35: Proxy.sol
// SPDX-License-Identifier: MIT// OpenZeppelin Contracts (last updated v4.5.0) (proxy/Proxy.sol)pragmasolidity ^0.8.0;/**
* @dev This abstract contract provides a fallback function that delegates all calls to another contract using the EVM
* instruction `delegatecall`. We refer to the second contract as the _implementation_ behind the proxy, and it has to
* be specified by overriding the virtual {_implementation} function.
*
* Additionally, delegation to the implementation can be triggered manually through the {_fallback} function, or to a
* different contract through the {_delegate} function.
*
* The success and return data of the delegated call will be returned back to the caller of the proxy.
*/abstractcontractProxy{
/**
* @dev Delegates the current call to `implementation`.
*
* This function does not return to its internal call site, it will return directly to the external caller.
*/function_delegate(address implementation) internalvirtual{
assembly {
// Copy msg.data. We take full control of memory in this inline assembly// block because it will not return to Solidity code. We overwrite the// Solidity scratch pad at memory position 0.calldatacopy(0, 0, calldatasize())
// Call the implementation.// out and outsize are 0 because we don't know the size yet.let result :=delegatecall(gas(), implementation, 0, calldatasize(), 0, 0)
// Copy the returned data.returndatacopy(0, 0, returndatasize())
switch result
// delegatecall returns 0 on error.case0 {
revert(0, returndatasize())
}
default {
return(0, returndatasize())
}
}
}
/**
* @dev This is a virtual function that should be overriden so it returns the address to which the fallback function
* and {_fallback} should delegate.
*/function_implementation() internalviewvirtualreturns (address);
/**
* @dev Delegates the current call to the address returned by `_implementation()`.
*
* This function does not return to its internall call site, it will return directly to the external caller.
*/function_fallback() internalvirtual{
_beforeFallback();
_delegate(_implementation());
}
/**
* @dev Fallback function that delegates calls to the address returned by `_implementation()`. Will run if no other
* function in the contract matches the call data.
*/fallback() externalpayablevirtual{
_fallback();
}
/**
* @dev Fallback function that delegates calls to the address returned by `_implementation()`. Will run if call data
* is empty.
*/receive() externalpayablevirtual{
_fallback();
}
/**
* @dev Hook that is called before falling back to the implementation. Can happen as part of a manual `_fallback`
* call, or as part of the Solidity `fallback` or `receive` functions.
*
* If overriden should call `super._beforeFallback()`.
*/function_beforeFallback() internalvirtual{}
}
// SPDX-License-Identifier: MIT// OpenZeppelin Contracts v4.4.1 (utils/StorageSlot.sol)pragmasolidity ^0.8.0;/**
* @dev Library for reading and writing primitive types to specific storage slots.
*
* Storage slots are often used to avoid storage conflict when dealing with upgradeable contracts.
* This library helps with reading and writing to such slots without the need for inline assembly.
*
* The functions in this library return Slot structs that contain a `value` member that can be used to read or write.
*
* Example usage to set ERC1967 implementation slot:
* ```
* contract ERC1967 {
* bytes32 internal constant _IMPLEMENTATION_SLOT = 0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc;
*
* function _getImplementation() internal view returns (address) {
* return StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value;
* }
*
* function _setImplementation(address newImplementation) internal {
* require(Address.isContract(newImplementation), "ERC1967: new implementation is not a contract");
* StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value = newImplementation;
* }
* }
* ```
*
* _Available since v4.1 for `address`, `bool`, `bytes32`, and `uint256`._
*/libraryStorageSlot{
structAddressSlot {
address value;
}
structBooleanSlot {
bool value;
}
structBytes32Slot {
bytes32 value;
}
structUint256Slot {
uint256 value;
}
/**
* @dev Returns an `AddressSlot` with member `value` located at `slot`.
*/functiongetAddressSlot(bytes32 slot) internalpurereturns (AddressSlot storage r) {
assembly {
r.slot:= slot
}
}
/**
* @dev Returns an `BooleanSlot` with member `value` located at `slot`.
*/functiongetBooleanSlot(bytes32 slot) internalpurereturns (BooleanSlot storage r) {
assembly {
r.slot:= slot
}
}
/**
* @dev Returns an `Bytes32Slot` with member `value` located at `slot`.
*/functiongetBytes32Slot(bytes32 slot) internalpurereturns (Bytes32Slot storage r) {
assembly {
r.slot:= slot
}
}
/**
* @dev Returns an `Uint256Slot` with member `value` located at `slot`.
*/functiongetUint256Slot(bytes32 slot) internalpurereturns (Uint256Slot storage r) {
assembly {
r.slot:= slot
}
}
}
// Copyright 2021-2022, Offchain Labs, Inc.// For license information, see https://github.com/OffchainLabs/nitro-contracts/blob/main/LICENSE// SPDX-License-Identifier: BUSL-1.1pragmasolidity ^0.8.0;import"./Value.sol";
import"./ValueArray.sol";
structValueStack {
ValueArray proved;
bytes32 remainingHash;
}
libraryValueStackLib{
usingValueLibforValue;
usingValueArrayLibforValueArray;
functionhash(ValueStack memory stack) internalpurereturns (bytes32 h) {
h = stack.remainingHash;
uint256 len = stack.proved.length();
for (uint256 i =0; i < len; i++) {
h =keccak256(abi.encodePacked("Value stack:", stack.proved.get(i).hash(), h));
}
}
functionpeek(ValueStack memory stack) internalpurereturns (Value memory) {
uint256 len = stack.proved.length();
return stack.proved.get(len -1);
}
functionpop(ValueStack memory stack) internalpurereturns (Value memory) {
return stack.proved.pop();
}
functionpush(ValueStack memory stack, Value memory val) internalpure{
return stack.proved.push(val);
}
}
Contract Source Code
File 35 of 35: draft-IERC1822.sol
// SPDX-License-Identifier: MIT// OpenZeppelin Contracts (last updated v4.5.0) (interfaces/draft-IERC1822.sol)pragmasolidity ^0.8.0;/**
* @dev ERC1822: Universal Upgradeable Proxy Standard (UUPS) documents a method for upgradeability through a simplified
* proxy whose upgrades are fully controlled by the current implementation.
*/interfaceIERC1822Proxiable{
/**
* @dev Returns the storage slot that the proxiable contract assumes is being used to store the implementation
* address.
*
* IMPORTANT: A proxy pointing at a proxiable contract should not be considered proxiable itself, because this risks
* bricking a proxy that upgrades to it, by delegating to itself until out of gas. Thus it is critical that this
* function revert if invoked through a proxy.
*/functionproxiableUUID() externalviewreturns (bytes32);
}