From f23c15c403258e6389dd02f3bef9d3fdf2f85c27 Mon Sep 17 00:00:00 2001 From: Goran Vladika Date: Fri, 26 May 2023 16:24:26 +0200 Subject: [PATCH 001/292] Update nitro smart contracts to support erc20-based rollups ERC20-based rollup is the one where fees are paid in custom ERC20 token instead of in ETH. Fee token gets escrowed in the bridge and minted on L2 side as native currency. --- src/bridge/AbsBridge.sol | 295 +++++++++++++++++++++++ src/bridge/AbsInbox.sol | 334 +++++++++++++++++++++++++++ src/bridge/AbsOutbox.sol | 295 +++++++++++++++++++++++ src/bridge/Bridge.sol | 259 ++------------------- src/bridge/ERC20Bridge.sol | 74 ++++++ src/bridge/ERC20Inbox.sol | 141 +++++++++++ src/bridge/ERC20Outbox.sol | 27 +++ src/bridge/IBridge.sol | 17 +- src/bridge/IERC20Bridge.sol | 35 +++ src/bridge/IERC20Inbox.sol | 75 ++++++ src/bridge/IEthBridge.sol | 26 +++ src/bridge/IEthInbox.sol | 133 +++++++++++ src/bridge/IInbox.sol | 136 ++--------- src/bridge/Inbox.sol | 306 ++++-------------------- src/bridge/Outbox.sol | 273 +--------------------- src/libraries/Error.sol | 10 +- src/mocks/BridgeStub.sol | 5 +- src/mocks/InboxStub.sol | 33 ++- src/mocks/SequencerInboxStub.sol | 5 +- src/rollup/AbsBridgeCreator.sol | 117 ++++++++++ src/rollup/AbsRollupCreator.sol | 150 ++++++++++++ src/rollup/AbsRollupEventInbox.sol | 45 ++++ src/rollup/BridgeCreator.sol | 105 ++------- src/rollup/ERC20BridgeCreator.sol | 48 ++++ src/rollup/ERC20RollupCreator.sol | 50 ++++ src/rollup/ERC20RollupEventInbox.sol | 26 +++ src/rollup/IBridgeCreator.sol | 64 +++++ src/rollup/IRollupCreator.sol | 37 +++ src/rollup/RollupCreator.sol | 142 +++--------- src/rollup/RollupEventInbox.sol | 42 +--- src/test-helpers/BridgeTester.sol | 5 +- src/test-helpers/EthVault.sol | 20 ++ 32 files changed, 2182 insertions(+), 1148 deletions(-) create mode 100644 src/bridge/AbsBridge.sol create mode 100644 src/bridge/AbsInbox.sol create mode 100644 src/bridge/AbsOutbox.sol create mode 100644 src/bridge/ERC20Bridge.sol create mode 100644 src/bridge/ERC20Inbox.sol create mode 100644 src/bridge/ERC20Outbox.sol create mode 100644 src/bridge/IERC20Bridge.sol create mode 100644 src/bridge/IERC20Inbox.sol create mode 100644 src/bridge/IEthBridge.sol create mode 100644 src/bridge/IEthInbox.sol create mode 100644 src/rollup/AbsBridgeCreator.sol create mode 100644 src/rollup/AbsRollupCreator.sol create mode 100644 src/rollup/AbsRollupEventInbox.sol create mode 100644 src/rollup/ERC20BridgeCreator.sol create mode 100644 src/rollup/ERC20RollupCreator.sol create mode 100644 src/rollup/ERC20RollupEventInbox.sol create mode 100644 src/rollup/IBridgeCreator.sol create mode 100644 src/rollup/IRollupCreator.sol create mode 100644 src/test-helpers/EthVault.sol diff --git a/src/bridge/AbsBridge.sol b/src/bridge/AbsBridge.sol new file mode 100644 index 00000000..0187b9b1 --- /dev/null +++ b/src/bridge/AbsBridge.sol @@ -0,0 +1,295 @@ +// Copyright 2021-2022, Offchain Labs, Inc. +// For license information, see https://github.com/nitro/blob/master/LICENSE +// SPDX-License-Identifier: BUSL-1.1 + +pragma solidity ^0.8.4; + +import "@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol"; +import "@openzeppelin/contracts-upgradeable/utils/AddressUpgradeable.sol"; + +import { + NotContract, + NotRollupOrOwner, + NotDelayedInbox, + NotSequencerInbox, + NotOutbox, + InvalidOutboxSet, + BadSequencerMessageNumber +} from "../libraries/Error.sol"; +import "./IBridge.sol"; +import "./Messages.sol"; +import "../libraries/DelegateCallAware.sol"; + +import {L1MessageType_batchPostingReport} from "../libraries/MessageTypes.sol"; + +/** + * @title Staging ground for incoming and outgoing messages + * @notice Holds the inbox accumulator for sequenced and delayed messages. + * Since the escrow is held here, this contract also contains a list of allowed + * outboxes that can make calls from here and withdraw this escrow. + */ +abstract contract AbsBridge is Initializable, DelegateCallAware, IBridge { + using AddressUpgradeable for address; + + struct InOutInfo { + uint256 index; + bool allowed; + } + + mapping(address => InOutInfo) private allowedDelayedInboxesMap; + mapping(address => InOutInfo) private allowedOutboxesMap; + + address[] public allowedDelayedInboxList; + address[] public allowedOutboxList; + + address internal _activeOutbox; + + /// @inheritdoc IBridge + bytes32[] public delayedInboxAccs; + + /// @inheritdoc IBridge + bytes32[] public sequencerInboxAccs; + + IOwnable public rollup; + address public sequencerInbox; + + uint256 public override sequencerReportedSubMessageCount; + + address internal constant EMPTY_ACTIVEOUTBOX = address(type(uint160).max); + + modifier onlyRollupOrOwner() { + if (msg.sender != address(rollup)) { + address rollupOwner = rollup.owner(); + if (msg.sender != rollupOwner) { + revert NotRollupOrOwner(msg.sender, address(rollup), rollupOwner); + } + } + _; + } + + /// @dev returns the address of current active Outbox, or zero if no outbox is active + function activeOutbox() public view returns (address) { + address outbox = _activeOutbox; + // address zero is returned if no outbox is set, but the value used in storage + // is non-zero to save users some gas (as storage refunds are usually maxed out) + // EIP-1153 would help here. + // we don't return `EMPTY_ACTIVEOUTBOX` to avoid a breaking change on the current api + if (outbox == EMPTY_ACTIVEOUTBOX) return address(0); + return outbox; + } + + function allowedDelayedInboxes(address inbox) public view returns (bool) { + return allowedDelayedInboxesMap[inbox].allowed; + } + + function allowedOutboxes(address outbox) public view returns (bool) { + return allowedOutboxesMap[outbox].allowed; + } + + modifier onlySequencerInbox() { + if (msg.sender != sequencerInbox) revert NotSequencerInbox(msg.sender); + _; + } + + function enqueueSequencerMessage( + bytes32 dataHash, + uint256 afterDelayedMessagesRead, + uint256 prevMessageCount, + uint256 newMessageCount + ) + external + onlySequencerInbox + returns ( + uint256 seqMessageIndex, + bytes32 beforeAcc, + bytes32 delayedAcc, + bytes32 acc + ) + { + if ( + sequencerReportedSubMessageCount != prevMessageCount && + prevMessageCount != 0 && + sequencerReportedSubMessageCount != 0 + ) { + revert BadSequencerMessageNumber(sequencerReportedSubMessageCount, prevMessageCount); + } + sequencerReportedSubMessageCount = newMessageCount; + seqMessageIndex = sequencerInboxAccs.length; + if (sequencerInboxAccs.length > 0) { + beforeAcc = sequencerInboxAccs[sequencerInboxAccs.length - 1]; + } + if (afterDelayedMessagesRead > 0) { + delayedAcc = delayedInboxAccs[afterDelayedMessagesRead - 1]; + } + acc = keccak256(abi.encodePacked(beforeAcc, dataHash, delayedAcc)); + sequencerInboxAccs.push(acc); + } + + /// @inheritdoc IBridge + function submitBatchSpendingReport(address sender, bytes32 messageDataHash) + external + onlySequencerInbox + returns (uint256) + { + return + addMessageToDelayedAccumulator( + L1MessageType_batchPostingReport, + sender, + uint64(block.number), + uint64(block.timestamp), // solhint-disable-line not-rely-on-time, + block.basefee, + messageDataHash + ); + } + + function _enqueueDelayedMessage( + uint8 kind, + address sender, + bytes32 messageDataHash, + uint256 amount + ) internal returns (uint256) { + if (!allowedDelayedInboxes(msg.sender)) revert NotDelayedInbox(msg.sender); + + uint256 messageCount = addMessageToDelayedAccumulator( + kind, + sender, + uint64(block.number), + uint64(block.timestamp), // solhint-disable-line not-rely-on-time + _baseFeeToReport(), + messageDataHash + ); + + _transferFunds(amount); + + return messageCount; + } + + function addMessageToDelayedAccumulator( + uint8 kind, + address sender, + uint64 blockNumber, + uint64 blockTimestamp, + uint256 baseFeeL1, + bytes32 messageDataHash + ) internal returns (uint256) { + uint256 count = delayedInboxAccs.length; + bytes32 messageHash = Messages.messageHash( + kind, + sender, + blockNumber, + blockTimestamp, + count, + baseFeeL1, + messageDataHash + ); + bytes32 prevAcc = 0; + if (count > 0) { + prevAcc = delayedInboxAccs[count - 1]; + } + delayedInboxAccs.push(Messages.accumulateInboxMessage(prevAcc, messageHash)); + emit MessageDelivered( + count, + prevAcc, + msg.sender, + kind, + sender, + messageDataHash, + baseFeeL1, + blockTimestamp + ); + return count; + } + + /// @inheritdoc IBridge + function executeCall( + address to, + uint256 value, + bytes calldata data + ) external returns (bool success, bytes memory returnData) { + if (!allowedOutboxes(msg.sender)) revert NotOutbox(msg.sender); + if (data.length > 0 && !to.isContract()) revert NotContract(to); + address prevOutbox = _activeOutbox; + _activeOutbox = msg.sender; + // We set and reset active outbox around external call so activeOutbox remains valid during call + + // We use a low level call here since we want to bubble up whether it succeeded or failed to the caller + // rather than reverting on failure as well as allow contract and non-contract calls + (success, returnData) = _executeLowLevelCall(to, value, data); + + _activeOutbox = prevOutbox; + emit BridgeCallTriggered(msg.sender, to, value, data); + } + + function setSequencerInbox(address _sequencerInbox) external onlyRollupOrOwner { + sequencerInbox = _sequencerInbox; + emit SequencerInboxUpdated(_sequencerInbox); + } + + function setDelayedInbox(address inbox, bool enabled) external onlyRollupOrOwner { + InOutInfo storage info = allowedDelayedInboxesMap[inbox]; + bool alreadyEnabled = info.allowed; + emit InboxToggle(inbox, enabled); + if ((alreadyEnabled && enabled) || (!alreadyEnabled && !enabled)) { + return; + } + if (enabled) { + allowedDelayedInboxesMap[inbox] = InOutInfo(allowedDelayedInboxList.length, true); + allowedDelayedInboxList.push(inbox); + } else { + allowedDelayedInboxList[info.index] = allowedDelayedInboxList[ + allowedDelayedInboxList.length - 1 + ]; + allowedDelayedInboxesMap[allowedDelayedInboxList[info.index]].index = info.index; + allowedDelayedInboxList.pop(); + delete allowedDelayedInboxesMap[inbox]; + } + } + + function setOutbox(address outbox, bool enabled) external onlyRollupOrOwner { + if (outbox == EMPTY_ACTIVEOUTBOX) revert InvalidOutboxSet(outbox); + + InOutInfo storage info = allowedOutboxesMap[outbox]; + bool alreadyEnabled = info.allowed; + emit OutboxToggle(outbox, enabled); + if ((alreadyEnabled && enabled) || (!alreadyEnabled && !enabled)) { + return; + } + if (enabled) { + allowedOutboxesMap[outbox] = InOutInfo(allowedOutboxList.length, true); + allowedOutboxList.push(outbox); + } else { + allowedOutboxList[info.index] = allowedOutboxList[allowedOutboxList.length - 1]; + allowedOutboxesMap[allowedOutboxList[info.index]].index = info.index; + allowedOutboxList.pop(); + delete allowedOutboxesMap[outbox]; + } + } + + function setSequencerReportedSubMessageCount(uint256 newMsgCount) external onlyRollupOrOwner { + sequencerReportedSubMessageCount = newMsgCount; + } + + function delayedMessageCount() external view override returns (uint256) { + return delayedInboxAccs.length; + } + + function sequencerMessageCount() external view returns (uint256) { + return sequencerInboxAccs.length; + } + + /// @dev For the classic -> nitro migration. TODO: remove post-migration. + function acceptFundsFromOldBridge() external payable {} + + /// @dev transfer funds provided to pay for crosschain msg + function _transferFunds(uint256 amount) internal virtual; + + function _executeLowLevelCall( + address to, + uint256 value, + bytes memory data + ) internal virtual returns (bool success, bytes memory returnData); + + /// @dev get base fee which is emitted in `MessageDelivered` event and then picked up and + /// used in ArbOs to calculate the submission fee for retryable ticket + function _baseFeeToReport() internal view virtual returns (uint256); +} diff --git a/src/bridge/AbsInbox.sol b/src/bridge/AbsInbox.sol new file mode 100644 index 00000000..7facc1e9 --- /dev/null +++ b/src/bridge/AbsInbox.sol @@ -0,0 +1,334 @@ +// Copyright 2021-2022, Offchain Labs, Inc. +// For license information, see https://github.com/nitro/blob/master/LICENSE +// SPDX-License-Identifier: BUSL-1.1 + +pragma solidity ^0.8.4; + +import { + DataTooLarge, + GasLimitTooLarge, + InsufficientValue, + InsufficientSubmissionCost, + L1Forked, + NotAllowedOrigin, + NotOrigin, + NotRollupOrOwner, + RetryableData +} from "../libraries/Error.sol"; +import "./IInbox.sol"; +import "./ISequencerInbox.sol"; +import "./IBridge.sol"; +import "../libraries/AddressAliasHelper.sol"; +import "../libraries/DelegateCallAware.sol"; +import { + L1MessageType_submitRetryableTx, + L2MessageType_unsignedContractTx, + L2MessageType_unsignedEOATx, + L2_MSG +} from "../libraries/MessageTypes.sol"; +import {MAX_DATA_SIZE} from "../libraries/Constants.sol"; + +import "@openzeppelin/contracts-upgradeable/utils/AddressUpgradeable.sol"; +import "@openzeppelin/contracts-upgradeable/security/PausableUpgradeable.sol"; + +/** + * @title Inbox for user and contract originated messages + * @notice Messages created via this inbox are enqueued in the delayed accumulator + * to await inclusion in the SequencerInbox + */ +abstract contract AbsInbox is DelegateCallAware, PausableUpgradeable, IInbox { + /// @inheritdoc IInbox + IBridge public bridge; + /// @inheritdoc IInbox + ISequencerInbox public sequencerInbox; + + /// ------------------------------------ allow list start ------------------------------------ /// + + /// @inheritdoc IInbox + bool public allowListEnabled; + + /// @inheritdoc IInbox + mapping(address => bool) public isAllowed; + + event AllowListAddressSet(address indexed user, bool val); + event AllowListEnabledUpdated(bool isEnabled); + + /// @inheritdoc IInbox + function setAllowList(address[] memory user, bool[] memory val) external onlyRollupOrOwner { + require(user.length == val.length, "INVALID_INPUT"); + + for (uint256 i = 0; i < user.length; i++) { + isAllowed[user[i]] = val[i]; + emit AllowListAddressSet(user[i], val[i]); + } + } + + /// @inheritdoc IInbox + function setAllowListEnabled(bool _allowListEnabled) external onlyRollupOrOwner { + require(_allowListEnabled != allowListEnabled, "ALREADY_SET"); + allowListEnabled = _allowListEnabled; + emit AllowListEnabledUpdated(_allowListEnabled); + } + + /// @dev this modifier checks the tx.origin instead of msg.sender for convenience (ie it allows + /// allowed users to interact with the token bridge without needing the token bridge to be allowList aware). + /// this modifier is not intended to use to be used for security (since this opens the allowList to + /// a smart contract phishing risk). + modifier onlyAllowed() { + // solhint-disable-next-line avoid-tx-origin + if (allowListEnabled && !isAllowed[tx.origin]) revert NotAllowedOrigin(tx.origin); + _; + } + + /// ------------------------------------ allow list end ------------------------------------ /// + + modifier onlyRollupOrOwner() { + IOwnable rollup = bridge.rollup(); + if (msg.sender != address(rollup)) { + address rollupOwner = rollup.owner(); + if (msg.sender != rollupOwner) { + revert NotRollupOrOwner(msg.sender, address(rollup), rollupOwner); + } + } + _; + } + + uint256 internal immutable deployTimeChainId = block.chainid; + + function _chainIdChanged() internal view returns (bool) { + return deployTimeChainId != block.chainid; + } + + /// @inheritdoc IInbox + function pause() external onlyRollupOrOwner { + _pause(); + } + + /// @inheritdoc IInbox + function unpause() external onlyRollupOrOwner { + _unpause(); + } + + function __AbsInbox_init(IBridge _bridge, ISequencerInbox _sequencerInbox) + internal + onlyInitializing + { + bridge = _bridge; + sequencerInbox = _sequencerInbox; + allowListEnabled = false; + __Pausable_init(); + } + + /// @inheritdoc IInbox + function sendL2MessageFromOrigin(bytes calldata messageData) + external + whenNotPaused + onlyAllowed + returns (uint256) + { + if (_chainIdChanged()) revert L1Forked(); + // solhint-disable-next-line avoid-tx-origin + if (msg.sender != tx.origin) revert NotOrigin(); + if (messageData.length > MAX_DATA_SIZE) + revert DataTooLarge(messageData.length, MAX_DATA_SIZE); + uint256 msgNum = _deliverToBridge(L2_MSG, msg.sender, keccak256(messageData), 0); + emit InboxMessageDeliveredFromOrigin(msgNum); + return msgNum; + } + + /// @inheritdoc IInbox + function sendL2Message(bytes calldata messageData) + external + whenNotPaused + onlyAllowed + returns (uint256) + { + if (_chainIdChanged()) revert L1Forked(); + return _deliverMessage(L2_MSG, msg.sender, messageData, 0); + } + + /// @inheritdoc IInbox + function sendUnsignedTransaction( + uint256 gasLimit, + uint256 maxFeePerGas, + uint256 nonce, + address to, + uint256 value, + bytes calldata data + ) external whenNotPaused onlyAllowed returns (uint256) { + // arbos will discard unsigned tx with gas limit too large + if (gasLimit > type(uint64).max) { + revert GasLimitTooLarge(); + } + return + _deliverMessage( + L2_MSG, + msg.sender, + abi.encodePacked( + L2MessageType_unsignedEOATx, + gasLimit, + maxFeePerGas, + nonce, + uint256(uint160(to)), + value, + data + ), + 0 + ); + } + + /// @inheritdoc IInbox + function sendContractTransaction( + uint256 gasLimit, + uint256 maxFeePerGas, + address to, + uint256 value, + bytes calldata data + ) external whenNotPaused onlyAllowed returns (uint256) { + // arbos will discard unsigned tx with gas limit too large + if (gasLimit > type(uint64).max) { + revert GasLimitTooLarge(); + } + return + _deliverMessage( + L2_MSG, + msg.sender, + abi.encodePacked( + L2MessageType_unsignedContractTx, + gasLimit, + maxFeePerGas, + uint256(uint160(to)), + value, + data + ), + 0 + ); + } + + function _createRetryableTicket( + address to, + uint256 l2CallValue, + uint256 maxSubmissionCost, + address excessFeeRefundAddress, + address callValueRefundAddress, + uint256 gasLimit, + uint256 maxFeePerGas, + uint256 amount, + bytes calldata data + ) internal returns (uint256) { + // ensure the user's deposit alone will make submission succeed + if (amount < (maxSubmissionCost + l2CallValue + gasLimit * maxFeePerGas)) { + revert InsufficientValue( + maxSubmissionCost + l2CallValue + gasLimit * maxFeePerGas, + amount + ); + } + + // if a refund address is a contract, we apply the alias to it + // so that it can access its funds on the L2 + // since the beneficiary and other refund addresses don't get rewritten by arb-os + if (AddressUpgradeable.isContract(excessFeeRefundAddress)) { + excessFeeRefundAddress = AddressAliasHelper.applyL1ToL2Alias(excessFeeRefundAddress); + } + if (AddressUpgradeable.isContract(callValueRefundAddress)) { + // this is the beneficiary. be careful since this is the address that can cancel the retryable in the L2 + callValueRefundAddress = AddressAliasHelper.applyL1ToL2Alias(callValueRefundAddress); + } + + // gas limit is validated to be within uint64 in unsafeCreateRetryableTicket + return + _unsafeCreateRetryableTicket( + to, + l2CallValue, + maxSubmissionCost, + excessFeeRefundAddress, + callValueRefundAddress, + gasLimit, + maxFeePerGas, + amount, + data + ); + } + + function _unsafeCreateRetryableTicket( + address to, + uint256 l2CallValue, + uint256 maxSubmissionCost, + address excessFeeRefundAddress, + address callValueRefundAddress, + uint256 gasLimit, + uint256 maxFeePerGas, + uint256 amount, + bytes calldata data + ) internal returns (uint256) { + // gas price and limit of 1 should never be a valid input, so instead they are used as + // magic values to trigger a revert in eth calls that surface data without requiring a tx trace + if (gasLimit == 1 || maxFeePerGas == 1) + revert RetryableData( + msg.sender, + to, + l2CallValue, + amount, + maxSubmissionCost, + excessFeeRefundAddress, + callValueRefundAddress, + gasLimit, + maxFeePerGas, + data + ); + + // arbos will discard retryable with gas limit too large + if (gasLimit > type(uint64).max) { + revert GasLimitTooLarge(); + } + + uint256 submissionFee = calculateRetryableSubmissionFee(data.length, block.basefee); + if (maxSubmissionCost < submissionFee) + revert InsufficientSubmissionCost(submissionFee, maxSubmissionCost); + + return + _deliverMessage( + L1MessageType_submitRetryableTx, + msg.sender, + abi.encodePacked( + uint256(uint160(to)), + l2CallValue, + amount, + maxSubmissionCost, + uint256(uint160(excessFeeRefundAddress)), + uint256(uint160(callValueRefundAddress)), + gasLimit, + maxFeePerGas, + data.length, + data + ), + amount + ); + } + + function _deliverMessage( + uint8 _kind, + address _sender, + bytes memory _messageData, + uint256 amount + ) internal returns (uint256) { + if (_messageData.length > MAX_DATA_SIZE) + revert DataTooLarge(_messageData.length, MAX_DATA_SIZE); + uint256 msgNum = _deliverToBridge(_kind, _sender, keccak256(_messageData), amount); + emit InboxMessageDelivered(msgNum, _messageData); + return msgNum; + } + + function _deliverToBridge( + uint8 kind, + address sender, + bytes32 messageDataHash, + uint256 amount + ) internal virtual returns (uint256); + + function calculateRetryableSubmissionFee(uint256 dataLength, uint256 baseFee) + public + view + virtual + returns (uint256); +} diff --git a/src/bridge/AbsOutbox.sol b/src/bridge/AbsOutbox.sol new file mode 100644 index 00000000..59eb4797 --- /dev/null +++ b/src/bridge/AbsOutbox.sol @@ -0,0 +1,295 @@ +// Copyright 2021-2022, Offchain Labs, Inc. +// For license information, see https://github.com/nitro/blob/master/LICENSE +// SPDX-License-Identifier: BUSL-1.1 + +pragma solidity ^0.8.4; + +import { + AlreadyInit, + NotRollup, + ProofTooLong, + PathNotMinimal, + UnknownRoot, + AlreadySpent, + BridgeCallFailed, + HadZeroInit +} from "../libraries/Error.sol"; +import "./IBridge.sol"; +import "./IOutbox.sol"; +import "../libraries/MerkleLib.sol"; +import "../libraries/DelegateCallAware.sol"; + +/// @dev this error is thrown since certain functions are only expected to be used in simulations, not in actual txs +error SimulationOnlyEntrypoint(); + +abstract contract AbsOutbox is DelegateCallAware, IOutbox { + address public rollup; // the rollup contract + IBridge public bridge; // the bridge contract + + mapping(uint256 => bytes32) public spent; // packed spent bitmap + mapping(bytes32 => bytes32) public roots; // maps root hashes => L2 block hash + + // we're packing this struct into 4 storage slots + // 1st slot: timestamp, l2Block (128 bits each, max ~3.4*10^38) + // 2nd slot: outputId (256 bits) + // 3rd slot: l1Block (96 bits, max ~7.9*10^28), sender (address 160 bits) + // 4th slot: withdrawalAmount (256 bits) + struct L2ToL1Context { + uint128 l2Block; + uint128 timestamp; + bytes32 outputId; + address sender; + uint96 l1Block; + uint256 withdrawalAmount; + } + + // Note, these variables are set and then wiped during a single transaction. + // Therefore their values don't need to be maintained, and their slots will + // hold default values (which are interpreted as empty values) outside of transactions + L2ToL1Context internal context; + + // default context values to be used in storage instead of zero, to save on storage refunds + // it is assumed that arb-os never assigns these values to a valid leaf to be redeemed + uint128 private constant L2BLOCK_DEFAULT_CONTEXT = type(uint128).max; + uint96 private constant L1BLOCK_DEFAULT_CONTEXT = type(uint96).max; + uint128 private constant TIMESTAMP_DEFAULT_CONTEXT = type(uint128).max; + bytes32 private constant OUTPUTID_DEFAULT_CONTEXT = bytes32(type(uint256).max); + address private constant SENDER_DEFAULT_CONTEXT = address(type(uint160).max); + + uint128 public constant OUTBOX_VERSION = 2; + + function initialize(IBridge _bridge) external onlyDelegated { + if (address(_bridge) == address(0)) revert HadZeroInit(); + if (address(bridge) != address(0)) revert AlreadyInit(); + // address zero is returned if no context is set, but the values used in storage + // are non-zero to save users some gas (as storage refunds are usually maxed out) + // EIP-1153 would help here + context = L2ToL1Context({ + l2Block: L2BLOCK_DEFAULT_CONTEXT, + l1Block: L1BLOCK_DEFAULT_CONTEXT, + timestamp: TIMESTAMP_DEFAULT_CONTEXT, + outputId: OUTPUTID_DEFAULT_CONTEXT, + sender: SENDER_DEFAULT_CONTEXT, + withdrawalAmount: _defaultContextAmount() + }); + bridge = _bridge; + rollup = address(_bridge.rollup()); + } + + function updateSendRoot(bytes32 root, bytes32 l2BlockHash) external { + if (msg.sender != rollup) revert NotRollup(msg.sender, rollup); + roots[root] = l2BlockHash; + emit SendRootUpdated(root, l2BlockHash); + } + + /// @inheritdoc IOutbox + function l2ToL1Sender() external view returns (address) { + address sender = context.sender; + // we don't return the default context value to avoid a breaking change in the API + if (sender == SENDER_DEFAULT_CONTEXT) return address(0); + return sender; + } + + /// @inheritdoc IOutbox + function l2ToL1Block() external view returns (uint256) { + uint128 l2Block = context.l2Block; + // we don't return the default context value to avoid a breaking change in the API + if (l2Block == L2BLOCK_DEFAULT_CONTEXT) return uint256(0); + return uint256(l2Block); + } + + /// @inheritdoc IOutbox + function l2ToL1EthBlock() external view returns (uint256) { + uint96 l1Block = context.l1Block; + // we don't return the default context value to avoid a breaking change in the API + if (l1Block == L1BLOCK_DEFAULT_CONTEXT) return uint256(0); + return uint256(l1Block); + } + + /// @inheritdoc IOutbox + function l2ToL1Timestamp() external view returns (uint256) { + uint128 timestamp = context.timestamp; + // we don't return the default context value to avoid a breaking change in the API + if (timestamp == TIMESTAMP_DEFAULT_CONTEXT) return uint256(0); + return uint256(timestamp); + } + + /// @notice batch number is deprecated and now always returns 0 + function l2ToL1BatchNum() external pure returns (uint256) { + return 0; + } + + /// @inheritdoc IOutbox + function l2ToL1OutputId() external view returns (bytes32) { + bytes32 outputId = context.outputId; + // we don't return the default context value to avoid a breaking change in the API + if (outputId == OUTPUTID_DEFAULT_CONTEXT) return bytes32(0); + return outputId; + } + + /// @inheritdoc IOutbox + function executeTransaction( + bytes32[] calldata proof, + uint256 index, + address l2Sender, + address to, + uint256 l2Block, + uint256 l1Block, + uint256 l2Timestamp, + uint256 value, + bytes calldata data + ) external { + bytes32 userTx = calculateItemHash( + l2Sender, + to, + l2Block, + l1Block, + l2Timestamp, + value, + data + ); + + recordOutputAsSpent(proof, index, userTx); + + executeTransactionImpl(index, l2Sender, to, l2Block, l1Block, l2Timestamp, value, data); + } + + /// @inheritdoc IOutbox + function executeTransactionSimulation( + uint256 index, + address l2Sender, + address to, + uint256 l2Block, + uint256 l1Block, + uint256 l2Timestamp, + uint256 value, + bytes calldata data + ) external { + if (msg.sender != address(0)) revert SimulationOnlyEntrypoint(); + executeTransactionImpl(index, l2Sender, to, l2Block, l1Block, l2Timestamp, value, data); + } + + function executeTransactionImpl( + uint256 outputId, + address l2Sender, + address to, + uint256 l2Block, + uint256 l1Block, + uint256 l2Timestamp, + uint256 value, + bytes calldata data + ) internal { + emit OutBoxTransactionExecuted(to, l2Sender, 0, outputId); + + // we temporarily store the previous values so the outbox can naturally + // unwind itself when there are nested calls to `executeTransaction` + L2ToL1Context memory prevContext = context; + + context = L2ToL1Context({ + sender: l2Sender, + l2Block: uint128(l2Block), + l1Block: uint96(l1Block), + timestamp: uint128(l2Timestamp), + outputId: bytes32(outputId), + withdrawalAmount: _amountToSetInContext(value) + }); + + // set and reset vars around execution so they remain valid during call + executeBridgeCall(to, value, data); + + context = prevContext; + } + + function _calcSpentIndexOffset(uint256 index) + internal + view + returns ( + uint256, + uint256, + bytes32 + ) + { + uint256 spentIndex = index / 255; // Note: Reserves the MSB. + uint256 bitOffset = index % 255; + bytes32 replay = spent[spentIndex]; + return (spentIndex, bitOffset, replay); + } + + function _isSpent(uint256 bitOffset, bytes32 replay) internal pure returns (bool) { + return ((replay >> bitOffset) & bytes32(uint256(1))) != bytes32(0); + } + + /// @inheritdoc IOutbox + function isSpent(uint256 index) external view returns (bool) { + (, uint256 bitOffset, bytes32 replay) = _calcSpentIndexOffset(index); + return _isSpent(bitOffset, replay); + } + + function recordOutputAsSpent( + bytes32[] memory proof, + uint256 index, + bytes32 item + ) internal { + if (proof.length >= 256) revert ProofTooLong(proof.length); + if (index >= 2**proof.length) revert PathNotMinimal(index, 2**proof.length); + + // Hash the leaf an extra time to prove it's a leaf + bytes32 calcRoot = calculateMerkleRoot(proof, index, item); + if (roots[calcRoot] == bytes32(0)) revert UnknownRoot(calcRoot); + + (uint256 spentIndex, uint256 bitOffset, bytes32 replay) = _calcSpentIndexOffset(index); + + if (_isSpent(bitOffset, replay)) revert AlreadySpent(index); + spent[spentIndex] = (replay | bytes32(1 << bitOffset)); + } + + function executeBridgeCall( + address to, + uint256 value, + bytes memory data + ) internal { + (bool success, bytes memory returndata) = bridge.executeCall(to, value, data); + if (!success) { + if (returndata.length > 0) { + // solhint-disable-next-line no-inline-assembly + assembly { + let returndata_size := mload(returndata) + revert(add(32, returndata), returndata_size) + } + } else { + revert BridgeCallFailed(); + } + } + } + + function calculateItemHash( + address l2Sender, + address to, + uint256 l2Block, + uint256 l1Block, + uint256 l2Timestamp, + uint256 value, + bytes calldata data + ) public pure returns (bytes32) { + return + keccak256(abi.encodePacked(l2Sender, to, l2Block, l1Block, l2Timestamp, value, data)); + } + + function calculateMerkleRoot( + bytes32[] memory proof, + uint256 path, + bytes32 item + ) public pure returns (bytes32) { + return MerkleLib.calculateRoot(proof, path, keccak256(abi.encodePacked(item))); + } + + /// @notice default value to be used for 'amount' field in L2ToL1Context outside of transaction execution. + /// @return default 'amount' in case of ERC20-based rollup is type(uint256).max, or 0 in case of ETH-based rollup + function _defaultContextAmount() internal pure virtual returns (uint256); + + /// @notice value to be set for 'amount' field in L2ToL1Context during L2 to L1 transaction execution. + /// In case of ERC20-based rollup this is the amount of native token being withdrawn. In case of standard ETH-based + /// rollup this amount shall always be 0, because amount of ETH being withdrawn can be read from msg.value. + /// @return amount of native token being withdrawn in case of ERC20-based rollup, or 0 in case of ETH-based rollup + function _amountToSetInContext(uint256 value) internal pure virtual returns (uint256); +} diff --git a/src/bridge/Bridge.sol b/src/bridge/Bridge.sol index 722a5e28..9ebb5091 100644 --- a/src/bridge/Bridge.sol +++ b/src/bridge/Bridge.sol @@ -6,17 +6,8 @@ pragma solidity ^0.8.4; import "@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol"; import "@openzeppelin/contracts-upgradeable/utils/AddressUpgradeable.sol"; - -import { - NotContract, - NotRollupOrOwner, - NotDelayedInbox, - NotSequencerInbox, - NotOutbox, - InvalidOutboxSet, - BadSequencerMessageNumber -} from "../libraries/Error.sol"; -import "./IBridge.sol"; +import "./AbsBridge.sol"; +import "./IEthBridge.sol"; import "./Messages.sol"; import "../libraries/DelegateCallAware.sol"; @@ -24,260 +15,40 @@ import {L1MessageType_batchPostingReport} from "../libraries/MessageTypes.sol"; /** * @title Staging ground for incoming and outgoing messages - * @notice Holds the inbox accumulator for sequenced and delayed messages. - * It is also the ETH escrow for value sent with these messages. - * Since the escrow is held here, this contract also contains a list of allowed - * outboxes that can make calls from here and withdraw this escrow. + * @notice It is also the ETH escrow for value sent with these messages. */ -contract Bridge is Initializable, DelegateCallAware, IBridge { +contract Bridge is AbsBridge, IEthBridge { using AddressUpgradeable for address; - struct InOutInfo { - uint256 index; - bool allowed; - } - - mapping(address => InOutInfo) private allowedDelayedInboxesMap; - mapping(address => InOutInfo) private allowedOutboxesMap; - - address[] public allowedDelayedInboxList; - address[] public allowedOutboxList; - - address internal _activeOutbox; - - /// @inheritdoc IBridge - bytes32[] public delayedInboxAccs; - - /// @inheritdoc IBridge - bytes32[] public sequencerInboxAccs; - - IOwnable public rollup; - address public sequencerInbox; - - uint256 public override sequencerReportedSubMessageCount; - - address internal constant EMPTY_ACTIVEOUTBOX = address(type(uint160).max); - + /// @inheritdoc IEthBridge function initialize(IOwnable rollup_) external initializer onlyDelegated { _activeOutbox = EMPTY_ACTIVEOUTBOX; rollup = rollup_; } - modifier onlyRollupOrOwner() { - if (msg.sender != address(rollup)) { - address rollupOwner = rollup.owner(); - if (msg.sender != rollupOwner) { - revert NotRollupOrOwner(msg.sender, address(rollup), rollupOwner); - } - } - _; - } - - /// @dev returns the address of current active Outbox, or zero if no outbox is active - function activeOutbox() public view returns (address) { - address outbox = _activeOutbox; - // address zero is returned if no outbox is set, but the value used in storage - // is non-zero to save users some gas (as storage refunds are usually maxed out) - // EIP-1153 would help here. - // we don't return `EMPTY_ACTIVEOUTBOX` to avoid a breaking change on the current api - if (outbox == EMPTY_ACTIVEOUTBOX) return address(0); - return outbox; - } - - function allowedDelayedInboxes(address inbox) external view returns (bool) { - return allowedDelayedInboxesMap[inbox].allowed; - } - - function allowedOutboxes(address outbox) external view returns (bool) { - return allowedOutboxesMap[outbox].allowed; - } - - modifier onlySequencerInbox() { - if (msg.sender != sequencerInbox) revert NotSequencerInbox(msg.sender); - _; - } - - function enqueueSequencerMessage( - bytes32 dataHash, - uint256 afterDelayedMessagesRead, - uint256 prevMessageCount, - uint256 newMessageCount - ) - external - onlySequencerInbox - returns ( - uint256 seqMessageIndex, - bytes32 beforeAcc, - bytes32 delayedAcc, - bytes32 acc - ) - { - if ( - sequencerReportedSubMessageCount != prevMessageCount && - prevMessageCount != 0 && - sequencerReportedSubMessageCount != 0 - ) { - revert BadSequencerMessageNumber(sequencerReportedSubMessageCount, prevMessageCount); - } - sequencerReportedSubMessageCount = newMessageCount; - seqMessageIndex = sequencerInboxAccs.length; - if (sequencerInboxAccs.length > 0) { - beforeAcc = sequencerInboxAccs[sequencerInboxAccs.length - 1]; - } - if (afterDelayedMessagesRead > 0) { - delayedAcc = delayedInboxAccs[afterDelayedMessagesRead - 1]; - } - acc = keccak256(abi.encodePacked(beforeAcc, dataHash, delayedAcc)); - sequencerInboxAccs.push(acc); - } - - /// @inheritdoc IBridge - function submitBatchSpendingReport(address sender, bytes32 messageDataHash) - external - onlySequencerInbox - returns (uint256) - { - return - addMessageToDelayedAccumulator( - L1MessageType_batchPostingReport, - sender, - uint64(block.number), - uint64(block.timestamp), // solhint-disable-line not-rely-on-time, - block.basefee, - messageDataHash - ); - } - - /// @inheritdoc IBridge + /// @inheritdoc IEthBridge function enqueueDelayedMessage( uint8 kind, address sender, bytes32 messageDataHash ) external payable returns (uint256) { - if (!allowedDelayedInboxesMap[msg.sender].allowed) revert NotDelayedInbox(msg.sender); - return - addMessageToDelayedAccumulator( - kind, - sender, - uint64(block.number), - uint64(block.timestamp), // solhint-disable-line not-rely-on-time - block.basefee, - messageDataHash - ); + return _enqueueDelayedMessage(kind, sender, messageDataHash, msg.value); } - function addMessageToDelayedAccumulator( - uint8 kind, - address sender, - uint64 blockNumber, - uint64 blockTimestamp, - uint256 baseFeeL1, - bytes32 messageDataHash - ) internal returns (uint256) { - uint256 count = delayedInboxAccs.length; - bytes32 messageHash = Messages.messageHash( - kind, - sender, - blockNumber, - blockTimestamp, - count, - baseFeeL1, - messageDataHash - ); - bytes32 prevAcc = 0; - if (count > 0) { - prevAcc = delayedInboxAccs[count - 1]; - } - delayedInboxAccs.push(Messages.accumulateInboxMessage(prevAcc, messageHash)); - emit MessageDelivered( - count, - prevAcc, - msg.sender, - kind, - sender, - messageDataHash, - baseFeeL1, - blockTimestamp - ); - return count; + function _transferFunds(uint256) internal override { + // do nothing as Eth transfer is part of TX execution } - function executeCall( + function _executeLowLevelCall( address to, uint256 value, - bytes calldata data - ) external returns (bool success, bytes memory returnData) { - if (!allowedOutboxesMap[msg.sender].allowed) revert NotOutbox(msg.sender); - if (data.length > 0 && !to.isContract()) revert NotContract(to); - address prevOutbox = _activeOutbox; - _activeOutbox = msg.sender; - // We set and reset active outbox around external call so activeOutbox remains valid during call - - // We use a low level call here since we want to bubble up whether it succeeded or failed to the caller - // rather than reverting on failure as well as allow contract and non-contract calls + bytes memory data + ) internal override returns (bool success, bytes memory returnData) { // solhint-disable-next-line avoid-low-level-calls (success, returnData) = to.call{value: value}(data); - _activeOutbox = prevOutbox; - emit BridgeCallTriggered(msg.sender, to, value, data); - } - - function setSequencerInbox(address _sequencerInbox) external onlyRollupOrOwner { - sequencerInbox = _sequencerInbox; - emit SequencerInboxUpdated(_sequencerInbox); } - function setDelayedInbox(address inbox, bool enabled) external onlyRollupOrOwner { - InOutInfo storage info = allowedDelayedInboxesMap[inbox]; - bool alreadyEnabled = info.allowed; - emit InboxToggle(inbox, enabled); - if ((alreadyEnabled && enabled) || (!alreadyEnabled && !enabled)) { - return; - } - if (enabled) { - allowedDelayedInboxesMap[inbox] = InOutInfo(allowedDelayedInboxList.length, true); - allowedDelayedInboxList.push(inbox); - } else { - allowedDelayedInboxList[info.index] = allowedDelayedInboxList[ - allowedDelayedInboxList.length - 1 - ]; - allowedDelayedInboxesMap[allowedDelayedInboxList[info.index]].index = info.index; - allowedDelayedInboxList.pop(); - delete allowedDelayedInboxesMap[inbox]; - } + function _baseFeeToReport() internal view override returns (uint256) { + return block.basefee; } - - function setOutbox(address outbox, bool enabled) external onlyRollupOrOwner { - if (outbox == EMPTY_ACTIVEOUTBOX) revert InvalidOutboxSet(outbox); - - InOutInfo storage info = allowedOutboxesMap[outbox]; - bool alreadyEnabled = info.allowed; - emit OutboxToggle(outbox, enabled); - if ((alreadyEnabled && enabled) || (!alreadyEnabled && !enabled)) { - return; - } - if (enabled) { - allowedOutboxesMap[outbox] = InOutInfo(allowedOutboxList.length, true); - allowedOutboxList.push(outbox); - } else { - allowedOutboxList[info.index] = allowedOutboxList[allowedOutboxList.length - 1]; - allowedOutboxesMap[allowedOutboxList[info.index]].index = info.index; - allowedOutboxList.pop(); - delete allowedOutboxesMap[outbox]; - } - } - - function setSequencerReportedSubMessageCount(uint256 newMsgCount) external onlyRollupOrOwner { - sequencerReportedSubMessageCount = newMsgCount; - } - - function delayedMessageCount() external view override returns (uint256) { - return delayedInboxAccs.length; - } - - function sequencerMessageCount() external view returns (uint256) { - return sequencerInboxAccs.length; - } - - /// @dev For the classic -> nitro migration. TODO: remove post-migration. - function acceptFundsFromOldBridge() external payable {} -} +} \ No newline at end of file diff --git a/src/bridge/ERC20Bridge.sol b/src/bridge/ERC20Bridge.sol new file mode 100644 index 00000000..c6f08548 --- /dev/null +++ b/src/bridge/ERC20Bridge.sol @@ -0,0 +1,74 @@ +// Copyright 2021-2022, Offchain Labs, Inc. +// For license information, see https://github.com/nitro/blob/master/LICENSE +// SPDX-License-Identifier: BUSL-1.1 + +pragma solidity ^0.8.4; + +import "./AbsBridge.sol"; +import "./IERC20Bridge.sol"; +import "../libraries/AddressAliasHelper.sol"; +import {InvalidTokenSet, CallTargetNotAllowed} from "../libraries/Error.sol"; +import "@openzeppelin/contracts/token/ERC20/IERC20.sol"; +import "@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol"; + +/** + * @title Staging ground for incoming and outgoing messages + * @notice Unlike the standard Eth bridge, native token bridge escrows the custom ERC20 token which is + * used as native currency on L2. + */ +contract ERC20Bridge is AbsBridge, IERC20Bridge { + using SafeERC20 for IERC20; + + /// @inheritdoc IERC20Bridge + address public nativeToken; + + /// @inheritdoc IERC20Bridge + function initialize(IOwnable rollup_, address nativeToken_) external initializer onlyDelegated { + if (nativeToken_ == address(0)) revert InvalidTokenSet(nativeToken_); + nativeToken = nativeToken_; + _activeOutbox = EMPTY_ACTIVEOUTBOX; + rollup = rollup_; + } + + /// @inheritdoc IERC20Bridge + function enqueueDelayedMessage( + uint8 kind, + address sender, + bytes32 messageDataHash, + uint256 tokenFeeAmount + ) external returns (uint256) { + return _enqueueDelayedMessage(kind, sender, messageDataHash, tokenFeeAmount); + } + + function _transferFunds(uint256 amount) internal override { + // fetch native token from Inbox + IERC20(nativeToken).safeTransferFrom(msg.sender, address(this), amount); + } + + function _executeLowLevelCall( + address to, + uint256 value, + bytes memory data + ) internal override returns (bool success, bytes memory returnData) { + if (to == nativeToken) { + revert CallTargetNotAllowed(nativeToken); + } + + // first release native token + IERC20(nativeToken).safeTransfer(to, value); + success = true; + + // if there's data do additional contract call + if (data.length > 0) { + // solhint-disable-next-line avoid-low-level-calls + (success, returnData) = to.call(data); + } + } + + function _baseFeeToReport() internal pure override returns (uint256) { + // ArbOs uses formula 'l1BaseFee * (1400 + 6 * calldataLengthInBytes)' to calculate retryable ticket's + // submission fee. When custom ERC20 token is used to pay for fees, submission fee shall be 0. That's + // why baseFee is reported as 0 here. + return 0; + } +} \ No newline at end of file diff --git a/src/bridge/ERC20Inbox.sol b/src/bridge/ERC20Inbox.sol new file mode 100644 index 00000000..b8dbdc5c --- /dev/null +++ b/src/bridge/ERC20Inbox.sol @@ -0,0 +1,141 @@ +// Copyright 2021-2022, Offchain Labs, Inc. +// For license information, see https://github.com/nitro/blob/master/LICENSE +// SPDX-License-Identifier: BUSL-1.1 + +pragma solidity ^0.8.4; + +import "./AbsInbox.sol"; +import "./IERC20Inbox.sol"; +import "./IERC20Bridge.sol"; +import "../libraries/AddressAliasHelper.sol"; +import {L1MessageType_ethDeposit} from "../libraries/MessageTypes.sol"; +import "@openzeppelin/contracts-upgradeable/utils/AddressUpgradeable.sol"; +import {IERC20} from "@openzeppelin/contracts/token/ERC20/ERC20.sol"; +import "@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol"; + +/** + * @title Inbox for user and contract originated messages + * @notice Messages created via this inbox are enqueued in the delayed accumulator + * to await inclusion in the SequencerInbox + */ +contract ERC20Inbox is AbsInbox, IERC20Inbox { + using SafeERC20 for IERC20; + + /// @inheritdoc IInbox + function initialize(IBridge _bridge, ISequencerInbox _sequencerInbox) + external + initializer + onlyDelegated + { + __AbsInbox_init(_bridge, _sequencerInbox); + + // inbox holds native token in transit used to pay for retryable tickets, approve bridge to use it + address nativeToken = IERC20Bridge(address(bridge)).nativeToken(); + IERC20(nativeToken).approve(address(bridge), type(uint256).max); + } + + /// @inheritdoc IERC20Inbox + function depositERC20(uint256 amount) public whenNotPaused onlyAllowed returns (uint256) { + address dest = msg.sender; + + // solhint-disable-next-line avoid-tx-origin + if (AddressUpgradeable.isContract(msg.sender) || tx.origin != msg.sender) { + // isContract check fails if this function is called during a contract's constructor. + dest = AddressAliasHelper.applyL1ToL2Alias(msg.sender); + } + + return + _deliverMessage( + L1MessageType_ethDeposit, + msg.sender, + abi.encodePacked(dest, amount), + amount + ); + } + + /// @inheritdoc IERC20Inbox + function createRetryableTicket( + address to, + uint256 l2CallValue, + uint256 maxSubmissionCost, + address excessFeeRefundAddress, + address callValueRefundAddress, + uint256 gasLimit, + uint256 maxFeePerGas, + uint256 tokenTotalFeeAmount, + bytes calldata data + ) external whenNotPaused onlyAllowed returns (uint256) { + return + _createRetryableTicket( + to, + l2CallValue, + maxSubmissionCost, + excessFeeRefundAddress, + callValueRefundAddress, + gasLimit, + maxFeePerGas, + tokenTotalFeeAmount, + data + ); + } + + /// @inheritdoc IERC20Inbox + function unsafeCreateRetryableTicket( + address to, + uint256 l2CallValue, + uint256 maxSubmissionCost, + address excessFeeRefundAddress, + address callValueRefundAddress, + uint256 gasLimit, + uint256 maxFeePerGas, + uint256 tokenTotalFeeAmount, + bytes calldata data + ) public whenNotPaused onlyAllowed returns (uint256) { + return + _unsafeCreateRetryableTicket( + to, + l2CallValue, + maxSubmissionCost, + excessFeeRefundAddress, + callValueRefundAddress, + gasLimit, + maxFeePerGas, + tokenTotalFeeAmount, + data + ); + } + + /// @inheritdoc IInbox + function calculateRetryableSubmissionFee(uint256, uint256) + public + pure + override(AbsInbox, IInbox) + returns (uint256) + { + // retryable ticket's submission fee is not charged when ERC20 token is used to pay for fees + return 0; + } + + function _deliverToBridge( + uint8 kind, + address sender, + bytes32 messageDataHash, + uint256 tokenAmount + ) internal override returns (uint256) { + // fetch native token from sender if inbox doesn't already hold enough tokens to pay for fees + address nativeToken = IERC20Bridge(address(bridge)).nativeToken(); + uint256 inboxNativeTokenBalance = IERC20(nativeToken).balanceOf(address(this)); + if (inboxNativeTokenBalance < tokenAmount) { + uint256 diff = tokenAmount - inboxNativeTokenBalance; + IERC20(nativeToken).safeTransferFrom(msg.sender, address(this), diff); + } + + return + IERC20Bridge(address(bridge)).enqueueDelayedMessage( + kind, + AddressAliasHelper.applyL1ToL2Alias(sender), + messageDataHash, + tokenAmount + ); + } +} \ No newline at end of file diff --git a/src/bridge/ERC20Outbox.sol b/src/bridge/ERC20Outbox.sol new file mode 100644 index 00000000..444e6729 --- /dev/null +++ b/src/bridge/ERC20Outbox.sol @@ -0,0 +1,27 @@ +// Copyright 2021-2022, Offchain Labs, Inc. +// For license information, see https://github.com/nitro/blob/master/LICENSE +// SPDX-License-Identifier: BUSL-1.1 + +pragma solidity ^0.8.4; + +import "./AbsOutbox.sol"; + +contract ERC20Outbox is AbsOutbox { + uint256 private constant AMOUNT_DEFAULT_CONTEXT = type(uint256).max; + + function l2ToL1WithdrawalAmount() external view returns (uint256) { + uint256 amount = context.withdrawalAmount; + if (amount == AMOUNT_DEFAULT_CONTEXT) return 0; + return amount; + } + + /// @inheritdoc AbsOutbox + function _defaultContextAmount() internal pure override returns (uint256) { + return AMOUNT_DEFAULT_CONTEXT; + } + + /// @inheritdoc AbsOutbox + function _amountToSetInContext(uint256 value) internal pure override returns (uint256) { + return value; + } +} \ No newline at end of file diff --git a/src/bridge/IBridge.sol b/src/bridge/IBridge.sol index 5e318c3a..25267781 100644 --- a/src/bridge/IBridge.sol +++ b/src/bridge/IBridge.sol @@ -54,17 +54,6 @@ interface IBridge { function sequencerReportedSubMessageCount() external view returns (uint256); - /** - * @dev Enqueue a message in the delayed inbox accumulator. - * These messages are later sequenced in the SequencerInbox, either - * by the sequencer as part of a normal batch, or by force inclusion. - */ - function enqueueDelayedMessage( - uint8 kind, - address sender, - bytes32 messageDataHash - ) external payable returns (uint256); - function executeCall( address to, uint256 value, @@ -108,8 +97,4 @@ interface IBridge { function setDelayedInbox(address inbox, bool enabled) external; function setOutbox(address inbox, bool enabled) external; - - // ---------- initializer ---------- - - function initialize(IOwnable rollup_) external; -} +} \ No newline at end of file diff --git a/src/bridge/IERC20Bridge.sol b/src/bridge/IERC20Bridge.sol new file mode 100644 index 00000000..d654b3d3 --- /dev/null +++ b/src/bridge/IERC20Bridge.sol @@ -0,0 +1,35 @@ +// Copyright 2021-2022, Offchain Labs, Inc. +// For license information, see https://github.com/nitro/blob/master/LICENSE +// SPDX-License-Identifier: BUSL-1.1 + +// solhint-disable-next-line compiler-version +pragma solidity >=0.6.9 <0.9.0; + +import "./IOwnable.sol"; +import "./IBridge.sol"; + +interface IERC20Bridge is IBridge { + /** + * @dev token that is escrowed in bridge on L1 side and minted on L2 as native currency. + * Also fees are paid in this token. ERC777, fee on transfer tokens and rebasing tokens + * are not supported to be used as chain's native token, as they can break collateralization + * invariants. + */ + function nativeToken() external returns (address); + + /** + * @dev Enqueue a message in the delayed inbox accumulator. + * These messages are later sequenced in the SequencerInbox, either + * by the sequencer as part of a normal batch, or by force inclusion. + */ + function enqueueDelayedMessage( + uint8 kind, + address sender, + bytes32 messageDataHash, + uint256 tokenFeeAmount + ) external returns (uint256); + + // ---------- initializer ---------- + + function initialize(IOwnable rollup_, address nativeToken_) external; +} \ No newline at end of file diff --git a/src/bridge/IERC20Inbox.sol b/src/bridge/IERC20Inbox.sol new file mode 100644 index 00000000..5ad88a20 --- /dev/null +++ b/src/bridge/IERC20Inbox.sol @@ -0,0 +1,75 @@ +// Copyright 2021-2022, Offchain Labs, Inc. +// For license information, see https://github.com/nitro/blob/master/LICENSE +// SPDX-License-Identifier: BUSL-1.1 + +// solhint-disable-next-line compiler-version +pragma solidity >=0.6.9 <0.9.0; + +import "./IInbox.sol"; + +interface IERC20Inbox is IInbox { + /** + * @notice Deposit native token from L1 to L2 to address of the sender if sender is an EOA, and to its aliased address if the sender is a contract + * @dev This does not trigger the fallback function when receiving in the L2 side. + * Look into retryable tickets if you are interested in this functionality. + * @dev This function should not be called inside contract constructors + */ + function depositERC20(uint256 amount) external returns (uint256); + + /** + * @notice Put a message in the L2 inbox that can be reexecuted for some fixed amount of time if it reverts + * @dev all tokenTotalFeeAmount will be deposited to callValueRefundAddress on L2 + * @dev Gas limit and maxFeePerGas should not be set to 1 as that is used to trigger the RetryableData error + * @param to destination L2 contract address + * @param l2CallValue call value for retryable L2 message + * @param maxSubmissionCost Max gas deducted from user's L2 balance to cover base submission fee + * @param excessFeeRefundAddress gasLimit x maxFeePerGas - execution cost gets credited here on L2 balance + * @param callValueRefundAddress l2Callvalue gets credited here on L2 if retryable txn times out or gets cancelled + * @param gasLimit Max gas deducted from user's L2 balance to cover L2 execution. Should not be set to 1 (magic value used to trigger the RetryableData error) + * @param maxFeePerGas price bid for L2 execution. Should not be set to 1 (magic value used to trigger the RetryableData error) + * @param tokenTotalFeeAmount amount of fees to be deposited in native token to cover for retryable ticket cost + * @param data ABI encoded data of L2 message + * @return unique message number of the retryable transaction + */ + function createRetryableTicket( + address to, + uint256 l2CallValue, + uint256 maxSubmissionCost, + address excessFeeRefundAddress, + address callValueRefundAddress, + uint256 gasLimit, + uint256 maxFeePerGas, + uint256 tokenTotalFeeAmount, + bytes calldata data + ) external returns (uint256); + + /** + * @notice Put a message in the L2 inbox that can be reexecuted for some fixed amount of time if it reverts + * @dev Same as createRetryableTicket, but does not guarantee that submission will succeed by requiring the needed funds + * come from the deposit alone, rather than falling back on the user's L2 balance + * @dev Advanced usage only (does not rewrite aliases for excessFeeRefundAddress and callValueRefundAddress). + * createRetryableTicket method is the recommended standard. + * @dev Gas limit and maxFeePerGas should not be set to 1 as that is used to trigger the RetryableData error + * @param to destination L2 contract address + * @param l2CallValue call value for retryable L2 message + * @param maxSubmissionCost Max gas deducted from user's L2 balance to cover base submission fee + * @param excessFeeRefundAddress gasLimit x maxFeePerGas - execution cost gets credited here on L2 balance + * @param callValueRefundAddress l2Callvalue gets credited here on L2 if retryable txn times out or gets cancelled + * @param gasLimit Max gas deducted from user's L2 balance to cover L2 execution. Should not be set to 1 (magic value used to trigger the RetryableData error) + * @param maxFeePerGas price bid for L2 execution. Should not be set to 1 (magic value used to trigger the RetryableData error) + * @param tokenTotalFeeAmount amount of fees to be deposited in native token to cover for retryable ticket cost + * @param data ABI encoded data of L2 message + * @return unique message number of the retryable transaction + */ + function unsafeCreateRetryableTicket( + address to, + uint256 l2CallValue, + uint256 maxSubmissionCost, + address excessFeeRefundAddress, + address callValueRefundAddress, + uint256 gasLimit, + uint256 maxFeePerGas, + uint256 tokenTotalFeeAmount, + bytes calldata data + ) external returns (uint256); +} \ No newline at end of file diff --git a/src/bridge/IEthBridge.sol b/src/bridge/IEthBridge.sol new file mode 100644 index 00000000..a1b3183d --- /dev/null +++ b/src/bridge/IEthBridge.sol @@ -0,0 +1,26 @@ +// Copyright 2021-2022, Offchain Labs, Inc. +// For license information, see https://github.com/nitro/blob/master/LICENSE +// SPDX-License-Identifier: BUSL-1.1 + +// solhint-disable-next-line compiler-version +pragma solidity >=0.6.9 <0.9.0; + +import "./IOwnable.sol"; +import "./IBridge.sol"; + +interface IEthBridge is IBridge { + /** + * @dev Enqueue a message in the delayed inbox accumulator. + * These messages are later sequenced in the SequencerInbox, either + * by the sequencer as part of a normal batch, or by force inclusion. + */ + function enqueueDelayedMessage( + uint8 kind, + address sender, + bytes32 messageDataHash + ) external payable returns (uint256); + + // ---------- initializer ---------- + + function initialize(IOwnable rollup_) external; +} \ No newline at end of file diff --git a/src/bridge/IEthInbox.sol b/src/bridge/IEthInbox.sol new file mode 100644 index 00000000..48c1804e --- /dev/null +++ b/src/bridge/IEthInbox.sol @@ -0,0 +1,133 @@ +// Copyright 2021-2022, Offchain Labs, Inc. +// For license information, see https://github.com/nitro/blob/master/LICENSE +// SPDX-License-Identifier: BUSL-1.1 + +// solhint-disable-next-line compiler-version +pragma solidity >=0.6.9 <0.9.0; + +import "./IBridge.sol"; +import "./IInbox.sol"; + +interface IEthInbox is IInbox { + function sendL1FundedUnsignedTransaction( + uint256 gasLimit, + uint256 maxFeePerGas, + uint256 nonce, + address to, + bytes calldata data + ) external payable returns (uint256); + + function sendL1FundedContractTransaction( + uint256 gasLimit, + uint256 maxFeePerGas, + address to, + bytes calldata data + ) external payable returns (uint256); + + /** + * @dev This method can only be called upon L1 fork and will not alias the caller + * This method will revert if not called from origin + */ + function sendL1FundedUnsignedTransactionToFork( + uint256 gasLimit, + uint256 maxFeePerGas, + uint256 nonce, + address to, + bytes calldata data + ) external payable returns (uint256); + + /** + * @dev This method can only be called upon L1 fork and will not alias the caller + * This method will revert if not called from origin + */ + function sendUnsignedTransactionToFork( + uint256 gasLimit, + uint256 maxFeePerGas, + uint256 nonce, + address to, + uint256 value, + bytes calldata data + ) external returns (uint256); + + /** + * @notice Send a message to initiate L2 withdrawal + * @dev This method can only be called upon L1 fork and will not alias the caller + * This method will revert if not called from origin + */ + function sendWithdrawEthToFork( + uint256 gasLimit, + uint256 maxFeePerGas, + uint256 nonce, + uint256 value, + address withdrawTo + ) external returns (uint256); + + /** + * @notice Deposit eth from L1 to L2 to address of the sender if sender is an EOA, and to its aliased address if the sender is a contract + * @dev This does not trigger the fallback function when receiving in the L2 side. + * Look into retryable tickets if you are interested in this functionality. + * @dev This function should not be called inside contract constructors + */ + function depositEth() external payable returns (uint256); + + /** + * @notice Put a message in the L2 inbox that can be reexecuted for some fixed amount of time if it reverts + * @dev all msg.value will deposited to callValueRefundAddress on L2 + * @dev Gas limit and maxFeePerGas should not be set to 1 as that is used to trigger the RetryableData error + * @param to destination L2 contract address + * @param l2CallValue call value for retryable L2 message + * @param maxSubmissionCost Max gas deducted from user's L2 balance to cover base submission fee + * @param excessFeeRefundAddress gasLimit x maxFeePerGas - execution cost gets credited here on L2 balance + * @param callValueRefundAddress l2Callvalue gets credited here on L2 if retryable txn times out or gets cancelled + * @param gasLimit Max gas deducted from user's L2 balance to cover L2 execution. Should not be set to 1 (magic value used to trigger the RetryableData error) + * @param maxFeePerGas price bid for L2 execution. Should not be set to 1 (magic value used to trigger the RetryableData error) + * @param data ABI encoded data of L2 message + * @return unique message number of the retryable transaction + */ + function createRetryableTicket( + address to, + uint256 l2CallValue, + uint256 maxSubmissionCost, + address excessFeeRefundAddress, + address callValueRefundAddress, + uint256 gasLimit, + uint256 maxFeePerGas, + bytes calldata data + ) external payable returns (uint256); + + /** + * @notice Put a message in the L2 inbox that can be reexecuted for some fixed amount of time if it reverts + * @dev Same as createRetryableTicket, but does not guarantee that submission will succeed by requiring the needed funds + * come from the deposit alone, rather than falling back on the user's L2 balance + * @dev Advanced usage only (does not rewrite aliases for excessFeeRefundAddress and callValueRefundAddress). + * createRetryableTicket method is the recommended standard. + * @dev Gas limit and maxFeePerGas should not be set to 1 as that is used to trigger the RetryableData error + * @param to destination L2 contract address + * @param l2CallValue call value for retryable L2 message + * @param maxSubmissionCost Max gas deducted from user's L2 balance to cover base submission fee + * @param excessFeeRefundAddress gasLimit x maxFeePerGas - execution cost gets credited here on L2 balance + * @param callValueRefundAddress l2Callvalue gets credited here on L2 if retryable txn times out or gets cancelled + * @param gasLimit Max gas deducted from user's L2 balance to cover L2 execution. Should not be set to 1 (magic value used to trigger the RetryableData error) + * @param maxFeePerGas price bid for L2 execution. Should not be set to 1 (magic value used to trigger the RetryableData error) + * @param data ABI encoded data of L2 message + * @return unique message number of the retryable transaction + */ + function unsafeCreateRetryableTicket( + address to, + uint256 l2CallValue, + uint256 maxSubmissionCost, + address excessFeeRefundAddress, + address callValueRefundAddress, + uint256 gasLimit, + uint256 maxFeePerGas, + bytes calldata data + ) external payable returns (uint256); + + // ---------- initializer ---------- + + /** + * @dev function to be called one time during the inbox upgrade process + * this is used to fix the storage slots + */ + function postUpgradeInit(IBridge _bridge) external; +} \ No newline at end of file diff --git a/src/bridge/IInbox.sol b/src/bridge/IInbox.sol index ba424b6b..b27558c4 100644 --- a/src/bridge/IInbox.sol +++ b/src/bridge/IInbox.sol @@ -17,7 +17,6 @@ interface IInbox is IDelayedMessageProvider { /** * @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 - * This method will be disabled upon L1 fork to prevent replay attacks on L2 * @param messageData Data of the message being sent */ function sendL2MessageFromOrigin(bytes calldata messageData) external returns (uint256); @@ -25,26 +24,10 @@ interface IInbox is IDelayedMessageProvider { /** * @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 - * This method will be disabled upon L1 fork to prevent replay attacks on L2 * @param messageData Data of the message being sent */ function sendL2Message(bytes calldata messageData) external returns (uint256); - function sendL1FundedUnsignedTransaction( - uint256 gasLimit, - uint256 maxFeePerGas, - uint256 nonce, - address to, - bytes calldata data - ) external payable returns (uint256); - - function sendL1FundedContractTransaction( - uint256 gasLimit, - uint256 maxFeePerGas, - address to, - bytes calldata data - ) external payable returns (uint256); - function sendUnsignedTransaction( uint256 gasLimit, uint256 maxFeePerGas, @@ -62,44 +45,6 @@ interface IInbox is IDelayedMessageProvider { bytes calldata data ) external returns (uint256); - /** - * @dev This method can only be called upon L1 fork and will not alias the caller - * This method will revert if not called from origin - */ - function sendL1FundedUnsignedTransactionToFork( - uint256 gasLimit, - uint256 maxFeePerGas, - uint256 nonce, - address to, - bytes calldata data - ) external payable returns (uint256); - - /** - * @dev This method can only be called upon L1 fork and will not alias the caller - * This method will revert if not called from origin - */ - function sendUnsignedTransactionToFork( - uint256 gasLimit, - uint256 maxFeePerGas, - uint256 nonce, - address to, - uint256 value, - bytes calldata data - ) external returns (uint256); - - /** - * @notice Send a message to initiate L2 withdrawal - * @dev This method can only be called upon L1 fork and will not alias the caller - * This method will revert if not called from origin - */ - function sendWithdrawEthToFork( - uint256 gasLimit, - uint256 maxFeePerGas, - uint256 nonce, - uint256 value, - address withdrawTo - ) external returns (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 @@ -112,67 +57,6 @@ interface IInbox is IDelayedMessageProvider { view returns (uint256); - /** - * @notice Deposit eth from L1 to L2 to address of the sender if sender is an EOA, and to its aliased address if the sender is a contract - * @dev This does not trigger the fallback function when receiving in the L2 side. - * Look into retryable tickets if you are interested in this functionality. - * @dev This function should not be called inside contract constructors - */ - function depositEth() external payable returns (uint256); - - /** - * @notice Put a message in the L2 inbox that can be reexecuted for some fixed amount of time if it reverts - * @dev all msg.value will deposited to callValueRefundAddress on L2 - * @dev Gas limit and maxFeePerGas should not be set to 1 as that is used to trigger the RetryableData error - * @param to destination L2 contract address - * @param l2CallValue call value for retryable L2 message - * @param maxSubmissionCost Max gas deducted from user's L2 balance to cover base submission fee - * @param excessFeeRefundAddress gasLimit x maxFeePerGas - execution cost gets credited here on L2 balance - * @param callValueRefundAddress l2Callvalue gets credited here on L2 if retryable txn times out or gets cancelled - * @param gasLimit Max gas deducted from user's L2 balance to cover L2 execution. Should not be set to 1 (magic value used to trigger the RetryableData error) - * @param maxFeePerGas price bid for L2 execution. Should not be set to 1 (magic value used to trigger the RetryableData error) - * @param data ABI encoded data of L2 message - * @return unique message number of the retryable transaction - */ - function createRetryableTicket( - address to, - uint256 l2CallValue, - uint256 maxSubmissionCost, - address excessFeeRefundAddress, - address callValueRefundAddress, - uint256 gasLimit, - uint256 maxFeePerGas, - bytes calldata data - ) external payable returns (uint256); - - /** - * @notice Put a message in the L2 inbox that can be reexecuted for some fixed amount of time if it reverts - * @dev Same as createRetryableTicket, but does not guarantee that submission will succeed by requiring the needed funds - * come from the deposit alone, rather than falling back on the user's L2 balance - * @dev Advanced usage only (does not rewrite aliases for excessFeeRefundAddress and callValueRefundAddress). - * createRetryableTicket method is the recommended standard. - * @dev Gas limit and maxFeePerGas should not be set to 1 as that is used to trigger the RetryableData error - * @param to destination L2 contract address - * @param l2CallValue call value for retryable L2 message - * @param maxSubmissionCost Max gas deducted from user's L2 balance to cover base submission fee - * @param excessFeeRefundAddress gasLimit x maxFeePerGas - execution cost gets credited here on L2 balance - * @param callValueRefundAddress l2Callvalue gets credited here on L2 if retryable txn times out or gets cancelled - * @param gasLimit Max gas deducted from user's L2 balance to cover L2 execution. Should not be set to 1 (magic value used to trigger the RetryableData error) - * @param maxFeePerGas price bid for L2 execution. Should not be set to 1 (magic value used to trigger the RetryableData error) - * @param data ABI encoded data of L2 message - * @return unique message number of the retryable transaction - */ - function unsafeCreateRetryableTicket( - address to, - uint256 l2CallValue, - uint256 maxSubmissionCost, - address excessFeeRefundAddress, - address callValueRefundAddress, - uint256 gasLimit, - uint256 maxFeePerGas, - bytes calldata data - ) external payable returns (uint256); - // ---------- onlyRollupOrOwner functions ---------- /// @notice pauses all inbox functionality @@ -181,13 +65,19 @@ interface IInbox is IDelayedMessageProvider { /// @notice unpauses all inbox functionality function unpause() external; - // ---------- initializer ---------- + /// @notice add or remove users from allowList + function setAllowList(address[] memory user, bool[] memory val) external; - /** - * @dev function to be called one time during the inbox upgrade process - * this is used to fix the storage slots - */ - function postUpgradeInit(IBridge _bridge) external; + /// @notice enable or disable allowList + function setAllowListEnabled(bool _allowListEnabled) external; + + /// @notice check if user is in allowList + function isAllowed(address user) external view returns (bool); + + /// @notice check if allowList is enabled + function allowListEnabled() external view returns (bool); + + // ---------- initializer ---------- function initialize(IBridge _bridge, ISequencerInbox _sequencerInbox) external; -} +} \ No newline at end of file diff --git a/src/bridge/Inbox.sol b/src/bridge/Inbox.sol index 13eeca33..5f9ba219 100644 --- a/src/bridge/Inbox.sol +++ b/src/bridge/Inbox.sol @@ -5,28 +5,20 @@ pragma solidity ^0.8.4; import { - AlreadyInit, NotOrigin, DataTooLarge, - AlreadyPaused, - AlreadyUnpaused, - Paused, InsufficientValue, InsufficientSubmissionCost, - NotAllowedOrigin, RetryableData, - NotRollupOrOwner, L1Forked, NotForked, GasLimitTooLarge } from "../libraries/Error.sol"; -import "./IInbox.sol"; -import "./ISequencerInbox.sol"; +import "./AbsInbox.sol"; +import "./IEthInbox.sol"; import "./IBridge.sol"; - -import "./Messages.sol"; +import "./IEthBridge.sol"; import "../libraries/AddressAliasHelper.sol"; -import "../libraries/DelegateCallAware.sol"; import { L2_MSG, L1MessageType_L2FundedByL1, @@ -39,121 +31,26 @@ import {MAX_DATA_SIZE, UNISWAP_L1_TIMELOCK, UNISWAP_L2_FACTORY} from "../librari import "../precompiles/ArbSys.sol"; import "@openzeppelin/contracts-upgradeable/utils/AddressUpgradeable.sol"; -import "@openzeppelin/contracts-upgradeable/security/PausableUpgradeable.sol"; /** * @title Inbox for user and contract originated messages * @notice Messages created via this inbox are enqueued in the delayed accumulator * to await inclusion in the SequencerInbox */ -contract Inbox is DelegateCallAware, PausableUpgradeable, IInbox { - IBridge public bridge; - ISequencerInbox public sequencerInbox; - - /// ------------------------------------ allow list start ------------------------------------ /// - - bool public allowListEnabled; - mapping(address => bool) public isAllowed; - - event AllowListAddressSet(address indexed user, bool val); - event AllowListEnabledUpdated(bool isEnabled); - - function setAllowList(address[] memory user, bool[] memory val) external onlyRollupOrOwner { - require(user.length == val.length, "INVALID_INPUT"); - - for (uint256 i = 0; i < user.length; i++) { - isAllowed[user[i]] = val[i]; - emit AllowListAddressSet(user[i], val[i]); - } - } - - function setAllowListEnabled(bool _allowListEnabled) external onlyRollupOrOwner { - require(_allowListEnabled != allowListEnabled, "ALREADY_SET"); - allowListEnabled = _allowListEnabled; - emit AllowListEnabledUpdated(_allowListEnabled); - } - - /// @dev this modifier checks the tx.origin instead of msg.sender for convenience (ie it allows - /// allowed users to interact with the token bridge without needing the token bridge to be allowList aware). - /// this modifier is not intended to use to be used for security (since this opens the allowList to - /// a smart contract phishing risk). - modifier onlyAllowed() { - // solhint-disable-next-line avoid-tx-origin - if (allowListEnabled && !isAllowed[tx.origin]) revert NotAllowedOrigin(tx.origin); - _; - } - - /// ------------------------------------ allow list end ------------------------------------ /// - - modifier onlyRollupOrOwner() { - IOwnable rollup = bridge.rollup(); - if (msg.sender != address(rollup)) { - address rollupOwner = rollup.owner(); - if (msg.sender != rollupOwner) { - revert NotRollupOrOwner(msg.sender, address(rollup), rollupOwner); - } - } - _; - } - - uint256 internal immutable deployTimeChainId = block.chainid; - - function _chainIdChanged() internal view returns (bool) { - return deployTimeChainId != block.chainid; - } - +contract Inbox is AbsInbox, IEthInbox { /// @inheritdoc IInbox - function pause() external onlyRollupOrOwner { - _pause(); - } - - /// @inheritdoc IInbox - function unpause() external onlyRollupOrOwner { - _unpause(); - } - function initialize(IBridge _bridge, ISequencerInbox _sequencerInbox) external initializer onlyDelegated { - bridge = _bridge; - sequencerInbox = _sequencerInbox; - allowListEnabled = false; - __Pausable_init(); + __AbsInbox_init(_bridge, _sequencerInbox); } - /// @inheritdoc IInbox + /// @inheritdoc IEthInbox function postUpgradeInit(IBridge) external onlyDelegated onlyProxyOwner {} - /// @inheritdoc IInbox - function sendL2MessageFromOrigin(bytes calldata messageData) - external - whenNotPaused - onlyAllowed - returns (uint256) - { - if (_chainIdChanged()) revert L1Forked(); - // solhint-disable-next-line avoid-tx-origin - if (msg.sender != tx.origin) revert NotOrigin(); - if (messageData.length > MAX_DATA_SIZE) - revert DataTooLarge(messageData.length, MAX_DATA_SIZE); - uint256 msgNum = deliverToBridge(L2_MSG, msg.sender, keccak256(messageData)); - emit InboxMessageDeliveredFromOrigin(msgNum); - return msgNum; - } - - /// @inheritdoc IInbox - function sendL2Message(bytes calldata messageData) - external - whenNotPaused - onlyAllowed - returns (uint256) - { - if (_chainIdChanged()) revert L1Forked(); - return _deliverMessage(L2_MSG, msg.sender, messageData); - } - + /// @inheritdoc IEthInbox function sendL1FundedUnsignedTransaction( uint256 gasLimit, uint256 maxFeePerGas, @@ -177,10 +74,12 @@ contract Inbox is DelegateCallAware, PausableUpgradeable, IInbox { uint256(uint160(to)), msg.value, data - ) + ), + msg.value ); } + /// @inheritdoc IEthInbox function sendL1FundedContractTransaction( uint256 gasLimit, uint256 maxFeePerGas, @@ -202,65 +101,12 @@ contract Inbox is DelegateCallAware, PausableUpgradeable, IInbox { uint256(uint160(to)), msg.value, data - ) - ); - } - - function sendUnsignedTransaction( - uint256 gasLimit, - uint256 maxFeePerGas, - uint256 nonce, - address to, - uint256 value, - bytes calldata data - ) external whenNotPaused onlyAllowed returns (uint256) { - // arbos will discard unsigned tx with gas limit too large - if (gasLimit > type(uint64).max) { - revert GasLimitTooLarge(); - } - return - _deliverMessage( - L2_MSG, - msg.sender, - abi.encodePacked( - L2MessageType_unsignedEOATx, - gasLimit, - maxFeePerGas, - nonce, - uint256(uint160(to)), - value, - data - ) - ); - } - - function sendContractTransaction( - uint256 gasLimit, - uint256 maxFeePerGas, - address to, - uint256 value, - bytes calldata data - ) external whenNotPaused onlyAllowed returns (uint256) { - // arbos will discard unsigned tx with gas limit too large - if (gasLimit > type(uint64).max) { - revert GasLimitTooLarge(); - } - return - _deliverMessage( - L2_MSG, - msg.sender, - abi.encodePacked( - L2MessageType_unsignedContractTx, - gasLimit, - maxFeePerGas, - uint256(uint160(to)), - value, - data - ) + ), + msg.value ); } - /// @inheritdoc IInbox + /// @inheritdoc IEthInbox function sendL1FundedUnsignedTransactionToFork( uint256 gasLimit, uint256 maxFeePerGas, @@ -288,11 +134,12 @@ contract Inbox is DelegateCallAware, PausableUpgradeable, IInbox { uint256(uint160(to)), msg.value, data - ) + ), + msg.value ); } - /// @inheritdoc IInbox + /// @inheritdoc IEthInbox function sendUnsignedTransactionToFork( uint256 gasLimit, uint256 maxFeePerGas, @@ -321,11 +168,12 @@ contract Inbox is DelegateCallAware, PausableUpgradeable, IInbox { uint256(uint160(to)), value, data - ) + ), + 0 ); } - /// @inheritdoc IInbox + /// @inheritdoc IEthInbox function sendWithdrawEthToFork( uint256 gasLimit, uint256 maxFeePerGas, @@ -353,21 +201,12 @@ contract Inbox is DelegateCallAware, PausableUpgradeable, IInbox { uint256(uint160(address(100))), // ArbSys address value, abi.encode(ArbSys.withdrawEth.selector, withdrawTo) - ) + ), + 0 ); } - /// @inheritdoc IInbox - function calculateRetryableSubmissionFee(uint256 dataLength, uint256 baseFee) - public - view - returns (uint256) - { - // Use current block basefee if baseFee parameter is 0 - return (1400 + 6 * dataLength) * (baseFee == 0 ? block.basefee : baseFee); - } - - /// @inheritdoc IInbox + /// @inheritdoc IEthInbox function depositEth() public payable whenNotPaused onlyAllowed returns (uint256) { address dest = msg.sender; @@ -381,7 +220,8 @@ contract Inbox is DelegateCallAware, PausableUpgradeable, IInbox { _deliverMessage( L1MessageType_ethDeposit, msg.sender, - abi.encodePacked(dest, msg.value) + abi.encodePacked(dest, msg.value), + msg.value ); } @@ -428,7 +268,7 @@ contract Inbox is DelegateCallAware, PausableUpgradeable, IInbox { ); } - /// @inheritdoc IInbox + /// @inheritdoc IEthInbox function createRetryableTicket( address to, uint256 l2CallValue, @@ -439,28 +279,8 @@ contract Inbox is DelegateCallAware, PausableUpgradeable, IInbox { uint256 maxFeePerGas, bytes calldata data ) external payable whenNotPaused onlyAllowed returns (uint256) { - // ensure the user's deposit alone will make submission succeed - if (msg.value < (maxSubmissionCost + l2CallValue + gasLimit * maxFeePerGas)) { - revert InsufficientValue( - maxSubmissionCost + l2CallValue + gasLimit * maxFeePerGas, - msg.value - ); - } - - // if a refund address is a contract, we apply the alias to it - // so that it can access its funds on the L2 - // since the beneficiary and other refund addresses don't get rewritten by arb-os - if (AddressUpgradeable.isContract(excessFeeRefundAddress)) { - excessFeeRefundAddress = AddressAliasHelper.applyL1ToL2Alias(excessFeeRefundAddress); - } - if (AddressUpgradeable.isContract(callValueRefundAddress)) { - // this is the beneficiary. be careful since this is the address that can cancel the retryable in the L2 - callValueRefundAddress = AddressAliasHelper.applyL1ToL2Alias(callValueRefundAddress); - } - - // gas limit is validated to be within uint64 in unsafeCreateRetryableTicket return - unsafeCreateRetryableTicket( + _createRetryableTicket( to, l2CallValue, maxSubmissionCost, @@ -468,11 +288,12 @@ contract Inbox is DelegateCallAware, PausableUpgradeable, IInbox { callValueRefundAddress, gasLimit, maxFeePerGas, + msg.value, data ); } - /// @inheritdoc IInbox + /// @inheritdoc IEthInbox function unsafeCreateRetryableTicket( address to, uint256 l2CallValue, @@ -483,48 +304,29 @@ contract Inbox is DelegateCallAware, PausableUpgradeable, IInbox { uint256 maxFeePerGas, bytes calldata data ) public payable whenNotPaused onlyAllowed returns (uint256) { - // gas price and limit of 1 should never be a valid input, so instead they are used as - // magic values to trigger a revert in eth calls that surface data without requiring a tx trace - if (gasLimit == 1 || maxFeePerGas == 1) - revert RetryableData( - msg.sender, + return + _unsafeCreateRetryableTicket( to, l2CallValue, - msg.value, maxSubmissionCost, excessFeeRefundAddress, callValueRefundAddress, gasLimit, maxFeePerGas, + msg.value, data ); + } - // arbos will discard retryable with gas limit too large - if (gasLimit > type(uint64).max) { - revert GasLimitTooLarge(); - } - - uint256 submissionFee = calculateRetryableSubmissionFee(data.length, block.basefee); - if (maxSubmissionCost < submissionFee) - revert InsufficientSubmissionCost(submissionFee, maxSubmissionCost); - - return - _deliverMessage( - L1MessageType_submitRetryableTx, - msg.sender, - abi.encodePacked( - uint256(uint160(to)), - l2CallValue, - msg.value, - maxSubmissionCost, - uint256(uint160(excessFeeRefundAddress)), - uint256(uint160(callValueRefundAddress)), - gasLimit, - maxFeePerGas, - data.length, - data - ) - ); + /// @inheritdoc IInbox + function calculateRetryableSubmissionFee(uint256 dataLength, uint256 baseFee) + public + view + override(AbsInbox, IInbox) + returns (uint256) + { + // Use current block basefee if baseFee parameter is 0 + return (1400 + 6 * dataLength) * (baseFee == 0 ? block.basefee : baseFee); } /// @notice This is an one-time-exception to resolve a misconfiguration of Uniswap Arbitrum deployment @@ -601,32 +403,22 @@ contract Inbox is DelegateCallAware, PausableUpgradeable, IInbox { maxFeePerGas, data.length, data - ) + ), + msg.value ); } - function _deliverMessage( - uint8 _kind, - address _sender, - bytes memory _messageData - ) internal returns (uint256) { - if (_messageData.length > MAX_DATA_SIZE) - revert DataTooLarge(_messageData.length, MAX_DATA_SIZE); - uint256 msgNum = deliverToBridge(_kind, _sender, keccak256(_messageData)); - emit InboxMessageDelivered(msgNum, _messageData); - return msgNum; - } - - function deliverToBridge( + function _deliverToBridge( uint8 kind, address sender, - bytes32 messageDataHash - ) internal returns (uint256) { + bytes32 messageDataHash, + uint256 amount + ) internal override returns (uint256) { return - bridge.enqueueDelayedMessage{value: msg.value}( + IEthBridge(address(bridge)).enqueueDelayedMessage{value: amount}( kind, AddressAliasHelper.applyL1ToL2Alias(sender), messageDataHash ); } -} +} \ No newline at end of file diff --git a/src/bridge/Outbox.sol b/src/bridge/Outbox.sol index b0b4bbe0..31f50eb7 100644 --- a/src/bridge/Outbox.sol +++ b/src/bridge/Outbox.sol @@ -4,273 +4,16 @@ pragma solidity ^0.8.4; -import { - AlreadyInit, - NotRollup, - ProofTooLong, - PathNotMinimal, - UnknownRoot, - AlreadySpent, - BridgeCallFailed, - HadZeroInit -} from "../libraries/Error.sol"; -import "./IBridge.sol"; -import "./IOutbox.sol"; -import "../libraries/MerkleLib.sol"; -import "../libraries/DelegateCallAware.sol"; +import "./AbsOutbox.sol"; -/// @dev this error is thrown since certain functions are only expected to be used in simulations, not in actual txs -error SimulationOnlyEntrypoint(); - -contract Outbox is DelegateCallAware, IOutbox { - address public rollup; // the rollup contract - IBridge public bridge; // the bridge contract - - mapping(uint256 => bytes32) public spent; // packed spent bitmap - mapping(bytes32 => bytes32) public roots; // maps root hashes => L2 block hash - - struct L2ToL1Context { - uint128 l2Block; - uint128 l1Block; - uint128 timestamp; - bytes32 outputId; - address sender; - } - // Note, these variables are set and then wiped during a single transaction. - // Therefore their values don't need to be maintained, and their slots will - // be empty outside of transactions - L2ToL1Context internal context; - - // default context values to be used in storage instead of zero, to save on storage refunds - // it is assumed that arb-os never assigns these values to a valid leaf to be redeemed - uint128 private constant L2BLOCK_DEFAULT_CONTEXT = type(uint128).max; - uint128 private constant L1BLOCK_DEFAULT_CONTEXT = type(uint128).max; - uint128 private constant TIMESTAMP_DEFAULT_CONTEXT = type(uint128).max; - bytes32 private constant OUTPUTID_DEFAULT_CONTEXT = bytes32(type(uint256).max); - address private constant SENDER_DEFAULT_CONTEXT = address(type(uint160).max); - - uint128 public constant OUTBOX_VERSION = 2; - - function initialize(IBridge _bridge) external onlyDelegated { - if (address(_bridge) == address(0)) revert HadZeroInit(); - if (address(bridge) != address(0)) revert AlreadyInit(); - // address zero is returned if no context is set, but the values used in storage - // are non-zero to save users some gas (as storage refunds are usually maxed out) - // EIP-1153 would help here - context = L2ToL1Context({ - l2Block: L2BLOCK_DEFAULT_CONTEXT, - l1Block: L1BLOCK_DEFAULT_CONTEXT, - timestamp: TIMESTAMP_DEFAULT_CONTEXT, - outputId: OUTPUTID_DEFAULT_CONTEXT, - sender: SENDER_DEFAULT_CONTEXT - }); - bridge = _bridge; - rollup = address(_bridge.rollup()); - } - - function updateSendRoot(bytes32 root, bytes32 l2BlockHash) external { - if (msg.sender != rollup) revert NotRollup(msg.sender, rollup); - roots[root] = l2BlockHash; - emit SendRootUpdated(root, l2BlockHash); - } - - /// @inheritdoc IOutbox - function l2ToL1Sender() external view returns (address) { - address sender = context.sender; - // we don't return the default context value to avoid a breaking change in the API - if (sender == SENDER_DEFAULT_CONTEXT) return address(0); - return sender; - } - - /// @inheritdoc IOutbox - function l2ToL1Block() external view returns (uint256) { - uint128 l2Block = context.l2Block; - // we don't return the default context value to avoid a breaking change in the API - if (l2Block == L1BLOCK_DEFAULT_CONTEXT) return uint256(0); - return uint256(l2Block); - } - - /// @inheritdoc IOutbox - function l2ToL1EthBlock() external view returns (uint256) { - uint128 l1Block = context.l1Block; - // we don't return the default context value to avoid a breaking change in the API - if (l1Block == L1BLOCK_DEFAULT_CONTEXT) return uint256(0); - return uint256(l1Block); - } - - /// @inheritdoc IOutbox - function l2ToL1Timestamp() external view returns (uint256) { - uint128 timestamp = context.timestamp; - // we don't return the default context value to avoid a breaking change in the API - if (timestamp == TIMESTAMP_DEFAULT_CONTEXT) return uint256(0); - return uint256(timestamp); - } - - /// @notice batch number is deprecated and now always returns 0 - function l2ToL1BatchNum() external pure returns (uint256) { +contract Outbox is AbsOutbox { + /// @inheritdoc AbsOutbox + function _defaultContextAmount() internal pure override returns (uint256) { return 0; } - /// @inheritdoc IOutbox - function l2ToL1OutputId() external view returns (bytes32) { - bytes32 outputId = context.outputId; - // we don't return the default context value to avoid a breaking change in the API - if (outputId == OUTPUTID_DEFAULT_CONTEXT) return bytes32(0); - return outputId; - } - - /// @inheritdoc IOutbox - function executeTransaction( - bytes32[] calldata proof, - uint256 index, - address l2Sender, - address to, - uint256 l2Block, - uint256 l1Block, - uint256 l2Timestamp, - uint256 value, - bytes calldata data - ) external { - bytes32 userTx = calculateItemHash( - l2Sender, - to, - l2Block, - l1Block, - l2Timestamp, - value, - data - ); - - recordOutputAsSpent(proof, index, userTx); - - executeTransactionImpl(index, l2Sender, to, l2Block, l1Block, l2Timestamp, value, data); - } - - /// @inheritdoc IOutbox - function executeTransactionSimulation( - uint256 index, - address l2Sender, - address to, - uint256 l2Block, - uint256 l1Block, - uint256 l2Timestamp, - uint256 value, - bytes calldata data - ) external { - if (msg.sender != address(0)) revert SimulationOnlyEntrypoint(); - executeTransactionImpl(index, l2Sender, to, l2Block, l1Block, l2Timestamp, value, data); - } - - function executeTransactionImpl( - uint256 outputId, - address l2Sender, - address to, - uint256 l2Block, - uint256 l1Block, - uint256 l2Timestamp, - uint256 value, - bytes calldata data - ) internal { - emit OutBoxTransactionExecuted(to, l2Sender, 0, outputId); - - // we temporarily store the previous values so the outbox can naturally - // unwind itself when there are nested calls to `executeTransaction` - L2ToL1Context memory prevContext = context; - - context = L2ToL1Context({ - sender: l2Sender, - l2Block: uint128(l2Block), - l1Block: uint128(l1Block), - timestamp: uint128(l2Timestamp), - outputId: bytes32(outputId) - }); - - // set and reset vars around execution so they remain valid during call - executeBridgeCall(to, value, data); - - context = prevContext; - } - - function _calcSpentIndexOffset(uint256 index) - internal - view - returns ( - uint256, - uint256, - bytes32 - ) - { - uint256 spentIndex = index / 255; // Note: Reserves the MSB. - uint256 bitOffset = index % 255; - bytes32 replay = spent[spentIndex]; - return (spentIndex, bitOffset, replay); - } - - function _isSpent(uint256 bitOffset, bytes32 replay) internal pure returns (bool) { - return ((replay >> bitOffset) & bytes32(uint256(1))) != bytes32(0); - } - - /// @inheritdoc IOutbox - function isSpent(uint256 index) external view returns (bool) { - (, uint256 bitOffset, bytes32 replay) = _calcSpentIndexOffset(index); - return _isSpent(bitOffset, replay); - } - - function recordOutputAsSpent( - bytes32[] memory proof, - uint256 index, - bytes32 item - ) internal { - if (proof.length >= 256) revert ProofTooLong(proof.length); - if (index >= 2**proof.length) revert PathNotMinimal(index, 2**proof.length); - - // Hash the leaf an extra time to prove it's a leaf - bytes32 calcRoot = calculateMerkleRoot(proof, index, item); - if (roots[calcRoot] == bytes32(0)) revert UnknownRoot(calcRoot); - - (uint256 spentIndex, uint256 bitOffset, bytes32 replay) = _calcSpentIndexOffset(index); - - if (_isSpent(bitOffset, replay)) revert AlreadySpent(index); - spent[spentIndex] = (replay | bytes32(1 << bitOffset)); - } - - function executeBridgeCall( - address to, - uint256 value, - bytes memory data - ) internal { - (bool success, bytes memory returndata) = bridge.executeCall(to, value, data); - if (!success) { - if (returndata.length > 0) { - // solhint-disable-next-line no-inline-assembly - assembly { - let returndata_size := mload(returndata) - revert(add(32, returndata), returndata_size) - } - } else { - revert BridgeCallFailed(); - } - } - } - - function calculateItemHash( - address l2Sender, - address to, - uint256 l2Block, - uint256 l1Block, - uint256 l2Timestamp, - uint256 value, - bytes calldata data - ) public pure returns (bytes32) { - return - keccak256(abi.encodePacked(l2Sender, to, l2Block, l1Block, l2Timestamp, value, data)); - } - - function calculateMerkleRoot( - bytes32[] memory proof, - uint256 path, - bytes32 item - ) public pure returns (bytes32) { - return MerkleLib.calculateRoot(proof, path, keccak256(abi.encodePacked(item))); + /// @inheritdoc AbsOutbox + function _amountToSetInContext(uint256) internal pure override returns (uint256) { + return 0; } -} +} \ No newline at end of file diff --git a/src/libraries/Error.sol b/src/libraries/Error.sol index 7aeef802..2d7294e7 100644 --- a/src/libraries/Error.sol +++ b/src/libraries/Error.sol @@ -61,6 +61,14 @@ error NotOutbox(address sender); /// @param outbox address of outbox being set error InvalidOutboxSet(address outbox); +/// @dev The provided token address isn't valid +/// @param token address of token being set +error InvalidTokenSet(address token); + +/// @dev Call to this specific address is not allowed +/// @param target address of the call receiver +error CallTargetNotAllowed(address target); + // Inbox Errors /// @dev The contract is paused, so cannot be paused @@ -160,4 +168,4 @@ error DataNotAuthenticated(); error AlreadyValidDASKeyset(bytes32); /// @dev Tried to use or invalidate an already invalid Data Availability Service keyset -error NoSuchKeyset(bytes32); +error NoSuchKeyset(bytes32); \ No newline at end of file diff --git a/src/mocks/BridgeStub.sol b/src/mocks/BridgeStub.sol index 08dca5c4..39ed0900 100644 --- a/src/mocks/BridgeStub.sol +++ b/src/mocks/BridgeStub.sol @@ -8,8 +8,9 @@ import "./InboxStub.sol"; import {BadSequencerMessageNumber} from "../libraries/Error.sol"; import "../bridge/IBridge.sol"; +import "../bridge/IEthBridge.sol"; -contract BridgeStub is IBridge { +contract BridgeStub is IBridge, IEthBridge { struct InOutInfo { uint256 index; bool allowed; @@ -179,4 +180,4 @@ contract BridgeStub is IBridge { function initialize(IOwnable) external pure { revert("NOT_IMPLEMENTED"); } -} +} \ No newline at end of file diff --git a/src/mocks/InboxStub.sol b/src/mocks/InboxStub.sol index 3b183883..51767d29 100644 --- a/src/mocks/InboxStub.sol +++ b/src/mocks/InboxStub.sol @@ -5,7 +5,9 @@ pragma solidity ^0.8.0; import "../bridge/IInbox.sol"; +import "../bridge/IEthInbox.sol"; import "../bridge/IBridge.sol"; +import "../bridge/IEthBridge.sol"; import "../bridge/Messages.sol"; import "./BridgeStub.sol"; @@ -17,7 +19,7 @@ import { L2MessageType_unsignedContractTx } from "../libraries/MessageTypes.sol"; -contract InboxStub is IInbox { +contract InboxStub is IInbox, IEthInbox { IBridge public override bridge; ISequencerInbox public override sequencerInbox; @@ -65,7 +67,12 @@ contract InboxStub is IInbox { address sender, bytes32 messageDataHash ) internal returns (uint256) { - return bridge.enqueueDelayedMessage{value: msg.value}(kind, sender, messageDataHash); + return + IEthBridge(address(bridge)).enqueueDelayedMessage{value: msg.value}( + kind, + sender, + messageDataHash + ); } function sendUnsignedTransaction( @@ -151,7 +158,7 @@ contract InboxStub is IInbox { address, uint256, bytes calldata - ) external pure returns (uint256) { + ) external returns (uint256) { revert("NOT_IMPLEMENTED"); } @@ -161,7 +168,7 @@ contract InboxStub is IInbox { uint256, uint256, address - ) external pure returns (uint256) { + ) external returns (uint256) { revert("NOT_IMPLEMENTED"); } @@ -179,4 +186,20 @@ contract InboxStub is IInbox { { revert("NOT_IMPLEMENTED"); } -} + + function setAllowList(address[] memory, bool[] memory) external pure { + revert("NOT_IMPLEMENTED"); + } + + function setAllowListEnabled(bool) external pure { + revert("NOT_IMPLEMENTED"); + } + + function isAllowed(address) external pure returns (bool) { + revert("NOT_IMPLEMENTED"); + } + + function allowListEnabled() external pure returns (bool) { + revert("NOT_IMPLEMENTED"); + } +} \ No newline at end of file diff --git a/src/mocks/SequencerInboxStub.sol b/src/mocks/SequencerInboxStub.sol index 20d5e9f0..85a2c2ab 100644 --- a/src/mocks/SequencerInboxStub.sol +++ b/src/mocks/SequencerInboxStub.sol @@ -5,6 +5,7 @@ pragma solidity ^0.8.0; import "../bridge/SequencerInbox.sol"; +import "../bridge/IEthBridge.sol"; import {INITIALIZATION_MSG_TYPE} from "../libraries/MessageTypes.sol"; contract SequencerInboxStub is SequencerInbox { @@ -21,7 +22,7 @@ contract SequencerInboxStub is SequencerInbox { function addInitMessage(uint256 chainId) external { bytes memory initMsg = abi.encodePacked(chainId); - uint256 num = bridge.enqueueDelayedMessage( + uint256 num = IEthBridge(address(bridge)).enqueueDelayedMessage( INITIALIZATION_MSG_TYPE, address(0), keccak256(initMsg) @@ -51,4 +52,4 @@ contract SequencerInboxStub is SequencerInbox { this; // silence warning about function not being view return bounds; } -} +} \ No newline at end of file diff --git a/src/rollup/AbsBridgeCreator.sol b/src/rollup/AbsBridgeCreator.sol new file mode 100644 index 00000000..0eaf16d6 --- /dev/null +++ b/src/rollup/AbsBridgeCreator.sol @@ -0,0 +1,117 @@ +// Copyright 2021-2022, Offchain Labs, Inc. +// For license information, see https://github.com/nitro/blob/master/LICENSE +// SPDX-License-Identifier: BUSL-1.1 + +pragma solidity ^0.8.0; + +import "../bridge/IBridge.sol"; +import "../bridge/SequencerInbox.sol"; +import "../bridge/IInbox.sol"; +import "../bridge/Outbox.sol"; +import "../rollup/IBridgeCreator.sol"; +import "./IRollupEventInbox.sol"; +import "@openzeppelin/contracts/access/Ownable.sol"; +import "@openzeppelin/contracts/proxy/transparent/ProxyAdmin.sol"; + +abstract contract AbsBridgeCreator is Ownable, IBridgeCreator { + IBridge public bridgeTemplate; + SequencerInbox public sequencerInboxTemplate; + IInbox public inboxTemplate; + IRollupEventInbox public rollupEventInboxTemplate; + Outbox public outboxTemplate; + + event TemplatesUpdated(); + + constructor() Ownable() { + sequencerInboxTemplate = new SequencerInbox(); + outboxTemplate = new Outbox(); + } + + function updateTemplates( + address _bridgeTemplate, + address _sequencerInboxTemplate, + address _inboxTemplate, + address _rollupEventInboxTemplate, + address _outboxTemplate + ) external onlyOwner { + bridgeTemplate = IBridge(_bridgeTemplate); + sequencerInboxTemplate = SequencerInbox(_sequencerInboxTemplate); + inboxTemplate = IInbox(_inboxTemplate); + rollupEventInboxTemplate = IRollupEventInbox(_rollupEventInboxTemplate); + outboxTemplate = Outbox(_outboxTemplate); + + emit TemplatesUpdated(); + } + + struct CreateBridgeFrame { + ProxyAdmin admin; + IBridge bridge; + SequencerInbox sequencerInbox; + IInbox inbox; + IRollupEventInbox rollupEventInbox; + Outbox outbox; + } + + function _createBridge( + address adminProxy, + address rollup, + address nativeToken, + ISequencerInbox.MaxTimeVariation memory maxTimeVariation + ) + internal + returns ( + IBridge, + SequencerInbox, + IInbox, + IRollupEventInbox, + Outbox + ) + { + CreateBridgeFrame memory frame; + { + frame.bridge = IBridge( + address(new TransparentUpgradeableProxy(address(bridgeTemplate), adminProxy, "")) + ); + frame.sequencerInbox = SequencerInbox( + address( + new TransparentUpgradeableProxy(address(sequencerInboxTemplate), adminProxy, "") + ) + ); + frame.inbox = IInbox( + address(new TransparentUpgradeableProxy(address(inboxTemplate), adminProxy, "")) + ); + frame.rollupEventInbox = IRollupEventInbox( + address( + new TransparentUpgradeableProxy( + address(rollupEventInboxTemplate), + adminProxy, + "" + ) + ) + ); + frame.outbox = Outbox( + address(new TransparentUpgradeableProxy(address(outboxTemplate), adminProxy, "")) + ); + } + + _initializeBridge(frame.bridge, IOwnable(rollup), nativeToken); + frame.sequencerInbox.initialize(IBridge(frame.bridge), maxTimeVariation); + frame.inbox.initialize(IBridge(frame.bridge), ISequencerInbox(frame.sequencerInbox)); + frame.rollupEventInbox.initialize(IBridge(frame.bridge)); + frame.outbox.initialize(IBridge(frame.bridge)); + + return ( + frame.bridge, + frame.sequencerInbox, + frame.inbox, + frame.rollupEventInbox, + frame.outbox + ); + } + + function _initializeBridge( + IBridge bridge, + IOwnable rollup, + address + ) internal virtual; +} \ No newline at end of file diff --git a/src/rollup/AbsRollupCreator.sol b/src/rollup/AbsRollupCreator.sol new file mode 100644 index 00000000..5e7f191f --- /dev/null +++ b/src/rollup/AbsRollupCreator.sol @@ -0,0 +1,150 @@ +// Copyright 2021-2022, Offchain Labs, Inc. +// For license information, see https://github.com/nitro/blob/master/LICENSE +// SPDX-License-Identifier: BUSL-1.1 + +pragma solidity ^0.8.0; + +import "./IBridgeCreator.sol"; +import "./IRollupCreator.sol"; +import "./RollupProxy.sol"; +import "@openzeppelin/contracts/proxy/transparent/ProxyAdmin.sol"; +import "@openzeppelin/contracts/proxy/transparent/TransparentUpgradeableProxy.sol"; +import "@openzeppelin/contracts/access/Ownable.sol"; + +abstract contract AbsRollupCreator is Ownable, IRollupCreator { + event RollupCreated( + address indexed rollupAddress, + address inboxAddress, + address adminProxy, + address sequencerInbox, + address bridge + ); + event TemplatesUpdated(); + + IBridgeCreator public bridgeCreator; + IOneStepProofEntry public osp; + IChallengeManager public challengeManagerTemplate; + IRollupAdmin public rollupAdminLogic; + IRollupUser public rollupUserLogic; + + address public validatorUtils; + address public validatorWalletCreator; + + constructor() Ownable() {} + + function setTemplates( + IBridgeCreator _bridgeCreator, + IOneStepProofEntry _osp, + IChallengeManager _challengeManagerLogic, + IRollupAdmin _rollupAdminLogic, + IRollupUser _rollupUserLogic, + address _validatorUtils, + address _validatorWalletCreator + ) external onlyOwner { + bridgeCreator = _bridgeCreator; + osp = _osp; + challengeManagerTemplate = _challengeManagerLogic; + rollupAdminLogic = _rollupAdminLogic; + rollupUserLogic = _rollupUserLogic; + validatorUtils = _validatorUtils; + validatorWalletCreator = _validatorWalletCreator; + emit TemplatesUpdated(); + } + + struct CreateRollupFrame { + ProxyAdmin admin; + IBridge bridge; + ISequencerInbox sequencerInbox; + IInbox inbox; + IRollupEventInbox rollupEventInbox; + IOutbox outbox; + RollupProxy rollup; + } + + // After this setup: + // Rollup should be the owner of bridge + // RollupOwner should be the owner of Rollup's ProxyAdmin + // RollupOwner should be the owner of Rollup + // Bridge should have a single inbox and outbox + function _createRollup( + Config memory config, + address expectedRollupAddr, + address nativeToken + ) internal returns (address) { + CreateRollupFrame memory frame; + frame.admin = new ProxyAdmin(); + + ( + frame.bridge, + frame.sequencerInbox, + frame.inbox, + frame.rollupEventInbox, + frame.outbox + ) = _createBridge( + address(frame.admin), + expectedRollupAddr, + config.sequencerInboxMaxTimeVariation, + nativeToken + ); + + frame.admin.transferOwnership(config.owner); + + IChallengeManager challengeManager = IChallengeManager( + address( + new TransparentUpgradeableProxy( + address(challengeManagerTemplate), + address(frame.admin), + "" + ) + ) + ); + challengeManager.initialize( + IChallengeResultReceiver(expectedRollupAddr), + frame.sequencerInbox, + frame.bridge, + osp + ); + + frame.rollup = new RollupProxy( + config, + ContractDependencies({ + bridge: frame.bridge, + sequencerInbox: frame.sequencerInbox, + inbox: frame.inbox, + outbox: frame.outbox, + rollupEventInbox: frame.rollupEventInbox, + challengeManager: challengeManager, + rollupAdminLogic: rollupAdminLogic, + rollupUserLogic: rollupUserLogic, + validatorUtils: validatorUtils, + validatorWalletCreator: validatorWalletCreator + }) + ); + require(address(frame.rollup) == expectedRollupAddr, "WRONG_ROLLUP_ADDR"); + + emit RollupCreated( + address(frame.rollup), + address(frame.inbox), + address(frame.admin), + address(frame.sequencerInbox), + address(frame.bridge) + ); + return address(frame.rollup); + } + + function _createBridge( + address adminProxy, + address rollup, + ISequencerInbox.MaxTimeVariation memory maxTimeVariation, + address nativeToken + ) + internal + virtual + returns ( + IBridge, + SequencerInbox, + IInbox, + IRollupEventInbox, + Outbox + ); +} \ No newline at end of file diff --git a/src/rollup/AbsRollupEventInbox.sol b/src/rollup/AbsRollupEventInbox.sol new file mode 100644 index 00000000..b01eadce --- /dev/null +++ b/src/rollup/AbsRollupEventInbox.sol @@ -0,0 +1,45 @@ +// Copyright 2021-2022, Offchain Labs, Inc. +// For license information, see https://github.com/nitro/blob/master/LICENSE +// SPDX-License-Identifier: BUSL-1.1 + +pragma solidity ^0.8.0; + +import "./IRollupEventInbox.sol"; +import "../bridge/IBridge.sol"; +import "../bridge/IEthBridge.sol"; +import "../bridge/IDelayedMessageProvider.sol"; +import "../libraries/DelegateCallAware.sol"; +import {INITIALIZATION_MSG_TYPE} from "../libraries/MessageTypes.sol"; +import {AlreadyInit, HadZeroInit} from "../libraries/Error.sol"; + +/** + * @title The inbox for rollup protocol events + */ +abstract contract AbsRollupEventInbox is + IRollupEventInbox, + IDelayedMessageProvider, + DelegateCallAware +{ + IBridge public override bridge; + address public override rollup; + + modifier onlyRollup() { + require(msg.sender == rollup, "ONLY_ROLLUP"); + _; + } + + function initialize(IBridge _bridge) external override onlyDelegated { + if (address(bridge) != address(0)) revert AlreadyInit(); + if (address(_bridge) == address(0)) revert HadZeroInit(); + bridge = _bridge; + rollup = address(_bridge.rollup()); + } + + function rollupInitialized(uint256 chainId) external override onlyRollup { + bytes memory initMsg = abi.encodePacked(chainId); + uint256 num = _enqueueInitializationMsg(initMsg); + emit InboxMessageDelivered(num, initMsg); + } + + function _enqueueInitializationMsg(bytes memory initMsg) internal virtual returns (uint256); +} \ No newline at end of file diff --git a/src/rollup/BridgeCreator.sol b/src/rollup/BridgeCreator.sol index 4c2c7ba7..e773e43c 100644 --- a/src/rollup/BridgeCreator.sol +++ b/src/rollup/BridgeCreator.sol @@ -5,56 +5,16 @@ pragma solidity ^0.8.0; import "../bridge/Bridge.sol"; -import "../bridge/SequencerInbox.sol"; -import "../bridge/ISequencerInbox.sol"; +import "../bridge/IEthBridge.sol"; import "../bridge/Inbox.sol"; -import "../bridge/Outbox.sol"; -import "./RollupEventInbox.sol"; +import "../rollup/AbsBridgeCreator.sol"; +import "../rollup/RollupEventInbox.sol"; -import "../bridge/IBridge.sol"; -import "@openzeppelin/contracts/access/Ownable.sol"; -import "@openzeppelin/contracts/proxy/transparent/ProxyAdmin.sol"; - -contract BridgeCreator is Ownable { - Bridge public bridgeTemplate; - SequencerInbox public sequencerInboxTemplate; - Inbox public inboxTemplate; - RollupEventInbox public rollupEventInboxTemplate; - Outbox public outboxTemplate; - - event TemplatesUpdated(); - - constructor() Ownable() { +contract BridgeCreator is AbsBridgeCreator, IEthBridgeCreator { + constructor() AbsBridgeCreator() { bridgeTemplate = new Bridge(); - sequencerInboxTemplate = new SequencerInbox(); inboxTemplate = new Inbox(); rollupEventInboxTemplate = new RollupEventInbox(); - outboxTemplate = new Outbox(); - } - - function updateTemplates( - address _bridgeTemplate, - address _sequencerInboxTemplate, - address _inboxTemplate, - address _rollupEventInboxTemplate, - address _outboxTemplate - ) external onlyOwner { - bridgeTemplate = Bridge(_bridgeTemplate); - sequencerInboxTemplate = SequencerInbox(_sequencerInboxTemplate); - inboxTemplate = Inbox(_inboxTemplate); - rollupEventInboxTemplate = RollupEventInbox(_rollupEventInboxTemplate); - outboxTemplate = Outbox(_outboxTemplate); - - emit TemplatesUpdated(); - } - - struct CreateBridgeFrame { - ProxyAdmin admin; - Bridge bridge; - SequencerInbox sequencerInbox; - Inbox inbox; - RollupEventInbox rollupEventInbox; - Outbox outbox; } function createBridge( @@ -64,52 +24,21 @@ contract BridgeCreator is Ownable { ) external returns ( - Bridge, + IBridge, SequencerInbox, - Inbox, - RollupEventInbox, + IInbox, + IRollupEventInbox, Outbox ) { - CreateBridgeFrame memory frame; - { - frame.bridge = Bridge( - address(new TransparentUpgradeableProxy(address(bridgeTemplate), adminProxy, "")) - ); - frame.sequencerInbox = SequencerInbox( - address( - new TransparentUpgradeableProxy(address(sequencerInboxTemplate), adminProxy, "") - ) - ); - frame.inbox = Inbox( - address(new TransparentUpgradeableProxy(address(inboxTemplate), adminProxy, "")) - ); - frame.rollupEventInbox = RollupEventInbox( - address( - new TransparentUpgradeableProxy( - address(rollupEventInboxTemplate), - adminProxy, - "" - ) - ) - ); - frame.outbox = Outbox( - address(new TransparentUpgradeableProxy(address(outboxTemplate), adminProxy, "")) - ); - } - - frame.bridge.initialize(IOwnable(rollup)); - frame.sequencerInbox.initialize(IBridge(frame.bridge), maxTimeVariation); - frame.inbox.initialize(IBridge(frame.bridge), ISequencerInbox(frame.sequencerInbox)); - frame.rollupEventInbox.initialize(IBridge(frame.bridge)); - frame.outbox.initialize(IBridge(frame.bridge)); + return _createBridge(adminProxy, rollup, address(0), maxTimeVariation); + } - return ( - frame.bridge, - frame.sequencerInbox, - frame.inbox, - frame.rollupEventInbox, - frame.outbox - ); + function _initializeBridge( + IBridge bridge, + IOwnable rollup, + address + ) internal override { + IEthBridge(address(bridge)).initialize(IOwnable(rollup)); } -} +} \ No newline at end of file diff --git a/src/rollup/ERC20BridgeCreator.sol b/src/rollup/ERC20BridgeCreator.sol new file mode 100644 index 00000000..9f451ce4 --- /dev/null +++ b/src/rollup/ERC20BridgeCreator.sol @@ -0,0 +1,48 @@ +// Copyright 2021-2022, Offchain Labs, Inc. +// For license information, see https://github.com/nitro/blob/master/LICENSE +// SPDX-License-Identifier: BUSL-1.1 + +pragma solidity ^0.8.0; + +import "../rollup/AbsBridgeCreator.sol"; +import "../bridge/ERC20Bridge.sol"; +import "../bridge/IERC20Bridge.sol"; +import "../bridge/ERC20Inbox.sol"; +import "../rollup/IBridgeCreator.sol"; +import "../rollup/ERC20RollupEventInbox.sol"; + +import "@openzeppelin/contracts/token/ERC20/presets/ERC20PresetFixedSupply.sol"; + +contract ERC20BridgeCreator is AbsBridgeCreator, IERC20BridgeCreator { + constructor() AbsBridgeCreator() { + bridgeTemplate = new ERC20Bridge(); + inboxTemplate = new ERC20Inbox(); + rollupEventInboxTemplate = new ERC20RollupEventInbox(); + } + + function createBridge( + address adminProxy, + address rollup, + address nativeToken, + ISequencerInbox.MaxTimeVariation memory maxTimeVariation + ) + external + returns ( + IBridge, + SequencerInbox, + IInbox, + IRollupEventInbox, + Outbox + ) + { + return _createBridge(adminProxy, rollup, nativeToken, maxTimeVariation); + } + + function _initializeBridge( + IBridge bridge, + IOwnable rollup, + address nativeToken + ) internal override { + IERC20Bridge(address(bridge)).initialize(IOwnable(rollup), nativeToken); + } +} \ No newline at end of file diff --git a/src/rollup/ERC20RollupCreator.sol b/src/rollup/ERC20RollupCreator.sol new file mode 100644 index 00000000..75eda491 --- /dev/null +++ b/src/rollup/ERC20RollupCreator.sol @@ -0,0 +1,50 @@ +// Copyright 2021-2022, Offchain Labs, Inc. +// For license information, see https://github.com/nitro/blob/master/LICENSE +// SPDX-License-Identifier: BUSL-1.1 + +pragma solidity ^0.8.0; + +import "./AbsRollupCreator.sol"; +import "./ERC20BridgeCreator.sol"; + +contract ERC20RollupCreator is AbsRollupCreator, IERC20RollupCreator { + constructor() AbsRollupCreator() {} + + // After this setup: + // Rollup should be the owner of bridge + // RollupOwner should be the owner of Rollup's ProxyAdmin + // RollupOwner should be the owner of Rollup + // Bridge should have a single inbox and outbox + function createRollup( + Config memory config, + address expectedRollupAddr, + address nativeToken + ) external override returns (address) { + return _createRollup(config, expectedRollupAddr, nativeToken); + } + + function _createBridge( + address adminProxy, + address rollup, + ISequencerInbox.MaxTimeVariation memory maxTimeVariation, + address nativeToken + ) + internal + override + returns ( + IBridge, + SequencerInbox, + IInbox, + IRollupEventInbox, + Outbox + ) + { + return + ERC20BridgeCreator(address(bridgeCreator)).createBridge( + adminProxy, + rollup, + nativeToken, + maxTimeVariation + ); + } +} \ No newline at end of file diff --git a/src/rollup/ERC20RollupEventInbox.sol b/src/rollup/ERC20RollupEventInbox.sol new file mode 100644 index 00000000..c9f4e28f --- /dev/null +++ b/src/rollup/ERC20RollupEventInbox.sol @@ -0,0 +1,26 @@ +// Copyright 2021-2022, Offchain Labs, Inc. +// For license information, see https://github.com/nitro/blob/master/LICENSE +// SPDX-License-Identifier: BUSL-1.1 + +pragma solidity ^0.8.0; + +import "./AbsRollupEventInbox.sol"; +import "../bridge/IERC20Bridge.sol"; + +/** + * @title The inbox for rollup protocol events + */ +contract ERC20RollupEventInbox is AbsRollupEventInbox { + constructor() AbsRollupEventInbox() {} + + function _enqueueInitializationMsg(bytes memory initMsg) internal override returns (uint256) { + uint256 tokenAmount = 0; + return + IERC20Bridge(address(bridge)).enqueueDelayedMessage( + INITIALIZATION_MSG_TYPE, + address(0), + keccak256(initMsg), + tokenAmount + ); + } +} \ No newline at end of file diff --git a/src/rollup/IBridgeCreator.sol b/src/rollup/IBridgeCreator.sol new file mode 100644 index 00000000..e938f0e2 --- /dev/null +++ b/src/rollup/IBridgeCreator.sol @@ -0,0 +1,64 @@ +// Copyright 2021-2022, Offchain Labs, Inc. +// For license information, see https://github.com/nitro/blob/master/LICENSE +// SPDX-License-Identifier: BUSL-1.1 + +pragma solidity ^0.8.0; + +import "./RollupLib.sol"; +import "./IRollupCore.sol"; +import "../bridge/SequencerInbox.sol"; +import "../bridge/Outbox.sol"; +import "../rollup/RollupEventInbox.sol"; + +interface IBridgeCreator { + function updateTemplates( + address _bridgeTemplate, + address _sequencerInboxTemplate, + address _inboxTemplate, + address _rollupEventInboxTemplate, + address _outboxTemplate + ) external; + + function bridgeTemplate() external view returns (IBridge); + + function sequencerInboxTemplate() external view returns (SequencerInbox); + + function inboxTemplate() external view returns (IInbox); + + function rollupEventInboxTemplate() external view returns (IRollupEventInbox); + + function outboxTemplate() external view returns (Outbox); +} + +interface IEthBridgeCreator is IBridgeCreator { + function createBridge( + address adminProxy, + address rollup, + ISequencerInbox.MaxTimeVariation memory maxTimeVariation + ) + external + returns ( + IBridge, + SequencerInbox, + IInbox, + IRollupEventInbox, + Outbox + ); +} + +interface IERC20BridgeCreator is IBridgeCreator { + function createBridge( + address adminProxy, + address rollup, + address nativeToken, + ISequencerInbox.MaxTimeVariation memory maxTimeVariation + ) + external + returns ( + IBridge, + SequencerInbox, + IInbox, + IRollupEventInbox, + Outbox + ); +} \ No newline at end of file diff --git a/src/rollup/IRollupCreator.sol b/src/rollup/IRollupCreator.sol new file mode 100644 index 00000000..e9b1963b --- /dev/null +++ b/src/rollup/IRollupCreator.sol @@ -0,0 +1,37 @@ +// Copyright 2021-2022, Offchain Labs, Inc. +// For license information, see https://github.com/nitro/blob/master/LICENSE +// SPDX-License-Identifier: BUSL-1.1 + +// solhint-disable-next-line compiler-version +pragma solidity >=0.6.9 <0.9.0; + +import "./IBridgeCreator.sol"; +import "./RollupProxy.sol"; +import "../osp/IOneStepProofEntry.sol"; +import "../challenge/IChallengeManager.sol"; + +interface IRollupCreator { + function setTemplates( + IBridgeCreator _bridgeCreator, + IOneStepProofEntry _osp, + IChallengeManager _challengeManagerLogic, + IRollupAdmin _rollupAdminLogic, + IRollupUser _rollupUserLogic, + address _validatorUtils, + address _validatorWalletCreator + ) external; +} + +interface IEthRollupCreator is IRollupCreator { + function createRollup(Config memory config, address expectedRollupAddr) + external + returns (address); +} + +interface IERC20RollupCreator is IRollupCreator { + function createRollup( + Config memory config, + address expectedRollupAddr, + address nativeToken + ) external returns (address); +} \ No newline at end of file diff --git a/src/rollup/RollupCreator.sol b/src/rollup/RollupCreator.sol index ed086560..02f6f0c4 100644 --- a/src/rollup/RollupCreator.sol +++ b/src/rollup/RollupCreator.sol @@ -4,63 +4,11 @@ pragma solidity ^0.8.0; +import "./AbsRollupCreator.sol"; import "./BridgeCreator.sol"; -import "@openzeppelin/contracts/proxy/transparent/ProxyAdmin.sol"; -import "@openzeppelin/contracts/proxy/transparent/TransparentUpgradeableProxy.sol"; -import "@openzeppelin/contracts/access/Ownable.sol"; - -import "./RollupProxy.sol"; - -contract RollupCreator is Ownable { - event RollupCreated( - address indexed rollupAddress, - address inboxAddress, - address adminProxy, - address sequencerInbox, - address bridge - ); - event TemplatesUpdated(); - - BridgeCreator public bridgeCreator; - IOneStepProofEntry public osp; - IChallengeManager public challengeManagerTemplate; - IRollupAdmin public rollupAdminLogic; - IRollupUser public rollupUserLogic; - - address public validatorUtils; - address public validatorWalletCreator; - - constructor() Ownable() {} - - function setTemplates( - BridgeCreator _bridgeCreator, - IOneStepProofEntry _osp, - IChallengeManager _challengeManagerLogic, - IRollupAdmin _rollupAdminLogic, - IRollupUser _rollupUserLogic, - address _validatorUtils, - address _validatorWalletCreator - ) external onlyOwner { - bridgeCreator = _bridgeCreator; - osp = _osp; - challengeManagerTemplate = _challengeManagerLogic; - rollupAdminLogic = _rollupAdminLogic; - rollupUserLogic = _rollupUserLogic; - validatorUtils = _validatorUtils; - validatorWalletCreator = _validatorWalletCreator; - emit TemplatesUpdated(); - } - - struct CreateRollupFrame { - ProxyAdmin admin; - IBridge bridge; - ISequencerInbox sequencerInbox; - IInbox inbox; - IRollupEventInbox rollupEventInbox; - IOutbox outbox; - RollupProxy rollup; - } +contract RollupCreator is AbsRollupCreator, IEthRollupCreator { + constructor() AbsRollupCreator() {} // After this setup: // Rollup should be the owner of bridge @@ -69,65 +17,33 @@ contract RollupCreator is Ownable { // Bridge should have a single inbox and outbox function createRollup(Config memory config, address expectedRollupAddr) external + override returns (address) { - CreateRollupFrame memory frame; - frame.admin = new ProxyAdmin(); - - ( - frame.bridge, - frame.sequencerInbox, - frame.inbox, - frame.rollupEventInbox, - frame.outbox - ) = bridgeCreator.createBridge( - address(frame.admin), - expectedRollupAddr, - config.sequencerInboxMaxTimeVariation - ); - - frame.admin.transferOwnership(config.owner); - - IChallengeManager challengeManager = IChallengeManager( - address( - new TransparentUpgradeableProxy( - address(challengeManagerTemplate), - address(frame.admin), - "" - ) - ) - ); - challengeManager.initialize( - IChallengeResultReceiver(expectedRollupAddr), - frame.sequencerInbox, - frame.bridge, - osp - ); - - frame.rollup = new RollupProxy( - config, - ContractDependencies({ - bridge: frame.bridge, - sequencerInbox: frame.sequencerInbox, - inbox: frame.inbox, - outbox: frame.outbox, - rollupEventInbox: frame.rollupEventInbox, - challengeManager: challengeManager, - rollupAdminLogic: rollupAdminLogic, - rollupUserLogic: rollupUserLogic, - validatorUtils: validatorUtils, - validatorWalletCreator: validatorWalletCreator - }) - ); - require(address(frame.rollup) == expectedRollupAddr, "WRONG_ROLLUP_ADDR"); + return _createRollup(config, expectedRollupAddr, address(0)); + } - emit RollupCreated( - address(frame.rollup), - address(frame.inbox), - address(frame.admin), - address(frame.sequencerInbox), - address(frame.bridge) - ); - return address(frame.rollup); + function _createBridge( + address adminProxy, + address rollup, + ISequencerInbox.MaxTimeVariation memory maxTimeVariation, + address + ) + internal + override + returns ( + IBridge, + SequencerInbox, + IInbox, + IRollupEventInbox, + Outbox + ) + { + return + BridgeCreator(address(bridgeCreator)).createBridge( + adminProxy, + rollup, + maxTimeVariation + ); } -} +} \ No newline at end of file diff --git a/src/rollup/RollupEventInbox.sol b/src/rollup/RollupEventInbox.sol index e20c6864..e59394df 100644 --- a/src/rollup/RollupEventInbox.sol +++ b/src/rollup/RollupEventInbox.sol @@ -4,39 +4,21 @@ pragma solidity ^0.8.0; -import "./IRollupEventInbox.sol"; -import "../bridge/IBridge.sol"; -import "../bridge/IDelayedMessageProvider.sol"; -import "../libraries/DelegateCallAware.sol"; -import {INITIALIZATION_MSG_TYPE} from "../libraries/MessageTypes.sol"; -import {AlreadyInit, HadZeroInit} from "../libraries/Error.sol"; +import "./AbsRollupEventInbox.sol"; +import "../bridge/IEthBridge.sol"; /** * @title The inbox for rollup protocol events */ -contract RollupEventInbox is IRollupEventInbox, IDelayedMessageProvider, DelegateCallAware { - IBridge public override bridge; - address public override rollup; +contract RollupEventInbox is AbsRollupEventInbox { + constructor() AbsRollupEventInbox() {} - modifier onlyRollup() { - require(msg.sender == rollup, "ONLY_ROLLUP"); - _; + function _enqueueInitializationMsg(bytes memory initMsg) internal override returns (uint256) { + return + IEthBridge(address(bridge)).enqueueDelayedMessage( + INITIALIZATION_MSG_TYPE, + address(0), + keccak256(initMsg) + ); } - - function initialize(IBridge _bridge) external override onlyDelegated { - if (address(bridge) != address(0)) revert AlreadyInit(); - if (address(_bridge) == address(0)) revert HadZeroInit(); - bridge = _bridge; - rollup = address(_bridge.rollup()); - } - - function rollupInitialized(uint256 chainId) external override onlyRollup { - bytes memory initMsg = abi.encodePacked(chainId); - uint256 num = bridge.enqueueDelayedMessage( - INITIALIZATION_MSG_TYPE, - address(0), - keccak256(initMsg) - ); - emit InboxMessageDelivered(num, initMsg); - } -} +} \ No newline at end of file diff --git a/src/test-helpers/BridgeTester.sol b/src/test-helpers/BridgeTester.sol index 51454eb5..e0f742f6 100644 --- a/src/test-helpers/BridgeTester.sol +++ b/src/test-helpers/BridgeTester.sol @@ -16,6 +16,7 @@ import { InvalidOutboxSet } from "../libraries/Error.sol"; import "../bridge/IBridge.sol"; +import "../bridge/IEthBridge.sol"; import "../bridge/Messages.sol"; import "../libraries/DelegateCallAware.sol"; @@ -26,7 +27,7 @@ import "../libraries/DelegateCallAware.sol"; * Since the escrow is held here, this contract also contains a list of allowed * outboxes that can make calls from here and withdraw this escrow. */ -contract BridgeTester is Initializable, DelegateCallAware, IBridge { +contract BridgeTester is Initializable, DelegateCallAware, IBridge, IEthBridge { using AddressUpgradeable for address; struct InOutInfo { @@ -236,4 +237,4 @@ contract BridgeTester is Initializable, DelegateCallAware, IBridge { receive() external payable {} function acceptFundsFromOldBridge() external payable {} -} +} \ No newline at end of file diff --git a/src/test-helpers/EthVault.sol b/src/test-helpers/EthVault.sol new file mode 100644 index 00000000..c620c891 --- /dev/null +++ b/src/test-helpers/EthVault.sol @@ -0,0 +1,20 @@ +// Copyright 2021-2022, Offchain Labs, Inc. +// For license information, see https://github.com/nitro/blob/master/LICENSE +// SPDX-License-Identifier: BUSL-1.1 + +pragma solidity ^0.8.0; + +/** + * Simple contract for testing bridge calls which include calldata + */ +contract EthVault { + uint256 public version = 0; + + function setVersion(uint256 _version) external payable { + version = _version; + } + + function justRevert() external payable { + revert("bye"); + } +} \ No newline at end of file From cd5066137970d1002bf6045952d15ad1a4d94d52 Mon Sep 17 00:00:00 2001 From: Goran Vladika Date: Mon, 29 May 2023 14:42:03 +0200 Subject: [PATCH 002/292] chore: forge init --- .gitignore | 3 +++ foundry.toml | 13 +++++++++++++ script/Counter.s.sol | 12 ++++++++++++ src/Counter.sol | 14 ++++++++++++++ test/Counter.t.sol | 24 ++++++++++++++++++++++++ 5 files changed, 66 insertions(+) create mode 100644 foundry.toml create mode 100644 script/Counter.s.sol create mode 100644 src/Counter.sol create mode 100644 test/Counter.t.sol diff --git a/.gitignore b/.gitignore index 1cd604bb..fcb4cac2 100644 --- a/.gitignore +++ b/.gitignore @@ -5,3 +5,6 @@ deployments/ /test/prover/proofs/*.json /test/prover/spec-proofs/*.json /test/storage/*-old.dot +forge-cache/ +out/ +.env \ No newline at end of file diff --git a/foundry.toml b/foundry.toml new file mode 100644 index 00000000..895bbfc5 --- /dev/null +++ b/foundry.toml @@ -0,0 +1,13 @@ +[profile.default] +src = "src" +out = "out" +libs = ["node_modules"] +remappings = [ + "@ensdomains/=node_modules/@ensdomains/", + "@openzeppelin/=node_modules/@openzeppelin/", + "eth-gas-reporter/=node_modules/eth-gas-reporter/", + "hardhat-deploy/=node_modules/hardhat-deploy/", + "hardhat/=node_modules/hardhat/", +] + +# See more config options https://github.com/foundry-rs/foundry/tree/master/config \ No newline at end of file diff --git a/script/Counter.s.sol b/script/Counter.s.sol new file mode 100644 index 00000000..0e546aba --- /dev/null +++ b/script/Counter.s.sol @@ -0,0 +1,12 @@ +// SPDX-License-Identifier: UNLICENSED +pragma solidity ^0.8.13; + +import "forge-std/Script.sol"; + +contract CounterScript is Script { + function setUp() public {} + + function run() public { + vm.broadcast(); + } +} diff --git a/src/Counter.sol b/src/Counter.sol new file mode 100644 index 00000000..aded7997 --- /dev/null +++ b/src/Counter.sol @@ -0,0 +1,14 @@ +// SPDX-License-Identifier: UNLICENSED +pragma solidity ^0.8.13; + +contract Counter { + uint256 public number; + + function setNumber(uint256 newNumber) public { + number = newNumber; + } + + function increment() public { + number++; + } +} diff --git a/test/Counter.t.sol b/test/Counter.t.sol new file mode 100644 index 00000000..30235e8a --- /dev/null +++ b/test/Counter.t.sol @@ -0,0 +1,24 @@ +// SPDX-License-Identifier: UNLICENSED +pragma solidity ^0.8.13; + +import "forge-std/Test.sol"; +import "../src/Counter.sol"; + +contract CounterTest is Test { + Counter public counter; + + function setUp() public { + counter = new Counter(); + counter.setNumber(0); + } + + function testIncrement() public { + counter.increment(); + assertEq(counter.number(), 1); + } + + function testSetNumber(uint256 x) public { + counter.setNumber(x); + assertEq(counter.number(), x); + } +} From e782d5b902a5b87881f27340039e54570888bace Mon Sep 17 00:00:00 2001 From: Goran Vladika Date: Mon, 29 May 2023 14:42:03 +0200 Subject: [PATCH 003/292] forge install: forge-std v1.5.6 --- .gitmodules | 3 +++ lib/forge-std | 1 + 2 files changed, 4 insertions(+) create mode 100644 .gitmodules create mode 160000 lib/forge-std diff --git a/.gitmodules b/.gitmodules new file mode 100644 index 00000000..888d42dc --- /dev/null +++ b/.gitmodules @@ -0,0 +1,3 @@ +[submodule "lib/forge-std"] + path = lib/forge-std + url = https://github.com/foundry-rs/forge-std diff --git a/lib/forge-std b/lib/forge-std new file mode 160000 index 00000000..e8a047e3 --- /dev/null +++ b/lib/forge-std @@ -0,0 +1 @@ +Subproject commit e8a047e3f40f13fa37af6fe14e6e06283d9a060e From a5525e59bf15769aa0588b5be6f3dc9027f98bd0 Mon Sep 17 00:00:00 2001 From: Goran Vladika Date: Mon, 29 May 2023 14:46:39 +0200 Subject: [PATCH 004/292] Configure Foundry --- foundry.toml | 21 +++++++++++---------- remappings.txt | 4 ++++ script/Counter.s.sol | 12 ------------ src/Counter.sol | 14 -------------- test/Counter.t.sol | 24 ------------------------ 5 files changed, 15 insertions(+), 60 deletions(-) create mode 100644 remappings.txt delete mode 100644 script/Counter.s.sol delete mode 100644 src/Counter.sol delete mode 100644 test/Counter.t.sol diff --git a/foundry.toml b/foundry.toml index 895bbfc5..2512e19b 100644 --- a/foundry.toml +++ b/foundry.toml @@ -1,13 +1,14 @@ [profile.default] -src = "src" -out = "out" -libs = ["node_modules"] -remappings = [ - "@ensdomains/=node_modules/@ensdomains/", - "@openzeppelin/=node_modules/@openzeppelin/", - "eth-gas-reporter/=node_modules/eth-gas-reporter/", - "hardhat-deploy/=node_modules/hardhat-deploy/", - "hardhat/=node_modules/hardhat/", -] +src = 'src' +out = 'out' +libs = ['node_modules', 'lib'] +test = 'test/foundry' +cache_path = 'forge-cache' +optimizer = true +optimizer_runs = 20000 +via_ir = false +[fmt] +number_underscore = 'thousands' +line_length = 100 # See more config options https://github.com/foundry-rs/foundry/tree/master/config \ No newline at end of file diff --git a/remappings.txt b/remappings.txt new file mode 100644 index 00000000..dd3f1ab0 --- /dev/null +++ b/remappings.txt @@ -0,0 +1,4 @@ +ds-test/=lib/forge-std/lib/ds-test/src/ +forge-std/=lib/forge-std/src/ + +@openzeppelin/contracts/=node_modules/@openzeppelin/contracts/ \ No newline at end of file diff --git a/script/Counter.s.sol b/script/Counter.s.sol deleted file mode 100644 index 0e546aba..00000000 --- a/script/Counter.s.sol +++ /dev/null @@ -1,12 +0,0 @@ -// SPDX-License-Identifier: UNLICENSED -pragma solidity ^0.8.13; - -import "forge-std/Script.sol"; - -contract CounterScript is Script { - function setUp() public {} - - function run() public { - vm.broadcast(); - } -} diff --git a/src/Counter.sol b/src/Counter.sol deleted file mode 100644 index aded7997..00000000 --- a/src/Counter.sol +++ /dev/null @@ -1,14 +0,0 @@ -// SPDX-License-Identifier: UNLICENSED -pragma solidity ^0.8.13; - -contract Counter { - uint256 public number; - - function setNumber(uint256 newNumber) public { - number = newNumber; - } - - function increment() public { - number++; - } -} diff --git a/test/Counter.t.sol b/test/Counter.t.sol deleted file mode 100644 index 30235e8a..00000000 --- a/test/Counter.t.sol +++ /dev/null @@ -1,24 +0,0 @@ -// SPDX-License-Identifier: UNLICENSED -pragma solidity ^0.8.13; - -import "forge-std/Test.sol"; -import "../src/Counter.sol"; - -contract CounterTest is Test { - Counter public counter; - - function setUp() public { - counter = new Counter(); - counter.setNumber(0); - } - - function testIncrement() public { - counter.increment(); - assertEq(counter.number(), 1); - } - - function testSetNumber(uint256 x) public { - counter.setNumber(x); - assertEq(counter.number(), x); - } -} From e573cffeedc651ec09a6abc9a8ec07a679ede277 Mon Sep 17 00:00:00 2001 From: Goran Vladika Date: Mon, 29 May 2023 14:52:06 +0200 Subject: [PATCH 005/292] Add Foundry unit test cases covering ERC20-rollup functionality --- test/foundry/AbsBridge.t.sol | 522 ++++++++++++++++++++ test/foundry/AbsInbox.t.sol | 403 ++++++++++++++++ test/foundry/AbsOutbox.t.sol | 28 ++ test/foundry/AbsRollupCreator.t.sol | 167 +++++++ test/foundry/Bridge.t.sol | 317 ++++++++++++ test/foundry/ERC20Bridge.t.sol | 353 ++++++++++++++ test/foundry/ERC20BridgeCreator.t.sol | 113 +++++ test/foundry/ERC20Inbox.t.sol | 661 ++++++++++++++++++++++++++ test/foundry/ERC20Outbox.t.sol | 179 +++++++ test/foundry/ERC20RollupCreator.t.sol | 88 ++++ test/foundry/Inbox.t.sol | 637 +++++++++++++++++++++++++ test/foundry/Outbox.t.sol | 116 +++++ test/foundry/RollupCreator.t.sol | 69 +++ test/foundry/util/TestUtil.sol | 12 + 14 files changed, 3665 insertions(+) create mode 100644 test/foundry/AbsBridge.t.sol create mode 100644 test/foundry/AbsInbox.t.sol create mode 100644 test/foundry/AbsOutbox.t.sol create mode 100644 test/foundry/AbsRollupCreator.t.sol create mode 100644 test/foundry/Bridge.t.sol create mode 100644 test/foundry/ERC20Bridge.t.sol create mode 100644 test/foundry/ERC20BridgeCreator.t.sol create mode 100644 test/foundry/ERC20Inbox.t.sol create mode 100644 test/foundry/ERC20Outbox.t.sol create mode 100644 test/foundry/ERC20RollupCreator.t.sol create mode 100644 test/foundry/Inbox.t.sol create mode 100644 test/foundry/Outbox.t.sol create mode 100644 test/foundry/RollupCreator.t.sol create mode 100644 test/foundry/util/TestUtil.sol diff --git a/test/foundry/AbsBridge.t.sol b/test/foundry/AbsBridge.t.sol new file mode 100644 index 00000000..f78b803c --- /dev/null +++ b/test/foundry/AbsBridge.t.sol @@ -0,0 +1,522 @@ +// SPDX-License-Identifier: UNLICENSED +pragma solidity ^0.8.4; + +import "forge-std/Test.sol"; +import "./util/TestUtil.sol"; +import "../../src/bridge/IBridge.sol"; +import "../../src/bridge/ERC20Bridge.sol"; +import "../../src/bridge/Bridge.sol"; +import "../../src/bridge/ERC20Inbox.sol"; +import "../../src/bridge/IEthBridge.sol"; +import "../../src/libraries/AddressAliasHelper.sol"; +import "../../src/test-helpers/EthVault.sol"; + +abstract contract AbsBridgeTest is Test { + IBridge public bridge; + + address public user = address(100); + address public userB = address(101); + + address public rollup = address(1000); + address public inbox; + address public outbox = address(1002); + address public seqInbox = address(1003); + + /* solhint-disable func-name-mixedcase */ + function test_enqueueSequencerMessage_NoDelayedMsgs() public { + vm.prank(rollup); + bridge.setSequencerInbox(seqInbox); + + // enqueue sequencer msg + vm.prank(seqInbox); + bytes32 dataHash = keccak256("blob"); + uint256 afterDelayedMessagesRead = 0; + uint256 prevMessageCount = 0; + uint256 newMessageCount = 15; + (uint256 seqMessageIndex, bytes32 beforeAcc, bytes32 delayedAcc, bytes32 acc) = bridge + .enqueueSequencerMessage( + dataHash, + afterDelayedMessagesRead, + prevMessageCount, + newMessageCount + ); + + // checks + assertEq( + bridge.sequencerReportedSubMessageCount(), + newMessageCount, + "Invalid newMessageCount" + ); + bytes32 seqInboxEntry = keccak256(abi.encodePacked(bytes32(0), dataHash, bytes32(0))); + assertEq(bridge.sequencerInboxAccs(0), seqInboxEntry, "Invalid sequencerInboxAccs entry"); + assertEq(bridge.sequencerMessageCount(), 1, "Invalid sequencerMessageCount"); + assertEq(seqMessageIndex, 0, "Invalid seqMessageIndex"); + assertEq(beforeAcc, 0, "Invalid beforeAcc"); + assertEq(delayedAcc, 0, "Invalid delayedAcc"); + assertEq(acc, seqInboxEntry, "Invalid acc"); + } + + function test_enqueueSequencerMessage_IncludeDelayedMsgs() public { + vm.prank(rollup); + bridge.setSequencerInbox(seqInbox); + + // put some msgs to delayed inbox + vm.startPrank(seqInbox); + bridge.submitBatchSpendingReport(address(1), keccak256("1")); + bridge.submitBatchSpendingReport(address(2), keccak256("2")); + bridge.submitBatchSpendingReport(address(3), keccak256("3")); + vm.stopPrank(); + + // enqueue sequencer msg with 2 delayed msgs + vm.prank(seqInbox); + bytes32 dataHash = keccak256("blob"); + uint256 afterDelayedMessagesRead = 2; + uint256 prevMessageCount = 0; + uint256 newMessageCount = 15; + (uint256 seqMessageIndex, bytes32 beforeAcc, bytes32 delayedAcc, bytes32 acc) = bridge + .enqueueSequencerMessage( + dataHash, + afterDelayedMessagesRead, + prevMessageCount, + newMessageCount + ); + + // checks + assertEq( + bridge.sequencerReportedSubMessageCount(), + newMessageCount, + "Invalid sequencerReportedSubMessageCount" + ); + bytes32 seqInboxEntry = keccak256( + abi.encodePacked(bytes32(0), dataHash, bridge.delayedInboxAccs(1)) + ); + assertEq(bridge.sequencerInboxAccs(0), seqInboxEntry, "Invalid sequencerInboxAccs entry"); + assertEq(bridge.sequencerMessageCount(), 1, "Invalid sequencerMessageCount"); + assertEq(seqMessageIndex, 0, "Invalid seqMessageIndex"); + assertEq(beforeAcc, 0, "Invalid beforeAcc"); + assertEq(delayedAcc, bridge.delayedInboxAccs(1), "Invalid delayedAcc"); + assertEq(acc, seqInboxEntry, "Invalid acc"); + } + + function test_enqueueSequencerMessage_SecondEnqueuedMsg() public { + vm.prank(rollup); + bridge.setSequencerInbox(seqInbox); + + // put some msgs to delayed inbox and seq inbox + vm.startPrank(seqInbox); + bridge.submitBatchSpendingReport(address(1), keccak256("1")); + bridge.submitBatchSpendingReport(address(2), keccak256("2")); + bridge.submitBatchSpendingReport(address(3), keccak256("3")); + bridge.enqueueSequencerMessage(keccak256("seq"), 2, 0, 10); + vm.stopPrank(); + + // enqueue 2nd sequencer msg with additional delayed msgs + vm.prank(seqInbox); + bytes32 dataHash = keccak256("blob"); + uint256 afterDelayedMessagesRead = 3; + uint256 prevMessageCount = 10; + uint256 newMessageCount = 20; + (uint256 seqMessageIndex, bytes32 beforeAcc, bytes32 delayedAcc, bytes32 acc) = bridge + .enqueueSequencerMessage( + dataHash, + afterDelayedMessagesRead, + prevMessageCount, + newMessageCount + ); + + // checks + assertEq( + bridge.sequencerReportedSubMessageCount(), + newMessageCount, + "Invalid sequencerReportedSubMessageCount" + ); + bytes32 seqInboxEntry = keccak256( + abi.encodePacked(bridge.sequencerInboxAccs(0), dataHash, bridge.delayedInboxAccs(2)) + ); + assertEq(bridge.sequencerInboxAccs(1), seqInboxEntry, "Invalid sequencerInboxAccs entry"); + assertEq(bridge.sequencerMessageCount(), 2, "Invalid sequencerMessageCount"); + assertEq(seqMessageIndex, 1, "Invalid seqMessageIndex"); + assertEq(beforeAcc, bridge.sequencerInboxAccs(0), "Invalid beforeAcc"); + assertEq(delayedAcc, bridge.delayedInboxAccs(2), "Invalid delayedAcc"); + assertEq(acc, seqInboxEntry, "Invalid acc"); + } + + function test_enqueueSequencerMessage_revert_BadSequencerMessageNumber() public { + vm.prank(rollup); + bridge.setSequencerInbox(seqInbox); + + // put some msgs to delayed inbox and seq inbox + vm.startPrank(seqInbox); + bridge.submitBatchSpendingReport(address(1), keccak256("1")); + bridge.submitBatchSpendingReport(address(2), keccak256("2")); + bridge.submitBatchSpendingReport(address(3), keccak256("3")); + bridge.enqueueSequencerMessage(keccak256("seq"), 2, 0, 10); + vm.stopPrank(); + + // setting wrong msg counter shall revert + vm.prank(seqInbox); + uint256 incorrectPrevMsgCount = 300; + vm.expectRevert( + abi.encodeWithSelector(BadSequencerMessageNumber.selector, 10, incorrectPrevMsgCount) + ); + bridge.enqueueSequencerMessage(keccak256("seq"), 2, incorrectPrevMsgCount, 10); + } + + function test_enqueueSequencerMessage_revert_NonSeqInboxCall() public { + // enqueueSequencerMessage shall revert + vm.expectRevert(abi.encodeWithSelector(NotSequencerInbox.selector, address(this))); + bridge.enqueueSequencerMessage(keccak256("msg"), 0, 0, 10); + } + + function test_submitBatchSpendingReport() public { + address sender = address(250); + bytes32 messageDataHash = keccak256(abi.encode("msg")); + + vm.prank(rollup); + bridge.setSequencerInbox(seqInbox); + + // expect event + vm.expectEmit(true, true, true, true); + emit MessageDelivered( + 0, + 0, + seqInbox, + 13, + sender, + messageDataHash, + block.basefee, + uint64(block.timestamp) + ); + + // submit report + vm.prank(seqInbox); + uint256 count = bridge.submitBatchSpendingReport(sender, messageDataHash); + + // checks + assertEq(count, 0, "Invalid count"); + assertEq(bridge.delayedMessageCount(), 1, "Invalid msg count"); + } + + function test_submitBatchSpendingReport_TwoInRow() public { + address sender = address(250); + bytes32 messageDataHash = keccak256(abi.encode("msg")); + + // submit 1st report + vm.prank(rollup); + bridge.setSequencerInbox(seqInbox); + vm.prank(seqInbox); + bridge.submitBatchSpendingReport(sender, messageDataHash); + + // expect event + vm.expectEmit(true, true, true, true); + emit MessageDelivered( + 1, + bridge.delayedInboxAccs(0), + seqInbox, + 13, + sender, + messageDataHash, + block.basefee, + uint64(block.timestamp) + ); + + // submit 2nd report + vm.prank(seqInbox); + uint256 count = bridge.submitBatchSpendingReport(sender, messageDataHash); + + // checks + assertEq(count, 1, "Invalid count"); + assertEq(bridge.delayedMessageCount(), 2, "Invalid msg count"); + } + + function test_submitBatchSpendingReport_revert_NonSeqInboxCall() public { + // submitBatchSpendingReport shall revert + vm.expectRevert(abi.encodeWithSelector(NotSequencerInbox.selector, address(this))); + bridge.submitBatchSpendingReport(address(2), keccak256("msg")); + } + + function test_setSequencerInbox() public { + // expect event + vm.expectEmit(true, true, true, true); + emit SequencerInboxUpdated(seqInbox); + + // set seqInbox + vm.prank(address(bridge.rollup())); + bridge.setSequencerInbox(seqInbox); + + // checks + assertEq(bridge.sequencerInbox(), seqInbox, "Invalid seqInbox"); + } + + function test_setSequencerInbox_revert_NonOwnerCall() public { + // mock the owner() call on rollup + address mockRollupOwner = address(10000); + vm.mockCall( + rollup, + abi.encodeWithSelector(IOwnable.owner.selector), + abi.encode(mockRollupOwner) + ); + + // setSequencerInbox shall revert + vm.expectRevert( + abi.encodeWithSelector( + NotRollupOrOwner.selector, + address(this), + rollup, + mockRollupOwner + ) + ); + bridge.setSequencerInbox(seqInbox); + } + + function test_setDelayedInbox_enableInbox() public { + assertEq(bridge.allowedDelayedInboxes(inbox), false, "Invalid allowedDelayedInboxes"); + + // expect event + vm.expectEmit(true, true, true, true); + emit InboxToggle(inbox, true); + + // enable inbox + vm.prank(rollup); + bridge.setDelayedInbox(inbox, true); + + // checks + assertEq(bridge.allowedDelayedInboxes(inbox), true, "Invalid allowedDelayedInboxes"); + assertEq(inbox, bridge.allowedDelayedInboxList(0), "Invalid allowedDelayedInboxList"); + } + + function test_setDelayedInbox_disableInbox() public { + // initially enable inbox + vm.prank(rollup); + bridge.setDelayedInbox(inbox, true); + assertEq(bridge.allowedDelayedInboxes(inbox), true, "Invalid allowedDelayedInboxes"); + + // expect event + vm.expectEmit(true, true, true, true); + emit InboxToggle(inbox, false); + + // disable inbox + vm.prank(rollup); + bridge.setDelayedInbox(inbox, false); + + // checks + assertEq(bridge.allowedDelayedInboxes(inbox), false, "Invalid allowedDelayedInboxes"); + vm.expectRevert(); + bridge.allowedDelayedInboxList(0); + } + + function test_setDelayedInbox_ReEnableInbox() public { + // initially enable inbox + vm.prank(rollup); + bridge.setDelayedInbox(inbox, true); + assertEq(bridge.allowedDelayedInboxes(inbox), true, "Invalid allowedDelayedInboxes"); + + // expect event + vm.expectEmit(true, true, true, true); + emit InboxToggle(inbox, true); + + // enable again inbox + vm.prank(rollup); + bridge.setDelayedInbox(inbox, true); + + // checks + assertEq(bridge.allowedDelayedInboxes(inbox), true, "Invalid allowedDelayedInboxes"); + assertEq(inbox, bridge.allowedDelayedInboxList(0), "Invalid allowedDelayedInboxList"); + } + + function test_setDelayedInbox_ReDisableInbox() public { + assertEq(bridge.allowedDelayedInboxes(inbox), false, "Invalid allowedDelayedInboxes"); + + // expect event + vm.expectEmit(true, true, true, true); + emit InboxToggle(inbox, false); + + // disable again inbox + vm.prank(rollup); + bridge.setDelayedInbox(inbox, false); + + // checks + assertEq(bridge.allowedDelayedInboxes(inbox), false, "Invalid allowedDelayedInboxes"); + vm.expectRevert(); + bridge.allowedDelayedInboxList(0); + } + + function test_setDelayedInbox_revert_NonOwnerCall() public { + // mock the owner() call on rollup + address mockRollupOwner = address(10000); + vm.mockCall( + rollup, + abi.encodeWithSelector(IOwnable.owner.selector), + abi.encode(mockRollupOwner) + ); + + // setDelayedInbox shall revert + vm.expectRevert( + abi.encodeWithSelector( + NotRollupOrOwner.selector, + address(this), + rollup, + mockRollupOwner + ) + ); + bridge.setDelayedInbox(inbox, true); + } + + function test_setOutbox_EnableOutbox() public { + assertEq(bridge.allowedOutboxes(outbox), false, "Invalid allowedOutboxes"); + + // expect event + vm.expectEmit(true, true, true, true); + emit OutboxToggle(outbox, true); + + // enable outbox + vm.prank(rollup); + bridge.setOutbox(outbox, true); + + // checks + assertEq(bridge.allowedOutboxes(outbox), true, "Invalid allowedOutboxes"); + assertEq(outbox, bridge.allowedOutboxList(0), "Invalid allowedOutboxList"); + } + + function test_setOutbox_DisableOutbox() public { + // initially enable outbox + vm.prank(rollup); + bridge.setOutbox(outbox, true); + assertEq(bridge.allowedOutboxes(outbox), true, "Invalid allowedOutboxes"); + + // expect event + vm.expectEmit(true, true, true, true); + emit OutboxToggle(outbox, false); + + // disable outbox + vm.prank(rollup); + bridge.setOutbox(outbox, false); + + // checks + assertEq(bridge.allowedOutboxes(outbox), false, "Invalid allowedOutboxes"); + vm.expectRevert(); + bridge.allowedOutboxList(0); + } + + function test_setOutbox_ReEnableOutbox() public { + // initially enable outbox + vm.prank(rollup); + bridge.setOutbox(outbox, true); + assertEq(bridge.allowedOutboxes(outbox), true, "Invalid allowedOutboxes"); + + // expect event + vm.expectEmit(true, true, true, true); + emit OutboxToggle(outbox, true); + + // enable outbox + vm.prank(rollup); + bridge.setOutbox(outbox, true); + + // checks + assertEq(bridge.allowedOutboxes(outbox), true, "Invalid allowedOutboxes"); + assertEq(outbox, bridge.allowedOutboxList(0), "Invalid allowedOutboxList"); + } + + function test_setOutbox_ReDisableOutbox() public { + // expect event + vm.expectEmit(true, true, true, true); + emit OutboxToggle(outbox, false); + + // disable outbox + vm.prank(rollup); + bridge.setOutbox(outbox, false); + + // checks + assertEq(bridge.allowedOutboxes(outbox), false, "Invalid allowedOutboxes"); + vm.expectRevert(); + bridge.allowedOutboxList(0); + } + + function test_setOutbox_revert_NonOwnerCall() public { + // mock the owner() call on rollup + address mockRollupOwner = address(10000); + vm.mockCall( + rollup, + abi.encodeWithSelector(IOwnable.owner.selector), + abi.encode(mockRollupOwner) + ); + + // setOutbox shall revert + vm.expectRevert( + abi.encodeWithSelector( + NotRollupOrOwner.selector, + address(this), + rollup, + mockRollupOwner + ) + ); + bridge.setOutbox(outbox, true); + } + + function test_setOutbox_revert_InvalidOutboxSet() public { + address invalidOutbox = address(type(uint160).max); + + // setOutbox shall revert + vm.expectRevert(abi.encodeWithSelector(InvalidOutboxSet.selector, invalidOutbox)); + vm.prank(rollup); + bridge.setOutbox(invalidOutbox, true); + } + + function test_setSequencerReportedSubMessageCount() public { + uint256 newCount = 1234; + + vm.prank(rollup); + AbsBridge(address(bridge)).setSequencerReportedSubMessageCount(newCount); + + assertEq( + bridge.sequencerReportedSubMessageCount(), + newCount, + "Invalid sequencerReportedSubMessageCount" + ); + } + + function test_setSequencerReportedSubMessageCount_revert_NonOwnerCall() public { + // mock the owner() call on rollup + address mockRollupOwner = address(10000); + vm.mockCall( + rollup, + abi.encodeWithSelector(IOwnable.owner.selector), + abi.encode(mockRollupOwner) + ); + + // setOutbox shall revert + vm.expectRevert( + abi.encodeWithSelector( + NotRollupOrOwner.selector, + address(this), + rollup, + mockRollupOwner + ) + ); + AbsBridge(address(bridge)).setSequencerReportedSubMessageCount(123); + } + + /**** + **** Event declarations + ***/ + + event SequencerInboxUpdated(address newSequencerInbox); + event InboxToggle(address indexed inbox, bool enabled); + event OutboxToggle(address indexed outbox, bool enabled); + event MessageDelivered( + uint256 indexed messageIndex, + bytes32 indexed beforeInboxAcc, + address inbox, + uint8 kind, + address sender, + bytes32 messageDataHash, + uint256 baseFeeL1, + uint64 timestamp + ); + event BridgeCallTriggered( + address indexed outbox, + address indexed to, + uint256 value, + bytes data + ); +} \ No newline at end of file diff --git a/test/foundry/AbsInbox.t.sol b/test/foundry/AbsInbox.t.sol new file mode 100644 index 00000000..0dd8aa47 --- /dev/null +++ b/test/foundry/AbsInbox.t.sol @@ -0,0 +1,403 @@ +// SPDX-License-Identifier: UNLICENSED +pragma solidity ^0.8.4; + +import "forge-std/Test.sol"; +import "./util/TestUtil.sol"; +import "../../src/bridge/ERC20Bridge.sol"; +import "../../src/bridge/ERC20Inbox.sol"; +import "../../src/bridge/ISequencerInbox.sol"; +import "../../src/libraries/AddressAliasHelper.sol"; +import "@openzeppelin/contracts/token/ERC20/ERC20.sol"; +import "@openzeppelin/contracts/token/ERC20/presets/ERC20PresetFixedSupply.sol"; +import "@openzeppelin/contracts-upgradeable/security/PausableUpgradeable.sol"; + +abstract contract AbsInboxTest is Test { + IInbox public inbox; + IBridge public bridge; + + address public user = address(100); + address public rollup = address(1000); + address public seqInbox = address(1001); + + /* solhint-disable func-name-mixedcase */ + function test_setAllowList() public { + address[] memory users = new address[](2); + users[0] = address(300); + users[1] = address(301); + + bool[] memory allowed = new bool[](2); + allowed[0] = true; + allowed[0] = false; + + vm.expectEmit(true, true, true, true); + emit AllowListAddressSet(users[0], allowed[0]); + emit AllowListAddressSet(users[1], allowed[1]); + + vm.prank(rollup); + inbox.setAllowList(users, allowed); + + assertEq(inbox.isAllowed(users[0]), allowed[0], "Invalid isAllowed user[0]"); + assertEq(inbox.isAllowed(users[1]), allowed[1], "Invalid isAllowed user[1]"); + } + + function test_setAllowList_revert_InvalidLength() public { + address[] memory users = new address[](1); + users[0] = address(300); + + bool[] memory allowed = new bool[](2); + allowed[0] = true; + allowed[0] = false; + + vm.expectRevert("INVALID_INPUT"); + vm.prank(rollup); + inbox.setAllowList(users, allowed); + } + + function test_setOutbox_revert_NonOwnerCall() public { + // mock the owner() call on rollup + address mockRollupOwner = address(10000); + vm.mockCall( + rollup, + abi.encodeWithSelector(IOwnable.owner.selector), + abi.encode(mockRollupOwner) + ); + + // setAllowList shall revert + vm.expectRevert( + abi.encodeWithSelector( + NotRollupOrOwner.selector, + address(this), + rollup, + mockRollupOwner + ) + ); + + address[] memory users = new address[](2); + users[0] = address(300); + bool[] memory allowed = new bool[](2); + allowed[0] = true; + inbox.setAllowList(users, allowed); + } + + function test_setAllowListEnabled_EnableAllowList() public { + assertEq(inbox.allowListEnabled(), false, "Invalid initial value for allowList"); + + vm.expectEmit(true, true, true, true); + emit AllowListEnabledUpdated(true); + + vm.prank(rollup); + inbox.setAllowListEnabled(true); + + assertEq(inbox.allowListEnabled(), true, "Invalid allowList"); + } + + function test_setAllowListEnabled_DisableAllowList() public { + vm.prank(rollup); + inbox.setAllowListEnabled(true); + assertEq(inbox.allowListEnabled(), true, "Invalid initial value for allowList"); + + vm.expectEmit(true, true, true, true); + emit AllowListEnabledUpdated(false); + + vm.prank(rollup); + inbox.setAllowListEnabled(false); + + assertEq(inbox.allowListEnabled(), false, "Invalid allowList"); + } + + function test_setAllowListEnabled_revert_AlreadyEnabled() public { + vm.prank(rollup); + inbox.setAllowListEnabled(true); + assertEq(inbox.allowListEnabled(), true, "Invalid initial value for allowList"); + + vm.expectRevert("ALREADY_SET"); + vm.prank(rollup); + inbox.setAllowListEnabled(true); + } + + function test_setAllowListEnabled_revert_AlreadyDisabled() public { + vm.prank(rollup); + vm.expectRevert("ALREADY_SET"); + inbox.setAllowListEnabled(false); + } + + function test_setAllowListEnabled_revert_NonOwnerCall() public { + // mock the owner() call on rollup + address mockRollupOwner = address(10000); + vm.mockCall( + rollup, + abi.encodeWithSelector(IOwnable.owner.selector), + abi.encode(mockRollupOwner) + ); + + // setAllowListEnabled shall revert + vm.expectRevert( + abi.encodeWithSelector( + NotRollupOrOwner.selector, + address(this), + rollup, + mockRollupOwner + ) + ); + + inbox.setAllowListEnabled(true); + } + + function test_pause() public { + assertEq( + (PausableUpgradeable(address(inbox))).paused(), + false, + "Invalid initial paused state" + ); + + vm.prank(rollup); + inbox.pause(); + + assertEq((PausableUpgradeable(address(inbox))).paused(), true, "Invalid paused state"); + } + + function test_unpause() public { + vm.prank(rollup); + inbox.pause(); + assertEq( + (PausableUpgradeable(address(inbox))).paused(), + true, + "Invalid initial paused state" + ); + vm.prank(rollup); + inbox.unpause(); + + assertEq((PausableUpgradeable(address(inbox))).paused(), false, "Invalid paused state"); + } + + function test_initialize_revert_ReInit() public { + vm.expectRevert("Initializable: contract is already initialized"); + inbox.initialize(bridge, ISequencerInbox(seqInbox)); + } + + function test_initialize_revert_NonDelegated() public { + ERC20Inbox inb = new ERC20Inbox(); + vm.expectRevert("Function must be called through delegatecall"); + inb.initialize(bridge, ISequencerInbox(seqInbox)); + } + + function test_sendL2MessageFromOrigin() public { + // L2 msg params + bytes memory data = abi.encodePacked("some msg"); + + // expect event + vm.expectEmit(true, true, true, true); + emit InboxMessageDeliveredFromOrigin(0); + + // send L2 msg -> tx.origin == msg.sender + vm.prank(user, user); + uint256 msgNum = inbox.sendL2MessageFromOrigin(data); + + //// checks + assertEq(msgNum, 0, "Invalid msgNum"); + assertEq(bridge.delayedMessageCount(), 1, "Invalid delayed message count"); + } + + function test_sendL2MessageFromOrigin_revert_WhenPaused() public { + vm.prank(rollup); + inbox.pause(); + + vm.expectRevert("Pausable: paused"); + vm.prank(user); + inbox.sendL2MessageFromOrigin(abi.encodePacked("some msg")); + } + + function test_sendL2MessageFromOrigin_revert_NotAllowed() public { + vm.prank(rollup); + inbox.setAllowListEnabled(true); + + vm.expectRevert(abi.encodeWithSelector(NotAllowedOrigin.selector, user)); + vm.prank(user, user); + inbox.sendL2MessageFromOrigin(abi.encodePacked("some msg")); + } + + function test_sendL2MessageFromOrigin_revert_L1Forked() public { + vm.chainId(10); + vm.expectRevert(abi.encodeWithSelector(L1Forked.selector)); + vm.prank(user, user); + inbox.sendL2MessageFromOrigin(abi.encodePacked("some msg")); + } + + function test_sendL2MessageFromOrigin_revert_NotOrigin() public { + vm.expectRevert(abi.encodeWithSelector(NotOrigin.selector)); + inbox.sendL2MessageFromOrigin(abi.encodePacked("some msg")); + } + + function test_sendL2Message() public { + // L2 msg params + bytes memory data = abi.encodePacked("some msg"); + + // expect event + vm.expectEmit(true, true, true, true); + emit InboxMessageDelivered(0, data); + + // send L2 msg -> tx.origin == msg.sender + vm.prank(user, user); + uint256 msgNum = inbox.sendL2Message(data); + + //// checks + assertEq(msgNum, 0, "Invalid msgNum"); + assertEq(bridge.delayedMessageCount(), 1, "Invalid delayed message count"); + } + + function test_sendL2Message_revert_WhenPaused() public { + vm.prank(rollup); + inbox.pause(); + + vm.expectRevert("Pausable: paused"); + vm.prank(user); + inbox.sendL2Message(abi.encodePacked("some msg")); + } + + function test_sendL2Message_revert_NotAllowed() public { + vm.prank(rollup); + inbox.setAllowListEnabled(true); + + vm.expectRevert(abi.encodeWithSelector(NotAllowedOrigin.selector, user)); + vm.prank(user, user); + inbox.sendL2Message(abi.encodePacked("some msg")); + } + + function test_sendL2Message_revert_L1Forked() public { + vm.chainId(10); + vm.expectRevert(abi.encodeWithSelector(L1Forked.selector)); + vm.prank(user, user); + inbox.sendL2Message(abi.encodePacked("some msg")); + } + + function test_sendUnsignedTransaction() public { + // L2 msg params + uint256 maxFeePerGas = 0; + uint256 gasLimit = 10; + uint256 nonce = 3; + uint256 value = 300; + bytes memory data = abi.encodePacked("test data"); + + // expect event + vm.expectEmit(true, true, true, true); + emit InboxMessageDelivered( + 0, + abi.encodePacked( + L2MessageType_unsignedEOATx, + gasLimit, + maxFeePerGas, + nonce, + uint256(uint160(user)), + value, + data + ) + ); + + // send TX + vm.prank(user, user); + uint256 msgNum = inbox.sendUnsignedTransaction( + gasLimit, + maxFeePerGas, + nonce, + user, + value, + data + ); + + //// checks + assertEq(msgNum, 0, "Invalid msgNum"); + assertEq(bridge.delayedMessageCount(), 1, "Invalid delayed message count"); + } + + function test_sendUnsignedTransaction_revert_WhenPaused() public { + vm.prank(rollup); + inbox.pause(); + + vm.expectRevert("Pausable: paused"); + vm.prank(user); + inbox.sendUnsignedTransaction(10, 10, 10, user, 10, abi.encodePacked("test data")); + } + + function test_sendUnsignedTransaction_revert_NotAllowed() public { + vm.prank(rollup); + inbox.setAllowListEnabled(true); + + vm.expectRevert(abi.encodeWithSelector(NotAllowedOrigin.selector, user)); + vm.prank(user, user); + inbox.sendUnsignedTransaction(10, 10, 10, user, 10, abi.encodePacked("test data")); + } + + function test_sendUnsignedTransaction_revert_GasLimitTooLarge() public { + uint256 tooBigGasLimit = uint256(type(uint64).max) + 1; + + vm.expectRevert(GasLimitTooLarge.selector); + vm.prank(user, user); + inbox.sendUnsignedTransaction(tooBigGasLimit, 10, 10, user, 10, abi.encodePacked("data")); + } + + function test_sendContractTransaction() public { + // L2 msg params + uint256 maxFeePerGas = 0; + uint256 gasLimit = 10; + uint256 value = 300; + bytes memory data = abi.encodePacked("test data"); + + // expect event + vm.expectEmit(true, true, true, true); + emit InboxMessageDelivered( + 0, + abi.encodePacked( + L2MessageType_unsignedContractTx, + gasLimit, + maxFeePerGas, + uint256(uint160(user)), + value, + data + ) + ); + + // send TX + vm.prank(user); + uint256 msgNum = inbox.sendContractTransaction(gasLimit, maxFeePerGas, user, value, data); + + //// checks + assertEq(msgNum, 0, "Invalid msgNum"); + assertEq(bridge.delayedMessageCount(), 1, "Invalid delayed message count"); + } + + function test_sendContractTransaction_revert_WhenPaused() public { + vm.prank(rollup); + inbox.pause(); + + vm.expectRevert("Pausable: paused"); + inbox.sendContractTransaction(10, 10, user, 10, abi.encodePacked("test data")); + } + + function test_sendContractTransaction_revert_NotAllowed() public { + vm.prank(rollup); + inbox.setAllowListEnabled(true); + + vm.expectRevert(abi.encodeWithSelector(NotAllowedOrigin.selector, user)); + vm.prank(user, user); + inbox.sendContractTransaction(10, 10, user, 10, abi.encodePacked("test data")); + } + + function test_sendContractTransaction_revert_GasLimitTooLarge() public { + uint256 tooBigGasLimit = uint256(type(uint64).max) + 1; + + vm.expectRevert(GasLimitTooLarge.selector); + vm.prank(user); + inbox.sendContractTransaction(tooBigGasLimit, 10, user, 10, abi.encodePacked("data")); + } + + /**** + **** Event declarations + ***/ + + event AllowListAddressSet(address indexed user, bool val); + event AllowListEnabledUpdated(bool isEnabled); + event InboxMessageDelivered(uint256 indexed messageNum, bytes data); + event InboxMessageDeliveredFromOrigin(uint256 indexed messageNum); +} + +contract Sender {} \ No newline at end of file diff --git a/test/foundry/AbsOutbox.t.sol b/test/foundry/AbsOutbox.t.sol new file mode 100644 index 00000000..52811032 --- /dev/null +++ b/test/foundry/AbsOutbox.t.sol @@ -0,0 +1,28 @@ +// SPDX-License-Identifier: UNLICENSED +pragma solidity ^0.8.4; + +import "forge-std/Test.sol"; +import "./util/TestUtil.sol"; +import "../../src/bridge/IOutbox.sol"; +import "../../src/bridge/IBridge.sol"; + +abstract contract AbsOutboxTest is Test { + IOutbox public outbox; + IBridge public bridge; + + address public user = address(100); + address public rollup = address(1000); + address public seqInbox = address(1001); + + /* solhint-disable func-name-mixedcase */ + function test_initialize() public { + assertEq(address(outbox.bridge()), address(bridge), "Invalid bridge ref"); + assertEq(address(outbox.rollup()), rollup, "Invalid rollup ref"); + + assertEq(outbox.l2ToL1Sender(), address(0), "Invalid l2ToL1Sender"); + assertEq(outbox.l2ToL1Block(), 0, "Invalid l2ToL1Block"); + assertEq(outbox.l2ToL1EthBlock(), 0, "Invalid l2ToL1EthBlock"); + assertEq(outbox.l2ToL1Timestamp(), 0, "Invalid l2ToL1Timestamp"); + assertEq(outbox.l2ToL1OutputId(), bytes32(0), "Invalid l2ToL1OutputId"); + } +} \ No newline at end of file diff --git a/test/foundry/AbsRollupCreator.t.sol b/test/foundry/AbsRollupCreator.t.sol new file mode 100644 index 00000000..b3cb2941 --- /dev/null +++ b/test/foundry/AbsRollupCreator.t.sol @@ -0,0 +1,167 @@ +// SPDX-License-Identifier: UNLICENSED +pragma solidity ^0.8.4; + +import "forge-std/Test.sol"; +import "./util/TestUtil.sol"; +import "../../src/rollup/IRollupCreator.sol"; +import "../../src/rollup/RollupAdminLogic.sol"; +import "../../src/rollup/RollupUserLogic.sol"; +import "../../src/rollup/ValidatorUtils.sol"; +import "../../src/rollup/ValidatorWalletCreator.sol"; +import "../../src/challenge/ChallengeManager.sol"; +import "../../src/osp/OneStepProver0.sol"; +import "../../src/osp/OneStepProverMemory.sol"; +import "../../src/osp/OneStepProverMath.sol"; +import "../../src/osp/OneStepProverHostIo.sol"; +import "../../src/osp/OneStepProofEntry.sol"; + +import "@openzeppelin/contracts/access/Ownable.sol"; + +abstract contract AbsRollupCreatorTest is Test { + address public rollupOwner = address(4400); + address public deployer = address(4300); + + function _prepareRollupDeployment(address rollupCreator) + internal + returns ( + IOneStepProofEntry ospEntry, + IChallengeManager challengeManager, + IRollupAdmin rollupAdminLogic, + IRollupUser rollupUserLogic, + ISequencerInbox.MaxTimeVariation memory timeVars, + address expectedRollupAddr + ) + { + //// deploy challenge stuff + ospEntry = new OneStepProofEntry( + new OneStepProver0(), + new OneStepProverMemory(), + new OneStepProverMath(), + new OneStepProverHostIo() + ); + challengeManager = new ChallengeManager(); + + //// deploy rollup logic + rollupAdminLogic = IRollupAdmin(new RollupAdminLogic()); + rollupUserLogic = IRollupUser(new RollupUserLogic()); + + timeVars = ISequencerInbox.MaxTimeVariation( + ((60 * 60 * 24) / 15), + 12, + 60 * 60 * 24, + 60 * 60 + ); + + //// calculate expected address for rollup + expectedRollupAddr = _calculateExpectedAddr(rollupCreator, vm.getNonce(rollupCreator) + 2); + + return ( + ospEntry, + challengeManager, + rollupAdminLogic, + rollupUserLogic, + timeVars, + expectedRollupAddr + ); + } + + function _calculateExpectedAddr(address rollupCreator, uint256 nonce) + internal + pure + returns (address) + { + bytes1 nonceBytes1 = bytes1(uint8(nonce)); + address expectedRollupAddr = address( + uint160( + uint256( + keccak256( + abi.encodePacked( + bytes1(0xd6), + bytes1(0x94), + address(rollupCreator), + nonceBytes1 + ) + ) + ) + ) + ); + + return expectedRollupAddr; + } + + function _checkRollupIsSetUp( + IRollupCreator rollupCreator, + address rollupAddress, + IRollupAdmin rollupAdmin, + IRollupUser rollupUser + ) internal { + /// rollup creator + assertEq(IOwnable(address(rollupCreator)).owner(), deployer, "Invalid rollupCreator owner"); + + /// rollup proxy + assertEq(IOwnable(rollupAddress).owner(), rollupOwner, "Invalid rollup owner"); + assertEq(_getProxyAdmin(rollupAddress), rollupOwner, "Invalid rollup's proxyAdmin owner"); + assertEq(_getPrimary(rollupAddress), address(rollupAdmin), "Invalid proxy primary impl"); + assertEq(_getSecondary(rollupAddress), address(rollupUser), "Invalid proxy secondary impl"); + + /// rollup check + RollupCore rollup = RollupCore(rollupAddress); + assertTrue(address(rollup.sequencerInbox()) != address(0), "Invalid seqInbox"); + assertTrue(address(rollup.bridge()) != address(0), "Invalid bridge"); + assertTrue(address(rollup.inbox()) != address(0), "Invalid inbox"); + assertTrue(address(rollup.outbox()) != address(0), "Invalid outbox"); + assertTrue(address(rollup.rollupEventInbox()) != address(0), "Invalid rollupEventInbox"); + assertTrue(address(rollup.challengeManager()) != address(0), "Invalid challengeManager"); + } + + function _expectEvents( + IRollupCreator rollupCreator, + IBridgeCreator bridgeCreator, + address expectedRollupAddr, + bytes32 wasmModuleRoot, + uint256 chainId + ) internal { + vm.expectEmit(true, true, true, true); + uint256 bridgeCreatorNonce = vm.getNonce(address(bridgeCreator)); + emit RollupCreated( + expectedRollupAddr, + _calculateExpectedAddr(address(bridgeCreator), bridgeCreatorNonce + 2), + _calculateExpectedAddr(address(rollupCreator), vm.getNonce(address(rollupCreator))), + _calculateExpectedAddr(address(bridgeCreator), bridgeCreatorNonce + 1), + _calculateExpectedAddr(address(bridgeCreator), bridgeCreatorNonce) + ); + + emit RollupInitialized(wasmModuleRoot, chainId); + } + + function _getProxyAdmin(address proxy) internal view returns (address) { + bytes32 adminSlot = bytes32(uint256(keccak256("eip1967.proxy.admin")) - 1); + return address(uint160(uint256(vm.load(proxy, adminSlot)))); + } + + function _getPrimary(address proxy) internal view returns (address) { + bytes32 primarySlot = bytes32(uint256(keccak256("eip1967.proxy.implementation")) - 1); + return address(uint160(uint256(vm.load(proxy, primarySlot)))); + } + + function _getSecondary(address proxy) internal view returns (address) { + bytes32 secondarySlot = bytes32( + uint256(keccak256("eip1967.proxy.implementation.secondary")) - 1 + ); + return address(uint160(uint256(vm.load(proxy, secondarySlot)))); + } + + /**** + **** Event declarations + ***/ + + event RollupCreated( + address indexed rollupAddress, + address inboxAddress, + address adminProxy, + address sequencerInbox, + address bridge + ); + + event RollupInitialized(bytes32 machineHash, uint256 chainId); +} \ No newline at end of file diff --git a/test/foundry/Bridge.t.sol b/test/foundry/Bridge.t.sol new file mode 100644 index 00000000..bea1c9c9 --- /dev/null +++ b/test/foundry/Bridge.t.sol @@ -0,0 +1,317 @@ +// SPDX-License-Identifier: UNLICENSED +pragma solidity ^0.8.4; + +import "forge-std/Test.sol"; +import "./util/TestUtil.sol"; +import "./AbsBridge.t.sol"; +import "../../src/bridge/IEthBridge.sol"; +import "../../src/libraries/AddressAliasHelper.sol"; + +contract BridgeTest is AbsBridgeTest { + IEthBridge public ethBridge; + + // msg details + uint8 public kind = 7; + bytes32 public messageDataHash = keccak256(abi.encodePacked("some msg")); + uint256 public ethAmount = 2 ether; + + function setUp() public { + inbox = address(1001); + + // deploy eth and bridge + bridge = Bridge(TestUtil.deployProxy(address(new Bridge()))); + ethBridge = IEthBridge(address(bridge)); + + // init bridge + ethBridge.initialize(IOwnable(rollup)); + + // fund user account + vm.deal(user, 10 ether); + } + + /* solhint-disable func-name-mixedcase */ + function test_initialize() public { + assertEq(address(bridge.rollup()), rollup, "Invalid rollup ref"); + assertEq(bridge.activeOutbox(), address(0), "Invalid activeOutbox ref"); + } + + function test_initialize_revert_ReInit() public { + vm.expectRevert("Initializable: contract is already initialized"); + ethBridge.initialize(IOwnable(rollup)); + } + + function test_initialize_revert_NonDelegated() public { + IEthBridge noTokenBridge = new Bridge(); + vm.expectRevert("Function must be called through delegatecall"); + noTokenBridge.initialize(IOwnable(rollup)); + } + + function test_enqueueDelayedMessage() public { + // inbox will move ETH to bridge + vm.deal(inbox, ethAmount); + uint256 inboxEthBalanceBefore = address(inbox).balance; + uint256 bridgeEthBalanceBefore = address(bridge).balance; + + // allow inbox + vm.prank(rollup); + bridge.setDelayedInbox(inbox, true); + + // expect event + vm.expectEmit(true, true, true, true); + vm.fee(70); + uint256 baseFeeToReport = block.basefee; + emit MessageDelivered( + 0, + 0, + inbox, + kind, + AddressAliasHelper.applyL1ToL2Alias(user), + messageDataHash, + baseFeeToReport, + uint64(block.timestamp) + ); + + // enqueue msg inbox->bridge + address userAliased = AddressAliasHelper.applyL1ToL2Alias(user); + vm.prank(inbox); + ethBridge.enqueueDelayedMessage{value: ethAmount}(kind, userAliased, messageDataHash); + + //// checks + + uint256 bridgeEthBalanceAfter = address(bridge).balance; + assertEq( + bridgeEthBalanceAfter - bridgeEthBalanceBefore, + ethAmount, + "Invalid bridge eth balance" + ); + + uint256 inboxEthBalanceAfter = address(inbox).balance; + assertEq(inboxEthBalanceBefore - inboxEthBalanceAfter, ethAmount, "Invalid inbox balance"); + + assertEq(bridge.delayedMessageCount(), 1, "Invalid delayed message count"); + } + + function test_enqueueDelayedMessage_TwoInRow() public { + // allow inbox + vm.prank(rollup); + bridge.setDelayedInbox(inbox, true); + + vm.deal(inbox, ethAmount); + uint256 inboxEthBalanceBefore = address(inbox).balance; + uint256 bridgeEthBalanceBefore = address(bridge).balance; + + // 1st enqueue msg + vm.prank(inbox); + ethBridge.enqueueDelayedMessage{value: 1 ether}(2, address(400), messageDataHash); + + // expect event + vm.expectEmit(true, true, true, true); + emit MessageDelivered( + 1, + bridge.delayedInboxAccs(0), + inbox, + 8, + AddressAliasHelper.applyL1ToL2Alias(user), + messageDataHash, + block.basefee, + uint64(block.timestamp) + ); + + // enqueue msg inbox->bridge + address userAliased = AddressAliasHelper.applyL1ToL2Alias(user); + vm.prank(inbox); + ethBridge.enqueueDelayedMessage{value: 1 ether}(8, userAliased, messageDataHash); + + //// checks + + uint256 bridgeEthBalanceAfter = address(bridge).balance; + assertEq( + bridgeEthBalanceAfter - bridgeEthBalanceBefore, + ethAmount, + "Invalid bridge eth balance" + ); + + uint256 inboxEthBalanceAfter = address(inbox).balance; + assertEq(inboxEthBalanceBefore - inboxEthBalanceAfter, ethAmount, "Invalid inbox balance"); + + assertEq(bridge.delayedMessageCount(), 2, "Invalid delayed message count"); + } + + function test_enqueueDelayedMessage_revert_UseTokenForFees() public { + // allow inbox + vm.prank(rollup); + bridge.setDelayedInbox(inbox, true); + + // enqueue msg + hoax(inbox); + vm.expectRevert(); + IERC20Bridge(address(bridge)).enqueueDelayedMessage(kind, user, messageDataHash, 1000); + } + + function test_enqueueDelayedMessage_revert_NotDelayedInbox() public { + hoax(inbox); + vm.expectRevert(abi.encodeWithSelector(NotDelayedInbox.selector, inbox)); + ethBridge.enqueueDelayedMessage{value: ethAmount}(kind, user, messageDataHash); + } + + function test_executeCall_EmptyCalldata() public { + // fund bridge with some eth + vm.deal(address(bridge), 10 ether); + uint256 bridgeEthBalanceBefore = address(bridge).balance; + uint256 userEthBalanceBefore = address(user).balance; + + // allow outbox + vm.prank(rollup); + bridge.setOutbox(outbox, true); + + uint256 withdrawalAmount = 3 ether; + + // expect event + vm.expectEmit(true, true, true, true); + emit BridgeCallTriggered(outbox, user, withdrawalAmount, ""); + + //// execute call + vm.prank(outbox); + (bool success, ) = bridge.executeCall({to: user, value: withdrawalAmount, data: ""}); + + //// checks + assertTrue(success, "Execute call failed"); + + uint256 bridgeEthBalanceAfter = address(bridge).balance; + assertEq( + bridgeEthBalanceBefore - bridgeEthBalanceAfter, + withdrawalAmount, + "Invalid bridge eth balance" + ); + + uint256 userEthBalanceAfter = address(user).balance; + assertEq( + userEthBalanceAfter - userEthBalanceBefore, + withdrawalAmount, + "Invalid user eth balance" + ); + } + + function test_executeCall_WithCalldata() public { + // fund bridge with some eth + vm.deal(address(bridge), 10 ether); + + // allow outbox + vm.prank(rollup); + bridge.setOutbox(outbox, true); + + // deploy some contract that will be call receiver + EthVault vault = new EthVault(); + + uint256 bridgeEthBalanceBefore = address(bridge).balance; + uint256 vaultEthBalanceBefore = address(vault).balance; + + // call params + uint256 newVaultVersion = 7; + uint256 withdrawalAmount = 3 ether; + bytes memory data = abi.encodeWithSelector(EthVault.setVersion.selector, newVaultVersion); + + // expect event + vm.expectEmit(true, true, true, true); + emit BridgeCallTriggered(outbox, address(vault), withdrawalAmount, data); + + //// execute call + vm.prank(outbox); + (bool success, ) = bridge.executeCall({ + to: address(vault), + value: withdrawalAmount, + data: data + }); + + //// checks + assertTrue(success, "Execute call failed"); + assertEq(vault.version(), newVaultVersion, "Invalid newVaultVersion"); + + uint256 bridgeEthBalanceAfter = address(bridge).balance; + assertEq( + bridgeEthBalanceBefore - bridgeEthBalanceAfter, + withdrawalAmount, + "Invalid bridge eth balance" + ); + + uint256 vaultEthBalanceAfter = address(vault).balance; + assertEq( + vaultEthBalanceAfter - vaultEthBalanceBefore, + withdrawalAmount, + "Invalid vault eth balance" + ); + } + + function test_executeCall_UnsuccessfulCall() public { + // fund bridge with some eth + vm.deal(address(bridge), 10 ether); + + // allow outbox + vm.prank(rollup); + bridge.setOutbox(outbox, true); + + // deploy some contract that will be call receiver + EthVault vault = new EthVault(); + + uint256 bridgeEthBalanceBefore = address(bridge).balance; + uint256 vaultEthBalanceBefore = address(vault).balance; + + // call params + uint256 withdrawalAmount = 3 ether; + bytes memory revertingData = abi.encodeWithSelector(EthVault.justRevert.selector); + + // expect event + vm.expectEmit(true, true, true, true); + emit BridgeCallTriggered(outbox, address(vault), withdrawalAmount, revertingData); + + //// execute call - do call which reverts + vm.prank(outbox); + (bool success, bytes memory returnData) = bridge.executeCall({ + to: address(vault), + value: withdrawalAmount, + data: revertingData + }); + + //// checks + assertEq(success, false, "Execute shall be unsuccessful"); + assertEq(vault.version(), 0, "Invalid vaultVersion"); + + // get revert reason + assembly { + returnData := add(returnData, 0x04) + } + string memory revertReason = abi.decode(returnData, (string)); + assertEq(revertReason, "bye", "Invalid revert reason"); + + uint256 bridgeEthBalanceAfter = address(bridge).balance; + assertEq( + bridgeEthBalanceBefore, + bridgeEthBalanceAfter, + "Invalid bridge eth balance after unsuccessful call" + ); + + uint256 vaultEthBalanceAfter = address(vault).balance; + assertEq( + vaultEthBalanceAfter, + vaultEthBalanceBefore, + "Invalid vault eth balance after unsuccessful call" + ); + } + + function test_executeCall_revert_NotOutbox() public { + vm.expectRevert(abi.encodeWithSelector(NotOutbox.selector, address(this))); + bridge.executeCall({to: user, value: 0.1 ether, data: ""}); + } + + function test_executeCall_revert_NotContract() public { + // allow outbox + vm.prank(rollup); + bridge.setOutbox(outbox, true); + + // executeCall shall revert when 'to' is not contract + address to = address(234); + vm.expectRevert(abi.encodeWithSelector(NotContract.selector, address(to))); + vm.prank(outbox); + bridge.executeCall({to: to, value: 0.1 ether, data: "some data"}); + } +} \ No newline at end of file diff --git a/test/foundry/ERC20Bridge.t.sol b/test/foundry/ERC20Bridge.t.sol new file mode 100644 index 00000000..d37fcd8a --- /dev/null +++ b/test/foundry/ERC20Bridge.t.sol @@ -0,0 +1,353 @@ +// SPDX-License-Identifier: UNLICENSED +pragma solidity ^0.8.4; + +import "forge-std/Test.sol"; +import "./util/TestUtil.sol"; +import "./AbsBridge.t.sol"; +import "../../src/bridge/ERC20Bridge.sol"; +import "../../src/bridge/ERC20Inbox.sol"; +import "../../src/bridge/IEthBridge.sol"; +import "../../src/libraries/AddressAliasHelper.sol"; +import "@openzeppelin/contracts/token/ERC20/ERC20.sol"; +import "@openzeppelin/contracts/token/ERC20/presets/ERC20PresetMinterPauser.sol"; + +import "forge-std/console.sol"; + +contract ERC20BridgeTest is AbsBridgeTest { + IERC20Bridge public erc20Bridge; + IERC20 public nativeToken; + + // msg details + uint8 public kind = 7; + bytes32 public messageDataHash = keccak256(abi.encodePacked("some msg")); + uint256 public tokenFeeAmount = 30; + + function setUp() public { + // deploy token and bridge + nativeToken = new ERC20PresetMinterPauser("Appchain Token", "App"); + bridge = ERC20Bridge(TestUtil.deployProxy(address(new ERC20Bridge()))); + erc20Bridge = IERC20Bridge(address(bridge)); + + // init bridge + erc20Bridge.initialize(IOwnable(rollup), address(nativeToken)); + + // deploy inbox + inbox = address(TestUtil.deployProxy(address(new ERC20Inbox()))); + IERC20Inbox(address(inbox)).initialize(bridge, ISequencerInbox(seqInbox)); + } + + /* solhint-disable func-name-mixedcase */ + function test_initialize() public { + assertEq( + address(erc20Bridge.nativeToken()), + address(nativeToken), + "Invalid nativeToken ref" + ); + assertEq(address(bridge.rollup()), rollup, "Invalid rollup ref"); + assertEq(bridge.activeOutbox(), address(0), "Invalid activeOutbox ref"); + } + + function test_initialize_revert_ZeroAddressToken() public { + IERC20Bridge noTokenBridge = ERC20Bridge(TestUtil.deployProxy(address(new ERC20Bridge()))); + vm.expectRevert(abi.encodeWithSelector(InvalidTokenSet.selector, address(0))); + noTokenBridge.initialize(IOwnable(rollup), address(0)); + } + + function test_initialize_revert_ReInit() public { + vm.expectRevert("Initializable: contract is already initialized"); + erc20Bridge.initialize(IOwnable(rollup), address(nativeToken)); + } + + function test_initialize_revert_NonDelegated() public { + IERC20Bridge noTokenBridge = new ERC20Bridge(); + vm.expectRevert("Function must be called through delegatecall"); + noTokenBridge.initialize(IOwnable(rollup), address(nativeToken)); + } + + function test_enqueueDelayedMessage() public { + // add fee tokens to inbox + ERC20PresetMinterPauser(address(nativeToken)).mint(inbox, tokenFeeAmount); + + // snapshot + uint256 userNativeTokenBalanceBefore = nativeToken.balanceOf(address(user)); + uint256 bridgeNativeTokenBalanceBefore = nativeToken.balanceOf(address(bridge)); + uint256 inboxNativeTokenBalanceBefore = nativeToken.balanceOf(address(inbox)); + uint256 delayedMsgCountBefore = bridge.delayedMessageCount(); + + // allow inbox + vm.prank(rollup); + bridge.setDelayedInbox(inbox, true); + + // approve bridge to escrow tokens + vm.prank(user); + nativeToken.approve(address(bridge), tokenFeeAmount); + + // expect event + vm.expectEmit(true, true, true, true); + vm.fee(70); + uint256 baseFeeToReport = 0; + emit MessageDelivered( + 0, + 0, + inbox, + kind, + AddressAliasHelper.applyL1ToL2Alias(user), + messageDataHash, + baseFeeToReport, + uint64(block.timestamp) + ); + + // enqueue msg + address userAliased = AddressAliasHelper.applyL1ToL2Alias(user); + vm.prank(inbox); + erc20Bridge.enqueueDelayedMessage(kind, userAliased, messageDataHash, tokenFeeAmount); + + //// checks + uint256 userNativeTokenBalanceAfter = nativeToken.balanceOf(address(user)); + assertEq( + userNativeTokenBalanceAfter, + userNativeTokenBalanceBefore, + "Invalid user token balance" + ); + + uint256 bridgeNativeTokenBalanceAfter = nativeToken.balanceOf(address(bridge)); + assertEq( + bridgeNativeTokenBalanceAfter - bridgeNativeTokenBalanceBefore, + tokenFeeAmount, + "Invalid bridge token balance" + ); + + uint256 inboxNativeTokenBalanceAfter = nativeToken.balanceOf(address(inbox)); + assertEq( + inboxNativeTokenBalanceBefore - inboxNativeTokenBalanceAfter, + tokenFeeAmount, + "Invalid inbox token balance" + ); + + uint256 delayedMsgCountAfter = bridge.delayedMessageCount(); + assertEq(delayedMsgCountAfter - delayedMsgCountBefore, 1, "Invalid delayed message count"); + } + + function test_enqueueDelayedMessage_revert_UseEthForFees() public { + // allow inbox + vm.prank(rollup); + bridge.setDelayedInbox(inbox, true); + + // enqueue msg + hoax(inbox); + vm.expectRevert(); + IEthBridge(address(bridge)).enqueueDelayedMessage{value: 0.1 ether}( + kind, + user, + messageDataHash + ); + } + + function test_enqueueDelayedMessage_revert_NotDelayedInbox() public { + vm.prank(inbox); + vm.expectRevert(abi.encodeWithSelector(NotDelayedInbox.selector, inbox)); + erc20Bridge.enqueueDelayedMessage(kind, user, messageDataHash, tokenFeeAmount); + } + + function test_executeCall_EmptyCalldata() public { + // fund bridge native tokens + ERC20PresetMinterPauser(address(nativeToken)).mint(address(bridge), 15); + + // allow outbox + vm.prank(rollup); + bridge.setOutbox(outbox, true); + + uint256 bridgeNativeTokenBalanceBefore = nativeToken.balanceOf(address(bridge)); + uint256 userTokenBalanceBefore = nativeToken.balanceOf(address(user)); + + // call params + uint256 withdrawalAmount = 15; + bytes memory data = ""; + + // expect event + vm.expectEmit(true, true, true, true); + emit BridgeCallTriggered(outbox, user, withdrawalAmount, data); + + //// execute call + vm.prank(outbox); + (bool success, ) = bridge.executeCall(user, withdrawalAmount, data); + + //// checks + assertTrue(success, "Execute call failed"); + + uint256 bridgeNativeTokenBalanceAfter = nativeToken.balanceOf(address(bridge)); + assertEq( + bridgeNativeTokenBalanceBefore - bridgeNativeTokenBalanceAfter, + withdrawalAmount, + "Invalid bridge token balance" + ); + + uint256 userTokenBalanceAfter = nativeToken.balanceOf(address(user)); + assertEq( + userTokenBalanceAfter - userTokenBalanceBefore, + withdrawalAmount, + "Invalid user token balance" + ); + } + + function test_executeCall_ExtraCall() public { + // fund bridge with native tokens + ERC20PresetMinterPauser(address(nativeToken)).mint(address(bridge), 15); + + // allow outbox + vm.prank(rollup); + bridge.setOutbox(outbox, true); + + // deploy some contract that will be call receiver + EthVault vault = new EthVault(); + + // native token balances + uint256 bridgeNativeTokenBalanceBefore = nativeToken.balanceOf(address(bridge)); + uint256 vaultNativeTokenBalanceBefore = nativeToken.balanceOf(address(vault)); + + // call params + uint256 withdrawalAmount = 15; + uint256 newVaultVersion = 7; + bytes memory data = abi.encodeWithSelector(EthVault.setVersion.selector, newVaultVersion); + + // expect event + vm.expectEmit(true, true, true, true); + emit BridgeCallTriggered(outbox, address(vault), withdrawalAmount, data); + + //// execute call + vm.prank(outbox); + (bool success, ) = bridge.executeCall({ + to: address(vault), + value: withdrawalAmount, + data: data + }); + + //// checks + assertTrue(success, "Execute call failed"); + assertEq(vault.version(), newVaultVersion, "Invalid newVaultVersion"); + + uint256 bridgeNativeTokenBalanceAfter = nativeToken.balanceOf(address(bridge)); + assertEq( + bridgeNativeTokenBalanceBefore - bridgeNativeTokenBalanceAfter, + withdrawalAmount, + "Invalid bridge native token balance" + ); + + uint256 vaultNativeTokenBalanceAfter = nativeToken.balanceOf(address(vault)); + assertEq( + vaultNativeTokenBalanceAfter - vaultNativeTokenBalanceBefore, + withdrawalAmount, + "Invalid vault native token balance" + ); + } + + function test_executeCall_UnsuccessfulExtraCall() public { + // fund bridge with native tokens + ERC20PresetMinterPauser(address(nativeToken)).mint(address(bridge), 15); + + // allow outbox + vm.prank(rollup); + bridge.setOutbox(outbox, true); + + // deploy some contract that will be call receiver + EthVault vault = new EthVault(); + + // native token balances + uint256 bridgeNativeTokenBalanceBefore = nativeToken.balanceOf(address(bridge)); + uint256 vaultNativeTokenBalanceBefore = nativeToken.balanceOf(address(vault)); + + // call params + uint256 withdrawalAmount = 15; + bytes memory data = abi.encodeWithSelector(EthVault.justRevert.selector); + + // expect event + vm.expectEmit(true, true, true, true); + emit BridgeCallTriggered(outbox, address(vault), withdrawalAmount, data); + + //// execute call - do call which reverts + vm.prank(outbox); + (bool success, bytes memory returnData) = bridge.executeCall({ + to: address(vault), + value: withdrawalAmount, + data: data + }); + + //// checks + assertEq(success, false, "Execute shall be unsuccessful"); + assertEq(vault.version(), 0, "Invalid vaultVersion"); + + // get and assert revert reason + assembly { + returnData := add(returnData, 0x04) + } + string memory revertReason = abi.decode(returnData, (string)); + assertEq(revertReason, "bye", "Invalid revert reason"); + + // bridge successfully sent native token even though extra call was unsuccessful (we didn't revert it) + uint256 bridgeNativeTokenBalanceAfter = nativeToken.balanceOf(address(bridge)); + assertEq( + bridgeNativeTokenBalanceBefore - bridgeNativeTokenBalanceAfter, + withdrawalAmount, + "Invalid bridge native token balance after unsuccessful extra call" + ); + + // vault successfully recieved native token even though extra call was unsuccessful (we didn't revert it) + uint256 vaultNativeTokenBalanceAfter = nativeToken.balanceOf(address(vault)); + assertEq( + vaultNativeTokenBalanceAfter - vaultNativeTokenBalanceBefore, + withdrawalAmount, + "Invalid vault native token balance after unsuccessful call" + ); + } + + function test_executeCall_UnsuccessfulNativeTokenTransfer() public { + // fund bridge with native tokens + ERC20PresetMinterPauser(address(nativeToken)).mint(address(bridge), 15); + + // allow outbox + vm.prank(rollup); + bridge.setOutbox(outbox, true); + + // deploy some contract that will be call receiver + EthVault vault = new EthVault(); + + // call params + uint256 withdrawalAmount = 100_000_000; + uint256 newVaultVersion = 9; + bytes memory data = abi.encodeWithSelector(EthVault.setVersion.selector, newVaultVersion); + + //// execute call - do call which reverts on native token transfer due to invalid amount + vm.prank(outbox); + vm.expectRevert("ERC20: transfer amount exceeds balance"); + bridge.executeCall({to: address(vault), value: withdrawalAmount, data: data}); + } + + function test_executeCall_revert_NotOutbox() public { + vm.expectRevert(abi.encodeWithSelector(NotOutbox.selector, address(this))); + bridge.executeCall({to: user, value: 10, data: ""}); + } + + function test_executeCall_revert_NotContract() public { + // allow outbox + vm.prank(rollup); + bridge.setOutbox(outbox, true); + + // executeCall shall revert when 'to' is not contract + address to = address(234); + vm.expectRevert(abi.encodeWithSelector(NotContract.selector, address(to))); + vm.prank(outbox); + bridge.executeCall({to: to, value: 10, data: "some data"}); + } + + function test_executeCall_revert_CallTargetNotAllowed() public { + // allow outbox + vm.prank(rollup); + bridge.setOutbox(outbox, true); + + // executeCall shall revert when 'to' is not contract + address to = address(nativeToken); + vm.expectRevert(abi.encodeWithSelector(CallTargetNotAllowed.selector, to)); + vm.prank(outbox); + bridge.executeCall({to: to, value: 10, data: "some data"}); + } +} \ No newline at end of file diff --git a/test/foundry/ERC20BridgeCreator.t.sol b/test/foundry/ERC20BridgeCreator.t.sol new file mode 100644 index 00000000..b341f40a --- /dev/null +++ b/test/foundry/ERC20BridgeCreator.t.sol @@ -0,0 +1,113 @@ +// SPDX-License-Identifier: UNLICENSED +pragma solidity ^0.8.4; + +import "forge-std/Test.sol"; +import "./util/TestUtil.sol"; +import "../../src/rollup/ERC20BridgeCreator.sol"; +import "../../src/bridge/ISequencerInbox.sol"; +import "../../src/bridge/AbsInbox.sol"; +import "@openzeppelin/contracts/token/ERC20/ERC20.sol"; +import "@openzeppelin/contracts/token/ERC20/presets/ERC20PresetFixedSupply.sol"; + +contract ERC20BridgeCreatorTest is Test { + ERC20BridgeCreator public creator; + address public owner = address(100); + + function setUp() public { + vm.prank(owner); + creator = new ERC20BridgeCreator(); + } + + /* solhint-disable func-name-mixedcase */ + function test_constructor() public { + assertTrue(address(creator.bridgeTemplate()) != address(0), "Bridge not created"); + assertTrue(address(creator.sequencerInboxTemplate()) != address(0), "SeqInbox not created"); + assertTrue(address(creator.inboxTemplate()) != address(0), "Inbox not created"); + assertTrue( + address(creator.rollupEventInboxTemplate()) != address(0), + "Event inbox not created" + ); + assertTrue(address(creator.outboxTemplate()) != address(0), "Outbox not created"); + } + + function test_updateTemplates() public { + address bridge = address(200); + address sequencerInbox = address(201); + address inbox = address(202); + address rollupEventInbox = address(203); + address outbox = address(204); + + vm.prank(owner); + creator.updateTemplates(bridge, sequencerInbox, inbox, rollupEventInbox, outbox); + + assertEq(address(creator.bridgeTemplate()), bridge, "Invalid bridge"); + assertEq(address(creator.sequencerInboxTemplate()), sequencerInbox, "Invalid seqInbox"); + assertEq(address(creator.inboxTemplate()), inbox, "Invalid inbox"); + assertEq( + address(creator.rollupEventInboxTemplate()), + rollupEventInbox, + "Invalid rollup event inbox" + ); + assertEq(address(creator.outboxTemplate()), outbox, "Invalid outbox"); + } + + function test_createBridge() public { + address proxyAdmin = address(300); + address rollup = address(301); + address nativeToken = address( + new ERC20PresetFixedSupply("Appchain Token", "App", 1_000_000, address(this)) + ); + ISequencerInbox.MaxTimeVariation memory timeVars = ISequencerInbox.MaxTimeVariation( + 10, + 20, + 30, + 40 + ); + timeVars.delayBlocks; + + ( + IBridge bridge, + SequencerInbox seqInbox, + IInbox inbox, + IRollupEventInbox eventInbox, + Outbox outbox + ) = creator.createBridge(proxyAdmin, rollup, nativeToken, timeVars); + + // bridge + assertEq(address(bridge.rollup()), rollup, "Invalid rollup ref"); + assertEq( + address(IERC20Bridge(address(bridge)).nativeToken()), + nativeToken, + "Invalid nativeToken ref" + ); + assertEq(bridge.activeOutbox(), address(0), "Invalid activeOutbox ref"); + + // seqInbox + assertEq(address(seqInbox.bridge()), address(bridge), "Invalid bridge ref"); + assertEq(address(seqInbox.rollup()), rollup, "Invalid rollup ref"); + ( + uint256 _delayBlocks, + uint256 _futureBlocks, + uint256 _delaySeconds, + uint256 _futureSeconds + ) = seqInbox.maxTimeVariation(); + assertEq(_delayBlocks, timeVars.delayBlocks, "Invalid delayBlocks"); + assertEq(_futureBlocks, timeVars.futureBlocks, "Invalid futureBlocks"); + assertEq(_delaySeconds, timeVars.delaySeconds, "Invalid delaySeconds"); + assertEq(_futureSeconds, timeVars.futureSeconds, "Invalid futureSeconds"); + + // inbox + assertEq(address(inbox.bridge()), address(bridge), "Invalid bridge ref"); + assertEq(address(inbox.sequencerInbox()), address(seqInbox), "Invalid seqInbox ref"); + assertEq(inbox.allowListEnabled(), false, "Invalid allowListEnabled"); + assertEq(AbsInbox(address(inbox)).paused(), false, "Invalid paused status"); + + // rollup event inbox + assertEq(address(eventInbox.bridge()), address(bridge), "Invalid bridge ref"); + assertEq(address(eventInbox.rollup()), rollup, "Invalid rollup ref"); + + // outbox + assertEq(address(outbox.bridge()), address(bridge), "Invalid bridge ref"); + assertEq(address(outbox.rollup()), rollup, "Invalid rollup ref"); + } +} \ No newline at end of file diff --git a/test/foundry/ERC20Inbox.t.sol b/test/foundry/ERC20Inbox.t.sol new file mode 100644 index 00000000..cacc5b33 --- /dev/null +++ b/test/foundry/ERC20Inbox.t.sol @@ -0,0 +1,661 @@ +// SPDX-License-Identifier: UNLICENSED +pragma solidity ^0.8.4; + +import "./AbsInbox.t.sol"; +import "./util/TestUtil.sol"; +import "../../src/bridge/ERC20Bridge.sol"; +import "../../src/bridge/ERC20Inbox.sol"; +import "../../src/bridge/ISequencerInbox.sol"; +import "../../src/libraries/AddressAliasHelper.sol"; +import "@openzeppelin/contracts/token/ERC20/ERC20.sol"; +import "@openzeppelin/contracts/token/ERC20/presets/ERC20PresetMinterPauser.sol"; + +contract ERC20InboxTest is AbsInboxTest { + IERC20 public nativeToken; + IERC20Inbox public erc20Inbox; + + function setUp() public { + // deploy token, bridge and inbox + nativeToken = new ERC20PresetMinterPauser("Appchain Token", "App"); + bridge = IBridge(TestUtil.deployProxy(address(new ERC20Bridge()))); + inbox = IInbox(TestUtil.deployProxy(address(new ERC20Inbox()))); + erc20Inbox = IERC20Inbox(address(inbox)); + + // init bridge and inbox + IERC20Bridge(address(bridge)).initialize(IOwnable(rollup), address(nativeToken)); + inbox.initialize(bridge, ISequencerInbox(seqInbox)); + vm.prank(rollup); + bridge.setDelayedInbox(address(inbox), true); + + // fund user account + ERC20PresetMinterPauser(address(nativeToken)).mint(user, 1_000 ether); + } + + /* solhint-disable func-name-mixedcase */ + function test_initialize() public { + assertEq(address(inbox.bridge()), address(bridge), "Invalid bridge ref"); + assertEq(address(inbox.sequencerInbox()), seqInbox, "Invalid seqInbox ref"); + assertEq(inbox.allowListEnabled(), false, "Invalid allowListEnabled"); + assertEq((PausableUpgradeable(address(inbox))).paused(), false, "Invalid paused state"); + + assertEq(IERC20(nativeToken).allowance(address(inbox), address(bridge)), type(uint256).max); + } + + function test_depositERC20_FromEOA() public { + uint256 depositAmount = 300; + + uint256 bridgeTokenBalanceBefore = nativeToken.balanceOf(address(bridge)); + uint256 userTokenBalanceBefore = nativeToken.balanceOf(address(user)); + uint256 delayedMsgCountBefore = bridge.delayedMessageCount(); + + // approve inbox to fetch tokens + vm.prank(user); + nativeToken.approve(address(inbox), depositAmount); + + // expect event + vm.expectEmit(true, true, true, true); + emit InboxMessageDelivered(0, abi.encodePacked(user, depositAmount)); + + // deposit tokens -> tx.origin == msg.sender + vm.prank(user, user); + erc20Inbox.depositERC20(depositAmount); + + //// checks + + uint256 bridgeTokenBalanceAfter = nativeToken.balanceOf(address(bridge)); + assertEq( + bridgeTokenBalanceAfter - bridgeTokenBalanceBefore, + depositAmount, + "Invalid bridge token balance" + ); + + uint256 userTokenBalanceAfter = nativeToken.balanceOf(address(user)); + assertEq( + userTokenBalanceBefore - userTokenBalanceAfter, + depositAmount, + "Invalid user token balance" + ); + + uint256 delayedMsgCountAfter = bridge.delayedMessageCount(); + assertEq(delayedMsgCountAfter - delayedMsgCountBefore, 1, "Invalid delayed message count"); + } + + function test_depositERC20_FromEOA_InboxPrefunded() public { + uint256 depositAmount = 300; + + uint256 bridgeTokenBalanceBefore = nativeToken.balanceOf(address(bridge)); + uint256 userTokenBalanceBefore = nativeToken.balanceOf(address(user)); + uint256 delayedMsgCountBefore = bridge.delayedMessageCount(); + + // prefund inbox with native token amount needed to pay for fees + ERC20PresetMinterPauser(address(nativeToken)).mint(address(inbox), depositAmount); + + // expect event + vm.expectEmit(true, true, true, true); + emit InboxMessageDelivered(0, abi.encodePacked(user, depositAmount)); + + // deposit tokens -> tx.origin == msg.sender + vm.prank(user, user); + erc20Inbox.depositERC20(depositAmount); + + //// checks + + uint256 bridgeTokenBalanceAfter = nativeToken.balanceOf(address(bridge)); + assertEq( + bridgeTokenBalanceAfter - bridgeTokenBalanceBefore, + depositAmount, + "Invalid bridge token balance" + ); + + uint256 userTokenBalanceAfter = nativeToken.balanceOf(address(user)); + assertEq(userTokenBalanceBefore, userTokenBalanceAfter, "Invalid user token balance"); + + uint256 delayedMsgCountAfter = bridge.delayedMessageCount(); + assertEq(delayedMsgCountAfter - delayedMsgCountBefore, 1, "Invalid delayed message count"); + } + + function test_depositERC20_FromContract() public { + uint256 depositAmount = 300; + + uint256 bridgeTokenBalanceBefore = nativeToken.balanceOf(address(bridge)); + uint256 userTokenBalanceBefore = nativeToken.balanceOf(address(user)); + uint256 delayedMsgCountBefore = bridge.delayedMessageCount(); + + // approve inbox to fetch tokens + vm.prank(user); + nativeToken.approve(address(inbox), depositAmount); + + // expect event + vm.expectEmit(true, true, true, true); + emit InboxMessageDelivered( + 0, + abi.encodePacked(AddressAliasHelper.applyL1ToL2Alias(user), depositAmount) + ); + + // deposit tokens -> tx.origin != msg.sender + vm.prank(user); + erc20Inbox.depositERC20(depositAmount); + + //// checks + + uint256 bridgeTokenBalanceAfter = nativeToken.balanceOf(address(bridge)); + assertEq( + bridgeTokenBalanceAfter - bridgeTokenBalanceBefore, + depositAmount, + "Invalid bridge token balance" + ); + + uint256 userTokenBalanceAfter = nativeToken.balanceOf(address(user)); + assertEq( + userTokenBalanceBefore - userTokenBalanceAfter, + depositAmount, + "Invalid user token balance" + ); + + uint256 delayedMsgCountAfter = bridge.delayedMessageCount(); + assertEq(delayedMsgCountAfter - delayedMsgCountBefore, 1, "Invalid delayed message count"); + } + + function test_depositERC20_revert_NativeTokenTransferFails() public { + uint256 bridgeTokenBalanceBefore = nativeToken.balanceOf(address(bridge)); + uint256 userTokenBalanceBefore = nativeToken.balanceOf(address(user)); + + // deposit tokens + vm.prank(user); + uint256 invalidDepositAmount = 1_000_000; + vm.expectRevert("ERC20: insufficient allowance"); + erc20Inbox.depositERC20(invalidDepositAmount); + + //// checks + + uint256 bridgeTokenBalanceAfter = nativeToken.balanceOf(address(bridge)); + assertEq(bridgeTokenBalanceAfter, bridgeTokenBalanceBefore, "Invalid bridge token balance"); + + uint256 userTokenBalanceAfter = nativeToken.balanceOf(address(user)); + assertEq(userTokenBalanceBefore, userTokenBalanceAfter, "Invalid user token balance"); + + assertEq(bridge.delayedMessageCount(), 0, "Invalid delayed message count"); + } + + function test_createRetryableTicket_FromEOA() public { + uint256 bridgeTokenBalanceBefore = nativeToken.balanceOf(address(bridge)); + uint256 userTokenBalanceBefore = nativeToken.balanceOf(address(user)); + + uint256 tokenTotalFeeAmount = 300; + + // approve inbox to fetch tokens + vm.prank(user); + nativeToken.approve(address(inbox), tokenTotalFeeAmount); + + // retyrable params + uint256 l2CallValue = 10; + uint256 maxSubmissionCost = 0; + uint256 gasLimit = 100; + uint256 maxFeePerGas = 2; + bytes memory data = abi.encodePacked("some msg"); + + // expect event + vm.expectEmit(true, true, true, true); + emit InboxMessageDelivered( + 0, + abi.encodePacked( + uint256(uint160(user)), + l2CallValue, + tokenTotalFeeAmount, + maxSubmissionCost, + uint256(uint160(user)), + uint256(uint160(user)), + gasLimit, + maxFeePerGas, + data.length, + data + ) + ); + + // create retryable -> tx.origin == msg.sender + vm.prank(user, user); + erc20Inbox.createRetryableTicket({ + to: address(user), + l2CallValue: l2CallValue, + maxSubmissionCost: maxSubmissionCost, + excessFeeRefundAddress: user, + callValueRefundAddress: user, + gasLimit: gasLimit, + maxFeePerGas: maxFeePerGas, + tokenTotalFeeAmount: tokenTotalFeeAmount, + data: data + }); + + //// checks + + uint256 bridgeTokenBalanceAfter = nativeToken.balanceOf(address(bridge)); + assertEq( + bridgeTokenBalanceAfter - bridgeTokenBalanceBefore, + tokenTotalFeeAmount, + "Invalid bridge token balance" + ); + + uint256 userTokenBalanceAfter = nativeToken.balanceOf(address(user)); + assertEq( + userTokenBalanceBefore - userTokenBalanceAfter, + tokenTotalFeeAmount, + "Invalid user token balance" + ); + + assertEq(bridge.delayedMessageCount(), 1, "Invalid delayed message count"); + } + + function test_createRetryableTicket_FromContract() public { + address sender = address(new Sender()); + ERC20PresetMinterPauser(address(nativeToken)).mint(address(sender), 1_000); + + uint256 bridgeTokenBalanceBefore = nativeToken.balanceOf(address(bridge)); + uint256 senderTokenBalanceBefore = nativeToken.balanceOf(address(sender)); + + uint256 tokenTotalFeeAmount = 300; + + // approve inbox to fetch tokens + vm.prank(sender); + nativeToken.approve(address(inbox), tokenTotalFeeAmount); + + // retyrable params + uint256 l2CallValue = 10; + uint256 maxSubmissionCost = 0; + uint256 gasLimit = 100; + uint256 maxFeePerGas = 2; + bytes memory data = abi.encodePacked("some msg"); + + // expect event + uint256 uintAlias = uint256(uint160(AddressAliasHelper.applyL1ToL2Alias(sender))); + vm.expectEmit(true, true, true, true); + emit InboxMessageDelivered( + 0, + abi.encodePacked( + uint256(uint160(sender)), + l2CallValue, + tokenTotalFeeAmount, + maxSubmissionCost, + uintAlias, + uintAlias, + gasLimit, + maxFeePerGas, + data.length, + data + ) + ); + + // create retryable + vm.prank(sender); + erc20Inbox.createRetryableTicket({ + to: sender, + l2CallValue: l2CallValue, + maxSubmissionCost: maxSubmissionCost, + excessFeeRefundAddress: sender, + callValueRefundAddress: sender, + gasLimit: gasLimit, + maxFeePerGas: maxFeePerGas, + tokenTotalFeeAmount: tokenTotalFeeAmount, + data: data + }); + + //// checks + + uint256 bridgeTokenBalanceAfter = nativeToken.balanceOf(address(bridge)); + assertEq( + bridgeTokenBalanceAfter - bridgeTokenBalanceBefore, + tokenTotalFeeAmount, + "Invalid bridge token balance" + ); + + uint256 senderTokenBalanceAfter = nativeToken.balanceOf(sender); + assertEq( + senderTokenBalanceBefore - senderTokenBalanceAfter, + tokenTotalFeeAmount, + "Invalid sender token balance" + ); + + assertEq(bridge.delayedMessageCount(), 1, "Invalid delayed message count"); + } + + function test_createRetryableTicket_revert_WhenPaused() public { + vm.prank(rollup); + inbox.pause(); + + vm.expectRevert("Pausable: paused"); + erc20Inbox.createRetryableTicket({ + to: user, + l2CallValue: 100, + maxSubmissionCost: 0, + excessFeeRefundAddress: user, + callValueRefundAddress: user, + gasLimit: 10, + maxFeePerGas: 1, + tokenTotalFeeAmount: 200, + data: abi.encodePacked("data") + }); + } + + function test_createRetryableTicket_revert_OnlyAllowed() public { + vm.prank(rollup); + inbox.setAllowListEnabled(true); + + vm.prank(user, user); + vm.expectRevert(abi.encodeWithSelector(NotAllowedOrigin.selector, user)); + erc20Inbox.createRetryableTicket({ + to: user, + l2CallValue: 100, + maxSubmissionCost: 0, + excessFeeRefundAddress: user, + callValueRefundAddress: user, + gasLimit: 10, + maxFeePerGas: 1, + tokenTotalFeeAmount: 200, + data: abi.encodePacked("data") + }); + } + + function test_createRetryableTicket_revert_InsufficientValue() public { + uint256 tooSmallTokenTotalFeeAmount = 3; + uint256 l2CallValue = 100; + uint256 maxSubmissionCost = 0; + uint256 gasLimit = 10; + uint256 maxFeePerGas = 1; + + vm.prank(user, user); + vm.expectRevert( + abi.encodeWithSelector( + InsufficientValue.selector, + maxSubmissionCost + l2CallValue + gasLimit * maxFeePerGas, + tooSmallTokenTotalFeeAmount + ) + ); + erc20Inbox.createRetryableTicket({ + to: user, + l2CallValue: l2CallValue, + maxSubmissionCost: maxSubmissionCost, + excessFeeRefundAddress: user, + callValueRefundAddress: user, + gasLimit: gasLimit, + maxFeePerGas: maxFeePerGas, + tokenTotalFeeAmount: tooSmallTokenTotalFeeAmount, + data: abi.encodePacked("data") + }); + } + + function test_createRetryableTicket_revert_RetryableDataTracer() public { + uint256 tokenTotalFeeAmount = 300; + uint256 l2CallValue = 100; + uint256 maxSubmissionCost = 0; + uint256 gasLimit = 10; + uint256 maxFeePerGas = 1; + bytes memory data = abi.encodePacked("xy"); + + // revert as maxFeePerGas == 1 is magic value + vm.prank(user, user); + vm.expectRevert( + abi.encodeWithSelector( + RetryableData.selector, + user, + user, + l2CallValue, + tokenTotalFeeAmount, + maxSubmissionCost, + user, + user, + gasLimit, + maxFeePerGas, + data + ) + ); + erc20Inbox.createRetryableTicket({ + to: user, + l2CallValue: l2CallValue, + maxSubmissionCost: maxSubmissionCost, + excessFeeRefundAddress: user, + callValueRefundAddress: user, + gasLimit: gasLimit, + maxFeePerGas: maxFeePerGas, + tokenTotalFeeAmount: tokenTotalFeeAmount, + data: data + }); + + gasLimit = 1; + maxFeePerGas = 2; + + // revert as gasLimit == 1 is magic value + vm.prank(user, user); + vm.expectRevert( + abi.encodeWithSelector( + RetryableData.selector, + user, + user, + l2CallValue, + tokenTotalFeeAmount, + maxSubmissionCost, + user, + user, + gasLimit, + maxFeePerGas, + data + ) + ); + erc20Inbox.createRetryableTicket({ + to: user, + l2CallValue: l2CallValue, + maxSubmissionCost: maxSubmissionCost, + excessFeeRefundAddress: user, + callValueRefundAddress: user, + gasLimit: gasLimit, + maxFeePerGas: maxFeePerGas, + tokenTotalFeeAmount: tokenTotalFeeAmount, + data: data + }); + } + + function test_createRetryableTicket_revert_GasLimitTooLarge() public { + uint256 tooBigGasLimit = uint256(type(uint64).max) + 1; + + vm.prank(user, user); + vm.expectRevert(GasLimitTooLarge.selector); + erc20Inbox.createRetryableTicket({ + to: user, + l2CallValue: 100, + maxSubmissionCost: 0, + excessFeeRefundAddress: user, + callValueRefundAddress: user, + gasLimit: tooBigGasLimit, + maxFeePerGas: 2, + tokenTotalFeeAmount: uint256(type(uint64).max) * 3, + data: abi.encodePacked("data") + }); + } + + function test_unsafeCreateRetryableTicket_FromEOA() public { + uint256 bridgeTokenBalanceBefore = nativeToken.balanceOf(address(bridge)); + uint256 userTokenBalanceBefore = nativeToken.balanceOf(address(user)); + + uint256 tokenTotalFeeAmount = 300; + + // approve inbox to fetch tokens + vm.prank(user); + nativeToken.approve(address(inbox), tokenTotalFeeAmount); + + // retyrable params + uint256 l2CallValue = 10; + uint256 maxSubmissionCost = 0; + uint256 gasLimit = 100; + uint256 maxFeePerGas = 2; + bytes memory data = abi.encodePacked("some msg"); + + // expect event + vm.expectEmit(true, true, true, true); + emit InboxMessageDelivered( + 0, + abi.encodePacked( + uint256(uint160(user)), + l2CallValue, + tokenTotalFeeAmount, + maxSubmissionCost, + uint256(uint160(user)), + uint256(uint160(user)), + gasLimit, + maxFeePerGas, + data.length, + data + ) + ); + + // create retryable -> tx.origin == msg.sender + vm.prank(user, user); + erc20Inbox.unsafeCreateRetryableTicket({ + to: address(user), + l2CallValue: l2CallValue, + maxSubmissionCost: maxSubmissionCost, + excessFeeRefundAddress: user, + callValueRefundAddress: user, + gasLimit: gasLimit, + maxFeePerGas: maxFeePerGas, + tokenTotalFeeAmount: tokenTotalFeeAmount, + data: data + }); + + //// checks + + uint256 bridgeTokenBalanceAfter = nativeToken.balanceOf(address(bridge)); + assertEq( + bridgeTokenBalanceAfter - bridgeTokenBalanceBefore, + tokenTotalFeeAmount, + "Invalid bridge token balance" + ); + + uint256 userTokenBalanceAfter = nativeToken.balanceOf(address(user)); + assertEq( + userTokenBalanceBefore - userTokenBalanceAfter, + tokenTotalFeeAmount, + "Invalid user token balance" + ); + + assertEq(bridge.delayedMessageCount(), 1, "Invalid delayed message count"); + } + + function test_unsafeCreateRetryableTicket_FromContract() public { + address sender = address(new Sender()); + ERC20PresetMinterPauser(address(nativeToken)).mint(address(sender), 1_000); + + uint256 bridgeTokenBalanceBefore = nativeToken.balanceOf(address(bridge)); + uint256 senderTokenBalanceBefore = nativeToken.balanceOf(address(sender)); + + uint256 tokenTotalFeeAmount = 300; + + // approve inbox to fetch tokens + vm.prank(sender); + nativeToken.approve(address(inbox), tokenTotalFeeAmount); + + // retyrable params + uint256 l2CallValue = 10; + uint256 maxSubmissionCost = 0; + uint256 gasLimit = 100; + uint256 maxFeePerGas = 2; + bytes memory data = abi.encodePacked("some msg"); + + // expect event (address shall not be aliased) + vm.expectEmit(true, true, true, true); + emit InboxMessageDelivered( + 0, + abi.encodePacked( + uint256(uint160(sender)), + l2CallValue, + tokenTotalFeeAmount, + maxSubmissionCost, + uint256(uint160(sender)), + uint256(uint160(sender)), + gasLimit, + maxFeePerGas, + data.length, + data + ) + ); + + // create retryable + vm.prank(sender); + erc20Inbox.unsafeCreateRetryableTicket({ + to: sender, + l2CallValue: l2CallValue, + maxSubmissionCost: maxSubmissionCost, + excessFeeRefundAddress: sender, + callValueRefundAddress: sender, + gasLimit: gasLimit, + maxFeePerGas: maxFeePerGas, + tokenTotalFeeAmount: tokenTotalFeeAmount, + data: data + }); + + //// checks + + uint256 bridgeTokenBalanceAfter = nativeToken.balanceOf(address(bridge)); + assertEq( + bridgeTokenBalanceAfter - bridgeTokenBalanceBefore, + tokenTotalFeeAmount, + "Invalid bridge token balance" + ); + + uint256 senderTokenBalanceAfter = nativeToken.balanceOf(sender); + assertEq( + senderTokenBalanceBefore - senderTokenBalanceAfter, + tokenTotalFeeAmount, + "Invalid sender token balance" + ); + + assertEq(bridge.delayedMessageCount(), 1, "Invalid delayed message count"); + } + + function test_unsafeCreateRetryableTicket_NotRevertingOnInsufficientValue() public { + uint256 tooSmallTokenTotalFeeAmount = 3; + uint256 l2CallValue = 100; + uint256 maxSubmissionCost = 0; + uint256 gasLimit = 10; + uint256 maxFeePerGas = 2; + + uint256 bridgeTokenBalanceBefore = nativeToken.balanceOf(address(bridge)); + uint256 userTokenBalanceBefore = nativeToken.balanceOf(address(user)); + + // approve inbox to fetch tokens + vm.prank(user); + nativeToken.approve(address(inbox), tooSmallTokenTotalFeeAmount); + + vm.prank(user, user); + erc20Inbox.unsafeCreateRetryableTicket({ + to: user, + l2CallValue: l2CallValue, + maxSubmissionCost: maxSubmissionCost, + excessFeeRefundAddress: user, + callValueRefundAddress: user, + gasLimit: gasLimit, + maxFeePerGas: maxFeePerGas, + tokenTotalFeeAmount: tooSmallTokenTotalFeeAmount, + data: abi.encodePacked("data") + }); + + //// checks + + uint256 bridgeTokenBalanceAfter = nativeToken.balanceOf(address(bridge)); + assertEq( + bridgeTokenBalanceAfter - bridgeTokenBalanceBefore, + tooSmallTokenTotalFeeAmount, + "Invalid bridge token balance" + ); + + uint256 userTokenBalanceAfter = nativeToken.balanceOf(address(user)); + assertEq( + userTokenBalanceBefore - userTokenBalanceAfter, + tooSmallTokenTotalFeeAmount, + "Invalid user token balance" + ); + + assertEq(bridge.delayedMessageCount(), 1, "Invalid delayed message count"); + } + + function test_calculateRetryableSubmissionFee() public { + assertEq(inbox.calculateRetryableSubmissionFee(1, 2), 0, "Invalid ERC20 submission fee"); + } +} \ No newline at end of file diff --git a/test/foundry/ERC20Outbox.t.sol b/test/foundry/ERC20Outbox.t.sol new file mode 100644 index 00000000..b716d5e3 --- /dev/null +++ b/test/foundry/ERC20Outbox.t.sol @@ -0,0 +1,179 @@ +// SPDX-License-Identifier: UNLICENSED +pragma solidity ^0.8.4; + +import "./AbsOutbox.t.sol"; +import "../../src/bridge/ERC20Bridge.sol"; +import "../../src/bridge/ERC20Outbox.sol"; +import "@openzeppelin/contracts/token/ERC20/ERC20.sol"; +import "@openzeppelin/contracts/token/ERC20/presets/ERC20PresetFixedSupply.sol"; + +contract ERC20OutboxTest is AbsOutboxTest { + ERC20Outbox public erc20Outbox; + ERC20Bridge public erc20Bridge; + IERC20 public nativeToken; + + function setUp() public { + // deploy token, bridge and outbox + nativeToken = new ERC20PresetFixedSupply("Appchain Token", "App", 1_000_000, address(this)); + bridge = IBridge(TestUtil.deployProxy(address(new ERC20Bridge()))); + erc20Bridge = ERC20Bridge(address(bridge)); + outbox = IOutbox(TestUtil.deployProxy(address(new ERC20Outbox()))); + erc20Outbox = ERC20Outbox(address(outbox)); + + // init bridge and outbox + erc20Bridge.initialize(IOwnable(rollup), address(nativeToken)); + erc20Outbox.initialize(IBridge(bridge)); + + vm.prank(rollup); + bridge.setOutbox(address(outbox), true); + + // fund user account + nativeToken.transfer(user, 1_000); + } + + function test_initialize_WithdrawalAmount() public { + assertEq(erc20Outbox.l2ToL1WithdrawalAmount(), 0, "Invalid withdrawalAmount"); + } + + function test_executeTransaction() public { + // fund bridge with some tokens + vm.startPrank(user); + nativeToken.approve(address(bridge), 100); + nativeToken.transfer(address(bridge), 100); + vm.stopPrank(); + + // store root + vm.prank(rollup); + outbox.updateSendRoot( + 0x7e87df146feb0900d5a441d1d081867190b34395307698f4e879c8164cd9a7f9, + 0x7e87df146feb0900d5a441d1d081867190b34395307698f4e879c8164cd9a7f9 + ); + + // create msg receiver on L1 + ERC20L2ToL1Target target = new ERC20L2ToL1Target(); + target.setOutbox(address(outbox)); + + //// execute transaction + uint256 bridgeTokenBalanceBefore = nativeToken.balanceOf(address(bridge)); + uint256 targetTokenBalanceBefore = nativeToken.balanceOf(address(target)); + + bytes32[] memory proof = new bytes32[](5); + proof[0] = bytes32(0x1216ff070e3c87b032d79b298a3e98009ddd13bf8479b843e225857ca5f950e7); + proof[1] = bytes32(0x2b5ee8f4bd7664ca0cf31d7ab86119b63f6ff07bb86dbd5af356d0087492f686); + proof[2] = bytes32(0x0aa797064e0f3768bbac0a02ce031c4f282441a9cd8c669086cf59a083add893); + proof[3] = bytes32(0xc7aac0aad5108a46ac9879f0b1870fd0cbc648406f733eb9d0b944a18c32f0f8); + proof[4] = bytes32(0x477ce2b0bc8035ae3052b7339c7496531229bd642bb1871d81618cf93a4d2d1a); + + uint256 withdrawalAmount = 15; + bytes memory data = abi.encodeWithSignature("receiveHook()"); + outbox.executeTransaction({ + proof: proof, + index: 12, + l2Sender: user, + to: address(target), + l2Block: 300, + l1Block: 20, + l2Timestamp: 1234, + value: withdrawalAmount, + data: data + }); + + uint256 bridgeTokenBalanceAfter = nativeToken.balanceOf(address(bridge)); + assertEq( + bridgeTokenBalanceBefore - bridgeTokenBalanceAfter, + withdrawalAmount, + "Invalid bridge token balance" + ); + + uint256 targetTokenBalanceAfter = nativeToken.balanceOf(address(target)); + assertEq( + targetTokenBalanceAfter - targetTokenBalanceBefore, + withdrawalAmount, + "Invalid target token balance" + ); + + /// check context was properly set during execution + assertEq(uint256(target.l2Block()), 300, "Invalid l2Block"); + assertEq(uint256(target.timestamp()), 1234, "Invalid timestamp"); + assertEq(uint256(target.outputId()), 12, "Invalid outputId"); + assertEq(target.sender(), user, "Invalid sender"); + assertEq(uint256(target.l1Block()), 20, "Invalid l1Block"); + assertEq(uint256(target.withdrawalAmount()), withdrawalAmount, "Invalid withdrawalAmount"); + } + + function test_executeTransaction_revert_CallTargetNotAllowed() public { + // // fund bridge with some tokens + vm.startPrank(user); + nativeToken.approve(address(bridge), 100); + nativeToken.transfer(address(bridge), 100); + vm.stopPrank(); + + // store root + vm.prank(rollup); + outbox.updateSendRoot( + 0x5b6cd410f78e45e55eeb02133b8e72e6ca122c59b667eed4f214e374d808058e, + 0x5b6cd410f78e45e55eeb02133b8e72e6ca122c59b667eed4f214e374d808058e + ); + + //// execute transaction + uint256 bridgeTokenBalanceBefore = nativeToken.balanceOf(address(bridge)); + uint256 userTokenBalanceBefore = nativeToken.balanceOf(address(user)); + + bytes32[] memory proof = new bytes32[](5); + proof[0] = bytes32(0x1216ff070e3c87b032d79b298a3e98009ddd13bf8479b843e225857ca5f950e7); + proof[1] = bytes32(0x2b5ee8f4bd7664ca0cf31d7ab86119b63f6ff07bb86dbd5af356d0087492f686); + proof[2] = bytes32(0x0aa797064e0f3768bbac0a02ce031c4f282441a9cd8c669086cf59a083add893); + proof[3] = bytes32(0xc7aac0aad5108a46ac9879f0b1870fd0cbc648406f733eb9d0b944a18c32f0f8); + proof[4] = bytes32(0x477ce2b0bc8035ae3052b7339c7496531229bd642bb1871d81618cf93a4d2d1a); + + uint256 withdrawalAmount = 15; + + address invalidTarget = address(nativeToken); + + vm.expectRevert(abi.encodeWithSelector(CallTargetNotAllowed.selector, invalidTarget)); + outbox.executeTransaction({ + proof: proof, + index: 12, + l2Sender: user, + to: invalidTarget, + l2Block: 300, + l1Block: 20, + l2Timestamp: 1234, + value: withdrawalAmount, + data: "" + }); + + uint256 bridgeTokenBalanceAfter = nativeToken.balanceOf(address(bridge)); + assertEq(bridgeTokenBalanceBefore, bridgeTokenBalanceAfter, "Invalid bridge token balance"); + + uint256 userTokenBalanceAfter = nativeToken.balanceOf(address(user)); + assertEq(userTokenBalanceAfter, userTokenBalanceBefore, "Invalid user token balance"); + } +} + +/** + * Contract for testing L2 to L1 msgs + */ +contract ERC20L2ToL1Target { + address public outbox; + + uint128 public l2Block; + uint128 public timestamp; + bytes32 public outputId; + address public sender; + uint96 public l1Block; + uint256 public withdrawalAmount; + + function receiveHook() external payable { + l2Block = uint128(IOutbox(outbox).l2ToL1Block()); + timestamp = uint128(IOutbox(outbox).l2ToL1Timestamp()); + outputId = IOutbox(outbox).l2ToL1OutputId(); + sender = IOutbox(outbox).l2ToL1Sender(); + l1Block = uint96(IOutbox(outbox).l2ToL1EthBlock()); + withdrawalAmount = ERC20Outbox(outbox).l2ToL1WithdrawalAmount(); + } + + function setOutbox(address _outbox) external { + outbox = _outbox; + } +} \ No newline at end of file diff --git a/test/foundry/ERC20RollupCreator.t.sol b/test/foundry/ERC20RollupCreator.t.sol new file mode 100644 index 00000000..275458d7 --- /dev/null +++ b/test/foundry/ERC20RollupCreator.t.sol @@ -0,0 +1,88 @@ +// SPDX-License-Identifier: UNLICENSED +pragma solidity ^0.8.4; + +import "forge-std/Test.sol"; +import "./util/TestUtil.sol"; +import "./AbsRollupCreator.t.sol"; +import "../../src/rollup/ERC20RollupCreator.sol"; +import "../../src/rollup/ERC20BridgeCreator.sol"; +import "@openzeppelin/contracts/token/ERC20/presets/ERC20PresetFixedSupply.sol"; + +contract ERC20RollupCreatorTest is AbsRollupCreatorTest { + address public nativeToken; + + function setUp() public { + vm.prank(deployer); + nativeToken = address( + new ERC20PresetFixedSupply("Appchain Token", "App", 1_000_000, address(this)) + ); + } + + /* solhint-disable func-name-mixedcase */ + function test_createRollup() public { + vm.startPrank(deployer); + + ERC20RollupCreator rollupCreator = new ERC20RollupCreator(); + + ( + IOneStepProofEntry ospEntry, + IChallengeManager challengeManager, + IRollupAdmin rollupAdmin, + IRollupUser rollupUser, + ISequencerInbox.MaxTimeVariation memory timeVars, + address expectedRollupAddr + ) = _prepareRollupDeployment(address(rollupCreator)); + + //// deployBridgeCreator + IBridgeCreator bridgeCreator = new ERC20BridgeCreator(); + + //// deploy creator and set logic + rollupCreator.setTemplates( + bridgeCreator, + ospEntry, + challengeManager, + rollupAdmin, + rollupUser, + address(new ValidatorUtils()), + address(new ValidatorWalletCreator()) + ); + + // deployment params + bytes32 wasmModuleRoot = keccak256("wasm"); + uint256 chainId = 1337; + + // expect deployment events + _expectEvents(rollupCreator, bridgeCreator, expectedRollupAddr, wasmModuleRoot, chainId); + + /// deploy rollup + address rollupAddress = rollupCreator.createRollup( + Config({ + confirmPeriodBlocks: 20, + extraChallengeTimeBlocks: 200, + stakeToken: address(0), + baseStake: 1000, + wasmModuleRoot: keccak256("0"), + owner: rollupOwner, + loserStakeEscrow: address(200), + chainId: chainId, + genesisBlockNum: 15000000, + sequencerInboxMaxTimeVariation: timeVars + }), + expectedRollupAddr, + nativeToken + ); + + vm.stopPrank(); + + /// common checks + _checkRollupIsSetUp(rollupCreator, rollupAddress, rollupAdmin, rollupUser); + + // native token check + IBridge bridge = RollupCore(address(rollupAddress)).bridge(); + assertEq( + IERC20Bridge(address(bridge)).nativeToken(), + nativeToken, + "Invalid native token ref" + ); + } +} \ No newline at end of file diff --git a/test/foundry/Inbox.t.sol b/test/foundry/Inbox.t.sol new file mode 100644 index 00000000..9b387286 --- /dev/null +++ b/test/foundry/Inbox.t.sol @@ -0,0 +1,637 @@ +// SPDX-License-Identifier: UNLICENSED +pragma solidity ^0.8.4; + +import "./AbsInbox.t.sol"; +import "./util/TestUtil.sol"; +import "../../src/bridge/Inbox.sol"; +import "../../src/bridge/IEthInbox.sol"; +import "../../src/bridge/Bridge.sol"; +import "../../src/bridge/ISequencerInbox.sol"; +import "../../src/libraries/AddressAliasHelper.sol"; + +contract InboxTest is AbsInboxTest { + IEthInbox public ethInbox; + + function setUp() public { + // deploy token, bridge and inbox + bridge = IBridge(TestUtil.deployProxy(address(new Bridge()))); + inbox = IInbox(TestUtil.deployProxy(address(new Inbox()))); + ethInbox = IEthInbox(address(inbox)); + + // init bridge and inbox + IEthBridge(address(bridge)).initialize(IOwnable(rollup)); + inbox.initialize(bridge, ISequencerInbox(seqInbox)); + vm.prank(rollup); + bridge.setDelayedInbox(address(inbox), true); + + // fund user account + vm.deal(user, 10 ether); + } + + /* solhint-disable func-name-mixedcase */ + function test_initialize() public { + assertEq(address(inbox.bridge()), address(bridge), "Invalid bridge ref"); + assertEq(address(inbox.sequencerInbox()), seqInbox, "Invalid seqInbox ref"); + assertEq(inbox.allowListEnabled(), false, "Invalid allowListEnabled"); + assertEq((PausableUpgradeable(address(inbox))).paused(), false, "Invalid paused state"); + } + + function test_depositEth_FromEOA() public { + uint256 depositAmount = 2 ether; + + uint256 bridgeEthBalanceBefore = address(bridge).balance; + uint256 userEthBalanceBefore = address(user).balance; + + // expect event + vm.expectEmit(true, true, true, true); + emit InboxMessageDelivered(0, abi.encodePacked(user, depositAmount)); + + // deposit tokens -> tx.origin == msg.sender + vm.prank(user, user); + ethInbox.depositEth{value: depositAmount}(); + + //// checks + + uint256 bridgeEthBalanceAfter = address(bridge).balance; + assertEq( + bridgeEthBalanceAfter - bridgeEthBalanceBefore, + depositAmount, + "Invalid bridge eth balance" + ); + + uint256 userEthBalanceAfter = address(user).balance; + assertEq( + userEthBalanceBefore - userEthBalanceAfter, + depositAmount, + "Invalid user eth balance" + ); + + assertEq(bridge.delayedMessageCount(), 1, "Invalid delayed message count"); + } + + function test_depositEth_FromContract() public { + uint256 depositAmount = 1.2 ether; + + uint256 bridgeEthBalanceBefore = address(bridge).balance; + uint256 userEthBalanceBefore = address(user).balance; + + // expect event + vm.expectEmit(true, true, true, true); + emit InboxMessageDelivered( + 0, + abi.encodePacked(AddressAliasHelper.applyL1ToL2Alias(user), depositAmount) + ); + + // deposit tokens -> tx.origin != msg.sender + vm.prank(user); + ethInbox.depositEth{value: depositAmount}(); + + //// checks + + uint256 bridgeEthBalanceAfter = address(bridge).balance; + assertEq( + bridgeEthBalanceAfter - bridgeEthBalanceBefore, + depositAmount, + "Invalid bridge eth balance" + ); + + uint256 userEthBalanceAfter = address(user).balance; + assertEq( + userEthBalanceBefore - userEthBalanceAfter, + depositAmount, + "Invalid eth token balance" + ); + + assertEq(bridge.delayedMessageCount(), 1, "Invalid delayed message count"); + } + + function test_depositEth_revert_EthTransferFails() public { + uint256 bridgeEthBalanceBefore = address(bridge).balance; + uint256 userEthBalanceBefore = address(user).balance; + + // deposit too many eth shall fail + vm.prank(user); + uint256 invalidDepositAmount = 300 ether; + vm.expectRevert(); + ethInbox.depositEth{value: invalidDepositAmount}(); + + //// checks + + uint256 bridgeEthBalanceAfter = address(bridge).balance; + assertEq(bridgeEthBalanceAfter, bridgeEthBalanceBefore, "Invalid bridge token balance"); + + uint256 userEthBalanceAfter = address(user).balance; + assertEq(userEthBalanceBefore, userEthBalanceAfter, "Invalid user token balance"); + + assertEq(bridge.delayedMessageCount(), 0, "Invalid delayed message count"); + } + + function test_createRetryableTicket_FromEOA() public { + uint256 bridgeEthBalanceBefore = address(bridge).balance; + uint256 userEthBalanceBefore = address(user).balance; + + uint256 ethToSend = 0.3 ether; + + // retyrable params + uint256 l2CallValue = 0.1 ether; + uint256 maxSubmissionCost = 0.1 ether; + uint256 gasLimit = 100_000; + uint256 maxFeePerGas = 0.000000002 ether; + bytes memory data = abi.encodePacked("some msg"); + + // expect event + vm.expectEmit(true, true, true, true); + emit InboxMessageDelivered( + 0, + abi.encodePacked( + uint256(uint160(user)), + l2CallValue, + ethToSend, + maxSubmissionCost, + uint256(uint160(user)), + uint256(uint160(user)), + gasLimit, + maxFeePerGas, + data.length, + data + ) + ); + + // create retryable -> tx.origin == msg.sender + vm.prank(user, user); + ethInbox.createRetryableTicket{value: ethToSend}({ + to: address(user), + l2CallValue: l2CallValue, + maxSubmissionCost: maxSubmissionCost, + excessFeeRefundAddress: user, + callValueRefundAddress: user, + gasLimit: gasLimit, + maxFeePerGas: maxFeePerGas, + data: data + }); + + //// checks + + uint256 bridgeEthBalanceAfter = address(bridge).balance; + assertEq( + bridgeEthBalanceAfter - bridgeEthBalanceBefore, + ethToSend, + "Invalid bridge token balance" + ); + + uint256 userEthBalanceAfter = address(user).balance; + assertEq( + userEthBalanceBefore - userEthBalanceAfter, + ethToSend, + "Invalid user token balance" + ); + + assertEq(bridge.delayedMessageCount(), 1, "Invalid delayed message count"); + } + + function test_createRetryableTicket_FromContract() public { + address sender = address(new Sender()); + vm.deal(sender, 10 ether); + + uint256 bridgeEthBalanceBefore = address(bridge).balance; + uint256 senderEthBalanceBefore = sender.balance; + + uint256 ethToSend = 0.3 ether; + + // retyrable params + uint256 l2CallValue = 0.1 ether; + uint256 maxSubmissionCost = 0.1 ether; + uint256 gasLimit = 100_000; + uint256 maxFeePerGas = 0.000000001 ether; + + // expect event + uint256 uintAlias = uint256(uint160(AddressAliasHelper.applyL1ToL2Alias(sender))); + vm.expectEmit(true, true, true, true); + emit InboxMessageDelivered( + 0, + abi.encodePacked( + uint256(uint160(sender)), + l2CallValue, + ethToSend, + maxSubmissionCost, + uintAlias, + uintAlias, + gasLimit, + maxFeePerGas, + abi.encodePacked("some msg").length, + abi.encodePacked("some msg") + ) + ); + + // create retryable + vm.prank(sender); + ethInbox.createRetryableTicket{value: ethToSend}({ + to: sender, + l2CallValue: l2CallValue, + maxSubmissionCost: maxSubmissionCost, + excessFeeRefundAddress: sender, + callValueRefundAddress: sender, + gasLimit: gasLimit, + maxFeePerGas: maxFeePerGas, + data: abi.encodePacked("some msg") + }); + + //// checks + + uint256 bridgeEthBalanceAfter = address(bridge).balance; + assertEq( + bridgeEthBalanceAfter - bridgeEthBalanceBefore, + ethToSend, + "Invalid bridge token balance" + ); + + uint256 senderEthBalanceAfter = address(sender).balance; + assertEq( + senderEthBalanceBefore - senderEthBalanceAfter, + ethToSend, + "Invalid sender token balance" + ); + + assertEq(bridge.delayedMessageCount(), 1, "Invalid delayed message count"); + } + + function test_createRetryableTicket_revert_WhenPaused() public { + vm.prank(rollup); + inbox.pause(); + + vm.expectRevert("Pausable: paused"); + ethInbox.createRetryableTicket({ + to: user, + l2CallValue: 100, + maxSubmissionCost: 0, + excessFeeRefundAddress: user, + callValueRefundAddress: user, + gasLimit: 10, + maxFeePerGas: 1, + data: abi.encodePacked("data") + }); + } + + function test_createRetryableTicket_revert_OnlyAllowed() public { + vm.prank(rollup); + inbox.setAllowListEnabled(true); + + vm.prank(user, user); + vm.expectRevert(abi.encodeWithSelector(NotAllowedOrigin.selector, user)); + ethInbox.createRetryableTicket({ + to: user, + l2CallValue: 100, + maxSubmissionCost: 0, + excessFeeRefundAddress: user, + callValueRefundAddress: user, + gasLimit: 10, + maxFeePerGas: 1, + data: abi.encodePacked("data") + }); + } + + function test_createRetryableTicket_revert_InsufficientValue() public { + uint256 tooSmallEthAmount = 1 ether; + uint256 l2CallValue = 2 ether; + uint256 maxSubmissionCost = 0.1 ether; + uint256 gasLimit = 200000; + uint256 maxFeePerGas = 0.00000002 ether; + + vm.prank(user, user); + vm.expectRevert( + abi.encodeWithSelector( + InsufficientValue.selector, + maxSubmissionCost + l2CallValue + gasLimit * maxFeePerGas, + tooSmallEthAmount + ) + ); + ethInbox.createRetryableTicket{value: tooSmallEthAmount}({ + to: user, + l2CallValue: l2CallValue, + maxSubmissionCost: maxSubmissionCost, + excessFeeRefundAddress: user, + callValueRefundAddress: user, + gasLimit: gasLimit, + maxFeePerGas: maxFeePerGas, + data: abi.encodePacked("data") + }); + } + + function test_createRetryableTicket_revert_RetryableDataTracer() public { + uint256 msgValue = 3 ether; + uint256 l2CallValue = 1 ether; + uint256 maxSubmissionCost = 0.1 ether; + uint256 gasLimit = 100000; + uint256 maxFeePerGas = 1; + bytes memory data = abi.encodePacked("xy"); + + // revert as maxFeePerGas == 1 is magic value + vm.prank(user, user); + vm.expectRevert( + abi.encodeWithSelector( + RetryableData.selector, + user, + user, + l2CallValue, + msgValue, + maxSubmissionCost, + user, + user, + gasLimit, + maxFeePerGas, + data + ) + ); + ethInbox.createRetryableTicket{value: msgValue}({ + to: user, + l2CallValue: l2CallValue, + maxSubmissionCost: maxSubmissionCost, + excessFeeRefundAddress: user, + callValueRefundAddress: user, + gasLimit: gasLimit, + maxFeePerGas: maxFeePerGas, + data: data + }); + + gasLimit = 1; + maxFeePerGas = 2; + + // revert as gasLimit == 1 is magic value + vm.prank(user, user); + vm.expectRevert( + abi.encodeWithSelector( + RetryableData.selector, + user, + user, + l2CallValue, + msgValue, + maxSubmissionCost, + user, + user, + gasLimit, + maxFeePerGas, + data + ) + ); + ethInbox.createRetryableTicket{value: msgValue}({ + to: user, + l2CallValue: l2CallValue, + maxSubmissionCost: maxSubmissionCost, + excessFeeRefundAddress: user, + callValueRefundAddress: user, + gasLimit: gasLimit, + maxFeePerGas: maxFeePerGas, + data: data + }); + } + + function test_createRetryableTicket_revert_GasLimitTooLarge() public { + uint256 tooBigGasLimit = uint256(type(uint64).max) + 1; + + vm.deal(user, uint256(type(uint64).max) * 3); + vm.prank(user, user); + vm.expectRevert(GasLimitTooLarge.selector); + ethInbox.createRetryableTicket{value: uint256(type(uint64).max) * 3}({ + to: user, + l2CallValue: 100, + maxSubmissionCost: 0, + excessFeeRefundAddress: user, + callValueRefundAddress: user, + gasLimit: tooBigGasLimit, + maxFeePerGas: 2, + data: abi.encodePacked("data") + }); + } + + function test_createRetryableTicket_revert_InsufficientSubmissionCost() public { + uint256 tooSmallMaxSubmissionCost = 5; + bytes memory data = abi.encodePacked("msg"); + + // simulate 23 gwei basefee + vm.fee(23000000000); + uint256 submissionFee = ethInbox.calculateRetryableSubmissionFee( + data.length, + block.basefee + ); + + // call shall revert + vm.prank(user, user); + vm.expectRevert( + abi.encodePacked( + InsufficientSubmissionCost.selector, + submissionFee, + tooSmallMaxSubmissionCost + ) + ); + ethInbox.createRetryableTicket{value: 1 ether}({ + to: user, + l2CallValue: 100, + maxSubmissionCost: tooSmallMaxSubmissionCost, + excessFeeRefundAddress: user, + callValueRefundAddress: user, + gasLimit: 60000, + maxFeePerGas: 0.00000001 ether, + data: data + }); + } + + function test_unsafeCreateRetryableTicket_FromEOA() public { + uint256 bridgeEthBalanceBefore = address(bridge).balance; + uint256 userEthBalanceBefore = address(user).balance; + + uint256 ethToSend = 0.3 ether; + + // retyrable params + uint256 l2CallValue = 0.1 ether; + uint256 maxSubmissionCost = 0.1 ether; + uint256 gasLimit = 100_000; + uint256 maxFeePerGas = 0.000000002 ether; + bytes memory data = abi.encodePacked("some msg"); + + // expect event + vm.expectEmit(true, true, true, true); + emit InboxMessageDelivered( + 0, + abi.encodePacked( + uint256(uint160(user)), + l2CallValue, + ethToSend, + maxSubmissionCost, + uint256(uint160(user)), + uint256(uint160(user)), + gasLimit, + maxFeePerGas, + data.length, + data + ) + ); + + // create retryable -> tx.origin == msg.sender + vm.prank(user, user); + ethInbox.unsafeCreateRetryableTicket{value: ethToSend}({ + to: address(user), + l2CallValue: l2CallValue, + maxSubmissionCost: maxSubmissionCost, + excessFeeRefundAddress: user, + callValueRefundAddress: user, + gasLimit: gasLimit, + maxFeePerGas: maxFeePerGas, + data: data + }); + + //// checks + + uint256 bridgeEthBalanceAfter = address(bridge).balance; + assertEq( + bridgeEthBalanceAfter - bridgeEthBalanceBefore, + ethToSend, + "Invalid bridge token balance" + ); + + uint256 userEthBalanceAfter = address(user).balance; + assertEq( + userEthBalanceBefore - userEthBalanceAfter, + ethToSend, + "Invalid user token balance" + ); + + assertEq(bridge.delayedMessageCount(), 1, "Invalid delayed message count"); + } + + function test_unsafeCreateRetryableTicket_FromContract() public { + address sender = address(new Sender()); + vm.deal(sender, 10 ether); + + uint256 bridgeEthBalanceBefore = address(bridge).balance; + uint256 senderEthBalanceBefore = sender.balance; + + uint256 ethToSend = 0.3 ether; + + // retyrable params + uint256 l2CallValue = 0.1 ether; + uint256 maxSubmissionCost = 0.1 ether; + uint256 gasLimit = 100_000; + uint256 maxFeePerGas = 0.000000001 ether; + + // expect event + vm.expectEmit(true, true, true, true); + emit InboxMessageDelivered( + 0, + abi.encodePacked( + uint256(uint160(sender)), + l2CallValue, + ethToSend, + maxSubmissionCost, + uint256(uint160(sender)), + uint256(uint160(sender)), + gasLimit, + maxFeePerGas, + abi.encodePacked("some msg").length, + abi.encodePacked("some msg") + ) + ); + + // create retryable + vm.prank(sender); + ethInbox.unsafeCreateRetryableTicket{value: ethToSend}({ + to: sender, + l2CallValue: l2CallValue, + maxSubmissionCost: maxSubmissionCost, + excessFeeRefundAddress: sender, + callValueRefundAddress: sender, + gasLimit: gasLimit, + maxFeePerGas: maxFeePerGas, + data: abi.encodePacked("some msg") + }); + + //// checks + + uint256 bridgeEthBalanceAfter = address(bridge).balance; + assertEq( + bridgeEthBalanceAfter - bridgeEthBalanceBefore, + ethToSend, + "Invalid bridge token balance" + ); + + uint256 senderEthBalanceAfter = address(sender).balance; + assertEq( + senderEthBalanceBefore - senderEthBalanceAfter, + ethToSend, + "Invalid sender token balance" + ); + + assertEq(bridge.delayedMessageCount(), 1, "Invalid delayed message count"); + } + + function test_unsafeCreateRetryableTicket_NotRevertingOnInsufficientValue() public { + uint256 bridgeEthBalanceBefore = address(bridge).balance; + uint256 userEthBalanceBefore = address(user).balance; + + uint256 tooSmallEthAmount = 1 ether; + uint256 l2CallValue = 2 ether; + uint256 maxSubmissionCost = 0.1 ether; + uint256 gasLimit = 200000; + uint256 maxFeePerGas = 0.00000002 ether; + + // expect event + vm.expectEmit(true, true, true, true); + emit InboxMessageDelivered( + 0, + abi.encodePacked( + uint256(uint160(user)), + l2CallValue, + tooSmallEthAmount, + maxSubmissionCost, + uint256(uint160(user)), + uint256(uint160(user)), + gasLimit, + maxFeePerGas, + abi.encodePacked("data").length, + abi.encodePacked("data") + ) + ); + + vm.prank(user, user); + ethInbox.unsafeCreateRetryableTicket{value: tooSmallEthAmount}({ + to: user, + l2CallValue: l2CallValue, + maxSubmissionCost: maxSubmissionCost, + excessFeeRefundAddress: user, + callValueRefundAddress: user, + gasLimit: gasLimit, + maxFeePerGas: maxFeePerGas, + data: abi.encodePacked("data") + }); + + //// checks + + uint256 bridgeEthBalanceAfter = address(bridge).balance; + assertEq( + bridgeEthBalanceAfter - bridgeEthBalanceBefore, + tooSmallEthAmount, + "Invalid bridge token balance" + ); + + uint256 userEthBalanceAfter = address(user).balance; + assertEq( + userEthBalanceBefore - userEthBalanceAfter, + tooSmallEthAmount, + "Invalid user token balance" + ); + + assertEq(bridge.delayedMessageCount(), 1, "Invalid delayed message count"); + } + + function test_calculateRetryableSubmissionFee() public { + // 30 gwei fee + uint256 basefee = 30000000000; + vm.fee(basefee); + uint256 datalength = 10; + + assertEq( + inbox.calculateRetryableSubmissionFee(datalength, 0), + (1400 + 6 * datalength) * basefee, + "Invalid eth retryable submission fee" + ); + } +} \ No newline at end of file diff --git a/test/foundry/Outbox.t.sol b/test/foundry/Outbox.t.sol new file mode 100644 index 00000000..e826c2d0 --- /dev/null +++ b/test/foundry/Outbox.t.sol @@ -0,0 +1,116 @@ +// SPDX-License-Identifier: UNLICENSED +pragma solidity ^0.8.4; + +import "./AbsOutbox.t.sol"; +import "../../src/bridge/Bridge.sol"; +import "../../src/bridge/Outbox.sol"; + +contract OutboxTest is AbsOutboxTest { + Outbox public ethOutbox; + Bridge public ethBridge; + + function setUp() public { + // deploy bridge and outbox + bridge = IBridge(TestUtil.deployProxy(address(new Bridge()))); + ethBridge = Bridge(address(bridge)); + outbox = IOutbox(TestUtil.deployProxy(address(new Outbox()))); + ethOutbox = Outbox(address(outbox)); + + // init bridge and outbox + ethBridge.initialize(IOwnable(rollup)); + ethOutbox.initialize(IBridge(bridge)); + + vm.prank(rollup); + bridge.setOutbox(address(outbox), true); + } + + function test_executeTransaction() public { + // fund bridge with some ether + vm.deal(address(bridge), 100 ether); + + // store root + vm.prank(rollup); + outbox.updateSendRoot( + 0xc86f4eaf8efb31147795fb05564f8777abc3220d4caeb0227c6c69c115931dda, + 0xc86f4eaf8efb31147795fb05564f8777abc3220d4caeb0227c6c69c115931dda + ); + + // create msg receiver on L1 + L2ToL1Target target = new L2ToL1Target(); + target.setOutbox(address(outbox)); + + //// execute transaction + uint256 bridgeBalanceBefore = address(bridge).balance; + uint256 targetBalanceBefore = address(target).balance; + + bytes32[] memory proof = new bytes32[](5); + proof[0] = bytes32(0x1216ff070e3c87b032d79b298a3e98009ddd13bf8479b843e225857ca5f950e7); + proof[1] = bytes32(0x2b5ee8f4bd7664ca0cf31d7ab86119b63f6ff07bb86dbd5af356d0087492f686); + proof[2] = bytes32(0x0aa797064e0f3768bbac0a02ce031c4f282441a9cd8c669086cf59a083add893); + proof[3] = bytes32(0xc7aac0aad5108a46ac9879f0b1870fd0cbc648406f733eb9d0b944a18c32f0f8); + proof[4] = bytes32(0x477ce2b0bc8035ae3052b7339c7496531229bd642bb1871d81618cf93a4d2d1a); + + uint256 withdrawalAmount = 15 ether; + bytes memory data = abi.encodeWithSignature("receiveHook()"); + outbox.executeTransaction({ + proof: proof, + index: 12, + l2Sender: user, + to: address(target), + l2Block: 300, + l1Block: 20, + l2Timestamp: 1234, + value: withdrawalAmount, + data: data + }); + + uint256 bridgeBalanceAfter = address(bridge).balance; + assertEq( + bridgeBalanceBefore - bridgeBalanceAfter, + withdrawalAmount, + "Invalid bridge balance" + ); + + uint256 targetBalanceAfter = address(target).balance; + assertEq( + targetBalanceAfter - targetBalanceBefore, + withdrawalAmount, + "Invalid target balance" + ); + + /// check context was properly set during execution + assertEq(uint256(target.l2Block()), 300, "Invalid l2Block"); + assertEq(uint256(target.timestamp()), 1234, "Invalid timestamp"); + assertEq(uint256(target.outputId()), 12, "Invalid outputId"); + assertEq(target.sender(), user, "Invalid sender"); + assertEq(uint256(target.l1Block()), 20, "Invalid l1Block"); + assertEq(uint256(target.withdrawalAmount()), withdrawalAmount, "Invalid withdrawalAmount"); + } +} + +/** + * Contract for testing L2 to L1 msgs + */ +contract L2ToL1Target { + address public outbox; + + uint128 public l2Block; + uint128 public timestamp; + bytes32 public outputId; + address public sender; + uint96 public l1Block; + uint256 public withdrawalAmount; + + function receiveHook() external payable { + l2Block = uint128(IOutbox(outbox).l2ToL1Block()); + timestamp = uint128(IOutbox(outbox).l2ToL1Timestamp()); + outputId = IOutbox(outbox).l2ToL1OutputId(); + sender = IOutbox(outbox).l2ToL1Sender(); + l1Block = uint96(IOutbox(outbox).l2ToL1EthBlock()); + withdrawalAmount = msg.value; + } + + function setOutbox(address _outbox) external { + outbox = _outbox; + } +} \ No newline at end of file diff --git a/test/foundry/RollupCreator.t.sol b/test/foundry/RollupCreator.t.sol new file mode 100644 index 00000000..d041f92c --- /dev/null +++ b/test/foundry/RollupCreator.t.sol @@ -0,0 +1,69 @@ +// SPDX-License-Identifier: UNLICENSED +pragma solidity ^0.8.4; + +import "./AbsRollupCreator.t.sol"; +import "../../src/rollup/BridgeCreator.sol"; +import "../../src/rollup/RollupCreator.sol"; + +contract RollupCreatorTest is AbsRollupCreatorTest { + function setUp() public {} + + /* solhint-disable func-name-mixedcase */ + + function test_createRollup() public { + vm.startPrank(deployer); + + RollupCreator rollupCreator = new RollupCreator(); + + ( + IOneStepProofEntry ospEntry, + IChallengeManager challengeManager, + IRollupAdmin rollupAdmin, + IRollupUser rollupUser, + ISequencerInbox.MaxTimeVariation memory timeVars, + address expectedRollupAddr + ) = _prepareRollupDeployment(address(rollupCreator)); + //// deployBridgeCreator + IBridgeCreator bridgeCreator = new BridgeCreator(); + + //// deploy creator and set logic + rollupCreator.setTemplates( + bridgeCreator, + ospEntry, + challengeManager, + rollupAdmin, + rollupUser, + address(new ValidatorUtils()), + address(new ValidatorWalletCreator()) + ); + + // deployment params + bytes32 wasmModuleRoot = keccak256("wasm"); + uint256 chainId = 1337; + + // expect deployment events + _expectEvents(rollupCreator, bridgeCreator, expectedRollupAddr, wasmModuleRoot, chainId); + + /// deploy rollup + address rollupAddress = rollupCreator.createRollup( + Config({ + confirmPeriodBlocks: 20, + extraChallengeTimeBlocks: 200, + stakeToken: address(0), + baseStake: 1000, + wasmModuleRoot: keccak256("0"), + owner: rollupOwner, + loserStakeEscrow: address(200), + chainId: 1337, + genesisBlockNum: 15000000, + sequencerInboxMaxTimeVariation: timeVars + }), + expectedRollupAddr + ); + + vm.stopPrank(); + + /// common checks + _checkRollupIsSetUp(rollupCreator, rollupAddress, rollupAdmin, rollupUser); + } +} \ No newline at end of file diff --git a/test/foundry/util/TestUtil.sol b/test/foundry/util/TestUtil.sol new file mode 100644 index 00000000..c16cc739 --- /dev/null +++ b/test/foundry/util/TestUtil.sol @@ -0,0 +1,12 @@ +// SPDX-License-Identifier: Apache-2.0 +pragma solidity ^0.8.4; + +import "@openzeppelin/contracts/proxy/transparent/TransparentUpgradeableProxy.sol"; +import "@openzeppelin/contracts/proxy/transparent/ProxyAdmin.sol"; + +library TestUtil { + function deployProxy(address logic) public returns (address) { + ProxyAdmin pa = new ProxyAdmin(); + return address(new TransparentUpgradeableProxy(address(logic), address(pa), "")); + } +} \ No newline at end of file From 5bcb5b1a0c9ef0e701050931438bf51a0c30db38 Mon Sep 17 00:00:00 2001 From: Goran Vladika Date: Mon, 29 May 2023 15:05:59 +0200 Subject: [PATCH 006/292] Update contract storage layout files --- test/storage/Bridge.dot | 2 +- test/storage/ERC20Bridge.dot | 27 +++++++++++++++++++++++++++ test/storage/ERC20Inbox.dot | 15 +++++++++++++++ test/storage/ERC20Outbox.dot | 12 ++++++++++++ test/storage/Inbox.dot | 2 +- test/storage/Outbox.dot | 6 +++--- 6 files changed, 59 insertions(+), 5 deletions(-) create mode 100644 test/storage/ERC20Bridge.dot create mode 100644 test/storage/ERC20Inbox.dot create mode 100644 test/storage/ERC20Outbox.dot diff --git a/test/storage/Bridge.dot b/test/storage/Bridge.dot index e35ab1d8..acf81bc6 100644 --- a/test/storage/Bridge.dot +++ b/test/storage/Bridge.dot @@ -4,7 +4,7 @@ rankdir=LR color=black arrowhead=open node [shape=record, style=filled, fillcolor=gray95 fontname="Courier New"] -7 [label="Bridge \<\\>\n | {{ slot| 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 } | { type: \.variable (bytes) | { unallocated (30) | bool: Initializable._initializing (1) | bool: Initializable._initialized (1) } | { <5> mapping\(address=\>InOutInfo\): allowedDelayedInboxesMap (32) } | { <8> mapping\(address=\>InOutInfo\): allowedOutboxesMap (32) } | { <10> address[]: allowedDelayedInboxList (32) } | { <12> address[]: allowedOutboxList (32) } | { unallocated (12) | address: _activeOutbox (20) } | { <15> bytes32[]: delayedInboxAccs (32) } | { <17> bytes32[]: sequencerInboxAccs (32) } | { unallocated (12) | IOwnable: rollup (20) } | { unallocated (12) | address: sequencerInbox (20) } | { uint256: sequencerReportedSubMessageCount (32) }}}"] +7 [label="Bridge \<\\>\n | {{ slot| 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 } | { type: \.variable (bytes) | { unallocated (30) | bool: Initializable._initializing (1) | bool: Initializable._initialized (1) } | { <5> mapping\(address=\>InOutInfo\): AbsBridge.allowedDelayedInboxesMap (32) } | { <8> mapping\(address=\>InOutInfo\): AbsBridge.allowedOutboxesMap (32) } | { <10> address[]: AbsBridge.allowedDelayedInboxList (32) } | { <12> address[]: AbsBridge.allowedOutboxList (32) } | { unallocated (12) | address: AbsBridge._activeOutbox (20) } | { <15> bytes32[]: AbsBridge.delayedInboxAccs (32) } | { <17> bytes32[]: AbsBridge.sequencerInboxAccs (32) } | { unallocated (12) | IOwnable: AbsBridge.rollup (20) } | { unallocated (12) | address: AbsBridge.sequencerInbox (20) } | { uint256: AbsBridge.sequencerReportedSubMessageCount (32) }}}"] 1 [label="InOutInfo \<\\>\n | {{ slot| 0 | 1 } | { type: variable (bytes) | { uint256: index (32) } | { unallocated (31) | bool: allowed (1) }}}"] diff --git a/test/storage/ERC20Bridge.dot b/test/storage/ERC20Bridge.dot new file mode 100644 index 00000000..ff456b92 --- /dev/null +++ b/test/storage/ERC20Bridge.dot @@ -0,0 +1,27 @@ + +digraph StorageDiagram { +rankdir=LR +color=black +arrowhead=open +node [shape=record, style=filled, fillcolor=gray95 fontname="Courier New"] +7 [label="ERC20Bridge \<\\>\n | {{ slot| 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 } | { type: \.variable (bytes) | { unallocated (30) | bool: Initializable._initializing (1) | bool: Initializable._initialized (1) } | { <5> mapping\(address=\>InOutInfo\): AbsBridge.allowedDelayedInboxesMap (32) } | { <8> mapping\(address=\>InOutInfo\): AbsBridge.allowedOutboxesMap (32) } | { <10> address[]: AbsBridge.allowedDelayedInboxList (32) } | { <12> address[]: AbsBridge.allowedOutboxList (32) } | { unallocated (12) | address: AbsBridge._activeOutbox (20) } | { <15> bytes32[]: AbsBridge.delayedInboxAccs (32) } | { <17> bytes32[]: AbsBridge.sequencerInboxAccs (32) } | { unallocated (12) | IOwnable: AbsBridge.rollup (20) } | { unallocated (12) | address: AbsBridge.sequencerInbox (20) } | { uint256: AbsBridge.sequencerReportedSubMessageCount (32) } | { unallocated (12) | address: nativeToken (20) }}}"] + +1 [label="InOutInfo \<\\>\n | {{ slot| 0 | 1 } | { type: variable (bytes) | { uint256: index (32) } | { unallocated (31) | bool: allowed (1) }}}"] + +2 [label="InOutInfo \<\\>\n | {{ slot| 0 | 1 } | { type: variable (bytes) | { uint256: index (32) } | { unallocated (31) | bool: allowed (1) }}}"] + +3 [label="address[]: allowedDelayedInboxList \<\\>\n0x11987c15ef5ed64ec2e3cd9cfc79d7bd155aea3982ea59f35a5e6b5c1593a54b | {{ slot| 0 } | { type: variable (bytes) | { unallocated (12) | address (20) }}}"] + +4 [label="address[]: allowedOutboxList \<\\>\n0x68f9c7fa29c0442459fc0d2760448ff932de4dd67b90b4a6ac1899621cfd70a7 | {{ slot| 0 } | { type: variable (bytes) | { unallocated (12) | address (20) }}}"] + +5 [label="bytes32[]: delayedInboxAccs \<\\>\n0x5ff1374942f1d7624ea1478457e8132b05531ee44999ffc0f33a70926c6a0d30 | {{ slot| 0 } | { type: variable (bytes) | { bytes32 (32) }}}"] + +6 [label="bytes32[]: sequencerInboxAccs \<\\>\n0x995663702627f3d8fc4237c51a46b303536bb17f3f65e07c08ad05fecbf4d88e | {{ slot| 0 } | { type: variable (bytes) | { bytes32 (32) }}}"] + + 7:5 -> 1 + 7:8 -> 2 + 7:10 -> 3 + 7:12 -> 4 + 7:15 -> 5 + 7:17 -> 6 +} \ No newline at end of file diff --git a/test/storage/ERC20Inbox.dot b/test/storage/ERC20Inbox.dot new file mode 100644 index 00000000..fc90ee0d --- /dev/null +++ b/test/storage/ERC20Inbox.dot @@ -0,0 +1,15 @@ + +digraph StorageDiagram { +rankdir=LR +color=black +arrowhead=open +node [shape=record, style=filled, fillcolor=gray95 fontname="Courier New"] +3 [label="ERC20Inbox \<\\>\n | {{ slot| 0 | 1-50 | 51 | 52-100 | 101 | 102 | 103 } | { type: \.variable (bytes) | { unallocated (30) | bool: Initializable._initializing (1) | bool: Initializable._initialized (1) } | { <53> uint256[50]: ContextUpgradeable.__gap (1600) } | { unallocated (31) | bool: PausableUpgradeable._paused (1) } | { <104> uint256[49]: PausableUpgradeable.__gap (1568) } | { unallocated (12) | IBridge: AbsInbox.bridge (20) } | { unallocated (11) | bool: AbsInbox.allowListEnabled (1) | ISequencerInbox: AbsInbox.sequencerInbox (20) } | { mapping\(address=\>bool\): AbsInbox.isAllowed (32) }}}"] + +1 [label="uint256[50]: __gap \<\\>\n | {{ slot| 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 } | { type: variable (bytes) | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) }}}"] + +2 [label="uint256[49]: __gap \<\\>\n | {{ slot| 52 | 53 | 54 | 55 | 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 | 72 | 73 | 74 | 75 | 76 | 77 | 78 | 79 | 80 | 81 | 82 | 83 | 84 | 85 | 86 | 87 | 88 | 89 | 90 | 91 | 92 | 93 | 94 | 95 | 96 | 97 | 98 | 99 | 100 } | { type: variable (bytes) | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) }}}"] + + 3:53 -> 1 + 3:104 -> 2 +} \ No newline at end of file diff --git a/test/storage/ERC20Outbox.dot b/test/storage/ERC20Outbox.dot new file mode 100644 index 00000000..db69c272 --- /dev/null +++ b/test/storage/ERC20Outbox.dot @@ -0,0 +1,12 @@ + +digraph StorageDiagram { +rankdir=LR +color=black +arrowhead=open +node [shape=record, style=filled, fillcolor=gray95 fontname="Courier New"] +2 [label="ERC20Outbox \<\\>\n | {{ slot| 0 | 1 | 2 | 3 | 4-7 } | { type: \.variable (bytes) | { unallocated (12) | address: AbsOutbox.rollup (20) } | { unallocated (12) | IBridge: AbsOutbox.bridge (20) } | { mapping\(uint256=\>bytes32\): AbsOutbox.spent (32) } | { mapping\(bytes32=\>bytes32\): AbsOutbox.roots (32) } | { <11> L2ToL1Context: AbsOutbox.context (128) }}}"] + +1 [label="L2ToL1Context \<\\>\n | {{ slot| 4 | 5 | 6 | 7 } | { type: variable (bytes) | { uint128: timestamp (16) | uint128: l2Block (16) } | { bytes32: outputId (32) } | { uint96: l1Block (12) | address: sender (20) } | { uint256: withdrawalAmount (32) }}}"] + + 2:11 -> 1 +} \ No newline at end of file diff --git a/test/storage/Inbox.dot b/test/storage/Inbox.dot index 218aaeec..98c5cd42 100644 --- a/test/storage/Inbox.dot +++ b/test/storage/Inbox.dot @@ -4,7 +4,7 @@ rankdir=LR color=black arrowhead=open node [shape=record, style=filled, fillcolor=gray95 fontname="Courier New"] -3 [label="Inbox \<\\>\n | {{ slot| 0 | 1-50 | 51 | 52-100 | 101 | 102 | 103 } | { type: \.variable (bytes) | { unallocated (30) | bool: Initializable._initializing (1) | bool: Initializable._initialized (1) } | { <53> uint256[50]: ContextUpgradeable.__gap (1600) } | { unallocated (31) | bool: PausableUpgradeable._paused (1) } | { <104> uint256[49]: PausableUpgradeable.__gap (1568) } | { unallocated (12) | IBridge: bridge (20) } | { unallocated (11) | bool: allowListEnabled (1) | ISequencerInbox: sequencerInbox (20) } | { mapping\(address=\>bool\): isAllowed (32) }}}"] +3 [label="Inbox \<\\>\n | {{ slot| 0 | 1-50 | 51 | 52-100 | 101 | 102 | 103 } | { type: \.variable (bytes) | { unallocated (30) | bool: Initializable._initializing (1) | bool: Initializable._initialized (1) } | { <53> uint256[50]: ContextUpgradeable.__gap (1600) } | { unallocated (31) | bool: PausableUpgradeable._paused (1) } | { <104> uint256[49]: PausableUpgradeable.__gap (1568) } | { unallocated (12) | IBridge: AbsInbox.bridge (20) } | { unallocated (11) | bool: AbsInbox.allowListEnabled (1) | ISequencerInbox: AbsInbox.sequencerInbox (20) } | { mapping\(address=\>bool\): AbsInbox.isAllowed (32) }}}"] 1 [label="uint256[50]: __gap \<\\>\n | {{ slot| 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 } | { type: variable (bytes) | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) }}}"] diff --git a/test/storage/Outbox.dot b/test/storage/Outbox.dot index 089e0020..de11992c 100644 --- a/test/storage/Outbox.dot +++ b/test/storage/Outbox.dot @@ -4,9 +4,9 @@ rankdir=LR color=black arrowhead=open node [shape=record, style=filled, fillcolor=gray95 fontname="Courier New"] -2 [label="Outbox \<\\>\n | {{ slot| 0 | 1 | 2 | 3 | 4-7 } | { type: \.variable (bytes) | { unallocated (12) | address: rollup (20) } | { unallocated (12) | IBridge: bridge (20) } | { mapping\(uint256=\>bytes32\): spent (32) } | { mapping\(bytes32=\>bytes32\): roots (32) } | { <10> L2ToL1Context: context (128) }}}"] +2 [label="Outbox \<\\>\n | {{ slot| 0 | 1 | 2 | 3 | 4-7 } | { type: \.variable (bytes) | { unallocated (12) | address: AbsOutbox.rollup (20) } | { unallocated (12) | IBridge: AbsOutbox.bridge (20) } | { mapping\(uint256=\>bytes32\): AbsOutbox.spent (32) } | { mapping\(bytes32=\>bytes32\): AbsOutbox.roots (32) } | { <11> L2ToL1Context: AbsOutbox.context (128) }}}"] -1 [label="L2ToL1Context \<\\>\n | {{ slot| 4 | 5 | 6 | 7 } | { type: variable (bytes) | { uint128: l1Block (16) | uint128: l2Block (16) } | { unallocated (16) | uint128: timestamp (16) } | { bytes32: outputId (32) } | { unallocated (12) | address: sender (20) }}}"] +1 [label="L2ToL1Context \<\\>\n | {{ slot| 4 | 5 | 6 | 7 } | { type: variable (bytes) | { uint128: timestamp (16) | uint128: l2Block (16) } | { bytes32: outputId (32) } | { uint96: l1Block (12) | address: sender (20) } | { uint256: withdrawalAmount (32) }}}"] - 2:10 -> 1 + 2:11 -> 1 } \ No newline at end of file From f813068037801b82b8aec719ab26131778b6a68d Mon Sep 17 00:00:00 2001 From: Goran Vladika Date: Mon, 29 May 2023 15:11:49 +0200 Subject: [PATCH 007/292] Make unit testing part of CI --- .github/workflows/contract-tests.yml | 29 ++++++++++++++++++++++++++++ 1 file changed, 29 insertions(+) diff --git a/.github/workflows/contract-tests.yml b/.github/workflows/contract-tests.yml index 61b0c747..15384ce5 100644 --- a/.github/workflows/contract-tests.yml +++ b/.github/workflows/contract-tests.yml @@ -10,6 +10,35 @@ on: - develop jobs: + test-unit: + name: Test unit + runs-on: ubuntu-latest + defaults: + run: + shell: bash + working-directory: contracts + steps: + - uses: actions/checkout@v3 + with: + submodules: recursive + + - name: Install Foundry + uses: foundry-rs/foundry-toolchain@v1 + with: + version: nightly + + - name: Setup node/yarn + uses: actions/setup-node@v3 + with: + node-version: 16 + cache: 'yarn' + cache-dependency-path: '**/yarn.lock' + + - name: Install packages + run: yarn + + - name: Run unit tests + run: forge test tests: name: Contract tests runs-on: ubuntu-8 From f8fad6fd6a79a45a1a6c8aa3629fd9b82522fa1d Mon Sep 17 00:00:00 2001 From: Goran Vladika Date: Thu, 1 Jun 2023 12:26:47 +0200 Subject: [PATCH 008/292] Fix rollup creator test cases --- test/foundry/AbsRollupCreator.t.sol | 97 ++------------------------- test/foundry/ERC20RollupCreator.t.sol | 71 ++++++++++++-------- test/foundry/RollupCreator.t.sol | 71 ++++++++++++-------- 3 files changed, 93 insertions(+), 146 deletions(-) diff --git a/test/foundry/AbsRollupCreator.t.sol b/test/foundry/AbsRollupCreator.t.sol index 57d3545e..ccaa4d38 100644 --- a/test/foundry/AbsRollupCreator.t.sol +++ b/test/foundry/AbsRollupCreator.t.sol @@ -21,15 +21,16 @@ abstract contract AbsRollupCreatorTest is Test { address public rollupOwner = address(4400); address public deployer = address(4300); - function _prepareRollupDeployment(address rollupCreator) + function _prepareRollupDeployment( + address rollupCreator, + Config memory config + ) internal returns ( IOneStepProofEntry ospEntry, IChallengeManager challengeManager, IRollupAdmin rollupAdminLogic, - IRollupUser rollupUserLogic, - ISequencerInbox.MaxTimeVariation memory timeVars, - address expectedRollupAddr + IRollupUser rollupUserLogic ) { //// deploy challenge stuff @@ -45,93 +46,7 @@ abstract contract AbsRollupCreatorTest is Test { rollupAdminLogic = IRollupAdmin(new RollupAdminLogic()); rollupUserLogic = IRollupUser(new RollupUserLogic()); - timeVars = ISequencerInbox.MaxTimeVariation( - ((60 * 60 * 24) / 15), - 12, - 60 * 60 * 24, - 60 * 60 - ); - - //// calculate expected address for rollup - expectedRollupAddr = _calculateExpectedAddr(rollupCreator, vm.getNonce(rollupCreator) + 2); - - return ( - ospEntry, - challengeManager, - rollupAdminLogic, - rollupUserLogic, - timeVars, - expectedRollupAddr - ); - } - - function _calculateExpectedAddr(address rollupCreator, uint256 nonce) - internal - pure - returns (address) - { - bytes1 nonceBytes1 = bytes1(uint8(nonce)); - address expectedRollupAddr = address( - uint160( - uint256( - keccak256( - abi.encodePacked( - bytes1(0xd6), - bytes1(0x94), - address(rollupCreator), - nonceBytes1 - ) - ) - ) - ) - ); - - return expectedRollupAddr; - } - - function _checkRollupIsSetUp( - IRollupCreator rollupCreator, - address rollupAddress, - IRollupAdmin rollupAdmin, - IRollupUser rollupUser - ) internal { - /// rollup creator - assertEq(IOwnable(address(rollupCreator)).owner(), deployer, "Invalid rollupCreator owner"); - - /// rollup proxy - assertEq(IOwnable(rollupAddress).owner(), rollupOwner, "Invalid rollup owner"); - assertEq(_getProxyAdmin(rollupAddress), rollupOwner, "Invalid rollup's proxyAdmin owner"); - assertEq(_getPrimary(rollupAddress), address(rollupAdmin), "Invalid proxy primary impl"); - assertEq(_getSecondary(rollupAddress), address(rollupUser), "Invalid proxy secondary impl"); - - /// rollup check - RollupCore rollup = RollupCore(rollupAddress); - assertTrue(address(rollup.sequencerInbox()) != address(0), "Invalid seqInbox"); - assertTrue(address(rollup.bridge()) != address(0), "Invalid bridge"); - assertTrue(address(rollup.inbox()) != address(0), "Invalid inbox"); - assertTrue(address(rollup.outbox()) != address(0), "Invalid outbox"); - assertTrue(address(rollup.rollupEventInbox()) != address(0), "Invalid rollupEventInbox"); - assertTrue(address(rollup.challengeManager()) != address(0), "Invalid challengeManager"); - } - - function _expectEvents( - IRollupCreator rollupCreator, - IBridgeCreator bridgeCreator, - address expectedRollupAddr, - bytes32 wasmModuleRoot, - uint256 chainId - ) internal { - vm.expectEmit(true, true, true, true); - uint256 bridgeCreatorNonce = vm.getNonce(address(bridgeCreator)); - emit RollupCreated( - expectedRollupAddr, - _calculateExpectedAddr(address(bridgeCreator), bridgeCreatorNonce + 2), - _calculateExpectedAddr(address(rollupCreator), vm.getNonce(address(rollupCreator))), - _calculateExpectedAddr(address(bridgeCreator), bridgeCreatorNonce + 1), - _calculateExpectedAddr(address(bridgeCreator), bridgeCreatorNonce) - ); - - emit RollupInitialized(wasmModuleRoot, chainId); + return (ospEntry, challengeManager, rollupAdminLogic, rollupUserLogic); } function _getProxyAdmin(address proxy) internal view returns (address) { diff --git a/test/foundry/ERC20RollupCreator.t.sol b/test/foundry/ERC20RollupCreator.t.sol index 2a450308..4cff58cc 100644 --- a/test/foundry/ERC20RollupCreator.t.sol +++ b/test/foundry/ERC20RollupCreator.t.sol @@ -24,14 +24,35 @@ contract ERC20RollupCreatorTest is AbsRollupCreatorTest { ERC20RollupCreator rollupCreator = new ERC20RollupCreator(); + // deployment params + bytes32 wasmModuleRoot = keccak256("wasm"); + uint256 chainId = 1337; + ISequencerInbox.MaxTimeVariation memory timeVars = ISequencerInbox.MaxTimeVariation( + ((60 * 60 * 24) / 15), + 12, + 60 * 60 * 24, + 60 * 60 + ); + Config memory config = Config({ + confirmPeriodBlocks: 20, + extraChallengeTimeBlocks: 200, + stakeToken: address(0), + baseStake: 1000, + wasmModuleRoot: keccak256("0"), + owner: rollupOwner, + loserStakeEscrow: address(200), + chainId: chainId, + chainConfig: "abc", + genesisBlockNum: 15000000, + sequencerInboxMaxTimeVariation: timeVars + }); + ( IOneStepProofEntry ospEntry, IChallengeManager challengeManager, IRollupAdmin rollupAdmin, - IRollupUser rollupUser, - ISequencerInbox.MaxTimeVariation memory timeVars, - address expectedRollupAddr - ) = _prepareRollupDeployment(address(rollupCreator)); + IRollupUser rollupUser + ) = _prepareRollupDeployment(address(rollupCreator), config); //// deployBridgeCreator IBridgeCreator bridgeCreator = new ERC20BridgeCreator(); @@ -47,36 +68,30 @@ contract ERC20RollupCreatorTest is AbsRollupCreatorTest { address(new ValidatorWalletCreator()) ); - // deployment params - bytes32 wasmModuleRoot = keccak256("wasm"); - uint256 chainId = 1337; - - // expect deployment events - _expectEvents(rollupCreator, bridgeCreator, expectedRollupAddr, wasmModuleRoot, chainId); - /// deploy rollup - address rollupAddress = rollupCreator.createRollup( - Config({ - confirmPeriodBlocks: 20, - extraChallengeTimeBlocks: 200, - stakeToken: address(0), - baseStake: 1000, - wasmModuleRoot: keccak256("0"), - owner: rollupOwner, - loserStakeEscrow: address(200), - chainId: chainId, - chainConfig: "abc", - genesisBlockNum: 15000000, - sequencerInboxMaxTimeVariation: timeVars - }), - nativeToken - ); + address rollupAddress = rollupCreator.createRollup(config, nativeToken); vm.stopPrank(); /// common checks - _checkRollupIsSetUp(rollupCreator, rollupAddress, rollupAdmin, rollupUser); + /// rollup creator + assertEq(IOwnable(address(rollupCreator)).owner(), deployer, "Invalid rollupCreator owner"); + + /// rollup proxy + assertEq(IOwnable(rollupAddress).owner(), rollupOwner, "Invalid rollup owner"); + assertEq(_getProxyAdmin(rollupAddress), rollupOwner, "Invalid rollup's proxyAdmin owner"); + assertEq(_getPrimary(rollupAddress), address(rollupAdmin), "Invalid proxy primary impl"); + assertEq(_getSecondary(rollupAddress), address(rollupUser), "Invalid proxy secondary impl"); + + /// rollup check + RollupCore rollup = RollupCore(rollupAddress); + assertTrue(address(rollup.sequencerInbox()) != address(0), "Invalid seqInbox"); + assertTrue(address(rollup.bridge()) != address(0), "Invalid bridge"); + assertTrue(address(rollup.inbox()) != address(0), "Invalid inbox"); + assertTrue(address(rollup.outbox()) != address(0), "Invalid outbox"); + assertTrue(address(rollup.rollupEventInbox()) != address(0), "Invalid rollupEventInbox"); + assertTrue(address(rollup.challengeManager()) != address(0), "Invalid challengeManager"); // native token check IBridge bridge = RollupCore(address(rollupAddress)).bridge(); assertEq( diff --git a/test/foundry/RollupCreator.t.sol b/test/foundry/RollupCreator.t.sol index f9dce467..9acd7106 100644 --- a/test/foundry/RollupCreator.t.sol +++ b/test/foundry/RollupCreator.t.sol @@ -15,14 +15,35 @@ contract RollupCreatorTest is AbsRollupCreatorTest { RollupCreator rollupCreator = new RollupCreator(); + // deployment params + bytes32 wasmModuleRoot = keccak256("wasm"); + uint256 chainId = 1337; + ISequencerInbox.MaxTimeVariation memory timeVars = ISequencerInbox.MaxTimeVariation( + ((60 * 60 * 24) / 15), + 12, + 60 * 60 * 24, + 60 * 60 + ); + Config memory config = Config({ + confirmPeriodBlocks: 20, + extraChallengeTimeBlocks: 200, + stakeToken: address(0), + baseStake: 1000, + wasmModuleRoot: keccak256("0"), + owner: rollupOwner, + loserStakeEscrow: address(200), + chainId: chainId, + chainConfig: "abc", + genesisBlockNum: 15000000, + sequencerInboxMaxTimeVariation: timeVars + }); + ( IOneStepProofEntry ospEntry, IChallengeManager challengeManager, IRollupAdmin rollupAdmin, - IRollupUser rollupUser, - ISequencerInbox.MaxTimeVariation memory timeVars, - address expectedRollupAddr - ) = _prepareRollupDeployment(address(rollupCreator)); + IRollupUser rollupUser + ) = _prepareRollupDeployment(address(rollupCreator), config); //// deployBridgeCreator IBridgeCreator bridgeCreator = new BridgeCreator(); @@ -37,33 +58,29 @@ contract RollupCreatorTest is AbsRollupCreatorTest { address(new ValidatorWalletCreator()) ); - // deployment params - bytes32 wasmModuleRoot = keccak256("wasm"); - uint256 chainId = 1337; - - // expect deployment events - _expectEvents(rollupCreator, bridgeCreator, expectedRollupAddr, wasmModuleRoot, chainId); - /// deploy rollup - address rollupAddress = rollupCreator.createRollup( - Config({ - confirmPeriodBlocks: 20, - extraChallengeTimeBlocks: 200, - stakeToken: address(0), - baseStake: 1000, - wasmModuleRoot: keccak256("0"), - owner: rollupOwner, - loserStakeEscrow: address(200), - chainId: 1337, - chainConfig: "abcd", - genesisBlockNum: 15000000, - sequencerInboxMaxTimeVariation: timeVars - }) - ); + address rollupAddress = rollupCreator.createRollup(config); vm.stopPrank(); /// common checks - _checkRollupIsSetUp(rollupCreator, rollupAddress, rollupAdmin, rollupUser); + + /// rollup creator + assertEq(IOwnable(address(rollupCreator)).owner(), deployer, "Invalid rollupCreator owner"); + + /// rollup proxy + assertEq(IOwnable(rollupAddress).owner(), rollupOwner, "Invalid rollup owner"); + assertEq(_getProxyAdmin(rollupAddress), rollupOwner, "Invalid rollup's proxyAdmin owner"); + assertEq(_getPrimary(rollupAddress), address(rollupAdmin), "Invalid proxy primary impl"); + assertEq(_getSecondary(rollupAddress), address(rollupUser), "Invalid proxy secondary impl"); + + /// rollup check + RollupCore rollup = RollupCore(rollupAddress); + assertTrue(address(rollup.sequencerInbox()) != address(0), "Invalid seqInbox"); + assertTrue(address(rollup.bridge()) != address(0), "Invalid bridge"); + assertTrue(address(rollup.inbox()) != address(0), "Invalid inbox"); + assertTrue(address(rollup.outbox()) != address(0), "Invalid outbox"); + assertTrue(address(rollup.rollupEventInbox()) != address(0), "Invalid rollupEventInbox"); + assertTrue(address(rollup.challengeManager()) != address(0), "Invalid challengeManager"); } } From 3bdec16eed675ba0f467d1066841cc8b04340e16 Mon Sep 17 00:00:00 2001 From: Goran Vladika Date: Fri, 2 Jun 2023 13:50:02 +0200 Subject: [PATCH 009/292] Add e2e erc20-bridge tests --- package.json | 5 +- scripts/genNetwork.ts | 17 ++ scripts/testSetup.ts | 130 +++++++++++++ test/e2e/erc20rollup.ts | 405 ++++++++++++++++++++++++++++++++++++++++ yarn.lock | 96 +++++++++- 5 files changed, 649 insertions(+), 4 deletions(-) create mode 100644 scripts/genNetwork.ts create mode 100644 scripts/testSetup.ts create mode 100644 test/e2e/erc20rollup.ts diff --git a/package.json b/package.json index a330b882..606ab8c0 100644 --- a/package.json +++ b/package.json @@ -24,9 +24,12 @@ "build:0.7": "INTERFACE_TESTER_SOLC_VERSION=0.7.0 yarn run build", "test:compatibility": "yarn run build:0.6 && yarn run build:0.7", "test:storage": "./test/storage/test.bash", + "test:e2e": "hardhat test test/e2e/*.ts", "postinstall": "patch-package" }, "dependencies": { + "@arbitrum/sdk": "^3.1.3", + "@ethersproject/providers": "^5.7.2", "@openzeppelin/contracts": "4.5.0", "@openzeppelin/contracts-upgradeable": "4.5.2", "patch-package": "^6.4.7" @@ -60,8 +63,8 @@ "solhint": "^3.3.7", "solhint-plugin-prettier": "^0.0.5", "solidity-coverage": "^0.7.20", - "tslint": "^6.1.3", "ts-node": "^10.4.0", + "tslint": "^6.1.3", "typechain": "^8.0.0", "typescript": "^4.5.4" }, diff --git a/scripts/genNetwork.ts b/scripts/genNetwork.ts new file mode 100644 index 00000000..ad60ae08 --- /dev/null +++ b/scripts/genNetwork.ts @@ -0,0 +1,17 @@ +import { setupNetworks, config } from './testSetup' +import * as fs from 'fs' + +async function main() { + const { l1Network, l2Network } = await setupNetworks( + config.ethUrl, + config.arbUrl + ) + + fs.writeFileSync( + './files/local/network.json', + JSON.stringify({ l1Network, l2Network }, null, 2) + ) + console.log('network.json updated') +} + +main().then(() => console.log('Done.')) \ No newline at end of file diff --git a/scripts/testSetup.ts b/scripts/testSetup.ts new file mode 100644 index 00000000..54db9174 --- /dev/null +++ b/scripts/testSetup.ts @@ -0,0 +1,130 @@ +import { JsonRpcProvider } from '@ethersproject/providers' +import { L1Network, L2Network, addCustomNetwork } from '@arbitrum/sdk' +import { execSync } from 'child_process' +import { Bridge__factory } from '@arbitrum/sdk/dist/lib/abi/factories/Bridge__factory' +import { RollupAdminLogic__factory } from '@arbitrum/sdk/dist/lib/abi/factories/RollupAdminLogic__factory' + +export const config = { + arbUrl: 'http://localhost:8547', + ethUrl: 'http://localhost:8545', +} + +export const getCustomNetworks = async ( + l1Url: string, + l2Url: string +): Promise<{ + l1Network: L1Network + l2Network: Omit & { nativeToken: string } +}> => { + const l1Provider = new JsonRpcProvider(l1Url) + const l2Provider = new JsonRpcProvider(l2Url) + let deploymentData: string + try { + deploymentData = execSync( + 'docker exec nitro_sequencer_1 cat /config/deployment.json' + ).toString() + } catch (e) { + deploymentData = execSync( + 'docker exec nitro-sequencer-1 cat /config/deployment.json' + ).toString() + } + const parsedDeploymentData = JSON.parse(deploymentData) as { + bridge: string + inbox: string + ['sequencer-inbox']: string + rollup: string + ['native-erc20-token']: string + } + + const rollup = RollupAdminLogic__factory.connect( + parsedDeploymentData.rollup, + l1Provider + ) + const confirmPeriodBlocks = await rollup.confirmPeriodBlocks() + + const bridge = Bridge__factory.connect( + parsedDeploymentData.bridge, + l1Provider + ) + const outboxAddr = await bridge.allowedOutboxList(0) + + const l1NetworkInfo = await l1Provider.getNetwork() + const l2NetworkInfo = await l2Provider.getNetwork() + + const l1Network: L1Network = { + blockTime: 10, + chainID: l1NetworkInfo.chainId, + explorerUrl: '', + isCustom: true, + name: 'EthLocal', + partnerChainIDs: [l2NetworkInfo.chainId], + isArbitrum: false, + } + + const l2Network: Omit & { nativeToken: string } = { + chainID: l2NetworkInfo.chainId, + confirmPeriodBlocks: confirmPeriodBlocks.toNumber(), + ethBridge: { + bridge: parsedDeploymentData.bridge, + inbox: parsedDeploymentData.inbox, + outbox: outboxAddr, + rollup: parsedDeploymentData.rollup, + sequencerInbox: parsedDeploymentData['sequencer-inbox'], + }, + nativeToken: parsedDeploymentData['native-erc20-token'], + explorerUrl: '', + isArbitrum: true, + isCustom: true, + name: 'ArbLocal', + partnerChainID: l1NetworkInfo.chainId, + retryableLifetimeSeconds: 7 * 24 * 60 * 60, + nitroGenesisBlock: 0, + nitroGenesisL1Block: 0, + depositTimeout: 900000, + } + return { + l1Network, + l2Network, + } +} + +export const setupNetworks = async (l1Url: string, l2Url: string) => { + const { l1Network, l2Network: coreL2Network } = await getCustomNetworks( + l1Url, + l2Url + ) + const l2Network: L2Network & { nativeToken: string } = { + ...coreL2Network, + tokenBridge: { + l1CustomGateway: '', + l1ERC20Gateway: '', + l1GatewayRouter: '', + l1MultiCall: '', + l1ProxyAdmin: '', + l1Weth: '', + l1WethGateway: '', + + l2CustomGateway: '', + l2ERC20Gateway: '', + l2GatewayRouter: '', + l2Multicall: '', + l2ProxyAdmin: '', + l2Weth: '', + l2WethGateway: '', + }, + } + + addCustomNetwork({ + customL1Network: l1Network, + customL2Network: l2Network, + }) + + return { + l1Network, + l2Network, + } +} + +export function sleep(ms: number) { + return new Promise(resolve => setTimeout(resolve, ms)) +} diff --git a/test/e2e/erc20rollup.ts b/test/e2e/erc20rollup.ts new file mode 100644 index 00000000..a09e5c26 --- /dev/null +++ b/test/e2e/erc20rollup.ts @@ -0,0 +1,405 @@ +import { + L1ToL2MessageGasEstimator, + L1ToL2MessageStatus, + L1TransactionReceipt, + L2Network, + L2TransactionReceipt, +} from '@arbitrum/sdk' +import { getBaseFee } from '@arbitrum/sdk/dist/lib/utils/lib' +import { JsonRpcProvider } from '@ethersproject/providers' +import { expect } from 'chai' +import { ethers, Wallet } from '@arbitrum/sdk/node_modules/ethers' +import { + ArbSys__factory, + ERC20, + ERC20Bridge__factory, + ERC20Inbox, + ERC20Inbox__factory, + ERC20__factory, + EthVault__factory, + RollupCore__factory, +} from '../../build/types' +import { setupNetworks, sleep } from '../../scripts/testSetup' +import { applyAlias } from '../contract/utils' + +export const config = { + arbUrl: 'http://localhost:8547', + ethUrl: 'http://localhost:8545', +} + +let l1Provider: JsonRpcProvider +let l2Provider: JsonRpcProvider +let _l2Network: L2Network & { nativeToken: string } +let userL1Wallet: Wallet +let userL2Wallet: Wallet +let token: ERC20 +let inbox: ERC20Inbox +const excessFeeRefundAddress = Wallet.createRandom().address +const callValueRefundAddress = Wallet.createRandom().address + +describe('ArbERC20Rollup', () => { + // setup providers and connect deployed contracts + before(async function () { + const { l2Network } = await setupNetworks(config.ethUrl, config.arbUrl) + _l2Network = l2Network + + l1Provider = new JsonRpcProvider(config.ethUrl) + l2Provider = new JsonRpcProvider(config.arbUrl) + userL1Wallet = new ethers.Wallet( + ethers.utils.sha256(ethers.utils.toUtf8Bytes('user_l1user')), + l1Provider + ) + userL2Wallet = new ethers.Wallet(userL1Wallet.privateKey, l2Provider) + token = ERC20__factory.connect(_l2Network.nativeToken, l1Provider) + inbox = ERC20Inbox__factory.connect(_l2Network.ethBridge.inbox, l1Provider) + }) + + it('should have deployed bridge contracts', async function () { + // get rollup as entry point + const rollup = RollupCore__factory.connect( + _l2Network.ethBridge.rollup, + l1Provider + ) + + // check contract refs are properly set + expect(rollup.address).to.be.eq(_l2Network.ethBridge.rollup) + expect((await rollup.sequencerInbox()).toLowerCase()).to.be.eq( + _l2Network.ethBridge.sequencerInbox + ) + expect(await rollup.outbox()).to.be.eq(_l2Network.ethBridge.outbox) + expect((await rollup.inbox()).toLowerCase()).to.be.eq( + _l2Network.ethBridge.inbox + ) + + const erc20Bridge = ERC20Bridge__factory.connect( + await rollup.bridge(), + l1Provider + ) + expect(erc20Bridge.address.toLowerCase()).to.be.eq( + _l2Network.ethBridge.bridge + ) + expect((await erc20Bridge.nativeToken()).toLowerCase()).to.be.eq( + _l2Network.nativeToken + ) + }) + + it('can deposit native token to L2', async function () { + // snapshot state before deposit + const userL1TokenBalance = await token.balanceOf(userL1Wallet.address) + const userL2Balance = await l2Provider.getBalance(userL2Wallet.address) + const bridgeL1TokenBalance = await token.balanceOf( + _l2Network.ethBridge.bridge + ) + + /// deposit 60 tokens + const amountToDeposit = ethers.utils.parseEther('60') + await ( + await token + .connect(userL1Wallet) + .approve(_l2Network.ethBridge.inbox, amountToDeposit) + ).wait() + const depositTx = await inbox + .connect(userL1Wallet) + .depositERC20(amountToDeposit) + + // wait for deposit to be processed + const depositRec = await L1TransactionReceipt.monkeyPatchEthDepositWait( + depositTx + ).wait() + const l2Result = await depositRec.waitForL2(l2Provider) + expect(l2Result.complete).to.be.true + + // check user balance increased on L2 and decreased on L1 + const userL1TokenBalanceAfter = await token.balanceOf(userL1Wallet.address) + expect(userL1TokenBalance.sub(userL1TokenBalanceAfter)).to.be.eq( + amountToDeposit + ) + const userL2BalanceAfter = await l2Provider.getBalance(userL2Wallet.address) + expect(userL2BalanceAfter.sub(userL2Balance)).to.be.eq(amountToDeposit) + + const bridgeL1TokenBalanceAfter = await token.balanceOf( + _l2Network.ethBridge.bridge + ) + // bridge escrow increased + expect(bridgeL1TokenBalanceAfter.sub(bridgeL1TokenBalance)).to.be.eq( + amountToDeposit + ) + }) + + it('can issue retryable ticket (no calldata)', async function () { + // snapshot state before issuing retryable + const userL1TokenBalance = await token.balanceOf(userL1Wallet.address) + const userL2Balance = await l2Provider.getBalance(userL2Wallet.address) + const aliasL2Balance = await l2Provider.getBalance( + applyAlias(userL2Wallet.address) + ) + const bridgeL1TokenBalance = await token.balanceOf( + _l2Network.ethBridge.bridge + ) + const excessFeeReceiverBalance = await l2Provider.getBalance( + excessFeeRefundAddress + ) + const callValueRefundReceiverBalance = await l2Provider.getBalance( + callValueRefundAddress + ) + + //// retryables params + + const to = userL1Wallet.address + const l2CallValue = ethers.utils.parseEther('37') + const data = '0x' + + const l1ToL2MessageGasEstimate = new L1ToL2MessageGasEstimator(l2Provider) + const retryableParams = await l1ToL2MessageGasEstimate.estimateAll( + { + from: userL1Wallet.address, + to: to, + l2CallValue: l2CallValue, + excessFeeRefundAddress: excessFeeRefundAddress, + callValueRefundAddress: callValueRefundAddress, + data: data, + }, + await getBaseFee(l1Provider), + l1Provider + ) + + const tokenTotalFeeAmount = retryableParams.deposit + const gasLimit = retryableParams.gasLimit + const maxFeePerGas = retryableParams.maxFeePerGas + const maxSubmissionCost = retryableParams.maxSubmissionCost + + /// deposit 37 tokens using retryable + await ( + await token + .connect(userL1Wallet) + .approve(_l2Network.ethBridge.inbox, tokenTotalFeeAmount) + ).wait() + + const retryableTx = await inbox + .connect(userL1Wallet) + .createRetryableTicket( + to, + l2CallValue, + maxSubmissionCost, + excessFeeRefundAddress, + callValueRefundAddress, + gasLimit, + maxFeePerGas, + tokenTotalFeeAmount, + data + ) + + // wait for L2 msg to be executed + await waitOnL2Msg(retryableTx) + + // check balances after retryable is processed + const userL1TokenAfter = await token.balanceOf(userL1Wallet.address) + expect(userL1TokenBalance.sub(userL1TokenAfter)).to.be.eq( + tokenTotalFeeAmount + ) + + const userL2After = await l2Provider.getBalance(userL2Wallet.address) + expect(userL2After.sub(userL2Balance)).to.be.eq(l2CallValue) + + const aliasL2BalanceAfter = await l2Provider.getBalance( + applyAlias(userL2Wallet.address) + ) + expect(aliasL2BalanceAfter).to.be.eq(aliasL2Balance) + + const excessFeeReceiverBalanceAfter = await l2Provider.getBalance( + excessFeeRefundAddress + ) + expect(excessFeeReceiverBalanceAfter).to.be.gte(excessFeeReceiverBalance) + + const callValueRefundReceiverBalanceAfter = await l2Provider.getBalance( + callValueRefundAddress + ) + expect(callValueRefundReceiverBalanceAfter).to.be.eq( + callValueRefundReceiverBalance + ) + + const bridgeL1TokenAfter = await token.balanceOf( + _l2Network.ethBridge.bridge + ) + expect(bridgeL1TokenAfter.sub(bridgeL1TokenBalance)).to.be.eq( + tokenTotalFeeAmount + ) + }) + + it('can issue retryable ticket', async function () { + // deploy contract on L2 which will be retryable's target + const ethVaultContract = await new EthVault__factory( + userL2Wallet.connect(l2Provider) + ).deploy() + await ethVaultContract.deployed() + + // snapshot state before retryable + const userL1TokenBalance = await token.balanceOf(userL1Wallet.address) + const userL2Balance = await l2Provider.getBalance(userL2Wallet.address) + const aliasL2Balance = await l2Provider.getBalance( + applyAlias(userL2Wallet.address) + ) + const bridgeL1TokenBalance = await token.balanceOf( + _l2Network.ethBridge.bridge + ) + const excessFeeReceiverBalance = await l2Provider.getBalance( + excessFeeRefundAddress + ) + const callValueRefundReceiverBalance = await l2Provider.getBalance( + callValueRefundAddress + ) + + //// retryables params + + const to = ethVaultContract.address + const l2CallValue = ethers.utils.parseEther('45') + // calldata -> change 'version' field to 11 + const newValue = 11 + const data = new ethers.utils.Interface([ + 'function setVersion(uint256 _version)', + ]).encodeFunctionData('setVersion', [newValue]) + + const l1ToL2MessageGasEstimate = new L1ToL2MessageGasEstimator(l2Provider) + const retryableParams = await l1ToL2MessageGasEstimate.estimateAll( + { + from: userL1Wallet.address, + to: to, + l2CallValue: l2CallValue, + excessFeeRefundAddress: excessFeeRefundAddress, + callValueRefundAddress: callValueRefundAddress, + data: data, + }, + await getBaseFee(l1Provider), + l1Provider + ) + + const tokenTotalFeeAmount = retryableParams.deposit + const gasLimit = retryableParams.gasLimit + const maxFeePerGas = retryableParams.maxFeePerGas + const maxSubmissionCost = retryableParams.maxSubmissionCost + + /// execute retryable + await ( + await token + .connect(userL1Wallet) + .approve(_l2Network.ethBridge.inbox, tokenTotalFeeAmount) + ).wait() + + const retryableTx = await inbox + .connect(userL1Wallet) + .createRetryableTicket( + to, + l2CallValue, + maxSubmissionCost, + excessFeeRefundAddress, + callValueRefundAddress, + gasLimit, + maxFeePerGas, + tokenTotalFeeAmount, + data + ) + + // wait for L2 msg to be executed + await waitOnL2Msg(retryableTx) + + // check balances after retryable is processed + const userL1TokenAfter = await token.balanceOf(userL2Wallet.address) + expect(userL1TokenBalance.sub(userL1TokenAfter)).to.be.eq( + tokenTotalFeeAmount + ) + + const userL2After = await l2Provider.getBalance(userL2Wallet.address) + expect(userL2After).to.be.eq(userL2Balance) + + const ethVaultBalanceAfter = await l2Provider.getBalance( + ethVaultContract.address + ) + expect(ethVaultBalanceAfter).to.be.eq(l2CallValue) + + const ethVaultVersion = await ethVaultContract.version() + expect(ethVaultVersion).to.be.eq(newValue) + + const aliasL2BalanceAfter = await l2Provider.getBalance( + applyAlias(userL1Wallet.address) + ) + expect(aliasL2BalanceAfter).to.be.eq(aliasL2Balance) + + const excessFeeReceiverBalanceAfter = await l2Provider.getBalance( + excessFeeRefundAddress + ) + expect(excessFeeReceiverBalanceAfter).to.be.gte(excessFeeReceiverBalance) + + const callValueRefundReceiverBalanceAfter = await l2Provider.getBalance( + callValueRefundAddress + ) + expect(callValueRefundReceiverBalanceAfter).to.be.eq( + callValueRefundReceiverBalance + ) + + const bridgeL1TokenAfter = await token.balanceOf( + _l2Network.ethBridge.bridge + ) + expect(bridgeL1TokenAfter.sub(bridgeL1TokenBalance)).to.be.eq( + tokenTotalFeeAmount + ) + }) + + it('can withdraw funds from L2 to L1', async function () { + // snapshot state before issuing retryable + const userL1TokenBalance = await token.balanceOf(userL1Wallet.address) + const userL2Balance = await l2Provider.getBalance(userL2Wallet.address) + const bridgeL1TokenBalance = await token.balanceOf( + _l2Network.ethBridge.bridge + ) + + /// send L2 to L1 TX + const arbSys = ArbSys__factory.connect( + '0x0000000000000000000000000000000000000064', + l2Provider + ) + const withdrawAmount = ethers.utils.parseEther('3') + const withdrawTx = await arbSys + .connect(userL2Wallet) + .sendTxToL1(userL1Wallet.address, '0x', { + value: withdrawAmount, + }) + const withdrawReceipt = await withdrawTx.wait() + const l2Receipt = new L2TransactionReceipt(withdrawReceipt) + + // wait until dispute period passes and withdrawal is ready for execution + await sleep(5 * 1000) + + const messages = await l2Receipt.getL2ToL1Messages(userL1Wallet) + const l2ToL1Msg = messages[0] + const timeToWaitMs = 60 * 1000 + await l2ToL1Msg.waitUntilReadyToExecute(l2Provider, timeToWaitMs) + + // execute + await (await l2ToL1Msg.execute(l2Provider)).wait() + + // check balances after withdrawal is processed + const userL1TokenAfter = await token.balanceOf(userL2Wallet.address) + expect(userL1TokenAfter.sub(userL1TokenBalance)).to.be.eq(withdrawAmount) + + const userL2BalanceAfter = await l2Provider.getBalance(userL2Wallet.address) + expect(userL2BalanceAfter).to.be.lte(userL2Balance.sub(withdrawAmount)) + + const bridgeL1TokenAfter = await token.balanceOf( + _l2Network.ethBridge.bridge + ) + expect(bridgeL1TokenBalance.sub(bridgeL1TokenAfter)).to.be.eq( + withdrawAmount + ) + }) +}) + +async function waitOnL2Msg(tx: ethers.ContractTransaction) { + const retryableReceipt = await tx.wait() + const l1TxReceipt = new L1TransactionReceipt(retryableReceipt) + const messages = await l1TxReceipt.getL1ToL2Messages(l2Provider) + + // 1 msg expected + const messageResult = await messages[0].waitForStatus() + const status = messageResult.status + expect(status).to.be.eq(L1ToL2MessageStatus.REDEEMED) +} diff --git a/yarn.lock b/yarn.lock index 824e092e..f83dbf09 100644 --- a/yarn.lock +++ b/yarn.lock @@ -7,6 +7,16 @@ resolved "https://registry.yarnpkg.com/@aduh95/viz.js/-/viz.js-3.7.0.tgz#a20d86c5fc8f6abebdc39b96a4326e10375d77c0" integrity sha512-20Pk2Z98fbPLkECcrZSJszKos/OgtvJJR3NcbVfgCJ6EQjDNzW2P1BKqImOz3tJ952dvO2DWEhcLhQ1Wz1e9ng== +"@arbitrum/sdk@^3.1.3": + version "3.1.3" + resolved "https://registry.yarnpkg.com/@arbitrum/sdk/-/sdk-3.1.3.tgz#75236043717a450b569faaa087687c51d525b0c3" + integrity sha512-Dn1or7/Guc3dItuiiWaoYQ37aCDwiWTZGPIrg4yBJW27BgiDGbo0mjPDAhKTh4p5NDOWyE8bZ0vZai86COZIUA== + dependencies: + "@ethersproject/address" "^5.0.8" + "@ethersproject/bignumber" "^5.1.1" + "@ethersproject/bytes" "^5.0.8" + ethers "^5.1.0" + "@babel/code-frame@^7.0.0": version "7.16.7" resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.16.7.tgz#44416b6bd7624b998f5b1af5d470856c40138789" @@ -351,7 +361,7 @@ "@ethersproject/logger" "^5.6.0" "@ethersproject/rlp" "^5.6.0" -"@ethersproject/address@5.7.0", "@ethersproject/address@^5.0.2", "@ethersproject/address@^5.7.0": +"@ethersproject/address@5.7.0", "@ethersproject/address@^5.0.2", "@ethersproject/address@^5.0.8", "@ethersproject/address@^5.7.0": version "5.7.0" resolved "https://registry.yarnpkg.com/@ethersproject/address/-/address-5.7.0.tgz#19b56c4d74a3b0a46bfdbb6cfcc0a153fc697f37" integrity sha512-9wYhYt7aghVGo758POM5nqcOMaE168Q6aRLJZwUmiqSrAungkG74gSSeKEIR7ukixesdRZGPgVqme6vmxs1fkA== @@ -412,7 +422,7 @@ "@ethersproject/logger" "^5.6.0" bn.js "^4.11.9" -"@ethersproject/bignumber@5.7.0", "@ethersproject/bignumber@^5.7.0": +"@ethersproject/bignumber@5.7.0", "@ethersproject/bignumber@^5.1.1", "@ethersproject/bignumber@^5.7.0": version "5.7.0" resolved "https://registry.yarnpkg.com/@ethersproject/bignumber/-/bignumber-5.7.0.tgz#e2f03837f268ba655ffba03a57853e18a18dc9c2" integrity sha512-n1CAdIHRWjSucQO3MC1zPSVgV/6dy/fjL9pMrPP9peL+QxEg9wOsVqwD4+818B6LUEtaXzVHQiuivzRoxPxUGw== @@ -437,7 +447,7 @@ dependencies: "@ethersproject/logger" "^5.6.0" -"@ethersproject/bytes@5.7.0", "@ethersproject/bytes@^5.7.0": +"@ethersproject/bytes@5.7.0", "@ethersproject/bytes@^5.0.8", "@ethersproject/bytes@^5.7.0": version "5.7.0" resolved "https://registry.yarnpkg.com/@ethersproject/bytes/-/bytes-5.7.0.tgz#a00f6ea8d7e7534d6d87f47188af1148d71f155d" integrity sha512-nsbxwgFXWh9NyYWo+U8atvmMsSdKJprTcICAkvbBffT75qDocbuggBU0SJiVK2MuTrp0q+xvLkTnGMPK1+uA9A== @@ -681,6 +691,13 @@ dependencies: "@ethersproject/logger" "^5.7.0" +"@ethersproject/networks@5.7.1": + version "5.7.1" + resolved "https://registry.yarnpkg.com/@ethersproject/networks/-/networks-5.7.1.tgz#118e1a981d757d45ccea6bb58d9fd3d9db14ead6" + integrity sha512-n/MufjFYv3yFcUyfhnXotyDlNdFb7onmkSy8aQERi2PjNcnWQ66xXxa3XlS8nCcA8aJKJjIIMNJTC7tu80GwpQ== + dependencies: + "@ethersproject/logger" "^5.7.0" + "@ethersproject/pbkdf2@5.6.0", "@ethersproject/pbkdf2@^5.6.0": version "5.6.0" resolved "https://registry.yarnpkg.com/@ethersproject/pbkdf2/-/pbkdf2-5.6.0.tgz#04fcc2d7c6bff88393f5b4237d906a192426685a" @@ -794,6 +811,32 @@ bech32 "1.1.4" ws "7.4.6" +"@ethersproject/providers@5.7.2", "@ethersproject/providers@^5.7.2": + version "5.7.2" + resolved "https://registry.yarnpkg.com/@ethersproject/providers/-/providers-5.7.2.tgz#f8b1a4f275d7ce58cf0a2eec222269a08beb18cb" + integrity sha512-g34EWZ1WWAVgr4aptGlVBF8mhl3VWjv+8hoAnzStu8Ah22VHBsuGzP17eb6xDVRzw895G4W7vvx60lFFur/1Rg== + dependencies: + "@ethersproject/abstract-provider" "^5.7.0" + "@ethersproject/abstract-signer" "^5.7.0" + "@ethersproject/address" "^5.7.0" + "@ethersproject/base64" "^5.7.0" + "@ethersproject/basex" "^5.7.0" + "@ethersproject/bignumber" "^5.7.0" + "@ethersproject/bytes" "^5.7.0" + "@ethersproject/constants" "^5.7.0" + "@ethersproject/hash" "^5.7.0" + "@ethersproject/logger" "^5.7.0" + "@ethersproject/networks" "^5.7.0" + "@ethersproject/properties" "^5.7.0" + "@ethersproject/random" "^5.7.0" + "@ethersproject/rlp" "^5.7.0" + "@ethersproject/sha2" "^5.7.0" + "@ethersproject/strings" "^5.7.0" + "@ethersproject/transactions" "^5.7.0" + "@ethersproject/web" "^5.7.0" + bech32 "1.1.4" + ws "7.4.6" + "@ethersproject/random@5.6.0", "@ethersproject/random@^5.6.0": version "5.6.0" resolved "https://registry.yarnpkg.com/@ethersproject/random/-/random-5.6.0.tgz#1505d1ab6a250e0ee92f436850fa3314b2cb5ae6" @@ -1031,6 +1074,17 @@ "@ethersproject/properties" "^5.7.0" "@ethersproject/strings" "^5.7.0" +"@ethersproject/web@5.7.1": + version "5.7.1" + resolved "https://registry.yarnpkg.com/@ethersproject/web/-/web-5.7.1.tgz#de1f285b373149bee5928f4eb7bcb87ee5fbb4ae" + integrity sha512-Gueu8lSvyjBWL4cYsWsjh6MtMwM0+H4HvqFPZfB6dV8ctbP9zFAO73VG1cMWae0FLPCtz0peKPpZY8/ugJJX2w== + dependencies: + "@ethersproject/base64" "^5.7.0" + "@ethersproject/bytes" "^5.7.0" + "@ethersproject/logger" "^5.7.0" + "@ethersproject/properties" "^5.7.0" + "@ethersproject/strings" "^5.7.0" + "@ethersproject/wordlists@5.6.0", "@ethersproject/wordlists@^5.6.0": version "5.6.0" resolved "https://registry.yarnpkg.com/@ethersproject/wordlists/-/wordlists-5.6.0.tgz#79e62c5276e091d8575f6930ba01a29218ded032" @@ -4911,6 +4965,42 @@ ethers@^5.0.1, ethers@^5.0.2: "@ethersproject/web" "5.6.0" "@ethersproject/wordlists" "5.6.0" +ethers@^5.1.0: + version "5.7.2" + resolved "https://registry.yarnpkg.com/ethers/-/ethers-5.7.2.tgz#3a7deeabbb8c030d4126b24f84e525466145872e" + integrity sha512-wswUsmWo1aOK8rR7DIKiWSw9DbLWe6x98Jrn8wcTflTVvaXhAMaB5zGAXy0GYQEQp9iO1iSHWVyARQm11zUtyg== + dependencies: + "@ethersproject/abi" "5.7.0" + "@ethersproject/abstract-provider" "5.7.0" + "@ethersproject/abstract-signer" "5.7.0" + "@ethersproject/address" "5.7.0" + "@ethersproject/base64" "5.7.0" + "@ethersproject/basex" "5.7.0" + "@ethersproject/bignumber" "5.7.0" + "@ethersproject/bytes" "5.7.0" + "@ethersproject/constants" "5.7.0" + "@ethersproject/contracts" "5.7.0" + "@ethersproject/hash" "5.7.0" + "@ethersproject/hdnode" "5.7.0" + "@ethersproject/json-wallets" "5.7.0" + "@ethersproject/keccak256" "5.7.0" + "@ethersproject/logger" "5.7.0" + "@ethersproject/networks" "5.7.1" + "@ethersproject/pbkdf2" "5.7.0" + "@ethersproject/properties" "5.7.0" + "@ethersproject/providers" "5.7.2" + "@ethersproject/random" "5.7.0" + "@ethersproject/rlp" "5.7.0" + "@ethersproject/sha2" "5.7.0" + "@ethersproject/signing-key" "5.7.0" + "@ethersproject/solidity" "5.7.0" + "@ethersproject/strings" "5.7.0" + "@ethersproject/transactions" "5.7.0" + "@ethersproject/units" "5.7.0" + "@ethersproject/wallet" "5.7.0" + "@ethersproject/web" "5.7.1" + "@ethersproject/wordlists" "5.7.0" + ethers@^5.5.2: version "5.6.4" resolved "https://registry.yarnpkg.com/ethers/-/ethers-5.6.4.tgz#23629e9a7d4bc5802dfb53d4da420d738744b53c" From 12a4a0270e16e596cd6f35b5234aafd305a46949 Mon Sep 17 00:00:00 2001 From: Goran Vladika Date: Sun, 4 Jun 2023 19:50:07 +0200 Subject: [PATCH 010/292] Remove unnecessary CI config --- .github/workflows/contract-tests.yml | 4 ---- 1 file changed, 4 deletions(-) diff --git a/.github/workflows/contract-tests.yml b/.github/workflows/contract-tests.yml index 15384ce5..b5add914 100644 --- a/.github/workflows/contract-tests.yml +++ b/.github/workflows/contract-tests.yml @@ -13,10 +13,6 @@ jobs: test-unit: name: Test unit runs-on: ubuntu-latest - defaults: - run: - shell: bash - working-directory: contracts steps: - uses: actions/checkout@v3 with: From 89f12bd5b7abb46fd1982a2ca557c5124c41bdd0 Mon Sep 17 00:00:00 2001 From: Goran Vladika Date: Sun, 4 Jun 2023 19:58:33 +0200 Subject: [PATCH 011/292] Format contracts --- scripts/genNetwork.ts | 2 +- src/bridge/Bridge.sol | 2 +- src/bridge/ERC20Bridge.sol | 2 +- src/bridge/ERC20Inbox.sol | 2 +- src/bridge/ERC20Outbox.sol | 2 +- src/bridge/IBridge.sol | 2 +- src/bridge/IERC20Bridge.sol | 2 +- src/bridge/IERC20Inbox.sol | 2 +- src/bridge/IEthBridge.sol | 2 +- src/bridge/IEthInbox.sol | 2 +- src/bridge/IInbox.sol | 2 +- src/bridge/Inbox.sol | 2 +- src/bridge/Outbox.sol | 2 +- src/libraries/Error.sol | 2 +- src/mocks/BridgeStub.sol | 2 +- src/mocks/InboxStub.sol | 2 +- src/mocks/SequencerInboxStub.sol | 2 +- src/rollup/AbsBridgeCreator.sol | 2 +- src/rollup/AbsRollupCreator.sol | 2 +- src/rollup/AbsRollupEventInbox.sol | 2 +- src/rollup/BridgeCreator.sol | 2 +- src/rollup/ERC20BridgeCreator.sol | 2 +- src/rollup/ERC20RollupCreator.sol | 2 +- src/rollup/ERC20RollupEventInbox.sol | 2 +- src/rollup/IBridgeCreator.sol | 2 +- src/rollup/RollupCreator.sol | 2 +- src/rollup/RollupEventInbox.sol | 2 +- src/test-helpers/BridgeTester.sol | 2 +- test/foundry/AbsRollupCreator.t.sol | 5 +---- 29 files changed, 29 insertions(+), 32 deletions(-) diff --git a/scripts/genNetwork.ts b/scripts/genNetwork.ts index ad60ae08..992e4597 100644 --- a/scripts/genNetwork.ts +++ b/scripts/genNetwork.ts @@ -14,4 +14,4 @@ async function main() { console.log('network.json updated') } -main().then(() => console.log('Done.')) \ No newline at end of file +main().then(() => console.log('Done.')) diff --git a/src/bridge/Bridge.sol b/src/bridge/Bridge.sol index 9ebb5091..ce32a17b 100644 --- a/src/bridge/Bridge.sol +++ b/src/bridge/Bridge.sol @@ -51,4 +51,4 @@ contract Bridge is AbsBridge, IEthBridge { function _baseFeeToReport() internal view override returns (uint256) { return block.basefee; } -} \ No newline at end of file +} diff --git a/src/bridge/ERC20Bridge.sol b/src/bridge/ERC20Bridge.sol index c6f08548..5c643562 100644 --- a/src/bridge/ERC20Bridge.sol +++ b/src/bridge/ERC20Bridge.sol @@ -71,4 +71,4 @@ contract ERC20Bridge is AbsBridge, IERC20Bridge { // why baseFee is reported as 0 here. return 0; } -} \ No newline at end of file +} diff --git a/src/bridge/ERC20Inbox.sol b/src/bridge/ERC20Inbox.sol index b8dbdc5c..0a065988 100644 --- a/src/bridge/ERC20Inbox.sol +++ b/src/bridge/ERC20Inbox.sol @@ -138,4 +138,4 @@ contract ERC20Inbox is AbsInbox, IERC20Inbox { tokenAmount ); } -} \ No newline at end of file +} diff --git a/src/bridge/ERC20Outbox.sol b/src/bridge/ERC20Outbox.sol index 444e6729..e5fe31c8 100644 --- a/src/bridge/ERC20Outbox.sol +++ b/src/bridge/ERC20Outbox.sol @@ -24,4 +24,4 @@ contract ERC20Outbox is AbsOutbox { function _amountToSetInContext(uint256 value) internal pure override returns (uint256) { return value; } -} \ No newline at end of file +} diff --git a/src/bridge/IBridge.sol b/src/bridge/IBridge.sol index 25267781..a84f52d9 100644 --- a/src/bridge/IBridge.sol +++ b/src/bridge/IBridge.sol @@ -97,4 +97,4 @@ interface IBridge { function setDelayedInbox(address inbox, bool enabled) external; function setOutbox(address inbox, bool enabled) external; -} \ No newline at end of file +} diff --git a/src/bridge/IERC20Bridge.sol b/src/bridge/IERC20Bridge.sol index d654b3d3..f937a1c6 100644 --- a/src/bridge/IERC20Bridge.sol +++ b/src/bridge/IERC20Bridge.sol @@ -32,4 +32,4 @@ interface IERC20Bridge is IBridge { // ---------- initializer ---------- function initialize(IOwnable rollup_, address nativeToken_) external; -} \ No newline at end of file +} diff --git a/src/bridge/IERC20Inbox.sol b/src/bridge/IERC20Inbox.sol index 5ad88a20..dd1b8390 100644 --- a/src/bridge/IERC20Inbox.sol +++ b/src/bridge/IERC20Inbox.sol @@ -72,4 +72,4 @@ interface IERC20Inbox is IInbox { uint256 tokenTotalFeeAmount, bytes calldata data ) external returns (uint256); -} \ No newline at end of file +} diff --git a/src/bridge/IEthBridge.sol b/src/bridge/IEthBridge.sol index a1b3183d..aa52d75c 100644 --- a/src/bridge/IEthBridge.sol +++ b/src/bridge/IEthBridge.sol @@ -23,4 +23,4 @@ interface IEthBridge is IBridge { // ---------- initializer ---------- function initialize(IOwnable rollup_) external; -} \ No newline at end of file +} diff --git a/src/bridge/IEthInbox.sol b/src/bridge/IEthInbox.sol index 48c1804e..dd484903 100644 --- a/src/bridge/IEthInbox.sol +++ b/src/bridge/IEthInbox.sol @@ -130,4 +130,4 @@ interface IEthInbox is IInbox { * this is used to fix the storage slots */ function postUpgradeInit(IBridge _bridge) external; -} \ No newline at end of file +} diff --git a/src/bridge/IInbox.sol b/src/bridge/IInbox.sol index b27558c4..fc0ba1a9 100644 --- a/src/bridge/IInbox.sol +++ b/src/bridge/IInbox.sol @@ -80,4 +80,4 @@ interface IInbox is IDelayedMessageProvider { // ---------- initializer ---------- function initialize(IBridge _bridge, ISequencerInbox _sequencerInbox) external; -} \ No newline at end of file +} diff --git a/src/bridge/Inbox.sol b/src/bridge/Inbox.sol index fd1fc704..bd37b098 100644 --- a/src/bridge/Inbox.sol +++ b/src/bridge/Inbox.sol @@ -421,4 +421,4 @@ contract Inbox is AbsInbox, IEthInbox { messageDataHash ); } -} \ No newline at end of file +} diff --git a/src/bridge/Outbox.sol b/src/bridge/Outbox.sol index 31f50eb7..d7d79ef5 100644 --- a/src/bridge/Outbox.sol +++ b/src/bridge/Outbox.sol @@ -16,4 +16,4 @@ contract Outbox is AbsOutbox { function _amountToSetInContext(uint256) internal pure override returns (uint256) { return 0; } -} \ No newline at end of file +} diff --git a/src/libraries/Error.sol b/src/libraries/Error.sol index 2d7294e7..75fa5045 100644 --- a/src/libraries/Error.sol +++ b/src/libraries/Error.sol @@ -168,4 +168,4 @@ error DataNotAuthenticated(); error AlreadyValidDASKeyset(bytes32); /// @dev Tried to use or invalidate an already invalid Data Availability Service keyset -error NoSuchKeyset(bytes32); \ No newline at end of file +error NoSuchKeyset(bytes32); diff --git a/src/mocks/BridgeStub.sol b/src/mocks/BridgeStub.sol index 67ff03ad..96d4d65b 100644 --- a/src/mocks/BridgeStub.sol +++ b/src/mocks/BridgeStub.sol @@ -180,4 +180,4 @@ contract BridgeStub is IBridge, IEthBridge { function initialize(IOwnable) external pure { revert("NOT_IMPLEMENTED"); } -} \ No newline at end of file +} diff --git a/src/mocks/InboxStub.sol b/src/mocks/InboxStub.sol index 51767d29..dd9d4417 100644 --- a/src/mocks/InboxStub.sol +++ b/src/mocks/InboxStub.sol @@ -202,4 +202,4 @@ contract InboxStub is IInbox, IEthInbox { function allowListEnabled() external pure returns (bool) { revert("NOT_IMPLEMENTED"); } -} \ No newline at end of file +} diff --git a/src/mocks/SequencerInboxStub.sol b/src/mocks/SequencerInboxStub.sol index 85a2c2ab..601ed119 100644 --- a/src/mocks/SequencerInboxStub.sol +++ b/src/mocks/SequencerInboxStub.sol @@ -52,4 +52,4 @@ contract SequencerInboxStub is SequencerInbox { this; // silence warning about function not being view return bounds; } -} \ No newline at end of file +} diff --git a/src/rollup/AbsBridgeCreator.sol b/src/rollup/AbsBridgeCreator.sol index 0eaf16d6..4379c50a 100644 --- a/src/rollup/AbsBridgeCreator.sol +++ b/src/rollup/AbsBridgeCreator.sol @@ -114,4 +114,4 @@ abstract contract AbsBridgeCreator is Ownable, IBridgeCreator { IOwnable rollup, address ) internal virtual; -} \ No newline at end of file +} diff --git a/src/rollup/AbsRollupCreator.sol b/src/rollup/AbsRollupCreator.sol index 54cea1b0..8dbafb2a 100644 --- a/src/rollup/AbsRollupCreator.sol +++ b/src/rollup/AbsRollupCreator.sol @@ -137,4 +137,4 @@ abstract contract AbsRollupCreator is Ownable, IRollupCreator { IRollupEventInbox, Outbox ); -} \ No newline at end of file +} diff --git a/src/rollup/AbsRollupEventInbox.sol b/src/rollup/AbsRollupEventInbox.sol index 9ebe6972..be59f537 100644 --- a/src/rollup/AbsRollupEventInbox.sol +++ b/src/rollup/AbsRollupEventInbox.sol @@ -47,4 +47,4 @@ abstract contract AbsRollupEventInbox is } function _enqueueInitializationMsg(bytes memory initMsg) internal virtual returns (uint256); -} \ No newline at end of file +} diff --git a/src/rollup/BridgeCreator.sol b/src/rollup/BridgeCreator.sol index e773e43c..966e624b 100644 --- a/src/rollup/BridgeCreator.sol +++ b/src/rollup/BridgeCreator.sol @@ -41,4 +41,4 @@ contract BridgeCreator is AbsBridgeCreator, IEthBridgeCreator { ) internal override { IEthBridge(address(bridge)).initialize(IOwnable(rollup)); } -} \ No newline at end of file +} diff --git a/src/rollup/ERC20BridgeCreator.sol b/src/rollup/ERC20BridgeCreator.sol index 9f451ce4..5d83e0b3 100644 --- a/src/rollup/ERC20BridgeCreator.sol +++ b/src/rollup/ERC20BridgeCreator.sol @@ -45,4 +45,4 @@ contract ERC20BridgeCreator is AbsBridgeCreator, IERC20BridgeCreator { ) internal override { IERC20Bridge(address(bridge)).initialize(IOwnable(rollup), nativeToken); } -} \ No newline at end of file +} diff --git a/src/rollup/ERC20RollupCreator.sol b/src/rollup/ERC20RollupCreator.sol index 45d0fc46..ceebd917 100644 --- a/src/rollup/ERC20RollupCreator.sol +++ b/src/rollup/ERC20RollupCreator.sol @@ -47,4 +47,4 @@ contract ERC20RollupCreator is AbsRollupCreator, IERC20RollupCreator { maxTimeVariation ); } -} \ No newline at end of file +} diff --git a/src/rollup/ERC20RollupEventInbox.sol b/src/rollup/ERC20RollupEventInbox.sol index c9f4e28f..20451f34 100644 --- a/src/rollup/ERC20RollupEventInbox.sol +++ b/src/rollup/ERC20RollupEventInbox.sol @@ -23,4 +23,4 @@ contract ERC20RollupEventInbox is AbsRollupEventInbox { tokenAmount ); } -} \ No newline at end of file +} diff --git a/src/rollup/IBridgeCreator.sol b/src/rollup/IBridgeCreator.sol index e938f0e2..f03e2a0e 100644 --- a/src/rollup/IBridgeCreator.sol +++ b/src/rollup/IBridgeCreator.sol @@ -61,4 +61,4 @@ interface IERC20BridgeCreator is IBridgeCreator { IRollupEventInbox, Outbox ); -} \ No newline at end of file +} diff --git a/src/rollup/RollupCreator.sol b/src/rollup/RollupCreator.sol index faa46237..17ff8196 100644 --- a/src/rollup/RollupCreator.sol +++ b/src/rollup/RollupCreator.sol @@ -42,4 +42,4 @@ contract RollupCreator is AbsRollupCreator, IEthRollupCreator { maxTimeVariation ); } -} \ No newline at end of file +} diff --git a/src/rollup/RollupEventInbox.sol b/src/rollup/RollupEventInbox.sol index e59394df..5b552aa5 100644 --- a/src/rollup/RollupEventInbox.sol +++ b/src/rollup/RollupEventInbox.sol @@ -21,4 +21,4 @@ contract RollupEventInbox is AbsRollupEventInbox { keccak256(initMsg) ); } -} \ No newline at end of file +} diff --git a/src/test-helpers/BridgeTester.sol b/src/test-helpers/BridgeTester.sol index e0f742f6..9a680f44 100644 --- a/src/test-helpers/BridgeTester.sol +++ b/src/test-helpers/BridgeTester.sol @@ -237,4 +237,4 @@ contract BridgeTester is Initializable, DelegateCallAware, IBridge, IEthBridge { receive() external payable {} function acceptFundsFromOldBridge() external payable {} -} \ No newline at end of file +} diff --git a/test/foundry/AbsRollupCreator.t.sol b/test/foundry/AbsRollupCreator.t.sol index ccaa4d38..214fe73b 100644 --- a/test/foundry/AbsRollupCreator.t.sol +++ b/test/foundry/AbsRollupCreator.t.sol @@ -21,10 +21,7 @@ abstract contract AbsRollupCreatorTest is Test { address public rollupOwner = address(4400); address public deployer = address(4300); - function _prepareRollupDeployment( - address rollupCreator, - Config memory config - ) + function _prepareRollupDeployment(address rollupCreator, Config memory config) internal returns ( IOneStepProofEntry ospEntry, From d9426288c08c13a4caaa29619fac440c3c0dcf1e Mon Sep 17 00:00:00 2001 From: Goran Vladika Date: Mon, 5 Jun 2023 14:26:21 +0200 Subject: [PATCH 012/292] Add gap variables to AbsBridge --- src/bridge/AbsBridge.sol | 7 +++++++ test/storage/Bridge.dot | 17 ++++++++++------- 2 files changed, 17 insertions(+), 7 deletions(-) diff --git a/src/bridge/AbsBridge.sol b/src/bridge/AbsBridge.sol index 5936e57a..438c4341 100644 --- a/src/bridge/AbsBridge.sol +++ b/src/bridge/AbsBridge.sol @@ -292,4 +292,11 @@ abstract contract AbsBridge is Initializable, DelegateCallAware, IBridge { /// @dev get base fee which is emitted in `MessageDelivered` event and then picked up and /// used in ArbOs to calculate the submission fee for retryable ticket function _baseFeeToReport() internal view virtual returns (uint256); + + /** + * @dev This empty reserved space is put in place to allow future versions to add new + * variables without shifting down storage in the inheritance chain. + * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps + */ + uint256[50] private __gap; } diff --git a/test/storage/Bridge.dot b/test/storage/Bridge.dot index acf81bc6..a7fc3978 100644 --- a/test/storage/Bridge.dot +++ b/test/storage/Bridge.dot @@ -4,7 +4,7 @@ rankdir=LR color=black arrowhead=open node [shape=record, style=filled, fillcolor=gray95 fontname="Courier New"] -7 [label="Bridge \<\\>\n | {{ slot| 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 } | { type: \.variable (bytes) | { unallocated (30) | bool: Initializable._initializing (1) | bool: Initializable._initialized (1) } | { <5> mapping\(address=\>InOutInfo\): AbsBridge.allowedDelayedInboxesMap (32) } | { <8> mapping\(address=\>InOutInfo\): AbsBridge.allowedOutboxesMap (32) } | { <10> address[]: AbsBridge.allowedDelayedInboxList (32) } | { <12> address[]: AbsBridge.allowedOutboxList (32) } | { unallocated (12) | address: AbsBridge._activeOutbox (20) } | { <15> bytes32[]: AbsBridge.delayedInboxAccs (32) } | { <17> bytes32[]: AbsBridge.sequencerInboxAccs (32) } | { unallocated (12) | IOwnable: AbsBridge.rollup (20) } | { unallocated (12) | address: AbsBridge.sequencerInbox (20) } | { uint256: AbsBridge.sequencerReportedSubMessageCount (32) }}}"] +8 [label="Bridge \<\\>\n | {{ slot| 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11-60 } | { type: \.variable (bytes) | { unallocated (30) | bool: Initializable._initializing (1) | bool: Initializable._initialized (1) } | { <5> mapping\(address=\>InOutInfo\): AbsBridge.allowedDelayedInboxesMap (32) } | { <8> mapping\(address=\>InOutInfo\): AbsBridge.allowedOutboxesMap (32) } | { <10> address[]: AbsBridge.allowedDelayedInboxList (32) } | { <12> address[]: AbsBridge.allowedOutboxList (32) } | { unallocated (12) | address: AbsBridge._activeOutbox (20) } | { <15> bytes32[]: AbsBridge.delayedInboxAccs (32) } | { <17> bytes32[]: AbsBridge.sequencerInboxAccs (32) } | { unallocated (12) | IOwnable: AbsBridge.rollup (20) } | { unallocated (12) | address: AbsBridge.sequencerInbox (20) } | { uint256: AbsBridge.sequencerReportedSubMessageCount (32) } | { <71> uint256[50]: AbsBridge.__gap (1600) }}}"] 1 [label="InOutInfo \<\\>\n | {{ slot| 0 | 1 } | { type: variable (bytes) | { uint256: index (32) } | { unallocated (31) | bool: allowed (1) }}}"] @@ -18,10 +18,13 @@ node [shape=record, style=filled, fillcolor=gray95 fontname="Courier New"] 6 [label="bytes32[]: sequencerInboxAccs \<\\>\n0x995663702627f3d8fc4237c51a46b303536bb17f3f65e07c08ad05fecbf4d88e | {{ slot| 0 } | { type: variable (bytes) | { bytes32 (32) }}}"] - 7:5 -> 1 - 7:8 -> 2 - 7:10 -> 3 - 7:12 -> 4 - 7:15 -> 5 - 7:17 -> 6 +7 [label="uint256[50]: __gap \<\\>\n | {{ slot| 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | 58 | 59 | 60 } | { type: variable (bytes) | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) }}}"] + + 8:5 -> 1 + 8:8 -> 2 + 8:10 -> 3 + 8:12 -> 4 + 8:15 -> 5 + 8:17 -> 6 + 8:71 -> 7 } \ No newline at end of file From c0cf27a58758ab722ab9b8a1255bf6de22f3c927 Mon Sep 17 00:00:00 2001 From: Goran Vladika Date: Mon, 10 Jul 2023 17:24:50 +0200 Subject: [PATCH 013/292] Integrate setting of batch poster and validators --- src/rollup/AbsRollupCreator.sol | 63 ++++++++++++--------------- src/rollup/ERC20RollupCreator.sol | 36 ++++++++------- src/rollup/IRollupCreator.sol | 13 +++++- src/rollup/RollupCreator.sol | 25 +++++------ test/foundry/AbsRollupCreator.t.sol | 2 +- test/foundry/ERC20RollupCreator.t.sol | 21 +++++++-- test/foundry/RollupCreator.t.sol | 16 +++++-- 7 files changed, 99 insertions(+), 77 deletions(-) diff --git a/src/rollup/AbsRollupCreator.sol b/src/rollup/AbsRollupCreator.sol index 11761d6e..228e3b2b 100644 --- a/src/rollup/AbsRollupCreator.sol +++ b/src/rollup/AbsRollupCreator.sol @@ -36,6 +36,14 @@ abstract contract AbsRollupCreator is Ownable, IRollupCreator { address public validatorUtils; address public validatorWalletCreator; + struct BridgeContracts { + IBridge bridge; + ISequencerInbox sequencerInbox; + IInbox inbox; + IRollupEventInbox rollupEventInbox; + IOutbox outbox; + } + constructor() Ownable() {} function setTemplates( @@ -73,18 +81,12 @@ abstract contract AbsRollupCreator is Ownable, IRollupCreator { // Create the rollup proxy to figure out the address and initialize it later RollupProxy rollup = new RollupProxy{salt: keccak256(abi.encode(config))}(); - ( - IBridge bridge, - ISequencerInbox sequencerInbox, - IInbox inbox, - IRollupEventInbox rollupEventInbox, - IOutbox outbox - ) = _createBridge( - address(proxyAdmin), - address(rollup), - config.sequencerInboxMaxTimeVariation, - nativeToken - ); + BridgeContracts memory bridgeContracts = _createBridge( + address(proxyAdmin), + address(rollup), + config.sequencerInboxMaxTimeVariation, + nativeToken + ); IChallengeManager challengeManager = IChallengeManager( address( @@ -97,8 +99,8 @@ abstract contract AbsRollupCreator is Ownable, IRollupCreator { ); challengeManager.initialize( IChallengeResultReceiver(address(rollup)), - sequencerInbox, - bridge, + bridgeContracts.sequencerInbox, + bridgeContracts.bridge, osp ); @@ -111,11 +113,11 @@ abstract contract AbsRollupCreator is Ownable, IRollupCreator { rollup.initializeProxy( config, ContractDependencies({ - bridge: bridge, - sequencerInbox: sequencerInbox, - inbox: inbox, - outbox: outbox, - rollupEventInbox: rollupEventInbox, + bridge: bridgeContracts.bridge, + sequencerInbox: bridgeContracts.sequencerInbox, + inbox: bridgeContracts.inbox, + outbox: bridgeContracts.outbox, + rollupEventInbox: bridgeContracts.rollupEventInbox, challengeManager: challengeManager, rollupAdminLogic: address(rollupAdminLogic), rollupUserLogic: rollupUserLogic, @@ -124,7 +126,7 @@ abstract contract AbsRollupCreator is Ownable, IRollupCreator { }) ); - sequencerInbox.setIsBatchPoster(_batchPoster, true); + bridgeContracts.sequencerInbox.setIsBatchPoster(_batchPoster, true); // Call setValidator on the newly created rollup contract bool[] memory _vals = new bool[](_validators.length); @@ -137,13 +139,13 @@ abstract contract AbsRollupCreator is Ownable, IRollupCreator { emit RollupCreated( address(rollup), - address(inbox), - address(outbox), - address(rollupEventInbox), + address(bridgeContracts.inbox), + address(bridgeContracts.outbox), + address(bridgeContracts.rollupEventInbox), address(challengeManager), address(proxyAdmin), - address(sequencerInbox), - address(bridge), + address(bridgeContracts.sequencerInbox), + address(bridgeContracts.bridge), address(validatorUtils), address(validatorWalletCreator) ); @@ -158,14 +160,5 @@ abstract contract AbsRollupCreator is Ownable, IRollupCreator { address rollup, ISequencerInbox.MaxTimeVariation memory maxTimeVariation, address nativeToken - ) - internal - virtual - returns ( - IBridge, - SequencerInbox, - IInbox, - IRollupEventInbox, - Outbox - ); + ) internal virtual returns (BridgeContracts memory); } diff --git a/src/rollup/ERC20RollupCreator.sol b/src/rollup/ERC20RollupCreator.sol index ceebd917..a23419f0 100644 --- a/src/rollup/ERC20RollupCreator.sol +++ b/src/rollup/ERC20RollupCreator.sol @@ -15,12 +15,13 @@ contract ERC20RollupCreator is AbsRollupCreator, IERC20RollupCreator { // RollupOwner should be the owner of Rollup's ProxyAdmin // RollupOwner should be the owner of Rollup // Bridge should have a single inbox and outbox - function createRollup(Config memory config, address nativeToken) - external - override - returns (address) - { - return _createRollup(config, nativeToken); + function createRollup( + Config memory config, + address _batchPoster, + address[] calldata _validators, + address nativeToken + ) external override returns (address) { + return _createRollup(config, _batchPoster, _validators, nativeToken); } function _createBridge( @@ -28,23 +29,20 @@ contract ERC20RollupCreator is AbsRollupCreator, IERC20RollupCreator { address rollup, ISequencerInbox.MaxTimeVariation memory maxTimeVariation, address nativeToken - ) - internal - override - returns ( - IBridge, - SequencerInbox, - IInbox, - IRollupEventInbox, - Outbox - ) - { - return - ERC20BridgeCreator(address(bridgeCreator)).createBridge( + ) internal override returns (BridgeContracts memory) { + ( + IBridge bridge, + ISequencerInbox sequencerInbox, + IInbox inbox, + IRollupEventInbox rollupEventInbox, + IOutbox outbox + ) = ERC20BridgeCreator(address(bridgeCreator)).createBridge( proxyAdmin, rollup, nativeToken, maxTimeVariation ); + + return BridgeContracts(bridge, sequencerInbox, inbox, rollupEventInbox, outbox); } } diff --git a/src/rollup/IRollupCreator.sol b/src/rollup/IRollupCreator.sol index 21850fef..8674b7a4 100644 --- a/src/rollup/IRollupCreator.sol +++ b/src/rollup/IRollupCreator.sol @@ -23,9 +23,18 @@ interface IRollupCreator { } interface IEthRollupCreator is IRollupCreator { - function createRollup(Config memory config) external returns (address); + function createRollup( + Config memory config, + address _batchPoster, + address[] calldata _validators + ) external returns (address); } interface IERC20RollupCreator is IRollupCreator { - function createRollup(Config memory config, address nativeToken) external returns (address); + function createRollup( + Config memory config, + address _batchPoster, + address[] calldata _validators, + address nativeToken + ) external returns (address); } diff --git a/src/rollup/RollupCreator.sol b/src/rollup/RollupCreator.sol index 4a974fde..d8d76ee2 100644 --- a/src/rollup/RollupCreator.sol +++ b/src/rollup/RollupCreator.sol @@ -20,7 +20,7 @@ contract RollupCreator is AbsRollupCreator, IEthRollupCreator { address _batchPoster, address[] calldata _validators ) external override returns (address) { - return _createRollup(config, address(0)); + return _createRollup(config, _batchPoster, _validators, address(0)); } function _createBridge( @@ -28,22 +28,19 @@ contract RollupCreator is AbsRollupCreator, IEthRollupCreator { address rollup, ISequencerInbox.MaxTimeVariation memory maxTimeVariation, address // nativeToken does not exist in context of standard Eth based rollup - ) - internal - override - returns ( - IBridge, - SequencerInbox, - IInbox, - IRollupEventInbox, - Outbox - ) - { - return - BridgeCreator(address(bridgeCreator)).createBridge( + ) internal override returns (BridgeContracts memory) { + ( + IBridge bridge, + ISequencerInbox sequencerInbox, + IInbox inbox, + IRollupEventInbox rollupEventInbox, + IOutbox outbox + ) = BridgeCreator(address(bridgeCreator)).createBridge( proxyAdmin, rollup, maxTimeVariation ); + + return BridgeContracts(bridge, sequencerInbox, inbox, rollupEventInbox, outbox); } } diff --git a/test/foundry/AbsRollupCreator.t.sol b/test/foundry/AbsRollupCreator.t.sol index 214fe73b..76a71e12 100644 --- a/test/foundry/AbsRollupCreator.t.sol +++ b/test/foundry/AbsRollupCreator.t.sol @@ -21,7 +21,7 @@ abstract contract AbsRollupCreatorTest is Test { address public rollupOwner = address(4400); address public deployer = address(4300); - function _prepareRollupDeployment(address rollupCreator, Config memory config) + function _prepareRollupDeployment() internal returns ( IOneStepProofEntry ospEntry, diff --git a/test/foundry/ERC20RollupCreator.t.sol b/test/foundry/ERC20RollupCreator.t.sol index 4cff58cc..0b620631 100644 --- a/test/foundry/ERC20RollupCreator.t.sol +++ b/test/foundry/ERC20RollupCreator.t.sol @@ -38,7 +38,7 @@ contract ERC20RollupCreatorTest is AbsRollupCreatorTest { extraChallengeTimeBlocks: 200, stakeToken: address(0), baseStake: 1000, - wasmModuleRoot: keccak256("0"), + wasmModuleRoot: wasmModuleRoot, owner: rollupOwner, loserStakeEscrow: address(200), chainId: chainId, @@ -52,7 +52,7 @@ contract ERC20RollupCreatorTest is AbsRollupCreatorTest { IChallengeManager challengeManager, IRollupAdmin rollupAdmin, IRollupUser rollupUser - ) = _prepareRollupDeployment(address(rollupCreator), config); + ) = _prepareRollupDeployment(); //// deployBridgeCreator IBridgeCreator bridgeCreator = new ERC20BridgeCreator(); @@ -69,7 +69,16 @@ contract ERC20RollupCreatorTest is AbsRollupCreatorTest { ); /// deploy rollup - address rollupAddress = rollupCreator.createRollup(config, nativeToken); + address batchPoster = makeAddr("batch poster"); + address[] memory validators = new address[](2); + validators[0] = makeAddr("validator1"); + validators[1] = makeAddr("validator2"); + address rollupAddress = rollupCreator.createRollup( + config, + batchPoster, + validators, + nativeToken + ); vm.stopPrank(); @@ -92,6 +101,12 @@ contract ERC20RollupCreatorTest is AbsRollupCreatorTest { assertTrue(address(rollup.outbox()) != address(0), "Invalid outbox"); assertTrue(address(rollup.rollupEventInbox()) != address(0), "Invalid rollupEventInbox"); assertTrue(address(rollup.challengeManager()) != address(0), "Invalid challengeManager"); + assertTrue(rollup.isValidator(validators[0]), "Invalid validator set"); + assertTrue(rollup.isValidator(validators[1]), "Invalid validator set"); + assertTrue( + ISequencerInbox(address(rollup.sequencerInbox())).isBatchPoster(batchPoster), + "Invalid batch poster" + ); // native token check IBridge bridge = RollupCore(address(rollupAddress)).bridge(); assertEq( diff --git a/test/foundry/RollupCreator.t.sol b/test/foundry/RollupCreator.t.sol index 9acd7106..8fda4224 100644 --- a/test/foundry/RollupCreator.t.sol +++ b/test/foundry/RollupCreator.t.sol @@ -29,7 +29,7 @@ contract RollupCreatorTest is AbsRollupCreatorTest { extraChallengeTimeBlocks: 200, stakeToken: address(0), baseStake: 1000, - wasmModuleRoot: keccak256("0"), + wasmModuleRoot: wasmModuleRoot, owner: rollupOwner, loserStakeEscrow: address(200), chainId: chainId, @@ -43,7 +43,7 @@ contract RollupCreatorTest is AbsRollupCreatorTest { IChallengeManager challengeManager, IRollupAdmin rollupAdmin, IRollupUser rollupUser - ) = _prepareRollupDeployment(address(rollupCreator), config); + ) = _prepareRollupDeployment(); //// deployBridgeCreator IBridgeCreator bridgeCreator = new BridgeCreator(); @@ -59,7 +59,11 @@ contract RollupCreatorTest is AbsRollupCreatorTest { ); /// deploy rollup - address rollupAddress = rollupCreator.createRollup(config); + address batchPoster = makeAddr("batch poster"); + address[] memory validators = new address[](2); + validators[0] = makeAddr("validator1"); + validators[1] = makeAddr("validator2"); + address rollupAddress = rollupCreator.createRollup(config, batchPoster, validators); vm.stopPrank(); @@ -82,5 +86,11 @@ contract RollupCreatorTest is AbsRollupCreatorTest { assertTrue(address(rollup.outbox()) != address(0), "Invalid outbox"); assertTrue(address(rollup.rollupEventInbox()) != address(0), "Invalid rollupEventInbox"); assertTrue(address(rollup.challengeManager()) != address(0), "Invalid challengeManager"); + assertTrue(rollup.isValidator(validators[0]), "Invalid validator set"); + assertTrue(rollup.isValidator(validators[1]), "Invalid validator set"); + assertTrue( + ISequencerInbox(address(rollup.sequencerInbox())).isBatchPoster(batchPoster), + "Invalid batch poster" + ); } } From d0fbedb74063abcbaf16f9a95ef13257e25e20c3 Mon Sep 17 00:00:00 2001 From: gzeon Date: Tue, 11 Jul 2023 22:44:22 +0800 Subject: [PATCH 014/292] chore: also include build/types in release --- package.json | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/package.json b/package.json index 8132a7e2..ea9708a1 100644 --- a/package.json +++ b/package.json @@ -9,12 +9,15 @@ "url": "git+https://github.com/offchainlabs/nitro-contracts.git" }, "files": [ - "src/" + "src/", + "build/contracts", + "build/types" ], "bugs": { "url": "https://github.com/offchainlabs/nitro-contracts/issues" }, "scripts": { + "prepublishOnly": "hardhat clean && hardhat compile", "build": "hardhat compile", "lint:test": "eslint ./test", "solhint": "solhint -f table src/**/*.sol", From 243d98c7f2dbc70accf9957daedd12ba177f4cbb Mon Sep 17 00:00:00 2001 From: gzeon Date: Tue, 11 Jul 2023 22:48:50 +0800 Subject: [PATCH 015/292] v1.1.0-alpha.2 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index ea9708a1..0c22991d 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@arbitrum/nitro-contracts", - "version": "1.0.2", + "version": "1.1.0-alpha.2", "description": "Layer 2 precompiles and rollup for Arbitrum Nitro", "author": "Offchain Labs, Inc.", "license": "BUSL-1.1", From 1de72a9b8ff4538b251a05af00ac48930d50eda7 Mon Sep 17 00:00:00 2001 From: gzeon Date: Tue, 11 Jul 2023 22:53:57 +0800 Subject: [PATCH 016/292] chore: remove build/contracts from release --- package.json | 1 - 1 file changed, 1 deletion(-) diff --git a/package.json b/package.json index 0c22991d..caab2a31 100644 --- a/package.json +++ b/package.json @@ -10,7 +10,6 @@ }, "files": [ "src/", - "build/contracts", "build/types" ], "bugs": { From 311ff92f1c8a634aed485ae088a178517d147355 Mon Sep 17 00:00:00 2001 From: gzeon Date: Tue, 11 Jul 2023 22:54:57 +0800 Subject: [PATCH 017/292] v1.1.0-alpha.3 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index caab2a31..c053aa7d 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@arbitrum/nitro-contracts", - "version": "1.1.0-alpha.2", + "version": "1.1.0-alpha.3", "description": "Layer 2 precompiles and rollup for Arbitrum Nitro", "author": "Offchain Labs, Inc.", "license": "BUSL-1.1", From 90258cc3add7b41f32a4371df4fe2e1181681509 Mon Sep 17 00:00:00 2001 From: Goran Vladika Date: Thu, 13 Jul 2023 10:41:11 +0200 Subject: [PATCH 018/292] Use single RollupCreator for both Eth and Erc20 based rollups --- src/rollup/AbsRollupCreator.sol | 164 --------------------- src/rollup/ERC20RollupCreator.sol | 48 ------ src/rollup/IRollupCreator.sol | 40 ----- src/rollup/RollupCreator.sol | 203 +++++++++++++++++++++---- test/foundry/AbsRollupCreator.t.sol | 79 ---------- test/foundry/ERC20RollupCreator.t.sol | 118 --------------- test/foundry/RollupCreator.t.sol | 204 ++++++++++++++++++++++---- 7 files changed, 350 insertions(+), 506 deletions(-) delete mode 100644 src/rollup/AbsRollupCreator.sol delete mode 100644 src/rollup/ERC20RollupCreator.sol delete mode 100644 src/rollup/IRollupCreator.sol delete mode 100644 test/foundry/AbsRollupCreator.t.sol delete mode 100644 test/foundry/ERC20RollupCreator.t.sol diff --git a/src/rollup/AbsRollupCreator.sol b/src/rollup/AbsRollupCreator.sol deleted file mode 100644 index 228e3b2b..00000000 --- a/src/rollup/AbsRollupCreator.sol +++ /dev/null @@ -1,164 +0,0 @@ -// Copyright 2021-2022, Offchain Labs, Inc. -// For license information, see https://github.com/nitro/blob/master/LICENSE -// SPDX-License-Identifier: BUSL-1.1 - -pragma solidity ^0.8.0; - -import "./IBridgeCreator.sol"; -import "./IRollupCreator.sol"; -import "./RollupProxy.sol"; -import "./IRollupAdmin.sol"; -import "@openzeppelin/contracts/proxy/transparent/ProxyAdmin.sol"; -import "@openzeppelin/contracts/proxy/transparent/TransparentUpgradeableProxy.sol"; -import "@openzeppelin/contracts/access/Ownable.sol"; - -abstract contract AbsRollupCreator is Ownable, IRollupCreator { - event RollupCreated( - address indexed rollupAddress, - address inboxAddress, - address outbox, - address rollupEventInbox, - address challengeManager, - address adminProxy, - address sequencerInbox, - address bridge, - address validatorUtils, - address validatorWalletCreator - ); - event TemplatesUpdated(); - - IBridgeCreator public bridgeCreator; - IOneStepProofEntry public osp; - IChallengeManager public challengeManagerTemplate; - IRollupAdmin public rollupAdminLogic; - IRollupUser public rollupUserLogic; - - address public validatorUtils; - address public validatorWalletCreator; - - struct BridgeContracts { - IBridge bridge; - ISequencerInbox sequencerInbox; - IInbox inbox; - IRollupEventInbox rollupEventInbox; - IOutbox outbox; - } - - constructor() Ownable() {} - - function setTemplates( - IBridgeCreator _bridgeCreator, - IOneStepProofEntry _osp, - IChallengeManager _challengeManagerLogic, - IRollupAdmin _rollupAdminLogic, - IRollupUser _rollupUserLogic, - address _validatorUtils, - address _validatorWalletCreator - ) external onlyOwner { - bridgeCreator = _bridgeCreator; - osp = _osp; - challengeManagerTemplate = _challengeManagerLogic; - rollupAdminLogic = _rollupAdminLogic; - rollupUserLogic = _rollupUserLogic; - validatorUtils = _validatorUtils; - validatorWalletCreator = _validatorWalletCreator; - emit TemplatesUpdated(); - } - - // After this setup: - // Rollup should be the owner of bridge - // RollupOwner should be the owner of Rollup's ProxyAdmin - // RollupOwner should be the owner of Rollup - // Bridge should have a single inbox and outbox - function _createRollup( - Config memory config, - address _batchPoster, - address[] calldata _validators, - address nativeToken - ) internal returns (address) { - ProxyAdmin proxyAdmin = new ProxyAdmin(); - - // Create the rollup proxy to figure out the address and initialize it later - RollupProxy rollup = new RollupProxy{salt: keccak256(abi.encode(config))}(); - - BridgeContracts memory bridgeContracts = _createBridge( - address(proxyAdmin), - address(rollup), - config.sequencerInboxMaxTimeVariation, - nativeToken - ); - - IChallengeManager challengeManager = IChallengeManager( - address( - new TransparentUpgradeableProxy( - address(challengeManagerTemplate), - address(proxyAdmin), - "" - ) - ) - ); - challengeManager.initialize( - IChallengeResultReceiver(address(rollup)), - bridgeContracts.sequencerInbox, - bridgeContracts.bridge, - osp - ); - - proxyAdmin.transferOwnership(config.owner); - - // initialize the rollup with this contract as owner to set batch poster and validators - // it will transfer the ownership back to the actual owner later - address actualOwner = config.owner; - config.owner = address(this); - rollup.initializeProxy( - config, - ContractDependencies({ - bridge: bridgeContracts.bridge, - sequencerInbox: bridgeContracts.sequencerInbox, - inbox: bridgeContracts.inbox, - outbox: bridgeContracts.outbox, - rollupEventInbox: bridgeContracts.rollupEventInbox, - challengeManager: challengeManager, - rollupAdminLogic: address(rollupAdminLogic), - rollupUserLogic: rollupUserLogic, - validatorUtils: validatorUtils, - validatorWalletCreator: validatorWalletCreator - }) - ); - - bridgeContracts.sequencerInbox.setIsBatchPoster(_batchPoster, true); - - // Call setValidator on the newly created rollup contract - bool[] memory _vals = new bool[](_validators.length); - for (uint256 i = 0; i < _validators.length; i++) { - _vals[i] = true; - } - IRollupAdmin(address(rollup)).setValidator(_validators, _vals); - - IRollupAdmin(address(rollup)).setOwner(actualOwner); - - emit RollupCreated( - address(rollup), - address(bridgeContracts.inbox), - address(bridgeContracts.outbox), - address(bridgeContracts.rollupEventInbox), - address(challengeManager), - address(proxyAdmin), - address(bridgeContracts.sequencerInbox), - address(bridgeContracts.bridge), - address(validatorUtils), - address(validatorWalletCreator) - ); - return address(rollup); - } - - /** - * Create bridge using appropriate BridgeCreator. - */ - function _createBridge( - address proxyAdmin, - address rollup, - ISequencerInbox.MaxTimeVariation memory maxTimeVariation, - address nativeToken - ) internal virtual returns (BridgeContracts memory); -} diff --git a/src/rollup/ERC20RollupCreator.sol b/src/rollup/ERC20RollupCreator.sol deleted file mode 100644 index a23419f0..00000000 --- a/src/rollup/ERC20RollupCreator.sol +++ /dev/null @@ -1,48 +0,0 @@ -// Copyright 2021-2022, Offchain Labs, Inc. -// For license information, see https://github.com/nitro/blob/master/LICENSE -// SPDX-License-Identifier: BUSL-1.1 - -pragma solidity ^0.8.0; - -import "./AbsRollupCreator.sol"; -import "./ERC20BridgeCreator.sol"; - -contract ERC20RollupCreator is AbsRollupCreator, IERC20RollupCreator { - constructor() AbsRollupCreator() {} - - // After this setup: - // Rollup should be the owner of bridge - // RollupOwner should be the owner of Rollup's ProxyAdmin - // RollupOwner should be the owner of Rollup - // Bridge should have a single inbox and outbox - function createRollup( - Config memory config, - address _batchPoster, - address[] calldata _validators, - address nativeToken - ) external override returns (address) { - return _createRollup(config, _batchPoster, _validators, nativeToken); - } - - function _createBridge( - address proxyAdmin, - address rollup, - ISequencerInbox.MaxTimeVariation memory maxTimeVariation, - address nativeToken - ) internal override returns (BridgeContracts memory) { - ( - IBridge bridge, - ISequencerInbox sequencerInbox, - IInbox inbox, - IRollupEventInbox rollupEventInbox, - IOutbox outbox - ) = ERC20BridgeCreator(address(bridgeCreator)).createBridge( - proxyAdmin, - rollup, - nativeToken, - maxTimeVariation - ); - - return BridgeContracts(bridge, sequencerInbox, inbox, rollupEventInbox, outbox); - } -} diff --git a/src/rollup/IRollupCreator.sol b/src/rollup/IRollupCreator.sol deleted file mode 100644 index 8674b7a4..00000000 --- a/src/rollup/IRollupCreator.sol +++ /dev/null @@ -1,40 +0,0 @@ -// Copyright 2021-2022, Offchain Labs, Inc. -// For license information, see https://github.com/nitro/blob/master/LICENSE -// SPDX-License-Identifier: BUSL-1.1 - -// solhint-disable-next-line compiler-version -pragma solidity >=0.6.9 <0.9.0; - -import "./IBridgeCreator.sol"; -import "./RollupProxy.sol"; -import "../osp/IOneStepProofEntry.sol"; -import "../challenge/IChallengeManager.sol"; - -interface IRollupCreator { - function setTemplates( - IBridgeCreator _bridgeCreator, - IOneStepProofEntry _osp, - IChallengeManager _challengeManagerLogic, - IRollupAdmin _rollupAdminLogic, - IRollupUser _rollupUserLogic, - address _validatorUtils, - address _validatorWalletCreator - ) external; -} - -interface IEthRollupCreator is IRollupCreator { - function createRollup( - Config memory config, - address _batchPoster, - address[] calldata _validators - ) external returns (address); -} - -interface IERC20RollupCreator is IRollupCreator { - function createRollup( - Config memory config, - address _batchPoster, - address[] calldata _validators, - address nativeToken - ) external returns (address); -} diff --git a/src/rollup/RollupCreator.sol b/src/rollup/RollupCreator.sol index d8d76ee2..450dbc09 100644 --- a/src/rollup/RollupCreator.sol +++ b/src/rollup/RollupCreator.sol @@ -4,43 +4,188 @@ pragma solidity ^0.8.0; -import "./AbsRollupCreator.sol"; +import "./RollupProxy.sol"; +import "./IRollupAdmin.sol"; import "./BridgeCreator.sol"; +import "./ERC20BridgeCreator.sol"; +import "@openzeppelin/contracts/proxy/transparent/ProxyAdmin.sol"; +import "@openzeppelin/contracts/proxy/transparent/TransparentUpgradeableProxy.sol"; +import "@openzeppelin/contracts/access/Ownable.sol"; -contract RollupCreator is AbsRollupCreator, IEthRollupCreator { - constructor() AbsRollupCreator() {} +contract RollupCreator is Ownable { + event RollupCreated( + address indexed rollupAddress, + address indexed nativeToken, + address inboxAddress, + address outbox, + address rollupEventInbox, + address challengeManager, + address adminProxy, + address sequencerInbox, + address bridge, + address validatorUtils, + address validatorWalletCreator + ); + event TemplatesUpdated(); - // After this setup: - // Rollup should be the owner of bridge - // RollupOwner should be the owner of Rollup's ProxyAdmin - // RollupOwner should be the owner of Rollup - // Bridge should have a single inbox and outbox + BridgeCreator public ethBridgeCreator; + ERC20BridgeCreator public erc20BridgeCreator; + IOneStepProofEntry public osp; + IChallengeManager public challengeManagerTemplate; + IRollupAdmin public rollupAdminLogic; + IRollupUser public rollupUserLogic; + + address public validatorUtils; + address public validatorWalletCreator; + + struct BridgeContracts { + IBridge bridge; + ISequencerInbox sequencerInbox; + IInbox inbox; + IRollupEventInbox rollupEventInbox; + IOutbox outbox; + } + + constructor() Ownable() {} + + function setTemplates( + BridgeCreator _ethBridgeCreator, + ERC20BridgeCreator _erc20BridgeCreator, + IOneStepProofEntry _osp, + IChallengeManager _challengeManagerLogic, + IRollupAdmin _rollupAdminLogic, + IRollupUser _rollupUserLogic, + address _validatorUtils, + address _validatorWalletCreator + ) external onlyOwner { + ethBridgeCreator = _ethBridgeCreator; + erc20BridgeCreator = _erc20BridgeCreator; + osp = _osp; + challengeManagerTemplate = _challengeManagerLogic; + rollupAdminLogic = _rollupAdminLogic; + rollupUserLogic = _rollupUserLogic; + validatorUtils = _validatorUtils; + validatorWalletCreator = _validatorWalletCreator; + emit TemplatesUpdated(); + } + + /** + * @notice Create a new rollup + * @dev After this setup: + * @dev - Rollup should be the owner of bridge + * @dev - RollupOwner should be the owner of Rollup's ProxyAdmin + * @dev - RollupOwner should be the owner of Rollup + * @dev - Bridge should have a single inbox and outbox + * @dev - Validators and batch poster should be set if provided + * @param config The configuration for the rollup + * @param _batchPoster The address of the batch poster, not used when set to zero address + * @param _validators The list of validator addresses, not used when set to empty list + * @param _nativeToken Address of the custom fee token used by rollup. If rollup is ETH-based address(0) should be provided + * @return The address of the newly created rollup + */ function createRollup( Config memory config, address _batchPoster, - address[] calldata _validators - ) external override returns (address) { - return _createRollup(config, _batchPoster, _validators, address(0)); - } + address[] calldata _validators, + address _nativeToken + ) external returns (address) { + ProxyAdmin proxyAdmin = new ProxyAdmin(); - function _createBridge( - address proxyAdmin, - address rollup, - ISequencerInbox.MaxTimeVariation memory maxTimeVariation, - address // nativeToken does not exist in context of standard Eth based rollup - ) internal override returns (BridgeContracts memory) { - ( - IBridge bridge, - ISequencerInbox sequencerInbox, - IInbox inbox, - IRollupEventInbox rollupEventInbox, - IOutbox outbox - ) = BridgeCreator(address(bridgeCreator)).createBridge( - proxyAdmin, - rollup, - maxTimeVariation + // Create the rollup proxy to figure out the address and initialize it later + RollupProxy rollup = new RollupProxy{salt: keccak256(abi.encode(config))}(); + + BridgeContracts memory bridgeContract; + if (_nativeToken == address(0)) { + // create ETH-based rollup if address zero is provided for native token + ( + bridgeContract.bridge, + bridgeContract.sequencerInbox, + bridgeContract.inbox, + bridgeContract.rollupEventInbox, + bridgeContract.outbox + ) = ethBridgeCreator.createBridge( + address(proxyAdmin), + address(rollup), + config.sequencerInboxMaxTimeVariation + ); + } else { + // otherwise create ERC20-based rollup with custom fee token + ( + bridgeContract.bridge, + bridgeContract.sequencerInbox, + bridgeContract.inbox, + bridgeContract.rollupEventInbox, + bridgeContract.outbox + ) = erc20BridgeCreator.createBridge( + address(proxyAdmin), + address(rollup), + _nativeToken, + config.sequencerInboxMaxTimeVariation ); + } + + IChallengeManager challengeManager = IChallengeManager( + address( + new TransparentUpgradeableProxy( + address(challengeManagerTemplate), + address(proxyAdmin), + "" + ) + ) + ); + challengeManager.initialize( + IChallengeResultReceiver(address(rollup)), + bridgeContract.sequencerInbox, + bridgeContract.bridge, + osp + ); + + proxyAdmin.transferOwnership(config.owner); + + // initialize the rollup with this contract as owner to set batch poster and validators + // it will transfer the ownership back to the actual owner later + address actualOwner = config.owner; + config.owner = address(this); + rollup.initializeProxy( + config, + ContractDependencies({ + bridge: bridgeContract.bridge, + sequencerInbox: bridgeContract.sequencerInbox, + inbox: bridgeContract.inbox, + outbox: bridgeContract.outbox, + rollupEventInbox: bridgeContract.rollupEventInbox, + challengeManager: challengeManager, + rollupAdminLogic: address(rollupAdminLogic), + rollupUserLogic: rollupUserLogic, + validatorUtils: validatorUtils, + validatorWalletCreator: validatorWalletCreator + }) + ); + + bridgeContract.sequencerInbox.setIsBatchPoster(_batchPoster, true); + + // Call setValidator on the newly created rollup contract + bool[] memory _vals = new bool[](_validators.length); + for (uint256 i = 0; i < _validators.length; i++) { + _vals[i] = true; + } + IRollupAdmin(address(rollup)).setValidator(_validators, _vals); + + IRollupAdmin(address(rollup)).setOwner(actualOwner); - return BridgeContracts(bridge, sequencerInbox, inbox, rollupEventInbox, outbox); + emit RollupCreated( + address(rollup), + _nativeToken, + address(bridgeContract.inbox), + address(bridgeContract.outbox), + address(bridgeContract.rollupEventInbox), + address(challengeManager), + address(proxyAdmin), + address(bridgeContract.sequencerInbox), + address(bridgeContract.bridge), + address(validatorUtils), + address(validatorWalletCreator) + ); + return address(rollup); } } diff --git a/test/foundry/AbsRollupCreator.t.sol b/test/foundry/AbsRollupCreator.t.sol deleted file mode 100644 index 76a71e12..00000000 --- a/test/foundry/AbsRollupCreator.t.sol +++ /dev/null @@ -1,79 +0,0 @@ -// SPDX-License-Identifier: UNLICENSED -pragma solidity ^0.8.4; - -import "forge-std/Test.sol"; -import "./util/TestUtil.sol"; -import "../../src/rollup/IRollupCreator.sol"; -import "../../src/rollup/RollupAdminLogic.sol"; -import "../../src/rollup/RollupUserLogic.sol"; -import "../../src/rollup/ValidatorUtils.sol"; -import "../../src/rollup/ValidatorWalletCreator.sol"; -import "../../src/challenge/ChallengeManager.sol"; -import "../../src/osp/OneStepProver0.sol"; -import "../../src/osp/OneStepProverMemory.sol"; -import "../../src/osp/OneStepProverMath.sol"; -import "../../src/osp/OneStepProverHostIo.sol"; -import "../../src/osp/OneStepProofEntry.sol"; - -import "@openzeppelin/contracts/access/Ownable.sol"; - -abstract contract AbsRollupCreatorTest is Test { - address public rollupOwner = address(4400); - address public deployer = address(4300); - - function _prepareRollupDeployment() - internal - returns ( - IOneStepProofEntry ospEntry, - IChallengeManager challengeManager, - IRollupAdmin rollupAdminLogic, - IRollupUser rollupUserLogic - ) - { - //// deploy challenge stuff - ospEntry = new OneStepProofEntry( - new OneStepProver0(), - new OneStepProverMemory(), - new OneStepProverMath(), - new OneStepProverHostIo() - ); - challengeManager = new ChallengeManager(); - - //// deploy rollup logic - rollupAdminLogic = IRollupAdmin(new RollupAdminLogic()); - rollupUserLogic = IRollupUser(new RollupUserLogic()); - - return (ospEntry, challengeManager, rollupAdminLogic, rollupUserLogic); - } - - function _getProxyAdmin(address proxy) internal view returns (address) { - bytes32 adminSlot = bytes32(uint256(keccak256("eip1967.proxy.admin")) - 1); - return address(uint160(uint256(vm.load(proxy, adminSlot)))); - } - - function _getPrimary(address proxy) internal view returns (address) { - bytes32 primarySlot = bytes32(uint256(keccak256("eip1967.proxy.implementation")) - 1); - return address(uint160(uint256(vm.load(proxy, primarySlot)))); - } - - function _getSecondary(address proxy) internal view returns (address) { - bytes32 secondarySlot = bytes32( - uint256(keccak256("eip1967.proxy.implementation.secondary")) - 1 - ); - return address(uint160(uint256(vm.load(proxy, secondarySlot)))); - } - - /**** - **** Event declarations - ***/ - - event RollupCreated( - address indexed rollupAddress, - address inboxAddress, - address adminProxy, - address sequencerInbox, - address bridge - ); - - event RollupInitialized(bytes32 machineHash, uint256 chainId); -} diff --git a/test/foundry/ERC20RollupCreator.t.sol b/test/foundry/ERC20RollupCreator.t.sol deleted file mode 100644 index 0b620631..00000000 --- a/test/foundry/ERC20RollupCreator.t.sol +++ /dev/null @@ -1,118 +0,0 @@ -// SPDX-License-Identifier: UNLICENSED -pragma solidity ^0.8.4; - -import "forge-std/Test.sol"; -import "./util/TestUtil.sol"; -import "./AbsRollupCreator.t.sol"; -import "../../src/rollup/ERC20RollupCreator.sol"; -import "../../src/rollup/ERC20BridgeCreator.sol"; -import "@openzeppelin/contracts/token/ERC20/presets/ERC20PresetFixedSupply.sol"; - -contract ERC20RollupCreatorTest is AbsRollupCreatorTest { - address public nativeToken; - - function setUp() public { - vm.prank(deployer); - nativeToken = address( - new ERC20PresetFixedSupply("Appchain Token", "App", 1_000_000, address(this)) - ); - } - - /* solhint-disable func-name-mixedcase */ - function test_createRollup() public { - vm.startPrank(deployer); - - ERC20RollupCreator rollupCreator = new ERC20RollupCreator(); - - // deployment params - bytes32 wasmModuleRoot = keccak256("wasm"); - uint256 chainId = 1337; - ISequencerInbox.MaxTimeVariation memory timeVars = ISequencerInbox.MaxTimeVariation( - ((60 * 60 * 24) / 15), - 12, - 60 * 60 * 24, - 60 * 60 - ); - Config memory config = Config({ - confirmPeriodBlocks: 20, - extraChallengeTimeBlocks: 200, - stakeToken: address(0), - baseStake: 1000, - wasmModuleRoot: wasmModuleRoot, - owner: rollupOwner, - loserStakeEscrow: address(200), - chainId: chainId, - chainConfig: "abc", - genesisBlockNum: 15000000, - sequencerInboxMaxTimeVariation: timeVars - }); - - ( - IOneStepProofEntry ospEntry, - IChallengeManager challengeManager, - IRollupAdmin rollupAdmin, - IRollupUser rollupUser - ) = _prepareRollupDeployment(); - - //// deployBridgeCreator - IBridgeCreator bridgeCreator = new ERC20BridgeCreator(); - - //// deploy creator and set logic - rollupCreator.setTemplates( - bridgeCreator, - ospEntry, - challengeManager, - rollupAdmin, - rollupUser, - address(new ValidatorUtils()), - address(new ValidatorWalletCreator()) - ); - - /// deploy rollup - address batchPoster = makeAddr("batch poster"); - address[] memory validators = new address[](2); - validators[0] = makeAddr("validator1"); - validators[1] = makeAddr("validator2"); - address rollupAddress = rollupCreator.createRollup( - config, - batchPoster, - validators, - nativeToken - ); - - vm.stopPrank(); - - /// common checks - - /// rollup creator - assertEq(IOwnable(address(rollupCreator)).owner(), deployer, "Invalid rollupCreator owner"); - - /// rollup proxy - assertEq(IOwnable(rollupAddress).owner(), rollupOwner, "Invalid rollup owner"); - assertEq(_getProxyAdmin(rollupAddress), rollupOwner, "Invalid rollup's proxyAdmin owner"); - assertEq(_getPrimary(rollupAddress), address(rollupAdmin), "Invalid proxy primary impl"); - assertEq(_getSecondary(rollupAddress), address(rollupUser), "Invalid proxy secondary impl"); - - /// rollup check - RollupCore rollup = RollupCore(rollupAddress); - assertTrue(address(rollup.sequencerInbox()) != address(0), "Invalid seqInbox"); - assertTrue(address(rollup.bridge()) != address(0), "Invalid bridge"); - assertTrue(address(rollup.inbox()) != address(0), "Invalid inbox"); - assertTrue(address(rollup.outbox()) != address(0), "Invalid outbox"); - assertTrue(address(rollup.rollupEventInbox()) != address(0), "Invalid rollupEventInbox"); - assertTrue(address(rollup.challengeManager()) != address(0), "Invalid challengeManager"); - assertTrue(rollup.isValidator(validators[0]), "Invalid validator set"); - assertTrue(rollup.isValidator(validators[1]), "Invalid validator set"); - assertTrue( - ISequencerInbox(address(rollup.sequencerInbox())).isBatchPoster(batchPoster), - "Invalid batch poster" - ); - // native token check - IBridge bridge = RollupCore(address(rollupAddress)).bridge(); - assertEq( - IERC20Bridge(address(bridge)).nativeToken(), - nativeToken, - "Invalid native token ref" - ); - } -} diff --git a/test/foundry/RollupCreator.t.sol b/test/foundry/RollupCreator.t.sol index 8fda4224..9ae2b8db 100644 --- a/test/foundry/RollupCreator.t.sol +++ b/test/foundry/RollupCreator.t.sol @@ -1,23 +1,69 @@ // SPDX-License-Identifier: UNLICENSED pragma solidity ^0.8.4; -import "./AbsRollupCreator.t.sol"; -import "../../src/rollup/BridgeCreator.sol"; +import "forge-std/Test.sol"; +import "./util/TestUtil.sol"; import "../../src/rollup/RollupCreator.sol"; +import "../../src/rollup/RollupAdminLogic.sol"; +import "../../src/rollup/RollupUserLogic.sol"; +import "../../src/rollup/ValidatorUtils.sol"; +import "../../src/rollup/ValidatorWalletCreator.sol"; +import "../../src/challenge/ChallengeManager.sol"; +import "../../src/osp/OneStepProver0.sol"; +import "../../src/osp/OneStepProverMemory.sol"; +import "../../src/osp/OneStepProverMath.sol"; +import "../../src/osp/OneStepProverHostIo.sol"; +import "../../src/osp/OneStepProofEntry.sol"; -contract RollupCreatorTest is AbsRollupCreatorTest { - function setUp() public {} +import "@openzeppelin/contracts/access/Ownable.sol"; + +contract RollupCreatorTest is Test { + RollupCreator public rollupCreator; + address public rollupOwner = makeAddr("rollupOwner"); + address public deployer = makeAddr("deployer"); + IRollupAdmin public rollupAdmin; + IRollupUser public rollupUser; /* solhint-disable func-name-mixedcase */ - function test_createRollup() public { + function setUp() public { + //// deploy rollup creator and set templates vm.startPrank(deployer); + rollupCreator = new RollupCreator(); + + // deploy BridgeCreators + BridgeCreator ethBridgeCreator = new BridgeCreator(); + ERC20BridgeCreator erc20BridgeCreator = new ERC20BridgeCreator(); + + ( + IOneStepProofEntry ospEntry, + IChallengeManager challengeManager, + IRollupAdmin _rollupAdmin, + IRollupUser _rollupUser + ) = _prepareRollupDeployment(); + + rollupAdmin = _rollupAdmin; + rollupUser = _rollupUser; + + //// deploy creator and set logic + rollupCreator.setTemplates( + ethBridgeCreator, + erc20BridgeCreator, + ospEntry, + challengeManager, + _rollupAdmin, + _rollupUser, + address(new ValidatorUtils()), + address(new ValidatorWalletCreator()) + ); - RollupCreator rollupCreator = new RollupCreator(); + vm.stopPrank(); + } + + function test_createEthRollup() public { + vm.startPrank(deployer); // deployment params - bytes32 wasmModuleRoot = keccak256("wasm"); - uint256 chainId = 1337; ISequencerInbox.MaxTimeVariation memory timeVars = ISequencerInbox.MaxTimeVariation( ((60 * 60 * 24) / 15), 12, @@ -29,41 +75,94 @@ contract RollupCreatorTest is AbsRollupCreatorTest { extraChallengeTimeBlocks: 200, stakeToken: address(0), baseStake: 1000, - wasmModuleRoot: wasmModuleRoot, + wasmModuleRoot: keccak256("wasm"), owner: rollupOwner, loserStakeEscrow: address(200), - chainId: chainId, + chainId: 1337, chainConfig: "abc", genesisBlockNum: 15000000, sequencerInboxMaxTimeVariation: timeVars }); - ( - IOneStepProofEntry ospEntry, - IChallengeManager challengeManager, - IRollupAdmin rollupAdmin, - IRollupUser rollupUser - ) = _prepareRollupDeployment(); - //// deployBridgeCreator - IBridgeCreator bridgeCreator = new BridgeCreator(); + /// deploy rollup + address batchPoster = makeAddr("batch poster"); + address[] memory validators = new address[](2); + validators[0] = makeAddr("validator1"); + validators[1] = makeAddr("validator2"); + address rollupAddress = rollupCreator.createRollup( + config, + batchPoster, + validators, + address(0) + ); - //// deploy creator and set logic - rollupCreator.setTemplates( - bridgeCreator, - ospEntry, - challengeManager, - rollupAdmin, - rollupUser, - address(new ValidatorUtils()), - address(new ValidatorWalletCreator()) + vm.stopPrank(); + + /// common checks + + /// rollup creator + assertEq(IOwnable(address(rollupCreator)).owner(), deployer, "Invalid rollupCreator owner"); + + /// rollup proxy + assertEq(IOwnable(rollupAddress).owner(), rollupOwner, "Invalid rollup owner"); + assertEq(_getProxyAdmin(rollupAddress), rollupOwner, "Invalid rollup's proxyAdmin owner"); + assertEq(_getPrimary(rollupAddress), address(rollupAdmin), "Invalid proxy primary impl"); + assertEq(_getSecondary(rollupAddress), address(rollupUser), "Invalid proxy secondary impl"); + + /// rollup check + RollupCore rollup = RollupCore(rollupAddress); + assertTrue(address(rollup.sequencerInbox()) != address(0), "Invalid seqInbox"); + assertTrue(address(rollup.bridge()) != address(0), "Invalid bridge"); + assertTrue(address(rollup.inbox()) != address(0), "Invalid inbox"); + assertTrue(address(rollup.outbox()) != address(0), "Invalid outbox"); + assertTrue(address(rollup.rollupEventInbox()) != address(0), "Invalid rollupEventInbox"); + assertTrue(address(rollup.challengeManager()) != address(0), "Invalid challengeManager"); + assertTrue(rollup.isValidator(validators[0]), "Invalid validator set"); + assertTrue(rollup.isValidator(validators[1]), "Invalid validator set"); + assertTrue( + ISequencerInbox(address(rollup.sequencerInbox())).isBatchPoster(batchPoster), + "Invalid batch poster" ); + } + + function test_createErc20Rollup() public { + vm.startPrank(deployer); + address nativeToken = address( + new ERC20PresetFixedSupply("Appchain Token", "App", 1_000_000, address(this)) + ); + + // deployment params + ISequencerInbox.MaxTimeVariation memory timeVars = ISequencerInbox.MaxTimeVariation( + ((60 * 60 * 24) / 15), + 12, + 60 * 60 * 24, + 60 * 60 + ); + Config memory config = Config({ + confirmPeriodBlocks: 20, + extraChallengeTimeBlocks: 200, + stakeToken: address(0), + baseStake: 1000, + wasmModuleRoot: keccak256("wasm"), + owner: rollupOwner, + loserStakeEscrow: address(200), + chainId: 1337, + chainConfig: "abc", + genesisBlockNum: 15000000, + sequencerInboxMaxTimeVariation: timeVars + }); /// deploy rollup address batchPoster = makeAddr("batch poster"); address[] memory validators = new address[](2); validators[0] = makeAddr("validator1"); validators[1] = makeAddr("validator2"); - address rollupAddress = rollupCreator.createRollup(config, batchPoster, validators); + address rollupAddress = rollupCreator.createRollup( + config, + batchPoster, + validators, + nativeToken + ); vm.stopPrank(); @@ -92,5 +191,54 @@ contract RollupCreatorTest is AbsRollupCreatorTest { ISequencerInbox(address(rollup.sequencerInbox())).isBatchPoster(batchPoster), "Invalid batch poster" ); + // native token check + IBridge bridge = RollupCore(address(rollupAddress)).bridge(); + assertEq( + IERC20Bridge(address(bridge)).nativeToken(), + nativeToken, + "Invalid native token ref" + ); + } + + function _prepareRollupDeployment() + internal + returns ( + IOneStepProofEntry ospEntry, + IChallengeManager challengeManager, + IRollupAdmin rollupAdminLogic, + IRollupUser rollupUserLogic + ) + { + //// deploy challenge stuff + ospEntry = new OneStepProofEntry( + new OneStepProver0(), + new OneStepProverMemory(), + new OneStepProverMath(), + new OneStepProverHostIo() + ); + challengeManager = new ChallengeManager(); + + //// deploy rollup logic + rollupAdminLogic = IRollupAdmin(new RollupAdminLogic()); + rollupUserLogic = IRollupUser(new RollupUserLogic()); + + return (ospEntry, challengeManager, rollupAdminLogic, rollupUserLogic); + } + + function _getProxyAdmin(address proxy) internal view returns (address) { + bytes32 adminSlot = bytes32(uint256(keccak256("eip1967.proxy.admin")) - 1); + return address(uint160(uint256(vm.load(proxy, adminSlot)))); + } + + function _getPrimary(address proxy) internal view returns (address) { + bytes32 primarySlot = bytes32(uint256(keccak256("eip1967.proxy.implementation")) - 1); + return address(uint160(uint256(vm.load(proxy, primarySlot)))); + } + + function _getSecondary(address proxy) internal view returns (address) { + bytes32 secondarySlot = bytes32( + uint256(keccak256("eip1967.proxy.implementation.secondary")) - 1 + ); + return address(uint160(uint256(vm.load(proxy, secondarySlot)))); } } From 106ae6c3683a16ff2b17fbd7f60f74fe4256cde4 Mon Sep 17 00:00:00 2001 From: Goran Vladika Date: Thu, 13 Jul 2023 10:59:12 +0200 Subject: [PATCH 019/292] Update hardhat test --- test/contract/arbRollup.spec.ts | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) diff --git a/test/contract/arbRollup.spec.ts b/test/contract/arbRollup.spec.ts index ba417541..884da19d 100644 --- a/test/contract/arbRollup.spec.ts +++ b/test/contract/arbRollup.spec.ts @@ -156,10 +156,15 @@ const setup = async () => { )) as RollupUserLogic__factory const rollupUserLogicTemplate = await rollupUserLogicFac.deploy() - const bridgeCreatorFac = (await ethers.getContractFactory( + const ethBridgeCreatorFac = (await ethers.getContractFactory( 'BridgeCreator' )) as BridgeCreator__factory - const bridgeCreator = await bridgeCreatorFac.deploy() + const ethBridgeCreator = await ethBridgeCreatorFac.deploy() + + const erc20BridgeCreatorFac = (await ethers.getContractFactory( + 'ERC20BridgeCreator' + )) as BridgeCreator__factory + const erc20BridgeCreator = await erc20BridgeCreatorFac.deploy() const rollupCreatorFac = (await ethers.getContractFactory( 'RollupCreator' @@ -167,7 +172,8 @@ const setup = async () => { const rollupCreator = await rollupCreatorFac.deploy() await rollupCreator.setTemplates( - bridgeCreator.address, + ethBridgeCreator.address, + erc20BridgeCreator.address, oneStepProofEntry.address, challengeManagerTemplate.address, rollupAdminLogicTemplate.address, @@ -179,7 +185,8 @@ const setup = async () => { const response = await rollupCreator.createRollup( await getDefaultConfig(), await sequencer.getAddress(), - [await val1.getAddress(), await val2.getAddress(), await val3.getAddress()] + [await val1.getAddress(), await val2.getAddress(), await val3.getAddress()], + ethers.constants.AddressZero ) const rec = await response.wait() From cc5a70ffb1c0d0f13dbd3d569555d7879ed08c11 Mon Sep 17 00:00:00 2001 From: Goran Vladika Date: Tue, 18 Jul 2023 17:17:20 +0200 Subject: [PATCH 020/292] Update rollup creator to use both eth and erc20 bridge creators --- hardhat.config.ts | 3 +++ package.json | 2 ++ scripts/deployment.ts | 5 ++++- yarn.lock | 5 +++++ 4 files changed, 14 insertions(+), 1 deletion(-) diff --git a/hardhat.config.ts b/hardhat.config.ts index 76929c70..b50c6b33 100644 --- a/hardhat.config.ts +++ b/hardhat.config.ts @@ -5,6 +5,9 @@ import '@nomiclabs/hardhat-etherscan' import '@typechain/hardhat' import 'solidity-coverage' import 'hardhat-gas-reporter' +import dotenv from 'dotenv' + +dotenv.config() const solidity = { compilers: [ diff --git a/package.json b/package.json index c053aa7d..4fcea9ba 100644 --- a/package.json +++ b/package.json @@ -29,6 +29,7 @@ "test:e2e": "hardhat test test/e2e/*.ts", "postinstall": "patch-package", "deploy-factory": "hardhat run scripts/deployment.ts", + "deploy-factory:goerli": "hardhat run scripts/deployment.ts --network arbGoerliRollup", "deploy-rollup": "hardhat run scripts/rollupCreation.ts" }, "dependencies": { @@ -36,6 +37,7 @@ "@ethersproject/providers": "^5.7.2", "@openzeppelin/contracts": "4.5.0", "@openzeppelin/contracts-upgradeable": "4.5.2", + "dotenv": "^16.3.1", "patch-package": "^6.4.7" }, "private": false, diff --git a/scripts/deployment.ts b/scripts/deployment.ts index 9a5bf94f..257311e8 100644 --- a/scripts/deployment.ts +++ b/scripts/deployment.ts @@ -40,7 +40,7 @@ async function verifyContract( } // Function to handle contract deployment -async function deployContract( +export async function deployContract( contractName: string, signer: any, constructorArgs: any[] = [] @@ -61,6 +61,7 @@ async function deployAllContracts( signer: any ): Promise> { const bridgeCreator = await deployContract('BridgeCreator', signer) + const erc20BridgeCreator = await deployContract('ERC20BridgeCreator', signer) const prover0 = await deployContract('OneStepProver0', signer) const proverMem = await deployContract('OneStepProverMemory', signer) const proverMath = await deployContract('OneStepProverMath', signer) @@ -82,6 +83,7 @@ async function deployAllContracts( const rollupCreator = await deployContract('RollupCreator', signer) return { bridgeCreator, + erc20BridgeCreator, prover0, proverMem, proverMath, @@ -107,6 +109,7 @@ async function main() { console.log('Waiting for the Template to be set on the Rollup Creator') await contracts.rollupCreator.setTemplates( contracts.bridgeCreator.address, + contracts.erc20BridgeCreator.address, contracts.osp.address, contracts.challengeManager.address, contracts.rollupAdmin.address, diff --git a/yarn.lock b/yarn.lock index f83dbf09..6e0849cf 100644 --- a/yarn.lock +++ b/yarn.lock @@ -4012,6 +4012,11 @@ domutils@^3.0.1: domelementtype "^2.3.0" domhandler "^5.0.1" +dotenv@^16.3.1: + version "16.3.1" + resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-16.3.1.tgz#369034de7d7e5b120972693352a3bf112172cc3e" + integrity sha512-IPzF4w4/Rd94bA9imS68tZBaYyBWSCE47V1RGuMrB94iyTOIEwRmVL2x/4An+6mETpLrKJ5hQkB8W4kFAadeIQ== + dotignore@~0.1.2: version "0.1.2" resolved "https://registry.yarnpkg.com/dotignore/-/dotignore-0.1.2.tgz#f942f2200d28c3a76fbdd6f0ee9f3257c8a2e905" From e415340cebf44063e1ff1e5c8631039c73bc29e2 Mon Sep 17 00:00:00 2001 From: Goran Vladika Date: Wed, 19 Jul 2023 14:50:52 +0200 Subject: [PATCH 021/292] Add support for deploying ERC20 rollup --- package.json | 4 ++-- scripts/createERC20Rollup.ts | 32 ++++++++++++++++++++++++++++++++ scripts/createEthRollup.ts | 13 +++++++++++++ scripts/deployment.ts | 2 +- scripts/rollupCreation.ts | 18 ++++++++---------- 5 files changed, 56 insertions(+), 13 deletions(-) create mode 100644 scripts/createERC20Rollup.ts create mode 100644 scripts/createEthRollup.ts diff --git a/package.json b/package.json index 4fcea9ba..1e2afdb1 100644 --- a/package.json +++ b/package.json @@ -29,8 +29,8 @@ "test:e2e": "hardhat test test/e2e/*.ts", "postinstall": "patch-package", "deploy-factory": "hardhat run scripts/deployment.ts", - "deploy-factory:goerli": "hardhat run scripts/deployment.ts --network arbGoerliRollup", - "deploy-rollup": "hardhat run scripts/rollupCreation.ts" + "deploy-rollup": "hardhat run scripts/createEthRollup.ts", + "deploy-erc20-rollup": "hardhat run scripts/createERC20Rollup.ts" }, "dependencies": { "@arbitrum/sdk": "^3.1.3", diff --git a/scripts/createERC20Rollup.ts b/scripts/createERC20Rollup.ts new file mode 100644 index 00000000..d6c68d87 --- /dev/null +++ b/scripts/createERC20Rollup.ts @@ -0,0 +1,32 @@ +import { ethers } from 'hardhat' +import '@nomiclabs/hardhat-ethers' +import { Signer } from 'ethers' +import { ERC20PresetFixedSupply__factory } from '../build/types/factories/@openzeppelin/contracts/token/ERC20/presets/ERC20PresetFixedSupply__factory' +import { createRollup } from './rollupCreation' + +async function deployERC20Token(deployer: Signer): Promise { + const factory = await new ERC20PresetFixedSupply__factory(deployer).deploy( + 'FeeToken', + 'FEE', + ethers.utils.parseEther('1000000000'), + await deployer.getAddress() + ) + const feeToken = await factory.deployed() + + return feeToken.address +} + +async function main() { + const [deployer] = await ethers.getSigners() + const customFeeTokenAddress = await deployERC20Token(deployer) + + console.log('Creating new rollup with', customFeeTokenAddress, 'as fee token') + await createRollup(customFeeTokenAddress) +} + +main() + .then(() => process.exit(0)) + .catch((error: Error) => { + console.error(error) + process.exit(1) + }) diff --git a/scripts/createEthRollup.ts b/scripts/createEthRollup.ts new file mode 100644 index 00000000..eb11e83d --- /dev/null +++ b/scripts/createEthRollup.ts @@ -0,0 +1,13 @@ +import '@nomiclabs/hardhat-ethers' +import { createRollup } from './rollupCreation' + +async function main() { + await createRollup() +} + +main() + .then(() => process.exit(0)) + .catch((error: Error) => { + console.error(error) + process.exit(1) + }) diff --git a/scripts/deployment.ts b/scripts/deployment.ts index 257311e8..437500b5 100644 --- a/scripts/deployment.ts +++ b/scripts/deployment.ts @@ -40,7 +40,7 @@ async function verifyContract( } // Function to handle contract deployment -export async function deployContract( +async function deployContract( contractName: string, signer: any, constructorArgs: any[] = [] diff --git a/scripts/rollupCreation.ts b/scripts/rollupCreation.ts index 2c9af885..9eadb476 100644 --- a/scripts/rollupCreation.ts +++ b/scripts/rollupCreation.ts @@ -21,7 +21,7 @@ interface RollupCreatedEvent { } } -async function main() { +export async function createRollup(feeToken?: string) { const rollupCreatorAddress = process.env.ROLLUP_CREATOR_ADDRESS if (!rollupCreatorAddress) { @@ -39,12 +39,16 @@ async function main() { const [signer] = await ethers.getSigners() - const rollupCreator = await new ethers.Contract( + const rollupCreator = new ethers.Contract( rollupCreatorAddress, rollupCreatorAbi, signer ) + if (!feeToken) { + feeToken = ethers.constants.AddressZero + } + try { let vals: boolean[] = [] for (let i = 0; i < config.validators.length; i++) { @@ -55,7 +59,8 @@ async function main() { const createRollupTx = await rollupCreator.createRollup( config.rollupConfig, config.batchPoster, - config.validators + config.validators, + feeToken ) const createRollupReceipt = await createRollupTx.wait() @@ -130,10 +135,3 @@ async function main() { ) } } - -main() - .then(() => process.exit(0)) - .catch((error: Error) => { - console.error(error) - process.exit(1) - }) From 14f7d01dd8e836477ab94f845a47a51c49ec3e53 Mon Sep 17 00:00:00 2001 From: Goran Vladika Date: Wed, 19 Jul 2023 14:54:08 +0200 Subject: [PATCH 022/292] Add .env sample for goerli --- .env.sample.goerli | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 .env.sample.goerli diff --git a/.env.sample.goerli b/.env.sample.goerli new file mode 100644 index 00000000..4d6dcc74 --- /dev/null +++ b/.env.sample.goerli @@ -0,0 +1,4 @@ +ROLLUP_CREATOR_ADDRESS="" +ARBISCAN_API_KEY="" +## deployer key +DEVNET_PRIVKEY="" \ No newline at end of file From b8a042bc670882e5cea3b07d6dc70c9a9a234f22 Mon Sep 17 00:00:00 2001 From: Goran Vladika Date: Wed, 19 Jul 2023 14:55:20 +0200 Subject: [PATCH 023/292] Rename action --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 1e2afdb1..f739b391 100644 --- a/package.json +++ b/package.json @@ -29,7 +29,7 @@ "test:e2e": "hardhat test test/e2e/*.ts", "postinstall": "patch-package", "deploy-factory": "hardhat run scripts/deployment.ts", - "deploy-rollup": "hardhat run scripts/createEthRollup.ts", + "deploy-eth-rollup": "hardhat run scripts/createEthRollup.ts", "deploy-erc20-rollup": "hardhat run scripts/createERC20Rollup.ts" }, "dependencies": { From 1d6ae10655bbe7482e541dc1f02fe6fbc647858f Mon Sep 17 00:00:00 2001 From: Goran Vladika Date: Mon, 24 Jul 2023 15:21:32 +0200 Subject: [PATCH 024/292] Add option to provide existing ERC20 token to be used as rollup's fee token --- .env.sample.goerli | 5 ++++- scripts/createERC20Rollup.ts | 9 ++++++++- 2 files changed, 12 insertions(+), 2 deletions(-) diff --git a/.env.sample.goerli b/.env.sample.goerli index 4d6dcc74..52bf51b5 100644 --- a/.env.sample.goerli +++ b/.env.sample.goerli @@ -1,4 +1,7 @@ ROLLUP_CREATOR_ADDRESS="" ARBISCAN_API_KEY="" ## deployer key -DEVNET_PRIVKEY="" \ No newline at end of file +DEVNET_PRIVKEY="" + +## optional - address of already deployed ERC20 token which shall be used as rollup's fee token +FEE_TOKEN_ADDRESS="" diff --git a/scripts/createERC20Rollup.ts b/scripts/createERC20Rollup.ts index d6c68d87..000e8d64 100644 --- a/scripts/createERC20Rollup.ts +++ b/scripts/createERC20Rollup.ts @@ -18,7 +18,14 @@ async function deployERC20Token(deployer: Signer): Promise { async function main() { const [deployer] = await ethers.getSigners() - const customFeeTokenAddress = await deployERC20Token(deployer) + + let customFeeTokenAddress = process.env.FEE_TOKEN_ADDRESS + if (!customFeeTokenAddress) { + console.log( + 'FEE_TOKEN_ADDRESS env var not provided, deploying new ERC20 token' + ) + customFeeTokenAddress = await deployERC20Token(deployer) + } console.log('Creating new rollup with', customFeeTokenAddress, 'as fee token') await createRollup(customFeeTokenAddress) From 1aa65995664346a3ad5e874fd3581a4d6f34b734 Mon Sep 17 00:00:00 2001 From: Goran Vladika Date: Wed, 26 Jul 2023 14:56:12 +0200 Subject: [PATCH 025/292] Mark getter read-only --- src/bridge/IERC20Bridge.sol | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/bridge/IERC20Bridge.sol b/src/bridge/IERC20Bridge.sol index f937a1c6..b54a28c4 100644 --- a/src/bridge/IERC20Bridge.sol +++ b/src/bridge/IERC20Bridge.sol @@ -15,7 +15,7 @@ interface IERC20Bridge is IBridge { * are not supported to be used as chain's native token, as they can break collateralization * invariants. */ - function nativeToken() external returns (address); + function nativeToken() external view returns (address); /** * @dev Enqueue a message in the delayed inbox accumulator. From 64717f5b8a502352326759f419ffc1c8a080ef92 Mon Sep 17 00:00:00 2001 From: Goran Vladika Date: Thu, 3 Aug 2023 13:30:37 +0200 Subject: [PATCH 026/292] Add upgrade executor to rollup creation flow --- src/libraries/UpgradeExecutor.sol | 57 ++++++++++++ src/rollup/RollupCreator.sol | 20 ++++- test/contract/arbRollup.spec.ts | 7 ++ test/foundry/RollupCreator.t.sol | 139 ++++++++++++++++++++++-------- 4 files changed, 187 insertions(+), 36 deletions(-) create mode 100644 src/libraries/UpgradeExecutor.sol diff --git a/src/libraries/UpgradeExecutor.sol b/src/libraries/UpgradeExecutor.sol new file mode 100644 index 00000000..ada8c6de --- /dev/null +++ b/src/libraries/UpgradeExecutor.sol @@ -0,0 +1,57 @@ +// SPDX-License-Identifier: Apache-2.0 +pragma solidity ^0.8.4; + +import "@openzeppelin/contracts-upgradeable/access/AccessControlUpgradeable.sol"; +import "@openzeppelin/contracts/security/ReentrancyGuard.sol"; +import "@openzeppelin/contracts/utils/Address.sol"; + +/// @title A root contract from which it execute upgrades +/// @notice Does not contain upgrade logic itself, only the means to call upgrade contracts and execute them +/// @dev We use these upgrade contracts as they allow multiple actions to take place in an upgrade +/// and for these actions to interact. However because we are delegatecalling into these upgrade +/// contracts, it's important that these upgrade contract do not touch or modify contract state. +contract UpgradeExecutor is Initializable, AccessControlUpgradeable, ReentrancyGuard { + using Address for address; + + bytes32 public constant ADMIN_ROLE = keccak256("ADMIN_ROLE"); + bytes32 public constant EXECUTOR_ROLE = keccak256("EXECUTOR_ROLE"); + + /// @notice Emitted when an upgrade execution occurs + event UpgradeExecuted(address indexed upgrade, uint256 value, bytes data); + + /// @notice Initialise the upgrade executor + /// @param admin The admin who can update other roles, and itself - ADMIN_ROLE + /// @param executors Can call the execute function - EXECUTOR_ROLE + function initialize(address admin, address[] memory executors) public initializer { + require(admin != address(0), "UpgradeExecutor: zero admin"); + + __AccessControl_init(); + + _setRoleAdmin(ADMIN_ROLE, ADMIN_ROLE); + _setRoleAdmin(EXECUTOR_ROLE, ADMIN_ROLE); + + _setupRole(ADMIN_ROLE, admin); + for (uint256 i = 0; i < executors.length; ++i) { + _setupRole(EXECUTOR_ROLE, executors[i]); + } + } + + /// @notice Execute an upgrade by delegate calling an upgrade contract + /// @dev Only executor can call this. Since we're using a delegatecall here the Upgrade contract + /// will have access to the state of this contract - including the roles. Only upgrade contracts + /// that do not touch local state should be used. + function execute(address upgrade, bytes memory upgradeCallData) + public + payable + onlyRole(EXECUTOR_ROLE) + nonReentrant + { + // OZ Address library check if the address is a contract and bubble up inner revert reason + address(upgrade).functionDelegateCall( + upgradeCallData, + "UpgradeExecutor: inner delegate call failed without reason" + ); + + emit UpgradeExecuted(upgrade, msg.value, upgradeCallData); + } +} diff --git a/src/rollup/RollupCreator.sol b/src/rollup/RollupCreator.sol index 0d257703..81a1ac76 100644 --- a/src/rollup/RollupCreator.sol +++ b/src/rollup/RollupCreator.sol @@ -8,6 +8,7 @@ import "./RollupProxy.sol"; import "./IRollupAdmin.sol"; import "./BridgeCreator.sol"; import "./ERC20BridgeCreator.sol"; +import "../libraries/UpgradeExecutor.sol"; import "@openzeppelin/contracts/proxy/transparent/ProxyAdmin.sol"; import "@openzeppelin/contracts/proxy/transparent/TransparentUpgradeableProxy.sol"; import "@openzeppelin/contracts/access/Ownable.sol"; @@ -34,6 +35,7 @@ contract RollupCreator is Ownable { IChallengeManager public challengeManagerTemplate; IRollupAdmin public rollupAdminLogic; IRollupUser public rollupUserLogic; + UpgradeExecutor public upgradeExecutorLogic; address public validatorUtils; address public validatorWalletCreator; @@ -55,6 +57,7 @@ contract RollupCreator is Ownable { IChallengeManager _challengeManagerLogic, IRollupAdmin _rollupAdminLogic, IRollupUser _rollupUserLogic, + UpgradeExecutor _upgradeExecutorLogic, address _validatorUtils, address _validatorWalletCreator ) external onlyOwner { @@ -64,6 +67,7 @@ contract RollupCreator is Ownable { challengeManagerTemplate = _challengeManagerLogic; rollupAdminLogic = _rollupAdminLogic; rollupUserLogic = _rollupUserLogic; + upgradeExecutorLogic = _upgradeExecutorLogic; validatorUtils = _validatorUtils; validatorWalletCreator = _validatorWalletCreator; emit TemplatesUpdated(); @@ -91,6 +95,20 @@ contract RollupCreator is Ownable { ) external returns (address) { ProxyAdmin proxyAdmin = new ProxyAdmin(); + // deploy and init upgrade executor + UpgradeExecutor upgradeExecutor = UpgradeExecutor( + address( + new TransparentUpgradeableProxy( + address(upgradeExecutorLogic), + address(proxyAdmin), + bytes("") + ) + ) + ); + address[] memory upgradeExecutors = new address[](1); + upgradeExecutors[0] = config.owner; + upgradeExecutor.initialize(address(upgradeExecutor), upgradeExecutors); + // Create the rollup proxy to figure out the address and initialize it later RollupProxy rollup = new RollupProxy{salt: keccak256(abi.encode(config))}(); @@ -140,7 +158,7 @@ contract RollupCreator is Ownable { osp ); - proxyAdmin.transferOwnership(config.owner); + proxyAdmin.transferOwnership(address(upgradeExecutor)); // initialize the rollup with this contract as owner to set batch poster and validators // it will transfer the ownership back to the actual owner later diff --git a/test/contract/arbRollup.spec.ts b/test/contract/arbRollup.spec.ts index 884da19d..68ae8e1c 100644 --- a/test/contract/arbRollup.spec.ts +++ b/test/contract/arbRollup.spec.ts @@ -37,6 +37,7 @@ import { RollupUserLogic__factory, SequencerInbox, SequencerInbox__factory, + UpgradeExecutor__factory, } from '../../build/types' import { initializeAccounts } from './utils' @@ -156,6 +157,11 @@ const setup = async () => { )) as RollupUserLogic__factory const rollupUserLogicTemplate = await rollupUserLogicFac.deploy() + const upgradeExecutorLogicFac = (await ethers.getContractFactory( + 'UpgradeExecutor' + )) as UpgradeExecutor__factory + const upgradeExecutorLogic = await upgradeExecutorLogicFac.deploy() + const ethBridgeCreatorFac = (await ethers.getContractFactory( 'BridgeCreator' )) as BridgeCreator__factory @@ -178,6 +184,7 @@ const setup = async () => { challengeManagerTemplate.address, rollupAdminLogicTemplate.address, rollupUserLogicTemplate.address, + upgradeExecutorLogic.address, ethers.constants.AddressZero, ethers.constants.AddressZero ) diff --git a/test/foundry/RollupCreator.t.sol b/test/foundry/RollupCreator.t.sol index 9ae2b8db..dcec5b93 100644 --- a/test/foundry/RollupCreator.t.sol +++ b/test/foundry/RollupCreator.t.sol @@ -35,6 +35,8 @@ contract RollupCreatorTest is Test { BridgeCreator ethBridgeCreator = new BridgeCreator(); ERC20BridgeCreator erc20BridgeCreator = new ERC20BridgeCreator(); + UpgradeExecutor upgradeExecutorLogic = new UpgradeExecutor(); + ( IOneStepProofEntry ospEntry, IChallengeManager challengeManager, @@ -53,6 +55,7 @@ contract RollupCreatorTest is Test { challengeManager, _rollupAdmin, _rollupUser, + upgradeExecutorLogic, address(new ValidatorUtils()), address(new ValidatorWalletCreator()) ); @@ -64,12 +67,8 @@ contract RollupCreatorTest is Test { vm.startPrank(deployer); // deployment params - ISequencerInbox.MaxTimeVariation memory timeVars = ISequencerInbox.MaxTimeVariation( - ((60 * 60 * 24) / 15), - 12, - 60 * 60 * 24, - 60 * 60 - ); + ISequencerInbox.MaxTimeVariation memory timeVars = + ISequencerInbox.MaxTimeVariation(((60 * 60 * 24) / 15), 12, 60 * 60 * 24, 60 * 60); Config memory config = Config({ confirmPeriodBlocks: 20, extraChallengeTimeBlocks: 200, @@ -80,7 +79,7 @@ contract RollupCreatorTest is Test { loserStakeEscrow: address(200), chainId: 1337, chainConfig: "abc", - genesisBlockNum: 15000000, + genesisBlockNum: 15_000_000, sequencerInboxMaxTimeVariation: timeVars }); @@ -89,12 +88,8 @@ contract RollupCreatorTest is Test { address[] memory validators = new address[](2); validators[0] = makeAddr("validator1"); validators[1] = makeAddr("validator2"); - address rollupAddress = rollupCreator.createRollup( - config, - batchPoster, - validators, - address(0) - ); + address rollupAddress = + rollupCreator.createRollup(config, batchPoster, validators, address(0)); vm.stopPrank(); @@ -123,21 +118,59 @@ contract RollupCreatorTest is Test { ISequencerInbox(address(rollup.sequencerInbox())).isBatchPoster(batchPoster), "Invalid batch poster" ); + + // check proxy admin for non-rollup contracts + address proxyAdminExpectedAddress = computeCreateAddress(address(rollupCreator), 1); + + assertEq( + _getProxyAdmin(address(rollup.sequencerInbox())), + proxyAdminExpectedAddress, + "Invalid seqInbox' proxyAdmin owner" + ); + assertEq( + _getProxyAdmin(address(rollup.bridge())), + proxyAdminExpectedAddress, + "Invalid bridge's proxyAdmin owner" + ); + assertEq( + _getProxyAdmin(address(rollup.inbox())), + proxyAdminExpectedAddress, + "Invalid inbox' proxyAdmin owner" + ); + assertEq( + _getProxyAdmin(address(rollup.rollupEventInbox())), + proxyAdminExpectedAddress, + "Invalid rollupEventInbox' proxyAdmin owner" + ); + assertEq( + _getProxyAdmin(address(rollup.challengeManager())), + proxyAdminExpectedAddress, + "Invalid challengeManager's proxyAdmin owner" + ); + + // check upgrade executor owns proxyAdmin + address upgradeExecutorExpectedAddress = computeCreateAddress(address(rollupCreator), 2); + assertEq( + ProxyAdmin(_getProxyAdmin(address(rollup.sequencerInbox()))).owner(), + upgradeExecutorExpectedAddress, + "Invalid proxyAdmin's owner" + ); + + // check rollupOwner has executor role + UpgradeExecutor executor = UpgradeExecutor(upgradeExecutorExpectedAddress); + assertTrue( + executor.hasRole(keccak256("EXECUTOR_ROLE"), rollupOwner), "Invalid executor role" + ); } function test_createErc20Rollup() public { vm.startPrank(deployer); - address nativeToken = address( - new ERC20PresetFixedSupply("Appchain Token", "App", 1_000_000, address(this)) - ); + address nativeToken = + address(new ERC20PresetFixedSupply("Appchain Token", "App", 1_000_000, address(this))); // deployment params - ISequencerInbox.MaxTimeVariation memory timeVars = ISequencerInbox.MaxTimeVariation( - ((60 * 60 * 24) / 15), - 12, - 60 * 60 * 24, - 60 * 60 - ); + ISequencerInbox.MaxTimeVariation memory timeVars = + ISequencerInbox.MaxTimeVariation(((60 * 60 * 24) / 15), 12, 60 * 60 * 24, 60 * 60); Config memory config = Config({ confirmPeriodBlocks: 20, extraChallengeTimeBlocks: 200, @@ -148,7 +181,7 @@ contract RollupCreatorTest is Test { loserStakeEscrow: address(200), chainId: 1337, chainConfig: "abc", - genesisBlockNum: 15000000, + genesisBlockNum: 15_000_000, sequencerInboxMaxTimeVariation: timeVars }); @@ -157,12 +190,8 @@ contract RollupCreatorTest is Test { address[] memory validators = new address[](2); validators[0] = makeAddr("validator1"); validators[1] = makeAddr("validator2"); - address rollupAddress = rollupCreator.createRollup( - config, - batchPoster, - validators, - nativeToken - ); + address rollupAddress = + rollupCreator.createRollup(config, batchPoster, validators, nativeToken); vm.stopPrank(); @@ -194,9 +223,50 @@ contract RollupCreatorTest is Test { // native token check IBridge bridge = RollupCore(address(rollupAddress)).bridge(); assertEq( - IERC20Bridge(address(bridge)).nativeToken(), - nativeToken, - "Invalid native token ref" + IERC20Bridge(address(bridge)).nativeToken(), nativeToken, "Invalid native token ref" + ); + + // check proxy admin for non-rollup contracts + address proxyAdminExpectedAddress = computeCreateAddress(address(rollupCreator), 1); + + assertEq( + _getProxyAdmin(address(rollup.sequencerInbox())), + proxyAdminExpectedAddress, + "Invalid seqInbox' proxyAdmin owner" + ); + assertEq( + _getProxyAdmin(address(rollup.bridge())), + proxyAdminExpectedAddress, + "Invalid bridge's proxyAdmin owner" + ); + assertEq( + _getProxyAdmin(address(rollup.inbox())), + proxyAdminExpectedAddress, + "Invalid inbox' proxyAdmin owner" + ); + assertEq( + _getProxyAdmin(address(rollup.rollupEventInbox())), + proxyAdminExpectedAddress, + "Invalid rollupEventInbox' proxyAdmin owner" + ); + assertEq( + _getProxyAdmin(address(rollup.challengeManager())), + proxyAdminExpectedAddress, + "Invalid challengeManager's proxyAdmin owner" + ); + + // check upgrade executor owns proxyAdmin + address upgradeExecutorExpectedAddress = computeCreateAddress(address(rollupCreator), 2); + assertEq( + ProxyAdmin(_getProxyAdmin(address(rollup.sequencerInbox()))).owner(), + upgradeExecutorExpectedAddress, + "Invalid proxyAdmin's owner" + ); + + // check rollupOwner has executor role + UpgradeExecutor executor = UpgradeExecutor(upgradeExecutorExpectedAddress); + assertTrue( + executor.hasRole(keccak256("EXECUTOR_ROLE"), rollupOwner), "Invalid executor role" ); } @@ -236,9 +306,8 @@ contract RollupCreatorTest is Test { } function _getSecondary(address proxy) internal view returns (address) { - bytes32 secondarySlot = bytes32( - uint256(keccak256("eip1967.proxy.implementation.secondary")) - 1 - ); + bytes32 secondarySlot = + bytes32(uint256(keccak256("eip1967.proxy.implementation.secondary")) - 1); return address(uint160(uint256(vm.load(proxy, secondarySlot)))); } } From 884625ec080a5f62b971f99f6a7450e29be5efc2 Mon Sep 17 00:00:00 2001 From: Goran Vladika Date: Thu, 3 Aug 2023 13:50:13 +0200 Subject: [PATCH 027/292] Test upgrading one of bridge contracts --- test/foundry/RollupCreator.t.sol | 65 ++++++++++++++++++++++++++++++++ 1 file changed, 65 insertions(+) diff --git a/test/foundry/RollupCreator.t.sol b/test/foundry/RollupCreator.t.sol index dcec5b93..34ebf666 100644 --- a/test/foundry/RollupCreator.t.sol +++ b/test/foundry/RollupCreator.t.sol @@ -270,6 +270,56 @@ contract RollupCreatorTest is Test { ); } + function test_upgrade() public { + vm.startPrank(deployer); + + // deployment params + ISequencerInbox.MaxTimeVariation memory timeVars = + ISequencerInbox.MaxTimeVariation(((60 * 60 * 24) / 15), 12, 60 * 60 * 24, 60 * 60); + Config memory config = Config({ + confirmPeriodBlocks: 20, + extraChallengeTimeBlocks: 200, + stakeToken: address(0), + baseStake: 1000, + wasmModuleRoot: keccak256("wasm"), + owner: rollupOwner, + loserStakeEscrow: address(200), + chainId: 1337, + chainConfig: "abc", + genesisBlockNum: 15_000_000, + sequencerInboxMaxTimeVariation: timeVars + }); + + /// deploy rollup + address batchPoster = makeAddr("batch poster"); + address[] memory validators = new address[](2); + validators[0] = makeAddr("validator1"); + validators[1] = makeAddr("validator2"); + address rollupAddress = + rollupCreator.createRollup(config, batchPoster, validators, address(0)); + + vm.stopPrank(); + + //// upgrade inbox + RollupCore rollup = RollupCore(rollupAddress); + address inbox = address(rollup.inbox()); + address proxyAdmin = computeCreateAddress(address(rollupCreator), 1); + UpgradeExecutor upgradeExecutor = + UpgradeExecutor(computeCreateAddress(address(rollupCreator), 2)); + + Dummy newLogicImpl = new Dummy(); + bytes memory data = abi.encodeWithSelector( + ProxyUpgradeAction.perform.selector, address(proxyAdmin), inbox, address(newLogicImpl) + ); + + address upgradeAction = address(new ProxyUpgradeAction()); + vm.prank(rollupOwner); + upgradeExecutor.execute(upgradeAction, data); + + // check upgrade was successful + assertEq(_getImpl(inbox), address(newLogicImpl)); + } + function _prepareRollupDeployment() internal returns ( @@ -300,6 +350,11 @@ contract RollupCreatorTest is Test { return address(uint160(uint256(vm.load(proxy, adminSlot)))); } + function _getImpl(address proxy) internal view returns (address) { + bytes32 implSlot = bytes32(uint256(keccak256("eip1967.proxy.implementation")) - 1); + return address(uint160(uint256(vm.load(proxy, implSlot)))); + } + function _getPrimary(address proxy) internal view returns (address) { bytes32 primarySlot = bytes32(uint256(keccak256("eip1967.proxy.implementation")) - 1); return address(uint160(uint256(vm.load(proxy, primarySlot)))); @@ -311,3 +366,13 @@ contract RollupCreatorTest is Test { return address(uint160(uint256(vm.load(proxy, secondarySlot)))); } } + +contract ProxyUpgradeAction { + function perform(address admin, address payable target, address newLogic) public payable { + ProxyAdmin(admin).upgrade(TransparentUpgradeableProxy(target), newLogic); + } +} + +contract Dummy { + function dummy() public {} +} From a7eae8447ad93fe1e8fce7ff4377b7093c191f55 Mon Sep 17 00:00:00 2001 From: Goran Vladika Date: Thu, 3 Aug 2023 13:57:19 +0200 Subject: [PATCH 028/292] Check outbox owner --- test/foundry/RollupCreator.t.sol | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/test/foundry/RollupCreator.t.sol b/test/foundry/RollupCreator.t.sol index 34ebf666..ebb9cb75 100644 --- a/test/foundry/RollupCreator.t.sol +++ b/test/foundry/RollupCreator.t.sol @@ -137,6 +137,11 @@ contract RollupCreatorTest is Test { proxyAdminExpectedAddress, "Invalid inbox' proxyAdmin owner" ); + assertEq( + _getProxyAdmin(address(rollup.outbox())), + proxyAdminExpectedAddress, + "Invalid outbox' proxyAdmin owner" + ); assertEq( _getProxyAdmin(address(rollup.rollupEventInbox())), proxyAdminExpectedAddress, @@ -244,6 +249,11 @@ contract RollupCreatorTest is Test { proxyAdminExpectedAddress, "Invalid inbox' proxyAdmin owner" ); + assertEq( + _getProxyAdmin(address(rollup.outbox())), + proxyAdminExpectedAddress, + "Invalid outbox' proxyAdmin owner" + ); assertEq( _getProxyAdmin(address(rollup.rollupEventInbox())), proxyAdminExpectedAddress, From 768d0295fc1a33a79633e0a46e0200f5d5995bcb Mon Sep 17 00:00:00 2001 From: Goran Vladika Date: Thu, 3 Aug 2023 15:08:13 +0200 Subject: [PATCH 029/292] Rename to 'executors' Co-authored-by: gzeon --- src/rollup/RollupCreator.sol | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/rollup/RollupCreator.sol b/src/rollup/RollupCreator.sol index 81a1ac76..ecf2da78 100644 --- a/src/rollup/RollupCreator.sol +++ b/src/rollup/RollupCreator.sol @@ -105,9 +105,9 @@ contract RollupCreator is Ownable { ) ) ); - address[] memory upgradeExecutors = new address[](1); - upgradeExecutors[0] = config.owner; - upgradeExecutor.initialize(address(upgradeExecutor), upgradeExecutors); + address[] memory executors = new address[](1); + executors[0] = config.owner; + upgradeExecutor.initialize(address(upgradeExecutor), executors); // Create the rollup proxy to figure out the address and initialize it later RollupProxy rollup = new RollupProxy{salt: keccak256(abi.encode(config))}(); From d219c942e04f11332f4f2e249cacfe6c2a76df3a Mon Sep 17 00:00:00 2001 From: Goran Vladika Date: Thu, 3 Aug 2023 17:23:04 +0200 Subject: [PATCH 030/292] Add proxy admin getter to inbox Will be used from token bridge creator to set the same proxy admin for token bridge contracts --- src/bridge/AbsInbox.sol | 11 +++++++++++ src/bridge/IInbox.sol | 3 +++ src/mocks/InboxStub.sol | 4 ++++ test/foundry/AbsInbox.t.sol | 4 ++++ test/foundry/RollupCreator.t.sol | 2 +- 5 files changed, 23 insertions(+), 1 deletion(-) diff --git a/src/bridge/AbsInbox.sol b/src/bridge/AbsInbox.sol index 45c5a6ce..93b082ac 100644 --- a/src/bridge/AbsInbox.sol +++ b/src/bridge/AbsInbox.sol @@ -30,6 +30,7 @@ import {MAX_DATA_SIZE} from "../libraries/Constants.sol"; import "@openzeppelin/contracts-upgradeable/utils/AddressUpgradeable.sol"; import "@openzeppelin/contracts-upgradeable/security/PausableUpgradeable.sol"; +import "@openzeppelin/contracts-upgradeable/utils/StorageSlotUpgradeable.sol"; /** * @title Inbox for user and contract originated messages @@ -37,6 +38,11 @@ import "@openzeppelin/contracts-upgradeable/security/PausableUpgradeable.sol"; * to await inclusion in the SequencerInbox */ abstract contract AbsInbox is DelegateCallAware, PausableUpgradeable, IInbox { + /// @dev Storage slot with the admin of the contract. + /// This is the keccak-256 hash of "eip1967.proxy.admin" subtracted by 1. + bytes32 internal constant _ADMIN_SLOT = + 0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103; + /// @inheritdoc IInbox IBridge public bridge; /// @inheritdoc IInbox @@ -206,6 +212,11 @@ abstract contract AbsInbox is DelegateCallAware, PausableUpgradeable, IInbox { ); } + /// @inheritdoc IInbox + function getProxyAdmin() external view returns (address) { + return StorageSlotUpgradeable.getAddressSlot(_ADMIN_SLOT).value; + } + function _createRetryableTicket( address to, uint256 l2CallValue, diff --git a/src/bridge/IInbox.sol b/src/bridge/IInbox.sol index 2fc7df68..39883491 100644 --- a/src/bridge/IInbox.sol +++ b/src/bridge/IInbox.sol @@ -77,6 +77,9 @@ interface IInbox is IDelayedMessageProvider { /// @notice check if allowList is enabled function allowListEnabled() external view returns (bool); + /// @notice returns the current admin + function getProxyAdmin() external view returns (address); + // ---------- initializer ---------- function initialize(IBridge _bridge, ISequencerInbox _sequencerInbox) external; diff --git a/src/mocks/InboxStub.sol b/src/mocks/InboxStub.sol index 3c4776d0..4b778716 100644 --- a/src/mocks/InboxStub.sol +++ b/src/mocks/InboxStub.sol @@ -202,4 +202,8 @@ contract InboxStub is IInbox, IEthInbox { function allowListEnabled() external pure returns (bool) { revert("NOT_IMPLEMENTED"); } + + function getProxyAdmin() external pure returns (address) { + revert("NOT_IMPLEMENTED"); + } } diff --git a/test/foundry/AbsInbox.t.sol b/test/foundry/AbsInbox.t.sol index 0854c0b1..cccda745 100644 --- a/test/foundry/AbsInbox.t.sol +++ b/test/foundry/AbsInbox.t.sol @@ -20,6 +20,10 @@ abstract contract AbsInboxTest is Test { address public seqInbox = address(1001); /* solhint-disable func-name-mixedcase */ + function test_getProxyAdmin() public { + assertNotEq(inbox.getProxyAdmin(), address(0), "Invalid proxy admin"); + } + function test_setAllowList() public { address[] memory users = new address[](2); users[0] = address(300); diff --git a/test/foundry/RollupCreator.t.sol b/test/foundry/RollupCreator.t.sol index ebb9cb75..cf3560d9 100644 --- a/test/foundry/RollupCreator.t.sol +++ b/test/foundry/RollupCreator.t.sol @@ -133,7 +133,7 @@ contract RollupCreatorTest is Test { "Invalid bridge's proxyAdmin owner" ); assertEq( - _getProxyAdmin(address(rollup.inbox())), + rollup.inbox().getProxyAdmin(), proxyAdminExpectedAddress, "Invalid inbox' proxyAdmin owner" ); From 1f3fcda1c1695b28cd305995e426dba4f3899bed Mon Sep 17 00:00:00 2001 From: Goran Vladika Date: Fri, 4 Aug 2023 12:22:21 +0200 Subject: [PATCH 031/292] Rename Inbox interfaces to keep compatibility IEthInbox -> IInbox IInbox -> IInboxBase --- src/bridge/AbsInbox.sol | 28 ++-- src/bridge/ERC20Inbox.sol | 6 +- src/bridge/IERC20Inbox.sol | 4 +- src/bridge/IEthInbox.sol | 133 ---------------- src/bridge/IInbox.sol | 144 ++++++++++++------ src/bridge/IInboxBase.sol | 83 ++++++++++ src/bridge/Inbox.sol | 28 ++-- src/bridge/SequencerInbox.sol | 2 +- src/mocks/InboxStub.sol | 4 +- src/rollup/AbsBridgeCreator.sol | 12 +- src/rollup/BridgeCreator.sol | 2 +- src/rollup/Config.sol | 4 +- src/rollup/ERC20BridgeCreator.sol | 2 +- src/rollup/IBridgeCreator.sol | 6 +- src/rollup/IRollupCore.sol | 2 +- src/rollup/RollupAdminLogic.sol | 2 +- src/rollup/RollupCore.sol | 2 +- src/rollup/RollupCreator.sol | 2 +- src/rollup/RollupLib.sol | 2 +- .../InterfaceCompatibilityTester.sol | 2 +- test/foundry/AbsInbox.t.sol | 2 +- test/foundry/ERC20BridgeCreator.t.sol | 2 +- test/foundry/ERC20Inbox.t.sol | 2 +- test/foundry/Inbox.t.sol | 8 +- test/storage/RollupAdminLogic.dot | 2 +- test/storage/RollupCore.dot | 2 +- test/storage/RollupUserLogic.dot | 2 +- 27 files changed, 245 insertions(+), 245 deletions(-) delete mode 100644 src/bridge/IEthInbox.sol create mode 100644 src/bridge/IInboxBase.sol diff --git a/src/bridge/AbsInbox.sol b/src/bridge/AbsInbox.sol index 45c5a6ce..8db527c5 100644 --- a/src/bridge/AbsInbox.sol +++ b/src/bridge/AbsInbox.sol @@ -15,7 +15,7 @@ import { NotRollupOrOwner, RetryableData } from "../libraries/Error.sol"; -import "./IInbox.sol"; +import "./IInboxBase.sol"; import "./ISequencerInbox.sol"; import "./IBridge.sol"; import "../libraries/AddressAliasHelper.sol"; @@ -36,24 +36,24 @@ import "@openzeppelin/contracts-upgradeable/security/PausableUpgradeable.sol"; * @notice Messages created via this inbox are enqueued in the delayed accumulator * to await inclusion in the SequencerInbox */ -abstract contract AbsInbox is DelegateCallAware, PausableUpgradeable, IInbox { - /// @inheritdoc IInbox +abstract contract AbsInbox is DelegateCallAware, PausableUpgradeable, IInboxBase { + /// @inheritdoc IInboxBase IBridge public bridge; - /// @inheritdoc IInbox + /// @inheritdoc IInboxBase ISequencerInbox public sequencerInbox; /// ------------------------------------ allow list start ------------------------------------ /// - /// @inheritdoc IInbox + /// @inheritdoc IInboxBase bool public allowListEnabled; - /// @inheritdoc IInbox + /// @inheritdoc IInboxBase mapping(address => bool) public isAllowed; event AllowListAddressSet(address indexed user, bool val); event AllowListEnabledUpdated(bool isEnabled); - /// @inheritdoc IInbox + /// @inheritdoc IInboxBase function setAllowList(address[] memory user, bool[] memory val) external onlyRollupOrOwner { require(user.length == val.length, "INVALID_INPUT"); @@ -63,7 +63,7 @@ abstract contract AbsInbox is DelegateCallAware, PausableUpgradeable, IInbox { } } - /// @inheritdoc IInbox + /// @inheritdoc IInboxBase function setAllowListEnabled(bool _allowListEnabled) external onlyRollupOrOwner { require(_allowListEnabled != allowListEnabled, "ALREADY_SET"); allowListEnabled = _allowListEnabled; @@ -99,12 +99,12 @@ abstract contract AbsInbox is DelegateCallAware, PausableUpgradeable, IInbox { return deployTimeChainId != block.chainid; } - /// @inheritdoc IInbox + /// @inheritdoc IInboxBase function pause() external onlyRollupOrOwner { _pause(); } - /// @inheritdoc IInbox + /// @inheritdoc IInboxBase function unpause() external onlyRollupOrOwner { _unpause(); } @@ -120,7 +120,7 @@ abstract contract AbsInbox is DelegateCallAware, PausableUpgradeable, IInbox { __Pausable_init(); } - /// @inheritdoc IInbox + /// @inheritdoc IInboxBase function sendL2MessageFromOrigin(bytes calldata messageData) external whenNotPaused @@ -137,7 +137,7 @@ abstract contract AbsInbox is DelegateCallAware, PausableUpgradeable, IInbox { return msgNum; } - /// @inheritdoc IInbox + /// @inheritdoc IInboxBase function sendL2Message(bytes calldata messageData) external whenNotPaused @@ -148,7 +148,7 @@ abstract contract AbsInbox is DelegateCallAware, PausableUpgradeable, IInbox { return _deliverMessage(L2_MSG, msg.sender, messageData, 0); } - /// @inheritdoc IInbox + /// @inheritdoc IInboxBase function sendUnsignedTransaction( uint256 gasLimit, uint256 maxFeePerGas, @@ -178,7 +178,7 @@ abstract contract AbsInbox is DelegateCallAware, PausableUpgradeable, IInbox { ); } - /// @inheritdoc IInbox + /// @inheritdoc IInboxBase function sendContractTransaction( uint256 gasLimit, uint256 maxFeePerGas, diff --git a/src/bridge/ERC20Inbox.sol b/src/bridge/ERC20Inbox.sol index 0a065988..8d364c78 100644 --- a/src/bridge/ERC20Inbox.sol +++ b/src/bridge/ERC20Inbox.sol @@ -21,7 +21,7 @@ import "@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol"; contract ERC20Inbox is AbsInbox, IERC20Inbox { using SafeERC20 for IERC20; - /// @inheritdoc IInbox + /// @inheritdoc IInboxBase function initialize(IBridge _bridge, ISequencerInbox _sequencerInbox) external initializer @@ -105,11 +105,11 @@ contract ERC20Inbox is AbsInbox, IERC20Inbox { ); } - /// @inheritdoc IInbox + /// @inheritdoc IInboxBase function calculateRetryableSubmissionFee(uint256, uint256) public pure - override(AbsInbox, IInbox) + override(AbsInbox, IInboxBase) returns (uint256) { // retryable ticket's submission fee is not charged when ERC20 token is used to pay for fees diff --git a/src/bridge/IERC20Inbox.sol b/src/bridge/IERC20Inbox.sol index dd1b8390..53182553 100644 --- a/src/bridge/IERC20Inbox.sol +++ b/src/bridge/IERC20Inbox.sol @@ -5,9 +5,9 @@ // solhint-disable-next-line compiler-version pragma solidity >=0.6.9 <0.9.0; -import "./IInbox.sol"; +import "./IInboxBase.sol"; -interface IERC20Inbox is IInbox { +interface IERC20Inbox is IInboxBase { /** * @notice Deposit native token from L1 to L2 to address of the sender if sender is an EOA, and to its aliased address if the sender is a contract * @dev This does not trigger the fallback function when receiving in the L2 side. diff --git a/src/bridge/IEthInbox.sol b/src/bridge/IEthInbox.sol deleted file mode 100644 index dd484903..00000000 --- a/src/bridge/IEthInbox.sol +++ /dev/null @@ -1,133 +0,0 @@ -// Copyright 2021-2022, Offchain Labs, Inc. -// For license information, see https://github.com/nitro/blob/master/LICENSE -// SPDX-License-Identifier: BUSL-1.1 - -// solhint-disable-next-line compiler-version -pragma solidity >=0.6.9 <0.9.0; - -import "./IBridge.sol"; -import "./IInbox.sol"; - -interface IEthInbox is IInbox { - function sendL1FundedUnsignedTransaction( - uint256 gasLimit, - uint256 maxFeePerGas, - uint256 nonce, - address to, - bytes calldata data - ) external payable returns (uint256); - - function sendL1FundedContractTransaction( - uint256 gasLimit, - uint256 maxFeePerGas, - address to, - bytes calldata data - ) external payable returns (uint256); - - /** - * @dev This method can only be called upon L1 fork and will not alias the caller - * This method will revert if not called from origin - */ - function sendL1FundedUnsignedTransactionToFork( - uint256 gasLimit, - uint256 maxFeePerGas, - uint256 nonce, - address to, - bytes calldata data - ) external payable returns (uint256); - - /** - * @dev This method can only be called upon L1 fork and will not alias the caller - * This method will revert if not called from origin - */ - function sendUnsignedTransactionToFork( - uint256 gasLimit, - uint256 maxFeePerGas, - uint256 nonce, - address to, - uint256 value, - bytes calldata data - ) external returns (uint256); - - /** - * @notice Send a message to initiate L2 withdrawal - * @dev This method can only be called upon L1 fork and will not alias the caller - * This method will revert if not called from origin - */ - function sendWithdrawEthToFork( - uint256 gasLimit, - uint256 maxFeePerGas, - uint256 nonce, - uint256 value, - address withdrawTo - ) external returns (uint256); - - /** - * @notice Deposit eth from L1 to L2 to address of the sender if sender is an EOA, and to its aliased address if the sender is a contract - * @dev This does not trigger the fallback function when receiving in the L2 side. - * Look into retryable tickets if you are interested in this functionality. - * @dev This function should not be called inside contract constructors - */ - function depositEth() external payable returns (uint256); - - /** - * @notice Put a message in the L2 inbox that can be reexecuted for some fixed amount of time if it reverts - * @dev all msg.value will deposited to callValueRefundAddress on L2 - * @dev Gas limit and maxFeePerGas should not be set to 1 as that is used to trigger the RetryableData error - * @param to destination L2 contract address - * @param l2CallValue call value for retryable L2 message - * @param maxSubmissionCost Max gas deducted from user's L2 balance to cover base submission fee - * @param excessFeeRefundAddress gasLimit x maxFeePerGas - execution cost gets credited here on L2 balance - * @param callValueRefundAddress l2Callvalue gets credited here on L2 if retryable txn times out or gets cancelled - * @param gasLimit Max gas deducted from user's L2 balance to cover L2 execution. Should not be set to 1 (magic value used to trigger the RetryableData error) - * @param maxFeePerGas price bid for L2 execution. Should not be set to 1 (magic value used to trigger the RetryableData error) - * @param data ABI encoded data of L2 message - * @return unique message number of the retryable transaction - */ - function createRetryableTicket( - address to, - uint256 l2CallValue, - uint256 maxSubmissionCost, - address excessFeeRefundAddress, - address callValueRefundAddress, - uint256 gasLimit, - uint256 maxFeePerGas, - bytes calldata data - ) external payable returns (uint256); - - /** - * @notice Put a message in the L2 inbox that can be reexecuted for some fixed amount of time if it reverts - * @dev Same as createRetryableTicket, but does not guarantee that submission will succeed by requiring the needed funds - * come from the deposit alone, rather than falling back on the user's L2 balance - * @dev Advanced usage only (does not rewrite aliases for excessFeeRefundAddress and callValueRefundAddress). - * createRetryableTicket method is the recommended standard. - * @dev Gas limit and maxFeePerGas should not be set to 1 as that is used to trigger the RetryableData error - * @param to destination L2 contract address - * @param l2CallValue call value for retryable L2 message - * @param maxSubmissionCost Max gas deducted from user's L2 balance to cover base submission fee - * @param excessFeeRefundAddress gasLimit x maxFeePerGas - execution cost gets credited here on L2 balance - * @param callValueRefundAddress l2Callvalue gets credited here on L2 if retryable txn times out or gets cancelled - * @param gasLimit Max gas deducted from user's L2 balance to cover L2 execution. Should not be set to 1 (magic value used to trigger the RetryableData error) - * @param maxFeePerGas price bid for L2 execution. Should not be set to 1 (magic value used to trigger the RetryableData error) - * @param data ABI encoded data of L2 message - * @return unique message number of the retryable transaction - */ - function unsafeCreateRetryableTicket( - address to, - uint256 l2CallValue, - uint256 maxSubmissionCost, - address excessFeeRefundAddress, - address callValueRefundAddress, - uint256 gasLimit, - uint256 maxFeePerGas, - bytes calldata data - ) external payable returns (uint256); - - // ---------- initializer ---------- - - /** - * @dev function to be called one time during the inbox upgrade process - * this is used to fix the storage slots - */ - function postUpgradeInit(IBridge _bridge) external; -} diff --git a/src/bridge/IInbox.sol b/src/bridge/IInbox.sol index 2fc7df68..2c7672d7 100644 --- a/src/bridge/IInbox.sol +++ b/src/bridge/IInbox.sol @@ -1,34 +1,46 @@ // Copyright 2021-2022, Offchain Labs, Inc. -// For license information, see https://github.com/OffchainLabs/nitro-contracts/blob/main/LICENSE +// For license information, see https://github.com/nitro/blob/master/LICENSE // SPDX-License-Identifier: BUSL-1.1 // solhint-disable-next-line compiler-version pragma solidity >=0.6.9 <0.9.0; import "./IBridge.sol"; -import "./IDelayedMessageProvider.sol"; -import "./ISequencerInbox.sol"; +import "./IInboxBase.sol"; -interface IInbox is IDelayedMessageProvider { - function bridge() external view returns (IBridge); +interface IInbox is IInboxBase { + function sendL1FundedUnsignedTransaction( + uint256 gasLimit, + uint256 maxFeePerGas, + uint256 nonce, + address to, + bytes calldata data + ) external payable returns (uint256); - function sequencerInbox() external view returns (ISequencerInbox); + function sendL1FundedContractTransaction( + uint256 gasLimit, + uint256 maxFeePerGas, + address to, + bytes calldata data + ) external payable returns (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 + * @dev This method can only be called upon L1 fork and will not alias the caller + * This method will revert if not called from origin */ - function sendL2MessageFromOrigin(bytes calldata messageData) external returns (uint256); + function sendL1FundedUnsignedTransactionToFork( + uint256 gasLimit, + uint256 maxFeePerGas, + uint256 nonce, + address to, + bytes calldata data + ) external payable returns (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 + * @dev This method can only be called upon L1 fork and will not alias the caller + * This method will revert if not called from origin */ - function sendL2Message(bytes calldata messageData) external returns (uint256); - - function sendUnsignedTransaction( + function sendUnsignedTransactionToFork( uint256 gasLimit, uint256 maxFeePerGas, uint256 nonce, @@ -37,47 +49,85 @@ interface IInbox is IDelayedMessageProvider { bytes calldata data ) external returns (uint256); - function sendContractTransaction( + /** + * @notice Send a message to initiate L2 withdrawal + * @dev This method can only be called upon L1 fork and will not alias the caller + * This method will revert if not called from origin + */ + function sendWithdrawEthToFork( uint256 gasLimit, uint256 maxFeePerGas, - address to, + uint256 nonce, uint256 value, - bytes calldata data + address withdrawTo ) external returns (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 + * @notice Deposit eth from L1 to L2 to address of the sender if sender is an EOA, and to its aliased address if the sender is a contract + * @dev This does not trigger the fallback function when receiving in the L2 side. + * Look into retryable tickets if you are interested in this functionality. + * @dev This function should not be called inside contract constructors */ - function calculateRetryableSubmissionFee(uint256 dataLength, uint256 baseFee) - external - view - returns (uint256); + function depositEth() external payable returns (uint256); - // ---------- onlyRollupOrOwner functions ---------- - - /// @notice pauses all inbox functionality - function pause() external; - - /// @notice unpauses all inbox functionality - function unpause() external; - - /// @notice add or remove users from allowList - function setAllowList(address[] memory user, bool[] memory val) external; - - /// @notice enable or disable allowList - function setAllowListEnabled(bool _allowListEnabled) external; - - /// @notice check if user is in allowList - function isAllowed(address user) external view returns (bool); + /** + * @notice Put a message in the L2 inbox that can be reexecuted for some fixed amount of time if it reverts + * @dev all msg.value will deposited to callValueRefundAddress on L2 + * @dev Gas limit and maxFeePerGas should not be set to 1 as that is used to trigger the RetryableData error + * @param to destination L2 contract address + * @param l2CallValue call value for retryable L2 message + * @param maxSubmissionCost Max gas deducted from user's L2 balance to cover base submission fee + * @param excessFeeRefundAddress gasLimit x maxFeePerGas - execution cost gets credited here on L2 balance + * @param callValueRefundAddress l2Callvalue gets credited here on L2 if retryable txn times out or gets cancelled + * @param gasLimit Max gas deducted from user's L2 balance to cover L2 execution. Should not be set to 1 (magic value used to trigger the RetryableData error) + * @param maxFeePerGas price bid for L2 execution. Should not be set to 1 (magic value used to trigger the RetryableData error) + * @param data ABI encoded data of L2 message + * @return unique message number of the retryable transaction + */ + function createRetryableTicket( + address to, + uint256 l2CallValue, + uint256 maxSubmissionCost, + address excessFeeRefundAddress, + address callValueRefundAddress, + uint256 gasLimit, + uint256 maxFeePerGas, + bytes calldata data + ) external payable returns (uint256); - /// @notice check if allowList is enabled - function allowListEnabled() external view returns (bool); + /** + * @notice Put a message in the L2 inbox that can be reexecuted for some fixed amount of time if it reverts + * @dev Same as createRetryableTicket, but does not guarantee that submission will succeed by requiring the needed funds + * come from the deposit alone, rather than falling back on the user's L2 balance + * @dev Advanced usage only (does not rewrite aliases for excessFeeRefundAddress and callValueRefundAddress). + * createRetryableTicket method is the recommended standard. + * @dev Gas limit and maxFeePerGas should not be set to 1 as that is used to trigger the RetryableData error + * @param to destination L2 contract address + * @param l2CallValue call value for retryable L2 message + * @param maxSubmissionCost Max gas deducted from user's L2 balance to cover base submission fee + * @param excessFeeRefundAddress gasLimit x maxFeePerGas - execution cost gets credited here on L2 balance + * @param callValueRefundAddress l2Callvalue gets credited here on L2 if retryable txn times out or gets cancelled + * @param gasLimit Max gas deducted from user's L2 balance to cover L2 execution. Should not be set to 1 (magic value used to trigger the RetryableData error) + * @param maxFeePerGas price bid for L2 execution. Should not be set to 1 (magic value used to trigger the RetryableData error) + * @param data ABI encoded data of L2 message + * @return unique message number of the retryable transaction + */ + function unsafeCreateRetryableTicket( + address to, + uint256 l2CallValue, + uint256 maxSubmissionCost, + address excessFeeRefundAddress, + address callValueRefundAddress, + uint256 gasLimit, + uint256 maxFeePerGas, + bytes calldata data + ) external payable returns (uint256); // ---------- initializer ---------- - function initialize(IBridge _bridge, ISequencerInbox _sequencerInbox) external; + /** + * @dev function to be called one time during the inbox upgrade process + * this is used to fix the storage slots + */ + function postUpgradeInit(IBridge _bridge) external; } diff --git a/src/bridge/IInboxBase.sol b/src/bridge/IInboxBase.sol new file mode 100644 index 00000000..0b4c40c8 --- /dev/null +++ b/src/bridge/IInboxBase.sol @@ -0,0 +1,83 @@ +// 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-version +pragma solidity >=0.6.9 <0.9.0; + +import "./IBridge.sol"; +import "./IDelayedMessageProvider.sol"; +import "./ISequencerInbox.sol"; + +interface IInboxBase is IDelayedMessageProvider { + function bridge() external view returns (IBridge); + + function sequencerInbox() external view returns (ISequencerInbox); + + /** + * @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 + */ + function sendL2MessageFromOrigin(bytes calldata messageData) external returns (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 + */ + function sendL2Message(bytes calldata messageData) external returns (uint256); + + function sendUnsignedTransaction( + uint256 gasLimit, + uint256 maxFeePerGas, + uint256 nonce, + address to, + uint256 value, + bytes calldata data + ) external returns (uint256); + + function sendContractTransaction( + uint256 gasLimit, + uint256 maxFeePerGas, + address to, + uint256 value, + bytes calldata data + ) external returns (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 + */ + function calculateRetryableSubmissionFee(uint256 dataLength, uint256 baseFee) + external + view + returns (uint256); + + // ---------- onlyRollupOrOwner functions ---------- + + /// @notice pauses all inbox functionality + function pause() external; + + /// @notice unpauses all inbox functionality + function unpause() external; + + /// @notice add or remove users from allowList + function setAllowList(address[] memory user, bool[] memory val) external; + + /// @notice enable or disable allowList + function setAllowListEnabled(bool _allowListEnabled) external; + + /// @notice check if user is in allowList + function isAllowed(address user) external view returns (bool); + + /// @notice check if allowList is enabled + function allowListEnabled() external view returns (bool); + + + + function initialize(IBridge _bridge, ISequencerInbox _sequencerInbox) external; +} diff --git a/src/bridge/Inbox.sol b/src/bridge/Inbox.sol index 847d109e..88e5b41b 100644 --- a/src/bridge/Inbox.sol +++ b/src/bridge/Inbox.sol @@ -15,7 +15,7 @@ import { GasLimitTooLarge } from "../libraries/Error.sol"; import "./AbsInbox.sol"; -import "./IEthInbox.sol"; +import "./IInbox.sol"; import "./IBridge.sol"; import "./IEthBridge.sol"; import "../libraries/AddressAliasHelper.sol"; @@ -37,8 +37,8 @@ import "@openzeppelin/contracts-upgradeable/utils/AddressUpgradeable.sol"; * @notice Messages created via this inbox are enqueued in the delayed accumulator * to await inclusion in the SequencerInbox */ -contract Inbox is AbsInbox, IEthInbox { - /// @inheritdoc IInbox +contract Inbox is AbsInbox, IInbox { + /// @inheritdoc IInboxBase function initialize(IBridge _bridge, ISequencerInbox _sequencerInbox) external initializer @@ -47,10 +47,10 @@ contract Inbox is AbsInbox, IEthInbox { __AbsInbox_init(_bridge, _sequencerInbox); } - /// @inheritdoc IEthInbox + /// @inheritdoc IInbox function postUpgradeInit(IBridge) external onlyDelegated onlyProxyOwner {} - /// @inheritdoc IEthInbox + /// @inheritdoc IInbox function sendL1FundedUnsignedTransaction( uint256 gasLimit, uint256 maxFeePerGas, @@ -79,7 +79,7 @@ contract Inbox is AbsInbox, IEthInbox { ); } - /// @inheritdoc IEthInbox + /// @inheritdoc IInbox function sendL1FundedContractTransaction( uint256 gasLimit, uint256 maxFeePerGas, @@ -106,7 +106,7 @@ contract Inbox is AbsInbox, IEthInbox { ); } - /// @inheritdoc IEthInbox + /// @inheritdoc IInbox function sendL1FundedUnsignedTransactionToFork( uint256 gasLimit, uint256 maxFeePerGas, @@ -139,7 +139,7 @@ contract Inbox is AbsInbox, IEthInbox { ); } - /// @inheritdoc IEthInbox + /// @inheritdoc IInbox function sendUnsignedTransactionToFork( uint256 gasLimit, uint256 maxFeePerGas, @@ -173,7 +173,7 @@ contract Inbox is AbsInbox, IEthInbox { ); } - /// @inheritdoc IEthInbox + /// @inheritdoc IInbox function sendWithdrawEthToFork( uint256 gasLimit, uint256 maxFeePerGas, @@ -206,7 +206,7 @@ contract Inbox is AbsInbox, IEthInbox { ); } - /// @inheritdoc IEthInbox + /// @inheritdoc IInbox function depositEth() public payable whenNotPaused onlyAllowed returns (uint256) { address dest = msg.sender; @@ -268,7 +268,7 @@ contract Inbox is AbsInbox, IEthInbox { ); } - /// @inheritdoc IEthInbox + /// @inheritdoc IInbox function createRetryableTicket( address to, uint256 l2CallValue, @@ -293,7 +293,7 @@ contract Inbox is AbsInbox, IEthInbox { ); } - /// @inheritdoc IEthInbox + /// @inheritdoc IInbox function unsafeCreateRetryableTicket( address to, uint256 l2CallValue, @@ -318,11 +318,11 @@ contract Inbox is AbsInbox, IEthInbox { ); } - /// @inheritdoc IInbox + /// @inheritdoc IInboxBase function calculateRetryableSubmissionFee(uint256 dataLength, uint256 baseFee) public view - override(AbsInbox, IInbox) + override(AbsInbox, IInboxBase) returns (uint256) { // Use current block basefee if baseFee parameter is 0 diff --git a/src/bridge/SequencerInbox.sol b/src/bridge/SequencerInbox.sol index 2ba25c16..1b2fb464 100644 --- a/src/bridge/SequencerInbox.sol +++ b/src/bridge/SequencerInbox.sol @@ -23,7 +23,7 @@ import { NotForked } from "../libraries/Error.sol"; import "./IBridge.sol"; -import "./IInbox.sol"; +import "./IInboxBase.sol"; import "./ISequencerInbox.sol"; import "../rollup/IRollupLogic.sol"; import "./Messages.sol"; diff --git a/src/mocks/InboxStub.sol b/src/mocks/InboxStub.sol index 3c4776d0..f526c01d 100644 --- a/src/mocks/InboxStub.sol +++ b/src/mocks/InboxStub.sol @@ -4,8 +4,8 @@ pragma solidity ^0.8.0; +import "../bridge/IInboxBase.sol"; import "../bridge/IInbox.sol"; -import "../bridge/IEthInbox.sol"; import "../bridge/IBridge.sol"; import "../bridge/IEthBridge.sol"; @@ -19,7 +19,7 @@ import { L2MessageType_unsignedContractTx } from "../libraries/MessageTypes.sol"; -contract InboxStub is IInbox, IEthInbox { +contract InboxStub is IInboxBase, IInbox { IBridge public override bridge; ISequencerInbox public override sequencerInbox; diff --git a/src/rollup/AbsBridgeCreator.sol b/src/rollup/AbsBridgeCreator.sol index 4379c50a..8093d725 100644 --- a/src/rollup/AbsBridgeCreator.sol +++ b/src/rollup/AbsBridgeCreator.sol @@ -6,7 +6,7 @@ pragma solidity ^0.8.0; import "../bridge/IBridge.sol"; import "../bridge/SequencerInbox.sol"; -import "../bridge/IInbox.sol"; +import "../bridge/IInboxBase.sol"; import "../bridge/Outbox.sol"; import "../rollup/IBridgeCreator.sol"; import "./IRollupEventInbox.sol"; @@ -16,7 +16,7 @@ import "@openzeppelin/contracts/proxy/transparent/ProxyAdmin.sol"; abstract contract AbsBridgeCreator is Ownable, IBridgeCreator { IBridge public bridgeTemplate; SequencerInbox public sequencerInboxTemplate; - IInbox public inboxTemplate; + IInboxBase public inboxTemplate; IRollupEventInbox public rollupEventInboxTemplate; Outbox public outboxTemplate; @@ -36,7 +36,7 @@ abstract contract AbsBridgeCreator is Ownable, IBridgeCreator { ) external onlyOwner { bridgeTemplate = IBridge(_bridgeTemplate); sequencerInboxTemplate = SequencerInbox(_sequencerInboxTemplate); - inboxTemplate = IInbox(_inboxTemplate); + inboxTemplate = IInboxBase(_inboxTemplate); rollupEventInboxTemplate = IRollupEventInbox(_rollupEventInboxTemplate); outboxTemplate = Outbox(_outboxTemplate); @@ -47,7 +47,7 @@ abstract contract AbsBridgeCreator is Ownable, IBridgeCreator { ProxyAdmin admin; IBridge bridge; SequencerInbox sequencerInbox; - IInbox inbox; + IInboxBase inbox; IRollupEventInbox rollupEventInbox; Outbox outbox; } @@ -62,7 +62,7 @@ abstract contract AbsBridgeCreator is Ownable, IBridgeCreator { returns ( IBridge, SequencerInbox, - IInbox, + IInboxBase, IRollupEventInbox, Outbox ) @@ -77,7 +77,7 @@ abstract contract AbsBridgeCreator is Ownable, IBridgeCreator { new TransparentUpgradeableProxy(address(sequencerInboxTemplate), adminProxy, "") ) ); - frame.inbox = IInbox( + frame.inbox = IInboxBase( address(new TransparentUpgradeableProxy(address(inboxTemplate), adminProxy, "")) ); frame.rollupEventInbox = IRollupEventInbox( diff --git a/src/rollup/BridgeCreator.sol b/src/rollup/BridgeCreator.sol index 38947e74..a7d982ff 100644 --- a/src/rollup/BridgeCreator.sol +++ b/src/rollup/BridgeCreator.sol @@ -26,7 +26,7 @@ contract BridgeCreator is AbsBridgeCreator, IEthBridgeCreator { returns ( IBridge, SequencerInbox, - IInbox, + IInboxBase, IRollupEventInbox, Outbox ) diff --git a/src/rollup/Config.sol b/src/rollup/Config.sol index 269ecb5a..13ca82e2 100644 --- a/src/rollup/Config.sol +++ b/src/rollup/Config.sol @@ -9,7 +9,7 @@ import "../state/Machine.sol"; import "../bridge/ISequencerInbox.sol"; import "../bridge/IBridge.sol"; import "../bridge/IOutbox.sol"; -import "../bridge/IInbox.sol"; +import "../bridge/IInboxBase.sol"; import "./IRollupEventInbox.sol"; import "./IRollupLogic.sol"; import "../challenge/IChallengeManager.sol"; @@ -31,7 +31,7 @@ struct Config { struct ContractDependencies { IBridge bridge; ISequencerInbox sequencerInbox; - IInbox inbox; + IInboxBase inbox; IOutbox outbox; IRollupEventInbox rollupEventInbox; IChallengeManager challengeManager; diff --git a/src/rollup/ERC20BridgeCreator.sol b/src/rollup/ERC20BridgeCreator.sol index 5d83e0b3..5c597c63 100644 --- a/src/rollup/ERC20BridgeCreator.sol +++ b/src/rollup/ERC20BridgeCreator.sol @@ -30,7 +30,7 @@ contract ERC20BridgeCreator is AbsBridgeCreator, IERC20BridgeCreator { returns ( IBridge, SequencerInbox, - IInbox, + IInboxBase, IRollupEventInbox, Outbox ) diff --git a/src/rollup/IBridgeCreator.sol b/src/rollup/IBridgeCreator.sol index f03e2a0e..fac167f1 100644 --- a/src/rollup/IBridgeCreator.sol +++ b/src/rollup/IBridgeCreator.sol @@ -23,7 +23,7 @@ interface IBridgeCreator { function sequencerInboxTemplate() external view returns (SequencerInbox); - function inboxTemplate() external view returns (IInbox); + function inboxTemplate() external view returns (IInboxBase); function rollupEventInboxTemplate() external view returns (IRollupEventInbox); @@ -40,7 +40,7 @@ interface IEthBridgeCreator is IBridgeCreator { returns ( IBridge, SequencerInbox, - IInbox, + IInboxBase, IRollupEventInbox, Outbox ); @@ -57,7 +57,7 @@ interface IERC20BridgeCreator is IBridgeCreator { returns ( IBridge, SequencerInbox, - IInbox, + IInboxBase, IRollupEventInbox, Outbox ); diff --git a/src/rollup/IRollupCore.sol b/src/rollup/IRollupCore.sol index e50f7a4a..341f723e 100644 --- a/src/rollup/IRollupCore.sol +++ b/src/rollup/IRollupCore.sol @@ -7,7 +7,7 @@ pragma solidity ^0.8.0; import "./Node.sol"; import "../bridge/IBridge.sol"; import "../bridge/IOutbox.sol"; -import "../bridge/IInbox.sol"; +import "../bridge/IInboxBase.sol"; import "./IRollupEventInbox.sol"; import "../challenge/IChallengeManager.sol"; diff --git a/src/rollup/RollupAdminLogic.sol b/src/rollup/RollupAdminLogic.sol index b6c3771f..f7f07b1f 100644 --- a/src/rollup/RollupAdminLogic.sol +++ b/src/rollup/RollupAdminLogic.sol @@ -336,7 +336,7 @@ contract RollupAdminLogic is RollupCore, IRollupAdmin, DoubleLogicUUPSUpgradeabl * @notice sets the rollup's inbox reference. Does not update the bridge's view. * @param newInbox new address of inbox */ - function setInbox(IInbox newInbox) external { + function setInbox(IInboxBase newInbox) external { inbox = newInbox; emit OwnerFunctionCalled(28); } diff --git a/src/rollup/RollupCore.sol b/src/rollup/RollupCore.sol index 1107f105..a62655ff 100644 --- a/src/rollup/RollupCore.sol +++ b/src/rollup/RollupCore.sol @@ -33,7 +33,7 @@ abstract contract RollupCore is IRollupCore, PausableUpgradeable { uint256 public baseStake; bytes32 public wasmModuleRoot; - IInbox public inbox; + IInboxBase public inbox; IBridge public bridge; IOutbox public outbox; ISequencerInbox public sequencerInbox; diff --git a/src/rollup/RollupCreator.sol b/src/rollup/RollupCreator.sol index 0d257703..d34a409f 100644 --- a/src/rollup/RollupCreator.sol +++ b/src/rollup/RollupCreator.sol @@ -41,7 +41,7 @@ contract RollupCreator is Ownable { struct BridgeContracts { IBridge bridge; ISequencerInbox sequencerInbox; - IInbox inbox; + IInboxBase inbox; IRollupEventInbox rollupEventInbox; IOutbox outbox; } diff --git a/src/rollup/RollupLib.sol b/src/rollup/RollupLib.sol index 82b9571d..f5da2312 100644 --- a/src/rollup/RollupLib.sol +++ b/src/rollup/RollupLib.sol @@ -11,7 +11,7 @@ import "../bridge/ISequencerInbox.sol"; import "../bridge/IBridge.sol"; import "../bridge/IOutbox.sol"; -import "../bridge/IInbox.sol"; +import "../bridge/IInboxBase.sol"; import "./Node.sol"; import "./IRollupEventInbox.sol"; diff --git a/src/test-helpers/InterfaceCompatibilityTester.sol b/src/test-helpers/InterfaceCompatibilityTester.sol index ba637705..4d3328fc 100644 --- a/src/test-helpers/InterfaceCompatibilityTester.sol +++ b/src/test-helpers/InterfaceCompatibilityTester.sol @@ -7,5 +7,5 @@ pragma solidity >=0.6.9 <0.9.0; import "../bridge/IBridge.sol"; import "../bridge/IOutbox.sol"; -import "../bridge/IInbox.sol"; +import "../bridge/IInboxBase.sol"; import "../bridge/ISequencerInbox.sol"; diff --git a/test/foundry/AbsInbox.t.sol b/test/foundry/AbsInbox.t.sol index 0854c0b1..c3465327 100644 --- a/test/foundry/AbsInbox.t.sol +++ b/test/foundry/AbsInbox.t.sol @@ -12,7 +12,7 @@ import "@openzeppelin/contracts/token/ERC20/presets/ERC20PresetFixedSupply.sol"; import "@openzeppelin/contracts-upgradeable/security/PausableUpgradeable.sol"; abstract contract AbsInboxTest is Test { - IInbox public inbox; + IInboxBase public inbox; IBridge public bridge; address public user = address(100); diff --git a/test/foundry/ERC20BridgeCreator.t.sol b/test/foundry/ERC20BridgeCreator.t.sol index 98c44083..5dfa2461 100644 --- a/test/foundry/ERC20BridgeCreator.t.sol +++ b/test/foundry/ERC20BridgeCreator.t.sol @@ -68,7 +68,7 @@ contract ERC20BridgeCreatorTest is Test { ( IBridge bridge, SequencerInbox seqInbox, - IInbox inbox, + IInboxBase inbox, IRollupEventInbox eventInbox, Outbox outbox ) = creator.createBridge(proxyAdmin, rollup, nativeToken, timeVars); diff --git a/test/foundry/ERC20Inbox.t.sol b/test/foundry/ERC20Inbox.t.sol index 98fd38a1..a528a6c6 100644 --- a/test/foundry/ERC20Inbox.t.sol +++ b/test/foundry/ERC20Inbox.t.sol @@ -18,7 +18,7 @@ contract ERC20InboxTest is AbsInboxTest { // deploy token, bridge and inbox nativeToken = new ERC20PresetMinterPauser("Appchain Token", "App"); bridge = IBridge(TestUtil.deployProxy(address(new ERC20Bridge()))); - inbox = IInbox(TestUtil.deployProxy(address(new ERC20Inbox()))); + inbox = IInboxBase(TestUtil.deployProxy(address(new ERC20Inbox()))); erc20Inbox = IERC20Inbox(address(inbox)); // init bridge and inbox diff --git a/test/foundry/Inbox.t.sol b/test/foundry/Inbox.t.sol index ef94f8ed..839538d0 100644 --- a/test/foundry/Inbox.t.sol +++ b/test/foundry/Inbox.t.sol @@ -4,19 +4,19 @@ pragma solidity ^0.8.4; import "./AbsInbox.t.sol"; import "./util/TestUtil.sol"; import "../../src/bridge/Inbox.sol"; -import "../../src/bridge/IEthInbox.sol"; +import "../../src/bridge/IInbox.sol"; import "../../src/bridge/Bridge.sol"; import "../../src/bridge/ISequencerInbox.sol"; import "../../src/libraries/AddressAliasHelper.sol"; contract InboxTest is AbsInboxTest { - IEthInbox public ethInbox; + IInbox public ethInbox; function setUp() public { // deploy token, bridge and inbox bridge = IBridge(TestUtil.deployProxy(address(new Bridge()))); - inbox = IInbox(TestUtil.deployProxy(address(new Inbox()))); - ethInbox = IEthInbox(address(inbox)); + inbox = IInboxBase(TestUtil.deployProxy(address(new Inbox()))); + ethInbox = IInbox(address(inbox)); // init bridge and inbox IEthBridge(address(bridge)).initialize(IOwnable(rollup)); diff --git a/test/storage/RollupAdminLogic.dot b/test/storage/RollupAdminLogic.dot index f998ff51..7dad73f2 100644 --- a/test/storage/RollupAdminLogic.dot +++ b/test/storage/RollupAdminLogic.dot @@ -4,7 +4,7 @@ rankdir=LR color=black arrowhead=open node [shape=record, style=filled, fillcolor=gray95 fontname="Courier New"] -8 [label="RollupAdminLogic \<\\>\n | {{ slot| 0 | 1-50 | 51 | 52-100 | 101 | 102 | 103 | 104 | 105 | 106 | 107 | 108 | 109 | 110 | 111 | 112 | 113 | 114 | 115 | 116 | 117 | 118 | 119 | 120 | 121 | 122 | 123 | 124 | 125 | 126 | 127 } | { type: \.variable (bytes) | { unallocated (30) | bool: Initializable._initializing (1) | bool: Initializable._initialized (1) } | { <53> uint256[50]: ContextUpgradeable.__gap (1600) } | { unallocated (31) | bool: PausableUpgradeable._paused (1) } | { <104> uint256[49]: PausableUpgradeable.__gap (1568) } | { unallocated (16) | uint64: RollupCore.extraChallengeTimeBlocks (8) | uint64: RollupCore.confirmPeriodBlocks (8) } | { uint256: RollupCore.chainId (32) } | { uint256: RollupCore.baseStake (32) } | { bytes32: RollupCore.wasmModuleRoot (32) } | { unallocated (12) | IInbox: RollupCore.inbox (20) } | { unallocated (12) | IBridge: RollupCore.bridge (20) } | { unallocated (12) | IOutbox: RollupCore.outbox (20) } | { unallocated (12) | ISequencerInbox: RollupCore.sequencerInbox (20) } | { unallocated (12) | IRollupEventInbox: RollupCore.rollupEventInbox (20) } | { unallocated (12) | IChallengeManager: RollupCore.challengeManager (20) } | { unallocated (12) | address: RollupCore.validatorUtils (20) } | { unallocated (12) | address: RollupCore.validatorWalletCreator (20) } | { unallocated (12) | address: RollupCore.loserStakeEscrow (20) } | { unallocated (12) | address: RollupCore.stakeToken (20) } | { uint256: RollupCore.minimumAssertionPeriod (32) } | { mapping\(address=\>bool\): RollupCore.isValidator (32) } | { uint64: RollupCore._lastStakeBlock (8) | uint64: RollupCore._latestNodeCreated (8) | uint64: RollupCore._firstUnresolvedNode (8) | uint64: RollupCore._latestConfirmed (8) } | { <138> mapping\(uint64=\>Node\): RollupCore._nodes (32) } | { mapping\(uint64=\>mapping\(address=\>bool\)\): RollupCore._nodeStakers (32) } | { <141> address[]: RollupCore._stakerList (32) } | { <147> mapping\(address=\>Staker\): RollupCore._stakerMap (32) } | { <151> Zombie[]: RollupCore._zombies (32) } | { mapping\(address=\>uint256\): RollupCore._withdrawableFunds (32) } | { uint256: RollupCore.totalWithdrawableFunds (32) } | { uint256: RollupCore.rollupDeploymentBlock (32) } | { unallocated (31) | bool: RollupCore.validatorWhitelistDisabled (1) } | { mapping\(uint64=\>uint256\): RollupCore._nodeCreatedAtArbSysBlock (32) }}}"] +8 [label="RollupAdminLogic \<\\>\n | {{ slot| 0 | 1-50 | 51 | 52-100 | 101 | 102 | 103 | 104 | 105 | 106 | 107 | 108 | 109 | 110 | 111 | 112 | 113 | 114 | 115 | 116 | 117 | 118 | 119 | 120 | 121 | 122 | 123 | 124 | 125 | 126 | 127 } | { type: \.variable (bytes) | { unallocated (30) | bool: Initializable._initializing (1) | bool: Initializable._initialized (1) } | { <53> uint256[50]: ContextUpgradeable.__gap (1600) } | { unallocated (31) | bool: PausableUpgradeable._paused (1) } | { <104> uint256[49]: PausableUpgradeable.__gap (1568) } | { unallocated (16) | uint64: RollupCore.extraChallengeTimeBlocks (8) | uint64: RollupCore.confirmPeriodBlocks (8) } | { uint256: RollupCore.chainId (32) } | { uint256: RollupCore.baseStake (32) } | { bytes32: RollupCore.wasmModuleRoot (32) } | { unallocated (12) | IInboxBase: RollupCore.inbox (20) } | { unallocated (12) | IBridge: RollupCore.bridge (20) } | { unallocated (12) | IOutbox: RollupCore.outbox (20) } | { unallocated (12) | ISequencerInbox: RollupCore.sequencerInbox (20) } | { unallocated (12) | IRollupEventInbox: RollupCore.rollupEventInbox (20) } | { unallocated (12) | IChallengeManager: RollupCore.challengeManager (20) } | { unallocated (12) | address: RollupCore.validatorUtils (20) } | { unallocated (12) | address: RollupCore.validatorWalletCreator (20) } | { unallocated (12) | address: RollupCore.loserStakeEscrow (20) } | { unallocated (12) | address: RollupCore.stakeToken (20) } | { uint256: RollupCore.minimumAssertionPeriod (32) } | { mapping\(address=\>bool\): RollupCore.isValidator (32) } | { uint64: RollupCore._lastStakeBlock (8) | uint64: RollupCore._latestNodeCreated (8) | uint64: RollupCore._firstUnresolvedNode (8) | uint64: RollupCore._latestConfirmed (8) } | { <138> mapping\(uint64=\>Node\): RollupCore._nodes (32) } | { mapping\(uint64=\>mapping\(address=\>bool\)\): RollupCore._nodeStakers (32) } | { <141> address[]: RollupCore._stakerList (32) } | { <147> mapping\(address=\>Staker\): RollupCore._stakerMap (32) } | { <151> Zombie[]: RollupCore._zombies (32) } | { mapping\(address=\>uint256\): RollupCore._withdrawableFunds (32) } | { uint256: RollupCore.totalWithdrawableFunds (32) } | { uint256: RollupCore.rollupDeploymentBlock (32) } | { unallocated (31) | bool: RollupCore.validatorWhitelistDisabled (1) } | { mapping\(uint64=\>uint256\): RollupCore._nodeCreatedAtArbSysBlock (32) }}}"] 1 [label="uint256[50]: __gap \<\\>\n | {{ slot| 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 } | { type: variable (bytes) | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) }}}"] diff --git a/test/storage/RollupCore.dot b/test/storage/RollupCore.dot index f97adc58..2307dcc5 100644 --- a/test/storage/RollupCore.dot +++ b/test/storage/RollupCore.dot @@ -4,7 +4,7 @@ rankdir=LR color=black arrowhead=open node [shape=record, style=filled, fillcolor=gray95 fontname="Courier New"] -8 [label="RollupCore \<\\>\n | {{ slot| 0 | 1-50 | 51 | 52-100 | 101 | 102 | 103 | 104 | 105 | 106 | 107 | 108 | 109 | 110 | 111 | 112 | 113 | 114 | 115 | 116 | 117 | 118 | 119 | 120 | 121 | 122 | 123 | 124 | 125 | 126 | 127 } | { type: \.variable (bytes) | { unallocated (30) | bool: Initializable._initializing (1) | bool: Initializable._initialized (1) } | { <53> uint256[50]: ContextUpgradeable.__gap (1600) } | { unallocated (31) | bool: PausableUpgradeable._paused (1) } | { <104> uint256[49]: PausableUpgradeable.__gap (1568) } | { unallocated (16) | uint64: extraChallengeTimeBlocks (8) | uint64: confirmPeriodBlocks (8) } | { uint256: chainId (32) } | { uint256: baseStake (32) } | { bytes32: wasmModuleRoot (32) } | { unallocated (12) | IInbox: inbox (20) } | { unallocated (12) | IBridge: bridge (20) } | { unallocated (12) | IOutbox: outbox (20) } | { unallocated (12) | ISequencerInbox: sequencerInbox (20) } | { unallocated (12) | IRollupEventInbox: rollupEventInbox (20) } | { unallocated (12) | IChallengeManager: challengeManager (20) } | { unallocated (12) | address: validatorUtils (20) } | { unallocated (12) | address: validatorWalletCreator (20) } | { unallocated (12) | address: loserStakeEscrow (20) } | { unallocated (12) | address: stakeToken (20) } | { uint256: minimumAssertionPeriod (32) } | { mapping\(address=\>bool\): isValidator (32) } | { uint64: _lastStakeBlock (8) | uint64: _latestNodeCreated (8) | uint64: _firstUnresolvedNode (8) | uint64: _latestConfirmed (8) } | { <138> mapping\(uint64=\>Node\): _nodes (32) } | { mapping\(uint64=\>mapping\(address=\>bool\)\): _nodeStakers (32) } | { <141> address[]: _stakerList (32) } | { <147> mapping\(address=\>Staker\): _stakerMap (32) } | { <151> Zombie[]: _zombies (32) } | { mapping\(address=\>uint256\): _withdrawableFunds (32) } | { uint256: totalWithdrawableFunds (32) } | { uint256: rollupDeploymentBlock (32) } | { unallocated (31) | bool: validatorWhitelistDisabled (1) } | { mapping\(uint64=\>uint256\): _nodeCreatedAtArbSysBlock (32) }}}"] +8 [label="RollupCore \<\\>\n | {{ slot| 0 | 1-50 | 51 | 52-100 | 101 | 102 | 103 | 104 | 105 | 106 | 107 | 108 | 109 | 110 | 111 | 112 | 113 | 114 | 115 | 116 | 117 | 118 | 119 | 120 | 121 | 122 | 123 | 124 | 125 | 126 | 127 } | { type: \.variable (bytes) | { unallocated (30) | bool: Initializable._initializing (1) | bool: Initializable._initialized (1) } | { <53> uint256[50]: ContextUpgradeable.__gap (1600) } | { unallocated (31) | bool: PausableUpgradeable._paused (1) } | { <104> uint256[49]: PausableUpgradeable.__gap (1568) } | { unallocated (16) | uint64: extraChallengeTimeBlocks (8) | uint64: confirmPeriodBlocks (8) } | { uint256: chainId (32) } | { uint256: baseStake (32) } | { bytes32: wasmModuleRoot (32) } | { unallocated (12) | IInboxBase: inbox (20) } | { unallocated (12) | IBridge: bridge (20) } | { unallocated (12) | IOutbox: outbox (20) } | { unallocated (12) | ISequencerInbox: sequencerInbox (20) } | { unallocated (12) | IRollupEventInbox: rollupEventInbox (20) } | { unallocated (12) | IChallengeManager: challengeManager (20) } | { unallocated (12) | address: validatorUtils (20) } | { unallocated (12) | address: validatorWalletCreator (20) } | { unallocated (12) | address: loserStakeEscrow (20) } | { unallocated (12) | address: stakeToken (20) } | { uint256: minimumAssertionPeriod (32) } | { mapping\(address=\>bool\): isValidator (32) } | { uint64: _lastStakeBlock (8) | uint64: _latestNodeCreated (8) | uint64: _firstUnresolvedNode (8) | uint64: _latestConfirmed (8) } | { <138> mapping\(uint64=\>Node\): _nodes (32) } | { mapping\(uint64=\>mapping\(address=\>bool\)\): _nodeStakers (32) } | { <141> address[]: _stakerList (32) } | { <147> mapping\(address=\>Staker\): _stakerMap (32) } | { <151> Zombie[]: _zombies (32) } | { mapping\(address=\>uint256\): _withdrawableFunds (32) } | { uint256: totalWithdrawableFunds (32) } | { uint256: rollupDeploymentBlock (32) } | { unallocated (31) | bool: validatorWhitelistDisabled (1) } | { mapping\(uint64=\>uint256\): _nodeCreatedAtArbSysBlock (32) }}}"] 1 [label="uint256[50]: __gap \<\\>\n | {{ slot| 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 } | { type: variable (bytes) | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) }}}"] diff --git a/test/storage/RollupUserLogic.dot b/test/storage/RollupUserLogic.dot index bed63789..bd7576a3 100644 --- a/test/storage/RollupUserLogic.dot +++ b/test/storage/RollupUserLogic.dot @@ -4,7 +4,7 @@ rankdir=LR color=black arrowhead=open node [shape=record, style=filled, fillcolor=gray95 fontname="Courier New"] -8 [label="RollupUserLogic \<\\>\n | {{ slot| 0 | 1-50 | 51 | 52-100 | 101 | 102 | 103 | 104 | 105 | 106 | 107 | 108 | 109 | 110 | 111 | 112 | 113 | 114 | 115 | 116 | 117 | 118 | 119 | 120 | 121 | 122 | 123 | 124 | 125 | 126 | 127 } | { type: \.variable (bytes) | { unallocated (30) | bool: Initializable._initializing (1) | bool: Initializable._initialized (1) } | { <53> uint256[50]: ContextUpgradeable.__gap (1600) } | { unallocated (31) | bool: PausableUpgradeable._paused (1) } | { <104> uint256[49]: PausableUpgradeable.__gap (1568) } | { unallocated (16) | uint64: RollupCore.extraChallengeTimeBlocks (8) | uint64: RollupCore.confirmPeriodBlocks (8) } | { uint256: RollupCore.chainId (32) } | { uint256: RollupCore.baseStake (32) } | { bytes32: RollupCore.wasmModuleRoot (32) } | { unallocated (12) | IInbox: RollupCore.inbox (20) } | { unallocated (12) | IBridge: RollupCore.bridge (20) } | { unallocated (12) | IOutbox: RollupCore.outbox (20) } | { unallocated (12) | ISequencerInbox: RollupCore.sequencerInbox (20) } | { unallocated (12) | IRollupEventInbox: RollupCore.rollupEventInbox (20) } | { unallocated (12) | IChallengeManager: RollupCore.challengeManager (20) } | { unallocated (12) | address: RollupCore.validatorUtils (20) } | { unallocated (12) | address: RollupCore.validatorWalletCreator (20) } | { unallocated (12) | address: RollupCore.loserStakeEscrow (20) } | { unallocated (12) | address: RollupCore.stakeToken (20) } | { uint256: RollupCore.minimumAssertionPeriod (32) } | { mapping\(address=\>bool\): RollupCore.isValidator (32) } | { uint64: RollupCore._lastStakeBlock (8) | uint64: RollupCore._latestNodeCreated (8) | uint64: RollupCore._firstUnresolvedNode (8) | uint64: RollupCore._latestConfirmed (8) } | { <138> mapping\(uint64=\>Node\): RollupCore._nodes (32) } | { mapping\(uint64=\>mapping\(address=\>bool\)\): RollupCore._nodeStakers (32) } | { <141> address[]: RollupCore._stakerList (32) } | { <147> mapping\(address=\>Staker\): RollupCore._stakerMap (32) } | { <151> Zombie[]: RollupCore._zombies (32) } | { mapping\(address=\>uint256\): RollupCore._withdrawableFunds (32) } | { uint256: RollupCore.totalWithdrawableFunds (32) } | { uint256: RollupCore.rollupDeploymentBlock (32) } | { unallocated (31) | bool: RollupCore.validatorWhitelistDisabled (1) } | { mapping\(uint64=\>uint256\): RollupCore._nodeCreatedAtArbSysBlock (32) }}}"] +8 [label="RollupUserLogic \<\\>\n | {{ slot| 0 | 1-50 | 51 | 52-100 | 101 | 102 | 103 | 104 | 105 | 106 | 107 | 108 | 109 | 110 | 111 | 112 | 113 | 114 | 115 | 116 | 117 | 118 | 119 | 120 | 121 | 122 | 123 | 124 | 125 | 126 | 127 } | { type: \.variable (bytes) | { unallocated (30) | bool: Initializable._initializing (1) | bool: Initializable._initialized (1) } | { <53> uint256[50]: ContextUpgradeable.__gap (1600) } | { unallocated (31) | bool: PausableUpgradeable._paused (1) } | { <104> uint256[49]: PausableUpgradeable.__gap (1568) } | { unallocated (16) | uint64: RollupCore.extraChallengeTimeBlocks (8) | uint64: RollupCore.confirmPeriodBlocks (8) } | { uint256: RollupCore.chainId (32) } | { uint256: RollupCore.baseStake (32) } | { bytes32: RollupCore.wasmModuleRoot (32) } | { unallocated (12) | IInboxBase: RollupCore.inbox (20) } | { unallocated (12) | IBridge: RollupCore.bridge (20) } | { unallocated (12) | IOutbox: RollupCore.outbox (20) } | { unallocated (12) | ISequencerInbox: RollupCore.sequencerInbox (20) } | { unallocated (12) | IRollupEventInbox: RollupCore.rollupEventInbox (20) } | { unallocated (12) | IChallengeManager: RollupCore.challengeManager (20) } | { unallocated (12) | address: RollupCore.validatorUtils (20) } | { unallocated (12) | address: RollupCore.validatorWalletCreator (20) } | { unallocated (12) | address: RollupCore.loserStakeEscrow (20) } | { unallocated (12) | address: RollupCore.stakeToken (20) } | { uint256: RollupCore.minimumAssertionPeriod (32) } | { mapping\(address=\>bool\): RollupCore.isValidator (32) } | { uint64: RollupCore._lastStakeBlock (8) | uint64: RollupCore._latestNodeCreated (8) | uint64: RollupCore._firstUnresolvedNode (8) | uint64: RollupCore._latestConfirmed (8) } | { <138> mapping\(uint64=\>Node\): RollupCore._nodes (32) } | { mapping\(uint64=\>mapping\(address=\>bool\)\): RollupCore._nodeStakers (32) } | { <141> address[]: RollupCore._stakerList (32) } | { <147> mapping\(address=\>Staker\): RollupCore._stakerMap (32) } | { <151> Zombie[]: RollupCore._zombies (32) } | { mapping\(address=\>uint256\): RollupCore._withdrawableFunds (32) } | { uint256: RollupCore.totalWithdrawableFunds (32) } | { uint256: RollupCore.rollupDeploymentBlock (32) } | { unallocated (31) | bool: RollupCore.validatorWhitelistDisabled (1) } | { mapping\(uint64=\>uint256\): RollupCore._nodeCreatedAtArbSysBlock (32) }}}"] 1 [label="uint256[50]: __gap \<\\>\n | {{ slot| 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 } | { type: variable (bytes) | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) }}}"] From a182f842f13f437040dcadfcb6741f20ea929272 Mon Sep 17 00:00:00 2001 From: Goran Vladika Date: Fri, 4 Aug 2023 12:28:01 +0200 Subject: [PATCH 032/292] Prettier --- src/bridge/IInboxBase.sol | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/bridge/IInboxBase.sol b/src/bridge/IInboxBase.sol index 0b4c40c8..6451375c 100644 --- a/src/bridge/IInboxBase.sol +++ b/src/bridge/IInboxBase.sol @@ -77,7 +77,5 @@ interface IInboxBase is IDelayedMessageProvider { /// @notice check if allowList is enabled function allowListEnabled() external view returns (bool); - - function initialize(IBridge _bridge, ISequencerInbox _sequencerInbox) external; } From 59e41f73b9c75e1d39df3ec1fe682570038d28fa Mon Sep 17 00:00:00 2001 From: Goran Vladika Date: Fri, 4 Aug 2023 12:45:33 +0200 Subject: [PATCH 033/292] Put getProxyAdmin to IInboxBase --- src/bridge/AbsInbox.sol | 2 +- src/bridge/IInbox.sol | 3 --- src/bridge/IInboxBase.sol | 3 +++ 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/bridge/AbsInbox.sol b/src/bridge/AbsInbox.sol index 45aede37..95e89130 100644 --- a/src/bridge/AbsInbox.sol +++ b/src/bridge/AbsInbox.sol @@ -212,7 +212,7 @@ abstract contract AbsInbox is DelegateCallAware, PausableUpgradeable, IInboxBase ); } - /// @inheritdoc IInbox + /// @inheritdoc IInboxBase function getProxyAdmin() external view returns (address) { return StorageSlotUpgradeable.getAddressSlot(_ADMIN_SLOT).value; } diff --git a/src/bridge/IInbox.sol b/src/bridge/IInbox.sol index fc861155..2c7672d7 100644 --- a/src/bridge/IInbox.sol +++ b/src/bridge/IInbox.sol @@ -123,9 +123,6 @@ interface IInbox is IInboxBase { bytes calldata data ) external payable returns (uint256); - /// @notice returns the current admin - function getProxyAdmin() external view returns (address); - // ---------- initializer ---------- /** diff --git a/src/bridge/IInboxBase.sol b/src/bridge/IInboxBase.sol index 6451375c..5e38b2be 100644 --- a/src/bridge/IInboxBase.sol +++ b/src/bridge/IInboxBase.sol @@ -78,4 +78,7 @@ interface IInboxBase is IDelayedMessageProvider { function allowListEnabled() external view returns (bool); function initialize(IBridge _bridge, ISequencerInbox _sequencerInbox) external; + + /// @notice returns the current admin + function getProxyAdmin() external view returns (address); } From 2032479c93c9e3bbf9cf2067e4c6e3d3ca5a788d Mon Sep 17 00:00:00 2001 From: Goran Vladika Date: Mon, 7 Aug 2023 09:28:58 +0200 Subject: [PATCH 034/292] Fix script --- scripts/deployment.ts | 3 +++ 1 file changed, 3 insertions(+) diff --git a/scripts/deployment.ts b/scripts/deployment.ts index 437500b5..0caa9941 100644 --- a/scripts/deployment.ts +++ b/scripts/deployment.ts @@ -75,6 +75,7 @@ async function deployAllContracts( const challengeManager = await deployContract('ChallengeManager', signer) const rollupAdmin = await deployContract('RollupAdminLogic', signer) const rollupUser = await deployContract('RollupUserLogic', signer) + const upgradeExecutor = await deployContract('UpgradeExecutor', signer) const validatorUtils = await deployContract('ValidatorUtils', signer) const validatorWalletCreator = await deployContract( 'ValidatorWalletCreator', @@ -92,6 +93,7 @@ async function deployAllContracts( challengeManager, rollupAdmin, rollupUser, + upgradeExecutor, validatorUtils, validatorWalletCreator, rollupCreator, @@ -114,6 +116,7 @@ async function main() { contracts.challengeManager.address, contracts.rollupAdmin.address, contracts.rollupUser.address, + contracts.upgradeExecutor.address, contracts.validatorUtils.address, contracts.validatorWalletCreator.address ) From 5d0dfce19660de728478b5a5e10f9c226034d46a Mon Sep 17 00:00:00 2001 From: Goran Vladika Date: Mon, 7 Aug 2023 12:05:20 +0200 Subject: [PATCH 035/292] Make L1 upgrade executor the rollup owner --- src/rollup/RollupCreator.sol | 7 +- test/contract/arbRollup.spec.ts | 157 ++++++++++++++++++++----------- test/foundry/RollupCreator.t.sol | 24 ++++- 3 files changed, 127 insertions(+), 61 deletions(-) diff --git a/src/rollup/RollupCreator.sol b/src/rollup/RollupCreator.sol index a5aa1dc9..b289fef6 100644 --- a/src/rollup/RollupCreator.sol +++ b/src/rollup/RollupCreator.sol @@ -24,6 +24,7 @@ contract RollupCreator is Ownable { address adminProxy, address sequencerInbox, address bridge, + address upgradeExecutor, address validatorUtils, address validatorWalletCreator ); @@ -161,8 +162,7 @@ contract RollupCreator is Ownable { proxyAdmin.transferOwnership(address(upgradeExecutor)); // initialize the rollup with this contract as owner to set batch poster and validators - // it will transfer the ownership back to the actual owner later - address actualOwner = config.owner; + // it will transfer the ownership to the upgrade executor later config.owner = address(this); rollup.initializeProxy( config, @@ -194,7 +194,7 @@ contract RollupCreator is Ownable { IRollupAdmin(address(rollup)).setValidator(_validators, _vals); } - IRollupAdmin(address(rollup)).setOwner(actualOwner); + IRollupAdmin(address(rollup)).setOwner(address(upgradeExecutor)); emit RollupCreated( address(rollup), @@ -206,6 +206,7 @@ contract RollupCreator is Ownable { address(proxyAdmin), address(bridgeContracts.sequencerInbox), address(bridgeContracts.bridge), + address(upgradeExecutor), address(validatorUtils), address(validatorWalletCreator) ); diff --git a/test/contract/arbRollup.spec.ts b/test/contract/arbRollup.spec.ts index 68ae8e1c..4a3a7bfe 100644 --- a/test/contract/arbRollup.spec.ts +++ b/test/contract/arbRollup.spec.ts @@ -15,7 +15,7 @@ */ /* eslint-env node, mocha */ -import { ethers, run } from 'hardhat' +import { ethers, network, run } from 'hardhat' import { Signer } from '@ethersproject/abstract-signer' import { BigNumberish, BigNumber } from '@ethersproject/bignumber' import { BytesLike } from '@ethersproject/bytes' @@ -79,6 +79,7 @@ let sequencerInbox: SequencerInbox let admin: Signer let sequencer: Signer let challengeManager: ChallengeManager +let upgradeExecutor: string async function getDefaultConfig( _confirmPeriodBlocks = confirmationPeriodBlocks @@ -239,6 +240,7 @@ const setup = async () => { delayedBridge: rollupCreatedEvent.bridge, delayedInbox: rollupCreatedEvent.inboxAddress, bridge: rollupCreatedEvent.bridge, + upgradeExecutorAddress: rollupCreatedEvent.upgradeExecutor, } } @@ -392,6 +394,21 @@ const getDoubleLogicUUPSTarget = async ( .toLowerCase()}` } +const impersonateAccount = (address: string) => + network.provider + .request({ + // Fund inboxMock to send transaction + method: 'hardhat_setBalance', + params: [address, '0xffffffffffffffffffff'], + }) + .then(() => + network.provider.request({ + method: 'hardhat_impersonateAccount', + params: [address], + }) + ) + .then(() => ethers.getSigner(address)) + describe('ArbRollup', () => { it('should deploy contracts', async function () { accounts = await initializeAccounts() @@ -405,28 +422,32 @@ describe('ArbRollup', () => { rollupUser: rollupUserContract, admin: adminI, validators: validatorsI, + upgradeExecutorAddress, } = await setup() rollupAdmin = rollupAdminContract rollupUser = rollupUserContract admin = adminI validators = validatorsI + upgradeExecutor = upgradeExecutorAddress rollup = new RollupContract(rollupUser.connect(validators[0])) }) it('should only initialize once', async function () { await expect( - rollupAdmin.initialize(await getDefaultConfig(), { - challengeManager: constants.AddressZero, - bridge: constants.AddressZero, - inbox: constants.AddressZero, - outbox: constants.AddressZero, - rollupAdminLogic: constants.AddressZero, - rollupEventInbox: constants.AddressZero, - rollupUserLogic: constants.AddressZero, - sequencerInbox: constants.AddressZero, - validatorUtils: constants.AddressZero, - validatorWalletCreator: constants.AddressZero, - }) + rollupAdmin + .connect(await impersonateAccount(upgradeExecutor)) + .initialize(await getDefaultConfig(), { + challengeManager: constants.AddressZero, + bridge: constants.AddressZero, + inbox: constants.AddressZero, + outbox: constants.AddressZero, + rollupAdminLogic: constants.AddressZero, + rollupEventInbox: constants.AddressZero, + rollupUserLogic: constants.AddressZero, + sequencerInbox: constants.AddressZero, + validatorUtils: constants.AddressZero, + validatorWalletCreator: constants.AddressZero, + }) ).to.be.revertedWith('Initializable: contract is already initialized') }) @@ -754,7 +775,7 @@ describe('ArbRollup', () => { const prevIsPaused = await rollup.rollup.paused() expect(prevIsPaused).to.equal(false) - await rollupAdmin.pause() + await rollupAdmin.connect(await impersonateAccount(upgradeExecutor)).pause() const postIsPaused = await rollup.rollup.paused() expect(postIsPaused).to.equal(true) @@ -765,7 +786,9 @@ describe('ArbRollup', () => { .addToDeposit(await validators[1].getAddress(), { value: 5 }) ).to.be.revertedWith('Pausable: paused') - await rollupAdmin.resume() + await rollupAdmin + .connect(await impersonateAccount(upgradeExecutor)) + .resume() }) it('should allow admin to alter rollup while paused', async function () { @@ -820,10 +843,12 @@ describe('ArbRollup', () => { ).to.eq(await validators[2].getAddress()) await expect( - rollupAdmin.forceResolveChallenge( - [await validators[0].getAddress()], - [await validators[2].getAddress()] - ), + rollupAdmin + .connect(await impersonateAccount(upgradeExecutor)) + .forceResolveChallenge( + [await validators[0].getAddress()], + [await validators[2].getAddress()] + ), 'force resolve' ).to.be.revertedWith('Pausable: not paused') @@ -837,12 +862,14 @@ describe('ArbRollup', () => { 'create challenge' ).to.be.revertedWith('IN_CHAL') - await rollupAdmin.pause() + await rollupAdmin.connect(await impersonateAccount(upgradeExecutor)).pause() - await rollupAdmin.forceResolveChallenge( - [await validators[0].getAddress()], - [await validators[2].getAddress()] - ) + await rollupAdmin + .connect(await impersonateAccount(upgradeExecutor)) + .forceResolveChallenge( + [await validators[0].getAddress()], + [await validators[2].getAddress()] + ) // challenge should have been destroyed expect( @@ -860,14 +887,16 @@ describe('ArbRollup', () => { expect(challengeA).to.equal(ZERO_ADDR) expect(challengeB).to.equal(ZERO_ADDR) - await rollupAdmin.forceRefundStaker([ - await validators[0].getAddress(), - await validators[2].getAddress(), - ]) + await rollupAdmin + .connect(await impersonateAccount(upgradeExecutor)) + .forceRefundStaker([ + await validators[0].getAddress(), + await validators[2].getAddress(), + ]) const adminAssertion = newRandomAssertion(prevNode.assertion.afterState) const { node: forceCreatedNode1 } = await forceCreateNode( - rollupAdmin, + rollupAdmin.connect(await impersonateAccount(upgradeExecutor)), sequencerInbox, prevNode, adminAssertion, @@ -886,7 +915,7 @@ describe('ArbRollup', () => { const adminAssertion2 = newRandomAssertion(prevNode.assertion.afterState) const { node: forceCreatedNode2 } = await forceCreateNode( - rollupAdmin, + rollupAdmin.connect(await impersonateAccount(upgradeExecutor)), sequencerInbox, prevNode, adminAssertion2, @@ -895,17 +924,21 @@ describe('ArbRollup', () => { const postLatestCreated = await rollup.rollup.latestNodeCreated() - await rollupAdmin.forceConfirmNode( - adminNodeNum, - adminAssertion.afterState.globalState.bytes32Vals[0], - adminAssertion.afterState.globalState.bytes32Vals[1] - ) + await rollupAdmin + .connect(await impersonateAccount(upgradeExecutor)) + .forceConfirmNode( + adminNodeNum, + adminAssertion.afterState.globalState.bytes32Vals[0], + adminAssertion.afterState.globalState.bytes32Vals[1] + ) const postLatestConfirmed = await rollup.rollup.latestConfirmed() expect(postLatestCreated).to.equal(adminNodeNum.add(1)) expect(postLatestConfirmed).to.equal(adminNodeNum) - await rollupAdmin.resume() + await rollupAdmin + .connect(await impersonateAccount(upgradeExecutor)) + .resume() // should create node after resuming @@ -946,11 +979,13 @@ describe('ArbRollup', () => { rollupUser: rollupUserContract, admin: adminI, validators: validatorsI, + upgradeExecutorAddress, } = await setup() rollupAdmin = rollupAdminContract rollupUser = rollupUserContract admin = adminI validators = validatorsI + upgradeExecutor = upgradeExecutorAddress rollup = new RollupContract(rollupUser.connect(validators[0])) }) @@ -1012,10 +1047,11 @@ describe('ArbRollup', () => { await expect(rollupAdmin.connect(user).upgradeTo(newAdminLogicImpl.address)) .to.be.reverted // upgrade as admin - await expect(rollupAdmin.upgradeTo(newAdminLogicImpl.address)).to.emit( - rollupAdmin, - 'Upgraded' - ) + await expect( + rollupAdmin + .connect(await impersonateAccount(upgradeExecutor)) + .upgradeTo(newAdminLogicImpl.address) + ).to.emit(rollupAdmin, 'Upgraded') // check the new implementation address is set const proxyPrimaryTarget = await getDoubleLogicUUPSTarget( @@ -1060,7 +1096,9 @@ describe('ArbRollup', () => { ).to.be.reverted // upgrade as admin await expect( - rollupAdmin.upgradeSecondaryTo(newUserLogicImpl.address) + rollupAdmin + .connect(await impersonateAccount(upgradeExecutor)) + .upgradeSecondaryTo(newUserLogicImpl.address) ).to.emit(rollupAdmin, 'UpgradedSecondary') // check the new implementation address is set @@ -1087,10 +1125,12 @@ describe('ArbRollup', () => { )) as RollupAdminLogic__factory const newAdminLogicImpl = await rollupAdminLogicFac.deploy() // first pause the contract so we can unpause after upgrade - await rollupAdmin.pause() + await rollupAdmin.connect(await impersonateAccount(upgradeExecutor)).pause() // 0x046f7da2 - resume() await expect( - rollupAdmin.upgradeToAndCall(newAdminLogicImpl.address, '0x046f7da2') + rollupAdmin + .connect(await impersonateAccount(upgradeExecutor)) + .upgradeToAndCall(newAdminLogicImpl.address, '0x046f7da2') ).to.emit(rollupAdmin, 'Unpaused') }) @@ -1101,14 +1141,15 @@ describe('ArbRollup', () => { const newUserLogicImpl = await rollupUserLogicFac.deploy() // this call should revert since the user logic don't have a fallback await expect( - rollupAdmin.upgradeSecondaryToAndCall(newUserLogicImpl.address, '0x') + rollupAdmin + .connect(await impersonateAccount(upgradeExecutor)) + .upgradeSecondaryToAndCall(newUserLogicImpl.address, '0x') ).to.revertedWith('Address: low-level delegate call failed') // 0x8da5cb5b - owner() (some random function that will not revert) await expect( - rollupAdmin.upgradeSecondaryToAndCall( - newUserLogicImpl.address, - '0x8da5cb5b' - ) + rollupAdmin + .connect(await impersonateAccount(upgradeExecutor)) + .upgradeSecondaryToAndCall(newUserLogicImpl.address, '0x8da5cb5b') ).to.emit(rollupAdmin, 'UpgradedSecondary') }) @@ -1118,7 +1159,9 @@ describe('ArbRollup', () => { )) as RollupUserLogic__factory const newUserLogicImpl = await rollupUserLogicFac.deploy() await expect( - rollupAdmin.upgradeTo(newUserLogicImpl.address) + rollupAdmin + .connect(await impersonateAccount(upgradeExecutor)) + .upgradeTo(newUserLogicImpl.address) ).to.revertedWith('ERC1967Upgrade: unsupported proxiableUUID') }) @@ -1128,19 +1171,25 @@ describe('ArbRollup', () => { )) as RollupAdminLogic__factory const newAdminLogicImpl = await rollupAdminLogicFac.deploy() await expect( - rollupAdmin.upgradeSecondaryTo(newAdminLogicImpl.address) + rollupAdmin + .connect(await impersonateAccount(upgradeExecutor)) + .upgradeSecondaryTo(newAdminLogicImpl.address) ).to.revertedWith('ERC1967Upgrade: unsupported secondary proxiableUUID') }) it('should fail upgrade to proxy primary logic', async function () { - await expect(rollupAdmin.upgradeTo(rollupAdmin.address)).to.revertedWith( - 'ERC1967Upgrade: new implementation is not UUPS' - ) + await expect( + rollupAdmin + .connect(await impersonateAccount(upgradeExecutor)) + .upgradeTo(rollupAdmin.address) + ).to.revertedWith('ERC1967Upgrade: new implementation is not UUPS') }) it('should fail upgrade to proxy secondary logic', async function () { await expect( - rollupAdmin.upgradeSecondaryTo(rollupAdmin.address) + rollupAdmin + .connect(await impersonateAccount(upgradeExecutor)) + .upgradeSecondaryTo(rollupAdmin.address) ).to.revertedWith( 'ERC1967Upgrade: new secondary implementation is not UUPS' ) diff --git a/test/foundry/RollupCreator.t.sol b/test/foundry/RollupCreator.t.sol index cf3560d9..b335d9ed 100644 --- a/test/foundry/RollupCreator.t.sol +++ b/test/foundry/RollupCreator.t.sol @@ -99,8 +99,6 @@ contract RollupCreatorTest is Test { assertEq(IOwnable(address(rollupCreator)).owner(), deployer, "Invalid rollupCreator owner"); /// rollup proxy - assertEq(IOwnable(rollupAddress).owner(), rollupOwner, "Invalid rollup owner"); - assertEq(_getProxyAdmin(rollupAddress), rollupOwner, "Invalid rollup's proxyAdmin owner"); assertEq(_getPrimary(rollupAddress), address(rollupAdmin), "Invalid proxy primary impl"); assertEq(_getSecondary(rollupAddress), address(rollupUser), "Invalid proxy secondary impl"); @@ -161,6 +159,16 @@ contract RollupCreatorTest is Test { "Invalid proxyAdmin's owner" ); + // upgrade executor owns rollup + assertEq( + IOwnable(rollupAddress).owner(), upgradeExecutorExpectedAddress, "Invalid rollup owner" + ); + assertEq( + _getProxyAdmin(rollupAddress), + upgradeExecutorExpectedAddress, + "Invalid rollup's proxyAdmin owner" + ); + // check rollupOwner has executor role UpgradeExecutor executor = UpgradeExecutor(upgradeExecutorExpectedAddress); assertTrue( @@ -206,8 +214,6 @@ contract RollupCreatorTest is Test { assertEq(IOwnable(address(rollupCreator)).owner(), deployer, "Invalid rollupCreator owner"); /// rollup proxy - assertEq(IOwnable(rollupAddress).owner(), rollupOwner, "Invalid rollup owner"); - assertEq(_getProxyAdmin(rollupAddress), rollupOwner, "Invalid rollup's proxyAdmin owner"); assertEq(_getPrimary(rollupAddress), address(rollupAdmin), "Invalid proxy primary impl"); assertEq(_getSecondary(rollupAddress), address(rollupUser), "Invalid proxy secondary impl"); @@ -273,6 +279,16 @@ contract RollupCreatorTest is Test { "Invalid proxyAdmin's owner" ); + // upgrade executor owns rollup + assertEq( + IOwnable(rollupAddress).owner(), upgradeExecutorExpectedAddress, "Invalid rollup owner" + ); + assertEq( + _getProxyAdmin(rollupAddress), + upgradeExecutorExpectedAddress, + "Invalid rollup's proxyAdmin owner" + ); + // check rollupOwner has executor role UpgradeExecutor executor = UpgradeExecutor(upgradeExecutorExpectedAddress); assertTrue( From 259901d927391dc535f31680ddacc4ff9d796473 Mon Sep 17 00:00:00 2001 From: Goran Vladika Date: Mon, 7 Aug 2023 12:24:00 +0200 Subject: [PATCH 036/292] Update remappings --- remappings.txt | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/remappings.txt b/remappings.txt index dd3f1ab0..f02afee2 100644 --- a/remappings.txt +++ b/remappings.txt @@ -1,4 +1,5 @@ ds-test/=lib/forge-std/lib/ds-test/src/ forge-std/=lib/forge-std/src/ -@openzeppelin/contracts/=node_modules/@openzeppelin/contracts/ \ No newline at end of file +@openzeppelin/contracts/=node_modules/@openzeppelin/contracts/ +@openzeppelin/contracts-upgradeable/=node_modules/@openzeppelin/contracts-upgradeable/ \ No newline at end of file From 95243613facb95b49c8a63d5b040e0a532b3d66a Mon Sep 17 00:00:00 2001 From: Goran Vladika Date: Mon, 7 Aug 2023 14:49:37 +0200 Subject: [PATCH 037/292] Check if provided fee token address is valid --- scripts/createERC20Rollup.ts | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/scripts/createERC20Rollup.ts b/scripts/createERC20Rollup.ts index 000e8d64..842eb014 100644 --- a/scripts/createERC20Rollup.ts +++ b/scripts/createERC20Rollup.ts @@ -26,6 +26,11 @@ async function main() { ) customFeeTokenAddress = await deployERC20Token(deployer) } + if (!ethers.utils.isAddress(customFeeTokenAddress)) { + throw new Error( + 'Fee token address ' + customFeeTokenAddress + ' is not a valid address!' + ) + } console.log('Creating new rollup with', customFeeTokenAddress, 'as fee token') await createRollup(customFeeTokenAddress) From d0f6957c964e93e8a476c5bdd04dff5f3103a514 Mon Sep 17 00:00:00 2001 From: Goran Vladika Date: Mon, 7 Aug 2023 14:56:16 +0200 Subject: [PATCH 038/292] Update remappings --- remappings.txt | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/remappings.txt b/remappings.txt index dd3f1ab0..f02afee2 100644 --- a/remappings.txt +++ b/remappings.txt @@ -1,4 +1,5 @@ ds-test/=lib/forge-std/lib/ds-test/src/ forge-std/=lib/forge-std/src/ -@openzeppelin/contracts/=node_modules/@openzeppelin/contracts/ \ No newline at end of file +@openzeppelin/contracts/=node_modules/@openzeppelin/contracts/ +@openzeppelin/contracts-upgradeable/=node_modules/@openzeppelin/contracts-upgradeable/ \ No newline at end of file From f7fa9e954eddb0e95a8959f24c09d2b79a80606d Mon Sep 17 00:00:00 2001 From: gzeon Date: Tue, 8 Aug 2023 14:16:16 +0100 Subject: [PATCH 039/292] chore: import upgrade-executor --- package.json | 1 + src/libraries/UpgradeExecutor.sol | 57 ------------------------------- src/rollup/RollupCreator.sol | 8 ++--- yarn.lock | 18 ++++++++++ 4 files changed, 23 insertions(+), 61 deletions(-) delete mode 100644 src/libraries/UpgradeExecutor.sol diff --git a/package.json b/package.json index f739b391..086824dc 100644 --- a/package.json +++ b/package.json @@ -35,6 +35,7 @@ "dependencies": { "@arbitrum/sdk": "^3.1.3", "@ethersproject/providers": "^5.7.2", + "@offchainlabs/upgrade-executor": "^1.0.0-beta.0", "@openzeppelin/contracts": "4.5.0", "@openzeppelin/contracts-upgradeable": "4.5.2", "dotenv": "^16.3.1", diff --git a/src/libraries/UpgradeExecutor.sol b/src/libraries/UpgradeExecutor.sol deleted file mode 100644 index ada8c6de..00000000 --- a/src/libraries/UpgradeExecutor.sol +++ /dev/null @@ -1,57 +0,0 @@ -// SPDX-License-Identifier: Apache-2.0 -pragma solidity ^0.8.4; - -import "@openzeppelin/contracts-upgradeable/access/AccessControlUpgradeable.sol"; -import "@openzeppelin/contracts/security/ReentrancyGuard.sol"; -import "@openzeppelin/contracts/utils/Address.sol"; - -/// @title A root contract from which it execute upgrades -/// @notice Does not contain upgrade logic itself, only the means to call upgrade contracts and execute them -/// @dev We use these upgrade contracts as they allow multiple actions to take place in an upgrade -/// and for these actions to interact. However because we are delegatecalling into these upgrade -/// contracts, it's important that these upgrade contract do not touch or modify contract state. -contract UpgradeExecutor is Initializable, AccessControlUpgradeable, ReentrancyGuard { - using Address for address; - - bytes32 public constant ADMIN_ROLE = keccak256("ADMIN_ROLE"); - bytes32 public constant EXECUTOR_ROLE = keccak256("EXECUTOR_ROLE"); - - /// @notice Emitted when an upgrade execution occurs - event UpgradeExecuted(address indexed upgrade, uint256 value, bytes data); - - /// @notice Initialise the upgrade executor - /// @param admin The admin who can update other roles, and itself - ADMIN_ROLE - /// @param executors Can call the execute function - EXECUTOR_ROLE - function initialize(address admin, address[] memory executors) public initializer { - require(admin != address(0), "UpgradeExecutor: zero admin"); - - __AccessControl_init(); - - _setRoleAdmin(ADMIN_ROLE, ADMIN_ROLE); - _setRoleAdmin(EXECUTOR_ROLE, ADMIN_ROLE); - - _setupRole(ADMIN_ROLE, admin); - for (uint256 i = 0; i < executors.length; ++i) { - _setupRole(EXECUTOR_ROLE, executors[i]); - } - } - - /// @notice Execute an upgrade by delegate calling an upgrade contract - /// @dev Only executor can call this. Since we're using a delegatecall here the Upgrade contract - /// will have access to the state of this contract - including the roles. Only upgrade contracts - /// that do not touch local state should be used. - function execute(address upgrade, bytes memory upgradeCallData) - public - payable - onlyRole(EXECUTOR_ROLE) - nonReentrant - { - // OZ Address library check if the address is a contract and bubble up inner revert reason - address(upgrade).functionDelegateCall( - upgradeCallData, - "UpgradeExecutor: inner delegate call failed without reason" - ); - - emit UpgradeExecuted(upgrade, msg.value, upgradeCallData); - } -} diff --git a/src/rollup/RollupCreator.sol b/src/rollup/RollupCreator.sol index b289fef6..a4e1aeea 100644 --- a/src/rollup/RollupCreator.sol +++ b/src/rollup/RollupCreator.sol @@ -8,7 +8,7 @@ import "./RollupProxy.sol"; import "./IRollupAdmin.sol"; import "./BridgeCreator.sol"; import "./ERC20BridgeCreator.sol"; -import "../libraries/UpgradeExecutor.sol"; +import "@offchainlabs/upgrade-executor/src/IUpgradeExecutor.sol"; import "@openzeppelin/contracts/proxy/transparent/ProxyAdmin.sol"; import "@openzeppelin/contracts/proxy/transparent/TransparentUpgradeableProxy.sol"; import "@openzeppelin/contracts/access/Ownable.sol"; @@ -36,7 +36,7 @@ contract RollupCreator is Ownable { IChallengeManager public challengeManagerTemplate; IRollupAdmin public rollupAdminLogic; IRollupUser public rollupUserLogic; - UpgradeExecutor public upgradeExecutorLogic; + IUpgradeExecutor public upgradeExecutorLogic; address public validatorUtils; address public validatorWalletCreator; @@ -58,7 +58,7 @@ contract RollupCreator is Ownable { IChallengeManager _challengeManagerLogic, IRollupAdmin _rollupAdminLogic, IRollupUser _rollupUserLogic, - UpgradeExecutor _upgradeExecutorLogic, + IUpgradeExecutor _upgradeExecutorLogic, address _validatorUtils, address _validatorWalletCreator ) external onlyOwner { @@ -97,7 +97,7 @@ contract RollupCreator is Ownable { ProxyAdmin proxyAdmin = new ProxyAdmin(); // deploy and init upgrade executor - UpgradeExecutor upgradeExecutor = UpgradeExecutor( + IUpgradeExecutor upgradeExecutor = IUpgradeExecutor( address( new TransparentUpgradeableProxy( address(upgradeExecutorLogic), diff --git a/yarn.lock b/yarn.lock index 6e0849cf..ef218942 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1202,16 +1202,34 @@ "@types/sinon-chai" "^3.2.3" "@types/web3" "1.0.19" +"@offchainlabs/upgrade-executor@^1.0.0-beta.0": + version "1.0.0-beta.0" + resolved "https://registry.yarnpkg.com/@offchainlabs/upgrade-executor/-/upgrade-executor-1.0.0-beta.0.tgz#dbf1eddbe157f44a79740fdb65446415fa260eac" + integrity sha512-WappuSR9sjGxBLIYPpMLIj3lcTe3GsO3NukBoMmO+xxcjFZ3zMmnt7PpNfbxAEyWDXEfqI5W5F32gcWAnF60zA== + dependencies: + "@openzeppelin/contracts" "4.7.3" + "@openzeppelin/contracts-upgradeable" "4.7.3" + "@openzeppelin/contracts-upgradeable@4.5.2": version "4.5.2" resolved "https://registry.yarnpkg.com/@openzeppelin/contracts-upgradeable/-/contracts-upgradeable-4.5.2.tgz#90d9e47bacfd8693bfad0ac8a394645575528d05" integrity sha512-xgWZYaPlrEOQo3cBj97Ufiuv79SPd8Brh4GcFYhPgb6WvAq4ppz8dWKL6h+jLAK01rUqMRp/TS9AdXgAeNvCLA== +"@openzeppelin/contracts-upgradeable@4.7.3": + version "4.7.3" + resolved "https://registry.yarnpkg.com/@openzeppelin/contracts-upgradeable/-/contracts-upgradeable-4.7.3.tgz#f1d606e2827d409053f3e908ba4eb8adb1dd6995" + integrity sha512-+wuegAMaLcZnLCJIvrVUDzA9z/Wp93f0Dla/4jJvIhijRrPabjQbZe6fWiECLaJyfn5ci9fqf9vTw3xpQOad2A== + "@openzeppelin/contracts@4.5.0": version "4.5.0" resolved "https://registry.yarnpkg.com/@openzeppelin/contracts/-/contracts-4.5.0.tgz#3fd75d57de172b3743cdfc1206883f56430409cc" integrity sha512-fdkzKPYMjrRiPK6K4y64e6GzULR7R7RwxSigHS8DDp7aWDeoReqsQI+cxHV1UuhAqX69L1lAaWDxenfP+xiqzA== +"@openzeppelin/contracts@4.7.3": + version "4.7.3" + resolved "https://registry.yarnpkg.com/@openzeppelin/contracts/-/contracts-4.7.3.tgz#939534757a81f8d69cc854c7692805684ff3111e" + integrity sha512-dGRS0agJzu8ybo44pCIf3xBaPQN/65AIXNgK8+4gzKd5kbvlqyxryUYVLJv7fK98Seyd2hDZzVEHSWAh0Bt1Yw== + "@resolver-engine/core@^0.3.3": version "0.3.3" resolved "https://registry.yarnpkg.com/@resolver-engine/core/-/core-0.3.3.tgz#590f77d85d45bc7ecc4e06c654f41345db6ca967" From ba6254f2e5f85d969be4010807d6f6355102261f Mon Sep 17 00:00:00 2001 From: gzeon Date: Tue, 8 Aug 2023 14:18:49 +0100 Subject: [PATCH 040/292] chore: use imported upgrade-executor factory --- test/contract/arbRollup.spec.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/contract/arbRollup.spec.ts b/test/contract/arbRollup.spec.ts index 4a3a7bfe..bb28c6e4 100644 --- a/test/contract/arbRollup.spec.ts +++ b/test/contract/arbRollup.spec.ts @@ -37,8 +37,8 @@ import { RollupUserLogic__factory, SequencerInbox, SequencerInbox__factory, - UpgradeExecutor__factory, } from '../../build/types' +import { UpgradeExecutor__factory } from '@offchainlabs/upgrade-executor/build/types/factories/src' import { initializeAccounts } from './utils' import { From d6cb232698074810b7a09c25525d0b7b2d20ca79 Mon Sep 17 00:00:00 2001 From: gzeon Date: Tue, 8 Aug 2023 21:47:49 +0100 Subject: [PATCH 041/292] chore: bump upgrade-executor --- package.json | 2 +- yarn.lock | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/package.json b/package.json index 086824dc..69203f96 100644 --- a/package.json +++ b/package.json @@ -35,7 +35,7 @@ "dependencies": { "@arbitrum/sdk": "^3.1.3", "@ethersproject/providers": "^5.7.2", - "@offchainlabs/upgrade-executor": "^1.0.0-beta.0", + "@offchainlabs/upgrade-executor": "^1.0.0-beta.2", "@openzeppelin/contracts": "4.5.0", "@openzeppelin/contracts-upgradeable": "4.5.2", "dotenv": "^16.3.1", diff --git a/yarn.lock b/yarn.lock index ef218942..92c25107 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1202,10 +1202,10 @@ "@types/sinon-chai" "^3.2.3" "@types/web3" "1.0.19" -"@offchainlabs/upgrade-executor@^1.0.0-beta.0": - version "1.0.0-beta.0" - resolved "https://registry.yarnpkg.com/@offchainlabs/upgrade-executor/-/upgrade-executor-1.0.0-beta.0.tgz#dbf1eddbe157f44a79740fdb65446415fa260eac" - integrity sha512-WappuSR9sjGxBLIYPpMLIj3lcTe3GsO3NukBoMmO+xxcjFZ3zMmnt7PpNfbxAEyWDXEfqI5W5F32gcWAnF60zA== +"@offchainlabs/upgrade-executor@^1.0.0-beta.2": + version "1.0.0-beta.2" + resolved "https://registry.yarnpkg.com/@offchainlabs/upgrade-executor/-/upgrade-executor-1.0.0-beta.2.tgz#b3f9e1ba2e58edf17019249b4663d88567961fec" + integrity sha512-aSjWctspD2QTGXUv0fRHudFrl5oR42nRB/88JUnC9O5tujPyRksM6Y8WyrDNl3eZuqV+L1V76Ui2Av4NrUkd+g== dependencies: "@openzeppelin/contracts" "4.7.3" "@openzeppelin/contracts-upgradeable" "4.7.3" From 18635bbd4267e7fea571e5ecd087e304bd1de413 Mon Sep 17 00:00:00 2001 From: gzeon Date: Tue, 8 Aug 2023 21:48:03 +0100 Subject: [PATCH 042/292] test: UpgradeExecutorMock --- src/mocks/UpgradeExecutorMock.sol | 61 +++++++++++++++++++++++++++++++ test/foundry/RollupCreator.t.sol | 12 +++--- 2 files changed, 68 insertions(+), 5 deletions(-) create mode 100644 src/mocks/UpgradeExecutorMock.sol diff --git a/src/mocks/UpgradeExecutorMock.sol b/src/mocks/UpgradeExecutorMock.sol new file mode 100644 index 00000000..822c364a --- /dev/null +++ b/src/mocks/UpgradeExecutorMock.sol @@ -0,0 +1,61 @@ +// SPDX-License-Identifier: Apache-2.0 +pragma solidity ^0.8.0; + +import "@openzeppelin/contracts-upgradeable/access/AccessControlUpgradeable.sol"; +import "@openzeppelin/contracts/security/ReentrancyGuard.sol"; +import "@openzeppelin/contracts/utils/Address.sol"; + +import "@offchainlabs/upgrade-executor/src/IUpgradeExecutor.sol"; + +contract UpgradeExecutorMock is + Initializable, + AccessControlUpgradeable, + ReentrancyGuard, + IUpgradeExecutor +{ + using Address for address; + + bytes32 public constant ADMIN_ROLE = keccak256("ADMIN_ROLE"); + bytes32 public constant EXECUTOR_ROLE = keccak256("EXECUTOR_ROLE"); + + /// @notice Emitted when an upgrade execution occurs + event UpgradeExecuted(address indexed upgrade, uint256 value, bytes data); + + constructor() initializer { + } + + /// @notice Initialise the upgrade executor + /// @param admin The admin who can update other roles, and itself - ADMIN_ROLE + /// @param executors Can call the execute function - EXECUTOR_ROLE + function initialize(address admin, address[] memory executors) public initializer { + require(admin != address(0), "UpgradeExecutor: zero admin"); + + __AccessControl_init(); + + _setRoleAdmin(ADMIN_ROLE, ADMIN_ROLE); + _setRoleAdmin(EXECUTOR_ROLE, ADMIN_ROLE); + + _setupRole(ADMIN_ROLE, admin); + for (uint256 i = 0; i < executors.length; ++i) { + _setupRole(EXECUTOR_ROLE, executors[i]); + } + } + + /// @notice Execute an upgrade by delegate calling an upgrade contract + /// @dev Only executor can call this. Since we're using a delegatecall here the Upgrade contract + /// will have access to the state of this contract - including the roles. Only upgrade contracts + /// that do not touch local state should be used. + function execute(address upgrade, bytes memory upgradeCallData) + public + payable + onlyRole(EXECUTOR_ROLE) + nonReentrant + { + // OZ Address library check if the address is a contract and bubble up inner revert reason + address(upgrade).functionDelegateCall( + upgradeCallData, "UpgradeExecutor: inner delegate call failed without reason" + ); + + emit UpgradeExecuted(upgrade, msg.value, upgradeCallData); + } +} diff --git a/test/foundry/RollupCreator.t.sol b/test/foundry/RollupCreator.t.sol index b335d9ed..9c89b084 100644 --- a/test/foundry/RollupCreator.t.sol +++ b/test/foundry/RollupCreator.t.sol @@ -14,8 +14,10 @@ import "../../src/osp/OneStepProverMemory.sol"; import "../../src/osp/OneStepProverMath.sol"; import "../../src/osp/OneStepProverHostIo.sol"; import "../../src/osp/OneStepProofEntry.sol"; +import "../../src/mocks/UpgradeExecutorMock.sol"; import "@openzeppelin/contracts/access/Ownable.sol"; +import "@openzeppelin/contracts-upgradeable/access/AccessControlUpgradeable.sol"; contract RollupCreatorTest is Test { RollupCreator public rollupCreator; @@ -35,7 +37,7 @@ contract RollupCreatorTest is Test { BridgeCreator ethBridgeCreator = new BridgeCreator(); ERC20BridgeCreator erc20BridgeCreator = new ERC20BridgeCreator(); - UpgradeExecutor upgradeExecutorLogic = new UpgradeExecutor(); + IUpgradeExecutor upgradeExecutorLogic = new UpgradeExecutorMock(); ( IOneStepProofEntry ospEntry, @@ -170,7 +172,7 @@ contract RollupCreatorTest is Test { ); // check rollupOwner has executor role - UpgradeExecutor executor = UpgradeExecutor(upgradeExecutorExpectedAddress); + AccessControlUpgradeable executor = AccessControlUpgradeable(upgradeExecutorExpectedAddress); assertTrue( executor.hasRole(keccak256("EXECUTOR_ROLE"), rollupOwner), "Invalid executor role" ); @@ -290,7 +292,7 @@ contract RollupCreatorTest is Test { ); // check rollupOwner has executor role - UpgradeExecutor executor = UpgradeExecutor(upgradeExecutorExpectedAddress); + AccessControlUpgradeable executor = AccessControlUpgradeable(upgradeExecutorExpectedAddress); assertTrue( executor.hasRole(keccak256("EXECUTOR_ROLE"), rollupOwner), "Invalid executor role" ); @@ -330,8 +332,8 @@ contract RollupCreatorTest is Test { RollupCore rollup = RollupCore(rollupAddress); address inbox = address(rollup.inbox()); address proxyAdmin = computeCreateAddress(address(rollupCreator), 1); - UpgradeExecutor upgradeExecutor = - UpgradeExecutor(computeCreateAddress(address(rollupCreator), 2)); + IUpgradeExecutor upgradeExecutor = + IUpgradeExecutor(computeCreateAddress(address(rollupCreator), 2)); Dummy newLogicImpl = new Dummy(); bytes memory data = abi.encodeWithSelector( From ca401d12769fe5a18e87ebe5d0c2f3b403be0c0e Mon Sep 17 00:00:00 2001 From: gzeon Date: Tue, 8 Aug 2023 21:48:28 +0100 Subject: [PATCH 043/292] test: use imported bytecode and abi to deploy --- test/contract/arbRollup.spec.ts | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/test/contract/arbRollup.spec.ts b/test/contract/arbRollup.spec.ts index bb28c6e4..71b722ae 100644 --- a/test/contract/arbRollup.spec.ts +++ b/test/contract/arbRollup.spec.ts @@ -38,7 +38,11 @@ import { SequencerInbox, SequencerInbox__factory, } from '../../build/types' -import { UpgradeExecutor__factory } from '@offchainlabs/upgrade-executor/build/types/factories/src' +import { + abi as UpgradeExecutorABI, + bytecode as UpgradeExecutorBytecode, +} from '@offchainlabs/upgrade-executor/build/contracts/src/UpgradeExecutor.sol/UpgradeExecutor.json' + import { initializeAccounts } from './utils' import { @@ -159,8 +163,8 @@ const setup = async () => { const rollupUserLogicTemplate = await rollupUserLogicFac.deploy() const upgradeExecutorLogicFac = (await ethers.getContractFactory( - 'UpgradeExecutor' - )) as UpgradeExecutor__factory + UpgradeExecutorABI, UpgradeExecutorBytecode) + ) const upgradeExecutorLogic = await upgradeExecutorLogicFac.deploy() const ethBridgeCreatorFac = (await ethers.getContractFactory( From c09490ff5e2e773e220758a6fd34002260083602 Mon Sep 17 00:00:00 2001 From: gzeon Date: Tue, 8 Aug 2023 21:59:15 +0100 Subject: [PATCH 044/292] format: prettierignore --- .prettierignore | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.prettierignore b/.prettierignore index 44285698..725aff4a 100644 --- a/.prettierignore +++ b/.prettierignore @@ -5,3 +5,5 @@ coverage/** deployments/** src/lib/abi/** .nyc_output +out/** +lib/** \ No newline at end of file From 570e8180ade4e89b9a2e369afe4fa61f09d35fb6 Mon Sep 17 00:00:00 2001 From: gzeon Date: Tue, 8 Aug 2023 21:59:21 +0100 Subject: [PATCH 045/292] format: fix --- src/mocks/UpgradeExecutorMock.sol | 6 +- test/contract/arbRollup.spec.ts | 5 +- test/foundry/RollupCreator.t.sol | 100 ++++++++++++++++++++++-------- 3 files changed, 79 insertions(+), 32 deletions(-) diff --git a/src/mocks/UpgradeExecutorMock.sol b/src/mocks/UpgradeExecutorMock.sol index 822c364a..c036aaf0 100644 --- a/src/mocks/UpgradeExecutorMock.sol +++ b/src/mocks/UpgradeExecutorMock.sol @@ -21,8 +21,7 @@ contract UpgradeExecutorMock is /// @notice Emitted when an upgrade execution occurs event UpgradeExecuted(address indexed upgrade, uint256 value, bytes data); - constructor() initializer { - } + constructor() initializer {} /// @notice Initialise the upgrade executor /// @param admin The admin who can update other roles, and itself - ADMIN_ROLE @@ -53,7 +52,8 @@ contract UpgradeExecutorMock is { // OZ Address library check if the address is a contract and bubble up inner revert reason address(upgrade).functionDelegateCall( - upgradeCallData, "UpgradeExecutor: inner delegate call failed without reason" + upgradeCallData, + "UpgradeExecutor: inner delegate call failed without reason" ); emit UpgradeExecuted(upgrade, msg.value, upgradeCallData); diff --git a/test/contract/arbRollup.spec.ts b/test/contract/arbRollup.spec.ts index 71b722ae..070dac27 100644 --- a/test/contract/arbRollup.spec.ts +++ b/test/contract/arbRollup.spec.ts @@ -162,8 +162,9 @@ const setup = async () => { )) as RollupUserLogic__factory const rollupUserLogicTemplate = await rollupUserLogicFac.deploy() - const upgradeExecutorLogicFac = (await ethers.getContractFactory( - UpgradeExecutorABI, UpgradeExecutorBytecode) + const upgradeExecutorLogicFac = await ethers.getContractFactory( + UpgradeExecutorABI, + UpgradeExecutorBytecode ) const upgradeExecutorLogic = await upgradeExecutorLogicFac.deploy() diff --git a/test/foundry/RollupCreator.t.sol b/test/foundry/RollupCreator.t.sol index 9c89b084..1afca66d 100644 --- a/test/foundry/RollupCreator.t.sol +++ b/test/foundry/RollupCreator.t.sol @@ -69,8 +69,12 @@ contract RollupCreatorTest is Test { vm.startPrank(deployer); // deployment params - ISequencerInbox.MaxTimeVariation memory timeVars = - ISequencerInbox.MaxTimeVariation(((60 * 60 * 24) / 15), 12, 60 * 60 * 24, 60 * 60); + ISequencerInbox.MaxTimeVariation memory timeVars = ISequencerInbox.MaxTimeVariation( + ((60 * 60 * 24) / 15), + 12, + 60 * 60 * 24, + 60 * 60 + ); Config memory config = Config({ confirmPeriodBlocks: 20, extraChallengeTimeBlocks: 200, @@ -90,8 +94,12 @@ contract RollupCreatorTest is Test { address[] memory validators = new address[](2); validators[0] = makeAddr("validator1"); validators[1] = makeAddr("validator2"); - address rollupAddress = - rollupCreator.createRollup(config, batchPoster, validators, address(0)); + address rollupAddress = rollupCreator.createRollup( + config, + batchPoster, + validators, + address(0) + ); vm.stopPrank(); @@ -163,7 +171,9 @@ contract RollupCreatorTest is Test { // upgrade executor owns rollup assertEq( - IOwnable(rollupAddress).owner(), upgradeExecutorExpectedAddress, "Invalid rollup owner" + IOwnable(rollupAddress).owner(), + upgradeExecutorExpectedAddress, + "Invalid rollup owner" ); assertEq( _getProxyAdmin(rollupAddress), @@ -172,20 +182,28 @@ contract RollupCreatorTest is Test { ); // check rollupOwner has executor role - AccessControlUpgradeable executor = AccessControlUpgradeable(upgradeExecutorExpectedAddress); + AccessControlUpgradeable executor = AccessControlUpgradeable( + upgradeExecutorExpectedAddress + ); assertTrue( - executor.hasRole(keccak256("EXECUTOR_ROLE"), rollupOwner), "Invalid executor role" + executor.hasRole(keccak256("EXECUTOR_ROLE"), rollupOwner), + "Invalid executor role" ); } function test_createErc20Rollup() public { vm.startPrank(deployer); - address nativeToken = - address(new ERC20PresetFixedSupply("Appchain Token", "App", 1_000_000, address(this))); + address nativeToken = address( + new ERC20PresetFixedSupply("Appchain Token", "App", 1_000_000, address(this)) + ); // deployment params - ISequencerInbox.MaxTimeVariation memory timeVars = - ISequencerInbox.MaxTimeVariation(((60 * 60 * 24) / 15), 12, 60 * 60 * 24, 60 * 60); + ISequencerInbox.MaxTimeVariation memory timeVars = ISequencerInbox.MaxTimeVariation( + ((60 * 60 * 24) / 15), + 12, + 60 * 60 * 24, + 60 * 60 + ); Config memory config = Config({ confirmPeriodBlocks: 20, extraChallengeTimeBlocks: 200, @@ -205,8 +223,12 @@ contract RollupCreatorTest is Test { address[] memory validators = new address[](2); validators[0] = makeAddr("validator1"); validators[1] = makeAddr("validator2"); - address rollupAddress = - rollupCreator.createRollup(config, batchPoster, validators, nativeToken); + address rollupAddress = rollupCreator.createRollup( + config, + batchPoster, + validators, + nativeToken + ); vm.stopPrank(); @@ -236,7 +258,9 @@ contract RollupCreatorTest is Test { // native token check IBridge bridge = RollupCore(address(rollupAddress)).bridge(); assertEq( - IERC20Bridge(address(bridge)).nativeToken(), nativeToken, "Invalid native token ref" + IERC20Bridge(address(bridge)).nativeToken(), + nativeToken, + "Invalid native token ref" ); // check proxy admin for non-rollup contracts @@ -283,7 +307,9 @@ contract RollupCreatorTest is Test { // upgrade executor owns rollup assertEq( - IOwnable(rollupAddress).owner(), upgradeExecutorExpectedAddress, "Invalid rollup owner" + IOwnable(rollupAddress).owner(), + upgradeExecutorExpectedAddress, + "Invalid rollup owner" ); assertEq( _getProxyAdmin(rollupAddress), @@ -292,9 +318,12 @@ contract RollupCreatorTest is Test { ); // check rollupOwner has executor role - AccessControlUpgradeable executor = AccessControlUpgradeable(upgradeExecutorExpectedAddress); + AccessControlUpgradeable executor = AccessControlUpgradeable( + upgradeExecutorExpectedAddress + ); assertTrue( - executor.hasRole(keccak256("EXECUTOR_ROLE"), rollupOwner), "Invalid executor role" + executor.hasRole(keccak256("EXECUTOR_ROLE"), rollupOwner), + "Invalid executor role" ); } @@ -302,8 +331,12 @@ contract RollupCreatorTest is Test { vm.startPrank(deployer); // deployment params - ISequencerInbox.MaxTimeVariation memory timeVars = - ISequencerInbox.MaxTimeVariation(((60 * 60 * 24) / 15), 12, 60 * 60 * 24, 60 * 60); + ISequencerInbox.MaxTimeVariation memory timeVars = ISequencerInbox.MaxTimeVariation( + ((60 * 60 * 24) / 15), + 12, + 60 * 60 * 24, + 60 * 60 + ); Config memory config = Config({ confirmPeriodBlocks: 20, extraChallengeTimeBlocks: 200, @@ -323,8 +356,12 @@ contract RollupCreatorTest is Test { address[] memory validators = new address[](2); validators[0] = makeAddr("validator1"); validators[1] = makeAddr("validator2"); - address rollupAddress = - rollupCreator.createRollup(config, batchPoster, validators, address(0)); + address rollupAddress = rollupCreator.createRollup( + config, + batchPoster, + validators, + address(0) + ); vm.stopPrank(); @@ -332,12 +369,16 @@ contract RollupCreatorTest is Test { RollupCore rollup = RollupCore(rollupAddress); address inbox = address(rollup.inbox()); address proxyAdmin = computeCreateAddress(address(rollupCreator), 1); - IUpgradeExecutor upgradeExecutor = - IUpgradeExecutor(computeCreateAddress(address(rollupCreator), 2)); + IUpgradeExecutor upgradeExecutor = IUpgradeExecutor( + computeCreateAddress(address(rollupCreator), 2) + ); Dummy newLogicImpl = new Dummy(); bytes memory data = abi.encodeWithSelector( - ProxyUpgradeAction.perform.selector, address(proxyAdmin), inbox, address(newLogicImpl) + ProxyUpgradeAction.perform.selector, + address(proxyAdmin), + inbox, + address(newLogicImpl) ); address upgradeAction = address(new ProxyUpgradeAction()); @@ -389,14 +430,19 @@ contract RollupCreatorTest is Test { } function _getSecondary(address proxy) internal view returns (address) { - bytes32 secondarySlot = - bytes32(uint256(keccak256("eip1967.proxy.implementation.secondary")) - 1); + bytes32 secondarySlot = bytes32( + uint256(keccak256("eip1967.proxy.implementation.secondary")) - 1 + ); return address(uint160(uint256(vm.load(proxy, secondarySlot)))); } } contract ProxyUpgradeAction { - function perform(address admin, address payable target, address newLogic) public payable { + function perform( + address admin, + address payable target, + address newLogic + ) public payable { ProxyAdmin(admin).upgrade(TransparentUpgradeableProxy(target), newLogic); } } From 26e728ec552cd883490f396b452ac28d1d2cc9d2 Mon Sep 17 00:00:00 2001 From: gzeon Date: Mon, 14 Aug 2023 21:58:53 +0800 Subject: [PATCH 046/292] chore: move some to devDependencies --- package.json | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/package.json b/package.json index f739b391..427f9dd8 100644 --- a/package.json +++ b/package.json @@ -10,7 +10,8 @@ }, "files": [ "src/", - "build/types" + "build/types", + "build/contracts" ], "bugs": { "url": "https://github.com/offchainlabs/nitro-contracts/issues" @@ -33,15 +34,14 @@ "deploy-erc20-rollup": "hardhat run scripts/createERC20Rollup.ts" }, "dependencies": { - "@arbitrum/sdk": "^3.1.3", - "@ethersproject/providers": "^5.7.2", "@openzeppelin/contracts": "4.5.0", "@openzeppelin/contracts-upgradeable": "4.5.2", - "dotenv": "^16.3.1", "patch-package": "^6.4.7" }, "private": false, "devDependencies": { + "@arbitrum/sdk": "^3.1.3", + "@ethersproject/providers": "^5.7.2", "@nomiclabs/hardhat-ethers": "npm:hardhat-deploy-ethers@^0.3.0-beta.13", "@nomiclabs/hardhat-etherscan": "^3.1.0", "@nomiclabs/hardhat-waffle": "^2.0.1", @@ -54,6 +54,7 @@ "@typescript-eslint/eslint-plugin-tslint": "^5.27.1", "@typescript-eslint/parser": "^5.14.0", "chai": "^4.3.4", + "dotenv": "^16.3.1", "eslint": "^8.23.1", "eslint-config-prettier": "^8.3.0", "eslint-plugin-mocha": "^9.0.0", From 8d0bacb9abb6d936388921300e6c4fdd4f8a60d6 Mon Sep 17 00:00:00 2001 From: gzeon Date: Mon, 14 Aug 2023 22:00:15 +0800 Subject: [PATCH 047/292] v1.1.0-alpha.4 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 427f9dd8..337a7883 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@arbitrum/nitro-contracts", - "version": "1.1.0-alpha.3", + "version": "1.1.0-alpha.4", "description": "Layer 2 precompiles and rollup for Arbitrum Nitro", "author": "Offchain Labs, Inc.", "license": "BUSL-1.1", From 32227a5e44623db988350e5ecc70942900b895e2 Mon Sep 17 00:00:00 2001 From: gzeon Date: Mon, 14 Aug 2023 22:27:38 +0800 Subject: [PATCH 048/292] chore: ignore build/contracts/build-info --- .gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitignore b/.gitignore index b42d2ab9..30d66a10 100644 --- a/.gitignore +++ b/.gitignore @@ -1,4 +1,5 @@ build/ +build/contracts/build-info cache/ node_modules/ deployments/ From d60e737220abe7b7c22e3509e676eddf9da5c6cd Mon Sep 17 00:00:00 2001 From: gzeon Date: Mon, 14 Aug 2023 22:34:10 +0800 Subject: [PATCH 049/292] v1.1.0-alpha.5 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 337a7883..f2115d27 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@arbitrum/nitro-contracts", - "version": "1.1.0-alpha.4", + "version": "1.1.0-alpha.5", "description": "Layer 2 precompiles and rollup for Arbitrum Nitro", "author": "Offchain Labs, Inc.", "license": "BUSL-1.1", From dde017c204f9316de58896809cdb0b7d01787ea0 Mon Sep 17 00:00:00 2001 From: gzeon Date: Mon, 14 Aug 2023 22:57:05 +0800 Subject: [PATCH 050/292] chore: explictly release contract builds --- .gitignore | 1 - package.json | 3 ++- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.gitignore b/.gitignore index 30d66a10..b42d2ab9 100644 --- a/.gitignore +++ b/.gitignore @@ -1,5 +1,4 @@ build/ -build/contracts/build-info cache/ node_modules/ deployments/ diff --git a/package.json b/package.json index f2115d27..8ca977ee 100644 --- a/package.json +++ b/package.json @@ -11,7 +11,8 @@ "files": [ "src/", "build/types", - "build/contracts" + "build/contracts/@openzeppelin", + "build/contracts/src" ], "bugs": { "url": "https://github.com/offchainlabs/nitro-contracts/issues" From cc66bb5c705ea5c62375afda176126d897f60231 Mon Sep 17 00:00:00 2001 From: gzeon Date: Mon, 14 Aug 2023 22:58:19 +0800 Subject: [PATCH 051/292] v1.1.0-alpha.7 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 8ca977ee..62dc3915 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@arbitrum/nitro-contracts", - "version": "1.1.0-alpha.5", + "version": "1.1.0-alpha.7", "description": "Layer 2 precompiles and rollup for Arbitrum Nitro", "author": "Offchain Labs, Inc.", "license": "BUSL-1.1", From 33dd360abf85b0ef8491d595cf9a28ee7ca37b8d Mon Sep 17 00:00:00 2001 From: Lee Bousfield Date: Wed, 16 Aug 2023 15:21:49 -0600 Subject: [PATCH 052/292] Add sha256 preimage support --- src/osp/OneStepProverHostIo.sol | 30 +++++++++++++++++++++++++----- 1 file changed, 25 insertions(+), 5 deletions(-) diff --git a/src/osp/OneStepProverHostIo.sol b/src/osp/OneStepProverHostIo.sol index 260ab206..0206572f 100644 --- a/src/osp/OneStepProverHostIo.sol +++ b/src/osp/OneStepProverHostIo.sol @@ -105,7 +105,7 @@ contract OneStepProverHostIo is IOneStepProver { ExecutionContext calldata, Machine memory mach, Module memory mod, - Instruction calldata, + Instruction calldata inst, bytes calldata proof ) internal pure { uint256 preimageOffset = mach.valueStack.pop().assumeI32(); @@ -128,9 +128,30 @@ contract OneStepProverHostIo is IOneStepProver { bytes memory extracted; uint8 proofType = uint8(proof[proofOffset]); proofOffset++; - if (proofType == 0) { + // These values must be kept in sync with `arbitrator/arbutil/src/types.rs` + // and `arbutil/preimage_type.go` (both in the nitro repo). + if (inst.argumentData == 0) { + // The machine is asking for a keccak256 preimage + + if (proofType == 0) { + bytes calldata preimage = proof[proofOffset:]; + require(keccak256(preimage) == leafContents, "BAD_PREIMAGE"); + + uint256 preimageEnd = preimageOffset + 32; + if (preimageEnd > preimage.length) { + preimageEnd = preimage.length; + } + extracted = preimage[preimageOffset:preimageEnd]; + } else { + // TODO: support proving via an authenticated contract + revert("UNKNOWN_PREIMAGE_PROOF"); + } + } else if (inst.argumentData == 1) { + // The machine is asking for a sha2-256 preimage + + require(proofType == 0, "UNKNOWN_PREIMAGE_PROOF"); bytes calldata preimage = proof[proofOffset:]; - require(keccak256(preimage) == leafContents, "BAD_PREIMAGE"); + require(sha256(preimage) == leafContents, "BAD_PREIMAGE"); uint256 preimageEnd = preimageOffset + 32; if (preimageEnd > preimage.length) { @@ -138,8 +159,7 @@ contract OneStepProverHostIo is IOneStepProver { } extracted = preimage[preimageOffset:preimageEnd]; } else { - // TODO: support proving via an authenticated contract - revert("UNKNOWN_PREIMAGE_PROOF"); + revert("UNKNOWN_PREIMAGE_TYPE"); } for (uint256 i = 0; i < extracted.length; i++) { From fdcc259edc87a5143d359231d780d4970329c249 Mon Sep 17 00:00:00 2001 From: Goran Vladika Date: Mon, 21 Aug 2023 15:01:28 +0200 Subject: [PATCH 053/292] Add back missing packages --- package.json | 3 +++ 1 file changed, 3 insertions(+) diff --git a/package.json b/package.json index 62dc3915..eb973360 100644 --- a/package.json +++ b/package.json @@ -35,6 +35,9 @@ "deploy-erc20-rollup": "hardhat run scripts/createERC20Rollup.ts" }, "dependencies": { + "@arbitrum/sdk": "^3.1.3", + "@ethersproject/providers": "^5.7.2", + "@offchainlabs/upgrade-executor": "^1.0.0-beta.2", "@openzeppelin/contracts": "4.5.0", "@openzeppelin/contracts-upgradeable": "4.5.2", "patch-package": "^6.4.7" From 5e0e4f1e819e1ec7c0f1bae581a39915e03748bf Mon Sep 17 00:00:00 2001 From: Goran Vladika Date: Fri, 25 Aug 2023 13:11:53 +0200 Subject: [PATCH 054/292] Use single contract for BridgeCreator 'createBridge' entrypoint receives nativeToken param. Depending if it address(0) or not it will create ETH-based/ERC20-based bridge --- scripts/deployment.ts | 3 - src/rollup/AbsBridgeCreator.sol | 117 -------------- src/rollup/BridgeCreator.sol | 204 ++++++++++++++++++++++-- src/rollup/ERC20BridgeCreator.sol | 48 ------ src/rollup/RollupCreator.sol | 50 ++---- test/contract/arbRollup.spec.ts | 12 +- test/foundry/BridgeCreator.t.sol | 213 ++++++++++++++++++++++++++ test/foundry/ERC20BridgeCreator.t.sol | 113 -------------- test/foundry/RollupCreator.t.sol | 68 +++----- 9 files changed, 441 insertions(+), 387 deletions(-) delete mode 100644 src/rollup/AbsBridgeCreator.sol delete mode 100644 src/rollup/ERC20BridgeCreator.sol create mode 100644 test/foundry/BridgeCreator.t.sol delete mode 100644 test/foundry/ERC20BridgeCreator.t.sol diff --git a/scripts/deployment.ts b/scripts/deployment.ts index 437500b5..9a5bf94f 100644 --- a/scripts/deployment.ts +++ b/scripts/deployment.ts @@ -61,7 +61,6 @@ async function deployAllContracts( signer: any ): Promise> { const bridgeCreator = await deployContract('BridgeCreator', signer) - const erc20BridgeCreator = await deployContract('ERC20BridgeCreator', signer) const prover0 = await deployContract('OneStepProver0', signer) const proverMem = await deployContract('OneStepProverMemory', signer) const proverMath = await deployContract('OneStepProverMath', signer) @@ -83,7 +82,6 @@ async function deployAllContracts( const rollupCreator = await deployContract('RollupCreator', signer) return { bridgeCreator, - erc20BridgeCreator, prover0, proverMem, proverMath, @@ -109,7 +107,6 @@ async function main() { console.log('Waiting for the Template to be set on the Rollup Creator') await contracts.rollupCreator.setTemplates( contracts.bridgeCreator.address, - contracts.erc20BridgeCreator.address, contracts.osp.address, contracts.challengeManager.address, contracts.rollupAdmin.address, diff --git a/src/rollup/AbsBridgeCreator.sol b/src/rollup/AbsBridgeCreator.sol deleted file mode 100644 index 8093d725..00000000 --- a/src/rollup/AbsBridgeCreator.sol +++ /dev/null @@ -1,117 +0,0 @@ -// Copyright 2021-2022, Offchain Labs, Inc. -// For license information, see https://github.com/nitro/blob/master/LICENSE -// SPDX-License-Identifier: BUSL-1.1 - -pragma solidity ^0.8.0; - -import "../bridge/IBridge.sol"; -import "../bridge/SequencerInbox.sol"; -import "../bridge/IInboxBase.sol"; -import "../bridge/Outbox.sol"; -import "../rollup/IBridgeCreator.sol"; -import "./IRollupEventInbox.sol"; -import "@openzeppelin/contracts/access/Ownable.sol"; -import "@openzeppelin/contracts/proxy/transparent/ProxyAdmin.sol"; - -abstract contract AbsBridgeCreator is Ownable, IBridgeCreator { - IBridge public bridgeTemplate; - SequencerInbox public sequencerInboxTemplate; - IInboxBase public inboxTemplate; - IRollupEventInbox public rollupEventInboxTemplate; - Outbox public outboxTemplate; - - event TemplatesUpdated(); - - constructor() Ownable() { - sequencerInboxTemplate = new SequencerInbox(); - outboxTemplate = new Outbox(); - } - - function updateTemplates( - address _bridgeTemplate, - address _sequencerInboxTemplate, - address _inboxTemplate, - address _rollupEventInboxTemplate, - address _outboxTemplate - ) external onlyOwner { - bridgeTemplate = IBridge(_bridgeTemplate); - sequencerInboxTemplate = SequencerInbox(_sequencerInboxTemplate); - inboxTemplate = IInboxBase(_inboxTemplate); - rollupEventInboxTemplate = IRollupEventInbox(_rollupEventInboxTemplate); - outboxTemplate = Outbox(_outboxTemplate); - - emit TemplatesUpdated(); - } - - struct CreateBridgeFrame { - ProxyAdmin admin; - IBridge bridge; - SequencerInbox sequencerInbox; - IInboxBase inbox; - IRollupEventInbox rollupEventInbox; - Outbox outbox; - } - - function _createBridge( - address adminProxy, - address rollup, - address nativeToken, - ISequencerInbox.MaxTimeVariation memory maxTimeVariation - ) - internal - returns ( - IBridge, - SequencerInbox, - IInboxBase, - IRollupEventInbox, - Outbox - ) - { - CreateBridgeFrame memory frame; - { - frame.bridge = IBridge( - address(new TransparentUpgradeableProxy(address(bridgeTemplate), adminProxy, "")) - ); - frame.sequencerInbox = SequencerInbox( - address( - new TransparentUpgradeableProxy(address(sequencerInboxTemplate), adminProxy, "") - ) - ); - frame.inbox = IInboxBase( - address(new TransparentUpgradeableProxy(address(inboxTemplate), adminProxy, "")) - ); - frame.rollupEventInbox = IRollupEventInbox( - address( - new TransparentUpgradeableProxy( - address(rollupEventInboxTemplate), - adminProxy, - "" - ) - ) - ); - frame.outbox = Outbox( - address(new TransparentUpgradeableProxy(address(outboxTemplate), adminProxy, "")) - ); - } - - _initializeBridge(frame.bridge, IOwnable(rollup), nativeToken); - frame.sequencerInbox.initialize(IBridge(frame.bridge), maxTimeVariation); - frame.inbox.initialize(IBridge(frame.bridge), ISequencerInbox(frame.sequencerInbox)); - frame.rollupEventInbox.initialize(IBridge(frame.bridge)); - frame.outbox.initialize(IBridge(frame.bridge)); - - return ( - frame.bridge, - frame.sequencerInbox, - frame.inbox, - frame.rollupEventInbox, - frame.outbox - ); - } - - function _initializeBridge( - IBridge bridge, - IOwnable rollup, - address - ) internal virtual; -} diff --git a/src/rollup/BridgeCreator.sol b/src/rollup/BridgeCreator.sol index a7d982ff..d901a604 100644 --- a/src/rollup/BridgeCreator.sol +++ b/src/rollup/BridgeCreator.sol @@ -5,21 +5,85 @@ pragma solidity ^0.8.0; import "../bridge/Bridge.sol"; -import "../bridge/IEthBridge.sol"; +import "../bridge/SequencerInbox.sol"; +import "../bridge/ISequencerInbox.sol"; import "../bridge/Inbox.sol"; -import "../rollup/AbsBridgeCreator.sol"; -import "../rollup/RollupEventInbox.sol"; - -contract BridgeCreator is AbsBridgeCreator, IEthBridgeCreator { - constructor() AbsBridgeCreator() { - bridgeTemplate = new Bridge(); - inboxTemplate = new Inbox(); - rollupEventInboxTemplate = new RollupEventInbox(); +import "../bridge/Outbox.sol"; +import "./RollupEventInbox.sol"; +import "../bridge/ERC20Bridge.sol"; +import "../bridge/ERC20Inbox.sol"; +import "../rollup/ERC20RollupEventInbox.sol"; +import "../bridge/ERC20Outbox.sol"; + +import "../bridge/IBridge.sol"; +import "@openzeppelin/contracts/access/Ownable.sol"; +import "@openzeppelin/contracts/proxy/transparent/ProxyAdmin.sol"; + +contract BridgeCreator is Ownable { + ContractTemplates public ethBasedTemplates; + ContractERC20Templates public erc20BasedTemplates; + + event TemplatesUpdated(); + event ERC20TemplatesUpdated(); + + struct ContractTemplates { + Bridge bridge; + SequencerInbox sequencerInbox; + Inbox inbox; + RollupEventInbox rollupEventInbox; + Outbox outbox; + } + + struct ContractERC20Templates { + ERC20Bridge bridge; + SequencerInbox sequencerInbox; + ERC20Inbox inbox; + ERC20RollupEventInbox rollupEventInbox; + ERC20Outbox outbox; + } + + struct CreateBridgeFrame { + ProxyAdmin admin; + IBridge bridge; + SequencerInbox sequencerInbox; + IInboxBase inbox; + IRollupEventInbox rollupEventInbox; + Outbox outbox; + } + + constructor() Ownable() { + SequencerInbox seqInbox = new SequencerInbox(); + + ethBasedTemplates.bridge = new Bridge(); + ethBasedTemplates.sequencerInbox = seqInbox; + ethBasedTemplates.inbox = new Inbox(); + ethBasedTemplates.rollupEventInbox = new RollupEventInbox(); + ethBasedTemplates.outbox = new Outbox(); + + erc20BasedTemplates.bridge = new ERC20Bridge(); + erc20BasedTemplates.sequencerInbox = seqInbox; + erc20BasedTemplates.inbox = new ERC20Inbox(); + erc20BasedTemplates.rollupEventInbox = new ERC20RollupEventInbox(); + erc20BasedTemplates.outbox = new ERC20Outbox(); + } + + function updateTemplates(ContractTemplates calldata _newTemplates) external onlyOwner { + ethBasedTemplates = _newTemplates; + emit TemplatesUpdated(); + } + + function updateERC20Templates(ContractERC20Templates calldata _newTemplates) + external + onlyOwner + { + erc20BasedTemplates = _newTemplates; + emit ERC20TemplatesUpdated(); } function createBridge( address adminProxy, address rollup, + address nativeToken, ISequencerInbox.MaxTimeVariation memory maxTimeVariation ) external @@ -31,14 +95,120 @@ contract BridgeCreator is AbsBridgeCreator, IEthBridgeCreator { Outbox ) { - return _createBridge(adminProxy, rollup, address(0), maxTimeVariation); - } + CreateBridgeFrame memory frame; + + // create ETH-based bridge if address zero is provided for native token, otherwise create ERC20-based bridge + if (nativeToken == address(0)) { + frame.bridge = Bridge( + address( + new TransparentUpgradeableProxy( + address(ethBasedTemplates.bridge), + adminProxy, + "" + ) + ) + ); + frame.sequencerInbox = SequencerInbox( + address( + new TransparentUpgradeableProxy( + address(ethBasedTemplates.sequencerInbox), + adminProxy, + "" + ) + ) + ); + frame.inbox = Inbox( + address( + new TransparentUpgradeableProxy( + address(ethBasedTemplates.inbox), + adminProxy, + "" + ) + ) + ); + frame.rollupEventInbox = RollupEventInbox( + address( + new TransparentUpgradeableProxy( + address(ethBasedTemplates.rollupEventInbox), + adminProxy, + "" + ) + ) + ); + frame.outbox = Outbox( + address( + new TransparentUpgradeableProxy( + address(ethBasedTemplates.outbox), + adminProxy, + "" + ) + ) + ); + } else { + frame.bridge = Bridge( + address( + new TransparentUpgradeableProxy( + address(erc20BasedTemplates.bridge), + adminProxy, + "" + ) + ) + ); + frame.sequencerInbox = SequencerInbox( + address( + new TransparentUpgradeableProxy( + address(erc20BasedTemplates.sequencerInbox), + adminProxy, + "" + ) + ) + ); + frame.inbox = Inbox( + address( + new TransparentUpgradeableProxy( + address(erc20BasedTemplates.inbox), + adminProxy, + "" + ) + ) + ); + frame.rollupEventInbox = RollupEventInbox( + address( + new TransparentUpgradeableProxy( + address(erc20BasedTemplates.rollupEventInbox), + adminProxy, + "" + ) + ) + ); + frame.outbox = Outbox( + address( + new TransparentUpgradeableProxy( + address(erc20BasedTemplates.outbox), + adminProxy, + "" + ) + ) + ); + } + + // init contracts + if (nativeToken == address(0)) { + IEthBridge(address(frame.bridge)).initialize(IOwnable(rollup)); + } else { + IERC20Bridge(address(frame.bridge)).initialize(IOwnable(rollup), nativeToken); + } + frame.sequencerInbox.initialize(IBridge(frame.bridge), maxTimeVariation); + frame.inbox.initialize(IBridge(frame.bridge), ISequencerInbox(frame.sequencerInbox)); + frame.rollupEventInbox.initialize(IBridge(frame.bridge)); + frame.outbox.initialize(IBridge(frame.bridge)); - function _initializeBridge( - IBridge bridge, - IOwnable rollup, - address - ) internal override { - IEthBridge(address(bridge)).initialize(IOwnable(rollup)); + return ( + frame.bridge, + frame.sequencerInbox, + frame.inbox, + frame.rollupEventInbox, + frame.outbox + ); } } diff --git a/src/rollup/ERC20BridgeCreator.sol b/src/rollup/ERC20BridgeCreator.sol deleted file mode 100644 index 5c597c63..00000000 --- a/src/rollup/ERC20BridgeCreator.sol +++ /dev/null @@ -1,48 +0,0 @@ -// Copyright 2021-2022, Offchain Labs, Inc. -// For license information, see https://github.com/nitro/blob/master/LICENSE -// SPDX-License-Identifier: BUSL-1.1 - -pragma solidity ^0.8.0; - -import "../rollup/AbsBridgeCreator.sol"; -import "../bridge/ERC20Bridge.sol"; -import "../bridge/IERC20Bridge.sol"; -import "../bridge/ERC20Inbox.sol"; -import "../rollup/IBridgeCreator.sol"; -import "../rollup/ERC20RollupEventInbox.sol"; - -import "@openzeppelin/contracts/token/ERC20/presets/ERC20PresetFixedSupply.sol"; - -contract ERC20BridgeCreator is AbsBridgeCreator, IERC20BridgeCreator { - constructor() AbsBridgeCreator() { - bridgeTemplate = new ERC20Bridge(); - inboxTemplate = new ERC20Inbox(); - rollupEventInboxTemplate = new ERC20RollupEventInbox(); - } - - function createBridge( - address adminProxy, - address rollup, - address nativeToken, - ISequencerInbox.MaxTimeVariation memory maxTimeVariation - ) - external - returns ( - IBridge, - SequencerInbox, - IInboxBase, - IRollupEventInbox, - Outbox - ) - { - return _createBridge(adminProxy, rollup, nativeToken, maxTimeVariation); - } - - function _initializeBridge( - IBridge bridge, - IOwnable rollup, - address nativeToken - ) internal override { - IERC20Bridge(address(bridge)).initialize(IOwnable(rollup), nativeToken); - } -} diff --git a/src/rollup/RollupCreator.sol b/src/rollup/RollupCreator.sol index d34a409f..5e9f28c9 100644 --- a/src/rollup/RollupCreator.sol +++ b/src/rollup/RollupCreator.sol @@ -7,7 +7,6 @@ pragma solidity ^0.8.0; import "./RollupProxy.sol"; import "./IRollupAdmin.sol"; import "./BridgeCreator.sol"; -import "./ERC20BridgeCreator.sol"; import "@openzeppelin/contracts/proxy/transparent/ProxyAdmin.sol"; import "@openzeppelin/contracts/proxy/transparent/TransparentUpgradeableProxy.sol"; import "@openzeppelin/contracts/access/Ownable.sol"; @@ -28,8 +27,7 @@ contract RollupCreator is Ownable { ); event TemplatesUpdated(); - BridgeCreator public ethBridgeCreator; - ERC20BridgeCreator public erc20BridgeCreator; + BridgeCreator public bridgeCreator; IOneStepProofEntry public osp; IChallengeManager public challengeManagerTemplate; IRollupAdmin public rollupAdminLogic; @@ -49,8 +47,7 @@ contract RollupCreator is Ownable { constructor() Ownable() {} function setTemplates( - BridgeCreator _ethBridgeCreator, - ERC20BridgeCreator _erc20BridgeCreator, + BridgeCreator _bridgeCreator, IOneStepProofEntry _osp, IChallengeManager _challengeManagerLogic, IRollupAdmin _rollupAdminLogic, @@ -58,8 +55,7 @@ contract RollupCreator is Ownable { address _validatorUtils, address _validatorWalletCreator ) external onlyOwner { - ethBridgeCreator = _ethBridgeCreator; - erc20BridgeCreator = _erc20BridgeCreator; + bridgeCreator = _bridgeCreator; osp = _osp; challengeManagerTemplate = _challengeManagerLogic; rollupAdminLogic = _rollupAdminLogic; @@ -95,34 +91,18 @@ contract RollupCreator is Ownable { RollupProxy rollup = new RollupProxy{salt: keccak256(abi.encode(config))}(); BridgeContracts memory bridgeContracts; - if (_nativeToken == address(0)) { - // create ETH-based rollup if address zero is provided for native token - ( - bridgeContracts.bridge, - bridgeContracts.sequencerInbox, - bridgeContracts.inbox, - bridgeContracts.rollupEventInbox, - bridgeContracts.outbox - ) = ethBridgeCreator.createBridge( - address(proxyAdmin), - address(rollup), - config.sequencerInboxMaxTimeVariation - ); - } else { - // otherwise create ERC20-based rollup with custom fee token - ( - bridgeContracts.bridge, - bridgeContracts.sequencerInbox, - bridgeContracts.inbox, - bridgeContracts.rollupEventInbox, - bridgeContracts.outbox - ) = erc20BridgeCreator.createBridge( - address(proxyAdmin), - address(rollup), - _nativeToken, - config.sequencerInboxMaxTimeVariation - ); - } + ( + bridgeContracts.bridge, + bridgeContracts.sequencerInbox, + bridgeContracts.inbox, + bridgeContracts.rollupEventInbox, + bridgeContracts.outbox + ) = bridgeCreator.createBridge( + address(proxyAdmin), + address(rollup), + _nativeToken, + config.sequencerInboxMaxTimeVariation + ); IChallengeManager challengeManager = IChallengeManager( address( diff --git a/test/contract/arbRollup.spec.ts b/test/contract/arbRollup.spec.ts index 884da19d..0d20af8f 100644 --- a/test/contract/arbRollup.spec.ts +++ b/test/contract/arbRollup.spec.ts @@ -156,15 +156,10 @@ const setup = async () => { )) as RollupUserLogic__factory const rollupUserLogicTemplate = await rollupUserLogicFac.deploy() - const ethBridgeCreatorFac = (await ethers.getContractFactory( + const bridgeCreatorFac = (await ethers.getContractFactory( 'BridgeCreator' )) as BridgeCreator__factory - const ethBridgeCreator = await ethBridgeCreatorFac.deploy() - - const erc20BridgeCreatorFac = (await ethers.getContractFactory( - 'ERC20BridgeCreator' - )) as BridgeCreator__factory - const erc20BridgeCreator = await erc20BridgeCreatorFac.deploy() + const bridgeCreator = await bridgeCreatorFac.deploy() const rollupCreatorFac = (await ethers.getContractFactory( 'RollupCreator' @@ -172,8 +167,7 @@ const setup = async () => { const rollupCreator = await rollupCreatorFac.deploy() await rollupCreator.setTemplates( - ethBridgeCreator.address, - erc20BridgeCreator.address, + bridgeCreator.address, oneStepProofEntry.address, challengeManagerTemplate.address, rollupAdminLogicTemplate.address, diff --git a/test/foundry/BridgeCreator.t.sol b/test/foundry/BridgeCreator.t.sol new file mode 100644 index 00000000..7f2dfd3c --- /dev/null +++ b/test/foundry/BridgeCreator.t.sol @@ -0,0 +1,213 @@ +// SPDX-License-Identifier: UNLICENSED +pragma solidity ^0.8.4; + +import "forge-std/Test.sol"; +import "./util/TestUtil.sol"; +import "../../src/rollup/BridgeCreator.sol"; +import "../../src/bridge/ISequencerInbox.sol"; +import "../../src/bridge/AbsInbox.sol"; +import "@openzeppelin/contracts/token/ERC20/ERC20.sol"; +import "@openzeppelin/contracts/token/ERC20/presets/ERC20PresetFixedSupply.sol"; + +contract BridgeCreatorTest is Test { + BridgeCreator public creator; + address public owner = address(100); + + function setUp() public { + vm.prank(owner); + creator = new BridgeCreator(); + } + + /* solhint-disable func-name-mixedcase */ + function test_constructor() public { + ( + Bridge bridgeTemplate, + SequencerInbox sequencerInboxTemplate, + Inbox inboxTemplate, + RollupEventInbox rollupEventInboxTemplate, + Outbox outboxTemplate + ) = creator.ethBasedTemplates(); + assertTrue(address(bridgeTemplate) != address(0), "Bridge not created"); + assertTrue(address(sequencerInboxTemplate) != address(0), "SeqInbox not created"); + assertTrue(address(inboxTemplate) != address(0), "Inbox not created"); + assertTrue(address(rollupEventInboxTemplate) != address(0), "Event inbox not created"); + assertTrue(address(outboxTemplate) != address(0), "Outbox not created"); + + ( + ERC20Bridge erc20BridgeTemplate, + SequencerInbox erc20SequencerInboxTemplate, + ERC20Inbox erc20InboxTemplate, + ERC20RollupEventInbox erc20RollupEventInboxTemplate, + ERC20Outbox erc20OutboxTemplate + ) = creator.erc20BasedTemplates(); + assertTrue(address(erc20BridgeTemplate) != address(0), "Bridge not created"); + assertTrue(address(erc20SequencerInboxTemplate) != address(0), "SeqInbox not created"); + assertTrue(address(erc20InboxTemplate) != address(0), "Inbox not created"); + assertTrue(address(erc20RollupEventInboxTemplate) != address(0), "Event inbox not created"); + assertTrue(address(erc20OutboxTemplate) != address(0), "Outbox not created"); + } + + function test_updateTemplates() public { + BridgeCreator.ContractTemplates memory templs = BridgeCreator.ContractTemplates({ + bridge: Bridge(address(200)), + sequencerInbox: SequencerInbox(address(201)), + inbox: Inbox(address(202)), + rollupEventInbox: RollupEventInbox(address(203)), + outbox: Outbox(address(204)) + }); + + vm.prank(owner); + creator.updateTemplates(templs); + + ( + Bridge bridgeTemplate, + SequencerInbox sequencerInboxTemplate, + Inbox inboxTemplate, + RollupEventInbox rollupEventInboxTemplate, + Outbox outboxTemplate + ) = creator.ethBasedTemplates(); + assertEq(address(bridgeTemplate), address(templs.bridge), "Invalid bridge"); + assertEq( + address(sequencerInboxTemplate), address(templs.sequencerInbox), "Invalid seqInbox" + ); + assertEq(address(inboxTemplate), address(templs.inbox), "Invalid inbox"); + assertEq( + address(rollupEventInboxTemplate), + address(templs.rollupEventInbox), + "Invalid rollup event inbox" + ); + assertEq(address(outboxTemplate), address(templs.outbox), "Invalid outbox"); + } + + function test_updateERC20Templates() public { + BridgeCreator.ContractERC20Templates memory templs = BridgeCreator.ContractERC20Templates({ + bridge: ERC20Bridge(address(400)), + sequencerInbox: SequencerInbox(address(401)), + inbox: ERC20Inbox(address(402)), + rollupEventInbox: ERC20RollupEventInbox(address(403)), + outbox: ERC20Outbox(address(404)) + }); + + vm.prank(owner); + creator.updateERC20Templates(templs); + + ( + ERC20Bridge bridgeTemplate, + SequencerInbox sequencerInboxTemplate, + ERC20Inbox inboxTemplate, + ERC20RollupEventInbox rollupEventInboxTemplate, + ERC20Outbox outboxTemplate + ) = creator.erc20BasedTemplates(); + assertEq(address(bridgeTemplate), address(templs.bridge), "Invalid bridge"); + assertEq( + address(sequencerInboxTemplate), address(templs.sequencerInbox), "Invalid seqInbox" + ); + assertEq(address(inboxTemplate), address(templs.inbox), "Invalid inbox"); + assertEq( + address(rollupEventInboxTemplate), + address(templs.rollupEventInbox), + "Invalid rollup event inbox" + ); + assertEq(address(outboxTemplate), address(templs.outbox), "Invalid outbox"); + } + + function test_createEthBridge() public { + address proxyAdmin = address(300); + address rollup = address(301); + address nativeToken = address(0); + ISequencerInbox.MaxTimeVariation memory timeVars = + ISequencerInbox.MaxTimeVariation(10, 20, 30, 40); + timeVars.delayBlocks; + + ( + IBridge bridge, + SequencerInbox seqInbox, + IInboxBase inbox, + IRollupEventInbox eventInbox, + Outbox outbox + ) = creator.createBridge(proxyAdmin, rollup, nativeToken, timeVars); + + // bridge + assertEq(address(bridge.rollup()), rollup, "Invalid rollup ref"); + assertEq(bridge.activeOutbox(), address(0), "Invalid activeOutbox ref"); + + // seqInbox + assertEq(address(seqInbox.bridge()), address(bridge), "Invalid bridge ref"); + assertEq(address(seqInbox.rollup()), rollup, "Invalid rollup ref"); + (uint256 _delayBlocks, uint256 _futureBlocks, uint256 _delaySeconds, uint256 _futureSeconds) + = seqInbox.maxTimeVariation(); + assertEq(_delayBlocks, timeVars.delayBlocks, "Invalid delayBlocks"); + assertEq(_futureBlocks, timeVars.futureBlocks, "Invalid futureBlocks"); + assertEq(_delaySeconds, timeVars.delaySeconds, "Invalid delaySeconds"); + assertEq(_futureSeconds, timeVars.futureSeconds, "Invalid futureSeconds"); + + // inbox + assertEq(address(inbox.bridge()), address(bridge), "Invalid bridge ref"); + assertEq(address(inbox.sequencerInbox()), address(seqInbox), "Invalid seqInbox ref"); + assertEq(inbox.allowListEnabled(), false, "Invalid allowListEnabled"); + assertEq(AbsInbox(address(inbox)).paused(), false, "Invalid paused status"); + + // rollup event inbox + assertEq(address(eventInbox.bridge()), address(bridge), "Invalid bridge ref"); + assertEq(address(eventInbox.rollup()), rollup, "Invalid rollup ref"); + + // outbox + assertEq(address(outbox.bridge()), address(bridge), "Invalid bridge ref"); + assertEq(address(outbox.rollup()), rollup, "Invalid rollup ref"); + + // revert fetching native token + vm.expectRevert(); + IERC20Bridge(address(bridge)).nativeToken(); + } + + function test_createERC20Bridge() public { + address proxyAdmin = address(300); + address rollup = address(301); + address nativeToken = + address(new ERC20PresetFixedSupply("Appchain Token", "App", 1_000_000, address(this))); + ISequencerInbox.MaxTimeVariation memory timeVars = + ISequencerInbox.MaxTimeVariation(10, 20, 30, 40); + timeVars.delayBlocks; + + ( + IBridge bridge, + SequencerInbox seqInbox, + IInboxBase inbox, + IRollupEventInbox eventInbox, + Outbox outbox + ) = creator.createBridge(proxyAdmin, rollup, nativeToken, timeVars); + + // bridge + assertEq(address(bridge.rollup()), rollup, "Invalid rollup ref"); + assertEq( + address(IERC20Bridge(address(bridge)).nativeToken()), + nativeToken, + "Invalid nativeToken ref" + ); + assertEq(bridge.activeOutbox(), address(0), "Invalid activeOutbox ref"); + + // seqInbox + assertEq(address(seqInbox.bridge()), address(bridge), "Invalid bridge ref"); + assertEq(address(seqInbox.rollup()), rollup, "Invalid rollup ref"); + (uint256 _delayBlocks, uint256 _futureBlocks, uint256 _delaySeconds, uint256 _futureSeconds) + = seqInbox.maxTimeVariation(); + assertEq(_delayBlocks, timeVars.delayBlocks, "Invalid delayBlocks"); + assertEq(_futureBlocks, timeVars.futureBlocks, "Invalid futureBlocks"); + assertEq(_delaySeconds, timeVars.delaySeconds, "Invalid delaySeconds"); + assertEq(_futureSeconds, timeVars.futureSeconds, "Invalid futureSeconds"); + + // inbox + assertEq(address(inbox.bridge()), address(bridge), "Invalid bridge ref"); + assertEq(address(inbox.sequencerInbox()), address(seqInbox), "Invalid seqInbox ref"); + assertEq(inbox.allowListEnabled(), false, "Invalid allowListEnabled"); + assertEq(AbsInbox(address(inbox)).paused(), false, "Invalid paused status"); + + // rollup event inbox + assertEq(address(eventInbox.bridge()), address(bridge), "Invalid bridge ref"); + assertEq(address(eventInbox.rollup()), rollup, "Invalid rollup ref"); + + // outbox + assertEq(address(outbox.bridge()), address(bridge), "Invalid bridge ref"); + assertEq(address(outbox.rollup()), rollup, "Invalid rollup ref"); + } +} diff --git a/test/foundry/ERC20BridgeCreator.t.sol b/test/foundry/ERC20BridgeCreator.t.sol deleted file mode 100644 index 5dfa2461..00000000 --- a/test/foundry/ERC20BridgeCreator.t.sol +++ /dev/null @@ -1,113 +0,0 @@ -// SPDX-License-Identifier: UNLICENSED -pragma solidity ^0.8.4; - -import "forge-std/Test.sol"; -import "./util/TestUtil.sol"; -import "../../src/rollup/ERC20BridgeCreator.sol"; -import "../../src/bridge/ISequencerInbox.sol"; -import "../../src/bridge/AbsInbox.sol"; -import "@openzeppelin/contracts/token/ERC20/ERC20.sol"; -import "@openzeppelin/contracts/token/ERC20/presets/ERC20PresetFixedSupply.sol"; - -contract ERC20BridgeCreatorTest is Test { - ERC20BridgeCreator public creator; - address public owner = address(100); - - function setUp() public { - vm.prank(owner); - creator = new ERC20BridgeCreator(); - } - - /* solhint-disable func-name-mixedcase */ - function test_constructor() public { - assertTrue(address(creator.bridgeTemplate()) != address(0), "Bridge not created"); - assertTrue(address(creator.sequencerInboxTemplate()) != address(0), "SeqInbox not created"); - assertTrue(address(creator.inboxTemplate()) != address(0), "Inbox not created"); - assertTrue( - address(creator.rollupEventInboxTemplate()) != address(0), - "Event inbox not created" - ); - assertTrue(address(creator.outboxTemplate()) != address(0), "Outbox not created"); - } - - function test_updateTemplates() public { - address bridge = address(200); - address sequencerInbox = address(201); - address inbox = address(202); - address rollupEventInbox = address(203); - address outbox = address(204); - - vm.prank(owner); - creator.updateTemplates(bridge, sequencerInbox, inbox, rollupEventInbox, outbox); - - assertEq(address(creator.bridgeTemplate()), bridge, "Invalid bridge"); - assertEq(address(creator.sequencerInboxTemplate()), sequencerInbox, "Invalid seqInbox"); - assertEq(address(creator.inboxTemplate()), inbox, "Invalid inbox"); - assertEq( - address(creator.rollupEventInboxTemplate()), - rollupEventInbox, - "Invalid rollup event inbox" - ); - assertEq(address(creator.outboxTemplate()), outbox, "Invalid outbox"); - } - - function test_createBridge() public { - address proxyAdmin = address(300); - address rollup = address(301); - address nativeToken = address( - new ERC20PresetFixedSupply("Appchain Token", "App", 1_000_000, address(this)) - ); - ISequencerInbox.MaxTimeVariation memory timeVars = ISequencerInbox.MaxTimeVariation( - 10, - 20, - 30, - 40 - ); - timeVars.delayBlocks; - - ( - IBridge bridge, - SequencerInbox seqInbox, - IInboxBase inbox, - IRollupEventInbox eventInbox, - Outbox outbox - ) = creator.createBridge(proxyAdmin, rollup, nativeToken, timeVars); - - // bridge - assertEq(address(bridge.rollup()), rollup, "Invalid rollup ref"); - assertEq( - address(IERC20Bridge(address(bridge)).nativeToken()), - nativeToken, - "Invalid nativeToken ref" - ); - assertEq(bridge.activeOutbox(), address(0), "Invalid activeOutbox ref"); - - // seqInbox - assertEq(address(seqInbox.bridge()), address(bridge), "Invalid bridge ref"); - assertEq(address(seqInbox.rollup()), rollup, "Invalid rollup ref"); - ( - uint256 _delayBlocks, - uint256 _futureBlocks, - uint256 _delaySeconds, - uint256 _futureSeconds - ) = seqInbox.maxTimeVariation(); - assertEq(_delayBlocks, timeVars.delayBlocks, "Invalid delayBlocks"); - assertEq(_futureBlocks, timeVars.futureBlocks, "Invalid futureBlocks"); - assertEq(_delaySeconds, timeVars.delaySeconds, "Invalid delaySeconds"); - assertEq(_futureSeconds, timeVars.futureSeconds, "Invalid futureSeconds"); - - // inbox - assertEq(address(inbox.bridge()), address(bridge), "Invalid bridge ref"); - assertEq(address(inbox.sequencerInbox()), address(seqInbox), "Invalid seqInbox ref"); - assertEq(inbox.allowListEnabled(), false, "Invalid allowListEnabled"); - assertEq(AbsInbox(address(inbox)).paused(), false, "Invalid paused status"); - - // rollup event inbox - assertEq(address(eventInbox.bridge()), address(bridge), "Invalid bridge ref"); - assertEq(address(eventInbox.rollup()), rollup, "Invalid rollup ref"); - - // outbox - assertEq(address(outbox.bridge()), address(bridge), "Invalid bridge ref"); - assertEq(address(outbox.rollup()), rollup, "Invalid rollup ref"); - } -} diff --git a/test/foundry/RollupCreator.t.sol b/test/foundry/RollupCreator.t.sol index 9ae2b8db..36dad1a8 100644 --- a/test/foundry/RollupCreator.t.sol +++ b/test/foundry/RollupCreator.t.sol @@ -14,8 +14,8 @@ import "../../src/osp/OneStepProverMemory.sol"; import "../../src/osp/OneStepProverMath.sol"; import "../../src/osp/OneStepProverHostIo.sol"; import "../../src/osp/OneStepProofEntry.sol"; - import "@openzeppelin/contracts/access/Ownable.sol"; +import "@openzeppelin/contracts/token/ERC20/presets/ERC20PresetFixedSupply.sol"; contract RollupCreatorTest is Test { RollupCreator public rollupCreator; @@ -32,8 +32,7 @@ contract RollupCreatorTest is Test { rollupCreator = new RollupCreator(); // deploy BridgeCreators - BridgeCreator ethBridgeCreator = new BridgeCreator(); - ERC20BridgeCreator erc20BridgeCreator = new ERC20BridgeCreator(); + BridgeCreator bridgeCreator = new BridgeCreator(); ( IOneStepProofEntry ospEntry, @@ -47,8 +46,7 @@ contract RollupCreatorTest is Test { //// deploy creator and set logic rollupCreator.setTemplates( - ethBridgeCreator, - erc20BridgeCreator, + bridgeCreator, ospEntry, challengeManager, _rollupAdmin, @@ -64,12 +62,8 @@ contract RollupCreatorTest is Test { vm.startPrank(deployer); // deployment params - ISequencerInbox.MaxTimeVariation memory timeVars = ISequencerInbox.MaxTimeVariation( - ((60 * 60 * 24) / 15), - 12, - 60 * 60 * 24, - 60 * 60 - ); + ISequencerInbox.MaxTimeVariation memory timeVars = + ISequencerInbox.MaxTimeVariation(((60 * 60 * 24) / 15), 12, 60 * 60 * 24, 60 * 60); Config memory config = Config({ confirmPeriodBlocks: 20, extraChallengeTimeBlocks: 200, @@ -80,7 +74,7 @@ contract RollupCreatorTest is Test { loserStakeEscrow: address(200), chainId: 1337, chainConfig: "abc", - genesisBlockNum: 15000000, + genesisBlockNum: 15_000_000, sequencerInboxMaxTimeVariation: timeVars }); @@ -89,12 +83,8 @@ contract RollupCreatorTest is Test { address[] memory validators = new address[](2); validators[0] = makeAddr("validator1"); validators[1] = makeAddr("validator2"); - address rollupAddress = rollupCreator.createRollup( - config, - batchPoster, - validators, - address(0) - ); + address rollupAddress = + rollupCreator.createRollup(config, batchPoster, validators, address(0)); vm.stopPrank(); @@ -127,17 +117,12 @@ contract RollupCreatorTest is Test { function test_createErc20Rollup() public { vm.startPrank(deployer); - address nativeToken = address( - new ERC20PresetFixedSupply("Appchain Token", "App", 1_000_000, address(this)) - ); + address nativeToken = + address(new ERC20PresetFixedSupply("Appchain Token", "App", 1_000_000, address(this))); // deployment params - ISequencerInbox.MaxTimeVariation memory timeVars = ISequencerInbox.MaxTimeVariation( - ((60 * 60 * 24) / 15), - 12, - 60 * 60 * 24, - 60 * 60 - ); + ISequencerInbox.MaxTimeVariation memory timeVars = + ISequencerInbox.MaxTimeVariation(((60 * 60 * 24) / 15), 12, 60 * 60 * 24, 60 * 60); Config memory config = Config({ confirmPeriodBlocks: 20, extraChallengeTimeBlocks: 200, @@ -148,7 +133,7 @@ contract RollupCreatorTest is Test { loserStakeEscrow: address(200), chainId: 1337, chainConfig: "abc", - genesisBlockNum: 15000000, + genesisBlockNum: 15_000_000, sequencerInboxMaxTimeVariation: timeVars }); @@ -157,12 +142,8 @@ contract RollupCreatorTest is Test { address[] memory validators = new address[](2); validators[0] = makeAddr("validator1"); validators[1] = makeAddr("validator2"); - address rollupAddress = rollupCreator.createRollup( - config, - batchPoster, - validators, - nativeToken - ); + address rollupAddress = + rollupCreator.createRollup(config, batchPoster, validators, nativeToken); vm.stopPrank(); @@ -194,9 +175,7 @@ contract RollupCreatorTest is Test { // native token check IBridge bridge = RollupCore(address(rollupAddress)).bridge(); assertEq( - IERC20Bridge(address(bridge)).nativeToken(), - nativeToken, - "Invalid native token ref" + IERC20Bridge(address(bridge)).nativeToken(), nativeToken, "Invalid native token ref" ); } @@ -211,11 +190,11 @@ contract RollupCreatorTest is Test { { //// deploy challenge stuff ospEntry = new OneStepProofEntry( - new OneStepProver0(), - new OneStepProverMemory(), - new OneStepProverMath(), - new OneStepProverHostIo() - ); + new OneStepProver0(), + new OneStepProverMemory(), + new OneStepProverMath(), + new OneStepProverHostIo() + ); challengeManager = new ChallengeManager(); //// deploy rollup logic @@ -236,9 +215,8 @@ contract RollupCreatorTest is Test { } function _getSecondary(address proxy) internal view returns (address) { - bytes32 secondarySlot = bytes32( - uint256(keccak256("eip1967.proxy.implementation.secondary")) - 1 - ); + bytes32 secondarySlot = + bytes32(uint256(keccak256("eip1967.proxy.implementation.secondary")) - 1); return address(uint160(uint256(vm.load(proxy, secondarySlot)))); } } From 2b731ff3c0b69fcb8d50a5a31283e64f435284a3 Mon Sep 17 00:00:00 2001 From: Goran Vladika Date: Fri, 25 Aug 2023 14:19:28 +0200 Subject: [PATCH 055/292] Add more descriptive comments --- src/bridge/ERC20Bridge.sol | 2 ++ src/bridge/ERC20Outbox.sol | 3 +++ src/bridge/Outbox.sol | 4 ++++ test/foundry/ERC20Outbox.t.sol | 1 + test/foundry/Outbox.t.sol | 1 + 5 files changed, 11 insertions(+) diff --git a/src/bridge/ERC20Bridge.sol b/src/bridge/ERC20Bridge.sol index 5c643562..9f94fb7d 100644 --- a/src/bridge/ERC20Bridge.sol +++ b/src/bridge/ERC20Bridge.sol @@ -50,6 +50,8 @@ contract ERC20Bridge is AbsBridge, IERC20Bridge { uint256 value, bytes memory data ) internal override returns (bool success, bytes memory returnData) { + // we don't allow outgoing calls to native token contract because it could + // result in loss of native tokens which are escrowed by ERC20Bridge if (to == nativeToken) { revert CallTargetNotAllowed(nativeToken); } diff --git a/src/bridge/ERC20Outbox.sol b/src/bridge/ERC20Outbox.sol index e5fe31c8..fcc08ef8 100644 --- a/src/bridge/ERC20Outbox.sol +++ b/src/bridge/ERC20Outbox.sol @@ -7,6 +7,7 @@ pragma solidity ^0.8.4; import "./AbsOutbox.sol"; contract ERC20Outbox is AbsOutbox { + // it is assumed that arb-os never assigns this value to a valid leaf to be redeemed uint256 private constant AMOUNT_DEFAULT_CONTEXT = type(uint256).max; function l2ToL1WithdrawalAmount() external view returns (uint256) { @@ -17,11 +18,13 @@ contract ERC20Outbox is AbsOutbox { /// @inheritdoc AbsOutbox function _defaultContextAmount() internal pure override returns (uint256) { + // we use type(uint256).max as representation of 0 native token withdrawal amount return AMOUNT_DEFAULT_CONTEXT; } /// @inheritdoc AbsOutbox function _amountToSetInContext(uint256 value) internal pure override returns (uint256) { + // native token withdrawal amount which can be fetched from context return value; } } diff --git a/src/bridge/Outbox.sol b/src/bridge/Outbox.sol index b5ad61b8..8ae873df 100644 --- a/src/bridge/Outbox.sol +++ b/src/bridge/Outbox.sol @@ -9,11 +9,15 @@ import "./AbsOutbox.sol"; contract Outbox is AbsOutbox { /// @inheritdoc AbsOutbox function _defaultContextAmount() internal pure override returns (uint256) { + // In ETH-based chains withdrawal amount can be read from msg.value. For that reason + // amount slot in context will never be accessed and it has 0 default value return 0; } /// @inheritdoc AbsOutbox function _amountToSetInContext(uint256) internal pure override returns (uint256) { + // In ETH-based chains withdrawal amount can be read from msg.value. For that reason + // amount slot in context will never be accessed, we keep it as 0 all the time return 0; } } diff --git a/test/foundry/ERC20Outbox.t.sol b/test/foundry/ERC20Outbox.t.sol index 076e516c..f97e96be 100644 --- a/test/foundry/ERC20Outbox.t.sol +++ b/test/foundry/ERC20Outbox.t.sol @@ -31,6 +31,7 @@ contract ERC20OutboxTest is AbsOutboxTest { nativeToken.transfer(user, 1_000); } + /* solhint-disable func-name-mixedcase */ function test_initialize_WithdrawalAmount() public { assertEq(erc20Outbox.l2ToL1WithdrawalAmount(), 0, "Invalid withdrawalAmount"); } diff --git a/test/foundry/Outbox.t.sol b/test/foundry/Outbox.t.sol index 39383117..3b7d9cd4 100644 --- a/test/foundry/Outbox.t.sol +++ b/test/foundry/Outbox.t.sol @@ -24,6 +24,7 @@ contract OutboxTest is AbsOutboxTest { bridge.setOutbox(address(outbox), true); } + /* solhint-disable func-name-mixedcase */ function test_executeTransaction() public { // fund bridge with some ether vm.deal(address(bridge), 100 ether); From d5d33c2b8d5615563b8c553ca2a1bb936c039924 Mon Sep 17 00:00:00 2001 From: Goran Vladika Date: Fri, 25 Aug 2023 14:38:53 +0200 Subject: [PATCH 056/292] One more comment --- src/bridge/ERC20Inbox.sol | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/bridge/ERC20Inbox.sol b/src/bridge/ERC20Inbox.sol index 8d364c78..ef04bf38 100644 --- a/src/bridge/ERC20Inbox.sol +++ b/src/bridge/ERC20Inbox.sol @@ -122,7 +122,8 @@ contract ERC20Inbox is AbsInbox, IERC20Inbox { bytes32 messageDataHash, uint256 tokenAmount ) internal override returns (uint256) { - // fetch native token from sender if inbox doesn't already hold enough tokens to pay for fees + // Fetch native token from sender if inbox doesn't already hold enough tokens to pay for fees. + // Inbox might have been pre-funded in prior call, ie. as part of token bridging flow. address nativeToken = IERC20Bridge(address(bridge)).nativeToken(); uint256 inboxNativeTokenBalance = IERC20(nativeToken).balanceOf(address(this)); if (inboxNativeTokenBalance < tokenAmount) { From 69a8c33370c77d4ec59f25f91a1a674691b227bd Mon Sep 17 00:00:00 2001 From: Goran Vladika Date: Fri, 25 Aug 2023 14:59:51 +0200 Subject: [PATCH 057/292] Fix merge leftovers --- test/foundry/RollupCreator.t.sol | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/test/foundry/RollupCreator.t.sol b/test/foundry/RollupCreator.t.sol index 18b4ffe5..e777d788 100644 --- a/test/foundry/RollupCreator.t.sol +++ b/test/foundry/RollupCreator.t.sol @@ -36,6 +36,8 @@ contract RollupCreatorTest is Test { // deploy BridgeCreators BridgeCreator bridgeCreator = new BridgeCreator(); + IUpgradeExecutor upgradeExecutorLogic = new UpgradeExecutorMock(); + ( IOneStepProofEntry ospEntry, IChallengeManager challengeManager, @@ -77,7 +79,7 @@ contract RollupCreatorTest is Test { loserStakeEscrow: address(200), chainId: 1337, chainConfig: "abc", - genesisBlockNum: 15__000__000, + genesisBlockNum: 15_000_000, sequencerInboxMaxTimeVariation: timeVars }); From 1eaf9311eb9b91e9cd3cdd123dcb7e1f8aa80dd6 Mon Sep 17 00:00:00 2001 From: Goran Vladika Date: Fri, 25 Aug 2023 15:08:12 +0200 Subject: [PATCH 058/292] Bump upgrade executor --- package.json | 2 +- src/mocks/UpgradeExecutorMock.sol | 21 +++++++++++++++++++++ yarn.lock | 8 ++++---- 3 files changed, 26 insertions(+), 5 deletions(-) diff --git a/package.json b/package.json index eb973360..457ab06c 100644 --- a/package.json +++ b/package.json @@ -37,7 +37,7 @@ "dependencies": { "@arbitrum/sdk": "^3.1.3", "@ethersproject/providers": "^5.7.2", - "@offchainlabs/upgrade-executor": "^1.0.0-beta.2", + "@offchainlabs/upgrade-executor": "1.1.0-beta.0", "@openzeppelin/contracts": "4.5.0", "@openzeppelin/contracts-upgradeable": "4.5.2", "patch-package": "^6.4.7" diff --git a/src/mocks/UpgradeExecutorMock.sol b/src/mocks/UpgradeExecutorMock.sol index c036aaf0..6b7ca9db 100644 --- a/src/mocks/UpgradeExecutorMock.sol +++ b/src/mocks/UpgradeExecutorMock.sol @@ -21,6 +21,9 @@ contract UpgradeExecutorMock is /// @notice Emitted when an upgrade execution occurs event UpgradeExecuted(address indexed upgrade, uint256 value, bytes data); + /// @notice Emitted when target call occurs + event TargetCallExecuted(address indexed target, uint256 value, bytes data); + constructor() initializer {} /// @notice Initialise the upgrade executor @@ -58,4 +61,22 @@ contract UpgradeExecutorMock is emit UpgradeExecuted(upgrade, msg.value, upgradeCallData); } + + /// @notice Execute an upgrade by directly calling target contract + /// @dev Only executor can call this. + function executeCall(address target, bytes memory targetCallData) + public + payable + onlyRole(EXECUTOR_ROLE) + nonReentrant + { + // OZ Address library check if the address is a contract and bubble up inner revert reason + address(target).functionCallWithValue( + targetCallData, + msg.value, + "UpgradeExecutor: inner call failed without reason" + ); + + emit TargetCallExecuted(target, msg.value, targetCallData); + } } diff --git a/yarn.lock b/yarn.lock index 92c25107..aeaaadee 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1202,10 +1202,10 @@ "@types/sinon-chai" "^3.2.3" "@types/web3" "1.0.19" -"@offchainlabs/upgrade-executor@^1.0.0-beta.2": - version "1.0.0-beta.2" - resolved "https://registry.yarnpkg.com/@offchainlabs/upgrade-executor/-/upgrade-executor-1.0.0-beta.2.tgz#b3f9e1ba2e58edf17019249b4663d88567961fec" - integrity sha512-aSjWctspD2QTGXUv0fRHudFrl5oR42nRB/88JUnC9O5tujPyRksM6Y8WyrDNl3eZuqV+L1V76Ui2Av4NrUkd+g== +"@offchainlabs/upgrade-executor@1.1.0-beta.0": + version "1.1.0-beta.0" + resolved "https://registry.yarnpkg.com/@offchainlabs/upgrade-executor/-/upgrade-executor-1.1.0-beta.0.tgz#c4b1375176546a18aaef01a43956abfb58250e0a" + integrity sha512-mpn6PHjH/KDDjNX0pXHEKdyv8m6DVGQiI2nGzQn0JbM1nOSHJpWx6fvfjtH7YxHJ6zBZTcsKkqGkFKDtCfoSLw== dependencies: "@openzeppelin/contracts" "4.7.3" "@openzeppelin/contracts-upgradeable" "4.7.3" From 59a6b1a096b41ec60da4fb1de02fecc4215e99c5 Mon Sep 17 00:00:00 2001 From: Goran Vladika Date: Fri, 25 Aug 2023 19:37:39 +0200 Subject: [PATCH 059/292] Update rollup creator deployment script --- scripts/deployment.ts | 92 +++++++++++++++++++++++++++++++++---------- scripts/testSetup.ts | 20 +++++----- 2 files changed, 83 insertions(+), 29 deletions(-) diff --git a/scripts/deployment.ts b/scripts/deployment.ts index de2d3a9e..7097c15b 100644 --- a/scripts/deployment.ts +++ b/scripts/deployment.ts @@ -2,6 +2,10 @@ import { ethers } from 'hardhat' import { ContractFactory, Contract } from 'ethers' import '@nomiclabs/hardhat-ethers' import { run } from 'hardhat' +import { + abi as UpgradeExecutorABI, + bytecode as UpgradeExecutorBytecode, +} from '@offchainlabs/upgrade-executor/build/contracts/src/UpgradeExecutor.sol/UpgradeExecutor.json' // Define a verification function async function verifyContract( @@ -56,6 +60,16 @@ async function deployContract( return contract } +// Deploy upgrade executor from imported bytecode +async function deployUpgradeExecutor(): Promise { + const upgradeExecutorFac = await ethers.getContractFactory( + UpgradeExecutorABI, + UpgradeExecutorBytecode + ) + const upgradeExecutor = await upgradeExecutorFac.deploy() + return upgradeExecutor +} + // Function to handle all deployments of core contracts using deployContract function async function deployAllContracts( signer: any @@ -74,7 +88,7 @@ async function deployAllContracts( const challengeManager = await deployContract('ChallengeManager', signer) const rollupAdmin = await deployContract('RollupAdminLogic', signer) const rollupUser = await deployContract('RollupUserLogic', signer) - const upgradeExecutor = await deployContract('UpgradeExecutor', signer) + const upgradeExecutor = await deployUpgradeExecutor() const validatorUtils = await deployContract('ValidatorUtils', signer) const validatorWalletCreator = await deployContract( 'ValidatorWalletCreator', @@ -119,37 +133,75 @@ async function main() { ) console.log('Template is set on the Rollup Creator') - const bridgeAddress = await contracts.bridgeCreator.bridgeTemplate() - const sequencerInboxAddress = - await contracts.bridgeCreator.sequencerInboxTemplate() - const inboxAddress = await contracts.bridgeCreator.inboxTemplate() - const outboxAddress = await contracts.bridgeCreator.outboxTemplate() + // get and verify ETH-based bridge contracts + const { bridge, sequencerInbox, inbox, outbox } = + await contracts.bridgeCreator.ethBasedTemplates() + console.log(`"bridge implementation contract" created at address:`, bridge) + await verifyContract('Bridge', bridge, [], 'src/bridge/Bridge.sol:Bridge') console.log( - `"bridge implementation contract" created at address:`, - bridgeAddress + `"sequencerInbox implementation contract" created at address:`, + sequencerInbox ) await verifyContract( - 'Bridge', - bridgeAddress, + 'SequencerInbox', + sequencerInbox, [], - 'src/bridge/Bridge.sol:Bridge' + 'src/bridge/SequencerInbox.sol:SequencerInbox' ) + console.log(`"inbox implementation contract" created at address:`, inbox) + await verifyContract('Inbox', inbox, [], 'src/bridge/Inbox.sol:Inbox') + console.log(`"outbox implementation contract" created at address:`, outbox) + await verifyContract('Outbox', outbox, [], 'src/bridge/Outbox.sol:Outbox') + + // get and verify ERC20-based bridge contracts + const { + bridge: erc20Bridge, + sequencerInbox: erc20SeqInbox, + inbox: erc20Inbox, + outbox: erc20Outbox, + } = await contracts.bridgeCreator.erc20BasedTemplates() + console.log( - `"sequencerInbox implementation contract" created at address:`, - sequencerInboxAddress + `"erc20 bridge implementation contract" created at address:`, + bridge + ) + await verifyContract( + 'ERC20Bridge', + erc20Bridge, + [], + 'src/bridge/ERC20Bridge.sol:ERC20Bridge' ) - await verifyContract('SequencerInbox', sequencerInboxAddress, []) console.log( - `"inbox implementation contract" created at address:`, - inboxAddress + `"erc20 sequencerInbox implementation contract" created at address:`, + erc20SeqInbox + ) + await verifyContract( + 'SequencerInbox', + erc20SeqInbox, + [], + 'src/bridge/SequencerInbox.sol:SequencerInbox' + ) + console.log( + `"erc20 inbox implementation contract" created at address:`, + inbox + ) + await verifyContract( + 'ERC20Inbox', + erc20Inbox, + [], + 'src/bridge/ERC20Inbox.sol:ERC20Inbox' ) - await verifyContract('Inbox', inboxAddress, []) console.log( - `"outbox implementation contract" created at address:`, - outboxAddress + `"erc20 outbox implementation contract" created at address:`, + outbox + ) + await verifyContract( + 'ERC20Outbox', + erc20Outbox, + [], + 'src/bridge/ERC20Outbox.sol:ERC20Outbox' ) - await verifyContract('Outbox', outboxAddress, []) } catch (error) { console.error( 'Deployment failed:', diff --git a/scripts/testSetup.ts b/scripts/testSetup.ts index 54db9174..2c11e769 100644 --- a/scripts/testSetup.ts +++ b/scripts/testSetup.ts @@ -19,15 +19,17 @@ export const getCustomNetworks = async ( const l1Provider = new JsonRpcProvider(l1Url) const l2Provider = new JsonRpcProvider(l2Url) let deploymentData: string - try { - deploymentData = execSync( - 'docker exec nitro_sequencer_1 cat /config/deployment.json' - ).toString() - } catch (e) { - deploymentData = execSync( - 'docker exec nitro-sequencer-1 cat /config/deployment.json' - ).toString() - } + + let sequencerContainer = execSync( + 'docker ps --filter "name=sequencer" --format "{{.Names}}"' + ) + .toString() + .trim() + + deploymentData = execSync( + `docker exec ${sequencerContainer} cat /config/deployment.json` + ).toString() + const parsedDeploymentData = JSON.parse(deploymentData) as { bridge: string inbox: string From 91eb8e9d341266bc9cfffb35924464e91c8d1042 Mon Sep 17 00:00:00 2001 From: Goran Vladika Date: Mon, 4 Sep 2023 14:00:57 +0200 Subject: [PATCH 060/292] Port DeployHelper.sol from 'deploy-helper' branch --- src/rollup/DeployHelper.sol | 67 +++++++++++++++++++++++++++++++++++++ 1 file changed, 67 insertions(+) create mode 100644 src/rollup/DeployHelper.sol diff --git a/src/rollup/DeployHelper.sol b/src/rollup/DeployHelper.sol new file mode 100644 index 00000000..d794b880 --- /dev/null +++ b/src/rollup/DeployHelper.sol @@ -0,0 +1,67 @@ +// 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 + +pragma solidity ^0.8.0; + +import {IInbox} from "../bridge/IInbox.sol"; + +/// @notice Helper contract for deploying some keyless deployment to Arbitrum using delayed inbox +contract DeployHelper { + // All payload are padded with 0x04 (ArbOS L2MessageKind_SignedTx Type) + + // Nick's CREATE2 Deterministic Deployment Proxy + // https://github.com/Arachnid/deterministic-deployment-proxy + address public constant NICK_CREATE2_DEPLOYER = 0x3fAB184622Dc19b6109349B94811493BF2a45362; + bytes public constant NICK_CREATE2_PAYLOAD = + hex"04f8a58085174876e800830186a08080b853604580600e600039806000f350fe7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe03601600081602082378035828234f58015156039578182fd5b8082525050506014600cf31ba02222222222222222222222222222222222222222222222222222222222222222a02222222222222222222222222222222222222222222222222222222222222222"; + + // ERC-2470 Singleton Factory + // https://eips.ethereum.org/EIPS/eip-2470 + address public constant ERC2470_DEPLOYER = 0xBb6e024b9cFFACB947A71991E386681B1Cd1477D; + bytes public constant ERC2470_PAYLOAD = + hex"04f9016c8085174876e8008303c4d88080b90154608060405234801561001057600080fd5b50610134806100206000396000f3fe6080604052348015600f57600080fd5b506004361060285760003560e01c80634af63f0214602d575b600080fd5b60cf60048036036040811015604157600080fd5b810190602081018135640100000000811115605b57600080fd5b820183602082011115606c57600080fd5b80359060200191846001830284011164010000000083111715608d57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550509135925060eb915050565b604080516001600160a01b039092168252519081900360200190f35b6000818351602085016000f5939250505056fea26469706673582212206b44f8a82cb6b156bfcc3dc6aadd6df4eefd204bc928a4397fd15dacf6d5320564736f6c634300060200331b83247000822470"; + + // Zoltu's CREATE2 Deterministic Deployment Proxy + // https://github.com/Zoltu/deterministic-deployment-proxy + address public constant ZOLTU_CREATE2_DEPLOYER = 0x4c8D290a1B368ac4728d83a9e8321fC3af2b39b1; + bytes public constant ZOLTU_CREATE2_PAYLOAD = + hex"04f87e8085174876e800830186a08080ad601f80600e600039806000f350fe60003681823780368234f58015156014578182fd5b80825250506014600cf31ba02222222222222222222222222222222222222222222222222222222222222222a02222222222222222222222222222222222222222222222222222222222222222"; + + // ERC-1820: Pseudo-introspection Registry Contract + // https://eips.ethereum.org/EIPS/eip-1820 + address public constant ERC1820_DEPLOYER = 0xa990077c3205cbDf861e17Fa532eeB069cE9fF96; + bytes public constant ERC1820_PAYLOAD = + hex"04f90a388085174876e800830c35008080b909e5608060405234801561001057600080fd5b506109c5806100206000396000f3fe608060405234801561001057600080fd5b50600436106100a5576000357c010000000000000000000000000000000000000000000000000000000090048063a41e7d5111610078578063a41e7d51146101d4578063aabbb8ca1461020a578063b705676514610236578063f712f3e814610280576100a5565b806329965a1d146100aa5780633d584063146100e25780635df8122f1461012457806365ba36c114610152575b600080fd5b6100e0600480360360608110156100c057600080fd5b50600160a060020a038135811691602081013591604090910135166102b6565b005b610108600480360360208110156100f857600080fd5b5035600160a060020a0316610570565b60408051600160a060020a039092168252519081900360200190f35b6100e06004803603604081101561013a57600080fd5b50600160a060020a03813581169160200135166105bc565b6101c26004803603602081101561016857600080fd5b81019060208101813564010000000081111561018357600080fd5b82018360208201111561019557600080fd5b803590602001918460018302840111640100000000831117156101b757600080fd5b5090925090506106b3565b60408051918252519081900360200190f35b6100e0600480360360408110156101ea57600080fd5b508035600160a060020a03169060200135600160e060020a0319166106ee565b6101086004803603604081101561022057600080fd5b50600160a060020a038135169060200135610778565b61026c6004803603604081101561024c57600080fd5b508035600160a060020a03169060200135600160e060020a0319166107ef565b604080519115158252519081900360200190f35b61026c6004803603604081101561029657600080fd5b508035600160a060020a03169060200135600160e060020a0319166108aa565b6000600160a060020a038416156102cd57836102cf565b335b9050336102db82610570565b600160a060020a031614610339576040805160e560020a62461bcd02815260206004820152600f60248201527f4e6f7420746865206d616e616765720000000000000000000000000000000000604482015290519081900360640190fd5b6103428361092a565b15610397576040805160e560020a62461bcd02815260206004820152601a60248201527f4d757374206e6f7420626520616e204552433136352068617368000000000000604482015290519081900360640190fd5b600160a060020a038216158015906103b85750600160a060020a0382163314155b156104ff5760405160200180807f455243313832305f4143434550545f4d4147494300000000000000000000000081525060140190506040516020818303038152906040528051906020012082600160a060020a031663249cb3fa85846040518363ffffffff167c01000000000000000000000000000000000000000000000000000000000281526004018083815260200182600160a060020a0316600160a060020a031681526020019250505060206040518083038186803b15801561047e57600080fd5b505afa158015610492573d6000803e3d6000fd5b505050506040513d60208110156104a857600080fd5b5051146104ff576040805160e560020a62461bcd02815260206004820181905260248201527f446f6573206e6f7420696d706c656d656e742074686520696e74657266616365604482015290519081900360640190fd5b600160a060020a03818116600081815260208181526040808320888452909152808220805473ffffffffffffffffffffffffffffffffffffffff19169487169485179055518692917f93baa6efbd2244243bfee6ce4cfdd1d04fc4c0e9a786abd3a41313bd352db15391a450505050565b600160a060020a03818116600090815260016020526040812054909116151561059a5750806105b7565b50600160a060020a03808216600090815260016020526040902054165b919050565b336105c683610570565b600160a060020a031614610624576040805160e560020a62461bcd02815260206004820152600f60248201527f4e6f7420746865206d616e616765720000000000000000000000000000000000604482015290519081900360640190fd5b81600160a060020a031681600160a060020a0316146106435780610646565b60005b600160a060020a03838116600081815260016020526040808220805473ffffffffffffffffffffffffffffffffffffffff19169585169590951790945592519184169290917f605c2dbf762e5f7d60a546d42e7205dcb1b011ebc62a61736a57c9089d3a43509190a35050565b600082826040516020018083838082843780830192505050925050506040516020818303038152906040528051906020012090505b92915050565b6106f882826107ef565b610703576000610705565b815b600160a060020a03928316600081815260208181526040808320600160e060020a031996909616808452958252808320805473ffffffffffffffffffffffffffffffffffffffff19169590971694909417909555908152600284528181209281529190925220805460ff19166001179055565b600080600160a060020a038416156107905783610792565b335b905061079d8361092a565b156107c357826107ad82826108aa565b6107b85760006107ba565b815b925050506106e8565b600160a060020a0390811660009081526020818152604080832086845290915290205416905092915050565b6000808061081d857f01ffc9a70000000000000000000000000000000000000000000000000000000061094c565b909250905081158061082d575080155b1561083d576000925050506106e8565b61084f85600160e060020a031961094c565b909250905081158061086057508015155b15610870576000925050506106e8565b61087a858561094c565b909250905060018214801561088f5750806001145b1561089f576001925050506106e8565b506000949350505050565b600160a060020a0382166000908152600260209081526040808320600160e060020a03198516845290915281205460ff1615156108f2576108eb83836107ef565b90506106e8565b50600160a060020a03808316600081815260208181526040808320600160e060020a0319871684529091529020549091161492915050565b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff161590565b6040517f01ffc9a7000000000000000000000000000000000000000000000000000000008082526004820183905260009182919060208160248189617530fa90519096909550935050505056fea165627a7a72305820377f4a2d4301ede9949f163f319021a6e9c687c292a5e2b2c4734c126b524e6c00291ba01820182018201820182018201820182018201820182018201820182018201820a01820182018201820182018201820182018201820182018201820182018201820"; + + uint256 internal constant GASLIMIT = 100_000; + uint256 internal constant MAXFEEPERGAS = 1_000_000_000; + + function _fundAndDeploy(IInbox inbox, uint256 _value, address _l2Address, bytes memory payload) + internal + { + uint256 submissionCost = inbox.calculateRetryableSubmissionFee(0, block.basefee); + inbox.createRetryableTicket{value: _value + submissionCost + GASLIMIT * MAXFEEPERGAS}({ + to: _l2Address, + l2CallValue: _value, + maxSubmissionCost: submissionCost, + excessFeeRefundAddress: msg.sender, + callValueRefundAddress: msg.sender, + gasLimit: GASLIMIT, + maxFeePerGas: MAXFEEPERGAS, + data: "" + }); + inbox.sendL2Message(payload); + } + + function perform(address _inbox) external payable { + IInbox inbox = IInbox(_inbox); + + _fundAndDeploy(inbox, 0.01 ether, NICK_CREATE2_DEPLOYER, NICK_CREATE2_PAYLOAD); + _fundAndDeploy(inbox, 0.0247 ether, ERC2470_DEPLOYER, ERC2470_PAYLOAD); + _fundAndDeploy(inbox, 0.01 ether, ZOLTU_CREATE2_DEPLOYER, ZOLTU_CREATE2_PAYLOAD); + _fundAndDeploy(inbox, 0.08 ether, ERC1820_DEPLOYER, ERC1820_PAYLOAD); + + payable(msg.sender).transfer(address(this).balance); + } +} From 74d8ba9fa7a3c2c789e394d68e763da58b4bb2af Mon Sep 17 00:00:00 2001 From: Goran Vladika Date: Tue, 5 Sep 2023 10:25:11 +0200 Subject: [PATCH 061/292] Deploy L2 factories using retryable tickets as part of rollup creation --- src/rollup/DeployHelper.sol | 33 +++++++++--- src/rollup/RollupCreator.sol | 88 ++++++++++++++++++++++++++------ test/foundry/RollupCreator.t.sol | 81 ++++++++++++++--------------- 3 files changed, 137 insertions(+), 65 deletions(-) diff --git a/src/rollup/DeployHelper.sol b/src/rollup/DeployHelper.sol index d794b880..26256f11 100644 --- a/src/rollup/DeployHelper.sol +++ b/src/rollup/DeployHelper.sol @@ -5,6 +5,7 @@ pragma solidity ^0.8.0; import {IInbox} from "../bridge/IInbox.sol"; +import {IInboxBase} from "../bridge/IInboxBase.sol"; /// @notice Helper contract for deploying some keyless deployment to Arbitrum using delayed inbox contract DeployHelper { @@ -13,33 +14,40 @@ contract DeployHelper { // Nick's CREATE2 Deterministic Deployment Proxy // https://github.com/Arachnid/deterministic-deployment-proxy address public constant NICK_CREATE2_DEPLOYER = 0x3fAB184622Dc19b6109349B94811493BF2a45362; + uint256 public constant NICK_CREATE2_VALUE = 0.01 ether; bytes public constant NICK_CREATE2_PAYLOAD = hex"04f8a58085174876e800830186a08080b853604580600e600039806000f350fe7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe03601600081602082378035828234f58015156039578182fd5b8082525050506014600cf31ba02222222222222222222222222222222222222222222222222222222222222222a02222222222222222222222222222222222222222222222222222222222222222"; // ERC-2470 Singleton Factory // https://eips.ethereum.org/EIPS/eip-2470 address public constant ERC2470_DEPLOYER = 0xBb6e024b9cFFACB947A71991E386681B1Cd1477D; + uint256 public constant ERC2470_VALUE = 0.0247 ether; bytes public constant ERC2470_PAYLOAD = hex"04f9016c8085174876e8008303c4d88080b90154608060405234801561001057600080fd5b50610134806100206000396000f3fe6080604052348015600f57600080fd5b506004361060285760003560e01c80634af63f0214602d575b600080fd5b60cf60048036036040811015604157600080fd5b810190602081018135640100000000811115605b57600080fd5b820183602082011115606c57600080fd5b80359060200191846001830284011164010000000083111715608d57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550509135925060eb915050565b604080516001600160a01b039092168252519081900360200190f35b6000818351602085016000f5939250505056fea26469706673582212206b44f8a82cb6b156bfcc3dc6aadd6df4eefd204bc928a4397fd15dacf6d5320564736f6c634300060200331b83247000822470"; // Zoltu's CREATE2 Deterministic Deployment Proxy // https://github.com/Zoltu/deterministic-deployment-proxy address public constant ZOLTU_CREATE2_DEPLOYER = 0x4c8D290a1B368ac4728d83a9e8321fC3af2b39b1; + uint256 public constant ZOLTU_VALUE = 0.01 ether; bytes public constant ZOLTU_CREATE2_PAYLOAD = hex"04f87e8085174876e800830186a08080ad601f80600e600039806000f350fe60003681823780368234f58015156014578182fd5b80825250506014600cf31ba02222222222222222222222222222222222222222222222222222222222222222a02222222222222222222222222222222222222222222222222222222222222222"; // ERC-1820: Pseudo-introspection Registry Contract // https://eips.ethereum.org/EIPS/eip-1820 address public constant ERC1820_DEPLOYER = 0xa990077c3205cbDf861e17Fa532eeB069cE9fF96; + uint256 public constant ERC1820_VALUE = 0.08 ether; bytes public constant ERC1820_PAYLOAD = hex"04f90a388085174876e800830c35008080b909e5608060405234801561001057600080fd5b506109c5806100206000396000f3fe608060405234801561001057600080fd5b50600436106100a5576000357c010000000000000000000000000000000000000000000000000000000090048063a41e7d5111610078578063a41e7d51146101d4578063aabbb8ca1461020a578063b705676514610236578063f712f3e814610280576100a5565b806329965a1d146100aa5780633d584063146100e25780635df8122f1461012457806365ba36c114610152575b600080fd5b6100e0600480360360608110156100c057600080fd5b50600160a060020a038135811691602081013591604090910135166102b6565b005b610108600480360360208110156100f857600080fd5b5035600160a060020a0316610570565b60408051600160a060020a039092168252519081900360200190f35b6100e06004803603604081101561013a57600080fd5b50600160a060020a03813581169160200135166105bc565b6101c26004803603602081101561016857600080fd5b81019060208101813564010000000081111561018357600080fd5b82018360208201111561019557600080fd5b803590602001918460018302840111640100000000831117156101b757600080fd5b5090925090506106b3565b60408051918252519081900360200190f35b6100e0600480360360408110156101ea57600080fd5b508035600160a060020a03169060200135600160e060020a0319166106ee565b6101086004803603604081101561022057600080fd5b50600160a060020a038135169060200135610778565b61026c6004803603604081101561024c57600080fd5b508035600160a060020a03169060200135600160e060020a0319166107ef565b604080519115158252519081900360200190f35b61026c6004803603604081101561029657600080fd5b508035600160a060020a03169060200135600160e060020a0319166108aa565b6000600160a060020a038416156102cd57836102cf565b335b9050336102db82610570565b600160a060020a031614610339576040805160e560020a62461bcd02815260206004820152600f60248201527f4e6f7420746865206d616e616765720000000000000000000000000000000000604482015290519081900360640190fd5b6103428361092a565b15610397576040805160e560020a62461bcd02815260206004820152601a60248201527f4d757374206e6f7420626520616e204552433136352068617368000000000000604482015290519081900360640190fd5b600160a060020a038216158015906103b85750600160a060020a0382163314155b156104ff5760405160200180807f455243313832305f4143434550545f4d4147494300000000000000000000000081525060140190506040516020818303038152906040528051906020012082600160a060020a031663249cb3fa85846040518363ffffffff167c01000000000000000000000000000000000000000000000000000000000281526004018083815260200182600160a060020a0316600160a060020a031681526020019250505060206040518083038186803b15801561047e57600080fd5b505afa158015610492573d6000803e3d6000fd5b505050506040513d60208110156104a857600080fd5b5051146104ff576040805160e560020a62461bcd02815260206004820181905260248201527f446f6573206e6f7420696d706c656d656e742074686520696e74657266616365604482015290519081900360640190fd5b600160a060020a03818116600081815260208181526040808320888452909152808220805473ffffffffffffffffffffffffffffffffffffffff19169487169485179055518692917f93baa6efbd2244243bfee6ce4cfdd1d04fc4c0e9a786abd3a41313bd352db15391a450505050565b600160a060020a03818116600090815260016020526040812054909116151561059a5750806105b7565b50600160a060020a03808216600090815260016020526040902054165b919050565b336105c683610570565b600160a060020a031614610624576040805160e560020a62461bcd02815260206004820152600f60248201527f4e6f7420746865206d616e616765720000000000000000000000000000000000604482015290519081900360640190fd5b81600160a060020a031681600160a060020a0316146106435780610646565b60005b600160a060020a03838116600081815260016020526040808220805473ffffffffffffffffffffffffffffffffffffffff19169585169590951790945592519184169290917f605c2dbf762e5f7d60a546d42e7205dcb1b011ebc62a61736a57c9089d3a43509190a35050565b600082826040516020018083838082843780830192505050925050506040516020818303038152906040528051906020012090505b92915050565b6106f882826107ef565b610703576000610705565b815b600160a060020a03928316600081815260208181526040808320600160e060020a031996909616808452958252808320805473ffffffffffffffffffffffffffffffffffffffff19169590971694909417909555908152600284528181209281529190925220805460ff19166001179055565b600080600160a060020a038416156107905783610792565b335b905061079d8361092a565b156107c357826107ad82826108aa565b6107b85760006107ba565b815b925050506106e8565b600160a060020a0390811660009081526020818152604080832086845290915290205416905092915050565b6000808061081d857f01ffc9a70000000000000000000000000000000000000000000000000000000061094c565b909250905081158061082d575080155b1561083d576000925050506106e8565b61084f85600160e060020a031961094c565b909250905081158061086057508015155b15610870576000925050506106e8565b61087a858561094c565b909250905060018214801561088f5750806001145b1561089f576001925050506106e8565b506000949350505050565b600160a060020a0382166000908152600260209081526040808320600160e060020a03198516845290915281205460ff1615156108f2576108eb83836107ef565b90506106e8565b50600160a060020a03808316600081815260208181526040808320600160e060020a0319871684529091529020549091161492915050565b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff161590565b6040517f01ffc9a7000000000000000000000000000000000000000000000000000000008082526004820183905260009182919060208160248189617530fa90519096909550935050505056fea165627a7a72305820377f4a2d4301ede9949f163f319021a6e9c687c292a5e2b2c4734c126b524e6c00291ba01820182018201820182018201820182018201820182018201820182018201820a01820182018201820182018201820182018201820182018201820182018201820"; uint256 internal constant GASLIMIT = 100_000; uint256 internal constant MAXFEEPERGAS = 1_000_000_000; - function _fundAndDeploy(IInbox inbox, uint256 _value, address _l2Address, bytes memory payload) - internal - { + function _fundAndDeploy( + IInbox inbox, + uint256 _value, + address _l2Address, + bytes memory payload + ) internal { uint256 submissionCost = inbox.calculateRetryableSubmissionFee(0, block.basefee); inbox.createRetryableTicket{value: _value + submissionCost + GASLIMIT * MAXFEEPERGAS}({ to: _l2Address, @@ -57,11 +65,22 @@ contract DeployHelper { function perform(address _inbox) external payable { IInbox inbox = IInbox(_inbox); - _fundAndDeploy(inbox, 0.01 ether, NICK_CREATE2_DEPLOYER, NICK_CREATE2_PAYLOAD); - _fundAndDeploy(inbox, 0.0247 ether, ERC2470_DEPLOYER, ERC2470_PAYLOAD); - _fundAndDeploy(inbox, 0.01 ether, ZOLTU_CREATE2_DEPLOYER, ZOLTU_CREATE2_PAYLOAD); - _fundAndDeploy(inbox, 0.08 ether, ERC1820_DEPLOYER, ERC1820_PAYLOAD); + _fundAndDeploy(inbox, NICK_CREATE2_VALUE, NICK_CREATE2_DEPLOYER, NICK_CREATE2_PAYLOAD); + _fundAndDeploy(inbox, ERC2470_VALUE, ERC2470_DEPLOYER, ERC2470_PAYLOAD); + _fundAndDeploy(inbox, ZOLTU_VALUE, ZOLTU_CREATE2_DEPLOYER, ZOLTU_CREATE2_PAYLOAD); + _fundAndDeploy(inbox, ERC1820_VALUE, ERC1820_DEPLOYER, ERC1820_PAYLOAD); payable(msg.sender).transfer(address(this).balance); } + + function getDeploymentTotalCost(IInboxBase inbox) external view returns (uint256) { + uint256 submissionCost = inbox.calculateRetryableSubmissionFee(0, block.basefee); + return + NICK_CREATE2_VALUE + + ERC2470_VALUE + + ZOLTU_VALUE + + ERC1820_VALUE + + 4 * + (submissionCost + GASLIMIT * MAXFEEPERGAS); + } } diff --git a/src/rollup/RollupCreator.sol b/src/rollup/RollupCreator.sol index 501581a7..fb6d00cc 100644 --- a/src/rollup/RollupCreator.sol +++ b/src/rollup/RollupCreator.sol @@ -11,6 +11,7 @@ import "@offchainlabs/upgrade-executor/src/IUpgradeExecutor.sol"; import "@openzeppelin/contracts/proxy/transparent/ProxyAdmin.sol"; import "@openzeppelin/contracts/proxy/transparent/TransparentUpgradeableProxy.sol"; import "@openzeppelin/contracts/access/Ownable.sol"; +import {DeployHelper} from "./DeployHelper.sol"; contract RollupCreator is Ownable { event RollupCreated( @@ -39,6 +40,8 @@ contract RollupCreator is Ownable { address public validatorUtils; address public validatorWalletCreator; + DeployHelper public l2FactoriesDeployer; + struct BridgeContracts { IBridge bridge; ISequencerInbox sequencerInbox; @@ -49,6 +52,9 @@ contract RollupCreator is Ownable { constructor() Ownable() {} + // creator receives back excess fees (for deploying L2 factories) so it can refund the caller + receive() external payable {} + function setTemplates( BridgeCreator _bridgeCreator, IOneStepProofEntry _osp, @@ -57,7 +63,8 @@ contract RollupCreator is Ownable { IRollupUser _rollupUserLogic, IUpgradeExecutor _upgradeExecutorLogic, address _validatorUtils, - address _validatorWalletCreator + address _validatorWalletCreator, + DeployHelper _l2FactoriesDeployer ) external onlyOwner { bridgeCreator = _bridgeCreator; osp = _osp; @@ -67,11 +74,12 @@ contract RollupCreator is Ownable { upgradeExecutorLogic = _upgradeExecutorLogic; validatorUtils = _validatorUtils; validatorWalletCreator = _validatorWalletCreator; + l2FactoriesDeployer = _l2FactoriesDeployer; emit TemplatesUpdated(); } /** - * @notice Create a new rollup + * @notice Create a new rollup and deploy L2 factories via retryable tickets * @dev After this setup: * @dev - Rollup should be the owner of bridge * @dev - RollupOwner should be the owner of Rollup's ProxyAdmin @@ -89,22 +97,36 @@ contract RollupCreator is Ownable { address _batchPoster, address[] calldata _validators, address _nativeToken - ) external returns (address) { + ) external payable returns (address) { + return createRollup(config, _batchPoster, _validators, _nativeToken, true); + } + + /** + * @notice Create a new rollup + * @dev After this setup: + * @dev - Rollup should be the owner of bridge + * @dev - RollupOwner should be the owner of Rollup's ProxyAdmin + * @dev - RollupOwner should be the owner of Rollup + * @dev - Bridge should have a single inbox and outbox + * @dev - Validators and batch poster should be set if provided + * @param config The configuration for the rollup + * @param _batchPoster The address of the batch poster, not used when set to zero address + * @param _validators The list of validator addresses, not used when set to empty list + * @param _nativeToken Address of the custom fee token used by rollup. If rollup is ETH-based address(0) should be provided + * @param _deployL2Factories Wether to deploy L2 factories using retryable tickets. If true, retryables need to be paid for in native currency. + * @return The address of the newly created rollup + */ + function createRollup( + Config memory config, + address _batchPoster, + address[] calldata _validators, + address _nativeToken, + bool _deployL2Factories + ) public payable returns (address) { ProxyAdmin proxyAdmin = new ProxyAdmin(); // deploy and init upgrade executor - IUpgradeExecutor upgradeExecutor = IUpgradeExecutor( - address( - new TransparentUpgradeableProxy( - address(upgradeExecutorLogic), - address(proxyAdmin), - bytes("") - ) - ) - ); - address[] memory executors = new address[](1); - executors[0] = config.owner; - upgradeExecutor.initialize(address(upgradeExecutor), executors); + address upgradeExecutor = _deployUpgradeExecutor(config.owner, proxyAdmin); // Create the rollup proxy to figure out the address and initialize it later RollupProxy rollup = new RollupProxy{salt: keccak256(abi.encode(config))}(); @@ -176,6 +198,10 @@ contract RollupCreator is Ownable { IRollupAdmin(address(rollup)).setOwner(address(upgradeExecutor)); + if (_deployL2Factories) { + _deployDeterministicFactoriesUsingEth(address(bridgeContracts.inbox)); + } + emit RollupCreated( address(rollup), _nativeToken, @@ -192,4 +218,36 @@ contract RollupCreator is Ownable { ); return address(rollup); } + + function _deployUpgradeExecutor(address rollupOwner, ProxyAdmin proxyAdmin) + internal + returns (address) + { + IUpgradeExecutor upgradeExecutor = IUpgradeExecutor( + address( + new TransparentUpgradeableProxy( + address(upgradeExecutorLogic), + address(proxyAdmin), + bytes("") + ) + ) + ); + address[] memory executors = new address[](1); + executors[0] = rollupOwner; + upgradeExecutor.initialize(address(upgradeExecutor), executors); + + return address(upgradeExecutor); + } + + function _deployDeterministicFactoriesUsingEth(address inbox) internal { + // we need to fund 4 retryable tickets + uint256 cost = l2FactoriesDeployer.getDeploymentTotalCost(IInbox(inbox)); + + // perform deployment + l2FactoriesDeployer.perform{value: cost}(inbox); + + // refund the caller + (bool sent, ) = msg.sender.call{value: address(this).balance}(""); + require(sent, "Refund failed"); + } } diff --git a/test/foundry/RollupCreator.t.sol b/test/foundry/RollupCreator.t.sol index e777d788..d12cd96b 100644 --- a/test/foundry/RollupCreator.t.sol +++ b/test/foundry/RollupCreator.t.sol @@ -15,6 +15,7 @@ import "../../src/osp/OneStepProverMath.sol"; import "../../src/osp/OneStepProverHostIo.sol"; import "../../src/osp/OneStepProofEntry.sol"; import "../../src/mocks/UpgradeExecutorMock.sol"; +import "../../src/rollup/DeployHelper.sol"; import "@openzeppelin/contracts/access/Ownable.sol"; import "@openzeppelin/contracts-upgradeable/access/AccessControlUpgradeable.sol"; import "@openzeppelin/contracts/token/ERC20/presets/ERC20PresetFixedSupply.sol"; @@ -25,6 +26,7 @@ contract RollupCreatorTest is Test { address public deployer = makeAddr("deployer"); IRollupAdmin public rollupAdmin; IRollupUser public rollupUser; + DeployHelper public deployHelper; /* solhint-disable func-name-mixedcase */ @@ -32,6 +34,7 @@ contract RollupCreatorTest is Test { //// deploy rollup creator and set templates vm.startPrank(deployer); rollupCreator = new RollupCreator(); + deployHelper = new DeployHelper(); // deploy BridgeCreators BridgeCreator bridgeCreator = new BridgeCreator(); @@ -57,7 +60,8 @@ contract RollupCreatorTest is Test { _rollupUser, upgradeExecutorLogic, address(new ValidatorUtils()), - address(new ValidatorWalletCreator()) + address(new ValidatorWalletCreator()), + deployHelper ); vm.stopPrank(); @@ -83,13 +87,20 @@ contract RollupCreatorTest is Test { sequencerInboxMaxTimeVariation: timeVars }); + // prepare funds + uint256 factoryDeploymentFunds = 1 ether; + vm.deal(deployer, factoryDeploymentFunds); + uint256 balanceBefore = deployer.balance; + /// deploy rollup address batchPoster = makeAddr("batch poster"); address[] memory validators = new address[](2); validators[0] = makeAddr("validator1"); validators[1] = makeAddr("validator2"); - address rollupAddress = - rollupCreator.createRollup(config, batchPoster, validators, address(0)); + + address rollupAddress = rollupCreator.createRollup{value: factoryDeploymentFunds}( + config, batchPoster, validators, address(0) + ); vm.stopPrank(); @@ -161,9 +172,7 @@ contract RollupCreatorTest is Test { // upgrade executor owns rollup assertEq( - IOwnable(rollupAddress).owner(), - upgradeExecutorExpectedAddress, - "Invalid rollup owner" + IOwnable(rollupAddress).owner(), upgradeExecutorExpectedAddress, "Invalid rollup owner" ); assertEq( _getProxyAdmin(rollupAddress), @@ -172,16 +181,18 @@ contract RollupCreatorTest is Test { ); // check rollupOwner has executor role - AccessControlUpgradeable executor = AccessControlUpgradeable( - upgradeExecutorExpectedAddress - ); + AccessControlUpgradeable executor = AccessControlUpgradeable(upgradeExecutorExpectedAddress); assertTrue( - executor.hasRole(keccak256("EXECUTOR_ROLE"), rollupOwner), - "Invalid executor role" + executor.hasRole(keccak256("EXECUTOR_ROLE"), rollupOwner), "Invalid executor role" ); + + // check funds are refunded + uint256 balanceAfter = deployer.balance; + uint256 factoryDeploymentCost = deployHelper.getDeploymentTotalCost(rollup.inbox()); + assertEq(balanceBefore - balanceAfter, factoryDeploymentCost, "Invalid balance"); } - function test_createErc20Rollup() public { + function test_createErc20Rollup() private { vm.startPrank(deployer); address nativeToken = address(new ERC20PresetFixedSupply("Appchain Token", "App", 1_000_000, address(this))); @@ -286,9 +297,7 @@ contract RollupCreatorTest is Test { // upgrade executor owns rollup assertEq( - IOwnable(rollupAddress).owner(), - upgradeExecutorExpectedAddress, - "Invalid rollup owner" + IOwnable(rollupAddress).owner(), upgradeExecutorExpectedAddress, "Invalid rollup owner" ); assertEq( _getProxyAdmin(rollupAddress), @@ -297,12 +306,9 @@ contract RollupCreatorTest is Test { ); // check rollupOwner has executor role - AccessControlUpgradeable executor = AccessControlUpgradeable( - upgradeExecutorExpectedAddress - ); + AccessControlUpgradeable executor = AccessControlUpgradeable(upgradeExecutorExpectedAddress); assertTrue( - executor.hasRole(keccak256("EXECUTOR_ROLE"), rollupOwner), - "Invalid executor role" + executor.hasRole(keccak256("EXECUTOR_ROLE"), rollupOwner), "Invalid executor role" ); } @@ -310,12 +316,8 @@ contract RollupCreatorTest is Test { vm.startPrank(deployer); // deployment params - ISequencerInbox.MaxTimeVariation memory timeVars = ISequencerInbox.MaxTimeVariation( - ((60 * 60 * 24) / 15), - 12, - 60 * 60 * 24, - 60 * 60 - ); + ISequencerInbox.MaxTimeVariation memory timeVars = + ISequencerInbox.MaxTimeVariation(((60 * 60 * 24) / 15), 12, 60 * 60 * 24, 60 * 60); Config memory config = Config({ confirmPeriodBlocks: 20, extraChallengeTimeBlocks: 200, @@ -330,16 +332,17 @@ contract RollupCreatorTest is Test { sequencerInboxMaxTimeVariation: timeVars }); + // prepare funds + uint256 factoryDeploymentFunds = 0.13 ether; + vm.deal(deployer, factoryDeploymentFunds); + /// deploy rollup address batchPoster = makeAddr("batch poster"); address[] memory validators = new address[](2); validators[0] = makeAddr("validator1"); validators[1] = makeAddr("validator2"); - address rollupAddress = rollupCreator.createRollup( - config, - batchPoster, - validators, - address(0) + address rollupAddress = rollupCreator.createRollup{value: factoryDeploymentFunds}( + config, batchPoster, validators, address(0) ); vm.stopPrank(); @@ -348,16 +351,12 @@ contract RollupCreatorTest is Test { RollupCore rollup = RollupCore(rollupAddress); address inbox = address(rollup.inbox()); address proxyAdmin = computeCreateAddress(address(rollupCreator), 1); - IUpgradeExecutor upgradeExecutor = IUpgradeExecutor( - computeCreateAddress(address(rollupCreator), 2) - ); + IUpgradeExecutor upgradeExecutor = + IUpgradeExecutor(computeCreateAddress(address(rollupCreator), 2)); Dummy newLogicImpl = new Dummy(); bytes memory data = abi.encodeWithSelector( - ProxyUpgradeAction.perform.selector, - address(proxyAdmin), - inbox, - address(newLogicImpl) + ProxyUpgradeAction.perform.selector, address(proxyAdmin), inbox, address(newLogicImpl) ); address upgradeAction = address(new ProxyUpgradeAction()); @@ -416,11 +415,7 @@ contract RollupCreatorTest is Test { } contract ProxyUpgradeAction { - function perform( - address admin, - address payable target, - address newLogic - ) public payable { + function perform(address admin, address payable target, address newLogic) public payable { ProxyAdmin(admin).upgrade(TransparentUpgradeableProxy(target), newLogic); } } From 45ce78d33ddc1855478ca7c46481d209705c45f7 Mon Sep 17 00:00:00 2001 From: gzeon Date: Wed, 6 Sep 2023 03:31:32 +0800 Subject: [PATCH 062/292] feat: configurable maxDataSize --- src/bridge/Bridge.sol | 6 +++++- src/bridge/IBridge.sol | 4 +++- src/bridge/Inbox.sol | 9 ++++----- src/bridge/SequencerInbox.sol | 4 ++-- src/libraries/Constants.sol | 3 --- src/mocks/BridgeStub.sol | 4 +++- src/rollup/BridgeCreator.sol | 5 +++-- src/rollup/Config.sol | 1 + src/rollup/RollupCreator.sol | 5 +++-- src/test-helpers/BridgeTester.sol | 5 ++++- test/contract/arbRollup.spec.ts | 1 + test/storage/Bridge.dot | 2 +- 12 files changed, 30 insertions(+), 19 deletions(-) diff --git a/src/bridge/Bridge.sol b/src/bridge/Bridge.sol index 31b41554..147aff04 100644 --- a/src/bridge/Bridge.sol +++ b/src/bridge/Bridge.sol @@ -56,11 +56,15 @@ contract Bridge is Initializable, DelegateCallAware, IBridge { uint256 public override sequencerReportedSubMessageCount; + // On L1 this should be set to 117964: 90% of Geth's 128KB tx size limit, leaving ~13KB for proving + uint256 public maxDataSize; + address internal constant EMPTY_ACTIVEOUTBOX = address(type(uint160).max); - function initialize(IOwnable rollup_) external initializer onlyDelegated { + function initialize(IOwnable rollup_, uint256 maxDataSize_) external initializer onlyDelegated { _activeOutbox = EMPTY_ACTIVEOUTBOX; rollup = rollup_; + maxDataSize = maxDataSize_; } modifier onlyRollupOrOwner() { diff --git a/src/bridge/IBridge.sol b/src/bridge/IBridge.sol index f1fff13c..5571b209 100644 --- a/src/bridge/IBridge.sol +++ b/src/bridge/IBridge.sol @@ -75,6 +75,8 @@ interface IBridge { function sequencerMessageCount() external view returns (uint256); + function maxDataSize() external view returns (uint256); + // ---------- onlySequencerInbox functions ---------- function enqueueSequencerMessage( @@ -111,5 +113,5 @@ interface IBridge { // ---------- initializer ---------- - function initialize(IOwnable rollup_) external; + function initialize(IOwnable rollup_, uint256 maxDataSize_) external; } diff --git a/src/bridge/Inbox.sol b/src/bridge/Inbox.sol index 9e718b66..30fee17c 100644 --- a/src/bridge/Inbox.sol +++ b/src/bridge/Inbox.sol @@ -35,7 +35,6 @@ import { L2MessageType_unsignedEOATx, L2MessageType_unsignedContractTx } from "../libraries/MessageTypes.sol"; -import {MAX_DATA_SIZE} from "../libraries/Constants.sol"; import "../precompiles/ArbSys.sol"; import "@openzeppelin/contracts-upgradeable/utils/AddressUpgradeable.sol"; @@ -136,8 +135,8 @@ contract Inbox is DelegateCallAware, PausableUpgradeable, IInbox { if (_chainIdChanged()) revert L1Forked(); // solhint-disable-next-line avoid-tx-origin if (msg.sender != tx.origin) revert NotOrigin(); - if (messageData.length > MAX_DATA_SIZE) - revert DataTooLarge(messageData.length, MAX_DATA_SIZE); + if (messageData.length > bridge.maxDataSize()) + revert DataTooLarge(messageData.length, bridge.maxDataSize()); uint256 msgNum = deliverToBridge(L2_MSG, msg.sender, keccak256(messageData)); emit InboxMessageDeliveredFromOrigin(msgNum); return msgNum; @@ -532,8 +531,8 @@ contract Inbox is DelegateCallAware, PausableUpgradeable, IInbox { address _sender, bytes memory _messageData ) internal returns (uint256) { - if (_messageData.length > MAX_DATA_SIZE) - revert DataTooLarge(_messageData.length, MAX_DATA_SIZE); + if (_messageData.length > bridge.maxDataSize()) + revert DataTooLarge(_messageData.length, bridge.maxDataSize()); uint256 msgNum = deliverToBridge(_kind, _sender, keccak256(_messageData)); emit InboxMessageDelivered(msgNum, _messageData); return msgNum; diff --git a/src/bridge/SequencerInbox.sol b/src/bridge/SequencerInbox.sol index 2ba25c16..cb36f944 100644 --- a/src/bridge/SequencerInbox.sol +++ b/src/bridge/SequencerInbox.sol @@ -34,7 +34,6 @@ import {L1MessageType_batchPostingReport} from "../libraries/MessageTypes.sol"; import {GasRefundEnabled, IGasRefunder} from "../libraries/IGasRefunder.sol"; import "../libraries/DelegateCallAware.sol"; import "../libraries/ArbitrumChecker.sol"; -import {MAX_DATA_SIZE} from "../libraries/Constants.sol"; /** * @title Accepts batches from the sequencer and adds them to the rollup inbox. @@ -310,7 +309,8 @@ contract SequencerInbox is DelegateCallAware, GasRefundEnabled, ISequencerInbox modifier validateBatchData(bytes calldata data) { uint256 fullDataLen = HEADER_LENGTH + data.length; - if (fullDataLen > MAX_DATA_SIZE) revert DataTooLarge(fullDataLen, MAX_DATA_SIZE); + if (fullDataLen > bridge.maxDataSize()) + revert DataTooLarge(fullDataLen, bridge.maxDataSize()); if (data.length > 0 && (data[0] & DATA_AUTHENTICATED_FLAG) == DATA_AUTHENTICATED_FLAG) { revert DataNotAuthenticated(); } diff --git a/src/libraries/Constants.sol b/src/libraries/Constants.sol index d15bdf16..c06c6144 100644 --- a/src/libraries/Constants.sol +++ b/src/libraries/Constants.sol @@ -4,9 +4,6 @@ pragma solidity ^0.8.4; -// 90% of Geth's 128KB tx size limit, leaving ~13KB for proving -uint256 constant MAX_DATA_SIZE = 117964; - uint64 constant NO_CHAL_INDEX = 0; // Expected seconds per block in Ethereum PoS diff --git a/src/mocks/BridgeStub.sol b/src/mocks/BridgeStub.sol index d0f9e8cc..797c63a9 100644 --- a/src/mocks/BridgeStub.sol +++ b/src/mocks/BridgeStub.sol @@ -31,6 +31,8 @@ contract BridgeStub is IBridge { address public sequencerInbox; uint256 public override sequencerReportedSubMessageCount; + uint256 public maxDataSize; + function setSequencerInbox(address _sequencerInbox) external override { sequencerInbox = _sequencerInbox; emit SequencerInboxUpdated(_sequencerInbox); @@ -176,7 +178,7 @@ contract BridgeStub is IBridge { function acceptFundsFromOldBridge() external payable {} - function initialize(IOwnable) external pure { + function initialize(IOwnable, uint256) external pure { revert("NOT_IMPLEMENTED"); } } diff --git a/src/rollup/BridgeCreator.sol b/src/rollup/BridgeCreator.sol index 1c2b60cd..00c15aaa 100644 --- a/src/rollup/BridgeCreator.sol +++ b/src/rollup/BridgeCreator.sol @@ -60,7 +60,8 @@ contract BridgeCreator is Ownable { function createBridge( address adminProxy, address rollup, - ISequencerInbox.MaxTimeVariation memory maxTimeVariation + ISequencerInbox.MaxTimeVariation memory maxTimeVariation, + uint256 maxDataSize ) external returns ( @@ -98,7 +99,7 @@ contract BridgeCreator is Ownable { ); } - frame.bridge.initialize(IOwnable(rollup)); + frame.bridge.initialize(IOwnable(rollup), maxDataSize); frame.sequencerInbox.initialize(IBridge(frame.bridge), maxTimeVariation); frame.inbox.initialize(IBridge(frame.bridge), ISequencerInbox(frame.sequencerInbox)); frame.rollupEventInbox.initialize(IBridge(frame.bridge)); diff --git a/src/rollup/Config.sol b/src/rollup/Config.sol index 269ecb5a..6886e8a1 100644 --- a/src/rollup/Config.sol +++ b/src/rollup/Config.sol @@ -26,6 +26,7 @@ struct Config { string chainConfig; uint64 genesisBlockNum; ISequencerInbox.MaxTimeVariation sequencerInboxMaxTimeVariation; + uint256 maxDataSize; } struct ContractDependencies { diff --git a/src/rollup/RollupCreator.sol b/src/rollup/RollupCreator.sol index 93cf0bb2..b8fd1d5b 100644 --- a/src/rollup/RollupCreator.sol +++ b/src/rollup/RollupCreator.sol @@ -74,7 +74,7 @@ contract RollupCreator is Ownable { function createRollup( Config memory config, address _batchPoster, - address[] calldata _validators + address[] memory _validators ) external returns (address) { ProxyAdmin proxyAdmin = new ProxyAdmin(); @@ -90,7 +90,8 @@ contract RollupCreator is Ownable { ) = bridgeCreator.createBridge( address(proxyAdmin), address(rollup), - config.sequencerInboxMaxTimeVariation + config.sequencerInboxMaxTimeVariation, + config.maxDataSize ); IChallengeManager challengeManager = IChallengeManager( diff --git a/src/test-helpers/BridgeTester.sol b/src/test-helpers/BridgeTester.sol index b355c51c..36e71937 100644 --- a/src/test-helpers/BridgeTester.sol +++ b/src/test-helpers/BridgeTester.sol @@ -45,6 +45,8 @@ contract BridgeTester is Initializable, DelegateCallAware, IBridge { IOwnable public rollup; address public sequencerInbox; + uint256 public maxDataSize; + modifier onlyRollupOrOwner() { if (msg.sender != address(rollup)) { address rollupOwner = rollup.owner(); @@ -68,9 +70,10 @@ contract BridgeTester is Initializable, DelegateCallAware, IBridge { address private constant EMPTY_ACTIVEOUTBOX = address(type(uint160).max); - function initialize(IOwnable rollup_) external initializer { + function initialize(IOwnable rollup_, uint256 maxDataSize_) external initializer { _activeOutbox = EMPTY_ACTIVEOUTBOX; rollup = rollup_; + maxDataSize = maxDataSize_; } function activeOutbox() public view returns (address) { diff --git a/test/contract/arbRollup.spec.ts b/test/contract/arbRollup.spec.ts index ba417541..ee759c60 100644 --- a/test/contract/arbRollup.spec.ts +++ b/test/contract/arbRollup.spec.ts @@ -99,6 +99,7 @@ async function getDefaultConfig( wasmModuleRoot: wasmModuleRoot, loserStakeEscrow: ZERO_ADDR, genesisBlockNum: 0, + maxDataSize: 117964, } } diff --git a/test/storage/Bridge.dot b/test/storage/Bridge.dot index e35ab1d8..3ce6b210 100644 --- a/test/storage/Bridge.dot +++ b/test/storage/Bridge.dot @@ -4,7 +4,7 @@ rankdir=LR color=black arrowhead=open node [shape=record, style=filled, fillcolor=gray95 fontname="Courier New"] -7 [label="Bridge \<\\>\n | {{ slot| 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 } | { type: \.variable (bytes) | { unallocated (30) | bool: Initializable._initializing (1) | bool: Initializable._initialized (1) } | { <5> mapping\(address=\>InOutInfo\): allowedDelayedInboxesMap (32) } | { <8> mapping\(address=\>InOutInfo\): allowedOutboxesMap (32) } | { <10> address[]: allowedDelayedInboxList (32) } | { <12> address[]: allowedOutboxList (32) } | { unallocated (12) | address: _activeOutbox (20) } | { <15> bytes32[]: delayedInboxAccs (32) } | { <17> bytes32[]: sequencerInboxAccs (32) } | { unallocated (12) | IOwnable: rollup (20) } | { unallocated (12) | address: sequencerInbox (20) } | { uint256: sequencerReportedSubMessageCount (32) }}}"] +7 [label="Bridge \<\\>\n | {{ slot| 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 } | { type: \.variable (bytes) | { unallocated (30) | bool: Initializable._initializing (1) | bool: Initializable._initialized (1) } | { <5> mapping\(address=\>InOutInfo\): allowedDelayedInboxesMap (32) } | { <8> mapping\(address=\>InOutInfo\): allowedOutboxesMap (32) } | { <10> address[]: allowedDelayedInboxList (32) } | { <12> address[]: allowedOutboxList (32) } | { unallocated (12) | address: _activeOutbox (20) } | { <15> bytes32[]: delayedInboxAccs (32) } | { <17> bytes32[]: sequencerInboxAccs (32) } | { unallocated (12) | IOwnable: rollup (20) } | { unallocated (12) | address: sequencerInbox (20) } | { uint256: sequencerReportedSubMessageCount (32) } | { uint256: maxDataSize (32) }}}"] 1 [label="InOutInfo \<\\>\n | {{ slot| 0 | 1 } | { type: variable (bytes) | { uint256: index (32) } | { unallocated (31) | bool: allowed (1) }}}"] From 6ebc4325ead4d8a05fff6ec37339caf7842ca662 Mon Sep 17 00:00:00 2001 From: Goran Vladika Date: Wed, 6 Sep 2023 09:11:52 +0200 Subject: [PATCH 063/292] Support paying for L2 factories in fee token --- src/rollup/DeployHelper.sol | 83 +++++++++++++++++++++++--------- src/rollup/RollupCreator.sol | 36 +++++++++----- test/foundry/RollupCreator.t.sol | 10 ++-- 3 files changed, 92 insertions(+), 37 deletions(-) diff --git a/src/rollup/DeployHelper.sol b/src/rollup/DeployHelper.sol index 26256f11..dabbf1fd 100644 --- a/src/rollup/DeployHelper.sol +++ b/src/rollup/DeployHelper.sol @@ -6,6 +6,8 @@ pragma solidity ^0.8.0; import {IInbox} from "../bridge/IInbox.sol"; import {IInboxBase} from "../bridge/IInboxBase.sol"; +import {IERC20Bridge} from "../bridge/IERC20Bridge.sol"; +import {IERC20Inbox} from "../bridge/ERC20Inbox.sol"; /// @notice Helper contract for deploying some keyless deployment to Arbitrum using delayed inbox contract DeployHelper { @@ -43,37 +45,74 @@ contract DeployHelper { uint256 internal constant MAXFEEPERGAS = 1_000_000_000; function _fundAndDeploy( - IInbox inbox, + address inbox, uint256 _value, address _l2Address, - bytes memory payload + bytes memory payload, + bool _isUsingFeeToken ) internal { - uint256 submissionCost = inbox.calculateRetryableSubmissionFee(0, block.basefee); - inbox.createRetryableTicket{value: _value + submissionCost + GASLIMIT * MAXFEEPERGAS}({ - to: _l2Address, - l2CallValue: _value, - maxSubmissionCost: submissionCost, - excessFeeRefundAddress: msg.sender, - callValueRefundAddress: msg.sender, - gasLimit: GASLIMIT, - maxFeePerGas: MAXFEEPERGAS, - data: "" - }); - inbox.sendL2Message(payload); + uint256 submissionCost = IInboxBase(inbox).calculateRetryableSubmissionFee( + 0, + block.basefee + ); + uint256 feeAmount = _value + submissionCost + GASLIMIT * MAXFEEPERGAS; + + // fund the target L2 address + if (_isUsingFeeToken) { + IERC20Inbox(inbox).createRetryableTicket({ + to: _l2Address, + l2CallValue: _value, + maxSubmissionCost: submissionCost, + excessFeeRefundAddress: msg.sender, + callValueRefundAddress: msg.sender, + gasLimit: GASLIMIT, + maxFeePerGas: MAXFEEPERGAS, + tokenTotalFeeAmount: feeAmount, + data: "" + }); + } else { + IInbox(inbox).createRetryableTicket{value: feeAmount}({ + to: _l2Address, + l2CallValue: _value, + maxSubmissionCost: submissionCost, + excessFeeRefundAddress: msg.sender, + callValueRefundAddress: msg.sender, + gasLimit: GASLIMIT, + maxFeePerGas: MAXFEEPERGAS, + data: "" + }); + } + // send L2 msg to execute deployment transaction + IInboxBase(inbox).sendL2Message(payload); } - function perform(address _inbox) external payable { - IInbox inbox = IInbox(_inbox); + function perform(address _inbox, address _nativeToken) external payable { + bool isUsingFeeToken = _nativeToken != address(0); - _fundAndDeploy(inbox, NICK_CREATE2_VALUE, NICK_CREATE2_DEPLOYER, NICK_CREATE2_PAYLOAD); - _fundAndDeploy(inbox, ERC2470_VALUE, ERC2470_DEPLOYER, ERC2470_PAYLOAD); - _fundAndDeploy(inbox, ZOLTU_VALUE, ZOLTU_CREATE2_DEPLOYER, ZOLTU_CREATE2_PAYLOAD); - _fundAndDeploy(inbox, ERC1820_VALUE, ERC1820_DEPLOYER, ERC1820_PAYLOAD); + _fundAndDeploy( + _inbox, + NICK_CREATE2_VALUE, + NICK_CREATE2_DEPLOYER, + NICK_CREATE2_PAYLOAD, + isUsingFeeToken + ); + _fundAndDeploy(_inbox, ERC2470_VALUE, ERC2470_DEPLOYER, ERC2470_PAYLOAD, isUsingFeeToken); + _fundAndDeploy( + _inbox, + ZOLTU_VALUE, + ZOLTU_CREATE2_DEPLOYER, + ZOLTU_CREATE2_PAYLOAD, + isUsingFeeToken + ); + _fundAndDeploy(_inbox, ERC1820_VALUE, ERC1820_DEPLOYER, ERC1820_PAYLOAD, isUsingFeeToken); - payable(msg.sender).transfer(address(this).balance); + // if paying with ETH refund the caller + if (!isUsingFeeToken) { + payable(msg.sender).transfer(address(this).balance); + } } - function getDeploymentTotalCost(IInboxBase inbox) external view returns (uint256) { + function getDeploymentTotalCost(IInboxBase inbox) public view returns (uint256) { uint256 submissionCost = inbox.calculateRetryableSubmissionFee(0, block.basefee); return NICK_CREATE2_VALUE + diff --git a/src/rollup/RollupCreator.sol b/src/rollup/RollupCreator.sol index fb6d00cc..72736b9f 100644 --- a/src/rollup/RollupCreator.sol +++ b/src/rollup/RollupCreator.sol @@ -12,8 +12,11 @@ import "@openzeppelin/contracts/proxy/transparent/ProxyAdmin.sol"; import "@openzeppelin/contracts/proxy/transparent/TransparentUpgradeableProxy.sol"; import "@openzeppelin/contracts/access/Ownable.sol"; import {DeployHelper} from "./DeployHelper.sol"; +import {SafeERC20, IERC20} from "@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol"; contract RollupCreator is Ownable { + using SafeERC20 for IERC20; + event RollupCreated( address indexed rollupAddress, address indexed nativeToken, @@ -113,7 +116,7 @@ contract RollupCreator is Ownable { * @param _batchPoster The address of the batch poster, not used when set to zero address * @param _validators The list of validator addresses, not used when set to empty list * @param _nativeToken Address of the custom fee token used by rollup. If rollup is ETH-based address(0) should be provided - * @param _deployL2Factories Wether to deploy L2 factories using retryable tickets. If true, retryables need to be paid for in native currency. + * @param _deployFactoriesToL2 Whether to deploy L2 factories using retryable tickets. If true, retryables need to be paid for in native currency. * @return The address of the newly created rollup */ function createRollup( @@ -121,7 +124,7 @@ contract RollupCreator is Ownable { address _batchPoster, address[] calldata _validators, address _nativeToken, - bool _deployL2Factories + bool _deployFactoriesToL2 ) public payable returns (address) { ProxyAdmin proxyAdmin = new ProxyAdmin(); @@ -198,8 +201,8 @@ contract RollupCreator is Ownable { IRollupAdmin(address(rollup)).setOwner(address(upgradeExecutor)); - if (_deployL2Factories) { - _deployDeterministicFactoriesUsingEth(address(bridgeContracts.inbox)); + if (_deployFactoriesToL2) { + _deployFactories(address(bridgeContracts.inbox), _nativeToken); } emit RollupCreated( @@ -239,15 +242,24 @@ contract RollupCreator is Ownable { return address(upgradeExecutor); } - function _deployDeterministicFactoriesUsingEth(address inbox) internal { - // we need to fund 4 retryable tickets - uint256 cost = l2FactoriesDeployer.getDeploymentTotalCost(IInbox(inbox)); + function _deployFactories(address _inbox, address _nativeToken) internal { + if (_nativeToken == address(0)) { + // we need to fund 4 retryable tickets + uint256 cost = l2FactoriesDeployer.getDeploymentTotalCost(IInboxBase(_inbox)); + + // do it + l2FactoriesDeployer.perform{value: cost}(_inbox, _nativeToken); - // perform deployment - l2FactoriesDeployer.perform{value: cost}(inbox); + // refund the caller + (bool sent, ) = msg.sender.call{value: address(this).balance}(""); + require(sent, "Refund failed"); + } else { + // Transfer fee token amount needed to pay for retryable fees to the inbox. + uint256 totalFee = l2FactoriesDeployer.getDeploymentTotalCost(IInboxBase(_inbox)); + IERC20(_nativeToken).safeTransferFrom(msg.sender, _inbox, totalFee); - // refund the caller - (bool sent, ) = msg.sender.call{value: address(this).balance}(""); - require(sent, "Refund failed"); + // do it + l2FactoriesDeployer.perform(_inbox, _nativeToken); + } } } diff --git a/test/foundry/RollupCreator.t.sol b/test/foundry/RollupCreator.t.sol index d12cd96b..4c9ef582 100644 --- a/test/foundry/RollupCreator.t.sol +++ b/test/foundry/RollupCreator.t.sol @@ -192,10 +192,10 @@ contract RollupCreatorTest is Test { assertEq(balanceBefore - balanceAfter, factoryDeploymentCost, "Invalid balance"); } - function test_createErc20Rollup() private { + function test_createErc20Rollup() public { vm.startPrank(deployer); address nativeToken = - address(new ERC20PresetFixedSupply("Appchain Token", "App", 1_000_000, address(this))); + address(new ERC20PresetFixedSupply("Appchain Token", "App", 1_000_000 ether, deployer)); // deployment params ISequencerInbox.MaxTimeVariation memory timeVars = @@ -214,6 +214,10 @@ contract RollupCreatorTest is Test { sequencerInboxMaxTimeVariation: timeVars }); + // approve fee token to pay for deployment of L2 factories + uint256 expectedCost = 0.1247 ether + 4 * (100_000 * 1_000_000_000); + IERC20(nativeToken).approve(address(rollupCreator), expectedCost); + /// deploy rollup address batchPoster = makeAddr("batch poster"); address[] memory validators = new address[](2); @@ -333,7 +337,7 @@ contract RollupCreatorTest is Test { }); // prepare funds - uint256 factoryDeploymentFunds = 0.13 ether; + uint256 factoryDeploymentFunds = 0.2 ether; vm.deal(deployer, factoryDeploymentFunds); /// deploy rollup From 20f8873997a0507cd5b03a9e66062e3ed8df561d Mon Sep 17 00:00:00 2001 From: Goran Vladika Date: Wed, 6 Sep 2023 09:56:11 +0200 Subject: [PATCH 064/292] Fix hardhat test --- test/contract/arbRollup.spec.ts | 16 +++++++++++++--- 1 file changed, 13 insertions(+), 3 deletions(-) diff --git a/test/contract/arbRollup.spec.ts b/test/contract/arbRollup.spec.ts index 8d0ad375..8b2c7a35 100644 --- a/test/contract/arbRollup.spec.ts +++ b/test/contract/arbRollup.spec.ts @@ -25,6 +25,7 @@ import { BridgeCreator__factory, ChallengeManager, ChallengeManager__factory, + DeployHelper__factory, OneStepProofEntry__factory, OneStepProver0__factory, OneStepProverHostIo__factory, @@ -178,6 +179,11 @@ const setup = async () => { )) as RollupCreator__factory const rollupCreator = await rollupCreatorFac.deploy() + const deployHelperFac = (await ethers.getContractFactory( + 'DeployHelper' + )) as DeployHelper__factory + const deployHelper = await deployHelperFac.deploy() + await rollupCreator.setTemplates( bridgeCreator.address, oneStepProofEntry.address, @@ -186,14 +192,18 @@ const setup = async () => { rollupUserLogicTemplate.address, upgradeExecutorLogic.address, ethers.constants.AddressZero, - ethers.constants.AddressZero + ethers.constants.AddressZero, + deployHelper.address ) - const response = await rollupCreator.createRollup( + const response = await rollupCreator[ + 'createRollup((uint64,uint64,address,uint256,bytes32,address,address,uint256,string,uint64,(uint256,uint256,uint256,uint256)),address,address[],address)' + ]( await getDefaultConfig(), await sequencer.getAddress(), [await val1.getAddress(), await val2.getAddress(), await val3.getAddress()], - ethers.constants.AddressZero + ethers.constants.AddressZero, + { value: ethers.utils.parseEther('0.2') } ) const rec = await response.wait() From 45ecd6b10d8797b90504e125f6fbdeda52d2e04f Mon Sep 17 00:00:00 2001 From: Goran Vladika Date: Wed, 6 Sep 2023 11:27:27 +0200 Subject: [PATCH 065/292] Update deployment scripts --- scripts/createERC20Rollup.ts | 9 +++------ scripts/deployment.ts | 9 ++++++++- scripts/rollupCreation.ts | 32 ++++++++++++++++++++++++++------ src/test-helpers/TestToken.sol | 16 ++++++++++++++++ test/foundry/RollupCreator.t.sol | 2 +- 5 files changed, 54 insertions(+), 14 deletions(-) create mode 100644 src/test-helpers/TestToken.sol diff --git a/scripts/createERC20Rollup.ts b/scripts/createERC20Rollup.ts index 842eb014..604fa17e 100644 --- a/scripts/createERC20Rollup.ts +++ b/scripts/createERC20Rollup.ts @@ -1,15 +1,12 @@ import { ethers } from 'hardhat' import '@nomiclabs/hardhat-ethers' import { Signer } from 'ethers' -import { ERC20PresetFixedSupply__factory } from '../build/types/factories/@openzeppelin/contracts/token/ERC20/presets/ERC20PresetFixedSupply__factory' import { createRollup } from './rollupCreation' +import { TestToken__factory } from '../build/types' async function deployERC20Token(deployer: Signer): Promise { - const factory = await new ERC20PresetFixedSupply__factory(deployer).deploy( - 'FeeToken', - 'FEE', - ethers.utils.parseEther('1000000000'), - await deployer.getAddress() + const factory = await new TestToken__factory(deployer).deploy( + ethers.utils.parseEther('1000000000') ) const feeToken = await factory.deployed() diff --git a/scripts/deployment.ts b/scripts/deployment.ts index 7097c15b..bad8e0b5 100644 --- a/scripts/deployment.ts +++ b/scripts/deployment.ts @@ -6,6 +6,7 @@ import { abi as UpgradeExecutorABI, bytecode as UpgradeExecutorBytecode, } from '@offchainlabs/upgrade-executor/build/contracts/src/UpgradeExecutor.sol/UpgradeExecutor.json' +import { sleep } from './testSetup' // Define a verification function async function verifyContract( @@ -95,6 +96,7 @@ async function deployAllContracts( signer ) const rollupCreator = await deployContract('RollupCreator', signer) + const deployHelper = await deployContract('DeployHelper', signer) return { bridgeCreator, prover0, @@ -109,6 +111,7 @@ async function deployAllContracts( validatorUtils, validatorWalletCreator, rollupCreator, + deployHelper, } } @@ -129,7 +132,8 @@ async function main() { contracts.rollupUser.address, contracts.upgradeExecutor.address, contracts.validatorUtils.address, - contracts.validatorWalletCreator.address + contracts.validatorWalletCreator.address, + contracts.deployHelper.address ) console.log('Template is set on the Rollup Creator') @@ -137,6 +141,9 @@ async function main() { const { bridge, sequencerInbox, inbox, outbox } = await contracts.bridgeCreator.ethBasedTemplates() + console.log('Wait a minute before starting contract verification') + await sleep(60 * 1000) + console.log(`"bridge implementation contract" created at address:`, bridge) await verifyContract('Bridge', bridge, [], 'src/bridge/Bridge.sol:Bridge') console.log( diff --git a/scripts/rollupCreation.ts b/scripts/rollupCreation.ts index 9eadb476..dab5b06a 100644 --- a/scripts/rollupCreation.ts +++ b/scripts/rollupCreation.ts @@ -3,6 +3,9 @@ import '@nomiclabs/hardhat-ethers' import { run } from 'hardhat' import { abi as rollupCreatorAbi } from '../build/contracts/src/rollup/RollupCreator.sol/RollupCreator.json' import { config } from './config' +import { BigNumber } from 'ethers' +import { IERC20__factory } from '../build/types' +import { sleep } from './testSetup' interface RollupCreatedEvent { event: string @@ -54,14 +57,29 @@ export async function createRollup(feeToken?: string) { for (let i = 0; i < config.validators.length; i++) { vals.push(true) } + + //// funds for deploying L2 factories + + // 0.13 ETH is enough to deploy L2 factories via retryables. Excess is refunded + let feeCost = ethers.utils.parseEther('0.13') + if (feeToken != ethers.constants.AddressZero) { + // in case fees are paid via fee token, then approve rollup cretor to spend required amount + await ( + await IERC20__factory.connect(feeToken, signer).approve( + rollupCreator.address, + feeCost + ) + ).wait() + feeCost = BigNumber.from(0) + } + // Call the createRollup function console.log('Calling createRollup to generate a new rollup ...') - const createRollupTx = await rollupCreator.createRollup( - config.rollupConfig, - config.batchPoster, - config.validators, - feeToken - ) + const createRollupTx = await rollupCreator[ + 'createRollup((uint64,uint64,address,uint256,bytes32,address,address,uint256,string,uint64,(uint256,uint256,uint256,uint256)),address,address[],address)' + ](config.rollupConfig, config.batchPoster, config.validators, feeToken, { + value: feeCost, + }) const createRollupReceipt = await createRollupTx.wait() const rollupCreatedEvent = createRollupReceipt.events?.find( @@ -86,6 +104,8 @@ export async function createRollup(feeToken?: string) { console.log("Congratulations! 🎉🎉🎉 All DONE! Here's your addresses:") console.log('RollupProxy Contract created at address:', rollupAddress) + console.log('Wait a minute before starting the contract verification') + await sleep(2 * 60 * 1000) console.log( `Attempting to verify Rollup contract at address ${rollupAddress}...` ) diff --git a/src/test-helpers/TestToken.sol b/src/test-helpers/TestToken.sol new file mode 100644 index 00000000..9a8cb39b --- /dev/null +++ b/src/test-helpers/TestToken.sol @@ -0,0 +1,16 @@ +// Copyright 2021-2022, Offchain Labs, Inc. +// For license information, see https://github.com/nitro/blob/master/LICENSE +// SPDX-License-Identifier: BUSL-1.1 + +pragma solidity ^0.8.0; + +import {ERC20} from "@openzeppelin/contracts/token/ERC20/ERC20.sol"; + +/** + * Basic ERC20 token + */ +contract TestToken is ERC20 { + constructor(uint256 initialSupply) ERC20("TestToken", "TT") { + _mint(msg.sender, initialSupply); + } +} diff --git a/test/foundry/RollupCreator.t.sol b/test/foundry/RollupCreator.t.sol index 4c9ef582..1cd4792e 100644 --- a/test/foundry/RollupCreator.t.sol +++ b/test/foundry/RollupCreator.t.sol @@ -215,7 +215,7 @@ contract RollupCreatorTest is Test { }); // approve fee token to pay for deployment of L2 factories - uint256 expectedCost = 0.1247 ether + 4 * (100_000 * 1_000_000_000); + uint256 expectedCost = 0.1247 ether + 4 * (1400 * 100_000_000_000 + 100_000 * 1_000_000_000); IERC20(nativeToken).approve(address(rollupCreator), expectedCost); /// deploy rollup From 07a0513e062eeb551298106520be1856b05d6508 Mon Sep 17 00:00:00 2001 From: gzeon Date: Thu, 7 Sep 2023 00:19:11 +0800 Subject: [PATCH 066/292] refactor: use immutable to store maxDataSize --- deploy/SequencerInbox.js | 2 +- deploy/SequencerInboxStubCreator.js | 2 +- scripts/config.ts.example | 4 ++++ scripts/deployment.ts | 5 ++++- scripts/rollupCreation.ts | 5 +++-- src/bridge/Bridge.sol | 6 +----- src/bridge/IBridge.sol | 4 +--- src/bridge/IInbox.sol | 2 ++ src/bridge/ISequencerInbox.sol | 2 ++ src/bridge/Inbox.sol | 13 +++++++++---- src/bridge/SequencerInbox.sol | 12 ++++++++---- src/mocks/BridgeStub.sol | 4 +--- src/mocks/InboxStub.sol | 5 +++++ src/mocks/SequencerInboxStub.sol | 5 +++-- src/rollup/BridgeCreator.sol | 11 +++++------ src/rollup/Config.sol | 1 - src/rollup/RollupCreator.sol | 16 +++++++++++++--- src/test-helpers/BridgeTester.sol | 5 +---- test/contract/arbRollup.spec.ts | 3 +-- test/storage/Bridge.dot | 2 +- 20 files changed, 66 insertions(+), 43 deletions(-) diff --git a/deploy/SequencerInbox.js b/deploy/SequencerInbox.js index 4c9ef912..b7cff199 100644 --- a/deploy/SequencerInbox.js +++ b/deploy/SequencerInbox.js @@ -3,7 +3,7 @@ module.exports = async hre => { const { deploy } = deployments const { deployer } = await getNamedAccounts() - await deploy('SequencerInbox', { from: deployer, args: [] }) + await deploy('SequencerInbox', { from: deployer, args: [117964] }) } module.exports.tags = ['SequencerInbox'] diff --git a/deploy/SequencerInboxStubCreator.js b/deploy/SequencerInboxStubCreator.js index 72ee8202..4748a924 100644 --- a/deploy/SequencerInboxStubCreator.js +++ b/deploy/SequencerInboxStubCreator.js @@ -12,7 +12,7 @@ module.exports = async hre => { } await deploy('SequencerInboxStub', { from: deployer, - args: [bridge.address, deployer, maxTime], + args: [bridge.address, deployer, maxTime, 117964], }) } diff --git a/scripts/config.ts.example b/scripts/config.ts.example index 7f911710..cf5d8704 100644 --- a/scripts/config.ts.example +++ b/scripts/config.ts.example @@ -1,5 +1,9 @@ import { ethers } from 'ethers' +// 90% of Geth's 128KB tx size limit, leaving ~13KB for proving +// This need to be adjusted for Orbit chains +export const maxDataSize = 117964 + export const config = { rollupConfig: { confirmPeriodBlocks: ethers.BigNumber.from('45818'), diff --git a/scripts/deployment.ts b/scripts/deployment.ts index 9a5bf94f..a43499d7 100644 --- a/scripts/deployment.ts +++ b/scripts/deployment.ts @@ -2,6 +2,7 @@ import { ethers } from 'hardhat' import { ContractFactory, Contract } from 'ethers' import '@nomiclabs/hardhat-ethers' import { run } from 'hardhat' +import { maxDataSize } from './config' // Define a verification function async function verifyContract( @@ -60,7 +61,9 @@ async function deployContract( async function deployAllContracts( signer: any ): Promise> { - const bridgeCreator = await deployContract('BridgeCreator', signer) + const bridgeCreator = await deployContract('BridgeCreator', signer, [ + maxDataSize, + ]) const prover0 = await deployContract('OneStepProver0', signer) const proverMem = await deployContract('OneStepProverMemory', signer) const proverMath = await deployContract('OneStepProverMath', signer) diff --git a/scripts/rollupCreation.ts b/scripts/rollupCreation.ts index 2c9af885..62a148f7 100644 --- a/scripts/rollupCreation.ts +++ b/scripts/rollupCreation.ts @@ -2,7 +2,7 @@ import { ethers } from 'hardhat' import '@nomiclabs/hardhat-ethers' import { run } from 'hardhat' import { abi as rollupCreatorAbi } from '../build/contracts/src/rollup/RollupCreator.sol/RollupCreator.json' -import { config } from './config' +import { config, maxDataSize } from './config' interface RollupCreatedEvent { event: string @@ -55,7 +55,8 @@ async function main() { const createRollupTx = await rollupCreator.createRollup( config.rollupConfig, config.batchPoster, - config.validators + config.validators, + maxDataSize ) const createRollupReceipt = await createRollupTx.wait() diff --git a/src/bridge/Bridge.sol b/src/bridge/Bridge.sol index 147aff04..31b41554 100644 --- a/src/bridge/Bridge.sol +++ b/src/bridge/Bridge.sol @@ -56,15 +56,11 @@ contract Bridge is Initializable, DelegateCallAware, IBridge { uint256 public override sequencerReportedSubMessageCount; - // On L1 this should be set to 117964: 90% of Geth's 128KB tx size limit, leaving ~13KB for proving - uint256 public maxDataSize; - address internal constant EMPTY_ACTIVEOUTBOX = address(type(uint160).max); - function initialize(IOwnable rollup_, uint256 maxDataSize_) external initializer onlyDelegated { + function initialize(IOwnable rollup_) external initializer onlyDelegated { _activeOutbox = EMPTY_ACTIVEOUTBOX; rollup = rollup_; - maxDataSize = maxDataSize_; } modifier onlyRollupOrOwner() { diff --git a/src/bridge/IBridge.sol b/src/bridge/IBridge.sol index 5571b209..f1fff13c 100644 --- a/src/bridge/IBridge.sol +++ b/src/bridge/IBridge.sol @@ -75,8 +75,6 @@ interface IBridge { function sequencerMessageCount() external view returns (uint256); - function maxDataSize() external view returns (uint256); - // ---------- onlySequencerInbox functions ---------- function enqueueSequencerMessage( @@ -113,5 +111,5 @@ interface IBridge { // ---------- initializer ---------- - function initialize(IOwnable rollup_, uint256 maxDataSize_) external; + function initialize(IOwnable rollup_) external; } diff --git a/src/bridge/IInbox.sol b/src/bridge/IInbox.sol index 95c3128c..bc97f64e 100644 --- a/src/bridge/IInbox.sol +++ b/src/bridge/IInbox.sol @@ -14,6 +14,8 @@ interface IInbox is IDelayedMessageProvider { function sequencerInbox() external view returns (ISequencerInbox); + function maxDataSize() external view returns (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 diff --git a/src/bridge/ISequencerInbox.sol b/src/bridge/ISequencerInbox.sol index 5f19471e..b4fadddb 100644 --- a/src/bridge/ISequencerInbox.sol +++ b/src/bridge/ISequencerInbox.sol @@ -71,6 +71,8 @@ interface ISequencerInbox is IDelayedMessageProvider { function isSequencer(address) external view returns (bool); + function maxDataSize() external view returns (uint256); + struct DasKeySetInfo { bool isValidKeyset; uint64 creationBlock; diff --git a/src/bridge/Inbox.sol b/src/bridge/Inbox.sol index 30fee17c..c4b84f64 100644 --- a/src/bridge/Inbox.sol +++ b/src/bridge/Inbox.sol @@ -95,8 +95,14 @@ contract Inbox is DelegateCallAware, PausableUpgradeable, IInbox { _; } + // On L1 this should be set to 117964: 90% of Geth's 128KB tx size limit, leaving ~13KB for proving + uint256 public immutable maxDataSize; uint256 internal immutable deployTimeChainId = block.chainid; + constructor(uint256 _maxDataSize) { + maxDataSize = _maxDataSize; + } + function _chainIdChanged() internal view returns (bool) { return deployTimeChainId != block.chainid; } @@ -135,8 +141,7 @@ contract Inbox is DelegateCallAware, PausableUpgradeable, IInbox { if (_chainIdChanged()) revert L1Forked(); // solhint-disable-next-line avoid-tx-origin if (msg.sender != tx.origin) revert NotOrigin(); - if (messageData.length > bridge.maxDataSize()) - revert DataTooLarge(messageData.length, bridge.maxDataSize()); + if (messageData.length > maxDataSize) revert DataTooLarge(messageData.length, maxDataSize); uint256 msgNum = deliverToBridge(L2_MSG, msg.sender, keccak256(messageData)); emit InboxMessageDeliveredFromOrigin(msgNum); return msgNum; @@ -531,8 +536,8 @@ contract Inbox is DelegateCallAware, PausableUpgradeable, IInbox { address _sender, bytes memory _messageData ) internal returns (uint256) { - if (_messageData.length > bridge.maxDataSize()) - revert DataTooLarge(_messageData.length, bridge.maxDataSize()); + if (_messageData.length > maxDataSize) + revert DataTooLarge(_messageData.length, maxDataSize); uint256 msgNum = deliverToBridge(_kind, _sender, keccak256(_messageData)); emit InboxMessageDelivered(msgNum, _messageData); return msgNum; diff --git a/src/bridge/SequencerInbox.sol b/src/bridge/SequencerInbox.sol index cb36f944..3fa44a94 100644 --- a/src/bridge/SequencerInbox.sol +++ b/src/bridge/SequencerInbox.sol @@ -64,13 +64,18 @@ contract SequencerInbox is DelegateCallAware, GasRefundEnabled, ISequencerInbox _; } - uint256 internal immutable deployTimeChainId = block.chainid; - mapping(address => bool) public isSequencer; + // On L1 this should be set to 117964: 90% of Geth's 128KB tx size limit, leaving ~13KB for proving + uint256 public immutable maxDataSize; + uint256 internal immutable deployTimeChainId = block.chainid; // If the chain this SequencerInbox is deployed on is an Arbitrum chain. bool internal immutable hostChainIsArbitrum = ArbitrumChecker.runningOnArbitrum(); + constructor(uint256 _maxDataSize) { + maxDataSize = _maxDataSize; + } + function _chainIdChanged() internal view returns (bool) { return deployTimeChainId != block.chainid; } @@ -309,8 +314,7 @@ contract SequencerInbox is DelegateCallAware, GasRefundEnabled, ISequencerInbox modifier validateBatchData(bytes calldata data) { uint256 fullDataLen = HEADER_LENGTH + data.length; - if (fullDataLen > bridge.maxDataSize()) - revert DataTooLarge(fullDataLen, bridge.maxDataSize()); + if (fullDataLen > maxDataSize) revert DataTooLarge(fullDataLen, maxDataSize); if (data.length > 0 && (data[0] & DATA_AUTHENTICATED_FLAG) == DATA_AUTHENTICATED_FLAG) { revert DataNotAuthenticated(); } diff --git a/src/mocks/BridgeStub.sol b/src/mocks/BridgeStub.sol index 797c63a9..d0f9e8cc 100644 --- a/src/mocks/BridgeStub.sol +++ b/src/mocks/BridgeStub.sol @@ -31,8 +31,6 @@ contract BridgeStub is IBridge { address public sequencerInbox; uint256 public override sequencerReportedSubMessageCount; - uint256 public maxDataSize; - function setSequencerInbox(address _sequencerInbox) external override { sequencerInbox = _sequencerInbox; emit SequencerInboxUpdated(_sequencerInbox); @@ -178,7 +176,7 @@ contract BridgeStub is IBridge { function acceptFundsFromOldBridge() external payable {} - function initialize(IOwnable, uint256) external pure { + function initialize(IOwnable) external pure { revert("NOT_IMPLEMENTED"); } } diff --git a/src/mocks/InboxStub.sol b/src/mocks/InboxStub.sol index a31f33ef..ab26c49e 100644 --- a/src/mocks/InboxStub.sol +++ b/src/mocks/InboxStub.sol @@ -22,6 +22,11 @@ contract InboxStub is IInbox { ISequencerInbox public override sequencerInbox; bool public paused; + uint256 public immutable maxDataSize; + + constructor() { + maxDataSize = 117964; + } function pause() external pure { revert("NOT IMPLEMENTED"); diff --git a/src/mocks/SequencerInboxStub.sol b/src/mocks/SequencerInboxStub.sol index c476043b..867064b9 100644 --- a/src/mocks/SequencerInboxStub.sol +++ b/src/mocks/SequencerInboxStub.sol @@ -11,8 +11,9 @@ contract SequencerInboxStub is SequencerInbox { constructor( IBridge bridge_, address sequencer_, - ISequencerInbox.MaxTimeVariation memory maxTimeVariation_ - ) { + ISequencerInbox.MaxTimeVariation memory maxTimeVariation_, + uint256 maxDataSize_ + ) SequencerInbox(maxDataSize_) { bridge = bridge_; rollup = IOwnable(msg.sender); maxTimeVariation = maxTimeVariation_; diff --git a/src/rollup/BridgeCreator.sol b/src/rollup/BridgeCreator.sol index 00c15aaa..153bff2d 100644 --- a/src/rollup/BridgeCreator.sol +++ b/src/rollup/BridgeCreator.sol @@ -24,10 +24,10 @@ contract BridgeCreator is Ownable { event TemplatesUpdated(); - constructor() Ownable() { + constructor(uint256 maxDataSize) Ownable() { bridgeTemplate = new Bridge(); - sequencerInboxTemplate = new SequencerInbox(); - inboxTemplate = new Inbox(); + sequencerInboxTemplate = new SequencerInbox(maxDataSize); + inboxTemplate = new Inbox(maxDataSize); rollupEventInboxTemplate = new RollupEventInbox(); outboxTemplate = new Outbox(); } @@ -60,8 +60,7 @@ contract BridgeCreator is Ownable { function createBridge( address adminProxy, address rollup, - ISequencerInbox.MaxTimeVariation memory maxTimeVariation, - uint256 maxDataSize + ISequencerInbox.MaxTimeVariation memory maxTimeVariation ) external returns ( @@ -99,7 +98,7 @@ contract BridgeCreator is Ownable { ); } - frame.bridge.initialize(IOwnable(rollup), maxDataSize); + frame.bridge.initialize(IOwnable(rollup)); frame.sequencerInbox.initialize(IBridge(frame.bridge), maxTimeVariation); frame.inbox.initialize(IBridge(frame.bridge), ISequencerInbox(frame.sequencerInbox)); frame.rollupEventInbox.initialize(IBridge(frame.bridge)); diff --git a/src/rollup/Config.sol b/src/rollup/Config.sol index 6886e8a1..269ecb5a 100644 --- a/src/rollup/Config.sol +++ b/src/rollup/Config.sol @@ -26,7 +26,6 @@ struct Config { string chainConfig; uint64 genesisBlockNum; ISequencerInbox.MaxTimeVariation sequencerInboxMaxTimeVariation; - uint256 maxDataSize; } struct ContractDependencies { diff --git a/src/rollup/RollupCreator.sol b/src/rollup/RollupCreator.sol index b8fd1d5b..6895a6b5 100644 --- a/src/rollup/RollupCreator.sol +++ b/src/rollup/RollupCreator.sol @@ -74,8 +74,19 @@ contract RollupCreator is Ownable { function createRollup( Config memory config, address _batchPoster, - address[] memory _validators + address[] memory _validators, + uint256 maxDataSize ) external returns (address) { + // Make sure the immutable maxDataSize is as expected + require( + maxDataSize == bridgeCreator.sequencerInboxTemplate().maxDataSize(), + "SI_MAX_DATA_SIZE_MISMATCH" + ); + require( + maxDataSize == bridgeCreator.inboxTemplate().maxDataSize(), + "I_MAX_DATA_SIZE_MISMATCH" + ); + ProxyAdmin proxyAdmin = new ProxyAdmin(); // Create the rollup proxy to figure out the address and initialize it later @@ -90,8 +101,7 @@ contract RollupCreator is Ownable { ) = bridgeCreator.createBridge( address(proxyAdmin), address(rollup), - config.sequencerInboxMaxTimeVariation, - config.maxDataSize + config.sequencerInboxMaxTimeVariation ); IChallengeManager challengeManager = IChallengeManager( diff --git a/src/test-helpers/BridgeTester.sol b/src/test-helpers/BridgeTester.sol index 36e71937..b355c51c 100644 --- a/src/test-helpers/BridgeTester.sol +++ b/src/test-helpers/BridgeTester.sol @@ -45,8 +45,6 @@ contract BridgeTester is Initializable, DelegateCallAware, IBridge { IOwnable public rollup; address public sequencerInbox; - uint256 public maxDataSize; - modifier onlyRollupOrOwner() { if (msg.sender != address(rollup)) { address rollupOwner = rollup.owner(); @@ -70,10 +68,9 @@ contract BridgeTester is Initializable, DelegateCallAware, IBridge { address private constant EMPTY_ACTIVEOUTBOX = address(type(uint160).max); - function initialize(IOwnable rollup_, uint256 maxDataSize_) external initializer { + function initialize(IOwnable rollup_) external initializer { _activeOutbox = EMPTY_ACTIVEOUTBOX; rollup = rollup_; - maxDataSize = maxDataSize_; } function activeOutbox() public view returns (address) { diff --git a/test/contract/arbRollup.spec.ts b/test/contract/arbRollup.spec.ts index ee759c60..6466305e 100644 --- a/test/contract/arbRollup.spec.ts +++ b/test/contract/arbRollup.spec.ts @@ -99,7 +99,6 @@ async function getDefaultConfig( wasmModuleRoot: wasmModuleRoot, loserStakeEscrow: ZERO_ADDR, genesisBlockNum: 0, - maxDataSize: 117964, } } @@ -160,7 +159,7 @@ const setup = async () => { const bridgeCreatorFac = (await ethers.getContractFactory( 'BridgeCreator' )) as BridgeCreator__factory - const bridgeCreator = await bridgeCreatorFac.deploy() + const bridgeCreator = await bridgeCreatorFac.deploy(117964) const rollupCreatorFac = (await ethers.getContractFactory( 'RollupCreator' diff --git a/test/storage/Bridge.dot b/test/storage/Bridge.dot index 3ce6b210..e35ab1d8 100644 --- a/test/storage/Bridge.dot +++ b/test/storage/Bridge.dot @@ -4,7 +4,7 @@ rankdir=LR color=black arrowhead=open node [shape=record, style=filled, fillcolor=gray95 fontname="Courier New"] -7 [label="Bridge \<\\>\n | {{ slot| 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 } | { type: \.variable (bytes) | { unallocated (30) | bool: Initializable._initializing (1) | bool: Initializable._initialized (1) } | { <5> mapping\(address=\>InOutInfo\): allowedDelayedInboxesMap (32) } | { <8> mapping\(address=\>InOutInfo\): allowedOutboxesMap (32) } | { <10> address[]: allowedDelayedInboxList (32) } | { <12> address[]: allowedOutboxList (32) } | { unallocated (12) | address: _activeOutbox (20) } | { <15> bytes32[]: delayedInboxAccs (32) } | { <17> bytes32[]: sequencerInboxAccs (32) } | { unallocated (12) | IOwnable: rollup (20) } | { unallocated (12) | address: sequencerInbox (20) } | { uint256: sequencerReportedSubMessageCount (32) } | { uint256: maxDataSize (32) }}}"] +7 [label="Bridge \<\\>\n | {{ slot| 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 } | { type: \.variable (bytes) | { unallocated (30) | bool: Initializable._initializing (1) | bool: Initializable._initialized (1) } | { <5> mapping\(address=\>InOutInfo\): allowedDelayedInboxesMap (32) } | { <8> mapping\(address=\>InOutInfo\): allowedOutboxesMap (32) } | { <10> address[]: allowedDelayedInboxList (32) } | { <12> address[]: allowedOutboxList (32) } | { unallocated (12) | address: _activeOutbox (20) } | { <15> bytes32[]: delayedInboxAccs (32) } | { <17> bytes32[]: sequencerInboxAccs (32) } | { unallocated (12) | IOwnable: rollup (20) } | { unallocated (12) | address: sequencerInbox (20) } | { uint256: sequencerReportedSubMessageCount (32) }}}"] 1 [label="InOutInfo \<\\>\n | {{ slot| 0 | 1 } | { type: variable (bytes) | { uint256: index (32) } | { unallocated (31) | bool: allowed (1) }}}"] From a614c32783eb82ec782256a448211f832b692844 Mon Sep 17 00:00:00 2001 From: gzeon Date: Thu, 7 Sep 2023 00:21:43 +0800 Subject: [PATCH 067/292] fix: contract verification --- scripts/deployment.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/scripts/deployment.ts b/scripts/deployment.ts index a43499d7..fccfd29f 100644 --- a/scripts/deployment.ts +++ b/scripts/deployment.ts @@ -139,12 +139,12 @@ async function main() { `"sequencerInbox implementation contract" created at address:`, sequencerInboxAddress ) - await verifyContract('SequencerInbox', sequencerInboxAddress, []) + await verifyContract('SequencerInbox', sequencerInboxAddress, [maxDataSize]) console.log( `"inbox implementation contract" created at address:`, inboxAddress ) - await verifyContract('Inbox', inboxAddress, []) + await verifyContract('Inbox', inboxAddress, [maxDataSize]) console.log( `"outbox implementation contract" created at address:`, outboxAddress From f618499ff0f6a52961cb8a543efd13f5c403d7bd Mon Sep 17 00:00:00 2001 From: gzeon Date: Thu, 7 Sep 2023 01:43:03 +0800 Subject: [PATCH 068/292] fix: missing maxDataSize --- test/contract/arbRollup.spec.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/test/contract/arbRollup.spec.ts b/test/contract/arbRollup.spec.ts index 6466305e..b54c78ec 100644 --- a/test/contract/arbRollup.spec.ts +++ b/test/contract/arbRollup.spec.ts @@ -179,7 +179,8 @@ const setup = async () => { const response = await rollupCreator.createRollup( await getDefaultConfig(), await sequencer.getAddress(), - [await val1.getAddress(), await val2.getAddress(), await val3.getAddress()] + [await val1.getAddress(), await val2.getAddress(), await val3.getAddress()], + 117964 ) const rec = await response.wait() From e90a8228fa655e070af5e22c490c0a18173f8992 Mon Sep 17 00:00:00 2001 From: gzeon Date: Thu, 7 Sep 2023 01:43:50 +0800 Subject: [PATCH 069/292] chore: ignore lib format --- .prettierignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.prettierignore b/.prettierignore index 44285698..ef523b61 100644 --- a/.prettierignore +++ b/.prettierignore @@ -5,3 +5,4 @@ coverage/** deployments/** src/lib/abi/** .nyc_output +lib/** From 116d6515349f01736b67ba3870ac6535d08150fd Mon Sep 17 00:00:00 2001 From: Goran Vladika Date: Mon, 11 Sep 2023 09:39:51 +0200 Subject: [PATCH 070/292] Add comment about deploying factories to L2 --- src/rollup/RollupCreator.sol | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/rollup/RollupCreator.sol b/src/rollup/RollupCreator.sol index 72736b9f..7692a200 100644 --- a/src/rollup/RollupCreator.sol +++ b/src/rollup/RollupCreator.sol @@ -117,6 +117,10 @@ contract RollupCreator is Ownable { * @param _validators The list of validator addresses, not used when set to empty list * @param _nativeToken Address of the custom fee token used by rollup. If rollup is ETH-based address(0) should be provided * @param _deployFactoriesToL2 Whether to deploy L2 factories using retryable tickets. If true, retryables need to be paid for in native currency. + * Deploying factories via retyrable tickets at rollup creation time is the most reliable method to do it since it + * doesn't require paying the L1 gas. If deployment is instead done directly via L2 TX, there is a risk of gas price + * spike which results in burned nonce 0. That would mean we permanently lost capability to deploy deterministic + * factory at expected canonical address. * @return The address of the newly created rollup */ function createRollup( From ab8accab612bfc8e24e39ab0239ebc7f4c35d1d2 Mon Sep 17 00:00:00 2001 From: Goran Vladika Date: Fri, 1 Sep 2023 10:55:58 +0200 Subject: [PATCH 071/292] Bump Hardhat version --- .github/workflows/contract-tests.yml | 2 +- package.json | 10 +- yarn.lock | 1527 ++++++++++++-------------- 3 files changed, 707 insertions(+), 832 deletions(-) diff --git a/.github/workflows/contract-tests.yml b/.github/workflows/contract-tests.yml index 61b0c747..2ae478ce 100644 --- a/.github/workflows/contract-tests.yml +++ b/.github/workflows/contract-tests.yml @@ -23,7 +23,7 @@ jobs: - name: Setup nodejs uses: actions/setup-node@v2 with: - node-version: '16' + node-version: '20' cache: 'yarn' cache-dependency-path: '**/yarn.lock' diff --git a/package.json b/package.json index a330b882..5300dcc6 100644 --- a/package.json +++ b/package.json @@ -51,17 +51,17 @@ "eslint-plugin-prettier": "^4.0.0", "ethereum-waffle": "^3.4.0", "ethers": "^5.5.2", - "hardhat": "^2.6.6", - "hardhat-deploy": "^0.11.4", - "hardhat-gas-reporter": "^1.0.8", + "hardhat": "^2.17.2", + "hardhat-deploy": "^0.11.37", + "hardhat-gas-reporter": "^1.0.9", "postinstall-postinstall": "^2.1.0", "prettier": "^2.5.1", "prettier-plugin-solidity": "^1.0.0-beta.19", "solhint": "^3.3.7", "solhint-plugin-prettier": "^0.0.5", - "solidity-coverage": "^0.7.20", - "tslint": "^6.1.3", + "solidity-coverage": "^0.8.4", "ts-node": "^10.4.0", + "tslint": "^6.1.3", "typechain": "^8.0.0", "typescript": "^4.5.4" }, diff --git a/yarn.lock b/yarn.lock index 824e092e..c9ef9432 100644 --- a/yarn.lock +++ b/yarn.lock @@ -28,6 +28,42 @@ chalk "^2.0.0" js-tokens "^4.0.0" +"@chainsafe/as-sha256@^0.3.1": + version "0.3.1" + resolved "https://registry.yarnpkg.com/@chainsafe/as-sha256/-/as-sha256-0.3.1.tgz#3639df0e1435cab03f4d9870cc3ac079e57a6fc9" + integrity sha512-hldFFYuf49ed7DAakWVXSJODuq3pzJEguD8tQ7h+sGkM18vja+OFoJI9krnGmgzyuZC2ETX0NOIcCTy31v2Mtg== + +"@chainsafe/persistent-merkle-tree@^0.4.2": + version "0.4.2" + resolved "https://registry.yarnpkg.com/@chainsafe/persistent-merkle-tree/-/persistent-merkle-tree-0.4.2.tgz#4c9ee80cc57cd3be7208d98c40014ad38f36f7ff" + integrity sha512-lLO3ihKPngXLTus/L7WHKaw9PnNJWizlOF1H9NNzHP6Xvh82vzg9F2bzkXhYIFshMZ2gTCEz8tq6STe7r5NDfQ== + dependencies: + "@chainsafe/as-sha256" "^0.3.1" + +"@chainsafe/persistent-merkle-tree@^0.5.0": + version "0.5.0" + resolved "https://registry.yarnpkg.com/@chainsafe/persistent-merkle-tree/-/persistent-merkle-tree-0.5.0.tgz#2b4a62c9489a5739dedd197250d8d2f5427e9f63" + integrity sha512-l0V1b5clxA3iwQLXP40zYjyZYospQLZXzBVIhhr9kDg/1qHZfzzHw0jj4VPBijfYCArZDlPkRi1wZaV2POKeuw== + dependencies: + "@chainsafe/as-sha256" "^0.3.1" + +"@chainsafe/ssz@^0.10.0": + version "0.10.2" + resolved "https://registry.yarnpkg.com/@chainsafe/ssz/-/ssz-0.10.2.tgz#c782929e1bb25fec66ba72e75934b31fd087579e" + integrity sha512-/NL3Lh8K+0q7A3LsiFq09YXS9fPE+ead2rr7vM2QK8PLzrNsw3uqrif9bpRX5UxgeRjM+vYi+boCM3+GM4ovXg== + dependencies: + "@chainsafe/as-sha256" "^0.3.1" + "@chainsafe/persistent-merkle-tree" "^0.5.0" + +"@chainsafe/ssz@^0.9.2": + version "0.9.4" + resolved "https://registry.yarnpkg.com/@chainsafe/ssz/-/ssz-0.9.4.tgz#696a8db46d6975b600f8309ad3a12f7c0e310497" + integrity sha512-77Qtg2N1ayqs4Bg/wvnWfg5Bta7iy7IRh8XqXh7oNMeP2HBbBwx8m6yTpA8p0EHItWPEBkgZd5S5/LSlp3GXuQ== + dependencies: + "@chainsafe/as-sha256" "^0.3.1" + "@chainsafe/persistent-merkle-tree" "^0.4.2" + case "^1.6.3" + "@cspotcode/source-map-consumer@0.8.0": version "0.8.0" resolved "https://registry.yarnpkg.com/@cspotcode/source-map-consumer/-/source-map-consumer-0.8.0.tgz#33bf4b7b39c178821606f669bbc447a6a629786b" @@ -124,98 +160,19 @@ patch-package "^6.2.2" postinstall-postinstall "^2.1.0" -"@ethereumjs/block@^3.5.0", "@ethereumjs/block@^3.6.0", "@ethereumjs/block@^3.6.2": - version "3.6.2" - resolved "https://registry.yarnpkg.com/@ethereumjs/block/-/block-3.6.2.tgz#63d1e26d0b7a7a3684fce920de6ebabec1e5b674" - integrity sha512-mOqYWwMlAZpYUEOEqt7EfMFuVL2eyLqWWIzcf4odn6QgXY8jBI2NhVuJncrMCKeMZrsJAe7/auaRRB6YcdH+Qw== - dependencies: - "@ethereumjs/common" "^2.6.3" - "@ethereumjs/tx" "^3.5.1" - ethereumjs-util "^7.1.4" - merkle-patricia-tree "^4.2.4" - -"@ethereumjs/blockchain@^5.5.0", "@ethereumjs/blockchain@^5.5.2": - version "5.5.2" - resolved "https://registry.yarnpkg.com/@ethereumjs/blockchain/-/blockchain-5.5.2.tgz#1848abd9dc1ee56acf8cec4c84304d7f4667d027" - integrity sha512-Jz26iJmmsQtngerW6r5BDFaew/f2mObLrRZo3rskLOx1lmtMZ8+TX/vJexmivrnWgmAsTdNWhlKUYY4thPhPig== - dependencies: - "@ethereumjs/block" "^3.6.2" - "@ethereumjs/common" "^2.6.3" - "@ethereumjs/ethash" "^1.1.0" - debug "^4.3.3" - ethereumjs-util "^7.1.4" - level-mem "^5.0.1" - lru-cache "^5.1.1" - semaphore-async-await "^1.5.1" - -"@ethereumjs/common@^2.3.0": - version "2.6.0" - resolved "https://registry.yarnpkg.com/@ethereumjs/common/-/common-2.6.0.tgz#feb96fb154da41ee2cc2c5df667621a440f36348" - integrity sha512-Cq2qS0FTu6O2VU1sgg+WyU9Ps0M6j/BEMHN+hRaECXCV/r0aI78u4N6p52QW/BDVhwWZpCdrvG8X7NJdzlpNUA== - dependencies: - crc-32 "^1.2.0" - ethereumjs-util "^7.1.3" - -"@ethereumjs/common@^2.4.0": - version "2.6.2" - resolved "https://registry.yarnpkg.com/@ethereumjs/common/-/common-2.6.2.tgz#eb006c9329c75c80f634f340dc1719a5258244df" - integrity sha512-vDwye5v0SVeuDky4MtKsu+ogkH2oFUV8pBKzH/eNBzT8oI91pKa8WyzDuYuxOQsgNgv5R34LfFDh2aaw3H4HbQ== - dependencies: - crc-32 "^1.2.0" - ethereumjs-util "^7.1.4" - -"@ethereumjs/common@^2.6.0", "@ethereumjs/common@^2.6.3": - version "2.6.3" - resolved "https://registry.yarnpkg.com/@ethereumjs/common/-/common-2.6.3.tgz#39ddece7300b336276bad6c02f6a9f1a082caa05" - integrity sha512-mQwPucDL7FDYIg9XQ8DL31CnIYZwGhU5hyOO5E+BMmT71G0+RHvIT5rIkLBirJEKxV6+Rcf9aEIY0kXInxUWpQ== - dependencies: - crc-32 "^1.2.0" - ethereumjs-util "^7.1.4" +"@ethereumjs/rlp@^4.0.1": + version "4.0.1" + resolved "https://registry.yarnpkg.com/@ethereumjs/rlp/-/rlp-4.0.1.tgz#626fabfd9081baab3d0a3074b0c7ecaf674aaa41" + integrity sha512-tqsQiBQDQdmPWE1xkkBq4rlSW5QZpLOUJ5RJh2/9fug+q9tnUhuZoVLk7s0scUIKTOzEtR72DFBXI4WiZcMpvw== -"@ethereumjs/ethash@^1.1.0": - version "1.1.0" - resolved "https://registry.yarnpkg.com/@ethereumjs/ethash/-/ethash-1.1.0.tgz#7c5918ffcaa9cb9c1dc7d12f77ef038c11fb83fb" - integrity sha512-/U7UOKW6BzpA+Vt+kISAoeDie1vAvY4Zy2KF5JJb+So7+1yKmJeJEHOGSnQIj330e9Zyl3L5Nae6VZyh2TJnAA== +"@ethereumjs/util@^8.1.0": + version "8.1.0" + resolved "https://registry.yarnpkg.com/@ethereumjs/util/-/util-8.1.0.tgz#299df97fb6b034e0577ce9f94c7d9d1004409ed4" + integrity sha512-zQ0IqbdX8FZ9aw11vP+dZkKDkS+kgIvQPHnSAXzP9pLu+Rfu3D3XEeLbicvoXJTYnhZiPmsZUxgdzXwNKxRPbA== dependencies: - "@ethereumjs/block" "^3.5.0" - "@types/levelup" "^4.3.0" - buffer-xor "^2.0.1" - ethereumjs-util "^7.1.1" - miller-rabin "^4.0.0" - -"@ethereumjs/tx@^3.2.1": - version "3.4.0" - resolved "https://registry.yarnpkg.com/@ethereumjs/tx/-/tx-3.4.0.tgz#7eb1947eefa55eb9cf05b3ca116fb7a3dbd0bce7" - integrity sha512-WWUwg1PdjHKZZxPPo274ZuPsJCWV3SqATrEKQP1n2DrVYVP1aZIYpo/mFaA0BDoE0tIQmBeimRCEA0Lgil+yYw== - dependencies: - "@ethereumjs/common" "^2.6.0" - ethereumjs-util "^7.1.3" - -"@ethereumjs/tx@^3.4.0", "@ethereumjs/tx@^3.5.1": - version "3.5.1" - resolved "https://registry.yarnpkg.com/@ethereumjs/tx/-/tx-3.5.1.tgz#8d941b83a602b4a89949c879615f7ea9a90e6671" - integrity sha512-xzDrTiu4sqZXUcaBxJ4n4W5FrppwxLxZB4ZDGVLtxSQR4lVuOnFR6RcUHdg1mpUhAPVrmnzLJpxaeXnPxIyhWA== - dependencies: - "@ethereumjs/common" "^2.6.3" - ethereumjs-util "^7.1.4" - -"@ethereumjs/vm@^5.6.0": - version "5.8.0" - resolved "https://registry.yarnpkg.com/@ethereumjs/vm/-/vm-5.8.0.tgz#c9055f96afc13dd7b72893b57fa20027effea6fe" - integrity sha512-mn2G2SX79QY4ckVvZUfxlNUpzwT2AEIkvgJI8aHoQaNYEHhH8rmdVDIaVVgz6//PjK52BZsK23afz+WvSR0Qqw== - dependencies: - "@ethereumjs/block" "^3.6.2" - "@ethereumjs/blockchain" "^5.5.2" - "@ethereumjs/common" "^2.6.3" - "@ethereumjs/tx" "^3.5.1" - async-eventemitter "^0.2.4" - core-js-pure "^3.0.1" - debug "^4.3.3" - ethereumjs-util "^7.1.4" - functional-red-black-tree "^1.0.1" - mcl-wasm "^0.7.1" - merkle-patricia-tree "^4.2.4" - rustbn.js "~0.2.0" + "@ethereumjs/rlp" "^4.0.1" + ethereum-cryptography "^2.0.0" + micro-ftch "^0.3.1" "@ethersproject/abi@5.0.0-beta.153": version "5.0.0-beta.153" @@ -232,22 +189,7 @@ "@ethersproject/properties" ">=5.0.0-beta.131" "@ethersproject/strings" ">=5.0.0-beta.130" -"@ethersproject/abi@5.0.7": - version "5.0.7" - resolved "https://registry.yarnpkg.com/@ethersproject/abi/-/abi-5.0.7.tgz#79e52452bd3ca2956d0e1c964207a58ad1a0ee7b" - integrity sha512-Cqktk+hSIckwP/W8O47Eef60VwmoSC/L3lY0+dIBhQPCNn9E4V7rwmm2aFrNRRDJfFlGuZ1khkQUOc3oBX+niw== - dependencies: - "@ethersproject/address" "^5.0.4" - "@ethersproject/bignumber" "^5.0.7" - "@ethersproject/bytes" "^5.0.4" - "@ethersproject/constants" "^5.0.4" - "@ethersproject/hash" "^5.0.4" - "@ethersproject/keccak256" "^5.0.3" - "@ethersproject/logger" "^5.0.5" - "@ethersproject/properties" "^5.0.3" - "@ethersproject/strings" "^5.0.4" - -"@ethersproject/abi@5.6.0", "@ethersproject/abi@^5.1.2", "@ethersproject/abi@^5.4.0", "@ethersproject/abi@^5.5.0": +"@ethersproject/abi@5.6.0", "@ethersproject/abi@^5.1.2", "@ethersproject/abi@^5.5.0": version "5.6.0" resolved "https://registry.yarnpkg.com/@ethersproject/abi/-/abi-5.6.0.tgz#ea07cbc1eec2374d32485679c12408005895e9f3" integrity sha512-AhVByTwdXCc2YQ20v300w6KVHle9g2OFc28ZAFCPnJyEpkv1xKXjZcSTgWOlv1i+0dqlgF8RCF2Rn2KC1t+1Vg== @@ -277,7 +219,7 @@ "@ethersproject/properties" "^5.6.0" "@ethersproject/strings" "^5.6.0" -"@ethersproject/abi@5.7.0", "@ethersproject/abi@^5.7.0": +"@ethersproject/abi@5.7.0", "@ethersproject/abi@^5.0.9", "@ethersproject/abi@^5.7.0": version "5.7.0" resolved "https://registry.yarnpkg.com/@ethersproject/abi/-/abi-5.7.0.tgz#b3f3e045bbbeed1af3947335c247ad625a44e449" integrity sha512-351ktp42TiRcYB3H1OP8yajPeAQstMW/yCFokj/AthP9bLHzQFPlOrxOcwYEDkUAICmOHljvN4K39OMTMUa9RA== @@ -318,7 +260,7 @@ "@ethersproject/transactions" "^5.7.0" "@ethersproject/web" "^5.7.0" -"@ethersproject/abstract-signer@5.6.0", "@ethersproject/abstract-signer@^5.4.1", "@ethersproject/abstract-signer@^5.5.0", "@ethersproject/abstract-signer@^5.6.0": +"@ethersproject/abstract-signer@5.6.0", "@ethersproject/abstract-signer@^5.6.0": version "5.6.0" resolved "https://registry.yarnpkg.com/@ethersproject/abstract-signer/-/abstract-signer-5.6.0.tgz#9cd7ae9211c2b123a3b29bf47aab17d4d016e3e7" integrity sha512-WOqnG0NJKtI8n0wWZPReHtaLkDByPL67tn4nBaDAhmVq8sjHTPbCdz4DRhVu/cfTOvfy9w3iq5QZ7BX7zw56BQ== @@ -340,7 +282,7 @@ "@ethersproject/logger" "^5.7.0" "@ethersproject/properties" "^5.7.0" -"@ethersproject/address@5.6.0", "@ethersproject/address@>=5.0.0-beta.128", "@ethersproject/address@^5.4.0", "@ethersproject/address@^5.5.0", "@ethersproject/address@^5.6.0": +"@ethersproject/address@5.6.0", "@ethersproject/address@>=5.0.0-beta.128", "@ethersproject/address@^5.6.0": version "5.6.0" resolved "https://registry.yarnpkg.com/@ethersproject/address/-/address-5.6.0.tgz#13c49836d73e7885fc148ad633afad729da25012" integrity sha512-6nvhYXjbXsHPS+30sHZ+U4VMagFC/9zAk6Gd/h3S21YW4+yfb0WfRtaAIZ4kfM4rrVwqiy284LP0GtL5HXGLxQ== @@ -362,17 +304,6 @@ "@ethersproject/logger" "^5.7.0" "@ethersproject/rlp" "^5.7.0" -"@ethersproject/address@^5.0.4": - version "5.5.0" - resolved "https://registry.yarnpkg.com/@ethersproject/address/-/address-5.5.0.tgz#bcc6f576a553f21f3dd7ba17248f81b473c9c78f" - integrity sha512-l4Nj0eWlTUh6ro5IbPTgbpT4wRbdH5l8CQf7icF7sb/SI3Nhd9Y9HzhonTSTi6CefI0necIw7LJqQPopPLZyWw== - dependencies: - "@ethersproject/bignumber" "^5.5.0" - "@ethersproject/bytes" "^5.5.0" - "@ethersproject/keccak256" "^5.5.0" - "@ethersproject/logger" "^5.5.0" - "@ethersproject/rlp" "^5.5.0" - "@ethersproject/base64@5.6.0", "@ethersproject/base64@^5.6.0": version "5.6.0" resolved "https://registry.yarnpkg.com/@ethersproject/base64/-/base64-5.6.0.tgz#a12c4da2a6fb86d88563216b0282308fc15907c9" @@ -403,7 +334,7 @@ "@ethersproject/bytes" "^5.7.0" "@ethersproject/properties" "^5.7.0" -"@ethersproject/bignumber@5.6.0", "@ethersproject/bignumber@>=5.0.0-beta.130", "@ethersproject/bignumber@^5.4.1", "@ethersproject/bignumber@^5.5.0", "@ethersproject/bignumber@^5.6.0": +"@ethersproject/bignumber@5.6.0", "@ethersproject/bignumber@>=5.0.0-beta.130", "@ethersproject/bignumber@^5.6.0": version "5.6.0" resolved "https://registry.yarnpkg.com/@ethersproject/bignumber/-/bignumber-5.6.0.tgz#116c81b075c57fa765a8f3822648cf718a8a0e26" integrity sha512-VziMaXIUHQlHJmkv1dlcd6GY2PmT0khtAqaMctCIDogxkrarMzA9L94KN1NeXqqOfFD6r0sJT3vCTOFSmZ07DA== @@ -421,16 +352,7 @@ "@ethersproject/logger" "^5.7.0" bn.js "^5.2.1" -"@ethersproject/bignumber@^5.0.7": - version "5.5.0" - resolved "https://registry.yarnpkg.com/@ethersproject/bignumber/-/bignumber-5.5.0.tgz#875b143f04a216f4f8b96245bde942d42d279527" - integrity sha512-6Xytlwvy6Rn3U3gKEc1vP7nR92frHkv6wtVr95LFR3jREXiCPzdWxKQ1cx4JGQBXxcguAwjA8murlYN2TSiEbg== - dependencies: - "@ethersproject/bytes" "^5.5.0" - "@ethersproject/logger" "^5.5.0" - bn.js "^4.11.9" - -"@ethersproject/bytes@5.6.1", "@ethersproject/bytes@>=5.0.0-beta.129", "@ethersproject/bytes@^5.4.0", "@ethersproject/bytes@^5.5.0", "@ethersproject/bytes@^5.6.0": +"@ethersproject/bytes@5.6.1", "@ethersproject/bytes@>=5.0.0-beta.129", "@ethersproject/bytes@^5.6.0": version "5.6.1" resolved "https://registry.yarnpkg.com/@ethersproject/bytes/-/bytes-5.6.1.tgz#24f916e411f82a8a60412344bf4a813b917eefe7" integrity sha512-NwQt7cKn5+ZE4uDn+X5RAXLp46E1chXoaMmrxAyA0rblpxz8t58lVkrHXoRIn0lz1joQElQ8410GqhTqMOwc6g== @@ -444,14 +366,7 @@ dependencies: "@ethersproject/logger" "^5.7.0" -"@ethersproject/bytes@^5.0.4": - version "5.5.0" - resolved "https://registry.yarnpkg.com/@ethersproject/bytes/-/bytes-5.5.0.tgz#cb11c526de657e7b45d2e0f0246fb3b9d29a601c" - integrity sha512-ABvc7BHWhZU9PNM/tANm/Qx4ostPGadAuQzWTr3doklZOhDlmcBqclrQe/ZXUIj3K8wC28oYeuRa+A37tX9kog== - dependencies: - "@ethersproject/logger" "^5.5.0" - -"@ethersproject/constants@5.6.0", "@ethersproject/constants@>=5.0.0-beta.128", "@ethersproject/constants@^5.4.0", "@ethersproject/constants@^5.5.0", "@ethersproject/constants@^5.6.0": +"@ethersproject/constants@5.6.0", "@ethersproject/constants@>=5.0.0-beta.128", "@ethersproject/constants@^5.6.0": version "5.6.0" resolved "https://registry.yarnpkg.com/@ethersproject/constants/-/constants-5.6.0.tgz#55e3eb0918584d3acc0688e9958b0cedef297088" integrity sha512-SrdaJx2bK0WQl23nSpV/b1aq293Lh0sUaZT/yYKPDKn4tlAbkH96SPJwIhwSwTsoQQZxuh1jnqsKwyymoiBdWA== @@ -465,14 +380,7 @@ dependencies: "@ethersproject/bignumber" "^5.7.0" -"@ethersproject/constants@^5.0.4": - version "5.5.0" - resolved "https://registry.yarnpkg.com/@ethersproject/constants/-/constants-5.5.0.tgz#d2a2cd7d94bd1d58377d1d66c4f53c9be4d0a45e" - integrity sha512-2MsRRVChkvMWR+GyMGY4N1sAX9Mt3J9KykCsgUFd/1mwS0UH1qw+Bv9k1UJb3X3YJYFco9H20pjSlOIfCG5HYQ== - dependencies: - "@ethersproject/bignumber" "^5.5.0" - -"@ethersproject/contracts@5.6.0", "@ethersproject/contracts@^5.4.1": +"@ethersproject/contracts@5.6.0": version "5.6.0" resolved "https://registry.yarnpkg.com/@ethersproject/contracts/-/contracts-5.6.0.tgz#60f2cfc7addd99a865c6c8cfbbcec76297386067" integrity sha512-74Ge7iqTDom0NX+mux8KbRUeJgu1eHZ3iv6utv++sLJG80FVuU9HnHeKVPfjd9s3woFhaFoQGf3B3iH/FrQmgw== @@ -488,7 +396,7 @@ "@ethersproject/properties" "^5.6.0" "@ethersproject/transactions" "^5.6.0" -"@ethersproject/contracts@5.7.0": +"@ethersproject/contracts@5.7.0", "@ethersproject/contracts@^5.7.0": version "5.7.0" resolved "https://registry.yarnpkg.com/@ethersproject/contracts/-/contracts-5.7.0.tgz#c305e775abd07e48aa590e1a877ed5c316f8bd1e" integrity sha512-5GJbzEU3X+d33CdfPhcyS+z8MzsTrBGk/sc+G+59+tPa9yFkl6HQ9D6L0QMgNTA9q8dT0XKxxkyp883XsQvbbg== @@ -533,20 +441,6 @@ "@ethersproject/properties" "^5.7.0" "@ethersproject/strings" "^5.7.0" -"@ethersproject/hash@^5.0.4": - version "5.5.0" - resolved "https://registry.yarnpkg.com/@ethersproject/hash/-/hash-5.5.0.tgz#7cee76d08f88d1873574c849e0207dcb32380cc9" - integrity sha512-dnGVpK1WtBjmnp3mUT0PlU2MpapnwWI0PibldQEq1408tQBAbZpPidkWoVVuNMOl/lISO3+4hXZWCL3YV7qzfg== - dependencies: - "@ethersproject/abstract-signer" "^5.5.0" - "@ethersproject/address" "^5.5.0" - "@ethersproject/bignumber" "^5.5.0" - "@ethersproject/bytes" "^5.5.0" - "@ethersproject/keccak256" "^5.5.0" - "@ethersproject/logger" "^5.5.0" - "@ethersproject/properties" "^5.5.0" - "@ethersproject/strings" "^5.5.0" - "@ethersproject/hdnode@5.6.0", "@ethersproject/hdnode@^5.6.0": version "5.6.0" resolved "https://registry.yarnpkg.com/@ethersproject/hdnode/-/hdnode-5.6.0.tgz#9dcbe8d629bbbcf144f2cae476337fe92d320998" @@ -621,7 +515,7 @@ aes-js "3.0.0" scrypt-js "3.0.1" -"@ethersproject/keccak256@5.6.0", "@ethersproject/keccak256@>=5.0.0-beta.127", "@ethersproject/keccak256@^5.5.0", "@ethersproject/keccak256@^5.6.0": +"@ethersproject/keccak256@5.6.0", "@ethersproject/keccak256@>=5.0.0-beta.127", "@ethersproject/keccak256@^5.6.0": version "5.6.0" resolved "https://registry.yarnpkg.com/@ethersproject/keccak256/-/keccak256-5.6.0.tgz#fea4bb47dbf8f131c2e1774a1cecbfeb9d606459" integrity sha512-tk56BJ96mdj/ksi7HWZVWGjCq0WVl/QvfhFQNeL8fxhBlGoP+L80uDCiQcpJPd+2XxkivS3lwRm3E0CXTfol0w== @@ -637,15 +531,7 @@ "@ethersproject/bytes" "^5.7.0" js-sha3 "0.8.0" -"@ethersproject/keccak256@^5.0.3": - version "5.5.0" - resolved "https://registry.yarnpkg.com/@ethersproject/keccak256/-/keccak256-5.5.0.tgz#e4b1f9d7701da87c564ffe336f86dcee82983492" - integrity sha512-5VoFCTjo2rYbBe1l2f4mccaRFN/4VQEYFwwn04aJV2h7qf4ZvI2wFxUE1XOX+snbwCLRzIeikOqtAoPwMza9kg== - dependencies: - "@ethersproject/bytes" "^5.5.0" - js-sha3 "0.8.0" - -"@ethersproject/logger@5.6.0", "@ethersproject/logger@>=5.0.0-beta.129", "@ethersproject/logger@^5.5.0", "@ethersproject/logger@^5.6.0": +"@ethersproject/logger@5.6.0", "@ethersproject/logger@>=5.0.0-beta.129", "@ethersproject/logger@^5.6.0": version "5.6.0" resolved "https://registry.yarnpkg.com/@ethersproject/logger/-/logger-5.6.0.tgz#d7db1bfcc22fd2e4ab574cba0bb6ad779a9a3e7a" integrity sha512-BiBWllUROH9w+P21RzoxJKzqoqpkyM1pRnEKG69bulE9TSQD8SAIvTQqIMZmmCO8pUNkgLP1wndX1gKghSpBmg== @@ -655,11 +541,6 @@ resolved "https://registry.yarnpkg.com/@ethersproject/logger/-/logger-5.7.0.tgz#6ce9ae168e74fecf287be17062b590852c311892" integrity sha512-0odtFdXu/XHtjQXJYA3u9G0G8btm0ND5Cu8M7i5vhEcE8/HmF4Lbdqanwyv4uQTr2tx6b7fQRmgLrsnpQlmnig== -"@ethersproject/logger@^5.0.5": - version "5.5.0" - resolved "https://registry.yarnpkg.com/@ethersproject/logger/-/logger-5.5.0.tgz#0c2caebeff98e10aefa5aef27d7441c7fd18cf5d" - integrity sha512-rIY/6WPm7T8n3qS2vuHTUBPdXHl+rGxWxW5okDfo9J4Z0+gRRZT0msvUdIJkE4/HS29GUMziwGaaKO2bWONBrg== - "@ethersproject/networks@5.6.1": version "5.6.1" resolved "https://registry.yarnpkg.com/@ethersproject/networks/-/networks-5.6.1.tgz#7a21ed1f83e86121737b16841961ec99ccf5c9c7" @@ -681,6 +562,13 @@ dependencies: "@ethersproject/logger" "^5.7.0" +"@ethersproject/networks@5.7.1": + version "5.7.1" + resolved "https://registry.yarnpkg.com/@ethersproject/networks/-/networks-5.7.1.tgz#118e1a981d757d45ccea6bb58d9fd3d9db14ead6" + integrity sha512-n/MufjFYv3yFcUyfhnXotyDlNdFb7onmkSy8aQERi2PjNcnWQ66xXxa3XlS8nCcA8aJKJjIIMNJTC7tu80GwpQ== + dependencies: + "@ethersproject/logger" "^5.7.0" + "@ethersproject/pbkdf2@5.6.0", "@ethersproject/pbkdf2@^5.6.0": version "5.6.0" resolved "https://registry.yarnpkg.com/@ethersproject/pbkdf2/-/pbkdf2-5.6.0.tgz#04fcc2d7c6bff88393f5b4237d906a192426685a" @@ -697,7 +585,7 @@ "@ethersproject/bytes" "^5.7.0" "@ethersproject/sha2" "^5.7.0" -"@ethersproject/properties@5.6.0", "@ethersproject/properties@>=5.0.0-beta.131", "@ethersproject/properties@^5.5.0", "@ethersproject/properties@^5.6.0": +"@ethersproject/properties@5.6.0", "@ethersproject/properties@>=5.0.0-beta.131", "@ethersproject/properties@^5.6.0": version "5.6.0" resolved "https://registry.yarnpkg.com/@ethersproject/properties/-/properties-5.6.0.tgz#38904651713bc6bdd5bdd1b0a4287ecda920fa04" integrity sha512-szoOkHskajKePTJSZ46uHUWWkbv7TzP2ypdEK6jGMqJaEt2sb0jCgfBo0gH0m2HBpRixMuJ6TBRaQCF7a9DoCg== @@ -711,14 +599,7 @@ dependencies: "@ethersproject/logger" "^5.7.0" -"@ethersproject/properties@^5.0.3": - version "5.5.0" - resolved "https://registry.yarnpkg.com/@ethersproject/properties/-/properties-5.5.0.tgz#61f00f2bb83376d2071baab02245f92070c59995" - integrity sha512-l3zRQg3JkD8EL3CPjNK5g7kMx4qSwiR60/uk5IVjd3oq1MZR5qUg40CNOoEJoX5wc3DyY5bt9EbMk86C7x0DNA== - dependencies: - "@ethersproject/logger" "^5.5.0" - -"@ethersproject/providers@5.6.2", "@ethersproject/providers@^5.4.4": +"@ethersproject/providers@5.6.2": version "5.6.2" resolved "https://registry.yarnpkg.com/@ethersproject/providers/-/providers-5.6.2.tgz#b9807b1c8c6f59fa2ee4b3cf6519724d07a9f422" integrity sha512-6/EaFW/hNWz+224FXwl8+HdMRzVHt8DpPmu5MZaIQqx/K/ELnC9eY236SMV7mleCM3NnEArFwcAAxH5kUUgaRg== @@ -794,6 +675,32 @@ bech32 "1.1.4" ws "7.4.6" +"@ethersproject/providers@5.7.2", "@ethersproject/providers@^5.7.1", "@ethersproject/providers@^5.7.2": + version "5.7.2" + resolved "https://registry.yarnpkg.com/@ethersproject/providers/-/providers-5.7.2.tgz#f8b1a4f275d7ce58cf0a2eec222269a08beb18cb" + integrity sha512-g34EWZ1WWAVgr4aptGlVBF8mhl3VWjv+8hoAnzStu8Ah22VHBsuGzP17eb6xDVRzw895G4W7vvx60lFFur/1Rg== + dependencies: + "@ethersproject/abstract-provider" "^5.7.0" + "@ethersproject/abstract-signer" "^5.7.0" + "@ethersproject/address" "^5.7.0" + "@ethersproject/base64" "^5.7.0" + "@ethersproject/basex" "^5.7.0" + "@ethersproject/bignumber" "^5.7.0" + "@ethersproject/bytes" "^5.7.0" + "@ethersproject/constants" "^5.7.0" + "@ethersproject/hash" "^5.7.0" + "@ethersproject/logger" "^5.7.0" + "@ethersproject/networks" "^5.7.0" + "@ethersproject/properties" "^5.7.0" + "@ethersproject/random" "^5.7.0" + "@ethersproject/rlp" "^5.7.0" + "@ethersproject/sha2" "^5.7.0" + "@ethersproject/strings" "^5.7.0" + "@ethersproject/transactions" "^5.7.0" + "@ethersproject/web" "^5.7.0" + bech32 "1.1.4" + ws "7.4.6" + "@ethersproject/random@5.6.0", "@ethersproject/random@^5.6.0": version "5.6.0" resolved "https://registry.yarnpkg.com/@ethersproject/random/-/random-5.6.0.tgz#1505d1ab6a250e0ee92f436850fa3314b2cb5ae6" @@ -810,7 +717,7 @@ "@ethersproject/bytes" "^5.7.0" "@ethersproject/logger" "^5.7.0" -"@ethersproject/rlp@5.6.0", "@ethersproject/rlp@^5.5.0", "@ethersproject/rlp@^5.6.0": +"@ethersproject/rlp@5.6.0", "@ethersproject/rlp@^5.6.0": version "5.6.0" resolved "https://registry.yarnpkg.com/@ethersproject/rlp/-/rlp-5.6.0.tgz#55a7be01c6f5e64d6e6e7edb6061aa120962a717" integrity sha512-dz9WR1xpcTL+9DtOT/aDO+YyxSSdO8YIS0jyZwHHSlAmnxA6cKU3TrTd4Xc/bHayctxTgGLYNuVVoiXE4tTq1g== @@ -868,7 +775,7 @@ elliptic "6.5.4" hash.js "1.1.7" -"@ethersproject/solidity@5.6.0", "@ethersproject/solidity@^5.4.0": +"@ethersproject/solidity@5.6.0": version "5.6.0" resolved "https://registry.yarnpkg.com/@ethersproject/solidity/-/solidity-5.6.0.tgz#64657362a596bf7f5630bdc921c07dd78df06dc3" integrity sha512-YwF52vTNd50kjDzqKaoNNbC/r9kMDPq3YzDWmsjFTRBcIF1y4JCQJ8gB30wsTfHbaxgxelI5BfxQSxD/PbJOww== @@ -880,7 +787,7 @@ "@ethersproject/sha2" "^5.6.0" "@ethersproject/strings" "^5.6.0" -"@ethersproject/solidity@5.7.0": +"@ethersproject/solidity@5.7.0", "@ethersproject/solidity@^5.7.0": version "5.7.0" resolved "https://registry.yarnpkg.com/@ethersproject/solidity/-/solidity-5.7.0.tgz#5e9c911d8a2acce2a5ebb48a5e2e0af20b631cb8" integrity sha512-HmabMd2Dt/raavyaGukF4XxizWKhKQ24DoLtdNbBmNKUOPqwjsKQSdV9GQtj9CBEea9DlzETlVER1gYeXXBGaA== @@ -892,7 +799,7 @@ "@ethersproject/sha2" "^5.7.0" "@ethersproject/strings" "^5.7.0" -"@ethersproject/strings@5.6.0", "@ethersproject/strings@>=5.0.0-beta.130", "@ethersproject/strings@^5.5.0", "@ethersproject/strings@^5.6.0": +"@ethersproject/strings@5.6.0", "@ethersproject/strings@>=5.0.0-beta.130", "@ethersproject/strings@^5.6.0": version "5.6.0" resolved "https://registry.yarnpkg.com/@ethersproject/strings/-/strings-5.6.0.tgz#9891b26709153d996bf1303d39a7f4bc047878fd" integrity sha512-uv10vTtLTZqrJuqBZR862ZQjTIa724wGPWQqZrofaPI/kUsf53TBG0I0D+hQ1qyNtllbNzaW+PDPHHUI6/65Mg== @@ -910,16 +817,7 @@ "@ethersproject/constants" "^5.7.0" "@ethersproject/logger" "^5.7.0" -"@ethersproject/strings@^5.0.4": - version "5.5.0" - resolved "https://registry.yarnpkg.com/@ethersproject/strings/-/strings-5.5.0.tgz#e6784d00ec6c57710755699003bc747e98c5d549" - integrity sha512-9fy3TtF5LrX/wTrBaT8FGE6TDJyVjOvXynXJz5MT5azq+E6D92zuKNx7i29sWW2FjVOaWjAsiZ1ZWznuduTIIQ== - dependencies: - "@ethersproject/bytes" "^5.5.0" - "@ethersproject/constants" "^5.5.0" - "@ethersproject/logger" "^5.5.0" - -"@ethersproject/transactions@5.6.0", "@ethersproject/transactions@^5.0.0-beta.135", "@ethersproject/transactions@^5.4.0", "@ethersproject/transactions@^5.6.0": +"@ethersproject/transactions@5.6.0", "@ethersproject/transactions@^5.0.0-beta.135", "@ethersproject/transactions@^5.6.0": version "5.6.0" resolved "https://registry.yarnpkg.com/@ethersproject/transactions/-/transactions-5.6.0.tgz#4b594d73a868ef6e1529a2f8f94a785e6791ae4e" integrity sha512-4HX+VOhNjXHZyGzER6E/LVI2i6lf9ejYeWD6l4g50AdmimyuStKc39kvKf1bXWQMg7QNVh+uC7dYwtaZ02IXeg== @@ -967,7 +865,7 @@ "@ethersproject/constants" "^5.7.0" "@ethersproject/logger" "^5.7.0" -"@ethersproject/wallet@5.6.0", "@ethersproject/wallet@^5.4.0": +"@ethersproject/wallet@5.6.0": version "5.6.0" resolved "https://registry.yarnpkg.com/@ethersproject/wallet/-/wallet-5.6.0.tgz#33d11a806d783864208f348709a5a3badac8e22a" integrity sha512-qMlSdOSTyp0MBeE+r7SUhr1jjDlC1zAXB8VD84hCnpijPQiSNbxr6GdiLXxpUs8UKzkDiNYYC5DRI3MZr+n+tg== @@ -988,7 +886,7 @@ "@ethersproject/transactions" "^5.6.0" "@ethersproject/wordlists" "^5.6.0" -"@ethersproject/wallet@5.7.0": +"@ethersproject/wallet@5.7.0", "@ethersproject/wallet@^5.7.0": version "5.7.0" resolved "https://registry.yarnpkg.com/@ethersproject/wallet/-/wallet-5.7.0.tgz#4e5d0790d96fe21d61d38fb40324e6c7ef350b2d" integrity sha512-MhmXlJXEJFBFVKrDLB4ZdDzxcBxQ3rLyCkhNqVu3CDYvR97E+8r01UgrI+TI99Le+aYm/in/0vp86guJuM7FCA== @@ -1031,6 +929,17 @@ "@ethersproject/properties" "^5.7.0" "@ethersproject/strings" "^5.7.0" +"@ethersproject/web@5.7.1": + version "5.7.1" + resolved "https://registry.yarnpkg.com/@ethersproject/web/-/web-5.7.1.tgz#de1f285b373149bee5928f4eb7bcb87ee5fbb4ae" + integrity sha512-Gueu8lSvyjBWL4cYsWsjh6MtMwM0+H4HvqFPZfB6dV8ctbP9zFAO73VG1cMWae0FLPCtz0peKPpZY8/ugJJX2w== + dependencies: + "@ethersproject/base64" "^5.7.0" + "@ethersproject/bytes" "^5.7.0" + "@ethersproject/logger" "^5.7.0" + "@ethersproject/properties" "^5.7.0" + "@ethersproject/strings" "^5.7.0" + "@ethersproject/wordlists@5.6.0", "@ethersproject/wordlists@^5.6.0": version "5.6.0" resolved "https://registry.yarnpkg.com/@ethersproject/wordlists/-/wordlists-5.6.0.tgz#79e62c5276e091d8575f6930ba01a29218ded032" @@ -1088,11 +997,28 @@ tweetnacl "^1.0.3" tweetnacl-util "^0.15.1" +"@noble/curves@1.1.0", "@noble/curves@~1.1.0": + version "1.1.0" + resolved "https://registry.yarnpkg.com/@noble/curves/-/curves-1.1.0.tgz#f13fc667c89184bc04cccb9b11e8e7bae27d8c3d" + integrity sha512-091oBExgENk/kGj3AZmtBDMpxQPDtxQABR2B9lb1JbVTs6ytdzZNwvhxQ4MWasRNEzlbEH8jCWFCwhF/Obj5AA== + dependencies: + "@noble/hashes" "1.3.1" + "@noble/hashes@1.0.0", "@noble/hashes@~1.0.0": version "1.0.0" resolved "https://registry.yarnpkg.com/@noble/hashes/-/hashes-1.0.0.tgz#d5e38bfbdaba174805a4e649f13be9a9ed3351ae" integrity sha512-DZVbtY62kc3kkBtMHqwCOfXrT/hnoORy5BJ4+HU1IR59X0KWAOqsfzQPcUl/lQLlG7qXbe/fZ3r/emxtAl+sqg== +"@noble/hashes@1.3.1": + version "1.3.1" + resolved "https://registry.yarnpkg.com/@noble/hashes/-/hashes-1.3.1.tgz#8831ef002114670c603c458ab8b11328406953a9" + integrity sha512-EbqwksQwz9xDRGfDST86whPBgM65E0OH/pCgqW0GBVzO22bNE+NuIbeTb714+IfSjU3aRk47EUvXIb5bTsenKA== + +"@noble/hashes@~1.3.0", "@noble/hashes@~1.3.1": + version "1.3.2" + resolved "https://registry.yarnpkg.com/@noble/hashes/-/hashes-1.3.2.tgz#6f26dbc8fbc7205873ce3cee2f690eba0d421b39" + integrity sha512-MVC8EAQp7MvEcm30KWENFjgR+Mkmf+D189XJTkFIlwohU5hcBbn1ZkKq7KVTi2Hme3PMGF390DaL52beVrIihQ== + "@noble/secp256k1@1.5.5", "@noble/secp256k1@~1.5.2": version "1.5.5" resolved "https://registry.yarnpkg.com/@noble/secp256k1/-/secp256k1-1.5.5.tgz#315ab5745509d1a8c8e90d0bdf59823ccf9bcfc3" @@ -1119,6 +1045,206 @@ "@nodelib/fs.scandir" "2.1.5" fastq "^1.6.0" +"@nomicfoundation/ethereumjs-block@5.0.2": + version "5.0.2" + resolved "https://registry.yarnpkg.com/@nomicfoundation/ethereumjs-block/-/ethereumjs-block-5.0.2.tgz#13a7968f5964f1697da941281b7f7943b0465d04" + integrity sha512-hSe6CuHI4SsSiWWjHDIzWhSiAVpzMUcDRpWYzN0T9l8/Rz7xNn3elwVOJ/tAyS0LqL6vitUD78Uk7lQDXZun7Q== + dependencies: + "@nomicfoundation/ethereumjs-common" "4.0.2" + "@nomicfoundation/ethereumjs-rlp" "5.0.2" + "@nomicfoundation/ethereumjs-trie" "6.0.2" + "@nomicfoundation/ethereumjs-tx" "5.0.2" + "@nomicfoundation/ethereumjs-util" "9.0.2" + ethereum-cryptography "0.1.3" + ethers "^5.7.1" + +"@nomicfoundation/ethereumjs-blockchain@7.0.2": + version "7.0.2" + resolved "https://registry.yarnpkg.com/@nomicfoundation/ethereumjs-blockchain/-/ethereumjs-blockchain-7.0.2.tgz#45323b673b3d2fab6b5008535340d1b8fea7d446" + integrity sha512-8UUsSXJs+MFfIIAKdh3cG16iNmWzWC/91P40sazNvrqhhdR/RtGDlFk2iFTGbBAZPs2+klZVzhRX8m2wvuvz3w== + dependencies: + "@nomicfoundation/ethereumjs-block" "5.0.2" + "@nomicfoundation/ethereumjs-common" "4.0.2" + "@nomicfoundation/ethereumjs-ethash" "3.0.2" + "@nomicfoundation/ethereumjs-rlp" "5.0.2" + "@nomicfoundation/ethereumjs-trie" "6.0.2" + "@nomicfoundation/ethereumjs-tx" "5.0.2" + "@nomicfoundation/ethereumjs-util" "9.0.2" + abstract-level "^1.0.3" + debug "^4.3.3" + ethereum-cryptography "0.1.3" + level "^8.0.0" + lru-cache "^5.1.1" + memory-level "^1.0.0" + +"@nomicfoundation/ethereumjs-common@4.0.2": + version "4.0.2" + resolved "https://registry.yarnpkg.com/@nomicfoundation/ethereumjs-common/-/ethereumjs-common-4.0.2.tgz#a15d1651ca36757588fdaf2a7d381a150662a3c3" + integrity sha512-I2WGP3HMGsOoycSdOTSqIaES0ughQTueOsddJ36aYVpI3SN8YSusgRFLwzDJwRFVIYDKx/iJz0sQ5kBHVgdDwg== + dependencies: + "@nomicfoundation/ethereumjs-util" "9.0.2" + crc-32 "^1.2.0" + +"@nomicfoundation/ethereumjs-ethash@3.0.2": + version "3.0.2" + resolved "https://registry.yarnpkg.com/@nomicfoundation/ethereumjs-ethash/-/ethereumjs-ethash-3.0.2.tgz#da77147f806401ee996bfddfa6487500118addca" + integrity sha512-8PfoOQCcIcO9Pylq0Buijuq/O73tmMVURK0OqdjhwqcGHYC2PwhbajDh7GZ55ekB0Px197ajK3PQhpKoiI/UPg== + dependencies: + "@nomicfoundation/ethereumjs-block" "5.0.2" + "@nomicfoundation/ethereumjs-rlp" "5.0.2" + "@nomicfoundation/ethereumjs-util" "9.0.2" + abstract-level "^1.0.3" + bigint-crypto-utils "^3.0.23" + ethereum-cryptography "0.1.3" + +"@nomicfoundation/ethereumjs-evm@2.0.2": + version "2.0.2" + resolved "https://registry.yarnpkg.com/@nomicfoundation/ethereumjs-evm/-/ethereumjs-evm-2.0.2.tgz#4c2f4b84c056047102a4fa41c127454e3f0cfcf6" + integrity sha512-rBLcUaUfANJxyOx9HIdMX6uXGin6lANCulIm/pjMgRqfiCRMZie3WKYxTSd8ZE/d+qT+zTedBF4+VHTdTSePmQ== + dependencies: + "@ethersproject/providers" "^5.7.1" + "@nomicfoundation/ethereumjs-common" "4.0.2" + "@nomicfoundation/ethereumjs-tx" "5.0.2" + "@nomicfoundation/ethereumjs-util" "9.0.2" + debug "^4.3.3" + ethereum-cryptography "0.1.3" + mcl-wasm "^0.7.1" + rustbn.js "~0.2.0" + +"@nomicfoundation/ethereumjs-rlp@5.0.2": + version "5.0.2" + resolved "https://registry.yarnpkg.com/@nomicfoundation/ethereumjs-rlp/-/ethereumjs-rlp-5.0.2.tgz#4fee8dc58a53ac6ae87fb1fca7c15dc06c6b5dea" + integrity sha512-QwmemBc+MMsHJ1P1QvPl8R8p2aPvvVcKBbvHnQOKBpBztEo0omN0eaob6FeZS/e3y9NSe+mfu3nNFBHszqkjTA== + +"@nomicfoundation/ethereumjs-statemanager@2.0.2": + version "2.0.2" + resolved "https://registry.yarnpkg.com/@nomicfoundation/ethereumjs-statemanager/-/ethereumjs-statemanager-2.0.2.tgz#3ba4253b29b1211cafe4f9265fee5a0d780976e0" + integrity sha512-dlKy5dIXLuDubx8Z74sipciZnJTRSV/uHG48RSijhgm1V7eXYFC567xgKtsKiVZB1ViTP9iFL4B6Je0xD6X2OA== + dependencies: + "@nomicfoundation/ethereumjs-common" "4.0.2" + "@nomicfoundation/ethereumjs-rlp" "5.0.2" + debug "^4.3.3" + ethereum-cryptography "0.1.3" + ethers "^5.7.1" + js-sdsl "^4.1.4" + +"@nomicfoundation/ethereumjs-trie@6.0.2": + version "6.0.2" + resolved "https://registry.yarnpkg.com/@nomicfoundation/ethereumjs-trie/-/ethereumjs-trie-6.0.2.tgz#9a6dbd28482dca1bc162d12b3733acab8cd12835" + integrity sha512-yw8vg9hBeLYk4YNg5MrSJ5H55TLOv2FSWUTROtDtTMMmDGROsAu+0tBjiNGTnKRi400M6cEzoFfa89Fc5k8NTQ== + dependencies: + "@nomicfoundation/ethereumjs-rlp" "5.0.2" + "@nomicfoundation/ethereumjs-util" "9.0.2" + "@types/readable-stream" "^2.3.13" + ethereum-cryptography "0.1.3" + readable-stream "^3.6.0" + +"@nomicfoundation/ethereumjs-tx@5.0.2": + version "5.0.2" + resolved "https://registry.yarnpkg.com/@nomicfoundation/ethereumjs-tx/-/ethereumjs-tx-5.0.2.tgz#117813b69c0fdc14dd0446698a64be6df71d7e56" + integrity sha512-T+l4/MmTp7VhJeNloMkM+lPU3YMUaXdcXgTGCf8+ZFvV9NYZTRLFekRwlG6/JMmVfIfbrW+dRRJ9A6H5Q/Z64g== + dependencies: + "@chainsafe/ssz" "^0.9.2" + "@ethersproject/providers" "^5.7.2" + "@nomicfoundation/ethereumjs-common" "4.0.2" + "@nomicfoundation/ethereumjs-rlp" "5.0.2" + "@nomicfoundation/ethereumjs-util" "9.0.2" + ethereum-cryptography "0.1.3" + +"@nomicfoundation/ethereumjs-util@9.0.2": + version "9.0.2" + resolved "https://registry.yarnpkg.com/@nomicfoundation/ethereumjs-util/-/ethereumjs-util-9.0.2.tgz#16bdc1bb36f333b8a3559bbb4b17dac805ce904d" + integrity sha512-4Wu9D3LykbSBWZo8nJCnzVIYGvGCuyiYLIJa9XXNVt1q1jUzHdB+sJvx95VGCpPkCT+IbLecW6yfzy3E1bQrwQ== + dependencies: + "@chainsafe/ssz" "^0.10.0" + "@nomicfoundation/ethereumjs-rlp" "5.0.2" + ethereum-cryptography "0.1.3" + +"@nomicfoundation/ethereumjs-vm@7.0.2": + version "7.0.2" + resolved "https://registry.yarnpkg.com/@nomicfoundation/ethereumjs-vm/-/ethereumjs-vm-7.0.2.tgz#3b0852cb3584df0e18c182d0672a3596c9ca95e6" + integrity sha512-Bj3KZT64j54Tcwr7Qm/0jkeZXJMfdcAtRBedou+Hx0dPOSIgqaIr0vvLwP65TpHbak2DmAq+KJbW2KNtIoFwvA== + dependencies: + "@nomicfoundation/ethereumjs-block" "5.0.2" + "@nomicfoundation/ethereumjs-blockchain" "7.0.2" + "@nomicfoundation/ethereumjs-common" "4.0.2" + "@nomicfoundation/ethereumjs-evm" "2.0.2" + "@nomicfoundation/ethereumjs-rlp" "5.0.2" + "@nomicfoundation/ethereumjs-statemanager" "2.0.2" + "@nomicfoundation/ethereumjs-trie" "6.0.2" + "@nomicfoundation/ethereumjs-tx" "5.0.2" + "@nomicfoundation/ethereumjs-util" "9.0.2" + debug "^4.3.3" + ethereum-cryptography "0.1.3" + mcl-wasm "^0.7.1" + rustbn.js "~0.2.0" + +"@nomicfoundation/solidity-analyzer-darwin-arm64@0.1.1": + version "0.1.1" + resolved "https://registry.yarnpkg.com/@nomicfoundation/solidity-analyzer-darwin-arm64/-/solidity-analyzer-darwin-arm64-0.1.1.tgz#4c858096b1c17fe58a474fe81b46815f93645c15" + integrity sha512-KcTodaQw8ivDZyF+D76FokN/HdpgGpfjc/gFCImdLUyqB6eSWVaZPazMbeAjmfhx3R0zm/NYVzxwAokFKgrc0w== + +"@nomicfoundation/solidity-analyzer-darwin-x64@0.1.1": + version "0.1.1" + resolved "https://registry.yarnpkg.com/@nomicfoundation/solidity-analyzer-darwin-x64/-/solidity-analyzer-darwin-x64-0.1.1.tgz#6e25ccdf6e2d22389c35553b64fe6f3fdaec432c" + integrity sha512-XhQG4BaJE6cIbjAVtzGOGbK3sn1BO9W29uhk9J8y8fZF1DYz0Doj8QDMfpMu+A6TjPDs61lbsmeYodIDnfveSA== + +"@nomicfoundation/solidity-analyzer-freebsd-x64@0.1.1": + version "0.1.1" + resolved "https://registry.yarnpkg.com/@nomicfoundation/solidity-analyzer-freebsd-x64/-/solidity-analyzer-freebsd-x64-0.1.1.tgz#0a224ea50317139caeebcdedd435c28a039d169c" + integrity sha512-GHF1VKRdHW3G8CndkwdaeLkVBi5A9u2jwtlS7SLhBc8b5U/GcoL39Q+1CSO3hYqePNP+eV5YI7Zgm0ea6kMHoA== + +"@nomicfoundation/solidity-analyzer-linux-arm64-gnu@0.1.1": + version "0.1.1" + resolved "https://registry.yarnpkg.com/@nomicfoundation/solidity-analyzer-linux-arm64-gnu/-/solidity-analyzer-linux-arm64-gnu-0.1.1.tgz#dfa085d9ffab9efb2e7b383aed3f557f7687ac2b" + integrity sha512-g4Cv2fO37ZsUENQ2vwPnZc2zRenHyAxHcyBjKcjaSmmkKrFr64yvzeNO8S3GBFCo90rfochLs99wFVGT/0owpg== + +"@nomicfoundation/solidity-analyzer-linux-arm64-musl@0.1.1": + version "0.1.1" + resolved "https://registry.yarnpkg.com/@nomicfoundation/solidity-analyzer-linux-arm64-musl/-/solidity-analyzer-linux-arm64-musl-0.1.1.tgz#c9e06b5d513dd3ab02a7ac069c160051675889a4" + integrity sha512-WJ3CE5Oek25OGE3WwzK7oaopY8xMw9Lhb0mlYuJl/maZVo+WtP36XoQTb7bW/i8aAdHW5Z+BqrHMux23pvxG3w== + +"@nomicfoundation/solidity-analyzer-linux-x64-gnu@0.1.1": + version "0.1.1" + resolved "https://registry.yarnpkg.com/@nomicfoundation/solidity-analyzer-linux-x64-gnu/-/solidity-analyzer-linux-x64-gnu-0.1.1.tgz#8d328d16839e52571f72f2998c81e46bf320f893" + integrity sha512-5WN7leSr5fkUBBjE4f3wKENUy9HQStu7HmWqbtknfXkkil+eNWiBV275IOlpXku7v3uLsXTOKpnnGHJYI2qsdA== + +"@nomicfoundation/solidity-analyzer-linux-x64-musl@0.1.1": + version "0.1.1" + resolved "https://registry.yarnpkg.com/@nomicfoundation/solidity-analyzer-linux-x64-musl/-/solidity-analyzer-linux-x64-musl-0.1.1.tgz#9b49d0634b5976bb5ed1604a1e1b736f390959bb" + integrity sha512-KdYMkJOq0SYPQMmErv/63CwGwMm5XHenEna9X9aB8mQmhDBrYrlAOSsIPgFCUSL0hjxE3xHP65/EPXR/InD2+w== + +"@nomicfoundation/solidity-analyzer-win32-arm64-msvc@0.1.1": + version "0.1.1" + resolved "https://registry.yarnpkg.com/@nomicfoundation/solidity-analyzer-win32-arm64-msvc/-/solidity-analyzer-win32-arm64-msvc-0.1.1.tgz#e2867af7264ebbcc3131ef837878955dd6a3676f" + integrity sha512-VFZASBfl4qiBYwW5xeY20exWhmv6ww9sWu/krWSesv3q5hA0o1JuzmPHR4LPN6SUZj5vcqci0O6JOL8BPw+APg== + +"@nomicfoundation/solidity-analyzer-win32-ia32-msvc@0.1.1": + version "0.1.1" + resolved "https://registry.yarnpkg.com/@nomicfoundation/solidity-analyzer-win32-ia32-msvc/-/solidity-analyzer-win32-ia32-msvc-0.1.1.tgz#0685f78608dd516c8cdfb4896ed451317e559585" + integrity sha512-JnFkYuyCSA70j6Si6cS1A9Gh1aHTEb8kOTBApp/c7NRTFGNMH8eaInKlyuuiIbvYFhlXW4LicqyYuWNNq9hkpQ== + +"@nomicfoundation/solidity-analyzer-win32-x64-msvc@0.1.1": + version "0.1.1" + resolved "https://registry.yarnpkg.com/@nomicfoundation/solidity-analyzer-win32-x64-msvc/-/solidity-analyzer-win32-x64-msvc-0.1.1.tgz#c9a44f7108646f083b82e851486e0f6aeb785836" + integrity sha512-HrVJr6+WjIXGnw3Q9u6KQcbZCtk0caVWhCdFADySvRyUxJ8PnzlaP+MhwNE8oyT8OZ6ejHBRrrgjSqDCFXGirw== + +"@nomicfoundation/solidity-analyzer@^0.1.0": + version "0.1.1" + resolved "https://registry.yarnpkg.com/@nomicfoundation/solidity-analyzer/-/solidity-analyzer-0.1.1.tgz#f5f4d36d3f66752f59a57e7208cd856f3ddf6f2d" + integrity sha512-1LMtXj1puAxyFusBgUIy5pZk3073cNXYnXUpuNKFghHbIit/xZgbk0AokpUADbNm3gyD6bFWl3LRFh3dhVdREg== + optionalDependencies: + "@nomicfoundation/solidity-analyzer-darwin-arm64" "0.1.1" + "@nomicfoundation/solidity-analyzer-darwin-x64" "0.1.1" + "@nomicfoundation/solidity-analyzer-freebsd-x64" "0.1.1" + "@nomicfoundation/solidity-analyzer-linux-arm64-gnu" "0.1.1" + "@nomicfoundation/solidity-analyzer-linux-arm64-musl" "0.1.1" + "@nomicfoundation/solidity-analyzer-linux-x64-gnu" "0.1.1" + "@nomicfoundation/solidity-analyzer-linux-x64-musl" "0.1.1" + "@nomicfoundation/solidity-analyzer-win32-arm64-msvc" "0.1.1" + "@nomicfoundation/solidity-analyzer-win32-ia32-msvc" "0.1.1" + "@nomicfoundation/solidity-analyzer-win32-x64-msvc" "0.1.1" + "@nomiclabs/hardhat-ethers@npm:hardhat-deploy-ethers@^0.3.0-beta.13": version "0.3.0-beta.13" resolved "https://registry.yarnpkg.com/hardhat-deploy-ethers/-/hardhat-deploy-ethers-0.3.0-beta.13.tgz#b96086ff768ddf69928984d5eb0a8d78cfca9366" @@ -1200,6 +1326,11 @@ resolved "https://registry.yarnpkg.com/@scure/base/-/base-1.0.0.tgz#109fb595021de285f05a7db6806f2f48296fcee7" integrity sha512-gIVaYhUsy+9s58m/ETjSJVKHhKTBMmcRb9cEV5/5dwvfDlfORjKrFsDeDHWRrm6RjcPvCLZFwGJjAjLj1gg4HA== +"@scure/base@~1.1.0": + version "1.1.3" + resolved "https://registry.yarnpkg.com/@scure/base/-/base-1.1.3.tgz#8584115565228290a6c6c4961973e0903bb3df2f" + integrity sha512-/+SgoRjLq7Xlf0CWuLHq2LUZeL/w65kfzAPG5NH9pcmBhs+nunQTn4gvdwgMTIXnt9b2C/1SeL2XiysZEyIC9Q== + "@scure/bip32@1.0.1": version "1.0.1" resolved "https://registry.yarnpkg.com/@scure/bip32/-/bip32-1.0.1.tgz#1409bdf9f07f0aec99006bb0d5827693418d3aa5" @@ -1209,6 +1340,15 @@ "@noble/secp256k1" "~1.5.2" "@scure/base" "~1.0.0" +"@scure/bip32@1.3.1": + version "1.3.1" + resolved "https://registry.yarnpkg.com/@scure/bip32/-/bip32-1.3.1.tgz#7248aea723667f98160f593d621c47e208ccbb10" + integrity sha512-osvveYtyzdEVbt3OfwwXFr4P2iVBL5u1Q3q4ONBfDY/UpOuXmOlbgwc1xECEboY8wIays8Yt6onaWMUdUbfl0A== + dependencies: + "@noble/curves" "~1.1.0" + "@noble/hashes" "~1.3.1" + "@scure/base" "~1.1.0" + "@scure/bip39@1.0.0": version "1.0.0" resolved "https://registry.yarnpkg.com/@scure/bip39/-/bip39-1.0.0.tgz#47504e58de9a56a4bbed95159d2d6829fa491bb0" @@ -1217,6 +1357,14 @@ "@noble/hashes" "~1.0.0" "@scure/base" "~1.0.0" +"@scure/bip39@1.2.1": + version "1.2.1" + resolved "https://registry.yarnpkg.com/@scure/bip39/-/bip39-1.2.1.tgz#5cee8978656b272a917b7871c981e0541ad6ac2a" + integrity sha512-Z3/Fsz1yr904dduJD0NpiyRHhRYHdcnyh73FZWiV+/qhWi83wNJ3NWolYqCEN+ZWsUz2TWwajJggcRE9r1zUYg== + dependencies: + "@noble/hashes" "~1.3.0" + "@scure/base" "~1.1.0" + "@sentry/core@5.30.0": version "5.30.0" resolved "https://registry.yarnpkg.com/@sentry/core/-/core-5.30.0.tgz#6b203664f69e75106ee8b5a2fe1d717379b331f3" @@ -1304,6 +1452,13 @@ dependencies: antlr4ts "^0.5.0-alpha.4" +"@solidity-parser/parser@^0.16.0": + version "0.16.1" + resolved "https://registry.yarnpkg.com/@solidity-parser/parser/-/parser-0.16.1.tgz#f7c8a686974e1536da0105466c4db6727311253c" + integrity sha512-PdhRFNhbTtu3x8Axm0uYpqOy/lODYQK+MlYSgqIsq2L8SFYEHJPHNUiOTAJbDGzNjjr1/n9AcIayxafR/fWmYw== + dependencies: + antlr4ts "^0.5.0-alpha.4" + "@szmarczak/http-timer@^1.1.2": version "1.1.2" resolved "https://registry.yarnpkg.com/@szmarczak/http-timer/-/http-timer-1.1.2.tgz#b1665e2c461a2cd92f4c1bbf50d5454de0d4b421" @@ -1311,29 +1466,6 @@ dependencies: defer-to-connect "^1.0.1" -"@truffle/error@^0.0.14": - version "0.0.14" - resolved "https://registry.yarnpkg.com/@truffle/error/-/error-0.0.14.tgz#59683b5407bede7bddf16d80dc5592f9c5e5fa05" - integrity sha512-utJx+SZYoMqk8wldQG4gCVKhV8GwMJbWY7sLXFT/D8wWZTnE2peX7URFJh/cxkjTRCO328z1s2qewkhyVsu2HA== - -"@truffle/interface-adapter@^0.5.8": - version "0.5.8" - resolved "https://registry.yarnpkg.com/@truffle/interface-adapter/-/interface-adapter-0.5.8.tgz#76cfd34374d85849e1164de1a3d5a3dce0dc5d01" - integrity sha512-vvy3xpq36oLgjjy8KE9l2Jabg3WcGPOt18tIyMfTQX9MFnbHoQA2Ne2i8xsd4p6KfxIqSjAB53Q9/nScAqY0UQ== - dependencies: - bn.js "^5.1.3" - ethers "^4.0.32" - web3 "1.5.3" - -"@truffle/provider@^0.2.24": - version "0.2.42" - resolved "https://registry.yarnpkg.com/@truffle/provider/-/provider-0.2.42.tgz#9da6a144b3c9188cdb587451dd7bd907b4c7164b" - integrity sha512-ZNoglPho4alYIjJR+sLTgX0x6ho7m4OAUWuJ50RAWmoEqYc4AM6htdrI+lTSoRrOHHbmgasv22a7rFPMnmDrTg== - dependencies: - "@truffle/error" "^0.0.14" - "@truffle/interface-adapter" "^0.5.8" - web3 "1.5.3" - "@tsconfig/node10@^1.0.7": version "1.0.8" resolved "https://registry.yarnpkg.com/@tsconfig/node10/-/node10-1.0.8.tgz#c1e4e80d6f964fbecb3359c43bd48b40f7cadad9" @@ -1377,11 +1509,6 @@ fs-extra "^9.1.0" lodash "^4.17.15" -"@types/abstract-leveldown@*": - version "7.2.0" - resolved "https://registry.yarnpkg.com/@types/abstract-leveldown/-/abstract-leveldown-7.2.0.tgz#f055979a99f7654e84d6b8e6267419e9c4cfff87" - integrity sha512-q5veSX6zjUy/DlDhR4Y4cU0k2Ar+DT2LUraP00T19WLmTO6Se1djepCCaqU6nQrwcJ5Hyo/CWqxTzrrFg8eqbQ== - "@types/bn.js@*", "@types/bn.js@^5.1.0": version "5.1.0" resolved "https://registry.yarnpkg.com/@types/bn.js/-/bn.js-5.1.0.tgz#32c5d271503a12653c62cf4d2b45e6eab8cebc68" @@ -1433,20 +1560,6 @@ resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.11.tgz#d421b6c527a3037f7c84433fd2c4229e016863d3" integrity sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ== -"@types/level-errors@*": - version "3.0.0" - resolved "https://registry.yarnpkg.com/@types/level-errors/-/level-errors-3.0.0.tgz#15c1f4915a5ef763b51651b15e90f6dc081b96a8" - integrity sha512-/lMtoq/Cf/2DVOm6zE6ORyOM+3ZVm/BvzEZVxUhf6bgh8ZHglXlBqxbxSlJeVp8FCbD3IVvk/VbsaNmDjrQvqQ== - -"@types/levelup@^4.3.0": - version "4.3.3" - resolved "https://registry.yarnpkg.com/@types/levelup/-/levelup-4.3.3.tgz#4dc2b77db079b1cf855562ad52321aa4241b8ef4" - integrity sha512-K+OTIjJcZHVlZQN1HmU64VtrC0jC3dXWQozuEIR9zVvltIk90zaGPM2AgT+fIkChpzHhFE3YnvFLCbLtzAmexA== - dependencies: - "@types/abstract-leveldown" "*" - "@types/level-errors" "*" - "@types/node" "*" - "@types/lru-cache@^5.1.0": version "5.1.1" resolved "https://registry.yarnpkg.com/@types/lru-cache/-/lru-cache-5.1.1.tgz#c48c2e27b65d2a153b19bfc1a317e30872e01eef" @@ -1519,6 +1632,14 @@ resolved "https://registry.yarnpkg.com/@types/qs/-/qs-6.9.7.tgz#63bb7d067db107cc1e457c303bc25d511febf6cb" integrity sha512-FGa1F62FT09qcrueBA6qYTrJPVDzah9a+493+o2PCXsesWHIn27G98TsSMs3WPNbZIEj4+VJf6saSFpvD+3Zsw== +"@types/readable-stream@^2.3.13": + version "2.3.15" + resolved "https://registry.yarnpkg.com/@types/readable-stream/-/readable-stream-2.3.15.tgz#3d79c9ceb1b6a57d5f6e6976f489b9b5384321ae" + integrity sha512-oM5JSKQCcICF1wvGgmecmHldZ48OZamtMxcGGVICOJA8o8cahXC1zEVAif8iwoc5j8etxFaRFnf095+CDsuoFQ== + dependencies: + "@types/node" "*" + safe-buffer "~5.1.1" + "@types/resolve@^0.0.8": version "0.0.8" resolved "https://registry.yarnpkg.com/@types/resolve/-/resolve-0.0.8.tgz#f26074d238e02659e323ce1a13d041eee280e194" @@ -1662,11 +1783,6 @@ "@typescript-eslint/types" "5.37.0" eslint-visitor-keys "^3.3.0" -"@ungap/promise-all-settled@1.1.2": - version "1.1.2" - resolved "https://registry.yarnpkg.com/@ungap/promise-all-settled/-/promise-all-settled-1.1.2.tgz#aa58042711d6e3275dd37dc597e5d31e8c290a44" - integrity sha512-sL/cEvJWAnClXw0wHk85/2L0G6Sj8UB0Ctc1TEMbKSsmpRosqhwj9gWgFRZSrBr2f9tiXISwNhCPmlfqUqyb9Q== - "@yarnpkg/lockfile@^1.1.0": version "1.1.0" resolved "https://registry.yarnpkg.com/@yarnpkg/lockfile/-/lockfile-1.1.0.tgz#e77a97fbd345b76d83245edcd17d393b1b41fb31" @@ -1682,12 +1798,18 @@ abbrev@1.0.x: resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.0.9.tgz#91b4792588a7738c25f35dd6f63752a2f8776135" integrity sha1-kbR5JYinc4wl813W9jdSovh3YTU= -abort-controller@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/abort-controller/-/abort-controller-3.0.0.tgz#eaf54d53b62bae4138e809ca225c8439a6efb392" - integrity sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg== +abstract-level@^1.0.0, abstract-level@^1.0.2, abstract-level@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/abstract-level/-/abstract-level-1.0.3.tgz#78a67d3d84da55ee15201486ab44c09560070741" + integrity sha512-t6jv+xHy+VYwc4xqZMn2Pa9DjcdzvzZmQGRjTFc8spIbRGHgBrEKbPq+rYXc7CCo0lxgYvSgKVg9qZAhpVQSjA== dependencies: - event-target-shim "^5.0.0" + buffer "^6.0.3" + catering "^2.1.0" + is-buffer "^2.0.5" + level-supports "^4.0.0" + level-transcoder "^1.0.1" + module-error "^1.0.1" + queue-microtask "^1.2.3" abstract-leveldown@3.0.0: version "3.0.0" @@ -1710,17 +1832,6 @@ abstract-leveldown@^5.0.0, abstract-leveldown@~5.0.0: dependencies: xtend "~4.0.0" -abstract-leveldown@^6.2.1: - version "6.3.0" - resolved "https://registry.yarnpkg.com/abstract-leveldown/-/abstract-leveldown-6.3.0.tgz#d25221d1e6612f820c35963ba4bd739928f6026a" - integrity sha512-TU5nlYgta8YrBMNpc9FwQzRbiXsj49gsALsXadbGHt9CROPzX5fB0rWDR5mtdpOOKa5XqRFpbj1QroPAoPzVjQ== - dependencies: - buffer "^5.5.0" - immediate "^3.2.3" - level-concat-iterator "~2.0.0" - level-supports "~1.0.0" - xtend "~4.0.0" - abstract-leveldown@~2.6.0: version "2.6.3" resolved "https://registry.yarnpkg.com/abstract-leveldown/-/abstract-leveldown-2.6.3.tgz#1c5e8c6a5ef965ae8c35dfb3a8770c476b82c4b8" @@ -1728,17 +1839,6 @@ abstract-leveldown@~2.6.0: dependencies: xtend "~4.0.0" -abstract-leveldown@~6.2.1: - version "6.2.3" - resolved "https://registry.yarnpkg.com/abstract-leveldown/-/abstract-leveldown-6.2.3.tgz#036543d87e3710f2528e47040bc3261b77a9a8eb" - integrity sha512-BsLm5vFMRUrrLeCcRc+G0t2qOaTzpoJQLOubq2XM72eNpjF5UdU5o/5NvlNhx95XHcAvcl8OMXr4mlg/fRgUXQ== - dependencies: - buffer "^5.5.0" - immediate "^3.2.3" - level-concat-iterator "~2.0.0" - level-supports "~1.0.0" - xtend "~4.0.0" - accepts@~1.3.8: version "1.3.8" resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.3.8.tgz#0bf0be125b67014adcb0b0921e62db7bffe16b2e" @@ -2039,7 +2139,7 @@ astral-regex@^2.0.0: resolved "https://registry.yarnpkg.com/astral-regex/-/astral-regex-2.0.0.tgz#483143c567aeed4785759c0865786dc77d7d2e31" integrity sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ== -async-eventemitter@^0.2.2, async-eventemitter@^0.2.4: +async-eventemitter@^0.2.2: version "0.2.4" resolved "https://registry.yarnpkg.com/async-eventemitter/-/async-eventemitter-0.2.4.tgz#f5e7c8ca7d3e46aab9ec40a292baf686a0bafaca" integrity sha512-pd20BwL7Yt1zwDFy+8MX8F1+WCT8aQeKj0kQnTrH9WaeRETlRamVhD0JtRPmrV4GfOJ2F9CvdQkZeZhnh2TuHw== @@ -2085,11 +2185,6 @@ atob@^2.1.2: resolved "https://registry.yarnpkg.com/atob/-/atob-2.1.2.tgz#6d9517eb9e030d2436666651e86bd9f6f13533c9" integrity sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg== -available-typed-arrays@^1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz#92f95616501069d07d10edb2fc37d3e1c65123b7" - integrity sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw== - aws-sign2@~0.7.0: version "0.7.0" resolved "https://registry.yarnpkg.com/aws-sign2/-/aws-sign2-0.7.0.tgz#b46e890934a9591f2d2f6f86d7e6a9f1b3fe76a8" @@ -2683,6 +2778,11 @@ bech32@1.1.4: resolved "https://registry.yarnpkg.com/bech32/-/bech32-1.1.4.tgz#e38c9f37bf179b8eb16ae3a772b40c356d4832e9" integrity sha512-s0IrSOzLlbvX7yp4WBfPITzpAU8sqQcpsmwXDiKwrG4r491vwCO/XpejasRNl0piBMe/DvP4Tz0mIS/X1DPJBQ== +bigint-crypto-utils@^3.0.23: + version "3.3.0" + resolved "https://registry.yarnpkg.com/bigint-crypto-utils/-/bigint-crypto-utils-3.3.0.tgz#72ad00ae91062cf07f2b1def9594006c279c1d77" + integrity sha512-jOTSb+drvEDxEq6OuUybOAv/xxoh3cuYRUIPyu8sSHQNKM303UQ2R1DAo45o1AkcIXw6fzbaFI1+xGGdaXs2lg== + bignumber.js@^9.0.0: version "9.0.2" resolved "https://registry.yarnpkg.com/bignumber.js/-/bignumber.js-9.0.2.tgz#71c6c6bed38de64e24a65ebe16cfcf23ae693673" @@ -2738,7 +2838,7 @@ bn.js@^4.0.0, bn.js@^4.1.0, bn.js@^4.10.0, bn.js@^4.11.0, bn.js@^4.11.6, bn.js@^ resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-4.12.0.tgz#775b3f278efbb9718eec7361f483fb36fbbfea88" integrity sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA== -bn.js@^5.0.0, bn.js@^5.1.1, bn.js@^5.1.2, bn.js@^5.1.3, bn.js@^5.2.0: +bn.js@^5.0.0, bn.js@^5.1.1, bn.js@^5.1.2, bn.js@^5.2.0: version "5.2.0" resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-5.2.0.tgz#358860674396c6997771a9d051fcc1b57d4ae002" integrity sha512-D7iWRBvnZE8ecXiLj/9wbxH7Tk79fAh8IHaTNq1RWRixsS02W+5qS+iE9yq6RYl0asXx5tw0bLhmT5pIfbSquw== @@ -2830,6 +2930,16 @@ brorand@^1.0.1, brorand@^1.1.0: resolved "https://registry.yarnpkg.com/brorand/-/brorand-1.1.0.tgz#12c25efe40a45e3c323eb8675a0a0ce57b22371f" integrity sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8= +browser-level@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/browser-level/-/browser-level-1.0.1.tgz#36e8c3183d0fe1c405239792faaab5f315871011" + integrity sha512-XECYKJ+Dbzw0lbydyQuJzwNXtOpbMSq737qxJN11sIRTErOMShvDpbzTlgju7orJKvx4epULolZAuJGLzCmWRQ== + dependencies: + abstract-level "^1.0.2" + catering "^2.1.1" + module-error "^1.0.2" + run-parallel-limit "^1.1.0" + browser-stdout@1.3.1: version "1.3.1" resolved "https://registry.yarnpkg.com/browser-stdout/-/browser-stdout-1.3.1.tgz#baa559ee14ced73452229bad7326467c61fabd60" @@ -2948,6 +3058,14 @@ buffer@^5.0.5, buffer@^5.2.1, buffer@^5.5.0, buffer@^5.6.0: base64-js "^1.3.1" ieee754 "^1.1.13" +buffer@^6.0.3: + version "6.0.3" + resolved "https://registry.yarnpkg.com/buffer/-/buffer-6.0.3.tgz#2ace578459cc8fbe2a70aaa8f52ee63b6a74c6c6" + integrity sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA== + dependencies: + base64-js "^1.3.1" + ieee754 "^1.2.1" + bufferutil@^4.0.1: version "4.0.6" resolved "https://registry.yarnpkg.com/bufferutil/-/bufferutil-4.0.6.tgz#ebd6c67c7922a0e902f053e5d8be5ec850e48433" @@ -2960,6 +3078,13 @@ builtin-modules@^1.1.1: resolved "https://registry.yarnpkg.com/builtin-modules/-/builtin-modules-1.1.1.tgz#270f076c5a72c02f5b65a47df94c5fe3a278892f" integrity sha512-wxXCdllwGhI2kCC0MnvTGYTMvnVZTvqgypkiTI8Pa5tcz2i6VqsqwYGgqwXji+4RgCzms6EajE4IxiUH6HH8nQ== +busboy@^1.6.0: + version "1.6.0" + resolved "https://registry.yarnpkg.com/busboy/-/busboy-1.6.0.tgz#966ea36a9502e43cdb9146962523b92f531f6893" + integrity sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA== + dependencies: + streamsearch "^1.1.0" + bytes@3.1.2: version "3.1.2" resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.1.2.tgz#8b0beeb98605adf1b128fa4386403c009e0221a5" @@ -3068,11 +3193,21 @@ caniuse-lite@^1.0.30000844: resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001325.tgz#2b4ad19b77aa36f61f2eaf72e636d7481d55e606" integrity sha512-sB1bZHjseSjDtijV1Hb7PB2Zd58Kyx+n/9EotvZ4Qcz2K3d0lWB8dB4nb8wN/TsOGFq3UuAm0zQZNQ4SoR7TrQ== +case@^1.6.3: + version "1.6.3" + resolved "https://registry.yarnpkg.com/case/-/case-1.6.3.tgz#0a4386e3e9825351ca2e6216c60467ff5f1ea1c9" + integrity sha512-mzDSXIPaFwVDvZAHqZ9VlbyF4yyXRuX6IvB06WvPYkqJVO24kX1PPhv9bfpKNFZyxYFmmgo03HUiD8iklmJYRQ== + caseless@^0.12.0, caseless@~0.12.0: version "0.12.0" resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.12.0.tgz#1b681c21ff84033c826543090689420d187151dc" integrity sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw= +catering@^2.1.0, catering@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/catering/-/catering-2.1.1.tgz#66acba06ed5ee28d5286133982a927de9a04b510" + integrity sha512-K7Qy8O9p76sL3/3m7/zLKbRkyOlSZAgzEaLhyj2mXS8PsCud2Eo4hAb8aLtZqHh0QGqLcb9dlJSu6lHRVENm1w== + cbor@^5.0.2: version "5.2.0" resolved "https://registry.yarnpkg.com/cbor/-/cbor-5.2.0.tgz#4cca67783ccd6de7b50ab4ed62636712f287a67c" @@ -3243,6 +3378,17 @@ class-utils@^0.3.5: isobject "^3.0.0" static-extend "^0.1.1" +classic-level@^1.2.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/classic-level/-/classic-level-1.3.0.tgz#5e36680e01dc6b271775c093f2150844c5edd5c8" + integrity sha512-iwFAJQYtqRTRM0F6L8h4JCt00ZSGdOyqh7yVrhhjrOpFhmBjNlRUey64MCiyo6UmQHMJ+No3c81nujPv+n9yrg== + dependencies: + abstract-level "^1.0.2" + catering "^2.1.0" + module-error "^1.0.1" + napi-macros "^2.2.2" + node-gyp-build "^4.3.0" + clean-stack@^2.0.0: version "2.2.0" resolved "https://registry.yarnpkg.com/clean-stack/-/clean-stack-2.2.0.tgz#ee8472dbb129e727b31e8a10a427dee9dfe4008b" @@ -3697,13 +3843,6 @@ debug@4, debug@4.3.4, debug@^4.1.1, debug@^4.3.1, debug@^4.3.2, debug@^4.3.3, de dependencies: ms "2.1.2" -debug@4.3.3, debug@^4.0.1: - version "4.3.3" - resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.3.tgz#04266e0b70a98d4462e6e288e38259213332b664" - integrity sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q== - dependencies: - ms "2.1.2" - debug@^3.1.0: version "3.2.7" resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.7.tgz#72580b7e9145fb39b6676f9c5e5fb100b934179a" @@ -3711,6 +3850,13 @@ debug@^3.1.0: dependencies: ms "^2.1.1" +debug@^4.0.1: + version "4.3.3" + resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.3.tgz#04266e0b70a98d4462e6e288e38259213332b664" + integrity sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q== + dependencies: + ms "2.1.2" + decamelize@^1.1.1, decamelize@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290" @@ -3782,14 +3928,6 @@ deferred-leveldown@~4.0.0: abstract-leveldown "~5.0.0" inherits "^2.0.3" -deferred-leveldown@~5.3.0: - version "5.3.0" - resolved "https://registry.yarnpkg.com/deferred-leveldown/-/deferred-leveldown-5.3.0.tgz#27a997ad95408b61161aa69bd489b86c71b78058" - integrity sha512-a59VOT+oDy7vtAbLRCZwWgxu2BaCfd5Hk7wxJd48ei7I+nsg8Orlb9CLG0PMZienk9BSUKgeAqkO2+Lw+1+Ukw== - dependencies: - abstract-leveldown "~6.2.1" - inherits "^2.0.3" - define-properties@^1.1.2: version "1.1.4" resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.1.4.tgz#0b14d7bd7fbeb2f3572c3a7eda80ea5d57fb05b1" @@ -3909,6 +4047,13 @@ diffie-hellman@^5.0.0: miller-rabin "^4.0.0" randombytes "^2.0.0" +difflib@^0.2.4: + version "0.2.4" + resolved "https://registry.yarnpkg.com/difflib/-/difflib-0.2.4.tgz#b5e30361a6db023176d562892db85940a718f47e" + integrity sha512-9YVwmMb0wQHQNr5J9m6BSj6fk4pfGITGQOOs+D9Fl+INODWFOfvhIU1hNv6GgR1RBoC/9NJcwu77zShxV0kT7w== + dependencies: + heap ">= 0.2.0" + dir-glob@^3.0.1: version "3.0.1" resolved "https://registry.yarnpkg.com/dir-glob/-/dir-glob-3.0.1.tgz#56dbf73d992a4a93ba1584f4534063fd2e41717f" @@ -4037,16 +4182,6 @@ encoding-down@5.0.4, encoding-down@~5.0.0: level-errors "^2.0.0" xtend "^4.0.1" -encoding-down@^6.3.0: - version "6.3.0" - resolved "https://registry.yarnpkg.com/encoding-down/-/encoding-down-6.3.0.tgz#b1c4eb0e1728c146ecaef8e32963c549e76d082b" - integrity sha512-QKrV0iKR6MZVJV08QY0wp1e7vF6QbhnbQhb07bwpEyuz4uZiZgPlEGdkCROuFkUwdxlFaiPIhjyarH1ee/3vhw== - dependencies: - abstract-leveldown "^6.2.1" - inherits "^2.0.3" - level-codec "^9.0.0" - level-errors "^2.0.0" - encoding@^0.1.11: version "0.1.13" resolved "https://registry.yarnpkg.com/encoding/-/encoding-0.1.13.tgz#56574afdd791f54a8e9b2785c0582a2d26210fa9" @@ -4092,32 +4227,6 @@ error-ex@^1.2.0, error-ex@^1.3.1: dependencies: is-arrayish "^0.2.1" -es-abstract@^1.18.5: - version "1.19.1" - resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.19.1.tgz#d4885796876916959de78edaa0df456627115ec3" - integrity sha512-2vJ6tjA/UfqLm2MPs7jxVybLoB8i1t1Jd9R3kISld20sIxPcTbLuggQOUxeWeAvIUkduv/CfMjuh4WmiXr2v9w== - dependencies: - call-bind "^1.0.2" - es-to-primitive "^1.2.1" - function-bind "^1.1.1" - get-intrinsic "^1.1.1" - get-symbol-description "^1.0.0" - has "^1.0.3" - has-symbols "^1.0.2" - internal-slot "^1.0.3" - is-callable "^1.2.4" - is-negative-zero "^2.0.1" - is-regex "^1.1.4" - is-shared-array-buffer "^1.0.1" - is-string "^1.0.7" - is-weakref "^1.0.1" - object-inspect "^1.11.0" - object-keys "^1.1.1" - object.assign "^4.1.2" - string.prototype.trimend "^1.0.4" - string.prototype.trimstart "^1.0.4" - unbox-primitive "^1.0.1" - es-abstract@^1.19.1: version "1.19.2" resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.19.2.tgz#8f7b696d8f15b167ae3640b4060670f3d054143f" @@ -4459,7 +4568,7 @@ eth-ens-namehash@2.0.8, eth-ens-namehash@^2.0.8: idna-uts46-hx "^2.3.1" js-sha3 "^0.5.7" -eth-gas-reporter@^0.2.24: +eth-gas-reporter@^0.2.25: version "0.2.25" resolved "https://registry.yarnpkg.com/eth-gas-reporter/-/eth-gas-reporter-0.2.25.tgz#546dfa946c1acee93cb1a94c2a1162292d6ff566" integrity sha512-1fRgyE4xUB8SoqLgN3eDfpDfwEfRxh2Sz1b7wzFbyQA+9TekMmvSjjoRu9SKcSVyK+vLkLIsVbJDsTWjw195OQ== @@ -4601,7 +4710,7 @@ ethereum-common@^0.0.18: resolved "https://registry.yarnpkg.com/ethereum-common/-/ethereum-common-0.0.18.tgz#2fdc3576f232903358976eb39da783213ff9523f" integrity sha1-L9w1dvIykDNYl26znaeDIT/5Uj8= -ethereum-cryptography@^0.1.2, ethereum-cryptography@^0.1.3: +ethereum-cryptography@0.1.3, ethereum-cryptography@^0.1.3: version "0.1.3" resolved "https://registry.yarnpkg.com/ethereum-cryptography/-/ethereum-cryptography-0.1.3.tgz#8d6143cfc3d74bf79bbd8edecdf29e4ae20dd191" integrity sha512-w8/4x1SGGzc+tO97TASLja6SLd3fRIK2tLVcV2Gx4IB21hE19atll5Cq9o3d0ZmAYC/8aw0ipieTSiekAea4SQ== @@ -4632,6 +4741,16 @@ ethereum-cryptography@^1.0.3: "@scure/bip32" "1.0.1" "@scure/bip39" "1.0.0" +ethereum-cryptography@^2.0.0, ethereum-cryptography@^2.1.2: + version "2.1.2" + resolved "https://registry.yarnpkg.com/ethereum-cryptography/-/ethereum-cryptography-2.1.2.tgz#18fa7108622e56481157a5cb7c01c0c6a672eb67" + integrity sha512-Z5Ba0T0ImZ8fqXrJbpHcbpAvIswRte2wGNR/KePnu8GbbvgJ47lMxT/ZZPG6i9Jaht4azPDop4HaM00J0J59ug== + dependencies: + "@noble/curves" "1.1.0" + "@noble/hashes" "1.3.1" + "@scure/bip32" "1.3.1" + "@scure/bip39" "1.2.1" + ethereum-waffle@^3.4.0: version "3.4.4" resolved "https://registry.yarnpkg.com/ethereum-waffle/-/ethereum-waffle-3.4.4.tgz#1378b72040697857b7f5e8f473ca8f97a37b5840" @@ -4776,27 +4895,16 @@ ethereumjs-util@^5.0.0, ethereumjs-util@^5.0.1, ethereumjs-util@^5.1.1, ethereum version "5.2.1" resolved "https://registry.yarnpkg.com/ethereumjs-util/-/ethereumjs-util-5.2.1.tgz#a833f0e5fca7e5b361384dc76301a721f537bf65" integrity sha512-v3kT+7zdyCm1HIqWlLNrHGqHGLpGYIhjeHxQjnDXjLT2FyGJDsd3LWMYUo7pAFRrk86CR3nUJfhC81CCoJNNGQ== - dependencies: - bn.js "^4.11.0" - create-hash "^1.1.2" - elliptic "^6.5.2" - ethereum-cryptography "^0.1.3" - ethjs-util "^0.1.3" - rlp "^2.0.0" - safe-buffer "^5.1.1" - -ethereumjs-util@^7.0.10: - version "7.1.3" - resolved "https://registry.yarnpkg.com/ethereumjs-util/-/ethereumjs-util-7.1.3.tgz#b55d7b64dde3e3e45749e4c41288238edec32d23" - integrity sha512-y+82tEbyASO0K0X1/SRhbJJoAlfcvq8JbrG4a5cjrOks7HS/36efU/0j2flxCPOUM++HFahk33kr/ZxyC4vNuw== - dependencies: - "@types/bn.js" "^5.1.0" - bn.js "^5.1.2" + dependencies: + bn.js "^4.11.0" create-hash "^1.1.2" + elliptic "^6.5.2" ethereum-cryptography "^0.1.3" - rlp "^2.2.4" + ethjs-util "^0.1.3" + rlp "^2.0.0" + safe-buffer "^5.1.1" -ethereumjs-util@^7.0.2, ethereumjs-util@^7.1.0, ethereumjs-util@^7.1.1, ethereumjs-util@^7.1.3, ethereumjs-util@^7.1.4: +ethereumjs-util@^7.0.2, ethereumjs-util@^7.1.0: version "7.1.4" resolved "https://registry.yarnpkg.com/ethereumjs-util/-/ethereumjs-util-7.1.4.tgz#a6885bcdd92045b06f596c7626c3e89ab3312458" integrity sha512-p6KmuPCX4mZIqsQzXfmSx9Y0l2hqf+VkAiwSisW3UKUFdk8ZkAt+AYaor83z2nSi6CU2zSsXMlD80hAbNEGM0A== @@ -4860,7 +4968,7 @@ ethereumjs-wallet@0.6.5: utf8 "^3.0.0" uuid "^3.3.2" -ethers@^4.0.32, ethers@^4.0.40: +ethers@^4.0.40: version "4.0.49" resolved "https://registry.yarnpkg.com/ethers/-/ethers-4.0.49.tgz#0eb0e9161a0c8b4761be547396bbe2fb121a8894" integrity sha512-kPltTvWiyu+OktYy1IStSO16i2e7cS9D9OxZ81q2UUaiNPVrm/RTcbxamCXF9VUSKzJIdJV68EAIhTEVBalRWg== @@ -4947,6 +5055,42 @@ ethers@^5.5.2: "@ethersproject/web" "5.6.0" "@ethersproject/wordlists" "5.6.0" +ethers@^5.5.3, ethers@^5.7.1: + version "5.7.2" + resolved "https://registry.yarnpkg.com/ethers/-/ethers-5.7.2.tgz#3a7deeabbb8c030d4126b24f84e525466145872e" + integrity sha512-wswUsmWo1aOK8rR7DIKiWSw9DbLWe6x98Jrn8wcTflTVvaXhAMaB5zGAXy0GYQEQp9iO1iSHWVyARQm11zUtyg== + dependencies: + "@ethersproject/abi" "5.7.0" + "@ethersproject/abstract-provider" "5.7.0" + "@ethersproject/abstract-signer" "5.7.0" + "@ethersproject/address" "5.7.0" + "@ethersproject/base64" "5.7.0" + "@ethersproject/basex" "5.7.0" + "@ethersproject/bignumber" "5.7.0" + "@ethersproject/bytes" "5.7.0" + "@ethersproject/constants" "5.7.0" + "@ethersproject/contracts" "5.7.0" + "@ethersproject/hash" "5.7.0" + "@ethersproject/hdnode" "5.7.0" + "@ethersproject/json-wallets" "5.7.0" + "@ethersproject/keccak256" "5.7.0" + "@ethersproject/logger" "5.7.0" + "@ethersproject/networks" "5.7.1" + "@ethersproject/pbkdf2" "5.7.0" + "@ethersproject/properties" "5.7.0" + "@ethersproject/providers" "5.7.2" + "@ethersproject/random" "5.7.0" + "@ethersproject/rlp" "5.7.0" + "@ethersproject/sha2" "5.7.0" + "@ethersproject/signing-key" "5.7.0" + "@ethersproject/solidity" "5.7.0" + "@ethersproject/strings" "5.7.0" + "@ethersproject/transactions" "5.7.0" + "@ethersproject/units" "5.7.0" + "@ethersproject/wallet" "5.7.0" + "@ethersproject/web" "5.7.1" + "@ethersproject/wordlists" "5.7.0" + ethers@^5.6.9: version "5.7.0" resolved "https://registry.yarnpkg.com/ethers/-/ethers-5.7.0.tgz#0055da174b9e076b242b8282638bc94e04b39835" @@ -4999,11 +5143,6 @@ ethjs-util@0.1.6, ethjs-util@^0.1.3, ethjs-util@^0.1.6: is-hex-prefixed "1.0.0" strip-hex-prefix "1.0.0" -event-target-shim@^5.0.0: - version "5.0.1" - resolved "https://registry.yarnpkg.com/event-target-shim/-/event-target-shim-5.0.1.tgz#5d4d3ebdf9583d63a5333ce2deb7480ab2b05789" - integrity sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ== - eventemitter3@4.0.4: version "4.0.4" resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-4.0.4.tgz#b5463ace635a083d018bdc7c917b4c5f10a85384" @@ -5409,11 +5548,6 @@ for-in@^1.0.2: resolved "https://registry.yarnpkg.com/for-in/-/for-in-1.0.2.tgz#81068d295a8142ec0ac726c6e2200c30fb6d5e80" integrity sha1-gQaNKVqBQuwKxybG4iAMMPttXoA= -foreach@^2.0.5: - version "2.0.5" - resolved "https://registry.yarnpkg.com/foreach/-/foreach-2.0.5.tgz#0bee005018aeb260d0a3af3ae658dd0136ec1b99" - integrity sha1-C+4AUBiusmDQo6865ljdATbsG5k= - forever-agent@~0.6.1: version "0.6.1" resolved "https://registry.yarnpkg.com/forever-agent/-/forever-agent-0.6.1.tgz#fbc71f0c41adeb37f96c577ad1ed42d8fdacca91" @@ -5927,60 +6061,66 @@ har-validator@~5.1.3: ajv "^6.12.3" har-schema "^2.0.0" -hardhat-deploy@^0.11.4: - version "0.11.4" - resolved "https://registry.yarnpkg.com/hardhat-deploy/-/hardhat-deploy-0.11.4.tgz#39b06d3b0ad25195071cc1f2f71649b1f9f030d0" - integrity sha512-BNMwWqaxrwb8XKrYzmCwnUzOSKzicUBk+fwd28doUNoAGFFh8kpoypkcHMzKDVdLhnamAardcfqJet73zrZoTA== - dependencies: - "@ethersproject/abi" "^5.4.0" - "@ethersproject/abstract-signer" "^5.4.1" - "@ethersproject/address" "^5.4.0" - "@ethersproject/bignumber" "^5.4.1" - "@ethersproject/bytes" "^5.4.0" - "@ethersproject/constants" "^5.4.0" - "@ethersproject/contracts" "^5.4.1" - "@ethersproject/providers" "^5.4.4" - "@ethersproject/solidity" "^5.4.0" - "@ethersproject/transactions" "^5.4.0" - "@ethersproject/wallet" "^5.4.0" +hardhat-deploy@^0.11.37: + version "0.11.37" + resolved "https://registry.yarnpkg.com/hardhat-deploy/-/hardhat-deploy-0.11.37.tgz#6a771b859c82ae25292321a6d510d7c0eda09d2b" + integrity sha512-pohPSEEo/X9Yfv0Fc0kXBQW6JO0LNOILBGCP69Ci1COJvLht1hLjAtXt/hccyvD9qY/uwJAM75fmsf41Y9N7lg== + dependencies: + "@ethersproject/abi" "^5.7.0" + "@ethersproject/abstract-signer" "^5.7.0" + "@ethersproject/address" "^5.7.0" + "@ethersproject/bignumber" "^5.7.0" + "@ethersproject/bytes" "^5.7.0" + "@ethersproject/constants" "^5.7.0" + "@ethersproject/contracts" "^5.7.0" + "@ethersproject/providers" "^5.7.2" + "@ethersproject/solidity" "^5.7.0" + "@ethersproject/transactions" "^5.7.0" + "@ethersproject/wallet" "^5.7.0" "@types/qs" "^6.9.7" axios "^0.21.1" chalk "^4.1.2" chokidar "^3.5.2" debug "^4.3.2" enquirer "^2.3.6" + ethers "^5.5.3" form-data "^4.0.0" fs-extra "^10.0.0" match-all "^1.2.6" murmur-128 "^0.2.1" qs "^6.9.4" + zksync-web3 "^0.14.3" -hardhat-gas-reporter@^1.0.8: - version "1.0.8" - resolved "https://registry.yarnpkg.com/hardhat-gas-reporter/-/hardhat-gas-reporter-1.0.8.tgz#93ce271358cd748d9c4185dbb9d1d5525ec145e0" - integrity sha512-1G5thPnnhcwLHsFnl759f2tgElvuwdkzxlI65fC9PwxYMEe9cmjkVAAWTf3/3y8uP6ZSPiUiOW8PgZnykmZe0g== +hardhat-gas-reporter@^1.0.9: + version "1.0.9" + resolved "https://registry.yarnpkg.com/hardhat-gas-reporter/-/hardhat-gas-reporter-1.0.9.tgz#9a2afb354bc3b6346aab55b1c02ca556d0e16450" + integrity sha512-INN26G3EW43adGKBNzYWOlI3+rlLnasXTwW79YNnUhXPDa+yHESgt639dJEs37gCjhkbNKcRRJnomXEuMFBXJg== dependencies: array-uniq "1.0.3" - eth-gas-reporter "^0.2.24" + eth-gas-reporter "^0.2.25" sha1 "^1.1.1" -hardhat@^2.6.6: - version "2.9.3" - resolved "https://registry.yarnpkg.com/hardhat/-/hardhat-2.9.3.tgz#4759dc3c468c7d15f34334ca1be7d59b04e47b1e" - integrity sha512-7Vw99RbYbMZ15UzegOR/nqIYIqddZXvLwJGaX5sX4G5bydILnbjmDU6g3jMKJSiArEixS3vHAEaOs5CW1JQ3hg== +hardhat@^2.17.2: + version "2.17.2" + resolved "https://registry.yarnpkg.com/hardhat/-/hardhat-2.17.2.tgz#250a8c8e76029e9bfbfb9b9abee68d5b350b5d4a" + integrity sha512-oUv40jBeHw0dKpbyQ+iH9cmNMziweLoTW3MnkNxJ2Gc0KGLrQR/1n4vV4xY60zn2LdmRgnwPqy3CgtY0mfwIIA== dependencies: - "@ethereumjs/block" "^3.6.0" - "@ethereumjs/blockchain" "^5.5.0" - "@ethereumjs/common" "^2.6.0" - "@ethereumjs/tx" "^3.4.0" - "@ethereumjs/vm" "^5.6.0" "@ethersproject/abi" "^5.1.2" "@metamask/eth-sig-util" "^4.0.0" + "@nomicfoundation/ethereumjs-block" "5.0.2" + "@nomicfoundation/ethereumjs-blockchain" "7.0.2" + "@nomicfoundation/ethereumjs-common" "4.0.2" + "@nomicfoundation/ethereumjs-evm" "2.0.2" + "@nomicfoundation/ethereumjs-rlp" "5.0.2" + "@nomicfoundation/ethereumjs-statemanager" "2.0.2" + "@nomicfoundation/ethereumjs-trie" "6.0.2" + "@nomicfoundation/ethereumjs-tx" "5.0.2" + "@nomicfoundation/ethereumjs-util" "9.0.2" + "@nomicfoundation/ethereumjs-vm" "7.0.2" + "@nomicfoundation/solidity-analyzer" "^0.1.0" "@sentry/node" "^5.18.1" - "@solidity-parser/parser" "^0.14.1" "@types/bn.js" "^5.1.0" "@types/lru-cache" "^5.1.0" - abort-controller "^3.0.0" adm-zip "^0.4.16" aggregate-error "^3.0.0" ansi-escapes "^4.3.0" @@ -5990,31 +6130,27 @@ hardhat@^2.6.6: debug "^4.1.1" enquirer "^2.3.0" env-paths "^2.2.0" - ethereum-cryptography "^0.1.2" + ethereum-cryptography "^1.0.3" ethereumjs-abi "^0.6.8" - ethereumjs-util "^7.1.3" find-up "^2.1.0" fp-ts "1.19.3" fs-extra "^7.0.1" - glob "^7.1.3" + glob "7.2.0" immutable "^4.0.0-rc.12" io-ts "1.10.4" + keccak "^3.0.2" lodash "^4.17.11" - merkle-patricia-tree "^4.2.2" mnemonist "^0.38.0" - mocha "^9.2.0" + mocha "^10.0.0" p-map "^4.0.0" - qs "^6.7.0" raw-body "^2.4.1" resolve "1.17.0" semver "^6.3.0" - slash "^3.0.0" solc "0.7.3" source-map-support "^0.5.13" stacktrace-parser "^0.1.10" - "true-case-path" "^2.2.1" tsort "0.0.1" - undici "^4.14.1" + undici "^5.14.0" uuid "^8.3.2" ws "^7.4.6" @@ -6149,6 +6285,11 @@ heap@0.2.6: resolved "https://registry.yarnpkg.com/heap/-/heap-0.2.6.tgz#087e1f10b046932fc8594dd9e6d378afc9d1e5ac" integrity sha1-CH4fELBGky/IWU3Z5tN4r8nR5aw= +"heap@>= 0.2.0": + version "0.2.7" + resolved "https://registry.yarnpkg.com/heap/-/heap-0.2.7.tgz#1e6adf711d3f27ce35a81fe3b7bd576c2260a8fc" + integrity sha512-2bsegYkkHO+h/9MGbn6KWcE45cHZgPANo5LXF7EvWdT0yT2EguSVO1nDgU5c8+ZOPwp2vMNa7YFsJhVcDR9Sdg== + hmac-drbg@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/hmac-drbg/-/hmac-drbg-1.0.1.tgz#d2745701025a6c775a6c545793ed502fc0c649a1" @@ -6276,7 +6417,7 @@ idna-uts46-hx@^2.3.1: dependencies: punycode "2.1.0" -ieee754@^1.1.13: +ieee754@^1.1.13, ieee754@^1.2.1: version "1.2.1" resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.2.1.tgz#8eb7a10a63fff25d15a57b001586d177d1b0d352" integrity sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA== @@ -6466,7 +6607,7 @@ is-buffer@^1.1.5: resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.6.tgz#efaa2ea9daa0d7ab2ea13a97b2b8ad51fefbe8be" integrity sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w== -is-buffer@~2.0.3: +is-buffer@^2.0.5, is-buffer@~2.0.3: version "2.0.5" resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-2.0.5.tgz#ebc252e400d22ff8d77fa09888821a24a658c191" integrity sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ== @@ -6595,13 +6736,6 @@ is-function@^1.0.1: resolved "https://registry.yarnpkg.com/is-function/-/is-function-1.0.2.tgz#4f097f30abf6efadac9833b17ca5dc03f8144e08" integrity sha512-lw7DUp0aWXYg+CBCN+JKkcE0Q2RayZnSvnZBlwgxHBQhqt5pZNVy4Ri7H9GmmXkdu7LUthszM+Tor1u/2iBcpQ== -is-generator-function@^1.0.7: - version "1.0.10" - resolved "https://registry.yarnpkg.com/is-generator-function/-/is-generator-function-1.0.10.tgz#f1558baf1ac17e0deea7c0415c438351ff2b3c72" - integrity sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A== - dependencies: - has-tostringtag "^1.0.0" - is-glob@^4.0.0, is-glob@^4.0.1, is-glob@^4.0.3, is-glob@~4.0.1: version "4.0.3" resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.3.tgz#64f61e42cbbb2eec2071a9dac0b28ba1e65d5084" @@ -6614,7 +6748,7 @@ is-hex-prefixed@1.0.0: resolved "https://registry.yarnpkg.com/is-hex-prefixed/-/is-hex-prefixed-1.0.0.tgz#7d8d37e6ad77e5d127148913c573e082d777f554" integrity sha1-fY035q135dEnFIkTxXPggtd39VQ= -is-negative-zero@^2.0.1, is-negative-zero@^2.0.2: +is-negative-zero@^2.0.2: version "2.0.2" resolved "https://registry.yarnpkg.com/is-negative-zero/-/is-negative-zero-2.0.2.tgz#7bf6f03a28003b8b3965de3ac26f664d765f3150" integrity sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA== @@ -6699,17 +6833,6 @@ is-symbol@^1.0.2, is-symbol@^1.0.3: dependencies: has-symbols "^1.0.2" -is-typed-array@^1.1.3, is-typed-array@^1.1.7: - version "1.1.8" - resolved "https://registry.yarnpkg.com/is-typed-array/-/is-typed-array-1.1.8.tgz#cbaa6585dc7db43318bc5b89523ea384a6f65e79" - integrity sha512-HqH41TNZq2fgtGT8WHVFVJhBVGuY3AnP3Q36K8JKXUxSxRgk/d+7NjmwG2vo2mYmXK8UYZKu0qH8bVP5gEisjA== - dependencies: - available-typed-arrays "^1.0.5" - call-bind "^1.0.2" - es-abstract "^1.18.5" - foreach "^2.0.5" - has-tostringtag "^1.0.0" - is-typedarray@^1.0.0, is-typedarray@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a" @@ -6730,7 +6853,7 @@ is-utf8@^0.2.0: resolved "https://registry.yarnpkg.com/is-utf8/-/is-utf8-0.2.1.tgz#4b0da1442104d1b336340e80797e865cf39f7d72" integrity sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI= -is-weakref@^1.0.1, is-weakref@^1.0.2: +is-weakref@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/is-weakref/-/is-weakref-1.0.2.tgz#9529f383a9338205e89765e0392efc2f100f06f2" integrity sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ== @@ -6988,6 +7111,15 @@ keccak@^3.0.0: node-gyp-build "^4.2.0" readable-stream "^3.6.0" +keccak@^3.0.2: + version "3.0.3" + resolved "https://registry.yarnpkg.com/keccak/-/keccak-3.0.3.tgz#4bc35ad917be1ef54ff246f904c2bbbf9ac61276" + integrity sha512-JZrLIAJWuZxKbCilMpNz5Vj7Vtb4scDG3dMXLOsbzBmQGyjwE61BbW7bJkfKKCShXiQZt3T6sBgALRtmd+nZaQ== + dependencies: + node-addon-api "^2.0.0" + node-gyp-build "^4.2.0" + readable-stream "^3.6.0" + keyv@^3.0.0: version "3.1.0" resolved "https://registry.yarnpkg.com/keyv/-/keyv-3.1.0.tgz#ecc228486f69991e49e9476485a5be1e8fc5c4d9" @@ -7057,11 +7189,6 @@ level-codec@~7.0.0: resolved "https://registry.yarnpkg.com/level-codec/-/level-codec-7.0.1.tgz#341f22f907ce0f16763f24bddd681e395a0fb8a7" integrity sha512-Ua/R9B9r3RasXdRmOtd+t9TCOEIIlts+TN/7XTT2unhDaL6sJn83S3rUyljbr6lVtw49N3/yA0HHjpV6Kzb2aQ== -level-concat-iterator@~2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/level-concat-iterator/-/level-concat-iterator-2.0.1.tgz#1d1009cf108340252cb38c51f9727311193e6263" - integrity sha512-OTKKOqeav2QWcERMJR7IS9CUo1sHnke2C0gkSmcR7QuEtFNLLzHQAvnMw8ykvEcv0Qtkg0p7FOwP1v9e5Smdcw== - level-errors@^1.0.3: version "1.1.2" resolved "https://registry.yarnpkg.com/level-errors/-/level-errors-1.1.2.tgz#4399c2f3d3ab87d0625f7e3676e2d807deff404d" @@ -7111,15 +7238,6 @@ level-iterator-stream@~3.0.0: readable-stream "^2.3.6" xtend "^4.0.0" -level-iterator-stream@~4.0.0: - version "4.0.2" - resolved "https://registry.yarnpkg.com/level-iterator-stream/-/level-iterator-stream-4.0.2.tgz#7ceba69b713b0d7e22fcc0d1f128ccdc8a24f79c" - integrity sha512-ZSthfEqzGSOMWoUGhTXdX9jv26d32XJuHz/5YnuHZzH6wldfWMOVwI9TBtKcya4BKTyTt3XVA0A3cF3q5CY30Q== - dependencies: - inherits "^2.0.4" - readable-stream "^3.4.0" - xtend "^4.0.2" - level-mem@^3.0.1: version "3.0.1" resolved "https://registry.yarnpkg.com/level-mem/-/level-mem-3.0.1.tgz#7ce8cf256eac40f716eb6489654726247f5a89e5" @@ -7128,22 +7246,6 @@ level-mem@^3.0.1: level-packager "~4.0.0" memdown "~3.0.0" -level-mem@^5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/level-mem/-/level-mem-5.0.1.tgz#c345126b74f5b8aa376dc77d36813a177ef8251d" - integrity sha512-qd+qUJHXsGSFoHTziptAKXoLX87QjR7v2KMbqncDXPxQuCdsQlzmyX+gwrEHhlzn08vkf8TyipYyMmiC6Gobzg== - dependencies: - level-packager "^5.0.3" - memdown "^5.0.0" - -level-packager@^5.0.3: - version "5.1.1" - resolved "https://registry.yarnpkg.com/level-packager/-/level-packager-5.1.1.tgz#323ec842d6babe7336f70299c14df2e329c18939" - integrity sha512-HMwMaQPlTC1IlcwT3+swhqf/NUO+ZhXVz6TY1zZIIZlIR0YSn8GtAAWmIvKjNY16ZkEg/JcpAuQskxsXqC0yOQ== - dependencies: - encoding-down "^6.3.0" - levelup "^4.3.2" - level-packager@~4.0.0: version "4.0.1" resolved "https://registry.yarnpkg.com/level-packager/-/level-packager-4.0.1.tgz#7e7d3016af005be0869bc5fa8de93d2a7f56ffe6" @@ -7175,12 +7277,18 @@ level-sublevel@6.6.4: typewiselite "~1.0.0" xtend "~4.0.0" -level-supports@~1.0.0: +level-supports@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/level-supports/-/level-supports-4.0.1.tgz#431546f9d81f10ff0fea0e74533a0e875c08c66a" + integrity sha512-PbXpve8rKeNcZ9C1mUicC9auIYFyGpkV9/i6g76tLgANwWhtG2v7I4xNBUlkn3lE2/dZF3Pi0ygYGtLc4RXXdA== + +level-transcoder@^1.0.1: version "1.0.1" - resolved "https://registry.yarnpkg.com/level-supports/-/level-supports-1.0.1.tgz#2f530a596834c7301622521988e2c36bb77d122d" - integrity sha512-rXM7GYnW8gsl1vedTJIbzOrRv85c/2uCMpiiCzO2fndd06U/kUXEEU9evYn4zFggBOg36IsBW8LzqIpETwwQzg== + resolved "https://registry.yarnpkg.com/level-transcoder/-/level-transcoder-1.0.1.tgz#f8cef5990c4f1283d4c86d949e73631b0bc8ba9c" + integrity sha512-t7bFwFtsQeD8cl8NIoQ2iwxA0CL/9IFw7/9gAjOonH0PWTTiRfY7Hq+Ejbsxh86tXobDQ6IOiddjNYIfOBs06w== dependencies: - xtend "^4.0.2" + buffer "^6.0.3" + module-error "^1.0.1" level-ws@0.0.0: version "0.0.0" @@ -7199,14 +7307,13 @@ level-ws@^1.0.0: readable-stream "^2.2.8" xtend "^4.0.1" -level-ws@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/level-ws/-/level-ws-2.0.0.tgz#207a07bcd0164a0ec5d62c304b4615c54436d339" - integrity sha512-1iv7VXx0G9ec1isqQZ7y5LmoZo/ewAsyDHNA8EFDW5hqH2Kqovm33nSFkSdnLLAK+I5FlT+lo5Cw9itGe+CpQA== +level@^8.0.0: + version "8.0.0" + resolved "https://registry.yarnpkg.com/level/-/level-8.0.0.tgz#41b4c515dabe28212a3e881b61c161ffead14394" + integrity sha512-ypf0jjAk2BWI33yzEaaotpq7fkOPALKAgDBxggO6Q9HGX2MRXn0wbP1Jn/tJv1gtL867+YOjOB49WaUF3UoJNQ== dependencies: - inherits "^2.0.3" - readable-stream "^3.1.0" - xtend "^4.0.1" + browser-level "^1.0.1" + classic-level "^1.2.0" levelup@3.1.1, levelup@^3.0.0: version "3.1.1" @@ -7231,17 +7338,6 @@ levelup@^1.2.1: semver "~5.4.1" xtend "~4.0.0" -levelup@^4.3.2: - version "4.4.0" - resolved "https://registry.yarnpkg.com/levelup/-/levelup-4.4.0.tgz#f89da3a228c38deb49c48f88a70fb71f01cafed6" - integrity sha512-94++VFO3qN95cM/d6eBXvd894oJE0w3cInq9USsyQzzoJxmiYzPAocNcuGCPGGjoXqDVJcr3C1jzt1TSjyaiLQ== - dependencies: - deferred-leveldown "~5.3.0" - level-errors "~2.0.0" - level-iterator-stream "~4.0.0" - level-supports "~1.0.0" - xtend "~4.0.0" - levn@^0.3.0, levn@~0.3.0: version "0.3.0" resolved "https://registry.yarnpkg.com/levn/-/levn-0.3.0.tgz#3b09924edf9f083c0490fdd4c0bc4421e04764ee" @@ -7482,18 +7578,6 @@ memdown@^1.0.0: ltgt "~2.2.0" safe-buffer "~5.1.1" -memdown@^5.0.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/memdown/-/memdown-5.1.0.tgz#608e91a9f10f37f5b5fe767667a8674129a833cb" - integrity sha512-B3J+UizMRAlEArDjWHTMmadet+UKwHd3UjMgGBkZcKAxAYVPS9o0Yeiha4qvz7iGiL2Sb3igUft6p7nbFWctpw== - dependencies: - abstract-leveldown "~6.2.1" - functional-red-black-tree "~1.0.1" - immediate "~3.2.3" - inherits "~2.0.1" - ltgt "~2.2.0" - safe-buffer "~5.2.0" - memdown@~3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/memdown/-/memdown-3.0.0.tgz#93aca055d743b20efc37492e9e399784f2958309" @@ -7506,6 +7590,15 @@ memdown@~3.0.0: ltgt "~2.2.0" safe-buffer "~5.1.1" +memory-level@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/memory-level/-/memory-level-1.0.0.tgz#7323c3fd368f9af2f71c3cd76ba403a17ac41692" + integrity sha512-UXzwewuWeHBz5krr7EvehKcmLFNoXxGcvuYhC41tRnkrTbJohtS7kVn9akmgirtRygg+f7Yjsfi8Uu5SGSQ4Og== + dependencies: + abstract-level "^1.0.0" + functional-red-black-tree "^1.0.1" + module-error "^1.0.1" + memorystream@^0.3.1: version "0.3.1" resolved "https://registry.yarnpkg.com/memorystream/-/memorystream-0.3.1.tgz#86d7090b30ce455d63fbae12dda51a47ddcaf9b2" @@ -7548,23 +7641,16 @@ merkle-patricia-tree@^2.1.2, merkle-patricia-tree@^2.3.2: rlp "^2.0.0" semaphore ">=1.0.1" -merkle-patricia-tree@^4.2.2, merkle-patricia-tree@^4.2.4: - version "4.2.4" - resolved "https://registry.yarnpkg.com/merkle-patricia-tree/-/merkle-patricia-tree-4.2.4.tgz#ff988d045e2bf3dfa2239f7fabe2d59618d57413" - integrity sha512-eHbf/BG6eGNsqqfbLED9rIqbsF4+sykEaBn6OLNs71tjclbMcMOk1tEPmJKcNcNCLkvbpY/lwyOlizWsqPNo8w== - dependencies: - "@types/levelup" "^4.3.0" - ethereumjs-util "^7.1.4" - level-mem "^5.0.1" - level-ws "^2.0.0" - readable-stream "^3.6.0" - semaphore-async-await "^1.5.1" - methods@~1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/methods/-/methods-1.1.2.tgz#5529a4d67654134edcc5266656835b0f851afcee" integrity sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4= +micro-ftch@^0.3.1: + version "0.3.1" + resolved "https://registry.yarnpkg.com/micro-ftch/-/micro-ftch-0.3.1.tgz#6cb83388de4c1f279a034fb0cf96dfc050853c5f" + integrity sha512-/0LLxhzP0tfiR5hcQebtudP56gUurs2CLkGarnCiB/OqEyUFQ6U3paQi/tgLv0hBJYt2rnr9MNpxz4fiiugstg== + micromatch@^3.1.4: version "3.1.10" resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-3.1.10.tgz#70859bc95c9840952f359a068a3fc49f9ecfac23" @@ -7659,12 +7745,12 @@ minimalistic-crypto-utils@^1.0.1: dependencies: brace-expansion "^1.1.7" -minimatch@4.2.1: - version "4.2.1" - resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-4.2.1.tgz#40d9d511a46bdc4e563c22c3080cde9c0d8299b4" - integrity sha512-9Uq1ChtSZO+Mxa/CL1eGizn2vRn3MlLgzhT0Iz8zaY8NdvxvB0d5QdPFmCKf7JKA9Lerx5vRrnwO03jsSfGG9g== +minimatch@5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-5.0.1.tgz#fb9022f7528125187c92bd9e9b6366be1cf3415b" + integrity sha512-nLDxIFRyhDblz3qMuq+SoRZED4+miJ/G+tdDrjkkkRnjAsBexeGpgjLEQ0blJy7rHhR2b93rhQY4SvyWu9v03g== dependencies: - brace-expansion "^1.1.7" + brace-expansion "^2.0.1" minimatch@^3.0.4, minimatch@^3.1.1, minimatch@^3.1.2: version "3.1.2" @@ -7746,10 +7832,10 @@ mnemonist@^0.38.0: dependencies: obliterator "^2.0.0" -mocha@^7.1.1: - version "7.2.0" - resolved "https://registry.yarnpkg.com/mocha/-/mocha-7.2.0.tgz#01cc227b00d875ab1eed03a75106689cfed5a604" - integrity sha512-O9CIypScywTVpNaRrCAgoUnJgozpIofjKUYmJhiCIJMiuYnLI6otcb1/kpW9/n/tJODHGZ7i8aLQoDVsMtOKQQ== +mocha@7.1.2: + version "7.1.2" + resolved "https://registry.yarnpkg.com/mocha/-/mocha-7.1.2.tgz#8e40d198acf91a52ace122cd7599c9ab857b29e6" + integrity sha512-o96kdRKMKI3E8U0bjnfqW4QMk12MwZ4mhdBTf+B5a1q9+aq2HRnj+3ZdJu0B/ZhJeK78MgYuv6L8d/rA5AeBJA== dependencies: ansi-colors "3.2.3" browser-stdout "1.3.1" @@ -7776,41 +7862,73 @@ mocha@^7.1.1: yargs-parser "13.1.2" yargs-unparser "1.6.0" -mocha@^9.2.0: - version "9.2.2" - resolved "https://registry.yarnpkg.com/mocha/-/mocha-9.2.2.tgz#d70db46bdb93ca57402c809333e5a84977a88fb9" - integrity sha512-L6XC3EdwT6YrIk0yXpavvLkn8h+EU+Y5UcCHKECyMbdUIxyMuZj4bX4U9e1nvnvUUvQVsV2VHQr5zLdcUkhW/g== +mocha@^10.0.0: + version "10.2.0" + resolved "https://registry.yarnpkg.com/mocha/-/mocha-10.2.0.tgz#1fd4a7c32ba5ac372e03a17eef435bd00e5c68b8" + integrity sha512-IDY7fl/BecMwFHzoqF2sg/SHHANeBoMMXFlS9r0OXKDssYE1M5O43wUY/9BVPeIvfH2zmEbBfseqN9gBQZzXkg== dependencies: - "@ungap/promise-all-settled" "1.1.2" ansi-colors "4.1.1" browser-stdout "1.3.1" chokidar "3.5.3" - debug "4.3.3" + debug "4.3.4" diff "5.0.0" escape-string-regexp "4.0.0" find-up "5.0.0" glob "7.2.0" - growl "1.10.5" he "1.2.0" js-yaml "4.1.0" log-symbols "4.1.0" - minimatch "4.2.1" + minimatch "5.0.1" ms "2.1.3" - nanoid "3.3.1" + nanoid "3.3.3" serialize-javascript "6.0.0" strip-json-comments "3.1.1" supports-color "8.1.1" - which "2.0.2" - workerpool "6.2.0" + workerpool "6.2.1" yargs "16.2.0" yargs-parser "20.2.4" yargs-unparser "2.0.0" +mocha@^7.1.1: + version "7.2.0" + resolved "https://registry.yarnpkg.com/mocha/-/mocha-7.2.0.tgz#01cc227b00d875ab1eed03a75106689cfed5a604" + integrity sha512-O9CIypScywTVpNaRrCAgoUnJgozpIofjKUYmJhiCIJMiuYnLI6otcb1/kpW9/n/tJODHGZ7i8aLQoDVsMtOKQQ== + dependencies: + ansi-colors "3.2.3" + browser-stdout "1.3.1" + chokidar "3.3.0" + debug "3.2.6" + diff "3.5.0" + escape-string-regexp "1.0.5" + find-up "3.0.0" + glob "7.1.3" + growl "1.10.5" + he "1.2.0" + js-yaml "3.13.1" + log-symbols "3.0.0" + minimatch "3.0.4" + mkdirp "0.5.5" + ms "2.1.1" + node-environment-flags "1.0.6" + object.assign "4.1.0" + strip-json-comments "2.0.1" + supports-color "6.0.0" + which "1.3.1" + wide-align "1.1.3" + yargs "13.3.2" + yargs-parser "13.1.2" + yargs-unparser "1.6.0" + mock-fs@^4.1.0: version "4.14.0" resolved "https://registry.yarnpkg.com/mock-fs/-/mock-fs-4.14.0.tgz#ce5124d2c601421255985e6e94da80a7357b1b18" integrity sha512-qYvlv/exQ4+svI3UOvPUpLDF0OMX5euvUH0Ny4N5QyRyhNdgAgUrVH3iUINSzEPLvx0kbo/Bp28GJKIqvE7URw== +module-error@^1.0.1, module-error@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/module-error/-/module-error-1.0.2.tgz#8d1a48897ca883f47a45816d4fb3e3c6ba404d86" + integrity sha512-0yuvsqSCv8LbaOKhnsQ/T5JhyFlCYLPXK3U2sgV10zoKQwzs/MyfuQUOZQ1V/6OCOJsK/TRgNVrPuPDqtdMFtA== + ms@2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" @@ -7890,10 +8008,10 @@ nano-json-stream-parser@^0.1.2: resolved "https://registry.yarnpkg.com/nano-json-stream-parser/-/nano-json-stream-parser-0.1.2.tgz#0cc8f6d0e2b622b479c40d499c46d64b755c6f5f" integrity sha1-DMj20OK2IrR5xA1JnEbWS3Vcb18= -nanoid@3.3.1: - version "3.3.1" - resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.1.tgz#6347a18cac88af88f58af0b3594b723d5e99bb35" - integrity sha512-n6Vs/3KGyxPQd6uO0eH4Bv0ojGSUvuLlIHtC3Y0kEO23YRge8H9x1GCzLn28YX0H66pMkxuaeESFq4tKISKwdw== +nanoid@3.3.3: + version "3.3.3" + resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.3.tgz#fd8e8b7aa761fe807dba2d1b98fb7241bb724a25" + integrity sha512-p1sjXuopFs0xg+fPASzQ28agW1oHD7xDsd9Xkf3T15H3c/cifrFHVwrh74PdoklAPi+i7MdRsE47vm2r6JoB+w== nanomatch@^1.2.9: version "1.2.13" @@ -7912,6 +8030,11 @@ nanomatch@^1.2.9: snapdragon "^0.8.1" to-regex "^3.0.1" +napi-macros@^2.2.2: + version "2.2.2" + resolved "https://registry.yarnpkg.com/napi-macros/-/napi-macros-2.2.2.tgz#817fef20c3e0e40a963fbf7b37d1600bd0201044" + integrity sha512-hmEVtAGYzVQpCKdbQea4skABsdXW4RUh5t5mJ2zzqowJS2OyXZTU1KhDVFhx+NlWZ4ap9mqR9TcDO3LTTttd+g== + natural-compare@^1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" @@ -8048,7 +8171,7 @@ object-copy@^0.1.0: define-property "^0.2.5" kind-of "^3.0.3" -object-inspect@^1.11.0, object-inspect@^1.12.0, object-inspect@^1.9.0, object-inspect@~1.12.0: +object-inspect@^1.12.0, object-inspect@^1.9.0, object-inspect@~1.12.0: version "1.12.0" resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.12.0.tgz#6e2c120e868fd1fd18cb4f18c31741d0d6e776f0" integrity sha512-Ho2z80bVIvJloH+YzRmpZVQe87+qASmBUKZDWgx9cu+KDrX2ZDH/3tMy+gXbZETVGs2M8YdxObOh7XAtim9Y0g== @@ -8126,13 +8249,6 @@ oboe@2.1.4: dependencies: http-https "^1.0.0" -oboe@2.1.5: - version "2.1.5" - resolved "https://registry.yarnpkg.com/oboe/-/oboe-2.1.5.tgz#5554284c543a2266d7a38f17e073821fbde393cd" - integrity sha1-VVQoTFQ6ImbXo48X4HOCH73jk80= - dependencies: - http-https "^1.0.0" - on-finished@2.4.1: version "2.4.1" resolved "https://registry.yarnpkg.com/on-finished/-/on-finished-2.4.1.tgz#58c8c44116e54845ad57f14ab10b03533184ac3f" @@ -8767,7 +8883,7 @@ puppeteer@^13.7.0: unbzip2-stream "1.4.3" ws "8.5.0" -qs@6.10.3, qs@^6.4.0, qs@^6.7.0, qs@^6.9.4: +qs@6.10.3, qs@^6.4.0, qs@^6.9.4: version "6.10.3" resolved "https://registry.yarnpkg.com/qs/-/qs-6.10.3.tgz#d6cde1b2ffca87b5aa57889816c5f81535e22e8e" integrity sha512-wr7M2E0OFRfIfJZjKGieI8lBKb7fRCH4Fv5KNPEs7gJ8jadvotdsS08PzOKR7opXhZ/Xkjtt3WF9g38drmyRqQ== @@ -8798,7 +8914,7 @@ querystring@0.2.0: resolved "https://registry.yarnpkg.com/querystring/-/querystring-0.2.0.tgz#b209849203bb25df820da756e747005878521620" integrity sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA= -queue-microtask@^1.2.2: +queue-microtask@^1.2.2, queue-microtask@^1.2.3: version "1.2.3" resolved "https://registry.yarnpkg.com/queue-microtask/-/queue-microtask-1.2.3.tgz#4929228bbc724dfac43e0efb058caf7b6cfb6243" integrity sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A== @@ -8888,7 +9004,7 @@ readable-stream@^2.0.0, readable-stream@^2.0.5, readable-stream@^2.2.2, readable string_decoder "~1.1.1" util-deprecate "~1.0.1" -readable-stream@^3.0.6, readable-stream@^3.1.0, readable-stream@^3.1.1, readable-stream@^3.4.0, readable-stream@^3.6.0: +readable-stream@^3.0.6, readable-stream@^3.1.1, readable-stream@^3.4.0, readable-stream@^3.6.0: version "3.6.0" resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.0.tgz#337bbda3adc0706bd3e024426a286d4b4b2c9198" integrity sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA== @@ -9230,6 +9346,13 @@ run-async@^2.2.0: resolved "https://registry.yarnpkg.com/run-async/-/run-async-2.4.1.tgz#8440eccf99ea3e70bd409d49aab88e10c189a455" integrity sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ== +run-parallel-limit@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/run-parallel-limit/-/run-parallel-limit-1.1.0.tgz#be80e936f5768623a38a963262d6bef8ff11e7ba" + integrity sha512-jJA7irRNM91jaKc3Hcl1npHsFLOXOoTkPCUL1JEa1R82O2miplXXRaGdjW/KM/98YQWDhJLiSs793CnXfblJUw== + dependencies: + queue-microtask "^1.2.2" + run-parallel@^1.1.9: version "1.2.0" resolved "https://registry.yarnpkg.com/run-parallel/-/run-parallel-1.2.0.tgz#66d1368da7bdf921eb9d95bd1a9229e7f21a43ee" @@ -9329,11 +9452,6 @@ seedrandom@3.0.1: resolved "https://registry.yarnpkg.com/seedrandom/-/seedrandom-3.0.1.tgz#eb3dde015bcf55df05a233514e5df44ef9dce083" integrity sha512-1/02Y/rUeU1CJBAGLebiC5Lbo5FnB22gQbIFFYTLkwvp1xdABZJH1sn4ZT1MzXmPpzv+Rf/Lu2NcsLJiK4rcDg== -semaphore-async-await@^1.5.1: - version "1.5.1" - resolved "https://registry.yarnpkg.com/semaphore-async-await/-/semaphore-async-await-1.5.1.tgz#857bef5e3644601ca4b9570b87e9df5ca12974fa" - integrity sha1-hXvvXjZEYBykuVcLh+nfXKEpdPo= - semaphore@>=1.0.1, semaphore@^1.0.3, semaphore@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/semaphore/-/semaphore-1.1.0.tgz#aaad8b86b20fe8e9b32b16dc2ee682a8cd26a8aa" @@ -9679,29 +9797,31 @@ solidity-comments-extractor@^0.0.7: resolved "https://registry.yarnpkg.com/solidity-comments-extractor/-/solidity-comments-extractor-0.0.7.tgz#99d8f1361438f84019795d928b931f4e5c39ca19" integrity sha512-wciNMLg/Irp8OKGrh3S2tfvZiZ0NEyILfcRCXCD4mp7SgK/i9gzLfhY2hY7VMCQJ3kH9UB9BzNdibIVMchzyYw== -solidity-coverage@^0.7.20: - version "0.7.20" - resolved "https://registry.yarnpkg.com/solidity-coverage/-/solidity-coverage-0.7.20.tgz#246e9b0dd62f698bb8ddeecdcc46cab26c48b637" - integrity sha512-edOXTugUYdqxrtEnIn4vgrGjLPxdexcL0WD8LzAvVA3d1dwgcfRO3k8xQR02ZQnOnWMBi8Cqs0F+kAQQp3JW8g== +solidity-coverage@^0.8.4: + version "0.8.4" + resolved "https://registry.yarnpkg.com/solidity-coverage/-/solidity-coverage-0.8.4.tgz#c57a21979f5e86859c5198de9fbae2d3bc6324a5" + integrity sha512-xeHOfBOjdMF6hWTbt42iH4x+7j1Atmrf5OldDPMxI+i/COdExUxszOswD9qqvcBTaLGiOrrpnh9UZjSpt4rBsg== dependencies: - "@solidity-parser/parser" "^0.14.0" - "@truffle/provider" "^0.2.24" + "@ethersproject/abi" "^5.0.9" + "@solidity-parser/parser" "^0.16.0" chalk "^2.4.2" death "^1.1.0" detect-port "^1.3.0" + difflib "^0.2.4" fs-extra "^8.1.0" ghost-testrpc "^0.0.2" global-modules "^2.0.0" globby "^10.0.1" jsonschema "^1.2.4" lodash "^4.17.15" + mocha "7.1.2" node-emoji "^1.10.0" pify "^4.0.1" recursive-readdir "^2.2.2" sc-istanbul "^0.4.5" semver "^7.3.4" shelljs "^0.8.3" - web3-utils "^1.3.0" + web3-utils "^1.3.6" source-map-resolve@^0.5.0: version "0.5.3" @@ -9850,6 +9970,11 @@ stream-to-pull-stream@^1.7.1: looper "^3.0.0" pull-stream "^3.2.3" +streamsearch@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/streamsearch/-/streamsearch-1.1.0.tgz#404dd1e2247ca94af554e841a8ef0eaa238da764" + integrity sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg== + strict-uri-encode@^1.0.0: version "1.1.0" resolved "https://registry.yarnpkg.com/strict-uri-encode/-/strict-uri-encode-1.1.0.tgz#279b225df1d582b1f54e65addd4352e18faa0713" @@ -10294,11 +10419,6 @@ trim-right@^1.0.1: resolved "https://registry.yarnpkg.com/trim-right/-/trim-right-1.0.1.tgz#cb2e1203067e0c8de1f614094b9fe45704ea6003" integrity sha1-yy4SAwZ+DI3h9hQJS5/kVwTqYAM= -"true-case-path@^2.2.1": - version "2.2.1" - resolved "https://registry.yarnpkg.com/true-case-path/-/true-case-path-2.2.1.tgz#c5bf04a5bbec3fd118be4084461b3a27c4d796bf" - integrity sha512-0z3j8R7MCjy10kc/g+qg7Ln3alJTodw9aDuVWZa3uiWqfuBMKeAeP2ocWcxoyM3D73yz3Jt/Pu4qPr4wHSdB/Q== - ts-command-line-args@^2.2.0: version "2.2.1" resolved "https://registry.yarnpkg.com/ts-command-line-args/-/ts-command-line-args-2.2.1.tgz#fd6913e542099012c0ffb2496126a8f38305c7d6" @@ -10586,10 +10706,12 @@ underscore@1.9.1: resolved "https://registry.yarnpkg.com/underscore/-/underscore-1.9.1.tgz#06dce34a0e68a7babc29b365b8e74b8925203961" integrity sha512-5/4etnCkd9c8gwgowi5/om/mYO5ajCaOgdzj/oW+0eQV9WxKBDZw5+ycmKmeaTXjInS/W0BzpGLo2xR2aBwZdg== -undici@^4.14.1: - version "4.16.0" - resolved "https://registry.yarnpkg.com/undici/-/undici-4.16.0.tgz#469bb87b3b918818d3d7843d91a1d08da357d5ff" - integrity sha512-tkZSECUYi+/T1i4u+4+lwZmQgLXd4BLGlrc7KZPcLIW7Jpq99+Xpc30ONv7nS6F5UNOxp/HBZSSL9MafUrvJbw== +undici@^5.14.0: + version "5.23.0" + resolved "https://registry.yarnpkg.com/undici/-/undici-5.23.0.tgz#e7bdb0ed42cebe7b7aca87ced53e6eaafb8f8ca0" + integrity sha512-1D7w+fvRsqlQ9GscLBwcAJinqcZGHUKjbOmXdlE/v8BvEGXjeWAax+341q44EuTcHXXnfyKNbKRq4Lg7OzhMmg== + dependencies: + busboy "^1.6.0" undici@^5.4.0: version "5.10.0" @@ -10711,18 +10833,6 @@ util.promisify@^1.0.0: has-symbols "^1.0.1" object.getownpropertydescriptors "^2.1.1" -util@^0.12.0: - version "0.12.4" - resolved "https://registry.yarnpkg.com/util/-/util-0.12.4.tgz#66121a31420df8f01ca0c464be15dfa1d1850253" - integrity sha512-bxZ9qtSlGUWSOy9Qa9Xgk11kSslpuZwaxCg4sNIDj6FLucDab2JxnHwyNTCpHMtK1MjoQiWQ6DiUMZYbSrO+Sw== - dependencies: - inherits "^2.0.3" - is-arguments "^1.0.4" - is-generator-function "^1.0.7" - is-typed-array "^1.1.3" - safe-buffer "^5.1.2" - which-typed-array "^1.1.2" - utils-merge@1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/utils-merge/-/utils-merge-1.0.1.tgz#9f95710f50a267947b2ccc124741c1028427e713" @@ -10790,15 +10900,6 @@ web3-bzz@1.2.11: swarm-js "^0.1.40" underscore "1.9.1" -web3-bzz@1.5.3: - version "1.5.3" - resolved "https://registry.yarnpkg.com/web3-bzz/-/web3-bzz-1.5.3.tgz#e36456905ce051138f9c3ce3623cbc73da088c2b" - integrity sha512-SlIkAqG0eS6cBS9Q2eBOTI1XFzqh83RqGJWnyrNZMDxUwsTVHL+zNnaPShVPvrWQA1Ub5b0bx1Kc5+qJVxsTJg== - dependencies: - "@types/node" "^12.12.6" - got "9.6.0" - swarm-js "^0.1.40" - web3-core-helpers@1.2.11: version "1.2.11" resolved "https://registry.yarnpkg.com/web3-core-helpers/-/web3-core-helpers-1.2.11.tgz#84c681ed0b942c0203f3b324a245a127e8c67a99" @@ -10808,14 +10909,6 @@ web3-core-helpers@1.2.11: web3-eth-iban "1.2.11" web3-utils "1.2.11" -web3-core-helpers@1.5.3: - version "1.5.3" - resolved "https://registry.yarnpkg.com/web3-core-helpers/-/web3-core-helpers-1.5.3.tgz#099030235c477aadf39a94199ef40092151d563c" - integrity sha512-Ip1IjB3S8vN7Kf1PPjK41U5gskmMk6IJQlxIVuS8/1U7n/o0jC8krqtpRwiMfAgYyw3TXwBFtxSRTvJtnLyXZw== - dependencies: - web3-eth-iban "1.5.3" - web3-utils "1.5.3" - web3-core-method@1.2.11: version "1.2.11" resolved "https://registry.yarnpkg.com/web3-core-method/-/web3-core-method-1.2.11.tgz#f880137d1507a0124912bf052534f168b8d8fbb6" @@ -10828,18 +10921,6 @@ web3-core-method@1.2.11: web3-core-subscriptions "1.2.11" web3-utils "1.2.11" -web3-core-method@1.5.3: - version "1.5.3" - resolved "https://registry.yarnpkg.com/web3-core-method/-/web3-core-method-1.5.3.tgz#6cff97ed19fe4ea2e9183d6f703823a079f5132c" - integrity sha512-8wJrwQ2qD9ibWieF9oHXwrJsUGrv3XAtEkNeyvyNMpktNTIjxJ2jaFGQUuLiyUrMubD18XXgLk4JS6PJU4Loeg== - dependencies: - "@ethereumjs/common" "^2.4.0" - "@ethersproject/transactions" "^5.0.0-beta.135" - web3-core-helpers "1.5.3" - web3-core-promievent "1.5.3" - web3-core-subscriptions "1.5.3" - web3-utils "1.5.3" - web3-core-promievent@1.2.11: version "1.2.11" resolved "https://registry.yarnpkg.com/web3-core-promievent/-/web3-core-promievent-1.2.11.tgz#51fe97ca0ddec2f99bf8c3306a7a8e4b094ea3cf" @@ -10847,13 +10928,6 @@ web3-core-promievent@1.2.11: dependencies: eventemitter3 "4.0.4" -web3-core-promievent@1.5.3: - version "1.5.3" - resolved "https://registry.yarnpkg.com/web3-core-promievent/-/web3-core-promievent-1.5.3.tgz#3f11833c3dc6495577c274350b61144e0a4dba01" - integrity sha512-CFfgqvk3Vk6PIAxtLLuX+pOMozxkKCY+/GdGr7weMh033mDXEPvwyVjoSRO1PqIKj668/hMGQsVoIgbyxkJ9Mg== - dependencies: - eventemitter3 "4.0.4" - web3-core-requestmanager@1.2.11: version "1.2.11" resolved "https://registry.yarnpkg.com/web3-core-requestmanager/-/web3-core-requestmanager-1.2.11.tgz#fe6eb603fbaee18530293a91f8cf26d8ae28c45a" @@ -10865,17 +10939,6 @@ web3-core-requestmanager@1.2.11: web3-providers-ipc "1.2.11" web3-providers-ws "1.2.11" -web3-core-requestmanager@1.5.3: - version "1.5.3" - resolved "https://registry.yarnpkg.com/web3-core-requestmanager/-/web3-core-requestmanager-1.5.3.tgz#b339525815fd40e3a2a81813c864ddc413f7b6f7" - integrity sha512-9k/Bze2rs8ONix5IZR+hYdMNQv+ark2Ek2kVcrFgWO+LdLgZui/rn8FikPunjE+ub7x7pJaKCgVRbYFXjo3ZWg== - dependencies: - util "^0.12.0" - web3-core-helpers "1.5.3" - web3-providers-http "1.5.3" - web3-providers-ipc "1.5.3" - web3-providers-ws "1.5.3" - web3-core-subscriptions@1.2.11: version "1.2.11" resolved "https://registry.yarnpkg.com/web3-core-subscriptions/-/web3-core-subscriptions-1.2.11.tgz#beca908fbfcb050c16f45f3f0f4c205e8505accd" @@ -10885,14 +10948,6 @@ web3-core-subscriptions@1.2.11: underscore "1.9.1" web3-core-helpers "1.2.11" -web3-core-subscriptions@1.5.3: - version "1.5.3" - resolved "https://registry.yarnpkg.com/web3-core-subscriptions/-/web3-core-subscriptions-1.5.3.tgz#d7d69c4caad65074212028656e9dc56ca5c2159d" - integrity sha512-L2m9vG1iRN6thvmv/HQwO2YLhOQlmZU8dpLG6GSo9FBN14Uch868Swk0dYVr3rFSYjZ/GETevSXU+O+vhCummA== - dependencies: - eventemitter3 "4.0.4" - web3-core-helpers "1.5.3" - web3-core@1.2.11: version "1.2.11" resolved "https://registry.yarnpkg.com/web3-core/-/web3-core-1.2.11.tgz#1043cacc1becb80638453cc5b2a14be9050288a7" @@ -10906,19 +10961,6 @@ web3-core@1.2.11: web3-core-requestmanager "1.2.11" web3-utils "1.2.11" -web3-core@1.5.3: - version "1.5.3" - resolved "https://registry.yarnpkg.com/web3-core/-/web3-core-1.5.3.tgz#59f8728b27c8305b349051326aa262b9b7e907bf" - integrity sha512-ACTbu8COCu+0eUNmd9pG7Q9EVsNkAg2w3Y7SqhDr+zjTgbSHZV01jXKlapm9z+G3AN/BziV3zGwudClJ4u4xXQ== - dependencies: - "@types/bn.js" "^4.11.5" - "@types/node" "^12.12.6" - bignumber.js "^9.0.0" - web3-core-helpers "1.5.3" - web3-core-method "1.5.3" - web3-core-requestmanager "1.5.3" - web3-utils "1.5.3" - web3-eth-abi@1.2.11: version "1.2.11" resolved "https://registry.yarnpkg.com/web3-eth-abi/-/web3-eth-abi-1.2.11.tgz#a887494e5d447c2926d557a3834edd66e17af9b0" @@ -10928,14 +10970,6 @@ web3-eth-abi@1.2.11: underscore "1.9.1" web3-utils "1.2.11" -web3-eth-abi@1.5.3: - version "1.5.3" - resolved "https://registry.yarnpkg.com/web3-eth-abi/-/web3-eth-abi-1.5.3.tgz#5aea9394d797f99ca0d9bd40c3417eb07241c96c" - integrity sha512-i/qhuFsoNrnV130CSRYX/z4SlCfSQ4mHntti5yTmmQpt70xZKYZ57BsU0R29ueSQ9/P+aQrL2t2rqkQkAloUxg== - dependencies: - "@ethersproject/abi" "5.0.7" - web3-utils "1.5.3" - web3-eth-accounts@1.2.11: version "1.2.11" resolved "https://registry.yarnpkg.com/web3-eth-accounts/-/web3-eth-accounts-1.2.11.tgz#a9e3044da442d31903a7ce035a86d8fa33f90520" @@ -10953,23 +10987,6 @@ web3-eth-accounts@1.2.11: web3-core-method "1.2.11" web3-utils "1.2.11" -web3-eth-accounts@1.5.3: - version "1.5.3" - resolved "https://registry.yarnpkg.com/web3-eth-accounts/-/web3-eth-accounts-1.5.3.tgz#076c816ff4d68c9dffebdc7fd2bfaddcfc163d77" - integrity sha512-pdGhXgeBaEJENMvRT6W9cmji3Zz/46ugFSvmnLLw79qi5EH7XJhKISNVb41eWCrs4am5GhI67GLx5d2s2a72iw== - dependencies: - "@ethereumjs/common" "^2.3.0" - "@ethereumjs/tx" "^3.2.1" - crypto-browserify "3.12.0" - eth-lib "0.2.8" - ethereumjs-util "^7.0.10" - scrypt-js "^3.0.1" - uuid "3.3.2" - web3-core "1.5.3" - web3-core-helpers "1.5.3" - web3-core-method "1.5.3" - web3-utils "1.5.3" - web3-eth-contract@1.2.11: version "1.2.11" resolved "https://registry.yarnpkg.com/web3-eth-contract/-/web3-eth-contract-1.2.11.tgz#917065902bc27ce89da9a1da26e62ef663663b90" @@ -10985,20 +11002,6 @@ web3-eth-contract@1.2.11: web3-eth-abi "1.2.11" web3-utils "1.2.11" -web3-eth-contract@1.5.3: - version "1.5.3" - resolved "https://registry.yarnpkg.com/web3-eth-contract/-/web3-eth-contract-1.5.3.tgz#12b03a4a16ce583a945f874bea2ff2fb4c5b81ad" - integrity sha512-Gdlt1L6cdHe83k7SdV6xhqCytVtOZkjD0kY/15x441AuuJ4JLubCHuqu69k2Dr3tWifHYVys/vG8QE/W16syGg== - dependencies: - "@types/bn.js" "^4.11.5" - web3-core "1.5.3" - web3-core-helpers "1.5.3" - web3-core-method "1.5.3" - web3-core-promievent "1.5.3" - web3-core-subscriptions "1.5.3" - web3-eth-abi "1.5.3" - web3-utils "1.5.3" - web3-eth-ens@1.2.11: version "1.2.11" resolved "https://registry.yarnpkg.com/web3-eth-ens/-/web3-eth-ens-1.2.11.tgz#26d4d7f16d6cbcfff918e39832b939edc3162532" @@ -11014,20 +11017,6 @@ web3-eth-ens@1.2.11: web3-eth-contract "1.2.11" web3-utils "1.2.11" -web3-eth-ens@1.5.3: - version "1.5.3" - resolved "https://registry.yarnpkg.com/web3-eth-ens/-/web3-eth-ens-1.5.3.tgz#ef6eee1ddf32b1ff9536fc7c599a74f2656bafe1" - integrity sha512-QmGFFtTGElg0E+3xfCIFhiUF+1imFi9eg/cdsRMUZU4F1+MZCC/ee+IAelYLfNTGsEslCqfAusliKOT9DdGGnw== - dependencies: - content-hash "^2.5.2" - eth-ens-namehash "2.0.8" - web3-core "1.5.3" - web3-core-helpers "1.5.3" - web3-core-promievent "1.5.3" - web3-eth-abi "1.5.3" - web3-eth-contract "1.5.3" - web3-utils "1.5.3" - web3-eth-iban@1.2.11: version "1.2.11" resolved "https://registry.yarnpkg.com/web3-eth-iban/-/web3-eth-iban-1.2.11.tgz#f5f73298305bc7392e2f188bf38a7362b42144ef" @@ -11036,14 +11025,6 @@ web3-eth-iban@1.2.11: bn.js "^4.11.9" web3-utils "1.2.11" -web3-eth-iban@1.5.3: - version "1.5.3" - resolved "https://registry.yarnpkg.com/web3-eth-iban/-/web3-eth-iban-1.5.3.tgz#91b1475893a877b10eac1de5cce6eb379fb81b5d" - integrity sha512-vMzmGqolYZvRHwP9P4Nf6G8uYM5aTLlQu2a34vz78p0KlDC+eV1th3+90Qeaupa28EG7OO0IT1F0BejiIauOPw== - dependencies: - bn.js "^4.11.9" - web3-utils "1.5.3" - web3-eth-personal@1.2.11: version "1.2.11" resolved "https://registry.yarnpkg.com/web3-eth-personal/-/web3-eth-personal-1.2.11.tgz#a38b3942a1d87a62070ce0622a941553c3d5aa70" @@ -11056,18 +11037,6 @@ web3-eth-personal@1.2.11: web3-net "1.2.11" web3-utils "1.2.11" -web3-eth-personal@1.5.3: - version "1.5.3" - resolved "https://registry.yarnpkg.com/web3-eth-personal/-/web3-eth-personal-1.5.3.tgz#4ebe09e9a77dd49d23d93b36b36cfbf4a6dae713" - integrity sha512-JzibJafR7ak/Icas8uvos3BmUNrZw1vShuNR5Cxjo+vteOC8XMqz1Vr7RH65B4bmlfb3bm9xLxetUHO894+Sew== - dependencies: - "@types/node" "^12.12.6" - web3-core "1.5.3" - web3-core-helpers "1.5.3" - web3-core-method "1.5.3" - web3-net "1.5.3" - web3-utils "1.5.3" - web3-eth@1.2.11: version "1.2.11" resolved "https://registry.yarnpkg.com/web3-eth/-/web3-eth-1.2.11.tgz#4c81fcb6285b8caf544058fba3ae802968fdc793" @@ -11087,24 +11056,6 @@ web3-eth@1.2.11: web3-net "1.2.11" web3-utils "1.2.11" -web3-eth@1.5.3: - version "1.5.3" - resolved "https://registry.yarnpkg.com/web3-eth/-/web3-eth-1.5.3.tgz#d7d1ac7198f816ab8a2088c01e0bf1eda45862fe" - integrity sha512-saFurA1L23Bd7MEf7cBli6/jRdMhD4X/NaMiO2mdMMCXlPujoudlIJf+VWpRWJpsbDFdu7XJ2WHkmBYT5R3p1Q== - dependencies: - web3-core "1.5.3" - web3-core-helpers "1.5.3" - web3-core-method "1.5.3" - web3-core-subscriptions "1.5.3" - web3-eth-abi "1.5.3" - web3-eth-accounts "1.5.3" - web3-eth-contract "1.5.3" - web3-eth-ens "1.5.3" - web3-eth-iban "1.5.3" - web3-eth-personal "1.5.3" - web3-net "1.5.3" - web3-utils "1.5.3" - web3-net@1.2.11: version "1.2.11" resolved "https://registry.yarnpkg.com/web3-net/-/web3-net-1.2.11.tgz#eda68ef25e5cdb64c96c39085cdb74669aabbe1b" @@ -11114,15 +11065,6 @@ web3-net@1.2.11: web3-core-method "1.2.11" web3-utils "1.2.11" -web3-net@1.5.3: - version "1.5.3" - resolved "https://registry.yarnpkg.com/web3-net/-/web3-net-1.5.3.tgz#545fee49b8e213b0c55cbe74ffd0295766057463" - integrity sha512-0W/xHIPvgVXPSdLu0iZYnpcrgNnhzHMC888uMlGP5+qMCt8VuflUZHy7tYXae9Mzsg1kxaJAS5lHVNyeNw4CoQ== - dependencies: - web3-core "1.5.3" - web3-core-method "1.5.3" - web3-utils "1.5.3" - web3-provider-engine@14.2.1: version "14.2.1" resolved "https://registry.yarnpkg.com/web3-provider-engine/-/web3-provider-engine-14.2.1.tgz#ef351578797bf170e08d529cb5b02f8751329b95" @@ -11157,14 +11099,6 @@ web3-providers-http@1.2.11: web3-core-helpers "1.2.11" xhr2-cookies "1.1.0" -web3-providers-http@1.5.3: - version "1.5.3" - resolved "https://registry.yarnpkg.com/web3-providers-http/-/web3-providers-http-1.5.3.tgz#74f170fc3d79eb7941d9fbc34e2a067d61ced0b2" - integrity sha512-5DpUyWGHtDAr2RYmBu34Fu+4gJuBAuNx2POeiJIooUtJ+Mu6pIx4XkONWH6V+Ez87tZAVAsFOkJRTYuzMr3rPw== - dependencies: - web3-core-helpers "1.5.3" - xhr2-cookies "1.1.0" - web3-providers-ipc@1.2.11: version "1.2.11" resolved "https://registry.yarnpkg.com/web3-providers-ipc/-/web3-providers-ipc-1.2.11.tgz#d16d6c9be1be6e0b4f4536c4acc16b0f4f27ef21" @@ -11174,14 +11108,6 @@ web3-providers-ipc@1.2.11: underscore "1.9.1" web3-core-helpers "1.2.11" -web3-providers-ipc@1.5.3: - version "1.5.3" - resolved "https://registry.yarnpkg.com/web3-providers-ipc/-/web3-providers-ipc-1.5.3.tgz#4bd7f5e445c2f3c2595fce0929c72bb879320a3f" - integrity sha512-JmeAptugVpmXI39LGxUSAymx0NOFdgpuI1hGQfIhbEAcd4sv7fhfd5D+ZU4oLHbRI8IFr4qfGU0uhR8BXhDzlg== - dependencies: - oboe "2.1.5" - web3-core-helpers "1.5.3" - web3-providers-ws@1.2.11: version "1.2.11" resolved "https://registry.yarnpkg.com/web3-providers-ws/-/web3-providers-ws-1.2.11.tgz#a1dfd6d9778d840561d9ec13dd453046451a96bb" @@ -11192,15 +11118,6 @@ web3-providers-ws@1.2.11: web3-core-helpers "1.2.11" websocket "^1.0.31" -web3-providers-ws@1.5.3: - version "1.5.3" - resolved "https://registry.yarnpkg.com/web3-providers-ws/-/web3-providers-ws-1.5.3.tgz#eec6cfb32bb928a4106de506f13a49070a21eabf" - integrity sha512-6DhTw4Q7nm5CFYEUHOJM0gAb3xFx+9gWpVveg3YxJ/ybR1BUvEWo3bLgIJJtX56cYX0WyY6DS35a7f0LOI1kVg== - dependencies: - eventemitter3 "4.0.4" - web3-core-helpers "1.5.3" - websocket "^1.0.32" - web3-shh@1.2.11: version "1.2.11" resolved "https://registry.yarnpkg.com/web3-shh/-/web3-shh-1.2.11.tgz#f5d086f9621c9a47e98d438010385b5f059fd88f" @@ -11211,16 +11128,6 @@ web3-shh@1.2.11: web3-core-subscriptions "1.2.11" web3-net "1.2.11" -web3-shh@1.5.3: - version "1.5.3" - resolved "https://registry.yarnpkg.com/web3-shh/-/web3-shh-1.5.3.tgz#3c04aa4cda9ba0b746d7225262401160f8e38b13" - integrity sha512-COfEXfsqoV/BkcsNLRxQqnWc1Teb8/9GxdGag5GtPC5gQC/vsN+7hYVJUwNxY9LtJPKYTij2DHHnx6UkITng+Q== - dependencies: - web3-core "1.5.3" - web3-core-method "1.5.3" - web3-core-subscriptions "1.5.3" - web3-net "1.5.3" - web3-utils@1.2.11: version "1.2.11" resolved "https://registry.yarnpkg.com/web3-utils/-/web3-utils-1.2.11.tgz#af1942aead3fb166ae851a985bed8ef2c2d95a82" @@ -11235,19 +11142,6 @@ web3-utils@1.2.11: underscore "1.9.1" utf8 "3.0.0" -web3-utils@1.5.3: - version "1.5.3" - resolved "https://registry.yarnpkg.com/web3-utils/-/web3-utils-1.5.3.tgz#e914c9320cd663b2a09a5cb920ede574043eb437" - integrity sha512-56nRgA+Ad9SEyCv39g36rTcr5fpsd4L9LgV3FK0aB66nAMazLAA6Qz4lH5XrUKPDyBIPGJIR+kJsyRtwcu2q1Q== - dependencies: - bn.js "^4.11.9" - eth-lib "0.2.8" - ethereum-bloom-filters "^1.0.6" - ethjs-unit "0.1.6" - number-to-bn "1.7.0" - randombytes "^2.1.0" - utf8 "3.0.0" - web3-utils@^1.0.0-beta.31: version "1.7.1" resolved "https://registry.yarnpkg.com/web3-utils/-/web3-utils-1.7.1.tgz#77d8bacaf426c66027d8aa4864d77f0ed211aacd" @@ -11261,14 +11155,15 @@ web3-utils@^1.0.0-beta.31: randombytes "^2.1.0" utf8 "3.0.0" -web3-utils@^1.3.0: - version "1.6.1" - resolved "https://registry.yarnpkg.com/web3-utils/-/web3-utils-1.6.1.tgz#befcb23922b00603ab56d8c5b4158468dc494aca" - integrity sha512-RidGKv5kOkcerI6jQqDFDoTllQQqV+rPhTzZHhmbqtFObbYpU93uc+yG1LHivRTQhA6llIx67iudc/vzisgO+w== +web3-utils@^1.3.6: + version "1.10.2" + resolved "https://registry.yarnpkg.com/web3-utils/-/web3-utils-1.10.2.tgz#361103d28a94d5e2a87ba15d776a62c33303eb44" + integrity sha512-TdApdzdse5YR+5GCX/b/vQnhhbj1KSAtfrDtRW7YS0kcWp1gkJsN62gw6GzCaNTeXookB7UrLtmDUuMv65qgow== dependencies: - bn.js "^4.11.9" + "@ethereumjs/util" "^8.1.0" + bn.js "^5.2.1" ethereum-bloom-filters "^1.0.6" - ethereumjs-util "^7.1.0" + ethereum-cryptography "^2.1.2" ethjs-unit "0.1.6" number-to-bn "1.7.0" randombytes "^2.1.0" @@ -11287,19 +11182,6 @@ web3@1.2.11: web3-shh "1.2.11" web3-utils "1.2.11" -web3@1.5.3: - version "1.5.3" - resolved "https://registry.yarnpkg.com/web3/-/web3-1.5.3.tgz#11882679453c645bf33620fbc255a243343075aa" - integrity sha512-eyBg/1K44flfv0hPjXfKvNwcUfIVDI4NX48qHQe6wd7C8nPSdbWqo9vLy6ksZIt9NLa90HjI8HsGYgnMSUxn6w== - dependencies: - web3-bzz "1.5.3" - web3-core "1.5.3" - web3-eth "1.5.3" - web3-eth-personal "1.5.3" - web3-net "1.5.3" - web3-shh "1.5.3" - web3-utils "1.5.3" - webidl-conversions@^3.0.0: version "3.0.1" resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-3.0.1.tgz#24534275e2a7bc6be7bc86611cc16ae0a5654871" @@ -11317,7 +11199,7 @@ websocket@1.0.32: utf-8-validate "^5.0.2" yaeti "^0.0.6" -websocket@^1.0.31, websocket@^1.0.32: +websocket@^1.0.31: version "1.0.34" resolved "https://registry.yarnpkg.com/websocket/-/websocket-1.0.34.tgz#2bdc2602c08bf2c82253b730655c0ef7dcab3111" integrity sha512-PRDso2sGwF6kM75QykIesBijKSVceR6jL2G8NGYyq2XrItNC2P5/qL5XeR056GhA+Ly7JMFvJb9I312mJfmqnQ== @@ -11363,18 +11245,6 @@ which-module@^2.0.0: resolved "https://registry.yarnpkg.com/which-module/-/which-module-2.0.0.tgz#d9ef07dce77b9902b8a3a8fa4b31c3e3f7e6e87a" integrity sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho= -which-typed-array@^1.1.2: - version "1.1.7" - resolved "https://registry.yarnpkg.com/which-typed-array/-/which-typed-array-1.1.7.tgz#2761799b9a22d4b8660b3c1b40abaa7739691793" - integrity sha512-vjxaB4nfDqwKI0ws7wZpxIlde1XrLX5uB0ZjpfshgmapJMD7jJWhZI+yToJTqaFByF0eNBcYxbjmCzoRP7CfEw== - dependencies: - available-typed-arrays "^1.0.5" - call-bind "^1.0.2" - es-abstract "^1.18.5" - foreach "^2.0.5" - has-tostringtag "^1.0.0" - is-typed-array "^1.1.7" - which@1.3.1, which@^1.1.1, which@^1.2.9, which@^1.3.1: version "1.3.1" resolved "https://registry.yarnpkg.com/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a" @@ -11382,7 +11252,7 @@ which@1.3.1, which@^1.1.1, which@^1.2.9, which@^1.3.1: dependencies: isexe "^2.0.0" -which@2.0.2, which@^2.0.1: +which@^2.0.1: version "2.0.2" resolved "https://registry.yarnpkg.com/which/-/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1" integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA== @@ -11419,10 +11289,10 @@ wordwrapjs@^4.0.0: reduce-flatten "^2.0.0" typical "^5.2.0" -workerpool@6.2.0: - version "6.2.0" - resolved "https://registry.yarnpkg.com/workerpool/-/workerpool-6.2.0.tgz#827d93c9ba23ee2019c3ffaff5c27fccea289e8b" - integrity sha512-Rsk5qQHJ9eowMH28Jwhe8HEbmdYDX4lwoMWshiCXugjtHqMD9ZbiqSDLxcsfdqsETPzVUtX5s1Z5kStiIM6l4A== +workerpool@6.2.1: + version "6.2.1" + resolved "https://registry.yarnpkg.com/workerpool/-/workerpool-6.2.1.tgz#46fc150c17d826b86a008e5a4508656777e9c343" + integrity sha512-ILEIE97kDZvF9Wb9f6h5aXK4swSlKGUcOEGiIYb2OOu/IrDU9iwj0fD//SsA6E5ibwJxpEvhullJY4Sl4GcpAw== wrap-ansi@^2.0.0: version "2.1.0" @@ -11535,7 +11405,7 @@ xmlhttprequest@1.8.0: resolved "https://registry.yarnpkg.com/xmlhttprequest/-/xmlhttprequest-1.8.0.tgz#67fe075c5c24fef39f9d65f5f7b7fe75171968fc" integrity sha1-Z/4HXFwk/vOfnWX197f+dRcZaPw= -xtend@^4.0.0, xtend@^4.0.1, xtend@^4.0.2, xtend@~4.0.0, xtend@~4.0.1: +xtend@^4.0.0, xtend@^4.0.1, xtend@~4.0.0, xtend@~4.0.1: version "4.0.2" resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.2.tgz#bb72779f5fa465186b1f438f674fa347fdb5db54" integrity sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ== @@ -11688,3 +11558,8 @@ yocto-queue@^0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-0.1.0.tgz#0294eb3dee05028d31ee1a5fa2c556a6aaf10a1b" integrity sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q== + +zksync-web3@^0.14.3: + version "0.14.3" + resolved "https://registry.yarnpkg.com/zksync-web3/-/zksync-web3-0.14.3.tgz#64ac2a16d597464c3fc4ae07447a8007631c57c9" + integrity sha512-hT72th4AnqyLW1d5Jlv8N2B/qhEnl2NePK2A3org7tAa24niem/UAaHMkEvmWI3SF9waYUPtqAtjpf+yvQ9zvQ== From 4908930d5d01a52d445fcf16fe3cfd4877a21a16 Mon Sep 17 00:00:00 2001 From: Goran Vladika Date: Fri, 1 Sep 2023 12:00:54 +0200 Subject: [PATCH 072/292] Make solidity-coverage not complain --- hardhat.config.ts | 1 + package.json | 1 + src/mocks/Simple.sol | 3 +- yarn.lock | 94 ++++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 98 insertions(+), 1 deletion(-) diff --git a/hardhat.config.ts b/hardhat.config.ts index 89fbc7a6..aa4c9d74 100644 --- a/hardhat.config.ts +++ b/hardhat.config.ts @@ -5,6 +5,7 @@ import '@nomiclabs/hardhat-etherscan' import '@typechain/hardhat' import 'solidity-coverage' import 'hardhat-gas-reporter' +import 'hardhat-ignore-warnings' const solidity = { compilers: [ diff --git a/package.json b/package.json index 5300dcc6..a123d431 100644 --- a/package.json +++ b/package.json @@ -29,6 +29,7 @@ "dependencies": { "@openzeppelin/contracts": "4.5.0", "@openzeppelin/contracts-upgradeable": "4.5.2", + "hardhat-ignore-warnings": "^0.2.9", "patch-package": "^6.4.7" }, "private": false, diff --git a/src/mocks/Simple.sol b/src/mocks/Simple.sol index 4ce8bc3c..68e4b6eb 100644 --- a/src/mocks/Simple.sol +++ b/src/mocks/Simple.sol @@ -119,7 +119,8 @@ contract Simple { uint256 before = gasleft(); // The inner call may revert, but we still want to return the amount of gas used, // so we ignore the result of this call. - (to.staticcall{gas: before - 10000}(input)); + // solc-ignore-next-line unused-call-retval + to.staticcall{gas: before - 10000}(input); return before - gasleft(); } } diff --git a/yarn.lock b/yarn.lock index c9ef9432..5e605890 100644 --- a/yarn.lock +++ b/yarn.lock @@ -6100,6 +6100,15 @@ hardhat-gas-reporter@^1.0.9: eth-gas-reporter "^0.2.25" sha1 "^1.1.1" +hardhat-ignore-warnings@^0.2.9: + version "0.2.9" + resolved "https://registry.yarnpkg.com/hardhat-ignore-warnings/-/hardhat-ignore-warnings-0.2.9.tgz#3d323a9016cbf436e5e7a796dc18568573f974da" + integrity sha512-q1oj6/ixiAx+lgIyGLBajVCSC7qUtAoK7LS9Nr8UVHYo8Iuh5naBiVGo4RDJ6wxbDGYBkeSukUGZrMqzC2DWwA== + dependencies: + minimatch "^5.1.0" + node-interval-tree "^2.0.1" + solidity-comments "^0.0.2" + hardhat@^2.17.2: version "2.17.2" resolved "https://registry.yarnpkg.com/hardhat/-/hardhat-2.17.2.tgz#250a8c8e76029e9bfbfb9b9abee68d5b350b5d4a" @@ -7766,6 +7775,13 @@ minimatch@^5.0.1: dependencies: brace-expansion "^2.0.1" +minimatch@^5.1.0: + version "5.1.6" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-5.1.6.tgz#1cfcb8cf5522ea69952cd2af95ae09477f122a96" + integrity sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g== + dependencies: + brace-expansion "^2.0.1" + minimist@^1.2.0, minimist@^1.2.5, minimist@^1.2.6, minimist@~1.2.5: version "1.2.6" resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.6.tgz#8637a5b759ea0d6e98702cfb3a9283323c93af44" @@ -8100,6 +8116,13 @@ node-gyp-build@^4.2.0, node-gyp-build@^4.3.0: resolved "https://registry.yarnpkg.com/node-gyp-build/-/node-gyp-build-4.4.0.tgz#42e99687ce87ddeaf3a10b99dc06abc11021f3f4" integrity sha512-amJnQCcgtRVw9SvoebO3BKGESClrfXGCUTX9hSn1OuGQTQBOZmVd0Z0OlecpuRksKvbsUqALE8jls/ErClAPuQ== +node-interval-tree@^2.0.1: + version "2.1.2" + resolved "https://registry.yarnpkg.com/node-interval-tree/-/node-interval-tree-2.1.2.tgz#316e380db08d1c0de0a620d551f0327e8397dad8" + integrity sha512-bJ9zMDuNGzVQg1xv0bCPzyEDxHgbrx7/xGj6CDokvizZZmastPsOh0JJLuY8wA5q2SfX1TLNMk7XNV8WxbGxzA== + dependencies: + shallowequal "^1.1.0" + nofilter@^1.0.4: version "1.0.4" resolved "https://registry.yarnpkg.com/nofilter/-/nofilter-1.0.4.tgz#78d6f4b6a613e7ced8b015cec534625f7667006e" @@ -9584,6 +9607,11 @@ sha1@^1.1.1: charenc ">= 0.0.1" crypt ">= 0.0.1" +shallowequal@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/shallowequal/-/shallowequal-1.1.0.tgz#188d521de95b9087404fd4dcb68b13df0ae4e7f8" + integrity sha512-y0m1JoUZSlPAjXVtPPW70aZWfIL/dSP7AFkRnniLCrK/8MDKog3TySTBmckD+RObVxH0v4Tox67+F14PdED2oQ== + shebang-command@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-1.2.0.tgz#44aac65b695b03398968c39f363fee5deafdf1ea" @@ -9792,11 +9820,77 @@ solhint@^3.3.7: optionalDependencies: prettier "^1.14.3" +solidity-comments-darwin-arm64@0.0.2: + version "0.0.2" + resolved "https://registry.yarnpkg.com/solidity-comments-darwin-arm64/-/solidity-comments-darwin-arm64-0.0.2.tgz#07d89176967d805d41177b38d4f7b16f17c4fa29" + integrity sha512-HidWkVLSh7v+Vu0CA7oI21GWP/ZY7ro8g8OmIxE8oTqyMwgMbE8F1yc58Sj682Hj199HCZsjmtn1BE4PCbLiGA== + +solidity-comments-darwin-x64@0.0.2: + version "0.0.2" + resolved "https://registry.yarnpkg.com/solidity-comments-darwin-x64/-/solidity-comments-darwin-x64-0.0.2.tgz#aaadbfcc08d9fdd1b564c8ce71d6ba50d67b1829" + integrity sha512-Zjs0Ruz6faBTPT6fBecUt6qh4CdloT8Bwoc0+qxRoTn9UhYscmbPQkUgQEbS0FQPysYqVzzxJB4h1Ofbf4wwtA== + solidity-comments-extractor@^0.0.7: version "0.0.7" resolved "https://registry.yarnpkg.com/solidity-comments-extractor/-/solidity-comments-extractor-0.0.7.tgz#99d8f1361438f84019795d928b931f4e5c39ca19" integrity sha512-wciNMLg/Irp8OKGrh3S2tfvZiZ0NEyILfcRCXCD4mp7SgK/i9gzLfhY2hY7VMCQJ3kH9UB9BzNdibIVMchzyYw== +solidity-comments-freebsd-x64@0.0.2: + version "0.0.2" + resolved "https://registry.yarnpkg.com/solidity-comments-freebsd-x64/-/solidity-comments-freebsd-x64-0.0.2.tgz#b2bbf4fe04daefb5e97d595ef5581d56b61ea275" + integrity sha512-8Qe4mpjuAxFSwZJVk7B8gAoLCdbtS412bQzBwk63L8dmlHogvE39iT70aAk3RHUddAppT5RMBunlPUCFYJ3ZTw== + +solidity-comments-linux-arm64-gnu@0.0.2: + version "0.0.2" + resolved "https://registry.yarnpkg.com/solidity-comments-linux-arm64-gnu/-/solidity-comments-linux-arm64-gnu-0.0.2.tgz#db9cd6c46606d46ce66ff781aa37d596bf06b5f1" + integrity sha512-spkb0MZZnmrP+Wtq4UxP+nyPAVRe82idOjqndolcNR0S9Xvu4ebwq+LvF4HiUgjTDmeiqYiFZQ8T9KGdLSIoIg== + +solidity-comments-linux-arm64-musl@0.0.2: + version "0.0.2" + resolved "https://registry.yarnpkg.com/solidity-comments-linux-arm64-musl/-/solidity-comments-linux-arm64-musl-0.0.2.tgz#e37d20bb18447a4761cb48c80909833874b60d27" + integrity sha512-guCDbHArcjE+JDXYkxx5RZzY1YF6OnAKCo+sTC5fstyW/KGKaQJNPyBNWuwYsQiaEHpvhW1ha537IvlGek8GqA== + +solidity-comments-linux-x64-gnu@0.0.2: + version "0.0.2" + resolved "https://registry.yarnpkg.com/solidity-comments-linux-x64-gnu/-/solidity-comments-linux-x64-gnu-0.0.2.tgz#19d09f0d52181ed2661d188ded0f9f22399eb17d" + integrity sha512-zIqLehBK/g7tvrFmQljrfZXfkEeLt2v6wbe+uFu6kH/qAHZa7ybt8Vc0wYcmjo2U0PeBm15d79ee3AkwbIjFdQ== + +solidity-comments-linux-x64-musl@0.0.2: + version "0.0.2" + resolved "https://registry.yarnpkg.com/solidity-comments-linux-x64-musl/-/solidity-comments-linux-x64-musl-0.0.2.tgz#ec1297208481c70bcdceae11ab1ef50c5a955553" + integrity sha512-R9FeDloVlFGTaVkOlELDVC7+1Tjx5WBPI5L8r0AGOPHK3+jOcRh6sKYpI+VskSPDc3vOO46INkpDgUXrKydlIw== + +solidity-comments-win32-arm64-msvc@0.0.2: + version "0.0.2" + resolved "https://registry.yarnpkg.com/solidity-comments-win32-arm64-msvc/-/solidity-comments-win32-arm64-msvc-0.0.2.tgz#48dc8a623f9e34a7c1ff62e406d67862d660ff04" + integrity sha512-QnWJoCQcJj+rnutULOihN9bixOtYWDdF5Rfz9fpHejL1BtNjdLW1om55XNVHGAHPqBxV4aeQQ6OirKnp9zKsug== + +solidity-comments-win32-ia32-msvc@0.0.2: + version "0.0.2" + resolved "https://registry.yarnpkg.com/solidity-comments-win32-ia32-msvc/-/solidity-comments-win32-ia32-msvc-0.0.2.tgz#5110e57d247d59131c82310ee1c88a8a9cfc7da5" + integrity sha512-vUg4nADtm/NcOtlIymG23NWJUSuMsvX15nU7ynhGBsdKtt8xhdP3C/zA6vjDk8Jg+FXGQL6IHVQ++g/7rSQi0w== + +solidity-comments-win32-x64-msvc@0.0.2: + version "0.0.2" + resolved "https://registry.yarnpkg.com/solidity-comments-win32-x64-msvc/-/solidity-comments-win32-x64-msvc-0.0.2.tgz#271ad8fbbaf17f6026362964ba3e1880e3dc3685" + integrity sha512-36j+KUF4V/y0t3qatHm/LF5sCUCBx2UndxE1kq5bOzh/s+nQgatuyB+Pd5BfuPQHdWu2KaExYe20FlAa6NL7+Q== + +solidity-comments@^0.0.2: + version "0.0.2" + resolved "https://registry.yarnpkg.com/solidity-comments/-/solidity-comments-0.0.2.tgz#e1158d243ad55d5803882f2a67c0298466df573b" + integrity sha512-G+aK6qtyUfkn1guS8uzqUeua1dURwPlcOjoTYW/TwmXAcE7z/1+oGCfZUdMSe4ZMKklNbVZNiG5ibnF8gkkFfw== + optionalDependencies: + solidity-comments-darwin-arm64 "0.0.2" + solidity-comments-darwin-x64 "0.0.2" + solidity-comments-freebsd-x64 "0.0.2" + solidity-comments-linux-arm64-gnu "0.0.2" + solidity-comments-linux-arm64-musl "0.0.2" + solidity-comments-linux-x64-gnu "0.0.2" + solidity-comments-linux-x64-musl "0.0.2" + solidity-comments-win32-arm64-msvc "0.0.2" + solidity-comments-win32-ia32-msvc "0.0.2" + solidity-comments-win32-x64-msvc "0.0.2" + solidity-coverage@^0.8.4: version "0.8.4" resolved "https://registry.yarnpkg.com/solidity-coverage/-/solidity-coverage-0.8.4.tgz#c57a21979f5e86859c5198de9fbae2d3bc6324a5" From ecd4b8a5c20ab1b2ec87deead8f6caad02aca23e Mon Sep 17 00:00:00 2001 From: Goran Vladika Date: Fri, 1 Sep 2023 13:16:04 +0200 Subject: [PATCH 073/292] Use node v18 --- .github/workflows/contract-tests.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/contract-tests.yml b/.github/workflows/contract-tests.yml index 2ae478ce..c58e40bb 100644 --- a/.github/workflows/contract-tests.yml +++ b/.github/workflows/contract-tests.yml @@ -23,7 +23,7 @@ jobs: - name: Setup nodejs uses: actions/setup-node@v2 with: - node-version: '20' + node-version: '18' cache: 'yarn' cache-dependency-path: '**/yarn.lock' From 49564eb8cf92b522ec5f36fb350e989cec0c16d8 Mon Sep 17 00:00:00 2001 From: Goran Vladika Date: Fri, 1 Sep 2023 13:23:26 +0200 Subject: [PATCH 074/292] Move to dev dependencies --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index a123d431..29972ab7 100644 --- a/package.json +++ b/package.json @@ -29,7 +29,6 @@ "dependencies": { "@openzeppelin/contracts": "4.5.0", "@openzeppelin/contracts-upgradeable": "4.5.2", - "hardhat-ignore-warnings": "^0.2.9", "patch-package": "^6.4.7" }, "private": false, @@ -55,6 +54,7 @@ "hardhat": "^2.17.2", "hardhat-deploy": "^0.11.37", "hardhat-gas-reporter": "^1.0.9", + "hardhat-ignore-warnings": "^0.2.9", "postinstall-postinstall": "^2.1.0", "prettier": "^2.5.1", "prettier-plugin-solidity": "^1.0.0-beta.19", From 03c98c03c954366dfeab61a21068e6764ad3588a Mon Sep 17 00:00:00 2001 From: Goran Vladika Date: Mon, 11 Sep 2023 15:03:20 +0200 Subject: [PATCH 075/292] Provide maxFeePerGas as param --- scripts/rollupCreation.ts | 19 ++++++++--- src/rollup/DeployHelper.sol | 48 +++++++++++++++++++++------- src/rollup/RollupCreator.sol | 54 ++++++++++++-------------------- test/foundry/RollupCreator.t.sol | 21 ++++++++----- 4 files changed, 83 insertions(+), 59 deletions(-) diff --git a/scripts/rollupCreation.ts b/scripts/rollupCreation.ts index dab5b06a..5b9f65f3 100644 --- a/scripts/rollupCreation.ts +++ b/scripts/rollupCreation.ts @@ -7,6 +7,9 @@ import { BigNumber } from 'ethers' import { IERC20__factory } from '../build/types' import { sleep } from './testSetup' +// 1 gwei +const MAX_FER_PER_GAS = BigNumber.from('1000000000') + interface RollupCreatedEvent { event: string address: string @@ -75,11 +78,17 @@ export async function createRollup(feeToken?: string) { // Call the createRollup function console.log('Calling createRollup to generate a new rollup ...') - const createRollupTx = await rollupCreator[ - 'createRollup((uint64,uint64,address,uint256,bytes32,address,address,uint256,string,uint64,(uint256,uint256,uint256,uint256)),address,address[],address)' - ](config.rollupConfig, config.batchPoster, config.validators, feeToken, { - value: feeCost, - }) + const createRollupTx = await rollupCreator.createRollup( + config.rollupConfig, + config.batchPoster, + config.validators, + feeToken, + true, + MAX_FER_PER_GAS, + { + value: feeCost, + } + ) const createRollupReceipt = await createRollupTx.wait() const rollupCreatedEvent = createRollupReceipt.events?.find( diff --git a/src/rollup/DeployHelper.sol b/src/rollup/DeployHelper.sol index dabbf1fd..eede8574 100644 --- a/src/rollup/DeployHelper.sol +++ b/src/rollup/DeployHelper.sol @@ -42,20 +42,20 @@ contract DeployHelper { hex"04f90a388085174876e800830c35008080b909e5608060405234801561001057600080fd5b506109c5806100206000396000f3fe608060405234801561001057600080fd5b50600436106100a5576000357c010000000000000000000000000000000000000000000000000000000090048063a41e7d5111610078578063a41e7d51146101d4578063aabbb8ca1461020a578063b705676514610236578063f712f3e814610280576100a5565b806329965a1d146100aa5780633d584063146100e25780635df8122f1461012457806365ba36c114610152575b600080fd5b6100e0600480360360608110156100c057600080fd5b50600160a060020a038135811691602081013591604090910135166102b6565b005b610108600480360360208110156100f857600080fd5b5035600160a060020a0316610570565b60408051600160a060020a039092168252519081900360200190f35b6100e06004803603604081101561013a57600080fd5b50600160a060020a03813581169160200135166105bc565b6101c26004803603602081101561016857600080fd5b81019060208101813564010000000081111561018357600080fd5b82018360208201111561019557600080fd5b803590602001918460018302840111640100000000831117156101b757600080fd5b5090925090506106b3565b60408051918252519081900360200190f35b6100e0600480360360408110156101ea57600080fd5b508035600160a060020a03169060200135600160e060020a0319166106ee565b6101086004803603604081101561022057600080fd5b50600160a060020a038135169060200135610778565b61026c6004803603604081101561024c57600080fd5b508035600160a060020a03169060200135600160e060020a0319166107ef565b604080519115158252519081900360200190f35b61026c6004803603604081101561029657600080fd5b508035600160a060020a03169060200135600160e060020a0319166108aa565b6000600160a060020a038416156102cd57836102cf565b335b9050336102db82610570565b600160a060020a031614610339576040805160e560020a62461bcd02815260206004820152600f60248201527f4e6f7420746865206d616e616765720000000000000000000000000000000000604482015290519081900360640190fd5b6103428361092a565b15610397576040805160e560020a62461bcd02815260206004820152601a60248201527f4d757374206e6f7420626520616e204552433136352068617368000000000000604482015290519081900360640190fd5b600160a060020a038216158015906103b85750600160a060020a0382163314155b156104ff5760405160200180807f455243313832305f4143434550545f4d4147494300000000000000000000000081525060140190506040516020818303038152906040528051906020012082600160a060020a031663249cb3fa85846040518363ffffffff167c01000000000000000000000000000000000000000000000000000000000281526004018083815260200182600160a060020a0316600160a060020a031681526020019250505060206040518083038186803b15801561047e57600080fd5b505afa158015610492573d6000803e3d6000fd5b505050506040513d60208110156104a857600080fd5b5051146104ff576040805160e560020a62461bcd02815260206004820181905260248201527f446f6573206e6f7420696d706c656d656e742074686520696e74657266616365604482015290519081900360640190fd5b600160a060020a03818116600081815260208181526040808320888452909152808220805473ffffffffffffffffffffffffffffffffffffffff19169487169485179055518692917f93baa6efbd2244243bfee6ce4cfdd1d04fc4c0e9a786abd3a41313bd352db15391a450505050565b600160a060020a03818116600090815260016020526040812054909116151561059a5750806105b7565b50600160a060020a03808216600090815260016020526040902054165b919050565b336105c683610570565b600160a060020a031614610624576040805160e560020a62461bcd02815260206004820152600f60248201527f4e6f7420746865206d616e616765720000000000000000000000000000000000604482015290519081900360640190fd5b81600160a060020a031681600160a060020a0316146106435780610646565b60005b600160a060020a03838116600081815260016020526040808220805473ffffffffffffffffffffffffffffffffffffffff19169585169590951790945592519184169290917f605c2dbf762e5f7d60a546d42e7205dcb1b011ebc62a61736a57c9089d3a43509190a35050565b600082826040516020018083838082843780830192505050925050506040516020818303038152906040528051906020012090505b92915050565b6106f882826107ef565b610703576000610705565b815b600160a060020a03928316600081815260208181526040808320600160e060020a031996909616808452958252808320805473ffffffffffffffffffffffffffffffffffffffff19169590971694909417909555908152600284528181209281529190925220805460ff19166001179055565b600080600160a060020a038416156107905783610792565b335b905061079d8361092a565b156107c357826107ad82826108aa565b6107b85760006107ba565b815b925050506106e8565b600160a060020a0390811660009081526020818152604080832086845290915290205416905092915050565b6000808061081d857f01ffc9a70000000000000000000000000000000000000000000000000000000061094c565b909250905081158061082d575080155b1561083d576000925050506106e8565b61084f85600160e060020a031961094c565b909250905081158061086057508015155b15610870576000925050506106e8565b61087a858561094c565b909250905060018214801561088f5750806001145b1561089f576001925050506106e8565b506000949350505050565b600160a060020a0382166000908152600260209081526040808320600160e060020a03198516845290915281205460ff1615156108f2576108eb83836107ef565b90506106e8565b50600160a060020a03808316600081815260208181526040808320600160e060020a0319871684529091529020549091161492915050565b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff161590565b6040517f01ffc9a7000000000000000000000000000000000000000000000000000000008082526004820183905260009182919060208160248189617530fa90519096909550935050505056fea165627a7a72305820377f4a2d4301ede9949f163f319021a6e9c687c292a5e2b2c4734c126b524e6c00291ba01820182018201820182018201820182018201820182018201820182018201820a01820182018201820182018201820182018201820182018201820182018201820"; uint256 internal constant GASLIMIT = 100_000; - uint256 internal constant MAXFEEPERGAS = 1_000_000_000; function _fundAndDeploy( address inbox, uint256 _value, address _l2Address, bytes memory payload, - bool _isUsingFeeToken + bool _isUsingFeeToken, + uint256 maxFeePerGas ) internal { uint256 submissionCost = IInboxBase(inbox).calculateRetryableSubmissionFee( 0, block.basefee ); - uint256 feeAmount = _value + submissionCost + GASLIMIT * MAXFEEPERGAS; + uint256 feeAmount = _value + submissionCost + GASLIMIT * maxFeePerGas; // fund the target L2 address if (_isUsingFeeToken) { @@ -66,7 +66,7 @@ contract DeployHelper { excessFeeRefundAddress: msg.sender, callValueRefundAddress: msg.sender, gasLimit: GASLIMIT, - maxFeePerGas: MAXFEEPERGAS, + maxFeePerGas: maxFeePerGas, tokenTotalFeeAmount: feeAmount, data: "" }); @@ -78,7 +78,7 @@ contract DeployHelper { excessFeeRefundAddress: msg.sender, callValueRefundAddress: msg.sender, gasLimit: GASLIMIT, - maxFeePerGas: MAXFEEPERGAS, + maxFeePerGas: maxFeePerGas, data: "" }); } @@ -86,7 +86,11 @@ contract DeployHelper { IInboxBase(inbox).sendL2Message(payload); } - function perform(address _inbox, address _nativeToken) external payable { + function perform( + address _inbox, + address _nativeToken, + uint256 _maxFeePerGas + ) external payable { bool isUsingFeeToken = _nativeToken != address(0); _fundAndDeploy( @@ -94,17 +98,33 @@ contract DeployHelper { NICK_CREATE2_VALUE, NICK_CREATE2_DEPLOYER, NICK_CREATE2_PAYLOAD, - isUsingFeeToken + isUsingFeeToken, + _maxFeePerGas + ); + _fundAndDeploy( + _inbox, + ERC2470_VALUE, + ERC2470_DEPLOYER, + ERC2470_PAYLOAD, + isUsingFeeToken, + _maxFeePerGas ); - _fundAndDeploy(_inbox, ERC2470_VALUE, ERC2470_DEPLOYER, ERC2470_PAYLOAD, isUsingFeeToken); _fundAndDeploy( _inbox, ZOLTU_VALUE, ZOLTU_CREATE2_DEPLOYER, ZOLTU_CREATE2_PAYLOAD, - isUsingFeeToken + isUsingFeeToken, + _maxFeePerGas + ); + _fundAndDeploy( + _inbox, + ERC1820_VALUE, + ERC1820_DEPLOYER, + ERC1820_PAYLOAD, + isUsingFeeToken, + _maxFeePerGas ); - _fundAndDeploy(_inbox, ERC1820_VALUE, ERC1820_DEPLOYER, ERC1820_PAYLOAD, isUsingFeeToken); // if paying with ETH refund the caller if (!isUsingFeeToken) { @@ -112,7 +132,11 @@ contract DeployHelper { } } - function getDeploymentTotalCost(IInboxBase inbox) public view returns (uint256) { + function getDeploymentTotalCost(IInboxBase inbox, uint256 maxFeePerGas) + public + view + returns (uint256) + { uint256 submissionCost = inbox.calculateRetryableSubmissionFee(0, block.basefee); return NICK_CREATE2_VALUE + @@ -120,6 +144,6 @@ contract DeployHelper { ZOLTU_VALUE + ERC1820_VALUE + 4 * - (submissionCost + GASLIMIT * MAXFEEPERGAS); + (submissionCost + GASLIMIT * maxFeePerGas); } } diff --git a/src/rollup/RollupCreator.sol b/src/rollup/RollupCreator.sol index 7692a200..646eb1c6 100644 --- a/src/rollup/RollupCreator.sol +++ b/src/rollup/RollupCreator.sol @@ -81,29 +81,6 @@ contract RollupCreator is Ownable { emit TemplatesUpdated(); } - /** - * @notice Create a new rollup and deploy L2 factories via retryable tickets - * @dev After this setup: - * @dev - Rollup should be the owner of bridge - * @dev - RollupOwner should be the owner of Rollup's ProxyAdmin - * @dev - RollupOwner should be the owner of Rollup - * @dev - Bridge should have a single inbox and outbox - * @dev - Validators and batch poster should be set if provided - * @param config The configuration for the rollup - * @param _batchPoster The address of the batch poster, not used when set to zero address - * @param _validators The list of validator addresses, not used when set to empty list - * @param _nativeToken Address of the custom fee token used by rollup. If rollup is ETH-based address(0) should be provided - * @return The address of the newly created rollup - */ - function createRollup( - Config memory config, - address _batchPoster, - address[] calldata _validators, - address _nativeToken - ) external payable returns (address) { - return createRollup(config, _batchPoster, _validators, _nativeToken, true); - } - /** * @notice Create a new rollup * @dev After this setup: @@ -121,6 +98,7 @@ contract RollupCreator is Ownable { * doesn't require paying the L1 gas. If deployment is instead done directly via L2 TX, there is a risk of gas price * spike which results in burned nonce 0. That would mean we permanently lost capability to deploy deterministic * factory at expected canonical address. + * @param _maxFeePerGasForRetryables price bid for L2 execution. * @return The address of the newly created rollup */ function createRollup( @@ -128,13 +106,11 @@ contract RollupCreator is Ownable { address _batchPoster, address[] calldata _validators, address _nativeToken, - bool _deployFactoriesToL2 + bool _deployFactoriesToL2, + uint256 _maxFeePerGasForRetryables ) public payable returns (address) { ProxyAdmin proxyAdmin = new ProxyAdmin(); - // deploy and init upgrade executor - address upgradeExecutor = _deployUpgradeExecutor(config.owner, proxyAdmin); - // Create the rollup proxy to figure out the address and initialize it later RollupProxy rollup = new RollupProxy{salt: keccak256(abi.encode(config))}(); @@ -168,6 +144,10 @@ contract RollupCreator is Ownable { osp ); + // deploy and init upgrade executor + address upgradeExecutor = _deployUpgradeExecutor(config.owner, proxyAdmin); + + // upgradeExecutor shall be proxyAdmin's owner proxyAdmin.transferOwnership(address(upgradeExecutor)); // initialize the rollup with this contract as owner to set batch poster and validators @@ -206,7 +186,9 @@ contract RollupCreator is Ownable { IRollupAdmin(address(rollup)).setOwner(address(upgradeExecutor)); if (_deployFactoriesToL2) { - _deployFactories(address(bridgeContracts.inbox), _nativeToken); + _deployFactories( + address(bridgeContracts.inbox), _nativeToken, _maxFeePerGasForRetryables + ); } emit RollupCreated( @@ -246,24 +228,28 @@ contract RollupCreator is Ownable { return address(upgradeExecutor); } - function _deployFactories(address _inbox, address _nativeToken) internal { + function _deployFactories(address _inbox, address _nativeToken, uint256 _maxFeePerGas) + internal + { if (_nativeToken == address(0)) { // we need to fund 4 retryable tickets - uint256 cost = l2FactoriesDeployer.getDeploymentTotalCost(IInboxBase(_inbox)); + uint256 cost = + l2FactoriesDeployer.getDeploymentTotalCost(IInboxBase(_inbox), _maxFeePerGas); // do it - l2FactoriesDeployer.perform{value: cost}(_inbox, _nativeToken); + l2FactoriesDeployer.perform{value: cost}(_inbox, _nativeToken, _maxFeePerGas); // refund the caller - (bool sent, ) = msg.sender.call{value: address(this).balance}(""); + (bool sent,) = msg.sender.call{value: address(this).balance}(""); require(sent, "Refund failed"); } else { // Transfer fee token amount needed to pay for retryable fees to the inbox. - uint256 totalFee = l2FactoriesDeployer.getDeploymentTotalCost(IInboxBase(_inbox)); + uint256 totalFee = + l2FactoriesDeployer.getDeploymentTotalCost(IInboxBase(_inbox), _maxFeePerGas); IERC20(_nativeToken).safeTransferFrom(msg.sender, _inbox, totalFee); // do it - l2FactoriesDeployer.perform(_inbox, _nativeToken); + l2FactoriesDeployer.perform(_inbox, _nativeToken, _maxFeePerGas); } } } diff --git a/test/foundry/RollupCreator.t.sol b/test/foundry/RollupCreator.t.sol index 1cd4792e..ec9373e6 100644 --- a/test/foundry/RollupCreator.t.sol +++ b/test/foundry/RollupCreator.t.sol @@ -28,6 +28,9 @@ contract RollupCreatorTest is Test { IRollupUser public rollupUser; DeployHelper public deployHelper; + // 1 gwei + uint256 MAX_FEE_PER_GAS = 1_000_000_000; + /* solhint-disable func-name-mixedcase */ function setUp() public { @@ -99,7 +102,7 @@ contract RollupCreatorTest is Test { validators[1] = makeAddr("validator2"); address rollupAddress = rollupCreator.createRollup{value: factoryDeploymentFunds}( - config, batchPoster, validators, address(0) + config, batchPoster, validators, address(0), true, MAX_FEE_PER_GAS ); vm.stopPrank(); @@ -163,7 +166,7 @@ contract RollupCreatorTest is Test { ); // check upgrade executor owns proxyAdmin - address upgradeExecutorExpectedAddress = computeCreateAddress(address(rollupCreator), 2); + address upgradeExecutorExpectedAddress = computeCreateAddress(address(rollupCreator), 4); assertEq( ProxyAdmin(_getProxyAdmin(address(rollup.sequencerInbox()))).owner(), upgradeExecutorExpectedAddress, @@ -188,7 +191,8 @@ contract RollupCreatorTest is Test { // check funds are refunded uint256 balanceAfter = deployer.balance; - uint256 factoryDeploymentCost = deployHelper.getDeploymentTotalCost(rollup.inbox()); + uint256 factoryDeploymentCost = + deployHelper.getDeploymentTotalCost(rollup.inbox(), MAX_FEE_PER_GAS); assertEq(balanceBefore - balanceAfter, factoryDeploymentCost, "Invalid balance"); } @@ -223,8 +227,9 @@ contract RollupCreatorTest is Test { address[] memory validators = new address[](2); validators[0] = makeAddr("validator1"); validators[1] = makeAddr("validator2"); - address rollupAddress = - rollupCreator.createRollup(config, batchPoster, validators, nativeToken); + address rollupAddress = rollupCreator.createRollup( + config, batchPoster, validators, nativeToken, true, MAX_FEE_PER_GAS + ); vm.stopPrank(); @@ -292,7 +297,7 @@ contract RollupCreatorTest is Test { ); // check upgrade executor owns proxyAdmin - address upgradeExecutorExpectedAddress = computeCreateAddress(address(rollupCreator), 2); + address upgradeExecutorExpectedAddress = computeCreateAddress(address(rollupCreator), 4); assertEq( ProxyAdmin(_getProxyAdmin(address(rollup.sequencerInbox()))).owner(), upgradeExecutorExpectedAddress, @@ -346,7 +351,7 @@ contract RollupCreatorTest is Test { validators[0] = makeAddr("validator1"); validators[1] = makeAddr("validator2"); address rollupAddress = rollupCreator.createRollup{value: factoryDeploymentFunds}( - config, batchPoster, validators, address(0) + config, batchPoster, validators, address(0), true, MAX_FEE_PER_GAS ); vm.stopPrank(); @@ -356,7 +361,7 @@ contract RollupCreatorTest is Test { address inbox = address(rollup.inbox()); address proxyAdmin = computeCreateAddress(address(rollupCreator), 1); IUpgradeExecutor upgradeExecutor = - IUpgradeExecutor(computeCreateAddress(address(rollupCreator), 2)); + IUpgradeExecutor(computeCreateAddress(address(rollupCreator), 4)); Dummy newLogicImpl = new Dummy(); bytes memory data = abi.encodeWithSelector( From e918f0001b0a2989cc69829f2dcc53f464a706c4 Mon Sep 17 00:00:00 2001 From: Goran Vladika Date: Mon, 11 Sep 2023 15:07:03 +0200 Subject: [PATCH 076/292] Prettier --- src/rollup/RollupCreator.sol | 26 +++++++++++++++++--------- 1 file changed, 17 insertions(+), 9 deletions(-) diff --git a/src/rollup/RollupCreator.sol b/src/rollup/RollupCreator.sol index 646eb1c6..b681c855 100644 --- a/src/rollup/RollupCreator.sol +++ b/src/rollup/RollupCreator.sol @@ -187,7 +187,9 @@ contract RollupCreator is Ownable { if (_deployFactoriesToL2) { _deployFactories( - address(bridgeContracts.inbox), _nativeToken, _maxFeePerGasForRetryables + address(bridgeContracts.inbox), + _nativeToken, + _maxFeePerGasForRetryables ); } @@ -228,24 +230,30 @@ contract RollupCreator is Ownable { return address(upgradeExecutor); } - function _deployFactories(address _inbox, address _nativeToken, uint256 _maxFeePerGas) - internal - { + function _deployFactories( + address _inbox, + address _nativeToken, + uint256 _maxFeePerGas + ) internal { if (_nativeToken == address(0)) { // we need to fund 4 retryable tickets - uint256 cost = - l2FactoriesDeployer.getDeploymentTotalCost(IInboxBase(_inbox), _maxFeePerGas); + uint256 cost = l2FactoriesDeployer.getDeploymentTotalCost( + IInboxBase(_inbox), + _maxFeePerGas + ); // do it l2FactoriesDeployer.perform{value: cost}(_inbox, _nativeToken, _maxFeePerGas); // refund the caller - (bool sent,) = msg.sender.call{value: address(this).balance}(""); + (bool sent, ) = msg.sender.call{value: address(this).balance}(""); require(sent, "Refund failed"); } else { // Transfer fee token amount needed to pay for retryable fees to the inbox. - uint256 totalFee = - l2FactoriesDeployer.getDeploymentTotalCost(IInboxBase(_inbox), _maxFeePerGas); + uint256 totalFee = l2FactoriesDeployer.getDeploymentTotalCost( + IInboxBase(_inbox), + _maxFeePerGas + ); IERC20(_nativeToken).safeTransferFrom(msg.sender, _inbox, totalFee); // do it From d72f523b87e5c443fec42fc572fecfa48858a3a3 Mon Sep 17 00:00:00 2001 From: Goran Vladika Date: Mon, 11 Sep 2023 15:11:59 +0200 Subject: [PATCH 077/292] Fix hardhat test --- test/contract/arbRollup.spec.ts | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/test/contract/arbRollup.spec.ts b/test/contract/arbRollup.spec.ts index 8b2c7a35..3b6317c2 100644 --- a/test/contract/arbRollup.spec.ts +++ b/test/contract/arbRollup.spec.ts @@ -196,13 +196,14 @@ const setup = async () => { deployHelper.address ) - const response = await rollupCreator[ - 'createRollup((uint64,uint64,address,uint256,bytes32,address,address,uint256,string,uint64,(uint256,uint256,uint256,uint256)),address,address[],address)' - ]( + const maxFeePerGas = BigNumber.from('1000000000') + const response = await rollupCreator.createRollup( await getDefaultConfig(), await sequencer.getAddress(), [await val1.getAddress(), await val2.getAddress(), await val3.getAddress()], ethers.constants.AddressZero, + true, + maxFeePerGas, { value: ethers.utils.parseEther('0.2') } ) From f326c9fe5fe272327b6003ed3834a86a647b5a7d Mon Sep 17 00:00:00 2001 From: Goran Vladika Date: Tue, 12 Sep 2023 10:06:59 +0200 Subject: [PATCH 078/292] Use 21000 gas limit for funding L2 addresses --- scripts/rollupCreation.ts | 2 +- src/rollup/DeployHelper.sol | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/scripts/rollupCreation.ts b/scripts/rollupCreation.ts index 5b9f65f3..7db2f311 100644 --- a/scripts/rollupCreation.ts +++ b/scripts/rollupCreation.ts @@ -114,7 +114,7 @@ export async function createRollup(feeToken?: string) { console.log("Congratulations! 🎉🎉🎉 All DONE! Here's your addresses:") console.log('RollupProxy Contract created at address:', rollupAddress) console.log('Wait a minute before starting the contract verification') - await sleep(2 * 60 * 1000) + await sleep(1 * 60 * 1000) console.log( `Attempting to verify Rollup contract at address ${rollupAddress}...` ) diff --git a/src/rollup/DeployHelper.sol b/src/rollup/DeployHelper.sol index eede8574..1fdf7b0d 100644 --- a/src/rollup/DeployHelper.sol +++ b/src/rollup/DeployHelper.sol @@ -41,7 +41,7 @@ contract DeployHelper { bytes public constant ERC1820_PAYLOAD = hex"04f90a388085174876e800830c35008080b909e5608060405234801561001057600080fd5b506109c5806100206000396000f3fe608060405234801561001057600080fd5b50600436106100a5576000357c010000000000000000000000000000000000000000000000000000000090048063a41e7d5111610078578063a41e7d51146101d4578063aabbb8ca1461020a578063b705676514610236578063f712f3e814610280576100a5565b806329965a1d146100aa5780633d584063146100e25780635df8122f1461012457806365ba36c114610152575b600080fd5b6100e0600480360360608110156100c057600080fd5b50600160a060020a038135811691602081013591604090910135166102b6565b005b610108600480360360208110156100f857600080fd5b5035600160a060020a0316610570565b60408051600160a060020a039092168252519081900360200190f35b6100e06004803603604081101561013a57600080fd5b50600160a060020a03813581169160200135166105bc565b6101c26004803603602081101561016857600080fd5b81019060208101813564010000000081111561018357600080fd5b82018360208201111561019557600080fd5b803590602001918460018302840111640100000000831117156101b757600080fd5b5090925090506106b3565b60408051918252519081900360200190f35b6100e0600480360360408110156101ea57600080fd5b508035600160a060020a03169060200135600160e060020a0319166106ee565b6101086004803603604081101561022057600080fd5b50600160a060020a038135169060200135610778565b61026c6004803603604081101561024c57600080fd5b508035600160a060020a03169060200135600160e060020a0319166107ef565b604080519115158252519081900360200190f35b61026c6004803603604081101561029657600080fd5b508035600160a060020a03169060200135600160e060020a0319166108aa565b6000600160a060020a038416156102cd57836102cf565b335b9050336102db82610570565b600160a060020a031614610339576040805160e560020a62461bcd02815260206004820152600f60248201527f4e6f7420746865206d616e616765720000000000000000000000000000000000604482015290519081900360640190fd5b6103428361092a565b15610397576040805160e560020a62461bcd02815260206004820152601a60248201527f4d757374206e6f7420626520616e204552433136352068617368000000000000604482015290519081900360640190fd5b600160a060020a038216158015906103b85750600160a060020a0382163314155b156104ff5760405160200180807f455243313832305f4143434550545f4d4147494300000000000000000000000081525060140190506040516020818303038152906040528051906020012082600160a060020a031663249cb3fa85846040518363ffffffff167c01000000000000000000000000000000000000000000000000000000000281526004018083815260200182600160a060020a0316600160a060020a031681526020019250505060206040518083038186803b15801561047e57600080fd5b505afa158015610492573d6000803e3d6000fd5b505050506040513d60208110156104a857600080fd5b5051146104ff576040805160e560020a62461bcd02815260206004820181905260248201527f446f6573206e6f7420696d706c656d656e742074686520696e74657266616365604482015290519081900360640190fd5b600160a060020a03818116600081815260208181526040808320888452909152808220805473ffffffffffffffffffffffffffffffffffffffff19169487169485179055518692917f93baa6efbd2244243bfee6ce4cfdd1d04fc4c0e9a786abd3a41313bd352db15391a450505050565b600160a060020a03818116600090815260016020526040812054909116151561059a5750806105b7565b50600160a060020a03808216600090815260016020526040902054165b919050565b336105c683610570565b600160a060020a031614610624576040805160e560020a62461bcd02815260206004820152600f60248201527f4e6f7420746865206d616e616765720000000000000000000000000000000000604482015290519081900360640190fd5b81600160a060020a031681600160a060020a0316146106435780610646565b60005b600160a060020a03838116600081815260016020526040808220805473ffffffffffffffffffffffffffffffffffffffff19169585169590951790945592519184169290917f605c2dbf762e5f7d60a546d42e7205dcb1b011ebc62a61736a57c9089d3a43509190a35050565b600082826040516020018083838082843780830192505050925050506040516020818303038152906040528051906020012090505b92915050565b6106f882826107ef565b610703576000610705565b815b600160a060020a03928316600081815260208181526040808320600160e060020a031996909616808452958252808320805473ffffffffffffffffffffffffffffffffffffffff19169590971694909417909555908152600284528181209281529190925220805460ff19166001179055565b600080600160a060020a038416156107905783610792565b335b905061079d8361092a565b156107c357826107ad82826108aa565b6107b85760006107ba565b815b925050506106e8565b600160a060020a0390811660009081526020818152604080832086845290915290205416905092915050565b6000808061081d857f01ffc9a70000000000000000000000000000000000000000000000000000000061094c565b909250905081158061082d575080155b1561083d576000925050506106e8565b61084f85600160e060020a031961094c565b909250905081158061086057508015155b15610870576000925050506106e8565b61087a858561094c565b909250905060018214801561088f5750806001145b1561089f576001925050506106e8565b506000949350505050565b600160a060020a0382166000908152600260209081526040808320600160e060020a03198516845290915281205460ff1615156108f2576108eb83836107ef565b90506106e8565b50600160a060020a03808316600081815260208181526040808320600160e060020a0319871684529091529020549091161492915050565b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff161590565b6040517f01ffc9a7000000000000000000000000000000000000000000000000000000008082526004820183905260009182919060208160248189617530fa90519096909550935050505056fea165627a7a72305820377f4a2d4301ede9949f163f319021a6e9c687c292a5e2b2c4734c126b524e6c00291ba01820182018201820182018201820182018201820182018201820182018201820a01820182018201820182018201820182018201820182018201820182018201820"; - uint256 internal constant GASLIMIT = 100_000; + uint256 internal constant GASLIMIT = 21_000; function _fundAndDeploy( address inbox, From ad93bf5f56884ae048929b2b6464dcc10659cc3a Mon Sep 17 00:00:00 2001 From: Goran Vladika Date: Tue, 12 Sep 2023 10:27:41 +0200 Subject: [PATCH 079/292] Make natspec comment clearer --- src/rollup/RollupCreator.sol | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/rollup/RollupCreator.sol b/src/rollup/RollupCreator.sol index b681c855..0dfb7a82 100644 --- a/src/rollup/RollupCreator.sol +++ b/src/rollup/RollupCreator.sol @@ -95,9 +95,9 @@ contract RollupCreator is Ownable { * @param _nativeToken Address of the custom fee token used by rollup. If rollup is ETH-based address(0) should be provided * @param _deployFactoriesToL2 Whether to deploy L2 factories using retryable tickets. If true, retryables need to be paid for in native currency. * Deploying factories via retyrable tickets at rollup creation time is the most reliable method to do it since it - * doesn't require paying the L1 gas. If deployment is instead done directly via L2 TX, there is a risk of gas price - * spike which results in burned nonce 0. That would mean we permanently lost capability to deploy deterministic - * factory at expected canonical address. + * doesn't require paying the L1 gas. If deployment is not done as part of rollup creation TX, there is a risk that + * anyone can try to deploy factories and potentially burn the nonce 0 (ie. due to gas price spike when doing direct + * L2 TX). That would mean we permanently lost capability to deploy deterministic factory at expected address. * @param _maxFeePerGasForRetryables price bid for L2 execution. * @return The address of the newly created rollup */ From 718c185e4c1c66c06eaf604483da225fd6b8c5de Mon Sep 17 00:00:00 2001 From: Goran Vladika Date: Tue, 12 Sep 2023 10:34:06 +0200 Subject: [PATCH 080/292] Typo --- src/rollup/RollupCreator.sol | 2 +- test/foundry/Inbox.t.sol | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/src/rollup/RollupCreator.sol b/src/rollup/RollupCreator.sol index 0dfb7a82..98633541 100644 --- a/src/rollup/RollupCreator.sol +++ b/src/rollup/RollupCreator.sol @@ -94,7 +94,7 @@ contract RollupCreator is Ownable { * @param _validators The list of validator addresses, not used when set to empty list * @param _nativeToken Address of the custom fee token used by rollup. If rollup is ETH-based address(0) should be provided * @param _deployFactoriesToL2 Whether to deploy L2 factories using retryable tickets. If true, retryables need to be paid for in native currency. - * Deploying factories via retyrable tickets at rollup creation time is the most reliable method to do it since it + * Deploying factories via retryable tickets at rollup creation time is the most reliable method to do it since it * doesn't require paying the L1 gas. If deployment is not done as part of rollup creation TX, there is a risk that * anyone can try to deploy factories and potentially burn the nonce 0 (ie. due to gas price spike when doing direct * L2 TX). That would mean we permanently lost capability to deploy deterministic factory at expected address. diff --git a/test/foundry/Inbox.t.sol b/test/foundry/Inbox.t.sol index 839538d0..2734eb81 100644 --- a/test/foundry/Inbox.t.sol +++ b/test/foundry/Inbox.t.sol @@ -132,7 +132,7 @@ contract InboxTest is AbsInboxTest { uint256 ethToSend = 0.3 ether; - // retyrable params + // retryable params uint256 l2CallValue = 0.1 ether; uint256 maxSubmissionCost = 0.1 ether; uint256 gasLimit = 100_000; @@ -198,7 +198,7 @@ contract InboxTest is AbsInboxTest { uint256 ethToSend = 0.3 ether; - // retyrable params + // retryable params uint256 l2CallValue = 0.1 ether; uint256 maxSubmissionCost = 0.1 ether; uint256 gasLimit = 100_000; @@ -441,7 +441,7 @@ contract InboxTest is AbsInboxTest { uint256 ethToSend = 0.3 ether; - // retyrable params + // retryable params uint256 l2CallValue = 0.1 ether; uint256 maxSubmissionCost = 0.1 ether; uint256 gasLimit = 100_000; @@ -507,7 +507,7 @@ contract InboxTest is AbsInboxTest { uint256 ethToSend = 0.3 ether; - // retyrable params + // retryable params uint256 l2CallValue = 0.1 ether; uint256 maxSubmissionCost = 0.1 ether; uint256 gasLimit = 100_000; From a287c1bdc33552f434a09e1bcddf57a096431d34 Mon Sep 17 00:00:00 2001 From: Goran Vladika Date: Tue, 12 Sep 2023 15:28:41 +0200 Subject: [PATCH 081/292] Add missing contract verification --- scripts/deployment.ts | 27 ++++++++++++++++++++++++++- 1 file changed, 26 insertions(+), 1 deletion(-) diff --git a/scripts/deployment.ts b/scripts/deployment.ts index bad8e0b5..12723b60 100644 --- a/scripts/deployment.ts +++ b/scripts/deployment.ts @@ -138,7 +138,7 @@ async function main() { console.log('Template is set on the Rollup Creator') // get and verify ETH-based bridge contracts - const { bridge, sequencerInbox, inbox, outbox } = + const { bridge, sequencerInbox, inbox, rollupEventInbox, outbox } = await contracts.bridgeCreator.ethBasedTemplates() console.log('Wait a minute before starting contract verification') @@ -158,6 +158,18 @@ async function main() { ) console.log(`"inbox implementation contract" created at address:`, inbox) await verifyContract('Inbox', inbox, [], 'src/bridge/Inbox.sol:Inbox') + + console.log( + `"rollupEventInbox implementation contract" created at address:`, + rollupEventInbox + ) + await verifyContract( + 'RollupEventInbox', + rollupEventInbox, + [], + 'src/bridge/RollupEventInbox.sol:RollupEventInbox' + ) + console.log(`"outbox implementation contract" created at address:`, outbox) await verifyContract('Outbox', outbox, [], 'src/bridge/Outbox.sol:Outbox') @@ -166,6 +178,7 @@ async function main() { bridge: erc20Bridge, sequencerInbox: erc20SeqInbox, inbox: erc20Inbox, + rollupEventInbox: erc20RollupEventInbox, outbox: erc20Outbox, } = await contracts.bridgeCreator.erc20BasedTemplates() @@ -199,6 +212,18 @@ async function main() { [], 'src/bridge/ERC20Inbox.sol:ERC20Inbox' ) + + console.log( + `"erc20 rollupEventInbox implementation contract" created at address:`, + erc20RollupEventInbox + ) + await verifyContract( + 'ERC20RollupEventInbox', + erc20RollupEventInbox, + [], + 'src/bridge/ERC20RollupEventInbox.sol:ERC20RollupEventInbox' + ) + console.log( `"erc20 outbox implementation contract" created at address:`, outbox From 1198cc3b5b13a05978be6dc0db27805701bc8d94 Mon Sep 17 00:00:00 2001 From: Goran Vladika Date: Tue, 12 Sep 2023 19:08:06 +0200 Subject: [PATCH 082/292] Set gap variables --- src/bridge/AbsBridge.sol | 2 +- src/bridge/AbsInbox.sol | 7 +++++++ src/bridge/AbsOutbox.sol | 7 +++++++ test/storage/Bridge.dot | 6 +++--- test/storage/Inbox.dot | 9 ++++++--- test/storage/Outbox.dot | 7 +++++-- 6 files changed, 29 insertions(+), 9 deletions(-) diff --git a/src/bridge/AbsBridge.sol b/src/bridge/AbsBridge.sol index 438c4341..88577d2d 100644 --- a/src/bridge/AbsBridge.sol +++ b/src/bridge/AbsBridge.sol @@ -298,5 +298,5 @@ abstract contract AbsBridge is Initializable, DelegateCallAware, IBridge { * variables without shifting down storage in the inheritance chain. * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps */ - uint256[50] private __gap; + uint256[40] private __gap; } diff --git a/src/bridge/AbsInbox.sol b/src/bridge/AbsInbox.sol index 95e89130..c02e723d 100644 --- a/src/bridge/AbsInbox.sol +++ b/src/bridge/AbsInbox.sol @@ -343,4 +343,11 @@ abstract contract AbsInbox is DelegateCallAware, PausableUpgradeable, IInboxBase view virtual returns (uint256); + + /** + * @dev This empty reserved space is put in place to allow future versions to add new + * variables without shifting down storage in the inheritance chain. + * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps + */ + uint256[47] private __gap; } diff --git a/src/bridge/AbsOutbox.sol b/src/bridge/AbsOutbox.sol index 59eb4797..2b87c726 100644 --- a/src/bridge/AbsOutbox.sol +++ b/src/bridge/AbsOutbox.sol @@ -292,4 +292,11 @@ abstract contract AbsOutbox is DelegateCallAware, IOutbox { /// rollup this amount shall always be 0, because amount of ETH being withdrawn can be read from msg.value. /// @return amount of native token being withdrawn in case of ERC20-based rollup, or 0 in case of ETH-based rollup function _amountToSetInContext(uint256 value) internal pure virtual returns (uint256); + + /** + * @dev This empty reserved space is put in place to allow future versions to add new + * variables without shifting down storage in the inheritance chain. + * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps + */ + uint256[42] private __gap; } diff --git a/test/storage/Bridge.dot b/test/storage/Bridge.dot index a7fc3978..c98a5e8c 100644 --- a/test/storage/Bridge.dot +++ b/test/storage/Bridge.dot @@ -4,7 +4,7 @@ rankdir=LR color=black arrowhead=open node [shape=record, style=filled, fillcolor=gray95 fontname="Courier New"] -8 [label="Bridge \<\\>\n | {{ slot| 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11-60 } | { type: \.variable (bytes) | { unallocated (30) | bool: Initializable._initializing (1) | bool: Initializable._initialized (1) } | { <5> mapping\(address=\>InOutInfo\): AbsBridge.allowedDelayedInboxesMap (32) } | { <8> mapping\(address=\>InOutInfo\): AbsBridge.allowedOutboxesMap (32) } | { <10> address[]: AbsBridge.allowedDelayedInboxList (32) } | { <12> address[]: AbsBridge.allowedOutboxList (32) } | { unallocated (12) | address: AbsBridge._activeOutbox (20) } | { <15> bytes32[]: AbsBridge.delayedInboxAccs (32) } | { <17> bytes32[]: AbsBridge.sequencerInboxAccs (32) } | { unallocated (12) | IOwnable: AbsBridge.rollup (20) } | { unallocated (12) | address: AbsBridge.sequencerInbox (20) } | { uint256: AbsBridge.sequencerReportedSubMessageCount (32) } | { <71> uint256[50]: AbsBridge.__gap (1600) }}}"] +8 [label="Bridge \<\\>\n | {{ slot| 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11-50 } | { type: \.variable (bytes) | { unallocated (30) | bool: Initializable._initializing (1) | bool: Initializable._initialized (1) } | { <5> mapping\(address=\>InOutInfo\): AbsBridge.allowedDelayedInboxesMap (32) } | { <8> mapping\(address=\>InOutInfo\): AbsBridge.allowedOutboxesMap (32) } | { <10> address[]: AbsBridge.allowedDelayedInboxList (32) } | { <12> address[]: AbsBridge.allowedOutboxList (32) } | { unallocated (12) | address: AbsBridge._activeOutbox (20) } | { <15> bytes32[]: AbsBridge.delayedInboxAccs (32) } | { <17> bytes32[]: AbsBridge.sequencerInboxAccs (32) } | { unallocated (12) | IOwnable: AbsBridge.rollup (20) } | { unallocated (12) | address: AbsBridge.sequencerInbox (20) } | { uint256: AbsBridge.sequencerReportedSubMessageCount (32) } | { <61> uint256[40]: AbsBridge.__gap (1280) }}}"] 1 [label="InOutInfo \<\\>\n | {{ slot| 0 | 1 } | { type: variable (bytes) | { uint256: index (32) } | { unallocated (31) | bool: allowed (1) }}}"] @@ -18,7 +18,7 @@ node [shape=record, style=filled, fillcolor=gray95 fontname="Courier New"] 6 [label="bytes32[]: sequencerInboxAccs \<\\>\n0x995663702627f3d8fc4237c51a46b303536bb17f3f65e07c08ad05fecbf4d88e | {{ slot| 0 } | { type: variable (bytes) | { bytes32 (32) }}}"] -7 [label="uint256[50]: __gap \<\\>\n | {{ slot| 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | 58 | 59 | 60 } | { type: variable (bytes) | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) }}}"] +7 [label="uint256[40]: __gap \<\\>\n | {{ slot| 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 } | { type: variable (bytes) | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) }}}"] 8:5 -> 1 8:8 -> 2 @@ -26,5 +26,5 @@ node [shape=record, style=filled, fillcolor=gray95 fontname="Courier New"] 8:12 -> 4 8:15 -> 5 8:17 -> 6 - 8:71 -> 7 + 8:61 -> 7 } \ No newline at end of file diff --git a/test/storage/Inbox.dot b/test/storage/Inbox.dot index 98c5cd42..cc97bcc9 100644 --- a/test/storage/Inbox.dot +++ b/test/storage/Inbox.dot @@ -4,12 +4,15 @@ rankdir=LR color=black arrowhead=open node [shape=record, style=filled, fillcolor=gray95 fontname="Courier New"] -3 [label="Inbox \<\\>\n | {{ slot| 0 | 1-50 | 51 | 52-100 | 101 | 102 | 103 } | { type: \.variable (bytes) | { unallocated (30) | bool: Initializable._initializing (1) | bool: Initializable._initialized (1) } | { <53> uint256[50]: ContextUpgradeable.__gap (1600) } | { unallocated (31) | bool: PausableUpgradeable._paused (1) } | { <104> uint256[49]: PausableUpgradeable.__gap (1568) } | { unallocated (12) | IBridge: AbsInbox.bridge (20) } | { unallocated (11) | bool: AbsInbox.allowListEnabled (1) | ISequencerInbox: AbsInbox.sequencerInbox (20) } | { mapping\(address=\>bool\): AbsInbox.isAllowed (32) }}}"] +4 [label="Inbox \<\\>\n | {{ slot| 0 | 1-50 | 51 | 52-100 | 101 | 102 | 103 | 104-150 } | { type: \.variable (bytes) | { unallocated (30) | bool: Initializable._initializing (1) | bool: Initializable._initialized (1) } | { <53> uint256[50]: ContextUpgradeable.__gap (1600) } | { unallocated (31) | bool: PausableUpgradeable._paused (1) } | { <104> uint256[49]: PausableUpgradeable.__gap (1568) } | { unallocated (12) | IBridge: AbsInbox.bridge (20) } | { unallocated (11) | bool: AbsInbox.allowListEnabled (1) | ISequencerInbox: AbsInbox.sequencerInbox (20) } | { mapping\(address=\>bool\): AbsInbox.isAllowed (32) } | { <156> uint256[47]: AbsInbox.__gap (1504) }}}"] 1 [label="uint256[50]: __gap \<\\>\n | {{ slot| 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 } | { type: variable (bytes) | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) }}}"] 2 [label="uint256[49]: __gap \<\\>\n | {{ slot| 52 | 53 | 54 | 55 | 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 | 72 | 73 | 74 | 75 | 76 | 77 | 78 | 79 | 80 | 81 | 82 | 83 | 84 | 85 | 86 | 87 | 88 | 89 | 90 | 91 | 92 | 93 | 94 | 95 | 96 | 97 | 98 | 99 | 100 } | { type: variable (bytes) | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) }}}"] - 3:53 -> 1 - 3:104 -> 2 +3 [label="uint256[47]: __gap \<\\>\n | {{ slot| 104 | 105 | 106 | 107 | 108 | 109 | 110 | 111 | 112 | 113 | 114 | 115 | 116 | 117 | 118 | 119 | 120 | 121 | 122 | 123 | 124 | 125 | 126 | 127 | 128 | 129 | 130 | 131 | 132 | 133 | 134 | 135 | 136 | 137 | 138 | 139 | 140 | 141 | 142 | 143 | 144 | 145 | 146 | 147 | 148 | 149 | 150 } | { type: variable (bytes) | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) }}}"] + + 4:53 -> 1 + 4:104 -> 2 + 4:156 -> 3 } \ No newline at end of file diff --git a/test/storage/Outbox.dot b/test/storage/Outbox.dot index de11992c..f2da1fcb 100644 --- a/test/storage/Outbox.dot +++ b/test/storage/Outbox.dot @@ -4,9 +4,12 @@ rankdir=LR color=black arrowhead=open node [shape=record, style=filled, fillcolor=gray95 fontname="Courier New"] -2 [label="Outbox \<\\>\n | {{ slot| 0 | 1 | 2 | 3 | 4-7 } | { type: \.variable (bytes) | { unallocated (12) | address: AbsOutbox.rollup (20) } | { unallocated (12) | IBridge: AbsOutbox.bridge (20) } | { mapping\(uint256=\>bytes32\): AbsOutbox.spent (32) } | { mapping\(bytes32=\>bytes32\): AbsOutbox.roots (32) } | { <11> L2ToL1Context: AbsOutbox.context (128) }}}"] +3 [label="Outbox \<\\>\n | {{ slot| 0 | 1 | 2 | 3 | 4-7 | 8-49 } | { type: \.variable (bytes) | { unallocated (12) | address: AbsOutbox.rollup (20) } | { unallocated (12) | IBridge: AbsOutbox.bridge (20) } | { mapping\(uint256=\>bytes32\): AbsOutbox.spent (32) } | { mapping\(bytes32=\>bytes32\): AbsOutbox.roots (32) } | { <11> L2ToL1Context: AbsOutbox.context (128) } | { <54> uint256[42]: AbsOutbox.__gap (1344) }}}"] 1 [label="L2ToL1Context \<\\>\n | {{ slot| 4 | 5 | 6 | 7 } | { type: variable (bytes) | { uint128: timestamp (16) | uint128: l2Block (16) } | { bytes32: outputId (32) } | { uint96: l1Block (12) | address: sender (20) } | { uint256: withdrawalAmount (32) }}}"] - 2:11 -> 1 +2 [label="uint256[42]: __gap \<\\>\n | {{ slot| 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 } | { type: variable (bytes) | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) }}}"] + + 3:11 -> 1 + 3:54 -> 2 } \ No newline at end of file From 60a1e5019e8a5c4d073f70f1714ab423969137ef Mon Sep 17 00:00:00 2001 From: Goran Vladika Date: Tue, 12 Sep 2023 19:17:26 +0200 Subject: [PATCH 083/292] Remove uneccessary dependencies --- package.json | 2 - yarn.lock | 5666 +++++++++++++++++++++++--------------------------- 2 files changed, 2659 insertions(+), 3009 deletions(-) diff --git a/package.json b/package.json index 457ab06c..da87cd57 100644 --- a/package.json +++ b/package.json @@ -35,8 +35,6 @@ "deploy-erc20-rollup": "hardhat run scripts/createERC20Rollup.ts" }, "dependencies": { - "@arbitrum/sdk": "^3.1.3", - "@ethersproject/providers": "^5.7.2", "@offchainlabs/upgrade-executor": "1.1.0-beta.0", "@openzeppelin/contracts": "4.5.0", "@openzeppelin/contracts-upgradeable": "4.5.2", diff --git a/yarn.lock b/yarn.lock index aeaaadee..23b7ba12 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2,15 +2,20 @@ # yarn lockfile v1 +"@aashutoshrathi/word-wrap@^1.2.3": + version "1.2.6" + resolved "https://registry.yarnpkg.com/@aashutoshrathi/word-wrap/-/word-wrap-1.2.6.tgz#bd9154aec9983f77b3a034ecaa015c2e4201f6cf" + integrity sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA== + "@aduh95/viz.js@^3.7.0": version "3.7.0" resolved "https://registry.yarnpkg.com/@aduh95/viz.js/-/viz.js-3.7.0.tgz#a20d86c5fc8f6abebdc39b96a4326e10375d77c0" integrity sha512-20Pk2Z98fbPLkECcrZSJszKos/OgtvJJR3NcbVfgCJ6EQjDNzW2P1BKqImOz3tJ952dvO2DWEhcLhQ1Wz1e9ng== "@arbitrum/sdk@^3.1.3": - version "3.1.3" - resolved "https://registry.yarnpkg.com/@arbitrum/sdk/-/sdk-3.1.3.tgz#75236043717a450b569faaa087687c51d525b0c3" - integrity sha512-Dn1or7/Guc3dItuiiWaoYQ37aCDwiWTZGPIrg4yBJW27BgiDGbo0mjPDAhKTh4p5NDOWyE8bZ0vZai86COZIUA== + version "3.1.10" + resolved "https://registry.yarnpkg.com/@arbitrum/sdk/-/sdk-3.1.10.tgz#ea8148c843ee38b24d1478fa283c1c34ee9561d7" + integrity sha512-aOxkk1A4XBrKJTGpz9da1EyXIkJu4c+wm/9PpTscdjNT268ZKXLTextN7qCs9JwoL1icFOyuH1R1u9mnjUSXkg== dependencies: "@ethersproject/address" "^5.0.8" "@ethersproject/bignumber" "^5.1.1" @@ -18,37 +23,69 @@ ethers "^5.1.0" "@babel/code-frame@^7.0.0": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.16.7.tgz#44416b6bd7624b998f5b1af5d470856c40138789" - integrity sha512-iAXqUn8IIeBTNd72xsFlgaXHkMBMt6y4HJp1tIaK465CWLT/fG1aqB7ykr95gHHmlBdGbFeWWfyB4NJJ0nmeIg== + version "7.22.13" + resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.22.13.tgz#e3c1c099402598483b7a8c46a721d1038803755e" + integrity sha512-XktuhWlJ5g+3TJXc5upd9Ks1HutSArik6jf2eAjYFyIOf4ej3RN+184cZbzDvbPnuTJIUhPKKJE3cIsYTiAT3w== dependencies: - "@babel/highlight" "^7.16.7" + "@babel/highlight" "^7.22.13" + chalk "^2.4.2" -"@babel/helper-validator-identifier@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.16.7.tgz#e8c602438c4a8195751243da9031d1607d247cad" - integrity sha512-hsEnFemeiW4D08A5gUAZxLBTXpZ39P+a+DGDsHw1yxqyQ/jzFEnxf5uTEGp+3bzAbNOxU1paTgYS4ECU/IgfDw== +"@babel/helper-validator-identifier@^7.22.5": + version "7.22.15" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.15.tgz#601fa28e4cc06786c18912dca138cec73b882044" + integrity sha512-4E/F9IIEi8WR94324mbDUMo074YTheJmd7eZF5vITTeYchqAi6sYXRLHUVsmkdmY4QjfKTcB2jB7dVP3NaBElQ== -"@babel/highlight@^7.16.7": - version "7.16.10" - resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.16.10.tgz#744f2eb81579d6eea753c227b0f570ad785aba88" - integrity sha512-5FnTQLSLswEj6IkgVw5KusNUUFY9ZGqe/TRFnP/BKYHYgfh7tc+C7mwiy95/yNP7Dh9x580Vv8r7u7ZfTBFxdw== +"@babel/highlight@^7.22.13": + version "7.22.13" + resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.22.13.tgz#9cda839e5d3be9ca9e8c26b6dd69e7548f0cbf16" + integrity sha512-C/BaXcnnvBCmHTpz/VGZ8jgtE2aYlW4hxDhseJAWZb7gqGM/qtCK6iZUb0TyKFf7BOUsBH7Q7fkRsDRhg1XklQ== dependencies: - "@babel/helper-validator-identifier" "^7.16.7" - chalk "^2.0.0" + "@babel/helper-validator-identifier" "^7.22.5" + chalk "^2.4.2" js-tokens "^4.0.0" -"@cspotcode/source-map-consumer@0.8.0": - version "0.8.0" - resolved "https://registry.yarnpkg.com/@cspotcode/source-map-consumer/-/source-map-consumer-0.8.0.tgz#33bf4b7b39c178821606f669bbc447a6a629786b" - integrity sha512-41qniHzTU8yAGbCp04ohlmSrZf8bkf/iJsl3V0dRGsQN/5GFfx+LbCSsCpp2gqrqjTVg/K6O8ycoV35JIwAzAg== +"@chainsafe/as-sha256@^0.3.1": + version "0.3.1" + resolved "https://registry.yarnpkg.com/@chainsafe/as-sha256/-/as-sha256-0.3.1.tgz#3639df0e1435cab03f4d9870cc3ac079e57a6fc9" + integrity sha512-hldFFYuf49ed7DAakWVXSJODuq3pzJEguD8tQ7h+sGkM18vja+OFoJI9krnGmgzyuZC2ETX0NOIcCTy31v2Mtg== -"@cspotcode/source-map-support@0.7.0": - version "0.7.0" - resolved "https://registry.yarnpkg.com/@cspotcode/source-map-support/-/source-map-support-0.7.0.tgz#4789840aa859e46d2f3173727ab707c66bf344f5" - integrity sha512-X4xqRHqN8ACt2aHVe51OxeA2HjbcL4MqFqXkrmQszJ1NOUuUu5u6Vqx/0lZSVNku7velL5FC/s5uEAj1lsBMhA== +"@chainsafe/persistent-merkle-tree@^0.4.2": + version "0.4.2" + resolved "https://registry.yarnpkg.com/@chainsafe/persistent-merkle-tree/-/persistent-merkle-tree-0.4.2.tgz#4c9ee80cc57cd3be7208d98c40014ad38f36f7ff" + integrity sha512-lLO3ihKPngXLTus/L7WHKaw9PnNJWizlOF1H9NNzHP6Xvh82vzg9F2bzkXhYIFshMZ2gTCEz8tq6STe7r5NDfQ== + dependencies: + "@chainsafe/as-sha256" "^0.3.1" + +"@chainsafe/persistent-merkle-tree@^0.5.0": + version "0.5.0" + resolved "https://registry.yarnpkg.com/@chainsafe/persistent-merkle-tree/-/persistent-merkle-tree-0.5.0.tgz#2b4a62c9489a5739dedd197250d8d2f5427e9f63" + integrity sha512-l0V1b5clxA3iwQLXP40zYjyZYospQLZXzBVIhhr9kDg/1qHZfzzHw0jj4VPBijfYCArZDlPkRi1wZaV2POKeuw== + dependencies: + "@chainsafe/as-sha256" "^0.3.1" + +"@chainsafe/ssz@^0.10.0": + version "0.10.2" + resolved "https://registry.yarnpkg.com/@chainsafe/ssz/-/ssz-0.10.2.tgz#c782929e1bb25fec66ba72e75934b31fd087579e" + integrity sha512-/NL3Lh8K+0q7A3LsiFq09YXS9fPE+ead2rr7vM2QK8PLzrNsw3uqrif9bpRX5UxgeRjM+vYi+boCM3+GM4ovXg== dependencies: - "@cspotcode/source-map-consumer" "0.8.0" + "@chainsafe/as-sha256" "^0.3.1" + "@chainsafe/persistent-merkle-tree" "^0.5.0" + +"@chainsafe/ssz@^0.9.2": + version "0.9.4" + resolved "https://registry.yarnpkg.com/@chainsafe/ssz/-/ssz-0.9.4.tgz#696a8db46d6975b600f8309ad3a12f7c0e310497" + integrity sha512-77Qtg2N1ayqs4Bg/wvnWfg5Bta7iy7IRh8XqXh7oNMeP2HBbBwx8m6yTpA8p0EHItWPEBkgZd5S5/LSlp3GXuQ== + dependencies: + "@chainsafe/as-sha256" "^0.3.1" + "@chainsafe/persistent-merkle-tree" "^0.4.2" + case "^1.6.3" + +"@cspotcode/source-map-support@^0.8.0": + version "0.8.1" + resolved "https://registry.yarnpkg.com/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz#00629c35a688e05a88b1cda684fb9d5e73f000a1" + integrity sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw== + dependencies: + "@jridgewell/trace-mapping" "0.3.9" "@ensdomains/ens@^0.4.4": version "0.4.5" @@ -66,21 +103,38 @@ resolved "https://registry.yarnpkg.com/@ensdomains/resolver/-/resolver-0.2.4.tgz#c10fe28bf5efbf49bff4666d909aed0265efbc89" integrity sha512-bvaTH34PMCbv6anRa9I/0zjLJgY4EuznbEMgbV77JBCQ9KNC46rzi0avuxpOfu+xDjPEtSFGqVEOr5GlUSGudA== -"@eslint/eslintrc@^1.3.2": - version "1.3.2" - resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-1.3.2.tgz#58b69582f3b7271d8fa67fe5251767a5b38ea356" - integrity sha512-AXYd23w1S/bv3fTs3Lz0vjiYemS08jWkI3hYyS9I1ry+0f+Yjs1wm+sU0BS8qDOPrBIkp4qHYC16I8uVtpLajQ== +"@eslint-community/eslint-utils@^4.2.0": + version "4.4.0" + resolved "https://registry.yarnpkg.com/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz#a23514e8fb9af1269d5f7788aa556798d61c6b59" + integrity sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA== + dependencies: + eslint-visitor-keys "^3.3.0" + +"@eslint-community/regexpp@^4.4.0", "@eslint-community/regexpp@^4.6.1": + version "4.8.1" + resolved "https://registry.yarnpkg.com/@eslint-community/regexpp/-/regexpp-4.8.1.tgz#8c4bb756cc2aa7eaf13cfa5e69c83afb3260c20c" + integrity sha512-PWiOzLIUAjN/w5K17PoF4n6sKBw0gqLHPhywmYHP4t1VFQQVYeb1yWsJwnMVEMl3tUHME7X/SJPZLmtG7XBDxQ== + +"@eslint/eslintrc@^2.1.2": + version "2.1.2" + resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-2.1.2.tgz#c6936b4b328c64496692f76944e755738be62396" + integrity sha512-+wvgpDsrB1YqAMdEUCcnTlpfVBH7Vqn6A/NT3D8WVXFIaKMlErPIZT3oCIAVCOtarRpMtelZLqJeU3t7WY6X6g== dependencies: ajv "^6.12.4" debug "^4.3.2" - espree "^9.4.0" - globals "^13.15.0" + espree "^9.6.0" + globals "^13.19.0" ignore "^5.2.0" import-fresh "^3.2.1" js-yaml "^4.1.0" minimatch "^3.1.2" strip-json-comments "^3.1.1" +"@eslint/js@8.49.0": + version "8.49.0" + resolved "https://registry.yarnpkg.com/@eslint/js/-/js-8.49.0.tgz#86f79756004a97fa4df866835093f1df3d03c333" + integrity sha512-1S8uAY/MTJqVx0SC4epBq+N2yhuwtNwLbJYNZyhL2pO1ZVKn5HFXav5T41Ryzy9K9V7ZId2JB2oy/W4aCd9/2w== + "@ethereum-waffle/chai@^3.4.4": version "3.4.4" resolved "https://registry.yarnpkg.com/@ethereum-waffle/chai/-/chai-3.4.4.tgz#16c4cc877df31b035d6d92486dfdf983df9138ff" @@ -134,98 +188,51 @@ patch-package "^6.2.2" postinstall-postinstall "^2.1.0" -"@ethereumjs/block@^3.5.0", "@ethereumjs/block@^3.6.0", "@ethereumjs/block@^3.6.2": - version "3.6.2" - resolved "https://registry.yarnpkg.com/@ethereumjs/block/-/block-3.6.2.tgz#63d1e26d0b7a7a3684fce920de6ebabec1e5b674" - integrity sha512-mOqYWwMlAZpYUEOEqt7EfMFuVL2eyLqWWIzcf4odn6QgXY8jBI2NhVuJncrMCKeMZrsJAe7/auaRRB6YcdH+Qw== - dependencies: - "@ethereumjs/common" "^2.6.3" - "@ethereumjs/tx" "^3.5.1" - ethereumjs-util "^7.1.4" - merkle-patricia-tree "^4.2.4" - -"@ethereumjs/blockchain@^5.5.0", "@ethereumjs/blockchain@^5.5.2": - version "5.5.2" - resolved "https://registry.yarnpkg.com/@ethereumjs/blockchain/-/blockchain-5.5.2.tgz#1848abd9dc1ee56acf8cec4c84304d7f4667d027" - integrity sha512-Jz26iJmmsQtngerW6r5BDFaew/f2mObLrRZo3rskLOx1lmtMZ8+TX/vJexmivrnWgmAsTdNWhlKUYY4thPhPig== - dependencies: - "@ethereumjs/block" "^3.6.2" - "@ethereumjs/common" "^2.6.3" - "@ethereumjs/ethash" "^1.1.0" - debug "^4.3.3" - ethereumjs-util "^7.1.4" - level-mem "^5.0.1" - lru-cache "^5.1.1" - semaphore-async-await "^1.5.1" - -"@ethereumjs/common@^2.3.0": - version "2.6.0" - resolved "https://registry.yarnpkg.com/@ethereumjs/common/-/common-2.6.0.tgz#feb96fb154da41ee2cc2c5df667621a440f36348" - integrity sha512-Cq2qS0FTu6O2VU1sgg+WyU9Ps0M6j/BEMHN+hRaECXCV/r0aI78u4N6p52QW/BDVhwWZpCdrvG8X7NJdzlpNUA== +"@ethereumjs/common@2.5.0": + version "2.5.0" + resolved "https://registry.yarnpkg.com/@ethereumjs/common/-/common-2.5.0.tgz#ec61551b31bef7a69d1dc634d8932468866a4268" + integrity sha512-DEHjW6e38o+JmB/NO3GZBpW4lpaiBpkFgXF6jLcJ6gETBYpEyaA5nTimsWBUJR3Vmtm/didUEbNjajskugZORg== dependencies: crc-32 "^1.2.0" - ethereumjs-util "^7.1.3" + ethereumjs-util "^7.1.1" -"@ethereumjs/common@^2.4.0": - version "2.6.2" - resolved "https://registry.yarnpkg.com/@ethereumjs/common/-/common-2.6.2.tgz#eb006c9329c75c80f634f340dc1719a5258244df" - integrity sha512-vDwye5v0SVeuDky4MtKsu+ogkH2oFUV8pBKzH/eNBzT8oI91pKa8WyzDuYuxOQsgNgv5R34LfFDh2aaw3H4HbQ== +"@ethereumjs/common@^2.5.0", "@ethereumjs/common@^2.6.4": + version "2.6.5" + resolved "https://registry.yarnpkg.com/@ethereumjs/common/-/common-2.6.5.tgz#0a75a22a046272579d91919cb12d84f2756e8d30" + integrity sha512-lRyVQOeCDaIVtgfbowla32pzeDv2Obr8oR8Put5RdUBNRGr1VGPGQNGP6elWIpgK3YdpzqTOh4GyUGOureVeeA== dependencies: crc-32 "^1.2.0" - ethereumjs-util "^7.1.4" + ethereumjs-util "^7.1.5" -"@ethereumjs/common@^2.6.0", "@ethereumjs/common@^2.6.3": - version "2.6.3" - resolved "https://registry.yarnpkg.com/@ethereumjs/common/-/common-2.6.3.tgz#39ddece7300b336276bad6c02f6a9f1a082caa05" - integrity sha512-mQwPucDL7FDYIg9XQ8DL31CnIYZwGhU5hyOO5E+BMmT71G0+RHvIT5rIkLBirJEKxV6+Rcf9aEIY0kXInxUWpQ== +"@ethereumjs/rlp@^4.0.1": + version "4.0.1" + resolved "https://registry.yarnpkg.com/@ethereumjs/rlp/-/rlp-4.0.1.tgz#626fabfd9081baab3d0a3074b0c7ecaf674aaa41" + integrity sha512-tqsQiBQDQdmPWE1xkkBq4rlSW5QZpLOUJ5RJh2/9fug+q9tnUhuZoVLk7s0scUIKTOzEtR72DFBXI4WiZcMpvw== + +"@ethereumjs/tx@3.3.2": + version "3.3.2" + resolved "https://registry.yarnpkg.com/@ethereumjs/tx/-/tx-3.3.2.tgz#348d4624bf248aaab6c44fec2ae67265efe3db00" + integrity sha512-6AaJhwg4ucmwTvw/1qLaZUX5miWrwZ4nLOUsKyb/HtzS3BMw/CasKhdi1ims9mBKeK9sOJCH4qGKOBGyJCeeog== dependencies: - crc-32 "^1.2.0" - ethereumjs-util "^7.1.4" + "@ethereumjs/common" "^2.5.0" + ethereumjs-util "^7.1.2" -"@ethereumjs/ethash@^1.1.0": - version "1.1.0" - resolved "https://registry.yarnpkg.com/@ethereumjs/ethash/-/ethash-1.1.0.tgz#7c5918ffcaa9cb9c1dc7d12f77ef038c11fb83fb" - integrity sha512-/U7UOKW6BzpA+Vt+kISAoeDie1vAvY4Zy2KF5JJb+So7+1yKmJeJEHOGSnQIj330e9Zyl3L5Nae6VZyh2TJnAA== +"@ethereumjs/tx@^3.3.2": + version "3.5.2" + resolved "https://registry.yarnpkg.com/@ethereumjs/tx/-/tx-3.5.2.tgz#197b9b6299582ad84f9527ca961466fce2296c1c" + integrity sha512-gQDNJWKrSDGu2w7w0PzVXVBNMzb7wwdDOmOqczmhNjqFxFuIbhVJDwiGEnxFNC2/b8ifcZzY7MLcluizohRzNw== dependencies: - "@ethereumjs/block" "^3.5.0" - "@types/levelup" "^4.3.0" - buffer-xor "^2.0.1" - ethereumjs-util "^7.1.1" - miller-rabin "^4.0.0" + "@ethereumjs/common" "^2.6.4" + ethereumjs-util "^7.1.5" -"@ethereumjs/tx@^3.2.1": - version "3.4.0" - resolved "https://registry.yarnpkg.com/@ethereumjs/tx/-/tx-3.4.0.tgz#7eb1947eefa55eb9cf05b3ca116fb7a3dbd0bce7" - integrity sha512-WWUwg1PdjHKZZxPPo274ZuPsJCWV3SqATrEKQP1n2DrVYVP1aZIYpo/mFaA0BDoE0tIQmBeimRCEA0Lgil+yYw== - dependencies: - "@ethereumjs/common" "^2.6.0" - ethereumjs-util "^7.1.3" - -"@ethereumjs/tx@^3.4.0", "@ethereumjs/tx@^3.5.1": - version "3.5.1" - resolved "https://registry.yarnpkg.com/@ethereumjs/tx/-/tx-3.5.1.tgz#8d941b83a602b4a89949c879615f7ea9a90e6671" - integrity sha512-xzDrTiu4sqZXUcaBxJ4n4W5FrppwxLxZB4ZDGVLtxSQR4lVuOnFR6RcUHdg1mpUhAPVrmnzLJpxaeXnPxIyhWA== - dependencies: - "@ethereumjs/common" "^2.6.3" - ethereumjs-util "^7.1.4" - -"@ethereumjs/vm@^5.6.0": - version "5.8.0" - resolved "https://registry.yarnpkg.com/@ethereumjs/vm/-/vm-5.8.0.tgz#c9055f96afc13dd7b72893b57fa20027effea6fe" - integrity sha512-mn2G2SX79QY4ckVvZUfxlNUpzwT2AEIkvgJI8aHoQaNYEHhH8rmdVDIaVVgz6//PjK52BZsK23afz+WvSR0Qqw== - dependencies: - "@ethereumjs/block" "^3.6.2" - "@ethereumjs/blockchain" "^5.5.2" - "@ethereumjs/common" "^2.6.3" - "@ethereumjs/tx" "^3.5.1" - async-eventemitter "^0.2.4" - core-js-pure "^3.0.1" - debug "^4.3.3" - ethereumjs-util "^7.1.4" - functional-red-black-tree "^1.0.1" - mcl-wasm "^0.7.1" - merkle-patricia-tree "^4.2.4" - rustbn.js "~0.2.0" +"@ethereumjs/util@^8.1.0": + version "8.1.0" + resolved "https://registry.yarnpkg.com/@ethereumjs/util/-/util-8.1.0.tgz#299df97fb6b034e0577ce9f94c7d9d1004409ed4" + integrity sha512-zQ0IqbdX8FZ9aw11vP+dZkKDkS+kgIvQPHnSAXzP9pLu+Rfu3D3XEeLbicvoXJTYnhZiPmsZUxgdzXwNKxRPbA== + dependencies: + "@ethereumjs/rlp" "^4.0.1" + ethereum-cryptography "^2.0.0" + micro-ftch "^0.3.1" "@ethersproject/abi@5.0.0-beta.153": version "5.0.0-beta.153" @@ -242,52 +249,7 @@ "@ethersproject/properties" ">=5.0.0-beta.131" "@ethersproject/strings" ">=5.0.0-beta.130" -"@ethersproject/abi@5.0.7": - version "5.0.7" - resolved "https://registry.yarnpkg.com/@ethersproject/abi/-/abi-5.0.7.tgz#79e52452bd3ca2956d0e1c964207a58ad1a0ee7b" - integrity sha512-Cqktk+hSIckwP/W8O47Eef60VwmoSC/L3lY0+dIBhQPCNn9E4V7rwmm2aFrNRRDJfFlGuZ1khkQUOc3oBX+niw== - dependencies: - "@ethersproject/address" "^5.0.4" - "@ethersproject/bignumber" "^5.0.7" - "@ethersproject/bytes" "^5.0.4" - "@ethersproject/constants" "^5.0.4" - "@ethersproject/hash" "^5.0.4" - "@ethersproject/keccak256" "^5.0.3" - "@ethersproject/logger" "^5.0.5" - "@ethersproject/properties" "^5.0.3" - "@ethersproject/strings" "^5.0.4" - -"@ethersproject/abi@5.6.0", "@ethersproject/abi@^5.1.2", "@ethersproject/abi@^5.4.0", "@ethersproject/abi@^5.5.0": - version "5.6.0" - resolved "https://registry.yarnpkg.com/@ethersproject/abi/-/abi-5.6.0.tgz#ea07cbc1eec2374d32485679c12408005895e9f3" - integrity sha512-AhVByTwdXCc2YQ20v300w6KVHle9g2OFc28ZAFCPnJyEpkv1xKXjZcSTgWOlv1i+0dqlgF8RCF2Rn2KC1t+1Vg== - dependencies: - "@ethersproject/address" "^5.6.0" - "@ethersproject/bignumber" "^5.6.0" - "@ethersproject/bytes" "^5.6.0" - "@ethersproject/constants" "^5.6.0" - "@ethersproject/hash" "^5.6.0" - "@ethersproject/keccak256" "^5.6.0" - "@ethersproject/logger" "^5.6.0" - "@ethersproject/properties" "^5.6.0" - "@ethersproject/strings" "^5.6.0" - -"@ethersproject/abi@5.6.1", "@ethersproject/abi@^5.0.0-beta.146", "@ethersproject/abi@^5.6.0": - version "5.6.1" - resolved "https://registry.yarnpkg.com/@ethersproject/abi/-/abi-5.6.1.tgz#f7de888edeb56b0a657b672bdd1b3a1135cd14f7" - integrity sha512-0cqssYh6FXjlwKWBmLm3+zH2BNARoS5u/hxbz+LpQmcDB3w0W553h2btWui1/uZp2GBM/SI3KniTuMcYyHpA5w== - dependencies: - "@ethersproject/address" "^5.6.0" - "@ethersproject/bignumber" "^5.6.0" - "@ethersproject/bytes" "^5.6.0" - "@ethersproject/constants" "^5.6.0" - "@ethersproject/hash" "^5.6.0" - "@ethersproject/keccak256" "^5.6.0" - "@ethersproject/logger" "^5.6.0" - "@ethersproject/properties" "^5.6.0" - "@ethersproject/strings" "^5.6.0" - -"@ethersproject/abi@5.7.0", "@ethersproject/abi@^5.7.0": +"@ethersproject/abi@5.7.0", "@ethersproject/abi@^5.0.0-beta.146", "@ethersproject/abi@^5.1.2", "@ethersproject/abi@^5.5.0", "@ethersproject/abi@^5.6.3", "@ethersproject/abi@^5.7.0": version "5.7.0" resolved "https://registry.yarnpkg.com/@ethersproject/abi/-/abi-5.7.0.tgz#b3f3e045bbbeed1af3947335c247ad625a44e449" integrity sha512-351ktp42TiRcYB3H1OP8yajPeAQstMW/yCFokj/AthP9bLHzQFPlOrxOcwYEDkUAICmOHljvN4K39OMTMUa9RA== @@ -302,19 +264,6 @@ "@ethersproject/properties" "^5.7.0" "@ethersproject/strings" "^5.7.0" -"@ethersproject/abstract-provider@5.6.0", "@ethersproject/abstract-provider@^5.6.0": - version "5.6.0" - resolved "https://registry.yarnpkg.com/@ethersproject/abstract-provider/-/abstract-provider-5.6.0.tgz#0c4ac7054650dbd9c476cf5907f588bbb6ef3061" - integrity sha512-oPMFlKLN+g+y7a79cLK3WiLcjWFnZQtXWgnLAbHZcN3s7L4v90UHpTOrLk+m3yr0gt+/h9STTM6zrr7PM8uoRw== - dependencies: - "@ethersproject/bignumber" "^5.6.0" - "@ethersproject/bytes" "^5.6.0" - "@ethersproject/logger" "^5.6.0" - "@ethersproject/networks" "^5.6.0" - "@ethersproject/properties" "^5.6.0" - "@ethersproject/transactions" "^5.6.0" - "@ethersproject/web" "^5.6.0" - "@ethersproject/abstract-provider@5.7.0", "@ethersproject/abstract-provider@^5.7.0": version "5.7.0" resolved "https://registry.yarnpkg.com/@ethersproject/abstract-provider/-/abstract-provider-5.7.0.tgz#b0a8550f88b6bf9d51f90e4795d48294630cb9ef" @@ -328,17 +277,6 @@ "@ethersproject/transactions" "^5.7.0" "@ethersproject/web" "^5.7.0" -"@ethersproject/abstract-signer@5.6.0", "@ethersproject/abstract-signer@^5.4.1", "@ethersproject/abstract-signer@^5.5.0", "@ethersproject/abstract-signer@^5.6.0": - version "5.6.0" - resolved "https://registry.yarnpkg.com/@ethersproject/abstract-signer/-/abstract-signer-5.6.0.tgz#9cd7ae9211c2b123a3b29bf47aab17d4d016e3e7" - integrity sha512-WOqnG0NJKtI8n0wWZPReHtaLkDByPL67tn4nBaDAhmVq8sjHTPbCdz4DRhVu/cfTOvfy9w3iq5QZ7BX7zw56BQ== - dependencies: - "@ethersproject/abstract-provider" "^5.6.0" - "@ethersproject/bignumber" "^5.6.0" - "@ethersproject/bytes" "^5.6.0" - "@ethersproject/logger" "^5.6.0" - "@ethersproject/properties" "^5.6.0" - "@ethersproject/abstract-signer@5.7.0", "@ethersproject/abstract-signer@^5.7.0": version "5.7.0" resolved "https://registry.yarnpkg.com/@ethersproject/abstract-signer/-/abstract-signer-5.7.0.tgz#13f4f32117868452191a4649723cb086d2b596b2" @@ -350,18 +288,7 @@ "@ethersproject/logger" "^5.7.0" "@ethersproject/properties" "^5.7.0" -"@ethersproject/address@5.6.0", "@ethersproject/address@>=5.0.0-beta.128", "@ethersproject/address@^5.4.0", "@ethersproject/address@^5.5.0", "@ethersproject/address@^5.6.0": - version "5.6.0" - resolved "https://registry.yarnpkg.com/@ethersproject/address/-/address-5.6.0.tgz#13c49836d73e7885fc148ad633afad729da25012" - integrity sha512-6nvhYXjbXsHPS+30sHZ+U4VMagFC/9zAk6Gd/h3S21YW4+yfb0WfRtaAIZ4kfM4rrVwqiy284LP0GtL5HXGLxQ== - dependencies: - "@ethersproject/bignumber" "^5.6.0" - "@ethersproject/bytes" "^5.6.0" - "@ethersproject/keccak256" "^5.6.0" - "@ethersproject/logger" "^5.6.0" - "@ethersproject/rlp" "^5.6.0" - -"@ethersproject/address@5.7.0", "@ethersproject/address@^5.0.2", "@ethersproject/address@^5.0.8", "@ethersproject/address@^5.7.0": +"@ethersproject/address@5.7.0", "@ethersproject/address@>=5.0.0-beta.128", "@ethersproject/address@^5.0.2", "@ethersproject/address@^5.0.8", "@ethersproject/address@^5.7.0": version "5.7.0" resolved "https://registry.yarnpkg.com/@ethersproject/address/-/address-5.7.0.tgz#19b56c4d74a3b0a46bfdbb6cfcc0a153fc697f37" integrity sha512-9wYhYt7aghVGo758POM5nqcOMaE168Q6aRLJZwUmiqSrAungkG74gSSeKEIR7ukixesdRZGPgVqme6vmxs1fkA== @@ -372,24 +299,6 @@ "@ethersproject/logger" "^5.7.0" "@ethersproject/rlp" "^5.7.0" -"@ethersproject/address@^5.0.4": - version "5.5.0" - resolved "https://registry.yarnpkg.com/@ethersproject/address/-/address-5.5.0.tgz#bcc6f576a553f21f3dd7ba17248f81b473c9c78f" - integrity sha512-l4Nj0eWlTUh6ro5IbPTgbpT4wRbdH5l8CQf7icF7sb/SI3Nhd9Y9HzhonTSTi6CefI0necIw7LJqQPopPLZyWw== - dependencies: - "@ethersproject/bignumber" "^5.5.0" - "@ethersproject/bytes" "^5.5.0" - "@ethersproject/keccak256" "^5.5.0" - "@ethersproject/logger" "^5.5.0" - "@ethersproject/rlp" "^5.5.0" - -"@ethersproject/base64@5.6.0", "@ethersproject/base64@^5.6.0": - version "5.6.0" - resolved "https://registry.yarnpkg.com/@ethersproject/base64/-/base64-5.6.0.tgz#a12c4da2a6fb86d88563216b0282308fc15907c9" - integrity sha512-2Neq8wxJ9xHxCF9TUgmKeSh9BXJ6OAxWfeGWvbauPh8FuHEjamgHilllx8KkSd5ErxyHIX7Xv3Fkcud2kY9ezw== - dependencies: - "@ethersproject/bytes" "^5.6.0" - "@ethersproject/base64@5.7.0", "@ethersproject/base64@^5.7.0": version "5.7.0" resolved "https://registry.yarnpkg.com/@ethersproject/base64/-/base64-5.7.0.tgz#ac4ee92aa36c1628173e221d0d01f53692059e1c" @@ -397,14 +306,6 @@ dependencies: "@ethersproject/bytes" "^5.7.0" -"@ethersproject/basex@5.6.0", "@ethersproject/basex@^5.6.0": - version "5.6.0" - resolved "https://registry.yarnpkg.com/@ethersproject/basex/-/basex-5.6.0.tgz#9ea7209bf0a1c3ddc2a90f180c3a7f0d7d2e8a69" - integrity sha512-qN4T+hQd/Md32MoJpc69rOwLYRUXwjTlhHDIeUkUmiN/JyWkkLLMoG0TqvSQKNqZOMgN5stbUYN6ILC+eD7MEQ== - dependencies: - "@ethersproject/bytes" "^5.6.0" - "@ethersproject/properties" "^5.6.0" - "@ethersproject/basex@5.7.0", "@ethersproject/basex@^5.7.0": version "5.7.0" resolved "https://registry.yarnpkg.com/@ethersproject/basex/-/basex-5.7.0.tgz#97034dc7e8938a8ca943ab20f8a5e492ece4020b" @@ -413,16 +314,7 @@ "@ethersproject/bytes" "^5.7.0" "@ethersproject/properties" "^5.7.0" -"@ethersproject/bignumber@5.6.0", "@ethersproject/bignumber@>=5.0.0-beta.130", "@ethersproject/bignumber@^5.4.1", "@ethersproject/bignumber@^5.5.0", "@ethersproject/bignumber@^5.6.0": - version "5.6.0" - resolved "https://registry.yarnpkg.com/@ethersproject/bignumber/-/bignumber-5.6.0.tgz#116c81b075c57fa765a8f3822648cf718a8a0e26" - integrity sha512-VziMaXIUHQlHJmkv1dlcd6GY2PmT0khtAqaMctCIDogxkrarMzA9L94KN1NeXqqOfFD6r0sJT3vCTOFSmZ07DA== - dependencies: - "@ethersproject/bytes" "^5.6.0" - "@ethersproject/logger" "^5.6.0" - bn.js "^4.11.9" - -"@ethersproject/bignumber@5.7.0", "@ethersproject/bignumber@^5.1.1", "@ethersproject/bignumber@^5.7.0": +"@ethersproject/bignumber@5.7.0", "@ethersproject/bignumber@>=5.0.0-beta.130", "@ethersproject/bignumber@^5.1.1", "@ethersproject/bignumber@^5.7.0": version "5.7.0" resolved "https://registry.yarnpkg.com/@ethersproject/bignumber/-/bignumber-5.7.0.tgz#e2f03837f268ba655ffba03a57853e18a18dc9c2" integrity sha512-n1CAdIHRWjSucQO3MC1zPSVgV/6dy/fjL9pMrPP9peL+QxEg9wOsVqwD4+818B6LUEtaXzVHQiuivzRoxPxUGw== @@ -431,74 +323,21 @@ "@ethersproject/logger" "^5.7.0" bn.js "^5.2.1" -"@ethersproject/bignumber@^5.0.7": - version "5.5.0" - resolved "https://registry.yarnpkg.com/@ethersproject/bignumber/-/bignumber-5.5.0.tgz#875b143f04a216f4f8b96245bde942d42d279527" - integrity sha512-6Xytlwvy6Rn3U3gKEc1vP7nR92frHkv6wtVr95LFR3jREXiCPzdWxKQ1cx4JGQBXxcguAwjA8murlYN2TSiEbg== - dependencies: - "@ethersproject/bytes" "^5.5.0" - "@ethersproject/logger" "^5.5.0" - bn.js "^4.11.9" - -"@ethersproject/bytes@5.6.1", "@ethersproject/bytes@>=5.0.0-beta.129", "@ethersproject/bytes@^5.4.0", "@ethersproject/bytes@^5.5.0", "@ethersproject/bytes@^5.6.0": - version "5.6.1" - resolved "https://registry.yarnpkg.com/@ethersproject/bytes/-/bytes-5.6.1.tgz#24f916e411f82a8a60412344bf4a813b917eefe7" - integrity sha512-NwQt7cKn5+ZE4uDn+X5RAXLp46E1chXoaMmrxAyA0rblpxz8t58lVkrHXoRIn0lz1joQElQ8410GqhTqMOwc6g== - dependencies: - "@ethersproject/logger" "^5.6.0" - -"@ethersproject/bytes@5.7.0", "@ethersproject/bytes@^5.0.8", "@ethersproject/bytes@^5.7.0": +"@ethersproject/bytes@5.7.0", "@ethersproject/bytes@>=5.0.0-beta.129", "@ethersproject/bytes@^5.0.8", "@ethersproject/bytes@^5.7.0": version "5.7.0" resolved "https://registry.yarnpkg.com/@ethersproject/bytes/-/bytes-5.7.0.tgz#a00f6ea8d7e7534d6d87f47188af1148d71f155d" integrity sha512-nsbxwgFXWh9NyYWo+U8atvmMsSdKJprTcICAkvbBffT75qDocbuggBU0SJiVK2MuTrp0q+xvLkTnGMPK1+uA9A== dependencies: "@ethersproject/logger" "^5.7.0" -"@ethersproject/bytes@^5.0.4": - version "5.5.0" - resolved "https://registry.yarnpkg.com/@ethersproject/bytes/-/bytes-5.5.0.tgz#cb11c526de657e7b45d2e0f0246fb3b9d29a601c" - integrity sha512-ABvc7BHWhZU9PNM/tANm/Qx4ostPGadAuQzWTr3doklZOhDlmcBqclrQe/ZXUIj3K8wC28oYeuRa+A37tX9kog== - dependencies: - "@ethersproject/logger" "^5.5.0" - -"@ethersproject/constants@5.6.0", "@ethersproject/constants@>=5.0.0-beta.128", "@ethersproject/constants@^5.4.0", "@ethersproject/constants@^5.5.0", "@ethersproject/constants@^5.6.0": - version "5.6.0" - resolved "https://registry.yarnpkg.com/@ethersproject/constants/-/constants-5.6.0.tgz#55e3eb0918584d3acc0688e9958b0cedef297088" - integrity sha512-SrdaJx2bK0WQl23nSpV/b1aq293Lh0sUaZT/yYKPDKn4tlAbkH96SPJwIhwSwTsoQQZxuh1jnqsKwyymoiBdWA== - dependencies: - "@ethersproject/bignumber" "^5.6.0" - -"@ethersproject/constants@5.7.0", "@ethersproject/constants@^5.7.0": +"@ethersproject/constants@5.7.0", "@ethersproject/constants@>=5.0.0-beta.128", "@ethersproject/constants@^5.7.0": version "5.7.0" resolved "https://registry.yarnpkg.com/@ethersproject/constants/-/constants-5.7.0.tgz#df80a9705a7e08984161f09014ea012d1c75295e" integrity sha512-DHI+y5dBNvkpYUMiRQyxRBYBefZkJfo70VUkUAsRjcPs47muV9evftfZ0PJVCXYbAiCgght0DtcF9srFQmIgWA== dependencies: "@ethersproject/bignumber" "^5.7.0" -"@ethersproject/constants@^5.0.4": - version "5.5.0" - resolved "https://registry.yarnpkg.com/@ethersproject/constants/-/constants-5.5.0.tgz#d2a2cd7d94bd1d58377d1d66c4f53c9be4d0a45e" - integrity sha512-2MsRRVChkvMWR+GyMGY4N1sAX9Mt3J9KykCsgUFd/1mwS0UH1qw+Bv9k1UJb3X3YJYFco9H20pjSlOIfCG5HYQ== - dependencies: - "@ethersproject/bignumber" "^5.5.0" - -"@ethersproject/contracts@5.6.0", "@ethersproject/contracts@^5.4.1": - version "5.6.0" - resolved "https://registry.yarnpkg.com/@ethersproject/contracts/-/contracts-5.6.0.tgz#60f2cfc7addd99a865c6c8cfbbcec76297386067" - integrity sha512-74Ge7iqTDom0NX+mux8KbRUeJgu1eHZ3iv6utv++sLJG80FVuU9HnHeKVPfjd9s3woFhaFoQGf3B3iH/FrQmgw== - dependencies: - "@ethersproject/abi" "^5.6.0" - "@ethersproject/abstract-provider" "^5.6.0" - "@ethersproject/abstract-signer" "^5.6.0" - "@ethersproject/address" "^5.6.0" - "@ethersproject/bignumber" "^5.6.0" - "@ethersproject/bytes" "^5.6.0" - "@ethersproject/constants" "^5.6.0" - "@ethersproject/logger" "^5.6.0" - "@ethersproject/properties" "^5.6.0" - "@ethersproject/transactions" "^5.6.0" - -"@ethersproject/contracts@5.7.0": +"@ethersproject/contracts@5.7.0", "@ethersproject/contracts@^5.7.0": version "5.7.0" resolved "https://registry.yarnpkg.com/@ethersproject/contracts/-/contracts-5.7.0.tgz#c305e775abd07e48aa590e1a877ed5c316f8bd1e" integrity sha512-5GJbzEU3X+d33CdfPhcyS+z8MzsTrBGk/sc+G+59+tPa9yFkl6HQ9D6L0QMgNTA9q8dT0XKxxkyp883XsQvbbg== @@ -514,21 +353,7 @@ "@ethersproject/properties" "^5.7.0" "@ethersproject/transactions" "^5.7.0" -"@ethersproject/hash@5.6.0", "@ethersproject/hash@>=5.0.0-beta.128", "@ethersproject/hash@^5.6.0": - version "5.6.0" - resolved "https://registry.yarnpkg.com/@ethersproject/hash/-/hash-5.6.0.tgz#d24446a5263e02492f9808baa99b6e2b4c3429a2" - integrity sha512-fFd+k9gtczqlr0/BruWLAu7UAOas1uRRJvOR84uDf4lNZ+bTkGl366qvniUZHKtlqxBRU65MkOobkmvmpHU+jA== - dependencies: - "@ethersproject/abstract-signer" "^5.6.0" - "@ethersproject/address" "^5.6.0" - "@ethersproject/bignumber" "^5.6.0" - "@ethersproject/bytes" "^5.6.0" - "@ethersproject/keccak256" "^5.6.0" - "@ethersproject/logger" "^5.6.0" - "@ethersproject/properties" "^5.6.0" - "@ethersproject/strings" "^5.6.0" - -"@ethersproject/hash@5.7.0", "@ethersproject/hash@^5.7.0": +"@ethersproject/hash@5.7.0", "@ethersproject/hash@>=5.0.0-beta.128", "@ethersproject/hash@^5.7.0": version "5.7.0" resolved "https://registry.yarnpkg.com/@ethersproject/hash/-/hash-5.7.0.tgz#eb7aca84a588508369562e16e514b539ba5240a7" integrity sha512-qX5WrQfnah1EFnO5zJv1v46a8HW0+E5xuBBDTwMFZLuVTx0tbU2kkx15NqdjxecrLGatQN9FGQKpb1FKdHCt+g== @@ -543,38 +368,6 @@ "@ethersproject/properties" "^5.7.0" "@ethersproject/strings" "^5.7.0" -"@ethersproject/hash@^5.0.4": - version "5.5.0" - resolved "https://registry.yarnpkg.com/@ethersproject/hash/-/hash-5.5.0.tgz#7cee76d08f88d1873574c849e0207dcb32380cc9" - integrity sha512-dnGVpK1WtBjmnp3mUT0PlU2MpapnwWI0PibldQEq1408tQBAbZpPidkWoVVuNMOl/lISO3+4hXZWCL3YV7qzfg== - dependencies: - "@ethersproject/abstract-signer" "^5.5.0" - "@ethersproject/address" "^5.5.0" - "@ethersproject/bignumber" "^5.5.0" - "@ethersproject/bytes" "^5.5.0" - "@ethersproject/keccak256" "^5.5.0" - "@ethersproject/logger" "^5.5.0" - "@ethersproject/properties" "^5.5.0" - "@ethersproject/strings" "^5.5.0" - -"@ethersproject/hdnode@5.6.0", "@ethersproject/hdnode@^5.6.0": - version "5.6.0" - resolved "https://registry.yarnpkg.com/@ethersproject/hdnode/-/hdnode-5.6.0.tgz#9dcbe8d629bbbcf144f2cae476337fe92d320998" - integrity sha512-61g3Jp3nwDqJcL/p4nugSyLrpl/+ChXIOtCEM8UDmWeB3JCAt5FoLdOMXQc3WWkc0oM2C0aAn6GFqqMcS/mHTw== - dependencies: - "@ethersproject/abstract-signer" "^5.6.0" - "@ethersproject/basex" "^5.6.0" - "@ethersproject/bignumber" "^5.6.0" - "@ethersproject/bytes" "^5.6.0" - "@ethersproject/logger" "^5.6.0" - "@ethersproject/pbkdf2" "^5.6.0" - "@ethersproject/properties" "^5.6.0" - "@ethersproject/sha2" "^5.6.0" - "@ethersproject/signing-key" "^5.6.0" - "@ethersproject/strings" "^5.6.0" - "@ethersproject/transactions" "^5.6.0" - "@ethersproject/wordlists" "^5.6.0" - "@ethersproject/hdnode@5.7.0", "@ethersproject/hdnode@^5.7.0": version "5.7.0" resolved "https://registry.yarnpkg.com/@ethersproject/hdnode/-/hdnode-5.7.0.tgz#e627ddc6b466bc77aebf1a6b9e47405ca5aef9cf" @@ -593,25 +386,6 @@ "@ethersproject/transactions" "^5.7.0" "@ethersproject/wordlists" "^5.7.0" -"@ethersproject/json-wallets@5.6.0", "@ethersproject/json-wallets@^5.6.0": - version "5.6.0" - resolved "https://registry.yarnpkg.com/@ethersproject/json-wallets/-/json-wallets-5.6.0.tgz#4c2fc27f17e36c583e7a252fb938bc46f98891e5" - integrity sha512-fmh86jViB9r0ibWXTQipxpAGMiuxoqUf78oqJDlCAJXgnJF024hOOX7qVgqsjtbeoxmcLwpPsXNU0WEe/16qPQ== - dependencies: - "@ethersproject/abstract-signer" "^5.6.0" - "@ethersproject/address" "^5.6.0" - "@ethersproject/bytes" "^5.6.0" - "@ethersproject/hdnode" "^5.6.0" - "@ethersproject/keccak256" "^5.6.0" - "@ethersproject/logger" "^5.6.0" - "@ethersproject/pbkdf2" "^5.6.0" - "@ethersproject/properties" "^5.6.0" - "@ethersproject/random" "^5.6.0" - "@ethersproject/strings" "^5.6.0" - "@ethersproject/transactions" "^5.6.0" - aes-js "3.0.0" - scrypt-js "3.0.1" - "@ethersproject/json-wallets@5.7.0", "@ethersproject/json-wallets@^5.7.0": version "5.7.0" resolved "https://registry.yarnpkg.com/@ethersproject/json-wallets/-/json-wallets-5.7.0.tgz#5e3355287b548c32b368d91014919ebebddd5360" @@ -631,15 +405,7 @@ aes-js "3.0.0" scrypt-js "3.0.1" -"@ethersproject/keccak256@5.6.0", "@ethersproject/keccak256@>=5.0.0-beta.127", "@ethersproject/keccak256@^5.5.0", "@ethersproject/keccak256@^5.6.0": - version "5.6.0" - resolved "https://registry.yarnpkg.com/@ethersproject/keccak256/-/keccak256-5.6.0.tgz#fea4bb47dbf8f131c2e1774a1cecbfeb9d606459" - integrity sha512-tk56BJ96mdj/ksi7HWZVWGjCq0WVl/QvfhFQNeL8fxhBlGoP+L80uDCiQcpJPd+2XxkivS3lwRm3E0CXTfol0w== - dependencies: - "@ethersproject/bytes" "^5.6.0" - js-sha3 "0.8.0" - -"@ethersproject/keccak256@5.7.0", "@ethersproject/keccak256@^5.7.0": +"@ethersproject/keccak256@5.7.0", "@ethersproject/keccak256@>=5.0.0-beta.127", "@ethersproject/keccak256@^5.7.0": version "5.7.0" resolved "https://registry.yarnpkg.com/@ethersproject/keccak256/-/keccak256-5.7.0.tgz#3186350c6e1cd6aba7940384ec7d6d9db01f335a" integrity sha512-2UcPboeL/iW+pSg6vZ6ydF8tCnv3Iu/8tUmLLzWWGzxWKFFqOBQFLo6uLUv6BDrLgCDfN28RJ/wtByx+jZ4KBg== @@ -647,65 +413,18 @@ "@ethersproject/bytes" "^5.7.0" js-sha3 "0.8.0" -"@ethersproject/keccak256@^5.0.3": - version "5.5.0" - resolved "https://registry.yarnpkg.com/@ethersproject/keccak256/-/keccak256-5.5.0.tgz#e4b1f9d7701da87c564ffe336f86dcee82983492" - integrity sha512-5VoFCTjo2rYbBe1l2f4mccaRFN/4VQEYFwwn04aJV2h7qf4ZvI2wFxUE1XOX+snbwCLRzIeikOqtAoPwMza9kg== - dependencies: - "@ethersproject/bytes" "^5.5.0" - js-sha3 "0.8.0" - -"@ethersproject/logger@5.6.0", "@ethersproject/logger@>=5.0.0-beta.129", "@ethersproject/logger@^5.5.0", "@ethersproject/logger@^5.6.0": - version "5.6.0" - resolved "https://registry.yarnpkg.com/@ethersproject/logger/-/logger-5.6.0.tgz#d7db1bfcc22fd2e4ab574cba0bb6ad779a9a3e7a" - integrity sha512-BiBWllUROH9w+P21RzoxJKzqoqpkyM1pRnEKG69bulE9TSQD8SAIvTQqIMZmmCO8pUNkgLP1wndX1gKghSpBmg== - -"@ethersproject/logger@5.7.0", "@ethersproject/logger@^5.7.0": +"@ethersproject/logger@5.7.0", "@ethersproject/logger@>=5.0.0-beta.129", "@ethersproject/logger@^5.7.0": version "5.7.0" resolved "https://registry.yarnpkg.com/@ethersproject/logger/-/logger-5.7.0.tgz#6ce9ae168e74fecf287be17062b590852c311892" integrity sha512-0odtFdXu/XHtjQXJYA3u9G0G8btm0ND5Cu8M7i5vhEcE8/HmF4Lbdqanwyv4uQTr2tx6b7fQRmgLrsnpQlmnig== -"@ethersproject/logger@^5.0.5": - version "5.5.0" - resolved "https://registry.yarnpkg.com/@ethersproject/logger/-/logger-5.5.0.tgz#0c2caebeff98e10aefa5aef27d7441c7fd18cf5d" - integrity sha512-rIY/6WPm7T8n3qS2vuHTUBPdXHl+rGxWxW5okDfo9J4Z0+gRRZT0msvUdIJkE4/HS29GUMziwGaaKO2bWONBrg== - -"@ethersproject/networks@5.6.1": - version "5.6.1" - resolved "https://registry.yarnpkg.com/@ethersproject/networks/-/networks-5.6.1.tgz#7a21ed1f83e86121737b16841961ec99ccf5c9c7" - integrity sha512-b2rrupf3kCTcc3jr9xOWBuHylSFtbpJf79Ga7QR98ienU2UqGimPGEsYMgbI29KHJfA5Us89XwGVmxrlxmSrMg== - dependencies: - "@ethersproject/logger" "^5.6.0" - -"@ethersproject/networks@5.6.2", "@ethersproject/networks@^5.6.0": - version "5.6.2" - resolved "https://registry.yarnpkg.com/@ethersproject/networks/-/networks-5.6.2.tgz#2bacda62102c0b1fcee408315f2bed4f6fbdf336" - integrity sha512-9uEzaJY7j5wpYGTojGp8U89mSsgQLc40PCMJLMCnFXTs7nhBveZ0t7dbqWUNrepWTszDbFkYD6WlL8DKx5huHA== - dependencies: - "@ethersproject/logger" "^5.6.0" - -"@ethersproject/networks@5.7.0", "@ethersproject/networks@^5.7.0": - version "5.7.0" - resolved "https://registry.yarnpkg.com/@ethersproject/networks/-/networks-5.7.0.tgz#df72a392f1a63a57f87210515695a31a245845ad" - integrity sha512-MG6oHSQHd4ebvJrleEQQ4HhVu8Ichr0RDYEfHzsVAVjHNM+w36x9wp9r+hf1JstMXtseXDtkiVoARAG6M959AA== - dependencies: - "@ethersproject/logger" "^5.7.0" - -"@ethersproject/networks@5.7.1": +"@ethersproject/networks@5.7.1", "@ethersproject/networks@^5.7.0": version "5.7.1" resolved "https://registry.yarnpkg.com/@ethersproject/networks/-/networks-5.7.1.tgz#118e1a981d757d45ccea6bb58d9fd3d9db14ead6" integrity sha512-n/MufjFYv3yFcUyfhnXotyDlNdFb7onmkSy8aQERi2PjNcnWQ66xXxa3XlS8nCcA8aJKJjIIMNJTC7tu80GwpQ== dependencies: "@ethersproject/logger" "^5.7.0" -"@ethersproject/pbkdf2@5.6.0", "@ethersproject/pbkdf2@^5.6.0": - version "5.6.0" - resolved "https://registry.yarnpkg.com/@ethersproject/pbkdf2/-/pbkdf2-5.6.0.tgz#04fcc2d7c6bff88393f5b4237d906a192426685a" - integrity sha512-Wu1AxTgJo3T3H6MIu/eejLFok9TYoSdgwRr5oGY1LTLfmGesDoSx05pemsbrPT2gG4cQME+baTSCp5sEo2erZQ== - dependencies: - "@ethersproject/bytes" "^5.6.0" - "@ethersproject/sha2" "^5.6.0" - "@ethersproject/pbkdf2@5.7.0", "@ethersproject/pbkdf2@^5.7.0": version "5.7.0" resolved "https://registry.yarnpkg.com/@ethersproject/pbkdf2/-/pbkdf2-5.7.0.tgz#d2267d0a1f6e123f3771007338c47cccd83d3102" @@ -714,104 +433,14 @@ "@ethersproject/bytes" "^5.7.0" "@ethersproject/sha2" "^5.7.0" -"@ethersproject/properties@5.6.0", "@ethersproject/properties@>=5.0.0-beta.131", "@ethersproject/properties@^5.5.0", "@ethersproject/properties@^5.6.0": - version "5.6.0" - resolved "https://registry.yarnpkg.com/@ethersproject/properties/-/properties-5.6.0.tgz#38904651713bc6bdd5bdd1b0a4287ecda920fa04" - integrity sha512-szoOkHskajKePTJSZ46uHUWWkbv7TzP2ypdEK6jGMqJaEt2sb0jCgfBo0gH0m2HBpRixMuJ6TBRaQCF7a9DoCg== - dependencies: - "@ethersproject/logger" "^5.6.0" - -"@ethersproject/properties@5.7.0", "@ethersproject/properties@^5.7.0": +"@ethersproject/properties@5.7.0", "@ethersproject/properties@>=5.0.0-beta.131", "@ethersproject/properties@^5.7.0": version "5.7.0" resolved "https://registry.yarnpkg.com/@ethersproject/properties/-/properties-5.7.0.tgz#a6e12cb0439b878aaf470f1902a176033067ed30" integrity sha512-J87jy8suntrAkIZtecpxEPxY//szqr1mlBaYlQ0r4RCaiD2hjheqF9s1LVE8vVuJCXisjIP+JgtK/Do54ej4Sw== dependencies: "@ethersproject/logger" "^5.7.0" -"@ethersproject/properties@^5.0.3": - version "5.5.0" - resolved "https://registry.yarnpkg.com/@ethersproject/properties/-/properties-5.5.0.tgz#61f00f2bb83376d2071baab02245f92070c59995" - integrity sha512-l3zRQg3JkD8EL3CPjNK5g7kMx4qSwiR60/uk5IVjd3oq1MZR5qUg40CNOoEJoX5wc3DyY5bt9EbMk86C7x0DNA== - dependencies: - "@ethersproject/logger" "^5.5.0" - -"@ethersproject/providers@5.6.2", "@ethersproject/providers@^5.4.4": - version "5.6.2" - resolved "https://registry.yarnpkg.com/@ethersproject/providers/-/providers-5.6.2.tgz#b9807b1c8c6f59fa2ee4b3cf6519724d07a9f422" - integrity sha512-6/EaFW/hNWz+224FXwl8+HdMRzVHt8DpPmu5MZaIQqx/K/ELnC9eY236SMV7mleCM3NnEArFwcAAxH5kUUgaRg== - dependencies: - "@ethersproject/abstract-provider" "^5.6.0" - "@ethersproject/abstract-signer" "^5.6.0" - "@ethersproject/address" "^5.6.0" - "@ethersproject/basex" "^5.6.0" - "@ethersproject/bignumber" "^5.6.0" - "@ethersproject/bytes" "^5.6.0" - "@ethersproject/constants" "^5.6.0" - "@ethersproject/hash" "^5.6.0" - "@ethersproject/logger" "^5.6.0" - "@ethersproject/networks" "^5.6.0" - "@ethersproject/properties" "^5.6.0" - "@ethersproject/random" "^5.6.0" - "@ethersproject/rlp" "^5.6.0" - "@ethersproject/sha2" "^5.6.0" - "@ethersproject/strings" "^5.6.0" - "@ethersproject/transactions" "^5.6.0" - "@ethersproject/web" "^5.6.0" - bech32 "1.1.4" - ws "7.4.6" - -"@ethersproject/providers@5.6.4": - version "5.6.4" - resolved "https://registry.yarnpkg.com/@ethersproject/providers/-/providers-5.6.4.tgz#1a49c211b57b0b2703c320819abbbfa35c83dff7" - integrity sha512-WAdknnaZ52hpHV3qPiJmKx401BLpup47h36Axxgre9zT+doa/4GC/Ne48ICPxTm0BqndpToHjpLP1ZnaxyE+vw== - dependencies: - "@ethersproject/abstract-provider" "^5.6.0" - "@ethersproject/abstract-signer" "^5.6.0" - "@ethersproject/address" "^5.6.0" - "@ethersproject/basex" "^5.6.0" - "@ethersproject/bignumber" "^5.6.0" - "@ethersproject/bytes" "^5.6.0" - "@ethersproject/constants" "^5.6.0" - "@ethersproject/hash" "^5.6.0" - "@ethersproject/logger" "^5.6.0" - "@ethersproject/networks" "^5.6.0" - "@ethersproject/properties" "^5.6.0" - "@ethersproject/random" "^5.6.0" - "@ethersproject/rlp" "^5.6.0" - "@ethersproject/sha2" "^5.6.0" - "@ethersproject/strings" "^5.6.0" - "@ethersproject/transactions" "^5.6.0" - "@ethersproject/web" "^5.6.0" - bech32 "1.1.4" - ws "7.4.6" - -"@ethersproject/providers@5.7.0": - version "5.7.0" - resolved "https://registry.yarnpkg.com/@ethersproject/providers/-/providers-5.7.0.tgz#a885cfc7650a64385e7b03ac86fe9c2d4a9c2c63" - integrity sha512-+TTrrINMzZ0aXtlwO/95uhAggKm4USLm1PbeCBR/3XZ7+Oey+3pMyddzZEyRhizHpy1HXV0FRWRMI1O3EGYibA== - dependencies: - "@ethersproject/abstract-provider" "^5.7.0" - "@ethersproject/abstract-signer" "^5.7.0" - "@ethersproject/address" "^5.7.0" - "@ethersproject/base64" "^5.7.0" - "@ethersproject/basex" "^5.7.0" - "@ethersproject/bignumber" "^5.7.0" - "@ethersproject/bytes" "^5.7.0" - "@ethersproject/constants" "^5.7.0" - "@ethersproject/hash" "^5.7.0" - "@ethersproject/logger" "^5.7.0" - "@ethersproject/networks" "^5.7.0" - "@ethersproject/properties" "^5.7.0" - "@ethersproject/random" "^5.7.0" - "@ethersproject/rlp" "^5.7.0" - "@ethersproject/sha2" "^5.7.0" - "@ethersproject/strings" "^5.7.0" - "@ethersproject/transactions" "^5.7.0" - "@ethersproject/web" "^5.7.0" - bech32 "1.1.4" - ws "7.4.6" - -"@ethersproject/providers@5.7.2", "@ethersproject/providers@^5.7.2": +"@ethersproject/providers@5.7.2", "@ethersproject/providers@^5.7.1", "@ethersproject/providers@^5.7.2": version "5.7.2" resolved "https://registry.yarnpkg.com/@ethersproject/providers/-/providers-5.7.2.tgz#f8b1a4f275d7ce58cf0a2eec222269a08beb18cb" integrity sha512-g34EWZ1WWAVgr4aptGlVBF8mhl3VWjv+8hoAnzStu8Ah22VHBsuGzP17eb6xDVRzw895G4W7vvx60lFFur/1Rg== @@ -837,14 +466,6 @@ bech32 "1.1.4" ws "7.4.6" -"@ethersproject/random@5.6.0", "@ethersproject/random@^5.6.0": - version "5.6.0" - resolved "https://registry.yarnpkg.com/@ethersproject/random/-/random-5.6.0.tgz#1505d1ab6a250e0ee92f436850fa3314b2cb5ae6" - integrity sha512-si0PLcLjq+NG/XHSZz90asNf+YfKEqJGVdxoEkSukzbnBgC8rydbgbUgBbBGLeHN4kAJwUFEKsu3sCXT93YMsw== - dependencies: - "@ethersproject/bytes" "^5.6.0" - "@ethersproject/logger" "^5.6.0" - "@ethersproject/random@5.7.0", "@ethersproject/random@^5.7.0": version "5.7.0" resolved "https://registry.yarnpkg.com/@ethersproject/random/-/random-5.7.0.tgz#af19dcbc2484aae078bb03656ec05df66253280c" @@ -853,14 +474,6 @@ "@ethersproject/bytes" "^5.7.0" "@ethersproject/logger" "^5.7.0" -"@ethersproject/rlp@5.6.0", "@ethersproject/rlp@^5.5.0", "@ethersproject/rlp@^5.6.0": - version "5.6.0" - resolved "https://registry.yarnpkg.com/@ethersproject/rlp/-/rlp-5.6.0.tgz#55a7be01c6f5e64d6e6e7edb6061aa120962a717" - integrity sha512-dz9WR1xpcTL+9DtOT/aDO+YyxSSdO8YIS0jyZwHHSlAmnxA6cKU3TrTd4Xc/bHayctxTgGLYNuVVoiXE4tTq1g== - dependencies: - "@ethersproject/bytes" "^5.6.0" - "@ethersproject/logger" "^5.6.0" - "@ethersproject/rlp@5.7.0", "@ethersproject/rlp@^5.7.0": version "5.7.0" resolved "https://registry.yarnpkg.com/@ethersproject/rlp/-/rlp-5.7.0.tgz#de39e4d5918b9d74d46de93af80b7685a9c21304" @@ -869,15 +482,6 @@ "@ethersproject/bytes" "^5.7.0" "@ethersproject/logger" "^5.7.0" -"@ethersproject/sha2@5.6.0", "@ethersproject/sha2@^5.6.0": - version "5.6.0" - resolved "https://registry.yarnpkg.com/@ethersproject/sha2/-/sha2-5.6.0.tgz#364c4c11cc753bda36f31f001628706ebadb64d9" - integrity sha512-1tNWCPFLu1n3JM9t4/kytz35DkuF9MxqkGGEHNauEbaARdm2fafnOyw1s0tIQDPKF/7bkP1u3dbrmjpn5CelyA== - dependencies: - "@ethersproject/bytes" "^5.6.0" - "@ethersproject/logger" "^5.6.0" - hash.js "1.1.7" - "@ethersproject/sha2@5.7.0", "@ethersproject/sha2@^5.7.0": version "5.7.0" resolved "https://registry.yarnpkg.com/@ethersproject/sha2/-/sha2-5.7.0.tgz#9a5f7a7824ef784f7f7680984e593a800480c9fb" @@ -887,18 +491,6 @@ "@ethersproject/logger" "^5.7.0" hash.js "1.1.7" -"@ethersproject/signing-key@5.6.0", "@ethersproject/signing-key@^5.6.0": - version "5.6.0" - resolved "https://registry.yarnpkg.com/@ethersproject/signing-key/-/signing-key-5.6.0.tgz#4f02e3fb09e22b71e2e1d6dc4bcb5dafa69ce042" - integrity sha512-S+njkhowmLeUu/r7ir8n78OUKx63kBdMCPssePS89So1TH4hZqnWFsThEd/GiXYp9qMxVrydf7KdM9MTGPFukA== - dependencies: - "@ethersproject/bytes" "^5.6.0" - "@ethersproject/logger" "^5.6.0" - "@ethersproject/properties" "^5.6.0" - bn.js "^4.11.9" - elliptic "6.5.4" - hash.js "1.1.7" - "@ethersproject/signing-key@5.7.0", "@ethersproject/signing-key@^5.7.0": version "5.7.0" resolved "https://registry.yarnpkg.com/@ethersproject/signing-key/-/signing-key-5.7.0.tgz#06b2df39411b00bc57c7c09b01d1e41cf1b16ab3" @@ -911,19 +503,7 @@ elliptic "6.5.4" hash.js "1.1.7" -"@ethersproject/solidity@5.6.0", "@ethersproject/solidity@^5.4.0": - version "5.6.0" - resolved "https://registry.yarnpkg.com/@ethersproject/solidity/-/solidity-5.6.0.tgz#64657362a596bf7f5630bdc921c07dd78df06dc3" - integrity sha512-YwF52vTNd50kjDzqKaoNNbC/r9kMDPq3YzDWmsjFTRBcIF1y4JCQJ8gB30wsTfHbaxgxelI5BfxQSxD/PbJOww== - dependencies: - "@ethersproject/bignumber" "^5.6.0" - "@ethersproject/bytes" "^5.6.0" - "@ethersproject/keccak256" "^5.6.0" - "@ethersproject/logger" "^5.6.0" - "@ethersproject/sha2" "^5.6.0" - "@ethersproject/strings" "^5.6.0" - -"@ethersproject/solidity@5.7.0": +"@ethersproject/solidity@5.7.0", "@ethersproject/solidity@^5.7.0": version "5.7.0" resolved "https://registry.yarnpkg.com/@ethersproject/solidity/-/solidity-5.7.0.tgz#5e9c911d8a2acce2a5ebb48a5e2e0af20b631cb8" integrity sha512-HmabMd2Dt/raavyaGukF4XxizWKhKQ24DoLtdNbBmNKUOPqwjsKQSdV9GQtj9CBEea9DlzETlVER1gYeXXBGaA== @@ -935,16 +515,7 @@ "@ethersproject/sha2" "^5.7.0" "@ethersproject/strings" "^5.7.0" -"@ethersproject/strings@5.6.0", "@ethersproject/strings@>=5.0.0-beta.130", "@ethersproject/strings@^5.5.0", "@ethersproject/strings@^5.6.0": - version "5.6.0" - resolved "https://registry.yarnpkg.com/@ethersproject/strings/-/strings-5.6.0.tgz#9891b26709153d996bf1303d39a7f4bc047878fd" - integrity sha512-uv10vTtLTZqrJuqBZR862ZQjTIa724wGPWQqZrofaPI/kUsf53TBG0I0D+hQ1qyNtllbNzaW+PDPHHUI6/65Mg== - dependencies: - "@ethersproject/bytes" "^5.6.0" - "@ethersproject/constants" "^5.6.0" - "@ethersproject/logger" "^5.6.0" - -"@ethersproject/strings@5.7.0", "@ethersproject/strings@^5.7.0": +"@ethersproject/strings@5.7.0", "@ethersproject/strings@>=5.0.0-beta.130", "@ethersproject/strings@^5.7.0": version "5.7.0" resolved "https://registry.yarnpkg.com/@ethersproject/strings/-/strings-5.7.0.tgz#54c9d2a7c57ae8f1205c88a9d3a56471e14d5ed2" integrity sha512-/9nu+lj0YswRNSH0NXYqrh8775XNyEdUQAuf3f+SmOrnVewcJ5SBNAjF7lpgehKi4abvNNXyf+HX86czCdJ8Mg== @@ -953,31 +524,7 @@ "@ethersproject/constants" "^5.7.0" "@ethersproject/logger" "^5.7.0" -"@ethersproject/strings@^5.0.4": - version "5.5.0" - resolved "https://registry.yarnpkg.com/@ethersproject/strings/-/strings-5.5.0.tgz#e6784d00ec6c57710755699003bc747e98c5d549" - integrity sha512-9fy3TtF5LrX/wTrBaT8FGE6TDJyVjOvXynXJz5MT5azq+E6D92zuKNx7i29sWW2FjVOaWjAsiZ1ZWznuduTIIQ== - dependencies: - "@ethersproject/bytes" "^5.5.0" - "@ethersproject/constants" "^5.5.0" - "@ethersproject/logger" "^5.5.0" - -"@ethersproject/transactions@5.6.0", "@ethersproject/transactions@^5.0.0-beta.135", "@ethersproject/transactions@^5.4.0", "@ethersproject/transactions@^5.6.0": - version "5.6.0" - resolved "https://registry.yarnpkg.com/@ethersproject/transactions/-/transactions-5.6.0.tgz#4b594d73a868ef6e1529a2f8f94a785e6791ae4e" - integrity sha512-4HX+VOhNjXHZyGzER6E/LVI2i6lf9ejYeWD6l4g50AdmimyuStKc39kvKf1bXWQMg7QNVh+uC7dYwtaZ02IXeg== - dependencies: - "@ethersproject/address" "^5.6.0" - "@ethersproject/bignumber" "^5.6.0" - "@ethersproject/bytes" "^5.6.0" - "@ethersproject/constants" "^5.6.0" - "@ethersproject/keccak256" "^5.6.0" - "@ethersproject/logger" "^5.6.0" - "@ethersproject/properties" "^5.6.0" - "@ethersproject/rlp" "^5.6.0" - "@ethersproject/signing-key" "^5.6.0" - -"@ethersproject/transactions@5.7.0", "@ethersproject/transactions@^5.7.0": +"@ethersproject/transactions@5.7.0", "@ethersproject/transactions@^5.0.0-beta.135", "@ethersproject/transactions@^5.6.2", "@ethersproject/transactions@^5.7.0": version "5.7.0" resolved "https://registry.yarnpkg.com/@ethersproject/transactions/-/transactions-5.7.0.tgz#91318fc24063e057885a6af13fdb703e1f993d3b" integrity sha512-kmcNicCp1lp8qanMTC3RIikGgoJ80ztTyvtsFvCYpSCfkjhD0jZ2LOrnbcuxuToLIUYYf+4XwD1rP+B/erDIhQ== @@ -992,15 +539,6 @@ "@ethersproject/rlp" "^5.7.0" "@ethersproject/signing-key" "^5.7.0" -"@ethersproject/units@5.6.0": - version "5.6.0" - resolved "https://registry.yarnpkg.com/@ethersproject/units/-/units-5.6.0.tgz#e5cbb1906988f5740254a21b9ded6bd51e826d9c" - integrity sha512-tig9x0Qmh8qbo1w8/6tmtyrm/QQRviBh389EQ+d8fP4wDsBrJBf08oZfoiz1/uenKK9M78yAP4PoR7SsVoTjsw== - dependencies: - "@ethersproject/bignumber" "^5.6.0" - "@ethersproject/constants" "^5.6.0" - "@ethersproject/logger" "^5.6.0" - "@ethersproject/units@5.7.0": version "5.7.0" resolved "https://registry.yarnpkg.com/@ethersproject/units/-/units-5.7.0.tgz#637b563d7e14f42deeee39245275d477aae1d8b1" @@ -1010,28 +548,7 @@ "@ethersproject/constants" "^5.7.0" "@ethersproject/logger" "^5.7.0" -"@ethersproject/wallet@5.6.0", "@ethersproject/wallet@^5.4.0": - version "5.6.0" - resolved "https://registry.yarnpkg.com/@ethersproject/wallet/-/wallet-5.6.0.tgz#33d11a806d783864208f348709a5a3badac8e22a" - integrity sha512-qMlSdOSTyp0MBeE+r7SUhr1jjDlC1zAXB8VD84hCnpijPQiSNbxr6GdiLXxpUs8UKzkDiNYYC5DRI3MZr+n+tg== - dependencies: - "@ethersproject/abstract-provider" "^5.6.0" - "@ethersproject/abstract-signer" "^5.6.0" - "@ethersproject/address" "^5.6.0" - "@ethersproject/bignumber" "^5.6.0" - "@ethersproject/bytes" "^5.6.0" - "@ethersproject/hash" "^5.6.0" - "@ethersproject/hdnode" "^5.6.0" - "@ethersproject/json-wallets" "^5.6.0" - "@ethersproject/keccak256" "^5.6.0" - "@ethersproject/logger" "^5.6.0" - "@ethersproject/properties" "^5.6.0" - "@ethersproject/random" "^5.6.0" - "@ethersproject/signing-key" "^5.6.0" - "@ethersproject/transactions" "^5.6.0" - "@ethersproject/wordlists" "^5.6.0" - -"@ethersproject/wallet@5.7.0": +"@ethersproject/wallet@5.7.0", "@ethersproject/wallet@^5.7.0": version "5.7.0" resolved "https://registry.yarnpkg.com/@ethersproject/wallet/-/wallet-5.7.0.tgz#4e5d0790d96fe21d61d38fb40324e6c7ef350b2d" integrity sha512-MhmXlJXEJFBFVKrDLB4ZdDzxcBxQ3rLyCkhNqVu3CDYvR97E+8r01UgrI+TI99Le+aYm/in/0vp86guJuM7FCA== @@ -1052,29 +569,7 @@ "@ethersproject/transactions" "^5.7.0" "@ethersproject/wordlists" "^5.7.0" -"@ethersproject/web@5.6.0", "@ethersproject/web@^5.6.0": - version "5.6.0" - resolved "https://registry.yarnpkg.com/@ethersproject/web/-/web-5.6.0.tgz#4bf8b3cbc17055027e1a5dd3c357e37474eaaeb8" - integrity sha512-G/XHj0hV1FxI2teHRfCGvfBUHFmU+YOSbCxlAMqJklxSa7QMiHFQfAxvwY2PFqgvdkxEKwRNr/eCjfAPEm2Ctg== - dependencies: - "@ethersproject/base64" "^5.6.0" - "@ethersproject/bytes" "^5.6.0" - "@ethersproject/logger" "^5.6.0" - "@ethersproject/properties" "^5.6.0" - "@ethersproject/strings" "^5.6.0" - -"@ethersproject/web@5.7.0", "@ethersproject/web@^5.7.0": - version "5.7.0" - resolved "https://registry.yarnpkg.com/@ethersproject/web/-/web-5.7.0.tgz#40850c05260edad8b54827923bbad23d96aac0bc" - integrity sha512-ApHcbbj+muRASVDSCl/tgxaH2LBkRMEYfLOLVa0COipx0+nlu0QKet7U2lEg0vdkh8XRSLf2nd1f1Uk9SrVSGA== - dependencies: - "@ethersproject/base64" "^5.7.0" - "@ethersproject/bytes" "^5.7.0" - "@ethersproject/logger" "^5.7.0" - "@ethersproject/properties" "^5.7.0" - "@ethersproject/strings" "^5.7.0" - -"@ethersproject/web@5.7.1": +"@ethersproject/web@5.7.1", "@ethersproject/web@^5.7.0": version "5.7.1" resolved "https://registry.yarnpkg.com/@ethersproject/web/-/web-5.7.1.tgz#de1f285b373149bee5928f4eb7bcb87ee5fbb4ae" integrity sha512-Gueu8lSvyjBWL4cYsWsjh6MtMwM0+H4HvqFPZfB6dV8ctbP9zFAO73VG1cMWae0FLPCtz0peKPpZY8/ugJJX2w== @@ -1085,17 +580,6 @@ "@ethersproject/properties" "^5.7.0" "@ethersproject/strings" "^5.7.0" -"@ethersproject/wordlists@5.6.0", "@ethersproject/wordlists@^5.6.0": - version "5.6.0" - resolved "https://registry.yarnpkg.com/@ethersproject/wordlists/-/wordlists-5.6.0.tgz#79e62c5276e091d8575f6930ba01a29218ded032" - integrity sha512-q0bxNBfIX3fUuAo9OmjlEYxP40IB8ABgb7HjEZCL5IKubzV3j30CWi2rqQbjTS2HfoyQbfINoKcTVWP4ejwR7Q== - dependencies: - "@ethersproject/bytes" "^5.6.0" - "@ethersproject/hash" "^5.6.0" - "@ethersproject/logger" "^5.6.0" - "@ethersproject/properties" "^5.6.0" - "@ethersproject/strings" "^5.6.0" - "@ethersproject/wordlists@5.7.0", "@ethersproject/wordlists@^5.7.0": version "5.7.0" resolved "https://registry.yarnpkg.com/@ethersproject/wordlists/-/wordlists-5.7.0.tgz#8fb2c07185d68c3e09eb3bfd6e779ba2774627f5" @@ -1107,19 +591,14 @@ "@ethersproject/properties" "^5.7.0" "@ethersproject/strings" "^5.7.0" -"@humanwhocodes/config-array@^0.10.4": - version "0.10.4" - resolved "https://registry.yarnpkg.com/@humanwhocodes/config-array/-/config-array-0.10.4.tgz#01e7366e57d2ad104feea63e72248f22015c520c" - integrity sha512-mXAIHxZT3Vcpg83opl1wGlVZ9xydbfZO3r5YfRSH6Gpp2J/PfdBP0wbDa2sO6/qRbcalpoevVyW6A/fI6LfeMw== +"@humanwhocodes/config-array@^0.11.11": + version "0.11.11" + resolved "https://registry.yarnpkg.com/@humanwhocodes/config-array/-/config-array-0.11.11.tgz#88a04c570dbbc7dd943e4712429c3df09bc32844" + integrity sha512-N2brEuAadi0CcdeMXUkhbZB84eskAc8MEX1By6qEchoVywSgXPIjou4rYsl0V3Hj0ZnuGycGCjdNgockbzeWNA== dependencies: "@humanwhocodes/object-schema" "^1.2.1" debug "^4.1.1" - minimatch "^3.0.4" - -"@humanwhocodes/gitignore-to-minimatch@^1.0.2": - version "1.0.2" - resolved "https://registry.yarnpkg.com/@humanwhocodes/gitignore-to-minimatch/-/gitignore-to-minimatch-1.0.2.tgz#316b0a63b91c10e53f242efb4ace5c3b34e8728d" - integrity sha512-rSqmMJDdLFUsyxR6FMtD00nfQKKLFb1kv+qBbOVKqErvloEIJLo5bDTJTQNTYgeyp78JsA7u/NPi5jT1GR/MuA== + minimatch "^3.0.5" "@humanwhocodes/module-importer@^1.0.1": version "1.0.1" @@ -1131,10 +610,28 @@ resolved "https://registry.yarnpkg.com/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz#b520529ec21d8e5945a1851dfd1c32e94e39ff45" integrity sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA== +"@jridgewell/resolve-uri@^3.0.3": + version "3.1.1" + resolved "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.1.tgz#c08679063f279615a3326583ba3a90d1d82cc721" + integrity sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA== + +"@jridgewell/sourcemap-codec@^1.4.10": + version "1.4.15" + resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz#d7c6e6755c78567a951e04ab52ef0fd26de59f32" + integrity sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg== + +"@jridgewell/trace-mapping@0.3.9": + version "0.3.9" + resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz#6534fd5933a53ba7cbf3a17615e273a0d1273ff9" + integrity sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ== + dependencies: + "@jridgewell/resolve-uri" "^3.0.3" + "@jridgewell/sourcemap-codec" "^1.4.10" + "@metamask/eth-sig-util@^4.0.0": - version "4.0.0" - resolved "https://registry.yarnpkg.com/@metamask/eth-sig-util/-/eth-sig-util-4.0.0.tgz#11553ba06de0d1352332c1bde28c8edd00e0dcf6" - integrity sha512-LczOjjxY4A7XYloxzyxJIHONELmUxVZncpOLoClpEcTiebiVdM46KRPYXGuULro9oNNR2xdVx3yoKiQjdfWmoA== + version "4.0.1" + resolved "https://registry.yarnpkg.com/@metamask/eth-sig-util/-/eth-sig-util-4.0.1.tgz#3ad61f6ea9ad73ba5b19db780d40d9aae5157088" + integrity sha512-tghyZKLHZjcdlDqCA3gNZmLeR0XvOE9U1qoQO9ohyAZT6Pya+H9vkBPcsyXytmYLNgVoin7CKCmweo/R43V+tQ== dependencies: ethereumjs-abi "^0.6.8" ethereumjs-util "^6.2.1" @@ -1142,15 +639,32 @@ tweetnacl "^1.0.3" tweetnacl-util "^0.15.1" -"@noble/hashes@1.0.0", "@noble/hashes@~1.0.0": - version "1.0.0" - resolved "https://registry.yarnpkg.com/@noble/hashes/-/hashes-1.0.0.tgz#d5e38bfbdaba174805a4e649f13be9a9ed3351ae" - integrity sha512-DZVbtY62kc3kkBtMHqwCOfXrT/hnoORy5BJ4+HU1IR59X0KWAOqsfzQPcUl/lQLlG7qXbe/fZ3r/emxtAl+sqg== +"@noble/curves@1.1.0", "@noble/curves@~1.1.0": + version "1.1.0" + resolved "https://registry.yarnpkg.com/@noble/curves/-/curves-1.1.0.tgz#f13fc667c89184bc04cccb9b11e8e7bae27d8c3d" + integrity sha512-091oBExgENk/kGj3AZmtBDMpxQPDtxQABR2B9lb1JbVTs6ytdzZNwvhxQ4MWasRNEzlbEH8jCWFCwhF/Obj5AA== + dependencies: + "@noble/hashes" "1.3.1" + +"@noble/hashes@1.2.0", "@noble/hashes@~1.2.0": + version "1.2.0" + resolved "https://registry.yarnpkg.com/@noble/hashes/-/hashes-1.2.0.tgz#a3150eeb09cc7ab207ebf6d7b9ad311a9bdbed12" + integrity sha512-FZfhjEDbT5GRswV3C6uvLPHMiVD6lQBmpoX5+eSiPaMTXte/IKqI5dykDxzZB/WBeK/CDuQRBWarPdi3FNY2zQ== + +"@noble/hashes@1.3.1": + version "1.3.1" + resolved "https://registry.yarnpkg.com/@noble/hashes/-/hashes-1.3.1.tgz#8831ef002114670c603c458ab8b11328406953a9" + integrity sha512-EbqwksQwz9xDRGfDST86whPBgM65E0OH/pCgqW0GBVzO22bNE+NuIbeTb714+IfSjU3aRk47EUvXIb5bTsenKA== -"@noble/secp256k1@1.5.5", "@noble/secp256k1@~1.5.2": - version "1.5.5" - resolved "https://registry.yarnpkg.com/@noble/secp256k1/-/secp256k1-1.5.5.tgz#315ab5745509d1a8c8e90d0bdf59823ccf9bcfc3" - integrity sha512-sZ1W6gQzYnu45wPrWx8D3kwI2/U29VYTx9OjbDAd7jwRItJ0cSTMPRL/C8AWZFn9kWFLQGqEXVEE86w4Z8LpIQ== +"@noble/hashes@~1.3.0", "@noble/hashes@~1.3.1": + version "1.3.2" + resolved "https://registry.yarnpkg.com/@noble/hashes/-/hashes-1.3.2.tgz#6f26dbc8fbc7205873ce3cee2f690eba0d421b39" + integrity sha512-MVC8EAQp7MvEcm30KWENFjgR+Mkmf+D189XJTkFIlwohU5hcBbn1ZkKq7KVTi2Hme3PMGF390DaL52beVrIihQ== + +"@noble/secp256k1@1.7.1", "@noble/secp256k1@~1.7.0": + version "1.7.1" + resolved "https://registry.yarnpkg.com/@noble/secp256k1/-/secp256k1-1.7.1.tgz#b251c70f824ce3ca7f8dc3df08d58f005cc0507c" + integrity sha512-hOUk6AyBFmqVrv7k5WAw/LpszxVbj9gGN4JRkIX52fdFAj1UA61KXmZDvqVEm+pOyec3+fIeZB02LYa/pWOArw== "@nodelib/fs.scandir@2.1.5": version "2.1.5" @@ -1165,7 +679,7 @@ resolved "https://registry.yarnpkg.com/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz#5bd262af94e9d25bd1e71b05deed44876a222e8b" integrity sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A== -"@nodelib/fs.walk@^1.2.3": +"@nodelib/fs.walk@^1.2.3", "@nodelib/fs.walk@^1.2.8": version "1.2.8" resolved "https://registry.yarnpkg.com/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz#e95737e8bb6746ddedf69c556953494f196fe69a" integrity sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg== @@ -1173,34 +687,231 @@ "@nodelib/fs.scandir" "2.1.5" fastq "^1.6.0" +"@nomicfoundation/ethereumjs-block@5.0.2": + version "5.0.2" + resolved "https://registry.yarnpkg.com/@nomicfoundation/ethereumjs-block/-/ethereumjs-block-5.0.2.tgz#13a7968f5964f1697da941281b7f7943b0465d04" + integrity sha512-hSe6CuHI4SsSiWWjHDIzWhSiAVpzMUcDRpWYzN0T9l8/Rz7xNn3elwVOJ/tAyS0LqL6vitUD78Uk7lQDXZun7Q== + dependencies: + "@nomicfoundation/ethereumjs-common" "4.0.2" + "@nomicfoundation/ethereumjs-rlp" "5.0.2" + "@nomicfoundation/ethereumjs-trie" "6.0.2" + "@nomicfoundation/ethereumjs-tx" "5.0.2" + "@nomicfoundation/ethereumjs-util" "9.0.2" + ethereum-cryptography "0.1.3" + ethers "^5.7.1" + +"@nomicfoundation/ethereumjs-blockchain@7.0.2": + version "7.0.2" + resolved "https://registry.yarnpkg.com/@nomicfoundation/ethereumjs-blockchain/-/ethereumjs-blockchain-7.0.2.tgz#45323b673b3d2fab6b5008535340d1b8fea7d446" + integrity sha512-8UUsSXJs+MFfIIAKdh3cG16iNmWzWC/91P40sazNvrqhhdR/RtGDlFk2iFTGbBAZPs2+klZVzhRX8m2wvuvz3w== + dependencies: + "@nomicfoundation/ethereumjs-block" "5.0.2" + "@nomicfoundation/ethereumjs-common" "4.0.2" + "@nomicfoundation/ethereumjs-ethash" "3.0.2" + "@nomicfoundation/ethereumjs-rlp" "5.0.2" + "@nomicfoundation/ethereumjs-trie" "6.0.2" + "@nomicfoundation/ethereumjs-tx" "5.0.2" + "@nomicfoundation/ethereumjs-util" "9.0.2" + abstract-level "^1.0.3" + debug "^4.3.3" + ethereum-cryptography "0.1.3" + level "^8.0.0" + lru-cache "^5.1.1" + memory-level "^1.0.0" + +"@nomicfoundation/ethereumjs-common@4.0.2": + version "4.0.2" + resolved "https://registry.yarnpkg.com/@nomicfoundation/ethereumjs-common/-/ethereumjs-common-4.0.2.tgz#a15d1651ca36757588fdaf2a7d381a150662a3c3" + integrity sha512-I2WGP3HMGsOoycSdOTSqIaES0ughQTueOsddJ36aYVpI3SN8YSusgRFLwzDJwRFVIYDKx/iJz0sQ5kBHVgdDwg== + dependencies: + "@nomicfoundation/ethereumjs-util" "9.0.2" + crc-32 "^1.2.0" + +"@nomicfoundation/ethereumjs-ethash@3.0.2": + version "3.0.2" + resolved "https://registry.yarnpkg.com/@nomicfoundation/ethereumjs-ethash/-/ethereumjs-ethash-3.0.2.tgz#da77147f806401ee996bfddfa6487500118addca" + integrity sha512-8PfoOQCcIcO9Pylq0Buijuq/O73tmMVURK0OqdjhwqcGHYC2PwhbajDh7GZ55ekB0Px197ajK3PQhpKoiI/UPg== + dependencies: + "@nomicfoundation/ethereumjs-block" "5.0.2" + "@nomicfoundation/ethereumjs-rlp" "5.0.2" + "@nomicfoundation/ethereumjs-util" "9.0.2" + abstract-level "^1.0.3" + bigint-crypto-utils "^3.0.23" + ethereum-cryptography "0.1.3" + +"@nomicfoundation/ethereumjs-evm@2.0.2": + version "2.0.2" + resolved "https://registry.yarnpkg.com/@nomicfoundation/ethereumjs-evm/-/ethereumjs-evm-2.0.2.tgz#4c2f4b84c056047102a4fa41c127454e3f0cfcf6" + integrity sha512-rBLcUaUfANJxyOx9HIdMX6uXGin6lANCulIm/pjMgRqfiCRMZie3WKYxTSd8ZE/d+qT+zTedBF4+VHTdTSePmQ== + dependencies: + "@ethersproject/providers" "^5.7.1" + "@nomicfoundation/ethereumjs-common" "4.0.2" + "@nomicfoundation/ethereumjs-tx" "5.0.2" + "@nomicfoundation/ethereumjs-util" "9.0.2" + debug "^4.3.3" + ethereum-cryptography "0.1.3" + mcl-wasm "^0.7.1" + rustbn.js "~0.2.0" + +"@nomicfoundation/ethereumjs-rlp@5.0.2": + version "5.0.2" + resolved "https://registry.yarnpkg.com/@nomicfoundation/ethereumjs-rlp/-/ethereumjs-rlp-5.0.2.tgz#4fee8dc58a53ac6ae87fb1fca7c15dc06c6b5dea" + integrity sha512-QwmemBc+MMsHJ1P1QvPl8R8p2aPvvVcKBbvHnQOKBpBztEo0omN0eaob6FeZS/e3y9NSe+mfu3nNFBHszqkjTA== + +"@nomicfoundation/ethereumjs-statemanager@2.0.2": + version "2.0.2" + resolved "https://registry.yarnpkg.com/@nomicfoundation/ethereumjs-statemanager/-/ethereumjs-statemanager-2.0.2.tgz#3ba4253b29b1211cafe4f9265fee5a0d780976e0" + integrity sha512-dlKy5dIXLuDubx8Z74sipciZnJTRSV/uHG48RSijhgm1V7eXYFC567xgKtsKiVZB1ViTP9iFL4B6Je0xD6X2OA== + dependencies: + "@nomicfoundation/ethereumjs-common" "4.0.2" + "@nomicfoundation/ethereumjs-rlp" "5.0.2" + debug "^4.3.3" + ethereum-cryptography "0.1.3" + ethers "^5.7.1" + js-sdsl "^4.1.4" + +"@nomicfoundation/ethereumjs-trie@6.0.2": + version "6.0.2" + resolved "https://registry.yarnpkg.com/@nomicfoundation/ethereumjs-trie/-/ethereumjs-trie-6.0.2.tgz#9a6dbd28482dca1bc162d12b3733acab8cd12835" + integrity sha512-yw8vg9hBeLYk4YNg5MrSJ5H55TLOv2FSWUTROtDtTMMmDGROsAu+0tBjiNGTnKRi400M6cEzoFfa89Fc5k8NTQ== + dependencies: + "@nomicfoundation/ethereumjs-rlp" "5.0.2" + "@nomicfoundation/ethereumjs-util" "9.0.2" + "@types/readable-stream" "^2.3.13" + ethereum-cryptography "0.1.3" + readable-stream "^3.6.0" + +"@nomicfoundation/ethereumjs-tx@5.0.2": + version "5.0.2" + resolved "https://registry.yarnpkg.com/@nomicfoundation/ethereumjs-tx/-/ethereumjs-tx-5.0.2.tgz#117813b69c0fdc14dd0446698a64be6df71d7e56" + integrity sha512-T+l4/MmTp7VhJeNloMkM+lPU3YMUaXdcXgTGCf8+ZFvV9NYZTRLFekRwlG6/JMmVfIfbrW+dRRJ9A6H5Q/Z64g== + dependencies: + "@chainsafe/ssz" "^0.9.2" + "@ethersproject/providers" "^5.7.2" + "@nomicfoundation/ethereumjs-common" "4.0.2" + "@nomicfoundation/ethereumjs-rlp" "5.0.2" + "@nomicfoundation/ethereumjs-util" "9.0.2" + ethereum-cryptography "0.1.3" + +"@nomicfoundation/ethereumjs-util@9.0.2": + version "9.0.2" + resolved "https://registry.yarnpkg.com/@nomicfoundation/ethereumjs-util/-/ethereumjs-util-9.0.2.tgz#16bdc1bb36f333b8a3559bbb4b17dac805ce904d" + integrity sha512-4Wu9D3LykbSBWZo8nJCnzVIYGvGCuyiYLIJa9XXNVt1q1jUzHdB+sJvx95VGCpPkCT+IbLecW6yfzy3E1bQrwQ== + dependencies: + "@chainsafe/ssz" "^0.10.0" + "@nomicfoundation/ethereumjs-rlp" "5.0.2" + ethereum-cryptography "0.1.3" + +"@nomicfoundation/ethereumjs-vm@7.0.2": + version "7.0.2" + resolved "https://registry.yarnpkg.com/@nomicfoundation/ethereumjs-vm/-/ethereumjs-vm-7.0.2.tgz#3b0852cb3584df0e18c182d0672a3596c9ca95e6" + integrity sha512-Bj3KZT64j54Tcwr7Qm/0jkeZXJMfdcAtRBedou+Hx0dPOSIgqaIr0vvLwP65TpHbak2DmAq+KJbW2KNtIoFwvA== + dependencies: + "@nomicfoundation/ethereumjs-block" "5.0.2" + "@nomicfoundation/ethereumjs-blockchain" "7.0.2" + "@nomicfoundation/ethereumjs-common" "4.0.2" + "@nomicfoundation/ethereumjs-evm" "2.0.2" + "@nomicfoundation/ethereumjs-rlp" "5.0.2" + "@nomicfoundation/ethereumjs-statemanager" "2.0.2" + "@nomicfoundation/ethereumjs-trie" "6.0.2" + "@nomicfoundation/ethereumjs-tx" "5.0.2" + "@nomicfoundation/ethereumjs-util" "9.0.2" + debug "^4.3.3" + ethereum-cryptography "0.1.3" + mcl-wasm "^0.7.1" + rustbn.js "~0.2.0" + +"@nomicfoundation/solidity-analyzer-darwin-arm64@0.1.1": + version "0.1.1" + resolved "https://registry.yarnpkg.com/@nomicfoundation/solidity-analyzer-darwin-arm64/-/solidity-analyzer-darwin-arm64-0.1.1.tgz#4c858096b1c17fe58a474fe81b46815f93645c15" + integrity sha512-KcTodaQw8ivDZyF+D76FokN/HdpgGpfjc/gFCImdLUyqB6eSWVaZPazMbeAjmfhx3R0zm/NYVzxwAokFKgrc0w== + +"@nomicfoundation/solidity-analyzer-darwin-x64@0.1.1": + version "0.1.1" + resolved "https://registry.yarnpkg.com/@nomicfoundation/solidity-analyzer-darwin-x64/-/solidity-analyzer-darwin-x64-0.1.1.tgz#6e25ccdf6e2d22389c35553b64fe6f3fdaec432c" + integrity sha512-XhQG4BaJE6cIbjAVtzGOGbK3sn1BO9W29uhk9J8y8fZF1DYz0Doj8QDMfpMu+A6TjPDs61lbsmeYodIDnfveSA== + +"@nomicfoundation/solidity-analyzer-freebsd-x64@0.1.1": + version "0.1.1" + resolved "https://registry.yarnpkg.com/@nomicfoundation/solidity-analyzer-freebsd-x64/-/solidity-analyzer-freebsd-x64-0.1.1.tgz#0a224ea50317139caeebcdedd435c28a039d169c" + integrity sha512-GHF1VKRdHW3G8CndkwdaeLkVBi5A9u2jwtlS7SLhBc8b5U/GcoL39Q+1CSO3hYqePNP+eV5YI7Zgm0ea6kMHoA== + +"@nomicfoundation/solidity-analyzer-linux-arm64-gnu@0.1.1": + version "0.1.1" + resolved "https://registry.yarnpkg.com/@nomicfoundation/solidity-analyzer-linux-arm64-gnu/-/solidity-analyzer-linux-arm64-gnu-0.1.1.tgz#dfa085d9ffab9efb2e7b383aed3f557f7687ac2b" + integrity sha512-g4Cv2fO37ZsUENQ2vwPnZc2zRenHyAxHcyBjKcjaSmmkKrFr64yvzeNO8S3GBFCo90rfochLs99wFVGT/0owpg== + +"@nomicfoundation/solidity-analyzer-linux-arm64-musl@0.1.1": + version "0.1.1" + resolved "https://registry.yarnpkg.com/@nomicfoundation/solidity-analyzer-linux-arm64-musl/-/solidity-analyzer-linux-arm64-musl-0.1.1.tgz#c9e06b5d513dd3ab02a7ac069c160051675889a4" + integrity sha512-WJ3CE5Oek25OGE3WwzK7oaopY8xMw9Lhb0mlYuJl/maZVo+WtP36XoQTb7bW/i8aAdHW5Z+BqrHMux23pvxG3w== + +"@nomicfoundation/solidity-analyzer-linux-x64-gnu@0.1.1": + version "0.1.1" + resolved "https://registry.yarnpkg.com/@nomicfoundation/solidity-analyzer-linux-x64-gnu/-/solidity-analyzer-linux-x64-gnu-0.1.1.tgz#8d328d16839e52571f72f2998c81e46bf320f893" + integrity sha512-5WN7leSr5fkUBBjE4f3wKENUy9HQStu7HmWqbtknfXkkil+eNWiBV275IOlpXku7v3uLsXTOKpnnGHJYI2qsdA== + +"@nomicfoundation/solidity-analyzer-linux-x64-musl@0.1.1": + version "0.1.1" + resolved "https://registry.yarnpkg.com/@nomicfoundation/solidity-analyzer-linux-x64-musl/-/solidity-analyzer-linux-x64-musl-0.1.1.tgz#9b49d0634b5976bb5ed1604a1e1b736f390959bb" + integrity sha512-KdYMkJOq0SYPQMmErv/63CwGwMm5XHenEna9X9aB8mQmhDBrYrlAOSsIPgFCUSL0hjxE3xHP65/EPXR/InD2+w== + +"@nomicfoundation/solidity-analyzer-win32-arm64-msvc@0.1.1": + version "0.1.1" + resolved "https://registry.yarnpkg.com/@nomicfoundation/solidity-analyzer-win32-arm64-msvc/-/solidity-analyzer-win32-arm64-msvc-0.1.1.tgz#e2867af7264ebbcc3131ef837878955dd6a3676f" + integrity sha512-VFZASBfl4qiBYwW5xeY20exWhmv6ww9sWu/krWSesv3q5hA0o1JuzmPHR4LPN6SUZj5vcqci0O6JOL8BPw+APg== + +"@nomicfoundation/solidity-analyzer-win32-ia32-msvc@0.1.1": + version "0.1.1" + resolved "https://registry.yarnpkg.com/@nomicfoundation/solidity-analyzer-win32-ia32-msvc/-/solidity-analyzer-win32-ia32-msvc-0.1.1.tgz#0685f78608dd516c8cdfb4896ed451317e559585" + integrity sha512-JnFkYuyCSA70j6Si6cS1A9Gh1aHTEb8kOTBApp/c7NRTFGNMH8eaInKlyuuiIbvYFhlXW4LicqyYuWNNq9hkpQ== + +"@nomicfoundation/solidity-analyzer-win32-x64-msvc@0.1.1": + version "0.1.1" + resolved "https://registry.yarnpkg.com/@nomicfoundation/solidity-analyzer-win32-x64-msvc/-/solidity-analyzer-win32-x64-msvc-0.1.1.tgz#c9a44f7108646f083b82e851486e0f6aeb785836" + integrity sha512-HrVJr6+WjIXGnw3Q9u6KQcbZCtk0caVWhCdFADySvRyUxJ8PnzlaP+MhwNE8oyT8OZ6ejHBRrrgjSqDCFXGirw== + +"@nomicfoundation/solidity-analyzer@^0.1.0": + version "0.1.1" + resolved "https://registry.yarnpkg.com/@nomicfoundation/solidity-analyzer/-/solidity-analyzer-0.1.1.tgz#f5f4d36d3f66752f59a57e7208cd856f3ddf6f2d" + integrity sha512-1LMtXj1puAxyFusBgUIy5pZk3073cNXYnXUpuNKFghHbIit/xZgbk0AokpUADbNm3gyD6bFWl3LRFh3dhVdREg== + optionalDependencies: + "@nomicfoundation/solidity-analyzer-darwin-arm64" "0.1.1" + "@nomicfoundation/solidity-analyzer-darwin-x64" "0.1.1" + "@nomicfoundation/solidity-analyzer-freebsd-x64" "0.1.1" + "@nomicfoundation/solidity-analyzer-linux-arm64-gnu" "0.1.1" + "@nomicfoundation/solidity-analyzer-linux-arm64-musl" "0.1.1" + "@nomicfoundation/solidity-analyzer-linux-x64-gnu" "0.1.1" + "@nomicfoundation/solidity-analyzer-linux-x64-musl" "0.1.1" + "@nomicfoundation/solidity-analyzer-win32-arm64-msvc" "0.1.1" + "@nomicfoundation/solidity-analyzer-win32-ia32-msvc" "0.1.1" + "@nomicfoundation/solidity-analyzer-win32-x64-msvc" "0.1.1" + "@nomiclabs/hardhat-ethers@npm:hardhat-deploy-ethers@^0.3.0-beta.13": version "0.3.0-beta.13" resolved "https://registry.yarnpkg.com/hardhat-deploy-ethers/-/hardhat-deploy-ethers-0.3.0-beta.13.tgz#b96086ff768ddf69928984d5eb0a8d78cfca9366" integrity sha512-PdWVcKB9coqWV1L7JTpfXRCI91Cgwsm7KLmBcwZ8f0COSm1xtABHZTyz3fvF6p42cTnz1VM0QnfDvMFlIRkSNw== "@nomiclabs/hardhat-etherscan@^3.1.0": - version "3.1.0" - resolved "https://registry.yarnpkg.com/@nomiclabs/hardhat-etherscan/-/hardhat-etherscan-3.1.0.tgz#7137554862b3b1c914f1b1bf110f0529fd2dec53" - integrity sha512-JroYgfN1AlYFkQTQ3nRwFi4o8NtZF7K/qFR2dxDUgHbCtIagkUseca9L4E/D2ScUm4XT40+8PbCdqZi+XmHyQA== + version "3.1.7" + resolved "https://registry.yarnpkg.com/@nomiclabs/hardhat-etherscan/-/hardhat-etherscan-3.1.7.tgz#72e3d5bd5d0ceb695e097a7f6f5ff6fcbf062b9a" + integrity sha512-tZ3TvSgpvsQ6B6OGmo1/Au6u8BrAkvs1mIC/eURA3xgIfznUZBhmpne8hv7BXUzw9xNL3fXdpOYgOQlVMTcoHQ== dependencies: "@ethersproject/abi" "^5.1.2" "@ethersproject/address" "^5.0.2" - cbor "^5.0.2" + cbor "^8.1.0" chalk "^2.4.2" debug "^4.1.1" fs-extra "^7.0.1" lodash "^4.17.11" semver "^6.3.0" table "^6.8.0" - undici "^5.4.0" + undici "^5.14.0" "@nomiclabs/hardhat-waffle@^2.0.1": - version "2.0.3" - resolved "https://registry.yarnpkg.com/@nomiclabs/hardhat-waffle/-/hardhat-waffle-2.0.3.tgz#9c538a09c5ed89f68f5fd2dc3f78f16ed1d6e0b1" - integrity sha512-049PHSnI1CZq6+XTbrMbMv5NaL7cednTfPenx02k3cEh8wBMLa6ys++dBETJa6JjfwgA9nBhhHQ173LJv6k2Pg== - dependencies: - "@types/sinon-chai" "^3.2.3" - "@types/web3" "1.0.19" + version "2.0.6" + resolved "https://registry.yarnpkg.com/@nomiclabs/hardhat-waffle/-/hardhat-waffle-2.0.6.tgz#d11cb063a5f61a77806053e54009c40ddee49a54" + integrity sha512-+Wz0hwmJGSI17B+BhU/qFRZ1l6/xMW82QGXE/Gi+WTmwgJrQefuBs1lIf7hzQ1hLk6hpkvb/zwcNkpVKRYTQYg== "@offchainlabs/upgrade-executor@1.1.0-beta.0": version "1.1.0-beta.0" @@ -1267,27 +978,44 @@ path-browserify "^1.0.0" url "^0.11.0" -"@scure/base@~1.0.0": - version "1.0.0" - resolved "https://registry.yarnpkg.com/@scure/base/-/base-1.0.0.tgz#109fb595021de285f05a7db6806f2f48296fcee7" - integrity sha512-gIVaYhUsy+9s58m/ETjSJVKHhKTBMmcRb9cEV5/5dwvfDlfORjKrFsDeDHWRrm6RjcPvCLZFwGJjAjLj1gg4HA== +"@scure/base@~1.1.0": + version "1.1.3" + resolved "https://registry.yarnpkg.com/@scure/base/-/base-1.1.3.tgz#8584115565228290a6c6c4961973e0903bb3df2f" + integrity sha512-/+SgoRjLq7Xlf0CWuLHq2LUZeL/w65kfzAPG5NH9pcmBhs+nunQTn4gvdwgMTIXnt9b2C/1SeL2XiysZEyIC9Q== -"@scure/bip32@1.0.1": - version "1.0.1" - resolved "https://registry.yarnpkg.com/@scure/bip32/-/bip32-1.0.1.tgz#1409bdf9f07f0aec99006bb0d5827693418d3aa5" - integrity sha512-AU88KKTpQ+YpTLoicZ/qhFhRRIo96/tlb+8YmDDHR9yiKVjSsFZiefJO4wjS2PMTkz5/oIcw84uAq/8pleQURA== +"@scure/bip32@1.1.5": + version "1.1.5" + resolved "https://registry.yarnpkg.com/@scure/bip32/-/bip32-1.1.5.tgz#d2ccae16dcc2e75bc1d75f5ef3c66a338d1ba300" + integrity sha512-XyNh1rB0SkEqd3tXcXMi+Xe1fvg+kUIcoRIEujP1Jgv7DqW2r9lg3Ah0NkFaCs9sTkQAQA8kw7xiRXzENi9Rtw== dependencies: - "@noble/hashes" "~1.0.0" - "@noble/secp256k1" "~1.5.2" - "@scure/base" "~1.0.0" + "@noble/hashes" "~1.2.0" + "@noble/secp256k1" "~1.7.0" + "@scure/base" "~1.1.0" -"@scure/bip39@1.0.0": - version "1.0.0" - resolved "https://registry.yarnpkg.com/@scure/bip39/-/bip39-1.0.0.tgz#47504e58de9a56a4bbed95159d2d6829fa491bb0" - integrity sha512-HrtcikLbd58PWOkl02k9V6nXWQyoa7A0+Ek9VF7z17DDk9XZAFUcIdqfh0jJXLypmizc5/8P6OxoUeKliiWv4w== +"@scure/bip32@1.3.1": + version "1.3.1" + resolved "https://registry.yarnpkg.com/@scure/bip32/-/bip32-1.3.1.tgz#7248aea723667f98160f593d621c47e208ccbb10" + integrity sha512-osvveYtyzdEVbt3OfwwXFr4P2iVBL5u1Q3q4ONBfDY/UpOuXmOlbgwc1xECEboY8wIays8Yt6onaWMUdUbfl0A== + dependencies: + "@noble/curves" "~1.1.0" + "@noble/hashes" "~1.3.1" + "@scure/base" "~1.1.0" + +"@scure/bip39@1.1.1": + version "1.1.1" + resolved "https://registry.yarnpkg.com/@scure/bip39/-/bip39-1.1.1.tgz#b54557b2e86214319405db819c4b6a370cf340c5" + integrity sha512-t+wDck2rVkh65Hmv280fYdVdY25J9YeEUIgn2LG1WM6gxFkGzcksoDiUkWVpVp3Oex9xGC68JU2dSbUfwZ2jPg== + dependencies: + "@noble/hashes" "~1.2.0" + "@scure/base" "~1.1.0" + +"@scure/bip39@1.2.1": + version "1.2.1" + resolved "https://registry.yarnpkg.com/@scure/bip39/-/bip39-1.2.1.tgz#5cee8978656b272a917b7871c981e0541ad6ac2a" + integrity sha512-Z3/Fsz1yr904dduJD0NpiyRHhRYHdcnyh73FZWiV+/qhWi83wNJ3NWolYqCEN+ZWsUz2TWwajJggcRE9r1zUYg== dependencies: - "@noble/hashes" "~1.0.0" - "@scure/base" "~1.0.0" + "@noble/hashes" "~1.3.0" + "@scure/base" "~1.1.0" "@sentry/core@5.30.0": version "5.30.0" @@ -1362,17 +1090,22 @@ resolved "https://registry.yarnpkg.com/@sindresorhus/is/-/is-0.14.0.tgz#9fb3a3cf3132328151f353de4632e01e52102bea" integrity sha512-9NET910DNaIPngYnLLPeg+Ogzqsi9uM4mSboU5y6p8S5DzMTVEsJZrawi+BoDNUVBa2DhJqQYUFvMDfgU062LQ== -"@solidity-parser/parser@^0.14.0", "@solidity-parser/parser@^0.14.1": - version "0.14.1" - resolved "https://registry.yarnpkg.com/@solidity-parser/parser/-/parser-0.14.1.tgz#179afb29f4e295a77cc141151f26b3848abc3c46" - integrity sha512-eLjj2L6AuQjBB6s/ibwCAc0DwrR5Ge+ys+wgWo+bviU7fV2nTMQhU63CGaDKXg9iTmMxwhkyoggdIR7ZGRfMgw== +"@sindresorhus/is@^4.0.0", "@sindresorhus/is@^4.6.0": + version "4.6.0" + resolved "https://registry.yarnpkg.com/@sindresorhus/is/-/is-4.6.0.tgz#3c7c9c46e678feefe7a2e5bb609d3dbd665ffb3f" + integrity sha512-t09vSN3MdfsyCHoFcTRCH/iUtG7OJ0CsjzB8cjAmKc/va/kIgeDI/TxsigdncE/4be734m0cvIYwNaV4i2XqAw== + +"@solidity-parser/parser@^0.14.0", "@solidity-parser/parser@^0.14.3": + version "0.14.5" + resolved "https://registry.yarnpkg.com/@solidity-parser/parser/-/parser-0.14.5.tgz#87bc3cc7b068e08195c219c91cd8ddff5ef1a804" + integrity sha512-6dKnHZn7fg/iQATVEzqyUOyEidbn05q7YA2mQ9hC0MMXhhV3/JrsxmFSYZAcr7j1yUP700LLhTruvJ3MiQmjJg== dependencies: antlr4ts "^0.5.0-alpha.4" -"@solidity-parser/parser@^0.14.3": - version "0.14.3" - resolved "https://registry.yarnpkg.com/@solidity-parser/parser/-/parser-0.14.3.tgz#0d627427b35a40d8521aaa933cc3df7d07bfa36f" - integrity sha512-29g2SZ29HtsqA58pLCtopI1P/cPy5/UAzlcAXO6T/CNJimG6yA8kx4NaseMyJULiC+TEs02Y9/yeHzClqoA0hw== +"@solidity-parser/parser@^0.16.0": + version "0.16.1" + resolved "https://registry.yarnpkg.com/@solidity-parser/parser/-/parser-0.16.1.tgz#f7c8a686974e1536da0105466c4db6727311253c" + integrity sha512-PdhRFNhbTtu3x8Axm0uYpqOy/lODYQK+MlYSgqIsq2L8SFYEHJPHNUiOTAJbDGzNjjr1/n9AcIayxafR/fWmYw== dependencies: antlr4ts "^0.5.0-alpha.4" @@ -1383,53 +1116,68 @@ dependencies: defer-to-connect "^1.0.1" -"@truffle/error@^0.0.14": - version "0.0.14" - resolved "https://registry.yarnpkg.com/@truffle/error/-/error-0.0.14.tgz#59683b5407bede7bddf16d80dc5592f9c5e5fa05" - integrity sha512-utJx+SZYoMqk8wldQG4gCVKhV8GwMJbWY7sLXFT/D8wWZTnE2peX7URFJh/cxkjTRCO328z1s2qewkhyVsu2HA== +"@szmarczak/http-timer@^4.0.5": + version "4.0.6" + resolved "https://registry.yarnpkg.com/@szmarczak/http-timer/-/http-timer-4.0.6.tgz#b4a914bb62e7c272d4e5989fe4440f812ab1d807" + integrity sha512-4BAffykYOgO+5nzBWYwE3W90sBgLJoUPRWWcL8wlyiM8IB8ipJz3UMJ9KXQd1RKQXpKp8Tutn80HZtWsu2u76w== + dependencies: + defer-to-connect "^2.0.0" -"@truffle/interface-adapter@^0.5.8": - version "0.5.8" - resolved "https://registry.yarnpkg.com/@truffle/interface-adapter/-/interface-adapter-0.5.8.tgz#76cfd34374d85849e1164de1a3d5a3dce0dc5d01" - integrity sha512-vvy3xpq36oLgjjy8KE9l2Jabg3WcGPOt18tIyMfTQX9MFnbHoQA2Ne2i8xsd4p6KfxIqSjAB53Q9/nScAqY0UQ== +"@szmarczak/http-timer@^5.0.1": + version "5.0.1" + resolved "https://registry.yarnpkg.com/@szmarczak/http-timer/-/http-timer-5.0.1.tgz#c7c1bf1141cdd4751b0399c8fc7b8b664cd5be3a" + integrity sha512-+PmQX0PiAYPMeVYe237LJAYvOMYW1j2rH5YROyS3b4CTVJum34HfRvKvAzozHAQG0TnHNdUfY9nCeUyRAs//cw== + dependencies: + defer-to-connect "^2.0.1" + +"@truffle/error@^0.1.1": + version "0.1.1" + resolved "https://registry.yarnpkg.com/@truffle/error/-/error-0.1.1.tgz#e52026ac8ca7180d83443dca73c03e07ace2a301" + integrity sha512-sE7c9IHIGdbK4YayH4BC8i8qMjoAOeg6nUXUDZZp8wlU21/EMpaG+CLx+KqcIPyR+GSWIW3Dm0PXkr2nlggFDA== + +"@truffle/interface-adapter@^0.5.25": + version "0.5.37" + resolved "https://registry.yarnpkg.com/@truffle/interface-adapter/-/interface-adapter-0.5.37.tgz#95d249c1912d2baaa63c54e8a138d3f476a1181a" + integrity sha512-lPH9MDgU+7sNDlJSClwyOwPCfuOimqsCx0HfGkznL3mcFRymc1pukAR1k17zn7ErHqBwJjiKAZ6Ri72KkS+IWw== dependencies: bn.js "^5.1.3" ethers "^4.0.32" - web3 "1.5.3" + web3 "1.10.0" "@truffle/provider@^0.2.24": - version "0.2.42" - resolved "https://registry.yarnpkg.com/@truffle/provider/-/provider-0.2.42.tgz#9da6a144b3c9188cdb587451dd7bd907b4c7164b" - integrity sha512-ZNoglPho4alYIjJR+sLTgX0x6ho7m4OAUWuJ50RAWmoEqYc4AM6htdrI+lTSoRrOHHbmgasv22a7rFPMnmDrTg== + version "0.2.64" + resolved "https://registry.yarnpkg.com/@truffle/provider/-/provider-0.2.64.tgz#7dd55117307fd019dcf81d08db5dc2bc5728f51c" + integrity sha512-ZwPsofw4EsCq/2h0t73SPnnFezu4YQWBmK4FxFaOUX0F+o8NsZuHKyfJzuZwyZbiktYmefM3yD9rM0Dj4BhNbw== dependencies: - "@truffle/error" "^0.0.14" - "@truffle/interface-adapter" "^0.5.8" - web3 "1.5.3" + "@truffle/error" "^0.1.1" + "@truffle/interface-adapter" "^0.5.25" + debug "^4.3.1" + web3 "1.7.4" "@tsconfig/node10@^1.0.7": - version "1.0.8" - resolved "https://registry.yarnpkg.com/@tsconfig/node10/-/node10-1.0.8.tgz#c1e4e80d6f964fbecb3359c43bd48b40f7cadad9" - integrity sha512-6XFfSQmMgq0CFLY1MslA/CPUfhIL919M1rMsa5lP2P097N2Wd1sSX0tx1u4olM16fLNhtHZpRhedZJphNJqmZg== + version "1.0.9" + resolved "https://registry.yarnpkg.com/@tsconfig/node10/-/node10-1.0.9.tgz#df4907fc07a886922637b15e02d4cebc4c0021b2" + integrity sha512-jNsYVVxU8v5g43Erja32laIDHXeoNvFEpX33OK4d6hljo3jDhCBDhx5dhCCTMWUojscpAagGiRkBKxpdl9fxqA== "@tsconfig/node12@^1.0.7": - version "1.0.9" - resolved "https://registry.yarnpkg.com/@tsconfig/node12/-/node12-1.0.9.tgz#62c1f6dee2ebd9aead80dc3afa56810e58e1a04c" - integrity sha512-/yBMcem+fbvhSREH+s14YJi18sp7J9jpuhYByADT2rypfajMZZN4WQ6zBGgBKp53NKmqI36wFYDb3yaMPurITw== + version "1.0.11" + resolved "https://registry.yarnpkg.com/@tsconfig/node12/-/node12-1.0.11.tgz#ee3def1f27d9ed66dac6e46a295cffb0152e058d" + integrity sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag== "@tsconfig/node14@^1.0.0": - version "1.0.1" - resolved "https://registry.yarnpkg.com/@tsconfig/node14/-/node14-1.0.1.tgz#95f2d167ffb9b8d2068b0b235302fafd4df711f2" - integrity sha512-509r2+yARFfHHE7T6Puu2jjkoycftovhXRqW328PDXTVGKihlb1P8Z9mMZH04ebyajfRY7dedfGynlrFHJUQCg== + version "1.0.3" + resolved "https://registry.yarnpkg.com/@tsconfig/node14/-/node14-1.0.3.tgz#e4386316284f00b98435bf40f72f75a09dabf6c1" + integrity sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow== "@tsconfig/node16@^1.0.2": - version "1.0.2" - resolved "https://registry.yarnpkg.com/@tsconfig/node16/-/node16-1.0.2.tgz#423c77877d0569db20e1fc80885ac4118314010e" - integrity sha512-eZxlbI8GZscaGS7kkc/trHTT5xgrjH3/1n2JDwusC9iahPKWMRvRjJSAN5mCXviuTGQ/lHnhvv8Q1YTpnfz9gA== + version "1.0.4" + resolved "https://registry.yarnpkg.com/@tsconfig/node16/-/node16-1.0.4.tgz#0b92dcc0cc1c81f6f306a381f28e31b1a56536e9" + integrity sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA== "@typechain/ethers-v5@^10.0.0": - version "10.0.0" - resolved "https://registry.yarnpkg.com/@typechain/ethers-v5/-/ethers-v5-10.0.0.tgz#1b6e292d2ed9afb0d2f7a4674cc199bb95bad714" - integrity sha512-Kot7fwAqnH96ZbI8xrRgj5Kpv9yCEdjo7mxRqrH7bYpEgijT5MmuOo8IVsdhOu7Uog4ONg7k/d5UdbAtTKUgsA== + version "10.2.1" + resolved "https://registry.yarnpkg.com/@typechain/ethers-v5/-/ethers-v5-10.2.1.tgz#50241e6957683281ecfa03fb5a6724d8a3ce2391" + integrity sha512-n3tQmCZjRE6IU4h6lqUGiQ1j866n5MTCBJreNEHHVWXa2u9GJTaeYyU1/k+1qLutkyw+sS6VAN+AbeiTqsxd/A== dependencies: lodash "^4.17.15" ts-essentials "^7.0.1" @@ -1442,24 +1190,11 @@ ethers "^5.0.2" "@typechain/hardhat@^6.0.0": - version "6.0.0" - resolved "https://registry.yarnpkg.com/@typechain/hardhat/-/hardhat-6.0.0.tgz#5e305641de67276efbfaa8c37c78e38f22b22ef4" - integrity sha512-AnhwODKHxx3+st5uc1j2NQh79Lv2OuvDQe4dKn8ZxhqYsAsTPnHTLBeI8KPZ+mfdE7v13D2QYssRTIkkGhK35A== + version "6.1.6" + resolved "https://registry.yarnpkg.com/@typechain/hardhat/-/hardhat-6.1.6.tgz#1a749eb35e5054c80df531cf440819cb347c62ea" + integrity sha512-BiVnegSs+ZHVymyidtK472syodx1sXYlYJJixZfRstHVGYTi8V1O7QG4nsjyb0PC/LORcq7sfBUcHto1y6UgJA== dependencies: fs-extra "^9.1.0" - lodash "^4.17.15" - -"@types/abstract-leveldown@*": - version "7.2.0" - resolved "https://registry.yarnpkg.com/@types/abstract-leveldown/-/abstract-leveldown-7.2.0.tgz#f055979a99f7654e84d6b8e6267419e9c4cfff87" - integrity sha512-q5veSX6zjUy/DlDhR4Y4cU0k2Ar+DT2LUraP00T19WLmTO6Se1djepCCaqU6nQrwcJ5Hyo/CWqxTzrrFg8eqbQ== - -"@types/bn.js@*", "@types/bn.js@^5.1.0": - version "5.1.0" - resolved "https://registry.yarnpkg.com/@types/bn.js/-/bn.js-5.1.0.tgz#32c5d271503a12653c62cf4d2b45e6eab8cebc68" - integrity sha512-QSSVYj7pYFN49kW77o2s9xTCwZ8F2xLbjLLSEVh8D2F4JUhZtPAGOFLTD+ffqksBx/u4cE/KImFjyhqCjn/LIA== - dependencies: - "@types/node" "*" "@types/bn.js@^4.11.3", "@types/bn.js@^4.11.5": version "4.11.6" @@ -1468,15 +1203,27 @@ dependencies: "@types/node" "*" -"@types/chai@*": - version "4.3.0" - resolved "https://registry.yarnpkg.com/@types/chai/-/chai-4.3.0.tgz#23509ebc1fa32f1b4d50d6a66c4032d5b8eaabdc" - integrity sha512-/ceqdqeRraGolFTcfoXNiqjyQhZzbINDngeoAq9GoHa8PPK1yNzTaxWjA6BFWp5Ua9JpXEMSS4s5i9tS0hOJtw== +"@types/bn.js@^5.1.0", "@types/bn.js@^5.1.1": + version "5.1.1" + resolved "https://registry.yarnpkg.com/@types/bn.js/-/bn.js-5.1.1.tgz#b51e1b55920a4ca26e9285ff79936bbdec910682" + integrity sha512-qNrYbZqMx0uJAfKnKclPh+dTwK33KfLHYqtyODwd5HnXOjnkhc4qgn3BrK6RWyGZm5+sIFE7Q7Vz6QQtJB7w7g== + dependencies: + "@types/node" "*" + +"@types/cacheable-request@^6.0.1", "@types/cacheable-request@^6.0.2": + version "6.0.3" + resolved "https://registry.yarnpkg.com/@types/cacheable-request/-/cacheable-request-6.0.3.tgz#a430b3260466ca7b5ca5bfd735693b36e7a9d183" + integrity sha512-IQ3EbTzGxIigb1I3qPZc1rWJnH0BmSKv5QYTalEwweFvyBDLSAe24zP0le/hyi7ecGfZVlIVAg4BZqb8WBwKqw== + dependencies: + "@types/http-cache-semantics" "*" + "@types/keyv" "^3.1.4" + "@types/node" "*" + "@types/responselike" "^1.0.0" "@types/chai@^4.3.0": - version "4.3.1" - resolved "https://registry.yarnpkg.com/@types/chai/-/chai-4.3.1.tgz#e2c6e73e0bdeb2521d00756d099218e9f5d90a04" - integrity sha512-/zPMqDkzSZ8t3VtxOa4KPq7uzzW978M9Tvh+j7GHKuo6k6GTLxPJ4J5gE5cjfJ26pnXst0N5Hax8Sr0T2Mi9zQ== + version "4.3.6" + resolved "https://registry.yarnpkg.com/@types/chai/-/chai-4.3.6.tgz#7b489e8baf393d5dd1266fb203ddd4ea941259e6" + integrity sha512-VOVRLM1mBxIRxydiViqPcKn6MIxZytrbMpd6RJLIWKxUNr3zux8no0Oc7kJx0WAPIitgZ0gkrDS+btlqQpubpw== "@types/concat-stream@^1.6.0": version "1.6.1" @@ -1488,7 +1235,7 @@ "@types/form-data@0.0.33": version "0.0.33" resolved "https://registry.yarnpkg.com/@types/form-data/-/form-data-0.0.33.tgz#c9ac85b2a5fd18435b8c85d9ecb50e6d6c893ff8" - integrity sha1-yayFsqX9GENbjIXZ7LUObWyJP/g= + integrity sha512-8BSvG1kGm83cyJITQMZSulnl6QV8jqAGreJsc5tPu1Jq0vTSOiY/k24Wx82JRpWwZSqrala6sd5rWi6aNXvqcw== dependencies: "@types/node" "*" @@ -1500,23 +1247,21 @@ "@types/minimatch" "*" "@types/node" "*" -"@types/json-schema@^7.0.9": - version "7.0.11" - resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.11.tgz#d421b6c527a3037f7c84433fd2c4229e016863d3" - integrity sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ== +"@types/http-cache-semantics@*": + version "4.0.1" + resolved "https://registry.yarnpkg.com/@types/http-cache-semantics/-/http-cache-semantics-4.0.1.tgz#0ea7b61496902b95890dc4c3a116b60cb8dae812" + integrity sha512-SZs7ekbP8CN0txVG2xVRH6EgKmEm31BOxA07vkFaETzZz1xh+cbt8BcI0slpymvwhx5dlFnQG2rTlPVQn+iRPQ== -"@types/level-errors@*": - version "3.0.0" - resolved "https://registry.yarnpkg.com/@types/level-errors/-/level-errors-3.0.0.tgz#15c1f4915a5ef763b51651b15e90f6dc081b96a8" - integrity sha512-/lMtoq/Cf/2DVOm6zE6ORyOM+3ZVm/BvzEZVxUhf6bgh8ZHglXlBqxbxSlJeVp8FCbD3IVvk/VbsaNmDjrQvqQ== +"@types/json-schema@^7.0.9": + version "7.0.12" + resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.12.tgz#d70faba7039d5fca54c83c7dbab41051d2b6f6cb" + integrity sha512-Hr5Jfhc9eYOQNPYO5WLDq/n4jqijdHNlDXjuAQkkt+mWdQR+XJToOHrsD4cPaMXpn6KO7y2+wM8AZEs8VpBLVA== -"@types/levelup@^4.3.0": - version "4.3.3" - resolved "https://registry.yarnpkg.com/@types/levelup/-/levelup-4.3.3.tgz#4dc2b77db079b1cf855562ad52321aa4241b8ef4" - integrity sha512-K+OTIjJcZHVlZQN1HmU64VtrC0jC3dXWQozuEIR9zVvltIk90zaGPM2AgT+fIkChpzHhFE3YnvFLCbLtzAmexA== +"@types/keyv@^3.1.4": + version "3.1.4" + resolved "https://registry.yarnpkg.com/@types/keyv/-/keyv-3.1.4.tgz#3ccdb1c6751b0c7e52300bcdacd5bcbf8faa75b6" + integrity sha512-BQ5aZNSCpj7D6K2ksrRCTmKRLEpnPvWDiLPfoGyhZ++8YtiK9d/3DBKPJgry359X/P1PfruyYwvnvwFjuEiEIg== dependencies: - "@types/abstract-leveldown" "*" - "@types/level-errors" "*" "@types/node" "*" "@types/lru-cache@^5.1.0": @@ -1525,9 +1270,9 @@ integrity sha512-ssE3Vlrys7sdIzs5LOxCzTVMsU7i9oa/IaW92wF32JFb3CVczqOkru2xspuKczHEbG3nvmPY7IFqVmGGHdNbYw== "@types/minimatch@*": - version "3.0.5" - resolved "https://registry.yarnpkg.com/@types/minimatch/-/minimatch-3.0.5.tgz#1001cc5e6a3704b83c236027e77f2f58ea010f40" - integrity sha512-Klz949h02Gz2uZCMGwDUSDS1YBlTdDDgbWHi+81l29tQALUtvz4rAYi5uoVhE5Lagoq6DeqAUlbrHvW/mXDgdQ== + version "5.1.2" + resolved "https://registry.yarnpkg.com/@types/minimatch/-/minimatch-5.1.2.tgz#07508b45797cb81ec3f273011b054cd0755eddca" + integrity sha512-K0VQKziLUWkVKiRVrx4a40iPaxTUefQmjtkQofBkYRcoaaL/8rhwDWww9qWbrgicNOgnpIsMxyNIUM4+n6dUIA== "@types/mkdirp@^0.5.2": version "0.5.2" @@ -1537,22 +1282,22 @@ "@types/node" "*" "@types/mocha@^9.0.0": - version "9.1.0" - resolved "https://registry.yarnpkg.com/@types/mocha/-/mocha-9.1.0.tgz#baf17ab2cca3fcce2d322ebc30454bff487efad5" - integrity sha512-QCWHkbMv4Y5U9oW10Uxbr45qMMSzl4OzijsozynUAgx3kEHUdXB00udx2dWDQ7f2TU2a2uuiFaRZjCe3unPpeg== + version "9.1.1" + resolved "https://registry.yarnpkg.com/@types/mocha/-/mocha-9.1.1.tgz#e7c4f1001eefa4b8afbd1eee27a237fee3bf29c4" + integrity sha512-Z61JK7DKDtdKTWwLeElSEBcWGRLY8g95ic5FoQqI9CMx0ns/Ghep3B4DfcEimiKMvtamNVULVNKEsiwV3aQmXw== "@types/node-fetch@^2.5.5": - version "2.6.1" - resolved "https://registry.yarnpkg.com/@types/node-fetch/-/node-fetch-2.6.1.tgz#8f127c50481db65886800ef496f20bbf15518975" - integrity sha512-oMqjURCaxoSIsHSr1E47QHzbmzNR5rK8McHuNb11BOM9cHcIK3Avy0s/b2JlXHoQGTYS3NsvWzV1M0iK7l0wbA== + version "2.6.4" + resolved "https://registry.yarnpkg.com/@types/node-fetch/-/node-fetch-2.6.4.tgz#1bc3a26de814f6bf466b25aeb1473fa1afe6a660" + integrity sha512-1ZX9fcN4Rvkvgv4E6PAY5WXUFWFcRWxZa3EW83UjycOB9ljJCedb2CupIP4RZMEwF/M3eTcCihbBRgwtGbg5Rg== dependencies: "@types/node" "*" form-data "^3.0.0" "@types/node@*": - version "17.0.23" - resolved "https://registry.yarnpkg.com/@types/node/-/node-17.0.23.tgz#3b41a6e643589ac6442bdbd7a4a3ded62f33f7da" - integrity sha512-UxDxWn7dl97rKVeVS61vErvw086aCYhDLyvRQZ5Rk65rZKepaFdm53GeqXaKBuOhED4e9uWq34IC3TdSdJJ2Gw== + version "20.6.0" + resolved "https://registry.yarnpkg.com/@types/node/-/node-20.6.0.tgz#9d7daa855d33d4efec8aea88cd66db1c2f0ebe16" + integrity sha512-najjVq5KN2vsH2U/xyh2opaSEz6cZMR2SetLIlxlj08nOcmPOemJmUK2o4kUzfLqfrWE0PIrNeE16XhYDd3nqg== "@types/node@^10.0.3": version "10.17.60" @@ -1560,14 +1305,14 @@ integrity sha512-F0KIgDJfy2nA3zMLmWGKxcH2ZVEtCZXHHdOQs2gSaQ27+lNeEfGxzkIw90aXswATX7AZ33tahPbzy6KAfUreVw== "@types/node@^12.12.6": - version "12.20.47" - resolved "https://registry.yarnpkg.com/@types/node/-/node-12.20.47.tgz#ca9237d51f2a2557419688511dab1c8daf475188" - integrity sha512-BzcaRsnFuznzOItW1WpQrDHM7plAa7GIDMZ6b5pnMbkqEtM/6WCOhvZar39oeMQP79gwvFUWjjptE7/KGcNqFg== + version "12.20.55" + resolved "https://registry.yarnpkg.com/@types/node/-/node-12.20.55.tgz#c329cbd434c42164f846b909bd6f85b5537f6240" + integrity sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ== "@types/node@^17.0.5": - version "17.0.25" - resolved "https://registry.yarnpkg.com/@types/node/-/node-17.0.25.tgz#527051f3c2f77aa52e5dc74e45a3da5fb2301448" - integrity sha512-wANk6fBrUwdpY4isjWrKTufkrXdu1D2YHCot2fD/DfWxF5sMrVSA+KN7ydckvaTCh0HiqX9IVl0L5/ZoXg5M7w== + version "17.0.45" + resolved "https://registry.yarnpkg.com/@types/node/-/node-17.0.45.tgz#2c0fafd78705e7a18b7906b5201a522719dc5190" + integrity sha512-w+tIMs3rq2afQdsPJlODhoUEKzFP1ayaoyl1CcnwtIlsVe7K7bA1NGm4s3PraqTLlXnbIN84zuBlxBWo1u9BLw== "@types/node@^8.0.0": version "8.10.66" @@ -1582,14 +1327,22 @@ "@types/node" "*" "@types/prettier@^2.1.1": - version "2.4.4" - resolved "https://registry.yarnpkg.com/@types/prettier/-/prettier-2.4.4.tgz#5d9b63132df54d8909fce1c3f8ca260fdd693e17" - integrity sha512-ReVR2rLTV1kvtlWFyuot+d1pkpG2Fw/XKE3PDAdj57rbM97ttSp9JZ2UsP+2EHTylra9cUf6JA7tGwW1INzUrA== + version "2.7.3" + resolved "https://registry.yarnpkg.com/@types/prettier/-/prettier-2.7.3.tgz#3e51a17e291d01d17d3fc61422015a933af7a08f" + integrity sha512-+68kP9yzs4LMp7VNh8gdzMSPZFL44MLGqiHWvttYJe+6qnuVr4Ek9wSBQoveqY/r+LwjCcU29kNVkidwim+kYA== "@types/qs@^6.2.31", "@types/qs@^6.9.7": - version "6.9.7" - resolved "https://registry.yarnpkg.com/@types/qs/-/qs-6.9.7.tgz#63bb7d067db107cc1e457c303bc25d511febf6cb" - integrity sha512-FGa1F62FT09qcrueBA6qYTrJPVDzah9a+493+o2PCXsesWHIn27G98TsSMs3WPNbZIEj4+VJf6saSFpvD+3Zsw== + version "6.9.8" + resolved "https://registry.yarnpkg.com/@types/qs/-/qs-6.9.8.tgz#f2a7de3c107b89b441e071d5472e6b726b4adf45" + integrity sha512-u95svzDlTysU5xecFNTgfFG5RUWu1A9P0VzgpcIiGZA9iraHOdSzcxMxQ55DyeRaGCSxQi7LxXDI4rzq/MYfdg== + +"@types/readable-stream@^2.3.13": + version "2.3.15" + resolved "https://registry.yarnpkg.com/@types/readable-stream/-/readable-stream-2.3.15.tgz#3d79c9ceb1b6a57d5f6e6976f489b9b5384321ae" + integrity sha512-oM5JSKQCcICF1wvGgmecmHldZ48OZamtMxcGGVICOJA8o8cahXC1zEVAif8iwoc5j8etxFaRFnf095+CDsuoFQ== + dependencies: + "@types/node" "*" + safe-buffer "~5.1.1" "@types/resolve@^0.0.8": version "0.0.8" @@ -1598,6 +1351,13 @@ dependencies: "@types/node" "*" +"@types/responselike@^1.0.0": + version "1.0.0" + resolved "https://registry.yarnpkg.com/@types/responselike/-/responselike-1.0.0.tgz#251f4fe7d154d2bad125abe1b429b23afd262e29" + integrity sha512-85Y2BjiufFzaMIlvJDvTTB8Fxl2xfLo4HgmHzVBz08w4wDePCTjYw66PdrolO0kzli3yam/YCgRufyo1DdQVTA== + dependencies: + "@types/node" "*" + "@types/secp256k1@^4.0.1": version "4.0.3" resolved "https://registry.yarnpkg.com/@types/secp256k1/-/secp256k1-4.0.3.tgz#1b8e55d8e00f08ee7220b4d59a6abe89c37a901c" @@ -1605,38 +1365,10 @@ dependencies: "@types/node" "*" -"@types/sinon-chai@^3.2.3": - version "3.2.8" - resolved "https://registry.yarnpkg.com/@types/sinon-chai/-/sinon-chai-3.2.8.tgz#5871d09ab50d671d8e6dd72e9073f8e738ac61dc" - integrity sha512-d4ImIQbT/rKMG8+AXpmcan5T2/PNeSjrYhvkwet6z0p8kzYtfgA32xzOBlbU0yqJfq+/0Ml805iFoODO0LP5/g== - dependencies: - "@types/chai" "*" - "@types/sinon" "*" - -"@types/sinon@*": - version "10.0.11" - resolved "https://registry.yarnpkg.com/@types/sinon/-/sinon-10.0.11.tgz#8245827b05d3fc57a6601bd35aee1f7ad330fc42" - integrity sha512-dmZsHlBsKUtBpHriNjlK0ndlvEh8dcb9uV9Afsbt89QIyydpC7NcR+nWlAhASfy3GHnxTl4FX/aKE7XZUt/B4g== - dependencies: - "@types/sinonjs__fake-timers" "*" - -"@types/sinonjs__fake-timers@*": - version "8.1.2" - resolved "https://registry.yarnpkg.com/@types/sinonjs__fake-timers/-/sinonjs__fake-timers-8.1.2.tgz#bf2e02a3dbd4aecaf95942ecd99b7402e03fad5e" - integrity sha512-9GcLXF0/v3t80caGs5p2rRfkB+a8VBGLJZVih6CNFkx8IZ994wiKKLSRs9nuFwk1HevWs/1mnUmkApGrSGsShA== - -"@types/underscore@*": - version "1.11.4" - resolved "https://registry.yarnpkg.com/@types/underscore/-/underscore-1.11.4.tgz#62e393f8bc4bd8a06154d110c7d042a93751def3" - integrity sha512-uO4CD2ELOjw8tasUrAhvnn2W4A0ZECOvMjCivJr4gA9pGgjv+qxKWY9GLTMVEK8ej85BxQOocUyE7hImmSQYcg== - -"@types/web3@1.0.19": - version "1.0.19" - resolved "https://registry.yarnpkg.com/@types/web3/-/web3-1.0.19.tgz#46b85d91d398ded9ab7c85a5dd57cb33ac558924" - integrity sha512-fhZ9DyvDYDwHZUp5/STa9XW2re0E8GxoioYJ4pEUZ13YHpApSagixj7IAdoYH5uAK+UalGq6Ml8LYzmgRA/q+A== - dependencies: - "@types/bn.js" "*" - "@types/underscore" "*" +"@types/semver@^7.3.12": + version "7.5.1" + resolved "https://registry.yarnpkg.com/@types/semver/-/semver-7.5.1.tgz#0480eeb7221eb9bc398ad7432c9d7e14b1a5a367" + integrity sha512-cJRQXpObxfNKkFAZbJl2yjWtJCqELQIdShsogr1d2MilP8dKD9TE/nEKHkJgUNHdGKCQaf9HbIynuV2csLGVLg== "@types/yauzl@^2.9.1": version "2.10.0" @@ -1646,99 +1378,96 @@ "@types/node" "*" "@typescript-eslint/eslint-plugin-tslint@^5.27.1": - version "5.37.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin-tslint/-/eslint-plugin-tslint-5.37.0.tgz#bb678cac00843db3ffbb9aca3fd83c9fc4cbf7ca" - integrity sha512-wMyqF+WqS5rioQCwihWZJpnpVB/Jg0hLPHr0kWw7HOQtWkWUS71yGxKqJuIP3k0nkdwBk7tt17bZjAB8MOqFBQ== + version "5.62.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin-tslint/-/eslint-plugin-tslint-5.62.0.tgz#220242dcd23711c400d4f5d5d876d5107cea4be0" + integrity sha512-qsYLld1+xed2lVwHbCxkCWdhRcByLNOjpccxK6HHlem724PbMcL1/dmH7jMQaqIpbfPAGkIypyyk3q5nUgtkhA== dependencies: - "@typescript-eslint/utils" "5.37.0" - lodash "^4.17.21" + "@typescript-eslint/utils" "5.62.0" "@typescript-eslint/eslint-plugin@^5.14.0": - version "5.37.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.37.0.tgz#5ccdd5d9004120f28fc6e717fb4b5c9bddcfbc04" - integrity sha512-Fde6W0IafXktz1UlnhGkrrmnnGpAo1kyX7dnyHHVrmwJOn72Oqm3eYtddrpOwwel2W8PAK9F3pIL5S+lfoM0og== - dependencies: - "@typescript-eslint/scope-manager" "5.37.0" - "@typescript-eslint/type-utils" "5.37.0" - "@typescript-eslint/utils" "5.37.0" + version "5.62.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.62.0.tgz#aeef0328d172b9e37d9bab6dbc13b87ed88977db" + integrity sha512-TiZzBSJja/LbhNPvk6yc0JrX9XqhQ0hdh6M2svYfsHGejaKFIAGd9MQ+ERIMzLGlN/kZoYIgdxFV0PuljTKXag== + dependencies: + "@eslint-community/regexpp" "^4.4.0" + "@typescript-eslint/scope-manager" "5.62.0" + "@typescript-eslint/type-utils" "5.62.0" + "@typescript-eslint/utils" "5.62.0" debug "^4.3.4" - functional-red-black-tree "^1.0.1" + graphemer "^1.4.0" ignore "^5.2.0" - regexpp "^3.2.0" + natural-compare-lite "^1.4.0" semver "^7.3.7" tsutils "^3.21.0" "@typescript-eslint/parser@^5.14.0": - version "5.37.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-5.37.0.tgz#c382077973f3a4ede7453fb14cadcad3970cbf3b" - integrity sha512-01VzI/ipYKuaG5PkE5+qyJ6m02fVALmMPY3Qq5BHflDx3y4VobbLdHQkSMg9VPRS4KdNt4oYTMaomFoHonBGAw== + version "5.62.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-5.62.0.tgz#1b63d082d849a2fcae8a569248fbe2ee1b8a56c7" + integrity sha512-VlJEV0fOQ7BExOsHYAGrgbEiZoi8D+Bl2+f6V2RrXerRSylnp+ZBHmPvaIa8cz0Ajx7WO7Z5RqfgYg7ED1nRhA== dependencies: - "@typescript-eslint/scope-manager" "5.37.0" - "@typescript-eslint/types" "5.37.0" - "@typescript-eslint/typescript-estree" "5.37.0" + "@typescript-eslint/scope-manager" "5.62.0" + "@typescript-eslint/types" "5.62.0" + "@typescript-eslint/typescript-estree" "5.62.0" debug "^4.3.4" -"@typescript-eslint/scope-manager@5.37.0": - version "5.37.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-5.37.0.tgz#044980e4f1516a774a418dafe701a483a6c9f9ca" - integrity sha512-F67MqrmSXGd/eZnujjtkPgBQzgespu/iCZ+54Ok9X5tALb9L2v3G+QBSoWkXG0p3lcTJsL+iXz5eLUEdSiJU9Q== +"@typescript-eslint/scope-manager@5.62.0": + version "5.62.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-5.62.0.tgz#d9457ccc6a0b8d6b37d0eb252a23022478c5460c" + integrity sha512-VXuvVvZeQCQb5Zgf4HAxc04q5j+WrNAtNh9OwCsCgpKqESMTu3tF/jhZ3xG6T4NZwWl65Bg8KuS2uEvhSfLl0w== dependencies: - "@typescript-eslint/types" "5.37.0" - "@typescript-eslint/visitor-keys" "5.37.0" + "@typescript-eslint/types" "5.62.0" + "@typescript-eslint/visitor-keys" "5.62.0" -"@typescript-eslint/type-utils@5.37.0": - version "5.37.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/type-utils/-/type-utils-5.37.0.tgz#43ed2f567ada49d7e33a6e4b6f9babd060445fe5" - integrity sha512-BSx/O0Z0SXOF5tY0bNTBcDEKz2Ec20GVYvq/H/XNKiUorUFilH7NPbFUuiiyzWaSdN3PA8JV0OvYx0gH/5aFAQ== +"@typescript-eslint/type-utils@5.62.0": + version "5.62.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/type-utils/-/type-utils-5.62.0.tgz#286f0389c41681376cdad96b309cedd17d70346a" + integrity sha512-xsSQreu+VnfbqQpW5vnCJdq1Z3Q0U31qiWmRhr98ONQmcp/yhiPJFPq8MXiJVLiksmOKSjIldZzkebzHuCGzew== dependencies: - "@typescript-eslint/typescript-estree" "5.37.0" - "@typescript-eslint/utils" "5.37.0" + "@typescript-eslint/typescript-estree" "5.62.0" + "@typescript-eslint/utils" "5.62.0" debug "^4.3.4" tsutils "^3.21.0" -"@typescript-eslint/types@5.37.0": - version "5.37.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-5.37.0.tgz#09e4870a5f3af7af3f84e08d792644a87d232261" - integrity sha512-3frIJiTa5+tCb2iqR/bf7XwU20lnU05r/sgPJnRpwvfZaqCJBrl8Q/mw9vr3NrNdB/XtVyMA0eppRMMBqdJ1bA== +"@typescript-eslint/types@5.62.0": + version "5.62.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-5.62.0.tgz#258607e60effa309f067608931c3df6fed41fd2f" + integrity sha512-87NVngcbVXUahrRTqIK27gD2t5Cu1yuCXxbLcFtCzZGlfyVWWh8mLHkoxzjsB6DDNnvdL+fW8MiwPEJyGJQDgQ== -"@typescript-eslint/typescript-estree@5.37.0": - version "5.37.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-5.37.0.tgz#956dcf5c98363bcb97bdd5463a0a86072ff79355" - integrity sha512-JkFoFIt/cx59iqEDSgIGnQpCTRv96MQnXCYvJi7QhBC24uyuzbD8wVbajMB1b9x4I0octYFJ3OwjAwNqk1AjDA== +"@typescript-eslint/typescript-estree@5.62.0": + version "5.62.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-5.62.0.tgz#7d17794b77fabcac615d6a48fb143330d962eb9b" + integrity sha512-CmcQ6uY7b9y694lKdRB8FEel7JbU/40iSAPomu++SjLMntB+2Leay2LO6i8VnJk58MtE9/nQSFIH6jpyRWyYzA== dependencies: - "@typescript-eslint/types" "5.37.0" - "@typescript-eslint/visitor-keys" "5.37.0" + "@typescript-eslint/types" "5.62.0" + "@typescript-eslint/visitor-keys" "5.62.0" debug "^4.3.4" globby "^11.1.0" is-glob "^4.0.3" semver "^7.3.7" tsutils "^3.21.0" -"@typescript-eslint/utils@5.37.0": - version "5.37.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-5.37.0.tgz#7784cb8e91390c4f90ccaffd24a0cf9874df81b2" - integrity sha512-jUEJoQrWbZhmikbcWSMDuUSxEE7ID2W/QCV/uz10WtQqfOuKZUqFGjqLJ+qhDd17rjgp+QJPqTdPIBWwoob2NQ== +"@typescript-eslint/utils@5.62.0": + version "5.62.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-5.62.0.tgz#141e809c71636e4a75daa39faed2fb5f4b10df86" + integrity sha512-n8oxjeb5aIbPFEtmQxQYOLI0i9n5ySBEY/ZEHHZqKQSFnxio1rv6dthascc9dLuwrL0RC5mPCxB7vnAVGAYWAQ== dependencies: + "@eslint-community/eslint-utils" "^4.2.0" "@types/json-schema" "^7.0.9" - "@typescript-eslint/scope-manager" "5.37.0" - "@typescript-eslint/types" "5.37.0" - "@typescript-eslint/typescript-estree" "5.37.0" + "@types/semver" "^7.3.12" + "@typescript-eslint/scope-manager" "5.62.0" + "@typescript-eslint/types" "5.62.0" + "@typescript-eslint/typescript-estree" "5.62.0" eslint-scope "^5.1.1" - eslint-utils "^3.0.0" + semver "^7.3.7" -"@typescript-eslint/visitor-keys@5.37.0": - version "5.37.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-5.37.0.tgz#7b72dd343295ea11e89b624995abc7103c554eee" - integrity sha512-Hp7rT4cENBPIzMwrlehLW/28EVCOcE9U1Z1BQTc8EA8v5qpr7GRGuG+U58V5tTY48zvUOA3KHvw3rA8tY9fbdA== +"@typescript-eslint/visitor-keys@5.62.0": + version "5.62.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-5.62.0.tgz#2174011917ce582875954ffe2f6912d5931e353e" + integrity sha512-07ny+LHRzQXepkGg6w0mFY41fVUNBrL2Roj/++7V1txKugfjm/Ci/qSND03r2RhlJhJYMcTn9AhhSSqQp0Ysyw== dependencies: - "@typescript-eslint/types" "5.37.0" + "@typescript-eslint/types" "5.62.0" eslint-visitor-keys "^3.3.0" -"@ungap/promise-all-settled@1.1.2": - version "1.1.2" - resolved "https://registry.yarnpkg.com/@ungap/promise-all-settled/-/promise-all-settled-1.1.2.tgz#aa58042711d6e3275dd37dc597e5d31e8c290a44" - integrity sha512-sL/cEvJWAnClXw0wHk85/2L0G6Sj8UB0Ctc1TEMbKSsmpRosqhwj9gWgFRZSrBr2f9tiXISwNhCPmlfqUqyb9Q== - "@yarnpkg/lockfile@^1.1.0": version "1.1.0" resolved "https://registry.yarnpkg.com/@yarnpkg/lockfile/-/lockfile-1.1.0.tgz#e77a97fbd345b76d83245edcd17d393b1b41fb31" @@ -1752,14 +1481,25 @@ abbrev@1: abbrev@1.0.x: version "1.0.9" resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.0.9.tgz#91b4792588a7738c25f35dd6f63752a2f8776135" - integrity sha1-kbR5JYinc4wl813W9jdSovh3YTU= + integrity sha512-LEyx4aLEC3x6T0UguF6YILf+ntvmOaWsVfENmIW0E9H09vKlLDGelMjjSm0jkDHALj8A8quZ/HapKNigzwge+Q== -abort-controller@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/abort-controller/-/abort-controller-3.0.0.tgz#eaf54d53b62bae4138e809ca225c8439a6efb392" - integrity sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg== +abortcontroller-polyfill@^1.7.3: + version "1.7.5" + resolved "https://registry.yarnpkg.com/abortcontroller-polyfill/-/abortcontroller-polyfill-1.7.5.tgz#6738495f4e901fbb57b6c0611d0c75f76c485bed" + integrity sha512-JMJ5soJWP18htbbxJjG7bG6yuI6pRhgJ0scHHTfkUjf6wjP912xZWvM+A4sJK3gqd9E8fcPbDnOefbA9Th/FIQ== + +abstract-level@^1.0.0, abstract-level@^1.0.2, abstract-level@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/abstract-level/-/abstract-level-1.0.3.tgz#78a67d3d84da55ee15201486ab44c09560070741" + integrity sha512-t6jv+xHy+VYwc4xqZMn2Pa9DjcdzvzZmQGRjTFc8spIbRGHgBrEKbPq+rYXc7CCo0lxgYvSgKVg9qZAhpVQSjA== dependencies: - event-target-shim "^5.0.0" + buffer "^6.0.3" + catering "^2.1.0" + is-buffer "^2.0.5" + level-supports "^4.0.0" + level-transcoder "^1.0.1" + module-error "^1.0.1" + queue-microtask "^1.2.3" abstract-leveldown@3.0.0: version "3.0.0" @@ -1782,17 +1522,6 @@ abstract-leveldown@^5.0.0, abstract-leveldown@~5.0.0: dependencies: xtend "~4.0.0" -abstract-leveldown@^6.2.1: - version "6.3.0" - resolved "https://registry.yarnpkg.com/abstract-leveldown/-/abstract-leveldown-6.3.0.tgz#d25221d1e6612f820c35963ba4bd739928f6026a" - integrity sha512-TU5nlYgta8YrBMNpc9FwQzRbiXsj49gsALsXadbGHt9CROPzX5fB0rWDR5mtdpOOKa5XqRFpbj1QroPAoPzVjQ== - dependencies: - buffer "^5.5.0" - immediate "^3.2.3" - level-concat-iterator "~2.0.0" - level-supports "~1.0.0" - xtend "~4.0.0" - abstract-leveldown@~2.6.0: version "2.6.3" resolved "https://registry.yarnpkg.com/abstract-leveldown/-/abstract-leveldown-2.6.3.tgz#1c5e8c6a5ef965ae8c35dfb3a8770c476b82c4b8" @@ -1800,17 +1529,6 @@ abstract-leveldown@~2.6.0: dependencies: xtend "~4.0.0" -abstract-leveldown@~6.2.1: - version "6.2.3" - resolved "https://registry.yarnpkg.com/abstract-leveldown/-/abstract-leveldown-6.2.3.tgz#036543d87e3710f2528e47040bc3261b77a9a8eb" - integrity sha512-BsLm5vFMRUrrLeCcRc+G0t2qOaTzpoJQLOubq2XM72eNpjF5UdU5o/5NvlNhx95XHcAvcl8OMXr4mlg/fRgUXQ== - dependencies: - buffer "^5.5.0" - immediate "^3.2.3" - level-concat-iterator "~2.0.0" - level-supports "~1.0.0" - xtend "~4.0.0" - accepts@~1.3.8: version "1.3.8" resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.3.8.tgz#0bf0be125b67014adcb0b0921e62db7bffe16b2e" @@ -1819,7 +1537,7 @@ accepts@~1.3.8: mime-types "~2.1.34" negotiator "0.6.3" -acorn-jsx@^5.0.0, acorn-jsx@^5.3.2: +acorn-jsx@^5.3.2: version "5.3.2" resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.3.2.tgz#7ed5bb55908b3b2f1bc55c6af1653bada7f07937" integrity sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ== @@ -1829,25 +1547,15 @@ acorn-walk@^8.1.1: resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-8.2.0.tgz#741210f2e2426454508853a2f44d0ab83b7f69c1" integrity sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA== -acorn@^6.0.7: - version "6.4.2" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-6.4.2.tgz#35866fd710528e92de10cf06016498e47e39e1e6" - integrity sha512-XtGIhXwF8YM8bJhGxG5kXgjkEuNGLTkoYqVE+KMR+aspr4KGYmKYg7yUe3KghyQ9yheNwLnjmzh/7+gfDBmHCQ== - -acorn@^8.4.1: - version "8.7.0" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.7.0.tgz#90951fde0f8f09df93549481e5fc141445b791cf" - integrity sha512-V/LGr1APy+PXIwKebEWrkZPwoeoF+w1jiOBUmuxuiUIaOHtob8Qc9BTrYo7VuI5fR8tqsy+buA2WFooR5olqvQ== - -acorn@^8.8.0: - version "8.8.0" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.8.0.tgz#88c0187620435c7f6015803f5539dae05a9dbea8" - integrity sha512-QOxyigPVrpZ2GXT+PFyZTl6TtOFc5egxHIP9IlQ+RbupQuX4RkT/Bee4/kQuC02Xkzg84JcT7oLYtDIQxp+v7w== +acorn@^8.4.1, acorn@^8.9.0: + version "8.10.0" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.10.0.tgz#8be5b3907a67221a81ab23c7889c4c5526b62ec5" + integrity sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw== address@^1.0.1: - version "1.1.2" - resolved "https://registry.yarnpkg.com/address/-/address-1.1.2.tgz#bf1116c9c758c51b7a933d296b72c221ed9428b6" - integrity sha512-aT6camzM4xEA54YVJYSqxz1kv4IHnQZRtThJJHhUMRExaU5spC7jX5ugSwTaTgJliIgs4VhZOk7htClvQ/LmRA== + version "1.2.2" + resolved "https://registry.yarnpkg.com/address/-/address-1.2.2.tgz#2b5248dac5485a6390532c6a517fda2e3faac89e" + integrity sha512-4B/qKCfeE/ODUaAUpSwfzazo5x29WD4r3vXiWsB7I2mSDAihwEqKO+g8GELZUQSSAo5e1XTYh3ZVfLyxBc12nA== adm-zip@^0.4.16: version "0.4.16" @@ -1857,7 +1565,7 @@ adm-zip@^0.4.16: aes-js@3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/aes-js/-/aes-js-3.0.0.tgz#e21df10ad6c2053295bcbb8dab40b09dbea87e4d" - integrity sha1-4h3xCtbCBTKVvLuNq0Cwnb6ofk0= + integrity sha512-H7wUZRn8WpTq9jocdxQ2c8x2sKo9ZVmzfRE13GiNJXfp7NcKYEdvl3vspKjXox6RIG2VtaRe4JFvxG4rqp2Zuw== aes-js@^3.1.1: version "3.1.2" @@ -1879,7 +1587,7 @@ aggregate-error@^3.0.0: clean-stack "^2.0.0" indent-string "^4.0.0" -ajv@^6.10.0, ajv@^6.10.2, ajv@^6.12.3, ajv@^6.12.4, ajv@^6.6.1, ajv@^6.9.1: +ajv@^6.12.3, ajv@^6.12.4, ajv@^6.12.6: version "6.12.6" resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.6.tgz#baf5a62e802b07d977034586f8c3baf5adf26df4" integrity sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g== @@ -1890,9 +1598,9 @@ ajv@^6.10.0, ajv@^6.10.2, ajv@^6.12.3, ajv@^6.12.4, ajv@^6.6.1, ajv@^6.9.1: uri-js "^4.2.2" ajv@^8.0.1: - version "8.11.0" - resolved "https://registry.yarnpkg.com/ajv/-/ajv-8.11.0.tgz#977e91dd96ca669f54a11e23e378e33b884a565f" - integrity sha512-wGgprdCvMalC0BztXvitD2hC04YffAvtsUn93JbGXYLAtCUO4xd17mCCZQxUOItiBwZvJScWo8NIvQMQ71rdpg== + version "8.12.0" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-8.12.0.tgz#d1a0527323e22f53562c567c00991577dfbe19d1" + integrity sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA== dependencies: fast-deep-equal "^3.1.1" json-schema-traverse "^1.0.0" @@ -1902,22 +1610,22 @@ ajv@^8.0.1: amdefine@>=0.0.4: version "1.0.1" resolved "https://registry.yarnpkg.com/amdefine/-/amdefine-1.0.1.tgz#4a5282ac164729e93619bcfd3ad151f817ce91f5" - integrity sha1-SlKCrBZHKek2Gbz9OtFR+BfOkfU= + integrity sha512-S2Hw0TtNkMJhIabBwIojKL9YHO5T0n5eNqWJ7Lrlel/zDbftQpxpapi8tZs3X1HWa+u+QeydGmzzNU0m09+Rcg== ansi-colors@3.2.3: version "3.2.3" resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-3.2.3.tgz#57d35b8686e851e2cc04c403f1c00203976a1813" integrity sha512-LEHHyuhlPY3TmuUYMh2oz89lTShfvgbmzaBcxve9t/9Wuy7Dwf4yoAKcND7KFT1HAQfqZ12qtc+DUrBMeKF9nw== -ansi-colors@4.1.1, ansi-colors@^4.1.1: +ansi-colors@4.1.1: version "4.1.1" resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-4.1.1.tgz#cbb9ae256bf750af1eab344f229aa27fe94ba348" integrity sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA== -ansi-escapes@^3.2.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-3.2.0.tgz#8780b98ff9dbf5638152d1f1fe5c1d7b4442976b" - integrity sha512-cBhpre4ma+U0T1oM5fXg7Dy1Jw7zzwv7lt/GoCpr+hDQJoYnKVPLL4dCvSEFMmQurOQvSrwT7SL/DAlhBI97RQ== +ansi-colors@^4.1.1: + version "4.1.3" + resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-4.1.3.tgz#37611340eb2243e70cc604cad35d63270d48781b" + integrity sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw== ansi-escapes@^4.3.0: version "4.3.2" @@ -1929,7 +1637,7 @@ ansi-escapes@^4.3.0: ansi-regex@^2.0.0: version "2.1.1" resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-2.1.1.tgz#c3b33ab5ee360d86e0e628f0468ae7ef27d654df" - integrity sha1-w7M6te42DYbg5ijwRorn7yfWVN8= + integrity sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA== ansi-regex@^3.0.0: version "3.0.1" @@ -1949,7 +1657,7 @@ ansi-regex@^5.0.1: ansi-styles@^2.2.1: version "2.2.1" resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-2.2.1.tgz#b432dd3358b634cf75e1e4664368240533c1ddbe" - integrity sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4= + integrity sha512-kmCevFghRiWM7HB5zTPULl4r9bVFSWjz62MhqizDGUrq2NWuNMQyuv4tHHoKJHs69M/MF64lEcHdYIocrdWQYA== ansi-styles@^3.2.0, ansi-styles@^3.2.1: version "3.2.1" @@ -1965,10 +1673,10 @@ ansi-styles@^4.0.0, ansi-styles@^4.1.0: dependencies: color-convert "^2.0.1" -antlr4@4.7.1: - version "4.7.1" - resolved "https://registry.yarnpkg.com/antlr4/-/antlr4-4.7.1.tgz#69984014f096e9e775f53dd9744bf994d8959773" - integrity sha512-haHyTW7Y9joE5MVs37P2lNYfU2RWBLfcRDD8OWldcdZm5TiCE91B5Xl1oWSwiDUSd4rlExpt2pu1fksYQjRBYQ== +antlr4@^4.11.0: + version "4.13.1" + resolved "https://registry.yarnpkg.com/antlr4/-/antlr4-4.13.1.tgz#1e0a1830a08faeb86217cb2e6c34716004e4253d" + integrity sha512-kiXTspaRYvnIArgE97z5YVVf/cDVQABr3abFRR6mE7yesLMkgu4ujuyV/sgxafQ8wgve0DJQUJ38Z8tkgA2izA== antlr4ts@^0.5.0-alpha.4: version "0.5.0-alpha.4" @@ -1976,9 +1684,9 @@ antlr4ts@^0.5.0-alpha.4: integrity sha512-WPQDt1B74OfPv/IMS2ekXAKkTZIHl88uMetg6q3OTqgFxZ/dxDXI0EWLyZid/1Pe6hTftyg5N7gel5wNAGxXyQ== anymatch@~3.1.1, anymatch@~3.1.2: - version "3.1.2" - resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.2.tgz#c0557c096af32f106198f4f4e2a383537e378716" - integrity sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg== + version "3.1.3" + resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.3.tgz#790c58b19ba1720a84205b57c618d5ad8524973e" + integrity sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw== dependencies: normalize-path "^3.0.0" picomatch "^2.0.4" @@ -2003,7 +1711,7 @@ argparse@^2.0.1: arr-diff@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/arr-diff/-/arr-diff-4.0.0.tgz#d6461074febfec71e7e15235761a329a5dc7c520" - integrity sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA= + integrity sha512-YVIQ82gZPGBebQV/a8dar4AitzCQs0jjXwMPZllpXMaGjXPYVUawSxQrRsjhjupyVxEvbHgUmIhKVlND+j02kA== arr-flatten@^1.1.0: version "1.1.0" @@ -2013,12 +1721,12 @@ arr-flatten@^1.1.0: arr-union@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/arr-union/-/arr-union-3.1.0.tgz#e39b09aea9def866a8f206e288af63919bae39c4" - integrity sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ= + integrity sha512-sKpyeERZ02v1FeCZT8lrfJq5u6goHCtpTAzPwJYe7c8SPFOboNjNg1vz2L4VTn9T4PQxEx13TbXLmYUcS6Ug7Q== array-back@^1.0.3, array-back@^1.0.4: version "1.0.4" resolved "https://registry.yarnpkg.com/array-back/-/array-back-1.0.4.tgz#644ba7f095f7ffcf7c43b5f0dc39d3c1f03c063b" - integrity sha1-ZEun8JX3/898Q7Xw3DnTwfA8Bjs= + integrity sha512-1WxbZvrmyhkNoeYcizokbmh5oiOCIfyvGtcqbK3Ls1v1fKcquzxnQSceOx6tzq7jmai2kFLWIpGND2cLhH6TPw== dependencies: typical "^2.6.0" @@ -2034,15 +1742,23 @@ array-back@^3.0.1, array-back@^3.1.0: resolved "https://registry.yarnpkg.com/array-back/-/array-back-3.1.0.tgz#b8859d7a508871c9a7b2cf42f99428f65e96bfb0" integrity sha512-TkuxA4UCOvxuDK6NZYXCalszEzj+TLszyASooky+i742l9TqsOdYCMJJupxRic61hwquNtppB3hgcuq9SVSH1Q== -array-back@^4.0.1: +array-back@^4.0.1, array-back@^4.0.2: version "4.0.2" resolved "https://registry.yarnpkg.com/array-back/-/array-back-4.0.2.tgz#8004e999a6274586beeb27342168652fdb89fa1e" integrity sha512-NbdMezxqf94cnNfWLL7V/im0Ub+Anbb0IoZhvzie8+4HJ4nMQuzHuy49FkGYCJK2yAloZ3meiB6AVMClbrI1vg== +array-buffer-byte-length@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/array-buffer-byte-length/-/array-buffer-byte-length-1.0.0.tgz#fabe8bc193fea865f317fe7807085ee0dee5aead" + integrity sha512-LPuwb2P+NrQw3XhxGc36+XSvuBPopovXYTR9Ew++Du9Yb/bx5AzBfrIsBoj0EZUifjQU+sHL21sseZ3jerWO/A== + dependencies: + call-bind "^1.0.2" + is-array-buffer "^3.0.1" + array-flatten@1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-1.1.1.tgz#9a5f699051b1e7073328f2a008968b64ea2955d2" - integrity sha1-ml9pkFGx5wczKPKgCJaLZOopVdI= + integrity sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg== array-union@^2.1.0: version "2.1.0" @@ -2052,17 +1768,41 @@ array-union@^2.1.0: array-uniq@1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/array-uniq/-/array-uniq-1.0.3.tgz#af6ac877a25cc7f74e058894753858dfdb24fdb6" - integrity sha1-r2rId6Jcx/dOBYiUdThY39sk/bY= + integrity sha512-MNha4BWQ6JbwhFhj03YK552f7cb3AzoE8SzeljgChvL1dl3IcvggXVz1DilzySZkCja+CXuZbdW7yATchWn8/Q== array-unique@^0.3.2: version "0.3.2" resolved "https://registry.yarnpkg.com/array-unique/-/array-unique-0.3.2.tgz#a894b75d4bc4f6cd679ef3244a9fd8f46ae2d428" - integrity sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg= + integrity sha512-SleRWjh9JUud2wH1hPs9rZBZ33H6T9HOiL0uwGnGx9FpE6wKGyfWugmbkEOIs6qWrZhg0LWeLziLrEwQJhs5mQ== + +array.prototype.reduce@^1.0.6: + version "1.0.6" + resolved "https://registry.yarnpkg.com/array.prototype.reduce/-/array.prototype.reduce-1.0.6.tgz#63149931808c5fc1e1354814923d92d45f7d96d5" + integrity sha512-UW+Mz8LG/sPSU8jRDCjVr6J/ZKAGpHfwrZ6kWTG5qCxIEiXdVshqGnu5vEZA8S1y6X4aCSbQZ0/EEsfvEvBiSg== + dependencies: + call-bind "^1.0.2" + define-properties "^1.2.0" + es-abstract "^1.22.1" + es-array-method-boxes-properly "^1.0.0" + is-string "^1.0.7" + +arraybuffer.prototype.slice@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.2.tgz#98bd561953e3e74bb34938e77647179dfe6e9f12" + integrity sha512-yMBKppFur/fbHu9/6USUe03bZ4knMYiwFBcyiaXB8Go0qNehwX6inYPzK9U0NeQvGxKthcmHcaR8P5MStSRBAw== + dependencies: + array-buffer-byte-length "^1.0.0" + call-bind "^1.0.2" + define-properties "^1.2.0" + es-abstract "^1.22.1" + get-intrinsic "^1.2.1" + is-array-buffer "^3.0.2" + is-shared-array-buffer "^1.0.2" asap@~2.0.6: version "2.0.6" resolved "https://registry.yarnpkg.com/asap/-/asap-2.0.6.tgz#e50347611d7e690943208bbdafebcbc2fb866d46" - integrity sha1-5QNHYR1+aQlDIIu9r+vLwvuGbUY= + integrity sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA== asn1.js@^5.2.0: version "5.4.1" @@ -2084,7 +1824,7 @@ asn1@~0.2.3: assert-plus@1.0.0, assert-plus@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/assert-plus/-/assert-plus-1.0.0.tgz#f12e0f3c5d77b0b1cdd9146942e4e96c1e4dd525" - integrity sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU= + integrity sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw== assertion-error@^1.1.0: version "1.1.0" @@ -2094,24 +1834,19 @@ assertion-error@^1.1.0: assign-symbols@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/assign-symbols/-/assign-symbols-1.0.0.tgz#59667f41fadd4f20ccbc2bb96b8d4f7f78ec0367" - integrity sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c= + integrity sha512-Q+JC7Whu8HhmTdBph/Tq59IoRtoy6KAm5zzPv00WdujX82lbAL8K7WVjne7vdCsAmbF4AYaDOPyO3k0kl8qIrw== -ast-parents@0.0.1: +ast-parents@^0.0.1: version "0.0.1" resolved "https://registry.yarnpkg.com/ast-parents/-/ast-parents-0.0.1.tgz#508fd0f05d0c48775d9eccda2e174423261e8dd3" - integrity sha1-UI/Q8F0MSHddnszaLhdEIyYejdM= - -astral-regex@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/astral-regex/-/astral-regex-1.0.0.tgz#6c8c3fb827dd43ee3918f27b82782ab7658a6fd9" - integrity sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg== + integrity sha512-XHusKxKz3zoYk1ic8Un640joHbFMhbqneyoZfoKnEGtf2ey9Uh/IdpcQplODdO/kENaMIWsD0nJm4+wX3UNLHA== astral-regex@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/astral-regex/-/astral-regex-2.0.0.tgz#483143c567aeed4785759c0865786dc77d7d2e31" integrity sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ== -async-eventemitter@^0.2.2, async-eventemitter@^0.2.4: +async-eventemitter@^0.2.2: version "0.2.4" resolved "https://registry.yarnpkg.com/async-eventemitter/-/async-eventemitter-0.2.4.tgz#f5e7c8ca7d3e46aab9ec40a292baf686a0bafaca" integrity sha512-pd20BwL7Yt1zwDFy+8MX8F1+WCT8aQeKj0kQnTrH9WaeRETlRamVhD0JtRPmrV4GfOJ2F9CvdQkZeZhnh2TuHw== @@ -2126,7 +1861,7 @@ async-limiter@~1.0.0: async@1.x, async@^1.4.2: version "1.5.2" resolved "https://registry.yarnpkg.com/async/-/async-1.5.2.tgz#ec6a61ae56480c0c3cb241c95618e20892f9672a" - integrity sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo= + integrity sha512-nSVgobk4rv61R9PUSDtYt7mPVB2olxNR5RWJcAsH676/ef11bUZwvu7+RGYrYauVdDPcO519v68wRhXQtxsV9w== async@2.6.2: version "2.6.2" @@ -2136,16 +1871,16 @@ async@2.6.2: lodash "^4.17.11" async@^2.0.1, async@^2.1.2, async@^2.4.0, async@^2.5.0, async@^2.6.1: - version "2.6.3" - resolved "https://registry.yarnpkg.com/async/-/async-2.6.3.tgz#d72625e2344a3656e3a3ad4fa749fa83299d82ff" - integrity sha512-zflvls11DCy+dQWzTW2dzuilv8Z5X/pjfmZOWba6TNIVDm+2UDaJmXSOXlasHKfNBs8oo3M0aT50fDEWfKZjXg== + version "2.6.4" + resolved "https://registry.yarnpkg.com/async/-/async-2.6.4.tgz#706b7ff6084664cd7eae713f6f965433b5504221" + integrity sha512-mzo5dfJYwAn29PeiJ0zvwTo04zj8HDJj0Mn8TD7sno7q12prdbnasKJHhkm2c1LgrhlJ0teaea8860oxi51mGA== dependencies: lodash "^4.17.14" asynckit@^0.4.0: version "0.4.0" resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" - integrity sha1-x57Zf380y48robyXkLzDZkdLS3k= + integrity sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q== at-least-node@^1.0.0: version "1.0.0" @@ -2165,12 +1900,12 @@ available-typed-arrays@^1.0.5: aws-sign2@~0.7.0: version "0.7.0" resolved "https://registry.yarnpkg.com/aws-sign2/-/aws-sign2-0.7.0.tgz#b46e890934a9591f2d2f6f86d7e6a9f1b3fe76a8" - integrity sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg= + integrity sha512-08kcGqnYf/YmjoRhfxyu+CLxBjUtHLXLXX/vUfx9l2LYzG3c1m61nrpyFUZI6zeS+Li/wWMMidD9KgrqtGq3mA== aws4@^1.8.0: - version "1.11.0" - resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.11.0.tgz#d61f46d83b2519250e2784daf5b09479a8b41c59" - integrity sha512-xh1Rl34h6Fi1DC2WWKfxUTVqRsNnr6LsKz2+hfwDxQJWmrx8+c7ylaqBMcHfl1U1r2dsifOvKX3LQuLNZ+XSvA== + version "1.12.0" + resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.12.0.tgz#ce1c9d143389679e253b314241ea9aa5cec980d3" + integrity sha512-NmWvPnx0F1SfrQbYwOi7OeaNGokp9XhzNioJ/CSBs8Qa4vxug81mhJEAVZwxXuBmYB5KDRfMq/F3RR0BIU7sWg== axios@^0.21.1: version "0.21.4" @@ -2190,7 +1925,7 @@ axios@^0.27.2: babel-code-frame@^6.26.0: version "6.26.0" resolved "https://registry.yarnpkg.com/babel-code-frame/-/babel-code-frame-6.26.0.tgz#63fd43f7dc1e3bb7ce35947db8fe369a3f58c74b" - integrity sha1-Y/1D99weO7fONZR9uP42mj9Yx0s= + integrity sha512-XqYMR2dfdGMW+hd0IUZ2PwK+fGeFkOxZJ0wY+JaQAHzt1Zx8LcvpiZD2NiGkEG8qx0CfkAOr5xt76d1e8vG90g== dependencies: chalk "^1.1.3" esutils "^2.0.2" @@ -2238,7 +1973,7 @@ babel-generator@^6.26.0: babel-helper-builder-binary-assignment-operator-visitor@^6.24.1: version "6.24.1" resolved "https://registry.yarnpkg.com/babel-helper-builder-binary-assignment-operator-visitor/-/babel-helper-builder-binary-assignment-operator-visitor-6.24.1.tgz#cce4517ada356f4220bcae8a02c2b346f9a56664" - integrity sha1-zORReto1b0IgvK6KAsKzRvmlZmQ= + integrity sha512-gCtfYORSG1fUMX4kKraymq607FWgMWg+j42IFPc18kFQEsmtaibP4UrqsXt8FlEJle25HUd4tsoDR7H2wDhe9Q== dependencies: babel-helper-explode-assignable-expression "^6.24.1" babel-runtime "^6.22.0" @@ -2247,7 +1982,7 @@ babel-helper-builder-binary-assignment-operator-visitor@^6.24.1: babel-helper-call-delegate@^6.24.1: version "6.24.1" resolved "https://registry.yarnpkg.com/babel-helper-call-delegate/-/babel-helper-call-delegate-6.24.1.tgz#ece6aacddc76e41c3461f88bfc575bd0daa2df8d" - integrity sha1-7Oaqzdx25Bw0YfiL/Fdb0Nqi340= + integrity sha512-RL8n2NiEj+kKztlrVJM9JT1cXzzAdvWFh76xh/H1I4nKwunzE4INBXn8ieCZ+wh4zWszZk7NBS1s/8HR5jDkzQ== dependencies: babel-helper-hoist-variables "^6.24.1" babel-runtime "^6.22.0" @@ -2257,7 +1992,7 @@ babel-helper-call-delegate@^6.24.1: babel-helper-define-map@^6.24.1: version "6.26.0" resolved "https://registry.yarnpkg.com/babel-helper-define-map/-/babel-helper-define-map-6.26.0.tgz#a5f56dab41a25f97ecb498c7ebaca9819f95be5f" - integrity sha1-pfVtq0GiX5fstJjH66ypgZ+Vvl8= + integrity sha512-bHkmjcC9lM1kmZcVpA5t2om2nzT/xiZpo6TJq7UlZ3wqKfzia4veeXbIhKvJXAMzhhEBd3cR1IElL5AenWEUpA== dependencies: babel-helper-function-name "^6.24.1" babel-runtime "^6.26.0" @@ -2267,7 +2002,7 @@ babel-helper-define-map@^6.24.1: babel-helper-explode-assignable-expression@^6.24.1: version "6.24.1" resolved "https://registry.yarnpkg.com/babel-helper-explode-assignable-expression/-/babel-helper-explode-assignable-expression-6.24.1.tgz#f25b82cf7dc10433c55f70592d5746400ac22caa" - integrity sha1-8luCz33BBDPFX3BZLVdGQArCLKo= + integrity sha512-qe5csbhbvq6ccry9G7tkXbzNtcDiH4r51rrPUbwwoTzZ18AqxWYRZT6AOmxrpxKnQBW0pYlBI/8vh73Z//78nQ== dependencies: babel-runtime "^6.22.0" babel-traverse "^6.24.1" @@ -2276,7 +2011,7 @@ babel-helper-explode-assignable-expression@^6.24.1: babel-helper-function-name@^6.24.1: version "6.24.1" resolved "https://registry.yarnpkg.com/babel-helper-function-name/-/babel-helper-function-name-6.24.1.tgz#d3475b8c03ed98242a25b48351ab18399d3580a9" - integrity sha1-00dbjAPtmCQqJbSDUasYOZ01gKk= + integrity sha512-Oo6+e2iX+o9eVvJ9Y5eKL5iryeRdsIkwRYheCuhYdVHsdEQysbc2z2QkqCLIYnNxkT5Ss3ggrHdXiDI7Dhrn4Q== dependencies: babel-helper-get-function-arity "^6.24.1" babel-runtime "^6.22.0" @@ -2287,7 +2022,7 @@ babel-helper-function-name@^6.24.1: babel-helper-get-function-arity@^6.24.1: version "6.24.1" resolved "https://registry.yarnpkg.com/babel-helper-get-function-arity/-/babel-helper-get-function-arity-6.24.1.tgz#8f7782aa93407c41d3aa50908f89b031b1b6853d" - integrity sha1-j3eCqpNAfEHTqlCQj4mwMbG2hT0= + integrity sha512-WfgKFX6swFB1jS2vo+DwivRN4NB8XUdM3ij0Y1gnC21y1tdBoe6xjVnd7NSI6alv+gZXCtJqvrTeMW3fR/c0ng== dependencies: babel-runtime "^6.22.0" babel-types "^6.24.1" @@ -2295,7 +2030,7 @@ babel-helper-get-function-arity@^6.24.1: babel-helper-hoist-variables@^6.24.1: version "6.24.1" resolved "https://registry.yarnpkg.com/babel-helper-hoist-variables/-/babel-helper-hoist-variables-6.24.1.tgz#1ecb27689c9d25513eadbc9914a73f5408be7a76" - integrity sha1-HssnaJydJVE+rbyZFKc/VAi+enY= + integrity sha512-zAYl3tqerLItvG5cKYw7f1SpvIxS9zi7ohyGHaI9cgDUjAT6YcY9jIEH5CstetP5wHIVSceXwNS7Z5BpJg+rOw== dependencies: babel-runtime "^6.22.0" babel-types "^6.24.1" @@ -2303,7 +2038,7 @@ babel-helper-hoist-variables@^6.24.1: babel-helper-optimise-call-expression@^6.24.1: version "6.24.1" resolved "https://registry.yarnpkg.com/babel-helper-optimise-call-expression/-/babel-helper-optimise-call-expression-6.24.1.tgz#f7a13427ba9f73f8f4fa993c54a97882d1244257" - integrity sha1-96E0J7qfc/j0+pk8VKl4gtEkQlc= + integrity sha512-Op9IhEaxhbRT8MDXx2iNuMgciu2V8lDvYCNQbDGjdBNCjaMvyLf4wl4A3b8IgndCyQF8TwfgsQ8T3VD8aX1/pA== dependencies: babel-runtime "^6.22.0" babel-types "^6.24.1" @@ -2311,7 +2046,7 @@ babel-helper-optimise-call-expression@^6.24.1: babel-helper-regex@^6.24.1: version "6.26.0" resolved "https://registry.yarnpkg.com/babel-helper-regex/-/babel-helper-regex-6.26.0.tgz#325c59f902f82f24b74faceed0363954f6495e72" - integrity sha1-MlxZ+QL4LyS3T6zu0DY5VPZJXnI= + integrity sha512-VlPiWmqmGJp0x0oK27Out1D+71nVVCTSdlbhIVoaBAj2lUgrNjBCRR9+llO4lTSb2O4r7PJg+RobRkhBrf6ofg== dependencies: babel-runtime "^6.26.0" babel-types "^6.26.0" @@ -2320,7 +2055,7 @@ babel-helper-regex@^6.24.1: babel-helper-remap-async-to-generator@^6.24.1: version "6.24.1" resolved "https://registry.yarnpkg.com/babel-helper-remap-async-to-generator/-/babel-helper-remap-async-to-generator-6.24.1.tgz#5ec581827ad723fecdd381f1c928390676e4551b" - integrity sha1-XsWBgnrXI/7N04HxySg5BnbkVRs= + integrity sha512-RYqaPD0mQyQIFRu7Ho5wE2yvA/5jxqCIj/Lv4BXNq23mHYu/vxikOy2JueLiBxQknwapwrJeNCesvY0ZcfnlHg== dependencies: babel-helper-function-name "^6.24.1" babel-runtime "^6.22.0" @@ -2331,7 +2066,7 @@ babel-helper-remap-async-to-generator@^6.24.1: babel-helper-replace-supers@^6.24.1: version "6.24.1" resolved "https://registry.yarnpkg.com/babel-helper-replace-supers/-/babel-helper-replace-supers-6.24.1.tgz#bf6dbfe43938d17369a213ca8a8bf74b6a90ab1a" - integrity sha1-v22/5Dk40XNpohPKiov3S2qQqxo= + integrity sha512-sLI+u7sXJh6+ToqDr57Bv973kCepItDhMou0xCP2YPVmR1jkHSCY+p1no8xErbV1Siz5QE8qKT1WIwybSWlqjw== dependencies: babel-helper-optimise-call-expression "^6.24.1" babel-messages "^6.23.0" @@ -2343,7 +2078,7 @@ babel-helper-replace-supers@^6.24.1: babel-helpers@^6.24.1: version "6.24.1" resolved "https://registry.yarnpkg.com/babel-helpers/-/babel-helpers-6.24.1.tgz#3471de9caec388e5c850e597e58a26ddf37602b2" - integrity sha1-NHHenK7DiOXIUOWX5Yom3fN2ArI= + integrity sha512-n7pFrqQm44TCYvrCDb0MqabAF+JUBq+ijBvNMUxpkLjJaAu32faIexewMumrH5KLLJ1HDyT0PTEqRyAe/GwwuQ== dependencies: babel-runtime "^6.22.0" babel-template "^6.24.1" @@ -2351,36 +2086,36 @@ babel-helpers@^6.24.1: babel-messages@^6.23.0: version "6.23.0" resolved "https://registry.yarnpkg.com/babel-messages/-/babel-messages-6.23.0.tgz#f3cdf4703858035b2a2951c6ec5edf6c62f2630e" - integrity sha1-8830cDhYA1sqKVHG7F7fbGLyYw4= + integrity sha512-Bl3ZiA+LjqaMtNYopA9TYE9HP1tQ+E5dLxE0XrAzcIJeK2UqF0/EaqXwBn9esd4UmTfEab+P+UYQ1GnioFIb/w== dependencies: babel-runtime "^6.22.0" babel-plugin-check-es2015-constants@^6.22.0: version "6.22.0" resolved "https://registry.yarnpkg.com/babel-plugin-check-es2015-constants/-/babel-plugin-check-es2015-constants-6.22.0.tgz#35157b101426fd2ffd3da3f75c7d1e91835bbf8a" - integrity sha1-NRV7EBQm/S/9PaP3XH0ekYNbv4o= + integrity sha512-B1M5KBP29248dViEo1owyY32lk1ZSH2DaNNrXLGt8lyjjHm7pBqAdQ7VKUPR6EEDO323+OvT3MQXbCin8ooWdA== dependencies: babel-runtime "^6.22.0" babel-plugin-syntax-async-functions@^6.8.0: version "6.13.0" resolved "https://registry.yarnpkg.com/babel-plugin-syntax-async-functions/-/babel-plugin-syntax-async-functions-6.13.0.tgz#cad9cad1191b5ad634bf30ae0872391e0647be95" - integrity sha1-ytnK0RkbWtY0vzCuCHI5HgZHvpU= + integrity sha512-4Zp4unmHgw30A1eWI5EpACji2qMocisdXhAftfhXoSV9j0Tvj6nRFE3tOmRY912E0FMRm/L5xWE7MGVT2FoLnw== babel-plugin-syntax-exponentiation-operator@^6.8.0: version "6.13.0" resolved "https://registry.yarnpkg.com/babel-plugin-syntax-exponentiation-operator/-/babel-plugin-syntax-exponentiation-operator-6.13.0.tgz#9ee7e8337290da95288201a6a57f4170317830de" - integrity sha1-nufoM3KQ2pUoggGmpX9BcDF4MN4= + integrity sha512-Z/flU+T9ta0aIEKl1tGEmN/pZiI1uXmCiGFRegKacQfEJzp7iNsKloZmyJlQr+75FCJtiFfGIK03SiCvCt9cPQ== babel-plugin-syntax-trailing-function-commas@^6.22.0: version "6.22.0" resolved "https://registry.yarnpkg.com/babel-plugin-syntax-trailing-function-commas/-/babel-plugin-syntax-trailing-function-commas-6.22.0.tgz#ba0360937f8d06e40180a43fe0d5616fff532cf3" - integrity sha1-ugNgk3+NBuQBgKQ/4NVhb/9TLPM= + integrity sha512-Gx9CH3Q/3GKbhs07Bszw5fPTlU+ygrOGfAhEt7W2JICwufpC4SuO0mG0+4NykPBSYPMJhqvVlDBU17qB1D+hMQ== babel-plugin-transform-async-to-generator@^6.22.0: version "6.24.1" resolved "https://registry.yarnpkg.com/babel-plugin-transform-async-to-generator/-/babel-plugin-transform-async-to-generator-6.24.1.tgz#6536e378aff6cb1d5517ac0e40eb3e9fc8d08761" - integrity sha1-ZTbjeK/2yx1VF6wOQOs+n8jQh2E= + integrity sha512-7BgYJujNCg0Ti3x0c/DL3tStvnKS6ktIYOmo9wginv/dfZOrbSZ+qG4IRRHMBOzZ5Awb1skTiAsQXg/+IWkZYw== dependencies: babel-helper-remap-async-to-generator "^6.24.1" babel-plugin-syntax-async-functions "^6.8.0" @@ -2389,21 +2124,21 @@ babel-plugin-transform-async-to-generator@^6.22.0: babel-plugin-transform-es2015-arrow-functions@^6.22.0: version "6.22.0" resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-arrow-functions/-/babel-plugin-transform-es2015-arrow-functions-6.22.0.tgz#452692cb711d5f79dc7f85e440ce41b9f244d221" - integrity sha1-RSaSy3EdX3ncf4XkQM5BufJE0iE= + integrity sha512-PCqwwzODXW7JMrzu+yZIaYbPQSKjDTAsNNlK2l5Gg9g4rz2VzLnZsStvp/3c46GfXpwkyufb3NCyG9+50FF1Vg== dependencies: babel-runtime "^6.22.0" babel-plugin-transform-es2015-block-scoped-functions@^6.22.0: version "6.22.0" resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-block-scoped-functions/-/babel-plugin-transform-es2015-block-scoped-functions-6.22.0.tgz#bbc51b49f964d70cb8d8e0b94e820246ce3a6141" - integrity sha1-u8UbSflk1wy42OC5ToICRs46YUE= + integrity sha512-2+ujAT2UMBzYFm7tidUsYh+ZoIutxJ3pN9IYrF1/H6dCKtECfhmB8UkHVpyxDwkj0CYbQG35ykoz925TUnBc3A== dependencies: babel-runtime "^6.22.0" babel-plugin-transform-es2015-block-scoping@^6.23.0: version "6.26.0" resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-block-scoping/-/babel-plugin-transform-es2015-block-scoping-6.26.0.tgz#d70f5299c1308d05c12f463813b0a09e73b1895f" - integrity sha1-1w9SmcEwjQXBL0Y4E7CgnnOxiV8= + integrity sha512-YiN6sFAQ5lML8JjCmr7uerS5Yc/EMbgg9G8ZNmk2E3nYX4ckHR01wrkeeMijEf5WHNK5TW0Sl0Uu3pv3EdOJWw== dependencies: babel-runtime "^6.26.0" babel-template "^6.26.0" @@ -2414,7 +2149,7 @@ babel-plugin-transform-es2015-block-scoping@^6.23.0: babel-plugin-transform-es2015-classes@^6.23.0: version "6.24.1" resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-classes/-/babel-plugin-transform-es2015-classes-6.24.1.tgz#5a4c58a50c9c9461e564b4b2a3bfabc97a2584db" - integrity sha1-WkxYpQyclGHlZLSyo7+ryXolhNs= + integrity sha512-5Dy7ZbRinGrNtmWpquZKZ3EGY8sDgIVB4CU8Om8q8tnMLrD/m94cKglVcHps0BCTdZ0TJeeAWOq2TK9MIY6cag== dependencies: babel-helper-define-map "^6.24.1" babel-helper-function-name "^6.24.1" @@ -2429,7 +2164,7 @@ babel-plugin-transform-es2015-classes@^6.23.0: babel-plugin-transform-es2015-computed-properties@^6.22.0: version "6.24.1" resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-computed-properties/-/babel-plugin-transform-es2015-computed-properties-6.24.1.tgz#6fe2a8d16895d5634f4cd999b6d3480a308159b3" - integrity sha1-b+Ko0WiV1WNPTNmZttNICjCBWbM= + integrity sha512-C/uAv4ktFP/Hmh01gMTvYvICrKze0XVX9f2PdIXuriCSvUmV9j+u+BB9f5fJK3+878yMK6dkdcq+Ymr9mrcLzw== dependencies: babel-runtime "^6.22.0" babel-template "^6.24.1" @@ -2437,14 +2172,14 @@ babel-plugin-transform-es2015-computed-properties@^6.22.0: babel-plugin-transform-es2015-destructuring@^6.23.0: version "6.23.0" resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-destructuring/-/babel-plugin-transform-es2015-destructuring-6.23.0.tgz#997bb1f1ab967f682d2b0876fe358d60e765c56d" - integrity sha1-mXux8auWf2gtKwh2/jWNYOdlxW0= + integrity sha512-aNv/GDAW0j/f4Uy1OEPZn1mqD+Nfy9viFGBfQ5bZyT35YqOiqx7/tXdyfZkJ1sC21NyEsBdfDY6PYmLHF4r5iA== dependencies: babel-runtime "^6.22.0" babel-plugin-transform-es2015-duplicate-keys@^6.22.0: version "6.24.1" resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-duplicate-keys/-/babel-plugin-transform-es2015-duplicate-keys-6.24.1.tgz#73eb3d310ca969e3ef9ec91c53741a6f1576423e" - integrity sha1-c+s9MQypaePvnskcU3QabxV2Qj4= + integrity sha512-ossocTuPOssfxO2h+Z3/Ea1Vo1wWx31Uqy9vIiJusOP4TbF7tPs9U0sJ9pX9OJPf4lXRGj5+6Gkl/HHKiAP5ug== dependencies: babel-runtime "^6.22.0" babel-types "^6.24.1" @@ -2452,14 +2187,14 @@ babel-plugin-transform-es2015-duplicate-keys@^6.22.0: babel-plugin-transform-es2015-for-of@^6.23.0: version "6.23.0" resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-for-of/-/babel-plugin-transform-es2015-for-of-6.23.0.tgz#f47c95b2b613df1d3ecc2fdb7573623c75248691" - integrity sha1-9HyVsrYT3x0+zC/bdXNiPHUkhpE= + integrity sha512-DLuRwoygCoXx+YfxHLkVx5/NpeSbVwfoTeBykpJK7JhYWlL/O8hgAK/reforUnZDlxasOrVPPJVI/guE3dCwkw== dependencies: babel-runtime "^6.22.0" babel-plugin-transform-es2015-function-name@^6.22.0: version "6.24.1" resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-function-name/-/babel-plugin-transform-es2015-function-name-6.24.1.tgz#834c89853bc36b1af0f3a4c5dbaa94fd8eacaa8b" - integrity sha1-g0yJhTvDaxrw86TF26qU/Y6sqos= + integrity sha512-iFp5KIcorf11iBqu/y/a7DK3MN5di3pNCzto61FqCNnUX4qeBwcV1SLqe10oXNnCaxBUImX3SckX2/o1nsrTcg== dependencies: babel-helper-function-name "^6.24.1" babel-runtime "^6.22.0" @@ -2468,14 +2203,14 @@ babel-plugin-transform-es2015-function-name@^6.22.0: babel-plugin-transform-es2015-literals@^6.22.0: version "6.22.0" resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-literals/-/babel-plugin-transform-es2015-literals-6.22.0.tgz#4f54a02d6cd66cf915280019a31d31925377ca2e" - integrity sha1-T1SgLWzWbPkVKAAZox0xklN3yi4= + integrity sha512-tjFl0cwMPpDYyoqYA9li1/7mGFit39XiNX5DKC/uCNjBctMxyL1/PT/l4rSlbvBG1pOKI88STRdUsWXB3/Q9hQ== dependencies: babel-runtime "^6.22.0" babel-plugin-transform-es2015-modules-amd@^6.22.0, babel-plugin-transform-es2015-modules-amd@^6.24.1: version "6.24.1" resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-amd/-/babel-plugin-transform-es2015-modules-amd-6.24.1.tgz#3b3e54017239842d6d19c3011c4bd2f00a00d154" - integrity sha1-Oz5UAXI5hC1tGcMBHEvS8AoA0VQ= + integrity sha512-LnIIdGWIKdw7zwckqx+eGjcS8/cl8D74A3BpJbGjKTFFNJSMrjN4bIh22HY1AlkUbeLG6X6OZj56BDvWD+OeFA== dependencies: babel-plugin-transform-es2015-modules-commonjs "^6.24.1" babel-runtime "^6.22.0" @@ -2494,7 +2229,7 @@ babel-plugin-transform-es2015-modules-commonjs@^6.23.0, babel-plugin-transform-e babel-plugin-transform-es2015-modules-systemjs@^6.23.0: version "6.24.1" resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-systemjs/-/babel-plugin-transform-es2015-modules-systemjs-6.24.1.tgz#ff89a142b9119a906195f5f106ecf305d9407d23" - integrity sha1-/4mhQrkRmpBhlfXxBuzzBdlAfSM= + integrity sha512-ONFIPsq8y4bls5PPsAWYXH/21Hqv64TBxdje0FvU3MhIV6QM2j5YS7KvAzg/nTIVLot2D2fmFQrFWCbgHlFEjg== dependencies: babel-helper-hoist-variables "^6.24.1" babel-runtime "^6.22.0" @@ -2503,7 +2238,7 @@ babel-plugin-transform-es2015-modules-systemjs@^6.23.0: babel-plugin-transform-es2015-modules-umd@^6.23.0: version "6.24.1" resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-umd/-/babel-plugin-transform-es2015-modules-umd-6.24.1.tgz#ac997e6285cd18ed6176adb607d602344ad38468" - integrity sha1-rJl+YoXNGO1hdq22B9YCNErThGg= + integrity sha512-LpVbiT9CLsuAIp3IG0tfbVo81QIhn6pE8xBJ7XSeCtFlMltuar5VuBV6y6Q45tpui9QWcy5i0vLQfCfrnF7Kiw== dependencies: babel-plugin-transform-es2015-modules-amd "^6.24.1" babel-runtime "^6.22.0" @@ -2512,7 +2247,7 @@ babel-plugin-transform-es2015-modules-umd@^6.23.0: babel-plugin-transform-es2015-object-super@^6.22.0: version "6.24.1" resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-object-super/-/babel-plugin-transform-es2015-object-super-6.24.1.tgz#24cef69ae21cb83a7f8603dad021f572eb278f8d" - integrity sha1-JM72muIcuDp/hgPa0CH1cusnj40= + integrity sha512-8G5hpZMecb53vpD3mjs64NhI1au24TAmokQ4B+TBFBjN9cVoGoOvotdrMMRmHvVZUEvqGUPWL514woru1ChZMA== dependencies: babel-helper-replace-supers "^6.24.1" babel-runtime "^6.22.0" @@ -2520,7 +2255,7 @@ babel-plugin-transform-es2015-object-super@^6.22.0: babel-plugin-transform-es2015-parameters@^6.23.0: version "6.24.1" resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-parameters/-/babel-plugin-transform-es2015-parameters-6.24.1.tgz#57ac351ab49caf14a97cd13b09f66fdf0a625f2b" - integrity sha1-V6w1GrScrxSpfNE7CfZv3wpiXys= + integrity sha512-8HxlW+BB5HqniD+nLkQ4xSAVq3bR/pcYW9IigY+2y0dI+Y7INFeTbfAQr+63T3E4UDsZGjyb+l9txUnABWxlOQ== dependencies: babel-helper-call-delegate "^6.24.1" babel-helper-get-function-arity "^6.24.1" @@ -2532,7 +2267,7 @@ babel-plugin-transform-es2015-parameters@^6.23.0: babel-plugin-transform-es2015-shorthand-properties@^6.22.0: version "6.24.1" resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-shorthand-properties/-/babel-plugin-transform-es2015-shorthand-properties-6.24.1.tgz#24f875d6721c87661bbd99a4622e51f14de38aa0" - integrity sha1-JPh11nIch2YbvZmkYi5R8U3jiqA= + integrity sha512-mDdocSfUVm1/7Jw/FIRNw9vPrBQNePy6wZJlR8HAUBLybNp1w/6lr6zZ2pjMShee65t/ybR5pT8ulkLzD1xwiw== dependencies: babel-runtime "^6.22.0" babel-types "^6.24.1" @@ -2540,14 +2275,14 @@ babel-plugin-transform-es2015-shorthand-properties@^6.22.0: babel-plugin-transform-es2015-spread@^6.22.0: version "6.22.0" resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-spread/-/babel-plugin-transform-es2015-spread-6.22.0.tgz#d6d68a99f89aedc4536c81a542e8dd9f1746f8d1" - integrity sha1-1taKmfia7cRTbIGlQujdnxdG+NE= + integrity sha512-3Ghhi26r4l3d0Js933E5+IhHwk0A1yiutj9gwvzmFbVV0sPMYk2lekhOufHBswX7NCoSeF4Xrl3sCIuSIa+zOg== dependencies: babel-runtime "^6.22.0" babel-plugin-transform-es2015-sticky-regex@^6.22.0: version "6.24.1" resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-sticky-regex/-/babel-plugin-transform-es2015-sticky-regex-6.24.1.tgz#00c1cdb1aca71112cdf0cf6126c2ed6b457ccdbc" - integrity sha1-AMHNsaynERLN8M9hJsLta0V8zbw= + integrity sha512-CYP359ADryTo3pCsH0oxRo/0yn6UsEZLqYohHmvLQdfS9xkf+MbCzE3/Kolw9OYIY4ZMilH25z/5CbQbwDD+lQ== dependencies: babel-helper-regex "^6.24.1" babel-runtime "^6.22.0" @@ -2556,21 +2291,21 @@ babel-plugin-transform-es2015-sticky-regex@^6.22.0: babel-plugin-transform-es2015-template-literals@^6.22.0: version "6.22.0" resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-template-literals/-/babel-plugin-transform-es2015-template-literals-6.22.0.tgz#a84b3450f7e9f8f1f6839d6d687da84bb1236d8d" - integrity sha1-qEs0UPfp+PH2g51taH2oS7EjbY0= + integrity sha512-x8b9W0ngnKzDMHimVtTfn5ryimars1ByTqsfBDwAqLibmuuQY6pgBQi5z1ErIsUOWBdw1bW9FSz5RZUojM4apg== dependencies: babel-runtime "^6.22.0" babel-plugin-transform-es2015-typeof-symbol@^6.23.0: version "6.23.0" resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-typeof-symbol/-/babel-plugin-transform-es2015-typeof-symbol-6.23.0.tgz#dec09f1cddff94b52ac73d505c84df59dcceb372" - integrity sha1-3sCfHN3/lLUqxz1QXITfWdzOs3I= + integrity sha512-fz6J2Sf4gYN6gWgRZaoFXmq93X+Li/8vf+fb0sGDVtdeWvxC9y5/bTD7bvfWMEq6zetGEHpWjtzRGSugt5kNqw== dependencies: babel-runtime "^6.22.0" babel-plugin-transform-es2015-unicode-regex@^6.22.0: version "6.24.1" resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-unicode-regex/-/babel-plugin-transform-es2015-unicode-regex-6.24.1.tgz#d38b12f42ea7323f729387f18a7c5ae1faeb35e9" - integrity sha1-04sS9C6nMj9yk4fxinxa4frrNek= + integrity sha512-v61Dbbihf5XxnYjtBN04B/JBvsScY37R1cZT5r9permN1cp+b70DY3Ib3fIkgn1DI9U3tGgBJZVD8p/mE/4JbQ== dependencies: babel-helper-regex "^6.24.1" babel-runtime "^6.22.0" @@ -2579,7 +2314,7 @@ babel-plugin-transform-es2015-unicode-regex@^6.22.0: babel-plugin-transform-exponentiation-operator@^6.22.0: version "6.24.1" resolved "https://registry.yarnpkg.com/babel-plugin-transform-exponentiation-operator/-/babel-plugin-transform-exponentiation-operator-6.24.1.tgz#2ab0c9c7f3098fa48907772bb813fe41e8de3a0e" - integrity sha1-KrDJx/MJj6SJB3cruBP+QejeOg4= + integrity sha512-LzXDmbMkklvNhprr20//RStKVcT8Cu+SQtX18eMHLhjHf2yFzwtQ0S2f0jQ+89rokoNdmwoSqYzAhq86FxlLSQ== dependencies: babel-helper-builder-binary-assignment-operator-visitor "^6.24.1" babel-plugin-syntax-exponentiation-operator "^6.8.0" @@ -2588,14 +2323,14 @@ babel-plugin-transform-exponentiation-operator@^6.22.0: babel-plugin-transform-regenerator@^6.22.0: version "6.26.0" resolved "https://registry.yarnpkg.com/babel-plugin-transform-regenerator/-/babel-plugin-transform-regenerator-6.26.0.tgz#e0703696fbde27f0a3efcacf8b4dca2f7b3a8f2f" - integrity sha1-4HA2lvveJ/Cj78rPi03KL3s6jy8= + integrity sha512-LS+dBkUGlNR15/5WHKe/8Neawx663qttS6AGqoOUhICc9d1KciBvtrQSuc0PI+CxQ2Q/S1aKuJ+u64GtLdcEZg== dependencies: regenerator-transform "^0.10.0" babel-plugin-transform-strict-mode@^6.24.1: version "6.24.1" resolved "https://registry.yarnpkg.com/babel-plugin-transform-strict-mode/-/babel-plugin-transform-strict-mode-6.24.1.tgz#d5faf7aa578a65bbe591cf5edae04a0c67020758" - integrity sha1-1fr3qleKZbvlkc9e2uBKDGcCB1g= + integrity sha512-j3KtSpjyLSJxNoCDrhwiJad8kw0gJ9REGj8/CqL0HeRyLnvUNYV9zcqluL6QJSXh3nfsLEmSLvwRfGzrgR96Pw== dependencies: babel-runtime "^6.22.0" babel-types "^6.24.1" @@ -2639,7 +2374,7 @@ babel-preset-env@^1.7.0: babel-register@^6.26.0: version "6.26.0" resolved "https://registry.yarnpkg.com/babel-register/-/babel-register-6.26.0.tgz#6ed021173e2fcb486d7acb45c6009a856f647071" - integrity sha1-btAhFz4vy0htestFxgCahW9kcHE= + integrity sha512-veliHlHX06wjaeY8xNITbveXSiI+ASFnOqvne/LaIJIqOWi2Ogmj91KOugEz/hoh/fwMhXNBJPCv8Xaz5CyM4A== dependencies: babel-core "^6.26.0" babel-runtime "^6.26.0" @@ -2652,7 +2387,7 @@ babel-register@^6.26.0: babel-runtime@^6.18.0, babel-runtime@^6.22.0, babel-runtime@^6.26.0: version "6.26.0" resolved "https://registry.yarnpkg.com/babel-runtime/-/babel-runtime-6.26.0.tgz#965c7058668e82b55d7bfe04ff2337bc8b5647fe" - integrity sha1-llxwWGaOgrVde/4E/yM3vItWR/4= + integrity sha512-ITKNuq2wKlW1fJg9sSW52eepoYgZBggvOAHC0u/CYu/qxQ9EVzThCgR69BnSXLHjy2f7SY5zaQ4yt7H9ZVxY2g== dependencies: core-js "^2.4.0" regenerator-runtime "^0.11.0" @@ -2660,7 +2395,7 @@ babel-runtime@^6.18.0, babel-runtime@^6.22.0, babel-runtime@^6.26.0: babel-template@^6.24.1, babel-template@^6.26.0: version "6.26.0" resolved "https://registry.yarnpkg.com/babel-template/-/babel-template-6.26.0.tgz#de03e2d16396b069f46dd9fff8521fb1a0e35e02" - integrity sha1-3gPi0WOWsGn0bdn/+FIfsaDjXgI= + integrity sha512-PCOcLFW7/eazGUKIoqH97sO9A2UYMahsn/yRQ7uOk37iutwjq7ODtcTNF+iFDSHNfkctqsLRjLP7URnOx0T1fg== dependencies: babel-runtime "^6.26.0" babel-traverse "^6.26.0" @@ -2671,7 +2406,7 @@ babel-template@^6.24.1, babel-template@^6.26.0: babel-traverse@^6.24.1, babel-traverse@^6.26.0: version "6.26.0" resolved "https://registry.yarnpkg.com/babel-traverse/-/babel-traverse-6.26.0.tgz#46a9cbd7edcc62c8e5c064e2d2d8d0f4035766ee" - integrity sha1-RqnL1+3MYsjlwGTi0tjQ9ANXZu4= + integrity sha512-iSxeXx7apsjCHe9c7n8VtRXGzI2Bk1rBSOJgCCjfyXb6v1aCqE1KSEpq/8SXuVN8Ka/Rh1WDTF0MDzkvTA4MIA== dependencies: babel-code-frame "^6.26.0" babel-messages "^6.23.0" @@ -2686,7 +2421,7 @@ babel-traverse@^6.24.1, babel-traverse@^6.26.0: babel-types@^6.19.0, babel-types@^6.24.1, babel-types@^6.26.0: version "6.26.0" resolved "https://registry.yarnpkg.com/babel-types/-/babel-types-6.26.0.tgz#a3b073f94ab49eb6fa55cd65227a334380632497" - integrity sha1-o7Bz+Uq0nrb6Vc1lInozQ4BjJJc= + integrity sha512-zhe3V/26rCWsEZK8kZN+HaQj5yQ1CilTObixFzKW1UWjqG7618Twz6YEsCnjfg5gBcJh02DrpCkS9h98ZqDY+g== dependencies: babel-runtime "^6.26.0" esutils "^2.0.2" @@ -2696,7 +2431,7 @@ babel-types@^6.19.0, babel-types@^6.24.1, babel-types@^6.26.0: babelify@^7.3.0: version "7.3.0" resolved "https://registry.yarnpkg.com/babelify/-/babelify-7.3.0.tgz#aa56aede7067fd7bd549666ee16dc285087e88e5" - integrity sha1-qlau3nBn/XvVSWZu4W3ChQh+iOU= + integrity sha512-vID8Fz6pPN5pJMdlUnNFSfrlcx5MUule4k9aKs/zbZPyXxMTcRrB0M4Tarw22L8afr8eYSWxDPYCob3TdrqtlA== dependencies: babel-core "^6.0.14" object-assign "^4.0.0" @@ -2709,7 +2444,7 @@ babylon@^6.18.0: backoff@^2.5.0: version "2.5.0" resolved "https://registry.yarnpkg.com/backoff/-/backoff-2.5.0.tgz#f616eda9d3e4b66b8ca7fca79f695722c5f8e26f" - integrity sha1-9hbtqdPktmuMp/ynn2lXIsX44m8= + integrity sha512-wC5ihrnUXmR2douXmXLCe5O3zg3GKIyvRi/hi58a/XyRxVI+3/yM0PYueQOZXPXQ9pxBislYkw+sF9b7C/RuMA== dependencies: precond "0.2" @@ -2746,7 +2481,7 @@ base@^0.11.1: bcrypt-pbkdf@^1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz#a4301d389b6a43f9b67ff3ca11a3f6637e360e9e" - integrity sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4= + integrity sha512-qeFIXtP4MSoi6NLqO12WfqARWWuCKi2Rn/9hJLEmtB5yTNr9DqFWkJRCf2qShWzPeAMRnOgCrq0sg/KLv5ES9w== dependencies: tweetnacl "^0.14.3" @@ -2755,15 +2490,15 @@ bech32@1.1.4: resolved "https://registry.yarnpkg.com/bech32/-/bech32-1.1.4.tgz#e38c9f37bf179b8eb16ae3a772b40c356d4832e9" integrity sha512-s0IrSOzLlbvX7yp4WBfPITzpAU8sqQcpsmwXDiKwrG4r491vwCO/XpejasRNl0piBMe/DvP4Tz0mIS/X1DPJBQ== -bignumber.js@^9.0.0: - version "9.0.2" - resolved "https://registry.yarnpkg.com/bignumber.js/-/bignumber.js-9.0.2.tgz#71c6c6bed38de64e24a65ebe16cfcf23ae693673" - integrity sha512-GAcQvbpsM0pUb0zw1EI0KhQEZ+lRwR5fYaAp3vPOYuP7aDvGy6cVN6XHLauvF8SOga2y0dcLcjt3iQDTSEliyw== +bigint-crypto-utils@^3.0.23: + version "3.3.0" + resolved "https://registry.yarnpkg.com/bigint-crypto-utils/-/bigint-crypto-utils-3.3.0.tgz#72ad00ae91062cf07f2b1def9594006c279c1d77" + integrity sha512-jOTSb+drvEDxEq6OuUybOAv/xxoh3cuYRUIPyu8sSHQNKM303UQ2R1DAo45o1AkcIXw6fzbaFI1+xGGdaXs2lg== -bignumber.js@^9.0.1: - version "9.1.0" - resolved "https://registry.yarnpkg.com/bignumber.js/-/bignumber.js-9.1.0.tgz#8d340146107fe3a6cb8d40699643c302e8773b62" - integrity sha512-4LwHK4nfDOraBCtst+wOWIHbu1vhvAPJK8g8nROd4iuc3PSEjWif/qwbkh8jwCJz6yDBvtU4KPynETgrfh7y3A== +bignumber.js@^9.0.0: + version "9.1.2" + resolved "https://registry.yarnpkg.com/bignumber.js/-/bignumber.js-9.1.2.tgz#b7c4242259c008903b13707983b5f4bbd31eda0c" + integrity sha512-2/mKyZH9K85bzOEfhXDBFZTGd1CTs+5IHpeFQo9luiBG7hghdC851Pj2WAhb6E3R6b9tZj/XKhbg4fum+Kepug== binary-extensions@^2.0.0: version "2.2.0" @@ -2803,54 +2538,51 @@ bluebird@^3.5.0, bluebird@^3.5.2: bn.js@4.11.6: version "4.11.6" resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-4.11.6.tgz#53344adb14617a13f6e8dd2ce28905d1c0ba3215" - integrity sha1-UzRK2xRhehP26N0s4okF0cC6MhU= + integrity sha512-XWwnNNFCuuSQ0m3r3C4LE3EiORltHd9M05pq6FOlVeiophzRbMo50Sbz1ehl8K3Z+jw9+vmgnXefY1hz8X+2wA== bn.js@^4.0.0, bn.js@^4.1.0, bn.js@^4.10.0, bn.js@^4.11.0, bn.js@^4.11.6, bn.js@^4.11.8, bn.js@^4.11.9, bn.js@^4.8.0: version "4.12.0" resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-4.12.0.tgz#775b3f278efbb9718eec7361f483fb36fbbfea88" integrity sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA== -bn.js@^5.0.0, bn.js@^5.1.1, bn.js@^5.1.2, bn.js@^5.1.3, bn.js@^5.2.0: - version "5.2.0" - resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-5.2.0.tgz#358860674396c6997771a9d051fcc1b57d4ae002" - integrity sha512-D7iWRBvnZE8ecXiLj/9wbxH7Tk79fAh8IHaTNq1RWRixsS02W+5qS+iE9yq6RYl0asXx5tw0bLhmT5pIfbSquw== - -bn.js@^5.2.1: +bn.js@^5.0.0, bn.js@^5.1.1, bn.js@^5.1.2, bn.js@^5.1.3, bn.js@^5.2.0, bn.js@^5.2.1: version "5.2.1" resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-5.2.1.tgz#0bc527a6a0d18d0aa8d5b0538ce4a77dccfa7b70" integrity sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ== -body-parser@1.19.2: - version "1.19.2" - resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.19.2.tgz#4714ccd9c157d44797b8b5607d72c0b89952f26e" - integrity sha512-SAAwOxgoCKMGs9uUAUFHygfLAyaniaoun6I8mFY9pRAJL9+Kec34aU+oIjDhTycub1jozEfEwx1W1IuOYxVSFw== +body-parser@1.20.1: + version "1.20.1" + resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.20.1.tgz#b1812a8912c195cd371a3ee5e66faa2338a5c668" + integrity sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw== dependencies: bytes "3.1.2" content-type "~1.0.4" debug "2.6.9" - depd "~1.1.2" - http-errors "1.8.1" + depd "2.0.0" + destroy "1.2.0" + http-errors "2.0.0" iconv-lite "0.4.24" - on-finished "~2.3.0" - qs "6.9.7" - raw-body "2.4.3" + on-finished "2.4.1" + qs "6.11.0" + raw-body "2.5.1" type-is "~1.6.18" + unpipe "1.0.0" body-parser@^1.16.0: - version "1.20.0" - resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.20.0.tgz#3de69bd89011c11573d7bfee6a64f11b6bd27cc5" - integrity sha512-DfJ+q6EPcGKZD1QWUjSpqp+Q7bDQTsQIF4zfUAtZ6qk+H/3/QRhg9CEp39ss+/T2vw0+HaidC0ecJj/DRLIaKg== + version "1.20.2" + resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.20.2.tgz#6feb0e21c4724d06de7ff38da36dad4f57a747fd" + integrity sha512-ml9pReCu3M61kGlqoTm2umSXTlRTuGTx0bfYj+uIUKKYycG5NtSbeetV3faSU6R7ajOPw0g/J1PvK4qNy7s5bA== dependencies: bytes "3.1.2" - content-type "~1.0.4" + content-type "~1.0.5" debug "2.6.9" depd "2.0.0" destroy "1.2.0" http-errors "2.0.0" iconv-lite "0.4.24" on-finished "2.4.1" - qs "6.10.3" - raw-body "2.5.1" + qs "6.11.0" + raw-body "2.5.2" type-is "~1.6.18" unpipe "1.0.0" @@ -2890,7 +2622,7 @@ braces@^2.3.1: split-string "^3.0.2" to-regex "^3.0.1" -braces@^3.0.1, braces@^3.0.2, braces@~3.0.2: +braces@^3.0.2, braces@~3.0.2: version "3.0.2" resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.2.tgz#3454e1a462ee8d599e236df336cd9ea4f8afe107" integrity sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A== @@ -2900,7 +2632,17 @@ braces@^3.0.1, braces@^3.0.2, braces@~3.0.2: brorand@^1.0.1, brorand@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/brorand/-/brorand-1.1.0.tgz#12c25efe40a45e3c323eb8675a0a0ce57b22371f" - integrity sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8= + integrity sha512-cKV8tMCEpQs4hK/ik71d6LrPOnpkpGBR0wzxqr68g2m/LB2GxVYQroAjMJZRVM1Y4BCjCKc3vAamxSzOY2RP+w== + +browser-level@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/browser-level/-/browser-level-1.0.1.tgz#36e8c3183d0fe1c405239792faaab5f315871011" + integrity sha512-XECYKJ+Dbzw0lbydyQuJzwNXtOpbMSq737qxJN11sIRTErOMShvDpbzTlgju7orJKvx4epULolZAuJGLzCmWRQ== + dependencies: + abstract-level "^1.0.2" + catering "^2.1.1" + module-error "^1.0.2" + run-parallel-limit "^1.1.0" browser-stdout@1.3.1: version "1.3.1" @@ -2972,7 +2714,7 @@ browserslist@^3.2.6: bs58@^4.0.0: version "4.0.1" resolved "https://registry.yarnpkg.com/bs58/-/bs58-4.0.1.tgz#be161e76c354f6f788ae4071f63f34e8c4f0a42a" - integrity sha1-vhYedsNU9veIrkBx9j806MTwpCo= + integrity sha512-Ok3Wdf5vOIlBrgCvTq96gBkJw+JUEzdBgyaza5HLtPm7yTHkjRy8+JzNyHF7BHa0bNWOQIp3m5YF0nnFcOIKLw== dependencies: base-x "^3.0.2" @@ -2998,12 +2740,12 @@ buffer-from@^1.0.0: buffer-to-arraybuffer@^0.0.5: version "0.0.5" resolved "https://registry.yarnpkg.com/buffer-to-arraybuffer/-/buffer-to-arraybuffer-0.0.5.tgz#6064a40fa76eb43c723aba9ef8f6e1216d10511a" - integrity sha1-YGSkD6dutDxyOrqe+PbhIW0QURo= + integrity sha512-3dthu5CYiVB1DEJp61FtApNnNndTckcqe4pFcLdvHtrpG+kcyekCJKg4MRiDcFW7A6AODnXB9U4dwQiCW5kzJQ== buffer-xor@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/buffer-xor/-/buffer-xor-1.0.3.tgz#26e61ed1422fb70dd42e6e36729ed51d855fe8d9" - integrity sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk= + integrity sha512-571s0T7nZWK6vB67HI5dyUF7wXiNcfaPPPTl6zYCNApANjIvYJTg7hlud/+cJpdAhS7dVzqMLmfhfHR3rAcOjQ== buffer-xor@^2.0.1: version "2.0.2" @@ -3020,10 +2762,18 @@ buffer@^5.0.5, buffer@^5.2.1, buffer@^5.5.0, buffer@^5.6.0: base64-js "^1.3.1" ieee754 "^1.1.13" +buffer@^6.0.3: + version "6.0.3" + resolved "https://registry.yarnpkg.com/buffer/-/buffer-6.0.3.tgz#2ace578459cc8fbe2a70aaa8f52ee63b6a74c6c6" + integrity sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA== + dependencies: + base64-js "^1.3.1" + ieee754 "^1.2.1" + bufferutil@^4.0.1: - version "4.0.6" - resolved "https://registry.yarnpkg.com/bufferutil/-/bufferutil-4.0.6.tgz#ebd6c67c7922a0e902f053e5d8be5ec850e48433" - integrity sha512-jduaYOYtnio4aIAyc6UbvPCVcgq7nYpVnucyxr6eCYg/Woad9Hf/oxxBRDnGGjPfjUm6j5O/uBWhIu4iLebFaw== + version "4.0.7" + resolved "https://registry.yarnpkg.com/bufferutil/-/bufferutil-4.0.7.tgz#60c0d19ba2c992dd8273d3f73772ffc894c153ad" + integrity sha512-kukuqc39WOHtdxtw4UScxF/WVnMFVSQVKhtx3AjZJzhd0RGZZldcrfSEbVsWWe6KNH253574cq5F+wpv0G9pJw== dependencies: node-gyp-build "^4.3.0" @@ -3032,6 +2782,13 @@ builtin-modules@^1.1.1: resolved "https://registry.yarnpkg.com/builtin-modules/-/builtin-modules-1.1.1.tgz#270f076c5a72c02f5b65a47df94c5fe3a278892f" integrity sha512-wxXCdllwGhI2kCC0MnvTGYTMvnVZTvqgypkiTI8Pa5tcz2i6VqsqwYGgqwXji+4RgCzms6EajE4IxiUH6HH8nQ== +busboy@^1.6.0: + version "1.6.0" + resolved "https://registry.yarnpkg.com/busboy/-/busboy-1.6.0.tgz#966ea36a9502e43cdb9146962523b92f531f6893" + integrity sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA== + dependencies: + streamsearch "^1.1.0" + bytes@3.1.2: version "3.1.2" resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.1.2.tgz#8b0beeb98605adf1b128fa4386403c009e0221a5" @@ -3040,14 +2797,14 @@ bytes@3.1.2: bytewise-core@^1.2.2: version "1.2.3" resolved "https://registry.yarnpkg.com/bytewise-core/-/bytewise-core-1.2.3.tgz#3fb410c7e91558eb1ab22a82834577aa6bd61d42" - integrity sha1-P7QQx+kVWOsasiqCg0V3qmvWHUI= + integrity sha512-nZD//kc78OOxeYtRlVk8/zXqTB4gf/nlguL1ggWA8FuchMyOxcyHR4QPQZMUmA7czC+YnaBrPUCubqAWe50DaA== dependencies: typewise-core "^1.2" bytewise@~1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/bytewise/-/bytewise-1.1.0.tgz#1d13cbff717ae7158094aa881b35d081b387253e" - integrity sha1-HRPL/3F65xWAlKqIGzXQgbOHJT4= + integrity sha512-rHuuseJ9iQ0na6UDhnrRVDh8YnWVlU6xM3VH6q/+yHDeUH2zIhUzP+2/h3LIrhLDBtTqzWpE3p3tP/boefskKQ== dependencies: bytewise-core "^1.2.2" typewise "^1.0.3" @@ -3067,6 +2824,16 @@ cache-base@^1.0.1: union-value "^1.0.0" unset-value "^1.0.0" +cacheable-lookup@^5.0.3: + version "5.0.4" + resolved "https://registry.yarnpkg.com/cacheable-lookup/-/cacheable-lookup-5.0.4.tgz#5a6b865b2c44357be3d5ebc2a467b032719a7005" + integrity sha512-2/kNscPhpcxrOigMZzbiWF7dz8ilhb/nIHU3EyZiXWXpeq/au8qJ8VhdftMkty3n7Gj6HIGalQG8oiBNB3AJgA== + +cacheable-lookup@^6.0.4: + version "6.1.0" + resolved "https://registry.yarnpkg.com/cacheable-lookup/-/cacheable-lookup-6.1.0.tgz#0330a543471c61faa4e9035db583aad753b36385" + integrity sha512-KJ/Dmo1lDDhmW2XDPMo+9oiy/CeqosPguPCrgcVzKyZrL6pM1gU2GmPY/xo6OQPTUaA/c0kwHuywB4E6nmT9ww== + cacheable-request@^6.0.0: version "6.1.0" resolved "https://registry.yarnpkg.com/cacheable-request/-/cacheable-request-6.1.0.tgz#20ffb8bd162ba4be11e9567d823db651052ca912" @@ -3080,10 +2847,23 @@ cacheable-request@^6.0.0: normalize-url "^4.1.0" responselike "^1.0.2" +cacheable-request@^7.0.2: + version "7.0.4" + resolved "https://registry.yarnpkg.com/cacheable-request/-/cacheable-request-7.0.4.tgz#7a33ebf08613178b403635be7b899d3e69bbe817" + integrity sha512-v+p6ongsrp0yTGbJXjgxPow2+DL93DASP4kXCDKb8/bwRtt9OEF3whggkkDkGNzgcWy2XaF4a8nZglC7uElscg== + dependencies: + clone-response "^1.0.2" + get-stream "^5.1.0" + http-cache-semantics "^4.0.0" + keyv "^4.0.0" + lowercase-keys "^2.0.0" + normalize-url "^6.0.1" + responselike "^2.0.0" + cachedown@1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/cachedown/-/cachedown-1.0.0.tgz#d43f036e4510696b31246d7db31ebf0f7ac32d15" - integrity sha1-1D8DbkUQaWsxJG19sx6/D3rDLRU= + integrity sha512-t+yVk82vQWCJF3PsWHMld+jhhjkkWjcAzz8NbFx1iULOXWl8Tm/FdM4smZNVw3MRr0X+lVTx9PKzvEn4Ng19RQ== dependencies: abstract-leveldown "^2.4.1" lru-cache "^3.2.0" @@ -3096,25 +2876,6 @@ call-bind@^1.0.0, call-bind@^1.0.2, call-bind@~1.0.2: function-bind "^1.1.1" get-intrinsic "^1.0.2" -caller-callsite@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/caller-callsite/-/caller-callsite-2.0.0.tgz#847e0fce0a223750a9a027c54b33731ad3154134" - integrity sha1-hH4PzgoiN1CpoCfFSzNzGtMVQTQ= - dependencies: - callsites "^2.0.0" - -caller-path@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/caller-path/-/caller-path-2.0.0.tgz#468f83044e369ab2010fac5f06ceee15bb2cb1f4" - integrity sha1-Ro+DBE42mrIBD6xfBs7uFbsssfQ= - dependencies: - caller-callsite "^2.0.0" - -callsites@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/callsites/-/callsites-2.0.0.tgz#06eb84f00eea413da86affefacbffb36093b3c50" - integrity sha1-BuuE8A7qQT2oav/vrL/7Ngk7PFA= - callsites@^3.0.0: version "3.1.0" resolved "https://registry.yarnpkg.com/callsites/-/callsites-3.1.0.tgz#b3630abd8943432f54b3f0519238e33cd7df2f73" @@ -3123,7 +2884,7 @@ callsites@^3.0.0: camelcase@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-3.0.0.tgz#32fc4b9fcdaf845fcdf7e73bb97cac2261f0ab0a" - integrity sha1-MvxLn82vhF/N9+c7uXysImHwqwo= + integrity sha512-4nhGqUkc4BqbBBB4Q6zLuD7lzzrHYrjKGeYaEji/3tFR5VdJu9v+LilhGIVe8wxEJPPOeWo7eg8dwY13TZ1BNg== camelcase@^5.0.0: version "5.3.1" @@ -3136,31 +2897,40 @@ camelcase@^6.0.0: integrity sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA== caniuse-lite@^1.0.30000844: - version "1.0.30001325" - resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001325.tgz#2b4ad19b77aa36f61f2eaf72e636d7481d55e606" - integrity sha512-sB1bZHjseSjDtijV1Hb7PB2Zd58Kyx+n/9EotvZ4Qcz2K3d0lWB8dB4nb8wN/TsOGFq3UuAm0zQZNQ4SoR7TrQ== + version "1.0.30001533" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001533.tgz#1180daeb2518b93c82f19b904d1fefcf82197707" + integrity sha512-9aY/b05NKU4Yl2sbcJhn4A7MsGwR1EPfW/nrqsnqVA0Oq50wpmPaGI+R1Z0UKlUl96oxUkGEOILWtOHck0eCWw== + +case@^1.6.3: + version "1.6.3" + resolved "https://registry.yarnpkg.com/case/-/case-1.6.3.tgz#0a4386e3e9825351ca2e6216c60467ff5f1ea1c9" + integrity sha512-mzDSXIPaFwVDvZAHqZ9VlbyF4yyXRuX6IvB06WvPYkqJVO24kX1PPhv9bfpKNFZyxYFmmgo03HUiD8iklmJYRQ== caseless@^0.12.0, caseless@~0.12.0: version "0.12.0" resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.12.0.tgz#1b681c21ff84033c826543090689420d187151dc" - integrity sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw= + integrity sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw== -cbor@^5.0.2: - version "5.2.0" - resolved "https://registry.yarnpkg.com/cbor/-/cbor-5.2.0.tgz#4cca67783ccd6de7b50ab4ed62636712f287a67c" - integrity sha512-5IMhi9e1QU76ppa5/ajP1BmMWZ2FHkhAhjeVKQ/EFCgYSEaeVaoGtL7cxJskf9oCCk+XjzaIdc3IuU/dbA/o2A== +catering@^2.1.0, catering@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/catering/-/catering-2.1.1.tgz#66acba06ed5ee28d5286133982a927de9a04b510" + integrity sha512-K7Qy8O9p76sL3/3m7/zLKbRkyOlSZAgzEaLhyj2mXS8PsCud2Eo4hAb8aLtZqHh0QGqLcb9dlJSu6lHRVENm1w== + +cbor@^8.1.0: + version "8.1.0" + resolved "https://registry.yarnpkg.com/cbor/-/cbor-8.1.0.tgz#cfc56437e770b73417a2ecbfc9caf6b771af60d5" + integrity sha512-DwGjNW9omn6EwP70aXsn7FQJx5kO12tX0bZkaTjzdVFM6/7nhA4t0EENocKGx6D2Bch9PE2KzCUf5SceBdeijg== dependencies: - bignumber.js "^9.0.1" - nofilter "^1.0.4" + nofilter "^3.1.0" chai@^4.3.4: - version "4.3.6" - resolved "https://registry.yarnpkg.com/chai/-/chai-4.3.6.tgz#ffe4ba2d9fa9d6680cc0b370adae709ec9011e9c" - integrity sha512-bbcp3YfHCUzMOvKqsztczerVgBKSsEijCySNlHHbX3VG1nskvqjz5Rfso1gGwD6w6oOV3eI60pKuMOV5MV7p3Q== + version "4.3.8" + resolved "https://registry.yarnpkg.com/chai/-/chai-4.3.8.tgz#40c59718ad6928da6629c70496fe990b2bb5b17c" + integrity sha512-vX4YvVVtxlfSZ2VecZgFUTU5qPCYsobVI2O9FmwEXBhDigYGQA6jRXCycIs1yJnnWbZ6/+a2zNIF5DfVCcJBFQ== dependencies: assertion-error "^1.1.0" check-error "^1.0.2" - deep-eql "^3.0.1" + deep-eql "^4.1.2" get-func-name "^2.0.0" loupe "^2.3.1" pathval "^1.1.1" @@ -3169,7 +2939,7 @@ chai@^4.3.4: chalk@^1.1.3: version "1.1.3" resolved "https://registry.yarnpkg.com/chalk/-/chalk-1.1.3.tgz#a8115c55e4a702fe4d150abd3872822a7e09fc98" - integrity sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg= + integrity sha512-U3lRVLMSlsCfjqYPbLyVv11M9CPW4I728d6TCKMAOJueEeB9/8o+eSsMnxPJD+Q+K909sdESg7C+tIkoH6on1A== dependencies: ansi-styles "^2.2.1" escape-string-regexp "^1.0.2" @@ -3177,7 +2947,7 @@ chalk@^1.1.3: strip-ansi "^3.0.0" supports-color "^2.0.0" -chalk@^2.0.0, chalk@^2.1.0, chalk@^2.3.0, chalk@^2.4.1, chalk@^2.4.2: +chalk@^2.3.0, chalk@^2.4.1, chalk@^2.4.2: version "2.4.2" resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== @@ -3194,25 +2964,20 @@ chalk@^4.0.0, chalk@^4.1.0, chalk@^4.1.2: ansi-styles "^4.1.0" supports-color "^7.1.0" -chardet@^0.7.0: - version "0.7.0" - resolved "https://registry.yarnpkg.com/chardet/-/chardet-0.7.0.tgz#90094849f0937f2eedc2425d0d28a9e5f0cbad9e" - integrity sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA== - "charenc@>= 0.0.1": version "0.0.2" resolved "https://registry.yarnpkg.com/charenc/-/charenc-0.0.2.tgz#c0a1d2f3a7092e03774bfa83f14c0fc5790a8667" - integrity sha1-wKHS86cJLgN3S/qD8UwPxXkKhmc= + integrity sha512-yrLQ/yVUFXkzg7EDQsPieE/53+0RlaWTs+wBrvW36cyilJ2SaDWfl4Yj7MtLTXleV9uEKefbAGUPv2/iWSooRA== check-error@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/check-error/-/check-error-1.0.2.tgz#574d312edd88bb5dd8912e9286dd6c0aed4aac82" - integrity sha1-V00xLt2Iu13YkS6Sht1sCu1KrII= + integrity sha512-BrgHpW9NURQgzoNyjfq0Wu6VFO6D7IZEmJNdtgNqpzGG8RuNFHt2jQxWlAs4HMe119chBnv+34syEZtc6IhLtA== checkpoint-store@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/checkpoint-store/-/checkpoint-store-1.1.0.tgz#04e4cb516b91433893581e6d4601a78e9552ea06" - integrity sha1-BOTLUWuRQziTWB5tRgGnjpVS6gY= + integrity sha512-J/NdY2WvIx654cc6LWSq/IYFFCUf75fFTgwzFnmbqyORH4MwgiQCgswLLKBGzmsyTI5V7i5bp/So6sMbDWhedg== dependencies: functional-red-black-tree "^1.0.1" @@ -3315,18 +3080,22 @@ class-utils@^0.3.5: isobject "^3.0.0" static-extend "^0.1.1" +classic-level@^1.2.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/classic-level/-/classic-level-1.3.0.tgz#5e36680e01dc6b271775c093f2150844c5edd5c8" + integrity sha512-iwFAJQYtqRTRM0F6L8h4JCt00ZSGdOyqh7yVrhhjrOpFhmBjNlRUey64MCiyo6UmQHMJ+No3c81nujPv+n9yrg== + dependencies: + abstract-level "^1.0.2" + catering "^2.1.0" + module-error "^1.0.1" + napi-macros "^2.2.2" + node-gyp-build "^4.3.0" + clean-stack@^2.0.0: version "2.2.0" resolved "https://registry.yarnpkg.com/clean-stack/-/clean-stack-2.2.0.tgz#ee8472dbb129e727b31e8a10a427dee9dfe4008b" integrity sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A== -cli-cursor@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-2.1.0.tgz#b35dac376479facc3e94747d41d0d0f5238ffcb5" - integrity sha1-s12sN2R5+sw+lHR9QdDQ9SOP/LU= - dependencies: - restore-cursor "^2.0.0" - cli-table3@^0.5.0: version "0.5.1" resolved "https://registry.yarnpkg.com/cli-table3/-/cli-table3-0.5.1.tgz#0252372d94dfc40dbd8df06005f48f31f656f202" @@ -3337,15 +3106,10 @@ cli-table3@^0.5.0: optionalDependencies: colors "^1.1.2" -cli-width@^2.0.0: - version "2.2.1" - resolved "https://registry.yarnpkg.com/cli-width/-/cli-width-2.2.1.tgz#b0433d0b4e9c847ef18868a4ef16fd5fc8271c48" - integrity sha512-GRMWDxpOB6Dgk2E5Uo+3eEBvtOOlimMmpbFiKuLFnQzYDavtLFY3K5ona41jgN/WdRZtG7utuVSVTL4HbZHGkw== - cliui@^3.2.0: version "3.2.0" resolved "https://registry.yarnpkg.com/cliui/-/cliui-3.2.0.tgz#120601537a916d29940f934da3b48d585a39213d" - integrity sha1-EgYBU3qRbSmUD5NNo7SNWFo5IT0= + integrity sha512-0yayqDxWQbqk3ojkYqUKqaAQ6AfNKeKWRNA8kR0WXzAsdHpP4BIaOmMAG87JGuO6qcobyW4GjxHd9PmhEd+T9w== dependencies: string-width "^1.0.1" strip-ansi "^3.0.1" @@ -3370,26 +3134,26 @@ cliui@^7.0.2: wrap-ansi "^7.0.0" clone-response@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/clone-response/-/clone-response-1.0.2.tgz#d1dc973920314df67fbeb94223b4ee350239e96b" - integrity sha1-0dyXOSAxTfZ/vrlCI7TuNQI56Ws= + version "1.0.3" + resolved "https://registry.yarnpkg.com/clone-response/-/clone-response-1.0.3.tgz#af2032aa47816399cf5f0a1d0db902f517abb8c3" + integrity sha512-ROoL94jJH2dUVML2Y/5PEDNaSHgeOdSDicUyS7izcF63G6sTc/FTjLub4b8Il9S8S0beOfYt0TaA5qvFK+w0wA== dependencies: mimic-response "^1.0.0" clone@2.1.2, clone@^2.0.0: version "2.1.2" resolved "https://registry.yarnpkg.com/clone/-/clone-2.1.2.tgz#1b7f4b9f591f1e8f83670401600345a02887435f" - integrity sha1-G39Ln1kfHo+DZwQBYANFoCiHQ18= + integrity sha512-3Pe/CF1Nn94hyhIYpjtiLhdCoEoz0DqQ+988E9gmeEdQZlojxnOb74wctFyuwWQHzqyf9X7C7MG8juUpqBJT8w== code-point-at@^1.0.0: version "1.1.0" resolved "https://registry.yarnpkg.com/code-point-at/-/code-point-at-1.1.0.tgz#0d070b4d043a5bea33a2f1a40e2edb3d9a4ccf77" - integrity sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c= + integrity sha512-RpAVKQA5T63xEj6/giIbUEtZwJ4UFIc3ZtvEkiaUERylqe8xb5IvqcgOurZLahv93CLKfxcw5YI+DZcUBRyLXA== collection-visit@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/collection-visit/-/collection-visit-1.0.0.tgz#4bc0373c164bc3291b4d368c829cf1a80a59dca0" - integrity sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA= + integrity sha512-lNkKvzEeMBBjUGHZ+q6z9pSJla0KWAQPvtzhEV9+iGyQYG+pBpl7xKDhxoNSOZH2hhv0v5k0y2yAM4o4SjoSkw== dependencies: map-visit "^1.0.0" object-visit "^1.0.0" @@ -3411,7 +3175,7 @@ color-convert@^2.0.1: color-name@1.1.3: version "1.1.3" resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" - integrity sha1-p9BVi9icQveV3UIyj3QIMcpTvCU= + integrity sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw== color-name@~1.1.4: version "1.1.4" @@ -3455,34 +3219,34 @@ command-line-args@^5.1.1: typical "^4.0.0" command-line-usage@^6.1.0: - version "6.1.2" - resolved "https://registry.yarnpkg.com/command-line-usage/-/command-line-usage-6.1.2.tgz#2b7ccd48a93fb19bd71ca8fe9900feab00e557b0" - integrity sha512-I+0XN613reAhpBQ6icsPOTwu9cvhc9NtLtUcY2fGYuwm9JZiWBzFDA8w0PHqQjru7Xth7fM/y9TJ13+VKdjh7Q== + version "6.1.3" + resolved "https://registry.yarnpkg.com/command-line-usage/-/command-line-usage-6.1.3.tgz#428fa5acde6a838779dfa30e44686f4b6761d957" + integrity sha512-sH5ZSPr+7UStsloltmDh7Ce5fb8XPlHyoPzTpyyMuYCtervL65+ubVZ6Q61cFtFl62UyJlc8/JwERRbAFPUqgw== dependencies: - array-back "^4.0.1" + array-back "^4.0.2" chalk "^2.4.2" - table-layout "^1.0.1" + table-layout "^1.0.2" typical "^5.2.0" -commander@2.18.0: - version "2.18.0" - resolved "https://registry.yarnpkg.com/commander/-/commander-2.18.0.tgz#2bf063ddee7c7891176981a2cc798e5754bc6970" - integrity sha512-6CYPa+JP2ftfRU2qkDK+UTVeQYosOg/2GbcjIcKPHfinyOLPVGXu/ovN86RP49Re5ndJK1N0kuiidFFuepc4ZQ== - commander@3.0.2: version "3.0.2" resolved "https://registry.yarnpkg.com/commander/-/commander-3.0.2.tgz#6837c3fb677ad9933d1cfba42dd14d5117d6b39e" integrity sha512-Gar0ASD4BDyKC4hl4DwHqDrmvjoxWKZigVnAbn5H1owvm4CxCPdb0HQDehwNYMJpla5+M2tPmPARzhtYuwpHow== +commander@^10.0.0: + version "10.0.1" + resolved "https://registry.yarnpkg.com/commander/-/commander-10.0.1.tgz#881ee46b4f77d1c1dccc5823433aa39b022cbe06" + integrity sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug== + commander@^2.12.1: version "2.20.3" resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.3.tgz#fd485e84c03eb4881c20722ba48035e8531aeb33" integrity sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ== commander@^9.2.0, commander@^9.4.0: - version "9.4.0" - resolved "https://registry.yarnpkg.com/commander/-/commander-9.4.0.tgz#bc4a40918fefe52e22450c111ecd6b7acce6f11c" - integrity sha512-sRPT+umqkz90UA8M1yqYfnHlZA7fF6nSphDtxeywPZ49ysjxDQybzk13CL+mXekDRG92skbcqCLVovuCusNmFw== + version "9.5.0" + resolved "https://registry.yarnpkg.com/commander/-/commander-9.5.0.tgz#bc08d1eb5cedf7ccb797a96199d41c7bc3e60d30" + integrity sha512-KRs7WVDKg86PWiuAqhDrAQnTXZKraVcCc6vFdL14qrZ/DcWwuRo7VoiYXalXO7S5GKpqYiVEwCbgFDfxNHKJBQ== component-emitter@^1.2.1: version "1.3.0" @@ -3492,7 +3256,7 @@ component-emitter@^1.2.1: concat-map@0.0.1: version "0.0.1" resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" - integrity sha1-2Klr13/Wjfd5OnMDajug1UBdR3s= + integrity sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg== concat-stream@^1.5.1, concat-stream@^1.6.0, concat-stream@^1.6.2: version "1.6.2" @@ -3520,17 +3284,15 @@ content-hash@^2.5.2: multicodec "^0.5.5" multihashes "^0.4.15" -content-type@~1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/content-type/-/content-type-1.0.4.tgz#e138cc75e040c727b1966fe5e5f8c9aee256fe3b" - integrity sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA== +content-type@~1.0.4, content-type@~1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/content-type/-/content-type-1.0.5.tgz#8b773162656d1d1086784c8f23a54ce6d73d7918" + integrity sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA== convert-source-map@^1.5.1: - version "1.8.0" - resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.8.0.tgz#f3373c32d21b4d780dd8004514684fb791ca4369" - integrity sha512-+OQdjP49zViI/6i7nIJpA8rAl4sV/JdPfU9nZs3VqOwGIgizICvuN2ru6fMd+4llL0tar18UYJXfZ/TWtmhUjA== - dependencies: - safe-buffer "~5.1.1" + version "1.9.0" + resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.9.0.tgz#7faae62353fb4213366d0ca98358d22e8368b05f" + integrity sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A== convert-svg-core@^0.6.4: version "0.6.4" @@ -3559,9 +3321,14 @@ convert-svg-to-png@^0.6.4: cookie-signature@1.0.6: version "1.0.6" resolved "https://registry.yarnpkg.com/cookie-signature/-/cookie-signature-1.0.6.tgz#e303a882b342cc3ee8ca513a79999734dab3ae2c" - integrity sha1-4wOogrNCzD7oylE6eZmXNNqzriw= + integrity sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ== + +cookie@0.5.0: + version "0.5.0" + resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.5.0.tgz#d1f5d71adec6558c58f389987c366aa47e994f8b" + integrity sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw== -cookie@0.4.2, cookie@^0.4.1: +cookie@^0.4.1: version "0.4.2" resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.4.2.tgz#0e41f24de5ecf317947c82fc789e06a884824432" integrity sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA== @@ -3574,12 +3341,12 @@ cookiejar@^2.1.1: copy-descriptor@^0.1.0: version "0.1.1" resolved "https://registry.yarnpkg.com/copy-descriptor/-/copy-descriptor-0.1.1.tgz#676f6eb3c39997c2ee1ac3a924fd6124748f578d" - integrity sha1-Z29us8OZl8LuGsOpJP1hJHSPV40= + integrity sha512-XgZ0pFcakEUlbwQEVNg3+QAis1FyTL3Qel9FYy8pSkQqoG3PNoT0bOCQtOXcOkur21r2Eq2kI+IE+gsmAEVlYw== core-js-pure@^3.0.1: - version "3.21.1" - resolved "https://registry.yarnpkg.com/core-js-pure/-/core-js-pure-3.21.1.tgz#8c4d1e78839f5f46208de7230cebfb72bc3bdb51" - integrity sha512-12VZfFIu+wyVbBebyHmRTuEE/tZrB4tJToWcwAMcsp3h4+sHR+fMJWbKpYiCRWlhFBq+KNyO8rIV9rTkeVmznQ== + version "3.32.2" + resolved "https://registry.yarnpkg.com/core-js-pure/-/core-js-pure-3.32.2.tgz#b7dbdac528625cf87eb0523b532eb61551b9a6d1" + integrity sha512-Y2rxThOuNywTjnX/PgA5vWM6CZ9QB9sz9oGeCixV8MqXZO70z/5SHzf9EeBrEBK0PN36DnEBBu9O/aGWzKuMZQ== core-js@^2.4.0, core-js@^2.5.0: version "2.6.12" @@ -3589,7 +3356,7 @@ core-js@^2.4.0, core-js@^2.5.0: core-util-is@1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7" - integrity sha1-tf1UIgqivFq1eqtxQMlAdUUDwac= + integrity sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ== core-util-is@~1.0.0: version "1.0.3" @@ -3604,15 +3371,15 @@ cors@^2.8.1: object-assign "^4" vary "^1" -cosmiconfig@^5.0.7: - version "5.2.1" - resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-5.2.1.tgz#040f726809c591e77a17c0a3626ca45b4f168b1a" - integrity sha512-H65gsXo1SKjf8zmrJ67eJk8aIRKV5ff2D4uKZIBZShbhGSpEmsQOPW/SKMKYhSTrqR7ufy6RP69rPogdaPh/kA== +cosmiconfig@^8.0.0: + version "8.3.5" + resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-8.3.5.tgz#3b3897ddd042d022d5a207d4c8832e54f5301977" + integrity sha512-A5Xry3xfS96wy2qbiLkQLAg4JUrR2wvfybxj6yqLmrUfMAvhS3MZxIP2oQn0grgYIvJqzpeTEWu4vK0t+12NNw== dependencies: - import-fresh "^2.0.0" - is-directory "^0.3.1" - js-yaml "^3.13.1" - parse-json "^4.0.0" + import-fresh "^3.3.0" + js-yaml "^4.1.0" + parse-json "^5.2.0" + path-type "^4.0.0" crc-32@^1.2.0: version "1.2.2" @@ -3670,6 +3437,13 @@ cross-fetch@^2.1.0, cross-fetch@^2.1.1: node-fetch "^2.6.7" whatwg-fetch "^2.0.4" +cross-fetch@^3.1.4: + version "3.1.8" + resolved "https://registry.yarnpkg.com/cross-fetch/-/cross-fetch-3.1.8.tgz#0327eba65fd68a7d119f8fb2bf9334a1a7956f82" + integrity sha512-cvA+JwZoU0Xq+h6WkMvAUqPEYy92Obet6UdKLfW60qn99ftItKjB5T+BkyWOFWe2pUyfQ+IJHmpOTznqk1M6Kg== + dependencies: + node-fetch "^2.6.12" + cross-spawn@^6.0.5: version "6.0.5" resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-6.0.5.tgz#4a5ec7c64dfae22c3a14124dbacdee846d80cbc4" @@ -3693,7 +3467,7 @@ cross-spawn@^7.0.2: "crypt@>= 0.0.1": version "0.0.2" resolved "https://registry.yarnpkg.com/crypt/-/crypt-0.0.2.tgz#88d7ff7ec0dfb86f713dc87bbb42d044d3e6c41b" - integrity sha1-iNf/fsDfuG9xPch7u0LQRNPmxBs= + integrity sha512-mCxBlsHFYh9C+HVpiEacem8FEBnMXgU9gy4zmNC+SXAZNB/1idgp/aulFJ4FgCi7GPEVbfyng092GqL2k2rmow== crypto-browserify@3.12.0: version "3.12.0" @@ -3739,16 +3513,16 @@ d@1, d@^1.0.1: dashdash@^1.12.0: version "1.14.1" resolved "https://registry.yarnpkg.com/dashdash/-/dashdash-1.14.1.tgz#853cfa0f7cbe2fed5de20326b8dd581035f6e2f0" - integrity sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA= + integrity sha512-jRFi8UDGo6j+odZiEpjazZaWqEal3w/basFjQHQEwVtZJGDpxbH1MeYluwCS8Xq5wmLJooDlMgvVarmWfGM44g== dependencies: assert-plus "^1.0.0" death@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/death/-/death-1.1.0.tgz#01aa9c401edd92750514470b8266390c66c67318" - integrity sha1-AaqcQB7dknUFFEcLgmY5DGbGcxg= + integrity sha512-vsV6S4KVHvTGxbEcij7hkWRv0It+sGGWVOM67dQde/o5Xjnr+KmLjxWJii2uEObIrt1CcM9w0Yaovx+iOlIL+w== -debug@2.6.9, debug@^2.2.0, debug@^2.3.3, debug@^2.6.0, debug@^2.6.8, debug@^2.6.9: +debug@2.6.9, debug@^2.2.0, debug@^2.3.3, debug@^2.6.8, debug@^2.6.9: version "2.6.9" resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA== @@ -3769,13 +3543,6 @@ debug@4, debug@4.3.4, debug@^4.1.1, debug@^4.3.1, debug@^4.3.2, debug@^4.3.3, de dependencies: ms "2.1.2" -debug@4.3.3, debug@^4.0.1: - version "4.3.3" - resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.3.tgz#04266e0b70a98d4462e6e288e38259213332b664" - integrity sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q== - dependencies: - ms "2.1.2" - debug@^3.1.0: version "3.2.7" resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.7.tgz#72580b7e9145fb39b6676f9c5e5fb100b934179a" @@ -3786,7 +3553,7 @@ debug@^3.1.0: decamelize@^1.1.1, decamelize@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290" - integrity sha1-9lNNFRSCabIDUue+4m9QH5oZEpA= + integrity sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA== decamelize@^4.0.0: version "4.0.0" @@ -3798,17 +3565,24 @@ decode-uri-component@^0.2.0: resolved "https://registry.yarnpkg.com/decode-uri-component/-/decode-uri-component-0.2.2.tgz#e69dbe25d37941171dd540e024c444cd5188e1e9" integrity sha512-FqUYQ+8o158GyGTrMFJms9qh3CqTKvAqgqsTnkLI8sKu0028orqBhxNMFkFen0zGyg6epACD32pjVk58ngIErQ== -decompress-response@^3.2.0, decompress-response@^3.3.0: +decompress-response@^3.3.0: version "3.3.0" resolved "https://registry.yarnpkg.com/decompress-response/-/decompress-response-3.3.0.tgz#80a4dd323748384bfa248083622aedec982adff3" - integrity sha1-gKTdMjdIOEv6JICDYirt7Jgq3/M= + integrity sha512-BzRPQuY1ip+qDonAOz42gRm/pg9F768C+npV/4JOsxRC2sq+Rlk+Q4ZCAsOhnIaMrgarILY+RMUIvMmmX1qAEA== dependencies: mimic-response "^1.0.0" -deep-eql@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/deep-eql/-/deep-eql-3.0.1.tgz#dfc9404400ad1c8fe023e7da1df1c147c4b444df" - integrity sha512-+QeIQyN5ZuO+3Uk5DYh6/1eKO0m0YmJFGNmFHGACpf1ClL1nmlV/p4gNgbl2pJGxgXb4faqo6UE+M5ACEMyVcw== +decompress-response@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/decompress-response/-/decompress-response-6.0.0.tgz#ca387612ddb7e104bd16d85aab00d5ecf09c66fc" + integrity sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ== + dependencies: + mimic-response "^3.1.0" + +deep-eql@^4.1.2: + version "4.1.3" + resolved "https://registry.yarnpkg.com/deep-eql/-/deep-eql-4.1.3.tgz#7c7775513092f7df98d8df9996dd085eb668cc6d" + integrity sha512-WaEtAOpRA1MQ0eohqZjpGD8zdI0Ovsm8mmFhaDN8dvDZzyoUMcYDnf5Y6iu7HTXxf8JDS23qWa4a+hKCDyOPzw== dependencies: type-detect "^4.0.0" @@ -3839,6 +3613,11 @@ defer-to-connect@^1.0.1: resolved "https://registry.yarnpkg.com/defer-to-connect/-/defer-to-connect-1.1.3.tgz#331ae050c08dcf789f8c83a7b81f0ed94f4ac591" integrity sha512-0ISdNousHvZT2EiFlZeZAHBUvSxmKswVCEf8hW7KWgG4a8MVEu/3Vb6uWYozkjylyCxe0JBIiRB1jV45S70WVQ== +defer-to-connect@^2.0.0, defer-to-connect@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/defer-to-connect/-/defer-to-connect-2.0.1.tgz#8016bdb4143e4632b77a3449c6236277de520587" + integrity sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg== + deferred-leveldown@~1.2.1: version "1.2.2" resolved "https://registry.yarnpkg.com/deferred-leveldown/-/deferred-leveldown-1.2.2.tgz#3acd2e0b75d1669924bc0a4b642851131173e1eb" @@ -3854,40 +3633,25 @@ deferred-leveldown@~4.0.0: abstract-leveldown "~5.0.0" inherits "^2.0.3" -deferred-leveldown@~5.3.0: - version "5.3.0" - resolved "https://registry.yarnpkg.com/deferred-leveldown/-/deferred-leveldown-5.3.0.tgz#27a997ad95408b61161aa69bd489b86c71b78058" - integrity sha512-a59VOT+oDy7vtAbLRCZwWgxu2BaCfd5Hk7wxJd48ei7I+nsg8Orlb9CLG0PMZienk9BSUKgeAqkO2+Lw+1+Ukw== - dependencies: - abstract-leveldown "~6.2.1" - inherits "^2.0.3" - -define-properties@^1.1.2: - version "1.1.4" - resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.1.4.tgz#0b14d7bd7fbeb2f3572c3a7eda80ea5d57fb05b1" - integrity sha512-uckOqKcfaVvtBdsVkdPv3XjveQJsNQqmhXgRi8uhvWWuPYZCNlzT8qAyblUgNoXdHdjMTzAqeGjAoli8f+bzPA== +define-properties@^1.1.2, define-properties@^1.1.3, define-properties@^1.1.4, define-properties@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.2.0.tgz#52988570670c9eacedd8064f4a990f2405849bd5" + integrity sha512-xvqAVKGfT1+UAvPwKTVw/njhdQ8ZhXK4lI0bCIuCMrp2up9nPnaDftrLtmpTazqd1o+UY4zgzU+avtMbDP+ldA== dependencies: has-property-descriptors "^1.0.0" object-keys "^1.1.1" -define-properties@^1.1.3: - version "1.1.3" - resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.1.3.tgz#cf88da6cbee26fe6db7094f61d870cbd84cee9f1" - integrity sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ== - dependencies: - object-keys "^1.0.12" - define-property@^0.2.5: version "0.2.5" resolved "https://registry.yarnpkg.com/define-property/-/define-property-0.2.5.tgz#c35b1ef918ec3c990f9a5bc57be04aacec5c8116" - integrity sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY= + integrity sha512-Rr7ADjQZenceVOAKop6ALkkRAmH1A4Gx9hV/7ZujPUN2rkATqFO0JZLZInbAjpZYoJ1gUx8MRMQVkYemcbMSTA== dependencies: is-descriptor "^0.1.0" define-property@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/define-property/-/define-property-1.0.0.tgz#769ebaaf3f4a63aad3af9e8d304c9bbe79bfb0e6" - integrity sha1-dp66rz9KY6rTr56NMEybvnm/sOY= + integrity sha512-cZTYKFWspt9jZsMscWo8sc/5lbPC9Q0N5nBLgb+Yd915iL3udB1uFgS3B8YCx66UVHq018DAVFoee7x+gxggeA== dependencies: is-descriptor "^1.0.0" @@ -3899,30 +3663,25 @@ define-property@^2.0.2: is-descriptor "^1.0.2" isobject "^3.0.1" -defined@~1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/defined/-/defined-1.0.0.tgz#c98d9bcef75674188e110969151199e39b1fa693" - integrity sha1-yY2bzvdWdBiOEQlpFRGZ45sfppM= +defined@~1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/defined/-/defined-1.0.1.tgz#c0b9db27bfaffd95d6f61399419b893df0f91ebf" + integrity sha512-hsBd2qSVCRE+5PmNdHt1uzyrFu5d3RwmFDKzyNZMFq/EwDNJF7Ee5+D5oEKF0hU6LhtoUF1macFvOe4AskQC1Q== delayed-stream@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" - integrity sha1-3zrhmayt+31ECqrgsp4icrJOxhk= + integrity sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ== depd@2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/depd/-/depd-2.0.0.tgz#b696163cc757560d09cf22cc8fad1571b79e76df" integrity sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw== -depd@~1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/depd/-/depd-1.1.2.tgz#9bcd52e14c097763e749b274c4346ed2e560b5a9" - integrity sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak= - des.js@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/des.js/-/des.js-1.0.1.tgz#5382142e1bdc53f85d86d53e5f4aa7deb91e0843" - integrity sha512-Q0I4pfFrv2VPd34/vfLrFOoRmlYj3OV50i7fskps1jZWK1kApMWWT9G6RRUeYedLcBDIhnSDaUvJMb3AhUlaEA== + version "1.1.0" + resolved "https://registry.yarnpkg.com/des.js/-/des.js-1.1.0.tgz#1d37f5766f3bbff4ee9638e871a8768c173b81da" + integrity sha512-r17GxjhUCjSRy8aiJpr8/UadFIzMzJGexI3Nmz4ADi9LYSFx4gTBp80+NaX/YsXWWLhpZ7v/v/ubEc/bCNfKwg== dependencies: inherits "^2.0.1" minimalistic-assert "^1.0.0" @@ -3932,25 +3691,20 @@ destroy@1.2.0: resolved "https://registry.yarnpkg.com/destroy/-/destroy-1.2.0.tgz#4803735509ad8be552934c67df614f94e66fa015" integrity sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg== -destroy@~1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/destroy/-/destroy-1.0.4.tgz#978857442c44749e4206613e37946205826abd80" - integrity sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA= - detect-indent@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/detect-indent/-/detect-indent-4.0.0.tgz#f76d064352cdf43a1cb6ce619c4ee3a9475de208" - integrity sha1-920GQ1LN9Docts5hnE7jqUdd4gg= + integrity sha512-BDKtmHlOzwI7iRuEkhzsnPoi5ypEhWAJB5RvHWe1kMr06js3uK5B3734i3ui5Yd+wOJV1cpE4JnivPD283GU/A== dependencies: repeating "^2.0.0" detect-port@^1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/detect-port/-/detect-port-1.3.0.tgz#d9c40e9accadd4df5cac6a782aefd014d573d1f1" - integrity sha512-E+B1gzkl2gqxt1IhUzwjrxBKRqx1UzC3WLONHinn8S3T6lwV/agVCyitiFOsGJ/eYuEUBvD71MZHy3Pv1G9doQ== + version "1.5.1" + resolved "https://registry.yarnpkg.com/detect-port/-/detect-port-1.5.1.tgz#451ca9b6eaf20451acb0799b8ab40dff7718727b" + integrity sha512-aBzdj76lueB6uUst5iAs7+0H/oOjqI5D16XUWxlWMIMROhcM0rfsNVk93zTngq1dDNpoXRr++Sus7ETAExppAQ== dependencies: address "^1.0.1" - debug "^2.6.0" + debug "4" devtools-protocol@0.0.981744: version "0.0.981744" @@ -4014,7 +3768,7 @@ domelementtype@^2.3.0: resolved "https://registry.yarnpkg.com/domelementtype/-/domelementtype-2.3.0.tgz#5c45e8e869952626331d7aab326d01daf65d589d" integrity sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw== -domhandler@^5.0.1, domhandler@^5.0.2, domhandler@^5.0.3: +domhandler@^5.0.2, domhandler@^5.0.3: version "5.0.3" resolved "https://registry.yarnpkg.com/domhandler/-/domhandler-5.0.3.tgz#cc385f7f751f1d1fc650c21374804254538c7d31" integrity sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w== @@ -4022,13 +3776,13 @@ domhandler@^5.0.1, domhandler@^5.0.2, domhandler@^5.0.3: domelementtype "^2.3.0" domutils@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/domutils/-/domutils-3.0.1.tgz#696b3875238338cb186b6c0612bd4901c89a4f1c" - integrity sha512-z08c1l761iKhDFtfXO04C7kTdPBLi41zwOZl00WS8b5eiaebNpY00HKbztwBq+e3vyqWNwWF3mP9YLUeqIrF+Q== + version "3.1.0" + resolved "https://registry.yarnpkg.com/domutils/-/domutils-3.1.0.tgz#c47f551278d3dc4b0b1ab8cbb42d751a6f0d824e" + integrity sha512-H78uMmQtI2AhgDJjWeQmHwJJ2bLPD3GMmO7Zja/ZZh84wkm+4ut+IUnUdRa8uCGX88DiVx1j6FRe1XfxEgjEZA== dependencies: dom-serializer "^2.0.0" domelementtype "^2.3.0" - domhandler "^5.0.1" + domhandler "^5.0.3" dotenv@^16.3.1: version "16.3.1" @@ -4043,14 +3797,14 @@ dotignore@~0.1.2: minimatch "^3.0.4" duplexer3@^0.1.4: - version "0.1.4" - resolved "https://registry.yarnpkg.com/duplexer3/-/duplexer3-0.1.4.tgz#ee01dd1cac0ed3cbc7fdbea37dc0a8f1ce002ce2" - integrity sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI= + version "0.1.5" + resolved "https://registry.yarnpkg.com/duplexer3/-/duplexer3-0.1.5.tgz#0b5e4d7bad5de8901ea4440624c8e1d20099217e" + integrity sha512-1A8za6ws41LQgv9HrE/66jyC5yuSjQ3L/KOpFtoBilsAK2iA2wuS5rTt1OCzIvtS2V7nVmedsUU+DGRcjBmOYA== ecc-jsbn@~0.1.1: version "0.1.2" resolved "https://registry.yarnpkg.com/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz#3a83a904e54353287874c564b7549386849a98c9" - integrity sha1-OoOpBOVDUyh4dMVkt1SThoSamMk= + integrity sha512-eh9O+hwRHNbG4BLTjEl3nw044CkGm5X6LoaCf7LPp7UU8Qrt47JYNi6nPX8xjW97TKGKm1ouctg0QSpZe9qrnw== dependencies: jsbn "~0.1.0" safer-buffer "^2.1.0" @@ -4058,12 +3812,12 @@ ecc-jsbn@~0.1.1: ee-first@1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d" - integrity sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0= + integrity sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow== electron-to-chromium@^1.3.47: - version "1.4.103" - resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.103.tgz#abfe376a4d70fa1e1b4b353b95df5d6dfd05da3a" - integrity sha512-c/uKWR1Z/W30Wy/sx3dkZoj4BijbXX85QKWu9jJfjho3LBAXNEGAEW3oWiGb+dotA6C6BzCTxL2/aLes7jlUeg== + version "1.4.515" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.515.tgz#f5fec9662106ac5752894af221606cf4db443e70" + integrity sha512-VTq6vjk3kCfG2qdzQRd/i9dIyVVm0dbtZIgFzrLgfB73mXDQT2HPKVRc1EoZcAVUv9XhXAu08DWqJuababdGGg== elliptic@6.5.4, elliptic@^6.4.0, elliptic@^6.5.2, elliptic@^6.5.3, elliptic@^6.5.4: version "6.5.4" @@ -4078,11 +3832,6 @@ elliptic@6.5.4, elliptic@^6.4.0, elliptic@^6.5.2, elliptic@^6.5.3, elliptic@^6.5 minimalistic-assert "^1.0.1" minimalistic-crypto-utils "^1.0.1" -emoji-regex@^10.0.0: - version "10.0.0" - resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-10.0.0.tgz#96559e19f82231b436403e059571241d627c42b8" - integrity sha512-KmJa8l6uHi1HrBI34udwlzZY1jOEuID/ft4d8BSSEdRyap7PwBEt910453PJa5MuGvxkLqlt4Uvhu7tttFHViw== - emoji-regex@^7.0.1: version "7.0.3" resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-7.0.3.tgz#933a04052860c85e83c122479c4748a8e4c72156" @@ -4101,7 +3850,7 @@ encode-utf8@^1.0.2: encodeurl@~1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.2.tgz#ad3ff4c86ec2d029322f5a02c3a9a606c95b3f59" - integrity sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k= + integrity sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w== encoding-down@5.0.4, encoding-down@~5.0.0: version "5.0.4" @@ -4112,17 +3861,7 @@ encoding-down@5.0.4, encoding-down@~5.0.0: inherits "^2.0.3" level-codec "^9.0.0" level-errors "^2.0.0" - xtend "^4.0.1" - -encoding-down@^6.3.0: - version "6.3.0" - resolved "https://registry.yarnpkg.com/encoding-down/-/encoding-down-6.3.0.tgz#b1c4eb0e1728c146ecaef8e32963c549e76d082b" - integrity sha512-QKrV0iKR6MZVJV08QY0wp1e7vF6QbhnbQhb07bwpEyuz4uZiZgPlEGdkCROuFkUwdxlFaiPIhjyarH1ee/3vhw== - dependencies: - abstract-leveldown "^6.2.1" - inherits "^2.0.3" - level-codec "^9.0.0" - level-errors "^2.0.0" + xtend "^4.0.1" encoding@^0.1.11: version "0.1.13" @@ -4139,16 +3878,17 @@ end-of-stream@^1.1.0, end-of-stream@^1.4.1: once "^1.4.0" enquirer@^2.3.0, enquirer@^2.3.6: - version "2.3.6" - resolved "https://registry.yarnpkg.com/enquirer/-/enquirer-2.3.6.tgz#2a7fe5dd634a1e4125a975ec994ff5456dc3734d" - integrity sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg== + version "2.4.1" + resolved "https://registry.yarnpkg.com/enquirer/-/enquirer-2.4.1.tgz#93334b3fbd74fc7097b224ab4a8fb7e40bf4ae56" + integrity sha512-rRqJg/6gd538VHvR3PSrdRBb/1Vy2YfzHqzvbhGIQpDRKIa4FgV/54b5Q1xYSxOOwKvjXweS26E0Q+nAMwp2pQ== dependencies: ansi-colors "^4.1.1" + strip-ansi "^6.0.1" -entities@^4.2.0, entities@^4.3.0, entities@^4.4.0: - version "4.4.0" - resolved "https://registry.yarnpkg.com/entities/-/entities-4.4.0.tgz#97bdaba170339446495e653cfd2db78962900174" - integrity sha512-oYp7156SP8LkeGD0GF85ad1X9Ai79WtRsZ2gxJqtBuzH+98YUV6jkHEKlZkMbcrjJjIVJNIDP/3WL9wQkoPbWA== +entities@^4.2.0, entities@^4.4.0: + version "4.5.0" + resolved "https://registry.yarnpkg.com/entities/-/entities-4.5.0.tgz#5d268ea5e7113ec74c4d033b79ea5a35a488fb48" + integrity sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw== env-paths@^2.2.0: version "2.2.1" @@ -4169,57 +3909,64 @@ error-ex@^1.2.0, error-ex@^1.3.1: dependencies: is-arrayish "^0.2.1" -es-abstract@^1.18.5: - version "1.19.1" - resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.19.1.tgz#d4885796876916959de78edaa0df456627115ec3" - integrity sha512-2vJ6tjA/UfqLm2MPs7jxVybLoB8i1t1Jd9R3kISld20sIxPcTbLuggQOUxeWeAvIUkduv/CfMjuh4WmiXr2v9w== - dependencies: - call-bind "^1.0.2" - es-to-primitive "^1.2.1" - function-bind "^1.1.1" - get-intrinsic "^1.1.1" - get-symbol-description "^1.0.0" - has "^1.0.3" - has-symbols "^1.0.2" - internal-slot "^1.0.3" - is-callable "^1.2.4" - is-negative-zero "^2.0.1" - is-regex "^1.1.4" - is-shared-array-buffer "^1.0.1" - is-string "^1.0.7" - is-weakref "^1.0.1" - object-inspect "^1.11.0" - object-keys "^1.1.1" - object.assign "^4.1.2" - string.prototype.trimend "^1.0.4" - string.prototype.trimstart "^1.0.4" - unbox-primitive "^1.0.1" - -es-abstract@^1.19.1: - version "1.19.2" - resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.19.2.tgz#8f7b696d8f15b167ae3640b4060670f3d054143f" - integrity sha512-gfSBJoZdlL2xRiOCy0g8gLMryhoe1TlimjzU99L/31Z8QEGIhVQI+EWwt5lT+AuU9SnorVupXFqqOGqGfsyO6w== +es-abstract@^1.22.1: + version "1.22.1" + resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.22.1.tgz#8b4e5fc5cefd7f1660f0f8e1a52900dfbc9d9ccc" + integrity sha512-ioRRcXMO6OFyRpyzV3kE1IIBd4WG5/kltnzdxSCqoP8CMGs/Li+M1uF5o7lOkZVFjDs+NLesthnF66Pg/0q0Lw== dependencies: + array-buffer-byte-length "^1.0.0" + arraybuffer.prototype.slice "^1.0.1" + available-typed-arrays "^1.0.5" call-bind "^1.0.2" + es-set-tostringtag "^2.0.1" es-to-primitive "^1.2.1" - function-bind "^1.1.1" - get-intrinsic "^1.1.1" + function.prototype.name "^1.1.5" + get-intrinsic "^1.2.1" get-symbol-description "^1.0.0" + globalthis "^1.0.3" + gopd "^1.0.1" has "^1.0.3" + has-property-descriptors "^1.0.0" + has-proto "^1.0.1" has-symbols "^1.0.3" - internal-slot "^1.0.3" - is-callable "^1.2.4" + internal-slot "^1.0.5" + is-array-buffer "^3.0.2" + is-callable "^1.2.7" is-negative-zero "^2.0.2" is-regex "^1.1.4" - is-shared-array-buffer "^1.0.1" + is-shared-array-buffer "^1.0.2" is-string "^1.0.7" + is-typed-array "^1.1.10" is-weakref "^1.0.2" - object-inspect "^1.12.0" + object-inspect "^1.12.3" object-keys "^1.1.1" - object.assign "^4.1.2" - string.prototype.trimend "^1.0.4" - string.prototype.trimstart "^1.0.4" - unbox-primitive "^1.0.1" + object.assign "^4.1.4" + regexp.prototype.flags "^1.5.0" + safe-array-concat "^1.0.0" + safe-regex-test "^1.0.0" + string.prototype.trim "^1.2.7" + string.prototype.trimend "^1.0.6" + string.prototype.trimstart "^1.0.6" + typed-array-buffer "^1.0.0" + typed-array-byte-length "^1.0.0" + typed-array-byte-offset "^1.0.0" + typed-array-length "^1.0.4" + unbox-primitive "^1.0.2" + which-typed-array "^1.1.10" + +es-array-method-boxes-properly@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/es-array-method-boxes-properly/-/es-array-method-boxes-properly-1.0.0.tgz#873f3e84418de4ee19c5be752990b2e44718d09e" + integrity sha512-wd6JXUmyHmt8T5a2xreUwKcGPq6f1f+WwIJkijUqiGcJz1qqnZgP6XIK+QyIWU5lT7imeNxUll48bziG+TSYcA== + +es-set-tostringtag@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/es-set-tostringtag/-/es-set-tostringtag-2.0.1.tgz#338d502f6f674301d710b80c8592de8a15f09cd8" + integrity sha512-g3OMbtlwY3QewlqAiMLI47KywjWZoEytKr8pf6iTC8uJq5bIAH52Z9pnQ8pVL6whrCto53JZDuUIsifGeLorTg== + dependencies: + get-intrinsic "^1.1.3" + has "^1.0.3" + has-tostringtag "^1.0.0" es-to-primitive@^1.2.1: version "1.2.1" @@ -4231,9 +3978,9 @@ es-to-primitive@^1.2.1: is-symbol "^1.0.2" es5-ext@^0.10.35, es5-ext@^0.10.50: - version "0.10.59" - resolved "https://registry.yarnpkg.com/es5-ext/-/es5-ext-0.10.59.tgz#71038939730eb6f4f165f1421308fb60be363bc6" - integrity sha512-cOgyhW0tIJyQY1Kfw6Kr0viu9ZlUctVchRMZ7R0HiH3dxTSp5zJDLecwxUqPUrGKMsgBI1wd1FL+d9Jxfi4cLw== + version "0.10.62" + resolved "https://registry.yarnpkg.com/es5-ext/-/es5-ext-0.10.62.tgz#5e6adc19a6da524bf3d1e02bbc8960e5eb49a9a5" + integrity sha512-BHLqn0klhEpnOKSrzn/Xsz2UIW8j+cGmo9JLzr8BiUapV8hPL9+FliFqjwr9ngW7jWdnxv6eO+/LqyhJVqgrjA== dependencies: es6-iterator "^2.0.3" es6-symbol "^3.1.3" @@ -4242,12 +3989,17 @@ es5-ext@^0.10.35, es5-ext@^0.10.50: es6-iterator@^2.0.3: version "2.0.3" resolved "https://registry.yarnpkg.com/es6-iterator/-/es6-iterator-2.0.3.tgz#a7de889141a05a94b0854403b2d0a0fbfa98f3b7" - integrity sha1-p96IkUGgWpSwhUQDstCg+/qY87c= + integrity sha512-zw4SRzoUkd+cl+ZoE15A9o1oQd920Bb0iOJMQkQhl3jNc03YqVjAhG7scf9C5KWRU/R13Orf588uCC6525o02g== dependencies: d "1" es5-ext "^0.10.35" es6-symbol "^3.1.1" +es6-promise@^4.2.8: + version "4.2.8" + resolved "https://registry.yarnpkg.com/es6-promise/-/es6-promise-4.2.8.tgz#4eb21594c972bc40553d276e510539143db53e0a" + integrity sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w== + es6-symbol@^3.1.1, es6-symbol@^3.1.3: version "3.1.3" resolved "https://registry.yarnpkg.com/es6-symbol/-/es6-symbol-3.1.3.tgz#bad5d3c1bcdac28269f4cb331e431c78ac705d18" @@ -4264,12 +4016,12 @@ escalade@^3.1.1: escape-html@~1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/escape-html/-/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988" - integrity sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg= + integrity sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow== escape-string-regexp@1.0.5, escape-string-regexp@^1.0.2, escape-string-regexp@^1.0.5: version "1.0.5" resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" - integrity sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ= + integrity sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg== escape-string-regexp@4.0.0, escape-string-regexp@^4.0.0: version "4.0.0" @@ -4279,7 +4031,7 @@ escape-string-regexp@4.0.0, escape-string-regexp@^4.0.0: escodegen@1.8.x: version "1.8.1" resolved "https://registry.yarnpkg.com/escodegen/-/escodegen-1.8.1.tgz#5a5b53af4693110bebb0867aa3430dd3b70a1018" - integrity sha1-WltTr0aTEQvrsIZ6o0MN07cKEBg= + integrity sha512-yhi5S+mNTOuRvyW4gWlg5W1byMaQGWWSYHXsuFZ7GBo7tpyOwi2EdzMP/QWxh9hwkD2m+wDVHJsxhRIj+v/b/A== dependencies: esprima "^2.7.1" estraverse "^1.9.1" @@ -4289,9 +4041,9 @@ escodegen@1.8.x: source-map "~0.2.0" eslint-config-prettier@^8.3.0: - version "8.5.0" - resolved "https://registry.yarnpkg.com/eslint-config-prettier/-/eslint-config-prettier-8.5.0.tgz#5a81680ec934beca02c7b1a61cf8ca34b66feab1" - integrity sha512-obmWKLUNCnhtQRKc+tmnYuQl0pFU1ibYJQ5BGhTVB08bHe9wC8qUeG7c08dj9XX+AuPj1YSGSQIHl1pnDHZR0Q== + version "8.10.0" + resolved "https://registry.yarnpkg.com/eslint-config-prettier/-/eslint-config-prettier-8.10.0.tgz#3a06a662130807e2502fc3ff8b4143d8a0658e11" + integrity sha512-SM8AMJdeQqRYT9O9zguiruQZaN7+z+E4eAP9oiLNGKMtomwaB1E9dcgUD6ZAn/eQAb52USbvezbiljfZUhbJcg== eslint-plugin-mocha@^9.0.0: version "9.0.0" @@ -4308,14 +4060,6 @@ eslint-plugin-prettier@^4.0.0: dependencies: prettier-linter-helpers "^1.0.0" -eslint-scope@^4.0.3: - version "4.0.3" - resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-4.0.3.tgz#ca03833310f6889a3264781aa82e63eb9cfe7848" - integrity sha512-p7VutNr1O/QrxysMo3E45FjYDTeXBy0iTltPFNSqKAIfjDSXC+4dj+qfyuD8bfAXrW/y6lW3O76VaYNPKfpKrg== - dependencies: - esrecurse "^4.1.0" - estraverse "^4.1.1" - eslint-scope@^5.1.1: version "5.1.1" resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-5.1.1.tgz#e786e59a66cb92b3f6c1fb0d508aab174848f48c" @@ -4324,21 +4068,14 @@ eslint-scope@^5.1.1: esrecurse "^4.3.0" estraverse "^4.1.1" -eslint-scope@^7.1.1: - version "7.1.1" - resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-7.1.1.tgz#fff34894c2f65e5226d3041ac480b4513a163642" - integrity sha512-QKQM/UXpIiHcLqJ5AOyIW7XZmzjkzQXYE54n1++wb0u9V/abW3l9uQnxX8Z5Xd18xyKIMTUAyQ0k1e8pz6LUrw== +eslint-scope@^7.2.2: + version "7.2.2" + resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-7.2.2.tgz#deb4f92563390f32006894af62a22dba1c46423f" + integrity sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg== dependencies: esrecurse "^4.3.0" estraverse "^5.2.0" -eslint-utils@^1.3.1: - version "1.4.3" - resolved "https://registry.yarnpkg.com/eslint-utils/-/eslint-utils-1.4.3.tgz#74fec7c54d0776b6f67e0251040b5806564e981f" - integrity sha512-fbBN5W2xdY45KulGXmLHZ3c3FHfVYmKg0IrAKGOkT/464PQsx2UeIzfz1RmEci+KLm1bBaAzZAh8+/E+XAeZ8Q== - dependencies: - eslint-visitor-keys "^1.1.0" - eslint-utils@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/eslint-utils/-/eslint-utils-3.0.0.tgz#8aebaface7345bb33559db0a1f13a1d2d48c3672" @@ -4346,144 +4083,86 @@ eslint-utils@^3.0.0: dependencies: eslint-visitor-keys "^2.0.0" -eslint-visitor-keys@^1.0.0, eslint-visitor-keys@^1.1.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz#30ebd1ef7c2fdff01c3a4f151044af25fab0523e" - integrity sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ== - eslint-visitor-keys@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz#f65328259305927392c938ed44eb0a5c9b2bd303" integrity sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw== -eslint-visitor-keys@^3.3.0: - version "3.3.0" - resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-3.3.0.tgz#f6480fa6b1f30efe2d1968aa8ac745b862469826" - integrity sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA== - -eslint@^5.6.0: - version "5.16.0" - resolved "https://registry.yarnpkg.com/eslint/-/eslint-5.16.0.tgz#a1e3ac1aae4a3fbd8296fcf8f7ab7314cbb6abea" - integrity sha512-S3Rz11i7c8AA5JPv7xAH+dOyq/Cu/VXHiHXBPOU1k/JAM5dXqQPt3qcrhpHSorXmrpu2g0gkIBVXAqCpzfoZIg== - dependencies: - "@babel/code-frame" "^7.0.0" - ajv "^6.9.1" - chalk "^2.1.0" - cross-spawn "^6.0.5" - debug "^4.0.1" - doctrine "^3.0.0" - eslint-scope "^4.0.3" - eslint-utils "^1.3.1" - eslint-visitor-keys "^1.0.0" - espree "^5.0.1" - esquery "^1.0.1" - esutils "^2.0.2" - file-entry-cache "^5.0.1" - functional-red-black-tree "^1.0.1" - glob "^7.1.2" - globals "^11.7.0" - ignore "^4.0.6" - import-fresh "^3.0.0" - imurmurhash "^0.1.4" - inquirer "^6.2.2" - js-yaml "^3.13.0" - json-stable-stringify-without-jsonify "^1.0.1" - levn "^0.3.0" - lodash "^4.17.11" - minimatch "^3.0.4" - mkdirp "^0.5.1" - natural-compare "^1.4.0" - optionator "^0.8.2" - path-is-inside "^1.0.2" - progress "^2.0.0" - regexpp "^2.0.1" - semver "^5.5.1" - strip-ansi "^4.0.0" - strip-json-comments "^2.0.1" - table "^5.2.3" - text-table "^0.2.0" +eslint-visitor-keys@^3.3.0, eslint-visitor-keys@^3.4.1, eslint-visitor-keys@^3.4.3: + version "3.4.3" + resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz#0cd72fe8550e3c2eae156a96a4dddcd1c8ac5800" + integrity sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag== eslint@^8.23.1: - version "8.23.1" - resolved "https://registry.yarnpkg.com/eslint/-/eslint-8.23.1.tgz#cfd7b3f7fdd07db8d16b4ac0516a29c8d8dca5dc" - integrity sha512-w7C1IXCc6fNqjpuYd0yPlcTKKmHlHHktRkzmBPZ+7cvNBQuiNjx0xaMTjAJGCafJhQkrFJooREv0CtrVzmHwqg== - dependencies: - "@eslint/eslintrc" "^1.3.2" - "@humanwhocodes/config-array" "^0.10.4" - "@humanwhocodes/gitignore-to-minimatch" "^1.0.2" + version "8.49.0" + resolved "https://registry.yarnpkg.com/eslint/-/eslint-8.49.0.tgz#09d80a89bdb4edee2efcf6964623af1054bf6d42" + integrity sha512-jw03ENfm6VJI0jA9U+8H5zfl5b+FvuU3YYvZRdZHOlU2ggJkxrlkJH4HcDrZpj6YwD8kuYqvQM8LyesoazrSOQ== + dependencies: + "@eslint-community/eslint-utils" "^4.2.0" + "@eslint-community/regexpp" "^4.6.1" + "@eslint/eslintrc" "^2.1.2" + "@eslint/js" "8.49.0" + "@humanwhocodes/config-array" "^0.11.11" "@humanwhocodes/module-importer" "^1.0.1" - ajv "^6.10.0" + "@nodelib/fs.walk" "^1.2.8" + ajv "^6.12.4" chalk "^4.0.0" cross-spawn "^7.0.2" debug "^4.3.2" doctrine "^3.0.0" escape-string-regexp "^4.0.0" - eslint-scope "^7.1.1" - eslint-utils "^3.0.0" - eslint-visitor-keys "^3.3.0" - espree "^9.4.0" - esquery "^1.4.0" + eslint-scope "^7.2.2" + eslint-visitor-keys "^3.4.3" + espree "^9.6.1" + esquery "^1.4.2" esutils "^2.0.2" fast-deep-equal "^3.1.3" file-entry-cache "^6.0.1" find-up "^5.0.0" - glob-parent "^6.0.1" - globals "^13.15.0" - globby "^11.1.0" - grapheme-splitter "^1.0.4" + glob-parent "^6.0.2" + globals "^13.19.0" + graphemer "^1.4.0" ignore "^5.2.0" - import-fresh "^3.0.0" imurmurhash "^0.1.4" is-glob "^4.0.0" - js-sdsl "^4.1.4" + is-path-inside "^3.0.3" js-yaml "^4.1.0" json-stable-stringify-without-jsonify "^1.0.1" levn "^0.4.1" lodash.merge "^4.6.2" minimatch "^3.1.2" natural-compare "^1.4.0" - optionator "^0.9.1" - regexpp "^3.2.0" + optionator "^0.9.3" strip-ansi "^6.0.1" - strip-json-comments "^3.1.0" text-table "^0.2.0" -espree@^5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/espree/-/espree-5.0.1.tgz#5d6526fa4fc7f0788a5cf75b15f30323e2f81f7a" - integrity sha512-qWAZcWh4XE/RwzLJejfcofscgMc9CamR6Tn1+XRXNzrvUSSbiAjGOI/fggztjIi7y9VLPqnICMIPiGyr8JaZ0A== - dependencies: - acorn "^6.0.7" - acorn-jsx "^5.0.0" - eslint-visitor-keys "^1.0.0" - -espree@^9.4.0: - version "9.4.0" - resolved "https://registry.yarnpkg.com/espree/-/espree-9.4.0.tgz#cd4bc3d6e9336c433265fc0aa016fc1aaf182f8a" - integrity sha512-DQmnRpLj7f6TgN/NYb0MTzJXL+vJF9h3pHy4JhCIs3zwcgez8xmGg3sXHcEO97BrmO2OSvCwMdfdlyl+E9KjOw== +espree@^9.6.0, espree@^9.6.1: + version "9.6.1" + resolved "https://registry.yarnpkg.com/espree/-/espree-9.6.1.tgz#a2a17b8e434690a5432f2f8018ce71d331a48c6f" + integrity sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ== dependencies: - acorn "^8.8.0" + acorn "^8.9.0" acorn-jsx "^5.3.2" - eslint-visitor-keys "^3.3.0" + eslint-visitor-keys "^3.4.1" esprima@2.7.x, esprima@^2.7.1: version "2.7.3" resolved "https://registry.yarnpkg.com/esprima/-/esprima-2.7.3.tgz#96e3b70d5779f6ad49cd032673d1c312767ba581" - integrity sha1-luO3DVd59q1JzQMmc9HDEnZ7pYE= + integrity sha512-OarPfz0lFCiW4/AV2Oy1Rp9qu0iusTKqykwTspGCZtPxmF81JR4MmIebvF1F9+UOKth2ZubLQ4XGGaU+hSn99A== esprima@^4.0.0: version "4.0.1" resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71" integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A== -esquery@^1.0.1, esquery@^1.4.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.4.0.tgz#2148ffc38b82e8c7057dfed48425b3e61f0f24a5" - integrity sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w== +esquery@^1.4.2: + version "1.5.0" + resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.5.0.tgz#6ce17738de8577694edd7361c57182ac8cb0db0b" + integrity sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg== dependencies: estraverse "^5.1.0" -esrecurse@^4.1.0, esrecurse@^4.3.0: +esrecurse@^4.3.0: version "4.3.0" resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.3.0.tgz#7ad7964d679abb28bee72cec63758b1c5d2c9921" integrity sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag== @@ -4493,7 +4172,7 @@ esrecurse@^4.1.0, esrecurse@^4.3.0: estraverse@^1.9.1: version "1.9.3" resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-1.9.3.tgz#af67f2dc922582415950926091a4005d29c9bb44" - integrity sha1-r2fy3JIlgkFZUJJgkaQAXSnJu0Q= + integrity sha512-25w1fMXQrGdoquWnScXZGckOv+Wes+JDnuN/+7ex3SauFRS72r2lFDec0EKPt2YD1wUJ/IrfEex+9yp4hfSOJA== estraverse@^4.1.1: version "4.3.0" @@ -4513,7 +4192,7 @@ esutils@^2.0.2: etag@~1.8.1: version "1.8.1" resolved "https://registry.yarnpkg.com/etag/-/etag-1.8.1.tgz#41ae2eeb65efa62268aebfea83ac7d79299b0887" - integrity sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc= + integrity sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg== eth-block-tracker@^3.0.0: version "3.0.1" @@ -4531,12 +4210,12 @@ eth-block-tracker@^3.0.0: eth-ens-namehash@2.0.8, eth-ens-namehash@^2.0.8: version "2.0.8" resolved "https://registry.yarnpkg.com/eth-ens-namehash/-/eth-ens-namehash-2.0.8.tgz#229ac46eca86d52e0c991e7cb2aef83ff0f68bcf" - integrity sha1-IprEbsqG1S4MmR58sq74P/D2i88= + integrity sha512-VWEI1+KJfz4Km//dadyvBBoBeSQ0MHTXPvr8UIXiLW6IanxvAV+DmlZAijZwAyggqGUfwQBeHf7tc9wzc1piSw== dependencies: idna-uts46-hx "^2.3.1" js-sha3 "^0.5.7" -eth-gas-reporter@^0.2.24: +eth-gas-reporter@^0.2.25: version "0.2.25" resolved "https://registry.yarnpkg.com/eth-gas-reporter/-/eth-gas-reporter-0.2.25.tgz#546dfa946c1acee93cb1a94c2a1162292d6ff566" integrity sha512-1fRgyE4xUB8SoqLgN3eDfpDfwEfRxh2Sz1b7wzFbyQA+9TekMmvSjjoRu9SKcSVyK+vLkLIsVbJDsTWjw195OQ== @@ -4610,7 +4289,7 @@ eth-lib@^0.1.26: eth-query@^2.0.2, eth-query@^2.1.0, eth-query@^2.1.2: version "2.1.2" resolved "https://registry.yarnpkg.com/eth-query/-/eth-query-2.1.2.tgz#d6741d9000106b51510c72db92d6365456a6da5e" - integrity sha1-1nQdkAAQa1FRDHLbktY2VFam2l4= + integrity sha512-srES0ZcvwkR/wd5OQBRA1bIJMww1skfGS0s8wlwK3/oNP4+wnds60krvu5R1QbpRQjMmpG5OMIWro5s7gvDPsA== dependencies: json-rpc-random-id "^1.0.0" xtend "^4.0.1" @@ -4630,7 +4309,7 @@ eth-sig-util@3.0.0: eth-sig-util@^1.4.2: version "1.4.2" resolved "https://registry.yarnpkg.com/eth-sig-util/-/eth-sig-util-1.4.2.tgz#8d958202c7edbaae839707fba6f09ff327606210" - integrity sha1-jZWCAsftuq6Dlwf7pvCf8ydgYhA= + integrity sha512-iNZ576iTOGcfllftB73cPB5AN+XUQAT/T8xzsILsghXC1o8gJUqe3RHlcDqagu+biFpYQ61KQrZZJza8eRSYqw== dependencies: ethereumjs-abi "git+https://github.com/ethereumjs/ethereumjs-abi.git" ethereumjs-util "^5.1.1" @@ -4676,9 +4355,9 @@ ethereum-common@0.2.0: ethereum-common@^0.0.18: version "0.0.18" resolved "https://registry.yarnpkg.com/ethereum-common/-/ethereum-common-0.0.18.tgz#2fdc3576f232903358976eb39da783213ff9523f" - integrity sha1-L9w1dvIykDNYl26znaeDIT/5Uj8= + integrity sha512-EoltVQTRNg2Uy4o84qpa2aXymXDJhxm7eos/ACOg0DG4baAbMjhbdAEsx9GeE8sC3XCxnYvrrzZDH8D8MtA2iQ== -ethereum-cryptography@^0.1.2, ethereum-cryptography@^0.1.3: +ethereum-cryptography@0.1.3, ethereum-cryptography@^0.1.3: version "0.1.3" resolved "https://registry.yarnpkg.com/ethereum-cryptography/-/ethereum-cryptography-0.1.3.tgz#8d6143cfc3d74bf79bbd8edecdf29e4ae20dd191" integrity sha512-w8/4x1SGGzc+tO97TASLja6SLd3fRIK2tLVcV2Gx4IB21hE19atll5Cq9o3d0ZmAYC/8aw0ipieTSiekAea4SQ== @@ -4700,14 +4379,24 @@ ethereum-cryptography@^0.1.2, ethereum-cryptography@^0.1.3: setimmediate "^1.0.5" ethereum-cryptography@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/ethereum-cryptography/-/ethereum-cryptography-1.0.3.tgz#b1f8f4e702434b2016248dbb2f9fdd60c54772d8" - integrity sha512-NQLTW0x0CosoVb/n79x/TRHtfvS3hgNUPTUSCu0vM+9k6IIhHFFrAOJReneexjZsoZxMjJHnJn4lrE8EbnSyqQ== + version "1.2.0" + resolved "https://registry.yarnpkg.com/ethereum-cryptography/-/ethereum-cryptography-1.2.0.tgz#5ccfa183e85fdaf9f9b299a79430c044268c9b3a" + integrity sha512-6yFQC9b5ug6/17CQpCyE3k9eKBMdhyVjzUy1WkiuY/E4vj/SXDBbCw8QEIaXqf0Mf2SnY6RmpDcwlUmBSS0EJw== + dependencies: + "@noble/hashes" "1.2.0" + "@noble/secp256k1" "1.7.1" + "@scure/bip32" "1.1.5" + "@scure/bip39" "1.1.1" + +ethereum-cryptography@^2.0.0, ethereum-cryptography@^2.1.2: + version "2.1.2" + resolved "https://registry.yarnpkg.com/ethereum-cryptography/-/ethereum-cryptography-2.1.2.tgz#18fa7108622e56481157a5cb7c01c0c6a672eb67" + integrity sha512-Z5Ba0T0ImZ8fqXrJbpHcbpAvIswRte2wGNR/KePnu8GbbvgJ47lMxT/ZZPG6i9Jaht4azPDop4HaM00J0J59ug== dependencies: - "@noble/hashes" "1.0.0" - "@noble/secp256k1" "1.5.5" - "@scure/bip32" "1.0.1" - "@scure/bip39" "1.0.0" + "@noble/curves" "1.1.0" + "@noble/hashes" "1.3.1" + "@scure/bip32" "1.3.1" + "@scure/bip39" "1.2.1" ethereum-waffle@^3.4.0: version "3.4.4" @@ -4723,7 +4412,7 @@ ethereum-waffle@^3.4.0: ethereumjs-abi@0.6.5: version "0.6.5" resolved "https://registry.yarnpkg.com/ethereumjs-abi/-/ethereumjs-abi-0.6.5.tgz#5a637ef16ab43473fa72a29ad90871405b3f5241" - integrity sha1-WmN+8Wq0NHP6cqKa2QhxQFs/UkE= + integrity sha512-rCjJZ/AE96c/AAZc6O3kaog4FhOsAViaysBxqJNy2+LHP0ttH0zkZ7nXdVHOAyt6lFwLO0nlCwWszysG/ao1+g== dependencies: bn.js "^4.10.0" ethereumjs-util "^4.3.0" @@ -4862,21 +4551,10 @@ ethereumjs-util@^5.0.0, ethereumjs-util@^5.0.1, ethereumjs-util@^5.1.1, ethereum rlp "^2.0.0" safe-buffer "^5.1.1" -ethereumjs-util@^7.0.10: - version "7.1.3" - resolved "https://registry.yarnpkg.com/ethereumjs-util/-/ethereumjs-util-7.1.3.tgz#b55d7b64dde3e3e45749e4c41288238edec32d23" - integrity sha512-y+82tEbyASO0K0X1/SRhbJJoAlfcvq8JbrG4a5cjrOks7HS/36efU/0j2flxCPOUM++HFahk33kr/ZxyC4vNuw== - dependencies: - "@types/bn.js" "^5.1.0" - bn.js "^5.1.2" - create-hash "^1.1.2" - ethereum-cryptography "^0.1.3" - rlp "^2.2.4" - -ethereumjs-util@^7.0.2, ethereumjs-util@^7.1.0, ethereumjs-util@^7.1.1, ethereumjs-util@^7.1.3, ethereumjs-util@^7.1.4: - version "7.1.4" - resolved "https://registry.yarnpkg.com/ethereumjs-util/-/ethereumjs-util-7.1.4.tgz#a6885bcdd92045b06f596c7626c3e89ab3312458" - integrity sha512-p6KmuPCX4mZIqsQzXfmSx9Y0l2hqf+VkAiwSisW3UKUFdk8ZkAt+AYaor83z2nSi6CU2zSsXMlD80hAbNEGM0A== +ethereumjs-util@^7.0.10, ethereumjs-util@^7.0.2, ethereumjs-util@^7.1.0, ethereumjs-util@^7.1.1, ethereumjs-util@^7.1.2, ethereumjs-util@^7.1.5: + version "7.1.5" + resolved "https://registry.yarnpkg.com/ethereumjs-util/-/ethereumjs-util-7.1.5.tgz#9ecf04861e4fbbeed7465ece5f23317ad1129181" + integrity sha512-SDl5kKrQAudFBUe5OJM9Ac6WmMyYmXX/6sTmLZ3ffG2eY6ZIGBes3pEDxNN6V72WyOw4CPD5RomKdsa8DAAwLg== dependencies: "@types/bn.js" "^5.1.0" bn.js "^5.1.2" @@ -4952,43 +4630,7 @@ ethers@^4.0.32, ethers@^4.0.40: uuid "2.0.1" xmlhttprequest "1.8.0" -ethers@^5.0.1, ethers@^5.0.2: - version "5.6.2" - resolved "https://registry.yarnpkg.com/ethers/-/ethers-5.6.2.tgz#e75bac7f038c5e0fdde667dba62fc223924143a2" - integrity sha512-EzGCbns24/Yluu7+ToWnMca3SXJ1Jk1BvWB7CCmVNxyOeM4LLvw2OLuIHhlkhQk1dtOcj9UMsdkxUh8RiG1dxQ== - dependencies: - "@ethersproject/abi" "5.6.0" - "@ethersproject/abstract-provider" "5.6.0" - "@ethersproject/abstract-signer" "5.6.0" - "@ethersproject/address" "5.6.0" - "@ethersproject/base64" "5.6.0" - "@ethersproject/basex" "5.6.0" - "@ethersproject/bignumber" "5.6.0" - "@ethersproject/bytes" "5.6.1" - "@ethersproject/constants" "5.6.0" - "@ethersproject/contracts" "5.6.0" - "@ethersproject/hash" "5.6.0" - "@ethersproject/hdnode" "5.6.0" - "@ethersproject/json-wallets" "5.6.0" - "@ethersproject/keccak256" "5.6.0" - "@ethersproject/logger" "5.6.0" - "@ethersproject/networks" "5.6.1" - "@ethersproject/pbkdf2" "5.6.0" - "@ethersproject/properties" "5.6.0" - "@ethersproject/providers" "5.6.2" - "@ethersproject/random" "5.6.0" - "@ethersproject/rlp" "5.6.0" - "@ethersproject/sha2" "5.6.0" - "@ethersproject/signing-key" "5.6.0" - "@ethersproject/solidity" "5.6.0" - "@ethersproject/strings" "5.6.0" - "@ethersproject/transactions" "5.6.0" - "@ethersproject/units" "5.6.0" - "@ethersproject/wallet" "5.6.0" - "@ethersproject/web" "5.6.0" - "@ethersproject/wordlists" "5.6.0" - -ethers@^5.1.0: +ethers@^5.0.1, ethers@^5.0.2, ethers@^5.1.0, ethers@^5.5.2, ethers@^5.5.3, ethers@^5.6.9, ethers@^5.7.1: version "5.7.2" resolved "https://registry.yarnpkg.com/ethers/-/ethers-5.7.2.tgz#3a7deeabbb8c030d4126b24f84e525466145872e" integrity sha512-wswUsmWo1aOK8rR7DIKiWSw9DbLWe6x98Jrn8wcTflTVvaXhAMaB5zGAXy0GYQEQp9iO1iSHWVyARQm11zUtyg== @@ -5024,82 +4666,10 @@ ethers@^5.1.0: "@ethersproject/web" "5.7.1" "@ethersproject/wordlists" "5.7.0" -ethers@^5.5.2: - version "5.6.4" - resolved "https://registry.yarnpkg.com/ethers/-/ethers-5.6.4.tgz#23629e9a7d4bc5802dfb53d4da420d738744b53c" - integrity sha512-62UIfxAQXdf67TeeOaoOoPctm5hUlYgfd0iW3wxfj7qRYKDcvvy0f+sJ3W2/Pyx77R8dblvejA8jokj+lS+ATQ== - dependencies: - "@ethersproject/abi" "5.6.1" - "@ethersproject/abstract-provider" "5.6.0" - "@ethersproject/abstract-signer" "5.6.0" - "@ethersproject/address" "5.6.0" - "@ethersproject/base64" "5.6.0" - "@ethersproject/basex" "5.6.0" - "@ethersproject/bignumber" "5.6.0" - "@ethersproject/bytes" "5.6.1" - "@ethersproject/constants" "5.6.0" - "@ethersproject/contracts" "5.6.0" - "@ethersproject/hash" "5.6.0" - "@ethersproject/hdnode" "5.6.0" - "@ethersproject/json-wallets" "5.6.0" - "@ethersproject/keccak256" "5.6.0" - "@ethersproject/logger" "5.6.0" - "@ethersproject/networks" "5.6.2" - "@ethersproject/pbkdf2" "5.6.0" - "@ethersproject/properties" "5.6.0" - "@ethersproject/providers" "5.6.4" - "@ethersproject/random" "5.6.0" - "@ethersproject/rlp" "5.6.0" - "@ethersproject/sha2" "5.6.0" - "@ethersproject/signing-key" "5.6.0" - "@ethersproject/solidity" "5.6.0" - "@ethersproject/strings" "5.6.0" - "@ethersproject/transactions" "5.6.0" - "@ethersproject/units" "5.6.0" - "@ethersproject/wallet" "5.6.0" - "@ethersproject/web" "5.6.0" - "@ethersproject/wordlists" "5.6.0" - -ethers@^5.6.9: - version "5.7.0" - resolved "https://registry.yarnpkg.com/ethers/-/ethers-5.7.0.tgz#0055da174b9e076b242b8282638bc94e04b39835" - integrity sha512-5Xhzp2ZQRi0Em+0OkOcRHxPzCfoBfgtOQA+RUylSkuHbhTEaQklnYi2hsWbRgs3ztJsXVXd9VKBcO1ScWL8YfA== - dependencies: - "@ethersproject/abi" "5.7.0" - "@ethersproject/abstract-provider" "5.7.0" - "@ethersproject/abstract-signer" "5.7.0" - "@ethersproject/address" "5.7.0" - "@ethersproject/base64" "5.7.0" - "@ethersproject/basex" "5.7.0" - "@ethersproject/bignumber" "5.7.0" - "@ethersproject/bytes" "5.7.0" - "@ethersproject/constants" "5.7.0" - "@ethersproject/contracts" "5.7.0" - "@ethersproject/hash" "5.7.0" - "@ethersproject/hdnode" "5.7.0" - "@ethersproject/json-wallets" "5.7.0" - "@ethersproject/keccak256" "5.7.0" - "@ethersproject/logger" "5.7.0" - "@ethersproject/networks" "5.7.0" - "@ethersproject/pbkdf2" "5.7.0" - "@ethersproject/properties" "5.7.0" - "@ethersproject/providers" "5.7.0" - "@ethersproject/random" "5.7.0" - "@ethersproject/rlp" "5.7.0" - "@ethersproject/sha2" "5.7.0" - "@ethersproject/signing-key" "5.7.0" - "@ethersproject/solidity" "5.7.0" - "@ethersproject/strings" "5.7.0" - "@ethersproject/transactions" "5.7.0" - "@ethersproject/units" "5.7.0" - "@ethersproject/wallet" "5.7.0" - "@ethersproject/web" "5.7.0" - "@ethersproject/wordlists" "5.7.0" - ethjs-unit@0.1.6: version "0.1.6" resolved "https://registry.yarnpkg.com/ethjs-unit/-/ethjs-unit-0.1.6.tgz#c665921e476e87bce2a9d588a6fe0405b2c41699" - integrity sha1-xmWSHkduh7ziqdWIpv4EBbLEFpk= + integrity sha512-/Sn9Y0oKl0uqQuvgFk/zQgR7aw1g36qX/jzSQ5lSwlO0GigPymk4eGQfeNTD03w1dPOqfz8V77Cy43jH56pagw== dependencies: bn.js "4.11.6" number-to-bn "1.7.0" @@ -5112,11 +4682,6 @@ ethjs-util@0.1.6, ethjs-util@^0.1.3, ethjs-util@^0.1.6: is-hex-prefixed "1.0.0" strip-hex-prefix "1.0.0" -event-target-shim@^5.0.0: - version "5.0.1" - resolved "https://registry.yarnpkg.com/event-target-shim/-/event-target-shim-5.0.1.tgz#5d4d3ebdf9583d63a5333ce2deb7480ab2b05789" - integrity sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ== - eventemitter3@4.0.4: version "4.0.4" resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-4.0.4.tgz#b5463ace635a083d018bdc7c917b4c5f10a85384" @@ -5138,7 +4703,7 @@ evp_bytestokey@^1.0.0, evp_bytestokey@^1.0.3: expand-brackets@^2.1.4: version "2.1.4" resolved "https://registry.yarnpkg.com/expand-brackets/-/expand-brackets-2.1.4.tgz#b77735e315ce30f6b6eff0f83b04151a22449622" - integrity sha1-t3c14xXOMPa27/D4OwQVGiJEliI= + integrity sha512-w/ozOKR9Obk3qoWeY/WDi6MFta9AoMR+zud60mdnbniMcBxRuFJyDt2LdX/14A1UABeqk+Uk+LDfUpvoGKppZA== dependencies: debug "^2.3.3" define-property "^0.2.5" @@ -5149,59 +4714,60 @@ expand-brackets@^2.1.4: to-regex "^3.0.1" express@^4.14.0: - version "4.17.3" - resolved "https://registry.yarnpkg.com/express/-/express-4.17.3.tgz#f6c7302194a4fb54271b73a1fe7a06478c8f85a1" - integrity sha512-yuSQpz5I+Ch7gFrPCk4/c+dIBKlQUxtgwqzph132bsT6qhuzss6I8cLJQz7B3rFblzd6wtcI0ZbGltH/C4LjUg== + version "4.18.2" + resolved "https://registry.yarnpkg.com/express/-/express-4.18.2.tgz#3fabe08296e930c796c19e3c516979386ba9fd59" + integrity sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ== dependencies: accepts "~1.3.8" array-flatten "1.1.1" - body-parser "1.19.2" + body-parser "1.20.1" content-disposition "0.5.4" content-type "~1.0.4" - cookie "0.4.2" + cookie "0.5.0" cookie-signature "1.0.6" debug "2.6.9" - depd "~1.1.2" + depd "2.0.0" encodeurl "~1.0.2" escape-html "~1.0.3" etag "~1.8.1" - finalhandler "~1.1.2" + finalhandler "1.2.0" fresh "0.5.2" + http-errors "2.0.0" merge-descriptors "1.0.1" methods "~1.1.2" - on-finished "~2.3.0" + on-finished "2.4.1" parseurl "~1.3.3" path-to-regexp "0.1.7" proxy-addr "~2.0.7" - qs "6.9.7" + qs "6.11.0" range-parser "~1.2.1" safe-buffer "5.2.1" - send "0.17.2" - serve-static "1.14.2" + send "0.18.0" + serve-static "1.15.0" setprototypeof "1.2.0" - statuses "~1.5.0" + statuses "2.0.1" type-is "~1.6.18" utils-merge "1.0.1" vary "~1.1.2" ext@^1.1.2: - version "1.6.0" - resolved "https://registry.yarnpkg.com/ext/-/ext-1.6.0.tgz#3871d50641e874cc172e2b53f919842d19db4c52" - integrity sha512-sdBImtzkq2HpkdRLtlLWDa6w4DX22ijZLKx8BMPUuKe1c5lbN6xwQDQCxSfxBQnHZ13ls/FH0MQZx/q/gr6FQg== + version "1.7.0" + resolved "https://registry.yarnpkg.com/ext/-/ext-1.7.0.tgz#0ea4383c0103d60e70be99e9a7f11027a33c4f5f" + integrity sha512-6hxeJYaL110a9b5TEJSj0gojyHQAmA2ch5Os+ySCiA1QGdS697XWY1pzsrSjqA9LDEEgdB/KypIlR59RcLuHYw== dependencies: - type "^2.5.0" + type "^2.7.2" extend-shallow@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-2.0.1.tgz#51af7d614ad9a9f610ea1bafbb989d6b1c56890f" - integrity sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8= + integrity sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug== dependencies: is-extendable "^0.1.0" extend-shallow@^3.0.0, extend-shallow@^3.0.2: version "3.0.2" resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-3.0.2.tgz#26a71aaf073b39fb2127172746131c2704028db8" - integrity sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg= + integrity sha512-BwY5b5Ql4+qZoefgMj2NUmx+tehVTH/Kf4k1ZEtOHNFcm2wSxMRo992l6X3TIgni2eZVTZ85xMOjF31fwZAj6Q== dependencies: assign-symbols "^1.0.0" is-extendable "^1.0.1" @@ -5211,15 +4777,6 @@ extend@~3.0.2: resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.2.tgz#f8b1136b4071fbd8eb140aff858b1019ec2915fa" integrity sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g== -external-editor@^3.0.3: - version "3.1.0" - resolved "https://registry.yarnpkg.com/external-editor/-/external-editor-3.1.0.tgz#cb03f740befae03ea4d283caed2741a83f335495" - integrity sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew== - dependencies: - chardet "^0.7.0" - iconv-lite "^0.4.24" - tmp "^0.0.33" - extglob@^2.0.4: version "2.0.4" resolved "https://registry.yarnpkg.com/extglob/-/extglob-2.0.4.tgz#ad00fe4dc612a9232e8718711dc5cb5ab0285543" @@ -5248,7 +4805,7 @@ extract-zip@2.0.1: extsprintf@1.3.0: version "1.3.0" resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.3.0.tgz#96918440e3041a7a414f8c52e3c574eb3c3e1e05" - integrity sha1-lpGEQOMEGnpBT4xS48V06zw+HgU= + integrity sha512-11Ndz7Nv+mvAC1j0ktTa7fAb0vLyGGX+rMHNBYQviQDGU0Hw7lhctJANqbPhu9nV9/izT/IntTgZ7Im/9LJs9g== extsprintf@^1.2.0: version "1.4.1" @@ -5258,7 +4815,7 @@ extsprintf@^1.2.0: fake-merkle-patricia-tree@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/fake-merkle-patricia-tree/-/fake-merkle-patricia-tree-1.0.1.tgz#4b8c3acfb520afadf9860b1f14cd8ce3402cddd3" - integrity sha1-S4w6z7Ugr635hgsfFM2M40As3dM= + integrity sha512-Tgq37lkc9pUIgIKw5uitNUKcgcYL3R6JvXtKQbOf/ZSavXbidsksgp/pAY6p//uhw0I4yoMsvTSovvVIsk/qxA== dependencies: checkpoint-store "^1.1.0" @@ -5267,26 +4824,15 @@ fast-deep-equal@^3.1.1, fast-deep-equal@^3.1.3: resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525" integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== -fast-diff@^1.1.2: - version "1.2.0" - resolved "https://registry.yarnpkg.com/fast-diff/-/fast-diff-1.2.0.tgz#73ee11982d86caaf7959828d519cfe927fac5f03" - integrity sha512-xJuoT5+L99XlZ8twedaRf6Ax2TgQVxvgZOYoPKqZufmJib0tL2tegPBOZb1pVNgIhlqDlA0eO0c3wBvQcmzx4w== - -fast-glob@^3.0.3: - version "3.2.7" - resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.2.7.tgz#fd6cb7a2d7e9aa7a7846111e85a196d6b2f766a1" - integrity sha512-rYGMRwip6lUMvYD3BTScMwT1HtAs2d71SMv66Vrxs0IekGZEjhM0pcMfjQPnknBt2zeCwQMEupiN02ZP4DiT1Q== - dependencies: - "@nodelib/fs.stat" "^2.0.2" - "@nodelib/fs.walk" "^1.2.3" - glob-parent "^5.1.2" - merge2 "^1.3.0" - micromatch "^4.0.4" +fast-diff@^1.1.2, fast-diff@^1.2.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/fast-diff/-/fast-diff-1.3.0.tgz#ece407fa550a64d638536cd727e129c61616e0f0" + integrity sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw== -fast-glob@^3.2.9: - version "3.2.12" - resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.2.12.tgz#7f39ec99c2e6ab030337142da9e0c18f37afae80" - integrity sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w== +fast-glob@^3.0.3, fast-glob@^3.2.9: + version "3.3.1" + resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.3.1.tgz#784b4e897340f3dbbef17413b3f11acf03c874c4" + integrity sha512-kNFPyjhh5cKjrUltxs+wFx+ZkbRaxxmZ+X0ZU31SOsxCEtP9VPgtq2teZw1DebupL5GmDaNQ6yKMMVcM41iqDg== dependencies: "@nodelib/fs.stat" "^2.0.2" "@nodelib/fs.walk" "^1.2.3" @@ -5302,12 +4848,12 @@ fast-json-stable-stringify@^2.0.0: fast-levenshtein@^2.0.6, fast-levenshtein@~2.0.6: version "2.0.6" resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917" - integrity sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc= + integrity sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw== fastq@^1.6.0: - version "1.13.0" - resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.13.0.tgz#616760f88a7526bdfc596b7cab8c18938c36b98c" - integrity sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw== + version "1.15.0" + resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.15.0.tgz#d04d07c6a2a68fe4599fea8d2e103a937fae6b3a" + integrity sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw== dependencies: reusify "^1.0.4" @@ -5321,24 +4867,10 @@ fd-slicer@~1.1.0: fetch-ponyfill@^4.0.0: version "4.1.0" resolved "https://registry.yarnpkg.com/fetch-ponyfill/-/fetch-ponyfill-4.1.0.tgz#ae3ce5f732c645eab87e4ae8793414709b239893" - integrity sha1-rjzl9zLGReq4fkroeTQUcJsjmJM= + integrity sha512-knK9sGskIg2T7OnYLdZ2hZXn0CtDrAIBxYQLpmEf0BqfdWnwmM1weccUl5+4EdA44tzNSFAuxITPbXtPehUB3g== dependencies: node-fetch "~1.7.1" -figures@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/figures/-/figures-2.0.0.tgz#3ab1a2d2a62c8bfb431a0c94cb797a2fce27c962" - integrity sha1-OrGi0qYsi/tDGgyUy3l6L84nyWI= - dependencies: - escape-string-regexp "^1.0.5" - -file-entry-cache@^5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-5.0.1.tgz#ca0f6efa6dd3d561333fb14515065c2fafdf439c" - integrity sha512-bCg29ictuBaKUwwArK4ouCaqDgLZcysCFLmM/Yn/FDoqndh/9vNuQfXRDvTuXKLxfD/JtZQGKFT8MGcJBK644g== - dependencies: - flat-cache "^2.0.1" - file-entry-cache@^6.0.1: version "6.0.1" resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-6.0.1.tgz#211b2dd9659cb0394b073e7323ac3c933d522027" @@ -5354,7 +4886,7 @@ file-url@^3.0.0: fill-range@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-4.0.0.tgz#d544811d428f98eb06a63dc402d2403c328c38f7" - integrity sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc= + integrity sha512-VcpLTWqWDiTerugjj8e3+esbg+skS3M9e54UuR3iCeIDMXCLTsAH8hTSzDQU/X6/6t3eYkOKoZSef2PlU6U1XQ== dependencies: extend-shallow "^2.0.1" is-number "^3.0.0" @@ -5368,23 +4900,23 @@ fill-range@^7.0.1: dependencies: to-regex-range "^5.0.1" -finalhandler@~1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-1.1.2.tgz#b7e7d000ffd11938d0fdb053506f6ebabe9f587d" - integrity sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA== +finalhandler@1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-1.2.0.tgz#7d23fe5731b207b4640e4fcd00aec1f9207a7b32" + integrity sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg== dependencies: debug "2.6.9" encodeurl "~1.0.2" escape-html "~1.0.3" - on-finished "~2.3.0" + on-finished "2.4.1" parseurl "~1.3.3" - statuses "~1.5.0" + statuses "2.0.1" unpipe "~1.0.0" find-replace@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/find-replace/-/find-replace-1.0.3.tgz#b88e7364d2d9c959559f388c66670d6130441fa0" - integrity sha1-uI5zZNLZyVlVnziMZmcNYTBEH6A= + integrity sha512-KrUnjzDCD9426YnCP56zGYy/eieTnhtK6Vn++j+JJzmlsWWwEkDnsyVF575spT6HJ6Ow9tlbT3TQTDsa+O4UWA== dependencies: array-back "^1.0.4" test-value "^2.1.0" @@ -5414,7 +4946,7 @@ find-up@5.0.0, find-up@^5.0.0: find-up@^1.0.0: version "1.1.2" resolved "https://registry.yarnpkg.com/find-up/-/find-up-1.1.2.tgz#6b2e9822b1a2ce0a60ab64d610eccad53cb24d0f" - integrity sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8= + integrity sha512-jvElSjyuo4EMQGoTwo1uJU5pQMwTW5lS1x05zzfJuTIyLR3zwO27LYrxNg+dlvKpGOuGy/MzBdXh80g0ve5+HA== dependencies: path-exists "^2.0.0" pinkie-promise "^2.0.0" @@ -5422,7 +4954,7 @@ find-up@^1.0.0: find-up@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/find-up/-/find-up-2.1.0.tgz#45d1b7e506c717ddd482775a2b77920a3c0c57a7" - integrity sha1-RdG35QbHF93UgndaK3eSCjwMV6c= + integrity sha512-NWzkk0jSJtTt08+FBFMvXoeZnOJD+jTtsRmBYbAIzJdX6l7dLgR7CTubCM5/eDdPUBvLCeVasP1brfVR/9/EZQ== dependencies: locate-path "^2.0.0" @@ -5449,21 +4981,13 @@ find-yarn-workspace-root@^2.0.0: dependencies: micromatch "^4.0.2" -flat-cache@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-2.0.1.tgz#5d296d6f04bda44a4630a301413bdbc2ec085ec0" - integrity sha512-LoQe6yDuUMDzQAEH8sgmh4Md6oZnc/7PjtwjNFSzveXqSHt6ka9fPBuso7IGf9Rz4uqnSnWiFH2B/zj24a5ReA== - dependencies: - flatted "^2.0.0" - rimraf "2.6.3" - write "1.0.3" - flat-cache@^3.0.4: - version "3.0.4" - resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-3.0.4.tgz#61b0338302b2fe9f957dcc32fc2a87f1c3048b11" - integrity sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg== + version "3.1.0" + resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-3.1.0.tgz#0e54ab4a1a60fe87e2946b6b00657f1c99e1af3f" + integrity sha512-OHx4Qwrrt0E4jEIcI5/Xb+f+QmJYNj2rrK8wiIdQOIrB9WrrJL8cjZvXdXuBTkkEwEqLycb5BeZDV1o2i9bTew== dependencies: - flatted "^3.1.0" + flatted "^3.2.7" + keyv "^4.5.3" rimraf "^3.0.2" flat@^4.1.0: @@ -5478,12 +5002,7 @@ flat@^5.0.2: resolved "https://registry.yarnpkg.com/flat/-/flat-5.0.2.tgz#8ca6fe332069ffa9d324c327198c598259ceb241" integrity sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ== -flatted@^2.0.0: - version "2.0.2" - resolved "https://registry.yarnpkg.com/flatted/-/flatted-2.0.2.tgz#4575b21e2bcee7434aa9be662f4b7b5f9c2b5138" - integrity sha512-r5wGx7YeOwNWNlCA0wQ86zKyDLMQr+/RB8xy74M4hTphfmjlijTSSXGuH8rnvKZnfT9i+75zmd8jcKdMR4O6jA== - -flatted@^3.1.0: +flatted@^3.2.7: version "3.2.7" resolved "https://registry.yarnpkg.com/flatted/-/flatted-3.2.7.tgz#609f39207cb614b89d0765b477cb2d437fbf9787" integrity sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ== @@ -5491,24 +5010,19 @@ flatted@^3.1.0: flow-stoplight@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/flow-stoplight/-/flow-stoplight-1.0.0.tgz#4a292c5bcff8b39fa6cc0cb1a853d86f27eeff7b" - integrity sha1-SiksW8/4s5+mzAyxqFPYbyfu/3s= + integrity sha512-rDjbZUKpN8OYhB0IE/vY/I8UWO/602IIJEU/76Tv4LvYnwHCk0BCsvz4eRr9n+FQcri7L5cyaXOo0+/Kh4HisA== fmix@^0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/fmix/-/fmix-0.1.0.tgz#c7bbf124dec42c9d191cfb947d0a9778dd986c0c" - integrity sha1-x7vxJN7ELJ0ZHPuUfQqXeN2YbAw= + integrity sha512-Y6hyofImk9JdzU8k5INtTXX1cu8LDlePWDFU5sftm9H+zKCr5SGrVjdhkvsim646cw5zD0nADj8oHyXMZmCZ9w== dependencies: imul "^1.0.0" -follow-redirects@^1.12.1, follow-redirects@^1.14.0: - version "1.14.9" - resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.14.9.tgz#dd4ea157de7bfaf9ea9b3fbd85aa16951f78d8d7" - integrity sha512-MQDfihBQYMcyy5dhRDJUHcw7lb2Pv/TuE6xP1vyraLukNDHKbDxDNaOE3NbCAdKQApno+GPRyo1YAp89yCjK4w== - -follow-redirects@^1.14.9: - version "1.15.1" - resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.15.1.tgz#0ca6a452306c9b276e4d3127483e29575e207ad5" - integrity sha512-yLAMQs+k0b2m7cVxpS1VKJVvoz7SS9Td1zss3XRwXj+ZDH00RJgnuLx7E44wx02kQLrdM3aOOy+FpzS7+8OizA== +follow-redirects@^1.12.1, follow-redirects@^1.14.0, follow-redirects@^1.14.9: + version "1.15.2" + resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.15.2.tgz#b460864144ba63f2681096f274c4e57026da2c13" + integrity sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA== for-each@^0.3.3, for-each@~0.3.3: version "0.3.3" @@ -5520,17 +5034,17 @@ for-each@^0.3.3, for-each@~0.3.3: for-in@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/for-in/-/for-in-1.0.2.tgz#81068d295a8142ec0ac726c6e2200c30fb6d5e80" - integrity sha1-gQaNKVqBQuwKxybG4iAMMPttXoA= - -foreach@^2.0.5: - version "2.0.5" - resolved "https://registry.yarnpkg.com/foreach/-/foreach-2.0.5.tgz#0bee005018aeb260d0a3af3ae658dd0136ec1b99" - integrity sha1-C+4AUBiusmDQo6865ljdATbsG5k= + integrity sha512-7EwmXrOjyL+ChxMhmG5lnW9MPt1aIeZEwKhQzoBUdTV0N3zuwWDZYVJatDvZ2OyzPUvdIAZDsCetk3coyMfcnQ== forever-agent@~0.6.1: version "0.6.1" resolved "https://registry.yarnpkg.com/forever-agent/-/forever-agent-0.6.1.tgz#fbc71f0c41adeb37f96c577ad1ed42d8fdacca91" - integrity sha1-+8cfDEGt6zf5bFd60e1C2P2sypE= + integrity sha512-j0KLYPhm6zeac4lz3oJ3o65qvgQCcPubiyotZrXqEaG4hNagNYO8qdlUrX5vwqv9ohqeT/Z3j6+yW067yWWdUw== + +form-data-encoder@1.7.1: + version "1.7.1" + resolved "https://registry.yarnpkg.com/form-data-encoder/-/form-data-encoder-1.7.1.tgz#ac80660e4f87ee0d3d3c3638b7da8278ddb8ec96" + integrity sha512-EFRDrsMm/kyqbTQocNvRXMLjc7Es2Vk+IQFx/YW7hkUH1eBl4J1fqiP34l74Yt0pFLCNpc06fkbVk00008mzjg== form-data@^2.2.0: version "2.5.1" @@ -5586,14 +5100,14 @@ fp-ts@^1.0.0: fragment-cache@^0.2.1: version "0.2.1" resolved "https://registry.yarnpkg.com/fragment-cache/-/fragment-cache-0.2.1.tgz#4290fad27f13e89be7f33799c6bc5a0abfff0d19" - integrity sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk= + integrity sha512-GMBAbW9antB8iZRHLoGw0b3HANt57diZYFO/HL1JGIC1MjKrdmhxvrJbupnVvpys0zsz7yBApXdQyfepKly2kA== dependencies: map-cache "^0.2.2" fresh@0.5.2: version "0.5.2" resolved "https://registry.yarnpkg.com/fresh/-/fresh-0.5.2.tgz#3d8cadd90d976569fa835ab1f8e4b23a105605a7" - integrity sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac= + integrity sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q== fs-constants@^1.0.0: version "1.0.0" @@ -5603,7 +5117,7 @@ fs-constants@^1.0.0: fs-extra@^0.30.0: version "0.30.0" resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-0.30.0.tgz#f233ffcc08d4da7d432daa449776989db1df93f0" - integrity sha1-8jP/zAjU2n1DLapEl3aYnbHfk/A= + integrity sha512-UvSPKyhMn6LEd/WpUaV9C9t3zATuqoqfWc3QdPhPLb58prN9tqYPlPWi8Krxi44loBoUzlobqZ3+8tGpxxSzwA== dependencies: graceful-fs "^4.1.2" jsonfile "^2.1.0" @@ -5612,9 +5126,9 @@ fs-extra@^0.30.0: rimraf "^2.2.8" fs-extra@^10.0.0: - version "10.0.1" - resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-10.0.1.tgz#27de43b4320e833f6867cc044bfce29fdf0ef3b8" - integrity sha512-NbdoVMZso2Lsrn/QwLXOy6rm0ufY2zEOKCDzJR/0kBsb0E6qed0P3iYK+Ath3BfvXEeu4JhEtXLgILx5psUfag== + version "10.1.0" + resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-10.1.0.tgz#02873cfbc4084dde127eaa5f9905eef2325d1abf" + integrity sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ== dependencies: graceful-fs "^4.2.0" jsonfile "^6.0.1" @@ -5647,7 +5161,7 @@ fs-extra@^8.1.0: jsonfile "^4.0.0" universalify "^0.1.0" -fs-extra@^9.1.0: +fs-extra@^9.0.0, fs-extra@^9.1.0: version "9.1.0" resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-9.1.0.tgz#5954460c764a8da2094ba3554bf839e6b9a7c86d" integrity sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ== @@ -5672,7 +5186,7 @@ fs-readdir-recursive@^1.1.0: fs.realpath@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" - integrity sha1-FQStJSMVjKpA20onh8sBQRmU6k8= + integrity sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw== fsevents@~2.1.1: version "2.1.3" @@ -5680,19 +5194,34 @@ fsevents@~2.1.1: integrity sha512-Auw9a4AxqWpa9GUfj370BMPzzyncfBABW8Mab7BGWBYDj4Isgq+cDKtx0i6u9jcX9pQDnswsaaOTgTmA5pEjuQ== fsevents@~2.3.2: - version "2.3.2" - resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.2.tgz#8a526f78b8fdf4623b709e0b975c52c24c02fd1a" - integrity sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA== + version "2.3.3" + resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.3.tgz#cac6407785d03675a2a5e1a5305c697b347d90d6" + integrity sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw== function-bind@^1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A== +function.prototype.name@^1.1.5: + version "1.1.6" + resolved "https://registry.yarnpkg.com/function.prototype.name/-/function.prototype.name-1.1.6.tgz#cdf315b7d90ee77a4c6ee216c3c3362da07533fd" + integrity sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg== + dependencies: + call-bind "^1.0.2" + define-properties "^1.2.0" + es-abstract "^1.22.1" + functions-have-names "^1.2.3" + functional-red-black-tree@^1.0.1, functional-red-black-tree@~1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz#1b0ab3bd553b2a0d6399d29c0e3ea0b252078327" - integrity sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc= + integrity sha512-dsKNQNdj6xA3T+QlADDA7mOSlX0qiMINjn0cgr+eGHGsbSHzTabcIogz2+p/iqP1Xs6EP/sS2SbqH+brGTbq0g== + +functions-have-names@^1.2.3: + version "1.2.3" + resolved "https://registry.yarnpkg.com/functions-have-names/-/functions-have-names-1.2.3.tgz#0404fe4ee2ba2f607f0e0ec3c80bae994133b834" + integrity sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ== ganache-core@^2.13.2: version "2.13.2" @@ -5744,32 +5273,28 @@ get-caller-file@^2.0.1, get-caller-file@^2.0.5: get-func-name@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/get-func-name/-/get-func-name-2.0.0.tgz#ead774abee72e20409433a066366023dd6887a41" - integrity sha1-6td0q+5y4gQJQzoGY2YCPdaIekE= + integrity sha512-Hm0ixYtaSZ/V7C8FJrtZIuBBI+iSgL+1Aq82zSu8VQNB4S3Gk8e7Qs3VwBDJAhmRZcFqkl3tQu36g/Foh5I5ig== -get-intrinsic@^1.0.2, get-intrinsic@^1.1.0, get-intrinsic@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.1.1.tgz#15f59f376f855c446963948f0d24cd3637b4abc6" - integrity sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q== +get-intrinsic@^1.0.2, get-intrinsic@^1.1.1, get-intrinsic@^1.1.3, get-intrinsic@^1.2.0, get-intrinsic@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.2.1.tgz#d295644fed4505fc9cde952c37ee12b477a83d82" + integrity sha512-2DcsyfABl+gVHEfCOaTrWgyt+tb6MSEGmKq+kI5HwLbIYgjgmMcV8KQ41uaKz1xxUcn9tJtgFbQUEVcEbd0FYw== dependencies: function-bind "^1.1.1" has "^1.0.3" - has-symbols "^1.0.1" + has-proto "^1.0.1" + has-symbols "^1.0.3" get-port@^3.1.0: version "3.2.0" resolved "https://registry.yarnpkg.com/get-port/-/get-port-3.2.0.tgz#dd7ce7de187c06c8bf353796ac71e099f0980ebc" - integrity sha1-3Xzn3hh8Bsi/NTeWrHHgmfCYDrw= + integrity sha512-x5UJKlgeUiNT8nyo/AcnwLnZuZNcSjSw0kogRB+Whd1fjjFq4B1hySFxSFWWSn4mIBzg3sRNUDFYc4g5gjPoLg== get-stdin@^8.0.0: version "8.0.0" resolved "https://registry.yarnpkg.com/get-stdin/-/get-stdin-8.0.0.tgz#cbad6a73feb75f6eeb22ba9e01f89aa28aa97a53" integrity sha512-sY22aA6xchAzprjyqmSEQv4UbAAzRN0L2dQB0NlN5acTTK9Don6nhoc3eAbUnpZiCANAMfd/+40kVdKfFygohg== -get-stream@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-3.0.0.tgz#8e943d1358dc37555054ecbe2edb05aa174ede14" - integrity sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ= - get-stream@^4.1.0: version "4.1.0" resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-4.1.0.tgz#c1b255575f3dc21d59bfc79cd3d2b46b1c3a54b5" @@ -5784,6 +5309,11 @@ get-stream@^5.1.0: dependencies: pump "^3.0.0" +get-stream@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-6.0.1.tgz#a262d8eef67aced57c2852ad6167526a43cbf7b7" + integrity sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg== + get-symbol-description@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/get-symbol-description/-/get-symbol-description-1.0.0.tgz#7fdb81c900101fbd564dd5f1a30af5aadc1e58d6" @@ -5795,12 +5325,12 @@ get-symbol-description@^1.0.0: get-value@^2.0.3, get-value@^2.0.6: version "2.0.6" resolved "https://registry.yarnpkg.com/get-value/-/get-value-2.0.6.tgz#dc15ca1c672387ca76bd37ac0a395ba2042a2c28" - integrity sha1-3BXKHGcjh8p2vTesCjlbogQqLCg= + integrity sha512-Ln0UQDlxH1BapMu3GPtf7CuYNwRZf2gwCuPqbyG6pB8WfmFpzqcy4xtAaAMUhnNqjMKTiCPZG2oMT3YSx8U2NA== getpass@^0.1.1: version "0.1.7" resolved "https://registry.yarnpkg.com/getpass/-/getpass-0.1.7.tgz#5eff8e3e684d569ae4cb2b1282604e8ba62149fa" - integrity sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo= + integrity sha512-0fzj9JxOLfJ+XGLhR8ze3unN0KZCgZwiSSDz168VERjK8Wl8kVSdcu2kspd4s4wtAa1y/qrVRiAA0WclVsu0ng== dependencies: assert-plus "^1.0.0" @@ -5819,7 +5349,7 @@ glob-parent@^5.1.2, glob-parent@~5.1.0, glob-parent@~5.1.2: dependencies: is-glob "^4.0.1" -glob-parent@^6.0.1: +glob-parent@^6.0.2: version "6.0.2" resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-6.0.2.tgz#6d237d99083950c79290f24c7642a3de9a28f9e3" integrity sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A== @@ -5850,7 +5380,7 @@ glob@7.1.7: once "^1.3.0" path-is-absolute "^1.0.0" -glob@7.2.0, glob@^7.0.0, glob@^7.1.2, glob@^7.1.3, glob@~7.2.0: +glob@7.2.0: version "7.2.0" resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.0.tgz#d15535af7732e02e948f4c41628bd910293f6023" integrity sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q== @@ -5865,7 +5395,7 @@ glob@7.2.0, glob@^7.0.0, glob@^7.1.2, glob@^7.1.3, glob@~7.2.0: glob@^5.0.15: version "5.0.15" resolved "https://registry.yarnpkg.com/glob/-/glob-5.0.15.tgz#1bc936b9e02f4a603fcc222ecf7633d30b8b93b1" - integrity sha1-G8k2ueAvSmA/zCIuz3Yz0wuLk7E= + integrity sha512-c9IPMazfRITpmAAKi22dK1VKxGDX9ehhqfABDriL/lzO92xcUKEJPQHrVA/2YHSNFB4iFlykVmWvwo48nr3OxA== dependencies: inflight "^1.0.4" inherits "2" @@ -5873,7 +5403,7 @@ glob@^5.0.15: once "^1.3.0" path-is-absolute "^1.0.0" -glob@^7.1.1: +glob@^7.0.0, glob@^7.1.1, glob@^7.1.2, glob@^7.1.3, glob@~7.2.3: version "7.2.3" resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.3.tgz#b8df0fb802bbfa8e89bd1d938b4e16578ed44f2b" integrity sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q== @@ -5885,10 +5415,10 @@ glob@^7.1.1: once "^1.3.0" path-is-absolute "^1.0.0" -glob@^8.0.1: - version "8.0.3" - resolved "https://registry.yarnpkg.com/glob/-/glob-8.0.3.tgz#415c6eb2deed9e502c68fa44a272e6da6eeca42e" - integrity sha512-ull455NHSHI/Y1FqGaaYFaLGkNMMJbavMrEGFXG/PGrg6y7sutWHUHrz6gy6WEBH6akM1M414dWKCNs+IhKdiQ== +glob@^8.0.1, glob@^8.0.3: + version "8.1.0" + resolved "https://registry.yarnpkg.com/glob/-/glob-8.1.0.tgz#d388f656593ef708ee3e34640fdfb99a9fd1c33e" + integrity sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ== dependencies: fs.realpath "^1.0.0" inflight "^1.0.4" @@ -5920,15 +5450,10 @@ global@~4.4.0: min-document "^2.19.0" process "^0.11.10" -globals@^11.7.0: - version "11.12.0" - resolved "https://registry.yarnpkg.com/globals/-/globals-11.12.0.tgz#ab8795338868a0babd8525758018c2a7eb95c42e" - integrity sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA== - -globals@^13.15.0: - version "13.17.0" - resolved "https://registry.yarnpkg.com/globals/-/globals-13.17.0.tgz#902eb1e680a41da93945adbdcb5a9f361ba69bd4" - integrity sha512-1C+6nQRb1GwGMKm2dH/E7enFAMxGTmGI7/dEdhy/DNelv85w9B72t3uc5frtMNXIbzrarJJ/lTCjcaZwbLJmyw== +globals@^13.19.0: + version "13.21.0" + resolved "https://registry.yarnpkg.com/globals/-/globals-13.21.0.tgz#163aae12f34ef502f5153cfbdd3600f36c63c571" + integrity sha512-ybyme3s4yy/t/3s35bewwXKOf7cvzfreG2lH0lZl0JB7I4GxRP2ghxOK/Nb9EkRXdbBXZLfq/p/0W2JUONB/Gg== dependencies: type-fest "^0.20.2" @@ -5937,6 +5462,13 @@ globals@^9.18.0: resolved "https://registry.yarnpkg.com/globals/-/globals-9.18.0.tgz#aa3896b3e69b487f17e31ed2143d69a8e30c2d8a" integrity sha512-S0nG3CLEQiY/ILxqtztTWH/3iRRdyBLw6KMDxnKMchrtbj2OFmehVh0WUCfW3DUrIgx/qFrJPICrq4Z4sTR9UQ== +globalthis@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/globalthis/-/globalthis-1.0.3.tgz#5852882a52b80dc301b0660273e1ed082f0b6ccf" + integrity sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA== + dependencies: + define-properties "^1.1.3" + globby@^10.0.1: version "10.0.2" resolved "https://registry.yarnpkg.com/globby/-/globby-10.0.2.tgz#277593e745acaa4646c3ab411289ec47a0392543" @@ -5963,6 +5495,32 @@ globby@^11.1.0: merge2 "^1.4.1" slash "^3.0.0" +gopd@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/gopd/-/gopd-1.0.1.tgz#29ff76de69dac7489b7c0918a5788e56477c332c" + integrity sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA== + dependencies: + get-intrinsic "^1.1.3" + +got@12.1.0: + version "12.1.0" + resolved "https://registry.yarnpkg.com/got/-/got-12.1.0.tgz#099f3815305c682be4fd6b0ee0726d8e4c6b0af4" + integrity sha512-hBv2ty9QN2RdbJJMK3hesmSkFTjVIHyIDDbssCKnSmq62edGgImJWD10Eb1k77TiV1bxloxqcFAVK8+9pkhOig== + dependencies: + "@sindresorhus/is" "^4.6.0" + "@szmarczak/http-timer" "^5.0.1" + "@types/cacheable-request" "^6.0.2" + "@types/responselike" "^1.0.0" + cacheable-lookup "^6.0.4" + cacheable-request "^7.0.2" + decompress-response "^6.0.0" + form-data-encoder "1.7.1" + get-stream "^6.0.1" + http2-wrapper "^2.1.10" + lowercase-keys "^3.0.0" + p-cancelable "^3.0.0" + responselike "^2.0.0" + got@9.6.0: version "9.6.0" resolved "https://registry.yarnpkg.com/got/-/got-9.6.0.tgz#edf45e7d67f99545705de1f7bbeeeb121765ed85" @@ -5980,35 +5538,32 @@ got@9.6.0: to-readable-stream "^1.0.0" url-parse-lax "^3.0.0" -got@^7.1.0: - version "7.1.0" - resolved "https://registry.yarnpkg.com/got/-/got-7.1.0.tgz#05450fd84094e6bbea56f451a43a9c289166385a" - integrity sha512-Y5WMo7xKKq1muPsxD+KmrR8DH5auG7fBdDVueZwETwV6VytKyU9OX/ddpq2/1hp1vIPvVb4T81dKQz3BivkNLw== - dependencies: - decompress-response "^3.2.0" - duplexer3 "^0.1.4" - get-stream "^3.0.0" - is-plain-obj "^1.1.0" - is-retry-allowed "^1.0.0" - is-stream "^1.0.0" - isurl "^1.0.0-alpha5" - lowercase-keys "^1.0.0" - p-cancelable "^0.3.0" - p-timeout "^1.1.1" - safe-buffer "^5.0.1" - timed-out "^4.0.0" - url-parse-lax "^1.0.0" - url-to-options "^1.0.1" +got@^11.8.5: + version "11.8.6" + resolved "https://registry.yarnpkg.com/got/-/got-11.8.6.tgz#276e827ead8772eddbcfc97170590b841823233a" + integrity sha512-6tfZ91bOr7bOXnK7PRDCGBLa1H4U080YHNaAQ2KsMGlLEzRbk44nsZF2E1IeRc3vtJHPVbKCYgdFbaGO2ljd8g== + dependencies: + "@sindresorhus/is" "^4.0.0" + "@szmarczak/http-timer" "^4.0.5" + "@types/cacheable-request" "^6.0.1" + "@types/responselike" "^1.0.0" + cacheable-lookup "^5.0.3" + cacheable-request "^7.0.2" + decompress-response "^6.0.0" + http2-wrapper "^1.0.0-beta.5.2" + lowercase-keys "^2.0.0" + p-cancelable "^2.0.0" + responselike "^2.0.0" graceful-fs@^4.1.11, graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.1.9, graceful-fs@^4.2.0: - version "4.2.10" - resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.10.tgz#147d3a006da4ca3ce14728c7aefc287c367d7a6c" - integrity sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA== + version "4.2.11" + resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.11.tgz#4183e4e8bf08bb6e05bbb2f7d2e0c8f712ca40e3" + integrity sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ== -grapheme-splitter@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/grapheme-splitter/-/grapheme-splitter-1.0.4.tgz#9cf3a665c6247479896834af35cf1dbb4400767e" - integrity sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ== +graphemer@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/graphemer/-/graphemer-1.4.0.tgz#fb2f1d55e0e3a1849aeffc90c4fa0dd53a0e66c6" + integrity sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag== growl@1.10.5: version "1.10.5" @@ -6016,12 +5571,12 @@ growl@1.10.5: integrity sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA== handlebars@^4.0.1: - version "4.7.7" - resolved "https://registry.yarnpkg.com/handlebars/-/handlebars-4.7.7.tgz#9ce33416aad02dbd6c8fafa8240d5d98004945a1" - integrity sha512-aAcXm5OAfE/8IXkcZvCepKU3VzW1/39Fb5ZuqMtgI/hT8X2YgoMvBY5dLhq/cpOvw7Lk1nK/UF71aLG/ZnVYRA== + version "4.7.8" + resolved "https://registry.yarnpkg.com/handlebars/-/handlebars-4.7.8.tgz#41c42c18b1be2365439188c77c6afae71c0cd9e9" + integrity sha512-vafaFqs8MZkRrSX7sFVUdo3ap/eNiLnb4IakshzvP56X5Nr1iGKAIqdX6tMlm6HcNRIkr6AxO5jFEoJzzpT8aQ== dependencies: minimist "^1.2.5" - neo-async "^2.6.0" + neo-async "^2.6.2" source-map "^0.6.1" wordwrap "^1.0.0" optionalDependencies: @@ -6030,7 +5585,7 @@ handlebars@^4.0.1: har-schema@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/har-schema/-/har-schema-2.0.0.tgz#a94c2224ebcac04782a0d9035521f24735b7ec92" - integrity sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI= + integrity sha512-Oqluz6zhGX8cyRaTQlFMPw80bSJVG2x/cFb8ZPhUILGgHka9SsokCCOQgpveePerqidZOrT14ipqfJb7ILcW5Q== har-validator@~5.1.3: version "5.1.5" @@ -6041,59 +5596,65 @@ har-validator@~5.1.3: har-schema "^2.0.0" hardhat-deploy@^0.11.4: - version "0.11.4" - resolved "https://registry.yarnpkg.com/hardhat-deploy/-/hardhat-deploy-0.11.4.tgz#39b06d3b0ad25195071cc1f2f71649b1f9f030d0" - integrity sha512-BNMwWqaxrwb8XKrYzmCwnUzOSKzicUBk+fwd28doUNoAGFFh8kpoypkcHMzKDVdLhnamAardcfqJet73zrZoTA== - dependencies: - "@ethersproject/abi" "^5.4.0" - "@ethersproject/abstract-signer" "^5.4.1" - "@ethersproject/address" "^5.4.0" - "@ethersproject/bignumber" "^5.4.1" - "@ethersproject/bytes" "^5.4.0" - "@ethersproject/constants" "^5.4.0" - "@ethersproject/contracts" "^5.4.1" - "@ethersproject/providers" "^5.4.4" - "@ethersproject/solidity" "^5.4.0" - "@ethersproject/transactions" "^5.4.0" - "@ethersproject/wallet" "^5.4.0" + version "0.11.37" + resolved "https://registry.yarnpkg.com/hardhat-deploy/-/hardhat-deploy-0.11.37.tgz#6a771b859c82ae25292321a6d510d7c0eda09d2b" + integrity sha512-pohPSEEo/X9Yfv0Fc0kXBQW6JO0LNOILBGCP69Ci1COJvLht1hLjAtXt/hccyvD9qY/uwJAM75fmsf41Y9N7lg== + dependencies: + "@ethersproject/abi" "^5.7.0" + "@ethersproject/abstract-signer" "^5.7.0" + "@ethersproject/address" "^5.7.0" + "@ethersproject/bignumber" "^5.7.0" + "@ethersproject/bytes" "^5.7.0" + "@ethersproject/constants" "^5.7.0" + "@ethersproject/contracts" "^5.7.0" + "@ethersproject/providers" "^5.7.2" + "@ethersproject/solidity" "^5.7.0" + "@ethersproject/transactions" "^5.7.0" + "@ethersproject/wallet" "^5.7.0" "@types/qs" "^6.9.7" axios "^0.21.1" chalk "^4.1.2" chokidar "^3.5.2" debug "^4.3.2" enquirer "^2.3.6" + ethers "^5.5.3" form-data "^4.0.0" fs-extra "^10.0.0" match-all "^1.2.6" murmur-128 "^0.2.1" qs "^6.9.4" + zksync-web3 "^0.14.3" hardhat-gas-reporter@^1.0.8: - version "1.0.8" - resolved "https://registry.yarnpkg.com/hardhat-gas-reporter/-/hardhat-gas-reporter-1.0.8.tgz#93ce271358cd748d9c4185dbb9d1d5525ec145e0" - integrity sha512-1G5thPnnhcwLHsFnl759f2tgElvuwdkzxlI65fC9PwxYMEe9cmjkVAAWTf3/3y8uP6ZSPiUiOW8PgZnykmZe0g== + version "1.0.9" + resolved "https://registry.yarnpkg.com/hardhat-gas-reporter/-/hardhat-gas-reporter-1.0.9.tgz#9a2afb354bc3b6346aab55b1c02ca556d0e16450" + integrity sha512-INN26G3EW43adGKBNzYWOlI3+rlLnasXTwW79YNnUhXPDa+yHESgt639dJEs37gCjhkbNKcRRJnomXEuMFBXJg== dependencies: array-uniq "1.0.3" - eth-gas-reporter "^0.2.24" + eth-gas-reporter "^0.2.25" sha1 "^1.1.1" hardhat@^2.6.6: - version "2.9.3" - resolved "https://registry.yarnpkg.com/hardhat/-/hardhat-2.9.3.tgz#4759dc3c468c7d15f34334ca1be7d59b04e47b1e" - integrity sha512-7Vw99RbYbMZ15UzegOR/nqIYIqddZXvLwJGaX5sX4G5bydILnbjmDU6g3jMKJSiArEixS3vHAEaOs5CW1JQ3hg== - dependencies: - "@ethereumjs/block" "^3.6.0" - "@ethereumjs/blockchain" "^5.5.0" - "@ethereumjs/common" "^2.6.0" - "@ethereumjs/tx" "^3.4.0" - "@ethereumjs/vm" "^5.6.0" + version "2.17.3" + resolved "https://registry.yarnpkg.com/hardhat/-/hardhat-2.17.3.tgz#4cb15f2afdea5f108970ed72e5b81e6e53052cfb" + integrity sha512-SFZoYVXW1bWJZrIIKXOA+IgcctfuKXDwENywiYNT2dM3YQc4fXNaTbuk/vpPzHIF50upByx4zW5EqczKYQubsA== + dependencies: "@ethersproject/abi" "^5.1.2" "@metamask/eth-sig-util" "^4.0.0" + "@nomicfoundation/ethereumjs-block" "5.0.2" + "@nomicfoundation/ethereumjs-blockchain" "7.0.2" + "@nomicfoundation/ethereumjs-common" "4.0.2" + "@nomicfoundation/ethereumjs-evm" "2.0.2" + "@nomicfoundation/ethereumjs-rlp" "5.0.2" + "@nomicfoundation/ethereumjs-statemanager" "2.0.2" + "@nomicfoundation/ethereumjs-trie" "6.0.2" + "@nomicfoundation/ethereumjs-tx" "5.0.2" + "@nomicfoundation/ethereumjs-util" "9.0.2" + "@nomicfoundation/ethereumjs-vm" "7.0.2" + "@nomicfoundation/solidity-analyzer" "^0.1.0" "@sentry/node" "^5.18.1" - "@solidity-parser/parser" "^0.14.1" "@types/bn.js" "^5.1.0" "@types/lru-cache" "^5.1.0" - abort-controller "^3.0.0" adm-zip "^0.4.16" aggregate-error "^3.0.0" ansi-escapes "^4.3.0" @@ -6103,55 +5664,51 @@ hardhat@^2.6.6: debug "^4.1.1" enquirer "^2.3.0" env-paths "^2.2.0" - ethereum-cryptography "^0.1.2" + ethereum-cryptography "^1.0.3" ethereumjs-abi "^0.6.8" - ethereumjs-util "^7.1.3" find-up "^2.1.0" fp-ts "1.19.3" fs-extra "^7.0.1" - glob "^7.1.3" + glob "7.2.0" immutable "^4.0.0-rc.12" io-ts "1.10.4" + keccak "^3.0.2" lodash "^4.17.11" - merkle-patricia-tree "^4.2.2" mnemonist "^0.38.0" - mocha "^9.2.0" + mocha "^10.0.0" p-map "^4.0.0" - qs "^6.7.0" raw-body "^2.4.1" resolve "1.17.0" semver "^6.3.0" - slash "^3.0.0" solc "0.7.3" source-map-support "^0.5.13" stacktrace-parser "^0.1.10" - "true-case-path" "^2.2.1" tsort "0.0.1" - undici "^4.14.1" + undici "^5.14.0" uuid "^8.3.2" ws "^7.4.6" has-ansi@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/has-ansi/-/has-ansi-2.0.0.tgz#34f5049ce1ecdf2b0649af3ef24e45ed35416d91" - integrity sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE= + integrity sha512-C8vBJ8DwUCx19vhm7urhTuUsr4/IyP6l4VzNQDv+ryHQObW3TTTp9yB68WpYgRe2bbaGuZ/se74IqFeVnMnLZg== dependencies: ansi-regex "^2.0.0" -has-bigints@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/has-bigints/-/has-bigints-1.0.1.tgz#64fe6acb020673e3b78db035a5af69aa9d07b113" - integrity sha512-LSBS2LjbNBTf6287JEbEzvJgftkF5qFkmCo9hDRpAzKhUOlJ+hx8dd4USs00SgsUNwc4617J9ki5YtEClM2ffA== +has-bigints@^1.0.1, has-bigints@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/has-bigints/-/has-bigints-1.0.2.tgz#0871bd3e3d51626f6ca0966668ba35d5602d6eaa" + integrity sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ== has-flag@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-1.0.0.tgz#9d9e793165ce017a00f00418c43f942a7b1d11fa" - integrity sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo= + integrity sha512-DyYHfIYwAJmjAjSSPKANxI8bFY9YtFrgkAfinBojQ8YJTOuOuav64tMUJv584SES4xl74PmuaevIyaLESHdTAA== has-flag@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" - integrity sha1-tdRU3CGZriJWmfNGfloH87lVuv0= + integrity sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw== has-flag@^4.0.0: version "4.0.0" @@ -6165,23 +5722,16 @@ has-property-descriptors@^1.0.0: dependencies: get-intrinsic "^1.1.1" -has-symbol-support-x@^1.4.1: - version "1.4.2" - resolved "https://registry.yarnpkg.com/has-symbol-support-x/-/has-symbol-support-x-1.4.2.tgz#1409f98bc00247da45da67cee0a36f282ff26455" - integrity sha512-3ToOva++HaW+eCpgqZrCfN51IPB+7bJNVT6CUATzueB5Heb8o6Nam0V3HG5dlDvZU1Gn5QLcbahiKw/XVk5JJw== +has-proto@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/has-proto/-/has-proto-1.0.1.tgz#1885c1305538958aff469fef37937c22795408e0" + integrity sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg== -has-symbols@^1.0.0, has-symbols@^1.0.1, has-symbols@^1.0.2, has-symbols@^1.0.3: +has-symbols@^1.0.0, has-symbols@^1.0.2, has-symbols@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.3.tgz#bb7b2c4349251dce87b125f7bdf874aa7c8b39f8" integrity sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A== -has-to-string-tag-x@^1.2.0: - version "1.4.1" - resolved "https://registry.yarnpkg.com/has-to-string-tag-x/-/has-to-string-tag-x-1.4.1.tgz#a045ab383d7b4b2012a00148ab0aa5f290044d4d" - integrity sha512-vdbKfmw+3LoOYVr+mtxHaX5a96+0f3DljYd8JOqvOLsf5mw2Otda2qCDT9qRqLAhrjyQ0h7ual5nOiASpsGNFw== - dependencies: - has-symbol-support-x "^1.4.1" - has-tostringtag@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/has-tostringtag/-/has-tostringtag-1.0.0.tgz#7e133818a7d394734f941e73c3d3f9291e658b25" @@ -6192,7 +5742,7 @@ has-tostringtag@^1.0.0: has-value@^0.3.1: version "0.3.1" resolved "https://registry.yarnpkg.com/has-value/-/has-value-0.3.1.tgz#7b1f58bada62ca827ec0a2078025654845995e1f" - integrity sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8= + integrity sha512-gpG936j8/MzaeID5Yif+577c17TxaDmhuyVgSwtnL/q8UUTySg8Mecb+8Cf1otgLoD7DDH75axp86ER7LFsf3Q== dependencies: get-value "^2.0.3" has-values "^0.1.4" @@ -6201,7 +5751,7 @@ has-value@^0.3.1: has-value@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/has-value/-/has-value-1.0.0.tgz#18b281da585b1c5c51def24c930ed29a0be6b177" - integrity sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc= + integrity sha512-IBXk4GTsLYdQ7Rvt+GRBrFSVEkmuOUy4re0Xjd9kJSUQpnTrWR4/y9RpfexN9vkAPMFuQoeWKwqzPozRTlasGw== dependencies: get-value "^2.0.6" has-values "^1.0.0" @@ -6210,12 +5760,12 @@ has-value@^1.0.0: has-values@^0.1.4: version "0.1.4" resolved "https://registry.yarnpkg.com/has-values/-/has-values-0.1.4.tgz#6d61de95d91dfca9b9a02089ad384bff8f62b771" - integrity sha1-bWHeldkd/Km5oCCJrThL/49it3E= + integrity sha512-J8S0cEdWuQbqD9//tlZxiMuMNmxB8PlEwvYwuxsTmR1G5RXUePEX/SJn7aD0GMLieuZYSwNH0cQuJGwnYunXRQ== has-values@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/has-values/-/has-values-1.0.0.tgz#95b0b63fec2146619a6fe57fe75628d5a39efe4f" - integrity sha1-lbC2P+whRmGab+V/51Yo1aOe/k8= + integrity sha512-ODYZC64uqzmtfGMEAX/FvZiRyWLpAC3vYnNunURUnkGVTS+mI0smVsWaPydRBsE3g+ok7h960jChO8mFcWlHaQ== dependencies: is-number "^3.0.0" kind-of "^4.0.0" @@ -6260,12 +5810,12 @@ he@1.2.0: heap@0.2.6: version "0.2.6" resolved "https://registry.yarnpkg.com/heap/-/heap-0.2.6.tgz#087e1f10b046932fc8594dd9e6d378afc9d1e5ac" - integrity sha1-CH4fELBGky/IWU3Z5tN4r8nR5aw= + integrity sha512-MzzWcnfB1e4EG2vHi3dXHoBupmuXNZzx6pY6HldVS55JKKBoq3xOyzfSaZRkJp37HIhEYC78knabHff3zc4dQQ== hmac-drbg@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/hmac-drbg/-/hmac-drbg-1.0.1.tgz#d2745701025a6c775a6c545793ed502fc0c649a1" - integrity sha1-0nRXAQJabHdabFRXk+1QL8DGSaE= + integrity sha512-Tti3gMqLdZfhOQY1Mzf/AanLiqh1WTiJgEj26ZuYQ9fbkLomzGchCws4FyrSd4VkpBfiNhaE1On+lOz894jvXg== dependencies: hash.js "^1.0.3" minimalistic-assert "^1.0.0" @@ -6274,7 +5824,7 @@ hmac-drbg@^1.0.1: home-or-tmp@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/home-or-tmp/-/home-or-tmp-2.0.0.tgz#e36c3f2d2cae7d746a857e38d18d5f32a7882db8" - integrity sha1-42w/LSyufXRqhX440Y1fMqeILbg= + integrity sha512-ycURW7oUxE2sNiPVw1HVEFsW+ecOpJ5zaj7eC0RlwhibhRBod20muUN8qu/gzx956YrLolVvs1MTXwKgC2rVEg== dependencies: os-homedir "^1.0.0" os-tmpdir "^1.0.1" @@ -6285,14 +5835,14 @@ hosted-git-info@^2.1.4, hosted-git-info@^2.6.0: integrity sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw== htmlparser2@^8.0.1: - version "8.0.1" - resolved "https://registry.yarnpkg.com/htmlparser2/-/htmlparser2-8.0.1.tgz#abaa985474fcefe269bc761a779b544d7196d010" - integrity sha512-4lVbmc1diZC7GUJQtRQ5yBAeUCL1exyMwmForWkRLnwyzWBFxN633SALPMGYaWZvKe9j1pRZJpauvmxENSp/EA== + version "8.0.2" + resolved "https://registry.yarnpkg.com/htmlparser2/-/htmlparser2-8.0.2.tgz#f002151705b383e62433b5cf466f5b716edaec21" + integrity sha512-GYdjWKDkbRLkZ5geuHs5NY1puJ+PXwP7+fHPRz06Eirsb9ugf6d8kkXav6ADhcODhFFPMIXyxkxSuMf3D6NCFA== dependencies: domelementtype "^2.3.0" - domhandler "^5.0.2" + domhandler "^5.0.3" domutils "^3.0.1" - entities "^4.3.0" + entities "^4.4.0" http-basic@^8.1.1: version "8.1.3" @@ -6309,17 +5859,6 @@ http-cache-semantics@^4.0.0: resolved "https://registry.yarnpkg.com/http-cache-semantics/-/http-cache-semantics-4.1.1.tgz#abe02fcb2985460bf0323be664436ec3476a6d5a" integrity sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ== -http-errors@1.8.1: - version "1.8.1" - resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.8.1.tgz#7c3f28577cbc8a207388455dbd62295ed07bd68c" - integrity sha512-Kpk9Sm7NmI+RHhnj6OIWDI1d6fIoFAtFt9RLaTMRlg/8w49juAStsrBgp0Dp4OdxdVbRIeKhtCUvoi/RuAhO4g== - dependencies: - depd "~1.1.2" - inherits "2.0.4" - setprototypeof "1.2.0" - statuses ">= 1.5.0 < 2" - toidentifier "1.0.1" - http-errors@2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-2.0.0.tgz#b7774a1486ef73cf7667ac9ae0858c012c57b9d3" @@ -6334,7 +5873,7 @@ http-errors@2.0.0: http-https@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/http-https/-/http-https-1.0.0.tgz#2f908dd5f1db4068c058cd6e6d4ce392c913389b" - integrity sha1-L5CN1fHbQGjAWM1ubUzjkskTOJs= + integrity sha512-o0PWwVCSp3O0wS6FvNr6xfBCHgt0m1tvPLFOCc2iFDKTRAXhB7m8klDf7ErowFH8POa6dVdGatKU5I1YYwzUyg== http-response-object@^3.0.1: version "3.0.2" @@ -6346,13 +5885,29 @@ http-response-object@^3.0.1: http-signature@~1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/http-signature/-/http-signature-1.2.0.tgz#9aecd925114772f3d95b65a60abb8f7c18fbace1" - integrity sha1-muzZJRFHcvPZW2WmCruPfBj7rOE= + integrity sha512-CAbnr6Rz4CYQkLYUtSNXxQPUH2gK8f3iWexVlsnMeD+GjlsQ0Xsy1cOX+mN3dtxYomRy21CiOzU8Uhw6OwncEQ== dependencies: assert-plus "^1.0.0" jsprim "^1.2.2" sshpk "^1.7.0" -https-proxy-agent@5.0.1: +http2-wrapper@^1.0.0-beta.5.2: + version "1.0.3" + resolved "https://registry.yarnpkg.com/http2-wrapper/-/http2-wrapper-1.0.3.tgz#b8f55e0c1f25d4ebd08b3b0c2c079f9590800b3d" + integrity sha512-V+23sDMr12Wnz7iTcDeJr3O6AIxlnvT/bmaAAAP/Xda35C90p9599p0F1eHR/N1KILWSoWVAiOMFjBBXaXSMxg== + dependencies: + quick-lru "^5.1.1" + resolve-alpn "^1.0.0" + +http2-wrapper@^2.1.10: + version "2.2.0" + resolved "https://registry.yarnpkg.com/http2-wrapper/-/http2-wrapper-2.2.0.tgz#b80ad199d216b7d3680195077bd7b9060fa9d7f3" + integrity sha512-kZB0wxMo0sh1PehyjJUWRFEd99KC5TLjZ2cULC4f9iqJBAmKQQXEICjxl5iPJRwP40dpeHFqqhm7tYCvODpqpQ== + dependencies: + quick-lru "^5.1.1" + resolve-alpn "^1.2.0" + +https-proxy-agent@5.0.1, https-proxy-agent@^5.0.0: version "5.0.1" resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz#c59ef224a04fe8b754f3db0063a25ea30d0005d6" integrity sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA== @@ -6360,15 +5915,7 @@ https-proxy-agent@5.0.1: agent-base "6" debug "4" -https-proxy-agent@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-5.0.0.tgz#e2a90542abb68a762e0a0850f6c9edadfd8506b2" - integrity sha512-EkYm5BcKUGiduxzSt3Eppko+PiNWNEpa4ySk9vTC6wDsQJW9rHSa+UhGNJoRYp7bz6Ht1eaRIa6QaJqO5rCFbA== - dependencies: - agent-base "6" - debug "4" - -iconv-lite@0.4.24, iconv-lite@^0.4.24: +iconv-lite@0.4.24: version "0.4.24" resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA== @@ -6389,20 +5936,15 @@ idna-uts46-hx@^2.3.1: dependencies: punycode "2.1.0" -ieee754@^1.1.13: +ieee754@^1.1.13, ieee754@^1.2.1: version "1.2.1" resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.2.1.tgz#8eb7a10a63fff25d15a57b001586d177d1b0d352" integrity sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA== -ignore@^4.0.6: - version "4.0.6" - resolved "https://registry.yarnpkg.com/ignore/-/ignore-4.0.6.tgz#750e3db5862087b4737ebac8207ffd1ef27b25fc" - integrity sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg== - -ignore@^5.1.1, ignore@^5.2.0: - version "5.2.0" - resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.2.0.tgz#6d3bac8fa7fe0d45d9f9be7bac2fc279577e345a" - integrity sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ== +ignore@^5.1.1, ignore@^5.2.0, ignore@^5.2.4: + version "5.2.4" + resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.2.4.tgz#a291c0c6178ff1b960befe47fcdec301674a6324" + integrity sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ== immediate@^3.2.3: version "3.3.0" @@ -6412,22 +5954,14 @@ immediate@^3.2.3: immediate@~3.2.3: version "3.2.3" resolved "https://registry.yarnpkg.com/immediate/-/immediate-3.2.3.tgz#d140fa8f614659bd6541233097ddaac25cdd991c" - integrity sha1-0UD6j2FGWb1lQSMwl92qwlzdmRw= + integrity sha512-RrGCXRm/fRVqMIhqXrGEX9rRADavPiDFSoMb/k64i9XMk8uH4r/Omi5Ctierj6XzNecwDbO4WuFbDD1zmpl3Tg== immutable@^4.0.0-rc.12: - version "4.0.0" - resolved "https://registry.yarnpkg.com/immutable/-/immutable-4.0.0.tgz#b86f78de6adef3608395efb269a91462797e2c23" - integrity sha512-zIE9hX70qew5qTUjSS7wi1iwj/l7+m54KWU247nhM3v806UdGj1yDndXj+IOYxxtW9zyLI+xqFNZjTuDaLUqFw== - -import-fresh@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-2.0.0.tgz#d81355c15612d386c61f9ddd3922d4304822a546" - integrity sha1-2BNVwVYS04bGH53dOSLUMEgipUY= - dependencies: - caller-path "^2.0.0" - resolve-from "^3.0.0" + version "4.3.4" + resolved "https://registry.yarnpkg.com/immutable/-/immutable-4.3.4.tgz#2e07b33837b4bb7662f288c244d1ced1ef65a78f" + integrity sha512-fsXeu4J4i6WNWSikpI88v/PcVflZz+6kMhUfIwc5SY+poQRPnaf5V7qds6SUyUN3cVxEzuCab7QIoLOQ+DQ1wA== -import-fresh@^3.0.0, import-fresh@^3.2.1: +import-fresh@^3.2.1, import-fresh@^3.3.0: version "3.3.0" resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.3.0.tgz#37162c25fcb9ebaa2e6e53d5b4d88ce17d9e0c2b" integrity sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw== @@ -6438,12 +5972,12 @@ import-fresh@^3.0.0, import-fresh@^3.2.1: imul@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/imul/-/imul-1.0.1.tgz#9d5867161e8b3de96c2c38d5dc7cb102f35e2ac9" - integrity sha1-nVhnFh6LPelsLDjV3HyxAvNeKsk= + integrity sha512-WFAgfwPLAjU66EKt6vRdTlKj4nAgIDQzh29JonLa4Bqtl6D8JrIMvWjCnx7xEjVNmP3U0fM5o8ZObk7d0f62bA== imurmurhash@^0.1.4: version "0.1.4" resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" - integrity sha1-khi5srkoojixPcT7a21XbyMUU+o= + integrity sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA== indent-string@^4.0.0: version "4.0.0" @@ -6453,7 +5987,7 @@ indent-string@^4.0.0: inflight@^1.0.4: version "1.0.6" resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" - integrity sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk= + integrity sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA== dependencies: once "^1.3.0" wrappy "1" @@ -6468,31 +6002,12 @@ ini@^1.3.5: resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.8.tgz#a29da425b48806f34767a4efce397269af28432c" integrity sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew== -inquirer@^6.2.2: - version "6.5.2" - resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-6.5.2.tgz#ad50942375d036d327ff528c08bd5fab089928ca" - integrity sha512-cntlB5ghuB0iuO65Ovoi8ogLHiWGs/5yNrtUcKjFhSSiVeAIVpD7koaSU9RM8mpXw5YDi9RdYXGQMaOURB7ycQ== - dependencies: - ansi-escapes "^3.2.0" - chalk "^2.4.2" - cli-cursor "^2.1.0" - cli-width "^2.0.0" - external-editor "^3.0.3" - figures "^2.0.0" - lodash "^4.17.12" - mute-stream "0.0.7" - run-async "^2.2.0" - rxjs "^6.4.0" - string-width "^2.1.0" - strip-ansi "^5.1.0" - through "^2.3.6" - -internal-slot@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/internal-slot/-/internal-slot-1.0.3.tgz#7347e307deeea2faac2ac6205d4bc7d34967f59c" - integrity sha512-O0DB1JC/sPyZl7cIo78n5dR7eUSwwpYPiXRhTzNxZVAMUuB8vlnRFyLxdrVToks6XPLVnFfbzaVd5WLjhgg+vA== +internal-slot@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/internal-slot/-/internal-slot-1.0.5.tgz#f2a2ee21f668f8627a4667f309dc0f4fb6674986" + integrity sha512-Y+R5hJrzs52QCG2laLn4udYVnxsfny9CpOhNhUvk/SSSVyF6T27FzRbF0sroPidSu3X8oEAkOn2K804mjpt6UQ== dependencies: - get-intrinsic "^1.1.0" + get-intrinsic "^1.2.0" has "^1.0.3" side-channel "^1.0.4" @@ -6511,7 +6026,7 @@ invariant@^2.2.2: invert-kv@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/invert-kv/-/invert-kv-1.0.0.tgz#104a8e4aaca6d3d8cd157a8ef8bfab2d7a3ffdb6" - integrity sha1-EEqOSqym09jNFXqO+L+rLXo//bY= + integrity sha512-xgs2NH9AE66ucSq4cNG1nhSFghr5l6tdL15Pk+jl46bmmBapgoaY/AacXyaDznAqmGL99TiLSQgO/XazFSKYeQ== io-ts@1.10.4: version "1.10.4" @@ -6528,7 +6043,7 @@ ipaddr.js@1.9.1: is-accessor-descriptor@^0.1.6: version "0.1.6" resolved "https://registry.yarnpkg.com/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz#a9e12cb3ae8d876727eeef3843f8a0897b5c98d6" - integrity sha1-qeEss66Nh2cn7u84Q/igiXtcmNY= + integrity sha512-e1BM1qnDbMRG3ll2U9dSK0UMHuWOs3pY3AtcFsmvwPtKL3MML/Q86i+GilLfvqEs4GW+ExB91tQ3Ig9noDIZ+A== dependencies: kind-of "^3.0.2" @@ -6547,10 +6062,19 @@ is-arguments@^1.0.4: call-bind "^1.0.2" has-tostringtag "^1.0.0" +is-array-buffer@^3.0.1, is-array-buffer@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/is-array-buffer/-/is-array-buffer-3.0.2.tgz#f2653ced8412081638ecb0ebbd0c41c6e0aecbbe" + integrity sha512-y+FyyR/w8vfIRq4eQcM1EYgSTnmHXPqaF+IgzgraytCFq5Xh8lllDVmAZolPJiZttZLeFSINPYMaEJ7/vWUa1w== + dependencies: + call-bind "^1.0.2" + get-intrinsic "^1.2.0" + is-typed-array "^1.1.10" + is-arrayish@^0.2.1: version "0.2.1" resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d" - integrity sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0= + integrity sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg== is-bigint@^1.0.1: version "1.0.4" @@ -6579,41 +6103,34 @@ is-buffer@^1.1.5: resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.6.tgz#efaa2ea9daa0d7ab2ea13a97b2b8ad51fefbe8be" integrity sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w== -is-buffer@~2.0.3: +is-buffer@^2.0.5, is-buffer@~2.0.3: version "2.0.5" resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-2.0.5.tgz#ebc252e400d22ff8d77fa09888821a24a658c191" integrity sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ== -is-callable@^1.1.3, is-callable@^1.1.4, is-callable@^1.2.4: - version "1.2.4" - resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.2.4.tgz#47301d58dd0259407865547853df6d61fe471945" - integrity sha512-nsuwtxZfMX67Oryl9LCQ+upnC0Z0BgpwntpS89m1H/TLF0zNfzfLMV/9Wa/6MZsj0acpEjAO0KF1xT6ZdLl95w== +is-callable@^1.1.3, is-callable@^1.1.4, is-callable@^1.2.7: + version "1.2.7" + resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.2.7.tgz#3bc2a85ea742d9e36205dcacdd72ca1fdc51b055" + integrity sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA== is-ci@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/is-ci/-/is-ci-2.0.0.tgz#6bc6334181810e04b5c22b3d589fdca55026404c" integrity sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w== dependencies: - ci-info "^2.0.0" - -is-core-module@^2.2.0, is-core-module@^2.8.1: - version "2.8.1" - resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.8.1.tgz#f59fdfca701d5879d0a6b100a40aa1560ce27211" - integrity sha512-SdNCUs284hr40hFTFP6l0IfZ/RSrMXF3qgoRHd3/79unUTvrFO/JoXwkGm+5J/Oe3E/b5GsnG330uUNgRpu1PA== - dependencies: - has "^1.0.3" + ci-info "^2.0.0" -is-core-module@^2.9.0: - version "2.10.0" - resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.10.0.tgz#9012ede0a91c69587e647514e1d5277019e728ed" - integrity sha512-Erxj2n/LDAZ7H8WNJXd9tw38GYM3dv8rk8Zcs+jJuxYTW7sozH+SS8NtrSjVL1/vpLvWi1hxy96IzjJ3EHTJJg== +is-core-module@^2.13.0: + version "2.13.0" + resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.13.0.tgz#bb52aa6e2cbd49a30c2ba68c42bf3435ba6072db" + integrity sha512-Z7dk6Qo8pOCp3l4tsX2C5ZVas4V+UxwQodwZhLopL91TX8UyyHEXafPcyoeeWuLrwzHcr3igO78wNLwHJHsMCQ== dependencies: has "^1.0.3" is-data-descriptor@^0.1.4: version "0.1.4" resolved "https://registry.yarnpkg.com/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz#0b5ee648388e2c860282e793f1856fec3f301b56" - integrity sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y= + integrity sha512-+w9D5ulSoBNlmw9OHn3U2v51SyoCd0he+bB3xMl62oijhrspxowjU+AIcDY0N3iEJbUEkB15IlMASQsxYigvXg== dependencies: kind-of "^3.0.2" @@ -6649,11 +6166,6 @@ is-descriptor@^1.0.0, is-descriptor@^1.0.2: is-data-descriptor "^1.0.0" kind-of "^6.0.2" -is-directory@^0.3.1: - version "0.3.1" - resolved "https://registry.yarnpkg.com/is-directory/-/is-directory-0.3.1.tgz#61339b6f2475fc772fd9c9d83f5c8575dc154ae1" - integrity sha1-YTObbyR1/Hcv2cnYP1yFddwVSuE= - is-docker@^2.0.0: version "2.2.1" resolved "https://registry.yarnpkg.com/is-docker/-/is-docker-2.2.1.tgz#33eeabe23cfe86f14bde4408a02c0cfb853acdaa" @@ -6662,7 +6174,7 @@ is-docker@^2.0.0: is-extendable@^0.1.0, is-extendable@^0.1.1: version "0.1.1" resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-0.1.1.tgz#62b110e289a471418e3ec36a617d472e301dfc89" - integrity sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik= + integrity sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw== is-extendable@^1.0.1: version "1.0.1" @@ -6674,7 +6186,7 @@ is-extendable@^1.0.1: is-extglob@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" - integrity sha1-qIwCU1eR8C7TfHahueqXc8gz+MI= + integrity sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ== is-finite@^1.0.0: version "1.1.0" @@ -6684,19 +6196,19 @@ is-finite@^1.0.0: is-fn@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/is-fn/-/is-fn-1.0.0.tgz#9543d5de7bcf5b08a22ec8a20bae6e286d510d8c" - integrity sha1-lUPV3nvPWwiiLsiiC65uKG1RDYw= + integrity sha512-XoFPJQmsAShb3jEQRfzf2rqXavq7fIqF/jOekp308JlThqrODnMpweVSGilKTCXELfLhltGP2AGgbQGVP8F1dg== is-fullwidth-code-point@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz#ef9e31386f031a7f0d643af82fde50c457ef00cb" - integrity sha1-754xOG8DGn8NZDr4L95QxFfvAMs= + integrity sha512-1pqUqRjkhPJ9miNq9SwMfdvi6lBJcd6eFxvfaivQhaH3SgisfiuudvFntdKOmxuee/77l+FPjKrQjWvmPjWrRw== dependencies: number-is-nan "^1.0.0" is-fullwidth-code-point@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz#a3b30a5c4f199183167aaab93beefae3ddfb654f" - integrity sha1-o7MKXE8ZkYMWeqq5O+764937ZU8= + integrity sha512-VHskAKYM8RfSFXwee5t5cbN5PZeq1Wrh6qd5bkyiXIf6UQcN6w/A0eXM9r6t8d+GYOh+o6ZhiEnb88LN/Y8m2w== is-fullwidth-code-point@^3.0.0: version "3.0.0" @@ -6725,9 +6237,9 @@ is-glob@^4.0.0, is-glob@^4.0.1, is-glob@^4.0.3, is-glob@~4.0.1: is-hex-prefixed@1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/is-hex-prefixed/-/is-hex-prefixed-1.0.0.tgz#7d8d37e6ad77e5d127148913c573e082d777f554" - integrity sha1-fY035q135dEnFIkTxXPggtd39VQ= + integrity sha512-WvtOiug1VFrE9v1Cydwm+FnXd3+w9GaeVUss5W4v/SLy3UW00vP+6iNF2SdnfiBoLy4bTqVdkftNGTUeOFVsbA== -is-negative-zero@^2.0.1, is-negative-zero@^2.0.2: +is-negative-zero@^2.0.2: version "2.0.2" resolved "https://registry.yarnpkg.com/is-negative-zero/-/is-negative-zero-2.0.2.tgz#7bf6f03a28003b8b3965de3ac26f664d765f3150" integrity sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA== @@ -6742,7 +6254,7 @@ is-number-object@^1.0.4: is-number@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/is-number/-/is-number-3.0.0.tgz#24fd6201a4782cf50561c810276afc7d12d71195" - integrity sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU= + integrity sha512-4cboCqIpliH+mAvFNegjZQ4kgKc3ZUhQVr3HvWbSh5q3WH2v82ct+T2Y1hdU5Gdtorx/cLifQjqCbL7bpznLTg== dependencies: kind-of "^3.0.2" @@ -6751,15 +6263,10 @@ is-number@^7.0.0: resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b" integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== -is-object@^1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/is-object/-/is-object-1.0.2.tgz#a56552e1c665c9e950b4a025461da87e72f86fcf" - integrity sha512-2rRIahhZr2UWb45fIOuvZGpFtz0TyOZLf32KxBbSoUCeZR495zCKlWUKKUByk3geS2eAs7ZAABt0Y/Rx0GiQGA== - -is-plain-obj@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-1.1.0.tgz#71a50c8429dfca773c92a390a4a03b39fcd51d3e" - integrity sha1-caUMhCnfync8kqOQpKA7OfzVHT4= +is-path-inside@^3.0.3: + version "3.0.3" + resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-3.0.3.tgz#d231362e53a07ff2b0e0ea7fed049161ffd16283" + integrity sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ== is-plain-obj@^2.1.0: version "2.1.0" @@ -6781,22 +6288,17 @@ is-regex@^1.0.4, is-regex@^1.1.4, is-regex@~1.1.4: call-bind "^1.0.2" has-tostringtag "^1.0.0" -is-retry-allowed@^1.0.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/is-retry-allowed/-/is-retry-allowed-1.2.0.tgz#d778488bd0a4666a3be8a1482b9f2baafedea8b4" - integrity sha512-RUbUeKwvm3XG2VYamhJL1xFktgjvPzL0Hq8C+6yrWIswDy3BIXGqCxhxkc30N9jqK311gVU137K8Ei55/zVJRg== - -is-shared-array-buffer@^1.0.1: +is-shared-array-buffer@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz#8f259c573b60b6a32d4058a1a07430c0a7344c79" integrity sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA== dependencies: call-bind "^1.0.2" -is-stream@^1.0.0, is-stream@^1.0.1: +is-stream@^1.0.1: version "1.1.0" resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-1.1.0.tgz#12d4a3dd4e68e0b79ceb8dbc84173ae80d91ca44" - integrity sha1-EtSj3U5o4Lec6428hBc66A2RykQ= + integrity sha512-uQPm8kcs47jx38atAcWTVxyltQYoPT68y9aWYdV6yWXSyW8mzSat0TL6CiWdZeCdF3KrAvpVtnHbTv4RN+rqdQ== is-string@^1.0.5, is-string@^1.0.7: version "1.0.7" @@ -6812,21 +6314,17 @@ is-symbol@^1.0.2, is-symbol@^1.0.3: dependencies: has-symbols "^1.0.2" -is-typed-array@^1.1.3, is-typed-array@^1.1.7: - version "1.1.8" - resolved "https://registry.yarnpkg.com/is-typed-array/-/is-typed-array-1.1.8.tgz#cbaa6585dc7db43318bc5b89523ea384a6f65e79" - integrity sha512-HqH41TNZq2fgtGT8WHVFVJhBVGuY3AnP3Q36K8JKXUxSxRgk/d+7NjmwG2vo2mYmXK8UYZKu0qH8bVP5gEisjA== +is-typed-array@^1.1.10, is-typed-array@^1.1.3, is-typed-array@^1.1.9: + version "1.1.12" + resolved "https://registry.yarnpkg.com/is-typed-array/-/is-typed-array-1.1.12.tgz#d0bab5686ef4a76f7a73097b95470ab199c57d4a" + integrity sha512-Z14TF2JNG8Lss5/HMqt0//T9JeHXttXy5pH/DBU4vi98ozO2btxzq9MwYDZYnKwU8nRsz/+GVFVRDq3DkVuSPg== dependencies: - available-typed-arrays "^1.0.5" - call-bind "^1.0.2" - es-abstract "^1.18.5" - foreach "^2.0.5" - has-tostringtag "^1.0.0" + which-typed-array "^1.1.11" is-typedarray@^1.0.0, is-typedarray@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a" - integrity sha1-5HnICFjfDBsR3dppQPlgEfzaSpo= + integrity sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA== is-unicode-supported@^0.1.0: version "0.1.0" @@ -6841,9 +6339,9 @@ is-url@^1.2.4: is-utf8@^0.2.0: version "0.2.1" resolved "https://registry.yarnpkg.com/is-utf8/-/is-utf8-0.2.1.tgz#4b0da1442104d1b336340e80797e865cf39f7d72" - integrity sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI= + integrity sha512-rMYPYvCzsXywIsldgLaSoPlw5PfoB/ssr7hY4pLfcodrA5M/eArza1a9VmTiNIBNMjOGr1Ow9mTyU2o69U6U9Q== -is-weakref@^1.0.1, is-weakref@^1.0.2: +is-weakref@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/is-weakref/-/is-weakref-1.0.2.tgz#9529f383a9338205e89765e0392efc2f100f06f2" integrity sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ== @@ -6865,42 +6363,39 @@ is-wsl@^2.1.1: isarray@0.0.1: version "0.0.1" resolved "https://registry.yarnpkg.com/isarray/-/isarray-0.0.1.tgz#8a18acfca9a8f4177e09abfc6038939b05d1eedf" - integrity sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8= + integrity sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ== isarray@1.0.0, isarray@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" - integrity sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE= + integrity sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ== + +isarray@^2.0.5: + version "2.0.5" + resolved "https://registry.yarnpkg.com/isarray/-/isarray-2.0.5.tgz#8af1e4c1221244cc62459faf38940d4e644a5723" + integrity sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw== isexe@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" - integrity sha1-6PvzdNxVb/iUehDcsFctYz8s+hA= + integrity sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw== isobject@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/isobject/-/isobject-2.1.0.tgz#f065561096a3f1da2ef46272f815c840d87e0c89" - integrity sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk= + integrity sha512-+OUdGJlgjOBZDfxnDjYYG6zp487z0JGNQq3cYQYg5f5hKR+syHMsaztzGeml/4kGG55CSpKSpWTY+jYGgsHLgA== dependencies: isarray "1.0.0" isobject@^3.0.0, isobject@^3.0.1: version "3.0.1" resolved "https://registry.yarnpkg.com/isobject/-/isobject-3.0.1.tgz#4e431e92b11a9731636aa1f9c8d1ccbcfdab78df" - integrity sha1-TkMekrEalzFjaqH5yNHMvP2reN8= + integrity sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg== isstream@~0.1.2: version "0.1.2" resolved "https://registry.yarnpkg.com/isstream/-/isstream-0.1.2.tgz#47e63f7af55afa6f92e1500e690eb8b8529c099a" - integrity sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo= - -isurl@^1.0.0-alpha5: - version "1.0.0" - resolved "https://registry.yarnpkg.com/isurl/-/isurl-1.0.0.tgz#b27f4f49f3cdaa3ea44a0a5b7f3462e6edc39d67" - integrity sha512-1P/yWsxPlDtn7QeRD+ULKQPaIaN6yF368GZ2vDfv0AL0NwpStafjWCDDdn0k8wgFMWpVAqG7oJhxHnlud42i9w== - dependencies: - has-to-string-tag-x "^1.2.0" - is-object "^1.0.1" + integrity sha512-Yljz7ffyPbrLpLngrMtZ7NduUgVvi6wG9RJ9IUcyCd59YQ911PBJphODUcbOVbqYfxe1wuYf/LJ8PauMRwsM/g== js-graph-algorithms@^1.0.18: version "1.0.18" @@ -6908,14 +6403,14 @@ js-graph-algorithms@^1.0.18: integrity sha512-Gu1wtWzXBzGeye/j9BuyplGHscwqKRZodp/0M1vyBc19RJpblSwKGu099KwwaTx9cRIV+Qupk8xUMfEiGfFqSA== js-sdsl@^4.1.4: - version "4.1.4" - resolved "https://registry.yarnpkg.com/js-sdsl/-/js-sdsl-4.1.4.tgz#78793c90f80e8430b7d8dc94515b6c77d98a26a6" - integrity sha512-Y2/yD55y5jteOAmY50JbUZYwk3CP3wnLPEZnlR1w9oKhITrBEtAxwuWKebFf8hMrPMgbYwFoWK/lH2sBkErELw== + version "4.4.2" + resolved "https://registry.yarnpkg.com/js-sdsl/-/js-sdsl-4.4.2.tgz#2e3c031b1f47d3aca8b775532e3ebb0818e7f847" + integrity sha512-dwXFwByc/ajSV6m5bcKAPwe4yDDF6D614pxmIi5odytzxRlwqF6nwoiCek80Ixc7Cvma5awClxrzFtxCQvcM8w== js-sha3@0.5.7, js-sha3@^0.5.7: version "0.5.7" resolved "https://registry.yarnpkg.com/js-sha3/-/js-sha3-0.5.7.tgz#0d4ffd8002d5333aabaf4a23eed2f6374c9f28e7" - integrity sha1-DU/9gALVMzqrr0oj7tL2N0yfKOc= + integrity sha512-GII20kjaPX0zJ8wzkTbNDYMY7msuZcTWk8S5UOh6806Jq/wz1J8/bnr8uGU0DAUmYDjj2Mr4X1cW8v/GLYnR+g== js-sha3@0.8.0, js-sha3@^0.8.0: version "0.8.0" @@ -6930,7 +6425,7 @@ js-sha3@0.8.0, js-sha3@^0.8.0: js-tokens@^3.0.2: version "3.0.2" resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-3.0.2.tgz#9866df395102130e38f7f996bceb65443209c25b" - integrity sha1-mGbfOVECEw449/mWvOtlRDIJwls= + integrity sha512-RjTcuD4xjtthQkaWH7dFlH85L+QaVtSoOyGdZ3g6HFhS9dFNDfLyqgm2NFe2X6cQpeFmt0452FJjFG5UameExg== js-yaml@3.13.1: version "3.13.1" @@ -6940,7 +6435,7 @@ js-yaml@3.13.1: argparse "^1.0.7" esprima "^4.0.0" -js-yaml@3.x, js-yaml@^3.12.0, js-yaml@^3.13.0, js-yaml@^3.13.1: +js-yaml@3.x, js-yaml@^3.13.1: version "3.14.1" resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.14.1.tgz#dae812fdb3825fa306609a8717383c50c36a0537" integrity sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g== @@ -6958,27 +6453,32 @@ js-yaml@4.1.0, js-yaml@^4.1.0: jsbn@~0.1.0: version "0.1.1" resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-0.1.1.tgz#a5e654c2e5a2deb5f201d96cefbca80c0ef2f513" - integrity sha1-peZUwuWi3rXyAdls77yoDA7y9RM= + integrity sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg== jsesc@^1.3.0: version "1.3.0" resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-1.3.0.tgz#46c3fec8c1892b12b0833db9bc7622176dbab34b" - integrity sha1-RsP+yMGJKxKwgz25vHYiF226s0s= + integrity sha512-Mke0DA0QjUWuJlhsE0ZPPhYiJkRap642SmI/4ztCFaUs6V2AiH1sfecc+57NgaryfAA2VR3v6O+CSjC1jZJKOA== jsesc@~0.5.0: version "0.5.0" resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-0.5.0.tgz#e7dee66e35d6fc16f710fe91d5cf69f70f08911d" - integrity sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0= + integrity sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA== json-buffer@3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/json-buffer/-/json-buffer-3.0.0.tgz#5b1f397afc75d677bde8bcfc0e47e1f9a3d9a898" - integrity sha1-Wx85evx11ne96Lz8Dkfh+aPZqJg= + integrity sha512-CuUqjv0FUZIdXkHPI8MezCnFCdaTAacej1TZYulLoAg1h/PhwkdXFN4V/gzY4g+fMBCOV2xF+rp7t2XD2ns/NQ== -json-parse-better-errors@^1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz#bb867cfb3450e69107c131d1c514bab3dc8bcaa9" - integrity sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw== +json-buffer@3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/json-buffer/-/json-buffer-3.0.1.tgz#9338802a30d3b6605fbe0613e094008ca8c05a13" + integrity sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ== + +json-parse-even-better-errors@^2.3.0: + version "2.3.1" + resolved "https://registry.yarnpkg.com/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz#7c47805a94319928e05777405dc12e1f7a4ee02d" + integrity sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w== json-rpc-engine@^3.4.0, json-rpc-engine@^3.6.0: version "3.8.0" @@ -6995,14 +6495,14 @@ json-rpc-engine@^3.4.0, json-rpc-engine@^3.6.0: json-rpc-error@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/json-rpc-error/-/json-rpc-error-2.0.0.tgz#a7af9c202838b5e905c7250e547f1aff77258a02" - integrity sha1-p6+cICg4tekFxyUOVH8a/3cligI= + integrity sha512-EwUeWP+KgAZ/xqFpaP6YDAXMtCJi+o/QQpCQFIYyxr01AdADi2y413eM8hSqJcoQym9WMePAJWoaODEJufC4Ug== dependencies: inherits "^2.0.1" json-rpc-random-id@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/json-rpc-random-id/-/json-rpc-random-id-1.0.1.tgz#ba49d96aded1444dbb8da3d203748acbbcdec8c8" - integrity sha1-uknZat7RRE27jaPSA3SKy7zeyMg= + integrity sha512-RJ9YYNCkhVDBuP4zN5BBtYAzEl03yq/jIIsyif0JY9qyJuQQZNeDK7anAPKKlyEtLSj2s8h6hNh2F8zO5q7ScA== json-schema-traverse@^0.4.1: version "0.4.1" @@ -7022,36 +6522,36 @@ json-schema@0.4.0: json-stable-stringify-without-jsonify@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz#9db7b59496ad3f3cfef30a75142d2d930ad72651" - integrity sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE= + integrity sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw== json-stable-stringify@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/json-stable-stringify/-/json-stable-stringify-1.0.1.tgz#9a759d39c5f2ff503fd5300646ed445f88c4f9af" - integrity sha1-mnWdOcXy/1A/1TAGRu1EX4jE+a8= + version "1.0.2" + resolved "https://registry.yarnpkg.com/json-stable-stringify/-/json-stable-stringify-1.0.2.tgz#e06f23128e0bbe342dc996ed5a19e28b57b580e0" + integrity sha512-eunSSaEnxV12z+Z73y/j5N37/In40GK4GmsSy+tEHJMxknvqnA7/djeYtAgW0GsWHUfg+847WJjKaEylk2y09g== dependencies: - jsonify "~0.0.0" + jsonify "^0.0.1" json-stringify-safe@~5.0.1: version "5.0.1" resolved "https://registry.yarnpkg.com/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz#1296a2d58fd45f19a0f6ce01d65701e2c735b6eb" - integrity sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus= + integrity sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA== json5@^0.5.1: version "0.5.1" resolved "https://registry.yarnpkg.com/json5/-/json5-0.5.1.tgz#1eade7acc012034ad84e2396767ead9fa5495821" - integrity sha1-Hq3nrMASA0rYTiOWdn6tn6VJWCE= + integrity sha512-4xrs1aW+6N5DalkqSVA8fxh458CXvR99WU8WLKmq4v8eWAL86Xo3BVqyd3SkA9wEVjCMqyvvRRkshAdOnBp5rw== jsonfile@^2.1.0: version "2.4.0" resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-2.4.0.tgz#3736a2b428b87bbda0cc83b53fa3d633a35c2ae8" - integrity sha1-NzaitCi4e72gzIO1P6PWM6NcKug= + integrity sha512-PKllAqbgLgxHaj8TElYymKCAgrASebJrWpTnEkOaTowt23VKXXN0sUeriJ+eh7y6ufb/CC5ap11pz71/cM0hUw== optionalDependencies: graceful-fs "^4.1.6" jsonfile@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-4.0.0.tgz#8771aae0799b64076b76640fca058f9c10e33ecb" - integrity sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss= + integrity sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg== optionalDependencies: graceful-fs "^4.1.6" @@ -7064,15 +6564,15 @@ jsonfile@^6.0.1: optionalDependencies: graceful-fs "^4.1.6" -jsonify@~0.0.0: - version "0.0.0" - resolved "https://registry.yarnpkg.com/jsonify/-/jsonify-0.0.0.tgz#2c74b6ee41d93ca51b7b5aaee8f503631d252a73" - integrity sha1-LHS27kHZPKUbe1qu6PUDYx0lKnM= +jsonify@^0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/jsonify/-/jsonify-0.0.1.tgz#2aa3111dae3d34a0f151c63f3a45d995d9420978" + integrity sha512-2/Ki0GcmuqSrgFyelQq9M05y7PS0mEwuIzrf3f1fPqkVDVRvZrPZtVSMHxdgo8Aq0sxAOb/cr2aqqA3LeWHVPg== jsonschema@^1.2.4: - version "1.4.0" - resolved "https://registry.yarnpkg.com/jsonschema/-/jsonschema-1.4.0.tgz#1afa34c4bc22190d8e42271ec17ac8b3404f87b2" - integrity sha512-/YgW6pRMr6M7C+4o8kS+B/2myEpHCrxO4PEWnqJNBFMjn7EWXqlQ4tGwL6xTHeRplwuZmcAncdvfOad1nT2yMw== + version "1.4.1" + resolved "https://registry.yarnpkg.com/jsonschema/-/jsonschema-1.4.1.tgz#cc4c3f0077fb4542982973d8a083b6b34f482dab" + integrity sha512-S6cATIPVv1z0IlxdN+zUk5EPjkGCdnhN4wVSBlvoUO1tOLJootbo9CquNJmbIh4yikWHiUedhRYrNPn1arpEmQ== jsprim@^1.2.2: version "1.4.2" @@ -7092,10 +6592,10 @@ keccak@3.0.1: node-addon-api "^2.0.0" node-gyp-build "^4.2.0" -keccak@^3.0.0: - version "3.0.2" - resolved "https://registry.yarnpkg.com/keccak/-/keccak-3.0.2.tgz#4c2c6e8c54e04f2670ee49fa734eb9da152206e0" - integrity sha512-PyKKjkH53wDMLGrvmRGSNWgmSxZOUqbnXwKL9tmgbFYA1iAYqW21kfR7mZXV0MlESiefxQQE9X9fTa3X+2MPDQ== +keccak@^3.0.0, keccak@^3.0.2: + version "3.0.3" + resolved "https://registry.yarnpkg.com/keccak/-/keccak-3.0.3.tgz#4bc35ad917be1ef54ff246f904c2bbbf9ac61276" + integrity sha512-JZrLIAJWuZxKbCilMpNz5Vj7Vtb4scDG3dMXLOsbzBmQGyjwE61BbW7bJkfKKCShXiQZt3T6sBgALRtmd+nZaQ== dependencies: node-addon-api "^2.0.0" node-gyp-build "^4.2.0" @@ -7108,17 +6608,24 @@ keyv@^3.0.0: dependencies: json-buffer "3.0.0" +keyv@^4.0.0, keyv@^4.5.3: + version "4.5.3" + resolved "https://registry.yarnpkg.com/keyv/-/keyv-4.5.3.tgz#00873d2b046df737963157bd04f294ca818c9c25" + integrity sha512-QCiSav9WaX1PgETJ+SpNnx2PRRapJ/oRSXM4VO5OGYGSjrxbKPVFVhB3l2OCbLCk329N8qyAtsJjSjvVBWzEug== + dependencies: + json-buffer "3.0.1" + kind-of@^3.0.2, kind-of@^3.0.3, kind-of@^3.2.0: version "3.2.2" resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-3.2.2.tgz#31ea21a734bab9bbb0f32466d893aea51e4a3c64" - integrity sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ= + integrity sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ== dependencies: is-buffer "^1.1.5" kind-of@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-4.0.0.tgz#20813df3d712928b207378691a45066fae72dd57" - integrity sha1-IIE989cSkosgc3hpGkUGb65y3Vc= + integrity sha512-24XsCxmEbRwEDbz/qz3stgin8TTzZ1ESR56OMCN0ujYg+vRutNSiOj9bHH9u85DKgXguraugV5sFuvbD4FW/hw== dependencies: is-buffer "^1.1.5" @@ -7142,19 +6649,19 @@ klaw-sync@^6.0.0: klaw@^1.0.0: version "1.3.1" resolved "https://registry.yarnpkg.com/klaw/-/klaw-1.3.1.tgz#4088433b46b3b1ba259d78785d8e96f73ba02439" - integrity sha1-QIhDO0azsbolnXh4XY6W9zugJDk= + integrity sha512-TED5xi9gGQjGpNnvRWknrwAB1eL5GciPfVFOt3Vk1OJCVDQbzuSfrF3hkUQKlsgKrG1F+0t5W0m+Fje1jIt8rw== optionalDependencies: graceful-fs "^4.1.9" klaw@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/klaw/-/klaw-4.0.1.tgz#8dc6f5723f05894e8e931b516a8ff15c2976d368" - integrity sha512-pgsE40/SvC7st04AHiISNewaIMUbY5V/K8b21ekiPiFoYs/EYSdsGa+FJArB1d441uq4Q8zZyIxvAzkGNlBdRw== + version "4.1.0" + resolved "https://registry.yarnpkg.com/klaw/-/klaw-4.1.0.tgz#5df608067d8cb62bbfb24374f8e5d956323338f3" + integrity sha512-1zGZ9MF9H22UnkpVeuaGKOjfA2t6WrfdrJmGjy16ykcjnKQDmHVX+KI477rpbGevz/5FD4MC3xf1oxylBgcaQw== lcid@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/lcid/-/lcid-1.0.0.tgz#308accafa0bc483a3867b4b6f2b9506251d1b835" - integrity sha1-MIrMr6C8SDo4Z7S28rlQYlHRuDU= + integrity sha512-YiGkH6EnGrDGqLMITnGjXtGmNtjoXw9SVUzcaos8RBi7Ps0VBylkq+vOcY9QE5poLasPCR849ucFUkl0UzUyOw== dependencies: invert-kv "^1.0.0" @@ -7170,11 +6677,6 @@ level-codec@~7.0.0: resolved "https://registry.yarnpkg.com/level-codec/-/level-codec-7.0.1.tgz#341f22f907ce0f16763f24bddd681e395a0fb8a7" integrity sha512-Ua/R9B9r3RasXdRmOtd+t9TCOEIIlts+TN/7XTT2unhDaL6sJn83S3rUyljbr6lVtw49N3/yA0HHjpV6Kzb2aQ== -level-concat-iterator@~2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/level-concat-iterator/-/level-concat-iterator-2.0.1.tgz#1d1009cf108340252cb38c51f9727311193e6263" - integrity sha512-OTKKOqeav2QWcERMJR7IS9CUo1sHnke2C0gkSmcR7QuEtFNLLzHQAvnMw8ykvEcv0Qtkg0p7FOwP1v9e5Smdcw== - level-errors@^1.0.3: version "1.1.2" resolved "https://registry.yarnpkg.com/level-errors/-/level-errors-1.1.2.tgz#4399c2f3d3ab87d0625f7e3676e2d807deff404d" @@ -7208,7 +6710,7 @@ level-iterator-stream@^2.0.3: level-iterator-stream@~1.3.0: version "1.3.1" resolved "https://registry.yarnpkg.com/level-iterator-stream/-/level-iterator-stream-1.3.1.tgz#e43b78b1a8143e6fa97a4f485eb8ea530352f2ed" - integrity sha1-5Dt4sagUPm+pek9IXrjqUwNS8u0= + integrity sha512-1qua0RHNtr4nrZBgYlpV0qHHeHpcRRWTxEZJ8xsemoHAXNL5tbooh4tPEEqIqsbWCAJBmUmkwYK/sW5OrFjWWw== dependencies: inherits "^2.0.1" level-errors "^1.0.3" @@ -7224,15 +6726,6 @@ level-iterator-stream@~3.0.0: readable-stream "^2.3.6" xtend "^4.0.0" -level-iterator-stream@~4.0.0: - version "4.0.2" - resolved "https://registry.yarnpkg.com/level-iterator-stream/-/level-iterator-stream-4.0.2.tgz#7ceba69b713b0d7e22fcc0d1f128ccdc8a24f79c" - integrity sha512-ZSthfEqzGSOMWoUGhTXdX9jv26d32XJuHz/5YnuHZzH6wldfWMOVwI9TBtKcya4BKTyTt3XVA0A3cF3q5CY30Q== - dependencies: - inherits "^2.0.4" - readable-stream "^3.4.0" - xtend "^4.0.2" - level-mem@^3.0.1: version "3.0.1" resolved "https://registry.yarnpkg.com/level-mem/-/level-mem-3.0.1.tgz#7ce8cf256eac40f716eb6489654726247f5a89e5" @@ -7241,22 +6734,6 @@ level-mem@^3.0.1: level-packager "~4.0.0" memdown "~3.0.0" -level-mem@^5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/level-mem/-/level-mem-5.0.1.tgz#c345126b74f5b8aa376dc77d36813a177ef8251d" - integrity sha512-qd+qUJHXsGSFoHTziptAKXoLX87QjR7v2KMbqncDXPxQuCdsQlzmyX+gwrEHhlzn08vkf8TyipYyMmiC6Gobzg== - dependencies: - level-packager "^5.0.3" - memdown "^5.0.0" - -level-packager@^5.0.3: - version "5.1.1" - resolved "https://registry.yarnpkg.com/level-packager/-/level-packager-5.1.1.tgz#323ec842d6babe7336f70299c14df2e329c18939" - integrity sha512-HMwMaQPlTC1IlcwT3+swhqf/NUO+ZhXVz6TY1zZIIZlIR0YSn8GtAAWmIvKjNY16ZkEg/JcpAuQskxsXqC0yOQ== - dependencies: - encoding-down "^6.3.0" - levelup "^4.3.2" - level-packager@~4.0.0: version "4.0.1" resolved "https://registry.yarnpkg.com/level-packager/-/level-packager-4.0.1.tgz#7e7d3016af005be0869bc5fa8de93d2a7f56ffe6" @@ -7288,17 +6765,23 @@ level-sublevel@6.6.4: typewiselite "~1.0.0" xtend "~4.0.0" -level-supports@~1.0.0: +level-supports@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/level-supports/-/level-supports-4.0.1.tgz#431546f9d81f10ff0fea0e74533a0e875c08c66a" + integrity sha512-PbXpve8rKeNcZ9C1mUicC9auIYFyGpkV9/i6g76tLgANwWhtG2v7I4xNBUlkn3lE2/dZF3Pi0ygYGtLc4RXXdA== + +level-transcoder@^1.0.1: version "1.0.1" - resolved "https://registry.yarnpkg.com/level-supports/-/level-supports-1.0.1.tgz#2f530a596834c7301622521988e2c36bb77d122d" - integrity sha512-rXM7GYnW8gsl1vedTJIbzOrRv85c/2uCMpiiCzO2fndd06U/kUXEEU9evYn4zFggBOg36IsBW8LzqIpETwwQzg== + resolved "https://registry.yarnpkg.com/level-transcoder/-/level-transcoder-1.0.1.tgz#f8cef5990c4f1283d4c86d949e73631b0bc8ba9c" + integrity sha512-t7bFwFtsQeD8cl8NIoQ2iwxA0CL/9IFw7/9gAjOonH0PWTTiRfY7Hq+Ejbsxh86tXobDQ6IOiddjNYIfOBs06w== dependencies: - xtend "^4.0.2" + buffer "^6.0.3" + module-error "^1.0.1" level-ws@0.0.0: version "0.0.0" resolved "https://registry.yarnpkg.com/level-ws/-/level-ws-0.0.0.tgz#372e512177924a00424b0b43aef2bb42496d228b" - integrity sha1-Ny5RIXeSSgBCSwtDrvK7QkltIos= + integrity sha512-XUTaO/+Db51Uiyp/t7fCMGVFOTdtLS/NIACxE/GHsij15mKzxksZifKVjlXDF41JMUP/oM1Oc4YNGdKnc3dVLw== dependencies: readable-stream "~1.0.15" xtend "~2.1.1" @@ -7312,14 +6795,13 @@ level-ws@^1.0.0: readable-stream "^2.2.8" xtend "^4.0.1" -level-ws@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/level-ws/-/level-ws-2.0.0.tgz#207a07bcd0164a0ec5d62c304b4615c54436d339" - integrity sha512-1iv7VXx0G9ec1isqQZ7y5LmoZo/ewAsyDHNA8EFDW5hqH2Kqovm33nSFkSdnLLAK+I5FlT+lo5Cw9itGe+CpQA== +level@^8.0.0: + version "8.0.0" + resolved "https://registry.yarnpkg.com/level/-/level-8.0.0.tgz#41b4c515dabe28212a3e881b61c161ffead14394" + integrity sha512-ypf0jjAk2BWI33yzEaaotpq7fkOPALKAgDBxggO6Q9HGX2MRXn0wbP1Jn/tJv1gtL867+YOjOB49WaUF3UoJNQ== dependencies: - inherits "^2.0.3" - readable-stream "^3.1.0" - xtend "^4.0.1" + browser-level "^1.0.1" + classic-level "^1.2.0" levelup@3.1.1, levelup@^3.0.0: version "3.1.1" @@ -7344,37 +6826,31 @@ levelup@^1.2.1: semver "~5.4.1" xtend "~4.0.0" -levelup@^4.3.2: - version "4.4.0" - resolved "https://registry.yarnpkg.com/levelup/-/levelup-4.4.0.tgz#f89da3a228c38deb49c48f88a70fb71f01cafed6" - integrity sha512-94++VFO3qN95cM/d6eBXvd894oJE0w3cInq9USsyQzzoJxmiYzPAocNcuGCPGGjoXqDVJcr3C1jzt1TSjyaiLQ== +levn@^0.4.1: + version "0.4.1" + resolved "https://registry.yarnpkg.com/levn/-/levn-0.4.1.tgz#ae4562c007473b932a6200d403268dd2fffc6ade" + integrity sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ== dependencies: - deferred-leveldown "~5.3.0" - level-errors "~2.0.0" - level-iterator-stream "~4.0.0" - level-supports "~1.0.0" - xtend "~4.0.0" + prelude-ls "^1.2.1" + type-check "~0.4.0" -levn@^0.3.0, levn@~0.3.0: +levn@~0.3.0: version "0.3.0" resolved "https://registry.yarnpkg.com/levn/-/levn-0.3.0.tgz#3b09924edf9f083c0490fdd4c0bc4421e04764ee" - integrity sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4= + integrity sha512-0OO4y2iOHix2W6ujICbKIaEQXvFQHue65vUG3pb5EUomzPI90z9hsA1VsO/dbIIpC53J8gxM9Q4Oho0jrCM/yA== dependencies: prelude-ls "~1.1.2" type-check "~0.3.2" -levn@^0.4.1: - version "0.4.1" - resolved "https://registry.yarnpkg.com/levn/-/levn-0.4.1.tgz#ae4562c007473b932a6200d403268dd2fffc6ade" - integrity sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ== - dependencies: - prelude-ls "^1.2.1" - type-check "~0.4.0" +lines-and-columns@^1.1.6: + version "1.2.4" + resolved "https://registry.yarnpkg.com/lines-and-columns/-/lines-and-columns-1.2.4.tgz#eca284f75d2965079309dc0ad9255abb2ebc1632" + integrity sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg== load-json-file@^1.0.0: version "1.1.0" resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-1.1.0.tgz#956905708d58b4bab4c2261b04f59f31c99374c0" - integrity sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA= + integrity sha512-cy7ZdNRXdablkXYNI049pthVeXFurRyb9+hA/dZzerZ0pGTx42z+y+ssxBaVV2l70t1muq5IdKhn4UtcoGUY9A== dependencies: graceful-fs "^4.1.2" parse-json "^2.2.0" @@ -7385,7 +6861,7 @@ load-json-file@^1.0.0: locate-path@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-2.0.0.tgz#2b568b265eec944c6d9c0de9c3dbbbca0354cd8e" - integrity sha1-K1aLJl7slExtnA3pw9u7ygNUzY4= + integrity sha512-NCI2kiDkyR7VeEKm27Kda/iQHyKJe1Bu0FlTbYp3CqJu+9IFe9bLyAjMxf5ZDDbEg+iMPzB5zYyUTSm8wVTKmA== dependencies: p-locate "^2.0.0" path-exists "^3.0.0" @@ -7415,12 +6891,12 @@ locate-path@^6.0.0: lodash.assign@^4.0.3, lodash.assign@^4.0.6: version "4.2.0" resolved "https://registry.yarnpkg.com/lodash.assign/-/lodash.assign-4.2.0.tgz#0d99f3ccd7a6d261d19bdaeb9245005d285808e7" - integrity sha1-DZnzzNem0mHRm9rrkkUAXShYCOc= + integrity sha512-hFuH8TY+Yji7Eja3mGiuAxBqLagejScbG8GbG0j6o9vzn0YL14My+ktnqtZgFTosKymC9/44wP6s7xyuLfnClw== lodash.camelcase@^4.3.0: version "4.3.0" resolved "https://registry.yarnpkg.com/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz#b28aa6288a2b9fc651035c7711f65ab6190331a6" - integrity sha1-soqmKIorn8ZRA1x3EfZathkDMaY= + integrity sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA== lodash.merge@^4.6.2: version "4.6.2" @@ -7447,7 +6923,7 @@ lodash@4.17.20: resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.20.tgz#b44a9b6297bcb698f1c51a3545a2b3b368d59c52" integrity sha512-PlhdFcillOINfeV7Ni6oF1TAEayyZBoZ8bcshTHqOYJYlrqzRK5hagpagky5o4HfCzzd1TRkXPMFq6cKk9rGmA== -lodash@^4.17.11, lodash@^4.17.12, lodash@^4.17.14, lodash@^4.17.15, lodash@^4.17.19, lodash@^4.17.21, lodash@^4.17.4: +lodash@^4.17.11, lodash@^4.17.14, lodash@^4.17.15, lodash@^4.17.19, lodash@^4.17.21, lodash@^4.17.4: version "4.17.21" resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== @@ -7470,12 +6946,12 @@ log-symbols@4.1.0: looper@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/looper/-/looper-2.0.0.tgz#66cd0c774af3d4fedac53794f742db56da8f09ec" - integrity sha1-Zs0Md0rz1P7axTeU90LbVtqPCew= + integrity sha512-6DzMHJcjbQX/UPHc1rRCBfKlLwDkvuGZ715cIR36wSdYqWXFT35uLXq5P/2orl3tz+t+VOVPxw4yPinQlUDGDQ== looper@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/looper/-/looper-3.0.0.tgz#2efa54c3b1cbaba9b94aee2e5914b0be57fbb749" - integrity sha1-LvpUw7HLq6m5Su4uWRSwvlf7t0k= + integrity sha512-LJ9wplN/uSn72oJRsXTx+snxPet5c8XiZmOKCm906NVYu+ag6SB6vUcnJcWxgnl2NfbIyeobAn7Bwv6xRj2XJg== loose-envify@^1.0.0: version "1.4.0" @@ -7485,9 +6961,9 @@ loose-envify@^1.0.0: js-tokens "^3.0.0 || ^4.0.0" loupe@^2.3.1: - version "2.3.4" - resolved "https://registry.yarnpkg.com/loupe/-/loupe-2.3.4.tgz#7e0b9bffc76f148f9be769cb1321d3dcf3cb25f3" - integrity sha512-OvKfgCC2Ndby6aSTREl5aCCPTNIzlDfQZvZxNUrBrihDhL3xcrYegTblhmEiCrg2kKQz4XsFIaemE5BF4ybSaQ== + version "2.3.6" + resolved "https://registry.yarnpkg.com/loupe/-/loupe-2.3.6.tgz#76e4af498103c532d1ecc9be102036a21f787b53" + integrity sha512-RaPMZKiMy8/JruncMU5Bt6na1eftNoo++R4Y+N2FrxkDVTrGvcyzFTsaGif4QTeKESheMGegbhw6iUAq+5A8zA== dependencies: get-func-name "^2.0.0" @@ -7501,6 +6977,11 @@ lowercase-keys@^2.0.0: resolved "https://registry.yarnpkg.com/lowercase-keys/-/lowercase-keys-2.0.0.tgz#2603e78b7b4b0006cbca2fbcc8a3202558ac9479" integrity sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA== +lowercase-keys@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/lowercase-keys/-/lowercase-keys-3.0.0.tgz#c5e7d442e37ead247ae9db117a9d0a467c89d4f2" + integrity sha512-ozCC6gdQ+glXOQsveKD0YsDy8DSQFjDTz4zyzEHNV5+JP5D62LmfDZ6o1cycFx9ouG940M5dE8C8CTewdj2YWQ== + lru-cache@5.1.1, lru-cache@^5.1.1: version "5.1.1" resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-5.1.1.tgz#1da27e6710271947695daf6848e847f01d84b920" @@ -7511,7 +6992,7 @@ lru-cache@5.1.1, lru-cache@^5.1.1: lru-cache@^3.2.0: version "3.2.0" resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-3.2.0.tgz#71789b3b7f5399bec8565dda38aa30d2a097efee" - integrity sha1-cXibO39Tmb7IVl3aOKow0qCX7+4= + integrity sha512-91gyOKTc2k66UG6kHiH4h3S2eltcPwE1STVfMYC/NG+nZwf8IIuiamfmpGZjpbbxzSyEJaLC0tNSmhjlQUTJow== dependencies: pseudomap "^1.0.1" @@ -7525,17 +7006,17 @@ lru-cache@^6.0.0: lru_map@^0.3.3: version "0.3.3" resolved "https://registry.yarnpkg.com/lru_map/-/lru_map-0.3.3.tgz#b5c8351b9464cbd750335a79650a0ec0e56118dd" - integrity sha1-tcg1G5Rky9dQM1p5ZQoOwOVhGN0= + integrity sha512-Pn9cox5CsMYngeDbmChANltQl+5pi6XmTrraMSzhPmMBbmgcxmqWry0U3PGapCU1yB4/LqCcom7qhHZiF/jGfQ== ltgt@^2.1.2, ltgt@~2.2.0: version "2.2.1" resolved "https://registry.yarnpkg.com/ltgt/-/ltgt-2.2.1.tgz#f35ca91c493f7b73da0e07495304f17b31f87ee5" - integrity sha1-81ypHEk/e3PaDgdJUwTxezH4fuU= + integrity sha512-AI2r85+4MquTw9ZYqabu4nMwy9Oftlfa/e/52t9IjtfG+mGBbTNdAoZ3RQKLHR6r0wQnwZnPIEh/Ya6XTWAKNA== ltgt@~2.1.1: version "2.1.3" resolved "https://registry.yarnpkg.com/ltgt/-/ltgt-2.1.3.tgz#10851a06d9964b971178441c23c9e52698eece34" - integrity sha1-EIUaBtmWS5cReEQcI8nlJpjuzjQ= + integrity sha512-5VjHC5GsENtIi5rbJd+feEpDKhfr7j0odoUR2Uh978g+2p93nd5o34cTjQWohXsPsCZeqoDnIqEf88mPCe0Pfw== make-error@^1.1.1: version "1.3.6" @@ -7545,12 +7026,12 @@ make-error@^1.1.1: map-cache@^0.2.2: version "0.2.2" resolved "https://registry.yarnpkg.com/map-cache/-/map-cache-0.2.2.tgz#c32abd0bd6525d9b051645bb4f26ac5dc98a0dbf" - integrity sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8= + integrity sha512-8y/eV9QQZCiyn1SprXSrCmqJN0yNRATe+PO8ztwqrvrbdRLA3eYJF0yaR0YayLWkMbsQSKWS9N2gPcGEc4UsZg== map-visit@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/map-visit/-/map-visit-1.0.0.tgz#ecdca8f13144e660f1b5bd41f12f3479d98dfb8f" - integrity sha1-7Nyo8TFE5mDxtb1B8S80edmN+48= + integrity sha512-4y7uGv8bd2WdM9vpQsiQNo41Ln1NvhvDRuVt0k2JZQ+ezN2uaQes7lZeZ+QQUHOLQAtDaBJ+7wCbi+ab/KFs+w== dependencies: object-visit "^1.0.0" @@ -7581,12 +7062,12 @@ md5.js@^1.3.4: media-typer@0.3.0: version "0.3.0" resolved "https://registry.yarnpkg.com/media-typer/-/media-typer-0.3.0.tgz#8710d7af0aa626f8fffa1ce00168545263255748" - integrity sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g= + integrity sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ== memdown@^1.0.0: version "1.4.1" resolved "https://registry.yarnpkg.com/memdown/-/memdown-1.4.1.tgz#b4e4e192174664ffbae41361aa500f3119efe215" - integrity sha1-tOThkhdGZP+65BNhqlAPMRnv4hU= + integrity sha512-iVrGHZB8i4OQfM155xx8akvG9FIj+ht14DX5CQkCTG4EHzZ3d3sgckIf/Lm9ivZalEsFuEVnWv2B2WZvbrro2w== dependencies: abstract-leveldown "~2.7.1" functional-red-black-tree "^1.0.1" @@ -7595,18 +7076,6 @@ memdown@^1.0.0: ltgt "~2.2.0" safe-buffer "~5.1.1" -memdown@^5.0.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/memdown/-/memdown-5.1.0.tgz#608e91a9f10f37f5b5fe767667a8674129a833cb" - integrity sha512-B3J+UizMRAlEArDjWHTMmadet+UKwHd3UjMgGBkZcKAxAYVPS9o0Yeiha4qvz7iGiL2Sb3igUft6p7nbFWctpw== - dependencies: - abstract-leveldown "~6.2.1" - functional-red-black-tree "~1.0.1" - immediate "~3.2.3" - inherits "~2.0.1" - ltgt "~2.2.0" - safe-buffer "~5.2.0" - memdown@~3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/memdown/-/memdown-3.0.0.tgz#93aca055d743b20efc37492e9e399784f2958309" @@ -7619,15 +7088,24 @@ memdown@~3.0.0: ltgt "~2.2.0" safe-buffer "~5.1.1" +memory-level@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/memory-level/-/memory-level-1.0.0.tgz#7323c3fd368f9af2f71c3cd76ba403a17ac41692" + integrity sha512-UXzwewuWeHBz5krr7EvehKcmLFNoXxGcvuYhC41tRnkrTbJohtS7kVn9akmgirtRygg+f7Yjsfi8Uu5SGSQ4Og== + dependencies: + abstract-level "^1.0.0" + functional-red-black-tree "^1.0.1" + module-error "^1.0.1" + memorystream@^0.3.1: version "0.3.1" resolved "https://registry.yarnpkg.com/memorystream/-/memorystream-0.3.1.tgz#86d7090b30ce455d63fbae12dda51a47ddcaf9b2" - integrity sha1-htcJCzDORV1j+64S3aUaR93K+bI= + integrity sha512-S3UwM3yj5mtUSEfP41UZmt/0SCoVYUcU1rkXv+BQ5Ig8ndL4sPoJNBUJERafdPb5jjHJGuMgytgKvKIf58XNBw== merge-descriptors@1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/merge-descriptors/-/merge-descriptors-1.0.1.tgz#b00aaa556dd8b44568150ec9d1b953f3f90cbb61" - integrity sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E= + integrity sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w== merge2@^1.2.3, merge2@^1.3.0, merge2@^1.4.1: version "1.4.1" @@ -7661,22 +7139,15 @@ merkle-patricia-tree@^2.1.2, merkle-patricia-tree@^2.3.2: rlp "^2.0.0" semaphore ">=1.0.1" -merkle-patricia-tree@^4.2.2, merkle-patricia-tree@^4.2.4: - version "4.2.4" - resolved "https://registry.yarnpkg.com/merkle-patricia-tree/-/merkle-patricia-tree-4.2.4.tgz#ff988d045e2bf3dfa2239f7fabe2d59618d57413" - integrity sha512-eHbf/BG6eGNsqqfbLED9rIqbsF4+sykEaBn6OLNs71tjclbMcMOk1tEPmJKcNcNCLkvbpY/lwyOlizWsqPNo8w== - dependencies: - "@types/levelup" "^4.3.0" - ethereumjs-util "^7.1.4" - level-mem "^5.0.1" - level-ws "^2.0.0" - readable-stream "^3.6.0" - semaphore-async-await "^1.5.1" - methods@~1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/methods/-/methods-1.1.2.tgz#5529a4d67654134edcc5266656835b0f851afcee" - integrity sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4= + integrity sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w== + +micro-ftch@^0.3.1: + version "0.3.1" + resolved "https://registry.yarnpkg.com/micro-ftch/-/micro-ftch-0.3.1.tgz#6cb83388de4c1f279a034fb0cf96dfc050853c5f" + integrity sha512-/0LLxhzP0tfiR5hcQebtudP56gUurs2CLkGarnCiB/OqEyUFQ6U3paQi/tgLv0hBJYt2rnr9MNpxz4fiiugstg== micromatch@^3.1.4: version "3.1.10" @@ -7697,7 +7168,7 @@ micromatch@^3.1.4: snapdragon "^0.8.1" to-regex "^3.0.2" -micromatch@^4.0.2: +micromatch@^4.0.2, micromatch@^4.0.4: version "4.0.5" resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.5.tgz#bc8999a7cbbf77cdc89f132f6e467051b49090c6" integrity sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA== @@ -7705,14 +7176,6 @@ micromatch@^4.0.2: braces "^3.0.2" picomatch "^2.3.1" -micromatch@^4.0.4: - version "4.0.4" - resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.4.tgz#896d519dfe9db25fce94ceb7a500919bf881ebf9" - integrity sha512-pRmzw/XUcwXGpD9aI9q/0XOwLNygjETJ8y0ao0wdqprrzDa4YnxLcz7fQRZr8voh8V10kGhABbNcHVk5wHgWwg== - dependencies: - braces "^3.0.1" - picomatch "^2.2.3" - miller-rabin@^4.0.0: version "4.0.1" resolved "https://registry.yarnpkg.com/miller-rabin/-/miller-rabin-4.0.1.tgz#f080351c865b0dc562a8462966daa53543c78a4d" @@ -7738,20 +7201,20 @@ mime@1.6.0: resolved "https://registry.yarnpkg.com/mime/-/mime-1.6.0.tgz#32cd9e5c64553bd58d19a568af452acff04981b1" integrity sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg== -mimic-fn@^1.0.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-1.2.0.tgz#820c86a39334640e99516928bd03fca88057d022" - integrity sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ== - mimic-response@^1.0.0, mimic-response@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/mimic-response/-/mimic-response-1.0.1.tgz#4923538878eef42063cb8a3e3b0798781487ab1b" integrity sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ== +mimic-response@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/mimic-response/-/mimic-response-3.1.0.tgz#2d1d59af9c1b129815accc2c46a022a5ce1fa3c9" + integrity sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ== + min-document@^2.19.0: version "2.19.0" resolved "https://registry.yarnpkg.com/min-document/-/min-document-2.19.0.tgz#7bd282e3f5842ed295bb748cdd9f1ffa2c824685" - integrity sha1-e9KC4/WELtKVu3SM3Z8f+iyCRoU= + integrity sha512-9Wy1B3m3f66bPPmU5hdA4DR4PB2OfDU/+GS3yAB7IQozE3tqXaVv2zOjgla7MEGSRv95+ILmOuvhLkOK6wJtCQ== dependencies: dom-walk "^0.1.0" @@ -7763,40 +7226,40 @@ minimalistic-assert@^1.0.0, minimalistic-assert@^1.0.1: minimalistic-crypto-utils@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz#f6c00c1c0b082246e5c4d99dfb8c7c083b2b582a" - integrity sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo= + integrity sha512-JIYlbt6g8i5jKfJ3xz7rF0LXmv2TkDxBLUkiBeZ7bAx4GnnNMr8xFpGnOxn6GhTEHx3SjRrZEoU+j04prX1ktg== -"minimatch@2 || 3", minimatch@3.0.4: - version "3.0.4" - resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083" - integrity sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA== +"minimatch@2 || 3", minimatch@^3.0.4, minimatch@^3.0.5, minimatch@^3.1.1, minimatch@^3.1.2: + version "3.1.2" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.1.2.tgz#19cd194bfd3e428f049a70817c038d89ab4be35b" + integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw== dependencies: brace-expansion "^1.1.7" -minimatch@4.2.1: - version "4.2.1" - resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-4.2.1.tgz#40d9d511a46bdc4e563c22c3080cde9c0d8299b4" - integrity sha512-9Uq1ChtSZO+Mxa/CL1eGizn2vRn3MlLgzhT0Iz8zaY8NdvxvB0d5QdPFmCKf7JKA9Lerx5vRrnwO03jsSfGG9g== +minimatch@3.0.4: + version "3.0.4" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083" + integrity sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA== dependencies: brace-expansion "^1.1.7" -minimatch@^3.0.4, minimatch@^3.1.1, minimatch@^3.1.2: - version "3.1.2" - resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.1.2.tgz#19cd194bfd3e428f049a70817c038d89ab4be35b" - integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw== +minimatch@5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-5.0.1.tgz#fb9022f7528125187c92bd9e9b6366be1cf3415b" + integrity sha512-nLDxIFRyhDblz3qMuq+SoRZED4+miJ/G+tdDrjkkkRnjAsBexeGpgjLEQ0blJy7rHhR2b93rhQY4SvyWu9v03g== dependencies: - brace-expansion "^1.1.7" + brace-expansion "^2.0.1" minimatch@^5.0.1: - version "5.1.0" - resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-5.1.0.tgz#1717b464f4971b144f6aabe8f2d0b8e4511e09c7" - integrity sha512-9TPBGGak4nHfGZsPBohm9AWg6NoT7QTCehS3BIJABslyZbzxfV78QM2Y6+i741OPZIafFAaiiEMh5OyIrJPgtg== + version "5.1.6" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-5.1.6.tgz#1cfcb8cf5522ea69952cd2af95ae09477f122a96" + integrity sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g== dependencies: brace-expansion "^2.0.1" -minimist@^1.2.0, minimist@^1.2.5, minimist@^1.2.6, minimist@~1.2.5: - version "1.2.6" - resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.6.tgz#8637a5b759ea0d6e98702cfb3a9283323c93af44" - integrity sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q== +minimist@^1.2.0, minimist@^1.2.5, minimist@^1.2.6, minimist@~1.2.7: + version "1.2.8" + resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.8.tgz#c1a464e7693302e082a075cee0c057741ac4772c" + integrity sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA== minipass@^2.6.0, minipass@^2.9.0: version "2.9.0" @@ -7829,29 +7292,34 @@ mkdirp-classic@^0.5.2: mkdirp-promise@^5.0.1: version "5.0.1" resolved "https://registry.yarnpkg.com/mkdirp-promise/-/mkdirp-promise-5.0.1.tgz#e9b8f68e552c68a9c1713b84883f7a1dd039b8a1" - integrity sha1-6bj2jlUsaKnBcTuEiD96HdA5uKE= + integrity sha512-Hepn5kb1lJPtVW84RFT40YG1OddBNTOVUZR2bzQUHc+Z03en8/3uX0+060JDhcEzyO08HmipsN9DcnFMxhIL9w== dependencies: mkdirp "*" -mkdirp@*, mkdirp@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-1.0.4.tgz#3eb5ed62622756d79a5f0e2a221dfebad75c2f7e" - integrity sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw== +mkdirp@*: + version "3.0.1" + resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-3.0.1.tgz#e44e4c5607fb279c168241713cc6e0fea9adcb50" + integrity sha512-+NsyUUAZDmo6YVHzL/stxSu3t9YS1iljliy3BSDrXJ/dkn1KYdmtZODGGjLcc9XLgVVpH4KshHB8XmZgMhaBXg== -mkdirp@0.5.5, mkdirp@0.5.x: +mkdirp@0.5.5: version "0.5.5" resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.5.tgz#d91cefd62d1436ca0f41620e251288d420099def" integrity sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ== dependencies: minimist "^1.2.5" -mkdirp@^0.5.1, mkdirp@^0.5.3, mkdirp@^0.5.5: +mkdirp@0.5.x, mkdirp@^0.5.1, mkdirp@^0.5.3, mkdirp@^0.5.5: version "0.5.6" resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.6.tgz#7def03d2432dcae4ba1d611445c48396062255f6" integrity sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw== dependencies: minimist "^1.2.6" +mkdirp@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-1.0.4.tgz#3eb5ed62622756d79a5f0e2a221dfebad75c2f7e" + integrity sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw== + mnemonist@^0.38.0: version "0.38.5" resolved "https://registry.yarnpkg.com/mnemonist/-/mnemonist-0.38.5.tgz#4adc7f4200491237fe0fa689ac0b86539685cade" @@ -7859,6 +7327,33 @@ mnemonist@^0.38.0: dependencies: obliterator "^2.0.0" +mocha@^10.0.0: + version "10.2.0" + resolved "https://registry.yarnpkg.com/mocha/-/mocha-10.2.0.tgz#1fd4a7c32ba5ac372e03a17eef435bd00e5c68b8" + integrity sha512-IDY7fl/BecMwFHzoqF2sg/SHHANeBoMMXFlS9r0OXKDssYE1M5O43wUY/9BVPeIvfH2zmEbBfseqN9gBQZzXkg== + dependencies: + ansi-colors "4.1.1" + browser-stdout "1.3.1" + chokidar "3.5.3" + debug "4.3.4" + diff "5.0.0" + escape-string-regexp "4.0.0" + find-up "5.0.0" + glob "7.2.0" + he "1.2.0" + js-yaml "4.1.0" + log-symbols "4.1.0" + minimatch "5.0.1" + ms "2.1.3" + nanoid "3.3.3" + serialize-javascript "6.0.0" + strip-json-comments "3.1.1" + supports-color "8.1.1" + workerpool "6.2.1" + yargs "16.2.0" + yargs-parser "20.2.4" + yargs-unparser "2.0.0" + mocha@^7.1.1: version "7.2.0" resolved "https://registry.yarnpkg.com/mocha/-/mocha-7.2.0.tgz#01cc227b00d875ab1eed03a75106689cfed5a604" @@ -7889,45 +7384,20 @@ mocha@^7.1.1: yargs-parser "13.1.2" yargs-unparser "1.6.0" -mocha@^9.2.0: - version "9.2.2" - resolved "https://registry.yarnpkg.com/mocha/-/mocha-9.2.2.tgz#d70db46bdb93ca57402c809333e5a84977a88fb9" - integrity sha512-L6XC3EdwT6YrIk0yXpavvLkn8h+EU+Y5UcCHKECyMbdUIxyMuZj4bX4U9e1nvnvUUvQVsV2VHQr5zLdcUkhW/g== - dependencies: - "@ungap/promise-all-settled" "1.1.2" - ansi-colors "4.1.1" - browser-stdout "1.3.1" - chokidar "3.5.3" - debug "4.3.3" - diff "5.0.0" - escape-string-regexp "4.0.0" - find-up "5.0.0" - glob "7.2.0" - growl "1.10.5" - he "1.2.0" - js-yaml "4.1.0" - log-symbols "4.1.0" - minimatch "4.2.1" - ms "2.1.3" - nanoid "3.3.1" - serialize-javascript "6.0.0" - strip-json-comments "3.1.1" - supports-color "8.1.1" - which "2.0.2" - workerpool "6.2.0" - yargs "16.2.0" - yargs-parser "20.2.4" - yargs-unparser "2.0.0" - mock-fs@^4.1.0: version "4.14.0" resolved "https://registry.yarnpkg.com/mock-fs/-/mock-fs-4.14.0.tgz#ce5124d2c601421255985e6e94da80a7357b1b18" integrity sha512-qYvlv/exQ4+svI3UOvPUpLDF0OMX5euvUH0Ny4N5QyRyhNdgAgUrVH3iUINSzEPLvx0kbo/Bp28GJKIqvE7URw== +module-error@^1.0.1, module-error@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/module-error/-/module-error-1.0.2.tgz#8d1a48897ca883f47a45816d4fb3e3c6ba404d86" + integrity sha512-0yuvsqSCv8LbaOKhnsQ/T5JhyFlCYLPXK3U2sgV10zoKQwzs/MyfuQUOZQ1V/6OCOJsK/TRgNVrPuPDqtdMFtA== + ms@2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" - integrity sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g= + integrity sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A== ms@2.1.1: version "2.1.1" @@ -7993,20 +7463,15 @@ murmur-128@^0.2.1: fmix "^0.1.0" imul "^1.0.0" -mute-stream@0.0.7: - version "0.0.7" - resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.7.tgz#3075ce93bc21b8fab43e1bc4da7e8115ed1e7bab" - integrity sha1-MHXOk7whuPq0PhvE2n6BFe0ee6s= - nano-json-stream-parser@^0.1.2: version "0.1.2" resolved "https://registry.yarnpkg.com/nano-json-stream-parser/-/nano-json-stream-parser-0.1.2.tgz#0cc8f6d0e2b622b479c40d499c46d64b755c6f5f" - integrity sha1-DMj20OK2IrR5xA1JnEbWS3Vcb18= + integrity sha512-9MqxMH/BSJC7dnLsEMPyfN5Dvoo49IsPFYMcHw3Bcfc2kN0lpHRBSzlMSVx4HGyJ7s9B31CyBTVehWJoQ8Ctew== -nanoid@3.3.1: - version "3.3.1" - resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.1.tgz#6347a18cac88af88f58af0b3594b723d5e99bb35" - integrity sha512-n6Vs/3KGyxPQd6uO0eH4Bv0ojGSUvuLlIHtC3Y0kEO23YRge8H9x1GCzLn28YX0H66pMkxuaeESFq4tKISKwdw== +nanoid@3.3.3: + version "3.3.3" + resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.3.tgz#fd8e8b7aa761fe807dba2d1b98fb7241bb724a25" + integrity sha512-p1sjXuopFs0xg+fPASzQ28agW1oHD7xDsd9Xkf3T15H3c/cifrFHVwrh74PdoklAPi+i7MdRsE47vm2r6JoB+w== nanomatch@^1.2.9: version "1.2.13" @@ -8025,17 +7490,27 @@ nanomatch@^1.2.9: snapdragon "^0.8.1" to-regex "^3.0.1" +napi-macros@^2.2.2: + version "2.2.2" + resolved "https://registry.yarnpkg.com/napi-macros/-/napi-macros-2.2.2.tgz#817fef20c3e0e40a963fbf7b37d1600bd0201044" + integrity sha512-hmEVtAGYzVQpCKdbQea4skABsdXW4RUh5t5mJ2zzqowJS2OyXZTU1KhDVFhx+NlWZ4ap9mqR9TcDO3LTTttd+g== + +natural-compare-lite@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/natural-compare-lite/-/natural-compare-lite-1.4.0.tgz#17b09581988979fddafe0201e931ba933c96cbb4" + integrity sha512-Tj+HTDSJJKaZnfiuw+iaF9skdPpTo2GtEly5JHnWV/hfv2Qj/9RKsGISQtLh2ox3l5EAGw487hnBee0sIJ6v2g== + natural-compare@^1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" - integrity sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc= + integrity sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw== negotiator@0.6.3: version "0.6.3" resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.3.tgz#58e323a72fedc0d6f9cd4d31fe49f51479590ccd" integrity sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg== -neo-async@^2.6.0: +neo-async@^2.6.2: version "2.6.2" resolved "https://registry.yarnpkg.com/neo-async/-/neo-async-2.6.2.tgz#b4aafb93e3aeb2d8174ca53cf163ab7d7308305f" integrity sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw== @@ -8070,13 +7545,20 @@ node-environment-flags@1.0.6: object.getownpropertydescriptors "^2.0.3" semver "^5.7.0" -node-fetch@2.6.7, node-fetch@^2.6.1, node-fetch@^2.6.7: +node-fetch@2.6.7: version "2.6.7" resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.6.7.tgz#24de9fba827e3b4ae44dc8b20256a379160052ad" integrity sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ== dependencies: whatwg-url "^5.0.0" +node-fetch@^2.6.1, node-fetch@^2.6.12, node-fetch@^2.6.7: + version "2.7.0" + resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.7.0.tgz#d0f0fa6e3e2dc1d27efcd8ad99d550bda94d187d" + integrity sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A== + dependencies: + whatwg-url "^5.0.0" + node-fetch@~1.7.1: version "1.7.3" resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-1.7.3.tgz#980f6f72d85211a5347c6b2bc18c5b84c3eb47ef" @@ -8086,19 +7568,19 @@ node-fetch@~1.7.1: is-stream "^1.0.1" node-gyp-build@^4.2.0, node-gyp-build@^4.3.0: - version "4.4.0" - resolved "https://registry.yarnpkg.com/node-gyp-build/-/node-gyp-build-4.4.0.tgz#42e99687ce87ddeaf3a10b99dc06abc11021f3f4" - integrity sha512-amJnQCcgtRVw9SvoebO3BKGESClrfXGCUTX9hSn1OuGQTQBOZmVd0Z0OlecpuRksKvbsUqALE8jls/ErClAPuQ== + version "4.6.1" + resolved "https://registry.yarnpkg.com/node-gyp-build/-/node-gyp-build-4.6.1.tgz#24b6d075e5e391b8d5539d98c7fc5c210cac8a3e" + integrity sha512-24vnklJmyRS8ViBNI8KbtK/r/DmXQMRiOMXTNz2nrTnAYUwjmEEbnnpB/+kt+yWRv73bPsSPRFddrcIbAxSiMQ== -nofilter@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/nofilter/-/nofilter-1.0.4.tgz#78d6f4b6a613e7ced8b015cec534625f7667006e" - integrity sha512-N8lidFp+fCz+TD51+haYdbDGrcBWwuHX40F5+z0qkUjMJ5Tp+rdSuAkMJ9N9eoolDlEVTf6u5icM+cNKkKW2mA== +nofilter@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/nofilter/-/nofilter-3.1.0.tgz#c757ba68801d41ff930ba2ec55bab52ca184aa66" + integrity sha512-l2NNj07e9afPnhAhvgVrCD/oy2Ai1yfLpuo3EpiO1jFTsB4sFz6oIfAfSZyQzVpkZQ9xS8ZS5g1jCBgq4Hwo0g== nopt@3.x: version "3.0.6" resolved "https://registry.yarnpkg.com/nopt/-/nopt-3.0.6.tgz#c6465dbf08abcd4db359317f79ac68a646b28ff9" - integrity sha1-xkZdvwirzU2zWTF/eaxopkayj/k= + integrity sha512-4GUt3kSEYmk4ITxzB/b9vaIDfUVWN/Ml1Fwl11IlnIG2iaJ9O6WXZ9SrYM9NLI8OCBieN2Y8SWC2oJV0RQ7qYg== dependencies: abbrev "1" @@ -8122,6 +7604,11 @@ normalize-url@^4.1.0: resolved "https://registry.yarnpkg.com/normalize-url/-/normalize-url-4.5.1.tgz#0dd90cf1288ee1d1313b87081c9a5932ee48518a" integrity sha512-9UZCFRHQdNrfTpGg8+1INIg93B6zE0aXMVFkw1WFwvO4SlZywU6aLg5Of0Ap/PgcbSw4LNxvMWXMeugwMCX0AA== +normalize-url@^6.0.1: + version "6.1.0" + resolved "https://registry.yarnpkg.com/normalize-url/-/normalize-url-6.1.0.tgz#40d0885b535deffe3f3147bec877d05fe4c5668a" + integrity sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A== + nth-check@^2.0.1: version "2.1.1" resolved "https://registry.yarnpkg.com/nth-check/-/nth-check-2.1.1.tgz#c9eab428effce36cd6b92c924bdb000ef1f1ed1d" @@ -8132,12 +7619,12 @@ nth-check@^2.0.1: number-is-nan@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/number-is-nan/-/number-is-nan-1.0.1.tgz#097b602b53422a522c1afb8790318336941a011d" - integrity sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0= + integrity sha512-4jbtZXNAsfZbAHiiqjLPBiCl16dES1zI4Hpzzxw61Tk+loF+sBDBKx1ICKKKwIqQ7M0mFn1TmkN7euSncWgHiQ== number-to-bn@1.7.0: version "1.7.0" resolved "https://registry.yarnpkg.com/number-to-bn/-/number-to-bn-1.7.0.tgz#bb3623592f7e5f9e0030b1977bd41a0c53fe1ea0" - integrity sha1-uzYjWS9+X54AMLGXe9QaDFP+HqA= + integrity sha512-wsJ9gfSz1/s4ZsJN01lyonwuxA1tml6X1yBDnfpMglypcBRFZZkus26EdPSlqS5GJfYddVZa22p3VNb3z5m5Ig== dependencies: bn.js "4.11.6" strip-hex-prefix "1.0.0" @@ -8150,21 +7637,21 @@ oauth-sign@~0.9.0: object-assign@^4, object-assign@^4.0.0, object-assign@^4.1.0, object-assign@^4.1.1: version "4.1.1" resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" - integrity sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM= + integrity sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg== object-copy@^0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/object-copy/-/object-copy-0.1.0.tgz#7e7d858b781bd7c991a41ba975ed3812754e998c" - integrity sha1-fn2Fi3gb18mRpBupde04EnVOmYw= + integrity sha512-79LYn6VAb63zgtmAteVOWo9Vdj71ZVBy3Pbse+VqxDpEP83XuujMrGqHIwAXJ5I/aM0zU7dIyIAhifVTPrNItQ== dependencies: copy-descriptor "^0.1.0" define-property "^0.2.5" kind-of "^3.0.3" -object-inspect@^1.11.0, object-inspect@^1.12.0, object-inspect@^1.9.0, object-inspect@~1.12.0: - version "1.12.0" - resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.12.0.tgz#6e2c120e868fd1fd18cb4f18c31741d0d6e776f0" - integrity sha512-Ho2z80bVIvJloH+YzRmpZVQe87+qASmBUKZDWgx9cu+KDrX2ZDH/3tMy+gXbZETVGs2M8YdxObOh7XAtim9Y0g== +object-inspect@^1.12.3, object-inspect@^1.9.0, object-inspect@~1.12.3: + version "1.12.3" + resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.12.3.tgz#ba62dffd67ee256c8c086dfae69e016cd1f198b9" + integrity sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g== object-is@^1.0.1: version "1.1.5" @@ -8174,7 +7661,7 @@ object-is@^1.0.1: call-bind "^1.0.2" define-properties "^1.1.3" -object-keys@^1.0.11, object-keys@^1.0.12, object-keys@^1.1.1: +object-keys@^1.0.11, object-keys@^1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.1.1.tgz#1c47f272df277f3b1daf061677d9c82e2322c60e" integrity sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA== @@ -8182,12 +7669,12 @@ object-keys@^1.0.11, object-keys@^1.0.12, object-keys@^1.1.1: object-keys@~0.4.0: version "0.4.0" resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-0.4.0.tgz#28a6aae7428dd2c3a92f3d95f21335dd204e0336" - integrity sha1-KKaq50KN0sOpLz2V8hM13SBOAzY= + integrity sha512-ncrLw+X55z7bkl5PnUvHwFK9FcGuFYo9gtjws2XtSzL+aZ8tm830P60WJ0dSmFVaSalWieW5MD7kEdnXda9yJw== object-visit@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/object-visit/-/object-visit-1.0.1.tgz#f79c4493af0c5377b59fe39d395e41042dd045bb" - integrity sha1-95xEk68MU3e1n+OdOV5BBC3QRbs= + integrity sha512-GBaMwwAVK9qbQN3Scdo0OyvgPW7l3lnaVMj84uTOZlswkX0KpF6fyDBJhtTthf7pymztoN36/KEr1DyhF96zEA== dependencies: isobject "^3.0.0" @@ -8201,48 +7688,50 @@ object.assign@4.1.0: has-symbols "^1.0.0" object-keys "^1.0.11" -object.assign@^4.1.2: - version "4.1.2" - resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.2.tgz#0ed54a342eceb37b38ff76eb831a0e788cb63940" - integrity sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ== +object.assign@^4.1.4: + version "4.1.4" + resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.4.tgz#9673c7c7c351ab8c4d0b516f4343ebf4dfb7799f" + integrity sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ== dependencies: - call-bind "^1.0.0" - define-properties "^1.1.3" - has-symbols "^1.0.1" + call-bind "^1.0.2" + define-properties "^1.1.4" + has-symbols "^1.0.3" object-keys "^1.1.1" -object.getownpropertydescriptors@^2.0.3, object.getownpropertydescriptors@^2.1.1: - version "2.1.3" - resolved "https://registry.yarnpkg.com/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.3.tgz#b223cf38e17fefb97a63c10c91df72ccb386df9e" - integrity sha512-VdDoCwvJI4QdC6ndjpqFmoL3/+HxffFBbcJzKi5hwLLqqx3mdbedRpfZDdK0SrOSauj8X4GzBvnDZl4vTN7dOw== +object.getownpropertydescriptors@^2.0.3, object.getownpropertydescriptors@^2.1.6: + version "2.1.7" + resolved "https://registry.yarnpkg.com/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.7.tgz#7a466a356cd7da4ba8b9e94ff6d35c3eeab5d56a" + integrity sha512-PrJz0C2xJ58FNn11XV2lr4Jt5Gzl94qpy9Lu0JlfEj14z88sqbSBJCBEzdlNUCzY2gburhbrwOZ5BHCmuNUy0g== dependencies: + array.prototype.reduce "^1.0.6" call-bind "^1.0.2" - define-properties "^1.1.3" - es-abstract "^1.19.1" + define-properties "^1.2.0" + es-abstract "^1.22.1" + safe-array-concat "^1.0.0" object.pick@^1.3.0: version "1.3.0" resolved "https://registry.yarnpkg.com/object.pick/-/object.pick-1.3.0.tgz#87a10ac4c1694bd2e1cbf53591a66141fb5dd747" - integrity sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c= + integrity sha512-tqa/UMy/CCoYmj+H5qc07qvSL9dqcs/WZENZ1JbtWBlATP+iVOe778gE6MSijnyCnORzDuX6hU+LA4SZ09YjFQ== dependencies: isobject "^3.0.1" obliterator@^2.0.0: - version "2.0.2" - resolved "https://registry.yarnpkg.com/obliterator/-/obliterator-2.0.2.tgz#25f50dc92e1181371b9d8209d11890f1a3c2fc21" - integrity sha512-g0TrA7SbUggROhDPK8cEu/qpItwH2LSKcNl4tlfBNT54XY+nOsqrs0Q68h1V9b3HOSpIWv15jb1lax2hAggdIg== + version "2.0.4" + resolved "https://registry.yarnpkg.com/obliterator/-/obliterator-2.0.4.tgz#fa650e019b2d075d745e44f1effeb13a2adbe816" + integrity sha512-lgHwxlxV1qIg1Eap7LgIeoBWIMFibOjbrYPIPJZcI1mmGAI2m3lNYpK12Y+GBdPQ0U1hRwSord7GIaawz962qQ== oboe@2.1.4: version "2.1.4" resolved "https://registry.yarnpkg.com/oboe/-/oboe-2.1.4.tgz#20c88cdb0c15371bb04119257d4fdd34b0aa49f6" - integrity sha1-IMiM2wwVNxuwQRklfU/dNLCqSfY= + integrity sha512-ymBJ4xSC6GBXLT9Y7lirj+xbqBLa+jADGJldGEYG7u8sZbS9GyG+u1Xk9c5cbriKwSpCg41qUhPjvU5xOpvIyQ== dependencies: http-https "^1.0.0" oboe@2.1.5: version "2.1.5" resolved "https://registry.yarnpkg.com/oboe/-/oboe-2.1.5.tgz#5554284c543a2266d7a38f17e073821fbde393cd" - integrity sha1-VVQoTFQ6ImbXo48X4HOCH73jk80= + integrity sha512-zRFWiF+FoicxEs3jNI/WYUrVEgA7DeET/InK0XQuudGHRg8iIob3cNPrJTKaz4004uaA9Pbe+Dwa8iluhjLZWA== dependencies: http-https "^1.0.0" @@ -8253,27 +7742,13 @@ on-finished@2.4.1: dependencies: ee-first "1.1.1" -on-finished@~2.3.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/on-finished/-/on-finished-2.3.0.tgz#20f1336481b083cd75337992a16971aa2d906947" - integrity sha1-IPEzZIGwg811M3mSoWlxqi2QaUc= - dependencies: - ee-first "1.1.1" - once@1.x, once@^1.3.0, once@^1.3.1, once@^1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" - integrity sha1-WDsap3WWHUsROsF9nFC6753Xa9E= + integrity sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w== dependencies: wrappy "1" -onetime@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/onetime/-/onetime-2.0.1.tgz#067428230fd67443b2794b22bba528b6867962d4" - integrity sha1-BnQoIw/WdEOyeUsiu6UotoZ5YtQ= - dependencies: - mimic-fn "^1.0.0" - open@^7.4.2: version "7.4.2" resolved "https://registry.yarnpkg.com/open/-/open-7.4.2.tgz#b8147e26dcf3e426316c730089fd71edd29c2321" @@ -8282,7 +7757,7 @@ open@^7.4.2: is-docker "^2.0.0" is-wsl "^2.1.1" -optionator@^0.8.1, optionator@^0.8.2: +optionator@^0.8.1: version "0.8.3" resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.8.3.tgz#84fa1d036fe9d3c7e21d99884b601167ec8fb495" integrity sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA== @@ -8294,49 +7769,49 @@ optionator@^0.8.1, optionator@^0.8.2: type-check "~0.3.2" word-wrap "~1.2.3" -optionator@^0.9.1: - version "0.9.1" - resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.9.1.tgz#4f236a6373dae0566a6d43e1326674f50c291499" - integrity sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw== +optionator@^0.9.3: + version "0.9.3" + resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.9.3.tgz#007397d44ed1872fdc6ed31360190f81814e2c64" + integrity sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg== dependencies: + "@aashutoshrathi/word-wrap" "^1.2.3" deep-is "^0.1.3" fast-levenshtein "^2.0.6" levn "^0.4.1" prelude-ls "^1.2.1" type-check "^0.4.0" - word-wrap "^1.2.3" os-homedir@^1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/os-homedir/-/os-homedir-1.0.2.tgz#ffbc4988336e0e833de0c168c7ef152121aa7fb3" - integrity sha1-/7xJiDNuDoM94MFox+8VISGqf7M= + integrity sha512-B5JU3cabzk8c67mRRd3ECmROafjYMXbuzlwtqdM8IbS8ktlTix8aFGb2bAGKrSRIlnfKwovGUUr72JUPyOb6kQ== os-locale@^1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/os-locale/-/os-locale-1.4.0.tgz#20f9f17ae29ed345e8bde583b13d2009803c14d9" - integrity sha1-IPnxeuKe00XoveWDsT0gCYA8FNk= + integrity sha512-PRT7ZORmwu2MEFt4/fv3Q+mEfN4zetKxufQrkShY2oGvUms9r8otu5HfdyIFHkYXjO7laNsoVGmM2MANfuTA8g== dependencies: lcid "^1.0.0" os-tmpdir@^1.0.1, os-tmpdir@~1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274" - integrity sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ= - -p-cancelable@^0.3.0: - version "0.3.0" - resolved "https://registry.yarnpkg.com/p-cancelable/-/p-cancelable-0.3.0.tgz#b9e123800bcebb7ac13a479be195b507b98d30fa" - integrity sha512-RVbZPLso8+jFeq1MfNvgXtCRED2raz/dKpacfTNxsx6pLEpEomM7gah6VeHSYV3+vo0OAi4MkArtQcWWXuQoyw== + integrity sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g== p-cancelable@^1.0.0: version "1.1.0" resolved "https://registry.yarnpkg.com/p-cancelable/-/p-cancelable-1.1.0.tgz#d078d15a3af409220c886f1d9a0ca2e441ab26cc" integrity sha512-s73XxOZ4zpt1edZYZzvhqFa6uvQc1vwUa0K0BdtIZgQMAJj9IbebH+JkgKZc9h+B05PKHLOTl4ajG1BmNrVZlw== -p-finally@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/p-finally/-/p-finally-1.0.0.tgz#3fbcfb15b899a44123b34b6dcc18b724336a2cae" - integrity sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4= +p-cancelable@^2.0.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/p-cancelable/-/p-cancelable-2.1.1.tgz#aab7fbd416582fa32a3db49859c122487c5ed2cf" + integrity sha512-BZOr3nRQHOntUjTrH8+Lh54smKHoHyur8We1V8DSMVrl5A2malOOwuJRnKRDjSnkoeBh4at6BwEnb5I7Jl31wg== + +p-cancelable@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/p-cancelable/-/p-cancelable-3.0.0.tgz#63826694b54d61ca1c20ebcb6d3ecf5e14cd8050" + integrity sha512-mlVgR3PGuzlo0MmTdk4cXqXWlwQDLnONTAg6sm62XkMJEiRxN3GL3SffkYvqwonbkJBcrI7Uvv5Zh9yjvn2iUw== p-limit@^1.1.0: version "1.3.0" @@ -8362,7 +7837,7 @@ p-limit@^3.0.2: p-locate@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-2.0.0.tgz#20a0103b222a70c8fd39cc2e580680f3dde5ec43" - integrity sha1-IKAQOyIqcMj9OcwuWAaA893l7EM= + integrity sha512-nQja7m7gSKuewoVRen45CtVfODR3crN3goVQ0DDZ9N3yHxgpkuBhZqsaiotSQRrADUrne346peY7kT3TSACykg== dependencies: p-limit "^1.1.0" @@ -8394,17 +7869,10 @@ p-map@^4.0.0: dependencies: aggregate-error "^3.0.0" -p-timeout@^1.1.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/p-timeout/-/p-timeout-1.2.1.tgz#5eb3b353b7fce99f101a1038880bb054ebbea386" - integrity sha1-XrOzU7f86Z8QGhA4iAuwVOu+o4Y= - dependencies: - p-finally "^1.0.0" - p-try@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/p-try/-/p-try-1.0.0.tgz#cbc79cdbaf8fd4228e13f621f2b1a237c1b207b3" - integrity sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M= + integrity sha512-U1etNYuMJoIz3ZXSrrySFjsXQTWOx2/jdi86L+2pRvph/qMKL6sbcCYdH23fqsbm8TH2Gn0OybpT4eSFlCVHww== p-try@^2.0.0: version "2.2.0" @@ -8432,7 +7900,7 @@ parse-asn1@^5.0.0, parse-asn1@^5.1.5: parse-cache-control@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/parse-cache-control/-/parse-cache-control-1.0.1.tgz#8eeab3e54fa56920fe16ba38f77fa21aacc2d74e" - integrity sha1-juqz5U+laSD+Fro493+iGqzC104= + integrity sha512-60zvsJReQPX5/QP0Kzfd/VrpjScIQ7SHBW6bFCYfEP+fp0Eppr1SHhIO5nd1PjZtvclzSzES9D/p5nFJurwfWg== parse-headers@^2.0.0: version "2.0.5" @@ -8442,17 +7910,19 @@ parse-headers@^2.0.0: parse-json@^2.2.0: version "2.2.0" resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-2.2.0.tgz#f480f40434ef80741f8469099f8dea18f55a4dc9" - integrity sha1-9ID0BDTvgHQfhGkJn43qGPVaTck= + integrity sha512-QR/GGaKCkhwk1ePQNYDRKYZ3mwU9ypsKhB0XyFnLQdomyEqk3e8wpW3V5Jp88zbxK4n5ST1nqo+g9juTpownhQ== dependencies: error-ex "^1.2.0" -parse-json@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-4.0.0.tgz#be35f5425be1f7f6c747184f98a788cb99477ee0" - integrity sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA= +parse-json@^5.2.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-5.2.0.tgz#c76fc66dee54231c962b22bcc8a72cf2f99753cd" + integrity sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg== dependencies: + "@babel/code-frame" "^7.0.0" error-ex "^1.3.1" - json-parse-better-errors "^1.0.1" + json-parse-even-better-errors "^2.3.0" + lines-and-columns "^1.1.6" parse5-htmlparser2-tree-adapter@^7.0.0: version "7.0.0" @@ -8463,9 +7933,9 @@ parse5-htmlparser2-tree-adapter@^7.0.0: parse5 "^7.0.0" parse5@^7.0.0: - version "7.1.1" - resolved "https://registry.yarnpkg.com/parse5/-/parse5-7.1.1.tgz#4649f940ccfb95d8754f37f73078ea20afe0c746" - integrity sha512-kwpuwzB+px5WUg9pyK0IcK/shltJN5/OVhQagxhCQNtT9Y9QRZqNY2e1cmbu/paRh5LMnz/oVTVLBpjFmMZhSg== + version "7.1.2" + resolved "https://registry.yarnpkg.com/parse5/-/parse5-7.1.2.tgz#0736bebbfd77793823240a23b7fc5e010b7f8e32" + integrity sha512-Czj1WaSVpaoj0wbhMzLmWD69anp2WH7FXMB9n1Sy8/ZFF9jolSQVMu1Ij5WIyGmcBmhk7EOndpO4mIpihVqAXw== dependencies: entities "^4.4.0" @@ -8477,7 +7947,7 @@ parseurl@~1.3.3: pascalcase@^0.1.1: version "0.1.1" resolved "https://registry.yarnpkg.com/pascalcase/-/pascalcase-0.1.1.tgz#b363e55e8006ca6fe21784d2db22bd15d7917f14" - integrity sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ= + integrity sha512-XHXfu/yOQRy9vYOtUDVMN60OEJjW013GoObG1o+xwQTpB9eYJX/BjXMsdW13ZDPruFhYYn0AG22w0xgQMwl3Nw== patch-package@6.2.2: version "6.2.2" @@ -8498,23 +7968,24 @@ patch-package@6.2.2: tmp "^0.0.33" patch-package@^6.2.2, patch-package@^6.4.7: - version "6.4.7" - resolved "https://registry.yarnpkg.com/patch-package/-/patch-package-6.4.7.tgz#2282d53c397909a0d9ef92dae3fdeb558382b148" - integrity sha512-S0vh/ZEafZ17hbhgqdnpunKDfzHQibQizx9g8yEf5dcVk3KOflOfdufRXQX8CSEkyOQwuM/bNz1GwKvFj54kaQ== + version "6.5.1" + resolved "https://registry.yarnpkg.com/patch-package/-/patch-package-6.5.1.tgz#3e5d00c16997e6160291fee06a521c42ac99b621" + integrity sha512-I/4Zsalfhc6bphmJTlrLoOcAF87jcxko4q0qsv4bGcurbr8IskEOtdnt9iCmsQVGL1B+iUhSQqweyTLJfCF9rA== dependencies: "@yarnpkg/lockfile" "^1.1.0" - chalk "^2.4.2" + chalk "^4.1.2" cross-spawn "^6.0.5" find-yarn-workspace-root "^2.0.0" - fs-extra "^7.0.1" + fs-extra "^9.0.0" is-ci "^2.0.0" klaw-sync "^6.0.0" - minimist "^1.2.0" + minimist "^1.2.6" open "^7.4.2" rimraf "^2.6.3" semver "^5.6.0" slash "^2.0.0" tmp "^0.0.33" + yaml "^1.10.2" path-browserify@^1.0.0: version "1.0.1" @@ -8524,14 +7995,14 @@ path-browserify@^1.0.0: path-exists@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-2.1.0.tgz#0feb6c64f0fc518d9a754dd5efb62c7022761f4b" - integrity sha1-D+tsZPD8UY2adU3V77YscCJ2H0s= + integrity sha512-yTltuKuhtNeFJKa1PiRzfLAU5182q1y4Eb4XCJ3PBqyzEDkAZRzBrKKBct682ls9reBVHf9udYLN5Nd+K1B9BQ== dependencies: pinkie-promise "^2.0.0" path-exists@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-3.0.0.tgz#ce0ebeaa5f78cb18925ea7d810d7b59b010fd515" - integrity sha1-zg6+ql94yxiSXqfYENe1mwEP1RU= + integrity sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ== path-exists@^4.0.0: version "4.0.0" @@ -8541,17 +8012,12 @@ path-exists@^4.0.0: path-is-absolute@^1.0.0, path-is-absolute@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" - integrity sha1-F0uSaHNVNP+8es5r9TpanhtcX18= - -path-is-inside@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/path-is-inside/-/path-is-inside-1.0.2.tgz#365417dede44430d1c11af61027facf074bdfc53" - integrity sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM= + integrity sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg== path-key@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/path-key/-/path-key-2.0.1.tgz#411cadb574c5a140d3a4b1910d40d80cc9f40b40" - integrity sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A= + integrity sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw== path-key@^3.1.0: version "3.1.1" @@ -8566,12 +8032,12 @@ path-parse@^1.0.6, path-parse@^1.0.7: path-to-regexp@0.1.7: version "0.1.7" resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-0.1.7.tgz#df604178005f522f15eb4490e7247a1bfaa67f8c" - integrity sha1-32BBeABfUi8V60SQ5yR6G/qmf4w= + integrity sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ== path-type@^1.0.0: version "1.1.0" resolved "https://registry.yarnpkg.com/path-type/-/path-type-1.1.0.tgz#59c44f7ee491da704da415da5a4070ba4f8fe441" - integrity sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE= + integrity sha512-S4eENJz1pkiQn9Znv33Q+deTOKmbl+jj1Fl+qiP/vYezj+S8x+J3Uo0ISrx/QoEvIlOaDWJhPaRd1flJ9HXZqg== dependencies: graceful-fs "^4.1.2" pify "^2.0.0" @@ -8606,9 +8072,9 @@ pend@~1.2.0: performance-now@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/performance-now/-/performance-now-2.1.0.tgz#6309f4e0e5fa913ec1c69307ae364b4b377c9e7b" - integrity sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns= + integrity sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow== -picomatch@^2.0.4, picomatch@^2.2.1, picomatch@^2.2.3, picomatch@^2.3.1: +picomatch@^2.0.4, picomatch@^2.2.1, picomatch@^2.3.1: version "2.3.1" resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42" integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== @@ -8616,7 +8082,7 @@ picomatch@^2.0.4, picomatch@^2.2.1, picomatch@^2.2.3, picomatch@^2.3.1: pify@^2.0.0, pify@^2.3.0: version "2.3.0" resolved "https://registry.yarnpkg.com/pify/-/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c" - integrity sha1-7RQaasBDqEnqWISY59yosVMw6Qw= + integrity sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog== pify@^4.0.1: version "4.0.1" @@ -8626,14 +8092,14 @@ pify@^4.0.1: pinkie-promise@^2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/pinkie-promise/-/pinkie-promise-2.0.1.tgz#2135d6dfa7a358c069ac9b178776288228450ffa" - integrity sha1-ITXW36ejWMBprJsXh3YogihFD/o= + integrity sha512-0Gni6D4UcLTbv9c57DfxDGdr41XfgUjqWZu492f0cIGr16zDU06BWP/RAEvOuo7CQ0CNjHaLlM59YJJFm3NWlw== dependencies: pinkie "^2.0.0" pinkie@^2.0.0: version "2.0.4" resolved "https://registry.yarnpkg.com/pinkie/-/pinkie-2.0.4.tgz#72556b80cfa0d48a974e80e77248e80ed4f7f870" - integrity sha1-clVrgM+g1IqXToDnckjoDtT3+HA= + integrity sha512-MnUuEycAemtSaeFSjXKW/aroV7akBbY+Sv+RkyqFjgAe73F+MR0TBWKBRDkmfWq/HiFmdavfZ1G7h4SPZXaCSg== pkg-dir@4.2.0: version "4.2.0" @@ -8642,6 +8108,11 @@ pkg-dir@4.2.0: dependencies: find-up "^4.0.0" +pluralize@^8.0.0: + version "8.0.0" + resolved "https://registry.yarnpkg.com/pluralize/-/pluralize-8.0.0.tgz#1a6fa16a38d12a1901e0320fa017051c539ce3b1" + integrity sha512-Nc3IT5yHzflTfbjgqWcCPpo7DaKy4FnpB0l/zCAW0Tc7jxAiuqSxHasntB3D7887LSrA93kDJ9IXovxJYxyLCA== + pollock@^0.2.0: version "0.2.1" resolved "https://registry.yarnpkg.com/pollock/-/pollock-0.2.1.tgz#01273ae3542511492d07f1c10fa53f149b37c6ad" @@ -8650,7 +8121,7 @@ pollock@^0.2.0: posix-character-classes@^0.1.0: version "0.1.1" resolved "https://registry.yarnpkg.com/posix-character-classes/-/posix-character-classes-0.1.1.tgz#01eac0fe3b5af71a2a6c02feabb8c1fef7e00eab" - integrity sha1-AerA/jta9xoqbAL+q7jB/vfgDqs= + integrity sha512-xTgYBc3fuo7Yt7JbiuFxSYGToMoz8fLoE6TC9Wx1P/u+LfeThMOAqmuyECnlBaaJb+u1m9hHiXUEtwW4OzfUJg== postinstall-postinstall@^2.1.0: version "2.1.0" @@ -8660,7 +8131,7 @@ postinstall-postinstall@^2.1.0: precond@0.2: version "0.2.3" resolved "https://registry.yarnpkg.com/precond/-/precond-0.2.3.tgz#aa9591bcaa24923f1e0f4849d240f47efc1075ac" - integrity sha1-qpWRvKokkj8eD0hJ0kD0fvwQdaw= + integrity sha512-QCYG84SgGyGzqJ/vlMsxeXd/pgL/I94ixdNFyh1PusWmTCyVfPJjZ1K1jvHtsbfnXQs2TSkEP2fR7QiMZAnKFQ== prelude-ls@^1.2.1: version "1.2.1" @@ -8670,17 +8141,12 @@ prelude-ls@^1.2.1: prelude-ls@~1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.1.2.tgz#21932a549f5e52ffd9a827f570e04be62a97da54" - integrity sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ= - -prepend-http@^1.0.1: - version "1.0.4" - resolved "https://registry.yarnpkg.com/prepend-http/-/prepend-http-1.0.4.tgz#d4f4562b0ce3696e41ac52d0e002e57a635dc6dc" - integrity sha1-1PRWKwzjaW5BrFLQ4ALlemNdxtw= + integrity sha512-ESF23V4SKG6lVSGZgYNpbsiaAkdab6ZgOxe52p7+Kid3W3u3bxR4Vfd/o21dmN7jSt0IwgZ4v5MUd26FEtXE9w== prepend-http@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/prepend-http/-/prepend-http-2.0.0.tgz#e92434bfa5ea8c19f41cdfd401d741a3c819d897" - integrity sha1-6SQ0v6XqjBn0HN/UAddBo8gZ2Jc= + integrity sha512-ravE6m9Atw9Z/jjttRUZ+clIXogdghyZAuWJ3qEzjT+jI/dL1ifAqhZeC5VHzQp1MSt1+jxKkFNemj/iO7tVUA== prettier-linter-helpers@^1.0.0: version "1.0.0" @@ -8690,31 +8156,18 @@ prettier-linter-helpers@^1.0.0: fast-diff "^1.1.2" prettier-plugin-solidity@^1.0.0-beta.19: - version "1.0.0-beta.19" - resolved "https://registry.yarnpkg.com/prettier-plugin-solidity/-/prettier-plugin-solidity-1.0.0-beta.19.tgz#7c3607fc4028f5e6a425259ff03e45eedf733df3" - integrity sha512-xxRQ5ZiiZyUoMFLE9h7HnUDXI/daf1tnmL1msEdcKmyh7ZGQ4YklkYLC71bfBpYU2WruTb5/SFLUaEb3RApg5g== + version "1.1.3" + resolved "https://registry.yarnpkg.com/prettier-plugin-solidity/-/prettier-plugin-solidity-1.1.3.tgz#9a35124f578404caf617634a8cab80862d726cba" + integrity sha512-fQ9yucPi2sBbA2U2Xjh6m4isUTJ7S7QLc/XDDsktqqxYfTwdYKJ0EnnywXHwCGAaYbQNK+HIYPL1OemxuMsgeg== dependencies: - "@solidity-parser/parser" "^0.14.0" - emoji-regex "^10.0.0" - escape-string-regexp "^4.0.0" - semver "^7.3.5" + "@solidity-parser/parser" "^0.16.0" + semver "^7.3.8" solidity-comments-extractor "^0.0.7" - string-width "^4.2.3" -prettier@^1.14.3: - version "1.19.1" - resolved "https://registry.yarnpkg.com/prettier/-/prettier-1.19.1.tgz#f7d7f5ff8a9cd872a7be4ca142095956a60797cb" - integrity sha512-s7PoyDv/II1ObgQunCbB9PdLmUcBZcnWOcxDh7O0N/UwDEsHyqkW+Qh28jW+mVuCdx7gLB0BotYI1Y6uI9iyew== - -prettier@^2.1.2, prettier@^2.3.1: - version "2.6.2" - resolved "https://registry.yarnpkg.com/prettier/-/prettier-2.6.2.tgz#e26d71a18a74c3d0f0597f55f01fb6c06c206032" - integrity sha512-PkUpF+qoXTqhOeWL9fu7As8LXsIUZ1WYaJiY/a7McAQzxjk82OF0tibkFXVCDImZtWxbvojFjerkiLb0/q8mew== - -prettier@^2.5.1: - version "2.7.1" - resolved "https://registry.yarnpkg.com/prettier/-/prettier-2.7.1.tgz#e235806850d057f97bb08368a4f7d899f7760c64" - integrity sha512-ujppO+MkdPqoVINuDFDRLClm7D78qbDt0/NR+wp5FqEZOoTNAjPHWj17QRhu7geIHJfcNhRk1XVQmF8Bp3ye+g== +prettier@^2.1.2, prettier@^2.3.1, prettier@^2.5.1, prettier@^2.8.3: + version "2.8.8" + resolved "https://registry.yarnpkg.com/prettier/-/prettier-2.8.8.tgz#e8c5d7e98a4305ffe3de2e1fc4aca1a71c28b1da" + integrity sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q== private@^0.1.6, private@^0.1.8: version "0.1.8" @@ -8729,9 +8182,9 @@ process-nextick-args@~2.0.0: process@^0.11.10: version "0.11.10" resolved "https://registry.yarnpkg.com/process/-/process-0.11.10.tgz#7332300e840161bda3e69a1d1d91a7d4bc16f182" - integrity sha1-czIwDoQBYb2j5podHZGn1LwW8YI= + integrity sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A== -progress@2.0.3, progress@^2.0.0: +progress@2.0.3: version "2.0.3" resolved "https://registry.yarnpkg.com/progress/-/progress-2.0.3.tgz#7e8cf8d8f5b8f239c1bc68beb4eb78567d572ef8" integrity sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA== @@ -8739,15 +8192,15 @@ progress@2.0.3, progress@^2.0.0: promise-to-callback@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/promise-to-callback/-/promise-to-callback-1.0.0.tgz#5d2a749010bfb67d963598fcd3960746a68feef7" - integrity sha1-XSp0kBC/tn2WNZj805YHRqaP7vc= + integrity sha512-uhMIZmKM5ZteDMfLgJnoSq9GCwsNKrYau73Awf1jIy6/eUcuuZ3P+CD9zUv0kJsIUbU+x6uLNIhXhLHDs1pNPA== dependencies: is-fn "^1.0.0" set-immediate-shim "^1.0.1" promise@^8.0.0: - version "8.1.0" - resolved "https://registry.yarnpkg.com/promise/-/promise-8.1.0.tgz#697c25c3dfe7435dd79fcd58c38a135888eaf05e" - integrity sha512-W04AqnILOL/sPRXziNicCjSNRruLAuIHEOVBazepu0545DDNGYHz7ar9ZgZ1fMU8/MA4mVxp5rkBWRi6OXIy3Q== + version "8.3.0" + resolved "https://registry.yarnpkg.com/promise/-/promise-8.3.0.tgz#8cb333d1edeb61ef23869fbb8a4ea0279ab60e0a" + integrity sha512-rZPNPKTOYVNEEKFaq1HqTgOwZD+4/YHS5ukLzQCypkj+OkYx7iv0mA91lJlpPPZ8vMau3IIGj5Qlwrx+8iiSmg== dependencies: asap "~2.0.6" @@ -8767,17 +8220,17 @@ proxy-from-env@1.1.0: prr@~1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/prr/-/prr-1.0.1.tgz#d3fc114ba06995a45ec6893f484ceb1d78f5f476" - integrity sha1-0/wRS6BplaRexok/SEzrHXj19HY= + integrity sha512-yPw4Sng1gWghHQWj0B3ZggWUm4qVbPwPFcRG8KyxiU7J2OHFSoEHKS+EZ3fv5l1t9CyCiop6l/ZYeWbrgoQejw== pseudomap@^1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/pseudomap/-/pseudomap-1.0.2.tgz#f052a28da70e618917ef0a8ac34c1ae5a68286b3" - integrity sha1-8FKijacOYYkX7wqKw0wa5aaChrM= + integrity sha512-b/YwNhb8lk1Zz2+bXXpS/LK9OisiZZ1SNsSLxN1x2OXVEhW2Ckr/7mWE5vrC1ZTiJlD9g19jWszTmJsB+oEpFQ== psl@^1.1.28: - version "1.8.0" - resolved "https://registry.yarnpkg.com/psl/-/psl-1.8.0.tgz#9326f8bcfb013adcc005fdff056acce020e51c24" - integrity sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ== + version "1.9.0" + resolved "https://registry.yarnpkg.com/psl/-/psl-1.9.0.tgz#d0df2a137f00794565fcaf3b2c00cd09f8d5a5a7" + integrity sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag== public-encrypt@^4.0.0: version "4.0.3" @@ -8794,7 +8247,7 @@ public-encrypt@^4.0.0: pull-cat@^1.1.9: version "1.1.11" resolved "https://registry.yarnpkg.com/pull-cat/-/pull-cat-1.1.11.tgz#b642dd1255da376a706b6db4fa962f5fdb74c31b" - integrity sha1-tkLdElXaN2pwa220+pYvX9t0wxs= + integrity sha512-i3w+xZ3DCtTVz8S62hBOuNLRHqVDsHMNZmgrZsjPnsxXUgbWtXEee84lo1XswE7W2a3WHyqsNuDJTjVLAQR8xg== pull-defer@^0.2.2: version "0.2.3" @@ -8817,7 +8270,7 @@ pull-level@^2.0.3: pull-live@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/pull-live/-/pull-live-1.0.1.tgz#a4ecee01e330155e9124bbbcf4761f21b38f51f5" - integrity sha1-pOzuAeMwFV6RJLu89HYfIbOPUfU= + integrity sha512-tkNz1QT5gId8aPhV5+dmwoIiA1nmfDOzJDlOOUpU5DNusj6neNd3EePybJ5+sITr2FwyCs/FVpx74YMCfc8YeA== dependencies: pull-cat "^1.1.9" pull-stream "^3.4.0" @@ -8825,17 +8278,17 @@ pull-live@^1.0.1: pull-pushable@^2.0.0: version "2.2.0" resolved "https://registry.yarnpkg.com/pull-pushable/-/pull-pushable-2.2.0.tgz#5f2f3aed47ad86919f01b12a2e99d6f1bd776581" - integrity sha1-Xy867UethpGfAbEqLpnW8b13ZYE= + integrity sha512-M7dp95enQ2kaHvfCt2+DJfyzgCSpWVR2h2kWYnVsW6ZpxQBx5wOu0QWOvQPVoPnBLUZYitYP2y7HyHkLQNeGXg== pull-stream@^3.2.3, pull-stream@^3.4.0, pull-stream@^3.6.8: - version "3.6.14" - resolved "https://registry.yarnpkg.com/pull-stream/-/pull-stream-3.6.14.tgz#529dbd5b86131f4a5ed636fdf7f6af00781357ee" - integrity sha512-KIqdvpqHHaTUA2mCYcLG1ibEbu/LCKoJZsBWyv9lSYtPkJPBq8m3Hxa103xHi6D2thj5YXa0TqK3L3GUkwgnew== + version "3.7.0" + resolved "https://registry.yarnpkg.com/pull-stream/-/pull-stream-3.7.0.tgz#85de0e44ff38a4d2ad08cc43fc458e1922f9bf0b" + integrity sha512-Eco+/R004UaCK2qEDE8vGklcTG2OeZSVm1kTUQNrykEjDwcFXDZhygFDsW49DbXyJMEhHeRL3z5cRVqPAhXlIw== pull-window@^2.1.4: version "2.1.4" resolved "https://registry.yarnpkg.com/pull-window/-/pull-window-2.1.4.tgz#fc3b86feebd1920c7ae297691e23f705f88552f0" - integrity sha1-/DuG/uvRkgx64pdpHiP3BfiFUvA= + integrity sha512-cbDzN76BMlcGG46OImrgpkMf/VkCnupj8JhsrpBw3aWBM9ye345aYnqitmZCgauBkc0HbbRRn9hCnsa3k2FNUg== dependencies: looper "^2.0.0" @@ -8847,20 +8300,20 @@ pump@^3.0.0: end-of-stream "^1.1.0" once "^1.3.1" -punycode@1.3.2: - version "1.3.2" - resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.3.2.tgz#9653a036fb7c1ee42342f2325cceefea3926c48d" - integrity sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0= - punycode@2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.0.tgz#5f863edc89b96db09074bad7947bf09056ca4e7d" - integrity sha1-X4Y+3Im5bbCQdLrXlHvwkFbKTn0= + integrity sha512-Yxz2kRwT90aPiWEMHVYnEf4+rhwF1tBmmZ4KepCP+Wkium9JxtWnUm1nqGwpiAHr/tnTSeHqr3wb++jgSkXjhA== + +punycode@^1.4.1: + version "1.4.1" + resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.4.1.tgz#c0d5a63b2718800ad8e1eb0fa5269c84dd41845e" + integrity sha512-jmYNElW7yvO7TV33CjSmvSiE2yco3bV2czu/OzDKdMNVZQWfxCblURLhf+47syQRBntjfLdd/H0egrzIG+oaFQ== punycode@^2.1.0, punycode@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec" - integrity sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A== + version "2.3.0" + resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.3.0.tgz#f67fa67c94da8f4d0cfff981aee4118064199b8f" + integrity sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA== puppeteer@^13.7.0: version "13.7.0" @@ -8880,17 +8333,19 @@ puppeteer@^13.7.0: unbzip2-stream "1.4.3" ws "8.5.0" -qs@6.10.3, qs@^6.4.0, qs@^6.7.0, qs@^6.9.4: - version "6.10.3" - resolved "https://registry.yarnpkg.com/qs/-/qs-6.10.3.tgz#d6cde1b2ffca87b5aa57889816c5f81535e22e8e" - integrity sha512-wr7M2E0OFRfIfJZjKGieI8lBKb7fRCH4Fv5KNPEs7gJ8jadvotdsS08PzOKR7opXhZ/Xkjtt3WF9g38drmyRqQ== +qs@6.11.0: + version "6.11.0" + resolved "https://registry.yarnpkg.com/qs/-/qs-6.11.0.tgz#fd0d963446f7a65e1367e01abd85429453f0c37a" + integrity sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q== dependencies: side-channel "^1.0.4" -qs@6.9.7: - version "6.9.7" - resolved "https://registry.yarnpkg.com/qs/-/qs-6.9.7.tgz#4610846871485e1e048f44ae3b94033f0e675afe" - integrity sha512-IhMFgUmuNpyRfxA90umL7ByLlgRXu6tIfKPpF5TmcfRLlLCckfP/g3IQmju6jjpu+Hh8rA+2p6A27ZSPOOHdKw== +qs@^6.11.2, qs@^6.4.0, qs@^6.9.4: + version "6.11.2" + resolved "https://registry.yarnpkg.com/qs/-/qs-6.11.2.tgz#64bea51f12c1f5da1bc01496f48ffcff7c69d7d9" + integrity sha512-tDNIz22aBzCDxLtVH++VnTfzxlfeK5CbqohpSqpJgj1Wg/cQbStNAz3NuqCs5vV+pjBsK4x4pN9HlVh7rcYRiA== + dependencies: + side-channel "^1.0.4" qs@~6.5.2: version "6.5.3" @@ -8906,16 +8361,16 @@ query-string@^5.0.1: object-assign "^4.1.0" strict-uri-encode "^1.0.0" -querystring@0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/querystring/-/querystring-0.2.0.tgz#b209849203bb25df820da756e747005878521620" - integrity sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA= - -queue-microtask@^1.2.2: +queue-microtask@^1.2.2, queue-microtask@^1.2.3: version "1.2.3" resolved "https://registry.yarnpkg.com/queue-microtask/-/queue-microtask-1.2.3.tgz#4929228bbc724dfac43e0efb058caf7b6cfb6243" integrity sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A== +quick-lru@^5.1.1: + version "5.1.1" + resolved "https://registry.yarnpkg.com/quick-lru/-/quick-lru-5.1.1.tgz#366493e6b3e42a3a6885e2e99d18f80fb7a8c932" + integrity sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA== + ramda@^0.27.1: version "0.27.2" resolved "https://registry.yarnpkg.com/ramda/-/ramda-0.27.2.tgz#84463226f7f36dc33592f6f4ed6374c48306c3f1" @@ -8941,20 +8396,20 @@ range-parser@~1.2.1: resolved "https://registry.yarnpkg.com/range-parser/-/range-parser-1.2.1.tgz#3cf37023d199e1c24d1a55b84800c2f3e6468031" integrity sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg== -raw-body@2.4.3: - version "2.4.3" - resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.4.3.tgz#8f80305d11c2a0a545c2d9d89d7a0286fcead43c" - integrity sha512-UlTNLIcu0uzb4D2f4WltY6cVjLi+/jEN4lgEUj3E04tpMDpUlkBo/eSn6zou9hum2VMNpCCUone0O0WeJim07g== +raw-body@2.5.1: + version "2.5.1" + resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.5.1.tgz#fe1b1628b181b700215e5fd42389f98b71392857" + integrity sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig== dependencies: bytes "3.1.2" - http-errors "1.8.1" + http-errors "2.0.0" iconv-lite "0.4.24" unpipe "1.0.0" -raw-body@2.5.1, raw-body@^2.4.1: - version "2.5.1" - resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.5.1.tgz#fe1b1628b181b700215e5fd42389f98b71392857" - integrity sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig== +raw-body@2.5.2, raw-body@^2.4.1: + version "2.5.2" + resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.5.2.tgz#99febd83b90e08975087e8f1f9419a149366b68a" + integrity sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA== dependencies: bytes "3.1.2" http-errors "2.0.0" @@ -8964,7 +8419,7 @@ raw-body@2.5.1, raw-body@^2.4.1: read-pkg-up@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-1.0.1.tgz#9d63c13276c065918d57f002a57f40a1b643fb02" - integrity sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI= + integrity sha512-WD9MTlNtI55IwYUS27iHh9tK3YoIVhxis8yKhLpTqWtml739uXc9NWTpxoHkfZf3+DkCCsXox94/VWZniuZm6A== dependencies: find-up "^1.0.0" read-pkg "^1.0.0" @@ -8972,7 +8427,7 @@ read-pkg-up@^1.0.1: read-pkg@^1.0.0: version "1.1.0" resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-1.1.0.tgz#f5ffaa5ecd29cb31c0474bca7d756b6bb29e3f28" - integrity sha1-9f+qXs0pyzHAR0vKfXVra7KePyg= + integrity sha512-7BGwRHqt4s/uVbuyoeejRn4YmFnYZiFl4AuaeXHlgZf3sONF0SOGlxs2Pw8g6hCKupo08RafIO5YXFNOKTfwsQ== dependencies: load-json-file "^1.0.0" normalize-package-data "^2.3.2" @@ -8981,7 +8436,7 @@ read-pkg@^1.0.0: readable-stream@^1.0.33: version "1.1.14" resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-1.1.14.tgz#7cf4c54ef648e3813084c636dd2079e166c081d9" - integrity sha1-fPTFTvZI44EwhMY23SB54WbAgdk= + integrity sha512-+MeVjFf4L44XUkhM1eYbD8fyEsxcV81pqMSR5gblfcLCHfZvbrqy4/qYHE+/R5HoBUT11WV5O08Cr1n3YXkWVQ== dependencies: core-util-is "~1.0.0" inherits "~2.0.1" @@ -8989,9 +8444,9 @@ readable-stream@^1.0.33: string_decoder "~0.10.x" readable-stream@^2.0.0, readable-stream@^2.0.5, readable-stream@^2.2.2, readable-stream@^2.2.8, readable-stream@^2.2.9, readable-stream@^2.3.6, readable-stream@~2.3.6: - version "2.3.7" - resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.7.tgz#1eca1cf711aef814c04f62252a36a62f6cb23b57" - integrity sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw== + version "2.3.8" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.8.tgz#91125e8042bba1b9887f49345f6277027ce8be9b" + integrity sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA== dependencies: core-util-is "~1.0.0" inherits "~2.0.3" @@ -9001,10 +8456,10 @@ readable-stream@^2.0.0, readable-stream@^2.0.5, readable-stream@^2.2.2, readable string_decoder "~1.1.1" util-deprecate "~1.0.1" -readable-stream@^3.0.6, readable-stream@^3.1.0, readable-stream@^3.1.1, readable-stream@^3.4.0, readable-stream@^3.6.0: - version "3.6.0" - resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.0.tgz#337bbda3adc0706bd3e024426a286d4b4b2c9198" - integrity sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA== +readable-stream@^3.0.6, readable-stream@^3.1.1, readable-stream@^3.4.0, readable-stream@^3.6.0: + version "3.6.2" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.2.tgz#56a9b36ea965c00c5a93ef31eb111a0f11056967" + integrity sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA== dependencies: inherits "^2.0.3" string_decoder "^1.1.1" @@ -9013,7 +8468,7 @@ readable-stream@^3.0.6, readable-stream@^3.1.0, readable-stream@^3.1.1, readable readable-stream@~1.0.15: version "1.0.34" resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-1.0.34.tgz#125820e34bc842d2f2aaafafe4c2916ee32c157c" - integrity sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw= + integrity sha512-ok1qVCJuRkNmvebYikljxJA/UEsKwLl2nI1OmaqAu4/UE+h0wKCHok4XkL/gvi39OacXvw59RJUOFUkDib2rHg== dependencies: core-util-is "~1.0.0" inherits "~2.0.1" @@ -9037,16 +8492,16 @@ readdirp@~3.6.0: rechoir@^0.6.2: version "0.6.2" resolved "https://registry.yarnpkg.com/rechoir/-/rechoir-0.6.2.tgz#85204b54dba82d5742e28c96756ef43af50e3384" - integrity sha1-hSBLVNuoLVdC4oyWdW70OvUOM4Q= + integrity sha512-HFM8rkZ+i3zrV+4LQjwQ0W+ez98pApMGM3HUrN04j3CqzPOzl9nmP15Y8YXNm8QHGv/eacOVEjqhmWpkRV0NAw== dependencies: resolve "^1.1.6" recursive-readdir@^2.2.2: - version "2.2.2" - resolved "https://registry.yarnpkg.com/recursive-readdir/-/recursive-readdir-2.2.2.tgz#9946fb3274e1628de6e36b2f6714953b4845094f" - integrity sha512-nRCcW9Sj7NuZwa2XvH9co8NPeXUBhZP7CRKJtU+cS6PW9FpCIFoI5ib0NT1ZrbNuPoRy0ylyCaUL8Gih4LSyFg== + version "2.2.3" + resolved "https://registry.yarnpkg.com/recursive-readdir/-/recursive-readdir-2.2.3.tgz#e726f328c0d69153bcabd5c322d3195252379372" + integrity sha512-8HrF5ZsXk5FAH9dgsx3BlUer73nIhuj+9OrQwEbLTPOBzGkL1lsFCR01am+v+0m2Cmbs1nP12hLDl5FA7EszKA== dependencies: - minimatch "3.0.4" + minimatch "^3.0.5" reduce-flatten@^2.0.0: version "2.0.0" @@ -9080,28 +8535,19 @@ regex-not@^1.0.0, regex-not@^1.0.2: extend-shallow "^3.0.2" safe-regex "^1.1.0" -regexp.prototype.flags@^1.2.0: - version "1.4.1" - resolved "https://registry.yarnpkg.com/regexp.prototype.flags/-/regexp.prototype.flags-1.4.1.tgz#b3f4c0059af9e47eca9f3f660e51d81307e72307" - integrity sha512-pMR7hBVUUGI7PMA37m2ofIdQCsomVnas+Jn5UPGAHQ+/LlwKm/aTLJHdasmHRzlfeZwHiAOaRSo2rbBDm3nNUQ== +regexp.prototype.flags@^1.2.0, regexp.prototype.flags@^1.5.0: + version "1.5.0" + resolved "https://registry.yarnpkg.com/regexp.prototype.flags/-/regexp.prototype.flags-1.5.0.tgz#fe7ce25e7e4cca8db37b6634c8a2c7009199b9cb" + integrity sha512-0SutC3pNudRKgquxGoRGIz946MZVHqbNfPjBdxeOhBrdgDKlRoXmYLQN9xRbrR09ZXWeGAdPuif7egofn6v5LA== dependencies: call-bind "^1.0.2" - define-properties "^1.1.3" - -regexpp@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/regexpp/-/regexpp-2.0.1.tgz#8d19d31cf632482b589049f8281f93dbcba4d07f" - integrity sha512-lv0M6+TkDVniA3aD1Eg0DVpfU/booSu7Eev3TDO/mZKHBfVjgCGTV4t4buppESEYDtkArYFOxTJWv6S5C+iaNw== - -regexpp@^3.2.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/regexpp/-/regexpp-3.2.0.tgz#0425a2768d8f23bad70ca4b90461fa2f1213e1b2" - integrity sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg== + define-properties "^1.2.0" + functions-have-names "^1.2.3" regexpu-core@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-2.0.0.tgz#49d038837b8dcf8bfa5b9a42139938e6ea2ae240" - integrity sha1-SdA4g3uNz4v6W5pCE5k45uoq4kA= + integrity sha512-tJ9+S4oKjxY8IZ9jmjnp/mtytu1u3iyIQAfmI51IKWH6bFf7XR1ybtaO6j7INhZKXOTYADk7V5qxaqLkmNxiZQ== dependencies: regenerate "^1.2.1" regjsgen "^0.2.0" @@ -9110,12 +8556,12 @@ regexpu-core@^2.0.0: regjsgen@^0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/regjsgen/-/regjsgen-0.2.0.tgz#6c016adeac554f75823fe37ac05b92d5a4edb1f7" - integrity sha1-bAFq3qxVT3WCP+N6wFuS1aTtsfc= + integrity sha512-x+Y3yA24uF68m5GA+tBjbGYo64xXVJpbToBaWCoSNSc1hdk6dfctaRWrNFTVJZIIhL5GxW8zwjoixbnifnK59g== regjsparser@^0.1.4: version "0.1.5" resolved "https://registry.yarnpkg.com/regjsparser/-/regjsparser-0.1.5.tgz#7ee8f84dc6fa792d3fd0ae228d24bd949ead205c" - integrity sha1-fuj4Tcb6eS0/0K4ijSS9lJ6tIFw= + integrity sha512-jlQ9gYLfk2p3V5Ag5fYhA7fv7OHzd1KUH0PRP46xc3TgwjwgROIW572AfYg/X9kaNq/LJnu6oJcFRXlIrGoTRw== dependencies: jsesc "~0.5.0" @@ -9127,26 +8573,26 @@ repeat-element@^1.1.2: repeat-string@^1.6.1: version "1.6.1" resolved "https://registry.yarnpkg.com/repeat-string/-/repeat-string-1.6.1.tgz#8dcae470e1c88abc2d600fff4a776286da75e637" - integrity sha1-jcrkcOHIirwtYA//Sndihtp15jc= + integrity sha512-PV0dzCYDNfRi1jCDbJzpW7jNNDRuCOG/jI5ctQcGKt/clZD+YcPS3yIlWuTJMmESC8aevCFmWJy5wjAFgNqN6w== repeating@^2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/repeating/-/repeating-2.0.1.tgz#5214c53a926d3552707527fbab415dbc08d06dda" - integrity sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo= + integrity sha512-ZqtSMuVybkISo2OWvqvm7iHSWngvdaW3IpsT9/uP8v4gMi591LY6h35wdOfvQdWCKFWZWm2Y1Opp4kV7vQKT6A== dependencies: is-finite "^1.0.0" req-cwd@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/req-cwd/-/req-cwd-2.0.0.tgz#d4082b4d44598036640fb73ddea01ed53db49ebc" - integrity sha1-1AgrTURZgDZkD7c93qAe1T20nrw= + integrity sha512-ueoIoLo1OfB6b05COxAA9UpeoscNpYyM+BqYlA7H6LVF4hKGPXQQSSaD2YmvDVJMkk4UDpAHIeU1zG53IqjvlQ== dependencies: req-from "^2.0.0" req-from@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/req-from/-/req-from-2.0.0.tgz#d74188e47f93796f4aa71df6ee35ae689f3e0e70" - integrity sha1-10GI5H+TeW9Kpx327jWuaJ8+DnA= + integrity sha512-LzTfEVDVQHBRfjOUMgNBA+V6DWsSnoeKzf42J7l0xa/B4jyPOuuF5MlNSmomLNGemWTnV2TIdjSSLnEn95fOQA== dependencies: resolve-from "^3.0.0" @@ -9195,12 +8641,12 @@ request@^2.79.0, request@^2.85.0, request@^2.88.0: require-directory@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" - integrity sha1-jGStX9MNqxyXbiNE/+f3kqam30I= + integrity sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q== require-from-string@^1.1.0: version "1.2.1" resolved "https://registry.yarnpkg.com/require-from-string/-/require-from-string-1.2.1.tgz#529c9ccef27380adfec9a2f965b649bbee636418" - integrity sha1-UpyczvJzgK3+yaL5ZbZJu+5jZBg= + integrity sha512-H7AkJWMobeskkttHyhTVtS0fxpFLjxhbfMa6Bk3wimP7sdPRGL3EyCg3sAQenFfAe+xQ+oAc85Nmtvq0ROM83Q== require-from-string@^2.0.0, require-from-string@^2.0.2: version "2.0.2" @@ -9210,17 +8656,22 @@ require-from-string@^2.0.0, require-from-string@^2.0.2: require-main-filename@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/require-main-filename/-/require-main-filename-1.0.1.tgz#97f717b69d48784f5f526a6c5aa8ffdda055a4d1" - integrity sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE= + integrity sha512-IqSUtOVP4ksd1C/ej5zeEh/BIP2ajqpn8c5x+q99gvcIG/Qf0cud5raVnE/Dwd0ua9TXYDoDc0RE5hBSdz22Ug== require-main-filename@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/require-main-filename/-/require-main-filename-2.0.0.tgz#d0b329ecc7cc0f61649f62215be69af54aa8989b" integrity sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg== +resolve-alpn@^1.0.0, resolve-alpn@^1.2.0: + version "1.2.1" + resolved "https://registry.yarnpkg.com/resolve-alpn/-/resolve-alpn-1.2.1.tgz#b7adbdac3546aaaec20b45e7d8265927072726f9" + integrity sha512-0a1F4l73/ZFZOakJnQ3FvkJ2+gSTQWz/r2KE5OdDY0TxPm5h4GkqkWWfM47T7HsbnOtcJVEF4epCVy6u7Q3K+g== + resolve-from@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-3.0.0.tgz#b22c7af7d9d6881bc8b6e653335eebcb0a188748" - integrity sha1-six699nWiBvItuZTM17rywoYh0g= + integrity sha512-GnlH6vxLymXJNMBo7XP1fJIzBFbdYt49CuTwmB/6N53t+kMPRMFKz783LlQ4tv28XoQfMWinAJX6WCGf2IlaIw== resolve-from@^4.0.0: version "4.0.0" @@ -9230,12 +8681,12 @@ resolve-from@^4.0.0: resolve-url@^0.2.1: version "0.2.1" resolved "https://registry.yarnpkg.com/resolve-url/-/resolve-url-0.2.1.tgz#2c637fe77c893afd2a663fe21aa9080068e2052a" - integrity sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo= + integrity sha512-ZuF55hVUQaaczgOIwqWzkEcEidmlD/xl44x1UZnhOXcYuFN2S6+rcxpG+C1N3So0wvNI3DmJICUFfu2SxhBmvg== resolve@1.1.x: version "1.1.7" resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.1.7.tgz#203114d82ad2c5ed9e8e0411b3932875e889e97b" - integrity sha1-IDEU2CrSxe2ejgQRs5ModeiJ6Xs= + integrity sha512-9znBF0vBcaSN3W2j7wKvdERPwqTxSpCq+if5C0WoTCyV9n24rua28jeuQ2pL/HOf+yUe/Mef+H/5p60K0Id3bg== resolve@1.17.0: version "1.17.0" @@ -9244,51 +8695,33 @@ resolve@1.17.0: dependencies: path-parse "^1.0.6" -resolve@^1.1.6: - version "1.20.0" - resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.20.0.tgz#629a013fb3f70755d6f0b7935cc1c2c5378b1975" - integrity sha512-wENBPt4ySzg4ybFQW2TT1zMQucPK95HSh/nq2CFTZVOGut2+pQvSsgtda4d26YrYcr067wjbmzOG8byDPBX63A== - dependencies: - is-core-module "^2.2.0" - path-parse "^1.0.6" - -resolve@^1.10.0, resolve@^1.8.1, resolve@~1.22.0: - version "1.22.0" - resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.0.tgz#5e0b8c67c15df57a89bdbabe603a002f21731198" - integrity sha512-Hhtrw0nLeSrFQ7phPp4OOcVjLPIeMnRlr5mcnVuMe7M/7eBn98A3hmFRLoFo3DLZkivSYwhRUJTyPyWAk56WLw== +resolve@^1.1.6, resolve@^1.10.0, resolve@^1.3.2, resolve@^1.8.1, resolve@~1.22.1: + version "1.22.4" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.4.tgz#1dc40df46554cdaf8948a486a10f6ba1e2026c34" + integrity sha512-PXNdCiPqDqeUou+w1C2eTQbNfxKSuMxqTCuvlmmMsk1NWHL5fRrhY6Pl0qEYYc6+QqGClco1Qj8XnjPego4wfg== dependencies: - is-core-module "^2.8.1" - path-parse "^1.0.7" - supports-preserve-symlinks-flag "^1.0.0" - -resolve@^1.3.2: - version "1.22.1" - resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.1.tgz#27cb2ebb53f91abb49470a928bba7558066ac177" - integrity sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw== - dependencies: - is-core-module "^2.9.0" + is-core-module "^2.13.0" path-parse "^1.0.7" supports-preserve-symlinks-flag "^1.0.0" responselike@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/responselike/-/responselike-1.0.2.tgz#918720ef3b631c5642be068f15ade5a46f4ba1e7" - integrity sha1-kYcg7ztjHFZCvgaPFa3lpG9Loec= + integrity sha512-/Fpe5guzJk1gPqdJLJR5u7eG/gNY4nImjbRDaVWVMRhne55TCmj2i9Q+54PBRfatRC8v/rIiv9BN0pMd9OV5EQ== dependencies: lowercase-keys "^1.0.0" -restore-cursor@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-2.0.0.tgz#9f7ee287f82fd326d4fd162923d62129eee0dfaf" - integrity sha1-n37ih/gv0ybU/RYpI9YhKe7g368= +responselike@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/responselike/-/responselike-2.0.1.tgz#9a0bc8fdc252f3fb1cca68b016591059ba1422bc" + integrity sha512-4gl03wn3hj1HP3yzgdI7d3lCkF95F21Pz4BPGvKHinyQzALR5CapwC8yIi0Rh58DEMQ/SguC03wFj2k0M/mHhw== dependencies: - onetime "^2.0.0" - signal-exit "^3.0.2" + lowercase-keys "^2.0.0" resumer@~0.0.0: version "0.0.0" resolved "https://registry.yarnpkg.com/resumer/-/resumer-0.0.0.tgz#f1e8f461e4064ba39e82af3cdc2a8c893d076759" - integrity sha1-8ej0YeQGS6Oegq883CqMiT0HZ1k= + integrity sha512-Fn9X8rX8yYF4m81rZCK/5VmrmsSbqS/i3rDLl6ZZHAXgC2nTAx3dhwG8q8odP/RmdLa2YrybDJaAMg+X1ajY3w== dependencies: through "~2.3.4" @@ -9302,13 +8735,6 @@ reusify@^1.0.4: resolved "https://registry.yarnpkg.com/reusify/-/reusify-1.0.4.tgz#90da382b1e126efc02146e90845a88db12925d76" integrity sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw== -rimraf@2.6.3: - version "2.6.3" - resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.6.3.tgz#b2d104fe0d8fb27cf9e0a1cda8262dd3833c6cab" - integrity sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA== - dependencies: - glob "^7.1.3" - rimraf@3.0.2, rimraf@^3.0.0, rimraf@^3.0.2: version "3.0.2" resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-3.0.2.tgz#f1a5402ba6220ad52cc1282bac1ae3aa49fd061a" @@ -9338,10 +8764,12 @@ rlp@^2.0.0, rlp@^2.2.1, rlp@^2.2.2, rlp@^2.2.3, rlp@^2.2.4: dependencies: bn.js "^5.2.0" -run-async@^2.2.0: - version "2.4.1" - resolved "https://registry.yarnpkg.com/run-async/-/run-async-2.4.1.tgz#8440eccf99ea3e70bd409d49aab88e10c189a455" - integrity sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ== +run-parallel-limit@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/run-parallel-limit/-/run-parallel-limit-1.1.0.tgz#be80e936f5768623a38a963262d6bef8ff11e7ba" + integrity sha512-jJA7irRNM91jaKc3Hcl1npHsFLOXOoTkPCUL1JEa1R82O2miplXXRaGdjW/KM/98YQWDhJLiSs793CnXfblJUw== + dependencies: + queue-microtask "^1.2.2" run-parallel@^1.1.9: version "1.2.0" @@ -9355,12 +8783,15 @@ rustbn.js@~0.2.0: resolved "https://registry.yarnpkg.com/rustbn.js/-/rustbn.js-0.2.0.tgz#8082cb886e707155fd1cb6f23bd591ab8d55d0ca" integrity sha512-4VlvkRUuCJvr2J6Y0ImW7NvTCriMi7ErOAqWk1y69vAdoNIzCF3yPmgeNzx+RQTLEDFq5sHfscn1MwHxP9hNfA== -rxjs@^6.4.0: - version "6.6.7" - resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-6.6.7.tgz#90ac018acabf491bf65044235d5863c4dab804c9" - integrity sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ== +safe-array-concat@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/safe-array-concat/-/safe-array-concat-1.0.1.tgz#91686a63ce3adbea14d61b14c99572a8ff84754c" + integrity sha512-6XbUAseYE2KtOuGueyeobCySj9L4+66Tn6KQMOPQJrAJEowYKW/YR/MGJZl7FdydUdaFu4LYyDZjxf4/Nmo23Q== dependencies: - tslib "^1.9.0" + call-bind "^1.0.2" + get-intrinsic "^1.2.1" + has-symbols "^1.0.3" + isarray "^2.0.5" safe-buffer@5.2.1, safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@^5.1.1, safe-buffer@^5.1.2, safe-buffer@^5.2.0, safe-buffer@^5.2.1, safe-buffer@~5.2.0: version "5.2.1" @@ -9379,10 +8810,19 @@ safe-event-emitter@^1.0.1: dependencies: events "^3.0.0" +safe-regex-test@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/safe-regex-test/-/safe-regex-test-1.0.0.tgz#793b874d524eb3640d1873aad03596db2d4f2295" + integrity sha512-JBUUzyOgEwXQY1NuPtvcj/qcBDbDmEvWufhlnXZIm75DEHp+afM1r1ujJpJsV/gSM4t59tpDyPi1sd6ZaPFfsA== + dependencies: + call-bind "^1.0.2" + get-intrinsic "^1.1.3" + is-regex "^1.1.4" + safe-regex@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/safe-regex/-/safe-regex-1.1.0.tgz#40a3669f3b077d1e943d44629e157dd48023bf2e" - integrity sha1-QKNmnzsHfR6UPURinhV91IAjvy4= + integrity sha512-aJXcif4xnaNUzvUuC5gcb46oTS7zvg4jpMTnuqtrEPlR3vFr4pxtdTwaF1Qs3Enjn9HK+ZlwQui+a7z0SywIzg== dependencies: ret "~0.1.10" @@ -9424,7 +8864,7 @@ scrypt-js@3.0.1, scrypt-js@^3.0.0, scrypt-js@^3.0.1: scryptsy@^1.2.1: version "1.2.1" resolved "https://registry.yarnpkg.com/scryptsy/-/scryptsy-1.2.1.tgz#a3225fa4b2524f802700761e2855bdf3b2d92163" - integrity sha1-oyJfpLJST4AnAHYeKFW987LZIWM= + integrity sha512-aldIRgMozSJ/Gl6K6qmJZysRP82lz83Wb42vl4PWN8SaLFHIaOzLPc9nUUW2jQN88CuGm5q5HefJ9jZ3nWSmTw== dependencies: pbkdf2 "^3.0.3" @@ -9442,37 +8882,25 @@ seedrandom@3.0.1: resolved "https://registry.yarnpkg.com/seedrandom/-/seedrandom-3.0.1.tgz#eb3dde015bcf55df05a233514e5df44ef9dce083" integrity sha512-1/02Y/rUeU1CJBAGLebiC5Lbo5FnB22gQbIFFYTLkwvp1xdABZJH1sn4ZT1MzXmPpzv+Rf/Lu2NcsLJiK4rcDg== -semaphore-async-await@^1.5.1: - version "1.5.1" - resolved "https://registry.yarnpkg.com/semaphore-async-await/-/semaphore-async-await-1.5.1.tgz#857bef5e3644601ca4b9570b87e9df5ca12974fa" - integrity sha1-hXvvXjZEYBykuVcLh+nfXKEpdPo= - semaphore@>=1.0.1, semaphore@^1.0.3, semaphore@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/semaphore/-/semaphore-1.1.0.tgz#aaad8b86b20fe8e9b32b16dc2ee682a8cd26a8aa" integrity sha512-O4OZEaNtkMd/K0i6js9SL+gqy0ZCBMgUvlSqHKi4IBdjhe7wB8pwztUk1BbZ1fmrvpwFrPbHzqd2w5pTcJH6LA== -"semver@2 || 3 || 4 || 5", semver@^5.3.0, semver@^5.5.0, semver@^5.5.1, semver@^5.6.0, semver@^5.7.0: - version "5.7.1" - resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7" - integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ== +"semver@2 || 3 || 4 || 5", semver@^5.3.0, semver@^5.5.0, semver@^5.6.0, semver@^5.7.0: + version "5.7.2" + resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.2.tgz#48d55db737c3287cd4835e17fa13feace1c41ef8" + integrity sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g== semver@^6.3.0: - version "6.3.0" - resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d" - integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw== - -semver@^7.3.4, semver@^7.3.5: - version "7.3.5" - resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.5.tgz#0b621c879348d8998e4b0e4be94b3f12e6018ef7" - integrity sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ== - dependencies: - lru-cache "^6.0.0" + version "6.3.1" + resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.1.tgz#556d2ef8689146e46dcea4bfdd095f3434dffcb4" + integrity sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA== -semver@^7.3.7: - version "7.3.7" - resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.7.tgz#12c5b649afdbf9049707796e22a4028814ce523f" - integrity sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g== +semver@^7.3.4, semver@^7.3.7, semver@^7.3.8, semver@^7.5.2: + version "7.5.4" + resolved "https://registry.yarnpkg.com/semver/-/semver-7.5.4.tgz#483986ec4ed38e1c6c48c34894a9182dbff68a6e" + integrity sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA== dependencies: lru-cache "^6.0.0" @@ -9481,24 +8909,24 @@ semver@~5.4.1: resolved "https://registry.yarnpkg.com/semver/-/semver-5.4.1.tgz#e059c09d8571f0540823733433505d3a2f00b18e" integrity sha512-WfG/X9+oATh81XtllIo/I8gOiY9EXRdv1cQdyykeXK17YcUW3EXUAi2To4pcH6nZtJPr7ZOpM5OMyWJZm+8Rsg== -send@0.17.2: - version "0.17.2" - resolved "https://registry.yarnpkg.com/send/-/send-0.17.2.tgz#926622f76601c41808012c8bf1688fe3906f7820" - integrity sha512-UJYB6wFSJE3G00nEivR5rgWp8c2xXvJ3OPWPhmuteU0IKj8nKbG3DrjiOmLwpnHGYWAVwA69zmTm++YG0Hmwww== +send@0.18.0: + version "0.18.0" + resolved "https://registry.yarnpkg.com/send/-/send-0.18.0.tgz#670167cc654b05f5aa4a767f9113bb371bc706be" + integrity sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg== dependencies: debug "2.6.9" - depd "~1.1.2" - destroy "~1.0.4" + depd "2.0.0" + destroy "1.2.0" encodeurl "~1.0.2" escape-html "~1.0.3" etag "~1.8.1" fresh "0.5.2" - http-errors "1.8.1" + http-errors "2.0.0" mime "1.6.0" ms "2.1.3" - on-finished "~2.3.0" + on-finished "2.4.1" range-parser "~1.2.1" - statuses "~1.5.0" + statuses "2.0.1" serialize-javascript@6.0.0: version "6.0.0" @@ -9507,15 +8935,15 @@ serialize-javascript@6.0.0: dependencies: randombytes "^2.1.0" -serve-static@1.14.2: - version "1.14.2" - resolved "https://registry.yarnpkg.com/serve-static/-/serve-static-1.14.2.tgz#722d6294b1d62626d41b43a013ece4598d292bfa" - integrity sha512-+TMNA9AFxUEGuC0z2mevogSnn9MXKb4fa7ngeRMJaaGv8vTwnIEkKi+QGvPt33HSnf8pRS+WGM0EbMtCJLKMBQ== +serve-static@1.15.0: + version "1.15.0" + resolved "https://registry.yarnpkg.com/serve-static/-/serve-static-1.15.0.tgz#faaef08cffe0a1a62f60cad0c4e513cff0ac9540" + integrity sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g== dependencies: encodeurl "~1.0.2" escape-html "~1.0.3" parseurl "~1.3.3" - send "0.17.2" + send "0.18.0" servify@^0.1.12: version "0.1.12" @@ -9531,12 +8959,12 @@ servify@^0.1.12: set-blocking@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7" - integrity sha1-BF+XgtARrppoA93TgrJDkrPYkPc= + integrity sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw== set-immediate-shim@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/set-immediate-shim/-/set-immediate-shim-1.0.1.tgz#4b2b1b27eb808a9f8dcc481a58e5e56f599f3f61" - integrity sha1-SysbJ+uAip+NzEgaWOXlb1mfP2E= + integrity sha512-Li5AOqrZWCVA2n5kryzEmqai6bKSIvpz5oUJHPVj6+dsbD3X1ixtsY5tEnsaNpH3pFAHmG8eIHUrtEtohrg+UQ== set-value@^2.0.0, set-value@^2.0.1: version "2.0.1" @@ -9551,12 +8979,12 @@ set-value@^2.0.0, set-value@^2.0.1: setimmediate@1.0.4: version "1.0.4" resolved "https://registry.yarnpkg.com/setimmediate/-/setimmediate-1.0.4.tgz#20e81de622d4a02588ce0c8da8973cbcf1d3138f" - integrity sha1-IOgd5iLUoCWIzgyNqJc8vPHTE48= + integrity sha512-/TjEmXQVEzdod/FFskf3o7oOAsGhHf2j1dZqRFbDzq4F3mvvxflIIi4Hd3bLQE9y/CpwqfSQam5JakI/mi3Pog== setimmediate@^1.0.5: version "1.0.5" resolved "https://registry.yarnpkg.com/setimmediate/-/setimmediate-1.0.5.tgz#290cbb232e306942d7d7ea9b83732ab7856f8285" - integrity sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU= + integrity sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA== setprototypeof@1.2.0: version "1.2.0" @@ -9574,7 +9002,7 @@ sha.js@^2.4.0, sha.js@^2.4.8: sha1@^1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/sha1/-/sha1-1.1.1.tgz#addaa7a93168f393f19eb2b15091618e2700f848" - integrity sha1-rdqnqTFo85PxnrKxUJFhjicA+Eg= + integrity sha512-dZBS6OrMjtgVkopB1Gmo4RQCDKiZsqcpAQpkV/aaj+FCrCg8r4I4qMkDPQjBgLIxlmu9k4nUbWq6ohXahOneYA== dependencies: charenc ">= 0.0.1" crypt ">= 0.0.1" @@ -9582,7 +9010,7 @@ sha1@^1.1.1: shebang-command@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-1.2.0.tgz#44aac65b695b03398968c39f363fee5deafdf1ea" - integrity sha1-RKrGW2lbAzmJaMOfNj/uXer98eo= + integrity sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg== dependencies: shebang-regex "^1.0.0" @@ -9596,7 +9024,7 @@ shebang-command@^2.0.0: shebang-regex@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-1.0.0.tgz#da42f49740c0b42db2ca9728571cb190c98efea3" - integrity sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM= + integrity sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ== shebang-regex@^3.0.0: version "3.0.0" @@ -9621,11 +9049,6 @@ side-channel@^1.0.4: get-intrinsic "^1.0.2" object-inspect "^1.9.0" -signal-exit@^3.0.2: - version "3.0.7" - resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.7.tgz#a9a1767f8af84155114eaabd73f99273c8f59ad9" - integrity sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ== - simple-concat@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/simple-concat/-/simple-concat-1.0.1.tgz#f46976082ba35c2263f1c8ab5edfe26c41c9552f" @@ -9643,7 +9066,7 @@ simple-get@^2.7.0: slash@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/slash/-/slash-1.0.0.tgz#c41f2f6c39fc16d1cd17ad4b5d896114ae470d55" - integrity sha1-xB8vbDn8FtHNF61LXYlhFK5HDVU= + integrity sha512-3TYDR7xWt4dIqV2JauJr+EJeW356RXijHeUlO+8djJ+uBXPn8/2dpzBc8yQhh583sVvc9CvFAeQVgijsH+PNNg== slash@^2.0.0: version "2.0.0" @@ -9655,15 +9078,6 @@ slash@^3.0.0: resolved "https://registry.yarnpkg.com/slash/-/slash-3.0.0.tgz#6539be870c165adbd5240220dbe361f1bc4d4634" integrity sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q== -slice-ansi@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-2.1.0.tgz#cacd7693461a637a5788d92a7dd4fba068e81636" - integrity sha512-Qu+VC3EwYLldKa1fCxuuvULvSJOKEgk9pi8dZeCVK7TqBfUNTH4sFkk4joj8afVSfAYgJoSOetjx9QWOJ5mYoQ== - dependencies: - ansi-styles "^3.2.0" - astral-regex "^1.0.0" - is-fullwidth-code-point "^2.0.0" - slice-ansi@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-4.0.0.tgz#500e8dd0fd55b05815086255b3195adf2a45fe6b" @@ -9766,26 +9180,29 @@ solhint-plugin-prettier@^0.0.5: prettier-linter-helpers "^1.0.0" solhint@^3.3.7: - version "3.3.7" - resolved "https://registry.yarnpkg.com/solhint/-/solhint-3.3.7.tgz#b5da4fedf7a0fee954cb613b6c55a5a2b0063aa7" - integrity sha512-NjjjVmXI3ehKkb3aNtRJWw55SUVJ8HMKKodwe0HnejA+k0d2kmhw7jvpa+MCTbcEgt8IWSwx0Hu6aCo/iYOZzQ== - dependencies: - "@solidity-parser/parser" "^0.14.1" - ajv "^6.6.1" - antlr4 "4.7.1" - ast-parents "0.0.1" - chalk "^2.4.2" - commander "2.18.0" - cosmiconfig "^5.0.7" - eslint "^5.6.0" - fast-diff "^1.1.2" - glob "^7.1.3" - ignore "^4.0.6" - js-yaml "^3.12.0" - lodash "^4.17.11" - semver "^6.3.0" + version "3.6.2" + resolved "https://registry.yarnpkg.com/solhint/-/solhint-3.6.2.tgz#2b2acbec8fdc37b2c68206a71ba89c7f519943fe" + integrity sha512-85EeLbmkcPwD+3JR7aEMKsVC9YrRSxd4qkXuMzrlf7+z2Eqdfm1wHWq1ffTuo5aDhoZxp2I9yF3QkxZOxOL7aQ== + dependencies: + "@solidity-parser/parser" "^0.16.0" + ajv "^6.12.6" + antlr4 "^4.11.0" + ast-parents "^0.0.1" + chalk "^4.1.2" + commander "^10.0.0" + cosmiconfig "^8.0.0" + fast-diff "^1.2.0" + glob "^8.0.3" + ignore "^5.2.4" + js-yaml "^4.1.0" + lodash "^4.17.21" + pluralize "^8.0.0" + semver "^7.5.2" + strip-ansi "^6.0.1" + table "^6.8.1" + text-table "^0.2.0" optionalDependencies: - prettier "^1.14.3" + prettier "^2.8.3" solidity-comments-extractor@^0.0.7: version "0.0.7" @@ -9793,9 +9210,9 @@ solidity-comments-extractor@^0.0.7: integrity sha512-wciNMLg/Irp8OKGrh3S2tfvZiZ0NEyILfcRCXCD4mp7SgK/i9gzLfhY2hY7VMCQJ3kH9UB9BzNdibIVMchzyYw== solidity-coverage@^0.7.20: - version "0.7.20" - resolved "https://registry.yarnpkg.com/solidity-coverage/-/solidity-coverage-0.7.20.tgz#246e9b0dd62f698bb8ddeecdcc46cab26c48b637" - integrity sha512-edOXTugUYdqxrtEnIn4vgrGjLPxdexcL0WD8LzAvVA3d1dwgcfRO3k8xQR02ZQnOnWMBi8Cqs0F+kAQQp3JW8g== + version "0.7.22" + resolved "https://registry.yarnpkg.com/solidity-coverage/-/solidity-coverage-0.7.22.tgz#168f414be4c0f5303addcf3ab9714cf64f72c080" + integrity sha512-I6Zd5tsFY+gmj1FDIp6w7OrUePx6ZpMgKQZg7dWgPaQHePLi3Jk+iJ8lwZxsWEoNy2Lcv91rMxATWHqRaFdQpw== dependencies: "@solidity-parser/parser" "^0.14.0" "@truffle/provider" "^0.2.24" @@ -9858,7 +9275,7 @@ source-map-url@^0.4.0: source-map@^0.5.6, source-map@^0.5.7: version "0.5.7" resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc" - integrity sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w= + integrity sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ== source-map@^0.6.0, source-map@^0.6.1: version "0.6.1" @@ -9868,14 +9285,14 @@ source-map@^0.6.0, source-map@^0.6.1: source-map@~0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.2.0.tgz#dab73fbcfc2ba819b4de03bd6f6eaa48164b3f9d" - integrity sha1-2rc/vPwrqBm03gO9b26qSBZLP50= + integrity sha512-CBdZ2oa/BHhS4xj5DlhjWNHcan57/5YuvfdLf17iVmIpd9KRm+DFLmC6nBNj+6Ua7Kt3TmOjDpQT1aTYOQtoUA== dependencies: amdefine ">=0.0.4" spdx-correct@^3.0.0: - version "3.1.1" - resolved "https://registry.yarnpkg.com/spdx-correct/-/spdx-correct-3.1.1.tgz#dece81ac9c1e6713e5f7d1b6f17d468fa53d89a9" - integrity sha512-cOYcUWwhCuHCXi49RhFRCyJEK3iPj1Ziz9DpViV3tbZOwXD49QzIN3MpOLJNxh2qwq2lJJZaKMVw9qNi4jTC0w== + version "3.2.0" + resolved "https://registry.yarnpkg.com/spdx-correct/-/spdx-correct-3.2.0.tgz#4f5ab0668f0059e34f9c00dce331784a12de4e9c" + integrity sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA== dependencies: spdx-expression-parse "^3.0.0" spdx-license-ids "^3.0.0" @@ -9894,9 +9311,9 @@ spdx-expression-parse@^3.0.0: spdx-license-ids "^3.0.0" spdx-license-ids@^3.0.0: - version "3.0.11" - resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-3.0.11.tgz#50c0d8c40a14ec1bf449bae69a0ea4685a9d9f95" - integrity sha512-Ctl2BrFiM0X3MANYgj3CkygxhRmr9mi6xhejbdO960nF6EDJApTYpn0BQnDKlnNBULKiCN1n3w9EBkHK8ZWg+g== + version "3.0.13" + resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-3.0.13.tgz#7189a474c46f8d47c7b0da4b987bb45e908bd2d5" + integrity sha512-XkD+zwiqXHikFZm4AX/7JSCXA98U5Db4AFd5XUg/+9UNtnH75+Z9KxtpYiJZx36mUDVOwH83pl7yvCer6ewM3w== split-string@^3.0.1, split-string@^3.0.2: version "3.1.0" @@ -9908,7 +9325,7 @@ split-string@^3.0.1, split-string@^3.0.2: sprintf-js@~1.0.2: version "1.0.3" resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" - integrity sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw= + integrity sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g== sshpk@^1.7.0: version "1.17.0" @@ -9935,7 +9352,7 @@ stacktrace-parser@^0.1.10: static-extend@^0.1.1: version "0.1.2" resolved "https://registry.yarnpkg.com/static-extend/-/static-extend-0.1.2.tgz#60809c39cbff55337226fd5e0b520f341f1fb5c6" - integrity sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY= + integrity sha512-72E9+uLc27Mt718pMHt9VMNiAL4LMsmDbBva8mxWUCkT07fSzEGMYUCk0XWY6lp0j6RBAG4cJ3mWuZv2OE3s0g== dependencies: define-property "^0.2.5" object-copy "^0.1.0" @@ -9945,15 +9362,10 @@ statuses@2.0.1: resolved "https://registry.yarnpkg.com/statuses/-/statuses-2.0.1.tgz#55cb000ccf1d48728bd23c685a063998cf1a1b63" integrity sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ== -"statuses@>= 1.5.0 < 2", statuses@~1.5.0: - version "1.5.0" - resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.5.0.tgz#161c7dac177659fd9811f43771fa99381478628c" - integrity sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow= - stealthy-require@^1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/stealthy-require/-/stealthy-require-1.1.1.tgz#35b09875b4ff49f26a777e509b3090a3226bf24b" - integrity sha1-NbCYdbT/SfJqd35QmzCQoyJr8ks= + integrity sha512-ZnWpYnYugiOVEY5GkcuJK1io5V8QmNYChG62gSit9pQVGErXtrKuPC55ITaVSukmMta5qpMU7vqLt2Lnni4f/g== stream-to-pull-stream@^1.7.1: version "1.7.3" @@ -9963,10 +9375,15 @@ stream-to-pull-stream@^1.7.1: looper "^3.0.0" pull-stream "^3.2.3" +streamsearch@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/streamsearch/-/streamsearch-1.1.0.tgz#404dd1e2247ca94af554e841a8ef0eaa238da764" + integrity sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg== + strict-uri-encode@^1.0.0: version "1.1.0" resolved "https://registry.yarnpkg.com/strict-uri-encode/-/strict-uri-encode-1.1.0.tgz#279b225df1d582b1f54e65addd4352e18faa0713" - integrity sha1-J5siXfHVgrH1TmWt3UNS4Y+qBxM= + integrity sha512-R3f198pcvnB+5IpnBlRkphuE9n46WyVl8I39W/ZUTZLz4nqSP/oLYUrcnJrw462Ds8he4YKMov2efsTIw1BDGQ== string-format@^2.0.0: version "2.0.0" @@ -9976,13 +9393,13 @@ string-format@^2.0.0: string-width@^1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/string-width/-/string-width-1.0.2.tgz#118bdf5b8cdc51a2a7e70d211e07e2b0b9b107d3" - integrity sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M= + integrity sha512-0XsVpQLnVCXHJfyEs8tC0zpTVIr5PKKsQtkT29IwupnPTjtPmQ3xT/4yCREF9hYkV/3M3kzcUTSAZT6a6h81tw== dependencies: code-point-at "^1.0.0" is-fullwidth-code-point "^1.0.0" strip-ansi "^3.0.0" -"string-width@^1.0.2 || 2", string-width@^2.1.0, string-width@^2.1.1: +"string-width@^1.0.2 || 2", string-width@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/string-width/-/string-width-2.1.1.tgz#ab93f27a8dc13d28cac815c462143a6d9012ae9e" integrity sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw== @@ -10008,30 +9425,32 @@ string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3: is-fullwidth-code-point "^3.0.0" strip-ansi "^6.0.1" -string.prototype.trim@~1.2.5: - version "1.2.5" - resolved "https://registry.yarnpkg.com/string.prototype.trim/-/string.prototype.trim-1.2.5.tgz#a587bcc8bfad8cb9829a577f5de30dd170c1682c" - integrity sha512-Lnh17webJVsD6ECeovpVN17RlAKjmz4rF9S+8Y45CkMc/ufVpTkU3vZIyIC7sllQ1FCvObZnnCdNs/HXTUOTlg== +string.prototype.trim@^1.2.7, string.prototype.trim@~1.2.7: + version "1.2.8" + resolved "https://registry.yarnpkg.com/string.prototype.trim/-/string.prototype.trim-1.2.8.tgz#f9ac6f8af4bd55ddfa8895e6aea92a96395393bd" + integrity sha512-lfjY4HcixfQXOfaqCvcBuOIapyaroTXhbkfJN3gcB1OtyupngWK4sEET9Knd0cXd28kTUqu/kHoV4HKSJdnjiQ== dependencies: call-bind "^1.0.2" - define-properties "^1.1.3" - es-abstract "^1.19.1" + define-properties "^1.2.0" + es-abstract "^1.22.1" -string.prototype.trimend@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/string.prototype.trimend/-/string.prototype.trimend-1.0.4.tgz#e75ae90c2942c63504686c18b287b4a0b1a45f80" - integrity sha512-y9xCjw1P23Awk8EvTpcyL2NIr1j7wJ39f+k6lvRnSMz+mz9CGz9NYPelDk42kOz6+ql8xjfK8oYzy3jAP5QU5A== +string.prototype.trimend@^1.0.6: + version "1.0.7" + resolved "https://registry.yarnpkg.com/string.prototype.trimend/-/string.prototype.trimend-1.0.7.tgz#1bb3afc5008661d73e2dc015cd4853732d6c471e" + integrity sha512-Ni79DqeB72ZFq1uH/L6zJ+DKZTkOtPIHovb3YZHQViE+HDouuU4mBrLOLDn5Dde3RF8qw5qVETEjhu9locMLvA== dependencies: call-bind "^1.0.2" - define-properties "^1.1.3" + define-properties "^1.2.0" + es-abstract "^1.22.1" -string.prototype.trimstart@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/string.prototype.trimstart/-/string.prototype.trimstart-1.0.4.tgz#b36399af4ab2999b4c9c648bd7a3fb2bb26feeed" - integrity sha512-jh6e984OBfvxS50tdY2nRZnoC5/mLFKOREQfw8t5yytkoUsJRNxvI/E39qu1sD0OtWI3OC0XgKSmcWwziwYuZw== +string.prototype.trimstart@^1.0.6: + version "1.0.7" + resolved "https://registry.yarnpkg.com/string.prototype.trimstart/-/string.prototype.trimstart-1.0.7.tgz#d4cdb44b83a4737ffbac2d406e405d43d0184298" + integrity sha512-NGhtDFu3jCEm7B4Fy0DpLewdJQOZcQ0rGbwQ/+stjnrp2i+rlKeCvos9hOIeCmqwratM47OBxY7uFZzjxHXmrg== dependencies: call-bind "^1.0.2" - define-properties "^1.1.3" + define-properties "^1.2.0" + es-abstract "^1.22.1" string_decoder@^1.1.1: version "1.3.0" @@ -10043,7 +9462,7 @@ string_decoder@^1.1.1: string_decoder@~0.10.x: version "0.10.31" resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-0.10.31.tgz#62e203bc41766c6c28c9fc84301dab1c5310fa94" - integrity sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ= + integrity sha512-ev2QzSzWPYmy9GuqfIVildA4OdcGLeFZQrq5ys6RtiuF+RQQiZWr8TZNyAcuVXyQRYfEO+MsoB/1BuQVhOJuoQ== string_decoder@~1.1.1: version "1.1.1" @@ -10055,14 +9474,14 @@ string_decoder@~1.1.1: strip-ansi@^3.0.0, strip-ansi@^3.0.1: version "3.0.1" resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-3.0.1.tgz#6a385fb8853d952d5ff05d0e8aaf94278dc63dcf" - integrity sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8= + integrity sha512-VhumSSbBqDTP8p2ZLKj40UjBCV4+v8bUSEpUb4KjRgWk9pbqGF4REFj6KEagidb2f/M6AzC0EmFyDNGaw9OCzg== dependencies: ansi-regex "^2.0.0" strip-ansi@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-4.0.0.tgz#a8479022eb1ac368a871389b635262c505ee368f" - integrity sha1-qEeQIusaw2iocTibY1JixQXuNo8= + integrity sha512-4XaJ2zQdCzROZDivEVIDPkcQn8LMFSa8kj8Gxb/Lnwzv9A8VctNZ+lfivC/sV3ivW8ElJTERXZoPBRrZKkNKow== dependencies: ansi-regex "^3.0.0" @@ -10083,23 +9502,23 @@ strip-ansi@^6.0.0, strip-ansi@^6.0.1: strip-bom@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-2.0.0.tgz#6219a85616520491f35788bdbf1447a99c7e6b0e" - integrity sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4= + integrity sha512-kwrX1y7czp1E69n2ajbG65mIo9dqvJ+8aBQXOGVxqwvNbsXdFM6Lq37dLAY3mknUwru8CfcCbfOLL/gMo+fi3g== dependencies: is-utf8 "^0.2.0" strip-hex-prefix@1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/strip-hex-prefix/-/strip-hex-prefix-1.0.0.tgz#0c5f155fef1151373377de9dbb588da05500e36f" - integrity sha1-DF8VX+8RUTczd96du1iNoFUA428= + integrity sha512-q8d4ue7JGEiVcypji1bALTos+0pWtyGlivAWyPuTkHzuTCJqrK9sWxYQZUq6Nq3cuyv3bm734IhHvHtGGURU6A== dependencies: is-hex-prefixed "1.0.0" -strip-json-comments@2.0.1, strip-json-comments@^2.0.1: +strip-json-comments@2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a" - integrity sha1-PFMZQukIwml8DsNEhYwobHygpgo= + integrity sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ== -strip-json-comments@3.1.1, strip-json-comments@^3.1.0, strip-json-comments@^3.1.1: +strip-json-comments@3.1.1, strip-json-comments@^3.1.1: version "3.1.1" resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006" integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig== @@ -10121,12 +9540,12 @@ supports-color@8.1.1: supports-color@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-2.0.0.tgz#535d045ce6b6363fa40117084629995e9df324c7" - integrity sha1-U10EXOa2Nj+kARcIRimZXp3zJMc= + integrity sha512-KKNVtd6pCYgPIKU4cp2733HWYCpplQhddZLBUryaAHou723x+FRzQ5Df824Fj+IyyuiQTRoub4SnIFfIcrp70g== supports-color@^3.1.0: version "3.2.3" resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-3.2.3.tgz#65ac0504b3954171d8a64946b2ae3cbb8a5f54f6" - integrity sha1-ZawFBLOVQXHYpklGsq48u4pfVPY= + integrity sha512-Jds2VIYDrlp5ui7t8abHN2bjAu4LV/q4N2KivFPpGH0lrka0BMq/33AmECUXlKPcHigkNaqfXRENFju+rlcy+A== dependencies: has-flag "^1.0.0" @@ -10150,15 +9569,15 @@ supports-preserve-symlinks-flag@^1.0.0: integrity sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w== swarm-js@^0.1.40: - version "0.1.40" - resolved "https://registry.yarnpkg.com/swarm-js/-/swarm-js-0.1.40.tgz#b1bc7b6dcc76061f6c772203e004c11997e06b99" - integrity sha512-yqiOCEoA4/IShXkY3WKwP5PvZhmoOOD8clsKA7EEcRILMkTEYHCQ21HDCAcVpmIxZq4LyZvWeRJ6quIyHk1caA== + version "0.1.42" + resolved "https://registry.yarnpkg.com/swarm-js/-/swarm-js-0.1.42.tgz#497995c62df6696f6e22372f457120e43e727979" + integrity sha512-BV7c/dVlA3R6ya1lMlSSNPLYrntt0LUq4YMgy3iwpCIc6rZnS5W2wUoctarZ5pXlpKtxDDf9hNziEkcfrxdhqQ== dependencies: bluebird "^3.5.0" buffer "^5.0.5" eth-lib "^0.1.26" fs-extra "^4.0.2" - got "^7.1.0" + got "^11.8.5" mime-types "^2.1.16" mkdirp-promise "^5.0.1" mock-fs "^4.1.0" @@ -10182,7 +9601,7 @@ sync-rpc@^1.2.1: dependencies: get-port "^3.1.0" -table-layout@^1.0.1: +table-layout@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/table-layout/-/table-layout-1.0.2.tgz#c4038a1853b0136d63365a734b6931cf4fad4a04" integrity sha512-qd/R7n5rQTRFi+Zf2sk5XVVd9UQl6ZkduPFC3S7WEGJAmetDTjY3qPN50eSKzwuzEyQKy5TN2TiZdkIjos2L6A== @@ -10192,20 +9611,10 @@ table-layout@^1.0.1: typical "^5.2.0" wordwrapjs "^4.0.0" -table@^5.2.3: - version "5.4.6" - resolved "https://registry.yarnpkg.com/table/-/table-5.4.6.tgz#1292d19500ce3f86053b05f0e8e7e4a3bb21079e" - integrity sha512-wmEc8m4fjnob4gt5riFRtTu/6+4rSe12TpAELNSqHMfF3IqnA+CH37USM6/YR3qRZv7e56kAEAtd6nKZaxe0Ug== - dependencies: - ajv "^6.10.2" - lodash "^4.17.14" - slice-ansi "^2.1.0" - string-width "^3.0.0" - -table@^6.8.0: - version "6.8.0" - resolved "https://registry.yarnpkg.com/table/-/table-6.8.0.tgz#87e28f14fa4321c3377ba286f07b79b281a3b3ca" - integrity sha512-s/fitrbVeEyHKFa7mFdkuQMWlH1Wgw/yEXMt5xACT4ZpzWFluehAxRtUUQKPuWhaLAWhFcVx6w3oC8VKaUfPGA== +table@^6.8.0, table@^6.8.1: + version "6.8.1" + resolved "https://registry.yarnpkg.com/table/-/table-6.8.1.tgz#ea2b71359fe03b017a5fbc296204471158080bdf" + integrity sha512-Y4X9zqrCftUhMeH2EptSSERdVKt/nEdijTOacGD/97EKjhQ/Qs8RTlEGABSJNNN8lac9kheH+af7yAkEWlgneA== dependencies: ajv "^8.0.1" lodash.truncate "^4.4.2" @@ -10214,24 +9623,24 @@ table@^6.8.0: strip-ansi "^6.0.1" tape@^4.6.3: - version "4.15.0" - resolved "https://registry.yarnpkg.com/tape/-/tape-4.15.0.tgz#1b8a9563b4bc7e51302216c137732fb2ce6d1a99" - integrity sha512-SfRmG2I8QGGgJE/MCiLH8c11L5XxyUXxwK9xLRD0uiK5fehRkkSZGmR6Y1pxOt8vJ19m3sY+POTQpiaVv45/LQ== + version "4.16.2" + resolved "https://registry.yarnpkg.com/tape/-/tape-4.16.2.tgz#7565e6af20426565557266e9dda7215869b297b6" + integrity sha512-TUChV+q0GxBBCEbfCYkGLkv8hDJYjMdSWdE0/Lr331sB389dsvFUHNV9ph5iQqKzt8Ss9drzcda/YeexclBFqg== dependencies: call-bind "~1.0.2" deep-equal "~1.1.1" - defined "~1.0.0" + defined "~1.0.1" dotignore "~0.1.2" for-each "~0.3.3" - glob "~7.2.0" + glob "~7.2.3" has "~1.0.3" inherits "~2.0.4" is-regex "~1.1.4" - minimist "~1.2.5" - object-inspect "~1.12.0" - resolve "~1.22.0" + minimist "~1.2.7" + object-inspect "~1.12.3" + resolve "~1.22.1" resumer "~0.0.0" - string.prototype.trim "~1.2.5" + string.prototype.trim "~1.2.7" through "~2.3.8" tar-fs@2.1.1: @@ -10271,7 +9680,7 @@ tar@^4.0.2: test-value@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/test-value/-/test-value-2.1.0.tgz#11da6ff670f3471a73b625ca4f3fdcf7bb748291" - integrity sha1-Edpv9nDzRxpztiXKTz/c97t0gpE= + integrity sha512-+1epbAxtKeXttkGFMTX9H42oqzOTufR1ceCF+GYA5aOmvaPq9wd4PUS8329fn2RRLGNeUkgRLnVpycjx8DsO2w== dependencies: array-back "^1.0.3" typical "^2.6.0" @@ -10284,7 +9693,7 @@ testrpc@0.0.1: text-table@^0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4" - integrity sha1-f17oI66AUgfACvLfSoTsP8+lcLQ= + integrity sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw== then-request@^6.0.0: version "6.0.2" @@ -10311,15 +9720,15 @@ through2@^2.0.3: readable-stream "~2.3.6" xtend "~4.0.1" -through@^2.3.6, through@^2.3.8, through@~2.3.4, through@~2.3.8: +through@^2.3.8, through@~2.3.4, through@~2.3.8: version "2.3.8" resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" - integrity sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU= + integrity sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg== -timed-out@^4.0.0, timed-out@^4.0.1: +timed-out@^4.0.1: version "4.0.1" resolved "https://registry.yarnpkg.com/timed-out/-/timed-out-4.0.1.tgz#f32eacac5a175bea25d7fab565ab3ed8741ef56f" - integrity sha1-8y6srFoXW+ol1/q1Zas+2HQe9W8= + integrity sha512-G7r3AhovYtr5YKOWQkta8RKAPb+J9IsO4uVmzjl8AZwfhs8UcUwTiD6gcJYSgOtzyjvQKrKYn41syHbUWMkafA== tmp@0.0.33, tmp@^0.0.33: version "0.0.33" @@ -10345,12 +9754,12 @@ tmp@^0.2.1: to-fast-properties@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-1.0.3.tgz#b83571fa4d8c25b82e231b06e3a3055de4ca1a47" - integrity sha1-uDVx+k2MJbguIxsG46MFXeTKGkc= + integrity sha512-lxrWP8ejsq+7E3nNjwYmUBMAgjMTZoTI+sdBOpvNyijeDLa29LUn9QaoXAHv4+Z578hbmHHJKZknzxVtvo77og== to-object-path@^0.3.0: version "0.3.0" resolved "https://registry.yarnpkg.com/to-object-path/-/to-object-path-0.3.0.tgz#297588b7b0e7e0ac08e04e672f85c1f4999e17af" - integrity sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68= + integrity sha512-9mWHdnGRuh3onocaHzukyvCZhzvr6tiflAy/JRFXcJX0TjgfWA9pk9t8CMbzmBE4Jfw58pXbkngtBtqYxzNEyg== dependencies: kind-of "^3.0.2" @@ -10362,7 +9771,7 @@ to-readable-stream@^1.0.0: to-regex-range@^2.1.0: version "2.1.1" resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-2.1.1.tgz#7c80c17b9dfebe599e27367e0d4dd5590141db38" - integrity sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg= + integrity sha512-ZZWNfCjUokXXDGXFpZehJIkZqq91BcULFq/Pi7M5i4JnxXdhMKAK682z8bCW3o8Hj1wuuzoKcW3DfVzaP6VuNg== dependencies: is-number "^3.0.0" repeat-string "^1.6.1" @@ -10400,22 +9809,17 @@ tough-cookie@^2.3.3, tough-cookie@~2.5.0: tr46@~0.0.3: version "0.0.3" resolved "https://registry.yarnpkg.com/tr46/-/tr46-0.0.3.tgz#8184fd347dac9cdc185992f3a6622e14b9d9ab6a" - integrity sha1-gYT9NH2snNwYWZLzpmIuFLnZq2o= + integrity sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw== trim-right@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/trim-right/-/trim-right-1.0.1.tgz#cb2e1203067e0c8de1f614094b9fe45704ea6003" - integrity sha1-yy4SAwZ+DI3h9hQJS5/kVwTqYAM= - -"true-case-path@^2.2.1": - version "2.2.1" - resolved "https://registry.yarnpkg.com/true-case-path/-/true-case-path-2.2.1.tgz#c5bf04a5bbec3fd118be4084461b3a27c4d796bf" - integrity sha512-0z3j8R7MCjy10kc/g+qg7Ln3alJTodw9aDuVWZa3uiWqfuBMKeAeP2ocWcxoyM3D73yz3Jt/Pu4qPr4wHSdB/Q== + integrity sha512-WZGXGstmCWgeevgTL54hrCuw1dyMQIzWy7ZfqRJfSmJZBwklI15egmQytFP6bPidmw3M8d5yEowl1niq4vmqZw== ts-command-line-args@^2.2.0: - version "2.2.1" - resolved "https://registry.yarnpkg.com/ts-command-line-args/-/ts-command-line-args-2.2.1.tgz#fd6913e542099012c0ffb2496126a8f38305c7d6" - integrity sha512-mnK68QA86FYzQYTSA/rxIjT/8EpKsvQw9QkawPic8I8t0gjAOw3Oa509NIRoaY1FmH7hdrncMp7t7o+vYoceNQ== + version "2.5.1" + resolved "https://registry.yarnpkg.com/ts-command-line-args/-/ts-command-line-args-2.5.1.tgz#e64456b580d1d4f6d948824c274cf6fa5f45f7f0" + integrity sha512-H69ZwTw3rFHb5WYpQya40YAX2/w7Ut75uUECbgBIsLmM+BNuYnxsltfyyLMxy6sEeKxgijLTnQtLd0nKd6+IYw== dependencies: chalk "^4.1.0" command-line-args "^5.1.1" @@ -10453,11 +9857,11 @@ ts-generator@^0.1.1: ts-essentials "^1.0.0" ts-node@^10.4.0: - version "10.7.0" - resolved "https://registry.yarnpkg.com/ts-node/-/ts-node-10.7.0.tgz#35d503d0fab3e2baa672a0e94f4b40653c2463f5" - integrity sha512-TbIGS4xgJoX2i3do417KSaep1uRAW/Lu+WAL2doDHC0D6ummjirVOXU5/7aiZotbQ5p1Zp9tP7U6cYhA0O7M8A== + version "10.9.1" + resolved "https://registry.yarnpkg.com/ts-node/-/ts-node-10.9.1.tgz#e73de9102958af9e1f0b168a6ff320e25adcff4b" + integrity sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw== dependencies: - "@cspotcode/source-map-support" "0.7.0" + "@cspotcode/source-map-support" "^0.8.0" "@tsconfig/node10" "^1.0.7" "@tsconfig/node12" "^1.0.7" "@tsconfig/node14" "^1.0.0" @@ -10468,10 +9872,10 @@ ts-node@^10.4.0: create-require "^1.1.0" diff "^4.0.1" make-error "^1.1.1" - v8-compile-cache-lib "^3.0.0" + v8-compile-cache-lib "^3.0.1" yn "3.1.1" -tslib@^1.13.0, tslib@^1.8.1, tslib@^1.9.0, tslib@^1.9.3: +tslib@^1.13.0, tslib@^1.8.1, tslib@^1.9.3: version "1.14.1" resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.14.1.tgz#cf2d38bdc34a134bcaf1091c41f6619e2f672d00" integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg== @@ -10498,7 +9902,7 @@ tslint@^6.1.3: tsort@0.0.1: version "0.0.1" resolved "https://registry.yarnpkg.com/tsort/-/tsort-0.0.1.tgz#e2280f5e817f8bf4275657fd0f9aebd44f5a2786" - integrity sha1-4igPXoF/i/QnVlf9D5rr1E9aJ4Y= + integrity sha512-Tyrf5mxF8Ofs1tNoxA13lFeZ2Zrbd6cKbuH3V+MQ5sb6DtBj5FjrXVsRWT8YvNAQTqNoz66dz1WsbigI22aEnw== tsutils@^2.29.0: version "2.29.0" @@ -10517,7 +9921,7 @@ tsutils@^3.21.0: tunnel-agent@^0.6.0: version "0.6.0" resolved "https://registry.yarnpkg.com/tunnel-agent/-/tunnel-agent-0.6.0.tgz#27a5dea06b36b04a0a9966774b290868f0fc40fd" - integrity sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0= + integrity sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w== dependencies: safe-buffer "^5.0.1" @@ -10529,7 +9933,7 @@ tweetnacl-util@^0.15.0, tweetnacl-util@^0.15.1: tweetnacl@^0.14.3, tweetnacl@~0.14.0: version "0.14.5" resolved "https://registry.yarnpkg.com/tweetnacl/-/tweetnacl-0.14.5.tgz#5ae68177f192d4456269d108afa93ff8743f4f64" - integrity sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q= + integrity sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA== tweetnacl@^1.0.0, tweetnacl@^1.0.3: version "1.0.3" @@ -10546,7 +9950,7 @@ type-check@^0.4.0, type-check@~0.4.0: type-check@~0.3.2: version "0.3.2" resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.3.2.tgz#5884cab512cf1d355e3fb784f30804b2b520db72" - integrity sha1-WITKtRLPHTVeP7eE8wgEsrUg23I= + integrity sha512-ZCmOJdvOWDBYJlzAoFkC+Q0+bUyEOS1ltgp1MGU03fqHG+dbi9tBFU2Rd9QKiDZFAYrhPh2JUf7rZRIuHRKtOg== dependencies: prelude-ls "~1.1.2" @@ -10583,10 +9987,10 @@ type@^1.0.1: resolved "https://registry.yarnpkg.com/type/-/type-1.2.0.tgz#848dd7698dafa3e54a6c479e759c4bc3f18847a0" integrity sha512-+5nt5AAniqsCnu2cEQQdpzCAh33kVx8n0VoFidKpB1dVVLAN/F+bgVOqOJqOnEnrhp222clB5p3vUlD+1QAnfg== -type@^2.5.0: - version "2.6.0" - resolved "https://registry.yarnpkg.com/type/-/type-2.6.0.tgz#3ca6099af5981d36ca86b78442973694278a219f" - integrity sha512-eiDBDOmkih5pMbo9OqsqPRGMljLodLcwd5XD5JbtNB0o89xZAwynY9EdCDsJU7LtcVCClu9DvM7/0Ep1hYX3EQ== +type@^2.7.2: + version "2.7.2" + resolved "https://registry.yarnpkg.com/type/-/type-2.7.2.tgz#2376a15a3a28b1efa0f5350dcf72d24df6ef98d0" + integrity sha512-dzlvlNlt6AXU7EBSfpAscydQ7gXB+pPGsPnfJnZpiNJBDj7IaJzQlBZYGdEi4R9HmPdBv2XmWJ6YUtoTa7lmCw== typechain@^3.0.0: version "3.0.0" @@ -10602,9 +10006,9 @@ typechain@^3.0.0: ts-generator "^0.1.1" typechain@^8.0.0: - version "8.0.0" - resolved "https://registry.yarnpkg.com/typechain/-/typechain-8.0.0.tgz#a5dbe754717a7e16247df52b5285903de600e8ff" - integrity sha512-rqDfDYc9voVAhmfVfAwzg3VYFvhvs5ck1X9T/iWkX745Cul4t+V/smjnyqrbDzWDbzD93xfld1epg7Y/uFAesQ== + version "8.3.1" + resolved "https://registry.yarnpkg.com/typechain/-/typechain-8.3.1.tgz#dccbc839b94877997536c356380eff7325395cfb" + integrity sha512-fA7clol2IP/56yq6vkMTR+4URF1nGjV82Wx6Rf09EsqD4tkzMAvEaqYxVFCavJm/1xaRga/oD55K+4FtuXwQOQ== dependencies: "@types/prettier" "^2.1.1" debug "^4.3.1" @@ -10617,6 +10021,45 @@ typechain@^8.0.0: ts-command-line-args "^2.2.0" ts-essentials "^7.0.1" +typed-array-buffer@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/typed-array-buffer/-/typed-array-buffer-1.0.0.tgz#18de3e7ed7974b0a729d3feecb94338d1472cd60" + integrity sha512-Y8KTSIglk9OZEr8zywiIHG/kmQ7KWyjseXs1CbSo8vC42w7hg2HgYTxSWwP0+is7bWDc1H+Fo026CpHFwm8tkw== + dependencies: + call-bind "^1.0.2" + get-intrinsic "^1.2.1" + is-typed-array "^1.1.10" + +typed-array-byte-length@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/typed-array-byte-length/-/typed-array-byte-length-1.0.0.tgz#d787a24a995711611fb2b87a4052799517b230d0" + integrity sha512-Or/+kvLxNpeQ9DtSydonMxCx+9ZXOswtwJn17SNLvhptaXYDJvkFFP5zbfU/uLmvnBJlI4yrnXRxpdWH/M5tNA== + dependencies: + call-bind "^1.0.2" + for-each "^0.3.3" + has-proto "^1.0.1" + is-typed-array "^1.1.10" + +typed-array-byte-offset@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/typed-array-byte-offset/-/typed-array-byte-offset-1.0.0.tgz#cbbe89b51fdef9cd6aaf07ad4707340abbc4ea0b" + integrity sha512-RD97prjEt9EL8YgAgpOkf3O4IF9lhJFr9g0htQkm0rchFp/Vx7LW5Q8fSXXub7BXAODyUQohRMyOc3faCPd0hg== + dependencies: + available-typed-arrays "^1.0.5" + call-bind "^1.0.2" + for-each "^0.3.3" + has-proto "^1.0.1" + is-typed-array "^1.1.10" + +typed-array-length@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/typed-array-length/-/typed-array-length-1.0.4.tgz#89d83785e5c4098bec72e08b319651f0eac9c1bb" + integrity sha512-KjZypGq+I/H7HI5HlOoGHkWUUGq+Q0TPhQurLbyrVrvnKTBgzLhIJ7j6J/XTQOi0d1RjyZ0wdas8bKs2p0x3Ng== + dependencies: + call-bind "^1.0.2" + for-each "^0.3.3" + is-typed-array "^1.1.9" + typedarray-to-buffer@^3.1.5: version "3.1.5" resolved "https://registry.yarnpkg.com/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz#a97ee7a9ff42691b9f783ff1bc5112fe3fca9080" @@ -10627,34 +10070,34 @@ typedarray-to-buffer@^3.1.5: typedarray@^0.0.6: version "0.0.6" resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777" - integrity sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c= + integrity sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA== typescript@^4.5.4: - version "4.6.3" - resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.6.3.tgz#eefeafa6afdd31d725584c67a0eaba80f6fc6c6c" - integrity sha512-yNIatDa5iaofVozS/uQJEl3JRWLKKGJKh6Yaiv0GLGSuhpFJe7P3SbHZ8/yjAHRQwKRoA6YZqlfjXWmVzoVSMw== + version "4.9.5" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.9.5.tgz#095979f9bcc0d09da324d58d03ce8f8374cbe65a" + integrity sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g== typewise-core@^1.2, typewise-core@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/typewise-core/-/typewise-core-1.2.0.tgz#97eb91805c7f55d2f941748fa50d315d991ef195" - integrity sha1-l+uRgFx/VdL5QXSPpQ0xXZke8ZU= + integrity sha512-2SCC/WLzj2SbUwzFOzqMCkz5amXLlxtJqDKTICqg30x+2DZxcfZN2MvQZmGfXWKNWaKK9pBPsvkcwv8bF/gxKg== typewise@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/typewise/-/typewise-1.0.3.tgz#1067936540af97937cc5dcf9922486e9fa284651" - integrity sha1-EGeTZUCvl5N8xdz5kiSG6fooRlE= + integrity sha512-aXofE06xGhaQSPzt8hlTY+/YWQhm9P0jYUp1f2XtmW/3Bk0qzXcyFWAtPoo2uTGQj1ZwbDuSyuxicq+aDo8lCQ== dependencies: typewise-core "^1.2.0" typewiselite@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/typewiselite/-/typewiselite-1.0.0.tgz#c8882fa1bb1092c06005a97f34ef5c8508e3664e" - integrity sha1-yIgvobsQksBgBal/NO9chQjjZk4= + integrity sha512-J9alhjVHupW3Wfz6qFRGgQw0N3gr8hOkw6zm7FZ6UR1Cse/oD9/JVok7DNE9TT9IbciDHX2Ex9+ksE6cRmtymw== typical@^2.6.0, typical@^2.6.1: version "2.6.1" resolved "https://registry.yarnpkg.com/typical/-/typical-2.6.1.tgz#5c080e5d661cbbe38259d2e70a3c7253e873881d" - integrity sha1-XAgOXWYcu+OCWdLnCjxyU+hziB0= + integrity sha512-ofhi8kjIje6npGozTip9Fr8iecmYfEbS06i0JnIg+rh51KakryWF4+jX8lLKZVhy6N+ID45WYSFCxPOdTWCzNg== typical@^4.0.0: version "4.0.0" @@ -10667,23 +10110,23 @@ typical@^5.2.0: integrity sha512-dvdQgNDNJo+8B2uBQoqdb11eUCE1JQXhvjC/CZtgvZseVd5TYMXnq0+vuUemXbd/Se29cTaUuPX3YIc2xgbvIg== uglify-js@^3.1.4: - version "3.14.5" - resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-3.14.5.tgz#cdabb7d4954231d80cb4a927654c4655e51f4859" - integrity sha512-qZukoSxOG0urUTvjc2ERMTcAy+BiFh3weWAkeurLwjrCba73poHmG3E36XEjd/JGukMzwTL7uCxZiAexj8ppvQ== + version "3.17.4" + resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-3.17.4.tgz#61678cf5fa3f5b7eb789bb345df29afb8257c22c" + integrity sha512-T9q82TJI9e/C1TAxYvfb16xO120tMVFZrGA3f9/P4424DNu6ypK103y0GPFVa17yotwSyZW5iYXgjYHkGrJW/g== ultron@~1.1.0: version "1.1.1" resolved "https://registry.yarnpkg.com/ultron/-/ultron-1.1.1.tgz#9fe1536a10a664a65266a1e3ccf85fd36302bc9c" integrity sha512-UIEXBNeYmKptWH6z8ZnqTeS8fV74zG0/eRU9VGkpzz+LIJNs8W/zM/L+7ctCkRrgbNnnR0xxw4bKOr0cW0N0Og== -unbox-primitive@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/unbox-primitive/-/unbox-primitive-1.0.1.tgz#085e215625ec3162574dc8859abee78a59b14471" - integrity sha512-tZU/3NqK3dA5gpE1KtyiJUrEB0lxnGkMFHptJ7q6ewdZ8s12QrODwNbhIJStmJkd1QDXa1NRA8aF2A1zk/Ypyw== +unbox-primitive@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/unbox-primitive/-/unbox-primitive-1.0.2.tgz#29032021057d5e6cdbd08c5129c226dff8ed6f9e" + integrity sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw== dependencies: - function-bind "^1.1.1" - has-bigints "^1.0.1" - has-symbols "^1.0.2" + call-bind "^1.0.2" + has-bigints "^1.0.2" + has-symbols "^1.0.3" which-boxed-primitive "^1.0.2" unbzip2-stream@1.4.3: @@ -10699,15 +10142,12 @@ underscore@1.9.1: resolved "https://registry.yarnpkg.com/underscore/-/underscore-1.9.1.tgz#06dce34a0e68a7babc29b365b8e74b8925203961" integrity sha512-5/4etnCkd9c8gwgowi5/om/mYO5ajCaOgdzj/oW+0eQV9WxKBDZw5+ycmKmeaTXjInS/W0BzpGLo2xR2aBwZdg== -undici@^4.14.1: - version "4.16.0" - resolved "https://registry.yarnpkg.com/undici/-/undici-4.16.0.tgz#469bb87b3b918818d3d7843d91a1d08da357d5ff" - integrity sha512-tkZSECUYi+/T1i4u+4+lwZmQgLXd4BLGlrc7KZPcLIW7Jpq99+Xpc30ONv7nS6F5UNOxp/HBZSSL9MafUrvJbw== - -undici@^5.4.0: - version "5.10.0" - resolved "https://registry.yarnpkg.com/undici/-/undici-5.10.0.tgz#dd9391087a90ccfbd007568db458674232ebf014" - integrity sha512-c8HsD3IbwmjjbLvoZuRI26TZic+TSEe8FPMLLOkN1AfYRhdjnKBU6yL+IwcSCbdZiX4e5t0lfMDLDCqj4Sq70g== +undici@^5.14.0: + version "5.24.0" + resolved "https://registry.yarnpkg.com/undici/-/undici-5.24.0.tgz#6133630372894cfeb3c3dab13b4c23866bd344b5" + integrity sha512-OKlckxBjFl0oXxcj9FU6oB8fDAaiRUq+D8jrFWGmOfI/gIyjk/IeS75LMzgYKUaeHzLUcYvf9bbJGSrUwTfwwQ== + dependencies: + busboy "^1.6.0" union-value@^1.0.0: version "1.0.1" @@ -10737,12 +10177,12 @@ unorm@^1.3.3: unpipe@1.0.0, unpipe@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec" - integrity sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw= + integrity sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ== unset-value@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/unset-value/-/unset-value-1.0.0.tgz#8376873f7d2335179ffb1e6fc3a8ed0dfc8ab559" - integrity sha1-g3aHP30jNRef+x5vw6jtDfyKtVk= + integrity sha512-PcA2tsuGSF9cnySLHTLSh2qrQiJ70mn+r+Glzxv2TWZblxsxCC52BDlZoPCsz7STd9pN7EZetkWZBAvk4cgZdQ== dependencies: has-value "^0.3.1" isobject "^3.0.0" @@ -10757,39 +10197,27 @@ uri-js@^4.2.2: urix@^0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/urix/-/urix-0.1.0.tgz#da937f7a62e21fec1fd18d49b35c2935067a6c72" - integrity sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI= - -url-parse-lax@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/url-parse-lax/-/url-parse-lax-1.0.0.tgz#7af8f303645e9bd79a272e7a14ac68bc0609da73" - integrity sha1-evjzA2Rem9eaJy56FKxovAYJ2nM= - dependencies: - prepend-http "^1.0.1" + integrity sha512-Am1ousAhSLBeB9cG/7k7r2R0zj50uDRlZHPGbazid5s9rlF1F/QKYObEKSIunSjIOkJZqwRRLpvewjEkM7pSqg== url-parse-lax@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/url-parse-lax/-/url-parse-lax-3.0.0.tgz#16b5cafc07dbe3676c1b1999177823d6503acb0c" - integrity sha1-FrXK/Afb42dsGxmZF3gj1lA6yww= + integrity sha512-NjFKA0DidqPa5ciFcSrXnAltTtzz84ogy+NebPvfEgAck0+TNg4UJ4IN+fB7zRZfbgUf0syOo9MDxFkDSMuFaQ== dependencies: prepend-http "^2.0.0" url-set-query@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/url-set-query/-/url-set-query-1.0.0.tgz#016e8cfd7c20ee05cafe7795e892bd0702faa339" - integrity sha1-AW6M/Xwg7gXK/neV6JK9BwL6ozk= - -url-to-options@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/url-to-options/-/url-to-options-1.0.1.tgz#1505a03a289a48cbd7a434efbaeec5055f5633a9" - integrity sha1-FQWgOiiaSMvXpDTvuu7FBV9WM6k= + integrity sha512-3AChu4NiXquPfeckE5R5cGdiHCMWJx1dwCWOmWIL4KHAziJNOFIYJlpGFeKDvwLPHovZRCxK3cYlwzqI9Vp+Gg== url@^0.11.0: - version "0.11.0" - resolved "https://registry.yarnpkg.com/url/-/url-0.11.0.tgz#3838e97cfc60521eb73c525a8e55bfdd9e2e28f1" - integrity sha1-ODjpfPxgUh63PFJajlW/3Z4uKPE= + version "0.11.2" + resolved "https://registry.yarnpkg.com/url/-/url-0.11.2.tgz#02f250a6e0d992b781828cd456d44f49bf2e19dd" + integrity sha512-7yIgNnrST44S7PJ5+jXbdIupfU1nWUdQJBFBeJRclPXiWgCvrSq5Frw8lr/i//n5sqDfzoKmBymMS81l4U/7cg== dependencies: - punycode "1.3.2" - querystring "0.2.0" + punycode "^1.4.1" + qs "^6.11.2" use@^3.1.0: version "3.1.1" @@ -10797,9 +10225,9 @@ use@^3.1.0: integrity sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ== utf-8-validate@^5.0.2: - version "5.0.9" - resolved "https://registry.yarnpkg.com/utf-8-validate/-/utf-8-validate-5.0.9.tgz#ba16a822fbeedff1a58918f2a6a6b36387493ea3" - integrity sha512-Yek7dAy0v3Kl0orwMlvi7TPtiCNrdfHNd7Gcc/pLq4BLXqfAmd0J7OWMizUQnTTJsyjKn02mU7anqwfmUP4J8Q== + version "5.0.10" + resolved "https://registry.yarnpkg.com/utf-8-validate/-/utf-8-validate-5.0.10.tgz#d7d10ea39318171ca982718b6b96a8d2442571a2" + integrity sha512-Z6czzLq4u8fPOyx7TU6X3dvUZVvoJmxSQ+IcrlmagKhilxlhZgxPK6C5Jqbkw1IDUmFTM+cz9QDnnLTwDz/2gQ== dependencies: node-gyp-build "^4.3.0" @@ -10811,40 +10239,41 @@ utf8@3.0.0, utf8@^3.0.0: util-deprecate@^1.0.1, util-deprecate@~1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" - integrity sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8= + integrity sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw== util.promisify@^1.0.0: - version "1.1.1" - resolved "https://registry.yarnpkg.com/util.promisify/-/util.promisify-1.1.1.tgz#77832f57ced2c9478174149cae9b96e9918cd54b" - integrity sha512-/s3UsZUrIfa6xDhr7zZhnE9SLQ5RIXyYfiVnMMyMDzOc8WhWN4Nbh36H842OyurKbCDAesZOJaVyvmSl6fhGQw== + version "1.1.2" + resolved "https://registry.yarnpkg.com/util.promisify/-/util.promisify-1.1.2.tgz#02b3dbadbb80071eee4c43aed58747afdfc516db" + integrity sha512-PBdZ03m1kBnQ5cjjO0ZvJMJS+QsbyIcFwi4hY4U76OQsCO9JrOYjbCFgIF76ccFg9xnJo7ZHPkqyj1GqmdS7MA== dependencies: - call-bind "^1.0.0" - define-properties "^1.1.3" + call-bind "^1.0.2" + define-properties "^1.2.0" for-each "^0.3.3" - has-symbols "^1.0.1" - object.getownpropertydescriptors "^2.1.1" + has-proto "^1.0.1" + has-symbols "^1.0.3" + object.getownpropertydescriptors "^2.1.6" + safe-array-concat "^1.0.0" -util@^0.12.0: - version "0.12.4" - resolved "https://registry.yarnpkg.com/util/-/util-0.12.4.tgz#66121a31420df8f01ca0c464be15dfa1d1850253" - integrity sha512-bxZ9qtSlGUWSOy9Qa9Xgk11kSslpuZwaxCg4sNIDj6FLucDab2JxnHwyNTCpHMtK1MjoQiWQ6DiUMZYbSrO+Sw== +util@^0.12.0, util@^0.12.5: + version "0.12.5" + resolved "https://registry.yarnpkg.com/util/-/util-0.12.5.tgz#5f17a6059b73db61a875668781a1c2b136bd6fbc" + integrity sha512-kZf/K6hEIrWHI6XqOFUiiMa+79wE/D8Q+NCNAWclkyg3b4d2k7s0QGepNjiABc+aR3N1PAyHL7p6UcLY6LmrnA== dependencies: inherits "^2.0.3" is-arguments "^1.0.4" is-generator-function "^1.0.7" is-typed-array "^1.1.3" - safe-buffer "^5.1.2" which-typed-array "^1.1.2" utils-merge@1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/utils-merge/-/utils-merge-1.0.1.tgz#9f95710f50a267947b2ccc124741c1028427e713" - integrity sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM= + integrity sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA== uuid@2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/uuid/-/uuid-2.0.1.tgz#c2a30dedb3e535d72ccf82e343941a50ba8533ac" - integrity sha1-wqMN7bPlNdcsz4LjQ5QaULqFM6w= + integrity sha512-nWg9+Oa3qD2CQzHIP4qKUqwNfzKn8P0LtFhotaCTFchsV7ZfDhAybeip/HZVeMIpZi9JgY1E3nUlwaCmZT1sEg== uuid@3.3.2: version "3.3.2" @@ -10861,10 +10290,15 @@ uuid@^8.3.2: resolved "https://registry.yarnpkg.com/uuid/-/uuid-8.3.2.tgz#80d5b5ced271bb9af6c445f21a1a04c606cefbe2" integrity sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg== -v8-compile-cache-lib@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.0.tgz#0582bcb1c74f3a2ee46487ceecf372e46bce53e8" - integrity sha512-mpSYqfsFvASnSn5qMiwrr4VKfumbPyONLCOPmsR3A6pTY/r0+tSaVbgPWSAIuzbk3lCTa+FForeTiO+wBQGkjA== +uuid@^9.0.0: + version "9.0.1" + resolved "https://registry.yarnpkg.com/uuid/-/uuid-9.0.1.tgz#e188d4c8853cc722220392c424cd637f32293f30" + integrity sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA== + +v8-compile-cache-lib@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz#6336e8d71965cb3d35a1bbb7868445a7c05264bf" + integrity sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg== validate-npm-package-license@^3.0.1: version "3.0.4" @@ -10882,17 +10316,26 @@ varint@^5.0.0: vary@^1, vary@~1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/vary/-/vary-1.1.2.tgz#2299f02c6ded30d4a5961b0b9f74524a18f634fc" - integrity sha1-IpnwLG3tMNSllhsLn3RSShj2NPw= + integrity sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg== verror@1.10.0: version "1.10.0" resolved "https://registry.yarnpkg.com/verror/-/verror-1.10.0.tgz#3a105ca17053af55d6e270c1f8288682e18da400" - integrity sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA= + integrity sha512-ZZKSmDAEFOijERBLkmYfJ+vmk3w+7hOLYDNkRCuRuMJGEmqYNCNLyBBFwWKVMhfwaEF3WOd0Zlw86U/WC/+nYw== dependencies: assert-plus "^1.0.0" core-util-is "1.0.2" extsprintf "^1.2.0" +web3-bzz@1.10.0: + version "1.10.0" + resolved "https://registry.yarnpkg.com/web3-bzz/-/web3-bzz-1.10.0.tgz#ac74bc71cdf294c7080a79091079192f05c5baed" + integrity sha512-o9IR59io3pDUsXTsps5pO5hW1D5zBmg46iNc2t4j2DkaYHNdDLwk2IP9ukoM2wg47QILfPEJYzhTfkS/CcX0KA== + dependencies: + "@types/node" "^12.12.6" + got "12.1.0" + swarm-js "^0.1.40" + web3-bzz@1.2.11: version "1.2.11" resolved "https://registry.yarnpkg.com/web3-bzz/-/web3-bzz-1.2.11.tgz#41bc19a77444bd5365744596d778b811880f707f" @@ -10903,15 +10346,23 @@ web3-bzz@1.2.11: swarm-js "^0.1.40" underscore "1.9.1" -web3-bzz@1.5.3: - version "1.5.3" - resolved "https://registry.yarnpkg.com/web3-bzz/-/web3-bzz-1.5.3.tgz#e36456905ce051138f9c3ce3623cbc73da088c2b" - integrity sha512-SlIkAqG0eS6cBS9Q2eBOTI1XFzqh83RqGJWnyrNZMDxUwsTVHL+zNnaPShVPvrWQA1Ub5b0bx1Kc5+qJVxsTJg== +web3-bzz@1.7.4: + version "1.7.4" + resolved "https://registry.yarnpkg.com/web3-bzz/-/web3-bzz-1.7.4.tgz#9419e606e38a9777443d4ce40506ebd796e06075" + integrity sha512-w9zRhyEqTK/yi0LGRHjZMcPCfP24LBjYXI/9YxFw9VqsIZ9/G0CRCnUt12lUx0A56LRAMpF7iQ8eA73aBcO29Q== dependencies: "@types/node" "^12.12.6" got "9.6.0" swarm-js "^0.1.40" +web3-core-helpers@1.10.0: + version "1.10.0" + resolved "https://registry.yarnpkg.com/web3-core-helpers/-/web3-core-helpers-1.10.0.tgz#1016534c51a5df77ed4f94d1fcce31de4af37fad" + integrity sha512-pIxAzFDS5vnbXvfvLSpaA1tfRykAe9adw43YCKsEYQwH0gCLL0kMLkaCX3q+Q8EVmAh+e1jWL/nl9U0de1+++g== + dependencies: + web3-eth-iban "1.10.0" + web3-utils "1.10.0" + web3-core-helpers@1.2.11: version "1.2.11" resolved "https://registry.yarnpkg.com/web3-core-helpers/-/web3-core-helpers-1.2.11.tgz#84c681ed0b942c0203f3b324a245a127e8c67a99" @@ -10921,13 +10372,24 @@ web3-core-helpers@1.2.11: web3-eth-iban "1.2.11" web3-utils "1.2.11" -web3-core-helpers@1.5.3: - version "1.5.3" - resolved "https://registry.yarnpkg.com/web3-core-helpers/-/web3-core-helpers-1.5.3.tgz#099030235c477aadf39a94199ef40092151d563c" - integrity sha512-Ip1IjB3S8vN7Kf1PPjK41U5gskmMk6IJQlxIVuS8/1U7n/o0jC8krqtpRwiMfAgYyw3TXwBFtxSRTvJtnLyXZw== +web3-core-helpers@1.7.4: + version "1.7.4" + resolved "https://registry.yarnpkg.com/web3-core-helpers/-/web3-core-helpers-1.7.4.tgz#f8f808928560d3e64e0c8d7bdd163aa4766bcf40" + integrity sha512-F8PH11qIkE/LpK4/h1fF/lGYgt4B6doeMi8rukeV/s4ivseZHHslv1L6aaijLX/g/j4PsFmR42byynBI/MIzFg== + dependencies: + web3-eth-iban "1.7.4" + web3-utils "1.7.4" + +web3-core-method@1.10.0: + version "1.10.0" + resolved "https://registry.yarnpkg.com/web3-core-method/-/web3-core-method-1.10.0.tgz#82668197fa086e8cc8066742e35a9d72535e3412" + integrity sha512-4R700jTLAMKDMhQ+nsVfIXvH6IGJlJzGisIfMKWAIswH31h5AZz7uDUW2YctI+HrYd+5uOAlS4OJeeT9bIpvkA== dependencies: - web3-eth-iban "1.5.3" - web3-utils "1.5.3" + "@ethersproject/transactions" "^5.6.2" + web3-core-helpers "1.10.0" + web3-core-promievent "1.10.0" + web3-core-subscriptions "1.10.0" + web3-utils "1.10.0" web3-core-method@1.2.11: version "1.2.11" @@ -10941,17 +10403,23 @@ web3-core-method@1.2.11: web3-core-subscriptions "1.2.11" web3-utils "1.2.11" -web3-core-method@1.5.3: - version "1.5.3" - resolved "https://registry.yarnpkg.com/web3-core-method/-/web3-core-method-1.5.3.tgz#6cff97ed19fe4ea2e9183d6f703823a079f5132c" - integrity sha512-8wJrwQ2qD9ibWieF9oHXwrJsUGrv3XAtEkNeyvyNMpktNTIjxJ2jaFGQUuLiyUrMubD18XXgLk4JS6PJU4Loeg== +web3-core-method@1.7.4: + version "1.7.4" + resolved "https://registry.yarnpkg.com/web3-core-method/-/web3-core-method-1.7.4.tgz#3873c6405e1a0a8a1efc1d7b28de8b7550b00c15" + integrity sha512-56K7pq+8lZRkxJyzf5MHQPI9/VL3IJLoy4L/+q8HRdZJ3CkB1DkXYaXGU2PeylG1GosGiSzgIfu1ljqS7CP9xQ== dependencies: - "@ethereumjs/common" "^2.4.0" - "@ethersproject/transactions" "^5.0.0-beta.135" - web3-core-helpers "1.5.3" - web3-core-promievent "1.5.3" - web3-core-subscriptions "1.5.3" - web3-utils "1.5.3" + "@ethersproject/transactions" "^5.6.2" + web3-core-helpers "1.7.4" + web3-core-promievent "1.7.4" + web3-core-subscriptions "1.7.4" + web3-utils "1.7.4" + +web3-core-promievent@1.10.0: + version "1.10.0" + resolved "https://registry.yarnpkg.com/web3-core-promievent/-/web3-core-promievent-1.10.0.tgz#cbb5b3a76b888df45ed3a8d4d8d4f54ccb66a37b" + integrity sha512-68N7k5LWL5R38xRaKFrTFT2pm2jBNFaM4GioS00YjAKXRQ3KjmhijOMG3TICz6Aa5+6GDWYelDNx21YAeZ4YTg== + dependencies: + eventemitter3 "4.0.4" web3-core-promievent@1.2.11: version "1.2.11" @@ -10960,13 +10428,24 @@ web3-core-promievent@1.2.11: dependencies: eventemitter3 "4.0.4" -web3-core-promievent@1.5.3: - version "1.5.3" - resolved "https://registry.yarnpkg.com/web3-core-promievent/-/web3-core-promievent-1.5.3.tgz#3f11833c3dc6495577c274350b61144e0a4dba01" - integrity sha512-CFfgqvk3Vk6PIAxtLLuX+pOMozxkKCY+/GdGr7weMh033mDXEPvwyVjoSRO1PqIKj668/hMGQsVoIgbyxkJ9Mg== +web3-core-promievent@1.7.4: + version "1.7.4" + resolved "https://registry.yarnpkg.com/web3-core-promievent/-/web3-core-promievent-1.7.4.tgz#80a75633fdfe21fbaae2f1e38950edb2f134868c" + integrity sha512-o4uxwXKDldN7ER7VUvDfWsqTx9nQSP1aDssi1XYXeYC2xJbVo0n+z6ryKtmcoWoRdRj7uSpVzal3nEmlr480mA== dependencies: eventemitter3 "4.0.4" +web3-core-requestmanager@1.10.0: + version "1.10.0" + resolved "https://registry.yarnpkg.com/web3-core-requestmanager/-/web3-core-requestmanager-1.10.0.tgz#4b34f6e05837e67c70ff6f6993652afc0d54c340" + integrity sha512-3z/JKE++Os62APml4dvBM+GAuId4h3L9ckUrj7ebEtS2AR0ixyQPbrBodgL91Sv7j7cQ3Y+hllaluqjguxvSaQ== + dependencies: + util "^0.12.5" + web3-core-helpers "1.10.0" + web3-providers-http "1.10.0" + web3-providers-ipc "1.10.0" + web3-providers-ws "1.10.0" + web3-core-requestmanager@1.2.11: version "1.2.11" resolved "https://registry.yarnpkg.com/web3-core-requestmanager/-/web3-core-requestmanager-1.2.11.tgz#fe6eb603fbaee18530293a91f8cf26d8ae28c45a" @@ -10978,16 +10457,24 @@ web3-core-requestmanager@1.2.11: web3-providers-ipc "1.2.11" web3-providers-ws "1.2.11" -web3-core-requestmanager@1.5.3: - version "1.5.3" - resolved "https://registry.yarnpkg.com/web3-core-requestmanager/-/web3-core-requestmanager-1.5.3.tgz#b339525815fd40e3a2a81813c864ddc413f7b6f7" - integrity sha512-9k/Bze2rs8ONix5IZR+hYdMNQv+ark2Ek2kVcrFgWO+LdLgZui/rn8FikPunjE+ub7x7pJaKCgVRbYFXjo3ZWg== +web3-core-requestmanager@1.7.4: + version "1.7.4" + resolved "https://registry.yarnpkg.com/web3-core-requestmanager/-/web3-core-requestmanager-1.7.4.tgz#2dc8a526dab8183dca3fef54658621801b1d0469" + integrity sha512-IuXdAm65BQtPL4aI6LZJJOrKAs0SM5IK2Cqo2/lMNvVMT9Kssq6qOk68Uf7EBDH0rPuINi+ReLP+uH+0g3AnPA== dependencies: util "^0.12.0" - web3-core-helpers "1.5.3" - web3-providers-http "1.5.3" - web3-providers-ipc "1.5.3" - web3-providers-ws "1.5.3" + web3-core-helpers "1.7.4" + web3-providers-http "1.7.4" + web3-providers-ipc "1.7.4" + web3-providers-ws "1.7.4" + +web3-core-subscriptions@1.10.0: + version "1.10.0" + resolved "https://registry.yarnpkg.com/web3-core-subscriptions/-/web3-core-subscriptions-1.10.0.tgz#b534592ee1611788fc0cb0b95963b9b9b6eacb7c" + integrity sha512-HGm1PbDqsxejI075gxBc5OSkwymilRWZufIy9zEpnWKNmfbuv5FfHgW1/chtJP6aP3Uq2vHkvTDl3smQBb8l+g== + dependencies: + eventemitter3 "4.0.4" + web3-core-helpers "1.10.0" web3-core-subscriptions@1.2.11: version "1.2.11" @@ -10998,13 +10485,26 @@ web3-core-subscriptions@1.2.11: underscore "1.9.1" web3-core-helpers "1.2.11" -web3-core-subscriptions@1.5.3: - version "1.5.3" - resolved "https://registry.yarnpkg.com/web3-core-subscriptions/-/web3-core-subscriptions-1.5.3.tgz#d7d69c4caad65074212028656e9dc56ca5c2159d" - integrity sha512-L2m9vG1iRN6thvmv/HQwO2YLhOQlmZU8dpLG6GSo9FBN14Uch868Swk0dYVr3rFSYjZ/GETevSXU+O+vhCummA== +web3-core-subscriptions@1.7.4: + version "1.7.4" + resolved "https://registry.yarnpkg.com/web3-core-subscriptions/-/web3-core-subscriptions-1.7.4.tgz#cfbd3fa71081a8c8c6f1a64577a1a80c5bd9826f" + integrity sha512-VJvKWaXRyxk2nFWumOR94ut9xvjzMrRtS38c4qj8WBIRSsugrZr5lqUwgndtj0qx4F+50JhnU++QEqUEAtKm3g== dependencies: eventemitter3 "4.0.4" - web3-core-helpers "1.5.3" + web3-core-helpers "1.7.4" + +web3-core@1.10.0: + version "1.10.0" + resolved "https://registry.yarnpkg.com/web3-core/-/web3-core-1.10.0.tgz#9aa07c5deb478cf356c5d3b5b35afafa5fa8e633" + integrity sha512-fWySwqy2hn3TL89w5TM8wXF1Z2Q6frQTKHWmP0ppRQorEK8NcHJRfeMiv/mQlSKoTS1F6n/nv2uyZsixFycjYQ== + dependencies: + "@types/bn.js" "^5.1.1" + "@types/node" "^12.12.6" + bignumber.js "^9.0.0" + web3-core-helpers "1.10.0" + web3-core-method "1.10.0" + web3-core-requestmanager "1.10.0" + web3-utils "1.10.0" web3-core@1.2.11: version "1.2.11" @@ -11019,18 +10519,26 @@ web3-core@1.2.11: web3-core-requestmanager "1.2.11" web3-utils "1.2.11" -web3-core@1.5.3: - version "1.5.3" - resolved "https://registry.yarnpkg.com/web3-core/-/web3-core-1.5.3.tgz#59f8728b27c8305b349051326aa262b9b7e907bf" - integrity sha512-ACTbu8COCu+0eUNmd9pG7Q9EVsNkAg2w3Y7SqhDr+zjTgbSHZV01jXKlapm9z+G3AN/BziV3zGwudClJ4u4xXQ== +web3-core@1.7.4: + version "1.7.4" + resolved "https://registry.yarnpkg.com/web3-core/-/web3-core-1.7.4.tgz#943fff99134baedafa7c65b4a0bbd424748429ff" + integrity sha512-L0DCPlIh9bgIED37tYbe7bsWrddoXYc897ANGvTJ6MFkSNGiMwDkTLWSgYd9Mf8qu8b4iuPqXZHMwIo4atoh7Q== dependencies: - "@types/bn.js" "^4.11.5" + "@types/bn.js" "^5.1.0" "@types/node" "^12.12.6" bignumber.js "^9.0.0" - web3-core-helpers "1.5.3" - web3-core-method "1.5.3" - web3-core-requestmanager "1.5.3" - web3-utils "1.5.3" + web3-core-helpers "1.7.4" + web3-core-method "1.7.4" + web3-core-requestmanager "1.7.4" + web3-utils "1.7.4" + +web3-eth-abi@1.10.0: + version "1.10.0" + resolved "https://registry.yarnpkg.com/web3-eth-abi/-/web3-eth-abi-1.10.0.tgz#53a7a2c95a571e205e27fd9e664df4919483cce1" + integrity sha512-cwS+qRBWpJ43aI9L3JS88QYPfFcSJJ3XapxOQ4j40v6mk7ATpA8CVK1vGTzpihNlOfMVRBkR95oAj7oL6aiDOg== + dependencies: + "@ethersproject/abi" "^5.6.3" + web3-utils "1.10.0" web3-eth-abi@1.2.11: version "1.2.11" @@ -11041,13 +10549,29 @@ web3-eth-abi@1.2.11: underscore "1.9.1" web3-utils "1.2.11" -web3-eth-abi@1.5.3: - version "1.5.3" - resolved "https://registry.yarnpkg.com/web3-eth-abi/-/web3-eth-abi-1.5.3.tgz#5aea9394d797f99ca0d9bd40c3417eb07241c96c" - integrity sha512-i/qhuFsoNrnV130CSRYX/z4SlCfSQ4mHntti5yTmmQpt70xZKYZ57BsU0R29ueSQ9/P+aQrL2t2rqkQkAloUxg== +web3-eth-abi@1.7.4: + version "1.7.4" + resolved "https://registry.yarnpkg.com/web3-eth-abi/-/web3-eth-abi-1.7.4.tgz#3fee967bafd67f06b99ceaddc47ab0970f2a614a" + integrity sha512-eMZr8zgTbqyL9MCTCAvb67RbVyN5ZX7DvA0jbLOqRWCiw+KlJKTGnymKO6jPE8n5yjk4w01e165Qb11hTDwHgg== + dependencies: + "@ethersproject/abi" "^5.6.3" + web3-utils "1.7.4" + +web3-eth-accounts@1.10.0: + version "1.10.0" + resolved "https://registry.yarnpkg.com/web3-eth-accounts/-/web3-eth-accounts-1.10.0.tgz#2942beca0a4291455f32cf09de10457a19a48117" + integrity sha512-wiq39Uc3mOI8rw24wE2n15hboLE0E9BsQLdlmsL4Zua9diDS6B5abXG0XhFcoNsXIGMWXVZz4TOq3u4EdpXF/Q== dependencies: - "@ethersproject/abi" "5.0.7" - web3-utils "1.5.3" + "@ethereumjs/common" "2.5.0" + "@ethereumjs/tx" "3.3.2" + eth-lib "0.2.8" + ethereumjs-util "^7.1.5" + scrypt-js "^3.0.1" + uuid "^9.0.0" + web3-core "1.10.0" + web3-core-helpers "1.10.0" + web3-core-method "1.10.0" + web3-utils "1.10.0" web3-eth-accounts@1.2.11: version "1.2.11" @@ -11066,22 +10590,36 @@ web3-eth-accounts@1.2.11: web3-core-method "1.2.11" web3-utils "1.2.11" -web3-eth-accounts@1.5.3: - version "1.5.3" - resolved "https://registry.yarnpkg.com/web3-eth-accounts/-/web3-eth-accounts-1.5.3.tgz#076c816ff4d68c9dffebdc7fd2bfaddcfc163d77" - integrity sha512-pdGhXgeBaEJENMvRT6W9cmji3Zz/46ugFSvmnLLw79qi5EH7XJhKISNVb41eWCrs4am5GhI67GLx5d2s2a72iw== +web3-eth-accounts@1.7.4: + version "1.7.4" + resolved "https://registry.yarnpkg.com/web3-eth-accounts/-/web3-eth-accounts-1.7.4.tgz#7a24a4dfe947f7e9d1bae678529e591aa146167a" + integrity sha512-Y9vYLRKP7VU7Cgq6wG1jFaG2k3/eIuiTKAG8RAuQnb6Cd9k5BRqTm5uPIiSo0AP/u11jDomZ8j7+WEgkU9+Btw== dependencies: - "@ethereumjs/common" "^2.3.0" - "@ethereumjs/tx" "^3.2.1" + "@ethereumjs/common" "^2.5.0" + "@ethereumjs/tx" "^3.3.2" crypto-browserify "3.12.0" eth-lib "0.2.8" ethereumjs-util "^7.0.10" scrypt-js "^3.0.1" uuid "3.3.2" - web3-core "1.5.3" - web3-core-helpers "1.5.3" - web3-core-method "1.5.3" - web3-utils "1.5.3" + web3-core "1.7.4" + web3-core-helpers "1.7.4" + web3-core-method "1.7.4" + web3-utils "1.7.4" + +web3-eth-contract@1.10.0: + version "1.10.0" + resolved "https://registry.yarnpkg.com/web3-eth-contract/-/web3-eth-contract-1.10.0.tgz#8e68c7654576773ec3c91903f08e49d0242c503a" + integrity sha512-MIC5FOzP/+2evDksQQ/dpcXhSqa/2hFNytdl/x61IeWxhh6vlFeSjq0YVTAyIzdjwnL7nEmZpjfI6y6/Ufhy7w== + dependencies: + "@types/bn.js" "^5.1.1" + web3-core "1.10.0" + web3-core-helpers "1.10.0" + web3-core-method "1.10.0" + web3-core-promievent "1.10.0" + web3-core-subscriptions "1.10.0" + web3-eth-abi "1.10.0" + web3-utils "1.10.0" web3-eth-contract@1.2.11: version "1.2.11" @@ -11098,19 +10636,33 @@ web3-eth-contract@1.2.11: web3-eth-abi "1.2.11" web3-utils "1.2.11" -web3-eth-contract@1.5.3: - version "1.5.3" - resolved "https://registry.yarnpkg.com/web3-eth-contract/-/web3-eth-contract-1.5.3.tgz#12b03a4a16ce583a945f874bea2ff2fb4c5b81ad" - integrity sha512-Gdlt1L6cdHe83k7SdV6xhqCytVtOZkjD0kY/15x441AuuJ4JLubCHuqu69k2Dr3tWifHYVys/vG8QE/W16syGg== +web3-eth-contract@1.7.4: + version "1.7.4" + resolved "https://registry.yarnpkg.com/web3-eth-contract/-/web3-eth-contract-1.7.4.tgz#e5761cfb43d453f57be4777b2e5e7e1082078ff7" + integrity sha512-ZgSZMDVI1pE9uMQpK0T0HDT2oewHcfTCv0osEqf5qyn5KrcQDg1GT96/+S0dfqZ4HKj4lzS5O0rFyQiLPQ8LzQ== dependencies: - "@types/bn.js" "^4.11.5" - web3-core "1.5.3" - web3-core-helpers "1.5.3" - web3-core-method "1.5.3" - web3-core-promievent "1.5.3" - web3-core-subscriptions "1.5.3" - web3-eth-abi "1.5.3" - web3-utils "1.5.3" + "@types/bn.js" "^5.1.0" + web3-core "1.7.4" + web3-core-helpers "1.7.4" + web3-core-method "1.7.4" + web3-core-promievent "1.7.4" + web3-core-subscriptions "1.7.4" + web3-eth-abi "1.7.4" + web3-utils "1.7.4" + +web3-eth-ens@1.10.0: + version "1.10.0" + resolved "https://registry.yarnpkg.com/web3-eth-ens/-/web3-eth-ens-1.10.0.tgz#96a676524e0b580c87913f557a13ed810cf91cd9" + integrity sha512-3hpGgzX3qjgxNAmqdrC2YUQMTfnZbs4GeLEmy8aCWziVwogbuqQZ+Gzdfrym45eOZodk+lmXyLuAdqkNlvkc1g== + dependencies: + content-hash "^2.5.2" + eth-ens-namehash "2.0.8" + web3-core "1.10.0" + web3-core-helpers "1.10.0" + web3-core-promievent "1.10.0" + web3-eth-abi "1.10.0" + web3-eth-contract "1.10.0" + web3-utils "1.10.0" web3-eth-ens@1.2.11: version "1.2.11" @@ -11127,19 +10679,27 @@ web3-eth-ens@1.2.11: web3-eth-contract "1.2.11" web3-utils "1.2.11" -web3-eth-ens@1.5.3: - version "1.5.3" - resolved "https://registry.yarnpkg.com/web3-eth-ens/-/web3-eth-ens-1.5.3.tgz#ef6eee1ddf32b1ff9536fc7c599a74f2656bafe1" - integrity sha512-QmGFFtTGElg0E+3xfCIFhiUF+1imFi9eg/cdsRMUZU4F1+MZCC/ee+IAelYLfNTGsEslCqfAusliKOT9DdGGnw== +web3-eth-ens@1.7.4: + version "1.7.4" + resolved "https://registry.yarnpkg.com/web3-eth-ens/-/web3-eth-ens-1.7.4.tgz#346720305379c0a539e226141a9602f1da7bc0c8" + integrity sha512-Gw5CVU1+bFXP5RVXTCqJOmHn71X2ghNk9VcEH+9PchLr0PrKbHTA3hySpsPco1WJAyK4t8SNQVlNr3+bJ6/WZA== dependencies: content-hash "^2.5.2" eth-ens-namehash "2.0.8" - web3-core "1.5.3" - web3-core-helpers "1.5.3" - web3-core-promievent "1.5.3" - web3-eth-abi "1.5.3" - web3-eth-contract "1.5.3" - web3-utils "1.5.3" + web3-core "1.7.4" + web3-core-helpers "1.7.4" + web3-core-promievent "1.7.4" + web3-eth-abi "1.7.4" + web3-eth-contract "1.7.4" + web3-utils "1.7.4" + +web3-eth-iban@1.10.0: + version "1.10.0" + resolved "https://registry.yarnpkg.com/web3-eth-iban/-/web3-eth-iban-1.10.0.tgz#5a46646401965b0f09a4f58e7248c8a8cd22538a" + integrity sha512-0l+SP3IGhInw7Q20LY3IVafYEuufo4Dn75jAHT7c2aDJsIolvf2Lc6ugHkBajlwUneGfbRQs/ccYPQ9JeMUbrg== + dependencies: + bn.js "^5.2.1" + web3-utils "1.10.0" web3-eth-iban@1.2.11: version "1.2.11" @@ -11149,13 +10709,25 @@ web3-eth-iban@1.2.11: bn.js "^4.11.9" web3-utils "1.2.11" -web3-eth-iban@1.5.3: - version "1.5.3" - resolved "https://registry.yarnpkg.com/web3-eth-iban/-/web3-eth-iban-1.5.3.tgz#91b1475893a877b10eac1de5cce6eb379fb81b5d" - integrity sha512-vMzmGqolYZvRHwP9P4Nf6G8uYM5aTLlQu2a34vz78p0KlDC+eV1th3+90Qeaupa28EG7OO0IT1F0BejiIauOPw== +web3-eth-iban@1.7.4: + version "1.7.4" + resolved "https://registry.yarnpkg.com/web3-eth-iban/-/web3-eth-iban-1.7.4.tgz#711fb2547fdf0f988060027331b2b6c430505753" + integrity sha512-XyrsgWlZQMv5gRcjXMsNvAoCRvV5wN7YCfFV5+tHUCqN8g9T/o4XUS20vDWD0k4HNiAcWGFqT1nrls02MGZ08w== dependencies: - bn.js "^4.11.9" - web3-utils "1.5.3" + bn.js "^5.2.1" + web3-utils "1.7.4" + +web3-eth-personal@1.10.0: + version "1.10.0" + resolved "https://registry.yarnpkg.com/web3-eth-personal/-/web3-eth-personal-1.10.0.tgz#94d525f7a29050a0c2a12032df150ac5ea633071" + integrity sha512-anseKn98w/d703eWq52uNuZi7GhQeVjTC5/svrBWEKob0WZ5kPdo+EZoFN0sp5a5ubbrk/E0xSl1/M5yORMtpg== + dependencies: + "@types/node" "^12.12.6" + web3-core "1.10.0" + web3-core-helpers "1.10.0" + web3-core-method "1.10.0" + web3-net "1.10.0" + web3-utils "1.10.0" web3-eth-personal@1.2.11: version "1.2.11" @@ -11169,17 +10741,35 @@ web3-eth-personal@1.2.11: web3-net "1.2.11" web3-utils "1.2.11" -web3-eth-personal@1.5.3: - version "1.5.3" - resolved "https://registry.yarnpkg.com/web3-eth-personal/-/web3-eth-personal-1.5.3.tgz#4ebe09e9a77dd49d23d93b36b36cfbf4a6dae713" - integrity sha512-JzibJafR7ak/Icas8uvos3BmUNrZw1vShuNR5Cxjo+vteOC8XMqz1Vr7RH65B4bmlfb3bm9xLxetUHO894+Sew== +web3-eth-personal@1.7.4: + version "1.7.4" + resolved "https://registry.yarnpkg.com/web3-eth-personal/-/web3-eth-personal-1.7.4.tgz#22c399794cb828a75703df8bb4b3c1331b471546" + integrity sha512-O10C1Hln5wvLQsDhlhmV58RhXo+GPZ5+W76frSsyIrkJWLtYQTCr5WxHtRC9sMD1idXLqODKKgI2DL+7xeZ0/g== dependencies: "@types/node" "^12.12.6" - web3-core "1.5.3" - web3-core-helpers "1.5.3" - web3-core-method "1.5.3" - web3-net "1.5.3" - web3-utils "1.5.3" + web3-core "1.7.4" + web3-core-helpers "1.7.4" + web3-core-method "1.7.4" + web3-net "1.7.4" + web3-utils "1.7.4" + +web3-eth@1.10.0: + version "1.10.0" + resolved "https://registry.yarnpkg.com/web3-eth/-/web3-eth-1.10.0.tgz#38b905e2759697c9624ab080cfcf4e6c60b3a6cf" + integrity sha512-Z5vT6slNMLPKuwRyKGbqeGYC87OAy8bOblaqRTgg94CXcn/mmqU7iPIlG4506YdcdK3x6cfEDG7B6w+jRxypKA== + dependencies: + web3-core "1.10.0" + web3-core-helpers "1.10.0" + web3-core-method "1.10.0" + web3-core-subscriptions "1.10.0" + web3-eth-abi "1.10.0" + web3-eth-accounts "1.10.0" + web3-eth-contract "1.10.0" + web3-eth-ens "1.10.0" + web3-eth-iban "1.10.0" + web3-eth-personal "1.10.0" + web3-net "1.10.0" + web3-utils "1.10.0" web3-eth@1.2.11: version "1.2.11" @@ -11200,23 +10790,32 @@ web3-eth@1.2.11: web3-net "1.2.11" web3-utils "1.2.11" -web3-eth@1.5.3: - version "1.5.3" - resolved "https://registry.yarnpkg.com/web3-eth/-/web3-eth-1.5.3.tgz#d7d1ac7198f816ab8a2088c01e0bf1eda45862fe" - integrity sha512-saFurA1L23Bd7MEf7cBli6/jRdMhD4X/NaMiO2mdMMCXlPujoudlIJf+VWpRWJpsbDFdu7XJ2WHkmBYT5R3p1Q== - dependencies: - web3-core "1.5.3" - web3-core-helpers "1.5.3" - web3-core-method "1.5.3" - web3-core-subscriptions "1.5.3" - web3-eth-abi "1.5.3" - web3-eth-accounts "1.5.3" - web3-eth-contract "1.5.3" - web3-eth-ens "1.5.3" - web3-eth-iban "1.5.3" - web3-eth-personal "1.5.3" - web3-net "1.5.3" - web3-utils "1.5.3" +web3-eth@1.7.4: + version "1.7.4" + resolved "https://registry.yarnpkg.com/web3-eth/-/web3-eth-1.7.4.tgz#a7c1d3ccdbba4de4a82df7e3c4db716e4a944bf2" + integrity sha512-JG0tTMv0Ijj039emXNHi07jLb0OiWSA9O24MRSk5vToTQyDNXihdF2oyq85LfHuF690lXZaAXrjhtLNlYqb7Ug== + dependencies: + web3-core "1.7.4" + web3-core-helpers "1.7.4" + web3-core-method "1.7.4" + web3-core-subscriptions "1.7.4" + web3-eth-abi "1.7.4" + web3-eth-accounts "1.7.4" + web3-eth-contract "1.7.4" + web3-eth-ens "1.7.4" + web3-eth-iban "1.7.4" + web3-eth-personal "1.7.4" + web3-net "1.7.4" + web3-utils "1.7.4" + +web3-net@1.10.0: + version "1.10.0" + resolved "https://registry.yarnpkg.com/web3-net/-/web3-net-1.10.0.tgz#be53e7f5dafd55e7c9013d49c505448b92c9c97b" + integrity sha512-NLH/N3IshYWASpxk4/18Ge6n60GEvWBVeM8inx2dmZJVmRI6SJIlUxbL8jySgiTn3MMZlhbdvrGo8fpUW7a1GA== + dependencies: + web3-core "1.10.0" + web3-core-method "1.10.0" + web3-utils "1.10.0" web3-net@1.2.11: version "1.2.11" @@ -11227,14 +10826,14 @@ web3-net@1.2.11: web3-core-method "1.2.11" web3-utils "1.2.11" -web3-net@1.5.3: - version "1.5.3" - resolved "https://registry.yarnpkg.com/web3-net/-/web3-net-1.5.3.tgz#545fee49b8e213b0c55cbe74ffd0295766057463" - integrity sha512-0W/xHIPvgVXPSdLu0iZYnpcrgNnhzHMC888uMlGP5+qMCt8VuflUZHy7tYXae9Mzsg1kxaJAS5lHVNyeNw4CoQ== +web3-net@1.7.4: + version "1.7.4" + resolved "https://registry.yarnpkg.com/web3-net/-/web3-net-1.7.4.tgz#3153dfd3423262dd6fbec7aae5467202c4cad431" + integrity sha512-d2Gj+DIARHvwIdmxFQ4PwAAXZVxYCR2lET0cxz4KXbE5Og3DNjJi+MoPkX+WqoUXqimu/EOd4Cd+7gefqVAFDg== dependencies: - web3-core "1.5.3" - web3-core-method "1.5.3" - web3-utils "1.5.3" + web3-core "1.7.4" + web3-core-method "1.7.4" + web3-utils "1.7.4" web3-provider-engine@14.2.1: version "14.2.1" @@ -11262,6 +10861,16 @@ web3-provider-engine@14.2.1: xhr "^2.2.0" xtend "^4.0.1" +web3-providers-http@1.10.0: + version "1.10.0" + resolved "https://registry.yarnpkg.com/web3-providers-http/-/web3-providers-http-1.10.0.tgz#864fa48675e7918c9a4374e5f664b32c09d0151b" + integrity sha512-eNr965YB8a9mLiNrkjAWNAPXgmQWfpBfkkn7tpEFlghfww0u3I0tktMZiaToJVcL2+Xq+81cxbkpeWJ5XQDwOA== + dependencies: + abortcontroller-polyfill "^1.7.3" + cross-fetch "^3.1.4" + es6-promise "^4.2.8" + web3-core-helpers "1.10.0" + web3-providers-http@1.2.11: version "1.2.11" resolved "https://registry.yarnpkg.com/web3-providers-http/-/web3-providers-http-1.2.11.tgz#1cd03442c61670572d40e4dcdf1faff8bd91e7c6" @@ -11270,14 +10879,22 @@ web3-providers-http@1.2.11: web3-core-helpers "1.2.11" xhr2-cookies "1.1.0" -web3-providers-http@1.5.3: - version "1.5.3" - resolved "https://registry.yarnpkg.com/web3-providers-http/-/web3-providers-http-1.5.3.tgz#74f170fc3d79eb7941d9fbc34e2a067d61ced0b2" - integrity sha512-5DpUyWGHtDAr2RYmBu34Fu+4gJuBAuNx2POeiJIooUtJ+Mu6pIx4XkONWH6V+Ez87tZAVAsFOkJRTYuzMr3rPw== +web3-providers-http@1.7.4: + version "1.7.4" + resolved "https://registry.yarnpkg.com/web3-providers-http/-/web3-providers-http-1.7.4.tgz#8209cdcb115db5ccae1f550d1c4e3005e7538d02" + integrity sha512-AU+/S+49rcogUER99TlhW+UBMk0N2DxvN54CJ2pK7alc2TQ7+cprNPLHJu4KREe8ndV0fT6JtWUfOMyTvl+FRA== dependencies: - web3-core-helpers "1.5.3" + web3-core-helpers "1.7.4" xhr2-cookies "1.1.0" +web3-providers-ipc@1.10.0: + version "1.10.0" + resolved "https://registry.yarnpkg.com/web3-providers-ipc/-/web3-providers-ipc-1.10.0.tgz#9747c7a6aee96a51488e32fa7c636c3460b39889" + integrity sha512-OfXG1aWN8L1OUqppshzq8YISkWrYHaATW9H8eh0p89TlWMc1KZOL9vttBuaBEi96D/n0eYDn2trzt22bqHWfXA== + dependencies: + oboe "2.1.5" + web3-core-helpers "1.10.0" + web3-providers-ipc@1.2.11: version "1.2.11" resolved "https://registry.yarnpkg.com/web3-providers-ipc/-/web3-providers-ipc-1.2.11.tgz#d16d6c9be1be6e0b4f4536c4acc16b0f4f27ef21" @@ -11287,13 +10904,22 @@ web3-providers-ipc@1.2.11: underscore "1.9.1" web3-core-helpers "1.2.11" -web3-providers-ipc@1.5.3: - version "1.5.3" - resolved "https://registry.yarnpkg.com/web3-providers-ipc/-/web3-providers-ipc-1.5.3.tgz#4bd7f5e445c2f3c2595fce0929c72bb879320a3f" - integrity sha512-JmeAptugVpmXI39LGxUSAymx0NOFdgpuI1hGQfIhbEAcd4sv7fhfd5D+ZU4oLHbRI8IFr4qfGU0uhR8BXhDzlg== +web3-providers-ipc@1.7.4: + version "1.7.4" + resolved "https://registry.yarnpkg.com/web3-providers-ipc/-/web3-providers-ipc-1.7.4.tgz#02e85e99e48f432c9d34cee7d786c3685ec9fcfa" + integrity sha512-jhArOZ235dZy8fS8090t60nTxbd1ap92ibQw5xIrAQ9m7LcZKNfmLAQUVsD+3dTFvadRMi6z1vCO7zRi84gWHw== dependencies: oboe "2.1.5" - web3-core-helpers "1.5.3" + web3-core-helpers "1.7.4" + +web3-providers-ws@1.10.0: + version "1.10.0" + resolved "https://registry.yarnpkg.com/web3-providers-ws/-/web3-providers-ws-1.10.0.tgz#cb0b87b94c4df965cdf486af3a8cd26daf3975e5" + integrity sha512-sK0fNcglW36yD5xjnjtSGBnEtf59cbw4vZzJ+CmOWIKGIR96mP5l684g0WD0Eo+f4NQc2anWWXG74lRc9OVMCQ== + dependencies: + eventemitter3 "4.0.4" + web3-core-helpers "1.10.0" + websocket "^1.0.32" web3-providers-ws@1.2.11: version "1.2.11" @@ -11305,15 +10931,25 @@ web3-providers-ws@1.2.11: web3-core-helpers "1.2.11" websocket "^1.0.31" -web3-providers-ws@1.5.3: - version "1.5.3" - resolved "https://registry.yarnpkg.com/web3-providers-ws/-/web3-providers-ws-1.5.3.tgz#eec6cfb32bb928a4106de506f13a49070a21eabf" - integrity sha512-6DhTw4Q7nm5CFYEUHOJM0gAb3xFx+9gWpVveg3YxJ/ybR1BUvEWo3bLgIJJtX56cYX0WyY6DS35a7f0LOI1kVg== +web3-providers-ws@1.7.4: + version "1.7.4" + resolved "https://registry.yarnpkg.com/web3-providers-ws/-/web3-providers-ws-1.7.4.tgz#6e60bcefb456f569a3e766e386d7807a96f90595" + integrity sha512-g72X77nrcHMFU8hRzQJzfgi/072n8dHwRCoTw+WQrGp+XCQ71fsk2qIu3Tp+nlp5BPn8bRudQbPblVm2uT4myQ== dependencies: eventemitter3 "4.0.4" - web3-core-helpers "1.5.3" + web3-core-helpers "1.7.4" websocket "^1.0.32" +web3-shh@1.10.0: + version "1.10.0" + resolved "https://registry.yarnpkg.com/web3-shh/-/web3-shh-1.10.0.tgz#c2979b87e0f67a7fef2ce9ee853bd7bfbe9b79a8" + integrity sha512-uNUUuNsO2AjX41GJARV9zJibs11eq6HtOe6Wr0FtRUcj8SN6nHeYIzwstAvJ4fXA53gRqFMTxdntHEt9aXVjpg== + dependencies: + web3-core "1.10.0" + web3-core-method "1.10.0" + web3-core-subscriptions "1.10.0" + web3-net "1.10.0" + web3-shh@1.2.11: version "1.2.11" resolved "https://registry.yarnpkg.com/web3-shh/-/web3-shh-1.2.11.tgz#f5d086f9621c9a47e98d438010385b5f059fd88f" @@ -11324,34 +10960,33 @@ web3-shh@1.2.11: web3-core-subscriptions "1.2.11" web3-net "1.2.11" -web3-shh@1.5.3: - version "1.5.3" - resolved "https://registry.yarnpkg.com/web3-shh/-/web3-shh-1.5.3.tgz#3c04aa4cda9ba0b746d7225262401160f8e38b13" - integrity sha512-COfEXfsqoV/BkcsNLRxQqnWc1Teb8/9GxdGag5GtPC5gQC/vsN+7hYVJUwNxY9LtJPKYTij2DHHnx6UkITng+Q== +web3-shh@1.7.4: + version "1.7.4" + resolved "https://registry.yarnpkg.com/web3-shh/-/web3-shh-1.7.4.tgz#bee91cce2737c529fd347274010b548b6ea060f1" + integrity sha512-mlSZxSYcMkuMCxqhTYnZkUdahZ11h+bBv/8TlkXp/IHpEe4/Gg+KAbmfudakq3EzG/04z70XQmPgWcUPrsEJ+A== dependencies: - web3-core "1.5.3" - web3-core-method "1.5.3" - web3-core-subscriptions "1.5.3" - web3-net "1.5.3" + web3-core "1.7.4" + web3-core-method "1.7.4" + web3-core-subscriptions "1.7.4" + web3-net "1.7.4" -web3-utils@1.2.11: - version "1.2.11" - resolved "https://registry.yarnpkg.com/web3-utils/-/web3-utils-1.2.11.tgz#af1942aead3fb166ae851a985bed8ef2c2d95a82" - integrity sha512-3Tq09izhD+ThqHEaWYX4VOT7dNPdZiO+c/1QMA0s5X2lDFKK/xHJb7cyTRRVzN2LvlHbR7baS1tmQhSua51TcQ== +web3-utils@1.10.0: + version "1.10.0" + resolved "https://registry.yarnpkg.com/web3-utils/-/web3-utils-1.10.0.tgz#ca4c1b431a765c14ac7f773e92e0fd9377ccf578" + integrity sha512-kSaCM0uMcZTNUSmn5vMEhlo02RObGNRRCkdX0V9UTAU0+lrvn0HSaudyCo6CQzuXUsnuY2ERJGCGPfeWmv19Rg== dependencies: - bn.js "^4.11.9" - eth-lib "0.2.8" + bn.js "^5.2.1" ethereum-bloom-filters "^1.0.6" + ethereumjs-util "^7.1.0" ethjs-unit "0.1.6" number-to-bn "1.7.0" randombytes "^2.1.0" - underscore "1.9.1" utf8 "3.0.0" -web3-utils@1.5.3: - version "1.5.3" - resolved "https://registry.yarnpkg.com/web3-utils/-/web3-utils-1.5.3.tgz#e914c9320cd663b2a09a5cb920ede574043eb437" - integrity sha512-56nRgA+Ad9SEyCv39g36rTcr5fpsd4L9LgV3FK0aB66nAMazLAA6Qz4lH5XrUKPDyBIPGJIR+kJsyRtwcu2q1Q== +web3-utils@1.2.11: + version "1.2.11" + resolved "https://registry.yarnpkg.com/web3-utils/-/web3-utils-1.2.11.tgz#af1942aead3fb166ae851a985bed8ef2c2d95a82" + integrity sha512-3Tq09izhD+ThqHEaWYX4VOT7dNPdZiO+c/1QMA0s5X2lDFKK/xHJb7cyTRRVzN2LvlHbR7baS1tmQhSua51TcQ== dependencies: bn.js "^4.11.9" eth-lib "0.2.8" @@ -11359,14 +10994,15 @@ web3-utils@1.5.3: ethjs-unit "0.1.6" number-to-bn "1.7.0" randombytes "^2.1.0" + underscore "1.9.1" utf8 "3.0.0" -web3-utils@^1.0.0-beta.31: - version "1.7.1" - resolved "https://registry.yarnpkg.com/web3-utils/-/web3-utils-1.7.1.tgz#77d8bacaf426c66027d8aa4864d77f0ed211aacd" - integrity sha512-fef0EsqMGJUgiHPdX+KN9okVWshbIumyJPmR+btnD1HgvoXijKEkuKBv0OmUqjbeqmLKP2/N9EiXKJel5+E1Dw== +web3-utils@1.7.4: + version "1.7.4" + resolved "https://registry.yarnpkg.com/web3-utils/-/web3-utils-1.7.4.tgz#eb6fa3706b058602747228234453811bbee017f5" + integrity sha512-acBdm6Evd0TEZRnChM/MCvGsMwYKmSh7OaUfNf5OKG0CIeGWD/6gqLOWIwmwSnre/2WrA1nKGId5uW2e5EfluA== dependencies: - bn.js "^4.11.9" + bn.js "^5.2.1" ethereum-bloom-filters "^1.0.6" ethereumjs-util "^7.1.0" ethjs-unit "0.1.6" @@ -11374,19 +11010,33 @@ web3-utils@^1.0.0-beta.31: randombytes "^2.1.0" utf8 "3.0.0" -web3-utils@^1.3.0: - version "1.6.1" - resolved "https://registry.yarnpkg.com/web3-utils/-/web3-utils-1.6.1.tgz#befcb23922b00603ab56d8c5b4158468dc494aca" - integrity sha512-RidGKv5kOkcerI6jQqDFDoTllQQqV+rPhTzZHhmbqtFObbYpU93uc+yG1LHivRTQhA6llIx67iudc/vzisgO+w== +web3-utils@^1.0.0-beta.31, web3-utils@^1.3.0: + version "1.10.2" + resolved "https://registry.yarnpkg.com/web3-utils/-/web3-utils-1.10.2.tgz#361103d28a94d5e2a87ba15d776a62c33303eb44" + integrity sha512-TdApdzdse5YR+5GCX/b/vQnhhbj1KSAtfrDtRW7YS0kcWp1gkJsN62gw6GzCaNTeXookB7UrLtmDUuMv65qgow== dependencies: - bn.js "^4.11.9" + "@ethereumjs/util" "^8.1.0" + bn.js "^5.2.1" ethereum-bloom-filters "^1.0.6" - ethereumjs-util "^7.1.0" + ethereum-cryptography "^2.1.2" ethjs-unit "0.1.6" number-to-bn "1.7.0" randombytes "^2.1.0" utf8 "3.0.0" +web3@1.10.0: + version "1.10.0" + resolved "https://registry.yarnpkg.com/web3/-/web3-1.10.0.tgz#2fde0009f59aa756c93e07ea2a7f3ab971091274" + integrity sha512-YfKY9wSkGcM8seO+daR89oVTcbu18NsVfvOngzqMYGUU0pPSQmE57qQDvQzUeoIOHAnXEBNzrhjQJmm8ER0rng== + dependencies: + web3-bzz "1.10.0" + web3-core "1.10.0" + web3-eth "1.10.0" + web3-eth-personal "1.10.0" + web3-net "1.10.0" + web3-shh "1.10.0" + web3-utils "1.10.0" + web3@1.2.11: version "1.2.11" resolved "https://registry.yarnpkg.com/web3/-/web3-1.2.11.tgz#50f458b2e8b11aa37302071c170ed61cff332975" @@ -11400,23 +11050,23 @@ web3@1.2.11: web3-shh "1.2.11" web3-utils "1.2.11" -web3@1.5.3: - version "1.5.3" - resolved "https://registry.yarnpkg.com/web3/-/web3-1.5.3.tgz#11882679453c645bf33620fbc255a243343075aa" - integrity sha512-eyBg/1K44flfv0hPjXfKvNwcUfIVDI4NX48qHQe6wd7C8nPSdbWqo9vLy6ksZIt9NLa90HjI8HsGYgnMSUxn6w== +web3@1.7.4: + version "1.7.4" + resolved "https://registry.yarnpkg.com/web3/-/web3-1.7.4.tgz#00c9aef8e13ade92fd773d845fff250535828e93" + integrity sha512-iFGK5jO32vnXM/ASaJBaI0+gVR6uHozvYdxkdhaeOCD6HIQ4iIXadbO2atVpE9oc/H8l2MovJ4LtPhG7lIBN8A== dependencies: - web3-bzz "1.5.3" - web3-core "1.5.3" - web3-eth "1.5.3" - web3-eth-personal "1.5.3" - web3-net "1.5.3" - web3-shh "1.5.3" - web3-utils "1.5.3" + web3-bzz "1.7.4" + web3-core "1.7.4" + web3-eth "1.7.4" + web3-eth-personal "1.7.4" + web3-net "1.7.4" + web3-shh "1.7.4" + web3-utils "1.7.4" webidl-conversions@^3.0.0: version "3.0.1" resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-3.0.1.tgz#24534275e2a7bc6be7bc86611cc16ae0a5654871" - integrity sha1-JFNCdeKnvGvnvIZhHMFq4KVlSHE= + integrity sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ== websocket@1.0.32: version "1.0.32" @@ -11450,7 +11100,7 @@ whatwg-fetch@^2.0.4: whatwg-url@^5.0.0: version "5.0.0" resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-5.0.0.tgz#966454e8765462e37644d3626f6742ce8b70965d" - integrity sha1-lmRU6HZUYuN2RNNib2dCzotwll0= + integrity sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw== dependencies: tr46 "~0.0.3" webidl-conversions "^3.0.0" @@ -11469,24 +11119,23 @@ which-boxed-primitive@^1.0.2: which-module@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/which-module/-/which-module-1.0.0.tgz#bba63ca861948994ff307736089e3b96026c2a4f" - integrity sha1-u6Y8qGGUiZT/MHc2CJ47lgJsKk8= + integrity sha512-F6+WgncZi/mJDrammbTuHe1q0R5hOXv/mBaiNA2TCNT/LTHusX0V+CJnj9XT8ki5ln2UZyyddDgHfCzyrOH7MQ== which-module@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/which-module/-/which-module-2.0.0.tgz#d9ef07dce77b9902b8a3a8fa4b31c3e3f7e6e87a" - integrity sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho= + version "2.0.1" + resolved "https://registry.yarnpkg.com/which-module/-/which-module-2.0.1.tgz#776b1fe35d90aebe99e8ac15eb24093389a4a409" + integrity sha512-iBdZ57RDvnOR9AGBhML2vFZf7h8vmBjhoaZqODJBFWHVtKkDmKuHai3cx5PgVMrX5YDNp27AofYbAwctSS+vhQ== -which-typed-array@^1.1.2: - version "1.1.7" - resolved "https://registry.yarnpkg.com/which-typed-array/-/which-typed-array-1.1.7.tgz#2761799b9a22d4b8660b3c1b40abaa7739691793" - integrity sha512-vjxaB4nfDqwKI0ws7wZpxIlde1XrLX5uB0ZjpfshgmapJMD7jJWhZI+yToJTqaFByF0eNBcYxbjmCzoRP7CfEw== +which-typed-array@^1.1.10, which-typed-array@^1.1.11, which-typed-array@^1.1.2: + version "1.1.11" + resolved "https://registry.yarnpkg.com/which-typed-array/-/which-typed-array-1.1.11.tgz#99d691f23c72aab6768680805a271b69761ed61a" + integrity sha512-qe9UWWpkeG5yzZ0tNYxDmd7vo58HDBc39mZ0xWWpolAGADdFOzkfamWLDxkOWcvHQKVmdTyQdLD4NOfjLWTKew== dependencies: available-typed-arrays "^1.0.5" call-bind "^1.0.2" - es-abstract "^1.18.5" - foreach "^2.0.5" + for-each "^0.3.3" + gopd "^1.0.1" has-tostringtag "^1.0.0" - is-typed-array "^1.1.7" which@1.3.1, which@^1.1.1, which@^1.2.9, which@^1.3.1: version "1.3.1" @@ -11495,7 +11144,7 @@ which@1.3.1, which@^1.1.1, which@^1.2.9, which@^1.3.1: dependencies: isexe "^2.0.0" -which@2.0.2, which@^2.0.1: +which@^2.0.1: version "2.0.2" resolved "https://registry.yarnpkg.com/which/-/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1" integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA== @@ -11512,17 +11161,17 @@ wide-align@1.1.3: window-size@^0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/window-size/-/window-size-0.2.0.tgz#b4315bb4214a3d7058ebeee892e13fa24d98b075" - integrity sha1-tDFbtCFKPXBY6+7okuE/ok2YsHU= + integrity sha512-UD7d8HFA2+PZsbKyaOCEy8gMh1oDtHgJh1LfgjQ4zVXmYjAT/kvz3PueITKuqDiIXQe7yzpPnxX3lNc+AhQMyw== -word-wrap@^1.2.3, word-wrap@~1.2.3: - version "1.2.3" - resolved "https://registry.yarnpkg.com/word-wrap/-/word-wrap-1.2.3.tgz#610636f6b1f703891bd34771ccb17fb93b47079c" - integrity sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ== +word-wrap@~1.2.3: + version "1.2.5" + resolved "https://registry.yarnpkg.com/word-wrap/-/word-wrap-1.2.5.tgz#d2c45c6dd4fbce621a66f136cbe328afd0410b34" + integrity sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA== wordwrap@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-1.0.0.tgz#27584810891456a4171c8d0226441ade90cbcaeb" - integrity sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus= + integrity sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q== wordwrapjs@^4.0.0: version "4.0.1" @@ -11532,15 +11181,15 @@ wordwrapjs@^4.0.0: reduce-flatten "^2.0.0" typical "^5.2.0" -workerpool@6.2.0: - version "6.2.0" - resolved "https://registry.yarnpkg.com/workerpool/-/workerpool-6.2.0.tgz#827d93c9ba23ee2019c3ffaff5c27fccea289e8b" - integrity sha512-Rsk5qQHJ9eowMH28Jwhe8HEbmdYDX4lwoMWshiCXugjtHqMD9ZbiqSDLxcsfdqsETPzVUtX5s1Z5kStiIM6l4A== +workerpool@6.2.1: + version "6.2.1" + resolved "https://registry.yarnpkg.com/workerpool/-/workerpool-6.2.1.tgz#46fc150c17d826b86a008e5a4508656777e9c343" + integrity sha512-ILEIE97kDZvF9Wb9f6h5aXK4swSlKGUcOEGiIYb2OOu/IrDU9iwj0fD//SsA6E5ibwJxpEvhullJY4Sl4GcpAw== wrap-ansi@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-2.1.0.tgz#d8fc3d284dd05794fe84973caecdd1cf824fdd85" - integrity sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU= + integrity sha512-vAaEaDM946gbNpH5pLVNR+vX2ht6n0Bt3GXwVB1AuAqZosOvHNF3P7wDnh8KLkSqgUh0uh77le7Owgoz+Z9XBw== dependencies: string-width "^1.0.1" strip-ansi "^3.0.1" @@ -11566,14 +11215,7 @@ wrap-ansi@^7.0.0: wrappy@1: version "1.0.2" resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" - integrity sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8= - -write@1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/write/-/write-1.0.3.tgz#0800e14523b923a387e415123c865616aae0f5c3" - integrity sha512-/lg70HAjtkUgWPVZhZcm+T4hkL8Zbtp1nFNOn3lRrxnlv50SRBv7cR7RqR+GMsd3hUXy9hWBo4CHTbFTcOYwig== - dependencies: - mkdirp "^0.5.1" + integrity sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ== ws@7.4.6: version "7.4.6" @@ -11602,9 +11244,9 @@ ws@^5.1.1: async-limiter "~1.0.0" ws@^7.4.6: - version "7.5.7" - resolved "https://registry.yarnpkg.com/ws/-/ws-7.5.7.tgz#9e0ac77ee50af70d58326ecff7e85eb3fa375e67" - integrity sha512-KMvVuFzpKBuiIXW3E4u3mySRO2/mCHSyZDJQM5NQ9Q9KHWHWh0NHgfbRMLLrceUK5qAL4ytALJbpRMjixFZh8A== + version "7.5.9" + resolved "https://registry.yarnpkg.com/ws/-/ws-7.5.9.tgz#54fa7db29f4c7cec68b1ddd3a89de099942bb591" + integrity sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q== xhr-request-promise@^0.1.2: version "0.1.3" @@ -11629,7 +11271,7 @@ xhr-request@^1.0.1, xhr-request@^1.1.0: xhr2-cookies@1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/xhr2-cookies/-/xhr2-cookies-1.1.0.tgz#7d77449d0999197f155cb73b23df72505ed89d48" - integrity sha1-fXdEnQmZGX8VXLc7I99yUF7YnUg= + integrity sha512-hjXUA6q+jl/bd8ADHcVfFsSPIf+tyLIjuO9TwJC9WI6JP2zKcS7C+p56I9kCLLsaCiNT035iYvEUUzdEFj/8+g== dependencies: cookiejar "^2.1.1" @@ -11646,9 +11288,9 @@ xhr@^2.0.4, xhr@^2.2.0, xhr@^2.3.3: xmlhttprequest@1.8.0: version "1.8.0" resolved "https://registry.yarnpkg.com/xmlhttprequest/-/xmlhttprequest-1.8.0.tgz#67fe075c5c24fef39f9d65f5f7b7fe75171968fc" - integrity sha1-Z/4HXFwk/vOfnWX197f+dRcZaPw= + integrity sha512-58Im/U0mlVBLM38NdZjHyhuMtCqa61469k2YP/AaPbvCoV9aQGUpbJBj1QRm2ytRiVQBD/fsw7L2bJGDVQswBA== -xtend@^4.0.0, xtend@^4.0.1, xtend@^4.0.2, xtend@~4.0.0, xtend@~4.0.1: +xtend@^4.0.0, xtend@^4.0.1, xtend@~4.0.0, xtend@~4.0.1: version "4.0.2" resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.2.tgz#bb72779f5fa465186b1f438f674fa347fdb5db54" integrity sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ== @@ -11656,7 +11298,7 @@ xtend@^4.0.0, xtend@^4.0.1, xtend@^4.0.2, xtend@~4.0.0, xtend@~4.0.1: xtend@~2.1.1: version "2.1.2" resolved "https://registry.yarnpkg.com/xtend/-/xtend-2.1.2.tgz#6efecc2a4dad8e6962c4901b337ce7ba87b5d28b" - integrity sha1-bv7MKk2tjmlixJAbM3znuoe10os= + integrity sha512-vMNKzr2rHP9Dp/e1NQFnLQlwlhp9L/LfvnsVdHxN1f+uggyVI3i08uD14GPvCToPkdsRfyPqIyYGmIk58V98ZQ== dependencies: object-keys "~0.4.0" @@ -11678,7 +11320,7 @@ y18n@^5.0.5: yaeti@^0.0.6: version "0.0.6" resolved "https://registry.yarnpkg.com/yaeti/-/yaeti-0.0.6.tgz#f26f484d72684cf42bedfb76970aa1608fbf9577" - integrity sha1-8m9ITXJoTPQr7ft2lwqhYI+/lXc= + integrity sha512-MvQa//+KcZCUkBTIC9blM+CU9J2GzuTytsOUwf2lidtvkx/6gnEp1QvJv34t9vdjhFmha/mUiNDbN0D0mJWdug== yallist@^3.0.0, yallist@^3.0.2, yallist@^3.1.1: version "3.1.1" @@ -11690,6 +11332,11 @@ yallist@^4.0.0: resolved "https://registry.yarnpkg.com/yallist/-/yallist-4.0.0.tgz#9bb92790d9c0effec63be73519e11a35019a3a72" integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A== +yaml@^1.10.2: + version "1.10.2" + resolved "https://registry.yarnpkg.com/yaml/-/yaml-1.10.2.tgz#2301c5ffbf12b467de8da2333a459e29e7920e4b" + integrity sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg== + yargs-parser@13.1.2, yargs-parser@^13.1.2: version "13.1.2" resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-13.1.2.tgz#130f09702ebaeef2650d54ce6e3e5706f7a4fb38" @@ -11706,7 +11353,7 @@ yargs-parser@20.2.4: yargs-parser@^2.4.1: version "2.4.1" resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-2.4.1.tgz#85568de3cf150ff49fa51825f03a8c880ddcc5c4" - integrity sha1-hVaN488VD/SfpRgl8DqMiA3cxcQ= + integrity sha512-9pIKIJhnI5tonzG6OnCFlz/yln8xHYcGl+pn3xR0Vzff0vzN1PbNRaelgfgRUwZ3s4i3jvxT9WhmUGL4whnasA== dependencies: camelcase "^3.0.0" lodash.assign "^4.0.6" @@ -11767,7 +11414,7 @@ yargs@16.2.0: yargs@^4.7.1: version "4.8.1" resolved "https://registry.yarnpkg.com/yargs/-/yargs-4.8.1.tgz#c0c42924ca4aaa6b0e6da1739dfb216439f9ddc0" - integrity sha1-wMQpJMpKqmsObaFznfshZDn53cA= + integrity sha512-LqodLrnIDM3IFT+Hf/5sxBnEGECrfdC1uIbgZeJmESCSo4HoCAaKEus8MylXHAkdacGc0ye+Qa+dpkuom8uVYA== dependencies: cliui "^3.2.0" decamelize "^1.1.1" @@ -11801,3 +11448,8 @@ yocto-queue@^0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-0.1.0.tgz#0294eb3dee05028d31ee1a5fa2c556a6aaf10a1b" integrity sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q== + +zksync-web3@^0.14.3: + version "0.14.3" + resolved "https://registry.yarnpkg.com/zksync-web3/-/zksync-web3-0.14.3.tgz#64ac2a16d597464c3fc4ae07447a8007631c57c9" + integrity sha512-hT72th4AnqyLW1d5Jlv8N2B/qhEnl2NePK2A3org7tAa24niem/UAaHMkEvmWI3SF9waYUPtqAtjpf+yvQ9zvQ== From e35a62a84ec848de37cade17c84dd0bd3d525f23 Mon Sep 17 00:00:00 2001 From: Goran Vladika Date: Tue, 12 Sep 2023 19:25:13 +0200 Subject: [PATCH 084/292] Remove outdated patch --- .../@nomiclabs+hardhat-etherscan+3.1.0.patch | 263 ------------------ 1 file changed, 263 deletions(-) delete mode 100644 patches/@nomiclabs+hardhat-etherscan+3.1.0.patch diff --git a/patches/@nomiclabs+hardhat-etherscan+3.1.0.patch b/patches/@nomiclabs+hardhat-etherscan+3.1.0.patch deleted file mode 100644 index 9156511d..00000000 --- a/patches/@nomiclabs+hardhat-etherscan+3.1.0.patch +++ /dev/null @@ -1,263 +0,0 @@ -diff --git a/node_modules/@nomiclabs/hardhat-etherscan/dist/src/constants.d.ts b/node_modules/@nomiclabs/hardhat-etherscan/dist/src/constants.d.ts -index 02997fe..ea8a589 100644 ---- a/node_modules/@nomiclabs/hardhat-etherscan/dist/src/constants.d.ts -+++ b/node_modules/@nomiclabs/hardhat-etherscan/dist/src/constants.d.ts -@@ -1,6 +1,7 @@ - export declare const pluginName = "@nomiclabs/hardhat-etherscan"; - export declare const TASK_VERIFY = "verify"; - export declare const TASK_VERIFY_GET_MINIMUM_BUILD = "verify:get-minimum-build"; -+export declare const TASK_VERIFY_GET_FULL_BUILD = "verify:get-full-build"; - export declare const TASK_VERIFY_GET_CONSTRUCTOR_ARGUMENTS = "verify:get-constructor-arguments"; - export declare const TASK_VERIFY_GET_COMPILER_VERSIONS = "verify:get-compiler-versions"; - export declare const TASK_VERIFY_GET_ETHERSCAN_ENDPOINT = "verify:get-etherscan-endpoint"; -diff --git a/node_modules/@nomiclabs/hardhat-etherscan/dist/src/constants.js b/node_modules/@nomiclabs/hardhat-etherscan/dist/src/constants.js -index 3c39b90..3ea23f9 100644 ---- a/node_modules/@nomiclabs/hardhat-etherscan/dist/src/constants.js -+++ b/node_modules/@nomiclabs/hardhat-etherscan/dist/src/constants.js -@@ -1,9 +1,10 @@ - "use strict"; - Object.defineProperty(exports, "__esModule", { value: true }); --exports.TASK_VERIFY_GET_LIBRARIES = exports.TASK_VERIFY_VERIFY = exports.TASK_VERIFY_VERIFY_MINIMUM_BUILD = exports.TASK_VERIFY_GET_CONTRACT_INFORMATION = exports.TASK_VERIFY_GET_ETHERSCAN_ENDPOINT = exports.TASK_VERIFY_GET_COMPILER_VERSIONS = exports.TASK_VERIFY_GET_CONSTRUCTOR_ARGUMENTS = exports.TASK_VERIFY_GET_MINIMUM_BUILD = exports.TASK_VERIFY = exports.pluginName = void 0; -+exports.TASK_VERIFY_GET_LIBRARIES = exports.TASK_VERIFY_VERIFY = exports.TASK_VERIFY_VERIFY_MINIMUM_BUILD = exports.TASK_VERIFY_GET_CONTRACT_INFORMATION = exports.TASK_VERIFY_GET_ETHERSCAN_ENDPOINT = exports.TASK_VERIFY_GET_COMPILER_VERSIONS = exports.TASK_VERIFY_GET_CONSTRUCTOR_ARGUMENTS = exports.TASK_VERIFY_GET_FULL_BUILD = exports.TASK_VERIFY_GET_MINIMUM_BUILD = exports.TASK_VERIFY = exports.pluginName = void 0; - exports.pluginName = "@nomiclabs/hardhat-etherscan"; - exports.TASK_VERIFY = "verify"; - exports.TASK_VERIFY_GET_MINIMUM_BUILD = "verify:get-minimum-build"; -+exports.TASK_VERIFY_GET_FULL_BUILD = "verify:get-full-build"; - exports.TASK_VERIFY_GET_CONSTRUCTOR_ARGUMENTS = "verify:get-constructor-arguments"; - exports.TASK_VERIFY_GET_COMPILER_VERSIONS = "verify:get-compiler-versions"; - exports.TASK_VERIFY_GET_ETHERSCAN_ENDPOINT = "verify:get-etherscan-endpoint"; -diff --git a/node_modules/@nomiclabs/hardhat-etherscan/dist/src/index.js b/node_modules/@nomiclabs/hardhat-etherscan/dist/src/index.js -index 0f8a4d5..3502c2c 100644 ---- a/node_modules/@nomiclabs/hardhat-etherscan/dist/src/index.js -+++ b/node_modules/@nomiclabs/hardhat-etherscan/dist/src/index.js -@@ -140,9 +140,18 @@ Possible causes are: - const solcFullVersion = deployedBytecode.isOvmInferred() - ? contractInformation.solcVersion - : await (0, version_1.getLongVersion)(contractInformation.solcVersion); -- const minimumBuild = await run(constants_1.TASK_VERIFY_GET_MINIMUM_BUILD, { -- sourceName: contractInformation.sourceName, -- }); -+ let minimumBuild; -+ try { -+ minimumBuild = await run(constants_1.TASK_VERIFY_GET_MINIMUM_BUILD, { -+ sourceName: contractInformation.sourceName, -+ }); -+ } -+ catch (error) { -+ console.warn('Unable to produce minimum build, proceeding to use full build...'); -+ minimumBuild = await run(constants_1.TASK_VERIFY_GET_FULL_BUILD, { -+ sourceName: contractInformation.sourceName, -+ }); -+ } - const success = await run(constants_1.TASK_VERIFY_VERIFY_MINIMUM_BUILD, { - minimumBuild, - contractInformation, -@@ -276,6 +285,44 @@ const getMinimumBuild = async function ({ sourceName }, { run }) { - }); - return build; - }; -+const getFullBuild = async function ({ sourceName }, { run }) { -+ const sourcePaths = await run(task_names_1.TASK_COMPILE_SOLIDITY_GET_SOURCE_PATHS); -+ const sourceNames = await run(task_names_1.TASK_COMPILE_SOLIDITY_GET_SOURCE_NAMES, { -+ sourcePaths, -+ }); -+ const dependencyGraph = await run(task_names_1.TASK_COMPILE_SOLIDITY_GET_DEPENDENCY_GRAPH, { sourceNames }); -+ const resolvedFiles = dependencyGraph -+ .getResolvedFiles() -+ .filter((resolvedFile) => { -+ return resolvedFile.sourceName === sourceName; -+ }); -+ assertHardhatPluginInvariant(resolvedFiles.length === 1, `The plugin found an unexpected number of files for this contract.`); -+ const compilationJobsCreationResult = await run(task_names_1.TASK_COMPILE_SOLIDITY_GET_COMPILATION_JOBS, { -+ dependencyGraph, -+ }); -+ await run(task_names_1.TASK_COMPILE_SOLIDITY_HANDLE_COMPILATION_JOBS_FAILURES, { -+ compilationJobsCreationErrors: compilationJobsCreationResult.errors, -+ }); -+ const compilationJobs = compilationJobsCreationResult.jobs; -+ // const filteredCompilationJobs: CompilationJob[] = await run( -+ // TASK_COMPILE_SOLIDITY_FILTER_COMPILATION_JOBS, -+ // { compilationJobs, force: false } -+ // ); -+ const mergedCompilationJobs = await run(task_names_1.TASK_COMPILE_SOLIDITY_MERGE_COMPILATION_JOBS, { compilationJobs: compilationJobs }); -+ const targetCompilationJobs = mergedCompilationJobs.filter((cj) => { -+ return (cj.getResolvedFiles().filter((f) => f.sourceName === sourceName).length > -+ 0); -+ }); -+ const compilationJob = targetCompilationJobs[0]; -+ const build = await run(task_names_1.TASK_COMPILE_SOLIDITY_COMPILE_JOB, { -+ compilationJob, -+ compilationJobs: [compilationJob], -+ compilationJobIndex: 0, -+ emitsArtifacts: false, -+ quiet: true, -+ }); -+ return build; -+}; - async function inferContract(artifacts, network, matchingCompilerVersions, deployedBytecode) { - const contractMatches = await (0, bytecode_1.lookupMatchingBytecode)(artifacts, matchingCompilerVersions, deployedBytecode); - if (contractMatches.length === 0) { -@@ -429,6 +476,9 @@ This means that unrelated contracts may be displayed on Etherscan... - (0, config_1.subtask)(constants_1.TASK_VERIFY_GET_MINIMUM_BUILD) - .addParam("sourceName", undefined, undefined, config_1.types.string) - .setAction(getMinimumBuild); -+(0, config_1.subtask)(constants_1.TASK_VERIFY_GET_FULL_BUILD) -+ .addParam("sourceName", undefined, undefined, config_1.types.string) -+ .setAction(getFullBuild); - (0, config_1.task)(constants_1.TASK_VERIFY, "Verifies contract on Etherscan") - .addOptionalPositionalParam("address", "Address of the smart contract to verify") - .addOptionalParam("constructorArgs", "File path to a javascript module that exports the list of arguments.", undefined, config_1.types.inputFile) -diff --git a/node_modules/@nomiclabs/hardhat-etherscan/src/constants.ts b/node_modules/@nomiclabs/hardhat-etherscan/src/constants.ts -index cb029e2..0e5341d 100644 ---- a/node_modules/@nomiclabs/hardhat-etherscan/src/constants.ts -+++ b/node_modules/@nomiclabs/hardhat-etherscan/src/constants.ts -@@ -1,6 +1,7 @@ - export const pluginName = "@nomiclabs/hardhat-etherscan"; - export const TASK_VERIFY = "verify"; - export const TASK_VERIFY_GET_MINIMUM_BUILD = "verify:get-minimum-build"; -+export const TASK_VERIFY_GET_FULL_BUILD = "verify:get-full-build"; - export const TASK_VERIFY_GET_CONSTRUCTOR_ARGUMENTS = - "verify:get-constructor-arguments"; - export const TASK_VERIFY_GET_COMPILER_VERSIONS = "verify:get-compiler-versions"; -diff --git a/node_modules/@nomiclabs/hardhat-etherscan/src/index.ts b/node_modules/@nomiclabs/hardhat-etherscan/src/index.ts -index e55c99b..5661415 100644 ---- a/node_modules/@nomiclabs/hardhat-etherscan/src/index.ts -+++ b/node_modules/@nomiclabs/hardhat-etherscan/src/index.ts -@@ -1,8 +1,14 @@ - import { - TASK_COMPILE, - TASK_COMPILE_SOLIDITY_COMPILE_JOB, -+ TASK_COMPILE_SOLIDITY_FILTER_COMPILATION_JOBS, -+ TASK_COMPILE_SOLIDITY_GET_COMPILATION_JOBS, - TASK_COMPILE_SOLIDITY_GET_COMPILATION_JOB_FOR_FILE, - TASK_COMPILE_SOLIDITY_GET_DEPENDENCY_GRAPH, -+ TASK_COMPILE_SOLIDITY_GET_SOURCE_NAMES, -+ TASK_COMPILE_SOLIDITY_GET_SOURCE_PATHS, -+ TASK_COMPILE_SOLIDITY_HANDLE_COMPILATION_JOBS_FAILURES, -+ TASK_COMPILE_SOLIDITY_MERGE_COMPILATION_JOBS, - } from "hardhat/builtin-tasks/task-names"; - import { extendConfig, subtask, task, types } from "hardhat/config"; - import { NomicLabsHardhatPluginError } from "hardhat/plugins"; -@@ -10,6 +16,7 @@ import { - ActionType, - Artifacts, - CompilationJob, -+ CompilationJobsCreationResult, - CompilerInput, - CompilerOutput, - DependencyGraph, -@@ -33,6 +40,7 @@ import { - TASK_VERIFY_GET_ETHERSCAN_ENDPOINT, - TASK_VERIFY_GET_LIBRARIES, - TASK_VERIFY_GET_MINIMUM_BUILD, -+ TASK_VERIFY_GET_FULL_BUILD, - TASK_VERIFY_VERIFY, - TASK_VERIFY_VERIFY_MINIMUM_BUILD, - } from "./constants"; -@@ -292,9 +300,17 @@ Possible causes are: - ? contractInformation.solcVersion - : await getLongVersion(contractInformation.solcVersion); - -- const minimumBuild: Build = await run(TASK_VERIFY_GET_MINIMUM_BUILD, { -- sourceName: contractInformation.sourceName, -- }); -+ let minimumBuild: Build; -+ try { -+ minimumBuild = await run(TASK_VERIFY_GET_MINIMUM_BUILD, { -+ sourceName: contractInformation.sourceName, -+ }); -+ } catch (error) { -+ console.warn('Unable to produce minimum build, proceeding to use full build...') -+ minimumBuild = await run(TASK_VERIFY_GET_FULL_BUILD, { -+ sourceName: contractInformation.sourceName, -+ }); -+ } - - const success: boolean = await run(TASK_VERIFY_VERIFY_MINIMUM_BUILD, { - minimumBuild, -@@ -531,7 +547,74 @@ const getMinimumBuild: ActionType = async function ( - emitsArtifacts: false, - quiet: true, - }); -+ return build; -+}; -+ -+const getFullBuild: ActionType = async function ( -+ { sourceName }, -+ { run } -+): Promise { -+ const sourcePaths: string[] = await run( -+ TASK_COMPILE_SOLIDITY_GET_SOURCE_PATHS -+ ); -+ -+ const sourceNames: string[] = await run( -+ TASK_COMPILE_SOLIDITY_GET_SOURCE_NAMES, -+ { -+ sourcePaths, -+ } -+ ); -+ -+ const dependencyGraph: DependencyGraph = await run( -+ TASK_COMPILE_SOLIDITY_GET_DEPENDENCY_GRAPH, -+ { sourceNames } -+ ); -+ -+ const resolvedFiles = dependencyGraph -+ .getResolvedFiles() -+ .filter((resolvedFile) => { -+ return resolvedFile.sourceName === sourceName; -+ }); -+ assertHardhatPluginInvariant( -+ resolvedFiles.length === 1, -+ `The plugin found an unexpected number of files for this contract.` -+ ); -+ -+ const compilationJobsCreationResult: CompilationJobsCreationResult = -+ await run(TASK_COMPILE_SOLIDITY_GET_COMPILATION_JOBS, { -+ dependencyGraph, -+ }); -+ await run(TASK_COMPILE_SOLIDITY_HANDLE_COMPILATION_JOBS_FAILURES, { -+ compilationJobsCreationErrors: compilationJobsCreationResult.errors, -+ }); -+ -+ const compilationJobs = compilationJobsCreationResult.jobs; -+ -+ // const filteredCompilationJobs: CompilationJob[] = await run( -+ // TASK_COMPILE_SOLIDITY_FILTER_COMPILATION_JOBS, -+ // { compilationJobs, force: false } -+ // ); -+ -+ const mergedCompilationJobs: CompilationJob[] = await run( -+ TASK_COMPILE_SOLIDITY_MERGE_COMPILATION_JOBS, -+ { compilationJobs: compilationJobs } -+ ); - -+ const targetCompilationJobs = mergedCompilationJobs.filter((cj) => { -+ return ( -+ cj.getResolvedFiles().filter((f) => f.sourceName === sourceName).length > -+ 0 -+ ); -+ }); -+ const compilationJob = targetCompilationJobs[0]; -+ -+ const build: Build = await run(TASK_COMPILE_SOLIDITY_COMPILE_JOB, { -+ compilationJob, -+ compilationJobs: [compilationJob], -+ compilationJobIndex: 0, -+ emitsArtifacts: false, -+ quiet: true, -+ }); - return build; - }; - -@@ -807,6 +890,10 @@ subtask(TASK_VERIFY_GET_MINIMUM_BUILD) - .addParam("sourceName", undefined, undefined, types.string) - .setAction(getMinimumBuild); - -+subtask(TASK_VERIFY_GET_FULL_BUILD) -+ .addParam("sourceName", undefined, undefined, types.string) -+ .setAction(getFullBuild); -+ - task(TASK_VERIFY, "Verifies contract on Etherscan") - .addOptionalPositionalParam( - "address", From 8198a177b3d006ef250c531b75152938a017896b Mon Sep 17 00:00:00 2001 From: Goran Vladika Date: Tue, 12 Sep 2023 20:08:36 +0200 Subject: [PATCH 085/292] Revert "Remove outdated patch" This reverts commit e35a62a84ec848de37cade17c84dd0bd3d525f23. --- .../@nomiclabs+hardhat-etherscan+3.1.0.patch | 263 ++++++++++++++++++ 1 file changed, 263 insertions(+) create mode 100644 patches/@nomiclabs+hardhat-etherscan+3.1.0.patch diff --git a/patches/@nomiclabs+hardhat-etherscan+3.1.0.patch b/patches/@nomiclabs+hardhat-etherscan+3.1.0.patch new file mode 100644 index 00000000..9156511d --- /dev/null +++ b/patches/@nomiclabs+hardhat-etherscan+3.1.0.patch @@ -0,0 +1,263 @@ +diff --git a/node_modules/@nomiclabs/hardhat-etherscan/dist/src/constants.d.ts b/node_modules/@nomiclabs/hardhat-etherscan/dist/src/constants.d.ts +index 02997fe..ea8a589 100644 +--- a/node_modules/@nomiclabs/hardhat-etherscan/dist/src/constants.d.ts ++++ b/node_modules/@nomiclabs/hardhat-etherscan/dist/src/constants.d.ts +@@ -1,6 +1,7 @@ + export declare const pluginName = "@nomiclabs/hardhat-etherscan"; + export declare const TASK_VERIFY = "verify"; + export declare const TASK_VERIFY_GET_MINIMUM_BUILD = "verify:get-minimum-build"; ++export declare const TASK_VERIFY_GET_FULL_BUILD = "verify:get-full-build"; + export declare const TASK_VERIFY_GET_CONSTRUCTOR_ARGUMENTS = "verify:get-constructor-arguments"; + export declare const TASK_VERIFY_GET_COMPILER_VERSIONS = "verify:get-compiler-versions"; + export declare const TASK_VERIFY_GET_ETHERSCAN_ENDPOINT = "verify:get-etherscan-endpoint"; +diff --git a/node_modules/@nomiclabs/hardhat-etherscan/dist/src/constants.js b/node_modules/@nomiclabs/hardhat-etherscan/dist/src/constants.js +index 3c39b90..3ea23f9 100644 +--- a/node_modules/@nomiclabs/hardhat-etherscan/dist/src/constants.js ++++ b/node_modules/@nomiclabs/hardhat-etherscan/dist/src/constants.js +@@ -1,9 +1,10 @@ + "use strict"; + Object.defineProperty(exports, "__esModule", { value: true }); +-exports.TASK_VERIFY_GET_LIBRARIES = exports.TASK_VERIFY_VERIFY = exports.TASK_VERIFY_VERIFY_MINIMUM_BUILD = exports.TASK_VERIFY_GET_CONTRACT_INFORMATION = exports.TASK_VERIFY_GET_ETHERSCAN_ENDPOINT = exports.TASK_VERIFY_GET_COMPILER_VERSIONS = exports.TASK_VERIFY_GET_CONSTRUCTOR_ARGUMENTS = exports.TASK_VERIFY_GET_MINIMUM_BUILD = exports.TASK_VERIFY = exports.pluginName = void 0; ++exports.TASK_VERIFY_GET_LIBRARIES = exports.TASK_VERIFY_VERIFY = exports.TASK_VERIFY_VERIFY_MINIMUM_BUILD = exports.TASK_VERIFY_GET_CONTRACT_INFORMATION = exports.TASK_VERIFY_GET_ETHERSCAN_ENDPOINT = exports.TASK_VERIFY_GET_COMPILER_VERSIONS = exports.TASK_VERIFY_GET_CONSTRUCTOR_ARGUMENTS = exports.TASK_VERIFY_GET_FULL_BUILD = exports.TASK_VERIFY_GET_MINIMUM_BUILD = exports.TASK_VERIFY = exports.pluginName = void 0; + exports.pluginName = "@nomiclabs/hardhat-etherscan"; + exports.TASK_VERIFY = "verify"; + exports.TASK_VERIFY_GET_MINIMUM_BUILD = "verify:get-minimum-build"; ++exports.TASK_VERIFY_GET_FULL_BUILD = "verify:get-full-build"; + exports.TASK_VERIFY_GET_CONSTRUCTOR_ARGUMENTS = "verify:get-constructor-arguments"; + exports.TASK_VERIFY_GET_COMPILER_VERSIONS = "verify:get-compiler-versions"; + exports.TASK_VERIFY_GET_ETHERSCAN_ENDPOINT = "verify:get-etherscan-endpoint"; +diff --git a/node_modules/@nomiclabs/hardhat-etherscan/dist/src/index.js b/node_modules/@nomiclabs/hardhat-etherscan/dist/src/index.js +index 0f8a4d5..3502c2c 100644 +--- a/node_modules/@nomiclabs/hardhat-etherscan/dist/src/index.js ++++ b/node_modules/@nomiclabs/hardhat-etherscan/dist/src/index.js +@@ -140,9 +140,18 @@ Possible causes are: + const solcFullVersion = deployedBytecode.isOvmInferred() + ? contractInformation.solcVersion + : await (0, version_1.getLongVersion)(contractInformation.solcVersion); +- const minimumBuild = await run(constants_1.TASK_VERIFY_GET_MINIMUM_BUILD, { +- sourceName: contractInformation.sourceName, +- }); ++ let minimumBuild; ++ try { ++ minimumBuild = await run(constants_1.TASK_VERIFY_GET_MINIMUM_BUILD, { ++ sourceName: contractInformation.sourceName, ++ }); ++ } ++ catch (error) { ++ console.warn('Unable to produce minimum build, proceeding to use full build...'); ++ minimumBuild = await run(constants_1.TASK_VERIFY_GET_FULL_BUILD, { ++ sourceName: contractInformation.sourceName, ++ }); ++ } + const success = await run(constants_1.TASK_VERIFY_VERIFY_MINIMUM_BUILD, { + minimumBuild, + contractInformation, +@@ -276,6 +285,44 @@ const getMinimumBuild = async function ({ sourceName }, { run }) { + }); + return build; + }; ++const getFullBuild = async function ({ sourceName }, { run }) { ++ const sourcePaths = await run(task_names_1.TASK_COMPILE_SOLIDITY_GET_SOURCE_PATHS); ++ const sourceNames = await run(task_names_1.TASK_COMPILE_SOLIDITY_GET_SOURCE_NAMES, { ++ sourcePaths, ++ }); ++ const dependencyGraph = await run(task_names_1.TASK_COMPILE_SOLIDITY_GET_DEPENDENCY_GRAPH, { sourceNames }); ++ const resolvedFiles = dependencyGraph ++ .getResolvedFiles() ++ .filter((resolvedFile) => { ++ return resolvedFile.sourceName === sourceName; ++ }); ++ assertHardhatPluginInvariant(resolvedFiles.length === 1, `The plugin found an unexpected number of files for this contract.`); ++ const compilationJobsCreationResult = await run(task_names_1.TASK_COMPILE_SOLIDITY_GET_COMPILATION_JOBS, { ++ dependencyGraph, ++ }); ++ await run(task_names_1.TASK_COMPILE_SOLIDITY_HANDLE_COMPILATION_JOBS_FAILURES, { ++ compilationJobsCreationErrors: compilationJobsCreationResult.errors, ++ }); ++ const compilationJobs = compilationJobsCreationResult.jobs; ++ // const filteredCompilationJobs: CompilationJob[] = await run( ++ // TASK_COMPILE_SOLIDITY_FILTER_COMPILATION_JOBS, ++ // { compilationJobs, force: false } ++ // ); ++ const mergedCompilationJobs = await run(task_names_1.TASK_COMPILE_SOLIDITY_MERGE_COMPILATION_JOBS, { compilationJobs: compilationJobs }); ++ const targetCompilationJobs = mergedCompilationJobs.filter((cj) => { ++ return (cj.getResolvedFiles().filter((f) => f.sourceName === sourceName).length > ++ 0); ++ }); ++ const compilationJob = targetCompilationJobs[0]; ++ const build = await run(task_names_1.TASK_COMPILE_SOLIDITY_COMPILE_JOB, { ++ compilationJob, ++ compilationJobs: [compilationJob], ++ compilationJobIndex: 0, ++ emitsArtifacts: false, ++ quiet: true, ++ }); ++ return build; ++}; + async function inferContract(artifacts, network, matchingCompilerVersions, deployedBytecode) { + const contractMatches = await (0, bytecode_1.lookupMatchingBytecode)(artifacts, matchingCompilerVersions, deployedBytecode); + if (contractMatches.length === 0) { +@@ -429,6 +476,9 @@ This means that unrelated contracts may be displayed on Etherscan... + (0, config_1.subtask)(constants_1.TASK_VERIFY_GET_MINIMUM_BUILD) + .addParam("sourceName", undefined, undefined, config_1.types.string) + .setAction(getMinimumBuild); ++(0, config_1.subtask)(constants_1.TASK_VERIFY_GET_FULL_BUILD) ++ .addParam("sourceName", undefined, undefined, config_1.types.string) ++ .setAction(getFullBuild); + (0, config_1.task)(constants_1.TASK_VERIFY, "Verifies contract on Etherscan") + .addOptionalPositionalParam("address", "Address of the smart contract to verify") + .addOptionalParam("constructorArgs", "File path to a javascript module that exports the list of arguments.", undefined, config_1.types.inputFile) +diff --git a/node_modules/@nomiclabs/hardhat-etherscan/src/constants.ts b/node_modules/@nomiclabs/hardhat-etherscan/src/constants.ts +index cb029e2..0e5341d 100644 +--- a/node_modules/@nomiclabs/hardhat-etherscan/src/constants.ts ++++ b/node_modules/@nomiclabs/hardhat-etherscan/src/constants.ts +@@ -1,6 +1,7 @@ + export const pluginName = "@nomiclabs/hardhat-etherscan"; + export const TASK_VERIFY = "verify"; + export const TASK_VERIFY_GET_MINIMUM_BUILD = "verify:get-minimum-build"; ++export const TASK_VERIFY_GET_FULL_BUILD = "verify:get-full-build"; + export const TASK_VERIFY_GET_CONSTRUCTOR_ARGUMENTS = + "verify:get-constructor-arguments"; + export const TASK_VERIFY_GET_COMPILER_VERSIONS = "verify:get-compiler-versions"; +diff --git a/node_modules/@nomiclabs/hardhat-etherscan/src/index.ts b/node_modules/@nomiclabs/hardhat-etherscan/src/index.ts +index e55c99b..5661415 100644 +--- a/node_modules/@nomiclabs/hardhat-etherscan/src/index.ts ++++ b/node_modules/@nomiclabs/hardhat-etherscan/src/index.ts +@@ -1,8 +1,14 @@ + import { + TASK_COMPILE, + TASK_COMPILE_SOLIDITY_COMPILE_JOB, ++ TASK_COMPILE_SOLIDITY_FILTER_COMPILATION_JOBS, ++ TASK_COMPILE_SOLIDITY_GET_COMPILATION_JOBS, + TASK_COMPILE_SOLIDITY_GET_COMPILATION_JOB_FOR_FILE, + TASK_COMPILE_SOLIDITY_GET_DEPENDENCY_GRAPH, ++ TASK_COMPILE_SOLIDITY_GET_SOURCE_NAMES, ++ TASK_COMPILE_SOLIDITY_GET_SOURCE_PATHS, ++ TASK_COMPILE_SOLIDITY_HANDLE_COMPILATION_JOBS_FAILURES, ++ TASK_COMPILE_SOLIDITY_MERGE_COMPILATION_JOBS, + } from "hardhat/builtin-tasks/task-names"; + import { extendConfig, subtask, task, types } from "hardhat/config"; + import { NomicLabsHardhatPluginError } from "hardhat/plugins"; +@@ -10,6 +16,7 @@ import { + ActionType, + Artifacts, + CompilationJob, ++ CompilationJobsCreationResult, + CompilerInput, + CompilerOutput, + DependencyGraph, +@@ -33,6 +40,7 @@ import { + TASK_VERIFY_GET_ETHERSCAN_ENDPOINT, + TASK_VERIFY_GET_LIBRARIES, + TASK_VERIFY_GET_MINIMUM_BUILD, ++ TASK_VERIFY_GET_FULL_BUILD, + TASK_VERIFY_VERIFY, + TASK_VERIFY_VERIFY_MINIMUM_BUILD, + } from "./constants"; +@@ -292,9 +300,17 @@ Possible causes are: + ? contractInformation.solcVersion + : await getLongVersion(contractInformation.solcVersion); + +- const minimumBuild: Build = await run(TASK_VERIFY_GET_MINIMUM_BUILD, { +- sourceName: contractInformation.sourceName, +- }); ++ let minimumBuild: Build; ++ try { ++ minimumBuild = await run(TASK_VERIFY_GET_MINIMUM_BUILD, { ++ sourceName: contractInformation.sourceName, ++ }); ++ } catch (error) { ++ console.warn('Unable to produce minimum build, proceeding to use full build...') ++ minimumBuild = await run(TASK_VERIFY_GET_FULL_BUILD, { ++ sourceName: contractInformation.sourceName, ++ }); ++ } + + const success: boolean = await run(TASK_VERIFY_VERIFY_MINIMUM_BUILD, { + minimumBuild, +@@ -531,7 +547,74 @@ const getMinimumBuild: ActionType = async function ( + emitsArtifacts: false, + quiet: true, + }); ++ return build; ++}; ++ ++const getFullBuild: ActionType = async function ( ++ { sourceName }, ++ { run } ++): Promise { ++ const sourcePaths: string[] = await run( ++ TASK_COMPILE_SOLIDITY_GET_SOURCE_PATHS ++ ); ++ ++ const sourceNames: string[] = await run( ++ TASK_COMPILE_SOLIDITY_GET_SOURCE_NAMES, ++ { ++ sourcePaths, ++ } ++ ); ++ ++ const dependencyGraph: DependencyGraph = await run( ++ TASK_COMPILE_SOLIDITY_GET_DEPENDENCY_GRAPH, ++ { sourceNames } ++ ); ++ ++ const resolvedFiles = dependencyGraph ++ .getResolvedFiles() ++ .filter((resolvedFile) => { ++ return resolvedFile.sourceName === sourceName; ++ }); ++ assertHardhatPluginInvariant( ++ resolvedFiles.length === 1, ++ `The plugin found an unexpected number of files for this contract.` ++ ); ++ ++ const compilationJobsCreationResult: CompilationJobsCreationResult = ++ await run(TASK_COMPILE_SOLIDITY_GET_COMPILATION_JOBS, { ++ dependencyGraph, ++ }); ++ await run(TASK_COMPILE_SOLIDITY_HANDLE_COMPILATION_JOBS_FAILURES, { ++ compilationJobsCreationErrors: compilationJobsCreationResult.errors, ++ }); ++ ++ const compilationJobs = compilationJobsCreationResult.jobs; ++ ++ // const filteredCompilationJobs: CompilationJob[] = await run( ++ // TASK_COMPILE_SOLIDITY_FILTER_COMPILATION_JOBS, ++ // { compilationJobs, force: false } ++ // ); ++ ++ const mergedCompilationJobs: CompilationJob[] = await run( ++ TASK_COMPILE_SOLIDITY_MERGE_COMPILATION_JOBS, ++ { compilationJobs: compilationJobs } ++ ); + ++ const targetCompilationJobs = mergedCompilationJobs.filter((cj) => { ++ return ( ++ cj.getResolvedFiles().filter((f) => f.sourceName === sourceName).length > ++ 0 ++ ); ++ }); ++ const compilationJob = targetCompilationJobs[0]; ++ ++ const build: Build = await run(TASK_COMPILE_SOLIDITY_COMPILE_JOB, { ++ compilationJob, ++ compilationJobs: [compilationJob], ++ compilationJobIndex: 0, ++ emitsArtifacts: false, ++ quiet: true, ++ }); + return build; + }; + +@@ -807,6 +890,10 @@ subtask(TASK_VERIFY_GET_MINIMUM_BUILD) + .addParam("sourceName", undefined, undefined, types.string) + .setAction(getMinimumBuild); + ++subtask(TASK_VERIFY_GET_FULL_BUILD) ++ .addParam("sourceName", undefined, undefined, types.string) ++ .setAction(getFullBuild); ++ + task(TASK_VERIFY, "Verifies contract on Etherscan") + .addOptionalPositionalParam( + "address", From c3511104e487b6885f9508f0ce0267fb737e98c2 Mon Sep 17 00:00:00 2001 From: Goran Vladika Date: Tue, 12 Sep 2023 20:13:48 +0200 Subject: [PATCH 086/292] Revert "Remove uneccessary dependencies" This reverts commit 60a1e5019e8a5c4d073f70f1714ab423969137ef. --- package.json | 2 + yarn.lock | 5666 +++++++++++++++++++++++++++----------------------- 2 files changed, 3009 insertions(+), 2659 deletions(-) diff --git a/package.json b/package.json index da87cd57..457ab06c 100644 --- a/package.json +++ b/package.json @@ -35,6 +35,8 @@ "deploy-erc20-rollup": "hardhat run scripts/createERC20Rollup.ts" }, "dependencies": { + "@arbitrum/sdk": "^3.1.3", + "@ethersproject/providers": "^5.7.2", "@offchainlabs/upgrade-executor": "1.1.0-beta.0", "@openzeppelin/contracts": "4.5.0", "@openzeppelin/contracts-upgradeable": "4.5.2", diff --git a/yarn.lock b/yarn.lock index 23b7ba12..aeaaadee 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2,20 +2,15 @@ # yarn lockfile v1 -"@aashutoshrathi/word-wrap@^1.2.3": - version "1.2.6" - resolved "https://registry.yarnpkg.com/@aashutoshrathi/word-wrap/-/word-wrap-1.2.6.tgz#bd9154aec9983f77b3a034ecaa015c2e4201f6cf" - integrity sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA== - "@aduh95/viz.js@^3.7.0": version "3.7.0" resolved "https://registry.yarnpkg.com/@aduh95/viz.js/-/viz.js-3.7.0.tgz#a20d86c5fc8f6abebdc39b96a4326e10375d77c0" integrity sha512-20Pk2Z98fbPLkECcrZSJszKos/OgtvJJR3NcbVfgCJ6EQjDNzW2P1BKqImOz3tJ952dvO2DWEhcLhQ1Wz1e9ng== "@arbitrum/sdk@^3.1.3": - version "3.1.10" - resolved "https://registry.yarnpkg.com/@arbitrum/sdk/-/sdk-3.1.10.tgz#ea8148c843ee38b24d1478fa283c1c34ee9561d7" - integrity sha512-aOxkk1A4XBrKJTGpz9da1EyXIkJu4c+wm/9PpTscdjNT268ZKXLTextN7qCs9JwoL1icFOyuH1R1u9mnjUSXkg== + version "3.1.3" + resolved "https://registry.yarnpkg.com/@arbitrum/sdk/-/sdk-3.1.3.tgz#75236043717a450b569faaa087687c51d525b0c3" + integrity sha512-Dn1or7/Guc3dItuiiWaoYQ37aCDwiWTZGPIrg4yBJW27BgiDGbo0mjPDAhKTh4p5NDOWyE8bZ0vZai86COZIUA== dependencies: "@ethersproject/address" "^5.0.8" "@ethersproject/bignumber" "^5.1.1" @@ -23,69 +18,37 @@ ethers "^5.1.0" "@babel/code-frame@^7.0.0": - version "7.22.13" - resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.22.13.tgz#e3c1c099402598483b7a8c46a721d1038803755e" - integrity sha512-XktuhWlJ5g+3TJXc5upd9Ks1HutSArik6jf2eAjYFyIOf4ej3RN+184cZbzDvbPnuTJIUhPKKJE3cIsYTiAT3w== + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.16.7.tgz#44416b6bd7624b998f5b1af5d470856c40138789" + integrity sha512-iAXqUn8IIeBTNd72xsFlgaXHkMBMt6y4HJp1tIaK465CWLT/fG1aqB7ykr95gHHmlBdGbFeWWfyB4NJJ0nmeIg== dependencies: - "@babel/highlight" "^7.22.13" - chalk "^2.4.2" + "@babel/highlight" "^7.16.7" -"@babel/helper-validator-identifier@^7.22.5": - version "7.22.15" - resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.15.tgz#601fa28e4cc06786c18912dca138cec73b882044" - integrity sha512-4E/F9IIEi8WR94324mbDUMo074YTheJmd7eZF5vITTeYchqAi6sYXRLHUVsmkdmY4QjfKTcB2jB7dVP3NaBElQ== +"@babel/helper-validator-identifier@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.16.7.tgz#e8c602438c4a8195751243da9031d1607d247cad" + integrity sha512-hsEnFemeiW4D08A5gUAZxLBTXpZ39P+a+DGDsHw1yxqyQ/jzFEnxf5uTEGp+3bzAbNOxU1paTgYS4ECU/IgfDw== -"@babel/highlight@^7.22.13": - version "7.22.13" - resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.22.13.tgz#9cda839e5d3be9ca9e8c26b6dd69e7548f0cbf16" - integrity sha512-C/BaXcnnvBCmHTpz/VGZ8jgtE2aYlW4hxDhseJAWZb7gqGM/qtCK6iZUb0TyKFf7BOUsBH7Q7fkRsDRhg1XklQ== +"@babel/highlight@^7.16.7": + version "7.16.10" + resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.16.10.tgz#744f2eb81579d6eea753c227b0f570ad785aba88" + integrity sha512-5FnTQLSLswEj6IkgVw5KusNUUFY9ZGqe/TRFnP/BKYHYgfh7tc+C7mwiy95/yNP7Dh9x580Vv8r7u7ZfTBFxdw== dependencies: - "@babel/helper-validator-identifier" "^7.22.5" - chalk "^2.4.2" + "@babel/helper-validator-identifier" "^7.16.7" + chalk "^2.0.0" js-tokens "^4.0.0" -"@chainsafe/as-sha256@^0.3.1": - version "0.3.1" - resolved "https://registry.yarnpkg.com/@chainsafe/as-sha256/-/as-sha256-0.3.1.tgz#3639df0e1435cab03f4d9870cc3ac079e57a6fc9" - integrity sha512-hldFFYuf49ed7DAakWVXSJODuq3pzJEguD8tQ7h+sGkM18vja+OFoJI9krnGmgzyuZC2ETX0NOIcCTy31v2Mtg== - -"@chainsafe/persistent-merkle-tree@^0.4.2": - version "0.4.2" - resolved "https://registry.yarnpkg.com/@chainsafe/persistent-merkle-tree/-/persistent-merkle-tree-0.4.2.tgz#4c9ee80cc57cd3be7208d98c40014ad38f36f7ff" - integrity sha512-lLO3ihKPngXLTus/L7WHKaw9PnNJWizlOF1H9NNzHP6Xvh82vzg9F2bzkXhYIFshMZ2gTCEz8tq6STe7r5NDfQ== - dependencies: - "@chainsafe/as-sha256" "^0.3.1" - -"@chainsafe/persistent-merkle-tree@^0.5.0": - version "0.5.0" - resolved "https://registry.yarnpkg.com/@chainsafe/persistent-merkle-tree/-/persistent-merkle-tree-0.5.0.tgz#2b4a62c9489a5739dedd197250d8d2f5427e9f63" - integrity sha512-l0V1b5clxA3iwQLXP40zYjyZYospQLZXzBVIhhr9kDg/1qHZfzzHw0jj4VPBijfYCArZDlPkRi1wZaV2POKeuw== - dependencies: - "@chainsafe/as-sha256" "^0.3.1" - -"@chainsafe/ssz@^0.10.0": - version "0.10.2" - resolved "https://registry.yarnpkg.com/@chainsafe/ssz/-/ssz-0.10.2.tgz#c782929e1bb25fec66ba72e75934b31fd087579e" - integrity sha512-/NL3Lh8K+0q7A3LsiFq09YXS9fPE+ead2rr7vM2QK8PLzrNsw3uqrif9bpRX5UxgeRjM+vYi+boCM3+GM4ovXg== - dependencies: - "@chainsafe/as-sha256" "^0.3.1" - "@chainsafe/persistent-merkle-tree" "^0.5.0" - -"@chainsafe/ssz@^0.9.2": - version "0.9.4" - resolved "https://registry.yarnpkg.com/@chainsafe/ssz/-/ssz-0.9.4.tgz#696a8db46d6975b600f8309ad3a12f7c0e310497" - integrity sha512-77Qtg2N1ayqs4Bg/wvnWfg5Bta7iy7IRh8XqXh7oNMeP2HBbBwx8m6yTpA8p0EHItWPEBkgZd5S5/LSlp3GXuQ== - dependencies: - "@chainsafe/as-sha256" "^0.3.1" - "@chainsafe/persistent-merkle-tree" "^0.4.2" - case "^1.6.3" +"@cspotcode/source-map-consumer@0.8.0": + version "0.8.0" + resolved "https://registry.yarnpkg.com/@cspotcode/source-map-consumer/-/source-map-consumer-0.8.0.tgz#33bf4b7b39c178821606f669bbc447a6a629786b" + integrity sha512-41qniHzTU8yAGbCp04ohlmSrZf8bkf/iJsl3V0dRGsQN/5GFfx+LbCSsCpp2gqrqjTVg/K6O8ycoV35JIwAzAg== -"@cspotcode/source-map-support@^0.8.0": - version "0.8.1" - resolved "https://registry.yarnpkg.com/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz#00629c35a688e05a88b1cda684fb9d5e73f000a1" - integrity sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw== +"@cspotcode/source-map-support@0.7.0": + version "0.7.0" + resolved "https://registry.yarnpkg.com/@cspotcode/source-map-support/-/source-map-support-0.7.0.tgz#4789840aa859e46d2f3173727ab707c66bf344f5" + integrity sha512-X4xqRHqN8ACt2aHVe51OxeA2HjbcL4MqFqXkrmQszJ1NOUuUu5u6Vqx/0lZSVNku7velL5FC/s5uEAj1lsBMhA== dependencies: - "@jridgewell/trace-mapping" "0.3.9" + "@cspotcode/source-map-consumer" "0.8.0" "@ensdomains/ens@^0.4.4": version "0.4.5" @@ -103,38 +66,21 @@ resolved "https://registry.yarnpkg.com/@ensdomains/resolver/-/resolver-0.2.4.tgz#c10fe28bf5efbf49bff4666d909aed0265efbc89" integrity sha512-bvaTH34PMCbv6anRa9I/0zjLJgY4EuznbEMgbV77JBCQ9KNC46rzi0avuxpOfu+xDjPEtSFGqVEOr5GlUSGudA== -"@eslint-community/eslint-utils@^4.2.0": - version "4.4.0" - resolved "https://registry.yarnpkg.com/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz#a23514e8fb9af1269d5f7788aa556798d61c6b59" - integrity sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA== - dependencies: - eslint-visitor-keys "^3.3.0" - -"@eslint-community/regexpp@^4.4.0", "@eslint-community/regexpp@^4.6.1": - version "4.8.1" - resolved "https://registry.yarnpkg.com/@eslint-community/regexpp/-/regexpp-4.8.1.tgz#8c4bb756cc2aa7eaf13cfa5e69c83afb3260c20c" - integrity sha512-PWiOzLIUAjN/w5K17PoF4n6sKBw0gqLHPhywmYHP4t1VFQQVYeb1yWsJwnMVEMl3tUHME7X/SJPZLmtG7XBDxQ== - -"@eslint/eslintrc@^2.1.2": - version "2.1.2" - resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-2.1.2.tgz#c6936b4b328c64496692f76944e755738be62396" - integrity sha512-+wvgpDsrB1YqAMdEUCcnTlpfVBH7Vqn6A/NT3D8WVXFIaKMlErPIZT3oCIAVCOtarRpMtelZLqJeU3t7WY6X6g== +"@eslint/eslintrc@^1.3.2": + version "1.3.2" + resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-1.3.2.tgz#58b69582f3b7271d8fa67fe5251767a5b38ea356" + integrity sha512-AXYd23w1S/bv3fTs3Lz0vjiYemS08jWkI3hYyS9I1ry+0f+Yjs1wm+sU0BS8qDOPrBIkp4qHYC16I8uVtpLajQ== dependencies: ajv "^6.12.4" debug "^4.3.2" - espree "^9.6.0" - globals "^13.19.0" + espree "^9.4.0" + globals "^13.15.0" ignore "^5.2.0" import-fresh "^3.2.1" js-yaml "^4.1.0" minimatch "^3.1.2" strip-json-comments "^3.1.1" -"@eslint/js@8.49.0": - version "8.49.0" - resolved "https://registry.yarnpkg.com/@eslint/js/-/js-8.49.0.tgz#86f79756004a97fa4df866835093f1df3d03c333" - integrity sha512-1S8uAY/MTJqVx0SC4epBq+N2yhuwtNwLbJYNZyhL2pO1ZVKn5HFXav5T41Ryzy9K9V7ZId2JB2oy/W4aCd9/2w== - "@ethereum-waffle/chai@^3.4.4": version "3.4.4" resolved "https://registry.yarnpkg.com/@ethereum-waffle/chai/-/chai-3.4.4.tgz#16c4cc877df31b035d6d92486dfdf983df9138ff" @@ -188,51 +134,98 @@ patch-package "^6.2.2" postinstall-postinstall "^2.1.0" -"@ethereumjs/common@2.5.0": - version "2.5.0" - resolved "https://registry.yarnpkg.com/@ethereumjs/common/-/common-2.5.0.tgz#ec61551b31bef7a69d1dc634d8932468866a4268" - integrity sha512-DEHjW6e38o+JmB/NO3GZBpW4lpaiBpkFgXF6jLcJ6gETBYpEyaA5nTimsWBUJR3Vmtm/didUEbNjajskugZORg== +"@ethereumjs/block@^3.5.0", "@ethereumjs/block@^3.6.0", "@ethereumjs/block@^3.6.2": + version "3.6.2" + resolved "https://registry.yarnpkg.com/@ethereumjs/block/-/block-3.6.2.tgz#63d1e26d0b7a7a3684fce920de6ebabec1e5b674" + integrity sha512-mOqYWwMlAZpYUEOEqt7EfMFuVL2eyLqWWIzcf4odn6QgXY8jBI2NhVuJncrMCKeMZrsJAe7/auaRRB6YcdH+Qw== + dependencies: + "@ethereumjs/common" "^2.6.3" + "@ethereumjs/tx" "^3.5.1" + ethereumjs-util "^7.1.4" + merkle-patricia-tree "^4.2.4" + +"@ethereumjs/blockchain@^5.5.0", "@ethereumjs/blockchain@^5.5.2": + version "5.5.2" + resolved "https://registry.yarnpkg.com/@ethereumjs/blockchain/-/blockchain-5.5.2.tgz#1848abd9dc1ee56acf8cec4c84304d7f4667d027" + integrity sha512-Jz26iJmmsQtngerW6r5BDFaew/f2mObLrRZo3rskLOx1lmtMZ8+TX/vJexmivrnWgmAsTdNWhlKUYY4thPhPig== + dependencies: + "@ethereumjs/block" "^3.6.2" + "@ethereumjs/common" "^2.6.3" + "@ethereumjs/ethash" "^1.1.0" + debug "^4.3.3" + ethereumjs-util "^7.1.4" + level-mem "^5.0.1" + lru-cache "^5.1.1" + semaphore-async-await "^1.5.1" + +"@ethereumjs/common@^2.3.0": + version "2.6.0" + resolved "https://registry.yarnpkg.com/@ethereumjs/common/-/common-2.6.0.tgz#feb96fb154da41ee2cc2c5df667621a440f36348" + integrity sha512-Cq2qS0FTu6O2VU1sgg+WyU9Ps0M6j/BEMHN+hRaECXCV/r0aI78u4N6p52QW/BDVhwWZpCdrvG8X7NJdzlpNUA== dependencies: crc-32 "^1.2.0" - ethereumjs-util "^7.1.1" + ethereumjs-util "^7.1.3" -"@ethereumjs/common@^2.5.0", "@ethereumjs/common@^2.6.4": - version "2.6.5" - resolved "https://registry.yarnpkg.com/@ethereumjs/common/-/common-2.6.5.tgz#0a75a22a046272579d91919cb12d84f2756e8d30" - integrity sha512-lRyVQOeCDaIVtgfbowla32pzeDv2Obr8oR8Put5RdUBNRGr1VGPGQNGP6elWIpgK3YdpzqTOh4GyUGOureVeeA== +"@ethereumjs/common@^2.4.0": + version "2.6.2" + resolved "https://registry.yarnpkg.com/@ethereumjs/common/-/common-2.6.2.tgz#eb006c9329c75c80f634f340dc1719a5258244df" + integrity sha512-vDwye5v0SVeuDky4MtKsu+ogkH2oFUV8pBKzH/eNBzT8oI91pKa8WyzDuYuxOQsgNgv5R34LfFDh2aaw3H4HbQ== dependencies: crc-32 "^1.2.0" - ethereumjs-util "^7.1.5" - -"@ethereumjs/rlp@^4.0.1": - version "4.0.1" - resolved "https://registry.yarnpkg.com/@ethereumjs/rlp/-/rlp-4.0.1.tgz#626fabfd9081baab3d0a3074b0c7ecaf674aaa41" - integrity sha512-tqsQiBQDQdmPWE1xkkBq4rlSW5QZpLOUJ5RJh2/9fug+q9tnUhuZoVLk7s0scUIKTOzEtR72DFBXI4WiZcMpvw== + ethereumjs-util "^7.1.4" -"@ethereumjs/tx@3.3.2": - version "3.3.2" - resolved "https://registry.yarnpkg.com/@ethereumjs/tx/-/tx-3.3.2.tgz#348d4624bf248aaab6c44fec2ae67265efe3db00" - integrity sha512-6AaJhwg4ucmwTvw/1qLaZUX5miWrwZ4nLOUsKyb/HtzS3BMw/CasKhdi1ims9mBKeK9sOJCH4qGKOBGyJCeeog== +"@ethereumjs/common@^2.6.0", "@ethereumjs/common@^2.6.3": + version "2.6.3" + resolved "https://registry.yarnpkg.com/@ethereumjs/common/-/common-2.6.3.tgz#39ddece7300b336276bad6c02f6a9f1a082caa05" + integrity sha512-mQwPucDL7FDYIg9XQ8DL31CnIYZwGhU5hyOO5E+BMmT71G0+RHvIT5rIkLBirJEKxV6+Rcf9aEIY0kXInxUWpQ== dependencies: - "@ethereumjs/common" "^2.5.0" - ethereumjs-util "^7.1.2" + crc-32 "^1.2.0" + ethereumjs-util "^7.1.4" -"@ethereumjs/tx@^3.3.2": - version "3.5.2" - resolved "https://registry.yarnpkg.com/@ethereumjs/tx/-/tx-3.5.2.tgz#197b9b6299582ad84f9527ca961466fce2296c1c" - integrity sha512-gQDNJWKrSDGu2w7w0PzVXVBNMzb7wwdDOmOqczmhNjqFxFuIbhVJDwiGEnxFNC2/b8ifcZzY7MLcluizohRzNw== +"@ethereumjs/ethash@^1.1.0": + version "1.1.0" + resolved "https://registry.yarnpkg.com/@ethereumjs/ethash/-/ethash-1.1.0.tgz#7c5918ffcaa9cb9c1dc7d12f77ef038c11fb83fb" + integrity sha512-/U7UOKW6BzpA+Vt+kISAoeDie1vAvY4Zy2KF5JJb+So7+1yKmJeJEHOGSnQIj330e9Zyl3L5Nae6VZyh2TJnAA== dependencies: - "@ethereumjs/common" "^2.6.4" - ethereumjs-util "^7.1.5" + "@ethereumjs/block" "^3.5.0" + "@types/levelup" "^4.3.0" + buffer-xor "^2.0.1" + ethereumjs-util "^7.1.1" + miller-rabin "^4.0.0" -"@ethereumjs/util@^8.1.0": - version "8.1.0" - resolved "https://registry.yarnpkg.com/@ethereumjs/util/-/util-8.1.0.tgz#299df97fb6b034e0577ce9f94c7d9d1004409ed4" - integrity sha512-zQ0IqbdX8FZ9aw11vP+dZkKDkS+kgIvQPHnSAXzP9pLu+Rfu3D3XEeLbicvoXJTYnhZiPmsZUxgdzXwNKxRPbA== - dependencies: - "@ethereumjs/rlp" "^4.0.1" - ethereum-cryptography "^2.0.0" - micro-ftch "^0.3.1" +"@ethereumjs/tx@^3.2.1": + version "3.4.0" + resolved "https://registry.yarnpkg.com/@ethereumjs/tx/-/tx-3.4.0.tgz#7eb1947eefa55eb9cf05b3ca116fb7a3dbd0bce7" + integrity sha512-WWUwg1PdjHKZZxPPo274ZuPsJCWV3SqATrEKQP1n2DrVYVP1aZIYpo/mFaA0BDoE0tIQmBeimRCEA0Lgil+yYw== + dependencies: + "@ethereumjs/common" "^2.6.0" + ethereumjs-util "^7.1.3" + +"@ethereumjs/tx@^3.4.0", "@ethereumjs/tx@^3.5.1": + version "3.5.1" + resolved "https://registry.yarnpkg.com/@ethereumjs/tx/-/tx-3.5.1.tgz#8d941b83a602b4a89949c879615f7ea9a90e6671" + integrity sha512-xzDrTiu4sqZXUcaBxJ4n4W5FrppwxLxZB4ZDGVLtxSQR4lVuOnFR6RcUHdg1mpUhAPVrmnzLJpxaeXnPxIyhWA== + dependencies: + "@ethereumjs/common" "^2.6.3" + ethereumjs-util "^7.1.4" + +"@ethereumjs/vm@^5.6.0": + version "5.8.0" + resolved "https://registry.yarnpkg.com/@ethereumjs/vm/-/vm-5.8.0.tgz#c9055f96afc13dd7b72893b57fa20027effea6fe" + integrity sha512-mn2G2SX79QY4ckVvZUfxlNUpzwT2AEIkvgJI8aHoQaNYEHhH8rmdVDIaVVgz6//PjK52BZsK23afz+WvSR0Qqw== + dependencies: + "@ethereumjs/block" "^3.6.2" + "@ethereumjs/blockchain" "^5.5.2" + "@ethereumjs/common" "^2.6.3" + "@ethereumjs/tx" "^3.5.1" + async-eventemitter "^0.2.4" + core-js-pure "^3.0.1" + debug "^4.3.3" + ethereumjs-util "^7.1.4" + functional-red-black-tree "^1.0.1" + mcl-wasm "^0.7.1" + merkle-patricia-tree "^4.2.4" + rustbn.js "~0.2.0" "@ethersproject/abi@5.0.0-beta.153": version "5.0.0-beta.153" @@ -249,7 +242,52 @@ "@ethersproject/properties" ">=5.0.0-beta.131" "@ethersproject/strings" ">=5.0.0-beta.130" -"@ethersproject/abi@5.7.0", "@ethersproject/abi@^5.0.0-beta.146", "@ethersproject/abi@^5.1.2", "@ethersproject/abi@^5.5.0", "@ethersproject/abi@^5.6.3", "@ethersproject/abi@^5.7.0": +"@ethersproject/abi@5.0.7": + version "5.0.7" + resolved "https://registry.yarnpkg.com/@ethersproject/abi/-/abi-5.0.7.tgz#79e52452bd3ca2956d0e1c964207a58ad1a0ee7b" + integrity sha512-Cqktk+hSIckwP/W8O47Eef60VwmoSC/L3lY0+dIBhQPCNn9E4V7rwmm2aFrNRRDJfFlGuZ1khkQUOc3oBX+niw== + dependencies: + "@ethersproject/address" "^5.0.4" + "@ethersproject/bignumber" "^5.0.7" + "@ethersproject/bytes" "^5.0.4" + "@ethersproject/constants" "^5.0.4" + "@ethersproject/hash" "^5.0.4" + "@ethersproject/keccak256" "^5.0.3" + "@ethersproject/logger" "^5.0.5" + "@ethersproject/properties" "^5.0.3" + "@ethersproject/strings" "^5.0.4" + +"@ethersproject/abi@5.6.0", "@ethersproject/abi@^5.1.2", "@ethersproject/abi@^5.4.0", "@ethersproject/abi@^5.5.0": + version "5.6.0" + resolved "https://registry.yarnpkg.com/@ethersproject/abi/-/abi-5.6.0.tgz#ea07cbc1eec2374d32485679c12408005895e9f3" + integrity sha512-AhVByTwdXCc2YQ20v300w6KVHle9g2OFc28ZAFCPnJyEpkv1xKXjZcSTgWOlv1i+0dqlgF8RCF2Rn2KC1t+1Vg== + dependencies: + "@ethersproject/address" "^5.6.0" + "@ethersproject/bignumber" "^5.6.0" + "@ethersproject/bytes" "^5.6.0" + "@ethersproject/constants" "^5.6.0" + "@ethersproject/hash" "^5.6.0" + "@ethersproject/keccak256" "^5.6.0" + "@ethersproject/logger" "^5.6.0" + "@ethersproject/properties" "^5.6.0" + "@ethersproject/strings" "^5.6.0" + +"@ethersproject/abi@5.6.1", "@ethersproject/abi@^5.0.0-beta.146", "@ethersproject/abi@^5.6.0": + version "5.6.1" + resolved "https://registry.yarnpkg.com/@ethersproject/abi/-/abi-5.6.1.tgz#f7de888edeb56b0a657b672bdd1b3a1135cd14f7" + integrity sha512-0cqssYh6FXjlwKWBmLm3+zH2BNARoS5u/hxbz+LpQmcDB3w0W553h2btWui1/uZp2GBM/SI3KniTuMcYyHpA5w== + dependencies: + "@ethersproject/address" "^5.6.0" + "@ethersproject/bignumber" "^5.6.0" + "@ethersproject/bytes" "^5.6.0" + "@ethersproject/constants" "^5.6.0" + "@ethersproject/hash" "^5.6.0" + "@ethersproject/keccak256" "^5.6.0" + "@ethersproject/logger" "^5.6.0" + "@ethersproject/properties" "^5.6.0" + "@ethersproject/strings" "^5.6.0" + +"@ethersproject/abi@5.7.0", "@ethersproject/abi@^5.7.0": version "5.7.0" resolved "https://registry.yarnpkg.com/@ethersproject/abi/-/abi-5.7.0.tgz#b3f3e045bbbeed1af3947335c247ad625a44e449" integrity sha512-351ktp42TiRcYB3H1OP8yajPeAQstMW/yCFokj/AthP9bLHzQFPlOrxOcwYEDkUAICmOHljvN4K39OMTMUa9RA== @@ -264,6 +302,19 @@ "@ethersproject/properties" "^5.7.0" "@ethersproject/strings" "^5.7.0" +"@ethersproject/abstract-provider@5.6.0", "@ethersproject/abstract-provider@^5.6.0": + version "5.6.0" + resolved "https://registry.yarnpkg.com/@ethersproject/abstract-provider/-/abstract-provider-5.6.0.tgz#0c4ac7054650dbd9c476cf5907f588bbb6ef3061" + integrity sha512-oPMFlKLN+g+y7a79cLK3WiLcjWFnZQtXWgnLAbHZcN3s7L4v90UHpTOrLk+m3yr0gt+/h9STTM6zrr7PM8uoRw== + dependencies: + "@ethersproject/bignumber" "^5.6.0" + "@ethersproject/bytes" "^5.6.0" + "@ethersproject/logger" "^5.6.0" + "@ethersproject/networks" "^5.6.0" + "@ethersproject/properties" "^5.6.0" + "@ethersproject/transactions" "^5.6.0" + "@ethersproject/web" "^5.6.0" + "@ethersproject/abstract-provider@5.7.0", "@ethersproject/abstract-provider@^5.7.0": version "5.7.0" resolved "https://registry.yarnpkg.com/@ethersproject/abstract-provider/-/abstract-provider-5.7.0.tgz#b0a8550f88b6bf9d51f90e4795d48294630cb9ef" @@ -277,6 +328,17 @@ "@ethersproject/transactions" "^5.7.0" "@ethersproject/web" "^5.7.0" +"@ethersproject/abstract-signer@5.6.0", "@ethersproject/abstract-signer@^5.4.1", "@ethersproject/abstract-signer@^5.5.0", "@ethersproject/abstract-signer@^5.6.0": + version "5.6.0" + resolved "https://registry.yarnpkg.com/@ethersproject/abstract-signer/-/abstract-signer-5.6.0.tgz#9cd7ae9211c2b123a3b29bf47aab17d4d016e3e7" + integrity sha512-WOqnG0NJKtI8n0wWZPReHtaLkDByPL67tn4nBaDAhmVq8sjHTPbCdz4DRhVu/cfTOvfy9w3iq5QZ7BX7zw56BQ== + dependencies: + "@ethersproject/abstract-provider" "^5.6.0" + "@ethersproject/bignumber" "^5.6.0" + "@ethersproject/bytes" "^5.6.0" + "@ethersproject/logger" "^5.6.0" + "@ethersproject/properties" "^5.6.0" + "@ethersproject/abstract-signer@5.7.0", "@ethersproject/abstract-signer@^5.7.0": version "5.7.0" resolved "https://registry.yarnpkg.com/@ethersproject/abstract-signer/-/abstract-signer-5.7.0.tgz#13f4f32117868452191a4649723cb086d2b596b2" @@ -288,7 +350,18 @@ "@ethersproject/logger" "^5.7.0" "@ethersproject/properties" "^5.7.0" -"@ethersproject/address@5.7.0", "@ethersproject/address@>=5.0.0-beta.128", "@ethersproject/address@^5.0.2", "@ethersproject/address@^5.0.8", "@ethersproject/address@^5.7.0": +"@ethersproject/address@5.6.0", "@ethersproject/address@>=5.0.0-beta.128", "@ethersproject/address@^5.4.0", "@ethersproject/address@^5.5.0", "@ethersproject/address@^5.6.0": + version "5.6.0" + resolved "https://registry.yarnpkg.com/@ethersproject/address/-/address-5.6.0.tgz#13c49836d73e7885fc148ad633afad729da25012" + integrity sha512-6nvhYXjbXsHPS+30sHZ+U4VMagFC/9zAk6Gd/h3S21YW4+yfb0WfRtaAIZ4kfM4rrVwqiy284LP0GtL5HXGLxQ== + dependencies: + "@ethersproject/bignumber" "^5.6.0" + "@ethersproject/bytes" "^5.6.0" + "@ethersproject/keccak256" "^5.6.0" + "@ethersproject/logger" "^5.6.0" + "@ethersproject/rlp" "^5.6.0" + +"@ethersproject/address@5.7.0", "@ethersproject/address@^5.0.2", "@ethersproject/address@^5.0.8", "@ethersproject/address@^5.7.0": version "5.7.0" resolved "https://registry.yarnpkg.com/@ethersproject/address/-/address-5.7.0.tgz#19b56c4d74a3b0a46bfdbb6cfcc0a153fc697f37" integrity sha512-9wYhYt7aghVGo758POM5nqcOMaE168Q6aRLJZwUmiqSrAungkG74gSSeKEIR7ukixesdRZGPgVqme6vmxs1fkA== @@ -299,6 +372,24 @@ "@ethersproject/logger" "^5.7.0" "@ethersproject/rlp" "^5.7.0" +"@ethersproject/address@^5.0.4": + version "5.5.0" + resolved "https://registry.yarnpkg.com/@ethersproject/address/-/address-5.5.0.tgz#bcc6f576a553f21f3dd7ba17248f81b473c9c78f" + integrity sha512-l4Nj0eWlTUh6ro5IbPTgbpT4wRbdH5l8CQf7icF7sb/SI3Nhd9Y9HzhonTSTi6CefI0necIw7LJqQPopPLZyWw== + dependencies: + "@ethersproject/bignumber" "^5.5.0" + "@ethersproject/bytes" "^5.5.0" + "@ethersproject/keccak256" "^5.5.0" + "@ethersproject/logger" "^5.5.0" + "@ethersproject/rlp" "^5.5.0" + +"@ethersproject/base64@5.6.0", "@ethersproject/base64@^5.6.0": + version "5.6.0" + resolved "https://registry.yarnpkg.com/@ethersproject/base64/-/base64-5.6.0.tgz#a12c4da2a6fb86d88563216b0282308fc15907c9" + integrity sha512-2Neq8wxJ9xHxCF9TUgmKeSh9BXJ6OAxWfeGWvbauPh8FuHEjamgHilllx8KkSd5ErxyHIX7Xv3Fkcud2kY9ezw== + dependencies: + "@ethersproject/bytes" "^5.6.0" + "@ethersproject/base64@5.7.0", "@ethersproject/base64@^5.7.0": version "5.7.0" resolved "https://registry.yarnpkg.com/@ethersproject/base64/-/base64-5.7.0.tgz#ac4ee92aa36c1628173e221d0d01f53692059e1c" @@ -306,6 +397,14 @@ dependencies: "@ethersproject/bytes" "^5.7.0" +"@ethersproject/basex@5.6.0", "@ethersproject/basex@^5.6.0": + version "5.6.0" + resolved "https://registry.yarnpkg.com/@ethersproject/basex/-/basex-5.6.0.tgz#9ea7209bf0a1c3ddc2a90f180c3a7f0d7d2e8a69" + integrity sha512-qN4T+hQd/Md32MoJpc69rOwLYRUXwjTlhHDIeUkUmiN/JyWkkLLMoG0TqvSQKNqZOMgN5stbUYN6ILC+eD7MEQ== + dependencies: + "@ethersproject/bytes" "^5.6.0" + "@ethersproject/properties" "^5.6.0" + "@ethersproject/basex@5.7.0", "@ethersproject/basex@^5.7.0": version "5.7.0" resolved "https://registry.yarnpkg.com/@ethersproject/basex/-/basex-5.7.0.tgz#97034dc7e8938a8ca943ab20f8a5e492ece4020b" @@ -314,7 +413,16 @@ "@ethersproject/bytes" "^5.7.0" "@ethersproject/properties" "^5.7.0" -"@ethersproject/bignumber@5.7.0", "@ethersproject/bignumber@>=5.0.0-beta.130", "@ethersproject/bignumber@^5.1.1", "@ethersproject/bignumber@^5.7.0": +"@ethersproject/bignumber@5.6.0", "@ethersproject/bignumber@>=5.0.0-beta.130", "@ethersproject/bignumber@^5.4.1", "@ethersproject/bignumber@^5.5.0", "@ethersproject/bignumber@^5.6.0": + version "5.6.0" + resolved "https://registry.yarnpkg.com/@ethersproject/bignumber/-/bignumber-5.6.0.tgz#116c81b075c57fa765a8f3822648cf718a8a0e26" + integrity sha512-VziMaXIUHQlHJmkv1dlcd6GY2PmT0khtAqaMctCIDogxkrarMzA9L94KN1NeXqqOfFD6r0sJT3vCTOFSmZ07DA== + dependencies: + "@ethersproject/bytes" "^5.6.0" + "@ethersproject/logger" "^5.6.0" + bn.js "^4.11.9" + +"@ethersproject/bignumber@5.7.0", "@ethersproject/bignumber@^5.1.1", "@ethersproject/bignumber@^5.7.0": version "5.7.0" resolved "https://registry.yarnpkg.com/@ethersproject/bignumber/-/bignumber-5.7.0.tgz#e2f03837f268ba655ffba03a57853e18a18dc9c2" integrity sha512-n1CAdIHRWjSucQO3MC1zPSVgV/6dy/fjL9pMrPP9peL+QxEg9wOsVqwD4+818B6LUEtaXzVHQiuivzRoxPxUGw== @@ -323,21 +431,74 @@ "@ethersproject/logger" "^5.7.0" bn.js "^5.2.1" -"@ethersproject/bytes@5.7.0", "@ethersproject/bytes@>=5.0.0-beta.129", "@ethersproject/bytes@^5.0.8", "@ethersproject/bytes@^5.7.0": +"@ethersproject/bignumber@^5.0.7": + version "5.5.0" + resolved "https://registry.yarnpkg.com/@ethersproject/bignumber/-/bignumber-5.5.0.tgz#875b143f04a216f4f8b96245bde942d42d279527" + integrity sha512-6Xytlwvy6Rn3U3gKEc1vP7nR92frHkv6wtVr95LFR3jREXiCPzdWxKQ1cx4JGQBXxcguAwjA8murlYN2TSiEbg== + dependencies: + "@ethersproject/bytes" "^5.5.0" + "@ethersproject/logger" "^5.5.0" + bn.js "^4.11.9" + +"@ethersproject/bytes@5.6.1", "@ethersproject/bytes@>=5.0.0-beta.129", "@ethersproject/bytes@^5.4.0", "@ethersproject/bytes@^5.5.0", "@ethersproject/bytes@^5.6.0": + version "5.6.1" + resolved "https://registry.yarnpkg.com/@ethersproject/bytes/-/bytes-5.6.1.tgz#24f916e411f82a8a60412344bf4a813b917eefe7" + integrity sha512-NwQt7cKn5+ZE4uDn+X5RAXLp46E1chXoaMmrxAyA0rblpxz8t58lVkrHXoRIn0lz1joQElQ8410GqhTqMOwc6g== + dependencies: + "@ethersproject/logger" "^5.6.0" + +"@ethersproject/bytes@5.7.0", "@ethersproject/bytes@^5.0.8", "@ethersproject/bytes@^5.7.0": version "5.7.0" resolved "https://registry.yarnpkg.com/@ethersproject/bytes/-/bytes-5.7.0.tgz#a00f6ea8d7e7534d6d87f47188af1148d71f155d" integrity sha512-nsbxwgFXWh9NyYWo+U8atvmMsSdKJprTcICAkvbBffT75qDocbuggBU0SJiVK2MuTrp0q+xvLkTnGMPK1+uA9A== dependencies: "@ethersproject/logger" "^5.7.0" -"@ethersproject/constants@5.7.0", "@ethersproject/constants@>=5.0.0-beta.128", "@ethersproject/constants@^5.7.0": +"@ethersproject/bytes@^5.0.4": + version "5.5.0" + resolved "https://registry.yarnpkg.com/@ethersproject/bytes/-/bytes-5.5.0.tgz#cb11c526de657e7b45d2e0f0246fb3b9d29a601c" + integrity sha512-ABvc7BHWhZU9PNM/tANm/Qx4ostPGadAuQzWTr3doklZOhDlmcBqclrQe/ZXUIj3K8wC28oYeuRa+A37tX9kog== + dependencies: + "@ethersproject/logger" "^5.5.0" + +"@ethersproject/constants@5.6.0", "@ethersproject/constants@>=5.0.0-beta.128", "@ethersproject/constants@^5.4.0", "@ethersproject/constants@^5.5.0", "@ethersproject/constants@^5.6.0": + version "5.6.0" + resolved "https://registry.yarnpkg.com/@ethersproject/constants/-/constants-5.6.0.tgz#55e3eb0918584d3acc0688e9958b0cedef297088" + integrity sha512-SrdaJx2bK0WQl23nSpV/b1aq293Lh0sUaZT/yYKPDKn4tlAbkH96SPJwIhwSwTsoQQZxuh1jnqsKwyymoiBdWA== + dependencies: + "@ethersproject/bignumber" "^5.6.0" + +"@ethersproject/constants@5.7.0", "@ethersproject/constants@^5.7.0": version "5.7.0" resolved "https://registry.yarnpkg.com/@ethersproject/constants/-/constants-5.7.0.tgz#df80a9705a7e08984161f09014ea012d1c75295e" integrity sha512-DHI+y5dBNvkpYUMiRQyxRBYBefZkJfo70VUkUAsRjcPs47muV9evftfZ0PJVCXYbAiCgght0DtcF9srFQmIgWA== dependencies: "@ethersproject/bignumber" "^5.7.0" -"@ethersproject/contracts@5.7.0", "@ethersproject/contracts@^5.7.0": +"@ethersproject/constants@^5.0.4": + version "5.5.0" + resolved "https://registry.yarnpkg.com/@ethersproject/constants/-/constants-5.5.0.tgz#d2a2cd7d94bd1d58377d1d66c4f53c9be4d0a45e" + integrity sha512-2MsRRVChkvMWR+GyMGY4N1sAX9Mt3J9KykCsgUFd/1mwS0UH1qw+Bv9k1UJb3X3YJYFco9H20pjSlOIfCG5HYQ== + dependencies: + "@ethersproject/bignumber" "^5.5.0" + +"@ethersproject/contracts@5.6.0", "@ethersproject/contracts@^5.4.1": + version "5.6.0" + resolved "https://registry.yarnpkg.com/@ethersproject/contracts/-/contracts-5.6.0.tgz#60f2cfc7addd99a865c6c8cfbbcec76297386067" + integrity sha512-74Ge7iqTDom0NX+mux8KbRUeJgu1eHZ3iv6utv++sLJG80FVuU9HnHeKVPfjd9s3woFhaFoQGf3B3iH/FrQmgw== + dependencies: + "@ethersproject/abi" "^5.6.0" + "@ethersproject/abstract-provider" "^5.6.0" + "@ethersproject/abstract-signer" "^5.6.0" + "@ethersproject/address" "^5.6.0" + "@ethersproject/bignumber" "^5.6.0" + "@ethersproject/bytes" "^5.6.0" + "@ethersproject/constants" "^5.6.0" + "@ethersproject/logger" "^5.6.0" + "@ethersproject/properties" "^5.6.0" + "@ethersproject/transactions" "^5.6.0" + +"@ethersproject/contracts@5.7.0": version "5.7.0" resolved "https://registry.yarnpkg.com/@ethersproject/contracts/-/contracts-5.7.0.tgz#c305e775abd07e48aa590e1a877ed5c316f8bd1e" integrity sha512-5GJbzEU3X+d33CdfPhcyS+z8MzsTrBGk/sc+G+59+tPa9yFkl6HQ9D6L0QMgNTA9q8dT0XKxxkyp883XsQvbbg== @@ -353,7 +514,21 @@ "@ethersproject/properties" "^5.7.0" "@ethersproject/transactions" "^5.7.0" -"@ethersproject/hash@5.7.0", "@ethersproject/hash@>=5.0.0-beta.128", "@ethersproject/hash@^5.7.0": +"@ethersproject/hash@5.6.0", "@ethersproject/hash@>=5.0.0-beta.128", "@ethersproject/hash@^5.6.0": + version "5.6.0" + resolved "https://registry.yarnpkg.com/@ethersproject/hash/-/hash-5.6.0.tgz#d24446a5263e02492f9808baa99b6e2b4c3429a2" + integrity sha512-fFd+k9gtczqlr0/BruWLAu7UAOas1uRRJvOR84uDf4lNZ+bTkGl366qvniUZHKtlqxBRU65MkOobkmvmpHU+jA== + dependencies: + "@ethersproject/abstract-signer" "^5.6.0" + "@ethersproject/address" "^5.6.0" + "@ethersproject/bignumber" "^5.6.0" + "@ethersproject/bytes" "^5.6.0" + "@ethersproject/keccak256" "^5.6.0" + "@ethersproject/logger" "^5.6.0" + "@ethersproject/properties" "^5.6.0" + "@ethersproject/strings" "^5.6.0" + +"@ethersproject/hash@5.7.0", "@ethersproject/hash@^5.7.0": version "5.7.0" resolved "https://registry.yarnpkg.com/@ethersproject/hash/-/hash-5.7.0.tgz#eb7aca84a588508369562e16e514b539ba5240a7" integrity sha512-qX5WrQfnah1EFnO5zJv1v46a8HW0+E5xuBBDTwMFZLuVTx0tbU2kkx15NqdjxecrLGatQN9FGQKpb1FKdHCt+g== @@ -368,6 +543,38 @@ "@ethersproject/properties" "^5.7.0" "@ethersproject/strings" "^5.7.0" +"@ethersproject/hash@^5.0.4": + version "5.5.0" + resolved "https://registry.yarnpkg.com/@ethersproject/hash/-/hash-5.5.0.tgz#7cee76d08f88d1873574c849e0207dcb32380cc9" + integrity sha512-dnGVpK1WtBjmnp3mUT0PlU2MpapnwWI0PibldQEq1408tQBAbZpPidkWoVVuNMOl/lISO3+4hXZWCL3YV7qzfg== + dependencies: + "@ethersproject/abstract-signer" "^5.5.0" + "@ethersproject/address" "^5.5.0" + "@ethersproject/bignumber" "^5.5.0" + "@ethersproject/bytes" "^5.5.0" + "@ethersproject/keccak256" "^5.5.0" + "@ethersproject/logger" "^5.5.0" + "@ethersproject/properties" "^5.5.0" + "@ethersproject/strings" "^5.5.0" + +"@ethersproject/hdnode@5.6.0", "@ethersproject/hdnode@^5.6.0": + version "5.6.0" + resolved "https://registry.yarnpkg.com/@ethersproject/hdnode/-/hdnode-5.6.0.tgz#9dcbe8d629bbbcf144f2cae476337fe92d320998" + integrity sha512-61g3Jp3nwDqJcL/p4nugSyLrpl/+ChXIOtCEM8UDmWeB3JCAt5FoLdOMXQc3WWkc0oM2C0aAn6GFqqMcS/mHTw== + dependencies: + "@ethersproject/abstract-signer" "^5.6.0" + "@ethersproject/basex" "^5.6.0" + "@ethersproject/bignumber" "^5.6.0" + "@ethersproject/bytes" "^5.6.0" + "@ethersproject/logger" "^5.6.0" + "@ethersproject/pbkdf2" "^5.6.0" + "@ethersproject/properties" "^5.6.0" + "@ethersproject/sha2" "^5.6.0" + "@ethersproject/signing-key" "^5.6.0" + "@ethersproject/strings" "^5.6.0" + "@ethersproject/transactions" "^5.6.0" + "@ethersproject/wordlists" "^5.6.0" + "@ethersproject/hdnode@5.7.0", "@ethersproject/hdnode@^5.7.0": version "5.7.0" resolved "https://registry.yarnpkg.com/@ethersproject/hdnode/-/hdnode-5.7.0.tgz#e627ddc6b466bc77aebf1a6b9e47405ca5aef9cf" @@ -386,6 +593,25 @@ "@ethersproject/transactions" "^5.7.0" "@ethersproject/wordlists" "^5.7.0" +"@ethersproject/json-wallets@5.6.0", "@ethersproject/json-wallets@^5.6.0": + version "5.6.0" + resolved "https://registry.yarnpkg.com/@ethersproject/json-wallets/-/json-wallets-5.6.0.tgz#4c2fc27f17e36c583e7a252fb938bc46f98891e5" + integrity sha512-fmh86jViB9r0ibWXTQipxpAGMiuxoqUf78oqJDlCAJXgnJF024hOOX7qVgqsjtbeoxmcLwpPsXNU0WEe/16qPQ== + dependencies: + "@ethersproject/abstract-signer" "^5.6.0" + "@ethersproject/address" "^5.6.0" + "@ethersproject/bytes" "^5.6.0" + "@ethersproject/hdnode" "^5.6.0" + "@ethersproject/keccak256" "^5.6.0" + "@ethersproject/logger" "^5.6.0" + "@ethersproject/pbkdf2" "^5.6.0" + "@ethersproject/properties" "^5.6.0" + "@ethersproject/random" "^5.6.0" + "@ethersproject/strings" "^5.6.0" + "@ethersproject/transactions" "^5.6.0" + aes-js "3.0.0" + scrypt-js "3.0.1" + "@ethersproject/json-wallets@5.7.0", "@ethersproject/json-wallets@^5.7.0": version "5.7.0" resolved "https://registry.yarnpkg.com/@ethersproject/json-wallets/-/json-wallets-5.7.0.tgz#5e3355287b548c32b368d91014919ebebddd5360" @@ -405,7 +631,15 @@ aes-js "3.0.0" scrypt-js "3.0.1" -"@ethersproject/keccak256@5.7.0", "@ethersproject/keccak256@>=5.0.0-beta.127", "@ethersproject/keccak256@^5.7.0": +"@ethersproject/keccak256@5.6.0", "@ethersproject/keccak256@>=5.0.0-beta.127", "@ethersproject/keccak256@^5.5.0", "@ethersproject/keccak256@^5.6.0": + version "5.6.0" + resolved "https://registry.yarnpkg.com/@ethersproject/keccak256/-/keccak256-5.6.0.tgz#fea4bb47dbf8f131c2e1774a1cecbfeb9d606459" + integrity sha512-tk56BJ96mdj/ksi7HWZVWGjCq0WVl/QvfhFQNeL8fxhBlGoP+L80uDCiQcpJPd+2XxkivS3lwRm3E0CXTfol0w== + dependencies: + "@ethersproject/bytes" "^5.6.0" + js-sha3 "0.8.0" + +"@ethersproject/keccak256@5.7.0", "@ethersproject/keccak256@^5.7.0": version "5.7.0" resolved "https://registry.yarnpkg.com/@ethersproject/keccak256/-/keccak256-5.7.0.tgz#3186350c6e1cd6aba7940384ec7d6d9db01f335a" integrity sha512-2UcPboeL/iW+pSg6vZ6ydF8tCnv3Iu/8tUmLLzWWGzxWKFFqOBQFLo6uLUv6BDrLgCDfN28RJ/wtByx+jZ4KBg== @@ -413,18 +647,65 @@ "@ethersproject/bytes" "^5.7.0" js-sha3 "0.8.0" -"@ethersproject/logger@5.7.0", "@ethersproject/logger@>=5.0.0-beta.129", "@ethersproject/logger@^5.7.0": +"@ethersproject/keccak256@^5.0.3": + version "5.5.0" + resolved "https://registry.yarnpkg.com/@ethersproject/keccak256/-/keccak256-5.5.0.tgz#e4b1f9d7701da87c564ffe336f86dcee82983492" + integrity sha512-5VoFCTjo2rYbBe1l2f4mccaRFN/4VQEYFwwn04aJV2h7qf4ZvI2wFxUE1XOX+snbwCLRzIeikOqtAoPwMza9kg== + dependencies: + "@ethersproject/bytes" "^5.5.0" + js-sha3 "0.8.0" + +"@ethersproject/logger@5.6.0", "@ethersproject/logger@>=5.0.0-beta.129", "@ethersproject/logger@^5.5.0", "@ethersproject/logger@^5.6.0": + version "5.6.0" + resolved "https://registry.yarnpkg.com/@ethersproject/logger/-/logger-5.6.0.tgz#d7db1bfcc22fd2e4ab574cba0bb6ad779a9a3e7a" + integrity sha512-BiBWllUROH9w+P21RzoxJKzqoqpkyM1pRnEKG69bulE9TSQD8SAIvTQqIMZmmCO8pUNkgLP1wndX1gKghSpBmg== + +"@ethersproject/logger@5.7.0", "@ethersproject/logger@^5.7.0": version "5.7.0" resolved "https://registry.yarnpkg.com/@ethersproject/logger/-/logger-5.7.0.tgz#6ce9ae168e74fecf287be17062b590852c311892" integrity sha512-0odtFdXu/XHtjQXJYA3u9G0G8btm0ND5Cu8M7i5vhEcE8/HmF4Lbdqanwyv4uQTr2tx6b7fQRmgLrsnpQlmnig== -"@ethersproject/networks@5.7.1", "@ethersproject/networks@^5.7.0": +"@ethersproject/logger@^5.0.5": + version "5.5.0" + resolved "https://registry.yarnpkg.com/@ethersproject/logger/-/logger-5.5.0.tgz#0c2caebeff98e10aefa5aef27d7441c7fd18cf5d" + integrity sha512-rIY/6WPm7T8n3qS2vuHTUBPdXHl+rGxWxW5okDfo9J4Z0+gRRZT0msvUdIJkE4/HS29GUMziwGaaKO2bWONBrg== + +"@ethersproject/networks@5.6.1": + version "5.6.1" + resolved "https://registry.yarnpkg.com/@ethersproject/networks/-/networks-5.6.1.tgz#7a21ed1f83e86121737b16841961ec99ccf5c9c7" + integrity sha512-b2rrupf3kCTcc3jr9xOWBuHylSFtbpJf79Ga7QR98ienU2UqGimPGEsYMgbI29KHJfA5Us89XwGVmxrlxmSrMg== + dependencies: + "@ethersproject/logger" "^5.6.0" + +"@ethersproject/networks@5.6.2", "@ethersproject/networks@^5.6.0": + version "5.6.2" + resolved "https://registry.yarnpkg.com/@ethersproject/networks/-/networks-5.6.2.tgz#2bacda62102c0b1fcee408315f2bed4f6fbdf336" + integrity sha512-9uEzaJY7j5wpYGTojGp8U89mSsgQLc40PCMJLMCnFXTs7nhBveZ0t7dbqWUNrepWTszDbFkYD6WlL8DKx5huHA== + dependencies: + "@ethersproject/logger" "^5.6.0" + +"@ethersproject/networks@5.7.0", "@ethersproject/networks@^5.7.0": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@ethersproject/networks/-/networks-5.7.0.tgz#df72a392f1a63a57f87210515695a31a245845ad" + integrity sha512-MG6oHSQHd4ebvJrleEQQ4HhVu8Ichr0RDYEfHzsVAVjHNM+w36x9wp9r+hf1JstMXtseXDtkiVoARAG6M959AA== + dependencies: + "@ethersproject/logger" "^5.7.0" + +"@ethersproject/networks@5.7.1": version "5.7.1" resolved "https://registry.yarnpkg.com/@ethersproject/networks/-/networks-5.7.1.tgz#118e1a981d757d45ccea6bb58d9fd3d9db14ead6" integrity sha512-n/MufjFYv3yFcUyfhnXotyDlNdFb7onmkSy8aQERi2PjNcnWQ66xXxa3XlS8nCcA8aJKJjIIMNJTC7tu80GwpQ== dependencies: "@ethersproject/logger" "^5.7.0" +"@ethersproject/pbkdf2@5.6.0", "@ethersproject/pbkdf2@^5.6.0": + version "5.6.0" + resolved "https://registry.yarnpkg.com/@ethersproject/pbkdf2/-/pbkdf2-5.6.0.tgz#04fcc2d7c6bff88393f5b4237d906a192426685a" + integrity sha512-Wu1AxTgJo3T3H6MIu/eejLFok9TYoSdgwRr5oGY1LTLfmGesDoSx05pemsbrPT2gG4cQME+baTSCp5sEo2erZQ== + dependencies: + "@ethersproject/bytes" "^5.6.0" + "@ethersproject/sha2" "^5.6.0" + "@ethersproject/pbkdf2@5.7.0", "@ethersproject/pbkdf2@^5.7.0": version "5.7.0" resolved "https://registry.yarnpkg.com/@ethersproject/pbkdf2/-/pbkdf2-5.7.0.tgz#d2267d0a1f6e123f3771007338c47cccd83d3102" @@ -433,14 +714,104 @@ "@ethersproject/bytes" "^5.7.0" "@ethersproject/sha2" "^5.7.0" -"@ethersproject/properties@5.7.0", "@ethersproject/properties@>=5.0.0-beta.131", "@ethersproject/properties@^5.7.0": +"@ethersproject/properties@5.6.0", "@ethersproject/properties@>=5.0.0-beta.131", "@ethersproject/properties@^5.5.0", "@ethersproject/properties@^5.6.0": + version "5.6.0" + resolved "https://registry.yarnpkg.com/@ethersproject/properties/-/properties-5.6.0.tgz#38904651713bc6bdd5bdd1b0a4287ecda920fa04" + integrity sha512-szoOkHskajKePTJSZ46uHUWWkbv7TzP2ypdEK6jGMqJaEt2sb0jCgfBo0gH0m2HBpRixMuJ6TBRaQCF7a9DoCg== + dependencies: + "@ethersproject/logger" "^5.6.0" + +"@ethersproject/properties@5.7.0", "@ethersproject/properties@^5.7.0": version "5.7.0" resolved "https://registry.yarnpkg.com/@ethersproject/properties/-/properties-5.7.0.tgz#a6e12cb0439b878aaf470f1902a176033067ed30" integrity sha512-J87jy8suntrAkIZtecpxEPxY//szqr1mlBaYlQ0r4RCaiD2hjheqF9s1LVE8vVuJCXisjIP+JgtK/Do54ej4Sw== dependencies: "@ethersproject/logger" "^5.7.0" -"@ethersproject/providers@5.7.2", "@ethersproject/providers@^5.7.1", "@ethersproject/providers@^5.7.2": +"@ethersproject/properties@^5.0.3": + version "5.5.0" + resolved "https://registry.yarnpkg.com/@ethersproject/properties/-/properties-5.5.0.tgz#61f00f2bb83376d2071baab02245f92070c59995" + integrity sha512-l3zRQg3JkD8EL3CPjNK5g7kMx4qSwiR60/uk5IVjd3oq1MZR5qUg40CNOoEJoX5wc3DyY5bt9EbMk86C7x0DNA== + dependencies: + "@ethersproject/logger" "^5.5.0" + +"@ethersproject/providers@5.6.2", "@ethersproject/providers@^5.4.4": + version "5.6.2" + resolved "https://registry.yarnpkg.com/@ethersproject/providers/-/providers-5.6.2.tgz#b9807b1c8c6f59fa2ee4b3cf6519724d07a9f422" + integrity sha512-6/EaFW/hNWz+224FXwl8+HdMRzVHt8DpPmu5MZaIQqx/K/ELnC9eY236SMV7mleCM3NnEArFwcAAxH5kUUgaRg== + dependencies: + "@ethersproject/abstract-provider" "^5.6.0" + "@ethersproject/abstract-signer" "^5.6.0" + "@ethersproject/address" "^5.6.0" + "@ethersproject/basex" "^5.6.0" + "@ethersproject/bignumber" "^5.6.0" + "@ethersproject/bytes" "^5.6.0" + "@ethersproject/constants" "^5.6.0" + "@ethersproject/hash" "^5.6.0" + "@ethersproject/logger" "^5.6.0" + "@ethersproject/networks" "^5.6.0" + "@ethersproject/properties" "^5.6.0" + "@ethersproject/random" "^5.6.0" + "@ethersproject/rlp" "^5.6.0" + "@ethersproject/sha2" "^5.6.0" + "@ethersproject/strings" "^5.6.0" + "@ethersproject/transactions" "^5.6.0" + "@ethersproject/web" "^5.6.0" + bech32 "1.1.4" + ws "7.4.6" + +"@ethersproject/providers@5.6.4": + version "5.6.4" + resolved "https://registry.yarnpkg.com/@ethersproject/providers/-/providers-5.6.4.tgz#1a49c211b57b0b2703c320819abbbfa35c83dff7" + integrity sha512-WAdknnaZ52hpHV3qPiJmKx401BLpup47h36Axxgre9zT+doa/4GC/Ne48ICPxTm0BqndpToHjpLP1ZnaxyE+vw== + dependencies: + "@ethersproject/abstract-provider" "^5.6.0" + "@ethersproject/abstract-signer" "^5.6.0" + "@ethersproject/address" "^5.6.0" + "@ethersproject/basex" "^5.6.0" + "@ethersproject/bignumber" "^5.6.0" + "@ethersproject/bytes" "^5.6.0" + "@ethersproject/constants" "^5.6.0" + "@ethersproject/hash" "^5.6.0" + "@ethersproject/logger" "^5.6.0" + "@ethersproject/networks" "^5.6.0" + "@ethersproject/properties" "^5.6.0" + "@ethersproject/random" "^5.6.0" + "@ethersproject/rlp" "^5.6.0" + "@ethersproject/sha2" "^5.6.0" + "@ethersproject/strings" "^5.6.0" + "@ethersproject/transactions" "^5.6.0" + "@ethersproject/web" "^5.6.0" + bech32 "1.1.4" + ws "7.4.6" + +"@ethersproject/providers@5.7.0": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@ethersproject/providers/-/providers-5.7.0.tgz#a885cfc7650a64385e7b03ac86fe9c2d4a9c2c63" + integrity sha512-+TTrrINMzZ0aXtlwO/95uhAggKm4USLm1PbeCBR/3XZ7+Oey+3pMyddzZEyRhizHpy1HXV0FRWRMI1O3EGYibA== + dependencies: + "@ethersproject/abstract-provider" "^5.7.0" + "@ethersproject/abstract-signer" "^5.7.0" + "@ethersproject/address" "^5.7.0" + "@ethersproject/base64" "^5.7.0" + "@ethersproject/basex" "^5.7.0" + "@ethersproject/bignumber" "^5.7.0" + "@ethersproject/bytes" "^5.7.0" + "@ethersproject/constants" "^5.7.0" + "@ethersproject/hash" "^5.7.0" + "@ethersproject/logger" "^5.7.0" + "@ethersproject/networks" "^5.7.0" + "@ethersproject/properties" "^5.7.0" + "@ethersproject/random" "^5.7.0" + "@ethersproject/rlp" "^5.7.0" + "@ethersproject/sha2" "^5.7.0" + "@ethersproject/strings" "^5.7.0" + "@ethersproject/transactions" "^5.7.0" + "@ethersproject/web" "^5.7.0" + bech32 "1.1.4" + ws "7.4.6" + +"@ethersproject/providers@5.7.2", "@ethersproject/providers@^5.7.2": version "5.7.2" resolved "https://registry.yarnpkg.com/@ethersproject/providers/-/providers-5.7.2.tgz#f8b1a4f275d7ce58cf0a2eec222269a08beb18cb" integrity sha512-g34EWZ1WWAVgr4aptGlVBF8mhl3VWjv+8hoAnzStu8Ah22VHBsuGzP17eb6xDVRzw895G4W7vvx60lFFur/1Rg== @@ -466,6 +837,14 @@ bech32 "1.1.4" ws "7.4.6" +"@ethersproject/random@5.6.0", "@ethersproject/random@^5.6.0": + version "5.6.0" + resolved "https://registry.yarnpkg.com/@ethersproject/random/-/random-5.6.0.tgz#1505d1ab6a250e0ee92f436850fa3314b2cb5ae6" + integrity sha512-si0PLcLjq+NG/XHSZz90asNf+YfKEqJGVdxoEkSukzbnBgC8rydbgbUgBbBGLeHN4kAJwUFEKsu3sCXT93YMsw== + dependencies: + "@ethersproject/bytes" "^5.6.0" + "@ethersproject/logger" "^5.6.0" + "@ethersproject/random@5.7.0", "@ethersproject/random@^5.7.0": version "5.7.0" resolved "https://registry.yarnpkg.com/@ethersproject/random/-/random-5.7.0.tgz#af19dcbc2484aae078bb03656ec05df66253280c" @@ -474,6 +853,14 @@ "@ethersproject/bytes" "^5.7.0" "@ethersproject/logger" "^5.7.0" +"@ethersproject/rlp@5.6.0", "@ethersproject/rlp@^5.5.0", "@ethersproject/rlp@^5.6.0": + version "5.6.0" + resolved "https://registry.yarnpkg.com/@ethersproject/rlp/-/rlp-5.6.0.tgz#55a7be01c6f5e64d6e6e7edb6061aa120962a717" + integrity sha512-dz9WR1xpcTL+9DtOT/aDO+YyxSSdO8YIS0jyZwHHSlAmnxA6cKU3TrTd4Xc/bHayctxTgGLYNuVVoiXE4tTq1g== + dependencies: + "@ethersproject/bytes" "^5.6.0" + "@ethersproject/logger" "^5.6.0" + "@ethersproject/rlp@5.7.0", "@ethersproject/rlp@^5.7.0": version "5.7.0" resolved "https://registry.yarnpkg.com/@ethersproject/rlp/-/rlp-5.7.0.tgz#de39e4d5918b9d74d46de93af80b7685a9c21304" @@ -482,6 +869,15 @@ "@ethersproject/bytes" "^5.7.0" "@ethersproject/logger" "^5.7.0" +"@ethersproject/sha2@5.6.0", "@ethersproject/sha2@^5.6.0": + version "5.6.0" + resolved "https://registry.yarnpkg.com/@ethersproject/sha2/-/sha2-5.6.0.tgz#364c4c11cc753bda36f31f001628706ebadb64d9" + integrity sha512-1tNWCPFLu1n3JM9t4/kytz35DkuF9MxqkGGEHNauEbaARdm2fafnOyw1s0tIQDPKF/7bkP1u3dbrmjpn5CelyA== + dependencies: + "@ethersproject/bytes" "^5.6.0" + "@ethersproject/logger" "^5.6.0" + hash.js "1.1.7" + "@ethersproject/sha2@5.7.0", "@ethersproject/sha2@^5.7.0": version "5.7.0" resolved "https://registry.yarnpkg.com/@ethersproject/sha2/-/sha2-5.7.0.tgz#9a5f7a7824ef784f7f7680984e593a800480c9fb" @@ -491,6 +887,18 @@ "@ethersproject/logger" "^5.7.0" hash.js "1.1.7" +"@ethersproject/signing-key@5.6.0", "@ethersproject/signing-key@^5.6.0": + version "5.6.0" + resolved "https://registry.yarnpkg.com/@ethersproject/signing-key/-/signing-key-5.6.0.tgz#4f02e3fb09e22b71e2e1d6dc4bcb5dafa69ce042" + integrity sha512-S+njkhowmLeUu/r7ir8n78OUKx63kBdMCPssePS89So1TH4hZqnWFsThEd/GiXYp9qMxVrydf7KdM9MTGPFukA== + dependencies: + "@ethersproject/bytes" "^5.6.0" + "@ethersproject/logger" "^5.6.0" + "@ethersproject/properties" "^5.6.0" + bn.js "^4.11.9" + elliptic "6.5.4" + hash.js "1.1.7" + "@ethersproject/signing-key@5.7.0", "@ethersproject/signing-key@^5.7.0": version "5.7.0" resolved "https://registry.yarnpkg.com/@ethersproject/signing-key/-/signing-key-5.7.0.tgz#06b2df39411b00bc57c7c09b01d1e41cf1b16ab3" @@ -503,7 +911,19 @@ elliptic "6.5.4" hash.js "1.1.7" -"@ethersproject/solidity@5.7.0", "@ethersproject/solidity@^5.7.0": +"@ethersproject/solidity@5.6.0", "@ethersproject/solidity@^5.4.0": + version "5.6.0" + resolved "https://registry.yarnpkg.com/@ethersproject/solidity/-/solidity-5.6.0.tgz#64657362a596bf7f5630bdc921c07dd78df06dc3" + integrity sha512-YwF52vTNd50kjDzqKaoNNbC/r9kMDPq3YzDWmsjFTRBcIF1y4JCQJ8gB30wsTfHbaxgxelI5BfxQSxD/PbJOww== + dependencies: + "@ethersproject/bignumber" "^5.6.0" + "@ethersproject/bytes" "^5.6.0" + "@ethersproject/keccak256" "^5.6.0" + "@ethersproject/logger" "^5.6.0" + "@ethersproject/sha2" "^5.6.0" + "@ethersproject/strings" "^5.6.0" + +"@ethersproject/solidity@5.7.0": version "5.7.0" resolved "https://registry.yarnpkg.com/@ethersproject/solidity/-/solidity-5.7.0.tgz#5e9c911d8a2acce2a5ebb48a5e2e0af20b631cb8" integrity sha512-HmabMd2Dt/raavyaGukF4XxizWKhKQ24DoLtdNbBmNKUOPqwjsKQSdV9GQtj9CBEea9DlzETlVER1gYeXXBGaA== @@ -515,7 +935,16 @@ "@ethersproject/sha2" "^5.7.0" "@ethersproject/strings" "^5.7.0" -"@ethersproject/strings@5.7.0", "@ethersproject/strings@>=5.0.0-beta.130", "@ethersproject/strings@^5.7.0": +"@ethersproject/strings@5.6.0", "@ethersproject/strings@>=5.0.0-beta.130", "@ethersproject/strings@^5.5.0", "@ethersproject/strings@^5.6.0": + version "5.6.0" + resolved "https://registry.yarnpkg.com/@ethersproject/strings/-/strings-5.6.0.tgz#9891b26709153d996bf1303d39a7f4bc047878fd" + integrity sha512-uv10vTtLTZqrJuqBZR862ZQjTIa724wGPWQqZrofaPI/kUsf53TBG0I0D+hQ1qyNtllbNzaW+PDPHHUI6/65Mg== + dependencies: + "@ethersproject/bytes" "^5.6.0" + "@ethersproject/constants" "^5.6.0" + "@ethersproject/logger" "^5.6.0" + +"@ethersproject/strings@5.7.0", "@ethersproject/strings@^5.7.0": version "5.7.0" resolved "https://registry.yarnpkg.com/@ethersproject/strings/-/strings-5.7.0.tgz#54c9d2a7c57ae8f1205c88a9d3a56471e14d5ed2" integrity sha512-/9nu+lj0YswRNSH0NXYqrh8775XNyEdUQAuf3f+SmOrnVewcJ5SBNAjF7lpgehKi4abvNNXyf+HX86czCdJ8Mg== @@ -524,7 +953,31 @@ "@ethersproject/constants" "^5.7.0" "@ethersproject/logger" "^5.7.0" -"@ethersproject/transactions@5.7.0", "@ethersproject/transactions@^5.0.0-beta.135", "@ethersproject/transactions@^5.6.2", "@ethersproject/transactions@^5.7.0": +"@ethersproject/strings@^5.0.4": + version "5.5.0" + resolved "https://registry.yarnpkg.com/@ethersproject/strings/-/strings-5.5.0.tgz#e6784d00ec6c57710755699003bc747e98c5d549" + integrity sha512-9fy3TtF5LrX/wTrBaT8FGE6TDJyVjOvXynXJz5MT5azq+E6D92zuKNx7i29sWW2FjVOaWjAsiZ1ZWznuduTIIQ== + dependencies: + "@ethersproject/bytes" "^5.5.0" + "@ethersproject/constants" "^5.5.0" + "@ethersproject/logger" "^5.5.0" + +"@ethersproject/transactions@5.6.0", "@ethersproject/transactions@^5.0.0-beta.135", "@ethersproject/transactions@^5.4.0", "@ethersproject/transactions@^5.6.0": + version "5.6.0" + resolved "https://registry.yarnpkg.com/@ethersproject/transactions/-/transactions-5.6.0.tgz#4b594d73a868ef6e1529a2f8f94a785e6791ae4e" + integrity sha512-4HX+VOhNjXHZyGzER6E/LVI2i6lf9ejYeWD6l4g50AdmimyuStKc39kvKf1bXWQMg7QNVh+uC7dYwtaZ02IXeg== + dependencies: + "@ethersproject/address" "^5.6.0" + "@ethersproject/bignumber" "^5.6.0" + "@ethersproject/bytes" "^5.6.0" + "@ethersproject/constants" "^5.6.0" + "@ethersproject/keccak256" "^5.6.0" + "@ethersproject/logger" "^5.6.0" + "@ethersproject/properties" "^5.6.0" + "@ethersproject/rlp" "^5.6.0" + "@ethersproject/signing-key" "^5.6.0" + +"@ethersproject/transactions@5.7.0", "@ethersproject/transactions@^5.7.0": version "5.7.0" resolved "https://registry.yarnpkg.com/@ethersproject/transactions/-/transactions-5.7.0.tgz#91318fc24063e057885a6af13fdb703e1f993d3b" integrity sha512-kmcNicCp1lp8qanMTC3RIikGgoJ80ztTyvtsFvCYpSCfkjhD0jZ2LOrnbcuxuToLIUYYf+4XwD1rP+B/erDIhQ== @@ -539,6 +992,15 @@ "@ethersproject/rlp" "^5.7.0" "@ethersproject/signing-key" "^5.7.0" +"@ethersproject/units@5.6.0": + version "5.6.0" + resolved "https://registry.yarnpkg.com/@ethersproject/units/-/units-5.6.0.tgz#e5cbb1906988f5740254a21b9ded6bd51e826d9c" + integrity sha512-tig9x0Qmh8qbo1w8/6tmtyrm/QQRviBh389EQ+d8fP4wDsBrJBf08oZfoiz1/uenKK9M78yAP4PoR7SsVoTjsw== + dependencies: + "@ethersproject/bignumber" "^5.6.0" + "@ethersproject/constants" "^5.6.0" + "@ethersproject/logger" "^5.6.0" + "@ethersproject/units@5.7.0": version "5.7.0" resolved "https://registry.yarnpkg.com/@ethersproject/units/-/units-5.7.0.tgz#637b563d7e14f42deeee39245275d477aae1d8b1" @@ -548,7 +1010,28 @@ "@ethersproject/constants" "^5.7.0" "@ethersproject/logger" "^5.7.0" -"@ethersproject/wallet@5.7.0", "@ethersproject/wallet@^5.7.0": +"@ethersproject/wallet@5.6.0", "@ethersproject/wallet@^5.4.0": + version "5.6.0" + resolved "https://registry.yarnpkg.com/@ethersproject/wallet/-/wallet-5.6.0.tgz#33d11a806d783864208f348709a5a3badac8e22a" + integrity sha512-qMlSdOSTyp0MBeE+r7SUhr1jjDlC1zAXB8VD84hCnpijPQiSNbxr6GdiLXxpUs8UKzkDiNYYC5DRI3MZr+n+tg== + dependencies: + "@ethersproject/abstract-provider" "^5.6.0" + "@ethersproject/abstract-signer" "^5.6.0" + "@ethersproject/address" "^5.6.0" + "@ethersproject/bignumber" "^5.6.0" + "@ethersproject/bytes" "^5.6.0" + "@ethersproject/hash" "^5.6.0" + "@ethersproject/hdnode" "^5.6.0" + "@ethersproject/json-wallets" "^5.6.0" + "@ethersproject/keccak256" "^5.6.0" + "@ethersproject/logger" "^5.6.0" + "@ethersproject/properties" "^5.6.0" + "@ethersproject/random" "^5.6.0" + "@ethersproject/signing-key" "^5.6.0" + "@ethersproject/transactions" "^5.6.0" + "@ethersproject/wordlists" "^5.6.0" + +"@ethersproject/wallet@5.7.0": version "5.7.0" resolved "https://registry.yarnpkg.com/@ethersproject/wallet/-/wallet-5.7.0.tgz#4e5d0790d96fe21d61d38fb40324e6c7ef350b2d" integrity sha512-MhmXlJXEJFBFVKrDLB4ZdDzxcBxQ3rLyCkhNqVu3CDYvR97E+8r01UgrI+TI99Le+aYm/in/0vp86guJuM7FCA== @@ -569,7 +1052,29 @@ "@ethersproject/transactions" "^5.7.0" "@ethersproject/wordlists" "^5.7.0" -"@ethersproject/web@5.7.1", "@ethersproject/web@^5.7.0": +"@ethersproject/web@5.6.0", "@ethersproject/web@^5.6.0": + version "5.6.0" + resolved "https://registry.yarnpkg.com/@ethersproject/web/-/web-5.6.0.tgz#4bf8b3cbc17055027e1a5dd3c357e37474eaaeb8" + integrity sha512-G/XHj0hV1FxI2teHRfCGvfBUHFmU+YOSbCxlAMqJklxSa7QMiHFQfAxvwY2PFqgvdkxEKwRNr/eCjfAPEm2Ctg== + dependencies: + "@ethersproject/base64" "^5.6.0" + "@ethersproject/bytes" "^5.6.0" + "@ethersproject/logger" "^5.6.0" + "@ethersproject/properties" "^5.6.0" + "@ethersproject/strings" "^5.6.0" + +"@ethersproject/web@5.7.0", "@ethersproject/web@^5.7.0": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@ethersproject/web/-/web-5.7.0.tgz#40850c05260edad8b54827923bbad23d96aac0bc" + integrity sha512-ApHcbbj+muRASVDSCl/tgxaH2LBkRMEYfLOLVa0COipx0+nlu0QKet7U2lEg0vdkh8XRSLf2nd1f1Uk9SrVSGA== + dependencies: + "@ethersproject/base64" "^5.7.0" + "@ethersproject/bytes" "^5.7.0" + "@ethersproject/logger" "^5.7.0" + "@ethersproject/properties" "^5.7.0" + "@ethersproject/strings" "^5.7.0" + +"@ethersproject/web@5.7.1": version "5.7.1" resolved "https://registry.yarnpkg.com/@ethersproject/web/-/web-5.7.1.tgz#de1f285b373149bee5928f4eb7bcb87ee5fbb4ae" integrity sha512-Gueu8lSvyjBWL4cYsWsjh6MtMwM0+H4HvqFPZfB6dV8ctbP9zFAO73VG1cMWae0FLPCtz0peKPpZY8/ugJJX2w== @@ -580,6 +1085,17 @@ "@ethersproject/properties" "^5.7.0" "@ethersproject/strings" "^5.7.0" +"@ethersproject/wordlists@5.6.0", "@ethersproject/wordlists@^5.6.0": + version "5.6.0" + resolved "https://registry.yarnpkg.com/@ethersproject/wordlists/-/wordlists-5.6.0.tgz#79e62c5276e091d8575f6930ba01a29218ded032" + integrity sha512-q0bxNBfIX3fUuAo9OmjlEYxP40IB8ABgb7HjEZCL5IKubzV3j30CWi2rqQbjTS2HfoyQbfINoKcTVWP4ejwR7Q== + dependencies: + "@ethersproject/bytes" "^5.6.0" + "@ethersproject/hash" "^5.6.0" + "@ethersproject/logger" "^5.6.0" + "@ethersproject/properties" "^5.6.0" + "@ethersproject/strings" "^5.6.0" + "@ethersproject/wordlists@5.7.0", "@ethersproject/wordlists@^5.7.0": version "5.7.0" resolved "https://registry.yarnpkg.com/@ethersproject/wordlists/-/wordlists-5.7.0.tgz#8fb2c07185d68c3e09eb3bfd6e779ba2774627f5" @@ -591,14 +1107,19 @@ "@ethersproject/properties" "^5.7.0" "@ethersproject/strings" "^5.7.0" -"@humanwhocodes/config-array@^0.11.11": - version "0.11.11" - resolved "https://registry.yarnpkg.com/@humanwhocodes/config-array/-/config-array-0.11.11.tgz#88a04c570dbbc7dd943e4712429c3df09bc32844" - integrity sha512-N2brEuAadi0CcdeMXUkhbZB84eskAc8MEX1By6qEchoVywSgXPIjou4rYsl0V3Hj0ZnuGycGCjdNgockbzeWNA== +"@humanwhocodes/config-array@^0.10.4": + version "0.10.4" + resolved "https://registry.yarnpkg.com/@humanwhocodes/config-array/-/config-array-0.10.4.tgz#01e7366e57d2ad104feea63e72248f22015c520c" + integrity sha512-mXAIHxZT3Vcpg83opl1wGlVZ9xydbfZO3r5YfRSH6Gpp2J/PfdBP0wbDa2sO6/qRbcalpoevVyW6A/fI6LfeMw== dependencies: "@humanwhocodes/object-schema" "^1.2.1" debug "^4.1.1" - minimatch "^3.0.5" + minimatch "^3.0.4" + +"@humanwhocodes/gitignore-to-minimatch@^1.0.2": + version "1.0.2" + resolved "https://registry.yarnpkg.com/@humanwhocodes/gitignore-to-minimatch/-/gitignore-to-minimatch-1.0.2.tgz#316b0a63b91c10e53f242efb4ace5c3b34e8728d" + integrity sha512-rSqmMJDdLFUsyxR6FMtD00nfQKKLFb1kv+qBbOVKqErvloEIJLo5bDTJTQNTYgeyp78JsA7u/NPi5jT1GR/MuA== "@humanwhocodes/module-importer@^1.0.1": version "1.0.1" @@ -610,28 +1131,10 @@ resolved "https://registry.yarnpkg.com/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz#b520529ec21d8e5945a1851dfd1c32e94e39ff45" integrity sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA== -"@jridgewell/resolve-uri@^3.0.3": - version "3.1.1" - resolved "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.1.tgz#c08679063f279615a3326583ba3a90d1d82cc721" - integrity sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA== - -"@jridgewell/sourcemap-codec@^1.4.10": - version "1.4.15" - resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz#d7c6e6755c78567a951e04ab52ef0fd26de59f32" - integrity sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg== - -"@jridgewell/trace-mapping@0.3.9": - version "0.3.9" - resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz#6534fd5933a53ba7cbf3a17615e273a0d1273ff9" - integrity sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ== - dependencies: - "@jridgewell/resolve-uri" "^3.0.3" - "@jridgewell/sourcemap-codec" "^1.4.10" - "@metamask/eth-sig-util@^4.0.0": - version "4.0.1" - resolved "https://registry.yarnpkg.com/@metamask/eth-sig-util/-/eth-sig-util-4.0.1.tgz#3ad61f6ea9ad73ba5b19db780d40d9aae5157088" - integrity sha512-tghyZKLHZjcdlDqCA3gNZmLeR0XvOE9U1qoQO9ohyAZT6Pya+H9vkBPcsyXytmYLNgVoin7CKCmweo/R43V+tQ== + version "4.0.0" + resolved "https://registry.yarnpkg.com/@metamask/eth-sig-util/-/eth-sig-util-4.0.0.tgz#11553ba06de0d1352332c1bde28c8edd00e0dcf6" + integrity sha512-LczOjjxY4A7XYloxzyxJIHONELmUxVZncpOLoClpEcTiebiVdM46KRPYXGuULro9oNNR2xdVx3yoKiQjdfWmoA== dependencies: ethereumjs-abi "^0.6.8" ethereumjs-util "^6.2.1" @@ -639,32 +1142,15 @@ tweetnacl "^1.0.3" tweetnacl-util "^0.15.1" -"@noble/curves@1.1.0", "@noble/curves@~1.1.0": - version "1.1.0" - resolved "https://registry.yarnpkg.com/@noble/curves/-/curves-1.1.0.tgz#f13fc667c89184bc04cccb9b11e8e7bae27d8c3d" - integrity sha512-091oBExgENk/kGj3AZmtBDMpxQPDtxQABR2B9lb1JbVTs6ytdzZNwvhxQ4MWasRNEzlbEH8jCWFCwhF/Obj5AA== - dependencies: - "@noble/hashes" "1.3.1" - -"@noble/hashes@1.2.0", "@noble/hashes@~1.2.0": - version "1.2.0" - resolved "https://registry.yarnpkg.com/@noble/hashes/-/hashes-1.2.0.tgz#a3150eeb09cc7ab207ebf6d7b9ad311a9bdbed12" - integrity sha512-FZfhjEDbT5GRswV3C6uvLPHMiVD6lQBmpoX5+eSiPaMTXte/IKqI5dykDxzZB/WBeK/CDuQRBWarPdi3FNY2zQ== - -"@noble/hashes@1.3.1": - version "1.3.1" - resolved "https://registry.yarnpkg.com/@noble/hashes/-/hashes-1.3.1.tgz#8831ef002114670c603c458ab8b11328406953a9" - integrity sha512-EbqwksQwz9xDRGfDST86whPBgM65E0OH/pCgqW0GBVzO22bNE+NuIbeTb714+IfSjU3aRk47EUvXIb5bTsenKA== - -"@noble/hashes@~1.3.0", "@noble/hashes@~1.3.1": - version "1.3.2" - resolved "https://registry.yarnpkg.com/@noble/hashes/-/hashes-1.3.2.tgz#6f26dbc8fbc7205873ce3cee2f690eba0d421b39" - integrity sha512-MVC8EAQp7MvEcm30KWENFjgR+Mkmf+D189XJTkFIlwohU5hcBbn1ZkKq7KVTi2Hme3PMGF390DaL52beVrIihQ== +"@noble/hashes@1.0.0", "@noble/hashes@~1.0.0": + version "1.0.0" + resolved "https://registry.yarnpkg.com/@noble/hashes/-/hashes-1.0.0.tgz#d5e38bfbdaba174805a4e649f13be9a9ed3351ae" + integrity sha512-DZVbtY62kc3kkBtMHqwCOfXrT/hnoORy5BJ4+HU1IR59X0KWAOqsfzQPcUl/lQLlG7qXbe/fZ3r/emxtAl+sqg== -"@noble/secp256k1@1.7.1", "@noble/secp256k1@~1.7.0": - version "1.7.1" - resolved "https://registry.yarnpkg.com/@noble/secp256k1/-/secp256k1-1.7.1.tgz#b251c70f824ce3ca7f8dc3df08d58f005cc0507c" - integrity sha512-hOUk6AyBFmqVrv7k5WAw/LpszxVbj9gGN4JRkIX52fdFAj1UA61KXmZDvqVEm+pOyec3+fIeZB02LYa/pWOArw== +"@noble/secp256k1@1.5.5", "@noble/secp256k1@~1.5.2": + version "1.5.5" + resolved "https://registry.yarnpkg.com/@noble/secp256k1/-/secp256k1-1.5.5.tgz#315ab5745509d1a8c8e90d0bdf59823ccf9bcfc3" + integrity sha512-sZ1W6gQzYnu45wPrWx8D3kwI2/U29VYTx9OjbDAd7jwRItJ0cSTMPRL/C8AWZFn9kWFLQGqEXVEE86w4Z8LpIQ== "@nodelib/fs.scandir@2.1.5": version "2.1.5" @@ -679,7 +1165,7 @@ resolved "https://registry.yarnpkg.com/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz#5bd262af94e9d25bd1e71b05deed44876a222e8b" integrity sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A== -"@nodelib/fs.walk@^1.2.3", "@nodelib/fs.walk@^1.2.8": +"@nodelib/fs.walk@^1.2.3": version "1.2.8" resolved "https://registry.yarnpkg.com/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz#e95737e8bb6746ddedf69c556953494f196fe69a" integrity sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg== @@ -687,231 +1173,34 @@ "@nodelib/fs.scandir" "2.1.5" fastq "^1.6.0" -"@nomicfoundation/ethereumjs-block@5.0.2": - version "5.0.2" - resolved "https://registry.yarnpkg.com/@nomicfoundation/ethereumjs-block/-/ethereumjs-block-5.0.2.tgz#13a7968f5964f1697da941281b7f7943b0465d04" - integrity sha512-hSe6CuHI4SsSiWWjHDIzWhSiAVpzMUcDRpWYzN0T9l8/Rz7xNn3elwVOJ/tAyS0LqL6vitUD78Uk7lQDXZun7Q== - dependencies: - "@nomicfoundation/ethereumjs-common" "4.0.2" - "@nomicfoundation/ethereumjs-rlp" "5.0.2" - "@nomicfoundation/ethereumjs-trie" "6.0.2" - "@nomicfoundation/ethereumjs-tx" "5.0.2" - "@nomicfoundation/ethereumjs-util" "9.0.2" - ethereum-cryptography "0.1.3" - ethers "^5.7.1" - -"@nomicfoundation/ethereumjs-blockchain@7.0.2": - version "7.0.2" - resolved "https://registry.yarnpkg.com/@nomicfoundation/ethereumjs-blockchain/-/ethereumjs-blockchain-7.0.2.tgz#45323b673b3d2fab6b5008535340d1b8fea7d446" - integrity sha512-8UUsSXJs+MFfIIAKdh3cG16iNmWzWC/91P40sazNvrqhhdR/RtGDlFk2iFTGbBAZPs2+klZVzhRX8m2wvuvz3w== - dependencies: - "@nomicfoundation/ethereumjs-block" "5.0.2" - "@nomicfoundation/ethereumjs-common" "4.0.2" - "@nomicfoundation/ethereumjs-ethash" "3.0.2" - "@nomicfoundation/ethereumjs-rlp" "5.0.2" - "@nomicfoundation/ethereumjs-trie" "6.0.2" - "@nomicfoundation/ethereumjs-tx" "5.0.2" - "@nomicfoundation/ethereumjs-util" "9.0.2" - abstract-level "^1.0.3" - debug "^4.3.3" - ethereum-cryptography "0.1.3" - level "^8.0.0" - lru-cache "^5.1.1" - memory-level "^1.0.0" - -"@nomicfoundation/ethereumjs-common@4.0.2": - version "4.0.2" - resolved "https://registry.yarnpkg.com/@nomicfoundation/ethereumjs-common/-/ethereumjs-common-4.0.2.tgz#a15d1651ca36757588fdaf2a7d381a150662a3c3" - integrity sha512-I2WGP3HMGsOoycSdOTSqIaES0ughQTueOsddJ36aYVpI3SN8YSusgRFLwzDJwRFVIYDKx/iJz0sQ5kBHVgdDwg== - dependencies: - "@nomicfoundation/ethereumjs-util" "9.0.2" - crc-32 "^1.2.0" - -"@nomicfoundation/ethereumjs-ethash@3.0.2": - version "3.0.2" - resolved "https://registry.yarnpkg.com/@nomicfoundation/ethereumjs-ethash/-/ethereumjs-ethash-3.0.2.tgz#da77147f806401ee996bfddfa6487500118addca" - integrity sha512-8PfoOQCcIcO9Pylq0Buijuq/O73tmMVURK0OqdjhwqcGHYC2PwhbajDh7GZ55ekB0Px197ajK3PQhpKoiI/UPg== - dependencies: - "@nomicfoundation/ethereumjs-block" "5.0.2" - "@nomicfoundation/ethereumjs-rlp" "5.0.2" - "@nomicfoundation/ethereumjs-util" "9.0.2" - abstract-level "^1.0.3" - bigint-crypto-utils "^3.0.23" - ethereum-cryptography "0.1.3" - -"@nomicfoundation/ethereumjs-evm@2.0.2": - version "2.0.2" - resolved "https://registry.yarnpkg.com/@nomicfoundation/ethereumjs-evm/-/ethereumjs-evm-2.0.2.tgz#4c2f4b84c056047102a4fa41c127454e3f0cfcf6" - integrity sha512-rBLcUaUfANJxyOx9HIdMX6uXGin6lANCulIm/pjMgRqfiCRMZie3WKYxTSd8ZE/d+qT+zTedBF4+VHTdTSePmQ== - dependencies: - "@ethersproject/providers" "^5.7.1" - "@nomicfoundation/ethereumjs-common" "4.0.2" - "@nomicfoundation/ethereumjs-tx" "5.0.2" - "@nomicfoundation/ethereumjs-util" "9.0.2" - debug "^4.3.3" - ethereum-cryptography "0.1.3" - mcl-wasm "^0.7.1" - rustbn.js "~0.2.0" - -"@nomicfoundation/ethereumjs-rlp@5.0.2": - version "5.0.2" - resolved "https://registry.yarnpkg.com/@nomicfoundation/ethereumjs-rlp/-/ethereumjs-rlp-5.0.2.tgz#4fee8dc58a53ac6ae87fb1fca7c15dc06c6b5dea" - integrity sha512-QwmemBc+MMsHJ1P1QvPl8R8p2aPvvVcKBbvHnQOKBpBztEo0omN0eaob6FeZS/e3y9NSe+mfu3nNFBHszqkjTA== - -"@nomicfoundation/ethereumjs-statemanager@2.0.2": - version "2.0.2" - resolved "https://registry.yarnpkg.com/@nomicfoundation/ethereumjs-statemanager/-/ethereumjs-statemanager-2.0.2.tgz#3ba4253b29b1211cafe4f9265fee5a0d780976e0" - integrity sha512-dlKy5dIXLuDubx8Z74sipciZnJTRSV/uHG48RSijhgm1V7eXYFC567xgKtsKiVZB1ViTP9iFL4B6Je0xD6X2OA== - dependencies: - "@nomicfoundation/ethereumjs-common" "4.0.2" - "@nomicfoundation/ethereumjs-rlp" "5.0.2" - debug "^4.3.3" - ethereum-cryptography "0.1.3" - ethers "^5.7.1" - js-sdsl "^4.1.4" - -"@nomicfoundation/ethereumjs-trie@6.0.2": - version "6.0.2" - resolved "https://registry.yarnpkg.com/@nomicfoundation/ethereumjs-trie/-/ethereumjs-trie-6.0.2.tgz#9a6dbd28482dca1bc162d12b3733acab8cd12835" - integrity sha512-yw8vg9hBeLYk4YNg5MrSJ5H55TLOv2FSWUTROtDtTMMmDGROsAu+0tBjiNGTnKRi400M6cEzoFfa89Fc5k8NTQ== - dependencies: - "@nomicfoundation/ethereumjs-rlp" "5.0.2" - "@nomicfoundation/ethereumjs-util" "9.0.2" - "@types/readable-stream" "^2.3.13" - ethereum-cryptography "0.1.3" - readable-stream "^3.6.0" - -"@nomicfoundation/ethereumjs-tx@5.0.2": - version "5.0.2" - resolved "https://registry.yarnpkg.com/@nomicfoundation/ethereumjs-tx/-/ethereumjs-tx-5.0.2.tgz#117813b69c0fdc14dd0446698a64be6df71d7e56" - integrity sha512-T+l4/MmTp7VhJeNloMkM+lPU3YMUaXdcXgTGCf8+ZFvV9NYZTRLFekRwlG6/JMmVfIfbrW+dRRJ9A6H5Q/Z64g== - dependencies: - "@chainsafe/ssz" "^0.9.2" - "@ethersproject/providers" "^5.7.2" - "@nomicfoundation/ethereumjs-common" "4.0.2" - "@nomicfoundation/ethereumjs-rlp" "5.0.2" - "@nomicfoundation/ethereumjs-util" "9.0.2" - ethereum-cryptography "0.1.3" - -"@nomicfoundation/ethereumjs-util@9.0.2": - version "9.0.2" - resolved "https://registry.yarnpkg.com/@nomicfoundation/ethereumjs-util/-/ethereumjs-util-9.0.2.tgz#16bdc1bb36f333b8a3559bbb4b17dac805ce904d" - integrity sha512-4Wu9D3LykbSBWZo8nJCnzVIYGvGCuyiYLIJa9XXNVt1q1jUzHdB+sJvx95VGCpPkCT+IbLecW6yfzy3E1bQrwQ== - dependencies: - "@chainsafe/ssz" "^0.10.0" - "@nomicfoundation/ethereumjs-rlp" "5.0.2" - ethereum-cryptography "0.1.3" - -"@nomicfoundation/ethereumjs-vm@7.0.2": - version "7.0.2" - resolved "https://registry.yarnpkg.com/@nomicfoundation/ethereumjs-vm/-/ethereumjs-vm-7.0.2.tgz#3b0852cb3584df0e18c182d0672a3596c9ca95e6" - integrity sha512-Bj3KZT64j54Tcwr7Qm/0jkeZXJMfdcAtRBedou+Hx0dPOSIgqaIr0vvLwP65TpHbak2DmAq+KJbW2KNtIoFwvA== - dependencies: - "@nomicfoundation/ethereumjs-block" "5.0.2" - "@nomicfoundation/ethereumjs-blockchain" "7.0.2" - "@nomicfoundation/ethereumjs-common" "4.0.2" - "@nomicfoundation/ethereumjs-evm" "2.0.2" - "@nomicfoundation/ethereumjs-rlp" "5.0.2" - "@nomicfoundation/ethereumjs-statemanager" "2.0.2" - "@nomicfoundation/ethereumjs-trie" "6.0.2" - "@nomicfoundation/ethereumjs-tx" "5.0.2" - "@nomicfoundation/ethereumjs-util" "9.0.2" - debug "^4.3.3" - ethereum-cryptography "0.1.3" - mcl-wasm "^0.7.1" - rustbn.js "~0.2.0" - -"@nomicfoundation/solidity-analyzer-darwin-arm64@0.1.1": - version "0.1.1" - resolved "https://registry.yarnpkg.com/@nomicfoundation/solidity-analyzer-darwin-arm64/-/solidity-analyzer-darwin-arm64-0.1.1.tgz#4c858096b1c17fe58a474fe81b46815f93645c15" - integrity sha512-KcTodaQw8ivDZyF+D76FokN/HdpgGpfjc/gFCImdLUyqB6eSWVaZPazMbeAjmfhx3R0zm/NYVzxwAokFKgrc0w== - -"@nomicfoundation/solidity-analyzer-darwin-x64@0.1.1": - version "0.1.1" - resolved "https://registry.yarnpkg.com/@nomicfoundation/solidity-analyzer-darwin-x64/-/solidity-analyzer-darwin-x64-0.1.1.tgz#6e25ccdf6e2d22389c35553b64fe6f3fdaec432c" - integrity sha512-XhQG4BaJE6cIbjAVtzGOGbK3sn1BO9W29uhk9J8y8fZF1DYz0Doj8QDMfpMu+A6TjPDs61lbsmeYodIDnfveSA== - -"@nomicfoundation/solidity-analyzer-freebsd-x64@0.1.1": - version "0.1.1" - resolved "https://registry.yarnpkg.com/@nomicfoundation/solidity-analyzer-freebsd-x64/-/solidity-analyzer-freebsd-x64-0.1.1.tgz#0a224ea50317139caeebcdedd435c28a039d169c" - integrity sha512-GHF1VKRdHW3G8CndkwdaeLkVBi5A9u2jwtlS7SLhBc8b5U/GcoL39Q+1CSO3hYqePNP+eV5YI7Zgm0ea6kMHoA== - -"@nomicfoundation/solidity-analyzer-linux-arm64-gnu@0.1.1": - version "0.1.1" - resolved "https://registry.yarnpkg.com/@nomicfoundation/solidity-analyzer-linux-arm64-gnu/-/solidity-analyzer-linux-arm64-gnu-0.1.1.tgz#dfa085d9ffab9efb2e7b383aed3f557f7687ac2b" - integrity sha512-g4Cv2fO37ZsUENQ2vwPnZc2zRenHyAxHcyBjKcjaSmmkKrFr64yvzeNO8S3GBFCo90rfochLs99wFVGT/0owpg== - -"@nomicfoundation/solidity-analyzer-linux-arm64-musl@0.1.1": - version "0.1.1" - resolved "https://registry.yarnpkg.com/@nomicfoundation/solidity-analyzer-linux-arm64-musl/-/solidity-analyzer-linux-arm64-musl-0.1.1.tgz#c9e06b5d513dd3ab02a7ac069c160051675889a4" - integrity sha512-WJ3CE5Oek25OGE3WwzK7oaopY8xMw9Lhb0mlYuJl/maZVo+WtP36XoQTb7bW/i8aAdHW5Z+BqrHMux23pvxG3w== - -"@nomicfoundation/solidity-analyzer-linux-x64-gnu@0.1.1": - version "0.1.1" - resolved "https://registry.yarnpkg.com/@nomicfoundation/solidity-analyzer-linux-x64-gnu/-/solidity-analyzer-linux-x64-gnu-0.1.1.tgz#8d328d16839e52571f72f2998c81e46bf320f893" - integrity sha512-5WN7leSr5fkUBBjE4f3wKENUy9HQStu7HmWqbtknfXkkil+eNWiBV275IOlpXku7v3uLsXTOKpnnGHJYI2qsdA== - -"@nomicfoundation/solidity-analyzer-linux-x64-musl@0.1.1": - version "0.1.1" - resolved "https://registry.yarnpkg.com/@nomicfoundation/solidity-analyzer-linux-x64-musl/-/solidity-analyzer-linux-x64-musl-0.1.1.tgz#9b49d0634b5976bb5ed1604a1e1b736f390959bb" - integrity sha512-KdYMkJOq0SYPQMmErv/63CwGwMm5XHenEna9X9aB8mQmhDBrYrlAOSsIPgFCUSL0hjxE3xHP65/EPXR/InD2+w== - -"@nomicfoundation/solidity-analyzer-win32-arm64-msvc@0.1.1": - version "0.1.1" - resolved "https://registry.yarnpkg.com/@nomicfoundation/solidity-analyzer-win32-arm64-msvc/-/solidity-analyzer-win32-arm64-msvc-0.1.1.tgz#e2867af7264ebbcc3131ef837878955dd6a3676f" - integrity sha512-VFZASBfl4qiBYwW5xeY20exWhmv6ww9sWu/krWSesv3q5hA0o1JuzmPHR4LPN6SUZj5vcqci0O6JOL8BPw+APg== - -"@nomicfoundation/solidity-analyzer-win32-ia32-msvc@0.1.1": - version "0.1.1" - resolved "https://registry.yarnpkg.com/@nomicfoundation/solidity-analyzer-win32-ia32-msvc/-/solidity-analyzer-win32-ia32-msvc-0.1.1.tgz#0685f78608dd516c8cdfb4896ed451317e559585" - integrity sha512-JnFkYuyCSA70j6Si6cS1A9Gh1aHTEb8kOTBApp/c7NRTFGNMH8eaInKlyuuiIbvYFhlXW4LicqyYuWNNq9hkpQ== - -"@nomicfoundation/solidity-analyzer-win32-x64-msvc@0.1.1": - version "0.1.1" - resolved "https://registry.yarnpkg.com/@nomicfoundation/solidity-analyzer-win32-x64-msvc/-/solidity-analyzer-win32-x64-msvc-0.1.1.tgz#c9a44f7108646f083b82e851486e0f6aeb785836" - integrity sha512-HrVJr6+WjIXGnw3Q9u6KQcbZCtk0caVWhCdFADySvRyUxJ8PnzlaP+MhwNE8oyT8OZ6ejHBRrrgjSqDCFXGirw== - -"@nomicfoundation/solidity-analyzer@^0.1.0": - version "0.1.1" - resolved "https://registry.yarnpkg.com/@nomicfoundation/solidity-analyzer/-/solidity-analyzer-0.1.1.tgz#f5f4d36d3f66752f59a57e7208cd856f3ddf6f2d" - integrity sha512-1LMtXj1puAxyFusBgUIy5pZk3073cNXYnXUpuNKFghHbIit/xZgbk0AokpUADbNm3gyD6bFWl3LRFh3dhVdREg== - optionalDependencies: - "@nomicfoundation/solidity-analyzer-darwin-arm64" "0.1.1" - "@nomicfoundation/solidity-analyzer-darwin-x64" "0.1.1" - "@nomicfoundation/solidity-analyzer-freebsd-x64" "0.1.1" - "@nomicfoundation/solidity-analyzer-linux-arm64-gnu" "0.1.1" - "@nomicfoundation/solidity-analyzer-linux-arm64-musl" "0.1.1" - "@nomicfoundation/solidity-analyzer-linux-x64-gnu" "0.1.1" - "@nomicfoundation/solidity-analyzer-linux-x64-musl" "0.1.1" - "@nomicfoundation/solidity-analyzer-win32-arm64-msvc" "0.1.1" - "@nomicfoundation/solidity-analyzer-win32-ia32-msvc" "0.1.1" - "@nomicfoundation/solidity-analyzer-win32-x64-msvc" "0.1.1" - "@nomiclabs/hardhat-ethers@npm:hardhat-deploy-ethers@^0.3.0-beta.13": version "0.3.0-beta.13" resolved "https://registry.yarnpkg.com/hardhat-deploy-ethers/-/hardhat-deploy-ethers-0.3.0-beta.13.tgz#b96086ff768ddf69928984d5eb0a8d78cfca9366" integrity sha512-PdWVcKB9coqWV1L7JTpfXRCI91Cgwsm7KLmBcwZ8f0COSm1xtABHZTyz3fvF6p42cTnz1VM0QnfDvMFlIRkSNw== "@nomiclabs/hardhat-etherscan@^3.1.0": - version "3.1.7" - resolved "https://registry.yarnpkg.com/@nomiclabs/hardhat-etherscan/-/hardhat-etherscan-3.1.7.tgz#72e3d5bd5d0ceb695e097a7f6f5ff6fcbf062b9a" - integrity sha512-tZ3TvSgpvsQ6B6OGmo1/Au6u8BrAkvs1mIC/eURA3xgIfznUZBhmpne8hv7BXUzw9xNL3fXdpOYgOQlVMTcoHQ== + version "3.1.0" + resolved "https://registry.yarnpkg.com/@nomiclabs/hardhat-etherscan/-/hardhat-etherscan-3.1.0.tgz#7137554862b3b1c914f1b1bf110f0529fd2dec53" + integrity sha512-JroYgfN1AlYFkQTQ3nRwFi4o8NtZF7K/qFR2dxDUgHbCtIagkUseca9L4E/D2ScUm4XT40+8PbCdqZi+XmHyQA== dependencies: "@ethersproject/abi" "^5.1.2" "@ethersproject/address" "^5.0.2" - cbor "^8.1.0" + cbor "^5.0.2" chalk "^2.4.2" debug "^4.1.1" fs-extra "^7.0.1" lodash "^4.17.11" semver "^6.3.0" table "^6.8.0" - undici "^5.14.0" + undici "^5.4.0" "@nomiclabs/hardhat-waffle@^2.0.1": - version "2.0.6" - resolved "https://registry.yarnpkg.com/@nomiclabs/hardhat-waffle/-/hardhat-waffle-2.0.6.tgz#d11cb063a5f61a77806053e54009c40ddee49a54" - integrity sha512-+Wz0hwmJGSI17B+BhU/qFRZ1l6/xMW82QGXE/Gi+WTmwgJrQefuBs1lIf7hzQ1hLk6hpkvb/zwcNkpVKRYTQYg== + version "2.0.3" + resolved "https://registry.yarnpkg.com/@nomiclabs/hardhat-waffle/-/hardhat-waffle-2.0.3.tgz#9c538a09c5ed89f68f5fd2dc3f78f16ed1d6e0b1" + integrity sha512-049PHSnI1CZq6+XTbrMbMv5NaL7cednTfPenx02k3cEh8wBMLa6ys++dBETJa6JjfwgA9nBhhHQ173LJv6k2Pg== + dependencies: + "@types/sinon-chai" "^3.2.3" + "@types/web3" "1.0.19" "@offchainlabs/upgrade-executor@1.1.0-beta.0": version "1.1.0-beta.0" @@ -978,44 +1267,27 @@ path-browserify "^1.0.0" url "^0.11.0" -"@scure/base@~1.1.0": - version "1.1.3" - resolved "https://registry.yarnpkg.com/@scure/base/-/base-1.1.3.tgz#8584115565228290a6c6c4961973e0903bb3df2f" - integrity sha512-/+SgoRjLq7Xlf0CWuLHq2LUZeL/w65kfzAPG5NH9pcmBhs+nunQTn4gvdwgMTIXnt9b2C/1SeL2XiysZEyIC9Q== - -"@scure/bip32@1.1.5": - version "1.1.5" - resolved "https://registry.yarnpkg.com/@scure/bip32/-/bip32-1.1.5.tgz#d2ccae16dcc2e75bc1d75f5ef3c66a338d1ba300" - integrity sha512-XyNh1rB0SkEqd3tXcXMi+Xe1fvg+kUIcoRIEujP1Jgv7DqW2r9lg3Ah0NkFaCs9sTkQAQA8kw7xiRXzENi9Rtw== - dependencies: - "@noble/hashes" "~1.2.0" - "@noble/secp256k1" "~1.7.0" - "@scure/base" "~1.1.0" - -"@scure/bip32@1.3.1": - version "1.3.1" - resolved "https://registry.yarnpkg.com/@scure/bip32/-/bip32-1.3.1.tgz#7248aea723667f98160f593d621c47e208ccbb10" - integrity sha512-osvveYtyzdEVbt3OfwwXFr4P2iVBL5u1Q3q4ONBfDY/UpOuXmOlbgwc1xECEboY8wIays8Yt6onaWMUdUbfl0A== - dependencies: - "@noble/curves" "~1.1.0" - "@noble/hashes" "~1.3.1" - "@scure/base" "~1.1.0" +"@scure/base@~1.0.0": + version "1.0.0" + resolved "https://registry.yarnpkg.com/@scure/base/-/base-1.0.0.tgz#109fb595021de285f05a7db6806f2f48296fcee7" + integrity sha512-gIVaYhUsy+9s58m/ETjSJVKHhKTBMmcRb9cEV5/5dwvfDlfORjKrFsDeDHWRrm6RjcPvCLZFwGJjAjLj1gg4HA== -"@scure/bip39@1.1.1": - version "1.1.1" - resolved "https://registry.yarnpkg.com/@scure/bip39/-/bip39-1.1.1.tgz#b54557b2e86214319405db819c4b6a370cf340c5" - integrity sha512-t+wDck2rVkh65Hmv280fYdVdY25J9YeEUIgn2LG1WM6gxFkGzcksoDiUkWVpVp3Oex9xGC68JU2dSbUfwZ2jPg== +"@scure/bip32@1.0.1": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@scure/bip32/-/bip32-1.0.1.tgz#1409bdf9f07f0aec99006bb0d5827693418d3aa5" + integrity sha512-AU88KKTpQ+YpTLoicZ/qhFhRRIo96/tlb+8YmDDHR9yiKVjSsFZiefJO4wjS2PMTkz5/oIcw84uAq/8pleQURA== dependencies: - "@noble/hashes" "~1.2.0" - "@scure/base" "~1.1.0" + "@noble/hashes" "~1.0.0" + "@noble/secp256k1" "~1.5.2" + "@scure/base" "~1.0.0" -"@scure/bip39@1.2.1": - version "1.2.1" - resolved "https://registry.yarnpkg.com/@scure/bip39/-/bip39-1.2.1.tgz#5cee8978656b272a917b7871c981e0541ad6ac2a" - integrity sha512-Z3/Fsz1yr904dduJD0NpiyRHhRYHdcnyh73FZWiV+/qhWi83wNJ3NWolYqCEN+ZWsUz2TWwajJggcRE9r1zUYg== +"@scure/bip39@1.0.0": + version "1.0.0" + resolved "https://registry.yarnpkg.com/@scure/bip39/-/bip39-1.0.0.tgz#47504e58de9a56a4bbed95159d2d6829fa491bb0" + integrity sha512-HrtcikLbd58PWOkl02k9V6nXWQyoa7A0+Ek9VF7z17DDk9XZAFUcIdqfh0jJXLypmizc5/8P6OxoUeKliiWv4w== dependencies: - "@noble/hashes" "~1.3.0" - "@scure/base" "~1.1.0" + "@noble/hashes" "~1.0.0" + "@scure/base" "~1.0.0" "@sentry/core@5.30.0": version "5.30.0" @@ -1090,22 +1362,17 @@ resolved "https://registry.yarnpkg.com/@sindresorhus/is/-/is-0.14.0.tgz#9fb3a3cf3132328151f353de4632e01e52102bea" integrity sha512-9NET910DNaIPngYnLLPeg+Ogzqsi9uM4mSboU5y6p8S5DzMTVEsJZrawi+BoDNUVBa2DhJqQYUFvMDfgU062LQ== -"@sindresorhus/is@^4.0.0", "@sindresorhus/is@^4.6.0": - version "4.6.0" - resolved "https://registry.yarnpkg.com/@sindresorhus/is/-/is-4.6.0.tgz#3c7c9c46e678feefe7a2e5bb609d3dbd665ffb3f" - integrity sha512-t09vSN3MdfsyCHoFcTRCH/iUtG7OJ0CsjzB8cjAmKc/va/kIgeDI/TxsigdncE/4be734m0cvIYwNaV4i2XqAw== - -"@solidity-parser/parser@^0.14.0", "@solidity-parser/parser@^0.14.3": - version "0.14.5" - resolved "https://registry.yarnpkg.com/@solidity-parser/parser/-/parser-0.14.5.tgz#87bc3cc7b068e08195c219c91cd8ddff5ef1a804" - integrity sha512-6dKnHZn7fg/iQATVEzqyUOyEidbn05q7YA2mQ9hC0MMXhhV3/JrsxmFSYZAcr7j1yUP700LLhTruvJ3MiQmjJg== +"@solidity-parser/parser@^0.14.0", "@solidity-parser/parser@^0.14.1": + version "0.14.1" + resolved "https://registry.yarnpkg.com/@solidity-parser/parser/-/parser-0.14.1.tgz#179afb29f4e295a77cc141151f26b3848abc3c46" + integrity sha512-eLjj2L6AuQjBB6s/ibwCAc0DwrR5Ge+ys+wgWo+bviU7fV2nTMQhU63CGaDKXg9iTmMxwhkyoggdIR7ZGRfMgw== dependencies: antlr4ts "^0.5.0-alpha.4" -"@solidity-parser/parser@^0.16.0": - version "0.16.1" - resolved "https://registry.yarnpkg.com/@solidity-parser/parser/-/parser-0.16.1.tgz#f7c8a686974e1536da0105466c4db6727311253c" - integrity sha512-PdhRFNhbTtu3x8Axm0uYpqOy/lODYQK+MlYSgqIsq2L8SFYEHJPHNUiOTAJbDGzNjjr1/n9AcIayxafR/fWmYw== +"@solidity-parser/parser@^0.14.3": + version "0.14.3" + resolved "https://registry.yarnpkg.com/@solidity-parser/parser/-/parser-0.14.3.tgz#0d627427b35a40d8521aaa933cc3df7d07bfa36f" + integrity sha512-29g2SZ29HtsqA58pLCtopI1P/cPy5/UAzlcAXO6T/CNJimG6yA8kx4NaseMyJULiC+TEs02Y9/yeHzClqoA0hw== dependencies: antlr4ts "^0.5.0-alpha.4" @@ -1116,68 +1383,53 @@ dependencies: defer-to-connect "^1.0.1" -"@szmarczak/http-timer@^4.0.5": - version "4.0.6" - resolved "https://registry.yarnpkg.com/@szmarczak/http-timer/-/http-timer-4.0.6.tgz#b4a914bb62e7c272d4e5989fe4440f812ab1d807" - integrity sha512-4BAffykYOgO+5nzBWYwE3W90sBgLJoUPRWWcL8wlyiM8IB8ipJz3UMJ9KXQd1RKQXpKp8Tutn80HZtWsu2u76w== - dependencies: - defer-to-connect "^2.0.0" +"@truffle/error@^0.0.14": + version "0.0.14" + resolved "https://registry.yarnpkg.com/@truffle/error/-/error-0.0.14.tgz#59683b5407bede7bddf16d80dc5592f9c5e5fa05" + integrity sha512-utJx+SZYoMqk8wldQG4gCVKhV8GwMJbWY7sLXFT/D8wWZTnE2peX7URFJh/cxkjTRCO328z1s2qewkhyVsu2HA== -"@szmarczak/http-timer@^5.0.1": - version "5.0.1" - resolved "https://registry.yarnpkg.com/@szmarczak/http-timer/-/http-timer-5.0.1.tgz#c7c1bf1141cdd4751b0399c8fc7b8b664cd5be3a" - integrity sha512-+PmQX0PiAYPMeVYe237LJAYvOMYW1j2rH5YROyS3b4CTVJum34HfRvKvAzozHAQG0TnHNdUfY9nCeUyRAs//cw== - dependencies: - defer-to-connect "^2.0.1" - -"@truffle/error@^0.1.1": - version "0.1.1" - resolved "https://registry.yarnpkg.com/@truffle/error/-/error-0.1.1.tgz#e52026ac8ca7180d83443dca73c03e07ace2a301" - integrity sha512-sE7c9IHIGdbK4YayH4BC8i8qMjoAOeg6nUXUDZZp8wlU21/EMpaG+CLx+KqcIPyR+GSWIW3Dm0PXkr2nlggFDA== - -"@truffle/interface-adapter@^0.5.25": - version "0.5.37" - resolved "https://registry.yarnpkg.com/@truffle/interface-adapter/-/interface-adapter-0.5.37.tgz#95d249c1912d2baaa63c54e8a138d3f476a1181a" - integrity sha512-lPH9MDgU+7sNDlJSClwyOwPCfuOimqsCx0HfGkznL3mcFRymc1pukAR1k17zn7ErHqBwJjiKAZ6Ri72KkS+IWw== +"@truffle/interface-adapter@^0.5.8": + version "0.5.8" + resolved "https://registry.yarnpkg.com/@truffle/interface-adapter/-/interface-adapter-0.5.8.tgz#76cfd34374d85849e1164de1a3d5a3dce0dc5d01" + integrity sha512-vvy3xpq36oLgjjy8KE9l2Jabg3WcGPOt18tIyMfTQX9MFnbHoQA2Ne2i8xsd4p6KfxIqSjAB53Q9/nScAqY0UQ== dependencies: bn.js "^5.1.3" ethers "^4.0.32" - web3 "1.10.0" + web3 "1.5.3" "@truffle/provider@^0.2.24": - version "0.2.64" - resolved "https://registry.yarnpkg.com/@truffle/provider/-/provider-0.2.64.tgz#7dd55117307fd019dcf81d08db5dc2bc5728f51c" - integrity sha512-ZwPsofw4EsCq/2h0t73SPnnFezu4YQWBmK4FxFaOUX0F+o8NsZuHKyfJzuZwyZbiktYmefM3yD9rM0Dj4BhNbw== + version "0.2.42" + resolved "https://registry.yarnpkg.com/@truffle/provider/-/provider-0.2.42.tgz#9da6a144b3c9188cdb587451dd7bd907b4c7164b" + integrity sha512-ZNoglPho4alYIjJR+sLTgX0x6ho7m4OAUWuJ50RAWmoEqYc4AM6htdrI+lTSoRrOHHbmgasv22a7rFPMnmDrTg== dependencies: - "@truffle/error" "^0.1.1" - "@truffle/interface-adapter" "^0.5.25" - debug "^4.3.1" - web3 "1.7.4" + "@truffle/error" "^0.0.14" + "@truffle/interface-adapter" "^0.5.8" + web3 "1.5.3" "@tsconfig/node10@^1.0.7": - version "1.0.9" - resolved "https://registry.yarnpkg.com/@tsconfig/node10/-/node10-1.0.9.tgz#df4907fc07a886922637b15e02d4cebc4c0021b2" - integrity sha512-jNsYVVxU8v5g43Erja32laIDHXeoNvFEpX33OK4d6hljo3jDhCBDhx5dhCCTMWUojscpAagGiRkBKxpdl9fxqA== + version "1.0.8" + resolved "https://registry.yarnpkg.com/@tsconfig/node10/-/node10-1.0.8.tgz#c1e4e80d6f964fbecb3359c43bd48b40f7cadad9" + integrity sha512-6XFfSQmMgq0CFLY1MslA/CPUfhIL919M1rMsa5lP2P097N2Wd1sSX0tx1u4olM16fLNhtHZpRhedZJphNJqmZg== "@tsconfig/node12@^1.0.7": - version "1.0.11" - resolved "https://registry.yarnpkg.com/@tsconfig/node12/-/node12-1.0.11.tgz#ee3def1f27d9ed66dac6e46a295cffb0152e058d" - integrity sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag== + version "1.0.9" + resolved "https://registry.yarnpkg.com/@tsconfig/node12/-/node12-1.0.9.tgz#62c1f6dee2ebd9aead80dc3afa56810e58e1a04c" + integrity sha512-/yBMcem+fbvhSREH+s14YJi18sp7J9jpuhYByADT2rypfajMZZN4WQ6zBGgBKp53NKmqI36wFYDb3yaMPurITw== "@tsconfig/node14@^1.0.0": - version "1.0.3" - resolved "https://registry.yarnpkg.com/@tsconfig/node14/-/node14-1.0.3.tgz#e4386316284f00b98435bf40f72f75a09dabf6c1" - integrity sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow== + version "1.0.1" + resolved "https://registry.yarnpkg.com/@tsconfig/node14/-/node14-1.0.1.tgz#95f2d167ffb9b8d2068b0b235302fafd4df711f2" + integrity sha512-509r2+yARFfHHE7T6Puu2jjkoycftovhXRqW328PDXTVGKihlb1P8Z9mMZH04ebyajfRY7dedfGynlrFHJUQCg== "@tsconfig/node16@^1.0.2": - version "1.0.4" - resolved "https://registry.yarnpkg.com/@tsconfig/node16/-/node16-1.0.4.tgz#0b92dcc0cc1c81f6f306a381f28e31b1a56536e9" - integrity sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA== + version "1.0.2" + resolved "https://registry.yarnpkg.com/@tsconfig/node16/-/node16-1.0.2.tgz#423c77877d0569db20e1fc80885ac4118314010e" + integrity sha512-eZxlbI8GZscaGS7kkc/trHTT5xgrjH3/1n2JDwusC9iahPKWMRvRjJSAN5mCXviuTGQ/lHnhvv8Q1YTpnfz9gA== "@typechain/ethers-v5@^10.0.0": - version "10.2.1" - resolved "https://registry.yarnpkg.com/@typechain/ethers-v5/-/ethers-v5-10.2.1.tgz#50241e6957683281ecfa03fb5a6724d8a3ce2391" - integrity sha512-n3tQmCZjRE6IU4h6lqUGiQ1j866n5MTCBJreNEHHVWXa2u9GJTaeYyU1/k+1qLutkyw+sS6VAN+AbeiTqsxd/A== + version "10.0.0" + resolved "https://registry.yarnpkg.com/@typechain/ethers-v5/-/ethers-v5-10.0.0.tgz#1b6e292d2ed9afb0d2f7a4674cc199bb95bad714" + integrity sha512-Kot7fwAqnH96ZbI8xrRgj5Kpv9yCEdjo7mxRqrH7bYpEgijT5MmuOo8IVsdhOu7Uog4ONg7k/d5UdbAtTKUgsA== dependencies: lodash "^4.17.15" ts-essentials "^7.0.1" @@ -1190,11 +1442,24 @@ ethers "^5.0.2" "@typechain/hardhat@^6.0.0": - version "6.1.6" - resolved "https://registry.yarnpkg.com/@typechain/hardhat/-/hardhat-6.1.6.tgz#1a749eb35e5054c80df531cf440819cb347c62ea" - integrity sha512-BiVnegSs+ZHVymyidtK472syodx1sXYlYJJixZfRstHVGYTi8V1O7QG4nsjyb0PC/LORcq7sfBUcHto1y6UgJA== + version "6.0.0" + resolved "https://registry.yarnpkg.com/@typechain/hardhat/-/hardhat-6.0.0.tgz#5e305641de67276efbfaa8c37c78e38f22b22ef4" + integrity sha512-AnhwODKHxx3+st5uc1j2NQh79Lv2OuvDQe4dKn8ZxhqYsAsTPnHTLBeI8KPZ+mfdE7v13D2QYssRTIkkGhK35A== dependencies: fs-extra "^9.1.0" + lodash "^4.17.15" + +"@types/abstract-leveldown@*": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@types/abstract-leveldown/-/abstract-leveldown-7.2.0.tgz#f055979a99f7654e84d6b8e6267419e9c4cfff87" + integrity sha512-q5veSX6zjUy/DlDhR4Y4cU0k2Ar+DT2LUraP00T19WLmTO6Se1djepCCaqU6nQrwcJ5Hyo/CWqxTzrrFg8eqbQ== + +"@types/bn.js@*", "@types/bn.js@^5.1.0": + version "5.1.0" + resolved "https://registry.yarnpkg.com/@types/bn.js/-/bn.js-5.1.0.tgz#32c5d271503a12653c62cf4d2b45e6eab8cebc68" + integrity sha512-QSSVYj7pYFN49kW77o2s9xTCwZ8F2xLbjLLSEVh8D2F4JUhZtPAGOFLTD+ffqksBx/u4cE/KImFjyhqCjn/LIA== + dependencies: + "@types/node" "*" "@types/bn.js@^4.11.3", "@types/bn.js@^4.11.5": version "4.11.6" @@ -1203,27 +1468,15 @@ dependencies: "@types/node" "*" -"@types/bn.js@^5.1.0", "@types/bn.js@^5.1.1": - version "5.1.1" - resolved "https://registry.yarnpkg.com/@types/bn.js/-/bn.js-5.1.1.tgz#b51e1b55920a4ca26e9285ff79936bbdec910682" - integrity sha512-qNrYbZqMx0uJAfKnKclPh+dTwK33KfLHYqtyODwd5HnXOjnkhc4qgn3BrK6RWyGZm5+sIFE7Q7Vz6QQtJB7w7g== - dependencies: - "@types/node" "*" - -"@types/cacheable-request@^6.0.1", "@types/cacheable-request@^6.0.2": - version "6.0.3" - resolved "https://registry.yarnpkg.com/@types/cacheable-request/-/cacheable-request-6.0.3.tgz#a430b3260466ca7b5ca5bfd735693b36e7a9d183" - integrity sha512-IQ3EbTzGxIigb1I3qPZc1rWJnH0BmSKv5QYTalEwweFvyBDLSAe24zP0le/hyi7ecGfZVlIVAg4BZqb8WBwKqw== - dependencies: - "@types/http-cache-semantics" "*" - "@types/keyv" "^3.1.4" - "@types/node" "*" - "@types/responselike" "^1.0.0" +"@types/chai@*": + version "4.3.0" + resolved "https://registry.yarnpkg.com/@types/chai/-/chai-4.3.0.tgz#23509ebc1fa32f1b4d50d6a66c4032d5b8eaabdc" + integrity sha512-/ceqdqeRraGolFTcfoXNiqjyQhZzbINDngeoAq9GoHa8PPK1yNzTaxWjA6BFWp5Ua9JpXEMSS4s5i9tS0hOJtw== "@types/chai@^4.3.0": - version "4.3.6" - resolved "https://registry.yarnpkg.com/@types/chai/-/chai-4.3.6.tgz#7b489e8baf393d5dd1266fb203ddd4ea941259e6" - integrity sha512-VOVRLM1mBxIRxydiViqPcKn6MIxZytrbMpd6RJLIWKxUNr3zux8no0Oc7kJx0WAPIitgZ0gkrDS+btlqQpubpw== + version "4.3.1" + resolved "https://registry.yarnpkg.com/@types/chai/-/chai-4.3.1.tgz#e2c6e73e0bdeb2521d00756d099218e9f5d90a04" + integrity sha512-/zPMqDkzSZ8t3VtxOa4KPq7uzzW978M9Tvh+j7GHKuo6k6GTLxPJ4J5gE5cjfJ26pnXst0N5Hax8Sr0T2Mi9zQ== "@types/concat-stream@^1.6.0": version "1.6.1" @@ -1235,7 +1488,7 @@ "@types/form-data@0.0.33": version "0.0.33" resolved "https://registry.yarnpkg.com/@types/form-data/-/form-data-0.0.33.tgz#c9ac85b2a5fd18435b8c85d9ecb50e6d6c893ff8" - integrity sha512-8BSvG1kGm83cyJITQMZSulnl6QV8jqAGreJsc5tPu1Jq0vTSOiY/k24Wx82JRpWwZSqrala6sd5rWi6aNXvqcw== + integrity sha1-yayFsqX9GENbjIXZ7LUObWyJP/g= dependencies: "@types/node" "*" @@ -1247,21 +1500,23 @@ "@types/minimatch" "*" "@types/node" "*" -"@types/http-cache-semantics@*": - version "4.0.1" - resolved "https://registry.yarnpkg.com/@types/http-cache-semantics/-/http-cache-semantics-4.0.1.tgz#0ea7b61496902b95890dc4c3a116b60cb8dae812" - integrity sha512-SZs7ekbP8CN0txVG2xVRH6EgKmEm31BOxA07vkFaETzZz1xh+cbt8BcI0slpymvwhx5dlFnQG2rTlPVQn+iRPQ== - "@types/json-schema@^7.0.9": - version "7.0.12" - resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.12.tgz#d70faba7039d5fca54c83c7dbab41051d2b6f6cb" - integrity sha512-Hr5Jfhc9eYOQNPYO5WLDq/n4jqijdHNlDXjuAQkkt+mWdQR+XJToOHrsD4cPaMXpn6KO7y2+wM8AZEs8VpBLVA== + version "7.0.11" + resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.11.tgz#d421b6c527a3037f7c84433fd2c4229e016863d3" + integrity sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ== + +"@types/level-errors@*": + version "3.0.0" + resolved "https://registry.yarnpkg.com/@types/level-errors/-/level-errors-3.0.0.tgz#15c1f4915a5ef763b51651b15e90f6dc081b96a8" + integrity sha512-/lMtoq/Cf/2DVOm6zE6ORyOM+3ZVm/BvzEZVxUhf6bgh8ZHglXlBqxbxSlJeVp8FCbD3IVvk/VbsaNmDjrQvqQ== -"@types/keyv@^3.1.4": - version "3.1.4" - resolved "https://registry.yarnpkg.com/@types/keyv/-/keyv-3.1.4.tgz#3ccdb1c6751b0c7e52300bcdacd5bcbf8faa75b6" - integrity sha512-BQ5aZNSCpj7D6K2ksrRCTmKRLEpnPvWDiLPfoGyhZ++8YtiK9d/3DBKPJgry359X/P1PfruyYwvnvwFjuEiEIg== +"@types/levelup@^4.3.0": + version "4.3.3" + resolved "https://registry.yarnpkg.com/@types/levelup/-/levelup-4.3.3.tgz#4dc2b77db079b1cf855562ad52321aa4241b8ef4" + integrity sha512-K+OTIjJcZHVlZQN1HmU64VtrC0jC3dXWQozuEIR9zVvltIk90zaGPM2AgT+fIkChpzHhFE3YnvFLCbLtzAmexA== dependencies: + "@types/abstract-leveldown" "*" + "@types/level-errors" "*" "@types/node" "*" "@types/lru-cache@^5.1.0": @@ -1270,9 +1525,9 @@ integrity sha512-ssE3Vlrys7sdIzs5LOxCzTVMsU7i9oa/IaW92wF32JFb3CVczqOkru2xspuKczHEbG3nvmPY7IFqVmGGHdNbYw== "@types/minimatch@*": - version "5.1.2" - resolved "https://registry.yarnpkg.com/@types/minimatch/-/minimatch-5.1.2.tgz#07508b45797cb81ec3f273011b054cd0755eddca" - integrity sha512-K0VQKziLUWkVKiRVrx4a40iPaxTUefQmjtkQofBkYRcoaaL/8rhwDWww9qWbrgicNOgnpIsMxyNIUM4+n6dUIA== + version "3.0.5" + resolved "https://registry.yarnpkg.com/@types/minimatch/-/minimatch-3.0.5.tgz#1001cc5e6a3704b83c236027e77f2f58ea010f40" + integrity sha512-Klz949h02Gz2uZCMGwDUSDS1YBlTdDDgbWHi+81l29tQALUtvz4rAYi5uoVhE5Lagoq6DeqAUlbrHvW/mXDgdQ== "@types/mkdirp@^0.5.2": version "0.5.2" @@ -1282,22 +1537,22 @@ "@types/node" "*" "@types/mocha@^9.0.0": - version "9.1.1" - resolved "https://registry.yarnpkg.com/@types/mocha/-/mocha-9.1.1.tgz#e7c4f1001eefa4b8afbd1eee27a237fee3bf29c4" - integrity sha512-Z61JK7DKDtdKTWwLeElSEBcWGRLY8g95ic5FoQqI9CMx0ns/Ghep3B4DfcEimiKMvtamNVULVNKEsiwV3aQmXw== + version "9.1.0" + resolved "https://registry.yarnpkg.com/@types/mocha/-/mocha-9.1.0.tgz#baf17ab2cca3fcce2d322ebc30454bff487efad5" + integrity sha512-QCWHkbMv4Y5U9oW10Uxbr45qMMSzl4OzijsozynUAgx3kEHUdXB00udx2dWDQ7f2TU2a2uuiFaRZjCe3unPpeg== "@types/node-fetch@^2.5.5": - version "2.6.4" - resolved "https://registry.yarnpkg.com/@types/node-fetch/-/node-fetch-2.6.4.tgz#1bc3a26de814f6bf466b25aeb1473fa1afe6a660" - integrity sha512-1ZX9fcN4Rvkvgv4E6PAY5WXUFWFcRWxZa3EW83UjycOB9ljJCedb2CupIP4RZMEwF/M3eTcCihbBRgwtGbg5Rg== + version "2.6.1" + resolved "https://registry.yarnpkg.com/@types/node-fetch/-/node-fetch-2.6.1.tgz#8f127c50481db65886800ef496f20bbf15518975" + integrity sha512-oMqjURCaxoSIsHSr1E47QHzbmzNR5rK8McHuNb11BOM9cHcIK3Avy0s/b2JlXHoQGTYS3NsvWzV1M0iK7l0wbA== dependencies: "@types/node" "*" form-data "^3.0.0" "@types/node@*": - version "20.6.0" - resolved "https://registry.yarnpkg.com/@types/node/-/node-20.6.0.tgz#9d7daa855d33d4efec8aea88cd66db1c2f0ebe16" - integrity sha512-najjVq5KN2vsH2U/xyh2opaSEz6cZMR2SetLIlxlj08nOcmPOemJmUK2o4kUzfLqfrWE0PIrNeE16XhYDd3nqg== + version "17.0.23" + resolved "https://registry.yarnpkg.com/@types/node/-/node-17.0.23.tgz#3b41a6e643589ac6442bdbd7a4a3ded62f33f7da" + integrity sha512-UxDxWn7dl97rKVeVS61vErvw086aCYhDLyvRQZ5Rk65rZKepaFdm53GeqXaKBuOhED4e9uWq34IC3TdSdJJ2Gw== "@types/node@^10.0.3": version "10.17.60" @@ -1305,14 +1560,14 @@ integrity sha512-F0KIgDJfy2nA3zMLmWGKxcH2ZVEtCZXHHdOQs2gSaQ27+lNeEfGxzkIw90aXswATX7AZ33tahPbzy6KAfUreVw== "@types/node@^12.12.6": - version "12.20.55" - resolved "https://registry.yarnpkg.com/@types/node/-/node-12.20.55.tgz#c329cbd434c42164f846b909bd6f85b5537f6240" - integrity sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ== + version "12.20.47" + resolved "https://registry.yarnpkg.com/@types/node/-/node-12.20.47.tgz#ca9237d51f2a2557419688511dab1c8daf475188" + integrity sha512-BzcaRsnFuznzOItW1WpQrDHM7plAa7GIDMZ6b5pnMbkqEtM/6WCOhvZar39oeMQP79gwvFUWjjptE7/KGcNqFg== "@types/node@^17.0.5": - version "17.0.45" - resolved "https://registry.yarnpkg.com/@types/node/-/node-17.0.45.tgz#2c0fafd78705e7a18b7906b5201a522719dc5190" - integrity sha512-w+tIMs3rq2afQdsPJlODhoUEKzFP1ayaoyl1CcnwtIlsVe7K7bA1NGm4s3PraqTLlXnbIN84zuBlxBWo1u9BLw== + version "17.0.25" + resolved "https://registry.yarnpkg.com/@types/node/-/node-17.0.25.tgz#527051f3c2f77aa52e5dc74e45a3da5fb2301448" + integrity sha512-wANk6fBrUwdpY4isjWrKTufkrXdu1D2YHCot2fD/DfWxF5sMrVSA+KN7ydckvaTCh0HiqX9IVl0L5/ZoXg5M7w== "@types/node@^8.0.0": version "8.10.66" @@ -1327,22 +1582,14 @@ "@types/node" "*" "@types/prettier@^2.1.1": - version "2.7.3" - resolved "https://registry.yarnpkg.com/@types/prettier/-/prettier-2.7.3.tgz#3e51a17e291d01d17d3fc61422015a933af7a08f" - integrity sha512-+68kP9yzs4LMp7VNh8gdzMSPZFL44MLGqiHWvttYJe+6qnuVr4Ek9wSBQoveqY/r+LwjCcU29kNVkidwim+kYA== + version "2.4.4" + resolved "https://registry.yarnpkg.com/@types/prettier/-/prettier-2.4.4.tgz#5d9b63132df54d8909fce1c3f8ca260fdd693e17" + integrity sha512-ReVR2rLTV1kvtlWFyuot+d1pkpG2Fw/XKE3PDAdj57rbM97ttSp9JZ2UsP+2EHTylra9cUf6JA7tGwW1INzUrA== "@types/qs@^6.2.31", "@types/qs@^6.9.7": - version "6.9.8" - resolved "https://registry.yarnpkg.com/@types/qs/-/qs-6.9.8.tgz#f2a7de3c107b89b441e071d5472e6b726b4adf45" - integrity sha512-u95svzDlTysU5xecFNTgfFG5RUWu1A9P0VzgpcIiGZA9iraHOdSzcxMxQ55DyeRaGCSxQi7LxXDI4rzq/MYfdg== - -"@types/readable-stream@^2.3.13": - version "2.3.15" - resolved "https://registry.yarnpkg.com/@types/readable-stream/-/readable-stream-2.3.15.tgz#3d79c9ceb1b6a57d5f6e6976f489b9b5384321ae" - integrity sha512-oM5JSKQCcICF1wvGgmecmHldZ48OZamtMxcGGVICOJA8o8cahXC1zEVAif8iwoc5j8etxFaRFnf095+CDsuoFQ== - dependencies: - "@types/node" "*" - safe-buffer "~5.1.1" + version "6.9.7" + resolved "https://registry.yarnpkg.com/@types/qs/-/qs-6.9.7.tgz#63bb7d067db107cc1e457c303bc25d511febf6cb" + integrity sha512-FGa1F62FT09qcrueBA6qYTrJPVDzah9a+493+o2PCXsesWHIn27G98TsSMs3WPNbZIEj4+VJf6saSFpvD+3Zsw== "@types/resolve@^0.0.8": version "0.0.8" @@ -1351,13 +1598,6 @@ dependencies: "@types/node" "*" -"@types/responselike@^1.0.0": - version "1.0.0" - resolved "https://registry.yarnpkg.com/@types/responselike/-/responselike-1.0.0.tgz#251f4fe7d154d2bad125abe1b429b23afd262e29" - integrity sha512-85Y2BjiufFzaMIlvJDvTTB8Fxl2xfLo4HgmHzVBz08w4wDePCTjYw66PdrolO0kzli3yam/YCgRufyo1DdQVTA== - dependencies: - "@types/node" "*" - "@types/secp256k1@^4.0.1": version "4.0.3" resolved "https://registry.yarnpkg.com/@types/secp256k1/-/secp256k1-4.0.3.tgz#1b8e55d8e00f08ee7220b4d59a6abe89c37a901c" @@ -1365,10 +1605,38 @@ dependencies: "@types/node" "*" -"@types/semver@^7.3.12": - version "7.5.1" - resolved "https://registry.yarnpkg.com/@types/semver/-/semver-7.5.1.tgz#0480eeb7221eb9bc398ad7432c9d7e14b1a5a367" - integrity sha512-cJRQXpObxfNKkFAZbJl2yjWtJCqELQIdShsogr1d2MilP8dKD9TE/nEKHkJgUNHdGKCQaf9HbIynuV2csLGVLg== +"@types/sinon-chai@^3.2.3": + version "3.2.8" + resolved "https://registry.yarnpkg.com/@types/sinon-chai/-/sinon-chai-3.2.8.tgz#5871d09ab50d671d8e6dd72e9073f8e738ac61dc" + integrity sha512-d4ImIQbT/rKMG8+AXpmcan5T2/PNeSjrYhvkwet6z0p8kzYtfgA32xzOBlbU0yqJfq+/0Ml805iFoODO0LP5/g== + dependencies: + "@types/chai" "*" + "@types/sinon" "*" + +"@types/sinon@*": + version "10.0.11" + resolved "https://registry.yarnpkg.com/@types/sinon/-/sinon-10.0.11.tgz#8245827b05d3fc57a6601bd35aee1f7ad330fc42" + integrity sha512-dmZsHlBsKUtBpHriNjlK0ndlvEh8dcb9uV9Afsbt89QIyydpC7NcR+nWlAhASfy3GHnxTl4FX/aKE7XZUt/B4g== + dependencies: + "@types/sinonjs__fake-timers" "*" + +"@types/sinonjs__fake-timers@*": + version "8.1.2" + resolved "https://registry.yarnpkg.com/@types/sinonjs__fake-timers/-/sinonjs__fake-timers-8.1.2.tgz#bf2e02a3dbd4aecaf95942ecd99b7402e03fad5e" + integrity sha512-9GcLXF0/v3t80caGs5p2rRfkB+a8VBGLJZVih6CNFkx8IZ994wiKKLSRs9nuFwk1HevWs/1mnUmkApGrSGsShA== + +"@types/underscore@*": + version "1.11.4" + resolved "https://registry.yarnpkg.com/@types/underscore/-/underscore-1.11.4.tgz#62e393f8bc4bd8a06154d110c7d042a93751def3" + integrity sha512-uO4CD2ELOjw8tasUrAhvnn2W4A0ZECOvMjCivJr4gA9pGgjv+qxKWY9GLTMVEK8ej85BxQOocUyE7hImmSQYcg== + +"@types/web3@1.0.19": + version "1.0.19" + resolved "https://registry.yarnpkg.com/@types/web3/-/web3-1.0.19.tgz#46b85d91d398ded9ab7c85a5dd57cb33ac558924" + integrity sha512-fhZ9DyvDYDwHZUp5/STa9XW2re0E8GxoioYJ4pEUZ13YHpApSagixj7IAdoYH5uAK+UalGq6Ml8LYzmgRA/q+A== + dependencies: + "@types/bn.js" "*" + "@types/underscore" "*" "@types/yauzl@^2.9.1": version "2.10.0" @@ -1378,96 +1646,99 @@ "@types/node" "*" "@typescript-eslint/eslint-plugin-tslint@^5.27.1": - version "5.62.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin-tslint/-/eslint-plugin-tslint-5.62.0.tgz#220242dcd23711c400d4f5d5d876d5107cea4be0" - integrity sha512-qsYLld1+xed2lVwHbCxkCWdhRcByLNOjpccxK6HHlem724PbMcL1/dmH7jMQaqIpbfPAGkIypyyk3q5nUgtkhA== + version "5.37.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin-tslint/-/eslint-plugin-tslint-5.37.0.tgz#bb678cac00843db3ffbb9aca3fd83c9fc4cbf7ca" + integrity sha512-wMyqF+WqS5rioQCwihWZJpnpVB/Jg0hLPHr0kWw7HOQtWkWUS71yGxKqJuIP3k0nkdwBk7tt17bZjAB8MOqFBQ== dependencies: - "@typescript-eslint/utils" "5.62.0" + "@typescript-eslint/utils" "5.37.0" + lodash "^4.17.21" "@typescript-eslint/eslint-plugin@^5.14.0": - version "5.62.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.62.0.tgz#aeef0328d172b9e37d9bab6dbc13b87ed88977db" - integrity sha512-TiZzBSJja/LbhNPvk6yc0JrX9XqhQ0hdh6M2svYfsHGejaKFIAGd9MQ+ERIMzLGlN/kZoYIgdxFV0PuljTKXag== - dependencies: - "@eslint-community/regexpp" "^4.4.0" - "@typescript-eslint/scope-manager" "5.62.0" - "@typescript-eslint/type-utils" "5.62.0" - "@typescript-eslint/utils" "5.62.0" + version "5.37.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.37.0.tgz#5ccdd5d9004120f28fc6e717fb4b5c9bddcfbc04" + integrity sha512-Fde6W0IafXktz1UlnhGkrrmnnGpAo1kyX7dnyHHVrmwJOn72Oqm3eYtddrpOwwel2W8PAK9F3pIL5S+lfoM0og== + dependencies: + "@typescript-eslint/scope-manager" "5.37.0" + "@typescript-eslint/type-utils" "5.37.0" + "@typescript-eslint/utils" "5.37.0" debug "^4.3.4" - graphemer "^1.4.0" + functional-red-black-tree "^1.0.1" ignore "^5.2.0" - natural-compare-lite "^1.4.0" + regexpp "^3.2.0" semver "^7.3.7" tsutils "^3.21.0" "@typescript-eslint/parser@^5.14.0": - version "5.62.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-5.62.0.tgz#1b63d082d849a2fcae8a569248fbe2ee1b8a56c7" - integrity sha512-VlJEV0fOQ7BExOsHYAGrgbEiZoi8D+Bl2+f6V2RrXerRSylnp+ZBHmPvaIa8cz0Ajx7WO7Z5RqfgYg7ED1nRhA== + version "5.37.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-5.37.0.tgz#c382077973f3a4ede7453fb14cadcad3970cbf3b" + integrity sha512-01VzI/ipYKuaG5PkE5+qyJ6m02fVALmMPY3Qq5BHflDx3y4VobbLdHQkSMg9VPRS4KdNt4oYTMaomFoHonBGAw== dependencies: - "@typescript-eslint/scope-manager" "5.62.0" - "@typescript-eslint/types" "5.62.0" - "@typescript-eslint/typescript-estree" "5.62.0" + "@typescript-eslint/scope-manager" "5.37.0" + "@typescript-eslint/types" "5.37.0" + "@typescript-eslint/typescript-estree" "5.37.0" debug "^4.3.4" -"@typescript-eslint/scope-manager@5.62.0": - version "5.62.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-5.62.0.tgz#d9457ccc6a0b8d6b37d0eb252a23022478c5460c" - integrity sha512-VXuvVvZeQCQb5Zgf4HAxc04q5j+WrNAtNh9OwCsCgpKqESMTu3tF/jhZ3xG6T4NZwWl65Bg8KuS2uEvhSfLl0w== +"@typescript-eslint/scope-manager@5.37.0": + version "5.37.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-5.37.0.tgz#044980e4f1516a774a418dafe701a483a6c9f9ca" + integrity sha512-F67MqrmSXGd/eZnujjtkPgBQzgespu/iCZ+54Ok9X5tALb9L2v3G+QBSoWkXG0p3lcTJsL+iXz5eLUEdSiJU9Q== dependencies: - "@typescript-eslint/types" "5.62.0" - "@typescript-eslint/visitor-keys" "5.62.0" + "@typescript-eslint/types" "5.37.0" + "@typescript-eslint/visitor-keys" "5.37.0" -"@typescript-eslint/type-utils@5.62.0": - version "5.62.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/type-utils/-/type-utils-5.62.0.tgz#286f0389c41681376cdad96b309cedd17d70346a" - integrity sha512-xsSQreu+VnfbqQpW5vnCJdq1Z3Q0U31qiWmRhr98ONQmcp/yhiPJFPq8MXiJVLiksmOKSjIldZzkebzHuCGzew== +"@typescript-eslint/type-utils@5.37.0": + version "5.37.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/type-utils/-/type-utils-5.37.0.tgz#43ed2f567ada49d7e33a6e4b6f9babd060445fe5" + integrity sha512-BSx/O0Z0SXOF5tY0bNTBcDEKz2Ec20GVYvq/H/XNKiUorUFilH7NPbFUuiiyzWaSdN3PA8JV0OvYx0gH/5aFAQ== dependencies: - "@typescript-eslint/typescript-estree" "5.62.0" - "@typescript-eslint/utils" "5.62.0" + "@typescript-eslint/typescript-estree" "5.37.0" + "@typescript-eslint/utils" "5.37.0" debug "^4.3.4" tsutils "^3.21.0" -"@typescript-eslint/types@5.62.0": - version "5.62.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-5.62.0.tgz#258607e60effa309f067608931c3df6fed41fd2f" - integrity sha512-87NVngcbVXUahrRTqIK27gD2t5Cu1yuCXxbLcFtCzZGlfyVWWh8mLHkoxzjsB6DDNnvdL+fW8MiwPEJyGJQDgQ== +"@typescript-eslint/types@5.37.0": + version "5.37.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-5.37.0.tgz#09e4870a5f3af7af3f84e08d792644a87d232261" + integrity sha512-3frIJiTa5+tCb2iqR/bf7XwU20lnU05r/sgPJnRpwvfZaqCJBrl8Q/mw9vr3NrNdB/XtVyMA0eppRMMBqdJ1bA== -"@typescript-eslint/typescript-estree@5.62.0": - version "5.62.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-5.62.0.tgz#7d17794b77fabcac615d6a48fb143330d962eb9b" - integrity sha512-CmcQ6uY7b9y694lKdRB8FEel7JbU/40iSAPomu++SjLMntB+2Leay2LO6i8VnJk58MtE9/nQSFIH6jpyRWyYzA== +"@typescript-eslint/typescript-estree@5.37.0": + version "5.37.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-5.37.0.tgz#956dcf5c98363bcb97bdd5463a0a86072ff79355" + integrity sha512-JkFoFIt/cx59iqEDSgIGnQpCTRv96MQnXCYvJi7QhBC24uyuzbD8wVbajMB1b9x4I0octYFJ3OwjAwNqk1AjDA== dependencies: - "@typescript-eslint/types" "5.62.0" - "@typescript-eslint/visitor-keys" "5.62.0" + "@typescript-eslint/types" "5.37.0" + "@typescript-eslint/visitor-keys" "5.37.0" debug "^4.3.4" globby "^11.1.0" is-glob "^4.0.3" semver "^7.3.7" tsutils "^3.21.0" -"@typescript-eslint/utils@5.62.0": - version "5.62.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-5.62.0.tgz#141e809c71636e4a75daa39faed2fb5f4b10df86" - integrity sha512-n8oxjeb5aIbPFEtmQxQYOLI0i9n5ySBEY/ZEHHZqKQSFnxio1rv6dthascc9dLuwrL0RC5mPCxB7vnAVGAYWAQ== +"@typescript-eslint/utils@5.37.0": + version "5.37.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-5.37.0.tgz#7784cb8e91390c4f90ccaffd24a0cf9874df81b2" + integrity sha512-jUEJoQrWbZhmikbcWSMDuUSxEE7ID2W/QCV/uz10WtQqfOuKZUqFGjqLJ+qhDd17rjgp+QJPqTdPIBWwoob2NQ== dependencies: - "@eslint-community/eslint-utils" "^4.2.0" "@types/json-schema" "^7.0.9" - "@types/semver" "^7.3.12" - "@typescript-eslint/scope-manager" "5.62.0" - "@typescript-eslint/types" "5.62.0" - "@typescript-eslint/typescript-estree" "5.62.0" + "@typescript-eslint/scope-manager" "5.37.0" + "@typescript-eslint/types" "5.37.0" + "@typescript-eslint/typescript-estree" "5.37.0" eslint-scope "^5.1.1" - semver "^7.3.7" + eslint-utils "^3.0.0" -"@typescript-eslint/visitor-keys@5.62.0": - version "5.62.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-5.62.0.tgz#2174011917ce582875954ffe2f6912d5931e353e" - integrity sha512-07ny+LHRzQXepkGg6w0mFY41fVUNBrL2Roj/++7V1txKugfjm/Ci/qSND03r2RhlJhJYMcTn9AhhSSqQp0Ysyw== +"@typescript-eslint/visitor-keys@5.37.0": + version "5.37.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-5.37.0.tgz#7b72dd343295ea11e89b624995abc7103c554eee" + integrity sha512-Hp7rT4cENBPIzMwrlehLW/28EVCOcE9U1Z1BQTc8EA8v5qpr7GRGuG+U58V5tTY48zvUOA3KHvw3rA8tY9fbdA== dependencies: - "@typescript-eslint/types" "5.62.0" + "@typescript-eslint/types" "5.37.0" eslint-visitor-keys "^3.3.0" +"@ungap/promise-all-settled@1.1.2": + version "1.1.2" + resolved "https://registry.yarnpkg.com/@ungap/promise-all-settled/-/promise-all-settled-1.1.2.tgz#aa58042711d6e3275dd37dc597e5d31e8c290a44" + integrity sha512-sL/cEvJWAnClXw0wHk85/2L0G6Sj8UB0Ctc1TEMbKSsmpRosqhwj9gWgFRZSrBr2f9tiXISwNhCPmlfqUqyb9Q== + "@yarnpkg/lockfile@^1.1.0": version "1.1.0" resolved "https://registry.yarnpkg.com/@yarnpkg/lockfile/-/lockfile-1.1.0.tgz#e77a97fbd345b76d83245edcd17d393b1b41fb31" @@ -1481,25 +1752,14 @@ abbrev@1: abbrev@1.0.x: version "1.0.9" resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.0.9.tgz#91b4792588a7738c25f35dd6f63752a2f8776135" - integrity sha512-LEyx4aLEC3x6T0UguF6YILf+ntvmOaWsVfENmIW0E9H09vKlLDGelMjjSm0jkDHALj8A8quZ/HapKNigzwge+Q== + integrity sha1-kbR5JYinc4wl813W9jdSovh3YTU= -abortcontroller-polyfill@^1.7.3: - version "1.7.5" - resolved "https://registry.yarnpkg.com/abortcontroller-polyfill/-/abortcontroller-polyfill-1.7.5.tgz#6738495f4e901fbb57b6c0611d0c75f76c485bed" - integrity sha512-JMJ5soJWP18htbbxJjG7bG6yuI6pRhgJ0scHHTfkUjf6wjP912xZWvM+A4sJK3gqd9E8fcPbDnOefbA9Th/FIQ== - -abstract-level@^1.0.0, abstract-level@^1.0.2, abstract-level@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/abstract-level/-/abstract-level-1.0.3.tgz#78a67d3d84da55ee15201486ab44c09560070741" - integrity sha512-t6jv+xHy+VYwc4xqZMn2Pa9DjcdzvzZmQGRjTFc8spIbRGHgBrEKbPq+rYXc7CCo0lxgYvSgKVg9qZAhpVQSjA== +abort-controller@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/abort-controller/-/abort-controller-3.0.0.tgz#eaf54d53b62bae4138e809ca225c8439a6efb392" + integrity sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg== dependencies: - buffer "^6.0.3" - catering "^2.1.0" - is-buffer "^2.0.5" - level-supports "^4.0.0" - level-transcoder "^1.0.1" - module-error "^1.0.1" - queue-microtask "^1.2.3" + event-target-shim "^5.0.0" abstract-leveldown@3.0.0: version "3.0.0" @@ -1522,6 +1782,17 @@ abstract-leveldown@^5.0.0, abstract-leveldown@~5.0.0: dependencies: xtend "~4.0.0" +abstract-leveldown@^6.2.1: + version "6.3.0" + resolved "https://registry.yarnpkg.com/abstract-leveldown/-/abstract-leveldown-6.3.0.tgz#d25221d1e6612f820c35963ba4bd739928f6026a" + integrity sha512-TU5nlYgta8YrBMNpc9FwQzRbiXsj49gsALsXadbGHt9CROPzX5fB0rWDR5mtdpOOKa5XqRFpbj1QroPAoPzVjQ== + dependencies: + buffer "^5.5.0" + immediate "^3.2.3" + level-concat-iterator "~2.0.0" + level-supports "~1.0.0" + xtend "~4.0.0" + abstract-leveldown@~2.6.0: version "2.6.3" resolved "https://registry.yarnpkg.com/abstract-leveldown/-/abstract-leveldown-2.6.3.tgz#1c5e8c6a5ef965ae8c35dfb3a8770c476b82c4b8" @@ -1529,6 +1800,17 @@ abstract-leveldown@~2.6.0: dependencies: xtend "~4.0.0" +abstract-leveldown@~6.2.1: + version "6.2.3" + resolved "https://registry.yarnpkg.com/abstract-leveldown/-/abstract-leveldown-6.2.3.tgz#036543d87e3710f2528e47040bc3261b77a9a8eb" + integrity sha512-BsLm5vFMRUrrLeCcRc+G0t2qOaTzpoJQLOubq2XM72eNpjF5UdU5o/5NvlNhx95XHcAvcl8OMXr4mlg/fRgUXQ== + dependencies: + buffer "^5.5.0" + immediate "^3.2.3" + level-concat-iterator "~2.0.0" + level-supports "~1.0.0" + xtend "~4.0.0" + accepts@~1.3.8: version "1.3.8" resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.3.8.tgz#0bf0be125b67014adcb0b0921e62db7bffe16b2e" @@ -1537,7 +1819,7 @@ accepts@~1.3.8: mime-types "~2.1.34" negotiator "0.6.3" -acorn-jsx@^5.3.2: +acorn-jsx@^5.0.0, acorn-jsx@^5.3.2: version "5.3.2" resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.3.2.tgz#7ed5bb55908b3b2f1bc55c6af1653bada7f07937" integrity sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ== @@ -1547,15 +1829,25 @@ acorn-walk@^8.1.1: resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-8.2.0.tgz#741210f2e2426454508853a2f44d0ab83b7f69c1" integrity sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA== -acorn@^8.4.1, acorn@^8.9.0: - version "8.10.0" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.10.0.tgz#8be5b3907a67221a81ab23c7889c4c5526b62ec5" - integrity sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw== +acorn@^6.0.7: + version "6.4.2" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-6.4.2.tgz#35866fd710528e92de10cf06016498e47e39e1e6" + integrity sha512-XtGIhXwF8YM8bJhGxG5kXgjkEuNGLTkoYqVE+KMR+aspr4KGYmKYg7yUe3KghyQ9yheNwLnjmzh/7+gfDBmHCQ== + +acorn@^8.4.1: + version "8.7.0" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.7.0.tgz#90951fde0f8f09df93549481e5fc141445b791cf" + integrity sha512-V/LGr1APy+PXIwKebEWrkZPwoeoF+w1jiOBUmuxuiUIaOHtob8Qc9BTrYo7VuI5fR8tqsy+buA2WFooR5olqvQ== + +acorn@^8.8.0: + version "8.8.0" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.8.0.tgz#88c0187620435c7f6015803f5539dae05a9dbea8" + integrity sha512-QOxyigPVrpZ2GXT+PFyZTl6TtOFc5egxHIP9IlQ+RbupQuX4RkT/Bee4/kQuC02Xkzg84JcT7oLYtDIQxp+v7w== address@^1.0.1: - version "1.2.2" - resolved "https://registry.yarnpkg.com/address/-/address-1.2.2.tgz#2b5248dac5485a6390532c6a517fda2e3faac89e" - integrity sha512-4B/qKCfeE/ODUaAUpSwfzazo5x29WD4r3vXiWsB7I2mSDAihwEqKO+g8GELZUQSSAo5e1XTYh3ZVfLyxBc12nA== + version "1.1.2" + resolved "https://registry.yarnpkg.com/address/-/address-1.1.2.tgz#bf1116c9c758c51b7a933d296b72c221ed9428b6" + integrity sha512-aT6camzM4xEA54YVJYSqxz1kv4IHnQZRtThJJHhUMRExaU5spC7jX5ugSwTaTgJliIgs4VhZOk7htClvQ/LmRA== adm-zip@^0.4.16: version "0.4.16" @@ -1565,7 +1857,7 @@ adm-zip@^0.4.16: aes-js@3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/aes-js/-/aes-js-3.0.0.tgz#e21df10ad6c2053295bcbb8dab40b09dbea87e4d" - integrity sha512-H7wUZRn8WpTq9jocdxQ2c8x2sKo9ZVmzfRE13GiNJXfp7NcKYEdvl3vspKjXox6RIG2VtaRe4JFvxG4rqp2Zuw== + integrity sha1-4h3xCtbCBTKVvLuNq0Cwnb6ofk0= aes-js@^3.1.1: version "3.1.2" @@ -1587,7 +1879,7 @@ aggregate-error@^3.0.0: clean-stack "^2.0.0" indent-string "^4.0.0" -ajv@^6.12.3, ajv@^6.12.4, ajv@^6.12.6: +ajv@^6.10.0, ajv@^6.10.2, ajv@^6.12.3, ajv@^6.12.4, ajv@^6.6.1, ajv@^6.9.1: version "6.12.6" resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.6.tgz#baf5a62e802b07d977034586f8c3baf5adf26df4" integrity sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g== @@ -1598,9 +1890,9 @@ ajv@^6.12.3, ajv@^6.12.4, ajv@^6.12.6: uri-js "^4.2.2" ajv@^8.0.1: - version "8.12.0" - resolved "https://registry.yarnpkg.com/ajv/-/ajv-8.12.0.tgz#d1a0527323e22f53562c567c00991577dfbe19d1" - integrity sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA== + version "8.11.0" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-8.11.0.tgz#977e91dd96ca669f54a11e23e378e33b884a565f" + integrity sha512-wGgprdCvMalC0BztXvitD2hC04YffAvtsUn93JbGXYLAtCUO4xd17mCCZQxUOItiBwZvJScWo8NIvQMQ71rdpg== dependencies: fast-deep-equal "^3.1.1" json-schema-traverse "^1.0.0" @@ -1610,22 +1902,22 @@ ajv@^8.0.1: amdefine@>=0.0.4: version "1.0.1" resolved "https://registry.yarnpkg.com/amdefine/-/amdefine-1.0.1.tgz#4a5282ac164729e93619bcfd3ad151f817ce91f5" - integrity sha512-S2Hw0TtNkMJhIabBwIojKL9YHO5T0n5eNqWJ7Lrlel/zDbftQpxpapi8tZs3X1HWa+u+QeydGmzzNU0m09+Rcg== + integrity sha1-SlKCrBZHKek2Gbz9OtFR+BfOkfU= ansi-colors@3.2.3: version "3.2.3" resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-3.2.3.tgz#57d35b8686e851e2cc04c403f1c00203976a1813" integrity sha512-LEHHyuhlPY3TmuUYMh2oz89lTShfvgbmzaBcxve9t/9Wuy7Dwf4yoAKcND7KFT1HAQfqZ12qtc+DUrBMeKF9nw== -ansi-colors@4.1.1: +ansi-colors@4.1.1, ansi-colors@^4.1.1: version "4.1.1" resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-4.1.1.tgz#cbb9ae256bf750af1eab344f229aa27fe94ba348" integrity sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA== -ansi-colors@^4.1.1: - version "4.1.3" - resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-4.1.3.tgz#37611340eb2243e70cc604cad35d63270d48781b" - integrity sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw== +ansi-escapes@^3.2.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-3.2.0.tgz#8780b98ff9dbf5638152d1f1fe5c1d7b4442976b" + integrity sha512-cBhpre4ma+U0T1oM5fXg7Dy1Jw7zzwv7lt/GoCpr+hDQJoYnKVPLL4dCvSEFMmQurOQvSrwT7SL/DAlhBI97RQ== ansi-escapes@^4.3.0: version "4.3.2" @@ -1637,7 +1929,7 @@ ansi-escapes@^4.3.0: ansi-regex@^2.0.0: version "2.1.1" resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-2.1.1.tgz#c3b33ab5ee360d86e0e628f0468ae7ef27d654df" - integrity sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA== + integrity sha1-w7M6te42DYbg5ijwRorn7yfWVN8= ansi-regex@^3.0.0: version "3.0.1" @@ -1657,7 +1949,7 @@ ansi-regex@^5.0.1: ansi-styles@^2.2.1: version "2.2.1" resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-2.2.1.tgz#b432dd3358b634cf75e1e4664368240533c1ddbe" - integrity sha512-kmCevFghRiWM7HB5zTPULl4r9bVFSWjz62MhqizDGUrq2NWuNMQyuv4tHHoKJHs69M/MF64lEcHdYIocrdWQYA== + integrity sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4= ansi-styles@^3.2.0, ansi-styles@^3.2.1: version "3.2.1" @@ -1673,10 +1965,10 @@ ansi-styles@^4.0.0, ansi-styles@^4.1.0: dependencies: color-convert "^2.0.1" -antlr4@^4.11.0: - version "4.13.1" - resolved "https://registry.yarnpkg.com/antlr4/-/antlr4-4.13.1.tgz#1e0a1830a08faeb86217cb2e6c34716004e4253d" - integrity sha512-kiXTspaRYvnIArgE97z5YVVf/cDVQABr3abFRR6mE7yesLMkgu4ujuyV/sgxafQ8wgve0DJQUJ38Z8tkgA2izA== +antlr4@4.7.1: + version "4.7.1" + resolved "https://registry.yarnpkg.com/antlr4/-/antlr4-4.7.1.tgz#69984014f096e9e775f53dd9744bf994d8959773" + integrity sha512-haHyTW7Y9joE5MVs37P2lNYfU2RWBLfcRDD8OWldcdZm5TiCE91B5Xl1oWSwiDUSd4rlExpt2pu1fksYQjRBYQ== antlr4ts@^0.5.0-alpha.4: version "0.5.0-alpha.4" @@ -1684,9 +1976,9 @@ antlr4ts@^0.5.0-alpha.4: integrity sha512-WPQDt1B74OfPv/IMS2ekXAKkTZIHl88uMetg6q3OTqgFxZ/dxDXI0EWLyZid/1Pe6hTftyg5N7gel5wNAGxXyQ== anymatch@~3.1.1, anymatch@~3.1.2: - version "3.1.3" - resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.3.tgz#790c58b19ba1720a84205b57c618d5ad8524973e" - integrity sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw== + version "3.1.2" + resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.2.tgz#c0557c096af32f106198f4f4e2a383537e378716" + integrity sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg== dependencies: normalize-path "^3.0.0" picomatch "^2.0.4" @@ -1711,7 +2003,7 @@ argparse@^2.0.1: arr-diff@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/arr-diff/-/arr-diff-4.0.0.tgz#d6461074febfec71e7e15235761a329a5dc7c520" - integrity sha512-YVIQ82gZPGBebQV/a8dar4AitzCQs0jjXwMPZllpXMaGjXPYVUawSxQrRsjhjupyVxEvbHgUmIhKVlND+j02kA== + integrity sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA= arr-flatten@^1.1.0: version "1.1.0" @@ -1721,12 +2013,12 @@ arr-flatten@^1.1.0: arr-union@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/arr-union/-/arr-union-3.1.0.tgz#e39b09aea9def866a8f206e288af63919bae39c4" - integrity sha512-sKpyeERZ02v1FeCZT8lrfJq5u6goHCtpTAzPwJYe7c8SPFOboNjNg1vz2L4VTn9T4PQxEx13TbXLmYUcS6Ug7Q== + integrity sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ= array-back@^1.0.3, array-back@^1.0.4: version "1.0.4" resolved "https://registry.yarnpkg.com/array-back/-/array-back-1.0.4.tgz#644ba7f095f7ffcf7c43b5f0dc39d3c1f03c063b" - integrity sha512-1WxbZvrmyhkNoeYcizokbmh5oiOCIfyvGtcqbK3Ls1v1fKcquzxnQSceOx6tzq7jmai2kFLWIpGND2cLhH6TPw== + integrity sha1-ZEun8JX3/898Q7Xw3DnTwfA8Bjs= dependencies: typical "^2.6.0" @@ -1742,23 +2034,15 @@ array-back@^3.0.1, array-back@^3.1.0: resolved "https://registry.yarnpkg.com/array-back/-/array-back-3.1.0.tgz#b8859d7a508871c9a7b2cf42f99428f65e96bfb0" integrity sha512-TkuxA4UCOvxuDK6NZYXCalszEzj+TLszyASooky+i742l9TqsOdYCMJJupxRic61hwquNtppB3hgcuq9SVSH1Q== -array-back@^4.0.1, array-back@^4.0.2: +array-back@^4.0.1: version "4.0.2" resolved "https://registry.yarnpkg.com/array-back/-/array-back-4.0.2.tgz#8004e999a6274586beeb27342168652fdb89fa1e" integrity sha512-NbdMezxqf94cnNfWLL7V/im0Ub+Anbb0IoZhvzie8+4HJ4nMQuzHuy49FkGYCJK2yAloZ3meiB6AVMClbrI1vg== -array-buffer-byte-length@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/array-buffer-byte-length/-/array-buffer-byte-length-1.0.0.tgz#fabe8bc193fea865f317fe7807085ee0dee5aead" - integrity sha512-LPuwb2P+NrQw3XhxGc36+XSvuBPopovXYTR9Ew++Du9Yb/bx5AzBfrIsBoj0EZUifjQU+sHL21sseZ3jerWO/A== - dependencies: - call-bind "^1.0.2" - is-array-buffer "^3.0.1" - array-flatten@1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-1.1.1.tgz#9a5f699051b1e7073328f2a008968b64ea2955d2" - integrity sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg== + integrity sha1-ml9pkFGx5wczKPKgCJaLZOopVdI= array-union@^2.1.0: version "2.1.0" @@ -1768,41 +2052,17 @@ array-union@^2.1.0: array-uniq@1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/array-uniq/-/array-uniq-1.0.3.tgz#af6ac877a25cc7f74e058894753858dfdb24fdb6" - integrity sha512-MNha4BWQ6JbwhFhj03YK552f7cb3AzoE8SzeljgChvL1dl3IcvggXVz1DilzySZkCja+CXuZbdW7yATchWn8/Q== + integrity sha1-r2rId6Jcx/dOBYiUdThY39sk/bY= array-unique@^0.3.2: version "0.3.2" resolved "https://registry.yarnpkg.com/array-unique/-/array-unique-0.3.2.tgz#a894b75d4bc4f6cd679ef3244a9fd8f46ae2d428" - integrity sha512-SleRWjh9JUud2wH1hPs9rZBZ33H6T9HOiL0uwGnGx9FpE6wKGyfWugmbkEOIs6qWrZhg0LWeLziLrEwQJhs5mQ== - -array.prototype.reduce@^1.0.6: - version "1.0.6" - resolved "https://registry.yarnpkg.com/array.prototype.reduce/-/array.prototype.reduce-1.0.6.tgz#63149931808c5fc1e1354814923d92d45f7d96d5" - integrity sha512-UW+Mz8LG/sPSU8jRDCjVr6J/ZKAGpHfwrZ6kWTG5qCxIEiXdVshqGnu5vEZA8S1y6X4aCSbQZ0/EEsfvEvBiSg== - dependencies: - call-bind "^1.0.2" - define-properties "^1.2.0" - es-abstract "^1.22.1" - es-array-method-boxes-properly "^1.0.0" - is-string "^1.0.7" - -arraybuffer.prototype.slice@^1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.2.tgz#98bd561953e3e74bb34938e77647179dfe6e9f12" - integrity sha512-yMBKppFur/fbHu9/6USUe03bZ4knMYiwFBcyiaXB8Go0qNehwX6inYPzK9U0NeQvGxKthcmHcaR8P5MStSRBAw== - dependencies: - array-buffer-byte-length "^1.0.0" - call-bind "^1.0.2" - define-properties "^1.2.0" - es-abstract "^1.22.1" - get-intrinsic "^1.2.1" - is-array-buffer "^3.0.2" - is-shared-array-buffer "^1.0.2" + integrity sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg= asap@~2.0.6: version "2.0.6" resolved "https://registry.yarnpkg.com/asap/-/asap-2.0.6.tgz#e50347611d7e690943208bbdafebcbc2fb866d46" - integrity sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA== + integrity sha1-5QNHYR1+aQlDIIu9r+vLwvuGbUY= asn1.js@^5.2.0: version "5.4.1" @@ -1824,7 +2084,7 @@ asn1@~0.2.3: assert-plus@1.0.0, assert-plus@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/assert-plus/-/assert-plus-1.0.0.tgz#f12e0f3c5d77b0b1cdd9146942e4e96c1e4dd525" - integrity sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw== + integrity sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU= assertion-error@^1.1.0: version "1.1.0" @@ -1834,19 +2094,24 @@ assertion-error@^1.1.0: assign-symbols@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/assign-symbols/-/assign-symbols-1.0.0.tgz#59667f41fadd4f20ccbc2bb96b8d4f7f78ec0367" - integrity sha512-Q+JC7Whu8HhmTdBph/Tq59IoRtoy6KAm5zzPv00WdujX82lbAL8K7WVjne7vdCsAmbF4AYaDOPyO3k0kl8qIrw== + integrity sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c= -ast-parents@^0.0.1: +ast-parents@0.0.1: version "0.0.1" resolved "https://registry.yarnpkg.com/ast-parents/-/ast-parents-0.0.1.tgz#508fd0f05d0c48775d9eccda2e174423261e8dd3" - integrity sha512-XHusKxKz3zoYk1ic8Un640joHbFMhbqneyoZfoKnEGtf2ey9Uh/IdpcQplODdO/kENaMIWsD0nJm4+wX3UNLHA== + integrity sha1-UI/Q8F0MSHddnszaLhdEIyYejdM= + +astral-regex@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/astral-regex/-/astral-regex-1.0.0.tgz#6c8c3fb827dd43ee3918f27b82782ab7658a6fd9" + integrity sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg== astral-regex@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/astral-regex/-/astral-regex-2.0.0.tgz#483143c567aeed4785759c0865786dc77d7d2e31" integrity sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ== -async-eventemitter@^0.2.2: +async-eventemitter@^0.2.2, async-eventemitter@^0.2.4: version "0.2.4" resolved "https://registry.yarnpkg.com/async-eventemitter/-/async-eventemitter-0.2.4.tgz#f5e7c8ca7d3e46aab9ec40a292baf686a0bafaca" integrity sha512-pd20BwL7Yt1zwDFy+8MX8F1+WCT8aQeKj0kQnTrH9WaeRETlRamVhD0JtRPmrV4GfOJ2F9CvdQkZeZhnh2TuHw== @@ -1861,7 +2126,7 @@ async-limiter@~1.0.0: async@1.x, async@^1.4.2: version "1.5.2" resolved "https://registry.yarnpkg.com/async/-/async-1.5.2.tgz#ec6a61ae56480c0c3cb241c95618e20892f9672a" - integrity sha512-nSVgobk4rv61R9PUSDtYt7mPVB2olxNR5RWJcAsH676/ef11bUZwvu7+RGYrYauVdDPcO519v68wRhXQtxsV9w== + integrity sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo= async@2.6.2: version "2.6.2" @@ -1871,16 +2136,16 @@ async@2.6.2: lodash "^4.17.11" async@^2.0.1, async@^2.1.2, async@^2.4.0, async@^2.5.0, async@^2.6.1: - version "2.6.4" - resolved "https://registry.yarnpkg.com/async/-/async-2.6.4.tgz#706b7ff6084664cd7eae713f6f965433b5504221" - integrity sha512-mzo5dfJYwAn29PeiJ0zvwTo04zj8HDJj0Mn8TD7sno7q12prdbnasKJHhkm2c1LgrhlJ0teaea8860oxi51mGA== + version "2.6.3" + resolved "https://registry.yarnpkg.com/async/-/async-2.6.3.tgz#d72625e2344a3656e3a3ad4fa749fa83299d82ff" + integrity sha512-zflvls11DCy+dQWzTW2dzuilv8Z5X/pjfmZOWba6TNIVDm+2UDaJmXSOXlasHKfNBs8oo3M0aT50fDEWfKZjXg== dependencies: lodash "^4.17.14" asynckit@^0.4.0: version "0.4.0" resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" - integrity sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q== + integrity sha1-x57Zf380y48robyXkLzDZkdLS3k= at-least-node@^1.0.0: version "1.0.0" @@ -1900,12 +2165,12 @@ available-typed-arrays@^1.0.5: aws-sign2@~0.7.0: version "0.7.0" resolved "https://registry.yarnpkg.com/aws-sign2/-/aws-sign2-0.7.0.tgz#b46e890934a9591f2d2f6f86d7e6a9f1b3fe76a8" - integrity sha512-08kcGqnYf/YmjoRhfxyu+CLxBjUtHLXLXX/vUfx9l2LYzG3c1m61nrpyFUZI6zeS+Li/wWMMidD9KgrqtGq3mA== + integrity sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg= aws4@^1.8.0: - version "1.12.0" - resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.12.0.tgz#ce1c9d143389679e253b314241ea9aa5cec980d3" - integrity sha512-NmWvPnx0F1SfrQbYwOi7OeaNGokp9XhzNioJ/CSBs8Qa4vxug81mhJEAVZwxXuBmYB5KDRfMq/F3RR0BIU7sWg== + version "1.11.0" + resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.11.0.tgz#d61f46d83b2519250e2784daf5b09479a8b41c59" + integrity sha512-xh1Rl34h6Fi1DC2WWKfxUTVqRsNnr6LsKz2+hfwDxQJWmrx8+c7ylaqBMcHfl1U1r2dsifOvKX3LQuLNZ+XSvA== axios@^0.21.1: version "0.21.4" @@ -1925,7 +2190,7 @@ axios@^0.27.2: babel-code-frame@^6.26.0: version "6.26.0" resolved "https://registry.yarnpkg.com/babel-code-frame/-/babel-code-frame-6.26.0.tgz#63fd43f7dc1e3bb7ce35947db8fe369a3f58c74b" - integrity sha512-XqYMR2dfdGMW+hd0IUZ2PwK+fGeFkOxZJ0wY+JaQAHzt1Zx8LcvpiZD2NiGkEG8qx0CfkAOr5xt76d1e8vG90g== + integrity sha1-Y/1D99weO7fONZR9uP42mj9Yx0s= dependencies: chalk "^1.1.3" esutils "^2.0.2" @@ -1973,7 +2238,7 @@ babel-generator@^6.26.0: babel-helper-builder-binary-assignment-operator-visitor@^6.24.1: version "6.24.1" resolved "https://registry.yarnpkg.com/babel-helper-builder-binary-assignment-operator-visitor/-/babel-helper-builder-binary-assignment-operator-visitor-6.24.1.tgz#cce4517ada356f4220bcae8a02c2b346f9a56664" - integrity sha512-gCtfYORSG1fUMX4kKraymq607FWgMWg+j42IFPc18kFQEsmtaibP4UrqsXt8FlEJle25HUd4tsoDR7H2wDhe9Q== + integrity sha1-zORReto1b0IgvK6KAsKzRvmlZmQ= dependencies: babel-helper-explode-assignable-expression "^6.24.1" babel-runtime "^6.22.0" @@ -1982,7 +2247,7 @@ babel-helper-builder-binary-assignment-operator-visitor@^6.24.1: babel-helper-call-delegate@^6.24.1: version "6.24.1" resolved "https://registry.yarnpkg.com/babel-helper-call-delegate/-/babel-helper-call-delegate-6.24.1.tgz#ece6aacddc76e41c3461f88bfc575bd0daa2df8d" - integrity sha512-RL8n2NiEj+kKztlrVJM9JT1cXzzAdvWFh76xh/H1I4nKwunzE4INBXn8ieCZ+wh4zWszZk7NBS1s/8HR5jDkzQ== + integrity sha1-7Oaqzdx25Bw0YfiL/Fdb0Nqi340= dependencies: babel-helper-hoist-variables "^6.24.1" babel-runtime "^6.22.0" @@ -1992,7 +2257,7 @@ babel-helper-call-delegate@^6.24.1: babel-helper-define-map@^6.24.1: version "6.26.0" resolved "https://registry.yarnpkg.com/babel-helper-define-map/-/babel-helper-define-map-6.26.0.tgz#a5f56dab41a25f97ecb498c7ebaca9819f95be5f" - integrity sha512-bHkmjcC9lM1kmZcVpA5t2om2nzT/xiZpo6TJq7UlZ3wqKfzia4veeXbIhKvJXAMzhhEBd3cR1IElL5AenWEUpA== + integrity sha1-pfVtq0GiX5fstJjH66ypgZ+Vvl8= dependencies: babel-helper-function-name "^6.24.1" babel-runtime "^6.26.0" @@ -2002,7 +2267,7 @@ babel-helper-define-map@^6.24.1: babel-helper-explode-assignable-expression@^6.24.1: version "6.24.1" resolved "https://registry.yarnpkg.com/babel-helper-explode-assignable-expression/-/babel-helper-explode-assignable-expression-6.24.1.tgz#f25b82cf7dc10433c55f70592d5746400ac22caa" - integrity sha512-qe5csbhbvq6ccry9G7tkXbzNtcDiH4r51rrPUbwwoTzZ18AqxWYRZT6AOmxrpxKnQBW0pYlBI/8vh73Z//78nQ== + integrity sha1-8luCz33BBDPFX3BZLVdGQArCLKo= dependencies: babel-runtime "^6.22.0" babel-traverse "^6.24.1" @@ -2011,7 +2276,7 @@ babel-helper-explode-assignable-expression@^6.24.1: babel-helper-function-name@^6.24.1: version "6.24.1" resolved "https://registry.yarnpkg.com/babel-helper-function-name/-/babel-helper-function-name-6.24.1.tgz#d3475b8c03ed98242a25b48351ab18399d3580a9" - integrity sha512-Oo6+e2iX+o9eVvJ9Y5eKL5iryeRdsIkwRYheCuhYdVHsdEQysbc2z2QkqCLIYnNxkT5Ss3ggrHdXiDI7Dhrn4Q== + integrity sha1-00dbjAPtmCQqJbSDUasYOZ01gKk= dependencies: babel-helper-get-function-arity "^6.24.1" babel-runtime "^6.22.0" @@ -2022,7 +2287,7 @@ babel-helper-function-name@^6.24.1: babel-helper-get-function-arity@^6.24.1: version "6.24.1" resolved "https://registry.yarnpkg.com/babel-helper-get-function-arity/-/babel-helper-get-function-arity-6.24.1.tgz#8f7782aa93407c41d3aa50908f89b031b1b6853d" - integrity sha512-WfgKFX6swFB1jS2vo+DwivRN4NB8XUdM3ij0Y1gnC21y1tdBoe6xjVnd7NSI6alv+gZXCtJqvrTeMW3fR/c0ng== + integrity sha1-j3eCqpNAfEHTqlCQj4mwMbG2hT0= dependencies: babel-runtime "^6.22.0" babel-types "^6.24.1" @@ -2030,7 +2295,7 @@ babel-helper-get-function-arity@^6.24.1: babel-helper-hoist-variables@^6.24.1: version "6.24.1" resolved "https://registry.yarnpkg.com/babel-helper-hoist-variables/-/babel-helper-hoist-variables-6.24.1.tgz#1ecb27689c9d25513eadbc9914a73f5408be7a76" - integrity sha512-zAYl3tqerLItvG5cKYw7f1SpvIxS9zi7ohyGHaI9cgDUjAT6YcY9jIEH5CstetP5wHIVSceXwNS7Z5BpJg+rOw== + integrity sha1-HssnaJydJVE+rbyZFKc/VAi+enY= dependencies: babel-runtime "^6.22.0" babel-types "^6.24.1" @@ -2038,7 +2303,7 @@ babel-helper-hoist-variables@^6.24.1: babel-helper-optimise-call-expression@^6.24.1: version "6.24.1" resolved "https://registry.yarnpkg.com/babel-helper-optimise-call-expression/-/babel-helper-optimise-call-expression-6.24.1.tgz#f7a13427ba9f73f8f4fa993c54a97882d1244257" - integrity sha512-Op9IhEaxhbRT8MDXx2iNuMgciu2V8lDvYCNQbDGjdBNCjaMvyLf4wl4A3b8IgndCyQF8TwfgsQ8T3VD8aX1/pA== + integrity sha1-96E0J7qfc/j0+pk8VKl4gtEkQlc= dependencies: babel-runtime "^6.22.0" babel-types "^6.24.1" @@ -2046,7 +2311,7 @@ babel-helper-optimise-call-expression@^6.24.1: babel-helper-regex@^6.24.1: version "6.26.0" resolved "https://registry.yarnpkg.com/babel-helper-regex/-/babel-helper-regex-6.26.0.tgz#325c59f902f82f24b74faceed0363954f6495e72" - integrity sha512-VlPiWmqmGJp0x0oK27Out1D+71nVVCTSdlbhIVoaBAj2lUgrNjBCRR9+llO4lTSb2O4r7PJg+RobRkhBrf6ofg== + integrity sha1-MlxZ+QL4LyS3T6zu0DY5VPZJXnI= dependencies: babel-runtime "^6.26.0" babel-types "^6.26.0" @@ -2055,7 +2320,7 @@ babel-helper-regex@^6.24.1: babel-helper-remap-async-to-generator@^6.24.1: version "6.24.1" resolved "https://registry.yarnpkg.com/babel-helper-remap-async-to-generator/-/babel-helper-remap-async-to-generator-6.24.1.tgz#5ec581827ad723fecdd381f1c928390676e4551b" - integrity sha512-RYqaPD0mQyQIFRu7Ho5wE2yvA/5jxqCIj/Lv4BXNq23mHYu/vxikOy2JueLiBxQknwapwrJeNCesvY0ZcfnlHg== + integrity sha1-XsWBgnrXI/7N04HxySg5BnbkVRs= dependencies: babel-helper-function-name "^6.24.1" babel-runtime "^6.22.0" @@ -2066,7 +2331,7 @@ babel-helper-remap-async-to-generator@^6.24.1: babel-helper-replace-supers@^6.24.1: version "6.24.1" resolved "https://registry.yarnpkg.com/babel-helper-replace-supers/-/babel-helper-replace-supers-6.24.1.tgz#bf6dbfe43938d17369a213ca8a8bf74b6a90ab1a" - integrity sha512-sLI+u7sXJh6+ToqDr57Bv973kCepItDhMou0xCP2YPVmR1jkHSCY+p1no8xErbV1Siz5QE8qKT1WIwybSWlqjw== + integrity sha1-v22/5Dk40XNpohPKiov3S2qQqxo= dependencies: babel-helper-optimise-call-expression "^6.24.1" babel-messages "^6.23.0" @@ -2078,7 +2343,7 @@ babel-helper-replace-supers@^6.24.1: babel-helpers@^6.24.1: version "6.24.1" resolved "https://registry.yarnpkg.com/babel-helpers/-/babel-helpers-6.24.1.tgz#3471de9caec388e5c850e597e58a26ddf37602b2" - integrity sha512-n7pFrqQm44TCYvrCDb0MqabAF+JUBq+ijBvNMUxpkLjJaAu32faIexewMumrH5KLLJ1HDyT0PTEqRyAe/GwwuQ== + integrity sha1-NHHenK7DiOXIUOWX5Yom3fN2ArI= dependencies: babel-runtime "^6.22.0" babel-template "^6.24.1" @@ -2086,36 +2351,36 @@ babel-helpers@^6.24.1: babel-messages@^6.23.0: version "6.23.0" resolved "https://registry.yarnpkg.com/babel-messages/-/babel-messages-6.23.0.tgz#f3cdf4703858035b2a2951c6ec5edf6c62f2630e" - integrity sha512-Bl3ZiA+LjqaMtNYopA9TYE9HP1tQ+E5dLxE0XrAzcIJeK2UqF0/EaqXwBn9esd4UmTfEab+P+UYQ1GnioFIb/w== + integrity sha1-8830cDhYA1sqKVHG7F7fbGLyYw4= dependencies: babel-runtime "^6.22.0" babel-plugin-check-es2015-constants@^6.22.0: version "6.22.0" resolved "https://registry.yarnpkg.com/babel-plugin-check-es2015-constants/-/babel-plugin-check-es2015-constants-6.22.0.tgz#35157b101426fd2ffd3da3f75c7d1e91835bbf8a" - integrity sha512-B1M5KBP29248dViEo1owyY32lk1ZSH2DaNNrXLGt8lyjjHm7pBqAdQ7VKUPR6EEDO323+OvT3MQXbCin8ooWdA== + integrity sha1-NRV7EBQm/S/9PaP3XH0ekYNbv4o= dependencies: babel-runtime "^6.22.0" babel-plugin-syntax-async-functions@^6.8.0: version "6.13.0" resolved "https://registry.yarnpkg.com/babel-plugin-syntax-async-functions/-/babel-plugin-syntax-async-functions-6.13.0.tgz#cad9cad1191b5ad634bf30ae0872391e0647be95" - integrity sha512-4Zp4unmHgw30A1eWI5EpACji2qMocisdXhAftfhXoSV9j0Tvj6nRFE3tOmRY912E0FMRm/L5xWE7MGVT2FoLnw== + integrity sha1-ytnK0RkbWtY0vzCuCHI5HgZHvpU= babel-plugin-syntax-exponentiation-operator@^6.8.0: version "6.13.0" resolved "https://registry.yarnpkg.com/babel-plugin-syntax-exponentiation-operator/-/babel-plugin-syntax-exponentiation-operator-6.13.0.tgz#9ee7e8337290da95288201a6a57f4170317830de" - integrity sha512-Z/flU+T9ta0aIEKl1tGEmN/pZiI1uXmCiGFRegKacQfEJzp7iNsKloZmyJlQr+75FCJtiFfGIK03SiCvCt9cPQ== + integrity sha1-nufoM3KQ2pUoggGmpX9BcDF4MN4= babel-plugin-syntax-trailing-function-commas@^6.22.0: version "6.22.0" resolved "https://registry.yarnpkg.com/babel-plugin-syntax-trailing-function-commas/-/babel-plugin-syntax-trailing-function-commas-6.22.0.tgz#ba0360937f8d06e40180a43fe0d5616fff532cf3" - integrity sha512-Gx9CH3Q/3GKbhs07Bszw5fPTlU+ygrOGfAhEt7W2JICwufpC4SuO0mG0+4NykPBSYPMJhqvVlDBU17qB1D+hMQ== + integrity sha1-ugNgk3+NBuQBgKQ/4NVhb/9TLPM= babel-plugin-transform-async-to-generator@^6.22.0: version "6.24.1" resolved "https://registry.yarnpkg.com/babel-plugin-transform-async-to-generator/-/babel-plugin-transform-async-to-generator-6.24.1.tgz#6536e378aff6cb1d5517ac0e40eb3e9fc8d08761" - integrity sha512-7BgYJujNCg0Ti3x0c/DL3tStvnKS6ktIYOmo9wginv/dfZOrbSZ+qG4IRRHMBOzZ5Awb1skTiAsQXg/+IWkZYw== + integrity sha1-ZTbjeK/2yx1VF6wOQOs+n8jQh2E= dependencies: babel-helper-remap-async-to-generator "^6.24.1" babel-plugin-syntax-async-functions "^6.8.0" @@ -2124,21 +2389,21 @@ babel-plugin-transform-async-to-generator@^6.22.0: babel-plugin-transform-es2015-arrow-functions@^6.22.0: version "6.22.0" resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-arrow-functions/-/babel-plugin-transform-es2015-arrow-functions-6.22.0.tgz#452692cb711d5f79dc7f85e440ce41b9f244d221" - integrity sha512-PCqwwzODXW7JMrzu+yZIaYbPQSKjDTAsNNlK2l5Gg9g4rz2VzLnZsStvp/3c46GfXpwkyufb3NCyG9+50FF1Vg== + integrity sha1-RSaSy3EdX3ncf4XkQM5BufJE0iE= dependencies: babel-runtime "^6.22.0" babel-plugin-transform-es2015-block-scoped-functions@^6.22.0: version "6.22.0" resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-block-scoped-functions/-/babel-plugin-transform-es2015-block-scoped-functions-6.22.0.tgz#bbc51b49f964d70cb8d8e0b94e820246ce3a6141" - integrity sha512-2+ujAT2UMBzYFm7tidUsYh+ZoIutxJ3pN9IYrF1/H6dCKtECfhmB8UkHVpyxDwkj0CYbQG35ykoz925TUnBc3A== + integrity sha1-u8UbSflk1wy42OC5ToICRs46YUE= dependencies: babel-runtime "^6.22.0" babel-plugin-transform-es2015-block-scoping@^6.23.0: version "6.26.0" resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-block-scoping/-/babel-plugin-transform-es2015-block-scoping-6.26.0.tgz#d70f5299c1308d05c12f463813b0a09e73b1895f" - integrity sha512-YiN6sFAQ5lML8JjCmr7uerS5Yc/EMbgg9G8ZNmk2E3nYX4ckHR01wrkeeMijEf5WHNK5TW0Sl0Uu3pv3EdOJWw== + integrity sha1-1w9SmcEwjQXBL0Y4E7CgnnOxiV8= dependencies: babel-runtime "^6.26.0" babel-template "^6.26.0" @@ -2149,7 +2414,7 @@ babel-plugin-transform-es2015-block-scoping@^6.23.0: babel-plugin-transform-es2015-classes@^6.23.0: version "6.24.1" resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-classes/-/babel-plugin-transform-es2015-classes-6.24.1.tgz#5a4c58a50c9c9461e564b4b2a3bfabc97a2584db" - integrity sha512-5Dy7ZbRinGrNtmWpquZKZ3EGY8sDgIVB4CU8Om8q8tnMLrD/m94cKglVcHps0BCTdZ0TJeeAWOq2TK9MIY6cag== + integrity sha1-WkxYpQyclGHlZLSyo7+ryXolhNs= dependencies: babel-helper-define-map "^6.24.1" babel-helper-function-name "^6.24.1" @@ -2164,7 +2429,7 @@ babel-plugin-transform-es2015-classes@^6.23.0: babel-plugin-transform-es2015-computed-properties@^6.22.0: version "6.24.1" resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-computed-properties/-/babel-plugin-transform-es2015-computed-properties-6.24.1.tgz#6fe2a8d16895d5634f4cd999b6d3480a308159b3" - integrity sha512-C/uAv4ktFP/Hmh01gMTvYvICrKze0XVX9f2PdIXuriCSvUmV9j+u+BB9f5fJK3+878yMK6dkdcq+Ymr9mrcLzw== + integrity sha1-b+Ko0WiV1WNPTNmZttNICjCBWbM= dependencies: babel-runtime "^6.22.0" babel-template "^6.24.1" @@ -2172,14 +2437,14 @@ babel-plugin-transform-es2015-computed-properties@^6.22.0: babel-plugin-transform-es2015-destructuring@^6.23.0: version "6.23.0" resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-destructuring/-/babel-plugin-transform-es2015-destructuring-6.23.0.tgz#997bb1f1ab967f682d2b0876fe358d60e765c56d" - integrity sha512-aNv/GDAW0j/f4Uy1OEPZn1mqD+Nfy9viFGBfQ5bZyT35YqOiqx7/tXdyfZkJ1sC21NyEsBdfDY6PYmLHF4r5iA== + integrity sha1-mXux8auWf2gtKwh2/jWNYOdlxW0= dependencies: babel-runtime "^6.22.0" babel-plugin-transform-es2015-duplicate-keys@^6.22.0: version "6.24.1" resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-duplicate-keys/-/babel-plugin-transform-es2015-duplicate-keys-6.24.1.tgz#73eb3d310ca969e3ef9ec91c53741a6f1576423e" - integrity sha512-ossocTuPOssfxO2h+Z3/Ea1Vo1wWx31Uqy9vIiJusOP4TbF7tPs9U0sJ9pX9OJPf4lXRGj5+6Gkl/HHKiAP5ug== + integrity sha1-c+s9MQypaePvnskcU3QabxV2Qj4= dependencies: babel-runtime "^6.22.0" babel-types "^6.24.1" @@ -2187,14 +2452,14 @@ babel-plugin-transform-es2015-duplicate-keys@^6.22.0: babel-plugin-transform-es2015-for-of@^6.23.0: version "6.23.0" resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-for-of/-/babel-plugin-transform-es2015-for-of-6.23.0.tgz#f47c95b2b613df1d3ecc2fdb7573623c75248691" - integrity sha512-DLuRwoygCoXx+YfxHLkVx5/NpeSbVwfoTeBykpJK7JhYWlL/O8hgAK/reforUnZDlxasOrVPPJVI/guE3dCwkw== + integrity sha1-9HyVsrYT3x0+zC/bdXNiPHUkhpE= dependencies: babel-runtime "^6.22.0" babel-plugin-transform-es2015-function-name@^6.22.0: version "6.24.1" resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-function-name/-/babel-plugin-transform-es2015-function-name-6.24.1.tgz#834c89853bc36b1af0f3a4c5dbaa94fd8eacaa8b" - integrity sha512-iFp5KIcorf11iBqu/y/a7DK3MN5di3pNCzto61FqCNnUX4qeBwcV1SLqe10oXNnCaxBUImX3SckX2/o1nsrTcg== + integrity sha1-g0yJhTvDaxrw86TF26qU/Y6sqos= dependencies: babel-helper-function-name "^6.24.1" babel-runtime "^6.22.0" @@ -2203,14 +2468,14 @@ babel-plugin-transform-es2015-function-name@^6.22.0: babel-plugin-transform-es2015-literals@^6.22.0: version "6.22.0" resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-literals/-/babel-plugin-transform-es2015-literals-6.22.0.tgz#4f54a02d6cd66cf915280019a31d31925377ca2e" - integrity sha512-tjFl0cwMPpDYyoqYA9li1/7mGFit39XiNX5DKC/uCNjBctMxyL1/PT/l4rSlbvBG1pOKI88STRdUsWXB3/Q9hQ== + integrity sha1-T1SgLWzWbPkVKAAZox0xklN3yi4= dependencies: babel-runtime "^6.22.0" babel-plugin-transform-es2015-modules-amd@^6.22.0, babel-plugin-transform-es2015-modules-amd@^6.24.1: version "6.24.1" resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-amd/-/babel-plugin-transform-es2015-modules-amd-6.24.1.tgz#3b3e54017239842d6d19c3011c4bd2f00a00d154" - integrity sha512-LnIIdGWIKdw7zwckqx+eGjcS8/cl8D74A3BpJbGjKTFFNJSMrjN4bIh22HY1AlkUbeLG6X6OZj56BDvWD+OeFA== + integrity sha1-Oz5UAXI5hC1tGcMBHEvS8AoA0VQ= dependencies: babel-plugin-transform-es2015-modules-commonjs "^6.24.1" babel-runtime "^6.22.0" @@ -2229,7 +2494,7 @@ babel-plugin-transform-es2015-modules-commonjs@^6.23.0, babel-plugin-transform-e babel-plugin-transform-es2015-modules-systemjs@^6.23.0: version "6.24.1" resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-systemjs/-/babel-plugin-transform-es2015-modules-systemjs-6.24.1.tgz#ff89a142b9119a906195f5f106ecf305d9407d23" - integrity sha512-ONFIPsq8y4bls5PPsAWYXH/21Hqv64TBxdje0FvU3MhIV6QM2j5YS7KvAzg/nTIVLot2D2fmFQrFWCbgHlFEjg== + integrity sha1-/4mhQrkRmpBhlfXxBuzzBdlAfSM= dependencies: babel-helper-hoist-variables "^6.24.1" babel-runtime "^6.22.0" @@ -2238,7 +2503,7 @@ babel-plugin-transform-es2015-modules-systemjs@^6.23.0: babel-plugin-transform-es2015-modules-umd@^6.23.0: version "6.24.1" resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-umd/-/babel-plugin-transform-es2015-modules-umd-6.24.1.tgz#ac997e6285cd18ed6176adb607d602344ad38468" - integrity sha512-LpVbiT9CLsuAIp3IG0tfbVo81QIhn6pE8xBJ7XSeCtFlMltuar5VuBV6y6Q45tpui9QWcy5i0vLQfCfrnF7Kiw== + integrity sha1-rJl+YoXNGO1hdq22B9YCNErThGg= dependencies: babel-plugin-transform-es2015-modules-amd "^6.24.1" babel-runtime "^6.22.0" @@ -2247,7 +2512,7 @@ babel-plugin-transform-es2015-modules-umd@^6.23.0: babel-plugin-transform-es2015-object-super@^6.22.0: version "6.24.1" resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-object-super/-/babel-plugin-transform-es2015-object-super-6.24.1.tgz#24cef69ae21cb83a7f8603dad021f572eb278f8d" - integrity sha512-8G5hpZMecb53vpD3mjs64NhI1au24TAmokQ4B+TBFBjN9cVoGoOvotdrMMRmHvVZUEvqGUPWL514woru1ChZMA== + integrity sha1-JM72muIcuDp/hgPa0CH1cusnj40= dependencies: babel-helper-replace-supers "^6.24.1" babel-runtime "^6.22.0" @@ -2255,7 +2520,7 @@ babel-plugin-transform-es2015-object-super@^6.22.0: babel-plugin-transform-es2015-parameters@^6.23.0: version "6.24.1" resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-parameters/-/babel-plugin-transform-es2015-parameters-6.24.1.tgz#57ac351ab49caf14a97cd13b09f66fdf0a625f2b" - integrity sha512-8HxlW+BB5HqniD+nLkQ4xSAVq3bR/pcYW9IigY+2y0dI+Y7INFeTbfAQr+63T3E4UDsZGjyb+l9txUnABWxlOQ== + integrity sha1-V6w1GrScrxSpfNE7CfZv3wpiXys= dependencies: babel-helper-call-delegate "^6.24.1" babel-helper-get-function-arity "^6.24.1" @@ -2267,7 +2532,7 @@ babel-plugin-transform-es2015-parameters@^6.23.0: babel-plugin-transform-es2015-shorthand-properties@^6.22.0: version "6.24.1" resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-shorthand-properties/-/babel-plugin-transform-es2015-shorthand-properties-6.24.1.tgz#24f875d6721c87661bbd99a4622e51f14de38aa0" - integrity sha512-mDdocSfUVm1/7Jw/FIRNw9vPrBQNePy6wZJlR8HAUBLybNp1w/6lr6zZ2pjMShee65t/ybR5pT8ulkLzD1xwiw== + integrity sha1-JPh11nIch2YbvZmkYi5R8U3jiqA= dependencies: babel-runtime "^6.22.0" babel-types "^6.24.1" @@ -2275,14 +2540,14 @@ babel-plugin-transform-es2015-shorthand-properties@^6.22.0: babel-plugin-transform-es2015-spread@^6.22.0: version "6.22.0" resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-spread/-/babel-plugin-transform-es2015-spread-6.22.0.tgz#d6d68a99f89aedc4536c81a542e8dd9f1746f8d1" - integrity sha512-3Ghhi26r4l3d0Js933E5+IhHwk0A1yiutj9gwvzmFbVV0sPMYk2lekhOufHBswX7NCoSeF4Xrl3sCIuSIa+zOg== + integrity sha1-1taKmfia7cRTbIGlQujdnxdG+NE= dependencies: babel-runtime "^6.22.0" babel-plugin-transform-es2015-sticky-regex@^6.22.0: version "6.24.1" resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-sticky-regex/-/babel-plugin-transform-es2015-sticky-regex-6.24.1.tgz#00c1cdb1aca71112cdf0cf6126c2ed6b457ccdbc" - integrity sha512-CYP359ADryTo3pCsH0oxRo/0yn6UsEZLqYohHmvLQdfS9xkf+MbCzE3/Kolw9OYIY4ZMilH25z/5CbQbwDD+lQ== + integrity sha1-AMHNsaynERLN8M9hJsLta0V8zbw= dependencies: babel-helper-regex "^6.24.1" babel-runtime "^6.22.0" @@ -2291,21 +2556,21 @@ babel-plugin-transform-es2015-sticky-regex@^6.22.0: babel-plugin-transform-es2015-template-literals@^6.22.0: version "6.22.0" resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-template-literals/-/babel-plugin-transform-es2015-template-literals-6.22.0.tgz#a84b3450f7e9f8f1f6839d6d687da84bb1236d8d" - integrity sha512-x8b9W0ngnKzDMHimVtTfn5ryimars1ByTqsfBDwAqLibmuuQY6pgBQi5z1ErIsUOWBdw1bW9FSz5RZUojM4apg== + integrity sha1-qEs0UPfp+PH2g51taH2oS7EjbY0= dependencies: babel-runtime "^6.22.0" babel-plugin-transform-es2015-typeof-symbol@^6.23.0: version "6.23.0" resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-typeof-symbol/-/babel-plugin-transform-es2015-typeof-symbol-6.23.0.tgz#dec09f1cddff94b52ac73d505c84df59dcceb372" - integrity sha512-fz6J2Sf4gYN6gWgRZaoFXmq93X+Li/8vf+fb0sGDVtdeWvxC9y5/bTD7bvfWMEq6zetGEHpWjtzRGSugt5kNqw== + integrity sha1-3sCfHN3/lLUqxz1QXITfWdzOs3I= dependencies: babel-runtime "^6.22.0" babel-plugin-transform-es2015-unicode-regex@^6.22.0: version "6.24.1" resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-unicode-regex/-/babel-plugin-transform-es2015-unicode-regex-6.24.1.tgz#d38b12f42ea7323f729387f18a7c5ae1faeb35e9" - integrity sha512-v61Dbbihf5XxnYjtBN04B/JBvsScY37R1cZT5r9permN1cp+b70DY3Ib3fIkgn1DI9U3tGgBJZVD8p/mE/4JbQ== + integrity sha1-04sS9C6nMj9yk4fxinxa4frrNek= dependencies: babel-helper-regex "^6.24.1" babel-runtime "^6.22.0" @@ -2314,7 +2579,7 @@ babel-plugin-transform-es2015-unicode-regex@^6.22.0: babel-plugin-transform-exponentiation-operator@^6.22.0: version "6.24.1" resolved "https://registry.yarnpkg.com/babel-plugin-transform-exponentiation-operator/-/babel-plugin-transform-exponentiation-operator-6.24.1.tgz#2ab0c9c7f3098fa48907772bb813fe41e8de3a0e" - integrity sha512-LzXDmbMkklvNhprr20//RStKVcT8Cu+SQtX18eMHLhjHf2yFzwtQ0S2f0jQ+89rokoNdmwoSqYzAhq86FxlLSQ== + integrity sha1-KrDJx/MJj6SJB3cruBP+QejeOg4= dependencies: babel-helper-builder-binary-assignment-operator-visitor "^6.24.1" babel-plugin-syntax-exponentiation-operator "^6.8.0" @@ -2323,14 +2588,14 @@ babel-plugin-transform-exponentiation-operator@^6.22.0: babel-plugin-transform-regenerator@^6.22.0: version "6.26.0" resolved "https://registry.yarnpkg.com/babel-plugin-transform-regenerator/-/babel-plugin-transform-regenerator-6.26.0.tgz#e0703696fbde27f0a3efcacf8b4dca2f7b3a8f2f" - integrity sha512-LS+dBkUGlNR15/5WHKe/8Neawx663qttS6AGqoOUhICc9d1KciBvtrQSuc0PI+CxQ2Q/S1aKuJ+u64GtLdcEZg== + integrity sha1-4HA2lvveJ/Cj78rPi03KL3s6jy8= dependencies: regenerator-transform "^0.10.0" babel-plugin-transform-strict-mode@^6.24.1: version "6.24.1" resolved "https://registry.yarnpkg.com/babel-plugin-transform-strict-mode/-/babel-plugin-transform-strict-mode-6.24.1.tgz#d5faf7aa578a65bbe591cf5edae04a0c67020758" - integrity sha512-j3KtSpjyLSJxNoCDrhwiJad8kw0gJ9REGj8/CqL0HeRyLnvUNYV9zcqluL6QJSXh3nfsLEmSLvwRfGzrgR96Pw== + integrity sha1-1fr3qleKZbvlkc9e2uBKDGcCB1g= dependencies: babel-runtime "^6.22.0" babel-types "^6.24.1" @@ -2374,7 +2639,7 @@ babel-preset-env@^1.7.0: babel-register@^6.26.0: version "6.26.0" resolved "https://registry.yarnpkg.com/babel-register/-/babel-register-6.26.0.tgz#6ed021173e2fcb486d7acb45c6009a856f647071" - integrity sha512-veliHlHX06wjaeY8xNITbveXSiI+ASFnOqvne/LaIJIqOWi2Ogmj91KOugEz/hoh/fwMhXNBJPCv8Xaz5CyM4A== + integrity sha1-btAhFz4vy0htestFxgCahW9kcHE= dependencies: babel-core "^6.26.0" babel-runtime "^6.26.0" @@ -2387,7 +2652,7 @@ babel-register@^6.26.0: babel-runtime@^6.18.0, babel-runtime@^6.22.0, babel-runtime@^6.26.0: version "6.26.0" resolved "https://registry.yarnpkg.com/babel-runtime/-/babel-runtime-6.26.0.tgz#965c7058668e82b55d7bfe04ff2337bc8b5647fe" - integrity sha512-ITKNuq2wKlW1fJg9sSW52eepoYgZBggvOAHC0u/CYu/qxQ9EVzThCgR69BnSXLHjy2f7SY5zaQ4yt7H9ZVxY2g== + integrity sha1-llxwWGaOgrVde/4E/yM3vItWR/4= dependencies: core-js "^2.4.0" regenerator-runtime "^0.11.0" @@ -2395,7 +2660,7 @@ babel-runtime@^6.18.0, babel-runtime@^6.22.0, babel-runtime@^6.26.0: babel-template@^6.24.1, babel-template@^6.26.0: version "6.26.0" resolved "https://registry.yarnpkg.com/babel-template/-/babel-template-6.26.0.tgz#de03e2d16396b069f46dd9fff8521fb1a0e35e02" - integrity sha512-PCOcLFW7/eazGUKIoqH97sO9A2UYMahsn/yRQ7uOk37iutwjq7ODtcTNF+iFDSHNfkctqsLRjLP7URnOx0T1fg== + integrity sha1-3gPi0WOWsGn0bdn/+FIfsaDjXgI= dependencies: babel-runtime "^6.26.0" babel-traverse "^6.26.0" @@ -2406,7 +2671,7 @@ babel-template@^6.24.1, babel-template@^6.26.0: babel-traverse@^6.24.1, babel-traverse@^6.26.0: version "6.26.0" resolved "https://registry.yarnpkg.com/babel-traverse/-/babel-traverse-6.26.0.tgz#46a9cbd7edcc62c8e5c064e2d2d8d0f4035766ee" - integrity sha512-iSxeXx7apsjCHe9c7n8VtRXGzI2Bk1rBSOJgCCjfyXb6v1aCqE1KSEpq/8SXuVN8Ka/Rh1WDTF0MDzkvTA4MIA== + integrity sha1-RqnL1+3MYsjlwGTi0tjQ9ANXZu4= dependencies: babel-code-frame "^6.26.0" babel-messages "^6.23.0" @@ -2421,7 +2686,7 @@ babel-traverse@^6.24.1, babel-traverse@^6.26.0: babel-types@^6.19.0, babel-types@^6.24.1, babel-types@^6.26.0: version "6.26.0" resolved "https://registry.yarnpkg.com/babel-types/-/babel-types-6.26.0.tgz#a3b073f94ab49eb6fa55cd65227a334380632497" - integrity sha512-zhe3V/26rCWsEZK8kZN+HaQj5yQ1CilTObixFzKW1UWjqG7618Twz6YEsCnjfg5gBcJh02DrpCkS9h98ZqDY+g== + integrity sha1-o7Bz+Uq0nrb6Vc1lInozQ4BjJJc= dependencies: babel-runtime "^6.26.0" esutils "^2.0.2" @@ -2431,7 +2696,7 @@ babel-types@^6.19.0, babel-types@^6.24.1, babel-types@^6.26.0: babelify@^7.3.0: version "7.3.0" resolved "https://registry.yarnpkg.com/babelify/-/babelify-7.3.0.tgz#aa56aede7067fd7bd549666ee16dc285087e88e5" - integrity sha512-vID8Fz6pPN5pJMdlUnNFSfrlcx5MUule4k9aKs/zbZPyXxMTcRrB0M4Tarw22L8afr8eYSWxDPYCob3TdrqtlA== + integrity sha1-qlau3nBn/XvVSWZu4W3ChQh+iOU= dependencies: babel-core "^6.0.14" object-assign "^4.0.0" @@ -2444,7 +2709,7 @@ babylon@^6.18.0: backoff@^2.5.0: version "2.5.0" resolved "https://registry.yarnpkg.com/backoff/-/backoff-2.5.0.tgz#f616eda9d3e4b66b8ca7fca79f695722c5f8e26f" - integrity sha512-wC5ihrnUXmR2douXmXLCe5O3zg3GKIyvRi/hi58a/XyRxVI+3/yM0PYueQOZXPXQ9pxBislYkw+sF9b7C/RuMA== + integrity sha1-9hbtqdPktmuMp/ynn2lXIsX44m8= dependencies: precond "0.2" @@ -2481,7 +2746,7 @@ base@^0.11.1: bcrypt-pbkdf@^1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz#a4301d389b6a43f9b67ff3ca11a3f6637e360e9e" - integrity sha512-qeFIXtP4MSoi6NLqO12WfqARWWuCKi2Rn/9hJLEmtB5yTNr9DqFWkJRCf2qShWzPeAMRnOgCrq0sg/KLv5ES9w== + integrity sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4= dependencies: tweetnacl "^0.14.3" @@ -2490,15 +2755,15 @@ bech32@1.1.4: resolved "https://registry.yarnpkg.com/bech32/-/bech32-1.1.4.tgz#e38c9f37bf179b8eb16ae3a772b40c356d4832e9" integrity sha512-s0IrSOzLlbvX7yp4WBfPITzpAU8sqQcpsmwXDiKwrG4r491vwCO/XpejasRNl0piBMe/DvP4Tz0mIS/X1DPJBQ== -bigint-crypto-utils@^3.0.23: - version "3.3.0" - resolved "https://registry.yarnpkg.com/bigint-crypto-utils/-/bigint-crypto-utils-3.3.0.tgz#72ad00ae91062cf07f2b1def9594006c279c1d77" - integrity sha512-jOTSb+drvEDxEq6OuUybOAv/xxoh3cuYRUIPyu8sSHQNKM303UQ2R1DAo45o1AkcIXw6fzbaFI1+xGGdaXs2lg== - bignumber.js@^9.0.0: - version "9.1.2" - resolved "https://registry.yarnpkg.com/bignumber.js/-/bignumber.js-9.1.2.tgz#b7c4242259c008903b13707983b5f4bbd31eda0c" - integrity sha512-2/mKyZH9K85bzOEfhXDBFZTGd1CTs+5IHpeFQo9luiBG7hghdC851Pj2WAhb6E3R6b9tZj/XKhbg4fum+Kepug== + version "9.0.2" + resolved "https://registry.yarnpkg.com/bignumber.js/-/bignumber.js-9.0.2.tgz#71c6c6bed38de64e24a65ebe16cfcf23ae693673" + integrity sha512-GAcQvbpsM0pUb0zw1EI0KhQEZ+lRwR5fYaAp3vPOYuP7aDvGy6cVN6XHLauvF8SOga2y0dcLcjt3iQDTSEliyw== + +bignumber.js@^9.0.1: + version "9.1.0" + resolved "https://registry.yarnpkg.com/bignumber.js/-/bignumber.js-9.1.0.tgz#8d340146107fe3a6cb8d40699643c302e8773b62" + integrity sha512-4LwHK4nfDOraBCtst+wOWIHbu1vhvAPJK8g8nROd4iuc3PSEjWif/qwbkh8jwCJz6yDBvtU4KPynETgrfh7y3A== binary-extensions@^2.0.0: version "2.2.0" @@ -2538,51 +2803,54 @@ bluebird@^3.5.0, bluebird@^3.5.2: bn.js@4.11.6: version "4.11.6" resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-4.11.6.tgz#53344adb14617a13f6e8dd2ce28905d1c0ba3215" - integrity sha512-XWwnNNFCuuSQ0m3r3C4LE3EiORltHd9M05pq6FOlVeiophzRbMo50Sbz1ehl8K3Z+jw9+vmgnXefY1hz8X+2wA== + integrity sha1-UzRK2xRhehP26N0s4okF0cC6MhU= bn.js@^4.0.0, bn.js@^4.1.0, bn.js@^4.10.0, bn.js@^4.11.0, bn.js@^4.11.6, bn.js@^4.11.8, bn.js@^4.11.9, bn.js@^4.8.0: version "4.12.0" resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-4.12.0.tgz#775b3f278efbb9718eec7361f483fb36fbbfea88" integrity sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA== -bn.js@^5.0.0, bn.js@^5.1.1, bn.js@^5.1.2, bn.js@^5.1.3, bn.js@^5.2.0, bn.js@^5.2.1: +bn.js@^5.0.0, bn.js@^5.1.1, bn.js@^5.1.2, bn.js@^5.1.3, bn.js@^5.2.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-5.2.0.tgz#358860674396c6997771a9d051fcc1b57d4ae002" + integrity sha512-D7iWRBvnZE8ecXiLj/9wbxH7Tk79fAh8IHaTNq1RWRixsS02W+5qS+iE9yq6RYl0asXx5tw0bLhmT5pIfbSquw== + +bn.js@^5.2.1: version "5.2.1" resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-5.2.1.tgz#0bc527a6a0d18d0aa8d5b0538ce4a77dccfa7b70" integrity sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ== -body-parser@1.20.1: - version "1.20.1" - resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.20.1.tgz#b1812a8912c195cd371a3ee5e66faa2338a5c668" - integrity sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw== +body-parser@1.19.2: + version "1.19.2" + resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.19.2.tgz#4714ccd9c157d44797b8b5607d72c0b89952f26e" + integrity sha512-SAAwOxgoCKMGs9uUAUFHygfLAyaniaoun6I8mFY9pRAJL9+Kec34aU+oIjDhTycub1jozEfEwx1W1IuOYxVSFw== dependencies: bytes "3.1.2" content-type "~1.0.4" debug "2.6.9" - depd "2.0.0" - destroy "1.2.0" - http-errors "2.0.0" + depd "~1.1.2" + http-errors "1.8.1" iconv-lite "0.4.24" - on-finished "2.4.1" - qs "6.11.0" - raw-body "2.5.1" + on-finished "~2.3.0" + qs "6.9.7" + raw-body "2.4.3" type-is "~1.6.18" - unpipe "1.0.0" body-parser@^1.16.0: - version "1.20.2" - resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.20.2.tgz#6feb0e21c4724d06de7ff38da36dad4f57a747fd" - integrity sha512-ml9pReCu3M61kGlqoTm2umSXTlRTuGTx0bfYj+uIUKKYycG5NtSbeetV3faSU6R7ajOPw0g/J1PvK4qNy7s5bA== + version "1.20.0" + resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.20.0.tgz#3de69bd89011c11573d7bfee6a64f11b6bd27cc5" + integrity sha512-DfJ+q6EPcGKZD1QWUjSpqp+Q7bDQTsQIF4zfUAtZ6qk+H/3/QRhg9CEp39ss+/T2vw0+HaidC0ecJj/DRLIaKg== dependencies: bytes "3.1.2" - content-type "~1.0.5" + content-type "~1.0.4" debug "2.6.9" depd "2.0.0" destroy "1.2.0" http-errors "2.0.0" iconv-lite "0.4.24" on-finished "2.4.1" - qs "6.11.0" - raw-body "2.5.2" + qs "6.10.3" + raw-body "2.5.1" type-is "~1.6.18" unpipe "1.0.0" @@ -2622,7 +2890,7 @@ braces@^2.3.1: split-string "^3.0.2" to-regex "^3.0.1" -braces@^3.0.2, braces@~3.0.2: +braces@^3.0.1, braces@^3.0.2, braces@~3.0.2: version "3.0.2" resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.2.tgz#3454e1a462ee8d599e236df336cd9ea4f8afe107" integrity sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A== @@ -2632,17 +2900,7 @@ braces@^3.0.2, braces@~3.0.2: brorand@^1.0.1, brorand@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/brorand/-/brorand-1.1.0.tgz#12c25efe40a45e3c323eb8675a0a0ce57b22371f" - integrity sha512-cKV8tMCEpQs4hK/ik71d6LrPOnpkpGBR0wzxqr68g2m/LB2GxVYQroAjMJZRVM1Y4BCjCKc3vAamxSzOY2RP+w== - -browser-level@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/browser-level/-/browser-level-1.0.1.tgz#36e8c3183d0fe1c405239792faaab5f315871011" - integrity sha512-XECYKJ+Dbzw0lbydyQuJzwNXtOpbMSq737qxJN11sIRTErOMShvDpbzTlgju7orJKvx4epULolZAuJGLzCmWRQ== - dependencies: - abstract-level "^1.0.2" - catering "^2.1.1" - module-error "^1.0.2" - run-parallel-limit "^1.1.0" + integrity sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8= browser-stdout@1.3.1: version "1.3.1" @@ -2714,7 +2972,7 @@ browserslist@^3.2.6: bs58@^4.0.0: version "4.0.1" resolved "https://registry.yarnpkg.com/bs58/-/bs58-4.0.1.tgz#be161e76c354f6f788ae4071f63f34e8c4f0a42a" - integrity sha512-Ok3Wdf5vOIlBrgCvTq96gBkJw+JUEzdBgyaza5HLtPm7yTHkjRy8+JzNyHF7BHa0bNWOQIp3m5YF0nnFcOIKLw== + integrity sha1-vhYedsNU9veIrkBx9j806MTwpCo= dependencies: base-x "^3.0.2" @@ -2740,12 +2998,12 @@ buffer-from@^1.0.0: buffer-to-arraybuffer@^0.0.5: version "0.0.5" resolved "https://registry.yarnpkg.com/buffer-to-arraybuffer/-/buffer-to-arraybuffer-0.0.5.tgz#6064a40fa76eb43c723aba9ef8f6e1216d10511a" - integrity sha512-3dthu5CYiVB1DEJp61FtApNnNndTckcqe4pFcLdvHtrpG+kcyekCJKg4MRiDcFW7A6AODnXB9U4dwQiCW5kzJQ== + integrity sha1-YGSkD6dutDxyOrqe+PbhIW0QURo= buffer-xor@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/buffer-xor/-/buffer-xor-1.0.3.tgz#26e61ed1422fb70dd42e6e36729ed51d855fe8d9" - integrity sha512-571s0T7nZWK6vB67HI5dyUF7wXiNcfaPPPTl6zYCNApANjIvYJTg7hlud/+cJpdAhS7dVzqMLmfhfHR3rAcOjQ== + integrity sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk= buffer-xor@^2.0.1: version "2.0.2" @@ -2762,18 +3020,10 @@ buffer@^5.0.5, buffer@^5.2.1, buffer@^5.5.0, buffer@^5.6.0: base64-js "^1.3.1" ieee754 "^1.1.13" -buffer@^6.0.3: - version "6.0.3" - resolved "https://registry.yarnpkg.com/buffer/-/buffer-6.0.3.tgz#2ace578459cc8fbe2a70aaa8f52ee63b6a74c6c6" - integrity sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA== - dependencies: - base64-js "^1.3.1" - ieee754 "^1.2.1" - bufferutil@^4.0.1: - version "4.0.7" - resolved "https://registry.yarnpkg.com/bufferutil/-/bufferutil-4.0.7.tgz#60c0d19ba2c992dd8273d3f73772ffc894c153ad" - integrity sha512-kukuqc39WOHtdxtw4UScxF/WVnMFVSQVKhtx3AjZJzhd0RGZZldcrfSEbVsWWe6KNH253574cq5F+wpv0G9pJw== + version "4.0.6" + resolved "https://registry.yarnpkg.com/bufferutil/-/bufferutil-4.0.6.tgz#ebd6c67c7922a0e902f053e5d8be5ec850e48433" + integrity sha512-jduaYOYtnio4aIAyc6UbvPCVcgq7nYpVnucyxr6eCYg/Woad9Hf/oxxBRDnGGjPfjUm6j5O/uBWhIu4iLebFaw== dependencies: node-gyp-build "^4.3.0" @@ -2782,13 +3032,6 @@ builtin-modules@^1.1.1: resolved "https://registry.yarnpkg.com/builtin-modules/-/builtin-modules-1.1.1.tgz#270f076c5a72c02f5b65a47df94c5fe3a278892f" integrity sha512-wxXCdllwGhI2kCC0MnvTGYTMvnVZTvqgypkiTI8Pa5tcz2i6VqsqwYGgqwXji+4RgCzms6EajE4IxiUH6HH8nQ== -busboy@^1.6.0: - version "1.6.0" - resolved "https://registry.yarnpkg.com/busboy/-/busboy-1.6.0.tgz#966ea36a9502e43cdb9146962523b92f531f6893" - integrity sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA== - dependencies: - streamsearch "^1.1.0" - bytes@3.1.2: version "3.1.2" resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.1.2.tgz#8b0beeb98605adf1b128fa4386403c009e0221a5" @@ -2797,14 +3040,14 @@ bytes@3.1.2: bytewise-core@^1.2.2: version "1.2.3" resolved "https://registry.yarnpkg.com/bytewise-core/-/bytewise-core-1.2.3.tgz#3fb410c7e91558eb1ab22a82834577aa6bd61d42" - integrity sha512-nZD//kc78OOxeYtRlVk8/zXqTB4gf/nlguL1ggWA8FuchMyOxcyHR4QPQZMUmA7czC+YnaBrPUCubqAWe50DaA== + integrity sha1-P7QQx+kVWOsasiqCg0V3qmvWHUI= dependencies: typewise-core "^1.2" bytewise@~1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/bytewise/-/bytewise-1.1.0.tgz#1d13cbff717ae7158094aa881b35d081b387253e" - integrity sha512-rHuuseJ9iQ0na6UDhnrRVDh8YnWVlU6xM3VH6q/+yHDeUH2zIhUzP+2/h3LIrhLDBtTqzWpE3p3tP/boefskKQ== + integrity sha1-HRPL/3F65xWAlKqIGzXQgbOHJT4= dependencies: bytewise-core "^1.2.2" typewise "^1.0.3" @@ -2824,16 +3067,6 @@ cache-base@^1.0.1: union-value "^1.0.0" unset-value "^1.0.0" -cacheable-lookup@^5.0.3: - version "5.0.4" - resolved "https://registry.yarnpkg.com/cacheable-lookup/-/cacheable-lookup-5.0.4.tgz#5a6b865b2c44357be3d5ebc2a467b032719a7005" - integrity sha512-2/kNscPhpcxrOigMZzbiWF7dz8ilhb/nIHU3EyZiXWXpeq/au8qJ8VhdftMkty3n7Gj6HIGalQG8oiBNB3AJgA== - -cacheable-lookup@^6.0.4: - version "6.1.0" - resolved "https://registry.yarnpkg.com/cacheable-lookup/-/cacheable-lookup-6.1.0.tgz#0330a543471c61faa4e9035db583aad753b36385" - integrity sha512-KJ/Dmo1lDDhmW2XDPMo+9oiy/CeqosPguPCrgcVzKyZrL6pM1gU2GmPY/xo6OQPTUaA/c0kwHuywB4E6nmT9ww== - cacheable-request@^6.0.0: version "6.1.0" resolved "https://registry.yarnpkg.com/cacheable-request/-/cacheable-request-6.1.0.tgz#20ffb8bd162ba4be11e9567d823db651052ca912" @@ -2847,23 +3080,10 @@ cacheable-request@^6.0.0: normalize-url "^4.1.0" responselike "^1.0.2" -cacheable-request@^7.0.2: - version "7.0.4" - resolved "https://registry.yarnpkg.com/cacheable-request/-/cacheable-request-7.0.4.tgz#7a33ebf08613178b403635be7b899d3e69bbe817" - integrity sha512-v+p6ongsrp0yTGbJXjgxPow2+DL93DASP4kXCDKb8/bwRtt9OEF3whggkkDkGNzgcWy2XaF4a8nZglC7uElscg== - dependencies: - clone-response "^1.0.2" - get-stream "^5.1.0" - http-cache-semantics "^4.0.0" - keyv "^4.0.0" - lowercase-keys "^2.0.0" - normalize-url "^6.0.1" - responselike "^2.0.0" - cachedown@1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/cachedown/-/cachedown-1.0.0.tgz#d43f036e4510696b31246d7db31ebf0f7ac32d15" - integrity sha512-t+yVk82vQWCJF3PsWHMld+jhhjkkWjcAzz8NbFx1iULOXWl8Tm/FdM4smZNVw3MRr0X+lVTx9PKzvEn4Ng19RQ== + integrity sha1-1D8DbkUQaWsxJG19sx6/D3rDLRU= dependencies: abstract-leveldown "^2.4.1" lru-cache "^3.2.0" @@ -2876,6 +3096,25 @@ call-bind@^1.0.0, call-bind@^1.0.2, call-bind@~1.0.2: function-bind "^1.1.1" get-intrinsic "^1.0.2" +caller-callsite@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/caller-callsite/-/caller-callsite-2.0.0.tgz#847e0fce0a223750a9a027c54b33731ad3154134" + integrity sha1-hH4PzgoiN1CpoCfFSzNzGtMVQTQ= + dependencies: + callsites "^2.0.0" + +caller-path@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/caller-path/-/caller-path-2.0.0.tgz#468f83044e369ab2010fac5f06ceee15bb2cb1f4" + integrity sha1-Ro+DBE42mrIBD6xfBs7uFbsssfQ= + dependencies: + caller-callsite "^2.0.0" + +callsites@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/callsites/-/callsites-2.0.0.tgz#06eb84f00eea413da86affefacbffb36093b3c50" + integrity sha1-BuuE8A7qQT2oav/vrL/7Ngk7PFA= + callsites@^3.0.0: version "3.1.0" resolved "https://registry.yarnpkg.com/callsites/-/callsites-3.1.0.tgz#b3630abd8943432f54b3f0519238e33cd7df2f73" @@ -2884,7 +3123,7 @@ callsites@^3.0.0: camelcase@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-3.0.0.tgz#32fc4b9fcdaf845fcdf7e73bb97cac2261f0ab0a" - integrity sha512-4nhGqUkc4BqbBBB4Q6zLuD7lzzrHYrjKGeYaEji/3tFR5VdJu9v+LilhGIVe8wxEJPPOeWo7eg8dwY13TZ1BNg== + integrity sha1-MvxLn82vhF/N9+c7uXysImHwqwo= camelcase@^5.0.0: version "5.3.1" @@ -2897,40 +3136,31 @@ camelcase@^6.0.0: integrity sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA== caniuse-lite@^1.0.30000844: - version "1.0.30001533" - resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001533.tgz#1180daeb2518b93c82f19b904d1fefcf82197707" - integrity sha512-9aY/b05NKU4Yl2sbcJhn4A7MsGwR1EPfW/nrqsnqVA0Oq50wpmPaGI+R1Z0UKlUl96oxUkGEOILWtOHck0eCWw== - -case@^1.6.3: - version "1.6.3" - resolved "https://registry.yarnpkg.com/case/-/case-1.6.3.tgz#0a4386e3e9825351ca2e6216c60467ff5f1ea1c9" - integrity sha512-mzDSXIPaFwVDvZAHqZ9VlbyF4yyXRuX6IvB06WvPYkqJVO24kX1PPhv9bfpKNFZyxYFmmgo03HUiD8iklmJYRQ== + version "1.0.30001325" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001325.tgz#2b4ad19b77aa36f61f2eaf72e636d7481d55e606" + integrity sha512-sB1bZHjseSjDtijV1Hb7PB2Zd58Kyx+n/9EotvZ4Qcz2K3d0lWB8dB4nb8wN/TsOGFq3UuAm0zQZNQ4SoR7TrQ== caseless@^0.12.0, caseless@~0.12.0: version "0.12.0" resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.12.0.tgz#1b681c21ff84033c826543090689420d187151dc" - integrity sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw== - -catering@^2.1.0, catering@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/catering/-/catering-2.1.1.tgz#66acba06ed5ee28d5286133982a927de9a04b510" - integrity sha512-K7Qy8O9p76sL3/3m7/zLKbRkyOlSZAgzEaLhyj2mXS8PsCud2Eo4hAb8aLtZqHh0QGqLcb9dlJSu6lHRVENm1w== + integrity sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw= -cbor@^8.1.0: - version "8.1.0" - resolved "https://registry.yarnpkg.com/cbor/-/cbor-8.1.0.tgz#cfc56437e770b73417a2ecbfc9caf6b771af60d5" - integrity sha512-DwGjNW9omn6EwP70aXsn7FQJx5kO12tX0bZkaTjzdVFM6/7nhA4t0EENocKGx6D2Bch9PE2KzCUf5SceBdeijg== +cbor@^5.0.2: + version "5.2.0" + resolved "https://registry.yarnpkg.com/cbor/-/cbor-5.2.0.tgz#4cca67783ccd6de7b50ab4ed62636712f287a67c" + integrity sha512-5IMhi9e1QU76ppa5/ajP1BmMWZ2FHkhAhjeVKQ/EFCgYSEaeVaoGtL7cxJskf9oCCk+XjzaIdc3IuU/dbA/o2A== dependencies: - nofilter "^3.1.0" + bignumber.js "^9.0.1" + nofilter "^1.0.4" chai@^4.3.4: - version "4.3.8" - resolved "https://registry.yarnpkg.com/chai/-/chai-4.3.8.tgz#40c59718ad6928da6629c70496fe990b2bb5b17c" - integrity sha512-vX4YvVVtxlfSZ2VecZgFUTU5qPCYsobVI2O9FmwEXBhDigYGQA6jRXCycIs1yJnnWbZ6/+a2zNIF5DfVCcJBFQ== + version "4.3.6" + resolved "https://registry.yarnpkg.com/chai/-/chai-4.3.6.tgz#ffe4ba2d9fa9d6680cc0b370adae709ec9011e9c" + integrity sha512-bbcp3YfHCUzMOvKqsztczerVgBKSsEijCySNlHHbX3VG1nskvqjz5Rfso1gGwD6w6oOV3eI60pKuMOV5MV7p3Q== dependencies: assertion-error "^1.1.0" check-error "^1.0.2" - deep-eql "^4.1.2" + deep-eql "^3.0.1" get-func-name "^2.0.0" loupe "^2.3.1" pathval "^1.1.1" @@ -2939,7 +3169,7 @@ chai@^4.3.4: chalk@^1.1.3: version "1.1.3" resolved "https://registry.yarnpkg.com/chalk/-/chalk-1.1.3.tgz#a8115c55e4a702fe4d150abd3872822a7e09fc98" - integrity sha512-U3lRVLMSlsCfjqYPbLyVv11M9CPW4I728d6TCKMAOJueEeB9/8o+eSsMnxPJD+Q+K909sdESg7C+tIkoH6on1A== + integrity sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg= dependencies: ansi-styles "^2.2.1" escape-string-regexp "^1.0.2" @@ -2947,7 +3177,7 @@ chalk@^1.1.3: strip-ansi "^3.0.0" supports-color "^2.0.0" -chalk@^2.3.0, chalk@^2.4.1, chalk@^2.4.2: +chalk@^2.0.0, chalk@^2.1.0, chalk@^2.3.0, chalk@^2.4.1, chalk@^2.4.2: version "2.4.2" resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== @@ -2964,20 +3194,25 @@ chalk@^4.0.0, chalk@^4.1.0, chalk@^4.1.2: ansi-styles "^4.1.0" supports-color "^7.1.0" +chardet@^0.7.0: + version "0.7.0" + resolved "https://registry.yarnpkg.com/chardet/-/chardet-0.7.0.tgz#90094849f0937f2eedc2425d0d28a9e5f0cbad9e" + integrity sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA== + "charenc@>= 0.0.1": version "0.0.2" resolved "https://registry.yarnpkg.com/charenc/-/charenc-0.0.2.tgz#c0a1d2f3a7092e03774bfa83f14c0fc5790a8667" - integrity sha512-yrLQ/yVUFXkzg7EDQsPieE/53+0RlaWTs+wBrvW36cyilJ2SaDWfl4Yj7MtLTXleV9uEKefbAGUPv2/iWSooRA== + integrity sha1-wKHS86cJLgN3S/qD8UwPxXkKhmc= check-error@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/check-error/-/check-error-1.0.2.tgz#574d312edd88bb5dd8912e9286dd6c0aed4aac82" - integrity sha512-BrgHpW9NURQgzoNyjfq0Wu6VFO6D7IZEmJNdtgNqpzGG8RuNFHt2jQxWlAs4HMe119chBnv+34syEZtc6IhLtA== + integrity sha1-V00xLt2Iu13YkS6Sht1sCu1KrII= checkpoint-store@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/checkpoint-store/-/checkpoint-store-1.1.0.tgz#04e4cb516b91433893581e6d4601a78e9552ea06" - integrity sha512-J/NdY2WvIx654cc6LWSq/IYFFCUf75fFTgwzFnmbqyORH4MwgiQCgswLLKBGzmsyTI5V7i5bp/So6sMbDWhedg== + integrity sha1-BOTLUWuRQziTWB5tRgGnjpVS6gY= dependencies: functional-red-black-tree "^1.0.1" @@ -3080,22 +3315,18 @@ class-utils@^0.3.5: isobject "^3.0.0" static-extend "^0.1.1" -classic-level@^1.2.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/classic-level/-/classic-level-1.3.0.tgz#5e36680e01dc6b271775c093f2150844c5edd5c8" - integrity sha512-iwFAJQYtqRTRM0F6L8h4JCt00ZSGdOyqh7yVrhhjrOpFhmBjNlRUey64MCiyo6UmQHMJ+No3c81nujPv+n9yrg== - dependencies: - abstract-level "^1.0.2" - catering "^2.1.0" - module-error "^1.0.1" - napi-macros "^2.2.2" - node-gyp-build "^4.3.0" - clean-stack@^2.0.0: version "2.2.0" resolved "https://registry.yarnpkg.com/clean-stack/-/clean-stack-2.2.0.tgz#ee8472dbb129e727b31e8a10a427dee9dfe4008b" integrity sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A== +cli-cursor@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-2.1.0.tgz#b35dac376479facc3e94747d41d0d0f5238ffcb5" + integrity sha1-s12sN2R5+sw+lHR9QdDQ9SOP/LU= + dependencies: + restore-cursor "^2.0.0" + cli-table3@^0.5.0: version "0.5.1" resolved "https://registry.yarnpkg.com/cli-table3/-/cli-table3-0.5.1.tgz#0252372d94dfc40dbd8df06005f48f31f656f202" @@ -3106,10 +3337,15 @@ cli-table3@^0.5.0: optionalDependencies: colors "^1.1.2" +cli-width@^2.0.0: + version "2.2.1" + resolved "https://registry.yarnpkg.com/cli-width/-/cli-width-2.2.1.tgz#b0433d0b4e9c847ef18868a4ef16fd5fc8271c48" + integrity sha512-GRMWDxpOB6Dgk2E5Uo+3eEBvtOOlimMmpbFiKuLFnQzYDavtLFY3K5ona41jgN/WdRZtG7utuVSVTL4HbZHGkw== + cliui@^3.2.0: version "3.2.0" resolved "https://registry.yarnpkg.com/cliui/-/cliui-3.2.0.tgz#120601537a916d29940f934da3b48d585a39213d" - integrity sha512-0yayqDxWQbqk3ojkYqUKqaAQ6AfNKeKWRNA8kR0WXzAsdHpP4BIaOmMAG87JGuO6qcobyW4GjxHd9PmhEd+T9w== + integrity sha1-EgYBU3qRbSmUD5NNo7SNWFo5IT0= dependencies: string-width "^1.0.1" strip-ansi "^3.0.1" @@ -3134,26 +3370,26 @@ cliui@^7.0.2: wrap-ansi "^7.0.0" clone-response@^1.0.2: - version "1.0.3" - resolved "https://registry.yarnpkg.com/clone-response/-/clone-response-1.0.3.tgz#af2032aa47816399cf5f0a1d0db902f517abb8c3" - integrity sha512-ROoL94jJH2dUVML2Y/5PEDNaSHgeOdSDicUyS7izcF63G6sTc/FTjLub4b8Il9S8S0beOfYt0TaA5qvFK+w0wA== + version "1.0.2" + resolved "https://registry.yarnpkg.com/clone-response/-/clone-response-1.0.2.tgz#d1dc973920314df67fbeb94223b4ee350239e96b" + integrity sha1-0dyXOSAxTfZ/vrlCI7TuNQI56Ws= dependencies: mimic-response "^1.0.0" clone@2.1.2, clone@^2.0.0: version "2.1.2" resolved "https://registry.yarnpkg.com/clone/-/clone-2.1.2.tgz#1b7f4b9f591f1e8f83670401600345a02887435f" - integrity sha512-3Pe/CF1Nn94hyhIYpjtiLhdCoEoz0DqQ+988E9gmeEdQZlojxnOb74wctFyuwWQHzqyf9X7C7MG8juUpqBJT8w== + integrity sha1-G39Ln1kfHo+DZwQBYANFoCiHQ18= code-point-at@^1.0.0: version "1.1.0" resolved "https://registry.yarnpkg.com/code-point-at/-/code-point-at-1.1.0.tgz#0d070b4d043a5bea33a2f1a40e2edb3d9a4ccf77" - integrity sha512-RpAVKQA5T63xEj6/giIbUEtZwJ4UFIc3ZtvEkiaUERylqe8xb5IvqcgOurZLahv93CLKfxcw5YI+DZcUBRyLXA== + integrity sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c= collection-visit@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/collection-visit/-/collection-visit-1.0.0.tgz#4bc0373c164bc3291b4d368c829cf1a80a59dca0" - integrity sha512-lNkKvzEeMBBjUGHZ+q6z9pSJla0KWAQPvtzhEV9+iGyQYG+pBpl7xKDhxoNSOZH2hhv0v5k0y2yAM4o4SjoSkw== + integrity sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA= dependencies: map-visit "^1.0.0" object-visit "^1.0.0" @@ -3175,7 +3411,7 @@ color-convert@^2.0.1: color-name@1.1.3: version "1.1.3" resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" - integrity sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw== + integrity sha1-p9BVi9icQveV3UIyj3QIMcpTvCU= color-name@~1.1.4: version "1.1.4" @@ -3219,34 +3455,34 @@ command-line-args@^5.1.1: typical "^4.0.0" command-line-usage@^6.1.0: - version "6.1.3" - resolved "https://registry.yarnpkg.com/command-line-usage/-/command-line-usage-6.1.3.tgz#428fa5acde6a838779dfa30e44686f4b6761d957" - integrity sha512-sH5ZSPr+7UStsloltmDh7Ce5fb8XPlHyoPzTpyyMuYCtervL65+ubVZ6Q61cFtFl62UyJlc8/JwERRbAFPUqgw== + version "6.1.2" + resolved "https://registry.yarnpkg.com/command-line-usage/-/command-line-usage-6.1.2.tgz#2b7ccd48a93fb19bd71ca8fe9900feab00e557b0" + integrity sha512-I+0XN613reAhpBQ6icsPOTwu9cvhc9NtLtUcY2fGYuwm9JZiWBzFDA8w0PHqQjru7Xth7fM/y9TJ13+VKdjh7Q== dependencies: - array-back "^4.0.2" + array-back "^4.0.1" chalk "^2.4.2" - table-layout "^1.0.2" + table-layout "^1.0.1" typical "^5.2.0" +commander@2.18.0: + version "2.18.0" + resolved "https://registry.yarnpkg.com/commander/-/commander-2.18.0.tgz#2bf063ddee7c7891176981a2cc798e5754bc6970" + integrity sha512-6CYPa+JP2ftfRU2qkDK+UTVeQYosOg/2GbcjIcKPHfinyOLPVGXu/ovN86RP49Re5ndJK1N0kuiidFFuepc4ZQ== + commander@3.0.2: version "3.0.2" resolved "https://registry.yarnpkg.com/commander/-/commander-3.0.2.tgz#6837c3fb677ad9933d1cfba42dd14d5117d6b39e" integrity sha512-Gar0ASD4BDyKC4hl4DwHqDrmvjoxWKZigVnAbn5H1owvm4CxCPdb0HQDehwNYMJpla5+M2tPmPARzhtYuwpHow== -commander@^10.0.0: - version "10.0.1" - resolved "https://registry.yarnpkg.com/commander/-/commander-10.0.1.tgz#881ee46b4f77d1c1dccc5823433aa39b022cbe06" - integrity sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug== - commander@^2.12.1: version "2.20.3" resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.3.tgz#fd485e84c03eb4881c20722ba48035e8531aeb33" integrity sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ== commander@^9.2.0, commander@^9.4.0: - version "9.5.0" - resolved "https://registry.yarnpkg.com/commander/-/commander-9.5.0.tgz#bc08d1eb5cedf7ccb797a96199d41c7bc3e60d30" - integrity sha512-KRs7WVDKg86PWiuAqhDrAQnTXZKraVcCc6vFdL14qrZ/DcWwuRo7VoiYXalXO7S5GKpqYiVEwCbgFDfxNHKJBQ== + version "9.4.0" + resolved "https://registry.yarnpkg.com/commander/-/commander-9.4.0.tgz#bc4a40918fefe52e22450c111ecd6b7acce6f11c" + integrity sha512-sRPT+umqkz90UA8M1yqYfnHlZA7fF6nSphDtxeywPZ49ysjxDQybzk13CL+mXekDRG92skbcqCLVovuCusNmFw== component-emitter@^1.2.1: version "1.3.0" @@ -3256,7 +3492,7 @@ component-emitter@^1.2.1: concat-map@0.0.1: version "0.0.1" resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" - integrity sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg== + integrity sha1-2Klr13/Wjfd5OnMDajug1UBdR3s= concat-stream@^1.5.1, concat-stream@^1.6.0, concat-stream@^1.6.2: version "1.6.2" @@ -3284,15 +3520,17 @@ content-hash@^2.5.2: multicodec "^0.5.5" multihashes "^0.4.15" -content-type@~1.0.4, content-type@~1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/content-type/-/content-type-1.0.5.tgz#8b773162656d1d1086784c8f23a54ce6d73d7918" - integrity sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA== +content-type@~1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/content-type/-/content-type-1.0.4.tgz#e138cc75e040c727b1966fe5e5f8c9aee256fe3b" + integrity sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA== convert-source-map@^1.5.1: - version "1.9.0" - resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.9.0.tgz#7faae62353fb4213366d0ca98358d22e8368b05f" - integrity sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A== + version "1.8.0" + resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.8.0.tgz#f3373c32d21b4d780dd8004514684fb791ca4369" + integrity sha512-+OQdjP49zViI/6i7nIJpA8rAl4sV/JdPfU9nZs3VqOwGIgizICvuN2ru6fMd+4llL0tar18UYJXfZ/TWtmhUjA== + dependencies: + safe-buffer "~5.1.1" convert-svg-core@^0.6.4: version "0.6.4" @@ -3321,14 +3559,9 @@ convert-svg-to-png@^0.6.4: cookie-signature@1.0.6: version "1.0.6" resolved "https://registry.yarnpkg.com/cookie-signature/-/cookie-signature-1.0.6.tgz#e303a882b342cc3ee8ca513a79999734dab3ae2c" - integrity sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ== - -cookie@0.5.0: - version "0.5.0" - resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.5.0.tgz#d1f5d71adec6558c58f389987c366aa47e994f8b" - integrity sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw== + integrity sha1-4wOogrNCzD7oylE6eZmXNNqzriw= -cookie@^0.4.1: +cookie@0.4.2, cookie@^0.4.1: version "0.4.2" resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.4.2.tgz#0e41f24de5ecf317947c82fc789e06a884824432" integrity sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA== @@ -3341,12 +3574,12 @@ cookiejar@^2.1.1: copy-descriptor@^0.1.0: version "0.1.1" resolved "https://registry.yarnpkg.com/copy-descriptor/-/copy-descriptor-0.1.1.tgz#676f6eb3c39997c2ee1ac3a924fd6124748f578d" - integrity sha512-XgZ0pFcakEUlbwQEVNg3+QAis1FyTL3Qel9FYy8pSkQqoG3PNoT0bOCQtOXcOkur21r2Eq2kI+IE+gsmAEVlYw== + integrity sha1-Z29us8OZl8LuGsOpJP1hJHSPV40= core-js-pure@^3.0.1: - version "3.32.2" - resolved "https://registry.yarnpkg.com/core-js-pure/-/core-js-pure-3.32.2.tgz#b7dbdac528625cf87eb0523b532eb61551b9a6d1" - integrity sha512-Y2rxThOuNywTjnX/PgA5vWM6CZ9QB9sz9oGeCixV8MqXZO70z/5SHzf9EeBrEBK0PN36DnEBBu9O/aGWzKuMZQ== + version "3.21.1" + resolved "https://registry.yarnpkg.com/core-js-pure/-/core-js-pure-3.21.1.tgz#8c4d1e78839f5f46208de7230cebfb72bc3bdb51" + integrity sha512-12VZfFIu+wyVbBebyHmRTuEE/tZrB4tJToWcwAMcsp3h4+sHR+fMJWbKpYiCRWlhFBq+KNyO8rIV9rTkeVmznQ== core-js@^2.4.0, core-js@^2.5.0: version "2.6.12" @@ -3356,7 +3589,7 @@ core-js@^2.4.0, core-js@^2.5.0: core-util-is@1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7" - integrity sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ== + integrity sha1-tf1UIgqivFq1eqtxQMlAdUUDwac= core-util-is@~1.0.0: version "1.0.3" @@ -3371,15 +3604,15 @@ cors@^2.8.1: object-assign "^4" vary "^1" -cosmiconfig@^8.0.0: - version "8.3.5" - resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-8.3.5.tgz#3b3897ddd042d022d5a207d4c8832e54f5301977" - integrity sha512-A5Xry3xfS96wy2qbiLkQLAg4JUrR2wvfybxj6yqLmrUfMAvhS3MZxIP2oQn0grgYIvJqzpeTEWu4vK0t+12NNw== +cosmiconfig@^5.0.7: + version "5.2.1" + resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-5.2.1.tgz#040f726809c591e77a17c0a3626ca45b4f168b1a" + integrity sha512-H65gsXo1SKjf8zmrJ67eJk8aIRKV5ff2D4uKZIBZShbhGSpEmsQOPW/SKMKYhSTrqR7ufy6RP69rPogdaPh/kA== dependencies: - import-fresh "^3.3.0" - js-yaml "^4.1.0" - parse-json "^5.2.0" - path-type "^4.0.0" + import-fresh "^2.0.0" + is-directory "^0.3.1" + js-yaml "^3.13.1" + parse-json "^4.0.0" crc-32@^1.2.0: version "1.2.2" @@ -3437,13 +3670,6 @@ cross-fetch@^2.1.0, cross-fetch@^2.1.1: node-fetch "^2.6.7" whatwg-fetch "^2.0.4" -cross-fetch@^3.1.4: - version "3.1.8" - resolved "https://registry.yarnpkg.com/cross-fetch/-/cross-fetch-3.1.8.tgz#0327eba65fd68a7d119f8fb2bf9334a1a7956f82" - integrity sha512-cvA+JwZoU0Xq+h6WkMvAUqPEYy92Obet6UdKLfW60qn99ftItKjB5T+BkyWOFWe2pUyfQ+IJHmpOTznqk1M6Kg== - dependencies: - node-fetch "^2.6.12" - cross-spawn@^6.0.5: version "6.0.5" resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-6.0.5.tgz#4a5ec7c64dfae22c3a14124dbacdee846d80cbc4" @@ -3467,7 +3693,7 @@ cross-spawn@^7.0.2: "crypt@>= 0.0.1": version "0.0.2" resolved "https://registry.yarnpkg.com/crypt/-/crypt-0.0.2.tgz#88d7ff7ec0dfb86f713dc87bbb42d044d3e6c41b" - integrity sha512-mCxBlsHFYh9C+HVpiEacem8FEBnMXgU9gy4zmNC+SXAZNB/1idgp/aulFJ4FgCi7GPEVbfyng092GqL2k2rmow== + integrity sha1-iNf/fsDfuG9xPch7u0LQRNPmxBs= crypto-browserify@3.12.0: version "3.12.0" @@ -3513,16 +3739,16 @@ d@1, d@^1.0.1: dashdash@^1.12.0: version "1.14.1" resolved "https://registry.yarnpkg.com/dashdash/-/dashdash-1.14.1.tgz#853cfa0f7cbe2fed5de20326b8dd581035f6e2f0" - integrity sha512-jRFi8UDGo6j+odZiEpjazZaWqEal3w/basFjQHQEwVtZJGDpxbH1MeYluwCS8Xq5wmLJooDlMgvVarmWfGM44g== + integrity sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA= dependencies: assert-plus "^1.0.0" death@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/death/-/death-1.1.0.tgz#01aa9c401edd92750514470b8266390c66c67318" - integrity sha512-vsV6S4KVHvTGxbEcij7hkWRv0It+sGGWVOM67dQde/o5Xjnr+KmLjxWJii2uEObIrt1CcM9w0Yaovx+iOlIL+w== + integrity sha1-AaqcQB7dknUFFEcLgmY5DGbGcxg= -debug@2.6.9, debug@^2.2.0, debug@^2.3.3, debug@^2.6.8, debug@^2.6.9: +debug@2.6.9, debug@^2.2.0, debug@^2.3.3, debug@^2.6.0, debug@^2.6.8, debug@^2.6.9: version "2.6.9" resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA== @@ -3543,6 +3769,13 @@ debug@4, debug@4.3.4, debug@^4.1.1, debug@^4.3.1, debug@^4.3.2, debug@^4.3.3, de dependencies: ms "2.1.2" +debug@4.3.3, debug@^4.0.1: + version "4.3.3" + resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.3.tgz#04266e0b70a98d4462e6e288e38259213332b664" + integrity sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q== + dependencies: + ms "2.1.2" + debug@^3.1.0: version "3.2.7" resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.7.tgz#72580b7e9145fb39b6676f9c5e5fb100b934179a" @@ -3553,7 +3786,7 @@ debug@^3.1.0: decamelize@^1.1.1, decamelize@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290" - integrity sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA== + integrity sha1-9lNNFRSCabIDUue+4m9QH5oZEpA= decamelize@^4.0.0: version "4.0.0" @@ -3565,24 +3798,17 @@ decode-uri-component@^0.2.0: resolved "https://registry.yarnpkg.com/decode-uri-component/-/decode-uri-component-0.2.2.tgz#e69dbe25d37941171dd540e024c444cd5188e1e9" integrity sha512-FqUYQ+8o158GyGTrMFJms9qh3CqTKvAqgqsTnkLI8sKu0028orqBhxNMFkFen0zGyg6epACD32pjVk58ngIErQ== -decompress-response@^3.3.0: +decompress-response@^3.2.0, decompress-response@^3.3.0: version "3.3.0" resolved "https://registry.yarnpkg.com/decompress-response/-/decompress-response-3.3.0.tgz#80a4dd323748384bfa248083622aedec982adff3" - integrity sha512-BzRPQuY1ip+qDonAOz42gRm/pg9F768C+npV/4JOsxRC2sq+Rlk+Q4ZCAsOhnIaMrgarILY+RMUIvMmmX1qAEA== + integrity sha1-gKTdMjdIOEv6JICDYirt7Jgq3/M= dependencies: mimic-response "^1.0.0" -decompress-response@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/decompress-response/-/decompress-response-6.0.0.tgz#ca387612ddb7e104bd16d85aab00d5ecf09c66fc" - integrity sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ== - dependencies: - mimic-response "^3.1.0" - -deep-eql@^4.1.2: - version "4.1.3" - resolved "https://registry.yarnpkg.com/deep-eql/-/deep-eql-4.1.3.tgz#7c7775513092f7df98d8df9996dd085eb668cc6d" - integrity sha512-WaEtAOpRA1MQ0eohqZjpGD8zdI0Ovsm8mmFhaDN8dvDZzyoUMcYDnf5Y6iu7HTXxf8JDS23qWa4a+hKCDyOPzw== +deep-eql@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/deep-eql/-/deep-eql-3.0.1.tgz#dfc9404400ad1c8fe023e7da1df1c147c4b444df" + integrity sha512-+QeIQyN5ZuO+3Uk5DYh6/1eKO0m0YmJFGNmFHGACpf1ClL1nmlV/p4gNgbl2pJGxgXb4faqo6UE+M5ACEMyVcw== dependencies: type-detect "^4.0.0" @@ -3613,11 +3839,6 @@ defer-to-connect@^1.0.1: resolved "https://registry.yarnpkg.com/defer-to-connect/-/defer-to-connect-1.1.3.tgz#331ae050c08dcf789f8c83a7b81f0ed94f4ac591" integrity sha512-0ISdNousHvZT2EiFlZeZAHBUvSxmKswVCEf8hW7KWgG4a8MVEu/3Vb6uWYozkjylyCxe0JBIiRB1jV45S70WVQ== -defer-to-connect@^2.0.0, defer-to-connect@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/defer-to-connect/-/defer-to-connect-2.0.1.tgz#8016bdb4143e4632b77a3449c6236277de520587" - integrity sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg== - deferred-leveldown@~1.2.1: version "1.2.2" resolved "https://registry.yarnpkg.com/deferred-leveldown/-/deferred-leveldown-1.2.2.tgz#3acd2e0b75d1669924bc0a4b642851131173e1eb" @@ -3633,25 +3854,40 @@ deferred-leveldown@~4.0.0: abstract-leveldown "~5.0.0" inherits "^2.0.3" -define-properties@^1.1.2, define-properties@^1.1.3, define-properties@^1.1.4, define-properties@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.2.0.tgz#52988570670c9eacedd8064f4a990f2405849bd5" - integrity sha512-xvqAVKGfT1+UAvPwKTVw/njhdQ8ZhXK4lI0bCIuCMrp2up9nPnaDftrLtmpTazqd1o+UY4zgzU+avtMbDP+ldA== +deferred-leveldown@~5.3.0: + version "5.3.0" + resolved "https://registry.yarnpkg.com/deferred-leveldown/-/deferred-leveldown-5.3.0.tgz#27a997ad95408b61161aa69bd489b86c71b78058" + integrity sha512-a59VOT+oDy7vtAbLRCZwWgxu2BaCfd5Hk7wxJd48ei7I+nsg8Orlb9CLG0PMZienk9BSUKgeAqkO2+Lw+1+Ukw== + dependencies: + abstract-leveldown "~6.2.1" + inherits "^2.0.3" + +define-properties@^1.1.2: + version "1.1.4" + resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.1.4.tgz#0b14d7bd7fbeb2f3572c3a7eda80ea5d57fb05b1" + integrity sha512-uckOqKcfaVvtBdsVkdPv3XjveQJsNQqmhXgRi8uhvWWuPYZCNlzT8qAyblUgNoXdHdjMTzAqeGjAoli8f+bzPA== dependencies: has-property-descriptors "^1.0.0" object-keys "^1.1.1" +define-properties@^1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.1.3.tgz#cf88da6cbee26fe6db7094f61d870cbd84cee9f1" + integrity sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ== + dependencies: + object-keys "^1.0.12" + define-property@^0.2.5: version "0.2.5" resolved "https://registry.yarnpkg.com/define-property/-/define-property-0.2.5.tgz#c35b1ef918ec3c990f9a5bc57be04aacec5c8116" - integrity sha512-Rr7ADjQZenceVOAKop6ALkkRAmH1A4Gx9hV/7ZujPUN2rkATqFO0JZLZInbAjpZYoJ1gUx8MRMQVkYemcbMSTA== + integrity sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY= dependencies: is-descriptor "^0.1.0" define-property@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/define-property/-/define-property-1.0.0.tgz#769ebaaf3f4a63aad3af9e8d304c9bbe79bfb0e6" - integrity sha512-cZTYKFWspt9jZsMscWo8sc/5lbPC9Q0N5nBLgb+Yd915iL3udB1uFgS3B8YCx66UVHq018DAVFoee7x+gxggeA== + integrity sha1-dp66rz9KY6rTr56NMEybvnm/sOY= dependencies: is-descriptor "^1.0.0" @@ -3663,25 +3899,30 @@ define-property@^2.0.2: is-descriptor "^1.0.2" isobject "^3.0.1" -defined@~1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/defined/-/defined-1.0.1.tgz#c0b9db27bfaffd95d6f61399419b893df0f91ebf" - integrity sha512-hsBd2qSVCRE+5PmNdHt1uzyrFu5d3RwmFDKzyNZMFq/EwDNJF7Ee5+D5oEKF0hU6LhtoUF1macFvOe4AskQC1Q== +defined@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/defined/-/defined-1.0.0.tgz#c98d9bcef75674188e110969151199e39b1fa693" + integrity sha1-yY2bzvdWdBiOEQlpFRGZ45sfppM= delayed-stream@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" - integrity sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ== + integrity sha1-3zrhmayt+31ECqrgsp4icrJOxhk= depd@2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/depd/-/depd-2.0.0.tgz#b696163cc757560d09cf22cc8fad1571b79e76df" integrity sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw== +depd@~1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/depd/-/depd-1.1.2.tgz#9bcd52e14c097763e749b274c4346ed2e560b5a9" + integrity sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak= + des.js@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/des.js/-/des.js-1.1.0.tgz#1d37f5766f3bbff4ee9638e871a8768c173b81da" - integrity sha512-r17GxjhUCjSRy8aiJpr8/UadFIzMzJGexI3Nmz4ADi9LYSFx4gTBp80+NaX/YsXWWLhpZ7v/v/ubEc/bCNfKwg== + version "1.0.1" + resolved "https://registry.yarnpkg.com/des.js/-/des.js-1.0.1.tgz#5382142e1bdc53f85d86d53e5f4aa7deb91e0843" + integrity sha512-Q0I4pfFrv2VPd34/vfLrFOoRmlYj3OV50i7fskps1jZWK1kApMWWT9G6RRUeYedLcBDIhnSDaUvJMb3AhUlaEA== dependencies: inherits "^2.0.1" minimalistic-assert "^1.0.0" @@ -3691,20 +3932,25 @@ destroy@1.2.0: resolved "https://registry.yarnpkg.com/destroy/-/destroy-1.2.0.tgz#4803735509ad8be552934c67df614f94e66fa015" integrity sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg== +destroy@~1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/destroy/-/destroy-1.0.4.tgz#978857442c44749e4206613e37946205826abd80" + integrity sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA= + detect-indent@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/detect-indent/-/detect-indent-4.0.0.tgz#f76d064352cdf43a1cb6ce619c4ee3a9475de208" - integrity sha512-BDKtmHlOzwI7iRuEkhzsnPoi5ypEhWAJB5RvHWe1kMr06js3uK5B3734i3ui5Yd+wOJV1cpE4JnivPD283GU/A== + integrity sha1-920GQ1LN9Docts5hnE7jqUdd4gg= dependencies: repeating "^2.0.0" detect-port@^1.3.0: - version "1.5.1" - resolved "https://registry.yarnpkg.com/detect-port/-/detect-port-1.5.1.tgz#451ca9b6eaf20451acb0799b8ab40dff7718727b" - integrity sha512-aBzdj76lueB6uUst5iAs7+0H/oOjqI5D16XUWxlWMIMROhcM0rfsNVk93zTngq1dDNpoXRr++Sus7ETAExppAQ== + version "1.3.0" + resolved "https://registry.yarnpkg.com/detect-port/-/detect-port-1.3.0.tgz#d9c40e9accadd4df5cac6a782aefd014d573d1f1" + integrity sha512-E+B1gzkl2gqxt1IhUzwjrxBKRqx1UzC3WLONHinn8S3T6lwV/agVCyitiFOsGJ/eYuEUBvD71MZHy3Pv1G9doQ== dependencies: address "^1.0.1" - debug "4" + debug "^2.6.0" devtools-protocol@0.0.981744: version "0.0.981744" @@ -3768,7 +4014,7 @@ domelementtype@^2.3.0: resolved "https://registry.yarnpkg.com/domelementtype/-/domelementtype-2.3.0.tgz#5c45e8e869952626331d7aab326d01daf65d589d" integrity sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw== -domhandler@^5.0.2, domhandler@^5.0.3: +domhandler@^5.0.1, domhandler@^5.0.2, domhandler@^5.0.3: version "5.0.3" resolved "https://registry.yarnpkg.com/domhandler/-/domhandler-5.0.3.tgz#cc385f7f751f1d1fc650c21374804254538c7d31" integrity sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w== @@ -3776,13 +4022,13 @@ domhandler@^5.0.2, domhandler@^5.0.3: domelementtype "^2.3.0" domutils@^3.0.1: - version "3.1.0" - resolved "https://registry.yarnpkg.com/domutils/-/domutils-3.1.0.tgz#c47f551278d3dc4b0b1ab8cbb42d751a6f0d824e" - integrity sha512-H78uMmQtI2AhgDJjWeQmHwJJ2bLPD3GMmO7Zja/ZZh84wkm+4ut+IUnUdRa8uCGX88DiVx1j6FRe1XfxEgjEZA== + version "3.0.1" + resolved "https://registry.yarnpkg.com/domutils/-/domutils-3.0.1.tgz#696b3875238338cb186b6c0612bd4901c89a4f1c" + integrity sha512-z08c1l761iKhDFtfXO04C7kTdPBLi41zwOZl00WS8b5eiaebNpY00HKbztwBq+e3vyqWNwWF3mP9YLUeqIrF+Q== dependencies: dom-serializer "^2.0.0" domelementtype "^2.3.0" - domhandler "^5.0.3" + domhandler "^5.0.1" dotenv@^16.3.1: version "16.3.1" @@ -3797,14 +4043,14 @@ dotignore@~0.1.2: minimatch "^3.0.4" duplexer3@^0.1.4: - version "0.1.5" - resolved "https://registry.yarnpkg.com/duplexer3/-/duplexer3-0.1.5.tgz#0b5e4d7bad5de8901ea4440624c8e1d20099217e" - integrity sha512-1A8za6ws41LQgv9HrE/66jyC5yuSjQ3L/KOpFtoBilsAK2iA2wuS5rTt1OCzIvtS2V7nVmedsUU+DGRcjBmOYA== + version "0.1.4" + resolved "https://registry.yarnpkg.com/duplexer3/-/duplexer3-0.1.4.tgz#ee01dd1cac0ed3cbc7fdbea37dc0a8f1ce002ce2" + integrity sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI= ecc-jsbn@~0.1.1: version "0.1.2" resolved "https://registry.yarnpkg.com/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz#3a83a904e54353287874c564b7549386849a98c9" - integrity sha512-eh9O+hwRHNbG4BLTjEl3nw044CkGm5X6LoaCf7LPp7UU8Qrt47JYNi6nPX8xjW97TKGKm1ouctg0QSpZe9qrnw== + integrity sha1-OoOpBOVDUyh4dMVkt1SThoSamMk= dependencies: jsbn "~0.1.0" safer-buffer "^2.1.0" @@ -3812,12 +4058,12 @@ ecc-jsbn@~0.1.1: ee-first@1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d" - integrity sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow== + integrity sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0= electron-to-chromium@^1.3.47: - version "1.4.515" - resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.515.tgz#f5fec9662106ac5752894af221606cf4db443e70" - integrity sha512-VTq6vjk3kCfG2qdzQRd/i9dIyVVm0dbtZIgFzrLgfB73mXDQT2HPKVRc1EoZcAVUv9XhXAu08DWqJuababdGGg== + version "1.4.103" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.103.tgz#abfe376a4d70fa1e1b4b353b95df5d6dfd05da3a" + integrity sha512-c/uKWR1Z/W30Wy/sx3dkZoj4BijbXX85QKWu9jJfjho3LBAXNEGAEW3oWiGb+dotA6C6BzCTxL2/aLes7jlUeg== elliptic@6.5.4, elliptic@^6.4.0, elliptic@^6.5.2, elliptic@^6.5.3, elliptic@^6.5.4: version "6.5.4" @@ -3832,6 +4078,11 @@ elliptic@6.5.4, elliptic@^6.4.0, elliptic@^6.5.2, elliptic@^6.5.3, elliptic@^6.5 minimalistic-assert "^1.0.1" minimalistic-crypto-utils "^1.0.1" +emoji-regex@^10.0.0: + version "10.0.0" + resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-10.0.0.tgz#96559e19f82231b436403e059571241d627c42b8" + integrity sha512-KmJa8l6uHi1HrBI34udwlzZY1jOEuID/ft4d8BSSEdRyap7PwBEt910453PJa5MuGvxkLqlt4Uvhu7tttFHViw== + emoji-regex@^7.0.1: version "7.0.3" resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-7.0.3.tgz#933a04052860c85e83c122479c4748a8e4c72156" @@ -3850,18 +4101,28 @@ encode-utf8@^1.0.2: encodeurl@~1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.2.tgz#ad3ff4c86ec2d029322f5a02c3a9a606c95b3f59" - integrity sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w== + integrity sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k= encoding-down@5.0.4, encoding-down@~5.0.0: version "5.0.4" resolved "https://registry.yarnpkg.com/encoding-down/-/encoding-down-5.0.4.tgz#1e477da8e9e9d0f7c8293d320044f8b2cd8e9614" integrity sha512-8CIZLDcSKxgzT+zX8ZVfgNbu8Md2wq/iqa1Y7zyVR18QBEAc0Nmzuvj/N5ykSKpfGzjM8qxbaFntLPwnVoUhZw== dependencies: - abstract-leveldown "^5.0.0" + abstract-leveldown "^5.0.0" + inherits "^2.0.3" + level-codec "^9.0.0" + level-errors "^2.0.0" + xtend "^4.0.1" + +encoding-down@^6.3.0: + version "6.3.0" + resolved "https://registry.yarnpkg.com/encoding-down/-/encoding-down-6.3.0.tgz#b1c4eb0e1728c146ecaef8e32963c549e76d082b" + integrity sha512-QKrV0iKR6MZVJV08QY0wp1e7vF6QbhnbQhb07bwpEyuz4uZiZgPlEGdkCROuFkUwdxlFaiPIhjyarH1ee/3vhw== + dependencies: + abstract-leveldown "^6.2.1" inherits "^2.0.3" level-codec "^9.0.0" level-errors "^2.0.0" - xtend "^4.0.1" encoding@^0.1.11: version "0.1.13" @@ -3878,17 +4139,16 @@ end-of-stream@^1.1.0, end-of-stream@^1.4.1: once "^1.4.0" enquirer@^2.3.0, enquirer@^2.3.6: - version "2.4.1" - resolved "https://registry.yarnpkg.com/enquirer/-/enquirer-2.4.1.tgz#93334b3fbd74fc7097b224ab4a8fb7e40bf4ae56" - integrity sha512-rRqJg/6gd538VHvR3PSrdRBb/1Vy2YfzHqzvbhGIQpDRKIa4FgV/54b5Q1xYSxOOwKvjXweS26E0Q+nAMwp2pQ== + version "2.3.6" + resolved "https://registry.yarnpkg.com/enquirer/-/enquirer-2.3.6.tgz#2a7fe5dd634a1e4125a975ec994ff5456dc3734d" + integrity sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg== dependencies: ansi-colors "^4.1.1" - strip-ansi "^6.0.1" -entities@^4.2.0, entities@^4.4.0: - version "4.5.0" - resolved "https://registry.yarnpkg.com/entities/-/entities-4.5.0.tgz#5d268ea5e7113ec74c4d033b79ea5a35a488fb48" - integrity sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw== +entities@^4.2.0, entities@^4.3.0, entities@^4.4.0: + version "4.4.0" + resolved "https://registry.yarnpkg.com/entities/-/entities-4.4.0.tgz#97bdaba170339446495e653cfd2db78962900174" + integrity sha512-oYp7156SP8LkeGD0GF85ad1X9Ai79WtRsZ2gxJqtBuzH+98YUV6jkHEKlZkMbcrjJjIVJNIDP/3WL9wQkoPbWA== env-paths@^2.2.0: version "2.2.1" @@ -3909,64 +4169,57 @@ error-ex@^1.2.0, error-ex@^1.3.1: dependencies: is-arrayish "^0.2.1" -es-abstract@^1.22.1: - version "1.22.1" - resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.22.1.tgz#8b4e5fc5cefd7f1660f0f8e1a52900dfbc9d9ccc" - integrity sha512-ioRRcXMO6OFyRpyzV3kE1IIBd4WG5/kltnzdxSCqoP8CMGs/Li+M1uF5o7lOkZVFjDs+NLesthnF66Pg/0q0Lw== +es-abstract@^1.18.5: + version "1.19.1" + resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.19.1.tgz#d4885796876916959de78edaa0df456627115ec3" + integrity sha512-2vJ6tjA/UfqLm2MPs7jxVybLoB8i1t1Jd9R3kISld20sIxPcTbLuggQOUxeWeAvIUkduv/CfMjuh4WmiXr2v9w== dependencies: - array-buffer-byte-length "^1.0.0" - arraybuffer.prototype.slice "^1.0.1" - available-typed-arrays "^1.0.5" call-bind "^1.0.2" - es-set-tostringtag "^2.0.1" es-to-primitive "^1.2.1" - function.prototype.name "^1.1.5" - get-intrinsic "^1.2.1" + function-bind "^1.1.1" + get-intrinsic "^1.1.1" get-symbol-description "^1.0.0" - globalthis "^1.0.3" - gopd "^1.0.1" has "^1.0.3" - has-property-descriptors "^1.0.0" - has-proto "^1.0.1" - has-symbols "^1.0.3" - internal-slot "^1.0.5" - is-array-buffer "^3.0.2" - is-callable "^1.2.7" - is-negative-zero "^2.0.2" + has-symbols "^1.0.2" + internal-slot "^1.0.3" + is-callable "^1.2.4" + is-negative-zero "^2.0.1" is-regex "^1.1.4" - is-shared-array-buffer "^1.0.2" + is-shared-array-buffer "^1.0.1" is-string "^1.0.7" - is-typed-array "^1.1.10" - is-weakref "^1.0.2" - object-inspect "^1.12.3" + is-weakref "^1.0.1" + object-inspect "^1.11.0" object-keys "^1.1.1" - object.assign "^4.1.4" - regexp.prototype.flags "^1.5.0" - safe-array-concat "^1.0.0" - safe-regex-test "^1.0.0" - string.prototype.trim "^1.2.7" - string.prototype.trimend "^1.0.6" - string.prototype.trimstart "^1.0.6" - typed-array-buffer "^1.0.0" - typed-array-byte-length "^1.0.0" - typed-array-byte-offset "^1.0.0" - typed-array-length "^1.0.4" - unbox-primitive "^1.0.2" - which-typed-array "^1.1.10" - -es-array-method-boxes-properly@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/es-array-method-boxes-properly/-/es-array-method-boxes-properly-1.0.0.tgz#873f3e84418de4ee19c5be752990b2e44718d09e" - integrity sha512-wd6JXUmyHmt8T5a2xreUwKcGPq6f1f+WwIJkijUqiGcJz1qqnZgP6XIK+QyIWU5lT7imeNxUll48bziG+TSYcA== + object.assign "^4.1.2" + string.prototype.trimend "^1.0.4" + string.prototype.trimstart "^1.0.4" + unbox-primitive "^1.0.1" -es-set-tostringtag@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/es-set-tostringtag/-/es-set-tostringtag-2.0.1.tgz#338d502f6f674301d710b80c8592de8a15f09cd8" - integrity sha512-g3OMbtlwY3QewlqAiMLI47KywjWZoEytKr8pf6iTC8uJq5bIAH52Z9pnQ8pVL6whrCto53JZDuUIsifGeLorTg== +es-abstract@^1.19.1: + version "1.19.2" + resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.19.2.tgz#8f7b696d8f15b167ae3640b4060670f3d054143f" + integrity sha512-gfSBJoZdlL2xRiOCy0g8gLMryhoe1TlimjzU99L/31Z8QEGIhVQI+EWwt5lT+AuU9SnorVupXFqqOGqGfsyO6w== dependencies: - get-intrinsic "^1.1.3" + call-bind "^1.0.2" + es-to-primitive "^1.2.1" + function-bind "^1.1.1" + get-intrinsic "^1.1.1" + get-symbol-description "^1.0.0" has "^1.0.3" - has-tostringtag "^1.0.0" + has-symbols "^1.0.3" + internal-slot "^1.0.3" + is-callable "^1.2.4" + is-negative-zero "^2.0.2" + is-regex "^1.1.4" + is-shared-array-buffer "^1.0.1" + is-string "^1.0.7" + is-weakref "^1.0.2" + object-inspect "^1.12.0" + object-keys "^1.1.1" + object.assign "^4.1.2" + string.prototype.trimend "^1.0.4" + string.prototype.trimstart "^1.0.4" + unbox-primitive "^1.0.1" es-to-primitive@^1.2.1: version "1.2.1" @@ -3978,9 +4231,9 @@ es-to-primitive@^1.2.1: is-symbol "^1.0.2" es5-ext@^0.10.35, es5-ext@^0.10.50: - version "0.10.62" - resolved "https://registry.yarnpkg.com/es5-ext/-/es5-ext-0.10.62.tgz#5e6adc19a6da524bf3d1e02bbc8960e5eb49a9a5" - integrity sha512-BHLqn0klhEpnOKSrzn/Xsz2UIW8j+cGmo9JLzr8BiUapV8hPL9+FliFqjwr9ngW7jWdnxv6eO+/LqyhJVqgrjA== + version "0.10.59" + resolved "https://registry.yarnpkg.com/es5-ext/-/es5-ext-0.10.59.tgz#71038939730eb6f4f165f1421308fb60be363bc6" + integrity sha512-cOgyhW0tIJyQY1Kfw6Kr0viu9ZlUctVchRMZ7R0HiH3dxTSp5zJDLecwxUqPUrGKMsgBI1wd1FL+d9Jxfi4cLw== dependencies: es6-iterator "^2.0.3" es6-symbol "^3.1.3" @@ -3989,17 +4242,12 @@ es5-ext@^0.10.35, es5-ext@^0.10.50: es6-iterator@^2.0.3: version "2.0.3" resolved "https://registry.yarnpkg.com/es6-iterator/-/es6-iterator-2.0.3.tgz#a7de889141a05a94b0854403b2d0a0fbfa98f3b7" - integrity sha512-zw4SRzoUkd+cl+ZoE15A9o1oQd920Bb0iOJMQkQhl3jNc03YqVjAhG7scf9C5KWRU/R13Orf588uCC6525o02g== + integrity sha1-p96IkUGgWpSwhUQDstCg+/qY87c= dependencies: d "1" es5-ext "^0.10.35" es6-symbol "^3.1.1" -es6-promise@^4.2.8: - version "4.2.8" - resolved "https://registry.yarnpkg.com/es6-promise/-/es6-promise-4.2.8.tgz#4eb21594c972bc40553d276e510539143db53e0a" - integrity sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w== - es6-symbol@^3.1.1, es6-symbol@^3.1.3: version "3.1.3" resolved "https://registry.yarnpkg.com/es6-symbol/-/es6-symbol-3.1.3.tgz#bad5d3c1bcdac28269f4cb331e431c78ac705d18" @@ -4016,12 +4264,12 @@ escalade@^3.1.1: escape-html@~1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/escape-html/-/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988" - integrity sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow== + integrity sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg= escape-string-regexp@1.0.5, escape-string-regexp@^1.0.2, escape-string-regexp@^1.0.5: version "1.0.5" resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" - integrity sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg== + integrity sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ= escape-string-regexp@4.0.0, escape-string-regexp@^4.0.0: version "4.0.0" @@ -4031,7 +4279,7 @@ escape-string-regexp@4.0.0, escape-string-regexp@^4.0.0: escodegen@1.8.x: version "1.8.1" resolved "https://registry.yarnpkg.com/escodegen/-/escodegen-1.8.1.tgz#5a5b53af4693110bebb0867aa3430dd3b70a1018" - integrity sha512-yhi5S+mNTOuRvyW4gWlg5W1byMaQGWWSYHXsuFZ7GBo7tpyOwi2EdzMP/QWxh9hwkD2m+wDVHJsxhRIj+v/b/A== + integrity sha1-WltTr0aTEQvrsIZ6o0MN07cKEBg= dependencies: esprima "^2.7.1" estraverse "^1.9.1" @@ -4041,9 +4289,9 @@ escodegen@1.8.x: source-map "~0.2.0" eslint-config-prettier@^8.3.0: - version "8.10.0" - resolved "https://registry.yarnpkg.com/eslint-config-prettier/-/eslint-config-prettier-8.10.0.tgz#3a06a662130807e2502fc3ff8b4143d8a0658e11" - integrity sha512-SM8AMJdeQqRYT9O9zguiruQZaN7+z+E4eAP9oiLNGKMtomwaB1E9dcgUD6ZAn/eQAb52USbvezbiljfZUhbJcg== + version "8.5.0" + resolved "https://registry.yarnpkg.com/eslint-config-prettier/-/eslint-config-prettier-8.5.0.tgz#5a81680ec934beca02c7b1a61cf8ca34b66feab1" + integrity sha512-obmWKLUNCnhtQRKc+tmnYuQl0pFU1ibYJQ5BGhTVB08bHe9wC8qUeG7c08dj9XX+AuPj1YSGSQIHl1pnDHZR0Q== eslint-plugin-mocha@^9.0.0: version "9.0.0" @@ -4060,6 +4308,14 @@ eslint-plugin-prettier@^4.0.0: dependencies: prettier-linter-helpers "^1.0.0" +eslint-scope@^4.0.3: + version "4.0.3" + resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-4.0.3.tgz#ca03833310f6889a3264781aa82e63eb9cfe7848" + integrity sha512-p7VutNr1O/QrxysMo3E45FjYDTeXBy0iTltPFNSqKAIfjDSXC+4dj+qfyuD8bfAXrW/y6lW3O76VaYNPKfpKrg== + dependencies: + esrecurse "^4.1.0" + estraverse "^4.1.1" + eslint-scope@^5.1.1: version "5.1.1" resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-5.1.1.tgz#e786e59a66cb92b3f6c1fb0d508aab174848f48c" @@ -4068,14 +4324,21 @@ eslint-scope@^5.1.1: esrecurse "^4.3.0" estraverse "^4.1.1" -eslint-scope@^7.2.2: - version "7.2.2" - resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-7.2.2.tgz#deb4f92563390f32006894af62a22dba1c46423f" - integrity sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg== +eslint-scope@^7.1.1: + version "7.1.1" + resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-7.1.1.tgz#fff34894c2f65e5226d3041ac480b4513a163642" + integrity sha512-QKQM/UXpIiHcLqJ5AOyIW7XZmzjkzQXYE54n1++wb0u9V/abW3l9uQnxX8Z5Xd18xyKIMTUAyQ0k1e8pz6LUrw== dependencies: esrecurse "^4.3.0" estraverse "^5.2.0" +eslint-utils@^1.3.1: + version "1.4.3" + resolved "https://registry.yarnpkg.com/eslint-utils/-/eslint-utils-1.4.3.tgz#74fec7c54d0776b6f67e0251040b5806564e981f" + integrity sha512-fbBN5W2xdY45KulGXmLHZ3c3FHfVYmKg0IrAKGOkT/464PQsx2UeIzfz1RmEci+KLm1bBaAzZAh8+/E+XAeZ8Q== + dependencies: + eslint-visitor-keys "^1.1.0" + eslint-utils@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/eslint-utils/-/eslint-utils-3.0.0.tgz#8aebaface7345bb33559db0a1f13a1d2d48c3672" @@ -4083,86 +4346,144 @@ eslint-utils@^3.0.0: dependencies: eslint-visitor-keys "^2.0.0" +eslint-visitor-keys@^1.0.0, eslint-visitor-keys@^1.1.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz#30ebd1ef7c2fdff01c3a4f151044af25fab0523e" + integrity sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ== + eslint-visitor-keys@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz#f65328259305927392c938ed44eb0a5c9b2bd303" integrity sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw== -eslint-visitor-keys@^3.3.0, eslint-visitor-keys@^3.4.1, eslint-visitor-keys@^3.4.3: - version "3.4.3" - resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz#0cd72fe8550e3c2eae156a96a4dddcd1c8ac5800" - integrity sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag== +eslint-visitor-keys@^3.3.0: + version "3.3.0" + resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-3.3.0.tgz#f6480fa6b1f30efe2d1968aa8ac745b862469826" + integrity sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA== + +eslint@^5.6.0: + version "5.16.0" + resolved "https://registry.yarnpkg.com/eslint/-/eslint-5.16.0.tgz#a1e3ac1aae4a3fbd8296fcf8f7ab7314cbb6abea" + integrity sha512-S3Rz11i7c8AA5JPv7xAH+dOyq/Cu/VXHiHXBPOU1k/JAM5dXqQPt3qcrhpHSorXmrpu2g0gkIBVXAqCpzfoZIg== + dependencies: + "@babel/code-frame" "^7.0.0" + ajv "^6.9.1" + chalk "^2.1.0" + cross-spawn "^6.0.5" + debug "^4.0.1" + doctrine "^3.0.0" + eslint-scope "^4.0.3" + eslint-utils "^1.3.1" + eslint-visitor-keys "^1.0.0" + espree "^5.0.1" + esquery "^1.0.1" + esutils "^2.0.2" + file-entry-cache "^5.0.1" + functional-red-black-tree "^1.0.1" + glob "^7.1.2" + globals "^11.7.0" + ignore "^4.0.6" + import-fresh "^3.0.0" + imurmurhash "^0.1.4" + inquirer "^6.2.2" + js-yaml "^3.13.0" + json-stable-stringify-without-jsonify "^1.0.1" + levn "^0.3.0" + lodash "^4.17.11" + minimatch "^3.0.4" + mkdirp "^0.5.1" + natural-compare "^1.4.0" + optionator "^0.8.2" + path-is-inside "^1.0.2" + progress "^2.0.0" + regexpp "^2.0.1" + semver "^5.5.1" + strip-ansi "^4.0.0" + strip-json-comments "^2.0.1" + table "^5.2.3" + text-table "^0.2.0" eslint@^8.23.1: - version "8.49.0" - resolved "https://registry.yarnpkg.com/eslint/-/eslint-8.49.0.tgz#09d80a89bdb4edee2efcf6964623af1054bf6d42" - integrity sha512-jw03ENfm6VJI0jA9U+8H5zfl5b+FvuU3YYvZRdZHOlU2ggJkxrlkJH4HcDrZpj6YwD8kuYqvQM8LyesoazrSOQ== - dependencies: - "@eslint-community/eslint-utils" "^4.2.0" - "@eslint-community/regexpp" "^4.6.1" - "@eslint/eslintrc" "^2.1.2" - "@eslint/js" "8.49.0" - "@humanwhocodes/config-array" "^0.11.11" + version "8.23.1" + resolved "https://registry.yarnpkg.com/eslint/-/eslint-8.23.1.tgz#cfd7b3f7fdd07db8d16b4ac0516a29c8d8dca5dc" + integrity sha512-w7C1IXCc6fNqjpuYd0yPlcTKKmHlHHktRkzmBPZ+7cvNBQuiNjx0xaMTjAJGCafJhQkrFJooREv0CtrVzmHwqg== + dependencies: + "@eslint/eslintrc" "^1.3.2" + "@humanwhocodes/config-array" "^0.10.4" + "@humanwhocodes/gitignore-to-minimatch" "^1.0.2" "@humanwhocodes/module-importer" "^1.0.1" - "@nodelib/fs.walk" "^1.2.8" - ajv "^6.12.4" + ajv "^6.10.0" chalk "^4.0.0" cross-spawn "^7.0.2" debug "^4.3.2" doctrine "^3.0.0" escape-string-regexp "^4.0.0" - eslint-scope "^7.2.2" - eslint-visitor-keys "^3.4.3" - espree "^9.6.1" - esquery "^1.4.2" + eslint-scope "^7.1.1" + eslint-utils "^3.0.0" + eslint-visitor-keys "^3.3.0" + espree "^9.4.0" + esquery "^1.4.0" esutils "^2.0.2" fast-deep-equal "^3.1.3" file-entry-cache "^6.0.1" find-up "^5.0.0" - glob-parent "^6.0.2" - globals "^13.19.0" - graphemer "^1.4.0" + glob-parent "^6.0.1" + globals "^13.15.0" + globby "^11.1.0" + grapheme-splitter "^1.0.4" ignore "^5.2.0" + import-fresh "^3.0.0" imurmurhash "^0.1.4" is-glob "^4.0.0" - is-path-inside "^3.0.3" + js-sdsl "^4.1.4" js-yaml "^4.1.0" json-stable-stringify-without-jsonify "^1.0.1" levn "^0.4.1" lodash.merge "^4.6.2" minimatch "^3.1.2" natural-compare "^1.4.0" - optionator "^0.9.3" + optionator "^0.9.1" + regexpp "^3.2.0" strip-ansi "^6.0.1" + strip-json-comments "^3.1.0" text-table "^0.2.0" -espree@^9.6.0, espree@^9.6.1: - version "9.6.1" - resolved "https://registry.yarnpkg.com/espree/-/espree-9.6.1.tgz#a2a17b8e434690a5432f2f8018ce71d331a48c6f" - integrity sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ== +espree@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/espree/-/espree-5.0.1.tgz#5d6526fa4fc7f0788a5cf75b15f30323e2f81f7a" + integrity sha512-qWAZcWh4XE/RwzLJejfcofscgMc9CamR6Tn1+XRXNzrvUSSbiAjGOI/fggztjIi7y9VLPqnICMIPiGyr8JaZ0A== + dependencies: + acorn "^6.0.7" + acorn-jsx "^5.0.0" + eslint-visitor-keys "^1.0.0" + +espree@^9.4.0: + version "9.4.0" + resolved "https://registry.yarnpkg.com/espree/-/espree-9.4.0.tgz#cd4bc3d6e9336c433265fc0aa016fc1aaf182f8a" + integrity sha512-DQmnRpLj7f6TgN/NYb0MTzJXL+vJF9h3pHy4JhCIs3zwcgez8xmGg3sXHcEO97BrmO2OSvCwMdfdlyl+E9KjOw== dependencies: - acorn "^8.9.0" + acorn "^8.8.0" acorn-jsx "^5.3.2" - eslint-visitor-keys "^3.4.1" + eslint-visitor-keys "^3.3.0" esprima@2.7.x, esprima@^2.7.1: version "2.7.3" resolved "https://registry.yarnpkg.com/esprima/-/esprima-2.7.3.tgz#96e3b70d5779f6ad49cd032673d1c312767ba581" - integrity sha512-OarPfz0lFCiW4/AV2Oy1Rp9qu0iusTKqykwTspGCZtPxmF81JR4MmIebvF1F9+UOKth2ZubLQ4XGGaU+hSn99A== + integrity sha1-luO3DVd59q1JzQMmc9HDEnZ7pYE= esprima@^4.0.0: version "4.0.1" resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71" integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A== -esquery@^1.4.2: - version "1.5.0" - resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.5.0.tgz#6ce17738de8577694edd7361c57182ac8cb0db0b" - integrity sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg== +esquery@^1.0.1, esquery@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.4.0.tgz#2148ffc38b82e8c7057dfed48425b3e61f0f24a5" + integrity sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w== dependencies: estraverse "^5.1.0" -esrecurse@^4.3.0: +esrecurse@^4.1.0, esrecurse@^4.3.0: version "4.3.0" resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.3.0.tgz#7ad7964d679abb28bee72cec63758b1c5d2c9921" integrity sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag== @@ -4172,7 +4493,7 @@ esrecurse@^4.3.0: estraverse@^1.9.1: version "1.9.3" resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-1.9.3.tgz#af67f2dc922582415950926091a4005d29c9bb44" - integrity sha512-25w1fMXQrGdoquWnScXZGckOv+Wes+JDnuN/+7ex3SauFRS72r2lFDec0EKPt2YD1wUJ/IrfEex+9yp4hfSOJA== + integrity sha1-r2fy3JIlgkFZUJJgkaQAXSnJu0Q= estraverse@^4.1.1: version "4.3.0" @@ -4192,7 +4513,7 @@ esutils@^2.0.2: etag@~1.8.1: version "1.8.1" resolved "https://registry.yarnpkg.com/etag/-/etag-1.8.1.tgz#41ae2eeb65efa62268aebfea83ac7d79299b0887" - integrity sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg== + integrity sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc= eth-block-tracker@^3.0.0: version "3.0.1" @@ -4210,12 +4531,12 @@ eth-block-tracker@^3.0.0: eth-ens-namehash@2.0.8, eth-ens-namehash@^2.0.8: version "2.0.8" resolved "https://registry.yarnpkg.com/eth-ens-namehash/-/eth-ens-namehash-2.0.8.tgz#229ac46eca86d52e0c991e7cb2aef83ff0f68bcf" - integrity sha512-VWEI1+KJfz4Km//dadyvBBoBeSQ0MHTXPvr8UIXiLW6IanxvAV+DmlZAijZwAyggqGUfwQBeHf7tc9wzc1piSw== + integrity sha1-IprEbsqG1S4MmR58sq74P/D2i88= dependencies: idna-uts46-hx "^2.3.1" js-sha3 "^0.5.7" -eth-gas-reporter@^0.2.25: +eth-gas-reporter@^0.2.24: version "0.2.25" resolved "https://registry.yarnpkg.com/eth-gas-reporter/-/eth-gas-reporter-0.2.25.tgz#546dfa946c1acee93cb1a94c2a1162292d6ff566" integrity sha512-1fRgyE4xUB8SoqLgN3eDfpDfwEfRxh2Sz1b7wzFbyQA+9TekMmvSjjoRu9SKcSVyK+vLkLIsVbJDsTWjw195OQ== @@ -4289,7 +4610,7 @@ eth-lib@^0.1.26: eth-query@^2.0.2, eth-query@^2.1.0, eth-query@^2.1.2: version "2.1.2" resolved "https://registry.yarnpkg.com/eth-query/-/eth-query-2.1.2.tgz#d6741d9000106b51510c72db92d6365456a6da5e" - integrity sha512-srES0ZcvwkR/wd5OQBRA1bIJMww1skfGS0s8wlwK3/oNP4+wnds60krvu5R1QbpRQjMmpG5OMIWro5s7gvDPsA== + integrity sha1-1nQdkAAQa1FRDHLbktY2VFam2l4= dependencies: json-rpc-random-id "^1.0.0" xtend "^4.0.1" @@ -4309,7 +4630,7 @@ eth-sig-util@3.0.0: eth-sig-util@^1.4.2: version "1.4.2" resolved "https://registry.yarnpkg.com/eth-sig-util/-/eth-sig-util-1.4.2.tgz#8d958202c7edbaae839707fba6f09ff327606210" - integrity sha512-iNZ576iTOGcfllftB73cPB5AN+XUQAT/T8xzsILsghXC1o8gJUqe3RHlcDqagu+biFpYQ61KQrZZJza8eRSYqw== + integrity sha1-jZWCAsftuq6Dlwf7pvCf8ydgYhA= dependencies: ethereumjs-abi "git+https://github.com/ethereumjs/ethereumjs-abi.git" ethereumjs-util "^5.1.1" @@ -4355,9 +4676,9 @@ ethereum-common@0.2.0: ethereum-common@^0.0.18: version "0.0.18" resolved "https://registry.yarnpkg.com/ethereum-common/-/ethereum-common-0.0.18.tgz#2fdc3576f232903358976eb39da783213ff9523f" - integrity sha512-EoltVQTRNg2Uy4o84qpa2aXymXDJhxm7eos/ACOg0DG4baAbMjhbdAEsx9GeE8sC3XCxnYvrrzZDH8D8MtA2iQ== + integrity sha1-L9w1dvIykDNYl26znaeDIT/5Uj8= -ethereum-cryptography@0.1.3, ethereum-cryptography@^0.1.3: +ethereum-cryptography@^0.1.2, ethereum-cryptography@^0.1.3: version "0.1.3" resolved "https://registry.yarnpkg.com/ethereum-cryptography/-/ethereum-cryptography-0.1.3.tgz#8d6143cfc3d74bf79bbd8edecdf29e4ae20dd191" integrity sha512-w8/4x1SGGzc+tO97TASLja6SLd3fRIK2tLVcV2Gx4IB21hE19atll5Cq9o3d0ZmAYC/8aw0ipieTSiekAea4SQ== @@ -4379,24 +4700,14 @@ ethereum-cryptography@0.1.3, ethereum-cryptography@^0.1.3: setimmediate "^1.0.5" ethereum-cryptography@^1.0.3: - version "1.2.0" - resolved "https://registry.yarnpkg.com/ethereum-cryptography/-/ethereum-cryptography-1.2.0.tgz#5ccfa183e85fdaf9f9b299a79430c044268c9b3a" - integrity sha512-6yFQC9b5ug6/17CQpCyE3k9eKBMdhyVjzUy1WkiuY/E4vj/SXDBbCw8QEIaXqf0Mf2SnY6RmpDcwlUmBSS0EJw== - dependencies: - "@noble/hashes" "1.2.0" - "@noble/secp256k1" "1.7.1" - "@scure/bip32" "1.1.5" - "@scure/bip39" "1.1.1" - -ethereum-cryptography@^2.0.0, ethereum-cryptography@^2.1.2: - version "2.1.2" - resolved "https://registry.yarnpkg.com/ethereum-cryptography/-/ethereum-cryptography-2.1.2.tgz#18fa7108622e56481157a5cb7c01c0c6a672eb67" - integrity sha512-Z5Ba0T0ImZ8fqXrJbpHcbpAvIswRte2wGNR/KePnu8GbbvgJ47lMxT/ZZPG6i9Jaht4azPDop4HaM00J0J59ug== + version "1.0.3" + resolved "https://registry.yarnpkg.com/ethereum-cryptography/-/ethereum-cryptography-1.0.3.tgz#b1f8f4e702434b2016248dbb2f9fdd60c54772d8" + integrity sha512-NQLTW0x0CosoVb/n79x/TRHtfvS3hgNUPTUSCu0vM+9k6IIhHFFrAOJReneexjZsoZxMjJHnJn4lrE8EbnSyqQ== dependencies: - "@noble/curves" "1.1.0" - "@noble/hashes" "1.3.1" - "@scure/bip32" "1.3.1" - "@scure/bip39" "1.2.1" + "@noble/hashes" "1.0.0" + "@noble/secp256k1" "1.5.5" + "@scure/bip32" "1.0.1" + "@scure/bip39" "1.0.0" ethereum-waffle@^3.4.0: version "3.4.4" @@ -4412,7 +4723,7 @@ ethereum-waffle@^3.4.0: ethereumjs-abi@0.6.5: version "0.6.5" resolved "https://registry.yarnpkg.com/ethereumjs-abi/-/ethereumjs-abi-0.6.5.tgz#5a637ef16ab43473fa72a29ad90871405b3f5241" - integrity sha512-rCjJZ/AE96c/AAZc6O3kaog4FhOsAViaysBxqJNy2+LHP0ttH0zkZ7nXdVHOAyt6lFwLO0nlCwWszysG/ao1+g== + integrity sha1-WmN+8Wq0NHP6cqKa2QhxQFs/UkE= dependencies: bn.js "^4.10.0" ethereumjs-util "^4.3.0" @@ -4551,10 +4862,21 @@ ethereumjs-util@^5.0.0, ethereumjs-util@^5.0.1, ethereumjs-util@^5.1.1, ethereum rlp "^2.0.0" safe-buffer "^5.1.1" -ethereumjs-util@^7.0.10, ethereumjs-util@^7.0.2, ethereumjs-util@^7.1.0, ethereumjs-util@^7.1.1, ethereumjs-util@^7.1.2, ethereumjs-util@^7.1.5: - version "7.1.5" - resolved "https://registry.yarnpkg.com/ethereumjs-util/-/ethereumjs-util-7.1.5.tgz#9ecf04861e4fbbeed7465ece5f23317ad1129181" - integrity sha512-SDl5kKrQAudFBUe5OJM9Ac6WmMyYmXX/6sTmLZ3ffG2eY6ZIGBes3pEDxNN6V72WyOw4CPD5RomKdsa8DAAwLg== +ethereumjs-util@^7.0.10: + version "7.1.3" + resolved "https://registry.yarnpkg.com/ethereumjs-util/-/ethereumjs-util-7.1.3.tgz#b55d7b64dde3e3e45749e4c41288238edec32d23" + integrity sha512-y+82tEbyASO0K0X1/SRhbJJoAlfcvq8JbrG4a5cjrOks7HS/36efU/0j2flxCPOUM++HFahk33kr/ZxyC4vNuw== + dependencies: + "@types/bn.js" "^5.1.0" + bn.js "^5.1.2" + create-hash "^1.1.2" + ethereum-cryptography "^0.1.3" + rlp "^2.2.4" + +ethereumjs-util@^7.0.2, ethereumjs-util@^7.1.0, ethereumjs-util@^7.1.1, ethereumjs-util@^7.1.3, ethereumjs-util@^7.1.4: + version "7.1.4" + resolved "https://registry.yarnpkg.com/ethereumjs-util/-/ethereumjs-util-7.1.4.tgz#a6885bcdd92045b06f596c7626c3e89ab3312458" + integrity sha512-p6KmuPCX4mZIqsQzXfmSx9Y0l2hqf+VkAiwSisW3UKUFdk8ZkAt+AYaor83z2nSi6CU2zSsXMlD80hAbNEGM0A== dependencies: "@types/bn.js" "^5.1.0" bn.js "^5.1.2" @@ -4630,7 +4952,43 @@ ethers@^4.0.32, ethers@^4.0.40: uuid "2.0.1" xmlhttprequest "1.8.0" -ethers@^5.0.1, ethers@^5.0.2, ethers@^5.1.0, ethers@^5.5.2, ethers@^5.5.3, ethers@^5.6.9, ethers@^5.7.1: +ethers@^5.0.1, ethers@^5.0.2: + version "5.6.2" + resolved "https://registry.yarnpkg.com/ethers/-/ethers-5.6.2.tgz#e75bac7f038c5e0fdde667dba62fc223924143a2" + integrity sha512-EzGCbns24/Yluu7+ToWnMca3SXJ1Jk1BvWB7CCmVNxyOeM4LLvw2OLuIHhlkhQk1dtOcj9UMsdkxUh8RiG1dxQ== + dependencies: + "@ethersproject/abi" "5.6.0" + "@ethersproject/abstract-provider" "5.6.0" + "@ethersproject/abstract-signer" "5.6.0" + "@ethersproject/address" "5.6.0" + "@ethersproject/base64" "5.6.0" + "@ethersproject/basex" "5.6.0" + "@ethersproject/bignumber" "5.6.0" + "@ethersproject/bytes" "5.6.1" + "@ethersproject/constants" "5.6.0" + "@ethersproject/contracts" "5.6.0" + "@ethersproject/hash" "5.6.0" + "@ethersproject/hdnode" "5.6.0" + "@ethersproject/json-wallets" "5.6.0" + "@ethersproject/keccak256" "5.6.0" + "@ethersproject/logger" "5.6.0" + "@ethersproject/networks" "5.6.1" + "@ethersproject/pbkdf2" "5.6.0" + "@ethersproject/properties" "5.6.0" + "@ethersproject/providers" "5.6.2" + "@ethersproject/random" "5.6.0" + "@ethersproject/rlp" "5.6.0" + "@ethersproject/sha2" "5.6.0" + "@ethersproject/signing-key" "5.6.0" + "@ethersproject/solidity" "5.6.0" + "@ethersproject/strings" "5.6.0" + "@ethersproject/transactions" "5.6.0" + "@ethersproject/units" "5.6.0" + "@ethersproject/wallet" "5.6.0" + "@ethersproject/web" "5.6.0" + "@ethersproject/wordlists" "5.6.0" + +ethers@^5.1.0: version "5.7.2" resolved "https://registry.yarnpkg.com/ethers/-/ethers-5.7.2.tgz#3a7deeabbb8c030d4126b24f84e525466145872e" integrity sha512-wswUsmWo1aOK8rR7DIKiWSw9DbLWe6x98Jrn8wcTflTVvaXhAMaB5zGAXy0GYQEQp9iO1iSHWVyARQm11zUtyg== @@ -4666,10 +5024,82 @@ ethers@^5.0.1, ethers@^5.0.2, ethers@^5.1.0, ethers@^5.5.2, ethers@^5.5.3, ether "@ethersproject/web" "5.7.1" "@ethersproject/wordlists" "5.7.0" +ethers@^5.5.2: + version "5.6.4" + resolved "https://registry.yarnpkg.com/ethers/-/ethers-5.6.4.tgz#23629e9a7d4bc5802dfb53d4da420d738744b53c" + integrity sha512-62UIfxAQXdf67TeeOaoOoPctm5hUlYgfd0iW3wxfj7qRYKDcvvy0f+sJ3W2/Pyx77R8dblvejA8jokj+lS+ATQ== + dependencies: + "@ethersproject/abi" "5.6.1" + "@ethersproject/abstract-provider" "5.6.0" + "@ethersproject/abstract-signer" "5.6.0" + "@ethersproject/address" "5.6.0" + "@ethersproject/base64" "5.6.0" + "@ethersproject/basex" "5.6.0" + "@ethersproject/bignumber" "5.6.0" + "@ethersproject/bytes" "5.6.1" + "@ethersproject/constants" "5.6.0" + "@ethersproject/contracts" "5.6.0" + "@ethersproject/hash" "5.6.0" + "@ethersproject/hdnode" "5.6.0" + "@ethersproject/json-wallets" "5.6.0" + "@ethersproject/keccak256" "5.6.0" + "@ethersproject/logger" "5.6.0" + "@ethersproject/networks" "5.6.2" + "@ethersproject/pbkdf2" "5.6.0" + "@ethersproject/properties" "5.6.0" + "@ethersproject/providers" "5.6.4" + "@ethersproject/random" "5.6.0" + "@ethersproject/rlp" "5.6.0" + "@ethersproject/sha2" "5.6.0" + "@ethersproject/signing-key" "5.6.0" + "@ethersproject/solidity" "5.6.0" + "@ethersproject/strings" "5.6.0" + "@ethersproject/transactions" "5.6.0" + "@ethersproject/units" "5.6.0" + "@ethersproject/wallet" "5.6.0" + "@ethersproject/web" "5.6.0" + "@ethersproject/wordlists" "5.6.0" + +ethers@^5.6.9: + version "5.7.0" + resolved "https://registry.yarnpkg.com/ethers/-/ethers-5.7.0.tgz#0055da174b9e076b242b8282638bc94e04b39835" + integrity sha512-5Xhzp2ZQRi0Em+0OkOcRHxPzCfoBfgtOQA+RUylSkuHbhTEaQklnYi2hsWbRgs3ztJsXVXd9VKBcO1ScWL8YfA== + dependencies: + "@ethersproject/abi" "5.7.0" + "@ethersproject/abstract-provider" "5.7.0" + "@ethersproject/abstract-signer" "5.7.0" + "@ethersproject/address" "5.7.0" + "@ethersproject/base64" "5.7.0" + "@ethersproject/basex" "5.7.0" + "@ethersproject/bignumber" "5.7.0" + "@ethersproject/bytes" "5.7.0" + "@ethersproject/constants" "5.7.0" + "@ethersproject/contracts" "5.7.0" + "@ethersproject/hash" "5.7.0" + "@ethersproject/hdnode" "5.7.0" + "@ethersproject/json-wallets" "5.7.0" + "@ethersproject/keccak256" "5.7.0" + "@ethersproject/logger" "5.7.0" + "@ethersproject/networks" "5.7.0" + "@ethersproject/pbkdf2" "5.7.0" + "@ethersproject/properties" "5.7.0" + "@ethersproject/providers" "5.7.0" + "@ethersproject/random" "5.7.0" + "@ethersproject/rlp" "5.7.0" + "@ethersproject/sha2" "5.7.0" + "@ethersproject/signing-key" "5.7.0" + "@ethersproject/solidity" "5.7.0" + "@ethersproject/strings" "5.7.0" + "@ethersproject/transactions" "5.7.0" + "@ethersproject/units" "5.7.0" + "@ethersproject/wallet" "5.7.0" + "@ethersproject/web" "5.7.0" + "@ethersproject/wordlists" "5.7.0" + ethjs-unit@0.1.6: version "0.1.6" resolved "https://registry.yarnpkg.com/ethjs-unit/-/ethjs-unit-0.1.6.tgz#c665921e476e87bce2a9d588a6fe0405b2c41699" - integrity sha512-/Sn9Y0oKl0uqQuvgFk/zQgR7aw1g36qX/jzSQ5lSwlO0GigPymk4eGQfeNTD03w1dPOqfz8V77Cy43jH56pagw== + integrity sha1-xmWSHkduh7ziqdWIpv4EBbLEFpk= dependencies: bn.js "4.11.6" number-to-bn "1.7.0" @@ -4682,6 +5112,11 @@ ethjs-util@0.1.6, ethjs-util@^0.1.3, ethjs-util@^0.1.6: is-hex-prefixed "1.0.0" strip-hex-prefix "1.0.0" +event-target-shim@^5.0.0: + version "5.0.1" + resolved "https://registry.yarnpkg.com/event-target-shim/-/event-target-shim-5.0.1.tgz#5d4d3ebdf9583d63a5333ce2deb7480ab2b05789" + integrity sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ== + eventemitter3@4.0.4: version "4.0.4" resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-4.0.4.tgz#b5463ace635a083d018bdc7c917b4c5f10a85384" @@ -4703,7 +5138,7 @@ evp_bytestokey@^1.0.0, evp_bytestokey@^1.0.3: expand-brackets@^2.1.4: version "2.1.4" resolved "https://registry.yarnpkg.com/expand-brackets/-/expand-brackets-2.1.4.tgz#b77735e315ce30f6b6eff0f83b04151a22449622" - integrity sha512-w/ozOKR9Obk3qoWeY/WDi6MFta9AoMR+zud60mdnbniMcBxRuFJyDt2LdX/14A1UABeqk+Uk+LDfUpvoGKppZA== + integrity sha1-t3c14xXOMPa27/D4OwQVGiJEliI= dependencies: debug "^2.3.3" define-property "^0.2.5" @@ -4714,60 +5149,59 @@ expand-brackets@^2.1.4: to-regex "^3.0.1" express@^4.14.0: - version "4.18.2" - resolved "https://registry.yarnpkg.com/express/-/express-4.18.2.tgz#3fabe08296e930c796c19e3c516979386ba9fd59" - integrity sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ== + version "4.17.3" + resolved "https://registry.yarnpkg.com/express/-/express-4.17.3.tgz#f6c7302194a4fb54271b73a1fe7a06478c8f85a1" + integrity sha512-yuSQpz5I+Ch7gFrPCk4/c+dIBKlQUxtgwqzph132bsT6qhuzss6I8cLJQz7B3rFblzd6wtcI0ZbGltH/C4LjUg== dependencies: accepts "~1.3.8" array-flatten "1.1.1" - body-parser "1.20.1" + body-parser "1.19.2" content-disposition "0.5.4" content-type "~1.0.4" - cookie "0.5.0" + cookie "0.4.2" cookie-signature "1.0.6" debug "2.6.9" - depd "2.0.0" + depd "~1.1.2" encodeurl "~1.0.2" escape-html "~1.0.3" etag "~1.8.1" - finalhandler "1.2.0" + finalhandler "~1.1.2" fresh "0.5.2" - http-errors "2.0.0" merge-descriptors "1.0.1" methods "~1.1.2" - on-finished "2.4.1" + on-finished "~2.3.0" parseurl "~1.3.3" path-to-regexp "0.1.7" proxy-addr "~2.0.7" - qs "6.11.0" + qs "6.9.7" range-parser "~1.2.1" safe-buffer "5.2.1" - send "0.18.0" - serve-static "1.15.0" + send "0.17.2" + serve-static "1.14.2" setprototypeof "1.2.0" - statuses "2.0.1" + statuses "~1.5.0" type-is "~1.6.18" utils-merge "1.0.1" vary "~1.1.2" ext@^1.1.2: - version "1.7.0" - resolved "https://registry.yarnpkg.com/ext/-/ext-1.7.0.tgz#0ea4383c0103d60e70be99e9a7f11027a33c4f5f" - integrity sha512-6hxeJYaL110a9b5TEJSj0gojyHQAmA2ch5Os+ySCiA1QGdS697XWY1pzsrSjqA9LDEEgdB/KypIlR59RcLuHYw== + version "1.6.0" + resolved "https://registry.yarnpkg.com/ext/-/ext-1.6.0.tgz#3871d50641e874cc172e2b53f919842d19db4c52" + integrity sha512-sdBImtzkq2HpkdRLtlLWDa6w4DX22ijZLKx8BMPUuKe1c5lbN6xwQDQCxSfxBQnHZ13ls/FH0MQZx/q/gr6FQg== dependencies: - type "^2.7.2" + type "^2.5.0" extend-shallow@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-2.0.1.tgz#51af7d614ad9a9f610ea1bafbb989d6b1c56890f" - integrity sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug== + integrity sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8= dependencies: is-extendable "^0.1.0" extend-shallow@^3.0.0, extend-shallow@^3.0.2: version "3.0.2" resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-3.0.2.tgz#26a71aaf073b39fb2127172746131c2704028db8" - integrity sha512-BwY5b5Ql4+qZoefgMj2NUmx+tehVTH/Kf4k1ZEtOHNFcm2wSxMRo992l6X3TIgni2eZVTZ85xMOjF31fwZAj6Q== + integrity sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg= dependencies: assign-symbols "^1.0.0" is-extendable "^1.0.1" @@ -4777,6 +5211,15 @@ extend@~3.0.2: resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.2.tgz#f8b1136b4071fbd8eb140aff858b1019ec2915fa" integrity sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g== +external-editor@^3.0.3: + version "3.1.0" + resolved "https://registry.yarnpkg.com/external-editor/-/external-editor-3.1.0.tgz#cb03f740befae03ea4d283caed2741a83f335495" + integrity sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew== + dependencies: + chardet "^0.7.0" + iconv-lite "^0.4.24" + tmp "^0.0.33" + extglob@^2.0.4: version "2.0.4" resolved "https://registry.yarnpkg.com/extglob/-/extglob-2.0.4.tgz#ad00fe4dc612a9232e8718711dc5cb5ab0285543" @@ -4805,7 +5248,7 @@ extract-zip@2.0.1: extsprintf@1.3.0: version "1.3.0" resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.3.0.tgz#96918440e3041a7a414f8c52e3c574eb3c3e1e05" - integrity sha512-11Ndz7Nv+mvAC1j0ktTa7fAb0vLyGGX+rMHNBYQviQDGU0Hw7lhctJANqbPhu9nV9/izT/IntTgZ7Im/9LJs9g== + integrity sha1-lpGEQOMEGnpBT4xS48V06zw+HgU= extsprintf@^1.2.0: version "1.4.1" @@ -4815,7 +5258,7 @@ extsprintf@^1.2.0: fake-merkle-patricia-tree@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/fake-merkle-patricia-tree/-/fake-merkle-patricia-tree-1.0.1.tgz#4b8c3acfb520afadf9860b1f14cd8ce3402cddd3" - integrity sha512-Tgq37lkc9pUIgIKw5uitNUKcgcYL3R6JvXtKQbOf/ZSavXbidsksgp/pAY6p//uhw0I4yoMsvTSovvVIsk/qxA== + integrity sha1-S4w6z7Ugr635hgsfFM2M40As3dM= dependencies: checkpoint-store "^1.1.0" @@ -4824,15 +5267,26 @@ fast-deep-equal@^3.1.1, fast-deep-equal@^3.1.3: resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525" integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== -fast-diff@^1.1.2, fast-diff@^1.2.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/fast-diff/-/fast-diff-1.3.0.tgz#ece407fa550a64d638536cd727e129c61616e0f0" - integrity sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw== +fast-diff@^1.1.2: + version "1.2.0" + resolved "https://registry.yarnpkg.com/fast-diff/-/fast-diff-1.2.0.tgz#73ee11982d86caaf7959828d519cfe927fac5f03" + integrity sha512-xJuoT5+L99XlZ8twedaRf6Ax2TgQVxvgZOYoPKqZufmJib0tL2tegPBOZb1pVNgIhlqDlA0eO0c3wBvQcmzx4w== -fast-glob@^3.0.3, fast-glob@^3.2.9: - version "3.3.1" - resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.3.1.tgz#784b4e897340f3dbbef17413b3f11acf03c874c4" - integrity sha512-kNFPyjhh5cKjrUltxs+wFx+ZkbRaxxmZ+X0ZU31SOsxCEtP9VPgtq2teZw1DebupL5GmDaNQ6yKMMVcM41iqDg== +fast-glob@^3.0.3: + version "3.2.7" + resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.2.7.tgz#fd6cb7a2d7e9aa7a7846111e85a196d6b2f766a1" + integrity sha512-rYGMRwip6lUMvYD3BTScMwT1HtAs2d71SMv66Vrxs0IekGZEjhM0pcMfjQPnknBt2zeCwQMEupiN02ZP4DiT1Q== + dependencies: + "@nodelib/fs.stat" "^2.0.2" + "@nodelib/fs.walk" "^1.2.3" + glob-parent "^5.1.2" + merge2 "^1.3.0" + micromatch "^4.0.4" + +fast-glob@^3.2.9: + version "3.2.12" + resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.2.12.tgz#7f39ec99c2e6ab030337142da9e0c18f37afae80" + integrity sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w== dependencies: "@nodelib/fs.stat" "^2.0.2" "@nodelib/fs.walk" "^1.2.3" @@ -4848,12 +5302,12 @@ fast-json-stable-stringify@^2.0.0: fast-levenshtein@^2.0.6, fast-levenshtein@~2.0.6: version "2.0.6" resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917" - integrity sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw== + integrity sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc= fastq@^1.6.0: - version "1.15.0" - resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.15.0.tgz#d04d07c6a2a68fe4599fea8d2e103a937fae6b3a" - integrity sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw== + version "1.13.0" + resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.13.0.tgz#616760f88a7526bdfc596b7cab8c18938c36b98c" + integrity sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw== dependencies: reusify "^1.0.4" @@ -4867,10 +5321,24 @@ fd-slicer@~1.1.0: fetch-ponyfill@^4.0.0: version "4.1.0" resolved "https://registry.yarnpkg.com/fetch-ponyfill/-/fetch-ponyfill-4.1.0.tgz#ae3ce5f732c645eab87e4ae8793414709b239893" - integrity sha512-knK9sGskIg2T7OnYLdZ2hZXn0CtDrAIBxYQLpmEf0BqfdWnwmM1weccUl5+4EdA44tzNSFAuxITPbXtPehUB3g== + integrity sha1-rjzl9zLGReq4fkroeTQUcJsjmJM= dependencies: node-fetch "~1.7.1" +figures@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/figures/-/figures-2.0.0.tgz#3ab1a2d2a62c8bfb431a0c94cb797a2fce27c962" + integrity sha1-OrGi0qYsi/tDGgyUy3l6L84nyWI= + dependencies: + escape-string-regexp "^1.0.5" + +file-entry-cache@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-5.0.1.tgz#ca0f6efa6dd3d561333fb14515065c2fafdf439c" + integrity sha512-bCg29ictuBaKUwwArK4ouCaqDgLZcysCFLmM/Yn/FDoqndh/9vNuQfXRDvTuXKLxfD/JtZQGKFT8MGcJBK644g== + dependencies: + flat-cache "^2.0.1" + file-entry-cache@^6.0.1: version "6.0.1" resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-6.0.1.tgz#211b2dd9659cb0394b073e7323ac3c933d522027" @@ -4886,7 +5354,7 @@ file-url@^3.0.0: fill-range@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-4.0.0.tgz#d544811d428f98eb06a63dc402d2403c328c38f7" - integrity sha512-VcpLTWqWDiTerugjj8e3+esbg+skS3M9e54UuR3iCeIDMXCLTsAH8hTSzDQU/X6/6t3eYkOKoZSef2PlU6U1XQ== + integrity sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc= dependencies: extend-shallow "^2.0.1" is-number "^3.0.0" @@ -4900,23 +5368,23 @@ fill-range@^7.0.1: dependencies: to-regex-range "^5.0.1" -finalhandler@1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-1.2.0.tgz#7d23fe5731b207b4640e4fcd00aec1f9207a7b32" - integrity sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg== +finalhandler@~1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-1.1.2.tgz#b7e7d000ffd11938d0fdb053506f6ebabe9f587d" + integrity sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA== dependencies: debug "2.6.9" encodeurl "~1.0.2" escape-html "~1.0.3" - on-finished "2.4.1" + on-finished "~2.3.0" parseurl "~1.3.3" - statuses "2.0.1" + statuses "~1.5.0" unpipe "~1.0.0" find-replace@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/find-replace/-/find-replace-1.0.3.tgz#b88e7364d2d9c959559f388c66670d6130441fa0" - integrity sha512-KrUnjzDCD9426YnCP56zGYy/eieTnhtK6Vn++j+JJzmlsWWwEkDnsyVF575spT6HJ6Ow9tlbT3TQTDsa+O4UWA== + integrity sha1-uI5zZNLZyVlVnziMZmcNYTBEH6A= dependencies: array-back "^1.0.4" test-value "^2.1.0" @@ -4946,7 +5414,7 @@ find-up@5.0.0, find-up@^5.0.0: find-up@^1.0.0: version "1.1.2" resolved "https://registry.yarnpkg.com/find-up/-/find-up-1.1.2.tgz#6b2e9822b1a2ce0a60ab64d610eccad53cb24d0f" - integrity sha512-jvElSjyuo4EMQGoTwo1uJU5pQMwTW5lS1x05zzfJuTIyLR3zwO27LYrxNg+dlvKpGOuGy/MzBdXh80g0ve5+HA== + integrity sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8= dependencies: path-exists "^2.0.0" pinkie-promise "^2.0.0" @@ -4954,7 +5422,7 @@ find-up@^1.0.0: find-up@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/find-up/-/find-up-2.1.0.tgz#45d1b7e506c717ddd482775a2b77920a3c0c57a7" - integrity sha512-NWzkk0jSJtTt08+FBFMvXoeZnOJD+jTtsRmBYbAIzJdX6l7dLgR7CTubCM5/eDdPUBvLCeVasP1brfVR/9/EZQ== + integrity sha1-RdG35QbHF93UgndaK3eSCjwMV6c= dependencies: locate-path "^2.0.0" @@ -4981,13 +5449,21 @@ find-yarn-workspace-root@^2.0.0: dependencies: micromatch "^4.0.2" +flat-cache@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-2.0.1.tgz#5d296d6f04bda44a4630a301413bdbc2ec085ec0" + integrity sha512-LoQe6yDuUMDzQAEH8sgmh4Md6oZnc/7PjtwjNFSzveXqSHt6ka9fPBuso7IGf9Rz4uqnSnWiFH2B/zj24a5ReA== + dependencies: + flatted "^2.0.0" + rimraf "2.6.3" + write "1.0.3" + flat-cache@^3.0.4: - version "3.1.0" - resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-3.1.0.tgz#0e54ab4a1a60fe87e2946b6b00657f1c99e1af3f" - integrity sha512-OHx4Qwrrt0E4jEIcI5/Xb+f+QmJYNj2rrK8wiIdQOIrB9WrrJL8cjZvXdXuBTkkEwEqLycb5BeZDV1o2i9bTew== + version "3.0.4" + resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-3.0.4.tgz#61b0338302b2fe9f957dcc32fc2a87f1c3048b11" + integrity sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg== dependencies: - flatted "^3.2.7" - keyv "^4.5.3" + flatted "^3.1.0" rimraf "^3.0.2" flat@^4.1.0: @@ -5002,7 +5478,12 @@ flat@^5.0.2: resolved "https://registry.yarnpkg.com/flat/-/flat-5.0.2.tgz#8ca6fe332069ffa9d324c327198c598259ceb241" integrity sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ== -flatted@^3.2.7: +flatted@^2.0.0: + version "2.0.2" + resolved "https://registry.yarnpkg.com/flatted/-/flatted-2.0.2.tgz#4575b21e2bcee7434aa9be662f4b7b5f9c2b5138" + integrity sha512-r5wGx7YeOwNWNlCA0wQ86zKyDLMQr+/RB8xy74M4hTphfmjlijTSSXGuH8rnvKZnfT9i+75zmd8jcKdMR4O6jA== + +flatted@^3.1.0: version "3.2.7" resolved "https://registry.yarnpkg.com/flatted/-/flatted-3.2.7.tgz#609f39207cb614b89d0765b477cb2d437fbf9787" integrity sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ== @@ -5010,19 +5491,24 @@ flatted@^3.2.7: flow-stoplight@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/flow-stoplight/-/flow-stoplight-1.0.0.tgz#4a292c5bcff8b39fa6cc0cb1a853d86f27eeff7b" - integrity sha512-rDjbZUKpN8OYhB0IE/vY/I8UWO/602IIJEU/76Tv4LvYnwHCk0BCsvz4eRr9n+FQcri7L5cyaXOo0+/Kh4HisA== + integrity sha1-SiksW8/4s5+mzAyxqFPYbyfu/3s= fmix@^0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/fmix/-/fmix-0.1.0.tgz#c7bbf124dec42c9d191cfb947d0a9778dd986c0c" - integrity sha512-Y6hyofImk9JdzU8k5INtTXX1cu8LDlePWDFU5sftm9H+zKCr5SGrVjdhkvsim646cw5zD0nADj8oHyXMZmCZ9w== + integrity sha1-x7vxJN7ELJ0ZHPuUfQqXeN2YbAw= dependencies: imul "^1.0.0" -follow-redirects@^1.12.1, follow-redirects@^1.14.0, follow-redirects@^1.14.9: - version "1.15.2" - resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.15.2.tgz#b460864144ba63f2681096f274c4e57026da2c13" - integrity sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA== +follow-redirects@^1.12.1, follow-redirects@^1.14.0: + version "1.14.9" + resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.14.9.tgz#dd4ea157de7bfaf9ea9b3fbd85aa16951f78d8d7" + integrity sha512-MQDfihBQYMcyy5dhRDJUHcw7lb2Pv/TuE6xP1vyraLukNDHKbDxDNaOE3NbCAdKQApno+GPRyo1YAp89yCjK4w== + +follow-redirects@^1.14.9: + version "1.15.1" + resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.15.1.tgz#0ca6a452306c9b276e4d3127483e29575e207ad5" + integrity sha512-yLAMQs+k0b2m7cVxpS1VKJVvoz7SS9Td1zss3XRwXj+ZDH00RJgnuLx7E44wx02kQLrdM3aOOy+FpzS7+8OizA== for-each@^0.3.3, for-each@~0.3.3: version "0.3.3" @@ -5034,17 +5520,17 @@ for-each@^0.3.3, for-each@~0.3.3: for-in@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/for-in/-/for-in-1.0.2.tgz#81068d295a8142ec0ac726c6e2200c30fb6d5e80" - integrity sha512-7EwmXrOjyL+ChxMhmG5lnW9MPt1aIeZEwKhQzoBUdTV0N3zuwWDZYVJatDvZ2OyzPUvdIAZDsCetk3coyMfcnQ== + integrity sha1-gQaNKVqBQuwKxybG4iAMMPttXoA= + +foreach@^2.0.5: + version "2.0.5" + resolved "https://registry.yarnpkg.com/foreach/-/foreach-2.0.5.tgz#0bee005018aeb260d0a3af3ae658dd0136ec1b99" + integrity sha1-C+4AUBiusmDQo6865ljdATbsG5k= forever-agent@~0.6.1: version "0.6.1" resolved "https://registry.yarnpkg.com/forever-agent/-/forever-agent-0.6.1.tgz#fbc71f0c41adeb37f96c577ad1ed42d8fdacca91" - integrity sha512-j0KLYPhm6zeac4lz3oJ3o65qvgQCcPubiyotZrXqEaG4hNagNYO8qdlUrX5vwqv9ohqeT/Z3j6+yW067yWWdUw== - -form-data-encoder@1.7.1: - version "1.7.1" - resolved "https://registry.yarnpkg.com/form-data-encoder/-/form-data-encoder-1.7.1.tgz#ac80660e4f87ee0d3d3c3638b7da8278ddb8ec96" - integrity sha512-EFRDrsMm/kyqbTQocNvRXMLjc7Es2Vk+IQFx/YW7hkUH1eBl4J1fqiP34l74Yt0pFLCNpc06fkbVk00008mzjg== + integrity sha1-+8cfDEGt6zf5bFd60e1C2P2sypE= form-data@^2.2.0: version "2.5.1" @@ -5100,14 +5586,14 @@ fp-ts@^1.0.0: fragment-cache@^0.2.1: version "0.2.1" resolved "https://registry.yarnpkg.com/fragment-cache/-/fragment-cache-0.2.1.tgz#4290fad27f13e89be7f33799c6bc5a0abfff0d19" - integrity sha512-GMBAbW9antB8iZRHLoGw0b3HANt57diZYFO/HL1JGIC1MjKrdmhxvrJbupnVvpys0zsz7yBApXdQyfepKly2kA== + integrity sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk= dependencies: map-cache "^0.2.2" fresh@0.5.2: version "0.5.2" resolved "https://registry.yarnpkg.com/fresh/-/fresh-0.5.2.tgz#3d8cadd90d976569fa835ab1f8e4b23a105605a7" - integrity sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q== + integrity sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac= fs-constants@^1.0.0: version "1.0.0" @@ -5117,7 +5603,7 @@ fs-constants@^1.0.0: fs-extra@^0.30.0: version "0.30.0" resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-0.30.0.tgz#f233ffcc08d4da7d432daa449776989db1df93f0" - integrity sha512-UvSPKyhMn6LEd/WpUaV9C9t3zATuqoqfWc3QdPhPLb58prN9tqYPlPWi8Krxi44loBoUzlobqZ3+8tGpxxSzwA== + integrity sha1-8jP/zAjU2n1DLapEl3aYnbHfk/A= dependencies: graceful-fs "^4.1.2" jsonfile "^2.1.0" @@ -5126,9 +5612,9 @@ fs-extra@^0.30.0: rimraf "^2.2.8" fs-extra@^10.0.0: - version "10.1.0" - resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-10.1.0.tgz#02873cfbc4084dde127eaa5f9905eef2325d1abf" - integrity sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ== + version "10.0.1" + resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-10.0.1.tgz#27de43b4320e833f6867cc044bfce29fdf0ef3b8" + integrity sha512-NbdoVMZso2Lsrn/QwLXOy6rm0ufY2zEOKCDzJR/0kBsb0E6qed0P3iYK+Ath3BfvXEeu4JhEtXLgILx5psUfag== dependencies: graceful-fs "^4.2.0" jsonfile "^6.0.1" @@ -5161,7 +5647,7 @@ fs-extra@^8.1.0: jsonfile "^4.0.0" universalify "^0.1.0" -fs-extra@^9.0.0, fs-extra@^9.1.0: +fs-extra@^9.1.0: version "9.1.0" resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-9.1.0.tgz#5954460c764a8da2094ba3554bf839e6b9a7c86d" integrity sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ== @@ -5186,7 +5672,7 @@ fs-readdir-recursive@^1.1.0: fs.realpath@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" - integrity sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw== + integrity sha1-FQStJSMVjKpA20onh8sBQRmU6k8= fsevents@~2.1.1: version "2.1.3" @@ -5194,34 +5680,19 @@ fsevents@~2.1.1: integrity sha512-Auw9a4AxqWpa9GUfj370BMPzzyncfBABW8Mab7BGWBYDj4Isgq+cDKtx0i6u9jcX9pQDnswsaaOTgTmA5pEjuQ== fsevents@~2.3.2: - version "2.3.3" - resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.3.tgz#cac6407785d03675a2a5e1a5305c697b347d90d6" - integrity sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw== + version "2.3.2" + resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.2.tgz#8a526f78b8fdf4623b709e0b975c52c24c02fd1a" + integrity sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA== function-bind@^1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A== -function.prototype.name@^1.1.5: - version "1.1.6" - resolved "https://registry.yarnpkg.com/function.prototype.name/-/function.prototype.name-1.1.6.tgz#cdf315b7d90ee77a4c6ee216c3c3362da07533fd" - integrity sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg== - dependencies: - call-bind "^1.0.2" - define-properties "^1.2.0" - es-abstract "^1.22.1" - functions-have-names "^1.2.3" - functional-red-black-tree@^1.0.1, functional-red-black-tree@~1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz#1b0ab3bd553b2a0d6399d29c0e3ea0b252078327" - integrity sha512-dsKNQNdj6xA3T+QlADDA7mOSlX0qiMINjn0cgr+eGHGsbSHzTabcIogz2+p/iqP1Xs6EP/sS2SbqH+brGTbq0g== - -functions-have-names@^1.2.3: - version "1.2.3" - resolved "https://registry.yarnpkg.com/functions-have-names/-/functions-have-names-1.2.3.tgz#0404fe4ee2ba2f607f0e0ec3c80bae994133b834" - integrity sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ== + integrity sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc= ganache-core@^2.13.2: version "2.13.2" @@ -5273,28 +5744,32 @@ get-caller-file@^2.0.1, get-caller-file@^2.0.5: get-func-name@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/get-func-name/-/get-func-name-2.0.0.tgz#ead774abee72e20409433a066366023dd6887a41" - integrity sha512-Hm0ixYtaSZ/V7C8FJrtZIuBBI+iSgL+1Aq82zSu8VQNB4S3Gk8e7Qs3VwBDJAhmRZcFqkl3tQu36g/Foh5I5ig== + integrity sha1-6td0q+5y4gQJQzoGY2YCPdaIekE= -get-intrinsic@^1.0.2, get-intrinsic@^1.1.1, get-intrinsic@^1.1.3, get-intrinsic@^1.2.0, get-intrinsic@^1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.2.1.tgz#d295644fed4505fc9cde952c37ee12b477a83d82" - integrity sha512-2DcsyfABl+gVHEfCOaTrWgyt+tb6MSEGmKq+kI5HwLbIYgjgmMcV8KQ41uaKz1xxUcn9tJtgFbQUEVcEbd0FYw== +get-intrinsic@^1.0.2, get-intrinsic@^1.1.0, get-intrinsic@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.1.1.tgz#15f59f376f855c446963948f0d24cd3637b4abc6" + integrity sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q== dependencies: function-bind "^1.1.1" has "^1.0.3" - has-proto "^1.0.1" - has-symbols "^1.0.3" + has-symbols "^1.0.1" get-port@^3.1.0: version "3.2.0" resolved "https://registry.yarnpkg.com/get-port/-/get-port-3.2.0.tgz#dd7ce7de187c06c8bf353796ac71e099f0980ebc" - integrity sha512-x5UJKlgeUiNT8nyo/AcnwLnZuZNcSjSw0kogRB+Whd1fjjFq4B1hySFxSFWWSn4mIBzg3sRNUDFYc4g5gjPoLg== + integrity sha1-3Xzn3hh8Bsi/NTeWrHHgmfCYDrw= get-stdin@^8.0.0: version "8.0.0" resolved "https://registry.yarnpkg.com/get-stdin/-/get-stdin-8.0.0.tgz#cbad6a73feb75f6eeb22ba9e01f89aa28aa97a53" integrity sha512-sY22aA6xchAzprjyqmSEQv4UbAAzRN0L2dQB0NlN5acTTK9Don6nhoc3eAbUnpZiCANAMfd/+40kVdKfFygohg== +get-stream@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-3.0.0.tgz#8e943d1358dc37555054ecbe2edb05aa174ede14" + integrity sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ= + get-stream@^4.1.0: version "4.1.0" resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-4.1.0.tgz#c1b255575f3dc21d59bfc79cd3d2b46b1c3a54b5" @@ -5309,11 +5784,6 @@ get-stream@^5.1.0: dependencies: pump "^3.0.0" -get-stream@^6.0.1: - version "6.0.1" - resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-6.0.1.tgz#a262d8eef67aced57c2852ad6167526a43cbf7b7" - integrity sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg== - get-symbol-description@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/get-symbol-description/-/get-symbol-description-1.0.0.tgz#7fdb81c900101fbd564dd5f1a30af5aadc1e58d6" @@ -5325,12 +5795,12 @@ get-symbol-description@^1.0.0: get-value@^2.0.3, get-value@^2.0.6: version "2.0.6" resolved "https://registry.yarnpkg.com/get-value/-/get-value-2.0.6.tgz#dc15ca1c672387ca76bd37ac0a395ba2042a2c28" - integrity sha512-Ln0UQDlxH1BapMu3GPtf7CuYNwRZf2gwCuPqbyG6pB8WfmFpzqcy4xtAaAMUhnNqjMKTiCPZG2oMT3YSx8U2NA== + integrity sha1-3BXKHGcjh8p2vTesCjlbogQqLCg= getpass@^0.1.1: version "0.1.7" resolved "https://registry.yarnpkg.com/getpass/-/getpass-0.1.7.tgz#5eff8e3e684d569ae4cb2b1282604e8ba62149fa" - integrity sha512-0fzj9JxOLfJ+XGLhR8ze3unN0KZCgZwiSSDz168VERjK8Wl8kVSdcu2kspd4s4wtAa1y/qrVRiAA0WclVsu0ng== + integrity sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo= dependencies: assert-plus "^1.0.0" @@ -5349,7 +5819,7 @@ glob-parent@^5.1.2, glob-parent@~5.1.0, glob-parent@~5.1.2: dependencies: is-glob "^4.0.1" -glob-parent@^6.0.2: +glob-parent@^6.0.1: version "6.0.2" resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-6.0.2.tgz#6d237d99083950c79290f24c7642a3de9a28f9e3" integrity sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A== @@ -5380,7 +5850,7 @@ glob@7.1.7: once "^1.3.0" path-is-absolute "^1.0.0" -glob@7.2.0: +glob@7.2.0, glob@^7.0.0, glob@^7.1.2, glob@^7.1.3, glob@~7.2.0: version "7.2.0" resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.0.tgz#d15535af7732e02e948f4c41628bd910293f6023" integrity sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q== @@ -5395,7 +5865,7 @@ glob@7.2.0: glob@^5.0.15: version "5.0.15" resolved "https://registry.yarnpkg.com/glob/-/glob-5.0.15.tgz#1bc936b9e02f4a603fcc222ecf7633d30b8b93b1" - integrity sha512-c9IPMazfRITpmAAKi22dK1VKxGDX9ehhqfABDriL/lzO92xcUKEJPQHrVA/2YHSNFB4iFlykVmWvwo48nr3OxA== + integrity sha1-G8k2ueAvSmA/zCIuz3Yz0wuLk7E= dependencies: inflight "^1.0.4" inherits "2" @@ -5403,7 +5873,7 @@ glob@^5.0.15: once "^1.3.0" path-is-absolute "^1.0.0" -glob@^7.0.0, glob@^7.1.1, glob@^7.1.2, glob@^7.1.3, glob@~7.2.3: +glob@^7.1.1: version "7.2.3" resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.3.tgz#b8df0fb802bbfa8e89bd1d938b4e16578ed44f2b" integrity sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q== @@ -5415,10 +5885,10 @@ glob@^7.0.0, glob@^7.1.1, glob@^7.1.2, glob@^7.1.3, glob@~7.2.3: once "^1.3.0" path-is-absolute "^1.0.0" -glob@^8.0.1, glob@^8.0.3: - version "8.1.0" - resolved "https://registry.yarnpkg.com/glob/-/glob-8.1.0.tgz#d388f656593ef708ee3e34640fdfb99a9fd1c33e" - integrity sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ== +glob@^8.0.1: + version "8.0.3" + resolved "https://registry.yarnpkg.com/glob/-/glob-8.0.3.tgz#415c6eb2deed9e502c68fa44a272e6da6eeca42e" + integrity sha512-ull455NHSHI/Y1FqGaaYFaLGkNMMJbavMrEGFXG/PGrg6y7sutWHUHrz6gy6WEBH6akM1M414dWKCNs+IhKdiQ== dependencies: fs.realpath "^1.0.0" inflight "^1.0.4" @@ -5450,10 +5920,15 @@ global@~4.4.0: min-document "^2.19.0" process "^0.11.10" -globals@^13.19.0: - version "13.21.0" - resolved "https://registry.yarnpkg.com/globals/-/globals-13.21.0.tgz#163aae12f34ef502f5153cfbdd3600f36c63c571" - integrity sha512-ybyme3s4yy/t/3s35bewwXKOf7cvzfreG2lH0lZl0JB7I4GxRP2ghxOK/Nb9EkRXdbBXZLfq/p/0W2JUONB/Gg== +globals@^11.7.0: + version "11.12.0" + resolved "https://registry.yarnpkg.com/globals/-/globals-11.12.0.tgz#ab8795338868a0babd8525758018c2a7eb95c42e" + integrity sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA== + +globals@^13.15.0: + version "13.17.0" + resolved "https://registry.yarnpkg.com/globals/-/globals-13.17.0.tgz#902eb1e680a41da93945adbdcb5a9f361ba69bd4" + integrity sha512-1C+6nQRb1GwGMKm2dH/E7enFAMxGTmGI7/dEdhy/DNelv85w9B72t3uc5frtMNXIbzrarJJ/lTCjcaZwbLJmyw== dependencies: type-fest "^0.20.2" @@ -5462,13 +5937,6 @@ globals@^9.18.0: resolved "https://registry.yarnpkg.com/globals/-/globals-9.18.0.tgz#aa3896b3e69b487f17e31ed2143d69a8e30c2d8a" integrity sha512-S0nG3CLEQiY/ILxqtztTWH/3iRRdyBLw6KMDxnKMchrtbj2OFmehVh0WUCfW3DUrIgx/qFrJPICrq4Z4sTR9UQ== -globalthis@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/globalthis/-/globalthis-1.0.3.tgz#5852882a52b80dc301b0660273e1ed082f0b6ccf" - integrity sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA== - dependencies: - define-properties "^1.1.3" - globby@^10.0.1: version "10.0.2" resolved "https://registry.yarnpkg.com/globby/-/globby-10.0.2.tgz#277593e745acaa4646c3ab411289ec47a0392543" @@ -5495,32 +5963,6 @@ globby@^11.1.0: merge2 "^1.4.1" slash "^3.0.0" -gopd@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/gopd/-/gopd-1.0.1.tgz#29ff76de69dac7489b7c0918a5788e56477c332c" - integrity sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA== - dependencies: - get-intrinsic "^1.1.3" - -got@12.1.0: - version "12.1.0" - resolved "https://registry.yarnpkg.com/got/-/got-12.1.0.tgz#099f3815305c682be4fd6b0ee0726d8e4c6b0af4" - integrity sha512-hBv2ty9QN2RdbJJMK3hesmSkFTjVIHyIDDbssCKnSmq62edGgImJWD10Eb1k77TiV1bxloxqcFAVK8+9pkhOig== - dependencies: - "@sindresorhus/is" "^4.6.0" - "@szmarczak/http-timer" "^5.0.1" - "@types/cacheable-request" "^6.0.2" - "@types/responselike" "^1.0.0" - cacheable-lookup "^6.0.4" - cacheable-request "^7.0.2" - decompress-response "^6.0.0" - form-data-encoder "1.7.1" - get-stream "^6.0.1" - http2-wrapper "^2.1.10" - lowercase-keys "^3.0.0" - p-cancelable "^3.0.0" - responselike "^2.0.0" - got@9.6.0: version "9.6.0" resolved "https://registry.yarnpkg.com/got/-/got-9.6.0.tgz#edf45e7d67f99545705de1f7bbeeeb121765ed85" @@ -5538,32 +5980,35 @@ got@9.6.0: to-readable-stream "^1.0.0" url-parse-lax "^3.0.0" -got@^11.8.5: - version "11.8.6" - resolved "https://registry.yarnpkg.com/got/-/got-11.8.6.tgz#276e827ead8772eddbcfc97170590b841823233a" - integrity sha512-6tfZ91bOr7bOXnK7PRDCGBLa1H4U080YHNaAQ2KsMGlLEzRbk44nsZF2E1IeRc3vtJHPVbKCYgdFbaGO2ljd8g== - dependencies: - "@sindresorhus/is" "^4.0.0" - "@szmarczak/http-timer" "^4.0.5" - "@types/cacheable-request" "^6.0.1" - "@types/responselike" "^1.0.0" - cacheable-lookup "^5.0.3" - cacheable-request "^7.0.2" - decompress-response "^6.0.0" - http2-wrapper "^1.0.0-beta.5.2" - lowercase-keys "^2.0.0" - p-cancelable "^2.0.0" - responselike "^2.0.0" +got@^7.1.0: + version "7.1.0" + resolved "https://registry.yarnpkg.com/got/-/got-7.1.0.tgz#05450fd84094e6bbea56f451a43a9c289166385a" + integrity sha512-Y5WMo7xKKq1muPsxD+KmrR8DH5auG7fBdDVueZwETwV6VytKyU9OX/ddpq2/1hp1vIPvVb4T81dKQz3BivkNLw== + dependencies: + decompress-response "^3.2.0" + duplexer3 "^0.1.4" + get-stream "^3.0.0" + is-plain-obj "^1.1.0" + is-retry-allowed "^1.0.0" + is-stream "^1.0.0" + isurl "^1.0.0-alpha5" + lowercase-keys "^1.0.0" + p-cancelable "^0.3.0" + p-timeout "^1.1.1" + safe-buffer "^5.0.1" + timed-out "^4.0.0" + url-parse-lax "^1.0.0" + url-to-options "^1.0.1" graceful-fs@^4.1.11, graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.1.9, graceful-fs@^4.2.0: - version "4.2.11" - resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.11.tgz#4183e4e8bf08bb6e05bbb2f7d2e0c8f712ca40e3" - integrity sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ== + version "4.2.10" + resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.10.tgz#147d3a006da4ca3ce14728c7aefc287c367d7a6c" + integrity sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA== -graphemer@^1.4.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/graphemer/-/graphemer-1.4.0.tgz#fb2f1d55e0e3a1849aeffc90c4fa0dd53a0e66c6" - integrity sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag== +grapheme-splitter@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/grapheme-splitter/-/grapheme-splitter-1.0.4.tgz#9cf3a665c6247479896834af35cf1dbb4400767e" + integrity sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ== growl@1.10.5: version "1.10.5" @@ -5571,12 +6016,12 @@ growl@1.10.5: integrity sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA== handlebars@^4.0.1: - version "4.7.8" - resolved "https://registry.yarnpkg.com/handlebars/-/handlebars-4.7.8.tgz#41c42c18b1be2365439188c77c6afae71c0cd9e9" - integrity sha512-vafaFqs8MZkRrSX7sFVUdo3ap/eNiLnb4IakshzvP56X5Nr1iGKAIqdX6tMlm6HcNRIkr6AxO5jFEoJzzpT8aQ== + version "4.7.7" + resolved "https://registry.yarnpkg.com/handlebars/-/handlebars-4.7.7.tgz#9ce33416aad02dbd6c8fafa8240d5d98004945a1" + integrity sha512-aAcXm5OAfE/8IXkcZvCepKU3VzW1/39Fb5ZuqMtgI/hT8X2YgoMvBY5dLhq/cpOvw7Lk1nK/UF71aLG/ZnVYRA== dependencies: minimist "^1.2.5" - neo-async "^2.6.2" + neo-async "^2.6.0" source-map "^0.6.1" wordwrap "^1.0.0" optionalDependencies: @@ -5585,7 +6030,7 @@ handlebars@^4.0.1: har-schema@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/har-schema/-/har-schema-2.0.0.tgz#a94c2224ebcac04782a0d9035521f24735b7ec92" - integrity sha512-Oqluz6zhGX8cyRaTQlFMPw80bSJVG2x/cFb8ZPhUILGgHka9SsokCCOQgpveePerqidZOrT14ipqfJb7ILcW5Q== + integrity sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI= har-validator@~5.1.3: version "5.1.5" @@ -5596,65 +6041,59 @@ har-validator@~5.1.3: har-schema "^2.0.0" hardhat-deploy@^0.11.4: - version "0.11.37" - resolved "https://registry.yarnpkg.com/hardhat-deploy/-/hardhat-deploy-0.11.37.tgz#6a771b859c82ae25292321a6d510d7c0eda09d2b" - integrity sha512-pohPSEEo/X9Yfv0Fc0kXBQW6JO0LNOILBGCP69Ci1COJvLht1hLjAtXt/hccyvD9qY/uwJAM75fmsf41Y9N7lg== - dependencies: - "@ethersproject/abi" "^5.7.0" - "@ethersproject/abstract-signer" "^5.7.0" - "@ethersproject/address" "^5.7.0" - "@ethersproject/bignumber" "^5.7.0" - "@ethersproject/bytes" "^5.7.0" - "@ethersproject/constants" "^5.7.0" - "@ethersproject/contracts" "^5.7.0" - "@ethersproject/providers" "^5.7.2" - "@ethersproject/solidity" "^5.7.0" - "@ethersproject/transactions" "^5.7.0" - "@ethersproject/wallet" "^5.7.0" + version "0.11.4" + resolved "https://registry.yarnpkg.com/hardhat-deploy/-/hardhat-deploy-0.11.4.tgz#39b06d3b0ad25195071cc1f2f71649b1f9f030d0" + integrity sha512-BNMwWqaxrwb8XKrYzmCwnUzOSKzicUBk+fwd28doUNoAGFFh8kpoypkcHMzKDVdLhnamAardcfqJet73zrZoTA== + dependencies: + "@ethersproject/abi" "^5.4.0" + "@ethersproject/abstract-signer" "^5.4.1" + "@ethersproject/address" "^5.4.0" + "@ethersproject/bignumber" "^5.4.1" + "@ethersproject/bytes" "^5.4.0" + "@ethersproject/constants" "^5.4.0" + "@ethersproject/contracts" "^5.4.1" + "@ethersproject/providers" "^5.4.4" + "@ethersproject/solidity" "^5.4.0" + "@ethersproject/transactions" "^5.4.0" + "@ethersproject/wallet" "^5.4.0" "@types/qs" "^6.9.7" axios "^0.21.1" chalk "^4.1.2" chokidar "^3.5.2" debug "^4.3.2" enquirer "^2.3.6" - ethers "^5.5.3" form-data "^4.0.0" fs-extra "^10.0.0" match-all "^1.2.6" murmur-128 "^0.2.1" qs "^6.9.4" - zksync-web3 "^0.14.3" hardhat-gas-reporter@^1.0.8: - version "1.0.9" - resolved "https://registry.yarnpkg.com/hardhat-gas-reporter/-/hardhat-gas-reporter-1.0.9.tgz#9a2afb354bc3b6346aab55b1c02ca556d0e16450" - integrity sha512-INN26G3EW43adGKBNzYWOlI3+rlLnasXTwW79YNnUhXPDa+yHESgt639dJEs37gCjhkbNKcRRJnomXEuMFBXJg== + version "1.0.8" + resolved "https://registry.yarnpkg.com/hardhat-gas-reporter/-/hardhat-gas-reporter-1.0.8.tgz#93ce271358cd748d9c4185dbb9d1d5525ec145e0" + integrity sha512-1G5thPnnhcwLHsFnl759f2tgElvuwdkzxlI65fC9PwxYMEe9cmjkVAAWTf3/3y8uP6ZSPiUiOW8PgZnykmZe0g== dependencies: array-uniq "1.0.3" - eth-gas-reporter "^0.2.25" + eth-gas-reporter "^0.2.24" sha1 "^1.1.1" hardhat@^2.6.6: - version "2.17.3" - resolved "https://registry.yarnpkg.com/hardhat/-/hardhat-2.17.3.tgz#4cb15f2afdea5f108970ed72e5b81e6e53052cfb" - integrity sha512-SFZoYVXW1bWJZrIIKXOA+IgcctfuKXDwENywiYNT2dM3YQc4fXNaTbuk/vpPzHIF50upByx4zW5EqczKYQubsA== - dependencies: + version "2.9.3" + resolved "https://registry.yarnpkg.com/hardhat/-/hardhat-2.9.3.tgz#4759dc3c468c7d15f34334ca1be7d59b04e47b1e" + integrity sha512-7Vw99RbYbMZ15UzegOR/nqIYIqddZXvLwJGaX5sX4G5bydILnbjmDU6g3jMKJSiArEixS3vHAEaOs5CW1JQ3hg== + dependencies: + "@ethereumjs/block" "^3.6.0" + "@ethereumjs/blockchain" "^5.5.0" + "@ethereumjs/common" "^2.6.0" + "@ethereumjs/tx" "^3.4.0" + "@ethereumjs/vm" "^5.6.0" "@ethersproject/abi" "^5.1.2" "@metamask/eth-sig-util" "^4.0.0" - "@nomicfoundation/ethereumjs-block" "5.0.2" - "@nomicfoundation/ethereumjs-blockchain" "7.0.2" - "@nomicfoundation/ethereumjs-common" "4.0.2" - "@nomicfoundation/ethereumjs-evm" "2.0.2" - "@nomicfoundation/ethereumjs-rlp" "5.0.2" - "@nomicfoundation/ethereumjs-statemanager" "2.0.2" - "@nomicfoundation/ethereumjs-trie" "6.0.2" - "@nomicfoundation/ethereumjs-tx" "5.0.2" - "@nomicfoundation/ethereumjs-util" "9.0.2" - "@nomicfoundation/ethereumjs-vm" "7.0.2" - "@nomicfoundation/solidity-analyzer" "^0.1.0" "@sentry/node" "^5.18.1" + "@solidity-parser/parser" "^0.14.1" "@types/bn.js" "^5.1.0" "@types/lru-cache" "^5.1.0" + abort-controller "^3.0.0" adm-zip "^0.4.16" aggregate-error "^3.0.0" ansi-escapes "^4.3.0" @@ -5664,51 +6103,55 @@ hardhat@^2.6.6: debug "^4.1.1" enquirer "^2.3.0" env-paths "^2.2.0" - ethereum-cryptography "^1.0.3" + ethereum-cryptography "^0.1.2" ethereumjs-abi "^0.6.8" + ethereumjs-util "^7.1.3" find-up "^2.1.0" fp-ts "1.19.3" fs-extra "^7.0.1" - glob "7.2.0" + glob "^7.1.3" immutable "^4.0.0-rc.12" io-ts "1.10.4" - keccak "^3.0.2" lodash "^4.17.11" + merkle-patricia-tree "^4.2.2" mnemonist "^0.38.0" - mocha "^10.0.0" + mocha "^9.2.0" p-map "^4.0.0" + qs "^6.7.0" raw-body "^2.4.1" resolve "1.17.0" semver "^6.3.0" + slash "^3.0.0" solc "0.7.3" source-map-support "^0.5.13" stacktrace-parser "^0.1.10" + "true-case-path" "^2.2.1" tsort "0.0.1" - undici "^5.14.0" + undici "^4.14.1" uuid "^8.3.2" ws "^7.4.6" has-ansi@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/has-ansi/-/has-ansi-2.0.0.tgz#34f5049ce1ecdf2b0649af3ef24e45ed35416d91" - integrity sha512-C8vBJ8DwUCx19vhm7urhTuUsr4/IyP6l4VzNQDv+ryHQObW3TTTp9yB68WpYgRe2bbaGuZ/se74IqFeVnMnLZg== + integrity sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE= dependencies: ansi-regex "^2.0.0" -has-bigints@^1.0.1, has-bigints@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/has-bigints/-/has-bigints-1.0.2.tgz#0871bd3e3d51626f6ca0966668ba35d5602d6eaa" - integrity sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ== +has-bigints@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/has-bigints/-/has-bigints-1.0.1.tgz#64fe6acb020673e3b78db035a5af69aa9d07b113" + integrity sha512-LSBS2LjbNBTf6287JEbEzvJgftkF5qFkmCo9hDRpAzKhUOlJ+hx8dd4USs00SgsUNwc4617J9ki5YtEClM2ffA== has-flag@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-1.0.0.tgz#9d9e793165ce017a00f00418c43f942a7b1d11fa" - integrity sha512-DyYHfIYwAJmjAjSSPKANxI8bFY9YtFrgkAfinBojQ8YJTOuOuav64tMUJv584SES4xl74PmuaevIyaLESHdTAA== + integrity sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo= has-flag@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" - integrity sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw== + integrity sha1-tdRU3CGZriJWmfNGfloH87lVuv0= has-flag@^4.0.0: version "4.0.0" @@ -5722,16 +6165,23 @@ has-property-descriptors@^1.0.0: dependencies: get-intrinsic "^1.1.1" -has-proto@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/has-proto/-/has-proto-1.0.1.tgz#1885c1305538958aff469fef37937c22795408e0" - integrity sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg== +has-symbol-support-x@^1.4.1: + version "1.4.2" + resolved "https://registry.yarnpkg.com/has-symbol-support-x/-/has-symbol-support-x-1.4.2.tgz#1409f98bc00247da45da67cee0a36f282ff26455" + integrity sha512-3ToOva++HaW+eCpgqZrCfN51IPB+7bJNVT6CUATzueB5Heb8o6Nam0V3HG5dlDvZU1Gn5QLcbahiKw/XVk5JJw== -has-symbols@^1.0.0, has-symbols@^1.0.2, has-symbols@^1.0.3: +has-symbols@^1.0.0, has-symbols@^1.0.1, has-symbols@^1.0.2, has-symbols@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.3.tgz#bb7b2c4349251dce87b125f7bdf874aa7c8b39f8" integrity sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A== +has-to-string-tag-x@^1.2.0: + version "1.4.1" + resolved "https://registry.yarnpkg.com/has-to-string-tag-x/-/has-to-string-tag-x-1.4.1.tgz#a045ab383d7b4b2012a00148ab0aa5f290044d4d" + integrity sha512-vdbKfmw+3LoOYVr+mtxHaX5a96+0f3DljYd8JOqvOLsf5mw2Otda2qCDT9qRqLAhrjyQ0h7ual5nOiASpsGNFw== + dependencies: + has-symbol-support-x "^1.4.1" + has-tostringtag@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/has-tostringtag/-/has-tostringtag-1.0.0.tgz#7e133818a7d394734f941e73c3d3f9291e658b25" @@ -5742,7 +6192,7 @@ has-tostringtag@^1.0.0: has-value@^0.3.1: version "0.3.1" resolved "https://registry.yarnpkg.com/has-value/-/has-value-0.3.1.tgz#7b1f58bada62ca827ec0a2078025654845995e1f" - integrity sha512-gpG936j8/MzaeID5Yif+577c17TxaDmhuyVgSwtnL/q8UUTySg8Mecb+8Cf1otgLoD7DDH75axp86ER7LFsf3Q== + integrity sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8= dependencies: get-value "^2.0.3" has-values "^0.1.4" @@ -5751,7 +6201,7 @@ has-value@^0.3.1: has-value@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/has-value/-/has-value-1.0.0.tgz#18b281da585b1c5c51def24c930ed29a0be6b177" - integrity sha512-IBXk4GTsLYdQ7Rvt+GRBrFSVEkmuOUy4re0Xjd9kJSUQpnTrWR4/y9RpfexN9vkAPMFuQoeWKwqzPozRTlasGw== + integrity sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc= dependencies: get-value "^2.0.6" has-values "^1.0.0" @@ -5760,12 +6210,12 @@ has-value@^1.0.0: has-values@^0.1.4: version "0.1.4" resolved "https://registry.yarnpkg.com/has-values/-/has-values-0.1.4.tgz#6d61de95d91dfca9b9a02089ad384bff8f62b771" - integrity sha512-J8S0cEdWuQbqD9//tlZxiMuMNmxB8PlEwvYwuxsTmR1G5RXUePEX/SJn7aD0GMLieuZYSwNH0cQuJGwnYunXRQ== + integrity sha1-bWHeldkd/Km5oCCJrThL/49it3E= has-values@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/has-values/-/has-values-1.0.0.tgz#95b0b63fec2146619a6fe57fe75628d5a39efe4f" - integrity sha512-ODYZC64uqzmtfGMEAX/FvZiRyWLpAC3vYnNunURUnkGVTS+mI0smVsWaPydRBsE3g+ok7h960jChO8mFcWlHaQ== + integrity sha1-lbC2P+whRmGab+V/51Yo1aOe/k8= dependencies: is-number "^3.0.0" kind-of "^4.0.0" @@ -5810,12 +6260,12 @@ he@1.2.0: heap@0.2.6: version "0.2.6" resolved "https://registry.yarnpkg.com/heap/-/heap-0.2.6.tgz#087e1f10b046932fc8594dd9e6d378afc9d1e5ac" - integrity sha512-MzzWcnfB1e4EG2vHi3dXHoBupmuXNZzx6pY6HldVS55JKKBoq3xOyzfSaZRkJp37HIhEYC78knabHff3zc4dQQ== + integrity sha1-CH4fELBGky/IWU3Z5tN4r8nR5aw= hmac-drbg@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/hmac-drbg/-/hmac-drbg-1.0.1.tgz#d2745701025a6c775a6c545793ed502fc0c649a1" - integrity sha512-Tti3gMqLdZfhOQY1Mzf/AanLiqh1WTiJgEj26ZuYQ9fbkLomzGchCws4FyrSd4VkpBfiNhaE1On+lOz894jvXg== + integrity sha1-0nRXAQJabHdabFRXk+1QL8DGSaE= dependencies: hash.js "^1.0.3" minimalistic-assert "^1.0.0" @@ -5824,7 +6274,7 @@ hmac-drbg@^1.0.1: home-or-tmp@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/home-or-tmp/-/home-or-tmp-2.0.0.tgz#e36c3f2d2cae7d746a857e38d18d5f32a7882db8" - integrity sha512-ycURW7oUxE2sNiPVw1HVEFsW+ecOpJ5zaj7eC0RlwhibhRBod20muUN8qu/gzx956YrLolVvs1MTXwKgC2rVEg== + integrity sha1-42w/LSyufXRqhX440Y1fMqeILbg= dependencies: os-homedir "^1.0.0" os-tmpdir "^1.0.1" @@ -5835,14 +6285,14 @@ hosted-git-info@^2.1.4, hosted-git-info@^2.6.0: integrity sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw== htmlparser2@^8.0.1: - version "8.0.2" - resolved "https://registry.yarnpkg.com/htmlparser2/-/htmlparser2-8.0.2.tgz#f002151705b383e62433b5cf466f5b716edaec21" - integrity sha512-GYdjWKDkbRLkZ5geuHs5NY1puJ+PXwP7+fHPRz06Eirsb9ugf6d8kkXav6ADhcODhFFPMIXyxkxSuMf3D6NCFA== + version "8.0.1" + resolved "https://registry.yarnpkg.com/htmlparser2/-/htmlparser2-8.0.1.tgz#abaa985474fcefe269bc761a779b544d7196d010" + integrity sha512-4lVbmc1diZC7GUJQtRQ5yBAeUCL1exyMwmForWkRLnwyzWBFxN633SALPMGYaWZvKe9j1pRZJpauvmxENSp/EA== dependencies: domelementtype "^2.3.0" - domhandler "^5.0.3" + domhandler "^5.0.2" domutils "^3.0.1" - entities "^4.4.0" + entities "^4.3.0" http-basic@^8.1.1: version "8.1.3" @@ -5859,6 +6309,17 @@ http-cache-semantics@^4.0.0: resolved "https://registry.yarnpkg.com/http-cache-semantics/-/http-cache-semantics-4.1.1.tgz#abe02fcb2985460bf0323be664436ec3476a6d5a" integrity sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ== +http-errors@1.8.1: + version "1.8.1" + resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.8.1.tgz#7c3f28577cbc8a207388455dbd62295ed07bd68c" + integrity sha512-Kpk9Sm7NmI+RHhnj6OIWDI1d6fIoFAtFt9RLaTMRlg/8w49juAStsrBgp0Dp4OdxdVbRIeKhtCUvoi/RuAhO4g== + dependencies: + depd "~1.1.2" + inherits "2.0.4" + setprototypeof "1.2.0" + statuses ">= 1.5.0 < 2" + toidentifier "1.0.1" + http-errors@2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-2.0.0.tgz#b7774a1486ef73cf7667ac9ae0858c012c57b9d3" @@ -5873,7 +6334,7 @@ http-errors@2.0.0: http-https@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/http-https/-/http-https-1.0.0.tgz#2f908dd5f1db4068c058cd6e6d4ce392c913389b" - integrity sha512-o0PWwVCSp3O0wS6FvNr6xfBCHgt0m1tvPLFOCc2iFDKTRAXhB7m8klDf7ErowFH8POa6dVdGatKU5I1YYwzUyg== + integrity sha1-L5CN1fHbQGjAWM1ubUzjkskTOJs= http-response-object@^3.0.1: version "3.0.2" @@ -5885,29 +6346,13 @@ http-response-object@^3.0.1: http-signature@~1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/http-signature/-/http-signature-1.2.0.tgz#9aecd925114772f3d95b65a60abb8f7c18fbace1" - integrity sha512-CAbnr6Rz4CYQkLYUtSNXxQPUH2gK8f3iWexVlsnMeD+GjlsQ0Xsy1cOX+mN3dtxYomRy21CiOzU8Uhw6OwncEQ== + integrity sha1-muzZJRFHcvPZW2WmCruPfBj7rOE= dependencies: assert-plus "^1.0.0" jsprim "^1.2.2" sshpk "^1.7.0" -http2-wrapper@^1.0.0-beta.5.2: - version "1.0.3" - resolved "https://registry.yarnpkg.com/http2-wrapper/-/http2-wrapper-1.0.3.tgz#b8f55e0c1f25d4ebd08b3b0c2c079f9590800b3d" - integrity sha512-V+23sDMr12Wnz7iTcDeJr3O6AIxlnvT/bmaAAAP/Xda35C90p9599p0F1eHR/N1KILWSoWVAiOMFjBBXaXSMxg== - dependencies: - quick-lru "^5.1.1" - resolve-alpn "^1.0.0" - -http2-wrapper@^2.1.10: - version "2.2.0" - resolved "https://registry.yarnpkg.com/http2-wrapper/-/http2-wrapper-2.2.0.tgz#b80ad199d216b7d3680195077bd7b9060fa9d7f3" - integrity sha512-kZB0wxMo0sh1PehyjJUWRFEd99KC5TLjZ2cULC4f9iqJBAmKQQXEICjxl5iPJRwP40dpeHFqqhm7tYCvODpqpQ== - dependencies: - quick-lru "^5.1.1" - resolve-alpn "^1.2.0" - -https-proxy-agent@5.0.1, https-proxy-agent@^5.0.0: +https-proxy-agent@5.0.1: version "5.0.1" resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz#c59ef224a04fe8b754f3db0063a25ea30d0005d6" integrity sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA== @@ -5915,7 +6360,15 @@ https-proxy-agent@5.0.1, https-proxy-agent@^5.0.0: agent-base "6" debug "4" -iconv-lite@0.4.24: +https-proxy-agent@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-5.0.0.tgz#e2a90542abb68a762e0a0850f6c9edadfd8506b2" + integrity sha512-EkYm5BcKUGiduxzSt3Eppko+PiNWNEpa4ySk9vTC6wDsQJW9rHSa+UhGNJoRYp7bz6Ht1eaRIa6QaJqO5rCFbA== + dependencies: + agent-base "6" + debug "4" + +iconv-lite@0.4.24, iconv-lite@^0.4.24: version "0.4.24" resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA== @@ -5936,15 +6389,20 @@ idna-uts46-hx@^2.3.1: dependencies: punycode "2.1.0" -ieee754@^1.1.13, ieee754@^1.2.1: +ieee754@^1.1.13: version "1.2.1" resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.2.1.tgz#8eb7a10a63fff25d15a57b001586d177d1b0d352" integrity sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA== -ignore@^5.1.1, ignore@^5.2.0, ignore@^5.2.4: - version "5.2.4" - resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.2.4.tgz#a291c0c6178ff1b960befe47fcdec301674a6324" - integrity sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ== +ignore@^4.0.6: + version "4.0.6" + resolved "https://registry.yarnpkg.com/ignore/-/ignore-4.0.6.tgz#750e3db5862087b4737ebac8207ffd1ef27b25fc" + integrity sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg== + +ignore@^5.1.1, ignore@^5.2.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.2.0.tgz#6d3bac8fa7fe0d45d9f9be7bac2fc279577e345a" + integrity sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ== immediate@^3.2.3: version "3.3.0" @@ -5954,14 +6412,22 @@ immediate@^3.2.3: immediate@~3.2.3: version "3.2.3" resolved "https://registry.yarnpkg.com/immediate/-/immediate-3.2.3.tgz#d140fa8f614659bd6541233097ddaac25cdd991c" - integrity sha512-RrGCXRm/fRVqMIhqXrGEX9rRADavPiDFSoMb/k64i9XMk8uH4r/Omi5Ctierj6XzNecwDbO4WuFbDD1zmpl3Tg== + integrity sha1-0UD6j2FGWb1lQSMwl92qwlzdmRw= immutable@^4.0.0-rc.12: - version "4.3.4" - resolved "https://registry.yarnpkg.com/immutable/-/immutable-4.3.4.tgz#2e07b33837b4bb7662f288c244d1ced1ef65a78f" - integrity sha512-fsXeu4J4i6WNWSikpI88v/PcVflZz+6kMhUfIwc5SY+poQRPnaf5V7qds6SUyUN3cVxEzuCab7QIoLOQ+DQ1wA== + version "4.0.0" + resolved "https://registry.yarnpkg.com/immutable/-/immutable-4.0.0.tgz#b86f78de6adef3608395efb269a91462797e2c23" + integrity sha512-zIE9hX70qew5qTUjSS7wi1iwj/l7+m54KWU247nhM3v806UdGj1yDndXj+IOYxxtW9zyLI+xqFNZjTuDaLUqFw== + +import-fresh@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-2.0.0.tgz#d81355c15612d386c61f9ddd3922d4304822a546" + integrity sha1-2BNVwVYS04bGH53dOSLUMEgipUY= + dependencies: + caller-path "^2.0.0" + resolve-from "^3.0.0" -import-fresh@^3.2.1, import-fresh@^3.3.0: +import-fresh@^3.0.0, import-fresh@^3.2.1: version "3.3.0" resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.3.0.tgz#37162c25fcb9ebaa2e6e53d5b4d88ce17d9e0c2b" integrity sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw== @@ -5972,12 +6438,12 @@ import-fresh@^3.2.1, import-fresh@^3.3.0: imul@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/imul/-/imul-1.0.1.tgz#9d5867161e8b3de96c2c38d5dc7cb102f35e2ac9" - integrity sha512-WFAgfwPLAjU66EKt6vRdTlKj4nAgIDQzh29JonLa4Bqtl6D8JrIMvWjCnx7xEjVNmP3U0fM5o8ZObk7d0f62bA== + integrity sha1-nVhnFh6LPelsLDjV3HyxAvNeKsk= imurmurhash@^0.1.4: version "0.1.4" resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" - integrity sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA== + integrity sha1-khi5srkoojixPcT7a21XbyMUU+o= indent-string@^4.0.0: version "4.0.0" @@ -5987,7 +6453,7 @@ indent-string@^4.0.0: inflight@^1.0.4: version "1.0.6" resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" - integrity sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA== + integrity sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk= dependencies: once "^1.3.0" wrappy "1" @@ -6002,12 +6468,31 @@ ini@^1.3.5: resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.8.tgz#a29da425b48806f34767a4efce397269af28432c" integrity sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew== -internal-slot@^1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/internal-slot/-/internal-slot-1.0.5.tgz#f2a2ee21f668f8627a4667f309dc0f4fb6674986" - integrity sha512-Y+R5hJrzs52QCG2laLn4udYVnxsfny9CpOhNhUvk/SSSVyF6T27FzRbF0sroPidSu3X8oEAkOn2K804mjpt6UQ== +inquirer@^6.2.2: + version "6.5.2" + resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-6.5.2.tgz#ad50942375d036d327ff528c08bd5fab089928ca" + integrity sha512-cntlB5ghuB0iuO65Ovoi8ogLHiWGs/5yNrtUcKjFhSSiVeAIVpD7koaSU9RM8mpXw5YDi9RdYXGQMaOURB7ycQ== + dependencies: + ansi-escapes "^3.2.0" + chalk "^2.4.2" + cli-cursor "^2.1.0" + cli-width "^2.0.0" + external-editor "^3.0.3" + figures "^2.0.0" + lodash "^4.17.12" + mute-stream "0.0.7" + run-async "^2.2.0" + rxjs "^6.4.0" + string-width "^2.1.0" + strip-ansi "^5.1.0" + through "^2.3.6" + +internal-slot@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/internal-slot/-/internal-slot-1.0.3.tgz#7347e307deeea2faac2ac6205d4bc7d34967f59c" + integrity sha512-O0DB1JC/sPyZl7cIo78n5dR7eUSwwpYPiXRhTzNxZVAMUuB8vlnRFyLxdrVToks6XPLVnFfbzaVd5WLjhgg+vA== dependencies: - get-intrinsic "^1.2.0" + get-intrinsic "^1.1.0" has "^1.0.3" side-channel "^1.0.4" @@ -6026,7 +6511,7 @@ invariant@^2.2.2: invert-kv@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/invert-kv/-/invert-kv-1.0.0.tgz#104a8e4aaca6d3d8cd157a8ef8bfab2d7a3ffdb6" - integrity sha512-xgs2NH9AE66ucSq4cNG1nhSFghr5l6tdL15Pk+jl46bmmBapgoaY/AacXyaDznAqmGL99TiLSQgO/XazFSKYeQ== + integrity sha1-EEqOSqym09jNFXqO+L+rLXo//bY= io-ts@1.10.4: version "1.10.4" @@ -6043,7 +6528,7 @@ ipaddr.js@1.9.1: is-accessor-descriptor@^0.1.6: version "0.1.6" resolved "https://registry.yarnpkg.com/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz#a9e12cb3ae8d876727eeef3843f8a0897b5c98d6" - integrity sha512-e1BM1qnDbMRG3ll2U9dSK0UMHuWOs3pY3AtcFsmvwPtKL3MML/Q86i+GilLfvqEs4GW+ExB91tQ3Ig9noDIZ+A== + integrity sha1-qeEss66Nh2cn7u84Q/igiXtcmNY= dependencies: kind-of "^3.0.2" @@ -6062,19 +6547,10 @@ is-arguments@^1.0.4: call-bind "^1.0.2" has-tostringtag "^1.0.0" -is-array-buffer@^3.0.1, is-array-buffer@^3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/is-array-buffer/-/is-array-buffer-3.0.2.tgz#f2653ced8412081638ecb0ebbd0c41c6e0aecbbe" - integrity sha512-y+FyyR/w8vfIRq4eQcM1EYgSTnmHXPqaF+IgzgraytCFq5Xh8lllDVmAZolPJiZttZLeFSINPYMaEJ7/vWUa1w== - dependencies: - call-bind "^1.0.2" - get-intrinsic "^1.2.0" - is-typed-array "^1.1.10" - is-arrayish@^0.2.1: version "0.2.1" resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d" - integrity sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg== + integrity sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0= is-bigint@^1.0.1: version "1.0.4" @@ -6103,15 +6579,15 @@ is-buffer@^1.1.5: resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.6.tgz#efaa2ea9daa0d7ab2ea13a97b2b8ad51fefbe8be" integrity sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w== -is-buffer@^2.0.5, is-buffer@~2.0.3: +is-buffer@~2.0.3: version "2.0.5" resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-2.0.5.tgz#ebc252e400d22ff8d77fa09888821a24a658c191" integrity sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ== -is-callable@^1.1.3, is-callable@^1.1.4, is-callable@^1.2.7: - version "1.2.7" - resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.2.7.tgz#3bc2a85ea742d9e36205dcacdd72ca1fdc51b055" - integrity sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA== +is-callable@^1.1.3, is-callable@^1.1.4, is-callable@^1.2.4: + version "1.2.4" + resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.2.4.tgz#47301d58dd0259407865547853df6d61fe471945" + integrity sha512-nsuwtxZfMX67Oryl9LCQ+upnC0Z0BgpwntpS89m1H/TLF0zNfzfLMV/9Wa/6MZsj0acpEjAO0KF1xT6ZdLl95w== is-ci@^2.0.0: version "2.0.0" @@ -6120,17 +6596,24 @@ is-ci@^2.0.0: dependencies: ci-info "^2.0.0" -is-core-module@^2.13.0: - version "2.13.0" - resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.13.0.tgz#bb52aa6e2cbd49a30c2ba68c42bf3435ba6072db" - integrity sha512-Z7dk6Qo8pOCp3l4tsX2C5ZVas4V+UxwQodwZhLopL91TX8UyyHEXafPcyoeeWuLrwzHcr3igO78wNLwHJHsMCQ== +is-core-module@^2.2.0, is-core-module@^2.8.1: + version "2.8.1" + resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.8.1.tgz#f59fdfca701d5879d0a6b100a40aa1560ce27211" + integrity sha512-SdNCUs284hr40hFTFP6l0IfZ/RSrMXF3qgoRHd3/79unUTvrFO/JoXwkGm+5J/Oe3E/b5GsnG330uUNgRpu1PA== + dependencies: + has "^1.0.3" + +is-core-module@^2.9.0: + version "2.10.0" + resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.10.0.tgz#9012ede0a91c69587e647514e1d5277019e728ed" + integrity sha512-Erxj2n/LDAZ7H8WNJXd9tw38GYM3dv8rk8Zcs+jJuxYTW7sozH+SS8NtrSjVL1/vpLvWi1hxy96IzjJ3EHTJJg== dependencies: has "^1.0.3" is-data-descriptor@^0.1.4: version "0.1.4" resolved "https://registry.yarnpkg.com/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz#0b5ee648388e2c860282e793f1856fec3f301b56" - integrity sha512-+w9D5ulSoBNlmw9OHn3U2v51SyoCd0he+bB3xMl62oijhrspxowjU+AIcDY0N3iEJbUEkB15IlMASQsxYigvXg== + integrity sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y= dependencies: kind-of "^3.0.2" @@ -6166,6 +6649,11 @@ is-descriptor@^1.0.0, is-descriptor@^1.0.2: is-data-descriptor "^1.0.0" kind-of "^6.0.2" +is-directory@^0.3.1: + version "0.3.1" + resolved "https://registry.yarnpkg.com/is-directory/-/is-directory-0.3.1.tgz#61339b6f2475fc772fd9c9d83f5c8575dc154ae1" + integrity sha1-YTObbyR1/Hcv2cnYP1yFddwVSuE= + is-docker@^2.0.0: version "2.2.1" resolved "https://registry.yarnpkg.com/is-docker/-/is-docker-2.2.1.tgz#33eeabe23cfe86f14bde4408a02c0cfb853acdaa" @@ -6174,7 +6662,7 @@ is-docker@^2.0.0: is-extendable@^0.1.0, is-extendable@^0.1.1: version "0.1.1" resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-0.1.1.tgz#62b110e289a471418e3ec36a617d472e301dfc89" - integrity sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw== + integrity sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik= is-extendable@^1.0.1: version "1.0.1" @@ -6186,7 +6674,7 @@ is-extendable@^1.0.1: is-extglob@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" - integrity sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ== + integrity sha1-qIwCU1eR8C7TfHahueqXc8gz+MI= is-finite@^1.0.0: version "1.1.0" @@ -6196,19 +6684,19 @@ is-finite@^1.0.0: is-fn@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/is-fn/-/is-fn-1.0.0.tgz#9543d5de7bcf5b08a22ec8a20bae6e286d510d8c" - integrity sha512-XoFPJQmsAShb3jEQRfzf2rqXavq7fIqF/jOekp308JlThqrODnMpweVSGilKTCXELfLhltGP2AGgbQGVP8F1dg== + integrity sha1-lUPV3nvPWwiiLsiiC65uKG1RDYw= is-fullwidth-code-point@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz#ef9e31386f031a7f0d643af82fde50c457ef00cb" - integrity sha512-1pqUqRjkhPJ9miNq9SwMfdvi6lBJcd6eFxvfaivQhaH3SgisfiuudvFntdKOmxuee/77l+FPjKrQjWvmPjWrRw== + integrity sha1-754xOG8DGn8NZDr4L95QxFfvAMs= dependencies: number-is-nan "^1.0.0" is-fullwidth-code-point@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz#a3b30a5c4f199183167aaab93beefae3ddfb654f" - integrity sha512-VHskAKYM8RfSFXwee5t5cbN5PZeq1Wrh6qd5bkyiXIf6UQcN6w/A0eXM9r6t8d+GYOh+o6ZhiEnb88LN/Y8m2w== + integrity sha1-o7MKXE8ZkYMWeqq5O+764937ZU8= is-fullwidth-code-point@^3.0.0: version "3.0.0" @@ -6237,9 +6725,9 @@ is-glob@^4.0.0, is-glob@^4.0.1, is-glob@^4.0.3, is-glob@~4.0.1: is-hex-prefixed@1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/is-hex-prefixed/-/is-hex-prefixed-1.0.0.tgz#7d8d37e6ad77e5d127148913c573e082d777f554" - integrity sha512-WvtOiug1VFrE9v1Cydwm+FnXd3+w9GaeVUss5W4v/SLy3UW00vP+6iNF2SdnfiBoLy4bTqVdkftNGTUeOFVsbA== + integrity sha1-fY035q135dEnFIkTxXPggtd39VQ= -is-negative-zero@^2.0.2: +is-negative-zero@^2.0.1, is-negative-zero@^2.0.2: version "2.0.2" resolved "https://registry.yarnpkg.com/is-negative-zero/-/is-negative-zero-2.0.2.tgz#7bf6f03a28003b8b3965de3ac26f664d765f3150" integrity sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA== @@ -6254,7 +6742,7 @@ is-number-object@^1.0.4: is-number@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/is-number/-/is-number-3.0.0.tgz#24fd6201a4782cf50561c810276afc7d12d71195" - integrity sha512-4cboCqIpliH+mAvFNegjZQ4kgKc3ZUhQVr3HvWbSh5q3WH2v82ct+T2Y1hdU5Gdtorx/cLifQjqCbL7bpznLTg== + integrity sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU= dependencies: kind-of "^3.0.2" @@ -6263,10 +6751,15 @@ is-number@^7.0.0: resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b" integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== -is-path-inside@^3.0.3: - version "3.0.3" - resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-3.0.3.tgz#d231362e53a07ff2b0e0ea7fed049161ffd16283" - integrity sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ== +is-object@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/is-object/-/is-object-1.0.2.tgz#a56552e1c665c9e950b4a025461da87e72f86fcf" + integrity sha512-2rRIahhZr2UWb45fIOuvZGpFtz0TyOZLf32KxBbSoUCeZR495zCKlWUKKUByk3geS2eAs7ZAABt0Y/Rx0GiQGA== + +is-plain-obj@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-1.1.0.tgz#71a50c8429dfca773c92a390a4a03b39fcd51d3e" + integrity sha1-caUMhCnfync8kqOQpKA7OfzVHT4= is-plain-obj@^2.1.0: version "2.1.0" @@ -6288,17 +6781,22 @@ is-regex@^1.0.4, is-regex@^1.1.4, is-regex@~1.1.4: call-bind "^1.0.2" has-tostringtag "^1.0.0" -is-shared-array-buffer@^1.0.2: +is-retry-allowed@^1.0.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/is-retry-allowed/-/is-retry-allowed-1.2.0.tgz#d778488bd0a4666a3be8a1482b9f2baafedea8b4" + integrity sha512-RUbUeKwvm3XG2VYamhJL1xFktgjvPzL0Hq8C+6yrWIswDy3BIXGqCxhxkc30N9jqK311gVU137K8Ei55/zVJRg== + +is-shared-array-buffer@^1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz#8f259c573b60b6a32d4058a1a07430c0a7344c79" integrity sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA== dependencies: call-bind "^1.0.2" -is-stream@^1.0.1: +is-stream@^1.0.0, is-stream@^1.0.1: version "1.1.0" resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-1.1.0.tgz#12d4a3dd4e68e0b79ceb8dbc84173ae80d91ca44" - integrity sha512-uQPm8kcs47jx38atAcWTVxyltQYoPT68y9aWYdV6yWXSyW8mzSat0TL6CiWdZeCdF3KrAvpVtnHbTv4RN+rqdQ== + integrity sha1-EtSj3U5o4Lec6428hBc66A2RykQ= is-string@^1.0.5, is-string@^1.0.7: version "1.0.7" @@ -6314,17 +6812,21 @@ is-symbol@^1.0.2, is-symbol@^1.0.3: dependencies: has-symbols "^1.0.2" -is-typed-array@^1.1.10, is-typed-array@^1.1.3, is-typed-array@^1.1.9: - version "1.1.12" - resolved "https://registry.yarnpkg.com/is-typed-array/-/is-typed-array-1.1.12.tgz#d0bab5686ef4a76f7a73097b95470ab199c57d4a" - integrity sha512-Z14TF2JNG8Lss5/HMqt0//T9JeHXttXy5pH/DBU4vi98ozO2btxzq9MwYDZYnKwU8nRsz/+GVFVRDq3DkVuSPg== +is-typed-array@^1.1.3, is-typed-array@^1.1.7: + version "1.1.8" + resolved "https://registry.yarnpkg.com/is-typed-array/-/is-typed-array-1.1.8.tgz#cbaa6585dc7db43318bc5b89523ea384a6f65e79" + integrity sha512-HqH41TNZq2fgtGT8WHVFVJhBVGuY3AnP3Q36K8JKXUxSxRgk/d+7NjmwG2vo2mYmXK8UYZKu0qH8bVP5gEisjA== dependencies: - which-typed-array "^1.1.11" + available-typed-arrays "^1.0.5" + call-bind "^1.0.2" + es-abstract "^1.18.5" + foreach "^2.0.5" + has-tostringtag "^1.0.0" is-typedarray@^1.0.0, is-typedarray@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a" - integrity sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA== + integrity sha1-5HnICFjfDBsR3dppQPlgEfzaSpo= is-unicode-supported@^0.1.0: version "0.1.0" @@ -6339,9 +6841,9 @@ is-url@^1.2.4: is-utf8@^0.2.0: version "0.2.1" resolved "https://registry.yarnpkg.com/is-utf8/-/is-utf8-0.2.1.tgz#4b0da1442104d1b336340e80797e865cf39f7d72" - integrity sha512-rMYPYvCzsXywIsldgLaSoPlw5PfoB/ssr7hY4pLfcodrA5M/eArza1a9VmTiNIBNMjOGr1Ow9mTyU2o69U6U9Q== + integrity sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI= -is-weakref@^1.0.2: +is-weakref@^1.0.1, is-weakref@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/is-weakref/-/is-weakref-1.0.2.tgz#9529f383a9338205e89765e0392efc2f100f06f2" integrity sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ== @@ -6363,39 +6865,42 @@ is-wsl@^2.1.1: isarray@0.0.1: version "0.0.1" resolved "https://registry.yarnpkg.com/isarray/-/isarray-0.0.1.tgz#8a18acfca9a8f4177e09abfc6038939b05d1eedf" - integrity sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ== + integrity sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8= isarray@1.0.0, isarray@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" - integrity sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ== - -isarray@^2.0.5: - version "2.0.5" - resolved "https://registry.yarnpkg.com/isarray/-/isarray-2.0.5.tgz#8af1e4c1221244cc62459faf38940d4e644a5723" - integrity sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw== + integrity sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE= isexe@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" - integrity sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw== + integrity sha1-6PvzdNxVb/iUehDcsFctYz8s+hA= isobject@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/isobject/-/isobject-2.1.0.tgz#f065561096a3f1da2ef46272f815c840d87e0c89" - integrity sha512-+OUdGJlgjOBZDfxnDjYYG6zp487z0JGNQq3cYQYg5f5hKR+syHMsaztzGeml/4kGG55CSpKSpWTY+jYGgsHLgA== + integrity sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk= dependencies: isarray "1.0.0" isobject@^3.0.0, isobject@^3.0.1: version "3.0.1" resolved "https://registry.yarnpkg.com/isobject/-/isobject-3.0.1.tgz#4e431e92b11a9731636aa1f9c8d1ccbcfdab78df" - integrity sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg== + integrity sha1-TkMekrEalzFjaqH5yNHMvP2reN8= isstream@~0.1.2: version "0.1.2" resolved "https://registry.yarnpkg.com/isstream/-/isstream-0.1.2.tgz#47e63f7af55afa6f92e1500e690eb8b8529c099a" - integrity sha512-Yljz7ffyPbrLpLngrMtZ7NduUgVvi6wG9RJ9IUcyCd59YQ911PBJphODUcbOVbqYfxe1wuYf/LJ8PauMRwsM/g== + integrity sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo= + +isurl@^1.0.0-alpha5: + version "1.0.0" + resolved "https://registry.yarnpkg.com/isurl/-/isurl-1.0.0.tgz#b27f4f49f3cdaa3ea44a0a5b7f3462e6edc39d67" + integrity sha512-1P/yWsxPlDtn7QeRD+ULKQPaIaN6yF368GZ2vDfv0AL0NwpStafjWCDDdn0k8wgFMWpVAqG7oJhxHnlud42i9w== + dependencies: + has-to-string-tag-x "^1.2.0" + is-object "^1.0.1" js-graph-algorithms@^1.0.18: version "1.0.18" @@ -6403,14 +6908,14 @@ js-graph-algorithms@^1.0.18: integrity sha512-Gu1wtWzXBzGeye/j9BuyplGHscwqKRZodp/0M1vyBc19RJpblSwKGu099KwwaTx9cRIV+Qupk8xUMfEiGfFqSA== js-sdsl@^4.1.4: - version "4.4.2" - resolved "https://registry.yarnpkg.com/js-sdsl/-/js-sdsl-4.4.2.tgz#2e3c031b1f47d3aca8b775532e3ebb0818e7f847" - integrity sha512-dwXFwByc/ajSV6m5bcKAPwe4yDDF6D614pxmIi5odytzxRlwqF6nwoiCek80Ixc7Cvma5awClxrzFtxCQvcM8w== + version "4.1.4" + resolved "https://registry.yarnpkg.com/js-sdsl/-/js-sdsl-4.1.4.tgz#78793c90f80e8430b7d8dc94515b6c77d98a26a6" + integrity sha512-Y2/yD55y5jteOAmY50JbUZYwk3CP3wnLPEZnlR1w9oKhITrBEtAxwuWKebFf8hMrPMgbYwFoWK/lH2sBkErELw== js-sha3@0.5.7, js-sha3@^0.5.7: version "0.5.7" resolved "https://registry.yarnpkg.com/js-sha3/-/js-sha3-0.5.7.tgz#0d4ffd8002d5333aabaf4a23eed2f6374c9f28e7" - integrity sha512-GII20kjaPX0zJ8wzkTbNDYMY7msuZcTWk8S5UOh6806Jq/wz1J8/bnr8uGU0DAUmYDjj2Mr4X1cW8v/GLYnR+g== + integrity sha1-DU/9gALVMzqrr0oj7tL2N0yfKOc= js-sha3@0.8.0, js-sha3@^0.8.0: version "0.8.0" @@ -6425,7 +6930,7 @@ js-sha3@0.8.0, js-sha3@^0.8.0: js-tokens@^3.0.2: version "3.0.2" resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-3.0.2.tgz#9866df395102130e38f7f996bceb65443209c25b" - integrity sha512-RjTcuD4xjtthQkaWH7dFlH85L+QaVtSoOyGdZ3g6HFhS9dFNDfLyqgm2NFe2X6cQpeFmt0452FJjFG5UameExg== + integrity sha1-mGbfOVECEw449/mWvOtlRDIJwls= js-yaml@3.13.1: version "3.13.1" @@ -6435,7 +6940,7 @@ js-yaml@3.13.1: argparse "^1.0.7" esprima "^4.0.0" -js-yaml@3.x, js-yaml@^3.13.1: +js-yaml@3.x, js-yaml@^3.12.0, js-yaml@^3.13.0, js-yaml@^3.13.1: version "3.14.1" resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.14.1.tgz#dae812fdb3825fa306609a8717383c50c36a0537" integrity sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g== @@ -6453,32 +6958,27 @@ js-yaml@4.1.0, js-yaml@^4.1.0: jsbn@~0.1.0: version "0.1.1" resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-0.1.1.tgz#a5e654c2e5a2deb5f201d96cefbca80c0ef2f513" - integrity sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg== + integrity sha1-peZUwuWi3rXyAdls77yoDA7y9RM= jsesc@^1.3.0: version "1.3.0" resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-1.3.0.tgz#46c3fec8c1892b12b0833db9bc7622176dbab34b" - integrity sha512-Mke0DA0QjUWuJlhsE0ZPPhYiJkRap642SmI/4ztCFaUs6V2AiH1sfecc+57NgaryfAA2VR3v6O+CSjC1jZJKOA== + integrity sha1-RsP+yMGJKxKwgz25vHYiF226s0s= jsesc@~0.5.0: version "0.5.0" resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-0.5.0.tgz#e7dee66e35d6fc16f710fe91d5cf69f70f08911d" - integrity sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA== + integrity sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0= json-buffer@3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/json-buffer/-/json-buffer-3.0.0.tgz#5b1f397afc75d677bde8bcfc0e47e1f9a3d9a898" - integrity sha512-CuUqjv0FUZIdXkHPI8MezCnFCdaTAacej1TZYulLoAg1h/PhwkdXFN4V/gzY4g+fMBCOV2xF+rp7t2XD2ns/NQ== - -json-buffer@3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/json-buffer/-/json-buffer-3.0.1.tgz#9338802a30d3b6605fbe0613e094008ca8c05a13" - integrity sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ== + integrity sha1-Wx85evx11ne96Lz8Dkfh+aPZqJg= -json-parse-even-better-errors@^2.3.0: - version "2.3.1" - resolved "https://registry.yarnpkg.com/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz#7c47805a94319928e05777405dc12e1f7a4ee02d" - integrity sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w== +json-parse-better-errors@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz#bb867cfb3450e69107c131d1c514bab3dc8bcaa9" + integrity sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw== json-rpc-engine@^3.4.0, json-rpc-engine@^3.6.0: version "3.8.0" @@ -6495,14 +6995,14 @@ json-rpc-engine@^3.4.0, json-rpc-engine@^3.6.0: json-rpc-error@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/json-rpc-error/-/json-rpc-error-2.0.0.tgz#a7af9c202838b5e905c7250e547f1aff77258a02" - integrity sha512-EwUeWP+KgAZ/xqFpaP6YDAXMtCJi+o/QQpCQFIYyxr01AdADi2y413eM8hSqJcoQym9WMePAJWoaODEJufC4Ug== + integrity sha1-p6+cICg4tekFxyUOVH8a/3cligI= dependencies: inherits "^2.0.1" json-rpc-random-id@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/json-rpc-random-id/-/json-rpc-random-id-1.0.1.tgz#ba49d96aded1444dbb8da3d203748acbbcdec8c8" - integrity sha512-RJ9YYNCkhVDBuP4zN5BBtYAzEl03yq/jIIsyif0JY9qyJuQQZNeDK7anAPKKlyEtLSj2s8h6hNh2F8zO5q7ScA== + integrity sha1-uknZat7RRE27jaPSA3SKy7zeyMg= json-schema-traverse@^0.4.1: version "0.4.1" @@ -6522,36 +7022,36 @@ json-schema@0.4.0: json-stable-stringify-without-jsonify@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz#9db7b59496ad3f3cfef30a75142d2d930ad72651" - integrity sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw== + integrity sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE= json-stable-stringify@^1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/json-stable-stringify/-/json-stable-stringify-1.0.2.tgz#e06f23128e0bbe342dc996ed5a19e28b57b580e0" - integrity sha512-eunSSaEnxV12z+Z73y/j5N37/In40GK4GmsSy+tEHJMxknvqnA7/djeYtAgW0GsWHUfg+847WJjKaEylk2y09g== + version "1.0.1" + resolved "https://registry.yarnpkg.com/json-stable-stringify/-/json-stable-stringify-1.0.1.tgz#9a759d39c5f2ff503fd5300646ed445f88c4f9af" + integrity sha1-mnWdOcXy/1A/1TAGRu1EX4jE+a8= dependencies: - jsonify "^0.0.1" + jsonify "~0.0.0" json-stringify-safe@~5.0.1: version "5.0.1" resolved "https://registry.yarnpkg.com/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz#1296a2d58fd45f19a0f6ce01d65701e2c735b6eb" - integrity sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA== + integrity sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus= json5@^0.5.1: version "0.5.1" resolved "https://registry.yarnpkg.com/json5/-/json5-0.5.1.tgz#1eade7acc012034ad84e2396767ead9fa5495821" - integrity sha512-4xrs1aW+6N5DalkqSVA8fxh458CXvR99WU8WLKmq4v8eWAL86Xo3BVqyd3SkA9wEVjCMqyvvRRkshAdOnBp5rw== + integrity sha1-Hq3nrMASA0rYTiOWdn6tn6VJWCE= jsonfile@^2.1.0: version "2.4.0" resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-2.4.0.tgz#3736a2b428b87bbda0cc83b53fa3d633a35c2ae8" - integrity sha512-PKllAqbgLgxHaj8TElYymKCAgrASebJrWpTnEkOaTowt23VKXXN0sUeriJ+eh7y6ufb/CC5ap11pz71/cM0hUw== + integrity sha1-NzaitCi4e72gzIO1P6PWM6NcKug= optionalDependencies: graceful-fs "^4.1.6" jsonfile@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-4.0.0.tgz#8771aae0799b64076b76640fca058f9c10e33ecb" - integrity sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg== + integrity sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss= optionalDependencies: graceful-fs "^4.1.6" @@ -6564,15 +7064,15 @@ jsonfile@^6.0.1: optionalDependencies: graceful-fs "^4.1.6" -jsonify@^0.0.1: - version "0.0.1" - resolved "https://registry.yarnpkg.com/jsonify/-/jsonify-0.0.1.tgz#2aa3111dae3d34a0f151c63f3a45d995d9420978" - integrity sha512-2/Ki0GcmuqSrgFyelQq9M05y7PS0mEwuIzrf3f1fPqkVDVRvZrPZtVSMHxdgo8Aq0sxAOb/cr2aqqA3LeWHVPg== +jsonify@~0.0.0: + version "0.0.0" + resolved "https://registry.yarnpkg.com/jsonify/-/jsonify-0.0.0.tgz#2c74b6ee41d93ca51b7b5aaee8f503631d252a73" + integrity sha1-LHS27kHZPKUbe1qu6PUDYx0lKnM= jsonschema@^1.2.4: - version "1.4.1" - resolved "https://registry.yarnpkg.com/jsonschema/-/jsonschema-1.4.1.tgz#cc4c3f0077fb4542982973d8a083b6b34f482dab" - integrity sha512-S6cATIPVv1z0IlxdN+zUk5EPjkGCdnhN4wVSBlvoUO1tOLJootbo9CquNJmbIh4yikWHiUedhRYrNPn1arpEmQ== + version "1.4.0" + resolved "https://registry.yarnpkg.com/jsonschema/-/jsonschema-1.4.0.tgz#1afa34c4bc22190d8e42271ec17ac8b3404f87b2" + integrity sha512-/YgW6pRMr6M7C+4o8kS+B/2myEpHCrxO4PEWnqJNBFMjn7EWXqlQ4tGwL6xTHeRplwuZmcAncdvfOad1nT2yMw== jsprim@^1.2.2: version "1.4.2" @@ -6592,10 +7092,10 @@ keccak@3.0.1: node-addon-api "^2.0.0" node-gyp-build "^4.2.0" -keccak@^3.0.0, keccak@^3.0.2: - version "3.0.3" - resolved "https://registry.yarnpkg.com/keccak/-/keccak-3.0.3.tgz#4bc35ad917be1ef54ff246f904c2bbbf9ac61276" - integrity sha512-JZrLIAJWuZxKbCilMpNz5Vj7Vtb4scDG3dMXLOsbzBmQGyjwE61BbW7bJkfKKCShXiQZt3T6sBgALRtmd+nZaQ== +keccak@^3.0.0: + version "3.0.2" + resolved "https://registry.yarnpkg.com/keccak/-/keccak-3.0.2.tgz#4c2c6e8c54e04f2670ee49fa734eb9da152206e0" + integrity sha512-PyKKjkH53wDMLGrvmRGSNWgmSxZOUqbnXwKL9tmgbFYA1iAYqW21kfR7mZXV0MlESiefxQQE9X9fTa3X+2MPDQ== dependencies: node-addon-api "^2.0.0" node-gyp-build "^4.2.0" @@ -6608,24 +7108,17 @@ keyv@^3.0.0: dependencies: json-buffer "3.0.0" -keyv@^4.0.0, keyv@^4.5.3: - version "4.5.3" - resolved "https://registry.yarnpkg.com/keyv/-/keyv-4.5.3.tgz#00873d2b046df737963157bd04f294ca818c9c25" - integrity sha512-QCiSav9WaX1PgETJ+SpNnx2PRRapJ/oRSXM4VO5OGYGSjrxbKPVFVhB3l2OCbLCk329N8qyAtsJjSjvVBWzEug== - dependencies: - json-buffer "3.0.1" - kind-of@^3.0.2, kind-of@^3.0.3, kind-of@^3.2.0: version "3.2.2" resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-3.2.2.tgz#31ea21a734bab9bbb0f32466d893aea51e4a3c64" - integrity sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ== + integrity sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ= dependencies: is-buffer "^1.1.5" kind-of@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-4.0.0.tgz#20813df3d712928b207378691a45066fae72dd57" - integrity sha512-24XsCxmEbRwEDbz/qz3stgin8TTzZ1ESR56OMCN0ujYg+vRutNSiOj9bHH9u85DKgXguraugV5sFuvbD4FW/hw== + integrity sha1-IIE989cSkosgc3hpGkUGb65y3Vc= dependencies: is-buffer "^1.1.5" @@ -6649,19 +7142,19 @@ klaw-sync@^6.0.0: klaw@^1.0.0: version "1.3.1" resolved "https://registry.yarnpkg.com/klaw/-/klaw-1.3.1.tgz#4088433b46b3b1ba259d78785d8e96f73ba02439" - integrity sha512-TED5xi9gGQjGpNnvRWknrwAB1eL5GciPfVFOt3Vk1OJCVDQbzuSfrF3hkUQKlsgKrG1F+0t5W0m+Fje1jIt8rw== + integrity sha1-QIhDO0azsbolnXh4XY6W9zugJDk= optionalDependencies: graceful-fs "^4.1.9" klaw@^4.0.1: - version "4.1.0" - resolved "https://registry.yarnpkg.com/klaw/-/klaw-4.1.0.tgz#5df608067d8cb62bbfb24374f8e5d956323338f3" - integrity sha512-1zGZ9MF9H22UnkpVeuaGKOjfA2t6WrfdrJmGjy16ykcjnKQDmHVX+KI477rpbGevz/5FD4MC3xf1oxylBgcaQw== + version "4.0.1" + resolved "https://registry.yarnpkg.com/klaw/-/klaw-4.0.1.tgz#8dc6f5723f05894e8e931b516a8ff15c2976d368" + integrity sha512-pgsE40/SvC7st04AHiISNewaIMUbY5V/K8b21ekiPiFoYs/EYSdsGa+FJArB1d441uq4Q8zZyIxvAzkGNlBdRw== lcid@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/lcid/-/lcid-1.0.0.tgz#308accafa0bc483a3867b4b6f2b9506251d1b835" - integrity sha512-YiGkH6EnGrDGqLMITnGjXtGmNtjoXw9SVUzcaos8RBi7Ps0VBylkq+vOcY9QE5poLasPCR849ucFUkl0UzUyOw== + integrity sha1-MIrMr6C8SDo4Z7S28rlQYlHRuDU= dependencies: invert-kv "^1.0.0" @@ -6677,6 +7170,11 @@ level-codec@~7.0.0: resolved "https://registry.yarnpkg.com/level-codec/-/level-codec-7.0.1.tgz#341f22f907ce0f16763f24bddd681e395a0fb8a7" integrity sha512-Ua/R9B9r3RasXdRmOtd+t9TCOEIIlts+TN/7XTT2unhDaL6sJn83S3rUyljbr6lVtw49N3/yA0HHjpV6Kzb2aQ== +level-concat-iterator@~2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/level-concat-iterator/-/level-concat-iterator-2.0.1.tgz#1d1009cf108340252cb38c51f9727311193e6263" + integrity sha512-OTKKOqeav2QWcERMJR7IS9CUo1sHnke2C0gkSmcR7QuEtFNLLzHQAvnMw8ykvEcv0Qtkg0p7FOwP1v9e5Smdcw== + level-errors@^1.0.3: version "1.1.2" resolved "https://registry.yarnpkg.com/level-errors/-/level-errors-1.1.2.tgz#4399c2f3d3ab87d0625f7e3676e2d807deff404d" @@ -6710,7 +7208,7 @@ level-iterator-stream@^2.0.3: level-iterator-stream@~1.3.0: version "1.3.1" resolved "https://registry.yarnpkg.com/level-iterator-stream/-/level-iterator-stream-1.3.1.tgz#e43b78b1a8143e6fa97a4f485eb8ea530352f2ed" - integrity sha512-1qua0RHNtr4nrZBgYlpV0qHHeHpcRRWTxEZJ8xsemoHAXNL5tbooh4tPEEqIqsbWCAJBmUmkwYK/sW5OrFjWWw== + integrity sha1-5Dt4sagUPm+pek9IXrjqUwNS8u0= dependencies: inherits "^2.0.1" level-errors "^1.0.3" @@ -6726,6 +7224,15 @@ level-iterator-stream@~3.0.0: readable-stream "^2.3.6" xtend "^4.0.0" +level-iterator-stream@~4.0.0: + version "4.0.2" + resolved "https://registry.yarnpkg.com/level-iterator-stream/-/level-iterator-stream-4.0.2.tgz#7ceba69b713b0d7e22fcc0d1f128ccdc8a24f79c" + integrity sha512-ZSthfEqzGSOMWoUGhTXdX9jv26d32XJuHz/5YnuHZzH6wldfWMOVwI9TBtKcya4BKTyTt3XVA0A3cF3q5CY30Q== + dependencies: + inherits "^2.0.4" + readable-stream "^3.4.0" + xtend "^4.0.2" + level-mem@^3.0.1: version "3.0.1" resolved "https://registry.yarnpkg.com/level-mem/-/level-mem-3.0.1.tgz#7ce8cf256eac40f716eb6489654726247f5a89e5" @@ -6734,6 +7241,22 @@ level-mem@^3.0.1: level-packager "~4.0.0" memdown "~3.0.0" +level-mem@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/level-mem/-/level-mem-5.0.1.tgz#c345126b74f5b8aa376dc77d36813a177ef8251d" + integrity sha512-qd+qUJHXsGSFoHTziptAKXoLX87QjR7v2KMbqncDXPxQuCdsQlzmyX+gwrEHhlzn08vkf8TyipYyMmiC6Gobzg== + dependencies: + level-packager "^5.0.3" + memdown "^5.0.0" + +level-packager@^5.0.3: + version "5.1.1" + resolved "https://registry.yarnpkg.com/level-packager/-/level-packager-5.1.1.tgz#323ec842d6babe7336f70299c14df2e329c18939" + integrity sha512-HMwMaQPlTC1IlcwT3+swhqf/NUO+ZhXVz6TY1zZIIZlIR0YSn8GtAAWmIvKjNY16ZkEg/JcpAuQskxsXqC0yOQ== + dependencies: + encoding-down "^6.3.0" + levelup "^4.3.2" + level-packager@~4.0.0: version "4.0.1" resolved "https://registry.yarnpkg.com/level-packager/-/level-packager-4.0.1.tgz#7e7d3016af005be0869bc5fa8de93d2a7f56ffe6" @@ -6765,23 +7288,17 @@ level-sublevel@6.6.4: typewiselite "~1.0.0" xtend "~4.0.0" -level-supports@^4.0.0: - version "4.0.1" - resolved "https://registry.yarnpkg.com/level-supports/-/level-supports-4.0.1.tgz#431546f9d81f10ff0fea0e74533a0e875c08c66a" - integrity sha512-PbXpve8rKeNcZ9C1mUicC9auIYFyGpkV9/i6g76tLgANwWhtG2v7I4xNBUlkn3lE2/dZF3Pi0ygYGtLc4RXXdA== - -level-transcoder@^1.0.1: +level-supports@~1.0.0: version "1.0.1" - resolved "https://registry.yarnpkg.com/level-transcoder/-/level-transcoder-1.0.1.tgz#f8cef5990c4f1283d4c86d949e73631b0bc8ba9c" - integrity sha512-t7bFwFtsQeD8cl8NIoQ2iwxA0CL/9IFw7/9gAjOonH0PWTTiRfY7Hq+Ejbsxh86tXobDQ6IOiddjNYIfOBs06w== + resolved "https://registry.yarnpkg.com/level-supports/-/level-supports-1.0.1.tgz#2f530a596834c7301622521988e2c36bb77d122d" + integrity sha512-rXM7GYnW8gsl1vedTJIbzOrRv85c/2uCMpiiCzO2fndd06U/kUXEEU9evYn4zFggBOg36IsBW8LzqIpETwwQzg== dependencies: - buffer "^6.0.3" - module-error "^1.0.1" + xtend "^4.0.2" level-ws@0.0.0: version "0.0.0" resolved "https://registry.yarnpkg.com/level-ws/-/level-ws-0.0.0.tgz#372e512177924a00424b0b43aef2bb42496d228b" - integrity sha512-XUTaO/+Db51Uiyp/t7fCMGVFOTdtLS/NIACxE/GHsij15mKzxksZifKVjlXDF41JMUP/oM1Oc4YNGdKnc3dVLw== + integrity sha1-Ny5RIXeSSgBCSwtDrvK7QkltIos= dependencies: readable-stream "~1.0.15" xtend "~2.1.1" @@ -6795,13 +7312,14 @@ level-ws@^1.0.0: readable-stream "^2.2.8" xtend "^4.0.1" -level@^8.0.0: - version "8.0.0" - resolved "https://registry.yarnpkg.com/level/-/level-8.0.0.tgz#41b4c515dabe28212a3e881b61c161ffead14394" - integrity sha512-ypf0jjAk2BWI33yzEaaotpq7fkOPALKAgDBxggO6Q9HGX2MRXn0wbP1Jn/tJv1gtL867+YOjOB49WaUF3UoJNQ== +level-ws@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/level-ws/-/level-ws-2.0.0.tgz#207a07bcd0164a0ec5d62c304b4615c54436d339" + integrity sha512-1iv7VXx0G9ec1isqQZ7y5LmoZo/ewAsyDHNA8EFDW5hqH2Kqovm33nSFkSdnLLAK+I5FlT+lo5Cw9itGe+CpQA== dependencies: - browser-level "^1.0.1" - classic-level "^1.2.0" + inherits "^2.0.3" + readable-stream "^3.1.0" + xtend "^4.0.1" levelup@3.1.1, levelup@^3.0.0: version "3.1.1" @@ -6826,31 +7344,37 @@ levelup@^1.2.1: semver "~5.4.1" xtend "~4.0.0" -levn@^0.4.1: - version "0.4.1" - resolved "https://registry.yarnpkg.com/levn/-/levn-0.4.1.tgz#ae4562c007473b932a6200d403268dd2fffc6ade" - integrity sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ== +levelup@^4.3.2: + version "4.4.0" + resolved "https://registry.yarnpkg.com/levelup/-/levelup-4.4.0.tgz#f89da3a228c38deb49c48f88a70fb71f01cafed6" + integrity sha512-94++VFO3qN95cM/d6eBXvd894oJE0w3cInq9USsyQzzoJxmiYzPAocNcuGCPGGjoXqDVJcr3C1jzt1TSjyaiLQ== dependencies: - prelude-ls "^1.2.1" - type-check "~0.4.0" + deferred-leveldown "~5.3.0" + level-errors "~2.0.0" + level-iterator-stream "~4.0.0" + level-supports "~1.0.0" + xtend "~4.0.0" -levn@~0.3.0: +levn@^0.3.0, levn@~0.3.0: version "0.3.0" resolved "https://registry.yarnpkg.com/levn/-/levn-0.3.0.tgz#3b09924edf9f083c0490fdd4c0bc4421e04764ee" - integrity sha512-0OO4y2iOHix2W6ujICbKIaEQXvFQHue65vUG3pb5EUomzPI90z9hsA1VsO/dbIIpC53J8gxM9Q4Oho0jrCM/yA== + integrity sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4= dependencies: prelude-ls "~1.1.2" type-check "~0.3.2" -lines-and-columns@^1.1.6: - version "1.2.4" - resolved "https://registry.yarnpkg.com/lines-and-columns/-/lines-and-columns-1.2.4.tgz#eca284f75d2965079309dc0ad9255abb2ebc1632" - integrity sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg== +levn@^0.4.1: + version "0.4.1" + resolved "https://registry.yarnpkg.com/levn/-/levn-0.4.1.tgz#ae4562c007473b932a6200d403268dd2fffc6ade" + integrity sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ== + dependencies: + prelude-ls "^1.2.1" + type-check "~0.4.0" load-json-file@^1.0.0: version "1.1.0" resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-1.1.0.tgz#956905708d58b4bab4c2261b04f59f31c99374c0" - integrity sha512-cy7ZdNRXdablkXYNI049pthVeXFurRyb9+hA/dZzerZ0pGTx42z+y+ssxBaVV2l70t1muq5IdKhn4UtcoGUY9A== + integrity sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA= dependencies: graceful-fs "^4.1.2" parse-json "^2.2.0" @@ -6861,7 +7385,7 @@ load-json-file@^1.0.0: locate-path@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-2.0.0.tgz#2b568b265eec944c6d9c0de9c3dbbbca0354cd8e" - integrity sha512-NCI2kiDkyR7VeEKm27Kda/iQHyKJe1Bu0FlTbYp3CqJu+9IFe9bLyAjMxf5ZDDbEg+iMPzB5zYyUTSm8wVTKmA== + integrity sha1-K1aLJl7slExtnA3pw9u7ygNUzY4= dependencies: p-locate "^2.0.0" path-exists "^3.0.0" @@ -6891,12 +7415,12 @@ locate-path@^6.0.0: lodash.assign@^4.0.3, lodash.assign@^4.0.6: version "4.2.0" resolved "https://registry.yarnpkg.com/lodash.assign/-/lodash.assign-4.2.0.tgz#0d99f3ccd7a6d261d19bdaeb9245005d285808e7" - integrity sha512-hFuH8TY+Yji7Eja3mGiuAxBqLagejScbG8GbG0j6o9vzn0YL14My+ktnqtZgFTosKymC9/44wP6s7xyuLfnClw== + integrity sha1-DZnzzNem0mHRm9rrkkUAXShYCOc= lodash.camelcase@^4.3.0: version "4.3.0" resolved "https://registry.yarnpkg.com/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz#b28aa6288a2b9fc651035c7711f65ab6190331a6" - integrity sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA== + integrity sha1-soqmKIorn8ZRA1x3EfZathkDMaY= lodash.merge@^4.6.2: version "4.6.2" @@ -6923,7 +7447,7 @@ lodash@4.17.20: resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.20.tgz#b44a9b6297bcb698f1c51a3545a2b3b368d59c52" integrity sha512-PlhdFcillOINfeV7Ni6oF1TAEayyZBoZ8bcshTHqOYJYlrqzRK5hagpagky5o4HfCzzd1TRkXPMFq6cKk9rGmA== -lodash@^4.17.11, lodash@^4.17.14, lodash@^4.17.15, lodash@^4.17.19, lodash@^4.17.21, lodash@^4.17.4: +lodash@^4.17.11, lodash@^4.17.12, lodash@^4.17.14, lodash@^4.17.15, lodash@^4.17.19, lodash@^4.17.21, lodash@^4.17.4: version "4.17.21" resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== @@ -6946,12 +7470,12 @@ log-symbols@4.1.0: looper@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/looper/-/looper-2.0.0.tgz#66cd0c774af3d4fedac53794f742db56da8f09ec" - integrity sha512-6DzMHJcjbQX/UPHc1rRCBfKlLwDkvuGZ715cIR36wSdYqWXFT35uLXq5P/2orl3tz+t+VOVPxw4yPinQlUDGDQ== + integrity sha1-Zs0Md0rz1P7axTeU90LbVtqPCew= looper@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/looper/-/looper-3.0.0.tgz#2efa54c3b1cbaba9b94aee2e5914b0be57fbb749" - integrity sha512-LJ9wplN/uSn72oJRsXTx+snxPet5c8XiZmOKCm906NVYu+ag6SB6vUcnJcWxgnl2NfbIyeobAn7Bwv6xRj2XJg== + integrity sha1-LvpUw7HLq6m5Su4uWRSwvlf7t0k= loose-envify@^1.0.0: version "1.4.0" @@ -6961,9 +7485,9 @@ loose-envify@^1.0.0: js-tokens "^3.0.0 || ^4.0.0" loupe@^2.3.1: - version "2.3.6" - resolved "https://registry.yarnpkg.com/loupe/-/loupe-2.3.6.tgz#76e4af498103c532d1ecc9be102036a21f787b53" - integrity sha512-RaPMZKiMy8/JruncMU5Bt6na1eftNoo++R4Y+N2FrxkDVTrGvcyzFTsaGif4QTeKESheMGegbhw6iUAq+5A8zA== + version "2.3.4" + resolved "https://registry.yarnpkg.com/loupe/-/loupe-2.3.4.tgz#7e0b9bffc76f148f9be769cb1321d3dcf3cb25f3" + integrity sha512-OvKfgCC2Ndby6aSTREl5aCCPTNIzlDfQZvZxNUrBrihDhL3xcrYegTblhmEiCrg2kKQz4XsFIaemE5BF4ybSaQ== dependencies: get-func-name "^2.0.0" @@ -6977,11 +7501,6 @@ lowercase-keys@^2.0.0: resolved "https://registry.yarnpkg.com/lowercase-keys/-/lowercase-keys-2.0.0.tgz#2603e78b7b4b0006cbca2fbcc8a3202558ac9479" integrity sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA== -lowercase-keys@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/lowercase-keys/-/lowercase-keys-3.0.0.tgz#c5e7d442e37ead247ae9db117a9d0a467c89d4f2" - integrity sha512-ozCC6gdQ+glXOQsveKD0YsDy8DSQFjDTz4zyzEHNV5+JP5D62LmfDZ6o1cycFx9ouG940M5dE8C8CTewdj2YWQ== - lru-cache@5.1.1, lru-cache@^5.1.1: version "5.1.1" resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-5.1.1.tgz#1da27e6710271947695daf6848e847f01d84b920" @@ -6992,7 +7511,7 @@ lru-cache@5.1.1, lru-cache@^5.1.1: lru-cache@^3.2.0: version "3.2.0" resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-3.2.0.tgz#71789b3b7f5399bec8565dda38aa30d2a097efee" - integrity sha512-91gyOKTc2k66UG6kHiH4h3S2eltcPwE1STVfMYC/NG+nZwf8IIuiamfmpGZjpbbxzSyEJaLC0tNSmhjlQUTJow== + integrity sha1-cXibO39Tmb7IVl3aOKow0qCX7+4= dependencies: pseudomap "^1.0.1" @@ -7006,17 +7525,17 @@ lru-cache@^6.0.0: lru_map@^0.3.3: version "0.3.3" resolved "https://registry.yarnpkg.com/lru_map/-/lru_map-0.3.3.tgz#b5c8351b9464cbd750335a79650a0ec0e56118dd" - integrity sha512-Pn9cox5CsMYngeDbmChANltQl+5pi6XmTrraMSzhPmMBbmgcxmqWry0U3PGapCU1yB4/LqCcom7qhHZiF/jGfQ== + integrity sha1-tcg1G5Rky9dQM1p5ZQoOwOVhGN0= ltgt@^2.1.2, ltgt@~2.2.0: version "2.2.1" resolved "https://registry.yarnpkg.com/ltgt/-/ltgt-2.2.1.tgz#f35ca91c493f7b73da0e07495304f17b31f87ee5" - integrity sha512-AI2r85+4MquTw9ZYqabu4nMwy9Oftlfa/e/52t9IjtfG+mGBbTNdAoZ3RQKLHR6r0wQnwZnPIEh/Ya6XTWAKNA== + integrity sha1-81ypHEk/e3PaDgdJUwTxezH4fuU= ltgt@~2.1.1: version "2.1.3" resolved "https://registry.yarnpkg.com/ltgt/-/ltgt-2.1.3.tgz#10851a06d9964b971178441c23c9e52698eece34" - integrity sha512-5VjHC5GsENtIi5rbJd+feEpDKhfr7j0odoUR2Uh978g+2p93nd5o34cTjQWohXsPsCZeqoDnIqEf88mPCe0Pfw== + integrity sha1-EIUaBtmWS5cReEQcI8nlJpjuzjQ= make-error@^1.1.1: version "1.3.6" @@ -7026,12 +7545,12 @@ make-error@^1.1.1: map-cache@^0.2.2: version "0.2.2" resolved "https://registry.yarnpkg.com/map-cache/-/map-cache-0.2.2.tgz#c32abd0bd6525d9b051645bb4f26ac5dc98a0dbf" - integrity sha512-8y/eV9QQZCiyn1SprXSrCmqJN0yNRATe+PO8ztwqrvrbdRLA3eYJF0yaR0YayLWkMbsQSKWS9N2gPcGEc4UsZg== + integrity sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8= map-visit@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/map-visit/-/map-visit-1.0.0.tgz#ecdca8f13144e660f1b5bd41f12f3479d98dfb8f" - integrity sha512-4y7uGv8bd2WdM9vpQsiQNo41Ln1NvhvDRuVt0k2JZQ+ezN2uaQes7lZeZ+QQUHOLQAtDaBJ+7wCbi+ab/KFs+w== + integrity sha1-7Nyo8TFE5mDxtb1B8S80edmN+48= dependencies: object-visit "^1.0.0" @@ -7062,12 +7581,12 @@ md5.js@^1.3.4: media-typer@0.3.0: version "0.3.0" resolved "https://registry.yarnpkg.com/media-typer/-/media-typer-0.3.0.tgz#8710d7af0aa626f8fffa1ce00168545263255748" - integrity sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ== + integrity sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g= memdown@^1.0.0: version "1.4.1" resolved "https://registry.yarnpkg.com/memdown/-/memdown-1.4.1.tgz#b4e4e192174664ffbae41361aa500f3119efe215" - integrity sha512-iVrGHZB8i4OQfM155xx8akvG9FIj+ht14DX5CQkCTG4EHzZ3d3sgckIf/Lm9ivZalEsFuEVnWv2B2WZvbrro2w== + integrity sha1-tOThkhdGZP+65BNhqlAPMRnv4hU= dependencies: abstract-leveldown "~2.7.1" functional-red-black-tree "^1.0.1" @@ -7076,6 +7595,18 @@ memdown@^1.0.0: ltgt "~2.2.0" safe-buffer "~5.1.1" +memdown@^5.0.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/memdown/-/memdown-5.1.0.tgz#608e91a9f10f37f5b5fe767667a8674129a833cb" + integrity sha512-B3J+UizMRAlEArDjWHTMmadet+UKwHd3UjMgGBkZcKAxAYVPS9o0Yeiha4qvz7iGiL2Sb3igUft6p7nbFWctpw== + dependencies: + abstract-leveldown "~6.2.1" + functional-red-black-tree "~1.0.1" + immediate "~3.2.3" + inherits "~2.0.1" + ltgt "~2.2.0" + safe-buffer "~5.2.0" + memdown@~3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/memdown/-/memdown-3.0.0.tgz#93aca055d743b20efc37492e9e399784f2958309" @@ -7088,24 +7619,15 @@ memdown@~3.0.0: ltgt "~2.2.0" safe-buffer "~5.1.1" -memory-level@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/memory-level/-/memory-level-1.0.0.tgz#7323c3fd368f9af2f71c3cd76ba403a17ac41692" - integrity sha512-UXzwewuWeHBz5krr7EvehKcmLFNoXxGcvuYhC41tRnkrTbJohtS7kVn9akmgirtRygg+f7Yjsfi8Uu5SGSQ4Og== - dependencies: - abstract-level "^1.0.0" - functional-red-black-tree "^1.0.1" - module-error "^1.0.1" - memorystream@^0.3.1: version "0.3.1" resolved "https://registry.yarnpkg.com/memorystream/-/memorystream-0.3.1.tgz#86d7090b30ce455d63fbae12dda51a47ddcaf9b2" - integrity sha512-S3UwM3yj5mtUSEfP41UZmt/0SCoVYUcU1rkXv+BQ5Ig8ndL4sPoJNBUJERafdPb5jjHJGuMgytgKvKIf58XNBw== + integrity sha1-htcJCzDORV1j+64S3aUaR93K+bI= merge-descriptors@1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/merge-descriptors/-/merge-descriptors-1.0.1.tgz#b00aaa556dd8b44568150ec9d1b953f3f90cbb61" - integrity sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w== + integrity sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E= merge2@^1.2.3, merge2@^1.3.0, merge2@^1.4.1: version "1.4.1" @@ -7139,15 +7661,22 @@ merkle-patricia-tree@^2.1.2, merkle-patricia-tree@^2.3.2: rlp "^2.0.0" semaphore ">=1.0.1" +merkle-patricia-tree@^4.2.2, merkle-patricia-tree@^4.2.4: + version "4.2.4" + resolved "https://registry.yarnpkg.com/merkle-patricia-tree/-/merkle-patricia-tree-4.2.4.tgz#ff988d045e2bf3dfa2239f7fabe2d59618d57413" + integrity sha512-eHbf/BG6eGNsqqfbLED9rIqbsF4+sykEaBn6OLNs71tjclbMcMOk1tEPmJKcNcNCLkvbpY/lwyOlizWsqPNo8w== + dependencies: + "@types/levelup" "^4.3.0" + ethereumjs-util "^7.1.4" + level-mem "^5.0.1" + level-ws "^2.0.0" + readable-stream "^3.6.0" + semaphore-async-await "^1.5.1" + methods@~1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/methods/-/methods-1.1.2.tgz#5529a4d67654134edcc5266656835b0f851afcee" - integrity sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w== - -micro-ftch@^0.3.1: - version "0.3.1" - resolved "https://registry.yarnpkg.com/micro-ftch/-/micro-ftch-0.3.1.tgz#6cb83388de4c1f279a034fb0cf96dfc050853c5f" - integrity sha512-/0LLxhzP0tfiR5hcQebtudP56gUurs2CLkGarnCiB/OqEyUFQ6U3paQi/tgLv0hBJYt2rnr9MNpxz4fiiugstg== + integrity sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4= micromatch@^3.1.4: version "3.1.10" @@ -7168,7 +7697,7 @@ micromatch@^3.1.4: snapdragon "^0.8.1" to-regex "^3.0.2" -micromatch@^4.0.2, micromatch@^4.0.4: +micromatch@^4.0.2: version "4.0.5" resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.5.tgz#bc8999a7cbbf77cdc89f132f6e467051b49090c6" integrity sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA== @@ -7176,6 +7705,14 @@ micromatch@^4.0.2, micromatch@^4.0.4: braces "^3.0.2" picomatch "^2.3.1" +micromatch@^4.0.4: + version "4.0.4" + resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.4.tgz#896d519dfe9db25fce94ceb7a500919bf881ebf9" + integrity sha512-pRmzw/XUcwXGpD9aI9q/0XOwLNygjETJ8y0ao0wdqprrzDa4YnxLcz7fQRZr8voh8V10kGhABbNcHVk5wHgWwg== + dependencies: + braces "^3.0.1" + picomatch "^2.2.3" + miller-rabin@^4.0.0: version "4.0.1" resolved "https://registry.yarnpkg.com/miller-rabin/-/miller-rabin-4.0.1.tgz#f080351c865b0dc562a8462966daa53543c78a4d" @@ -7201,20 +7738,20 @@ mime@1.6.0: resolved "https://registry.yarnpkg.com/mime/-/mime-1.6.0.tgz#32cd9e5c64553bd58d19a568af452acff04981b1" integrity sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg== +mimic-fn@^1.0.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-1.2.0.tgz#820c86a39334640e99516928bd03fca88057d022" + integrity sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ== + mimic-response@^1.0.0, mimic-response@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/mimic-response/-/mimic-response-1.0.1.tgz#4923538878eef42063cb8a3e3b0798781487ab1b" integrity sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ== -mimic-response@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/mimic-response/-/mimic-response-3.1.0.tgz#2d1d59af9c1b129815accc2c46a022a5ce1fa3c9" - integrity sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ== - min-document@^2.19.0: version "2.19.0" resolved "https://registry.yarnpkg.com/min-document/-/min-document-2.19.0.tgz#7bd282e3f5842ed295bb748cdd9f1ffa2c824685" - integrity sha512-9Wy1B3m3f66bPPmU5hdA4DR4PB2OfDU/+GS3yAB7IQozE3tqXaVv2zOjgla7MEGSRv95+ILmOuvhLkOK6wJtCQ== + integrity sha1-e9KC4/WELtKVu3SM3Z8f+iyCRoU= dependencies: dom-walk "^0.1.0" @@ -7226,40 +7763,40 @@ minimalistic-assert@^1.0.0, minimalistic-assert@^1.0.1: minimalistic-crypto-utils@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz#f6c00c1c0b082246e5c4d99dfb8c7c083b2b582a" - integrity sha512-JIYlbt6g8i5jKfJ3xz7rF0LXmv2TkDxBLUkiBeZ7bAx4GnnNMr8xFpGnOxn6GhTEHx3SjRrZEoU+j04prX1ktg== - -"minimatch@2 || 3", minimatch@^3.0.4, minimatch@^3.0.5, minimatch@^3.1.1, minimatch@^3.1.2: - version "3.1.2" - resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.1.2.tgz#19cd194bfd3e428f049a70817c038d89ab4be35b" - integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw== - dependencies: - brace-expansion "^1.1.7" + integrity sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo= -minimatch@3.0.4: +"minimatch@2 || 3", minimatch@3.0.4: version "3.0.4" resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083" integrity sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA== dependencies: brace-expansion "^1.1.7" -minimatch@5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-5.0.1.tgz#fb9022f7528125187c92bd9e9b6366be1cf3415b" - integrity sha512-nLDxIFRyhDblz3qMuq+SoRZED4+miJ/G+tdDrjkkkRnjAsBexeGpgjLEQ0blJy7rHhR2b93rhQY4SvyWu9v03g== +minimatch@4.2.1: + version "4.2.1" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-4.2.1.tgz#40d9d511a46bdc4e563c22c3080cde9c0d8299b4" + integrity sha512-9Uq1ChtSZO+Mxa/CL1eGizn2vRn3MlLgzhT0Iz8zaY8NdvxvB0d5QdPFmCKf7JKA9Lerx5vRrnwO03jsSfGG9g== dependencies: - brace-expansion "^2.0.1" + brace-expansion "^1.1.7" + +minimatch@^3.0.4, minimatch@^3.1.1, minimatch@^3.1.2: + version "3.1.2" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.1.2.tgz#19cd194bfd3e428f049a70817c038d89ab4be35b" + integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw== + dependencies: + brace-expansion "^1.1.7" minimatch@^5.0.1: - version "5.1.6" - resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-5.1.6.tgz#1cfcb8cf5522ea69952cd2af95ae09477f122a96" - integrity sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g== + version "5.1.0" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-5.1.0.tgz#1717b464f4971b144f6aabe8f2d0b8e4511e09c7" + integrity sha512-9TPBGGak4nHfGZsPBohm9AWg6NoT7QTCehS3BIJABslyZbzxfV78QM2Y6+i741OPZIafFAaiiEMh5OyIrJPgtg== dependencies: brace-expansion "^2.0.1" -minimist@^1.2.0, minimist@^1.2.5, minimist@^1.2.6, minimist@~1.2.7: - version "1.2.8" - resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.8.tgz#c1a464e7693302e082a075cee0c057741ac4772c" - integrity sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA== +minimist@^1.2.0, minimist@^1.2.5, minimist@^1.2.6, minimist@~1.2.5: + version "1.2.6" + resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.6.tgz#8637a5b759ea0d6e98702cfb3a9283323c93af44" + integrity sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q== minipass@^2.6.0, minipass@^2.9.0: version "2.9.0" @@ -7292,34 +7829,29 @@ mkdirp-classic@^0.5.2: mkdirp-promise@^5.0.1: version "5.0.1" resolved "https://registry.yarnpkg.com/mkdirp-promise/-/mkdirp-promise-5.0.1.tgz#e9b8f68e552c68a9c1713b84883f7a1dd039b8a1" - integrity sha512-Hepn5kb1lJPtVW84RFT40YG1OddBNTOVUZR2bzQUHc+Z03en8/3uX0+060JDhcEzyO08HmipsN9DcnFMxhIL9w== + integrity sha1-6bj2jlUsaKnBcTuEiD96HdA5uKE= dependencies: mkdirp "*" -mkdirp@*: - version "3.0.1" - resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-3.0.1.tgz#e44e4c5607fb279c168241713cc6e0fea9adcb50" - integrity sha512-+NsyUUAZDmo6YVHzL/stxSu3t9YS1iljliy3BSDrXJ/dkn1KYdmtZODGGjLcc9XLgVVpH4KshHB8XmZgMhaBXg== +mkdirp@*, mkdirp@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-1.0.4.tgz#3eb5ed62622756d79a5f0e2a221dfebad75c2f7e" + integrity sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw== -mkdirp@0.5.5: +mkdirp@0.5.5, mkdirp@0.5.x: version "0.5.5" resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.5.tgz#d91cefd62d1436ca0f41620e251288d420099def" integrity sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ== dependencies: minimist "^1.2.5" -mkdirp@0.5.x, mkdirp@^0.5.1, mkdirp@^0.5.3, mkdirp@^0.5.5: +mkdirp@^0.5.1, mkdirp@^0.5.3, mkdirp@^0.5.5: version "0.5.6" resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.6.tgz#7def03d2432dcae4ba1d611445c48396062255f6" integrity sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw== dependencies: minimist "^1.2.6" -mkdirp@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-1.0.4.tgz#3eb5ed62622756d79a5f0e2a221dfebad75c2f7e" - integrity sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw== - mnemonist@^0.38.0: version "0.38.5" resolved "https://registry.yarnpkg.com/mnemonist/-/mnemonist-0.38.5.tgz#4adc7f4200491237fe0fa689ac0b86539685cade" @@ -7327,33 +7859,6 @@ mnemonist@^0.38.0: dependencies: obliterator "^2.0.0" -mocha@^10.0.0: - version "10.2.0" - resolved "https://registry.yarnpkg.com/mocha/-/mocha-10.2.0.tgz#1fd4a7c32ba5ac372e03a17eef435bd00e5c68b8" - integrity sha512-IDY7fl/BecMwFHzoqF2sg/SHHANeBoMMXFlS9r0OXKDssYE1M5O43wUY/9BVPeIvfH2zmEbBfseqN9gBQZzXkg== - dependencies: - ansi-colors "4.1.1" - browser-stdout "1.3.1" - chokidar "3.5.3" - debug "4.3.4" - diff "5.0.0" - escape-string-regexp "4.0.0" - find-up "5.0.0" - glob "7.2.0" - he "1.2.0" - js-yaml "4.1.0" - log-symbols "4.1.0" - minimatch "5.0.1" - ms "2.1.3" - nanoid "3.3.3" - serialize-javascript "6.0.0" - strip-json-comments "3.1.1" - supports-color "8.1.1" - workerpool "6.2.1" - yargs "16.2.0" - yargs-parser "20.2.4" - yargs-unparser "2.0.0" - mocha@^7.1.1: version "7.2.0" resolved "https://registry.yarnpkg.com/mocha/-/mocha-7.2.0.tgz#01cc227b00d875ab1eed03a75106689cfed5a604" @@ -7384,20 +7889,45 @@ mocha@^7.1.1: yargs-parser "13.1.2" yargs-unparser "1.6.0" +mocha@^9.2.0: + version "9.2.2" + resolved "https://registry.yarnpkg.com/mocha/-/mocha-9.2.2.tgz#d70db46bdb93ca57402c809333e5a84977a88fb9" + integrity sha512-L6XC3EdwT6YrIk0yXpavvLkn8h+EU+Y5UcCHKECyMbdUIxyMuZj4bX4U9e1nvnvUUvQVsV2VHQr5zLdcUkhW/g== + dependencies: + "@ungap/promise-all-settled" "1.1.2" + ansi-colors "4.1.1" + browser-stdout "1.3.1" + chokidar "3.5.3" + debug "4.3.3" + diff "5.0.0" + escape-string-regexp "4.0.0" + find-up "5.0.0" + glob "7.2.0" + growl "1.10.5" + he "1.2.0" + js-yaml "4.1.0" + log-symbols "4.1.0" + minimatch "4.2.1" + ms "2.1.3" + nanoid "3.3.1" + serialize-javascript "6.0.0" + strip-json-comments "3.1.1" + supports-color "8.1.1" + which "2.0.2" + workerpool "6.2.0" + yargs "16.2.0" + yargs-parser "20.2.4" + yargs-unparser "2.0.0" + mock-fs@^4.1.0: version "4.14.0" resolved "https://registry.yarnpkg.com/mock-fs/-/mock-fs-4.14.0.tgz#ce5124d2c601421255985e6e94da80a7357b1b18" integrity sha512-qYvlv/exQ4+svI3UOvPUpLDF0OMX5euvUH0Ny4N5QyRyhNdgAgUrVH3iUINSzEPLvx0kbo/Bp28GJKIqvE7URw== -module-error@^1.0.1, module-error@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/module-error/-/module-error-1.0.2.tgz#8d1a48897ca883f47a45816d4fb3e3c6ba404d86" - integrity sha512-0yuvsqSCv8LbaOKhnsQ/T5JhyFlCYLPXK3U2sgV10zoKQwzs/MyfuQUOZQ1V/6OCOJsK/TRgNVrPuPDqtdMFtA== - ms@2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" - integrity sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A== + integrity sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g= ms@2.1.1: version "2.1.1" @@ -7463,15 +7993,20 @@ murmur-128@^0.2.1: fmix "^0.1.0" imul "^1.0.0" +mute-stream@0.0.7: + version "0.0.7" + resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.7.tgz#3075ce93bc21b8fab43e1bc4da7e8115ed1e7bab" + integrity sha1-MHXOk7whuPq0PhvE2n6BFe0ee6s= + nano-json-stream-parser@^0.1.2: version "0.1.2" resolved "https://registry.yarnpkg.com/nano-json-stream-parser/-/nano-json-stream-parser-0.1.2.tgz#0cc8f6d0e2b622b479c40d499c46d64b755c6f5f" - integrity sha512-9MqxMH/BSJC7dnLsEMPyfN5Dvoo49IsPFYMcHw3Bcfc2kN0lpHRBSzlMSVx4HGyJ7s9B31CyBTVehWJoQ8Ctew== + integrity sha1-DMj20OK2IrR5xA1JnEbWS3Vcb18= -nanoid@3.3.3: - version "3.3.3" - resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.3.tgz#fd8e8b7aa761fe807dba2d1b98fb7241bb724a25" - integrity sha512-p1sjXuopFs0xg+fPASzQ28agW1oHD7xDsd9Xkf3T15H3c/cifrFHVwrh74PdoklAPi+i7MdRsE47vm2r6JoB+w== +nanoid@3.3.1: + version "3.3.1" + resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.1.tgz#6347a18cac88af88f58af0b3594b723d5e99bb35" + integrity sha512-n6Vs/3KGyxPQd6uO0eH4Bv0ojGSUvuLlIHtC3Y0kEO23YRge8H9x1GCzLn28YX0H66pMkxuaeESFq4tKISKwdw== nanomatch@^1.2.9: version "1.2.13" @@ -7490,27 +8025,17 @@ nanomatch@^1.2.9: snapdragon "^0.8.1" to-regex "^3.0.1" -napi-macros@^2.2.2: - version "2.2.2" - resolved "https://registry.yarnpkg.com/napi-macros/-/napi-macros-2.2.2.tgz#817fef20c3e0e40a963fbf7b37d1600bd0201044" - integrity sha512-hmEVtAGYzVQpCKdbQea4skABsdXW4RUh5t5mJ2zzqowJS2OyXZTU1KhDVFhx+NlWZ4ap9mqR9TcDO3LTTttd+g== - -natural-compare-lite@^1.4.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/natural-compare-lite/-/natural-compare-lite-1.4.0.tgz#17b09581988979fddafe0201e931ba933c96cbb4" - integrity sha512-Tj+HTDSJJKaZnfiuw+iaF9skdPpTo2GtEly5JHnWV/hfv2Qj/9RKsGISQtLh2ox3l5EAGw487hnBee0sIJ6v2g== - natural-compare@^1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" - integrity sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw== + integrity sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc= negotiator@0.6.3: version "0.6.3" resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.3.tgz#58e323a72fedc0d6f9cd4d31fe49f51479590ccd" integrity sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg== -neo-async@^2.6.2: +neo-async@^2.6.0: version "2.6.2" resolved "https://registry.yarnpkg.com/neo-async/-/neo-async-2.6.2.tgz#b4aafb93e3aeb2d8174ca53cf163ab7d7308305f" integrity sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw== @@ -7545,20 +8070,13 @@ node-environment-flags@1.0.6: object.getownpropertydescriptors "^2.0.3" semver "^5.7.0" -node-fetch@2.6.7: +node-fetch@2.6.7, node-fetch@^2.6.1, node-fetch@^2.6.7: version "2.6.7" resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.6.7.tgz#24de9fba827e3b4ae44dc8b20256a379160052ad" integrity sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ== dependencies: whatwg-url "^5.0.0" -node-fetch@^2.6.1, node-fetch@^2.6.12, node-fetch@^2.6.7: - version "2.7.0" - resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.7.0.tgz#d0f0fa6e3e2dc1d27efcd8ad99d550bda94d187d" - integrity sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A== - dependencies: - whatwg-url "^5.0.0" - node-fetch@~1.7.1: version "1.7.3" resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-1.7.3.tgz#980f6f72d85211a5347c6b2bc18c5b84c3eb47ef" @@ -7568,19 +8086,19 @@ node-fetch@~1.7.1: is-stream "^1.0.1" node-gyp-build@^4.2.0, node-gyp-build@^4.3.0: - version "4.6.1" - resolved "https://registry.yarnpkg.com/node-gyp-build/-/node-gyp-build-4.6.1.tgz#24b6d075e5e391b8d5539d98c7fc5c210cac8a3e" - integrity sha512-24vnklJmyRS8ViBNI8KbtK/r/DmXQMRiOMXTNz2nrTnAYUwjmEEbnnpB/+kt+yWRv73bPsSPRFddrcIbAxSiMQ== + version "4.4.0" + resolved "https://registry.yarnpkg.com/node-gyp-build/-/node-gyp-build-4.4.0.tgz#42e99687ce87ddeaf3a10b99dc06abc11021f3f4" + integrity sha512-amJnQCcgtRVw9SvoebO3BKGESClrfXGCUTX9hSn1OuGQTQBOZmVd0Z0OlecpuRksKvbsUqALE8jls/ErClAPuQ== -nofilter@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/nofilter/-/nofilter-3.1.0.tgz#c757ba68801d41ff930ba2ec55bab52ca184aa66" - integrity sha512-l2NNj07e9afPnhAhvgVrCD/oy2Ai1yfLpuo3EpiO1jFTsB4sFz6oIfAfSZyQzVpkZQ9xS8ZS5g1jCBgq4Hwo0g== +nofilter@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/nofilter/-/nofilter-1.0.4.tgz#78d6f4b6a613e7ced8b015cec534625f7667006e" + integrity sha512-N8lidFp+fCz+TD51+haYdbDGrcBWwuHX40F5+z0qkUjMJ5Tp+rdSuAkMJ9N9eoolDlEVTf6u5icM+cNKkKW2mA== nopt@3.x: version "3.0.6" resolved "https://registry.yarnpkg.com/nopt/-/nopt-3.0.6.tgz#c6465dbf08abcd4db359317f79ac68a646b28ff9" - integrity sha512-4GUt3kSEYmk4ITxzB/b9vaIDfUVWN/Ml1Fwl11IlnIG2iaJ9O6WXZ9SrYM9NLI8OCBieN2Y8SWC2oJV0RQ7qYg== + integrity sha1-xkZdvwirzU2zWTF/eaxopkayj/k= dependencies: abbrev "1" @@ -7604,11 +8122,6 @@ normalize-url@^4.1.0: resolved "https://registry.yarnpkg.com/normalize-url/-/normalize-url-4.5.1.tgz#0dd90cf1288ee1d1313b87081c9a5932ee48518a" integrity sha512-9UZCFRHQdNrfTpGg8+1INIg93B6zE0aXMVFkw1WFwvO4SlZywU6aLg5Of0Ap/PgcbSw4LNxvMWXMeugwMCX0AA== -normalize-url@^6.0.1: - version "6.1.0" - resolved "https://registry.yarnpkg.com/normalize-url/-/normalize-url-6.1.0.tgz#40d0885b535deffe3f3147bec877d05fe4c5668a" - integrity sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A== - nth-check@^2.0.1: version "2.1.1" resolved "https://registry.yarnpkg.com/nth-check/-/nth-check-2.1.1.tgz#c9eab428effce36cd6b92c924bdb000ef1f1ed1d" @@ -7619,12 +8132,12 @@ nth-check@^2.0.1: number-is-nan@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/number-is-nan/-/number-is-nan-1.0.1.tgz#097b602b53422a522c1afb8790318336941a011d" - integrity sha512-4jbtZXNAsfZbAHiiqjLPBiCl16dES1zI4Hpzzxw61Tk+loF+sBDBKx1ICKKKwIqQ7M0mFn1TmkN7euSncWgHiQ== + integrity sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0= number-to-bn@1.7.0: version "1.7.0" resolved "https://registry.yarnpkg.com/number-to-bn/-/number-to-bn-1.7.0.tgz#bb3623592f7e5f9e0030b1977bd41a0c53fe1ea0" - integrity sha512-wsJ9gfSz1/s4ZsJN01lyonwuxA1tml6X1yBDnfpMglypcBRFZZkus26EdPSlqS5GJfYddVZa22p3VNb3z5m5Ig== + integrity sha1-uzYjWS9+X54AMLGXe9QaDFP+HqA= dependencies: bn.js "4.11.6" strip-hex-prefix "1.0.0" @@ -7637,21 +8150,21 @@ oauth-sign@~0.9.0: object-assign@^4, object-assign@^4.0.0, object-assign@^4.1.0, object-assign@^4.1.1: version "4.1.1" resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" - integrity sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg== + integrity sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM= object-copy@^0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/object-copy/-/object-copy-0.1.0.tgz#7e7d858b781bd7c991a41ba975ed3812754e998c" - integrity sha512-79LYn6VAb63zgtmAteVOWo9Vdj71ZVBy3Pbse+VqxDpEP83XuujMrGqHIwAXJ5I/aM0zU7dIyIAhifVTPrNItQ== + integrity sha1-fn2Fi3gb18mRpBupde04EnVOmYw= dependencies: copy-descriptor "^0.1.0" define-property "^0.2.5" kind-of "^3.0.3" -object-inspect@^1.12.3, object-inspect@^1.9.0, object-inspect@~1.12.3: - version "1.12.3" - resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.12.3.tgz#ba62dffd67ee256c8c086dfae69e016cd1f198b9" - integrity sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g== +object-inspect@^1.11.0, object-inspect@^1.12.0, object-inspect@^1.9.0, object-inspect@~1.12.0: + version "1.12.0" + resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.12.0.tgz#6e2c120e868fd1fd18cb4f18c31741d0d6e776f0" + integrity sha512-Ho2z80bVIvJloH+YzRmpZVQe87+qASmBUKZDWgx9cu+KDrX2ZDH/3tMy+gXbZETVGs2M8YdxObOh7XAtim9Y0g== object-is@^1.0.1: version "1.1.5" @@ -7661,7 +8174,7 @@ object-is@^1.0.1: call-bind "^1.0.2" define-properties "^1.1.3" -object-keys@^1.0.11, object-keys@^1.1.1: +object-keys@^1.0.11, object-keys@^1.0.12, object-keys@^1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.1.1.tgz#1c47f272df277f3b1daf061677d9c82e2322c60e" integrity sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA== @@ -7669,12 +8182,12 @@ object-keys@^1.0.11, object-keys@^1.1.1: object-keys@~0.4.0: version "0.4.0" resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-0.4.0.tgz#28a6aae7428dd2c3a92f3d95f21335dd204e0336" - integrity sha512-ncrLw+X55z7bkl5PnUvHwFK9FcGuFYo9gtjws2XtSzL+aZ8tm830P60WJ0dSmFVaSalWieW5MD7kEdnXda9yJw== + integrity sha1-KKaq50KN0sOpLz2V8hM13SBOAzY= object-visit@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/object-visit/-/object-visit-1.0.1.tgz#f79c4493af0c5377b59fe39d395e41042dd045bb" - integrity sha512-GBaMwwAVK9qbQN3Scdo0OyvgPW7l3lnaVMj84uTOZlswkX0KpF6fyDBJhtTthf7pymztoN36/KEr1DyhF96zEA== + integrity sha1-95xEk68MU3e1n+OdOV5BBC3QRbs= dependencies: isobject "^3.0.0" @@ -7688,50 +8201,48 @@ object.assign@4.1.0: has-symbols "^1.0.0" object-keys "^1.0.11" -object.assign@^4.1.4: - version "4.1.4" - resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.4.tgz#9673c7c7c351ab8c4d0b516f4343ebf4dfb7799f" - integrity sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ== +object.assign@^4.1.2: + version "4.1.2" + resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.2.tgz#0ed54a342eceb37b38ff76eb831a0e788cb63940" + integrity sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ== dependencies: - call-bind "^1.0.2" - define-properties "^1.1.4" - has-symbols "^1.0.3" + call-bind "^1.0.0" + define-properties "^1.1.3" + has-symbols "^1.0.1" object-keys "^1.1.1" -object.getownpropertydescriptors@^2.0.3, object.getownpropertydescriptors@^2.1.6: - version "2.1.7" - resolved "https://registry.yarnpkg.com/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.7.tgz#7a466a356cd7da4ba8b9e94ff6d35c3eeab5d56a" - integrity sha512-PrJz0C2xJ58FNn11XV2lr4Jt5Gzl94qpy9Lu0JlfEj14z88sqbSBJCBEzdlNUCzY2gburhbrwOZ5BHCmuNUy0g== +object.getownpropertydescriptors@^2.0.3, object.getownpropertydescriptors@^2.1.1: + version "2.1.3" + resolved "https://registry.yarnpkg.com/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.3.tgz#b223cf38e17fefb97a63c10c91df72ccb386df9e" + integrity sha512-VdDoCwvJI4QdC6ndjpqFmoL3/+HxffFBbcJzKi5hwLLqqx3mdbedRpfZDdK0SrOSauj8X4GzBvnDZl4vTN7dOw== dependencies: - array.prototype.reduce "^1.0.6" call-bind "^1.0.2" - define-properties "^1.2.0" - es-abstract "^1.22.1" - safe-array-concat "^1.0.0" + define-properties "^1.1.3" + es-abstract "^1.19.1" object.pick@^1.3.0: version "1.3.0" resolved "https://registry.yarnpkg.com/object.pick/-/object.pick-1.3.0.tgz#87a10ac4c1694bd2e1cbf53591a66141fb5dd747" - integrity sha512-tqa/UMy/CCoYmj+H5qc07qvSL9dqcs/WZENZ1JbtWBlATP+iVOe778gE6MSijnyCnORzDuX6hU+LA4SZ09YjFQ== + integrity sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c= dependencies: isobject "^3.0.1" obliterator@^2.0.0: - version "2.0.4" - resolved "https://registry.yarnpkg.com/obliterator/-/obliterator-2.0.4.tgz#fa650e019b2d075d745e44f1effeb13a2adbe816" - integrity sha512-lgHwxlxV1qIg1Eap7LgIeoBWIMFibOjbrYPIPJZcI1mmGAI2m3lNYpK12Y+GBdPQ0U1hRwSord7GIaawz962qQ== + version "2.0.2" + resolved "https://registry.yarnpkg.com/obliterator/-/obliterator-2.0.2.tgz#25f50dc92e1181371b9d8209d11890f1a3c2fc21" + integrity sha512-g0TrA7SbUggROhDPK8cEu/qpItwH2LSKcNl4tlfBNT54XY+nOsqrs0Q68h1V9b3HOSpIWv15jb1lax2hAggdIg== oboe@2.1.4: version "2.1.4" resolved "https://registry.yarnpkg.com/oboe/-/oboe-2.1.4.tgz#20c88cdb0c15371bb04119257d4fdd34b0aa49f6" - integrity sha512-ymBJ4xSC6GBXLT9Y7lirj+xbqBLa+jADGJldGEYG7u8sZbS9GyG+u1Xk9c5cbriKwSpCg41qUhPjvU5xOpvIyQ== + integrity sha1-IMiM2wwVNxuwQRklfU/dNLCqSfY= dependencies: http-https "^1.0.0" oboe@2.1.5: version "2.1.5" resolved "https://registry.yarnpkg.com/oboe/-/oboe-2.1.5.tgz#5554284c543a2266d7a38f17e073821fbde393cd" - integrity sha512-zRFWiF+FoicxEs3jNI/WYUrVEgA7DeET/InK0XQuudGHRg8iIob3cNPrJTKaz4004uaA9Pbe+Dwa8iluhjLZWA== + integrity sha1-VVQoTFQ6ImbXo48X4HOCH73jk80= dependencies: http-https "^1.0.0" @@ -7742,13 +8253,27 @@ on-finished@2.4.1: dependencies: ee-first "1.1.1" +on-finished@~2.3.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/on-finished/-/on-finished-2.3.0.tgz#20f1336481b083cd75337992a16971aa2d906947" + integrity sha1-IPEzZIGwg811M3mSoWlxqi2QaUc= + dependencies: + ee-first "1.1.1" + once@1.x, once@^1.3.0, once@^1.3.1, once@^1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" - integrity sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w== + integrity sha1-WDsap3WWHUsROsF9nFC6753Xa9E= dependencies: wrappy "1" +onetime@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/onetime/-/onetime-2.0.1.tgz#067428230fd67443b2794b22bba528b6867962d4" + integrity sha1-BnQoIw/WdEOyeUsiu6UotoZ5YtQ= + dependencies: + mimic-fn "^1.0.0" + open@^7.4.2: version "7.4.2" resolved "https://registry.yarnpkg.com/open/-/open-7.4.2.tgz#b8147e26dcf3e426316c730089fd71edd29c2321" @@ -7757,7 +8282,7 @@ open@^7.4.2: is-docker "^2.0.0" is-wsl "^2.1.1" -optionator@^0.8.1: +optionator@^0.8.1, optionator@^0.8.2: version "0.8.3" resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.8.3.tgz#84fa1d036fe9d3c7e21d99884b601167ec8fb495" integrity sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA== @@ -7769,49 +8294,49 @@ optionator@^0.8.1: type-check "~0.3.2" word-wrap "~1.2.3" -optionator@^0.9.3: - version "0.9.3" - resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.9.3.tgz#007397d44ed1872fdc6ed31360190f81814e2c64" - integrity sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg== +optionator@^0.9.1: + version "0.9.1" + resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.9.1.tgz#4f236a6373dae0566a6d43e1326674f50c291499" + integrity sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw== dependencies: - "@aashutoshrathi/word-wrap" "^1.2.3" deep-is "^0.1.3" fast-levenshtein "^2.0.6" levn "^0.4.1" prelude-ls "^1.2.1" type-check "^0.4.0" + word-wrap "^1.2.3" os-homedir@^1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/os-homedir/-/os-homedir-1.0.2.tgz#ffbc4988336e0e833de0c168c7ef152121aa7fb3" - integrity sha512-B5JU3cabzk8c67mRRd3ECmROafjYMXbuzlwtqdM8IbS8ktlTix8aFGb2bAGKrSRIlnfKwovGUUr72JUPyOb6kQ== + integrity sha1-/7xJiDNuDoM94MFox+8VISGqf7M= os-locale@^1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/os-locale/-/os-locale-1.4.0.tgz#20f9f17ae29ed345e8bde583b13d2009803c14d9" - integrity sha512-PRT7ZORmwu2MEFt4/fv3Q+mEfN4zetKxufQrkShY2oGvUms9r8otu5HfdyIFHkYXjO7laNsoVGmM2MANfuTA8g== + integrity sha1-IPnxeuKe00XoveWDsT0gCYA8FNk= dependencies: lcid "^1.0.0" os-tmpdir@^1.0.1, os-tmpdir@~1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274" - integrity sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g== + integrity sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ= + +p-cancelable@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/p-cancelable/-/p-cancelable-0.3.0.tgz#b9e123800bcebb7ac13a479be195b507b98d30fa" + integrity sha512-RVbZPLso8+jFeq1MfNvgXtCRED2raz/dKpacfTNxsx6pLEpEomM7gah6VeHSYV3+vo0OAi4MkArtQcWWXuQoyw== p-cancelable@^1.0.0: version "1.1.0" resolved "https://registry.yarnpkg.com/p-cancelable/-/p-cancelable-1.1.0.tgz#d078d15a3af409220c886f1d9a0ca2e441ab26cc" integrity sha512-s73XxOZ4zpt1edZYZzvhqFa6uvQc1vwUa0K0BdtIZgQMAJj9IbebH+JkgKZc9h+B05PKHLOTl4ajG1BmNrVZlw== -p-cancelable@^2.0.0: - version "2.1.1" - resolved "https://registry.yarnpkg.com/p-cancelable/-/p-cancelable-2.1.1.tgz#aab7fbd416582fa32a3db49859c122487c5ed2cf" - integrity sha512-BZOr3nRQHOntUjTrH8+Lh54smKHoHyur8We1V8DSMVrl5A2malOOwuJRnKRDjSnkoeBh4at6BwEnb5I7Jl31wg== - -p-cancelable@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/p-cancelable/-/p-cancelable-3.0.0.tgz#63826694b54d61ca1c20ebcb6d3ecf5e14cd8050" - integrity sha512-mlVgR3PGuzlo0MmTdk4cXqXWlwQDLnONTAg6sm62XkMJEiRxN3GL3SffkYvqwonbkJBcrI7Uvv5Zh9yjvn2iUw== +p-finally@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/p-finally/-/p-finally-1.0.0.tgz#3fbcfb15b899a44123b34b6dcc18b724336a2cae" + integrity sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4= p-limit@^1.1.0: version "1.3.0" @@ -7837,7 +8362,7 @@ p-limit@^3.0.2: p-locate@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-2.0.0.tgz#20a0103b222a70c8fd39cc2e580680f3dde5ec43" - integrity sha512-nQja7m7gSKuewoVRen45CtVfODR3crN3goVQ0DDZ9N3yHxgpkuBhZqsaiotSQRrADUrne346peY7kT3TSACykg== + integrity sha1-IKAQOyIqcMj9OcwuWAaA893l7EM= dependencies: p-limit "^1.1.0" @@ -7869,10 +8394,17 @@ p-map@^4.0.0: dependencies: aggregate-error "^3.0.0" +p-timeout@^1.1.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/p-timeout/-/p-timeout-1.2.1.tgz#5eb3b353b7fce99f101a1038880bb054ebbea386" + integrity sha1-XrOzU7f86Z8QGhA4iAuwVOu+o4Y= + dependencies: + p-finally "^1.0.0" + p-try@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/p-try/-/p-try-1.0.0.tgz#cbc79cdbaf8fd4228e13f621f2b1a237c1b207b3" - integrity sha512-U1etNYuMJoIz3ZXSrrySFjsXQTWOx2/jdi86L+2pRvph/qMKL6sbcCYdH23fqsbm8TH2Gn0OybpT4eSFlCVHww== + integrity sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M= p-try@^2.0.0: version "2.2.0" @@ -7900,7 +8432,7 @@ parse-asn1@^5.0.0, parse-asn1@^5.1.5: parse-cache-control@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/parse-cache-control/-/parse-cache-control-1.0.1.tgz#8eeab3e54fa56920fe16ba38f77fa21aacc2d74e" - integrity sha512-60zvsJReQPX5/QP0Kzfd/VrpjScIQ7SHBW6bFCYfEP+fp0Eppr1SHhIO5nd1PjZtvclzSzES9D/p5nFJurwfWg== + integrity sha1-juqz5U+laSD+Fro493+iGqzC104= parse-headers@^2.0.0: version "2.0.5" @@ -7910,19 +8442,17 @@ parse-headers@^2.0.0: parse-json@^2.2.0: version "2.2.0" resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-2.2.0.tgz#f480f40434ef80741f8469099f8dea18f55a4dc9" - integrity sha512-QR/GGaKCkhwk1ePQNYDRKYZ3mwU9ypsKhB0XyFnLQdomyEqk3e8wpW3V5Jp88zbxK4n5ST1nqo+g9juTpownhQ== + integrity sha1-9ID0BDTvgHQfhGkJn43qGPVaTck= dependencies: error-ex "^1.2.0" -parse-json@^5.2.0: - version "5.2.0" - resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-5.2.0.tgz#c76fc66dee54231c962b22bcc8a72cf2f99753cd" - integrity sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg== +parse-json@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-4.0.0.tgz#be35f5425be1f7f6c747184f98a788cb99477ee0" + integrity sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA= dependencies: - "@babel/code-frame" "^7.0.0" error-ex "^1.3.1" - json-parse-even-better-errors "^2.3.0" - lines-and-columns "^1.1.6" + json-parse-better-errors "^1.0.1" parse5-htmlparser2-tree-adapter@^7.0.0: version "7.0.0" @@ -7933,9 +8463,9 @@ parse5-htmlparser2-tree-adapter@^7.0.0: parse5 "^7.0.0" parse5@^7.0.0: - version "7.1.2" - resolved "https://registry.yarnpkg.com/parse5/-/parse5-7.1.2.tgz#0736bebbfd77793823240a23b7fc5e010b7f8e32" - integrity sha512-Czj1WaSVpaoj0wbhMzLmWD69anp2WH7FXMB9n1Sy8/ZFF9jolSQVMu1Ij5WIyGmcBmhk7EOndpO4mIpihVqAXw== + version "7.1.1" + resolved "https://registry.yarnpkg.com/parse5/-/parse5-7.1.1.tgz#4649f940ccfb95d8754f37f73078ea20afe0c746" + integrity sha512-kwpuwzB+px5WUg9pyK0IcK/shltJN5/OVhQagxhCQNtT9Y9QRZqNY2e1cmbu/paRh5LMnz/oVTVLBpjFmMZhSg== dependencies: entities "^4.4.0" @@ -7947,7 +8477,7 @@ parseurl@~1.3.3: pascalcase@^0.1.1: version "0.1.1" resolved "https://registry.yarnpkg.com/pascalcase/-/pascalcase-0.1.1.tgz#b363e55e8006ca6fe21784d2db22bd15d7917f14" - integrity sha512-XHXfu/yOQRy9vYOtUDVMN60OEJjW013GoObG1o+xwQTpB9eYJX/BjXMsdW13ZDPruFhYYn0AG22w0xgQMwl3Nw== + integrity sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ= patch-package@6.2.2: version "6.2.2" @@ -7968,24 +8498,23 @@ patch-package@6.2.2: tmp "^0.0.33" patch-package@^6.2.2, patch-package@^6.4.7: - version "6.5.1" - resolved "https://registry.yarnpkg.com/patch-package/-/patch-package-6.5.1.tgz#3e5d00c16997e6160291fee06a521c42ac99b621" - integrity sha512-I/4Zsalfhc6bphmJTlrLoOcAF87jcxko4q0qsv4bGcurbr8IskEOtdnt9iCmsQVGL1B+iUhSQqweyTLJfCF9rA== + version "6.4.7" + resolved "https://registry.yarnpkg.com/patch-package/-/patch-package-6.4.7.tgz#2282d53c397909a0d9ef92dae3fdeb558382b148" + integrity sha512-S0vh/ZEafZ17hbhgqdnpunKDfzHQibQizx9g8yEf5dcVk3KOflOfdufRXQX8CSEkyOQwuM/bNz1GwKvFj54kaQ== dependencies: "@yarnpkg/lockfile" "^1.1.0" - chalk "^4.1.2" + chalk "^2.4.2" cross-spawn "^6.0.5" find-yarn-workspace-root "^2.0.0" - fs-extra "^9.0.0" + fs-extra "^7.0.1" is-ci "^2.0.0" klaw-sync "^6.0.0" - minimist "^1.2.6" + minimist "^1.2.0" open "^7.4.2" rimraf "^2.6.3" semver "^5.6.0" slash "^2.0.0" tmp "^0.0.33" - yaml "^1.10.2" path-browserify@^1.0.0: version "1.0.1" @@ -7995,14 +8524,14 @@ path-browserify@^1.0.0: path-exists@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-2.1.0.tgz#0feb6c64f0fc518d9a754dd5efb62c7022761f4b" - integrity sha512-yTltuKuhtNeFJKa1PiRzfLAU5182q1y4Eb4XCJ3PBqyzEDkAZRzBrKKBct682ls9reBVHf9udYLN5Nd+K1B9BQ== + integrity sha1-D+tsZPD8UY2adU3V77YscCJ2H0s= dependencies: pinkie-promise "^2.0.0" path-exists@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-3.0.0.tgz#ce0ebeaa5f78cb18925ea7d810d7b59b010fd515" - integrity sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ== + integrity sha1-zg6+ql94yxiSXqfYENe1mwEP1RU= path-exists@^4.0.0: version "4.0.0" @@ -8012,12 +8541,17 @@ path-exists@^4.0.0: path-is-absolute@^1.0.0, path-is-absolute@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" - integrity sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg== + integrity sha1-F0uSaHNVNP+8es5r9TpanhtcX18= + +path-is-inside@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/path-is-inside/-/path-is-inside-1.0.2.tgz#365417dede44430d1c11af61027facf074bdfc53" + integrity sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM= path-key@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/path-key/-/path-key-2.0.1.tgz#411cadb574c5a140d3a4b1910d40d80cc9f40b40" - integrity sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw== + integrity sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A= path-key@^3.1.0: version "3.1.1" @@ -8032,12 +8566,12 @@ path-parse@^1.0.6, path-parse@^1.0.7: path-to-regexp@0.1.7: version "0.1.7" resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-0.1.7.tgz#df604178005f522f15eb4490e7247a1bfaa67f8c" - integrity sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ== + integrity sha1-32BBeABfUi8V60SQ5yR6G/qmf4w= path-type@^1.0.0: version "1.1.0" resolved "https://registry.yarnpkg.com/path-type/-/path-type-1.1.0.tgz#59c44f7ee491da704da415da5a4070ba4f8fe441" - integrity sha512-S4eENJz1pkiQn9Znv33Q+deTOKmbl+jj1Fl+qiP/vYezj+S8x+J3Uo0ISrx/QoEvIlOaDWJhPaRd1flJ9HXZqg== + integrity sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE= dependencies: graceful-fs "^4.1.2" pify "^2.0.0" @@ -8072,9 +8606,9 @@ pend@~1.2.0: performance-now@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/performance-now/-/performance-now-2.1.0.tgz#6309f4e0e5fa913ec1c69307ae364b4b377c9e7b" - integrity sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow== + integrity sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns= -picomatch@^2.0.4, picomatch@^2.2.1, picomatch@^2.3.1: +picomatch@^2.0.4, picomatch@^2.2.1, picomatch@^2.2.3, picomatch@^2.3.1: version "2.3.1" resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42" integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== @@ -8082,7 +8616,7 @@ picomatch@^2.0.4, picomatch@^2.2.1, picomatch@^2.3.1: pify@^2.0.0, pify@^2.3.0: version "2.3.0" resolved "https://registry.yarnpkg.com/pify/-/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c" - integrity sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog== + integrity sha1-7RQaasBDqEnqWISY59yosVMw6Qw= pify@^4.0.1: version "4.0.1" @@ -8092,14 +8626,14 @@ pify@^4.0.1: pinkie-promise@^2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/pinkie-promise/-/pinkie-promise-2.0.1.tgz#2135d6dfa7a358c069ac9b178776288228450ffa" - integrity sha512-0Gni6D4UcLTbv9c57DfxDGdr41XfgUjqWZu492f0cIGr16zDU06BWP/RAEvOuo7CQ0CNjHaLlM59YJJFm3NWlw== + integrity sha1-ITXW36ejWMBprJsXh3YogihFD/o= dependencies: pinkie "^2.0.0" pinkie@^2.0.0: version "2.0.4" resolved "https://registry.yarnpkg.com/pinkie/-/pinkie-2.0.4.tgz#72556b80cfa0d48a974e80e77248e80ed4f7f870" - integrity sha512-MnUuEycAemtSaeFSjXKW/aroV7akBbY+Sv+RkyqFjgAe73F+MR0TBWKBRDkmfWq/HiFmdavfZ1G7h4SPZXaCSg== + integrity sha1-clVrgM+g1IqXToDnckjoDtT3+HA= pkg-dir@4.2.0: version "4.2.0" @@ -8108,11 +8642,6 @@ pkg-dir@4.2.0: dependencies: find-up "^4.0.0" -pluralize@^8.0.0: - version "8.0.0" - resolved "https://registry.yarnpkg.com/pluralize/-/pluralize-8.0.0.tgz#1a6fa16a38d12a1901e0320fa017051c539ce3b1" - integrity sha512-Nc3IT5yHzflTfbjgqWcCPpo7DaKy4FnpB0l/zCAW0Tc7jxAiuqSxHasntB3D7887LSrA93kDJ9IXovxJYxyLCA== - pollock@^0.2.0: version "0.2.1" resolved "https://registry.yarnpkg.com/pollock/-/pollock-0.2.1.tgz#01273ae3542511492d07f1c10fa53f149b37c6ad" @@ -8121,7 +8650,7 @@ pollock@^0.2.0: posix-character-classes@^0.1.0: version "0.1.1" resolved "https://registry.yarnpkg.com/posix-character-classes/-/posix-character-classes-0.1.1.tgz#01eac0fe3b5af71a2a6c02feabb8c1fef7e00eab" - integrity sha512-xTgYBc3fuo7Yt7JbiuFxSYGToMoz8fLoE6TC9Wx1P/u+LfeThMOAqmuyECnlBaaJb+u1m9hHiXUEtwW4OzfUJg== + integrity sha1-AerA/jta9xoqbAL+q7jB/vfgDqs= postinstall-postinstall@^2.1.0: version "2.1.0" @@ -8131,7 +8660,7 @@ postinstall-postinstall@^2.1.0: precond@0.2: version "0.2.3" resolved "https://registry.yarnpkg.com/precond/-/precond-0.2.3.tgz#aa9591bcaa24923f1e0f4849d240f47efc1075ac" - integrity sha512-QCYG84SgGyGzqJ/vlMsxeXd/pgL/I94ixdNFyh1PusWmTCyVfPJjZ1K1jvHtsbfnXQs2TSkEP2fR7QiMZAnKFQ== + integrity sha1-qpWRvKokkj8eD0hJ0kD0fvwQdaw= prelude-ls@^1.2.1: version "1.2.1" @@ -8141,12 +8670,17 @@ prelude-ls@^1.2.1: prelude-ls@~1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.1.2.tgz#21932a549f5e52ffd9a827f570e04be62a97da54" - integrity sha512-ESF23V4SKG6lVSGZgYNpbsiaAkdab6ZgOxe52p7+Kid3W3u3bxR4Vfd/o21dmN7jSt0IwgZ4v5MUd26FEtXE9w== + integrity sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ= + +prepend-http@^1.0.1: + version "1.0.4" + resolved "https://registry.yarnpkg.com/prepend-http/-/prepend-http-1.0.4.tgz#d4f4562b0ce3696e41ac52d0e002e57a635dc6dc" + integrity sha1-1PRWKwzjaW5BrFLQ4ALlemNdxtw= prepend-http@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/prepend-http/-/prepend-http-2.0.0.tgz#e92434bfa5ea8c19f41cdfd401d741a3c819d897" - integrity sha512-ravE6m9Atw9Z/jjttRUZ+clIXogdghyZAuWJ3qEzjT+jI/dL1ifAqhZeC5VHzQp1MSt1+jxKkFNemj/iO7tVUA== + integrity sha1-6SQ0v6XqjBn0HN/UAddBo8gZ2Jc= prettier-linter-helpers@^1.0.0: version "1.0.0" @@ -8156,18 +8690,31 @@ prettier-linter-helpers@^1.0.0: fast-diff "^1.1.2" prettier-plugin-solidity@^1.0.0-beta.19: - version "1.1.3" - resolved "https://registry.yarnpkg.com/prettier-plugin-solidity/-/prettier-plugin-solidity-1.1.3.tgz#9a35124f578404caf617634a8cab80862d726cba" - integrity sha512-fQ9yucPi2sBbA2U2Xjh6m4isUTJ7S7QLc/XDDsktqqxYfTwdYKJ0EnnywXHwCGAaYbQNK+HIYPL1OemxuMsgeg== + version "1.0.0-beta.19" + resolved "https://registry.yarnpkg.com/prettier-plugin-solidity/-/prettier-plugin-solidity-1.0.0-beta.19.tgz#7c3607fc4028f5e6a425259ff03e45eedf733df3" + integrity sha512-xxRQ5ZiiZyUoMFLE9h7HnUDXI/daf1tnmL1msEdcKmyh7ZGQ4YklkYLC71bfBpYU2WruTb5/SFLUaEb3RApg5g== dependencies: - "@solidity-parser/parser" "^0.16.0" - semver "^7.3.8" + "@solidity-parser/parser" "^0.14.0" + emoji-regex "^10.0.0" + escape-string-regexp "^4.0.0" + semver "^7.3.5" solidity-comments-extractor "^0.0.7" + string-width "^4.2.3" -prettier@^2.1.2, prettier@^2.3.1, prettier@^2.5.1, prettier@^2.8.3: - version "2.8.8" - resolved "https://registry.yarnpkg.com/prettier/-/prettier-2.8.8.tgz#e8c5d7e98a4305ffe3de2e1fc4aca1a71c28b1da" - integrity sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q== +prettier@^1.14.3: + version "1.19.1" + resolved "https://registry.yarnpkg.com/prettier/-/prettier-1.19.1.tgz#f7d7f5ff8a9cd872a7be4ca142095956a60797cb" + integrity sha512-s7PoyDv/II1ObgQunCbB9PdLmUcBZcnWOcxDh7O0N/UwDEsHyqkW+Qh28jW+mVuCdx7gLB0BotYI1Y6uI9iyew== + +prettier@^2.1.2, prettier@^2.3.1: + version "2.6.2" + resolved "https://registry.yarnpkg.com/prettier/-/prettier-2.6.2.tgz#e26d71a18a74c3d0f0597f55f01fb6c06c206032" + integrity sha512-PkUpF+qoXTqhOeWL9fu7As8LXsIUZ1WYaJiY/a7McAQzxjk82OF0tibkFXVCDImZtWxbvojFjerkiLb0/q8mew== + +prettier@^2.5.1: + version "2.7.1" + resolved "https://registry.yarnpkg.com/prettier/-/prettier-2.7.1.tgz#e235806850d057f97bb08368a4f7d899f7760c64" + integrity sha512-ujppO+MkdPqoVINuDFDRLClm7D78qbDt0/NR+wp5FqEZOoTNAjPHWj17QRhu7geIHJfcNhRk1XVQmF8Bp3ye+g== private@^0.1.6, private@^0.1.8: version "0.1.8" @@ -8182,9 +8729,9 @@ process-nextick-args@~2.0.0: process@^0.11.10: version "0.11.10" resolved "https://registry.yarnpkg.com/process/-/process-0.11.10.tgz#7332300e840161bda3e69a1d1d91a7d4bc16f182" - integrity sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A== + integrity sha1-czIwDoQBYb2j5podHZGn1LwW8YI= -progress@2.0.3: +progress@2.0.3, progress@^2.0.0: version "2.0.3" resolved "https://registry.yarnpkg.com/progress/-/progress-2.0.3.tgz#7e8cf8d8f5b8f239c1bc68beb4eb78567d572ef8" integrity sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA== @@ -8192,15 +8739,15 @@ progress@2.0.3: promise-to-callback@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/promise-to-callback/-/promise-to-callback-1.0.0.tgz#5d2a749010bfb67d963598fcd3960746a68feef7" - integrity sha512-uhMIZmKM5ZteDMfLgJnoSq9GCwsNKrYau73Awf1jIy6/eUcuuZ3P+CD9zUv0kJsIUbU+x6uLNIhXhLHDs1pNPA== + integrity sha1-XSp0kBC/tn2WNZj805YHRqaP7vc= dependencies: is-fn "^1.0.0" set-immediate-shim "^1.0.1" promise@^8.0.0: - version "8.3.0" - resolved "https://registry.yarnpkg.com/promise/-/promise-8.3.0.tgz#8cb333d1edeb61ef23869fbb8a4ea0279ab60e0a" - integrity sha512-rZPNPKTOYVNEEKFaq1HqTgOwZD+4/YHS5ukLzQCypkj+OkYx7iv0mA91lJlpPPZ8vMau3IIGj5Qlwrx+8iiSmg== + version "8.1.0" + resolved "https://registry.yarnpkg.com/promise/-/promise-8.1.0.tgz#697c25c3dfe7435dd79fcd58c38a135888eaf05e" + integrity sha512-W04AqnILOL/sPRXziNicCjSNRruLAuIHEOVBazepu0545DDNGYHz7ar9ZgZ1fMU8/MA4mVxp5rkBWRi6OXIy3Q== dependencies: asap "~2.0.6" @@ -8220,17 +8767,17 @@ proxy-from-env@1.1.0: prr@~1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/prr/-/prr-1.0.1.tgz#d3fc114ba06995a45ec6893f484ceb1d78f5f476" - integrity sha512-yPw4Sng1gWghHQWj0B3ZggWUm4qVbPwPFcRG8KyxiU7J2OHFSoEHKS+EZ3fv5l1t9CyCiop6l/ZYeWbrgoQejw== + integrity sha1-0/wRS6BplaRexok/SEzrHXj19HY= pseudomap@^1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/pseudomap/-/pseudomap-1.0.2.tgz#f052a28da70e618917ef0a8ac34c1ae5a68286b3" - integrity sha512-b/YwNhb8lk1Zz2+bXXpS/LK9OisiZZ1SNsSLxN1x2OXVEhW2Ckr/7mWE5vrC1ZTiJlD9g19jWszTmJsB+oEpFQ== + integrity sha1-8FKijacOYYkX7wqKw0wa5aaChrM= psl@^1.1.28: - version "1.9.0" - resolved "https://registry.yarnpkg.com/psl/-/psl-1.9.0.tgz#d0df2a137f00794565fcaf3b2c00cd09f8d5a5a7" - integrity sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag== + version "1.8.0" + resolved "https://registry.yarnpkg.com/psl/-/psl-1.8.0.tgz#9326f8bcfb013adcc005fdff056acce020e51c24" + integrity sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ== public-encrypt@^4.0.0: version "4.0.3" @@ -8247,7 +8794,7 @@ public-encrypt@^4.0.0: pull-cat@^1.1.9: version "1.1.11" resolved "https://registry.yarnpkg.com/pull-cat/-/pull-cat-1.1.11.tgz#b642dd1255da376a706b6db4fa962f5fdb74c31b" - integrity sha512-i3w+xZ3DCtTVz8S62hBOuNLRHqVDsHMNZmgrZsjPnsxXUgbWtXEee84lo1XswE7W2a3WHyqsNuDJTjVLAQR8xg== + integrity sha1-tkLdElXaN2pwa220+pYvX9t0wxs= pull-defer@^0.2.2: version "0.2.3" @@ -8270,7 +8817,7 @@ pull-level@^2.0.3: pull-live@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/pull-live/-/pull-live-1.0.1.tgz#a4ecee01e330155e9124bbbcf4761f21b38f51f5" - integrity sha512-tkNz1QT5gId8aPhV5+dmwoIiA1nmfDOzJDlOOUpU5DNusj6neNd3EePybJ5+sITr2FwyCs/FVpx74YMCfc8YeA== + integrity sha1-pOzuAeMwFV6RJLu89HYfIbOPUfU= dependencies: pull-cat "^1.1.9" pull-stream "^3.4.0" @@ -8278,17 +8825,17 @@ pull-live@^1.0.1: pull-pushable@^2.0.0: version "2.2.0" resolved "https://registry.yarnpkg.com/pull-pushable/-/pull-pushable-2.2.0.tgz#5f2f3aed47ad86919f01b12a2e99d6f1bd776581" - integrity sha512-M7dp95enQ2kaHvfCt2+DJfyzgCSpWVR2h2kWYnVsW6ZpxQBx5wOu0QWOvQPVoPnBLUZYitYP2y7HyHkLQNeGXg== + integrity sha1-Xy867UethpGfAbEqLpnW8b13ZYE= pull-stream@^3.2.3, pull-stream@^3.4.0, pull-stream@^3.6.8: - version "3.7.0" - resolved "https://registry.yarnpkg.com/pull-stream/-/pull-stream-3.7.0.tgz#85de0e44ff38a4d2ad08cc43fc458e1922f9bf0b" - integrity sha512-Eco+/R004UaCK2qEDE8vGklcTG2OeZSVm1kTUQNrykEjDwcFXDZhygFDsW49DbXyJMEhHeRL3z5cRVqPAhXlIw== + version "3.6.14" + resolved "https://registry.yarnpkg.com/pull-stream/-/pull-stream-3.6.14.tgz#529dbd5b86131f4a5ed636fdf7f6af00781357ee" + integrity sha512-KIqdvpqHHaTUA2mCYcLG1ibEbu/LCKoJZsBWyv9lSYtPkJPBq8m3Hxa103xHi6D2thj5YXa0TqK3L3GUkwgnew== pull-window@^2.1.4: version "2.1.4" resolved "https://registry.yarnpkg.com/pull-window/-/pull-window-2.1.4.tgz#fc3b86feebd1920c7ae297691e23f705f88552f0" - integrity sha512-cbDzN76BMlcGG46OImrgpkMf/VkCnupj8JhsrpBw3aWBM9ye345aYnqitmZCgauBkc0HbbRRn9hCnsa3k2FNUg== + integrity sha1-/DuG/uvRkgx64pdpHiP3BfiFUvA= dependencies: looper "^2.0.0" @@ -8300,20 +8847,20 @@ pump@^3.0.0: end-of-stream "^1.1.0" once "^1.3.1" +punycode@1.3.2: + version "1.3.2" + resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.3.2.tgz#9653a036fb7c1ee42342f2325cceefea3926c48d" + integrity sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0= + punycode@2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.0.tgz#5f863edc89b96db09074bad7947bf09056ca4e7d" - integrity sha512-Yxz2kRwT90aPiWEMHVYnEf4+rhwF1tBmmZ4KepCP+Wkium9JxtWnUm1nqGwpiAHr/tnTSeHqr3wb++jgSkXjhA== - -punycode@^1.4.1: - version "1.4.1" - resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.4.1.tgz#c0d5a63b2718800ad8e1eb0fa5269c84dd41845e" - integrity sha512-jmYNElW7yvO7TV33CjSmvSiE2yco3bV2czu/OzDKdMNVZQWfxCblURLhf+47syQRBntjfLdd/H0egrzIG+oaFQ== + integrity sha1-X4Y+3Im5bbCQdLrXlHvwkFbKTn0= punycode@^2.1.0, punycode@^2.1.1: - version "2.3.0" - resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.3.0.tgz#f67fa67c94da8f4d0cfff981aee4118064199b8f" - integrity sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA== + version "2.1.1" + resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec" + integrity sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A== puppeteer@^13.7.0: version "13.7.0" @@ -8333,19 +8880,17 @@ puppeteer@^13.7.0: unbzip2-stream "1.4.3" ws "8.5.0" -qs@6.11.0: - version "6.11.0" - resolved "https://registry.yarnpkg.com/qs/-/qs-6.11.0.tgz#fd0d963446f7a65e1367e01abd85429453f0c37a" - integrity sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q== +qs@6.10.3, qs@^6.4.0, qs@^6.7.0, qs@^6.9.4: + version "6.10.3" + resolved "https://registry.yarnpkg.com/qs/-/qs-6.10.3.tgz#d6cde1b2ffca87b5aa57889816c5f81535e22e8e" + integrity sha512-wr7M2E0OFRfIfJZjKGieI8lBKb7fRCH4Fv5KNPEs7gJ8jadvotdsS08PzOKR7opXhZ/Xkjtt3WF9g38drmyRqQ== dependencies: side-channel "^1.0.4" -qs@^6.11.2, qs@^6.4.0, qs@^6.9.4: - version "6.11.2" - resolved "https://registry.yarnpkg.com/qs/-/qs-6.11.2.tgz#64bea51f12c1f5da1bc01496f48ffcff7c69d7d9" - integrity sha512-tDNIz22aBzCDxLtVH++VnTfzxlfeK5CbqohpSqpJgj1Wg/cQbStNAz3NuqCs5vV+pjBsK4x4pN9HlVh7rcYRiA== - dependencies: - side-channel "^1.0.4" +qs@6.9.7: + version "6.9.7" + resolved "https://registry.yarnpkg.com/qs/-/qs-6.9.7.tgz#4610846871485e1e048f44ae3b94033f0e675afe" + integrity sha512-IhMFgUmuNpyRfxA90umL7ByLlgRXu6tIfKPpF5TmcfRLlLCckfP/g3IQmju6jjpu+Hh8rA+2p6A27ZSPOOHdKw== qs@~6.5.2: version "6.5.3" @@ -8361,16 +8906,16 @@ query-string@^5.0.1: object-assign "^4.1.0" strict-uri-encode "^1.0.0" -queue-microtask@^1.2.2, queue-microtask@^1.2.3: +querystring@0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/querystring/-/querystring-0.2.0.tgz#b209849203bb25df820da756e747005878521620" + integrity sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA= + +queue-microtask@^1.2.2: version "1.2.3" resolved "https://registry.yarnpkg.com/queue-microtask/-/queue-microtask-1.2.3.tgz#4929228bbc724dfac43e0efb058caf7b6cfb6243" integrity sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A== -quick-lru@^5.1.1: - version "5.1.1" - resolved "https://registry.yarnpkg.com/quick-lru/-/quick-lru-5.1.1.tgz#366493e6b3e42a3a6885e2e99d18f80fb7a8c932" - integrity sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA== - ramda@^0.27.1: version "0.27.2" resolved "https://registry.yarnpkg.com/ramda/-/ramda-0.27.2.tgz#84463226f7f36dc33592f6f4ed6374c48306c3f1" @@ -8396,20 +8941,20 @@ range-parser@~1.2.1: resolved "https://registry.yarnpkg.com/range-parser/-/range-parser-1.2.1.tgz#3cf37023d199e1c24d1a55b84800c2f3e6468031" integrity sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg== -raw-body@2.5.1: - version "2.5.1" - resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.5.1.tgz#fe1b1628b181b700215e5fd42389f98b71392857" - integrity sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig== +raw-body@2.4.3: + version "2.4.3" + resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.4.3.tgz#8f80305d11c2a0a545c2d9d89d7a0286fcead43c" + integrity sha512-UlTNLIcu0uzb4D2f4WltY6cVjLi+/jEN4lgEUj3E04tpMDpUlkBo/eSn6zou9hum2VMNpCCUone0O0WeJim07g== dependencies: bytes "3.1.2" - http-errors "2.0.0" + http-errors "1.8.1" iconv-lite "0.4.24" unpipe "1.0.0" -raw-body@2.5.2, raw-body@^2.4.1: - version "2.5.2" - resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.5.2.tgz#99febd83b90e08975087e8f1f9419a149366b68a" - integrity sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA== +raw-body@2.5.1, raw-body@^2.4.1: + version "2.5.1" + resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.5.1.tgz#fe1b1628b181b700215e5fd42389f98b71392857" + integrity sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig== dependencies: bytes "3.1.2" http-errors "2.0.0" @@ -8419,7 +8964,7 @@ raw-body@2.5.2, raw-body@^2.4.1: read-pkg-up@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-1.0.1.tgz#9d63c13276c065918d57f002a57f40a1b643fb02" - integrity sha512-WD9MTlNtI55IwYUS27iHh9tK3YoIVhxis8yKhLpTqWtml739uXc9NWTpxoHkfZf3+DkCCsXox94/VWZniuZm6A== + integrity sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI= dependencies: find-up "^1.0.0" read-pkg "^1.0.0" @@ -8427,7 +8972,7 @@ read-pkg-up@^1.0.1: read-pkg@^1.0.0: version "1.1.0" resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-1.1.0.tgz#f5ffaa5ecd29cb31c0474bca7d756b6bb29e3f28" - integrity sha512-7BGwRHqt4s/uVbuyoeejRn4YmFnYZiFl4AuaeXHlgZf3sONF0SOGlxs2Pw8g6hCKupo08RafIO5YXFNOKTfwsQ== + integrity sha1-9f+qXs0pyzHAR0vKfXVra7KePyg= dependencies: load-json-file "^1.0.0" normalize-package-data "^2.3.2" @@ -8436,7 +8981,7 @@ read-pkg@^1.0.0: readable-stream@^1.0.33: version "1.1.14" resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-1.1.14.tgz#7cf4c54ef648e3813084c636dd2079e166c081d9" - integrity sha512-+MeVjFf4L44XUkhM1eYbD8fyEsxcV81pqMSR5gblfcLCHfZvbrqy4/qYHE+/R5HoBUT11WV5O08Cr1n3YXkWVQ== + integrity sha1-fPTFTvZI44EwhMY23SB54WbAgdk= dependencies: core-util-is "~1.0.0" inherits "~2.0.1" @@ -8444,9 +8989,9 @@ readable-stream@^1.0.33: string_decoder "~0.10.x" readable-stream@^2.0.0, readable-stream@^2.0.5, readable-stream@^2.2.2, readable-stream@^2.2.8, readable-stream@^2.2.9, readable-stream@^2.3.6, readable-stream@~2.3.6: - version "2.3.8" - resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.8.tgz#91125e8042bba1b9887f49345f6277027ce8be9b" - integrity sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA== + version "2.3.7" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.7.tgz#1eca1cf711aef814c04f62252a36a62f6cb23b57" + integrity sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw== dependencies: core-util-is "~1.0.0" inherits "~2.0.3" @@ -8456,10 +9001,10 @@ readable-stream@^2.0.0, readable-stream@^2.0.5, readable-stream@^2.2.2, readable string_decoder "~1.1.1" util-deprecate "~1.0.1" -readable-stream@^3.0.6, readable-stream@^3.1.1, readable-stream@^3.4.0, readable-stream@^3.6.0: - version "3.6.2" - resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.2.tgz#56a9b36ea965c00c5a93ef31eb111a0f11056967" - integrity sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA== +readable-stream@^3.0.6, readable-stream@^3.1.0, readable-stream@^3.1.1, readable-stream@^3.4.0, readable-stream@^3.6.0: + version "3.6.0" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.0.tgz#337bbda3adc0706bd3e024426a286d4b4b2c9198" + integrity sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA== dependencies: inherits "^2.0.3" string_decoder "^1.1.1" @@ -8468,7 +9013,7 @@ readable-stream@^3.0.6, readable-stream@^3.1.1, readable-stream@^3.4.0, readable readable-stream@~1.0.15: version "1.0.34" resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-1.0.34.tgz#125820e34bc842d2f2aaafafe4c2916ee32c157c" - integrity sha512-ok1qVCJuRkNmvebYikljxJA/UEsKwLl2nI1OmaqAu4/UE+h0wKCHok4XkL/gvi39OacXvw59RJUOFUkDib2rHg== + integrity sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw= dependencies: core-util-is "~1.0.0" inherits "~2.0.1" @@ -8492,16 +9037,16 @@ readdirp@~3.6.0: rechoir@^0.6.2: version "0.6.2" resolved "https://registry.yarnpkg.com/rechoir/-/rechoir-0.6.2.tgz#85204b54dba82d5742e28c96756ef43af50e3384" - integrity sha512-HFM8rkZ+i3zrV+4LQjwQ0W+ez98pApMGM3HUrN04j3CqzPOzl9nmP15Y8YXNm8QHGv/eacOVEjqhmWpkRV0NAw== + integrity sha1-hSBLVNuoLVdC4oyWdW70OvUOM4Q= dependencies: resolve "^1.1.6" recursive-readdir@^2.2.2: - version "2.2.3" - resolved "https://registry.yarnpkg.com/recursive-readdir/-/recursive-readdir-2.2.3.tgz#e726f328c0d69153bcabd5c322d3195252379372" - integrity sha512-8HrF5ZsXk5FAH9dgsx3BlUer73nIhuj+9OrQwEbLTPOBzGkL1lsFCR01am+v+0m2Cmbs1nP12hLDl5FA7EszKA== + version "2.2.2" + resolved "https://registry.yarnpkg.com/recursive-readdir/-/recursive-readdir-2.2.2.tgz#9946fb3274e1628de6e36b2f6714953b4845094f" + integrity sha512-nRCcW9Sj7NuZwa2XvH9co8NPeXUBhZP7CRKJtU+cS6PW9FpCIFoI5ib0NT1ZrbNuPoRy0ylyCaUL8Gih4LSyFg== dependencies: - minimatch "^3.0.5" + minimatch "3.0.4" reduce-flatten@^2.0.0: version "2.0.0" @@ -8535,19 +9080,28 @@ regex-not@^1.0.0, regex-not@^1.0.2: extend-shallow "^3.0.2" safe-regex "^1.1.0" -regexp.prototype.flags@^1.2.0, regexp.prototype.flags@^1.5.0: - version "1.5.0" - resolved "https://registry.yarnpkg.com/regexp.prototype.flags/-/regexp.prototype.flags-1.5.0.tgz#fe7ce25e7e4cca8db37b6634c8a2c7009199b9cb" - integrity sha512-0SutC3pNudRKgquxGoRGIz946MZVHqbNfPjBdxeOhBrdgDKlRoXmYLQN9xRbrR09ZXWeGAdPuif7egofn6v5LA== +regexp.prototype.flags@^1.2.0: + version "1.4.1" + resolved "https://registry.yarnpkg.com/regexp.prototype.flags/-/regexp.prototype.flags-1.4.1.tgz#b3f4c0059af9e47eca9f3f660e51d81307e72307" + integrity sha512-pMR7hBVUUGI7PMA37m2ofIdQCsomVnas+Jn5UPGAHQ+/LlwKm/aTLJHdasmHRzlfeZwHiAOaRSo2rbBDm3nNUQ== dependencies: call-bind "^1.0.2" - define-properties "^1.2.0" - functions-have-names "^1.2.3" + define-properties "^1.1.3" + +regexpp@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/regexpp/-/regexpp-2.0.1.tgz#8d19d31cf632482b589049f8281f93dbcba4d07f" + integrity sha512-lv0M6+TkDVniA3aD1Eg0DVpfU/booSu7Eev3TDO/mZKHBfVjgCGTV4t4buppESEYDtkArYFOxTJWv6S5C+iaNw== + +regexpp@^3.2.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/regexpp/-/regexpp-3.2.0.tgz#0425a2768d8f23bad70ca4b90461fa2f1213e1b2" + integrity sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg== regexpu-core@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-2.0.0.tgz#49d038837b8dcf8bfa5b9a42139938e6ea2ae240" - integrity sha512-tJ9+S4oKjxY8IZ9jmjnp/mtytu1u3iyIQAfmI51IKWH6bFf7XR1ybtaO6j7INhZKXOTYADk7V5qxaqLkmNxiZQ== + integrity sha1-SdA4g3uNz4v6W5pCE5k45uoq4kA= dependencies: regenerate "^1.2.1" regjsgen "^0.2.0" @@ -8556,12 +9110,12 @@ regexpu-core@^2.0.0: regjsgen@^0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/regjsgen/-/regjsgen-0.2.0.tgz#6c016adeac554f75823fe37ac05b92d5a4edb1f7" - integrity sha512-x+Y3yA24uF68m5GA+tBjbGYo64xXVJpbToBaWCoSNSc1hdk6dfctaRWrNFTVJZIIhL5GxW8zwjoixbnifnK59g== + integrity sha1-bAFq3qxVT3WCP+N6wFuS1aTtsfc= regjsparser@^0.1.4: version "0.1.5" resolved "https://registry.yarnpkg.com/regjsparser/-/regjsparser-0.1.5.tgz#7ee8f84dc6fa792d3fd0ae228d24bd949ead205c" - integrity sha512-jlQ9gYLfk2p3V5Ag5fYhA7fv7OHzd1KUH0PRP46xc3TgwjwgROIW572AfYg/X9kaNq/LJnu6oJcFRXlIrGoTRw== + integrity sha1-fuj4Tcb6eS0/0K4ijSS9lJ6tIFw= dependencies: jsesc "~0.5.0" @@ -8573,26 +9127,26 @@ repeat-element@^1.1.2: repeat-string@^1.6.1: version "1.6.1" resolved "https://registry.yarnpkg.com/repeat-string/-/repeat-string-1.6.1.tgz#8dcae470e1c88abc2d600fff4a776286da75e637" - integrity sha512-PV0dzCYDNfRi1jCDbJzpW7jNNDRuCOG/jI5ctQcGKt/clZD+YcPS3yIlWuTJMmESC8aevCFmWJy5wjAFgNqN6w== + integrity sha1-jcrkcOHIirwtYA//Sndihtp15jc= repeating@^2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/repeating/-/repeating-2.0.1.tgz#5214c53a926d3552707527fbab415dbc08d06dda" - integrity sha512-ZqtSMuVybkISo2OWvqvm7iHSWngvdaW3IpsT9/uP8v4gMi591LY6h35wdOfvQdWCKFWZWm2Y1Opp4kV7vQKT6A== + integrity sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo= dependencies: is-finite "^1.0.0" req-cwd@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/req-cwd/-/req-cwd-2.0.0.tgz#d4082b4d44598036640fb73ddea01ed53db49ebc" - integrity sha512-ueoIoLo1OfB6b05COxAA9UpeoscNpYyM+BqYlA7H6LVF4hKGPXQQSSaD2YmvDVJMkk4UDpAHIeU1zG53IqjvlQ== + integrity sha1-1AgrTURZgDZkD7c93qAe1T20nrw= dependencies: req-from "^2.0.0" req-from@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/req-from/-/req-from-2.0.0.tgz#d74188e47f93796f4aa71df6ee35ae689f3e0e70" - integrity sha512-LzTfEVDVQHBRfjOUMgNBA+V6DWsSnoeKzf42J7l0xa/B4jyPOuuF5MlNSmomLNGemWTnV2TIdjSSLnEn95fOQA== + integrity sha1-10GI5H+TeW9Kpx327jWuaJ8+DnA= dependencies: resolve-from "^3.0.0" @@ -8641,12 +9195,12 @@ request@^2.79.0, request@^2.85.0, request@^2.88.0: require-directory@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" - integrity sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q== + integrity sha1-jGStX9MNqxyXbiNE/+f3kqam30I= require-from-string@^1.1.0: version "1.2.1" resolved "https://registry.yarnpkg.com/require-from-string/-/require-from-string-1.2.1.tgz#529c9ccef27380adfec9a2f965b649bbee636418" - integrity sha512-H7AkJWMobeskkttHyhTVtS0fxpFLjxhbfMa6Bk3wimP7sdPRGL3EyCg3sAQenFfAe+xQ+oAc85Nmtvq0ROM83Q== + integrity sha1-UpyczvJzgK3+yaL5ZbZJu+5jZBg= require-from-string@^2.0.0, require-from-string@^2.0.2: version "2.0.2" @@ -8656,22 +9210,17 @@ require-from-string@^2.0.0, require-from-string@^2.0.2: require-main-filename@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/require-main-filename/-/require-main-filename-1.0.1.tgz#97f717b69d48784f5f526a6c5aa8ffdda055a4d1" - integrity sha512-IqSUtOVP4ksd1C/ej5zeEh/BIP2ajqpn8c5x+q99gvcIG/Qf0cud5raVnE/Dwd0ua9TXYDoDc0RE5hBSdz22Ug== + integrity sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE= require-main-filename@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/require-main-filename/-/require-main-filename-2.0.0.tgz#d0b329ecc7cc0f61649f62215be69af54aa8989b" integrity sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg== -resolve-alpn@^1.0.0, resolve-alpn@^1.2.0: - version "1.2.1" - resolved "https://registry.yarnpkg.com/resolve-alpn/-/resolve-alpn-1.2.1.tgz#b7adbdac3546aaaec20b45e7d8265927072726f9" - integrity sha512-0a1F4l73/ZFZOakJnQ3FvkJ2+gSTQWz/r2KE5OdDY0TxPm5h4GkqkWWfM47T7HsbnOtcJVEF4epCVy6u7Q3K+g== - resolve-from@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-3.0.0.tgz#b22c7af7d9d6881bc8b6e653335eebcb0a188748" - integrity sha512-GnlH6vxLymXJNMBo7XP1fJIzBFbdYt49CuTwmB/6N53t+kMPRMFKz783LlQ4tv28XoQfMWinAJX6WCGf2IlaIw== + integrity sha1-six699nWiBvItuZTM17rywoYh0g= resolve-from@^4.0.0: version "4.0.0" @@ -8681,12 +9230,12 @@ resolve-from@^4.0.0: resolve-url@^0.2.1: version "0.2.1" resolved "https://registry.yarnpkg.com/resolve-url/-/resolve-url-0.2.1.tgz#2c637fe77c893afd2a663fe21aa9080068e2052a" - integrity sha512-ZuF55hVUQaaczgOIwqWzkEcEidmlD/xl44x1UZnhOXcYuFN2S6+rcxpG+C1N3So0wvNI3DmJICUFfu2SxhBmvg== + integrity sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo= resolve@1.1.x: version "1.1.7" resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.1.7.tgz#203114d82ad2c5ed9e8e0411b3932875e889e97b" - integrity sha512-9znBF0vBcaSN3W2j7wKvdERPwqTxSpCq+if5C0WoTCyV9n24rua28jeuQ2pL/HOf+yUe/Mef+H/5p60K0Id3bg== + integrity sha1-IDEU2CrSxe2ejgQRs5ModeiJ6Xs= resolve@1.17.0: version "1.17.0" @@ -8695,33 +9244,51 @@ resolve@1.17.0: dependencies: path-parse "^1.0.6" -resolve@^1.1.6, resolve@^1.10.0, resolve@^1.3.2, resolve@^1.8.1, resolve@~1.22.1: - version "1.22.4" - resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.4.tgz#1dc40df46554cdaf8948a486a10f6ba1e2026c34" - integrity sha512-PXNdCiPqDqeUou+w1C2eTQbNfxKSuMxqTCuvlmmMsk1NWHL5fRrhY6Pl0qEYYc6+QqGClco1Qj8XnjPego4wfg== +resolve@^1.1.6: + version "1.20.0" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.20.0.tgz#629a013fb3f70755d6f0b7935cc1c2c5378b1975" + integrity sha512-wENBPt4ySzg4ybFQW2TT1zMQucPK95HSh/nq2CFTZVOGut2+pQvSsgtda4d26YrYcr067wjbmzOG8byDPBX63A== + dependencies: + is-core-module "^2.2.0" + path-parse "^1.0.6" + +resolve@^1.10.0, resolve@^1.8.1, resolve@~1.22.0: + version "1.22.0" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.0.tgz#5e0b8c67c15df57a89bdbabe603a002f21731198" + integrity sha512-Hhtrw0nLeSrFQ7phPp4OOcVjLPIeMnRlr5mcnVuMe7M/7eBn98A3hmFRLoFo3DLZkivSYwhRUJTyPyWAk56WLw== dependencies: - is-core-module "^2.13.0" + is-core-module "^2.8.1" + path-parse "^1.0.7" + supports-preserve-symlinks-flag "^1.0.0" + +resolve@^1.3.2: + version "1.22.1" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.1.tgz#27cb2ebb53f91abb49470a928bba7558066ac177" + integrity sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw== + dependencies: + is-core-module "^2.9.0" path-parse "^1.0.7" supports-preserve-symlinks-flag "^1.0.0" responselike@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/responselike/-/responselike-1.0.2.tgz#918720ef3b631c5642be068f15ade5a46f4ba1e7" - integrity sha512-/Fpe5guzJk1gPqdJLJR5u7eG/gNY4nImjbRDaVWVMRhne55TCmj2i9Q+54PBRfatRC8v/rIiv9BN0pMd9OV5EQ== + integrity sha1-kYcg7ztjHFZCvgaPFa3lpG9Loec= dependencies: lowercase-keys "^1.0.0" -responselike@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/responselike/-/responselike-2.0.1.tgz#9a0bc8fdc252f3fb1cca68b016591059ba1422bc" - integrity sha512-4gl03wn3hj1HP3yzgdI7d3lCkF95F21Pz4BPGvKHinyQzALR5CapwC8yIi0Rh58DEMQ/SguC03wFj2k0M/mHhw== +restore-cursor@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-2.0.0.tgz#9f7ee287f82fd326d4fd162923d62129eee0dfaf" + integrity sha1-n37ih/gv0ybU/RYpI9YhKe7g368= dependencies: - lowercase-keys "^2.0.0" + onetime "^2.0.0" + signal-exit "^3.0.2" resumer@~0.0.0: version "0.0.0" resolved "https://registry.yarnpkg.com/resumer/-/resumer-0.0.0.tgz#f1e8f461e4064ba39e82af3cdc2a8c893d076759" - integrity sha512-Fn9X8rX8yYF4m81rZCK/5VmrmsSbqS/i3rDLl6ZZHAXgC2nTAx3dhwG8q8odP/RmdLa2YrybDJaAMg+X1ajY3w== + integrity sha1-8ej0YeQGS6Oegq883CqMiT0HZ1k= dependencies: through "~2.3.4" @@ -8735,6 +9302,13 @@ reusify@^1.0.4: resolved "https://registry.yarnpkg.com/reusify/-/reusify-1.0.4.tgz#90da382b1e126efc02146e90845a88db12925d76" integrity sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw== +rimraf@2.6.3: + version "2.6.3" + resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.6.3.tgz#b2d104fe0d8fb27cf9e0a1cda8262dd3833c6cab" + integrity sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA== + dependencies: + glob "^7.1.3" + rimraf@3.0.2, rimraf@^3.0.0, rimraf@^3.0.2: version "3.0.2" resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-3.0.2.tgz#f1a5402ba6220ad52cc1282bac1ae3aa49fd061a" @@ -8764,12 +9338,10 @@ rlp@^2.0.0, rlp@^2.2.1, rlp@^2.2.2, rlp@^2.2.3, rlp@^2.2.4: dependencies: bn.js "^5.2.0" -run-parallel-limit@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/run-parallel-limit/-/run-parallel-limit-1.1.0.tgz#be80e936f5768623a38a963262d6bef8ff11e7ba" - integrity sha512-jJA7irRNM91jaKc3Hcl1npHsFLOXOoTkPCUL1JEa1R82O2miplXXRaGdjW/KM/98YQWDhJLiSs793CnXfblJUw== - dependencies: - queue-microtask "^1.2.2" +run-async@^2.2.0: + version "2.4.1" + resolved "https://registry.yarnpkg.com/run-async/-/run-async-2.4.1.tgz#8440eccf99ea3e70bd409d49aab88e10c189a455" + integrity sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ== run-parallel@^1.1.9: version "1.2.0" @@ -8783,15 +9355,12 @@ rustbn.js@~0.2.0: resolved "https://registry.yarnpkg.com/rustbn.js/-/rustbn.js-0.2.0.tgz#8082cb886e707155fd1cb6f23bd591ab8d55d0ca" integrity sha512-4VlvkRUuCJvr2J6Y0ImW7NvTCriMi7ErOAqWk1y69vAdoNIzCF3yPmgeNzx+RQTLEDFq5sHfscn1MwHxP9hNfA== -safe-array-concat@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/safe-array-concat/-/safe-array-concat-1.0.1.tgz#91686a63ce3adbea14d61b14c99572a8ff84754c" - integrity sha512-6XbUAseYE2KtOuGueyeobCySj9L4+66Tn6KQMOPQJrAJEowYKW/YR/MGJZl7FdydUdaFu4LYyDZjxf4/Nmo23Q== +rxjs@^6.4.0: + version "6.6.7" + resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-6.6.7.tgz#90ac018acabf491bf65044235d5863c4dab804c9" + integrity sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ== dependencies: - call-bind "^1.0.2" - get-intrinsic "^1.2.1" - has-symbols "^1.0.3" - isarray "^2.0.5" + tslib "^1.9.0" safe-buffer@5.2.1, safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@^5.1.1, safe-buffer@^5.1.2, safe-buffer@^5.2.0, safe-buffer@^5.2.1, safe-buffer@~5.2.0: version "5.2.1" @@ -8810,19 +9379,10 @@ safe-event-emitter@^1.0.1: dependencies: events "^3.0.0" -safe-regex-test@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/safe-regex-test/-/safe-regex-test-1.0.0.tgz#793b874d524eb3640d1873aad03596db2d4f2295" - integrity sha512-JBUUzyOgEwXQY1NuPtvcj/qcBDbDmEvWufhlnXZIm75DEHp+afM1r1ujJpJsV/gSM4t59tpDyPi1sd6ZaPFfsA== - dependencies: - call-bind "^1.0.2" - get-intrinsic "^1.1.3" - is-regex "^1.1.4" - safe-regex@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/safe-regex/-/safe-regex-1.1.0.tgz#40a3669f3b077d1e943d44629e157dd48023bf2e" - integrity sha512-aJXcif4xnaNUzvUuC5gcb46oTS7zvg4jpMTnuqtrEPlR3vFr4pxtdTwaF1Qs3Enjn9HK+ZlwQui+a7z0SywIzg== + integrity sha1-QKNmnzsHfR6UPURinhV91IAjvy4= dependencies: ret "~0.1.10" @@ -8864,7 +9424,7 @@ scrypt-js@3.0.1, scrypt-js@^3.0.0, scrypt-js@^3.0.1: scryptsy@^1.2.1: version "1.2.1" resolved "https://registry.yarnpkg.com/scryptsy/-/scryptsy-1.2.1.tgz#a3225fa4b2524f802700761e2855bdf3b2d92163" - integrity sha512-aldIRgMozSJ/Gl6K6qmJZysRP82lz83Wb42vl4PWN8SaLFHIaOzLPc9nUUW2jQN88CuGm5q5HefJ9jZ3nWSmTw== + integrity sha1-oyJfpLJST4AnAHYeKFW987LZIWM= dependencies: pbkdf2 "^3.0.3" @@ -8882,25 +9442,37 @@ seedrandom@3.0.1: resolved "https://registry.yarnpkg.com/seedrandom/-/seedrandom-3.0.1.tgz#eb3dde015bcf55df05a233514e5df44ef9dce083" integrity sha512-1/02Y/rUeU1CJBAGLebiC5Lbo5FnB22gQbIFFYTLkwvp1xdABZJH1sn4ZT1MzXmPpzv+Rf/Lu2NcsLJiK4rcDg== +semaphore-async-await@^1.5.1: + version "1.5.1" + resolved "https://registry.yarnpkg.com/semaphore-async-await/-/semaphore-async-await-1.5.1.tgz#857bef5e3644601ca4b9570b87e9df5ca12974fa" + integrity sha1-hXvvXjZEYBykuVcLh+nfXKEpdPo= + semaphore@>=1.0.1, semaphore@^1.0.3, semaphore@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/semaphore/-/semaphore-1.1.0.tgz#aaad8b86b20fe8e9b32b16dc2ee682a8cd26a8aa" integrity sha512-O4OZEaNtkMd/K0i6js9SL+gqy0ZCBMgUvlSqHKi4IBdjhe7wB8pwztUk1BbZ1fmrvpwFrPbHzqd2w5pTcJH6LA== -"semver@2 || 3 || 4 || 5", semver@^5.3.0, semver@^5.5.0, semver@^5.6.0, semver@^5.7.0: - version "5.7.2" - resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.2.tgz#48d55db737c3287cd4835e17fa13feace1c41ef8" - integrity sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g== +"semver@2 || 3 || 4 || 5", semver@^5.3.0, semver@^5.5.0, semver@^5.5.1, semver@^5.6.0, semver@^5.7.0: + version "5.7.1" + resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7" + integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ== semver@^6.3.0: - version "6.3.1" - resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.1.tgz#556d2ef8689146e46dcea4bfdd095f3434dffcb4" - integrity sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA== + version "6.3.0" + resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d" + integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw== + +semver@^7.3.4, semver@^7.3.5: + version "7.3.5" + resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.5.tgz#0b621c879348d8998e4b0e4be94b3f12e6018ef7" + integrity sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ== + dependencies: + lru-cache "^6.0.0" -semver@^7.3.4, semver@^7.3.7, semver@^7.3.8, semver@^7.5.2: - version "7.5.4" - resolved "https://registry.yarnpkg.com/semver/-/semver-7.5.4.tgz#483986ec4ed38e1c6c48c34894a9182dbff68a6e" - integrity sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA== +semver@^7.3.7: + version "7.3.7" + resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.7.tgz#12c5b649afdbf9049707796e22a4028814ce523f" + integrity sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g== dependencies: lru-cache "^6.0.0" @@ -8909,24 +9481,24 @@ semver@~5.4.1: resolved "https://registry.yarnpkg.com/semver/-/semver-5.4.1.tgz#e059c09d8571f0540823733433505d3a2f00b18e" integrity sha512-WfG/X9+oATh81XtllIo/I8gOiY9EXRdv1cQdyykeXK17YcUW3EXUAi2To4pcH6nZtJPr7ZOpM5OMyWJZm+8Rsg== -send@0.18.0: - version "0.18.0" - resolved "https://registry.yarnpkg.com/send/-/send-0.18.0.tgz#670167cc654b05f5aa4a767f9113bb371bc706be" - integrity sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg== +send@0.17.2: + version "0.17.2" + resolved "https://registry.yarnpkg.com/send/-/send-0.17.2.tgz#926622f76601c41808012c8bf1688fe3906f7820" + integrity sha512-UJYB6wFSJE3G00nEivR5rgWp8c2xXvJ3OPWPhmuteU0IKj8nKbG3DrjiOmLwpnHGYWAVwA69zmTm++YG0Hmwww== dependencies: debug "2.6.9" - depd "2.0.0" - destroy "1.2.0" + depd "~1.1.2" + destroy "~1.0.4" encodeurl "~1.0.2" escape-html "~1.0.3" etag "~1.8.1" fresh "0.5.2" - http-errors "2.0.0" + http-errors "1.8.1" mime "1.6.0" ms "2.1.3" - on-finished "2.4.1" + on-finished "~2.3.0" range-parser "~1.2.1" - statuses "2.0.1" + statuses "~1.5.0" serialize-javascript@6.0.0: version "6.0.0" @@ -8935,15 +9507,15 @@ serialize-javascript@6.0.0: dependencies: randombytes "^2.1.0" -serve-static@1.15.0: - version "1.15.0" - resolved "https://registry.yarnpkg.com/serve-static/-/serve-static-1.15.0.tgz#faaef08cffe0a1a62f60cad0c4e513cff0ac9540" - integrity sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g== +serve-static@1.14.2: + version "1.14.2" + resolved "https://registry.yarnpkg.com/serve-static/-/serve-static-1.14.2.tgz#722d6294b1d62626d41b43a013ece4598d292bfa" + integrity sha512-+TMNA9AFxUEGuC0z2mevogSnn9MXKb4fa7ngeRMJaaGv8vTwnIEkKi+QGvPt33HSnf8pRS+WGM0EbMtCJLKMBQ== dependencies: encodeurl "~1.0.2" escape-html "~1.0.3" parseurl "~1.3.3" - send "0.18.0" + send "0.17.2" servify@^0.1.12: version "0.1.12" @@ -8959,12 +9531,12 @@ servify@^0.1.12: set-blocking@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7" - integrity sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw== + integrity sha1-BF+XgtARrppoA93TgrJDkrPYkPc= set-immediate-shim@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/set-immediate-shim/-/set-immediate-shim-1.0.1.tgz#4b2b1b27eb808a9f8dcc481a58e5e56f599f3f61" - integrity sha512-Li5AOqrZWCVA2n5kryzEmqai6bKSIvpz5oUJHPVj6+dsbD3X1ixtsY5tEnsaNpH3pFAHmG8eIHUrtEtohrg+UQ== + integrity sha1-SysbJ+uAip+NzEgaWOXlb1mfP2E= set-value@^2.0.0, set-value@^2.0.1: version "2.0.1" @@ -8979,12 +9551,12 @@ set-value@^2.0.0, set-value@^2.0.1: setimmediate@1.0.4: version "1.0.4" resolved "https://registry.yarnpkg.com/setimmediate/-/setimmediate-1.0.4.tgz#20e81de622d4a02588ce0c8da8973cbcf1d3138f" - integrity sha512-/TjEmXQVEzdod/FFskf3o7oOAsGhHf2j1dZqRFbDzq4F3mvvxflIIi4Hd3bLQE9y/CpwqfSQam5JakI/mi3Pog== + integrity sha1-IOgd5iLUoCWIzgyNqJc8vPHTE48= setimmediate@^1.0.5: version "1.0.5" resolved "https://registry.yarnpkg.com/setimmediate/-/setimmediate-1.0.5.tgz#290cbb232e306942d7d7ea9b83732ab7856f8285" - integrity sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA== + integrity sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU= setprototypeof@1.2.0: version "1.2.0" @@ -9002,7 +9574,7 @@ sha.js@^2.4.0, sha.js@^2.4.8: sha1@^1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/sha1/-/sha1-1.1.1.tgz#addaa7a93168f393f19eb2b15091618e2700f848" - integrity sha512-dZBS6OrMjtgVkopB1Gmo4RQCDKiZsqcpAQpkV/aaj+FCrCg8r4I4qMkDPQjBgLIxlmu9k4nUbWq6ohXahOneYA== + integrity sha1-rdqnqTFo85PxnrKxUJFhjicA+Eg= dependencies: charenc ">= 0.0.1" crypt ">= 0.0.1" @@ -9010,7 +9582,7 @@ sha1@^1.1.1: shebang-command@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-1.2.0.tgz#44aac65b695b03398968c39f363fee5deafdf1ea" - integrity sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg== + integrity sha1-RKrGW2lbAzmJaMOfNj/uXer98eo= dependencies: shebang-regex "^1.0.0" @@ -9024,7 +9596,7 @@ shebang-command@^2.0.0: shebang-regex@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-1.0.0.tgz#da42f49740c0b42db2ca9728571cb190c98efea3" - integrity sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ== + integrity sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM= shebang-regex@^3.0.0: version "3.0.0" @@ -9049,6 +9621,11 @@ side-channel@^1.0.4: get-intrinsic "^1.0.2" object-inspect "^1.9.0" +signal-exit@^3.0.2: + version "3.0.7" + resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.7.tgz#a9a1767f8af84155114eaabd73f99273c8f59ad9" + integrity sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ== + simple-concat@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/simple-concat/-/simple-concat-1.0.1.tgz#f46976082ba35c2263f1c8ab5edfe26c41c9552f" @@ -9066,7 +9643,7 @@ simple-get@^2.7.0: slash@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/slash/-/slash-1.0.0.tgz#c41f2f6c39fc16d1cd17ad4b5d896114ae470d55" - integrity sha512-3TYDR7xWt4dIqV2JauJr+EJeW356RXijHeUlO+8djJ+uBXPn8/2dpzBc8yQhh583sVvc9CvFAeQVgijsH+PNNg== + integrity sha1-xB8vbDn8FtHNF61LXYlhFK5HDVU= slash@^2.0.0: version "2.0.0" @@ -9078,6 +9655,15 @@ slash@^3.0.0: resolved "https://registry.yarnpkg.com/slash/-/slash-3.0.0.tgz#6539be870c165adbd5240220dbe361f1bc4d4634" integrity sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q== +slice-ansi@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-2.1.0.tgz#cacd7693461a637a5788d92a7dd4fba068e81636" + integrity sha512-Qu+VC3EwYLldKa1fCxuuvULvSJOKEgk9pi8dZeCVK7TqBfUNTH4sFkk4joj8afVSfAYgJoSOetjx9QWOJ5mYoQ== + dependencies: + ansi-styles "^3.2.0" + astral-regex "^1.0.0" + is-fullwidth-code-point "^2.0.0" + slice-ansi@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-4.0.0.tgz#500e8dd0fd55b05815086255b3195adf2a45fe6b" @@ -9180,29 +9766,26 @@ solhint-plugin-prettier@^0.0.5: prettier-linter-helpers "^1.0.0" solhint@^3.3.7: - version "3.6.2" - resolved "https://registry.yarnpkg.com/solhint/-/solhint-3.6.2.tgz#2b2acbec8fdc37b2c68206a71ba89c7f519943fe" - integrity sha512-85EeLbmkcPwD+3JR7aEMKsVC9YrRSxd4qkXuMzrlf7+z2Eqdfm1wHWq1ffTuo5aDhoZxp2I9yF3QkxZOxOL7aQ== - dependencies: - "@solidity-parser/parser" "^0.16.0" - ajv "^6.12.6" - antlr4 "^4.11.0" - ast-parents "^0.0.1" - chalk "^4.1.2" - commander "^10.0.0" - cosmiconfig "^8.0.0" - fast-diff "^1.2.0" - glob "^8.0.3" - ignore "^5.2.4" - js-yaml "^4.1.0" - lodash "^4.17.21" - pluralize "^8.0.0" - semver "^7.5.2" - strip-ansi "^6.0.1" - table "^6.8.1" - text-table "^0.2.0" + version "3.3.7" + resolved "https://registry.yarnpkg.com/solhint/-/solhint-3.3.7.tgz#b5da4fedf7a0fee954cb613b6c55a5a2b0063aa7" + integrity sha512-NjjjVmXI3ehKkb3aNtRJWw55SUVJ8HMKKodwe0HnejA+k0d2kmhw7jvpa+MCTbcEgt8IWSwx0Hu6aCo/iYOZzQ== + dependencies: + "@solidity-parser/parser" "^0.14.1" + ajv "^6.6.1" + antlr4 "4.7.1" + ast-parents "0.0.1" + chalk "^2.4.2" + commander "2.18.0" + cosmiconfig "^5.0.7" + eslint "^5.6.0" + fast-diff "^1.1.2" + glob "^7.1.3" + ignore "^4.0.6" + js-yaml "^3.12.0" + lodash "^4.17.11" + semver "^6.3.0" optionalDependencies: - prettier "^2.8.3" + prettier "^1.14.3" solidity-comments-extractor@^0.0.7: version "0.0.7" @@ -9210,9 +9793,9 @@ solidity-comments-extractor@^0.0.7: integrity sha512-wciNMLg/Irp8OKGrh3S2tfvZiZ0NEyILfcRCXCD4mp7SgK/i9gzLfhY2hY7VMCQJ3kH9UB9BzNdibIVMchzyYw== solidity-coverage@^0.7.20: - version "0.7.22" - resolved "https://registry.yarnpkg.com/solidity-coverage/-/solidity-coverage-0.7.22.tgz#168f414be4c0f5303addcf3ab9714cf64f72c080" - integrity sha512-I6Zd5tsFY+gmj1FDIp6w7OrUePx6ZpMgKQZg7dWgPaQHePLi3Jk+iJ8lwZxsWEoNy2Lcv91rMxATWHqRaFdQpw== + version "0.7.20" + resolved "https://registry.yarnpkg.com/solidity-coverage/-/solidity-coverage-0.7.20.tgz#246e9b0dd62f698bb8ddeecdcc46cab26c48b637" + integrity sha512-edOXTugUYdqxrtEnIn4vgrGjLPxdexcL0WD8LzAvVA3d1dwgcfRO3k8xQR02ZQnOnWMBi8Cqs0F+kAQQp3JW8g== dependencies: "@solidity-parser/parser" "^0.14.0" "@truffle/provider" "^0.2.24" @@ -9275,7 +9858,7 @@ source-map-url@^0.4.0: source-map@^0.5.6, source-map@^0.5.7: version "0.5.7" resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc" - integrity sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ== + integrity sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w= source-map@^0.6.0, source-map@^0.6.1: version "0.6.1" @@ -9285,14 +9868,14 @@ source-map@^0.6.0, source-map@^0.6.1: source-map@~0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.2.0.tgz#dab73fbcfc2ba819b4de03bd6f6eaa48164b3f9d" - integrity sha512-CBdZ2oa/BHhS4xj5DlhjWNHcan57/5YuvfdLf17iVmIpd9KRm+DFLmC6nBNj+6Ua7Kt3TmOjDpQT1aTYOQtoUA== + integrity sha1-2rc/vPwrqBm03gO9b26qSBZLP50= dependencies: amdefine ">=0.0.4" spdx-correct@^3.0.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/spdx-correct/-/spdx-correct-3.2.0.tgz#4f5ab0668f0059e34f9c00dce331784a12de4e9c" - integrity sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA== + version "3.1.1" + resolved "https://registry.yarnpkg.com/spdx-correct/-/spdx-correct-3.1.1.tgz#dece81ac9c1e6713e5f7d1b6f17d468fa53d89a9" + integrity sha512-cOYcUWwhCuHCXi49RhFRCyJEK3iPj1Ziz9DpViV3tbZOwXD49QzIN3MpOLJNxh2qwq2lJJZaKMVw9qNi4jTC0w== dependencies: spdx-expression-parse "^3.0.0" spdx-license-ids "^3.0.0" @@ -9311,9 +9894,9 @@ spdx-expression-parse@^3.0.0: spdx-license-ids "^3.0.0" spdx-license-ids@^3.0.0: - version "3.0.13" - resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-3.0.13.tgz#7189a474c46f8d47c7b0da4b987bb45e908bd2d5" - integrity sha512-XkD+zwiqXHikFZm4AX/7JSCXA98U5Db4AFd5XUg/+9UNtnH75+Z9KxtpYiJZx36mUDVOwH83pl7yvCer6ewM3w== + version "3.0.11" + resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-3.0.11.tgz#50c0d8c40a14ec1bf449bae69a0ea4685a9d9f95" + integrity sha512-Ctl2BrFiM0X3MANYgj3CkygxhRmr9mi6xhejbdO960nF6EDJApTYpn0BQnDKlnNBULKiCN1n3w9EBkHK8ZWg+g== split-string@^3.0.1, split-string@^3.0.2: version "3.1.0" @@ -9325,7 +9908,7 @@ split-string@^3.0.1, split-string@^3.0.2: sprintf-js@~1.0.2: version "1.0.3" resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" - integrity sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g== + integrity sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw= sshpk@^1.7.0: version "1.17.0" @@ -9352,7 +9935,7 @@ stacktrace-parser@^0.1.10: static-extend@^0.1.1: version "0.1.2" resolved "https://registry.yarnpkg.com/static-extend/-/static-extend-0.1.2.tgz#60809c39cbff55337226fd5e0b520f341f1fb5c6" - integrity sha512-72E9+uLc27Mt718pMHt9VMNiAL4LMsmDbBva8mxWUCkT07fSzEGMYUCk0XWY6lp0j6RBAG4cJ3mWuZv2OE3s0g== + integrity sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY= dependencies: define-property "^0.2.5" object-copy "^0.1.0" @@ -9362,10 +9945,15 @@ statuses@2.0.1: resolved "https://registry.yarnpkg.com/statuses/-/statuses-2.0.1.tgz#55cb000ccf1d48728bd23c685a063998cf1a1b63" integrity sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ== +"statuses@>= 1.5.0 < 2", statuses@~1.5.0: + version "1.5.0" + resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.5.0.tgz#161c7dac177659fd9811f43771fa99381478628c" + integrity sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow= + stealthy-require@^1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/stealthy-require/-/stealthy-require-1.1.1.tgz#35b09875b4ff49f26a777e509b3090a3226bf24b" - integrity sha512-ZnWpYnYugiOVEY5GkcuJK1io5V8QmNYChG62gSit9pQVGErXtrKuPC55ITaVSukmMta5qpMU7vqLt2Lnni4f/g== + integrity sha1-NbCYdbT/SfJqd35QmzCQoyJr8ks= stream-to-pull-stream@^1.7.1: version "1.7.3" @@ -9375,15 +9963,10 @@ stream-to-pull-stream@^1.7.1: looper "^3.0.0" pull-stream "^3.2.3" -streamsearch@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/streamsearch/-/streamsearch-1.1.0.tgz#404dd1e2247ca94af554e841a8ef0eaa238da764" - integrity sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg== - strict-uri-encode@^1.0.0: version "1.1.0" resolved "https://registry.yarnpkg.com/strict-uri-encode/-/strict-uri-encode-1.1.0.tgz#279b225df1d582b1f54e65addd4352e18faa0713" - integrity sha512-R3f198pcvnB+5IpnBlRkphuE9n46WyVl8I39W/ZUTZLz4nqSP/oLYUrcnJrw462Ds8he4YKMov2efsTIw1BDGQ== + integrity sha1-J5siXfHVgrH1TmWt3UNS4Y+qBxM= string-format@^2.0.0: version "2.0.0" @@ -9393,13 +9976,13 @@ string-format@^2.0.0: string-width@^1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/string-width/-/string-width-1.0.2.tgz#118bdf5b8cdc51a2a7e70d211e07e2b0b9b107d3" - integrity sha512-0XsVpQLnVCXHJfyEs8tC0zpTVIr5PKKsQtkT29IwupnPTjtPmQ3xT/4yCREF9hYkV/3M3kzcUTSAZT6a6h81tw== + integrity sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M= dependencies: code-point-at "^1.0.0" is-fullwidth-code-point "^1.0.0" strip-ansi "^3.0.0" -"string-width@^1.0.2 || 2", string-width@^2.1.1: +"string-width@^1.0.2 || 2", string-width@^2.1.0, string-width@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/string-width/-/string-width-2.1.1.tgz#ab93f27a8dc13d28cac815c462143a6d9012ae9e" integrity sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw== @@ -9425,32 +10008,30 @@ string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3: is-fullwidth-code-point "^3.0.0" strip-ansi "^6.0.1" -string.prototype.trim@^1.2.7, string.prototype.trim@~1.2.7: - version "1.2.8" - resolved "https://registry.yarnpkg.com/string.prototype.trim/-/string.prototype.trim-1.2.8.tgz#f9ac6f8af4bd55ddfa8895e6aea92a96395393bd" - integrity sha512-lfjY4HcixfQXOfaqCvcBuOIapyaroTXhbkfJN3gcB1OtyupngWK4sEET9Knd0cXd28kTUqu/kHoV4HKSJdnjiQ== +string.prototype.trim@~1.2.5: + version "1.2.5" + resolved "https://registry.yarnpkg.com/string.prototype.trim/-/string.prototype.trim-1.2.5.tgz#a587bcc8bfad8cb9829a577f5de30dd170c1682c" + integrity sha512-Lnh17webJVsD6ECeovpVN17RlAKjmz4rF9S+8Y45CkMc/ufVpTkU3vZIyIC7sllQ1FCvObZnnCdNs/HXTUOTlg== dependencies: call-bind "^1.0.2" - define-properties "^1.2.0" - es-abstract "^1.22.1" + define-properties "^1.1.3" + es-abstract "^1.19.1" -string.prototype.trimend@^1.0.6: - version "1.0.7" - resolved "https://registry.yarnpkg.com/string.prototype.trimend/-/string.prototype.trimend-1.0.7.tgz#1bb3afc5008661d73e2dc015cd4853732d6c471e" - integrity sha512-Ni79DqeB72ZFq1uH/L6zJ+DKZTkOtPIHovb3YZHQViE+HDouuU4mBrLOLDn5Dde3RF8qw5qVETEjhu9locMLvA== +string.prototype.trimend@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/string.prototype.trimend/-/string.prototype.trimend-1.0.4.tgz#e75ae90c2942c63504686c18b287b4a0b1a45f80" + integrity sha512-y9xCjw1P23Awk8EvTpcyL2NIr1j7wJ39f+k6lvRnSMz+mz9CGz9NYPelDk42kOz6+ql8xjfK8oYzy3jAP5QU5A== dependencies: call-bind "^1.0.2" - define-properties "^1.2.0" - es-abstract "^1.22.1" + define-properties "^1.1.3" -string.prototype.trimstart@^1.0.6: - version "1.0.7" - resolved "https://registry.yarnpkg.com/string.prototype.trimstart/-/string.prototype.trimstart-1.0.7.tgz#d4cdb44b83a4737ffbac2d406e405d43d0184298" - integrity sha512-NGhtDFu3jCEm7B4Fy0DpLewdJQOZcQ0rGbwQ/+stjnrp2i+rlKeCvos9hOIeCmqwratM47OBxY7uFZzjxHXmrg== +string.prototype.trimstart@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/string.prototype.trimstart/-/string.prototype.trimstart-1.0.4.tgz#b36399af4ab2999b4c9c648bd7a3fb2bb26feeed" + integrity sha512-jh6e984OBfvxS50tdY2nRZnoC5/mLFKOREQfw8t5yytkoUsJRNxvI/E39qu1sD0OtWI3OC0XgKSmcWwziwYuZw== dependencies: call-bind "^1.0.2" - define-properties "^1.2.0" - es-abstract "^1.22.1" + define-properties "^1.1.3" string_decoder@^1.1.1: version "1.3.0" @@ -9462,7 +10043,7 @@ string_decoder@^1.1.1: string_decoder@~0.10.x: version "0.10.31" resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-0.10.31.tgz#62e203bc41766c6c28c9fc84301dab1c5310fa94" - integrity sha512-ev2QzSzWPYmy9GuqfIVildA4OdcGLeFZQrq5ys6RtiuF+RQQiZWr8TZNyAcuVXyQRYfEO+MsoB/1BuQVhOJuoQ== + integrity sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ= string_decoder@~1.1.1: version "1.1.1" @@ -9474,14 +10055,14 @@ string_decoder@~1.1.1: strip-ansi@^3.0.0, strip-ansi@^3.0.1: version "3.0.1" resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-3.0.1.tgz#6a385fb8853d952d5ff05d0e8aaf94278dc63dcf" - integrity sha512-VhumSSbBqDTP8p2ZLKj40UjBCV4+v8bUSEpUb4KjRgWk9pbqGF4REFj6KEagidb2f/M6AzC0EmFyDNGaw9OCzg== + integrity sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8= dependencies: ansi-regex "^2.0.0" strip-ansi@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-4.0.0.tgz#a8479022eb1ac368a871389b635262c505ee368f" - integrity sha512-4XaJ2zQdCzROZDivEVIDPkcQn8LMFSa8kj8Gxb/Lnwzv9A8VctNZ+lfivC/sV3ivW8ElJTERXZoPBRrZKkNKow== + integrity sha1-qEeQIusaw2iocTibY1JixQXuNo8= dependencies: ansi-regex "^3.0.0" @@ -9502,23 +10083,23 @@ strip-ansi@^6.0.0, strip-ansi@^6.0.1: strip-bom@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-2.0.0.tgz#6219a85616520491f35788bdbf1447a99c7e6b0e" - integrity sha512-kwrX1y7czp1E69n2ajbG65mIo9dqvJ+8aBQXOGVxqwvNbsXdFM6Lq37dLAY3mknUwru8CfcCbfOLL/gMo+fi3g== + integrity sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4= dependencies: is-utf8 "^0.2.0" strip-hex-prefix@1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/strip-hex-prefix/-/strip-hex-prefix-1.0.0.tgz#0c5f155fef1151373377de9dbb588da05500e36f" - integrity sha512-q8d4ue7JGEiVcypji1bALTos+0pWtyGlivAWyPuTkHzuTCJqrK9sWxYQZUq6Nq3cuyv3bm734IhHvHtGGURU6A== + integrity sha1-DF8VX+8RUTczd96du1iNoFUA428= dependencies: is-hex-prefixed "1.0.0" -strip-json-comments@2.0.1: +strip-json-comments@2.0.1, strip-json-comments@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a" - integrity sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ== + integrity sha1-PFMZQukIwml8DsNEhYwobHygpgo= -strip-json-comments@3.1.1, strip-json-comments@^3.1.1: +strip-json-comments@3.1.1, strip-json-comments@^3.1.0, strip-json-comments@^3.1.1: version "3.1.1" resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006" integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig== @@ -9540,12 +10121,12 @@ supports-color@8.1.1: supports-color@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-2.0.0.tgz#535d045ce6b6363fa40117084629995e9df324c7" - integrity sha512-KKNVtd6pCYgPIKU4cp2733HWYCpplQhddZLBUryaAHou723x+FRzQ5Df824Fj+IyyuiQTRoub4SnIFfIcrp70g== + integrity sha1-U10EXOa2Nj+kARcIRimZXp3zJMc= supports-color@^3.1.0: version "3.2.3" resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-3.2.3.tgz#65ac0504b3954171d8a64946b2ae3cbb8a5f54f6" - integrity sha512-Jds2VIYDrlp5ui7t8abHN2bjAu4LV/q4N2KivFPpGH0lrka0BMq/33AmECUXlKPcHigkNaqfXRENFju+rlcy+A== + integrity sha1-ZawFBLOVQXHYpklGsq48u4pfVPY= dependencies: has-flag "^1.0.0" @@ -9569,15 +10150,15 @@ supports-preserve-symlinks-flag@^1.0.0: integrity sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w== swarm-js@^0.1.40: - version "0.1.42" - resolved "https://registry.yarnpkg.com/swarm-js/-/swarm-js-0.1.42.tgz#497995c62df6696f6e22372f457120e43e727979" - integrity sha512-BV7c/dVlA3R6ya1lMlSSNPLYrntt0LUq4YMgy3iwpCIc6rZnS5W2wUoctarZ5pXlpKtxDDf9hNziEkcfrxdhqQ== + version "0.1.40" + resolved "https://registry.yarnpkg.com/swarm-js/-/swarm-js-0.1.40.tgz#b1bc7b6dcc76061f6c772203e004c11997e06b99" + integrity sha512-yqiOCEoA4/IShXkY3WKwP5PvZhmoOOD8clsKA7EEcRILMkTEYHCQ21HDCAcVpmIxZq4LyZvWeRJ6quIyHk1caA== dependencies: bluebird "^3.5.0" buffer "^5.0.5" eth-lib "^0.1.26" fs-extra "^4.0.2" - got "^11.8.5" + got "^7.1.0" mime-types "^2.1.16" mkdirp-promise "^5.0.1" mock-fs "^4.1.0" @@ -9601,7 +10182,7 @@ sync-rpc@^1.2.1: dependencies: get-port "^3.1.0" -table-layout@^1.0.2: +table-layout@^1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/table-layout/-/table-layout-1.0.2.tgz#c4038a1853b0136d63365a734b6931cf4fad4a04" integrity sha512-qd/R7n5rQTRFi+Zf2sk5XVVd9UQl6ZkduPFC3S7WEGJAmetDTjY3qPN50eSKzwuzEyQKy5TN2TiZdkIjos2L6A== @@ -9611,10 +10192,20 @@ table-layout@^1.0.2: typical "^5.2.0" wordwrapjs "^4.0.0" -table@^6.8.0, table@^6.8.1: - version "6.8.1" - resolved "https://registry.yarnpkg.com/table/-/table-6.8.1.tgz#ea2b71359fe03b017a5fbc296204471158080bdf" - integrity sha512-Y4X9zqrCftUhMeH2EptSSERdVKt/nEdijTOacGD/97EKjhQ/Qs8RTlEGABSJNNN8lac9kheH+af7yAkEWlgneA== +table@^5.2.3: + version "5.4.6" + resolved "https://registry.yarnpkg.com/table/-/table-5.4.6.tgz#1292d19500ce3f86053b05f0e8e7e4a3bb21079e" + integrity sha512-wmEc8m4fjnob4gt5riFRtTu/6+4rSe12TpAELNSqHMfF3IqnA+CH37USM6/YR3qRZv7e56kAEAtd6nKZaxe0Ug== + dependencies: + ajv "^6.10.2" + lodash "^4.17.14" + slice-ansi "^2.1.0" + string-width "^3.0.0" + +table@^6.8.0: + version "6.8.0" + resolved "https://registry.yarnpkg.com/table/-/table-6.8.0.tgz#87e28f14fa4321c3377ba286f07b79b281a3b3ca" + integrity sha512-s/fitrbVeEyHKFa7mFdkuQMWlH1Wgw/yEXMt5xACT4ZpzWFluehAxRtUUQKPuWhaLAWhFcVx6w3oC8VKaUfPGA== dependencies: ajv "^8.0.1" lodash.truncate "^4.4.2" @@ -9623,24 +10214,24 @@ table@^6.8.0, table@^6.8.1: strip-ansi "^6.0.1" tape@^4.6.3: - version "4.16.2" - resolved "https://registry.yarnpkg.com/tape/-/tape-4.16.2.tgz#7565e6af20426565557266e9dda7215869b297b6" - integrity sha512-TUChV+q0GxBBCEbfCYkGLkv8hDJYjMdSWdE0/Lr331sB389dsvFUHNV9ph5iQqKzt8Ss9drzcda/YeexclBFqg== + version "4.15.0" + resolved "https://registry.yarnpkg.com/tape/-/tape-4.15.0.tgz#1b8a9563b4bc7e51302216c137732fb2ce6d1a99" + integrity sha512-SfRmG2I8QGGgJE/MCiLH8c11L5XxyUXxwK9xLRD0uiK5fehRkkSZGmR6Y1pxOt8vJ19m3sY+POTQpiaVv45/LQ== dependencies: call-bind "~1.0.2" deep-equal "~1.1.1" - defined "~1.0.1" + defined "~1.0.0" dotignore "~0.1.2" for-each "~0.3.3" - glob "~7.2.3" + glob "~7.2.0" has "~1.0.3" inherits "~2.0.4" is-regex "~1.1.4" - minimist "~1.2.7" - object-inspect "~1.12.3" - resolve "~1.22.1" + minimist "~1.2.5" + object-inspect "~1.12.0" + resolve "~1.22.0" resumer "~0.0.0" - string.prototype.trim "~1.2.7" + string.prototype.trim "~1.2.5" through "~2.3.8" tar-fs@2.1.1: @@ -9680,7 +10271,7 @@ tar@^4.0.2: test-value@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/test-value/-/test-value-2.1.0.tgz#11da6ff670f3471a73b625ca4f3fdcf7bb748291" - integrity sha512-+1epbAxtKeXttkGFMTX9H42oqzOTufR1ceCF+GYA5aOmvaPq9wd4PUS8329fn2RRLGNeUkgRLnVpycjx8DsO2w== + integrity sha1-Edpv9nDzRxpztiXKTz/c97t0gpE= dependencies: array-back "^1.0.3" typical "^2.6.0" @@ -9693,7 +10284,7 @@ testrpc@0.0.1: text-table@^0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4" - integrity sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw== + integrity sha1-f17oI66AUgfACvLfSoTsP8+lcLQ= then-request@^6.0.0: version "6.0.2" @@ -9720,15 +10311,15 @@ through2@^2.0.3: readable-stream "~2.3.6" xtend "~4.0.1" -through@^2.3.8, through@~2.3.4, through@~2.3.8: +through@^2.3.6, through@^2.3.8, through@~2.3.4, through@~2.3.8: version "2.3.8" resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" - integrity sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg== + integrity sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU= -timed-out@^4.0.1: +timed-out@^4.0.0, timed-out@^4.0.1: version "4.0.1" resolved "https://registry.yarnpkg.com/timed-out/-/timed-out-4.0.1.tgz#f32eacac5a175bea25d7fab565ab3ed8741ef56f" - integrity sha512-G7r3AhovYtr5YKOWQkta8RKAPb+J9IsO4uVmzjl8AZwfhs8UcUwTiD6gcJYSgOtzyjvQKrKYn41syHbUWMkafA== + integrity sha1-8y6srFoXW+ol1/q1Zas+2HQe9W8= tmp@0.0.33, tmp@^0.0.33: version "0.0.33" @@ -9754,12 +10345,12 @@ tmp@^0.2.1: to-fast-properties@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-1.0.3.tgz#b83571fa4d8c25b82e231b06e3a3055de4ca1a47" - integrity sha512-lxrWP8ejsq+7E3nNjwYmUBMAgjMTZoTI+sdBOpvNyijeDLa29LUn9QaoXAHv4+Z578hbmHHJKZknzxVtvo77og== + integrity sha1-uDVx+k2MJbguIxsG46MFXeTKGkc= to-object-path@^0.3.0: version "0.3.0" resolved "https://registry.yarnpkg.com/to-object-path/-/to-object-path-0.3.0.tgz#297588b7b0e7e0ac08e04e672f85c1f4999e17af" - integrity sha512-9mWHdnGRuh3onocaHzukyvCZhzvr6tiflAy/JRFXcJX0TjgfWA9pk9t8CMbzmBE4Jfw58pXbkngtBtqYxzNEyg== + integrity sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68= dependencies: kind-of "^3.0.2" @@ -9771,7 +10362,7 @@ to-readable-stream@^1.0.0: to-regex-range@^2.1.0: version "2.1.1" resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-2.1.1.tgz#7c80c17b9dfebe599e27367e0d4dd5590141db38" - integrity sha512-ZZWNfCjUokXXDGXFpZehJIkZqq91BcULFq/Pi7M5i4JnxXdhMKAK682z8bCW3o8Hj1wuuzoKcW3DfVzaP6VuNg== + integrity sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg= dependencies: is-number "^3.0.0" repeat-string "^1.6.1" @@ -9809,17 +10400,22 @@ tough-cookie@^2.3.3, tough-cookie@~2.5.0: tr46@~0.0.3: version "0.0.3" resolved "https://registry.yarnpkg.com/tr46/-/tr46-0.0.3.tgz#8184fd347dac9cdc185992f3a6622e14b9d9ab6a" - integrity sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw== + integrity sha1-gYT9NH2snNwYWZLzpmIuFLnZq2o= trim-right@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/trim-right/-/trim-right-1.0.1.tgz#cb2e1203067e0c8de1f614094b9fe45704ea6003" - integrity sha512-WZGXGstmCWgeevgTL54hrCuw1dyMQIzWy7ZfqRJfSmJZBwklI15egmQytFP6bPidmw3M8d5yEowl1niq4vmqZw== + integrity sha1-yy4SAwZ+DI3h9hQJS5/kVwTqYAM= + +"true-case-path@^2.2.1": + version "2.2.1" + resolved "https://registry.yarnpkg.com/true-case-path/-/true-case-path-2.2.1.tgz#c5bf04a5bbec3fd118be4084461b3a27c4d796bf" + integrity sha512-0z3j8R7MCjy10kc/g+qg7Ln3alJTodw9aDuVWZa3uiWqfuBMKeAeP2ocWcxoyM3D73yz3Jt/Pu4qPr4wHSdB/Q== ts-command-line-args@^2.2.0: - version "2.5.1" - resolved "https://registry.yarnpkg.com/ts-command-line-args/-/ts-command-line-args-2.5.1.tgz#e64456b580d1d4f6d948824c274cf6fa5f45f7f0" - integrity sha512-H69ZwTw3rFHb5WYpQya40YAX2/w7Ut75uUECbgBIsLmM+BNuYnxsltfyyLMxy6sEeKxgijLTnQtLd0nKd6+IYw== + version "2.2.1" + resolved "https://registry.yarnpkg.com/ts-command-line-args/-/ts-command-line-args-2.2.1.tgz#fd6913e542099012c0ffb2496126a8f38305c7d6" + integrity sha512-mnK68QA86FYzQYTSA/rxIjT/8EpKsvQw9QkawPic8I8t0gjAOw3Oa509NIRoaY1FmH7hdrncMp7t7o+vYoceNQ== dependencies: chalk "^4.1.0" command-line-args "^5.1.1" @@ -9857,11 +10453,11 @@ ts-generator@^0.1.1: ts-essentials "^1.0.0" ts-node@^10.4.0: - version "10.9.1" - resolved "https://registry.yarnpkg.com/ts-node/-/ts-node-10.9.1.tgz#e73de9102958af9e1f0b168a6ff320e25adcff4b" - integrity sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw== + version "10.7.0" + resolved "https://registry.yarnpkg.com/ts-node/-/ts-node-10.7.0.tgz#35d503d0fab3e2baa672a0e94f4b40653c2463f5" + integrity sha512-TbIGS4xgJoX2i3do417KSaep1uRAW/Lu+WAL2doDHC0D6ummjirVOXU5/7aiZotbQ5p1Zp9tP7U6cYhA0O7M8A== dependencies: - "@cspotcode/source-map-support" "^0.8.0" + "@cspotcode/source-map-support" "0.7.0" "@tsconfig/node10" "^1.0.7" "@tsconfig/node12" "^1.0.7" "@tsconfig/node14" "^1.0.0" @@ -9872,10 +10468,10 @@ ts-node@^10.4.0: create-require "^1.1.0" diff "^4.0.1" make-error "^1.1.1" - v8-compile-cache-lib "^3.0.1" + v8-compile-cache-lib "^3.0.0" yn "3.1.1" -tslib@^1.13.0, tslib@^1.8.1, tslib@^1.9.3: +tslib@^1.13.0, tslib@^1.8.1, tslib@^1.9.0, tslib@^1.9.3: version "1.14.1" resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.14.1.tgz#cf2d38bdc34a134bcaf1091c41f6619e2f672d00" integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg== @@ -9902,7 +10498,7 @@ tslint@^6.1.3: tsort@0.0.1: version "0.0.1" resolved "https://registry.yarnpkg.com/tsort/-/tsort-0.0.1.tgz#e2280f5e817f8bf4275657fd0f9aebd44f5a2786" - integrity sha512-Tyrf5mxF8Ofs1tNoxA13lFeZ2Zrbd6cKbuH3V+MQ5sb6DtBj5FjrXVsRWT8YvNAQTqNoz66dz1WsbigI22aEnw== + integrity sha1-4igPXoF/i/QnVlf9D5rr1E9aJ4Y= tsutils@^2.29.0: version "2.29.0" @@ -9921,7 +10517,7 @@ tsutils@^3.21.0: tunnel-agent@^0.6.0: version "0.6.0" resolved "https://registry.yarnpkg.com/tunnel-agent/-/tunnel-agent-0.6.0.tgz#27a5dea06b36b04a0a9966774b290868f0fc40fd" - integrity sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w== + integrity sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0= dependencies: safe-buffer "^5.0.1" @@ -9933,7 +10529,7 @@ tweetnacl-util@^0.15.0, tweetnacl-util@^0.15.1: tweetnacl@^0.14.3, tweetnacl@~0.14.0: version "0.14.5" resolved "https://registry.yarnpkg.com/tweetnacl/-/tweetnacl-0.14.5.tgz#5ae68177f192d4456269d108afa93ff8743f4f64" - integrity sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA== + integrity sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q= tweetnacl@^1.0.0, tweetnacl@^1.0.3: version "1.0.3" @@ -9950,7 +10546,7 @@ type-check@^0.4.0, type-check@~0.4.0: type-check@~0.3.2: version "0.3.2" resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.3.2.tgz#5884cab512cf1d355e3fb784f30804b2b520db72" - integrity sha512-ZCmOJdvOWDBYJlzAoFkC+Q0+bUyEOS1ltgp1MGU03fqHG+dbi9tBFU2Rd9QKiDZFAYrhPh2JUf7rZRIuHRKtOg== + integrity sha1-WITKtRLPHTVeP7eE8wgEsrUg23I= dependencies: prelude-ls "~1.1.2" @@ -9987,10 +10583,10 @@ type@^1.0.1: resolved "https://registry.yarnpkg.com/type/-/type-1.2.0.tgz#848dd7698dafa3e54a6c479e759c4bc3f18847a0" integrity sha512-+5nt5AAniqsCnu2cEQQdpzCAh33kVx8n0VoFidKpB1dVVLAN/F+bgVOqOJqOnEnrhp222clB5p3vUlD+1QAnfg== -type@^2.7.2: - version "2.7.2" - resolved "https://registry.yarnpkg.com/type/-/type-2.7.2.tgz#2376a15a3a28b1efa0f5350dcf72d24df6ef98d0" - integrity sha512-dzlvlNlt6AXU7EBSfpAscydQ7gXB+pPGsPnfJnZpiNJBDj7IaJzQlBZYGdEi4R9HmPdBv2XmWJ6YUtoTa7lmCw== +type@^2.5.0: + version "2.6.0" + resolved "https://registry.yarnpkg.com/type/-/type-2.6.0.tgz#3ca6099af5981d36ca86b78442973694278a219f" + integrity sha512-eiDBDOmkih5pMbo9OqsqPRGMljLodLcwd5XD5JbtNB0o89xZAwynY9EdCDsJU7LtcVCClu9DvM7/0Ep1hYX3EQ== typechain@^3.0.0: version "3.0.0" @@ -10006,9 +10602,9 @@ typechain@^3.0.0: ts-generator "^0.1.1" typechain@^8.0.0: - version "8.3.1" - resolved "https://registry.yarnpkg.com/typechain/-/typechain-8.3.1.tgz#dccbc839b94877997536c356380eff7325395cfb" - integrity sha512-fA7clol2IP/56yq6vkMTR+4URF1nGjV82Wx6Rf09EsqD4tkzMAvEaqYxVFCavJm/1xaRga/oD55K+4FtuXwQOQ== + version "8.0.0" + resolved "https://registry.yarnpkg.com/typechain/-/typechain-8.0.0.tgz#a5dbe754717a7e16247df52b5285903de600e8ff" + integrity sha512-rqDfDYc9voVAhmfVfAwzg3VYFvhvs5ck1X9T/iWkX745Cul4t+V/smjnyqrbDzWDbzD93xfld1epg7Y/uFAesQ== dependencies: "@types/prettier" "^2.1.1" debug "^4.3.1" @@ -10021,45 +10617,6 @@ typechain@^8.0.0: ts-command-line-args "^2.2.0" ts-essentials "^7.0.1" -typed-array-buffer@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/typed-array-buffer/-/typed-array-buffer-1.0.0.tgz#18de3e7ed7974b0a729d3feecb94338d1472cd60" - integrity sha512-Y8KTSIglk9OZEr8zywiIHG/kmQ7KWyjseXs1CbSo8vC42w7hg2HgYTxSWwP0+is7bWDc1H+Fo026CpHFwm8tkw== - dependencies: - call-bind "^1.0.2" - get-intrinsic "^1.2.1" - is-typed-array "^1.1.10" - -typed-array-byte-length@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/typed-array-byte-length/-/typed-array-byte-length-1.0.0.tgz#d787a24a995711611fb2b87a4052799517b230d0" - integrity sha512-Or/+kvLxNpeQ9DtSydonMxCx+9ZXOswtwJn17SNLvhptaXYDJvkFFP5zbfU/uLmvnBJlI4yrnXRxpdWH/M5tNA== - dependencies: - call-bind "^1.0.2" - for-each "^0.3.3" - has-proto "^1.0.1" - is-typed-array "^1.1.10" - -typed-array-byte-offset@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/typed-array-byte-offset/-/typed-array-byte-offset-1.0.0.tgz#cbbe89b51fdef9cd6aaf07ad4707340abbc4ea0b" - integrity sha512-RD97prjEt9EL8YgAgpOkf3O4IF9lhJFr9g0htQkm0rchFp/Vx7LW5Q8fSXXub7BXAODyUQohRMyOc3faCPd0hg== - dependencies: - available-typed-arrays "^1.0.5" - call-bind "^1.0.2" - for-each "^0.3.3" - has-proto "^1.0.1" - is-typed-array "^1.1.10" - -typed-array-length@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/typed-array-length/-/typed-array-length-1.0.4.tgz#89d83785e5c4098bec72e08b319651f0eac9c1bb" - integrity sha512-KjZypGq+I/H7HI5HlOoGHkWUUGq+Q0TPhQurLbyrVrvnKTBgzLhIJ7j6J/XTQOi0d1RjyZ0wdas8bKs2p0x3Ng== - dependencies: - call-bind "^1.0.2" - for-each "^0.3.3" - is-typed-array "^1.1.9" - typedarray-to-buffer@^3.1.5: version "3.1.5" resolved "https://registry.yarnpkg.com/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz#a97ee7a9ff42691b9f783ff1bc5112fe3fca9080" @@ -10070,34 +10627,34 @@ typedarray-to-buffer@^3.1.5: typedarray@^0.0.6: version "0.0.6" resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777" - integrity sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA== + integrity sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c= typescript@^4.5.4: - version "4.9.5" - resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.9.5.tgz#095979f9bcc0d09da324d58d03ce8f8374cbe65a" - integrity sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g== + version "4.6.3" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.6.3.tgz#eefeafa6afdd31d725584c67a0eaba80f6fc6c6c" + integrity sha512-yNIatDa5iaofVozS/uQJEl3JRWLKKGJKh6Yaiv0GLGSuhpFJe7P3SbHZ8/yjAHRQwKRoA6YZqlfjXWmVzoVSMw== typewise-core@^1.2, typewise-core@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/typewise-core/-/typewise-core-1.2.0.tgz#97eb91805c7f55d2f941748fa50d315d991ef195" - integrity sha512-2SCC/WLzj2SbUwzFOzqMCkz5amXLlxtJqDKTICqg30x+2DZxcfZN2MvQZmGfXWKNWaKK9pBPsvkcwv8bF/gxKg== + integrity sha1-l+uRgFx/VdL5QXSPpQ0xXZke8ZU= typewise@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/typewise/-/typewise-1.0.3.tgz#1067936540af97937cc5dcf9922486e9fa284651" - integrity sha512-aXofE06xGhaQSPzt8hlTY+/YWQhm9P0jYUp1f2XtmW/3Bk0qzXcyFWAtPoo2uTGQj1ZwbDuSyuxicq+aDo8lCQ== + integrity sha1-EGeTZUCvl5N8xdz5kiSG6fooRlE= dependencies: typewise-core "^1.2.0" typewiselite@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/typewiselite/-/typewiselite-1.0.0.tgz#c8882fa1bb1092c06005a97f34ef5c8508e3664e" - integrity sha512-J9alhjVHupW3Wfz6qFRGgQw0N3gr8hOkw6zm7FZ6UR1Cse/oD9/JVok7DNE9TT9IbciDHX2Ex9+ksE6cRmtymw== + integrity sha1-yIgvobsQksBgBal/NO9chQjjZk4= typical@^2.6.0, typical@^2.6.1: version "2.6.1" resolved "https://registry.yarnpkg.com/typical/-/typical-2.6.1.tgz#5c080e5d661cbbe38259d2e70a3c7253e873881d" - integrity sha512-ofhi8kjIje6npGozTip9Fr8iecmYfEbS06i0JnIg+rh51KakryWF4+jX8lLKZVhy6N+ID45WYSFCxPOdTWCzNg== + integrity sha1-XAgOXWYcu+OCWdLnCjxyU+hziB0= typical@^4.0.0: version "4.0.0" @@ -10110,23 +10667,23 @@ typical@^5.2.0: integrity sha512-dvdQgNDNJo+8B2uBQoqdb11eUCE1JQXhvjC/CZtgvZseVd5TYMXnq0+vuUemXbd/Se29cTaUuPX3YIc2xgbvIg== uglify-js@^3.1.4: - version "3.17.4" - resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-3.17.4.tgz#61678cf5fa3f5b7eb789bb345df29afb8257c22c" - integrity sha512-T9q82TJI9e/C1TAxYvfb16xO120tMVFZrGA3f9/P4424DNu6ypK103y0GPFVa17yotwSyZW5iYXgjYHkGrJW/g== + version "3.14.5" + resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-3.14.5.tgz#cdabb7d4954231d80cb4a927654c4655e51f4859" + integrity sha512-qZukoSxOG0urUTvjc2ERMTcAy+BiFh3weWAkeurLwjrCba73poHmG3E36XEjd/JGukMzwTL7uCxZiAexj8ppvQ== ultron@~1.1.0: version "1.1.1" resolved "https://registry.yarnpkg.com/ultron/-/ultron-1.1.1.tgz#9fe1536a10a664a65266a1e3ccf85fd36302bc9c" integrity sha512-UIEXBNeYmKptWH6z8ZnqTeS8fV74zG0/eRU9VGkpzz+LIJNs8W/zM/L+7ctCkRrgbNnnR0xxw4bKOr0cW0N0Og== -unbox-primitive@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/unbox-primitive/-/unbox-primitive-1.0.2.tgz#29032021057d5e6cdbd08c5129c226dff8ed6f9e" - integrity sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw== +unbox-primitive@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/unbox-primitive/-/unbox-primitive-1.0.1.tgz#085e215625ec3162574dc8859abee78a59b14471" + integrity sha512-tZU/3NqK3dA5gpE1KtyiJUrEB0lxnGkMFHptJ7q6ewdZ8s12QrODwNbhIJStmJkd1QDXa1NRA8aF2A1zk/Ypyw== dependencies: - call-bind "^1.0.2" - has-bigints "^1.0.2" - has-symbols "^1.0.3" + function-bind "^1.1.1" + has-bigints "^1.0.1" + has-symbols "^1.0.2" which-boxed-primitive "^1.0.2" unbzip2-stream@1.4.3: @@ -10142,12 +10699,15 @@ underscore@1.9.1: resolved "https://registry.yarnpkg.com/underscore/-/underscore-1.9.1.tgz#06dce34a0e68a7babc29b365b8e74b8925203961" integrity sha512-5/4etnCkd9c8gwgowi5/om/mYO5ajCaOgdzj/oW+0eQV9WxKBDZw5+ycmKmeaTXjInS/W0BzpGLo2xR2aBwZdg== -undici@^5.14.0: - version "5.24.0" - resolved "https://registry.yarnpkg.com/undici/-/undici-5.24.0.tgz#6133630372894cfeb3c3dab13b4c23866bd344b5" - integrity sha512-OKlckxBjFl0oXxcj9FU6oB8fDAaiRUq+D8jrFWGmOfI/gIyjk/IeS75LMzgYKUaeHzLUcYvf9bbJGSrUwTfwwQ== - dependencies: - busboy "^1.6.0" +undici@^4.14.1: + version "4.16.0" + resolved "https://registry.yarnpkg.com/undici/-/undici-4.16.0.tgz#469bb87b3b918818d3d7843d91a1d08da357d5ff" + integrity sha512-tkZSECUYi+/T1i4u+4+lwZmQgLXd4BLGlrc7KZPcLIW7Jpq99+Xpc30ONv7nS6F5UNOxp/HBZSSL9MafUrvJbw== + +undici@^5.4.0: + version "5.10.0" + resolved "https://registry.yarnpkg.com/undici/-/undici-5.10.0.tgz#dd9391087a90ccfbd007568db458674232ebf014" + integrity sha512-c8HsD3IbwmjjbLvoZuRI26TZic+TSEe8FPMLLOkN1AfYRhdjnKBU6yL+IwcSCbdZiX4e5t0lfMDLDCqj4Sq70g== union-value@^1.0.0: version "1.0.1" @@ -10177,12 +10737,12 @@ unorm@^1.3.3: unpipe@1.0.0, unpipe@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec" - integrity sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ== + integrity sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw= unset-value@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/unset-value/-/unset-value-1.0.0.tgz#8376873f7d2335179ffb1e6fc3a8ed0dfc8ab559" - integrity sha512-PcA2tsuGSF9cnySLHTLSh2qrQiJ70mn+r+Glzxv2TWZblxsxCC52BDlZoPCsz7STd9pN7EZetkWZBAvk4cgZdQ== + integrity sha1-g3aHP30jNRef+x5vw6jtDfyKtVk= dependencies: has-value "^0.3.1" isobject "^3.0.0" @@ -10197,27 +10757,39 @@ uri-js@^4.2.2: urix@^0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/urix/-/urix-0.1.0.tgz#da937f7a62e21fec1fd18d49b35c2935067a6c72" - integrity sha512-Am1ousAhSLBeB9cG/7k7r2R0zj50uDRlZHPGbazid5s9rlF1F/QKYObEKSIunSjIOkJZqwRRLpvewjEkM7pSqg== + integrity sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI= + +url-parse-lax@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/url-parse-lax/-/url-parse-lax-1.0.0.tgz#7af8f303645e9bd79a272e7a14ac68bc0609da73" + integrity sha1-evjzA2Rem9eaJy56FKxovAYJ2nM= + dependencies: + prepend-http "^1.0.1" url-parse-lax@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/url-parse-lax/-/url-parse-lax-3.0.0.tgz#16b5cafc07dbe3676c1b1999177823d6503acb0c" - integrity sha512-NjFKA0DidqPa5ciFcSrXnAltTtzz84ogy+NebPvfEgAck0+TNg4UJ4IN+fB7zRZfbgUf0syOo9MDxFkDSMuFaQ== + integrity sha1-FrXK/Afb42dsGxmZF3gj1lA6yww= dependencies: prepend-http "^2.0.0" url-set-query@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/url-set-query/-/url-set-query-1.0.0.tgz#016e8cfd7c20ee05cafe7795e892bd0702faa339" - integrity sha512-3AChu4NiXquPfeckE5R5cGdiHCMWJx1dwCWOmWIL4KHAziJNOFIYJlpGFeKDvwLPHovZRCxK3cYlwzqI9Vp+Gg== + integrity sha1-AW6M/Xwg7gXK/neV6JK9BwL6ozk= + +url-to-options@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/url-to-options/-/url-to-options-1.0.1.tgz#1505a03a289a48cbd7a434efbaeec5055f5633a9" + integrity sha1-FQWgOiiaSMvXpDTvuu7FBV9WM6k= url@^0.11.0: - version "0.11.2" - resolved "https://registry.yarnpkg.com/url/-/url-0.11.2.tgz#02f250a6e0d992b781828cd456d44f49bf2e19dd" - integrity sha512-7yIgNnrST44S7PJ5+jXbdIupfU1nWUdQJBFBeJRclPXiWgCvrSq5Frw8lr/i//n5sqDfzoKmBymMS81l4U/7cg== + version "0.11.0" + resolved "https://registry.yarnpkg.com/url/-/url-0.11.0.tgz#3838e97cfc60521eb73c525a8e55bfdd9e2e28f1" + integrity sha1-ODjpfPxgUh63PFJajlW/3Z4uKPE= dependencies: - punycode "^1.4.1" - qs "^6.11.2" + punycode "1.3.2" + querystring "0.2.0" use@^3.1.0: version "3.1.1" @@ -10225,9 +10797,9 @@ use@^3.1.0: integrity sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ== utf-8-validate@^5.0.2: - version "5.0.10" - resolved "https://registry.yarnpkg.com/utf-8-validate/-/utf-8-validate-5.0.10.tgz#d7d10ea39318171ca982718b6b96a8d2442571a2" - integrity sha512-Z6czzLq4u8fPOyx7TU6X3dvUZVvoJmxSQ+IcrlmagKhilxlhZgxPK6C5Jqbkw1IDUmFTM+cz9QDnnLTwDz/2gQ== + version "5.0.9" + resolved "https://registry.yarnpkg.com/utf-8-validate/-/utf-8-validate-5.0.9.tgz#ba16a822fbeedff1a58918f2a6a6b36387493ea3" + integrity sha512-Yek7dAy0v3Kl0orwMlvi7TPtiCNrdfHNd7Gcc/pLq4BLXqfAmd0J7OWMizUQnTTJsyjKn02mU7anqwfmUP4J8Q== dependencies: node-gyp-build "^4.3.0" @@ -10239,41 +10811,40 @@ utf8@3.0.0, utf8@^3.0.0: util-deprecate@^1.0.1, util-deprecate@~1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" - integrity sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw== + integrity sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8= util.promisify@^1.0.0: - version "1.1.2" - resolved "https://registry.yarnpkg.com/util.promisify/-/util.promisify-1.1.2.tgz#02b3dbadbb80071eee4c43aed58747afdfc516db" - integrity sha512-PBdZ03m1kBnQ5cjjO0ZvJMJS+QsbyIcFwi4hY4U76OQsCO9JrOYjbCFgIF76ccFg9xnJo7ZHPkqyj1GqmdS7MA== + version "1.1.1" + resolved "https://registry.yarnpkg.com/util.promisify/-/util.promisify-1.1.1.tgz#77832f57ced2c9478174149cae9b96e9918cd54b" + integrity sha512-/s3UsZUrIfa6xDhr7zZhnE9SLQ5RIXyYfiVnMMyMDzOc8WhWN4Nbh36H842OyurKbCDAesZOJaVyvmSl6fhGQw== dependencies: - call-bind "^1.0.2" - define-properties "^1.2.0" + call-bind "^1.0.0" + define-properties "^1.1.3" for-each "^0.3.3" - has-proto "^1.0.1" - has-symbols "^1.0.3" - object.getownpropertydescriptors "^2.1.6" - safe-array-concat "^1.0.0" + has-symbols "^1.0.1" + object.getownpropertydescriptors "^2.1.1" -util@^0.12.0, util@^0.12.5: - version "0.12.5" - resolved "https://registry.yarnpkg.com/util/-/util-0.12.5.tgz#5f17a6059b73db61a875668781a1c2b136bd6fbc" - integrity sha512-kZf/K6hEIrWHI6XqOFUiiMa+79wE/D8Q+NCNAWclkyg3b4d2k7s0QGepNjiABc+aR3N1PAyHL7p6UcLY6LmrnA== +util@^0.12.0: + version "0.12.4" + resolved "https://registry.yarnpkg.com/util/-/util-0.12.4.tgz#66121a31420df8f01ca0c464be15dfa1d1850253" + integrity sha512-bxZ9qtSlGUWSOy9Qa9Xgk11kSslpuZwaxCg4sNIDj6FLucDab2JxnHwyNTCpHMtK1MjoQiWQ6DiUMZYbSrO+Sw== dependencies: inherits "^2.0.3" is-arguments "^1.0.4" is-generator-function "^1.0.7" is-typed-array "^1.1.3" + safe-buffer "^5.1.2" which-typed-array "^1.1.2" utils-merge@1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/utils-merge/-/utils-merge-1.0.1.tgz#9f95710f50a267947b2ccc124741c1028427e713" - integrity sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA== + integrity sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM= uuid@2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/uuid/-/uuid-2.0.1.tgz#c2a30dedb3e535d72ccf82e343941a50ba8533ac" - integrity sha512-nWg9+Oa3qD2CQzHIP4qKUqwNfzKn8P0LtFhotaCTFchsV7ZfDhAybeip/HZVeMIpZi9JgY1E3nUlwaCmZT1sEg== + integrity sha1-wqMN7bPlNdcsz4LjQ5QaULqFM6w= uuid@3.3.2: version "3.3.2" @@ -10290,15 +10861,10 @@ uuid@^8.3.2: resolved "https://registry.yarnpkg.com/uuid/-/uuid-8.3.2.tgz#80d5b5ced271bb9af6c445f21a1a04c606cefbe2" integrity sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg== -uuid@^9.0.0: - version "9.0.1" - resolved "https://registry.yarnpkg.com/uuid/-/uuid-9.0.1.tgz#e188d4c8853cc722220392c424cd637f32293f30" - integrity sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA== - -v8-compile-cache-lib@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz#6336e8d71965cb3d35a1bbb7868445a7c05264bf" - integrity sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg== +v8-compile-cache-lib@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.0.tgz#0582bcb1c74f3a2ee46487ceecf372e46bce53e8" + integrity sha512-mpSYqfsFvASnSn5qMiwrr4VKfumbPyONLCOPmsR3A6pTY/r0+tSaVbgPWSAIuzbk3lCTa+FForeTiO+wBQGkjA== validate-npm-package-license@^3.0.1: version "3.0.4" @@ -10316,26 +10882,17 @@ varint@^5.0.0: vary@^1, vary@~1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/vary/-/vary-1.1.2.tgz#2299f02c6ded30d4a5961b0b9f74524a18f634fc" - integrity sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg== + integrity sha1-IpnwLG3tMNSllhsLn3RSShj2NPw= verror@1.10.0: version "1.10.0" resolved "https://registry.yarnpkg.com/verror/-/verror-1.10.0.tgz#3a105ca17053af55d6e270c1f8288682e18da400" - integrity sha512-ZZKSmDAEFOijERBLkmYfJ+vmk3w+7hOLYDNkRCuRuMJGEmqYNCNLyBBFwWKVMhfwaEF3WOd0Zlw86U/WC/+nYw== + integrity sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA= dependencies: assert-plus "^1.0.0" core-util-is "1.0.2" extsprintf "^1.2.0" -web3-bzz@1.10.0: - version "1.10.0" - resolved "https://registry.yarnpkg.com/web3-bzz/-/web3-bzz-1.10.0.tgz#ac74bc71cdf294c7080a79091079192f05c5baed" - integrity sha512-o9IR59io3pDUsXTsps5pO5hW1D5zBmg46iNc2t4j2DkaYHNdDLwk2IP9ukoM2wg47QILfPEJYzhTfkS/CcX0KA== - dependencies: - "@types/node" "^12.12.6" - got "12.1.0" - swarm-js "^0.1.40" - web3-bzz@1.2.11: version "1.2.11" resolved "https://registry.yarnpkg.com/web3-bzz/-/web3-bzz-1.2.11.tgz#41bc19a77444bd5365744596d778b811880f707f" @@ -10346,23 +10903,15 @@ web3-bzz@1.2.11: swarm-js "^0.1.40" underscore "1.9.1" -web3-bzz@1.7.4: - version "1.7.4" - resolved "https://registry.yarnpkg.com/web3-bzz/-/web3-bzz-1.7.4.tgz#9419e606e38a9777443d4ce40506ebd796e06075" - integrity sha512-w9zRhyEqTK/yi0LGRHjZMcPCfP24LBjYXI/9YxFw9VqsIZ9/G0CRCnUt12lUx0A56LRAMpF7iQ8eA73aBcO29Q== +web3-bzz@1.5.3: + version "1.5.3" + resolved "https://registry.yarnpkg.com/web3-bzz/-/web3-bzz-1.5.3.tgz#e36456905ce051138f9c3ce3623cbc73da088c2b" + integrity sha512-SlIkAqG0eS6cBS9Q2eBOTI1XFzqh83RqGJWnyrNZMDxUwsTVHL+zNnaPShVPvrWQA1Ub5b0bx1Kc5+qJVxsTJg== dependencies: "@types/node" "^12.12.6" got "9.6.0" swarm-js "^0.1.40" -web3-core-helpers@1.10.0: - version "1.10.0" - resolved "https://registry.yarnpkg.com/web3-core-helpers/-/web3-core-helpers-1.10.0.tgz#1016534c51a5df77ed4f94d1fcce31de4af37fad" - integrity sha512-pIxAzFDS5vnbXvfvLSpaA1tfRykAe9adw43YCKsEYQwH0gCLL0kMLkaCX3q+Q8EVmAh+e1jWL/nl9U0de1+++g== - dependencies: - web3-eth-iban "1.10.0" - web3-utils "1.10.0" - web3-core-helpers@1.2.11: version "1.2.11" resolved "https://registry.yarnpkg.com/web3-core-helpers/-/web3-core-helpers-1.2.11.tgz#84c681ed0b942c0203f3b324a245a127e8c67a99" @@ -10372,24 +10921,13 @@ web3-core-helpers@1.2.11: web3-eth-iban "1.2.11" web3-utils "1.2.11" -web3-core-helpers@1.7.4: - version "1.7.4" - resolved "https://registry.yarnpkg.com/web3-core-helpers/-/web3-core-helpers-1.7.4.tgz#f8f808928560d3e64e0c8d7bdd163aa4766bcf40" - integrity sha512-F8PH11qIkE/LpK4/h1fF/lGYgt4B6doeMi8rukeV/s4ivseZHHslv1L6aaijLX/g/j4PsFmR42byynBI/MIzFg== - dependencies: - web3-eth-iban "1.7.4" - web3-utils "1.7.4" - -web3-core-method@1.10.0: - version "1.10.0" - resolved "https://registry.yarnpkg.com/web3-core-method/-/web3-core-method-1.10.0.tgz#82668197fa086e8cc8066742e35a9d72535e3412" - integrity sha512-4R700jTLAMKDMhQ+nsVfIXvH6IGJlJzGisIfMKWAIswH31h5AZz7uDUW2YctI+HrYd+5uOAlS4OJeeT9bIpvkA== +web3-core-helpers@1.5.3: + version "1.5.3" + resolved "https://registry.yarnpkg.com/web3-core-helpers/-/web3-core-helpers-1.5.3.tgz#099030235c477aadf39a94199ef40092151d563c" + integrity sha512-Ip1IjB3S8vN7Kf1PPjK41U5gskmMk6IJQlxIVuS8/1U7n/o0jC8krqtpRwiMfAgYyw3TXwBFtxSRTvJtnLyXZw== dependencies: - "@ethersproject/transactions" "^5.6.2" - web3-core-helpers "1.10.0" - web3-core-promievent "1.10.0" - web3-core-subscriptions "1.10.0" - web3-utils "1.10.0" + web3-eth-iban "1.5.3" + web3-utils "1.5.3" web3-core-method@1.2.11: version "1.2.11" @@ -10403,23 +10941,17 @@ web3-core-method@1.2.11: web3-core-subscriptions "1.2.11" web3-utils "1.2.11" -web3-core-method@1.7.4: - version "1.7.4" - resolved "https://registry.yarnpkg.com/web3-core-method/-/web3-core-method-1.7.4.tgz#3873c6405e1a0a8a1efc1d7b28de8b7550b00c15" - integrity sha512-56K7pq+8lZRkxJyzf5MHQPI9/VL3IJLoy4L/+q8HRdZJ3CkB1DkXYaXGU2PeylG1GosGiSzgIfu1ljqS7CP9xQ== - dependencies: - "@ethersproject/transactions" "^5.6.2" - web3-core-helpers "1.7.4" - web3-core-promievent "1.7.4" - web3-core-subscriptions "1.7.4" - web3-utils "1.7.4" - -web3-core-promievent@1.10.0: - version "1.10.0" - resolved "https://registry.yarnpkg.com/web3-core-promievent/-/web3-core-promievent-1.10.0.tgz#cbb5b3a76b888df45ed3a8d4d8d4f54ccb66a37b" - integrity sha512-68N7k5LWL5R38xRaKFrTFT2pm2jBNFaM4GioS00YjAKXRQ3KjmhijOMG3TICz6Aa5+6GDWYelDNx21YAeZ4YTg== +web3-core-method@1.5.3: + version "1.5.3" + resolved "https://registry.yarnpkg.com/web3-core-method/-/web3-core-method-1.5.3.tgz#6cff97ed19fe4ea2e9183d6f703823a079f5132c" + integrity sha512-8wJrwQ2qD9ibWieF9oHXwrJsUGrv3XAtEkNeyvyNMpktNTIjxJ2jaFGQUuLiyUrMubD18XXgLk4JS6PJU4Loeg== dependencies: - eventemitter3 "4.0.4" + "@ethereumjs/common" "^2.4.0" + "@ethersproject/transactions" "^5.0.0-beta.135" + web3-core-helpers "1.5.3" + web3-core-promievent "1.5.3" + web3-core-subscriptions "1.5.3" + web3-utils "1.5.3" web3-core-promievent@1.2.11: version "1.2.11" @@ -10428,24 +10960,13 @@ web3-core-promievent@1.2.11: dependencies: eventemitter3 "4.0.4" -web3-core-promievent@1.7.4: - version "1.7.4" - resolved "https://registry.yarnpkg.com/web3-core-promievent/-/web3-core-promievent-1.7.4.tgz#80a75633fdfe21fbaae2f1e38950edb2f134868c" - integrity sha512-o4uxwXKDldN7ER7VUvDfWsqTx9nQSP1aDssi1XYXeYC2xJbVo0n+z6ryKtmcoWoRdRj7uSpVzal3nEmlr480mA== +web3-core-promievent@1.5.3: + version "1.5.3" + resolved "https://registry.yarnpkg.com/web3-core-promievent/-/web3-core-promievent-1.5.3.tgz#3f11833c3dc6495577c274350b61144e0a4dba01" + integrity sha512-CFfgqvk3Vk6PIAxtLLuX+pOMozxkKCY+/GdGr7weMh033mDXEPvwyVjoSRO1PqIKj668/hMGQsVoIgbyxkJ9Mg== dependencies: eventemitter3 "4.0.4" -web3-core-requestmanager@1.10.0: - version "1.10.0" - resolved "https://registry.yarnpkg.com/web3-core-requestmanager/-/web3-core-requestmanager-1.10.0.tgz#4b34f6e05837e67c70ff6f6993652afc0d54c340" - integrity sha512-3z/JKE++Os62APml4dvBM+GAuId4h3L9ckUrj7ebEtS2AR0ixyQPbrBodgL91Sv7j7cQ3Y+hllaluqjguxvSaQ== - dependencies: - util "^0.12.5" - web3-core-helpers "1.10.0" - web3-providers-http "1.10.0" - web3-providers-ipc "1.10.0" - web3-providers-ws "1.10.0" - web3-core-requestmanager@1.2.11: version "1.2.11" resolved "https://registry.yarnpkg.com/web3-core-requestmanager/-/web3-core-requestmanager-1.2.11.tgz#fe6eb603fbaee18530293a91f8cf26d8ae28c45a" @@ -10457,24 +10978,16 @@ web3-core-requestmanager@1.2.11: web3-providers-ipc "1.2.11" web3-providers-ws "1.2.11" -web3-core-requestmanager@1.7.4: - version "1.7.4" - resolved "https://registry.yarnpkg.com/web3-core-requestmanager/-/web3-core-requestmanager-1.7.4.tgz#2dc8a526dab8183dca3fef54658621801b1d0469" - integrity sha512-IuXdAm65BQtPL4aI6LZJJOrKAs0SM5IK2Cqo2/lMNvVMT9Kssq6qOk68Uf7EBDH0rPuINi+ReLP+uH+0g3AnPA== +web3-core-requestmanager@1.5.3: + version "1.5.3" + resolved "https://registry.yarnpkg.com/web3-core-requestmanager/-/web3-core-requestmanager-1.5.3.tgz#b339525815fd40e3a2a81813c864ddc413f7b6f7" + integrity sha512-9k/Bze2rs8ONix5IZR+hYdMNQv+ark2Ek2kVcrFgWO+LdLgZui/rn8FikPunjE+ub7x7pJaKCgVRbYFXjo3ZWg== dependencies: util "^0.12.0" - web3-core-helpers "1.7.4" - web3-providers-http "1.7.4" - web3-providers-ipc "1.7.4" - web3-providers-ws "1.7.4" - -web3-core-subscriptions@1.10.0: - version "1.10.0" - resolved "https://registry.yarnpkg.com/web3-core-subscriptions/-/web3-core-subscriptions-1.10.0.tgz#b534592ee1611788fc0cb0b95963b9b9b6eacb7c" - integrity sha512-HGm1PbDqsxejI075gxBc5OSkwymilRWZufIy9zEpnWKNmfbuv5FfHgW1/chtJP6aP3Uq2vHkvTDl3smQBb8l+g== - dependencies: - eventemitter3 "4.0.4" - web3-core-helpers "1.10.0" + web3-core-helpers "1.5.3" + web3-providers-http "1.5.3" + web3-providers-ipc "1.5.3" + web3-providers-ws "1.5.3" web3-core-subscriptions@1.2.11: version "1.2.11" @@ -10485,26 +10998,13 @@ web3-core-subscriptions@1.2.11: underscore "1.9.1" web3-core-helpers "1.2.11" -web3-core-subscriptions@1.7.4: - version "1.7.4" - resolved "https://registry.yarnpkg.com/web3-core-subscriptions/-/web3-core-subscriptions-1.7.4.tgz#cfbd3fa71081a8c8c6f1a64577a1a80c5bd9826f" - integrity sha512-VJvKWaXRyxk2nFWumOR94ut9xvjzMrRtS38c4qj8WBIRSsugrZr5lqUwgndtj0qx4F+50JhnU++QEqUEAtKm3g== +web3-core-subscriptions@1.5.3: + version "1.5.3" + resolved "https://registry.yarnpkg.com/web3-core-subscriptions/-/web3-core-subscriptions-1.5.3.tgz#d7d69c4caad65074212028656e9dc56ca5c2159d" + integrity sha512-L2m9vG1iRN6thvmv/HQwO2YLhOQlmZU8dpLG6GSo9FBN14Uch868Swk0dYVr3rFSYjZ/GETevSXU+O+vhCummA== dependencies: eventemitter3 "4.0.4" - web3-core-helpers "1.7.4" - -web3-core@1.10.0: - version "1.10.0" - resolved "https://registry.yarnpkg.com/web3-core/-/web3-core-1.10.0.tgz#9aa07c5deb478cf356c5d3b5b35afafa5fa8e633" - integrity sha512-fWySwqy2hn3TL89w5TM8wXF1Z2Q6frQTKHWmP0ppRQorEK8NcHJRfeMiv/mQlSKoTS1F6n/nv2uyZsixFycjYQ== - dependencies: - "@types/bn.js" "^5.1.1" - "@types/node" "^12.12.6" - bignumber.js "^9.0.0" - web3-core-helpers "1.10.0" - web3-core-method "1.10.0" - web3-core-requestmanager "1.10.0" - web3-utils "1.10.0" + web3-core-helpers "1.5.3" web3-core@1.2.11: version "1.2.11" @@ -10519,26 +11019,18 @@ web3-core@1.2.11: web3-core-requestmanager "1.2.11" web3-utils "1.2.11" -web3-core@1.7.4: - version "1.7.4" - resolved "https://registry.yarnpkg.com/web3-core/-/web3-core-1.7.4.tgz#943fff99134baedafa7c65b4a0bbd424748429ff" - integrity sha512-L0DCPlIh9bgIED37tYbe7bsWrddoXYc897ANGvTJ6MFkSNGiMwDkTLWSgYd9Mf8qu8b4iuPqXZHMwIo4atoh7Q== +web3-core@1.5.3: + version "1.5.3" + resolved "https://registry.yarnpkg.com/web3-core/-/web3-core-1.5.3.tgz#59f8728b27c8305b349051326aa262b9b7e907bf" + integrity sha512-ACTbu8COCu+0eUNmd9pG7Q9EVsNkAg2w3Y7SqhDr+zjTgbSHZV01jXKlapm9z+G3AN/BziV3zGwudClJ4u4xXQ== dependencies: - "@types/bn.js" "^5.1.0" + "@types/bn.js" "^4.11.5" "@types/node" "^12.12.6" bignumber.js "^9.0.0" - web3-core-helpers "1.7.4" - web3-core-method "1.7.4" - web3-core-requestmanager "1.7.4" - web3-utils "1.7.4" - -web3-eth-abi@1.10.0: - version "1.10.0" - resolved "https://registry.yarnpkg.com/web3-eth-abi/-/web3-eth-abi-1.10.0.tgz#53a7a2c95a571e205e27fd9e664df4919483cce1" - integrity sha512-cwS+qRBWpJ43aI9L3JS88QYPfFcSJJ3XapxOQ4j40v6mk7ATpA8CVK1vGTzpihNlOfMVRBkR95oAj7oL6aiDOg== - dependencies: - "@ethersproject/abi" "^5.6.3" - web3-utils "1.10.0" + web3-core-helpers "1.5.3" + web3-core-method "1.5.3" + web3-core-requestmanager "1.5.3" + web3-utils "1.5.3" web3-eth-abi@1.2.11: version "1.2.11" @@ -10549,29 +11041,13 @@ web3-eth-abi@1.2.11: underscore "1.9.1" web3-utils "1.2.11" -web3-eth-abi@1.7.4: - version "1.7.4" - resolved "https://registry.yarnpkg.com/web3-eth-abi/-/web3-eth-abi-1.7.4.tgz#3fee967bafd67f06b99ceaddc47ab0970f2a614a" - integrity sha512-eMZr8zgTbqyL9MCTCAvb67RbVyN5ZX7DvA0jbLOqRWCiw+KlJKTGnymKO6jPE8n5yjk4w01e165Qb11hTDwHgg== - dependencies: - "@ethersproject/abi" "^5.6.3" - web3-utils "1.7.4" - -web3-eth-accounts@1.10.0: - version "1.10.0" - resolved "https://registry.yarnpkg.com/web3-eth-accounts/-/web3-eth-accounts-1.10.0.tgz#2942beca0a4291455f32cf09de10457a19a48117" - integrity sha512-wiq39Uc3mOI8rw24wE2n15hboLE0E9BsQLdlmsL4Zua9diDS6B5abXG0XhFcoNsXIGMWXVZz4TOq3u4EdpXF/Q== +web3-eth-abi@1.5.3: + version "1.5.3" + resolved "https://registry.yarnpkg.com/web3-eth-abi/-/web3-eth-abi-1.5.3.tgz#5aea9394d797f99ca0d9bd40c3417eb07241c96c" + integrity sha512-i/qhuFsoNrnV130CSRYX/z4SlCfSQ4mHntti5yTmmQpt70xZKYZ57BsU0R29ueSQ9/P+aQrL2t2rqkQkAloUxg== dependencies: - "@ethereumjs/common" "2.5.0" - "@ethereumjs/tx" "3.3.2" - eth-lib "0.2.8" - ethereumjs-util "^7.1.5" - scrypt-js "^3.0.1" - uuid "^9.0.0" - web3-core "1.10.0" - web3-core-helpers "1.10.0" - web3-core-method "1.10.0" - web3-utils "1.10.0" + "@ethersproject/abi" "5.0.7" + web3-utils "1.5.3" web3-eth-accounts@1.2.11: version "1.2.11" @@ -10590,36 +11066,22 @@ web3-eth-accounts@1.2.11: web3-core-method "1.2.11" web3-utils "1.2.11" -web3-eth-accounts@1.7.4: - version "1.7.4" - resolved "https://registry.yarnpkg.com/web3-eth-accounts/-/web3-eth-accounts-1.7.4.tgz#7a24a4dfe947f7e9d1bae678529e591aa146167a" - integrity sha512-Y9vYLRKP7VU7Cgq6wG1jFaG2k3/eIuiTKAG8RAuQnb6Cd9k5BRqTm5uPIiSo0AP/u11jDomZ8j7+WEgkU9+Btw== +web3-eth-accounts@1.5.3: + version "1.5.3" + resolved "https://registry.yarnpkg.com/web3-eth-accounts/-/web3-eth-accounts-1.5.3.tgz#076c816ff4d68c9dffebdc7fd2bfaddcfc163d77" + integrity sha512-pdGhXgeBaEJENMvRT6W9cmji3Zz/46ugFSvmnLLw79qi5EH7XJhKISNVb41eWCrs4am5GhI67GLx5d2s2a72iw== dependencies: - "@ethereumjs/common" "^2.5.0" - "@ethereumjs/tx" "^3.3.2" + "@ethereumjs/common" "^2.3.0" + "@ethereumjs/tx" "^3.2.1" crypto-browserify "3.12.0" eth-lib "0.2.8" ethereumjs-util "^7.0.10" scrypt-js "^3.0.1" uuid "3.3.2" - web3-core "1.7.4" - web3-core-helpers "1.7.4" - web3-core-method "1.7.4" - web3-utils "1.7.4" - -web3-eth-contract@1.10.0: - version "1.10.0" - resolved "https://registry.yarnpkg.com/web3-eth-contract/-/web3-eth-contract-1.10.0.tgz#8e68c7654576773ec3c91903f08e49d0242c503a" - integrity sha512-MIC5FOzP/+2evDksQQ/dpcXhSqa/2hFNytdl/x61IeWxhh6vlFeSjq0YVTAyIzdjwnL7nEmZpjfI6y6/Ufhy7w== - dependencies: - "@types/bn.js" "^5.1.1" - web3-core "1.10.0" - web3-core-helpers "1.10.0" - web3-core-method "1.10.0" - web3-core-promievent "1.10.0" - web3-core-subscriptions "1.10.0" - web3-eth-abi "1.10.0" - web3-utils "1.10.0" + web3-core "1.5.3" + web3-core-helpers "1.5.3" + web3-core-method "1.5.3" + web3-utils "1.5.3" web3-eth-contract@1.2.11: version "1.2.11" @@ -10636,33 +11098,19 @@ web3-eth-contract@1.2.11: web3-eth-abi "1.2.11" web3-utils "1.2.11" -web3-eth-contract@1.7.4: - version "1.7.4" - resolved "https://registry.yarnpkg.com/web3-eth-contract/-/web3-eth-contract-1.7.4.tgz#e5761cfb43d453f57be4777b2e5e7e1082078ff7" - integrity sha512-ZgSZMDVI1pE9uMQpK0T0HDT2oewHcfTCv0osEqf5qyn5KrcQDg1GT96/+S0dfqZ4HKj4lzS5O0rFyQiLPQ8LzQ== - dependencies: - "@types/bn.js" "^5.1.0" - web3-core "1.7.4" - web3-core-helpers "1.7.4" - web3-core-method "1.7.4" - web3-core-promievent "1.7.4" - web3-core-subscriptions "1.7.4" - web3-eth-abi "1.7.4" - web3-utils "1.7.4" - -web3-eth-ens@1.10.0: - version "1.10.0" - resolved "https://registry.yarnpkg.com/web3-eth-ens/-/web3-eth-ens-1.10.0.tgz#96a676524e0b580c87913f557a13ed810cf91cd9" - integrity sha512-3hpGgzX3qjgxNAmqdrC2YUQMTfnZbs4GeLEmy8aCWziVwogbuqQZ+Gzdfrym45eOZodk+lmXyLuAdqkNlvkc1g== +web3-eth-contract@1.5.3: + version "1.5.3" + resolved "https://registry.yarnpkg.com/web3-eth-contract/-/web3-eth-contract-1.5.3.tgz#12b03a4a16ce583a945f874bea2ff2fb4c5b81ad" + integrity sha512-Gdlt1L6cdHe83k7SdV6xhqCytVtOZkjD0kY/15x441AuuJ4JLubCHuqu69k2Dr3tWifHYVys/vG8QE/W16syGg== dependencies: - content-hash "^2.5.2" - eth-ens-namehash "2.0.8" - web3-core "1.10.0" - web3-core-helpers "1.10.0" - web3-core-promievent "1.10.0" - web3-eth-abi "1.10.0" - web3-eth-contract "1.10.0" - web3-utils "1.10.0" + "@types/bn.js" "^4.11.5" + web3-core "1.5.3" + web3-core-helpers "1.5.3" + web3-core-method "1.5.3" + web3-core-promievent "1.5.3" + web3-core-subscriptions "1.5.3" + web3-eth-abi "1.5.3" + web3-utils "1.5.3" web3-eth-ens@1.2.11: version "1.2.11" @@ -10679,27 +11127,19 @@ web3-eth-ens@1.2.11: web3-eth-contract "1.2.11" web3-utils "1.2.11" -web3-eth-ens@1.7.4: - version "1.7.4" - resolved "https://registry.yarnpkg.com/web3-eth-ens/-/web3-eth-ens-1.7.4.tgz#346720305379c0a539e226141a9602f1da7bc0c8" - integrity sha512-Gw5CVU1+bFXP5RVXTCqJOmHn71X2ghNk9VcEH+9PchLr0PrKbHTA3hySpsPco1WJAyK4t8SNQVlNr3+bJ6/WZA== +web3-eth-ens@1.5.3: + version "1.5.3" + resolved "https://registry.yarnpkg.com/web3-eth-ens/-/web3-eth-ens-1.5.3.tgz#ef6eee1ddf32b1ff9536fc7c599a74f2656bafe1" + integrity sha512-QmGFFtTGElg0E+3xfCIFhiUF+1imFi9eg/cdsRMUZU4F1+MZCC/ee+IAelYLfNTGsEslCqfAusliKOT9DdGGnw== dependencies: content-hash "^2.5.2" eth-ens-namehash "2.0.8" - web3-core "1.7.4" - web3-core-helpers "1.7.4" - web3-core-promievent "1.7.4" - web3-eth-abi "1.7.4" - web3-eth-contract "1.7.4" - web3-utils "1.7.4" - -web3-eth-iban@1.10.0: - version "1.10.0" - resolved "https://registry.yarnpkg.com/web3-eth-iban/-/web3-eth-iban-1.10.0.tgz#5a46646401965b0f09a4f58e7248c8a8cd22538a" - integrity sha512-0l+SP3IGhInw7Q20LY3IVafYEuufo4Dn75jAHT7c2aDJsIolvf2Lc6ugHkBajlwUneGfbRQs/ccYPQ9JeMUbrg== - dependencies: - bn.js "^5.2.1" - web3-utils "1.10.0" + web3-core "1.5.3" + web3-core-helpers "1.5.3" + web3-core-promievent "1.5.3" + web3-eth-abi "1.5.3" + web3-eth-contract "1.5.3" + web3-utils "1.5.3" web3-eth-iban@1.2.11: version "1.2.11" @@ -10709,25 +11149,13 @@ web3-eth-iban@1.2.11: bn.js "^4.11.9" web3-utils "1.2.11" -web3-eth-iban@1.7.4: - version "1.7.4" - resolved "https://registry.yarnpkg.com/web3-eth-iban/-/web3-eth-iban-1.7.4.tgz#711fb2547fdf0f988060027331b2b6c430505753" - integrity sha512-XyrsgWlZQMv5gRcjXMsNvAoCRvV5wN7YCfFV5+tHUCqN8g9T/o4XUS20vDWD0k4HNiAcWGFqT1nrls02MGZ08w== - dependencies: - bn.js "^5.2.1" - web3-utils "1.7.4" - -web3-eth-personal@1.10.0: - version "1.10.0" - resolved "https://registry.yarnpkg.com/web3-eth-personal/-/web3-eth-personal-1.10.0.tgz#94d525f7a29050a0c2a12032df150ac5ea633071" - integrity sha512-anseKn98w/d703eWq52uNuZi7GhQeVjTC5/svrBWEKob0WZ5kPdo+EZoFN0sp5a5ubbrk/E0xSl1/M5yORMtpg== +web3-eth-iban@1.5.3: + version "1.5.3" + resolved "https://registry.yarnpkg.com/web3-eth-iban/-/web3-eth-iban-1.5.3.tgz#91b1475893a877b10eac1de5cce6eb379fb81b5d" + integrity sha512-vMzmGqolYZvRHwP9P4Nf6G8uYM5aTLlQu2a34vz78p0KlDC+eV1th3+90Qeaupa28EG7OO0IT1F0BejiIauOPw== dependencies: - "@types/node" "^12.12.6" - web3-core "1.10.0" - web3-core-helpers "1.10.0" - web3-core-method "1.10.0" - web3-net "1.10.0" - web3-utils "1.10.0" + bn.js "^4.11.9" + web3-utils "1.5.3" web3-eth-personal@1.2.11: version "1.2.11" @@ -10741,35 +11169,17 @@ web3-eth-personal@1.2.11: web3-net "1.2.11" web3-utils "1.2.11" -web3-eth-personal@1.7.4: - version "1.7.4" - resolved "https://registry.yarnpkg.com/web3-eth-personal/-/web3-eth-personal-1.7.4.tgz#22c399794cb828a75703df8bb4b3c1331b471546" - integrity sha512-O10C1Hln5wvLQsDhlhmV58RhXo+GPZ5+W76frSsyIrkJWLtYQTCr5WxHtRC9sMD1idXLqODKKgI2DL+7xeZ0/g== +web3-eth-personal@1.5.3: + version "1.5.3" + resolved "https://registry.yarnpkg.com/web3-eth-personal/-/web3-eth-personal-1.5.3.tgz#4ebe09e9a77dd49d23d93b36b36cfbf4a6dae713" + integrity sha512-JzibJafR7ak/Icas8uvos3BmUNrZw1vShuNR5Cxjo+vteOC8XMqz1Vr7RH65B4bmlfb3bm9xLxetUHO894+Sew== dependencies: "@types/node" "^12.12.6" - web3-core "1.7.4" - web3-core-helpers "1.7.4" - web3-core-method "1.7.4" - web3-net "1.7.4" - web3-utils "1.7.4" - -web3-eth@1.10.0: - version "1.10.0" - resolved "https://registry.yarnpkg.com/web3-eth/-/web3-eth-1.10.0.tgz#38b905e2759697c9624ab080cfcf4e6c60b3a6cf" - integrity sha512-Z5vT6slNMLPKuwRyKGbqeGYC87OAy8bOblaqRTgg94CXcn/mmqU7iPIlG4506YdcdK3x6cfEDG7B6w+jRxypKA== - dependencies: - web3-core "1.10.0" - web3-core-helpers "1.10.0" - web3-core-method "1.10.0" - web3-core-subscriptions "1.10.0" - web3-eth-abi "1.10.0" - web3-eth-accounts "1.10.0" - web3-eth-contract "1.10.0" - web3-eth-ens "1.10.0" - web3-eth-iban "1.10.0" - web3-eth-personal "1.10.0" - web3-net "1.10.0" - web3-utils "1.10.0" + web3-core "1.5.3" + web3-core-helpers "1.5.3" + web3-core-method "1.5.3" + web3-net "1.5.3" + web3-utils "1.5.3" web3-eth@1.2.11: version "1.2.11" @@ -10790,32 +11200,23 @@ web3-eth@1.2.11: web3-net "1.2.11" web3-utils "1.2.11" -web3-eth@1.7.4: - version "1.7.4" - resolved "https://registry.yarnpkg.com/web3-eth/-/web3-eth-1.7.4.tgz#a7c1d3ccdbba4de4a82df7e3c4db716e4a944bf2" - integrity sha512-JG0tTMv0Ijj039emXNHi07jLb0OiWSA9O24MRSk5vToTQyDNXihdF2oyq85LfHuF690lXZaAXrjhtLNlYqb7Ug== - dependencies: - web3-core "1.7.4" - web3-core-helpers "1.7.4" - web3-core-method "1.7.4" - web3-core-subscriptions "1.7.4" - web3-eth-abi "1.7.4" - web3-eth-accounts "1.7.4" - web3-eth-contract "1.7.4" - web3-eth-ens "1.7.4" - web3-eth-iban "1.7.4" - web3-eth-personal "1.7.4" - web3-net "1.7.4" - web3-utils "1.7.4" - -web3-net@1.10.0: - version "1.10.0" - resolved "https://registry.yarnpkg.com/web3-net/-/web3-net-1.10.0.tgz#be53e7f5dafd55e7c9013d49c505448b92c9c97b" - integrity sha512-NLH/N3IshYWASpxk4/18Ge6n60GEvWBVeM8inx2dmZJVmRI6SJIlUxbL8jySgiTn3MMZlhbdvrGo8fpUW7a1GA== - dependencies: - web3-core "1.10.0" - web3-core-method "1.10.0" - web3-utils "1.10.0" +web3-eth@1.5.3: + version "1.5.3" + resolved "https://registry.yarnpkg.com/web3-eth/-/web3-eth-1.5.3.tgz#d7d1ac7198f816ab8a2088c01e0bf1eda45862fe" + integrity sha512-saFurA1L23Bd7MEf7cBli6/jRdMhD4X/NaMiO2mdMMCXlPujoudlIJf+VWpRWJpsbDFdu7XJ2WHkmBYT5R3p1Q== + dependencies: + web3-core "1.5.3" + web3-core-helpers "1.5.3" + web3-core-method "1.5.3" + web3-core-subscriptions "1.5.3" + web3-eth-abi "1.5.3" + web3-eth-accounts "1.5.3" + web3-eth-contract "1.5.3" + web3-eth-ens "1.5.3" + web3-eth-iban "1.5.3" + web3-eth-personal "1.5.3" + web3-net "1.5.3" + web3-utils "1.5.3" web3-net@1.2.11: version "1.2.11" @@ -10826,14 +11227,14 @@ web3-net@1.2.11: web3-core-method "1.2.11" web3-utils "1.2.11" -web3-net@1.7.4: - version "1.7.4" - resolved "https://registry.yarnpkg.com/web3-net/-/web3-net-1.7.4.tgz#3153dfd3423262dd6fbec7aae5467202c4cad431" - integrity sha512-d2Gj+DIARHvwIdmxFQ4PwAAXZVxYCR2lET0cxz4KXbE5Og3DNjJi+MoPkX+WqoUXqimu/EOd4Cd+7gefqVAFDg== +web3-net@1.5.3: + version "1.5.3" + resolved "https://registry.yarnpkg.com/web3-net/-/web3-net-1.5.3.tgz#545fee49b8e213b0c55cbe74ffd0295766057463" + integrity sha512-0W/xHIPvgVXPSdLu0iZYnpcrgNnhzHMC888uMlGP5+qMCt8VuflUZHy7tYXae9Mzsg1kxaJAS5lHVNyeNw4CoQ== dependencies: - web3-core "1.7.4" - web3-core-method "1.7.4" - web3-utils "1.7.4" + web3-core "1.5.3" + web3-core-method "1.5.3" + web3-utils "1.5.3" web3-provider-engine@14.2.1: version "14.2.1" @@ -10861,16 +11262,6 @@ web3-provider-engine@14.2.1: xhr "^2.2.0" xtend "^4.0.1" -web3-providers-http@1.10.0: - version "1.10.0" - resolved "https://registry.yarnpkg.com/web3-providers-http/-/web3-providers-http-1.10.0.tgz#864fa48675e7918c9a4374e5f664b32c09d0151b" - integrity sha512-eNr965YB8a9mLiNrkjAWNAPXgmQWfpBfkkn7tpEFlghfww0u3I0tktMZiaToJVcL2+Xq+81cxbkpeWJ5XQDwOA== - dependencies: - abortcontroller-polyfill "^1.7.3" - cross-fetch "^3.1.4" - es6-promise "^4.2.8" - web3-core-helpers "1.10.0" - web3-providers-http@1.2.11: version "1.2.11" resolved "https://registry.yarnpkg.com/web3-providers-http/-/web3-providers-http-1.2.11.tgz#1cd03442c61670572d40e4dcdf1faff8bd91e7c6" @@ -10879,22 +11270,14 @@ web3-providers-http@1.2.11: web3-core-helpers "1.2.11" xhr2-cookies "1.1.0" -web3-providers-http@1.7.4: - version "1.7.4" - resolved "https://registry.yarnpkg.com/web3-providers-http/-/web3-providers-http-1.7.4.tgz#8209cdcb115db5ccae1f550d1c4e3005e7538d02" - integrity sha512-AU+/S+49rcogUER99TlhW+UBMk0N2DxvN54CJ2pK7alc2TQ7+cprNPLHJu4KREe8ndV0fT6JtWUfOMyTvl+FRA== +web3-providers-http@1.5.3: + version "1.5.3" + resolved "https://registry.yarnpkg.com/web3-providers-http/-/web3-providers-http-1.5.3.tgz#74f170fc3d79eb7941d9fbc34e2a067d61ced0b2" + integrity sha512-5DpUyWGHtDAr2RYmBu34Fu+4gJuBAuNx2POeiJIooUtJ+Mu6pIx4XkONWH6V+Ez87tZAVAsFOkJRTYuzMr3rPw== dependencies: - web3-core-helpers "1.7.4" + web3-core-helpers "1.5.3" xhr2-cookies "1.1.0" -web3-providers-ipc@1.10.0: - version "1.10.0" - resolved "https://registry.yarnpkg.com/web3-providers-ipc/-/web3-providers-ipc-1.10.0.tgz#9747c7a6aee96a51488e32fa7c636c3460b39889" - integrity sha512-OfXG1aWN8L1OUqppshzq8YISkWrYHaATW9H8eh0p89TlWMc1KZOL9vttBuaBEi96D/n0eYDn2trzt22bqHWfXA== - dependencies: - oboe "2.1.5" - web3-core-helpers "1.10.0" - web3-providers-ipc@1.2.11: version "1.2.11" resolved "https://registry.yarnpkg.com/web3-providers-ipc/-/web3-providers-ipc-1.2.11.tgz#d16d6c9be1be6e0b4f4536c4acc16b0f4f27ef21" @@ -10904,22 +11287,13 @@ web3-providers-ipc@1.2.11: underscore "1.9.1" web3-core-helpers "1.2.11" -web3-providers-ipc@1.7.4: - version "1.7.4" - resolved "https://registry.yarnpkg.com/web3-providers-ipc/-/web3-providers-ipc-1.7.4.tgz#02e85e99e48f432c9d34cee7d786c3685ec9fcfa" - integrity sha512-jhArOZ235dZy8fS8090t60nTxbd1ap92ibQw5xIrAQ9m7LcZKNfmLAQUVsD+3dTFvadRMi6z1vCO7zRi84gWHw== +web3-providers-ipc@1.5.3: + version "1.5.3" + resolved "https://registry.yarnpkg.com/web3-providers-ipc/-/web3-providers-ipc-1.5.3.tgz#4bd7f5e445c2f3c2595fce0929c72bb879320a3f" + integrity sha512-JmeAptugVpmXI39LGxUSAymx0NOFdgpuI1hGQfIhbEAcd4sv7fhfd5D+ZU4oLHbRI8IFr4qfGU0uhR8BXhDzlg== dependencies: oboe "2.1.5" - web3-core-helpers "1.7.4" - -web3-providers-ws@1.10.0: - version "1.10.0" - resolved "https://registry.yarnpkg.com/web3-providers-ws/-/web3-providers-ws-1.10.0.tgz#cb0b87b94c4df965cdf486af3a8cd26daf3975e5" - integrity sha512-sK0fNcglW36yD5xjnjtSGBnEtf59cbw4vZzJ+CmOWIKGIR96mP5l684g0WD0Eo+f4NQc2anWWXG74lRc9OVMCQ== - dependencies: - eventemitter3 "4.0.4" - web3-core-helpers "1.10.0" - websocket "^1.0.32" + web3-core-helpers "1.5.3" web3-providers-ws@1.2.11: version "1.2.11" @@ -10931,25 +11305,15 @@ web3-providers-ws@1.2.11: web3-core-helpers "1.2.11" websocket "^1.0.31" -web3-providers-ws@1.7.4: - version "1.7.4" - resolved "https://registry.yarnpkg.com/web3-providers-ws/-/web3-providers-ws-1.7.4.tgz#6e60bcefb456f569a3e766e386d7807a96f90595" - integrity sha512-g72X77nrcHMFU8hRzQJzfgi/072n8dHwRCoTw+WQrGp+XCQ71fsk2qIu3Tp+nlp5BPn8bRudQbPblVm2uT4myQ== +web3-providers-ws@1.5.3: + version "1.5.3" + resolved "https://registry.yarnpkg.com/web3-providers-ws/-/web3-providers-ws-1.5.3.tgz#eec6cfb32bb928a4106de506f13a49070a21eabf" + integrity sha512-6DhTw4Q7nm5CFYEUHOJM0gAb3xFx+9gWpVveg3YxJ/ybR1BUvEWo3bLgIJJtX56cYX0WyY6DS35a7f0LOI1kVg== dependencies: eventemitter3 "4.0.4" - web3-core-helpers "1.7.4" + web3-core-helpers "1.5.3" websocket "^1.0.32" -web3-shh@1.10.0: - version "1.10.0" - resolved "https://registry.yarnpkg.com/web3-shh/-/web3-shh-1.10.0.tgz#c2979b87e0f67a7fef2ce9ee853bd7bfbe9b79a8" - integrity sha512-uNUUuNsO2AjX41GJARV9zJibs11eq6HtOe6Wr0FtRUcj8SN6nHeYIzwstAvJ4fXA53gRqFMTxdntHEt9aXVjpg== - dependencies: - web3-core "1.10.0" - web3-core-method "1.10.0" - web3-core-subscriptions "1.10.0" - web3-net "1.10.0" - web3-shh@1.2.11: version "1.2.11" resolved "https://registry.yarnpkg.com/web3-shh/-/web3-shh-1.2.11.tgz#f5d086f9621c9a47e98d438010385b5f059fd88f" @@ -10960,33 +11324,34 @@ web3-shh@1.2.11: web3-core-subscriptions "1.2.11" web3-net "1.2.11" -web3-shh@1.7.4: - version "1.7.4" - resolved "https://registry.yarnpkg.com/web3-shh/-/web3-shh-1.7.4.tgz#bee91cce2737c529fd347274010b548b6ea060f1" - integrity sha512-mlSZxSYcMkuMCxqhTYnZkUdahZ11h+bBv/8TlkXp/IHpEe4/Gg+KAbmfudakq3EzG/04z70XQmPgWcUPrsEJ+A== +web3-shh@1.5.3: + version "1.5.3" + resolved "https://registry.yarnpkg.com/web3-shh/-/web3-shh-1.5.3.tgz#3c04aa4cda9ba0b746d7225262401160f8e38b13" + integrity sha512-COfEXfsqoV/BkcsNLRxQqnWc1Teb8/9GxdGag5GtPC5gQC/vsN+7hYVJUwNxY9LtJPKYTij2DHHnx6UkITng+Q== dependencies: - web3-core "1.7.4" - web3-core-method "1.7.4" - web3-core-subscriptions "1.7.4" - web3-net "1.7.4" + web3-core "1.5.3" + web3-core-method "1.5.3" + web3-core-subscriptions "1.5.3" + web3-net "1.5.3" -web3-utils@1.10.0: - version "1.10.0" - resolved "https://registry.yarnpkg.com/web3-utils/-/web3-utils-1.10.0.tgz#ca4c1b431a765c14ac7f773e92e0fd9377ccf578" - integrity sha512-kSaCM0uMcZTNUSmn5vMEhlo02RObGNRRCkdX0V9UTAU0+lrvn0HSaudyCo6CQzuXUsnuY2ERJGCGPfeWmv19Rg== +web3-utils@1.2.11: + version "1.2.11" + resolved "https://registry.yarnpkg.com/web3-utils/-/web3-utils-1.2.11.tgz#af1942aead3fb166ae851a985bed8ef2c2d95a82" + integrity sha512-3Tq09izhD+ThqHEaWYX4VOT7dNPdZiO+c/1QMA0s5X2lDFKK/xHJb7cyTRRVzN2LvlHbR7baS1tmQhSua51TcQ== dependencies: - bn.js "^5.2.1" + bn.js "^4.11.9" + eth-lib "0.2.8" ethereum-bloom-filters "^1.0.6" - ethereumjs-util "^7.1.0" ethjs-unit "0.1.6" number-to-bn "1.7.0" randombytes "^2.1.0" + underscore "1.9.1" utf8 "3.0.0" -web3-utils@1.2.11: - version "1.2.11" - resolved "https://registry.yarnpkg.com/web3-utils/-/web3-utils-1.2.11.tgz#af1942aead3fb166ae851a985bed8ef2c2d95a82" - integrity sha512-3Tq09izhD+ThqHEaWYX4VOT7dNPdZiO+c/1QMA0s5X2lDFKK/xHJb7cyTRRVzN2LvlHbR7baS1tmQhSua51TcQ== +web3-utils@1.5.3: + version "1.5.3" + resolved "https://registry.yarnpkg.com/web3-utils/-/web3-utils-1.5.3.tgz#e914c9320cd663b2a09a5cb920ede574043eb437" + integrity sha512-56nRgA+Ad9SEyCv39g36rTcr5fpsd4L9LgV3FK0aB66nAMazLAA6Qz4lH5XrUKPDyBIPGJIR+kJsyRtwcu2q1Q== dependencies: bn.js "^4.11.9" eth-lib "0.2.8" @@ -10994,15 +11359,14 @@ web3-utils@1.2.11: ethjs-unit "0.1.6" number-to-bn "1.7.0" randombytes "^2.1.0" - underscore "1.9.1" utf8 "3.0.0" -web3-utils@1.7.4: - version "1.7.4" - resolved "https://registry.yarnpkg.com/web3-utils/-/web3-utils-1.7.4.tgz#eb6fa3706b058602747228234453811bbee017f5" - integrity sha512-acBdm6Evd0TEZRnChM/MCvGsMwYKmSh7OaUfNf5OKG0CIeGWD/6gqLOWIwmwSnre/2WrA1nKGId5uW2e5EfluA== +web3-utils@^1.0.0-beta.31: + version "1.7.1" + resolved "https://registry.yarnpkg.com/web3-utils/-/web3-utils-1.7.1.tgz#77d8bacaf426c66027d8aa4864d77f0ed211aacd" + integrity sha512-fef0EsqMGJUgiHPdX+KN9okVWshbIumyJPmR+btnD1HgvoXijKEkuKBv0OmUqjbeqmLKP2/N9EiXKJel5+E1Dw== dependencies: - bn.js "^5.2.1" + bn.js "^4.11.9" ethereum-bloom-filters "^1.0.6" ethereumjs-util "^7.1.0" ethjs-unit "0.1.6" @@ -11010,33 +11374,19 @@ web3-utils@1.7.4: randombytes "^2.1.0" utf8 "3.0.0" -web3-utils@^1.0.0-beta.31, web3-utils@^1.3.0: - version "1.10.2" - resolved "https://registry.yarnpkg.com/web3-utils/-/web3-utils-1.10.2.tgz#361103d28a94d5e2a87ba15d776a62c33303eb44" - integrity sha512-TdApdzdse5YR+5GCX/b/vQnhhbj1KSAtfrDtRW7YS0kcWp1gkJsN62gw6GzCaNTeXookB7UrLtmDUuMv65qgow== +web3-utils@^1.3.0: + version "1.6.1" + resolved "https://registry.yarnpkg.com/web3-utils/-/web3-utils-1.6.1.tgz#befcb23922b00603ab56d8c5b4158468dc494aca" + integrity sha512-RidGKv5kOkcerI6jQqDFDoTllQQqV+rPhTzZHhmbqtFObbYpU93uc+yG1LHivRTQhA6llIx67iudc/vzisgO+w== dependencies: - "@ethereumjs/util" "^8.1.0" - bn.js "^5.2.1" + bn.js "^4.11.9" ethereum-bloom-filters "^1.0.6" - ethereum-cryptography "^2.1.2" + ethereumjs-util "^7.1.0" ethjs-unit "0.1.6" number-to-bn "1.7.0" randombytes "^2.1.0" utf8 "3.0.0" -web3@1.10.0: - version "1.10.0" - resolved "https://registry.yarnpkg.com/web3/-/web3-1.10.0.tgz#2fde0009f59aa756c93e07ea2a7f3ab971091274" - integrity sha512-YfKY9wSkGcM8seO+daR89oVTcbu18NsVfvOngzqMYGUU0pPSQmE57qQDvQzUeoIOHAnXEBNzrhjQJmm8ER0rng== - dependencies: - web3-bzz "1.10.0" - web3-core "1.10.0" - web3-eth "1.10.0" - web3-eth-personal "1.10.0" - web3-net "1.10.0" - web3-shh "1.10.0" - web3-utils "1.10.0" - web3@1.2.11: version "1.2.11" resolved "https://registry.yarnpkg.com/web3/-/web3-1.2.11.tgz#50f458b2e8b11aa37302071c170ed61cff332975" @@ -11050,23 +11400,23 @@ web3@1.2.11: web3-shh "1.2.11" web3-utils "1.2.11" -web3@1.7.4: - version "1.7.4" - resolved "https://registry.yarnpkg.com/web3/-/web3-1.7.4.tgz#00c9aef8e13ade92fd773d845fff250535828e93" - integrity sha512-iFGK5jO32vnXM/ASaJBaI0+gVR6uHozvYdxkdhaeOCD6HIQ4iIXadbO2atVpE9oc/H8l2MovJ4LtPhG7lIBN8A== +web3@1.5.3: + version "1.5.3" + resolved "https://registry.yarnpkg.com/web3/-/web3-1.5.3.tgz#11882679453c645bf33620fbc255a243343075aa" + integrity sha512-eyBg/1K44flfv0hPjXfKvNwcUfIVDI4NX48qHQe6wd7C8nPSdbWqo9vLy6ksZIt9NLa90HjI8HsGYgnMSUxn6w== dependencies: - web3-bzz "1.7.4" - web3-core "1.7.4" - web3-eth "1.7.4" - web3-eth-personal "1.7.4" - web3-net "1.7.4" - web3-shh "1.7.4" - web3-utils "1.7.4" + web3-bzz "1.5.3" + web3-core "1.5.3" + web3-eth "1.5.3" + web3-eth-personal "1.5.3" + web3-net "1.5.3" + web3-shh "1.5.3" + web3-utils "1.5.3" webidl-conversions@^3.0.0: version "3.0.1" resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-3.0.1.tgz#24534275e2a7bc6be7bc86611cc16ae0a5654871" - integrity sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ== + integrity sha1-JFNCdeKnvGvnvIZhHMFq4KVlSHE= websocket@1.0.32: version "1.0.32" @@ -11100,7 +11450,7 @@ whatwg-fetch@^2.0.4: whatwg-url@^5.0.0: version "5.0.0" resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-5.0.0.tgz#966454e8765462e37644d3626f6742ce8b70965d" - integrity sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw== + integrity sha1-lmRU6HZUYuN2RNNib2dCzotwll0= dependencies: tr46 "~0.0.3" webidl-conversions "^3.0.0" @@ -11119,23 +11469,24 @@ which-boxed-primitive@^1.0.2: which-module@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/which-module/-/which-module-1.0.0.tgz#bba63ca861948994ff307736089e3b96026c2a4f" - integrity sha512-F6+WgncZi/mJDrammbTuHe1q0R5hOXv/mBaiNA2TCNT/LTHusX0V+CJnj9XT8ki5ln2UZyyddDgHfCzyrOH7MQ== + integrity sha1-u6Y8qGGUiZT/MHc2CJ47lgJsKk8= which-module@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/which-module/-/which-module-2.0.1.tgz#776b1fe35d90aebe99e8ac15eb24093389a4a409" - integrity sha512-iBdZ57RDvnOR9AGBhML2vFZf7h8vmBjhoaZqODJBFWHVtKkDmKuHai3cx5PgVMrX5YDNp27AofYbAwctSS+vhQ== + version "2.0.0" + resolved "https://registry.yarnpkg.com/which-module/-/which-module-2.0.0.tgz#d9ef07dce77b9902b8a3a8fa4b31c3e3f7e6e87a" + integrity sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho= -which-typed-array@^1.1.10, which-typed-array@^1.1.11, which-typed-array@^1.1.2: - version "1.1.11" - resolved "https://registry.yarnpkg.com/which-typed-array/-/which-typed-array-1.1.11.tgz#99d691f23c72aab6768680805a271b69761ed61a" - integrity sha512-qe9UWWpkeG5yzZ0tNYxDmd7vo58HDBc39mZ0xWWpolAGADdFOzkfamWLDxkOWcvHQKVmdTyQdLD4NOfjLWTKew== +which-typed-array@^1.1.2: + version "1.1.7" + resolved "https://registry.yarnpkg.com/which-typed-array/-/which-typed-array-1.1.7.tgz#2761799b9a22d4b8660b3c1b40abaa7739691793" + integrity sha512-vjxaB4nfDqwKI0ws7wZpxIlde1XrLX5uB0ZjpfshgmapJMD7jJWhZI+yToJTqaFByF0eNBcYxbjmCzoRP7CfEw== dependencies: available-typed-arrays "^1.0.5" call-bind "^1.0.2" - for-each "^0.3.3" - gopd "^1.0.1" + es-abstract "^1.18.5" + foreach "^2.0.5" has-tostringtag "^1.0.0" + is-typed-array "^1.1.7" which@1.3.1, which@^1.1.1, which@^1.2.9, which@^1.3.1: version "1.3.1" @@ -11144,7 +11495,7 @@ which@1.3.1, which@^1.1.1, which@^1.2.9, which@^1.3.1: dependencies: isexe "^2.0.0" -which@^2.0.1: +which@2.0.2, which@^2.0.1: version "2.0.2" resolved "https://registry.yarnpkg.com/which/-/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1" integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA== @@ -11161,17 +11512,17 @@ wide-align@1.1.3: window-size@^0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/window-size/-/window-size-0.2.0.tgz#b4315bb4214a3d7058ebeee892e13fa24d98b075" - integrity sha512-UD7d8HFA2+PZsbKyaOCEy8gMh1oDtHgJh1LfgjQ4zVXmYjAT/kvz3PueITKuqDiIXQe7yzpPnxX3lNc+AhQMyw== + integrity sha1-tDFbtCFKPXBY6+7okuE/ok2YsHU= -word-wrap@~1.2.3: - version "1.2.5" - resolved "https://registry.yarnpkg.com/word-wrap/-/word-wrap-1.2.5.tgz#d2c45c6dd4fbce621a66f136cbe328afd0410b34" - integrity sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA== +word-wrap@^1.2.3, word-wrap@~1.2.3: + version "1.2.3" + resolved "https://registry.yarnpkg.com/word-wrap/-/word-wrap-1.2.3.tgz#610636f6b1f703891bd34771ccb17fb93b47079c" + integrity sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ== wordwrap@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-1.0.0.tgz#27584810891456a4171c8d0226441ade90cbcaeb" - integrity sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q== + integrity sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus= wordwrapjs@^4.0.0: version "4.0.1" @@ -11181,15 +11532,15 @@ wordwrapjs@^4.0.0: reduce-flatten "^2.0.0" typical "^5.2.0" -workerpool@6.2.1: - version "6.2.1" - resolved "https://registry.yarnpkg.com/workerpool/-/workerpool-6.2.1.tgz#46fc150c17d826b86a008e5a4508656777e9c343" - integrity sha512-ILEIE97kDZvF9Wb9f6h5aXK4swSlKGUcOEGiIYb2OOu/IrDU9iwj0fD//SsA6E5ibwJxpEvhullJY4Sl4GcpAw== +workerpool@6.2.0: + version "6.2.0" + resolved "https://registry.yarnpkg.com/workerpool/-/workerpool-6.2.0.tgz#827d93c9ba23ee2019c3ffaff5c27fccea289e8b" + integrity sha512-Rsk5qQHJ9eowMH28Jwhe8HEbmdYDX4lwoMWshiCXugjtHqMD9ZbiqSDLxcsfdqsETPzVUtX5s1Z5kStiIM6l4A== wrap-ansi@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-2.1.0.tgz#d8fc3d284dd05794fe84973caecdd1cf824fdd85" - integrity sha512-vAaEaDM946gbNpH5pLVNR+vX2ht6n0Bt3GXwVB1AuAqZosOvHNF3P7wDnh8KLkSqgUh0uh77le7Owgoz+Z9XBw== + integrity sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU= dependencies: string-width "^1.0.1" strip-ansi "^3.0.1" @@ -11215,7 +11566,14 @@ wrap-ansi@^7.0.0: wrappy@1: version "1.0.2" resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" - integrity sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ== + integrity sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8= + +write@1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/write/-/write-1.0.3.tgz#0800e14523b923a387e415123c865616aae0f5c3" + integrity sha512-/lg70HAjtkUgWPVZhZcm+T4hkL8Zbtp1nFNOn3lRrxnlv50SRBv7cR7RqR+GMsd3hUXy9hWBo4CHTbFTcOYwig== + dependencies: + mkdirp "^0.5.1" ws@7.4.6: version "7.4.6" @@ -11244,9 +11602,9 @@ ws@^5.1.1: async-limiter "~1.0.0" ws@^7.4.6: - version "7.5.9" - resolved "https://registry.yarnpkg.com/ws/-/ws-7.5.9.tgz#54fa7db29f4c7cec68b1ddd3a89de099942bb591" - integrity sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q== + version "7.5.7" + resolved "https://registry.yarnpkg.com/ws/-/ws-7.5.7.tgz#9e0ac77ee50af70d58326ecff7e85eb3fa375e67" + integrity sha512-KMvVuFzpKBuiIXW3E4u3mySRO2/mCHSyZDJQM5NQ9Q9KHWHWh0NHgfbRMLLrceUK5qAL4ytALJbpRMjixFZh8A== xhr-request-promise@^0.1.2: version "0.1.3" @@ -11271,7 +11629,7 @@ xhr-request@^1.0.1, xhr-request@^1.1.0: xhr2-cookies@1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/xhr2-cookies/-/xhr2-cookies-1.1.0.tgz#7d77449d0999197f155cb73b23df72505ed89d48" - integrity sha512-hjXUA6q+jl/bd8ADHcVfFsSPIf+tyLIjuO9TwJC9WI6JP2zKcS7C+p56I9kCLLsaCiNT035iYvEUUzdEFj/8+g== + integrity sha1-fXdEnQmZGX8VXLc7I99yUF7YnUg= dependencies: cookiejar "^2.1.1" @@ -11288,9 +11646,9 @@ xhr@^2.0.4, xhr@^2.2.0, xhr@^2.3.3: xmlhttprequest@1.8.0: version "1.8.0" resolved "https://registry.yarnpkg.com/xmlhttprequest/-/xmlhttprequest-1.8.0.tgz#67fe075c5c24fef39f9d65f5f7b7fe75171968fc" - integrity sha512-58Im/U0mlVBLM38NdZjHyhuMtCqa61469k2YP/AaPbvCoV9aQGUpbJBj1QRm2ytRiVQBD/fsw7L2bJGDVQswBA== + integrity sha1-Z/4HXFwk/vOfnWX197f+dRcZaPw= -xtend@^4.0.0, xtend@^4.0.1, xtend@~4.0.0, xtend@~4.0.1: +xtend@^4.0.0, xtend@^4.0.1, xtend@^4.0.2, xtend@~4.0.0, xtend@~4.0.1: version "4.0.2" resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.2.tgz#bb72779f5fa465186b1f438f674fa347fdb5db54" integrity sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ== @@ -11298,7 +11656,7 @@ xtend@^4.0.0, xtend@^4.0.1, xtend@~4.0.0, xtend@~4.0.1: xtend@~2.1.1: version "2.1.2" resolved "https://registry.yarnpkg.com/xtend/-/xtend-2.1.2.tgz#6efecc2a4dad8e6962c4901b337ce7ba87b5d28b" - integrity sha512-vMNKzr2rHP9Dp/e1NQFnLQlwlhp9L/LfvnsVdHxN1f+uggyVI3i08uD14GPvCToPkdsRfyPqIyYGmIk58V98ZQ== + integrity sha1-bv7MKk2tjmlixJAbM3znuoe10os= dependencies: object-keys "~0.4.0" @@ -11320,7 +11678,7 @@ y18n@^5.0.5: yaeti@^0.0.6: version "0.0.6" resolved "https://registry.yarnpkg.com/yaeti/-/yaeti-0.0.6.tgz#f26f484d72684cf42bedfb76970aa1608fbf9577" - integrity sha512-MvQa//+KcZCUkBTIC9blM+CU9J2GzuTytsOUwf2lidtvkx/6gnEp1QvJv34t9vdjhFmha/mUiNDbN0D0mJWdug== + integrity sha1-8m9ITXJoTPQr7ft2lwqhYI+/lXc= yallist@^3.0.0, yallist@^3.0.2, yallist@^3.1.1: version "3.1.1" @@ -11332,11 +11690,6 @@ yallist@^4.0.0: resolved "https://registry.yarnpkg.com/yallist/-/yallist-4.0.0.tgz#9bb92790d9c0effec63be73519e11a35019a3a72" integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A== -yaml@^1.10.2: - version "1.10.2" - resolved "https://registry.yarnpkg.com/yaml/-/yaml-1.10.2.tgz#2301c5ffbf12b467de8da2333a459e29e7920e4b" - integrity sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg== - yargs-parser@13.1.2, yargs-parser@^13.1.2: version "13.1.2" resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-13.1.2.tgz#130f09702ebaeef2650d54ce6e3e5706f7a4fb38" @@ -11353,7 +11706,7 @@ yargs-parser@20.2.4: yargs-parser@^2.4.1: version "2.4.1" resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-2.4.1.tgz#85568de3cf150ff49fa51825f03a8c880ddcc5c4" - integrity sha512-9pIKIJhnI5tonzG6OnCFlz/yln8xHYcGl+pn3xR0Vzff0vzN1PbNRaelgfgRUwZ3s4i3jvxT9WhmUGL4whnasA== + integrity sha1-hVaN488VD/SfpRgl8DqMiA3cxcQ= dependencies: camelcase "^3.0.0" lodash.assign "^4.0.6" @@ -11414,7 +11767,7 @@ yargs@16.2.0: yargs@^4.7.1: version "4.8.1" resolved "https://registry.yarnpkg.com/yargs/-/yargs-4.8.1.tgz#c0c42924ca4aaa6b0e6da1739dfb216439f9ddc0" - integrity sha512-LqodLrnIDM3IFT+Hf/5sxBnEGECrfdC1uIbgZeJmESCSo4HoCAaKEus8MylXHAkdacGc0ye+Qa+dpkuom8uVYA== + integrity sha1-wMQpJMpKqmsObaFznfshZDn53cA= dependencies: cliui "^3.2.0" decamelize "^1.1.1" @@ -11448,8 +11801,3 @@ yocto-queue@^0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-0.1.0.tgz#0294eb3dee05028d31ee1a5fa2c556a6aaf10a1b" integrity sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q== - -zksync-web3@^0.14.3: - version "0.14.3" - resolved "https://registry.yarnpkg.com/zksync-web3/-/zksync-web3-0.14.3.tgz#64ac2a16d597464c3fc4ae07447a8007631c57c9" - integrity sha512-hT72th4AnqyLW1d5Jlv8N2B/qhEnl2NePK2A3org7tAa24niem/UAaHMkEvmWI3SF9waYUPtqAtjpf+yvQ9zvQ== From 0daab532874ee41b2baac3bc9189ffc851e42b87 Mon Sep 17 00:00:00 2001 From: Goran Vladika Date: Tue, 12 Sep 2023 20:17:12 +0200 Subject: [PATCH 087/292] Remove from dependencies --- package.json | 2 -- 1 file changed, 2 deletions(-) diff --git a/package.json b/package.json index 457ab06c..da87cd57 100644 --- a/package.json +++ b/package.json @@ -35,8 +35,6 @@ "deploy-erc20-rollup": "hardhat run scripts/createERC20Rollup.ts" }, "dependencies": { - "@arbitrum/sdk": "^3.1.3", - "@ethersproject/providers": "^5.7.2", "@offchainlabs/upgrade-executor": "1.1.0-beta.0", "@openzeppelin/contracts": "4.5.0", "@openzeppelin/contracts-upgradeable": "4.5.2", From accdcee45798af5025836a04ee5bdcb0669cb476 Mon Sep 17 00:00:00 2001 From: ganeshvanahalli Date: Wed, 13 Sep 2023 09:38:49 -0500 Subject: [PATCH 088/292] add getL2BlockRangeForL1 function to NodeInterface --- src/node-interface/NodeInterface.sol | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/src/node-interface/NodeInterface.sol b/src/node-interface/NodeInterface.sol index 9f3ec1d2..f768bf89 100644 --- a/src/node-interface/NodeInterface.sol +++ b/src/node-interface/NodeInterface.sol @@ -155,4 +155,14 @@ interface NodeInterface { // @dev returns 0 for chains like Nova that don't contain classic blocks // @return number the block number function nitroGenesisBlock() external pure returns (uint256 number); + + /** + * @notice Finds the L2 block number range that have the given L1 block number + * @param blockNum The L1 block number to search for the range + * @return blockRange The range containing the first and last L2 block numbers + */ + function getL2BlockRangeForL1(uint64 blockNum) + external + view + returns (uint64[] memory blockRange); } From 7dc1aa43829d9f4afe7251ad28d96a5d0e1d48c7 Mon Sep 17 00:00:00 2001 From: Goran Vladika Date: Thu, 14 Sep 2023 11:23:14 +0200 Subject: [PATCH 089/292] Update natspec for rollup creation --- src/rollup/RollupCreator.sol | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/rollup/RollupCreator.sol b/src/rollup/RollupCreator.sol index 98633541..390213bb 100644 --- a/src/rollup/RollupCreator.sol +++ b/src/rollup/RollupCreator.sol @@ -84,9 +84,9 @@ contract RollupCreator is Ownable { /** * @notice Create a new rollup * @dev After this setup: - * @dev - Rollup should be the owner of bridge - * @dev - RollupOwner should be the owner of Rollup's ProxyAdmin - * @dev - RollupOwner should be the owner of Rollup + * @dev - UpgradeExecutor should be the owner of rollup + * @dev - UpgradeExecutor should be the owner of proxyAdmin which manages bridge contracts + * @dev - config.rollupOwner should have executor role on upgradeExecutor * @dev - Bridge should have a single inbox and outbox * @dev - Validators and batch poster should be set if provided * @param config The configuration for the rollup From 55d096e219f352344bb7ba87ad66228f708d0a7a Mon Sep 17 00:00:00 2001 From: ganeshvanahalli Date: Fri, 15 Sep 2023 13:03:27 -0500 Subject: [PATCH 090/292] add set and get functions for Brotli compression level function to ArbOwner and ArbOwnerPublic interface --- src/precompiles/ArbOwner.sol | 6 ++++++ src/precompiles/ArbOwnerPublic.sol | 3 +++ 2 files changed, 9 insertions(+) diff --git a/src/precompiles/ArbOwner.sol b/src/precompiles/ArbOwner.sol index 46ac63c5..71b603f4 100644 --- a/src/precompiles/ArbOwner.sol +++ b/src/precompiles/ArbOwner.sol @@ -78,6 +78,12 @@ interface ArbOwner { /// @notice Sets the base charge (in L1 gas) attributed to each data batch in the calldata pricer function setPerBatchGasCharge(int64 cost) external; + /** + * @notice Sets the Brotli compression level used for fast compression + * Available in ArbOS version 12 + */ + function setBrotliCompressionLevel(uint64 level) external; + /// @notice Sets the cost amortization cap in basis points function setAmortizedCostCapBips(uint64 cap) external; diff --git a/src/precompiles/ArbOwnerPublic.sol b/src/precompiles/ArbOwnerPublic.sol index 1fbfdc03..ee9e2347 100644 --- a/src/precompiles/ArbOwnerPublic.sol +++ b/src/precompiles/ArbOwnerPublic.sol @@ -26,5 +26,8 @@ interface ArbOwnerPublic { /// @notice Get the infrastructure fee collector function getInfraFeeAccount() external view returns (address); + /// @notice Get the Brotli compression level used for fast compression + function getBrotliCompressionLevel() external view returns (uint64); + event ChainOwnerRectified(address rectifiedOwner); } From bb2ca53132116a59386b5f5010e711f485162c13 Mon Sep 17 00:00:00 2001 From: ganeshvanahalli Date: Fri, 15 Sep 2023 14:24:43 -0500 Subject: [PATCH 091/292] fix comment --- src/precompiles/ArbOwner.sol | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/precompiles/ArbOwner.sol b/src/precompiles/ArbOwner.sol index 71b603f4..3ff424f7 100644 --- a/src/precompiles/ArbOwner.sol +++ b/src/precompiles/ArbOwner.sol @@ -80,7 +80,7 @@ interface ArbOwner { /** * @notice Sets the Brotli compression level used for fast compression - * Available in ArbOS version 12 + * Available in ArbOS version 12 with default level as 1 */ function setBrotliCompressionLevel(uint64 level) external; From 436e1cf82c5696eb918d842256328ba86fbe5019 Mon Sep 17 00:00:00 2001 From: ganeshvanahalli Date: Mon, 18 Sep 2023 15:57:34 -0500 Subject: [PATCH 092/292] change return values --- src/node-interface/NodeInterface.sol | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/src/node-interface/NodeInterface.sol b/src/node-interface/NodeInterface.sol index f768bf89..b47c9997 100644 --- a/src/node-interface/NodeInterface.sol +++ b/src/node-interface/NodeInterface.sol @@ -157,12 +157,14 @@ interface NodeInterface { function nitroGenesisBlock() external pure returns (uint256 number); /** - * @notice Finds the L2 block number range that have the given L1 block number + * @notice Finds the L2 block number range that has the given L1 block number * @param blockNum The L1 block number to search for the range - * @return blockRange The range containing the first and last L2 block numbers + * Throws if no L2 block exist with the given L1 block number + * @return firstBlock The first L2 block number with the given L1 block number + * @return lastBlock The last L2 block number with the given L1 block number */ - function getL2BlockRangeForL1(uint64 blockNum) + function l2BlockRangeForL1(uint64 blockNum) external view - returns (uint64[] memory blockRange); + returns (uint64 firstBlock, uint64 lastBlock); } From 9edc1b943ed0255f050f91f265d96bc1ad9de1a2 Mon Sep 17 00:00:00 2001 From: ganeshvanahalli Date: Wed, 20 Sep 2023 10:55:53 -0500 Subject: [PATCH 093/292] add new function to fetch L1 block number of the L2 block --- src/node-interface/NodeInterface.sol | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/node-interface/NodeInterface.sol b/src/node-interface/NodeInterface.sol index b47c9997..bba06e52 100644 --- a/src/node-interface/NodeInterface.sol +++ b/src/node-interface/NodeInterface.sol @@ -156,6 +156,10 @@ interface NodeInterface { // @return number the block number function nitroGenesisBlock() external pure returns (uint256 number); + // @notice Returns the L1 block number of the L2 block + // @return l1BlockNum The L1 block number + function blockL1Num(uint64 l2BlockNum) external view returns (uint64 l1BlockNum); + /** * @notice Finds the L2 block number range that has the given L1 block number * @param blockNum The L1 block number to search for the range From 8e3d419d71d3bd82e3cdcbe4fb50409958eec35a Mon Sep 17 00:00:00 2001 From: amsanghi Date: Thu, 21 Sep 2023 20:13:00 +0530 Subject: [PATCH 094/292] Add option to post multiple batch in simple.sol --- src/mocks/Simple.sol | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/src/mocks/Simple.sol b/src/mocks/Simple.sol index a97e1d0c..7110bbaf 100644 --- a/src/mocks/Simple.sol +++ b/src/mocks/Simple.sol @@ -4,6 +4,7 @@ pragma solidity ^0.8.0; +import "../bridge/ISequencerInbox.sol"; import "../precompiles/ArbRetryableTx.sol"; import "../precompiles/ArbSys.sol"; @@ -124,4 +125,13 @@ contract Simple { (to.staticcall{gas: before - 10000}(input)); return before - gasleft(); } + + function postManyBatches(ISequencerInbox sequencerInbox, bytes memory batchData, uint256 numberToPost) external { + uint256 sequenceNumber = sequencerInbox.batchCount(); + uint256 delayedMessagesRead = sequencerInbox.totalDelayedMessagesRead(); + for (uint256 i = 0; i < numberToPost; i++) { + sequencerInbox.addSequencerL2Batch(sequenceNumber, batchData, delayedMessagesRead, IGasRefunder(address(0)), 0, 0); + sequenceNumber++; + } + } } From f8d5dd48a92cd1e9f561d9450a83cdf62e898938 Mon Sep 17 00:00:00 2001 From: Nodar Ambroladze Date: Wed, 27 Sep 2023 18:28:48 +0200 Subject: [PATCH 095/292] Add gas refunder contract to nitro contracts --- src/bridge/GasRefunder.sol | 255 +++++++++++++++++++++++++++++++++++++ 1 file changed, 255 insertions(+) create mode 100644 src/bridge/GasRefunder.sol diff --git a/src/bridge/GasRefunder.sol b/src/bridge/GasRefunder.sol new file mode 100644 index 00000000..0515ef3d --- /dev/null +++ b/src/bridge/GasRefunder.sol @@ -0,0 +1,255 @@ +// SPDX-License-Identifier: Apache-2.0 + +/* + * Copyright 2021, Offchain Labs, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +pragma solidity ^0.8.7; + +import "../libraries/IGasRefunder.sol"; + +import "@openzeppelin/contracts/access/Ownable.sol"; + +/** + * @notice DEPRECATED - only for classic version, see new repo (https://github.com/OffchainLabs/nitro/tree/master/contracts) + * for new updates + */ +contract GasRefunder is IGasRefunder, Ownable { + mapping(address => bool) public allowedContracts; + mapping(address => bool) public allowedRefundees; + address public disallower; + + struct CommonParameters { + uint128 maxRefundeeBalance; + uint32 extraGasMargin; + uint8 calldataCost; + uint64 maxGasTip; + uint64 maxGasCost; + uint32 maxSingleGasUsage; + } + + CommonParameters public commonParams; + + enum CommonParameterKey { + MAX_REFUNDEE_BALANCE, + EXTRA_GAS_MARGIN, + CALLDATA_COST, + MAX_GAS_TIP, + MAX_GAS_COST, + MAX_SINGLE_GAS_USAGE + } + + enum RefundDenyReason { + CONTRACT_NOT_ALLOWED, + REFUNDEE_NOT_ALLOWED, + REFUNDEE_ABOVE_MAX_BALANCE, + OUT_OF_FUNDS + } + + event RefundedGasCosts( + address indexed refundee, + address indexed contractAddress, + bool indexed success, + uint256 gas, + uint256 gasPrice, + uint256 amountPaid + ); + event RefundGasCostsDenied( + address indexed refundee, + address indexed contractAddress, + RefundDenyReason indexed reason, + uint256 gas + ); + event Deposited(address sender, uint256 amount); + event Withdrawn(address initiator, address destination, uint256 amount); + event ContractAllowedSet(address indexed addr, bool indexed allowed); + event RefundeeAllowedSet(address indexed addr, bool indexed allowed); + event DisallowerSet(address indexed addr); + event CommonParameterSet(CommonParameterKey indexed parameter, uint256 value); + + constructor() Ownable() { + commonParams = CommonParameters({ + maxRefundeeBalance: 0, // no limit + extraGasMargin: 4000, // 4k gas + calldataCost: 12, // Between 4 for zero bytes and 16 for non-zero bytes + maxGasTip: 2 gwei, + maxGasCost: 120 gwei, + maxSingleGasUsage: 2e6 // 2 million gas + }); + } + + function setDisallower(address addr) external onlyOwner { + disallower = addr; + emit DisallowerSet(addr); + } + + function allowContracts(address[] calldata addresses) external onlyOwner { + setContractsAllowedImpl(addresses, true); + } + + function disallowContracts(address[] calldata addresses) external { + require(msg.sender == owner() || msg.sender == disallower, "NOT_AUTHORIZED"); + setContractsAllowedImpl(addresses, false); + } + + function setContractsAllowedImpl(address[] calldata addresses, bool allow) internal { + for (uint256 i = 0; i < addresses.length; i++) { + address addr = addresses[i]; + allowedContracts[addr] = allow; + emit ContractAllowedSet(addr, allow); + } + } + + function allowRefundees(address[] calldata addresses) external onlyOwner { + setRefundeesAllowedImpl(addresses, true); + } + + function disallowRefundees(address[] calldata addresses) external { + require(msg.sender == owner() || msg.sender == disallower, "NOT_AUTHORIZED"); + setRefundeesAllowedImpl(addresses, false); + } + + function setRefundeesAllowedImpl(address[] calldata addresses, bool allow) internal { + for (uint256 i = 0; i < addresses.length; i++) { + address addr = addresses[i]; + allowedRefundees[addr] = allow; + emit RefundeeAllowedSet(addr, allow); + } + } + + function setMaxRefundeeBalance(uint128 newValue) external onlyOwner { + commonParams.maxRefundeeBalance = newValue; + emit CommonParameterSet(CommonParameterKey.MAX_REFUNDEE_BALANCE, newValue); + } + + function setExtraGasMargin(uint32 newValue) external onlyOwner { + commonParams.extraGasMargin = newValue; + emit CommonParameterSet(CommonParameterKey.EXTRA_GAS_MARGIN, newValue); + } + + function setCalldataCost(uint8 newValue) external onlyOwner { + commonParams.calldataCost = newValue; + emit CommonParameterSet(CommonParameterKey.CALLDATA_COST, newValue); + } + + function setMaxGasTip(uint64 newValue) external onlyOwner { + commonParams.maxGasTip = newValue; + emit CommonParameterSet(CommonParameterKey.MAX_GAS_TIP, newValue); + } + + function setMaxGasCost(uint64 newValue) external onlyOwner { + commonParams.maxGasCost = newValue; + emit CommonParameterSet(CommonParameterKey.MAX_GAS_COST, newValue); + } + + function setMaxSingleGasUsage(uint32 newValue) external onlyOwner { + commonParams.maxSingleGasUsage = newValue; + emit CommonParameterSet(CommonParameterKey.MAX_SINGLE_GAS_USAGE, newValue); + } + + receive() external payable { + emit Deposited(msg.sender, msg.value); + } + + function withdraw(address payable destination, uint256 amount) external onlyOwner { + // It's expected that destination is an EOA + (bool success, ) = destination.call{value: amount}(""); + require(success, "WITHDRAW_FAILED"); + emit Withdrawn(msg.sender, destination, amount); + } + + function onGasSpent( + address payable refundee, + uint256 gasUsed, + uint256 calldataSize + ) external override returns (bool success) { + uint256 startGasLeft = gasleft(); + + uint256 ownBalance = address(this).balance; + + if (ownBalance == 0) { + emit RefundGasCostsDenied(refundee, msg.sender, RefundDenyReason.OUT_OF_FUNDS, gasUsed); + return false; + } + + if (!allowedContracts[msg.sender]) { + emit RefundGasCostsDenied( + refundee, + msg.sender, + RefundDenyReason.CONTRACT_NOT_ALLOWED, + gasUsed + ); + return false; + } + if (!allowedRefundees[refundee]) { + emit RefundGasCostsDenied( + refundee, + msg.sender, + RefundDenyReason.REFUNDEE_NOT_ALLOWED, + gasUsed + ); + return false; + } + + uint256 estGasPrice = block.basefee + commonParams.maxGasTip; + if (tx.gasprice < estGasPrice) { + estGasPrice = tx.gasprice; + } + if (commonParams.maxGasCost != 0 && estGasPrice > commonParams.maxGasCost) { + estGasPrice = commonParams.maxGasCost; + } + + // Retrieve these variables before measuring gasleft() + uint256 refundeeBalance = refundee.balance; + uint256 maxRefundeeBalance = commonParams.maxRefundeeBalance; + uint256 maxSingleGasUsage = commonParams.maxSingleGasUsage; + + // Add in a bit of a buffer for the tx costs not measured with gasleft + gasUsed += + startGasLeft + + commonParams.extraGasMargin + + (calldataSize * commonParams.calldataCost); + // Split this up into two statements so that gasleft() comes after the storage loads + gasUsed -= gasleft(); + + if (maxSingleGasUsage != 0 && gasUsed > maxSingleGasUsage) { + gasUsed = maxSingleGasUsage; + } + + uint256 refundAmount = estGasPrice * gasUsed; + if (maxRefundeeBalance != 0 && refundeeBalance + refundAmount > maxRefundeeBalance) { + if (refundeeBalance > maxRefundeeBalance) { + // The refundee is already above their max balance + // emit RefundGasCostsDenied( + // refundee, + // msg.sender, + // RefundDenyReason.REFUNDEE_ABOVE_MAX_BALANCE, + // gasUsed + // ); + return false; + } else { + refundAmount = maxRefundeeBalance - refundeeBalance; + } + } + + if (refundAmount > ownBalance) { + refundAmount = ownBalance; + } + + // It's expected that refundee is an EOA + (success, ) = refundee.call{value: refundAmount}(""); + emit RefundedGasCosts(refundee, msg.sender, success, gasUsed, estGasPrice, refundAmount); + } +} \ No newline at end of file From f5da19efe8a477129c33ba49b11f96ab60e3b1f6 Mon Sep 17 00:00:00 2001 From: Nodar Ambroladze Date: Wed, 27 Sep 2023 18:38:07 +0200 Subject: [PATCH 096/292] Add endline at the end --- src/bridge/GasRefunder.sol | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/bridge/GasRefunder.sol b/src/bridge/GasRefunder.sol index 0515ef3d..82666a3c 100644 --- a/src/bridge/GasRefunder.sol +++ b/src/bridge/GasRefunder.sol @@ -252,4 +252,4 @@ contract GasRefunder is IGasRefunder, Ownable { (success, ) = refundee.call{value: refundAmount}(""); emit RefundedGasCosts(refundee, msg.sender, success, gasUsed, estGasPrice, refundAmount); } -} \ No newline at end of file +} From 5396cfaeb6125af4fec2f0a8bbdd3900ae68f0fa Mon Sep 17 00:00:00 2001 From: gzeon Date: Tue, 3 Oct 2023 23:01:20 +0900 Subject: [PATCH 097/292] test: fix --- test/contract/sequencerInboxForceInclude.spec.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/test/contract/sequencerInboxForceInclude.spec.ts b/test/contract/sequencerInboxForceInclude.spec.ts index 8d4d2ac5..43634737 100644 --- a/test/contract/sequencerInboxForceInclude.spec.ts +++ b/test/contract/sequencerInboxForceInclude.spec.ts @@ -224,11 +224,11 @@ describe('SequencerInboxForceInclude', async () => { const sequencerInboxFac = (await ethers.getContractFactory( 'SequencerInbox' )) as SequencerInbox__factory - const seqInboxTemplate = await sequencerInboxFac.deploy() + const seqInboxTemplate = await sequencerInboxFac.deploy(117964) const inboxFac = (await ethers.getContractFactory( 'Inbox' )) as Inbox__factory - const inboxTemplate = await inboxFac.deploy() + const inboxTemplate = await inboxFac.deploy(117964) const bridgeFac = (await ethers.getContractFactory( 'Bridge' )) as Bridge__factory From ee52a74cbe266e3b89f2a3aad8c8264577e5d20a Mon Sep 17 00:00:00 2001 From: Chris Buckland Date: Wed, 4 Oct 2023 11:38:43 +0200 Subject: [PATCH 098/292] Added test sequencer inbox opt --- package.json | 3 +- src/bridge/ISequencerInboxOpt.sol | 174 ++++++ src/bridge/SequencerInboxOpt.sol | 497 ++++++++++++++++++ src/test-helpers/RollupMock.sol | 6 + .../sequencerInboxForceInclude.spec.ts | 158 +++++- 5 files changed, 812 insertions(+), 26 deletions(-) create mode 100644 src/bridge/ISequencerInboxOpt.sol create mode 100644 src/bridge/SequencerInboxOpt.sol diff --git a/package.json b/package.json index 1ae9ddd4..e72a5ebe 100644 --- a/package.json +++ b/package.json @@ -26,7 +26,8 @@ "test:storage": "./test/storage/test.bash", "postinstall": "patch-package", "deploy-factory": "hardhat run scripts/deployment.ts", - "deploy-rollup": "hardhat run scripts/rollupCreation.ts" + "deploy-rollup": "hardhat run scripts/rollupCreation.ts", + "test": "hardhat --network hardhat test test/contract/*.spec.ts" }, "dependencies": { "@openzeppelin/contracts": "4.5.0", diff --git a/src/bridge/ISequencerInboxOpt.sol b/src/bridge/ISequencerInboxOpt.sol new file mode 100644 index 00000000..7135eb0f --- /dev/null +++ b/src/bridge/ISequencerInboxOpt.sol @@ -0,0 +1,174 @@ +// 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-version +pragma solidity >=0.6.9 <0.9.0; +pragma experimental ABIEncoderV2; + +import "../libraries/IGasRefunder.sol"; +import "./IDelayedMessageProvider.sol"; +import "./IBridge.sol"; + +interface ISequencerInboxOpt is IDelayedMessageProvider { + struct MaxTimeVariation { + uint256 delayBlocks; + uint256 futureBlocks; + uint256 delaySeconds; + uint256 futureSeconds; + } + + struct TimeBounds { + uint64 minTimestamp; + uint64 maxTimestamp; + uint64 minBlockNumber; + uint64 maxBlockNumber; + } + + enum BatchDataLocation { + TxInput, + SeparateBatchEvent, + NoData + } + + event SequencerBatchDelivered( + uint256 indexed batchSequenceNumber, + bytes32 indexed beforeAcc, + bytes32 indexed afterAcc, + bytes32 delayedAcc, + uint256 afterDelayedMessagesRead, + TimeBounds timeBounds, + BatchDataLocation dataLocation + ); + + event OwnerFunctionCalled(uint256 indexed id); + + /// @dev a separate event that emits batch data when this isn't easily accessible in the tx.input + event SequencerBatchData(uint256 indexed batchSequenceNumber, bytes data); + + /// @dev a valid keyset was added + event SetValidKeyset(bytes32 indexed keysetHash, bytes keysetBytes); + + /// @dev a keyset was invalidated + event InvalidateKeyset(bytes32 indexed keysetHash); + + function totalDelayedMessagesRead() external view returns (uint256); + + function bridge() external view returns (IBridge); + + /// @dev The size of the batch header + // solhint-disable-next-line func-name-mixedcase + function HEADER_LENGTH() external view returns (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-mixedcase + function DATA_AUTHENTICATED_FLAG() external view returns (bytes1); + + function rollup() external view returns (IOwnable); + + function isBatchPoster(address) external view returns (bool); + + function isSequencer(address) external view returns (bool); + + struct DasKeySetInfo { + bool isValidKeyset; + uint64 creationBlock; + } + + function maxTimeVariation() + external + view + returns ( + uint256, + uint256, + uint256, + uint256 + ); + + function dasKeySetInfo(bytes32) external view returns (bool, uint64); + + /// @notice Remove force inclusion delay after a L1 chainId fork + function removeDelayAfterFork() 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 included + function forceInclusion( + uint256 _totalDelayedMessagesRead, + uint8 kind, + uint64[2] calldata l1BlockAndTime, + uint256 baseFeeL1, + address sender, + bytes32 messageDataHash + ) external; + + function inboxAccs(uint256 index) external view returns (bytes32); + + function batchCount() external view returns (uint256); + + function isValidKeysetHash(bytes32 ksHash) external view returns (bool); + + /// @notice the creation block is intended to still be available after a keyset is deleted + function getKeysetCreationBlock(bytes32 ksHash) external view returns (uint256); + + // ---------- BatchPoster functions ---------- + + function addSequencerL2BatchFromOrigin( + uint256 sequenceNumber, + bytes calldata data, + uint256 afterDelayedMessagesRead, + IGasRefunder gasRefunder + ) external; + + function addSequencerL2Batch( + uint256 sequenceNumber, + bytes calldata 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 + */ + function setMaxTimeVariation(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 + */ + function setIsBatchPoster(address addr, bool isBatchPoster_) external; + + /** + * @notice Makes Data Availability Service keyset valid + * @param keysetBytes bytes of the serialized keyset + */ + function setValidKeyset(bytes calldata keysetBytes) external; + + /** + * @notice Invalidates a Data Availability Service keyset + * @param ksHash hash of the keyset + */ + function invalidateKeysetHash(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 + */ + function setIsSequencer(address addr, bool isSequencer_) external; +} diff --git a/src/bridge/SequencerInboxOpt.sol b/src/bridge/SequencerInboxOpt.sol new file mode 100644 index 00000000..681cbc01 --- /dev/null +++ b/src/bridge/SequencerInboxOpt.sol @@ -0,0 +1,497 @@ +// 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 + +pragma solidity ^0.8.0; + +import { + AlreadyInit, + HadZeroInit, + NotOrigin, + DataTooLarge, + NotRollup, + DelayedBackwards, + DelayedTooFar, + ForceIncludeBlockTooSoon, + ForceIncludeTimeTooSoon, + IncorrectMessagePreimage, + NotBatchPoster, + BadSequencerNumber, + DataNotAuthenticated, + AlreadyValidDASKeyset, + NoSuchKeyset, + NotForked, + NotOwner +} from "../libraries/Error.sol"; +import "./IBridge.sol"; +import "./IInbox.sol"; +import "./ISequencerInboxOpt.sol"; +import "../rollup/IRollupLogic.sol"; +import "./Messages.sol"; +import "../precompiles/ArbGasInfo.sol"; +import "../precompiles/ArbSys.sol"; + +import {L1MessageType_batchPostingReport} from "../libraries/MessageTypes.sol"; +import {GasRefundEnabled, IGasRefunder} from "../libraries/IGasRefunder.sol"; +import "../libraries/ArbitrumChecker.sol"; +import {MAX_DATA_SIZE} from "../libraries/Constants.sol"; + +/** + * @title Accepts batches from the sequencer and adds them to the rollup inbox. + * @notice Contains the inbox accumulator which is the ordering of all data and transactions to be processed by the rollup. + * As part of submitting a batch the sequencer is also expected to include items enqueued + * in the delayed inbox (Bridge.sol). If items in the delayed inbox are not included by a + * sequencer within a time limit they can be force included into the rollup inbox by anyone. + */ +contract SequencerInboxOpt is GasRefundEnabled, ISequencerInboxOpt { + uint256 public totalDelayedMessagesRead; + + IBridge public bridge; + + /// @inheritdoc ISequencerInboxOpt + uint256 public constant HEADER_LENGTH = 40; + + /// @inheritdoc ISequencerInboxOpt + bytes1 public constant DATA_AUTHENTICATED_FLAG = 0x40; + + IOwnable public rollup; + mapping(address => bool) public isBatchPoster; + ISequencerInboxOpt.MaxTimeVariation public maxTimeVariation; + + mapping(bytes32 => DasKeySetInfo) public dasKeySetInfo; + + modifier onlyRollupOwner() { + if (msg.sender != rollup.owner()) revert NotOwner(msg.sender, address(rollup)); + _; + } + + uint256 internal immutable deployTimeChainId = block.chainid; + + mapping(address => bool) public isSequencer; + + // If the chain this SequencerInbox is deployed on is an Arbitrum chain. + bool internal immutable hostChainIsArbitrum = ArbitrumChecker.runningOnArbitrum(); + + function _chainIdChanged() internal view returns (bool) { + return deployTimeChainId != block.chainid; + } + + constructor( + IBridge bridge_, + ISequencerInboxOpt.MaxTimeVariation memory maxTimeVariation_ + ) { + if (bridge != IBridge(address(0))) revert AlreadyInit(); + if (bridge_ == IBridge(address(0))) revert HadZeroInit(); + bridge = bridge_; + rollup = bridge_.rollup(); + maxTimeVariation = maxTimeVariation_; + } + + function getTimeBounds() internal view virtual returns (TimeBounds memory) { + TimeBounds memory bounds; + if (block.timestamp > maxTimeVariation.delaySeconds) { + bounds.minTimestamp = uint64(block.timestamp - maxTimeVariation.delaySeconds); + } + bounds.maxTimestamp = uint64(block.timestamp + maxTimeVariation.futureSeconds); + if (block.number > maxTimeVariation.delayBlocks) { + bounds.minBlockNumber = uint64(block.number - maxTimeVariation.delayBlocks); + } + bounds.maxBlockNumber = uint64(block.number + maxTimeVariation.futureBlocks); + return bounds; + } + + /// @inheritdoc ISequencerInboxOpt + function removeDelayAfterFork() external { + if (!_chainIdChanged()) revert NotForked(); + maxTimeVariation = ISequencerInboxOpt.MaxTimeVariation({ + delayBlocks: 1, + futureBlocks: 1, + delaySeconds: 1, + futureSeconds: 1 + }); + } + + /// @inheritdoc ISequencerInboxOpt + function forceInclusion( + uint256 _totalDelayedMessagesRead, + uint8 kind, + uint64[2] calldata l1BlockAndTime, + uint256 baseFeeL1, + address sender, + bytes32 messageDataHash + ) external { + if (_totalDelayedMessagesRead <= totalDelayedMessagesRead) revert DelayedBackwards(); + bytes32 messageHash = Messages.messageHash( + kind, + sender, + l1BlockAndTime[0], + l1BlockAndTime[1], + _totalDelayedMessagesRead - 1, + baseFeeL1, + messageDataHash + ); + // Can only force-include after the Sequencer-only window has expired. + if (l1BlockAndTime[0] + maxTimeVariation.delayBlocks >= block.number) + revert ForceIncludeBlockTooSoon(); + if (l1BlockAndTime[1] + maxTimeVariation.delaySeconds >= block.timestamp) + revert ForceIncludeTimeTooSoon(); + + // Verify that message hash represents the last message sequence of delayed message to be included + bytes32 prevDelayedAcc = 0; + if (_totalDelayedMessagesRead > 1) { + prevDelayedAcc = bridge.delayedInboxAccs(_totalDelayedMessagesRead - 2); + } + if ( + bridge.delayedInboxAccs(_totalDelayedMessagesRead - 1) != + Messages.accumulateInboxMessage(prevDelayedAcc, messageHash) + ) revert IncorrectMessagePreimage(); + + (bytes32 dataHash, TimeBounds memory timeBounds) = formEmptyDataHash( + _totalDelayedMessagesRead + ); + uint256 __totalDelayedMessagesRead = _totalDelayedMessagesRead; + uint256 prevSeqMsgCount = bridge.sequencerReportedSubMessageCount(); + uint256 newSeqMsgCount = prevSeqMsgCount + + _totalDelayedMessagesRead - + totalDelayedMessagesRead; + ( + uint256 seqMessageIndex, + bytes32 beforeAcc, + bytes32 delayedAcc, + bytes32 afterAcc + ) = addSequencerL2BatchImpl( + dataHash, + __totalDelayedMessagesRead, + 0, + prevSeqMsgCount, + newSeqMsgCount + ); + emit SequencerBatchDelivered( + seqMessageIndex, + beforeAcc, + afterAcc, + delayedAcc, + totalDelayedMessagesRead, + timeBounds, + BatchDataLocation.NoData + ); + } + + /// @dev Deprecated in favor of the variant specifying message counts for consistency + function addSequencerL2BatchFromOrigin( + uint256 sequenceNumber, + bytes calldata data, + uint256 afterDelayedMessagesRead, + IGasRefunder gasRefunder + ) external refundsGas(gasRefunder) { + // solhint-disable-next-line avoid-tx-origin + if (msg.sender != tx.origin) revert NotOrigin(); + if (!isBatchPoster[msg.sender]) revert NotBatchPoster(); + + (bytes32 dataHash, TimeBounds memory timeBounds) = formDataHash( + data, + afterDelayedMessagesRead + ); + ( + uint256 seqMessageIndex, + bytes32 beforeAcc, + bytes32 delayedAcc, + bytes32 afterAcc + ) = addSequencerL2BatchImpl(dataHash, afterDelayedMessagesRead, data.length, 0, 0); + if (seqMessageIndex != sequenceNumber) + revert BadSequencerNumber(seqMessageIndex, sequenceNumber); + emit SequencerBatchDelivered( + sequenceNumber, + beforeAcc, + afterAcc, + delayedAcc, + totalDelayedMessagesRead, + timeBounds, + BatchDataLocation.TxInput + ); + } + + function addSequencerL2BatchFromOrigin( + uint256 sequenceNumber, + bytes calldata data, + uint256 afterDelayedMessagesRead, + IGasRefunder gasRefunder, + uint256 prevMessageCount, + uint256 newMessageCount + ) external refundsGas(gasRefunder) { + // solhint-disable-next-line avoid-tx-origin + if (msg.sender != tx.origin) revert NotOrigin(); + if (!isBatchPoster[msg.sender]) revert NotBatchPoster(); + (bytes32 dataHash, TimeBounds memory timeBounds) = formDataHash( + data, + afterDelayedMessagesRead + ); + // Reformat the stack to prevent "Stack too deep" + uint256 sequenceNumber_ = sequenceNumber; + TimeBounds memory timeBounds_ = timeBounds; + bytes32 dataHash_ = dataHash; + uint256 dataLength = data.length; + uint256 afterDelayedMessagesRead_ = afterDelayedMessagesRead; + uint256 prevMessageCount_ = prevMessageCount; + uint256 newMessageCount_ = newMessageCount; + ( + uint256 seqMessageIndex, + bytes32 beforeAcc, + bytes32 delayedAcc, + bytes32 afterAcc + ) = addSequencerL2BatchImpl( + dataHash_, + afterDelayedMessagesRead_, + dataLength, + prevMessageCount_, + newMessageCount_ + ); + if (seqMessageIndex != sequenceNumber_ && sequenceNumber_ != ~uint256(0)) + revert BadSequencerNumber(seqMessageIndex, sequenceNumber_); + emit SequencerBatchDelivered( + seqMessageIndex, + beforeAcc, + afterAcc, + delayedAcc, + totalDelayedMessagesRead, + timeBounds_, + BatchDataLocation.TxInput + ); + } + + function addSequencerL2Batch( + uint256 sequenceNumber, + bytes calldata data, + uint256 afterDelayedMessagesRead, + IGasRefunder gasRefunder, + uint256 prevMessageCount, + uint256 newMessageCount + ) external override refundsGas(gasRefunder) { + if (!isBatchPoster[msg.sender] && msg.sender != address(rollup)) revert NotBatchPoster(); + (bytes32 dataHash, TimeBounds memory timeBounds) = formDataHash( + data, + afterDelayedMessagesRead + ); + uint256 seqMessageIndex; + { + // Reformat the stack to prevent "Stack too deep" + uint256 sequenceNumber_ = sequenceNumber; + TimeBounds memory timeBounds_ = timeBounds; + bytes32 dataHash_ = dataHash; + uint256 afterDelayedMessagesRead_ = afterDelayedMessagesRead; + uint256 prevMessageCount_ = prevMessageCount; + uint256 newMessageCount_ = newMessageCount; + // we set the calldata length posted to 0 here since the caller isn't the origin + // of the tx, so they might have not paid tx input cost for the calldata + bytes32 beforeAcc; + bytes32 delayedAcc; + bytes32 afterAcc; + (seqMessageIndex, beforeAcc, delayedAcc, afterAcc) = addSequencerL2BatchImpl( + dataHash_, + afterDelayedMessagesRead_, + 0, + prevMessageCount_, + newMessageCount_ + ); + if (seqMessageIndex != sequenceNumber_ && sequenceNumber_ != ~uint256(0)) + revert BadSequencerNumber(seqMessageIndex, sequenceNumber_); + emit SequencerBatchDelivered( + seqMessageIndex, + beforeAcc, + afterAcc, + delayedAcc, + totalDelayedMessagesRead, + timeBounds_, + BatchDataLocation.SeparateBatchEvent + ); + } + emit SequencerBatchData(seqMessageIndex, data); + } + + modifier validateBatchData(bytes calldata data) { + uint256 fullDataLen = HEADER_LENGTH + data.length; + if (fullDataLen > MAX_DATA_SIZE) revert DataTooLarge(fullDataLen, MAX_DATA_SIZE); + if (data.length > 0 && (data[0] & DATA_AUTHENTICATED_FLAG) == DATA_AUTHENTICATED_FLAG) { + revert DataNotAuthenticated(); + } + // the first byte is used to identify the type of batch data + // das batches expect to have the type byte set, followed by the keyset (so they should have at least 33 bytes) + if (data.length >= 33 && data[0] & 0x80 != 0) { + // we skip the first byte, then read the next 32 bytes for the keyset + bytes32 dasKeysetHash = bytes32(data[1:33]); + if (!dasKeySetInfo[dasKeysetHash].isValidKeyset) revert NoSuchKeyset(dasKeysetHash); + } + _; + } + + function packHeader(uint256 afterDelayedMessagesRead) + internal + view + returns (bytes memory, TimeBounds memory) + { + TimeBounds memory timeBounds = getTimeBounds(); + bytes memory header = abi.encodePacked( + timeBounds.minTimestamp, + timeBounds.maxTimestamp, + timeBounds.minBlockNumber, + timeBounds.maxBlockNumber, + uint64(afterDelayedMessagesRead) + ); + // This must always be true from the packed encoding + assert(header.length == HEADER_LENGTH); + return (header, timeBounds); + } + + function formDataHash(bytes calldata data, uint256 afterDelayedMessagesRead) + internal + view + validateBatchData(data) + returns (bytes32, TimeBounds memory) + { + (bytes memory header, TimeBounds memory timeBounds) = packHeader(afterDelayedMessagesRead); + bytes32 dataHash = keccak256(bytes.concat(header, data)); + return (dataHash, timeBounds); + } + + function formEmptyDataHash(uint256 afterDelayedMessagesRead) + internal + view + returns (bytes32, TimeBounds memory) + { + (bytes memory header, TimeBounds memory timeBounds) = packHeader(afterDelayedMessagesRead); + return (keccak256(header), timeBounds); + } + + function addSequencerL2BatchImpl( + bytes32 dataHash, + uint256 afterDelayedMessagesRead, + uint256 calldataLengthPosted, + uint256 prevMessageCount, + uint256 newMessageCount + ) + internal + returns ( + uint256 seqMessageIndex, + bytes32 beforeAcc, + bytes32 delayedAcc, + bytes32 acc + ) + { + if (afterDelayedMessagesRead < totalDelayedMessagesRead) revert DelayedBackwards(); + if (afterDelayedMessagesRead > bridge.delayedMessageCount()) revert DelayedTooFar(); + + (seqMessageIndex, beforeAcc, delayedAcc, acc) = bridge.enqueueSequencerMessage( + dataHash, + afterDelayedMessagesRead, + prevMessageCount, + newMessageCount + ); + + totalDelayedMessagesRead = afterDelayedMessagesRead; + + if (calldataLengthPosted > 0) { + // this msg isn't included in the current sequencer batch, but instead added to + // the delayed messages queue that is yet to be included + address batchPoster = msg.sender; + bytes memory spendingReportMsg; + if (hostChainIsArbitrum) { + // Include extra gas for the host chain's L1 gas charging + uint256 l1Fees = ArbGasInfo(address(0x6c)).getCurrentTxL1GasFees(); + uint256 extraGas = l1Fees / block.basefee; + require(extraGas <= type(uint64).max, "L1_GAS_NOT_UINT64"); + spendingReportMsg = abi.encodePacked( + block.timestamp, + batchPoster, + dataHash, + seqMessageIndex, + block.basefee, + uint64(extraGas) + ); + } else { + spendingReportMsg = abi.encodePacked( + block.timestamp, + batchPoster, + dataHash, + seqMessageIndex, + block.basefee + ); + } + uint256 msgNum = bridge.submitBatchSpendingReport( + batchPoster, + keccak256(spendingReportMsg) + ); + // this is the same event used by Inbox.sol after including a message to the delayed message accumulator + emit InboxMessageDelivered(msgNum, spendingReportMsg); + } + } + + function inboxAccs(uint256 index) external view returns (bytes32) { + return bridge.sequencerInboxAccs(index); + } + + function batchCount() external view returns (uint256) { + return bridge.sequencerMessageCount(); + } + + /// @inheritdoc ISequencerInboxOpt + function setMaxTimeVariation(ISequencerInboxOpt.MaxTimeVariation memory maxTimeVariation_) + external + onlyRollupOwner + { + maxTimeVariation = maxTimeVariation_; + emit OwnerFunctionCalled(0); + } + + /// @inheritdoc ISequencerInboxOpt + function setIsBatchPoster(address addr, bool isBatchPoster_) external onlyRollupOwner { + isBatchPoster[addr] = isBatchPoster_; + emit OwnerFunctionCalled(1); + } + + /// @inheritdoc ISequencerInboxOpt + function setValidKeyset(bytes calldata keysetBytes) external onlyRollupOwner { + uint256 ksWord = uint256(keccak256(bytes.concat(hex"fe", keccak256(keysetBytes)))); + bytes32 ksHash = bytes32(ksWord ^ (1 << 255)); + require(keysetBytes.length < 64 * 1024, "keyset is too large"); + + if (dasKeySetInfo[ksHash].isValidKeyset) revert AlreadyValidDASKeyset(ksHash); + uint256 creationBlock = block.number; + if (hostChainIsArbitrum) { + creationBlock = ArbSys(address(100)).arbBlockNumber(); + } + dasKeySetInfo[ksHash] = DasKeySetInfo({ + isValidKeyset: true, + creationBlock: uint64(creationBlock) + }); + emit SetValidKeyset(ksHash, keysetBytes); + emit OwnerFunctionCalled(2); + } + + /// @inheritdoc ISequencerInboxOpt + function invalidateKeysetHash(bytes32 ksHash) external onlyRollupOwner { + if (!dasKeySetInfo[ksHash].isValidKeyset) revert NoSuchKeyset(ksHash); + // we don't delete the block creation value since its used to fetch the SetValidKeyset + // event efficiently. The event provides the hash preimage of the key. + // this is still needed when syncing the chain after a keyset is invalidated. + dasKeySetInfo[ksHash].isValidKeyset = false; + emit InvalidateKeyset(ksHash); + emit OwnerFunctionCalled(3); + } + + /// @inheritdoc ISequencerInboxOpt + function setIsSequencer(address addr, bool isSequencer_) external onlyRollupOwner { + isSequencer[addr] = isSequencer_; + emit OwnerFunctionCalled(4); + } + + function isValidKeysetHash(bytes32 ksHash) external view returns (bool) { + return dasKeySetInfo[ksHash].isValidKeyset; + } + + /// @inheritdoc ISequencerInboxOpt + function getKeysetCreationBlock(bytes32 ksHash) external view returns (uint256) { + DasKeySetInfo memory ksInfo = dasKeySetInfo[ksHash]; + if (ksInfo.creationBlock == 0) revert NoSuchKeyset(ksHash); + return uint256(ksInfo.creationBlock); + } +} diff --git a/src/test-helpers/RollupMock.sol b/src/test-helpers/RollupMock.sol index 085b9c00..9abcc6db 100644 --- a/src/test-helpers/RollupMock.sol +++ b/src/test-helpers/RollupMock.sol @@ -8,6 +8,12 @@ contract RollupMock { event WithdrawTriggered(); event ZombieTriggered(); + address public owner; + + constructor(address _owner) { + owner = _owner; + } + function withdrawStakerFunds() external returns (uint256) { emit WithdrawTriggered(); return 0; diff --git a/test/contract/sequencerInboxForceInclude.spec.ts b/test/contract/sequencerInboxForceInclude.spec.ts index 8d4d2ac5..5572ac70 100644 --- a/test/contract/sequencerInboxForceInclude.spec.ts +++ b/test/contract/sequencerInboxForceInclude.spec.ts @@ -26,6 +26,7 @@ import { Inbox, Inbox__factory, MessageTester, + RollupMock__factory, SequencerInbox, SequencerInbox__factory, TransparentUpgradeableProxy__factory, @@ -214,17 +215,22 @@ describe('SequencerInboxForceInclude', async () => { } } - const setupSequencerInbox = async (maxDelayBlocks = 10, maxDelayTime = 0) => { + const setupSequencerInbox = async ( + maxDelayBlocks = 10, + maxDelayTime = 0, + opt = false + ) => { const accounts = await initializeAccounts() const admin = accounts[0] const adminAddr = await admin.getAddress() const user = accounts[1] - const dummyRollup = accounts[2] + const rollupOwner = accounts[2] + const batchPoster = accounts[3] - const sequencerInboxFac = (await ethers.getContractFactory( - 'SequencerInbox' - )) as SequencerInbox__factory - const seqInboxTemplate = await sequencerInboxFac.deploy() + const rollupMockFac = (await ethers.getContractFactory( + 'RollupMock' + )) as RollupMock__factory + const rollup = await rollupMockFac.deploy(await rollupOwner.getAddress()) const inboxFac = (await ethers.getContractFactory( 'Inbox' )) as Inbox__factory @@ -242,39 +248,63 @@ describe('SequencerInboxForceInclude', async () => { adminAddr, '0x' ) - const sequencerInboxProxy = await transparentUpgradeableProxyFac.deploy( - seqInboxTemplate.address, - adminAddr, - '0x' - ) + const inboxProxy = await transparentUpgradeableProxyFac.deploy( inboxTemplate.address, adminAddr, '0x' ) - const bridge = await bridgeFac.attach(bridgeProxy.address).connect(user) const bridgeAdmin = await bridgeFac .attach(bridgeProxy.address) - .connect(dummyRollup) - const sequencerInbox = await sequencerInboxFac - .attach(sequencerInboxProxy.address) - .connect(user) - const inbox = await inboxFac.attach(inboxProxy.address).connect(user) + .connect(rollupOwner) + await bridge.initialize(rollup.address) + + let sequencerInbox + if (opt) { + const sequencerInboxFac = (await ethers.getContractFactory( + 'SequencerInboxOpt' + )) as SequencerInboxOpt__factory + sequencerInbox = await sequencerInboxFac.deploy(bridgeProxy.address, { + delayBlocks: maxDelayBlocks, + delaySeconds: maxDelayTime, + futureBlocks: 10, + futureSeconds: 3000, + }) + } else { + const sequencerInboxFac = (await ethers.getContractFactory( + 'SequencerInbox' + )) as SequencerInbox__factory + const seqInboxTemplate = await sequencerInboxFac.deploy() + const sequencerInboxProxy = await transparentUpgradeableProxyFac.deploy( + seqInboxTemplate.address, + adminAddr, + '0x' + ) + sequencerInbox = await sequencerInboxFac + .attach(sequencerInboxProxy.address) + .connect(user) + await sequencerInbox.initialize(bridgeProxy.address, { + delayBlocks: maxDelayBlocks, + delaySeconds: maxDelayTime, + futureBlocks: 10, + futureSeconds: 3000, + }) + } - await bridge.initialize(await dummyRollup.getAddress()) + const inbox = await inboxFac.attach(inboxProxy.address).connect(user) - await sequencerInbox.initialize(bridgeProxy.address, { - delayBlocks: maxDelayBlocks, - delaySeconds: maxDelayTime, - futureBlocks: 10, - futureSeconds: 3000, - }) await inbox.initialize(bridgeProxy.address, sequencerInbox.address) await bridgeAdmin.setDelayedInbox(inbox.address, true) await bridgeAdmin.setSequencerInbox(sequencerInbox.address) + await ( + await sequencerInbox + .connect(rollupOwner) + .setIsBatchPoster(await batchPoster.getAddress(), true) + ).wait() + const messageTester = (await ( await ethers.getContractFactory('MessageTester') ).deploy()) as MessageTester @@ -283,14 +313,92 @@ describe('SequencerInboxForceInclude', async () => { user, bridge: bridge, inbox: inbox, - sequencerInbox: sequencerInbox, + sequencerInbox: sequencerInbox as SequencerInbox, messageTester, inboxProxy, inboxTemplate, bridgeProxy, + rollup, + rollupOwner, + batchPoster, } } + it.only('can add batch', async () => { + const { user, inbox, bridge, messageTester, sequencerInbox, batchPoster } = + await setupSequencerInbox() + + const setupOpt = await setupSequencerInbox(10, 0, true) + + await sendDelayedTx( + user, + inbox, + bridge, + messageTester, + 1000000, + 21000000000, + 0, + await user.getAddress(), + BigNumber.from(10), + '0x1010' + ) + await sendDelayedTx( + setupOpt.user, + setupOpt.inbox, + setupOpt.bridge, + setupOpt.messageTester, + 1000000, + 21000000000, + 0, + await setupOpt.user.getAddress(), + BigNumber.from(10), + '0x1011' + ) + + // const maxTimeVariation = await sequencerInbox.maxTimeVariation() + // await mineBlocks(maxTimeVariation.delayBlocks.toNumber()) + + const messagesRead = await bridge.delayedMessageCount() + const seqReportedMessageSubCount = + await bridge.sequencerReportedSubMessageCount() + const res1 = await ( + await sequencerInbox + .connect(batchPoster) + [ + 'addSequencerL2BatchFromOrigin(uint256,bytes,uint256,address,uint256,uint256)' + ]( + 0, + data, + messagesRead, + ethers.constants.AddressZero, + seqReportedMessageSubCount, + seqReportedMessageSubCount.add(10), + { gasLimit: 10000000 } + ) + ).wait() + + const messagesReadOpt = await setupOpt.bridge.delayedMessageCount() + const seqReportedMessageSubCountOpt = + await setupOpt.bridge.sequencerReportedSubMessageCount() + const res2 = await ( + await setupOpt.sequencerInbox + .connect(setupOpt.batchPoster) + [ + 'addSequencerL2BatchFromOrigin(uint256,bytes,uint256,address,uint256,uint256)' + ]( + 0, + data, + messagesReadOpt, + ethers.constants.AddressZero, + seqReportedMessageSubCountOpt, + seqReportedMessageSubCountOpt.add(10), + { gasLimit: 10000000 } + ) + ).wait() + + console.log('saved', res1.gasUsed.toNumber() - res2.gasUsed.toNumber() - 44455 - 8175) + }) + it('can force-include', async () => { const { user, inbox, bridge, messageTester, sequencerInbox } = await setupSequencerInbox() From cb724106e7dc2b422f2f3ac73357aa0c567b0c05 Mon Sep 17 00:00:00 2001 From: Chris Buckland Date: Wed, 4 Oct 2023 11:58:17 +0200 Subject: [PATCH 099/292] Made state vars immutable --- src/bridge/ISequencerInboxOpt.sol | 9 -- src/bridge/SequencerInboxOpt.sol | 90 ++++++++++++------- test/contract/batchData.json | 4 + .../sequencerInboxForceInclude.spec.ts | 20 +++-- 4 files changed, 75 insertions(+), 48 deletions(-) create mode 100644 test/contract/batchData.json diff --git a/src/bridge/ISequencerInboxOpt.sol b/src/bridge/ISequencerInboxOpt.sol index 7135eb0f..e2a8b2c7 100644 --- a/src/bridge/ISequencerInboxOpt.sol +++ b/src/bridge/ISequencerInboxOpt.sol @@ -88,9 +88,6 @@ interface ISequencerInboxOpt is IDelayedMessageProvider { function dasKeySetInfo(bytes32) external view returns (bool, uint64); - /// @notice Remove force inclusion delay after a L1 chainId fork - function removeDelayAfterFork() 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 @@ -139,12 +136,6 @@ interface ISequencerInboxOpt is IDelayedMessageProvider { // ---------- onlyRollupOrOwner functions ---------- - /** - * @notice Set max delay for sequencer inbox - * @param maxTimeVariation_ the maximum time variation parameters - */ - function setMaxTimeVariation(MaxTimeVariation memory maxTimeVariation_) external; - /** * @notice Updates whether an address is authorized to be a batch poster at the sequencer inbox * @param addr the address diff --git a/src/bridge/SequencerInboxOpt.sol b/src/bridge/SequencerInboxOpt.sol index 681cbc01..9668b7f1 100644 --- a/src/bridge/SequencerInboxOpt.sol +++ b/src/bridge/SequencerInboxOpt.sol @@ -46,7 +46,7 @@ import {MAX_DATA_SIZE} from "../libraries/Constants.sol"; contract SequencerInboxOpt is GasRefundEnabled, ISequencerInboxOpt { uint256 public totalDelayedMessagesRead; - IBridge public bridge; + IBridge public immutable bridge; /// @inheritdoc ISequencerInboxOpt uint256 public constant HEADER_LENGTH = 40; @@ -54,9 +54,13 @@ contract SequencerInboxOpt is GasRefundEnabled, ISequencerInboxOpt { /// @inheritdoc ISequencerInboxOpt bytes1 public constant DATA_AUTHENTICATED_FLAG = 0x40; - IOwnable public rollup; + IOwnable public immutable rollup; mapping(address => bool) public isBatchPoster; - ISequencerInboxOpt.MaxTimeVariation public maxTimeVariation; + // CHRIS: TODO: docs + uint256 internal immutable delayBlocks; + uint256 internal immutable futureBlocks; + uint256 internal immutable delaySeconds; + uint256 internal immutable futureSeconds; mapping(bytes32 => DasKeySetInfo) public dasKeySetInfo; @@ -78,37 +82,62 @@ contract SequencerInboxOpt is GasRefundEnabled, ISequencerInboxOpt { constructor( IBridge bridge_, - ISequencerInboxOpt.MaxTimeVariation memory maxTimeVariation_ + uint256 delayBlocks_, + uint256 futureBlocks_, + uint256 delaySeconds_, + uint256 futureSeconds_ ) { - if (bridge != IBridge(address(0))) revert AlreadyInit(); if (bridge_ == IBridge(address(0))) revert HadZeroInit(); bridge = bridge_; rollup = bridge_.rollup(); - maxTimeVariation = maxTimeVariation_; + delayBlocks = delayBlocks_; + futureBlocks = futureBlocks_; + delaySeconds = delaySeconds_; + futureSeconds = futureSeconds_; } function getTimeBounds() internal view virtual returns (TimeBounds memory) { TimeBounds memory bounds; - if (block.timestamp > maxTimeVariation.delaySeconds) { - bounds.minTimestamp = uint64(block.timestamp - maxTimeVariation.delaySeconds); + ( + uint256 delayBlocks_, + uint256 futureBlocks_, + uint256 delaySeconds_, + uint256 futureSeconds_ + ) = maxTimeVariation(); + + if (block.timestamp > delaySeconds_) { + bounds.minTimestamp = uint64(block.timestamp - delaySeconds_); } - bounds.maxTimestamp = uint64(block.timestamp + maxTimeVariation.futureSeconds); - if (block.number > maxTimeVariation.delayBlocks) { - bounds.minBlockNumber = uint64(block.number - maxTimeVariation.delayBlocks); + bounds.maxTimestamp = uint64(block.timestamp + futureSeconds_); + if (block.number > delayBlocks_) { + bounds.minBlockNumber = uint64(block.number - delayBlocks_); } - bounds.maxBlockNumber = uint64(block.number + maxTimeVariation.futureBlocks); + bounds.maxBlockNumber = uint64(block.number + futureBlocks_); return bounds; } - /// @inheritdoc ISequencerInboxOpt - function removeDelayAfterFork() external { - if (!_chainIdChanged()) revert NotForked(); - maxTimeVariation = ISequencerInboxOpt.MaxTimeVariation({ - delayBlocks: 1, - futureBlocks: 1, - delaySeconds: 1, - futureSeconds: 1 - }); + function maxTimeVariation() public view returns( + uint256, + uint256, + uint256, + uint256 + ) { + // CHRIS: TODO: test for this? + if (_chainIdChanged()) { + return ( + 1, + 1, + 1, + 1 + ); + } else { + return ( + delayBlocks, + futureBlocks, + delaySeconds, + futureSeconds + ); + } } /// @inheritdoc ISequencerInboxOpt @@ -130,10 +159,13 @@ contract SequencerInboxOpt is GasRefundEnabled, ISequencerInboxOpt { baseFeeL1, messageDataHash ); + ( + uint256 delayBlocks_,,uint256 delaySeconds_, + ) = maxTimeVariation(); // Can only force-include after the Sequencer-only window has expired. - if (l1BlockAndTime[0] + maxTimeVariation.delayBlocks >= block.number) + if (l1BlockAndTime[0] + delayBlocks_ >= block.number) revert ForceIncludeBlockTooSoon(); - if (l1BlockAndTime[1] + maxTimeVariation.delaySeconds >= block.timestamp) + if (l1BlockAndTime[1] + delaySeconds_ >= block.timestamp) revert ForceIncludeTimeTooSoon(); // Verify that message hash represents the last message sequence of delayed message to be included @@ -433,18 +465,12 @@ contract SequencerInboxOpt is GasRefundEnabled, ISequencerInboxOpt { return bridge.sequencerMessageCount(); } - /// @inheritdoc ISequencerInboxOpt - function setMaxTimeVariation(ISequencerInboxOpt.MaxTimeVariation memory maxTimeVariation_) - external - onlyRollupOwner - { - maxTimeVariation = maxTimeVariation_; - emit OwnerFunctionCalled(0); - } - /// @inheritdoc ISequencerInboxOpt function setIsBatchPoster(address addr, bool isBatchPoster_) external onlyRollupOwner { isBatchPoster[addr] = isBatchPoster_; + // we used to have OwnerFunctionCalled(0) for setting the maxTimeVariation + // so we dont use index = 0 here, even though this is the first owner function + // to stay compatible with legacy events emit OwnerFunctionCalled(1); } diff --git a/test/contract/batchData.json b/test/contract/batchData.json new file mode 100644 index 00000000..b9dbd9a8 --- /dev/null +++ b/test/contract/batchData.json @@ -0,0 +1,4 @@ +{ + "data": "0x005bbf6d343290db01f0e1f3dd39a2a8d7a49681ca5f1cd844a616ec81325a9e848861aad0504a3080ebbd71af203c4428c2a0588440c954a50850c4fdbedd22b074ddc12f4768ec93dc9fe7e7f6e7dc7b5f2d605488a3ac46f95823ca9c8889dfbf4918a495bc0dda02a3ffffc30ab001734635760f0b9036d6a677a2c14f41123440d7fc2c2d9a0bbca4252dad252e008b1ea075de87889cec99c81793315d93fdbceed9bcda444f8e9e8c8d891c86e9e989f9dce49df6bfd2f7b13ba41b9020c134d9f0608758a0c336f6eadfd4eab75f830d35e5869cd51aacb3639c763f7ef014283e72078fa0e61acb63dce3720de766196a4a6bc810fa75735a6c10900812b25843829ae0516be8c6126730d58504093e3c68c026260604c6505c9ea19613318070461c6b01489ed29c713ca07b0c080231c3bdf3d41adb83f7f0e47a308e41f4a330073c0ecf774437cef523f801701d78de9267a5b9fbbeafbbcfffb9fb9afb03b4e778e7ff567fa3bff3feeb0e24acad643a85225e163bb7cff7fca7f7fcce9db45d6896cce35652e22278d0f7fed2e79fdcaabff7d1ccf6e6da1f536d6666d4c691d61adbb6cb1615333a1254a25001a80454241bcedfbd07f990a864cf13f2512c0a49379754e30760a416b3cdabb73584e78a58ef071038edb040e5c54cd7940b8d5959d13aeec18ac4f86c251b6abeab80c5f695ea0e6472b46d7414e02c96032c0cc0c202b4929cef31a865abb7a1afd093f6653a4be96e515defcdb9c80481737f000c70a3383aa01224720d370014956dc68ac04f18f377bd2d8ce8c6585ca611e6dfafc27ba624564d939ce1a6b26727701f0d00560222e3d8ce2250904530a263e2a5d7ccd7b64150dabbfe8e107a4555197d64e73308826fa4e3a02fa3c36108e82364a212801c3505d18ca3eac076cf219c4b2cbcb6c81617740eb08fa5f8d18c4325840c21201901528e019a3ddf495ac27ab52fba5bc54ef5c6dd34b14ef15bd191932a22aae2fbb3d7b700aea45fcc968a74e5face61864a1110dbea4329743c8183ef033d0cd4fe8912fd207a1593a0e0b67161658de02894eb87a057bfe8e4409d4f339e2a2a34ef8553ddfc3040b97b9704f71f0414f3d1c8ef936cc70740725f08f0e56ebbdc67dad7ad7411a05fadd3cff6db28959b6b549c8fcaa2b693d4fa2f06c03ca789c0b597ff2f1b98788362af20ef0992d0e8e0c1e18051799d79b72aa7df851c9d1157825042c1b5042bb2ac3112b32e4a3c77029425373f76df7e86721dc871cfd21e45a1d6925fedd1ce8fbce0683da40b54368a5b960508f2d0f7c33652603787bd2f665ca56c0c5b76cf0d843800163290f81a4806c280d14500455311376b791290f087229d66f8b2a54c803a49872d9c8a4401cd2900fffb145584001f6c2c1d872a40bdd5def2c5964e4cc579048be642044f1b855506b0d987d58c67aca376d1f70f4fbafa8720b206421591e460a767583fb0d2ad8400b0d42c8c9fa3853b292a619d53f8b56e1de22360530b6773ebab916a04119a1ab41743f9010aae55664696352240a6c611ba362ca05c3bf55b007158a59dc1c56223df75e6674e562c78c36fca666f4354b410d285c594c5ef2c2fcdbe27cd58cdead8146866523677200a5352e84fb1f36821c4f7c72053904800c4934e0778827d62085b6c088042870243b14481a32051fa10b6d8500085ee7b71e0002d47489196721da54ae211a243ee4be97e45aa03878596b23d21603bf684f6b1db6f4b00d5d14b62b4a7eda75483b68040574fa9b18ed34f8b1763c2d847616afef7428a434e0930302e664d3f20665f3f76fb4dd72cf4f7278672a9b69b71bafa4fb4e1b2afbefa6ba700ba714bab312a384d2c52704ea61c155f07ee47e3a9180bd3c8447f033b25222bc7d634197941e5608157bc826213723ea4b16d75a79407b7b69f84af9bbe9d7ac1d51f2113e9f4400cc4435fccf991815974d71735af21fbc9e86631d5dc404bc45a18417c58a1fd33218027ec65270e095454c3f2a231fa17a0329681cb452fe2fbd3e42993f8e25e99bdac17be9f958626ea35fb1e5e44c7cff96695e818d67b8a851996b8dda2e2ead6f28a062e57e0d7043fd42ccce94424a4a1d1574a945c34769129d3a89ccfea42e71ccf90a7dbba1a8cb0dc0743d6222dd6bc4ffcb0ca2b782942e39643bb48dbc4368088ca503f16bd98caf373b1098bcda4550a4258cac09506eb80a7853558d853888cd0abf3eb33955d24f9eacabb044e912724942d9fab844fd102acfa77c36809b27fe00f3b70dc074f4a823db5d14f15fd71d0101826e991b1e4fdda76b32627b17f3bbc9d173aa04612626798fcb300b599c6b84d9f5ecdce85e069330651a7b9fad3040735c7331a261818084101279b92044b89533d4bac297fb7fb144b4664beb91af37b6b236345da3fe29d3364245cc8f21bcd9be5d7bf5d927313101978a694744bbb2c936ab4de755424f1b1dde81cf5aa77644f2f056e02e4b32576e73d8132892414f27a1bc283c55b05fdfca7a7376fa029c38566596fe52d056a0fa327ff8cc4d6963567db879602ee3bc2a0f49edffc7f343606856e76934e6b2d17af439b0cf39e077a9570466546a71414a4b759876b4ffc5a277899021e49bcd92a8e1cc1835d2095b880aee1b38209dd9073352e7470b0d9909064998d3593274b178cc41b1535fc35817b91306237e5f4cec4b088ead88d6a0e07ca77b51747d68a9faadb1fa754cdcb74cdcc3d89365f25ebc5a29873982ad2d6f09b8b448da5f86162f352c3dc84f42689b0a54624a98f04b92cac1de00236b585bcd9418c83c29db706275ed5068ceca21df5a49cdf52c7a5fe7feddbb9583b153d6cccee0b76c30517ee68891dc00742808f5dc85f1d1fb6f70bf2f617a64cdf4b081c8801cd66854903a38d8ef01b257a00275415b9b859322abf9c7e0632005411a425fc387435a2ee664a60fb23595f0d397743c1b6ed61658d684bca61642b11b7140b1590f1046b3f326d204b34951ff9f7d0a778a0bd68a22ba45dbe1aaab093247d98080fdf72e2dc8b24aa50e74ea35ed0f652cfb1afd1591445074280b6182a7e715ab3c8d42a13ead0e03ce8adbff7f3807b2df611c0e6881732030dd83eeff7271455a65df85ef31dd145b25b930c76dcc8740867119cfdd31407ed5643ff07e83dffa45903bff350978764d9a8953bd46c2a13534d3b7866a17c712c65fd61110bd1f98154e2b84e0ad4811a952683cf2e280a2da1f90c90944ae3c4b245b23021d96f2ab5dfa02ac12f210a7ac77351abcc5caf2c191807f3bbf76737cebb7f3a626a22dd4df19414cc3e4111c9878ca6a4aeaa393dfda07066c194873337dc615308d7a7e3c9eeb5c89dfe84311f8b0803c4a4e548b64423231201329f51e4c3289b3d406a0408341ddf60490976c491793dc8182441823092dc3320d5322efcec4f34a5efbd00d0a0d6e5f0cea753199615c5e891f307633e862b2bbd4608e47569bce6ac507220fa53e79120cc2e0f6e5c8157b5b93bf64ecb6474004572e1f8c8f23c1ab6f677de5f4f81d6718e83536800f2ab67e95823d4c6177c49cf0034791781ccf5ee281b15297a009c3702e335390c02aa060500d07b74c71808df53c357f893015f14a90655a9a9eda76e1787e8c01f5ee5b5f31095ecd99ebb79df05062de77bba02f10dec178699b79bea47cee6ad8f611c6d99acb5f988f11d1fcb9607fefff8dc808b64c190570bb51820135a530c0d241a20a3b3c31749ee6196c158133b5c7086fa8976db3ec0058b6e3a72cfafb39ceb09c00848dc4ad91560b9465fe1c7e5743c4412733b91b4fd8552ee8187ca9d3ee5d3e9093200dc2f1c422b422ca5f6c6921e9864dcb2cae716e0662729daff12c747377d02e21a9ea229a2ee9c07416812e5c764c7c9c8cf676940f963f297f20d5e34f4acd1ef3c4f8346089bf6b3025200c46f796b1435679ec4a3ec5a7feefa84115c53bfe61b07b35cded4bf912ec8811d502fe35c069ae88a282d13e6ce0a1a3d6c562fc3cd6dc4ef8973eac4fbe8b2a26b8ac40561d118c84c3bb2dcca1dcdce4334cc697a2f2d53917c33e6e5b9b8205e74dd771cd19b8c10c71e7473c7e5c6d2c5a3654baa00b14a4ab43ea35f422041ce716b1456043acf020ac00d79b8783e6895d49db6a73b593d0efdff611e235e46e32b8c39d7006196399fdd2bd9a8968c38408df0407061bf2a9e3a02c25261ddf374eda9381eec6cd11f90af742edc5dd73802861517c871d0b6c9c009e4ded8a7c157daa05f65550a334beaa25f4909e980d832b3f8770cb42a5908e20ef3ac39d8fd23aa5464f334bd1bd1d6f3757d74df0912109110f2a882e4df35c311ec243215b215891086a909748041b74154d0bed5114f10232122c52fcde70a056fb8a22bfb49fa812dfb4a95136f9e7dcba1abe2b648a4de80aaeaf5faf49dfe532ef7d75d4c1d9e3f855431a66703196987ec6c85a819336aebcc38eeba22ab1b9b7201459d0c0e313316bbd65c88b7dea55e0e7e08b57ffac1faf6858974fdab8968b251170a8dc2a61a43581040a180734597a9fe0327364ddaf5bc154745f631f6ce30a260efc1d5af6c3e1822d3056521ab83c7e1a5ce2f8acdcb48b44a6cbe6ec1062d43a4413c07d010cd2d50b2136355a8d8449d4a93cc026fd70cd32d1ff3a113a80f8280536d5ffcea07054dc26622a0e317d7518d21985bd34a74c6b05ef3fc6d589980c81a0673f33bac313ee0d7ed57e22bd0f33116a0eeafa8c38f093fca110156a7d0aa2db781eb0b21b4d005263b1498614c862dc3049b097dfb68db47246ccf1880924fe2e89fa1dd8e7b68d048904d359032c0088940527bff1e002b0ab3c0d73781841e5595286b365c23e1e95d987bf4e43e38b871a9644811670c78d9eb194150e3a908dc6450b7932b92fe5d49a763d27999961f602dec5adecc16161c80826d7ba25014b4a1877ee7442b38ca885eb1653573de1ddd881fd48cfe8f2c86c1b3b7192566d4b2b20daa92b7956aa25891c9197a34aca22b5cec452bf36f358321dc8baec0a06a360430c097f918fdf23542dc22e02c81df0522c4422a28f0c732c4742b4c2319272a861840b7473b07c5006fc0bace7c4bf23c6dfb9627d5411e1516b7fc0cb635e4f96737873283a99c266c5a3d8b0d1d721ef984d7d01099e061d829e96c967536a718fd9dfc3c5bb5cd356fe3f2e678f1d6ee687cd9c5b7d9d898604a2aa017a32ae2ca9f93f6b83c174583389afd373944d49320990d7bc2b11e0a6b71f46842c4d04d25baf81c2dc44d98082895f7e4e723620adc1e5f110f8f8b0758497f990c47785c113364527616d29b76a1985693d9f65ae6ebf82696ec7f071f8dbbfb0f9d399ed842adaece20baf60e67bd4406fa6ec783bcf187341a1b29ea673ff85ae602f6e72041a3adb2e83439f38f440a5131713374bde7bc2e3b239d690c08b7e4a092e8b013b3d228f2ab65f6ecbbf9f5a18f22876441b73c142ccd6f012296ea5de8abe84fe9d21374d15fbd278788f67227a3353db0053113d29b46f3b7de8dc01cb699f094cbd4f92d461f053e1f4f1d7db149d7f83fff832e3c8cb594e5f347f9314a681eae70925da03dcb2866b994cd5859ecb85258e059674f79160e74cf2df7adec95af7765f6f140fc77b15c49975093fe6e85bcc7cc008cce85bc7e2663b7fb24dcb17b544398ee9bbbecd68c5eeea07cfdf5a11a41c5743bbd75a7beb0f56e275cb0d577578480c4a5c252d2b44f81654dc8f74f1944853e7cb5d5503ab64bd75377700a8eeac9ed888a71ea6a351655eaaf0c817999f39c0143fbc4f5cee8e6f1f96aab50cb87ffa56caf4b7e68d70e92ed8166649e03ff1520c33ff7d8f7729c5cf3148a2cd83167919f0822b659a642e6d17b6323ae5d914f159bf152bdffe2d4030f7bf6a167614893aefb744b146c0d0a6931ded8feff6d5f12b618f7e24e3d62654482f0744af46465a749f2d6568a07085a6e3e9f998ce081852d78cd5595a11e25b629e93a067f9c7eaf1e19cb7868af21e98adeefd74dca54a4e8e32f20e816c0a018abe7bfbab57618f27abf45f295a143866648570fda32ac88baa991f6bf2d7bc04d94dbba5defca8fe00fdaed9c325fd2bca91392e68e5fea1b5ae13fc3d59795a1dbc4f79cc6f72eba25fa90e9a6edbd24c47b6745747d46f710a54dea8a1985f56104ce74a5aaab10a68d7c569a04cef67d0805df3b42f3312ab79a2cff72a53ed1e3009d31d9a709fc1bafd3999d53d4c940f5e7bf10ee6e6bd34fc1367de4f2ffa58b9fa4d7416a8c5aab97ceb76dc4efaa14576e2e4e2f0aac694d4e23b3fb5d4b2ecb14ec38a2d6e8659daa27c1b445d86f24007959efec1c62cb5c8da7234cd879c0fad04244a7bab4034baba964b990d7dcbee1b56660f9a652275eaf1a43cdf26e393698f4a68977f438d85c06c0006e65b6fca669f68116bbddf135f4008831f45672c3d18cdbe05db8e7492c5b7b003b12dcc85e9d44b1e39f34db56280fc0f6fb1571ac8c9135e107cb8f2f64b950176c872d41ce2bf64a6e72c0a47054edd5b6280ec9fae9f4a3966232f481cde6f54a0ded02dcbf60748ac9028e6a9483541053ab5646d1d23214594feffa0ecea12dee58abcbb99b66cc08b0e2807d4b9a7549a622284d85104bba54b91e12d847ba9e80f3cc632c38e3f1c3d65f1e32e84441a3be8dc4e632ab92b0a2b4ed4fdf09bf203ac474f6c76dfa2f41cd311aa149359bca8cc5a10ff91ddfd5993e25ecc3c9b9ba766fba1e3e0dd00ac6314883be898bfa3e386e15a1724f0c0fa7fc56a8c36c6c3bc675691fea72c33d24c8023f20ee60c51667f3636da940a2275fd5d64d34a6684327391ea47f6d83b75ada94efb39a6787251b735b569434c5d77f2e2b634a87b839e6874ffaa401ad4dad8af63e28ae7b7d1c83c1d0d407097cb3184ee57a7936edf7dc2068e257e523d6469f5580d44fdad5b4d6215f00b54d2aa0836cf53bc6c8d8d6453b0d85591c6bd3c25e10bb1c1931f49ea122c069642260cf2f85843368676580d6059fd0426c37304a969582f0e19ecfe9046d857441cac6423cf9648c2c88651a6d27f08e13b733dfba578f1f765b7d3a00c570edc08a0a005a284083a3207194f122415aa92554b1c10cf51a2920c61d6d631fa9e57b8034cb2f1e0d58fee3ce8dc57f36877047e763dbc79efadd40595c527785d00f136cd3c858bd8079dc4b6bb40111f0a2cd361d49b9da4c39e22be0f1f14cb896d8d4c24ab2ccf449e41ac6552cbbcec5e64eed108fc328e695325b993e061e297bea399959b36c707fd50ae0064844fc8060e56e5870a019d0999bd16f4209b902c52788f78f2b2a6dc8a1412ef7b3073bf1386adf4e0cf608d345b4f9cc589f61fb67aff2d67c0af5a4f37ebfbb0f9cfbf5cfabe9b22ca9bbd4c1f1328dde181cdf6d961b564fe2a67c778acff639c91959706ea2234577248653794c80fb4f00f8223db3e9dff94df7f0daa6ca16576b9ec1c8ecfdf9650b2694c61b8add7cf81fe371606c91845a7a1cae329e0d08574382b8e88da254824a296d56c222fe6c97004c7d84f7f5516da7e27685a53c05c7356bce08c2fb4b598d9715d7bc3de55bb77ab7a2e0913a7233f8417ec5f754ce7ed4628ca151331c2a65b63a5ce88a414cfdfd6afdbb30636e16a6136858d600e7d3810be8a9003b0a7fc76d3eaacb302870dcadc90816b7f2f51cb99315ac3653f42fb8230c0ba14affc3ffcc4210157b2969a4755eddb0e41455f81dcc3ddb7a76f4bddfe3bf5fbf6666dd10a0a6ef2328750702d4cc46fea3a6798c31c37eaab2f3189b6e46421f882dc9138b387fa954a1f60ebac0fb41d494a81f087c3e92f38b41e7ff1f222dc2e549065ccc17bb4ddd6d8d6a259c944e15d99f52eb22000e410f267ba77907a6c07e8fd117b31782013d7d3655584f654e06e3fa8269581928ba9184e25c2632ed4314d6df3fa0576dce9cbc1c789679687353d42dbbbe5d56c1bfe5784f9d6a7be8ef90ce41f9e9a073338660cb44edbec9e24e5f9f8d7ae6b0b75d7990ddc5ec4622dfc75d68b6e51af2094dbac2549f7372de4591723bdeaf398fb2652042c6293a690008f4ce1826a6f8909cff4215146d2fc4c42b8d081bfe19a1798ea23807b0cb27d2822a28d8b6331f2f86eaa60f2d15b532cb720a57112465dd2f51ed1776ca10331d7a8ef6dca9f65dc25c352c1bac8e885623833400daff5dd7127e66297d71b12ba7f846d922392f1d2513c762fd61b60c70049cf085694807d19b467eacaa641f3f26ddefd45d17e18307ab8bdb220e94ba6f71c310d72666d07330905b8a8c9d54bb09e59d052b3f26abfba9c5ca2030dc63d551835498edf1af43110e7a347870a9fc60d97c1798bc768a1637e4a17a839b6cc893bde080f9721a35b6378c1855fb09e0a2a42bb43671f1080564fc0108e20146441d1f64d8fc9625df9339345519626a2bfdc66b0c1e9ce895319e1a7e3b9b50f9affa7f0977e034201cf06197e65ec49264cab0d94101c86debbd653f3f59a2f206b5def04ff66d9b45e05c6128b8a6b2eb2db3de2b8634e88045dad49da5b71af52346b3b2dded902199b9068507b5db163fa40b3c788d7d2ae585cca55bce6a8fd0193f6261a6da27df43534f80d6e9f58c1e3a06e900774a1c8f26f9eb080ab250ea3de499248dce7d7f23025bf650a5ba91b5a4432519875ecaa23af9f32aee41561d6036e057348e94fda23114df0129002fe34719988310600bc70ccf20bd57cdf1964508031e87a64f56658981e2b204f04fafdd9746b49467a7cec377810db11a7659a46c63ac5133bdd956200bfa9405ed17dafc90215464f0848aafd10ed2900ea5e46a9bac25bf9c396fd2bd020e9e6e1379f42077289a53a13faf8cf759de8a327abcdda1a9cbc4499b5bc91c7148e32cb118000392536b2f8a02228ab58547d0a4cde4999f82892ba7f6b81cf45520ca6e4aa11c907eae85a705e9f55db7d462d865dbc20c075685a903c7218a45323ffe5bd5764677e9de97567d9feffbad2a8fbc0ba76da380193505794460a047092ef06a134b4521000770d8854897d5a90e2c4e74560997e24578d784175d893eebe06f43ec8bcaea000f33cb3aaf9625d73481aeb0cd8a63489e21328ecfffe9c267b0983922b3543155a0c0105c1fd201657a93aea538a722281d3663e67fb4524c5001ae122076e07865865fb61e8fd481c6f6996f7e803b4c8d43e4d7b167ef514175dc6dfa5c4b96d510c29637413995e48cd476e45f0d2e5499c904e4b2043088416b2971e21af2f0e1fe43280c898e8827a26f9fd47cf9c124cdd962778a42af2a30381b13e198d6c8d89ee7dd12a24f4457c7ac8c42634328a0229eff0a24cc93a719b7412d51815075b3e055ccb72c34d341022ab869dde915ca76a71c3174f174e643331a000392ec7a3d1750484aadd56ea6652688c366eb12f7e7fe4ffff7d554dfa270d8d406cc1f11ef63d8068c1729fe5f4d6dce9e7972a7012ae01ea0b7105f823db3e9df61505035c468ba66fc41cd9a5cda1cd825ba1970dd1c1c7fbda5bf213a5d667ec418428cca2725c03b40b62cd232f11bbe363db9bb33ae2812aa3eebce86cfc649fce734120fb957841ae61078673ba4ef9bf530588500db1fdd9b060ebb924b852c70e25a2ee8fb1be8d803835ed32d71877f875aa9f93aea019b52310696650582eacd3a835ebec1f1e66771de5f79a34e6937ae0e443ef0b1a77d9fdd56d0afc4929c5e7a84d1913077d604dd23b5de0bd4060f2b833e6958b146eb87b247a79f25c15298c969959425dc7a2a3fc20cd5336dbb320d5ec2cf0f3a9031636097bedc10f540f9d913b0a8dae3f583b4a1041540efbb1d37840055f24716a6f50f68c1dbec8bae2e0b7489db1b38d4703ffeaada91f23244b6f48101845214ef906390b873da4fc372de7609f9dbfe494fbfd33346c885adc48fb55a00aadf891f9399abdbbefe65f878241a4ef26b4359f4d2896657800d22eea2de9ac58bd90e05dbcac3ca1ac54316436b45fd8e94b1cdc6e63870465f5a247927bf51b4d0ef57e74fcce9a432699b8204ba7756415b461bbbdff5810171ef86e92c02ce426d1ef478b4fe9888b55a80070f2d03e2505cad497174b49e00964cdc014b1195de597df1d56ab78a736d895f0a23e26aca3bbc0107e5f2874f1758180059d2152559df125a635499830c4aafe6173253faf71ba20fd5c369257fef8b4954d717e412d74d5fd67458dffb80c70018e0b01c754b42eb89e7fff0bb1591b0ad0c62b281feaba32c0937a6faebef03f45200cb1aa6c66cde6d7b2574459996f5253f5259cfff9e36469af35dd7ca9fa7063b2fb3a160dbd674a45d55a51607d7429bf19d056f8554202c96e52c13313c5417eedd30182b08595da78c0cdbe8846f27c63e85fda23f3b9a207d257f397daf78b9fd51b1f5beabe66dc88851bd1487ee0e22f9981f69d95271e7fa36c4aed152808dc2a0b911076e23e3c23272453884fa0f8f1a4abfd379c84e180769db2a5149671b60815cff0f1526ad4fff7aaf16840565e40eb3bfbad7dae4c66d5d1d86424c6f468eb77b8177d58f81b79cc1ba7f10374805f799932c209651937e1ae30cd8cacf01baf65c0e58a9b9e76a73a566fe71108636e7cf50890caf6ee1e1c7fa7e6a9d71e228157276b6a073b7ed902e1053f8ca9c99168a26f825a6a4d0d76170208b37598045401b79c1455c40087e51a72b40df87c942be79f51c394c7162bbf3cf8cc02fd7ff156522d8c86548108a598bcf3f7a3d9c765b835fd4d70fd674ad3c45c026424e1cff20571b522448c32fcd6b8f3a760a4abf6c8f7b2462e72fef3c070981915fc20664e77954e960a0327d0bd2c7e270d9b68e26312d3fc65bc39561673a32b3349a77015a5f82f3e1d9652004a0d2ef747dfacdcda84a01ba73afee241be7ef8bc87082dedf1f9aa64a862255a60051b510fe43c6d1d1d87f57031b6b8e9b26f3c1a539039a9dc5e4407e88f650d32ec87c1363cf0f17d15e8ec0337d4718753f019ead39a1a48b90ebefb0d89332495fd4f5b63b513081f9b429b32c0471fe80d17f013a8ec3a324b0b14aa575ff8b34b880d45d000d8d68bcee2f5cf267b5bf7a834909843dff41556a4fda757b7b519163eebbccfdde3b42484eea9e274f8d5a922c9304ac76fe4529687f4d82e1c085329ec76afff13a91043b5c98e0fa969147a35031986643c1ef7cff7987bebc3ff908753ad53f11a93dc5ad3eb7c287fd6dccb0355416a2bee72877b2aac5b78379b27b79ad1fd1f652cdc679bd2aed9615762d77994180c90218dc145027a3fee7174770fa376f56460811e77a54824e9baf2dd932c300952d53acd3336759c9117dde9f59146379199f9d4e80c596c337d986509a1fb82c4e7b521fe8e554c0748b1a2ac2a60ea4cdd9dfe19e02b10f4e43fbf19b07843ec456f8e50c60fdfcb0f5fb7434f25b67e1cc4047edb460cbc111008091e421ea721e4e5b70df0aa95b26347e1fbd2d0302409e10011a22a150ba44a30750e4400e26a120048f1e75f0779b7cbffaaa97576859df9123481548be6c59972dc2ae23a7f9096140fb61c837d8f14e5bf8552625ff9d3e9bd8b5c879adaae5c99b814726edf9ec1cfd90fca777d90549ad5fad45eb3a398647f8fd16f882f6de2e037c928d134aa859786881c72fea2c60930886b02e78ed7328eac7a5197816eff080efed964084c501fa61f4d1f9de6a2b84b16e8cfb8298dded3114f36f5eb103c56fd1a1820eaa3a5d303cb3fab35e43733e0b02dc373b87c189d56edf1fef3242382ddbd6c0ace88f4d207ecd365961c1490bc487b40f0250b92d9c4374c5a2e02f8526378d76365cd983ce0ad8d9416181b8ac9c5b234062652aa5f6223873cd8d9f880e74aeac6e7f4bb532c1bce11f9962136acd1f7f9c989c2697f3c6477a60552a50a27a0fd2d3fcab4c580f9e00e07c0803cabb14844b7ea4b9c92b67cb2af3155a95eb0366e36a64fab7afb4ee3ba4c5a077a6b060d11abe052cc285c542321aa8df0dcd45bcb08beda64d9f288d467cd9533943b251a0844bd8ba7f815c2a74828080be800960047ad8d8e3a47eaee002c71b6bc9fdc74a001e6e5fea6600e3cd26230d25a59eea17d16fac8d2d40936798ecf8fa77e5e8438bf8401d820721e1e4fedbbfdb7fa6fc9aef23c21d1353f86744a0f2bfb517a93eda3a650663f18e36e20424d994f2a26f044e49cb7bf753a9107f389c704342b33acc4ca06647e80ee2b304f2b4f802359586e5ea7459bdef35209f3a890b19cc88b01b6689838ebe48b5fbe2264691105299fc5b31bb78142015607ed57e5ca19174c0bd3e9bcfa4fc11084e79972f09d98bce40a17510ed820cf2cd1ecad85654e55c9f516d5a7b978ca67ff265c7c5af243f11794b897c7c5a97c278f9ac9260f9287865532932adcf2f26d97fc7a2ad38080fa1eebec66847f2ef806a2b29b320851ab27d126b33f429181b5365a935a398be588097c1c7c525ab3d591262627a48829e46524fad8ba95f14db3d0c0312b05ec6f6e858140ee7095fa7135d90942c7c195de64fa7ca0786dd825af5be0080aba806556f7f97cc2e673cab6f2f60e8b8b48cf1cbf1968f6bddcca1c83e121b522b36403ca781280432f6360829ccc51302a367f246275f3cfc4c2e37aefcfe5e8411f50397ced95316dfc4908a7f8a6021f106f7d8a81ae565af2d3821f08875f020de47b959543955c72c9cbf38037f6d0a6b85348f6ba71743aed8350429c108f4e36dc696f604edda0a09f5598c16e8936f54d86f30197a373dec31388268da128420b2c9c908861df9439e35d0b0ae782eb48d864c21e45aa3119201945241cc9c33cb61817728e40475175a1a86dff0bf9db386e1a2689bf6bf85073125baacce49782ba6b4c817e733cf2b983a7ff30094bb1fa3a7089c1218fe8104ccbecbdf9a6a28e1cd446cd175c62c02b924c207ce6ed950b06d8e21e63f1e2689445cd9d382f2401c28978010c8fa9d75eb32228063513d76f396a62289150f176d1cdc10f29152c37c1c1296b8fff8048318e81f8c7e718e0d429a66909253827e742004e82f34a03a94a2fe7b10f73d9036bb99cffaaf0d2fa565408f0e0f7c804f66a10508efdd8694699ec02098a22a0e3954d3e3195debfabd984b2c79dee2d936afffbccabd18cdb4c6b27898b0d3a6cd71da88a00465a9a3fed07f9710efa3b94e85dc728e1afd8623c07a5a6cb35978b35cf70db3b5ae9eb05bb9040fdc87f56617a83051ff16b608e7ead8e37fbe04b4ea4a04a339db2b3fa0d33bf6c667e38df341fea197e7770fb8ebdc29ee3346ecc254bc7f96373473384722dde4222732ebab03d25e9ab81ffcff33a683cb2b12dc5dac00a828128b902e10f48e3059f65940009d7d46c12b5929a27c0513a6633e37baddfec1be0d269baa9d67d995affc005954d603bb2cb8330d2ccfbf9ab94cab5fd1d78ef1b52bb05f6f617ed77689087b28f1235970ceac9b1d7dddfa4c3c88ad03d242c32429c742ac2b74866c499e900037e1635839f095d1360bcdd37abed4cde9f76211999e875f7cf69c4583a14c9931f621591d6cf2ee99819f8fec41518625ba237c03f1bd73509d763f65fecc8484fd0b77e425bc9a94dfdce4865124d71e5f1d24f67cee9573692470488174956483a048305f105863bf7c7eb912b708c9f6a506c672c4b3ba8f587cdf4b56d31a5854a2039df134f2293cdd7e4f09c1dd5e3e91aafc5d5c7c7fd31f69ffc399bc84a55553df74ac92bd6c3e2cd9fecd78fdf036c0bcbf576fc69c445c111337bb2db9c329cf3fb348edd16a2d7051adc8faeee19bc90e1067bb3772915e9a3ee3071abff4584b7957ad7cdb605e96ecd5c9381c7a69985106e62b768c193f4bb04ec231d0e722d01edae6c2b159cf3338906effe241587545ebda48c28242996b574e36f4604265bdb0686c38d13b0c9fcba672a3ac72ab68d89e91808a87b05eb078bcea3e572f5e2d23f882f23e25f87d8203d45a0235cfdcb77c97e4c9c7f3aab3b72d9febf1179f0766403e01407eab864954f56b8a3bc777b1d5944538bb2ad474c722c4daa8b96895bea37a1f43c9ffa2e449625e3adaa481b976a1683772cd070cfb7b3538ca688be230c10816403493cd57407d8d23b7418d8ea26038cf93f10a37a2326b700f8404f83621510df1953182f579b4a6a41bdf3ecc7a645ac77e385cdbb404f5eb020e45ed59b95be5a2a828996cd5f8713797142ef69d64e5f70e34f5cf548123cd8423f251aa7fad7f60bc84fdce2afce7cf2e29a0b9692156f00464f97c0eeaee3dd4032a86ffd7d5ae7e859bb103a2f0e654b0f817b0b30af49a193a032fbc7dfb6c0df2ba162d5cb28f4827deeee6d0b1d9a93f824e14ee3ceddf0b341df69ffeae831eccb46acf74ffb9af5e9146d78e7fe640d9ad66d4189eb8f1de1c965b72f2c7567e50d95a915c968b067399143b03412ea1dc70bcf5cfc96b46fad05ddaf9025777862c8e951d7876b97e95a8db0d75bb86647b1aa847e2bd274536b627342f1ff8630a0efab1b80187705ff3cfacacef5f05fe2c71d3860b7f389fe50033f42e3bcc3f59916081f892c94bcc8442c806272b9bec7f7798be8f01d8b0dabd6ff9a9f193e6e0030a3572996433f0a2219c8caa83ce2c3137a12c67e782d0bd0eb0add2efab3ca17ee3dbff49114615cda060490356430f4d449aedc9544146ad86a5f182bde22598a4bada389dc82cdd48c68878bb3aefeee10eb578768decbdacfe5d260b284a3508ea5e3c9da7e466942daed76732e5dffa1951baf8cb8aac1753776e9ec5abeaaeb1b58becef3087db1ea5212737cf6506a89415a568a2a9d5bc61abdab0e58db214e80a7d0c2a8fbcb7ca7d572b61063aa012af18b6e640ad7338dd968af9248097d4368b8056d9adb91294ee0f03dccca9b395d7a0d6d8dfca43aa31b20444fc74d3a9b6001c35a1f05eab541c6d015fac67829830dabbb6ac41959234f9dc1f7d68eafa765d909feba3a162f666b80bc9950b65cf456396e4e5b6a4bc3e771a8dd38f0609ce9573f1c08cf711b21ba2ffd7565eef1f98e331ed3f144bbdc78d5c0ac04c9dd34cc2ae96fbc70ec41398134e1e89fe065e2f18ea232837637d383a4303dc6ccfcbd81597bf3d210d7e99b6d3cad6a29a21075c622fe7c3d86ef61bde52dcf3b7190f4db28e2b4a302e966aa5426c2b03359fd0badb219db6b6ec89ff495e6e6b402bbacd60b610ff8f989a7e64ae8c83d4c52f3c175da1330ed65c69530e0a3f23fe09f4540ccfc26c1d3c27d0f7ad3cedbe76a46bd240df4c0229b2a5cfdf92fd1e842febd9deae51463cd837c180751e4caabca2b1e0646accdf1f93eb21620979a79ba5d673bafd738109b54c97308ccc4e09433192e9a5b84d8f0c6408cc13efa1faff20b838b4c36391e118a741d0650e01a34676a0ff0dd313c9e9096fae42773a8318aacd9ca207f2b2d69869d2c2b7be514a9066f5dd19a7d9b30d9dff20ac505ce8fef061e8c5cdf4279aa9749607e1152c85b5cd772e42e83d229b295922a06736d3c277f706323cc110829d9c58a560982bfabef51c1c76967a38847496d5fedff786b238be8814f22aae2f0d6244913a6f6ccf9b04773007e25f662dda74666c110cb4a3900e0bda023cb9b2dfdce78bdb54f51209be26781133ebb2ef4e170bb9e0bc7b00f96c2cd2edeaeec7eb2dfe09d5a0e06105c020a7e516b5cf8669c69eed5f3705f5baaebe16f8f2ad1e996bbc622cdb25bfa1bcd79350b29e9aa79786b7adc8fac0aab7752030710cb0f9de4d9721f00bf2e33cfeca2d0acada4baf295c99481fef1cc0af495cfa25206808f805ce5ebb558c3067b8c49fda698dfd3bfeff05671daf597bf1b7eb2d3977f708d457eae3bc48ea9990f1b7cd050a0d10cdc83303969411fbaca7f3acf99f2a03ee44f87eff09e98ceaf581ed2eb10d410e286f6c896c2aa7b8f9c41152108058276145a0e244732d5cb83e5ace94338d095b2464495a5ab223ee4d110fec8c724e6d2204f9de16e3e7089dfb8ff3229555171aa9db3fc8e4563aabbbc41bef91079b8998601da8d7bc324cfcd93d2e1c3ac33002e66b4c2402a57d2bc35de5475d13706280a9b469e210f4b887c6243769489c0c24a8e5b0b9a203b9f503ef438a4eab4f16cd9aed07bb5d16144604e307e636212f9c566102916d6902d0a9480b6112b1b6f672a4a8d67a367c658d064ad668aa72198ce0d6e0bb3b4a68a92c5c783d2123a60bdf14ede1efd23d17c48236fe21462e6a7aa37a1b06058872ce4ac87df4072f3e461ee02751175c12457571b9abf32ba647f74110159e7cbf474077e3b66f56f1bb2831c17745356f414bf07028fba8c9ea598d7035430319c0536b2366da4a1ad7bf4e3c8186b8c618f9f338237bc537a19b9a6c6387b77a3d467c49196956240b984e641721baa1382817c4cf0d5a708a664adb5553db35f73c18053b84a6acabf8b818d205619248c043dd6d2e04191d1565a569f11402d86eedbc315f4fa7bf6cd586433e61577c1202ef1c6f3cdf48047847143dc12bbe783b34fada726dfbd1d3bd826f4d66a74ca32df7dd121382dfd3a948272cc114583f7b49c81a52347416db37c109edc82dd220fd4169fdc00ce42f0a9696ede246fded63bc1fe8fb5630e614d0fe77a0ad9f2000aeef05110026b67f7fc77e5f0583d0725fa6a2becf4abf0fe1bebf190000bb5e60750eb0711674900274792a288418f4f4c9f77113e89d0748df0e82bac74fdf199a206c4a406501a23501a9d783f40e20e767b0710c1fc319682abe13cbdb99e38731e2f2fca1ce6f19301ffd92a754f4398fb50b69e23bb95baaf7bfc3b008852fc315111ce9c3c35dd7df25114f791f92317a20696db92fc3b1ee01b426e4f8e7e1b8633f05eff0de778913bbb3c4c4afe83e69ce3313cc16f90dd3910346435f32c234e6666f9b8b19789a5195c190334cfd2e71c73857222752375745577411120918ae282bc751f5c35b55701667d0d5291de363a22df8437a60a3376a5ff349089dabcb7145f33b0969697364337ea4166bcc5d19c598a480140c6a514e825edc366b865821dfd6395dbc2e0757233ffcb7ae05844890b1373624a566b1aefad63b0c496fdfba3a5d3fa407f77c21757aba3b769bff106cf96902f7021ea027a59daba60527110267f47e6af255e685143cc083fbc0b9c716227eea7ad9d3054118215cc64311a5b92c02bcf91441747116f2ea884d386d444896638bb40ec7bb5b25f2d443e4eee1686f94ddc7db90ce5dc843bd067384249dfacc8286ec78fbdd9516a9bd58e1f2829607b406951269931a26ff104c59677b9b5c99dee045e9f834ed8b27dbe889e3d8b84eafdf02ffd54784b0a19d440ac3bc3dee22e701e09b8c5fea7407392ba6a3cf6008ac6cf5408f975828242ceb816a2e7215977258a39151639716242d0a235f5a220225954e229c11692f43dd5a7dc236738eadc6c2673d70af77fdfa49b524a47d97def3f50c3c7f7e160800021408980a18b4797793c72f229095f70708fcdd7beb517105959369b3e7cc10b5b4a15890da60970198985f8ef8688c56d9767df44d61720b3ea2ceff252993b09ab8d7d693191d9d8630e0ca48a52ba836d58f6ca78bfee98110a0f41d3c5e6d197f5007a0d6488f9c21e00ca5a11ff758a430ad8f511f6256d981c4cd48f35d5b590a90352d0a355d3de2e3fcd5494aeae2021be4e2c5ea4a4a9fa8406a08608015d53326a5af3b2f2d7c0f34e973909d244cdb89121e6f5762357d25d7b0f43e40c964ba3ebb18a62c11590f27acb52a83d1e50a1535ccd55283d2686e4c974355e09c03116f90c62097676d79bee0b908844f25c5510419e1c524c200eae9dd01827a29ebc37038c05089a030c1481bf9cb9248cb7a1a7755e6400ca016d926594232e681d452e9487d4735ee2f5e08cd357e27802d2062696d97adac19a9760d7239472aaf41338cef8dfd318696351002ec00f6817788ce1d30dd175e14b5c440bbffaf13363786e2219f48a69e6ab6968038f92bccfbfaabfc16c4a8b37e5ac3f1db298cc34a0f4f5e7efa6d09c794fdd90ea62c28ed6ff2ab1af32d82161426273048490daa504eaa8c0e30de9fe716f70af97b329b69c7d3f6ca849556f4b9074ddeb24dcc6c5d0636be5951aa663de3fb45cd0adc05b08512856fd5409fc00e73a3606a07b45a49eeebdd2159324f3977409e25e3a27344a5fe50263ddc439681ae78263bf11c7fd6eecbf1201cb9eb7e87668cbb7e403c6dbf100ce202b767793ac8937f204e2f7f540b4d9689a2938c06eedf3e9ff638e68fdcafcdc7465cab1619429532b5bf6c27a4f10c43388cde8600fa8a656dd57fad2bad8c71b7946acb3e43fe455422d98ac29c6c7f61a14ac0421d60c2978ebee825330cccb108ed370dbe11d9cb185f09d2a5a318a9b1daeb1eee600a6fb4a2a3e2de6777585ebdc0f7d235d82c1330381557cb0807a0571c62d79f1fbba47f9e6014a92ae47d58186600b327f24ef7bcb8ad1b908b9339765c74da5f53a92ef31c9a93dd34991df7e233b66007146cabd026a77fb176686989cf193daf8f083675135d511effdf51130ea90d89610cdfa9ced3b73bdcbd065d1c7942640f883516bb0701a4b9b0995cc8d1d27d000cb0234ec7ebb8fb3bdd6d0825d0faad7d4c6fc01f5f4ed07f1690d4a15383d4480fa0fbda27d04e54a8c4d2e4907411886caee64a5dae99a35c3fedac4acfe091497441cf81e8e374f754b4b468b38c77d8f501a4f25d50a9f19d13a5811b0d2e1d1b1ab02e28eed08911edd3912b04ebea5fed1fdce68c2e8009677b875c6b5485cc8e92259008378295070b38930e89551191033ff632dcd34d776010567a76ec0d44e6fc38ad12e88c5b5e087480d546c3bb249436463718b21d5dc59f2a8efa7e60f61ac40f0fe05b5717426ac7d080efd1f4f909b11f3bd7e47c968e58a48b045cd44b544edccc8c63f3adbb4e2a68a64e6f57ff73e449ac6619f6fab011d8f79d6d7cb6e3febaf27ccb642142d8809e44f214fcdf7a9d5bf4e0bd532a365bc0ffe8d943f03ba6cf4837dbc9dc73f6cd162e6dce00f0a1c2192bb7a834a5fc605cab8813514cd590fb97d6ce21b221c3bda3686d1397fa190372886f50823c7df127befdaa893ed9bbe26293fb7141846302fa05028857d8e597917278d2279ee4f79cf8a6ef303e3c8c36048c048822f62d42b1c194e8f06a408c3b31c7988ae502b62efd37e89014964746c22c4f1f0db13cdf062853315c1f85bc24de5429e1bafcd8c6d8319b79ff11faf1b33e5379d9691c3621e83f0ae7a09490803c6ea1329160fdcf39ef283fc23350c17dcaebf6351df4cd5b7e950138292deeaa8dc242920e889d45d4f1be551d42cf371c8372488d62085a85874799b5f0233281222ac896d31012ada9dba3afa8f4a1e1fd95ceab8d548b1b6efb0753627ca3079745ca81f5e5adaed7ce9239f23fc8dcbd31472ebf88cebfca1ffd0794f11f929a3a7622a7edb7b73dc664c0cfdfa6d9db5e9083f5bec3c3897dc479c8b3eaa43cc80882966f27c4f896a828d52312dbdefafdce8d48f4957c7d17ccc71fb7e78a4a4e11655692524c06453011ee6fc2e57de3cc7af7272d6890c636d5d8c17f64f4791aade7aec7c74327faea132827f574b75c5bf8d090b056134bf577afcd9d0240c1c770b2a7e0a841c766250b35ea0d9b3340985bf57bab083880d3b393c52706358eca4ac3f7f0e3f2f50a19f660b774d4c554bc7e353b7d7b49b3ccf97d17cd7ca4110c47c17b13fff6a715055978cf592db3955360ae22d8fd5cd4b2011054f21ce5c936871086ab1d02da256fe976964cc427a5b31947fb5fa2e8ffaf53b8fa366c5aa8bb0feb79e89b9caff4033124d73d77ea7acb7fdf48d33f0d5a23da46f13e96cf5fd7902a18f7c6dfdae0423e8de002ae0cc6ea6850dbca01fa01f431a446d6b7d256d416055b8777779adaffb4e250c80cbe76b8f6f4fcf010ed95083c2904d4c75b9d25cef27fb1f19af8f9b26e11bb98582b32fe6b3e3c54641a7717eb4090b33f60f45f801a41cf7a9d2cbbd6bdcff73e22b0af9b2c49caeb7173bc12fe1a2f1bd3dfa72a3341719d72f3f9702d92195cea97d95e3ed58a7cc22747bef3fde9561d8a1cde24686caa1c6409d049636b20e946b6ba9f99af2598fb39d2dd7212892ee472f726d0b31adb890c8d452b119fd78ee81db6723eaa7a451aedfdb781e4488dae2d191a219ac529d3249df695349ba08575ffc0a2d95952b508354cd549a27a7cdfed11b9e031606d669852fcd88ad6e9c4ff7e6450a1efce55f58ff52478464c3bd078bb2b3ca40bbc6d3e4a4da6c6bf18042362282812b4b6acd28c372ba9e236ee49eaac43ec4add32073ea8f53cadd93d06bc1a6c228506dc0184fa86d2459bdb2bfdf61824eb9fedeaff9f190a9b79ddb2aa366364bc720af7fe0201e848c9f586fd99d4b2f10cc1802d07b789c42cb36f834899e5b1adde946ec0dfeaf438fc9272811e18b6fbb5b36fcf7e3fdc21501c5cb7cf9e5af947e34b895758da54bf2cc3981762617745dad181af68da114cdd118ec88cf2496a5b5b931ab1d3452ce04760a8c59ed06fa685eb5ab6361ffa4e9cc8662d27d5afc0de93d3f8bf93f99a93f9a3b08bd5ced8ce03498b9f4f599403db16ddff137c5813554e8303e41c1eb78a4527d3649385b0f595f7cfa7c22d4bbca18804216c80a9939546a6cf32aca25c981d511f72dc90d68185c20d7746473da5cd3a02c111f8d21f93828a0f6fed8b6392fc75d489abe1079840f955955fc0cc04428217512f9ad3c4e37fdd0360c0981d8da79d5cd1d8a2092546fa8874e3079adf6c473f03e460859de07befa739c0be405cc3e35d98d96fe403f18324d33b8dc37c582352f9bb0958244d531ef1ed024bacc2d47eaa5a04f7edc440570fe2c9fb2f01ffb56d2ef470ac6fb0a85fd8a36c513b4c0b501dd67a12a7b131e543fe6a01ce32c72d855e103fefd955c7e36297eab18943ce8288cf0e6393fc900e42504e61867d336d558ac6790524596d8d1a15f3a397b97b158527b4a9d61c6ef63864131a39571663040d3df4b4d3bbcce363eaa894c47a61e8a779518b05eac8661e599621a0f7e20bb47a2a150536621aa589c96810197753a39c99da8c70f9701b85c76a75813d00a445389628a5a3d52e4f05704c92279efcb233e6a086f2428d19f9ac94b1f03a7d11a1b81831ed34f5f392c0de4857a7b36339699c618f17a6339611f5fc4fea91e8aa001def0ce41e02908cef4c0cbb3c895a4fd42209d3a6e394fc2d221cfdebf7597a729b83eb609a68395049ac16216fab06595dd5ac932afb894a9b971067e3d738715312e8195b08eaf345d294050b2b3d1cffd0df9f8cfb7293116259188ead3f358f8e822067a2b816e9bfdc3130316228cbcc11b56ca31487210a383782fdb8081b164d448e2b8ac1df09c7f7e3b4b086df9ef6e62c4a621965d546caf609a6f03f265964201aede980dc8d1324f781017b67a401b8f260465353fe7b6c274e897848f401271aa44d562430ea67811a1d00ed6b67b04c1c233a7abd5707783ae78f544e8a8b196ef2ac8c890a3c45c5ca34ba0fa87723ec82826ddbacf081a683be2f5a99196ed65133f845712af76dc711c782178658a8d000a72330440febd1210920525d1cdd7b1eaa37906f8e5ec90a3b41ec9b02e6491fb88f251e04b30a23f8ec0c5b64d8be7896c6628d82b8d7d518b6da6a6fac77336e91ac74b69398f01d7e92943b0aa2e5b4a6ba8185b447512e4c09985cd61731d525b4a69c4bc3089687058df8473b4fe0d9e9247b2542afd563c62a892728d99e41f2321453361f2f4f647c04502ec47ba94e66c20cb2af4fdb7c80718673318c5d4cf46e2895b67d53899f2aeb0205011017c4c7a51a138af0e6cab878c56ae9fb5d98925c4b5394e85179cd77316656b53f6235d35578ea848f42b775cd4e10e08858996db19ef61a393ee7ad918576ac23e4ba994344eee7804e9b780a11b908e07743f9fdb0988dba76cd8262557c79345ccebf2183d42affdad7fa8e6ed0b39350453729b291f7b38944b5493ce5e1f0628a2bb3e40d1005868a19246605fb7f336680ef9816819113721a93038c0f144530533a326a9cd47f511f5e543598b52982f5f052ea6e5d6583bda7debbc00d713e2e409e976776a94d2f546b7a0fb08cd7bcec967490f42390238d45aa7721471e9be2108fe31a3c3cb14938790d231793d6c1a65dcf687b58032329d746cd6dc27bd4b8073f40ec920721fdabe8e99931487f494001c174fcd66bb81b44fade6124695c9f90a56147b8e3279d478268535ae9f119d57ffbd6bae6cf5623069100e5737ff4f25f2924d21d5d5bd2beeb119cffcf18eacb87628003ee3fac1b5d755063a9cc5fcc22d302422250e39f30c351503f2d68fc53afa22ea6bc0d17cad04ef24f29d479794d2424e2a90d901a00031250cdcf8f2fb87ea6f95179fe3adfa62c2189320bfcc37dc1c7dc2be7b699f613f9fabd8113f9fbbe26c6dc52b8f2e47177c93031ab222ccca2ec095341830c78ee0ed81ab638270405d7726c11311b3bf0db69ec37461dc18022e3d9907c260bf7a5e9878a0965804850d527930ee9820eda7ac98da7da8eda4508ed0c7ec450b62e27513a309441b6be3846d44cd0f17a740f677e611abe78958f2c28f2628c8eb2b0e35a45247de93aa2d129bd38d7a480accb2c968534c0d6b711a028e7d1c49c492bc0ca804910a65acdb82ebf24c936820dd5cd24745044d5db3553478451a6f95196fa8ecb8179b1db6863ea1fe01701bd4e371a67041f04a8cd58954d2d57ace1032902503a0db1927d5229100b1d00fa344a14920a2178f1ab418612844d1a75d6ec0584f3952c885756bc49e1c8ad49dd8e22dac6f9bf180cae76e93b4aa9fef10c75bdc214e97b18fe93f1a34be038cff595642490bdfa299d738a301b1d1e06e4929ef5b5d94c7c80ee53355ff2a6f0805ef49406bb2915d823ba699707a542caa8aad91adbfa86f490374bbdebd249d15634a1c37c6faaa1e72a9ea98f07fc3552fb97c5ee2a2419ff1ac887a9ee9a290d29a6b6a3e7bab5d42ba902dbd150f4239022357787a163fb6464202cde5a4dd90d45c4063f7bf67d407676d9802a630c37b52f2f6e424822a051fc61e1d07d8d90e4df4f6e0223623b1780c41263fe5c019f2dfa53043e0656efaf06bf301ab5ca0d83e6cff38cbdf1671510dd29c069c0e86b9dd0e19b46f36ea8eb01c086921fb132d1b905d394fcc45e28921e96c468302826ba446238f37b659492ebaacd3ff4a21d1010ba575df5a5eafd8356417c18042eccf7b9cfe61398df3f124623ce95dce8bbafecda46ed082005d245e429d8b9236f31aaf6ac68ef42811523a8a6f2e5b2327d8ec83d2699ba50168de8fde9acd67888c8ac4f6ecfb77aab893f361473a8c615bcf2f591cc22381e3c4a7dc9a368d425f9c7efc2812cd609144c167a7347a6004d3e2e1e35ac936ad9067b2d90ad7c3bbea1bd600ebf72e472f57ab3eb8f07d146a178602f8c1615a323764887796059a42a4a4887a00f34e2ce20ba31454a88ccca67695a7afa5f3c915309fae92ff0420fc612eabe998e8638d4ff880cc5951d643a01b9dff50da52b336fb55b09aa83e13640702065380dd0e8b0245dab5c05f8f885ac7b7058c124958096ea612c182f979df6b1bbbf6351e0b99a54c78a1df0d62931283472c6999e45fef58d6565f758b518091756d5c203f73784ffc4d4efa6b81e36e58981b0c25bc8e3e0381ecc67b59f1b689ac8b444f2362b04714c0d7810c1e4837954265e6bbc09f87b6053640b7ae1dba26a3c50ac8453ebb6100d756d74df89846559b789da04365c59f2232f69f1a680bc6f5c77fed4a59672ed6a31a9a01648676361cc8af9fe4ffd5c38d223c2781fd6041974cf3b11dc8b17907cb21820a131e0b553f98dd144e4d863963bdc106047e88d0c24d9cf29d4b323d1ab7aab8d3c4f92311254f8d959e1ac90daf4cf9dd0f31120827897b197a0cc44c957c8b868ca83dc29978ad424ce05b67d0ffa9fff9d488d62b50169e4afb07852be7ee6c9b6fb1a03f327cdab830edecd883e81dfa87cf8658cff907f527f1b89a91882a4c47a031327d2947e813414269ce75a0a0e8400cbde0ad6810b22da3fca4d5495bf6470bcf99bc63a24cc8b6ba40e2c1a0d31d901acd7870bc6feee94f7857e608e8d91c18ad18c161d83dc752b42c2f8898d3cea25b1cc05c86a9cf3c0fc7a533acadc5d6040ef84e49e49003d05d4d7be5f0555f621ee0704cc189d32c8fe263c4d8bbbdc610e531a392d9a229fc00f240b0a857e493dc13dbfe22cd4620f510a8607e113cf2df1f8b1dda10dd58fa550a77522e721e656b157f8c47b929be70621ac646f993354f0c9ffc73aaec94c990ca48d95bccfb204f0a8a6f09b65523fba4fe79e447cff5ad29cab77b593176414406430263d8cee3bc04d7a9ea734d338f7d16b8bfa672823ea8d3138da878d3f49cb654bbb13ec0195ee28df5138735f0b45147ebeddad623bd456d9c2a0b8e7d81f5e7b8e4d01f4a99c9965fb082e6947684993e312f0c296783e4815c2086465c10d61782865b05e48167b4fac7c5bd50a51e6c9518d1baa2280970072191e4d5384f81d4bcb8631c80bfd1ea16b5fb5b04ffddc02819900c30219e2046d4c6eaaaf73b1f78ea268d3db0522271223b121d3da8953e8c90797c7b47bef70df7f6a04b7c50d75a1e5f715f662c766175848e5204db8a585d0647ce8e13b357a958cd6439f908f2305792273d5c243926c8409091289f9d7f0b1ba8fdbb4f882f311f0c738d1c622e6dfb50c8d20dff3629bdf67edd55057cedd10b388bc84e72f29a9b52cda9f1d75d044aad37ebe023c87099ebd3f6b471d9c51ab34779643cfe2ca66d42e4343d02f7dd114ee136f60d836af3c0ccdb3902a174cd6068db6585d876e333bf67880ad28dffe103e8a1613c4b3fdcd6f90aa01df06097f3b495961b2cd6e6301f8ea669c454dc090229558f77c5115fa3a9b2a6da722713a60843bb76247504b6d3d5b73ba6fe4d722806b26647589494607b5fb0d361503f5f1fb2684a0f0dcfd12eaff89410ee765e12519bbf8e03399bfb5af0f4e05434e8a723f7b80543321ed1f3260fc090b60324c843797d92a387027d73f39e95631796b34ac44412627e5b9e0f3600c02200dc587ff2bc0aa7ea8b31d0a8bb2df989cc7a742ffecc2ec3ca1384cc157d99830dbad34439d94f6009cabfcfacfbb6e0a898c19ef342d96e9e8078e44d9943fddde59eab2f06648ec1f6c9df9aeae69b115594f1ee328290e0468e81a57cd1adeedc9ede66b74cffc99509138b1630b245a753e822bbd69c07ce670d983ee0448a4ec0b92ba8662fe4fcc357ce5635386266ed0d2e8bf6a005ec5f2eba71df370bffc76be2899496f0137efd2d8965352a7a5e6a3e505eabd2e3053c09b9758a244b08e4e75588c204c8609bc4e5a952219eabf450653ab8df636ae5be64ec4ea7f9cba9d0feb89e81b83f37d45279ff06cbcd7625825c91acf2e91c8584b8952b921cf2ecd2c86566f48677a5d85ca58b958413a0fdf9fa908650fb02bf94eff3b9fc0968803bbef954ce4723d95d62b05dd7726996c64ad5d20d3db0536ea70ff683de52dad34312b8711fab57f3d018d8662a6c1b4bbf8f35150cc28e405520a146f8855da7fc4d1939e357d74109b5e437c4bf64b5bdf7fc4c69cde2cf335e0a2fb6fd49e30854b9e3253b8d9bef487530607742c2f3133607b9b28cf90faf42d66ea58b3a5965bef6e9a26840089c7c1d3bff6bce63d8a86318f4acf1f7e8c793ae174dafe747d329ae5260b672ed3837974b358d077eba776188feb4a7187e6c0233b9db580b2e365721613ccda692d86b990d83c25ba6062ca26cd288669606ed4f08b2c23ab5e4109b501a560493956b77c254e1cca395df7c18aef9dd6e2b5dc38c043ab9a4a83100d0481b9eaa311eaffaf6f73a2e79ca922d723cf1a8749b5aa02df3234729c04e94187003497e653e9c91fd23aec7a3d64bcc74b965fde585efea9bf39d388c5102fe962ba2021efc11f4ccb6ab8a80b142103c60037fa49e1fdd25ca8bc4e5ff095b5f74de909edc397b1506d7fe09c6c2152252297665f572e850c70ce558e614605070084fc847e09d42d9280cca25247c840af377e0aa5d7a6cd84705722de8e0ebe33324873f1946a4893c8276ba5eac1ca30cecf6b01e55cd04e62cfc9ffbb34e8b98ccd48620de251907f4964658a10b5819bc7ccba5566adba003f64cc261ca2d44f0b4aae20c32f80ae6ce1cb9405d9a7c2594e10ed0647f45092a87b9456e80b01a4fe5e4b48549197d4e29055a371519e1efd4a5e0d361b6dc4f782e15b606ce006843e28cd8bcca52e5d94d6e85f9898d9de40972142475562c14d31b9f538cc156110504f0211f264db96c7c739dfb0d472ee11e13558bad9ff2667488770be0ec53ade0f33df7b86331507a8defdace556ee701e8f71bc1580dea09cdb08f76b5c6f27e134f25fec535dbb2d3668da93413fc74e4e23a053fc43c2519176191a0a8d9e88a6ecbf7cb54dffc48629a067b0fcbb89f6a29be4e21fe482fa2932b62e1df21afe893d48c5cf1d77f7ca5cbfe5bf0c051bd739e5a95badfcc10f502e2862ca6a7c5a99193d95fd33e4a38ef416de805b3fff8eda097a8a3e31723493dff3c347d4d7b4a80d58dbea8cf977b0b496e2023260fad1e743a7cc85f440f0517298c6202d7747842f88320163e8bbe18c85b2eabbe27fbbfce4cae0ba3e0456c6795f124d2edd2e8eac761cfe7c9edd4139d4497b9675032792d8793b1967572e18a346ca43480141d8a62cee5b10e1ff413a2517358f5694c857d39a1184d54ec307ddade8283789eb98e2ff36e433406fa4b5e2c2ad298cef092f62177dc70a5ddd52a37ec2642f94c2656210541ea3494816307cf3a0eae5f95025481bee753686ec9d243d8537ad0dccad70551a66ee01b2d622d0cc820db7ecd4767b992b968b2fbbecde7c7c71197dec3c3acafcc6d25d1047c88902d07b648ebcaf38ffddc2748f2119c303771f748b01b91a3cad7f9916debbc7d0a559423a0749a5e77630f62a12a29672ca737fe197738ba72d80cf3147cd902b54fca3940cc501a65056b7ac309f93b37929fbd97402513fdaf1ae6cc7a094d6f60d17cf4826cab1e91fac39bda0a4554532a87716afe66980b9215e9c81abe364de5fb655c4fb373e31213a5d85c12229e7ba6f1642193a8a15d5baef42c2caaceb61e0bdd431f6f79107202b40f0d9694066b732aa79bb7fa2318e8c72ebf98915121e737d34ef10bdf8a15660130198ea48b81626f7236db4001d663b8c328631783e65ace0feb8a6d61fa69d1da292e358a8ba19cb332fae166569a4475499df04306f8726ae5a6a626f7989d602063bd5ef59db96d3b5cba970cc1a9b5158ea37a83c86e971a6cce874db6ac77283122b0c10eca3945f94fe5d45179eaf97f665025f1236ec1f56bafc488ad69434a929dc74976d522a1d2e39f84948dc1957922efc6419beb636809f48e5bc486cbd20e897b111c78904e3737ef24710d024c2bd4650c6d6fe447a15bffba7ef90a7700c8f8eb5d4171ba6c6ec2915891904003e497c9994438fcab8443c6e8d463ccc6695eccba60f4a7123445ced51d8ba9f3a3b80dad5a27a9366fafd864ec190f1ba9c713e6f0723e3777e3a602a3211fe7092170a9c94a2d9b29dcd27324ab1eeeb0f37527ef9a43576719b2ea5f13c7db9c8ad4ce9c738b84540ee561f9265b90352266fa966a8eb88aa2a8ee9c86e7e3fb3cee794bb1d7af1ab303469cc9335b92b688e070f64e0c3dd20f5984efff8aef8c379038a0b47d539bac7b9b04f571865a95756ee3fbfe7ba8ba04d03b592e2071421e2b431e32d81b485e0cc595219bbd98017446b862ce5b59ca784dbcb335417a9ab64ff8fdf77460fa705c4251ab7a2a0c406cbbdada0ea9394f8a6ed94078044c040a06877acd2501b3c710257ff9e50e3a951c92265ce7ddc954ca09ec6bcdff1c829a56b1a9558d958557b7e5db89e3090ae3609afba609274507c9d11427548193920bccb0066ded2ee7fffbfe8ff20d6f0617bbcf2adcf1d0994e33a686e88a69e621feaddbbc00a8147cfb1b207bc932f0c0ad9e65e3531293a0ff2a2961041b6e4482e0d99af826043f614ac0850ffc447babf506608f1785bdb7268d7404aa7e72045dc64dabc3eac39edc22e121076ef96507c24427623f1f1e5fffcda0e1b08dd203e5b0f885155c915c633d8e9828d1e0c6fc9cab908e88f1d7dff60d757e017fa6b823fb76cb8a07fefac78a06edb3f07bd3d191498c3308cd0ac6033ff27773f3bf1001474349bd5b2712dd446b2032140b2086859b5e7ad136603951f683d5f51e492e12266e3af9cf88e7575790fbe1dc08f4132e024e452dc67a64b511985e5801b96528d1ca433d04e6ae9880feefa5dcbc91cb9acfe453dcd57092969fea244fb4890f8065d3f5c8608efe7149ebe3da9a0c1f3168e8bf58cebb1324ba57e16f1a847eb8d259db132922b035ab22f5172d3ed535e6c0334b219312702da0c639972ef6e11c6f5c9d5ba047e705163f531d4e3b4c2c1f90f8e2e7059fa684b9dcfcdc607cbb06c0a0b44e3aa2e2e71f2abbe10ef9bd6df85ca77c85a2c1577023dea72f74aa54189b6d479d4154c15f985249a6ae251973dc39c2d6a310d4188665a49d65119080134014ebb5c63f6df5371923a2785af41430bceec6e3f052491bff67ad7fbe24802eeb164e9844252fdeddc21f4a6a231e7e307aeb3bbc63ad26a7f060c6f8000c03d47e64d18cd24728b85480e5490578edc7d31509c1994e981ffd3c50f3ca52631edab6761d25e332a372c82e4a9cb6fb4ccb4463daa6c8821ad19233598c886a87a08e5053d97863c613525950f45bbe8213b460bcd9d3e0a8a6e01f4a3b9b7c2b4563c63665d4f15576f5c6004174d0246b26c57e165d092df82c835e8b83e54a32c565b542614962829be81ccb4c200e04942eaadbea06e36db1660623af4888c33d17b926d018a1ea35767d111479d9d2d40f7e2e3c0e53586a5d6cac88c771cb1de8a26930795d5026940e5d8ec1d1165418eddabe3e129cbed43a4fe4739b94fe99d0c9adffa8e0a8dbbf85d1aa9fe6b4da48ee69b6f85cc92621bff00d0f3f800f46158b034a5a70d497ed8ff6e6841cee8a35d5f3165c004c7f3d69bdbb5158bb4af4ca3fd458d6158eb33028ac653d21b0a66093937dd54e7c6f24f248ecadc29d5f2c18899fa69c4c615740d674e486626d3722b3cc65525133dc911d47790a8f773806baa29c00b804985867f714c55e706f30ef9e59b8b349ad6df06f1aecc5df520afdbcda851c079ad3780dce594fc28d504560d84a3222caef6dcc7115009ddca7b86b955af6fa8718404628d4991f29ebf2cd4771c6b89561467a77655b99e0842446627bf9af2f44a38fc530379e692d291afb5de7bffc1380b9f106b3153ec3acd962efb15abe9af25a339811badc2b4eddd216d23343b982ebf6b81a5f2459897c03ec4b6ce3f39442a0627dbb7c297efb59a65614011abd5b6615664570ae640abdd2dc22e58a5a0b4e0cbca8d4ca4e74196cc215517741140cf6e547ed6cf88dd5db0ab9075112b6328e6ed681c19a5dab4f8c4caa354a2a031c8d2371a6dc897673704540d616280e273bd4d16e4ed18eacaab5a289625b3a4311b09472663838d7a4912bae11090d536d7fd8798a57614ab5631e3a190abbd6023eb2d845c4c33b2853b711c962b16da866d5a297f93835a6616468ef21f2759b6f85b9c34233527c73c52c37ad81beba3d20400929683db27fc4a19f41ab3c8f73ee2cd54ad789656dd523675d5d4683cbedd06c0da8ddb98f74776fed6b6a406b45f23ecb2a2ed50cbcee717c02f9be6ed256eea151c9722370355ad218d9b8485a85c95b05b4c51cd22e6187a948f4cb3d7fd54504c5dc3916a5674deeb78eecdb7fef50c3a5866bad6329ff67394fa4d2d1e2dc3482a238df19262cb07abae33c5f732ec7aa9da249c27ce4d0b54dfb05d405e7b1085187cd48ca58bb67a47af8476365ed6aec5f0274f1aa1aec17e8344eda159cf8f00d1fe0b812b736006054a95851967da7657362125d8ca1ddab7f45f84ed5fd23ffdbb49ef472c106502c6d0f77f970035110bb0ff539395fee00da753dab05b4eae1b7d72c54aeeed5fc9bb42ba2a276f8d03510714683a9401ac4635697450565e73d5c19ba8248d4bc3e45a046db66ace6378ed3f059fc9595a994b6a2dd326251d73d96b2af634d7a06e43d385a4d3b65f4d4f2ce126cba76a8a96b4d3104b6ff36f18ec17dd58d8d57fce8ca3599c1098e4f0a1ebf0dac96fb5991aacdc59490a2d91937a2a2715484dd6818e36040851e135b16aded8357ce6ce6adfb26d0beeb76ec8ddef45463c6a2b6323af5f74f603c6f8e8870847d0970a3ceb7f75e5bfa7fc77da35172102f774b391eb0b63fed4a7491a534c17bc17ab25670b90782583bdefb6ec6270fa471d35eb6b7ebad4d30d3bab6c91e568b903aa6be4bea163ec7f67ed95eebb9190ffa634e73262c4648e0ac2f1ed34f10cba37c468c03a8795d1d501b1a1907fce99a1cde73aa171504f632b0f2afcb04efa90efa40d800d38b09a29d17fa88a338023ab708d2f8fc0bcdb1eeeeb690bfac5b498353eeb896e45cbbf54f48500ed4c199e9ac8115d54d01e2338b85ba74df85f777e23e0b4490818cfcd0f8f04014cf763f42d8eb2caa66788c9cfc9c74ac7d5ce0cc7fc1a1879e3412c36191c5107b87f1dfc5457c345a6d23541c32cb1f5a5b783a1d0b3b77e7e51b57db711996e725fae5f4fd959d88ae246f3a5c24932ded15cac32f0b3f97a535239010ebd983c04ea933ead5e754fe89ae8afc7961391039ba9870b40eeacea7c3fbe50ad452e8472936e5b3697185191efe38178a324f06d6bcac0b7b31ff09698810bb85682cd82804f2971077a21da8b0215ba9247bc71242b734f6a152ee0eaee60c132beb209899e8ed7a3001e75739afd35795bc2003f686934dbfca760afb623b821183a63b3f315646e45176c48ea77a6c1ef6313f68d68f2936d3010ecc781c59b619e389dc5955d5d5e2ba33ea56f3bda13a0921e0c895b15d48ee7aa73ec383bac3e46a78f735bde943356362963dbb194d3cc4c2790639fcd2dffd3dbad6b4a964e652c22e39d82ea0cc3da3911b972ce0f27ece4749d51c1b012a4d8d044f1099d43f19a4ba85c0c5ae69a1642b4012ff6de074a9b90a28d9b1b2f2fe611a0f7f439c75dd7f47c57ba33ed6a45e977a46870dce3efc316da2e882814f405b4f59840cb4c893402426a0ca4d528fa5387101b65f669cae7ff05d1d178c1bccd220b2a29531d38b003d60129f6199c287da4c3c75d96d61142253b60cdd3c4ed806f510a2f5538790b0471799424586ee060f77b2c0a9983c855904b01fd1eed6d71ac55a68a5537383689f4caded71128d424a46c9209799b5f44d0581de3a7fe1ffce55c8e7f138c47ed0538af002e9f6d447eba076d9d217f4c83ceb1a87698d11bd3d9427b70ce6d8951672b60703dbda332b2378b40a189ed2f0c15010462cdbe232a50a07dcbc4a75ed204cbcab9ca213c84a236a84a1ee0672e1c021af31b9870e3906859d743e8b0c5b0daff2c2d2ca93c91c6c00cb976417cd718a8332d682130c0b376f5a0815b12813d19bb4fb164f036a4a9fc3469b98c21225039549e8f5f093030f8e01298314c6c431ceae3f52e1d8f267c0e278999f5e09b4d4be4a7a2f8541af4fc0811ed8d083c956e505ae8be743682cbd301f95044d7d1356159b1d173ffb355ba18c8b401293a08526402c6d0b7302b695038e99347bd19ecbf0dfc9b8915e4cc6dbeab8fae5fe4043530251d82b6698df7138e537df78a4e4f96468e7f4ec763bd98c006f9225382baba78806902db9fd2396d83d4d2d6e5d958ead0b64f3443533abab56abee1da0e92396202a4ec244be62e6d9d8579eebe9d99ff22252d161f3e033d5e3cc6189c1c200e0bda6ddcacff26db63fbddf5f4efcc882a155dd8186a595fbd9c834e6aef136f48882243fd248095269af4bbb0b78a7d7a9a41c71bb505216cca339e2b40fa4f6369cfde7874e3639193be3381cb059e9ef2324a928daee33c5b7813bb8b439d048bd38b21937bbf9f71bed332939d3fbedf3afec5ac1ebcd70015149d689ff50a5850157e0ffc5559d5a7474cb44796650274da3035e891826968bcc591045e77dbb8e9bc32fda7ba6accf5e1c1f43cf67bfe1a53829fca8a70d7355b13a9168d9a66b6a041da7459729de26d6ad3f0eb670d68b60d624a273b9558aa692d44e41e0d911c606a14b87aa53af8b24e5729bdb3b8f72b611ace222a856fb6b5b3da5dfd41a117eb131381382f10f0dbff6adc2d8762585eef5188cd3948c395a9724c7fa6a34a928826edcecd792d9fc5964fcb58195f7ffa4b6ba9ac47ad8e7d0dd45f16d137bb8410de39ec337114dffe9ae2bf504780100706ff824ab19d8b75303ba0d7dfa06ef4e0f528e1fec4c19bd1370423bd9b88692d7473a1b07f3074a3ee7beb10feb5511a390440d9e92bbef06a9865aa511b37c457231571ec55fdfaddb88f677b75eb02a9e30b10f9f65f55c4b5f749d4b40f6792d6605f5180f908cb012c129c4395ffaf1d11bbb037cbca74df03c62ac73f3c622c5efd6d364999d9f5f3ffc20b9350c6998666ccde81585ad967e07ed8a97c5fee7389033c5b04fb25fa1115f1a626acf229dd17e16de623a60ef0c8cd3c3cc7e1529de2c747c0c02654bbf06d210488e1511259b372701cd89bcb7d03bedf7d13dc0c1432c59d0eab5f116370701b2249dea74e8dbc50507ce8a5a5d297bc590a6ae392beaa837c8e7c5d97906bff3f9c0d799bd38c0a9350b5d98cce334cd9dadef60acbeed72cce0744932461db6d78dab88c61daee90cc9da98232fc10218362e0fe7b5676ea877ed8569a05dce696354812d1d2c04c88a8aa25c960aa4eb3120dece597b4a998efc8eddd689b746f46c51a53e2a98c520acacaa6ec865fcd1e9df7605edd5c813aaea2e3e437499e1e227cf44eba758d09efc4022b8473b611f59323a1c01a352518608d682f830d1d290ec78642c0a47d062a51965676568033cf832f84ceb88f1d69f4dde4f9679294449c4ff09c54e7bad7fc4a4ef6f0ae521f638ec779951543837c060e0b01f8be90e1c7b4882f8480d4b80a32a96e4113b7942022c4c48b9048984b78a9d06af602f6620d968bf149a6c61deb7878bb74deffa1b0986b670bcc25e3d1248f6a9423a53a84fb2bb7e1262161789b250772495174016ff1c7ee91c886c55fb14be0d77f46f80da32064ca62baee169f887978e84f3e8108af869f1c29dd9595cb7aa6d39f7ffe0440ed476928f41ff73c5b9af84b50bc7426f77f66d9fb969e4edcb00755e4bc25edcf6dc9070ae48cb59d4167eee8642fa89766bbc21137ffdffffee8a5fcefa7c82cbfa947fb6aabff2f83123416544cab1726935a5d9474a6aba1699d3d4a5910c64e43a39812a28203a337bc9d3214885dc63cf20ec8cbfe1eebe355ce22268eab1fc4115b05b37277e101a8489578392609da9dde73022b98e627a17eb126d70a880b4f0acc74d10e43e319417f6a8a3a8ee62e0b347b39c2118d35f59a9a3c4e2f8168c1e2cde03242365672051f72357ea47b2794d2af3ef5e9a09b243e4ac5725da9a858617f8f28527ccd2b9d34dddbf322e2dc5956fe9c6c63b0d95b33e458311c7b7cb72df3314d68154cc1e5dc7a933bc919dcc5a85b9599d4160277f41ae5a38b82df63ada73767f230bcdcd3ebc9439d2bded373a64f7528b180b9904ef10e01dfefeb7a4642cf40012024441e18a8296b9b983677319e4d6899f5183ed4d0aad6bb46d4f1674fc0ebdcf9f83701485c1f5c02127f49f375aab172dfd4dce03fbe2d4ef1a0a2932cc9fdf107772fd8a9edc4e869ef014a17990b91d508d5ecdf914d844382dd9a938f7f56a749641b468be875bf8b4cc895a3b248bc41e2ad1a614269216a0a9e9b6eacf19b82212ef1458a2f1f90b4aaf4ec754112b19f13758c1722afd7b392bd747cd7a74663af36feed477451c29281fac3efb979b36185ab3f6b6b0a1034677cd4e8c0cd5ff24a1f9a23e1c28ec6da3b8a9da90ae940b5c5b09cad5864c3d309aa295e8215afb9b100c701a2e68b93a28949f59ff757aaf6c21dafdc0989e2c5afdf6f58ace4544583873f652df147d5f8f89d10a3a9efc43a84bbe407c40eaed6f5f9672924d446fa258d0b3a104b584a90778f799f2534fc6b10c695265b5731ce593fac8f0b1f76fe5b7a6f70debcc8ea4741039222e9fefd88afa6bc3121f2663a6633b7711b6384c35b890fa33cb6dd86f5e4e72f82e4bfed45103064bb4ac1021b5d4686a7c0849c2817af3c220d5e425e24928b1e5244c320fb7ad103f07d30e7fed4bc3165c03b5055851e37b6001f68188a3dcee7d2d545af9d100166ae55dd0e727507aed08761728cba9a33e865964d2396f24aea46100f9afb1ad883d86e3bc61538a1a525798e9b5ecf8ecbe26f6b5ad371f2855a6d78a1a1ddc7d924cc3f78beb859bec98ce05a65a1246d11b7fe5d9569da863a361fbf688c90712d9f990cfea3280476cdeb1d8ec5b47b522ecf1ad8e6c53caa1e0a2c7324629547c186e7c842e80c81f06d34dafafba971ce5b09966cfeef0b2d81a481437923e7e8a1e2976d573b9bdeeb7264148b4daa5d2098620adcda8fb15f6decd711e4eb52192a5e494fb411069f7b2bf21d58d0f6061668b5d3008960e036bba4250ee528ade0d47cf028447665af7a59addbd830a46a8dcff13e30ddb288eb30b9ad2212dec408bf11c8d9833dc5efcb74b55244b36a80e89c0f61d04440cd8707fe2fecc7eb5eee2b131ffbf53e46fced2dabbda1e1bd022ee406e42282f99d67702a4f413cd7ebbf29ae9f500857b2d33d65a13d02f3b001a76945264230b25a331d3aa82e7c548933c97f62cdb4f581891cf2b672263b825d1034b6953b9b9aa9ef20c2ad5fb4554b1554da97b83363136dfdd924374e2a1dbaf1718bc69df4bb1cc026a4a2bad2a6135507f67c1e9da3d5d1ad027a39ce4d8bcd9e28d93e3e55c4746cc78a1cf02e46625088b4ed8b8a3ec379cd031db9120539e0884c328f06820db1a97ed6cdf67d7e357e2efbafed6717518a39971513ad1b545661574b6c5fa71644ca0044fd019f8fb8781b34c6cc1758f1dbbebda07cb52f5e1e47b71b59dbd38bd38e7b53a6b73586d5b7c9381c5d2a43ff3ea88859390f787b8523ed1b4ddac338fc4708ee92dccc934c866ff7007568e01ded140ae2e21171302ef87db9b95811e839964e8c6a75147afe601cd0c01ee070301d885838b8e1db51f3b554ecb1200682d9cf0ce2739bdff671689264818930a3bfdbbb3f6b5467e5dcfcf1c3c47ecde8ec00dcb8636046563761a1b9dbfaf2a72869e6bc383588cdba2a8abba0fdfdf7b37f102c922ac0a594bbcb6dbbab2a2d321dfa83de1bafffdbf6d984acea007036ac3d9ed591d7b965f650e0c0fac4218194660841ebca90c7e36ba6804da5bafc668e4256dff59e567c5e9274b2c04af5ca325b247c21fd6b85ba778806521e61865418b076f82d16fa2c2759726a6fbcb2ed3fa3b09c09b87674005ce1d847b5eb6189d59572425cf66759c1ff9edabc37f46d013393aa070049059e15e92c880eda1bfbeafa7afecb9a4dbb0c67696e95e7a5928fcb0e287f3d2b88918f465cc2d8403a05c1fb2f003f3b0de5fa5a066fe7e8e96d37ccde1827d50bfed06a2a4df60df4edf80724f4bbe2b1e036025793b3a1c150171583af3a84e09f4cf4564836aca670655ae45c429d0305d7aa9d8e3d0ec3a0da5c7ae319dbb7ae5f4ab360588dab08316b49b54638ce57da9cca70982a7ff85c4bca4c5c778a2b6dd8223fb932cdd502ff113625c8535e5e429de06fdfdd689116c3215364322af58a54b5cffb4b2aafa16229fecdb8b2dd2aab6a98e449efe95dcd09fe2f15964cc6ac41f16fbff24b9a832499307bac65d35251a375e007441f2da77e4383900c4a14e7896aab72fd6f8e5e6a0907fdb93c25ae53f130a29e2b468e3df166c1214b54847bfe09934df8ca7f3a91859b4ef2b3e3a3f86d986a6ddd8ca5181a0fde29ec1495f9421acdf2e3111a9585fa5ec4cc614fd6ce333f003f5d9d59b8c4d785b8e8cd0df1ed5f1364cd25d85e2e53321358e549818d0a26107596854bdf11b3bf242b558b20a8afc84179386dea0d52a70e647e966a44e3ee16edb5ebe0279ae280b74604f3b5cee95a279d3a990ae4a970b1a148a67a76892146175adfb166f49a9f2531ef62a63c2dfad93f9e02cd05a89a001692dfabd7101fd80211445d07a55571780e56b7f58905958356d90a21eb5d5563a76a0e5688f3fc4da594d7bdfe09715634c3534e127e21a318a9ef160e7f86034fd67d9feacb2220d380b1eceab3e1d313eccc491a5931d32662adb7ee48156a40b3270968af8f189f3477e6067d51c519e01025224f054644fc89d896bd22c6b6abce2ffc40cbea425f5119018ef7c5ea4a19724c123d8322bb44271f833fb990e471f39772c13815a4273aff7cfdb2c26c4df1606ec92596449074d3871fd08e4464c64e937666503fa66a3b4ee1d392fadedcbe56677b27f25cd2b2b2492e67a3f0a328c8f3d9b45900ce968772abda11e7efd3afb8239cb269124c3011afd54f0e3684f3163cde85d7de529fc67222d08ebcedb844b2ad77df35e711a125f79afbd7eb22c6ddfb6df2cefbae12642cab898f2e52fe4b018342ab00c2db1383c9ca31d4e31e78748b6919717372f987041b49e9fca9d702635df343b472548ac0b684021aa41cdf35b888c34c31a4a82a6635cc1a313919b8f8cc349406f74bad1daa5261cf118d06f369165693c4af6fd3280528ba3d2f7c5260beca8da959215f339f5aff55ba6cd8909c003703140526850d0ac083b60f506055e3946e738e2c05a4bd80a1537a9814ee375734ea9a34e5a7920e97aff949a3968e7eb699057f1e91bcf49454212d7ec7f7bfb76bd5205f2874219ec7fc2de892ab3241ad4697c40b396d0641d04b86faba69a282a63bb0cd23ad28428664fc5aebb40dfade736fa4fea16968fa65b284056058e9c58700550da007dfbfaafd92ad4454a0882fdc058bdef596209253faf35e4c96d3b60cda5749f8d1ab6dc9a13a46eb3a79591b8413818765a167af70ff9deb98542197e47c4a36f54ebdec0c759d4a7197a502f312bb2af2894f7b989ca9caa60ebc63d52f7d8c0277574cd86b8167fb877e9aee190fa09fddcf10faf594fb43994bc3d2e630b9dffcee9f12b11eee3e3fc090eaedaeb9335cd89bf3e1e7c2da2c87d9660e1fadafe5dcd8c12e75385bbfb16d70f3c2215aaed29b29fd5b32c3911d6d9995f3e644478f949c21e01bf17a63442924e2f3e52f7eaa3f95e29263b94dc48cd8a2cb085240f58019fc8945c6ff55e2c4b0ca6f5735c1f2007cca7745a4da2597f40d53ca5f7ab47996a6b6b3789a6638ea935ee21214d9bdf67c2d89da11857223a2fe43ed1188721c19aaa3b4b223719916566f4131911645de112af4c1e432914645044f293bfe3d44ceefe7bef44586dce3ae371cf6da325fbbc529628f53cf3f2df1137cf20d9f238bdf43e715137f3216e47c1ddf20ac3280f9f9cbc392d8970dd578ba6fab2d44831f91f5255f9f5d45d6b2dac87edf230d20f7bf1c210ca4e03f81265a7f4cee6aa6425ca42a828055e3fa1ed5328f7ac33dbe9063a1534e5b344762316c11e171a6b5e0c80e54843595244b71e0ecd9e47316f0e739085e5e637c538a984468e640e7e94d129b879b60fde32b8e944917100324dfbddf49fb9a814ed7c3c4969c2bee9470626b1efc89d37e8d8dd81e17960f05dee160c640ae77ff11eb91ce9f6e7fcfc05ed30d93e1c2ce33553b33c4efb9f4d82b2b2cfa536708fe23daccf75a93cb10fd5ac2b2806a706a7f59b0df893d8f213120cc1c9e760838ae68ffd70074c58e4f66ab13072387aff29d55ca475b08aeb456dce53aee30e8b3571ae0b871360b95207226cf551e7d9da0f89dc54adedb3d70fb5399888c8b84a06cfc00cd87682f18d6f585143fc500ab10e2a231c400fd56598df8f4947782c51ef35b90ee9f440abb5bd275fd747ca7497dd265d31500640f3f4758232b90c2eca9b9a37d45bbf56f1373477eebe9261f16bcf71f0fcd29334c9d6d9bd88b607c11de41a1cd0915b191d4f9c6fed2fdd3bb04d236a532d999e8381a3ca4dc5d7bc0560df5b9048b7be60ca006d7f28f5ec7734f351e5821fbd8a35fe0e59f8be0d69d698141e243d484237f1eb4cc2d3bc9964637ca4f8a61af359cc52217beda15525040e8b7f9fb8fedb7b978614348f00c27c49e034cee46143da0165c295a300638272d3e497a59caffef6648fc68d25dfa72a6ab7af8ed3eec6f569e606cf18a0f50f9e2ab31a2146917ada84e7c0bfd3af7c26d33fbe6fd02ced52e7e339ec10465613572341f348b0bb2153c453a4bd27eb6d720713fd8cf1a1c9e5fdc0523300f2319921b39a04e0113b7a0987e2f965f7a977f8cae61b92786591d83e6f08ad5c417a6f76e0163822ec8dd4af5a573a0777258d0befba816ca09835e16f9b158d301bc211b06418454cc9daa7afbb25a148e51091fc243b602ad0008d5478eb95789fa7691b6b78907b3ba21bd224b2a51a95be20c2f449311d61834419f4d153c847f0b9388e629a3ac45866eccd5326fce680ad10032447284025ecf428f703db8b3e61debfe0b6d7fc062149cf93d9ab5aac243d1bdbcefb915422619e5e82f773a7538bdb8bb1e7684ef2f5035eb32bed3d47826af2cf8cb2f36abd5c1316e9bf405b24089b33d3c59a1016c61d033266594747a09da7fd68244348102d9fde5c66796ee06a9199661bb8854658d85be648581d19cab3f4d878ea28a610f011973cc19ce591cd1852c3e675adfd977bd8991214a5719c47acee2f7a7251501dcc15fd779868e4da06c2257b12ee38a21d1904b2afdbe08e92c6e301420eac2eb02a707a8cbeaf14f7b256e20269a86776316fd3e84b2be54037bf622616340405866e5b31a7c2a229483ff892652495642cc68eed860dd6790dfcd015c5c1711e06fb489175d1608f91bb9f310e558af6bf9de42254e17a3524b96811964056e05334c98691b934523a61b8d6c56a7cd2fb2f34f9573e87ab06d0145ecbc52f92b780cfa4a71e1e7af40bafe3f9dc48487f9c1521e668f09d4aacbebff61c98778ffd5356cdb303b72e73e780bf0aef75266bfb3eea799f7c0700b11ff79341171d1c00fd7421fe66a2e164897d116ffa803ea20b5b7bc2241190d71e07551f126357c8fbb70a3b65d03b0f66c7d7ff62b6e88d7e58543da6844a292db25555fb9d15a03be95088628054194909131607f143afbe2304e759177a327d0e6fe157252d8325c64655a14facf0a0498061f2c8ac4931e02817370977160942dfe713491a98de00e0b7f284f4a0d31a6f7de7f1cf9ce3e47bf8430be4ae062c21efda544b37b6ef345cc98c82a875f9a7273f8998dbe0cacde606c023cbcdd5b35f01f91a7fb143f26092239c87350c28aac87c62e16eba6889542f2071bd162ca435888599605e12f1269257c17e9077d1ed1db7b87f2f546d14176e5958ed1dee851affe4d41a632583ca787240b78d755cf0ba7dd9c30d9b8200d9653b0bb9a4714709a374591f2ffa90658e4f0e9425000202e5c23196b012ae4a5abbf45491e4bb0322b0ea08c1dd688991b3134ebdecc7a492f37bb47585c8bd46586cd29d61efd538202231043606a83a8edf7492ab61092a7af122b36aeeb8481f9a09c85e386b5bcfa1d6d4bfe1d4e1d77b96c312ec0b34e6e86698b5e9fef423fdf62fda13ba7f75245918bcaefcfd7bfb440de918a6b79c5b3626b080bb8edfa8a4d4aa2705c59252337e23cac11572c74c3a45d3a0303bf681e2c5c2ab28d289d75ff1199fef1a10861afa3e4377ae44252a3010ade3879d039c6aa9faaf1dd9cb0416db82d260603c7fae3a73eb4d9e8dda6bdbfbe57ff8a19ae3972f09dac2a3629b16d79f90ceeb16d426d3d135b72f41df740c1450c00fafaa4ca840278c2a8fec7f6412b21ebee7985823677fe76a53b9e4f4afc8c904ddad13e0b2ebd2899330bc2502c33ab4924c7fb2db9dbb15aadd95b128b67d12b4bbf6fbc9822f499886896884b1a11bbe4e581ebf98cb474a7f29ca4b2ee0891baba7ae4f263849246bf5f04d651dae6bb608a7465b4547a486bef7b12cc98221a9cce849c7e39d0e13fa33d6ee6955c10c12f68932f06f7140ecfc525649fc9477c280e4ba4dae27655d2de673e509a58c503d0fcc2efeebedf98a27aee654f34e5f32080f6c825f711b76534626f3d4a88f03cc067a94c8ea3c3ee02718dfaeca15c0fa8a16e82d1a0987e065f4073e1a3aeb176a5ffc6fe4eefc603dc3a8554fcccdc9ba5c0caaae2d6a7bdcc895d2d3e593c47086a0167e1d58933f89f9c942ab121e18789b57f8dc2f98d8326daa5add316c14ff9d9849219e4152c0049e83d2f245947b0d0860a4201c52ea6a1f96efeed8f0243d3f5d27f7fefff2bbbe86cfa95d8f0456aae29c400dfdefc6b1d91d2baefa32a5e400ac9b547351bc0d845226fa5b7af506a80b2f104146d09b9ad3d7bdfe6f42c50c0cea81643f6faaa1df3536c259de3f4bb5f9cce3ead650f3893dd0fa04fdc883036421d960dbeaff9cfa290ac51f7af897f1a8fe54ea03f9a2ee42b2d51b36462889c6b78d3bbf9e3bf3b9c3abc24c5c18c4a34c539cdaac87ab4de5c235fa888845836e03b391a2e9a66fd5b4b714da69c82e62988dc1326aa476d0bdfa74355ca226d2f76341cb96648d0b80b24dc17db8277bcd2dbfd311dfeff459d039c4a6813761d2820df7e0f7de45b0979d0560d7efb6f94126d9b645c30278f21cf05b3a1605bd18fea622256e3cbb180b9977048feb68a8d45f96ca012512b8f258eab400828398a07c000c1f845cc1857667fa5ca19c66d18b8a741b271c9cba44e64e2b317592cb2d596005933a7dddce453cc20eacfe901c5a3305d7b7333c0ef444d4bc38aeefb6ed88b179542c1b6d9eb47232a8310829ecf3bcf37c2e1690b8e9baa572e2dfa2f66408ae34e64faa93e52a9ba065515627cc36c874f0266438c05f526314b7dc2b9c9d21dc450985b7a919ebcc4601eaf3bcfe7b4457efa46c1f6eaf18742603fa6a859fa2aa6b255eeb2b359deca4611b0ac5c6d39c040c53dacce53a40e6fdff3b7a55ddefd5e1f5757e8a0e30f2bd2d4670905e600daaf31fee5d18ae0bf196491001f8f03ac9593e7aee7e0443b6b0221cccd3f7df461587fb2ef23d3be2ebed7b83fc9b4e505540751025fe63b5c05c9c02bbf8521ba38ce6eca2ccdc005b86bf557b73a910226f8d6fccd6967c3042dc42d6296dbc29bc3e91c06ff9fde5e9f2cb60fa860625d71d7e8d97a7e4488f65604aef41a636f8b52c3611f021facced0b80adfe7e23f0bec2cb7d73519d87f05ef312c8e5a44998089d0378bff12fa8e1bbb862eccfe93a4b43cc4d7c01dbd08fa31371743b9ac7b7ba73e05b7f0bc256a935e04d4532ec33c35a5e5b1ef73da9979e8936e3cc7c1625b9e096b7a8de05062055e1821af3a7aa3b6cc9895ec40d54c2ea28b5f73e69ee071b0fbccb77a75276a0a95d85b9f46cc9f13ad2758fecb89b76e8eee74d6dc2aadc8d060a87ee9c1bf8438c15f6b8925629b804a580e847997a406307fbb1ac0bd728be59d082418f35b9faee4fd1dcfe6d85d15301deaed1b72668f1766b59c491ece06be72c1c338ffbb72931a63786666acc5d0e17467690f3ee6b729ea67cfcf787963d51bd7d56ec00f2735152b02febc60d2ded370fa8cc28ee01f3589258726d1ff6a8668ee3c1143236b7640b3918c9be71831db65c2ad587ed57201520ff587c15bafb57e84e1e6fc4d19a9be0d5d5019ce873ce89d39cd7cf8f524a4251a2e04072c88ba58cabac586235ffe4f3b5c8bc0d3c2a7d0311b924d80010e422f108a230464008110e40101d9a1889c52dbff17abaecc8fd2839b9ddf538b75d49b1e1a4a69dd8f9826a2d0354d9f29e56d8c00d398e7a1b2a4910c51faaa9c820f95a7442cb33b1ed96c461b4f517572bed524fe96ac4b3818cfc17a2dfc1344080640689fb60984862225748531c0957134786dacd00da2ab13821cb3da08f45469aa500bdd654df93576e7af7d4e80489f7781f1f43c7eaf98b9cf680ec55c4d93f9c17b8a36f0a5455046b110b60fecc44a291c03f791ee206c4ad518a2815bc3a5c9db0c1ed9808016fff5296d85a250823edec2022d67f9bf52ada441e8008fd14ebd89ed495985dfe8f978b39609bcef7eddd33a87fb78f24dbb0ee4a2313290e2cacb88392b9066f85af67fb08791eb7679c842bcb54c87391a2367dad5af7755a616ed2b26a4bd0c5b79b20f94b24875847d67ca56b605bd9329c841125f92e0d22962f87ccd95c9b5bc86a2f7411d9b283f8eca40459839427f317399736c20e17708334084b62385b91f59f44198c82b1bd9429692b24df1bb98f1912b94603aefb263ea5794ef8b71458047ef47a0911fef8e24a15a54a1cb3edf5d03d40294d53e32668839f31817985c2640d050d5fbf8dfc2b7aa9485c28cd44bcb62c95f77c3fbb44bdc6b87de15098f3b6895c79b535c9c18d04537bdc3b0617948012fd7725943ddef6151debf76d1ebfd993237491432c71b089aacb7b575d03252e2254d3eb633076068a8ac3475ad53cab7f1c4381d8c47320a551dc64c3b0f5a2f18a5fbd0413565c8c733c1ee7273ca82bc774a0913fe1b01ff2d1bc8058b7ba26634ae7ccf9e0bc63adea305c7e294c7fe6f5048dc0fe922a2049dffe9587fb02ca2d0fb7ae7a338f6c99267d59c6fb6b4c3bf8b50d1b0c0ad164f973e627339c0fa5dcb0bd99005bfdc5fdd223cd1c5965b48459e2aa1b25ee9e207a949f0275cc46dd9588512dd988264a552d40d99d86ef59754654a286238658571db464f182027a82f0d19592c50738fa2c25e0434bb2226fd943c227d6a04284515b55c33d751dfc9d620d8d95a1cbf05cc07288c82e414e443cec2d78d466ab528dbbf50507b015e1293538278867c74b28469a601e516280221a63ef275b20e5d339baeba8a281ab662a3f142a98966ed40ee82482105692be64d18d4acfb6b893faaf5b40bf8faf725887053980814f602c5866d094f2a2690e703f8b6abf0a638c90be0c82f621c28053ae05500b0b96bf80b30e90067018a20504c0e3706ead68a2878d5f414afbe90912f1864d143b41e603f3ec8c610645a5720e54485350a02c8064c3e7eb6f50d9495a56d49960bc08b1c1169da41dd6527fc31991516675513c38c79a24c709cd6b9acf9a4bb2f02135e4401397ce049204d1bd359c3fbb6624bfc072a168ac5109ade8ee8a9743755d8bae0c1a6f8120467b2aff3389d00d78359f12107aa1475d97253929041d2d89bc678b5a97088516e611b61cdda3ccc42efac5aa1c79125f1dd2310fe3755f907478969b5366e07b6d7fa466f8bad61f110eca237accd46df4c024d4946d3b25151ac8d9a82f2d5d6408bbe8ba1932726a496ae61a23cda546ce0a57bba509bcb6ea83a8e5336142d94823f4ef8cf231b0e60d0a94499e5e900662fc1b304199d9c47744b4d00456f627448f398d89113dcb4d841d51c90a360df797b08c9d7df4526c697bdfd19e70bb82869d9df8d866f015637cb77eb30c94372c62fb0c199b719f05874eddcb663c99baf27ad67045deec1ebae1295e4c3483e5df71434c0ef05503e537e76d4142565a168d719151bf773e5c5760bcb3046fac510508505bb2f362aaacef4bc5f5e410f3538d01af231e89136cafa5e88403e694a388ab471a49b2a543642a0d5ac039c5e26c5f4f7add1b3c34bbed6285ad150f3261e9f63bbcf29b7ebe1ef5388260f6780af0d46a7fd9116f5e8ec63e9974178764894fe885d58ce02adac9e44d40892e56d602f8189e43ac53e30a0f495cb88dff12bf4636411311a1fdec0de8eb60a1d6f74dcca54212f4efe05326099cf64c89452a4c6fb0a57ccd3ae54c5b4faaf468ae8b4c33f7a2816b7ff32dd27298f42933a527d9a8aa14a99bacf9f5fffca902031c94b57e907fb18eb7048b635a84530837f635b965be356ea2a40eaba4e81838ffd4eaa96f3ffb9ec142508ff01ea2ee4fa2e578171c59556c96f3b6630abb85fa41a748f891ff9cf0ad3968a6604d88c46d959bcd19b3ca79cef91e37cf746bfaa8a86d0193f3b80806ac86e5da6d6aa552c3660fd7c11a17c35b792d6fa2cbc9cef73af25e9b03824b3f4f56acf6fd812ec5b0c773cdd78652a7cfc628ac257dbee3028aea2b722348a69c1305625c65203aa7f875078bc4319075f49f0d512bac173cec0cac4b747e4a45fc7aef84e19773ec49fd3e4e6087680a4280f0fb936319d353cbaf0225039f41024310cd280197d3565056b98e57d6da8167ff15fb3299d92bdb27bb552de641e0932dba71a7ea9a9439f011cf26f4807992a4ab7edb909af0a570a855f838e0869aeae610b3d63c282b0ab6531252bcc20a0163fa91f8dac4f6a735724b486d8e1621eb5fe810be9760b786ed6179df8b9685c5af9e725caa42e509493d1536f7d68319233d9343c4c5d38099b5309468864c926b924d0a0811ec60167f28de787a013f43fe2667aa6d2f0e2955566ad77f194abbf64b8016e2b7d68843702d60e559d48ccd6cd4b7d4156b23d49a46ec9766d0c192c8fb213707d86b67ac7f78fff4b037d31b3779e2897ddbd014ab2eda37f7e94a64e5ebf6e151914be1f798b518d283e46b9163ca0897b5aa0a9b41141505675cd1fee5cb3057154374a40b99dc6cd4a93b8b5807f2ea0bfa1e7e98a4dd45fad17958f28ca942d6debe2ca0894a26840d982e5dd04797780bf1d949d869e080bc6530449f2572870575609f8ba6ce4a3e60ecaedb6b1fe1f3dd9a0fa586ba8bf89529a27847add1b33c408047a06967a97063e312f35dfd71aabfde01301862560d6a8e222ca38bc3ab9db8ef050974e7e8f05fb164dacbb0667706dc5bd2459dbcb7e068e20ecb1b8e76fa431cdd28030d1e7d15f0fc06f835e3d904938cc6fb702ef581be136237773120023a23835e991c57231480ed94e11691ed8538a89574aaf9a230b8ba68fdc40a863bee5f77e912f153b2328d8db4bac5fd48a51456a4d39f4458626ea13cc67b968e40d034c38941fb9b28b5ccae69008f1d7f68a7441be06eb12447fbd5692cd9bb3bb0930ed3bbb0e388761b40650230b21b3f922cb4cf1aa0d4035fa5cfc6fbf1f24fed294471dfa7dbd125b5a0c5108df9f8126b3922fe6167afd81b02f9640c9972ed261651f87453a619784f4a84f39035875ecbf72ad0e4c4f97b4b9f4ec05b7e9ec0da722891dfc7e520f30d328faaec330fea231e1082fcdf9d451997663249fcee0834c181a7e45300e48deb271f6c0c61b458fdcb722bc078aa4de0f6f5f43f8515f6a0e2a9afe9fc1e6885eec10853e0b0ff567d4d8b167bad9e539404bf26b78cb9a134d1a3c76773a2621eda1d18fa574bd6cc536b020035783431543d17728ba6446ec8dc8a7d63898bf1620605e99646873d0f12d3638bbe7063ad9326dc05b3dae4b4785daf0148a6382ee4e85dac9d5e261581078101d414f4627f8ef87de2f6a48d186dc87b52b68330c2d3f8a94a5cd2e6ff32ae727fd4ed0789ffd4051e455f43bc91a748c2ab3baded005bdd1292e8cdedf8b51f76ab31c4388a1837e0360c007afb5c6e1d8b782068f3bc37a26c790cdf38f986508665cc68bb3014fc5f378c0592de4ab1e74f81f41ae349589e0b89b9d74d7092d0eb4e1aed70e74d60177a89373e1d20c1b42d6b6a1d7905e331a5f7c23f77fe63790e18009704b034ff5c31215157ebfeec2d31a4bb3d4c3746505ca7e5d0c1dd1da3b5a3a1afce407e342625dc8e7decdff65c7fd538ec45ec5acb5aa6b49f0b90e15e109d603272df52a8c38c13b6bc4477814963eef463835977e8686d46ea7fafb4d246e6317e9cd5066db84924c7c48597b2c6f476b989ad4266524a9034dca60979b0ab4f9efb5f045a4368bcce9de9edb22263c85e89424b9c399e97f2386b23707dee4f23441598d19d4a680ca25f14e7e2755d79bd22f12311c41b30e93448863e7a59aeb21330454fc5da22eb0b403fe6b53a12f23f00d0e6ceb7419af06f777f442924d4b92829378a6987b87a55c5b2111e422379104c0660f327f1accbf0093b6b0bc2358cc6f4c3fc0221dd6acdd204fe379c34a8d270047fb0ed9e8e08d85daa1de2145e70ab1657f7005f74d1b77c4ee828b987f5f4c3f5b86087a8f2866acf2efee3894db927397307c737253b0a722f26ca0ae3cad804b07654867d9a0f0c2d8ad9c388612196bdf781185f366a3c59736d83f37752f72d89611bd2b5666fb28335bae99962b139649fc1a72bc498463a66d43be890f9821877107ba09e3cb09cee01cc0f1a552fdf7225be874239b93c920c25fbc776dd87b1c26d83922c191023aef56db8435cf24c4ac671649f1cf5fe852eb67f65f8b3c1ca96a17fa4e232b186df6fa62e9fa9f679f1d4414fca0601827820446caa3824996db542c9cdcefb1b1bd2f7ce05c8d7736c1f9c17dea82eb7392ccd544670307e5d6c68bf6888a958821afc2d8d18395fad7167c7b559e04fd76ffced3b0379b3ab00174e5959bcb639961169320a6dc85304e86892066ea31d26c6149dc95f795b8dba43f45ab87f4cee12aa6cd1e159c15d2dde2e0c9c37f7af66f9a5e5e1849bb432b8e25379778377399cd9de35479793d07e0b08c0ecb5d485d60bc85244b87ada456573f61fdf4a8f1168fd25ad1abbb3eca734aab5fd0fad71f93edc4b61ff95702978af2eb98bd8ffe350e080afcd20f443a2aeb730f448820d3c424a1000415feb2ef941964f1b1a635bc0011aacf3bfa980fcd82059dcaad6181bc18e665a15fa5f28c667ab55e730ba3439be6d69b9dfc777faff4aedaf6695c0d0547d43bb4d6688e21d8fedf2c7a1a4334c0ab3feb793cb14037bc8b6b891061fb64737d10e543fba235b63a90d9b9086e8094fe3f2857e0f47caf019ff02eab92ef1b7d9c81076f75ee915ac888cae3a47707665cb9a01697aa2491e92aab03641bc766a155320e6854798df1aa4e2acbe3df65b995da4d4d61630a132cbf2e9d459cab25580eb0202f95c55f0c5cba1d3c7d3edd94d63bf5af4149162cc3dc7a4606ba958f17f582412dfa2d0c4fff48a31b705f662a5d8b1321fb912168d2af68bfcfff142c799a77740176cfb0944eea960b5dde8b5c237dea486b259b78db74f568e80b643116e9f5ecff25bd165b35f9cedf9b7cab3bf2857441a2aa3ce19ff2acc2643781a1513a30a7e4c774f89cc8fb5ee2a8a4c30e7cb503e76473efd35bbf1fca11e42069a136c9e67564a2c6b95521e4ec4a1dca5be40502eceb551aedb70f7bfec72da686b1bb42a05b2156ed221ba7b5f8a5db2fc2fab5fcdcb2e60bd15c1c7cb25cd10bed969d30a84146ad349b5d7496c4370add2714f33709cff31d09bf1424348d673a6db6ce39b03814ec7dd40b5ed919ff3d0cbc2e3fc255fd7dff1315460d12a1c8ce9c53e3b1d95e1ceb0beb1d80584c32c42e207b7d3cc55f35b9c5bd45e965d452a203af20b879a250b08fac451460aee03bc137ababbbbe9f291e9fe0379894da4c573168726782174b4dca257798cffec0f813196be8b294fe84a8889e8c3c54ce77f8c763285e2e61856058a0a92e49a82f49135b538d5b27daf50664a0e11bd3548df0b83e2dc0629beb660612bbbdee4da4242321093dfbc5592d754e64666ec4368d2ea6782ebdccb49db9b239642ed03abc855da0e82a9d128bc872544356179188e19068fda06657b6473baf3eadf0891169a6fa21a79c2568f295c7b2eda3b709f92a2e71a4ca4b62fd46d4fa560a32b2f0da1048ad740f31e2a43c02413b84a7ecb95517c52a2edb002baef3bf2bb27fa26606c0aa44f48081e1cb68481b063113b0c638ccf449e9ec6ef36c03ab6524bb5ac48d67ed362e22af21f0e8b600f0b1fddccd39b8518ce9665d869818658437beed79e937bc4ad8496c2f47b2cd7481ad812eb6d4723afa30654aa56eca307af95d413494fcd28d8a99b00bcc96078b22c1571bb213c1a69046edb923135edc7b091b7ed1811567893b1da9a8b5cb91dd7bed3baac9d446fb175b8381462d4235f4fb697dfdf792c68660436c360e2b9b9a3ff62573bddf6df1b52fc6a873f0a6db213f4797395d660bb98d07e571801f2e0c6730fb3185c4e9115ce961c463a4e118c37f8b920301a1847fbb89c48a5d603e800163d79d3197ee9d099ee704410ebb9b5cb8bf1a9e14c23ed07db5ee3f0ad349e3c4f2bf153dee38a98ad57b327b309be291e8608bb285fe5408ed210330f0a49e8cd0c7ac93d0701fb863b4dc5330d78aea36ebf693fde74a5b841cc7712ca838f7080175c18ea46645f5bdca8558ada75700dbc995af50bc98d8141b0abf66daf8f1fb0ff4c0906aabdfdf80f02bf37369f31b15601aa5b0d2a90a43c94839b084c8a483e5ed8283ef3883980b1643c1b6f94a5892743282a50116f887db7ace65c5efac01dbb6d1a995af63d6dd15d17bccb8fe7b5e483cb90cea62eb70e866cfa12305372ad8ba9e9f1d000344919da60e4cc9ef5c7c7938a7b69fb04999bafbdfa37d3ef1a416a1a3cc7eac02b4d272fb7fe03467a8a8a3e4aacc66d905626d67b7e8f2c5d62de353a3e7b4feed2c0418d8b6b45f92f8583f6c3c59d82f5594eafa1f1800585d962e42877bf35c0e7df98332664bc275f94b7967f0e705822b05dd40085004dfddf9b8742a268a6d72e4dbe2d0bd38eaafe0f921b58d84f8dccd92e16110d0378da430b9c67934fb8c1c39419a454f39fb4c2691b7998d0ef6e0151114afe982d00f46cd5f64b42018f0790dd9a87fd94c821a06f2dbb122cb1c269e242ad9e3c522d5f7e7c22df3ef0f4064550d85cbe14117cd5f14c2d18d6a61dc5af33d9afc015b83f2e842b7334888b1c207bc7f411814d2941ad6b2a2d14fc7ddc9b707f04a82fb6cef7f8260433e1482158136e1de5f3c1f4aefcfb2585ecb7f77b0ee81f230a4675b7a94fecac7f8961300048d5451781c9a312ccd46a576294bcee147ad6a93a2a20e28e98261b71183fb0d22ab5dd5b5a9c31d3c3d96ce726f2464a0704415885ad034a68941213169a1835f8216bf87a3d461198e67a61a47630634d4b4cc03ed1f2180b573f2ab231bfb98ded45b6d074b5f8ffb3694ed65aae173ef853967d93d457117a41008f7c13322403931f7d46a6ddc2994b162548c7494c285b75f39615f6cb37ed3ae9950c5f1c810cc1d4d42b0f4624217b5ecde005c370df8a85a634f46405d70ad4ab2cfc20fee36bc915cf1e3f6b759f3452c27b964dc044a7974283f17444648c259a0681b15215b9ed43f2547fdffbcb5971ee3002cacd33bd5064171bc481314ab12c1dab3280c88a7350087e26988aec937096643a5e56ec9a53565262654c3dc72cae7e51d9aa88c34b109e8d42bbb37a9ab34a66f2c42475689f628a0f88d1502a8e0dd4c126cf90b10aed9f65923de49bbdda2be2986a8fc7489137f69daa7f12a66624e25f057719a700e3efd359768baa805369ec2014423bdc986eb539e3693f648f9dfd5e3b7f0a2777def72cb1c945895ac2cd964727f8e4625df7d199288c4b381216647f5b32e18370032aa1d93a465944ae5dc3924457e5992cb74f797e6a6d6f7d4bb0aa76aeb01c57e9fe90ca283a3461da8834656218a6ed3f9e94b92da59bfb71f5960543f6e24d8e5d8e10686307f9a54d976cc4d434a4cf540beb4e82eb7207312d1be10609deaca75a745c9cf74564dee1aa7906f58f9c97af9a46d690ec1b2fddbd084cb0063cf8f1851dfe96a72c0b2930ecb6b0bc41a798f7a19adbe837c3b65c740cfcdab48c2acc1a0cc9cbcaf08a24cc018fac6d7c52eef3d4ef78110368fda8b959503fb5946f3a81b68a87c76b13a933bd8ed678d1d9cfe78507e58ad407177e31b750d67b6e7fa7cfa856bec1d9c255e584cb5d2fa2734413a292337ab5e1d0ca140884df6ce88cad283385f3cbe7c2065c058af6d4700dc94b86134c4837827b3c2c749e68f2f9eba4e478e1d3a9304b7643a7cdf7f6a99e24a361ca0f33a27e7eb52941836e6269c0da14caa6765898cdf438a80d49be976894f7fa03bc72c4a710c6f475b1a454c28dd464e78a1f0b1098b958ddfadef4c7cd07b640c8980e92d8323c87a3933eed9bd08ad05749b499e76aaeacbd47d0699aee142da07918c710520695335d4ecc39b42cb9ad1c705c8b633fea5d8c09ff7cd5a51eb6c128e19abaa782783604d82a805a7731fd157a8c5f1989b418a80c85120ab48b8353ff5651e2b7e0998fa4557465f33c00bfe03b34575ff5330a5b6e7da3cc7e26967026df4cc181363b501408c27390ef849e6d43aa3cb01f1395c09d74459021c1ddde76a3eea63c563c1ce69c482aeada84906cb08ce1947390d0665c0be36eb93ad2e694bdf73b4e3ea2e14d42a433432186024d45d338c78466676afbef89f3687f598f0dd0bf6bebb8a90527d3fc5fca51a206156cb6b78ae80a32e88307e9cf4fd023dbe7a12c4e9f849513ecf82fac09dd6051d2837d10f3ad44fbfc1d576bfad2f6d3a1be256f241c6bc41d975751586550ff9921509ef5277015462423ee7b4ae90d7b9e4fe3336c5efc05cce9858c9d2813d0d0f5fdcaf9092bb37221ea59514597dc26d3cec892eb56b1bb15f1162f88f2198369ac1fb854aa7dd3f2c3b48e926038efeac7123dd17becf90a5747510390ee3426cf59420c966dc67229fc3b77b1b6d3da072060de31849e5cd9593f79326c2e3ab2571083194be194a5933232af687b51294076684cf810f02e1389dc62add7ee950b1355e5e872f0472e6b8ed321316d7ca29dc832c9dfc4d420cf531f7d8f59796e3f2844fe2380b7743181ec80e2510e98bc5da49ea9f71a7a0d6d5a0c09536e9832431e5a06c7255854389b2101476008a323882917f484be00ea4c4313e97f9933ba0cd38af9b8120e2a95238f742bf914eee0bb9a80aa5442505e51bc91fecec09d09cc4a793dc20fa38c2eee19ea1a3e0b55e5eb2021e6d022e9e6fae0df0bbe62d7f2b3758458fd2cb86d5b4c4d6a3f5bc92c282367e63da142b19b1cedf64ee540af0d776a875ea2045cd10b6db192ec581f3597419fafc18564f6747c64bef4a246f31af28bcfcfe27819d24c253f08cf62009fbf4efb3150383b7e0baef575bd6c66cc7a8a1b84ca407a80354167c322f7699126e7a996ef2f695db6a512686c88dfc15506c57db2294c7219c0b9652a3ab845bf9790902e5f5ff2274f04d5dfc0d9aea02724bdc36d1dc7bc7ce0a6b47b749879b56f71d7ca5e27b5aca3e3dade56ce6deb5555bbcf950fa971b9682ba6e55b942feb1005db42ad4ee3ef2cf068da224960025c3c174aae020f265025248df01ede361491832befa6e4e188a9eae7b7bd3a800e2cc50411f6fc87011b92c65aa356f14ba9364f5092fa35f35b41d0d4beacb1580461c8742cc5f8fc47c45ce0751533fd097746c4dff9cd30c4f8cde83c9905e60ed059c93bea79f87d06a9371eb8970524a3323e4ffb14c782ae8b6636682a9fc6584eb801600342c036628eceb0d2d91ef6f0cf624b91814fad6ce772285a1183fc10710cb630fa93f461c79f810a27e57b678e4c60cc2c932f7d8309776712e1012b6ee5ae1ab645106cde7329282d501c85cae66ca58579077591e9bfd22ed9f073b6f8a9c0dc6e497adf625d15582989e3299b760b492c80d5c22b9f08fb3f6dd17e1f22d50e5dbdb4a3d25115e6e351183706b41df6025256a0190f3f2129f25dbc4a6dff02d9c820e37a09b571437a0d390bfbe8f3b266822c78fa406675b8db0a719c31f1eba1dee94369e8a4fa1e83697cfe3cfe8616643f8dc1d3a4bb6092c09c0f3d12ce41b1126599d3ee624b9399d97e9d3f55c2c54c37fd6ef66da48092e1b1621f620dd03387dac26ac49baf766070c9745f6044e052df2a84cfffb5ca04974a3ad357561f4353d779976b77669174f4d55bf838ab816a1a3f50e414cfe373e6dd8433f1bf0e630c1d0156ffcf71bb70fe8e7e20775f9f57958bc04ee4fa65be3deefe495a39fd869819ed08232a0c4d000ce172e084e0704e2b3305065914123e355c969ac5437c5140b52b2ff0110ce37716a755a8d57087a0db821d2868a6f5b7acf4a468bc22b21b1376519ba6d3c4b00b4e52419446021d4d78fe86408ac4f65af30f488da55aab6ff9670b90935d63b20f39b6172627d3f1e708e14cc928cfac07ae03cf968762f8f07efc4e7afe4631ccdc499e6e2ea506088c8a9d7a87e14d27b3a74975e731f674cc1039b5b3091344a7d266182c0dd027cadd3e8dc2d20e86d857f541b25670caf6bb388d32c5a2f09b72818c0412aef75ef84584ced7e2dc7bc25a3994443ff20928b049f9c7a402cb09aa63d55dbbda335fdc35ceeb22e4d0fa114dba4de5c840de47cfe6f98d0118e9bf0168a4a3aa7814687e205bef4655d35aa3fb7d3090a693f34720c40cbe069a537985a6c011575eafbaab8d19e4e98832481d3ef50f04fdcb2f16701522aff412d208bc1e5b9ec3548bb6d0172882eef5a956aaba6815b1bf769a446b80b6ad79573135fb9409762450b439227ab987225da48e92a676c1235d25331e8cb62d6238e3aeb91fabeca8fa40999f0ffefa4e9c53807efb33269ddfb0ad694b8f1484d1ebcbcb1925300c3e1fcd71e6a695afa75d66ca070feaa7ca357b032abcec221155bb4d1407023a869d4a46742a0ebd4b934b1b99effb2a27d072d5fbae2f1d09bd978bfe0741e165bcc7dc4ccd1a62dda7fc1d3eaf7a70c37e747bbb9638004e647b999e5bc3ad9ef9fbfebb631847971cc5cacd11200e6bf5f6027ca8c2fa3e319b6cabdc5cef0a56ea6ef1ad8a6d39e3b740ed6eadcb1a773467ac58c4c8f3543b96854373ada5239a318876b07e1a7ac5c1cc36bcad036b8c6af51314cb346a794086db40411d33329414a21574260cd46f86b08b18ccea6547c43cf10da41f8818de7af63763f063d860f105c73b1cc2d7faaa4c40b8274e564edcb80c0e20e13719703da201140a3212df25588585f959037a1178c37c75a4eeb5efcb96783235b29098cabaa93bd3ef1b10f0e060a0f0ce866bd7772fe6cdc343c56165b3546b4bc647bc7644472fc183d500ca394c3e910c55c18b4645d818e67de4f67ea7f1c5ad42e06f74819957f977f4604d124fe23063707f7a5be0aafba22f96bd408afe4490355bba03a65a653c6804e3e9518ec639c63fa418dcc157d4b88bac7969ec72385bc2c370e8b7e46646256583341f628e162db99ed11c4f7a379b503dc76c46205657464ce283aedb02308792591f4cf788a0ade4c536ded81be5ce79573667e050af9344c2d142d0ed56a25c3b726cd7cbd9ac5c5c2059e79cc0babdc57cdb9e31a54d2da1adcb73b02c63c74352edbdfe59ebd9cf7d31b4dfd2e9a13caffff25fb9ab8d39ec51b4774d4f1e60b8e8abb598ca5822ac242677adefff116c395fcae430220a0e74dc737c09899f1edc4df3886da7f27f0c95c9f9b17ffe794b07875af1e4517f4e6792a56a8f8ca3ed32238caca389d619d45e3b88f84f09563469138fdbd7cd7a7c8f3f25be1fd7df250d0746899b5cc178c3d2bc3fc92dc034cba0697df507e61dae6b659e604405caf3ba3daad7692280bb78ba3be12af4f3bd9eed36e87df57220f85bfabd7cc0cfaaae68ec2cfcf70f8ef2c5142c3b3f42534912c2304492acdc4c9037a809204766fd7e824aaf17e4800aac165a87fb4c93522c2f49932edfbc15d0f9f8cd6870dc81c39c69b284e9a056f5785289496b4750c7b005b5f474551bac952ff289bfa44a15a40ed89c3ce68fa1b40da789cdc384c6786b5fc8a828fff202b40d07ea700b3e189b2fd38a57e77dc16d2926c6ac4a0dbf1335da341925ddbffe9f2284c90bd08fcb63c7087d201ef6e6c7eb1e17863edfc51b887adecefbe11421975fe847879fe60ea8b83d5b54da37a7e2488f66e049e51d1139e7e25753745be1ad2bcd288c15c1b90fe8ecb496a51beb0a34004fdeb1504a9320163e8d31b3b81b0dc63be382b6a69705e070ba572d48d6f0e40fb81fef7e70629da9e20e1f9b124a6767784e82476add814cd6603b682baf785cacc7f6872fffe143e6382ff120af6ffd152d22ebdee3b177ab3206afc54359fc7f63fdeaa05c1f9fefb1799726d11ee5fec854b5949a01c41f25488d00fe3ce0693977e5bb42ed21e79104223470350bcd67c0aa5699d28677853557ee5b527ab5bc57aab7a98a14793a75d34a8aa806ad8226c8d7c9162490686c7103db80a730c81402f9e48142ee3aaf012f6fc7417aceea0ccfb49480f8480c55fc0a5929ae70d74ef7e1f33974e9354ad58fff68ae5cec233639d30e8d1a804510a8ca16f7229d3171f6173b85cb73718b32dd85e5095f0218101f53f7466e866eaca436853f17303df224a147bda901bcbc4b38fc7daec168fd89ca608bca91573a31f608432f9e0afe04b0e499f23cd96f1f53ced0c72692b088dce0531b39fbb84f9ce30e059d1c75836022bcc17a59d0e93c54695c3035de77952b1f7bdfa104f9d9cf38299aa7e6b226c9e613eeb0bd0794b8afff4ef70671bd5faddced6162a5a85677492d930005cf191df15b80798bfcd0dfb94ee2fb54229289d7a6e4c73acf76cdc32d284a2f3c07e1232042c76e72d49a5b7ae8898e709b5c80f3f82c65f565cf2f1cd35bee7e365554279ec68b3111929e825dbdd5b75fe6978bfe23b46bce9cab14dd5a6ba936613cbe13ec8f189d0b779d51b25e5ef5bcde3f93f9c7ad598868f8ec4cade4e0793b87fd22c841ee095dd5f6b7c777d57c33f700bcd7e2dbd694a61fed521bf40fddfa66d3217399007f286f998ddc2b986fd98461061a30ef0bbf2ad7bff42f9f228fb83919eb938f31f59191c70669739e8efef26b333314a1e97ea2be8fb0726876c6865f74e55222d22f8a29a8256ece4d01a09d7348c35d5653235ab7f3ced6dc6875329712dbe9767e420030bf8383f0c6969c37de4c536cf28774d683d128a4cf7759d52494a8fec896802f99a1509c64e973b8eb9ac570e95d38a75a534cb22e1eaa1dcccf6f8a90897fa12b88590377eafcc7a2e596c6636e7e71f1260b48d0dcb529fb41ba7baeb9261b54dfba513f34e42773af6f46e728ea6b7aaf746b086bdd70e72980b7e561827183e3ff24029e9010f02775321f6ddc5982ca42d92d45f31ac07a49b6fb87d3d33a471eba8102a6a433ca5ba7fdde57d1b29661edde8070d0da1cf8e071fb4d6a378f6fbad09afe328dcfc36b7200a56546b5e2fa15ded5ad682b4922237f0e3eaaefad0be7cdb69e4fb9005196450a9bb3c899d845179903e96db1970d34f8d7dea48747ee784ae9f54292e0d8fdcf205e8ebcd84c0e8b4d0bea3057d0c78b1a4f0cbf5001282bfecec3b024e19ba2f02cf7c668068297bb0d1a1d9b2fe7495b4520775b4f76803307de3d2dbd8f5070d6ef02cb72646fafefbf87d62d9c3e178f27f647ae0fe12abcc21166240106f3b9e528c69dafbc033d1f3caf08d17aa3bab6733bba1c43836d80a6a0e697ff6b5ffc4276ec4ad3816d3cb612999c97b5eba5849d5b276a8d9d64345fe02647f0136df8bf25b1197af1e27eae349ab6e74d1cdd472664c3f4c74cbd4b6d03a3f7e418da746178dd8db86f8a05ddd2f96caf35a25858c160203dae19d891861bfc7ce18776eebdd8552b70b45b10ff8ff88e037e3de71d9762320d91f92c0241d3bb36a22b21bf888ad516ad0962056308d24e8b85ed05db11c54d7233ffabbeb7718dff0e5d74db872a47498918e1205f617c8a7318613ea6624f5830668f7ed112967d671ba3b177fb1d2d2c0ac34547b4f9313c95bdb0bfa6badb096b34ff45a01f4bd52a6dc187b914c09c2f1471956366f64324ae1d8ed4a12d1bb0b426090c11de0f7cdcd4c3204652e3074520bcb40a2c7534b853ff1d80c210ada224175d96b70ebe69c1eb1405b56dd609291ee5780e5f2639470fccf18e0f1737781a5fa5915fc82d94ef7f713ffa1700d5611d35e988c63af578b355d8828b056954885fa9587509c34ff69a0bbfa3319026ef88351410a90e93975c59e1b3aad76c73f43034498c38457cf871b95636488a4750938a05e6da3adc4e22268bc4dded189982d3de1e80715eab76dd12b273e210e8920ed332683b0d303b3c4df479f1c7501fb88f7ef701a8205249d3ebb232226e616f24f534fcd3f6efa3fb25636362705e1620faaa8898e3022d221483bbecda76a34ca27b944508d4e25e4621c58d49d28fe2588810a737895943b75758fe013c76dd8259b0b71c34bc3a109fbe105714923639bca991bd1620e9fa28bfa1fc0bca30c9bcb71ad6a811e8511bdd019a4e46d48fd90c18d7eac5cf0db121fc2b403059aecae7452cd0aab7064773fe714b5e3db410678c8928f57c5d51bda370af7bf8b363eefe6da148ceb2840662266a59c08d66c447c8a7ce379eefe44afd013ba51754f1ae52537af12b7d637e518a1c433251db2e2b3e62dd6a1d091deea79088813b07d9bb9dcf1a11edf5a1b196d277a7d35ccdac6ae1adbda12fb6477c537b5fce099f01f1b836afe2081609826da65c1982ef1fd02a78ab4da7d2b93e4bce7bdc9287fe4d82cf4716904e81691701dcb17517d2cffd968948c4537d29d004e6ec39497f94e9b6472b0cba4d4457a310d8f4f787fce032f2328aeee67f7a80f03d8707221e984bca83c96f4321e9860a253516d07ab793a83f92248a7b70fc7889bcfd5cd0b25e0e0caff444f63fe1ab16ee2e176093cab989343347bd0e4d98135c533a414d03ecd3a97686a08c76ea96b36af278d472dbc78d44e793a6dfad695ea679e5a188b26dbfac890f3f718aa7dbd12c3fc69a5f81041d8d0b3c4d420d3eab31cdc19a48a7feeaffdff1cf2303d4aebff6b161e69b3f84511af7fb686929ebcfc979a269f68c64c5443e60ad01bbfd3771163e1e013ba18e7459fea67102fe2df81c321c576a182b4c14c7ef9a7cec818274c62f3679147b039b74168d54f6966633aecc1e2e5ab18f2289f43033a8ec8dfb7cf21bbbbd4acbc62a577e18489bfb711b00196378d9338a83921a4e019a944d061e170c6a2e6dba340f77cf4f7aceb7b7a9549a8654a7b2a45f963982f856d2e43d110c115796ca745a67bc015783e0c79b170c53e06bfef8252081c7c8c963f583421c7087e0b47908aac56befb97c894181d689a2f48468e85cfb5ad9c232866a4a6dea41f6292dce835d27ccd5b6cf5fd239f61512a81acd24dc96429200158d5b0a30ebc1ee564c6ab8e665eff4fe047f62891ecc650d27f9ff61ecc1432ed927cf75a989915aa1584fd5946253318c75b3ce0a4bad69f2f197a3112c0df3126a8d942643a644c7ad4f94a4a11391b1f93a59bcf64f4832279a9ebed406ea9159b85bfc75caee8a078127daf0f86c68025c6176932beabc84b6a92553fd4435f874d5a6d64cbf9995bc6574680e97534521f147fc97c3b815e03de7ec377b428018e18aae66563fd4f753d581f6974a63932ea7fcd974927cd90a0ee5c6d2e2de015f736a469f59b40307e5a2649b58ce2a0041520502014e7972dfeae94199ec2f8719c231f28d3cc27863dddfdc0271e1222c90c15067c03bd473604d44866244fcae51c28174458119245b04c0bb3728a0edc6aa34b4823bc86533d087484b40f6aff18eca32352d3d4aaa1974d471e81ffa3962b6a03d61f9f130348b31a125449d73fdd36855d19839ac83e29a8d689633a195365f7e4ef68d729665cf53555d5c809a0cdbaaf66ca59f7833f8d8f35033d08812617075171dc885fe9c9f5f27346402b864cb13366183dd3969e696406767e1d0045cc39e3da6240c8c8d3cfd871985659c82c5890ca18ae161ef5d95d7c60000cc0c22966ef672f1d2b364dc5fd7a408adf193e00d94cb2eb3823cf9b01b2b36bc0b20b0fea4313e14a7a80e161fed53c7f07210656da72b074f8702bf36395f456b84ce29d5d2f3787e7eeff979b416f8cc5cebeea914ebc492abad14cbc886e5f43a8a0056280be8bdfb83cf733cb8776c1515c9c8fbf7f35cc669b338f79349da420117bf59102cccf2a4af2ac843d5c71e96bac9d78f8c845215194a5ed7d70d93573c71117fbd633467205ee56abb06d750b9168c9abf91ef8faf529606e6a90ac1447aaa4363f70d807414727656721a039c73d20741802871390f040a19c880a07e0166664e492f1e377168b55b0a4db603b887f66b7c0a36a1d86bc98cc107bfeef6860be08d87c457205f777cc5006848fd4f4ad7756d31eb825d3bc9ef9126ff90b9d209f24de318dfac859f98a840ad621840beca847f050500a0c5890baf0fb2734116f67277fc887c875670e0c7e0dff30a85d8243aa9e4784ef188e8d514c680ab752c142b36b176c76b689ad6ad56b6c8aee5317dcddb67582ed5ef7df6437e6edbf92b589af698bd43fd51b269fe931c4b4b4edf5c0906868f76037c5e37d5d9166dc82664d437ff9087bcce0b966d2562ce3b5a204367466d8028ec37758edae68f547ab6fc7f7842c9d6874bd2898abba309a567403f60cb0b75249786762545faceb8a0799b43c53059378f2bded9604adf243e4bd55a4674d50dff991c886f8327568c4be5f9609a88f8ec5b635e1dbc586b184838b345cb63bdd00da98027bc29f354a508795d586264360dc968d46056ee88e6ff054b5e50902fe0ae6e3216f5bda226e860e72ba640a1c55e141880732bf0adf4850a7be22b053ede0169f4f4525995b339120741f185ab8a4c6ea80566119359245fd3ded6b26e064665bcf1ebdb48156bac9f652430f405f89cbf9ebba19a78dff81fef26fa848aea3b33e37140d38202a874b60b409ed823a9b85d757a09ba8fc832dd5ab41b7174f627e916257e02586f9c29e389a6dff53e952f784ffb86d1da26114c0ebd2259722dfd6940d2ca42e4bf6e2b215d96dd3a33e2f885c71ba34753e4d88402caf9d347eecef98335204817303303485bb0c69ff58727efae2a048335910cd067228fa622bb35944cb8c7792fbafda21e4b3d3d7666b8e471ad08ff4f5b1117fc8c0fa138ef4920066b1edee2e83e67fc86e155127dad8f38fd702ec9a92391bcae96f5f19e5e31ebbc095efa99c250dcd0b052261bcfc11283ef13238f129ce02cd86257e25403a2cb15d56e7402a1f0ff40a3cd982079f6b1aa7f85ab5f10faedb0ef5bfb6cef3a7e2febc51ab24c1ebc113610984075710506f83c41e804247cf49045eb4f71af344208f9d6dd320c819a4a87b1a9aebb717c6ee8b36f0f1c325af8714615777c90cbba06ead35331ca4d5cbba06050832387e051ba782209c5fade1c366dc574c028d7cd7ec85677d46a6e8da612b1371c7acc45ec340c66c0dd74a0c7c62a805a19ae4dd949aed3f859e11d1d9eaf5c4452ec35855cb3621c8150442c6dd22b7c8e3fb7c88495fd959d19f0ec97b1fd5bea1bbdfcf6f67ece345ec3d53ec9e206b1ea989f37003c1fe06ccbf348630b583aa065e63a3ce7b651b22b98a2cb6f869cc6ee301f7b26a4b349d5f4e632ee0b83b4d410c1d31ad3306512731ca9cad89c8ae8cad2e3098fe31fda061f71350beab79eefb0b5c5a003ea39dbdc28ff167cc50c03d2bf98a2f61e333ae7b2ce0b64581ffe2e9f91f5ccfaca3600a298bad56a98b10705ebbf869bb67933a9a160c425af8e67cc9bd7dd92ec3e37ee5bb92b3e3088eb5b32b2e8d9db236f6f36544dd077089a128cdf9a06db50a802b8307f2fedbf64e90b454ceda64403db7c6ed7f00bc624d50ee8f5e9634750653b6f81f5df8b1ee53abecacb70a357a977b07ee60a21848e2e3fdb3c19f1fd5b634e5d88c6704f5bbfc334b83c50402895ca819ae61bd4f10b111ba70837b18a480ce5cf2d0d1e9e462000cf0e8abae565276b13a6ef9f043868f6dd188721612835fe37d4e22ced22a953106145a314390879fbfd4e6bd8d0ce4d81ed36ef7382408e939cfbbb90f5cf7217a43e348e3c7aa288e92dc2b79876a2df61b6647b82183c3e77bf397a8f62d78cb9236837f8a2a1ba9e82dfb2eb9431cd8d6a83e999175323bbb14c92e6205edd32f78be4800e5a0e7fa75e7a2671cd4353ff4057453b3bad6ef3be4aefe443480cdb895311d95a8ac50064fc342793171249292b01949e634789068a133e692436f7b900471fb1ecb1251baf14ee1611008eff31064d385b12bdfcfd952115290327698eadd4a4d673d82c2c7e2db24b114f600f2a1cc272f6b369233f9cf3f8ad37fb098dcedbc7b971eb0b3a1e3c7b669db216186a5336d0b339dfb4b532cbfeec3ca87498a0bf30e63d7a9fb7cab99f74ccc6bb53dbc234b8fd88095442e1d6ad8f0a62b72e1e99745df76efaf8d58af1fec79f48e9797ac68a46797f08041bb4d1a8ee3ab82bbd233730390e8912dc43fbe7d5ed43a38ec12510cd48e53371fd1fcc383250803b836399d951bddb0b125ccf6a1616a61a740f96ab1d875422f4bba046a9d209a64f171b34fdb87d2a5f258ca01d6cf0f3b02b819edc734f46a75219abb22b04bb5b6e6c7a1460dca4862c96f4f206ccfe2cd76fa81027b49836f16f6de2ff282a4d92751b8cbc1e98cb91113563cef18b0a333510c5dd051a15930a0b004a2be52eb64549c5a73462047b50ea34befd064d117a47d2efe1b59f31569d1823d6af8519972e79e80f1dbbae1df69b7b441fa17ade0c59d1028560508ee02237bff3519d097549ec9045d552f59cbadf6ad57ff959da97e612b9e57b6ddcfd0656b3dff76220bbd3a51dc9bf72ba5412a2b187c24cc909eb33e8f296ddb4950465ff51a86d0da642b32d6e4dd19b3dd9b77c77f16fd963037757f84f880334179b8f64f8426f6dd75a6880b44429b26e3dea865bbd0d47f5ef27a80fb132995aa105ae0fe5204e4e6e93d88dfa37652474fc17310dcd9caebb185b38ef52c7167d972ffe6eb08baa074cf387aa0c0f0690890fad953a40e5f776315b87da9879bb3b905a6f50da18bfefd49945aca988917ae6e026026ef91e935946ec90ed0510c7a0af465dee76347e5fbac795b1a66477c671ed4d4c0bc15a3e9440e8b12c985bf18f853eb4981d23f1260db8e0a40483ecbfcd203b3a8cedca4ea928498840c418573db977f7be4c30d910cdd91a57e3ba116247115a7cf40bf47773243b44f29aa7bd2088a66a004fc33a7fdcdd54f9e3568697a697486d1c0b618264563128b9d7ca169b0587a9cb4e182edda94e331c42fc9568567e8621ee071e5e5ed6c432cb13f924d2db2406591527287e5022b8716c2bac0d767311777c19b01a53bb90ca85d13d15223b78b1dcfece8a02ce6a37ffdb76852fc1174d6173c20a4c14f61abbb932e0dd1e0632c6e14d628429cdd63c904144bc11a527adec3a1c7dcc56dc2b3d895e1e9770b5a8b6352df7b715406e4caf55411734d5da7d13f4c58136271507fb3a2822d91c2278611d0c33ca1e0be8bb0756323a0140990ac14a12caa1000fa62432c58c408b15c41ca68118fc09df7d16120182a9492fd7192ab855d611a846791b449df16be4c290a577ad6c6a94ca0d443ea89507965d2512f6ac5f35854c0b5a07e54de7e36bb04ab0c38e5e866e2c4bfa9b8f1edb42065074ec46f6e3a7a886b8a72b56e79fa83c76c010acf5d7f50ee1acad95e3a4c977d460f6d26cc4d72f5a909ecd5fbf3bcde3e22c784828135380b507b0487311d371dc4fbd75f59eb18aaa4c3d65ebdca1159cce9a507cbdc25af10fc5c40303aafd354a401ae71ca0dd6d9a581b71ce6cfdf01685077337f80fdec5d5fbfed825a9c82c258acc448139caa056b40a33a9a15cd82f5efd5d9049380109f08debc43b1aa2873ac7d585120d20ab7d567b2713342afb7a492648dffcc049ff82a6882764f9ffbedffc3c3c7ddcfa195e79fc20da63462e42ef1fb822a8d6d480d33699460e8ed20974001e6db8af81ab22af7bf83bd261731dfd6237c22563f824595867543a3f8c8bb8233364323be292565e4912cd6bc73b50cdbcd0988f9e24520d5684bd54cf7ca440ad57f21adccbc65a89122978746e1aff2b2c5d8a07f323ecbf2d5614ee2f8aca46b2d20f93fe0b14b66e972022d2ce00a0a315c33cec1979aafc7d4cc69fe0c2733d9abcdc051b2c5e666b55587a333318d7c9159fdea04c7cf260696ca25ac21d11a3c6cb151beededbdc2295a6c0a1337f7b6d4d302bc906c664bc8ff612227bdc806a4d3d5ee0e5c738cbffe1a4245a556a0e3beb5eb74d8f32347d4f70ec211b0264dde4b1efca2bde05c729a7e620675b178ef1908c98a5ce195d0512d667aad8128133086be51c7f8f52780c696ddbfdccdf26c9e4dc235d28d0891f61ab3a35b92744231914a883a553ff02b4897ea6713286184dac7dca77d91865fffce3fbccfc22d7ff112d6af3750c7f47e096aef3caab53152efe72fd496fe322118814a59bdc180e4734185e5e94ed78cdde6b87a6edf015f35929ffc80e53656d3fcd39c927712f2df2cd525bed9d4f9b19ef7f14e422210fe23b99064f1d5ed8d7e0ece992b09ecf93b0e3712d22b309720cf72a740cbe39f7e00edbacada8074d4749a8713060cd2fab0daaca30be41f2bbbc225758b435603c448454dbaab420ad770353a50340f07bca0f6a085a201c3c39664063d315cb898f0e5c6e53d597320516b667fdb7a334769d7ddf7fb0420138d69430a3c4e256f748d9f1266c510db2ea4cbc66762abd310c396ec7bf6ddaaeb07da5e467d06ad1c500ae913bc7e7fe17f92a98cd96ab7efd91288a4ab0dfa630baf3d4df200bc1f1936095f793ea8623499ab61e3a8eccc747385d2efa56c6e3fa0328bda72021bbc9f84e2e813b0a250952ee53ed2d234fb64d0af6cef04d408caae73a72b767ea668754e8a92fc479bcd0a9222b452aa793f8873d6691210307f6077232288ddb6d0fc6ac4af73de3343e83b44f7ba2137e4412f907bf90b56dd81e313592cfe58b9492bb4d1666d4f0fdb03aa3bbb28cd20e774c49044dd99f7904f4799c7a26d35d825a8f80c7bbc64889a2087b66f1abd69e0ef94512e69a3d0457137c781b52215bfb6e33c3558c3b7ab14a4d565cf05594372192b981f9df56809f6629615b15db7c24fafcb1d1410b3019a2eb6fc259872b927c2c82991054949f3f9d9c34faa55c6ae4ceebeb705bbfb1535b15d40a1fd4782da9c0176235343c3a5aaf531eff82f3225f7bcb0c670815825ceec3b8f823b35b9de07e2c44f240e021850fc0ff9b5d8ca1d5ff1e682213b148a96de47228485c3ac56192d21630cf9e1c7b3a3611e17d611258061a06555f67683aa6cf1de7432a1446ba37850e58b99a31db740443e2440743184466bc51765cd98da0fdc0f413ec9212fcc49d6d46d54298c213af90036db1fc24f0db6dc0e97318f36f9f4370a278520faddf39bf09af08f92730432551471a4415d7c317e935da3da059f65dcd3af47aa1474ddc36c6bf3fe68dc0cce6b18bca045e8811419c307caafdf2c5ac89a703acc6cf213debc802c2a71539c62f00f94d4788f3c4ff554f9467ad700e46ad64c79b35ae89e249c415ac557d5903f24af39475a22abbbd3bc55e7a7bc5d481360da60c537b3fc1091e11f1b037606126488afeb6cd5fbc0355a389b77ff041e8611d8ed01e9374ae8332ea929e81c36d98314588432e186c9f8d9c5c3224b9f0dee44e0918be9706afdf15adb2d015e95250dae15102be2faa3bdff66faec9f8b011705333a5064900c435ea396cf1238b505d22fe5ef104be3091d6bb7bf9ad5287c9b8cd578cedf186c51e745bec787699a16fe426c931c422881d169042664c86418710bee02190466ed38fabb219b995d641de7f08244e74ee0458b1a66a98b695ea04ec19faf25e2d6c0782c1a3c714282dbdf8db599ab9851f0f6cc1fe1b5164fcd67615c6c412ce2f8e71e93699e6e099a999beb741d658e723ec717d6c5eaa29daa5a7fd4da383ea4670c23db13a5cfd66adabbf294641689885d62acc7eb720e48cd2959b8209e08b6c2a2f7e541ee358826a70c3ffbd2fd0d9375418d44a868a60891f382fa28cc1fa2205f5d9da7d93450a76965525aa663e62bc28a9ed99e2021ef275750f856fc80017d1b8a853e8b20201826a186978dff50db53c6f2955cf876118b65a6a6e4542c5ef6ef8eebebfae3f0ca5f363e357cfe0907ec7c886410ea93c3f01ebab92cfde358ebfa5b2857978bb8f9949020fe7bcc8a84670090bc91f1b1ffcd0376c8f53ac01ff5bba147edd9f5947ab154bd3381d988aa588ab43b0f69e3b68e491ac835000629bd82cdec6d5a3aef66d486bc6de82396a9f6b42015324e3f77f7476d9630b6ce24cf5fa12c5ce1db8570e7b75edae8f02153fc30dfe2559c7276406d55335be57260255ca14991429a482be7c2084cc6d80db64b48182658aa3a99dbfc792c82a8ec551371c8ae234b727a129fe87b638de7bc11a51e72754cc7ff84590f953b3eb1097009eb4ae2146ea88f76bbb1d0426b447c862948067b8cf5f17491d7a5b8a26e6ef8210fdf4a335dd86e4e0859bb8caea6fef39437b8c52f957a258ff9f9018b2a1cf7da56e1c6c028684bb1d8b1270234d7b4988525003daf7304eb8664490ce46036705d4ea3539d9025ccc0bb0c26d54587f352a9e9da48bb223c73b76521e6b61d686f7c2e7ff1b00882d9670039162f8cb8e9c6d1ac7a7c128e8f0d3df44e0daf56bfe9e5c248efebf5e637fe78f748870ca48704a0c3dd2152b2cdfa27bd19d0e1772208c70e2fc42e64266260f2ac94d00f4f757e50a2701b4a917207b47f20349a82114a19131f05efc6742f9704ccaaf51ee59e11dee2aae0cb48a0b9715280ed741b38277a6525f02737f7b21d4da4a57e762aff4e911c6d2bc62d66a17e190b5416afcdef94b092fd8483f5c08bab2beb37eae4032f8cf35f22462459e3d929a8194df605ae7948443e134d1efe557ac95c6d3cffdfce8d19f2ba8e100895780558556279af847f4222bbf1ca572d90ea9d5d404fb9e1684b6ee75c6ddf533ba0747e0342c44a172d949f77fe923c9e38f7ac3134355da23e4e492e0eca41969cc102b6dff0a249ecb8b24ad7f93f3beae473454973729dca7e66670704b61635855227087a3db603f6b20c1cfd7a0e97e112b6d18304cedf25aada07121fe3c5b46e3da139ae9b469d01a0216a3e2274fb4f37604b106ab212a44c220f72c81f0168b0300ad33ec6123f414e3162db30c295f9e91abda1b491742a3841206d4c5aebf8db8d2b90e219f2a6dbc96efe0ce0968847ba7e3368e37afa829d73ba8d60ab4d6ce072b0afaffb13637cdb00eb7f17c44f50732ae6ad191d45646897482efcc51fa1763c262067c0139e5696fcd3ac3bceb8776cffa2efbf9c433f2c967890bf47771cc98887a24af64acc1bc617c9fa4939bcc64229350aba77ad115d440c106dc14596866948b8f39e917c77d8c3cb42ad00a21752778954f99bfa7da1d807a86ebbf57fd1eaf6e79dfcfe85137b37eafab0d4ab4f4ab5eab0bfa553aacefe1506010ab30203b3b2da858a3e26a0d8702e7ebf76b361255b9eab4eca144d42405cd46c6712db488bb4c99e47f8968eda2ee8ae59b120e8cd13261485ce6d10709d66712c512873a4c9e8cc98ca6df59e1163cb5aaa648dd5fafe86aeaa78c177617f387fe6145ba0f76213c25b37c107972817643f12b720b6e8f2a28dd222cf07a382489f2ca4be5811ad93e56a00824c50003d73aefefe9ce97ba70d708b96be1b243cd88a3e490f79d53c6c6396961995d3dfc42a9496df4a14c3fac1a59f0bc834ec4c2aec3ef951cceb1cf7ff551c02476f9e345e9035fe8661776ba5d301e721c82b4a1297770ff593af0b2a1d7ccf258210904e500768c2b48f16d16d3d4df3c30f65f8f93585322553daa13a98512e1cb1e7c60265af1bcf46d07f36348a2569e41fed7f213e9da9017f00939c4afe880b7ff1f93480063f6485dadd19e4b5d0b0bbbc0c1286029435d1814ccf606d78d5dd8c5ed50c6195171b60eb4ead9e607f2ccff64fa3cd8770624d3667e5adf9df626cda473da547c6966be026409676b38cd26c7f28b2a5679727680a5d3f1aabf4035f4d010057f15dd97afe3def0493bda38bff81faf3caaee281c411f75b10987dcfcd74c4faa4f0a3a3435d54b823076033cc9866e6265f0c1fdd8c34763b3a7fdb5cf2aef369dd0376c8fe627524cd6b328e67a1cb1dd04389751dc3fa61eebedf3f27b691c973a67f875f9ee8a0e53b62a24dfbf29a71a992e22ed0c661f6476362020146a1b007e24357fbd6011494bfa3a61b06c574083a3dfd943b076c6001d474c89f4cb124fab1e4fa78f1cd9852bcdd8bdeb58737cdffed2dcd8eeb665b0cd1a78d7905bf7ed49ccce7c6a7e9a6cc738d5f4120d85ec4617b79ee650dbb20cf7a2f8d29cbb09394051e7e80d89372c4c979ecea130c47b7aa5de33426cfc33a91f59f62fefe49d32767d0a88b538119ff392f1497f1ae2c5d709781cf9da19708e017c978a71a1be7a529afcb25788195cb64077f4545173f41ae0575ec7bc163ee160acbc84f64ff23d9c11e0e9ef3782202697b314cfd467e3255eebe2fc8a8099ace952964a67b5a0c05a282a38d97b3f7a250808e8e47ba91dfaa038ec4df2461436c05637171fde96d37245e98e056eaf518a2e891c71d5598b7657414513f0e4472917087d5233205f79250f86632beb9faf5663741247cb55f8f21c742d155cd9bfc43dcdcc5a95bafc8070dc4578937e47f47fb5b9bfdc24a2d3fda453c9e6dceb5df88b9646cf598323a695f40b9b1c6699d1503af0b8bab0a51241363b926158ed0f351288570f0f61c2bfc95690ae4bf4d4c2acdbea793e948592d9dda9464dd15fc4ee6be96e561505a38e246e0a01a90c2421c0f7d51d52c68a486a07436cb441a339510c35ab3b9d5eb4e5d596e1343bb58b4693aa5f227009a5ee6fca879bca6d510fbba0f93de5ab3ea46bd8f7afc758def8ffd949c3fd85d10ae659246320add64b056a4968f592e7d5416bcbd62570e9c396acceeefc57e9334f23baa0edb74b6214a1cb8cd6848e5b8931339845b21d4acbdfa1cbd32ad0f0c3859adf69a999d74b238a4f2740d35fedeb846fbd0bf52c8a085ecfb94c02a4e4542e6aeefb36ca6fe57b4f456ede86825e63efc0cc32484d0af87b8d1f4d85416634125146cdb61165f84d8db67596df5288ae74cb10ca47346697ed009bbfe3ad8dc87fa9209bb50d094f7bbd80d27427d3043460e7e23749225fede5d21590be5d37cc60bb0b7e047607bfbcece47873987297c55f02947a3564c60ea73fe239a735a13999dda305a360b0b46709b2879aaff5b5caeed34f8ee27eac2c2d5954435ee4982e9ff65892fa92aff599e065af1ee0192a26a023b98de9be47f89b8d4c9057683ceb67a2a89bbc894ba4f5bcac97f61c779cc802f50a05878aa5f4960ccc5023c4da557aa1a0def7bbef1a112fffa4be1b06f4b52ad04e872d71480ed779dd0ebdcd1657632793922bb38deb4184b17e7da86dc9c1b53ff4538665cdbb07d00b3e362fbb7a3c14fca4217c06f6a93ac5d1b7cdc7187e94ae2529bc5f35e2f3a46edce8f23243612a3047098e338a1e0f4b970a4802f3f3089aaad2f1df58822869ab793457037ba38a887418223dfc9fc17b4fc6d0501c7eb74a2edc6f3a34348dce8c7e24f3d71730a9f465b5b255681f8b5a9a33974409d34eb86b9a7a478fb4441fa30d3845785fa6821b62c60115192e26aaf08c6ac034c08d0aac950168562581f6ab984f28862c164200ac6e0d77d947bd7af5f1a6f7d2aa6474b5294a62d3adbd011d73ba4da13c09e5d3c23f324e026d963ac25d6f7675bf210877db954ce3a4ecd9563d8917bcf93df27bdfad7bf4ae70c3f90c7e95f8eaab2a6d3f27a579d64947b2677bf2c60b4d555ec77758bcd35bffc82d98d81bb7b3e898dccc7c1ad251a70261238a6f9841e9f99d1eee560fd7bf5fac34bf24921d1b5a892240a9a2aa81970ce5b793a2350f8bc2ffd62a05153c66970d1112f524d56eaaf5e14b03caa4eed001101e3969eed9eb00e35467f31ca38753deb459cd4d5337336c2d6fe833d2315702ee17a0bc8defd73ac1d0f09da909ccda865aab43a8e5792c57e5abb687fb1d32817d244023277f40a3be0c9e771af85a8c0d22e0be18fbec0ab855382bfc08f860670ea7487fcb3584d5ac7f579585fabe2e79191686cbf26a2fbe68c0d4d51d5e4d19fa1858b933ba37e627ddb98a9e9024116614f8aab8ae4d589715be4d6266a2136bff9233770e18701256333b6acdbaa4341892d03557e89706cf5b57b22ffee5e6c85e01d8b0f57cf0b671a4ebf4a6b252e0fca989d0b5e8c0f8648138240adad89e4b62c92cf1286a2b0c31a5c8424b55fdeec0c1d7ea2236f9a3b1a5f1858c6a9a358cbf8278b52051645019a8fbc8cac6ab8152b5a98d181294279816e7eb15a945e0049449900b6272f3c52ea3820b2b8ab8ce13ff261240919eab98720e15cb12c57f15e8671fca351a4becfa0fc55cffa98304e3025fd4a05bae12e2b29ca632c604a7f2f8ae95a198d0c930d74c7f9e7e7ea5730c8e7cfc3e2ff67cd5e2cacd21433112dee2c7ccdefa4d313640e38def90daa5f66e3c9677a2d89c85278f5d64a1902f77d7a158dc301f2b42685418360428fd8615fbe685b192187c8b3bf24c617633ddb9f3f2a49fb572d20a1fd471c7064e2ac6bd277165f924bc9f9108bfa28a0e1ab4c2b151b8d42ab9a5c158e567641fe3703a09e04d9c555f15410df266e74e2ca6826910772447279260614fe9cab44eea21853f44e6a22617ff0488c72d06a778a432facd029d2ca2c435bd8ea827b4bbad3de7e2cc4e523d1d21ebf47b7e46d1c0156dde0d81c1e8e9265fe316c87c39fe989aba2a6114b285caa6c3891778552d21bfff2a68d2b7a3867a730e41e1099db84aa1d37ae8ef5e63d670d9f586c7c7cd034c107a575c03c570d19975d8b9507f1536b4d48d69ee1245346252504c9a74f7a8c7e3349a776381768e62cfb7a1ba7fc3cd50dce19858e77d717f232adecdbf0b63242064f455472e8f2e13bf0ba75472baff1c9e65c944bbe11df2b4f136dc0336ac36e6041f95b945faedf0a00599795a091622c5d0f3cd30843e5c278d4ebe03739b3585ab858cd557d923b227675f144d07b1ec5fc4a25021afba84978c99647860dd8e76950775084bb3e0ecb88d0cd647cf645a5ae90abb9b28bc093707b445e8868cd84c2f0d540e5be3e566c51e2574c689baf9691753800af31ba9cd81dcb8b3914090b0a97ab23bc3ed3c205a4d974ab12f07f297efb4c139ff35dea9bd485a7c8d7c3a84b28b394209080aa9d8a0d04029580577710bf902823802b83243c03a8f330e5b24ced0411924ab18f4ac9c1a0244255d85959de1b1467cce3fbfac43f35281fe0a791c5d92b8caa4f8cbd3d478f357d7d764ed4c0e2ad736a8b8bc9ec1044ed71a1937b5ea18eb891ef4f86a9b386e9639a542a51e0129128012711a506905b353bd1cdc328de1ff865fae3c38ccf1f76150170ad617741d08d0794145e0f30e24ca17bb2fd477d9ef0aeb7d1f4f684269e7500296cda47e7267774af6ffcf96d3b399a26cac38fef86779b1197a6d87872254f97a7450ed53789d4eb018bf3cdda87cd3b6374de5b4c3341893cb17a76c92a93adef6a833dd2b5c84ca85ca3113996d6d36a6f7fcb7bb4bb9368a5ca47bcffa5d6c4560286ac25a4538bfe560906e439b48d5a67875a4c461315c81b5967db46388e6f3d0e73a5baa16a44c5c06040dedadcba69f5e7e2aacab546c9762ba574253366720215e9c73a4e94b5ff5fdd1ba79c9d0174a77fc4604e8f021bf6b1f5f75f67954110a53d41ad352c42e2cb020ec3190fef42227caa1d6f617372220eaa37e2446518d1ffaeb675951d694ca6c2e27994205fde50e3ab7389db3733a5a5baa35a05b349665b1436df2195c89f8e9cddb02db1bd69ee0ad4a78fbc347c2efc3775eadfa63401ebe1fb2156ba594b7c71d89fe37b5094fad0673b671b39993dc327329368e6861ecc07266d75606a852ccbcf96ab421e5ff816d694ddaf8be90aab55b9c8dc1d62d75064969f72bf02f05236559d22d1d6b667f33d4adc1d276cd23bafbff8317bc54dda102514ecdd05363f615b9c63f5119317033421e94faab150f49f9be7b8dbff3c98722d2470f32cb0f3e8af0ee1f143d429d1ac01c5ab7374153f2fc5ee2b0076aa0db14d2af76f35533ba24eba4d99d6b7b42a5617eca12f1d23b9820625b2b84130db2eb107e6a1df37969b3ea0feda1e8628011ce93ad6f109f502ccb8f2e1ad19b22586e11844bf61a070083c54a44412b0c1d9baca7fdfe43897084f0d4db0520beb1f9cebf9ff1d716e588ad4e7dc4c3067c379ba6e4c8df3bc9a63c83a5d206a5a32e41513d13f732d5136a6020e54a27f53d324deb0f939f571a5718180d383d09b4ff105f6f7246bb7e06faa2d95bf734b9b85feb8d4305f670d3d5784b862ceb71c0bbb25c0873fb18457bde73b21463c6537d2d6f4445eb12dec4930113a1c7f9eab1b459582bc16d148750f47845a761693be20237b18c579a8d1c1f8cf67f3b800db7d80c15647c6988edcb8d753869e731ade6276810b8231ba7a0927669b8facc1263c9deac7d6266112e322ae40ecc47ae989f168893ecb8cec1c7f4d972a2d2380e4679fbbd7a227a5564c40aca589f2598fec8f251129b3d81ec78f5848add221a3130d76331c61eba572681c598319e935b1ce3874d49d40bef69777c44e3f037c8f15bf818ba9a7aa7dd441a70acf28a05b413e164d7fcc76b4a4d5e3aed4850d008a6f762a25174979e65a6394dd633e81429e9696c5150be9857938cc052fd62430761b3bcf862824d47ab4a65129d234edf3254d4a892517a2e0a2dd29d79a161d5f5410f52e02950d7801b9669eed5ff9655760b6bbae9a6eda9e8eb17e01abd46e8996dca3d85176ce4a9b5c912c177825cd2a5524643ff76b242c78061c3db909e4de56f46d41eed9dfc279ad327c5217521a78628458dc9c0572f4932fd9b4a77c2f17c34c1f79e57b4b685ace8c449e6d041361fe67aaa328a376bf1a1d395b391c403da161eff48bea89546a5937be225db02e48a27ad9234bfa31137e112b43240cea3075e0ab11683c1350dae3b2bd5cf633c4cbeba298c24aeb68485344a349bc5c70e8b2daca1daf4620965a8e5349cbe5020e608a241c86a6c847e48e9bfd2874d064d9438a0301701560bb89bd54d92606c0804549259fe7d9fa41cca0b9721ea7ffcbe2c5f7991e679d68228f841b30533519481e337dcd890dedfa4f1cf208d55e0ed1381df8a43da170e12fca397fe2ee6dfc54e7b81a7a57160e56f28ac075c10f090f42072d88069b5684fe751f3ffa7d70c8075e483464ade71bd2a1c72d1cc80a331f3193f5979610a9070b0c0abc30180874e5888ed4fdaf87c3a27b19d10c24d9cb0683cfac0abeb0b9c3de3bc5d2268c6b02355adb8235519fdc3769fd86b1e666917c15e07d2cb5950b90c4583365ef6b59bf97c865089677fb054d51dce5871e983b62331d8a99703f1d75a8e93a41c67867e9d3ffaea566dc392acdaaee7fec471da24bc621288629814813a1be8bd601bd08557a1d8358f10d5cfbdd26d6bfbfdac4030db75b6a36f8245cd2f9eccdb4f7fdd7471223c52ff93ba50e87d50fc09afc5dd4f6b1fdbe0b7aa27aed956dbfd97130966d2a1976f3bbcf9a0f4e6fd6ea5b6c7006f9fcb0812afeb68f046944c1a017c1a3b09f478584e35b4f3788b9df38b4b7457cd23f26550d6623ac116c1850783cc3b740c5db860528915f74d2927b26d6ee855b301de46b9194d1d27c38d98f4bbfe23aa3b20848efda5b03eee7990e5be39edcc67d0d0af8fa2b3e93900e8a234102f39fc31100e00933552cbf88389e43389dc38f099aff0dbbfb41b6e7bdc8013c4acdf11e0801028a416699a24c817e290f44a741072ad259b49f2688f73cca8fd1c9257a656a0073b30a34788c47d91cbfac484b1da63cfa78c8cad8ec5fae644566e34cab24a5899e6802d100488fe48c89fd9ab1c62bc557928156025ecd18762415a92276b2828a9fa5381b29777e9ecc5fd01a4d51e180077bdb6311b68162ada44b9e2a2ab8a3fe8cfb756396de0abddb12068a19b2448bc3f8c19a81ca27489a6570eb5faacaeafa1b0d25d07ada7a7d1364ddd74541a1fafe04cfcd26ea9f3c8e47044dfcc72fd47f0e8d2e732463f0a88900db26831ed5e92c07146e1cd837fbc14fcd98a523fd63911eca70f6ac2c390506af53a14ee7ec82b3fe18df64b173f69653ada276bb01084ba31ef41555508d50af953ceb38c3bc748a9bea000418e5471f8f67689ae4a04091a79d5364bf2ffa507d5f64ae0be5c7c6f33a98b5c8757ba4ca2bb925530eaf2e89092f44ae181e3bb859843fcaf633d1fea7ab0f414fb983c3aaeadca53e759357ce9221ff7fbb1de2a20df8d64c4c716b1831bed837bad51607f9d36464204919a2304555d3586c9ca55bbb20cca1e1a6a8e6e14442d6a6d74ac1659f313cd42563c087e36e7a303dc47a3d3a4ceb684bd87e01c16d27b97b66af461021eec3f596df6800e1284c5a9688424349e05684d5ffee3c71f8ebafa85e5ec270722442cff2acb8460de8d55724abd355c37edc592d5e22ceccfcf909cae7d61e285ecbb44fcb2d69d3f43ed98fac26bb776f12a0a5bf0931dc59130fb68685e28f97d05c3a2cb43608a7a0eef84fa6316f493a53130328662802eeb3023d7f2f77b72f6d18d206f00089a3a68f178a646af2e761bc51cb99724771bdc7edb3fa1f1346e5ecb92899435d503060ba9428fefcc2353265a0ef5bf632b54f42070dcbc38f6b3ef2c7fa79e921697fd92e5a61e4d9c44f5122187b21191c8be807a930e59bbc7ecdcedeeea613ce0048faa3f9e919d23767a210dd000655acd3136cd8c4e7a2f5f58a785f902571f4225ea1815773480ac26c90947d68623b18e18bc60de8a48d466b917388faa8ef0d95e9df160e33463a6a847149a44401661eb70a6961ee7523f6b9a00d199d7ec2272601e1aecf30574cfc40a2252f9a2eb0c549893e8de546a03cbdbbe4d2398db1f5ae39efddc4261445efc71a62a2d42fbbeba2417052efead3d8f47058e08047ec7474baf4bbf77fd15aa9822e56050920e8a782246014ad36566b3ecf5395616f68763c245dc01d9ac7161a5bf635376a749326feb5c217bb6538c099e2dadf092d631c6a4e27386782b8a8ff246c429d176772d31fd7308d0c68511a4b045f9da472887c6875e23c6fab755380cb8c3998f24b60ffeb98ddc536ad746129477602aa9d63f6c67347b360cef3aa619db3bb80c9fd37115e67145dd10c82ba3fa4eae8ea129e63f32184340be12e960edfd1d0a481dae9a0afbc47364ed1a318862fa6ff1e1d521f5cffb9a383a3e65dfe5305dd82c08dd12e9c863dc272ad1393e222dac2ad7641cad0ae0ea13babc25617e66abd8912c7949ccbe0450c928458f8741d0680034407b22d9ca2fdcde2d5d2af1aa51eac065b0eaf98a05f13a3fe6c9c48f20eb89930d7a90956c80074cb798a713dfd2654c120bf80269fdc992300dbaa93d4cea43a47c3e69cce5c47d5a4ac38e12eb664c4fd1b47c383e7b4d5e5d4711b32e721117a736b9f718b077a153a93b29bdd2ceef8b9514d71a37e67e32752087acdd34144045a66075cdffc8590cd3c8e86ac40861159be99ce22ea39b8fbed8bb6a8e99cfbdd16b03cebecfedad8d828e09997ec821cbd445af2327bb91066d26750de312ac76ac9afd83440208b39353dd5ba926ba5be515a1aeb98685bf0e51f2be3f0c4762137f866269685277c488d5f9cb165b345070f2da2c61148d3f30cc2b4eecf386cd30c83d127184b80433a425bd2feb71a2d92d6fa99c2c58f6770afc8f09e6d7bef82d0d914ba7b2068a6b7b378f400352f97ed4b8bfbfef43ad73c1c058dcdc5e83435ee24c470335ae722647d947069c310c6d231f28eac370296143f366b33c741daf960f09be88ffed61e4216a414ebd8f8b534d78ba3d4eeb146a06f6db76909363f7dc40ed007e906cc7e4d7adec4365cb6cfb3fe8fffc9650c8a9bd75097875864e067133fd29fcec078cc236032195ab8f8e078b63e6fe40be725562e226b7df09e054f59d97a33212a866132202436fc3d7cebdb292ab8f98298e8e01f8760babd2fd63a22993a9c67f192852974864c7e8a728c640fab52189a131807b0e9c497628dd688dcb842b3bedc23062d5c4d6e470d47cd42d691561eff3b434d16495553d28980f5aa1edd865c1a3dc7a4dcd9649eaa95f79bd9a39d9c2365d53498c8c66d64afe66cdfbd6990dbf08b1c43d69c5a2806905317e82959125281439eec46e54afa3f9c5ce546989796588868af997f862b156041bb7b6fd08ede7296c6a410eb4c88a1940576bae9c18218eb879a0fc228fb74bca749896b0b3d359711a76fa4fc27da12c528a9d83f8e6b4bf2347db9260aa7ccb7f606e438a283287872f46333130a1d5c7d9c9caeaf3be4c60466bfe4faeb99ce1b7cc2db026f6f38f231e3539787fac64355ab01478feb4fd718607d35700cdcfe2ac08fff70bffabb2e8ece070905c16a08dfa4b110108885e33bdd598c0ea4c427e611bb9938f8216b5da734ff6808a50f9db4f79ecb854a4c75889b1922f0b19014d5b0d1885dc76791131f0fe908d02d24bc34b8d0685102959efa6d1593e0579ae63dfb949b9b2cbbe5422eaa0cb2941d3e0f820de167f7b4decb34b34afa54bd8911630a48bdb6dd15141e0a2766aa9f6d27fd988fdbd76000bb475a11f2837f7cab294270949b3c50810c2a84f3e61af7456d865856de85a08e144fd31a8084ab8e46dd574d65d1abedded0e1e5feba7152fa296e4d64cc10ffacc6c46222f6d896b9d22b72b13d4e1887b84d45c7e0342181bef924dcb755db1855daa9a5104edfb5332aa2099138341945780af51fbc4490610f44d92c913d64abdf6abb40f58ecaea12337cb890bef95255311c0518b587476309bcde5c41e5ae3861fead15f84ce68167506888b23bb748f42df5cdd16f062e21dc54083edb6339b60b88ec546f2eaaef1f39e61399f1cb75b6fae7f8eddce09877315894005923c87ca170ff807065d3122a4e56cae16de90cfd1bd5a44ed42ba2f391f4457fe167a753bf395fd1879876be2c547867aeae330294317fb3e02862ad657a31b448d1fea304a3dd204bd0341560f1466ba91db4e7d621598d140572e8778a1ee996dc8501c930dd45544d51f4788ee4c4bf4ca3e94341dbed51077b2c10a75c8fc681412f60de9ed14ca25e9b88e422c149ef1e215bb704ee61522314fd57915f008b157c78bf4787e9264f41d1c523577d6edac8b778df112c1a73cffdaa9030f064b32878140f2746504f130e2c7ce891c026e891660d9784e934813848f0914cafaf421ae5257ea97cea62290ef62ca9d56f9471658e6daa3de0e53e16c8f38754b18fe8c29186d3d3ed47443526b6596340d7aeb67693996fd0b9879dd8a8a92e13dce7389cae1f3334b403f07de84845fa03bf6ef243171625bedebc1621cbaefd154f848391025ef904320114a970513829f04a52e6aff3eae5d6b4ecb3cbc998ff4b0e82cb54700a7dbe1e6b1ac66bea2633222ffddb7398caaf3dbb1e987d1b31a90e98d53d4c850f8ad47fbb15dd7dd0b5d51a3cc3b4e3dec945dc73210b10e5accf6be8dda492ece62fe292cd466145e0b924da85c92844643c0e7c2925834faab793a7acc124537c3dd497efaf571d1f60acaf98a2f907464b0042afe7c4613ead48fe32b5d637c14567b50ccc4af4230a2f466a86de4b8d086f5d8733ad25dbe52aa315431e3b3e50a2d17012f57106d98799002b4515cd6fa26ce999d5ce09dd32cff97a6ff290eb46e55f76c3c4dbed154ab25d63dc5a033d7cbf907a960d3bb99b93e6f076f7a9ed934c31caaa14e61a16ba46d61b5e4bff901de8e7df15c8e9f98af28bf75af8bf0b872bb6f910a0b83ec8b2733a4e2808aa90eb75b1ed0b52da2c9bbbf00f81498250dac0ef1c2a20e7b9b14486177de09acc02ca8316ae22b86fa750cc2253832e3d67954ec59a17c0d78cd5c25078cf2c47cb9f227d36dcd286330ded3a670bea083d9fdaf8e3bf0d80b9851968f89171a3d985e3a474dcb1ba7488b34b661c85dc23f46f2a8d30ec008759edb49c775957a66e147ae241ada0412dac705629595e56192621be6d102b00767b5aa4769f8d1e5b789a22c38393651bfa21b635ba1e86ffe10af60994606408dc3ca9c1d8ac4d47e91a944f4ec0ad3784c48001281de908be63746ed128ae04f93f8bd7c00ffc69c2f97e25194f4283392cced04a01984d89d1ba445292ad527667cd97ffb487d99d8673bfd7a1d7349b2745b2206fb31b3841ed0dece2291fa799b5e993c523e3527f01d5f624a15ce7f5552aaad03f6947d5a04efd63fd9ab6008a60aba167238e01d02702f85e272a0f962f04190540678e8d851a7ab819f8fc2602fae0c01dbc01dd83f8d37c9e03fc65dace8fb1d41e80bbdaa604f6dc08f18939d59084053aefff0901156f5b3ee076c2f600ab1fd4be01db68d25b1f5de50b0fdba63845f904cdb691399d18fb510fe2380cfb1e4a860e0c5b0b79114601e19cf9d1ba97ba92a6c85f147523f67d57d532e325e6a55941b7c01f8c399d30009f598d960128b89f83ca336fde57ecda750aad2a313d9f993ee33ba2fd5404d5409531690f1a795c6b1534c61b59a05b933123c73fde6239a4004296ef21b33358f7c53238c351143dadb77c519c0a6248bbedbfb8360ab6cae68c9a8470ce53886f680480b8877d60400f26fd685ed1695d6de09c1c762baa417785ab59a811ebbb986a72df170274bb3ccd391b7e32e838f495347809a54a2e299e0dd3b8f5388fe9ec628016ff02f853f830617d719887c76a995ab8fdd8861f0f6c41ed4aea65743b2f3b3d08ec163e97870dac1a9573532a3727d89a1e3e1ac46e973fd27792a299cf224f00bf294c7efc418820fa4df49787bec93f9d7ee50a80dfca7e9c701bf9e5d07e9ce3deb6df2f5dee9e0082a2baf7d322ce698d4470cc1de03c70aeee815f31c2a1338c2360d2e739c2a15fe386f4ec0aa5cb42825ace416872915b83818af3ff90289256d2fbcce3a79f1fb28185fe423fb7e20799e4729f5ddb90a087a41b8e9beac413dec401de5fb610733edd7986e7f842e9d3cb8604063838febf38cbcb4cde37543ead9761c6c2f36b31eb2ed714bbb38e76ef94813a6f26db37bf3b373a9bf1bd96ab32c43dfa7b335aa6e287bbb873601718537a811fcf44bde19bc572c539dc09bb74514db7b3307591a2a6c6811059193152dbd9f87d7e463a88965adbe5fecbff7b6a0dbe6d39339e43a59b38fdb386ca3ffee2f20635855b64b81a86d1486a34563d83d45e1febd434acebc1eb900cd7a708f31185f405f04689861a333e003e46bc930562c588fc9d565e9425d2d1857076593af7ad081d9074328e82d2a603c20080ccde667eb469d5bd4e164d5123e6ef8cff2a267d56fc7fc0d383a2ecc4a3a61ddc38e94243f47d56137284f9640f6f5b63667cde28c22478f7f48359f1013225006df80d62dd167063e0382ac59857958e582f49c3fa68fdea459a536b60a3212710cf09d791647270e798877c253361856c075cc013b47ecb423d65e03cd19e55defe402e1a9d2a3beaf2c89b09e902dbfe5945cb3c7711de8e188a12b1baf19d60f95ea683f9bc1cdfffdc19a651c9c7a32c64eae13b14f4faebcd9dc7a4a57f64e6416c950da769f95e97c975ef22945c75f9a9b44b6d81647a3b38a08cdc678cba8831866e7a20e2ffb4dacdb336b5893559348b2c4e1a8794fc89de37e0845d19b16c34fd96e7cfd728876765b5c3aca56fe900a4644c7706b12802f68286ea49b1aa3a201f55e6a91c046edb586df7322c66d4186774f2b65667274b123c618b5c40474cb44a6db7d20348990b1b19287ca2aea5002b9fc5542cc2de343941f7e7e02fc2211b2ea06e7821c94b4a0be67fcfa5433a4e8a5746607da0c3710f0414e701c5ee2df6e5d99ab5bdb69229c61fec6d4730aa7dc610dddebf95181668c635963cb74e87d6735a2d9cc594e48f53c231120d5783f103e1830d5c134fe2972affd0699e6aba54310006a0f31f4a92cbe252aec9736d597cdd3a378f6ad1f247eaa3a03605a1c97a2cef033edd4ef01678b985e0a91c0f5a8660bf83536af16ae96fddc40ae804416d7cda345898a66b0c176f99f1a1e61dfa2b573a946d937a6b837e0316d1fb952eeb45125fd8e5b2fe89fa5e1fdd111081c0ba5f7fb0e41e21653a0092fb545b06fbbde08c63f5b48e08971a0a4437e2afc64a00bf9760599a915c8f46c145421f633e7be90e6725c83ffb7bb55d975fea43ae668f26b3a0244027f391546f0735846076adb217705bcac70f15ee23640ce08db82a112538375c8e702df3b9a447196be50a8405f781536980a0fb9e60b044e2917202306c7823294b1775b9b1d7793760f1a232066769e996b909068b4109e32c73732c3aa16405ffa8d819f2e2e26b21df30d29aef2521c29a0633798373b518ccbc1f82a83db56df589d1f09e125fd2e219ff2fcd221c751784642c06d54b0fc1fb6cbe228cde9887cc2abb126f95ef47b373e6526d689ffddf0c38fd7c24ff36b2951475e4a4f2376e37c9700dadf3d52924a1a903a3ea55a35aacfa64b0a16f8bd917afc1dabee6c4e4957163bbb79e17f8c9741aa0a795cb5f8fc332ddc65176432e633af75b98b5e58fa59e63a2a13124c3089fd647d6a0799ddf11e119b517586acd1fabc454ac2af6645da112afb4e1f53ebe06fdacd29fffbd4882a0d876844e56ef7e0c6849c13408785834912cae9a57bd393acf2314e173fa9c57ada2ba849db295656dc992a2c5fe5c34bb6da9ff9ca29939ecd805826c062b54fbc7565fc88d74f25f0d582a9e43f1dce687e33700228df94fbac2cd2460fda7f2739a11d0f299b5850aa66921a29b5cc0e84d64b7d1822bcb5d8879c99150df773516fc4993219bf3f57e533e1e4342f4bd3f2fe219a64d174ac6e7632a409d6257944ac07aba481acfbbdcf871fd69488e166feed2f54a642394fd5770ed5953784b154b61550b04022eac9a081e8692d40a30718b8043eaa76df1ea4f101e65c4e5b70dc8be8fb67f02c905715d4f3b61fe9f8bdeada763b2dddeefd5c3bc82a54cd8812318302be4806f49c5ac08786a5975eac2e5521e0c69ec3f0ba25c44965d4ea1e0c175626d184dc6e7401592af3842d224452bd05575f87c626d3391e60a929492d833b527c18961789b3da2625d3dd9964f1e41fb7da76a94f3f83aa8b951a22df0cfd9df84f1213b213bee98331bfd660a20c63bbd627c44b481df4d0e8f0978a8aeb703f5324c2f198dc10f1e21aa9bc4fc38e368a4e61be79e0dc1bdd659fdd1beadb8ef6f30e1c82e48a5beb46b981abeff596d27446322c8c4c8e798e4b7b512428ce9bd77c0217add9c7c018a13c7f305ee6c772f920cc833228aef127d8dd1ebfc180b6c0393d33e1a94f611997d5ae478378e3a6c8ec9c7779c6b1ff8848736ab7c6d0282e545cd1ff0d1d09d24f2941baa1fff6f45bc6fb13465df361293034d31f6661853f1d780f41628c1302df8abb5ff806c894e2ef978bf63385ac4a3ba0a63e043dc18d556260d7ab0a3e9955c2752ff42633a2be226af1d9ab7916838435f5bd6fd2272b97a8450facce9fadb49c6a18a8d5e7b171fa5e1bac6d439027fc631ac9b38e91591010f5df166dc291e86c27c55af5fb8719c71026a1aa2414090c04d7193fce58153b6548ea964c731211cc6b71dabad0df912d40b7f65779bbaa0f031904cd3769bcea221becfb2be61ff762a52547fdc95514bbd51086677e69650449f4af8c5f027d2c2ab959161d327e612b38202e0cfc97a224ed6c39ebc194e0a8feb72b471cbd7d0cec052e1d901d5e831fe973ce899a3e094f43d565258cb0177e9669884e7f03fbe94747925c4035d22b7767fe2eff571ab0034e3320a6f6d30ee5212fdcf653e58c436f9584fc6c64fc051f6d898330fb35f6ca5f978d1f2f5aef369e6f48975bf5ed19ccc2913a841eb001d39c63362c964e9ff47fb26b40ba907b3621f73663b0588f1e1a1b9d91cb19f9b7dbf44d815b885f52dcbe612b0dac491c14bd43a0cc1315a7a0f6b675562c20805b5088bb6bb184d4f0d1ae6471d316a29caf55c56ab86f23de6b92f437b4b2922db8b1ca5d0bb39e1d05f997793b7337ca80619e5b39eb4655ad5f4a270f8ea7de255d9bfd994ea43ca001881dd243c871308041ece58735464f0bd000138ca9e94b7359e34ba24d958ff1c60445fd68e724fe33574b6120213c1af2cca03417f2a8fe0276ef4b8d27ec305768b026b4d54822727839d127e3751ef1688675702bd9b1de61e9ebd5a45aa9b9087db9b0c7a26555815b7df48ff3b2ddb4562eb6ae6a54c0955e8c8af7f9c1a3704f7a9fc5179975f333e882f7edd3a0848ee75e3e37981f81f04c11ba280d87d49995f0d5f0519da623e2eb8e6f916f51d5ca39542cfac0cb1076c5a9afa0db8b1f9c286c84f6b0e8aae8a2a51821592182a9f940c400012472d4f2ba24644901f5ca1a3bcec626602c42acb2665fb1134cc16df49cc4ea9cc14f98c19c61ac4958b4333ef42de89449156b6da89dbcc4975eef2098f6a6c33b41f7e737c10704a1cdeb6d73c3de0efc34cb085b587e12f102ae89246b21140a40e97ee32d0f794dc49b442212943d349bc957aa6426be0d627bfb7f631647811d3121e3fc820301d7937b3460767325b5d0e7c1771a2c5d0f50656168982b3809be216b470662420a1c0cbddec9e7848411fa24a1a9d74953bba4288baf39e46b8e9a139e407f79326f97ec5d196e81a9ba76c12a6a663671e73caa13f60f00272709b50646cccbd8c7f601cee203fc50017c47c00cbfffabf2228a6fe47f76b213205c8b5986ee54f249006d87344320b698986b71de0ea7014fa6380dd7d6b95bd4fcddc10fbce3cd7de26dd04d884b77403a783e77f1e0ad7e0739567f2a6aa3075e1b4de4492f5a2ff5e90e86f9c6a0217593e833ab80fd6240034be53b0c262dbdbe731f8f82fb0ab10c8585e6e5ccf5380d4611f8fc02a4f84751c0305b5a0564cc9f1e290511f68771b6ea8058895827d43b8e891d8ba9e8f1d31140c16fc50377437f612864f06c3b0b65e26da0c2a31ac7ed2929a3fbd2d935e927974ea80763168bef9ce81b271761903e41a3c5ecc994c895af0bd2a2e7cce574975c3358c04de5aabacc879154b7f98c87e45e4253b66d657d726c162b01df14b0bc50009fe371501c63d2a587be78b8763d44e1d2d580c54deb93db44b546ab7a21af6800bf4d8943cb76a29c964ee83854ffb7b464733ba6cb108efc660f8f6311fdaad8bb08549b2542a3431d959cadfad46e25969a65f0511f30a517fda430f4d11c2f7713222a9c4b6647900520e26715c8bfdeb34a4152abf93b9c36007af5fcd5527ef6f43bfa1b358fb6b3a4092c9465f11fc0674b3304486d9e0e0b48794fcb27e9d4adf253d6586853168bb798419a09ab4fafb3576d2283f27c49bf85513e1ff8e6fda5a3630dd2cb6cf944b636533e685ea038ca87085b00ee75419f97f22ee2ee6e27ed1ac7d2318a351e9b730a16d72c8f626d4cd21ca05260273cacb2579ed5fffffcd6ebf55cbef40fa727f74719a913e40d1958aa92dbf074280a58c827314aaaf6c3fa9c655e113a371993a3d84072bf2331665bdb05b91187e024ae8f88a7fe6a3ca5260a08b0e147df313cba65944dc2e376dea387b8ba66df72e28b7ebc719e8bd55940ba6c8a993afb234c95625bbe66913598826ab450154e79c40ef7bac2fc3cee09f2c878d47df58bb61e5def9f0086d600e1419eddde67dc5a070cd5df8a79e548ec4d84675f2ead462774211c5327cc06bf1cdc53519f6df3df01541f0155542edbf7e1ce9b8fa0aa1824fb79bcfed32cb494161e92f7fb24d2de39e01fd57f0d3fb4a5d20c2a6695019658af1de6acf5b1234b3b2d9f4257aee84625833620801d051ac53fd255a61abf4a2a7457aef308fa3d0915a6b99837285e3537d5acd64f3bb6380a14a831abc5295012a94171a4e85c192c6d40e48c29ec7d8880ec491a2597ea2f608b6b31435fadd467aa5a83000edf80f06ce09c0a34b0c2978ae8387b41ea21c8ba290c4f7d62643a6e5b8f73ea7c272b946d264c89b887b146620425e8fbb11761ac8e8e4877bf24fa7f9ac1f286ae2ee731ca0aca06c6cf4ddc4c94f85c11a1d4a8ebfabc384ac40ca4e7f32205e3ba2153cc74e86fef861d10b7b3c54f039f79af5077dc47c4736b01c4a8078296fd5c3d7edd5cbc3232c22325922ee8228954a9a62d17af9d090b21ad2fdda3efdd867c96ba3802772655729278800db7d585cf623091ff7c68d969dfc76653e8534a9a4a001097dbdb63a2a7924dc6b17558714bd30d054d64b1d86d15621e1338bf1ca750056f0f8c5ab217a0b7923da95607489a3fa86368091869de0bb8d849a17b78366f00311fd9dae4447d746267fc340ed50fbdf02dfdf1faaf34ff29f9898688b7f58fe4710f0b74b18a4e21a1710f53fba7b10e58fd624fbfa28dca2b34dc82dec5f449e33a4bb65719121d21a6a12088840730e35f91f539f788e7fb4d35d8bb42233264b92aad93ec17ef5cb22cdaafc04b70294a2d018282895b55af03a4343680fdb4ca51cd5d0a4c039afcd765e84e7693a6776effb475b8c13955204ceeccbcf6f38f709d2dd85d12e887d1555e2d2b5279dd859018af2edd83c0ffb19afea7b31a591c7630fffbf07ac3f837f9a5b48ade9a1111fe2b14921f49e644be8732bbe92c580a663e91f607f819fc2923c63abcced11c4a9e0f45f74fd94e743e168c4377dabd7792d8ae46f9dec5a94873facb3ca13f7842d7f5a8f6c0c997da77dbfec039ad350ef22e28848e072e3f40489b939e51f9fe5edbd75863e87eac0569d32af35579c22f65bb2ebf8dfa531ffd1cef09005a39bd9f5b95876ae8bd537761b49ed2b17db4f59cffb5865cea866b37514a84f491f842ef4e27fdf8237bf000d39085d152a1dc89603f163f29b521a949bb3be861060096e57019bf1091b4f5671c5cbe951565617885af1bbfab03f27bcdf6508637ca955504c145013a397fc5cc3c9c10d2d7b8556605f4acef3a6f52757727cf51fdad52185cc37a518801e1390aef3030bb6f1ad7f4924399971c0c74bff4185e06edcc45ad923fccb862ed44ed7f6751734ddf8deb7d9f0411d3239d7bff94ba1afb3c5e3371db1c0d66793889951310d2325dd9b83c417253287501cdffc5bb1d8cb69f647cedd836cd6071155cabed02ec3c4ee640139396fe82be71c59b8be156bc2aa12573295d428507df6615a68b520b869a54c7e3d11d740f1e0097fa16c3e021cd7f09d5888fbe3c3892a5593ecc058ca3207fd923cc67d03fb5bf02b346fbaa8bc7e7993492e2b188a749c533da68e0b3a99667f879bfcc66d48d50a3e2b209478d72e054df35d29187aff21f571209e4d8d0ec753ccd029a73445dfacc88578da2fe53a2ca72507e065f8603a3bfbb5687f9f42f88e9ae6b5d5187ee4c553be543721ff12df8ccc29d64df89d745fa2a5880f21460fb216b8b59bb1fb3e767f05d99f2ae3232f38cd275f9be3cdcd9a0820ff774c4387bc4b31dd5f85897925cfb137b9072d308c39e959668f49819d871976bdb1db81a0c797f6efbe0a7eb499ae9fb6f259fa5cdaa8a9a7719ccd904e996b2285413a3fe3d67404f0178cfcf11edffd59935207eaab477b0b7c6308c3d95b5329034ba8708fe41b8dc8721a849f2b3734ba32eba038ad3bb460e4572bdf749e96370befaf69748968e8edb09c727650c59426a6004fe10ed743177114a5d03b0c35e3d0ae7053687d5bed339e0254a26df15801abb734b9608eecfeda7b0fbd1e08e782b39031a3cd3beb0d17a9ba9f3e87ff7e7581a8cb6090511f18f2418668a30335f8dfd93bbabf9dcd8acf56279dfcaf45044fe6e6c60839a90c3b0f987e213c234a07c867a95a9ab3d72b80de348a1ead58dac7a8b139e7fc68b5d5ba68621f124ffaaa80911e265d217317aaeac77d5e64f11e8f1f8bdf2d78848fd74ad7d309069df0a5a9b08ba8b4f1861c4ccdadcb5798ea7edf6d3a857024ef5476c69576d9398b1944faf60350190cbb3ec17f06729264478d806e1b0af7dfd2d44cddcca5c6b0dcd3ffcd20744172005a8bb4a4235404a66ef69c0df5d59a2e280fae5ec645222cf2d5ed78a6ec3229915277b1ac0ef26d28ac30dcc68c3dd09ea8808936d165f5d64f6ac4845c0bddeba97e3477027abaa391828b49d26756ff4f19c9f7cb65c1eff692540a22826f26b57f07a44ae14a69dee2673daabbb58d8564d3786d1d58f0d6fd632dd25ef9192948d95dc8edf95122da6710b852da478aa2d272e0934d4d612a7ac15048cb44b3747ed12c9496c9839e74b9fee580281330863e156aed5a7ca6c678f9ddd2c52cd5d30b30fa00994cd893656364cd010715c149259b28fdcddaf82aa99b7450536d0b93f4648fb4d7b53a5ced6cc8778ebeccb8045e98d3892b86bf5f100e8b7acd120bd21bf551549afecef0d99542f11c87e4471064dada2bafc530d6867f40a3b5ba476b73f97d5f1d5c2c57e57fdcc6022b358fad211ae07c15b30df0df013c3b096edcc759f58c39e3069bc39ee107c58f6971c2dd700177c84b5ff04b65e9a62661f559a9806808830ffca5d36eb826dd7e7ccd78b0d937e22bdae8256b0c28ccfa830a8576bff3c99f35d0f3006c9dbc36d1e35c765426f0df84058f541d1103ac5d0ef2526e1f53afa42dfd1d41908e5d6870a44c020e4de451e1c091472b64c8599eba33dd7f1bf88e60f9dca04dff5db705a14c7f6e7719f2e262eb9291c885623795fb9534d3fcdf6ae0f7ca7b308eef198df07a32a4426d5a2c4faba06b5b511dfdb2ec2bcedd5305da52926dcd85e8ff3a8cff1b5e3c3f128067a14a2e24013581a5d11edf1e786acbfcebd4f0bd77f8dc22d4cfde6a2bdaf28b6d94930e2f1f8546cfcf1b35935c7be54e9b457f6b61272cbd80e8d427b2b1dd2bb3f8dbb2caf09725c0da6ffb4e0198335ad36df58ac26ddbf91aed6604ce6f8ed06c4448ff6ce5ae945d494e04331c77130b1b9c6a2a91f549bfcb18e23a35991a1b1ee6939a36f81fcd9270296cefdff25956d03254b6b206cf28ac8a53a2b9d148dbfb5377dd936756853f0c790fa23bc35c9d438532dfe73345c96690dc43fdd5326d612a10bc440e7dea9b39b6ffb43c075597c8623e60fb3dc4c028ddb05e0001f72bb2995358451aa2d23719d4f69f029b2b801debc2811eb78090d6ce58cb52d461604ed642ed8c367e838b1e47eebb526ffdbc52e82849594457080674e5fec12a40e9358d95562eee9ccfffddaa2ee6891c2dc35aabba90cc8fe0d20ae06b47506aa027a5ee0a7e7a992511d75844a0e388aa9f5591e9d14f20cb6b98384f47135f2dd1e3b53b926496d4f7ebc4beb7a9d137de727f003c3a4b7e5c406307f2e4fd02fbd381ac0858375f5575f9e9ea870a0f9643feebf5c9b75a43c8d9c6065bad9fc9845b8a068d7483f84537bd35ef454fa73bb0254595be5183261bcc995a635141c51214067d53f57d7d898cf5c0e82b3fcf892ffeaa9fd83b4d1fdb2aae77fa1f82ff0ff023beb7c62f564da8673c6e6847d87559dc9a4080b3144dd8f6d209c752a6096bedcff9d74f1b704467fc5215fc1c1abd981ef568b5e47f3f96d1eb65300edd786db1f460f3df7b28edd46b45934ae83a1a422031434d14c4fa6728ed2ff3a2f0e6a999ac02cf1c1bfdf1d6dcecef88146380792071aa4ea9778b847351905cc56b13581145e776f124389cacce64c920dcb59eb2afef1be1ca82d4895c2418881f3aed7b5fe4306f5237712e05e0cb3787f58fb6b61b2775682208e887e28c3289c40e822677d2d25e827e1f549352131ddf3228b2e3f2d2fc1e40007cfc636d5ed94963bae4f7761cfecff2c976e3a5460d9de41fb2c5d367e1b3e674660175adcde0c08fc2a47f0ea9aefdeb0caedff74350191444ea14c4caf7af4f2b5da484455957e6a52c126f021a846f7ff564e65c838df716c49198e1f04cbef39e3b4adf5c21e14d1906acbb6b0160f9d3eb40de83477c9a0f6c7f6d9db2c38028197c96e82ffebdf537ca978a36af0bd4ee14c5ec16500d73e9a8b6cbb1f85a386a66103c001198a8f24c8cbab33ef1ef6faddf87732e20c8ba869d8b366138f50c52020cef9e440cbf5404cd10f0862ba6ddb36e16df5f937437bcf8dd9dc53cd2798e63cc25d3261f25ec2b18795ac5868ca589b3011acd74eda8e3e6b0c15269d75ae8e277204d5d1ec4775a5a7934c7b201e993d35d14acc54e2a735e722428b60fa535a1639f9e16a153199449efe09e00db171344103a2bb631ec9b103b4fbe19c206defc79fc9f5859fe3c29810bb4b9c62c3a27f34c44ba50f58e429103c243e6696ef787931a46adb3053c2845bb07a45322a7650885b622a70871566df475da94482a059308578f7d5620224eab4e25c193d2524e5b55225015e0d8b78449449964a267973422239a2eec6230ffa1c1e6685510ef4720d99c08df4145509e20226921f586dfb4cf436fba94ffdc277ba08fb1f9574b5dc94eed18456cd9db9023fa0f168b1840a9f56ecec52ff7efc538cde8f65a8d1fead9d052807cfb8568ac8187e661426d70947f8285723639598486281fed50f45862661d94b3fab7a2e8efebd4735eb8f0be5b0af3e0df4fe7cdfd28c2aa361c5ec6068b5a4ede523a0b9a95bf5c26b741b7485441f4de1a2698c3992cf0a314fce7fffac5cc7ea4971d8e06209b4c0a16190d2eeede0609ae756fd661ce87a2cd719aacb647065b46087b5bef089793c7c4fddfce82fdcae5991ba57d26412e49f81d38ad089f8f1f2ed432d3f59f896b9563841641c3e8a714de6db4cab80d2232c6aa7c51e075a4b37044b2708279e2b4c50fb6ecbcecccc54cbd2cb538d42c5d4c7de39222a27cbf4e8886c21cf602a80927b765c6591ef399c6aa6cae94ac6cf08b389f3b04dfa460d2cbf255df099aac15dcf894444606ff913c9be472d8ee4420635d712a318fa51d07b3c8f978f29d22ca8d4562a5fe48c9a401846fd91335f073992cb17272b3c26eba71b95705ee67b5549380bcfc8ad17f13c9c128197e569d329415a11e0655358868283fefb43afcebe895868cb152c017842c98a51031c5468289e8924a4a0a17047b399ca3810d2a17c540b4a0fb288545fb9abc20061562d644f31a3414c40586a99e3b3145030d03369ea0ec36f339763b1215e2bf312d9ec95351498720b9b8b369f59801eeebef6f432afcb9a9cb22c73c3fcf655247436907f2ba228457147ef1a3c895abcef9ae7aed4b63c2f88e1b343471180b4519f369d73b47c14ae7fc2dd28035ccf37c152e40259ba212358d64c1a07d5282451454d297e03893f175e468143420bc053480a41383110465eddba0956a784a39f671142ae6a445003e1aecf0c520f85032bf4de61e53eb4c25eab2ce6a884437208613e0fd3c4cf041fb5badce3e16e7c6bc30da5f9c47dc4ef17320fe2e34acddb12227f95d3c5cab1af23ca628b385dd872fb54208abf992597197fed4c87436505ec00e600c90accabc3ecbc58126369b03e50d70c9dd1c85433f4b16540fd0447c35180a41a207660e10dd7f2e50c4efc11180baa5e4232fa1fa52865000fd175899ed476a66cd30e1a2f3801884d6747562fd4985d8ffae01c0a6c71fa4c86c3aad2a458cc0682cfd242df3bd2897e19c2d9d6a7ad97707351a23c9dc0d96f07a00a047a734c729b46840f5dfcdee81298b9968e143143ab9549c4cad47d8919e20791f5c64b873cfc306a10242bbd026e7f9ca2c15e666291751a94b0eb3bfc950aacc23b017787f20ca91430fadd654b14630d33f1d3b1d1f3e8abd56d41cdfffaac173d73348c8a07261677b418f9a27080efcfd28fab7cad2a53db6bab5621cf066aac0a1e6462b309428797065e5b02c9e2ecab2695866cb412f66004829a853aec5d652c6f9b359a0fa746ba9d8211978c409bf7c1273e2e7cd5b26449cc1ae136c71cc0341ab08fb37a92eb6a69ff2691dbce4fcb3774b49e1a6a0be77bdead220cbf24c892ab712e2bc0b6a620c953cf0f31224c9c2fd60b61655ff5aed38f7a7ecd36c06cf7e9b494e6e2553680360c0fb8ffd090e813fe223bde43543947ca8d9f0fe0e431aa3e8d4744766b256954e80f73f385a9fd9cff43cee455223a568c1823c3db9a09c781d8c9b087e218bbb9ab1ff66b401bf3036fd0ac3881a1241b0570aca2198b118acafaf43e46340abdfb20103e12f2f84c2147e24eaf0ee74817202758ba8013353075fb036e8251a11c7055e907c4044f25c0eaa3a7ceacbcad8a5aa5f0fdf902e10fd8cc95a13f9e4a50a90cd74b0c905d4e9b17978aabc7c3e4f49d7bde4ba4cb54709b64920a60b84f9b32d5faf69794ae7587d0d1829c96226c04f5e10f97e70b3d2c7c2540eecaf7969f4ca8d450a65d994c53476803b8185ba368a2a43df70006140b8275ff7f946239a1ca13f316b11574df48c960006d8bc07a1b84615815f226f4af73e3628878ee0dc99a2e9930d1e2c99642129070b3f5d21db0ef46356f51faa72db8ad6f98999e374a7463c86d448b1ae76787f26a2ea8e38a4ad25dde81cbdac763751a763d0065d60c53e60390a4f47d08bc181e63a835943a8507487964adb70cc1c69db5674bea8bbe09428200da7e4f3420da589a71b6ecdb8b2d1e478a8606e46381e75d930c74e7bd2bd7f7de00efe6c2eaf9a01944485279f4e27a39f14528ca51c4870e1150c25c3739548a43a0f7baa0231eb3adb80ab3a82e15a43328e7b9cbfd239fe8d20c220dd53331745d8f9803362417a3d94753582f38f48e59f81f5d2ec8b2500877dc79c1d328d40efac5bb08413fdad95ba95df4dcaaa6f8a97a9894421b9be03ab1018631ccd3cf12c2dffc826254ce1e0a3a6d6c320dab130d7bb8116cba8e3ef582923bc2c501f813581a54b004c0a4c24127e8c637d1b051ffa0520d826a15d2f1b3f99c0e335ff37d5f147f467f35197b57a5328ffea3792d89ec4c4f70ad4e6a9af8124963b503c916c425e0b3e4382c832e375714230a2a871913998cae8ab0504e25e633ff97c5423f8ece808dee9c646b52dffe2a8777f532034ad1cc8ac098412940c8316b4b5ab424b47aae1680753f2adc4f7d3ced6a41a90cbe6cb91a7f9ce60fe766b05a82878ebe461abadb0db85f05ad29ddc948cccee96f2db9f11a160ce4aac3ed9caa3b008c73ff758c8e6db51b159ddc2d332a49d784b9bb1f6172d5c4576587df6ed65a961b4e96f5b11a675e45fa738f71c7f8e7313c987322083e2bdbcd8c7728d4eaf2235204e6170a35bee752b6ca0216a97859f6ba8e8abe666d393b70b397024493a377804513c44fcfb956cfe7a3b855bceba7eb89478b2a8d392d6c7718a4b25926664261b5b953e2d838283160c0c8060cbc2288bc5c70d9b3cb9c0e3adb26699e6761b714b69f34381ee0b9a5f84df6aaf6a2d4dc2d8fe29fc9fbd502a44f5ca8721afdcff0e216b30b9de8343c93761594306f893e304cf1e662dfeff7f23f3753cbcffb4709777f7fa07f06680a6ffddfef96b462353c8085547ea4826a1c3927516bdb89e0392ad6446cfdef2ab84e78a3dc3ca503ed4fbaba3cd520d68bcfc8c26cee61b3b8310c01b24254b811d32633b22f4dcadfaf5aa19aabdf640fec9892d186ff1622a1719e173d7dee4ad6818d49044876e1cc795439f8368b859f8d3bf976acc05e42f63fd2f441cb45b674013f38524fa71430deb546b83dfb884c985f4ee3f31e97186f95a239e9d10e9715fd892a73b713d374c059e7911ae675b509aec93f13fc95169cd30e5802d2f9753eddad0ed70f6c0e32c163a0e749ef3ba7f4c5d2b754ff3ce77ae66d04f69bdf43f06126188fbdd821c62975144597296ca9eeb719302a06a90314ab1f463e84dd0e3dafc0f3f87772f019dfe5c169271a365f7f8791bdd429df13af583051a93e25a510e69327a974971a34619f06f872e48b43cbb42a88dd3f34860f19457d1099de055477919425609c9824dfdcf26e1e82a7ee6109facab30954ad76e0bf00527a4848e9874fd09e1abcb1eb8049484dd48cb65cade90b37c1a15e473deac5b89a64f8d33be040df189d5648e8de687a2abd5bb8fcc2688b185e2bb1d740bda2c2c258382e48fd65b65ad22a728b4922a60e40694d696425dc8195a3500154521f5cf5134434fa8bda2ce71d4473f976213d0a80df053a7d19d81afdafe5a26bc8e191381d5664c368c784e7bc149a9ad13a7952f0b5cf4dc56cdfe8db9e3fef2ae976692741d1a3f55cbcd7f1a59fb40dac5defe80bfd4edd90a3623c8f01fad376e8f9c3f844cc49609c6dfb265fb133e2b497ffefddd13d49bd1dcad26fbbdddfc6b3f13663f4d02cb6bc92d13e4a87d2d108de51f751bdb7b14d2a6e0ded8969357e3c393609fe0a9ec4224ed5f7de27f00925b9e05799904a390a99bc9740e4d665b5fa5e17611d3846abf7316d86f85c4d3f0ed1f052baf59207e3f0ca1a69f554b4857df97b8116b00445107be932e43d30310b26de085ed36b46b173983ce77e1aa0811e8f25201371d305f43aae274e3bfdaa890455936ac125f0544602294ac8837a348e64bb09b373c6c3467cbc8827d21c033ef3b67aced2d1d6a88c6e8bafa916a91cffc6a6b140cbee896d2ec291512c742cb7450655d8255b1a6d0c10c1a4b38acc6296b12bcb3e4911137f9eb2529410745686b6d402cdaf7f6f88f225147d05318ce784ea2e04dce7211893fe24d1d5079c76dc3f84cdb46f17f1cc08fa0915447d0dedf7a9704771a532013bff684a6cd1928a52e236151213ca5d9696bd8546d2bec401ac92fccae2df4cb24b8a26f37fc2b9354dea4b9ccd154e26d2657a8ca898e49650611af11a0b89f11016a8b4a974e83f61060297e96f2c707697b2b42884588079c2e2db38b7bb8cc8df0a6fc6f1952bae3977528d99844a69140bc173a1114faee1d9e9a205c289ae32c768df823288ca34ab1a998ca927cb03a001cd30254e51e2b4d9c5b40afaccac55f11e24b569e0260ff1db3adedc21788cb59e1966f675f3f25dd9a70f2fb1a65e54f70fef90b56f4b153e1d95896488753f3dfe8042d51994037afd621ce0184f7ecd30018d0b7845cdaebec4cee7f47c0d279f023e549f643fa47959bf8c05a484ce74e0d1dc0e1ec133a0965eb6809f161d6e5b5009cafee0204ddcad8a7d4722ab38c99ffd88ecf3fec37d2cf7adfebf0f0b5080b57d34bcc4047f7e931e8ec98a36e46663b5746b8acd6eb1f822fb88a2d835c44b1817bc50664f6368927b386220e4305771767a3735e900aea769c10b8b4fcefbbeb80fef3baf27cdc2bed9f2a14f48bf979784271ae106c57660ffe87efb70aabf608b4c7cabb20eacfa567c52697a85744391d898762b4bb47e17ffaa6b8849875130145bc44bbee48f388380bb3cdfc535688107d0795833fb2ec08efaeab2d6598ebbac068d32a98046066c0b103ee7e4c27f37ed286155c84e698701bf84105aeb297ccac3a3e312a2c161ab2e77047025ae6974a2ebe845eaa131bdea4c6e9ed810289f2252fffd34ec3f9f7d658ce60c310428bd89cfbd6055621c6b294ec03b835484ddce61443ef936898d903bbd010ec7ee6e7ebadfbed7f1441e27b7878c9a06ab90f3f6c6dc5713db65a65bb792673b101867fecaed7ceff6bf00add8497eeb27c09c18aa57c35d1923a2dbdeb4587c73586f063440bc84a9d09b2e4c824c34fb57db3403314a2a4c19960c5e0b5f2543fa296b812542384acc673db0b982ecdf2b455e2bee613adebb2ee57df81dbf122a0745d1d53c91b25d506ee84ba9bb523d1609263138e7bea58e255549a6ef6d8e75d612c5922842a1f42a6a4a2ad8eeeedb69f2bf7c5977f9605877e686130fd2cb4d27f70ddb562cd2c9ec6e64aac957c44720ae16e7151b421d43dbff2687e6626fb95e311e95f33dd2b10645b38cfa6ef93d817a2c96e7186ca2b3095681798ce4cb2d4c5ce1c2bc5332e8b40b93a444c240df06d541963d52daede0d6d7dc7ef5eb216a8be943eeb7ea61cfe186097afaedee9f40041efb2c2a1334c2260f29f10c35112c6ed8b58320a0440bccf71f1bffd3b6ceb79792eefb9380fb8847bee4fe70197b6dcae6fabccefa41718108cd89b00ade1794cb35ced57f9d0b39196efe9a4654673437a4038e8d9d1673f83b683c3089827958a518d9a622c96fffd34dc20020a2a4d843d0cb00b0c0bd9f25629746bd099143b5503f3eede03d379e47c9949e470aec0c30441c0be8e7515e02273b7fd675a673c0e8db30d7ce09711611143b6de95c8c077de05690c6dd316f6252a64a426289f48c35d901114cf90d396a4fb43d73241afbda52485c5355f622895ba3cbbb5bac07765b044c2264f8866e997450a38cd6b1c234723832dd0116bbff6056ab28520a5df4ccc3377ec8398e2cc5c0e6a1dfc1be3eb2e3d07767c58403ffb4ad2fb6f84a53f3f13236d30a592da6597b0ba7bdc69264477daadda5e5db302ed548dc12f794f24672845c177cc21dad3602d213a9eb5e0caad6a05ef61d3664ebc9f1a966fc91f8d0587bc5b1f71bec8bf25d78c337f98b6ec32eae81630d92f45edd9a1d5971d643c9a190af430cb6a18749fbfb210a0ee793a0765d7ec4bdee7763ed62f0fb088dd95e627794338f7de2a0084c2701d13e0f0080ac316be16764c62c49cb538421f6ea17e26a92cc3ff3d55fca44b99715b6569f07caabb74eef9b776f55f6a64b870e867f9377faf97ff1c6e987c3adc7b8d224f4e81a3fdf9311be56a11166f0db4e66addc0c25d243c8388bdcb76f5255e78ffbb51773520255c0a744e2a7e56bfd8a4ab3eaf4ecbbdb5a6d6cec0b1909bd924c269fd6fba9d826ddd7984f8e75e21b3ce036a96f98eb4ff4c072ce2b42ced7421a34d35f4e31c8a714a1bea3d6ace450642fd8f1f8f5e47a054bcaa78daa24242e1da27bc7dce4b5516472b4b53919f74217c0a34b3664cf2946e180801ceddd85c177c981fea63dc3022bc976d527329487b8365f3fdfbd691e792fd3e916637d1fa6f56cca6ff1225ef8b388022f7a024e4ecc144399b1f1b4516adfdde4e062e873a977ffaea6779f46a7b79747829663b73d2dc11cff27950f2c8229170fb1cf3aae43ba9b04afcaf86f66efb99a37b89ab5dbab541401bd27f4650be9c5475ce6931404275d8e5b144f8dda52048efcfcfe54c9f2f8a06e01406ea585bb4a0438d3fdeffb03313c82afe7ac06903350fc8b7237e3336d51dd84f20fc5eb57c4a964cb0e5edbf55e5cb8e20098df11bfd07338bb8a09605a4e3d794852ef2c5a6e49e2e744668a270103b0c47b06fd13c79f39f5f800912636b459cd31fa39e3ef2eb9500bc5468c8bb950f77d0f7d03bc91cd72d5adaf76d0ea33a919eb0040d654535a15ce34c42c09a8a8d778b2b1a56ab41152a787ba2be76b9b54ba4342b61b46024d38f3e84270bbef334e77d09064f09339498a76d0e809da250f4b5f3cc207929159ebe8623d751036ae3fdc4b5e42b3726cb37830cd35c2f8df51c3d0a8fd8e18bb9c3d30f342ea1c47f6204c1a45e5e1fb3e95fc353b4c77e33d1239b9effe48313c82b21a10d493c75dd0676f378b6ee12adab69ea37d7a24bc66f262d1d6c2529b3ed5e0010679ba7ef47c1c5aa0c18e5d1f43973fe744f7ba4da187cde31112d2d78dce8ac142613e503f4b74b20a7b2743da2a830dc8fe829471996f29b05340be772cece75fb7abf9390fea5c63a1325cd51fd1a63695364886d22032cb3c11a7d15285252a9318fb26c0b1aae57af3094a18b0be8dc03b385efbb81b3d7fe8d0592661f421f0510e6b0d4547bff045ccddf03af0299bdf1e11390fe3b6194951d49fd1193a71ea47dbbb98c6912c6bc60e8f5f3580826ed32980ef8636d87de558463bdb44c824dde043d484ad48f3303b99c3eef15296724459bbbb857db64f1e0d078c392bc3ec5fb7c3be12eb4a872c1ca33cbada45d2efb8e111062eb508b683dc3bc5a8e33e2dc807883c0b7fcb11c2b8ec1e5b0a337ffb3c1c0645f2c3fd3421ce536438af44239722215f41e7122b9624de9fdfa21818871068cf7c980443cf36df230573311fc882ffa10ec404867ad00728cb6d0c97bdc3fff0fb5331856878eaa68e108a46bd3f5cd5293a9c8df6e67a969ebc32f4d7f78b825290ffb4cd07fd37b350f44a3f8b578b5e1e11d4cff1258e28f9682a3fddc9a57c8fd24e1996373e0fb74aa7401566bb4ce9ba74c845e9c5daae30b0773ef6181735fff120103fef0955206f985299b8eb7effec32ba21993b2fd5de9c1391bb2da103fa6c91461a3ddbe84dcbf20ba9c85402dbd90194b48a4a03bd311834ef71b9049db22e30c69693325511f7832cf61c9d9b635166ccec60af5d2e88620eb5aeb82080520cb33d244640106ccc6e1807abcf07f10cd3c7a662998b6b34109b496c3de7259b2d5d4204a94b2dd8c4af5a8d90eac6af9b785de0ef7cdc9a1aa90deed84ef69a4e23650348c7ec5de0ad662d0c682cffcfa3afd7eaf3cc40e094a1b86b6b841123ecf70b9ac2f48649d7d4fc06c60d1ed7142d463e912ffad3bbcd2ab51c217e56367415fd2c320640369f4eb02e5a119bfcfc224b44ee46e696eb59fa5aca54be9a3a914a251a578ff753980e05440c26269bf22623a753302c54de7f8c0e04a2adb364f11476e9bc9d8d39d2bf826e0edfc56e676f6f5c928676d779bf4eb415ba87c1e1ccdf3e375bc24ad115fc2b90fe3174bc998e74072879a9285fdb853fc642f948293d8a16f4125fcd5ee243480c962650502e8c2744f9b8511a1e89a406362d9f15e135185218383b2c314df4fd8e7496a3fbb7ca0b9e842014264a2a47aa2d58c533fcc00d9309fdec7ed09148a62fcfa9391ade43d1ec6c7ce2460723b6958c9501ca47ca1114e36e670dc6fd8c8c9ca263014d8a5890d31fe8ebcd19e615a841586308d1ecb3a46e2c5a9646416fb1b9a9e95c0050803a81f71e8cd7cbf2eb07d3bbc1a5cda2f9855eec976b45bdddd71262f37443d4fba90bf563ae8008eb95c9f1a6a44d855b7a5def6d4f5930b05c585e7296df214dfe6d7ff7f8a33bed0630537cff9e73f00ed371c223283208a2ef1e62214eadf2bbac5b29e4c2d02efeecc0ade1d151f8b16718549f877d4b11c70e37b0da648811d6a58d8f2f7cf69662c80c3cf54931b278aa44e8c7127dbeccf7aa949e47d721a41aec67f86cd27944828ae92cf65b74d3e172444d9fb95ff5e6b38f4a37f83f91b328d6c4cce07b1438fc9f7062a4bfa45523a44f86c2a82cc0984891ab5f810939698ddff77a2c658f580cb439fe6903c0b870221ebb5f448a034cad0603442fc7f8aa42dee13deb7a15a7f9d4bff527c23ff853fb3459195a12aa87d2994238c37053f18b440bfd1ede2c86f589d13378a73034ebd4ecf4e8c1ef2d6037abf52d287246c7f90115302258e6a20f52dae4361900f48c3b519b9477f9045c6171aa72ffa93a7d20c04828d078fcc227fcc47c0da39fac8a5133e639c606e6b7a32b46d57b6733d7d4202aa1a73f0f72ce2457ee12fe2fbe2fc26c3d28f14b2ccb30087c56b9f47b62792eca02f7e54137583c6353c95dff6fe679365de79e211b447d2eaa02da584216e63821f73c33b3acfef8b1a7a5b1ef6c0ee712f7dc31ac7b308604dec8160759c1a6880dcbe9be5021bc93755854d9624a534d09bb00285b294d1452348141a5a148f33ef7709417a8e1c6edceca2fc2796ffdc708bc22d730aabcde2388603fc50c91f40628c5e2cda118e47b7848151647ec343cab8683d2a7becdae4c2fb019216cc85826d335b0f654352394346bb651f08f6bba9f137b793caff3b8373b1d740eb28d4ecb0cd00d59022c357da3d18338c150442e2c416d7bffc1b70306c9a2d2e380006b09060fc95cb381a8b8d990f9bea6d7c43b1f889b7a952755b69abd712f51c860de01e949246676ca91ea30c3a45ddf0ff4442b59e048e5bcb08a6b01972357d537fb8d1f5a4fba8965df2d05f0cef9a5255757f36e2fb3f5dbfb8dc8399fdde1918b559d3bdfa444785ef499810986347afb867eb766a01439e00a20b00c634eb2387f29bf7588ed78a2091dcb54c4e071352c5ca7dbb1ed41c63713982922413883b5c8c52e493bf2e4540886b64eed48110e01bba10d32e7a150f21ad66aaab2621c80efc7918b3914f7ce489aa0d592e1701004e784a8f93766da0f2843e8076d6d47c18f21cc675818b1e35fa6ba0b534910d34d2e42884310e73562eba9fd7d65dcc23fc43699a87173088cdf5499963b754ac9a9e6cd7e98aed3716eae1b23116e29c370ca65b81278953bc009446f2cc8ec85a7957d157a6e05e9585abbb926552da170a3a57fd3f09ad5e8b082c0dd7f19416072dc390c1131989c0c9f8e699b5ff38d611d27f5a2e532b49594a4a5dac06e890be23b306ad22a3a38ffa20f0dcbd6a0136836fff99eb9248abe3b9cd128676ac3950012bb6b1343ab9ef40d26c4a59b9c0131c10a06cef5d6f1c37d0bedde98ca8576eadf9d1ddc21b11a7f2198477ef42a82cec0f703a2bfbec57b3ab64fbbb7351ff071557ab05feead94bfc1ced0efec90df304ffbe44c93c3530d449d9651471b501528f3028b3517d2e45d123aeb6bf4af766f6fe401d836c121eb32d523943b5a4f561d350ae4409d30492c1425ef742f52fbdc2f07fdae3111b750718ca49af7ee67add4066baacdabfe386ad62c227940bb6237ff7773f6ed1554966f0df829e808bc7ae42226a5223bff04724b1618c4bdf9e562bb166bc17ff8cf81fe957a5979ec17b7e5488f625049e51b87f7d2a5c6c4ea886525870046b6bb3ad11dd27e8be75184c610f0b88138b85d17653e17688e0ba97274c242a4f9fcfbb5bd2570ce8662ef867201ce1d8bb05b0ec4520f42fbd6072343828455dc797066691b8f6f85e8bf6f3cce9ccbff35f4dc967325c33eed6a6bf9e8ce953465cac5cd4aef568aed792c59d482e85b414585815cfda3ea1eb9f82eddf0439baa375ac2b9bd47423ed9360a792c311e7ce9bb2e2b35df8f2e22dba0a9a1befbf77a4152adbd984ea71f26db47210d5bda171c960f53ebdd5c42f7ab7732cd7ca838e1b7d80eade188248565997bf693ba8198ab64a3c0bf867c7770298ed4375b1b43a58a0ffcf7714b15d905c7cce9bf502083a8fea1caf754416fe2e88599aa867127aa77bb3e3c74330ad08cc2a0fb898e6dc59f06fc7422500b7c7670d794665db97dfdbf53277da5b49e0df8797595f5e213cb4036cb541e6ef82b2bd3218035f66089842a0fd3c339dc56157fe9bbf10694a7033bb11100ffa2aa547149b37a960e0156f8a4ca52a05df078662b6c048963e2bb2e964bf8b5846e4751ffddb373a20d4a7e3fd3ab923dbaa9a2fa48016d352e02b09ef0455c73f0f06d6be8701d60ed333c0bf13dfe1b82ba7810e91804903ff8fa133ea6047714d82e74e1793500a4fa3e102520bf74ae7a644bc29eb064200263447ae92f243a6744c6cdc440b56e15a57deacfd6f7bfcb40239c4559d305740e5193f524f217f5ce43e8d85866627a4337318e3190f9f4a1c7364f083e76f66672fe03a0a73b9b26aa45a3cd52d99ccb9aba277440c1220141d23964193b0bc12c06a227fe92f2e73aa1bd0fcea70bbc53ebf34c46b68acc6679c688fe6038892d6e1d605da889f539b7b7cbad646d72f2d8892b31ebea588965faab882e5bbc056b0341243ef1195fb716f19f0b52aa37d40307a1bb7394139026c11221f989c0ec2a8fffdeb1bf8f7b3eb2681343e93934a89df528fec8f40334fa75fb6b7e71123fe3240108601e7351a6def27fdf88ae45e962022d39b9e1dbd3ca1bf4fc67f4fbffe59855138f6a63797f9ac30e2ba7752f8632f609d9e243bd365844104b96b577aaa265a6267af55a7aa24286fdf01d8fb37a0ef1db2de1e3d83f9fd8379a00cdba2c0e57478c953065a4e5698fa583c2433f8f289fc47ee39a10bcdf67d64244e9137f9258dae7f75499904f9d10aa1c53d1b3be25764c8078d6b6415be28016b14d02a3f4e443a42c885b4161bc8cbe8b1baee76752473c36fa3d0ba085e8c2e880d105db6b08958607674f58804f6cc22e1d8d9b08458cb5d1ffe016eaa40110502f414aff45e39197ca2495597c81ed073c7d3933de17fc3b7ae704216bb607fdbcf78adf807f94b6b9081583954eb4b4cb8df945bf34da40d1084dd66efda0f3f433ad3b4ee9e165399c7ca792c025619b87c73160c2b940f44275b9203bf428706776e05fe3a37c62f6db3839918abf2de27c062fbe335141a43e26e9f80ee58b6fecb6ed5112d4f42c15762deee22f44611e5df5c88a49cb81c0d47038d932cd453f9b767f86387b2bd2c4511f5ee4b09bd1e5c7d35e4ccad0b083a89f5ec0130a09a93d33b2be47eb35c94c4461e8af51fbba6721b7faa05bf82a8231197fdee2320cd9a535f0e8b3853f8876b6a6d338a0e16f329148b1cc3f18141fee5477f969497c92385890d4a98774c48fb2ca3bc76a0512ede4dad728594f44744bf4010e24857b326709ad94808a1c381e57492e5082c10b4808143516482043c58c4860b36ca60809ce59d6e21fd77bc7500962f3f83c6da5d7008775bac24ad32d1169332e4955d7b95f318e8a04bc900871c30e6f77039b0a167d4e830ae65c7b9ccab34dd7d389f22765b97c213dc4ead2e33ef181ea5a6e8d13b3e8aa512d5a58d9b4584fe700f45fbf955819c2226e5c5466f4d3a25cd4c7f4746ea57cfc50aad68d64b3076d7a4c891c5e98a10391b2dc7f814d417b93ae0c1a9fa9a9ca9d420ac7f7718dbbdbfacb5b765003496535968be0fabadce84ae3ad2a2c9f5bc017a86a9628a35034da490d5cee954e31423c78d66e96182bb3b73f0af0036565dbaebd8becb597812a3a15aaf1f5c9f9ec809ed2e3f88ec2241a6362140f416973c60f33e58864314ca9956628b34562a63c7c23c81fe53f916f633951d1a6dd64843ee0dce4f7aa80f9125e6a50aa41ee87deea95281545d06018674d803a4700741fec570c016e517207a6d37616bd22a23bb3287beb101dbacc9f5802002641e68dd0cd4347a5559af124067584e9877643485c8591722b94858bc043dc20d180f78bb978d9542029089ef74d2afdf113d2a2a27315ed36c01b1924ceef07330edef7ba038c17068e118e01fdd045c0d988447c66a458661717c9efa843d5060b7622f2627e4d6f67e7b1b802a9433d2ef2e17a77485976af9222e4b69d21e90b529970e991a00d91519d125fdfd62d080a7d2926a4067940c4959a957404da3f363d91b61da2d8fca69d0aa7480551e82b8d602ca0eefbe2809bbbed85f7f9832e2f0aa8ae96e8915380bb2fe6dfd045bab23050c9e9d1f060657af531a041469b214c8f28f328a1bececc8fcbe44edc4875b057fdb69a089737ee30671132c5785d1379598861e16fdd8c6621f482ccc4b19f241c04161ae074492fcb5a3ff65cea5eefee5cffc3b830b6e7c0c8a0d7af8289bfadb09231577ba0b4d2fb905b1e46661a79664ac796007466b8c7963787c4abc3613ebcd9204495aeca319c909e17eb9c3cd81256d4bf0a3032aab11f70b4331462929d334a00c9c7e0f7c2e125c466ed63149b19be8ccf5cbd2319ab53ef50a0a739f075025b0036c625b190383793cb6a24e06d066e97f541019ee2b41b31a2a239a2f6d0bcee712437eff5f94ce21c9e3b1b82d2e454969df244812ea5b69a03e011c08beaa71feb51501afccaaca150af8979abdb346b7581d1f95528c5bfeab00f4a06d69f3fcb1d8a573d05faf12a6ee68b772b217a6f5f18ffd9e8f80c38b6bc7abf958439d54d1778ba1b0bbe26bc1512312daa200e523a8987e8c017097551a4308304abea29de6ee45b563faf2f5f75892c5bf9f9ce75983c9759f17030ae0ccf6b28060789b8ab2cb0fc616c28aeac45835a398f0c0dcc7bbf6b33c88029e5cc7da1761b6d73fbfd65e259dd6fd3908580e4ed0199a69bf944d2aea94dfe27edf2f2f760e8b98d9698674e1eeee5862f71e24ef7593533bb6e3bd1b8d0bf07ade438ff3f82d5ac9e373f2807c2081e235b9e4bb92617e222ec4bf0903bf538d1769c7c426d10b404e30914e86c5bc899531d5ee593509762dc1cc5461750c042549fe743e1e9ec70fed3ccb1de8e43131ee0ece883ff9dfa5927aa0c485776863c7b5f2fc6f912b1979aa49044806a8b43f1b947106d9a08b6b27bb5881668001e4277d2da3925d3682d6007f19e0f3b3d8571918b7a652235f5d90a186109e98d53d8da019217cc007719846b48a3b98b4be39151567532dd32d9c33c00859fd132e3f2a4c5e327626ac7c604ecf07328b413d9c93b1d470e4fe21ecd3dbef6b3400120c60842946fcd53fa144dfde00b2f0c8203427d7f88bd04986143cc633971b2c667e36e9d9bf4d808464c496cf82ca93fca40cba3e63ebf893a495ba46c419b4f8cdaf964b69dae79f897dfb2a11cc08bf840ccc5494ea9f602489a714947d19ae479f3edb0837fb9ff83814fe1990dd5563b9e0aec7d5751e4e9dbfdafd70a635a6dc6d9d59816385fafb9b152bd04e69bc6aaa3cd32d2d064b6a6864a873335762ffc298315442cee4038ecc5f9e7ab3a0d620b2cf27f95e1b66087994abf1d0055bb97dd1d3edcf99dde50dfbc7749df1f1e4a4d68946b0d2da67f7404dd1d8947b6183936dcb3b777db723a23c94fbbf208eaf5a65bc35aa9770ce67e9885e6d6d3e0bc5c89261ed302fbd24cbe7225cd3127f6eb13443001ab4b9be680e8dc81ffc03ab6610b3a23c46969aaeb5b63df4559d0df53d16c3cc48cad7bdafd29b30edf1278e2a2d314ae9fd13e6b58c92fe95e4670ae9c8eef5cf52af71bee3921f16fce53f426614d6daa92cfe2bbeed4faf52eb9a37a81b6a3cb3c0c548290624697cc4215fe013b5061686e7f918028697941dd3bb47efe8b8507d4cc8dfeaeac7f9c7002d480230441c746652559af95bbf3ca925e4c20d5a2ce913fda3a9a071977f2ecc9cf39ee98796df929a26205bd1f43a8ebf3f9334275e9821008db4bbb4c4a8f0aac0d3e54ac0e76f99a22868e62a7d7096195f4bf0d40cd2ec46ecfed514172b89eb63640211a146d3a0f8cfc82b2f3455afef2c1bc0446cc5bcca27a3545fea4777ed6ccb399dcd719d5f5a549b8b5246e6ff81450ca5fa047de9c6f6ea8f93c543596686e2a08fd86466d9c58a1d6babb45181a6d87f433a271839c56a33c4c55943ec7f3115c7ff4eeb4ce04e76be29c56fd165f334602d3e433385e9639eb53847cf3dec9fd0d3b8517156a2ed97ebd5d994d76942f6c57d9e86f8b740c8f93cabe45608e9c6479be60fd8db0576cc95cd06387b19229f75bb82c11fd32996d128046ca12b657fb7f54b91dd2b66eae812bdf971865003737ac07f953f3ef1c753b223c0635c23d0e15fbea0088748b3860ccb54781eb04b4957e851646e5c69893e2f3bfff7b3221dee358b78c7887865d51bea7f37fe10b61f13726acdb994d0c554d43e739d131194b9316286d37f3d2b12e75f65c228a72b4382e7c383acc4b4b670a2d9287c4709ddd0f8424ca6b83c8336270f417fc6904a57440162bbbe080a1ba034e264692c2d298d5b30ff50c1abc5b911ae11e34cf1e44c9a7b7d633f5e94950463328ac35afaf3e7fd99366d0fdf57979b7fac4441218630a7249f9d1f27872ef8c7972929fcb5cf271fd3f5f986fa394878cb649c1114a10493342fd6a0356fe2b152089fb30bb2f4f226d92f2ab9d6f938a9dcd487ff9fe624e49834a3c527b5434da89df3193568cd524b6ace77a4d69f6d6e14ea24e87f3093c1f438a3cf267d85b651f1d7cfd7e5a176c9f5dcbbef5805654c9421e6380597ed0d6912b4ffe88e2a3856a133d74a616b7ef75363a9cd472ba9b17fc2963e89d6146700b3b6bc31069d993f4d7f627b654801f91730677a49295aea30ad746b1fdfac6d54ac854665c4ff5fd3de3b957abce291f0fcc2ef47c748301ff87c15278dcd4c4b0c07510d8bfb400856248ce22fae0b2061aaf00ace98c724410cfe3ad6068633dc514a80652de101b62e77698a7205214a46045fa2eb18efcbdb865815c347f0f7f5fd1441dabbc84e62000c200824cc1e5c7ae60bbff0f3a9a5f566f4e16e8593e0896c4c9fd99a528f462f00e86435121bdb85b8329497b357ff1ba98c06442b963fd05217f77c914542f472ec8270d17aee2728b86d9aec4cfa479a513e2c6698740e4a51e8b1dd66e422c821fc12ef03fd3a6ae0ed51adf6bbec7e5ebab0abb2ea26db200b7385e8b4b1f4efa0576e17469924361114d83d3591bd6ee5c8743420b986c96356900141d76d77200252e40b9d25f6effa02483730ef1514f185d18bdcd27291c3c31a2d5dbdb2f424fb3fa15b24524c10b6e6dfe114a613b784129448ebd9bce38198714566d01adf2b35f84b249efe9aa551f41487ce3ea179a7afe7fa990f8c019a6e47bca1571576550d13c68895bb4c3f4e5b6e90d2ce3207cbb9225c6e3d6dbdf3dc9c0ef31b2883fbcaf384243ce5c79cf9743b7dd3be68c81c6fbee822b4400cd0d49c871ac42b108953ef2d606f11a44816e1e02910925dc6a4c45513aebc2703383485312dcb6443dc9417aee8a5a81f10611e10f37823281b67f7b47dd20e871a0af0694c37023a4f4e9a4b80d83ac65d73d63043a701d816be10a86c8d1c0d8c148451dd8d59112b2cfdd05bfbd59c7a06f56bf5c5fb2db886d7f1813331cb1d10dcffe6a3d5410edbf648deb31b84f6fa458daa811e604e69b338c6507f22fea30b62ba5bb51ec018dee398affee7f7ee0fb583501c9ab4430e11b2f2bc6371e9797389b09466118003d2e78d01009fa6f43d7849eb21ad8d0e9b5bbda9e9b76bedb6235f10b473cc29c1940c2db05c56e1130d43649ac716ed5fbd33e9edd0075cd5a246922a786176a053f86c537d28b2c9efbdf83ff49f29c480676601949c17ba73d68117853b6b2393914f46cd9cc80f9cf268fb2865cbb8ce13f5c26518c384a47b4ce5b359cd636ab32170bb27933d0b2477875e63f85a4f93a6100d68d4636443931caa51b9b399f1da0d4ba3a006e9bbcf5c68cfc0ce020f15566100c655f23846637775bcf822f2cff7ef5d0f5b1a05e072efd99ad21654d244fa0d2c44f03515544a664481c19c8314cf21774cbe63f597fb3bd93c0bede86ea43752355ead639f6b757a0c4c49f6604215e45006097f8c53a305df733b78dc66bc2ee2b849a5c07f5fd7b34d3241f23c924f3c676b1a41a291742ec9e247dd135b769c9b7b80763b827b37863146d9f2f4f13ef907957c6018feee2dfdbb1f0684f9ad54f29b913a95187df1f18f06210edf1c2630b32077535b95c6bc3bbdcabe5ffc94d01fe75d06a289fa988e2c9e7eb5abbef930a26de8b34ad5d5c99a3abe734a2eefdac7d974aa736b00aac8dc3d960f83c95dbfc7fd409f4e0e2e3da592b4a34bcf02ce135804ffeb8f43b78cabe5992727eb1f63a0a913736da88e0a63edcb1113a13eb7136f7ff46119b5ee23e8d47822da8eaf8dbd451d3b9a5b6ff5922ea3b782ec002b0ca6fa1ec1bd8b2aa972e27852232de5cb4fa48a2979c6eac1449f67b399dfd8b77f02a792ae66fda91a6c6e817888a140af0562002e09e259b9db80bfffb39d029865fa4c558945c030f507f037e77bfc8443c8d800b88ad1c13d8aa364cb61040f8d010be7b4c893783a739b3c9f45dbb119ccdd9e456f11c553980c8bd107bb853a07ff9b586904ff24eb1c4655ca8d38b518e42a79637852ab9a573236d726cdfedd394ac0589d13c0f3f78fbc203b8d19e77b53234dec118e01fe42f687f4ade22cf3a68dd941b62e4c5189543a9f4d05be7c15553f26039de84f173445e381177c3a8c80b1a5e0d13a585ce96e50b53adfc8f109a9037137ca8bed5b8ccd46e85302431b69b6fa471fc1c184afffd838beb4ee1be72ada88f63970e140adacb05a06ede2ce04a9538ea7fa07deb797c4e6fb9411ef805fe9b287a663dfe7fd2bfdc0e61e8c7df0e113af9c0778eac0d63449830aee78f470c946f959b7f434c741dd7d60d2560c7508f78cbb3b67acbec486f95bf13247273adba2c811a61da87dc4607aa2eaf7d5eaff79589ef82c1adcaf788fdebf7eefbd504a322a6e1978a095ac2251ad6180a9bd7160db953137c380e5799bd610b5091bff36498a86fe07e1dae6386f097987d532476a70b6a51d82350b2465eb06f979c3adf4fa1561928243044d069288de875a12a73249d9dba92617b389801ddda74dcd00dc6a1f7ea1c3faa71d99ff7001defe445351c8eac5b202811812655558678e2a140f9dc2848cf0f79254e499125e186641ef3105815a4313b1581bf813ac5bd37a3a0ed3650224ac97739278fc967b0b4113d74477f80c94471fa7ff8af9ff615429327c289f3a1757874b4320059fb5296ad3c556623f96049f42b0500fd89257ae145396e03dd5b2eb0f0a9ef91d3441cd768956d4c62ae305c08ea7f01524679b00a5a15ac251b74cd223bcf1bb5805ca43e071de35d2fc06b48065c6002397bd4691099fb513837e21af96c2cd638c9d49f1e8ada14233c600aa872e8556a94890b47d720684df826344cf1c0225107f9455d4c45718058dbf90b61850a4d7f57b47a3d25793f7ddd1dfaa1af03f53e521304cf4a63d4259e683bb60eb00aab6a34bece0b5785091aa83c874894d2013ea5950a185c0807448a62295dd196ef1154bfc8977f788ea8be609b6f56415c7a8ebf2f643350b201f1552c4720f053386e55966dad0fcfd63c5507a029d81b38ec0c5b7e90916adafffa7318b086852a36d2e9e963ff3ee9a0b3488e65df7d894391093a37eca543fe3b8fcf48f679d087971267014366e9d51280d2c1f1d56c5cadbed0d1100c874151ffb5a74723abfe6bbd7663619d5375d22391d31a6a3b1f6cf5d240db5b9bcb36fff0a2e7dc1a6d39bbe275e1f35223d63efd4d594fac050e3b7eb79bdc090f7eb29c666c7fd4d76bce22def7d9218fa12a75344b6e10782ffc5e1339e8c9edbe6912fc1f361748f03d56a323249e539ee7d28faba7e5c639441f54bc8ffe97e5ed4e10939ee7c1dbd3fd011f4271dcd7820d56688fc094b3e7d44b0b2f24bde3fbf3234edb4c93f920f4889c7e09c1d6dbdd8a138c638ec4e3a52b46a831e58a647bb2b4ca49cddaba301b848229e8ca468c449fab73d84f5744900bce98bd289fe7f2d46158d65e16a0f925ac476f6b46bcf52f7972f1d2477de2a63d1f9cb9769fc40bc5fc8440c458a18977ee00a1805a2015df979d3ebf318b7df485464e9dd3613b86faf77758f612d26e1d50bfc828cb0c1da1c6ba6808d725fae0522f243fdd5e97bd6e126fa56dec82b32a690fe1e89c64bd0ce42127efb2882dee587a3669846c094acdb8543d736f71d7363f2e5c040c53568bcc7a49520880f8e1298c2ac84045a2e96aa33ae886df5af218031df576a3889ff15eb74d6ad179f4cfe53b9ea2a63b3dedddcf0ca670a0710c6f7ae5cd6d39a83826bbaf041f2d903a7390df630a4b52ee5d2fbbd4e0ed45c948df67970e9c5905ab16276d748c66e88538e8f9ebceae0fe5fa734a75d6c225c593bd88232595521695a2f94d0dd431b924a9c48f50144b7ad3019f03d771efbf5a9ecc54e9a7b951aeef263584de89cd527a4df63a7fc0a422d5ce9dee34af6ddde3c2bd52734c37bfc94a528806e902850a3986626ad76a0ef76192c18b56c51e25169b2064039148e976512b26138fc9359ba1ef715e1668af3a67bcb4b572a34894b07270fd46dc297d75123180b7e4317723f80ab187fbaf03387c7d0f2925f3ff3438c66f41672b023267b005ac8fd5ba782b7d9cfa5841c613742d0cfde7f3bfcf2e02f5105612d066b5f395de08f001de20d420de146663f7a4e1b537dab7b50086c6fad3cff1db89274fbd07d6ed16aa6dbd2c5ada51c0900e04497a480f3d9f54acfc3a38a4bba3af5495ec10c5a0cd3a686ec3efa0d991ddcbe3498e9f2a68c254dc4bf8ba70897b1e94f399cac4cd8ba4e0bf30a4055c596b2a13f24d0c859c1840393a562ed65039e606b86a7469681e436964287cdf5abe48e5ef983d8a086e74b2b1bacdf28c6b16753990f6b054680e9567b507b95c1e45ed43334dcab3f3e517a9edd17e74478a8622fe511ff758bbb30e8e625b00ee0682cc4cb606000ac68ef45677beb04ce32e115244daae104bb76c088ff8f9d138a3a46e43942ec2740a2289c6308da701a72d481274f10c4beadcccd3a4540e9e9250be522a857ed820ce6d79788d1359d609e48ff3d63d409d0027f0cf15169a6f70f24d890f0b7d7bbb16c133b23215d5068998480b4c7ab2589744f3ae45d92ba94e4b840d40e256a55c0d27c089796f7fc101d457699fbf562b2800f810ca45b15aa1092e9e15028b385a389268199493665628a9e32c54a5d9e3155e7b768bb33169f5555755cbe009b6327b82aa9c4cce11e6ca43292e3024b9a2f5794904d51f9994f851c58444c4ee85950120ae89a64a209fbc000b441c6b18db7856d487f7d7306a735dbced1af754f75e8f77d93426fb17badeb80e82471093dd8d339d9bf11573a8626e2aaf4af97a5ea612958e33fb702bed2bb43676b2070582b580597454e7e98583d6fe58c375aa5a2795e93b96cc3e001ff2fa0df8fcddaae70a1ab9c15d6e352821f3d7e4d4f2ece6646a65ec992246b3cd5c7597c084bf4983a3b5ecd5d4daa7df568856c70e4eff6063b673fd658bf16ba31e0a10551c33cae586ccb10d42c4269d1a284981002c3eb143aec6b705ae9612930ac42d42ca13897515d613490db1aa3f8c70c3975e6de5d59023b7081a5fdeb8cf92eef40fbff6f71bf7558542474c6cc60d603ece3565658f0af6b79d60aaa29986cb5281f6f3a74a3c705efae93cbef884949a9ad8e19212db2390eb8138c41526a79259056b5fc91a46d74467f66541baee1552ce2c149cbef06eca698e02711703700c72c2941791aea5a10d531fd3fe435f103ba61576353f2324d56d61a205c45e61f7160420c5dfbe2f9f65bbea15c6a734aac427fb7b0127830a105c9e40b226ac4cad7960c7c58a31cabeaf9fd58d73343f44e6e5c357ecbc4120e20959665c85bd25804e3d0e1585abb5b07ec7c56c953ba2102b5cdb8afe8686c6e9f8ded45b48c4b940b922355bf34e28712855a254cf75a9e67fda3e23da0baa928ad0de644415c99ecbebababe8760a98ca1032fce5565cd850f0004e8c2f3f26fc57df682f6f9583ae6d51ae31e146cbef89beca4a82d84637f800b5f2bee9f89a874cc77d73ad031a3595de31f99187de9f9745848a150e102fdbcba400cdcddb91137a9872af7044280f1d0a946a2959fe9867b5cd12e48f0ba9ef02fc31aa01f99ab318a39d5c4a59948590e4ca9612fd7c85485667aaa3f4fc21fca999de9518e1b60c0c10d93c334e20b0f4053181d07985404854aa11b7e9b6dcfd9b41bbafc7be40b3ad194d029b75a0b08c1eda23ccd509b750e7466fb29df09db370ee61797002d00b30d17510feb87c6dc12d2cd56d5efd153bdff0af430afb56985b85de829ae3b6bae47820bafd67185f143f65150e67c28d4625b5311ffd26d53375d2135d27f602143bb3e33cd3e38e056b6ce97a70b9f5c984cfcad11efe1ca6b602a5807309a323785dc491a56b0b14b802a995f1b4d4080e7a64fa0866c0a5fa36fb5ac7d6b24f8b5a742fe500be2dc96674e826b8783e5e692b2d0c5e7b90724c71b823424a7bed26eb9ad088656f72bddbed0d612a39bf949a18f6f217863bcfb27a669e6885b6ea5e62c1898c2b3d688f73247a74ca1a328e3825f76f3bb80fa97c1897f21ddf483967db2f975070aa3d38e22cf72e638751ad810c6e8f60f08049079339f0d71f383582cf7fe0b43ca43bef3b726b97fa69b4c0411d2ad9a087170c411dbd7cf71ffc9844c4d12c1bf38ccedc4619ec7c1ad41a368bfd0a2f99049cb448c0b5c29c7ce0f7bf958900052f4816ff31d7fe6eb2ca8142ebcff9dff860c56eaeeedf89e5efc6553e7a793eaa72430422d1ac5e9005cdf5ab2b654caad56ac4802bfdfb08e39dddf90e5eb040fcc5ef927cd4b809d6b7a76164c2aab84b651cf8e234c313d4efb6a1fca027b493f43e5b8d0c0a1330d185e0deae495069f604eb8edb66910d88baee181354a2a39d006cc0167ebda8b961a8d2df23e87cd94b90bd37ea14e80655626e1931cf2cbbd5983db0f66cea7c0e38f0ead245d9ad9fa06464569f4e22ea82973ddf38ee2694c86552cb3484bf883fd55fe00bac26880ec4c1d860c85fb976e14afcee7826d483fe53efc18c5d0ce0458cd2edf2b7f3d108476b3575ff5f79af167898b9ef3201167776c68649bb8c3425fb414b8aa6008d09ce60d65fc986db918f47b45cd3a7114d5e45f15dc6302a6f24e87eb5ffd4ec3252df373f0f4eedef680b20d21162605a240aa147cf0ef9f2fdf5dad38d99fdeffb71f26162f39eb81a9abab8368ea7b604b60f41823f9ada52463d1e5e6973a60996967707abb0be6809b763a62b501fc68d32a596855bd7f39046aab4dda6382a277e54aa0dbde3ca3556ee867fcd507eff8bc112906fef35e6dbcab491904e02b098db3591789dac59e9d09a1f132399ed05a19040d3ec1e1b3884dde6eaafa9f7199cfdd563f4a2f45a166118c9f7e6394904223d601f658ded7594c9f2f637bc3129a75fa42fc90aac4e8e31b080134d09fc9fdd149f0a2d213b6e9cb3cbf6ccbf42acd4b6e79ac1e75ec1b234325007fa693aebdd31612eeebd64076794d94baca1c94fe3ffaab7083261f583affbacc2ed2a492c15d67f062dd975d30210c3d82ccd4e376308b43f80524e82275d01769149aa7c04a634a0aab4a16e886a6bfacf5c49ba4ea77bd7d8245492d00c5ae2fd67112c0d0d84d3d31b064fc3ddfb01a1e545198dd23ad1b994466eed8054e05d0fb6c631fecef55d8345592e4597d8c14a11d4346b89bb3e7a9c1d0dee5d6786ce0e4b8d44934d55ba5eb133b864d45ddf3b0d5df84fe44ee834f544cbc80abeca9bfe437c4578baf63d659c26b25dadb444940d4bd45075a9ba6df8b7fc9ba3dd2edc5fea4e56f2d8b99dfafe5a93e42706889c5a238c144d2a4ee3105ea33fe8d2963fc2299255a84a83bb0180e1e8ff79544097f93e607b5dd4f0948e1344f4416f26d6841a114d8985dd936b5bffee10e8a177385ab30e511f58e2ede9e4744089ace76c276b42dbe85252f63bc471396fd43675add0eb662d45ec24c555287cc8be7cc47fcbea19491edb2a4b1abededbec294c5fe9c3e14066be6003fcedf01e543bda0f501878d54f51f10b48e8f354eb38c3636f6c423002c04782f56028e867d4f4e161d08de89cf61b57c917935394bd0cb81a72630f3fc3ea3f08bfd68e2ca4a02c4ba3093a1fb9594bc7c2f04a9269ae44ed51450aa91bc425e2ffdeb7744e852d01654541fbe68b133b2baf40f0b5d16fd927e7227fe6716546c4fb340a73ebd04d862468776e4faaa52f75e65194d9656e223ef576a3b3d968f9d3812dec90a6bccf15b056fa884c9cb46d9d6f025ef5fb5d98622dd490d20b4c9dea395d97215edb7698c886ef34fae7d539190a8c742f484e4e27e860537843c5fdde7ffc78c39dbc970699c1dae41882d8ec9e8bd6ef14b4a6cacaa1b0a0f8e2123b074e48f545b9cf5a71d7fbb1fa85edc305a7346a9619f4891b587fecbfe97cdcdd6ff4ab6f3cd1536d97a879e5e90f821073adcb63538e2054285d412b8602357502c3cd81f868866b4f1e3a3a1adbeffc718e35a9d817d3d459f6abf602b1f060861fdb863a84e4fd26fdf610a580f69df8b866e3a3fcbe52ca863ffaabeb657b547ef6d100f19707cea2a44c8fa83eaf10ad3d4a9896802fac61d51a96b2da9032d0d545bd56d319150df0d6f245fed7a2167b9b4d24d59baaaf9d8f66c1a22499a0a42e1b2697c2c221b5f3136de5160580f3873681bd4869e4cd2d41500924fc8abbe8aa42f3b5a946eaa4e77539def6677f229967147cc7fbd3ee6da1d3f5abdbeced5a2ff4c99176f95c2d616925c408d3e0a9c87fc739612db58351be4330bb0279c35ab634fbb16ae94fd530cbba40d15b292cafc1a2ffa3bd4d2ff6db7618a658a3277b54e77281996f2f5623042741ee1bf2c5cd5d983704ac5681a56ac2efc738fa974910c25487edb4a0664dfcf3edd2bf6d70a9e5bcc40d8dbe5dea091d2548b6046c3355a358abefd3fadf8e1695a47e6678828a9ac76e5116b6d76af6960d22bead1f75746c6bb5031a809f6d304f097d2805c5c2ea0c895f6077baefdcbc6b711d3558973a36ba6be5e03e7e4f68a65a09f0a54dff92c8df06070db07214596a38b7d1b1d85fa052382370b0756163f6ad80474ffbdebea3c94148a2381034226a076f32450ea96f38636b69fd0e4d812e846af8649fcbc0886bc48bc9a2bdf86227ac4165697c5edc1397ea76d19891289313549e751120bccc92ee9d698dfe556b23e6774c273c7b2f60fe90ea6332a4c6ef593e5e8f44027fd720c52dc99c6feb58330feee859b8ed2bdf5df59c8836d4517b6b1e9820b259d947e367b162ad00fe944435cc64057b712baacaa24df596a689a783e8f8647a71d214ff500f3f667d0588399662eb88d082beeb925336ce22358c46799a042e55014739af52e706ecc109f715c9e1fa54dc54bc99dcd646c52171a7fb73e3e2fe6c4aacd4c03609e375a778a065fe866f2f6339b499a5123b8d1ab8740fb92bc1f74a9dad6be2fa2056cffedce54c1439e02db2e8ee6374c29eeceda1bb6d6f8fa89668300a1d9471a058d5df83225ca78f892f9a6090a775c343a53d5427d2e2c6378a7be69536282d8660370a04a456c0923e35cc66df5713e03c1618990f993f9310a4694f347c0291dd781d2bad8cab1d09d3fa021400c7925c9b2db7bd0f95871e9ebacd1cc231b19b2de2cee5f275ffb56c3a7fdc1c51331b09583cbc91f341b77f0b5b290febdc8f5fb262bfcbe50c0a88195f17aa7632c56ac363b893adf2050b32d6a85c050b9c3d16920d207e97402ef7406ddf9e5ebed40baad1d0d96bc67b78b9939f02b46ba389d7f7c52513e5f0c5a803a0a9c066ff59e52ebb3e09d68cca706c97236a731e0c7ca439f23a950ba164649237fa833a3b40690ae14d5810b9da5bb42055763b18ef35f6668618af5107db5e599bf401b40c3ae27e19d27db3f57923155a9f1fb70f3c061f6d7d8275bde7f564081f23a4a80a74575d96815e3426d2ca11e9fd3088f442e17b2a5e7381e7d91ddaaec2fe7b3b6789c6a6513e445006b54c37a9929b8923ca5bd77f3b31f233d09fa9c784f9805a80208377774edc17383a5f5636b5f6f1a7408e256821a110cf0255ff6cdb50c70b62fe04b54ecdb3e2bf38d1e4b1c38b7ed2a067eef8316aead09dbf754d93e9a12a7f0bd8c219f81e30e63ea58313bb38c75b8ebe3332b558ccbfed0ecf5e8a27c72c46b80ef20c78b635231eb978ccfdf846ca96a1fbb5ec348af9cdff4fc8cc9f10dfba1812ace8243e8746fe21f21dd28e658fcc03ea3355f44ea23f801fe3d1437c0cb25062c9734e11ccfc0e0c696c7db41a064b65e5c562457773e1afc955af69de9593e0236e562687a818285c009f0b5027145d86758e0bb6586325d7011475dcff64a34945f198a297a97b83a8e9754711bbbf2733d4f2c2f0f57f928e36f5918b103831cab558dc7dc3f02e7ca564734f9d1e0f70f98aca240e7a063968c7b0aeb095a384bc9407c40a0e629fdbaff151564202b7deb447003933fe1c80da69ac61c472a697b8df9d0125e93d1730810d37d662e04913b96072039050a0ad36814af77129343f16690a63113985b52c20c2d02991515f8b76be50dff8d115fdc2c91d232b07a193729484f26c7efe760f06af154149cc12bf438e6610085b0d43b2408b50f5e6b0f6ea202bb7491194a2322c3a69b1a9af42b1c1f2dcd8c51f1859f63614ae507dae8ac919c16a3d7db4c33d1907e99d3406039073b9af2f2b5925fa1b503a590c2c70e45b78b44d0805f29b82a92ef4cce43c5d3da7d3d0b1bc9097fc788e2c324db1811bbe6a9abc7b2e72df3e6c52ea62458afecb6e8f886ae26ae8fdc28e55f076b8e114f5d13bf06ea717996559aed87ab91d3d772e3c6eb9033bdca1bdf96c6dbd2ee9c442f9db2056e1c73baa8bd378be395c18925ba78b5ad7ea9d4ba030b57019521666060e5629cee180171359a3e9c9f89baed61f2557aad80b28a816aae1272cbed3245ef3af44fb20f49f7cb48573d46ebb6f158292446fe19c563289b4231fc31dba4b219fc8f128812c8746c97110d6856e49e8e861b7e5296c1e6c6c28ae72c06de77564ae70f0eaf3ab5130def90805e58e6353451862b59738b1015141fc651130ec91213c90bd266cc820a25ca4335a41600f10c260b03a17bba29172ae66b4ad2db7608e40a4f2a40a998a28ab7dc4d5c31339c1f1e67dabe83ca7e44d41554efbe2d41602240e5073a563e5e96e672da2423e7fc7c53579f43e1ca5f4e301124217e467971cccbe18d3186f1b0c4165a85665a2c5cd99d060d6c8de64109dccdba67cf8f1ad1be81c05375f237104205e4db9a50d24a68e6e41a81c8e49f0f6528f47b08750e17bdae6c0182149980f1bf00bdc6e8ac869045ddf56553e72a710e01304a5a9af9b998f9650fe1d2f7cc7e6bbab5f44c686eff02e6d27bbdff7ef09adafc5e053deeb9deb5b3ffb58b1167874c5064256e089288a9ec1301f6828cb090681b07a590f22c72b4f2a8f86187d61f64a4d2b3f40cf63aaecd446dce6d5b515ba29d7a25e0a1db413eaec66a66b8521020f83f2f925a3dfefe5bd59c1f4a971cff7eaa70d25a8d08d2e4e56b9721fd9ba37208c033d2ea57149db8daeedf5448d2bac28e8e946fb2558b6dc4296cb889fb8041e8475338cc309c8d5ce9cb8c237fb61a5f0434657d883f8e6ffa989cbdad826373e91bcfb9f9e84e080d6b2482c077cc6ebafc47b5975ac4ddef25c15eb318405abd67a9eca41edefe36712f818be18d1dcd5bebec27af9a5a69f66195f0614617047cbb447dcc60acff62ff4747f1f50882a2091446542fb72058efa8d4acb182e4efbe8f7bd14d255d3cc37dee7dcf6c1c1af69d9d8754849f58c72659680f3747255ad82ea84856cd8ea3c6d772a0037444a7fd21c984fb1064bc850ced161b29326047f8afd52c8a6a75a16f6f7e5bf9113e24017a31a396617568d94bdb7025180b52ecea4bf6e8fae969ca6a84900cdb337fd07ba6d30f746994d7fb19cf16c8ab11ca61e8447bd36566e410efcb668ffad7eb2bccde34b243934411e0a5658d79266cd276a51dd1b9c007ff8e7fdbec7f4cf529a3dabf5a71c4c5e768ec0d05c1e1172230b6af0e52aa3f3bd2c13a6a9087d1e244fdc1a7cda34b45e29ea0c4f6d2d4a966e018ebaaf41b927de2902152dc47885c53f6806cb1430b4c1aba7d7c7c80522f23d0bc99949537d46106e6e5387b32babfd60affe8699669a45ddff0d1031a21f000cda25be629a99181d90cc2d29b2115732ded8f0a56968da0c4511f85e68888ab000100bb20211c6e2568844ad43a861c2022a98e0ade247afc48813959adca5cc750d48546d9608f0fbc8c114de08314a963ecc504198bd99acf493946b10467e763cbce4100767863e8b15a4afe1c8d62a7bf8b6415734b6b3ba4c7710a40fc96c6743111a813af003fffd5a64f6e59c2da7952bce0a792f767281fec2333ca274c1a8e2bd2965fc606febc1ffe423ef3ebf26b1d978157d8cc20816ab8a5e9a2567efc898a25c19aadf2b31030d7a8e5bc3d6aa3b92e79216ee18bf2134075bbf8e951a1c76f3ac68c16f3bd22966686d057a641f1e5fd1d54af5e7426eb7e878036a9669bfb22d1ce4296c19830e0930afd676bf8579bf7b7f10c784c9695a3e95bb888021a9029ee31b3f295fbf40999a7877d35f9377bcfa5b11083b259cb9ad18bf08cf55abd594a7a2d57830857e6dc702c092fd53514bc4dc8fe86ccb9e96f3d11bf0de81f48bcf08f5ac973342ec5953c771c0218deee5115d5ea2f4807f3531013511ada67765715d178d61b6a953d0bab029cd6c48fc3702e17e8e56cd76f25f95501fc2ed204b2835da3237898fd9a9635b1c437e3a8ca7f144dcc1cffef3d409e54558fe38444e305e55af6380ce07f1e1f20fc0b0e9af4567d05b0b82a08ecdb90252af08dbb6a00d3c1a34d9b4aea97e2e944cd0ecda898f90aed426d4ec874cf8f06d1be85c093c9b2a2cd4bf354f87c35f322f43052f37fb38b6535a895c959ef01bb7f5e671e066d37e77678f7f89b7f952eca1b890f0dbe5e8622ad3890dbe6ec68bf187d949a8eb3d311fad693f5d68b87547e351caaf7161c35968dfa79592a21258090d1f565f7b496aed90b47b3619dd768f4f5c9df99f1235f021c97c0f8f1924fa976ffff7bd997c23701915383aef85caa203bb8491acc75c57e6121c99d1bafce614ccbcc676d0d7716617850961e6ead990db4005d86ef5b1299d4db746b6aa12c845a0e0e989c849c630fea27a1684c74fb8737ff00fece03770aa699f9ee9512deb728f655d96e83b4814a07109e453eab896589d69dfded5d5ef58947c22c6ba76d0717927cbf257a5766a42cf703d3e681d0d7e9e03a93cfc91754407b298f7690e68dc884a886d9cf69de9a6984f01fe849f8280f5dd6756d1cb6a68548a81f1b57ae4cd29dffbd71685793b73b171971bf82a89e5bf5a48850cd1ba6ded1a62cdd5b9c2f8384f827b6c7acb32631263bf97e042aa0c747b68aab61aeaaf7c859836527777de1393b39a260385f1f91b6898aa300cfe0ab7757f38b4afabf17b87b92ad2f19679a69b4f36fa82a3aa64ff1ae701fe1301f50e187c6d03ad61b32bac5c3539670ae6386c66cdac19db65ec2cf8d5150fe25aeb27e2a340286e73d322feeae25190f1c349a736ff8c65802d233fb21da63a1b9f3c872c5e97ba8da1018502aab95d41f827acfad0272a312c9920ded0adf2db8bd96e9a88578444a04001b1f1bd9f74de7786b70a67db72e6c6a6ac1d839efa979afb4c6f4a53d383edc0e7068830c64b6c853bbbc6a0f4de564c84048072c8f70ac561b78ee61c471c3b37dc39ae77f9080e5ebf1e2b3548212fb25e202ad8f611f2ea9e006c59d0727584fcadabb0897fc0de0f48595c5d6a6d33b94fd3c75d9837aea5ef3d6a2b88bba996c64487ee235841af181ee8e3e6c4fec152c96a08dfc762ce33058fcee57124a7e4794a1fb6b9bf041b1ea95c6802c4bc2365254ddb8cb82121cea0d45acde982f0573d8956811a936b9dab3a7c23c24a3d9f1316c7e772b6c113fc2361e5cbc96c2094bdf940a5975d6ae7a3141d08690b3a2462c686d9bf687e7bedc07602ed2c95ea33c6561c8fda2ba81cc93d2f5cdf45cebef70fee4dcdd87aa1dd6397c1311de9f7a81b9bfe558fde7f82f72a6843d9168138d44d1dde4ec6bd7ff7e4d915ec3017a49221ed7d55c26cf22b3d5865953dd20bf7d40a2940330fd1b62625378ba4f3541a1728e13b50992aa6553b96f958863beeed290980c06beb4088a011b0ccc5f9a4d50fd662b116b9b6fee8c4b8e6c7450125b9e959cc80ba2d651d3985e1a4161cb78d3b5bd2c7f61d87ef7f39e7010a4bb744ade28b8a861dc9b56be9c27e472e52f136c8ab21ce15c0a9f11379df43b7da4c8947f3670e1fd77635fbf6fda431457938407adbe06cc4d18b08fe6ed5fdebaffaa4d82297ed7606109092e5e5a3e125cc5fde5a8dd2d5eb8157e37d5dc64400b909541dd2543b7ef28a0af89011bc12a747f87b8c4880af88aa9107c6aae6e8c4a869e32d6e4aaeb8cefea976684eb97670b1187922415ab775b84eee4b3ec8235d67b3ede627661d693ed9b2c3aa4e2a72545a0582843d896456d3134388bc032b3b11a01a6c9a4b51d4d87bcfa142201541c4d74ad6febeb10e3fe23eea1bbf267f910198fd287af325551ff1957333cc3cb5e8259ff7daddd1edfa295ba73f1fc3894986116250d7bf0fd37c0b924d29b7958194fadc12afaa0e36e8dcc9ae14122baeadfd32766513cada6de2bb4413f463882ae58e3b9fb61b348d52ee24f1433b3eaf961003e8bc0c662168b135b2d514d6d610aefcc570084db409b1f60a345c04df01689990637b182a5597d621e74644f2234fbc30cb62f5d9afd153fd0aa893e974ca778e2ffcb3748e58ebb28f4df9190ad1de6fee2dc62172989560d2d781b66174b9d719e79e977a805cafe8009db6cbeee7ea8ceecea75f8f3b814dc4ac07b1e6b46c57eef3163f9f2c65190e7cf0f65fdc17bbadf1cf3400a91f8be13ebf24b1a096b0f5d30b9fc672058c0ed9fa7a2321a9c78eeb8771384f588a6ec1e5301242a242c686fc958dc2b78463f206b3d628b7f7f85ac34e222cd781dc520c42e9632cc20e3e221258eaf6f97c8ca5c3f83f62e42f485714ea1a7b36db52d65ebd8df6df8727791b86126b0cb5380e8f5861640a0d3b27caa13316bbe91bac0f5b6edede05864bf0473607078bb711d072fdfdc11604fbdece8a78882238b74e0d79ebec25ba9da62ce71d4f7ae35a767e6bf1c339ba78cbad5c3141a37596c956ac3ea33753ea027d75993b8743fc6c4aa0fc3ffc85bb0eebd69a8cfb5d8523dc294dbda6d9913b2bd1ce6a6d11408e4d20400bb1107a97c00b320aec6f4c393a354f41952a2c14dee54d21e986ef4731fc06a99ea34a61701f778849c4bb33c83bdbbe6ec25f07da592b9842ac414a85fff67f5f7e17d8d439bd9fca241d6d5cadf2d33e1a4150e3d69c2c14b1463746aa41814d8d2eba22b3f4f0be1dd5bd365a3ddbed08d280278a6f5a147d5f394487683dffbf66fe0a2a7c1c29dfadd8cfe09ce58231a2a747c727a57d545286f8da6284dbdbddde063c9c935a8c782844cc2b5d0edeb43bbc4018a2135b2ad617d3771d2e0c784f73588425d5d9deafee10e8d7630ca680212e5b9dad7f75869602d47ec836aa24ca1c3ff345fb4978e605ea87ff5f4f6f9e9afcca4af8fbeb1267d20b154825e9f7d1a22136490a66de725c601d8f737b8b3d87db031706837e987ed2e67d48d7f6b60d4ea95bf58a689243ce1b9a4373a92e96a4e36396d0d9be57e819c66d6ca328f245648c1d048137c29159a432c6012ce7a58cef348c49f09feb06482992ebf81fbf6b235d9e83efa37c54b0710700d8371503386e9d77ea50805ac7ad64ae7ac3db8d4c9298cec2631ceabed77e1f59e60164bcfab150b6b7ec97ba5a553173a2f5dae17162db0a233597303ea4067f36f9dc865699865f2e2f87e046a7010b7ced0fbb75e8248b7ccd03ce1b6c820f308747b09682fc0fbe7ad1bcb25fe86574390e1f3c1cb5108b717a2197cf4174219bdb8d482cbadf3405d49ad392d7aebf7397f68fca8e79401ae3f4f9b68405fcf075729a660f66fc76949d3f88d816b5f6f595fcbceede915cf4a2d1943845462c7c79b3fa9237fde8f029a19662d7ef92a5966c3aad68687c963f6ba0ac33cf62f2c00962e8019a751111f1d2a5a322d2f4b03643b36748cf2d7cb4161aded97b2d29692ba37ffbb01f369c9aeef67f7bf40bbc8f3193cdf264f5a1c777abd6f4a3d5d57c5f5c55910d11a6f3ee315ba9c0414f1fd3a743d5e1237e2bf7d62477d09036bda2342c64bfe5418de3e35041f641cbef6b50fa9070c525fda2b2b5e8e0286a8df4e22380c97d473d30e86c156b1beb826eb868b43e46fae5d05e29b7822569e469770cccbb513c3d903a9dfb497bf23bb701c0047e0e84c1df5bf8f4560af390f93d5531b6ce09c548a0227f657b5a2be8cbec1eff51d49b66004fc97b4e4ded965587833ca7e6a9681a76e1b7c1adc15b7e28704644d27088f14f73f5508ba45bcab0334a8c9583a812001e40e50261977eb2f005a2004e0ded1c5fdcf8cfc95f3dec40681928a51489a6e07da90b01d0d3b93d048c8441920f6a45e220ac053695be6959e8d9b459076b39be3d8431d54cfdf0e8735c19c7a4c3262192539b4ddfef545fae224bb6e1213dd5fa255c499c71659d031b2cf59efebee0e22ff3ee64c1ffad462e288148b7fd38d760d923e96f9d1ed0eae8952188bb4dfcfb73b4932eaed9ecafe67a1c4b5b30bf7318feee0c80bbebdb14af9087f0e39ed89a0f7f62866fe5b3d8d6ba22f6ae12df5010eb70c2c14742c5496492a59120dcc43344677a2b7bd88c4db5d849b68969a54f766061b9130e88a47df58baa4d1727b2508b2cc53334911e7c7a01873ad1d5f2d6c74d4ec5797814c1e2c1fd2345e4d204a9bdebfe032a3470d689eecf2bca5c6fb3617b6e62dc7e1e97566bb736fb3f133cd109e8be6a8aa5ec9b622d0ca2d16915c08e8ba0fdf2d581ca534c922a9624b2fa4c511470a60c1d314616005ae10d7ea9b8a021bc333b0221a623981827d3dcd471b02d8a49410e512acb47d1caa3647a128d7fc730aa312bd9e2799f6fe2f6d669f6a4f16209cd235a8d9008985063a76f7f7d77152f99b1ed7f7319a7022a86c00931ae8be92cb53fd555c31898e63558c0a8e686fd2218a69535ecce293b991f4c727ff6dae18a946f25c86bf5414cfbc2dff89a36049b3ecf2b47c6112727f4996defc34900c4d0048825ff0ffe77c0a3224dd45a79d2edf2202b42266963158b357829891fe39690039e7e1610bf57af9d7eee70afe2106b11681d8e48d6858652151c74f53592ff41dd840c4fdabce9e72e9f868f7f335a6e2e5ee3a1ae27c94a4a518f635cd935720d57924e749be25320fbe92cf6d1e3d21a57ff7d43d975b949ee8cdfab7ad30f480e8455fc7676b2f7875f145142078287dd7b725543b57ef3f4bf2d53367fb3871ba97fc2200395bc4564d4dd049071ff05a97e9ccf9cb391aeaaa3274f04e2b11ec8cc802f56950a5125fdeeb07448f629f812191e3b1cc963e11c9535da4d08e5aeb6d47c2496044606e50fe1a3ed6949ad87bd6f4c0ede13cb1e968f86383f84f66fd0b7d0a452e4ddd7d091195f6ae52a7f00ff4f6a638e6056c98d6caff53a2d273a52f384a79bcbb02b8a8316a5176644c668197d8af2040a8a9b6fcd5e9e48fc8f5a8c59b61cde7bddd4663f0793dcc066e5524454adca9ce0880ddc9e120dedd39d3f86199208245087502a1e1d185d80604acdc464d804a336b22df18b2bca4afc63232ca52bb70fcbf005bb36fe7a86eb169c2cfb201b06bb16006067dafce2e7364460d88962125c2d9b245b7570a199e1915477d96bbc01643ff351b7c649f37bf5cdcaac591239915d9fcded5f6ca082b2b6a3469429f813cd6697d84ddec5acc3167165547814e2860f7828bf447441c37840cc71167477117b9261fb63f715c66f1f125c073726b887b4233f27fe24e2485240b6d115c4f0c2e0145bdebbfafeff3facc68f5c7886592e45162587d207ba1954fae18f646015b049d4dc23c9c30c8becaf7b19555c64d0f6da885b4f9ce783356e215a6112a3001ade10bcfbb365b61375400565e5edca63fae32b70cf51d9355c578e0cabbd5c3353f5b429e9ed2a6bab59bb8680a14dc36613483f1053717ba069541feacb20817d2e427f2188c2893bc9952a1d962110d911c563612d2c8aefecf472064de65934930f5e3c07d1e823f0a12c5ee477a9b97eb9ff3aa440e13bc0b900672e233abcecda9c34e731527fee84096ff50197ae269da2c8a57dbdd1cb8dff15397fe63ee88e319e849db3fbac537cdbacfb0989b8e382b26eb8e0dcf4b86be5f380cb239c13464a5b65d128019cc01ee84a2e564f8f98cc66085e1f1f30b200be6c52582652b66eaed28f067102e234cde8d6250d6a3a40dcd8fca2f3b4df591658de1e0ddab81e88059c86afff2c3b9e78edf6ba2d2bac65d156baa9732480388f1dea9036c69ed6da3bcaa29805e00b6105855b96c2b0ee30794fbd2d628cb9a6bfdafb278ac3b076cac3ac32ad78de97923f2b7acf6df12d7708e558dfe9e8fcfba0e9064bf393203a1fec5d3d46c64b6dc33abe33ec71bcc8e6e7c6de586eaaaff27bebd1e360995870b417a11183c3e1b30fcb33c140e42bf62847a2f724fd84586f3a677b6febb52f1917c46d9312d0ef4de0a6b69b0bc9fb502790fef199f784303fe54410b2120a83a5e2c89159bbcd2a8c1219768ed38404c05b203e2b0aeca7958d855c98c01de5d7a4a31de283b2d45a98fd758dbbc7e0effbe322995c0db7db1b5ee853b1be3adc74030507cb7786aa20d79b523be7559e529e87533d64b75ed7fc2be35e106a70cb523ffbbe6cc69cc00bc83c39757e5908905f3256aabdb708671adf4cf4253eed6fb295fab731cf3d32e8c96e0b2c583f58b155d1f3bceb84a877f7928f53d1583df32d9aca1798ba3d6ee0bfef9e1b3d6db107a4659b2d089555f583a2a3a17a2006215d1907442e8eea120c273adfc43190ab3cd4ae74575bf1110bbfe56ea50e7d791de33e5f9bef43ef252a67fb08ff3c48e526487285ed9908883eb3e80cdcefbfddd65f0bdbf23f143a183390a935f92a010ba6c8c9284059bea5bde8133cdf3e493c57e27608a461c9bc23c4a8f945cd2595175328e0324e4f18d161c7f446e1f8336ae11e681aff905f94a167bb95c2b1d9974861d52df9e6259dc9613c840411de0b6469d88f7e24be0fe0634e77afe5d54a4bfda11e53f6cb343c4d89c4b842a4a4dca3936064d4b0c407014b17278165a66360b2dacf7dcaae91f1549bb71f47c2b2a2af21790f7b3c37b2df602defb7f7b14d3f66b319d8fad85d35e246fdf67a99d7ba9e5fefb3056fb0e15568e4642fa4f07ace193e920c00e32c7b3796bcfff99684fd96dd66f3b9dd6ae4441f0858b97a07e03bd57b321dc759d26eed212a1c645d6d883a00b8d9dc88e7e223bf90145092ab7ce618294e7381d4b2184674b60afb78dc55941e4a74b45539377f53a46ecbe850a96cd1137a00ef5fd2601c2444814deee7ed69123f413949dbce139fa0c9486b9196ade19108e08927ffaf88f6f671116e3ffb61705efc1d8e0c04649077d67eca799107758c93ce770b674e8f09f56b7788d4461f19cab540d9d48ff2c4c726faaeb4c592504cee66044ae395b8caadbea590bf3037c45c75d7d43a07cacb1c591b063ae4335894b53f1c7d8b4620eb91606d7366338396546e7be3740adf21440f147ce86af90e205cad83ad3708a4edeb0a1b7adfebee34368f3b51d785c0c08b9bf8b7e505d152b6caf3b637329d0094b80a27de706afba061b08978174fb303063452560673532c56751c79d7d3061519ee28447ad25d1865a369a0ed872fd6d500bb7a2b3bac1e5b1939a2afa4ea0f3c7378c2ba5ad203d115933c50efc3a97ee330e78db7d1f6e08b51b2317b560e755b0e79cfcadf86bbffcde95e704f0508d3a55bd796ac924e1f38f52e4d672e6a6f03844ed698bdcfbe5a5a4a847fe51fb5774bf4777a0eb827504bf8a16a070acefe35d604009f27218a2f8a3413c290d0d8d5a7bfa4c1de91a83c608a59851175fe6536bc0001d57244f9c668ccea889c55856803b4d988b94d6b1f1678a1c8aa6db2aad1b658bcb35eabee08b2242fd7e1fec7f7befa09d9c4cec927fcf4d7972ee03c9f7fe29b6bf047eb4419fc6998b246b70024b11c49df5248d9e7ca431f2b7a1438011380bc4c47e8b3c5d4feca602a48045f833ec26ebf3fd4ca84a2e30c8ef1e88d83d796233c27e323e235cfc24a1d5206894cac12efc7abc1a860d57c1b67ec0ed84450060c5dc29ef19ac4d5757f425e5a61d74e39dd5310cc977a883398c24eb0c9644214ac45d9119c8654ea855e7a1e6590ba6d8bd9d90aa4515e4ffd37b39ffbd256f97c193bc75ab3b77489f6a3518461ce1e48514097eea2fff9bd5e3444b1d056aaea8fe107657272e16af1438c4029962297d8ac52080ee457775de037df286388aacb8f3fafb0a69b0d03fff28379d16f6ba9881d6fbf51cd0011c71cad7248ced4f1f0cba4da5d2417911620b8ca9311693969f898e9303a644ca017fc663642b1e9092eef113da117d15fd25a9cdf861fedfa923f4fec0971851692f1509d84cb6e387c148aee0bbd526c9c13e9f59790fcb7c1b29381fa3821458610a1fe7f3235d6e874ad3871fd733222bd064960a609100ed1807836640c182889c840d87397fe71be492f144bd93682e05ee73c9b01fc71e6dfaa2e5cc04b8638f7d74a04c9c25060cf969e64226637449e717b7ea8aadc69e4437bcc281306f0bfc1dc22fe7be2763e3a8081d7b9dc5268d78bd8f53145da70e06f7dd4f42866400c7feafb824044932fa741035a618cd7fabf6efd0a1b370d02cc54fbdcd78923c52b61cae2df0fb7c24e751aff986f4114ada419ad742852dd7ab24080e61b55e93eba344b0a4b9eecb50396eef41cb8d6430535cb51c1951e4064d5b2d6dd3fd19e06bbfe521b11161793a5879ef9bbf1f4a364d09faf6735f93522f59532b5e86eaa8adbfb0856ac676abf54c677f24c75e7f0a06a782a18e3145f05deb250d1fa85d5ded8b590c890bb36e13c1a54b42e194d8f9c62cd0325d7fc89bdef1c34a867cf97bf507b9b394b13c1f9d03e5cd8f2b112f3784749af0d7d96891b01485addfc43f5fdbd5fb6dd95d03b951907a691491debfcb95b5cdbd3b045363f521c1e6de13b7a33b39789c4c4e3a9a3e76800703f341a887a8b860a3f7e921e8f081a65f579707536b6f23a524684d0c4d024b47ba8f4af3d6e766f9b21339a8b8b945d4fcefbe5a79c36aa47254c4b4b8b96bfe8fa2cabecc8d40cfa4636ef66984169001e4a902989b4c20235e6de60dfe57d09fe33370ff7cbe41da3e855dc193e13c5d002bdba54cda161bce76fd6d3c5cd979a6c7dd54bde3fa047d0e86603bc6335ed89fd0124005b41843bc59530da4cd41a36a0b42af163185ce8b8eddc97da0571dcfe90f324711e9a79bdfe88012e006008571a7e7bbd386e85c10d9921aea681a4b08a34f2b3403fe2ef203f8646190a0aadc1f829a573422e1dd7bc6a82cad19fb6f2d37a3787948824befa71c191fc848fccb829032a1edbb31731b4f2f53771b5316ed5fa50ed395252c86ee92f096aab2ff33c799a55d3b09ec5720d2fe49d0a1b95b17b09efa337c7b3bb84b496112eae25aac5a6b123b2380d346c8b296cac0bd4a3db4f4074a806661b249010d44b73b8c1dd28e5f9ee5723abf4a06afbd9e12062c713a89b98d99fafabe6747ea15ff2bda4d295369b233f89fc14cb222c01bbd4e3aeb9d46237402a9fbce652ba518230afc26a372810ebfb21b5792fbf6868b193a28adc7243bfd618c19bfd72ac3c64483514a65f7f485007408546f452c2aa79cea1bff62237ddefb6b6006b0defac711cd326312c17d9f05b831ed79a5993b2819d6cacacd582f700afa36c69046df33f40d791e1586d1f5d5dae84b65e5874c08c1f5224c37a690793bb00a3ddd9811830f14f3249ac38886bd3f2cb4981392ee0ab5a00de5f3b2b5f20a58e9734b07641053c0841c8b4ae1f5151ada4a64526cf8000ac927556b0bb5a94a42ce59bfd031ccde3ed619544db3d90d4ed7d9dd0f46a1ceae2830a7e1d87fb15a589266b31efb14127962bff608141de7d5dc6a2389edbff276d6ae42b9441d42b7bfa74f6d7d17d5c6a59cb3700163626c2068ab92237a329c774c8293f477d988cadd0738bc1360e6780dde796e5d50ada6c09793995eab55c29458b117098567004b10c3e58f2e2c3977a54d49e95ba117b57a59733a014371155babfd6977dcc0c9d78789c5f827f10e28312aa154b5fd1f010c24213dd203d8aed798e9fad01a121badc2fca534fc2664b164c47feaa13ad581668a9f8481732c2d4e1408c6598e7fcf49040643bb690d1e201e201011ac1b2733d6e78f169951fc2e6951e7d341ff448f878c87c856361603a73ab0b2dfb1ed44de63e14bd04f7de280912bda50ad7e53fac82de4596edc95b8c099421ffa5436aaf3324421c8d1f57cf028b0d45f8ccbe4c4aa23e0f357dcdf448b5f39f15f059ce92f03c9b8fd4e3fd8c520cc5f00496bc69ea087b54aa6b7839be5dd241ec14f4a2a1807b99f1faa96ea578819b1618c12bf72564ad1b2b5900cb03c27c48bd2112df0c9743d30852dc569ef8fd49981efabe059d84889d69c6302f48b0b1dbcdda9dfdd557a08f7bba8c9285942863eda8a21bc6b0e4bd378b5f4864a7b7eaf10f5fb436f0b58ea9aed4968d17f345538cf29fd6b1763d2dad5901fc777fc132da98fb14af8db0aa24cc018fae69e3e07a340610ad44ca5797d4d08fd75fbabb431963396c7dc52dae496e2272297ff4f7f17e633ffab9a45b6f9a7aff78f5606526bdb0f532c53a406c775667e02f69e11d2920b9a8e0a37ba49ce424c52e3666f1bddff060da3bd385b115ddcb5fe5c98c1e2dbb01e5ca6c44dd8605645d4f0da88b89656181e3fe2779311498354ddb38a25fc94a191d964bf7bab6a518da31c8844d21a9da3d3e6af1f9d79170fad416afd67589dc47aa76a3eb4cf6200b6c149932448c0b2d24571a33218e90ffba8c266cf3ba146f92de7308afd447c34fc7110b9abda2232ec5bdcedf0835456c51f5a688d46114ec19a1302487f3cf00c999ac4a7130c5e0caaf8d806e0fdb25e3c3d65eebf4a4f3ef37dfffc1f1cf8c643f024ef49007f0d51f7fc35052905fe01060952c75d7e2e68f3db831c2a957edc8b0d716f37d71969b001d8f9b13fe74cae72831d317688689d9701d084bd3ea9439713fed65f48a6cff4a6ddc5635b2ccc019a65e2279dff914df63ac04d7f88f586254cb30ecff5d6bc59fd423978929571d8a4efd78dcf1fa4078083d8dd76f49c748e29fa2c082862887d1149f9bb22f0ccfc1534c396824b644761d3f8259b666236bb605735f32f4f1fd2b51463f2075305507e230587bc32b51c0f9b95efb6cb54a058f7acbe0db17b279c808dddaa76b4a8f7e1b7b41962d12af97c8cc2fed875711ffd90c930dd39327fb75c0683b7a60d48c10498b118cbc9e8b6db9caea760d65fea4864fd25f80a6455af64268cfee276ec5a76de426b2996c6fe21a5810875fb48f6e6b40bb170ef5d3fcd578b81252a93cbecec08ffdc637f6e5483b71ef790dc7757f373c0bfafb8150f036ba16161d313eecc0851673fd42351ef8d706a6efa9ecf5b049c726293c2ec55aa87596efa5c381db183a114fb94283a1c219acaf0316f69fc3c860f0226825d6b0a41ce7407da3df598310b2d76530d15309e405eabe96e27f10450d74a0236fa1566cb3f44d0267962d925f6b5501d919dd22b32c1a1975c2153095ece72f206d4b2f4413630f02c0487042cd15a1fe2b64a194e1297419c404c627fbd59e7740e2f9aa4ca933d3302651c2924e4f5dd549430586557f1abb445c3f97919f617cd5ed85d14a9a98b7e6185e3c9e34dd73cda62e2bd0bfe0ef276c0b746770995702ef4cf83c254b41ead65b3345e50a98f6c01165857ad1d8e3c0c620bb795b6c178ee1c8bf3632c8166b2471fff58288bc0add12a5f091ad78fa35ef1c0ac0d9cd764c93c68d840e538bd8f58800fdedaed3e6eb47b41bb0e3852ab8ef93b40e4ede7e4caddebc5ffa2323a69724b6f94c3e24f823758f54426df0bbc0c2820115bf109ad463ef13630963c183313378c6013751dcb613f72de8892fd7becbfe15847a7bab3a0baa4f337f08b57fc73752e2be57e3cd2a8c0244639fb6528a23b7ab2a6938edde1db944e92febb461c739ab3d547af65d3d3cd8bfbb9dce38f379ff73906a4da6f649ba5528212edaf27ef602e41405f959156ed12877c3932e4e9bc2f2bbd2a3dd69afd020e5b7b9de6a8866a632c300f85dbba2c4525f9c546db04f869c70c666d663c7dc449393468fc787c8c3af528a14bdc39d4f65afe8164601ffbb835a7796bfcfbbe29e79d570f15c2ddbd209487320720181d5359b9a383ccf647d4753cb9f4d38f7e522d21812c588e204fdbdf75ac4c5d605ea5ec854beddf822cadec4b3cc03441a426950ab3392b300e7689db35ee9bc1cee063ecbb2dfe215842ea20a9fa49b98bb9d477f1bf68ae4e7d223cfc5f2ec67b192232045a3df039821661acea7fc26116d7ff52de4faaba54cede789b353cb7827b9985bd311b63b19aa6c664714959774ca34aeebdcce21eefb3d15f93dea4378cfcbf1d47e6e49a5212b6a96bcdd0ad6f43601f19deb8ca617357febd1fc38b506594ebda58266a6b96629b98857d2cbbfb8f6afd721382eca06a857a27e108b4257c49b9372d6be72f57da066047d285a9106fa6f9cdff8c436f5e2bd5a3c0cdddb8e95eff3dbb36d9404237de19089a66ace5b09645f34fe70e4146dfe752d7cc24176461c9e8d138083f0c6c37ab8d68b0e17e3573d15909d8f2ffd177447aab308168f39c23d92db5be023d05e59fe4147f93a73ed106980c3e91027d9eef105d4d4269a69434f0942dab298489cfb544e5b886dd277ddbb1693a2bd61b19db9938a3b148401adc8b47b7a44b3d914f5b028cc167081bda25e299429b9eaf11d2ec55cd194c44c36dc8201a920036aef13ef7e2078c33652f75a5a61a13181a255c632997a7f458190db0bfa95279b32650dd38d5bb1866423c1e0156770137a35c40772a03c5e0eeff06f2c208c9260c44f39d2fd7dd3bc6c4be1b4afd577151a3d24f4030e5efb2fc648782e6c1531f1677a946a07029e43efb300f3500343f816faaed99d98bc99fdadf6f0909a7bc7ee261c9ac5b3422d7bdfc1f6b171db14d61b916b28d69e9e90a6d9e37d20d92aa07f5ff5c7213b2c4fc1b49cb539172e8da8b674d991ebe2d6b0a2c01d37947744f8c1610b48c56babf705b4d6b60d62d6f69e798ec2fe45ab10a7c31f993f47b7281a72a4168f93527a9b35c502beb579d47de4d6be6a28a2eb610a6fe74658fe0aa9c922a7b4337b0ed263ec27754d1c90bf252b944d221b1d6f5b2201c6a8a007cecada296084c4504da5382aa1f40738f0c9d574c6ead13bb33c7546f591473bbc0f66fe5d8fe0491571c32c5dd0f097e5fc305dc22c1590ff5aeb78deabfcc25b1fd7b033e1d0ed8c4129ceeeff7002f75aaee3cb19bff3b4225b378a9825fd1251a25392e82413fa6c14b624599fdc5ea1241e2998b93e4e167b1ae211804281a35ad9d8df42c76ce0da128389f60196cee6b7f06114a9ac82270ac566ab61f5d61b9740299e61c8bf301ec95edfe083f706374000ca99d0e8358f2f0e0527bc43b97559dd8a65f6b6feccae470fdec52b30764b2f526f32b9cc84b27855e22b4ef379d064fbf593d1002b887e910dd15967e12f65ffa0f575b8392afaa9e3652003d6d932e85a673ba4e0738a0fd6bcbbdd0fdcb1c7e7ee91bc6ce83bae6efa70fc6f426ff8ccb599aca71218e35c8e0538417f325aad6296b6161dae16c33fca2dc6c75faa1463216ea8b48c8d81ac08007fd428485ddded0ce2dbc2da4ff75ee43cc2a8db3c8c22007d77cc7fbddc21064101a1e9d313b8781e3988c73e8ac695ed174938124c04203cda251ab4bd4f867789db14f667297451efcdee8b7352028cd190ef061817e8083c870003db36c3876362c41d6f27e9a27f70db296de6be49b0b6abf84af7f8b60f3e7a5674ceac91e45b1fd5e7bab28eb6b6b66e214976af36d65c623c42f8be439e8ea33effa9504236fd58d2fb3ca2fdd04da2c2e92f7ec21b1ef0dca237cce05f28f6934f8eb5988f02868592ed17074e42fdf2055efcb41006b73be5e11a3712bc3754419f0245192e310e80c184f748f145950a5668d963a8a3364de7d753583ff383b7f91c58c3c1fda915a02da529e392a4d4a120554c56229335d0edf06c2c5ed929d873948e5fc018e55785d504bc9ca28ede26fa918ffb40c44d2463e27200f026a10c47287aba62a02d40c8d989edc630b3162f16f8871bed65ad0b578579e4df829208f7d2c994f0a8d210498fc234b9da19d1adba4ed7a34846f2a54f318246f3c18fd2071e65dfbd717951160fa653372d12485c7c04181f425223ba2c1c6d8b5aec8f33c8d3d00cc4580a807b3c8d7de5d8f85a4586ebc52fb3f3cf6ad0ef78b38d5fa4a921fd11a7e700c602c6616b262b7d678b88341aae344bc2b64e4bdc0fec7ffbe5f472de0d4bf7a3a9bf3e1b0e3894de06ea0beead64b29c7586f43bf1e6d6766ca68a42d18ebb8815dbadd4bb6cc25c0e49f41a5a529edb6292f19c2c639b453dbb3971ae29e27990de1c9e31131fede794fe217bda4983be739ad328b27fc7def7aee50921598819e5b9464e53f6ace40c5eeb041d6518bfb9553d019391fcb50ddbf74f7b9ac6bf41bf72e437ff3d56a19097c55554f22c365c68801f2b81c876a0b72c14f8ebcaf641b56abd5b2306281a00ebc115536fc1739477be3ad6f347c4b6dfc861c3af5a4f376dec4cb327b712320cb21896540fbf521fd0f26249fc910c4b5316f0605334b0b0ae750b94f20ebaa38602e86743b819edc5c7ff7aa9a505049f2df5d6890b3d1132e894c2b6d7618e96f1cd34e1d283a443c81ce159e3c78c7426914b0f70cf33be99546b03651eb60a0a544bc3294304d63350f378977685beb6419274e5a411ced7d784dcb518896764d70257f97d0fbd6957745af0c9e8f3aea8cf3604cad4a25fa0b2847628ce89e8827b67cc2cee06f9bd9a6fd11278cad52ce98ecdec044f11b7e6db951dd12db0d889fddfd0a1806820e61d44bfba3278675441d93b35f3997816a468832a220a51bd1be686a8eb302b13e0a4e691f94a0b50e66359ce2d69d268ec3bef771aa1368940d016191acaf82ea4afa651bccf24402ffd5e276edb5d5d3d49d164c53626a90a30920be3b02cefa78e077e4ec7555406142f399452b9edb16fc6ef953d94f45b30d9d19c83ffbe5a5280f28aff78bafb6468f5738cb5d8123fcbe54a869b619a4ee41d5850f4bddfffd8f38dec317f5cfa5e1c81b7ef6e14fcfff8e4a0656d8b6b2f42ed7d4de7d2e409a3ae5e5a17582b71eb9f3167dc523fe126fcf77128f691ffee3a0c10549a7c51dd2f114ca2f1a3e425fde85e9ce45c05c9a34f570d50a8af20981afe6614a6dd44e2677157cae933e4c6e1104f79bdac2bcba6b7e09195726c0499d43eea9032d1a65f18d8f45dd0be24a0d19c95f5c338ca18a637abc6835241355dcf8aa1a4b7ad0bf9186fa3130248a9521703b072ff8a039ad0a1825ff98cb4bf8cce8433f460e58a22c2ef12278903604568fe7c90a8ab78535c6238d29ee624512340d4c45cf3f827de43cae7555276666abc886918e5e7564ca6a0334ca7f9f39798ad0525f80bc64edd5a62f6eac95565d9849259948b4d63f2f8d9fa70290ec291091f996fb206702c519bc19ccdd0305db42299619b19ffed905bde89941552bfca9762c031d3a0d11f0537ad3c4cd56f65f347c45f0957a08a84a7e7b965e166cf5c1c5c0e3966d6271be64890748a6dcfc096ef342c1fe2dae566c1bd4038ba0fda50e65b3718cd71fa7bab948d131c2fb2027ad710e2a962f6a24c91e15b0022b16d82e1fd993adb3cc64d3096c5897424024509946796789f0466381c803c68040ca760f492780b9e77fca55c8a580ff125f82ea27e4ab6a3edc5dd7598f8f453c9211a8b68c6612d9cc40641303a46012ae5b00a42d0d51b63e34ead83b4f6019078c4a1a5e5b5ff4c8768f22b4433abb738552c1869eb63d5973fbdf228b1d50b2dcb0c6ce4987ed12a057aae69ab16b21e7ac608e94ee6474be17705fedf47f7600fffd79c75d13f0bcdd52a05ca42224ffd332feb686ef9a7b1476f8bde5698207e777e74d0bd62f4037ef400c5ac1a2126ff4ae1189d2b7903eb1b2ba6855304a633799f38759a3193030cf8405e57151f9d37ba539555061cdde513dcc13c6092533995362ba9bfa00989b56a3109fa65986bbcef7efd87e85e122109dc4606e45f441213018eaff72026647093805e21a5e77d19fbe208a335a04d9bc89d1d035fef18ee6ffc560dc4b1d228903e8d919961ae1f6642d1be6d7d2083470b913cf18c04a0e9a60146c5811fef17c1ade070ec4e8285881e6f71491f169d438fee2952374fcef3c4f025aa559d135e59d3da4d6f559235f01526c1594634d97f0abadcaa0ccd792a48458e778647fd1720229a8820792968bc53cea6f6647955f5e2380ae5ca976c308ef85cba54b4ad0f9bdc20afc7a923242494a6092124f52026781781b62bf459ea6b09b4a968259cfc867b825c4f0cf6621d87faa952f5fcf4ef7cf6130700cab72b002af8644c41ed5dc257613f294d8ef4dc86b8d25337aaa2b72b92c9f0a4dac420f0d43f4939d92d34c30f7426d68c3c23bda03b8437ad5c031a2202ad3423140e8e5dc4e0a7f9bc456ab6a8ac63bfd2ae590d1d4cc0dc65a1599fa8a5e033e1780db8927ab38d569de3ffd5ea79a0bc5ff9dd79b706364a7cfb8a457a1a132a5786633f7012e88803b9c08e56fc2e693e323f2f5608d320d90213e3b69cdbe10a0880e95ed99f56d7bfaf0d224f3a27b90e6fc6a127ec05fd6ecd976d936d6ef5287a8ef8947ab2111b1fb7f7747f8ad8da8221c3a069fc5a4cde3dcbb3231b7ac71c5fa8951adb7b7a33f718913ea2f387d924363d63f00fd4f33bdba5344a776ac42db1c326352bcfee8bb93c8e42c7871c428783499c20b2568c2b500f5966eaa8397fd46786f71474aabc4be6ca220b41e29853c7757074d3e52547acf3c0e1064cdce0651415444aa1a30b1cf5b5419a8ad6168cbdb94e57d9c8758a2d35984f99e50c40760a2deddd9147d7b2e5c4dc7be8601ff68382a50a9ec47c95083ac6dc0776b4eef4031c59373f9513fffa0ba228a3a87dbbad29e13244229d31eedafd407705d3ac3abbff9bd35c6b3c9a0f591d83a33cb5561abe6bf73aabe3e8687a81135aaae22720da6eb45b25580fd372dbf50e65d19ad2272d395482e12fe763bd8e70b618a8a18cfd99663121527ae7e178b64cf9a5774bb7ad792df8750d7daec06bb3a584d1bac90f48ff8507d65129c084fe038141d0f47c77f3c4971ef57b1ee623d94be3b79bd772fa85f7b703183d9bce97b2cdc9b90cdbc9f99750153e895087defd534c64f2d7041ba8062bff3aa91da4928e15680031663f1b71b6c0fed554f96e9f4d682dcc2bb2024f4a2bd223a3b4330a0d0a26d4839ad6a15e9f7d4f14112195a99bf4cc59d4b6d85d08b613c78782a0e00c6d262714219c487a8cee86e76fbe7ad25edce0168fe74f0afd5442aaacaf4ff6a58eaf9d121da8f11b852f435e51abfe8e4ef9aca71d4d4e421897f4c55dc87739efffdcea6fa558195cb0b904cc8275228e49d24eb525876446b8ed5bfc3477200ad03e0fe8832fe3ac518e24491f71afc30d6c2c1196ce3e47c7b50e9fd66c665797c83d93d9d35d8de61a913be8c8d632490ef7bd05e5520f459f6c92a261187dd55e68bfaec191ed258dff13c8f4d64c466c8cbf96d79ef6fe122caf23b9b9615b78bf73c8e8942ebcf3675ef3a8f6e8c237ec1bbef8eac25d7e49969f0195746d9a67cd1b986e3f5d0d89a9e6f656ce5f2e7ce03a2baf27267a7e6f09310a7651f8f8aee063594c4440f2ccf04e8967b235cf56fe49e0b60b4c8ab77f71a3cbefab45478ad36cdbcbf8e3f2a1f121215f737b9458a4d2404505b82defabe7a869aa8aa70ca588745bab1648ca4e53ed45cee83ea3120600609d8c0dbfc433327463544420d7ce19913b7a823bf9b69297ba85828e7c2a37da5e982fd0d97f0f281c6089934d7230aacb6d67855069af951c43c3a3d222f87439ae50ba1b3056ca0bc874dd441737792dabc48ee1c4fcf811b32902ce40c8b4b69c536fdfbce9999dc4cfdabbb4d70ba0e73e035c1b2262321ad9324ae6399806c5e3aff79ea7264f8e7680f6a09698902876092bd73d3f46820aaa4085d068f44f669b9785189726b045c4b49124bd33ad1bc0541ba9812909949fe21c7d6f6989d5bdbf3f2c9413fe335e84d64c95d239b5e886a7116dde327b746dc584330fdf579cbc30b8a7e824fe7a0153744706d4b660865f56a456592942f1510e40229ea873cc3af0244a83103fee04b4405be89db8fd75e786d870b41af1a0ef93a72e5f3a97039c3bef94456ca3e21d8c6e84784486ea8518ddfdcc6826d279de7e663f16b8014fd5e5fca84529c89e79f8d928b85ca356c1967b5dd879fbdc0d20384a0e8fdd586868d37796393b5bf81183972b8d74ba0893cbee7ccdba163b73778075b9d80f0451622ea45bf2134a3adbe61380ddc09c6937607abbe39f86f920f82122b35bf2df437926f957c02e548ee01a61125a1396d6e75bd3e2ea8c68404964b2cb45c644a028d90a04eea2bcb16d0d3bcfb17e45e75c0ad623064306ffaca7b1b657e85a0a8a2dbd12e2957a03c9082b039278609e9c46b1610272b20d72edcc36a61ae42b580d5b8296fa28dd9943ddd88ed32caf600a8ebbaa056da3229fda211f5690b68958effac0fb849c3d3cc65d5af3bb6b8bbe10e03fbcc08987e1f5a129355aaa5cbbf7922097794d7a7eb211851404b3ef8d328292218f9d280ccbdb222de78c10bfbbd6deff917570cb3fa5c7a2a0e2a47f7b15138e1cd51b6b2c41dfb204b96bbe3c04050f771d1e9a7a531966da1b43832e325cb5527244921cc0c6c575652dcd7c4868b5d0065e4910ba5d9588d615bb5aa150b65352b3d1846f06a95b05f1f2a8f922f61f10dddac74c09a7821c125a92c66ef53173d45e93d2c1b8a4537e9a056444ac12e71784e83f4dcedc0f0b945ad22e9e6d76f5a66217cda79435da438d4294018548154319a2f4ba7e2c047a382529505fd9d2424ef88ca097f5768e0238928c6a5e2d00576633c270dd642c22a1b5dacf45188f3eb631fa8e00167a858ec44a97a687e382a980b92b8e6c785861e28dca231ceffa58760fffdeeec78f82b60ca390450bb6d808fba87ba71c8a8f7c931f7c887682e61e5aeef782a12853db9b973addec024faf28a42331c986da2d90cb5a2c4a204321db79544037182c368ad844cf7e294aa8124e6ff4cac25b117c6cc39adcf29c460a5fe6bdd203532bb716cb3a462b716c2efbcd92463e495eed56140cb4fdead6f65ba096166bb201822fb4b11664592c29b63b54f4b63e9e4909cafe5f462d160f8cb6c4e7a083e5f99371df9bd2cb4dec23ad6376eb24f1611d393302ccebd6eb95e0470c25b227328c791de911b2f6eeac31d35d1ba9215b3f5bcebf05d0d178ae6ab729b39c7dbad22d44ddf4ec797852c1790ae6312d93ec8af26bb66c2d1a5eee2e3dbf61e1f077fc35173af2d904199f580807487ddc6808e88086b1cf063641671a7cc27b80836103e573a1087bb724e80febf8bb6eaa2108161a2b0ae038506a0c38f49c9f333c9225e62cd4b82c890d4e8f5e258301ff64ce5ced22039379df9a95764ee6e5608f6e4146ba577e7aaf0f91b46e48c28ee90cc26d0bd2765d0170f6b874e15989073c7328c103ae7cb79aae619c5e66a12fe48e8d9c200a11a1a20b6f4120900806800f62014a55d0302d3532b4d5fe9bcead16fea05e82294c263ce5857693a75dbfd5c8e1db596fecd9a00a2fb2648fa120bcbb85405631a810be70bc29d9d20675486de68d55c19e7b35ee7c119cb38c302c2b1117482304fa53f4be710c25d25f6541037bb43aa25d1fed9b3ba6b3a37ef8d6125d53aae0a0f698afda4917f0c1a9d9f4cb5e833f0e2c9906b0ef111b3d8cf20fc16ef3695bb758115d30af5266bcebf1de188f1b31b4a0d591b7edf4b25b0b155cca98e901dc01cd32489a1ee9add6a13b84b8a9bd7499da7180ac9441f99af53b22775d1473911455d70e00b77196694d12d8a91f1c7f7559f9c79e41afcfbfa5d15ded230ed67c3a3818b2e9ad8a72789545c0b7b215d327d52f8100e44cbd22622108eba723846212b1b6444f7293b5e918567925d00fa0a4bad8f59fe1a8b8233fdcc0e6b04bfd22b139980c7bd1b6cd4f421560baef888a4a727e9a2b6f615195f633f6597b5ffbed246a4e0c45b220d23d14096e57af5608d1cd51000663f1f5fdc703bc571084d0a648592545d98ea32b9892dc6b81a0a5ae7587113d6e1785feb0f5682f55acbdeac2572a8ec7f89062591b8ce94e77fa63d188d71fc18503d1f8a1b4ac803e5ceaad111555c5553afca3379de2b5c1e3f1ba9edf5ab4b6e570b40a619aeceb25d8cafd5a39f93cad291dd6b63129f17314f232259cce1357208a0f1caf03f84bf772baba20eb872eafe00a9b273f1394a664b630331c6fb492a002057a9f93c794dd38e8d107750e1f5ab477c88b0647d67d15a1d6070c60e9dd8eac232d1c467722e17b82ddd89f9c0be81ad6e334efd9b1ad1fbd5bb6f358c9f1586cc38865dbe0fa007376fcf2edf53dfb6ae51df7e5743dc78209444a0e017db35889cd05db3e68396745ef3ea3f7bbe767de6f17ba062aab6e06c166e2583f62e1117957fb607677e38c03a3718d3b6b89be107b2607e7e4166af726b1cf24efdd9469e8327e3abee888ad461164bbba1260b43b85995ed5faa18d3162e880391958a88a1acdceaabdff61887ef0941497ab7731283c867a0275652ac3e87c8a46a7010fffb13052e49cc2bf20cfefaf7eba6c254899aecd7af06d8796c0cd25cfc0f9234f6e6180aa35b3bcc2beab3b08f16f8dd54cc95ed486688a685e93bedbb47b5e5c973d92aab436696dc56b4af55080cbf4f05d0972c23eca0849283da18a281e143926d758e718fa45ecc24ff774d2c2c47d36374e643863d234bc4596968592472284086220f6e369def97d6de51abc948ddd10afd2016d3fca95215c1523c8ba2f626ff4fb4886f65f9e5c95575711f9fe121dbb5d6aab3566c8dd773ecace00d19a0289ddcfbe79bbca3b3f9538460c6b01baf6ff744f8f1f6ea5c9e11bc52cf121e69f9520d60f992414872965e0602cfdeab145bba5eeba53afccf58f44a33e15df27c8855f1abaac7d78eef9ab7b1f348a0ac224584bcccd75aca63f1b2ad4b98b8658ed7e1a5ff7b65a508b096c1eb6a3332643739bf04cae3370faed282a35b6d6b70bed5cdc5169364d78c038bf9e447f1627b8769338b239e36281de54a2003ceabaaaff71ffa10d2f463855c33c71bc7e06da3be9ed07902564b7eb61fa27f9082f16f55bb6e5fe7999630384133dbfdadf46e2bc33ff718e80150499aec48906d6086e4f04651c2b893e708f31ba27f2025fdc8397c84ff71406842c4e6dc7c8a01ef1c243247ca4333d589883784993128368cbe581a9eadc16c4cc33b5c56e22f54b8edc356916b45affa9d80fd35d47dfa79b301268e5499ccc30debc52ee730f2c42ee19e5a5dffae7cfd4a2b99c4ed08c68f446b07a1ef6f3868410048702467850f5751ce0a26d0ace3a3985d0f0b3c07dd340e33769ec74b0c529ca73a5495a8b8c3e7ab508dbe2725887125dcca865a4059438a0c7995fa1529e4ea44e94799b6237d7121499692a4d335b53cce1e32404380e0bc185f44bc33b1bce335dfc54eb288ab5a5ef27550a37e46ef2ba9e23bddbf5e177b55e691e09b519cd42331ccf5be51ebb146fa56fa48bed6d1aa7be90bb0f671ff4ed038ced9d8371fef9cc6f191881a34aa6952654970a530284cf1d42807149cf0cf3de63d836cb0e90db35424ed853c15deb9cf98caee3ea972ff7d27f2416953ba0dd20d7d16d3b09e52a43654b092a0a14406c8b2abf27582fe00a18d6f7bbec02d3f099cf5c8e70fdc885472dd7e129317a953ed428e9a520db9aeec81908e3fead02db61f360338ccce63771054b9566733fd0f4d5047be9fc5a333ea626d88d1e8d398b83080f48a408864e198c4e2b3706f6e80771164742fe405ee3e50f776ad837733f65dc86791594449eb046abb15c2b42b23e644aaac54b73aace855a4229540165bf5b8d94e0963c7cf3359b467b00db127e6f6194f2926da6eb0bd73dd1d2dee116dbd1d1dd1fd7f89123dda86086a23450a7af34fdb79d873f8671cd381d8c0f80fbe6cf1c697f2be6171719f3f0c3ce381482595fa9a78ab87cc9658d8e5b83267caf2fb57a75a88faabcdaea0443afd8debbf68cda278c18ecc8dc89527ac4638aaea8fec6d016813577c6f26eb5d940ddc532657662932721b74113d48d7ab8b9a6d08623c1292338e2138cb48020adc7142a5acbb4ae25173adce9a6f20f55be1adb7e197adf81fde7ed8b0e82969a5392520dde77ea5c1850a5be72b381f05d546e884229947de4d52e69e9477ba3e737f831544b25e774d35be90e8f37dbf59ee84e329974d171193421b9d1f42b6510c61043ae94ff38eb93ce706119f329ac4c847f2c3add75faf49b5d0a395e6604a6b8731aca6180f07fefaf7d26891789701a8c92d7adfa1ccbcaf5cc716ba89f2ef26fcce88707c6571eaa2e55805d6c8431a78ccaa0e00af44877e901b32862e780c560bb6fe579b79167fcab1b9d958ae531addbc8a01179f208a183e532d6d28a6d5e697c2ce30be155e6cfc9c96db2c450cb90ed38e0377658d75b2a0cabfaacf48a2e90664da793aca09d936912c31b18bcf125f8de9e861a6b61257940d8fdf5c8fb3f961500f6491d10b09e56e9037ec9fc9c5b3f4ec4a08a93f643927386fb1f7b82f770976a2920c3dd51c0b8664c3c1fc5f5577e8c5784cb55bf5dc14e180d216c2d3bf37774b6705365ddf7420395c4f8cd57033673ede08c792acd5a6b9942aaaf567ebda59b97fa3740a8513c2e98d9f9f2d3f635366bd735646fbf998b43334649461f7217193ffdc382dcf221b2425943897a8453c8c20494c59553f9f2dde9e6eb012554bbb0d98966b69a2ffe9818c0f754d194b0acbaa9898df1088a810f9893bbede7dad51d58457970eb5c37e07ad7f3a87ec7fae498e0efff63cf26c847dec6d0b43f71e513aacd555ce143cbf0b2de1ae1cfa17d1b4a453900e77a7042b455ac3010f81d8f0b1020e48576fbce61a5cdcfdd6a4d8ba6cf14a72ea055fac65fd6603ee1f6132e558cbaf0293e5f5e4458d2f6f57b159efba249035e623508b6ebf4212880537054d2638794f65aaa8017b1f7982b3196940545698acf38825e190a4d7268936d38994caad4700a22b921d8f0d6372ef9543cad36d2c8db167953e174b33e0d71375cc296a8dce8b4f66a3ab868106131e54cb21e3a355baf2c2d04da339f4cb36cece67733a25e54195ffdb08eae0350b891fbefa1bf40f8d6c5513615f3ff0ff8a3be412c2a747327b6f737fd8790f5e0078615abc18d3428362aa08763522cfa86e07ad9eb7fcbfa9ab43f7329fc910353ba011cf50b5519ae25f0e6741357fafde7acac2807104c9acfbe107bcb1cd9b1aec4feccf4531585bf8fd1a9b1f3a14267f86ab85ada513e80795cb990bcde6edd3c214cf431902ef30e6c7c5c83f85fa64d81e62b969f925fda617700727896341006b5cfd71cec0966bdea79116667600b7b8fca3f7f5c38a598c544eb4b9c4ed471dd82012e8a7c5ba1adcfa7dd8ba392fc7ae6e2b716743aef3ec95544ed8557085520c693341f11519377fff8dcad507808df581eea2eecd79a526324d2c9de1c05645fdf97976a695738fa74cb609f13c38ea66361a2d05b085fb33b72d973dcfdcbd0e3a88c15cc8981d57b9493fc8d17368bba45767940f" + +} \ No newline at end of file diff --git a/test/contract/sequencerInboxForceInclude.spec.ts b/test/contract/sequencerInboxForceInclude.spec.ts index 5572ac70..b2c2e931 100644 --- a/test/contract/sequencerInboxForceInclude.spec.ts +++ b/test/contract/sequencerInboxForceInclude.spec.ts @@ -28,6 +28,7 @@ import { MessageTester, RollupMock__factory, SequencerInbox, + SequencerInboxOpt__factory, SequencerInbox__factory, TransparentUpgradeableProxy__factory, } from '../../build/types' @@ -39,6 +40,7 @@ import { MessageDeliveredEvent, } from '../../build/types/src/bridge/Bridge' import { Signer } from 'ethers' +import { data } from './batchData.json' const mineBlocks = async (count: number, timeDiffPerBlock = 14) => { const block = (await network.provider.send('eth_getBlockByNumber', [ @@ -265,12 +267,13 @@ describe('SequencerInboxForceInclude', async () => { const sequencerInboxFac = (await ethers.getContractFactory( 'SequencerInboxOpt' )) as SequencerInboxOpt__factory - sequencerInbox = await sequencerInboxFac.deploy(bridgeProxy.address, { - delayBlocks: maxDelayBlocks, - delaySeconds: maxDelayTime, - futureBlocks: 10, - futureSeconds: 3000, - }) + sequencerInbox = await sequencerInboxFac.deploy( + bridgeProxy.address, + maxDelayBlocks, + maxDelayTime, + 10, + 3000 + ) } else { const sequencerInboxFac = (await ethers.getContractFactory( 'SequencerInbox' @@ -396,7 +399,10 @@ describe('SequencerInboxForceInclude', async () => { ) ).wait() - console.log('saved', res1.gasUsed.toNumber() - res2.gasUsed.toNumber() - 44455 - 8175) + console.log( + 'saved', + res1.gasUsed.toNumber() - res2.gasUsed.toNumber() - 44455 - 8175 + ) }) it('can force-include', async () => { From 2b17df0065ffc8c8dbe356b813e60ce55e50f687 Mon Sep 17 00:00:00 2001 From: Chris Buckland Date: Wed, 4 Oct 2023 13:09:21 +0200 Subject: [PATCH 100/292] Added commentson max time variation --- src/bridge/ISequencerInboxOpt.sol | 12 +++++------- src/bridge/SequencerInboxOpt.sol | 3 +-- 2 files changed, 6 insertions(+), 9 deletions(-) diff --git a/src/bridge/ISequencerInboxOpt.sol b/src/bridge/ISequencerInboxOpt.sol index e2a8b2c7..d4a69a86 100644 --- a/src/bridge/ISequencerInboxOpt.sol +++ b/src/bridge/ISequencerInboxOpt.sol @@ -11,13 +11,6 @@ import "./IDelayedMessageProvider.sol"; import "./IBridge.sol"; interface ISequencerInboxOpt is IDelayedMessageProvider { - struct MaxTimeVariation { - uint256 delayBlocks; - uint256 futureBlocks; - uint256 delaySeconds; - uint256 futureSeconds; - } - struct TimeBounds { uint64 minTimestamp; uint64 maxTimestamp; @@ -76,6 +69,11 @@ interface ISequencerInboxOpt is IDelayedMessageProvider { uint64 creationBlock; } + /// @notice Returns the max time variation settings for this sequencer inbox + /// @return delayBlocks The max amount of blocks in the past that a message can be received on L2 + /// @return futureBlocks The max amount of blocks in the future that a message can be received on L2 + /// @return delaySeconds The max amount of seconds in the past that a message can be received on L2 + /// @return futureSeconds The max amount of seconds in the future that a message can be received on L2 function maxTimeVariation() external view diff --git a/src/bridge/SequencerInboxOpt.sol b/src/bridge/SequencerInboxOpt.sol index 9668b7f1..5a0462c9 100644 --- a/src/bridge/SequencerInboxOpt.sol +++ b/src/bridge/SequencerInboxOpt.sol @@ -56,7 +56,7 @@ contract SequencerInboxOpt is GasRefundEnabled, ISequencerInboxOpt { IOwnable public immutable rollup; mapping(address => bool) public isBatchPoster; - // CHRIS: TODO: docs + // see ISequencerInbox.maxTimeVariation uint256 internal immutable delayBlocks; uint256 internal immutable futureBlocks; uint256 internal immutable delaySeconds; @@ -122,7 +122,6 @@ contract SequencerInboxOpt is GasRefundEnabled, ISequencerInboxOpt { uint256, uint256 ) { - // CHRIS: TODO: test for this? if (_chainIdChanged()) { return ( 1, From ad06124d1b723121224fb5df211c0ee0c890e25b Mon Sep 17 00:00:00 2001 From: Chris Buckland Date: Wed, 4 Oct 2023 13:12:21 +0200 Subject: [PATCH 101/292] Removed deprecated method --- src/bridge/ISequencerInboxOpt.sol | 6 +++--- src/bridge/SequencerInboxOpt.sol | 36 +------------------------------ 2 files changed, 4 insertions(+), 38 deletions(-) diff --git a/src/bridge/ISequencerInboxOpt.sol b/src/bridge/ISequencerInboxOpt.sol index d4a69a86..5e655714 100644 --- a/src/bridge/ISequencerInboxOpt.sol +++ b/src/bridge/ISequencerInboxOpt.sol @@ -62,8 +62,6 @@ interface ISequencerInboxOpt is IDelayedMessageProvider { function isBatchPoster(address) external view returns (bool); - function isSequencer(address) external view returns (bool); - struct DasKeySetInfo { bool isValidKeyset; uint64 creationBlock; @@ -120,7 +118,9 @@ interface ISequencerInboxOpt is IDelayedMessageProvider { uint256 sequenceNumber, bytes calldata data, uint256 afterDelayedMessagesRead, - IGasRefunder gasRefunder + IGasRefunder gasRefunder, + uint256 prevMessageCount, + uint256 newMessageCount ) external; function addSequencerL2Batch( diff --git a/src/bridge/SequencerInboxOpt.sol b/src/bridge/SequencerInboxOpt.sol index 5a0462c9..aeb9844a 100644 --- a/src/bridge/SequencerInboxOpt.sol +++ b/src/bridge/SequencerInboxOpt.sol @@ -207,41 +207,7 @@ contract SequencerInboxOpt is GasRefundEnabled, ISequencerInboxOpt { BatchDataLocation.NoData ); } - - /// @dev Deprecated in favor of the variant specifying message counts for consistency - function addSequencerL2BatchFromOrigin( - uint256 sequenceNumber, - bytes calldata data, - uint256 afterDelayedMessagesRead, - IGasRefunder gasRefunder - ) external refundsGas(gasRefunder) { - // solhint-disable-next-line avoid-tx-origin - if (msg.sender != tx.origin) revert NotOrigin(); - if (!isBatchPoster[msg.sender]) revert NotBatchPoster(); - - (bytes32 dataHash, TimeBounds memory timeBounds) = formDataHash( - data, - afterDelayedMessagesRead - ); - ( - uint256 seqMessageIndex, - bytes32 beforeAcc, - bytes32 delayedAcc, - bytes32 afterAcc - ) = addSequencerL2BatchImpl(dataHash, afterDelayedMessagesRead, data.length, 0, 0); - if (seqMessageIndex != sequenceNumber) - revert BadSequencerNumber(seqMessageIndex, sequenceNumber); - emit SequencerBatchDelivered( - sequenceNumber, - beforeAcc, - afterAcc, - delayedAcc, - totalDelayedMessagesRead, - timeBounds, - BatchDataLocation.TxInput - ); - } - + function addSequencerL2BatchFromOrigin( uint256 sequenceNumber, bytes calldata data, From a4c38007f57cfacff91775f0629dc537e8265b8d Mon Sep 17 00:00:00 2001 From: Chris Buckland Date: Wed, 4 Oct 2023 14:45:16 +0200 Subject: [PATCH 102/292] Updated tests --- deploy/BridgeStubCreator.js | 2 +- src/bridge/ISequencerInbox.sol | 29 +- src/bridge/ISequencerInboxOpt.sol | 163 ------ src/bridge/SequencerInbox.sol | 121 ++--- src/bridge/SequencerInboxOpt.sol | 488 ------------------ src/mocks/BridgeStub.sol | 10 +- src/mocks/SequencerInboxStub.sol | 6 +- src/rollup/BridgeCreator.sol | 11 +- test/contract/arbRollup.spec.ts | 6 - .../sequencerInboxForceInclude.spec.ts | 95 +--- test/contract/validatorWallet.spec.ts | 5 +- 11 files changed, 84 insertions(+), 852 deletions(-) delete mode 100644 src/bridge/ISequencerInboxOpt.sol delete mode 100644 src/bridge/SequencerInboxOpt.sol diff --git a/deploy/BridgeStubCreator.js b/deploy/BridgeStubCreator.js index 9fe34dde..99e524af 100644 --- a/deploy/BridgeStubCreator.js +++ b/deploy/BridgeStubCreator.js @@ -3,7 +3,7 @@ module.exports = async hre => { const { deploy } = deployments const { deployer } = await getNamedAccounts() - await deploy('BridgeStub', { from: deployer, args: [] }) + await deploy('BridgeStub', { from: deployer, args: [deployer] }) } module.exports.tags = ['BridgeStub', 'test'] diff --git a/src/bridge/ISequencerInbox.sol b/src/bridge/ISequencerInbox.sol index 5f19471e..fe3d6b4f 100644 --- a/src/bridge/ISequencerInbox.sol +++ b/src/bridge/ISequencerInbox.sol @@ -69,28 +69,25 @@ interface ISequencerInbox is IDelayedMessageProvider { function isBatchPoster(address) external view returns (bool); - function isSequencer(address) external view returns (bool); - struct DasKeySetInfo { bool isValidKeyset; uint64 creationBlock; } + /// @notice Returns the max time variation settings for this sequencer inbox + // /// @return delayBlocks The max amount of blocks in the past that a message can be received on L2 + // /// @return futureBlocks The max amount of blocks in the future that a message can be received on L2 + // /// @return delaySeconds The max amount of seconds in the past that a message can be received on L2 + // /// @return futureSeconds The max amount of seconds in the future that a message can be received on L2 function maxTimeVariation() external view returns ( - uint256, - uint256, - uint256, - uint256 + ISequencerInbox.MaxTimeVariation memory ); function dasKeySetInfo(bytes32) external view returns (bool, uint64); - /// @notice Remove force inclusion delay after a L1 chainId fork - function removeDelayAfterFork() 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 @@ -125,7 +122,9 @@ interface ISequencerInbox is IDelayedMessageProvider { uint256 sequenceNumber, bytes calldata data, uint256 afterDelayedMessagesRead, - IGasRefunder gasRefunder + IGasRefunder gasRefunder, + uint256 prevMessageCount, + uint256 newMessageCount ) external; function addSequencerL2Batch( @@ -139,12 +138,6 @@ interface ISequencerInbox is IDelayedMessageProvider { // ---------- onlyRollupOrOwner functions ---------- - /** - * @notice Set max delay for sequencer inbox - * @param maxTimeVariation_ the maximum time variation parameters - */ - function setMaxTimeVariation(MaxTimeVariation memory maxTimeVariation_) external; - /** * @notice Updates whether an address is authorized to be a batch poster at the sequencer inbox * @param addr the address @@ -171,8 +164,4 @@ interface ISequencerInbox is IDelayedMessageProvider { * @param isSequencer_ if the specified address should be authorized as a sequencer */ function setIsSequencer(address addr, bool isSequencer_) external; - - // ---------- initializer ---------- - - function initialize(IBridge bridge_, MaxTimeVariation calldata maxTimeVariation_) external; } diff --git a/src/bridge/ISequencerInboxOpt.sol b/src/bridge/ISequencerInboxOpt.sol deleted file mode 100644 index 5e655714..00000000 --- a/src/bridge/ISequencerInboxOpt.sol +++ /dev/null @@ -1,163 +0,0 @@ -// 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-version -pragma solidity >=0.6.9 <0.9.0; -pragma experimental ABIEncoderV2; - -import "../libraries/IGasRefunder.sol"; -import "./IDelayedMessageProvider.sol"; -import "./IBridge.sol"; - -interface ISequencerInboxOpt is IDelayedMessageProvider { - struct TimeBounds { - uint64 minTimestamp; - uint64 maxTimestamp; - uint64 minBlockNumber; - uint64 maxBlockNumber; - } - - enum BatchDataLocation { - TxInput, - SeparateBatchEvent, - NoData - } - - event SequencerBatchDelivered( - uint256 indexed batchSequenceNumber, - bytes32 indexed beforeAcc, - bytes32 indexed afterAcc, - bytes32 delayedAcc, - uint256 afterDelayedMessagesRead, - TimeBounds timeBounds, - BatchDataLocation dataLocation - ); - - event OwnerFunctionCalled(uint256 indexed id); - - /// @dev a separate event that emits batch data when this isn't easily accessible in the tx.input - event SequencerBatchData(uint256 indexed batchSequenceNumber, bytes data); - - /// @dev a valid keyset was added - event SetValidKeyset(bytes32 indexed keysetHash, bytes keysetBytes); - - /// @dev a keyset was invalidated - event InvalidateKeyset(bytes32 indexed keysetHash); - - function totalDelayedMessagesRead() external view returns (uint256); - - function bridge() external view returns (IBridge); - - /// @dev The size of the batch header - // solhint-disable-next-line func-name-mixedcase - function HEADER_LENGTH() external view returns (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-mixedcase - function DATA_AUTHENTICATED_FLAG() external view returns (bytes1); - - function rollup() external view returns (IOwnable); - - function isBatchPoster(address) external view returns (bool); - - struct DasKeySetInfo { - bool isValidKeyset; - uint64 creationBlock; - } - - /// @notice Returns the max time variation settings for this sequencer inbox - /// @return delayBlocks The max amount of blocks in the past that a message can be received on L2 - /// @return futureBlocks The max amount of blocks in the future that a message can be received on L2 - /// @return delaySeconds The max amount of seconds in the past that a message can be received on L2 - /// @return futureSeconds The max amount of seconds in the future that a message can be received on L2 - function maxTimeVariation() - external - view - returns ( - uint256, - uint256, - uint256, - uint256 - ); - - function dasKeySetInfo(bytes32) external view returns (bool, uint64); - - /// @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 included - function forceInclusion( - uint256 _totalDelayedMessagesRead, - uint8 kind, - uint64[2] calldata l1BlockAndTime, - uint256 baseFeeL1, - address sender, - bytes32 messageDataHash - ) external; - - function inboxAccs(uint256 index) external view returns (bytes32); - - function batchCount() external view returns (uint256); - - function isValidKeysetHash(bytes32 ksHash) external view returns (bool); - - /// @notice the creation block is intended to still be available after a keyset is deleted - function getKeysetCreationBlock(bytes32 ksHash) external view returns (uint256); - - // ---------- BatchPoster functions ---------- - - function addSequencerL2BatchFromOrigin( - uint256 sequenceNumber, - bytes calldata data, - uint256 afterDelayedMessagesRead, - IGasRefunder gasRefunder, - uint256 prevMessageCount, - uint256 newMessageCount - ) external; - - function addSequencerL2Batch( - uint256 sequenceNumber, - bytes calldata data, - uint256 afterDelayedMessagesRead, - IGasRefunder gasRefunder, - uint256 prevMessageCount, - uint256 newMessageCount - ) external; - - // ---------- onlyRollupOrOwner functions ---------- - - /** - * @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 - */ - function setIsBatchPoster(address addr, bool isBatchPoster_) external; - - /** - * @notice Makes Data Availability Service keyset valid - * @param keysetBytes bytes of the serialized keyset - */ - function setValidKeyset(bytes calldata keysetBytes) external; - - /** - * @notice Invalidates a Data Availability Service keyset - * @param ksHash hash of the keyset - */ - function invalidateKeysetHash(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 - */ - function setIsSequencer(address addr, bool isSequencer_) external; -} diff --git a/src/bridge/SequencerInbox.sol b/src/bridge/SequencerInbox.sol index 2ba25c16..5b8138ac 100644 --- a/src/bridge/SequencerInbox.sol +++ b/src/bridge/SequencerInbox.sol @@ -20,7 +20,8 @@ import { DataNotAuthenticated, AlreadyValidDASKeyset, NoSuchKeyset, - NotForked + NotForked, + NotOwner } from "../libraries/Error.sol"; import "./IBridge.sol"; import "./IInbox.sol"; @@ -32,7 +33,6 @@ import "../precompiles/ArbSys.sol"; import {L1MessageType_batchPostingReport} from "../libraries/MessageTypes.sol"; import {GasRefundEnabled, IGasRefunder} from "../libraries/IGasRefunder.sol"; -import "../libraries/DelegateCallAware.sol"; import "../libraries/ArbitrumChecker.sol"; import {MAX_DATA_SIZE} from "../libraries/Constants.sol"; @@ -43,10 +43,10 @@ import {MAX_DATA_SIZE} from "../libraries/Constants.sol"; * in the delayed inbox (Bridge.sol). If items in the delayed inbox are not included by a * sequencer within a time limit they can be force included into the rollup inbox by anyone. */ -contract SequencerInbox is DelegateCallAware, GasRefundEnabled, ISequencerInbox { +contract SequencerInbox is GasRefundEnabled, ISequencerInbox { uint256 public totalDelayedMessagesRead; - IBridge public bridge; + IBridge public immutable bridge; /// @inheritdoc ISequencerInbox uint256 public constant HEADER_LENGTH = 40; @@ -54,9 +54,13 @@ contract SequencerInbox is DelegateCallAware, GasRefundEnabled, ISequencerInbox /// @inheritdoc ISequencerInbox bytes1 public constant DATA_AUTHENTICATED_FLAG = 0x40; - IOwnable public rollup; + IOwnable public immutable rollup; mapping(address => bool) public isBatchPoster; - ISequencerInbox.MaxTimeVariation public maxTimeVariation; + // see ISequencerInbox.maxTimeVariation + uint256 internal immutable delayBlocks; + uint256 internal immutable futureBlocks; + uint256 internal immutable delaySeconds; + uint256 internal immutable futureSeconds; mapping(bytes32 => DasKeySetInfo) public dasKeySetInfo; @@ -76,39 +80,51 @@ contract SequencerInbox is DelegateCallAware, GasRefundEnabled, ISequencerInbox return deployTimeChainId != block.chainid; } - function initialize( + constructor( IBridge bridge_, - ISequencerInbox.MaxTimeVariation calldata maxTimeVariation_ - ) external onlyDelegated { - if (bridge != IBridge(address(0))) revert AlreadyInit(); + ISequencerInbox.MaxTimeVariation memory maxTimeVariation_ + ) { if (bridge_ == IBridge(address(0))) revert HadZeroInit(); bridge = bridge_; rollup = bridge_.rollup(); - maxTimeVariation = maxTimeVariation_; + delayBlocks = maxTimeVariation_.delayBlocks; + futureBlocks = maxTimeVariation_.futureBlocks; + delaySeconds = maxTimeVariation_.delaySeconds; + futureSeconds = maxTimeVariation_.futureSeconds; } function getTimeBounds() internal view virtual returns (TimeBounds memory) { TimeBounds memory bounds; - if (block.timestamp > maxTimeVariation.delaySeconds) { - bounds.minTimestamp = uint64(block.timestamp - maxTimeVariation.delaySeconds); + ISequencerInbox.MaxTimeVariation memory maxTimeVariation_ = maxTimeVariation(); + if (block.timestamp > maxTimeVariation_.delaySeconds) { + bounds.minTimestamp = uint64(block.timestamp - maxTimeVariation_.delaySeconds); } - bounds.maxTimestamp = uint64(block.timestamp + maxTimeVariation.futureSeconds); - if (block.number > maxTimeVariation.delayBlocks) { - bounds.minBlockNumber = uint64(block.number - maxTimeVariation.delayBlocks); + bounds.maxTimestamp = uint64(block.timestamp + maxTimeVariation_.futureSeconds); + if (block.number > maxTimeVariation_.delayBlocks) { + bounds.minBlockNumber = uint64(block.number - maxTimeVariation_.delayBlocks); } - bounds.maxBlockNumber = uint64(block.number + maxTimeVariation.futureBlocks); + bounds.maxBlockNumber = uint64(block.number + maxTimeVariation_.futureBlocks); return bounds; } - /// @inheritdoc ISequencerInbox - function removeDelayAfterFork() external { - if (!_chainIdChanged()) revert NotForked(); - maxTimeVariation = ISequencerInbox.MaxTimeVariation({ - delayBlocks: 1, - futureBlocks: 1, - delaySeconds: 1, - futureSeconds: 1 - }); + function maxTimeVariation() public view returns( + ISequencerInbox.MaxTimeVariation memory + ) { + if (_chainIdChanged()) { + return ISequencerInbox.MaxTimeVariation({ + delayBlocks: 1, + futureBlocks: 1, + delaySeconds: 1, + futureSeconds: 1 + }); + } else { + return ISequencerInbox.MaxTimeVariation({ + delayBlocks: delayBlocks, + futureBlocks: futureBlocks, + delaySeconds: delaySeconds, + futureSeconds: futureSeconds + }); + } } /// @inheritdoc ISequencerInbox @@ -130,10 +146,11 @@ contract SequencerInbox is DelegateCallAware, GasRefundEnabled, ISequencerInbox baseFeeL1, messageDataHash ); + ISequencerInbox.MaxTimeVariation memory maxTimeVariation_ = maxTimeVariation(); // Can only force-include after the Sequencer-only window has expired. - if (l1BlockAndTime[0] + maxTimeVariation.delayBlocks >= block.number) + if (l1BlockAndTime[0] + maxTimeVariation_.delayBlocks >= block.number) revert ForceIncludeBlockTooSoon(); - if (l1BlockAndTime[1] + maxTimeVariation.delaySeconds >= block.timestamp) + if (l1BlockAndTime[1] + maxTimeVariation_.delaySeconds >= block.timestamp) revert ForceIncludeTimeTooSoon(); // Verify that message hash represents the last message sequence of delayed message to be included @@ -176,41 +193,7 @@ contract SequencerInbox is DelegateCallAware, GasRefundEnabled, ISequencerInbox BatchDataLocation.NoData ); } - - /// @dev Deprecated in favor of the variant specifying message counts for consistency - function addSequencerL2BatchFromOrigin( - uint256 sequenceNumber, - bytes calldata data, - uint256 afterDelayedMessagesRead, - IGasRefunder gasRefunder - ) external refundsGas(gasRefunder) { - // solhint-disable-next-line avoid-tx-origin - if (msg.sender != tx.origin) revert NotOrigin(); - if (!isBatchPoster[msg.sender]) revert NotBatchPoster(); - - (bytes32 dataHash, TimeBounds memory timeBounds) = formDataHash( - data, - afterDelayedMessagesRead - ); - ( - uint256 seqMessageIndex, - bytes32 beforeAcc, - bytes32 delayedAcc, - bytes32 afterAcc - ) = addSequencerL2BatchImpl(dataHash, afterDelayedMessagesRead, data.length, 0, 0); - if (seqMessageIndex != sequenceNumber) - revert BadSequencerNumber(seqMessageIndex, sequenceNumber); - emit SequencerBatchDelivered( - sequenceNumber, - beforeAcc, - afterAcc, - delayedAcc, - totalDelayedMessagesRead, - timeBounds, - BatchDataLocation.TxInput - ); - } - + function addSequencerL2BatchFromOrigin( uint256 sequenceNumber, bytes calldata data, @@ -433,18 +416,12 @@ contract SequencerInbox is DelegateCallAware, GasRefundEnabled, ISequencerInbox return bridge.sequencerMessageCount(); } - /// @inheritdoc ISequencerInbox - function setMaxTimeVariation(ISequencerInbox.MaxTimeVariation memory maxTimeVariation_) - external - onlyRollupOwner - { - maxTimeVariation = maxTimeVariation_; - emit OwnerFunctionCalled(0); - } - /// @inheritdoc ISequencerInbox function setIsBatchPoster(address addr, bool isBatchPoster_) external onlyRollupOwner { isBatchPoster[addr] = isBatchPoster_; + // we used to have OwnerFunctionCalled(0) for setting the maxTimeVariation + // so we dont use index = 0 here, even though this is the first owner function + // to stay compatible with legacy events emit OwnerFunctionCalled(1); } diff --git a/src/bridge/SequencerInboxOpt.sol b/src/bridge/SequencerInboxOpt.sol deleted file mode 100644 index aeb9844a..00000000 --- a/src/bridge/SequencerInboxOpt.sol +++ /dev/null @@ -1,488 +0,0 @@ -// 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 - -pragma solidity ^0.8.0; - -import { - AlreadyInit, - HadZeroInit, - NotOrigin, - DataTooLarge, - NotRollup, - DelayedBackwards, - DelayedTooFar, - ForceIncludeBlockTooSoon, - ForceIncludeTimeTooSoon, - IncorrectMessagePreimage, - NotBatchPoster, - BadSequencerNumber, - DataNotAuthenticated, - AlreadyValidDASKeyset, - NoSuchKeyset, - NotForked, - NotOwner -} from "../libraries/Error.sol"; -import "./IBridge.sol"; -import "./IInbox.sol"; -import "./ISequencerInboxOpt.sol"; -import "../rollup/IRollupLogic.sol"; -import "./Messages.sol"; -import "../precompiles/ArbGasInfo.sol"; -import "../precompiles/ArbSys.sol"; - -import {L1MessageType_batchPostingReport} from "../libraries/MessageTypes.sol"; -import {GasRefundEnabled, IGasRefunder} from "../libraries/IGasRefunder.sol"; -import "../libraries/ArbitrumChecker.sol"; -import {MAX_DATA_SIZE} from "../libraries/Constants.sol"; - -/** - * @title Accepts batches from the sequencer and adds them to the rollup inbox. - * @notice Contains the inbox accumulator which is the ordering of all data and transactions to be processed by the rollup. - * As part of submitting a batch the sequencer is also expected to include items enqueued - * in the delayed inbox (Bridge.sol). If items in the delayed inbox are not included by a - * sequencer within a time limit they can be force included into the rollup inbox by anyone. - */ -contract SequencerInboxOpt is GasRefundEnabled, ISequencerInboxOpt { - uint256 public totalDelayedMessagesRead; - - IBridge public immutable bridge; - - /// @inheritdoc ISequencerInboxOpt - uint256 public constant HEADER_LENGTH = 40; - - /// @inheritdoc ISequencerInboxOpt - bytes1 public constant DATA_AUTHENTICATED_FLAG = 0x40; - - IOwnable public immutable rollup; - mapping(address => bool) public isBatchPoster; - // see ISequencerInbox.maxTimeVariation - uint256 internal immutable delayBlocks; - uint256 internal immutable futureBlocks; - uint256 internal immutable delaySeconds; - uint256 internal immutable futureSeconds; - - mapping(bytes32 => DasKeySetInfo) public dasKeySetInfo; - - modifier onlyRollupOwner() { - if (msg.sender != rollup.owner()) revert NotOwner(msg.sender, address(rollup)); - _; - } - - uint256 internal immutable deployTimeChainId = block.chainid; - - mapping(address => bool) public isSequencer; - - // If the chain this SequencerInbox is deployed on is an Arbitrum chain. - bool internal immutable hostChainIsArbitrum = ArbitrumChecker.runningOnArbitrum(); - - function _chainIdChanged() internal view returns (bool) { - return deployTimeChainId != block.chainid; - } - - constructor( - IBridge bridge_, - uint256 delayBlocks_, - uint256 futureBlocks_, - uint256 delaySeconds_, - uint256 futureSeconds_ - ) { - if (bridge_ == IBridge(address(0))) revert HadZeroInit(); - bridge = bridge_; - rollup = bridge_.rollup(); - delayBlocks = delayBlocks_; - futureBlocks = futureBlocks_; - delaySeconds = delaySeconds_; - futureSeconds = futureSeconds_; - } - - function getTimeBounds() internal view virtual returns (TimeBounds memory) { - TimeBounds memory bounds; - ( - uint256 delayBlocks_, - uint256 futureBlocks_, - uint256 delaySeconds_, - uint256 futureSeconds_ - ) = maxTimeVariation(); - - if (block.timestamp > delaySeconds_) { - bounds.minTimestamp = uint64(block.timestamp - delaySeconds_); - } - bounds.maxTimestamp = uint64(block.timestamp + futureSeconds_); - if (block.number > delayBlocks_) { - bounds.minBlockNumber = uint64(block.number - delayBlocks_); - } - bounds.maxBlockNumber = uint64(block.number + futureBlocks_); - return bounds; - } - - function maxTimeVariation() public view returns( - uint256, - uint256, - uint256, - uint256 - ) { - if (_chainIdChanged()) { - return ( - 1, - 1, - 1, - 1 - ); - } else { - return ( - delayBlocks, - futureBlocks, - delaySeconds, - futureSeconds - ); - } - } - - /// @inheritdoc ISequencerInboxOpt - function forceInclusion( - uint256 _totalDelayedMessagesRead, - uint8 kind, - uint64[2] calldata l1BlockAndTime, - uint256 baseFeeL1, - address sender, - bytes32 messageDataHash - ) external { - if (_totalDelayedMessagesRead <= totalDelayedMessagesRead) revert DelayedBackwards(); - bytes32 messageHash = Messages.messageHash( - kind, - sender, - l1BlockAndTime[0], - l1BlockAndTime[1], - _totalDelayedMessagesRead - 1, - baseFeeL1, - messageDataHash - ); - ( - uint256 delayBlocks_,,uint256 delaySeconds_, - ) = maxTimeVariation(); - // Can only force-include after the Sequencer-only window has expired. - if (l1BlockAndTime[0] + delayBlocks_ >= block.number) - revert ForceIncludeBlockTooSoon(); - if (l1BlockAndTime[1] + delaySeconds_ >= block.timestamp) - revert ForceIncludeTimeTooSoon(); - - // Verify that message hash represents the last message sequence of delayed message to be included - bytes32 prevDelayedAcc = 0; - if (_totalDelayedMessagesRead > 1) { - prevDelayedAcc = bridge.delayedInboxAccs(_totalDelayedMessagesRead - 2); - } - if ( - bridge.delayedInboxAccs(_totalDelayedMessagesRead - 1) != - Messages.accumulateInboxMessage(prevDelayedAcc, messageHash) - ) revert IncorrectMessagePreimage(); - - (bytes32 dataHash, TimeBounds memory timeBounds) = formEmptyDataHash( - _totalDelayedMessagesRead - ); - uint256 __totalDelayedMessagesRead = _totalDelayedMessagesRead; - uint256 prevSeqMsgCount = bridge.sequencerReportedSubMessageCount(); - uint256 newSeqMsgCount = prevSeqMsgCount + - _totalDelayedMessagesRead - - totalDelayedMessagesRead; - ( - uint256 seqMessageIndex, - bytes32 beforeAcc, - bytes32 delayedAcc, - bytes32 afterAcc - ) = addSequencerL2BatchImpl( - dataHash, - __totalDelayedMessagesRead, - 0, - prevSeqMsgCount, - newSeqMsgCount - ); - emit SequencerBatchDelivered( - seqMessageIndex, - beforeAcc, - afterAcc, - delayedAcc, - totalDelayedMessagesRead, - timeBounds, - BatchDataLocation.NoData - ); - } - - function addSequencerL2BatchFromOrigin( - uint256 sequenceNumber, - bytes calldata data, - uint256 afterDelayedMessagesRead, - IGasRefunder gasRefunder, - uint256 prevMessageCount, - uint256 newMessageCount - ) external refundsGas(gasRefunder) { - // solhint-disable-next-line avoid-tx-origin - if (msg.sender != tx.origin) revert NotOrigin(); - if (!isBatchPoster[msg.sender]) revert NotBatchPoster(); - (bytes32 dataHash, TimeBounds memory timeBounds) = formDataHash( - data, - afterDelayedMessagesRead - ); - // Reformat the stack to prevent "Stack too deep" - uint256 sequenceNumber_ = sequenceNumber; - TimeBounds memory timeBounds_ = timeBounds; - bytes32 dataHash_ = dataHash; - uint256 dataLength = data.length; - uint256 afterDelayedMessagesRead_ = afterDelayedMessagesRead; - uint256 prevMessageCount_ = prevMessageCount; - uint256 newMessageCount_ = newMessageCount; - ( - uint256 seqMessageIndex, - bytes32 beforeAcc, - bytes32 delayedAcc, - bytes32 afterAcc - ) = addSequencerL2BatchImpl( - dataHash_, - afterDelayedMessagesRead_, - dataLength, - prevMessageCount_, - newMessageCount_ - ); - if (seqMessageIndex != sequenceNumber_ && sequenceNumber_ != ~uint256(0)) - revert BadSequencerNumber(seqMessageIndex, sequenceNumber_); - emit SequencerBatchDelivered( - seqMessageIndex, - beforeAcc, - afterAcc, - delayedAcc, - totalDelayedMessagesRead, - timeBounds_, - BatchDataLocation.TxInput - ); - } - - function addSequencerL2Batch( - uint256 sequenceNumber, - bytes calldata data, - uint256 afterDelayedMessagesRead, - IGasRefunder gasRefunder, - uint256 prevMessageCount, - uint256 newMessageCount - ) external override refundsGas(gasRefunder) { - if (!isBatchPoster[msg.sender] && msg.sender != address(rollup)) revert NotBatchPoster(); - (bytes32 dataHash, TimeBounds memory timeBounds) = formDataHash( - data, - afterDelayedMessagesRead - ); - uint256 seqMessageIndex; - { - // Reformat the stack to prevent "Stack too deep" - uint256 sequenceNumber_ = sequenceNumber; - TimeBounds memory timeBounds_ = timeBounds; - bytes32 dataHash_ = dataHash; - uint256 afterDelayedMessagesRead_ = afterDelayedMessagesRead; - uint256 prevMessageCount_ = prevMessageCount; - uint256 newMessageCount_ = newMessageCount; - // we set the calldata length posted to 0 here since the caller isn't the origin - // of the tx, so they might have not paid tx input cost for the calldata - bytes32 beforeAcc; - bytes32 delayedAcc; - bytes32 afterAcc; - (seqMessageIndex, beforeAcc, delayedAcc, afterAcc) = addSequencerL2BatchImpl( - dataHash_, - afterDelayedMessagesRead_, - 0, - prevMessageCount_, - newMessageCount_ - ); - if (seqMessageIndex != sequenceNumber_ && sequenceNumber_ != ~uint256(0)) - revert BadSequencerNumber(seqMessageIndex, sequenceNumber_); - emit SequencerBatchDelivered( - seqMessageIndex, - beforeAcc, - afterAcc, - delayedAcc, - totalDelayedMessagesRead, - timeBounds_, - BatchDataLocation.SeparateBatchEvent - ); - } - emit SequencerBatchData(seqMessageIndex, data); - } - - modifier validateBatchData(bytes calldata data) { - uint256 fullDataLen = HEADER_LENGTH + data.length; - if (fullDataLen > MAX_DATA_SIZE) revert DataTooLarge(fullDataLen, MAX_DATA_SIZE); - if (data.length > 0 && (data[0] & DATA_AUTHENTICATED_FLAG) == DATA_AUTHENTICATED_FLAG) { - revert DataNotAuthenticated(); - } - // the first byte is used to identify the type of batch data - // das batches expect to have the type byte set, followed by the keyset (so they should have at least 33 bytes) - if (data.length >= 33 && data[0] & 0x80 != 0) { - // we skip the first byte, then read the next 32 bytes for the keyset - bytes32 dasKeysetHash = bytes32(data[1:33]); - if (!dasKeySetInfo[dasKeysetHash].isValidKeyset) revert NoSuchKeyset(dasKeysetHash); - } - _; - } - - function packHeader(uint256 afterDelayedMessagesRead) - internal - view - returns (bytes memory, TimeBounds memory) - { - TimeBounds memory timeBounds = getTimeBounds(); - bytes memory header = abi.encodePacked( - timeBounds.minTimestamp, - timeBounds.maxTimestamp, - timeBounds.minBlockNumber, - timeBounds.maxBlockNumber, - uint64(afterDelayedMessagesRead) - ); - // This must always be true from the packed encoding - assert(header.length == HEADER_LENGTH); - return (header, timeBounds); - } - - function formDataHash(bytes calldata data, uint256 afterDelayedMessagesRead) - internal - view - validateBatchData(data) - returns (bytes32, TimeBounds memory) - { - (bytes memory header, TimeBounds memory timeBounds) = packHeader(afterDelayedMessagesRead); - bytes32 dataHash = keccak256(bytes.concat(header, data)); - return (dataHash, timeBounds); - } - - function formEmptyDataHash(uint256 afterDelayedMessagesRead) - internal - view - returns (bytes32, TimeBounds memory) - { - (bytes memory header, TimeBounds memory timeBounds) = packHeader(afterDelayedMessagesRead); - return (keccak256(header), timeBounds); - } - - function addSequencerL2BatchImpl( - bytes32 dataHash, - uint256 afterDelayedMessagesRead, - uint256 calldataLengthPosted, - uint256 prevMessageCount, - uint256 newMessageCount - ) - internal - returns ( - uint256 seqMessageIndex, - bytes32 beforeAcc, - bytes32 delayedAcc, - bytes32 acc - ) - { - if (afterDelayedMessagesRead < totalDelayedMessagesRead) revert DelayedBackwards(); - if (afterDelayedMessagesRead > bridge.delayedMessageCount()) revert DelayedTooFar(); - - (seqMessageIndex, beforeAcc, delayedAcc, acc) = bridge.enqueueSequencerMessage( - dataHash, - afterDelayedMessagesRead, - prevMessageCount, - newMessageCount - ); - - totalDelayedMessagesRead = afterDelayedMessagesRead; - - if (calldataLengthPosted > 0) { - // this msg isn't included in the current sequencer batch, but instead added to - // the delayed messages queue that is yet to be included - address batchPoster = msg.sender; - bytes memory spendingReportMsg; - if (hostChainIsArbitrum) { - // Include extra gas for the host chain's L1 gas charging - uint256 l1Fees = ArbGasInfo(address(0x6c)).getCurrentTxL1GasFees(); - uint256 extraGas = l1Fees / block.basefee; - require(extraGas <= type(uint64).max, "L1_GAS_NOT_UINT64"); - spendingReportMsg = abi.encodePacked( - block.timestamp, - batchPoster, - dataHash, - seqMessageIndex, - block.basefee, - uint64(extraGas) - ); - } else { - spendingReportMsg = abi.encodePacked( - block.timestamp, - batchPoster, - dataHash, - seqMessageIndex, - block.basefee - ); - } - uint256 msgNum = bridge.submitBatchSpendingReport( - batchPoster, - keccak256(spendingReportMsg) - ); - // this is the same event used by Inbox.sol after including a message to the delayed message accumulator - emit InboxMessageDelivered(msgNum, spendingReportMsg); - } - } - - function inboxAccs(uint256 index) external view returns (bytes32) { - return bridge.sequencerInboxAccs(index); - } - - function batchCount() external view returns (uint256) { - return bridge.sequencerMessageCount(); - } - - /// @inheritdoc ISequencerInboxOpt - function setIsBatchPoster(address addr, bool isBatchPoster_) external onlyRollupOwner { - isBatchPoster[addr] = isBatchPoster_; - // we used to have OwnerFunctionCalled(0) for setting the maxTimeVariation - // so we dont use index = 0 here, even though this is the first owner function - // to stay compatible with legacy events - emit OwnerFunctionCalled(1); - } - - /// @inheritdoc ISequencerInboxOpt - function setValidKeyset(bytes calldata keysetBytes) external onlyRollupOwner { - uint256 ksWord = uint256(keccak256(bytes.concat(hex"fe", keccak256(keysetBytes)))); - bytes32 ksHash = bytes32(ksWord ^ (1 << 255)); - require(keysetBytes.length < 64 * 1024, "keyset is too large"); - - if (dasKeySetInfo[ksHash].isValidKeyset) revert AlreadyValidDASKeyset(ksHash); - uint256 creationBlock = block.number; - if (hostChainIsArbitrum) { - creationBlock = ArbSys(address(100)).arbBlockNumber(); - } - dasKeySetInfo[ksHash] = DasKeySetInfo({ - isValidKeyset: true, - creationBlock: uint64(creationBlock) - }); - emit SetValidKeyset(ksHash, keysetBytes); - emit OwnerFunctionCalled(2); - } - - /// @inheritdoc ISequencerInboxOpt - function invalidateKeysetHash(bytes32 ksHash) external onlyRollupOwner { - if (!dasKeySetInfo[ksHash].isValidKeyset) revert NoSuchKeyset(ksHash); - // we don't delete the block creation value since its used to fetch the SetValidKeyset - // event efficiently. The event provides the hash preimage of the key. - // this is still needed when syncing the chain after a keyset is invalidated. - dasKeySetInfo[ksHash].isValidKeyset = false; - emit InvalidateKeyset(ksHash); - emit OwnerFunctionCalled(3); - } - - /// @inheritdoc ISequencerInboxOpt - function setIsSequencer(address addr, bool isSequencer_) external onlyRollupOwner { - isSequencer[addr] = isSequencer_; - emit OwnerFunctionCalled(4); - } - - function isValidKeysetHash(bytes32 ksHash) external view returns (bool) { - return dasKeySetInfo[ksHash].isValidKeyset; - } - - /// @inheritdoc ISequencerInboxOpt - function getKeysetCreationBlock(bytes32 ksHash) external view returns (uint256) { - DasKeySetInfo memory ksInfo = dasKeySetInfo[ksHash]; - if (ksInfo.creationBlock == 0) revert NoSuchKeyset(ksHash); - return uint256(ksInfo.creationBlock); - } -} diff --git a/src/mocks/BridgeStub.sol b/src/mocks/BridgeStub.sol index d0f9e8cc..90cc2e40 100644 --- a/src/mocks/BridgeStub.sol +++ b/src/mocks/BridgeStub.sol @@ -30,12 +30,18 @@ contract BridgeStub is IBridge { address public sequencerInbox; uint256 public override sequencerReportedSubMessageCount; + IOwnable public rollup; + + constructor(IOwnable rollup_) { + rollup = rollup_; + } function setSequencerInbox(address _sequencerInbox) external override { sequencerInbox = _sequencerInbox; emit SequencerInboxUpdated(_sequencerInbox); } + function allowedDelayedInboxes(address inbox) external view override returns (bool) { return allowedDelayedInboxesMap[inbox].allowed; } @@ -170,10 +176,6 @@ contract BridgeStub is IBridge { return sequencerInboxAccs.length; } - function rollup() external pure override returns (IOwnable) { - revert("NOT_IMPLEMENTED"); - } - function acceptFundsFromOldBridge() external payable {} function initialize(IOwnable) external pure { diff --git a/src/mocks/SequencerInboxStub.sol b/src/mocks/SequencerInboxStub.sol index c476043b..507284c4 100644 --- a/src/mocks/SequencerInboxStub.sol +++ b/src/mocks/SequencerInboxStub.sol @@ -12,10 +12,10 @@ contract SequencerInboxStub is SequencerInbox { IBridge bridge_, address sequencer_, ISequencerInbox.MaxTimeVariation memory maxTimeVariation_ + ) SequencerInbox( + bridge_, + maxTimeVariation_ ) { - bridge = bridge_; - rollup = IOwnable(msg.sender); - maxTimeVariation = maxTimeVariation_; isBatchPoster[sequencer_] = true; } diff --git a/src/rollup/BridgeCreator.sol b/src/rollup/BridgeCreator.sol index 1c2b60cd..190286bd 100644 --- a/src/rollup/BridgeCreator.sol +++ b/src/rollup/BridgeCreator.sol @@ -17,7 +17,6 @@ import "@openzeppelin/contracts/proxy/transparent/ProxyAdmin.sol"; contract BridgeCreator is Ownable { Bridge public bridgeTemplate; - SequencerInbox public sequencerInboxTemplate; Inbox public inboxTemplate; RollupEventInbox public rollupEventInboxTemplate; Outbox public outboxTemplate; @@ -26,7 +25,6 @@ contract BridgeCreator is Ownable { constructor() Ownable() { bridgeTemplate = new Bridge(); - sequencerInboxTemplate = new SequencerInbox(); inboxTemplate = new Inbox(); rollupEventInboxTemplate = new RollupEventInbox(); outboxTemplate = new Outbox(); @@ -34,13 +32,11 @@ contract BridgeCreator is Ownable { function updateTemplates( address _bridgeTemplate, - address _sequencerInboxTemplate, address _inboxTemplate, address _rollupEventInboxTemplate, address _outboxTemplate ) external onlyOwner { bridgeTemplate = Bridge(_bridgeTemplate); - sequencerInboxTemplate = SequencerInbox(_sequencerInboxTemplate); inboxTemplate = Inbox(_inboxTemplate); rollupEventInboxTemplate = RollupEventInbox(_rollupEventInboxTemplate); outboxTemplate = Outbox(_outboxTemplate); @@ -76,11 +72,6 @@ contract BridgeCreator is Ownable { frame.bridge = Bridge( address(new TransparentUpgradeableProxy(address(bridgeTemplate), adminProxy, "")) ); - frame.sequencerInbox = SequencerInbox( - address( - new TransparentUpgradeableProxy(address(sequencerInboxTemplate), adminProxy, "") - ) - ); frame.inbox = Inbox( address(new TransparentUpgradeableProxy(address(inboxTemplate), adminProxy, "")) ); @@ -99,7 +90,7 @@ contract BridgeCreator is Ownable { } frame.bridge.initialize(IOwnable(rollup)); - frame.sequencerInbox.initialize(IBridge(frame.bridge), maxTimeVariation); + frame.sequencerInbox = new SequencerInbox(IBridge(frame.bridge), maxTimeVariation); frame.inbox.initialize(IBridge(frame.bridge), ISequencerInbox(frame.sequencerInbox)); frame.rollupEventInbox.initialize(IBridge(frame.bridge)); frame.outbox.initialize(IBridge(frame.bridge)); diff --git a/test/contract/arbRollup.spec.ts b/test/contract/arbRollup.spec.ts index ba417541..ba51450d 100644 --- a/test/contract/arbRollup.spec.ts +++ b/test/contract/arbRollup.spec.ts @@ -1174,12 +1174,6 @@ describe('ArbRollup', () => { ).to.eq('view') }) - it('should fail the chainid fork check', async function () { - await expect(sequencerInbox.removeDelayAfterFork()).to.revertedWith( - 'NotForked()' - ) - }) - it('should fail the batch poster check', async function () { await expect( sequencerInbox.addSequencerL2Batch( diff --git a/test/contract/sequencerInboxForceInclude.spec.ts b/test/contract/sequencerInboxForceInclude.spec.ts index b2c2e931..0cc36159 100644 --- a/test/contract/sequencerInboxForceInclude.spec.ts +++ b/test/contract/sequencerInboxForceInclude.spec.ts @@ -28,7 +28,6 @@ import { MessageTester, RollupMock__factory, SequencerInbox, - SequencerInboxOpt__factory, SequencerInbox__factory, TransparentUpgradeableProxy__factory, } from '../../build/types' @@ -217,11 +216,7 @@ describe('SequencerInboxForceInclude', async () => { } } - const setupSequencerInbox = async ( - maxDelayBlocks = 10, - maxDelayTime = 0, - opt = false - ) => { + const setupSequencerInbox = async (maxDelayBlocks = 10, maxDelayTime = 0) => { const accounts = await initializeAccounts() const admin = accounts[0] const adminAddr = await admin.getAddress() @@ -262,38 +257,15 @@ describe('SequencerInboxForceInclude', async () => { .connect(rollupOwner) await bridge.initialize(rollup.address) - let sequencerInbox - if (opt) { - const sequencerInboxFac = (await ethers.getContractFactory( - 'SequencerInboxOpt' - )) as SequencerInboxOpt__factory - sequencerInbox = await sequencerInboxFac.deploy( - bridgeProxy.address, - maxDelayBlocks, - maxDelayTime, - 10, - 3000 - ) - } else { - const sequencerInboxFac = (await ethers.getContractFactory( - 'SequencerInbox' - )) as SequencerInbox__factory - const seqInboxTemplate = await sequencerInboxFac.deploy() - const sequencerInboxProxy = await transparentUpgradeableProxyFac.deploy( - seqInboxTemplate.address, - adminAddr, - '0x' - ) - sequencerInbox = await sequencerInboxFac - .attach(sequencerInboxProxy.address) - .connect(user) - await sequencerInbox.initialize(bridgeProxy.address, { - delayBlocks: maxDelayBlocks, - delaySeconds: maxDelayTime, - futureBlocks: 10, - futureSeconds: 3000, - }) - } + const sequencerInboxFac = (await ethers.getContractFactory( + 'SequencerInbox' + )) as SequencerInbox__factory + const sequencerInbox = await sequencerInboxFac.deploy(bridgeProxy.address, { + delayBlocks: maxDelayBlocks, + delaySeconds: maxDelayTime, + futureBlocks: 10, + futureSeconds: 3000, + }) const inbox = await inboxFac.attach(inboxProxy.address).connect(user) @@ -327,12 +299,10 @@ describe('SequencerInboxForceInclude', async () => { } } - it.only('can add batch', async () => { + it('can add batch', async () => { const { user, inbox, bridge, messageTester, sequencerInbox, batchPoster } = await setupSequencerInbox() - const setupOpt = await setupSequencerInbox(10, 0, true) - await sendDelayedTx( user, inbox, @@ -345,21 +315,6 @@ describe('SequencerInboxForceInclude', async () => { BigNumber.from(10), '0x1010' ) - await sendDelayedTx( - setupOpt.user, - setupOpt.inbox, - setupOpt.bridge, - setupOpt.messageTester, - 1000000, - 21000000000, - 0, - await setupOpt.user.getAddress(), - BigNumber.from(10), - '0x1011' - ) - - // const maxTimeVariation = await sequencerInbox.maxTimeVariation() - // await mineBlocks(maxTimeVariation.delayBlocks.toNumber()) const messagesRead = await bridge.delayedMessageCount() const seqReportedMessageSubCount = @@ -367,9 +322,7 @@ describe('SequencerInboxForceInclude', async () => { const res1 = await ( await sequencerInbox .connect(batchPoster) - [ - 'addSequencerL2BatchFromOrigin(uint256,bytes,uint256,address,uint256,uint256)' - ]( + .addSequencerL2BatchFromOrigin( 0, data, messagesRead, @@ -379,30 +332,6 @@ describe('SequencerInboxForceInclude', async () => { { gasLimit: 10000000 } ) ).wait() - - const messagesReadOpt = await setupOpt.bridge.delayedMessageCount() - const seqReportedMessageSubCountOpt = - await setupOpt.bridge.sequencerReportedSubMessageCount() - const res2 = await ( - await setupOpt.sequencerInbox - .connect(setupOpt.batchPoster) - [ - 'addSequencerL2BatchFromOrigin(uint256,bytes,uint256,address,uint256,uint256)' - ]( - 0, - data, - messagesReadOpt, - ethers.constants.AddressZero, - seqReportedMessageSubCountOpt, - seqReportedMessageSubCountOpt.add(10), - { gasLimit: 10000000 } - ) - ).wait() - - console.log( - 'saved', - res1.gasUsed.toNumber() - res2.gasUsed.toNumber() - 44455 - 8175 - ) }) it('can force-include', async () => { diff --git a/test/contract/validatorWallet.spec.ts b/test/contract/validatorWallet.spec.ts index 90e1a5d1..d662b840 100644 --- a/test/contract/validatorWallet.spec.ts +++ b/test/contract/validatorWallet.spec.ts @@ -28,6 +28,7 @@ describe('Validator Wallet', () => { owner = await accounts[0] executor = await accounts[1] + const rollupOwner = await accounts[2] const walletCreationTx = await (await walletCreator.createWallet([])).wait() const events = walletCreationTx.logs @@ -46,8 +47,8 @@ describe('Validator Wallet', () => { await wallet.transferOwnership(await owner.getAddress()) const RollupMock = await ethers.getContractFactory('RollupMock') - rollupMock1 = (await RollupMock.deploy()) as RollupMock - rollupMock2 = (await RollupMock.deploy()) as RollupMock + rollupMock1 = (await RollupMock.deploy(await rollupOwner.getAddress())) as RollupMock + rollupMock2 = (await RollupMock.deploy(await rollupOwner.getAddress())) as RollupMock await accounts[0].sendTransaction({ to: wallet.address, From 90de9782b9425a2efbc9f74a7a81206dc169d269 Mon Sep 17 00:00:00 2001 From: Chris Buckland Date: Wed, 4 Oct 2023 14:48:56 +0200 Subject: [PATCH 103/292] Updated comments --- src/bridge/ISequencerInbox.sol | 8 ++++---- src/bridge/SequencerInbox.sol | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/src/bridge/ISequencerInbox.sol b/src/bridge/ISequencerInbox.sol index fe3d6b4f..2b153563 100644 --- a/src/bridge/ISequencerInbox.sol +++ b/src/bridge/ISequencerInbox.sol @@ -12,9 +12,13 @@ import "./IBridge.sol"; interface ISequencerInbox is IDelayedMessageProvider { struct MaxTimeVariation { + /// @notice delayBlocks The max amount of blocks in the past that a message can be received on L2 uint256 delayBlocks; + /// @notice futureBlocks The max amount of blocks in the future that a message can be received on L2 uint256 futureBlocks; + /// @notice delaySeconds The max amount of seconds in the past that a message can be received on L2 uint256 delaySeconds; + /// @notice futureSeconds The max amount of seconds in the future that a message can be received on L2 uint256 futureSeconds; } @@ -75,10 +79,6 @@ interface ISequencerInbox is IDelayedMessageProvider { } /// @notice Returns the max time variation settings for this sequencer inbox - // /// @return delayBlocks The max amount of blocks in the past that a message can be received on L2 - // /// @return futureBlocks The max amount of blocks in the future that a message can be received on L2 - // /// @return delaySeconds The max amount of seconds in the past that a message can be received on L2 - // /// @return futureSeconds The max amount of seconds in the future that a message can be received on L2 function maxTimeVariation() external view diff --git a/src/bridge/SequencerInbox.sol b/src/bridge/SequencerInbox.sol index 5b8138ac..0fba9695 100644 --- a/src/bridge/SequencerInbox.sol +++ b/src/bridge/SequencerInbox.sol @@ -56,7 +56,7 @@ contract SequencerInbox is GasRefundEnabled, ISequencerInbox { IOwnable public immutable rollup; mapping(address => bool) public isBatchPoster; - // see ISequencerInbox.maxTimeVariation + // see ISequencerInbox.MaxTimeVariation uint256 internal immutable delayBlocks; uint256 internal immutable futureBlocks; uint256 internal immutable delaySeconds; From b7414fb44dbf8439444108f5761f857229ff8ae2 Mon Sep 17 00:00:00 2001 From: Chris Buckland Date: Wed, 4 Oct 2023 14:56:19 +0200 Subject: [PATCH 104/292] Formatted files --- src/bridge/ISequencerInbox.sol | 7 +----- src/bridge/SequencerInbox.sol | 37 +++++++++++++++----------------- src/mocks/BridgeStub.sol | 3 +-- src/mocks/SequencerInboxStub.sol | 5 +---- 4 files changed, 20 insertions(+), 32 deletions(-) diff --git a/src/bridge/ISequencerInbox.sol b/src/bridge/ISequencerInbox.sol index 2b153563..935145d3 100644 --- a/src/bridge/ISequencerInbox.sol +++ b/src/bridge/ISequencerInbox.sol @@ -79,12 +79,7 @@ interface ISequencerInbox is IDelayedMessageProvider { } /// @notice Returns the max time variation settings for this sequencer inbox - function maxTimeVariation() - external - view - returns ( - ISequencerInbox.MaxTimeVariation memory - ); + function maxTimeVariation() external view returns (ISequencerInbox.MaxTimeVariation memory); function dasKeySetInfo(bytes32) external view returns (bool, uint64); diff --git a/src/bridge/SequencerInbox.sol b/src/bridge/SequencerInbox.sol index 0fba9695..12261399 100644 --- a/src/bridge/SequencerInbox.sol +++ b/src/bridge/SequencerInbox.sol @@ -80,10 +80,7 @@ contract SequencerInbox is GasRefundEnabled, ISequencerInbox { return deployTimeChainId != block.chainid; } - constructor( - IBridge bridge_, - ISequencerInbox.MaxTimeVariation memory maxTimeVariation_ - ) { + constructor(IBridge bridge_, ISequencerInbox.MaxTimeVariation memory maxTimeVariation_) { if (bridge_ == IBridge(address(0))) revert HadZeroInit(); bridge = bridge_; rollup = bridge_.rollup(); @@ -107,23 +104,23 @@ contract SequencerInbox is GasRefundEnabled, ISequencerInbox { return bounds; } - function maxTimeVariation() public view returns( - ISequencerInbox.MaxTimeVariation memory - ) { + function maxTimeVariation() public view returns (ISequencerInbox.MaxTimeVariation memory) { if (_chainIdChanged()) { - return ISequencerInbox.MaxTimeVariation({ - delayBlocks: 1, - futureBlocks: 1, - delaySeconds: 1, - futureSeconds: 1 - }); + return + ISequencerInbox.MaxTimeVariation({ + delayBlocks: 1, + futureBlocks: 1, + delaySeconds: 1, + futureSeconds: 1 + }); } else { - return ISequencerInbox.MaxTimeVariation({ - delayBlocks: delayBlocks, - futureBlocks: futureBlocks, - delaySeconds: delaySeconds, - futureSeconds: futureSeconds - }); + return + ISequencerInbox.MaxTimeVariation({ + delayBlocks: delayBlocks, + futureBlocks: futureBlocks, + delaySeconds: delaySeconds, + futureSeconds: futureSeconds + }); } } @@ -193,7 +190,7 @@ contract SequencerInbox is GasRefundEnabled, ISequencerInbox { BatchDataLocation.NoData ); } - + function addSequencerL2BatchFromOrigin( uint256 sequenceNumber, bytes calldata data, diff --git a/src/mocks/BridgeStub.sol b/src/mocks/BridgeStub.sol index 90cc2e40..410f2af4 100644 --- a/src/mocks/BridgeStub.sol +++ b/src/mocks/BridgeStub.sol @@ -31,7 +31,7 @@ contract BridgeStub is IBridge { address public sequencerInbox; uint256 public override sequencerReportedSubMessageCount; IOwnable public rollup; - + constructor(IOwnable rollup_) { rollup = rollup_; } @@ -41,7 +41,6 @@ contract BridgeStub is IBridge { emit SequencerInboxUpdated(_sequencerInbox); } - function allowedDelayedInboxes(address inbox) external view override returns (bool) { return allowedDelayedInboxesMap[inbox].allowed; } diff --git a/src/mocks/SequencerInboxStub.sol b/src/mocks/SequencerInboxStub.sol index 507284c4..dbee4bfd 100644 --- a/src/mocks/SequencerInboxStub.sol +++ b/src/mocks/SequencerInboxStub.sol @@ -12,10 +12,7 @@ contract SequencerInboxStub is SequencerInbox { IBridge bridge_, address sequencer_, ISequencerInbox.MaxTimeVariation memory maxTimeVariation_ - ) SequencerInbox( - bridge_, - maxTimeVariation_ - ) { + ) SequencerInbox(bridge_, maxTimeVariation_) { isBatchPoster[sequencer_] = true; } From 87aafcf340da78a2af1f25a02727152f77fab6db Mon Sep 17 00:00:00 2001 From: Chris Buckland Date: Wed, 4 Oct 2023 15:37:52 +0200 Subject: [PATCH 105/292] Test file lint --- test/contract/validatorWallet.spec.ts | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/test/contract/validatorWallet.spec.ts b/test/contract/validatorWallet.spec.ts index d662b840..d6eed9e2 100644 --- a/test/contract/validatorWallet.spec.ts +++ b/test/contract/validatorWallet.spec.ts @@ -47,8 +47,12 @@ describe('Validator Wallet', () => { await wallet.transferOwnership(await owner.getAddress()) const RollupMock = await ethers.getContractFactory('RollupMock') - rollupMock1 = (await RollupMock.deploy(await rollupOwner.getAddress())) as RollupMock - rollupMock2 = (await RollupMock.deploy(await rollupOwner.getAddress())) as RollupMock + rollupMock1 = (await RollupMock.deploy( + await rollupOwner.getAddress() + )) as RollupMock + rollupMock2 = (await RollupMock.deploy( + await rollupOwner.getAddress() + )) as RollupMock await accounts[0].sendTransaction({ to: wallet.address, From ce8de89e11084bcc0d004467ed1d518f2f166b94 Mon Sep 17 00:00:00 2001 From: gzeon Date: Thu, 5 Oct 2023 00:32:48 +0800 Subject: [PATCH 106/292] Revert "Add sha256 preimage support" --- src/osp/OneStepProverHostIo.sol | 30 +++++------------------------- 1 file changed, 5 insertions(+), 25 deletions(-) diff --git a/src/osp/OneStepProverHostIo.sol b/src/osp/OneStepProverHostIo.sol index 0206572f..260ab206 100644 --- a/src/osp/OneStepProverHostIo.sol +++ b/src/osp/OneStepProverHostIo.sol @@ -105,7 +105,7 @@ contract OneStepProverHostIo is IOneStepProver { ExecutionContext calldata, Machine memory mach, Module memory mod, - Instruction calldata inst, + Instruction calldata, bytes calldata proof ) internal pure { uint256 preimageOffset = mach.valueStack.pop().assumeI32(); @@ -128,30 +128,9 @@ contract OneStepProverHostIo is IOneStepProver { bytes memory extracted; uint8 proofType = uint8(proof[proofOffset]); proofOffset++; - // These values must be kept in sync with `arbitrator/arbutil/src/types.rs` - // and `arbutil/preimage_type.go` (both in the nitro repo). - if (inst.argumentData == 0) { - // The machine is asking for a keccak256 preimage - - if (proofType == 0) { - bytes calldata preimage = proof[proofOffset:]; - require(keccak256(preimage) == leafContents, "BAD_PREIMAGE"); - - uint256 preimageEnd = preimageOffset + 32; - if (preimageEnd > preimage.length) { - preimageEnd = preimage.length; - } - extracted = preimage[preimageOffset:preimageEnd]; - } else { - // TODO: support proving via an authenticated contract - revert("UNKNOWN_PREIMAGE_PROOF"); - } - } else if (inst.argumentData == 1) { - // The machine is asking for a sha2-256 preimage - - require(proofType == 0, "UNKNOWN_PREIMAGE_PROOF"); + if (proofType == 0) { bytes calldata preimage = proof[proofOffset:]; - require(sha256(preimage) == leafContents, "BAD_PREIMAGE"); + require(keccak256(preimage) == leafContents, "BAD_PREIMAGE"); uint256 preimageEnd = preimageOffset + 32; if (preimageEnd > preimage.length) { @@ -159,7 +138,8 @@ contract OneStepProverHostIo is IOneStepProver { } extracted = preimage[preimageOffset:preimageEnd]; } else { - revert("UNKNOWN_PREIMAGE_TYPE"); + // TODO: support proving via an authenticated contract + revert("UNKNOWN_PREIMAGE_PROOF"); } for (uint256 i = 0; i < extracted.length; i++) { From 8fbf593b73d184714d89267e5953f33438040cee Mon Sep 17 00:00:00 2001 From: gzeon Date: Thu, 5 Oct 2023 01:52:01 +0900 Subject: [PATCH 107/292] fix: additional params to rollup creator salt --- src/rollup/RollupCreator.sol | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/rollup/RollupCreator.sol b/src/rollup/RollupCreator.sol index 6895a6b5..3ace2ce2 100644 --- a/src/rollup/RollupCreator.sol +++ b/src/rollup/RollupCreator.sol @@ -90,7 +90,9 @@ contract RollupCreator is Ownable { ProxyAdmin proxyAdmin = new ProxyAdmin(); // Create the rollup proxy to figure out the address and initialize it later - RollupProxy rollup = new RollupProxy{salt: keccak256(abi.encode(config))}(); + RollupProxy rollup = new RollupProxy{ + salt: keccak256(abi.encode(config, _batchPoster, _validators, maxDataSize)) + }(); ( IBridge bridge, From 532be633cba042f45f1cf2c2ee16f93b59caefb1 Mon Sep 17 00:00:00 2001 From: gzeon Date: Thu, 5 Oct 2023 02:07:08 +0900 Subject: [PATCH 108/292] chore: release config --- package.json | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/package.json b/package.json index 1ae9ddd4..7f8c3632 100644 --- a/package.json +++ b/package.json @@ -9,12 +9,15 @@ "url": "git+https://github.com/offchainlabs/nitro-contracts.git" }, "files": [ - "src/" + "src/", + "build/contracts/src", + "build/contracts/@openzeppelin" ], "bugs": { "url": "https://github.com/offchainlabs/nitro-contracts/issues" }, "scripts": { + "prepublishOnly": "hardhat clean && hardhat compile", "build": "hardhat compile", "lint:test": "eslint ./test", "solhint": "solhint -f table src/**/*.sol", From 9adb2545fdb6a99750d2e46741a2282c21cb32a4 Mon Sep 17 00:00:00 2001 From: Goran Vladika Date: Thu, 5 Oct 2023 13:27:24 +0200 Subject: [PATCH 109/292] When withdraw-and-call is used in ERC20 based chains, it is important to make sure that extra call cannot be used move escrowed native token in any way. We enforce it by doing native token balance check for bridge before/after the extra call is executed. --- src/bridge/ERC20Bridge.sol | 20 +++++++++++---- src/libraries/Error.sol | 3 +++ test/foundry/ERC20Bridge.t.sol | 46 ++++++++++++++++++++++++++++++++++ 3 files changed, 64 insertions(+), 5 deletions(-) diff --git a/src/bridge/ERC20Bridge.sol b/src/bridge/ERC20Bridge.sol index 9f94fb7d..8ebde1d8 100644 --- a/src/bridge/ERC20Bridge.sol +++ b/src/bridge/ERC20Bridge.sol @@ -7,7 +7,7 @@ pragma solidity ^0.8.4; import "./AbsBridge.sol"; import "./IERC20Bridge.sol"; import "../libraries/AddressAliasHelper.sol"; -import {InvalidTokenSet, CallTargetNotAllowed} from "../libraries/Error.sol"; +import {InvalidTokenSet, CallTargetNotAllowed, CallNotAllowed} from "../libraries/Error.sol"; import "@openzeppelin/contracts/token/ERC20/IERC20.sol"; import "@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol"; @@ -50,20 +50,30 @@ contract ERC20Bridge is AbsBridge, IERC20Bridge { uint256 value, bytes memory data ) internal override returns (bool success, bytes memory returnData) { + address _nativeToken = nativeToken; + // we don't allow outgoing calls to native token contract because it could // result in loss of native tokens which are escrowed by ERC20Bridge - if (to == nativeToken) { - revert CallTargetNotAllowed(nativeToken); + if (to == _nativeToken) { + revert CallTargetNotAllowed(_nativeToken); } // first release native token - IERC20(nativeToken).safeTransfer(to, value); + IERC20(_nativeToken).safeTransfer(to, value); success = true; - // if there's data do additional contract call + // if there's data do additional contract call. Make sure that call is not used to + // change bridge contract's balance of the native token if (data.length > 0) { + uint256 bridgeBalanceBefore = IERC20(_nativeToken).balanceOf(address(this)); + // solhint-disable-next-line avoid-low-level-calls (success, returnData) = to.call(data); + + uint256 bridgeBalanceAfter = IERC20(_nativeToken).balanceOf(address(this)); + if (bridgeBalanceAfter != bridgeBalanceBefore) { + revert CallNotAllowed(); + } } } diff --git a/src/libraries/Error.sol b/src/libraries/Error.sol index e4590e2f..beb0afc8 100644 --- a/src/libraries/Error.sol +++ b/src/libraries/Error.sol @@ -69,6 +69,9 @@ error InvalidTokenSet(address token); /// @param target address of the call receiver error CallTargetNotAllowed(address target); +/// @dev Call that changes the balance of ERC20Bridge is not allowed +error CallNotAllowed(); + // Inbox Errors /// @dev The contract is paused, so cannot be paused diff --git a/test/foundry/ERC20Bridge.t.sol b/test/foundry/ERC20Bridge.t.sol index 415dc810..71b815ab 100644 --- a/test/foundry/ERC20Bridge.t.sol +++ b/test/foundry/ERC20Bridge.t.sol @@ -340,4 +340,50 @@ contract ERC20BridgeTest is AbsBridgeTest { vm.prank(outbox); bridge.executeCall({to: to, value: 10, data: "some data"}); } + + function test_executeCall_revert_CallNotAllowed() public { + // deploy and initi bridge contracts + address _rollup = makeAddr("rollup"); + address _outbox = makeAddr("outbox"); + address _gateway = address(new MockGateway()); + address _nativeToken = address(new MockBridgedToken(_gateway)); + IERC20Bridge _bridge = IERC20Bridge(TestUtil.deployProxy(address(new ERC20Bridge()))); + _bridge.initialize(IOwnable(_rollup), address(_nativeToken)); + + // allow outbox + vm.prank(_rollup); + _bridge.setOutbox(_outbox, true); + + // fund bridge + MockBridgedToken(_nativeToken).transfer(address(_bridge), 100 ether); + + // executeCall shall revert when call changes balance of the bridge + address to = _gateway; + uint256 withdrawAmount = 25 ether; + bytes memory data = abi.encodeWithSelector( + MockGateway.withdraw.selector, MockBridgedToken(_nativeToken), withdrawAmount + ); + vm.expectRevert(abi.encodeWithSelector(CallNotAllowed.selector)); + vm.prank(_outbox); + _bridge.executeCall({to: to, value: 10, data: data}); + } +} + +contract MockBridgedToken is ERC20 { + address public gateway; + + constructor(address _gateway) ERC20("MockBridgedToken", "TT") { + gateway = _gateway; + _mint(msg.sender, 1_000_000 ether); + } + function bridgeBurn(address account, uint256 amount) external { + require(msg.sender == gateway, "ONLY_GATEWAY"); + _burn(account, amount); + } +} + +contract MockGateway { + function withdraw(MockBridgedToken token, uint256 amount) external { + token.bridgeBurn(msg.sender, amount); + } } From 998fe165d07fc0a672fba73d9ce2647a98f79c47 Mon Sep 17 00:00:00 2001 From: Chris Buckland Date: Thu, 5 Oct 2023 14:28:07 +0200 Subject: [PATCH 110/292] Updated max time variation comments --- src/bridge/ISequencerInbox.sol | 9 +++++---- src/bridge/SequencerInbox.sol | 8 ++++++-- src/rollup/BridgeCreator.sol | 7 +++++-- 3 files changed, 16 insertions(+), 8 deletions(-) diff --git a/src/bridge/ISequencerInbox.sol b/src/bridge/ISequencerInbox.sol index a29089c3..fd7b0101 100644 --- a/src/bridge/ISequencerInbox.sol +++ b/src/bridge/ISequencerInbox.sol @@ -11,14 +11,15 @@ import "./IDelayedMessageProvider.sol"; import "./IBridge.sol"; interface ISequencerInbox is IDelayedMessageProvider { + /// @notice The maximum amount of time variatin between a message being posted on the L1 and being executed on the L2 + /// @param delayBlocks The max amount of blocks in the past that a message can be received on L2 + /// @param futureBlocks The max amount of blocks in the future that a message can be received on L2 + /// @param delaySeconds The max amount of seconds in the past that a message can be received on L2 + /// @param futureSeconds The max amount of seconds in the future that a message can be received on L2 struct MaxTimeVariation { - /// @notice delayBlocks The max amount of blocks in the past that a message can be received on L2 uint256 delayBlocks; - /// @notice futureBlocks The max amount of blocks in the future that a message can be received on L2 uint256 futureBlocks; - /// @notice delaySeconds The max amount of seconds in the past that a message can be received on L2 uint256 delaySeconds; - /// @notice futureSeconds The max amount of seconds in the future that a message can be received on L2 uint256 futureSeconds; } diff --git a/src/bridge/SequencerInbox.sol b/src/bridge/SequencerInbox.sol index f245a5a3..bd7752b0 100644 --- a/src/bridge/SequencerInbox.sol +++ b/src/bridge/SequencerInbox.sol @@ -75,8 +75,12 @@ contract SequencerInbox is GasRefundEnabled, ISequencerInbox { uint256 internal immutable deployTimeChainId = block.chainid; // If the chain this SequencerInbox is deployed on is an Arbitrum chain. bool internal immutable hostChainIsArbitrum = ArbitrumChecker.runningOnArbitrum(); - - constructor(IBridge bridge_, ISequencerInbox.MaxTimeVariation memory maxTimeVariation_, uint256 _maxDataSize) { + + constructor( + IBridge bridge_, + ISequencerInbox.MaxTimeVariation memory maxTimeVariation_, + uint256 _maxDataSize + ) { if (bridge_ == IBridge(address(0))) revert HadZeroInit(); bridge = bridge_; rollup = bridge_.rollup(); diff --git a/src/rollup/BridgeCreator.sol b/src/rollup/BridgeCreator.sol index a6d78b3a..3fab92b3 100644 --- a/src/rollup/BridgeCreator.sol +++ b/src/rollup/BridgeCreator.sol @@ -21,7 +21,6 @@ contract BridgeCreator is Ownable { RollupEventInbox public rollupEventInboxTemplate; Outbox public outboxTemplate; - event TemplatesUpdated(); constructor(uint256 maxDataSize) Ownable() { @@ -92,7 +91,11 @@ contract BridgeCreator is Ownable { } frame.bridge.initialize(IOwnable(rollup)); - frame.sequencerInbox = new SequencerInbox(IBridge(frame.bridge), maxTimeVariation, maxDataSize); + frame.sequencerInbox = new SequencerInbox( + IBridge(frame.bridge), + maxTimeVariation, + maxDataSize + ); frame.inbox.initialize(IBridge(frame.bridge), ISequencerInbox(frame.sequencerInbox)); frame.rollupEventInbox.initialize(IBridge(frame.bridge)); frame.outbox.initialize(IBridge(frame.bridge)); From f8c5ea183ca8cd99b71cbf7ade78b7c6fdcb2598 Mon Sep 17 00:00:00 2001 From: amsanghi Date: Thu, 5 Oct 2023 20:21:27 +0530 Subject: [PATCH 111/292] fix lit --- src/mocks/Simple.sol | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/src/mocks/Simple.sol b/src/mocks/Simple.sol index 7110bbaf..6caaddb8 100644 --- a/src/mocks/Simple.sol +++ b/src/mocks/Simple.sol @@ -126,11 +126,22 @@ contract Simple { return before - gasleft(); } - function postManyBatches(ISequencerInbox sequencerInbox, bytes memory batchData, uint256 numberToPost) external { + function postManyBatches( + ISequencerInbox sequencerInbox, + bytes memory batchData, + uint256 numberToPost + ) external { uint256 sequenceNumber = sequencerInbox.batchCount(); uint256 delayedMessagesRead = sequencerInbox.totalDelayedMessagesRead(); for (uint256 i = 0; i < numberToPost; i++) { - sequencerInbox.addSequencerL2Batch(sequenceNumber, batchData, delayedMessagesRead, IGasRefunder(address(0)), 0, 0); + sequencerInbox.addSequencerL2Batch( + sequenceNumber, + batchData, + delayedMessagesRead, + IGasRefunder(address(0)), + 0, + 0 + ); sequenceNumber++; } } From a60f7ff9d92eef49f6978acb74142d34d4be25a1 Mon Sep 17 00:00:00 2001 From: Chris Buckland Date: Thu, 5 Oct 2023 17:55:13 +0200 Subject: [PATCH 112/292] Updated tests --- .../sequencerInboxForceInclude.spec.ts | 18 +++++++++++------- 1 file changed, 11 insertions(+), 7 deletions(-) diff --git a/test/contract/sequencerInboxForceInclude.spec.ts b/test/contract/sequencerInboxForceInclude.spec.ts index 86a8976a..49f97fa3 100644 --- a/test/contract/sequencerInboxForceInclude.spec.ts +++ b/test/contract/sequencerInboxForceInclude.spec.ts @@ -260,12 +260,16 @@ describe('SequencerInboxForceInclude', async () => { const sequencerInboxFac = (await ethers.getContractFactory( 'SequencerInbox' )) as SequencerInbox__factory - const sequencerInbox = await sequencerInboxFac.deploy(bridgeProxy.address, { - delayBlocks: maxDelayBlocks, - delaySeconds: maxDelayTime, - futureBlocks: 10, - futureSeconds: 3000, - }) + const sequencerInbox = await sequencerInboxFac.deploy( + bridgeProxy.address, + { + delayBlocks: maxDelayBlocks, + delaySeconds: maxDelayTime, + futureBlocks: 10, + futureSeconds: 3000, + }, + 117964 + ) const inbox = await inboxFac.attach(inboxProxy.address).connect(user) @@ -319,7 +323,7 @@ describe('SequencerInboxForceInclude', async () => { const messagesRead = await bridge.delayedMessageCount() const seqReportedMessageSubCount = await bridge.sequencerReportedSubMessageCount() - const res1 = await ( + await ( await sequencerInbox .connect(batchPoster) .addSequencerL2BatchFromOrigin( From b7b2f49ab9c8e849ac949743389639219a779fef Mon Sep 17 00:00:00 2001 From: Chris Buckland Date: Thu, 5 Oct 2023 18:00:38 +0200 Subject: [PATCH 113/292] Storage layout checks no longer required for sequencer inbox --- test/storage/test.bash | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/storage/test.bash b/test/storage/test.bash index 98a9e566..430750b5 100755 --- a/test/storage/test.bash +++ b/test/storage/test.bash @@ -1,5 +1,5 @@ #!/bin/bash -for CONTRACTNAME in Bridge Inbox Outbox RollupCore RollupUserLogic RollupAdminLogic SequencerInbox ChallengeManager +for CONTRACTNAME in Bridge Inbox Outbox RollupCore RollupUserLogic RollupAdminLogic ChallengeManager do echo "Checking storage change of $CONTRACTNAME" [ -f "./test/storage/$CONTRACTNAME.dot" ] && mv "./test/storage/$CONTRACTNAME.dot" "./test/storage/$CONTRACTNAME-old.dot" From 7bbb10cab01f9794502391d5cfc3aabfa0a6a61b Mon Sep 17 00:00:00 2001 From: Goran Vladika Date: Thu, 5 Oct 2023 19:36:30 +0200 Subject: [PATCH 114/292] Add native token restrictions to natspec --- src/bridge/ERC20Bridge.sol | 5 +++++ src/bridge/IERC20Bridge.sol | 8 +++++--- 2 files changed, 10 insertions(+), 3 deletions(-) diff --git a/src/bridge/ERC20Bridge.sol b/src/bridge/ERC20Bridge.sol index 8ebde1d8..c0d034f8 100644 --- a/src/bridge/ERC20Bridge.sol +++ b/src/bridge/ERC20Bridge.sol @@ -15,6 +15,11 @@ import "@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol"; * @title Staging ground for incoming and outgoing messages * @notice Unlike the standard Eth bridge, native token bridge escrows the custom ERC20 token which is * used as native currency on L2. + * @dev Fees are paid in this token. There are certain restrictions on the native token: + * - The token can't be rebasing or have a transfer fee + * - The token must only be transferrable via a call to the token address itself + * - The token must only be able to set allowance via a call to the token address itself + * - The token must not have a callback on transfer, and more generally a user must not be able to make a transfer to themselves revert */ contract ERC20Bridge is AbsBridge, IERC20Bridge { using SafeERC20 for IERC20; diff --git a/src/bridge/IERC20Bridge.sol b/src/bridge/IERC20Bridge.sol index b54a28c4..b2b4551d 100644 --- a/src/bridge/IERC20Bridge.sol +++ b/src/bridge/IERC20Bridge.sol @@ -11,9 +11,11 @@ import "./IBridge.sol"; interface IERC20Bridge is IBridge { /** * @dev token that is escrowed in bridge on L1 side and minted on L2 as native currency. - * Also fees are paid in this token. ERC777, fee on transfer tokens and rebasing tokens - * are not supported to be used as chain's native token, as they can break collateralization - * invariants. + * Fees are paid in this token. There are certain restrictions on the native token: + * - The token can't be rebasing or have a transfer fee + * - The token must only be transferrable via a call to the token address itself + * - The token must only be able to set allowance via a call to the token address itself + * - The token must not have a callback on transfer, and more generally a user must not be able to make a transfer to themselves revert */ function nativeToken() external view returns (address); From 976d40feb5b8167d30e407b1df50ab2882f23fd4 Mon Sep 17 00:00:00 2001 From: Goran Vladika Date: Thu, 5 Oct 2023 19:39:04 +0200 Subject: [PATCH 115/292] Revert if balance decreases --- src/bridge/ERC20Bridge.sol | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/bridge/ERC20Bridge.sol b/src/bridge/ERC20Bridge.sol index c0d034f8..c67e1ba0 100644 --- a/src/bridge/ERC20Bridge.sol +++ b/src/bridge/ERC20Bridge.sol @@ -68,7 +68,7 @@ contract ERC20Bridge is AbsBridge, IERC20Bridge { success = true; // if there's data do additional contract call. Make sure that call is not used to - // change bridge contract's balance of the native token + // decrease bridge contract's balance of the native token if (data.length > 0) { uint256 bridgeBalanceBefore = IERC20(_nativeToken).balanceOf(address(this)); @@ -76,7 +76,7 @@ contract ERC20Bridge is AbsBridge, IERC20Bridge { (success, returnData) = to.call(data); uint256 bridgeBalanceAfter = IERC20(_nativeToken).balanceOf(address(this)); - if (bridgeBalanceAfter != bridgeBalanceBefore) { + if (bridgeBalanceAfter < bridgeBalanceBefore) { revert CallNotAllowed(); } } From 633a3f0313dc76b2bcb0ff8036361766d61c9aef Mon Sep 17 00:00:00 2001 From: Goran Vladika Date: Fri, 6 Oct 2023 12:44:24 +0200 Subject: [PATCH 116/292] Add ArbSepolia config --- hardhat.config.ts | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/hardhat.config.ts b/hardhat.config.ts index da6220a8..56aa9163 100644 --- a/hardhat.config.ts +++ b/hardhat.config.ts @@ -116,6 +116,12 @@ module.exports = { ? [process.env['DEVNET_PRIVKEY']] : [], }, + arbSepolia: { + url: 'https://sepolia-rollup.arbitrum.io/rpc', + accounts: process.env['DEVNET_PRIVKEY'] + ? [process.env['DEVNET_PRIVKEY']] + : [], + }, arb1: { url: 'https://arb1.arbitrum.io/rpc', accounts: process.env['MAINNET_PRIVKEY'] @@ -142,6 +148,7 @@ module.exports = { arbitrumTestnet: process.env['ARBISCAN_API_KEY'], nova: process.env['NOVA_ARBISCAN_API_KEY'], arbGoerliRollup: process.env['ARBISCAN_API_KEY'], + arbSepolia: process.env['ARBISCAN_API_KEY'], }, customChains: [ { @@ -160,6 +167,14 @@ module.exports = { browserURL: 'https://goerli.arbiscan.io/', }, }, + { + network: 'arbSepolia', + chainId: 421614, + urls: { + apiURL: 'https://sepolia-explorer.arbitrum.io/api', + browserURL: 'https://sepolia-explorer.arbitrum.io/', + }, + }, ], }, mocha: { From 5a04009f28551a6bf3a0c8fd9797f01ac52f9e49 Mon Sep 17 00:00:00 2001 From: Goran Vladika Date: Fri, 6 Oct 2023 12:44:46 +0200 Subject: [PATCH 117/292] Bump Solidity version to 0.8.16 --- hardhat.config.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/hardhat.config.ts b/hardhat.config.ts index 56aa9163..6e20ae6f 100644 --- a/hardhat.config.ts +++ b/hardhat.config.ts @@ -13,7 +13,7 @@ dotenv.config() const solidity = { compilers: [ { - version: '0.8.9', + version: '0.8.16', settings: { optimizer: { enabled: true, From d86ee9dded13fd1718dccd3ef1f62e38dfa8c89f Mon Sep 17 00:00:00 2001 From: Goran Vladika Date: Mon, 9 Oct 2023 12:48:20 +0200 Subject: [PATCH 118/292] Keep compiler version as was --- hardhat.config.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/hardhat.config.ts b/hardhat.config.ts index 6e20ae6f..56aa9163 100644 --- a/hardhat.config.ts +++ b/hardhat.config.ts @@ -13,7 +13,7 @@ dotenv.config() const solidity = { compilers: [ { - version: '0.8.16', + version: '0.8.9', settings: { optimizer: { enabled: true, From 8ad18a681676e73cdea67b67fbb40731366557fa Mon Sep 17 00:00:00 2001 From: Ubuntu Date: Sun, 1 Oct 2023 06:14:48 +0000 Subject: [PATCH 119/292] Fix the BridgeCreator.sol contract Clean up the code and reduce deployment gas cost by moving contract creation outside of the contructor. Move the sequencer inbox maxTimeVariation from memory to calldata. Index the sender for MessageDelivered events - this allows bridges to efficiently query the deposit history for an address without requiring an external indexer. Add DISABLE_VERIFICATION environment variable to disable contract verification. --- scripts/deployment.ts | 30 ++++- src/bridge/IBridge.sol | 2 +- src/bridge/IOutbox.sol | 2 + src/rollup/BridgeCreator.sol | 201 +++++++++++----------------------- src/rollup/IBridgeCreator.sol | 64 ----------- 5 files changed, 93 insertions(+), 206 deletions(-) delete mode 100644 src/rollup/IBridgeCreator.sol diff --git a/scripts/deployment.ts b/scripts/deployment.ts index cc9c095a..ba9b97e1 100644 --- a/scripts/deployment.ts +++ b/scripts/deployment.ts @@ -17,6 +17,8 @@ async function verifyContract( contractPathAndName?: string // optional ): Promise { try { + if (process.env.DISABLE_VERIFICATION) + return // Define the verification options with possible 'contract' property const verificationOptions: { contract?: string @@ -49,7 +51,8 @@ async function verifyContract( async function deployContract( contractName: string, signer: any, - constructorArgs: any[] = [] + constructorArgs: any[] = [], + verify: boolean = true ): Promise { const factory: ContractFactory = await ethers.getContractFactory(contractName) const connectedFactory: ContractFactory = factory.connect(signer) @@ -57,7 +60,8 @@ async function deployContract( await contract.deployTransaction.wait() console.log(`New ${contractName} created at address:`, contract.address) - await verifyContract(contractName, contract.address, constructorArgs) + if (verify) + await verifyContract(contractName, contract.address, constructorArgs) return contract } @@ -76,8 +80,21 @@ async function deployUpgradeExecutor(): Promise { async function deployAllContracts( signer: any ): Promise> { + const ethBridge = await deployContract('Bridge', signer, [], false) + const ethSequencerInbox = await deployContract('SequencerInbox', signer, [maxDataSize], false) + const ethInbox = await deployContract('Inbox', signer, [maxDataSize], false) + const ethRollupEventInbox = await deployContract('RollupEventInbox', signer, [], false) + const ethOutbox = await deployContract('Outbox', signer, [], false) + + const erc20Bridge = await deployContract('ERC20Bridge', signer, [], false) + const erc20SequencerInbox = ethSequencerInbox + const erc20Inbox = await deployContract('ERC20Inbox', signer, [maxDataSize], false) + const erc20RollupEventInbox = await deployContract('ERC20RollupEventInbox', signer, [], false) + const erc20Outbox = await deployContract('ERC20Outbox', signer, [], false) + const bridgeCreator = await deployContract('BridgeCreator', signer, [ - maxDataSize, + [ethBridge.address, ethSequencerInbox.address, ethInbox.address, ethRollupEventInbox.address, ethOutbox.address], + [erc20Bridge.address, erc20SequencerInbox.address, erc20Inbox.address, erc20RollupEventInbox.address, erc20Outbox.address] ]) const prover0 = await deployContract('OneStepProver0', signer) const proverMem = await deployContract('OneStepProverMemory', signer) @@ -144,6 +161,9 @@ async function main() { const { bridge, sequencerInbox, inbox, rollupEventInbox, outbox } = await contracts.bridgeCreator.ethBasedTemplates() + if (process.env.DISABLE_VERIFICATION) + return + console.log('Wait a minute before starting contract verification') await sleep(60 * 1000) @@ -175,7 +195,7 @@ async function main() { 'RollupEventInbox', rollupEventInbox, [], - 'src/bridge/RollupEventInbox.sol:RollupEventInbox' + 'src/rollup/RollupEventInbox.sol:RollupEventInbox' ) console.log(`"outbox implementation contract" created at address:`, outbox) @@ -229,7 +249,7 @@ async function main() { 'ERC20RollupEventInbox', erc20RollupEventInbox, [], - 'src/bridge/ERC20RollupEventInbox.sol:ERC20RollupEventInbox' + 'src/rollup/ERC20RollupEventInbox.sol:ERC20RollupEventInbox' ) console.log( diff --git a/src/bridge/IBridge.sol b/src/bridge/IBridge.sol index 49c3c13f..488822c7 100644 --- a/src/bridge/IBridge.sol +++ b/src/bridge/IBridge.sol @@ -13,7 +13,7 @@ interface IBridge { bytes32 indexed beforeInboxAcc, address inbox, uint8 kind, - address sender, + address indexed sender, bytes32 messageDataHash, uint256 baseFeeL1, uint64 timestamp diff --git a/src/bridge/IOutbox.sol b/src/bridge/IOutbox.sol index 3a551ce6..06358170 100644 --- a/src/bridge/IOutbox.sol +++ b/src/bridge/IOutbox.sol @@ -16,6 +16,8 @@ interface IOutbox { uint256 transactionIndex ); + function initialize(IBridge _bridge) external; + function rollup() external view returns (address); // the rollup contract function bridge() external view returns (IBridge); // the bridge contract diff --git a/src/rollup/BridgeCreator.sol b/src/rollup/BridgeCreator.sol index 7b61c193..bc7c920e 100644 --- a/src/rollup/BridgeCreator.sol +++ b/src/rollup/BridgeCreator.sol @@ -19,59 +19,31 @@ import "@openzeppelin/contracts/access/Ownable.sol"; import "@openzeppelin/contracts/proxy/transparent/ProxyAdmin.sol"; contract BridgeCreator is Ownable { - ContractTemplates public ethBasedTemplates; - ContractERC20Templates public erc20BasedTemplates; + BridgeContracts public ethBasedTemplates; + BridgeContracts public erc20BasedTemplates; event TemplatesUpdated(); event ERC20TemplatesUpdated(); - struct ContractTemplates { - Bridge bridge; - ISequencerInbox sequencerInbox; - IInboxBase inbox; - RollupEventInbox rollupEventInbox; - Outbox outbox; - } - - struct ContractERC20Templates { - ERC20Bridge bridge; - ISequencerInbox sequencerInbox; - IInboxBase inbox; - ERC20RollupEventInbox rollupEventInbox; - ERC20Outbox outbox; - } - - struct CreateBridgeFrame { - ProxyAdmin admin; + struct BridgeContracts { IBridge bridge; - SequencerInbox sequencerInbox; + ISequencerInbox sequencerInbox; IInboxBase inbox; IRollupEventInbox rollupEventInbox; - Outbox outbox; + IOutbox outbox; } - constructor(uint256 maxDataSize) Ownable() { - SequencerInbox seqInbox = new SequencerInbox(maxDataSize); - - ethBasedTemplates.bridge = new Bridge(); - ethBasedTemplates.sequencerInbox = seqInbox; - ethBasedTemplates.inbox = new Inbox(maxDataSize); - ethBasedTemplates.rollupEventInbox = new RollupEventInbox(); - ethBasedTemplates.outbox = new Outbox(); - - erc20BasedTemplates.bridge = new ERC20Bridge(); - erc20BasedTemplates.sequencerInbox = seqInbox; - erc20BasedTemplates.inbox = new ERC20Inbox(maxDataSize); - erc20BasedTemplates.rollupEventInbox = new ERC20RollupEventInbox(); - erc20BasedTemplates.outbox = new ERC20Outbox(); + constructor(BridgeContracts memory _ethBasedTemplates, BridgeContracts memory _erc20BasedTemplates) Ownable() { + ethBasedTemplates = _ethBasedTemplates; + erc20BasedTemplates = _erc20BasedTemplates; } - function updateTemplates(ContractTemplates calldata _newTemplates) external onlyOwner { + function updateTemplates(BridgeContracts calldata _newTemplates) external onlyOwner { ethBasedTemplates = _newTemplates; emit TemplatesUpdated(); } - function updateERC20Templates(ContractERC20Templates calldata _newTemplates) + function updateERC20Templates(BridgeContracts calldata _newTemplates) external onlyOwner { @@ -79,117 +51,74 @@ contract BridgeCreator is Ownable { emit ERC20TemplatesUpdated(); } + function _createBridge(address adminProxy, BridgeContracts storage templates) internal returns (BridgeContracts memory) + { + BridgeContracts memory frame; + frame.bridge = IBridge( + address( + new TransparentUpgradeableProxy( + address(templates.bridge), + adminProxy, + "" + ) + ) + ); + frame.sequencerInbox = ISequencerInbox( + address( + new TransparentUpgradeableProxy( + address(templates.sequencerInbox), + adminProxy, + "" + ) + ) + ); + frame.inbox = IInboxBase( + address( + new TransparentUpgradeableProxy( + address(templates.inbox), + adminProxy, + "" + ) + ) + ); + frame.rollupEventInbox = IRollupEventInbox( + address( + new TransparentUpgradeableProxy( + address(templates.rollupEventInbox), + adminProxy, + "" + ) + ) + ); + frame.outbox = IOutbox( + address( + new TransparentUpgradeableProxy( + address(templates.outbox), + adminProxy, + "" + ) + ) + ); + return frame; + } + function createBridge( address adminProxy, address rollup, address nativeToken, - ISequencerInbox.MaxTimeVariation memory maxTimeVariation + ISequencerInbox.MaxTimeVariation calldata maxTimeVariation ) external returns ( IBridge, - SequencerInbox, + ISequencerInbox, IInboxBase, IRollupEventInbox, - Outbox + IOutbox ) { - CreateBridgeFrame memory frame; - // create ETH-based bridge if address zero is provided for native token, otherwise create ERC20-based bridge - if (nativeToken == address(0)) { - frame.bridge = Bridge( - address( - new TransparentUpgradeableProxy( - address(ethBasedTemplates.bridge), - adminProxy, - "" - ) - ) - ); - frame.sequencerInbox = SequencerInbox( - address( - new TransparentUpgradeableProxy( - address(ethBasedTemplates.sequencerInbox), - adminProxy, - "" - ) - ) - ); - frame.inbox = Inbox( - address( - new TransparentUpgradeableProxy( - address(ethBasedTemplates.inbox), - adminProxy, - "" - ) - ) - ); - frame.rollupEventInbox = RollupEventInbox( - address( - new TransparentUpgradeableProxy( - address(ethBasedTemplates.rollupEventInbox), - adminProxy, - "" - ) - ) - ); - frame.outbox = Outbox( - address( - new TransparentUpgradeableProxy( - address(ethBasedTemplates.outbox), - adminProxy, - "" - ) - ) - ); - } else { - frame.bridge = Bridge( - address( - new TransparentUpgradeableProxy( - address(erc20BasedTemplates.bridge), - adminProxy, - "" - ) - ) - ); - frame.sequencerInbox = SequencerInbox( - address( - new TransparentUpgradeableProxy( - address(erc20BasedTemplates.sequencerInbox), - adminProxy, - "" - ) - ) - ); - frame.inbox = Inbox( - address( - new TransparentUpgradeableProxy( - address(erc20BasedTemplates.inbox), - adminProxy, - "" - ) - ) - ); - frame.rollupEventInbox = RollupEventInbox( - address( - new TransparentUpgradeableProxy( - address(erc20BasedTemplates.rollupEventInbox), - adminProxy, - "" - ) - ) - ); - frame.outbox = Outbox( - address( - new TransparentUpgradeableProxy( - address(erc20BasedTemplates.outbox), - adminProxy, - "" - ) - ) - ); - } + BridgeContracts memory frame = _createBridge(adminProxy, nativeToken == address(0) ? ethBasedTemplates : erc20BasedTemplates); // init contracts if (nativeToken == address(0)) { diff --git a/src/rollup/IBridgeCreator.sol b/src/rollup/IBridgeCreator.sol deleted file mode 100644 index fac167f1..00000000 --- a/src/rollup/IBridgeCreator.sol +++ /dev/null @@ -1,64 +0,0 @@ -// Copyright 2021-2022, Offchain Labs, Inc. -// For license information, see https://github.com/nitro/blob/master/LICENSE -// SPDX-License-Identifier: BUSL-1.1 - -pragma solidity ^0.8.0; - -import "./RollupLib.sol"; -import "./IRollupCore.sol"; -import "../bridge/SequencerInbox.sol"; -import "../bridge/Outbox.sol"; -import "../rollup/RollupEventInbox.sol"; - -interface IBridgeCreator { - function updateTemplates( - address _bridgeTemplate, - address _sequencerInboxTemplate, - address _inboxTemplate, - address _rollupEventInboxTemplate, - address _outboxTemplate - ) external; - - function bridgeTemplate() external view returns (IBridge); - - function sequencerInboxTemplate() external view returns (SequencerInbox); - - function inboxTemplate() external view returns (IInboxBase); - - function rollupEventInboxTemplate() external view returns (IRollupEventInbox); - - function outboxTemplate() external view returns (Outbox); -} - -interface IEthBridgeCreator is IBridgeCreator { - function createBridge( - address adminProxy, - address rollup, - ISequencerInbox.MaxTimeVariation memory maxTimeVariation - ) - external - returns ( - IBridge, - SequencerInbox, - IInboxBase, - IRollupEventInbox, - Outbox - ); -} - -interface IERC20BridgeCreator is IBridgeCreator { - function createBridge( - address adminProxy, - address rollup, - address nativeToken, - ISequencerInbox.MaxTimeVariation memory maxTimeVariation - ) - external - returns ( - IBridge, - SequencerInbox, - IInboxBase, - IRollupEventInbox, - Outbox - ); -} From 9bc6358044505c2d23673703f8f630e7171c0ba8 Mon Sep 17 00:00:00 2001 From: Ubuntu Date: Tue, 3 Oct 2023 22:16:41 +0000 Subject: [PATCH 120/292] revisions remove indexed variable change - this can be done in a separate pr as it breaks the abi remove RollupCreator.BridgeContracts - use the BridgeCreator.BridgeContracts struct instead make BridgeCreator.createBridge() return a BridgeContracts struct instead of a tuple fix unit tests run "yarn format" to clean up the code --- scripts/deployment.ts | 36 ++++-- src/bridge/IBridge.sol | 2 +- src/rollup/BridgeCreator.sol | 82 ++++--------- src/rollup/RollupCreator.sol | 17 +-- test/foundry/BridgeCreator.t.sol | 195 ++++++++++++++++++------------- test/foundry/RollupCreator.t.sol | 132 ++++++++++++++++----- 6 files changed, 272 insertions(+), 192 deletions(-) diff --git a/scripts/deployment.ts b/scripts/deployment.ts index ba9b97e1..2fd62009 100644 --- a/scripts/deployment.ts +++ b/scripts/deployment.ts @@ -17,8 +17,7 @@ async function verifyContract( contractPathAndName?: string // optional ): Promise { try { - if (process.env.DISABLE_VERIFICATION) - return + if (process.env.DISABLE_VERIFICATION) return // Define the verification options with possible 'contract' property const verificationOptions: { contract?: string @@ -81,9 +80,19 @@ async function deployAllContracts( signer: any ): Promise> { const ethBridge = await deployContract('Bridge', signer, [], false) - const ethSequencerInbox = await deployContract('SequencerInbox', signer, [maxDataSize], false) + const ethSequencerInbox = await deployContract( + 'SequencerInbox', + signer, + [maxDataSize], + false + ) const ethInbox = await deployContract('Inbox', signer, [maxDataSize], false) - const ethRollupEventInbox = await deployContract('RollupEventInbox', signer, [], false) + const ethRollupEventInbox = await deployContract( + 'RollupEventInbox', + signer, + [], + false + ) const ethOutbox = await deployContract('Outbox', signer, [], false) const erc20Bridge = await deployContract('ERC20Bridge', signer, [], false) @@ -93,8 +102,20 @@ async function deployAllContracts( const erc20Outbox = await deployContract('ERC20Outbox', signer, [], false) const bridgeCreator = await deployContract('BridgeCreator', signer, [ - [ethBridge.address, ethSequencerInbox.address, ethInbox.address, ethRollupEventInbox.address, ethOutbox.address], - [erc20Bridge.address, erc20SequencerInbox.address, erc20Inbox.address, erc20RollupEventInbox.address, erc20Outbox.address] + [ + ethBridge.address, + ethSequencerInbox.address, + ethInbox.address, + ethRollupEventInbox.address, + ethOutbox.address, + ], + [ + erc20Bridge.address, + erc20SequencerInbox.address, + erc20Inbox.address, + erc20RollupEventInbox.address, + erc20Outbox.address, + ], ]) const prover0 = await deployContract('OneStepProver0', signer) const proverMem = await deployContract('OneStepProverMemory', signer) @@ -161,8 +182,7 @@ async function main() { const { bridge, sequencerInbox, inbox, rollupEventInbox, outbox } = await contracts.bridgeCreator.ethBasedTemplates() - if (process.env.DISABLE_VERIFICATION) - return + if (process.env.DISABLE_VERIFICATION) return console.log('Wait a minute before starting contract verification') await sleep(60 * 1000) diff --git a/src/bridge/IBridge.sol b/src/bridge/IBridge.sol index 488822c7..49c3c13f 100644 --- a/src/bridge/IBridge.sol +++ b/src/bridge/IBridge.sol @@ -13,7 +13,7 @@ interface IBridge { bytes32 indexed beforeInboxAcc, address inbox, uint8 kind, - address indexed sender, + address sender, bytes32 messageDataHash, uint256 baseFeeL1, uint64 timestamp diff --git a/src/rollup/BridgeCreator.sol b/src/rollup/BridgeCreator.sol index bc7c920e..01df1c04 100644 --- a/src/rollup/BridgeCreator.sol +++ b/src/rollup/BridgeCreator.sol @@ -33,7 +33,10 @@ contract BridgeCreator is Ownable { IOutbox outbox; } - constructor(BridgeContracts memory _ethBasedTemplates, BridgeContracts memory _erc20BasedTemplates) Ownable() { + constructor( + BridgeContracts memory _ethBasedTemplates, + BridgeContracts memory _erc20BasedTemplates + ) Ownable() { ethBasedTemplates = _ethBasedTemplates; erc20BasedTemplates = _erc20BasedTemplates; } @@ -43,61 +46,34 @@ contract BridgeCreator is Ownable { emit TemplatesUpdated(); } - function updateERC20Templates(BridgeContracts calldata _newTemplates) - external - onlyOwner - { + function updateERC20Templates(BridgeContracts calldata _newTemplates) external onlyOwner { erc20BasedTemplates = _newTemplates; emit ERC20TemplatesUpdated(); } - function _createBridge(address adminProxy, BridgeContracts storage templates) internal returns (BridgeContracts memory) + function _createBridge(address adminProxy, BridgeContracts storage templates) + internal + returns (BridgeContracts memory) { BridgeContracts memory frame; frame.bridge = IBridge( - address( - new TransparentUpgradeableProxy( - address(templates.bridge), - adminProxy, - "" - ) - ) + address(new TransparentUpgradeableProxy(address(templates.bridge), adminProxy, "")) ); frame.sequencerInbox = ISequencerInbox( address( - new TransparentUpgradeableProxy( - address(templates.sequencerInbox), - adminProxy, - "" - ) + new TransparentUpgradeableProxy(address(templates.sequencerInbox), adminProxy, "") ) ); frame.inbox = IInboxBase( - address( - new TransparentUpgradeableProxy( - address(templates.inbox), - adminProxy, - "" - ) - ) + address(new TransparentUpgradeableProxy(address(templates.inbox), adminProxy, "")) ); frame.rollupEventInbox = IRollupEventInbox( address( - new TransparentUpgradeableProxy( - address(templates.rollupEventInbox), - adminProxy, - "" - ) + new TransparentUpgradeableProxy(address(templates.rollupEventInbox), adminProxy, "") ) ); frame.outbox = IOutbox( - address( - new TransparentUpgradeableProxy( - address(templates.outbox), - adminProxy, - "" - ) - ) + address(new TransparentUpgradeableProxy(address(templates.outbox), adminProxy, "")) ); return frame; } @@ -107,18 +83,12 @@ contract BridgeCreator is Ownable { address rollup, address nativeToken, ISequencerInbox.MaxTimeVariation calldata maxTimeVariation - ) - external - returns ( - IBridge, - ISequencerInbox, - IInboxBase, - IRollupEventInbox, - IOutbox - ) - { + ) external returns (BridgeContracts memory) { // create ETH-based bridge if address zero is provided for native token, otherwise create ERC20-based bridge - BridgeContracts memory frame = _createBridge(adminProxy, nativeToken == address(0) ? ethBasedTemplates : erc20BasedTemplates); + BridgeContracts memory frame = _createBridge( + adminProxy, + nativeToken == address(0) ? ethBasedTemplates : erc20BasedTemplates + ); // init contracts if (nativeToken == address(0)) { @@ -126,17 +96,11 @@ contract BridgeCreator is Ownable { } else { IERC20Bridge(address(frame.bridge)).initialize(IOwnable(rollup), nativeToken); } - frame.sequencerInbox.initialize(IBridge(frame.bridge), maxTimeVariation); - frame.inbox.initialize(IBridge(frame.bridge), ISequencerInbox(frame.sequencerInbox)); - frame.rollupEventInbox.initialize(IBridge(frame.bridge)); - frame.outbox.initialize(IBridge(frame.bridge)); + frame.sequencerInbox.initialize(frame.bridge, maxTimeVariation); + frame.inbox.initialize(frame.bridge, frame.sequencerInbox); + frame.rollupEventInbox.initialize(frame.bridge); + frame.outbox.initialize(frame.bridge); - return ( - frame.bridge, - frame.sequencerInbox, - frame.inbox, - frame.rollupEventInbox, - frame.outbox - ); + return frame; } } diff --git a/src/rollup/RollupCreator.sol b/src/rollup/RollupCreator.sol index 1a13c25a..3216bba5 100644 --- a/src/rollup/RollupCreator.sol +++ b/src/rollup/RollupCreator.sol @@ -45,14 +45,6 @@ contract RollupCreator is Ownable { DeployHelper public l2FactoriesDeployer; - struct BridgeContracts { - IBridge bridge; - ISequencerInbox sequencerInbox; - IInboxBase inbox; - IRollupEventInbox rollupEventInbox; - IOutbox outbox; - } - constructor() Ownable() {} // creator receives back excess fees (for deploying L2 factories) so it can refund the caller @@ -131,14 +123,7 @@ contract RollupCreator is Ownable { salt: keccak256(abi.encode(config, _batchPoster, _validators, _maxDataSize)) }(); - BridgeContracts memory bridgeContracts; - ( - bridgeContracts.bridge, - bridgeContracts.sequencerInbox, - bridgeContracts.inbox, - bridgeContracts.rollupEventInbox, - bridgeContracts.outbox - ) = bridgeCreator.createBridge( + BridgeCreator.BridgeContracts memory bridgeContracts = bridgeCreator.createBridge( address(proxyAdmin), address(rollup), _nativeToken, diff --git a/test/foundry/BridgeCreator.t.sol b/test/foundry/BridgeCreator.t.sol index a0e3c3f8..16099869 100644 --- a/test/foundry/BridgeCreator.t.sol +++ b/test/foundry/BridgeCreator.t.sol @@ -12,45 +12,77 @@ import "@openzeppelin/contracts/token/ERC20/presets/ERC20PresetFixedSupply.sol"; contract BridgeCreatorTest is Test { BridgeCreator public creator; address public owner = address(100); - uint256 public constant MAX_DATA_SIZE = 117_964; + BridgeCreator.BridgeContracts ethBasedTemplates = + BridgeCreator.BridgeContracts({ + bridge: new Bridge(), + sequencerInbox: new SequencerInbox(MAX_DATA_SIZE), + inbox: new Inbox(MAX_DATA_SIZE), + rollupEventInbox: new RollupEventInbox(), + outbox: new Outbox() + }); + BridgeCreator.BridgeContracts erc20BasedTemplates = + BridgeCreator.BridgeContracts({ + bridge: new ERC20Bridge(), + sequencerInbox: ethBasedTemplates.sequencerInbox, + inbox: new ERC20Inbox(MAX_DATA_SIZE), + rollupEventInbox: new ERC20RollupEventInbox(), + outbox: new ERC20Outbox() + }); + function setUp() public { vm.prank(owner); - creator = new BridgeCreator(MAX_DATA_SIZE); + creator = new BridgeCreator(ethBasedTemplates, erc20BasedTemplates); } - /* solhint-disable func-name-mixedcase */ - function test_constructor() public { + function getEthBasedTemplates() internal returns (BridgeCreator.BridgeContracts memory) { + BridgeCreator.BridgeContracts memory templates; ( - Bridge bridgeTemplate, - ISequencerInbox sequencerInboxTemplate, - IInboxBase inboxTemplate, - RollupEventInbox rollupEventInboxTemplate, - Outbox outboxTemplate + templates.bridge, + templates.sequencerInbox, + templates.inbox, + templates.rollupEventInbox, + templates.outbox ) = creator.ethBasedTemplates(); - assertTrue(address(bridgeTemplate) != address(0), "Bridge not created"); - assertTrue(address(sequencerInboxTemplate) != address(0), "SeqInbox not created"); - assertTrue(address(inboxTemplate) != address(0), "Inbox not created"); - assertTrue(address(rollupEventInboxTemplate) != address(0), "Event inbox not created"); - assertTrue(address(outboxTemplate) != address(0), "Outbox not created"); + return templates; + } + function getErc20BasedTemplates() internal returns (BridgeCreator.BridgeContracts memory) { + BridgeCreator.BridgeContracts memory templates; ( - ERC20Bridge erc20BridgeTemplate, - ISequencerInbox erc20SequencerInboxTemplate, - IInboxBase erc20InboxTemplate, - ERC20RollupEventInbox erc20RollupEventInboxTemplate, - ERC20Outbox erc20OutboxTemplate + templates.bridge, + templates.sequencerInbox, + templates.inbox, + templates.rollupEventInbox, + templates.outbox ) = creator.erc20BasedTemplates(); - assertTrue(address(erc20BridgeTemplate) != address(0), "Bridge not created"); - assertTrue(address(erc20SequencerInboxTemplate) != address(0), "SeqInbox not created"); - assertTrue(address(erc20InboxTemplate) != address(0), "Inbox not created"); - assertTrue(address(erc20RollupEventInboxTemplate) != address(0), "Event inbox not created"); - assertTrue(address(erc20OutboxTemplate) != address(0), "Outbox not created"); + return templates; + } + + function assertEq( + BridgeCreator.BridgeContracts memory a, + BridgeCreator.BridgeContracts memory b + ) internal { + assertEq(address(a.bridge), address(b.bridge), "Invalid bridge"); + assertEq(address(a.sequencerInbox), address(b.sequencerInbox), "Invalid seqInbox"); + assertEq(address(a.inbox), address(b.inbox), "Invalid inbox"); + assertEq( + address(a.rollupEventInbox), + address(b.rollupEventInbox), + "Invalid rollup event inbox" + ); + assertEq(address(a.outbox), address(b.outbox), "Invalid outbox"); + } + + /* solhint-disable func-name-mixedcase */ + function test_constructor() public { + assertEq(getEthBasedTemplates(), ethBasedTemplates); + assertEq(getErc20BasedTemplates(), erc20BasedTemplates); } function test_updateTemplates() public { - BridgeCreator.ContractTemplates memory templs = BridgeCreator.ContractTemplates({ + BridgeCreator.BridgeContracts memory templs = BridgeCreator.BridgeContracts({ bridge: Bridge(address(200)), sequencerInbox: SequencerInbox(address(201)), inbox: Inbox(address(202)), @@ -61,28 +93,11 @@ contract BridgeCreatorTest is Test { vm.prank(owner); creator.updateTemplates(templs); - ( - Bridge bridgeTemplate, - ISequencerInbox sequencerInboxTemplate, - IInboxBase inboxTemplate, - RollupEventInbox rollupEventInboxTemplate, - Outbox outboxTemplate - ) = creator.ethBasedTemplates(); - assertEq(address(bridgeTemplate), address(templs.bridge), "Invalid bridge"); - assertEq( - address(sequencerInboxTemplate), address(templs.sequencerInbox), "Invalid seqInbox" - ); - assertEq(address(inboxTemplate), address(templs.inbox), "Invalid inbox"); - assertEq( - address(rollupEventInboxTemplate), - address(templs.rollupEventInbox), - "Invalid rollup event inbox" - ); - assertEq(address(outboxTemplate), address(templs.outbox), "Invalid outbox"); + assertEq(getEthBasedTemplates(), templs); } function test_updateERC20Templates() public { - BridgeCreator.ContractERC20Templates memory templs = BridgeCreator.ContractERC20Templates({ + BridgeCreator.BridgeContracts memory templs = BridgeCreator.BridgeContracts({ bridge: ERC20Bridge(address(400)), sequencerInbox: SequencerInbox(address(401)), inbox: ERC20Inbox(address(402)), @@ -93,41 +108,40 @@ contract BridgeCreatorTest is Test { vm.prank(owner); creator.updateERC20Templates(templs); - ( - ERC20Bridge bridgeTemplate, - ISequencerInbox sequencerInboxTemplate, - IInboxBase inboxTemplate, - ERC20RollupEventInbox rollupEventInboxTemplate, - ERC20Outbox outboxTemplate - ) = creator.erc20BasedTemplates(); - assertEq(address(bridgeTemplate), address(templs.bridge), "Invalid bridge"); - assertEq( - address(sequencerInboxTemplate), address(templs.sequencerInbox), "Invalid seqInbox" - ); - assertEq(address(inboxTemplate), address(templs.inbox), "Invalid inbox"); - assertEq( - address(rollupEventInboxTemplate), - address(templs.rollupEventInbox), - "Invalid rollup event inbox" - ); - assertEq(address(outboxTemplate), address(templs.outbox), "Invalid outbox"); + assertEq(getErc20BasedTemplates(), templs); } function test_createEthBridge() public { address proxyAdmin = address(300); address rollup = address(301); address nativeToken = address(0); - ISequencerInbox.MaxTimeVariation memory timeVars = - ISequencerInbox.MaxTimeVariation(10, 20, 30, 40); + ISequencerInbox.MaxTimeVariation memory timeVars = ISequencerInbox.MaxTimeVariation( + 10, + 20, + 30, + 40 + ); timeVars.delayBlocks; + BridgeCreator.BridgeContracts memory contracts = creator.createBridge( + proxyAdmin, + rollup, + nativeToken, + timeVars + ); ( IBridge bridge, - SequencerInbox seqInbox, + ISequencerInbox seqInbox, IInboxBase inbox, IRollupEventInbox eventInbox, - Outbox outbox - ) = creator.createBridge(proxyAdmin, rollup, nativeToken, timeVars); + IOutbox outbox + ) = ( + contracts.bridge, + contracts.sequencerInbox, + contracts.inbox, + contracts.rollupEventInbox, + contracts.outbox + ); // bridge assertEq(address(bridge.rollup()), rollup, "Invalid rollup ref"); @@ -136,8 +150,12 @@ contract BridgeCreatorTest is Test { // seqInbox assertEq(address(seqInbox.bridge()), address(bridge), "Invalid bridge ref"); assertEq(address(seqInbox.rollup()), rollup, "Invalid rollup ref"); - (uint256 _delayBlocks, uint256 _futureBlocks, uint256 _delaySeconds, uint256 _futureSeconds) - = seqInbox.maxTimeVariation(); + ( + uint256 _delayBlocks, + uint256 _futureBlocks, + uint256 _delaySeconds, + uint256 _futureSeconds + ) = seqInbox.maxTimeVariation(); assertEq(_delayBlocks, timeVars.delayBlocks, "Invalid delayBlocks"); assertEq(_futureBlocks, timeVars.futureBlocks, "Invalid futureBlocks"); assertEq(_delaySeconds, timeVars.delaySeconds, "Invalid delaySeconds"); @@ -165,19 +183,36 @@ contract BridgeCreatorTest is Test { function test_createERC20Bridge() public { address proxyAdmin = address(300); address rollup = address(301); - address nativeToken = - address(new ERC20PresetFixedSupply("Appchain Token", "App", 1_000_000, address(this))); - ISequencerInbox.MaxTimeVariation memory timeVars = - ISequencerInbox.MaxTimeVariation(10, 20, 30, 40); + address nativeToken = address( + new ERC20PresetFixedSupply("Appchain Token", "App", 1_000_000, address(this)) + ); + ISequencerInbox.MaxTimeVariation memory timeVars = ISequencerInbox.MaxTimeVariation( + 10, + 20, + 30, + 40 + ); timeVars.delayBlocks; + BridgeCreator.BridgeContracts memory contracts = creator.createBridge( + proxyAdmin, + rollup, + nativeToken, + timeVars + ); ( IBridge bridge, - SequencerInbox seqInbox, + ISequencerInbox seqInbox, IInboxBase inbox, IRollupEventInbox eventInbox, - Outbox outbox - ) = creator.createBridge(proxyAdmin, rollup, nativeToken, timeVars); + IOutbox outbox + ) = ( + contracts.bridge, + contracts.sequencerInbox, + contracts.inbox, + contracts.rollupEventInbox, + contracts.outbox + ); // bridge assertEq(address(bridge.rollup()), rollup, "Invalid rollup ref"); @@ -191,8 +226,12 @@ contract BridgeCreatorTest is Test { // seqInbox assertEq(address(seqInbox.bridge()), address(bridge), "Invalid bridge ref"); assertEq(address(seqInbox.rollup()), rollup, "Invalid rollup ref"); - (uint256 _delayBlocks, uint256 _futureBlocks, uint256 _delaySeconds, uint256 _futureSeconds) - = seqInbox.maxTimeVariation(); + ( + uint256 _delayBlocks, + uint256 _futureBlocks, + uint256 _delaySeconds, + uint256 _futureSeconds + ) = seqInbox.maxTimeVariation(); assertEq(_delayBlocks, timeVars.delayBlocks, "Invalid delayBlocks"); assertEq(_futureBlocks, timeVars.futureBlocks, "Invalid futureBlocks"); assertEq(_delaySeconds, timeVars.delaySeconds, "Invalid delaySeconds"); diff --git a/test/foundry/RollupCreator.t.sol b/test/foundry/RollupCreator.t.sol index 46680b99..bdf1d4a6 100644 --- a/test/foundry/RollupCreator.t.sol +++ b/test/foundry/RollupCreator.t.sol @@ -32,6 +32,40 @@ contract RollupCreatorTest is Test { uint256 public constant MAX_FEE_PER_GAS = 1_000_000_000; uint256 public constant MAX_DATA_SIZE = 117_964; + BridgeCreator.BridgeContracts ethBasedTemplates = + BridgeCreator.BridgeContracts({ + bridge: new Bridge(), + sequencerInbox: new SequencerInbox(MAX_DATA_SIZE), + inbox: new Inbox(MAX_DATA_SIZE), + rollupEventInbox: new RollupEventInbox(), + outbox: new Outbox() + }); + BridgeCreator.BridgeContracts erc20BasedTemplates = + BridgeCreator.BridgeContracts({ + bridge: new ERC20Bridge(), + sequencerInbox: ethBasedTemplates.sequencerInbox, + inbox: new ERC20Inbox(MAX_DATA_SIZE), + rollupEventInbox: new ERC20RollupEventInbox(), + outbox: new ERC20Outbox() + }); + + BridgeCreator.BridgeContracts ethBasedTemplates = + BridgeCreator.BridgeContracts({ + bridge: new Bridge(), + sequencerInbox: new SequencerInbox(), + inbox: new Inbox(), + rollupEventInbox: new RollupEventInbox(), + outbox: new Outbox() + }); + BridgeCreator.BridgeContracts erc20BasedTemplates = + BridgeCreator.BridgeContracts({ + bridge: new ERC20Bridge(), + sequencerInbox: ethBasedTemplates.sequencerInbox, + inbox: new ERC20Inbox(), + rollupEventInbox: new ERC20RollupEventInbox(), + outbox: new ERC20Outbox() + }); + /* solhint-disable func-name-mixedcase */ function setUp() public { @@ -41,7 +75,7 @@ contract RollupCreatorTest is Test { deployHelper = new DeployHelper(); // deploy BridgeCreators - BridgeCreator bridgeCreator = new BridgeCreator(MAX_DATA_SIZE); + BridgeCreator bridgeCreator = new BridgeCreator(ethBasedTemplates, erc20BasedTemplates); IUpgradeExecutor upgradeExecutorLogic = new UpgradeExecutorMock(); @@ -75,8 +109,12 @@ contract RollupCreatorTest is Test { vm.startPrank(deployer); // deployment params - ISequencerInbox.MaxTimeVariation memory timeVars = - ISequencerInbox.MaxTimeVariation(((60 * 60 * 24) / 15), 12, 60 * 60 * 24, 60 * 60); + ISequencerInbox.MaxTimeVariation memory timeVars = ISequencerInbox.MaxTimeVariation( + ((60 * 60 * 24) / 15), + 12, + 60 * 60 * 24, + 60 * 60 + ); Config memory config = Config({ confirmPeriodBlocks: 20, extraChallengeTimeBlocks: 200, @@ -176,7 +214,9 @@ contract RollupCreatorTest is Test { // upgrade executor owns rollup assertEq( - IOwnable(rollupAddress).owner(), upgradeExecutorExpectedAddress, "Invalid rollup owner" + IOwnable(rollupAddress).owner(), + upgradeExecutorExpectedAddress, + "Invalid rollup owner" ); assertEq( _getProxyAdmin(rollupAddress), @@ -185,26 +225,36 @@ contract RollupCreatorTest is Test { ); // check rollupOwner has executor role - AccessControlUpgradeable executor = AccessControlUpgradeable(upgradeExecutorExpectedAddress); + AccessControlUpgradeable executor = AccessControlUpgradeable( + upgradeExecutorExpectedAddress + ); assertTrue( - executor.hasRole(keccak256("EXECUTOR_ROLE"), rollupOwner), "Invalid executor role" + executor.hasRole(keccak256("EXECUTOR_ROLE"), rollupOwner), + "Invalid executor role" ); // check funds are refunded uint256 balanceAfter = deployer.balance; - uint256 factoryDeploymentCost = - deployHelper.getDeploymentTotalCost(rollup.inbox(), MAX_FEE_PER_GAS); + uint256 factoryDeploymentCost = deployHelper.getDeploymentTotalCost( + rollup.inbox(), + MAX_FEE_PER_GAS + ); assertEq(balanceBefore - balanceAfter, factoryDeploymentCost, "Invalid balance"); } function test_createErc20Rollup() public { vm.startPrank(deployer); - address nativeToken = - address(new ERC20PresetFixedSupply("Appchain Token", "App", 1_000_000 ether, deployer)); + address nativeToken = address( + new ERC20PresetFixedSupply("Appchain Token", "App", 1_000_000 ether, deployer) + ); // deployment params - ISequencerInbox.MaxTimeVariation memory timeVars = - ISequencerInbox.MaxTimeVariation(((60 * 60 * 24) / 15), 12, 60 * 60 * 24, 60 * 60); + ISequencerInbox.MaxTimeVariation memory timeVars = ISequencerInbox.MaxTimeVariation( + ((60 * 60 * 24) / 15), + 12, + 60 * 60 * 24, + 60 * 60 + ); Config memory config = Config({ confirmPeriodBlocks: 20, extraChallengeTimeBlocks: 200, @@ -220,7 +270,9 @@ contract RollupCreatorTest is Test { }); // approve fee token to pay for deployment of L2 factories - uint256 expectedCost = 0.1247 ether + 4 * (1400 * 100_000_000_000 + 100_000 * 1_000_000_000); + uint256 expectedCost = 0.1247 ether + + 4 * + (1400 * 100_000_000_000 + 100_000 * 1_000_000_000); IERC20(nativeToken).approve(address(rollupCreator), expectedCost); /// deploy rollup @@ -260,7 +312,9 @@ contract RollupCreatorTest is Test { // native token check IBridge bridge = RollupCore(address(rollupAddress)).bridge(); assertEq( - IERC20Bridge(address(bridge)).nativeToken(), nativeToken, "Invalid native token ref" + IERC20Bridge(address(bridge)).nativeToken(), + nativeToken, + "Invalid native token ref" ); // check proxy admin for non-rollup contracts @@ -307,7 +361,9 @@ contract RollupCreatorTest is Test { // upgrade executor owns rollup assertEq( - IOwnable(rollupAddress).owner(), upgradeExecutorExpectedAddress, "Invalid rollup owner" + IOwnable(rollupAddress).owner(), + upgradeExecutorExpectedAddress, + "Invalid rollup owner" ); assertEq( _getProxyAdmin(rollupAddress), @@ -316,9 +372,12 @@ contract RollupCreatorTest is Test { ); // check rollupOwner has executor role - AccessControlUpgradeable executor = AccessControlUpgradeable(upgradeExecutorExpectedAddress); + AccessControlUpgradeable executor = AccessControlUpgradeable( + upgradeExecutorExpectedAddress + ); assertTrue( - executor.hasRole(keccak256("EXECUTOR_ROLE"), rollupOwner), "Invalid executor role" + executor.hasRole(keccak256("EXECUTOR_ROLE"), rollupOwner), + "Invalid executor role" ); } @@ -326,8 +385,12 @@ contract RollupCreatorTest is Test { vm.startPrank(deployer); // deployment params - ISequencerInbox.MaxTimeVariation memory timeVars = - ISequencerInbox.MaxTimeVariation(((60 * 60 * 24) / 15), 12, 60 * 60 * 24, 60 * 60); + ISequencerInbox.MaxTimeVariation memory timeVars = ISequencerInbox.MaxTimeVariation( + ((60 * 60 * 24) / 15), + 12, + 60 * 60 * 24, + 60 * 60 + ); Config memory config = Config({ confirmPeriodBlocks: 20, extraChallengeTimeBlocks: 200, @@ -361,12 +424,16 @@ contract RollupCreatorTest is Test { RollupCore rollup = RollupCore(rollupAddress); address inbox = address(rollup.inbox()); address proxyAdmin = computeCreateAddress(address(rollupCreator), 1); - IUpgradeExecutor upgradeExecutor = - IUpgradeExecutor(computeCreateAddress(address(rollupCreator), 4)); + IUpgradeExecutor upgradeExecutor = IUpgradeExecutor( + computeCreateAddress(address(rollupCreator), 4) + ); Dummy newLogicImpl = new Dummy(); bytes memory data = abi.encodeWithSelector( - ProxyUpgradeAction.perform.selector, address(proxyAdmin), inbox, address(newLogicImpl) + ProxyUpgradeAction.perform.selector, + address(proxyAdmin), + inbox, + address(newLogicImpl) ); address upgradeAction = address(new ProxyUpgradeAction()); @@ -388,11 +455,11 @@ contract RollupCreatorTest is Test { { //// deploy challenge stuff ospEntry = new OneStepProofEntry( - new OneStepProver0(), - new OneStepProverMemory(), - new OneStepProverMath(), - new OneStepProverHostIo() - ); + new OneStepProver0(), + new OneStepProverMemory(), + new OneStepProverMath(), + new OneStepProverHostIo() + ); challengeManager = new ChallengeManager(); //// deploy rollup logic @@ -418,14 +485,19 @@ contract RollupCreatorTest is Test { } function _getSecondary(address proxy) internal view returns (address) { - bytes32 secondarySlot = - bytes32(uint256(keccak256("eip1967.proxy.implementation.secondary")) - 1); + bytes32 secondarySlot = bytes32( + uint256(keccak256("eip1967.proxy.implementation.secondary")) - 1 + ); return address(uint160(uint256(vm.load(proxy, secondarySlot)))); } } contract ProxyUpgradeAction { - function perform(address admin, address payable target, address newLogic) public payable { + function perform( + address admin, + address payable target, + address newLogic + ) public payable { ProxyAdmin(admin).upgrade(TransparentUpgradeableProxy(target), newLogic); } } From f56f60168e40edf3b95f8ef1bf61fc3717343a50 Mon Sep 17 00:00:00 2001 From: Ubuntu Date: Tue, 3 Oct 2023 23:19:08 +0000 Subject: [PATCH 121/292] fix hardhat tests --- test/contract/arbRollup.spec.ts | 72 ++++++++++++++++++++++++++++++++- 1 file changed, 71 insertions(+), 1 deletion(-) diff --git a/test/contract/arbRollup.spec.ts b/test/contract/arbRollup.spec.ts index 98c9615e..330d3258 100644 --- a/test/contract/arbRollup.spec.ts +++ b/test/contract/arbRollup.spec.ts @@ -22,6 +22,14 @@ import { BytesLike } from '@ethersproject/bytes' import { ContractTransaction } from '@ethersproject/contracts' import { assert, expect } from 'chai' import { + Bridge__factory, + Inbox__factory, + RollupEventInbox__factory, + Outbox__factory, + ERC20Bridge__factory, + ERC20Inbox__factory, + ERC20RollupEventInbox__factory, + ERC20Outbox__factory, BridgeCreator__factory, ChallengeManager, ChallengeManager__factory, @@ -169,10 +177,72 @@ const setup = async () => { ) const upgradeExecutorLogic = await upgradeExecutorLogicFac.deploy() + const ethBridgeFac = (await ethers.getContractFactory( + 'Bridge' + )) as Bridge__factory + const ethBridge = await ethBridgeFac.deploy() + + const ethSequencerInboxFac = (await ethers.getContractFactory( + 'SequencerInbox' + )) as SequencerInbox__factory + const ethSequencerInbox = await ethSequencerInboxFac.deploy(117964) + + const ethInboxFac = (await ethers.getContractFactory( + 'Inbox' + )) as Inbox__factory + const ethInbox = await ethInboxFac.deploy(117964) + + const ethRollupEventInboxFac = (await ethers.getContractFactory( + 'RollupEventInbox' + )) as RollupEventInbox__factory + const ethRollupEventInbox = await ethRollupEventInboxFac.deploy() + + const ethOutboxFac = (await ethers.getContractFactory( + 'Outbox' + )) as Outbox__factory + const ethOutbox = await ethOutboxFac.deploy() + + const erc20BridgeFac = (await ethers.getContractFactory( + 'ERC20Bridge' + )) as ERC20Bridge__factory + const erc20Bridge = await erc20BridgeFac.deploy() + + const erc20SequencerInbox = ethSequencerInbox + + const erc20InboxFac = (await ethers.getContractFactory( + 'ERC20Inbox' + )) as ERC20Inbox__factory + const erc20Inbox = await erc20InboxFac.deploy(117964) + + const erc20RollupEventInboxFac = (await ethers.getContractFactory( + 'ERC20RollupEventInbox' + )) as ERC20RollupEventInbox__factory + const erc20RollupEventInbox = await erc20RollupEventInboxFac.deploy() + + const erc20OutboxFac = (await ethers.getContractFactory( + 'ERC20Outbox' + )) as ERC20Outbox__factory + const erc20Outbox = await erc20OutboxFac.deploy() + const bridgeCreatorFac = (await ethers.getContractFactory( 'BridgeCreator' )) as BridgeCreator__factory - const bridgeCreator = await bridgeCreatorFac.deploy(117964) + const bridgeCreator = await bridgeCreatorFac.deploy( + { + bridge: ethBridge.address, + sequencerInbox: ethSequencerInbox.address, + inbox: ethInbox.address, + rollupEventInbox: ethRollupEventInbox.address, + outbox: ethOutbox.address, + }, + { + bridge: erc20Bridge.address, + sequencerInbox: erc20SequencerInbox.address, + inbox: erc20Inbox.address, + rollupEventInbox: erc20RollupEventInbox.address, + outbox: erc20Outbox.address, + } + ) const rollupCreatorFac = (await ethers.getContractFactory( 'RollupCreator' From d4f4387946e5c889c729d88ca108373085e3c8b5 Mon Sep 17 00:00:00 2001 From: Goran Vladika Date: Mon, 9 Oct 2023 13:47:08 +0200 Subject: [PATCH 122/292] Fix conflict leftover --- test/foundry/RollupCreator.t.sol | 21 ++------------------- 1 file changed, 2 insertions(+), 19 deletions(-) diff --git a/test/foundry/RollupCreator.t.sol b/test/foundry/RollupCreator.t.sol index bdf1d4a6..d38f6d7e 100644 --- a/test/foundry/RollupCreator.t.sol +++ b/test/foundry/RollupCreator.t.sol @@ -32,7 +32,7 @@ contract RollupCreatorTest is Test { uint256 public constant MAX_FEE_PER_GAS = 1_000_000_000; uint256 public constant MAX_DATA_SIZE = 117_964; - BridgeCreator.BridgeContracts ethBasedTemplates = + BridgeCreator.BridgeContracts public ethBasedTemplates = BridgeCreator.BridgeContracts({ bridge: new Bridge(), sequencerInbox: new SequencerInbox(MAX_DATA_SIZE), @@ -40,7 +40,7 @@ contract RollupCreatorTest is Test { rollupEventInbox: new RollupEventInbox(), outbox: new Outbox() }); - BridgeCreator.BridgeContracts erc20BasedTemplates = + BridgeCreator.BridgeContracts public erc20BasedTemplates = BridgeCreator.BridgeContracts({ bridge: new ERC20Bridge(), sequencerInbox: ethBasedTemplates.sequencerInbox, @@ -49,25 +49,8 @@ contract RollupCreatorTest is Test { outbox: new ERC20Outbox() }); - BridgeCreator.BridgeContracts ethBasedTemplates = - BridgeCreator.BridgeContracts({ - bridge: new Bridge(), - sequencerInbox: new SequencerInbox(), - inbox: new Inbox(), - rollupEventInbox: new RollupEventInbox(), - outbox: new Outbox() - }); - BridgeCreator.BridgeContracts erc20BasedTemplates = - BridgeCreator.BridgeContracts({ - bridge: new ERC20Bridge(), - sequencerInbox: ethBasedTemplates.sequencerInbox, - inbox: new ERC20Inbox(), - rollupEventInbox: new ERC20RollupEventInbox(), - outbox: new ERC20Outbox() - }); /* solhint-disable func-name-mixedcase */ - function setUp() public { //// deploy rollup creator and set templates vm.startPrank(deployer); From f3a5dfa4d60327f3a357c8f498f11d0776bb877c Mon Sep 17 00:00:00 2001 From: gzeon Date: Thu, 12 Oct 2023 00:32:59 +0900 Subject: [PATCH 123/292] v1.1.0-beta.0 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index d1fb05d8..34e13281 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@arbitrum/nitro-contracts", - "version": "1.1.0-alpha.7", + "version": "1.1.0-beta.0", "description": "Layer 2 precompiles and rollup for Arbitrum Nitro", "author": "Offchain Labs, Inc.", "license": "BUSL-1.1", From 7c9b93fe7696ec1695b66a46a7453d2e514df596 Mon Sep 17 00:00:00 2001 From: Goran Vladika Date: Thu, 12 Oct 2023 15:09:46 +0200 Subject: [PATCH 124/292] Sort out contract verification upon deployment --- scripts/deployment.ts | 136 +++++------------------------------------- 1 file changed, 15 insertions(+), 121 deletions(-) diff --git a/scripts/deployment.ts b/scripts/deployment.ts index 2fd62009..93c09114 100644 --- a/scripts/deployment.ts +++ b/scripts/deployment.ts @@ -6,7 +6,6 @@ import { abi as UpgradeExecutorABI, bytecode as UpgradeExecutorBytecode, } from '@offchainlabs/upgrade-executor/build/contracts/src/UpgradeExecutor.sol/UpgradeExecutor.json' -import { sleep } from './testSetup' import { maxDataSize } from './config' // Define a verification function @@ -79,27 +78,27 @@ async function deployUpgradeExecutor(): Promise { async function deployAllContracts( signer: any ): Promise> { - const ethBridge = await deployContract('Bridge', signer, [], false) - const ethSequencerInbox = await deployContract( - 'SequencerInbox', - signer, - [maxDataSize], - false - ) - const ethInbox = await deployContract('Inbox', signer, [maxDataSize], false) + const ethBridge = await deployContract('Bridge', signer, []) + const ethSequencerInbox = await deployContract('SequencerInbox', signer, [ + maxDataSize, + ]) + const ethInbox = await deployContract('Inbox', signer, [maxDataSize]) const ethRollupEventInbox = await deployContract( 'RollupEventInbox', signer, - [], - false + [] ) - const ethOutbox = await deployContract('Outbox', signer, [], false) + const ethOutbox = await deployContract('Outbox', signer, []) - const erc20Bridge = await deployContract('ERC20Bridge', signer, [], false) + const erc20Bridge = await deployContract('ERC20Bridge', signer, []) const erc20SequencerInbox = ethSequencerInbox - const erc20Inbox = await deployContract('ERC20Inbox', signer, [maxDataSize], false) - const erc20RollupEventInbox = await deployContract('ERC20RollupEventInbox', signer, [], false) - const erc20Outbox = await deployContract('ERC20Outbox', signer, [], false) + const erc20Inbox = await deployContract('ERC20Inbox', signer, [maxDataSize]) + const erc20RollupEventInbox = await deployContract( + 'ERC20RollupEventInbox', + signer, + [] + ) + const erc20Outbox = await deployContract('ERC20Outbox', signer, []) const bridgeCreator = await deployContract('BridgeCreator', signer, [ [ @@ -177,111 +176,6 @@ async function main() { contracts.deployHelper.address ) console.log('Template is set on the Rollup Creator') - - // get and verify ETH-based bridge contracts - const { bridge, sequencerInbox, inbox, rollupEventInbox, outbox } = - await contracts.bridgeCreator.ethBasedTemplates() - - if (process.env.DISABLE_VERIFICATION) return - - console.log('Wait a minute before starting contract verification') - await sleep(60 * 1000) - - console.log(`"bridge implementation contract" created at address:`, bridge) - await verifyContract('Bridge', bridge, [], 'src/bridge/Bridge.sol:Bridge') - console.log( - `"sequencerInbox implementation contract" created at address:`, - sequencerInbox - ) - await verifyContract( - 'SequencerInbox', - sequencerInbox, - [maxDataSize], - 'src/bridge/SequencerInbox.sol:SequencerInbox' - ) - console.log(`"inbox implementation contract" created at address:`, inbox) - await verifyContract( - 'Inbox', - inbox, - [maxDataSize], - 'src/bridge/Inbox.sol:Inbox' - ) - - console.log( - `"rollupEventInbox implementation contract" created at address:`, - rollupEventInbox - ) - await verifyContract( - 'RollupEventInbox', - rollupEventInbox, - [], - 'src/rollup/RollupEventInbox.sol:RollupEventInbox' - ) - - console.log(`"outbox implementation contract" created at address:`, outbox) - await verifyContract('Outbox', outbox, [], 'src/bridge/Outbox.sol:Outbox') - - // get and verify ERC20-based bridge contracts - const { - bridge: erc20Bridge, - sequencerInbox: erc20SeqInbox, - inbox: erc20Inbox, - rollupEventInbox: erc20RollupEventInbox, - outbox: erc20Outbox, - } = await contracts.bridgeCreator.erc20BasedTemplates() - - console.log( - `"erc20 bridge implementation contract" created at address:`, - bridge - ) - await verifyContract( - 'ERC20Bridge', - erc20Bridge, - [], - 'src/bridge/ERC20Bridge.sol:ERC20Bridge' - ) - console.log( - `"erc20 sequencerInbox implementation contract" created at address:`, - erc20SeqInbox - ) - await verifyContract( - 'SequencerInbox', - erc20SeqInbox, - [], - 'src/bridge/SequencerInbox.sol:SequencerInbox' - ) - console.log( - `"erc20 inbox implementation contract" created at address:`, - inbox - ) - await verifyContract( - 'ERC20Inbox', - erc20Inbox, - [], - 'src/bridge/ERC20Inbox.sol:ERC20Inbox' - ) - - console.log( - `"erc20 rollupEventInbox implementation contract" created at address:`, - erc20RollupEventInbox - ) - await verifyContract( - 'ERC20RollupEventInbox', - erc20RollupEventInbox, - [], - 'src/rollup/ERC20RollupEventInbox.sol:ERC20RollupEventInbox' - ) - - console.log( - `"erc20 outbox implementation contract" created at address:`, - outbox - ) - await verifyContract( - 'ERC20Outbox', - erc20Outbox, - [], - 'src/bridge/ERC20Outbox.sol:ERC20Outbox' - ) } catch (error) { console.error( 'Deployment failed:', From dc154b014eaf47ff536d914a434507d6037e26db Mon Sep 17 00:00:00 2001 From: Goran Vladika Date: Tue, 17 Oct 2023 14:02:19 +0200 Subject: [PATCH 125/292] All the input parameters for 'createRollup' entrypoint should be included in rollup's salt. To make this more convenient input parameters are packed into 'RollupDeploymentParams' struct which looks like this: struct RollupDeploymentParams { Config config; address batchPoster; address[] validators; uint256 maxDataSize; address nativeToken; bool deployFactoriesToL2; uint256 maxFeePerGasForRetryables; } --- src/rollup/RollupCreator.sol | 96 ++++++++++-------- test/contract/arbRollup.spec.ts | 19 ++-- test/foundry/RollupCreator.t.sol | 164 ++++++++++++++----------------- 3 files changed, 143 insertions(+), 136 deletions(-) diff --git a/src/rollup/RollupCreator.sol b/src/rollup/RollupCreator.sol index 3216bba5..cadb354f 100644 --- a/src/rollup/RollupCreator.sol +++ b/src/rollup/RollupCreator.sol @@ -33,6 +33,16 @@ contract RollupCreator is Ownable { ); event TemplatesUpdated(); + struct RollupDeploymentParams { + Config config; + address batchPoster; + address[] validators; + uint256 maxDataSize; + address nativeToken; + bool deployFactoriesToL2; + uint256 maxFeePerGasForRetryables; + } + BridgeCreator public bridgeCreator; IOneStepProofEntry public osp; IChallengeManager public challengeManagerTemplate; @@ -81,53 +91,57 @@ contract RollupCreator is Ownable { * @dev - config.rollupOwner should have executor role on upgradeExecutor * @dev - Bridge should have a single inbox and outbox * @dev - Validators and batch poster should be set if provided - * @param config The configuration for the rollup - * @param _batchPoster The address of the batch poster, not used when set to zero address - * @param _validators The list of validator addresses, not used when set to empty list - * @param _nativeToken Address of the custom fee token used by rollup. If rollup is ETH-based address(0) should be provided - * @param _deployFactoriesToL2 Whether to deploy L2 factories using retryable tickets. If true, retryables need to be paid for in native currency. - * Deploying factories via retryable tickets at rollup creation time is the most reliable method to do it since it - * doesn't require paying the L1 gas. If deployment is not done as part of rollup creation TX, there is a risk that - * anyone can try to deploy factories and potentially burn the nonce 0 (ie. due to gas price spike when doing direct - * L2 TX). That would mean we permanently lost capability to deploy deterministic factory at expected address. - * @param _maxFeePerGasForRetryables price bid for L2 execution. + * @param deployParams The parameters for the rollup deployment. It consists of: + * - config The configuration for the rollup + * - batchPoster The address of the batch poster, not used when set to zero address + * - validators The list of validator addresses, not used when set to empty list + * - nativeToken Address of the custom fee token used by rollup. If rollup is ETH-based address(0) should be provided + * - deployFactoriesToL2 Whether to deploy L2 factories using retryable tickets. If true, retryables need to be paid for in native currency. + * Deploying factories via retryable tickets at rollup creation time is the most reliable method to do it since it + * doesn't require paying the L1 gas. If deployment is not done as part of rollup creation TX, there is a risk that + * anyone can try to deploy factories and potentially burn the nonce 0 (ie. due to gas price spike when doing direct + * L2 TX). That would mean we permanently lost capability to deploy deterministic factory at expected address. + * - maxFeePerGasForRetryables price bid for L2 execution. * @return The address of the newly created rollup */ - function createRollup( - Config memory config, - address _batchPoster, - address[] memory _validators, - uint256 _maxDataSize, - address _nativeToken, - bool _deployFactoriesToL2, - uint256 _maxFeePerGasForRetryables - ) public payable returns (address) { + function createRollup(RollupDeploymentParams memory deployParams) + public + payable + returns (address) + { { // Make sure the immutable maxDataSize is as expected (, ISequencerInbox ethSequencerInbox, IInboxBase ethInbox, , ) = bridgeCreator .ethBasedTemplates(); - require(_maxDataSize == ethSequencerInbox.maxDataSize(), "SI_MAX_DATA_SIZE_MISMATCH"); - require(_maxDataSize == ethInbox.maxDataSize(), "I_MAX_DATA_SIZE_MISMATCH"); + require( + deployParams.maxDataSize == ethSequencerInbox.maxDataSize(), + "SI_MAX_DATA_SIZE_MISMATCH" + ); + require(deployParams.maxDataSize == ethInbox.maxDataSize(), "I_MAX_DATA_SIZE_MISMATCH"); (, ISequencerInbox erc20SequencerInbox, IInboxBase erc20Inbox, , ) = bridgeCreator .erc20BasedTemplates(); - require(_maxDataSize == erc20SequencerInbox.maxDataSize(), "SI_MAX_DATA_SIZE_MISMATCH"); - require(_maxDataSize == erc20Inbox.maxDataSize(), "I_MAX_DATA_SIZE_MISMATCH"); + require( + deployParams.maxDataSize == erc20SequencerInbox.maxDataSize(), + "SI_MAX_DATA_SIZE_MISMATCH" + ); + require( + deployParams.maxDataSize == erc20Inbox.maxDataSize(), + "I_MAX_DATA_SIZE_MISMATCH" + ); } // create proxy admin which will manage bridge contracts ProxyAdmin proxyAdmin = new ProxyAdmin(); // Create the rollup proxy to figure out the address and initialize it later - RollupProxy rollup = new RollupProxy{ - salt: keccak256(abi.encode(config, _batchPoster, _validators, _maxDataSize)) - }(); + RollupProxy rollup = new RollupProxy{salt: keccak256(abi.encode(deployParams))}(); BridgeCreator.BridgeContracts memory bridgeContracts = bridgeCreator.createBridge( address(proxyAdmin), address(rollup), - _nativeToken, - config.sequencerInboxMaxTimeVariation + deployParams.nativeToken, + deployParams.config.sequencerInboxMaxTimeVariation ); IChallengeManager challengeManager = IChallengeManager( @@ -147,16 +161,16 @@ contract RollupCreator is Ownable { ); // deploy and init upgrade executor - address upgradeExecutor = _deployUpgradeExecutor(config.owner, proxyAdmin); + address upgradeExecutor = _deployUpgradeExecutor(deployParams.config.owner, proxyAdmin); // upgradeExecutor shall be proxyAdmin's owner proxyAdmin.transferOwnership(address(upgradeExecutor)); // initialize the rollup with this contract as owner to set batch poster and validators // it will transfer the ownership to the upgrade executor later - config.owner = address(this); + deployParams.config.owner = address(this); rollup.initializeProxy( - config, + deployParams.config, ContractDependencies({ bridge: bridgeContracts.bridge, sequencerInbox: bridgeContracts.sequencerInbox, @@ -172,32 +186,32 @@ contract RollupCreator is Ownable { ); // setting batch poster, if the address provided is not zero address - if (_batchPoster != address(0)) { - bridgeContracts.sequencerInbox.setIsBatchPoster(_batchPoster, true); + if (deployParams.batchPoster != address(0)) { + bridgeContracts.sequencerInbox.setIsBatchPoster(deployParams.batchPoster, true); } // Call setValidator on the newly created rollup contract just if validator set is not empty - if (_validators.length != 0) { - bool[] memory _vals = new bool[](_validators.length); - for (uint256 i = 0; i < _validators.length; i++) { + if (deployParams.validators.length != 0) { + bool[] memory _vals = new bool[](deployParams.validators.length); + for (uint256 i = 0; i < deployParams.validators.length; i++) { _vals[i] = true; } - IRollupAdmin(address(rollup)).setValidator(_validators, _vals); + IRollupAdmin(address(rollup)).setValidator(deployParams.validators, _vals); } IRollupAdmin(address(rollup)).setOwner(address(upgradeExecutor)); - if (_deployFactoriesToL2) { + if (deployParams.deployFactoriesToL2) { _deployFactories( address(bridgeContracts.inbox), - _nativeToken, - _maxFeePerGasForRetryables + deployParams.nativeToken, + deployParams.maxFeePerGasForRetryables ); } emit RollupCreated( address(rollup), - _nativeToken, + deployParams.nativeToken, address(bridgeContracts.inbox), address(bridgeContracts.outbox), address(bridgeContracts.rollupEventInbox), diff --git a/test/contract/arbRollup.spec.ts b/test/contract/arbRollup.spec.ts index 330d3258..d73bdad3 100644 --- a/test/contract/arbRollup.spec.ts +++ b/test/contract/arbRollup.spec.ts @@ -267,14 +267,19 @@ const setup = async () => { ) const maxFeePerGas = BigNumber.from('1000000000') + + const deployParams = { + config: await getDefaultConfig(), + batchPoster: await sequencer.getAddress(), + validators: [await val1.getAddress(), await val2.getAddress(), await val3.getAddress()], + maxDataSize: 117964, + nativeToken: ethers.constants.AddressZero, + deployFactoriesToL2: true, + maxFeePerGasForRetryables: maxFeePerGas, + } + const response = await rollupCreator.createRollup( - await getDefaultConfig(), - await sequencer.getAddress(), - [await val1.getAddress(), await val2.getAddress(), await val3.getAddress()], - 117964, - ethers.constants.AddressZero, - true, - maxFeePerGas, + deployParams, { value: ethers.utils.parseEther('0.2') } ) diff --git a/test/foundry/RollupCreator.t.sol b/test/foundry/RollupCreator.t.sol index d38f6d7e..6eb50065 100644 --- a/test/foundry/RollupCreator.t.sol +++ b/test/foundry/RollupCreator.t.sol @@ -32,23 +32,20 @@ contract RollupCreatorTest is Test { uint256 public constant MAX_FEE_PER_GAS = 1_000_000_000; uint256 public constant MAX_DATA_SIZE = 117_964; - BridgeCreator.BridgeContracts public ethBasedTemplates = - BridgeCreator.BridgeContracts({ - bridge: new Bridge(), - sequencerInbox: new SequencerInbox(MAX_DATA_SIZE), - inbox: new Inbox(MAX_DATA_SIZE), - rollupEventInbox: new RollupEventInbox(), - outbox: new Outbox() - }); - BridgeCreator.BridgeContracts public erc20BasedTemplates = - BridgeCreator.BridgeContracts({ - bridge: new ERC20Bridge(), - sequencerInbox: ethBasedTemplates.sequencerInbox, - inbox: new ERC20Inbox(MAX_DATA_SIZE), - rollupEventInbox: new ERC20RollupEventInbox(), - outbox: new ERC20Outbox() - }); - + BridgeCreator.BridgeContracts public ethBasedTemplates = BridgeCreator.BridgeContracts({ + bridge: new Bridge(), + sequencerInbox: new SequencerInbox(MAX_DATA_SIZE), + inbox: new Inbox(MAX_DATA_SIZE), + rollupEventInbox: new RollupEventInbox(), + outbox: new Outbox() + }); + BridgeCreator.BridgeContracts public erc20BasedTemplates = BridgeCreator.BridgeContracts({ + bridge: new ERC20Bridge(), + sequencerInbox: ethBasedTemplates.sequencerInbox, + inbox: new ERC20Inbox(MAX_DATA_SIZE), + rollupEventInbox: new ERC20RollupEventInbox(), + outbox: new ERC20Outbox() + }); /* solhint-disable func-name-mixedcase */ function setUp() public { @@ -92,12 +89,8 @@ contract RollupCreatorTest is Test { vm.startPrank(deployer); // deployment params - ISequencerInbox.MaxTimeVariation memory timeVars = ISequencerInbox.MaxTimeVariation( - ((60 * 60 * 24) / 15), - 12, - 60 * 60 * 24, - 60 * 60 - ); + ISequencerInbox.MaxTimeVariation memory timeVars = + ISequencerInbox.MaxTimeVariation(((60 * 60 * 24) / 15), 12, 60 * 60 * 24, 60 * 60); Config memory config = Config({ confirmPeriodBlocks: 20, extraChallengeTimeBlocks: 200, @@ -123,9 +116,18 @@ contract RollupCreatorTest is Test { validators[0] = makeAddr("validator1"); validators[1] = makeAddr("validator2"); - address rollupAddress = rollupCreator.createRollup{value: factoryDeploymentFunds}( - config, batchPoster, validators, MAX_DATA_SIZE, address(0), true, MAX_FEE_PER_GAS - ); + RollupCreator.RollupDeploymentParams memory deployParams = RollupCreator + .RollupDeploymentParams({ + config: config, + batchPoster: batchPoster, + validators: validators, + maxDataSize: MAX_DATA_SIZE, + nativeToken: address(0), + deployFactoriesToL2: true, + maxFeePerGasForRetryables: MAX_FEE_PER_GAS + }); + address rollupAddress = + rollupCreator.createRollup{value: factoryDeploymentFunds}(deployParams); vm.stopPrank(); @@ -197,9 +199,7 @@ contract RollupCreatorTest is Test { // upgrade executor owns rollup assertEq( - IOwnable(rollupAddress).owner(), - upgradeExecutorExpectedAddress, - "Invalid rollup owner" + IOwnable(rollupAddress).owner(), upgradeExecutorExpectedAddress, "Invalid rollup owner" ); assertEq( _getProxyAdmin(rollupAddress), @@ -208,36 +208,26 @@ contract RollupCreatorTest is Test { ); // check rollupOwner has executor role - AccessControlUpgradeable executor = AccessControlUpgradeable( - upgradeExecutorExpectedAddress - ); + AccessControlUpgradeable executor = AccessControlUpgradeable(upgradeExecutorExpectedAddress); assertTrue( - executor.hasRole(keccak256("EXECUTOR_ROLE"), rollupOwner), - "Invalid executor role" + executor.hasRole(keccak256("EXECUTOR_ROLE"), rollupOwner), "Invalid executor role" ); // check funds are refunded uint256 balanceAfter = deployer.balance; - uint256 factoryDeploymentCost = deployHelper.getDeploymentTotalCost( - rollup.inbox(), - MAX_FEE_PER_GAS - ); + uint256 factoryDeploymentCost = + deployHelper.getDeploymentTotalCost(rollup.inbox(), MAX_FEE_PER_GAS); assertEq(balanceBefore - balanceAfter, factoryDeploymentCost, "Invalid balance"); } function test_createErc20Rollup() public { vm.startPrank(deployer); - address nativeToken = address( - new ERC20PresetFixedSupply("Appchain Token", "App", 1_000_000 ether, deployer) - ); + address nativeToken = + address(new ERC20PresetFixedSupply("Appchain Token", "App", 1_000_000 ether, deployer)); // deployment params - ISequencerInbox.MaxTimeVariation memory timeVars = ISequencerInbox.MaxTimeVariation( - ((60 * 60 * 24) / 15), - 12, - 60 * 60 * 24, - 60 * 60 - ); + ISequencerInbox.MaxTimeVariation memory timeVars = + ISequencerInbox.MaxTimeVariation(((60 * 60 * 24) / 15), 12, 60 * 60 * 24, 60 * 60); Config memory config = Config({ confirmPeriodBlocks: 20, extraChallengeTimeBlocks: 200, @@ -253,9 +243,7 @@ contract RollupCreatorTest is Test { }); // approve fee token to pay for deployment of L2 factories - uint256 expectedCost = 0.1247 ether + - 4 * - (1400 * 100_000_000_000 + 100_000 * 1_000_000_000); + uint256 expectedCost = 0.1247 ether + 4 * (1400 * 100_000_000_000 + 100_000 * 1_000_000_000); IERC20(nativeToken).approve(address(rollupCreator), expectedCost); /// deploy rollup @@ -263,9 +251,19 @@ contract RollupCreatorTest is Test { address[] memory validators = new address[](2); validators[0] = makeAddr("validator1"); validators[1] = makeAddr("validator2"); - address rollupAddress = rollupCreator.createRollup( - config, batchPoster, validators, MAX_DATA_SIZE, nativeToken, true, MAX_FEE_PER_GAS - ); + + RollupCreator.RollupDeploymentParams memory deployParams = RollupCreator + .RollupDeploymentParams({ + config: config, + batchPoster: batchPoster, + validators: validators, + maxDataSize: MAX_DATA_SIZE, + nativeToken: nativeToken, + deployFactoriesToL2: true, + maxFeePerGasForRetryables: MAX_FEE_PER_GAS + }); + + address rollupAddress = rollupCreator.createRollup(deployParams); vm.stopPrank(); @@ -295,9 +293,7 @@ contract RollupCreatorTest is Test { // native token check IBridge bridge = RollupCore(address(rollupAddress)).bridge(); assertEq( - IERC20Bridge(address(bridge)).nativeToken(), - nativeToken, - "Invalid native token ref" + IERC20Bridge(address(bridge)).nativeToken(), nativeToken, "Invalid native token ref" ); // check proxy admin for non-rollup contracts @@ -344,9 +340,7 @@ contract RollupCreatorTest is Test { // upgrade executor owns rollup assertEq( - IOwnable(rollupAddress).owner(), - upgradeExecutorExpectedAddress, - "Invalid rollup owner" + IOwnable(rollupAddress).owner(), upgradeExecutorExpectedAddress, "Invalid rollup owner" ); assertEq( _getProxyAdmin(rollupAddress), @@ -355,12 +349,9 @@ contract RollupCreatorTest is Test { ); // check rollupOwner has executor role - AccessControlUpgradeable executor = AccessControlUpgradeable( - upgradeExecutorExpectedAddress - ); + AccessControlUpgradeable executor = AccessControlUpgradeable(upgradeExecutorExpectedAddress); assertTrue( - executor.hasRole(keccak256("EXECUTOR_ROLE"), rollupOwner), - "Invalid executor role" + executor.hasRole(keccak256("EXECUTOR_ROLE"), rollupOwner), "Invalid executor role" ); } @@ -368,12 +359,8 @@ contract RollupCreatorTest is Test { vm.startPrank(deployer); // deployment params - ISequencerInbox.MaxTimeVariation memory timeVars = ISequencerInbox.MaxTimeVariation( - ((60 * 60 * 24) / 15), - 12, - 60 * 60 * 24, - 60 * 60 - ); + ISequencerInbox.MaxTimeVariation memory timeVars = + ISequencerInbox.MaxTimeVariation(((60 * 60 * 24) / 15), 12, 60 * 60 * 24, 60 * 60); Config memory config = Config({ confirmPeriodBlocks: 20, extraChallengeTimeBlocks: 200, @@ -397,9 +384,19 @@ contract RollupCreatorTest is Test { address[] memory validators = new address[](2); validators[0] = makeAddr("validator1"); validators[1] = makeAddr("validator2"); - address rollupAddress = rollupCreator.createRollup{value: factoryDeploymentFunds}( - config, batchPoster, validators, MAX_DATA_SIZE, address(0), true, MAX_FEE_PER_GAS - ); + + RollupCreator.RollupDeploymentParams memory deployParams = RollupCreator + .RollupDeploymentParams({ + config: config, + batchPoster: batchPoster, + validators: validators, + maxDataSize: MAX_DATA_SIZE, + nativeToken: address(0), + deployFactoriesToL2: true, + maxFeePerGasForRetryables: MAX_FEE_PER_GAS + }); + address rollupAddress = + rollupCreator.createRollup{value: factoryDeploymentFunds}(deployParams); vm.stopPrank(); @@ -407,16 +404,12 @@ contract RollupCreatorTest is Test { RollupCore rollup = RollupCore(rollupAddress); address inbox = address(rollup.inbox()); address proxyAdmin = computeCreateAddress(address(rollupCreator), 1); - IUpgradeExecutor upgradeExecutor = IUpgradeExecutor( - computeCreateAddress(address(rollupCreator), 4) - ); + IUpgradeExecutor upgradeExecutor = + IUpgradeExecutor(computeCreateAddress(address(rollupCreator), 4)); Dummy newLogicImpl = new Dummy(); bytes memory data = abi.encodeWithSelector( - ProxyUpgradeAction.perform.selector, - address(proxyAdmin), - inbox, - address(newLogicImpl) + ProxyUpgradeAction.perform.selector, address(proxyAdmin), inbox, address(newLogicImpl) ); address upgradeAction = address(new ProxyUpgradeAction()); @@ -468,19 +461,14 @@ contract RollupCreatorTest is Test { } function _getSecondary(address proxy) internal view returns (address) { - bytes32 secondarySlot = bytes32( - uint256(keccak256("eip1967.proxy.implementation.secondary")) - 1 - ); + bytes32 secondarySlot = + bytes32(uint256(keccak256("eip1967.proxy.implementation.secondary")) - 1); return address(uint160(uint256(vm.load(proxy, secondarySlot)))); } } contract ProxyUpgradeAction { - function perform( - address admin, - address payable target, - address newLogic - ) public payable { + function perform(address admin, address payable target, address newLogic) public payable { ProxyAdmin(admin).upgrade(TransparentUpgradeableProxy(target), newLogic); } } From c304812cfbea1e4ce1dd16420f2b004667d5b054 Mon Sep 17 00:00:00 2001 From: Goran Vladika Date: Tue, 17 Oct 2023 14:13:35 +0200 Subject: [PATCH 126/292] Update deployment script --- scripts/rollupCreation.ts | 17 ++++++++++------- src/rollup/RollupCreator.sol | 8 ++++---- 2 files changed, 14 insertions(+), 11 deletions(-) diff --git a/scripts/rollupCreation.ts b/scripts/rollupCreation.ts index 73606df5..26d060f8 100644 --- a/scripts/rollupCreation.ts +++ b/scripts/rollupCreation.ts @@ -78,14 +78,17 @@ export async function createRollup(feeToken?: string) { // Call the createRollup function console.log('Calling createRollup to generate a new rollup ...') + const deployParams = { + config: config.rollupConfig, + batchPoster: config.batchPoster, + validators: config.validators, + maxDataSize: maxDataSize, + nativeToken: feeToken, + deployFactoriesToL2: true, + maxFeePerGasForRetryables: MAX_FER_PER_GAS + } const createRollupTx = await rollupCreator.createRollup( - config.rollupConfig, - config.batchPoster, - config.validators, - maxDataSize, - feeToken, - true, - MAX_FER_PER_GAS, + deployParams, { value: feeCost, } diff --git a/src/rollup/RollupCreator.sol b/src/rollup/RollupCreator.sol index cadb354f..32c05826 100644 --- a/src/rollup/RollupCreator.sol +++ b/src/rollup/RollupCreator.sol @@ -97,10 +97,10 @@ contract RollupCreator is Ownable { * - validators The list of validator addresses, not used when set to empty list * - nativeToken Address of the custom fee token used by rollup. If rollup is ETH-based address(0) should be provided * - deployFactoriesToL2 Whether to deploy L2 factories using retryable tickets. If true, retryables need to be paid for in native currency. - * Deploying factories via retryable tickets at rollup creation time is the most reliable method to do it since it - * doesn't require paying the L1 gas. If deployment is not done as part of rollup creation TX, there is a risk that - * anyone can try to deploy factories and potentially burn the nonce 0 (ie. due to gas price spike when doing direct - * L2 TX). That would mean we permanently lost capability to deploy deterministic factory at expected address. + * Deploying factories via retryable tickets at rollup creation time is the most reliable method to do it since it + * doesn't require paying the L1 gas. If deployment is not done as part of rollup creation TX, there is a risk that + * anyone can try to deploy factories and potentially burn the nonce 0 (ie. due to gas price spike when doing direct + * L2 TX). That would mean we permanently lost capability to deploy deterministic factory at expected address. * - maxFeePerGasForRetryables price bid for L2 execution. * @return The address of the newly created rollup */ From aabfa3c6eb4d481819f6fa1d5761661564adaec2 Mon Sep 17 00:00:00 2001 From: Goran Vladika Date: Tue, 17 Oct 2023 14:26:01 +0200 Subject: [PATCH 127/292] Format --- test/contract/arbRollup.spec.ts | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/test/contract/arbRollup.spec.ts b/test/contract/arbRollup.spec.ts index d73bdad3..fca5eb97 100644 --- a/test/contract/arbRollup.spec.ts +++ b/test/contract/arbRollup.spec.ts @@ -271,17 +271,20 @@ const setup = async () => { const deployParams = { config: await getDefaultConfig(), batchPoster: await sequencer.getAddress(), - validators: [await val1.getAddress(), await val2.getAddress(), await val3.getAddress()], + validators: [ + await val1.getAddress(), + await val2.getAddress(), + await val3.getAddress(), + ], maxDataSize: 117964, nativeToken: ethers.constants.AddressZero, deployFactoriesToL2: true, maxFeePerGasForRetryables: maxFeePerGas, } - const response = await rollupCreator.createRollup( - deployParams, - { value: ethers.utils.parseEther('0.2') } - ) + const response = await rollupCreator.createRollup(deployParams, { + value: ethers.utils.parseEther('0.2'), + }) const rec = await response.wait() From 6ac483461d0a71de6d847e9ca99cf0125b736a1a Mon Sep 17 00:00:00 2001 From: Goran Vladika Date: Tue, 17 Oct 2023 15:25:33 +0200 Subject: [PATCH 128/292] remove unnecessary block scope --- src/rollup/RollupCreator.sol | 35 +++++++++++++++-------------------- 1 file changed, 15 insertions(+), 20 deletions(-) diff --git a/src/rollup/RollupCreator.sol b/src/rollup/RollupCreator.sol index 32c05826..ac9621b3 100644 --- a/src/rollup/RollupCreator.sol +++ b/src/rollup/RollupCreator.sol @@ -109,27 +109,22 @@ contract RollupCreator is Ownable { payable returns (address) { - { - // Make sure the immutable maxDataSize is as expected - (, ISequencerInbox ethSequencerInbox, IInboxBase ethInbox, , ) = bridgeCreator - .ethBasedTemplates(); - require( - deployParams.maxDataSize == ethSequencerInbox.maxDataSize(), - "SI_MAX_DATA_SIZE_MISMATCH" - ); - require(deployParams.maxDataSize == ethInbox.maxDataSize(), "I_MAX_DATA_SIZE_MISMATCH"); + // Make sure the immutable maxDataSize is as expected + (, ISequencerInbox ethSequencerInbox, IInboxBase ethInbox, , ) = bridgeCreator + .ethBasedTemplates(); + require( + deployParams.maxDataSize == ethSequencerInbox.maxDataSize(), + "SI_MAX_DATA_SIZE_MISMATCH" + ); + require(deployParams.maxDataSize == ethInbox.maxDataSize(), "I_MAX_DATA_SIZE_MISMATCH"); - (, ISequencerInbox erc20SequencerInbox, IInboxBase erc20Inbox, , ) = bridgeCreator - .erc20BasedTemplates(); - require( - deployParams.maxDataSize == erc20SequencerInbox.maxDataSize(), - "SI_MAX_DATA_SIZE_MISMATCH" - ); - require( - deployParams.maxDataSize == erc20Inbox.maxDataSize(), - "I_MAX_DATA_SIZE_MISMATCH" - ); - } + (, ISequencerInbox erc20SequencerInbox, IInboxBase erc20Inbox, , ) = bridgeCreator + .erc20BasedTemplates(); + require( + deployParams.maxDataSize == erc20SequencerInbox.maxDataSize(), + "SI_MAX_DATA_SIZE_MISMATCH" + ); + require(deployParams.maxDataSize == erc20Inbox.maxDataSize(), "I_MAX_DATA_SIZE_MISMATCH"); // create proxy admin which will manage bridge contracts ProxyAdmin proxyAdmin = new ProxyAdmin(); From d5ee56d8370e8dcf43e438d7e15ac787acd2a007 Mon Sep 17 00:00:00 2001 From: gzeon Date: Tue, 17 Oct 2023 22:07:12 +0800 Subject: [PATCH 129/292] v1.1.0-beta.1 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 34e13281..5cb6a4d6 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@arbitrum/nitro-contracts", - "version": "1.1.0-beta.0", + "version": "1.1.0-beta.1", "description": "Layer 2 precompiles and rollup for Arbitrum Nitro", "author": "Offchain Labs, Inc.", "license": "BUSL-1.1", From 7bacbf0b69ea1dee5171da3aafdd95f4c0f53184 Mon Sep 17 00:00:00 2001 From: Chris Buckland Date: Tue, 17 Oct 2023 18:43:50 +0200 Subject: [PATCH 130/292] Initial 4844 commit with tests --- hardhat.config.ts | 3 + package.json | 2 + src/bridge/DataHashesReader.yul | 30 + src/bridge/ISequencerInbox.sol | 14 +- src/bridge/SequencerInbox.sol | 132 +++-- src/rollup/BridgeCreator.sol | 5 +- src/rollup/Config.sol | 1 + src/rollup/RollupCreator2.sol | 274 +++++++++ src/test-helpers/RollupMock.sol | 6 + test/contract/arbRollup.spec.ts | 8 +- test/contract/sequencerInbox4844.spec.ts | 552 ++++++++++++++++++ .../sequencerInboxForceInclude.spec.ts | 26 +- test/contract/toolkit4844.ts | 132 +++++ 13 files changed, 1141 insertions(+), 44 deletions(-) create mode 100644 src/bridge/DataHashesReader.yul create mode 100644 src/rollup/RollupCreator2.sol create mode 100644 test/contract/sequencerInbox4844.spec.ts create mode 100644 test/contract/toolkit4844.ts diff --git a/hardhat.config.ts b/hardhat.config.ts index 56aa9163..781f4558 100644 --- a/hardhat.config.ts +++ b/hardhat.config.ts @@ -6,6 +6,9 @@ import '@typechain/hardhat' import 'solidity-coverage' import 'hardhat-gas-reporter' import 'hardhat-ignore-warnings' +// CHRIS: TODO: use a flag for this +// uncomment to regenerate yul +// import '@tovarishfin/hardhat-yul'; import dotenv from 'dotenv' dotenv.config() diff --git a/package.json b/package.json index 34e13281..e8cfc9a7 100644 --- a/package.json +++ b/package.json @@ -25,6 +25,7 @@ "format": "prettier './**/*.{js,json,md,ts,yml,sol}' --write && yarn run lint:test --fix", "build:0.6": "INTERFACE_TESTER_SOLC_VERSION=0.6.9 yarn run build", "build:0.7": "INTERFACE_TESTER_SOLC_VERSION=0.7.0 yarn run build", + "test": "DISABLE_GAS_REPORTER=true hardhat --network hardhat test test/contract/*.spec.ts", "test:compatibility": "yarn run build:0.6 && yarn run build:0.7", "test:storage": "./test/storage/test.bash", "test:e2e": "hardhat test test/e2e/*.ts", @@ -46,6 +47,7 @@ "@nomiclabs/hardhat-ethers": "npm:hardhat-deploy-ethers@^0.3.0-beta.13", "@nomiclabs/hardhat-etherscan": "^3.1.0", "@nomiclabs/hardhat-waffle": "^2.0.1", + "@tovarishfin/hardhat-yul": "^3.0.5", "@typechain/ethers-v5": "^10.0.0", "@typechain/hardhat": "^6.0.0", "@types/chai": "^4.3.0", diff --git a/src/bridge/DataHashesReader.yul b/src/bridge/DataHashesReader.yul new file mode 100644 index 00000000..eeca3cb2 --- /dev/null +++ b/src/bridge/DataHashesReader.yul @@ -0,0 +1,30 @@ +// taken from https://github.com/rauljordan/eip4844-interop/blob/b23c1afa79ad18b0318dca41c000c7c0edfe29d9/upload/contracts/DataHashesReader.yul +object "DataHashesReader" { + code { + datacopy(0, dataoffset("runtime"), datasize("runtime")) + return(0, datasize("runtime")) + } + object "runtime" { + code { + // Match against the keccak of the ABI function signature needed. + switch shr(0xe0,calldataload(0)) + // bytes4(keccak("getDataHashes()")) + // case 0x46115383 - submit batch + case 0xe83a2d82 { + // DATAHASH opcode has hex value 0x49 + let i := 0 + for {} true {} { + let hash := verbatim_1i_1o(hex"49", i) + if iszero(hash) { + break + } + mstore(add(mul(i, 32), 64), hash) + i := add(i, 1) + } + mstore(0, 32) + mstore(32, i) + return(0, add(mul(i, 32), 64)) + } + } + } +} \ No newline at end of file diff --git a/src/bridge/ISequencerInbox.sol b/src/bridge/ISequencerInbox.sol index b4fadddb..1172479e 100644 --- a/src/bridge/ISequencerInbox.sol +++ b/src/bridge/ISequencerInbox.sol @@ -28,7 +28,8 @@ interface ISequencerInbox is IDelayedMessageProvider { enum BatchDataLocation { TxInput, SeparateBatchEvent, - NoData + NoData, + DataBlob } event SequencerBatchDelivered( @@ -176,5 +177,14 @@ interface ISequencerInbox is IDelayedMessageProvider { // ---------- initializer ---------- - function initialize(IBridge bridge_, MaxTimeVariation calldata maxTimeVariation_) external; + function initialize( + IBridge bridge_, + MaxTimeVariation calldata maxTimeVariation_, + IDataHashReader dataHashReader_ + ) external; +} + +// CHRIS: TODO: where to put this? +interface IDataHashReader { + function getDataHashes() external view returns (bytes32[] memory); } diff --git a/src/bridge/SequencerInbox.sol b/src/bridge/SequencerInbox.sol index c1cb745f..526d78ff 100644 --- a/src/bridge/SequencerInbox.sol +++ b/src/bridge/SequencerInbox.sol @@ -71,6 +71,7 @@ contract SequencerInbox is DelegateCallAware, GasRefundEnabled, ISequencerInbox uint256 internal immutable deployTimeChainId = block.chainid; // If the chain this SequencerInbox is deployed on is an Arbitrum chain. bool internal immutable hostChainIsArbitrum = ArbitrumChecker.runningOnArbitrum(); + IDataHashReader dataHashReader; constructor(uint256 _maxDataSize) { maxDataSize = _maxDataSize; @@ -82,13 +83,16 @@ contract SequencerInbox is DelegateCallAware, GasRefundEnabled, ISequencerInbox function initialize( IBridge bridge_, - ISequencerInbox.MaxTimeVariation calldata maxTimeVariation_ + ISequencerInbox.MaxTimeVariation calldata maxTimeVariation_, + IDataHashReader dataHashReader_ ) external onlyDelegated { if (bridge != IBridge(address(0))) revert AlreadyInit(); if (bridge_ == IBridge(address(0))) revert HadZeroInit(); bridge = bridge_; rollup = bridge_.rollup(); maxTimeVariation = maxTimeVariation_; + // CHRIS: TODO: check that this is not empty? + dataHashReader = dataHashReader_; } function getTimeBounds() internal view virtual returns (TimeBounds memory) { @@ -263,6 +267,47 @@ contract SequencerInbox is DelegateCallAware, GasRefundEnabled, ISequencerInbox ); } + // CHRIS: TODO: add to interface if we keep this + function addSequencerL2BatchBlob( + uint256 sequenceNumber, + bytes calldata data, + uint256 afterDelayedMessagesRead, + IGasRefunder gasRefunder, + uint256 prevMessageCount, + uint256 newMessageCount + ) external refundsGas(gasRefunder) { + if (!isBatchPoster[msg.sender] && msg.sender != address(rollup)) revert NotBatchPoster(); + (bytes32 dataHash, TimeBounds memory timeBounds) = formDataBlobHash( + data, + afterDelayedMessagesRead + ); + + ( + uint256 seqMessageIndex, + bytes32 beforeAcc, + bytes32 delayedAcc, + bytes32 afterAcc + ) = addSequencerL2BatchImpl( + dataHash, + afterDelayedMessagesRead, + // CHRIS: TODO: implement blob fees + 0, + prevMessageCount, + newMessageCount + ); + if (seqMessageIndex != sequenceNumber && sequenceNumber != ~uint256(0)) + revert BadSequencerNumber(seqMessageIndex, sequenceNumber); + emit SequencerBatchDelivered( + seqMessageIndex, + beforeAcc, + afterAcc, + delayedAcc, + totalDelayedMessagesRead, + timeBounds, + BatchDataLocation.DataBlob + ); + } + function addSequencerL2Batch( uint256 sequenceNumber, bytes calldata data, @@ -276,39 +321,26 @@ contract SequencerInbox is DelegateCallAware, GasRefundEnabled, ISequencerInbox data, afterDelayedMessagesRead ); - uint256 seqMessageIndex; - { - // Reformat the stack to prevent "Stack too deep" - uint256 sequenceNumber_ = sequenceNumber; - TimeBounds memory timeBounds_ = timeBounds; - bytes32 dataHash_ = dataHash; - uint256 afterDelayedMessagesRead_ = afterDelayedMessagesRead; - uint256 prevMessageCount_ = prevMessageCount; - uint256 newMessageCount_ = newMessageCount; - // we set the calldata length posted to 0 here since the caller isn't the origin - // of the tx, so they might have not paid tx input cost for the calldata - bytes32 beforeAcc; - bytes32 delayedAcc; - bytes32 afterAcc; - (seqMessageIndex, beforeAcc, delayedAcc, afterAcc) = addSequencerL2BatchImpl( - dataHash_, - afterDelayedMessagesRead_, - 0, - prevMessageCount_, - newMessageCount_ - ); - if (seqMessageIndex != sequenceNumber_ && sequenceNumber_ != ~uint256(0)) - revert BadSequencerNumber(seqMessageIndex, sequenceNumber_); - emit SequencerBatchDelivered( - seqMessageIndex, - beforeAcc, - afterAcc, - delayedAcc, - totalDelayedMessagesRead, - timeBounds_, - BatchDataLocation.SeparateBatchEvent - ); - } + // we set the calldata length posted to 0 here since the caller isn't the origin + // of the tx, so they might have not paid tx input cost for the calldata + (uint256 seqMessageIndex, bytes32 beforeAcc, bytes32 delayedAcc, bytes32 afterAcc) = addSequencerL2BatchImpl( + dataHash, + afterDelayedMessagesRead, + 0, + prevMessageCount, + newMessageCount + ); + if (seqMessageIndex != sequenceNumber && sequenceNumber != ~uint256(0)) + revert BadSequencerNumber(seqMessageIndex, sequenceNumber); + emit SequencerBatchDelivered( + seqMessageIndex, + beforeAcc, + afterAcc, + delayedAcc, + totalDelayedMessagesRead, + timeBounds, + BatchDataLocation.SeparateBatchEvent + ); emit SequencerBatchData(seqMessageIndex, data); } @@ -325,6 +357,10 @@ contract SequencerInbox is DelegateCallAware, GasRefundEnabled, ISequencerInbox bytes32 dasKeysetHash = bytes32(data[1:33]); if (!dasKeySetInfo[dasKeysetHash].isValidKeyset) revert NoSuchKeyset(dasKeysetHash); } + + // CHRIS: TODO: + // no data - where do we have this? shouldn't we have a check that all supplied data is well formed? + // perhaps this is we should put this indices _; } @@ -346,6 +382,34 @@ contract SequencerInbox is DelegateCallAware, GasRefundEnabled, ISequencerInbox return (header, timeBounds); } + function formDataBlobHash(bytes calldata data, uint256 afterDelayedMessagesRead, bytes32[] memory versionedHashes) + internal + view + validateBatchData(data) + returns (bytes32, TimeBounds memory) + { + (bytes memory header, TimeBounds memory timeBounds) = packHeader(afterDelayedMessagesRead); + // CHRIS: TODO: encode or encode packed? + bytes32 dataHash = keccak256(bytes.concat(header, abi.encodePacked(versionedHashes))); + return (dataHash, timeBounds); + } + + + function formDataBlobHash(bytes calldata data, uint256 afterDelayedMessagesRead) + internal + view + validateBatchData(data) + returns (bytes32, TimeBounds memory) + { + (bytes memory header, TimeBounds memory timeBounds) = packHeader(afterDelayedMessagesRead); + bytes32[] memory dataHashes = dataHashReader.getDataHashes(); + // CHRIS: TODO: should be a custom error + require(dataHashes.length != 0, "Missing data hashes"); + // CHRIS: TODO: encode or encode packed? + bytes32 dataHash = keccak256(bytes.concat(header, abi.encodePacked(dataHashes))); + return (dataHash, timeBounds); + } + function formDataHash(bytes calldata data, uint256 afterDelayedMessagesRead) internal view diff --git a/src/rollup/BridgeCreator.sol b/src/rollup/BridgeCreator.sol index 01df1c04..fe0450f2 100644 --- a/src/rollup/BridgeCreator.sol +++ b/src/rollup/BridgeCreator.sol @@ -82,7 +82,8 @@ contract BridgeCreator is Ownable { address adminProxy, address rollup, address nativeToken, - ISequencerInbox.MaxTimeVariation calldata maxTimeVariation + ISequencerInbox.MaxTimeVariation calldata maxTimeVariation, + IDataHashReader dataHashReader ) external returns (BridgeContracts memory) { // create ETH-based bridge if address zero is provided for native token, otherwise create ERC20-based bridge BridgeContracts memory frame = _createBridge( @@ -96,7 +97,7 @@ contract BridgeCreator is Ownable { } else { IERC20Bridge(address(frame.bridge)).initialize(IOwnable(rollup), nativeToken); } - frame.sequencerInbox.initialize(frame.bridge, maxTimeVariation); + frame.sequencerInbox.initialize(frame.bridge, maxTimeVariation, dataHashReader); frame.inbox.initialize(frame.bridge, frame.sequencerInbox); frame.rollupEventInbox.initialize(frame.bridge); frame.outbox.initialize(frame.bridge); diff --git a/src/rollup/Config.sol b/src/rollup/Config.sol index 13ca82e2..70c99068 100644 --- a/src/rollup/Config.sol +++ b/src/rollup/Config.sol @@ -26,6 +26,7 @@ struct Config { string chainConfig; uint64 genesisBlockNum; ISequencerInbox.MaxTimeVariation sequencerInboxMaxTimeVariation; + IDataHashReader dataHashReader; } struct ContractDependencies { diff --git a/src/rollup/RollupCreator2.sol b/src/rollup/RollupCreator2.sol new file mode 100644 index 00000000..0ec7873b --- /dev/null +++ b/src/rollup/RollupCreator2.sol @@ -0,0 +1,274 @@ +// 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 + +pragma solidity ^0.8.0; + +import "./RollupProxy.sol"; +import "./IRollupAdmin.sol"; +import "./BridgeCreator.sol"; +import "@offchainlabs/upgrade-executor/src/IUpgradeExecutor.sol"; +import "@openzeppelin/contracts/proxy/transparent/ProxyAdmin.sol"; +import "@openzeppelin/contracts/proxy/transparent/TransparentUpgradeableProxy.sol"; +import "@openzeppelin/contracts/access/Ownable.sol"; +import {DeployHelper} from "./DeployHelper.sol"; +import {SafeERC20, IERC20} from "@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol"; + +contract RollupCreator is Ownable { + using SafeERC20 for IERC20; + + event RollupCreated( + address indexed rollupAddress, + address indexed nativeToken, + address inboxAddress, + address outbox, + address rollupEventInbox, + address challengeManager, + address adminProxy, + address sequencerInbox, + address bridge, + address upgradeExecutor, + address validatorUtils, + address validatorWalletCreator + ); + event TemplatesUpdated(); + + BridgeCreator public bridgeCreator; + IOneStepProofEntry public osp; + IChallengeManager public challengeManagerTemplate; + IRollupAdmin public rollupAdminLogic; + IRollupUser public rollupUserLogic; + IUpgradeExecutor public upgradeExecutorLogic; + + address public validatorUtils; + address public validatorWalletCreator; + + DeployHelper public l2FactoriesDeployer; + + constructor() Ownable() {} + + // creator receives back excess fees (for deploying L2 factories) so it can refund the caller + receive() external payable {} + + function setTemplates( + BridgeCreator _bridgeCreator, + IOneStepProofEntry _osp, + IChallengeManager _challengeManagerLogic, + IRollupAdmin _rollupAdminLogic, + IRollupUser _rollupUserLogic, + IUpgradeExecutor _upgradeExecutorLogic, + address _validatorUtils, + address _validatorWalletCreator, + DeployHelper _l2FactoriesDeployer + ) external onlyOwner { + bridgeCreator = _bridgeCreator; + osp = _osp; + challengeManagerTemplate = _challengeManagerLogic; + rollupAdminLogic = _rollupAdminLogic; + rollupUserLogic = _rollupUserLogic; + upgradeExecutorLogic = _upgradeExecutorLogic; + validatorUtils = _validatorUtils; + validatorWalletCreator = _validatorWalletCreator; + l2FactoriesDeployer = _l2FactoriesDeployer; + emit TemplatesUpdated(); + } + + struct RollupCreatorArgs { + Config config; + address _batchPoster; + address[] _validators; + uint256 _maxDataSize; + address _nativeToken; + bool _deployFactoriesToL2; + uint256 _maxFeePerGasForRetryables; + } + + // CHRIS: TODO: sort this out + // * @param _batchPoster The address of the batch poster, not used when set to zero address + // * @param _validators The list of validator addresses, not used when set to empty list + // * @param _nativeToken Address of the custom fee token used by rollup. If rollup is ETH-based address(0) should be provided + // * @param _deployFactoriesToL2 Whether to deploy L2 factories using retryable tickets. If true, retryables need to be paid for in native currency. + // * Deploying factories via retryable tickets at rollup creation time is the most reliable method to do it since it + // * doesn't require paying the L1 gas. If deployment is not done as part of rollup creation TX, there is a risk that + // * anyone can try to deploy factories and potentially burn the nonce 0 (ie. due to gas price spike when doing direct + // * L2 TX). That would mean we permanently lost capability to deploy deterministic factory at expected address. + // * @param _maxFeePerGasForRetryables price bid for L2 execution. + // * @return The address of the newly created rollup + + /** + * @notice Create a new rollup + * @dev After this setup: + * @dev - UpgradeExecutor should be the owner of rollup + * @dev - UpgradeExecutor should be the owner of proxyAdmin which manages bridge contracts + * @dev - config.rollupOwner should have executor role on upgradeExecutor + * @dev - Bridge should have a single inbox and outbox + * @dev - Validators and batch poster should be set if provided + // * @param args The configuration for the rollup + */ + function createRollup(RollupCreatorArgs memory args) public payable returns (address) { + { + // Make sure the immutable maxDataSize is as expected + (, ISequencerInbox ethSequencerInbox, IInboxBase ethInbox, , ) = bridgeCreator + .ethBasedTemplates(); + require( + args._maxDataSize == ethSequencerInbox.maxDataSize(), + "SI_MAX_DATA_SIZE_MISMATCH" + ); + require(args._maxDataSize == ethInbox.maxDataSize(), "I_MAX_DATA_SIZE_MISMATCH"); + + (, ISequencerInbox erc20SequencerInbox, IInboxBase erc20Inbox, , ) = bridgeCreator + .erc20BasedTemplates(); + require( + args._maxDataSize == erc20SequencerInbox.maxDataSize(), + "SI_MAX_DATA_SIZE_MISMATCH" + ); + require(args._maxDataSize == erc20Inbox.maxDataSize(), "I_MAX_DATA_SIZE_MISMATCH"); + } + + // create proxy admin which will manage bridge contracts + ProxyAdmin proxyAdmin = new ProxyAdmin(); + + // Create the rollup proxy to figure out the address and initialize it later + RollupProxy rollup = new RollupProxy{salt: keccak256(abi.encode(args))}(); + + BridgeCreator.BridgeContracts memory bridgeContracts = bridgeCreator.createBridge( + address(proxyAdmin), + address(rollup), + args._nativeToken, + args.config.sequencerInboxMaxTimeVariation, + args.config.dataHashReader + ); + + IChallengeManager challengeManager = IChallengeManager( + address( + new TransparentUpgradeableProxy( + address(challengeManagerTemplate), + address(proxyAdmin), + "" + ) + ) + ); + challengeManager.initialize( + IChallengeResultReceiver(address(rollup)), + bridgeContracts.sequencerInbox, + bridgeContracts.bridge, + osp + ); + + // deploy and init upgrade executor + address upgradeExecutor = _deployUpgradeExecutor(args.config.owner, proxyAdmin); + + // upgradeExecutor shall be proxyAdmin's owner + proxyAdmin.transferOwnership(address(upgradeExecutor)); + + // initialize the rollup with this contract as owner to set batch poster and validators + // it will transfer the ownership to the upgrade executor later + args.config.owner = address(this); + rollup.initializeProxy( + args.config, + ContractDependencies({ + bridge: bridgeContracts.bridge, + sequencerInbox: bridgeContracts.sequencerInbox, + inbox: bridgeContracts.inbox, + outbox: bridgeContracts.outbox, + rollupEventInbox: bridgeContracts.rollupEventInbox, + challengeManager: challengeManager, + rollupAdminLogic: address(rollupAdminLogic), + rollupUserLogic: rollupUserLogic, + validatorUtils: validatorUtils, + validatorWalletCreator: validatorWalletCreator + }) + ); + + // setting batch poster, if the address provided is not zero address + if (args._batchPoster != address(0)) { + bridgeContracts.sequencerInbox.setIsBatchPoster(args._batchPoster, true); + } + + // Call setValidator on the newly created rollup contract just if validator set is not empty + if (args._validators.length != 0) { + bool[] memory _vals = new bool[](args._validators.length); + for (uint256 i = 0; i < args._validators.length; i++) { + _vals[i] = true; + } + IRollupAdmin(address(rollup)).setValidator(args._validators, _vals); + } + + IRollupAdmin(address(rollup)).setOwner(address(upgradeExecutor)); + + if (args._deployFactoriesToL2) { + _deployFactories( + address(bridgeContracts.inbox), + args._nativeToken, + args._maxFeePerGasForRetryables + ); + } + + emit RollupCreated( + address(rollup), + args._nativeToken, + address(bridgeContracts.inbox), + address(bridgeContracts.outbox), + address(bridgeContracts.rollupEventInbox), + address(challengeManager), + address(proxyAdmin), + address(bridgeContracts.sequencerInbox), + address(bridgeContracts.bridge), + address(upgradeExecutor), + address(validatorUtils), + address(validatorWalletCreator) + ); + return address(rollup); + } + + function _deployUpgradeExecutor(address rollupOwner, ProxyAdmin proxyAdmin) + internal + returns (address) + { + IUpgradeExecutor upgradeExecutor = IUpgradeExecutor( + address( + new TransparentUpgradeableProxy( + address(upgradeExecutorLogic), + address(proxyAdmin), + bytes("") + ) + ) + ); + address[] memory executors = new address[](1); + executors[0] = rollupOwner; + upgradeExecutor.initialize(address(upgradeExecutor), executors); + + return address(upgradeExecutor); + } + + function _deployFactories( + address _inbox, + address _nativeToken, + uint256 _maxFeePerGas + ) internal { + if (_nativeToken == address(0)) { + // we need to fund 4 retryable tickets + uint256 cost = l2FactoriesDeployer.getDeploymentTotalCost( + IInboxBase(_inbox), + _maxFeePerGas + ); + + // do it + l2FactoriesDeployer.perform{value: cost}(_inbox, _nativeToken, _maxFeePerGas); + + // refund the caller + (bool sent, ) = msg.sender.call{value: address(this).balance}(""); + require(sent, "Refund failed"); + } else { + // Transfer fee token amount needed to pay for retryable fees to the inbox. + uint256 totalFee = l2FactoriesDeployer.getDeploymentTotalCost( + IInboxBase(_inbox), + _maxFeePerGas + ); + IERC20(_nativeToken).safeTransferFrom(msg.sender, _inbox, totalFee); + + // do it + l2FactoriesDeployer.perform(_inbox, _nativeToken, _maxFeePerGas); + } + } +} diff --git a/src/test-helpers/RollupMock.sol b/src/test-helpers/RollupMock.sol index 085b9c00..9abcc6db 100644 --- a/src/test-helpers/RollupMock.sol +++ b/src/test-helpers/RollupMock.sol @@ -8,6 +8,12 @@ contract RollupMock { event WithdrawTriggered(); event ZombieTriggered(); + address public owner; + + constructor(address _owner) { + owner = _owner; + } + function withdrawStakerFunds() external returns (uint256) { emit WithdrawTriggered(); return 0; diff --git a/test/contract/arbRollup.spec.ts b/test/contract/arbRollup.spec.ts index 330d3258..6e0392aa 100644 --- a/test/contract/arbRollup.spec.ts +++ b/test/contract/arbRollup.spec.ts @@ -46,6 +46,7 @@ import { RollupUserLogic__factory, SequencerInbox, SequencerInbox__factory, + ToySequencerInbox__factory, } from '../../build/types' import { abi as UpgradeExecutorABI, @@ -62,15 +63,18 @@ import { } from './common/rolluplib' import { AssertionStruct } from '../../build/types/src/rollup/RollupCore' import { ExecutionStateStruct } from '../../build/types/src/rollup/RollupCore' -import { keccak256 } from 'ethers/lib/utils' +import { fetchJson, keccak256 } from 'ethers/lib/utils' import { ConfigStruct, RollupCreatedEvent, } from '../../build/types/src/rollup/RollupCreator' -import { constants, providers } from 'ethers' +import { ContractFactory, Wallet, constants, providers } from 'ethers' import { blockStateHash, MachineStatus } from './common/challengeLib' import * as globalStateLib from './common/globalStateLib' import { RollupChallengeStartedEvent } from '../../build/types/src/rollup/IRollupCore' +import { execSync } from 'child_process' +import { JsonRpcProvider } from '@ethersproject/providers' +import { Toolkit4844 } from './4844tools' const zerobytes32 = ethers.constants.HashZero const stakeRequirement = 10 diff --git a/test/contract/sequencerInbox4844.spec.ts b/test/contract/sequencerInbox4844.spec.ts new file mode 100644 index 00000000..cbc9b2db --- /dev/null +++ b/test/contract/sequencerInbox4844.spec.ts @@ -0,0 +1,552 @@ +/* + * Copyright 2019-2020, Offchain Labs, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/* eslint-env node, mocha */ + +import { ethers, network } from 'hardhat' +import { BigNumber } from '@ethersproject/bignumber' +import { + Block, + JsonRpcProvider, + TransactionReceipt, +} from '@ethersproject/providers' +import { expect } from 'chai' +import { + Bridge, + Bridge__factory, + Inbox, + Inbox__factory, + MessageTester, + MessageTester__factory, + RollupMock__factory, + SequencerInbox__factory, + TransparentUpgradeableProxy__factory, +} from '../../build/types' +import { applyAlias } from './utils' +import { Event } from '@ethersproject/contracts' +import { Interface } from '@ethersproject/abi' +import { + BridgeInterface, + MessageDeliveredEvent, +} from '../../build/types/src/bridge/Bridge' +import { Signer, Wallet, constants, utils } from 'ethers' +import { keccak256, solidityKeccak256, solidityPack } from 'ethers/lib/utils' +import { Toolkit4844 } from './toolkit4844' +import { + SequencerBatchDeliveredEvent, + SequencerInbox, +} from '../../build/types/src/bridge/SequencerInbox' + +const mineBlocks = async ( + wallet: Wallet, + count: number, + timeDiffPerBlock = 14 +) => { + const block = (await network.provider.send('eth_getBlockByNumber', [ + 'latest', + false, + ])) as Block + let timestamp = BigNumber.from(block.timestamp).toNumber() + for (let i = 0; i < count; i++) { + timestamp = timestamp + timeDiffPerBlock + await ( + await wallet.sendTransaction({ to: constants.AddressZero, value: 1 }) + ).wait() + } +} + +describe('SequencerInbox', async () => { + const findMatchingLogs = ( + receipt: TransactionReceipt, + iFace: TInterface, + eventTopicGen: (i: TInterface) => string + ): TEvent['args'][] => { + const logs = receipt.logs.filter( + log => log.topics[0] === eventTopicGen(iFace) + ) + return logs.map(l => iFace.parseLog(l).args as TEvent['args']) + } + + const getMessageDeliveredEvents = (receipt: TransactionReceipt) => { + const bridgeInterface = Bridge__factory.createInterface() + return findMatchingLogs( + receipt, + bridgeInterface, + i => i.getEventTopic(i.getEvent('MessageDelivered')) + ) + } + + const sendDelayedTx = async ( + sender: Signer, + inbox: Inbox, + bridge: Bridge, + messageTester: MessageTester, + l2Gas: number, + l2GasPrice: number, + nonce: number, + destAddr: string, + amount: BigNumber, + data: string + ) => { + const countBefore = ( + await bridge.functions.delayedMessageCount() + )[0].toNumber() + const sendUnsignedTx = await inbox + .connect(sender) + .sendUnsignedTransaction(l2Gas, l2GasPrice, nonce, destAddr, amount, data) + const sendUnsignedTxReceipt = await sendUnsignedTx.wait() + + const countAfter = ( + await bridge.functions.delayedMessageCount() + )[0].toNumber() + expect(countAfter, 'Unexpected inbox count').to.eq(countBefore + 1) + + const senderAddr = applyAlias(await sender.getAddress()) + + const messageDeliveredEvent = getMessageDeliveredEvents( + sendUnsignedTxReceipt + )[0] + const l1BlockNumber = sendUnsignedTxReceipt.blockNumber + const blockL1 = await sender.provider!.getBlock(l1BlockNumber) + const baseFeeL1 = blockL1.baseFeePerGas!.toNumber() + const l1BlockTimestamp = blockL1.timestamp + const delayedAcc = await bridge.delayedInboxAccs(countBefore) + + // need to hex pad the address + const messageDataHash = ethers.utils.solidityKeccak256( + ['uint8', 'uint256', 'uint256', 'uint256', 'uint256', 'uint256', 'bytes'], + [ + 0, + l2Gas, + l2GasPrice, + nonce, + ethers.utils.hexZeroPad(destAddr, 32), + amount, + data, + ] + ) + expect( + messageDeliveredEvent.messageDataHash, + 'Incorrect messageDataHash' + ).to.eq(messageDataHash) + + const messageHash = ( + await messageTester.functions.messageHash( + 3, + senderAddr, + l1BlockNumber, + l1BlockTimestamp, + countBefore, + baseFeeL1, + messageDataHash + ) + )[0] + + const prevAccumulator = messageDeliveredEvent.beforeInboxAcc + expect(prevAccumulator, 'Incorrect prev accumulator').to.eq( + countBefore === 0 + ? ethers.utils.hexZeroPad('0x', 32) + : await bridge.delayedInboxAccs(countBefore - 1) + ) + + const nextAcc = ( + await messageTester.functions.accumulateInboxMessage( + prevAccumulator, + messageHash + ) + )[0] + + expect(delayedAcc, 'Incorrect delayed acc').to.eq(nextAcc) + + return { + baseFeeL1: baseFeeL1, + deliveredMessageEvent: messageDeliveredEvent, + l1BlockNumber, + l1BlockTimestamp, + delayedAcc, + l2Gas, + l2GasPrice, + nonce, + destAddr, + amount, + data, + senderAddr, + inboxAccountLength: countAfter, + } + } + + const fundAccounts = async ( + wallet: Wallet, + length: number, + amount: BigNumber + ): Promise => { + let key = wallet.privateKey + const wallets: Wallet[] = [] + + for (let index = 0; index < length; index++) { + key = keccak256(key) + const nextWallet = new Wallet(key).connect(wallet.provider) + if ((await nextWallet.getBalance()).lt(amount)) { + await ( + await wallet.sendTransaction({ + to: nextWallet.address, + value: amount, + }) + ).wait() + } + wallets.push(nextWallet) + } + + return wallets + } + + const connectAddreses = ( + user: Wallet, + deployer: Wallet, + batchPoster: Wallet, + addresses: { + user: string + bridge: string + inbox: string + sequencerInbox: string + messageTester: string + batchPoster: string + } + ) => { + return { + user, + batchPoster, + bridge: Bridge__factory.connect(addresses.bridge, user), + inbox: Inbox__factory.connect(addresses.inbox, user), + sequencerInbox: SequencerInbox__factory.connect( + addresses.sequencerInbox, + user + ), + messageTester: MessageTester__factory.connect( + addresses.messageTester, + deployer + ), + } + } + + const setupSequencerInbox = async ( + fundingWallet: Wallet, + maxDelayBlocks = 10, + maxDelayTime = 0 + ) => { + const accounts = await fundAccounts(fundingWallet, 5, utils.parseEther('1')) + + const admin = accounts[0] + const adminAddr = await admin.getAddress() + const user = accounts[1] + const deployer = accounts[2] + const rollupOwner = accounts[3] + const batchPoster = accounts[4] + + // update the addresses below and uncomment to avoid redeploying + // return connectAddreses(user, deployer, batchPoster, { + // user: '0x870204e93ca485a6676E264EB0d7df4cD0246203', + // bridge: '0x960aB1A4858a1CBd3cf75E9a6a16A3C40E1D231e', + // inbox: '0xe763a2bB11c38aB41735D7bB24E98a0662687478', + // sequencerInbox: '0xe187f8f751a4d5860d96f99c6D1e1f5c557128ac', + // messageTester: '0xc1D13079aaC7Bbc399ca14308206d5B87Ae8F3BA', + // batchPoster: '0x328375c90F01Dcb114888DA36e3832F69Ad0BB57', + // }) + + const rollupMockFac = new RollupMock__factory(deployer) + const rollupMock = await rollupMockFac.deploy( + await rollupOwner.getAddress() + ) + + const sequencerInboxFac = new SequencerInbox__factory(deployer) + const seqInboxTemplate = await sequencerInboxFac.deploy(117964) + + const inboxFac = new Inbox__factory(deployer) + const inboxTemplate = await inboxFac.deploy(117964) + + const bridgeFac = new Bridge__factory(deployer) + const bridgeTemplate = await bridgeFac.deploy() + await rollupMock.deployed() + await seqInboxTemplate.deployed() + await inboxTemplate.deployed() + await bridgeTemplate.deployed() + + const transparentUpgradeableProxyFac = + new TransparentUpgradeableProxy__factory(deployer) + + const bridgeProxy = await transparentUpgradeableProxyFac.deploy( + bridgeTemplate.address, + adminAddr, + '0x' + ) + + const sequencerInboxProxy = await transparentUpgradeableProxyFac.deploy( + seqInboxTemplate.address, + adminAddr, + '0x' + ) + + const inboxProxy = await transparentUpgradeableProxyFac.deploy( + inboxTemplate.address, + adminAddr, + '0x' + ) + await bridgeProxy.deployed() + await sequencerInboxProxy.deployed() + await inboxProxy.deployed() + const dataHashReader = await Toolkit4844.deployDataHashReader(fundingWallet) + + const bridge = await bridgeFac.attach(bridgeProxy.address).connect(user) + const bridgeAdmin = await bridgeFac + .attach(bridgeProxy.address) + .connect(rollupOwner) + + const sequencerInbox = await sequencerInboxFac + .attach(sequencerInboxProxy.address) + .connect(user) + const inbox = await inboxFac.attach(inboxProxy.address).connect(user) + + await (await bridgeAdmin.initialize(rollupMock.address)).wait() + await ( + await sequencerInbox.initialize( + bridgeProxy.address, + { + delayBlocks: maxDelayBlocks, + delaySeconds: maxDelayTime, + futureBlocks: 10, + futureSeconds: 3000, + }, + dataHashReader.address + ) + ).wait() + await ( + await sequencerInbox + .connect(rollupOwner) + .setIsBatchPoster(await batchPoster.getAddress(), true) + ).wait() + await ( + await inbox.initialize(bridgeProxy.address, sequencerInbox.address) + ).wait() + + await (await bridgeAdmin.setDelayedInbox(inbox.address, true)).wait() + + await (await bridgeAdmin.setSequencerInbox(sequencerInbox.address)).wait() + + const messageTester = await new MessageTester__factory(deployer).deploy() + await messageTester.deployed() + + const res = { + user, + bridge: bridge, + inbox: inbox, + sequencerInbox: sequencerInbox, + messageTester, + batchPoster, + } + + // comment this in to print the addresses that can then be re-used to avoid redeployment + // let consoleRes: { [index: string]: string } = {} + // Object.entries(res).forEach(r => (consoleRes[r[0]] = r[1].address)) + // console.log(consoleRes) + + return res + } + + it('can send normal batch', async () => { + const privKey = + 'cb5790da63720727af975f42c79f69918580209889225fa7128c92402a6d3a65' + const prov = new JsonRpcProvider('http://localhost:8545') + const wallet = new Wallet(privKey).connect(prov) + + const { user, inbox, bridge, messageTester, sequencerInbox, batchPoster } = + await setupSequencerInbox(wallet) + + await sendDelayedTx( + user, + inbox, + bridge, + messageTester, + 1000000, + 21000000000, + 0, + await user.getAddress(), + BigNumber.from(10), + '0x1010' + ) + + const subMessageCount = await bridge.sequencerReportedSubMessageCount() + const batchSendTx = await sequencerInbox + .connect(batchPoster) + [ + 'addSequencerL2BatchFromOrigin(uint256,bytes,uint256,address,uint256,uint256)' + ]( + await bridge.sequencerMessageCount(), + '0x0142', + await bridge.delayedMessageCount(), + constants.AddressZero, + subMessageCount, + subMessageCount.add(1) + ) + + await batchSendTx.wait() + }) + + it('can send blob batch', async () => { + const privKey = + 'cb5790da63720727af975f42c79f69918580209889225fa7128c92402a6d3a65' + const prov = new JsonRpcProvider('http://localhost:8545') + const wallet = new Wallet(privKey).connect(prov) + + const { user, inbox, bridge, messageTester, sequencerInbox, batchPoster } = + await setupSequencerInbox(wallet) + + await sendDelayedTx( + user, + inbox, + bridge, + messageTester, + 1000000, + 21000000000, + 0, + await user.getAddress(), + BigNumber.from(10), + '0x1010' + ) + + const subMessageCount = await bridge.sequencerReportedSubMessageCount() + const afterDelayedMessagesRead = await bridge.delayedMessageCount() + const sequenceNumber = await bridge.sequencerMessageCount() + + const txHash = await Toolkit4844.sendBlobTx( + batchPoster.privateKey.substring(2), + sequencerInbox.address, + ['0x0142', '0x0143'], + sequencerInbox.interface.encodeFunctionData('addSequencerL2BatchBlob', [ + sequenceNumber, + '0x0142', + afterDelayedMessagesRead, + constants.AddressZero, + subMessageCount, + subMessageCount.add(1), + ]) + ) + + const batchSendTx = await Toolkit4844.getTx(txHash) + const blobHashes = (batchSendTx as any)['blobVersionedHashes'] as string[] + const batchSendReceipt = await Toolkit4844.getTxReceipt(txHash) + const { timestamp: blockTimestamp, number: blockNumber } = + await wallet.provider.getBlock(batchSendReceipt.blockNumber) + + const timeBounds = await getTimeBounds( + blockNumber, + blockTimestamp, + sequencerInbox + ) + const dataHash = formDataBlobHash( + timeBounds, + afterDelayedMessagesRead.toNumber(), + blobHashes + ) + + const batchDeliveredEvent = batchSendReceipt.logs + .filter( + (b: any) => + b.address.toLowerCase() === sequencerInbox.address.toLowerCase() && + b.topics[0] === + sequencerInbox.interface.getEventTopic('SequencerBatchDelivered') + ) + .map( + (l: any) => sequencerInbox.interface.parseLog(l).args + )[0] as SequencerBatchDeliveredEvent['args'] + + const seqMessageCountAfter = ( + await bridge.sequencerMessageCount() + ).toNumber() + const delayedMessageCountAfter = ( + await bridge.delayedMessageCount() + ).toNumber() + + const beforeAcc = + seqMessageCountAfter > 1 + ? await bridge.sequencerInboxAccs(seqMessageCountAfter - 2) + : constants.HashZero + expect(batchDeliveredEvent.beforeAcc, 'before acc').to.eq(beforeAcc) + const delayedAcc = + delayedMessageCountAfter > 0 + ? await bridge.delayedInboxAccs(delayedMessageCountAfter - 1) + : constants.HashZero + expect(batchDeliveredEvent.delayedAcc, 'delayed acc').to.eq(delayedAcc) + const afterAcc = solidityKeccak256( + ['bytes32', 'bytes32', 'bytes32'], + [beforeAcc, dataHash, delayedAcc] + ) + expect(batchDeliveredEvent.afterAcc, 'after acc').to.eq(afterAcc) + }) + + const getTimeBounds = async ( + blockNumber: number, + blockTimestamp: number, + sequencerInbox: SequencerInbox + ): Promise<{ + maxBlock: number + minBlocks: number + minTimestamp: number + maxTimestamp: number + }> => { + const maxTimeVariation = await sequencerInbox.maxTimeVariation() + return { + minBlocks: + blockNumber > maxTimeVariation.delayBlocks.toNumber() + ? blockNumber - maxTimeVariation.delayBlocks.toNumber() + : 0, + maxBlock: blockNumber + maxTimeVariation.futureBlocks.toNumber(), + minTimestamp: + blockTimestamp > maxTimeVariation.delaySeconds.toNumber() + ? blockTimestamp - maxTimeVariation.delaySeconds.toNumber() + : 0, + maxTimestamp: blockTimestamp + maxTimeVariation.futureSeconds.toNumber(), + } + } + + const formDataBlobHash = ( + timeBounds: { + maxBlock: number + minBlocks: number + minTimestamp: number + maxTimestamp: number + }, + afterDelayedMessagesRead: number, + blobHashes: string[] + ) => { + const header = solidityPack( + ['uint64', 'uint64', 'uint64', 'uint64', 'uint64'], + [ + timeBounds.minTimestamp, + timeBounds.maxTimestamp, + timeBounds.minBlocks, + timeBounds.maxBlock, + afterDelayedMessagesRead, + ] + ) + + return keccak256( + solidityPack( + ['bytes', 'bytes'], + [header, solidityPack(['bytes32[]'], [blobHashes])] + ) + ) + } +}) diff --git a/test/contract/sequencerInboxForceInclude.spec.ts b/test/contract/sequencerInboxForceInclude.spec.ts index 43634737..4bc07400 100644 --- a/test/contract/sequencerInboxForceInclude.spec.ts +++ b/test/contract/sequencerInboxForceInclude.spec.ts @@ -26,6 +26,7 @@ import { Inbox, Inbox__factory, MessageTester, + RollupMock__factory, SequencerInbox, SequencerInbox__factory, TransparentUpgradeableProxy__factory, @@ -37,7 +38,8 @@ import { BridgeInterface, MessageDeliveredEvent, } from '../../build/types/src/bridge/Bridge' -import { Signer } from 'ethers' +import { Signer, constants, utils } from 'ethers' +import { Toolkit4844 } from './toolkit4844' const mineBlocks = async (count: number, timeDiffPerBlock = 14) => { const block = (await network.provider.send('eth_getBlockByNumber', [ @@ -220,6 +222,15 @@ describe('SequencerInboxForceInclude', async () => { const adminAddr = await admin.getAddress() const user = accounts[1] const dummyRollup = accounts[2] + const rollupOwner = accounts[3] + const batchPoster = accounts[4] + + const rollupMockFac = (await ethers.getContractFactory( + 'RollupMock' + )) as RollupMock__factory + const rollupMock = await rollupMockFac.deploy( + await rollupOwner.getAddress() + ) const sequencerInboxFac = (await ethers.getContractFactory( 'SequencerInbox' @@ -256,20 +267,26 @@ describe('SequencerInboxForceInclude', async () => { const bridge = await bridgeFac.attach(bridgeProxy.address).connect(user) const bridgeAdmin = await bridgeFac .attach(bridgeProxy.address) - .connect(dummyRollup) + .connect(rollupOwner) const sequencerInbox = await sequencerInboxFac .attach(sequencerInboxProxy.address) .connect(user) const inbox = await inboxFac.attach(inboxProxy.address).connect(user) + const dataHashReader = await Toolkit4844.deployDataHashReader(admin) - await bridge.initialize(await dummyRollup.getAddress()) + await bridge.initialize(rollupMock.address) await sequencerInbox.initialize(bridgeProxy.address, { delayBlocks: maxDelayBlocks, delaySeconds: maxDelayTime, futureBlocks: 10, futureSeconds: 3000, - }) + }, dataHashReader.address) + await ( + await sequencerInbox + .connect(rollupOwner) + .setIsBatchPoster(await batchPoster.getAddress(), true) + ).wait() await inbox.initialize(bridgeProxy.address, sequencerInbox.address) await bridgeAdmin.setDelayedInbox(inbox.address, true) @@ -287,6 +304,7 @@ describe('SequencerInboxForceInclude', async () => { messageTester, inboxProxy, inboxTemplate, + batchPoster, bridgeProxy, } } diff --git a/test/contract/toolkit4844.ts b/test/contract/toolkit4844.ts new file mode 100644 index 00000000..c2ba299c --- /dev/null +++ b/test/contract/toolkit4844.ts @@ -0,0 +1,132 @@ +import { execSync } from 'child_process' +import { ContractFactory, Signer, Wallet, ethers } from 'ethers' +import * as http from 'http' +import { DataHashReader, DataHashReader__factory } from '../../build/types' + +const dataHashReaderJson = { + _format: 'hh-sol-artifact-1', + contractName: 'DataHashesReader', + sourceName: 'src/bridge/DataHashesReader.yul', + abi: [], + bytecode: + '0x603b80600a5f395ff3fe5f3560e01c63e83a2d8214600f57005b5f5b804990811560295760019160408260051b0152016011565b60409060205f528060205260051b015ff3', + linkReferences: {}, + deployedLinkReferences: {}, +} + +const wait = async (ms: number) => + new Promise((res, rej) => { + setTimeout(res, ms) + }) + +export class Toolkit4844 { + public static postDataToGeth(body: any): Promise { + return new Promise((resolve, reject) => { + const options = { + hostname: 'localhost', + port: 8545, + path: '/', + method: 'POST', + headers: { + 'Content-Type': 'application/json;charset=UTF-8', + 'Content-Length': Buffer.byteLength(JSON.stringify(body)), + }, + } + + const req = http.request(options, res => { + let data = '' + + // Event emitted when a chunk of data is received + res.on('data', chunk => { + data += chunk + }) + + // Event emitted when the response is fully received + res.on('end', () => { + resolve(JSON.parse(data)) + }) + }) + + // Handle any errors + req.on('error', error => { + reject(error) + }) + + // Send the POST data + req.write(JSON.stringify(body)) + + // Close the request + req.end() + }) + } + + public static async getTx(txHash: string): Promise { + const body = { + method: 'eth_getTransactionByHash', + params: [txHash], + id: Date.now(), + jsonrpc: '2.0', + } + return (await this.postDataToGeth(body))['result'] + } + + public static async getTxReceipt(txHash: string): Promise { + const body = { + method: 'eth_getTransactionReceipt', + params: [txHash], + id: Date.now(), + jsonrpc: '2.0', + } + return (await this.postDataToGeth(body))['result'] + } + + public static async chainId(): Promise { + const body = { + method: 'eth_chainId', + params: [], + id: Date.now(), + jsonrpc: '2.0', + } + return (await this.postDataToGeth(body))['result'] + } + + public static isReplacementError(err: string) { + const errRegex = + /Error while sending transaction\: replacement transaction underpriced\:/ + const match = err.match(errRegex) + return !!match + } + + public static async sendBlobTx( + privKey: string, + to: string, + blobs: string[], + data: string + ) { + const blobStr = blobs.reduce((acc, blob) => acc + " -b " + blob, "") + const blobCommand = `docker run --network=nitro-testnode_default ethpandaops/goomy-blob:master blob-sender -p ${privKey} -r http://geth:8545 -t ${to} -d ${data} --gaslimit 1000000${blobStr} 2>&1` + const res = execSync(blobCommand).toString() + const txHashRegex = /0x[a-fA-F0-9]{64}/ + const match = res.match(txHashRegex) + if (match) { + await wait(10000) + return match[0] + } else { + throw new Error('Error sending blob tx:\n' + res) + } + } + + public static async deployDataHashReader( + wallet: Signer + ): Promise { + const contractFactory = new ContractFactory( + dataHashReaderJson.abi, + dataHashReaderJson.bytecode, + wallet + ) + const dataHashReader = await contractFactory.deploy() + await dataHashReader.deployed() + + return DataHashReader__factory.connect(dataHashReader.address, wallet) + } +} From 6092d895ecf2d970d84d9cff48b09d2768157b08 Mon Sep 17 00:00:00 2001 From: Chris Buckland Date: Tue, 17 Oct 2023 18:48:48 +0200 Subject: [PATCH 131/292] Merge from develop --- src/rollup/Config.sol | 1 - src/rollup/RollupCreator.sol | 5 +- src/rollup/RollupCreator2.sol | 274 -------------------------------- test/contract/arbRollup.spec.ts | 9 +- 4 files changed, 7 insertions(+), 282 deletions(-) delete mode 100644 src/rollup/RollupCreator2.sol diff --git a/src/rollup/Config.sol b/src/rollup/Config.sol index 70c99068..13ca82e2 100644 --- a/src/rollup/Config.sol +++ b/src/rollup/Config.sol @@ -26,7 +26,6 @@ struct Config { string chainConfig; uint64 genesisBlockNum; ISequencerInbox.MaxTimeVariation sequencerInboxMaxTimeVariation; - IDataHashReader dataHashReader; } struct ContractDependencies { diff --git a/src/rollup/RollupCreator.sol b/src/rollup/RollupCreator.sol index ac9621b3..955c9696 100644 --- a/src/rollup/RollupCreator.sol +++ b/src/rollup/RollupCreator.sol @@ -41,6 +41,7 @@ contract RollupCreator is Ownable { address nativeToken; bool deployFactoriesToL2; uint256 maxFeePerGasForRetryables; + IDataHashReader dataHashReader; } BridgeCreator public bridgeCreator; @@ -102,6 +103,7 @@ contract RollupCreator is Ownable { * anyone can try to deploy factories and potentially burn the nonce 0 (ie. due to gas price spike when doing direct * L2 TX). That would mean we permanently lost capability to deploy deterministic factory at expected address. * - maxFeePerGasForRetryables price bid for L2 execution. + * - dataHashReader The address of the data hash reader used to read blob hashes * @return The address of the newly created rollup */ function createRollup(RollupDeploymentParams memory deployParams) @@ -136,7 +138,8 @@ contract RollupCreator is Ownable { address(proxyAdmin), address(rollup), deployParams.nativeToken, - deployParams.config.sequencerInboxMaxTimeVariation + deployParams.config.sequencerInboxMaxTimeVariation, + deployParams.dataHashReader ); IChallengeManager challengeManager = IChallengeManager( diff --git a/src/rollup/RollupCreator2.sol b/src/rollup/RollupCreator2.sol deleted file mode 100644 index 0ec7873b..00000000 --- a/src/rollup/RollupCreator2.sol +++ /dev/null @@ -1,274 +0,0 @@ -// 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 - -pragma solidity ^0.8.0; - -import "./RollupProxy.sol"; -import "./IRollupAdmin.sol"; -import "./BridgeCreator.sol"; -import "@offchainlabs/upgrade-executor/src/IUpgradeExecutor.sol"; -import "@openzeppelin/contracts/proxy/transparent/ProxyAdmin.sol"; -import "@openzeppelin/contracts/proxy/transparent/TransparentUpgradeableProxy.sol"; -import "@openzeppelin/contracts/access/Ownable.sol"; -import {DeployHelper} from "./DeployHelper.sol"; -import {SafeERC20, IERC20} from "@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol"; - -contract RollupCreator is Ownable { - using SafeERC20 for IERC20; - - event RollupCreated( - address indexed rollupAddress, - address indexed nativeToken, - address inboxAddress, - address outbox, - address rollupEventInbox, - address challengeManager, - address adminProxy, - address sequencerInbox, - address bridge, - address upgradeExecutor, - address validatorUtils, - address validatorWalletCreator - ); - event TemplatesUpdated(); - - BridgeCreator public bridgeCreator; - IOneStepProofEntry public osp; - IChallengeManager public challengeManagerTemplate; - IRollupAdmin public rollupAdminLogic; - IRollupUser public rollupUserLogic; - IUpgradeExecutor public upgradeExecutorLogic; - - address public validatorUtils; - address public validatorWalletCreator; - - DeployHelper public l2FactoriesDeployer; - - constructor() Ownable() {} - - // creator receives back excess fees (for deploying L2 factories) so it can refund the caller - receive() external payable {} - - function setTemplates( - BridgeCreator _bridgeCreator, - IOneStepProofEntry _osp, - IChallengeManager _challengeManagerLogic, - IRollupAdmin _rollupAdminLogic, - IRollupUser _rollupUserLogic, - IUpgradeExecutor _upgradeExecutorLogic, - address _validatorUtils, - address _validatorWalletCreator, - DeployHelper _l2FactoriesDeployer - ) external onlyOwner { - bridgeCreator = _bridgeCreator; - osp = _osp; - challengeManagerTemplate = _challengeManagerLogic; - rollupAdminLogic = _rollupAdminLogic; - rollupUserLogic = _rollupUserLogic; - upgradeExecutorLogic = _upgradeExecutorLogic; - validatorUtils = _validatorUtils; - validatorWalletCreator = _validatorWalletCreator; - l2FactoriesDeployer = _l2FactoriesDeployer; - emit TemplatesUpdated(); - } - - struct RollupCreatorArgs { - Config config; - address _batchPoster; - address[] _validators; - uint256 _maxDataSize; - address _nativeToken; - bool _deployFactoriesToL2; - uint256 _maxFeePerGasForRetryables; - } - - // CHRIS: TODO: sort this out - // * @param _batchPoster The address of the batch poster, not used when set to zero address - // * @param _validators The list of validator addresses, not used when set to empty list - // * @param _nativeToken Address of the custom fee token used by rollup. If rollup is ETH-based address(0) should be provided - // * @param _deployFactoriesToL2 Whether to deploy L2 factories using retryable tickets. If true, retryables need to be paid for in native currency. - // * Deploying factories via retryable tickets at rollup creation time is the most reliable method to do it since it - // * doesn't require paying the L1 gas. If deployment is not done as part of rollup creation TX, there is a risk that - // * anyone can try to deploy factories and potentially burn the nonce 0 (ie. due to gas price spike when doing direct - // * L2 TX). That would mean we permanently lost capability to deploy deterministic factory at expected address. - // * @param _maxFeePerGasForRetryables price bid for L2 execution. - // * @return The address of the newly created rollup - - /** - * @notice Create a new rollup - * @dev After this setup: - * @dev - UpgradeExecutor should be the owner of rollup - * @dev - UpgradeExecutor should be the owner of proxyAdmin which manages bridge contracts - * @dev - config.rollupOwner should have executor role on upgradeExecutor - * @dev - Bridge should have a single inbox and outbox - * @dev - Validators and batch poster should be set if provided - // * @param args The configuration for the rollup - */ - function createRollup(RollupCreatorArgs memory args) public payable returns (address) { - { - // Make sure the immutable maxDataSize is as expected - (, ISequencerInbox ethSequencerInbox, IInboxBase ethInbox, , ) = bridgeCreator - .ethBasedTemplates(); - require( - args._maxDataSize == ethSequencerInbox.maxDataSize(), - "SI_MAX_DATA_SIZE_MISMATCH" - ); - require(args._maxDataSize == ethInbox.maxDataSize(), "I_MAX_DATA_SIZE_MISMATCH"); - - (, ISequencerInbox erc20SequencerInbox, IInboxBase erc20Inbox, , ) = bridgeCreator - .erc20BasedTemplates(); - require( - args._maxDataSize == erc20SequencerInbox.maxDataSize(), - "SI_MAX_DATA_SIZE_MISMATCH" - ); - require(args._maxDataSize == erc20Inbox.maxDataSize(), "I_MAX_DATA_SIZE_MISMATCH"); - } - - // create proxy admin which will manage bridge contracts - ProxyAdmin proxyAdmin = new ProxyAdmin(); - - // Create the rollup proxy to figure out the address and initialize it later - RollupProxy rollup = new RollupProxy{salt: keccak256(abi.encode(args))}(); - - BridgeCreator.BridgeContracts memory bridgeContracts = bridgeCreator.createBridge( - address(proxyAdmin), - address(rollup), - args._nativeToken, - args.config.sequencerInboxMaxTimeVariation, - args.config.dataHashReader - ); - - IChallengeManager challengeManager = IChallengeManager( - address( - new TransparentUpgradeableProxy( - address(challengeManagerTemplate), - address(proxyAdmin), - "" - ) - ) - ); - challengeManager.initialize( - IChallengeResultReceiver(address(rollup)), - bridgeContracts.sequencerInbox, - bridgeContracts.bridge, - osp - ); - - // deploy and init upgrade executor - address upgradeExecutor = _deployUpgradeExecutor(args.config.owner, proxyAdmin); - - // upgradeExecutor shall be proxyAdmin's owner - proxyAdmin.transferOwnership(address(upgradeExecutor)); - - // initialize the rollup with this contract as owner to set batch poster and validators - // it will transfer the ownership to the upgrade executor later - args.config.owner = address(this); - rollup.initializeProxy( - args.config, - ContractDependencies({ - bridge: bridgeContracts.bridge, - sequencerInbox: bridgeContracts.sequencerInbox, - inbox: bridgeContracts.inbox, - outbox: bridgeContracts.outbox, - rollupEventInbox: bridgeContracts.rollupEventInbox, - challengeManager: challengeManager, - rollupAdminLogic: address(rollupAdminLogic), - rollupUserLogic: rollupUserLogic, - validatorUtils: validatorUtils, - validatorWalletCreator: validatorWalletCreator - }) - ); - - // setting batch poster, if the address provided is not zero address - if (args._batchPoster != address(0)) { - bridgeContracts.sequencerInbox.setIsBatchPoster(args._batchPoster, true); - } - - // Call setValidator on the newly created rollup contract just if validator set is not empty - if (args._validators.length != 0) { - bool[] memory _vals = new bool[](args._validators.length); - for (uint256 i = 0; i < args._validators.length; i++) { - _vals[i] = true; - } - IRollupAdmin(address(rollup)).setValidator(args._validators, _vals); - } - - IRollupAdmin(address(rollup)).setOwner(address(upgradeExecutor)); - - if (args._deployFactoriesToL2) { - _deployFactories( - address(bridgeContracts.inbox), - args._nativeToken, - args._maxFeePerGasForRetryables - ); - } - - emit RollupCreated( - address(rollup), - args._nativeToken, - address(bridgeContracts.inbox), - address(bridgeContracts.outbox), - address(bridgeContracts.rollupEventInbox), - address(challengeManager), - address(proxyAdmin), - address(bridgeContracts.sequencerInbox), - address(bridgeContracts.bridge), - address(upgradeExecutor), - address(validatorUtils), - address(validatorWalletCreator) - ); - return address(rollup); - } - - function _deployUpgradeExecutor(address rollupOwner, ProxyAdmin proxyAdmin) - internal - returns (address) - { - IUpgradeExecutor upgradeExecutor = IUpgradeExecutor( - address( - new TransparentUpgradeableProxy( - address(upgradeExecutorLogic), - address(proxyAdmin), - bytes("") - ) - ) - ); - address[] memory executors = new address[](1); - executors[0] = rollupOwner; - upgradeExecutor.initialize(address(upgradeExecutor), executors); - - return address(upgradeExecutor); - } - - function _deployFactories( - address _inbox, - address _nativeToken, - uint256 _maxFeePerGas - ) internal { - if (_nativeToken == address(0)) { - // we need to fund 4 retryable tickets - uint256 cost = l2FactoriesDeployer.getDeploymentTotalCost( - IInboxBase(_inbox), - _maxFeePerGas - ); - - // do it - l2FactoriesDeployer.perform{value: cost}(_inbox, _nativeToken, _maxFeePerGas); - - // refund the caller - (bool sent, ) = msg.sender.call{value: address(this).balance}(""); - require(sent, "Refund failed"); - } else { - // Transfer fee token amount needed to pay for retryable fees to the inbox. - uint256 totalFee = l2FactoriesDeployer.getDeploymentTotalCost( - IInboxBase(_inbox), - _maxFeePerGas - ); - IERC20(_nativeToken).safeTransferFrom(msg.sender, _inbox, totalFee); - - // do it - l2FactoriesDeployer.perform(_inbox, _nativeToken, _maxFeePerGas); - } - } -} diff --git a/test/contract/arbRollup.spec.ts b/test/contract/arbRollup.spec.ts index c3ee6884..b2e1927c 100644 --- a/test/contract/arbRollup.spec.ts +++ b/test/contract/arbRollup.spec.ts @@ -46,7 +46,6 @@ import { RollupUserLogic__factory, SequencerInbox, SequencerInbox__factory, - ToySequencerInbox__factory, } from '../../build/types' import { abi as UpgradeExecutorABI, @@ -63,18 +62,15 @@ import { } from './common/rolluplib' import { AssertionStruct } from '../../build/types/src/rollup/RollupCore' import { ExecutionStateStruct } from '../../build/types/src/rollup/RollupCore' -import { fetchJson, keccak256 } from 'ethers/lib/utils' +import { keccak256 } from 'ethers/lib/utils' import { ConfigStruct, RollupCreatedEvent, } from '../../build/types/src/rollup/RollupCreator' -import { ContractFactory, Wallet, constants, providers } from 'ethers' +import { constants, providers } from 'ethers' import { blockStateHash, MachineStatus } from './common/challengeLib' import * as globalStateLib from './common/globalStateLib' import { RollupChallengeStartedEvent } from '../../build/types/src/rollup/IRollupCore' -import { execSync } from 'child_process' -import { JsonRpcProvider } from '@ethersproject/providers' -import { Toolkit4844 } from './4844tools' const zerobytes32 = ethers.constants.HashZero const stakeRequirement = 10 @@ -284,6 +280,7 @@ const setup = async () => { nativeToken: ethers.constants.AddressZero, deployFactoriesToL2: true, maxFeePerGasForRetryables: maxFeePerGas, + dataHashReader: ethers.constants.AddressZero, } const response = await rollupCreator.createRollup(deployParams, { From 233826fbb70e7f1ae562af39733f6aaf30472849 Mon Sep 17 00:00:00 2001 From: Chris Buckland Date: Wed, 18 Oct 2023 10:39:15 +0200 Subject: [PATCH 132/292] Updated formatting --- hardhat.config.ts | 2 +- src/bridge/SequencerInbox.sol | 52 +++++++++++++++++------------------ test/contract/toolkit4844.ts | 6 ++-- 3 files changed, 29 insertions(+), 31 deletions(-) diff --git a/hardhat.config.ts b/hardhat.config.ts index 781f4558..45777e03 100644 --- a/hardhat.config.ts +++ b/hardhat.config.ts @@ -8,7 +8,7 @@ import 'hardhat-gas-reporter' import 'hardhat-ignore-warnings' // CHRIS: TODO: use a flag for this // uncomment to regenerate yul -// import '@tovarishfin/hardhat-yul'; +import '@tovarishfin/hardhat-yul'; import dotenv from 'dotenv' dotenv.config() diff --git a/src/bridge/SequencerInbox.sol b/src/bridge/SequencerInbox.sol index 526d78ff..5262e7df 100644 --- a/src/bridge/SequencerInbox.sol +++ b/src/bridge/SequencerInbox.sol @@ -282,19 +282,14 @@ contract SequencerInbox is DelegateCallAware, GasRefundEnabled, ISequencerInbox afterDelayedMessagesRead ); - ( - uint256 seqMessageIndex, - bytes32 beforeAcc, - bytes32 delayedAcc, - bytes32 afterAcc - ) = addSequencerL2BatchImpl( - dataHash, - afterDelayedMessagesRead, - // CHRIS: TODO: implement blob fees - 0, - prevMessageCount, - newMessageCount - ); + (uint256 seqMessageIndex, bytes32 beforeAcc, bytes32 delayedAcc, bytes32 afterAcc) = addSequencerL2BatchImpl( + dataHash, + afterDelayedMessagesRead, + // CHRIS: TODO: implement blob fees + 0, + prevMessageCount, + newMessageCount + ); if (seqMessageIndex != sequenceNumber && sequenceNumber != ~uint256(0)) revert BadSequencerNumber(seqMessageIndex, sequenceNumber); emit SequencerBatchDelivered( @@ -323,13 +318,18 @@ contract SequencerInbox is DelegateCallAware, GasRefundEnabled, ISequencerInbox ); // we set the calldata length posted to 0 here since the caller isn't the origin // of the tx, so they might have not paid tx input cost for the calldata - (uint256 seqMessageIndex, bytes32 beforeAcc, bytes32 delayedAcc, bytes32 afterAcc) = addSequencerL2BatchImpl( - dataHash, - afterDelayedMessagesRead, - 0, - prevMessageCount, - newMessageCount - ); + ( + uint256 seqMessageIndex, + bytes32 beforeAcc, + bytes32 delayedAcc, + bytes32 afterAcc + ) = addSequencerL2BatchImpl( + dataHash, + afterDelayedMessagesRead, + 0, + prevMessageCount, + newMessageCount + ); if (seqMessageIndex != sequenceNumber && sequenceNumber != ~uint256(0)) revert BadSequencerNumber(seqMessageIndex, sequenceNumber); emit SequencerBatchDelivered( @@ -382,19 +382,17 @@ contract SequencerInbox is DelegateCallAware, GasRefundEnabled, ISequencerInbox return (header, timeBounds); } - function formDataBlobHash(bytes calldata data, uint256 afterDelayedMessagesRead, bytes32[] memory versionedHashes) - internal - view - validateBatchData(data) - returns (bytes32, TimeBounds memory) - { + function formDataBlobHash( + bytes calldata data, + uint256 afterDelayedMessagesRead, + bytes32[] memory versionedHashes + ) internal view validateBatchData(data) returns (bytes32, TimeBounds memory) { (bytes memory header, TimeBounds memory timeBounds) = packHeader(afterDelayedMessagesRead); // CHRIS: TODO: encode or encode packed? bytes32 dataHash = keccak256(bytes.concat(header, abi.encodePacked(versionedHashes))); return (dataHash, timeBounds); } - function formDataBlobHash(bytes calldata data, uint256 afterDelayedMessagesRead) internal view diff --git a/test/contract/toolkit4844.ts b/test/contract/toolkit4844.ts index c2ba299c..7d1ba74a 100644 --- a/test/contract/toolkit4844.ts +++ b/test/contract/toolkit4844.ts @@ -1,7 +1,7 @@ import { execSync } from 'child_process' import { ContractFactory, Signer, Wallet, ethers } from 'ethers' import * as http from 'http' -import { DataHashReader, DataHashReader__factory } from '../../build/types' +import { IDataHashReader, IDataHashReader__factory } from '../../build/types' const dataHashReaderJson = { _format: 'hh-sol-artifact-1', @@ -118,7 +118,7 @@ export class Toolkit4844 { public static async deployDataHashReader( wallet: Signer - ): Promise { + ): Promise { const contractFactory = new ContractFactory( dataHashReaderJson.abi, dataHashReaderJson.bytecode, @@ -127,6 +127,6 @@ export class Toolkit4844 { const dataHashReader = await contractFactory.deploy() await dataHashReader.deployed() - return DataHashReader__factory.connect(dataHashReader.address, wallet) + return IDataHashReader__factory.connect(dataHashReader.address, wallet) } } From 557835ed4101419b49bb18fd38c173edc34c71a1 Mon Sep 17 00:00:00 2001 From: Chris Buckland Date: Wed, 18 Oct 2023 10:39:49 +0200 Subject: [PATCH 133/292] Recommented yul compile --- hardhat.config.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/hardhat.config.ts b/hardhat.config.ts index 45777e03..781f4558 100644 --- a/hardhat.config.ts +++ b/hardhat.config.ts @@ -8,7 +8,7 @@ import 'hardhat-gas-reporter' import 'hardhat-ignore-warnings' // CHRIS: TODO: use a flag for this // uncomment to regenerate yul -import '@tovarishfin/hardhat-yul'; +// import '@tovarishfin/hardhat-yul'; import dotenv from 'dotenv' dotenv.config() From a7286ef8e6af4b79ae541301e658f466d8431e08 Mon Sep 17 00:00:00 2001 From: Chris Buckland Date: Wed, 18 Oct 2023 10:57:30 +0200 Subject: [PATCH 134/292] Update unit tests --- test/foundry/BridgeCreator.t.sol | 7 +- test/foundry/RollupCreator.t.sol | 10 +- yarn.lock | 671 ++++++++++++++++++++++++++++--- 3 files changed, 625 insertions(+), 63 deletions(-) diff --git a/test/foundry/BridgeCreator.t.sol b/test/foundry/BridgeCreator.t.sol index 16099869..75732853 100644 --- a/test/foundry/BridgeCreator.t.sol +++ b/test/foundry/BridgeCreator.t.sol @@ -13,6 +13,7 @@ contract BridgeCreatorTest is Test { BridgeCreator public creator; address public owner = address(100); uint256 public constant MAX_DATA_SIZE = 117_964; + IDataHashReader dummyDataHashReader = IDataHashReader(address(137)); BridgeCreator.BridgeContracts ethBasedTemplates = BridgeCreator.BridgeContracts({ @@ -127,7 +128,8 @@ contract BridgeCreatorTest is Test { proxyAdmin, rollup, nativeToken, - timeVars + timeVars, + dummyDataHashReader ); ( IBridge bridge, @@ -198,7 +200,8 @@ contract BridgeCreatorTest is Test { proxyAdmin, rollup, nativeToken, - timeVars + timeVars, + dummyDataHashReader ); ( IBridge bridge, diff --git a/test/foundry/RollupCreator.t.sol b/test/foundry/RollupCreator.t.sol index 6eb50065..5889cff5 100644 --- a/test/foundry/RollupCreator.t.sol +++ b/test/foundry/RollupCreator.t.sol @@ -27,6 +27,7 @@ contract RollupCreatorTest is Test { IRollupAdmin public rollupAdmin; IRollupUser public rollupUser; DeployHelper public deployHelper; + IDataHashReader dummyDataHashReader = IDataHashReader(address(137)); // 1 gwei uint256 public constant MAX_FEE_PER_GAS = 1_000_000_000; @@ -124,7 +125,8 @@ contract RollupCreatorTest is Test { maxDataSize: MAX_DATA_SIZE, nativeToken: address(0), deployFactoriesToL2: true, - maxFeePerGasForRetryables: MAX_FEE_PER_GAS + maxFeePerGasForRetryables: MAX_FEE_PER_GAS, + dataHashReader: dummyDataHashReader }); address rollupAddress = rollupCreator.createRollup{value: factoryDeploymentFunds}(deployParams); @@ -260,7 +262,8 @@ contract RollupCreatorTest is Test { maxDataSize: MAX_DATA_SIZE, nativeToken: nativeToken, deployFactoriesToL2: true, - maxFeePerGasForRetryables: MAX_FEE_PER_GAS + maxFeePerGasForRetryables: MAX_FEE_PER_GAS, + dataHashReader: dummyDataHashReader }); address rollupAddress = rollupCreator.createRollup(deployParams); @@ -393,7 +396,8 @@ contract RollupCreatorTest is Test { maxDataSize: MAX_DATA_SIZE, nativeToken: address(0), deployFactoriesToL2: true, - maxFeePerGasForRetryables: MAX_FEE_PER_GAS + maxFeePerGasForRetryables: MAX_FEE_PER_GAS, + dataHashReader: dummyDataHashReader }); address rollupAddress = rollupCreator.createRollup{value: factoryDeploymentFunds}(deployParams); diff --git a/yarn.lock b/yarn.lock index 162c7836..960d60e7 100644 --- a/yarn.lock +++ b/yarn.lock @@ -996,6 +996,11 @@ resolved "https://registry.yarnpkg.com/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz#b520529ec21d8e5945a1851dfd1c32e94e39ff45" integrity sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA== +"@hyperapp/router@^0.7.1": + version "0.7.2" + resolved "https://registry.yarnpkg.com/@hyperapp/router/-/router-0.7.2.tgz#6a5edbeceb65bd545d7c55fd59153d7353001c0e" + integrity sha512-RXZhJzx0j1UQK/Ia9j7TQlkH1N6qOvJTTEJCIS9NrM1YJabmXGoI0owkvKxieSgXi6EKQ+wUWhXHj9s+Sy9EPA== + "@metamask/eth-sig-util@^4.0.0": version "4.0.0" resolved "https://registry.yarnpkg.com/@metamask/eth-sig-util/-/eth-sig-util-4.0.0.tgz#11553ba06de0d1352332c1bde28c8edd00e0dcf6" @@ -1255,6 +1260,15 @@ "@nomicfoundation/solidity-analyzer-win32-ia32-msvc" "0.1.1" "@nomicfoundation/solidity-analyzer-win32-x64-msvc" "0.1.1" +"@nomiclabs/hardhat-docker@^2.0.0": + version "2.0.2" + resolved "https://registry.yarnpkg.com/@nomiclabs/hardhat-docker/-/hardhat-docker-2.0.2.tgz#ae964be17951275a55859ff7358e9e7c77448846" + integrity sha512-XgGEpRT3wlA1VslyB57zyAHV+oll8KnV1TjwnxxC1tpAL04/lbdwpdO5KxInVN8irMSepqFpsiSkqlcnvbE7Ng== + dependencies: + dockerode "^2.5.8" + fs-extra "^7.0.1" + node-fetch "^2.6.0" + "@nomiclabs/hardhat-ethers@npm:hardhat-deploy-ethers@^0.3.0-beta.13": version "0.3.0-beta.13" resolved "https://registry.yarnpkg.com/hardhat-deploy-ethers/-/hardhat-deploy-ethers-0.3.0-beta.13.tgz#b96086ff768ddf69928984d5eb0a8d78cfca9366" @@ -1494,6 +1508,18 @@ dependencies: defer-to-connect "^1.0.1" +"@tovarishfin/hardhat-yul@^3.0.5": + version "3.0.5" + resolved "https://registry.yarnpkg.com/@tovarishfin/hardhat-yul/-/hardhat-yul-3.0.5.tgz#84d896edfa95249073e30b0d622733e70318fc2e" + integrity sha512-DR5nqqQiv7f3bN885Kr3Z+J3LgCmYMPexIRGeS4bqPkC73Qt8nSET1NzohdJDw0HtquOPqraqDez050V0YGrfw== + dependencies: + "@nomiclabs/hardhat-docker" "^2.0.0" + fs-extra "^10.1.0" + glob "^8.0.3" + solc "^0.8.17" + solpp "^0.11.5" + yulp "^0.2.3" + "@tsconfig/node10@^1.0.7": version "1.0.8" resolved "https://registry.yarnpkg.com/@tsconfig/node10/-/node10-1.0.8.tgz#c1e4e80d6f964fbecb3359c43bd48b40f7cadad9" @@ -1816,6 +1842,14 @@ resolved "https://registry.yarnpkg.com/@yarnpkg/lockfile/-/lockfile-1.1.0.tgz#e77a97fbd345b76d83245edcd17d393b1b41fb31" integrity sha512-GpSwvyXOcOOlV70vbnzjj4fW5xW/FdUF6nQEt1ENy7m4ZCczi1+/buVUPAqmGfqznsORNFzUMjctTIp8a9tuCQ== +JSONStream@1.3.2: + version "1.3.2" + resolved "https://registry.yarnpkg.com/JSONStream/-/JSONStream-1.3.2.tgz#c102371b6ec3a7cf3b847ca00c20bb0fce4c6dea" + integrity sha512-mn0KSip7N4e0UDPZHnqDsHECo5uGQrixQKnAskOM1BIB8hd7QKbd6il8IPRPudPHOeHiECoCFqhyMaRO9+nWyA== + dependencies: + jsonparse "^1.2.0" + through ">=2.2.7 <3" + abbrev@1: version "1.1.1" resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.1.1.tgz#f8f2c887ad10bf67f634f005b6987fed3179aac8" @@ -2026,11 +2060,21 @@ antlr4@4.7.1: resolved "https://registry.yarnpkg.com/antlr4/-/antlr4-4.7.1.tgz#69984014f096e9e775f53dd9744bf994d8959773" integrity sha512-haHyTW7Y9joE5MVs37P2lNYfU2RWBLfcRDD8OWldcdZm5TiCE91B5Xl1oWSwiDUSd4rlExpt2pu1fksYQjRBYQ== +antlr4@~4.8.0: + version "4.8.0" + resolved "https://registry.yarnpkg.com/antlr4/-/antlr4-4.8.0.tgz#f938ec171be7fc2855cd3a533e87647185b32b6a" + integrity sha512-en/MxQ4OkPgGJQ3wD/muzj1uDnFSzdFIhc2+c6bHZokWkuBb6RRvFjpWhPxWLbgQvaEzldJZ0GSQpfSAaE3hqg== + antlr4ts@^0.5.0-alpha.4: version "0.5.0-alpha.4" resolved "https://registry.yarnpkg.com/antlr4ts/-/antlr4ts-0.5.0-alpha.4.tgz#71702865a87478ed0b40c0709f422cf14d51652a" integrity sha512-WPQDt1B74OfPv/IMS2ekXAKkTZIHl88uMetg6q3OTqgFxZ/dxDXI0EWLyZid/1Pe6hTftyg5N7gel5wNAGxXyQ== +any-promise@^1.0.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/any-promise/-/any-promise-1.3.0.tgz#abc6afeedcea52e809cdc0376aed3ce39635d17f" + integrity sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A== + anymatch@~3.1.1, anymatch@~3.1.2: version "3.1.2" resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.2.tgz#c0557c096af32f106198f4f4e2a383537e378716" @@ -2223,6 +2267,14 @@ aws4@^1.8.0: resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.11.0.tgz#d61f46d83b2519250e2784daf5b09479a8b41c59" integrity sha512-xh1Rl34h6Fi1DC2WWKfxUTVqRsNnr6LsKz2+hfwDxQJWmrx8+c7ylaqBMcHfl1U1r2dsifOvKX3LQuLNZ+XSvA== +axios@^0.18.1: + version "0.18.1" + resolved "https://registry.yarnpkg.com/axios/-/axios-0.18.1.tgz#ff3f0de2e7b5d180e757ad98000f1081b87bcea3" + integrity sha512-0BfJq4NSfQXd+SkFdrvFbG7addhYSBA2mQwISr46pD6E5iqkWg02RAs8vyTT/j0RTnoYmeXauBuSv1qKwR179g== + dependencies: + follow-redirects "1.5.10" + is-buffer "^2.0.2" + axios@^0.21.1: version "0.21.4" resolved "https://registry.yarnpkg.com/axios/-/axios-0.21.4.tgz#c67b90dc0568e5c1cf2b0b858c43ba28e2eda575" @@ -2826,6 +2878,13 @@ binary-extensions@^2.0.0: resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.2.0.tgz#75f502eeaf9ffde42fc98829645be4ea76bd9e2d" integrity sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA== +bindings@^1.2.1: + version "1.5.0" + resolved "https://registry.yarnpkg.com/bindings/-/bindings-1.5.0.tgz#10353c9e945334bc0511a6d90b38fbc7c9c504df" + integrity sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ== + dependencies: + file-uri-to-path "1.0.0" + bip39@2.5.0: version "2.5.0" resolved "https://registry.yarnpkg.com/bip39/-/bip39-2.5.0.tgz#51cbd5179460504a63ea3c000db3f787ca051235" @@ -2837,6 +2896,14 @@ bip39@2.5.0: safe-buffer "^5.0.1" unorm "^1.3.3" +bl@^1.0.0: + version "1.2.3" + resolved "https://registry.yarnpkg.com/bl/-/bl-1.2.3.tgz#1e8dd80142eac80d7158c9dccc047fb620e035e7" + integrity sha512-pvcNpa0UU69UT341rO6AYy4FVAIkUHuZXRIWbq+zHnsVcRzDDjIAhGuuYoi0d//cwIwtt4pkpKycWEfjdV+vww== + dependencies: + readable-stream "^2.3.5" + safe-buffer "^5.1.1" + bl@^4.0.3: version "4.1.0" resolved "https://registry.yarnpkg.com/bl/-/bl-4.1.0.tgz#451535264182bec2fbbc83a62ab98cf11d9f7b3a" @@ -2856,12 +2923,20 @@ bluebird@^3.5.0, bluebird@^3.5.2: resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.7.2.tgz#9f229c15be272454ffa973ace0dbee79a1b0c36f" integrity sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg== +bn-str-256@^1.9.1: + version "1.9.1" + resolved "https://registry.yarnpkg.com/bn-str-256/-/bn-str-256-1.9.1.tgz#898cebee70a3edc3968f97b4cebbc4771025aa82" + integrity sha512-u3muv3WO5sYv9nUQsPnDGLg731yNt/MOlKPK5pmBVqClcl7tY97tyfKxw8ed44HVrpi+7dkgJgQpbXP47a3GoQ== + dependencies: + decimal.js-light "^2.5.0" + lodash "^4.17.11" + bn.js@4.11.6: version "4.11.6" resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-4.11.6.tgz#53344adb14617a13f6e8dd2ce28905d1c0ba3215" integrity sha1-UzRK2xRhehP26N0s4okF0cC6MhU= -bn.js@^4.0.0, bn.js@^4.1.0, bn.js@^4.10.0, bn.js@^4.11.0, bn.js@^4.11.6, bn.js@^4.11.8, bn.js@^4.11.9, bn.js@^4.8.0: +bn.js@^4.0.0, bn.js@^4.1.0, bn.js@^4.10.0, bn.js@^4.11.0, bn.js@^4.11.6, bn.js@^4.11.8, bn.js@^4.11.9, bn.js@^4.4.0, bn.js@^4.8.0: version "4.12.0" resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-4.12.0.tgz#775b3f278efbb9718eec7361f483fb36fbbfea88" integrity sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA== @@ -3051,11 +3126,29 @@ bs58check@^2.1.2: create-hash "^1.1.0" safe-buffer "^5.1.2" +buffer-alloc-unsafe@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/buffer-alloc-unsafe/-/buffer-alloc-unsafe-1.1.0.tgz#bd7dc26ae2972d0eda253be061dba992349c19f0" + integrity sha512-TEM2iMIEQdJ2yjPJoSIsldnleVaAk1oW3DBVUykyOLsEsFmEc9kn+SFFPz+gl54KQNxlDnAwCXosOS9Okx2xAg== + +buffer-alloc@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/buffer-alloc/-/buffer-alloc-1.2.0.tgz#890dd90d923a873e08e10e5fd51a57e5b7cce0ec" + integrity sha512-CFsHQgjtW1UChdXgbyJGtnm+O/uLQeZdtbDo8mfUgYXCHSM1wgrVxXm6bSyrUuErEb+4sYVGCzASBRot7zyrow== + dependencies: + buffer-alloc-unsafe "^1.1.0" + buffer-fill "^1.0.0" + buffer-crc32@~0.2.3: version "0.2.13" resolved "https://registry.yarnpkg.com/buffer-crc32/-/buffer-crc32-0.2.13.tgz#0d333e3f00eac50aa1454abd30ef8c2a5d9a7242" integrity sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ== +buffer-fill@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/buffer-fill/-/buffer-fill-1.0.0.tgz#f8f78b76789888ef39f205cd637f68e702122b2c" + integrity sha512-T7zexNBwiiaCOGDg9xNX9PBmjrubblRkENuptryuI64URkXDFum9il/JGL8Lm8wYfAXpredVXXZz7eMHilimiQ== + buffer-from@^1.0.0: version "1.1.2" resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.2.tgz#2b146a6fd72e80b4f55d255f35ed59a3a9a41bd5" @@ -3206,6 +3299,11 @@ camelcase@^3.0.0: resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-3.0.0.tgz#32fc4b9fcdaf845fcdf7e73bb97cac2261f0ab0a" integrity sha1-MvxLn82vhF/N9+c7uXysImHwqwo= +camelcase@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-4.1.0.tgz#d545635be1e33c542649c69173e5de6acfae34dd" + integrity sha512-FxAv7HpHrXbh3aPo4o2qxHay2lkLY3x5Mw3KeE4KQE8ysVfziWeRZDwcjauvwBSGEC/nXUPzZy8zeh4HokqOnw== + camelcase@^5.0.0: version "5.3.1" resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-5.3.1.tgz#e3c9b31569e106811df242f715725a1f4c494320" @@ -3362,7 +3460,7 @@ chokidar@3.5.3, chokidar@^3.4.0, chokidar@^3.5.2: optionalDependencies: fsevents "~2.3.2" -chownr@^1.1.1, chownr@^1.1.4: +chownr@^1.0.1, chownr@^1.1.1, chownr@^1.1.4: version "1.1.4" resolved "https://registry.yarnpkg.com/chownr/-/chownr-1.1.4.tgz#6fc9d7b42d32a583596337666e7d08084da2cc6b" integrity sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg== @@ -3453,6 +3551,15 @@ cliui@^3.2.0: strip-ansi "^3.0.1" wrap-ansi "^2.0.0" +cliui@^4.0.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/cliui/-/cliui-4.1.0.tgz#348422dbe82d800b3022eef4f6ac10bf2e4d1b49" + integrity sha512-4FG+RSG9DL7uEwRUZXZn3SS34DiDPfzP0VOiEwtUWlE+AR2EIg+hSyvrIgUUfhdgR/UkAeW2QHgeP+hWrXs7jQ== + dependencies: + string-width "^2.1.1" + strip-ansi "^4.0.0" + wrap-ansi "^2.0.0" + cliui@^5.0.0: version "5.0.0" resolved "https://registry.yarnpkg.com/cliui/-/cliui-5.0.0.tgz#deefcfdb2e800784aa34f46fa08e06851c7bbbc5" @@ -3576,11 +3683,16 @@ commander@3.0.2: resolved "https://registry.yarnpkg.com/commander/-/commander-3.0.2.tgz#6837c3fb677ad9933d1cfba42dd14d5117d6b39e" integrity sha512-Gar0ASD4BDyKC4hl4DwHqDrmvjoxWKZigVnAbn5H1owvm4CxCPdb0HQDehwNYMJpla5+M2tPmPARzhtYuwpHow== -commander@^2.12.1: +commander@^2.12.1, commander@^2.19.0: version "2.20.3" resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.3.tgz#fd485e84c03eb4881c20722ba48035e8531aeb33" integrity sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ== +commander@^8.1.0: + version "8.3.0" + resolved "https://registry.yarnpkg.com/commander/-/commander-8.3.0.tgz#4837ea1b2da67b9c616a67afbb0fafee567bca66" + integrity sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww== + commander@^9.2.0, commander@^9.4.0: version "9.4.0" resolved "https://registry.yarnpkg.com/commander/-/commander-9.4.0.tgz#bc4a40918fefe52e22450c111ecd6b7acce6f11c" @@ -3596,7 +3708,7 @@ concat-map@0.0.1: resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" integrity sha1-2Klr13/Wjfd5OnMDajug1UBdR3s= -concat-stream@^1.5.1, concat-stream@^1.6.0, concat-stream@^1.6.2: +concat-stream@^1.5.1, concat-stream@^1.6.0, concat-stream@^1.6.2, concat-stream@~1.6.2: version "1.6.2" resolved "https://registry.yarnpkg.com/concat-stream/-/concat-stream-1.6.2.tgz#904bdf194cd3122fc675c77fc4ac3d4ff0fd1a34" integrity sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw== @@ -3772,7 +3884,7 @@ cross-fetch@^2.1.0, cross-fetch@^2.1.1: node-fetch "^2.6.7" whatwg-fetch "^2.0.4" -cross-spawn@^6.0.5: +cross-spawn@^6.0.0, cross-spawn@^6.0.5: version "6.0.5" resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-6.0.5.tgz#4a5ec7c64dfae22c3a14124dbacdee846d80cbc4" integrity sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ== @@ -3871,7 +3983,14 @@ debug@4, debug@4.3.4, debug@^4.1.1, debug@^4.3.1, debug@^4.3.2, debug@^4.3.3, de dependencies: ms "2.1.2" -debug@^3.1.0: +debug@=3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/debug/-/debug-3.1.0.tgz#5bb5a0672628b64149566ba16819e61518c67261" + integrity sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g== + dependencies: + ms "2.0.0" + +debug@^3.1.0, debug@^3.2.6: version "3.2.7" resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.7.tgz#72580b7e9145fb39b6676f9c5e5fb100b934179a" integrity sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ== @@ -3895,6 +4014,11 @@ decamelize@^4.0.0: resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-4.0.0.tgz#aa472d7bf660eb15f3494efd531cab7f2a709837" integrity sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ== +decimal.js-light@^2.5.0: + version "2.5.1" + resolved "https://registry.yarnpkg.com/decimal.js-light/-/decimal.js-light-2.5.1.tgz#134fd32508f19e208f4fb2f8dac0d2626a867934" + integrity sha512-qIMFpTMZmny+MMIitAB6D7iVPEorVw6YQRWkvarTkT4tBeSLLiHzcwj6q0MmYSFCiVpiqPJTJEYIrpcPzVEIvg== + decode-uri-component@^0.2.0: version "0.2.2" resolved "https://registry.yarnpkg.com/decode-uri-component/-/decode-uri-component-0.2.2.tgz#e69dbe25d37941171dd540e024c444cd5188e1e9" @@ -4089,6 +4213,30 @@ dir-glob@^3.0.1: dependencies: path-type "^4.0.0" +discontinuous-range@1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/discontinuous-range/-/discontinuous-range-1.0.0.tgz#e38331f0844bba49b9a9cb71c771585aab1bc65a" + integrity sha512-c68LpLbO+7kP/b1Hr1qs8/BJ09F5khZGTxqxZuhzxpmwJKOgRFHJWIb9/KmqnqHhLdO55aOxFH/EGBvUQbL/RQ== + +docker-modem@^1.0.8: + version "1.0.9" + resolved "https://registry.yarnpkg.com/docker-modem/-/docker-modem-1.0.9.tgz#a1f13e50e6afb6cf3431b2d5e7aac589db6aaba8" + integrity sha512-lVjqCSCIAUDZPAZIeyM125HXfNvOmYYInciphNrLrylUtKyW66meAjSPXWchKVzoIYZx69TPnAepVSSkeawoIw== + dependencies: + JSONStream "1.3.2" + debug "^3.2.6" + readable-stream "~1.0.26-4" + split-ca "^1.0.0" + +dockerode@^2.5.8: + version "2.5.8" + resolved "https://registry.yarnpkg.com/dockerode/-/dockerode-2.5.8.tgz#1b661e36e1e4f860e25f56e0deabe9f87f1d0acc" + integrity sha512-+7iOUYBeDTScmOmQqpUYQaE7F4vvIt6+gIZNHWhqAQEI887tiPFB9OvXI/HzQYqfUNvukMK+9myLW63oTJPZpw== + dependencies: + concat-stream "~1.6.2" + docker-modem "^1.0.8" + tar-fs "~1.16.3" + doctrine@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-3.0.0.tgz#addebead72a6574db783639dc87a121773973961" @@ -4222,7 +4370,7 @@ encoding@^0.1.11: dependencies: iconv-lite "^0.6.2" -end-of-stream@^1.1.0, end-of-stream@^1.4.1: +end-of-stream@^1.0.0, end-of-stream@^1.1.0, end-of-stream@^1.4.1: version "1.4.4" resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.4.tgz#5ae64a5f45057baf3626ec14da0ca5e4b2431eb0" integrity sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q== @@ -5001,7 +5149,24 @@ ethereumjs-wallet@0.6.5: utf8 "^3.0.0" uuid "^3.3.2" -ethers@^4.0.40: +ethers-contracts@*: + version "2.2.1" + resolved "https://registry.yarnpkg.com/ethers-contracts/-/ethers-contracts-2.2.1.tgz#e2bf5dd5e157313ba454b50c646c8472fcd0a8b3" + integrity sha512-3fT2gyhoDhqp/bgaBOenmyu74dDGGO9adkBaOtEuNmFq0Yf4nwynYWJv++rDxe6Z5Dl5cBF304GhnJUVFVlfCA== + dependencies: + ethers-utils "^2.1.0" + +ethers-utils@^2.1.0: + version "2.1.11" + resolved "https://registry.yarnpkg.com/ethers-utils/-/ethers-utils-2.1.11.tgz#b27535ca3226118be300211c39c896b1e5e21641" + integrity sha512-BfkGStBmmLjhTldmp5lifiwUeDjx/yowoWfmUnnvPNsix5PFE8IXQdY5VT/Qo1SXMgxzCe8m0Z8ysUw6Q9OmAw== + dependencies: + bn.js "^4.4.0" + hash.js "^1.0.0" + js-sha3 "0.5.7" + xmlhttprequest "1.8.0" + +ethers@^4.0.39, ethers@^4.0.40: version "4.0.49" resolved "https://registry.yarnpkg.com/ethers/-/ethers-4.0.49.tgz#0eb0e9161a0c8b4761be547396bbe2fb121a8894" integrity sha512-kPltTvWiyu+OktYy1IStSO16i2e7cS9D9OxZ81q2UUaiNPVrm/RTcbxamCXF9VUSKzJIdJV68EAIhTEVBalRWg== @@ -5052,7 +5217,7 @@ ethers@^5.0.1, ethers@^5.0.2: "@ethersproject/web" "5.6.0" "@ethersproject/wordlists" "5.6.0" -ethers@^5.1.0: +ethers@^5.1.0, ethers@^5.5.3, ethers@^5.7.1: version "5.7.2" resolved "https://registry.yarnpkg.com/ethers/-/ethers-5.7.2.tgz#3a7deeabbb8c030d4126b24f84e525466145872e" integrity sha512-wswUsmWo1aOK8rR7DIKiWSw9DbLWe6x98Jrn8wcTflTVvaXhAMaB5zGAXy0GYQEQp9iO1iSHWVyARQm11zUtyg== @@ -5124,42 +5289,6 @@ ethers@^5.5.2: "@ethersproject/web" "5.6.0" "@ethersproject/wordlists" "5.6.0" -ethers@^5.5.3, ethers@^5.7.1: - version "5.7.2" - resolved "https://registry.yarnpkg.com/ethers/-/ethers-5.7.2.tgz#3a7deeabbb8c030d4126b24f84e525466145872e" - integrity sha512-wswUsmWo1aOK8rR7DIKiWSw9DbLWe6x98Jrn8wcTflTVvaXhAMaB5zGAXy0GYQEQp9iO1iSHWVyARQm11zUtyg== - dependencies: - "@ethersproject/abi" "5.7.0" - "@ethersproject/abstract-provider" "5.7.0" - "@ethersproject/abstract-signer" "5.7.0" - "@ethersproject/address" "5.7.0" - "@ethersproject/base64" "5.7.0" - "@ethersproject/basex" "5.7.0" - "@ethersproject/bignumber" "5.7.0" - "@ethersproject/bytes" "5.7.0" - "@ethersproject/constants" "5.7.0" - "@ethersproject/contracts" "5.7.0" - "@ethersproject/hash" "5.7.0" - "@ethersproject/hdnode" "5.7.0" - "@ethersproject/json-wallets" "5.7.0" - "@ethersproject/keccak256" "5.7.0" - "@ethersproject/logger" "5.7.0" - "@ethersproject/networks" "5.7.1" - "@ethersproject/pbkdf2" "5.7.0" - "@ethersproject/properties" "5.7.0" - "@ethersproject/providers" "5.7.2" - "@ethersproject/random" "5.7.0" - "@ethersproject/rlp" "5.7.0" - "@ethersproject/sha2" "5.7.0" - "@ethersproject/signing-key" "5.7.0" - "@ethersproject/solidity" "5.7.0" - "@ethersproject/strings" "5.7.0" - "@ethersproject/transactions" "5.7.0" - "@ethersproject/units" "5.7.0" - "@ethersproject/wallet" "5.7.0" - "@ethersproject/web" "5.7.1" - "@ethersproject/wordlists" "5.7.0" - ethers@^5.6.9: version "5.7.0" resolved "https://registry.yarnpkg.com/ethers/-/ethers-5.7.0.tgz#0055da174b9e076b242b8282638bc94e04b39835" @@ -5196,6 +5325,62 @@ ethers@^5.6.9: "@ethersproject/web" "5.7.0" "@ethersproject/wordlists" "5.7.0" +ethjs-extras@0.0.7: + version "0.0.7" + resolved "https://registry.yarnpkg.com/ethjs-extras/-/ethjs-extras-0.0.7.tgz#9fb5f7f55952456b6a0836cdeda8bd376981deee" + integrity sha512-1Ml8B6AUVsY+6o1GI861zRiP1KuHnYVu7T7cRVpAAqEqukQsTuTXBbOX1VYPIe5e68+aoqn8fMTGG4FnrYZA+Q== + dependencies: + ethers-contracts "*" + ethjs-provider-http "^0.1.6" + ethjs-provider-signer "^0.1.4" + ethjs-rpc "^0.1.8" + js-sha3 "^0.7.0" + solidity-to-abi "^1.0.4" + +ethjs-format@0.1.8: + version "0.1.8" + resolved "https://registry.yarnpkg.com/ethjs-format/-/ethjs-format-0.1.8.tgz#925ecdd965ea72a2a2daf2a122e5bf80b5ad522a" + integrity sha512-G9S+H5+XaHYLA54YVB2RxaBBVyFHtMTlnRTsIUp2+rUbrQ0kFRP6hDUz+OzRQY8tYz/A55Klgg9rG49by5rSNw== + dependencies: + bn.js "4.11.6" + ethjs-schema "0.1.4" + ethjs-util "0.1.3" + is-hex-prefixed "1.0.0" + number-to-bn "1.7.0" + strip-hex-prefix "1.0.0" + +ethjs-provider-http@0.1.6, ethjs-provider-http@^0.1.6: + version "0.1.6" + resolved "https://registry.yarnpkg.com/ethjs-provider-http/-/ethjs-provider-http-0.1.6.tgz#1ec5d9b4be257ef1d56a500b22a741985e889420" + integrity sha512-y054N5xyyx43KTQjgdkAEj2uEa/flwpENU5ldx/rmA0Q2yy0vyB2lsOIn/7V0uADMc4iRSHZfnFc9b9YS5Qkdw== + dependencies: + xhr2 "0.1.3" + +ethjs-provider-signer@^0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/ethjs-provider-signer/-/ethjs-provider-signer-0.1.4.tgz#6bd5cb38a8d5b0ddf46ac1e23a60eea1716171ae" + integrity sha512-ExC8h7HnXwiHBEcMtmtpKr7OT/88+GW3Dphw9D36OM3petIr3dpPDCDB1CkDBcy5s4E7Z/irHvDydAA7/MJnug== + dependencies: + ethjs-provider-http "0.1.6" + ethjs-rpc "0.1.2" + +ethjs-rpc@0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/ethjs-rpc/-/ethjs-rpc-0.1.2.tgz#39a3456b51c59aeeafb5ba556589a59f2da88d26" + integrity sha512-vZ0VlCaafVn1qY6eWB7O/rOLG75wbHLpvjCYnH/OuGCVk0kytdbGi6nm3UyocHTaJLj5g0dM2fLAdwf18G6DYQ== + dependencies: + ethjs-format "0.1.8" + +ethjs-rpc@^0.1.8: + version "0.1.9" + resolved "https://registry.yarnpkg.com/ethjs-rpc/-/ethjs-rpc-0.1.9.tgz#389dcd61be52e72bc47111a75805f8e45882faea" + integrity sha512-KJqT7cgTeCJQ2RY1AlVmTZVnKIUXMPg+niPN5VJKwRSzpjgfr3LTVHlGbkRCqZtOMDi0ogB2vHZaRQiZBXZTUg== + +ethjs-schema@0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/ethjs-schema/-/ethjs-schema-0.1.4.tgz#0323a16333b1ace9a8f1d696a6ee63448fdd455f" + integrity sha512-fB08XJP+G00Qtv37Y8WCHn4LtQeCdmG7icFAl63L0nzT05MvCfey1E1SwjCOmDG6PGDZ9J2e3u4a+79Nb4VOdg== + ethjs-unit@0.1.6: version "0.1.6" resolved "https://registry.yarnpkg.com/ethjs-unit/-/ethjs-unit-0.1.6.tgz#c665921e476e87bce2a9d588a6fe0405b2c41699" @@ -5204,6 +5389,14 @@ ethjs-unit@0.1.6: bn.js "4.11.6" number-to-bn "1.7.0" +ethjs-util@0.1.3: + version "0.1.3" + resolved "https://registry.yarnpkg.com/ethjs-util/-/ethjs-util-0.1.3.tgz#dfd5ea4a400dc5e421a889caf47e081ada78bb55" + integrity sha512-QqpX2dsEG2geSMG9dTMJVhfP1kGRdGMNjiHPiTjkju+X5cB0PQIwUzRr5k21pFkgF5zuLccqe83p7Gh5fFM5tQ== + dependencies: + is-hex-prefixed "1.0.0" + strip-hex-prefix "1.0.0" + ethjs-util@0.1.6, ethjs-util@^0.1.3, ethjs-util@^0.1.6: version "0.1.6" resolved "https://registry.yarnpkg.com/ethjs-util/-/ethjs-util-0.1.6.tgz#f308b62f185f9fe6237132fb2a9818866a5cd536" @@ -5230,6 +5423,19 @@ evp_bytestokey@^1.0.0, evp_bytestokey@^1.0.3: md5.js "^1.3.4" safe-buffer "^5.1.1" +execa@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/execa/-/execa-1.0.0.tgz#c6236a5bb4df6d6f15e88e7f017798216749ddd8" + integrity sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA== + dependencies: + cross-spawn "^6.0.0" + get-stream "^4.0.0" + is-stream "^1.1.0" + npm-run-path "^2.0.0" + p-finally "^1.0.0" + signal-exit "^3.0.0" + strip-eof "^1.0.0" + expand-brackets@^2.1.4: version "2.1.4" resolved "https://registry.yarnpkg.com/expand-brackets/-/expand-brackets-2.1.4.tgz#b77735e315ce30f6b6eff0f83b04151a22449622" @@ -5441,6 +5647,11 @@ file-entry-cache@^6.0.1: dependencies: flat-cache "^3.0.4" +file-uri-to-path@1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz#553a7b8446ff6f684359c445f1e37a05dacc33dd" + integrity sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw== + file-url@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/file-url/-/file-url-3.0.0.tgz#247a586a746ce9f7a8ed05560290968afc262a77" @@ -5595,6 +5806,13 @@ fmix@^0.1.0: dependencies: imul "^1.0.0" +follow-redirects@1.5.10: + version "1.5.10" + resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.5.10.tgz#7b7a9f9aea2fdff36786a94ff643ed07f4ff5e2a" + integrity sha512-0V5l4Cizzvqt5D44aTXbFZz+FtyXV1vrDN6qrelxtfYQKW0KO0W2T/hkE8xvGa/540LkZlkaUjO4ailYTFtHVQ== + dependencies: + debug "=3.1.0" + follow-redirects@^1.12.1, follow-redirects@^1.14.0: version "1.14.9" resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.14.9.tgz#dd4ea157de7bfaf9ea9b3fbd85aa16951f78d8d7" @@ -5710,6 +5928,15 @@ fs-extra@^10.0.0: jsonfile "^6.0.1" universalify "^2.0.0" +fs-extra@^10.1.0: + version "10.1.0" + resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-10.1.0.tgz#02873cfbc4084dde127eaa5f9905eef2325d1abf" + integrity sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ== + dependencies: + graceful-fs "^4.2.0" + jsonfile "^6.0.1" + universalify "^2.0.0" + fs-extra@^4.0.2, fs-extra@^4.0.3: version "4.0.3" resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-4.0.3.tgz#0d852122e5bc5beb453fb028e9c0c9bf36340c94" @@ -5860,7 +6087,7 @@ get-stream@^3.0.0: resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-3.0.0.tgz#8e943d1358dc37555054ecbe2edb05aa174ede14" integrity sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ= -get-stream@^4.1.0: +get-stream@^4.0.0, get-stream@^4.1.0: version "4.1.0" resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-4.1.0.tgz#c1b255575f3dc21d59bfc79cd3d2b46b1c3a54b5" integrity sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w== @@ -5986,6 +6213,17 @@ glob@^8.0.1: minimatch "^5.0.1" once "^1.3.0" +glob@^8.0.3: + version "8.1.0" + resolved "https://registry.yarnpkg.com/glob/-/glob-8.1.0.tgz#d388f656593ef708ee3e34640fdfb99a9fd1c33e" + integrity sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ== + dependencies: + fs.realpath "^1.0.0" + inflight "^1.0.4" + inherits "2" + minimatch "^5.0.1" + once "^1.3.0" + global-modules@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/global-modules/-/global-modules-2.0.0.tgz#997605ad2345f27f51539bea26574421215c7780" @@ -6474,6 +6712,11 @@ https-proxy-agent@^5.0.0: agent-base "6" debug "4" +hyperapp@1.2.9: + version "1.2.9" + resolved "https://registry.yarnpkg.com/hyperapp/-/hyperapp-1.2.9.tgz#a17ec09634968a5fa5f6b7d649e7a03d9680fcf2" + integrity sha512-bIzi12am7pyQ5nc2qnQpN6GWonjdJp+AghY7j9H9L0vccM1OQ3Cqn13cZlmS9KYm91Nf9fwF4KjvbQekFBxHVw== + iconv-lite@0.4.24, iconv-lite@^0.4.24: version "0.4.24" resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" @@ -6619,6 +6862,11 @@ invert-kv@^1.0.0: resolved "https://registry.yarnpkg.com/invert-kv/-/invert-kv-1.0.0.tgz#104a8e4aaca6d3d8cd157a8ef8bfab2d7a3ffdb6" integrity sha1-EEqOSqym09jNFXqO+L+rLXo//bY= +invert-kv@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/invert-kv/-/invert-kv-2.0.0.tgz#7393f5afa59ec9ff5f67a27620d11c226e3eec02" + integrity sha512-wPVv/y/QQ/Uiirj/vh3oP+1Ww+AWehmi1g5fFWGPF6IpCBCDVrhgHRMvrLfdYcwDh3QJbGXDW4JAuzxElLSqKA== + io-ts@1.10.4: version "1.10.4" resolved "https://registry.yarnpkg.com/io-ts/-/io-ts-1.10.4.tgz#cd5401b138de88e4f920adbcb7026e2d1967e6e2" @@ -6685,7 +6933,7 @@ is-buffer@^1.1.5: resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.6.tgz#efaa2ea9daa0d7ab2ea13a97b2b8ad51fefbe8be" integrity sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w== -is-buffer@^2.0.5, is-buffer@~2.0.3: +is-buffer@^2.0.2, is-buffer@^2.0.5, is-buffer@~2.0.3: version "2.0.5" resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-2.0.5.tgz#ebc252e400d22ff8d77fa09888821a24a658c191" integrity sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ== @@ -6892,10 +7140,10 @@ is-shared-array-buffer@^1.0.1: dependencies: call-bind "^1.0.2" -is-stream@^1.0.0, is-stream@^1.0.1: +is-stream@^1.0.0, is-stream@^1.0.1, is-stream@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-1.1.0.tgz#12d4a3dd4e68e0b79ceb8dbc84173ae80d91ca44" - integrity sha1-EtSj3U5o4Lec6428hBc66A2RykQ= + integrity sha512-uQPm8kcs47jx38atAcWTVxyltQYoPT68y9aWYdV6yWXSyW8mzSat0TL6CiWdZeCdF3KrAvpVtnHbTv4RN+rqdQ== is-string@^1.0.5, is-string@^1.0.7: version "1.0.7" @@ -7010,6 +7258,11 @@ js-sha3@0.8.0, js-sha3@^0.8.0: resolved "https://registry.yarnpkg.com/js-sha3/-/js-sha3-0.8.0.tgz#b9b7a5da73afad7dedd0f8c463954cbde6818840" integrity sha512-gF1cRrHhIzNfToc802P800N8PpXS+evLLXfsVpowqmAFR9uwbi89WvXg2QspOmXL8QL86J4T1EpFu+yUkwJY3Q== +js-sha3@^0.7.0: + version "0.7.0" + resolved "https://registry.yarnpkg.com/js-sha3/-/js-sha3-0.7.0.tgz#0a5c57b36f79882573b2d84051f8bb85dd1bd63a" + integrity sha512-Wpks3yBDm0UcL5qlVhwW9Jr9n9i4FfeWBFOOXP5puDS/SiudJGhw7DPyBqn3487qD4F0lsC0q3zxink37f7zeA== + "js-tokens@^3.0.0 || ^4.0.0", js-tokens@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" @@ -7157,6 +7410,11 @@ jsonify@~0.0.0: resolved "https://registry.yarnpkg.com/jsonify/-/jsonify-0.0.0.tgz#2c74b6ee41d93ca51b7b5aaee8f503631d252a73" integrity sha1-LHS27kHZPKUbe1qu6PUDYx0lKnM= +jsonparse@^1.2.0: + version "1.3.1" + resolved "https://registry.yarnpkg.com/jsonparse/-/jsonparse-1.3.1.tgz#3f4dae4a91fac315f71062f8521cc239f1366280" + integrity sha512-POQXvpdL69+CluYsillJ7SUhKvytYjW9vG/GKpnf+xP8UWgYEM/RaMzHHofbALDiKbbP1W8UEYmgGl39WkPZsg== + jsonschema@^1.2.4: version "1.4.0" resolved "https://registry.yarnpkg.com/jsonschema/-/jsonschema-1.4.0.tgz#1afa34c4bc22190d8e42271ec17ac8b3404f87b2" @@ -7180,6 +7438,16 @@ keccak@3.0.1: node-addon-api "^2.0.0" node-gyp-build "^4.2.0" +keccak@^1.0.2: + version "1.4.0" + resolved "https://registry.yarnpkg.com/keccak/-/keccak-1.4.0.tgz#572f8a6dbee8e7b3aa421550f9e6408ca2186f80" + integrity sha512-eZVaCpblK5formjPjeTBik7TAg+pqnDrMHIffSvi9Lh7PQgM1+hSzakUeZFCk9DVVG0dacZJuaz2ntwlzZUIBw== + dependencies: + bindings "^1.2.1" + inherits "^2.0.3" + nan "^2.2.1" + safe-buffer "^5.1.0" + keccak@^3.0.0: version "3.0.2" resolved "https://registry.yarnpkg.com/keccak/-/keccak-3.0.2.tgz#4c2c6e8c54e04f2670ee49fa734eb9da152206e0" @@ -7255,6 +7523,13 @@ lcid@^1.0.0: dependencies: invert-kv "^1.0.0" +lcid@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/lcid/-/lcid-2.0.0.tgz#6ef5d2df60e52f82eb228a4c373e8d1f397253cf" + integrity sha512-avPEb8P8EGnwXKClwsNUgryVjllcRqtMYa49NTsbQagYuT1DcXnl1915oxWjoyGrXR6zH/Y0Zc96xWsPcoDKeA== + dependencies: + invert-kv "^2.0.0" + level-codec@^9.0.0: version "9.0.2" resolved "https://registry.yarnpkg.com/level-codec/-/level-codec-9.0.2.tgz#fd60df8c64786a80d44e63423096ffead63d8cbc" @@ -7603,6 +7878,13 @@ make-error@^1.1.1: resolved "https://registry.yarnpkg.com/make-error/-/make-error-1.3.6.tgz#2eb2e37ea9b67c4891f684a1394799af484cf7a2" integrity sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw== +map-age-cleaner@^0.1.1: + version "0.1.3" + resolved "https://registry.yarnpkg.com/map-age-cleaner/-/map-age-cleaner-0.1.3.tgz#7d583a7306434c055fe474b0f45078e6e1b4b92a" + integrity sha512-bJzx6nMoP6PDLPBFmg7+xRKeFZvFboMrGlxmNj9ClvX53KrmvM5bXFXEWjbz4cz1AFn+jWJ9z/DJSz7hrs0w3w== + dependencies: + p-defer "^1.0.0" + map-cache@^0.2.2: version "0.2.2" resolved "https://registry.yarnpkg.com/map-cache/-/map-cache-0.2.2.tgz#c32abd0bd6525d9b051645bb4f26ac5dc98a0dbf" @@ -7644,6 +7926,15 @@ media-typer@0.3.0: resolved "https://registry.yarnpkg.com/media-typer/-/media-typer-0.3.0.tgz#8710d7af0aa626f8fffa1ce00168545263255748" integrity sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g= +mem@^4.0.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/mem/-/mem-4.3.0.tgz#461af497bc4ae09608cdb2e60eefb69bff744178" + integrity sha512-qX2bG48pTqYRVmDB37rn/6PT7LcR8T7oAX3bf99u1Tt1nzxYfxkgqDwUwolPlXweM0XzBOBFzSx4kfp7KP1s/w== + dependencies: + map-age-cleaner "^0.1.1" + mimic-fn "^2.0.0" + p-is-promise "^2.0.0" + memdown@^1.0.0: version "1.4.1" resolved "https://registry.yarnpkg.com/memdown/-/memdown-1.4.1.tgz#b4e4e192174664ffbae41361aa500f3119efe215" @@ -7794,6 +8085,11 @@ mimic-fn@^1.0.0: resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-1.2.0.tgz#820c86a39334640e99516928bd03fca88057d022" integrity sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ== +mimic-fn@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b" + integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg== + mimic-response@^1.0.0, mimic-response@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/mimic-response/-/mimic-response-1.0.1.tgz#4923538878eef42063cb8a3e3b0798781487ab1b" @@ -8014,6 +8310,11 @@ module-error@^1.0.1, module-error@^1.0.2: resolved "https://registry.yarnpkg.com/module-error/-/module-error-1.0.2.tgz#8d1a48897ca883f47a45816d4fb3e3c6ba404d86" integrity sha512-0yuvsqSCv8LbaOKhnsQ/T5JhyFlCYLPXK3U2sgV10zoKQwzs/MyfuQUOZQ1V/6OCOJsK/TRgNVrPuPDqtdMFtA== +moo@^0.5.0, moo@^0.5.1: + version "0.5.2" + resolved "https://registry.yarnpkg.com/moo/-/moo-0.5.2.tgz#f9fe82473bc7c184b0d32e2215d3f6e67278733c" + integrity sha512-iSAJLHYKnX41mKcJKjqvnAN9sf0LMDTXDEvFv+ffuRR9a1MIuXLjMNL6EsnDHSkKLTWNqQQ5uo61P4EbU4NU+Q== + ms@2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" @@ -8088,6 +8389,20 @@ mute-stream@0.0.7: resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.7.tgz#3075ce93bc21b8fab43e1bc4da7e8115ed1e7bab" integrity sha1-MHXOk7whuPq0PhvE2n6BFe0ee6s= +mz@^2.7.0: + version "2.7.0" + resolved "https://registry.yarnpkg.com/mz/-/mz-2.7.0.tgz#95008057a56cafadc2bc63dde7f9ff6955948e32" + integrity sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q== + dependencies: + any-promise "^1.0.0" + object-assign "^4.0.1" + thenify-all "^1.0.0" + +nan@^2.2.1: + version "2.18.0" + resolved "https://registry.yarnpkg.com/nan/-/nan-2.18.0.tgz#26a6faae7ffbeb293a39660e88a76b82e30b7554" + integrity sha512-W7tfG7vMOGtD30sHoZSSc/JVYiyDPEyQVso/Zz+/uQd0B0L46gtC+pHha5FFMRpil6fm/AoEcRWyOVi4+E/f8w== + nano-json-stream-parser@^0.1.2: version "0.1.2" resolved "https://registry.yarnpkg.com/nano-json-stream-parser/-/nano-json-stream-parser-0.1.2.tgz#0cc8f6d0e2b622b479c40d499c46d64b755c6f5f" @@ -8125,6 +8440,16 @@ natural-compare@^1.4.0: resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" integrity sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc= +nearley@^2.19.0: + version "2.20.1" + resolved "https://registry.yarnpkg.com/nearley/-/nearley-2.20.1.tgz#246cd33eff0d012faf197ff6774d7ac78acdd474" + integrity sha512-+Mc8UaAebFzgV+KpI5n7DasuuQCHA89dmwm7JXw3TV43ukfNQ9DnBH3Mdb2g/I4Fdxc26pwimBWvjIw0UAILSQ== + dependencies: + commander "^2.19.0" + moo "^0.5.0" + railroad-diagrams "^1.0.0" + randexp "0.4.6" + negotiator@0.6.3: version "0.6.3" resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.3.tgz#58e323a72fedc0d6f9cd4d31fe49f51479590ccd" @@ -8172,6 +8497,13 @@ node-fetch@2.6.7, node-fetch@^2.6.1, node-fetch@^2.6.7: dependencies: whatwg-url "^5.0.0" +node-fetch@^2.6.0: + version "2.7.0" + resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.7.0.tgz#d0f0fa6e3e2dc1d27efcd8ad99d550bda94d187d" + integrity sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A== + dependencies: + whatwg-url "^5.0.0" + node-fetch@~1.7.1: version "1.7.3" resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-1.7.3.tgz#980f6f72d85211a5347c6b2bc18c5b84c3eb47ef" @@ -8224,6 +8556,13 @@ normalize-url@^4.1.0: resolved "https://registry.yarnpkg.com/normalize-url/-/normalize-url-4.5.1.tgz#0dd90cf1288ee1d1313b87081c9a5932ee48518a" integrity sha512-9UZCFRHQdNrfTpGg8+1INIg93B6zE0aXMVFkw1WFwvO4SlZywU6aLg5Of0Ap/PgcbSw4LNxvMWXMeugwMCX0AA== +npm-run-path@^2.0.0: + version "2.0.2" + resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-2.0.2.tgz#35a9232dfa35d7067b4cb2ddf2357b1871536c5f" + integrity sha512-lJxZYlT4DW/bRUtFh1MQIWqmLwQfAxnqWG4HhEdjMlkrJYnJn0Jrr2u3mgxqaWsdiBc76TYkTG/mhrnYTuzfHw== + dependencies: + path-key "^2.0.0" + nth-check@^2.0.1: version "2.1.1" resolved "https://registry.yarnpkg.com/nth-check/-/nth-check-2.1.1.tgz#c9eab428effce36cd6b92c924bdb000ef1f1ed1d" @@ -8249,10 +8588,10 @@ oauth-sign@~0.9.0: resolved "https://registry.yarnpkg.com/oauth-sign/-/oauth-sign-0.9.0.tgz#47a7b016baa68b5fa0ecf3dee08a85c679ac6455" integrity sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ== -object-assign@^4, object-assign@^4.0.0, object-assign@^4.1.0, object-assign@^4.1.1: +object-assign@^4, object-assign@^4.0.0, object-assign@^4.0.1, object-assign@^4.1.0, object-assign@^4.1.1: version "4.1.1" resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" - integrity sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM= + integrity sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg== object-copy@^0.1.0: version "0.1.0" @@ -8413,6 +8752,15 @@ os-locale@^1.4.0: dependencies: lcid "^1.0.0" +os-locale@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/os-locale/-/os-locale-3.1.0.tgz#a802a6ee17f24c10483ab9935719cef4ed16bf1a" + integrity sha512-Z8l3R4wYWM40/52Z+S265okfFj8Kt2cC2MKY+xNi3kFs+XGI7WXu/I309QQQYbRW4ijiZ+yxs9pqEhJh0DqW3Q== + dependencies: + execa "^1.0.0" + lcid "^2.0.0" + mem "^4.0.0" + os-tmpdir@^1.0.1, os-tmpdir@~1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274" @@ -8428,11 +8776,21 @@ p-cancelable@^1.0.0: resolved "https://registry.yarnpkg.com/p-cancelable/-/p-cancelable-1.1.0.tgz#d078d15a3af409220c886f1d9a0ca2e441ab26cc" integrity sha512-s73XxOZ4zpt1edZYZzvhqFa6uvQc1vwUa0K0BdtIZgQMAJj9IbebH+JkgKZc9h+B05PKHLOTl4ajG1BmNrVZlw== +p-defer@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/p-defer/-/p-defer-1.0.0.tgz#9f6eb182f6c9aa8cd743004a7d4f96b196b0fb0c" + integrity sha512-wB3wfAxZpk2AzOfUMJNL+d36xothRSyj8EXOa4f6GMqYDN9BJaaSISbsk+wS9abmnebVw95C2Kb5t85UmpCxuw== + p-finally@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/p-finally/-/p-finally-1.0.0.tgz#3fbcfb15b899a44123b34b6dcc18b724336a2cae" integrity sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4= +p-is-promise@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/p-is-promise/-/p-is-promise-2.1.0.tgz#918cebaea248a62cf7ffab8e3bca8c5f882fc42e" + integrity sha512-Y3W0wlRPK8ZMRbNq97l4M5otioeA5lm1z7bkNkxCka8HSPjR0xRWmpCmc9utiaLP9Jb1eD8BgeIxTW4AIF45Pg== + p-limit@^1.1.0: version "1.3.0" resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-1.3.0.tgz#b86bd5f0c25690911c7590fcbfc2010d54b3ccb8" @@ -8529,6 +8887,11 @@ parse-cache-control@^1.0.1: resolved "https://registry.yarnpkg.com/parse-cache-control/-/parse-cache-control-1.0.1.tgz#8eeab3e54fa56920fe16ba38f77fa21aacc2d74e" integrity sha1-juqz5U+laSD+Fro493+iGqzC104= +parse-es6-imports@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/parse-es6-imports/-/parse-es6-imports-1.0.1.tgz#fbfea61afcd94435c7f697fc439616c18853771b" + integrity sha512-WheMSatJ69ItiKNFTYYzYIbntAT4DC0+dM+a64bLQi6dxxqI5elYqJK9oCo5AYlDxeTo/bimmdo5kv4IxJy34A== + parse-headers@^2.0.0: version "2.0.5" resolved "https://registry.yarnpkg.com/parse-headers/-/parse-headers-2.0.5.tgz#069793f9356a54008571eb7f9761153e6c770da9" @@ -8643,7 +9006,7 @@ path-is-inside@^1.0.2: resolved "https://registry.yarnpkg.com/path-is-inside/-/path-is-inside-1.0.2.tgz#365417dede44430d1c11af61027facf074bdfc53" integrity sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM= -path-key@^2.0.1: +path-key@^2.0.0, path-key@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/path-key/-/path-key-2.0.1.tgz#411cadb574c5a140d3a4b1910d40d80cc9f40b40" integrity sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A= @@ -8934,6 +9297,14 @@ pull-window@^2.1.4: dependencies: looper "^2.0.0" +pump@^1.0.0: + version "1.0.3" + resolved "https://registry.yarnpkg.com/pump/-/pump-1.0.3.tgz#5dfe8311c33bbf6fc18261f9f34702c47c08a954" + integrity sha512-8k0JupWme55+9tCVE+FS5ULT3K6AbgqrGa58lTT49RpyfwwcGedHqaC5LlQNdEAumn/wFsu6aPwkuPMioy8kqw== + dependencies: + end-of-stream "^1.1.0" + once "^1.3.1" + pump@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/pump/-/pump-3.0.0.tgz#b4a2116815bde2f4e1ea602354e8c75565107a64" @@ -9011,11 +9382,24 @@ queue-microtask@^1.2.2, queue-microtask@^1.2.3: resolved "https://registry.yarnpkg.com/queue-microtask/-/queue-microtask-1.2.3.tgz#4929228bbc724dfac43e0efb058caf7b6cfb6243" integrity sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A== +railroad-diagrams@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/railroad-diagrams/-/railroad-diagrams-1.0.0.tgz#eb7e6267548ddedfb899c1b90e57374559cddb7e" + integrity sha512-cz93DjNeLY0idrCNOH6PviZGRN9GJhsdm9hpn1YCS879fj4W+x5IFJhhkRZcwVgMmFF7R82UA/7Oh+R8lLZg6A== + ramda@^0.27.1: version "0.27.2" resolved "https://registry.yarnpkg.com/ramda/-/ramda-0.27.2.tgz#84463226f7f36dc33592f6f4ed6374c48306c3f1" integrity sha512-SbiLPU40JuJniHexQSAgad32hfwd+DRUdwF2PlVuI5RZD0/vahUco7R8vD86J/tcEKKF9vZrUVwgtmGCqlCKyA== +randexp@0.4.6: + version "0.4.6" + resolved "https://registry.yarnpkg.com/randexp/-/randexp-0.4.6.tgz#e986ad5e5e31dae13ddd6f7b3019aa7c87f60ca3" + integrity sha512-80WNmd9DA0tmZrw9qQa62GPPWfuXJknrmVmLcxvq4uZBdYqb1wYoKTmnlGUchvVWe0XiLupYkBoXVOxz3C8DYQ== + dependencies: + discontinuous-range "1.0.0" + ret "~0.1.10" + randombytes@^2.0.0, randombytes@^2.0.1, randombytes@^2.0.5, randombytes@^2.0.6, randombytes@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/randombytes/-/randombytes-2.1.0.tgz#df6f84372f0270dc65cdf6291349ab7a473d4f2a" @@ -9096,6 +9480,19 @@ readable-stream@^2.0.0, readable-stream@^2.0.5, readable-stream@^2.2.2, readable string_decoder "~1.1.1" util-deprecate "~1.0.1" +readable-stream@^2.3.0, readable-stream@^2.3.5: + version "2.3.8" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.8.tgz#91125e8042bba1b9887f49345f6277027ce8be9b" + integrity sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA== + dependencies: + core-util-is "~1.0.0" + inherits "~2.0.3" + isarray "~1.0.0" + process-nextick-args "~2.0.0" + safe-buffer "~5.1.1" + string_decoder "~1.1.1" + util-deprecate "~1.0.1" + readable-stream@^3.0.6, readable-stream@^3.1.1, readable-stream@^3.4.0, readable-stream@^3.6.0: version "3.6.0" resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.0.tgz#337bbda3adc0706bd3e024426a286d4b4b2c9198" @@ -9105,10 +9502,10 @@ readable-stream@^3.0.6, readable-stream@^3.1.1, readable-stream@^3.4.0, readable string_decoder "^1.1.1" util-deprecate "^1.0.1" -readable-stream@~1.0.15: +readable-stream@~1.0.15, readable-stream@~1.0.26-4: version "1.0.34" resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-1.0.34.tgz#125820e34bc842d2f2aaafafe4c2916ee32c157c" - integrity sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw= + integrity sha512-ok1qVCJuRkNmvebYikljxJA/UEsKwLl2nI1OmaqAu4/UE+h0wKCHok4XkL/gvi39OacXvw59RJUOFUkDib2rHg== dependencies: core-util-is "~1.0.0" inherits "~2.0.1" @@ -9153,6 +9550,11 @@ regenerate@^1.2.1: resolved "https://registry.yarnpkg.com/regenerate/-/regenerate-1.4.2.tgz#b9346d8827e8f5a32f7ba29637d398b69014848a" integrity sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A== +regenerator-runtime@0.13.2: + version "0.13.2" + resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.13.2.tgz#32e59c9a6fb9b1a4aff09b4930ca2d4477343447" + integrity sha512-S/TQAZJO+D3m9xeN1WTI8dLKBBiRgXBlTJvbWjCThHWZj9EvHK70Ff50/tYj2J/fvBY6JtFVwRuazHN2E7M9BA== + regenerator-runtime@^0.11.0: version "0.11.1" resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz#be05ad7f9bf7d22e056f9726cee5017fbf19e2e9" @@ -9397,6 +9799,11 @@ reusify@^1.0.4: resolved "https://registry.yarnpkg.com/reusify/-/reusify-1.0.4.tgz#90da382b1e126efc02146e90845a88db12925d76" integrity sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw== +rfdc@^1.1.4: + version "1.3.0" + resolved "https://registry.yarnpkg.com/rfdc/-/rfdc-1.3.0.tgz#d0b7c441ab2720d05dc4cf26e01c89631d9da08b" + integrity sha512-V2hovdzFbOi77/WajaSMXk2OLm+xNIeQdMMuB7icj7bk6zi2F8GGAxigcnDFpJHbNyNcgyJDiP+8nOrY5cZGrA== + rimraf@2.6.3: version "2.6.3" resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.6.3.tgz#b2d104fe0d8fb27cf9e0a1cda8262dd3833c6cab" @@ -9723,7 +10130,7 @@ side-channel@^1.0.4: get-intrinsic "^1.0.2" object-inspect "^1.9.0" -signal-exit@^3.0.2: +signal-exit@^3.0.0, signal-exit@^3.0.2: version "3.0.7" resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.7.tgz#a9a1767f8af84155114eaabd73f99273c8f59ad9" integrity sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ== @@ -9820,6 +10227,20 @@ sol2uml@2.2.0: js-graph-algorithms "^1.0.18" klaw "^4.0.1" +solc@0.5.7: + version "0.5.7" + resolved "https://registry.yarnpkg.com/solc/-/solc-0.5.7.tgz#d84697ac5cc63d9b2139bfb349cec64b64861cdc" + integrity sha512-DaYFzB3AAYjzPtgUl9LenPY2xjI3wG9k8U8T8YE/sXHVIoCirCY5MB6mhcFPgk/VyUtaWZPUCWiYS1E6RSiiqw== + dependencies: + command-exists "^1.2.8" + fs-extra "^0.30.0" + keccak "^1.0.2" + memorystream "^0.3.1" + require-from-string "^2.0.0" + semver "^5.5.0" + tmp "0.0.33" + yargs "^11.0.0" + solc@0.7.3: version "0.7.3" resolved "https://registry.yarnpkg.com/solc/-/solc-0.7.3.tgz#04646961bd867a744f63d2b4e3c0701ffdc7d78a" @@ -9860,6 +10281,19 @@ solc@^0.6.3: semver "^5.5.0" tmp "0.0.33" +solc@^0.8.17: + version "0.8.21" + resolved "https://registry.yarnpkg.com/solc/-/solc-0.8.21.tgz#c3cd505c360ea2fa0eaa5ab574ef96bffb1a2766" + integrity sha512-N55ogy2dkTRwiONbj4e6wMZqUNaLZkiRcjGyeafjLYzo/tf/IvhHY5P5wpe+H3Fubh9idu071i8eOGO31s1ylg== + dependencies: + command-exists "^1.2.8" + commander "^8.1.0" + follow-redirects "^1.12.1" + js-sha3 "0.8.0" + memorystream "^0.3.1" + semver "^5.5.0" + tmp "0.0.33" + solhint-plugin-prettier@^0.0.5: version "0.0.5" resolved "https://registry.yarnpkg.com/solhint-plugin-prettier/-/solhint-plugin-prettier-0.0.5.tgz#e3b22800ba435cd640a9eca805a7f8bc3e3e6a6b" @@ -9986,6 +10420,26 @@ solidity-coverage@^0.8.4: shelljs "^0.8.3" web3-utils "^1.3.6" +solidity-to-abi@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/solidity-to-abi/-/solidity-to-abi-1.0.4.tgz#b5d1c095e7cb8ee402d5f7a49d2c2ff0e0d63a15" + integrity sha512-2WZpksSLXBAGHBJvv/+M9zI/W4OGxHY3Hmgb75ZqO9hd1rcJMJx/u0zD8DKRWNuzKBw1f5J91VmntewGIrgRjg== + +solpp@^0.11.5: + version "0.11.5" + resolved "https://registry.yarnpkg.com/solpp/-/solpp-0.11.5.tgz#e5f38b5acc952e1cc2e3871d490fdbed910938dd" + integrity sha512-LjzCGMrTDXtera2C4mbQGZSpBznP+o3/82L2CneAAMNbm+t4xPsvfrgJkIaY+IZ5YLrB8IXn7cYthwHMKvAWnQ== + dependencies: + antlr4 "~4.8.0" + axios "^0.21.1" + bn-str-256 "^1.9.1" + commander "^2.19.0" + ethereumjs-util "^6.0.0" + lodash "^4.17.11" + mz "^2.7.0" + resolve "^1.10.0" + semver "^5.6.0" + source-map-resolve@^0.5.0: version "0.5.3" resolved "https://registry.yarnpkg.com/source-map-resolve/-/source-map-resolve-0.5.3.tgz#190866bece7553e1f8f267a2ee82c606b5509a1a" @@ -10068,6 +10522,11 @@ spdx-license-ids@^3.0.0: resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-3.0.11.tgz#50c0d8c40a14ec1bf449bae69a0ea4685a9d9f95" integrity sha512-Ctl2BrFiM0X3MANYgj3CkygxhRmr9mi6xhejbdO960nF6EDJApTYpn0BQnDKlnNBULKiCN1n3w9EBkHK8ZWg+g== +split-ca@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/split-ca/-/split-ca-1.0.1.tgz#6c83aff3692fa61256e0cd197e05e9de157691a6" + integrity sha512-Q5thBSxp5t8WPTTJQS59LrGqOZqOsrhDGDVm8azCqIBjSBd7nd9o2PM+mDulQQkh8h//4U6hFZnc/mul8t5pWQ== + split-string@^3.0.1, split-string@^3.0.2: version "3.1.0" resolved "https://registry.yarnpkg.com/split-string/-/split-string-3.1.0.tgz#7cb09dda3a86585705c64b39a6466038682e8fe2" @@ -10157,7 +10616,7 @@ string-width@^1.0.1: is-fullwidth-code-point "^1.0.0" strip-ansi "^3.0.0" -"string-width@^1.0.2 || 2", string-width@^2.1.0, string-width@^2.1.1: +"string-width@^1.0.2 || 2", string-width@^2.0.0, string-width@^2.1.0, string-width@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/string-width/-/string-width-2.1.1.tgz#ab93f27a8dc13d28cac815c462143a6d9012ae9e" integrity sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw== @@ -10262,6 +10721,11 @@ strip-bom@^2.0.0: dependencies: is-utf8 "^0.2.0" +strip-eof@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/strip-eof/-/strip-eof-1.0.0.tgz#bb43ff5598a6eb05d89b59fcd129c983313606bf" + integrity sha512-7FCwGGmx8mD5xQd3RPUvnSpUXHM3BWuzjtpD4TXsfcZ9EL4azvVVUscFYwD9nx8Kh+uCBC00XBtAykoMHwTh8Q== + strip-hex-prefix@1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/strip-hex-prefix/-/strip-hex-prefix-1.0.0.tgz#0c5f155fef1151373377de9dbb588da05500e36f" @@ -10419,6 +10883,29 @@ tar-fs@2.1.1: pump "^3.0.0" tar-stream "^2.1.4" +tar-fs@~1.16.3: + version "1.16.3" + resolved "https://registry.yarnpkg.com/tar-fs/-/tar-fs-1.16.3.tgz#966a628841da2c4010406a82167cbd5e0c72d509" + integrity sha512-NvCeXpYx7OsmOh8zIOP/ebG55zZmxLE0etfWRbWok+q2Qo8x/vOR/IJT1taADXPe+jsiu9axDb3X4B+iIgNlKw== + dependencies: + chownr "^1.0.1" + mkdirp "^0.5.1" + pump "^1.0.0" + tar-stream "^1.1.2" + +tar-stream@^1.1.2: + version "1.6.2" + resolved "https://registry.yarnpkg.com/tar-stream/-/tar-stream-1.6.2.tgz#8ea55dab37972253d9a9af90fdcd559ae435c555" + integrity sha512-rzS0heiNf8Xn7/mpdSVVSMAWAoy9bfb1WOTYC78Z0UQKeKa/CWS8FOq0lKGNa8DWKAn9gxjCvMLYc5PGXYlK2A== + dependencies: + bl "^1.0.0" + buffer-alloc "^1.2.0" + end-of-stream "^1.0.0" + fs-constants "^1.0.0" + readable-stream "^2.3.0" + to-buffer "^1.1.1" + xtend "^4.0.0" + tar-stream@^2.1.4: version "2.2.0" resolved "https://registry.yarnpkg.com/tar-stream/-/tar-stream-2.2.0.tgz#acad84c284136b060dc3faa64474aa9aebd77287" @@ -10478,6 +10965,20 @@ then-request@^6.0.0: promise "^8.0.0" qs "^6.4.0" +thenify-all@^1.0.0: + version "1.6.0" + resolved "https://registry.yarnpkg.com/thenify-all/-/thenify-all-1.6.0.tgz#1a1918d402d8fc3f98fbf234db0bcc8cc10e9726" + integrity sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA== + dependencies: + thenify ">= 3.1.0 < 4" + +"thenify@>= 3.1.0 < 4": + version "3.3.1" + resolved "https://registry.yarnpkg.com/thenify/-/thenify-3.3.1.tgz#8932e686a4066038a016dd9e2ca46add9838a95f" + integrity sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw== + dependencies: + any-promise "^1.0.0" + through2@^2.0.3: version "2.0.5" resolved "https://registry.yarnpkg.com/through2/-/through2-2.0.5.tgz#01c1e39eb31d07cb7d03a96a70823260b23132cd" @@ -10486,10 +10987,10 @@ through2@^2.0.3: readable-stream "~2.3.6" xtend "~4.0.1" -through@^2.3.6, through@^2.3.8, through@~2.3.4, through@~2.3.8: +"through@>=2.2.7 <3", through@^2.3.6, through@^2.3.8, through@~2.3.4, through@~2.3.8: version "2.3.8" resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" - integrity sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU= + integrity sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg== timed-out@^4.0.0, timed-out@^4.0.1: version "4.0.1" @@ -10517,6 +11018,11 @@ tmp@^0.2.1: dependencies: rimraf "^3.0.0" +to-buffer@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/to-buffer/-/to-buffer-1.1.1.tgz#493bd48f62d7c43fcded313a03dcadb2e1213a80" + integrity sha512-lx9B5iv7msuFYE3dytT+KE5tap+rNYw+K4jVkb9R/asAb+pbBSM17jtunHplhBe6RRJdZx3Pn2Jph24O32mOVg== + to-fast-properties@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-1.0.3.tgz#b83571fa4d8c25b82e231b06e3a3055de4ca1a47" @@ -11553,6 +12059,11 @@ xhr2-cookies@1.1.0: dependencies: cookiejar "^2.1.1" +xhr2@0.1.3: + version "0.1.3" + resolved "https://registry.yarnpkg.com/xhr2/-/xhr2-0.1.3.tgz#cbfc4759a69b4a888e78cf4f20b051038757bd11" + integrity sha512-6RmGK22QwC7yXB1CRwyLWuS2opPcKOlAu0ViAnyZjDlzrEmCKL4kLHkfvB8oMRWeztMsNoDGAjsMZY15w/4tTw== + xhr@^2.0.4, xhr@^2.2.0, xhr@^2.3.3: version "2.6.0" resolved "https://registry.yarnpkg.com/xhr/-/xhr-2.6.0.tgz#b69d4395e792b4173d6b7df077f0fc5e4e2b249d" @@ -11636,6 +12147,13 @@ yargs-parser@^20.2.2: resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-20.2.9.tgz#2eb7dc3b0289718fc295f362753845c41a0c94ee" integrity sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w== +yargs-parser@^9.0.2: + version "9.0.2" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-9.0.2.tgz#9ccf6a43460fe4ed40a9bb68f48d43b8a68cc077" + integrity sha512-CswCfdOgCr4MMsT1GzbEJ7Z2uYudWyrGX8Bgh/0eyCzj/DXWdKq6a/ADufkzI1WAOIW6jYaXJvRyLhDO0kfqBw== + dependencies: + camelcase "^4.1.0" + yargs-unparser@1.6.0: version "1.6.0" resolved "https://registry.yarnpkg.com/yargs-unparser/-/yargs-unparser-1.6.0.tgz#ef25c2c769ff6bd09e4b0f9d7c605fb27846ea9f" @@ -11684,6 +12202,24 @@ yargs@16.2.0: y18n "^5.0.5" yargs-parser "^20.2.2" +yargs@^11.0.0: + version "11.1.1" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-11.1.1.tgz#5052efe3446a4df5ed669c995886cc0f13702766" + integrity sha512-PRU7gJrJaXv3q3yQZ/+/X6KBswZiaQ+zOmdprZcouPYtQgvNU35i+68M4b1ZHLZtYFT5QObFLV+ZkmJYcwKdiw== + dependencies: + cliui "^4.0.0" + decamelize "^1.1.1" + find-up "^2.1.0" + get-caller-file "^1.0.1" + os-locale "^3.1.0" + require-directory "^2.1.1" + require-main-filename "^1.0.1" + set-blocking "^2.0.0" + string-width "^2.0.0" + which-module "^2.0.0" + y18n "^3.2.1" + yargs-parser "^9.0.2" + yargs@^4.7.1: version "4.8.1" resolved "https://registry.yarnpkg.com/yargs/-/yargs-4.8.1.tgz#c0c42924ca4aaa6b0e6da1739dfb216439f9ddc0" @@ -11722,6 +12258,25 @@ yocto-queue@^0.1.0: resolved "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-0.1.0.tgz#0294eb3dee05028d31ee1a5fa2c556a6aaf10a1b" integrity sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q== +yulp@^0.2.3: + version "0.2.3" + resolved "https://registry.yarnpkg.com/yulp/-/yulp-0.2.3.tgz#f8055cb7784b44a955d76c607f712b5911c701f8" + integrity sha512-2XX6g9hTB5OAMhPYw0Qq9inEmssVFSnq6dZxfkDQyipiZO70NgrrCTcQGt2Dw+jhUCwUkjPKTA6DF7RG7RRpKQ== + dependencies: + bn.js "^5.0.0" + ethers "^4.0.39" + moo "^0.5.1" + nearley "^2.19.0" + parse-es6-imports "^1.0.1" + rfdc "^1.1.4" + optionalDependencies: + "@hyperapp/router" "^0.7.1" + axios "^0.18.1" + ethjs-extras "0.0.7" + hyperapp "1.2.9" + regenerator-runtime "0.13.2" + solc "0.5.7" + zksync-web3@^0.14.3: version "0.14.3" resolved "https://registry.yarnpkg.com/zksync-web3/-/zksync-web3-0.14.3.tgz#64ac2a16d597464c3fc4ae07447a8007631c57c9" From 190107b0a53368f1fc869d31608ddbd14b648b23 Mon Sep 17 00:00:00 2001 From: Chris Buckland Date: Wed, 18 Oct 2023 14:02:31 +0200 Subject: [PATCH 135/292] Added ci for 4844 tests --- .github/workflows/contract-tests.yml | 25 +++++++++++++++++++ package.json | 1 + ...44.spec.ts => sequencerInbox.spec.4844.ts} | 0 3 files changed, 26 insertions(+) rename test/contract/{sequencerInbox4844.spec.ts => sequencerInbox.spec.4844.ts} (100%) diff --git a/.github/workflows/contract-tests.yml b/.github/workflows/contract-tests.yml index 0048c6d8..4044e9f5 100644 --- a/.github/workflows/contract-tests.yml +++ b/.github/workflows/contract-tests.yml @@ -83,3 +83,28 @@ jobs: files: ./contracts/coverage.json verbose: false token: ${{ secrets.CODECOV_TOKEN }} + test-4844: + name: 4844 tests + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v3 + with: + submodules: recursive + - uses: OffchainLabs/actions/run-nitro-test-node@deneb-integration + + - name: Setup nodejs + uses: actions/setup-node@v2 + with: + node-version: '18' + cache: 'yarn' + cache-dependency-path: '**/yarn.lock' + + - name: Install dependencies + run: yarn install + + - name: Build + run: yarn build + + - name: Test 4844 + run: yarn test:4844 + diff --git a/package.json b/package.json index e8cfc9a7..a409893e 100644 --- a/package.json +++ b/package.json @@ -26,6 +26,7 @@ "build:0.6": "INTERFACE_TESTER_SOLC_VERSION=0.6.9 yarn run build", "build:0.7": "INTERFACE_TESTER_SOLC_VERSION=0.7.0 yarn run build", "test": "DISABLE_GAS_REPORTER=true hardhat --network hardhat test test/contract/*.spec.ts", + "test:4844": "DISABLE_GAS_REPORTER=true hardhat --network hardhat test test/contract/*.spec.4844.ts", "test:compatibility": "yarn run build:0.6 && yarn run build:0.7", "test:storage": "./test/storage/test.bash", "test:e2e": "hardhat test test/e2e/*.ts", diff --git a/test/contract/sequencerInbox4844.spec.ts b/test/contract/sequencerInbox.spec.4844.ts similarity index 100% rename from test/contract/sequencerInbox4844.spec.ts rename to test/contract/sequencerInbox.spec.4844.ts From 1e22c1cf5c904caaaae630dfd75dcf5a7057c886 Mon Sep 17 00:00:00 2001 From: Chris Buckland Date: Wed, 18 Oct 2023 14:04:50 +0200 Subject: [PATCH 136/292] test yes --- .github/workflows/contract-tests.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/contract-tests.yml b/.github/workflows/contract-tests.yml index 4044e9f5..0660bac4 100644 --- a/.github/workflows/contract-tests.yml +++ b/.github/workflows/contract-tests.yml @@ -90,7 +90,7 @@ jobs: - uses: actions/checkout@v3 with: submodules: recursive - - uses: OffchainLabs/actions/run-nitro-test-node@deneb-integration + - uses: OffchainLabs/actions/run-nitro-test-node@yes - name: Setup nodejs uses: actions/setup-node@v2 From 81308cfbd9eebbf5800b351537023b04cd75df61 Mon Sep 17 00:00:00 2001 From: Chris Buckland Date: Wed, 18 Oct 2023 14:11:27 +0200 Subject: [PATCH 137/292] Updated to use deneb integration branch --- .github/workflows/contract-tests.yml | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/.github/workflows/contract-tests.yml b/.github/workflows/contract-tests.yml index 0660bac4..8b2e7cc5 100644 --- a/.github/workflows/contract-tests.yml +++ b/.github/workflows/contract-tests.yml @@ -90,7 +90,10 @@ jobs: - uses: actions/checkout@v3 with: submodules: recursive - - uses: OffchainLabs/actions/run-nitro-test-node@yes + + - uses: OffchainLabs/actions/run-nitro-test-node@main + with: + nitro-testnode-ref: deneb-integration - name: Setup nodejs uses: actions/setup-node@v2 From 5f4e9121734c9e273fdcdc9b33b50ee75b933cf8 Mon Sep 17 00:00:00 2001 From: Chris Buckland Date: Wed, 18 Oct 2023 14:14:02 +0200 Subject: [PATCH 138/292] Linting updates --- test/contract/sequencerInboxForceInclude.spec.ts | 16 ++++++++++------ test/contract/toolkit4844.ts | 14 +++++++++----- 2 files changed, 19 insertions(+), 11 deletions(-) diff --git a/test/contract/sequencerInboxForceInclude.spec.ts b/test/contract/sequencerInboxForceInclude.spec.ts index 4bc07400..a641ca50 100644 --- a/test/contract/sequencerInboxForceInclude.spec.ts +++ b/test/contract/sequencerInboxForceInclude.spec.ts @@ -276,12 +276,16 @@ describe('SequencerInboxForceInclude', async () => { await bridge.initialize(rollupMock.address) - await sequencerInbox.initialize(bridgeProxy.address, { - delayBlocks: maxDelayBlocks, - delaySeconds: maxDelayTime, - futureBlocks: 10, - futureSeconds: 3000, - }, dataHashReader.address) + await sequencerInbox.initialize( + bridgeProxy.address, + { + delayBlocks: maxDelayBlocks, + delaySeconds: maxDelayTime, + futureBlocks: 10, + futureSeconds: 3000, + }, + dataHashReader.address + ) await ( await sequencerInbox .connect(rollupOwner) diff --git a/test/contract/toolkit4844.ts b/test/contract/toolkit4844.ts index 7d1ba74a..a0bafdc4 100644 --- a/test/contract/toolkit4844.ts +++ b/test/contract/toolkit4844.ts @@ -60,7 +60,9 @@ export class Toolkit4844 { }) } - public static async getTx(txHash: string): Promise { + public static async getTx( + txHash: string + ): Promise { const body = { method: 'eth_getTransactionByHash', params: [txHash], @@ -70,7 +72,9 @@ export class Toolkit4844 { return (await this.postDataToGeth(body))['result'] } - public static async getTxReceipt(txHash: string): Promise { + public static async getTxReceipt( + txHash: string + ): Promise { const body = { method: 'eth_getTransactionReceipt', params: [txHash], @@ -92,9 +96,9 @@ export class Toolkit4844 { public static isReplacementError(err: string) { const errRegex = - /Error while sending transaction\: replacement transaction underpriced\:/ + /Error while sending transaction: replacement transaction underpriced:/ const match = err.match(errRegex) - return !!match + return Boolean(match) } public static async sendBlobTx( @@ -103,7 +107,7 @@ export class Toolkit4844 { blobs: string[], data: string ) { - const blobStr = blobs.reduce((acc, blob) => acc + " -b " + blob, "") + const blobStr = blobs.reduce((acc, blob) => acc + ' -b ' + blob, '') const blobCommand = `docker run --network=nitro-testnode_default ethpandaops/goomy-blob:master blob-sender -p ${privKey} -r http://geth:8545 -t ${to} -d ${data} --gaslimit 1000000${blobStr} 2>&1` const res = execSync(blobCommand).toString() const txHashRegex = /0x[a-fA-F0-9]{64}/ From 597bd26f35a90ad6cc2147d8fa820a702648ee3d Mon Sep 17 00:00:00 2001 From: Chris Buckland Date: Wed, 18 Oct 2023 14:20:26 +0200 Subject: [PATCH 139/292] Updated validator tests --- test/contract/validatorWallet.spec.ts | 19 ++++++++++++++----- 1 file changed, 14 insertions(+), 5 deletions(-) diff --git a/test/contract/validatorWallet.spec.ts b/test/contract/validatorWallet.spec.ts index 90e1a5d1..cd98ba28 100644 --- a/test/contract/validatorWallet.spec.ts +++ b/test/contract/validatorWallet.spec.ts @@ -5,6 +5,7 @@ import { ValidatorWalletCreator__factory, ValidatorWallet, RollupMock, + RollupMock__factory, } from '../../build/types' import { initializeAccounts } from './utils' @@ -14,6 +15,7 @@ describe('Validator Wallet', () => { let accounts: Awaited> let owner: ArrayElement let executor: ArrayElement + let rollupOwner: ArrayElement let walletCreator: ValidatorWalletCreator let wallet: ValidatorWallet let rollupMock1: RollupMock @@ -26,8 +28,9 @@ describe('Validator Wallet', () => { walletCreator = await WalletCreator.deploy() await walletCreator.deployed() - owner = await accounts[0] - executor = await accounts[1] + owner = accounts[0] + executor = accounts[1] + rollupOwner = accounts[2] const walletCreationTx = await (await walletCreator.createWallet([])).wait() const events = walletCreationTx.logs @@ -45,9 +48,15 @@ describe('Validator Wallet', () => { await wallet.setExecutor([await executor.getAddress()], [true]) await wallet.transferOwnership(await owner.getAddress()) - const RollupMock = await ethers.getContractFactory('RollupMock') - rollupMock1 = (await RollupMock.deploy()) as RollupMock - rollupMock2 = (await RollupMock.deploy()) as RollupMock + const RollupMock = (await ethers.getContractFactory( + 'RollupMock' + )) as RollupMock__factory + rollupMock1 = (await RollupMock.deploy( + await rollupOwner.getAddress() + )) as RollupMock + rollupMock2 = (await RollupMock.deploy( + await rollupOwner.getAddress() + )) as RollupMock await accounts[0].sendTransaction({ to: wallet.address, From 7073bc9a60807905744c4e87b29ec906fe52990b Mon Sep 17 00:00:00 2001 From: Chris Buckland Date: Wed, 18 Oct 2023 16:50:53 +0200 Subject: [PATCH 140/292] Seq inbox stub update --- src/bridge/SequencerInbox.sol | 1 + src/mocks/SequencerInboxStub.sol | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/src/bridge/SequencerInbox.sol b/src/bridge/SequencerInbox.sol index 5262e7df..1a03643c 100644 --- a/src/bridge/SequencerInbox.sol +++ b/src/bridge/SequencerInbox.sol @@ -361,6 +361,7 @@ contract SequencerInbox is DelegateCallAware, GasRefundEnabled, ISequencerInbox // CHRIS: TODO: // no data - where do we have this? shouldn't we have a check that all supplied data is well formed? // perhaps this is we should put this indices + _; } diff --git a/src/mocks/SequencerInboxStub.sol b/src/mocks/SequencerInboxStub.sol index ade7b600..5d22718b 100644 --- a/src/mocks/SequencerInboxStub.sol +++ b/src/mocks/SequencerInboxStub.sol @@ -36,7 +36,7 @@ contract SequencerInboxStub is SequencerInbox { bytes32 beforeAcc, bytes32 delayedAcc, bytes32 afterAcc - ) = addSequencerL2BatchImpl(dataHash, 1, 0, 0, 1); + ) = addSequencerL2BatchImpl(dataHash, 1, 0, 0, 1, BatchDataLocation.NoData); require(sequencerMessageCount == 0, "ALREADY_SEQ_INIT"); emit SequencerBatchDelivered( sequencerMessageCount, From 8b379e9ac971208bbab3683e26b7d5b47f8f6c45 Mon Sep 17 00:00:00 2001 From: Chris Buckland Date: Thu, 19 Oct 2023 11:26:59 +0200 Subject: [PATCH 141/292] Refactored sequencer inbox --- src/bridge/ISequencerInbox.sol | 2 +- src/bridge/SequencerInbox.sol | 304 ++++++++++++------------------- src/mocks/SequencerInboxStub.sol | 13 +- 3 files changed, 122 insertions(+), 197 deletions(-) diff --git a/src/bridge/ISequencerInbox.sol b/src/bridge/ISequencerInbox.sol index 1172479e..4cacde91 100644 --- a/src/bridge/ISequencerInbox.sol +++ b/src/bridge/ISequencerInbox.sol @@ -29,7 +29,7 @@ interface ISequencerInbox is IDelayedMessageProvider { TxInput, SeparateBatchEvent, NoData, - DataBlob + Blob } event SequencerBatchDelivered( diff --git a/src/bridge/SequencerInbox.sol b/src/bridge/SequencerInbox.sol index 1a03643c..84bdae89 100644 --- a/src/bridge/SequencerInbox.sol +++ b/src/bridge/SequencerInbox.sol @@ -154,23 +154,21 @@ contract SequencerInbox is DelegateCallAware, GasRefundEnabled, ISequencerInbox Messages.accumulateInboxMessage(prevDelayedAcc, messageHash) ) revert IncorrectMessagePreimage(); - (bytes32 dataHash, TimeBounds memory timeBounds) = formEmptyDataHash( - _totalDelayedMessagesRead - ); + // CHRIS: TODO: why this assign?? uint256 __totalDelayedMessagesRead = _totalDelayedMessagesRead; uint256 prevSeqMsgCount = bridge.sequencerReportedSubMessageCount(); uint256 newSeqMsgCount = prevSeqMsgCount + _totalDelayedMessagesRead - totalDelayedMessagesRead; - ( - uint256 seqMessageIndex, - bytes32 beforeAcc, - bytes32 delayedAcc, - bytes32 afterAcc - ) = addSequencerL2BatchImpl( + + (bytes32 dataHash, TimeBounds memory timeBounds) = formEmptyDataHash( + __totalDelayedMessagesRead + ); + checkAndSetDelayedMessagesRead(__totalDelayedMessagesRead); + (uint256 seqMessageIndex, bytes32 beforeAcc, bytes32 delayedAcc, bytes32 afterAcc) = bridge + .enqueueSequencerMessage( dataHash, __totalDelayedMessagesRead, - 0, prevSeqMsgCount, newSeqMsgCount ); @@ -195,26 +193,12 @@ contract SequencerInbox is DelegateCallAware, GasRefundEnabled, ISequencerInbox // solhint-disable-next-line avoid-tx-origin if (msg.sender != tx.origin) revert NotOrigin(); if (!isBatchPoster[msg.sender]) revert NotBatchPoster(); - - (bytes32 dataHash, TimeBounds memory timeBounds) = formDataHash( - data, - afterDelayedMessagesRead - ); - ( - uint256 seqMessageIndex, - bytes32 beforeAcc, - bytes32 delayedAcc, - bytes32 afterAcc - ) = addSequencerL2BatchImpl(dataHash, afterDelayedMessagesRead, data.length, 0, 0); - if (seqMessageIndex != sequenceNumber) - revert BadSequencerNumber(seqMessageIndex, sequenceNumber); - emit SequencerBatchDelivered( + addSequencerL2BatchImpl( sequenceNumber, - beforeAcc, - afterAcc, - delayedAcc, - totalDelayedMessagesRead, - timeBounds, + data, + afterDelayedMessagesRead, + 0, + 0, BatchDataLocation.TxInput ); } @@ -230,45 +214,17 @@ contract SequencerInbox is DelegateCallAware, GasRefundEnabled, ISequencerInbox // solhint-disable-next-line avoid-tx-origin if (msg.sender != tx.origin) revert NotOrigin(); if (!isBatchPoster[msg.sender]) revert NotBatchPoster(); - (bytes32 dataHash, TimeBounds memory timeBounds) = formDataHash( + addSequencerL2BatchImpl( + sequenceNumber, data, - afterDelayedMessagesRead - ); - // Reformat the stack to prevent "Stack too deep" - uint256 sequenceNumber_ = sequenceNumber; - TimeBounds memory timeBounds_ = timeBounds; - bytes32 dataHash_ = dataHash; - uint256 dataLength = data.length; - uint256 afterDelayedMessagesRead_ = afterDelayedMessagesRead; - uint256 prevMessageCount_ = prevMessageCount; - uint256 newMessageCount_ = newMessageCount; - ( - uint256 seqMessageIndex, - bytes32 beforeAcc, - bytes32 delayedAcc, - bytes32 afterAcc - ) = addSequencerL2BatchImpl( - dataHash_, - afterDelayedMessagesRead_, - dataLength, - prevMessageCount_, - newMessageCount_ - ); - if (seqMessageIndex != sequenceNumber_ && sequenceNumber_ != ~uint256(0)) - revert BadSequencerNumber(seqMessageIndex, sequenceNumber_); - emit SequencerBatchDelivered( - seqMessageIndex, - beforeAcc, - afterAcc, - delayedAcc, - totalDelayedMessagesRead, - timeBounds_, + afterDelayedMessagesRead, + prevMessageCount, + newMessageCount, BatchDataLocation.TxInput ); } - // CHRIS: TODO: add to interface if we keep this - function addSequencerL2BatchBlob( + function addSequencerL2BatchFromBlob( uint256 sequenceNumber, bytes calldata data, uint256 afterDelayedMessagesRead, @@ -276,31 +232,16 @@ contract SequencerInbox is DelegateCallAware, GasRefundEnabled, ISequencerInbox uint256 prevMessageCount, uint256 newMessageCount ) external refundsGas(gasRefunder) { - if (!isBatchPoster[msg.sender] && msg.sender != address(rollup)) revert NotBatchPoster(); - (bytes32 dataHash, TimeBounds memory timeBounds) = formDataBlobHash( + if (!isBatchPoster[msg.sender]) revert NotBatchPoster(); + addSequencerL2BatchImpl( + sequenceNumber, data, - afterDelayedMessagesRead - ); - - (uint256 seqMessageIndex, bytes32 beforeAcc, bytes32 delayedAcc, bytes32 afterAcc) = addSequencerL2BatchImpl( - dataHash, afterDelayedMessagesRead, - // CHRIS: TODO: implement blob fees - 0, prevMessageCount, - newMessageCount - ); - if (seqMessageIndex != sequenceNumber && sequenceNumber != ~uint256(0)) - revert BadSequencerNumber(seqMessageIndex, sequenceNumber); - emit SequencerBatchDelivered( - seqMessageIndex, - beforeAcc, - afterAcc, - delayedAcc, - totalDelayedMessagesRead, - timeBounds, - BatchDataLocation.DataBlob + newMessageCount, + BatchDataLocation.Blob ); + emit SequencerBatchData(sequenceNumber, data); } function addSequencerL2Batch( @@ -312,57 +253,15 @@ contract SequencerInbox is DelegateCallAware, GasRefundEnabled, ISequencerInbox uint256 newMessageCount ) external override refundsGas(gasRefunder) { if (!isBatchPoster[msg.sender] && msg.sender != address(rollup)) revert NotBatchPoster(); - (bytes32 dataHash, TimeBounds memory timeBounds) = formDataHash( + addSequencerL2BatchImpl( + sequenceNumber, data, - afterDelayedMessagesRead - ); - // we set the calldata length posted to 0 here since the caller isn't the origin - // of the tx, so they might have not paid tx input cost for the calldata - ( - uint256 seqMessageIndex, - bytes32 beforeAcc, - bytes32 delayedAcc, - bytes32 afterAcc - ) = addSequencerL2BatchImpl( - dataHash, - afterDelayedMessagesRead, - 0, - prevMessageCount, - newMessageCount - ); - if (seqMessageIndex != sequenceNumber && sequenceNumber != ~uint256(0)) - revert BadSequencerNumber(seqMessageIndex, sequenceNumber); - emit SequencerBatchDelivered( - seqMessageIndex, - beforeAcc, - afterAcc, - delayedAcc, - totalDelayedMessagesRead, - timeBounds, + afterDelayedMessagesRead, + prevMessageCount, + newMessageCount, BatchDataLocation.SeparateBatchEvent ); - emit SequencerBatchData(seqMessageIndex, data); - } - - modifier validateBatchData(bytes calldata data) { - uint256 fullDataLen = HEADER_LENGTH + data.length; - if (fullDataLen > maxDataSize) revert DataTooLarge(fullDataLen, maxDataSize); - if (data.length > 0 && (data[0] & DATA_AUTHENTICATED_FLAG) == DATA_AUTHENTICATED_FLAG) { - revert DataNotAuthenticated(); - } - // the first byte is used to identify the type of batch data - // das batches expect to have the type byte set, followed by the keyset (so they should have at least 33 bytes) - if (data.length >= 33 && data[0] & 0x80 != 0) { - // we skip the first byte, then read the next 32 bytes for the keyset - bytes32 dasKeysetHash = bytes32(data[1:33]); - if (!dasKeySetInfo[dasKeysetHash].isValidKeyset) revert NoSuchKeyset(dasKeysetHash); - } - - // CHRIS: TODO: - // no data - where do we have this? shouldn't we have a check that all supplied data is well formed? - // perhaps this is we should put this indices - - _; + emit SequencerBatchData(sequenceNumber, data); } function packHeader(uint256 afterDelayedMessagesRead) @@ -383,80 +282,97 @@ contract SequencerInbox is DelegateCallAware, GasRefundEnabled, ISequencerInbox return (header, timeBounds); } - function formDataBlobHash( - bytes calldata data, - uint256 afterDelayedMessagesRead, - bytes32[] memory versionedHashes - ) internal view validateBatchData(data) returns (bytes32, TimeBounds memory) { - (bytes memory header, TimeBounds memory timeBounds) = packHeader(afterDelayedMessagesRead); - // CHRIS: TODO: encode or encode packed? - bytes32 dataHash = keccak256(bytes.concat(header, abi.encodePacked(versionedHashes))); - return (dataHash, timeBounds); - } - - function formDataBlobHash(bytes calldata data, uint256 afterDelayedMessagesRead) + function formEmptyDataHash(uint256 afterDelayedMessagesRead) internal view - validateBatchData(data) returns (bytes32, TimeBounds memory) { (bytes memory header, TimeBounds memory timeBounds) = packHeader(afterDelayedMessagesRead); - bytes32[] memory dataHashes = dataHashReader.getDataHashes(); - // CHRIS: TODO: should be a custom error - require(dataHashes.length != 0, "Missing data hashes"); - // CHRIS: TODO: encode or encode packed? - bytes32 dataHash = keccak256(bytes.concat(header, abi.encodePacked(dataHashes))); - return (dataHash, timeBounds); + return (keccak256(header), timeBounds); } - function formDataHash(bytes calldata data, uint256 afterDelayedMessagesRead) - internal - view - validateBatchData(data) - returns (bytes32, TimeBounds memory) - { - (bytes memory header, TimeBounds memory timeBounds) = packHeader(afterDelayedMessagesRead); - bytes32 dataHash = keccak256(bytes.concat(header, data)); - return (dataHash, timeBounds); - } + function formDataHash( + bytes calldata data, + uint256 afterDelayedMessagesRead, + BatchDataLocation dataLocation + ) internal view returns (bytes32, TimeBounds memory) { + uint256 fullDataLen = HEADER_LENGTH + data.length; + if (fullDataLen > maxDataSize) revert DataTooLarge(fullDataLen, maxDataSize); + if (data.length > 0 && (data[0] & DATA_AUTHENTICATED_FLAG) == DATA_AUTHENTICATED_FLAG) { + revert DataNotAuthenticated(); + } - function formEmptyDataHash(uint256 afterDelayedMessagesRead) - internal - view - returns (bytes32, TimeBounds memory) - { + // CHRIS: TODO: ensure this flag isnt used (bytes memory header, TimeBounds memory timeBounds) = packHeader(afterDelayedMessagesRead); - return (keccak256(header), timeBounds); + if (dataLocation == BatchDataLocation.Blob) { + bytes32[] memory dataHashes = dataHashReader.getDataHashes(); + // CHRIS: TODO: switch all requires to custom errors + require(dataHashes.length != 0, "Missing data hashes"); + require(data.length > 0 && data[0] & 0x04 != 0, "Invalid blob data"); + + return ( + keccak256(bytes.concat(header, data, abi.encodePacked(dataHashes))), + timeBounds + ); + } else { + // the first byte is used to identify the type of batch data + // das batches expect to have the type byte set, followed by the keyset (so they should have at least 33 bytes) + // CHRIS: TODO: what if it's less than 33? + if (data.length >= 33 && data[0] & 0x80 != 0) { + // we skip the first byte, then read the next 32 bytes for the keyset + bytes32 dasKeysetHash = bytes32(data[1:33]); + if (!dasKeySetInfo[dasKeysetHash].isValidKeyset) revert NoSuchKeyset(dasKeysetHash); + } + // CHRIS: TODO: consider more if-else stuff here + return (keccak256(bytes.concat(header, data)), timeBounds); + } } function addSequencerL2BatchImpl( - bytes32 dataHash, + uint256 sequenceNumber, + bytes calldata data, uint256 afterDelayedMessagesRead, - uint256 calldataLengthPosted, uint256 prevMessageCount, - uint256 newMessageCount - ) - internal - returns ( - uint256 seqMessageIndex, - bytes32 beforeAcc, - bytes32 delayedAcc, - bytes32 acc - ) - { - if (afterDelayedMessagesRead < totalDelayedMessagesRead) revert DelayedBackwards(); - if (afterDelayedMessagesRead > bridge.delayedMessageCount()) revert DelayedTooFar(); - - (seqMessageIndex, beforeAcc, delayedAcc, acc) = bridge.enqueueSequencerMessage( - dataHash, + uint256 newMessageCount, + BatchDataLocation dataLocation + ) internal { + (bytes32 dataHash, TimeBounds memory timeBounds) = formDataHash( + data, afterDelayedMessagesRead, - prevMessageCount, - newMessageCount + dataLocation ); + checkAndSetDelayedMessagesRead(afterDelayedMessagesRead); + (uint256 seqMessageIndex, bytes32 beforeAcc, bytes32 delayedAcc, bytes32 afterAcc) = bridge + .enqueueSequencerMessage( + dataHash, + afterDelayedMessagesRead, + prevMessageCount, + newMessageCount + ); + if (dataLocation == BatchDataLocation.TxInput || dataLocation == BatchDataLocation.Blob) { + submitBatchSpendingReport(dataHash, seqMessageIndex, dataLocation); + } + if (seqMessageIndex != sequenceNumber && sequenceNumber != ~uint256(0)) { + revert BadSequencerNumber(seqMessageIndex, sequenceNumber); + } - totalDelayedMessagesRead = afterDelayedMessagesRead; + emit SequencerBatchDelivered( + seqMessageIndex, + beforeAcc, + afterAcc, + delayedAcc, + totalDelayedMessagesRead, + timeBounds, + dataLocation + ); + } - if (calldataLengthPosted > 0) { + function submitBatchSpendingReport( + bytes32 dataHash, + uint256 seqMessageIndex, + BatchDataLocation bType + ) internal { + if (bType == BatchDataLocation.TxInput) { // this msg isn't included in the current sequencer batch, but instead added to // the delayed messages queue that is yet to be included address batchPoster = msg.sender; @@ -489,9 +405,21 @@ contract SequencerInbox is DelegateCallAware, GasRefundEnabled, ISequencerInbox ); // this is the same event used by Inbox.sol after including a message to the delayed message accumulator emit InboxMessageDelivered(msgNum, spendingReportMsg); + } else if (bType == BatchDataLocation.Blob) { + // CHRIS: TODO: add blob charging report + } else { + // CHRIS: TODO: add custom error + revert("Unrecognised batch data type"); } } + // CHRIS: TODO: docs and inline it? + function checkAndSetDelayedMessagesRead(uint256 afterDelayedMessagesRead) internal { + if (afterDelayedMessagesRead < totalDelayedMessagesRead) revert DelayedBackwards(); + if (afterDelayedMessagesRead > bridge.delayedMessageCount()) revert DelayedTooFar(); + totalDelayedMessagesRead = afterDelayedMessagesRead; + } + function inboxAccs(uint256 index) external view returns (bytes32) { return bridge.sequencerInboxAccs(index); } diff --git a/src/mocks/SequencerInboxStub.sol b/src/mocks/SequencerInboxStub.sol index 5d22718b..ed275027 100644 --- a/src/mocks/SequencerInboxStub.sol +++ b/src/mocks/SequencerInboxStub.sol @@ -31,15 +31,12 @@ contract SequencerInboxStub is SequencerInbox { require(num == 0, "ALREADY_DELAYED_INIT"); emit InboxMessageDelivered(num, initMsg); (bytes32 dataHash, TimeBounds memory timeBounds) = formEmptyDataHash(1); - ( - uint256 sequencerMessageCount, - bytes32 beforeAcc, - bytes32 delayedAcc, - bytes32 afterAcc - ) = addSequencerL2BatchImpl(dataHash, 1, 0, 0, 1, BatchDataLocation.NoData); - require(sequencerMessageCount == 0, "ALREADY_SEQ_INIT"); + checkAndSetDelayedMessagesRead(1); + (uint256 seqMessageIndex, bytes32 beforeAcc, bytes32 delayedAcc, bytes32 afterAcc) = bridge + .enqueueSequencerMessage(dataHash, 1, 0, 0); + require(seqMessageIndex == 0, "ALREADY_SEQ_INIT"); emit SequencerBatchDelivered( - sequencerMessageCount, + seqMessageIndex, beforeAcc, afterAcc, delayedAcc, From 888d13ed82a1c12772bed5d6664b7e9e3fb73121 Mon Sep 17 00:00:00 2001 From: Chris Buckland Date: Thu, 19 Oct 2023 11:46:26 +0200 Subject: [PATCH 142/292] Use args test branch --- .github/workflows/contract-tests.yml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.github/workflows/contract-tests.yml b/.github/workflows/contract-tests.yml index 8b2e7cc5..04591550 100644 --- a/.github/workflows/contract-tests.yml +++ b/.github/workflows/contract-tests.yml @@ -91,9 +91,10 @@ jobs: with: submodules: recursive - - uses: OffchainLabs/actions/run-nitro-test-node@main + - uses: OffchainLabs/actions/run-nitro-test-node@test-node-args with: nitro-testnode-ref: deneb-integration + args: --pos --no-tokenbridge - name: Setup nodejs uses: actions/setup-node@v2 From a238e59bded1193d8b093bf8ae2eefd89fcc4889 Mon Sep 17 00:00:00 2001 From: Chris Buckland Date: Thu, 19 Oct 2023 12:15:11 +0200 Subject: [PATCH 143/292] Updated storage dot --- src/bridge/SequencerInbox.sol | 2 +- test/contract/sequencerInbox.spec.4844.ts | 2 +- test/storage/SequencerInbox.dot | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/bridge/SequencerInbox.sol b/src/bridge/SequencerInbox.sol index 84bdae89..874fd199 100644 --- a/src/bridge/SequencerInbox.sol +++ b/src/bridge/SequencerInbox.sol @@ -65,13 +65,13 @@ contract SequencerInbox is DelegateCallAware, GasRefundEnabled, ISequencerInbox } mapping(address => bool) public isSequencer; + IDataHashReader dataHashReader; // On L1 this should be set to 117964: 90% of Geth's 128KB tx size limit, leaving ~13KB for proving uint256 public immutable maxDataSize; uint256 internal immutable deployTimeChainId = block.chainid; // If the chain this SequencerInbox is deployed on is an Arbitrum chain. bool internal immutable hostChainIsArbitrum = ArbitrumChecker.runningOnArbitrum(); - IDataHashReader dataHashReader; constructor(uint256 _maxDataSize) { maxDataSize = _maxDataSize; diff --git a/test/contract/sequencerInbox.spec.4844.ts b/test/contract/sequencerInbox.spec.4844.ts index cbc9b2db..5af52327 100644 --- a/test/contract/sequencerInbox.spec.4844.ts +++ b/test/contract/sequencerInbox.spec.4844.ts @@ -436,7 +436,7 @@ describe('SequencerInbox', async () => { ['0x0142', '0x0143'], sequencerInbox.interface.encodeFunctionData('addSequencerL2BatchBlob', [ sequenceNumber, - '0x0142', + '0x04', afterDelayedMessagesRead, constants.AddressZero, subMessageCount, diff --git a/test/storage/SequencerInbox.dot b/test/storage/SequencerInbox.dot index f9ea05ab..7c268d5c 100644 --- a/test/storage/SequencerInbox.dot +++ b/test/storage/SequencerInbox.dot @@ -4,7 +4,7 @@ rankdir=LR color=black arrowhead=open node [shape=record, style=filled, fillcolor=gray95 fontname="Courier New"] -3 [label="SequencerInbox \<\\>\n | {{ slot| 0 | 1 | 2 | 3 | 4-7 | 8 | 9 } | { type: \.variable (bytes) | { uint256: totalDelayedMessagesRead (32) } | { unallocated (12) | IBridge: bridge (20) } | { unallocated (12) | IOwnable: rollup (20) } | { mapping\(address=\>bool\): isBatchPoster (32) } | { <9> ISequencerInbox.MaxTimeVariation: maxTimeVariation (128) } | { <12> mapping\(bytes32=\>DasKeySetInfo\): dasKeySetInfo (32) } | { mapping\(address=\>bool\): isSequencer (32) }}}"] +3 [label="SequencerInbox \<\\>\n | {{ slot| 0 | 1 | 2 | 3 | 4-7 | 8 | 9 | 10 } | { type: \.variable (bytes) | { uint256: totalDelayedMessagesRead (32) } | { unallocated (12) | IBridge: bridge (20) } | { unallocated (12) | IOwnable: rollup (20) } | { mapping\(address=\>bool\): isBatchPoster (32) } | { <9> ISequencerInbox.MaxTimeVariation: maxTimeVariation (128) } | { <12> mapping\(bytes32=\>DasKeySetInfo\): dasKeySetInfo (32) } | { mapping\(address=\>bool\): isSequencer (32) } | { unallocated (12) | IDataHashReader: dataHashReader (20) }}}"] 1 [label="ISequencerInbox.MaxTimeVariation \<\\>\n | {{ slot| 4 | 5 | 6 | 7 } | { type: variable (bytes) | { uint256: MaxTimeVariation.delayBlocks (32) } | { uint256: MaxTimeVariation.futureBlocks (32) } | { uint256: MaxTimeVariation.delaySeconds (32) } | { uint256: MaxTimeVariation.futureSeconds (32) }}}"] From 48e3bfe8e6e5afe6cfb54bec9d2245141d7643b0 Mon Sep 17 00:00:00 2001 From: Chris Buckland Date: Thu, 19 Oct 2023 12:17:40 +0200 Subject: [PATCH 144/292] Formatting --- .github/workflows/contract-tests.yml | 1 - scripts/rollupCreation.ts | 12 +- test/foundry/AbsInbox.t.sol | 36 ++++-- test/foundry/ERC20Bridge.t.sol | 33 +++-- test/foundry/ERC20Inbox.t.sol | 3 +- test/foundry/RollupCreator.t.sol | 180 +++++++++++++++++---------- 6 files changed, 169 insertions(+), 96 deletions(-) diff --git a/.github/workflows/contract-tests.yml b/.github/workflows/contract-tests.yml index 04591550..eeb52cfa 100644 --- a/.github/workflows/contract-tests.yml +++ b/.github/workflows/contract-tests.yml @@ -111,4 +111,3 @@ jobs: - name: Test 4844 run: yarn test:4844 - diff --git a/scripts/rollupCreation.ts b/scripts/rollupCreation.ts index 26d060f8..82e40cb5 100644 --- a/scripts/rollupCreation.ts +++ b/scripts/rollupCreation.ts @@ -85,15 +85,11 @@ export async function createRollup(feeToken?: string) { maxDataSize: maxDataSize, nativeToken: feeToken, deployFactoriesToL2: true, - maxFeePerGasForRetryables: MAX_FER_PER_GAS + maxFeePerGasForRetryables: MAX_FER_PER_GAS, } - const createRollupTx = await rollupCreator.createRollup( - deployParams, - { - value: feeCost, - } - - ) + const createRollupTx = await rollupCreator.createRollup(deployParams, { + value: feeCost, + }) const createRollupReceipt = await createRollupTx.wait() const rollupCreatedEvent = createRollupReceipt.events?.find( diff --git a/test/foundry/AbsInbox.t.sol b/test/foundry/AbsInbox.t.sol index 34eb35f7..c97bb3ef 100644 --- a/test/foundry/AbsInbox.t.sol +++ b/test/foundry/AbsInbox.t.sol @@ -63,13 +63,18 @@ abstract contract AbsInboxTest is Test { // mock the owner() call on rollup address mockRollupOwner = address(10_000); vm.mockCall( - rollup, abi.encodeWithSelector(IOwnable.owner.selector), abi.encode(mockRollupOwner) + rollup, + abi.encodeWithSelector(IOwnable.owner.selector), + abi.encode(mockRollupOwner) ); // setAllowList shall revert vm.expectRevert( abi.encodeWithSelector( - NotRollupOrOwner.selector, address(this), rollup, mockRollupOwner + NotRollupOrOwner.selector, + address(this), + rollup, + mockRollupOwner ) ); @@ -126,13 +131,18 @@ abstract contract AbsInboxTest is Test { // mock the owner() call on rollup address mockRollupOwner = address(10_000); vm.mockCall( - rollup, abi.encodeWithSelector(IOwnable.owner.selector), abi.encode(mockRollupOwner) + rollup, + abi.encodeWithSelector(IOwnable.owner.selector), + abi.encode(mockRollupOwner) ); // setAllowListEnabled shall revert vm.expectRevert( abi.encodeWithSelector( - NotRollupOrOwner.selector, address(this), rollup, mockRollupOwner + NotRollupOrOwner.selector, + address(this), + rollup, + mockRollupOwner ) ); @@ -141,7 +151,9 @@ abstract contract AbsInboxTest is Test { function test_pause() public { assertEq( - (PausableUpgradeable(address(inbox))).paused(), false, "Invalid initial paused state" + (PausableUpgradeable(address(inbox))).paused(), + false, + "Invalid initial paused state" ); vm.prank(rollup); @@ -154,7 +166,9 @@ abstract contract AbsInboxTest is Test { vm.prank(rollup); inbox.pause(); assertEq( - (PausableUpgradeable(address(inbox))).paused(), true, "Invalid initial paused state" + (PausableUpgradeable(address(inbox))).paused(), + true, + "Invalid initial paused state" ); vm.prank(rollup); inbox.unpause(); @@ -287,8 +301,14 @@ abstract contract AbsInboxTest is Test { // send TX vm.prank(user, user); - uint256 msgNum = - inbox.sendUnsignedTransaction(gasLimit, maxFeePerGas, nonce, user, value, data); + uint256 msgNum = inbox.sendUnsignedTransaction( + gasLimit, + maxFeePerGas, + nonce, + user, + value, + data + ); //// checks assertEq(msgNum, 0, "Invalid msgNum"); diff --git a/test/foundry/ERC20Bridge.t.sol b/test/foundry/ERC20Bridge.t.sol index 71b815ab..fc1d2acb 100644 --- a/test/foundry/ERC20Bridge.t.sol +++ b/test/foundry/ERC20Bridge.t.sol @@ -41,7 +41,9 @@ contract ERC20BridgeTest is AbsBridgeTest { /* solhint-disable func-name-mixedcase */ function test_initialize() public { assertEq( - address(erc20Bridge.nativeToken()), address(nativeToken), "Invalid nativeToken ref" + address(erc20Bridge.nativeToken()), + address(nativeToken), + "Invalid nativeToken ref" ); assertEq(address(bridge.rollup()), rollup, "Invalid rollup ref"); assertEq(bridge.activeOutbox(), address(0), "Invalid activeOutbox ref"); @@ -105,7 +107,9 @@ contract ERC20BridgeTest is AbsBridgeTest { //// checks uint256 userNativeTokenBalanceAfter = nativeToken.balanceOf(address(user)); assertEq( - userNativeTokenBalanceAfter, userNativeTokenBalanceBefore, "Invalid user token balance" + userNativeTokenBalanceAfter, + userNativeTokenBalanceBefore, + "Invalid user token balance" ); uint256 bridgeNativeTokenBalanceAfter = nativeToken.balanceOf(address(bridge)); @@ -135,7 +139,9 @@ contract ERC20BridgeTest is AbsBridgeTest { hoax(inbox); vm.expectRevert(); IEthBridge(address(bridge)).enqueueDelayedMessage{value: 0.1 ether}( - kind, user, messageDataHash + kind, + user, + messageDataHash ); } @@ -166,7 +172,7 @@ contract ERC20BridgeTest is AbsBridgeTest { //// execute call vm.prank(outbox); - (bool success,) = bridge.executeCall(user, withdrawalAmount, data); + (bool success, ) = bridge.executeCall(user, withdrawalAmount, data); //// checks assertTrue(success, "Execute call failed"); @@ -212,8 +218,11 @@ contract ERC20BridgeTest is AbsBridgeTest { //// execute call vm.prank(outbox); - (bool success,) = - bridge.executeCall({to: address(vault), value: withdrawalAmount, data: data}); + (bool success, ) = bridge.executeCall({ + to: address(vault), + value: withdrawalAmount, + data: data + }); //// checks assertTrue(success, "Execute call failed"); @@ -259,8 +268,11 @@ contract ERC20BridgeTest is AbsBridgeTest { //// execute call - do call which reverts vm.prank(outbox); - (bool success, bytes memory returnData) = - bridge.executeCall({to: address(vault), value: withdrawalAmount, data: data}); + (bool success, bytes memory returnData) = bridge.executeCall({ + to: address(vault), + value: withdrawalAmount, + data: data + }); //// checks assertEq(success, false, "Execute shall be unsuccessful"); @@ -361,7 +373,9 @@ contract ERC20BridgeTest is AbsBridgeTest { address to = _gateway; uint256 withdrawAmount = 25 ether; bytes memory data = abi.encodeWithSelector( - MockGateway.withdraw.selector, MockBridgedToken(_nativeToken), withdrawAmount + MockGateway.withdraw.selector, + MockBridgedToken(_nativeToken), + withdrawAmount ); vm.expectRevert(abi.encodeWithSelector(CallNotAllowed.selector)); vm.prank(_outbox); @@ -376,6 +390,7 @@ contract MockBridgedToken is ERC20 { gateway = _gateway; _mint(msg.sender, 1_000_000 ether); } + function bridgeBurn(address account, uint256 amount) external { require(msg.sender == gateway, "ONLY_GATEWAY"); _burn(account, amount); diff --git a/test/foundry/ERC20Inbox.t.sol b/test/foundry/ERC20Inbox.t.sol index 44948af2..a4680eda 100644 --- a/test/foundry/ERC20Inbox.t.sol +++ b/test/foundry/ERC20Inbox.t.sol @@ -128,7 +128,8 @@ contract ERC20InboxTest is AbsInboxTest { // expect event vm.expectEmit(true, true, true, true); emit InboxMessageDelivered( - 0, abi.encodePacked(AddressAliasHelper.applyL1ToL2Alias(user), depositAmount) + 0, + abi.encodePacked(AddressAliasHelper.applyL1ToL2Alias(user), depositAmount) ); // deposit tokens -> tx.origin != msg.sender diff --git a/test/foundry/RollupCreator.t.sol b/test/foundry/RollupCreator.t.sol index 5889cff5..8c7c5d4a 100644 --- a/test/foundry/RollupCreator.t.sol +++ b/test/foundry/RollupCreator.t.sol @@ -33,20 +33,22 @@ contract RollupCreatorTest is Test { uint256 public constant MAX_FEE_PER_GAS = 1_000_000_000; uint256 public constant MAX_DATA_SIZE = 117_964; - BridgeCreator.BridgeContracts public ethBasedTemplates = BridgeCreator.BridgeContracts({ - bridge: new Bridge(), - sequencerInbox: new SequencerInbox(MAX_DATA_SIZE), - inbox: new Inbox(MAX_DATA_SIZE), - rollupEventInbox: new RollupEventInbox(), - outbox: new Outbox() - }); - BridgeCreator.BridgeContracts public erc20BasedTemplates = BridgeCreator.BridgeContracts({ - bridge: new ERC20Bridge(), - sequencerInbox: ethBasedTemplates.sequencerInbox, - inbox: new ERC20Inbox(MAX_DATA_SIZE), - rollupEventInbox: new ERC20RollupEventInbox(), - outbox: new ERC20Outbox() - }); + BridgeCreator.BridgeContracts public ethBasedTemplates = + BridgeCreator.BridgeContracts({ + bridge: new Bridge(), + sequencerInbox: new SequencerInbox(MAX_DATA_SIZE), + inbox: new Inbox(MAX_DATA_SIZE), + rollupEventInbox: new RollupEventInbox(), + outbox: new Outbox() + }); + BridgeCreator.BridgeContracts public erc20BasedTemplates = + BridgeCreator.BridgeContracts({ + bridge: new ERC20Bridge(), + sequencerInbox: ethBasedTemplates.sequencerInbox, + inbox: new ERC20Inbox(MAX_DATA_SIZE), + rollupEventInbox: new ERC20RollupEventInbox(), + outbox: new ERC20Outbox() + }); /* solhint-disable func-name-mixedcase */ function setUp() public { @@ -90,8 +92,12 @@ contract RollupCreatorTest is Test { vm.startPrank(deployer); // deployment params - ISequencerInbox.MaxTimeVariation memory timeVars = - ISequencerInbox.MaxTimeVariation(((60 * 60 * 24) / 15), 12, 60 * 60 * 24, 60 * 60); + ISequencerInbox.MaxTimeVariation memory timeVars = ISequencerInbox.MaxTimeVariation( + ((60 * 60 * 24) / 15), + 12, + 60 * 60 * 24, + 60 * 60 + ); Config memory config = Config({ confirmPeriodBlocks: 20, extraChallengeTimeBlocks: 200, @@ -119,17 +125,18 @@ contract RollupCreatorTest is Test { RollupCreator.RollupDeploymentParams memory deployParams = RollupCreator .RollupDeploymentParams({ - config: config, - batchPoster: batchPoster, - validators: validators, - maxDataSize: MAX_DATA_SIZE, - nativeToken: address(0), - deployFactoriesToL2: true, - maxFeePerGasForRetryables: MAX_FEE_PER_GAS, - dataHashReader: dummyDataHashReader - }); - address rollupAddress = - rollupCreator.createRollup{value: factoryDeploymentFunds}(deployParams); + config: config, + batchPoster: batchPoster, + validators: validators, + maxDataSize: MAX_DATA_SIZE, + nativeToken: address(0), + deployFactoriesToL2: true, + maxFeePerGasForRetryables: MAX_FEE_PER_GAS, + dataHashReader: dummyDataHashReader + }); + address rollupAddress = rollupCreator.createRollup{value: factoryDeploymentFunds}( + deployParams + ); vm.stopPrank(); @@ -201,7 +208,9 @@ contract RollupCreatorTest is Test { // upgrade executor owns rollup assertEq( - IOwnable(rollupAddress).owner(), upgradeExecutorExpectedAddress, "Invalid rollup owner" + IOwnable(rollupAddress).owner(), + upgradeExecutorExpectedAddress, + "Invalid rollup owner" ); assertEq( _getProxyAdmin(rollupAddress), @@ -210,26 +219,36 @@ contract RollupCreatorTest is Test { ); // check rollupOwner has executor role - AccessControlUpgradeable executor = AccessControlUpgradeable(upgradeExecutorExpectedAddress); + AccessControlUpgradeable executor = AccessControlUpgradeable( + upgradeExecutorExpectedAddress + ); assertTrue( - executor.hasRole(keccak256("EXECUTOR_ROLE"), rollupOwner), "Invalid executor role" + executor.hasRole(keccak256("EXECUTOR_ROLE"), rollupOwner), + "Invalid executor role" ); // check funds are refunded uint256 balanceAfter = deployer.balance; - uint256 factoryDeploymentCost = - deployHelper.getDeploymentTotalCost(rollup.inbox(), MAX_FEE_PER_GAS); + uint256 factoryDeploymentCost = deployHelper.getDeploymentTotalCost( + rollup.inbox(), + MAX_FEE_PER_GAS + ); assertEq(balanceBefore - balanceAfter, factoryDeploymentCost, "Invalid balance"); } function test_createErc20Rollup() public { vm.startPrank(deployer); - address nativeToken = - address(new ERC20PresetFixedSupply("Appchain Token", "App", 1_000_000 ether, deployer)); + address nativeToken = address( + new ERC20PresetFixedSupply("Appchain Token", "App", 1_000_000 ether, deployer) + ); // deployment params - ISequencerInbox.MaxTimeVariation memory timeVars = - ISequencerInbox.MaxTimeVariation(((60 * 60 * 24) / 15), 12, 60 * 60 * 24, 60 * 60); + ISequencerInbox.MaxTimeVariation memory timeVars = ISequencerInbox.MaxTimeVariation( + ((60 * 60 * 24) / 15), + 12, + 60 * 60 * 24, + 60 * 60 + ); Config memory config = Config({ confirmPeriodBlocks: 20, extraChallengeTimeBlocks: 200, @@ -245,7 +264,9 @@ contract RollupCreatorTest is Test { }); // approve fee token to pay for deployment of L2 factories - uint256 expectedCost = 0.1247 ether + 4 * (1400 * 100_000_000_000 + 100_000 * 1_000_000_000); + uint256 expectedCost = 0.1247 ether + + 4 * + (1400 * 100_000_000_000 + 100_000 * 1_000_000_000); IERC20(nativeToken).approve(address(rollupCreator), expectedCost); /// deploy rollup @@ -256,15 +277,15 @@ contract RollupCreatorTest is Test { RollupCreator.RollupDeploymentParams memory deployParams = RollupCreator .RollupDeploymentParams({ - config: config, - batchPoster: batchPoster, - validators: validators, - maxDataSize: MAX_DATA_SIZE, - nativeToken: nativeToken, - deployFactoriesToL2: true, - maxFeePerGasForRetryables: MAX_FEE_PER_GAS, - dataHashReader: dummyDataHashReader - }); + config: config, + batchPoster: batchPoster, + validators: validators, + maxDataSize: MAX_DATA_SIZE, + nativeToken: nativeToken, + deployFactoriesToL2: true, + maxFeePerGasForRetryables: MAX_FEE_PER_GAS, + dataHashReader: dummyDataHashReader + }); address rollupAddress = rollupCreator.createRollup(deployParams); @@ -296,7 +317,9 @@ contract RollupCreatorTest is Test { // native token check IBridge bridge = RollupCore(address(rollupAddress)).bridge(); assertEq( - IERC20Bridge(address(bridge)).nativeToken(), nativeToken, "Invalid native token ref" + IERC20Bridge(address(bridge)).nativeToken(), + nativeToken, + "Invalid native token ref" ); // check proxy admin for non-rollup contracts @@ -343,7 +366,9 @@ contract RollupCreatorTest is Test { // upgrade executor owns rollup assertEq( - IOwnable(rollupAddress).owner(), upgradeExecutorExpectedAddress, "Invalid rollup owner" + IOwnable(rollupAddress).owner(), + upgradeExecutorExpectedAddress, + "Invalid rollup owner" ); assertEq( _getProxyAdmin(rollupAddress), @@ -352,9 +377,12 @@ contract RollupCreatorTest is Test { ); // check rollupOwner has executor role - AccessControlUpgradeable executor = AccessControlUpgradeable(upgradeExecutorExpectedAddress); + AccessControlUpgradeable executor = AccessControlUpgradeable( + upgradeExecutorExpectedAddress + ); assertTrue( - executor.hasRole(keccak256("EXECUTOR_ROLE"), rollupOwner), "Invalid executor role" + executor.hasRole(keccak256("EXECUTOR_ROLE"), rollupOwner), + "Invalid executor role" ); } @@ -362,8 +390,12 @@ contract RollupCreatorTest is Test { vm.startPrank(deployer); // deployment params - ISequencerInbox.MaxTimeVariation memory timeVars = - ISequencerInbox.MaxTimeVariation(((60 * 60 * 24) / 15), 12, 60 * 60 * 24, 60 * 60); + ISequencerInbox.MaxTimeVariation memory timeVars = ISequencerInbox.MaxTimeVariation( + ((60 * 60 * 24) / 15), + 12, + 60 * 60 * 24, + 60 * 60 + ); Config memory config = Config({ confirmPeriodBlocks: 20, extraChallengeTimeBlocks: 200, @@ -390,17 +422,18 @@ contract RollupCreatorTest is Test { RollupCreator.RollupDeploymentParams memory deployParams = RollupCreator .RollupDeploymentParams({ - config: config, - batchPoster: batchPoster, - validators: validators, - maxDataSize: MAX_DATA_SIZE, - nativeToken: address(0), - deployFactoriesToL2: true, - maxFeePerGasForRetryables: MAX_FEE_PER_GAS, - dataHashReader: dummyDataHashReader - }); - address rollupAddress = - rollupCreator.createRollup{value: factoryDeploymentFunds}(deployParams); + config: config, + batchPoster: batchPoster, + validators: validators, + maxDataSize: MAX_DATA_SIZE, + nativeToken: address(0), + deployFactoriesToL2: true, + maxFeePerGasForRetryables: MAX_FEE_PER_GAS, + dataHashReader: dummyDataHashReader + }); + address rollupAddress = rollupCreator.createRollup{value: factoryDeploymentFunds}( + deployParams + ); vm.stopPrank(); @@ -408,12 +441,16 @@ contract RollupCreatorTest is Test { RollupCore rollup = RollupCore(rollupAddress); address inbox = address(rollup.inbox()); address proxyAdmin = computeCreateAddress(address(rollupCreator), 1); - IUpgradeExecutor upgradeExecutor = - IUpgradeExecutor(computeCreateAddress(address(rollupCreator), 4)); + IUpgradeExecutor upgradeExecutor = IUpgradeExecutor( + computeCreateAddress(address(rollupCreator), 4) + ); Dummy newLogicImpl = new Dummy(); bytes memory data = abi.encodeWithSelector( - ProxyUpgradeAction.perform.selector, address(proxyAdmin), inbox, address(newLogicImpl) + ProxyUpgradeAction.perform.selector, + address(proxyAdmin), + inbox, + address(newLogicImpl) ); address upgradeAction = address(new ProxyUpgradeAction()); @@ -465,14 +502,19 @@ contract RollupCreatorTest is Test { } function _getSecondary(address proxy) internal view returns (address) { - bytes32 secondarySlot = - bytes32(uint256(keccak256("eip1967.proxy.implementation.secondary")) - 1); + bytes32 secondarySlot = bytes32( + uint256(keccak256("eip1967.proxy.implementation.secondary")) - 1 + ); return address(uint160(uint256(vm.load(proxy, secondarySlot)))); } } contract ProxyUpgradeAction { - function perform(address admin, address payable target, address newLogic) public payable { + function perform( + address admin, + address payable target, + address newLogic + ) public payable { ProxyAdmin(admin).upgrade(TransparentUpgradeableProxy(target), newLogic); } } From 2acdc24078b04d4e7a6332b1abe4355393e29fd9 Mon Sep 17 00:00:00 2001 From: Chris Buckland Date: Thu, 19 Oct 2023 12:19:29 +0200 Subject: [PATCH 145/292] Test formatting --- test/contract/sequencerInbox.spec.4844.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/test/contract/sequencerInbox.spec.4844.ts b/test/contract/sequencerInbox.spec.4844.ts index 5af52327..36197b6e 100644 --- a/test/contract/sequencerInbox.spec.4844.ts +++ b/test/contract/sequencerInbox.spec.4844.ts @@ -442,6 +442,7 @@ describe('SequencerInbox', async () => { subMessageCount, subMessageCount.add(1), ]) + ) const batchSendTx = await Toolkit4844.getTx(txHash) From 4b061cb30af9e48c074a5ed48d9bc70f94d8371e Mon Sep 17 00:00:00 2001 From: Chris Buckland Date: Thu, 19 Oct 2023 12:38:31 +0200 Subject: [PATCH 146/292] Removed formatting --- test/contract/sequencerInbox.spec.4844.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/test/contract/sequencerInbox.spec.4844.ts b/test/contract/sequencerInbox.spec.4844.ts index 36197b6e..5af52327 100644 --- a/test/contract/sequencerInbox.spec.4844.ts +++ b/test/contract/sequencerInbox.spec.4844.ts @@ -442,7 +442,6 @@ describe('SequencerInbox', async () => { subMessageCount, subMessageCount.add(1), ]) - ) const batchSendTx = await Toolkit4844.getTx(txHash) From 24f4381758431306c45343f719a57ff6ddaa78c2 Mon Sep 17 00:00:00 2001 From: Chris Buckland Date: Thu, 19 Oct 2023 14:18:37 +0200 Subject: [PATCH 147/292] Added no-token-bridge arg --- .github/workflows/contract-tests.yml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.github/workflows/contract-tests.yml b/.github/workflows/contract-tests.yml index eeb52cfa..63f090b4 100644 --- a/.github/workflows/contract-tests.yml +++ b/.github/workflows/contract-tests.yml @@ -94,7 +94,8 @@ jobs: - uses: OffchainLabs/actions/run-nitro-test-node@test-node-args with: nitro-testnode-ref: deneb-integration - args: --pos --no-tokenbridge + args: --pos + no-token-bridge: true - name: Setup nodejs uses: actions/setup-node@v2 From a89fed563cc75f2bcc4056db4abc15f0401ae392 Mon Sep 17 00:00:00 2001 From: Chris Buckland Date: Thu, 19 Oct 2023 14:30:23 +0200 Subject: [PATCH 148/292] Updated function name in ts --- test/contract/sequencerInbox.spec.4844.ts | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/test/contract/sequencerInbox.spec.4844.ts b/test/contract/sequencerInbox.spec.4844.ts index 5af52327..f5ef9f83 100644 --- a/test/contract/sequencerInbox.spec.4844.ts +++ b/test/contract/sequencerInbox.spec.4844.ts @@ -196,16 +196,21 @@ describe('SequencerInbox', async () => { let key = wallet.privateKey const wallets: Wallet[] = [] + console.log("a10") + for (let index = 0; index < length; index++) { + console.log("a11", index) key = keccak256(key) const nextWallet = new Wallet(key).connect(wallet.provider) if ((await nextWallet.getBalance()).lt(amount)) { + console.log("a12", index) await ( await wallet.sendTransaction({ to: nextWallet.address, value: amount, }) ).wait() + console.log("a13", index) } wallets.push(nextWallet) } @@ -247,7 +252,9 @@ describe('SequencerInbox', async () => { maxDelayBlocks = 10, maxDelayTime = 0 ) => { + console.log("a1") const accounts = await fundAccounts(fundingWallet, 5, utils.parseEther('1')) + console.log("a2") const admin = accounts[0] const adminAddr = await admin.getAddress() @@ -270,6 +277,7 @@ describe('SequencerInbox', async () => { const rollupMock = await rollupMockFac.deploy( await rollupOwner.getAddress() ) + console.log("a3") const sequencerInboxFac = new SequencerInbox__factory(deployer) const seqInboxTemplate = await sequencerInboxFac.deploy(117964) @@ -408,11 +416,14 @@ describe('SequencerInbox', async () => { const privKey = 'cb5790da63720727af975f42c79f69918580209889225fa7128c92402a6d3a65' const prov = new JsonRpcProvider('http://localhost:8545') + console.log("a") const wallet = new Wallet(privKey).connect(prov) const { user, inbox, bridge, messageTester, sequencerInbox, batchPoster } = await setupSequencerInbox(wallet) + console.log("b") + await sendDelayedTx( user, inbox, @@ -425,6 +436,7 @@ describe('SequencerInbox', async () => { BigNumber.from(10), '0x1010' ) + console.log("c") const subMessageCount = await bridge.sequencerReportedSubMessageCount() const afterDelayedMessagesRead = await bridge.delayedMessageCount() @@ -434,7 +446,7 @@ describe('SequencerInbox', async () => { batchPoster.privateKey.substring(2), sequencerInbox.address, ['0x0142', '0x0143'], - sequencerInbox.interface.encodeFunctionData('addSequencerL2BatchBlob', [ + sequencerInbox.interface.encodeFunctionData('addSequencerL2BatchFromBlob', [ sequenceNumber, '0x04', afterDelayedMessagesRead, @@ -443,6 +455,7 @@ describe('SequencerInbox', async () => { subMessageCount.add(1), ]) ) + console.log("d") const batchSendTx = await Toolkit4844.getTx(txHash) const blobHashes = (batchSendTx as any)['blobVersionedHashes'] as string[] From 80380224d5b807171f681fec18d33b8812824b67 Mon Sep 17 00:00:00 2001 From: Chris Buckland Date: Thu, 19 Oct 2023 14:33:15 +0200 Subject: [PATCH 149/292] lint tests --- test/contract/sequencerInbox.spec.4844.ts | 41 ++++++++++++----------- 1 file changed, 22 insertions(+), 19 deletions(-) diff --git a/test/contract/sequencerInbox.spec.4844.ts b/test/contract/sequencerInbox.spec.4844.ts index f5ef9f83..d5da602d 100644 --- a/test/contract/sequencerInbox.spec.4844.ts +++ b/test/contract/sequencerInbox.spec.4844.ts @@ -196,21 +196,21 @@ describe('SequencerInbox', async () => { let key = wallet.privateKey const wallets: Wallet[] = [] - console.log("a10") + console.log('a10') for (let index = 0; index < length; index++) { - console.log("a11", index) + console.log('a11', index) key = keccak256(key) const nextWallet = new Wallet(key).connect(wallet.provider) if ((await nextWallet.getBalance()).lt(amount)) { - console.log("a12", index) + console.log('a12', index) await ( await wallet.sendTransaction({ to: nextWallet.address, value: amount, }) ).wait() - console.log("a13", index) + console.log('a13', index) } wallets.push(nextWallet) } @@ -252,9 +252,9 @@ describe('SequencerInbox', async () => { maxDelayBlocks = 10, maxDelayTime = 0 ) => { - console.log("a1") + console.log('a1') const accounts = await fundAccounts(fundingWallet, 5, utils.parseEther('1')) - console.log("a2") + console.log('a2') const admin = accounts[0] const adminAddr = await admin.getAddress() @@ -277,7 +277,7 @@ describe('SequencerInbox', async () => { const rollupMock = await rollupMockFac.deploy( await rollupOwner.getAddress() ) - console.log("a3") + console.log('a3') const sequencerInboxFac = new SequencerInbox__factory(deployer) const seqInboxTemplate = await sequencerInboxFac.deploy(117964) @@ -416,13 +416,13 @@ describe('SequencerInbox', async () => { const privKey = 'cb5790da63720727af975f42c79f69918580209889225fa7128c92402a6d3a65' const prov = new JsonRpcProvider('http://localhost:8545') - console.log("a") + console.log('a') const wallet = new Wallet(privKey).connect(prov) const { user, inbox, bridge, messageTester, sequencerInbox, batchPoster } = await setupSequencerInbox(wallet) - console.log("b") + console.log('b') await sendDelayedTx( user, @@ -436,7 +436,7 @@ describe('SequencerInbox', async () => { BigNumber.from(10), '0x1010' ) - console.log("c") + console.log('c') const subMessageCount = await bridge.sequencerReportedSubMessageCount() const afterDelayedMessagesRead = await bridge.delayedMessageCount() @@ -446,16 +446,19 @@ describe('SequencerInbox', async () => { batchPoster.privateKey.substring(2), sequencerInbox.address, ['0x0142', '0x0143'], - sequencerInbox.interface.encodeFunctionData('addSequencerL2BatchFromBlob', [ - sequenceNumber, - '0x04', - afterDelayedMessagesRead, - constants.AddressZero, - subMessageCount, - subMessageCount.add(1), - ]) + sequencerInbox.interface.encodeFunctionData( + 'addSequencerL2BatchFromBlob', + [ + sequenceNumber, + '0x04', + afterDelayedMessagesRead, + constants.AddressZero, + subMessageCount, + subMessageCount.add(1), + ] + ) ) - console.log("d") + console.log('d') const batchSendTx = await Toolkit4844.getTx(txHash) const blobHashes = (batchSendTx as any)['blobVersionedHashes'] as string[] From 4207de15fe92dce934720656a1ea69f5b30aa041 Mon Sep 17 00:00:00 2001 From: Chris Buckland Date: Thu, 19 Oct 2023 14:41:46 +0200 Subject: [PATCH 150/292] Added test get network --- test/contract/sequencerInbox.spec.4844.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/test/contract/sequencerInbox.spec.4844.ts b/test/contract/sequencerInbox.spec.4844.ts index d5da602d..8d732922 100644 --- a/test/contract/sequencerInbox.spec.4844.ts +++ b/test/contract/sequencerInbox.spec.4844.ts @@ -417,6 +417,7 @@ describe('SequencerInbox', async () => { 'cb5790da63720727af975f42c79f69918580209889225fa7128c92402a6d3a65' const prov = new JsonRpcProvider('http://localhost:8545') console.log('a') + console.log(await prov.getNetwork()); const wallet = new Wallet(privKey).connect(prov) const { user, inbox, bridge, messageTester, sequencerInbox, batchPoster } = From 410929828aa6d3eb6a05b2a69c4b576d8cb14094 Mon Sep 17 00:00:00 2001 From: Chris Buckland Date: Thu, 19 Oct 2023 14:56:47 +0200 Subject: [PATCH 151/292] Test change --- test/contract/sequencerInbox.spec.4844.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/contract/sequencerInbox.spec.4844.ts b/test/contract/sequencerInbox.spec.4844.ts index 8d732922..788f79ff 100644 --- a/test/contract/sequencerInbox.spec.4844.ts +++ b/test/contract/sequencerInbox.spec.4844.ts @@ -252,7 +252,7 @@ describe('SequencerInbox', async () => { maxDelayBlocks = 10, maxDelayTime = 0 ) => { - console.log('a1') + console.log('a1a') const accounts = await fundAccounts(fundingWallet, 5, utils.parseEther('1')) console.log('a2') From db6c1bb7243166c28a7f2421857158330ca2365e Mon Sep 17 00:00:00 2001 From: Chris Buckland Date: Thu, 19 Oct 2023 15:07:55 +0200 Subject: [PATCH 152/292] Exec sync curl --- test/contract/sequencerInbox.spec.4844.ts | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/test/contract/sequencerInbox.spec.4844.ts b/test/contract/sequencerInbox.spec.4844.ts index 788f79ff..700cf11f 100644 --- a/test/contract/sequencerInbox.spec.4844.ts +++ b/test/contract/sequencerInbox.spec.4844.ts @@ -49,6 +49,7 @@ import { SequencerBatchDeliveredEvent, SequencerInbox, } from '../../build/types/src/bridge/SequencerInbox' +import { execSync } from 'child_process' const mineBlocks = async ( wallet: Wallet, @@ -417,7 +418,12 @@ describe('SequencerInbox', async () => { 'cb5790da63720727af975f42c79f69918580209889225fa7128c92402a6d3a65' const prov = new JsonRpcProvider('http://localhost:8545') console.log('a') - console.log(await prov.getNetwork()); + console.log( + execSync( + `curl -X POST -H 'Content-Type: application/json' -d '{"jsonrpc":"2.0","id":45678,"method":"eth_chainId","params":[]}' 'http://localhost:8547'` + ) + ) + console.log(await prov.getNetwork()) const wallet = new Wallet(privKey).connect(prov) const { user, inbox, bridge, messageTester, sequencerInbox, batchPoster } = From 617a64aaf271fcb7549f65773dfb6eff77e31d73 Mon Sep 17 00:00:00 2001 From: Chris Buckland Date: Thu, 19 Oct 2023 15:30:05 +0200 Subject: [PATCH 153/292] Updated to main --- .github/workflows/contract-tests.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/contract-tests.yml b/.github/workflows/contract-tests.yml index 63f090b4..ab950936 100644 --- a/.github/workflows/contract-tests.yml +++ b/.github/workflows/contract-tests.yml @@ -91,7 +91,7 @@ jobs: with: submodules: recursive - - uses: OffchainLabs/actions/run-nitro-test-node@test-node-args + - uses: OffchainLabs/actions/run-nitro-test-node@main with: nitro-testnode-ref: deneb-integration args: --pos From 8add810b9e690a913b89df80ba9f6baba45f2add Mon Sep 17 00:00:00 2001 From: Chris Buckland Date: Thu, 19 Oct 2023 16:35:05 +0200 Subject: [PATCH 154/292] Test use blocking branch --- .github/workflows/contract-tests.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/contract-tests.yml b/.github/workflows/contract-tests.yml index ab950936..63f090b4 100644 --- a/.github/workflows/contract-tests.yml +++ b/.github/workflows/contract-tests.yml @@ -91,7 +91,7 @@ jobs: with: submodules: recursive - - uses: OffchainLabs/actions/run-nitro-test-node@main + - uses: OffchainLabs/actions/run-nitro-test-node@test-node-args with: nitro-testnode-ref: deneb-integration args: --pos From ea835966cecdf4ec7b30e753eede669690b87d2c Mon Sep 17 00:00:00 2001 From: Chris Buckland Date: Thu, 19 Oct 2023 16:49:46 +0200 Subject: [PATCH 155/292] Test exec on 8545 --- test/contract/sequencerInbox.spec.4844.ts | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/test/contract/sequencerInbox.spec.4844.ts b/test/contract/sequencerInbox.spec.4844.ts index 700cf11f..d1c7e3e9 100644 --- a/test/contract/sequencerInbox.spec.4844.ts +++ b/test/contract/sequencerInbox.spec.4844.ts @@ -418,6 +418,11 @@ describe('SequencerInbox', async () => { 'cb5790da63720727af975f42c79f69918580209889225fa7128c92402a6d3a65' const prov = new JsonRpcProvider('http://localhost:8545') console.log('a') + console.log( + execSync( + `curl -X POST -H 'Content-Type: application/json' -d '{"jsonrpc":"2.0","id":45678,"method":"eth_chainId","params":[]}' 'http://localhost:8545'` + ) + ) console.log( execSync( `curl -X POST -H 'Content-Type: application/json' -d '{"jsonrpc":"2.0","id":45678,"method":"eth_chainId","params":[]}' 'http://localhost:8547'` From 0dffda528626ef339e1d1ffe5de6cdecc4c4c9b4 Mon Sep 17 00:00:00 2001 From: Chris Buckland Date: Thu, 19 Oct 2023 16:54:20 +0200 Subject: [PATCH 156/292] Moved up the getnetwork command --- test/contract/sequencerInbox.spec.4844.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/contract/sequencerInbox.spec.4844.ts b/test/contract/sequencerInbox.spec.4844.ts index d1c7e3e9..926f084b 100644 --- a/test/contract/sequencerInbox.spec.4844.ts +++ b/test/contract/sequencerInbox.spec.4844.ts @@ -423,12 +423,12 @@ describe('SequencerInbox', async () => { `curl -X POST -H 'Content-Type: application/json' -d '{"jsonrpc":"2.0","id":45678,"method":"eth_chainId","params":[]}' 'http://localhost:8545'` ) ) + console.log(await prov.getNetwork()) console.log( execSync( `curl -X POST -H 'Content-Type: application/json' -d '{"jsonrpc":"2.0","id":45678,"method":"eth_chainId","params":[]}' 'http://localhost:8547'` ) ) - console.log(await prov.getNetwork()) const wallet = new Wallet(privKey).connect(prov) const { user, inbox, bridge, messageTester, sequencerInbox, batchPoster } = From 1a39b7ac709b1493bca7d9f39e88d046a2fc9f86 Mon Sep 17 00:00:00 2001 From: Chris Buckland Date: Thu, 19 Oct 2023 17:00:47 +0200 Subject: [PATCH 157/292] Added additional wait --- test/contract/sequencerInbox.spec.4844.ts | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/test/contract/sequencerInbox.spec.4844.ts b/test/contract/sequencerInbox.spec.4844.ts index 926f084b..74a53fe9 100644 --- a/test/contract/sequencerInbox.spec.4844.ts +++ b/test/contract/sequencerInbox.spec.4844.ts @@ -50,6 +50,7 @@ import { SequencerInbox, } from '../../build/types/src/bridge/SequencerInbox' import { execSync } from 'child_process' +import { wait } from '@arbitrum/sdk/dist/lib/utils/lib' const mineBlocks = async ( wallet: Wallet, @@ -423,7 +424,18 @@ describe('SequencerInbox', async () => { `curl -X POST -H 'Content-Type: application/json' -d '{"jsonrpc":"2.0","id":45678,"method":"eth_chainId","params":[]}' 'http://localhost:8545'` ) ) - console.log(await prov.getNetwork()) + console.log("b1"); + while(true) { + try { + + console.log(await prov.getNetwork()) + break; + } catch(e) { + console.log("fail, try again soon") + await wait(10000); + } + + } console.log( execSync( `curl -X POST -H 'Content-Type: application/json' -d '{"jsonrpc":"2.0","id":45678,"method":"eth_chainId","params":[]}' 'http://localhost:8547'` From 381e7b0a7af730b2c958a50c22284357f7d407dc Mon Sep 17 00:00:00 2001 From: Chris Buckland Date: Thu, 19 Oct 2023 17:37:02 +0200 Subject: [PATCH 158/292] Check buffer each round --- test/contract/sequencerInbox.spec.4844.ts | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-) diff --git a/test/contract/sequencerInbox.spec.4844.ts b/test/contract/sequencerInbox.spec.4844.ts index 74a53fe9..151fb7e4 100644 --- a/test/contract/sequencerInbox.spec.4844.ts +++ b/test/contract/sequencerInbox.spec.4844.ts @@ -424,17 +424,19 @@ describe('SequencerInbox', async () => { `curl -X POST -H 'Content-Type: application/json' -d '{"jsonrpc":"2.0","id":45678,"method":"eth_chainId","params":[]}' 'http://localhost:8545'` ) ) - console.log("b1"); - while(true) { + console.log('b1') + while (true) { try { - + const res = execSync( + `curl -X POST -H 'Content-Type: application/json' -d '{"jsonrpc":"2.0","id":45678,"method":"eth_chainId","params":[]}' 'http://localhost:8545'` + ) + console.log(res.toString()); console.log(await prov.getNetwork()) - break; - } catch(e) { - console.log("fail, try again soon") - await wait(10000); + break + } catch (e) { + console.log('fail, try again soon', (e as Error).message) + await wait(10000) } - } console.log( execSync( From 1aa9861d92095ac1a4fab9a02547b012c6ffa85f Mon Sep 17 00:00:00 2001 From: Chris Buckland Date: Thu, 19 Oct 2023 17:40:30 +0200 Subject: [PATCH 159/292] Also added nitro network startup --- test/contract/sequencerInbox.spec.4844.ts | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/test/contract/sequencerInbox.spec.4844.ts b/test/contract/sequencerInbox.spec.4844.ts index 151fb7e4..f4628073 100644 --- a/test/contract/sequencerInbox.spec.4844.ts +++ b/test/contract/sequencerInbox.spec.4844.ts @@ -432,17 +432,17 @@ describe('SequencerInbox', async () => { ) console.log(res.toString()); console.log(await prov.getNetwork()) + console.log( + execSync( + `curl -X POST -H 'Content-Type: application/json' -d '{"jsonrpc":"2.0","id":45678,"method":"eth_chainId","params":[]}' 'http://localhost:8547'` + ) + ) break } catch (e) { console.log('fail, try again soon', (e as Error).message) await wait(10000) } } - console.log( - execSync( - `curl -X POST -H 'Content-Type: application/json' -d '{"jsonrpc":"2.0","id":45678,"method":"eth_chainId","params":[]}' 'http://localhost:8547'` - ) - ) const wallet = new Wallet(privKey).connect(prov) const { user, inbox, bridge, messageTester, sequencerInbox, batchPoster } = From a131c7eb2ee149d85dc2440175ed58ddbcea3bc1 Mon Sep 17 00:00:00 2001 From: Chris Buckland Date: Thu, 19 Oct 2023 17:49:38 +0200 Subject: [PATCH 160/292] Added chainid send command --- test/contract/sequencerInbox.spec.4844.ts | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/test/contract/sequencerInbox.spec.4844.ts b/test/contract/sequencerInbox.spec.4844.ts index f4628073..b252c799 100644 --- a/test/contract/sequencerInbox.spec.4844.ts +++ b/test/contract/sequencerInbox.spec.4844.ts @@ -419,18 +419,15 @@ describe('SequencerInbox', async () => { 'cb5790da63720727af975f42c79f69918580209889225fa7128c92402a6d3a65' const prov = new JsonRpcProvider('http://localhost:8545') console.log('a') - console.log( - execSync( - `curl -X POST -H 'Content-Type: application/json' -d '{"jsonrpc":"2.0","id":45678,"method":"eth_chainId","params":[]}' 'http://localhost:8545'` - ) - ) console.log('b1') while (true) { try { const res = execSync( `curl -X POST -H 'Content-Type: application/json' -d '{"jsonrpc":"2.0","id":45678,"method":"eth_chainId","params":[]}' 'http://localhost:8545'` ) - console.log(res.toString()); + console.log(res.toString()) + console.log('prov send', await prov.send('eth_chainId', [])) + console.log(await prov.getBlockNumber()) console.log(await prov.getNetwork()) console.log( execSync( From fcdf14eac6d3df32913e642bbdb115dc52c03b10 Mon Sep 17 00:00:00 2001 From: Chris Buckland Date: Thu, 19 Oct 2023 18:04:35 +0200 Subject: [PATCH 161/292] try geth network name --- test/contract/sequencerInbox.spec.4844.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/test/contract/sequencerInbox.spec.4844.ts b/test/contract/sequencerInbox.spec.4844.ts index b252c799..ee2d9238 100644 --- a/test/contract/sequencerInbox.spec.4844.ts +++ b/test/contract/sequencerInbox.spec.4844.ts @@ -426,7 +426,8 @@ describe('SequencerInbox', async () => { `curl -X POST -H 'Content-Type: application/json' -d '{"jsonrpc":"2.0","id":45678,"method":"eth_chainId","params":[]}' 'http://localhost:8545'` ) console.log(res.toString()) - console.log('prov send', await prov.send('eth_chainId', [])) + const prov2 = new JsonRpcProvider('http://geth:8545') + console.log('prov send', await prov2.send('eth_chainId', [])) console.log(await prov.getBlockNumber()) console.log(await prov.getNetwork()) console.log( From e2d019cf8a14ef85252c375f57e97e60db473648 Mon Sep 17 00:00:00 2001 From: Chris Buckland Date: Thu, 19 Oct 2023 18:20:29 +0200 Subject: [PATCH 162/292] Cat hosts --- .github/workflows/contract-tests.yml | 3 +++ test/contract/sequencerInbox.spec.4844.ts | 2 +- 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/.github/workflows/contract-tests.yml b/.github/workflows/contract-tests.yml index 63f090b4..54a7d77d 100644 --- a/.github/workflows/contract-tests.yml +++ b/.github/workflows/contract-tests.yml @@ -97,6 +97,9 @@ jobs: args: --pos no-token-bridge: true + - name: cat hosts + run: cat /etc/hosts + - name: Setup nodejs uses: actions/setup-node@v2 with: diff --git a/test/contract/sequencerInbox.spec.4844.ts b/test/contract/sequencerInbox.spec.4844.ts index ee2d9238..6d3b8596 100644 --- a/test/contract/sequencerInbox.spec.4844.ts +++ b/test/contract/sequencerInbox.spec.4844.ts @@ -426,7 +426,7 @@ describe('SequencerInbox', async () => { `curl -X POST -H 'Content-Type: application/json' -d '{"jsonrpc":"2.0","id":45678,"method":"eth_chainId","params":[]}' 'http://localhost:8545'` ) console.log(res.toString()) - const prov2 = new JsonRpcProvider('http://geth:8545') + const prov2 = new JsonRpcProvider('http://localhost:8545') console.log('prov send', await prov2.send('eth_chainId', [])) console.log(await prov.getBlockNumber()) console.log(await prov.getNetwork()) From a1cdcdb141a42c51486f2fce872178ce7fc539e7 Mon Sep 17 00:00:00 2001 From: Chris Buckland Date: Thu, 19 Oct 2023 18:22:15 +0200 Subject: [PATCH 163/292] Formatting change --- test/contract/sequencerInbox.spec.4844.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/test/contract/sequencerInbox.spec.4844.ts b/test/contract/sequencerInbox.spec.4844.ts index 6d3b8596..dc29f345 100644 --- a/test/contract/sequencerInbox.spec.4844.ts +++ b/test/contract/sequencerInbox.spec.4844.ts @@ -429,6 +429,7 @@ describe('SequencerInbox', async () => { const prov2 = new JsonRpcProvider('http://localhost:8545') console.log('prov send', await prov2.send('eth_chainId', [])) console.log(await prov.getBlockNumber()) + console.log(await prov.getNetwork()) console.log( execSync( From d9a59078cd02766cfaf8d25eb80158b2c833c776 Mon Sep 17 00:00:00 2001 From: Chris Buckland Date: Thu, 19 Oct 2023 18:24:46 +0200 Subject: [PATCH 164/292] Try with ip --- test/contract/sequencerInbox.spec.4844.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/test/contract/sequencerInbox.spec.4844.ts b/test/contract/sequencerInbox.spec.4844.ts index dc29f345..1e54cbd1 100644 --- a/test/contract/sequencerInbox.spec.4844.ts +++ b/test/contract/sequencerInbox.spec.4844.ts @@ -426,10 +426,10 @@ describe('SequencerInbox', async () => { `curl -X POST -H 'Content-Type: application/json' -d '{"jsonrpc":"2.0","id":45678,"method":"eth_chainId","params":[]}' 'http://localhost:8545'` ) console.log(res.toString()) - const prov2 = new JsonRpcProvider('http://localhost:8545') + const prov2 = new JsonRpcProvider('http://127.0.0.1:8545') console.log('prov send', await prov2.send('eth_chainId', [])) console.log(await prov.getBlockNumber()) - + console.log(await prov.getNetwork()) console.log( execSync( From dae039729245a2d96f96300ad4382994e25c7380 Mon Sep 17 00:00:00 2001 From: Chris Buckland Date: Thu, 19 Oct 2023 18:27:31 +0200 Subject: [PATCH 165/292] Remove line break --- test/contract/sequencerInbox.spec.4844.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/test/contract/sequencerInbox.spec.4844.ts b/test/contract/sequencerInbox.spec.4844.ts index 1e54cbd1..659f2f97 100644 --- a/test/contract/sequencerInbox.spec.4844.ts +++ b/test/contract/sequencerInbox.spec.4844.ts @@ -429,7 +429,6 @@ describe('SequencerInbox', async () => { const prov2 = new JsonRpcProvider('http://127.0.0.1:8545') console.log('prov send', await prov2.send('eth_chainId', [])) console.log(await prov.getBlockNumber()) - console.log(await prov.getNetwork()) console.log( execSync( From df2467a042bcde5ac12bb7dab9fe04f531031a04 Mon Sep 17 00:00:00 2001 From: Chris Buckland Date: Thu, 19 Oct 2023 18:36:32 +0200 Subject: [PATCH 166/292] Newline --- test/contract/sequencerInbox.spec.4844.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/test/contract/sequencerInbox.spec.4844.ts b/test/contract/sequencerInbox.spec.4844.ts index 659f2f97..fa0d4956 100644 --- a/test/contract/sequencerInbox.spec.4844.ts +++ b/test/contract/sequencerInbox.spec.4844.ts @@ -427,6 +427,7 @@ describe('SequencerInbox', async () => { ) console.log(res.toString()) const prov2 = new JsonRpcProvider('http://127.0.0.1:8545') + console.log('prov send', await prov2.send('eth_chainId', [])) console.log(await prov.getBlockNumber()) console.log(await prov.getNetwork()) From cb0dc4ab3432666934be7a82bde338d1df2eebca Mon Sep 17 00:00:00 2001 From: Chris Buckland Date: Thu, 19 Oct 2023 18:47:07 +0200 Subject: [PATCH 167/292] use ip instead of localhost --- test/contract/sequencerInbox.spec.4844.ts | 50 +++++++++++------------ 1 file changed, 25 insertions(+), 25 deletions(-) diff --git a/test/contract/sequencerInbox.spec.4844.ts b/test/contract/sequencerInbox.spec.4844.ts index fa0d4956..80e57d2a 100644 --- a/test/contract/sequencerInbox.spec.4844.ts +++ b/test/contract/sequencerInbox.spec.4844.ts @@ -417,31 +417,31 @@ describe('SequencerInbox', async () => { it('can send blob batch', async () => { const privKey = 'cb5790da63720727af975f42c79f69918580209889225fa7128c92402a6d3a65' - const prov = new JsonRpcProvider('http://localhost:8545') - console.log('a') - console.log('b1') - while (true) { - try { - const res = execSync( - `curl -X POST -H 'Content-Type: application/json' -d '{"jsonrpc":"2.0","id":45678,"method":"eth_chainId","params":[]}' 'http://localhost:8545'` - ) - console.log(res.toString()) - const prov2 = new JsonRpcProvider('http://127.0.0.1:8545') - - console.log('prov send', await prov2.send('eth_chainId', [])) - console.log(await prov.getBlockNumber()) - console.log(await prov.getNetwork()) - console.log( - execSync( - `curl -X POST -H 'Content-Type: application/json' -d '{"jsonrpc":"2.0","id":45678,"method":"eth_chainId","params":[]}' 'http://localhost:8547'` - ) - ) - break - } catch (e) { - console.log('fail, try again soon', (e as Error).message) - await wait(10000) - } - } + const prov = new JsonRpcProvider('http://127.0.0.1:8545') + // console.log('a') + // console.log('b1') + // while (true) { + // try { + // const res = execSync( + // `curl -X POST -H 'Content-Type: application/json' -d '{"jsonrpc":"2.0","id":45678,"method":"eth_chainId","params":[]}' 'http://localhost:8545'` + // ) + // console.log(res.toString()) + // const prov2 = new JsonRpcProvider('http://127.0.0.1:8545') + + // console.log('prov send', await prov2.send('eth_chainId', [])) + // console.log(await prov.getBlockNumber()) + // console.log(await prov.getNetwork()) + // console.log( + // execSync( + // `curl -X POST -H 'Content-Type: application/json' -d '{"jsonrpc":"2.0","id":45678,"method":"eth_chainId","params":[]}' 'http://localhost:8547'` + // ) + // ) + // break + // } catch (e) { + // console.log('fail, try again soon', (e as Error).message) + // await wait(10000) + // } + // } const wallet = new Wallet(privKey).connect(prov) const { user, inbox, bridge, messageTester, sequencerInbox, batchPoster } = From 6e86d916852baceaf6885f93e9dbafd2e619b124 Mon Sep 17 00:00:00 2001 From: Chris Buckland Date: Thu, 19 Oct 2023 18:55:06 +0200 Subject: [PATCH 168/292] Add more logging --- test/contract/sequencerInbox.spec.4844.ts | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/test/contract/sequencerInbox.spec.4844.ts b/test/contract/sequencerInbox.spec.4844.ts index 80e57d2a..14861e8e 100644 --- a/test/contract/sequencerInbox.spec.4844.ts +++ b/test/contract/sequencerInbox.spec.4844.ts @@ -486,16 +486,22 @@ describe('SequencerInbox', async () => { console.log('d') const batchSendTx = await Toolkit4844.getTx(txHash) + console.log('e') const blobHashes = (batchSendTx as any)['blobVersionedHashes'] as string[] + console.log('f') const batchSendReceipt = await Toolkit4844.getTxReceipt(txHash) + console.log('g') const { timestamp: blockTimestamp, number: blockNumber } = await wallet.provider.getBlock(batchSendReceipt.blockNumber) + console.log('h') const timeBounds = await getTimeBounds( blockNumber, blockTimestamp, sequencerInbox ) + console.log('i') + const dataHash = formDataBlobHash( timeBounds, afterDelayedMessagesRead.toNumber(), @@ -513,23 +519,28 @@ describe('SequencerInbox', async () => { (l: any) => sequencerInbox.interface.parseLog(l).args )[0] as SequencerBatchDeliveredEvent['args'] + console.log('j') const seqMessageCountAfter = ( await bridge.sequencerMessageCount() ).toNumber() + console.log('k') const delayedMessageCountAfter = ( await bridge.delayedMessageCount() ).toNumber() + console.log('l') const beforeAcc = seqMessageCountAfter > 1 ? await bridge.sequencerInboxAccs(seqMessageCountAfter - 2) : constants.HashZero expect(batchDeliveredEvent.beforeAcc, 'before acc').to.eq(beforeAcc) + console.log('m') const delayedAcc = delayedMessageCountAfter > 0 ? await bridge.delayedInboxAccs(delayedMessageCountAfter - 1) : constants.HashZero expect(batchDeliveredEvent.delayedAcc, 'delayed acc').to.eq(delayedAcc) + console.log('n') const afterAcc = solidityKeccak256( ['bytes32', 'bytes32', 'bytes32'], [beforeAcc, dataHash, delayedAcc] From 14a6af5ea0b0152fd7485977e95110176d0783ed Mon Sep 17 00:00:00 2001 From: Chris Buckland Date: Thu, 19 Oct 2023 19:01:45 +0200 Subject: [PATCH 169/292] Try localhost --- test/contract/sequencerInbox.spec.4844.ts | 2 +- test/contract/toolkit4844.ts | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/test/contract/sequencerInbox.spec.4844.ts b/test/contract/sequencerInbox.spec.4844.ts index 14861e8e..b8d647d7 100644 --- a/test/contract/sequencerInbox.spec.4844.ts +++ b/test/contract/sequencerInbox.spec.4844.ts @@ -378,7 +378,7 @@ describe('SequencerInbox', async () => { it('can send normal batch', async () => { const privKey = 'cb5790da63720727af975f42c79f69918580209889225fa7128c92402a6d3a65' - const prov = new JsonRpcProvider('http://localhost:8545') + const prov = new JsonRpcProvider('http://127.0.0.1:8545') const wallet = new Wallet(privKey).connect(prov) const { user, inbox, bridge, messageTester, sequencerInbox, batchPoster } = diff --git a/test/contract/toolkit4844.ts b/test/contract/toolkit4844.ts index a0bafdc4..b5554eb1 100644 --- a/test/contract/toolkit4844.ts +++ b/test/contract/toolkit4844.ts @@ -108,7 +108,7 @@ export class Toolkit4844 { data: string ) { const blobStr = blobs.reduce((acc, blob) => acc + ' -b ' + blob, '') - const blobCommand = `docker run --network=nitro-testnode_default ethpandaops/goomy-blob:master blob-sender -p ${privKey} -r http://geth:8545 -t ${to} -d ${data} --gaslimit 1000000${blobStr} 2>&1` + const blobCommand = `docker run --network=nitro-testnode_default ethpandaops/goomy-blob:master blob-sender -p ${privKey} -r http://127.0.0.1:8545 -t ${to} -d ${data} --gaslimit 1000000${blobStr} 2>&1` const res = execSync(blobCommand).toString() const txHashRegex = /0x[a-fA-F0-9]{64}/ const match = res.match(txHashRegex) From e4832219c93e89957e2d0d86e8a6f90e53ba1457 Mon Sep 17 00:00:00 2001 From: Chris Buckland Date: Thu, 19 Oct 2023 19:12:39 +0200 Subject: [PATCH 170/292] Use ip instead of localhost --- test/contract/toolkit4844.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/test/contract/toolkit4844.ts b/test/contract/toolkit4844.ts index b5554eb1..5e4340ba 100644 --- a/test/contract/toolkit4844.ts +++ b/test/contract/toolkit4844.ts @@ -23,7 +23,7 @@ export class Toolkit4844 { public static postDataToGeth(body: any): Promise { return new Promise((resolve, reject) => { const options = { - hostname: 'localhost', + hostname: '127.0.0.1', port: 8545, path: '/', method: 'POST', @@ -108,7 +108,7 @@ export class Toolkit4844 { data: string ) { const blobStr = blobs.reduce((acc, blob) => acc + ' -b ' + blob, '') - const blobCommand = `docker run --network=nitro-testnode_default ethpandaops/goomy-blob:master blob-sender -p ${privKey} -r http://127.0.0.1:8545 -t ${to} -d ${data} --gaslimit 1000000${blobStr} 2>&1` + const blobCommand = `docker run --network=nitro-testnode_default ethpandaops/goomy-blob:master blob-sender -p ${privKey} -r http://geth:8545 -t ${to} -d ${data} --gaslimit 1000000${blobStr} 2>&1` const res = execSync(blobCommand).toString() const txHashRegex = /0x[a-fA-F0-9]{64}/ const match = res.match(txHashRegex) From 1a513cecdf4a9d96b3f23b0f86c61f42e622905d Mon Sep 17 00:00:00 2001 From: Chris Buckland Date: Thu, 19 Oct 2023 19:23:02 +0200 Subject: [PATCH 171/292] Added data field to hash --- test/contract/sequencerInbox.spec.4844.ts | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/test/contract/sequencerInbox.spec.4844.ts b/test/contract/sequencerInbox.spec.4844.ts index b8d647d7..d69366af 100644 --- a/test/contract/sequencerInbox.spec.4844.ts +++ b/test/contract/sequencerInbox.spec.4844.ts @@ -493,7 +493,7 @@ describe('SequencerInbox', async () => { console.log('g') const { timestamp: blockTimestamp, number: blockNumber } = await wallet.provider.getBlock(batchSendReceipt.blockNumber) - console.log('h') + console.log('h') const timeBounds = await getTimeBounds( blockNumber, @@ -519,7 +519,7 @@ describe('SequencerInbox', async () => { (l: any) => sequencerInbox.interface.parseLog(l).args )[0] as SequencerBatchDeliveredEvent['args'] - console.log('j') + console.log('j') const seqMessageCountAfter = ( await bridge.sequencerMessageCount() ).toNumber() @@ -596,8 +596,8 @@ describe('SequencerInbox', async () => { return keccak256( solidityPack( - ['bytes', 'bytes'], - [header, solidityPack(['bytes32[]'], [blobHashes])] + ['bytes', 'bytes', 'bytes'], + [header, '0x04', solidityPack(['bytes32[]'], [blobHashes])] ) ) } From 12a5c7922ca2a419b74f216b320e721562c70bcc Mon Sep 17 00:00:00 2001 From: Chris Buckland Date: Fri, 20 Oct 2023 11:46:31 +0200 Subject: [PATCH 172/292] Remove console logging --- test/contract/sequencerInbox.spec.4844.ts | 50 ----------------------- 1 file changed, 50 deletions(-) diff --git a/test/contract/sequencerInbox.spec.4844.ts b/test/contract/sequencerInbox.spec.4844.ts index d69366af..6f934222 100644 --- a/test/contract/sequencerInbox.spec.4844.ts +++ b/test/contract/sequencerInbox.spec.4844.ts @@ -198,21 +198,16 @@ describe('SequencerInbox', async () => { let key = wallet.privateKey const wallets: Wallet[] = [] - console.log('a10') - for (let index = 0; index < length; index++) { - console.log('a11', index) key = keccak256(key) const nextWallet = new Wallet(key).connect(wallet.provider) if ((await nextWallet.getBalance()).lt(amount)) { - console.log('a12', index) await ( await wallet.sendTransaction({ to: nextWallet.address, value: amount, }) ).wait() - console.log('a13', index) } wallets.push(nextWallet) } @@ -254,9 +249,7 @@ describe('SequencerInbox', async () => { maxDelayBlocks = 10, maxDelayTime = 0 ) => { - console.log('a1a') const accounts = await fundAccounts(fundingWallet, 5, utils.parseEther('1')) - console.log('a2') const admin = accounts[0] const adminAddr = await admin.getAddress() @@ -279,8 +272,6 @@ describe('SequencerInbox', async () => { const rollupMock = await rollupMockFac.deploy( await rollupOwner.getAddress() ) - console.log('a3') - const sequencerInboxFac = new SequencerInbox__factory(deployer) const seqInboxTemplate = await sequencerInboxFac.deploy(117964) @@ -418,37 +409,11 @@ describe('SequencerInbox', async () => { const privKey = 'cb5790da63720727af975f42c79f69918580209889225fa7128c92402a6d3a65' const prov = new JsonRpcProvider('http://127.0.0.1:8545') - // console.log('a') - // console.log('b1') - // while (true) { - // try { - // const res = execSync( - // `curl -X POST -H 'Content-Type: application/json' -d '{"jsonrpc":"2.0","id":45678,"method":"eth_chainId","params":[]}' 'http://localhost:8545'` - // ) - // console.log(res.toString()) - // const prov2 = new JsonRpcProvider('http://127.0.0.1:8545') - - // console.log('prov send', await prov2.send('eth_chainId', [])) - // console.log(await prov.getBlockNumber()) - // console.log(await prov.getNetwork()) - // console.log( - // execSync( - // `curl -X POST -H 'Content-Type: application/json' -d '{"jsonrpc":"2.0","id":45678,"method":"eth_chainId","params":[]}' 'http://localhost:8547'` - // ) - // ) - // break - // } catch (e) { - // console.log('fail, try again soon', (e as Error).message) - // await wait(10000) - // } - // } const wallet = new Wallet(privKey).connect(prov) const { user, inbox, bridge, messageTester, sequencerInbox, batchPoster } = await setupSequencerInbox(wallet) - console.log('b') - await sendDelayedTx( user, inbox, @@ -461,8 +426,6 @@ describe('SequencerInbox', async () => { BigNumber.from(10), '0x1010' ) - console.log('c') - const subMessageCount = await bridge.sequencerReportedSubMessageCount() const afterDelayedMessagesRead = await bridge.delayedMessageCount() const sequenceNumber = await bridge.sequencerMessageCount() @@ -483,25 +446,17 @@ describe('SequencerInbox', async () => { ] ) ) - console.log('d') - const batchSendTx = await Toolkit4844.getTx(txHash) - console.log('e') const blobHashes = (batchSendTx as any)['blobVersionedHashes'] as string[] - console.log('f') const batchSendReceipt = await Toolkit4844.getTxReceipt(txHash) - console.log('g') const { timestamp: blockTimestamp, number: blockNumber } = await wallet.provider.getBlock(batchSendReceipt.blockNumber) - console.log('h') const timeBounds = await getTimeBounds( blockNumber, blockTimestamp, sequencerInbox ) - console.log('i') - const dataHash = formDataBlobHash( timeBounds, afterDelayedMessagesRead.toNumber(), @@ -519,28 +474,23 @@ describe('SequencerInbox', async () => { (l: any) => sequencerInbox.interface.parseLog(l).args )[0] as SequencerBatchDeliveredEvent['args'] - console.log('j') const seqMessageCountAfter = ( await bridge.sequencerMessageCount() ).toNumber() - console.log('k') const delayedMessageCountAfter = ( await bridge.delayedMessageCount() ).toNumber() - console.log('l') const beforeAcc = seqMessageCountAfter > 1 ? await bridge.sequencerInboxAccs(seqMessageCountAfter - 2) : constants.HashZero expect(batchDeliveredEvent.beforeAcc, 'before acc').to.eq(beforeAcc) - console.log('m') const delayedAcc = delayedMessageCountAfter > 0 ? await bridge.delayedInboxAccs(delayedMessageCountAfter - 1) : constants.HashZero expect(batchDeliveredEvent.delayedAcc, 'delayed acc').to.eq(delayedAcc) - console.log('n') const afterAcc = solidityKeccak256( ['bytes32', 'bytes32', 'bytes32'], [beforeAcc, dataHash, delayedAcc] From dcb32a31f3e2113bfd2c35207bd10c8b3793b658 Mon Sep 17 00:00:00 2001 From: Chris Buckland Date: Fri, 20 Oct 2023 12:01:31 +0200 Subject: [PATCH 173/292] Try localhost --- test/contract/sequencerInbox.spec.4844.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/contract/sequencerInbox.spec.4844.ts b/test/contract/sequencerInbox.spec.4844.ts index 6f934222..f6db6ee1 100644 --- a/test/contract/sequencerInbox.spec.4844.ts +++ b/test/contract/sequencerInbox.spec.4844.ts @@ -408,7 +408,7 @@ describe('SequencerInbox', async () => { it('can send blob batch', async () => { const privKey = 'cb5790da63720727af975f42c79f69918580209889225fa7128c92402a6d3a65' - const prov = new JsonRpcProvider('http://127.0.0.1:8545') + const prov = new JsonRpcProvider('http://localhost:8545') const wallet = new Wallet(privKey).connect(prov) const { user, inbox, bridge, messageTester, sequencerInbox, batchPoster } = From 2307dbd3fd2c5d16ed8aa2138ae4f295d05da4dd Mon Sep 17 00:00:00 2001 From: Chris Buckland Date: Fri, 20 Oct 2023 12:04:08 +0200 Subject: [PATCH 174/292] Remove cat hosts --- .github/workflows/contract-tests.yml | 3 --- test/contract/sequencerInbox.spec.4844.ts | 2 +- 2 files changed, 1 insertion(+), 4 deletions(-) diff --git a/.github/workflows/contract-tests.yml b/.github/workflows/contract-tests.yml index 54a7d77d..63f090b4 100644 --- a/.github/workflows/contract-tests.yml +++ b/.github/workflows/contract-tests.yml @@ -97,9 +97,6 @@ jobs: args: --pos no-token-bridge: true - - name: cat hosts - run: cat /etc/hosts - - name: Setup nodejs uses: actions/setup-node@v2 with: diff --git a/test/contract/sequencerInbox.spec.4844.ts b/test/contract/sequencerInbox.spec.4844.ts index f6db6ee1..6f934222 100644 --- a/test/contract/sequencerInbox.spec.4844.ts +++ b/test/contract/sequencerInbox.spec.4844.ts @@ -408,7 +408,7 @@ describe('SequencerInbox', async () => { it('can send blob batch', async () => { const privKey = 'cb5790da63720727af975f42c79f69918580209889225fa7128c92402a6d3a65' - const prov = new JsonRpcProvider('http://localhost:8545') + const prov = new JsonRpcProvider('http://127.0.0.1:8545') const wallet = new Wallet(privKey).connect(prov) const { user, inbox, bridge, messageTester, sequencerInbox, batchPoster } = From 487ce123ab94e17abeb93c31e7334ab97551784b Mon Sep 17 00:00:00 2001 From: Chris Buckland Date: Fri, 20 Oct 2023 17:07:03 +0200 Subject: [PATCH 175/292] Added base fee reader --- src/bridge/BlobBasefeeReader.yul | 20 ++++ src/bridge/DataHashesReader.yul | 1 - src/bridge/ISequencerInbox.sol | 9 +- src/bridge/SequencerInbox.sol | 108 +++++++++++++--------- src/rollup/BridgeCreator.sol | 10 +- src/rollup/RollupCreator.sol | 4 +- test/contract/arbRollup.spec.ts | 1 + test/contract/sequencerInbox.spec.4844.ts | 64 +++++++++++-- test/contract/toolkit4844.ts | 46 ++++++++- test/foundry/BridgeCreator.t.sol | 7 +- 10 files changed, 210 insertions(+), 60 deletions(-) create mode 100644 src/bridge/BlobBasefeeReader.yul diff --git a/src/bridge/BlobBasefeeReader.yul b/src/bridge/BlobBasefeeReader.yul new file mode 100644 index 00000000..de12c8e2 --- /dev/null +++ b/src/bridge/BlobBasefeeReader.yul @@ -0,0 +1,20 @@ + +object "BlobBasefeeReader" { + code { + datacopy(0, dataoffset("runtime"), datasize("runtime")) + return(0, datasize("runtime")) + } + object "runtime" { + code { + // Match against the keccak of the ABI function signature needed. + switch shr(0xe0,calldataload(0)) + // bytes4(keccak("getBlobBaseFee()")) + case 0x1f6d6ef7 { + // BLOBBASEFEE opcode has hex value 0x4a + let blobBasefee := verbatim_0i_1o(hex"4a") + mstore(0, blobBasefee) + return(0, 32) + } + } + } +} \ No newline at end of file diff --git a/src/bridge/DataHashesReader.yul b/src/bridge/DataHashesReader.yul index eeca3cb2..90e736f9 100644 --- a/src/bridge/DataHashesReader.yul +++ b/src/bridge/DataHashesReader.yul @@ -9,7 +9,6 @@ object "DataHashesReader" { // Match against the keccak of the ABI function signature needed. switch shr(0xe0,calldataload(0)) // bytes4(keccak("getDataHashes()")) - // case 0x46115383 - submit batch case 0xe83a2d82 { // DATAHASH opcode has hex value 0x49 let i := 0 diff --git a/src/bridge/ISequencerInbox.sol b/src/bridge/ISequencerInbox.sol index 4cacde91..80b70fab 100644 --- a/src/bridge/ISequencerInbox.sol +++ b/src/bridge/ISequencerInbox.sol @@ -180,11 +180,16 @@ interface ISequencerInbox is IDelayedMessageProvider { function initialize( IBridge bridge_, MaxTimeVariation calldata maxTimeVariation_, - IDataHashReader dataHashReader_ + IDataHashReader dataHashReader_, + IBlobBasefeeReader blobBasefeeReader_ ) external; } -// CHRIS: TODO: where to put this? +// CHRIS: TODO: where to put these? interface IDataHashReader { function getDataHashes() external view returns (bytes32[] memory); } + +interface IBlobBasefeeReader { + function getBlobBaseFee() external view returns (uint256); +} diff --git a/src/bridge/SequencerInbox.sol b/src/bridge/SequencerInbox.sol index 874fd199..aa72cd09 100644 --- a/src/bridge/SequencerInbox.sol +++ b/src/bridge/SequencerInbox.sol @@ -66,6 +66,7 @@ contract SequencerInbox is DelegateCallAware, GasRefundEnabled, ISequencerInbox mapping(address => bool) public isSequencer; IDataHashReader dataHashReader; + IBlobBasefeeReader blobBasefeeReader; // On L1 this should be set to 117964: 90% of Geth's 128KB tx size limit, leaving ~13KB for proving uint256 public immutable maxDataSize; @@ -84,7 +85,8 @@ contract SequencerInbox is DelegateCallAware, GasRefundEnabled, ISequencerInbox function initialize( IBridge bridge_, ISequencerInbox.MaxTimeVariation calldata maxTimeVariation_, - IDataHashReader dataHashReader_ + IDataHashReader dataHashReader_, + IBlobBasefeeReader blobBasefeeReader_ ) external onlyDelegated { if (bridge != IBridge(address(0))) revert AlreadyInit(); if (bridge_ == IBridge(address(0))) revert HadZeroInit(); @@ -93,6 +95,7 @@ contract SequencerInbox is DelegateCallAware, GasRefundEnabled, ISequencerInbox maxTimeVariation = maxTimeVariation_; // CHRIS: TODO: check that this is not empty? dataHashReader = dataHashReader_; + blobBasefeeReader = blobBasefeeReader_; } function getTimeBounds() internal view virtual returns (TimeBounds memory) { @@ -203,6 +206,11 @@ contract SequencerInbox is DelegateCallAware, GasRefundEnabled, ISequencerInbox ); } + // CHRIS: TODO: remove this + function getBlobBasefee() public view returns (uint256) { + return blobBasefeeReader.getBlobBaseFee(); + } + function addSequencerL2BatchFromOrigin( uint256 sequenceNumber, bytes calldata data, @@ -349,9 +357,12 @@ contract SequencerInbox is DelegateCallAware, GasRefundEnabled, ISequencerInbox prevMessageCount, newMessageCount ); - if (dataLocation == BatchDataLocation.TxInput || dataLocation == BatchDataLocation.Blob) { - submitBatchSpendingReport(dataHash, seqMessageIndex, dataLocation); + if (dataLocation == BatchDataLocation.TxInput) { + submitTxInputBatchSpendingReport(dataHash, seqMessageIndex); + } else if (dataLocation == BatchDataLocation.Blob) { + submitBlobBatchSpendingReport(dataHash, seqMessageIndex); } + if (seqMessageIndex != sequenceNumber && sequenceNumber != ~uint256(0)) { revert BadSequencerNumber(seqMessageIndex, sequenceNumber); } @@ -367,50 +378,61 @@ contract SequencerInbox is DelegateCallAware, GasRefundEnabled, ISequencerInbox ); } - function submitBatchSpendingReport( - bytes32 dataHash, - uint256 seqMessageIndex, - BatchDataLocation bType - ) internal { - if (bType == BatchDataLocation.TxInput) { - // this msg isn't included in the current sequencer batch, but instead added to - // the delayed messages queue that is yet to be included - address batchPoster = msg.sender; - bytes memory spendingReportMsg; - if (hostChainIsArbitrum) { - // Include extra gas for the host chain's L1 gas charging - uint256 l1Fees = ArbGasInfo(address(0x6c)).getCurrentTxL1GasFees(); - uint256 extraGas = l1Fees / block.basefee; - require(extraGas <= type(uint64).max, "L1_GAS_NOT_UINT64"); - spendingReportMsg = abi.encodePacked( - block.timestamp, - batchPoster, - dataHash, - seqMessageIndex, - block.basefee, - uint64(extraGas) - ); - } else { - spendingReportMsg = abi.encodePacked( - block.timestamp, - batchPoster, - dataHash, - seqMessageIndex, - block.basefee - ); - } - uint256 msgNum = bridge.submitBatchSpendingReport( + function submitTxInputBatchSpendingReport(bytes32 dataHash, uint256 seqMessageIndex) internal { + // this msg isn't included in the current sequencer batch, but instead added to + // the delayed messages queue that is yet to be included + address batchPoster = msg.sender; + bytes memory spendingReportMsg; + if (hostChainIsArbitrum) { + // Include extra gas for the host chain's L1 gas charging + uint256 l1Fees = ArbGasInfo(address(0x6c)).getCurrentTxL1GasFees(); + uint256 extraGas = l1Fees / block.basefee; + require(extraGas <= type(uint64).max, "L1_GAS_NOT_UINT64"); + spendingReportMsg = abi.encodePacked( + block.timestamp, batchPoster, - keccak256(spendingReportMsg) + dataHash, + seqMessageIndex, + block.basefee, + uint64(extraGas) ); - // this is the same event used by Inbox.sol after including a message to the delayed message accumulator - emit InboxMessageDelivered(msgNum, spendingReportMsg); - } else if (bType == BatchDataLocation.Blob) { - // CHRIS: TODO: add blob charging report } else { - // CHRIS: TODO: add custom error - revert("Unrecognised batch data type"); + spendingReportMsg = abi.encodePacked( + block.timestamp, + batchPoster, + dataHash, + seqMessageIndex, + block.basefee + ); } + uint256 msgNum = bridge.submitBatchSpendingReport( + batchPoster, + keccak256(spendingReportMsg) + ); + // this is the same event used by Inbox.sol after including a message to the delayed message accumulator + emit InboxMessageDelivered(msgNum, spendingReportMsg); + } + + function submitBlobBatchSpendingReport(bytes32 dataHash, uint256 seqMessageIndex) internal { + // this msg isn't included in the current sequencer batch, but instead added to + // the delayed messages queue that is yet to be included + address batchPoster = tx.origin; + uint256 blobBasefee = blobBasefeeReader.getBlobBaseFee(); + // CHRIS: TODO: custom error + require(!hostChainIsArbitrum, "Unsupported blob transaction"); + bytes memory spendingReportMsg = abi.encodePacked( + block.timestamp, + batchPoster, + dataHash, + seqMessageIndex, + blobBasefee + ); + uint256 msgNum = bridge.submitBatchSpendingReport( + batchPoster, + keccak256(spendingReportMsg) + ); + // this is the same event used by Inbox.sol after including a message to the delayed message accumulator + emit InboxMessageDelivered(msgNum, spendingReportMsg); } // CHRIS: TODO: docs and inline it? diff --git a/src/rollup/BridgeCreator.sol b/src/rollup/BridgeCreator.sol index fe0450f2..b085f143 100644 --- a/src/rollup/BridgeCreator.sol +++ b/src/rollup/BridgeCreator.sol @@ -83,7 +83,8 @@ contract BridgeCreator is Ownable { address rollup, address nativeToken, ISequencerInbox.MaxTimeVariation calldata maxTimeVariation, - IDataHashReader dataHashReader + IDataHashReader dataHashReader, + IBlobBasefeeReader blobBasefeeReader ) external returns (BridgeContracts memory) { // create ETH-based bridge if address zero is provided for native token, otherwise create ERC20-based bridge BridgeContracts memory frame = _createBridge( @@ -97,7 +98,12 @@ contract BridgeCreator is Ownable { } else { IERC20Bridge(address(frame.bridge)).initialize(IOwnable(rollup), nativeToken); } - frame.sequencerInbox.initialize(frame.bridge, maxTimeVariation, dataHashReader); + frame.sequencerInbox.initialize( + frame.bridge, + maxTimeVariation, + dataHashReader, + blobBasefeeReader + ); frame.inbox.initialize(frame.bridge, frame.sequencerInbox); frame.rollupEventInbox.initialize(frame.bridge); frame.outbox.initialize(frame.bridge); diff --git a/src/rollup/RollupCreator.sol b/src/rollup/RollupCreator.sol index 955c9696..a357e28c 100644 --- a/src/rollup/RollupCreator.sol +++ b/src/rollup/RollupCreator.sol @@ -42,6 +42,7 @@ contract RollupCreator is Ownable { bool deployFactoriesToL2; uint256 maxFeePerGasForRetryables; IDataHashReader dataHashReader; + IBlobBasefeeReader blobBasefeeReader; } BridgeCreator public bridgeCreator; @@ -139,7 +140,8 @@ contract RollupCreator is Ownable { address(rollup), deployParams.nativeToken, deployParams.config.sequencerInboxMaxTimeVariation, - deployParams.dataHashReader + deployParams.dataHashReader, + deployParams.blobBasefeeReader ); IChallengeManager challengeManager = IChallengeManager( diff --git a/test/contract/arbRollup.spec.ts b/test/contract/arbRollup.spec.ts index b2e1927c..e7b98fe5 100644 --- a/test/contract/arbRollup.spec.ts +++ b/test/contract/arbRollup.spec.ts @@ -281,6 +281,7 @@ const setup = async () => { deployFactoriesToL2: true, maxFeePerGasForRetryables: maxFeePerGas, dataHashReader: ethers.constants.AddressZero, + blobBasefeeReader: ethers.constants.AddressZero } const response = await rollupCreator.createRollup(deployParams, { diff --git a/test/contract/sequencerInbox.spec.4844.ts b/test/contract/sequencerInbox.spec.4844.ts index 6f934222..645ff6e6 100644 --- a/test/contract/sequencerInbox.spec.4844.ts +++ b/test/contract/sequencerInbox.spec.4844.ts @@ -23,7 +23,7 @@ import { JsonRpcProvider, TransactionReceipt, } from '@ethersproject/providers' -import { expect } from 'chai' +import { expect, util } from 'chai' import { Bridge, Bridge__factory, @@ -51,6 +51,7 @@ import { } from '../../build/types/src/bridge/SequencerInbox' import { execSync } from 'child_process' import { wait } from '@arbitrum/sdk/dist/lib/utils/lib' +import { InboxMessageDeliveredEvent } from '../../build/types/src/bridge/AbsInbox' const mineBlocks = async ( wallet: Wallet, @@ -261,10 +262,10 @@ describe('SequencerInbox', async () => { // update the addresses below and uncomment to avoid redeploying // return connectAddreses(user, deployer, batchPoster, { // user: '0x870204e93ca485a6676E264EB0d7df4cD0246203', - // bridge: '0x960aB1A4858a1CBd3cf75E9a6a16A3C40E1D231e', - // inbox: '0xe763a2bB11c38aB41735D7bB24E98a0662687478', - // sequencerInbox: '0xe187f8f751a4d5860d96f99c6D1e1f5c557128ac', - // messageTester: '0xc1D13079aaC7Bbc399ca14308206d5B87Ae8F3BA', + // bridge: '0xF224c1d7cC177f24450aC1bD073EA6A83B479A84', + // inbox: '0x30a12d427dA40881c9aE54e59B3bA5187A032e35', + // sequencerInbox: '0xD3E7FB00e1341D2621ff9fC7757639107B5A8F1E', + // messageTester: '0x55226aAfa122128D63f9d9612209F9a3f53bb437', // batchPoster: '0x328375c90F01Dcb114888DA36e3832F69Ad0BB57', // }) @@ -309,6 +310,9 @@ describe('SequencerInbox', async () => { await sequencerInboxProxy.deployed() await inboxProxy.deployed() const dataHashReader = await Toolkit4844.deployDataHashReader(fundingWallet) + const blobBasefeeReader = await Toolkit4844.deployBlobBasefeeReader( + fundingWallet + ) const bridge = await bridgeFac.attach(bridgeProxy.address).connect(user) const bridgeAdmin = await bridgeFac @@ -330,7 +334,8 @@ describe('SequencerInbox', async () => { futureBlocks: 10, futureSeconds: 3000, }, - dataHashReader.address + dataHashReader.address, + blobBasefeeReader.address ) ).wait() await ( @@ -405,7 +410,7 @@ describe('SequencerInbox', async () => { await batchSendTx.wait() }) - it('can send blob batch', async () => { + it.only('can send blob batch', async () => { const privKey = 'cb5790da63720727af975f42c79f69918580209889225fa7128c92402a6d3a65' const prov = new JsonRpcProvider('http://127.0.0.1:8545') @@ -481,14 +486,16 @@ describe('SequencerInbox', async () => { await bridge.delayedMessageCount() ).toNumber() + // -2 since we add a message to the from the sequencer inbox const beforeAcc = seqMessageCountAfter > 1 ? await bridge.sequencerInboxAccs(seqMessageCountAfter - 2) : constants.HashZero expect(batchDeliveredEvent.beforeAcc, 'before acc').to.eq(beforeAcc) + // -2 since we add the batch spending report const delayedAcc = delayedMessageCountAfter > 0 - ? await bridge.delayedInboxAccs(delayedMessageCountAfter - 1) + ? await bridge.delayedInboxAccs(delayedMessageCountAfter - 2) : constants.HashZero expect(batchDeliveredEvent.delayedAcc, 'delayed acc').to.eq(delayedAcc) const afterAcc = solidityKeccak256( @@ -496,6 +503,47 @@ describe('SequencerInbox', async () => { [beforeAcc, dataHash, delayedAcc] ) expect(batchDeliveredEvent.afterAcc, 'after acc').to.eq(afterAcc) + + // check the spending report was submitted + const inboxMsgDeliveredEvent = batchSendReceipt.logs + .filter( + (b: any) => + b.address.toLowerCase() === sequencerInbox.address.toLowerCase() && + b.topics[0] === + sequencerInbox.interface.getEventTopic('InboxMessageDelivered') + ) + .map( + (l: any) => sequencerInbox.interface.parseLog(l).args + )[0] as InboxMessageDeliveredEvent['args'] + + const spendingTimestamp = + '0x' + inboxMsgDeliveredEvent.data.substring(2, 66) + const spendingBatchPoster = + '0x' + inboxMsgDeliveredEvent.data.substring(66, 106) + const spendingDataHash = + '0x' + inboxMsgDeliveredEvent.data.substring(106, 170) + const spendingSeqMessageIndex = + '0x' + inboxMsgDeliveredEvent.data.substring(170, 234) + const spendingBlobBasefee = + '0x' + inboxMsgDeliveredEvent.data.substring(234, 298) + + expect( + BigNumber.from(spendingTimestamp).eq(blockTimestamp), + 'spending timestamp' + ).to.eq(true) + expect(spendingBatchPoster.toLowerCase(), 'spending batch poster').to.eq( + (await batchPoster.getAddress()).toLowerCase() + ) + expect(spendingDataHash, 'spending data hash').to.eq(dataHash) + expect( + BigNumber.from(spendingSeqMessageIndex).eq(sequenceNumber), + 'spending seq message index' + ).to.eq(true) + // we expect a very low - 1 - basefee since we havent sent many blobs + expect( + BigNumber.from(spendingBlobBasefee).eq(1), + `spending blob basefee: ${BigNumber.from(spendingBlobBasefee).toString()}` + ).to.eq(true) }) const getTimeBounds = async ( diff --git a/test/contract/toolkit4844.ts b/test/contract/toolkit4844.ts index 5e4340ba..6bcaed69 100644 --- a/test/contract/toolkit4844.ts +++ b/test/contract/toolkit4844.ts @@ -1,7 +1,13 @@ import { execSync } from 'child_process' import { ContractFactory, Signer, Wallet, ethers } from 'ethers' import * as http from 'http' -import { IDataHashReader, IDataHashReader__factory } from '../../build/types' +import { + IBlobBasefeeReader, + IBlobBasefeeReader__factory, + IDataHashReader, + IDataHashReader__factory, +} from '../../build/types' +import { JsonRpcProvider } from '@ethersproject/providers' const dataHashReaderJson = { _format: 'hh-sol-artifact-1', @@ -14,6 +20,17 @@ const dataHashReaderJson = { deployedLinkReferences: {}, } +const blobBasefeeReaderJson = { + _format: 'hh-sol-artifact-1', + contractName: 'BlobBasefeeReader', + sourceName: 'src/bridge/BlobBasefeeReader.yul', + abi: [], + bytecode: + '0x601780600a5f395ff3fe5f3560e01c631f6d6ef714600f57005b4a5f5260205ff3', + linkReferences: {}, + deployedLinkReferences: {}, +} + const wait = async (ms: number) => new Promise((res, rej) => { setTimeout(res, ms) @@ -101,6 +118,16 @@ export class Toolkit4844 { return Boolean(match) } + public static async waitUntilBlockMined( + blockNumber: number, + provider: JsonRpcProvider + ) { + while (true) { + if ((await provider.getBlockNumber()) > blockNumber) return + await wait(300) + } + } + public static async sendBlobTx( privKey: string, to: string, @@ -133,4 +160,21 @@ export class Toolkit4844 { return IDataHashReader__factory.connect(dataHashReader.address, wallet) } + + public static async deployBlobBasefeeReader( + wallet: Signer + ): Promise { + const contractFactory = new ContractFactory( + blobBasefeeReaderJson.abi, + blobBasefeeReaderJson.bytecode, + wallet + ) + const blobBasefeeReader = await contractFactory.deploy() + await blobBasefeeReader.deployed() + + return IBlobBasefeeReader__factory.connect( + blobBasefeeReader.address, + wallet + ) + } } diff --git a/test/foundry/BridgeCreator.t.sol b/test/foundry/BridgeCreator.t.sol index 75732853..a53c4d71 100644 --- a/test/foundry/BridgeCreator.t.sol +++ b/test/foundry/BridgeCreator.t.sol @@ -14,6 +14,7 @@ contract BridgeCreatorTest is Test { address public owner = address(100); uint256 public constant MAX_DATA_SIZE = 117_964; IDataHashReader dummyDataHashReader = IDataHashReader(address(137)); + IBlobBasefeeReader dummyBlobBasefeeReader = IBlobBasefeeReader(address(138)); BridgeCreator.BridgeContracts ethBasedTemplates = BridgeCreator.BridgeContracts({ @@ -129,7 +130,8 @@ contract BridgeCreatorTest is Test { rollup, nativeToken, timeVars, - dummyDataHashReader + dummyDataHashReader, + dummyBlobBasefeeReader ); ( IBridge bridge, @@ -201,7 +203,8 @@ contract BridgeCreatorTest is Test { rollup, nativeToken, timeVars, - dummyDataHashReader + dummyDataHashReader, + dummyBlobBasefeeReader ); ( IBridge bridge, From 21757edbd4b6937b9b7ac223a532cf5cf7d268a7 Mon Sep 17 00:00:00 2001 From: Chris Buckland Date: Mon, 23 Oct 2023 13:51:43 +0200 Subject: [PATCH 176/292] Updated build yul flow --- foundry.toml | 7 ++++- hardhat.config.ts | 2 -- package.json | 3 +++ src/{bridge => yul}/BlobBasefeeReader.yul | 0 src/{bridge => yul}/DataHashesReader.yul | 0 test/contract/toolkit4844.ts | 32 +++++------------------ test/foundry/RollupCreator.t.sol | 10 ++++--- 7 files changed, 22 insertions(+), 32 deletions(-) rename src/{bridge => yul}/BlobBasefeeReader.yul (100%) rename src/{bridge => yul}/DataHashesReader.yul (100%) diff --git a/foundry.toml b/foundry.toml index 2512e19b..d10f8633 100644 --- a/foundry.toml +++ b/foundry.toml @@ -3,11 +3,16 @@ src = 'src' out = 'out' libs = ['node_modules', 'lib'] test = 'test/foundry' -cache_path = 'forge-cache' +cache_path = 'forge-cache/sol' optimizer = true optimizer_runs = 20000 via_ir = false +[profile.yul] +src = 'src/yul' +out = 'out/yul' +cache_path = 'forge-cache/yul' + [fmt] number_underscore = 'thousands' line_length = 100 diff --git a/hardhat.config.ts b/hardhat.config.ts index 781f4558..401a29b3 100644 --- a/hardhat.config.ts +++ b/hardhat.config.ts @@ -6,8 +6,6 @@ import '@typechain/hardhat' import 'solidity-coverage' import 'hardhat-gas-reporter' import 'hardhat-ignore-warnings' -// CHRIS: TODO: use a flag for this -// uncomment to regenerate yul // import '@tovarishfin/hardhat-yul'; import dotenv from 'dotenv' diff --git a/package.json b/package.json index a409893e..2f7c43d0 100644 --- a/package.json +++ b/package.json @@ -19,6 +19,9 @@ "scripts": { "prepublishOnly": "hardhat clean && hardhat compile", "build": "hardhat compile", + "build:forge:sol": "forge build --skip *.yul", + "build:forge:yul": "FOUNDRY_PROFILE=yul forge build --skip *.sol --skip *BlobBasefeeReader.yul && FOUNDRY_PROFILE=yul forge build --skip *.sol --skip *DataHashesReader.yul", + "build:forge": "yarn build:forge:sol && yarn build:forge:yul", "lint:test": "eslint ./test", "solhint": "solhint -f table src/**/*.sol", "prettier:solidity": "prettier --write src/**/*.sol", diff --git a/src/bridge/BlobBasefeeReader.yul b/src/yul/BlobBasefeeReader.yul similarity index 100% rename from src/bridge/BlobBasefeeReader.yul rename to src/yul/BlobBasefeeReader.yul diff --git a/src/bridge/DataHashesReader.yul b/src/yul/DataHashesReader.yul similarity index 100% rename from src/bridge/DataHashesReader.yul rename to src/yul/DataHashesReader.yul diff --git a/test/contract/toolkit4844.ts b/test/contract/toolkit4844.ts index 6bcaed69..05e8900e 100644 --- a/test/contract/toolkit4844.ts +++ b/test/contract/toolkit4844.ts @@ -8,28 +8,8 @@ import { IDataHashReader__factory, } from '../../build/types' import { JsonRpcProvider } from '@ethersproject/providers' - -const dataHashReaderJson = { - _format: 'hh-sol-artifact-1', - contractName: 'DataHashesReader', - sourceName: 'src/bridge/DataHashesReader.yul', - abi: [], - bytecode: - '0x603b80600a5f395ff3fe5f3560e01c63e83a2d8214600f57005b5f5b804990811560295760019160408260051b0152016011565b60409060205f528060205260051b015ff3', - linkReferences: {}, - deployedLinkReferences: {}, -} - -const blobBasefeeReaderJson = { - _format: 'hh-sol-artifact-1', - contractName: 'BlobBasefeeReader', - sourceName: 'src/bridge/BlobBasefeeReader.yul', - abi: [], - bytecode: - '0x601780600a5f395ff3fe5f3560e01c631f6d6ef714600f57005b4a5f5260205ff3', - linkReferences: {}, - deployedLinkReferences: {}, -} +import { bytecode as blobBasefeeReaderBytecode } from '../../out/yul/BlobBasefeeReader.yul/BlobBasefeeReader.json' +import { bytecode as dataHeashesReaderBytecode } from '../../out/yul/DataHashesReader.yul/DataHashesReader.json' const wait = async (ms: number) => new Promise((res, rej) => { @@ -151,8 +131,8 @@ export class Toolkit4844 { wallet: Signer ): Promise { const contractFactory = new ContractFactory( - dataHashReaderJson.abi, - dataHashReaderJson.bytecode, + IDataHashReader__factory.abi, + dataHeashesReaderBytecode, wallet ) const dataHashReader = await contractFactory.deploy() @@ -165,8 +145,8 @@ export class Toolkit4844 { wallet: Signer ): Promise { const contractFactory = new ContractFactory( - blobBasefeeReaderJson.abi, - blobBasefeeReaderJson.bytecode, + IBlobBasefeeReader__factory.abi, + blobBasefeeReaderBytecode, wallet ) const blobBasefeeReader = await contractFactory.deploy() diff --git a/test/foundry/RollupCreator.t.sol b/test/foundry/RollupCreator.t.sol index 8c7c5d4a..aaffdd18 100644 --- a/test/foundry/RollupCreator.t.sol +++ b/test/foundry/RollupCreator.t.sol @@ -28,6 +28,7 @@ contract RollupCreatorTest is Test { IRollupUser public rollupUser; DeployHelper public deployHelper; IDataHashReader dummyDataHashReader = IDataHashReader(address(137)); + IBlobBasefeeReader dummyBlobBasefeeReader = IBlobBasefeeReader(address(138)); // 1 gwei uint256 public constant MAX_FEE_PER_GAS = 1_000_000_000; @@ -132,7 +133,8 @@ contract RollupCreatorTest is Test { nativeToken: address(0), deployFactoriesToL2: true, maxFeePerGasForRetryables: MAX_FEE_PER_GAS, - dataHashReader: dummyDataHashReader + dataHashReader: dummyDataHashReader, + blobBasefeeReader: dummyBlobBasefeeReader }); address rollupAddress = rollupCreator.createRollup{value: factoryDeploymentFunds}( deployParams @@ -284,7 +286,8 @@ contract RollupCreatorTest is Test { nativeToken: nativeToken, deployFactoriesToL2: true, maxFeePerGasForRetryables: MAX_FEE_PER_GAS, - dataHashReader: dummyDataHashReader + dataHashReader: dummyDataHashReader, + blobBasefeeReader: dummyBlobBasefeeReader }); address rollupAddress = rollupCreator.createRollup(deployParams); @@ -429,7 +432,8 @@ contract RollupCreatorTest is Test { nativeToken: address(0), deployFactoriesToL2: true, maxFeePerGasForRetryables: MAX_FEE_PER_GAS, - dataHashReader: dummyDataHashReader + dataHashReader: dummyDataHashReader, + blobBasefeeReader: dummyBlobBasefeeReader }); address rollupAddress = rollupCreator.createRollup{value: factoryDeploymentFunds}( deployParams From 8762fce1152784adefa00ccccaf45b8f4fdd9cc4 Mon Sep 17 00:00:00 2001 From: Chris Buckland Date: Mon, 23 Oct 2023 14:22:34 +0200 Subject: [PATCH 177/292] Moved yul files --- .github/workflows/contract-tests.yml | 2 +- foundry.toml | 5 +++-- package.json | 3 ++- src/bridge/ISequencerInbox.sol | 3 ++- {src/yul => yul}/BlobBasefeeReader.yul | 0 {src/yul => yul}/DataHashesReader.yul | 0 6 files changed, 8 insertions(+), 5 deletions(-) rename {src/yul => yul}/BlobBasefeeReader.yul (100%) rename {src/yul => yul}/DataHashesReader.yul (100%) diff --git a/.github/workflows/contract-tests.yml b/.github/workflows/contract-tests.yml index 63f090b4..3fac9da4 100644 --- a/.github/workflows/contract-tests.yml +++ b/.github/workflows/contract-tests.yml @@ -33,7 +33,7 @@ jobs: - name: Install packages run: yarn - - name: Run unit tests + - name: Build run: forge test tests: name: Contract tests diff --git a/foundry.toml b/foundry.toml index d10f8633..1e26c1ed 100644 --- a/foundry.toml +++ b/foundry.toml @@ -1,5 +1,5 @@ [profile.default] -src = 'src' +src = 'src/' out = 'out' libs = ['node_modules', 'lib'] test = 'test/foundry' @@ -9,8 +9,9 @@ optimizer_runs = 20000 via_ir = false [profile.yul] -src = 'src/yul' +src = 'yul' out = 'out/yul' +libs = ['node_modules', 'lib'] cache_path = 'forge-cache/yul' [fmt] diff --git a/package.json b/package.json index 2f7c43d0..7f16da5c 100644 --- a/package.json +++ b/package.json @@ -18,7 +18,8 @@ }, "scripts": { "prepublishOnly": "hardhat clean && hardhat compile", - "build": "hardhat compile", + "build": "yarn build:hardhat && yarn build:forge", + "build:hardhat": "hardhat compile", "build:forge:sol": "forge build --skip *.yul", "build:forge:yul": "FOUNDRY_PROFILE=yul forge build --skip *.sol --skip *BlobBasefeeReader.yul && FOUNDRY_PROFILE=yul forge build --skip *.sol --skip *DataHashesReader.yul", "build:forge": "yarn build:forge:sol && yarn build:forge:yul", diff --git a/src/bridge/ISequencerInbox.sol b/src/bridge/ISequencerInbox.sol index 80b70fab..6c1c7e6e 100644 --- a/src/bridge/ISequencerInbox.sol +++ b/src/bridge/ISequencerInbox.sol @@ -185,11 +185,12 @@ interface ISequencerInbox is IDelayedMessageProvider { ) external; } -// CHRIS: TODO: where to put these? interface IDataHashReader { + /// @notice Returns all the data hashes of all the blobs on the current transaction function getDataHashes() external view returns (bytes32[] memory); } interface IBlobBasefeeReader { + /// @notice Returns the current BLOBBASEFEE function getBlobBaseFee() external view returns (uint256); } diff --git a/src/yul/BlobBasefeeReader.yul b/yul/BlobBasefeeReader.yul similarity index 100% rename from src/yul/BlobBasefeeReader.yul rename to yul/BlobBasefeeReader.yul diff --git a/src/yul/DataHashesReader.yul b/yul/DataHashesReader.yul similarity index 100% rename from src/yul/DataHashesReader.yul rename to yul/DataHashesReader.yul From d98df6b879ad217bf574a04a9ace2bd6313a410f Mon Sep 17 00:00:00 2001 From: Chris Buckland Date: Mon, 23 Oct 2023 15:31:31 +0200 Subject: [PATCH 178/292] Refactoring and custom errors --- src/bridge/SequencerInbox.sol | 99 ++++++++++++++++++++------------- src/libraries/Error.sol | 12 ++++ test/contract/arbRollup.spec.ts | 2 +- test/contract/toolkit4844.ts | 3 +- 4 files changed, 73 insertions(+), 43 deletions(-) diff --git a/src/bridge/SequencerInbox.sol b/src/bridge/SequencerInbox.sol index aa72cd09..97d83c9a 100644 --- a/src/bridge/SequencerInbox.sol +++ b/src/bridge/SequencerInbox.sol @@ -20,7 +20,11 @@ import { DataNotAuthenticated, AlreadyValidDASKeyset, NoSuchKeyset, - NotForked + NotForked, + DataBlobsNotSupported, + InitParamZero, + MissingDataHashes, + InvalidBlobMetadata } from "../libraries/Error.sol"; import "./IBridge.sol"; import "./IInboxBase.sol"; @@ -93,9 +97,18 @@ contract SequencerInbox is DelegateCallAware, GasRefundEnabled, ISequencerInbox bridge = bridge_; rollup = bridge_.rollup(); maxTimeVariation = maxTimeVariation_; - // CHRIS: TODO: check that this is not empty? - dataHashReader = dataHashReader_; - blobBasefeeReader = blobBasefeeReader_; + if (hostChainIsArbitrum) { + if (dataHashReader_ != IDataHashReader(address(0))) revert DataBlobsNotSupported(); + if (blobBasefeeReader_ != IBlobBasefeeReader(address(0))) + revert DataBlobsNotSupported(); + } else { + if (dataHashReader_ == IDataHashReader(address(0))) + revert InitParamZero("DataHashReader"); + dataHashReader = dataHashReader_; + if (blobBasefeeReader_ == IBlobBasefeeReader(address(0))) + revert InitParamZero("BlobBasefeeReader"); + blobBasefeeReader = blobBasefeeReader_; + } } function getTimeBounds() internal view virtual returns (TimeBounds memory) { @@ -157,7 +170,6 @@ contract SequencerInbox is DelegateCallAware, GasRefundEnabled, ISequencerInbox Messages.accumulateInboxMessage(prevDelayedAcc, messageHash) ) revert IncorrectMessagePreimage(); - // CHRIS: TODO: why this assign?? uint256 __totalDelayedMessagesRead = _totalDelayedMessagesRead; uint256 prevSeqMsgCount = bridge.sequencerReportedSubMessageCount(); uint256 newSeqMsgCount = prevSeqMsgCount + @@ -167,21 +179,13 @@ contract SequencerInbox is DelegateCallAware, GasRefundEnabled, ISequencerInbox (bytes32 dataHash, TimeBounds memory timeBounds) = formEmptyDataHash( __totalDelayedMessagesRead ); - checkAndSetDelayedMessagesRead(__totalDelayedMessagesRead); - (uint256 seqMessageIndex, bytes32 beforeAcc, bytes32 delayedAcc, bytes32 afterAcc) = bridge - .enqueueSequencerMessage( - dataHash, - __totalDelayedMessagesRead, - prevSeqMsgCount, - newSeqMsgCount - ); - emit SequencerBatchDelivered( - seqMessageIndex, - beforeAcc, - afterAcc, - delayedAcc, - totalDelayedMessagesRead, + addSequencerL2BatchImpl( + type(uint256).max, + dataHash, timeBounds, + __totalDelayedMessagesRead, + prevSeqMsgCount, + newSeqMsgCount, BatchDataLocation.NoData ); } @@ -196,9 +200,15 @@ contract SequencerInbox is DelegateCallAware, GasRefundEnabled, ISequencerInbox // solhint-disable-next-line avoid-tx-origin if (msg.sender != tx.origin) revert NotOrigin(); if (!isBatchPoster[msg.sender]) revert NotBatchPoster(); + (bytes32 dataHash, TimeBounds memory timeBounds) = formDataHash( + data, + afterDelayedMessagesRead, + BatchDataLocation.TxInput + ); addSequencerL2BatchImpl( sequenceNumber, - data, + dataHash, + timeBounds, afterDelayedMessagesRead, 0, 0, @@ -206,11 +216,6 @@ contract SequencerInbox is DelegateCallAware, GasRefundEnabled, ISequencerInbox ); } - // CHRIS: TODO: remove this - function getBlobBasefee() public view returns (uint256) { - return blobBasefeeReader.getBlobBaseFee(); - } - function addSequencerL2BatchFromOrigin( uint256 sequenceNumber, bytes calldata data, @@ -222,9 +227,15 @@ contract SequencerInbox is DelegateCallAware, GasRefundEnabled, ISequencerInbox // solhint-disable-next-line avoid-tx-origin if (msg.sender != tx.origin) revert NotOrigin(); if (!isBatchPoster[msg.sender]) revert NotBatchPoster(); + (bytes32 dataHash, TimeBounds memory timeBounds) = formDataHash( + data, + afterDelayedMessagesRead, + BatchDataLocation.TxInput + ); addSequencerL2BatchImpl( sequenceNumber, - data, + dataHash, + timeBounds, afterDelayedMessagesRead, prevMessageCount, newMessageCount, @@ -241,9 +252,15 @@ contract SequencerInbox is DelegateCallAware, GasRefundEnabled, ISequencerInbox uint256 newMessageCount ) external refundsGas(gasRefunder) { if (!isBatchPoster[msg.sender]) revert NotBatchPoster(); + (bytes32 dataHash, TimeBounds memory timeBounds) = formDataHash( + data, + afterDelayedMessagesRead, + BatchDataLocation.Blob + ); addSequencerL2BatchImpl( sequenceNumber, - data, + dataHash, + timeBounds, afterDelayedMessagesRead, prevMessageCount, newMessageCount, @@ -261,9 +278,15 @@ contract SequencerInbox is DelegateCallAware, GasRefundEnabled, ISequencerInbox uint256 newMessageCount ) external override refundsGas(gasRefunder) { if (!isBatchPoster[msg.sender] && msg.sender != address(rollup)) revert NotBatchPoster(); + (bytes32 dataHash, TimeBounds memory timeBounds) = formDataHash( + data, + afterDelayedMessagesRead, + BatchDataLocation.SeparateBatchEvent + ); addSequencerL2BatchImpl( sequenceNumber, - data, + dataHash, + timeBounds, afterDelayedMessagesRead, prevMessageCount, newMessageCount, @@ -310,13 +333,12 @@ contract SequencerInbox is DelegateCallAware, GasRefundEnabled, ISequencerInbox revert DataNotAuthenticated(); } - // CHRIS: TODO: ensure this flag isnt used (bytes memory header, TimeBounds memory timeBounds) = packHeader(afterDelayedMessagesRead); if (dataLocation == BatchDataLocation.Blob) { bytes32[] memory dataHashes = dataHashReader.getDataHashes(); - // CHRIS: TODO: switch all requires to custom errors - require(dataHashes.length != 0, "Missing data hashes"); - require(data.length > 0 && data[0] & 0x04 != 0, "Invalid blob data"); + if (dataHashes.length == 0) revert MissingDataHashes(); + // CHRIS: TODO: ensure this flag isnt used + if (data.length > 0 && data[0] & 0x04 == 0) revert InvalidBlobMetadata(); return ( keccak256(bytes.concat(header, data, abi.encodePacked(dataHashes))), @@ -338,17 +360,13 @@ contract SequencerInbox is DelegateCallAware, GasRefundEnabled, ISequencerInbox function addSequencerL2BatchImpl( uint256 sequenceNumber, - bytes calldata data, + bytes32 dataHash, + TimeBounds memory timeBounds, uint256 afterDelayedMessagesRead, uint256 prevMessageCount, uint256 newMessageCount, BatchDataLocation dataLocation ) internal { - (bytes32 dataHash, TimeBounds memory timeBounds) = formDataHash( - data, - afterDelayedMessagesRead, - dataLocation - ); checkAndSetDelayedMessagesRead(afterDelayedMessagesRead); (uint256 seqMessageIndex, bytes32 beforeAcc, bytes32 delayedAcc, bytes32 afterAcc) = bridge .enqueueSequencerMessage( @@ -357,12 +375,14 @@ contract SequencerInbox is DelegateCallAware, GasRefundEnabled, ISequencerInbox prevMessageCount, newMessageCount ); + // CHRIS: TODO: push these together if (dataLocation == BatchDataLocation.TxInput) { submitTxInputBatchSpendingReport(dataHash, seqMessageIndex); } else if (dataLocation == BatchDataLocation.Blob) { submitBlobBatchSpendingReport(dataHash, seqMessageIndex); } + // CHRIS: TODO: replace this unclear max if (seqMessageIndex != sequenceNumber && sequenceNumber != ~uint256(0)) { revert BadSequencerNumber(seqMessageIndex, sequenceNumber); } @@ -418,8 +438,7 @@ contract SequencerInbox is DelegateCallAware, GasRefundEnabled, ISequencerInbox // the delayed messages queue that is yet to be included address batchPoster = tx.origin; uint256 blobBasefee = blobBasefeeReader.getBlobBaseFee(); - // CHRIS: TODO: custom error - require(!hostChainIsArbitrum, "Unsupported blob transaction"); + if (hostChainIsArbitrum) revert DataBlobsNotSupported(); bytes memory spendingReportMsg = abi.encodePacked( block.timestamp, batchPoster, diff --git a/src/libraries/Error.sol b/src/libraries/Error.sol index beb0afc8..e496b733 100644 --- a/src/libraries/Error.sol +++ b/src/libraries/Error.sol @@ -172,3 +172,15 @@ error AlreadyValidDASKeyset(bytes32); /// @dev Tried to use or invalidate an already invalid Data Availability Service keyset error NoSuchKeyset(bytes32); + +/// @dev Thrown when a data blob feature is attempted to be used on a chain that doesnt support it +error DataBlobsNotSupported(); + +/// @dev Thrown when an init param was supplied as empty +error InitParamZero(string name); + +/// @dev Thrown when data hashes where expected but not where present on the tx +error MissingDataHashes(); + +/// @dev Thrown when the data blob meta data is invalid +error InvalidBlobMetadata(); diff --git a/test/contract/arbRollup.spec.ts b/test/contract/arbRollup.spec.ts index e7b98fe5..f5b72b3d 100644 --- a/test/contract/arbRollup.spec.ts +++ b/test/contract/arbRollup.spec.ts @@ -281,7 +281,7 @@ const setup = async () => { deployFactoriesToL2: true, maxFeePerGasForRetryables: maxFeePerGas, dataHashReader: ethers.constants.AddressZero, - blobBasefeeReader: ethers.constants.AddressZero + blobBasefeeReader: ethers.constants.AddressZero, } const response = await rollupCreator.createRollup(deployParams, { diff --git a/test/contract/toolkit4844.ts b/test/contract/toolkit4844.ts index 05e8900e..90caf063 100644 --- a/test/contract/toolkit4844.ts +++ b/test/contract/toolkit4844.ts @@ -102,8 +102,7 @@ export class Toolkit4844 { blockNumber: number, provider: JsonRpcProvider ) { - while (true) { - if ((await provider.getBlockNumber()) > blockNumber) return + while ((await provider.getBlockNumber()) <= blockNumber) { await wait(300) } } From 492e881b744865a15749048a3e7455d0e413e6d8 Mon Sep 17 00:00:00 2001 From: Chris Buckland Date: Mon, 23 Oct 2023 15:59:01 +0200 Subject: [PATCH 179/292] Some more comment tidying --- .github/workflows/contract-tests.yml | 7 +++++++ src/bridge/ISequencerInbox.sol | 10 ++++++++++ src/bridge/SequencerInbox.sol | 27 ++++++++++++++------------- 3 files changed, 31 insertions(+), 13 deletions(-) diff --git a/.github/workflows/contract-tests.yml b/.github/workflows/contract-tests.yml index 3fac9da4..b8c3b7be 100644 --- a/.github/workflows/contract-tests.yml +++ b/.github/workflows/contract-tests.yml @@ -44,6 +44,13 @@ jobs: steps: - name: Checkout uses: actions/checkout@v2 + with: + submodules: recursive + + - name: Install Foundry + uses: foundry-rs/foundry-toolchain@v1 + with: + version: nightly - name: Setup nodejs uses: actions/setup-node@v2 diff --git a/src/bridge/ISequencerInbox.sol b/src/bridge/ISequencerInbox.sol index 6c1c7e6e..22624e65 100644 --- a/src/bridge/ISequencerInbox.sol +++ b/src/bridge/ISequencerInbox.sol @@ -66,6 +66,16 @@ interface ISequencerInbox is IDelayedMessageProvider { // solhint-disable-next-line func-name-mixedcase function DATA_AUTHENTICATED_FLAG() external view returns (bytes1); + /// @dev If the first data byte after the header has this bit set, + /// then the batch data is to be found in 4844 data blobs + // solhint-disable-next-line func-name-mixedcase + function DATA_BLOB_HEADER_FLAG() external view returns (bytes1); + + /// @dev If the first data byte after the header has this bit set, + /// then the batch data is a das message + // solhint-disable-next-line func-name-mixedcase + function DAS_MESSAGE_HEADER_FLAG() external view returns (bytes1); + function rollup() external view returns (IOwnable); function isBatchPoster(address) external view returns (bool); diff --git a/src/bridge/SequencerInbox.sol b/src/bridge/SequencerInbox.sol index 97d83c9a..4d432c90 100644 --- a/src/bridge/SequencerInbox.sol +++ b/src/bridge/SequencerInbox.sol @@ -57,6 +57,12 @@ contract SequencerInbox is DelegateCallAware, GasRefundEnabled, ISequencerInbox /// @inheritdoc ISequencerInbox bytes1 public constant DATA_AUTHENTICATED_FLAG = 0x40; + /// @inheritdoc ISequencerInbox + bytes1 public constant DATA_BLOB_HEADER_FLAG = 0x10; + + /// @inheritdoc ISequencerInbox + bytes1 public constant DAS_MESSAGE_HEADER_FLAG = 0x80; + IOwnable public rollup; mapping(address => bool) public isBatchPoster; ISequencerInbox.MaxTimeVariation public maxTimeVariation; @@ -245,6 +251,7 @@ contract SequencerInbox is DelegateCallAware, GasRefundEnabled, ISequencerInbox function addSequencerL2BatchFromBlob( uint256 sequenceNumber, + // CHRIS: TODO: this isnt strictly necessary atm, but I'll leave it here until we decide if we want to specify blob indices bytes calldata data, uint256 afterDelayedMessagesRead, IGasRefunder gasRefunder, @@ -337,8 +344,8 @@ contract SequencerInbox is DelegateCallAware, GasRefundEnabled, ISequencerInbox if (dataLocation == BatchDataLocation.Blob) { bytes32[] memory dataHashes = dataHashReader.getDataHashes(); if (dataHashes.length == 0) revert MissingDataHashes(); - // CHRIS: TODO: ensure this flag isnt used - if (data.length > 0 && data[0] & 0x04 == 0) revert InvalidBlobMetadata(); + if (data.length != 1) revert InvalidBlobMetadata(); + if (data[0] & DATA_BLOB_HEADER_FLAG == 0) revert InvalidBlobMetadata(); return ( keccak256(bytes.concat(header, data, abi.encodePacked(dataHashes))), @@ -347,13 +354,11 @@ contract SequencerInbox is DelegateCallAware, GasRefundEnabled, ISequencerInbox } else { // the first byte is used to identify the type of batch data // das batches expect to have the type byte set, followed by the keyset (so they should have at least 33 bytes) - // CHRIS: TODO: what if it's less than 33? - if (data.length >= 33 && data[0] & 0x80 != 0) { + if (data.length >= 33 && data[0] & DAS_MESSAGE_HEADER_FLAG != 0) { // we skip the first byte, then read the next 32 bytes for the keyset bytes32 dasKeysetHash = bytes32(data[1:33]); if (!dasKeySetInfo[dasKeysetHash].isValidKeyset) revert NoSuchKeyset(dasKeysetHash); } - // CHRIS: TODO: consider more if-else stuff here return (keccak256(bytes.concat(header, data)), timeBounds); } } @@ -367,7 +372,10 @@ contract SequencerInbox is DelegateCallAware, GasRefundEnabled, ISequencerInbox uint256 newMessageCount, BatchDataLocation dataLocation ) internal { - checkAndSetDelayedMessagesRead(afterDelayedMessagesRead); + if (afterDelayedMessagesRead < totalDelayedMessagesRead) revert DelayedBackwards(); + if (afterDelayedMessagesRead > bridge.delayedMessageCount()) revert DelayedTooFar(); + totalDelayedMessagesRead = afterDelayedMessagesRead; + (uint256 seqMessageIndex, bytes32 beforeAcc, bytes32 delayedAcc, bytes32 afterAcc) = bridge .enqueueSequencerMessage( dataHash, @@ -454,13 +462,6 @@ contract SequencerInbox is DelegateCallAware, GasRefundEnabled, ISequencerInbox emit InboxMessageDelivered(msgNum, spendingReportMsg); } - // CHRIS: TODO: docs and inline it? - function checkAndSetDelayedMessagesRead(uint256 afterDelayedMessagesRead) internal { - if (afterDelayedMessagesRead < totalDelayedMessagesRead) revert DelayedBackwards(); - if (afterDelayedMessagesRead > bridge.delayedMessageCount()) revert DelayedTooFar(); - totalDelayedMessagesRead = afterDelayedMessagesRead; - } - function inboxAccs(uint256 index) external view returns (bytes32) { return bridge.sequencerInboxAccs(index); } From 59eb0c6e3e0e801b937bd54efa0e8862428e01d9 Mon Sep 17 00:00:00 2001 From: Chris Buckland Date: Mon, 23 Oct 2023 16:17:35 +0200 Subject: [PATCH 180/292] Package updates and seq inbox todos --- .github/workflows/contract-tests.yml | 4 +- package.json | 4 +- src/bridge/ISequencerInbox.sol | 2 +- src/bridge/SequencerInbox.sol | 90 ++++++++++++++-------------- src/mocks/SequencerInboxStub.sol | 14 +---- 5 files changed, 51 insertions(+), 63 deletions(-) diff --git a/.github/workflows/contract-tests.yml b/.github/workflows/contract-tests.yml index b8c3b7be..41f4aedc 100644 --- a/.github/workflows/contract-tests.yml +++ b/.github/workflows/contract-tests.yml @@ -69,7 +69,7 @@ jobs: run: yarn lint:test - name: Build - run: yarn build + run: yarn build:all - name: Run tests run: yarn hardhat --network hardhat test test/contract/*.spec.ts @@ -115,7 +115,7 @@ jobs: run: yarn install - name: Build - run: yarn build + run: yarn build:all - name: Test 4844 run: yarn test:4844 diff --git a/package.json b/package.json index 7f16da5c..18675665 100644 --- a/package.json +++ b/package.json @@ -18,8 +18,8 @@ }, "scripts": { "prepublishOnly": "hardhat clean && hardhat compile", - "build": "yarn build:hardhat && yarn build:forge", - "build:hardhat": "hardhat compile", + "build:all": "yarn build && yarn build:forge", + "build": "hardhat compile", "build:forge:sol": "forge build --skip *.yul", "build:forge:yul": "FOUNDRY_PROFILE=yul forge build --skip *.sol --skip *BlobBasefeeReader.yul && FOUNDRY_PROFILE=yul forge build --skip *.sol --skip *DataHashesReader.yul", "build:forge": "yarn build:forge:sol && yarn build:forge:yul", diff --git a/src/bridge/ISequencerInbox.sol b/src/bridge/ISequencerInbox.sol index 22624e65..79ab1953 100644 --- a/src/bridge/ISequencerInbox.sol +++ b/src/bridge/ISequencerInbox.sol @@ -67,7 +67,7 @@ interface ISequencerInbox is IDelayedMessageProvider { function DATA_AUTHENTICATED_FLAG() external view returns (bytes1); /// @dev If the first data byte after the header has this bit set, - /// then the batch data is to be found in 4844 data blobs + /// then the batch data is to be found in 4844 data blobs // solhint-disable-next-line func-name-mixedcase function DATA_BLOB_HEADER_FLAG() external view returns (bytes1); diff --git a/src/bridge/SequencerInbox.sol b/src/bridge/SequencerInbox.sol index 4d432c90..52dac817 100644 --- a/src/bridge/SequencerInbox.sol +++ b/src/bridge/SequencerInbox.sol @@ -383,14 +383,11 @@ contract SequencerInbox is DelegateCallAware, GasRefundEnabled, ISequencerInbox prevMessageCount, newMessageCount ); - // CHRIS: TODO: push these together - if (dataLocation == BatchDataLocation.TxInput) { - submitTxInputBatchSpendingReport(dataHash, seqMessageIndex); - } else if (dataLocation == BatchDataLocation.Blob) { - submitBlobBatchSpendingReport(dataHash, seqMessageIndex); - } - // CHRIS: TODO: replace this unclear max + // submit a batch spending report to refund the entity that produced the batch data + submitBatchSpendingReport(dataHash, seqMessageIndex, dataLocation); + + // ~uint256(0) is type(uint256).max, but ever so slightly cheaper if (seqMessageIndex != sequenceNumber && sequenceNumber != ~uint256(0)) { revert BadSequencerNumber(seqMessageIndex, sequenceNumber); } @@ -406,54 +403,55 @@ contract SequencerInbox is DelegateCallAware, GasRefundEnabled, ISequencerInbox ); } - function submitTxInputBatchSpendingReport(bytes32 dataHash, uint256 seqMessageIndex) internal { - // this msg isn't included in the current sequencer batch, but instead added to - // the delayed messages queue that is yet to be included - address batchPoster = msg.sender; + function submitBatchSpendingReport( + bytes32 dataHash, + uint256 seqMessageIndex, + BatchDataLocation dataLocation + ) internal { bytes memory spendingReportMsg; - if (hostChainIsArbitrum) { - // Include extra gas for the host chain's L1 gas charging - uint256 l1Fees = ArbGasInfo(address(0x6c)).getCurrentTxL1GasFees(); - uint256 extraGas = l1Fees / block.basefee; - require(extraGas <= type(uint64).max, "L1_GAS_NOT_UINT64"); + address batchPoster = tx.origin; + if (dataLocation == BatchDataLocation.TxInput) { + // this msg isn't included in the current sequencer batch, but instead added to + // the delayed messages queue that is yet to be included + if (hostChainIsArbitrum) { + // Include extra gas for the host chain's L1 gas charging + uint256 l1Fees = ArbGasInfo(address(0x6c)).getCurrentTxL1GasFees(); + uint256 extraGas = l1Fees / block.basefee; + require(extraGas <= type(uint64).max, "L1_GAS_NOT_UINT64"); + spendingReportMsg = abi.encodePacked( + block.timestamp, + batchPoster, + dataHash, + seqMessageIndex, + block.basefee, + uint64(extraGas) + ); + } else { + spendingReportMsg = abi.encodePacked( + block.timestamp, + batchPoster, + dataHash, + seqMessageIndex, + block.basefee + ); + } + } else if (dataLocation == BatchDataLocation.Blob) { + // this msg isn't included in the current sequencer batch, but instead added to + // the delayed messages queue that is yet to be included + uint256 blobBasefee = blobBasefeeReader.getBlobBaseFee(); + if (hostChainIsArbitrum) revert DataBlobsNotSupported(); spendingReportMsg = abi.encodePacked( block.timestamp, batchPoster, dataHash, seqMessageIndex, - block.basefee, - uint64(extraGas) + blobBasefee ); } else { - spendingReportMsg = abi.encodePacked( - block.timestamp, - batchPoster, - dataHash, - seqMessageIndex, - block.basefee - ); + // do nothing, we only submit spending reports for tx input and blob + return; } - uint256 msgNum = bridge.submitBatchSpendingReport( - batchPoster, - keccak256(spendingReportMsg) - ); - // this is the same event used by Inbox.sol after including a message to the delayed message accumulator - emit InboxMessageDelivered(msgNum, spendingReportMsg); - } - function submitBlobBatchSpendingReport(bytes32 dataHash, uint256 seqMessageIndex) internal { - // this msg isn't included in the current sequencer batch, but instead added to - // the delayed messages queue that is yet to be included - address batchPoster = tx.origin; - uint256 blobBasefee = blobBasefeeReader.getBlobBaseFee(); - if (hostChainIsArbitrum) revert DataBlobsNotSupported(); - bytes memory spendingReportMsg = abi.encodePacked( - block.timestamp, - batchPoster, - dataHash, - seqMessageIndex, - blobBasefee - ); uint256 msgNum = bridge.submitBatchSpendingReport( batchPoster, keccak256(spendingReportMsg) @@ -462,6 +460,8 @@ contract SequencerInbox is DelegateCallAware, GasRefundEnabled, ISequencerInbox emit InboxMessageDelivered(msgNum, spendingReportMsg); } + function submitBlobBatchSpendingReport(bytes32 dataHash, uint256 seqMessageIndex) internal {} + function inboxAccs(uint256 index) external view returns (bytes32) { return bridge.sequencerInboxAccs(index); } diff --git a/src/mocks/SequencerInboxStub.sol b/src/mocks/SequencerInboxStub.sol index ed275027..edddbae1 100644 --- a/src/mocks/SequencerInboxStub.sol +++ b/src/mocks/SequencerInboxStub.sol @@ -31,19 +31,7 @@ contract SequencerInboxStub is SequencerInbox { require(num == 0, "ALREADY_DELAYED_INIT"); emit InboxMessageDelivered(num, initMsg); (bytes32 dataHash, TimeBounds memory timeBounds) = formEmptyDataHash(1); - checkAndSetDelayedMessagesRead(1); - (uint256 seqMessageIndex, bytes32 beforeAcc, bytes32 delayedAcc, bytes32 afterAcc) = bridge - .enqueueSequencerMessage(dataHash, 1, 0, 0); - require(seqMessageIndex == 0, "ALREADY_SEQ_INIT"); - emit SequencerBatchDelivered( - seqMessageIndex, - beforeAcc, - afterAcc, - delayedAcc, - totalDelayedMessagesRead, - timeBounds, - BatchDataLocation.NoData - ); + addSequencerL2BatchImpl(0, dataHash, timeBounds, 1, 0, 0, BatchDataLocation.NoData); } function getTimeBounds() internal view override returns (TimeBounds memory bounds) { From a55d1c47529cd8e9fd1f33bc85c151391a0c7e50 Mon Sep 17 00:00:00 2001 From: Chris Buckland Date: Mon, 23 Oct 2023 16:27:55 +0200 Subject: [PATCH 181/292] Include blobbasefeereader in init --- test/contract/sequencerInboxForceInclude.spec.ts | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/test/contract/sequencerInboxForceInclude.spec.ts b/test/contract/sequencerInboxForceInclude.spec.ts index a641ca50..061b59df 100644 --- a/test/contract/sequencerInboxForceInclude.spec.ts +++ b/test/contract/sequencerInboxForceInclude.spec.ts @@ -273,6 +273,7 @@ describe('SequencerInboxForceInclude', async () => { .connect(user) const inbox = await inboxFac.attach(inboxProxy.address).connect(user) const dataHashReader = await Toolkit4844.deployDataHashReader(admin) + const blobBasefeeReader = await Toolkit4844.deployBlobBasefeeReader(admin) await bridge.initialize(rollupMock.address) @@ -284,7 +285,8 @@ describe('SequencerInboxForceInclude', async () => { futureBlocks: 10, futureSeconds: 3000, }, - dataHashReader.address + dataHashReader.address, + blobBasefeeReader.address ) await ( await sequencerInbox From 9045c0c34dfb97dc5f62e46c1f1d344c78065e50 Mon Sep 17 00:00:00 2001 From: Chris Buckland Date: Mon, 23 Oct 2023 17:45:32 +0200 Subject: [PATCH 182/292] Added dummy blob reader addr --- test/contract/arbRollup.spec.ts | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/test/contract/arbRollup.spec.ts b/test/contract/arbRollup.spec.ts index f5b72b3d..d40967b4 100644 --- a/test/contract/arbRollup.spec.ts +++ b/test/contract/arbRollup.spec.ts @@ -268,6 +268,9 @@ const setup = async () => { const maxFeePerGas = BigNumber.from('1000000000') + const dummyDataHashReader = '0x0000000000000000000000000000000000000089' + const dummyBlobBasefeeReader = '0x0000000000000000000000000000000000000090' + const deployParams = { config: await getDefaultConfig(), batchPoster: await sequencer.getAddress(), @@ -280,8 +283,8 @@ const setup = async () => { nativeToken: ethers.constants.AddressZero, deployFactoriesToL2: true, maxFeePerGasForRetryables: maxFeePerGas, - dataHashReader: ethers.constants.AddressZero, - blobBasefeeReader: ethers.constants.AddressZero, + dataHashReader: dummyDataHashReader, + blobBasefeeReader: dummyBlobBasefeeReader, } const response = await rollupCreator.createRollup(deployParams, { From fc8f3a19da264ce67d7bba1921738f5a8762dda3 Mon Sep 17 00:00:00 2001 From: Chris Buckland Date: Mon, 23 Oct 2023 17:47:02 +0200 Subject: [PATCH 183/292] Added forge to 4844 yml --- .github/workflows/contract-tests.yml | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/.github/workflows/contract-tests.yml b/.github/workflows/contract-tests.yml index 41f4aedc..b70501e4 100644 --- a/.github/workflows/contract-tests.yml +++ b/.github/workflows/contract-tests.yml @@ -97,6 +97,11 @@ jobs: - uses: actions/checkout@v3 with: submodules: recursive + + - name: Install Foundry + uses: foundry-rs/foundry-toolchain@v1 + with: + version: nightly - uses: OffchainLabs/actions/run-nitro-test-node@test-node-args with: From 85230d320e1380b7bfad8c6335d3ff943b3be1a7 Mon Sep 17 00:00:00 2001 From: Chris Buckland Date: Mon, 23 Oct 2023 17:56:42 +0200 Subject: [PATCH 184/292] Updated seq inbox dot --- test/storage/SequencerInbox.dot | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/storage/SequencerInbox.dot b/test/storage/SequencerInbox.dot index 7c268d5c..2fb98a6a 100644 --- a/test/storage/SequencerInbox.dot +++ b/test/storage/SequencerInbox.dot @@ -4,7 +4,7 @@ rankdir=LR color=black arrowhead=open node [shape=record, style=filled, fillcolor=gray95 fontname="Courier New"] -3 [label="SequencerInbox \<\\>\n | {{ slot| 0 | 1 | 2 | 3 | 4-7 | 8 | 9 | 10 } | { type: \.variable (bytes) | { uint256: totalDelayedMessagesRead (32) } | { unallocated (12) | IBridge: bridge (20) } | { unallocated (12) | IOwnable: rollup (20) } | { mapping\(address=\>bool\): isBatchPoster (32) } | { <9> ISequencerInbox.MaxTimeVariation: maxTimeVariation (128) } | { <12> mapping\(bytes32=\>DasKeySetInfo\): dasKeySetInfo (32) } | { mapping\(address=\>bool\): isSequencer (32) } | { unallocated (12) | IDataHashReader: dataHashReader (20) }}}"] +3 [label="SequencerInbox \<\\>\n | {{ slot| 0 | 1 | 2 | 3 | 4-7 | 8 | 9 | 10 | 11 } | { type: \.variable (bytes) | { uint256: totalDelayedMessagesRead (32) } | { unallocated (12) | IBridge: bridge (20) } | { unallocated (12) | IOwnable: rollup (20) } | { mapping\(address=\>bool\): isBatchPoster (32) } | { <9> ISequencerInbox.MaxTimeVariation: maxTimeVariation (128) } | { <12> mapping\(bytes32=\>DasKeySetInfo\): dasKeySetInfo (32) } | { mapping\(address=\>bool\): isSequencer (32) } | { unallocated (12) | IDataHashReader: dataHashReader (20) } | { unallocated (12) | IBlobBasefeeReader: blobBasefeeReader (20) }}}"] 1 [label="ISequencerInbox.MaxTimeVariation \<\\>\n | {{ slot| 4 | 5 | 6 | 7 } | { type: variable (bytes) | { uint256: MaxTimeVariation.delayBlocks (32) } | { uint256: MaxTimeVariation.futureBlocks (32) } | { uint256: MaxTimeVariation.delaySeconds (32) } | { uint256: MaxTimeVariation.futureSeconds (32) }}}"] From dd549ab08926ecad32d4644d504260bb1fa1cff2 Mon Sep 17 00:00:00 2001 From: Chris Buckland Date: Mon, 23 Oct 2023 18:36:19 +0200 Subject: [PATCH 185/292] Remove newline --- test/contract/arbRollup.spec.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/test/contract/arbRollup.spec.ts b/test/contract/arbRollup.spec.ts index d40967b4..beaa4254 100644 --- a/test/contract/arbRollup.spec.ts +++ b/test/contract/arbRollup.spec.ts @@ -270,7 +270,6 @@ const setup = async () => { const dummyDataHashReader = '0x0000000000000000000000000000000000000089' const dummyBlobBasefeeReader = '0x0000000000000000000000000000000000000090' - const deployParams = { config: await getDefaultConfig(), batchPoster: await sequencer.getAddress(), From e9cb9fab03cb18f7be5f00e92b0adc509960298c Mon Sep 17 00:00:00 2001 From: gzeon Date: Tue, 24 Oct 2023 18:12:25 +0800 Subject: [PATCH 186/292] feat: outbox postUpgradeInit --- src/bridge/AbsOutbox.sol | 16 +++++++++++++++- src/bridge/IOutbox.sol | 6 ++++++ src/libraries/Error.sol | 5 ++++- 3 files changed, 25 insertions(+), 2 deletions(-) diff --git a/src/bridge/AbsOutbox.sol b/src/bridge/AbsOutbox.sol index 2b87c726..2678f1fb 100644 --- a/src/bridge/AbsOutbox.sol +++ b/src/bridge/AbsOutbox.sol @@ -12,7 +12,8 @@ import { UnknownRoot, AlreadySpent, BridgeCallFailed, - HadZeroInit + HadZeroInit, + BadPostUpgradeInit } from "../libraries/Error.sol"; import "./IBridge.sol"; import "./IOutbox.sol"; @@ -76,6 +77,19 @@ abstract contract AbsOutbox is DelegateCallAware, IOutbox { rollup = address(_bridge.rollup()); } + function postUpgradeInit() external onlyDelegated onlyProxyOwner { + // prevent postUpgradeInit within a withdrawal + if (context.l2Block != L2BLOCK_DEFAULT_CONTEXT) revert BadPostUpgradeInit(); + context = L2ToL1Context({ + l2Block: L2BLOCK_DEFAULT_CONTEXT, + l1Block: L1BLOCK_DEFAULT_CONTEXT, + timestamp: TIMESTAMP_DEFAULT_CONTEXT, + outputId: OUTPUTID_DEFAULT_CONTEXT, + sender: SENDER_DEFAULT_CONTEXT, + withdrawalAmount: _defaultContextAmount() + }); + } + function updateSendRoot(bytes32 root, bytes32 l2BlockHash) external { if (msg.sender != rollup) revert NotRollup(msg.sender, rollup); roots[root] = l2BlockHash; diff --git a/src/bridge/IOutbox.sol b/src/bridge/IOutbox.sol index 06358170..be888634 100644 --- a/src/bridge/IOutbox.sol +++ b/src/bridge/IOutbox.sol @@ -119,4 +119,10 @@ interface IOutbox { uint256 path, bytes32 item ) external pure returns (bytes32); + + /** + * @dev function to be called one time during the outbox upgrade process + * this is used to fix the storage slots + */ + function postUpgradeInit() external; } diff --git a/src/libraries/Error.sol b/src/libraries/Error.sol index beb0afc8..e4776d80 100644 --- a/src/libraries/Error.sol +++ b/src/libraries/Error.sol @@ -7,9 +7,12 @@ pragma solidity ^0.8.4; /// @dev Init was already called error AlreadyInit(); -/// Init was called with param set to zero that must be nonzero +/// @dev Init was called with param set to zero that must be nonzero error HadZeroInit(); +/// @dev Thrown when post upgrade init validation fails +error BadPostUpgradeInit(); + /// @dev Thrown when non owner tries to access an only-owner function /// @param sender The msg.sender who is not the owner /// @param owner The owner address From b8b711e347a93b960e0c2c9d54e8b7d2bf1eb849 Mon Sep 17 00:00:00 2001 From: Chris Buckland Date: Wed, 2 Aug 2023 14:06:58 +0200 Subject: [PATCH 187/292] Removed whenNotPaused from deposit withdrawal --- src/rollup/RollupUserLogic.sol | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/rollup/RollupUserLogic.sol b/src/rollup/RollupUserLogic.sol index bd16ad5e..0617f363 100644 --- a/src/rollup/RollupUserLogic.sol +++ b/src/rollup/RollupUserLogic.sol @@ -234,7 +234,7 @@ abstract contract AbsRollupUserLogic is * and move it to the desired node. * @param stakerAddress Address of the staker whose stake is refunded */ - function returnOldDeposit(address stakerAddress) external override onlyValidator whenNotPaused { + function returnOldDeposit(address stakerAddress) external override onlyValidator { require(latestStakedNode(stakerAddress) <= latestConfirmed(), "TOO_RECENT"); requireUnchallengedStaker(stakerAddress); withdrawStaker(stakerAddress); @@ -258,7 +258,7 @@ abstract contract AbsRollupUserLogic is * @notice Reduce the amount staked for the sender (difference between initial amount staked and target is creditted back to the sender). * @param target Target amount of stake for the staker. If this is below the current minimum, it will be set to minimum instead */ - function reduceDeposit(uint256 target) external onlyValidator whenNotPaused { + function reduceDeposit(uint256 target) external onlyValidator { requireUnchallengedStaker(msg.sender); uint256 currentRequired = currentRequiredStake(); if (target < currentRequired) { @@ -659,7 +659,7 @@ contract RollupUserLogic is AbsRollupUserLogic, IRollupUser { /** * @notice Withdraw uncommitted funds owned by sender from the rollup chain */ - function withdrawStakerFunds() external override onlyValidator whenNotPaused returns (uint256) { + function withdrawStakerFunds() external override onlyValidator returns (uint256) { uint256 amount = withdrawFunds(msg.sender); // This is safe because it occurs after all checks and effects // solhint-disable-next-line avoid-low-level-calls @@ -731,7 +731,7 @@ contract ERC20RollupUserLogic is AbsRollupUserLogic, IRollupUserERC20 { /** * @notice Withdraw uncommitted funds owned by sender from the rollup chain */ - function withdrawStakerFunds() external override onlyValidator whenNotPaused returns (uint256) { + function withdrawStakerFunds() external override onlyValidator returns (uint256) { uint256 amount = withdrawFunds(msg.sender); // This is safe because it occurs after all checks and effects require(IERC20Upgradeable(stakeToken).transfer(msg.sender, amount), "TRANSFER_FAILED"); From 0139283b2db6c1f85eb1cfff8277875c3eb1dda6 Mon Sep 17 00:00:00 2001 From: gzeon Date: Mon, 7 Aug 2023 12:38:20 +0100 Subject: [PATCH 188/292] test: withdraw on pause --- test/contract/arbRollup.spec.ts | 2 ++ 1 file changed, 2 insertions(+) diff --git a/test/contract/arbRollup.spec.ts b/test/contract/arbRollup.spec.ts index fca5eb97..5740b92a 100644 --- a/test/contract/arbRollup.spec.ts +++ b/test/contract/arbRollup.spec.ts @@ -823,6 +823,7 @@ describe('ArbRollup', () => { .connect(validators[1]) .addToDeposit(await validators[1].getAddress(), { value: 5 }) + await rollupAdmin.pause() await rollup.connect(validators[1]).reduceDeposit(5) const prevBalance = await validators[1].getBalance() @@ -849,6 +850,7 @@ describe('ArbRollup', () => { .connect(validators[1]) .returnOldDeposit(await validators[1].getAddress()) // all stake is now removed + await rollupAdmin.resume() }) it('should allow removing zombies', async function () { From 36c568b38ecdd631db79148150d9eb06fc0c1149 Mon Sep 17 00:00:00 2001 From: Chris Buckland Date: Fri, 22 Sep 2023 16:10:08 +0200 Subject: [PATCH 189/292] Added test for force refunding staker --- test/contract/arbRollup.spec.ts | 112 ++++++++++++++++++-------------- 1 file changed, 64 insertions(+), 48 deletions(-) diff --git a/test/contract/arbRollup.spec.ts b/test/contract/arbRollup.spec.ts index 5740b92a..24132b29 100644 --- a/test/contract/arbRollup.spec.ts +++ b/test/contract/arbRollup.spec.ts @@ -789,69 +789,85 @@ describe('ArbRollup', () => { await rollup.confirmNextNode(challengerNode) }) - it('should add and remove stakes correctly', async function () { - /* - RollupUser functions that alter stake and their respective Core logic + it('allow force refund staker with pending node', async function () { + await (await rollupAdmin.pause()).wait(); + await (await rollupAdmin.forceRefundStaker([await validators[1].getAddress()])).wait() + await (await rollup.rollup.connect(validators[1]).withdrawStakerFunds()).wait() + await (await rollupAdmin.resume()).wait(); - user: newStake - core: createNewStake + const postWithdrawablefunds = await rollup.rollup.withdrawableFunds( + await validators[1].getAddress() + ) + expect(postWithdrawablefunds, "withdrawable funds").to.equal(0) + const stake = await rollup.rollup.amountStaked( + await validators[1].getAddress() + ) + expect(stake, "amount staked").to.equal(0) + }) - user: addToDeposit - core: increaseStakeBy + // it('should add and remove stakes correctly', async function () { + // /* + // RollupUser functions that alter stake and their respective Core logic - user: reduceDeposit - core: reduceStakeTo + // user: newStake + // core: createNewStake - user: returnOldDeposit - core: withdrawStaker + // user: addToDeposit + // core: increaseStakeBy - user: withdrawStakerFunds - core: withdrawFunds - */ + // user: reduceDeposit + // core: reduceStakeTo - const initialStake = await rollup.rollup.amountStaked( - await validators[1].getAddress() - ) + // user: returnOldDeposit + // core: withdrawStaker - await rollup.connect(validators[1]).reduceDeposit(initialStake) + // user: withdrawStakerFunds + // core: withdrawFunds + // */ - await expect( - rollup.connect(validators[1]).reduceDeposit(initialStake.add(1)) - ).to.be.revertedWith('TOO_LITTLE_STAKE') + // const initialStake = await rollup.rollup.amountStaked( + // await validators[1].getAddress() + // ) - await rollup - .connect(validators[1]) - .addToDeposit(await validators[1].getAddress(), { value: 5 }) + // await rollup.connect(validators[1]).reduceDeposit(initialStake) - await rollupAdmin.pause() - await rollup.connect(validators[1]).reduceDeposit(5) + // await expect( + // rollup.connect(validators[1]).reduceDeposit(initialStake.add(1)) + // ).to.be.revertedWith('TOO_LITTLE_STAKE') - const prevBalance = await validators[1].getBalance() - const prevWithdrawablefunds = await rollup.rollup.withdrawableFunds( - await validators[1].getAddress() - ) + // await rollup + // .connect(validators[1]) + // .addToDeposit(await validators[1].getAddress(), { value: 5 }) - const tx = await rollup.rollup.connect(validators[1]).withdrawStakerFunds() - const receipt = await tx.wait() - const gasPaid = receipt.gasUsed.mul(receipt.effectiveGasPrice) + // await rollupAdmin.pause() + // await rollup.connect(validators[1]).reduceDeposit(5) - const postBalance = await validators[1].getBalance() - const postWithdrawablefunds = await rollup.rollup.withdrawableFunds( - await validators[1].getAddress() - ) + // const prevBalance = await validators[1].getBalance() + // const prevWithdrawablefunds = await rollup.rollup.withdrawableFunds( + // await validators[1].getAddress() + // ) - expect(postWithdrawablefunds).to.equal(0) - expect(postBalance.add(gasPaid)).to.equal( - prevBalance.add(prevWithdrawablefunds) - ) + // const tx = await rollup.rollup.connect(validators[1]).withdrawStakerFunds() + // const receipt = await tx.wait() + // const gasPaid = receipt.gasUsed.mul(receipt.effectiveGasPrice) - // this gets deposit and removes staker - await rollup.rollup - .connect(validators[1]) - .returnOldDeposit(await validators[1].getAddress()) - // all stake is now removed - await rollupAdmin.resume() - }) + // const postBalance = await validators[1].getBalance() + // const postWithdrawablefunds = await rollup.rollup.withdrawableFunds( + // await validators[1].getAddress() + // ) + + // expect(postWithdrawablefunds).to.equal(0) + // expect(postBalance.add(gasPaid)).to.equal( + // prevBalance.add(prevWithdrawablefunds) + // ) + + // // this gets deposit and removes staker + // await rollup.rollup + // .connect(validators[1]) + // .returnOldDeposit(await validators[1].getAddress()) + // // all stake is now removed + // await rollupAdmin.resume() + // }) it('should allow removing zombies', async function () { const zombieCount = ( From 010c37fcbefd4fc044d37ea29fd25e15f8afec8c Mon Sep 17 00:00:00 2001 From: gzeon Date: Tue, 24 Oct 2023 19:47:52 +0800 Subject: [PATCH 190/292] feat: whenNotPausedOrDeprecated --- src/rollup/RollupUserLogic.sol | 30 ++++++++++++++++++++++++++---- 1 file changed, 26 insertions(+), 4 deletions(-) diff --git a/src/rollup/RollupUserLogic.sol b/src/rollup/RollupUserLogic.sol index 0617f363..c3653ede 100644 --- a/src/rollup/RollupUserLogic.sol +++ b/src/rollup/RollupUserLogic.sol @@ -227,6 +227,11 @@ abstract contract AbsRollupUserLogic is stakeOnNode(msg.sender, latestNodeCreated()); } + modifier whenNotPausedOrDeprecated() { + require(!paused() || address(bridge.rollup()) != address(this), "PAUSED_OR_NOT_DEPRECATED"); + _; + } + /** * @notice Refund a staker that is currently staked on or before the latest confirmed node * @dev Since a staker is initially placed in the latest confirmed node, if they don't move it @@ -234,7 +239,12 @@ abstract contract AbsRollupUserLogic is * and move it to the desired node. * @param stakerAddress Address of the staker whose stake is refunded */ - function returnOldDeposit(address stakerAddress) external override onlyValidator { + function returnOldDeposit(address stakerAddress) + external + override + onlyValidator + whenNotPausedOrDeprecated + { require(latestStakedNode(stakerAddress) <= latestConfirmed(), "TOO_RECENT"); requireUnchallengedStaker(stakerAddress); withdrawStaker(stakerAddress); @@ -258,7 +268,7 @@ abstract contract AbsRollupUserLogic is * @notice Reduce the amount staked for the sender (difference between initial amount staked and target is creditted back to the sender). * @param target Target amount of stake for the staker. If this is below the current minimum, it will be set to minimum instead */ - function reduceDeposit(uint256 target) external onlyValidator { + function reduceDeposit(uint256 target) external onlyValidator whenNotPausedOrDeprecated { requireUnchallengedStaker(msg.sender); uint256 currentRequired = currentRequiredStake(); if (target < currentRequired) { @@ -659,7 +669,13 @@ contract RollupUserLogic is AbsRollupUserLogic, IRollupUser { /** * @notice Withdraw uncommitted funds owned by sender from the rollup chain */ - function withdrawStakerFunds() external override onlyValidator returns (uint256) { + function withdrawStakerFunds() + external + override + onlyValidator + whenNotPausedOrDeprecated + returns (uint256) + { uint256 amount = withdrawFunds(msg.sender); // This is safe because it occurs after all checks and effects // solhint-disable-next-line avoid-low-level-calls @@ -731,7 +747,13 @@ contract ERC20RollupUserLogic is AbsRollupUserLogic, IRollupUserERC20 { /** * @notice Withdraw uncommitted funds owned by sender from the rollup chain */ - function withdrawStakerFunds() external override onlyValidator returns (uint256) { + function withdrawStakerFunds() + external + override + onlyValidator + whenNotPausedOrDeprecated + returns (uint256) + { uint256 amount = withdrawFunds(msg.sender); // This is safe because it occurs after all checks and effects require(IERC20Upgradeable(stakeToken).transfer(msg.sender, amount), "TRANSFER_FAILED"); From 01152be1da813fb60010f0d5dceed0d27fa2d4d7 Mon Sep 17 00:00:00 2001 From: gzeon Date: Tue, 24 Oct 2023 19:57:22 +0800 Subject: [PATCH 191/292] feat: allow updating rollup address in bridge --- src/bridge/AbsBridge.sol | 5 +++++ src/bridge/IBridge.sol | 2 ++ src/mocks/BridgeStub.sol | 4 ++++ src/test-helpers/BridgeTester.sol | 4 ++++ 4 files changed, 15 insertions(+) diff --git a/src/bridge/AbsBridge.sol b/src/bridge/AbsBridge.sol index 88577d2d..29cf6a84 100644 --- a/src/bridge/AbsBridge.sol +++ b/src/bridge/AbsBridge.sol @@ -57,6 +57,11 @@ abstract contract AbsBridge is Initializable, DelegateCallAware, IBridge { address internal constant EMPTY_ACTIVEOUTBOX = address(type(uint160).max); + /// @notice Allows the proxy owner to set the rollup address + function updateRollupAddress(IOwnable _rollup) external onlyDelegated onlyProxyOwner { + rollup = _rollup; + } + modifier onlyRollupOrOwner() { if (msg.sender != address(rollup)) { address rollupOwner = rollup.owner(); diff --git a/src/bridge/IBridge.sol b/src/bridge/IBridge.sol index 49c3c13f..7804f289 100644 --- a/src/bridge/IBridge.sol +++ b/src/bridge/IBridge.sol @@ -97,4 +97,6 @@ interface IBridge { function setDelayedInbox(address inbox, bool enabled) external; function setOutbox(address inbox, bool enabled) external; + + function updateRollupAddress(IOwnable _rollup) external; } diff --git a/src/mocks/BridgeStub.sol b/src/mocks/BridgeStub.sol index 37c994e4..2e2dee05 100644 --- a/src/mocks/BridgeStub.sol +++ b/src/mocks/BridgeStub.sol @@ -45,6 +45,10 @@ contract BridgeStub is IBridge, IEthBridge { revert("NOT_IMPLEMENTED"); } + function updateRollupAddress(IOwnable) external pure { + revert("NOT_IMPLEMENTED"); + } + function enqueueDelayedMessage( uint8 kind, address sender, diff --git a/src/test-helpers/BridgeTester.sol b/src/test-helpers/BridgeTester.sol index bd1fc7da..a739957f 100644 --- a/src/test-helpers/BridgeTester.sol +++ b/src/test-helpers/BridgeTester.sol @@ -74,6 +74,10 @@ contract BridgeTester is Initializable, DelegateCallAware, IBridge, IEthBridge { rollup = rollup_; } + function updateRollupAddress(IOwnable _rollup) external onlyDelegated onlyProxyOwner { + rollup = _rollup; + } + function activeOutbox() public view returns (address) { if (_activeOutbox == EMPTY_ACTIVEOUTBOX) return address(uint160(0)); return _activeOutbox; From 674b0e557f7844a676d2a43124d5b8275b9dbd6c Mon Sep 17 00:00:00 2001 From: gzeon Date: Tue, 24 Oct 2023 20:03:16 +0800 Subject: [PATCH 192/292] feat: allow updating rollup address --- src/bridge/AbsOutbox.sol | 5 +++++ src/bridge/IOutbox.sol | 2 ++ src/bridge/ISequencerInbox.sol | 2 ++ src/bridge/SequencerInbox.sol | 5 +++++ src/rollup/AbsRollupEventInbox.sol | 5 +++++ src/rollup/IRollupEventInbox.sol | 2 ++ src/test-helpers/OutboxWithoutOptTester.sol | 4 ++++ 7 files changed, 25 insertions(+) diff --git a/src/bridge/AbsOutbox.sol b/src/bridge/AbsOutbox.sol index 2b87c726..c9dd3eba 100644 --- a/src/bridge/AbsOutbox.sol +++ b/src/bridge/AbsOutbox.sol @@ -76,6 +76,11 @@ abstract contract AbsOutbox is DelegateCallAware, IOutbox { rollup = address(_bridge.rollup()); } + /// @notice Allows the proxy owner to set the rollup address + function updateRollupAddress() external onlyDelegated onlyProxyOwner { + rollup = address(bridge.rollup()); + } + function updateSendRoot(bytes32 root, bytes32 l2BlockHash) external { if (msg.sender != rollup) revert NotRollup(msg.sender, rollup); roots[root] = l2BlockHash; diff --git a/src/bridge/IOutbox.sol b/src/bridge/IOutbox.sol index 06358170..21bf02f8 100644 --- a/src/bridge/IOutbox.sol +++ b/src/bridge/IOutbox.sol @@ -31,6 +31,8 @@ interface IOutbox { function updateSendRoot(bytes32 sendRoot, bytes32 l2BlockHash) external; + function updateRollupAddress() 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 reentrancies diff --git a/src/bridge/ISequencerInbox.sol b/src/bridge/ISequencerInbox.sol index b4fadddb..7d66befc 100644 --- a/src/bridge/ISequencerInbox.sol +++ b/src/bridge/ISequencerInbox.sol @@ -177,4 +177,6 @@ interface ISequencerInbox is IDelayedMessageProvider { // ---------- initializer ---------- function initialize(IBridge bridge_, MaxTimeVariation calldata maxTimeVariation_) external; + + function updateRollupAddress() external; } diff --git a/src/bridge/SequencerInbox.sol b/src/bridge/SequencerInbox.sol index c1cb745f..4f63d716 100644 --- a/src/bridge/SequencerInbox.sol +++ b/src/bridge/SequencerInbox.sol @@ -91,6 +91,11 @@ contract SequencerInbox is DelegateCallAware, GasRefundEnabled, ISequencerInbox maxTimeVariation = maxTimeVariation_; } + /// @notice Allows the proxy owner to set the rollup address + function updateRollupAddress() external onlyDelegated onlyProxyOwner { + rollup = bridge.rollup(); + } + function getTimeBounds() internal view virtual returns (TimeBounds memory) { TimeBounds memory bounds; if (block.timestamp > maxTimeVariation.delaySeconds) { diff --git a/src/rollup/AbsRollupEventInbox.sol b/src/rollup/AbsRollupEventInbox.sol index b2f89fcd..80f905e6 100644 --- a/src/rollup/AbsRollupEventInbox.sol +++ b/src/rollup/AbsRollupEventInbox.sol @@ -37,6 +37,11 @@ abstract contract AbsRollupEventInbox is rollup = address(_bridge.rollup()); } + /// @notice Allows the proxy owner to set the rollup address + function updateRollupAddress() external onlyDelegated onlyProxyOwner { + rollup = address(bridge.rollup()); + } + function rollupInitialized(uint256 chainId, string calldata chainConfig) external override diff --git a/src/rollup/IRollupEventInbox.sol b/src/rollup/IRollupEventInbox.sol index beb1b4ed..2e79f7e6 100644 --- a/src/rollup/IRollupEventInbox.sol +++ b/src/rollup/IRollupEventInbox.sol @@ -13,5 +13,7 @@ interface IRollupEventInbox { function rollup() external view returns (address); + function updateRollupAddress() external; + function rollupInitialized(uint256 chainId, string calldata chainConfig) external; } diff --git a/src/test-helpers/OutboxWithoutOptTester.sol b/src/test-helpers/OutboxWithoutOptTester.sol index 50f378ac..957e7d84 100644 --- a/src/test-helpers/OutboxWithoutOptTester.sol +++ b/src/test-helpers/OutboxWithoutOptTester.sol @@ -54,6 +54,10 @@ contract OutboxWithoutOptTester is DelegateCallAware, IOutbox { emit SendRootUpdated(root, l2BlockHash); } + function updateRollupAddress() external onlyDelegated onlyProxyOwner { + rollup = address(bridge.rollup()); + } + /// @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 reentrancies From 6247b41dde3f18342a2f717ec86c4d7c425893fa Mon Sep 17 00:00:00 2001 From: gzeon Date: Tue, 24 Oct 2023 20:04:53 +0800 Subject: [PATCH 193/292] format: fix --- test/contract/arbRollup.spec.ts | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/test/contract/arbRollup.spec.ts b/test/contract/arbRollup.spec.ts index 24132b29..b7bcb0b2 100644 --- a/test/contract/arbRollup.spec.ts +++ b/test/contract/arbRollup.spec.ts @@ -790,19 +790,23 @@ describe('ArbRollup', () => { }) it('allow force refund staker with pending node', async function () { - await (await rollupAdmin.pause()).wait(); - await (await rollupAdmin.forceRefundStaker([await validators[1].getAddress()])).wait() - await (await rollup.rollup.connect(validators[1]).withdrawStakerFunds()).wait() - await (await rollupAdmin.resume()).wait(); + await (await rollupAdmin.pause()).wait() + await ( + await rollupAdmin.forceRefundStaker([await validators[1].getAddress()]) + ).wait() + await ( + await rollup.rollup.connect(validators[1]).withdrawStakerFunds() + ).wait() + await (await rollupAdmin.resume()).wait() const postWithdrawablefunds = await rollup.rollup.withdrawableFunds( await validators[1].getAddress() ) - expect(postWithdrawablefunds, "withdrawable funds").to.equal(0) + expect(postWithdrawablefunds, 'withdrawable funds').to.equal(0) const stake = await rollup.rollup.amountStaked( await validators[1].getAddress() ) - expect(stake, "amount staked").to.equal(0) + expect(stake, 'amount staked').to.equal(0) }) // it('should add and remove stakes correctly', async function () { From ceed8da1900cea02e518755b2011c024e4cf4041 Mon Sep 17 00:00:00 2001 From: gzeon Date: Tue, 24 Oct 2023 22:06:01 +0800 Subject: [PATCH 194/292] fix: allow rollup admin instead --- src/bridge/AbsBridge.sol | 11 ++++++----- src/bridge/AbsOutbox.sol | 6 ++++-- src/bridge/SequencerInbox.sol | 6 ++++-- src/libraries/Error.sol | 3 +++ src/rollup/AbsRollupEventInbox.sol | 6 ++++-- src/test-helpers/BridgeTester.sol | 2 +- 6 files changed, 22 insertions(+), 12 deletions(-) diff --git a/src/bridge/AbsBridge.sol b/src/bridge/AbsBridge.sol index 29cf6a84..51de0dbd 100644 --- a/src/bridge/AbsBridge.sol +++ b/src/bridge/AbsBridge.sol @@ -14,6 +14,7 @@ import { NotSequencerInbox, NotOutbox, InvalidOutboxSet, + InvalidRollupSet, BadSequencerMessageNumber } from "../libraries/Error.sol"; import "./IBridge.sol"; @@ -57,11 +58,6 @@ abstract contract AbsBridge is Initializable, DelegateCallAware, IBridge { address internal constant EMPTY_ACTIVEOUTBOX = address(type(uint160).max); - /// @notice Allows the proxy owner to set the rollup address - function updateRollupAddress(IOwnable _rollup) external onlyDelegated onlyProxyOwner { - rollup = _rollup; - } - modifier onlyRollupOrOwner() { if (msg.sender != address(rollup)) { address rollupOwner = rollup.owner(); @@ -72,6 +68,11 @@ abstract contract AbsBridge is Initializable, DelegateCallAware, IBridge { _; } + /// @notice Allows the rollup owner to set another rollup address + function updateRollupAddress(IOwnable _rollup) external onlyRollupOrOwner { + rollup = _rollup; + } + /// @dev returns the address of current active Outbox, or zero if no outbox is active function activeOutbox() public view returns (address) { address outbox = _activeOutbox; diff --git a/src/bridge/AbsOutbox.sol b/src/bridge/AbsOutbox.sol index c9dd3eba..f49e092b 100644 --- a/src/bridge/AbsOutbox.sol +++ b/src/bridge/AbsOutbox.sol @@ -76,8 +76,10 @@ abstract contract AbsOutbox is DelegateCallAware, IOutbox { rollup = address(_bridge.rollup()); } - /// @notice Allows the proxy owner to set the rollup address - function updateRollupAddress() external onlyDelegated onlyProxyOwner { + /// @notice Allows the rollup owner to sync the rollup address + function updateRollupAddress() external { + if (msg.sender != IOwnable(rollup).owner()) + revert NotOwner(msg.sender, IOwnable(rollup).owner()); rollup = address(bridge.rollup()); } diff --git a/src/bridge/SequencerInbox.sol b/src/bridge/SequencerInbox.sol index 4f63d716..921122f3 100644 --- a/src/bridge/SequencerInbox.sol +++ b/src/bridge/SequencerInbox.sol @@ -91,8 +91,10 @@ contract SequencerInbox is DelegateCallAware, GasRefundEnabled, ISequencerInbox maxTimeVariation = maxTimeVariation_; } - /// @notice Allows the proxy owner to set the rollup address - function updateRollupAddress() external onlyDelegated onlyProxyOwner { + /// @notice Allows the rollup owner to sync the rollup address + function updateRollupAddress() external { + if (msg.sender != IOwnable(rollup).owner()) + revert NotOwner(msg.sender, IOwnable(rollup).owner()); rollup = bridge.rollup(); } diff --git a/src/libraries/Error.sol b/src/libraries/Error.sol index beb0afc8..d70f92d4 100644 --- a/src/libraries/Error.sol +++ b/src/libraries/Error.sol @@ -172,3 +172,6 @@ error AlreadyValidDASKeyset(bytes32); /// @dev Tried to use or invalidate an already invalid Data Availability Service keyset error NoSuchKeyset(bytes32); + +/// @dev Invalid rollup address is set +error InvalidRollupSet(address); diff --git a/src/rollup/AbsRollupEventInbox.sol b/src/rollup/AbsRollupEventInbox.sol index 80f905e6..6fa42ea3 100644 --- a/src/rollup/AbsRollupEventInbox.sol +++ b/src/rollup/AbsRollupEventInbox.sol @@ -37,8 +37,10 @@ abstract contract AbsRollupEventInbox is rollup = address(_bridge.rollup()); } - /// @notice Allows the proxy owner to set the rollup address - function updateRollupAddress() external onlyDelegated onlyProxyOwner { + /// @notice Allows the rollup owner to sync the rollup address + function updateRollupAddress() external { + if (msg.sender != IOwnable(rollup).owner()) + revert NotOwner(msg.sender, IOwnable(rollup).owner()); rollup = address(bridge.rollup()); } diff --git a/src/test-helpers/BridgeTester.sol b/src/test-helpers/BridgeTester.sol index a739957f..0bcbe00f 100644 --- a/src/test-helpers/BridgeTester.sol +++ b/src/test-helpers/BridgeTester.sol @@ -74,7 +74,7 @@ contract BridgeTester is Initializable, DelegateCallAware, IBridge, IEthBridge { rollup = rollup_; } - function updateRollupAddress(IOwnable _rollup) external onlyDelegated onlyProxyOwner { + function updateRollupAddress(IOwnable _rollup) external { rollup = _rollup; } From baade430eda5cd8a08ddc32534049dd1ea7dfa4d Mon Sep 17 00:00:00 2001 From: gzeon Date: Tue, 24 Oct 2023 22:06:10 +0800 Subject: [PATCH 195/292] test: fixes --- test/contract/arbRollup.spec.ts | 133 +++++++++++++++++++------------- 1 file changed, 78 insertions(+), 55 deletions(-) diff --git a/test/contract/arbRollup.spec.ts b/test/contract/arbRollup.spec.ts index b7bcb0b2..0dcf03d8 100644 --- a/test/contract/arbRollup.spec.ts +++ b/test/contract/arbRollup.spec.ts @@ -46,6 +46,7 @@ import { RollupUserLogic__factory, SequencerInbox, SequencerInbox__factory, + Bridge, } from '../../build/types' import { abi as UpgradeExecutorABI, @@ -86,6 +87,7 @@ const wasmModuleRoot = let rollup: RollupContract let rollupUser: RollupUserLogic let rollupAdmin: RollupAdminLogic +let bridge: Bridge let accounts: Signer[] let validators: Signer[] let sequencerInbox: SequencerInbox @@ -93,6 +95,7 @@ let admin: Signer let sequencer: Signer let challengeManager: ChallengeManager let upgradeExecutor: string +let adminproxy: string async function getDefaultConfig( _confirmPeriodBlocks = confirmationPeriodBlocks @@ -275,6 +278,7 @@ const setup = async () => { await val1.getAddress(), await val2.getAddress(), await val3.getAddress(), + await val4.getAddress(), ], maxDataSize: 117964, nativeToken: ethers.constants.AddressZero, @@ -298,6 +302,7 @@ const setup = async () => { const rollupUser = rollupUserLogicFac .attach(rollupCreatedEvent.rollupAddress) .connect(user) + const bridge = ethBridgeFac.attach(rollupCreatedEvent.bridge).connect(user) sequencerInbox = ( (await ethers.getContractFactory( @@ -328,8 +333,9 @@ const setup = async () => { sequencerInbox: rollupCreatedEvent.sequencerInbox, delayedBridge: rollupCreatedEvent.bridge, delayedInbox: rollupCreatedEvent.inboxAddress, - bridge: rollupCreatedEvent.bridge, + bridge, upgradeExecutorAddress: rollupCreatedEvent.upgradeExecutor, + adminproxy: rollupCreatedEvent.adminProxy, } } @@ -509,15 +515,19 @@ describe('ArbRollup', () => { const { rollupAdmin: rollupAdminContract, rollupUser: rollupUserContract, + bridge: bridgeContract, admin: adminI, validators: validatorsI, upgradeExecutorAddress, + adminproxy: adminproxyAddress, } = await setup() rollupAdmin = rollupAdminContract rollupUser = rollupUserContract + bridge = bridgeContract admin = adminI validators = validatorsI upgradeExecutor = upgradeExecutorAddress + adminproxy = adminproxyAddress rollup = new RollupContract(rollupUser.connect(validators[0])) }) @@ -580,6 +590,9 @@ describe('ArbRollup', () => { await rollupUser .connect(validators[2]) .newStakeOnExistingNode(1, prevNode.nodeHash, { value: stake }) + await rollupUser + .connect(validators[3]) + .newStakeOnExistingNode(1, prevNode.nodeHash, { value: stake }) }) it('should move stake to a new node', async function () { @@ -790,88 +803,98 @@ describe('ArbRollup', () => { }) it('allow force refund staker with pending node', async function () { - await (await rollupAdmin.pause()).wait() + await rollupAdmin.connect(await impersonateAccount(upgradeExecutor)).pause() await ( - await rollupAdmin.forceRefundStaker([await validators[1].getAddress()]) + await rollupAdmin + .connect(await impersonateAccount(upgradeExecutor)) + .forceRefundStaker([await validators[3].getAddress()]) ).wait() + // staker can only withdraw if rollup address changed when paused + await bridge + .connect(await impersonateAccount(rollup.rollup.address)) + .updateRollupAddress(ethers.constants.AddressZero) await ( - await rollup.rollup.connect(validators[1]).withdrawStakerFunds() + await rollup.rollup.connect(validators[3]).withdrawStakerFunds() ).wait() - await (await rollupAdmin.resume()).wait() + await rollupAdmin + .connect(await impersonateAccount(upgradeExecutor)) + .resume() + // restore rollup address + await bridge + .connect(await impersonateAccount(ethers.constants.AddressZero)) + .updateRollupAddress(rollupUser.address) const postWithdrawablefunds = await rollup.rollup.withdrawableFunds( - await validators[1].getAddress() + await validators[3].getAddress() ) expect(postWithdrawablefunds, 'withdrawable funds').to.equal(0) const stake = await rollup.rollup.amountStaked( - await validators[1].getAddress() + await validators[3].getAddress() ) expect(stake, 'amount staked').to.equal(0) }) - // it('should add and remove stakes correctly', async function () { - // /* - // RollupUser functions that alter stake and their respective Core logic + it('should add and remove stakes correctly', async function () { + /* + RollupUser functions that alter stake and their respective Core logic - // user: newStake - // core: createNewStake + user: newStake + core: createNewStake - // user: addToDeposit - // core: increaseStakeBy + user: addToDeposit + core: increaseStakeBy - // user: reduceDeposit - // core: reduceStakeTo + user: reduceDeposit + core: reduceStakeTo - // user: returnOldDeposit - // core: withdrawStaker + user: returnOldDeposit + core: withdrawStaker - // user: withdrawStakerFunds - // core: withdrawFunds - // */ + user: withdrawStakerFunds + core: withdrawFunds + */ - // const initialStake = await rollup.rollup.amountStaked( - // await validators[1].getAddress() - // ) + const initialStake = await rollup.rollup.amountStaked( + await validators[1].getAddress() + ) - // await rollup.connect(validators[1]).reduceDeposit(initialStake) + await rollup.connect(validators[1]).reduceDeposit(initialStake) - // await expect( - // rollup.connect(validators[1]).reduceDeposit(initialStake.add(1)) - // ).to.be.revertedWith('TOO_LITTLE_STAKE') + await expect( + rollup.connect(validators[1]).reduceDeposit(initialStake.add(1)) + ).to.be.revertedWith('TOO_LITTLE_STAKE') - // await rollup - // .connect(validators[1]) - // .addToDeposit(await validators[1].getAddress(), { value: 5 }) + await rollup + .connect(validators[1]) + .addToDeposit(await validators[1].getAddress(), { value: 5 }) - // await rollupAdmin.pause() - // await rollup.connect(validators[1]).reduceDeposit(5) + await rollup.connect(validators[1]).reduceDeposit(5) - // const prevBalance = await validators[1].getBalance() - // const prevWithdrawablefunds = await rollup.rollup.withdrawableFunds( - // await validators[1].getAddress() - // ) + const prevBalance = await validators[1].getBalance() + const prevWithdrawablefunds = await rollup.rollup.withdrawableFunds( + await validators[1].getAddress() + ) - // const tx = await rollup.rollup.connect(validators[1]).withdrawStakerFunds() - // const receipt = await tx.wait() - // const gasPaid = receipt.gasUsed.mul(receipt.effectiveGasPrice) + const tx = await rollup.rollup.connect(validators[1]).withdrawStakerFunds() + const receipt = await tx.wait() + const gasPaid = receipt.gasUsed.mul(receipt.effectiveGasPrice) - // const postBalance = await validators[1].getBalance() - // const postWithdrawablefunds = await rollup.rollup.withdrawableFunds( - // await validators[1].getAddress() - // ) + const postBalance = await validators[1].getBalance() + const postWithdrawablefunds = await rollup.rollup.withdrawableFunds( + await validators[1].getAddress() + ) - // expect(postWithdrawablefunds).to.equal(0) - // expect(postBalance.add(gasPaid)).to.equal( - // prevBalance.add(prevWithdrawablefunds) - // ) + expect(postWithdrawablefunds).to.equal(0) + expect(postBalance.add(gasPaid)).to.equal( + prevBalance.add(prevWithdrawablefunds) + ) - // // this gets deposit and removes staker - // await rollup.rollup - // .connect(validators[1]) - // .returnOldDeposit(await validators[1].getAddress()) - // // all stake is now removed - // await rollupAdmin.resume() - // }) + // this gets deposit and removes staker + await rollup.rollup + .connect(validators[1]) + .returnOldDeposit(await validators[1].getAddress()) + // all stake is now removed + }) it('should allow removing zombies', async function () { const zombieCount = ( From 0c1b1fceb39ddd4fcc5080ce3da6815c38fd1c28 Mon Sep 17 00:00:00 2001 From: gzeon Date: Tue, 24 Oct 2023 22:09:31 +0800 Subject: [PATCH 196/292] fix: test contract --- src/test-helpers/OutboxWithoutOptTester.sol | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/test-helpers/OutboxWithoutOptTester.sol b/src/test-helpers/OutboxWithoutOptTester.sol index 50f378ac..0036e3c1 100644 --- a/src/test-helpers/OutboxWithoutOptTester.sol +++ b/src/test-helpers/OutboxWithoutOptTester.sol @@ -48,6 +48,8 @@ contract OutboxWithoutOptTester is DelegateCallAware, IOutbox { rollup = address(_bridge.rollup()); } + function postUpgradeInit() external {} + function updateSendRoot(bytes32 root, bytes32 l2BlockHash) external override { //if (msg.sender != rollup) revert NotRollup(msg.sender, rollup); //test only!!! roots[root] = l2BlockHash; From 5c723cb89af79fc9ffeb5ae4388d64418a0753fa Mon Sep 17 00:00:00 2001 From: gzeon Date: Tue, 24 Oct 2023 22:23:09 +0800 Subject: [PATCH 197/292] chore: remove unused error --- src/bridge/AbsBridge.sol | 1 - src/libraries/Error.sol | 8 ++++---- 2 files changed, 4 insertions(+), 5 deletions(-) diff --git a/src/bridge/AbsBridge.sol b/src/bridge/AbsBridge.sol index 51de0dbd..e4e0ae57 100644 --- a/src/bridge/AbsBridge.sol +++ b/src/bridge/AbsBridge.sol @@ -14,7 +14,6 @@ import { NotSequencerInbox, NotOutbox, InvalidOutboxSet, - InvalidRollupSet, BadSequencerMessageNumber } from "../libraries/Error.sol"; import "./IBridge.sol"; diff --git a/src/libraries/Error.sol b/src/libraries/Error.sol index d70f92d4..e4776d80 100644 --- a/src/libraries/Error.sol +++ b/src/libraries/Error.sol @@ -7,9 +7,12 @@ pragma solidity ^0.8.4; /// @dev Init was already called error AlreadyInit(); -/// Init was called with param set to zero that must be nonzero +/// @dev Init was called with param set to zero that must be nonzero error HadZeroInit(); +/// @dev Thrown when post upgrade init validation fails +error BadPostUpgradeInit(); + /// @dev Thrown when non owner tries to access an only-owner function /// @param sender The msg.sender who is not the owner /// @param owner The owner address @@ -172,6 +175,3 @@ error AlreadyValidDASKeyset(bytes32); /// @dev Tried to use or invalidate an already invalid Data Availability Service keyset error NoSuchKeyset(bytes32); - -/// @dev Invalid rollup address is set -error InvalidRollupSet(address); From fa10996cc89fc0b0aad80c915283f515e296db5e Mon Sep 17 00:00:00 2001 From: gzeon Date: Tue, 24 Oct 2023 22:25:39 +0800 Subject: [PATCH 198/292] docs: improve revert string --- src/rollup/RollupUserLogic.sol | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/rollup/RollupUserLogic.sol b/src/rollup/RollupUserLogic.sol index c3653ede..4f565f21 100644 --- a/src/rollup/RollupUserLogic.sol +++ b/src/rollup/RollupUserLogic.sol @@ -228,7 +228,7 @@ abstract contract AbsRollupUserLogic is } modifier whenNotPausedOrDeprecated() { - require(!paused() || address(bridge.rollup()) != address(this), "PAUSED_OR_NOT_DEPRECATED"); + require(!paused() || address(bridge.rollup()) != address(this), "PAUSED_AND_ACTIVE"); _; } From 4d2e1de0d7a04dc56cd24da87139e26ff09979bd Mon Sep 17 00:00:00 2001 From: gzeon Date: Tue, 24 Oct 2023 22:28:08 +0800 Subject: [PATCH 199/292] test: PAUSED_AND_ACTIVE --- test/contract/arbRollup.spec.ts | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/test/contract/arbRollup.spec.ts b/test/contract/arbRollup.spec.ts index 0dcf03d8..ac836d1d 100644 --- a/test/contract/arbRollup.spec.ts +++ b/test/contract/arbRollup.spec.ts @@ -809,16 +809,22 @@ describe('ArbRollup', () => { .connect(await impersonateAccount(upgradeExecutor)) .forceRefundStaker([await validators[3].getAddress()]) ).wait() + + await expect( + rollup.rollup.connect(validators[3]).withdrawStakerFunds() + ).to.be.revertedWith('PAUSED_AND_ACTIVE') // staker can only withdraw if rollup address changed when paused await bridge .connect(await impersonateAccount(rollup.rollup.address)) .updateRollupAddress(ethers.constants.AddressZero) + await ( await rollup.rollup.connect(validators[3]).withdrawStakerFunds() ).wait() await rollupAdmin .connect(await impersonateAccount(upgradeExecutor)) .resume() + // restore rollup address await bridge .connect(await impersonateAccount(ethers.constants.AddressZero)) From 061ccad048b143dfcd2d3fb3bcf8f5d8b681adf5 Mon Sep 17 00:00:00 2001 From: Chris Buckland Date: Tue, 24 Oct 2023 16:36:12 +0200 Subject: [PATCH 200/292] Updated docker to specific version --- test/contract/sequencerInbox.spec.4844.ts | 19 ++++++++++++------- test/contract/toolkit4844.ts | 4 +++- 2 files changed, 15 insertions(+), 8 deletions(-) diff --git a/test/contract/sequencerInbox.spec.4844.ts b/test/contract/sequencerInbox.spec.4844.ts index 645ff6e6..baa3a74b 100644 --- a/test/contract/sequencerInbox.spec.4844.ts +++ b/test/contract/sequencerInbox.spec.4844.ts @@ -262,10 +262,10 @@ describe('SequencerInbox', async () => { // update the addresses below and uncomment to avoid redeploying // return connectAddreses(user, deployer, batchPoster, { // user: '0x870204e93ca485a6676E264EB0d7df4cD0246203', - // bridge: '0xF224c1d7cC177f24450aC1bD073EA6A83B479A84', - // inbox: '0x30a12d427dA40881c9aE54e59B3bA5187A032e35', - // sequencerInbox: '0xD3E7FB00e1341D2621ff9fC7757639107B5A8F1E', - // messageTester: '0x55226aAfa122128D63f9d9612209F9a3f53bb437', + // bridge: '0x00eb941BD8B89E0396A983c870fa74DA4aC5ecFB', + // inbox: '0x68BCf73c6b36ae3f20b2fD06c2d4651538Ae02a6', + // sequencerInbox: '0x87fEe873425A65Bb2A11dFf6E15B4Ce25e7AFccD', + // messageTester: '0x33B1355B2F3BE116eB1c8226CF3B0a433259459C', // batchPoster: '0x328375c90F01Dcb114888DA36e3832F69Ad0BB57', // }) @@ -410,7 +410,7 @@ describe('SequencerInbox', async () => { await batchSendTx.wait() }) - it.only('can send blob batch', async () => { + it('can send blob batch', async () => { const privKey = 'cb5790da63720727af975f42c79f69918580209889225fa7128c92402a6d3a65' const prov = new JsonRpcProvider('http://127.0.0.1:8545') @@ -443,7 +443,7 @@ describe('SequencerInbox', async () => { 'addSequencerL2BatchFromBlob', [ sequenceNumber, - '0x04', + Toolkit4844.DATA_BLOB_HEADER_FLAG, afterDelayedMessagesRead, constants.AddressZero, subMessageCount, @@ -478,6 +478,7 @@ describe('SequencerInbox', async () => { .map( (l: any) => sequencerInbox.interface.parseLog(l).args )[0] as SequencerBatchDeliveredEvent['args'] + if (!Boolean(batchDeliveredEvent)) throw new Error('missing batch event') const seqMessageCountAfter = ( await bridge.sequencerMessageCount() @@ -595,7 +596,11 @@ describe('SequencerInbox', async () => { return keccak256( solidityPack( ['bytes', 'bytes', 'bytes'], - [header, '0x04', solidityPack(['bytes32[]'], [blobHashes])] + [ + header, + Toolkit4844.DATA_BLOB_HEADER_FLAG, + solidityPack(['bytes32[]'], [blobHashes]), + ] ) ) } diff --git a/test/contract/toolkit4844.ts b/test/contract/toolkit4844.ts index 90caf063..76cd6432 100644 --- a/test/contract/toolkit4844.ts +++ b/test/contract/toolkit4844.ts @@ -17,6 +17,8 @@ const wait = async (ms: number) => }) export class Toolkit4844 { + public static DATA_BLOB_HEADER_FLAG = "0x10" + public static postDataToGeth(body: any): Promise { return new Promise((resolve, reject) => { const options = { @@ -114,7 +116,7 @@ export class Toolkit4844 { data: string ) { const blobStr = blobs.reduce((acc, blob) => acc + ' -b ' + blob, '') - const blobCommand = `docker run --network=nitro-testnode_default ethpandaops/goomy-blob:master blob-sender -p ${privKey} -r http://geth:8545 -t ${to} -d ${data} --gaslimit 1000000${blobStr} 2>&1` + const blobCommand = `docker run --network=nitro-testnode_default ethpandaops/goomy-blob@sha256:8fd6dfe19bedf43f485f1d5ef3db0a0af569c1a08eacc117d5c5ba43656989f0 blob-sender -p ${privKey} -r http://geth:8545 -t ${to} -d ${data} --gaslimit 1000000${blobStr} 2>&1` const res = execSync(blobCommand).toString() const txHashRegex = /0x[a-fA-F0-9]{64}/ const match = res.match(txHashRegex) From 1075cc82692849b603d3d172f2a92bb98fece766 Mon Sep 17 00:00:00 2001 From: gzeon Date: Tue, 24 Oct 2023 22:49:08 +0800 Subject: [PATCH 201/292] chore: remove unrelated error --- src/libraries/Error.sol | 3 --- 1 file changed, 3 deletions(-) diff --git a/src/libraries/Error.sol b/src/libraries/Error.sol index e4776d80..2d2461b3 100644 --- a/src/libraries/Error.sol +++ b/src/libraries/Error.sol @@ -10,9 +10,6 @@ error AlreadyInit(); /// @dev Init was called with param set to zero that must be nonzero error HadZeroInit(); -/// @dev Thrown when post upgrade init validation fails -error BadPostUpgradeInit(); - /// @dev Thrown when non owner tries to access an only-owner function /// @param sender The msg.sender who is not the owner /// @param owner The owner address From 37d29187dd55eb1ef08170ccd48991f4cdc651df Mon Sep 17 00:00:00 2001 From: Chris Buckland Date: Tue, 24 Oct 2023 16:55:13 +0200 Subject: [PATCH 202/292] Formatting --- .github/workflows/contract-tests.yml | 2 +- test/contract/sequencerInbox.spec.4844.ts | 2 +- test/contract/toolkit4844.ts | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/contract-tests.yml b/.github/workflows/contract-tests.yml index b70501e4..98328cff 100644 --- a/.github/workflows/contract-tests.yml +++ b/.github/workflows/contract-tests.yml @@ -97,7 +97,7 @@ jobs: - uses: actions/checkout@v3 with: submodules: recursive - + - name: Install Foundry uses: foundry-rs/foundry-toolchain@v1 with: diff --git a/test/contract/sequencerInbox.spec.4844.ts b/test/contract/sequencerInbox.spec.4844.ts index baa3a74b..a4323964 100644 --- a/test/contract/sequencerInbox.spec.4844.ts +++ b/test/contract/sequencerInbox.spec.4844.ts @@ -478,7 +478,7 @@ describe('SequencerInbox', async () => { .map( (l: any) => sequencerInbox.interface.parseLog(l).args )[0] as SequencerBatchDeliveredEvent['args'] - if (!Boolean(batchDeliveredEvent)) throw new Error('missing batch event') + if (!batchDeliveredEvent) throw new Error('missing batch event') const seqMessageCountAfter = ( await bridge.sequencerMessageCount() diff --git a/test/contract/toolkit4844.ts b/test/contract/toolkit4844.ts index 76cd6432..a1af93f6 100644 --- a/test/contract/toolkit4844.ts +++ b/test/contract/toolkit4844.ts @@ -17,7 +17,7 @@ const wait = async (ms: number) => }) export class Toolkit4844 { - public static DATA_BLOB_HEADER_FLAG = "0x10" + public static DATA_BLOB_HEADER_FLAG = '0x10' public static postDataToGeth(body: any): Promise { return new Promise((resolve, reject) => { From ca6e8ef21d451b12b2d150dd9c00cc92ca6475cb Mon Sep 17 00:00:00 2001 From: gzeon Date: Tue, 24 Oct 2023 23:30:51 +0800 Subject: [PATCH 203/292] feat: add RollupUpdated event --- src/bridge/AbsBridge.sol | 1 + src/bridge/IBridge.sol | 2 ++ 2 files changed, 3 insertions(+) diff --git a/src/bridge/AbsBridge.sol b/src/bridge/AbsBridge.sol index e4e0ae57..bafd56f9 100644 --- a/src/bridge/AbsBridge.sol +++ b/src/bridge/AbsBridge.sol @@ -70,6 +70,7 @@ abstract contract AbsBridge is Initializable, DelegateCallAware, IBridge { /// @notice Allows the rollup owner to set another rollup address function updateRollupAddress(IOwnable _rollup) external onlyRollupOrOwner { rollup = _rollup; + emit RollupUpdated(address(_rollup)); } /// @dev returns the address of current active Outbox, or zero if no outbox is active diff --git a/src/bridge/IBridge.sol b/src/bridge/IBridge.sol index 7804f289..22388b4b 100644 --- a/src/bridge/IBridge.sol +++ b/src/bridge/IBridge.sol @@ -32,6 +32,8 @@ interface IBridge { event SequencerInboxUpdated(address newSequencerInbox); + event RollupUpdated(address rollup); + function allowedDelayedInboxList(uint256) external returns (address); function allowedOutboxList(uint256) external returns (address); From e8aac68c2fb19a8806a8c3dc398fdba5a39dfcca Mon Sep 17 00:00:00 2001 From: gzeon Date: Tue, 24 Oct 2023 23:36:17 +0800 Subject: [PATCH 204/292] feat: throw RollupNotChanged --- src/bridge/AbsOutbox.sol | 7 +++++-- src/bridge/SequencerInbox.sol | 7 +++++-- src/libraries/Error.sol | 3 +++ src/rollup/AbsRollupEventInbox.sol | 6 ++++-- 4 files changed, 17 insertions(+), 6 deletions(-) diff --git a/src/bridge/AbsOutbox.sol b/src/bridge/AbsOutbox.sol index 126f6062..4dabf9ff 100644 --- a/src/bridge/AbsOutbox.sol +++ b/src/bridge/AbsOutbox.sol @@ -13,7 +13,8 @@ import { AlreadySpent, BridgeCallFailed, HadZeroInit, - BadPostUpgradeInit + BadPostUpgradeInit, + RollupNotChanged } from "../libraries/Error.sol"; import "./IBridge.sol"; import "./IOutbox.sol"; @@ -94,7 +95,9 @@ abstract contract AbsOutbox is DelegateCallAware, IOutbox { function updateRollupAddress() external { if (msg.sender != IOwnable(rollup).owner()) revert NotOwner(msg.sender, IOwnable(rollup).owner()); - rollup = address(bridge.rollup()); + address newRollup = address(bridge.rollup()); + if (rollup == newRollup) revert RollupNotChanged(); + rollup = newRollup; } function updateSendRoot(bytes32 root, bytes32 l2BlockHash) external { diff --git a/src/bridge/SequencerInbox.sol b/src/bridge/SequencerInbox.sol index 921122f3..51d511e2 100644 --- a/src/bridge/SequencerInbox.sol +++ b/src/bridge/SequencerInbox.sol @@ -20,7 +20,8 @@ import { DataNotAuthenticated, AlreadyValidDASKeyset, NoSuchKeyset, - NotForked + NotForked, + RollupNotChanged } from "../libraries/Error.sol"; import "./IBridge.sol"; import "./IInboxBase.sol"; @@ -95,7 +96,9 @@ contract SequencerInbox is DelegateCallAware, GasRefundEnabled, ISequencerInbox function updateRollupAddress() external { if (msg.sender != IOwnable(rollup).owner()) revert NotOwner(msg.sender, IOwnable(rollup).owner()); - rollup = bridge.rollup(); + IOwnable newRollup = bridge.rollup(); + if (rollup == newRollup) revert RollupNotChanged(); + rollup = newRollup; } function getTimeBounds() internal view virtual returns (TimeBounds memory) { diff --git a/src/libraries/Error.sol b/src/libraries/Error.sol index e4776d80..fd6f3255 100644 --- a/src/libraries/Error.sol +++ b/src/libraries/Error.sol @@ -175,3 +175,6 @@ error AlreadyValidDASKeyset(bytes32); /// @dev Tried to use or invalidate an already invalid Data Availability Service keyset error NoSuchKeyset(bytes32); + +/// @dev Thrown when rollup is not updated with updateRollupAddress +error RollupNotChanged(); diff --git a/src/rollup/AbsRollupEventInbox.sol b/src/rollup/AbsRollupEventInbox.sol index 6fa42ea3..c0866d9e 100644 --- a/src/rollup/AbsRollupEventInbox.sol +++ b/src/rollup/AbsRollupEventInbox.sol @@ -12,7 +12,7 @@ import "../libraries/ArbitrumChecker.sol"; import "../bridge/IDelayedMessageProvider.sol"; import "../libraries/DelegateCallAware.sol"; import {INITIALIZATION_MSG_TYPE} from "../libraries/MessageTypes.sol"; -import {AlreadyInit, HadZeroInit} from "../libraries/Error.sol"; +import {AlreadyInit, HadZeroInit, RollupNotChanged} from "../libraries/Error.sol"; /** * @title The inbox for rollup protocol events @@ -41,7 +41,9 @@ abstract contract AbsRollupEventInbox is function updateRollupAddress() external { if (msg.sender != IOwnable(rollup).owner()) revert NotOwner(msg.sender, IOwnable(rollup).owner()); - rollup = address(bridge.rollup()); + address newRollup = address(bridge.rollup()); + if (rollup == newRollup) revert RollupNotChanged(); + rollup = newRollup; } function rollupInitialized(uint256 chainId, string calldata chainConfig) From 0c248ffe7994f4ba8c2167fed31536571b96fdf5 Mon Sep 17 00:00:00 2001 From: gzeon Date: Tue, 24 Oct 2023 23:37:59 +0800 Subject: [PATCH 205/292] format: move modifier to top --- src/rollup/RollupUserLogic.sol | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/rollup/RollupUserLogic.sol b/src/rollup/RollupUserLogic.sol index 4f565f21..9807f201 100644 --- a/src/rollup/RollupUserLogic.sol +++ b/src/rollup/RollupUserLogic.sol @@ -27,6 +27,11 @@ abstract contract AbsRollupUserLogic is _; } + modifier whenNotPausedOrDeprecated() { + require(!paused() || address(bridge.rollup()) != address(this), "PAUSED_AND_ACTIVE"); + _; + } + uint256 internal immutable deployTimeChainId = block.chainid; function _chainIdChanged() internal view returns (bool) { @@ -227,11 +232,6 @@ abstract contract AbsRollupUserLogic is stakeOnNode(msg.sender, latestNodeCreated()); } - modifier whenNotPausedOrDeprecated() { - require(!paused() || address(bridge.rollup()) != address(this), "PAUSED_AND_ACTIVE"); - _; - } - /** * @notice Refund a staker that is currently staked on or before the latest confirmed node * @dev Since a staker is initially placed in the latest confirmed node, if they don't move it From f4410ae75903de861e82b1c462bbce8cb702763f Mon Sep 17 00:00:00 2001 From: gzeon Date: Tue, 24 Oct 2023 23:47:04 +0800 Subject: [PATCH 206/292] v1.1.0-beta.2 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 5cb6a4d6..cff51c12 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@arbitrum/nitro-contracts", - "version": "1.1.0-beta.1", + "version": "1.1.0-beta.2", "description": "Layer 2 precompiles and rollup for Arbitrum Nitro", "author": "Offchain Labs, Inc.", "license": "BUSL-1.1", From cd0d302bdda69feeddffc59c9ba2503236b95ca5 Mon Sep 17 00:00:00 2001 From: Chris Buckland Date: Wed, 25 Oct 2023 12:03:09 +0200 Subject: [PATCH 207/292] Build updates --- src/bridge/SequencerInbox.sol | 2 +- src/rollup/BridgeCreator.sol | 22 ++++++--- src/rollup/RollupCreator.sol | 14 ++---- test/foundry/BridgeCreator.t.sol | 76 ++++++++++++++++---------------- test/foundry/RollupCreator.t.sol | 10 ++--- 5 files changed, 61 insertions(+), 63 deletions(-) diff --git a/src/bridge/SequencerInbox.sol b/src/bridge/SequencerInbox.sol index 61384289..917a112f 100644 --- a/src/bridge/SequencerInbox.sol +++ b/src/bridge/SequencerInbox.sol @@ -54,7 +54,7 @@ contract SequencerInbox is GasRefundEnabled, ISequencerInbox { /// @inheritdoc ISequencerInbox bytes1 public constant DATA_AUTHENTICATED_FLAG = 0x40; - IOwnable public immutable rollup; + IOwnable public rollup; mapping(address => bool) public isBatchPoster; // see ISequencerInbox.MaxTimeVariation uint256 internal immutable delayBlocks; diff --git a/src/rollup/BridgeCreator.sol b/src/rollup/BridgeCreator.sol index 91ee4a87..b1a39389 100644 --- a/src/rollup/BridgeCreator.sol +++ b/src/rollup/BridgeCreator.sol @@ -19,40 +19,48 @@ import "@openzeppelin/contracts/access/Ownable.sol"; import "@openzeppelin/contracts/proxy/transparent/ProxyAdmin.sol"; contract BridgeCreator is Ownable { - BridgeContracts public ethBasedTemplates; - BridgeContracts public erc20BasedTemplates; + BridgeTemplates public ethBasedTemplates; + BridgeTemplates public erc20BasedTemplates; event TemplatesUpdated(); event ERC20TemplatesUpdated(); + struct BridgeTemplates { + IBridge bridge; + IInboxBase inbox; + IRollupEventInbox rollupEventInbox; + IOutbox outbox; + } + struct BridgeContracts { IBridge bridge; + ISequencerInbox sequencerInbox; IInboxBase inbox; IRollupEventInbox rollupEventInbox; IOutbox outbox; } constructor( - BridgeContracts memory _ethBasedTemplates, - BridgeContracts memory _erc20BasedTemplates + BridgeTemplates memory _ethBasedTemplates, + BridgeTemplates memory _erc20BasedTemplates ) Ownable() { ethBasedTemplates = _ethBasedTemplates; erc20BasedTemplates = _erc20BasedTemplates; } - function updateTemplates(BridgeContracts calldata _newTemplates) external onlyOwner { + function updateTemplates(BridgeTemplates calldata _newTemplates) external onlyOwner { ethBasedTemplates = _newTemplates; emit TemplatesUpdated(); } - function updateERC20Templates(BridgeContracts calldata _newTemplates) external onlyOwner { + function updateERC20Templates(BridgeTemplates calldata _newTemplates) external onlyOwner { erc20BasedTemplates = _newTemplates; emit ERC20TemplatesUpdated(); } function _createBridge( address adminProxy, - BridgeContracts storage templates, + BridgeTemplates storage templates, ISequencerInbox.MaxTimeVariation calldata maxTimeVariation, uint256 maxDataSize ) internal returns (BridgeContracts memory) { diff --git a/src/rollup/RollupCreator.sol b/src/rollup/RollupCreator.sol index 62746d3b..3cdb830d 100644 --- a/src/rollup/RollupCreator.sol +++ b/src/rollup/RollupCreator.sol @@ -110,20 +110,12 @@ contract RollupCreator is Ownable { returns (address) { // Make sure the immutable maxDataSize is as expected - (, ISequencerInbox ethSequencerInbox, IInboxBase ethInbox, , ) = bridgeCreator + (, IInboxBase ethInbox, , ) = bridgeCreator .ethBasedTemplates(); - require( - deployParams.maxDataSize == ethSequencerInbox.maxDataSize(), - "SI_MAX_DATA_SIZE_MISMATCH" - ); require(deployParams.maxDataSize == ethInbox.maxDataSize(), "I_MAX_DATA_SIZE_MISMATCH"); - (, ISequencerInbox erc20SequencerInbox, IInboxBase erc20Inbox, , ) = bridgeCreator + (, IInboxBase erc20Inbox, , ) = bridgeCreator .erc20BasedTemplates(); - require( - deployParams.maxDataSize == erc20SequencerInbox.maxDataSize(), - "SI_MAX_DATA_SIZE_MISMATCH" - ); require(deployParams.maxDataSize == erc20Inbox.maxDataSize(), "I_MAX_DATA_SIZE_MISMATCH"); // create proxy admin which will manage bridge contracts @@ -137,7 +129,7 @@ contract RollupCreator is Ownable { address(rollup), deployParams.nativeToken, deployParams.config.sequencerInboxMaxTimeVariation, - maxDataSize + deployParams.maxDataSize ); IChallengeManager challengeManager = IChallengeManager( diff --git a/test/foundry/BridgeCreator.t.sol b/test/foundry/BridgeCreator.t.sol index 16099869..a1eae036 100644 --- a/test/foundry/BridgeCreator.t.sol +++ b/test/foundry/BridgeCreator.t.sol @@ -14,18 +14,16 @@ contract BridgeCreatorTest is Test { address public owner = address(100); uint256 public constant MAX_DATA_SIZE = 117_964; - BridgeCreator.BridgeContracts ethBasedTemplates = - BridgeCreator.BridgeContracts({ + BridgeCreator.BridgeTemplates ethBasedTemplates = + BridgeCreator.BridgeTemplates({ bridge: new Bridge(), - sequencerInbox: new SequencerInbox(MAX_DATA_SIZE), inbox: new Inbox(MAX_DATA_SIZE), rollupEventInbox: new RollupEventInbox(), outbox: new Outbox() }); - BridgeCreator.BridgeContracts erc20BasedTemplates = - BridgeCreator.BridgeContracts({ + BridgeCreator.BridgeTemplates erc20BasedTemplates = + BridgeCreator.BridgeTemplates({ bridge: new ERC20Bridge(), - sequencerInbox: ethBasedTemplates.sequencerInbox, inbox: new ERC20Inbox(MAX_DATA_SIZE), rollupEventInbox: new ERC20RollupEventInbox(), outbox: new ERC20Outbox() @@ -36,11 +34,10 @@ contract BridgeCreatorTest is Test { creator = new BridgeCreator(ethBasedTemplates, erc20BasedTemplates); } - function getEthBasedTemplates() internal returns (BridgeCreator.BridgeContracts memory) { - BridgeCreator.BridgeContracts memory templates; + function getEthBasedTemplates() internal returns (BridgeCreator.BridgeTemplates memory) { + BridgeCreator.BridgeTemplates memory templates; ( templates.bridge, - templates.sequencerInbox, templates.inbox, templates.rollupEventInbox, templates.outbox @@ -48,11 +45,10 @@ contract BridgeCreatorTest is Test { return templates; } - function getErc20BasedTemplates() internal returns (BridgeCreator.BridgeContracts memory) { - BridgeCreator.BridgeContracts memory templates; + function getErc20BasedTemplates() internal returns (BridgeCreator.BridgeTemplates memory) { + BridgeCreator.BridgeTemplates memory templates; ( templates.bridge, - templates.sequencerInbox, templates.inbox, templates.rollupEventInbox, templates.outbox @@ -60,6 +56,20 @@ contract BridgeCreatorTest is Test { return templates; } + function assertEq( + BridgeCreator.BridgeTemplates memory a, + BridgeCreator.BridgeTemplates memory b + ) internal { + assertEq(address(a.bridge), address(b.bridge), "Invalid bridge"); + assertEq(address(a.inbox), address(b.inbox), "Invalid inbox"); + assertEq( + address(a.rollupEventInbox), + address(b.rollupEventInbox), + "Invalid rollup event inbox" + ); + assertEq(address(a.outbox), address(b.outbox), "Invalid outbox"); + } + function assertEq( BridgeCreator.BridgeContracts memory a, BridgeCreator.BridgeContracts memory b @@ -82,9 +92,8 @@ contract BridgeCreatorTest is Test { } function test_updateTemplates() public { - BridgeCreator.BridgeContracts memory templs = BridgeCreator.BridgeContracts({ + BridgeCreator.BridgeTemplates memory templs = BridgeCreator.BridgeTemplates({ bridge: Bridge(address(200)), - sequencerInbox: SequencerInbox(address(201)), inbox: Inbox(address(202)), rollupEventInbox: RollupEventInbox(address(203)), outbox: Outbox(address(204)) @@ -97,9 +106,8 @@ contract BridgeCreatorTest is Test { } function test_updateERC20Templates() public { - BridgeCreator.BridgeContracts memory templs = BridgeCreator.BridgeContracts({ + BridgeCreator.BridgeTemplates memory templs = BridgeCreator.BridgeTemplates({ bridge: ERC20Bridge(address(400)), - sequencerInbox: SequencerInbox(address(401)), inbox: ERC20Inbox(address(402)), rollupEventInbox: ERC20RollupEventInbox(address(403)), outbox: ERC20Outbox(address(404)) @@ -127,7 +135,8 @@ contract BridgeCreatorTest is Test { proxyAdmin, rollup, nativeToken, - timeVars + timeVars, + MAX_DATA_SIZE ); ( IBridge bridge, @@ -150,16 +159,11 @@ contract BridgeCreatorTest is Test { // seqInbox assertEq(address(seqInbox.bridge()), address(bridge), "Invalid bridge ref"); assertEq(address(seqInbox.rollup()), rollup, "Invalid rollup ref"); - ( - uint256 _delayBlocks, - uint256 _futureBlocks, - uint256 _delaySeconds, - uint256 _futureSeconds - ) = seqInbox.maxTimeVariation(); - assertEq(_delayBlocks, timeVars.delayBlocks, "Invalid delayBlocks"); - assertEq(_futureBlocks, timeVars.futureBlocks, "Invalid futureBlocks"); - assertEq(_delaySeconds, timeVars.delaySeconds, "Invalid delaySeconds"); - assertEq(_futureSeconds, timeVars.futureSeconds, "Invalid futureSeconds"); + ISequencerInbox.MaxTimeVariation memory maxTimeVariation = seqInbox.maxTimeVariation(); + assertEq(maxTimeVariation.delayBlocks, timeVars.delayBlocks, "Invalid delayBlocks"); + assertEq(maxTimeVariation.futureBlocks, timeVars.futureBlocks, "Invalid futureBlocks"); + assertEq(maxTimeVariation.delaySeconds, timeVars.delaySeconds, "Invalid delaySeconds"); + assertEq(maxTimeVariation.futureSeconds, timeVars.futureSeconds, "Invalid futureSeconds"); // inbox assertEq(address(inbox.bridge()), address(bridge), "Invalid bridge ref"); @@ -198,7 +202,8 @@ contract BridgeCreatorTest is Test { proxyAdmin, rollup, nativeToken, - timeVars + timeVars, + MAX_DATA_SIZE ); ( IBridge bridge, @@ -226,16 +231,11 @@ contract BridgeCreatorTest is Test { // seqInbox assertEq(address(seqInbox.bridge()), address(bridge), "Invalid bridge ref"); assertEq(address(seqInbox.rollup()), rollup, "Invalid rollup ref"); - ( - uint256 _delayBlocks, - uint256 _futureBlocks, - uint256 _delaySeconds, - uint256 _futureSeconds - ) = seqInbox.maxTimeVariation(); - assertEq(_delayBlocks, timeVars.delayBlocks, "Invalid delayBlocks"); - assertEq(_futureBlocks, timeVars.futureBlocks, "Invalid futureBlocks"); - assertEq(_delaySeconds, timeVars.delaySeconds, "Invalid delaySeconds"); - assertEq(_futureSeconds, timeVars.futureSeconds, "Invalid futureSeconds"); + ISequencerInbox.MaxTimeVariation memory maxTimeVariation = seqInbox.maxTimeVariation(); + assertEq(maxTimeVariation.delayBlocks, timeVars.delayBlocks, "Invalid delayBlocks"); + assertEq(maxTimeVariation.futureBlocks, timeVars.futureBlocks, "Invalid futureBlocks"); + assertEq(maxTimeVariation.delaySeconds, timeVars.delaySeconds, "Invalid delaySeconds"); + assertEq(maxTimeVariation.futureSeconds, timeVars.futureSeconds, "Invalid futureSeconds"); // inbox assertEq(address(inbox.bridge()), address(bridge), "Invalid bridge ref"); diff --git a/test/foundry/RollupCreator.t.sol b/test/foundry/RollupCreator.t.sol index e4b46239..b6db85fe 100644 --- a/test/foundry/RollupCreator.t.sol +++ b/test/foundry/RollupCreator.t.sol @@ -32,18 +32,16 @@ contract RollupCreatorTest is Test { uint256 public constant MAX_FEE_PER_GAS = 1_000_000_000; uint256 public constant MAX_DATA_SIZE = 117_964; - BridgeCreator.BridgeContracts public ethBasedTemplates = - BridgeCreator.BridgeContracts({ + BridgeCreator.BridgeTemplates public ethBasedTemplates = + BridgeCreator.BridgeTemplates({ bridge: new Bridge(), - sequencerInbox: new SequencerInbox(MAX_DATA_SIZE), inbox: new Inbox(MAX_DATA_SIZE), rollupEventInbox: new RollupEventInbox(), outbox: new Outbox() }); - BridgeCreator.BridgeContracts public erc20BasedTemplates = - BridgeCreator.BridgeContracts({ + BridgeCreator.BridgeTemplates public erc20BasedTemplates = + BridgeCreator.BridgeTemplates({ bridge: new ERC20Bridge(), - sequencerInbox: ethBasedTemplates.sequencerInbox, inbox: new ERC20Inbox(MAX_DATA_SIZE), rollupEventInbox: new ERC20RollupEventInbox(), outbox: new ERC20Outbox() From 75215ba26d7ace7c8f903f178916adf790b9229a Mon Sep 17 00:00:00 2001 From: Chris Buckland Date: Wed, 25 Oct 2023 13:26:32 +0200 Subject: [PATCH 208/292] Updated tests and added bridge.rollup() initialization tests --- src/bridge/AbsOutbox.sol | 1 + src/bridge/ERC20Bridge.sol | 3 +++ src/bridge/SequencerInbox.sol | 1 + src/rollup/AbsRollupEventInbox.sol | 1 + src/rollup/BridgeCreator.sol | 12 +++++++----- test/foundry/BridgeCreator.t.sol | 20 ++++++++------------ test/foundry/RollupCreator.t.sol | 14 +++++++++----- 7 files changed, 30 insertions(+), 22 deletions(-) diff --git a/src/bridge/AbsOutbox.sol b/src/bridge/AbsOutbox.sol index 4dabf9ff..8c09aa42 100644 --- a/src/bridge/AbsOutbox.sol +++ b/src/bridge/AbsOutbox.sol @@ -76,6 +76,7 @@ abstract contract AbsOutbox is DelegateCallAware, IOutbox { }); bridge = _bridge; rollup = address(_bridge.rollup()); + if(address(rollup) == address(0)) revert RollupNotChanged(); } function postUpgradeInit() external onlyDelegated onlyProxyOwner { diff --git a/src/bridge/ERC20Bridge.sol b/src/bridge/ERC20Bridge.sol index c67e1ba0..46ca2f1f 100644 --- a/src/bridge/ERC20Bridge.sol +++ b/src/bridge/ERC20Bridge.sol @@ -27,9 +27,12 @@ contract ERC20Bridge is AbsBridge, IERC20Bridge { /// @inheritdoc IERC20Bridge address public nativeToken; + event Hi(); + /// @inheritdoc IERC20Bridge function initialize(IOwnable rollup_, address nativeToken_) external initializer onlyDelegated { if (nativeToken_ == address(0)) revert InvalidTokenSet(nativeToken_); + emit Hi(); nativeToken = nativeToken_; _activeOutbox = EMPTY_ACTIVEOUTBOX; rollup = rollup_; diff --git a/src/bridge/SequencerInbox.sol b/src/bridge/SequencerInbox.sol index 917a112f..eff421c4 100644 --- a/src/bridge/SequencerInbox.sol +++ b/src/bridge/SequencerInbox.sol @@ -85,6 +85,7 @@ contract SequencerInbox is GasRefundEnabled, ISequencerInbox { if (bridge_ == IBridge(address(0))) revert HadZeroInit(); bridge = bridge_; rollup = bridge_.rollup(); + if(address(rollup) == address(0)) revert RollupNotChanged(); delayBlocks = maxTimeVariation_.delayBlocks; futureBlocks = maxTimeVariation_.futureBlocks; delaySeconds = maxTimeVariation_.delaySeconds; diff --git a/src/rollup/AbsRollupEventInbox.sol b/src/rollup/AbsRollupEventInbox.sol index c0866d9e..8b122c05 100644 --- a/src/rollup/AbsRollupEventInbox.sol +++ b/src/rollup/AbsRollupEventInbox.sol @@ -35,6 +35,7 @@ abstract contract AbsRollupEventInbox is if (address(_bridge) == address(0)) revert HadZeroInit(); bridge = _bridge; rollup = address(_bridge.rollup()); + if(address(rollup) == address(0)) revert RollupNotChanged(); } /// @notice Allows the rollup owner to sync the rollup address diff --git a/src/rollup/BridgeCreator.sol b/src/rollup/BridgeCreator.sol index b1a39389..8f42100e 100644 --- a/src/rollup/BridgeCreator.sol +++ b/src/rollup/BridgeCreator.sol @@ -68,11 +68,6 @@ contract BridgeCreator is Ownable { frame.bridge = IBridge( address(new TransparentUpgradeableProxy(address(templates.bridge), adminProxy, "")) ); - frame.sequencerInbox = new SequencerInbox( - IBridge(frame.bridge), - maxTimeVariation, - maxDataSize - ); frame.inbox = IInboxBase( address(new TransparentUpgradeableProxy(address(templates.inbox), adminProxy, "")) ); @@ -108,10 +103,17 @@ contract BridgeCreator is Ownable { } else { IERC20Bridge(address(frame.bridge)).initialize(IOwnable(rollup), nativeToken); } + frame.sequencerInbox = new SequencerInbox( + IBridge(frame.bridge), + maxTimeVariation, + maxDataSize + ); frame.inbox.initialize(frame.bridge, frame.sequencerInbox); frame.rollupEventInbox.initialize(frame.bridge); frame.outbox.initialize(frame.bridge); return frame; } + + event Testy(address); } diff --git a/test/foundry/BridgeCreator.t.sol b/test/foundry/BridgeCreator.t.sol index a1eae036..b2a37a12 100644 --- a/test/foundry/BridgeCreator.t.sol +++ b/test/foundry/BridgeCreator.t.sol @@ -129,8 +129,6 @@ contract BridgeCreatorTest is Test { 30, 40 ); - timeVars.delayBlocks; - BridgeCreator.BridgeContracts memory contracts = creator.createBridge( proxyAdmin, rollup, @@ -153,12 +151,12 @@ contract BridgeCreatorTest is Test { ); // bridge - assertEq(address(bridge.rollup()), rollup, "Invalid rollup ref"); + assertEq(address(bridge.rollup()), rollup, "Invalid bridge rollup ref"); assertEq(bridge.activeOutbox(), address(0), "Invalid activeOutbox ref"); // seqInbox assertEq(address(seqInbox.bridge()), address(bridge), "Invalid bridge ref"); - assertEq(address(seqInbox.rollup()), rollup, "Invalid rollup ref"); + assertEq(address(seqInbox.rollup()), rollup, "Invalid seq rollup ref"); ISequencerInbox.MaxTimeVariation memory maxTimeVariation = seqInbox.maxTimeVariation(); assertEq(maxTimeVariation.delayBlocks, timeVars.delayBlocks, "Invalid delayBlocks"); assertEq(maxTimeVariation.futureBlocks, timeVars.futureBlocks, "Invalid futureBlocks"); @@ -173,11 +171,11 @@ contract BridgeCreatorTest is Test { // rollup event inbox assertEq(address(eventInbox.bridge()), address(bridge), "Invalid bridge ref"); - assertEq(address(eventInbox.rollup()), rollup, "Invalid rollup ref"); + assertEq(address(eventInbox.rollup()), rollup, "Invalid event inbox rollup ref"); // outbox assertEq(address(outbox.bridge()), address(bridge), "Invalid bridge ref"); - assertEq(address(outbox.rollup()), rollup, "Invalid rollup ref"); + assertEq(address(outbox.rollup()), rollup, "Invalid outbox rollup ref"); // revert fetching native token vm.expectRevert(); @@ -196,8 +194,6 @@ contract BridgeCreatorTest is Test { 30, 40 ); - timeVars.delayBlocks; - BridgeCreator.BridgeContracts memory contracts = creator.createBridge( proxyAdmin, rollup, @@ -220,7 +216,7 @@ contract BridgeCreatorTest is Test { ); // bridge - assertEq(address(bridge.rollup()), rollup, "Invalid rollup ref"); + assertEq(address(bridge.rollup()), rollup, "Invalid bridge rollup ref"); assertEq( address(IERC20Bridge(address(bridge)).nativeToken()), nativeToken, @@ -230,7 +226,7 @@ contract BridgeCreatorTest is Test { // seqInbox assertEq(address(seqInbox.bridge()), address(bridge), "Invalid bridge ref"); - assertEq(address(seqInbox.rollup()), rollup, "Invalid rollup ref"); + assertEq(address(seqInbox.rollup()), rollup, "Invalid seq inbox rollup ref"); ISequencerInbox.MaxTimeVariation memory maxTimeVariation = seqInbox.maxTimeVariation(); assertEq(maxTimeVariation.delayBlocks, timeVars.delayBlocks, "Invalid delayBlocks"); assertEq(maxTimeVariation.futureBlocks, timeVars.futureBlocks, "Invalid futureBlocks"); @@ -245,10 +241,10 @@ contract BridgeCreatorTest is Test { // rollup event inbox assertEq(address(eventInbox.bridge()), address(bridge), "Invalid bridge ref"); - assertEq(address(eventInbox.rollup()), rollup, "Invalid rollup ref"); + assertEq(address(eventInbox.rollup()), rollup, "Invalid event inbox rollup ref"); // outbox assertEq(address(outbox.bridge()), address(bridge), "Invalid bridge ref"); - assertEq(address(outbox.rollup()), rollup, "Invalid rollup ref"); + assertEq(address(outbox.rollup()), rollup, "Invalid outbox rollup ref"); } } diff --git a/test/foundry/RollupCreator.t.sol b/test/foundry/RollupCreator.t.sol index b6db85fe..d9e33054 100644 --- a/test/foundry/RollupCreator.t.sol +++ b/test/foundry/RollupCreator.t.sol @@ -163,9 +163,10 @@ contract RollupCreatorTest is Test { // check proxy admin for non-rollup contracts address proxyAdminExpectedAddress = computeCreateAddress(address(rollupCreator), 1); + // seq inbox has no proxy admin assertEq( _getProxyAdmin(address(rollup.sequencerInbox())), - proxyAdminExpectedAddress, + address(0), "Invalid seqInbox' proxyAdmin owner" ); assertEq( @@ -197,7 +198,7 @@ contract RollupCreatorTest is Test { // check upgrade executor owns proxyAdmin address upgradeExecutorExpectedAddress = computeCreateAddress(address(rollupCreator), 4); assertEq( - ProxyAdmin(_getProxyAdmin(address(rollup.sequencerInbox()))).owner(), + ProxyAdmin(_getProxyAdmin(address(rollup.inbox()))).owner(), upgradeExecutorExpectedAddress, "Invalid proxyAdmin's owner" ); @@ -294,7 +295,6 @@ contract RollupCreatorTest is Test { /// rollup proxy assertEq(_getPrimary(rollupAddress), address(rollupAdmin), "Invalid proxy primary impl"); assertEq(_getSecondary(rollupAddress), address(rollupUser), "Invalid proxy secondary impl"); - /// rollup check RollupCore rollup = RollupCore(rollupAddress); assertTrue(address(rollup.sequencerInbox()) != address(0), "Invalid seqInbox"); @@ -320,9 +320,11 @@ contract RollupCreatorTest is Test { // check proxy admin for non-rollup contracts address proxyAdminExpectedAddress = computeCreateAddress(address(rollupCreator), 1); + + // seq inbox has no proxy admin assertEq( _getProxyAdmin(address(rollup.sequencerInbox())), - proxyAdminExpectedAddress, + address(0), "Invalid seqInbox' proxyAdmin owner" ); assertEq( @@ -354,10 +356,11 @@ contract RollupCreatorTest is Test { // check upgrade executor owns proxyAdmin address upgradeExecutorExpectedAddress = computeCreateAddress(address(rollupCreator), 4); assertEq( - ProxyAdmin(_getProxyAdmin(address(rollup.sequencerInbox()))).owner(), + ProxyAdmin(_getProxyAdmin(address(rollup.inbox()))).owner(), upgradeExecutorExpectedAddress, "Invalid proxyAdmin's owner" ); + console.log("c2"); // upgrade executor owns rollup assertEq( @@ -370,6 +373,7 @@ contract RollupCreatorTest is Test { upgradeExecutorExpectedAddress, "Invalid rollup's proxyAdmin owner" ); + console.log("d"); // check rollupOwner has executor role AccessControlUpgradeable executor = AccessControlUpgradeable( From e9b869d42f1551a43f1aae540463e8b2cd05b0b1 Mon Sep 17 00:00:00 2001 From: amsanghi Date: Wed, 25 Oct 2023 17:03:17 +0530 Subject: [PATCH 209/292] Add storeDifficulty to mock simple --- src/mocks/Simple.sol | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/mocks/Simple.sol b/src/mocks/Simple.sol index a97e1d0c..237aec73 100644 --- a/src/mocks/Simple.sol +++ b/src/mocks/Simple.sol @@ -9,6 +9,7 @@ import "../precompiles/ArbSys.sol"; contract Simple { uint64 public counter; + uint256 public difficulty; event CounterEvent(uint64 count); event RedeemedEvent(address caller, address redeemer); @@ -45,8 +46,12 @@ contract Simple { return block.number; } + function storeDifficulty() external { + difficulty = block.difficulty; + } + function getBlockDifficulty() external view returns (uint256) { - return block.difficulty; + return difficulty; } function noop() external pure {} From a3111c4a650d24a347f363f72b8f75713c3ac4cf Mon Sep 17 00:00:00 2001 From: Chris Buckland Date: Wed, 25 Oct 2023 13:34:05 +0200 Subject: [PATCH 210/292] Formatting --- src/bridge/AbsOutbox.sol | 2 +- src/bridge/SequencerInbox.sol | 2 +- src/rollup/AbsRollupEventInbox.sol | 2 +- src/rollup/RollupCreator.sol | 6 ++---- test/foundry/BridgeCreator.t.sol | 16 ++++------------ test/foundry/RollupCreator.t.sol | 1 - 6 files changed, 9 insertions(+), 20 deletions(-) diff --git a/src/bridge/AbsOutbox.sol b/src/bridge/AbsOutbox.sol index 8c09aa42..c73f4213 100644 --- a/src/bridge/AbsOutbox.sol +++ b/src/bridge/AbsOutbox.sol @@ -76,7 +76,7 @@ abstract contract AbsOutbox is DelegateCallAware, IOutbox { }); bridge = _bridge; rollup = address(_bridge.rollup()); - if(address(rollup) == address(0)) revert RollupNotChanged(); + if (address(rollup) == address(0)) revert RollupNotChanged(); } function postUpgradeInit() external onlyDelegated onlyProxyOwner { diff --git a/src/bridge/SequencerInbox.sol b/src/bridge/SequencerInbox.sol index eff421c4..4ed86f11 100644 --- a/src/bridge/SequencerInbox.sol +++ b/src/bridge/SequencerInbox.sol @@ -85,7 +85,7 @@ contract SequencerInbox is GasRefundEnabled, ISequencerInbox { if (bridge_ == IBridge(address(0))) revert HadZeroInit(); bridge = bridge_; rollup = bridge_.rollup(); - if(address(rollup) == address(0)) revert RollupNotChanged(); + if (address(rollup) == address(0)) revert RollupNotChanged(); delayBlocks = maxTimeVariation_.delayBlocks; futureBlocks = maxTimeVariation_.futureBlocks; delaySeconds = maxTimeVariation_.delaySeconds; diff --git a/src/rollup/AbsRollupEventInbox.sol b/src/rollup/AbsRollupEventInbox.sol index 8b122c05..4887f050 100644 --- a/src/rollup/AbsRollupEventInbox.sol +++ b/src/rollup/AbsRollupEventInbox.sol @@ -35,7 +35,7 @@ abstract contract AbsRollupEventInbox is if (address(_bridge) == address(0)) revert HadZeroInit(); bridge = _bridge; rollup = address(_bridge.rollup()); - if(address(rollup) == address(0)) revert RollupNotChanged(); + if (address(rollup) == address(0)) revert RollupNotChanged(); } /// @notice Allows the rollup owner to sync the rollup address diff --git a/src/rollup/RollupCreator.sol b/src/rollup/RollupCreator.sol index 3cdb830d..e8e31aeb 100644 --- a/src/rollup/RollupCreator.sol +++ b/src/rollup/RollupCreator.sol @@ -110,12 +110,10 @@ contract RollupCreator is Ownable { returns (address) { // Make sure the immutable maxDataSize is as expected - (, IInboxBase ethInbox, , ) = bridgeCreator - .ethBasedTemplates(); + (, IInboxBase ethInbox, , ) = bridgeCreator.ethBasedTemplates(); require(deployParams.maxDataSize == ethInbox.maxDataSize(), "I_MAX_DATA_SIZE_MISMATCH"); - (, IInboxBase erc20Inbox, , ) = bridgeCreator - .erc20BasedTemplates(); + (, IInboxBase erc20Inbox, , ) = bridgeCreator.erc20BasedTemplates(); require(deployParams.maxDataSize == erc20Inbox.maxDataSize(), "I_MAX_DATA_SIZE_MISMATCH"); // create proxy admin which will manage bridge contracts diff --git a/test/foundry/BridgeCreator.t.sol b/test/foundry/BridgeCreator.t.sol index b2a37a12..138bd812 100644 --- a/test/foundry/BridgeCreator.t.sol +++ b/test/foundry/BridgeCreator.t.sol @@ -36,23 +36,15 @@ contract BridgeCreatorTest is Test { function getEthBasedTemplates() internal returns (BridgeCreator.BridgeTemplates memory) { BridgeCreator.BridgeTemplates memory templates; - ( - templates.bridge, - templates.inbox, - templates.rollupEventInbox, - templates.outbox - ) = creator.ethBasedTemplates(); + (templates.bridge, templates.inbox, templates.rollupEventInbox, templates.outbox) = creator + .ethBasedTemplates(); return templates; } function getErc20BasedTemplates() internal returns (BridgeCreator.BridgeTemplates memory) { BridgeCreator.BridgeTemplates memory templates; - ( - templates.bridge, - templates.inbox, - templates.rollupEventInbox, - templates.outbox - ) = creator.erc20BasedTemplates(); + (templates.bridge, templates.inbox, templates.rollupEventInbox, templates.outbox) = creator + .erc20BasedTemplates(); return templates; } diff --git a/test/foundry/RollupCreator.t.sol b/test/foundry/RollupCreator.t.sol index d9e33054..3b0f9e5c 100644 --- a/test/foundry/RollupCreator.t.sol +++ b/test/foundry/RollupCreator.t.sol @@ -320,7 +320,6 @@ contract RollupCreatorTest is Test { // check proxy admin for non-rollup contracts address proxyAdminExpectedAddress = computeCreateAddress(address(rollupCreator), 1); - // seq inbox has no proxy admin assertEq( _getProxyAdmin(address(rollup.sequencerInbox())), From 90f2262c8a815cb8be6909e81191c3a241ad9e7a Mon Sep 17 00:00:00 2001 From: Chris Buckland Date: Wed, 25 Oct 2023 13:42:02 +0200 Subject: [PATCH 211/292] Updated arbrollup tests --- test/contract/arbRollup.spec.ts | 9 --------- 1 file changed, 9 deletions(-) diff --git a/test/contract/arbRollup.spec.ts b/test/contract/arbRollup.spec.ts index a01a6968..78e7dddc 100644 --- a/test/contract/arbRollup.spec.ts +++ b/test/contract/arbRollup.spec.ts @@ -185,11 +185,6 @@ const setup = async () => { )) as Bridge__factory const ethBridge = await ethBridgeFac.deploy() - const ethSequencerInboxFac = (await ethers.getContractFactory( - 'SequencerInbox' - )) as SequencerInbox__factory - const ethSequencerInbox = await ethSequencerInboxFac.deploy(117964) - const ethInboxFac = (await ethers.getContractFactory( 'Inbox' )) as Inbox__factory @@ -210,8 +205,6 @@ const setup = async () => { )) as ERC20Bridge__factory const erc20Bridge = await erc20BridgeFac.deploy() - const erc20SequencerInbox = ethSequencerInbox - const erc20InboxFac = (await ethers.getContractFactory( 'ERC20Inbox' )) as ERC20Inbox__factory @@ -233,14 +226,12 @@ const setup = async () => { const bridgeCreator = await bridgeCreatorFac.deploy( { bridge: ethBridge.address, - sequencerInbox: ethSequencerInbox.address, inbox: ethInbox.address, rollupEventInbox: ethRollupEventInbox.address, outbox: ethOutbox.address, }, { bridge: erc20Bridge.address, - sequencerInbox: erc20SequencerInbox.address, inbox: erc20Inbox.address, rollupEventInbox: erc20RollupEventInbox.address, outbox: erc20Outbox.address, From fe97273f8f78c1d21070d2ee89a698bf3ef7894d Mon Sep 17 00:00:00 2001 From: Chris Buckland Date: Wed, 25 Oct 2023 15:51:11 +0200 Subject: [PATCH 212/292] Removed test events --- src/bridge/ERC20Bridge.sol | 3 --- src/rollup/BridgeCreator.sol | 2 -- 2 files changed, 5 deletions(-) diff --git a/src/bridge/ERC20Bridge.sol b/src/bridge/ERC20Bridge.sol index 46ca2f1f..c67e1ba0 100644 --- a/src/bridge/ERC20Bridge.sol +++ b/src/bridge/ERC20Bridge.sol @@ -27,12 +27,9 @@ contract ERC20Bridge is AbsBridge, IERC20Bridge { /// @inheritdoc IERC20Bridge address public nativeToken; - event Hi(); - /// @inheritdoc IERC20Bridge function initialize(IOwnable rollup_, address nativeToken_) external initializer onlyDelegated { if (nativeToken_ == address(0)) revert InvalidTokenSet(nativeToken_); - emit Hi(); nativeToken = nativeToken_; _activeOutbox = EMPTY_ACTIVEOUTBOX; rollup = rollup_; diff --git a/src/rollup/BridgeCreator.sol b/src/rollup/BridgeCreator.sol index 8f42100e..d87af2fa 100644 --- a/src/rollup/BridgeCreator.sol +++ b/src/rollup/BridgeCreator.sol @@ -114,6 +114,4 @@ contract BridgeCreator is Ownable { return frame; } - - event Testy(address); } From f75a8fc14cc339a329b41407ae0c578e76863f07 Mon Sep 17 00:00:00 2001 From: Chris Buckland Date: Thu, 26 Oct 2023 14:05:52 +0200 Subject: [PATCH 213/292] Moved delayed messages read and batch delivered event into the bridge --- src/bridge/AbsBridge.sol | 43 ++++++++- src/bridge/IBridge.sol | 7 +- src/bridge/ICommon.sol | 21 +++++ src/bridge/ISequencerInbox.sol | 26 +----- src/bridge/SequencerInbox.sol | 142 +++++++++++------------------- src/libraries/Error.sol | 3 + src/mocks/BridgeStub.sol | 31 ++++++- src/mocks/SequencerInboxStub.sol | 26 +++--- src/test-helpers/BridgeTester.sol | 6 +- test/foundry/AbsBridge.t.sol | 56 ++++++++++-- test/foundry/SequencerInbox.t.sol | 12 +++ 11 files changed, 231 insertions(+), 142 deletions(-) create mode 100644 src/bridge/ICommon.sol create mode 100644 test/foundry/SequencerInbox.t.sol diff --git a/src/bridge/AbsBridge.sol b/src/bridge/AbsBridge.sol index bafd56f9..e5355351 100644 --- a/src/bridge/AbsBridge.sol +++ b/src/bridge/AbsBridge.sol @@ -14,11 +14,15 @@ import { NotSequencerInbox, NotOutbox, InvalidOutboxSet, - BadSequencerMessageNumber + BadSequencerMessageNumber, + EmptyDelayedMessagesRead, + DelayedBackwards, + DelayedTooFar } from "../libraries/Error.sol"; import "./IBridge.sol"; import "./Messages.sol"; import "../libraries/DelegateCallAware.sol"; +import "./ISequencerInbox.sol"; import {L1MessageType_batchPostingReport} from "../libraries/MessageTypes.sol"; @@ -55,8 +59,25 @@ abstract contract AbsBridge is Initializable, DelegateCallAware, IBridge { uint256 public override sequencerReportedSubMessageCount; + uint256 public totalDelayedMessagesRead; + address internal constant EMPTY_ACTIVEOUTBOX = address(type(uint160).max); + event SequencerBatchDelivered( + uint256 indexed batchSequenceNumber, + bytes32 indexed beforeAcc, + bytes32 indexed afterAcc, + bytes32 delayedAcc, + uint256 afterDelayedMessagesRead, + ICommon.TimeBounds timeBounds, + ICommon.BatchDataLocation dataLocation + ); + + function postUpgradeInit() external onlyDelegated onlyProxyOwner { + totalDelayedMessagesRead = ISequencerInbox(sequencerInbox).totalDelayedMessagesRead(); + if (totalDelayedMessagesRead == 0) revert EmptyDelayedMessagesRead(); + } + modifier onlyRollupOrOwner() { if (msg.sender != address(rollup)) { address rollupOwner = rollup.owner(); @@ -101,7 +122,9 @@ abstract contract AbsBridge is Initializable, DelegateCallAware, IBridge { bytes32 dataHash, uint256 afterDelayedMessagesRead, uint256 prevMessageCount, - uint256 newMessageCount + uint256 newMessageCount, + ICommon.TimeBounds memory timeBounds, + ICommon.BatchDataLocation batchDataLocation ) external onlySequencerInbox @@ -119,6 +142,9 @@ abstract contract AbsBridge is Initializable, DelegateCallAware, IBridge { ) { revert BadSequencerMessageNumber(sequencerReportedSubMessageCount, prevMessageCount); } + if (afterDelayedMessagesRead > delayedInboxAccs.length) revert DelayedTooFar(); + if (afterDelayedMessagesRead < totalDelayedMessagesRead) revert DelayedBackwards(); + sequencerReportedSubMessageCount = newMessageCount; seqMessageIndex = sequencerInboxAccs.length; if (sequencerInboxAccs.length > 0) { @@ -129,6 +155,17 @@ abstract contract AbsBridge is Initializable, DelegateCallAware, IBridge { } acc = keccak256(abi.encodePacked(beforeAcc, dataHash, delayedAcc)); sequencerInboxAccs.push(acc); + totalDelayedMessagesRead = afterDelayedMessagesRead; + + emit SequencerBatchDelivered( + seqMessageIndex, + beforeAcc, + acc, + delayedAcc, + afterDelayedMessagesRead, + timeBounds, + batchDataLocation + ); } /// @inheritdoc IBridge @@ -304,5 +341,5 @@ abstract contract AbsBridge is Initializable, DelegateCallAware, IBridge { * variables without shifting down storage in the inheritance chain. * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps */ - uint256[40] private __gap; + uint256[39] private __gap; } diff --git a/src/bridge/IBridge.sol b/src/bridge/IBridge.sol index 22388b4b..abd173d9 100644 --- a/src/bridge/IBridge.sol +++ b/src/bridge/IBridge.sol @@ -6,6 +6,7 @@ pragma solidity >=0.6.9 <0.9.0; import "./IOwnable.sol"; +import "./ICommon.sol"; interface IBridge { event MessageDelivered( @@ -66,13 +67,17 @@ interface IBridge { function sequencerMessageCount() external view returns (uint256); + function totalDelayedMessagesRead() external view returns (uint256); + // ---------- onlySequencerInbox functions ---------- function enqueueSequencerMessage( bytes32 dataHash, uint256 afterDelayedMessagesRead, uint256 prevMessageCount, - uint256 newMessageCount + uint256 newMessageCount, + ICommon.TimeBounds memory timeBounds, + ICommon.BatchDataLocation dataLocation ) external returns ( diff --git a/src/bridge/ICommon.sol b/src/bridge/ICommon.sol new file mode 100644 index 00000000..388d3025 --- /dev/null +++ b/src/bridge/ICommon.sol @@ -0,0 +1,21 @@ +// 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-version +pragma solidity >=0.6.9 <0.9.0; + +interface ICommon { + enum BatchDataLocation { + TxInput, + SeparateBatchEvent, + NoData + } + + struct TimeBounds { + uint64 minTimestamp; + uint64 maxTimestamp; + uint64 minBlockNumber; + uint64 maxBlockNumber; + } +} diff --git a/src/bridge/ISequencerInbox.sol b/src/bridge/ISequencerInbox.sol index 82b893b4..99efbc50 100644 --- a/src/bridge/ISequencerInbox.sol +++ b/src/bridge/ISequencerInbox.sol @@ -9,6 +9,7 @@ pragma experimental ABIEncoderV2; import "../libraries/IGasRefunder.sol"; import "./IDelayedMessageProvider.sol"; import "./IBridge.sol"; +import "./ICommon.sol"; interface ISequencerInbox is IDelayedMessageProvider { /// @notice The maximum amount of time variatin between a message being posted on the L1 and being executed on the L2 @@ -23,29 +24,6 @@ interface ISequencerInbox is IDelayedMessageProvider { uint256 futureSeconds; } - struct TimeBounds { - uint64 minTimestamp; - uint64 maxTimestamp; - uint64 minBlockNumber; - uint64 maxBlockNumber; - } - - enum BatchDataLocation { - TxInput, - SeparateBatchEvent, - NoData - } - - event SequencerBatchDelivered( - uint256 indexed batchSequenceNumber, - bytes32 indexed beforeAcc, - bytes32 indexed afterAcc, - bytes32 delayedAcc, - uint256 afterDelayedMessagesRead, - TimeBounds timeBounds, - BatchDataLocation dataLocation - ); - event OwnerFunctionCalled(uint256 indexed id); /// @dev a separate event that emits batch data when this isn't easily accessible in the tx.input @@ -57,6 +35,8 @@ interface ISequencerInbox is IDelayedMessageProvider { /// @dev a keyset was invalidated event InvalidateKeyset(bytes32 indexed keysetHash); + /// @notice The total number of delated messages read in the bridge + /// @dev We surface this here for backwards compatibility function totalDelayedMessagesRead() external view returns (uint256); function bridge() external view returns (IBridge); diff --git a/src/bridge/SequencerInbox.sol b/src/bridge/SequencerInbox.sol index 4ed86f11..3cea7aa8 100644 --- a/src/bridge/SequencerInbox.sol +++ b/src/bridge/SequencerInbox.sol @@ -44,8 +44,6 @@ import "../libraries/ArbitrumChecker.sol"; * sequencer within a time limit they can be force included into the rollup inbox by anyone. */ contract SequencerInbox is GasRefundEnabled, ISequencerInbox { - uint256 public totalDelayedMessagesRead; - IBridge public immutable bridge; /// @inheritdoc ISequencerInbox @@ -106,8 +104,13 @@ contract SequencerInbox is GasRefundEnabled, ISequencerInbox { rollup = newRollup; } - function getTimeBounds() internal view virtual returns (TimeBounds memory) { - TimeBounds memory bounds; + /// @inheritdoc ISequencerInbox + function totalDelayedMessagesRead() public view returns (uint256) { + return bridge.totalDelayedMessagesRead(); + } + + function getTimeBounds() internal view virtual returns (ICommon.TimeBounds memory) { + ICommon.TimeBounds memory bounds; ISequencerInbox.MaxTimeVariation memory maxTimeVariation_ = maxTimeVariation(); if (block.timestamp > maxTimeVariation_.delaySeconds) { bounds.minTimestamp = uint64(block.timestamp - maxTimeVariation_.delaySeconds); @@ -149,7 +152,7 @@ contract SequencerInbox is GasRefundEnabled, ISequencerInbox { address sender, bytes32 messageDataHash ) external { - if (_totalDelayedMessagesRead <= totalDelayedMessagesRead) revert DelayedBackwards(); + if (_totalDelayedMessagesRead <= totalDelayedMessagesRead()) revert DelayedBackwards(); bytes32 messageHash = Messages.messageHash( kind, sender, @@ -176,34 +179,21 @@ contract SequencerInbox is GasRefundEnabled, ISequencerInbox { Messages.accumulateInboxMessage(prevDelayedAcc, messageHash) ) revert IncorrectMessagePreimage(); - (bytes32 dataHash, TimeBounds memory timeBounds) = formEmptyDataHash( + (bytes32 dataHash, ICommon.TimeBounds memory timeBounds) = formEmptyDataHash( _totalDelayedMessagesRead ); - uint256 __totalDelayedMessagesRead = _totalDelayedMessagesRead; uint256 prevSeqMsgCount = bridge.sequencerReportedSubMessageCount(); uint256 newSeqMsgCount = prevSeqMsgCount + _totalDelayedMessagesRead - - totalDelayedMessagesRead; - ( - uint256 seqMessageIndex, - bytes32 beforeAcc, - bytes32 delayedAcc, - bytes32 afterAcc - ) = addSequencerL2BatchImpl( - dataHash, - __totalDelayedMessagesRead, - 0, - prevSeqMsgCount, - newSeqMsgCount - ); - emit SequencerBatchDelivered( - seqMessageIndex, - beforeAcc, - afterAcc, - delayedAcc, - totalDelayedMessagesRead, + totalDelayedMessagesRead(); + addSequencerL2BatchImpl( + dataHash, + _totalDelayedMessagesRead, + 0, + prevSeqMsgCount, + newSeqMsgCount, timeBounds, - BatchDataLocation.NoData + ICommon.BatchDataLocation.NoData ); } @@ -218,41 +208,30 @@ contract SequencerInbox is GasRefundEnabled, ISequencerInbox { // solhint-disable-next-line avoid-tx-origin if (msg.sender != tx.origin) revert NotOrigin(); if (!isBatchPoster[msg.sender]) revert NotBatchPoster(); - (bytes32 dataHash, TimeBounds memory timeBounds) = formDataHash( + (bytes32 dataHash, ICommon.TimeBounds memory timeBounds) = formDataHash( data, afterDelayedMessagesRead ); // Reformat the stack to prevent "Stack too deep" uint256 sequenceNumber_ = sequenceNumber; - TimeBounds memory timeBounds_ = timeBounds; + ICommon.TimeBounds memory timeBounds_ = timeBounds; bytes32 dataHash_ = dataHash; uint256 dataLength = data.length; uint256 afterDelayedMessagesRead_ = afterDelayedMessagesRead; uint256 prevMessageCount_ = prevMessageCount; uint256 newMessageCount_ = newMessageCount; - ( - uint256 seqMessageIndex, - bytes32 beforeAcc, - bytes32 delayedAcc, - bytes32 afterAcc - ) = addSequencerL2BatchImpl( - dataHash_, - afterDelayedMessagesRead_, - dataLength, - prevMessageCount_, - newMessageCount_ - ); - if (seqMessageIndex != sequenceNumber_ && sequenceNumber_ != ~uint256(0)) - revert BadSequencerNumber(seqMessageIndex, sequenceNumber_); - emit SequencerBatchDelivered( - seqMessageIndex, - beforeAcc, - afterAcc, - delayedAcc, - totalDelayedMessagesRead, + + uint256 seqMessageIndex = addSequencerL2BatchImpl( + dataHash_, + afterDelayedMessagesRead_, + dataLength, + prevMessageCount_, + newMessageCount_, timeBounds_, - BatchDataLocation.TxInput + ICommon.BatchDataLocation.TxInput ); + if (seqMessageIndex != sequenceNumber_ && sequenceNumber_ != ~uint256(0)) + revert BadSequencerNumber(seqMessageIndex, sequenceNumber_); } function addSequencerL2Batch( @@ -264,7 +243,7 @@ contract SequencerInbox is GasRefundEnabled, ISequencerInbox { uint256 newMessageCount ) external override refundsGas(gasRefunder) { if (!isBatchPoster[msg.sender] && msg.sender != address(rollup)) revert NotBatchPoster(); - (bytes32 dataHash, TimeBounds memory timeBounds) = formDataHash( + (bytes32 dataHash, ICommon.TimeBounds memory timeBounds) = formDataHash( data, afterDelayedMessagesRead ); @@ -272,34 +251,24 @@ contract SequencerInbox is GasRefundEnabled, ISequencerInbox { { // Reformat the stack to prevent "Stack too deep" uint256 sequenceNumber_ = sequenceNumber; - TimeBounds memory timeBounds_ = timeBounds; + ICommon.TimeBounds memory timeBounds_ = timeBounds; bytes32 dataHash_ = dataHash; uint256 afterDelayedMessagesRead_ = afterDelayedMessagesRead; uint256 prevMessageCount_ = prevMessageCount; uint256 newMessageCount_ = newMessageCount; // we set the calldata length posted to 0 here since the caller isn't the origin // of the tx, so they might have not paid tx input cost for the calldata - bytes32 beforeAcc; - bytes32 delayedAcc; - bytes32 afterAcc; - (seqMessageIndex, beforeAcc, delayedAcc, afterAcc) = addSequencerL2BatchImpl( + seqMessageIndex = addSequencerL2BatchImpl( dataHash_, afterDelayedMessagesRead_, 0, prevMessageCount_, - newMessageCount_ + newMessageCount_, + timeBounds_, + ICommon.BatchDataLocation.SeparateBatchEvent ); if (seqMessageIndex != sequenceNumber_ && sequenceNumber_ != ~uint256(0)) revert BadSequencerNumber(seqMessageIndex, sequenceNumber_); - emit SequencerBatchDelivered( - seqMessageIndex, - beforeAcc, - afterAcc, - delayedAcc, - totalDelayedMessagesRead, - timeBounds_, - BatchDataLocation.SeparateBatchEvent - ); } emit SequencerBatchData(seqMessageIndex, data); } @@ -323,9 +292,9 @@ contract SequencerInbox is GasRefundEnabled, ISequencerInbox { function packHeader(uint256 afterDelayedMessagesRead) internal view - returns (bytes memory, TimeBounds memory) + returns (bytes memory, ICommon.TimeBounds memory) { - TimeBounds memory timeBounds = getTimeBounds(); + ICommon.TimeBounds memory timeBounds = getTimeBounds(); bytes memory header = abi.encodePacked( timeBounds.minTimestamp, timeBounds.maxTimestamp, @@ -342,9 +311,11 @@ contract SequencerInbox is GasRefundEnabled, ISequencerInbox { internal view validateBatchData(data) - returns (bytes32, TimeBounds memory) + returns (bytes32, ICommon.TimeBounds memory) { - (bytes memory header, TimeBounds memory timeBounds) = packHeader(afterDelayedMessagesRead); + (bytes memory header, ICommon.TimeBounds memory timeBounds) = packHeader( + afterDelayedMessagesRead + ); bytes32 dataHash = keccak256(bytes.concat(header, data)); return (dataHash, timeBounds); } @@ -352,9 +323,11 @@ contract SequencerInbox is GasRefundEnabled, ISequencerInbox { function formEmptyDataHash(uint256 afterDelayedMessagesRead) internal view - returns (bytes32, TimeBounds memory) + returns (bytes32, ICommon.TimeBounds memory) { - (bytes memory header, TimeBounds memory timeBounds) = packHeader(afterDelayedMessagesRead); + (bytes memory header, ICommon.TimeBounds memory timeBounds) = packHeader( + afterDelayedMessagesRead + ); return (keccak256(header), timeBounds); } @@ -363,28 +336,19 @@ contract SequencerInbox is GasRefundEnabled, ISequencerInbox { uint256 afterDelayedMessagesRead, uint256 calldataLengthPosted, uint256 prevMessageCount, - uint256 newMessageCount - ) - internal - returns ( - uint256 seqMessageIndex, - bytes32 beforeAcc, - bytes32 delayedAcc, - bytes32 acc - ) - { - if (afterDelayedMessagesRead < totalDelayedMessagesRead) revert DelayedBackwards(); - if (afterDelayedMessagesRead > bridge.delayedMessageCount()) revert DelayedTooFar(); - - (seqMessageIndex, beforeAcc, delayedAcc, acc) = bridge.enqueueSequencerMessage( + uint256 newMessageCount, + ICommon.TimeBounds memory timeBounds, + ICommon.BatchDataLocation batchDataLocation + ) internal returns (uint256 seqMessageIndex) { + (seqMessageIndex, , , ) = bridge.enqueueSequencerMessage( dataHash, afterDelayedMessagesRead, prevMessageCount, - newMessageCount + newMessageCount, + timeBounds, + batchDataLocation ); - totalDelayedMessagesRead = afterDelayedMessagesRead; - if (calldataLengthPosted > 0) { // this msg isn't included in the current sequencer batch, but instead added to // the delayed messages queue that is yet to be included diff --git a/src/libraries/Error.sol b/src/libraries/Error.sol index fd6f3255..bf24a64d 100644 --- a/src/libraries/Error.sol +++ b/src/libraries/Error.sol @@ -178,3 +178,6 @@ error NoSuchKeyset(bytes32); /// @dev Thrown when rollup is not updated with updateRollupAddress error RollupNotChanged(); + +/// @dev Thrown when reading the total delayed messages and getting 0 when a non zero value is expected +error EmptyDelayedMessagesRead(); diff --git a/src/mocks/BridgeStub.sol b/src/mocks/BridgeStub.sol index be6dc677..d7102a38 100644 --- a/src/mocks/BridgeStub.sol +++ b/src/mocks/BridgeStub.sol @@ -5,7 +5,7 @@ pragma solidity ^0.8.0; import "./InboxStub.sol"; -import {BadSequencerMessageNumber} from "../libraries/Error.sol"; +import {BadSequencerMessageNumber, DelayedTooFar, DelayedBackwards} from "../libraries/Error.sol"; import "../bridge/IBridge.sol"; import "../bridge/IEthBridge.sol"; @@ -32,6 +32,7 @@ contract BridgeStub is IBridge, IEthBridge { address public sequencerInbox; uint256 public override sequencerReportedSubMessageCount; IOwnable public rollup; + uint256 public totalDelayedMessagesRead; constructor(IOwnable rollup_) { rollup = rollup_; @@ -71,11 +72,23 @@ contract BridgeStub is IBridge, IEthBridge { ); } + event SequencerBatchDelivered( + uint256 indexed batchSequenceNumber, + bytes32 indexed beforeAcc, + bytes32 indexed afterAcc, + bytes32 delayedAcc, + uint256 afterDelayedMessagesRead, + ICommon.TimeBounds timeBounds, + ICommon.BatchDataLocation dataLocation + ); + function enqueueSequencerMessage( bytes32 dataHash, uint256 afterDelayedMessagesRead, uint256 prevMessageCount, - uint256 newMessageCount + uint256 newMessageCount, + ICommon.TimeBounds memory timeBounds, + ICommon.BatchDataLocation batchDataLocation ) external returns ( @@ -92,6 +105,9 @@ contract BridgeStub is IBridge, IEthBridge { ) { revert BadSequencerMessageNumber(sequencerReportedSubMessageCount, prevMessageCount); } + if (afterDelayedMessagesRead > delayedInboxAccs.length) revert DelayedTooFar(); + if (afterDelayedMessagesRead < totalDelayedMessagesRead) revert DelayedBackwards(); + sequencerReportedSubMessageCount = newMessageCount; seqMessageIndex = sequencerInboxAccs.length; if (sequencerInboxAccs.length > 0) { @@ -102,6 +118,17 @@ contract BridgeStub is IBridge, IEthBridge { } acc = keccak256(abi.encodePacked(beforeAcc, dataHash, delayedAcc)); sequencerInboxAccs.push(acc); + totalDelayedMessagesRead = afterDelayedMessagesRead; + + emit SequencerBatchDelivered( + seqMessageIndex, + beforeAcc, + acc, + delayedAcc, + afterDelayedMessagesRead, + timeBounds, + batchDataLocation + ); } function submitBatchSpendingReport(address batchPoster, bytes32 dataHash) diff --git a/src/mocks/SequencerInboxStub.sol b/src/mocks/SequencerInboxStub.sol index f3716df5..5b2dd05b 100644 --- a/src/mocks/SequencerInboxStub.sol +++ b/src/mocks/SequencerInboxStub.sol @@ -27,26 +27,20 @@ contract SequencerInboxStub is SequencerInbox { ); require(num == 0, "ALREADY_DELAYED_INIT"); emit InboxMessageDelivered(num, initMsg); - (bytes32 dataHash, TimeBounds memory timeBounds) = formEmptyDataHash(1); - ( - uint256 sequencerMessageCount, - bytes32 beforeAcc, - bytes32 delayedAcc, - bytes32 afterAcc - ) = addSequencerL2BatchImpl(dataHash, 1, 0, 0, 1); - require(sequencerMessageCount == 0, "ALREADY_SEQ_INIT"); - emit SequencerBatchDelivered( - sequencerMessageCount, - beforeAcc, - afterAcc, - delayedAcc, - totalDelayedMessagesRead, + (bytes32 dataHash, ICommon.TimeBounds memory timeBounds) = formEmptyDataHash(1); + uint256 sequencerMessageCount = addSequencerL2BatchImpl( + dataHash, + 1, + 0, + 0, + 1, timeBounds, - BatchDataLocation.NoData + ICommon.BatchDataLocation.NoData ); + require(sequencerMessageCount == 0, "ALREADY_SEQ_INIT"); } - function getTimeBounds() internal view override returns (TimeBounds memory bounds) { + function getTimeBounds() internal view override returns (ICommon.TimeBounds memory bounds) { this; // silence warning about function not being view return bounds; } diff --git a/src/test-helpers/BridgeTester.sol b/src/test-helpers/BridgeTester.sol index 0bcbe00f..c30febe3 100644 --- a/src/test-helpers/BridgeTester.sol +++ b/src/test-helpers/BridgeTester.sol @@ -67,6 +67,8 @@ contract BridgeTester is Initializable, DelegateCallAware, IBridge, IEthBridge { bytes32[] public override sequencerInboxAccs; uint256 public override sequencerReportedSubMessageCount; + uint256 public totalDelayedMessagesRead; + address private constant EMPTY_ACTIVEOUTBOX = address(type(uint160).max); function initialize(IOwnable rollup_) external initializer { @@ -95,7 +97,9 @@ contract BridgeTester is Initializable, DelegateCallAware, IBridge, IEthBridge { bytes32 dataHash, uint256 afterDelayedMessagesRead, uint256 prevMessageCount, - uint256 newMessageCount + uint256 newMessageCount, + ICommon.TimeBounds memory timeBounds, + ICommon.BatchDataLocation batchDataLocation ) external returns ( diff --git a/test/foundry/AbsBridge.t.sol b/test/foundry/AbsBridge.t.sol index 1ce9737b..9cedcb98 100644 --- a/test/foundry/AbsBridge.t.sol +++ b/test/foundry/AbsBridge.t.sol @@ -22,6 +22,14 @@ abstract contract AbsBridgeTest is Test { address public outbox = address(1002); address public seqInbox = address(1003); + ICommon.TimeBounds timeBounds = + ICommon.TimeBounds({ + minTimestamp: uint64(block.timestamp + 1), + maxTimestamp: uint64(block.timestamp + 10), + minBlockNumber: uint64(block.number + 1), + maxBlockNumber: uint64(block.number + 10) + }); + /* solhint-disable func-name-mixedcase */ function test_enqueueSequencerMessage_NoDelayedMsgs() public { vm.prank(rollup); @@ -38,7 +46,9 @@ abstract contract AbsBridgeTest is Test { dataHash, afterDelayedMessagesRead, prevMessageCount, - newMessageCount + newMessageCount, + timeBounds, + ICommon.BatchDataLocation.TxInput ); // checks @@ -78,7 +88,9 @@ abstract contract AbsBridgeTest is Test { dataHash, afterDelayedMessagesRead, prevMessageCount, - newMessageCount + newMessageCount, + timeBounds, + ICommon.BatchDataLocation.TxInput ); // checks @@ -107,7 +119,14 @@ abstract contract AbsBridgeTest is Test { bridge.submitBatchSpendingReport(address(1), keccak256("1")); bridge.submitBatchSpendingReport(address(2), keccak256("2")); bridge.submitBatchSpendingReport(address(3), keccak256("3")); - bridge.enqueueSequencerMessage(keccak256("seq"), 2, 0, 10); + bridge.enqueueSequencerMessage( + keccak256("seq"), + 2, + 0, + 10, + timeBounds, + ICommon.BatchDataLocation.SeparateBatchEvent + ); vm.stopPrank(); // enqueue 2nd sequencer msg with additional delayed msgs @@ -121,7 +140,9 @@ abstract contract AbsBridgeTest is Test { dataHash, afterDelayedMessagesRead, prevMessageCount, - newMessageCount + newMessageCount, + timeBounds, + ICommon.BatchDataLocation.TxInput ); // checks @@ -150,7 +171,14 @@ abstract contract AbsBridgeTest is Test { bridge.submitBatchSpendingReport(address(1), keccak256("1")); bridge.submitBatchSpendingReport(address(2), keccak256("2")); bridge.submitBatchSpendingReport(address(3), keccak256("3")); - bridge.enqueueSequencerMessage(keccak256("seq"), 2, 0, 10); + bridge.enqueueSequencerMessage( + keccak256("seq"), + 2, + 0, + 10, + timeBounds, + ICommon.BatchDataLocation.SeparateBatchEvent + ); vm.stopPrank(); // setting wrong msg counter shall revert @@ -159,13 +187,27 @@ abstract contract AbsBridgeTest is Test { vm.expectRevert( abi.encodeWithSelector(BadSequencerMessageNumber.selector, 10, incorrectPrevMsgCount) ); - bridge.enqueueSequencerMessage(keccak256("seq"), 2, incorrectPrevMsgCount, 10); + bridge.enqueueSequencerMessage( + keccak256("seq"), + 2, + incorrectPrevMsgCount, + 10, + timeBounds, + ICommon.BatchDataLocation.SeparateBatchEvent + ); } function test_enqueueSequencerMessage_revert_NonSeqInboxCall() public { // enqueueSequencerMessage shall revert vm.expectRevert(abi.encodeWithSelector(NotSequencerInbox.selector, address(this))); - bridge.enqueueSequencerMessage(keccak256("msg"), 0, 0, 10); + bridge.enqueueSequencerMessage( + keccak256("msg"), + 0, + 0, + 10, + timeBounds, + ICommon.BatchDataLocation.SeparateBatchEvent + ); } function test_submitBatchSpendingReport() public { diff --git a/test/foundry/SequencerInbox.t.sol b/test/foundry/SequencerInbox.t.sol new file mode 100644 index 00000000..fbeca16b --- /dev/null +++ b/test/foundry/SequencerInbox.t.sol @@ -0,0 +1,12 @@ +// SPDX-License-Identifier: UNLICENSED +pragma solidity ^0.8.4; + +import "forge-std/Test.sol"; +import "./util/TestUtil.sol"; +import "../../src/bridge/IBridge.sol"; + +contract SequencerInboxTest is Test { + function testInit() public { + console.log("face"); + } +} From 887cc470efae11e0dc1a51585757cae8e400b47c Mon Sep 17 00:00:00 2001 From: Chris Buckland Date: Thu, 26 Oct 2023 14:06:29 +0200 Subject: [PATCH 214/292] Removed tests for now --- test/foundry/SequencerInbox.t.sol | 12 ------------ 1 file changed, 12 deletions(-) delete mode 100644 test/foundry/SequencerInbox.t.sol diff --git a/test/foundry/SequencerInbox.t.sol b/test/foundry/SequencerInbox.t.sol deleted file mode 100644 index fbeca16b..00000000 --- a/test/foundry/SequencerInbox.t.sol +++ /dev/null @@ -1,12 +0,0 @@ -// SPDX-License-Identifier: UNLICENSED -pragma solidity ^0.8.4; - -import "forge-std/Test.sol"; -import "./util/TestUtil.sol"; -import "../../src/bridge/IBridge.sol"; - -contract SequencerInboxTest is Test { - function testInit() public { - console.log("face"); - } -} From d06f2a0eb072f1e17012125769376fe650f9548f Mon Sep 17 00:00:00 2001 From: Chris Buckland Date: Thu, 26 Oct 2023 14:16:19 +0200 Subject: [PATCH 215/292] Added encoder v2 --- src/bridge/IBridge.sol | 1 + 1 file changed, 1 insertion(+) diff --git a/src/bridge/IBridge.sol b/src/bridge/IBridge.sol index abd173d9..d129482d 100644 --- a/src/bridge/IBridge.sol +++ b/src/bridge/IBridge.sol @@ -4,6 +4,7 @@ // solhint-disable-next-line compiler-version pragma solidity >=0.6.9 <0.9.0; +pragma experimental ABIEncoderV2; import "./IOwnable.sol"; import "./ICommon.sol"; From ce8fb885f186a33fbd193199dabc17e78cd0537e Mon Sep 17 00:00:00 2001 From: Chris Buckland Date: Thu, 26 Oct 2023 14:29:41 +0200 Subject: [PATCH 216/292] Updated bridge storage dot --- test/storage/Bridge.dot | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/test/storage/Bridge.dot b/test/storage/Bridge.dot index c98a5e8c..e21c940d 100644 --- a/test/storage/Bridge.dot +++ b/test/storage/Bridge.dot @@ -4,7 +4,7 @@ rankdir=LR color=black arrowhead=open node [shape=record, style=filled, fillcolor=gray95 fontname="Courier New"] -8 [label="Bridge \<\\>\n | {{ slot| 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11-50 } | { type: \.variable (bytes) | { unallocated (30) | bool: Initializable._initializing (1) | bool: Initializable._initialized (1) } | { <5> mapping\(address=\>InOutInfo\): AbsBridge.allowedDelayedInboxesMap (32) } | { <8> mapping\(address=\>InOutInfo\): AbsBridge.allowedOutboxesMap (32) } | { <10> address[]: AbsBridge.allowedDelayedInboxList (32) } | { <12> address[]: AbsBridge.allowedOutboxList (32) } | { unallocated (12) | address: AbsBridge._activeOutbox (20) } | { <15> bytes32[]: AbsBridge.delayedInboxAccs (32) } | { <17> bytes32[]: AbsBridge.sequencerInboxAccs (32) } | { unallocated (12) | IOwnable: AbsBridge.rollup (20) } | { unallocated (12) | address: AbsBridge.sequencerInbox (20) } | { uint256: AbsBridge.sequencerReportedSubMessageCount (32) } | { <61> uint256[40]: AbsBridge.__gap (1280) }}}"] +8 [label="Bridge \<\\>\n | {{ slot| 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12-50 } | { type: \.variable (bytes) | { unallocated (30) | bool: Initializable._initializing (1) | bool: Initializable._initialized (1) } | { <5> mapping\(address=\>InOutInfo\): AbsBridge.allowedDelayedInboxesMap (32) } | { <8> mapping\(address=\>InOutInfo\): AbsBridge.allowedOutboxesMap (32) } | { <10> address[]: AbsBridge.allowedDelayedInboxList (32) } | { <12> address[]: AbsBridge.allowedOutboxList (32) } | { unallocated (12) | address: AbsBridge._activeOutbox (20) } | { <15> bytes32[]: AbsBridge.delayedInboxAccs (32) } | { <17> bytes32[]: AbsBridge.sequencerInboxAccs (32) } | { unallocated (12) | IOwnable: AbsBridge.rollup (20) } | { unallocated (12) | address: AbsBridge.sequencerInbox (20) } | { uint256: AbsBridge.sequencerReportedSubMessageCount (32) } | { uint256: AbsBridge.totalDelayedMessagesRead (32) } | { <61> uint256[39]: AbsBridge.__gap (1248) }}}"] 1 [label="InOutInfo \<\\>\n | {{ slot| 0 | 1 } | { type: variable (bytes) | { uint256: index (32) } | { unallocated (31) | bool: allowed (1) }}}"] @@ -18,7 +18,7 @@ node [shape=record, style=filled, fillcolor=gray95 fontname="Courier New"] 6 [label="bytes32[]: sequencerInboxAccs \<\\>\n0x995663702627f3d8fc4237c51a46b303536bb17f3f65e07c08ad05fecbf4d88e | {{ slot| 0 } | { type: variable (bytes) | { bytes32 (32) }}}"] -7 [label="uint256[40]: __gap \<\\>\n | {{ slot| 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 } | { type: variable (bytes) | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) }}}"] +7 [label="uint256[39]: __gap \<\\>\n | {{ slot| 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 } | { type: variable (bytes) | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) }}}"] 8:5 -> 1 8:8 -> 2 From 9a3e21ee7ef1b33288d0d407aecba27ff1251781 Mon Sep 17 00:00:00 2001 From: Goran Vladika Date: Thu, 26 Oct 2023 14:33:43 +0200 Subject: [PATCH 217/292] Use 'forge inspect' for storage layout checks --- .gitignore | 2 +- test/storage/Bridge | 15 ++++++++++++ test/storage/Bridge.dot | 30 ------------------------ test/storage/ChallengeManager | 8 +++++++ test/storage/ChallengeManager.dot | 9 -------- test/storage/ERC20Bridge | 16 +++++++++++++ test/storage/ERC20Bridge.dot | 27 ---------------------- test/storage/ERC20Inbox | 12 ++++++++++ test/storage/ERC20Inbox.dot | 15 ------------ test/storage/ERC20Outbox | 8 +++++++ test/storage/ERC20Outbox.dot | 12 ---------- test/storage/Inbox | 12 ++++++++++ test/storage/Inbox.dot | 18 --------------- test/storage/Outbox | 8 +++++++ test/storage/Outbox.dot | 15 ------------ test/storage/RollupAdminLogic | 38 +++++++++++++++++++++++++++++++ test/storage/RollupAdminLogic.dot | 30 ------------------------ test/storage/RollupCore | 38 +++++++++++++++++++++++++++++++ test/storage/RollupCore.dot | 30 ------------------------ test/storage/RollupUserLogic | 38 +++++++++++++++++++++++++++++++ test/storage/RollupUserLogic.dot | 30 ------------------------ test/storage/SequencerInbox | 9 ++++++++ test/storage/SequencerInbox.dot | 15 ------------ test/storage/test.bash | 9 ++++---- 24 files changed, 208 insertions(+), 236 deletions(-) create mode 100644 test/storage/Bridge delete mode 100644 test/storage/Bridge.dot create mode 100644 test/storage/ChallengeManager delete mode 100644 test/storage/ChallengeManager.dot create mode 100644 test/storage/ERC20Bridge delete mode 100644 test/storage/ERC20Bridge.dot create mode 100644 test/storage/ERC20Inbox delete mode 100644 test/storage/ERC20Inbox.dot create mode 100644 test/storage/ERC20Outbox delete mode 100644 test/storage/ERC20Outbox.dot create mode 100644 test/storage/Inbox delete mode 100644 test/storage/Inbox.dot create mode 100644 test/storage/Outbox delete mode 100644 test/storage/Outbox.dot create mode 100644 test/storage/RollupAdminLogic delete mode 100644 test/storage/RollupAdminLogic.dot create mode 100644 test/storage/RollupCore delete mode 100644 test/storage/RollupCore.dot create mode 100644 test/storage/RollupUserLogic delete mode 100644 test/storage/RollupUserLogic.dot create mode 100644 test/storage/SequencerInbox delete mode 100644 test/storage/SequencerInbox.dot diff --git a/.gitignore b/.gitignore index b42d2ab9..6de9a1bc 100644 --- a/.gitignore +++ b/.gitignore @@ -4,7 +4,7 @@ node_modules/ deployments/ /test/prover/proofs/*.json /test/prover/spec-proofs/*.json -/test/storage/*-old.dot +/test/storage/*-old scripts/config.ts forge-cache/ out/ diff --git a/test/storage/Bridge b/test/storage/Bridge new file mode 100644 index 00000000..9ed7f48a --- /dev/null +++ b/test/storage/Bridge @@ -0,0 +1,15 @@ +| Name | Type | Slot | Offset | Bytes | Contract | +|----------------------------------|------------------------------------------------|------|--------|-------|------------------------------| +| _initialized | bool | 0 | 0 | 1 | src/bridge/Bridge.sol:Bridge | +| _initializing | bool | 0 | 1 | 1 | src/bridge/Bridge.sol:Bridge | +| allowedDelayedInboxesMap | mapping(address => struct AbsBridge.InOutInfo) | 1 | 0 | 32 | src/bridge/Bridge.sol:Bridge | +| allowedOutboxesMap | mapping(address => struct AbsBridge.InOutInfo) | 2 | 0 | 32 | src/bridge/Bridge.sol:Bridge | +| allowedDelayedInboxList | address[] | 3 | 0 | 32 | src/bridge/Bridge.sol:Bridge | +| allowedOutboxList | address[] | 4 | 0 | 32 | src/bridge/Bridge.sol:Bridge | +| _activeOutbox | address | 5 | 0 | 20 | src/bridge/Bridge.sol:Bridge | +| delayedInboxAccs | bytes32[] | 6 | 0 | 32 | src/bridge/Bridge.sol:Bridge | +| sequencerInboxAccs | bytes32[] | 7 | 0 | 32 | src/bridge/Bridge.sol:Bridge | +| rollup | contract IOwnable | 8 | 0 | 20 | src/bridge/Bridge.sol:Bridge | +| sequencerInbox | address | 9 | 0 | 20 | src/bridge/Bridge.sol:Bridge | +| sequencerReportedSubMessageCount | uint256 | 10 | 0 | 32 | src/bridge/Bridge.sol:Bridge | +| __gap | uint256[40] | 11 | 0 | 1280 | src/bridge/Bridge.sol:Bridge | diff --git a/test/storage/Bridge.dot b/test/storage/Bridge.dot deleted file mode 100644 index c98a5e8c..00000000 --- a/test/storage/Bridge.dot +++ /dev/null @@ -1,30 +0,0 @@ - -digraph StorageDiagram { -rankdir=LR -color=black -arrowhead=open -node [shape=record, style=filled, fillcolor=gray95 fontname="Courier New"] -8 [label="Bridge \<\\>\n | {{ slot| 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11-50 } | { type: \.variable (bytes) | { unallocated (30) | bool: Initializable._initializing (1) | bool: Initializable._initialized (1) } | { <5> mapping\(address=\>InOutInfo\): AbsBridge.allowedDelayedInboxesMap (32) } | { <8> mapping\(address=\>InOutInfo\): AbsBridge.allowedOutboxesMap (32) } | { <10> address[]: AbsBridge.allowedDelayedInboxList (32) } | { <12> address[]: AbsBridge.allowedOutboxList (32) } | { unallocated (12) | address: AbsBridge._activeOutbox (20) } | { <15> bytes32[]: AbsBridge.delayedInboxAccs (32) } | { <17> bytes32[]: AbsBridge.sequencerInboxAccs (32) } | { unallocated (12) | IOwnable: AbsBridge.rollup (20) } | { unallocated (12) | address: AbsBridge.sequencerInbox (20) } | { uint256: AbsBridge.sequencerReportedSubMessageCount (32) } | { <61> uint256[40]: AbsBridge.__gap (1280) }}}"] - -1 [label="InOutInfo \<\\>\n | {{ slot| 0 | 1 } | { type: variable (bytes) | { uint256: index (32) } | { unallocated (31) | bool: allowed (1) }}}"] - -2 [label="InOutInfo \<\\>\n | {{ slot| 0 | 1 } | { type: variable (bytes) | { uint256: index (32) } | { unallocated (31) | bool: allowed (1) }}}"] - -3 [label="address[]: allowedDelayedInboxList \<\\>\n0x11987c15ef5ed64ec2e3cd9cfc79d7bd155aea3982ea59f35a5e6b5c1593a54b | {{ slot| 0 } | { type: variable (bytes) | { unallocated (12) | address (20) }}}"] - -4 [label="address[]: allowedOutboxList \<\\>\n0x68f9c7fa29c0442459fc0d2760448ff932de4dd67b90b4a6ac1899621cfd70a7 | {{ slot| 0 } | { type: variable (bytes) | { unallocated (12) | address (20) }}}"] - -5 [label="bytes32[]: delayedInboxAccs \<\\>\n0x5ff1374942f1d7624ea1478457e8132b05531ee44999ffc0f33a70926c6a0d30 | {{ slot| 0 } | { type: variable (bytes) | { bytes32 (32) }}}"] - -6 [label="bytes32[]: sequencerInboxAccs \<\\>\n0x995663702627f3d8fc4237c51a46b303536bb17f3f65e07c08ad05fecbf4d88e | {{ slot| 0 } | { type: variable (bytes) | { bytes32 (32) }}}"] - -7 [label="uint256[40]: __gap \<\\>\n | {{ slot| 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 } | { type: variable (bytes) | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) }}}"] - - 8:5 -> 1 - 8:8 -> 2 - 8:10 -> 3 - 8:12 -> 4 - 8:15 -> 5 - 8:17 -> 6 - 8:61 -> 7 -} \ No newline at end of file diff --git a/test/storage/ChallengeManager b/test/storage/ChallengeManager new file mode 100644 index 00000000..85c7f035 --- /dev/null +++ b/test/storage/ChallengeManager @@ -0,0 +1,8 @@ +| Name | Type | Slot | Offset | Bytes | Contract | +|------------------------|---------------------------------------------------|------|--------|-------|-----------------------------------------------------| +| totalChallengesCreated | uint64 | 0 | 0 | 8 | src/challenge/ChallengeManager.sol:ChallengeManager | +| challenges | mapping(uint256 => struct ChallengeLib.Challenge) | 1 | 0 | 32 | src/challenge/ChallengeManager.sol:ChallengeManager | +| resultReceiver | contract IChallengeResultReceiver | 2 | 0 | 20 | src/challenge/ChallengeManager.sol:ChallengeManager | +| sequencerInbox | contract ISequencerInbox | 3 | 0 | 20 | src/challenge/ChallengeManager.sol:ChallengeManager | +| bridge | contract IBridge | 4 | 0 | 20 | src/challenge/ChallengeManager.sol:ChallengeManager | +| osp | contract IOneStepProofEntry | 5 | 0 | 20 | src/challenge/ChallengeManager.sol:ChallengeManager | diff --git a/test/storage/ChallengeManager.dot b/test/storage/ChallengeManager.dot deleted file mode 100644 index d566805f..00000000 --- a/test/storage/ChallengeManager.dot +++ /dev/null @@ -1,9 +0,0 @@ - -digraph StorageDiagram { -rankdir=LR -color=black -arrowhead=open -node [shape=record, style=filled, fillcolor=gray95 fontname="Courier New"] -1 [label="ChallengeManager \<\\>\n | {{ slot| 0 | 1 | 2 | 3 | 4 | 5 } | { type: \.variable (bytes) | { unallocated (24) | uint64: totalChallengesCreated (8) } | { mapping\(uint256=\>ChallengeLib.Challenge\): challenges (32) } | { unallocated (12) | IChallengeResultReceiver: resultReceiver (20) } | { unallocated (12) | ISequencerInbox: sequencerInbox (20) } | { unallocated (12) | IBridge: bridge (20) } | { unallocated (12) | IOneStepProofEntry: osp (20) }}}"] - -} \ No newline at end of file diff --git a/test/storage/ERC20Bridge b/test/storage/ERC20Bridge new file mode 100644 index 00000000..1b0d838b --- /dev/null +++ b/test/storage/ERC20Bridge @@ -0,0 +1,16 @@ +| Name | Type | Slot | Offset | Bytes | Contract | +|----------------------------------|------------------------------------------------|------|--------|-------|----------------------------------------| +| _initialized | bool | 0 | 0 | 1 | src/bridge/ERC20Bridge.sol:ERC20Bridge | +| _initializing | bool | 0 | 1 | 1 | src/bridge/ERC20Bridge.sol:ERC20Bridge | +| allowedDelayedInboxesMap | mapping(address => struct AbsBridge.InOutInfo) | 1 | 0 | 32 | src/bridge/ERC20Bridge.sol:ERC20Bridge | +| allowedOutboxesMap | mapping(address => struct AbsBridge.InOutInfo) | 2 | 0 | 32 | src/bridge/ERC20Bridge.sol:ERC20Bridge | +| allowedDelayedInboxList | address[] | 3 | 0 | 32 | src/bridge/ERC20Bridge.sol:ERC20Bridge | +| allowedOutboxList | address[] | 4 | 0 | 32 | src/bridge/ERC20Bridge.sol:ERC20Bridge | +| _activeOutbox | address | 5 | 0 | 20 | src/bridge/ERC20Bridge.sol:ERC20Bridge | +| delayedInboxAccs | bytes32[] | 6 | 0 | 32 | src/bridge/ERC20Bridge.sol:ERC20Bridge | +| sequencerInboxAccs | bytes32[] | 7 | 0 | 32 | src/bridge/ERC20Bridge.sol:ERC20Bridge | +| rollup | contract IOwnable | 8 | 0 | 20 | src/bridge/ERC20Bridge.sol:ERC20Bridge | +| sequencerInbox | address | 9 | 0 | 20 | src/bridge/ERC20Bridge.sol:ERC20Bridge | +| sequencerReportedSubMessageCount | uint256 | 10 | 0 | 32 | src/bridge/ERC20Bridge.sol:ERC20Bridge | +| __gap | uint256[40] | 11 | 0 | 1280 | src/bridge/ERC20Bridge.sol:ERC20Bridge | +| nativeToken | address | 51 | 0 | 20 | src/bridge/ERC20Bridge.sol:ERC20Bridge | diff --git a/test/storage/ERC20Bridge.dot b/test/storage/ERC20Bridge.dot deleted file mode 100644 index ff456b92..00000000 --- a/test/storage/ERC20Bridge.dot +++ /dev/null @@ -1,27 +0,0 @@ - -digraph StorageDiagram { -rankdir=LR -color=black -arrowhead=open -node [shape=record, style=filled, fillcolor=gray95 fontname="Courier New"] -7 [label="ERC20Bridge \<\\>\n | {{ slot| 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 } | { type: \.variable (bytes) | { unallocated (30) | bool: Initializable._initializing (1) | bool: Initializable._initialized (1) } | { <5> mapping\(address=\>InOutInfo\): AbsBridge.allowedDelayedInboxesMap (32) } | { <8> mapping\(address=\>InOutInfo\): AbsBridge.allowedOutboxesMap (32) } | { <10> address[]: AbsBridge.allowedDelayedInboxList (32) } | { <12> address[]: AbsBridge.allowedOutboxList (32) } | { unallocated (12) | address: AbsBridge._activeOutbox (20) } | { <15> bytes32[]: AbsBridge.delayedInboxAccs (32) } | { <17> bytes32[]: AbsBridge.sequencerInboxAccs (32) } | { unallocated (12) | IOwnable: AbsBridge.rollup (20) } | { unallocated (12) | address: AbsBridge.sequencerInbox (20) } | { uint256: AbsBridge.sequencerReportedSubMessageCount (32) } | { unallocated (12) | address: nativeToken (20) }}}"] - -1 [label="InOutInfo \<\\>\n | {{ slot| 0 | 1 } | { type: variable (bytes) | { uint256: index (32) } | { unallocated (31) | bool: allowed (1) }}}"] - -2 [label="InOutInfo \<\\>\n | {{ slot| 0 | 1 } | { type: variable (bytes) | { uint256: index (32) } | { unallocated (31) | bool: allowed (1) }}}"] - -3 [label="address[]: allowedDelayedInboxList \<\\>\n0x11987c15ef5ed64ec2e3cd9cfc79d7bd155aea3982ea59f35a5e6b5c1593a54b | {{ slot| 0 } | { type: variable (bytes) | { unallocated (12) | address (20) }}}"] - -4 [label="address[]: allowedOutboxList \<\\>\n0x68f9c7fa29c0442459fc0d2760448ff932de4dd67b90b4a6ac1899621cfd70a7 | {{ slot| 0 } | { type: variable (bytes) | { unallocated (12) | address (20) }}}"] - -5 [label="bytes32[]: delayedInboxAccs \<\\>\n0x5ff1374942f1d7624ea1478457e8132b05531ee44999ffc0f33a70926c6a0d30 | {{ slot| 0 } | { type: variable (bytes) | { bytes32 (32) }}}"] - -6 [label="bytes32[]: sequencerInboxAccs \<\\>\n0x995663702627f3d8fc4237c51a46b303536bb17f3f65e07c08ad05fecbf4d88e | {{ slot| 0 } | { type: variable (bytes) | { bytes32 (32) }}}"] - - 7:5 -> 1 - 7:8 -> 2 - 7:10 -> 3 - 7:12 -> 4 - 7:15 -> 5 - 7:17 -> 6 -} \ No newline at end of file diff --git a/test/storage/ERC20Inbox b/test/storage/ERC20Inbox new file mode 100644 index 00000000..58f398df --- /dev/null +++ b/test/storage/ERC20Inbox @@ -0,0 +1,12 @@ +| Name | Type | Slot | Offset | Bytes | Contract | +|------------------|--------------------------|------|--------|-------|--------------------------------------| +| _initialized | bool | 0 | 0 | 1 | src/bridge/ERC20Inbox.sol:ERC20Inbox | +| _initializing | bool | 0 | 1 | 1 | src/bridge/ERC20Inbox.sol:ERC20Inbox | +| __gap | uint256[50] | 1 | 0 | 1600 | src/bridge/ERC20Inbox.sol:ERC20Inbox | +| _paused | bool | 51 | 0 | 1 | src/bridge/ERC20Inbox.sol:ERC20Inbox | +| __gap | uint256[49] | 52 | 0 | 1568 | src/bridge/ERC20Inbox.sol:ERC20Inbox | +| bridge | contract IBridge | 101 | 0 | 20 | src/bridge/ERC20Inbox.sol:ERC20Inbox | +| sequencerInbox | contract ISequencerInbox | 102 | 0 | 20 | src/bridge/ERC20Inbox.sol:ERC20Inbox | +| allowListEnabled | bool | 102 | 20 | 1 | src/bridge/ERC20Inbox.sol:ERC20Inbox | +| isAllowed | mapping(address => bool) | 103 | 0 | 32 | src/bridge/ERC20Inbox.sol:ERC20Inbox | +| __gap | uint256[47] | 104 | 0 | 1504 | src/bridge/ERC20Inbox.sol:ERC20Inbox | diff --git a/test/storage/ERC20Inbox.dot b/test/storage/ERC20Inbox.dot deleted file mode 100644 index fc90ee0d..00000000 --- a/test/storage/ERC20Inbox.dot +++ /dev/null @@ -1,15 +0,0 @@ - -digraph StorageDiagram { -rankdir=LR -color=black -arrowhead=open -node [shape=record, style=filled, fillcolor=gray95 fontname="Courier New"] -3 [label="ERC20Inbox \<\\>\n | {{ slot| 0 | 1-50 | 51 | 52-100 | 101 | 102 | 103 } | { type: \.variable (bytes) | { unallocated (30) | bool: Initializable._initializing (1) | bool: Initializable._initialized (1) } | { <53> uint256[50]: ContextUpgradeable.__gap (1600) } | { unallocated (31) | bool: PausableUpgradeable._paused (1) } | { <104> uint256[49]: PausableUpgradeable.__gap (1568) } | { unallocated (12) | IBridge: AbsInbox.bridge (20) } | { unallocated (11) | bool: AbsInbox.allowListEnabled (1) | ISequencerInbox: AbsInbox.sequencerInbox (20) } | { mapping\(address=\>bool\): AbsInbox.isAllowed (32) }}}"] - -1 [label="uint256[50]: __gap \<\\>\n | {{ slot| 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 } | { type: variable (bytes) | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) }}}"] - -2 [label="uint256[49]: __gap \<\\>\n | {{ slot| 52 | 53 | 54 | 55 | 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 | 72 | 73 | 74 | 75 | 76 | 77 | 78 | 79 | 80 | 81 | 82 | 83 | 84 | 85 | 86 | 87 | 88 | 89 | 90 | 91 | 92 | 93 | 94 | 95 | 96 | 97 | 98 | 99 | 100 } | { type: variable (bytes) | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) }}}"] - - 3:53 -> 1 - 3:104 -> 2 -} \ No newline at end of file diff --git a/test/storage/ERC20Outbox b/test/storage/ERC20Outbox new file mode 100644 index 00000000..09e2c38c --- /dev/null +++ b/test/storage/ERC20Outbox @@ -0,0 +1,8 @@ +| Name | Type | Slot | Offset | Bytes | Contract | +|---------|--------------------------------|------|--------|-------|----------------------------------------| +| rollup | address | 0 | 0 | 20 | src/bridge/ERC20Outbox.sol:ERC20Outbox | +| bridge | contract IBridge | 1 | 0 | 20 | src/bridge/ERC20Outbox.sol:ERC20Outbox | +| spent | mapping(uint256 => bytes32) | 2 | 0 | 32 | src/bridge/ERC20Outbox.sol:ERC20Outbox | +| roots | mapping(bytes32 => bytes32) | 3 | 0 | 32 | src/bridge/ERC20Outbox.sol:ERC20Outbox | +| context | struct AbsOutbox.L2ToL1Context | 4 | 0 | 128 | src/bridge/ERC20Outbox.sol:ERC20Outbox | +| __gap | uint256[42] | 8 | 0 | 1344 | src/bridge/ERC20Outbox.sol:ERC20Outbox | diff --git a/test/storage/ERC20Outbox.dot b/test/storage/ERC20Outbox.dot deleted file mode 100644 index db69c272..00000000 --- a/test/storage/ERC20Outbox.dot +++ /dev/null @@ -1,12 +0,0 @@ - -digraph StorageDiagram { -rankdir=LR -color=black -arrowhead=open -node [shape=record, style=filled, fillcolor=gray95 fontname="Courier New"] -2 [label="ERC20Outbox \<\\>\n | {{ slot| 0 | 1 | 2 | 3 | 4-7 } | { type: \.variable (bytes) | { unallocated (12) | address: AbsOutbox.rollup (20) } | { unallocated (12) | IBridge: AbsOutbox.bridge (20) } | { mapping\(uint256=\>bytes32\): AbsOutbox.spent (32) } | { mapping\(bytes32=\>bytes32\): AbsOutbox.roots (32) } | { <11> L2ToL1Context: AbsOutbox.context (128) }}}"] - -1 [label="L2ToL1Context \<\\>\n | {{ slot| 4 | 5 | 6 | 7 } | { type: variable (bytes) | { uint128: timestamp (16) | uint128: l2Block (16) } | { bytes32: outputId (32) } | { uint96: l1Block (12) | address: sender (20) } | { uint256: withdrawalAmount (32) }}}"] - - 2:11 -> 1 -} \ No newline at end of file diff --git a/test/storage/Inbox b/test/storage/Inbox new file mode 100644 index 00000000..0551822e --- /dev/null +++ b/test/storage/Inbox @@ -0,0 +1,12 @@ +| Name | Type | Slot | Offset | Bytes | Contract | +|------------------|--------------------------|------|--------|-------|----------------------------| +| _initialized | bool | 0 | 0 | 1 | src/bridge/Inbox.sol:Inbox | +| _initializing | bool | 0 | 1 | 1 | src/bridge/Inbox.sol:Inbox | +| __gap | uint256[50] | 1 | 0 | 1600 | src/bridge/Inbox.sol:Inbox | +| _paused | bool | 51 | 0 | 1 | src/bridge/Inbox.sol:Inbox | +| __gap | uint256[49] | 52 | 0 | 1568 | src/bridge/Inbox.sol:Inbox | +| bridge | contract IBridge | 101 | 0 | 20 | src/bridge/Inbox.sol:Inbox | +| sequencerInbox | contract ISequencerInbox | 102 | 0 | 20 | src/bridge/Inbox.sol:Inbox | +| allowListEnabled | bool | 102 | 20 | 1 | src/bridge/Inbox.sol:Inbox | +| isAllowed | mapping(address => bool) | 103 | 0 | 32 | src/bridge/Inbox.sol:Inbox | +| __gap | uint256[47] | 104 | 0 | 1504 | src/bridge/Inbox.sol:Inbox | diff --git a/test/storage/Inbox.dot b/test/storage/Inbox.dot deleted file mode 100644 index cc97bcc9..00000000 --- a/test/storage/Inbox.dot +++ /dev/null @@ -1,18 +0,0 @@ - -digraph StorageDiagram { -rankdir=LR -color=black -arrowhead=open -node [shape=record, style=filled, fillcolor=gray95 fontname="Courier New"] -4 [label="Inbox \<\\>\n | {{ slot| 0 | 1-50 | 51 | 52-100 | 101 | 102 | 103 | 104-150 } | { type: \.variable (bytes) | { unallocated (30) | bool: Initializable._initializing (1) | bool: Initializable._initialized (1) } | { <53> uint256[50]: ContextUpgradeable.__gap (1600) } | { unallocated (31) | bool: PausableUpgradeable._paused (1) } | { <104> uint256[49]: PausableUpgradeable.__gap (1568) } | { unallocated (12) | IBridge: AbsInbox.bridge (20) } | { unallocated (11) | bool: AbsInbox.allowListEnabled (1) | ISequencerInbox: AbsInbox.sequencerInbox (20) } | { mapping\(address=\>bool\): AbsInbox.isAllowed (32) } | { <156> uint256[47]: AbsInbox.__gap (1504) }}}"] - -1 [label="uint256[50]: __gap \<\\>\n | {{ slot| 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 } | { type: variable (bytes) | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) }}}"] - -2 [label="uint256[49]: __gap \<\\>\n | {{ slot| 52 | 53 | 54 | 55 | 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 | 72 | 73 | 74 | 75 | 76 | 77 | 78 | 79 | 80 | 81 | 82 | 83 | 84 | 85 | 86 | 87 | 88 | 89 | 90 | 91 | 92 | 93 | 94 | 95 | 96 | 97 | 98 | 99 | 100 } | { type: variable (bytes) | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) }}}"] - -3 [label="uint256[47]: __gap \<\\>\n | {{ slot| 104 | 105 | 106 | 107 | 108 | 109 | 110 | 111 | 112 | 113 | 114 | 115 | 116 | 117 | 118 | 119 | 120 | 121 | 122 | 123 | 124 | 125 | 126 | 127 | 128 | 129 | 130 | 131 | 132 | 133 | 134 | 135 | 136 | 137 | 138 | 139 | 140 | 141 | 142 | 143 | 144 | 145 | 146 | 147 | 148 | 149 | 150 } | { type: variable (bytes) | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) }}}"] - - 4:53 -> 1 - 4:104 -> 2 - 4:156 -> 3 -} \ No newline at end of file diff --git a/test/storage/Outbox b/test/storage/Outbox new file mode 100644 index 00000000..d161ae3b --- /dev/null +++ b/test/storage/Outbox @@ -0,0 +1,8 @@ +| Name | Type | Slot | Offset | Bytes | Contract | +|---------|--------------------------------|------|--------|-------|------------------------------| +| rollup | address | 0 | 0 | 20 | src/bridge/Outbox.sol:Outbox | +| bridge | contract IBridge | 1 | 0 | 20 | src/bridge/Outbox.sol:Outbox | +| spent | mapping(uint256 => bytes32) | 2 | 0 | 32 | src/bridge/Outbox.sol:Outbox | +| roots | mapping(bytes32 => bytes32) | 3 | 0 | 32 | src/bridge/Outbox.sol:Outbox | +| context | struct AbsOutbox.L2ToL1Context | 4 | 0 | 128 | src/bridge/Outbox.sol:Outbox | +| __gap | uint256[42] | 8 | 0 | 1344 | src/bridge/Outbox.sol:Outbox | diff --git a/test/storage/Outbox.dot b/test/storage/Outbox.dot deleted file mode 100644 index f2da1fcb..00000000 --- a/test/storage/Outbox.dot +++ /dev/null @@ -1,15 +0,0 @@ - -digraph StorageDiagram { -rankdir=LR -color=black -arrowhead=open -node [shape=record, style=filled, fillcolor=gray95 fontname="Courier New"] -3 [label="Outbox \<\\>\n | {{ slot| 0 | 1 | 2 | 3 | 4-7 | 8-49 } | { type: \.variable (bytes) | { unallocated (12) | address: AbsOutbox.rollup (20) } | { unallocated (12) | IBridge: AbsOutbox.bridge (20) } | { mapping\(uint256=\>bytes32\): AbsOutbox.spent (32) } | { mapping\(bytes32=\>bytes32\): AbsOutbox.roots (32) } | { <11> L2ToL1Context: AbsOutbox.context (128) } | { <54> uint256[42]: AbsOutbox.__gap (1344) }}}"] - -1 [label="L2ToL1Context \<\\>\n | {{ slot| 4 | 5 | 6 | 7 } | { type: variable (bytes) | { uint128: timestamp (16) | uint128: l2Block (16) } | { bytes32: outputId (32) } | { uint96: l1Block (12) | address: sender (20) } | { uint256: withdrawalAmount (32) }}}"] - -2 [label="uint256[42]: __gap \<\\>\n | {{ slot| 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 } | { type: variable (bytes) | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) }}}"] - - 3:11 -> 1 - 3:54 -> 2 -} \ No newline at end of file diff --git a/test/storage/RollupAdminLogic b/test/storage/RollupAdminLogic new file mode 100644 index 00000000..7832c870 --- /dev/null +++ b/test/storage/RollupAdminLogic @@ -0,0 +1,38 @@ +| Name | Type | Slot | Offset | Bytes | Contract | +|----------------------------|-----------------------------------------------|------|--------|-------|--------------------------------------------------| +| _initialized | bool | 0 | 0 | 1 | src/rollup/RollupAdminLogic.sol:RollupAdminLogic | +| _initializing | bool | 0 | 1 | 1 | src/rollup/RollupAdminLogic.sol:RollupAdminLogic | +| __gap | uint256[50] | 1 | 0 | 1600 | src/rollup/RollupAdminLogic.sol:RollupAdminLogic | +| _paused | bool | 51 | 0 | 1 | src/rollup/RollupAdminLogic.sol:RollupAdminLogic | +| __gap | uint256[49] | 52 | 0 | 1568 | src/rollup/RollupAdminLogic.sol:RollupAdminLogic | +| confirmPeriodBlocks | uint64 | 101 | 0 | 8 | src/rollup/RollupAdminLogic.sol:RollupAdminLogic | +| extraChallengeTimeBlocks | uint64 | 101 | 8 | 8 | src/rollup/RollupAdminLogic.sol:RollupAdminLogic | +| chainId | uint256 | 102 | 0 | 32 | src/rollup/RollupAdminLogic.sol:RollupAdminLogic | +| baseStake | uint256 | 103 | 0 | 32 | src/rollup/RollupAdminLogic.sol:RollupAdminLogic | +| wasmModuleRoot | bytes32 | 104 | 0 | 32 | src/rollup/RollupAdminLogic.sol:RollupAdminLogic | +| inbox | contract IInboxBase | 105 | 0 | 20 | src/rollup/RollupAdminLogic.sol:RollupAdminLogic | +| bridge | contract IBridge | 106 | 0 | 20 | src/rollup/RollupAdminLogic.sol:RollupAdminLogic | +| outbox | contract IOutbox | 107 | 0 | 20 | src/rollup/RollupAdminLogic.sol:RollupAdminLogic | +| sequencerInbox | contract ISequencerInbox | 108 | 0 | 20 | src/rollup/RollupAdminLogic.sol:RollupAdminLogic | +| rollupEventInbox | contract IRollupEventInbox | 109 | 0 | 20 | src/rollup/RollupAdminLogic.sol:RollupAdminLogic | +| challengeManager | contract IChallengeManager | 110 | 0 | 20 | src/rollup/RollupAdminLogic.sol:RollupAdminLogic | +| validatorUtils | address | 111 | 0 | 20 | src/rollup/RollupAdminLogic.sol:RollupAdminLogic | +| validatorWalletCreator | address | 112 | 0 | 20 | src/rollup/RollupAdminLogic.sol:RollupAdminLogic | +| loserStakeEscrow | address | 113 | 0 | 20 | src/rollup/RollupAdminLogic.sol:RollupAdminLogic | +| stakeToken | address | 114 | 0 | 20 | src/rollup/RollupAdminLogic.sol:RollupAdminLogic | +| minimumAssertionPeriod | uint256 | 115 | 0 | 32 | src/rollup/RollupAdminLogic.sol:RollupAdminLogic | +| isValidator | mapping(address => bool) | 116 | 0 | 32 | src/rollup/RollupAdminLogic.sol:RollupAdminLogic | +| _latestConfirmed | uint64 | 117 | 0 | 8 | src/rollup/RollupAdminLogic.sol:RollupAdminLogic | +| _firstUnresolvedNode | uint64 | 117 | 8 | 8 | src/rollup/RollupAdminLogic.sol:RollupAdminLogic | +| _latestNodeCreated | uint64 | 117 | 16 | 8 | src/rollup/RollupAdminLogic.sol:RollupAdminLogic | +| _lastStakeBlock | uint64 | 117 | 24 | 8 | src/rollup/RollupAdminLogic.sol:RollupAdminLogic | +| _nodes | mapping(uint64 => struct Node) | 118 | 0 | 32 | src/rollup/RollupAdminLogic.sol:RollupAdminLogic | +| _nodeStakers | mapping(uint64 => mapping(address => bool)) | 119 | 0 | 32 | src/rollup/RollupAdminLogic.sol:RollupAdminLogic | +| _stakerList | address[] | 120 | 0 | 32 | src/rollup/RollupAdminLogic.sol:RollupAdminLogic | +| _stakerMap | mapping(address => struct IRollupCore.Staker) | 121 | 0 | 32 | src/rollup/RollupAdminLogic.sol:RollupAdminLogic | +| _zombies | struct RollupCore.Zombie[] | 122 | 0 | 32 | src/rollup/RollupAdminLogic.sol:RollupAdminLogic | +| _withdrawableFunds | mapping(address => uint256) | 123 | 0 | 32 | src/rollup/RollupAdminLogic.sol:RollupAdminLogic | +| totalWithdrawableFunds | uint256 | 124 | 0 | 32 | src/rollup/RollupAdminLogic.sol:RollupAdminLogic | +| rollupDeploymentBlock | uint256 | 125 | 0 | 32 | src/rollup/RollupAdminLogic.sol:RollupAdminLogic | +| validatorWhitelistDisabled | bool | 126 | 0 | 1 | src/rollup/RollupAdminLogic.sol:RollupAdminLogic | +| _nodeCreatedAtArbSysBlock | mapping(uint64 => uint256) | 127 | 0 | 32 | src/rollup/RollupAdminLogic.sol:RollupAdminLogic | diff --git a/test/storage/RollupAdminLogic.dot b/test/storage/RollupAdminLogic.dot deleted file mode 100644 index 7dad73f2..00000000 --- a/test/storage/RollupAdminLogic.dot +++ /dev/null @@ -1,30 +0,0 @@ - -digraph StorageDiagram { -rankdir=LR -color=black -arrowhead=open -node [shape=record, style=filled, fillcolor=gray95 fontname="Courier New"] -8 [label="RollupAdminLogic \<\\>\n | {{ slot| 0 | 1-50 | 51 | 52-100 | 101 | 102 | 103 | 104 | 105 | 106 | 107 | 108 | 109 | 110 | 111 | 112 | 113 | 114 | 115 | 116 | 117 | 118 | 119 | 120 | 121 | 122 | 123 | 124 | 125 | 126 | 127 } | { type: \.variable (bytes) | { unallocated (30) | bool: Initializable._initializing (1) | bool: Initializable._initialized (1) } | { <53> uint256[50]: ContextUpgradeable.__gap (1600) } | { unallocated (31) | bool: PausableUpgradeable._paused (1) } | { <104> uint256[49]: PausableUpgradeable.__gap (1568) } | { unallocated (16) | uint64: RollupCore.extraChallengeTimeBlocks (8) | uint64: RollupCore.confirmPeriodBlocks (8) } | { uint256: RollupCore.chainId (32) } | { uint256: RollupCore.baseStake (32) } | { bytes32: RollupCore.wasmModuleRoot (32) } | { unallocated (12) | IInboxBase: RollupCore.inbox (20) } | { unallocated (12) | IBridge: RollupCore.bridge (20) } | { unallocated (12) | IOutbox: RollupCore.outbox (20) } | { unallocated (12) | ISequencerInbox: RollupCore.sequencerInbox (20) } | { unallocated (12) | IRollupEventInbox: RollupCore.rollupEventInbox (20) } | { unallocated (12) | IChallengeManager: RollupCore.challengeManager (20) } | { unallocated (12) | address: RollupCore.validatorUtils (20) } | { unallocated (12) | address: RollupCore.validatorWalletCreator (20) } | { unallocated (12) | address: RollupCore.loserStakeEscrow (20) } | { unallocated (12) | address: RollupCore.stakeToken (20) } | { uint256: RollupCore.minimumAssertionPeriod (32) } | { mapping\(address=\>bool\): RollupCore.isValidator (32) } | { uint64: RollupCore._lastStakeBlock (8) | uint64: RollupCore._latestNodeCreated (8) | uint64: RollupCore._firstUnresolvedNode (8) | uint64: RollupCore._latestConfirmed (8) } | { <138> mapping\(uint64=\>Node\): RollupCore._nodes (32) } | { mapping\(uint64=\>mapping\(address=\>bool\)\): RollupCore._nodeStakers (32) } | { <141> address[]: RollupCore._stakerList (32) } | { <147> mapping\(address=\>Staker\): RollupCore._stakerMap (32) } | { <151> Zombie[]: RollupCore._zombies (32) } | { mapping\(address=\>uint256\): RollupCore._withdrawableFunds (32) } | { uint256: RollupCore.totalWithdrawableFunds (32) } | { uint256: RollupCore.rollupDeploymentBlock (32) } | { unallocated (31) | bool: RollupCore.validatorWhitelistDisabled (1) } | { mapping\(uint64=\>uint256\): RollupCore._nodeCreatedAtArbSysBlock (32) }}}"] - -1 [label="uint256[50]: __gap \<\\>\n | {{ slot| 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 } | { type: variable (bytes) | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) }}}"] - -2 [label="uint256[49]: __gap \<\\>\n | {{ slot| 52 | 53 | 54 | 55 | 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 | 72 | 73 | 74 | 75 | 76 | 77 | 78 | 79 | 80 | 81 | 82 | 83 | 84 | 85 | 86 | 87 | 88 | 89 | 90 | 91 | 92 | 93 | 94 | 95 | 96 | 97 | 98 | 99 | 100 } | { type: variable (bytes) | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) }}}"] - -3 [label="Node \<\\>\n | {{ slot| 0 | 1 | 2 | 3 | 4 | 5 } | { type: variable (bytes) | { bytes32: stateHash (32) } | { bytes32: challengeHash (32) } | { bytes32: confirmData (32) } | { uint64: stakerCount (8) | uint64: noChildConfirmedBeforeBlock (8) | uint64: deadlineBlock (8) | uint64: prevNum (8) } | { uint64: createdAtBlock (8) | uint64: latestChildNumber (8) | uint64: firstChildBlock (8) | uint64: childStakerCount (8) } | { bytes32: nodeHash (32) }}}"] - -4 [label="address[]: _stakerList \<\\>\n0x315040cf50a9fea58aa3302eb9bbbb1153c7ed7311c4e1c76711b1190d535025 | {{ slot| 0 } | { type: variable (bytes) | { unallocated (12) | address (20) }}}"] - -5 [label="Staker \<\\>\n | {{ slot| 0 | 1 } | { type: variable (bytes) | { uint256: amountStaked (32) } | { unallocated (7) | bool: isStaked (1) | uint64: currentChallenge (8) | uint64: latestStakedNode (8) | uint64: index (8) }}}"] - -6 [label="Zombie \<\\>\n | {{ slot| 0 } | { type: variable (bytes) | { unallocated (4) | uint64: latestStakedNode (8) | address: stakerAddress (20) }}}"] - -7 [label="Zombie[]: _zombies \<\\>\n0x8e4a4be60bf9672655845da331c63e49fa2a771e90e72dc554369cbb34aae7b8 | {{ slot| 0 } | { type: variable (bytes) | { <148> Zombie (32) }}}"] - - 8:53 -> 1 - 8:104 -> 2 - 8:138 -> 3 - 8:141 -> 4 - 8:147 -> 5 - 8:151 -> 7 - 7:148 -> 6 -} \ No newline at end of file diff --git a/test/storage/RollupCore b/test/storage/RollupCore new file mode 100644 index 00000000..4480b0cc --- /dev/null +++ b/test/storage/RollupCore @@ -0,0 +1,38 @@ +| Name | Type | Slot | Offset | Bytes | Contract | +|----------------------------|-----------------------------------------------|------|--------|-------|--------------------------------------| +| _initialized | bool | 0 | 0 | 1 | src/rollup/RollupCore.sol:RollupCore | +| _initializing | bool | 0 | 1 | 1 | src/rollup/RollupCore.sol:RollupCore | +| __gap | uint256[50] | 1 | 0 | 1600 | src/rollup/RollupCore.sol:RollupCore | +| _paused | bool | 51 | 0 | 1 | src/rollup/RollupCore.sol:RollupCore | +| __gap | uint256[49] | 52 | 0 | 1568 | src/rollup/RollupCore.sol:RollupCore | +| confirmPeriodBlocks | uint64 | 101 | 0 | 8 | src/rollup/RollupCore.sol:RollupCore | +| extraChallengeTimeBlocks | uint64 | 101 | 8 | 8 | src/rollup/RollupCore.sol:RollupCore | +| chainId | uint256 | 102 | 0 | 32 | src/rollup/RollupCore.sol:RollupCore | +| baseStake | uint256 | 103 | 0 | 32 | src/rollup/RollupCore.sol:RollupCore | +| wasmModuleRoot | bytes32 | 104 | 0 | 32 | src/rollup/RollupCore.sol:RollupCore | +| inbox | contract IInboxBase | 105 | 0 | 20 | src/rollup/RollupCore.sol:RollupCore | +| bridge | contract IBridge | 106 | 0 | 20 | src/rollup/RollupCore.sol:RollupCore | +| outbox | contract IOutbox | 107 | 0 | 20 | src/rollup/RollupCore.sol:RollupCore | +| sequencerInbox | contract ISequencerInbox | 108 | 0 | 20 | src/rollup/RollupCore.sol:RollupCore | +| rollupEventInbox | contract IRollupEventInbox | 109 | 0 | 20 | src/rollup/RollupCore.sol:RollupCore | +| challengeManager | contract IChallengeManager | 110 | 0 | 20 | src/rollup/RollupCore.sol:RollupCore | +| validatorUtils | address | 111 | 0 | 20 | src/rollup/RollupCore.sol:RollupCore | +| validatorWalletCreator | address | 112 | 0 | 20 | src/rollup/RollupCore.sol:RollupCore | +| loserStakeEscrow | address | 113 | 0 | 20 | src/rollup/RollupCore.sol:RollupCore | +| stakeToken | address | 114 | 0 | 20 | src/rollup/RollupCore.sol:RollupCore | +| minimumAssertionPeriod | uint256 | 115 | 0 | 32 | src/rollup/RollupCore.sol:RollupCore | +| isValidator | mapping(address => bool) | 116 | 0 | 32 | src/rollup/RollupCore.sol:RollupCore | +| _latestConfirmed | uint64 | 117 | 0 | 8 | src/rollup/RollupCore.sol:RollupCore | +| _firstUnresolvedNode | uint64 | 117 | 8 | 8 | src/rollup/RollupCore.sol:RollupCore | +| _latestNodeCreated | uint64 | 117 | 16 | 8 | src/rollup/RollupCore.sol:RollupCore | +| _lastStakeBlock | uint64 | 117 | 24 | 8 | src/rollup/RollupCore.sol:RollupCore | +| _nodes | mapping(uint64 => struct Node) | 118 | 0 | 32 | src/rollup/RollupCore.sol:RollupCore | +| _nodeStakers | mapping(uint64 => mapping(address => bool)) | 119 | 0 | 32 | src/rollup/RollupCore.sol:RollupCore | +| _stakerList | address[] | 120 | 0 | 32 | src/rollup/RollupCore.sol:RollupCore | +| _stakerMap | mapping(address => struct IRollupCore.Staker) | 121 | 0 | 32 | src/rollup/RollupCore.sol:RollupCore | +| _zombies | struct RollupCore.Zombie[] | 122 | 0 | 32 | src/rollup/RollupCore.sol:RollupCore | +| _withdrawableFunds | mapping(address => uint256) | 123 | 0 | 32 | src/rollup/RollupCore.sol:RollupCore | +| totalWithdrawableFunds | uint256 | 124 | 0 | 32 | src/rollup/RollupCore.sol:RollupCore | +| rollupDeploymentBlock | uint256 | 125 | 0 | 32 | src/rollup/RollupCore.sol:RollupCore | +| validatorWhitelistDisabled | bool | 126 | 0 | 1 | src/rollup/RollupCore.sol:RollupCore | +| _nodeCreatedAtArbSysBlock | mapping(uint64 => uint256) | 127 | 0 | 32 | src/rollup/RollupCore.sol:RollupCore | diff --git a/test/storage/RollupCore.dot b/test/storage/RollupCore.dot deleted file mode 100644 index 2307dcc5..00000000 --- a/test/storage/RollupCore.dot +++ /dev/null @@ -1,30 +0,0 @@ - -digraph StorageDiagram { -rankdir=LR -color=black -arrowhead=open -node [shape=record, style=filled, fillcolor=gray95 fontname="Courier New"] -8 [label="RollupCore \<\\>\n | {{ slot| 0 | 1-50 | 51 | 52-100 | 101 | 102 | 103 | 104 | 105 | 106 | 107 | 108 | 109 | 110 | 111 | 112 | 113 | 114 | 115 | 116 | 117 | 118 | 119 | 120 | 121 | 122 | 123 | 124 | 125 | 126 | 127 } | { type: \.variable (bytes) | { unallocated (30) | bool: Initializable._initializing (1) | bool: Initializable._initialized (1) } | { <53> uint256[50]: ContextUpgradeable.__gap (1600) } | { unallocated (31) | bool: PausableUpgradeable._paused (1) } | { <104> uint256[49]: PausableUpgradeable.__gap (1568) } | { unallocated (16) | uint64: extraChallengeTimeBlocks (8) | uint64: confirmPeriodBlocks (8) } | { uint256: chainId (32) } | { uint256: baseStake (32) } | { bytes32: wasmModuleRoot (32) } | { unallocated (12) | IInboxBase: inbox (20) } | { unallocated (12) | IBridge: bridge (20) } | { unallocated (12) | IOutbox: outbox (20) } | { unallocated (12) | ISequencerInbox: sequencerInbox (20) } | { unallocated (12) | IRollupEventInbox: rollupEventInbox (20) } | { unallocated (12) | IChallengeManager: challengeManager (20) } | { unallocated (12) | address: validatorUtils (20) } | { unallocated (12) | address: validatorWalletCreator (20) } | { unallocated (12) | address: loserStakeEscrow (20) } | { unallocated (12) | address: stakeToken (20) } | { uint256: minimumAssertionPeriod (32) } | { mapping\(address=\>bool\): isValidator (32) } | { uint64: _lastStakeBlock (8) | uint64: _latestNodeCreated (8) | uint64: _firstUnresolvedNode (8) | uint64: _latestConfirmed (8) } | { <138> mapping\(uint64=\>Node\): _nodes (32) } | { mapping\(uint64=\>mapping\(address=\>bool\)\): _nodeStakers (32) } | { <141> address[]: _stakerList (32) } | { <147> mapping\(address=\>Staker\): _stakerMap (32) } | { <151> Zombie[]: _zombies (32) } | { mapping\(address=\>uint256\): _withdrawableFunds (32) } | { uint256: totalWithdrawableFunds (32) } | { uint256: rollupDeploymentBlock (32) } | { unallocated (31) | bool: validatorWhitelistDisabled (1) } | { mapping\(uint64=\>uint256\): _nodeCreatedAtArbSysBlock (32) }}}"] - -1 [label="uint256[50]: __gap \<\\>\n | {{ slot| 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 } | { type: variable (bytes) | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) }}}"] - -2 [label="uint256[49]: __gap \<\\>\n | {{ slot| 52 | 53 | 54 | 55 | 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 | 72 | 73 | 74 | 75 | 76 | 77 | 78 | 79 | 80 | 81 | 82 | 83 | 84 | 85 | 86 | 87 | 88 | 89 | 90 | 91 | 92 | 93 | 94 | 95 | 96 | 97 | 98 | 99 | 100 } | { type: variable (bytes) | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) }}}"] - -3 [label="Node \<\\>\n | {{ slot| 0 | 1 | 2 | 3 | 4 | 5 } | { type: variable (bytes) | { bytes32: stateHash (32) } | { bytes32: challengeHash (32) } | { bytes32: confirmData (32) } | { uint64: stakerCount (8) | uint64: noChildConfirmedBeforeBlock (8) | uint64: deadlineBlock (8) | uint64: prevNum (8) } | { uint64: createdAtBlock (8) | uint64: latestChildNumber (8) | uint64: firstChildBlock (8) | uint64: childStakerCount (8) } | { bytes32: nodeHash (32) }}}"] - -4 [label="address[]: _stakerList \<\\>\n0x315040cf50a9fea58aa3302eb9bbbb1153c7ed7311c4e1c76711b1190d535025 | {{ slot| 0 } | { type: variable (bytes) | { unallocated (12) | address (20) }}}"] - -5 [label="Staker \<\\>\n | {{ slot| 0 | 1 } | { type: variable (bytes) | { uint256: amountStaked (32) } | { unallocated (7) | bool: isStaked (1) | uint64: currentChallenge (8) | uint64: latestStakedNode (8) | uint64: index (8) }}}"] - -6 [label="Zombie \<\\>\n | {{ slot| 0 } | { type: variable (bytes) | { unallocated (4) | uint64: latestStakedNode (8) | address: stakerAddress (20) }}}"] - -7 [label="Zombie[]: _zombies \<\\>\n0x8e4a4be60bf9672655845da331c63e49fa2a771e90e72dc554369cbb34aae7b8 | {{ slot| 0 } | { type: variable (bytes) | { <148> Zombie (32) }}}"] - - 8:53 -> 1 - 8:104 -> 2 - 8:138 -> 3 - 8:141 -> 4 - 8:147 -> 5 - 8:151 -> 7 - 7:148 -> 6 -} \ No newline at end of file diff --git a/test/storage/RollupUserLogic b/test/storage/RollupUserLogic new file mode 100644 index 00000000..27139d25 --- /dev/null +++ b/test/storage/RollupUserLogic @@ -0,0 +1,38 @@ +| Name | Type | Slot | Offset | Bytes | Contract | +|----------------------------|-----------------------------------------------|------|--------|-------|------------------------------------------------| +| _initialized | bool | 0 | 0 | 1 | src/rollup/RollupUserLogic.sol:RollupUserLogic | +| _initializing | bool | 0 | 1 | 1 | src/rollup/RollupUserLogic.sol:RollupUserLogic | +| __gap | uint256[50] | 1 | 0 | 1600 | src/rollup/RollupUserLogic.sol:RollupUserLogic | +| _paused | bool | 51 | 0 | 1 | src/rollup/RollupUserLogic.sol:RollupUserLogic | +| __gap | uint256[49] | 52 | 0 | 1568 | src/rollup/RollupUserLogic.sol:RollupUserLogic | +| confirmPeriodBlocks | uint64 | 101 | 0 | 8 | src/rollup/RollupUserLogic.sol:RollupUserLogic | +| extraChallengeTimeBlocks | uint64 | 101 | 8 | 8 | src/rollup/RollupUserLogic.sol:RollupUserLogic | +| chainId | uint256 | 102 | 0 | 32 | src/rollup/RollupUserLogic.sol:RollupUserLogic | +| baseStake | uint256 | 103 | 0 | 32 | src/rollup/RollupUserLogic.sol:RollupUserLogic | +| wasmModuleRoot | bytes32 | 104 | 0 | 32 | src/rollup/RollupUserLogic.sol:RollupUserLogic | +| inbox | contract IInboxBase | 105 | 0 | 20 | src/rollup/RollupUserLogic.sol:RollupUserLogic | +| bridge | contract IBridge | 106 | 0 | 20 | src/rollup/RollupUserLogic.sol:RollupUserLogic | +| outbox | contract IOutbox | 107 | 0 | 20 | src/rollup/RollupUserLogic.sol:RollupUserLogic | +| sequencerInbox | contract ISequencerInbox | 108 | 0 | 20 | src/rollup/RollupUserLogic.sol:RollupUserLogic | +| rollupEventInbox | contract IRollupEventInbox | 109 | 0 | 20 | src/rollup/RollupUserLogic.sol:RollupUserLogic | +| challengeManager | contract IChallengeManager | 110 | 0 | 20 | src/rollup/RollupUserLogic.sol:RollupUserLogic | +| validatorUtils | address | 111 | 0 | 20 | src/rollup/RollupUserLogic.sol:RollupUserLogic | +| validatorWalletCreator | address | 112 | 0 | 20 | src/rollup/RollupUserLogic.sol:RollupUserLogic | +| loserStakeEscrow | address | 113 | 0 | 20 | src/rollup/RollupUserLogic.sol:RollupUserLogic | +| stakeToken | address | 114 | 0 | 20 | src/rollup/RollupUserLogic.sol:RollupUserLogic | +| minimumAssertionPeriod | uint256 | 115 | 0 | 32 | src/rollup/RollupUserLogic.sol:RollupUserLogic | +| isValidator | mapping(address => bool) | 116 | 0 | 32 | src/rollup/RollupUserLogic.sol:RollupUserLogic | +| _latestConfirmed | uint64 | 117 | 0 | 8 | src/rollup/RollupUserLogic.sol:RollupUserLogic | +| _firstUnresolvedNode | uint64 | 117 | 8 | 8 | src/rollup/RollupUserLogic.sol:RollupUserLogic | +| _latestNodeCreated | uint64 | 117 | 16 | 8 | src/rollup/RollupUserLogic.sol:RollupUserLogic | +| _lastStakeBlock | uint64 | 117 | 24 | 8 | src/rollup/RollupUserLogic.sol:RollupUserLogic | +| _nodes | mapping(uint64 => struct Node) | 118 | 0 | 32 | src/rollup/RollupUserLogic.sol:RollupUserLogic | +| _nodeStakers | mapping(uint64 => mapping(address => bool)) | 119 | 0 | 32 | src/rollup/RollupUserLogic.sol:RollupUserLogic | +| _stakerList | address[] | 120 | 0 | 32 | src/rollup/RollupUserLogic.sol:RollupUserLogic | +| _stakerMap | mapping(address => struct IRollupCore.Staker) | 121 | 0 | 32 | src/rollup/RollupUserLogic.sol:RollupUserLogic | +| _zombies | struct RollupCore.Zombie[] | 122 | 0 | 32 | src/rollup/RollupUserLogic.sol:RollupUserLogic | +| _withdrawableFunds | mapping(address => uint256) | 123 | 0 | 32 | src/rollup/RollupUserLogic.sol:RollupUserLogic | +| totalWithdrawableFunds | uint256 | 124 | 0 | 32 | src/rollup/RollupUserLogic.sol:RollupUserLogic | +| rollupDeploymentBlock | uint256 | 125 | 0 | 32 | src/rollup/RollupUserLogic.sol:RollupUserLogic | +| validatorWhitelistDisabled | bool | 126 | 0 | 1 | src/rollup/RollupUserLogic.sol:RollupUserLogic | +| _nodeCreatedAtArbSysBlock | mapping(uint64 => uint256) | 127 | 0 | 32 | src/rollup/RollupUserLogic.sol:RollupUserLogic | diff --git a/test/storage/RollupUserLogic.dot b/test/storage/RollupUserLogic.dot deleted file mode 100644 index bd7576a3..00000000 --- a/test/storage/RollupUserLogic.dot +++ /dev/null @@ -1,30 +0,0 @@ - -digraph StorageDiagram { -rankdir=LR -color=black -arrowhead=open -node [shape=record, style=filled, fillcolor=gray95 fontname="Courier New"] -8 [label="RollupUserLogic \<\\>\n | {{ slot| 0 | 1-50 | 51 | 52-100 | 101 | 102 | 103 | 104 | 105 | 106 | 107 | 108 | 109 | 110 | 111 | 112 | 113 | 114 | 115 | 116 | 117 | 118 | 119 | 120 | 121 | 122 | 123 | 124 | 125 | 126 | 127 } | { type: \.variable (bytes) | { unallocated (30) | bool: Initializable._initializing (1) | bool: Initializable._initialized (1) } | { <53> uint256[50]: ContextUpgradeable.__gap (1600) } | { unallocated (31) | bool: PausableUpgradeable._paused (1) } | { <104> uint256[49]: PausableUpgradeable.__gap (1568) } | { unallocated (16) | uint64: RollupCore.extraChallengeTimeBlocks (8) | uint64: RollupCore.confirmPeriodBlocks (8) } | { uint256: RollupCore.chainId (32) } | { uint256: RollupCore.baseStake (32) } | { bytes32: RollupCore.wasmModuleRoot (32) } | { unallocated (12) | IInboxBase: RollupCore.inbox (20) } | { unallocated (12) | IBridge: RollupCore.bridge (20) } | { unallocated (12) | IOutbox: RollupCore.outbox (20) } | { unallocated (12) | ISequencerInbox: RollupCore.sequencerInbox (20) } | { unallocated (12) | IRollupEventInbox: RollupCore.rollupEventInbox (20) } | { unallocated (12) | IChallengeManager: RollupCore.challengeManager (20) } | { unallocated (12) | address: RollupCore.validatorUtils (20) } | { unallocated (12) | address: RollupCore.validatorWalletCreator (20) } | { unallocated (12) | address: RollupCore.loserStakeEscrow (20) } | { unallocated (12) | address: RollupCore.stakeToken (20) } | { uint256: RollupCore.minimumAssertionPeriod (32) } | { mapping\(address=\>bool\): RollupCore.isValidator (32) } | { uint64: RollupCore._lastStakeBlock (8) | uint64: RollupCore._latestNodeCreated (8) | uint64: RollupCore._firstUnresolvedNode (8) | uint64: RollupCore._latestConfirmed (8) } | { <138> mapping\(uint64=\>Node\): RollupCore._nodes (32) } | { mapping\(uint64=\>mapping\(address=\>bool\)\): RollupCore._nodeStakers (32) } | { <141> address[]: RollupCore._stakerList (32) } | { <147> mapping\(address=\>Staker\): RollupCore._stakerMap (32) } | { <151> Zombie[]: RollupCore._zombies (32) } | { mapping\(address=\>uint256\): RollupCore._withdrawableFunds (32) } | { uint256: RollupCore.totalWithdrawableFunds (32) } | { uint256: RollupCore.rollupDeploymentBlock (32) } | { unallocated (31) | bool: RollupCore.validatorWhitelistDisabled (1) } | { mapping\(uint64=\>uint256\): RollupCore._nodeCreatedAtArbSysBlock (32) }}}"] - -1 [label="uint256[50]: __gap \<\\>\n | {{ slot| 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 } | { type: variable (bytes) | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) }}}"] - -2 [label="uint256[49]: __gap \<\\>\n | {{ slot| 52 | 53 | 54 | 55 | 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 | 72 | 73 | 74 | 75 | 76 | 77 | 78 | 79 | 80 | 81 | 82 | 83 | 84 | 85 | 86 | 87 | 88 | 89 | 90 | 91 | 92 | 93 | 94 | 95 | 96 | 97 | 98 | 99 | 100 } | { type: variable (bytes) | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) }}}"] - -3 [label="Node \<\\>\n | {{ slot| 0 | 1 | 2 | 3 | 4 | 5 } | { type: variable (bytes) | { bytes32: stateHash (32) } | { bytes32: challengeHash (32) } | { bytes32: confirmData (32) } | { uint64: stakerCount (8) | uint64: noChildConfirmedBeforeBlock (8) | uint64: deadlineBlock (8) | uint64: prevNum (8) } | { uint64: createdAtBlock (8) | uint64: latestChildNumber (8) | uint64: firstChildBlock (8) | uint64: childStakerCount (8) } | { bytes32: nodeHash (32) }}}"] - -4 [label="address[]: _stakerList \<\\>\n0x315040cf50a9fea58aa3302eb9bbbb1153c7ed7311c4e1c76711b1190d535025 | {{ slot| 0 } | { type: variable (bytes) | { unallocated (12) | address (20) }}}"] - -5 [label="Staker \<\\>\n | {{ slot| 0 | 1 } | { type: variable (bytes) | { uint256: amountStaked (32) } | { unallocated (7) | bool: isStaked (1) | uint64: currentChallenge (8) | uint64: latestStakedNode (8) | uint64: index (8) }}}"] - -6 [label="Zombie \<\\>\n | {{ slot| 0 } | { type: variable (bytes) | { unallocated (4) | uint64: latestStakedNode (8) | address: stakerAddress (20) }}}"] - -7 [label="Zombie[]: _zombies \<\\>\n0x8e4a4be60bf9672655845da331c63e49fa2a771e90e72dc554369cbb34aae7b8 | {{ slot| 0 } | { type: variable (bytes) | { <148> Zombie (32) }}}"] - - 8:53 -> 1 - 8:104 -> 2 - 8:138 -> 3 - 8:141 -> 4 - 8:147 -> 5 - 8:151 -> 7 - 7:148 -> 6 -} \ No newline at end of file diff --git a/test/storage/SequencerInbox b/test/storage/SequencerInbox new file mode 100644 index 00000000..252f7297 --- /dev/null +++ b/test/storage/SequencerInbox @@ -0,0 +1,9 @@ +| Name | Type | Slot | Offset | Bytes | Contract | +|--------------------------|----------------------------------------------------------|------|--------|-------|----------------------------------------------| +| totalDelayedMessagesRead | uint256 | 0 | 0 | 32 | src/bridge/SequencerInbox.sol:SequencerInbox | +| bridge | contract IBridge | 1 | 0 | 20 | src/bridge/SequencerInbox.sol:SequencerInbox | +| rollup | contract IOwnable | 2 | 0 | 20 | src/bridge/SequencerInbox.sol:SequencerInbox | +| isBatchPoster | mapping(address => bool) | 3 | 0 | 32 | src/bridge/SequencerInbox.sol:SequencerInbox | +| maxTimeVariation | struct ISequencerInbox.MaxTimeVariation | 4 | 0 | 128 | src/bridge/SequencerInbox.sol:SequencerInbox | +| dasKeySetInfo | mapping(bytes32 => struct ISequencerInbox.DasKeySetInfo) | 8 | 0 | 32 | src/bridge/SequencerInbox.sol:SequencerInbox | +| isSequencer | mapping(address => bool) | 9 | 0 | 32 | src/bridge/SequencerInbox.sol:SequencerInbox | diff --git a/test/storage/SequencerInbox.dot b/test/storage/SequencerInbox.dot deleted file mode 100644 index f9ea05ab..00000000 --- a/test/storage/SequencerInbox.dot +++ /dev/null @@ -1,15 +0,0 @@ - -digraph StorageDiagram { -rankdir=LR -color=black -arrowhead=open -node [shape=record, style=filled, fillcolor=gray95 fontname="Courier New"] -3 [label="SequencerInbox \<\\>\n | {{ slot| 0 | 1 | 2 | 3 | 4-7 | 8 | 9 } | { type: \.variable (bytes) | { uint256: totalDelayedMessagesRead (32) } | { unallocated (12) | IBridge: bridge (20) } | { unallocated (12) | IOwnable: rollup (20) } | { mapping\(address=\>bool\): isBatchPoster (32) } | { <9> ISequencerInbox.MaxTimeVariation: maxTimeVariation (128) } | { <12> mapping\(bytes32=\>DasKeySetInfo\): dasKeySetInfo (32) } | { mapping\(address=\>bool\): isSequencer (32) }}}"] - -1 [label="ISequencerInbox.MaxTimeVariation \<\\>\n | {{ slot| 4 | 5 | 6 | 7 } | { type: variable (bytes) | { uint256: MaxTimeVariation.delayBlocks (32) } | { uint256: MaxTimeVariation.futureBlocks (32) } | { uint256: MaxTimeVariation.delaySeconds (32) } | { uint256: MaxTimeVariation.futureSeconds (32) }}}"] - -2 [label="DasKeySetInfo \<\\>\n | {{ slot| 0 } | { type: variable (bytes) | { unallocated (23) | uint64: creationBlock (8) | bool: isValidKeyset (1) }}}"] - - 3:9 -> 1 - 3:12 -> 2 -} \ No newline at end of file diff --git a/test/storage/test.bash b/test/storage/test.bash index 98a9e566..562deb0f 100755 --- a/test/storage/test.bash +++ b/test/storage/test.bash @@ -1,10 +1,11 @@ #!/bin/bash -for CONTRACTNAME in Bridge Inbox Outbox RollupCore RollupUserLogic RollupAdminLogic SequencerInbox ChallengeManager +output_dir="./test/storage" +for CONTRACTNAME in Bridge Inbox Outbox RollupCore RollupUserLogic RollupAdminLogic SequencerInbox ChallengeManager ERC20Bridge ERC20Inbox ERC20Outbox do echo "Checking storage change of $CONTRACTNAME" - [ -f "./test/storage/$CONTRACTNAME.dot" ] && mv "./test/storage/$CONTRACTNAME.dot" "./test/storage/$CONTRACTNAME-old.dot" - yarn sol2uml storage ./ -c "$CONTRACTNAME" -o "./test/storage/$CONTRACTNAME.dot" -f dot - diff "./test/storage/$CONTRACTNAME-old.dot" "./test/storage/$CONTRACTNAME.dot" + [ -f "$output_dir/$CONTRACTNAME" ] && mv "$output_dir/$CONTRACTNAME" "$output_dir/$CONTRACTNAME-old" + forge inspect "$CONTRACTNAME" --pretty storage > "$output_dir/$CONTRACTNAME" + diff "$output_dir/$CONTRACTNAME-old" "$output_dir/$CONTRACTNAME" if [[ $? != "0" ]] then CHANGED=1 From b5054fca37666535786746543b9172a80c2e7816 Mon Sep 17 00:00:00 2001 From: Goran Vladika Date: Thu, 26 Oct 2023 14:36:00 +0200 Subject: [PATCH 218/292] Install FOundry and build contracts --- .github/workflows/contract-tests.yml | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/.github/workflows/contract-tests.yml b/.github/workflows/contract-tests.yml index 0048c6d8..5a940cfd 100644 --- a/.github/workflows/contract-tests.yml +++ b/.github/workflows/contract-tests.yml @@ -52,6 +52,11 @@ jobs: cache: 'yarn' cache-dependency-path: '**/yarn.lock' + - name: Install Foundry + uses: foundry-rs/foundry-toolchain@v1 + with: + version: nightly + - name: Install dependencies run: yarn install @@ -70,6 +75,9 @@ jobs: - name: Interface compatibility run: yarn run test:compatibility + - name: Forge build + run: forge build + - name: Test Storage Layouts run: yarn run test:storage From 1a94dabd805673e4c85e4071662814a142b20893 Mon Sep 17 00:00:00 2001 From: gzeon Date: Fri, 27 Oct 2023 00:28:59 +0800 Subject: [PATCH 219/292] chore: version bump 1.1.0 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index cff51c12..211ec1ee 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@arbitrum/nitro-contracts", - "version": "1.1.0-beta.2", + "version": "1.1.0", "description": "Layer 2 precompiles and rollup for Arbitrum Nitro", "author": "Offchain Labs, Inc.", "license": "BUSL-1.1", From 50f5ac518bb5f9b60915e70429ae110d523f1b57 Mon Sep 17 00:00:00 2001 From: Lee Bousfield Date: Wed, 16 Aug 2023 15:21:49 -0600 Subject: [PATCH 220/292] Add sha256 preimage support --- src/osp/OneStepProverHostIo.sol | 30 +++++++++++++++++++++++++----- 1 file changed, 25 insertions(+), 5 deletions(-) diff --git a/src/osp/OneStepProverHostIo.sol b/src/osp/OneStepProverHostIo.sol index 260ab206..0206572f 100644 --- a/src/osp/OneStepProverHostIo.sol +++ b/src/osp/OneStepProverHostIo.sol @@ -105,7 +105,7 @@ contract OneStepProverHostIo is IOneStepProver { ExecutionContext calldata, Machine memory mach, Module memory mod, - Instruction calldata, + Instruction calldata inst, bytes calldata proof ) internal pure { uint256 preimageOffset = mach.valueStack.pop().assumeI32(); @@ -128,9 +128,30 @@ contract OneStepProverHostIo is IOneStepProver { bytes memory extracted; uint8 proofType = uint8(proof[proofOffset]); proofOffset++; - if (proofType == 0) { + // These values must be kept in sync with `arbitrator/arbutil/src/types.rs` + // and `arbutil/preimage_type.go` (both in the nitro repo). + if (inst.argumentData == 0) { + // The machine is asking for a keccak256 preimage + + if (proofType == 0) { + bytes calldata preimage = proof[proofOffset:]; + require(keccak256(preimage) == leafContents, "BAD_PREIMAGE"); + + uint256 preimageEnd = preimageOffset + 32; + if (preimageEnd > preimage.length) { + preimageEnd = preimage.length; + } + extracted = preimage[preimageOffset:preimageEnd]; + } else { + // TODO: support proving via an authenticated contract + revert("UNKNOWN_PREIMAGE_PROOF"); + } + } else if (inst.argumentData == 1) { + // The machine is asking for a sha2-256 preimage + + require(proofType == 0, "UNKNOWN_PREIMAGE_PROOF"); bytes calldata preimage = proof[proofOffset:]; - require(keccak256(preimage) == leafContents, "BAD_PREIMAGE"); + require(sha256(preimage) == leafContents, "BAD_PREIMAGE"); uint256 preimageEnd = preimageOffset + 32; if (preimageEnd > preimage.length) { @@ -138,8 +159,7 @@ contract OneStepProverHostIo is IOneStepProver { } extracted = preimage[preimageOffset:preimageEnd]; } else { - // TODO: support proving via an authenticated contract - revert("UNKNOWN_PREIMAGE_PROOF"); + revert("UNKNOWN_PREIMAGE_TYPE"); } for (uint256 i = 0; i < extracted.length; i++) { From a4337e1037f3fbebbf5a7aefaa055a1b1d580ecc Mon Sep 17 00:00:00 2001 From: Chris Buckland Date: Tue, 31 Oct 2023 12:46:44 +0100 Subject: [PATCH 221/292] Updates from CR --- src/bridge/AbsBridge.sol | 17 ++++----------- src/bridge/IBridge.sol | 29 ++++++++++++++++++++++--- src/bridge/ICommon.sol | 21 ------------------ src/bridge/ISequencerInbox.sol | 1 - src/bridge/SequencerInbox.sol | 36 +++++++++++++++---------------- src/mocks/BridgeStub.sol | 17 ++++----------- src/mocks/SequencerInboxStub.sol | 6 +++--- src/test-helpers/BridgeTester.sol | 4 ++-- test/foundry/AbsBridge.t.sol | 18 ++++++++-------- 9 files changed, 66 insertions(+), 83 deletions(-) delete mode 100644 src/bridge/ICommon.sol diff --git a/src/bridge/AbsBridge.sol b/src/bridge/AbsBridge.sol index e5355351..471c4a2b 100644 --- a/src/bridge/AbsBridge.sol +++ b/src/bridge/AbsBridge.sol @@ -63,16 +63,6 @@ abstract contract AbsBridge is Initializable, DelegateCallAware, IBridge { address internal constant EMPTY_ACTIVEOUTBOX = address(type(uint160).max); - event SequencerBatchDelivered( - uint256 indexed batchSequenceNumber, - bytes32 indexed beforeAcc, - bytes32 indexed afterAcc, - bytes32 delayedAcc, - uint256 afterDelayedMessagesRead, - ICommon.TimeBounds timeBounds, - ICommon.BatchDataLocation dataLocation - ); - function postUpgradeInit() external onlyDelegated onlyProxyOwner { totalDelayedMessagesRead = ISequencerInbox(sequencerInbox).totalDelayedMessagesRead(); if (totalDelayedMessagesRead == 0) revert EmptyDelayedMessagesRead(); @@ -123,8 +113,8 @@ abstract contract AbsBridge is Initializable, DelegateCallAware, IBridge { uint256 afterDelayedMessagesRead, uint256 prevMessageCount, uint256 newMessageCount, - ICommon.TimeBounds memory timeBounds, - ICommon.BatchDataLocation batchDataLocation + TimeBounds memory timeBounds, + BatchDataLocation batchDataLocation ) external onlySequencerInbox @@ -164,7 +154,8 @@ abstract contract AbsBridge is Initializable, DelegateCallAware, IBridge { delayedAcc, afterDelayedMessagesRead, timeBounds, - batchDataLocation + batchDataLocation, + msg.sender ); } diff --git a/src/bridge/IBridge.sol b/src/bridge/IBridge.sol index d129482d..a4493ca2 100644 --- a/src/bridge/IBridge.sol +++ b/src/bridge/IBridge.sol @@ -7,9 +7,21 @@ pragma solidity >=0.6.9 <0.9.0; pragma experimental ABIEncoderV2; import "./IOwnable.sol"; -import "./ICommon.sol"; interface IBridge { + enum BatchDataLocation { + TxInput, + SeparateBatchEvent, + NoData + } + + struct TimeBounds { + uint64 minTimestamp; + uint64 maxTimestamp; + uint64 minBlockNumber; + uint64 maxBlockNumber; + } + event MessageDelivered( uint256 indexed messageIndex, bytes32 indexed beforeInboxAcc, @@ -28,6 +40,17 @@ interface IBridge { bytes data ); + event SequencerBatchDelivered( + uint256 indexed batchSequenceNumber, + bytes32 indexed beforeAcc, + bytes32 indexed afterAcc, + bytes32 delayedAcc, + uint256 afterDelayedMessagesRead, + TimeBounds timeBounds, + BatchDataLocation dataLocation, + address sequencerInbox + ); + event InboxToggle(address indexed inbox, bool enabled); event OutboxToggle(address indexed outbox, bool enabled); @@ -77,8 +100,8 @@ interface IBridge { uint256 afterDelayedMessagesRead, uint256 prevMessageCount, uint256 newMessageCount, - ICommon.TimeBounds memory timeBounds, - ICommon.BatchDataLocation dataLocation + TimeBounds memory timeBounds, + BatchDataLocation dataLocation ) external returns ( diff --git a/src/bridge/ICommon.sol b/src/bridge/ICommon.sol deleted file mode 100644 index 388d3025..00000000 --- a/src/bridge/ICommon.sol +++ /dev/null @@ -1,21 +0,0 @@ -// 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-version -pragma solidity >=0.6.9 <0.9.0; - -interface ICommon { - enum BatchDataLocation { - TxInput, - SeparateBatchEvent, - NoData - } - - struct TimeBounds { - uint64 minTimestamp; - uint64 maxTimestamp; - uint64 minBlockNumber; - uint64 maxBlockNumber; - } -} diff --git a/src/bridge/ISequencerInbox.sol b/src/bridge/ISequencerInbox.sol index 99efbc50..8cdd2ed2 100644 --- a/src/bridge/ISequencerInbox.sol +++ b/src/bridge/ISequencerInbox.sol @@ -9,7 +9,6 @@ pragma experimental ABIEncoderV2; import "../libraries/IGasRefunder.sol"; import "./IDelayedMessageProvider.sol"; import "./IBridge.sol"; -import "./ICommon.sol"; interface ISequencerInbox is IDelayedMessageProvider { /// @notice The maximum amount of time variatin between a message being posted on the L1 and being executed on the L2 diff --git a/src/bridge/SequencerInbox.sol b/src/bridge/SequencerInbox.sol index 3cea7aa8..801887ad 100644 --- a/src/bridge/SequencerInbox.sol +++ b/src/bridge/SequencerInbox.sol @@ -109,8 +109,8 @@ contract SequencerInbox is GasRefundEnabled, ISequencerInbox { return bridge.totalDelayedMessagesRead(); } - function getTimeBounds() internal view virtual returns (ICommon.TimeBounds memory) { - ICommon.TimeBounds memory bounds; + function getTimeBounds() internal view virtual returns (IBridge.TimeBounds memory) { + IBridge.TimeBounds memory bounds; ISequencerInbox.MaxTimeVariation memory maxTimeVariation_ = maxTimeVariation(); if (block.timestamp > maxTimeVariation_.delaySeconds) { bounds.minTimestamp = uint64(block.timestamp - maxTimeVariation_.delaySeconds); @@ -179,7 +179,7 @@ contract SequencerInbox is GasRefundEnabled, ISequencerInbox { Messages.accumulateInboxMessage(prevDelayedAcc, messageHash) ) revert IncorrectMessagePreimage(); - (bytes32 dataHash, ICommon.TimeBounds memory timeBounds) = formEmptyDataHash( + (bytes32 dataHash, IBridge.TimeBounds memory timeBounds) = formEmptyDataHash( _totalDelayedMessagesRead ); uint256 prevSeqMsgCount = bridge.sequencerReportedSubMessageCount(); @@ -193,7 +193,7 @@ contract SequencerInbox is GasRefundEnabled, ISequencerInbox { prevSeqMsgCount, newSeqMsgCount, timeBounds, - ICommon.BatchDataLocation.NoData + IBridge.BatchDataLocation.NoData ); } @@ -208,13 +208,13 @@ contract SequencerInbox is GasRefundEnabled, ISequencerInbox { // solhint-disable-next-line avoid-tx-origin if (msg.sender != tx.origin) revert NotOrigin(); if (!isBatchPoster[msg.sender]) revert NotBatchPoster(); - (bytes32 dataHash, ICommon.TimeBounds memory timeBounds) = formDataHash( + (bytes32 dataHash, IBridge.TimeBounds memory timeBounds) = formDataHash( data, afterDelayedMessagesRead ); // Reformat the stack to prevent "Stack too deep" uint256 sequenceNumber_ = sequenceNumber; - ICommon.TimeBounds memory timeBounds_ = timeBounds; + IBridge.TimeBounds memory timeBounds_ = timeBounds; bytes32 dataHash_ = dataHash; uint256 dataLength = data.length; uint256 afterDelayedMessagesRead_ = afterDelayedMessagesRead; @@ -228,7 +228,7 @@ contract SequencerInbox is GasRefundEnabled, ISequencerInbox { prevMessageCount_, newMessageCount_, timeBounds_, - ICommon.BatchDataLocation.TxInput + IBridge.BatchDataLocation.TxInput ); if (seqMessageIndex != sequenceNumber_ && sequenceNumber_ != ~uint256(0)) revert BadSequencerNumber(seqMessageIndex, sequenceNumber_); @@ -243,7 +243,7 @@ contract SequencerInbox is GasRefundEnabled, ISequencerInbox { uint256 newMessageCount ) external override refundsGas(gasRefunder) { if (!isBatchPoster[msg.sender] && msg.sender != address(rollup)) revert NotBatchPoster(); - (bytes32 dataHash, ICommon.TimeBounds memory timeBounds) = formDataHash( + (bytes32 dataHash, IBridge.TimeBounds memory timeBounds) = formDataHash( data, afterDelayedMessagesRead ); @@ -251,7 +251,7 @@ contract SequencerInbox is GasRefundEnabled, ISequencerInbox { { // Reformat the stack to prevent "Stack too deep" uint256 sequenceNumber_ = sequenceNumber; - ICommon.TimeBounds memory timeBounds_ = timeBounds; + IBridge.TimeBounds memory timeBounds_ = timeBounds; bytes32 dataHash_ = dataHash; uint256 afterDelayedMessagesRead_ = afterDelayedMessagesRead; uint256 prevMessageCount_ = prevMessageCount; @@ -265,7 +265,7 @@ contract SequencerInbox is GasRefundEnabled, ISequencerInbox { prevMessageCount_, newMessageCount_, timeBounds_, - ICommon.BatchDataLocation.SeparateBatchEvent + IBridge.BatchDataLocation.SeparateBatchEvent ); if (seqMessageIndex != sequenceNumber_ && sequenceNumber_ != ~uint256(0)) revert BadSequencerNumber(seqMessageIndex, sequenceNumber_); @@ -292,9 +292,9 @@ contract SequencerInbox is GasRefundEnabled, ISequencerInbox { function packHeader(uint256 afterDelayedMessagesRead) internal view - returns (bytes memory, ICommon.TimeBounds memory) + returns (bytes memory, IBridge.TimeBounds memory) { - ICommon.TimeBounds memory timeBounds = getTimeBounds(); + IBridge.TimeBounds memory timeBounds = getTimeBounds(); bytes memory header = abi.encodePacked( timeBounds.minTimestamp, timeBounds.maxTimestamp, @@ -311,9 +311,9 @@ contract SequencerInbox is GasRefundEnabled, ISequencerInbox { internal view validateBatchData(data) - returns (bytes32, ICommon.TimeBounds memory) + returns (bytes32, IBridge.TimeBounds memory) { - (bytes memory header, ICommon.TimeBounds memory timeBounds) = packHeader( + (bytes memory header, IBridge.TimeBounds memory timeBounds) = packHeader( afterDelayedMessagesRead ); bytes32 dataHash = keccak256(bytes.concat(header, data)); @@ -323,9 +323,9 @@ contract SequencerInbox is GasRefundEnabled, ISequencerInbox { function formEmptyDataHash(uint256 afterDelayedMessagesRead) internal view - returns (bytes32, ICommon.TimeBounds memory) + returns (bytes32, IBridge.TimeBounds memory) { - (bytes memory header, ICommon.TimeBounds memory timeBounds) = packHeader( + (bytes memory header, IBridge.TimeBounds memory timeBounds) = packHeader( afterDelayedMessagesRead ); return (keccak256(header), timeBounds); @@ -337,8 +337,8 @@ contract SequencerInbox is GasRefundEnabled, ISequencerInbox { uint256 calldataLengthPosted, uint256 prevMessageCount, uint256 newMessageCount, - ICommon.TimeBounds memory timeBounds, - ICommon.BatchDataLocation batchDataLocation + IBridge.TimeBounds memory timeBounds, + IBridge.BatchDataLocation batchDataLocation ) internal returns (uint256 seqMessageIndex) { (seqMessageIndex, , , ) = bridge.enqueueSequencerMessage( dataHash, diff --git a/src/mocks/BridgeStub.sol b/src/mocks/BridgeStub.sol index d7102a38..4277f6fd 100644 --- a/src/mocks/BridgeStub.sol +++ b/src/mocks/BridgeStub.sol @@ -72,23 +72,13 @@ contract BridgeStub is IBridge, IEthBridge { ); } - event SequencerBatchDelivered( - uint256 indexed batchSequenceNumber, - bytes32 indexed beforeAcc, - bytes32 indexed afterAcc, - bytes32 delayedAcc, - uint256 afterDelayedMessagesRead, - ICommon.TimeBounds timeBounds, - ICommon.BatchDataLocation dataLocation - ); - function enqueueSequencerMessage( bytes32 dataHash, uint256 afterDelayedMessagesRead, uint256 prevMessageCount, uint256 newMessageCount, - ICommon.TimeBounds memory timeBounds, - ICommon.BatchDataLocation batchDataLocation + TimeBounds memory timeBounds, + BatchDataLocation batchDataLocation ) external returns ( @@ -127,7 +117,8 @@ contract BridgeStub is IBridge, IEthBridge { delayedAcc, afterDelayedMessagesRead, timeBounds, - batchDataLocation + batchDataLocation, + msg.sender ); } diff --git a/src/mocks/SequencerInboxStub.sol b/src/mocks/SequencerInboxStub.sol index 5b2dd05b..50fd9dc4 100644 --- a/src/mocks/SequencerInboxStub.sol +++ b/src/mocks/SequencerInboxStub.sol @@ -27,7 +27,7 @@ contract SequencerInboxStub is SequencerInbox { ); require(num == 0, "ALREADY_DELAYED_INIT"); emit InboxMessageDelivered(num, initMsg); - (bytes32 dataHash, ICommon.TimeBounds memory timeBounds) = formEmptyDataHash(1); + (bytes32 dataHash, IBridge.TimeBounds memory timeBounds) = formEmptyDataHash(1); uint256 sequencerMessageCount = addSequencerL2BatchImpl( dataHash, 1, @@ -35,12 +35,12 @@ contract SequencerInboxStub is SequencerInbox { 0, 1, timeBounds, - ICommon.BatchDataLocation.NoData + IBridge.BatchDataLocation.NoData ); require(sequencerMessageCount == 0, "ALREADY_SEQ_INIT"); } - function getTimeBounds() internal view override returns (ICommon.TimeBounds memory bounds) { + function getTimeBounds() internal view override returns (IBridge.TimeBounds memory bounds) { this; // silence warning about function not being view return bounds; } diff --git a/src/test-helpers/BridgeTester.sol b/src/test-helpers/BridgeTester.sol index c30febe3..38954d96 100644 --- a/src/test-helpers/BridgeTester.sol +++ b/src/test-helpers/BridgeTester.sol @@ -98,8 +98,8 @@ contract BridgeTester is Initializable, DelegateCallAware, IBridge, IEthBridge { uint256 afterDelayedMessagesRead, uint256 prevMessageCount, uint256 newMessageCount, - ICommon.TimeBounds memory timeBounds, - ICommon.BatchDataLocation batchDataLocation + TimeBounds memory timeBounds, + BatchDataLocation batchDataLocation ) external returns ( diff --git a/test/foundry/AbsBridge.t.sol b/test/foundry/AbsBridge.t.sol index 9cedcb98..7f30beb5 100644 --- a/test/foundry/AbsBridge.t.sol +++ b/test/foundry/AbsBridge.t.sol @@ -22,8 +22,8 @@ abstract contract AbsBridgeTest is Test { address public outbox = address(1002); address public seqInbox = address(1003); - ICommon.TimeBounds timeBounds = - ICommon.TimeBounds({ + IBridge.TimeBounds timeBounds = + IBridge.TimeBounds({ minTimestamp: uint64(block.timestamp + 1), maxTimestamp: uint64(block.timestamp + 10), minBlockNumber: uint64(block.number + 1), @@ -48,7 +48,7 @@ abstract contract AbsBridgeTest is Test { prevMessageCount, newMessageCount, timeBounds, - ICommon.BatchDataLocation.TxInput + IBridge.BatchDataLocation.TxInput ); // checks @@ -90,7 +90,7 @@ abstract contract AbsBridgeTest is Test { prevMessageCount, newMessageCount, timeBounds, - ICommon.BatchDataLocation.TxInput + IBridge.BatchDataLocation.TxInput ); // checks @@ -125,7 +125,7 @@ abstract contract AbsBridgeTest is Test { 0, 10, timeBounds, - ICommon.BatchDataLocation.SeparateBatchEvent + IBridge.BatchDataLocation.SeparateBatchEvent ); vm.stopPrank(); @@ -142,7 +142,7 @@ abstract contract AbsBridgeTest is Test { prevMessageCount, newMessageCount, timeBounds, - ICommon.BatchDataLocation.TxInput + IBridge.BatchDataLocation.TxInput ); // checks @@ -177,7 +177,7 @@ abstract contract AbsBridgeTest is Test { 0, 10, timeBounds, - ICommon.BatchDataLocation.SeparateBatchEvent + IBridge.BatchDataLocation.SeparateBatchEvent ); vm.stopPrank(); @@ -193,7 +193,7 @@ abstract contract AbsBridgeTest is Test { incorrectPrevMsgCount, 10, timeBounds, - ICommon.BatchDataLocation.SeparateBatchEvent + IBridge.BatchDataLocation.SeparateBatchEvent ); } @@ -206,7 +206,7 @@ abstract contract AbsBridgeTest is Test { 0, 10, timeBounds, - ICommon.BatchDataLocation.SeparateBatchEvent + IBridge.BatchDataLocation.SeparateBatchEvent ); } From 285b6bf2dfcd23ba03d6d3ab8637fbfb76f12d13 Mon Sep 17 00:00:00 2001 From: Chris Buckland Date: Tue, 31 Oct 2023 12:48:40 +0100 Subject: [PATCH 222/292] Merge from remote --- test/storage/Bridge-old.dot | 30 +++++++++++++++++++++++++++ test/storage/ChallengeManager-old.dot | 9 ++++++++ test/storage/Inbox-old.dot | 18 ++++++++++++++++ test/storage/Outbox-old.dot | 15 ++++++++++++++ test/storage/RollupAdminLogic-old.dot | 30 +++++++++++++++++++++++++++ test/storage/RollupCore-old.dot | 30 +++++++++++++++++++++++++++ test/storage/RollupUserLogic-old.dot | 30 +++++++++++++++++++++++++++ test/storage/SequencerInbox-old.dot | 15 ++++++++++++++ 8 files changed, 177 insertions(+) create mode 100644 test/storage/Bridge-old.dot create mode 100644 test/storage/ChallengeManager-old.dot create mode 100644 test/storage/Inbox-old.dot create mode 100644 test/storage/Outbox-old.dot create mode 100644 test/storage/RollupAdminLogic-old.dot create mode 100644 test/storage/RollupCore-old.dot create mode 100644 test/storage/RollupUserLogic-old.dot create mode 100644 test/storage/SequencerInbox-old.dot diff --git a/test/storage/Bridge-old.dot b/test/storage/Bridge-old.dot new file mode 100644 index 00000000..c98a5e8c --- /dev/null +++ b/test/storage/Bridge-old.dot @@ -0,0 +1,30 @@ + +digraph StorageDiagram { +rankdir=LR +color=black +arrowhead=open +node [shape=record, style=filled, fillcolor=gray95 fontname="Courier New"] +8 [label="Bridge \<\\>\n | {{ slot| 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11-50 } | { type: \.variable (bytes) | { unallocated (30) | bool: Initializable._initializing (1) | bool: Initializable._initialized (1) } | { <5> mapping\(address=\>InOutInfo\): AbsBridge.allowedDelayedInboxesMap (32) } | { <8> mapping\(address=\>InOutInfo\): AbsBridge.allowedOutboxesMap (32) } | { <10> address[]: AbsBridge.allowedDelayedInboxList (32) } | { <12> address[]: AbsBridge.allowedOutboxList (32) } | { unallocated (12) | address: AbsBridge._activeOutbox (20) } | { <15> bytes32[]: AbsBridge.delayedInboxAccs (32) } | { <17> bytes32[]: AbsBridge.sequencerInboxAccs (32) } | { unallocated (12) | IOwnable: AbsBridge.rollup (20) } | { unallocated (12) | address: AbsBridge.sequencerInbox (20) } | { uint256: AbsBridge.sequencerReportedSubMessageCount (32) } | { <61> uint256[40]: AbsBridge.__gap (1280) }}}"] + +1 [label="InOutInfo \<\\>\n | {{ slot| 0 | 1 } | { type: variable (bytes) | { uint256: index (32) } | { unallocated (31) | bool: allowed (1) }}}"] + +2 [label="InOutInfo \<\\>\n | {{ slot| 0 | 1 } | { type: variable (bytes) | { uint256: index (32) } | { unallocated (31) | bool: allowed (1) }}}"] + +3 [label="address[]: allowedDelayedInboxList \<\\>\n0x11987c15ef5ed64ec2e3cd9cfc79d7bd155aea3982ea59f35a5e6b5c1593a54b | {{ slot| 0 } | { type: variable (bytes) | { unallocated (12) | address (20) }}}"] + +4 [label="address[]: allowedOutboxList \<\\>\n0x68f9c7fa29c0442459fc0d2760448ff932de4dd67b90b4a6ac1899621cfd70a7 | {{ slot| 0 } | { type: variable (bytes) | { unallocated (12) | address (20) }}}"] + +5 [label="bytes32[]: delayedInboxAccs \<\\>\n0x5ff1374942f1d7624ea1478457e8132b05531ee44999ffc0f33a70926c6a0d30 | {{ slot| 0 } | { type: variable (bytes) | { bytes32 (32) }}}"] + +6 [label="bytes32[]: sequencerInboxAccs \<\\>\n0x995663702627f3d8fc4237c51a46b303536bb17f3f65e07c08ad05fecbf4d88e | {{ slot| 0 } | { type: variable (bytes) | { bytes32 (32) }}}"] + +7 [label="uint256[40]: __gap \<\\>\n | {{ slot| 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 } | { type: variable (bytes) | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) }}}"] + + 8:5 -> 1 + 8:8 -> 2 + 8:10 -> 3 + 8:12 -> 4 + 8:15 -> 5 + 8:17 -> 6 + 8:61 -> 7 +} \ No newline at end of file diff --git a/test/storage/ChallengeManager-old.dot b/test/storage/ChallengeManager-old.dot new file mode 100644 index 00000000..d566805f --- /dev/null +++ b/test/storage/ChallengeManager-old.dot @@ -0,0 +1,9 @@ + +digraph StorageDiagram { +rankdir=LR +color=black +arrowhead=open +node [shape=record, style=filled, fillcolor=gray95 fontname="Courier New"] +1 [label="ChallengeManager \<\\>\n | {{ slot| 0 | 1 | 2 | 3 | 4 | 5 } | { type: \.variable (bytes) | { unallocated (24) | uint64: totalChallengesCreated (8) } | { mapping\(uint256=\>ChallengeLib.Challenge\): challenges (32) } | { unallocated (12) | IChallengeResultReceiver: resultReceiver (20) } | { unallocated (12) | ISequencerInbox: sequencerInbox (20) } | { unallocated (12) | IBridge: bridge (20) } | { unallocated (12) | IOneStepProofEntry: osp (20) }}}"] + +} \ No newline at end of file diff --git a/test/storage/Inbox-old.dot b/test/storage/Inbox-old.dot new file mode 100644 index 00000000..cc97bcc9 --- /dev/null +++ b/test/storage/Inbox-old.dot @@ -0,0 +1,18 @@ + +digraph StorageDiagram { +rankdir=LR +color=black +arrowhead=open +node [shape=record, style=filled, fillcolor=gray95 fontname="Courier New"] +4 [label="Inbox \<\\>\n | {{ slot| 0 | 1-50 | 51 | 52-100 | 101 | 102 | 103 | 104-150 } | { type: \.variable (bytes) | { unallocated (30) | bool: Initializable._initializing (1) | bool: Initializable._initialized (1) } | { <53> uint256[50]: ContextUpgradeable.__gap (1600) } | { unallocated (31) | bool: PausableUpgradeable._paused (1) } | { <104> uint256[49]: PausableUpgradeable.__gap (1568) } | { unallocated (12) | IBridge: AbsInbox.bridge (20) } | { unallocated (11) | bool: AbsInbox.allowListEnabled (1) | ISequencerInbox: AbsInbox.sequencerInbox (20) } | { mapping\(address=\>bool\): AbsInbox.isAllowed (32) } | { <156> uint256[47]: AbsInbox.__gap (1504) }}}"] + +1 [label="uint256[50]: __gap \<\\>\n | {{ slot| 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 } | { type: variable (bytes) | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) }}}"] + +2 [label="uint256[49]: __gap \<\\>\n | {{ slot| 52 | 53 | 54 | 55 | 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 | 72 | 73 | 74 | 75 | 76 | 77 | 78 | 79 | 80 | 81 | 82 | 83 | 84 | 85 | 86 | 87 | 88 | 89 | 90 | 91 | 92 | 93 | 94 | 95 | 96 | 97 | 98 | 99 | 100 } | { type: variable (bytes) | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) }}}"] + +3 [label="uint256[47]: __gap \<\\>\n | {{ slot| 104 | 105 | 106 | 107 | 108 | 109 | 110 | 111 | 112 | 113 | 114 | 115 | 116 | 117 | 118 | 119 | 120 | 121 | 122 | 123 | 124 | 125 | 126 | 127 | 128 | 129 | 130 | 131 | 132 | 133 | 134 | 135 | 136 | 137 | 138 | 139 | 140 | 141 | 142 | 143 | 144 | 145 | 146 | 147 | 148 | 149 | 150 } | { type: variable (bytes) | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) }}}"] + + 4:53 -> 1 + 4:104 -> 2 + 4:156 -> 3 +} \ No newline at end of file diff --git a/test/storage/Outbox-old.dot b/test/storage/Outbox-old.dot new file mode 100644 index 00000000..f2da1fcb --- /dev/null +++ b/test/storage/Outbox-old.dot @@ -0,0 +1,15 @@ + +digraph StorageDiagram { +rankdir=LR +color=black +arrowhead=open +node [shape=record, style=filled, fillcolor=gray95 fontname="Courier New"] +3 [label="Outbox \<\\>\n | {{ slot| 0 | 1 | 2 | 3 | 4-7 | 8-49 } | { type: \.variable (bytes) | { unallocated (12) | address: AbsOutbox.rollup (20) } | { unallocated (12) | IBridge: AbsOutbox.bridge (20) } | { mapping\(uint256=\>bytes32\): AbsOutbox.spent (32) } | { mapping\(bytes32=\>bytes32\): AbsOutbox.roots (32) } | { <11> L2ToL1Context: AbsOutbox.context (128) } | { <54> uint256[42]: AbsOutbox.__gap (1344) }}}"] + +1 [label="L2ToL1Context \<\\>\n | {{ slot| 4 | 5 | 6 | 7 } | { type: variable (bytes) | { uint128: timestamp (16) | uint128: l2Block (16) } | { bytes32: outputId (32) } | { uint96: l1Block (12) | address: sender (20) } | { uint256: withdrawalAmount (32) }}}"] + +2 [label="uint256[42]: __gap \<\\>\n | {{ slot| 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 } | { type: variable (bytes) | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) }}}"] + + 3:11 -> 1 + 3:54 -> 2 +} \ No newline at end of file diff --git a/test/storage/RollupAdminLogic-old.dot b/test/storage/RollupAdminLogic-old.dot new file mode 100644 index 00000000..7dad73f2 --- /dev/null +++ b/test/storage/RollupAdminLogic-old.dot @@ -0,0 +1,30 @@ + +digraph StorageDiagram { +rankdir=LR +color=black +arrowhead=open +node [shape=record, style=filled, fillcolor=gray95 fontname="Courier New"] +8 [label="RollupAdminLogic \<\\>\n | {{ slot| 0 | 1-50 | 51 | 52-100 | 101 | 102 | 103 | 104 | 105 | 106 | 107 | 108 | 109 | 110 | 111 | 112 | 113 | 114 | 115 | 116 | 117 | 118 | 119 | 120 | 121 | 122 | 123 | 124 | 125 | 126 | 127 } | { type: \.variable (bytes) | { unallocated (30) | bool: Initializable._initializing (1) | bool: Initializable._initialized (1) } | { <53> uint256[50]: ContextUpgradeable.__gap (1600) } | { unallocated (31) | bool: PausableUpgradeable._paused (1) } | { <104> uint256[49]: PausableUpgradeable.__gap (1568) } | { unallocated (16) | uint64: RollupCore.extraChallengeTimeBlocks (8) | uint64: RollupCore.confirmPeriodBlocks (8) } | { uint256: RollupCore.chainId (32) } | { uint256: RollupCore.baseStake (32) } | { bytes32: RollupCore.wasmModuleRoot (32) } | { unallocated (12) | IInboxBase: RollupCore.inbox (20) } | { unallocated (12) | IBridge: RollupCore.bridge (20) } | { unallocated (12) | IOutbox: RollupCore.outbox (20) } | { unallocated (12) | ISequencerInbox: RollupCore.sequencerInbox (20) } | { unallocated (12) | IRollupEventInbox: RollupCore.rollupEventInbox (20) } | { unallocated (12) | IChallengeManager: RollupCore.challengeManager (20) } | { unallocated (12) | address: RollupCore.validatorUtils (20) } | { unallocated (12) | address: RollupCore.validatorWalletCreator (20) } | { unallocated (12) | address: RollupCore.loserStakeEscrow (20) } | { unallocated (12) | address: RollupCore.stakeToken (20) } | { uint256: RollupCore.minimumAssertionPeriod (32) } | { mapping\(address=\>bool\): RollupCore.isValidator (32) } | { uint64: RollupCore._lastStakeBlock (8) | uint64: RollupCore._latestNodeCreated (8) | uint64: RollupCore._firstUnresolvedNode (8) | uint64: RollupCore._latestConfirmed (8) } | { <138> mapping\(uint64=\>Node\): RollupCore._nodes (32) } | { mapping\(uint64=\>mapping\(address=\>bool\)\): RollupCore._nodeStakers (32) } | { <141> address[]: RollupCore._stakerList (32) } | { <147> mapping\(address=\>Staker\): RollupCore._stakerMap (32) } | { <151> Zombie[]: RollupCore._zombies (32) } | { mapping\(address=\>uint256\): RollupCore._withdrawableFunds (32) } | { uint256: RollupCore.totalWithdrawableFunds (32) } | { uint256: RollupCore.rollupDeploymentBlock (32) } | { unallocated (31) | bool: RollupCore.validatorWhitelistDisabled (1) } | { mapping\(uint64=\>uint256\): RollupCore._nodeCreatedAtArbSysBlock (32) }}}"] + +1 [label="uint256[50]: __gap \<\\>\n | {{ slot| 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 } | { type: variable (bytes) | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) }}}"] + +2 [label="uint256[49]: __gap \<\\>\n | {{ slot| 52 | 53 | 54 | 55 | 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 | 72 | 73 | 74 | 75 | 76 | 77 | 78 | 79 | 80 | 81 | 82 | 83 | 84 | 85 | 86 | 87 | 88 | 89 | 90 | 91 | 92 | 93 | 94 | 95 | 96 | 97 | 98 | 99 | 100 } | { type: variable (bytes) | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) }}}"] + +3 [label="Node \<\\>\n | {{ slot| 0 | 1 | 2 | 3 | 4 | 5 } | { type: variable (bytes) | { bytes32: stateHash (32) } | { bytes32: challengeHash (32) } | { bytes32: confirmData (32) } | { uint64: stakerCount (8) | uint64: noChildConfirmedBeforeBlock (8) | uint64: deadlineBlock (8) | uint64: prevNum (8) } | { uint64: createdAtBlock (8) | uint64: latestChildNumber (8) | uint64: firstChildBlock (8) | uint64: childStakerCount (8) } | { bytes32: nodeHash (32) }}}"] + +4 [label="address[]: _stakerList \<\\>\n0x315040cf50a9fea58aa3302eb9bbbb1153c7ed7311c4e1c76711b1190d535025 | {{ slot| 0 } | { type: variable (bytes) | { unallocated (12) | address (20) }}}"] + +5 [label="Staker \<\\>\n | {{ slot| 0 | 1 } | { type: variable (bytes) | { uint256: amountStaked (32) } | { unallocated (7) | bool: isStaked (1) | uint64: currentChallenge (8) | uint64: latestStakedNode (8) | uint64: index (8) }}}"] + +6 [label="Zombie \<\\>\n | {{ slot| 0 } | { type: variable (bytes) | { unallocated (4) | uint64: latestStakedNode (8) | address: stakerAddress (20) }}}"] + +7 [label="Zombie[]: _zombies \<\\>\n0x8e4a4be60bf9672655845da331c63e49fa2a771e90e72dc554369cbb34aae7b8 | {{ slot| 0 } | { type: variable (bytes) | { <148> Zombie (32) }}}"] + + 8:53 -> 1 + 8:104 -> 2 + 8:138 -> 3 + 8:141 -> 4 + 8:147 -> 5 + 8:151 -> 7 + 7:148 -> 6 +} \ No newline at end of file diff --git a/test/storage/RollupCore-old.dot b/test/storage/RollupCore-old.dot new file mode 100644 index 00000000..2307dcc5 --- /dev/null +++ b/test/storage/RollupCore-old.dot @@ -0,0 +1,30 @@ + +digraph StorageDiagram { +rankdir=LR +color=black +arrowhead=open +node [shape=record, style=filled, fillcolor=gray95 fontname="Courier New"] +8 [label="RollupCore \<\\>\n | {{ slot| 0 | 1-50 | 51 | 52-100 | 101 | 102 | 103 | 104 | 105 | 106 | 107 | 108 | 109 | 110 | 111 | 112 | 113 | 114 | 115 | 116 | 117 | 118 | 119 | 120 | 121 | 122 | 123 | 124 | 125 | 126 | 127 } | { type: \.variable (bytes) | { unallocated (30) | bool: Initializable._initializing (1) | bool: Initializable._initialized (1) } | { <53> uint256[50]: ContextUpgradeable.__gap (1600) } | { unallocated (31) | bool: PausableUpgradeable._paused (1) } | { <104> uint256[49]: PausableUpgradeable.__gap (1568) } | { unallocated (16) | uint64: extraChallengeTimeBlocks (8) | uint64: confirmPeriodBlocks (8) } | { uint256: chainId (32) } | { uint256: baseStake (32) } | { bytes32: wasmModuleRoot (32) } | { unallocated (12) | IInboxBase: inbox (20) } | { unallocated (12) | IBridge: bridge (20) } | { unallocated (12) | IOutbox: outbox (20) } | { unallocated (12) | ISequencerInbox: sequencerInbox (20) } | { unallocated (12) | IRollupEventInbox: rollupEventInbox (20) } | { unallocated (12) | IChallengeManager: challengeManager (20) } | { unallocated (12) | address: validatorUtils (20) } | { unallocated (12) | address: validatorWalletCreator (20) } | { unallocated (12) | address: loserStakeEscrow (20) } | { unallocated (12) | address: stakeToken (20) } | { uint256: minimumAssertionPeriod (32) } | { mapping\(address=\>bool\): isValidator (32) } | { uint64: _lastStakeBlock (8) | uint64: _latestNodeCreated (8) | uint64: _firstUnresolvedNode (8) | uint64: _latestConfirmed (8) } | { <138> mapping\(uint64=\>Node\): _nodes (32) } | { mapping\(uint64=\>mapping\(address=\>bool\)\): _nodeStakers (32) } | { <141> address[]: _stakerList (32) } | { <147> mapping\(address=\>Staker\): _stakerMap (32) } | { <151> Zombie[]: _zombies (32) } | { mapping\(address=\>uint256\): _withdrawableFunds (32) } | { uint256: totalWithdrawableFunds (32) } | { uint256: rollupDeploymentBlock (32) } | { unallocated (31) | bool: validatorWhitelistDisabled (1) } | { mapping\(uint64=\>uint256\): _nodeCreatedAtArbSysBlock (32) }}}"] + +1 [label="uint256[50]: __gap \<\\>\n | {{ slot| 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 } | { type: variable (bytes) | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) }}}"] + +2 [label="uint256[49]: __gap \<\\>\n | {{ slot| 52 | 53 | 54 | 55 | 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 | 72 | 73 | 74 | 75 | 76 | 77 | 78 | 79 | 80 | 81 | 82 | 83 | 84 | 85 | 86 | 87 | 88 | 89 | 90 | 91 | 92 | 93 | 94 | 95 | 96 | 97 | 98 | 99 | 100 } | { type: variable (bytes) | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) }}}"] + +3 [label="Node \<\\>\n | {{ slot| 0 | 1 | 2 | 3 | 4 | 5 } | { type: variable (bytes) | { bytes32: stateHash (32) } | { bytes32: challengeHash (32) } | { bytes32: confirmData (32) } | { uint64: stakerCount (8) | uint64: noChildConfirmedBeforeBlock (8) | uint64: deadlineBlock (8) | uint64: prevNum (8) } | { uint64: createdAtBlock (8) | uint64: latestChildNumber (8) | uint64: firstChildBlock (8) | uint64: childStakerCount (8) } | { bytes32: nodeHash (32) }}}"] + +4 [label="address[]: _stakerList \<\\>\n0x315040cf50a9fea58aa3302eb9bbbb1153c7ed7311c4e1c76711b1190d535025 | {{ slot| 0 } | { type: variable (bytes) | { unallocated (12) | address (20) }}}"] + +5 [label="Staker \<\\>\n | {{ slot| 0 | 1 } | { type: variable (bytes) | { uint256: amountStaked (32) } | { unallocated (7) | bool: isStaked (1) | uint64: currentChallenge (8) | uint64: latestStakedNode (8) | uint64: index (8) }}}"] + +6 [label="Zombie \<\\>\n | {{ slot| 0 } | { type: variable (bytes) | { unallocated (4) | uint64: latestStakedNode (8) | address: stakerAddress (20) }}}"] + +7 [label="Zombie[]: _zombies \<\\>\n0x8e4a4be60bf9672655845da331c63e49fa2a771e90e72dc554369cbb34aae7b8 | {{ slot| 0 } | { type: variable (bytes) | { <148> Zombie (32) }}}"] + + 8:53 -> 1 + 8:104 -> 2 + 8:138 -> 3 + 8:141 -> 4 + 8:147 -> 5 + 8:151 -> 7 + 7:148 -> 6 +} \ No newline at end of file diff --git a/test/storage/RollupUserLogic-old.dot b/test/storage/RollupUserLogic-old.dot new file mode 100644 index 00000000..bd7576a3 --- /dev/null +++ b/test/storage/RollupUserLogic-old.dot @@ -0,0 +1,30 @@ + +digraph StorageDiagram { +rankdir=LR +color=black +arrowhead=open +node [shape=record, style=filled, fillcolor=gray95 fontname="Courier New"] +8 [label="RollupUserLogic \<\\>\n | {{ slot| 0 | 1-50 | 51 | 52-100 | 101 | 102 | 103 | 104 | 105 | 106 | 107 | 108 | 109 | 110 | 111 | 112 | 113 | 114 | 115 | 116 | 117 | 118 | 119 | 120 | 121 | 122 | 123 | 124 | 125 | 126 | 127 } | { type: \.variable (bytes) | { unallocated (30) | bool: Initializable._initializing (1) | bool: Initializable._initialized (1) } | { <53> uint256[50]: ContextUpgradeable.__gap (1600) } | { unallocated (31) | bool: PausableUpgradeable._paused (1) } | { <104> uint256[49]: PausableUpgradeable.__gap (1568) } | { unallocated (16) | uint64: RollupCore.extraChallengeTimeBlocks (8) | uint64: RollupCore.confirmPeriodBlocks (8) } | { uint256: RollupCore.chainId (32) } | { uint256: RollupCore.baseStake (32) } | { bytes32: RollupCore.wasmModuleRoot (32) } | { unallocated (12) | IInboxBase: RollupCore.inbox (20) } | { unallocated (12) | IBridge: RollupCore.bridge (20) } | { unallocated (12) | IOutbox: RollupCore.outbox (20) } | { unallocated (12) | ISequencerInbox: RollupCore.sequencerInbox (20) } | { unallocated (12) | IRollupEventInbox: RollupCore.rollupEventInbox (20) } | { unallocated (12) | IChallengeManager: RollupCore.challengeManager (20) } | { unallocated (12) | address: RollupCore.validatorUtils (20) } | { unallocated (12) | address: RollupCore.validatorWalletCreator (20) } | { unallocated (12) | address: RollupCore.loserStakeEscrow (20) } | { unallocated (12) | address: RollupCore.stakeToken (20) } | { uint256: RollupCore.minimumAssertionPeriod (32) } | { mapping\(address=\>bool\): RollupCore.isValidator (32) } | { uint64: RollupCore._lastStakeBlock (8) | uint64: RollupCore._latestNodeCreated (8) | uint64: RollupCore._firstUnresolvedNode (8) | uint64: RollupCore._latestConfirmed (8) } | { <138> mapping\(uint64=\>Node\): RollupCore._nodes (32) } | { mapping\(uint64=\>mapping\(address=\>bool\)\): RollupCore._nodeStakers (32) } | { <141> address[]: RollupCore._stakerList (32) } | { <147> mapping\(address=\>Staker\): RollupCore._stakerMap (32) } | { <151> Zombie[]: RollupCore._zombies (32) } | { mapping\(address=\>uint256\): RollupCore._withdrawableFunds (32) } | { uint256: RollupCore.totalWithdrawableFunds (32) } | { uint256: RollupCore.rollupDeploymentBlock (32) } | { unallocated (31) | bool: RollupCore.validatorWhitelistDisabled (1) } | { mapping\(uint64=\>uint256\): RollupCore._nodeCreatedAtArbSysBlock (32) }}}"] + +1 [label="uint256[50]: __gap \<\\>\n | {{ slot| 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 } | { type: variable (bytes) | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) }}}"] + +2 [label="uint256[49]: __gap \<\\>\n | {{ slot| 52 | 53 | 54 | 55 | 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 | 72 | 73 | 74 | 75 | 76 | 77 | 78 | 79 | 80 | 81 | 82 | 83 | 84 | 85 | 86 | 87 | 88 | 89 | 90 | 91 | 92 | 93 | 94 | 95 | 96 | 97 | 98 | 99 | 100 } | { type: variable (bytes) | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) }}}"] + +3 [label="Node \<\\>\n | {{ slot| 0 | 1 | 2 | 3 | 4 | 5 } | { type: variable (bytes) | { bytes32: stateHash (32) } | { bytes32: challengeHash (32) } | { bytes32: confirmData (32) } | { uint64: stakerCount (8) | uint64: noChildConfirmedBeforeBlock (8) | uint64: deadlineBlock (8) | uint64: prevNum (8) } | { uint64: createdAtBlock (8) | uint64: latestChildNumber (8) | uint64: firstChildBlock (8) | uint64: childStakerCount (8) } | { bytes32: nodeHash (32) }}}"] + +4 [label="address[]: _stakerList \<\\>\n0x315040cf50a9fea58aa3302eb9bbbb1153c7ed7311c4e1c76711b1190d535025 | {{ slot| 0 } | { type: variable (bytes) | { unallocated (12) | address (20) }}}"] + +5 [label="Staker \<\\>\n | {{ slot| 0 | 1 } | { type: variable (bytes) | { uint256: amountStaked (32) } | { unallocated (7) | bool: isStaked (1) | uint64: currentChallenge (8) | uint64: latestStakedNode (8) | uint64: index (8) }}}"] + +6 [label="Zombie \<\\>\n | {{ slot| 0 } | { type: variable (bytes) | { unallocated (4) | uint64: latestStakedNode (8) | address: stakerAddress (20) }}}"] + +7 [label="Zombie[]: _zombies \<\\>\n0x8e4a4be60bf9672655845da331c63e49fa2a771e90e72dc554369cbb34aae7b8 | {{ slot| 0 } | { type: variable (bytes) | { <148> Zombie (32) }}}"] + + 8:53 -> 1 + 8:104 -> 2 + 8:138 -> 3 + 8:141 -> 4 + 8:147 -> 5 + 8:151 -> 7 + 7:148 -> 6 +} \ No newline at end of file diff --git a/test/storage/SequencerInbox-old.dot b/test/storage/SequencerInbox-old.dot new file mode 100644 index 00000000..7c268d5c --- /dev/null +++ b/test/storage/SequencerInbox-old.dot @@ -0,0 +1,15 @@ + +digraph StorageDiagram { +rankdir=LR +color=black +arrowhead=open +node [shape=record, style=filled, fillcolor=gray95 fontname="Courier New"] +3 [label="SequencerInbox \<\\>\n | {{ slot| 0 | 1 | 2 | 3 | 4-7 | 8 | 9 | 10 } | { type: \.variable (bytes) | { uint256: totalDelayedMessagesRead (32) } | { unallocated (12) | IBridge: bridge (20) } | { unallocated (12) | IOwnable: rollup (20) } | { mapping\(address=\>bool\): isBatchPoster (32) } | { <9> ISequencerInbox.MaxTimeVariation: maxTimeVariation (128) } | { <12> mapping\(bytes32=\>DasKeySetInfo\): dasKeySetInfo (32) } | { mapping\(address=\>bool\): isSequencer (32) } | { unallocated (12) | IDataHashReader: dataHashReader (20) }}}"] + +1 [label="ISequencerInbox.MaxTimeVariation \<\\>\n | {{ slot| 4 | 5 | 6 | 7 } | { type: variable (bytes) | { uint256: MaxTimeVariation.delayBlocks (32) } | { uint256: MaxTimeVariation.futureBlocks (32) } | { uint256: MaxTimeVariation.delaySeconds (32) } | { uint256: MaxTimeVariation.futureSeconds (32) }}}"] + +2 [label="DasKeySetInfo \<\\>\n | {{ slot| 0 } | { type: variable (bytes) | { unallocated (23) | uint64: creationBlock (8) | bool: isValidKeyset (1) }}}"] + + 3:9 -> 1 + 3:12 -> 2 +} \ No newline at end of file From 085e0e9a30a7f9a76e13508ef5cd1dac0740ecdb Mon Sep 17 00:00:00 2001 From: Chris Buckland Date: Tue, 31 Oct 2023 12:55:20 +0100 Subject: [PATCH 223/292] Removed old dot files --- test/storage/Bridge-old.dot | 30 --------------------------- test/storage/ChallengeManager-old.dot | 9 -------- test/storage/Inbox-old.dot | 18 ---------------- test/storage/Outbox-old.dot | 15 -------------- test/storage/RollupAdminLogic-old.dot | 30 --------------------------- test/storage/RollupCore-old.dot | 30 --------------------------- test/storage/RollupUserLogic-old.dot | 30 --------------------------- test/storage/SequencerInbox-old.dot | 15 -------------- 8 files changed, 177 deletions(-) delete mode 100644 test/storage/Bridge-old.dot delete mode 100644 test/storage/ChallengeManager-old.dot delete mode 100644 test/storage/Inbox-old.dot delete mode 100644 test/storage/Outbox-old.dot delete mode 100644 test/storage/RollupAdminLogic-old.dot delete mode 100644 test/storage/RollupCore-old.dot delete mode 100644 test/storage/RollupUserLogic-old.dot delete mode 100644 test/storage/SequencerInbox-old.dot diff --git a/test/storage/Bridge-old.dot b/test/storage/Bridge-old.dot deleted file mode 100644 index c98a5e8c..00000000 --- a/test/storage/Bridge-old.dot +++ /dev/null @@ -1,30 +0,0 @@ - -digraph StorageDiagram { -rankdir=LR -color=black -arrowhead=open -node [shape=record, style=filled, fillcolor=gray95 fontname="Courier New"] -8 [label="Bridge \<\\>\n | {{ slot| 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11-50 } | { type: \.variable (bytes) | { unallocated (30) | bool: Initializable._initializing (1) | bool: Initializable._initialized (1) } | { <5> mapping\(address=\>InOutInfo\): AbsBridge.allowedDelayedInboxesMap (32) } | { <8> mapping\(address=\>InOutInfo\): AbsBridge.allowedOutboxesMap (32) } | { <10> address[]: AbsBridge.allowedDelayedInboxList (32) } | { <12> address[]: AbsBridge.allowedOutboxList (32) } | { unallocated (12) | address: AbsBridge._activeOutbox (20) } | { <15> bytes32[]: AbsBridge.delayedInboxAccs (32) } | { <17> bytes32[]: AbsBridge.sequencerInboxAccs (32) } | { unallocated (12) | IOwnable: AbsBridge.rollup (20) } | { unallocated (12) | address: AbsBridge.sequencerInbox (20) } | { uint256: AbsBridge.sequencerReportedSubMessageCount (32) } | { <61> uint256[40]: AbsBridge.__gap (1280) }}}"] - -1 [label="InOutInfo \<\\>\n | {{ slot| 0 | 1 } | { type: variable (bytes) | { uint256: index (32) } | { unallocated (31) | bool: allowed (1) }}}"] - -2 [label="InOutInfo \<\\>\n | {{ slot| 0 | 1 } | { type: variable (bytes) | { uint256: index (32) } | { unallocated (31) | bool: allowed (1) }}}"] - -3 [label="address[]: allowedDelayedInboxList \<\\>\n0x11987c15ef5ed64ec2e3cd9cfc79d7bd155aea3982ea59f35a5e6b5c1593a54b | {{ slot| 0 } | { type: variable (bytes) | { unallocated (12) | address (20) }}}"] - -4 [label="address[]: allowedOutboxList \<\\>\n0x68f9c7fa29c0442459fc0d2760448ff932de4dd67b90b4a6ac1899621cfd70a7 | {{ slot| 0 } | { type: variable (bytes) | { unallocated (12) | address (20) }}}"] - -5 [label="bytes32[]: delayedInboxAccs \<\\>\n0x5ff1374942f1d7624ea1478457e8132b05531ee44999ffc0f33a70926c6a0d30 | {{ slot| 0 } | { type: variable (bytes) | { bytes32 (32) }}}"] - -6 [label="bytes32[]: sequencerInboxAccs \<\\>\n0x995663702627f3d8fc4237c51a46b303536bb17f3f65e07c08ad05fecbf4d88e | {{ slot| 0 } | { type: variable (bytes) | { bytes32 (32) }}}"] - -7 [label="uint256[40]: __gap \<\\>\n | {{ slot| 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 } | { type: variable (bytes) | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) }}}"] - - 8:5 -> 1 - 8:8 -> 2 - 8:10 -> 3 - 8:12 -> 4 - 8:15 -> 5 - 8:17 -> 6 - 8:61 -> 7 -} \ No newline at end of file diff --git a/test/storage/ChallengeManager-old.dot b/test/storage/ChallengeManager-old.dot deleted file mode 100644 index d566805f..00000000 --- a/test/storage/ChallengeManager-old.dot +++ /dev/null @@ -1,9 +0,0 @@ - -digraph StorageDiagram { -rankdir=LR -color=black -arrowhead=open -node [shape=record, style=filled, fillcolor=gray95 fontname="Courier New"] -1 [label="ChallengeManager \<\\>\n | {{ slot| 0 | 1 | 2 | 3 | 4 | 5 } | { type: \.variable (bytes) | { unallocated (24) | uint64: totalChallengesCreated (8) } | { mapping\(uint256=\>ChallengeLib.Challenge\): challenges (32) } | { unallocated (12) | IChallengeResultReceiver: resultReceiver (20) } | { unallocated (12) | ISequencerInbox: sequencerInbox (20) } | { unallocated (12) | IBridge: bridge (20) } | { unallocated (12) | IOneStepProofEntry: osp (20) }}}"] - -} \ No newline at end of file diff --git a/test/storage/Inbox-old.dot b/test/storage/Inbox-old.dot deleted file mode 100644 index cc97bcc9..00000000 --- a/test/storage/Inbox-old.dot +++ /dev/null @@ -1,18 +0,0 @@ - -digraph StorageDiagram { -rankdir=LR -color=black -arrowhead=open -node [shape=record, style=filled, fillcolor=gray95 fontname="Courier New"] -4 [label="Inbox \<\\>\n | {{ slot| 0 | 1-50 | 51 | 52-100 | 101 | 102 | 103 | 104-150 } | { type: \.variable (bytes) | { unallocated (30) | bool: Initializable._initializing (1) | bool: Initializable._initialized (1) } | { <53> uint256[50]: ContextUpgradeable.__gap (1600) } | { unallocated (31) | bool: PausableUpgradeable._paused (1) } | { <104> uint256[49]: PausableUpgradeable.__gap (1568) } | { unallocated (12) | IBridge: AbsInbox.bridge (20) } | { unallocated (11) | bool: AbsInbox.allowListEnabled (1) | ISequencerInbox: AbsInbox.sequencerInbox (20) } | { mapping\(address=\>bool\): AbsInbox.isAllowed (32) } | { <156> uint256[47]: AbsInbox.__gap (1504) }}}"] - -1 [label="uint256[50]: __gap \<\\>\n | {{ slot| 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 } | { type: variable (bytes) | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) }}}"] - -2 [label="uint256[49]: __gap \<\\>\n | {{ slot| 52 | 53 | 54 | 55 | 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 | 72 | 73 | 74 | 75 | 76 | 77 | 78 | 79 | 80 | 81 | 82 | 83 | 84 | 85 | 86 | 87 | 88 | 89 | 90 | 91 | 92 | 93 | 94 | 95 | 96 | 97 | 98 | 99 | 100 } | { type: variable (bytes) | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) }}}"] - -3 [label="uint256[47]: __gap \<\\>\n | {{ slot| 104 | 105 | 106 | 107 | 108 | 109 | 110 | 111 | 112 | 113 | 114 | 115 | 116 | 117 | 118 | 119 | 120 | 121 | 122 | 123 | 124 | 125 | 126 | 127 | 128 | 129 | 130 | 131 | 132 | 133 | 134 | 135 | 136 | 137 | 138 | 139 | 140 | 141 | 142 | 143 | 144 | 145 | 146 | 147 | 148 | 149 | 150 } | { type: variable (bytes) | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) }}}"] - - 4:53 -> 1 - 4:104 -> 2 - 4:156 -> 3 -} \ No newline at end of file diff --git a/test/storage/Outbox-old.dot b/test/storage/Outbox-old.dot deleted file mode 100644 index f2da1fcb..00000000 --- a/test/storage/Outbox-old.dot +++ /dev/null @@ -1,15 +0,0 @@ - -digraph StorageDiagram { -rankdir=LR -color=black -arrowhead=open -node [shape=record, style=filled, fillcolor=gray95 fontname="Courier New"] -3 [label="Outbox \<\\>\n | {{ slot| 0 | 1 | 2 | 3 | 4-7 | 8-49 } | { type: \.variable (bytes) | { unallocated (12) | address: AbsOutbox.rollup (20) } | { unallocated (12) | IBridge: AbsOutbox.bridge (20) } | { mapping\(uint256=\>bytes32\): AbsOutbox.spent (32) } | { mapping\(bytes32=\>bytes32\): AbsOutbox.roots (32) } | { <11> L2ToL1Context: AbsOutbox.context (128) } | { <54> uint256[42]: AbsOutbox.__gap (1344) }}}"] - -1 [label="L2ToL1Context \<\\>\n | {{ slot| 4 | 5 | 6 | 7 } | { type: variable (bytes) | { uint128: timestamp (16) | uint128: l2Block (16) } | { bytes32: outputId (32) } | { uint96: l1Block (12) | address: sender (20) } | { uint256: withdrawalAmount (32) }}}"] - -2 [label="uint256[42]: __gap \<\\>\n | {{ slot| 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 } | { type: variable (bytes) | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) }}}"] - - 3:11 -> 1 - 3:54 -> 2 -} \ No newline at end of file diff --git a/test/storage/RollupAdminLogic-old.dot b/test/storage/RollupAdminLogic-old.dot deleted file mode 100644 index 7dad73f2..00000000 --- a/test/storage/RollupAdminLogic-old.dot +++ /dev/null @@ -1,30 +0,0 @@ - -digraph StorageDiagram { -rankdir=LR -color=black -arrowhead=open -node [shape=record, style=filled, fillcolor=gray95 fontname="Courier New"] -8 [label="RollupAdminLogic \<\\>\n | {{ slot| 0 | 1-50 | 51 | 52-100 | 101 | 102 | 103 | 104 | 105 | 106 | 107 | 108 | 109 | 110 | 111 | 112 | 113 | 114 | 115 | 116 | 117 | 118 | 119 | 120 | 121 | 122 | 123 | 124 | 125 | 126 | 127 } | { type: \.variable (bytes) | { unallocated (30) | bool: Initializable._initializing (1) | bool: Initializable._initialized (1) } | { <53> uint256[50]: ContextUpgradeable.__gap (1600) } | { unallocated (31) | bool: PausableUpgradeable._paused (1) } | { <104> uint256[49]: PausableUpgradeable.__gap (1568) } | { unallocated (16) | uint64: RollupCore.extraChallengeTimeBlocks (8) | uint64: RollupCore.confirmPeriodBlocks (8) } | { uint256: RollupCore.chainId (32) } | { uint256: RollupCore.baseStake (32) } | { bytes32: RollupCore.wasmModuleRoot (32) } | { unallocated (12) | IInboxBase: RollupCore.inbox (20) } | { unallocated (12) | IBridge: RollupCore.bridge (20) } | { unallocated (12) | IOutbox: RollupCore.outbox (20) } | { unallocated (12) | ISequencerInbox: RollupCore.sequencerInbox (20) } | { unallocated (12) | IRollupEventInbox: RollupCore.rollupEventInbox (20) } | { unallocated (12) | IChallengeManager: RollupCore.challengeManager (20) } | { unallocated (12) | address: RollupCore.validatorUtils (20) } | { unallocated (12) | address: RollupCore.validatorWalletCreator (20) } | { unallocated (12) | address: RollupCore.loserStakeEscrow (20) } | { unallocated (12) | address: RollupCore.stakeToken (20) } | { uint256: RollupCore.minimumAssertionPeriod (32) } | { mapping\(address=\>bool\): RollupCore.isValidator (32) } | { uint64: RollupCore._lastStakeBlock (8) | uint64: RollupCore._latestNodeCreated (8) | uint64: RollupCore._firstUnresolvedNode (8) | uint64: RollupCore._latestConfirmed (8) } | { <138> mapping\(uint64=\>Node\): RollupCore._nodes (32) } | { mapping\(uint64=\>mapping\(address=\>bool\)\): RollupCore._nodeStakers (32) } | { <141> address[]: RollupCore._stakerList (32) } | { <147> mapping\(address=\>Staker\): RollupCore._stakerMap (32) } | { <151> Zombie[]: RollupCore._zombies (32) } | { mapping\(address=\>uint256\): RollupCore._withdrawableFunds (32) } | { uint256: RollupCore.totalWithdrawableFunds (32) } | { uint256: RollupCore.rollupDeploymentBlock (32) } | { unallocated (31) | bool: RollupCore.validatorWhitelistDisabled (1) } | { mapping\(uint64=\>uint256\): RollupCore._nodeCreatedAtArbSysBlock (32) }}}"] - -1 [label="uint256[50]: __gap \<\\>\n | {{ slot| 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 } | { type: variable (bytes) | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) }}}"] - -2 [label="uint256[49]: __gap \<\\>\n | {{ slot| 52 | 53 | 54 | 55 | 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 | 72 | 73 | 74 | 75 | 76 | 77 | 78 | 79 | 80 | 81 | 82 | 83 | 84 | 85 | 86 | 87 | 88 | 89 | 90 | 91 | 92 | 93 | 94 | 95 | 96 | 97 | 98 | 99 | 100 } | { type: variable (bytes) | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) }}}"] - -3 [label="Node \<\\>\n | {{ slot| 0 | 1 | 2 | 3 | 4 | 5 } | { type: variable (bytes) | { bytes32: stateHash (32) } | { bytes32: challengeHash (32) } | { bytes32: confirmData (32) } | { uint64: stakerCount (8) | uint64: noChildConfirmedBeforeBlock (8) | uint64: deadlineBlock (8) | uint64: prevNum (8) } | { uint64: createdAtBlock (8) | uint64: latestChildNumber (8) | uint64: firstChildBlock (8) | uint64: childStakerCount (8) } | { bytes32: nodeHash (32) }}}"] - -4 [label="address[]: _stakerList \<\\>\n0x315040cf50a9fea58aa3302eb9bbbb1153c7ed7311c4e1c76711b1190d535025 | {{ slot| 0 } | { type: variable (bytes) | { unallocated (12) | address (20) }}}"] - -5 [label="Staker \<\\>\n | {{ slot| 0 | 1 } | { type: variable (bytes) | { uint256: amountStaked (32) } | { unallocated (7) | bool: isStaked (1) | uint64: currentChallenge (8) | uint64: latestStakedNode (8) | uint64: index (8) }}}"] - -6 [label="Zombie \<\\>\n | {{ slot| 0 } | { type: variable (bytes) | { unallocated (4) | uint64: latestStakedNode (8) | address: stakerAddress (20) }}}"] - -7 [label="Zombie[]: _zombies \<\\>\n0x8e4a4be60bf9672655845da331c63e49fa2a771e90e72dc554369cbb34aae7b8 | {{ slot| 0 } | { type: variable (bytes) | { <148> Zombie (32) }}}"] - - 8:53 -> 1 - 8:104 -> 2 - 8:138 -> 3 - 8:141 -> 4 - 8:147 -> 5 - 8:151 -> 7 - 7:148 -> 6 -} \ No newline at end of file diff --git a/test/storage/RollupCore-old.dot b/test/storage/RollupCore-old.dot deleted file mode 100644 index 2307dcc5..00000000 --- a/test/storage/RollupCore-old.dot +++ /dev/null @@ -1,30 +0,0 @@ - -digraph StorageDiagram { -rankdir=LR -color=black -arrowhead=open -node [shape=record, style=filled, fillcolor=gray95 fontname="Courier New"] -8 [label="RollupCore \<\\>\n | {{ slot| 0 | 1-50 | 51 | 52-100 | 101 | 102 | 103 | 104 | 105 | 106 | 107 | 108 | 109 | 110 | 111 | 112 | 113 | 114 | 115 | 116 | 117 | 118 | 119 | 120 | 121 | 122 | 123 | 124 | 125 | 126 | 127 } | { type: \.variable (bytes) | { unallocated (30) | bool: Initializable._initializing (1) | bool: Initializable._initialized (1) } | { <53> uint256[50]: ContextUpgradeable.__gap (1600) } | { unallocated (31) | bool: PausableUpgradeable._paused (1) } | { <104> uint256[49]: PausableUpgradeable.__gap (1568) } | { unallocated (16) | uint64: extraChallengeTimeBlocks (8) | uint64: confirmPeriodBlocks (8) } | { uint256: chainId (32) } | { uint256: baseStake (32) } | { bytes32: wasmModuleRoot (32) } | { unallocated (12) | IInboxBase: inbox (20) } | { unallocated (12) | IBridge: bridge (20) } | { unallocated (12) | IOutbox: outbox (20) } | { unallocated (12) | ISequencerInbox: sequencerInbox (20) } | { unallocated (12) | IRollupEventInbox: rollupEventInbox (20) } | { unallocated (12) | IChallengeManager: challengeManager (20) } | { unallocated (12) | address: validatorUtils (20) } | { unallocated (12) | address: validatorWalletCreator (20) } | { unallocated (12) | address: loserStakeEscrow (20) } | { unallocated (12) | address: stakeToken (20) } | { uint256: minimumAssertionPeriod (32) } | { mapping\(address=\>bool\): isValidator (32) } | { uint64: _lastStakeBlock (8) | uint64: _latestNodeCreated (8) | uint64: _firstUnresolvedNode (8) | uint64: _latestConfirmed (8) } | { <138> mapping\(uint64=\>Node\): _nodes (32) } | { mapping\(uint64=\>mapping\(address=\>bool\)\): _nodeStakers (32) } | { <141> address[]: _stakerList (32) } | { <147> mapping\(address=\>Staker\): _stakerMap (32) } | { <151> Zombie[]: _zombies (32) } | { mapping\(address=\>uint256\): _withdrawableFunds (32) } | { uint256: totalWithdrawableFunds (32) } | { uint256: rollupDeploymentBlock (32) } | { unallocated (31) | bool: validatorWhitelistDisabled (1) } | { mapping\(uint64=\>uint256\): _nodeCreatedAtArbSysBlock (32) }}}"] - -1 [label="uint256[50]: __gap \<\\>\n | {{ slot| 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 } | { type: variable (bytes) | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) }}}"] - -2 [label="uint256[49]: __gap \<\\>\n | {{ slot| 52 | 53 | 54 | 55 | 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 | 72 | 73 | 74 | 75 | 76 | 77 | 78 | 79 | 80 | 81 | 82 | 83 | 84 | 85 | 86 | 87 | 88 | 89 | 90 | 91 | 92 | 93 | 94 | 95 | 96 | 97 | 98 | 99 | 100 } | { type: variable (bytes) | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) }}}"] - -3 [label="Node \<\\>\n | {{ slot| 0 | 1 | 2 | 3 | 4 | 5 } | { type: variable (bytes) | { bytes32: stateHash (32) } | { bytes32: challengeHash (32) } | { bytes32: confirmData (32) } | { uint64: stakerCount (8) | uint64: noChildConfirmedBeforeBlock (8) | uint64: deadlineBlock (8) | uint64: prevNum (8) } | { uint64: createdAtBlock (8) | uint64: latestChildNumber (8) | uint64: firstChildBlock (8) | uint64: childStakerCount (8) } | { bytes32: nodeHash (32) }}}"] - -4 [label="address[]: _stakerList \<\\>\n0x315040cf50a9fea58aa3302eb9bbbb1153c7ed7311c4e1c76711b1190d535025 | {{ slot| 0 } | { type: variable (bytes) | { unallocated (12) | address (20) }}}"] - -5 [label="Staker \<\\>\n | {{ slot| 0 | 1 } | { type: variable (bytes) | { uint256: amountStaked (32) } | { unallocated (7) | bool: isStaked (1) | uint64: currentChallenge (8) | uint64: latestStakedNode (8) | uint64: index (8) }}}"] - -6 [label="Zombie \<\\>\n | {{ slot| 0 } | { type: variable (bytes) | { unallocated (4) | uint64: latestStakedNode (8) | address: stakerAddress (20) }}}"] - -7 [label="Zombie[]: _zombies \<\\>\n0x8e4a4be60bf9672655845da331c63e49fa2a771e90e72dc554369cbb34aae7b8 | {{ slot| 0 } | { type: variable (bytes) | { <148> Zombie (32) }}}"] - - 8:53 -> 1 - 8:104 -> 2 - 8:138 -> 3 - 8:141 -> 4 - 8:147 -> 5 - 8:151 -> 7 - 7:148 -> 6 -} \ No newline at end of file diff --git a/test/storage/RollupUserLogic-old.dot b/test/storage/RollupUserLogic-old.dot deleted file mode 100644 index bd7576a3..00000000 --- a/test/storage/RollupUserLogic-old.dot +++ /dev/null @@ -1,30 +0,0 @@ - -digraph StorageDiagram { -rankdir=LR -color=black -arrowhead=open -node [shape=record, style=filled, fillcolor=gray95 fontname="Courier New"] -8 [label="RollupUserLogic \<\\>\n | {{ slot| 0 | 1-50 | 51 | 52-100 | 101 | 102 | 103 | 104 | 105 | 106 | 107 | 108 | 109 | 110 | 111 | 112 | 113 | 114 | 115 | 116 | 117 | 118 | 119 | 120 | 121 | 122 | 123 | 124 | 125 | 126 | 127 } | { type: \.variable (bytes) | { unallocated (30) | bool: Initializable._initializing (1) | bool: Initializable._initialized (1) } | { <53> uint256[50]: ContextUpgradeable.__gap (1600) } | { unallocated (31) | bool: PausableUpgradeable._paused (1) } | { <104> uint256[49]: PausableUpgradeable.__gap (1568) } | { unallocated (16) | uint64: RollupCore.extraChallengeTimeBlocks (8) | uint64: RollupCore.confirmPeriodBlocks (8) } | { uint256: RollupCore.chainId (32) } | { uint256: RollupCore.baseStake (32) } | { bytes32: RollupCore.wasmModuleRoot (32) } | { unallocated (12) | IInboxBase: RollupCore.inbox (20) } | { unallocated (12) | IBridge: RollupCore.bridge (20) } | { unallocated (12) | IOutbox: RollupCore.outbox (20) } | { unallocated (12) | ISequencerInbox: RollupCore.sequencerInbox (20) } | { unallocated (12) | IRollupEventInbox: RollupCore.rollupEventInbox (20) } | { unallocated (12) | IChallengeManager: RollupCore.challengeManager (20) } | { unallocated (12) | address: RollupCore.validatorUtils (20) } | { unallocated (12) | address: RollupCore.validatorWalletCreator (20) } | { unallocated (12) | address: RollupCore.loserStakeEscrow (20) } | { unallocated (12) | address: RollupCore.stakeToken (20) } | { uint256: RollupCore.minimumAssertionPeriod (32) } | { mapping\(address=\>bool\): RollupCore.isValidator (32) } | { uint64: RollupCore._lastStakeBlock (8) | uint64: RollupCore._latestNodeCreated (8) | uint64: RollupCore._firstUnresolvedNode (8) | uint64: RollupCore._latestConfirmed (8) } | { <138> mapping\(uint64=\>Node\): RollupCore._nodes (32) } | { mapping\(uint64=\>mapping\(address=\>bool\)\): RollupCore._nodeStakers (32) } | { <141> address[]: RollupCore._stakerList (32) } | { <147> mapping\(address=\>Staker\): RollupCore._stakerMap (32) } | { <151> Zombie[]: RollupCore._zombies (32) } | { mapping\(address=\>uint256\): RollupCore._withdrawableFunds (32) } | { uint256: RollupCore.totalWithdrawableFunds (32) } | { uint256: RollupCore.rollupDeploymentBlock (32) } | { unallocated (31) | bool: RollupCore.validatorWhitelistDisabled (1) } | { mapping\(uint64=\>uint256\): RollupCore._nodeCreatedAtArbSysBlock (32) }}}"] - -1 [label="uint256[50]: __gap \<\\>\n | {{ slot| 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 } | { type: variable (bytes) | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) }}}"] - -2 [label="uint256[49]: __gap \<\\>\n | {{ slot| 52 | 53 | 54 | 55 | 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 | 72 | 73 | 74 | 75 | 76 | 77 | 78 | 79 | 80 | 81 | 82 | 83 | 84 | 85 | 86 | 87 | 88 | 89 | 90 | 91 | 92 | 93 | 94 | 95 | 96 | 97 | 98 | 99 | 100 } | { type: variable (bytes) | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) }}}"] - -3 [label="Node \<\\>\n | {{ slot| 0 | 1 | 2 | 3 | 4 | 5 } | { type: variable (bytes) | { bytes32: stateHash (32) } | { bytes32: challengeHash (32) } | { bytes32: confirmData (32) } | { uint64: stakerCount (8) | uint64: noChildConfirmedBeforeBlock (8) | uint64: deadlineBlock (8) | uint64: prevNum (8) } | { uint64: createdAtBlock (8) | uint64: latestChildNumber (8) | uint64: firstChildBlock (8) | uint64: childStakerCount (8) } | { bytes32: nodeHash (32) }}}"] - -4 [label="address[]: _stakerList \<\\>\n0x315040cf50a9fea58aa3302eb9bbbb1153c7ed7311c4e1c76711b1190d535025 | {{ slot| 0 } | { type: variable (bytes) | { unallocated (12) | address (20) }}}"] - -5 [label="Staker \<\\>\n | {{ slot| 0 | 1 } | { type: variable (bytes) | { uint256: amountStaked (32) } | { unallocated (7) | bool: isStaked (1) | uint64: currentChallenge (8) | uint64: latestStakedNode (8) | uint64: index (8) }}}"] - -6 [label="Zombie \<\\>\n | {{ slot| 0 } | { type: variable (bytes) | { unallocated (4) | uint64: latestStakedNode (8) | address: stakerAddress (20) }}}"] - -7 [label="Zombie[]: _zombies \<\\>\n0x8e4a4be60bf9672655845da331c63e49fa2a771e90e72dc554369cbb34aae7b8 | {{ slot| 0 } | { type: variable (bytes) | { <148> Zombie (32) }}}"] - - 8:53 -> 1 - 8:104 -> 2 - 8:138 -> 3 - 8:141 -> 4 - 8:147 -> 5 - 8:151 -> 7 - 7:148 -> 6 -} \ No newline at end of file diff --git a/test/storage/SequencerInbox-old.dot b/test/storage/SequencerInbox-old.dot deleted file mode 100644 index 7c268d5c..00000000 --- a/test/storage/SequencerInbox-old.dot +++ /dev/null @@ -1,15 +0,0 @@ - -digraph StorageDiagram { -rankdir=LR -color=black -arrowhead=open -node [shape=record, style=filled, fillcolor=gray95 fontname="Courier New"] -3 [label="SequencerInbox \<\\>\n | {{ slot| 0 | 1 | 2 | 3 | 4-7 | 8 | 9 | 10 } | { type: \.variable (bytes) | { uint256: totalDelayedMessagesRead (32) } | { unallocated (12) | IBridge: bridge (20) } | { unallocated (12) | IOwnable: rollup (20) } | { mapping\(address=\>bool\): isBatchPoster (32) } | { <9> ISequencerInbox.MaxTimeVariation: maxTimeVariation (128) } | { <12> mapping\(bytes32=\>DasKeySetInfo\): dasKeySetInfo (32) } | { mapping\(address=\>bool\): isSequencer (32) } | { unallocated (12) | IDataHashReader: dataHashReader (20) }}}"] - -1 [label="ISequencerInbox.MaxTimeVariation \<\\>\n | {{ slot| 4 | 5 | 6 | 7 } | { type: variable (bytes) | { uint256: MaxTimeVariation.delayBlocks (32) } | { uint256: MaxTimeVariation.futureBlocks (32) } | { uint256: MaxTimeVariation.delaySeconds (32) } | { uint256: MaxTimeVariation.futureSeconds (32) }}}"] - -2 [label="DasKeySetInfo \<\\>\n | {{ slot| 0 } | { type: variable (bytes) | { unallocated (23) | uint64: creationBlock (8) | bool: isValidKeyset (1) }}}"] - - 3:9 -> 1 - 3:12 -> 2 -} \ No newline at end of file From 9d9960d8299cee32d06f539e4e13c5ccf9973d75 Mon Sep 17 00:00:00 2001 From: Chris Buckland Date: Thu, 2 Nov 2023 18:22:50 +0100 Subject: [PATCH 224/292] Added some basic seq inbox foundry tests --- foundry.toml | 5 + test/foundry/SequencerInbox.t.sol | 232 ++++++++++++++++++++++++++++++ test/foundry/util/TestUtil.sol | 21 +++ 3 files changed, 258 insertions(+) create mode 100644 test/foundry/SequencerInbox.t.sol diff --git a/foundry.toml b/foundry.toml index 2512e19b..d9e2fff2 100644 --- a/foundry.toml +++ b/foundry.toml @@ -7,6 +7,11 @@ cache_path = 'forge-cache' optimizer = true optimizer_runs = 20000 via_ir = false +# 0.8.21 has a bug which causes compilation failure in the tests +# https://github.com/ethereum/solidity/issues/14430 +# however .22 is not shipped as default in foundry yet +# we can remove the line below when it is +solc_version = '0.8.22' [fmt] number_underscore = 'thousands' diff --git a/test/foundry/SequencerInbox.t.sol b/test/foundry/SequencerInbox.t.sol new file mode 100644 index 00000000..3be51b44 --- /dev/null +++ b/test/foundry/SequencerInbox.t.sol @@ -0,0 +1,232 @@ +// SPDX-License-Identifier: UNLICENSED +pragma solidity ^0.8.4; + +import "forge-std/Test.sol"; +import "./util/TestUtil.sol"; +import "../../src/bridge/Bridge.sol"; +import "../../src/bridge/SequencerInbox.sol"; + +contract RollupMock { + address immutable public owner; + constructor(address _owner) { + owner = _owner; + } +} + +contract SequencerInboxTest is Test { + Random RAND = new Random(); + address rollupOwner = address(137); + uint256 maxDataSize = 10000; + ISequencerInbox.MaxTimeVariation maxTimeVariation = ISequencerInbox.MaxTimeVariation({ + delayBlocks: 10, + futureBlocks: 10, + delaySeconds: 100, + futureSeconds: 100 + }); + address dummyInbox = address(139); + address proxyAdmin = address(140); + + + + function deploy() public returns(SequencerInbox, Bridge) { + RollupMock rollupMock = new RollupMock(rollupOwner); + Bridge bridgeImpl = new Bridge(); + Bridge bridge = Bridge(address(new TransparentUpgradeableProxy(address(bridgeImpl), proxyAdmin, ""))); + + bridge.initialize(IOwnable(address(rollupMock))); + vm.prank(rollupOwner); + bridge.setDelayedInbox(dummyInbox, true); + + SequencerInbox seqInboxImpl = new SequencerInbox(maxDataSize); + SequencerInbox seqInbox = SequencerInbox(address(new TransparentUpgradeableProxy(address(seqInboxImpl), proxyAdmin, ""))); + seqInbox.initialize( + bridge, + maxTimeVariation + ); + + vm.prank(rollupOwner); + seqInbox.setIsBatchPoster(tx.origin, true); + + vm.prank(rollupOwner); + bridge.setSequencerInbox(address(seqInbox)); + + return (seqInbox, bridge); + } + + function expectEvents(Bridge bridge, SequencerInbox seqInbox, bytes memory data) internal { + uint256 delayedMessagesRead = bridge.delayedMessageCount(); + uint256 sequenceNumber = bridge.sequencerMessageCount(); + ISequencerInbox.TimeBounds memory timeBounds; + if (block.timestamp > maxTimeVariation.delaySeconds) { + timeBounds.minTimestamp = uint64(block.timestamp - maxTimeVariation.delaySeconds); + } + timeBounds.maxTimestamp = uint64(block.timestamp + maxTimeVariation.futureSeconds); + if (block.number > maxTimeVariation.delayBlocks) { + timeBounds.minBlockNumber = uint64(block.number - maxTimeVariation.delayBlocks); + } + timeBounds.maxBlockNumber = uint64(block.number + maxTimeVariation.futureBlocks); + bytes32 dataHash = keccak256(bytes.concat(abi.encodePacked( + timeBounds.minTimestamp, + timeBounds.maxTimestamp, + timeBounds.minBlockNumber, + timeBounds.maxBlockNumber, + uint64(delayedMessagesRead) + ), data)); + + bytes memory spendingReportMsg = abi.encodePacked( + block.timestamp, + msg.sender, + dataHash, + sequenceNumber, + block.basefee + ); + bytes32 beforeAcc = bytes32(0); + bytes32 delayedAcc = bridge.delayedInboxAccs(delayedMessagesRead - 1); + bytes32 afterAcc = keccak256(abi.encodePacked(beforeAcc, dataHash, delayedAcc)); + + // spending report + vm.expectEmit(); + emit IBridge.MessageDelivered( + delayedMessagesRead, + delayedAcc, + address(seqInbox), + L1MessageType_batchPostingReport, + tx.origin, + keccak256(spendingReportMsg), + block.basefee, + uint64(block.timestamp) + ); + + // spending report event in seq inbox + vm.expectEmit(); + emit IDelayedMessageProvider.InboxMessageDelivered( + delayedMessagesRead, + spendingReportMsg + ); + + // sequencer batch delivered + vm.expectEmit(); + emit ISequencerInbox.SequencerBatchDelivered( + sequenceNumber, + beforeAcc, + afterAcc, + delayedAcc, + delayedMessagesRead, + timeBounds, + ISequencerInbox.BatchDataLocation.TxInput + ); + } + + function testAddSequencerL2BatchFromOrigin() public { + (SequencerInbox seqInbox, Bridge bridge) = deploy(); + address delayedInboxSender = address(140); + uint8 delayedInboxKind = 3; + bytes32 messageDataHash = RAND.Bytes32(); + bytes memory data = hex"a4567890"; // CHRIS: TODO: bigger data; + + vm.prank(dummyInbox); + bridge.enqueueDelayedMessage( + delayedInboxKind, + delayedInboxSender, + messageDataHash + ); + + uint256 subMessageCount = bridge.sequencerReportedSubMessageCount(); + uint256 sequenceNumber = bridge.sequencerMessageCount(); + uint256 delayedMessagesRead = bridge.delayedMessageCount(); + + expectEvents(bridge, seqInbox, data); + + vm.prank(tx.origin); + seqInbox.addSequencerL2BatchFromOrigin( + sequenceNumber, + data, + delayedMessagesRead, + IGasRefunder(address(0)), + subMessageCount, + subMessageCount + 1 + ); + } + + function testAddSequencerL2BatchFromOriginRevers() public { + (SequencerInbox seqInbox, Bridge bridge) = deploy(); + address delayedInboxSender = address(140); + uint8 delayedInboxKind = 3; + bytes32 messageDataHash = RAND.Bytes32(); + bytes memory data = hex"a4567890"; // CHRIS: TODO: bigger data; + + vm.prank(dummyInbox); + bridge.enqueueDelayedMessage( + delayedInboxKind, + delayedInboxSender, + messageDataHash + ); + + uint256 subMessageCount = bridge.sequencerReportedSubMessageCount(); + uint256 sequenceNumber = bridge.sequencerMessageCount(); + uint256 delayedMessagesRead = bridge.delayedMessageCount(); + + vm.expectRevert(abi.encodeWithSelector(NotOrigin.selector)); + seqInbox.addSequencerL2BatchFromOrigin( + sequenceNumber, + data, + delayedMessagesRead, + IGasRefunder(address(0)), + subMessageCount, + subMessageCount + 1 + ); + + + vm.prank(rollupOwner); + seqInbox.setIsBatchPoster(tx.origin, false); + + vm.expectRevert(abi.encodeWithSelector(NotBatchPoster.selector)); + vm.prank(tx.origin); + seqInbox.addSequencerL2BatchFromOrigin( + sequenceNumber, + data, + delayedMessagesRead, + IGasRefunder(address(0)), + subMessageCount, + subMessageCount + 1 + ); + + vm.prank(rollupOwner); + seqInbox.setIsBatchPoster(tx.origin, true); + + bytes memory bigData = bytes.concat(hex"20", RAND.Bytes(maxDataSize - seqInbox.HEADER_LENGTH())); + vm.expectRevert(abi.encodeWithSelector(DataTooLarge.selector, bigData.length + seqInbox.HEADER_LENGTH(), maxDataSize)); + vm.prank(tx.origin); + seqInbox.addSequencerL2BatchFromOrigin( + sequenceNumber, + bigData, + delayedMessagesRead, + IGasRefunder(address(0)), + subMessageCount, + subMessageCount + 1 + ); + + bytes memory authenticatedData = bytes.concat(seqInbox.DATA_AUTHENTICATED_FLAG(), data); + vm.expectRevert(abi.encodeWithSelector(DataNotAuthenticated.selector)); + vm.prank(tx.origin); + seqInbox.addSequencerL2BatchFromOrigin( + sequenceNumber, + authenticatedData, + delayedMessagesRead, + IGasRefunder(address(0)), + subMessageCount, + subMessageCount + 1 + ); + + vm.expectRevert(abi.encodeWithSelector(BadSequencerNumber.selector, sequenceNumber, sequenceNumber + 5)); + vm.prank(tx.origin); + seqInbox.addSequencerL2BatchFromOrigin( + sequenceNumber + 5, + data, + delayedMessagesRead, + IGasRefunder(address(0)), + subMessageCount, + subMessageCount + 1 + ); + } +} \ No newline at end of file diff --git a/test/foundry/util/TestUtil.sol b/test/foundry/util/TestUtil.sol index 27b32658..63e3f84e 100644 --- a/test/foundry/util/TestUtil.sol +++ b/test/foundry/util/TestUtil.sol @@ -10,3 +10,24 @@ library TestUtil { return address(new TransparentUpgradeableProxy(address(logic), address(pa), "")); } } + +contract Random { + bytes32 seed = bytes32(uint256(0x137)); + + function Bytes32() public returns(bytes32) { + seed = keccak256(abi.encodePacked(seed)); + return seed; + } + + function Bytes(uint256 length) public returns(bytes memory) { + require(length > 0, "Length must be greater than 0"); + bytes memory randomBytes = new bytes(length); + + for (uint256 i = 0; i < length; i++) { + Bytes32(); + randomBytes[i] = bytes1(uint8(uint256(seed) % 256)); + } + + return randomBytes; + } +} From c382f8fbd4f1ebb150f41912c004d83c6726a6fa Mon Sep 17 00:00:00 2001 From: Chris Buckland Date: Fri, 3 Nov 2023 14:40:22 +0100 Subject: [PATCH 225/292] Set foundry toml at 0.8.9 --- foundry.toml | 6 +----- test/foundry/SequencerInbox.t.sol | 32 ++++++++++++++++++++++++++----- 2 files changed, 28 insertions(+), 10 deletions(-) diff --git a/foundry.toml b/foundry.toml index d9e2fff2..e5297783 100644 --- a/foundry.toml +++ b/foundry.toml @@ -7,11 +7,7 @@ cache_path = 'forge-cache' optimizer = true optimizer_runs = 20000 via_ir = false -# 0.8.21 has a bug which causes compilation failure in the tests -# https://github.com/ethereum/solidity/issues/14430 -# however .22 is not shipped as default in foundry yet -# we can remove the line below when it is -solc_version = '0.8.22' +solc_version = '0.8.9' [fmt] number_underscore = 'thousands' diff --git a/test/foundry/SequencerInbox.t.sol b/test/foundry/SequencerInbox.t.sol index 3be51b44..9f9cbcfd 100644 --- a/test/foundry/SequencerInbox.t.sol +++ b/test/foundry/SequencerInbox.t.sol @@ -14,6 +14,30 @@ contract RollupMock { } contract SequencerInboxTest is Test { + // cannot reference events outside of the original contract until 0.8.21 + // we currently use 0.8.9 + event MessageDelivered( + uint256 indexed messageIndex, + bytes32 indexed beforeInboxAcc, + address inbox, + uint8 kind, + address sender, + bytes32 messageDataHash, + uint256 baseFeeL1, + uint64 timestamp + ); + event InboxMessageDelivered(uint256 indexed messageNum, bytes data); + event SequencerBatchDelivered( + uint256 indexed batchSequenceNumber, + bytes32 indexed beforeAcc, + bytes32 indexed afterAcc, + bytes32 delayedAcc, + uint256 afterDelayedMessagesRead, + ISequencerInbox.TimeBounds timeBounds, + ISequencerInbox.BatchDataLocation dataLocation + ); + + Random RAND = new Random(); address rollupOwner = address(137); uint256 maxDataSize = 10000; @@ -25,8 +49,6 @@ contract SequencerInboxTest is Test { }); address dummyInbox = address(139); address proxyAdmin = address(140); - - function deploy() public returns(SequencerInbox, Bridge) { RollupMock rollupMock = new RollupMock(rollupOwner); @@ -86,7 +108,7 @@ contract SequencerInboxTest is Test { // spending report vm.expectEmit(); - emit IBridge.MessageDelivered( + emit MessageDelivered( delayedMessagesRead, delayedAcc, address(seqInbox), @@ -99,14 +121,14 @@ contract SequencerInboxTest is Test { // spending report event in seq inbox vm.expectEmit(); - emit IDelayedMessageProvider.InboxMessageDelivered( + emit InboxMessageDelivered( delayedMessagesRead, spendingReportMsg ); // sequencer batch delivered vm.expectEmit(); - emit ISequencerInbox.SequencerBatchDelivered( + emit SequencerBatchDelivered( sequenceNumber, beforeAcc, afterAcc, From a29d1436d885ee3398de6d66b6e99d150376acc7 Mon Sep 17 00:00:00 2001 From: Chris Buckland Date: Fri, 3 Nov 2023 16:46:44 +0100 Subject: [PATCH 226/292] Added comment about missing revert --- src/bridge/SequencerInbox.sol | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/bridge/SequencerInbox.sol b/src/bridge/SequencerInbox.sol index 5344f773..fc1caa07 100644 --- a/src/bridge/SequencerInbox.sol +++ b/src/bridge/SequencerInbox.sol @@ -226,6 +226,8 @@ contract SequencerInbox is GasRefundEnabled, ISequencerInbox { ); } + // CHRIS: TODO: we're missing the old one with just the revert here + function addSequencerL2BatchFromOrigin( uint256 sequenceNumber, bytes calldata data, From bdde4cd403bdb9f3d5e084844b9cf0abaaece292 Mon Sep 17 00:00:00 2001 From: Chris Buckland Date: Mon, 13 Nov 2023 18:15:44 +0100 Subject: [PATCH 227/292] Dont call deploy script --- test/contract/arbRollup.spec.ts | 6 ------ 1 file changed, 6 deletions(-) diff --git a/test/contract/arbRollup.spec.ts b/test/contract/arbRollup.spec.ts index ac836d1d..d9d44da9 100644 --- a/test/contract/arbRollup.spec.ts +++ b/test/contract/arbRollup.spec.ts @@ -505,12 +505,6 @@ const impersonateAccount = (address: string) => .then(() => ethers.getSigner(address)) describe('ArbRollup', () => { - it('should deploy contracts', async function () { - accounts = await initializeAccounts() - - await run('deploy', { tags: 'test' }) - }) - it('should initialize', async function () { const { rollupAdmin: rollupAdminContract, From 1481510238ad12528e04db0b61ff745087b469b4 Mon Sep 17 00:00:00 2001 From: Chris Buckland Date: Mon, 13 Nov 2023 18:17:18 +0100 Subject: [PATCH 228/292] Removed deploy script from tests --- test/contract/arbRollup.spec.ts | 6 ------ 1 file changed, 6 deletions(-) diff --git a/test/contract/arbRollup.spec.ts b/test/contract/arbRollup.spec.ts index 6768e6c9..3e052f46 100644 --- a/test/contract/arbRollup.spec.ts +++ b/test/contract/arbRollup.spec.ts @@ -500,12 +500,6 @@ const impersonateAccount = (address: string) => .then(() => ethers.getSigner(address)) describe('ArbRollup', () => { - it('should deploy contracts', async function () { - accounts = await initializeAccounts() - - await run('deploy', { tags: 'test' }) - }) - it('should initialize', async function () { const { rollupAdmin: rollupAdminContract, From 2cebe85c2f171101a3ed971a095bb19a777d6d12 Mon Sep 17 00:00:00 2001 From: Chris Buckland Date: Mon, 13 Nov 2023 18:42:06 +0100 Subject: [PATCH 229/292] Added console log --- test/contract/sequencerInbox.spec.4844.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/test/contract/sequencerInbox.spec.4844.ts b/test/contract/sequencerInbox.spec.4844.ts index a4323964..e88c3143 100644 --- a/test/contract/sequencerInbox.spec.4844.ts +++ b/test/contract/sequencerInbox.spec.4844.ts @@ -558,6 +558,7 @@ describe('SequencerInbox', async () => { maxTimestamp: number }> => { const maxTimeVariation = await sequencerInbox.maxTimeVariation() + console.log(maxTimeVariation); return { minBlocks: blockNumber > maxTimeVariation.delayBlocks.toNumber() From 94d9be05ef1ea226966c830346ffaccb9dbbdf22 Mon Sep 17 00:00:00 2001 From: Chris Buckland Date: Mon, 13 Nov 2023 18:49:44 +0100 Subject: [PATCH 230/292] Formatting --- test/contract/sequencerInbox.spec.4844.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/contract/sequencerInbox.spec.4844.ts b/test/contract/sequencerInbox.spec.4844.ts index e88c3143..03b947ca 100644 --- a/test/contract/sequencerInbox.spec.4844.ts +++ b/test/contract/sequencerInbox.spec.4844.ts @@ -558,7 +558,7 @@ describe('SequencerInbox', async () => { maxTimestamp: number }> => { const maxTimeVariation = await sequencerInbox.maxTimeVariation() - console.log(maxTimeVariation); + console.log(maxTimeVariation) return { minBlocks: blockNumber > maxTimeVariation.delayBlocks.toNumber() From 38330be3c960d7fbebaba38def5e4affd590d745 Mon Sep 17 00:00:00 2001 From: Chris Buckland Date: Mon, 13 Nov 2023 18:51:25 +0100 Subject: [PATCH 231/292] Updated maxtimevariation logging --- test/contract/sequencerInbox.spec.4844.ts | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/test/contract/sequencerInbox.spec.4844.ts b/test/contract/sequencerInbox.spec.4844.ts index 03b947ca..2dba8b06 100644 --- a/test/contract/sequencerInbox.spec.4844.ts +++ b/test/contract/sequencerInbox.spec.4844.ts @@ -558,7 +558,12 @@ describe('SequencerInbox', async () => { maxTimestamp: number }> => { const maxTimeVariation = await sequencerInbox.maxTimeVariation() - console.log(maxTimeVariation) + console.log( + 'maxTimeVariation', + sequencerInbox.address, + (await sequencerInbox.provider.getCode(sequencerInbox.address)).length, + maxTimeVariation + ) return { minBlocks: blockNumber > maxTimeVariation.delayBlocks.toNumber() From 9b6f9a6700872f85fdb89fe8cd70241d1ae23ae0 Mon Sep 17 00:00:00 2001 From: Chris Buckland Date: Tue, 14 Nov 2023 14:10:35 +0100 Subject: [PATCH 232/292] Initialize accounts in arbrollup tests --- test/contract/arbRollup.spec.ts | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/test/contract/arbRollup.spec.ts b/test/contract/arbRollup.spec.ts index 3e052f46..873ecc53 100644 --- a/test/contract/arbRollup.spec.ts +++ b/test/contract/arbRollup.spec.ts @@ -500,6 +500,10 @@ const impersonateAccount = (address: string) => .then(() => ethers.getSigner(address)) describe('ArbRollup', () => { + it('should initialize contracts', async function () { + accounts = await initializeAccounts() + }) + it('should initialize', async function () { const { rollupAdmin: rollupAdminContract, From 4cd2a679daafd71ce203c0310122f7ce27a4b8fc Mon Sep 17 00:00:00 2001 From: Chris Buckland Date: Tue, 14 Nov 2023 14:14:02 +0100 Subject: [PATCH 233/292] Added test logging --- test/contract/sequencerInbox.spec.4844.ts | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/test/contract/sequencerInbox.spec.4844.ts b/test/contract/sequencerInbox.spec.4844.ts index 2dba8b06..e7c9db61 100644 --- a/test/contract/sequencerInbox.spec.4844.ts +++ b/test/contract/sequencerInbox.spec.4844.ts @@ -372,14 +372,19 @@ describe('SequencerInbox', async () => { } it('can send normal batch', async () => { + console.log("a") const privKey = 'cb5790da63720727af975f42c79f69918580209889225fa7128c92402a6d3a65' const prov = new JsonRpcProvider('http://127.0.0.1:8545') + console.log("b") const wallet = new Wallet(privKey).connect(prov) + console.log("c") const { user, inbox, bridge, messageTester, sequencerInbox, batchPoster } = await setupSequencerInbox(wallet) + console.log("d") + await sendDelayedTx( user, inbox, @@ -392,6 +397,7 @@ describe('SequencerInbox', async () => { BigNumber.from(10), '0x1010' ) + console.log("e") const subMessageCount = await bridge.sequencerReportedSubMessageCount() const batchSendTx = await sequencerInbox @@ -406,6 +412,7 @@ describe('SequencerInbox', async () => { subMessageCount, subMessageCount.add(1) ) + console.log("f") await batchSendTx.wait() }) From bed2234c816efed44246cfb3bda9a785caf85cd4 Mon Sep 17 00:00:00 2001 From: Chris Buckland Date: Tue, 14 Nov 2023 14:20:39 +0100 Subject: [PATCH 234/292] Updated seq inbox storage dot --- test/storage/SequencerInbox | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/test/storage/SequencerInbox b/test/storage/SequencerInbox index 28d58281..4ef0679b 100644 --- a/test/storage/SequencerInbox +++ b/test/storage/SequencerInbox @@ -1,6 +1,8 @@ -| Name | Type | Slot | Offset | Bytes | Contract | -|---------------|----------------------------------------------------------|------|--------|-------|----------------------------------------------| -| rollup | contract IOwnable | 0 | 0 | 20 | src/bridge/SequencerInbox.sol:SequencerInbox | -| isBatchPoster | mapping(address => bool) | 1 | 0 | 32 | src/bridge/SequencerInbox.sol:SequencerInbox | -| dasKeySetInfo | mapping(bytes32 => struct ISequencerInbox.DasKeySetInfo) | 2 | 0 | 32 | src/bridge/SequencerInbox.sol:SequencerInbox | -| isSequencer | mapping(address => bool) | 3 | 0 | 32 | src/bridge/SequencerInbox.sol:SequencerInbox | +| Name | Type | Slot | Offset | Bytes | Contract | +|-------------------|----------------------------------------------------------|------|--------|-------|----------------------------------------------| +| rollup | contract IOwnable | 0 | 0 | 20 | src/bridge/SequencerInbox.sol:SequencerInbox | +| isBatchPoster | mapping(address => bool) | 1 | 0 | 32 | src/bridge/SequencerInbox.sol:SequencerInbox | +| dasKeySetInfo | mapping(bytes32 => struct ISequencerInbox.DasKeySetInfo) | 2 | 0 | 32 | src/bridge/SequencerInbox.sol:SequencerInbox | +| isSequencer | mapping(address => bool) | 3 | 0 | 32 | src/bridge/SequencerInbox.sol:SequencerInbox | +| dataHashReader | contract IDataHashReader | 4 | 0 | 20 | src/bridge/SequencerInbox.sol:SequencerInbox | +| blobBasefeeReader | contract IBlobBasefeeReader | 5 | 0 | 20 | src/bridge/SequencerInbox.sol:SequencerInbox | From 73b13de5ea500963f44ddb4b215325d189749397 Mon Sep 17 00:00:00 2001 From: Chris Buckland Date: Tue, 14 Nov 2023 14:25:50 +0100 Subject: [PATCH 235/292] Added more logging --- test/contract/sequencerInbox.spec.4844.ts | 17 ++++++++++++++--- 1 file changed, 14 insertions(+), 3 deletions(-) diff --git a/test/contract/sequencerInbox.spec.4844.ts b/test/contract/sequencerInbox.spec.4844.ts index e7c9db61..ed8c1e7f 100644 --- a/test/contract/sequencerInbox.spec.4844.ts +++ b/test/contract/sequencerInbox.spec.4844.ts @@ -250,6 +250,7 @@ describe('SequencerInbox', async () => { maxDelayBlocks = 10, maxDelayTime = 0 ) => { + console.log("a1") const accounts = await fundAccounts(fundingWallet, 5, utils.parseEther('1')) const admin = accounts[0] @@ -273,8 +274,10 @@ describe('SequencerInbox', async () => { const rollupMock = await rollupMockFac.deploy( await rollupOwner.getAddress() ) + console.log("a2") const sequencerInboxFac = new SequencerInbox__factory(deployer) const seqInboxTemplate = await sequencerInboxFac.deploy(117964) + console.log("a3") const inboxFac = new Inbox__factory(deployer) const inboxTemplate = await inboxFac.deploy(117964) @@ -286,6 +289,8 @@ describe('SequencerInbox', async () => { await inboxTemplate.deployed() await bridgeTemplate.deployed() + console.log("a4") + const transparentUpgradeableProxyFac = new TransparentUpgradeableProxy__factory(deployer) @@ -309,10 +314,12 @@ describe('SequencerInbox', async () => { await bridgeProxy.deployed() await sequencerInboxProxy.deployed() await inboxProxy.deployed() + console.log("a5") const dataHashReader = await Toolkit4844.deployDataHashReader(fundingWallet) const blobBasefeeReader = await Toolkit4844.deployBlobBasefeeReader( fundingWallet ) + console.log("a6") const bridge = await bridgeFac.attach(bridgeProxy.address).connect(user) const bridgeAdmin = await bridgeFac @@ -323,8 +330,10 @@ describe('SequencerInbox', async () => { .attach(sequencerInboxProxy.address) .connect(user) const inbox = await inboxFac.attach(inboxProxy.address).connect(user) + console.log("a7") await (await bridgeAdmin.initialize(rollupMock.address)).wait() + console.log("a8") await ( await sequencerInbox.initialize( bridgeProxy.address, @@ -338,6 +347,7 @@ describe('SequencerInbox', async () => { blobBasefeeReader.address ) ).wait() + console.log("a9") await ( await sequencerInbox .connect(rollupOwner) @@ -346,14 +356,15 @@ describe('SequencerInbox', async () => { await ( await inbox.initialize(bridgeProxy.address, sequencerInbox.address) ).wait() - + console.log("a10") await (await bridgeAdmin.setDelayedInbox(inbox.address, true)).wait() + console.log("a11") await (await bridgeAdmin.setSequencerInbox(sequencerInbox.address)).wait() - + console.log("a12") const messageTester = await new MessageTester__factory(deployer).deploy() await messageTester.deployed() - + console.log("a13") const res = { user, bridge: bridge, From 1f087bf00f49b85e8eacaba9af8cf221e74ebf3d Mon Sep 17 00:00:00 2001 From: Chris Buckland Date: Tue, 14 Nov 2023 14:28:51 +0100 Subject: [PATCH 236/292] Test linting --- test/contract/sequencerInbox.spec.4844.ts | 38 +++++++++++------------ 1 file changed, 19 insertions(+), 19 deletions(-) diff --git a/test/contract/sequencerInbox.spec.4844.ts b/test/contract/sequencerInbox.spec.4844.ts index ed8c1e7f..65bba54c 100644 --- a/test/contract/sequencerInbox.spec.4844.ts +++ b/test/contract/sequencerInbox.spec.4844.ts @@ -250,7 +250,7 @@ describe('SequencerInbox', async () => { maxDelayBlocks = 10, maxDelayTime = 0 ) => { - console.log("a1") + console.log('a1') const accounts = await fundAccounts(fundingWallet, 5, utils.parseEther('1')) const admin = accounts[0] @@ -274,10 +274,10 @@ describe('SequencerInbox', async () => { const rollupMock = await rollupMockFac.deploy( await rollupOwner.getAddress() ) - console.log("a2") + console.log('a2') const sequencerInboxFac = new SequencerInbox__factory(deployer) const seqInboxTemplate = await sequencerInboxFac.deploy(117964) - console.log("a3") + console.log('a3') const inboxFac = new Inbox__factory(deployer) const inboxTemplate = await inboxFac.deploy(117964) @@ -289,7 +289,7 @@ describe('SequencerInbox', async () => { await inboxTemplate.deployed() await bridgeTemplate.deployed() - console.log("a4") + console.log('a4') const transparentUpgradeableProxyFac = new TransparentUpgradeableProxy__factory(deployer) @@ -314,12 +314,12 @@ describe('SequencerInbox', async () => { await bridgeProxy.deployed() await sequencerInboxProxy.deployed() await inboxProxy.deployed() - console.log("a5") + console.log('a5') const dataHashReader = await Toolkit4844.deployDataHashReader(fundingWallet) const blobBasefeeReader = await Toolkit4844.deployBlobBasefeeReader( fundingWallet ) - console.log("a6") + console.log('a6') const bridge = await bridgeFac.attach(bridgeProxy.address).connect(user) const bridgeAdmin = await bridgeFac @@ -330,10 +330,10 @@ describe('SequencerInbox', async () => { .attach(sequencerInboxProxy.address) .connect(user) const inbox = await inboxFac.attach(inboxProxy.address).connect(user) - console.log("a7") + console.log('a7') await (await bridgeAdmin.initialize(rollupMock.address)).wait() - console.log("a8") + console.log('a8') await ( await sequencerInbox.initialize( bridgeProxy.address, @@ -347,7 +347,7 @@ describe('SequencerInbox', async () => { blobBasefeeReader.address ) ).wait() - console.log("a9") + console.log('a9') await ( await sequencerInbox .connect(rollupOwner) @@ -356,15 +356,15 @@ describe('SequencerInbox', async () => { await ( await inbox.initialize(bridgeProxy.address, sequencerInbox.address) ).wait() - console.log("a10") + console.log('a10') await (await bridgeAdmin.setDelayedInbox(inbox.address, true)).wait() - console.log("a11") + console.log('a11') await (await bridgeAdmin.setSequencerInbox(sequencerInbox.address)).wait() - console.log("a12") + console.log('a12') const messageTester = await new MessageTester__factory(deployer).deploy() await messageTester.deployed() - console.log("a13") + console.log('a13') const res = { user, bridge: bridge, @@ -383,18 +383,18 @@ describe('SequencerInbox', async () => { } it('can send normal batch', async () => { - console.log("a") + console.log('a') const privKey = 'cb5790da63720727af975f42c79f69918580209889225fa7128c92402a6d3a65' const prov = new JsonRpcProvider('http://127.0.0.1:8545') - console.log("b") + console.log('b') const wallet = new Wallet(privKey).connect(prov) - console.log("c") + console.log('c') const { user, inbox, bridge, messageTester, sequencerInbox, batchPoster } = await setupSequencerInbox(wallet) - console.log("d") + console.log('d') await sendDelayedTx( user, @@ -408,7 +408,7 @@ describe('SequencerInbox', async () => { BigNumber.from(10), '0x1010' ) - console.log("e") + console.log('e') const subMessageCount = await bridge.sequencerReportedSubMessageCount() const batchSendTx = await sequencerInbox @@ -423,7 +423,7 @@ describe('SequencerInbox', async () => { subMessageCount, subMessageCount.add(1) ) - console.log("f") + console.log('f') await batchSendTx.wait() }) From f3214476291bedcc98998c05b261bd9c252d7d0a Mon Sep 17 00:00:00 2001 From: Chris Buckland Date: Tue, 14 Nov 2023 16:41:28 +0100 Subject: [PATCH 237/292] Updated sequencer deploy --- test/contract/sequencerInbox.spec.4844.ts | 50 ++++++++--------------- 1 file changed, 17 insertions(+), 33 deletions(-) diff --git a/test/contract/sequencerInbox.spec.4844.ts b/test/contract/sequencerInbox.spec.4844.ts index 65bba54c..95e51d0a 100644 --- a/test/contract/sequencerInbox.spec.4844.ts +++ b/test/contract/sequencerInbox.spec.4844.ts @@ -274,10 +274,6 @@ describe('SequencerInbox', async () => { const rollupMock = await rollupMockFac.deploy( await rollupOwner.getAddress() ) - console.log('a2') - const sequencerInboxFac = new SequencerInbox__factory(deployer) - const seqInboxTemplate = await sequencerInboxFac.deploy(117964) - console.log('a3') const inboxFac = new Inbox__factory(deployer) const inboxTemplate = await inboxFac.deploy(117964) @@ -285,7 +281,6 @@ describe('SequencerInbox', async () => { const bridgeFac = new Bridge__factory(deployer) const bridgeTemplate = await bridgeFac.deploy() await rollupMock.deployed() - await seqInboxTemplate.deployed() await inboxTemplate.deployed() await bridgeTemplate.deployed() @@ -300,19 +295,12 @@ describe('SequencerInbox', async () => { '0x' ) - const sequencerInboxProxy = await transparentUpgradeableProxyFac.deploy( - seqInboxTemplate.address, - adminAddr, - '0x' - ) - const inboxProxy = await transparentUpgradeableProxyFac.deploy( inboxTemplate.address, adminAddr, '0x' ) await bridgeProxy.deployed() - await sequencerInboxProxy.deployed() await inboxProxy.deployed() console.log('a5') const dataHashReader = await Toolkit4844.deployDataHashReader(fundingWallet) @@ -326,28 +314,26 @@ describe('SequencerInbox', async () => { .attach(bridgeProxy.address) .connect(rollupOwner) - const sequencerInbox = await sequencerInboxFac - .attach(sequencerInboxProxy.address) - .connect(user) + console.log('a2') + const sequencerInboxFac = new SequencerInbox__factory(deployer) + const sequencerInbox = await sequencerInboxFac.deploy( + bridge.address, + { + delayBlocks: maxDelayBlocks, + delaySeconds: maxDelayTime, + futureBlocks: 10, + futureSeconds: 3000, + }, + 117964, + dataHashReader.address, + blobBasefeeReader.address + ) + await sequencerInbox.deployed() + const inbox = await inboxFac.attach(inboxProxy.address).connect(user) console.log('a7') await (await bridgeAdmin.initialize(rollupMock.address)).wait() - console.log('a8') - await ( - await sequencerInbox.initialize( - bridgeProxy.address, - { - delayBlocks: maxDelayBlocks, - delaySeconds: maxDelayTime, - futureBlocks: 10, - futureSeconds: 3000, - }, - dataHashReader.address, - blobBasefeeReader.address - ) - ).wait() - console.log('a9') await ( await sequencerInbox .connect(rollupOwner) @@ -413,9 +399,7 @@ describe('SequencerInbox', async () => { const subMessageCount = await bridge.sequencerReportedSubMessageCount() const batchSendTx = await sequencerInbox .connect(batchPoster) - [ - 'addSequencerL2BatchFromOrigin(uint256,bytes,uint256,address,uint256,uint256)' - ]( + .functions.addSequencerL2BatchFromOrigin( await bridge.sequencerMessageCount(), '0x0142', await bridge.delayedMessageCount(), From 925e87d046971b1281bce72e997236ff0c48d42a Mon Sep 17 00:00:00 2001 From: Chris Buckland Date: Tue, 14 Nov 2023 16:58:07 +0100 Subject: [PATCH 238/292] add hardcoded gas --- test/contract/sequencerInbox.spec.4844.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/test/contract/sequencerInbox.spec.4844.ts b/test/contract/sequencerInbox.spec.4844.ts index 95e51d0a..93f0ef28 100644 --- a/test/contract/sequencerInbox.spec.4844.ts +++ b/test/contract/sequencerInbox.spec.4844.ts @@ -320,13 +320,13 @@ describe('SequencerInbox', async () => { bridge.address, { delayBlocks: maxDelayBlocks, - delaySeconds: maxDelayTime, futureBlocks: 10, + delaySeconds: maxDelayTime, futureSeconds: 3000, }, 117964, dataHashReader.address, - blobBasefeeReader.address + blobBasefeeReader.address, {gasLimit: 15000000} ) await sequencerInbox.deployed() From 163df9ed354558d5fb362ec56ed1dca51f08e70c Mon Sep 17 00:00:00 2001 From: Chris Buckland Date: Tue, 14 Nov 2023 16:59:19 +0100 Subject: [PATCH 239/292] Formatting --- test/contract/sequencerInbox.spec.4844.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/test/contract/sequencerInbox.spec.4844.ts b/test/contract/sequencerInbox.spec.4844.ts index 93f0ef28..78c4546a 100644 --- a/test/contract/sequencerInbox.spec.4844.ts +++ b/test/contract/sequencerInbox.spec.4844.ts @@ -326,7 +326,8 @@ describe('SequencerInbox', async () => { }, 117964, dataHashReader.address, - blobBasefeeReader.address, {gasLimit: 15000000} + blobBasefeeReader.address, + { gasLimit: 15000000 } ) await sequencerInbox.deployed() From 7239ad468ad7763d90545e2da39fa4f36e712cf2 Mon Sep 17 00:00:00 2001 From: Chris Buckland Date: Tue, 14 Nov 2023 17:57:46 +0100 Subject: [PATCH 240/292] Commented out constructtor checks --- src/bridge/SequencerInbox.sol | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/src/bridge/SequencerInbox.sol b/src/bridge/SequencerInbox.sol index fc1caa07..c42adbe6 100644 --- a/src/bridge/SequencerInbox.sol +++ b/src/bridge/SequencerInbox.sol @@ -94,26 +94,26 @@ contract SequencerInbox is GasRefundEnabled, ISequencerInbox { IDataHashReader dataHashReader_, IBlobBasefeeReader blobBasefeeReader_ ) { - if (bridge_ == IBridge(address(0))) revert HadZeroInit(); + // if (bridge_ == IBridge(address(0))) revert HadZeroInit(); bridge = bridge_; rollup = bridge_.rollup(); - if (address(rollup) == address(0)) revert RollupNotChanged(); + // if (address(rollup) == address(0)) revert RollupNotChanged(); delayBlocks = maxTimeVariation_.delayBlocks; futureBlocks = maxTimeVariation_.futureBlocks; delaySeconds = maxTimeVariation_.delaySeconds; futureSeconds = maxTimeVariation_.futureSeconds; maxDataSize = _maxDataSize; if (hostChainIsArbitrum) { - if (dataHashReader_ != IDataHashReader(address(0))) revert DataBlobsNotSupported(); - if (blobBasefeeReader_ != IBlobBasefeeReader(address(0))) - revert DataBlobsNotSupported(); + // if (dataHashReader_ != IDataHashReader(address(0))) revert DataBlobsNotSupported(); + // if (blobBasefeeReader_ != IBlobBasefeeReader(address(0))) + // revert DataBlobsNotSupported(); } else { - if (dataHashReader_ == IDataHashReader(address(0))) - revert InitParamZero("DataHashReader"); - dataHashReader = dataHashReader_; - if (blobBasefeeReader_ == IBlobBasefeeReader(address(0))) - revert InitParamZero("BlobBasefeeReader"); - blobBasefeeReader = blobBasefeeReader_; + // if (dataHashReader_ == IDataHashReader(address(0))) + // revert InitParamZero("DataHashReader"); + // dataHashReader = dataHashReader_; + // if (blobBasefeeReader_ == IBlobBasefeeReader(address(0))) + // revert InitParamZero("BlobBasefeeReader"); + // blobBasefeeReader = blobBasefeeReader_; } } From f23072f5c7fca8b3025b738565cf7ecab8b2b9b3 Mon Sep 17 00:00:00 2001 From: Chris Buckland Date: Tue, 14 Nov 2023 20:21:39 +0100 Subject: [PATCH 241/292] Removed logging --- src/bridge/SequencerInbox.sol | 26 +++++++++--------- test/contract/sequencerInbox.spec.4844.ts | 32 +++-------------------- 2 files changed, 17 insertions(+), 41 deletions(-) diff --git a/src/bridge/SequencerInbox.sol b/src/bridge/SequencerInbox.sol index c42adbe6..5ce398b7 100644 --- a/src/bridge/SequencerInbox.sol +++ b/src/bridge/SequencerInbox.sol @@ -78,8 +78,8 @@ contract SequencerInbox is GasRefundEnabled, ISequencerInbox { } mapping(address => bool) public isSequencer; - IDataHashReader dataHashReader; - IBlobBasefeeReader blobBasefeeReader; + IDataHashReader immutable dataHashReader; + IBlobBasefeeReader immutable blobBasefeeReader; // On L1 this should be set to 117964: 90% of Geth's 128KB tx size limit, leaving ~13KB for proving uint256 public immutable maxDataSize; @@ -94,27 +94,27 @@ contract SequencerInbox is GasRefundEnabled, ISequencerInbox { IDataHashReader dataHashReader_, IBlobBasefeeReader blobBasefeeReader_ ) { - // if (bridge_ == IBridge(address(0))) revert HadZeroInit(); + if (bridge_ == IBridge(address(0))) revert HadZeroInit(); bridge = bridge_; rollup = bridge_.rollup(); - // if (address(rollup) == address(0)) revert RollupNotChanged(); + if (address(rollup) == address(0)) revert RollupNotChanged(); delayBlocks = maxTimeVariation_.delayBlocks; futureBlocks = maxTimeVariation_.futureBlocks; delaySeconds = maxTimeVariation_.delaySeconds; futureSeconds = maxTimeVariation_.futureSeconds; maxDataSize = _maxDataSize; if (hostChainIsArbitrum) { - // if (dataHashReader_ != IDataHashReader(address(0))) revert DataBlobsNotSupported(); - // if (blobBasefeeReader_ != IBlobBasefeeReader(address(0))) - // revert DataBlobsNotSupported(); + if (dataHashReader_ != IDataHashReader(address(0))) revert DataBlobsNotSupported(); + if (blobBasefeeReader_ != IBlobBasefeeReader(address(0))) + revert DataBlobsNotSupported(); } else { - // if (dataHashReader_ == IDataHashReader(address(0))) - // revert InitParamZero("DataHashReader"); - // dataHashReader = dataHashReader_; - // if (blobBasefeeReader_ == IBlobBasefeeReader(address(0))) - // revert InitParamZero("BlobBasefeeReader"); - // blobBasefeeReader = blobBasefeeReader_; + if (dataHashReader_ == IDataHashReader(address(0))) + revert InitParamZero("DataHashReader"); + if (blobBasefeeReader_ == IBlobBasefeeReader(address(0))) + revert InitParamZero("BlobBasefeeReader"); } + dataHashReader = dataHashReader_; + blobBasefeeReader = blobBasefeeReader_; } function _chainIdChanged() internal view returns (bool) { diff --git a/test/contract/sequencerInbox.spec.4844.ts b/test/contract/sequencerInbox.spec.4844.ts index 78c4546a..e070d521 100644 --- a/test/contract/sequencerInbox.spec.4844.ts +++ b/test/contract/sequencerInbox.spec.4844.ts @@ -250,7 +250,6 @@ describe('SequencerInbox', async () => { maxDelayBlocks = 10, maxDelayTime = 0 ) => { - console.log('a1') const accounts = await fundAccounts(fundingWallet, 5, utils.parseEther('1')) const admin = accounts[0] @@ -284,8 +283,6 @@ describe('SequencerInbox', async () => { await inboxTemplate.deployed() await bridgeTemplate.deployed() - console.log('a4') - const transparentUpgradeableProxyFac = new TransparentUpgradeableProxy__factory(deployer) @@ -302,19 +299,17 @@ describe('SequencerInbox', async () => { ) await bridgeProxy.deployed() await inboxProxy.deployed() - console.log('a5') const dataHashReader = await Toolkit4844.deployDataHashReader(fundingWallet) const blobBasefeeReader = await Toolkit4844.deployBlobBasefeeReader( fundingWallet ) - console.log('a6') const bridge = await bridgeFac.attach(bridgeProxy.address).connect(user) const bridgeAdmin = await bridgeFac .attach(bridgeProxy.address) .connect(rollupOwner) + await (await bridgeAdmin.initialize(rollupMock.address)).wait() - console.log('a2') const sequencerInboxFac = new SequencerInbox__factory(deployer) const sequencerInbox = await sequencerInboxFac.deploy( bridge.address, @@ -332,9 +327,7 @@ describe('SequencerInbox', async () => { await sequencerInbox.deployed() const inbox = await inboxFac.attach(inboxProxy.address).connect(user) - console.log('a7') - await (await bridgeAdmin.initialize(rollupMock.address)).wait() await ( await sequencerInbox .connect(rollupOwner) @@ -343,15 +336,11 @@ describe('SequencerInbox', async () => { await ( await inbox.initialize(bridgeProxy.address, sequencerInbox.address) ).wait() - console.log('a10') await (await bridgeAdmin.setDelayedInbox(inbox.address, true)).wait() - console.log('a11') await (await bridgeAdmin.setSequencerInbox(sequencerInbox.address)).wait() - console.log('a12') const messageTester = await new MessageTester__factory(deployer).deploy() await messageTester.deployed() - console.log('a13') const res = { user, bridge: bridge, @@ -370,19 +359,14 @@ describe('SequencerInbox', async () => { } it('can send normal batch', async () => { - console.log('a') const privKey = 'cb5790da63720727af975f42c79f69918580209889225fa7128c92402a6d3a65' const prov = new JsonRpcProvider('http://127.0.0.1:8545') - console.log('b') const wallet = new Wallet(privKey).connect(prov) - console.log('c') const { user, inbox, bridge, messageTester, sequencerInbox, batchPoster } = await setupSequencerInbox(wallet) - console.log('d') - await sendDelayedTx( user, inbox, @@ -395,7 +379,6 @@ describe('SequencerInbox', async () => { BigNumber.from(10), '0x1010' ) - console.log('e') const subMessageCount = await bridge.sequencerReportedSubMessageCount() const batchSendTx = await sequencerInbox @@ -408,7 +391,6 @@ describe('SequencerInbox', async () => { subMessageCount, subMessageCount.add(1) ) - console.log('f') await batchSendTx.wait() }) @@ -474,12 +456,12 @@ describe('SequencerInbox', async () => { const batchDeliveredEvent = batchSendReceipt.logs .filter( (b: any) => - b.address.toLowerCase() === sequencerInbox.address.toLowerCase() && + b.address.toLowerCase() === bridge.address.toLowerCase() && b.topics[0] === - sequencerInbox.interface.getEventTopic('SequencerBatchDelivered') + bridge.interface.getEventTopic('SequencerBatchDelivered') ) .map( - (l: any) => sequencerInbox.interface.parseLog(l).args + (l: any) => bridge.interface.parseLog(l).args )[0] as SequencerBatchDeliveredEvent['args'] if (!batchDeliveredEvent) throw new Error('missing batch event') @@ -561,12 +543,6 @@ describe('SequencerInbox', async () => { maxTimestamp: number }> => { const maxTimeVariation = await sequencerInbox.maxTimeVariation() - console.log( - 'maxTimeVariation', - sequencerInbox.address, - (await sequencerInbox.provider.getCode(sequencerInbox.address)).length, - maxTimeVariation - ) return { minBlocks: blockNumber > maxTimeVariation.delayBlocks.toNumber() From 3933cbbcc1008159522a16f878f30c47d56fac83 Mon Sep 17 00:00:00 2001 From: Chris Buckland Date: Tue, 14 Nov 2023 20:29:36 +0100 Subject: [PATCH 242/292] Updated storage --- test/storage/SequencerInbox | 14 ++++++-------- 1 file changed, 6 insertions(+), 8 deletions(-) diff --git a/test/storage/SequencerInbox b/test/storage/SequencerInbox index 4ef0679b..28d58281 100644 --- a/test/storage/SequencerInbox +++ b/test/storage/SequencerInbox @@ -1,8 +1,6 @@ -| Name | Type | Slot | Offset | Bytes | Contract | -|-------------------|----------------------------------------------------------|------|--------|-------|----------------------------------------------| -| rollup | contract IOwnable | 0 | 0 | 20 | src/bridge/SequencerInbox.sol:SequencerInbox | -| isBatchPoster | mapping(address => bool) | 1 | 0 | 32 | src/bridge/SequencerInbox.sol:SequencerInbox | -| dasKeySetInfo | mapping(bytes32 => struct ISequencerInbox.DasKeySetInfo) | 2 | 0 | 32 | src/bridge/SequencerInbox.sol:SequencerInbox | -| isSequencer | mapping(address => bool) | 3 | 0 | 32 | src/bridge/SequencerInbox.sol:SequencerInbox | -| dataHashReader | contract IDataHashReader | 4 | 0 | 20 | src/bridge/SequencerInbox.sol:SequencerInbox | -| blobBasefeeReader | contract IBlobBasefeeReader | 5 | 0 | 20 | src/bridge/SequencerInbox.sol:SequencerInbox | +| Name | Type | Slot | Offset | Bytes | Contract | +|---------------|----------------------------------------------------------|------|--------|-------|----------------------------------------------| +| rollup | contract IOwnable | 0 | 0 | 20 | src/bridge/SequencerInbox.sol:SequencerInbox | +| isBatchPoster | mapping(address => bool) | 1 | 0 | 32 | src/bridge/SequencerInbox.sol:SequencerInbox | +| dasKeySetInfo | mapping(bytes32 => struct ISequencerInbox.DasKeySetInfo) | 2 | 0 | 32 | src/bridge/SequencerInbox.sol:SequencerInbox | +| isSequencer | mapping(address => bool) | 3 | 0 | 32 | src/bridge/SequencerInbox.sol:SequencerInbox | From 894da0665b46c26fd21084325046a4723f078126 Mon Sep 17 00:00:00 2001 From: Chris Buckland Date: Wed, 15 Nov 2023 16:51:24 +0100 Subject: [PATCH 243/292] Removed TODO --- src/bridge/SequencerInbox.sol | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/bridge/SequencerInbox.sol b/src/bridge/SequencerInbox.sol index 5ce398b7..66a4039f 100644 --- a/src/bridge/SequencerInbox.sol +++ b/src/bridge/SequencerInbox.sol @@ -226,8 +226,6 @@ contract SequencerInbox is GasRefundEnabled, ISequencerInbox { ); } - // CHRIS: TODO: we're missing the old one with just the revert here - function addSequencerL2BatchFromOrigin( uint256 sequenceNumber, bytes calldata data, From 1227adc4c628503b86f202c2fe6eb65f908f4964 Mon Sep 17 00:00:00 2001 From: Chris Buckland Date: Fri, 17 Nov 2023 14:57:53 +0100 Subject: [PATCH 244/292] Removed todos --- src/bridge/SequencerInbox.sol | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/bridge/SequencerInbox.sol b/src/bridge/SequencerInbox.sol index 66a4039f..a70352bf 100644 --- a/src/bridge/SequencerInbox.sol +++ b/src/bridge/SequencerInbox.sol @@ -255,7 +255,6 @@ contract SequencerInbox is GasRefundEnabled, ISequencerInbox { function addSequencerL2BatchFromBlob( uint256 sequenceNumber, - // CHRIS: TODO: this isnt strictly necessary atm, but I'll leave it here until we decide if we want to specify blob indices bytes calldata data, uint256 afterDelayedMessagesRead, IGasRefunder gasRefunder, @@ -277,7 +276,6 @@ contract SequencerInbox is GasRefundEnabled, ISequencerInbox { newMessageCount, IBridge.BatchDataLocation.Blob ); - emit SequencerBatchData(sequenceNumber, data); } function addSequencerL2Batch( From 31fd3c643503cd4a24f1c1ae3796ddcadde4fb6e Mon Sep 17 00:00:00 2001 From: Chris Buckland Date: Fri, 17 Nov 2023 16:06:33 +0100 Subject: [PATCH 245/292] Added internal max time variation func --- src/bridge/SequencerInbox.sol | 69 ++++++++++++++++++++++------------- src/rollup/BridgeCreator.sol | 14 +++---- 2 files changed, 48 insertions(+), 35 deletions(-) diff --git a/src/bridge/SequencerInbox.sol b/src/bridge/SequencerInbox.sol index 801887ad..cc0d9c16 100644 --- a/src/bridge/SequencerInbox.sol +++ b/src/bridge/SequencerInbox.sol @@ -111,35 +111,54 @@ contract SequencerInbox is GasRefundEnabled, ISequencerInbox { function getTimeBounds() internal view virtual returns (IBridge.TimeBounds memory) { IBridge.TimeBounds memory bounds; - ISequencerInbox.MaxTimeVariation memory maxTimeVariation_ = maxTimeVariation(); - if (block.timestamp > maxTimeVariation_.delaySeconds) { - bounds.minTimestamp = uint64(block.timestamp - maxTimeVariation_.delaySeconds); + ( + uint256 delayBlocks_, + uint256 futureBlocks_, + uint256 delaySeconds_, + uint256 futureSeconds_ + ) = maxTimeVariationInternal(); + if (block.timestamp > delaySeconds_) { + bounds.minTimestamp = uint64(block.timestamp - delaySeconds_); } - bounds.maxTimestamp = uint64(block.timestamp + maxTimeVariation_.futureSeconds); - if (block.number > maxTimeVariation_.delayBlocks) { - bounds.minBlockNumber = uint64(block.number - maxTimeVariation_.delayBlocks); + bounds.maxTimestamp = uint64(block.timestamp + futureSeconds_); + if (block.number > delayBlocks_) { + bounds.minBlockNumber = uint64(block.number - delayBlocks_); } - bounds.maxBlockNumber = uint64(block.number + maxTimeVariation_.futureBlocks); + bounds.maxBlockNumber = uint64(block.number + futureBlocks_); return bounds; } function maxTimeVariation() public view returns (ISequencerInbox.MaxTimeVariation memory) { + ( + uint256 delayBlocks_, + uint256 futureBlocks_, + uint256 delaySeconds_, + uint256 futureSeconds_ + ) = maxTimeVariationInternal(); + + return + ISequencerInbox.MaxTimeVariation({ + delayBlocks: delayBlocks_, + futureBlocks: futureBlocks_, + delaySeconds: delaySeconds_, + futureSeconds: futureSeconds_ + }); + } + + function maxTimeVariationInternal() + internal + view + returns ( + uint256, + uint256, + uint256, + uint256 + ) + { if (_chainIdChanged()) { - return - ISequencerInbox.MaxTimeVariation({ - delayBlocks: 1, - futureBlocks: 1, - delaySeconds: 1, - futureSeconds: 1 - }); + return (1, 1, 1, 1); } else { - return - ISequencerInbox.MaxTimeVariation({ - delayBlocks: delayBlocks, - futureBlocks: futureBlocks, - delaySeconds: delaySeconds, - futureSeconds: futureSeconds - }); + return (delayBlocks, futureBlocks, delaySeconds, futureSeconds); } } @@ -162,12 +181,10 @@ contract SequencerInbox is GasRefundEnabled, ISequencerInbox { baseFeeL1, messageDataHash ); - ISequencerInbox.MaxTimeVariation memory maxTimeVariation_ = maxTimeVariation(); + (uint256 delayBlocks_, , uint256 delaySeconds_, ) = maxTimeVariationInternal(); // Can only force-include after the Sequencer-only window has expired. - if (l1BlockAndTime[0] + maxTimeVariation_.delayBlocks >= block.number) - revert ForceIncludeBlockTooSoon(); - if (l1BlockAndTime[1] + maxTimeVariation_.delaySeconds >= block.timestamp) - revert ForceIncludeTimeTooSoon(); + if (l1BlockAndTime[0] + delayBlocks_ >= block.number) revert ForceIncludeBlockTooSoon(); + if (l1BlockAndTime[1] + delaySeconds_ >= block.timestamp) revert ForceIncludeTimeTooSoon(); // Verify that message hash represents the last message sequence of delayed message to be included bytes32 prevDelayedAcc = 0; diff --git a/src/rollup/BridgeCreator.sol b/src/rollup/BridgeCreator.sol index d87af2fa..eee7ddfe 100644 --- a/src/rollup/BridgeCreator.sol +++ b/src/rollup/BridgeCreator.sol @@ -58,12 +58,10 @@ contract BridgeCreator is Ownable { emit ERC20TemplatesUpdated(); } - function _createBridge( - address adminProxy, - BridgeTemplates storage templates, - ISequencerInbox.MaxTimeVariation calldata maxTimeVariation, - uint256 maxDataSize - ) internal returns (BridgeContracts memory) { + function _createBridge(address adminProxy, BridgeTemplates storage templates) + internal + returns (BridgeContracts memory) + { BridgeContracts memory frame; frame.bridge = IBridge( address(new TransparentUpgradeableProxy(address(templates.bridge), adminProxy, "")) @@ -92,9 +90,7 @@ contract BridgeCreator is Ownable { // create ETH-based bridge if address zero is provided for native token, otherwise create ERC20-based bridge BridgeContracts memory frame = _createBridge( adminProxy, - nativeToken == address(0) ? ethBasedTemplates : erc20BasedTemplates, - maxTimeVariation, - maxDataSize + nativeToken == address(0) ? ethBasedTemplates : erc20BasedTemplates ); // init contracts From 05e311d8107e6f9ebd7ca66e256a7a494d3d66a5 Mon Sep 17 00:00:00 2001 From: Chris Buckland Date: Fri, 17 Nov 2023 16:27:24 +0100 Subject: [PATCH 246/292] Updated max time variation to be u64 --- scripts/config.ts.example | 8 +++---- src/bridge/ISequencerInbox.sol | 8 +++---- src/bridge/SequencerInbox.sol | 40 +++++++++++++++++----------------- 3 files changed, 28 insertions(+), 28 deletions(-) diff --git a/scripts/config.ts.example b/scripts/config.ts.example index cf5d8704..cb557aa1 100644 --- a/scripts/config.ts.example +++ b/scripts/config.ts.example @@ -19,10 +19,10 @@ export const config = { '{"chainId":13331370,"homesteadBlock":0,"daoForkBlock":null,"daoForkSupport":true,"eip150Block":0,"eip150Hash":"0x0000000000000000000000000000000000000000000000000000000000000000","eip155Block":0,"eip158Block":0,"byzantiumBlock":0,"constantinopleBlock":0,"petersburgBlock":0,"istanbulBlock":0,"muirGlacierBlock":0,"berlinBlock":0,"londonBlock":0,"clique":{"period":0,"epoch":0},"arbitrum":{"EnableArbOS":true,"AllowDebugPrecompiles":false,"DataAvailabilityCommittee":false,"InitialArbOSVersion":10,"InitialChainOwner":"0x1234123412341234123412341234123412341234","GenesisBlockNum":0}}', genesisBlockNum: ethers.BigNumber.from('0'), sequencerInboxMaxTimeVariation: { - delayBlocks: ethers.BigNumber.from('5760'), - futureBlocks: ethers.BigNumber.from('12'), - delaySeconds: ethers.BigNumber.from('86400'), - futureSeconds: ethers.BigNumber.from('3600'), + delayBlocks: 5760, + futureBlocks: 12, + delaySeconds: 86400, + futureSeconds: 3600, }, }, validators: [ diff --git a/src/bridge/ISequencerInbox.sol b/src/bridge/ISequencerInbox.sol index 8cdd2ed2..e70714aa 100644 --- a/src/bridge/ISequencerInbox.sol +++ b/src/bridge/ISequencerInbox.sol @@ -17,10 +17,10 @@ interface ISequencerInbox is IDelayedMessageProvider { /// @param delaySeconds The max amount of seconds in the past that a message can be received on L2 /// @param futureSeconds The max amount of seconds in the future that a message can be received on L2 struct MaxTimeVariation { - uint256 delayBlocks; - uint256 futureBlocks; - uint256 delaySeconds; - uint256 futureSeconds; + uint64 delayBlocks; + uint64 futureBlocks; + uint64 delaySeconds; + uint64 futureSeconds; } event OwnerFunctionCalled(uint256 indexed id); diff --git a/src/bridge/SequencerInbox.sol b/src/bridge/SequencerInbox.sol index cc0d9c16..69a26c46 100644 --- a/src/bridge/SequencerInbox.sol +++ b/src/bridge/SequencerInbox.sol @@ -55,10 +55,10 @@ contract SequencerInbox is GasRefundEnabled, ISequencerInbox { IOwnable public rollup; mapping(address => bool) public isBatchPoster; // see ISequencerInbox.MaxTimeVariation - uint256 internal immutable delayBlocks; - uint256 internal immutable futureBlocks; - uint256 internal immutable delaySeconds; - uint256 internal immutable futureSeconds; + uint64 internal immutable delayBlocks; + uint64 internal immutable futureBlocks; + uint64 internal immutable delaySeconds; + uint64 internal immutable futureSeconds; mapping(bytes32 => DasKeySetInfo) public dasKeySetInfo; @@ -112,28 +112,28 @@ contract SequencerInbox is GasRefundEnabled, ISequencerInbox { function getTimeBounds() internal view virtual returns (IBridge.TimeBounds memory) { IBridge.TimeBounds memory bounds; ( - uint256 delayBlocks_, - uint256 futureBlocks_, - uint256 delaySeconds_, - uint256 futureSeconds_ + uint64 delayBlocks_, + uint64 futureBlocks_, + uint64 delaySeconds_, + uint64 futureSeconds_ ) = maxTimeVariationInternal(); if (block.timestamp > delaySeconds_) { - bounds.minTimestamp = uint64(block.timestamp - delaySeconds_); + bounds.minTimestamp = uint64(block.timestamp) - delaySeconds_; } - bounds.maxTimestamp = uint64(block.timestamp + futureSeconds_); + bounds.maxTimestamp = uint64(block.timestamp) + futureSeconds_; if (block.number > delayBlocks_) { - bounds.minBlockNumber = uint64(block.number - delayBlocks_); + bounds.minBlockNumber = uint64(block.number) - delayBlocks_; } - bounds.maxBlockNumber = uint64(block.number + futureBlocks_); + bounds.maxBlockNumber = uint64(block.number) + futureBlocks_; return bounds; } function maxTimeVariation() public view returns (ISequencerInbox.MaxTimeVariation memory) { ( - uint256 delayBlocks_, - uint256 futureBlocks_, - uint256 delaySeconds_, - uint256 futureSeconds_ + uint64 delayBlocks_, + uint64 futureBlocks_, + uint64 delaySeconds_, + uint64 futureSeconds_ ) = maxTimeVariationInternal(); return @@ -149,10 +149,10 @@ contract SequencerInbox is GasRefundEnabled, ISequencerInbox { internal view returns ( - uint256, - uint256, - uint256, - uint256 + uint64, + uint64, + uint64, + uint64 ) { if (_chainIdChanged()) { From 0a149d2af9aee566c4abf493479ec15e5fc32d98 Mon Sep 17 00:00:00 2001 From: Nodar Ambroladze Date: Mon, 4 Dec 2023 12:53:59 +0100 Subject: [PATCH 247/292] Fix rollup owner address in NotOwner() emitted event in sequencerInbox --- src/bridge/SequencerInbox.sol | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/bridge/SequencerInbox.sol b/src/bridge/SequencerInbox.sol index 51d511e2..77ff835c 100644 --- a/src/bridge/SequencerInbox.sol +++ b/src/bridge/SequencerInbox.sol @@ -61,7 +61,7 @@ contract SequencerInbox is DelegateCallAware, GasRefundEnabled, ISequencerInbox mapping(bytes32 => DasKeySetInfo) public dasKeySetInfo; modifier onlyRollupOwner() { - if (msg.sender != rollup.owner()) revert NotOwner(msg.sender, address(rollup)); + if (msg.sender != rollup.owner()) revert NotOwner(msg.sender, rollup.owner()); _; } From e281859bc159fef24e1fb2ab0f45706f3e1da1af Mon Sep 17 00:00:00 2001 From: Chris Buckland Date: Tue, 5 Dec 2023 10:20:18 +0100 Subject: [PATCH 248/292] Formatting --- test/contract/sequencerInbox.spec.4844.ts | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/test/contract/sequencerInbox.spec.4844.ts b/test/contract/sequencerInbox.spec.4844.ts index e070d521..f80125a4 100644 --- a/test/contract/sequencerInbox.spec.4844.ts +++ b/test/contract/sequencerInbox.spec.4844.ts @@ -45,13 +45,11 @@ import { import { Signer, Wallet, constants, utils } from 'ethers' import { keccak256, solidityKeccak256, solidityPack } from 'ethers/lib/utils' import { Toolkit4844 } from './toolkit4844' -import { - SequencerBatchDeliveredEvent, - SequencerInbox, -} from '../../build/types/src/bridge/SequencerInbox' +import { SequencerInbox } from '../../build/types/src/bridge/SequencerInbox' import { execSync } from 'child_process' import { wait } from '@arbitrum/sdk/dist/lib/utils/lib' import { InboxMessageDeliveredEvent } from '../../build/types/src/bridge/AbsInbox' +import { SequencerBatchDeliveredEvent } from '../../build/types/src/bridge/AbsBridge' const mineBlocks = async ( wallet: Wallet, From f50ec32d9cf3b07bfb1ea39a7e35ae1c44d9c540 Mon Sep 17 00:00:00 2001 From: Chris Buckland Date: Tue, 5 Dec 2023 18:12:13 +0100 Subject: [PATCH 249/292] Updates from code review comments --- src/bridge/IBridge.sol | 8 + src/bridge/ISequencerInbox.sol | 25 +++- src/bridge/SequencerInbox.sol | 249 +++++++++++++++++-------------- src/libraries/Error.sol | 6 + src/mocks/SequencerInboxStub.sol | 5 +- 5 files changed, 172 insertions(+), 121 deletions(-) diff --git a/src/bridge/IBridge.sol b/src/bridge/IBridge.sol index 9082ce2d..5c1ef477 100644 --- a/src/bridge/IBridge.sol +++ b/src/bridge/IBridge.sol @@ -9,10 +9,18 @@ pragma experimental ABIEncoderV2; import "./IOwnable.sol"; interface IBridge { + /// @dev This is an instruction to offchain readers to inform them where to look + /// for sequencer inbox batch data. This is not the type of data (eg. das, brotli encoded, or blob versioned hash) + /// and this enum is not used in the state transition function, rather it informs an offchain + /// reader where to find the data so that they can supply it to the replay binary enum BatchDataLocation { + /// @notice The data can be found in the transaction call data TxInput, + /// @notice The data can be found in an event emitted during the transaction SeparateBatchEvent, + /// @notice This batch contains no data NoData, + /// @notice The data can be found in the 4844 data blobs on this transaction Blob } diff --git a/src/bridge/ISequencerInbox.sol b/src/bridge/ISequencerInbox.sol index 71ea715c..d3c6a95d 100644 --- a/src/bridge/ISequencerInbox.sol +++ b/src/bridge/ISequencerInbox.sol @@ -44,21 +44,36 @@ interface ISequencerInbox is IDelayedMessageProvider { // solhint-disable-next-line func-name-mixedcase function HEADER_LENGTH() external view returns (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-mixedcase - function DATA_AUTHENTICATED_FLAG() external view returns (bytes1); - /// @dev If the first data byte after the header has this bit set, /// then the batch data is to be found in 4844 data blobs + /// See: https://github.com/OffchainLabs/nitro/blob/69de0603abf6f900a4128cab7933df60cad54ded/arbstate/das_reader.go // solhint-disable-next-line func-name-mixedcase function DATA_BLOB_HEADER_FLAG() external view returns (bytes1); /// @dev If the first data byte after the header has this bit set, /// then the batch data is a das message + /// See: https://github.com/OffchainLabs/nitro/blob/69de0603abf6f900a4128cab7933df60cad54ded/arbstate/das_reader.go // solhint-disable-next-line func-name-mixedcase function DAS_MESSAGE_HEADER_FLAG() external view returns (bytes1); + /// @dev If the first data byte after the header has this bit set, + /// then the batch data is a das message that employs a merklesization strategy + /// See: https://github.com/OffchainLabs/nitro/blob/69de0603abf6f900a4128cab7933df60cad54ded/arbstate/das_reader.go + // solhint-disable-next-line func-name-mixedcase + function TREE_DAS_MESSAGE_HEADER_FLAG() external view returns (bytes1); + + /// @dev If the first data byte after the header has this bit set, + /// then the batch data has been brotli compressed + /// See: https://github.com/OffchainLabs/nitro/blob/69de0603abf6f900a4128cab7933df60cad54ded/arbstate/das_reader.go + // solhint-disable-next-line func-name-mixedcase + function BROTLI_MESSAGE_HEADER_FLAG() external view returns (bytes1); + + /// @dev If the first data byte after the header has this bit set, + /// then the batch data uses a zero heavy encoding + /// See: https://github.com/OffchainLabs/nitro/blob/69de0603abf6f900a4128cab7933df60cad54ded/arbstate/das_reader.go + // solhint-disable-next-line func-name-mixedcase + function ZERO_HEAVY_MESSAGE_HEADER_FLAG() external view returns (bytes1); + function rollup() external view returns (IOwnable); function isBatchPoster(address) external view returns (bool); diff --git a/src/bridge/SequencerInbox.sol b/src/bridge/SequencerInbox.sol index a70352bf..d9ddabc2 100644 --- a/src/bridge/SequencerInbox.sol +++ b/src/bridge/SequencerInbox.sol @@ -26,7 +26,9 @@ import { MissingDataHashes, InvalidBlobMetadata, NotOwner, - RollupNotChanged + RollupNotChanged, + EmptyBatchData, + InvalidHeaderFlag } from "../libraries/Error.sol"; import "./IBridge.sol"; import "./IInboxBase.sol"; @@ -54,13 +56,19 @@ contract SequencerInbox is GasRefundEnabled, ISequencerInbox { uint256 public constant HEADER_LENGTH = 40; /// @inheritdoc ISequencerInbox - bytes1 public constant DATA_AUTHENTICATED_FLAG = 0x40; + bytes1 public constant DATA_BLOB_HEADER_FLAG = 0x40; /// @inheritdoc ISequencerInbox - bytes1 public constant DATA_BLOB_HEADER_FLAG = 0x10; + bytes1 public constant DAS_MESSAGE_HEADER_FLAG = 0x80; /// @inheritdoc ISequencerInbox - bytes1 public constant DAS_MESSAGE_HEADER_FLAG = 0x80; + bytes1 public constant TREE_DAS_MESSAGE_HEADER_FLAG = 0x08; + + /// @inheritdoc ISequencerInbox + bytes1 public constant BROTLI_MESSAGE_HEADER_FLAG = 0x00; + + /// @inheritdoc ISequencerInbox + bytes1 public constant ZERO_HEAVY_MESSAGE_HEADER_FLAG = 0x20; IOwnable public rollup; mapping(address => bool) public isBatchPoster; @@ -215,13 +223,12 @@ contract SequencerInbox is GasRefundEnabled, ISequencerInbox { _totalDelayedMessagesRead - totalDelayedMessagesRead(); - addSequencerL2BatchImpl( - type(uint256).max, + bridge.enqueueSequencerMessage( dataHash, - timeBounds, _totalDelayedMessagesRead, prevSeqMsgCount, newSeqMsgCount, + timeBounds, IBridge.BatchDataLocation.NoData ); } @@ -237,45 +244,63 @@ contract SequencerInbox is GasRefundEnabled, ISequencerInbox { // solhint-disable-next-line avoid-tx-origin if (msg.sender != tx.origin) revert NotOrigin(); if (!isBatchPoster[msg.sender]) revert NotBatchPoster(); - (bytes32 dataHash, IBridge.TimeBounds memory timeBounds) = formDataHash( + (bytes32 dataHash, IBridge.TimeBounds memory timeBounds) = formCallDataHash( data, - afterDelayedMessagesRead, - IBridge.BatchDataLocation.TxInput + afterDelayedMessagesRead ); - addSequencerL2BatchImpl( - sequenceNumber, + + (uint256 seqMessageIndex, , , ) = bridge.enqueueSequencerMessage( dataHash, - timeBounds, afterDelayedMessagesRead, prevMessageCount, newMessageCount, + timeBounds, IBridge.BatchDataLocation.TxInput ); + + // ~uint256(0) is type(uint256).max, but ever so slightly cheaper + if (seqMessageIndex != sequenceNumber && sequenceNumber != ~uint256(0)) { + revert BadSequencerNumber(seqMessageIndex, sequenceNumber); + } + + // submit a batch spending report to refund the entity that produced the batch data + submitBatchSpendingReport(dataHash, seqMessageIndex, block.basefee); } function addSequencerL2BatchFromBlob( uint256 sequenceNumber, - bytes calldata data, uint256 afterDelayedMessagesRead, IGasRefunder gasRefunder, uint256 prevMessageCount, uint256 newMessageCount ) external refundsGas(gasRefunder) { if (!isBatchPoster[msg.sender]) revert NotBatchPoster(); - (bytes32 dataHash, IBridge.TimeBounds memory timeBounds) = formDataHash( - data, - afterDelayedMessagesRead, - IBridge.BatchDataLocation.Blob + (bytes32 dataHash, IBridge.TimeBounds memory timeBounds) = formBlobDataHash( + afterDelayedMessagesRead ); - addSequencerL2BatchImpl( - sequenceNumber, + + (uint256 seqMessageIndex, , , ) = bridge.enqueueSequencerMessage( dataHash, - timeBounds, afterDelayedMessagesRead, prevMessageCount, newMessageCount, + timeBounds, IBridge.BatchDataLocation.Blob ); + + // ~uint256(0) is type(uint256).max, but ever so slightly cheaper + if (seqMessageIndex != sequenceNumber && sequenceNumber != ~uint256(0)) { + revert BadSequencerNumber(seqMessageIndex, sequenceNumber); + } + + // blobs are currently not supported on host arbitrum chains, when support is added it may + // consume gas in a different way to L1, so explicitly block host arb chains so that if support for blobs + // on arb is added it will need to explicitly turned on in the sequencer inbox + if (hostChainIsArbitrum) revert DataBlobsNotSupported(); + + // submit a batch spending report to refund the entity that produced the blob batch data + uint256 blobBasefee = blobBasefeeReader.getBlobBaseFee(); + submitBatchSpendingReport(dataHash, seqMessageIndex, blobBasefee); } function addSequencerL2Batch( @@ -287,20 +312,25 @@ contract SequencerInbox is GasRefundEnabled, ISequencerInbox { uint256 newMessageCount ) external override refundsGas(gasRefunder) { if (!isBatchPoster[msg.sender] && msg.sender != address(rollup)) revert NotBatchPoster(); - (bytes32 dataHash, IBridge.TimeBounds memory timeBounds) = formDataHash( + (bytes32 dataHash, IBridge.TimeBounds memory timeBounds) = formCallDataHash( data, - afterDelayedMessagesRead, - IBridge.BatchDataLocation.SeparateBatchEvent + afterDelayedMessagesRead ); - addSequencerL2BatchImpl( - sequenceNumber, + + (uint256 seqMessageIndex, , , ) = bridge.enqueueSequencerMessage( dataHash, - timeBounds, afterDelayedMessagesRead, prevMessageCount, newMessageCount, + timeBounds, IBridge.BatchDataLocation.SeparateBatchEvent ); + + // ~uint256(0) is type(uint256).max, but ever so slightly cheaper + if (seqMessageIndex != sequenceNumber && sequenceNumber != ~uint256(0)) { + revert BadSequencerNumber(seqMessageIndex, sequenceNumber); + } + emit SequencerBatchData(sequenceNumber, data); } @@ -322,6 +352,10 @@ contract SequencerInbox is GasRefundEnabled, ISequencerInbox { return (header, timeBounds); } + /// @dev Form a hash for a sequencer message with no batch data + /// @param afterDelayedMessagesRead The delayed messages count read up to + /// @return The data hash + /// @return The timebounds within which the message should be processed function formEmptyDataHash(uint256 afterDelayedMessagesRead) internal view @@ -333,117 +367,108 @@ contract SequencerInbox is GasRefundEnabled, ISequencerInbox { return (keccak256(header), timeBounds); } - function formDataHash( - bytes calldata data, - uint256 afterDelayedMessagesRead, - IBridge.BatchDataLocation dataLocation - ) internal view returns (bytes32, IBridge.TimeBounds memory) { + /// @dev Since the data is supplied from calldata, the batch poster can choose the data type + /// We need to ensure that this data cannot cause a collision with data supplied via another method (eg blobs) + /// therefore we restrict which flags can be provided as a header in this field + /// This also safe guards unused flags for future use, as we know they would have been disallowed up until this point + /// @param headerByte The first byte in the calldata + function isValidCallDataFlag(bytes1 headerByte) internal pure returns (bool) { + return + headerByte == BROTLI_MESSAGE_HEADER_FLAG || + headerByte == DAS_MESSAGE_HEADER_FLAG || + (headerByte == (DAS_MESSAGE_HEADER_FLAG | TREE_DAS_MESSAGE_HEADER_FLAG)) || + headerByte == ZERO_HEAVY_MESSAGE_HEADER_FLAG; + } + + /// @dev Form a hash of the data taken from the calldata + /// @param data The calldata to be hashed + /// @param afterDelayedMessagesRead The delayed messages count read up to + /// @return The data hash + /// @return The timebounds within which the message should be processed + function formCallDataHash(bytes calldata data, uint256 afterDelayedMessagesRead) + internal + view + returns (bytes32, IBridge.TimeBounds memory) + { uint256 fullDataLen = HEADER_LENGTH + data.length; if (fullDataLen > maxDataSize) revert DataTooLarge(fullDataLen, maxDataSize); - if (data.length > 0 && (data[0] & DATA_AUTHENTICATED_FLAG) == DATA_AUTHENTICATED_FLAG) { - revert DataNotAuthenticated(); - } + // The first data byte must exist so that the data cannot collide with empty hash + if (data.length == 0) revert EmptyBatchData(); + // The first data byte cannot be the same as any that have been set via other methods (eg 4844 blob header) as this + // would allow the supplier of the data to spoof an incorrect 4844 data batch + if (!isValidCallDataFlag(data[0])) revert InvalidHeaderFlag(data[0]); (bytes memory header, IBridge.TimeBounds memory timeBounds) = packHeader( afterDelayedMessagesRead ); - if (dataLocation == IBridge.BatchDataLocation.Blob) { - bytes32[] memory dataHashes = dataHashReader.getDataHashes(); - if (dataHashes.length == 0) revert MissingDataHashes(); - if (data.length != 1) revert InvalidBlobMetadata(); - if (data[0] & DATA_BLOB_HEADER_FLAG == 0) revert InvalidBlobMetadata(); - - return ( - keccak256(bytes.concat(header, data, abi.encodePacked(dataHashes))), - timeBounds - ); - } else { - // the first byte is used to identify the type of batch data - // das batches expect to have the type byte set, followed by the keyset (so they should have at least 33 bytes) - if (data.length >= 33 && data[0] & DAS_MESSAGE_HEADER_FLAG != 0) { - // we skip the first byte, then read the next 32 bytes for the keyset - bytes32 dasKeysetHash = bytes32(data[1:33]); - if (!dasKeySetInfo[dasKeysetHash].isValidKeyset) revert NoSuchKeyset(dasKeysetHash); - } - return (keccak256(bytes.concat(header, data)), timeBounds); + + // the first byte is used to identify the type of batch data + // das batches expect to have the type byte set, followed by the keyset (so they should have at least 33 bytes) + if (data[0] & DAS_MESSAGE_HEADER_FLAG != 0 && data.length >= 33) { + // we skip the first byte, then read the next 32 bytes for the keyset + bytes32 dasKeysetHash = bytes32(data[1:33]); + if (!dasKeySetInfo[dasKeysetHash].isValidKeyset) revert NoSuchKeyset(dasKeysetHash); } + return (keccak256(bytes.concat(header, data)), timeBounds); } - function addSequencerL2BatchImpl( - uint256 sequenceNumber, - bytes32 dataHash, - IBridge.TimeBounds memory timeBounds, - uint256 afterDelayedMessagesRead, - uint256 prevMessageCount, - uint256 newMessageCount, - IBridge.BatchDataLocation batchDataLocation - ) internal returns (uint256 seqMessageIndex) { - (seqMessageIndex, , , ) = bridge.enqueueSequencerMessage( - dataHash, - afterDelayedMessagesRead, - prevMessageCount, - newMessageCount, - timeBounds, - batchDataLocation - ); + /// @dev Form a hash of the data being provided in 4844 data blobs + /// @param afterDelayedMessagesRead The delayed messages count read up to + /// @return The data hash + /// @return The timebounds within which the message should be processed + function formBlobDataHash(uint256 afterDelayedMessagesRead) + internal + view + returns (bytes32, IBridge.TimeBounds memory) + { + bytes32[] memory dataHashes = dataHashReader.getDataHashes(); + if (dataHashes.length == 0) revert MissingDataHashes(); - // submit a batch spending report to refund the entity that produced the batch data - submitBatchSpendingReport(dataHash, seqMessageIndex, batchDataLocation); + (bytes memory header, IBridge.TimeBounds memory timeBounds) = packHeader( + afterDelayedMessagesRead + ); - // ~uint256(0) is type(uint256).max, but ever so slightly cheaper - if (seqMessageIndex != sequenceNumber && sequenceNumber != ~uint256(0)) { - revert BadSequencerNumber(seqMessageIndex, sequenceNumber); - } + return ( + keccak256(bytes.concat(header, DATA_BLOB_HEADER_FLAG, abi.encodePacked(dataHashes))), + timeBounds + ); } + /// @dev Submit a batch spending report message so that the batch poster can be reimbursed on the rollup + /// @param dataHash The hash of the message the spending report is being submitted for + /// @param seqMessageIndex The index of the message to submit the spending report for + /// @param gasPrice The gas price that was paid for the data (standard gas or data gas) function submitBatchSpendingReport( bytes32 dataHash, uint256 seqMessageIndex, - IBridge.BatchDataLocation dataLocation + uint256 gasPrice ) internal { bytes memory spendingReportMsg; address batchPoster = tx.origin; - if (dataLocation == IBridge.BatchDataLocation.TxInput) { - // this msg isn't included in the current sequencer batch, but instead added to - // the delayed messages queue that is yet to be included - if (hostChainIsArbitrum) { - // Include extra gas for the host chain's L1 gas charging - uint256 l1Fees = ArbGasInfo(address(0x6c)).getCurrentTxL1GasFees(); - uint256 extraGas = l1Fees / block.basefee; - require(extraGas <= type(uint64).max, "L1_GAS_NOT_UINT64"); - spendingReportMsg = abi.encodePacked( - block.timestamp, - batchPoster, - dataHash, - seqMessageIndex, - block.basefee, - uint64(extraGas) - ); - } else { - spendingReportMsg = abi.encodePacked( - block.timestamp, - batchPoster, - dataHash, - seqMessageIndex, - block.basefee - ); - } - } else if (dataLocation == IBridge.BatchDataLocation.Blob) { - // this msg isn't included in the current sequencer batch, but instead added to - // the delayed messages queue that is yet to be included - uint256 blobBasefee = blobBasefeeReader.getBlobBaseFee(); - if (hostChainIsArbitrum) revert DataBlobsNotSupported(); + // this msg isn't included in the current sequencer batch, but instead added to + // the delayed messages queue that is yet to be included + if (hostChainIsArbitrum) { + // Include extra gas for the host chain's L1 gas charging + uint256 l1Fees = ArbGasInfo(address(0x6c)).getCurrentTxL1GasFees(); + uint256 extraGas = l1Fees / block.basefee; + require(extraGas <= type(uint64).max, "L1_GAS_NOT_UINT64"); spendingReportMsg = abi.encodePacked( block.timestamp, batchPoster, dataHash, seqMessageIndex, - blobBasefee + gasPrice, + uint64(extraGas) ); } else { - // do nothing, we only submit spending reports for tx input and blob - return; + spendingReportMsg = abi.encodePacked( + block.timestamp, + batchPoster, + dataHash, + seqMessageIndex, + gasPrice + ); } uint256 msgNum = bridge.submitBatchSpendingReport( @@ -454,8 +479,6 @@ contract SequencerInbox is GasRefundEnabled, ISequencerInbox { emit InboxMessageDelivered(msgNum, spendingReportMsg); } - function submitBlobBatchSpendingReport(bytes32 dataHash, uint256 seqMessageIndex) internal {} - function inboxAccs(uint256 index) external view returns (bytes32) { return bridge.sequencerInboxAccs(index); } diff --git a/src/libraries/Error.sol b/src/libraries/Error.sol index c7cd3808..3ba8e9bd 100644 --- a/src/libraries/Error.sol +++ b/src/libraries/Error.sol @@ -193,3 +193,9 @@ error RollupNotChanged(); /// @dev Thrown when reading the total delayed messages and getting 0 when a non zero value is expected error EmptyDelayedMessagesRead(); + +/// @dev Batch data was empty when non empty was expected +error EmptyBatchData(); + +/// @dev Unsupported header flag was provided +error InvalidHeaderFlag(bytes1); diff --git a/src/mocks/SequencerInboxStub.sol b/src/mocks/SequencerInboxStub.sol index 9970b8d3..b41c5465 100644 --- a/src/mocks/SequencerInboxStub.sol +++ b/src/mocks/SequencerInboxStub.sol @@ -38,13 +38,12 @@ contract SequencerInboxStub is SequencerInbox { require(num == 0, "ALREADY_DELAYED_INIT"); emit InboxMessageDelivered(num, initMsg); (bytes32 dataHash, IBridge.TimeBounds memory timeBounds) = formEmptyDataHash(1); - uint256 sequencerMessageCount = addSequencerL2BatchImpl( - 0, + (uint256 sequencerMessageCount, , , ) = bridge.enqueueSequencerMessage( dataHash, - timeBounds, 1, 0, 0, + timeBounds, IBridge.BatchDataLocation.NoData ); require(sequencerMessageCount == 0, "ALREADY_SEQ_INIT"); From 5187e5fcaadc81e31435f34212af884fd36bf6cb Mon Sep 17 00:00:00 2001 From: Chris Buckland Date: Tue, 5 Dec 2023 19:01:53 +0100 Subject: [PATCH 250/292] Allow zero length data --- src/bridge/SequencerInbox.sol | 27 +++++++++++++++------------ 1 file changed, 15 insertions(+), 12 deletions(-) diff --git a/src/bridge/SequencerInbox.sol b/src/bridge/SequencerInbox.sol index d9ddabc2..901b00a2 100644 --- a/src/bridge/SequencerInbox.sol +++ b/src/bridge/SequencerInbox.sol @@ -392,22 +392,25 @@ contract SequencerInbox is GasRefundEnabled, ISequencerInbox { { uint256 fullDataLen = HEADER_LENGTH + data.length; if (fullDataLen > maxDataSize) revert DataTooLarge(fullDataLen, maxDataSize); - // The first data byte must exist so that the data cannot collide with empty hash - if (data.length == 0) revert EmptyBatchData(); - // The first data byte cannot be the same as any that have been set via other methods (eg 4844 blob header) as this - // would allow the supplier of the data to spoof an incorrect 4844 data batch - if (!isValidCallDataFlag(data[0])) revert InvalidHeaderFlag(data[0]); - + (bytes memory header, IBridge.TimeBounds memory timeBounds) = packHeader( afterDelayedMessagesRead ); - // the first byte is used to identify the type of batch data - // das batches expect to have the type byte set, followed by the keyset (so they should have at least 33 bytes) - if (data[0] & DAS_MESSAGE_HEADER_FLAG != 0 && data.length >= 33) { - // we skip the first byte, then read the next 32 bytes for the keyset - bytes32 dasKeysetHash = bytes32(data[1:33]); - if (!dasKeySetInfo[dasKeysetHash].isValidKeyset) revert NoSuchKeyset(dasKeysetHash); + // the batch poster is allowed to submit an empty batch, they can use this to progress the + // delayed inbox without providing extra batch data + if(data.length > 0) { + // The first data byte cannot be the same as any that have been set via other methods (eg 4844 blob header) as this + // would allow the supplier of the data to spoof an incorrect 4844 data batch + if (!isValidCallDataFlag(data[0])) revert InvalidHeaderFlag(data[0]); + + // the first byte is used to identify the type of batch data + // das batches expect to have the type byte set, followed by the keyset (so they should have at least 33 bytes) + if (data[0] & DAS_MESSAGE_HEADER_FLAG != 0 && data.length >= 33) { + // we skip the first byte, then read the next 32 bytes for the keyset + bytes32 dasKeysetHash = bytes32(data[1:33]); + if (!dasKeySetInfo[dasKeysetHash].isValidKeyset) revert NoSuchKeyset(dasKeysetHash); + } } return (keccak256(bytes.concat(header, data)), timeBounds); } From 5c0f0d1adabe3dbabea0cfab05079ab50927501a Mon Sep 17 00:00:00 2001 From: Chris Buckland Date: Tue, 5 Dec 2023 19:04:53 +0100 Subject: [PATCH 251/292] Additional comments --- src/bridge/SequencerInbox.sol | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/src/bridge/SequencerInbox.sol b/src/bridge/SequencerInbox.sol index 901b00a2..de714fa9 100644 --- a/src/bridge/SequencerInbox.sol +++ b/src/bridge/SequencerInbox.sol @@ -392,20 +392,22 @@ contract SequencerInbox is GasRefundEnabled, ISequencerInbox { { uint256 fullDataLen = HEADER_LENGTH + data.length; if (fullDataLen > maxDataSize) revert DataTooLarge(fullDataLen, maxDataSize); - + (bytes memory header, IBridge.TimeBounds memory timeBounds) = packHeader( afterDelayedMessagesRead ); - // the batch poster is allowed to submit an empty batch, they can use this to progress the + // the batch poster is allowed to submit an empty batch, they can use this to progress the // delayed inbox without providing extra batch data - if(data.length > 0) { + if (data.length > 0) { // The first data byte cannot be the same as any that have been set via other methods (eg 4844 blob header) as this // would allow the supplier of the data to spoof an incorrect 4844 data batch if (!isValidCallDataFlag(data[0])) revert InvalidHeaderFlag(data[0]); // the first byte is used to identify the type of batch data // das batches expect to have the type byte set, followed by the keyset (so they should have at least 33 bytes) + // if invalid data is supplied here the state transition function will process it as an empty block + // however we can provide a nice additional check here for the batch poster if (data[0] & DAS_MESSAGE_HEADER_FLAG != 0 && data.length >= 33) { // we skip the first byte, then read the next 32 bytes for the keyset bytes32 dasKeysetHash = bytes32(data[1:33]); From c84363dcf58686047ac36942f5a3c17ba94e1a38 Mon Sep 17 00:00:00 2001 From: Chris Buckland Date: Mon, 11 Dec 2023 14:05:49 +0100 Subject: [PATCH 252/292] Updated 4844 tests --- test/contract/sequencerInbox.spec.4844.ts | 1 - test/contract/toolkit4844.ts | 2 +- 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/test/contract/sequencerInbox.spec.4844.ts b/test/contract/sequencerInbox.spec.4844.ts index f80125a4..0db25b39 100644 --- a/test/contract/sequencerInbox.spec.4844.ts +++ b/test/contract/sequencerInbox.spec.4844.ts @@ -426,7 +426,6 @@ describe('SequencerInbox', async () => { 'addSequencerL2BatchFromBlob', [ sequenceNumber, - Toolkit4844.DATA_BLOB_HEADER_FLAG, afterDelayedMessagesRead, constants.AddressZero, subMessageCount, diff --git a/test/contract/toolkit4844.ts b/test/contract/toolkit4844.ts index a1af93f6..bca1ea14 100644 --- a/test/contract/toolkit4844.ts +++ b/test/contract/toolkit4844.ts @@ -17,7 +17,7 @@ const wait = async (ms: number) => }) export class Toolkit4844 { - public static DATA_BLOB_HEADER_FLAG = '0x10' + public static DATA_BLOB_HEADER_FLAG = '0x40' public static postDataToGeth(body: any): Promise { return new Promise((resolve, reject) => { From 59740962bde680285c6d09eb6277979463c8c494 Mon Sep 17 00:00:00 2001 From: Chris Buckland Date: Mon, 11 Dec 2023 15:37:40 +0100 Subject: [PATCH 253/292] Updated seq inbox batch normal test --- test/contract/sequencerInbox.spec.4844.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/contract/sequencerInbox.spec.4844.ts b/test/contract/sequencerInbox.spec.4844.ts index 0db25b39..65532113 100644 --- a/test/contract/sequencerInbox.spec.4844.ts +++ b/test/contract/sequencerInbox.spec.4844.ts @@ -383,7 +383,7 @@ describe('SequencerInbox', async () => { .connect(batchPoster) .functions.addSequencerL2BatchFromOrigin( await bridge.sequencerMessageCount(), - '0x0142', + '0x0042', await bridge.delayedMessageCount(), constants.AddressZero, subMessageCount, From 9265e953f2c2d96bbd8f8b667fa181dd1b771c36 Mon Sep 17 00:00:00 2001 From: Rachel Bousfield Date: Sat, 30 Dec 2023 17:43:22 -0600 Subject: [PATCH 254/292] update change date --- LICENSE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/LICENSE b/LICENSE index 8217feee..56b5f042 100644 --- a/LICENSE +++ b/LICENSE @@ -10,7 +10,7 @@ Parameters Licensor: Offchain Labs Licensed Work: Arbitrum Nitro Contracts - The Licensed Work is (c) 2021-2023 Offchain Labs + The Licensed Work is (c) 2021-2024 Offchain Labs Additional Use Grant: You may use the Licensed Work in a production environment solely to provide a point of interface to permit end users or applications @@ -30,7 +30,7 @@ Additional Use Grant: You may use the Licensed Work in a production environment -Change Date: Dec 31, 2027 +Change Date: Dec 31, 2028 Change License: Apache License Version 2.0 From b0158487cea5d5533837e37e46be1f79303921ba Mon Sep 17 00:00:00 2001 From: Lee Bousfield Date: Tue, 2 Jan 2024 15:23:56 -0600 Subject: [PATCH 255/292] Add KZG preimage proof --- src/osp/OneStepProverHostIo.sol | 60 +++++++++++++++++++++++++++++++-- 1 file changed, 58 insertions(+), 2 deletions(-) diff --git a/src/osp/OneStepProverHostIo.sol b/src/osp/OneStepProverHostIo.sol index 0206572f..afe53217 100644 --- a/src/osp/OneStepProverHostIo.sol +++ b/src/osp/OneStepProverHostIo.sol @@ -101,16 +101,21 @@ contract OneStepProverHostIo is IOneStepProver { state.u64Vals[idx] = val; } + uint256 constant BLS_MODULUS = + 52435875175126190479447740508185965837690552500527637822603658699938581184513; + uint256 constant PRIMITIVE_ROOT_OF_UNITY = + 10238227357739495823651030575849232062558860180284477541189508159991286009131; + function executeReadPreImage( ExecutionContext calldata, Machine memory mach, Module memory mod, Instruction calldata inst, bytes calldata proof - ) internal pure { + ) internal view { uint256 preimageOffset = mach.valueStack.pop().assumeI32(); uint256 ptr = mach.valueStack.pop().assumeI32(); - if (ptr + 32 > mod.moduleMemory.size || ptr % LEAF_SIZE != 0) { + if (preimageOffset % 32 != 0 || ptr + 32 > mod.moduleMemory.size || ptr % LEAF_SIZE != 0) { mach.status = MachineStatus.ERRORED; return; } @@ -158,6 +163,57 @@ contract OneStepProverHostIo is IOneStepProver { preimageEnd = preimage.length; } extracted = preimage[preimageOffset:preimageEnd]; + } else if (inst.argumentData == 2) { + // The machine is asking for an Ethereum versioned hash preimage + + require(proofType == 0, "UNKNOWN_PREIMAGE_PROOF"); + + bytes calldata kzgProof = proof[proofOffset:]; + + require(bytes32(kzgProof[:32]) == leafContents, "KZG_PROOF_WRONG_HASH"); + + (bool success, bytes memory kzgParams) = address(0x0A).staticcall(kzgProof); + require(success, "INVALID_KZG_PROOF"); + require(kzgParams.length > 0, "KZG_PRECOMPILE_MISSING"); + (uint256 fieldElementsPerBlob, ) = abi.decode(kzgParams, (uint256, uint256)); + + // If preimageOffset is greater than the blob size, leave extracted empty and call it here. + if (preimageOffset < fieldElementsPerBlob * 32) { + // We need to compute what point the polynomial should be evaluated at to get the right part of the preimage. + // KZG commitments use a bit reversal permutation to order the roots of unity. + // To account for that, we reverse the bit order of the index. + uint256 bitReversedIndex = 0; + // preimageOffset was required to be 32 byte aligned above + uint256 tmp = preimageOffset / 32; + for (uint256 i = 1; i < fieldElementsPerBlob; i *= 2) { + bitReversedIndex <<= 1; + if (tmp & 1 == 1) { + bitReversedIndex |= 1; + } + tmp >>= 1; + } + + uint256 rootOfUnityPower = (1 << 32) / fieldElementsPerBlob; + rootOfUnityPower *= bitReversedIndex; + bytes memory modExpInput = abi.encode( + 32, + 32, + 32, + PRIMITIVE_ROOT_OF_UNITY, + rootOfUnityPower, + BLS_MODULUS + ); + (bool modexpSuccess, bytes memory modExpOutput) = address(0x05).staticcall( + modExpInput + ); + require(modexpSuccess, "MODEXP_FAILED"); + + uint256 rootOfUnity = abi.decode(modExpOutput, (uint256)); + + require(bytes32(kzgProof[32:64]) == bytes32(rootOfUnity), "KZG_PROOF_WRONG_Z"); + + extracted = kzgProof[64:96]; + } } else { revert("UNKNOWN_PREIMAGE_TYPE"); } From c1ca7ce29b8442b0d8dbbde3c75a8ab551ec0ac8 Mon Sep 17 00:00:00 2001 From: Lee Bousfield Date: Mon, 8 Jan 2024 10:36:12 -0600 Subject: [PATCH 256/292] Clarify that we're iterating over bits --- src/osp/OneStepProverHostIo.sol | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/osp/OneStepProverHostIo.sol b/src/osp/OneStepProverHostIo.sol index afe53217..51d67c96 100644 --- a/src/osp/OneStepProverHostIo.sol +++ b/src/osp/OneStepProverHostIo.sol @@ -185,7 +185,7 @@ contract OneStepProverHostIo is IOneStepProver { uint256 bitReversedIndex = 0; // preimageOffset was required to be 32 byte aligned above uint256 tmp = preimageOffset / 32; - for (uint256 i = 1; i < fieldElementsPerBlob; i *= 2) { + for (uint256 i = 1; i < fieldElementsPerBlob; i <<= 1) { bitReversedIndex <<= 1; if (tmp & 1 == 1) { bitReversedIndex |= 1; From 7f4dffcf6964697664cc9fb4afa7e4a14814fea3 Mon Sep 17 00:00:00 2001 From: Lee Bousfield Date: Tue, 9 Jan 2024 11:39:30 -0600 Subject: [PATCH 257/292] Pull out modExp256 into function --- src/osp/OneStepProverHostIo.sol | 31 ++++++++++++++++++++----------- 1 file changed, 20 insertions(+), 11 deletions(-) diff --git a/src/osp/OneStepProverHostIo.sol b/src/osp/OneStepProverHostIo.sol index 51d67c96..d13b3bf2 100644 --- a/src/osp/OneStepProverHostIo.sol +++ b/src/osp/OneStepProverHostIo.sol @@ -106,6 +106,25 @@ contract OneStepProverHostIo is IOneStepProver { uint256 constant PRIMITIVE_ROOT_OF_UNITY = 10238227357739495823651030575849232062558860180284477541189508159991286009131; + // Computes b**e % m + // Really pure but the Solidity compiler sees the staticcall and requires view + function modExp256(uint256 b, uint256 e, uint256 m) internal view returns (uint256) { + bytes memory modExpInput = abi.encode( + 32, + 32, + 32, + b, + e, + m + ); + (bool modexpSuccess, bytes memory modExpOutput) = address(0x05).staticcall( + modExpInput + ); + require(modexpSuccess, "MODEXP_FAILED"); + require(modExpOutput.length == 32, "MODEXP_WRONG_LENGTH"); + return uint256(bytes32(modExpOutput)); + } + function executeReadPreImage( ExecutionContext calldata, Machine memory mach, @@ -195,21 +214,11 @@ contract OneStepProverHostIo is IOneStepProver { uint256 rootOfUnityPower = (1 << 32) / fieldElementsPerBlob; rootOfUnityPower *= bitReversedIndex; - bytes memory modExpInput = abi.encode( - 32, - 32, - 32, + uint256 rootOfUnity = modExp256( PRIMITIVE_ROOT_OF_UNITY, rootOfUnityPower, BLS_MODULUS ); - (bool modexpSuccess, bytes memory modExpOutput) = address(0x05).staticcall( - modExpInput - ); - require(modexpSuccess, "MODEXP_FAILED"); - - uint256 rootOfUnity = abi.decode(modExpOutput, (uint256)); - require(bytes32(kzgProof[32:64]) == bytes32(rootOfUnity), "KZG_PROOF_WRONG_Z"); extracted = kzgProof[64:96]; From 154e95bf5e805b433af5265987e5752c05fee9b4 Mon Sep 17 00:00:00 2001 From: Lee Bousfield Date: Tue, 9 Jan 2024 21:18:49 -0600 Subject: [PATCH 258/292] Fix formatting --- src/osp/OneStepProverHostIo.sol | 19 +++++++------------ 1 file changed, 7 insertions(+), 12 deletions(-) diff --git a/src/osp/OneStepProverHostIo.sol b/src/osp/OneStepProverHostIo.sol index d13b3bf2..fe95ef2a 100644 --- a/src/osp/OneStepProverHostIo.sol +++ b/src/osp/OneStepProverHostIo.sol @@ -108,18 +108,13 @@ contract OneStepProverHostIo is IOneStepProver { // Computes b**e % m // Really pure but the Solidity compiler sees the staticcall and requires view - function modExp256(uint256 b, uint256 e, uint256 m) internal view returns (uint256) { - bytes memory modExpInput = abi.encode( - 32, - 32, - 32, - b, - e, - m - ); - (bool modexpSuccess, bytes memory modExpOutput) = address(0x05).staticcall( - modExpInput - ); + function modExp256( + uint256 b, + uint256 e, + uint256 m + ) internal view returns (uint256) { + bytes memory modExpInput = abi.encode(32, 32, 32, b, e, m); + (bool modexpSuccess, bytes memory modExpOutput) = address(0x05).staticcall(modExpInput); require(modexpSuccess, "MODEXP_FAILED"); require(modExpOutput.length == 32, "MODEXP_WRONG_LENGTH"); return uint256(bytes32(modExpOutput)); From 3b38b3049ea82e4129a5067e8e4538f994ab46b6 Mon Sep 17 00:00:00 2001 From: Lee Bousfield Date: Mon, 15 Jan 2024 23:07:28 -0700 Subject: [PATCH 259/292] Address some PR comments --- src/osp/OneStepProverHostIo.sol | 24 +++++++++++++++++------- 1 file changed, 17 insertions(+), 7 deletions(-) diff --git a/src/osp/OneStepProverHostIo.sol b/src/osp/OneStepProverHostIo.sol index fe95ef2a..92d80c69 100644 --- a/src/osp/OneStepProverHostIo.sol +++ b/src/osp/OneStepProverHostIo.sol @@ -186,10 +186,14 @@ contract OneStepProverHostIo is IOneStepProver { require(bytes32(kzgProof[:32]) == leafContents, "KZG_PROOF_WRONG_HASH"); - (bool success, bytes memory kzgParams) = address(0x0A).staticcall(kzgProof); - require(success, "INVALID_KZG_PROOF"); - require(kzgParams.length > 0, "KZG_PRECOMPILE_MISSING"); - (uint256 fieldElementsPerBlob, ) = abi.decode(kzgParams, (uint256, uint256)); + uint256 fieldElementsPerBlob; + uint256 blsModulus; + { + (bool success, bytes memory kzgParams) = address(0x0A).staticcall(kzgProof); + require(success, "INVALID_KZG_PROOF"); + require(kzgParams.length > 0, "KZG_PRECOMPILE_MISSING"); + (fieldElementsPerBlob, blsModulus) = abi.decode(kzgParams, (uint256, uint256)); + } // If preimageOffset is greater than the blob size, leave extracted empty and call it here. if (preimageOffset < fieldElementsPerBlob * 32) { @@ -207,14 +211,20 @@ contract OneStepProverHostIo is IOneStepProver { tmp >>= 1; } + // First, we get the root of unity of order 2**fieldElementsPerBlob. + // We start with a root of unity of order 2**32 and then raise it to + // the power of (2**32)/fieldElementsPerBlob to get root of unity we need. uint256 rootOfUnityPower = (1 << 32) / fieldElementsPerBlob; + // Then, we raise the root of unity to the power of bitReversedIndex, + // to retrieve this word of the KZG commitment. rootOfUnityPower *= bitReversedIndex; - uint256 rootOfUnity = modExp256( + // z is the point the polynomial is evaluated at to retrieve this word of data + uint256 z = modExp256( PRIMITIVE_ROOT_OF_UNITY, rootOfUnityPower, - BLS_MODULUS + blsModulus ); - require(bytes32(kzgProof[32:64]) == bytes32(rootOfUnity), "KZG_PROOF_WRONG_Z"); + require(bytes32(kzgProof[32:64]) == bytes32(z), "KZG_PROOF_WRONG_Z"); extracted = kzgProof[64:96]; } From 95ed12b8a0e93b4b898ae5786cb17d3cd1f50ccb Mon Sep 17 00:00:00 2001 From: Lee Bousfield Date: Mon, 15 Jan 2024 23:09:48 -0700 Subject: [PATCH 260/292] Add additional comment explaining proof data --- src/osp/OneStepProverHostIo.sol | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/osp/OneStepProverHostIo.sol b/src/osp/OneStepProverHostIo.sol index 92d80c69..fb014384 100644 --- a/src/osp/OneStepProverHostIo.sol +++ b/src/osp/OneStepProverHostIo.sol @@ -182,6 +182,8 @@ contract OneStepProverHostIo is IOneStepProver { require(proofType == 0, "UNKNOWN_PREIMAGE_PROOF"); + // kzgProof should be a valid input to the EIP-4844 point evaluation precompile at address 0x0A. + // It should prove the preimageOffset/32'th word of the machine's requested KZG commitment. bytes calldata kzgProof = proof[proofOffset:]; require(bytes32(kzgProof[:32]) == leafContents, "KZG_PROOF_WRONG_HASH"); From 736412873f58d241d92c172d62834175f4c5611d Mon Sep 17 00:00:00 2001 From: Lee Bousfield Date: Mon, 15 Jan 2024 23:14:31 -0700 Subject: [PATCH 261/292] Require blsModulus matches expected value --- src/osp/OneStepProverHostIo.sol | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/src/osp/OneStepProverHostIo.sol b/src/osp/OneStepProverHostIo.sol index fb014384..f8e39ee9 100644 --- a/src/osp/OneStepProverHostIo.sol +++ b/src/osp/OneStepProverHostIo.sol @@ -101,9 +101,9 @@ contract OneStepProverHostIo is IOneStepProver { state.u64Vals[idx] = val; } - uint256 constant BLS_MODULUS = + uint256 internal constant BLS_MODULUS = 52435875175126190479447740508185965837690552500527637822603658699938581184513; - uint256 constant PRIMITIVE_ROOT_OF_UNITY = + uint256 internal constant PRIMITIVE_ROOT_OF_UNITY = 10238227357739495823651030575849232062558860180284477541189508159991286009131; // Computes b**e % m @@ -197,6 +197,11 @@ contract OneStepProverHostIo is IOneStepProver { (fieldElementsPerBlob, blsModulus) = abi.decode(kzgParams, (uint256, uint256)); } + // With a hardcoded PRIMITIVE_ROOT_OF_UNITY, we can only support this BLS modulus. + // It may be worth in the future supporting arbitrary BLS moduli, but we would likely need to + // validate a user-supplied root of unity. + require(blsModulus == BLS_MODULUS, "UNKNOWN_BLS_MODULUS"); + // If preimageOffset is greater than the blob size, leave extracted empty and call it here. if (preimageOffset < fieldElementsPerBlob * 32) { // We need to compute what point the polynomial should be evaluated at to get the right part of the preimage. @@ -221,11 +226,7 @@ contract OneStepProverHostIo is IOneStepProver { // to retrieve this word of the KZG commitment. rootOfUnityPower *= bitReversedIndex; // z is the point the polynomial is evaluated at to retrieve this word of data - uint256 z = modExp256( - PRIMITIVE_ROOT_OF_UNITY, - rootOfUnityPower, - blsModulus - ); + uint256 z = modExp256(PRIMITIVE_ROOT_OF_UNITY, rootOfUnityPower, blsModulus); require(bytes32(kzgProof[32:64]) == bytes32(z), "KZG_PROOF_WRONG_Z"); extracted = kzgProof[64:96]; From 61197baf3a298f2a380caaed13456dfe0d406f7b Mon Sep 17 00:00:00 2001 From: Lee Bousfield Date: Mon, 15 Jan 2024 23:15:24 -0700 Subject: [PATCH 262/292] Fix comparison in comment --- src/osp/OneStepProverHostIo.sol | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/osp/OneStepProverHostIo.sol b/src/osp/OneStepProverHostIo.sol index f8e39ee9..ec0ed85e 100644 --- a/src/osp/OneStepProverHostIo.sol +++ b/src/osp/OneStepProverHostIo.sol @@ -202,7 +202,7 @@ contract OneStepProverHostIo is IOneStepProver { // validate a user-supplied root of unity. require(blsModulus == BLS_MODULUS, "UNKNOWN_BLS_MODULUS"); - // If preimageOffset is greater than the blob size, leave extracted empty and call it here. + // If preimageOffset is greater than or equal to the blob size, leave extracted empty and call it here. if (preimageOffset < fieldElementsPerBlob * 32) { // We need to compute what point the polynomial should be evaluated at to get the right part of the preimage. // KZG commitments use a bit reversal permutation to order the roots of unity. From 235bc45bdb44177bf02507d9fdd6fe066871c98e Mon Sep 17 00:00:00 2001 From: gzeon Date: Wed, 17 Jan 2024 00:14:39 +0800 Subject: [PATCH 263/292] fix: test account init --- test/contract/arbRollup.spec.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/contract/arbRollup.spec.ts b/test/contract/arbRollup.spec.ts index d9d44da9..fae8d725 100644 --- a/test/contract/arbRollup.spec.ts +++ b/test/contract/arbRollup.spec.ts @@ -121,7 +121,7 @@ async function getDefaultConfig( } const setup = async () => { - const accounts = await initializeAccounts() + accounts = await initializeAccounts() admin = accounts[0] const user = accounts[1] From 3b59719ae77df665d54d4f7afcb41bd7b8788c06 Mon Sep 17 00:00:00 2001 From: gzeon Date: Thu, 18 Jan 2024 16:24:11 +0800 Subject: [PATCH 264/292] refactor: remove sequencer immutable optimation --- LICENSE | 4 +- deploy/BridgeStubCreator.js | 2 +- foundry.toml | 1 + package.json | 1 - scripts/config.ts.example | 8 +- src/bridge/AbsBridge.sol | 34 +- src/bridge/AbsOutbox.sol | 1 - src/bridge/IBridge.sol | 18 +- src/bridge/ISequencerInbox.sol | 47 ++- src/bridge/SequencerInbox.sol | 379 ++++++++++++++---- src/libraries/Error.sol | 3 - src/mocks/BridgeStub.sol | 31 +- src/mocks/SequencerInboxStub.sol | 31 +- src/rollup/AbsRollupEventInbox.sol | 1 - src/rollup/BridgeCreator.sol | 39 +- src/rollup/RollupCreator.sol | 32 +- src/test-helpers/BridgeTester.sol | 6 +- test/contract/arbRollup.spec.ts | 31 +- test/contract/sequencerInbox.spec.4844.ts | 70 ++-- .../sequencerInboxForceInclude.spec.ts | 68 ++-- test/foundry/AbsBridge.t.sol | 56 +-- test/foundry/AbsInbox.t.sol | 36 +- test/foundry/BridgeCreator.t.sol | 120 +++--- test/foundry/ERC20Bridge.t.sol | 33 +- test/foundry/ERC20Inbox.t.sol | 3 +- test/foundry/RollupCreator.t.sol | 143 +++---- test/foundry/SequencerInbox.t.sol | 318 +++++++++++++++ test/foundry/util/TestUtil.sol | 21 + test/storage/Bridge | 3 +- test/storage/ERC20Bridge | 3 +- test/storage/SequencerInbox | 19 +- 31 files changed, 988 insertions(+), 574 deletions(-) create mode 100644 test/foundry/SequencerInbox.t.sol diff --git a/LICENSE b/LICENSE index 8217feee..56b5f042 100644 --- a/LICENSE +++ b/LICENSE @@ -10,7 +10,7 @@ Parameters Licensor: Offchain Labs Licensed Work: Arbitrum Nitro Contracts - The Licensed Work is (c) 2021-2023 Offchain Labs + The Licensed Work is (c) 2021-2024 Offchain Labs Additional Use Grant: You may use the Licensed Work in a production environment solely to provide a point of interface to permit end users or applications @@ -30,7 +30,7 @@ Additional Use Grant: You may use the Licensed Work in a production environment -Change Date: Dec 31, 2027 +Change Date: Dec 31, 2028 Change License: Apache License Version 2.0 diff --git a/deploy/BridgeStubCreator.js b/deploy/BridgeStubCreator.js index 99e524af..9fe34dde 100644 --- a/deploy/BridgeStubCreator.js +++ b/deploy/BridgeStubCreator.js @@ -3,7 +3,7 @@ module.exports = async hre => { const { deploy } = deployments const { deployer } = await getNamedAccounts() - await deploy('BridgeStub', { from: deployer, args: [deployer] }) + await deploy('BridgeStub', { from: deployer, args: [] }) } module.exports.tags = ['BridgeStub', 'test'] diff --git a/foundry.toml b/foundry.toml index 1e26c1ed..774b6a24 100644 --- a/foundry.toml +++ b/foundry.toml @@ -7,6 +7,7 @@ cache_path = 'forge-cache/sol' optimizer = true optimizer_runs = 20000 via_ir = false +solc_version = '0.8.9' [profile.yul] src = 'yul' diff --git a/package.json b/package.json index 97770fc9..9af3259a 100644 --- a/package.json +++ b/package.json @@ -36,7 +36,6 @@ "test:e2e": "hardhat test test/e2e/*.ts", "postinstall": "patch-package", "deploy-factory": "hardhat run scripts/deployment.ts", - "deploy-rollup": "hardhat run scripts/rollupCreation.ts", "deploy-eth-rollup": "hardhat run scripts/createEthRollup.ts", "deploy-erc20-rollup": "hardhat run scripts/createERC20Rollup.ts" }, diff --git a/scripts/config.ts.example b/scripts/config.ts.example index cb557aa1..cf5d8704 100644 --- a/scripts/config.ts.example +++ b/scripts/config.ts.example @@ -19,10 +19,10 @@ export const config = { '{"chainId":13331370,"homesteadBlock":0,"daoForkBlock":null,"daoForkSupport":true,"eip150Block":0,"eip150Hash":"0x0000000000000000000000000000000000000000000000000000000000000000","eip155Block":0,"eip158Block":0,"byzantiumBlock":0,"constantinopleBlock":0,"petersburgBlock":0,"istanbulBlock":0,"muirGlacierBlock":0,"berlinBlock":0,"londonBlock":0,"clique":{"period":0,"epoch":0},"arbitrum":{"EnableArbOS":true,"AllowDebugPrecompiles":false,"DataAvailabilityCommittee":false,"InitialArbOSVersion":10,"InitialChainOwner":"0x1234123412341234123412341234123412341234","GenesisBlockNum":0}}', genesisBlockNum: ethers.BigNumber.from('0'), sequencerInboxMaxTimeVariation: { - delayBlocks: 5760, - futureBlocks: 12, - delaySeconds: 86400, - futureSeconds: 3600, + delayBlocks: ethers.BigNumber.from('5760'), + futureBlocks: ethers.BigNumber.from('12'), + delaySeconds: ethers.BigNumber.from('86400'), + futureSeconds: ethers.BigNumber.from('3600'), }, }, validators: [ diff --git a/src/bridge/AbsBridge.sol b/src/bridge/AbsBridge.sol index 471c4a2b..bafd56f9 100644 --- a/src/bridge/AbsBridge.sol +++ b/src/bridge/AbsBridge.sol @@ -14,15 +14,11 @@ import { NotSequencerInbox, NotOutbox, InvalidOutboxSet, - BadSequencerMessageNumber, - EmptyDelayedMessagesRead, - DelayedBackwards, - DelayedTooFar + BadSequencerMessageNumber } from "../libraries/Error.sol"; import "./IBridge.sol"; import "./Messages.sol"; import "../libraries/DelegateCallAware.sol"; -import "./ISequencerInbox.sol"; import {L1MessageType_batchPostingReport} from "../libraries/MessageTypes.sol"; @@ -59,15 +55,8 @@ abstract contract AbsBridge is Initializable, DelegateCallAware, IBridge { uint256 public override sequencerReportedSubMessageCount; - uint256 public totalDelayedMessagesRead; - address internal constant EMPTY_ACTIVEOUTBOX = address(type(uint160).max); - function postUpgradeInit() external onlyDelegated onlyProxyOwner { - totalDelayedMessagesRead = ISequencerInbox(sequencerInbox).totalDelayedMessagesRead(); - if (totalDelayedMessagesRead == 0) revert EmptyDelayedMessagesRead(); - } - modifier onlyRollupOrOwner() { if (msg.sender != address(rollup)) { address rollupOwner = rollup.owner(); @@ -112,9 +101,7 @@ abstract contract AbsBridge is Initializable, DelegateCallAware, IBridge { bytes32 dataHash, uint256 afterDelayedMessagesRead, uint256 prevMessageCount, - uint256 newMessageCount, - TimeBounds memory timeBounds, - BatchDataLocation batchDataLocation + uint256 newMessageCount ) external onlySequencerInbox @@ -132,9 +119,6 @@ abstract contract AbsBridge is Initializable, DelegateCallAware, IBridge { ) { revert BadSequencerMessageNumber(sequencerReportedSubMessageCount, prevMessageCount); } - if (afterDelayedMessagesRead > delayedInboxAccs.length) revert DelayedTooFar(); - if (afterDelayedMessagesRead < totalDelayedMessagesRead) revert DelayedBackwards(); - sequencerReportedSubMessageCount = newMessageCount; seqMessageIndex = sequencerInboxAccs.length; if (sequencerInboxAccs.length > 0) { @@ -145,18 +129,6 @@ abstract contract AbsBridge is Initializable, DelegateCallAware, IBridge { } acc = keccak256(abi.encodePacked(beforeAcc, dataHash, delayedAcc)); sequencerInboxAccs.push(acc); - totalDelayedMessagesRead = afterDelayedMessagesRead; - - emit SequencerBatchDelivered( - seqMessageIndex, - beforeAcc, - acc, - delayedAcc, - afterDelayedMessagesRead, - timeBounds, - batchDataLocation, - msg.sender - ); } /// @inheritdoc IBridge @@ -332,5 +304,5 @@ abstract contract AbsBridge is Initializable, DelegateCallAware, IBridge { * variables without shifting down storage in the inheritance chain. * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps */ - uint256[39] private __gap; + uint256[40] private __gap; } diff --git a/src/bridge/AbsOutbox.sol b/src/bridge/AbsOutbox.sol index c73f4213..4dabf9ff 100644 --- a/src/bridge/AbsOutbox.sol +++ b/src/bridge/AbsOutbox.sol @@ -76,7 +76,6 @@ abstract contract AbsOutbox is DelegateCallAware, IOutbox { }); bridge = _bridge; rollup = address(_bridge.rollup()); - if (address(rollup) == address(0)) revert RollupNotChanged(); } function postUpgradeInit() external onlyDelegated onlyProxyOwner { diff --git a/src/bridge/IBridge.sol b/src/bridge/IBridge.sol index 5c1ef477..1137fcd3 100644 --- a/src/bridge/IBridge.sol +++ b/src/bridge/IBridge.sol @@ -4,7 +4,6 @@ // solhint-disable-next-line compiler-version pragma solidity >=0.6.9 <0.9.0; -pragma experimental ABIEncoderV2; import "./IOwnable.sol"; @@ -49,17 +48,6 @@ interface IBridge { bytes data ); - event SequencerBatchDelivered( - uint256 indexed batchSequenceNumber, - bytes32 indexed beforeAcc, - bytes32 indexed afterAcc, - bytes32 delayedAcc, - uint256 afterDelayedMessagesRead, - TimeBounds timeBounds, - BatchDataLocation dataLocation, - address sequencerInbox - ); - event InboxToggle(address indexed inbox, bool enabled); event OutboxToggle(address indexed outbox, bool enabled); @@ -100,17 +88,13 @@ interface IBridge { function sequencerMessageCount() external view returns (uint256); - function totalDelayedMessagesRead() external view returns (uint256); - // ---------- onlySequencerInbox functions ---------- function enqueueSequencerMessage( bytes32 dataHash, uint256 afterDelayedMessagesRead, uint256 prevMessageCount, - uint256 newMessageCount, - TimeBounds memory timeBounds, - BatchDataLocation dataLocation + uint256 newMessageCount ) external returns ( diff --git a/src/bridge/ISequencerInbox.sol b/src/bridge/ISequencerInbox.sol index 135436fc..077729a9 100644 --- a/src/bridge/ISequencerInbox.sol +++ b/src/bridge/ISequencerInbox.sol @@ -11,11 +11,6 @@ import "./IDelayedMessageProvider.sol"; import "./IBridge.sol"; interface ISequencerInbox is IDelayedMessageProvider { - /// @notice The maximum amount of time variatin between a message being posted on the L1 and being executed on the L2 - /// @param delayBlocks The max amount of blocks in the past that a message can be received on L2 - /// @param futureBlocks The max amount of blocks in the future that a message can be received on L2 - /// @param delaySeconds The max amount of seconds in the past that a message can be received on L2 - /// @param futureSeconds The max amount of seconds in the future that a message can be received on L2 struct MaxTimeVariation { uint64 delayBlocks; uint64 futureBlocks; @@ -23,6 +18,16 @@ interface ISequencerInbox is IDelayedMessageProvider { uint64 futureSeconds; } + event SequencerBatchDelivered( + uint256 indexed batchSequenceNumber, + bytes32 indexed beforeAcc, + bytes32 indexed afterAcc, + bytes32 delayedAcc, + uint256 afterDelayedMessagesRead, + IBridge.TimeBounds timeBounds, + IBridge.BatchDataLocation dataLocation + ); + event OwnerFunctionCalled(uint256 indexed id); /// @dev a separate event that emits batch data when this isn't easily accessible in the tx.input @@ -34,8 +39,6 @@ interface ISequencerInbox is IDelayedMessageProvider { /// @dev a keyset was invalidated event InvalidateKeyset(bytes32 indexed keysetHash); - /// @notice The total number of delated messages read in the bridge - /// @dev We surface this here for backwards compatibility function totalDelayedMessagesRead() external view returns (uint256); function bridge() external view returns (IBridge); @@ -87,11 +90,22 @@ interface ISequencerInbox is IDelayedMessageProvider { uint64 creationBlock; } - /// @notice Returns the max time variation settings for this sequencer inbox - function maxTimeVariation() external view returns (ISequencerInbox.MaxTimeVariation memory); + /// @dev returns 4 uint256 to be compatible with older version + function maxTimeVariation() + external + view + returns ( + uint256 delayBlocks, + uint256 futureBlocks, + uint256 delaySeconds, + uint256 futureSeconds + ); function dasKeySetInfo(bytes32) external view returns (bool, uint64); + /// @notice Remove force inclusion delay after a L1 chainId fork + function removeDelayAfterFork() 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 @@ -126,9 +140,7 @@ interface ISequencerInbox is IDelayedMessageProvider { uint256 sequenceNumber, bytes calldata data, uint256 afterDelayedMessagesRead, - IGasRefunder gasRefunder, - uint256 prevMessageCount, - uint256 newMessageCount + IGasRefunder gasRefunder ) external; function addSequencerL2Batch( @@ -142,6 +154,12 @@ interface ISequencerInbox is IDelayedMessageProvider { // ---------- onlyRollupOrOwner functions ---------- + /** + * @notice Set max delay for sequencer inbox + * @param maxTimeVariation_ the maximum time variation parameters + */ + function setMaxTimeVariation(MaxTimeVariation memory maxTimeVariation_) external; + /** * @notice Updates whether an address is authorized to be a batch poster at the sequencer inbox * @param addr the address @@ -169,7 +187,10 @@ interface ISequencerInbox is IDelayedMessageProvider { */ function setIsSequencer(address addr, bool isSequencer_) external; - /// @notice Allows the rollup owner to sync the rollup address + // ---------- initializer ---------- + + function initialize(IBridge bridge_, MaxTimeVariation calldata maxTimeVariation_) external; + function updateRollupAddress() external; } diff --git a/src/bridge/SequencerInbox.sol b/src/bridge/SequencerInbox.sol index c07dec8f..7aef44b8 100644 --- a/src/bridge/SequencerInbox.sol +++ b/src/bridge/SequencerInbox.sol @@ -7,6 +7,7 @@ pragma solidity ^0.8.0; import { AlreadyInit, HadZeroInit, + BadPostUpgradeInit, NotOrigin, DataTooLarge, NotRollup, @@ -40,6 +41,7 @@ import "../precompiles/ArbSys.sol"; import {L1MessageType_batchPostingReport} from "../libraries/MessageTypes.sol"; import {GasRefundEnabled, IGasRefunder} from "../libraries/IGasRefunder.sol"; +import "../libraries/DelegateCallAware.sol"; import "../libraries/ArbitrumChecker.sol"; /** @@ -49,8 +51,10 @@ import "../libraries/ArbitrumChecker.sol"; * in the delayed inbox (Bridge.sol). If items in the delayed inbox are not included by a * sequencer within a time limit they can be force included into the rollup inbox by anyone. */ -contract SequencerInbox is GasRefundEnabled, ISequencerInbox { - IBridge public immutable bridge; +contract SequencerInbox is DelegateCallAware, GasRefundEnabled, ISequencerInbox { + uint256 public totalDelayedMessagesRead; + + IBridge public bridge; /// @inheritdoc ISequencerInbox uint256 public constant HEADER_LENGTH = 40; @@ -72,11 +76,9 @@ contract SequencerInbox is GasRefundEnabled, ISequencerInbox { IOwnable public rollup; mapping(address => bool) public isBatchPoster; - // see ISequencerInbox.MaxTimeVariation - uint64 internal immutable delayBlocks; - uint64 internal immutable futureBlocks; - uint64 internal immutable delaySeconds; - uint64 internal immutable futureSeconds; + + // we previously stored the max time variation in a (uint,uint,uint,uint) struct here + uint256[4] private __LEGACY_MAX_TIME_VARIATION; mapping(bytes32 => DasKeySetInfo) public dasKeySetInfo; @@ -89,6 +91,12 @@ contract SequencerInbox is GasRefundEnabled, ISequencerInbox { IDataHashReader immutable dataHashReader; IBlobBasefeeReader immutable blobBasefeeReader; + // see ISequencerInbox.MaxTimeVariation + uint64 internal delayBlocks; + uint64 internal futureBlocks; + uint64 internal delaySeconds; + uint64 internal futureSeconds; + // On L1 this should be set to 117964: 90% of Geth's 128KB tx size limit, leaving ~13KB for proving uint256 public immutable maxDataSize; uint256 internal immutable deployTimeChainId = block.chainid; @@ -96,20 +104,10 @@ contract SequencerInbox is GasRefundEnabled, ISequencerInbox { bool internal immutable hostChainIsArbitrum = ArbitrumChecker.runningOnArbitrum(); constructor( - IBridge bridge_, - ISequencerInbox.MaxTimeVariation memory maxTimeVariation_, uint256 _maxDataSize, IDataHashReader dataHashReader_, IBlobBasefeeReader blobBasefeeReader_ ) { - if (bridge_ == IBridge(address(0))) revert HadZeroInit(); - bridge = bridge_; - rollup = bridge_.rollup(); - if (address(rollup) == address(0)) revert RollupNotChanged(); - delayBlocks = maxTimeVariation_.delayBlocks; - futureBlocks = maxTimeVariation_.futureBlocks; - delaySeconds = maxTimeVariation_.delaySeconds; - futureSeconds = maxTimeVariation_.futureSeconds; maxDataSize = _maxDataSize; if (hostChainIsArbitrum) { if (dataHashReader_ != IDataHashReader(address(0))) revert DataBlobsNotSupported(); @@ -129,7 +127,53 @@ contract SequencerInbox is GasRefundEnabled, ISequencerInbox { return deployTimeChainId != block.chainid; } - /// @inheritdoc ISequencerInbox + function postUpgradeInit() external onlyDelegated onlyProxyOwner { + // Assuming we would not upgrade from a version that have MaxTimeVariation all set to zero + // If that is the case, postUpgradeInit do not need to be called + if ( + __LEGACY_MAX_TIME_VARIATION[0] == 0 && + __LEGACY_MAX_TIME_VARIATION[1] == 0 && + __LEGACY_MAX_TIME_VARIATION[2] == 0 && + __LEGACY_MAX_TIME_VARIATION[3] == 0 + ) { + revert AlreadyInit(); + } + + if ( + __LEGACY_MAX_TIME_VARIATION[0] > type(uint64).max || + __LEGACY_MAX_TIME_VARIATION[1] > type(uint64).max || + __LEGACY_MAX_TIME_VARIATION[2] > type(uint64).max || + __LEGACY_MAX_TIME_VARIATION[3] > type(uint64).max + ) { + revert BadPostUpgradeInit(); + } + + delayBlocks = uint64(__LEGACY_MAX_TIME_VARIATION[0]); + futureBlocks = uint64(__LEGACY_MAX_TIME_VARIATION[1]); + delaySeconds = uint64(__LEGACY_MAX_TIME_VARIATION[2]); + futureSeconds = uint64(__LEGACY_MAX_TIME_VARIATION[3]); + + __LEGACY_MAX_TIME_VARIATION[0] = 0; + __LEGACY_MAX_TIME_VARIATION[1] = 0; + __LEGACY_MAX_TIME_VARIATION[2] = 0; + __LEGACY_MAX_TIME_VARIATION[3] = 0; + } + + function initialize( + IBridge bridge_, + ISequencerInbox.MaxTimeVariation calldata maxTimeVariation_ + ) external onlyDelegated { + if (bridge != IBridge(address(0))) revert AlreadyInit(); + if (bridge_ == IBridge(address(0))) revert HadZeroInit(); + bridge = bridge_; + rollup = bridge_.rollup(); + delayBlocks = maxTimeVariation_.delayBlocks; + futureBlocks = maxTimeVariation_.futureBlocks; + delaySeconds = maxTimeVariation_.delaySeconds; + futureSeconds = maxTimeVariation_.futureSeconds; + } + + /// @notice Allows the rollup owner to sync the rollup address function updateRollupAddress() external { if (msg.sender != IOwnable(rollup).owner()) revert NotOwner(msg.sender, IOwnable(rollup).owner()); @@ -138,11 +182,6 @@ contract SequencerInbox is GasRefundEnabled, ISequencerInbox { rollup = newRollup; } - /// @inheritdoc ISequencerInbox - function totalDelayedMessagesRead() public view returns (uint256) { - return bridge.totalDelayedMessagesRead(); - } - function getTimeBounds() internal view virtual returns (IBridge.TimeBounds memory) { IBridge.TimeBounds memory bounds; ( @@ -162,7 +201,25 @@ contract SequencerInbox is GasRefundEnabled, ISequencerInbox { return bounds; } - function maxTimeVariation() public view returns (ISequencerInbox.MaxTimeVariation memory) { + /// @inheritdoc ISequencerInbox + function removeDelayAfterFork() external { + if (!_chainIdChanged()) revert NotForked(); + delayBlocks = 1; + futureBlocks = 1; + delaySeconds = 1; + futureSeconds = 1; + } + + function maxTimeVariation() + external + view + returns ( + uint256, + uint256, + uint256, + uint256 + ) + { ( uint64 delayBlocks_, uint64 futureBlocks_, @@ -170,13 +227,12 @@ contract SequencerInbox is GasRefundEnabled, ISequencerInbox { uint64 futureSeconds_ ) = maxTimeVariationInternal(); - return - ISequencerInbox.MaxTimeVariation({ - delayBlocks: delayBlocks_, - futureBlocks: futureBlocks_, - delaySeconds: delaySeconds_, - futureSeconds: futureSeconds_ - }); + return ( + uint256(delayBlocks_), + uint256(futureBlocks_), + uint256(delaySeconds_), + uint256(futureSeconds_) + ); } function maxTimeVariationInternal() @@ -205,7 +261,7 @@ contract SequencerInbox is GasRefundEnabled, ISequencerInbox { address sender, bytes32 messageDataHash ) external { - if (_totalDelayedMessagesRead <= totalDelayedMessagesRead()) revert DelayedBackwards(); + if (_totalDelayedMessagesRead <= totalDelayedMessagesRead) revert DelayedBackwards(); bytes32 messageHash = Messages.messageHash( kind, sender, @@ -215,73 +271,139 @@ contract SequencerInbox is GasRefundEnabled, ISequencerInbox { baseFeeL1, messageDataHash ); - (uint256 delayBlocks_, , uint256 delaySeconds_, ) = maxTimeVariationInternal(); // Can only force-include after the Sequencer-only window has expired. - if (l1BlockAndTime[0] + delayBlocks_ >= block.number) revert ForceIncludeBlockTooSoon(); - if (l1BlockAndTime[1] + delaySeconds_ >= block.timestamp) revert ForceIncludeTimeTooSoon(); + if (l1BlockAndTime[0] + delayBlocks >= block.number) revert ForceIncludeBlockTooSoon(); + if (l1BlockAndTime[1] + delaySeconds >= block.timestamp) revert ForceIncludeTimeTooSoon(); // Verify that message hash represents the last message sequence of delayed message to be included - { - bytes32 prevDelayedAcc = 0; - if (_totalDelayedMessagesRead > 1) { - prevDelayedAcc = bridge.delayedInboxAccs(_totalDelayedMessagesRead - 2); - } - if ( - bridge.delayedInboxAccs(_totalDelayedMessagesRead - 1) != - Messages.accumulateInboxMessage(prevDelayedAcc, messageHash) - ) revert IncorrectMessagePreimage(); + bytes32 prevDelayedAcc = 0; + if (_totalDelayedMessagesRead > 1) { + prevDelayedAcc = bridge.delayedInboxAccs(_totalDelayedMessagesRead - 2); } + if ( + bridge.delayedInboxAccs(_totalDelayedMessagesRead - 1) != + Messages.accumulateInboxMessage(prevDelayedAcc, messageHash) + ) revert IncorrectMessagePreimage(); (bytes32 dataHash, IBridge.TimeBounds memory timeBounds) = formEmptyDataHash( _totalDelayedMessagesRead ); + uint256 __totalDelayedMessagesRead = _totalDelayedMessagesRead; uint256 prevSeqMsgCount = bridge.sequencerReportedSubMessageCount(); uint256 newSeqMsgCount = prevSeqMsgCount + _totalDelayedMessagesRead - - totalDelayedMessagesRead(); - - bridge.enqueueSequencerMessage( - dataHash, - _totalDelayedMessagesRead, - prevSeqMsgCount, - newSeqMsgCount, + totalDelayedMessagesRead; + ( + uint256 seqMessageIndex, + bytes32 beforeAcc, + bytes32 delayedAcc, + bytes32 afterAcc + ) = addSequencerL2BatchImpl( + dataHash, + __totalDelayedMessagesRead, + 0, + prevSeqMsgCount, + newSeqMsgCount + ); + emit SequencerBatchDelivered( + seqMessageIndex, + beforeAcc, + afterAcc, + delayedAcc, + totalDelayedMessagesRead, timeBounds, IBridge.BatchDataLocation.NoData ); } + /// @dev Deprecated in favor of the variant specifying message counts for consistency function addSequencerL2BatchFromOrigin( uint256 sequenceNumber, bytes calldata data, uint256 afterDelayedMessagesRead, - IGasRefunder gasRefunder, - uint256 prevMessageCount, - uint256 newMessageCount + IGasRefunder gasRefunder ) external refundsGas(gasRefunder) { // solhint-disable-next-line avoid-tx-origin if (msg.sender != tx.origin) revert NotOrigin(); if (!isBatchPoster[msg.sender]) revert NotBatchPoster(); + (bytes32 dataHash, IBridge.TimeBounds memory timeBounds) = formCallDataHash( data, afterDelayedMessagesRead ); + ( + uint256 seqMessageIndex, + bytes32 beforeAcc, + bytes32 delayedAcc, + bytes32 afterAcc + ) = addSequencerL2BatchImpl(dataHash, afterDelayedMessagesRead, data.length, 0, 0); - (uint256 seqMessageIndex, , , ) = bridge.enqueueSequencerMessage( - dataHash, - afterDelayedMessagesRead, - prevMessageCount, - newMessageCount, + // ~uint256(0) is type(uint256).max, but ever so slightly cheaper + if (seqMessageIndex != sequenceNumber && sequenceNumber != ~uint256(0)) { + revert BadSequencerNumber(seqMessageIndex, sequenceNumber); + } + + emit SequencerBatchDelivered( + sequenceNumber, + beforeAcc, + afterAcc, + delayedAcc, + totalDelayedMessagesRead, timeBounds, IBridge.BatchDataLocation.TxInput ); + } + + function addSequencerL2BatchFromOrigin( + uint256 sequenceNumber, + bytes calldata data, + uint256 afterDelayedMessagesRead, + IGasRefunder gasRefunder, + uint256 prevMessageCount, + uint256 newMessageCount + ) external refundsGas(gasRefunder) { + // solhint-disable-next-line avoid-tx-origin + if (msg.sender != tx.origin) revert NotOrigin(); + if (!isBatchPoster[msg.sender]) revert NotBatchPoster(); + (bytes32 dataHash, IBridge.TimeBounds memory timeBounds) = formCallDataHash( + data, + afterDelayedMessagesRead + ); + // Reformat the stack to prevent "Stack too deep" + uint256 sequenceNumber_ = sequenceNumber; + IBridge.TimeBounds memory timeBounds_ = timeBounds; + bytes32 dataHash_ = dataHash; + uint256 dataLength = data.length; + uint256 afterDelayedMessagesRead_ = afterDelayedMessagesRead; + uint256 prevMessageCount_ = prevMessageCount; + uint256 newMessageCount_ = newMessageCount; + ( + uint256 seqMessageIndex, + bytes32 beforeAcc, + bytes32 delayedAcc, + bytes32 afterAcc + ) = addSequencerL2BatchImpl( + dataHash_, + afterDelayedMessagesRead_, + dataLength, + prevMessageCount_, + newMessageCount_ + ); // ~uint256(0) is type(uint256).max, but ever so slightly cheaper - if (seqMessageIndex != sequenceNumber && sequenceNumber != ~uint256(0)) { - revert BadSequencerNumber(seqMessageIndex, sequenceNumber); + if (seqMessageIndex != sequenceNumber_ && sequenceNumber_ != ~uint256(0)) { + revert BadSequencerNumber(seqMessageIndex, sequenceNumber_); } - // submit a batch spending report to refund the entity that produced the batch data - submitBatchSpendingReport(dataHash, seqMessageIndex, block.basefee); + emit SequencerBatchDelivered( + seqMessageIndex, + beforeAcc, + afterAcc, + delayedAcc, + totalDelayedMessagesRead, + timeBounds_, + IBridge.BatchDataLocation.TxInput + ); } function addSequencerL2BatchFromBlob( @@ -296,20 +418,34 @@ contract SequencerInbox is GasRefundEnabled, ISequencerInbox { afterDelayedMessagesRead ); - (uint256 seqMessageIndex, , , ) = bridge.enqueueSequencerMessage( - dataHash, - afterDelayedMessagesRead, - prevMessageCount, - newMessageCount, - timeBounds, - IBridge.BatchDataLocation.Blob - ); + ( + uint256 seqMessageIndex, + bytes32 beforeAcc, + bytes32 delayedAcc, + bytes32 afterAcc + ) = addSequencerL2BatchImpl( + dataHash, + afterDelayedMessagesRead, + 0, + prevMessageCount, + newMessageCount + ); // ~uint256(0) is type(uint256).max, but ever so slightly cheaper if (seqMessageIndex != sequenceNumber && sequenceNumber != ~uint256(0)) { revert BadSequencerNumber(seqMessageIndex, sequenceNumber); } + emit SequencerBatchDelivered( + sequenceNumber, + beforeAcc, + afterAcc, + delayedAcc, + totalDelayedMessagesRead, + timeBounds, + IBridge.BatchDataLocation.Blob + ); + // blobs are currently not supported on host arbitrum chains, when support is added it may // consume gas in a different way to L1, so explicitly block host arb chains so that if support for blobs // on arb is added it will need to explicitly turned on in the sequencer inbox @@ -317,6 +453,10 @@ contract SequencerInbox is GasRefundEnabled, ISequencerInbox { // submit a batch spending report to refund the entity that produced the blob batch data uint256 blobBasefee = blobBasefeeReader.getBlobBaseFee(); + + // TODO: This report the gas spending using the blob basefee, however the actual spending actually involve + // 2 parts: 1. data cost priced in blob basefee, 2. tx cost priced in block basefee + // We might need to change the batch spending report format so both costs are reported. submitBatchSpendingReport(dataHash, seqMessageIndex, blobBasefee); } @@ -333,22 +473,44 @@ contract SequencerInbox is GasRefundEnabled, ISequencerInbox { data, afterDelayedMessagesRead ); + uint256 seqMessageIndex; + { + // Reformat the stack to prevent "Stack too deep" + uint256 sequenceNumber_ = sequenceNumber; + IBridge.TimeBounds memory timeBounds_ = timeBounds; + bytes32 dataHash_ = dataHash; + uint256 afterDelayedMessagesRead_ = afterDelayedMessagesRead; + uint256 prevMessageCount_ = prevMessageCount; + uint256 newMessageCount_ = newMessageCount; + // we set the calldata length posted to 0 here since the caller isn't the origin + // of the tx, so they might have not paid tx input cost for the calldata + bytes32 beforeAcc; + bytes32 delayedAcc; + bytes32 afterAcc; + (seqMessageIndex, beforeAcc, delayedAcc, afterAcc) = addSequencerL2BatchImpl( + dataHash_, + afterDelayedMessagesRead_, + 0, + prevMessageCount_, + newMessageCount_ + ); - (uint256 seqMessageIndex, , , ) = bridge.enqueueSequencerMessage( - dataHash, - afterDelayedMessagesRead, - prevMessageCount, - newMessageCount, - timeBounds, - IBridge.BatchDataLocation.SeparateBatchEvent - ); + // ~uint256(0) is type(uint256).max, but ever so slightly cheaper + if (seqMessageIndex != sequenceNumber_ && sequenceNumber_ != ~uint256(0)) { + revert BadSequencerNumber(seqMessageIndex, sequenceNumber_); + } - // ~uint256(0) is type(uint256).max, but ever so slightly cheaper - if (seqMessageIndex != sequenceNumber && sequenceNumber != ~uint256(0)) { - revert BadSequencerNumber(seqMessageIndex, sequenceNumber); + emit SequencerBatchDelivered( + seqMessageIndex, + beforeAcc, + afterAcc, + delayedAcc, + totalDelayedMessagesRead, + timeBounds_, + IBridge.BatchDataLocation.SeparateBatchEvent + ); } - - emit SequencerBatchData(sequenceNumber, data); + emit SequencerBatchData(seqMessageIndex, data); } function packHeader(uint256 afterDelayedMessagesRead) @@ -466,7 +628,7 @@ contract SequencerInbox is GasRefundEnabled, ISequencerInbox { uint256 gasPrice ) internal { bytes memory spendingReportMsg; - address batchPoster = tx.origin; + address batchPoster = msg.sender; // this msg isn't included in the current sequencer batch, but instead added to // the delayed messages queue that is yet to be included @@ -501,6 +663,38 @@ contract SequencerInbox is GasRefundEnabled, ISequencerInbox { emit InboxMessageDelivered(msgNum, spendingReportMsg); } + function addSequencerL2BatchImpl( + bytes32 dataHash, + uint256 afterDelayedMessagesRead, + uint256 calldataLengthPosted, + uint256 prevMessageCount, + uint256 newMessageCount + ) + internal + returns ( + uint256 seqMessageIndex, + bytes32 beforeAcc, + bytes32 delayedAcc, + bytes32 acc + ) + { + if (afterDelayedMessagesRead < totalDelayedMessagesRead) revert DelayedBackwards(); + if (afterDelayedMessagesRead > bridge.delayedMessageCount()) revert DelayedTooFar(); + + (seqMessageIndex, beforeAcc, delayedAcc, acc) = bridge.enqueueSequencerMessage( + dataHash, + afterDelayedMessagesRead, + prevMessageCount, + newMessageCount + ); + + totalDelayedMessagesRead = afterDelayedMessagesRead; + + if (calldataLengthPosted > 0) { + submitBatchSpendingReport(dataHash, seqMessageIndex, block.basefee); + } + } + function inboxAccs(uint256 index) external view returns (bytes32) { return bridge.sequencerInboxAccs(index); } @@ -509,12 +703,21 @@ contract SequencerInbox is GasRefundEnabled, ISequencerInbox { return bridge.sequencerMessageCount(); } + /// @inheritdoc ISequencerInbox + function setMaxTimeVariation(ISequencerInbox.MaxTimeVariation memory maxTimeVariation_) + external + onlyRollupOwner + { + delayBlocks = maxTimeVariation_.delayBlocks; + futureBlocks = maxTimeVariation_.futureBlocks; + delaySeconds = maxTimeVariation_.delaySeconds; + futureSeconds = maxTimeVariation_.futureSeconds; + emit OwnerFunctionCalled(0); + } + /// @inheritdoc ISequencerInbox function setIsBatchPoster(address addr, bool isBatchPoster_) external onlyRollupOwner { isBatchPoster[addr] = isBatchPoster_; - // we used to have OwnerFunctionCalled(0) for setting the maxTimeVariation - // so we dont use index = 0 here, even though this is the first owner function - // to stay compatible with legacy events emit OwnerFunctionCalled(1); } diff --git a/src/libraries/Error.sol b/src/libraries/Error.sol index 3ba8e9bd..5d83ca10 100644 --- a/src/libraries/Error.sol +++ b/src/libraries/Error.sol @@ -191,9 +191,6 @@ error InvalidBlobMetadata(); /// @dev Thrown when rollup is not updated with updateRollupAddress error RollupNotChanged(); -/// @dev Thrown when reading the total delayed messages and getting 0 when a non zero value is expected -error EmptyDelayedMessagesRead(); - /// @dev Batch data was empty when non empty was expected error EmptyBatchData(); diff --git a/src/mocks/BridgeStub.sol b/src/mocks/BridgeStub.sol index 4277f6fd..2e2dee05 100644 --- a/src/mocks/BridgeStub.sol +++ b/src/mocks/BridgeStub.sol @@ -5,7 +5,7 @@ pragma solidity ^0.8.0; import "./InboxStub.sol"; -import {BadSequencerMessageNumber, DelayedTooFar, DelayedBackwards} from "../libraries/Error.sol"; +import {BadSequencerMessageNumber} from "../libraries/Error.sol"; import "../bridge/IBridge.sol"; import "../bridge/IEthBridge.sol"; @@ -31,12 +31,6 @@ contract BridgeStub is IBridge, IEthBridge { address public sequencerInbox; uint256 public override sequencerReportedSubMessageCount; - IOwnable public rollup; - uint256 public totalDelayedMessagesRead; - - constructor(IOwnable rollup_) { - rollup = rollup_; - } function setSequencerInbox(address _sequencerInbox) external override { sequencerInbox = _sequencerInbox; @@ -76,9 +70,7 @@ contract BridgeStub is IBridge, IEthBridge { bytes32 dataHash, uint256 afterDelayedMessagesRead, uint256 prevMessageCount, - uint256 newMessageCount, - TimeBounds memory timeBounds, - BatchDataLocation batchDataLocation + uint256 newMessageCount ) external returns ( @@ -95,9 +87,6 @@ contract BridgeStub is IBridge, IEthBridge { ) { revert BadSequencerMessageNumber(sequencerReportedSubMessageCount, prevMessageCount); } - if (afterDelayedMessagesRead > delayedInboxAccs.length) revert DelayedTooFar(); - if (afterDelayedMessagesRead < totalDelayedMessagesRead) revert DelayedBackwards(); - sequencerReportedSubMessageCount = newMessageCount; seqMessageIndex = sequencerInboxAccs.length; if (sequencerInboxAccs.length > 0) { @@ -108,18 +97,6 @@ contract BridgeStub is IBridge, IEthBridge { } acc = keccak256(abi.encodePacked(beforeAcc, dataHash, delayedAcc)); sequencerInboxAccs.push(acc); - totalDelayedMessagesRead = afterDelayedMessagesRead; - - emit SequencerBatchDelivered( - seqMessageIndex, - beforeAcc, - acc, - delayedAcc, - afterDelayedMessagesRead, - timeBounds, - batchDataLocation, - msg.sender - ); } function submitBatchSpendingReport(address batchPoster, bytes32 dataHash) @@ -198,6 +175,10 @@ contract BridgeStub is IBridge, IEthBridge { return sequencerInboxAccs.length; } + function rollup() external pure override returns (IOwnable) { + revert("NOT_IMPLEMENTED"); + } + function acceptFundsFromOldBridge() external payable {} function initialize(IOwnable) external pure { diff --git a/src/mocks/SequencerInboxStub.sol b/src/mocks/SequencerInboxStub.sol index b41c5465..f06393d4 100644 --- a/src/mocks/SequencerInboxStub.sol +++ b/src/mocks/SequencerInboxStub.sol @@ -10,21 +10,11 @@ import {INITIALIZATION_MSG_TYPE} from "../libraries/MessageTypes.sol"; contract SequencerInboxStub is SequencerInbox { constructor( - IBridge bridge_, address sequencer_, - ISequencerInbox.MaxTimeVariation memory maxTimeVariation_, uint256 maxDataSize_, IDataHashReader dataHashReader_, IBlobBasefeeReader blobBasefeeReader_ - ) - SequencerInbox( - bridge_, - maxTimeVariation_, - maxDataSize_, - dataHashReader_, - blobBasefeeReader_ - ) - { + ) SequencerInbox(maxDataSize_, dataHashReader_, blobBasefeeReader_) { isBatchPoster[sequencer_] = true; } @@ -38,15 +28,22 @@ contract SequencerInboxStub is SequencerInbox { require(num == 0, "ALREADY_DELAYED_INIT"); emit InboxMessageDelivered(num, initMsg); (bytes32 dataHash, IBridge.TimeBounds memory timeBounds) = formEmptyDataHash(1); - (uint256 sequencerMessageCount, , , ) = bridge.enqueueSequencerMessage( - dataHash, - 1, - 0, - 0, + ( + uint256 sequencerMessageCount, + bytes32 beforeAcc, + bytes32 delayedAcc, + bytes32 afterAcc + ) = addSequencerL2BatchImpl(dataHash, 1, 0, 0, 1); + require(sequencerMessageCount == 0, "ALREADY_SEQ_INIT"); + emit SequencerBatchDelivered( + sequencerMessageCount, + beforeAcc, + afterAcc, + delayedAcc, + totalDelayedMessagesRead, timeBounds, IBridge.BatchDataLocation.NoData ); - require(sequencerMessageCount == 0, "ALREADY_SEQ_INIT"); } function getTimeBounds() internal view override returns (IBridge.TimeBounds memory bounds) { diff --git a/src/rollup/AbsRollupEventInbox.sol b/src/rollup/AbsRollupEventInbox.sol index 4887f050..c0866d9e 100644 --- a/src/rollup/AbsRollupEventInbox.sol +++ b/src/rollup/AbsRollupEventInbox.sol @@ -35,7 +35,6 @@ abstract contract AbsRollupEventInbox is if (address(_bridge) == address(0)) revert HadZeroInit(); bridge = _bridge; rollup = address(_bridge.rollup()); - if (address(rollup) == address(0)) revert RollupNotChanged(); } /// @notice Allows the rollup owner to sync the rollup address diff --git a/src/rollup/BridgeCreator.sol b/src/rollup/BridgeCreator.sol index 5a774c1b..0e45f815 100644 --- a/src/rollup/BridgeCreator.sol +++ b/src/rollup/BridgeCreator.sol @@ -19,19 +19,12 @@ import "@openzeppelin/contracts/access/Ownable.sol"; import "@openzeppelin/contracts/proxy/transparent/ProxyAdmin.sol"; contract BridgeCreator is Ownable { - BridgeTemplates public ethBasedTemplates; - BridgeTemplates public erc20BasedTemplates; + BridgeContracts public ethBasedTemplates; + BridgeContracts public erc20BasedTemplates; event TemplatesUpdated(); event ERC20TemplatesUpdated(); - struct BridgeTemplates { - IBridge bridge; - IInboxBase inbox; - IRollupEventInbox rollupEventInbox; - IOutbox outbox; - } - struct BridgeContracts { IBridge bridge; ISequencerInbox sequencerInbox; @@ -41,24 +34,24 @@ contract BridgeCreator is Ownable { } constructor( - BridgeTemplates memory _ethBasedTemplates, - BridgeTemplates memory _erc20BasedTemplates + BridgeContracts memory _ethBasedTemplates, + BridgeContracts memory _erc20BasedTemplates ) Ownable() { ethBasedTemplates = _ethBasedTemplates; erc20BasedTemplates = _erc20BasedTemplates; } - function updateTemplates(BridgeTemplates calldata _newTemplates) external onlyOwner { + function updateTemplates(BridgeContracts calldata _newTemplates) external onlyOwner { ethBasedTemplates = _newTemplates; emit TemplatesUpdated(); } - function updateERC20Templates(BridgeTemplates calldata _newTemplates) external onlyOwner { + function updateERC20Templates(BridgeContracts calldata _newTemplates) external onlyOwner { erc20BasedTemplates = _newTemplates; emit ERC20TemplatesUpdated(); } - function _createBridge(address adminProxy, BridgeTemplates storage templates) + function _createBridge(address adminProxy, BridgeContracts storage templates) internal returns (BridgeContracts memory) { @@ -66,6 +59,11 @@ contract BridgeCreator is Ownable { frame.bridge = IBridge( address(new TransparentUpgradeableProxy(address(templates.bridge), adminProxy, "")) ); + frame.sequencerInbox = ISequencerInbox( + address( + new TransparentUpgradeableProxy(address(templates.sequencerInbox), adminProxy, "") + ) + ); frame.inbox = IInboxBase( address(new TransparentUpgradeableProxy(address(templates.inbox), adminProxy, "")) ); @@ -84,10 +82,7 @@ contract BridgeCreator is Ownable { address adminProxy, address rollup, address nativeToken, - ISequencerInbox.MaxTimeVariation calldata maxTimeVariation, - uint256 maxDataSize, - IDataHashReader dataHashReader, - IBlobBasefeeReader blobBasefeeReader + ISequencerInbox.MaxTimeVariation calldata maxTimeVariation ) external returns (BridgeContracts memory) { // create ETH-based bridge if address zero is provided for native token, otherwise create ERC20-based bridge BridgeContracts memory frame = _createBridge( @@ -101,13 +96,7 @@ contract BridgeCreator is Ownable { } else { IERC20Bridge(address(frame.bridge)).initialize(IOwnable(rollup), nativeToken); } - frame.sequencerInbox = new SequencerInbox( - IBridge(frame.bridge), - maxTimeVariation, - maxDataSize, - dataHashReader, - blobBasefeeReader - ); + frame.sequencerInbox.initialize(IBridge(frame.bridge), maxTimeVariation); frame.inbox.initialize(frame.bridge, frame.sequencerInbox); frame.rollupEventInbox.initialize(frame.bridge); frame.outbox.initialize(frame.bridge); diff --git a/src/rollup/RollupCreator.sol b/src/rollup/RollupCreator.sol index cb1796af..5812143c 100644 --- a/src/rollup/RollupCreator.sol +++ b/src/rollup/RollupCreator.sol @@ -41,8 +41,6 @@ contract RollupCreator is Ownable { address nativeToken; bool deployFactoriesToL2; uint256 maxFeePerGasForRetryables; - IDataHashReader dataHashReader; - IBlobBasefeeReader blobBasefeeReader; } BridgeCreator public bridgeCreator; @@ -112,12 +110,27 @@ contract RollupCreator is Ownable { payable returns (address) { - // Make sure the immutable maxDataSize is as expected - (, IInboxBase ethInbox, , ) = bridgeCreator.ethBasedTemplates(); - require(deployParams.maxDataSize == ethInbox.maxDataSize(), "I_MAX_DATA_SIZE_MISMATCH"); + { + // Make sure the immutable maxDataSize is as expected + (, ISequencerInbox ethSequencerInbox, IInboxBase ethInbox, , ) = bridgeCreator + .ethBasedTemplates(); + require( + deployParams.maxDataSize == ethSequencerInbox.maxDataSize(), + "SI_MAX_DATA_SIZE_MISMATCH" + ); + require(deployParams.maxDataSize == ethInbox.maxDataSize(), "I_MAX_DATA_SIZE_MISMATCH"); - (, IInboxBase erc20Inbox, , ) = bridgeCreator.erc20BasedTemplates(); - require(deployParams.maxDataSize == erc20Inbox.maxDataSize(), "I_MAX_DATA_SIZE_MISMATCH"); + (, ISequencerInbox erc20SequencerInbox, IInboxBase erc20Inbox, , ) = bridgeCreator + .erc20BasedTemplates(); + require( + deployParams.maxDataSize == erc20SequencerInbox.maxDataSize(), + "SI_MAX_DATA_SIZE_MISMATCH" + ); + require( + deployParams.maxDataSize == erc20Inbox.maxDataSize(), + "I_MAX_DATA_SIZE_MISMATCH" + ); + } // create proxy admin which will manage bridge contracts ProxyAdmin proxyAdmin = new ProxyAdmin(); @@ -129,10 +142,7 @@ contract RollupCreator is Ownable { address(proxyAdmin), address(rollup), deployParams.nativeToken, - deployParams.config.sequencerInboxMaxTimeVariation, - deployParams.maxDataSize, - deployParams.dataHashReader, - deployParams.blobBasefeeReader + deployParams.config.sequencerInboxMaxTimeVariation ); IChallengeManager challengeManager = IChallengeManager( diff --git a/src/test-helpers/BridgeTester.sol b/src/test-helpers/BridgeTester.sol index 38954d96..0bcbe00f 100644 --- a/src/test-helpers/BridgeTester.sol +++ b/src/test-helpers/BridgeTester.sol @@ -67,8 +67,6 @@ contract BridgeTester is Initializable, DelegateCallAware, IBridge, IEthBridge { bytes32[] public override sequencerInboxAccs; uint256 public override sequencerReportedSubMessageCount; - uint256 public totalDelayedMessagesRead; - address private constant EMPTY_ACTIVEOUTBOX = address(type(uint160).max); function initialize(IOwnable rollup_) external initializer { @@ -97,9 +95,7 @@ contract BridgeTester is Initializable, DelegateCallAware, IBridge, IEthBridge { bytes32 dataHash, uint256 afterDelayedMessagesRead, uint256 prevMessageCount, - uint256 newMessageCount, - TimeBounds memory timeBounds, - BatchDataLocation batchDataLocation + uint256 newMessageCount ) external returns ( diff --git a/test/contract/arbRollup.spec.ts b/test/contract/arbRollup.spec.ts index 873ecc53..1d657765 100644 --- a/test/contract/arbRollup.spec.ts +++ b/test/contract/arbRollup.spec.ts @@ -82,6 +82,8 @@ const ZERO_ADDR = ethers.constants.AddressZero const extraChallengeTimeBlocks = 20 const wasmModuleRoot = '0x9900000000000000000000000000000000000000000000000000000000000010' +const dummyDataHashReader = '0x0000000000000000000000000000000000000089' +const dummyBlobBasefeeReader = '0x0000000000000000000000000000000000000090' // let rollup: RollupContract let rollup: RollupContract @@ -121,7 +123,7 @@ async function getDefaultConfig( } const setup = async () => { - const accounts = await initializeAccounts() + accounts = await initializeAccounts() admin = accounts[0] const user = accounts[1] @@ -185,6 +187,15 @@ const setup = async () => { )) as Bridge__factory const ethBridge = await ethBridgeFac.deploy() + const ethSequencerInboxFac = (await ethers.getContractFactory( + 'SequencerInbox' + )) as SequencerInbox__factory + const ethSequencerInbox = await ethSequencerInboxFac.deploy( + 117964, + dummyDataHashReader, + dummyBlobBasefeeReader + ) + const ethInboxFac = (await ethers.getContractFactory( 'Inbox' )) as Inbox__factory @@ -205,6 +216,8 @@ const setup = async () => { )) as ERC20Bridge__factory const erc20Bridge = await erc20BridgeFac.deploy() + const erc20SequencerInbox = ethSequencerInbox + const erc20InboxFac = (await ethers.getContractFactory( 'ERC20Inbox' )) as ERC20Inbox__factory @@ -226,12 +239,14 @@ const setup = async () => { const bridgeCreator = await bridgeCreatorFac.deploy( { bridge: ethBridge.address, + sequencerInbox: ethSequencerInbox.address, inbox: ethInbox.address, rollupEventInbox: ethRollupEventInbox.address, outbox: ethOutbox.address, }, { bridge: erc20Bridge.address, + sequencerInbox: erc20SequencerInbox.address, inbox: erc20Inbox.address, rollupEventInbox: erc20RollupEventInbox.address, outbox: erc20Outbox.address, @@ -262,8 +277,6 @@ const setup = async () => { const maxFeePerGas = BigNumber.from('1000000000') - const dummyDataHashReader = '0x0000000000000000000000000000000000000089' - const dummyBlobBasefeeReader = '0x0000000000000000000000000000000000000090' const deployParams = { config: await getDefaultConfig(), batchPoster: await sequencer.getAddress(), @@ -277,8 +290,6 @@ const setup = async () => { nativeToken: ethers.constants.AddressZero, deployFactoriesToL2: true, maxFeePerGasForRetryables: maxFeePerGas, - dataHashReader: dummyDataHashReader, - blobBasefeeReader: dummyBlobBasefeeReader, } const response = await rollupCreator.createRollup(deployParams, { @@ -500,10 +511,6 @@ const impersonateAccount = (address: string) => .then(() => ethers.getSigner(address)) describe('ArbRollup', () => { - it('should initialize contracts', async function () { - accounts = await initializeAccounts() - }) - it('should initialize', async function () { const { rollupAdmin: rollupAdminContract, @@ -1370,6 +1377,12 @@ describe('ArbRollup', () => { ).to.eq('view') }) + it('should fail the chainid fork check', async function () { + await expect(sequencerInbox.removeDelayAfterFork()).to.revertedWith( + 'NotForked()' + ) + }) + it('should fail the batch poster check', async function () { await expect( sequencerInbox.addSequencerL2Batch( diff --git a/test/contract/sequencerInbox.spec.4844.ts b/test/contract/sequencerInbox.spec.4844.ts index 65532113..cb7d51b1 100644 --- a/test/contract/sequencerInbox.spec.4844.ts +++ b/test/contract/sequencerInbox.spec.4844.ts @@ -49,7 +49,7 @@ import { SequencerInbox } from '../../build/types/src/bridge/SequencerInbox' import { execSync } from 'child_process' import { wait } from '@arbitrum/sdk/dist/lib/utils/lib' import { InboxMessageDeliveredEvent } from '../../build/types/src/bridge/AbsInbox' -import { SequencerBatchDeliveredEvent } from '../../build/types/src/bridge/AbsBridge' +import { SequencerBatchDeliveredEvent } from '../../build/types/src/bridge/ISequencerInbox' const mineBlocks = async ( wallet: Wallet, @@ -272,6 +272,16 @@ describe('SequencerInbox', async () => { await rollupOwner.getAddress() ) + const dataHashReader = await Toolkit4844.deployDataHashReader(fundingWallet) + const blobBasefeeReader = await Toolkit4844.deployBlobBasefeeReader( + fundingWallet + ) + const sequencerInboxFac = new SequencerInbox__factory(deployer) + const seqInboxTemplate = await sequencerInboxFac.deploy( + 117964, + dataHashReader.address, + blobBasefeeReader.address + ) const inboxFac = new Inbox__factory(deployer) const inboxTemplate = await inboxFac.deploy(117964) @@ -280,6 +290,7 @@ describe('SequencerInbox', async () => { await rollupMock.deployed() await inboxTemplate.deployed() await bridgeTemplate.deployed() + await seqInboxTemplate.deployed() const transparentUpgradeableProxyFac = new TransparentUpgradeableProxy__factory(deployer) @@ -289,7 +300,11 @@ describe('SequencerInbox', async () => { adminAddr, '0x' ) - + const sequencerInboxProxy = await transparentUpgradeableProxyFac.deploy( + seqInboxTemplate.address, + adminAddr, + '0x' + ) const inboxProxy = await transparentUpgradeableProxyFac.deploy( inboxTemplate.address, adminAddr, @@ -297,32 +312,24 @@ describe('SequencerInbox', async () => { ) await bridgeProxy.deployed() await inboxProxy.deployed() - const dataHashReader = await Toolkit4844.deployDataHashReader(fundingWallet) - const blobBasefeeReader = await Toolkit4844.deployBlobBasefeeReader( - fundingWallet - ) + await sequencerInboxProxy.deployed() const bridge = await bridgeFac.attach(bridgeProxy.address).connect(user) const bridgeAdmin = await bridgeFac .attach(bridgeProxy.address) .connect(rollupOwner) + const sequencerInbox = await sequencerInboxFac + .attach(sequencerInboxProxy.address) + .connect(user) await (await bridgeAdmin.initialize(rollupMock.address)).wait() - - const sequencerInboxFac = new SequencerInbox__factory(deployer) - const sequencerInbox = await sequencerInboxFac.deploy( - bridge.address, - { + await ( + await sequencerInbox.initialize(bridgeProxy.address, { delayBlocks: maxDelayBlocks, - futureBlocks: 10, delaySeconds: maxDelayTime, + futureBlocks: 10, futureSeconds: 3000, - }, - 117964, - dataHashReader.address, - blobBasefeeReader.address, - { gasLimit: 15000000 } - ) - await sequencerInbox.deployed() + }) + ).wait() const inbox = await inboxFac.attach(inboxProxy.address).connect(user) @@ -381,7 +388,9 @@ describe('SequencerInbox', async () => { const subMessageCount = await bridge.sequencerReportedSubMessageCount() const batchSendTx = await sequencerInbox .connect(batchPoster) - .functions.addSequencerL2BatchFromOrigin( + .functions[ + 'addSequencerL2BatchFromOrigin(uint256,bytes,uint256,address,uint256,uint256)' + ]( await bridge.sequencerMessageCount(), '0x0042', await bridge.delayedMessageCount(), @@ -453,12 +462,12 @@ describe('SequencerInbox', async () => { const batchDeliveredEvent = batchSendReceipt.logs .filter( (b: any) => - b.address.toLowerCase() === bridge.address.toLowerCase() && + b.address.toLowerCase() === sequencerInbox.address.toLowerCase() && b.topics[0] === - bridge.interface.getEventTopic('SequencerBatchDelivered') + sequencerInbox.interface.getEventTopic('SequencerBatchDelivered') ) .map( - (l: any) => bridge.interface.parseLog(l).args + (l: any) => sequencerInbox.interface.parseLog(l).args )[0] as SequencerBatchDeliveredEvent['args'] if (!batchDeliveredEvent) throw new Error('missing batch event') @@ -539,18 +548,19 @@ describe('SequencerInbox', async () => { minTimestamp: number maxTimestamp: number }> => { - const maxTimeVariation = await sequencerInbox.maxTimeVariation() + const [delayBlocks, futureBlocks, delaySeconds, futureSeconds] = + await sequencerInbox.maxTimeVariation() return { minBlocks: - blockNumber > maxTimeVariation.delayBlocks.toNumber() - ? blockNumber - maxTimeVariation.delayBlocks.toNumber() + blockNumber > delayBlocks.toNumber() + ? blockNumber - delayBlocks.toNumber() : 0, - maxBlock: blockNumber + maxTimeVariation.futureBlocks.toNumber(), + maxBlock: blockNumber + futureBlocks.toNumber(), minTimestamp: - blockTimestamp > maxTimeVariation.delaySeconds.toNumber() - ? blockTimestamp - maxTimeVariation.delaySeconds.toNumber() + blockTimestamp > delaySeconds.toNumber() + ? blockTimestamp - delaySeconds.toNumber() : 0, - maxTimestamp: blockTimestamp + maxTimeVariation.futureSeconds.toNumber(), + maxTimestamp: blockTimestamp + futureSeconds.toNumber(), } } diff --git a/test/contract/sequencerInboxForceInclude.spec.ts b/test/contract/sequencerInboxForceInclude.spec.ts index 81508cc4..3aefb3fc 100644 --- a/test/contract/sequencerInboxForceInclude.spec.ts +++ b/test/contract/sequencerInboxForceInclude.spec.ts @@ -230,6 +230,17 @@ describe('SequencerInboxForceInclude', async () => { 'RollupMock' )) as RollupMock__factory const rollup = await rollupMockFac.deploy(await rollupOwner.getAddress()) + + const dataHashReader = await Toolkit4844.deployDataHashReader(admin) + const blobBasefeeReader = await Toolkit4844.deployBlobBasefeeReader(admin) + const sequencerInboxFac = (await ethers.getContractFactory( + 'SequencerInbox' + )) as SequencerInbox__factory + const seqInboxTemplate = await sequencerInboxFac.deploy( + 117964, + dataHashReader.address, + blobBasefeeReader.address + ) const inboxFac = (await ethers.getContractFactory( 'Inbox' )) as Inbox__factory @@ -247,7 +258,11 @@ describe('SequencerInboxForceInclude', async () => { adminAddr, '0x' ) - + const sequencerInboxProxy = await transparentUpgradeableProxyFac.deploy( + seqInboxTemplate.address, + adminAddr, + '0x' + ) const inboxProxy = await transparentUpgradeableProxyFac.deploy( inboxTemplate.address, adminAddr, @@ -257,26 +272,17 @@ describe('SequencerInboxForceInclude', async () => { const bridgeAdmin = await bridgeFac .attach(bridgeProxy.address) .connect(rollupOwner) + const sequencerInbox = await sequencerInboxFac + .attach(sequencerInboxProxy.address) + .connect(user) await bridge.initialize(rollup.address) - const dataHashReader = await Toolkit4844.deployDataHashReader(admin) - const blobBasefeeReader = await Toolkit4844.deployBlobBasefeeReader(admin) - - const sequencerInboxFac = (await ethers.getContractFactory( - 'SequencerInbox' - )) as SequencerInbox__factory - const sequencerInbox = await sequencerInboxFac.deploy( - bridgeProxy.address, - { - delayBlocks: maxDelayBlocks, - delaySeconds: maxDelayTime, - futureBlocks: 10, - futureSeconds: 3000, - }, - 117964, - dataHashReader.address, - blobBasefeeReader.address - ) + await sequencerInbox.initialize(bridgeProxy.address, { + delayBlocks: maxDelayBlocks, + delaySeconds: maxDelayTime, + futureBlocks: 10, + futureSeconds: 3000, + }) await ( await sequencerInbox @@ -339,7 +345,9 @@ describe('SequencerInboxForceInclude', async () => { await ( await sequencerInbox .connect(batchPoster) - .addSequencerL2BatchFromOrigin( + .functions[ + 'addSequencerL2BatchFromOrigin(uint256,bytes,uint256,address,uint256,uint256)' + ]( 0, data, messagesRead, @@ -367,9 +375,9 @@ describe('SequencerInboxForceInclude', async () => { BigNumber.from(10), '0x1010' ) - const maxTimeVariation = await sequencerInbox.maxTimeVariation() - await mineBlocks(maxTimeVariation.delayBlocks.toNumber()) + const [delayBlocks, , ,] = await sequencerInbox.maxTimeVariation() + await mineBlocks(delayBlocks.toNumber()) await forceIncludeMessages( sequencerInbox, @@ -412,8 +420,8 @@ describe('SequencerInboxForceInclude', async () => { '0xdeadface' ) - const maxTimeVariation = await sequencerInbox.maxTimeVariation() - await mineBlocks(maxTimeVariation.delayBlocks.toNumber()) + const [delayBlocks, , ,] = await sequencerInbox.maxTimeVariation() + await mineBlocks(delayBlocks.toNumber()) await forceIncludeMessages( sequencerInbox, @@ -477,8 +485,8 @@ describe('SequencerInboxForceInclude', async () => { '0x10101010' ) - const maxTimeVariation = await sequencerInbox.maxTimeVariation() - await mineBlocks(maxTimeVariation.delayBlocks.toNumber()) + const [delayBlocks, , ,] = await sequencerInbox.maxTimeVariation() + await mineBlocks(delayBlocks.toNumber()) await forceIncludeMessages( sequencerInbox, @@ -508,8 +516,8 @@ describe('SequencerInboxForceInclude', async () => { '0x1010' ) - const maxTimeVariation = await sequencerInbox.maxTimeVariation() - await mineBlocks(maxTimeVariation.delayBlocks.toNumber() - 1, 5) + const [delayBlocks, , ,] = await sequencerInbox.maxTimeVariation() + await mineBlocks(delayBlocks.toNumber() - 1, 5) await forceIncludeMessages( sequencerInbox, @@ -540,10 +548,10 @@ describe('SequencerInboxForceInclude', async () => { '0x1010' ) - const maxTimeVariation = await sequencerInbox.maxTimeVariation() + const [delayBlocks, , ,] = await sequencerInbox.maxTimeVariation() // mine a lot of blocks - but use a short time per block // this should mean enough blocks have passed, but not enough time - await mineBlocks(maxTimeVariation.delayBlocks.toNumber() + 1, 5) + await mineBlocks(delayBlocks.toNumber() + 1, 5) await forceIncludeMessages( sequencerInbox, diff --git a/test/foundry/AbsBridge.t.sol b/test/foundry/AbsBridge.t.sol index 7f30beb5..1ce9737b 100644 --- a/test/foundry/AbsBridge.t.sol +++ b/test/foundry/AbsBridge.t.sol @@ -22,14 +22,6 @@ abstract contract AbsBridgeTest is Test { address public outbox = address(1002); address public seqInbox = address(1003); - IBridge.TimeBounds timeBounds = - IBridge.TimeBounds({ - minTimestamp: uint64(block.timestamp + 1), - maxTimestamp: uint64(block.timestamp + 10), - minBlockNumber: uint64(block.number + 1), - maxBlockNumber: uint64(block.number + 10) - }); - /* solhint-disable func-name-mixedcase */ function test_enqueueSequencerMessage_NoDelayedMsgs() public { vm.prank(rollup); @@ -46,9 +38,7 @@ abstract contract AbsBridgeTest is Test { dataHash, afterDelayedMessagesRead, prevMessageCount, - newMessageCount, - timeBounds, - IBridge.BatchDataLocation.TxInput + newMessageCount ); // checks @@ -88,9 +78,7 @@ abstract contract AbsBridgeTest is Test { dataHash, afterDelayedMessagesRead, prevMessageCount, - newMessageCount, - timeBounds, - IBridge.BatchDataLocation.TxInput + newMessageCount ); // checks @@ -119,14 +107,7 @@ abstract contract AbsBridgeTest is Test { bridge.submitBatchSpendingReport(address(1), keccak256("1")); bridge.submitBatchSpendingReport(address(2), keccak256("2")); bridge.submitBatchSpendingReport(address(3), keccak256("3")); - bridge.enqueueSequencerMessage( - keccak256("seq"), - 2, - 0, - 10, - timeBounds, - IBridge.BatchDataLocation.SeparateBatchEvent - ); + bridge.enqueueSequencerMessage(keccak256("seq"), 2, 0, 10); vm.stopPrank(); // enqueue 2nd sequencer msg with additional delayed msgs @@ -140,9 +121,7 @@ abstract contract AbsBridgeTest is Test { dataHash, afterDelayedMessagesRead, prevMessageCount, - newMessageCount, - timeBounds, - IBridge.BatchDataLocation.TxInput + newMessageCount ); // checks @@ -171,14 +150,7 @@ abstract contract AbsBridgeTest is Test { bridge.submitBatchSpendingReport(address(1), keccak256("1")); bridge.submitBatchSpendingReport(address(2), keccak256("2")); bridge.submitBatchSpendingReport(address(3), keccak256("3")); - bridge.enqueueSequencerMessage( - keccak256("seq"), - 2, - 0, - 10, - timeBounds, - IBridge.BatchDataLocation.SeparateBatchEvent - ); + bridge.enqueueSequencerMessage(keccak256("seq"), 2, 0, 10); vm.stopPrank(); // setting wrong msg counter shall revert @@ -187,27 +159,13 @@ abstract contract AbsBridgeTest is Test { vm.expectRevert( abi.encodeWithSelector(BadSequencerMessageNumber.selector, 10, incorrectPrevMsgCount) ); - bridge.enqueueSequencerMessage( - keccak256("seq"), - 2, - incorrectPrevMsgCount, - 10, - timeBounds, - IBridge.BatchDataLocation.SeparateBatchEvent - ); + bridge.enqueueSequencerMessage(keccak256("seq"), 2, incorrectPrevMsgCount, 10); } function test_enqueueSequencerMessage_revert_NonSeqInboxCall() public { // enqueueSequencerMessage shall revert vm.expectRevert(abi.encodeWithSelector(NotSequencerInbox.selector, address(this))); - bridge.enqueueSequencerMessage( - keccak256("msg"), - 0, - 0, - 10, - timeBounds, - IBridge.BatchDataLocation.SeparateBatchEvent - ); + bridge.enqueueSequencerMessage(keccak256("msg"), 0, 0, 10); } function test_submitBatchSpendingReport() public { diff --git a/test/foundry/AbsInbox.t.sol b/test/foundry/AbsInbox.t.sol index c97bb3ef..34eb35f7 100644 --- a/test/foundry/AbsInbox.t.sol +++ b/test/foundry/AbsInbox.t.sol @@ -63,18 +63,13 @@ abstract contract AbsInboxTest is Test { // mock the owner() call on rollup address mockRollupOwner = address(10_000); vm.mockCall( - rollup, - abi.encodeWithSelector(IOwnable.owner.selector), - abi.encode(mockRollupOwner) + rollup, abi.encodeWithSelector(IOwnable.owner.selector), abi.encode(mockRollupOwner) ); // setAllowList shall revert vm.expectRevert( abi.encodeWithSelector( - NotRollupOrOwner.selector, - address(this), - rollup, - mockRollupOwner + NotRollupOrOwner.selector, address(this), rollup, mockRollupOwner ) ); @@ -131,18 +126,13 @@ abstract contract AbsInboxTest is Test { // mock the owner() call on rollup address mockRollupOwner = address(10_000); vm.mockCall( - rollup, - abi.encodeWithSelector(IOwnable.owner.selector), - abi.encode(mockRollupOwner) + rollup, abi.encodeWithSelector(IOwnable.owner.selector), abi.encode(mockRollupOwner) ); // setAllowListEnabled shall revert vm.expectRevert( abi.encodeWithSelector( - NotRollupOrOwner.selector, - address(this), - rollup, - mockRollupOwner + NotRollupOrOwner.selector, address(this), rollup, mockRollupOwner ) ); @@ -151,9 +141,7 @@ abstract contract AbsInboxTest is Test { function test_pause() public { assertEq( - (PausableUpgradeable(address(inbox))).paused(), - false, - "Invalid initial paused state" + (PausableUpgradeable(address(inbox))).paused(), false, "Invalid initial paused state" ); vm.prank(rollup); @@ -166,9 +154,7 @@ abstract contract AbsInboxTest is Test { vm.prank(rollup); inbox.pause(); assertEq( - (PausableUpgradeable(address(inbox))).paused(), - true, - "Invalid initial paused state" + (PausableUpgradeable(address(inbox))).paused(), true, "Invalid initial paused state" ); vm.prank(rollup); inbox.unpause(); @@ -301,14 +287,8 @@ abstract contract AbsInboxTest is Test { // send TX vm.prank(user, user); - uint256 msgNum = inbox.sendUnsignedTransaction( - gasLimit, - maxFeePerGas, - nonce, - user, - value, - data - ); + uint256 msgNum = + inbox.sendUnsignedTransaction(gasLimit, maxFeePerGas, nonce, user, value, data); //// checks assertEq(msgNum, 0, "Invalid msgNum"); diff --git a/test/foundry/BridgeCreator.t.sol b/test/foundry/BridgeCreator.t.sol index 4d9e1c88..25bdddc8 100644 --- a/test/foundry/BridgeCreator.t.sol +++ b/test/foundry/BridgeCreator.t.sol @@ -16,16 +16,22 @@ contract BridgeCreatorTest is Test { IDataHashReader dummyDataHashReader = IDataHashReader(address(137)); IBlobBasefeeReader dummyBlobBasefeeReader = IBlobBasefeeReader(address(138)); - BridgeCreator.BridgeTemplates ethBasedTemplates = - BridgeCreator.BridgeTemplates({ + BridgeCreator.BridgeContracts ethBasedTemplates = + BridgeCreator.BridgeContracts({ bridge: new Bridge(), + sequencerInbox: new SequencerInbox( + MAX_DATA_SIZE, + dummyDataHashReader, + dummyBlobBasefeeReader + ), inbox: new Inbox(MAX_DATA_SIZE), rollupEventInbox: new RollupEventInbox(), outbox: new Outbox() }); - BridgeCreator.BridgeTemplates erc20BasedTemplates = - BridgeCreator.BridgeTemplates({ + BridgeCreator.BridgeContracts erc20BasedTemplates = + BridgeCreator.BridgeContracts({ bridge: new ERC20Bridge(), + sequencerInbox: ethBasedTemplates.sequencerInbox, inbox: new ERC20Inbox(MAX_DATA_SIZE), rollupEventInbox: new ERC20RollupEventInbox(), outbox: new ERC20Outbox() @@ -36,34 +42,30 @@ contract BridgeCreatorTest is Test { creator = new BridgeCreator(ethBasedTemplates, erc20BasedTemplates); } - function getEthBasedTemplates() internal returns (BridgeCreator.BridgeTemplates memory) { - BridgeCreator.BridgeTemplates memory templates; - (templates.bridge, templates.inbox, templates.rollupEventInbox, templates.outbox) = creator - .ethBasedTemplates(); + function getEthBasedTemplates() internal returns (BridgeCreator.BridgeContracts memory) { + BridgeCreator.BridgeContracts memory templates; + ( + templates.bridge, + templates.sequencerInbox, + templates.inbox, + templates.rollupEventInbox, + templates.outbox + ) = creator.ethBasedTemplates(); return templates; } - function getErc20BasedTemplates() internal returns (BridgeCreator.BridgeTemplates memory) { - BridgeCreator.BridgeTemplates memory templates; - (templates.bridge, templates.inbox, templates.rollupEventInbox, templates.outbox) = creator - .erc20BasedTemplates(); + function getErc20BasedTemplates() internal returns (BridgeCreator.BridgeContracts memory) { + BridgeCreator.BridgeContracts memory templates; + ( + templates.bridge, + templates.sequencerInbox, + templates.inbox, + templates.rollupEventInbox, + templates.outbox + ) = creator.erc20BasedTemplates(); return templates; } - function assertEq( - BridgeCreator.BridgeTemplates memory a, - BridgeCreator.BridgeTemplates memory b - ) internal { - assertEq(address(a.bridge), address(b.bridge), "Invalid bridge"); - assertEq(address(a.inbox), address(b.inbox), "Invalid inbox"); - assertEq( - address(a.rollupEventInbox), - address(b.rollupEventInbox), - "Invalid rollup event inbox" - ); - assertEq(address(a.outbox), address(b.outbox), "Invalid outbox"); - } - function assertEq( BridgeCreator.BridgeContracts memory a, BridgeCreator.BridgeContracts memory b @@ -86,8 +88,9 @@ contract BridgeCreatorTest is Test { } function test_updateTemplates() public { - BridgeCreator.BridgeTemplates memory templs = BridgeCreator.BridgeTemplates({ + BridgeCreator.BridgeContracts memory templs = BridgeCreator.BridgeContracts({ bridge: Bridge(address(200)), + sequencerInbox: SequencerInbox(address(201)), inbox: Inbox(address(202)), rollupEventInbox: RollupEventInbox(address(203)), outbox: Outbox(address(204)) @@ -100,8 +103,9 @@ contract BridgeCreatorTest is Test { } function test_updateERC20Templates() public { - BridgeCreator.BridgeTemplates memory templs = BridgeCreator.BridgeTemplates({ + BridgeCreator.BridgeContracts memory templs = BridgeCreator.BridgeContracts({ bridge: ERC20Bridge(address(400)), + sequencerInbox: SequencerInbox(address(401)), inbox: ERC20Inbox(address(402)), rollupEventInbox: ERC20RollupEventInbox(address(403)), outbox: ERC20Outbox(address(404)) @@ -123,14 +127,13 @@ contract BridgeCreatorTest is Test { 30, 40 ); + timeVars.delayBlocks; + BridgeCreator.BridgeContracts memory contracts = creator.createBridge( proxyAdmin, rollup, nativeToken, - timeVars, - MAX_DATA_SIZE, - dummyDataHashReader, - dummyBlobBasefeeReader + timeVars ); ( IBridge bridge, @@ -147,17 +150,22 @@ contract BridgeCreatorTest is Test { ); // bridge - assertEq(address(bridge.rollup()), rollup, "Invalid bridge rollup ref"); + assertEq(address(bridge.rollup()), rollup, "Invalid rollup ref"); assertEq(bridge.activeOutbox(), address(0), "Invalid activeOutbox ref"); // seqInbox assertEq(address(seqInbox.bridge()), address(bridge), "Invalid bridge ref"); - assertEq(address(seqInbox.rollup()), rollup, "Invalid seq rollup ref"); - ISequencerInbox.MaxTimeVariation memory maxTimeVariation = seqInbox.maxTimeVariation(); - assertEq(maxTimeVariation.delayBlocks, timeVars.delayBlocks, "Invalid delayBlocks"); - assertEq(maxTimeVariation.futureBlocks, timeVars.futureBlocks, "Invalid futureBlocks"); - assertEq(maxTimeVariation.delaySeconds, timeVars.delaySeconds, "Invalid delaySeconds"); - assertEq(maxTimeVariation.futureSeconds, timeVars.futureSeconds, "Invalid futureSeconds"); + assertEq(address(seqInbox.rollup()), rollup, "Invalid rollup ref"); + ( + uint256 _delayBlocks, + uint256 _futureBlocks, + uint256 _delaySeconds, + uint256 _futureSeconds + ) = seqInbox.maxTimeVariation(); + assertEq(_delayBlocks, timeVars.delayBlocks, "Invalid delayBlocks"); + assertEq(_futureBlocks, timeVars.futureBlocks, "Invalid futureBlocks"); + assertEq(_delaySeconds, timeVars.delaySeconds, "Invalid delaySeconds"); + assertEq(_futureSeconds, timeVars.futureSeconds, "Invalid futureSeconds"); // inbox assertEq(address(inbox.bridge()), address(bridge), "Invalid bridge ref"); @@ -167,11 +175,11 @@ contract BridgeCreatorTest is Test { // rollup event inbox assertEq(address(eventInbox.bridge()), address(bridge), "Invalid bridge ref"); - assertEq(address(eventInbox.rollup()), rollup, "Invalid event inbox rollup ref"); + assertEq(address(eventInbox.rollup()), rollup, "Invalid rollup ref"); // outbox assertEq(address(outbox.bridge()), address(bridge), "Invalid bridge ref"); - assertEq(address(outbox.rollup()), rollup, "Invalid outbox rollup ref"); + assertEq(address(outbox.rollup()), rollup, "Invalid rollup ref"); // revert fetching native token vm.expectRevert(); @@ -190,14 +198,13 @@ contract BridgeCreatorTest is Test { 30, 40 ); + timeVars.delayBlocks; // TODO: what is this? + BridgeCreator.BridgeContracts memory contracts = creator.createBridge( proxyAdmin, rollup, nativeToken, - timeVars, - MAX_DATA_SIZE, - dummyDataHashReader, - dummyBlobBasefeeReader + timeVars ); ( IBridge bridge, @@ -214,7 +221,7 @@ contract BridgeCreatorTest is Test { ); // bridge - assertEq(address(bridge.rollup()), rollup, "Invalid bridge rollup ref"); + assertEq(address(bridge.rollup()), rollup, "Invalid rollup ref"); assertEq( address(IERC20Bridge(address(bridge)).nativeToken()), nativeToken, @@ -224,12 +231,17 @@ contract BridgeCreatorTest is Test { // seqInbox assertEq(address(seqInbox.bridge()), address(bridge), "Invalid bridge ref"); - assertEq(address(seqInbox.rollup()), rollup, "Invalid seq inbox rollup ref"); - ISequencerInbox.MaxTimeVariation memory maxTimeVariation = seqInbox.maxTimeVariation(); - assertEq(maxTimeVariation.delayBlocks, timeVars.delayBlocks, "Invalid delayBlocks"); - assertEq(maxTimeVariation.futureBlocks, timeVars.futureBlocks, "Invalid futureBlocks"); - assertEq(maxTimeVariation.delaySeconds, timeVars.delaySeconds, "Invalid delaySeconds"); - assertEq(maxTimeVariation.futureSeconds, timeVars.futureSeconds, "Invalid futureSeconds"); + assertEq(address(seqInbox.rollup()), rollup, "Invalid rollup ref"); + ( + uint256 _delayBlocks, + uint256 _futureBlocks, + uint256 _delaySeconds, + uint256 _futureSeconds + ) = seqInbox.maxTimeVariation(); + assertEq(_delayBlocks, timeVars.delayBlocks, "Invalid delayBlocks"); + assertEq(_futureBlocks, timeVars.futureBlocks, "Invalid futureBlocks"); + assertEq(_delaySeconds, timeVars.delaySeconds, "Invalid delaySeconds"); + assertEq(_futureSeconds, timeVars.futureSeconds, "Invalid futureSeconds"); // inbox assertEq(address(inbox.bridge()), address(bridge), "Invalid bridge ref"); @@ -239,10 +251,10 @@ contract BridgeCreatorTest is Test { // rollup event inbox assertEq(address(eventInbox.bridge()), address(bridge), "Invalid bridge ref"); - assertEq(address(eventInbox.rollup()), rollup, "Invalid event inbox rollup ref"); + assertEq(address(eventInbox.rollup()), rollup, "Invalid rollup ref"); // outbox assertEq(address(outbox.bridge()), address(bridge), "Invalid bridge ref"); - assertEq(address(outbox.rollup()), rollup, "Invalid outbox rollup ref"); + assertEq(address(outbox.rollup()), rollup, "Invalid rollup ref"); } } diff --git a/test/foundry/ERC20Bridge.t.sol b/test/foundry/ERC20Bridge.t.sol index fc1d2acb..71b815ab 100644 --- a/test/foundry/ERC20Bridge.t.sol +++ b/test/foundry/ERC20Bridge.t.sol @@ -41,9 +41,7 @@ contract ERC20BridgeTest is AbsBridgeTest { /* solhint-disable func-name-mixedcase */ function test_initialize() public { assertEq( - address(erc20Bridge.nativeToken()), - address(nativeToken), - "Invalid nativeToken ref" + address(erc20Bridge.nativeToken()), address(nativeToken), "Invalid nativeToken ref" ); assertEq(address(bridge.rollup()), rollup, "Invalid rollup ref"); assertEq(bridge.activeOutbox(), address(0), "Invalid activeOutbox ref"); @@ -107,9 +105,7 @@ contract ERC20BridgeTest is AbsBridgeTest { //// checks uint256 userNativeTokenBalanceAfter = nativeToken.balanceOf(address(user)); assertEq( - userNativeTokenBalanceAfter, - userNativeTokenBalanceBefore, - "Invalid user token balance" + userNativeTokenBalanceAfter, userNativeTokenBalanceBefore, "Invalid user token balance" ); uint256 bridgeNativeTokenBalanceAfter = nativeToken.balanceOf(address(bridge)); @@ -139,9 +135,7 @@ contract ERC20BridgeTest is AbsBridgeTest { hoax(inbox); vm.expectRevert(); IEthBridge(address(bridge)).enqueueDelayedMessage{value: 0.1 ether}( - kind, - user, - messageDataHash + kind, user, messageDataHash ); } @@ -172,7 +166,7 @@ contract ERC20BridgeTest is AbsBridgeTest { //// execute call vm.prank(outbox); - (bool success, ) = bridge.executeCall(user, withdrawalAmount, data); + (bool success,) = bridge.executeCall(user, withdrawalAmount, data); //// checks assertTrue(success, "Execute call failed"); @@ -218,11 +212,8 @@ contract ERC20BridgeTest is AbsBridgeTest { //// execute call vm.prank(outbox); - (bool success, ) = bridge.executeCall({ - to: address(vault), - value: withdrawalAmount, - data: data - }); + (bool success,) = + bridge.executeCall({to: address(vault), value: withdrawalAmount, data: data}); //// checks assertTrue(success, "Execute call failed"); @@ -268,11 +259,8 @@ contract ERC20BridgeTest is AbsBridgeTest { //// execute call - do call which reverts vm.prank(outbox); - (bool success, bytes memory returnData) = bridge.executeCall({ - to: address(vault), - value: withdrawalAmount, - data: data - }); + (bool success, bytes memory returnData) = + bridge.executeCall({to: address(vault), value: withdrawalAmount, data: data}); //// checks assertEq(success, false, "Execute shall be unsuccessful"); @@ -373,9 +361,7 @@ contract ERC20BridgeTest is AbsBridgeTest { address to = _gateway; uint256 withdrawAmount = 25 ether; bytes memory data = abi.encodeWithSelector( - MockGateway.withdraw.selector, - MockBridgedToken(_nativeToken), - withdrawAmount + MockGateway.withdraw.selector, MockBridgedToken(_nativeToken), withdrawAmount ); vm.expectRevert(abi.encodeWithSelector(CallNotAllowed.selector)); vm.prank(_outbox); @@ -390,7 +376,6 @@ contract MockBridgedToken is ERC20 { gateway = _gateway; _mint(msg.sender, 1_000_000 ether); } - function bridgeBurn(address account, uint256 amount) external { require(msg.sender == gateway, "ONLY_GATEWAY"); _burn(account, amount); diff --git a/test/foundry/ERC20Inbox.t.sol b/test/foundry/ERC20Inbox.t.sol index a4680eda..44948af2 100644 --- a/test/foundry/ERC20Inbox.t.sol +++ b/test/foundry/ERC20Inbox.t.sol @@ -128,8 +128,7 @@ contract ERC20InboxTest is AbsInboxTest { // expect event vm.expectEmit(true, true, true, true); emit InboxMessageDelivered( - 0, - abi.encodePacked(AddressAliasHelper.applyL1ToL2Alias(user), depositAmount) + 0, abi.encodePacked(AddressAliasHelper.applyL1ToL2Alias(user), depositAmount) ); // deposit tokens -> tx.origin != msg.sender diff --git a/test/foundry/RollupCreator.t.sol b/test/foundry/RollupCreator.t.sol index eb4df377..6efaf803 100644 --- a/test/foundry/RollupCreator.t.sol +++ b/test/foundry/RollupCreator.t.sol @@ -34,20 +34,24 @@ contract RollupCreatorTest is Test { uint256 public constant MAX_FEE_PER_GAS = 1_000_000_000; uint256 public constant MAX_DATA_SIZE = 117_964; - BridgeCreator.BridgeTemplates public ethBasedTemplates = - BridgeCreator.BridgeTemplates({ - bridge: new Bridge(), - inbox: new Inbox(MAX_DATA_SIZE), - rollupEventInbox: new RollupEventInbox(), - outbox: new Outbox() - }); - BridgeCreator.BridgeTemplates public erc20BasedTemplates = - BridgeCreator.BridgeTemplates({ - bridge: new ERC20Bridge(), - inbox: new ERC20Inbox(MAX_DATA_SIZE), - rollupEventInbox: new ERC20RollupEventInbox(), - outbox: new ERC20Outbox() - }); + BridgeCreator.BridgeContracts public ethBasedTemplates = BridgeCreator.BridgeContracts({ + bridge: new Bridge(), + sequencerInbox: new SequencerInbox( + MAX_DATA_SIZE, + dummyDataHashReader, + dummyBlobBasefeeReader + ), + inbox: new Inbox(MAX_DATA_SIZE), + rollupEventInbox: new RollupEventInbox(), + outbox: new Outbox() + }); + BridgeCreator.BridgeContracts public erc20BasedTemplates = BridgeCreator.BridgeContracts({ + bridge: new ERC20Bridge(), + sequencerInbox: ethBasedTemplates.sequencerInbox, + inbox: new ERC20Inbox(MAX_DATA_SIZE), + rollupEventInbox: new ERC20RollupEventInbox(), + outbox: new ERC20Outbox() + }); /* solhint-disable func-name-mixedcase */ function setUp() public { @@ -91,12 +95,8 @@ contract RollupCreatorTest is Test { vm.startPrank(deployer); // deployment params - ISequencerInbox.MaxTimeVariation memory timeVars = ISequencerInbox.MaxTimeVariation( - ((60 * 60 * 24) / 15), - 12, - 60 * 60 * 24, - 60 * 60 - ); + ISequencerInbox.MaxTimeVariation memory timeVars = + ISequencerInbox.MaxTimeVariation(((60 * 60 * 24) / 15), 12, 60 * 60 * 24, 60 * 60); Config memory config = Config({ confirmPeriodBlocks: 20, extraChallengeTimeBlocks: 200, @@ -130,9 +130,7 @@ contract RollupCreatorTest is Test { maxDataSize: MAX_DATA_SIZE, nativeToken: address(0), deployFactoriesToL2: true, - maxFeePerGasForRetryables: MAX_FEE_PER_GAS, - dataHashReader: dummyDataHashReader, - blobBasefeeReader: dummyBlobBasefeeReader + maxFeePerGasForRetryables: MAX_FEE_PER_GAS }); address rollupAddress = rollupCreator.createRollup{value: factoryDeploymentFunds}( deployParams @@ -167,10 +165,9 @@ contract RollupCreatorTest is Test { // check proxy admin for non-rollup contracts address proxyAdminExpectedAddress = computeCreateAddress(address(rollupCreator), 1); - // seq inbox has no proxy admin assertEq( _getProxyAdmin(address(rollup.sequencerInbox())), - address(0), + proxyAdminExpectedAddress, "Invalid seqInbox' proxyAdmin owner" ); assertEq( @@ -202,16 +199,14 @@ contract RollupCreatorTest is Test { // check upgrade executor owns proxyAdmin address upgradeExecutorExpectedAddress = computeCreateAddress(address(rollupCreator), 4); assertEq( - ProxyAdmin(_getProxyAdmin(address(rollup.inbox()))).owner(), + ProxyAdmin(_getProxyAdmin(address(rollup.sequencerInbox()))).owner(), upgradeExecutorExpectedAddress, "Invalid proxyAdmin's owner" ); // upgrade executor owns rollup assertEq( - IOwnable(rollupAddress).owner(), - upgradeExecutorExpectedAddress, - "Invalid rollup owner" + IOwnable(rollupAddress).owner(), upgradeExecutorExpectedAddress, "Invalid rollup owner" ); assertEq( _getProxyAdmin(rollupAddress), @@ -220,36 +215,26 @@ contract RollupCreatorTest is Test { ); // check rollupOwner has executor role - AccessControlUpgradeable executor = AccessControlUpgradeable( - upgradeExecutorExpectedAddress - ); + AccessControlUpgradeable executor = AccessControlUpgradeable(upgradeExecutorExpectedAddress); assertTrue( - executor.hasRole(keccak256("EXECUTOR_ROLE"), rollupOwner), - "Invalid executor role" + executor.hasRole(keccak256("EXECUTOR_ROLE"), rollupOwner), "Invalid executor role" ); // check funds are refunded uint256 balanceAfter = deployer.balance; - uint256 factoryDeploymentCost = deployHelper.getDeploymentTotalCost( - rollup.inbox(), - MAX_FEE_PER_GAS - ); + uint256 factoryDeploymentCost = + deployHelper.getDeploymentTotalCost(rollup.inbox(), MAX_FEE_PER_GAS); assertEq(balanceBefore - balanceAfter, factoryDeploymentCost, "Invalid balance"); } function test_createErc20Rollup() public { vm.startPrank(deployer); - address nativeToken = address( - new ERC20PresetFixedSupply("Appchain Token", "App", 1_000_000 ether, deployer) - ); + address nativeToken = + address(new ERC20PresetFixedSupply("Appchain Token", "App", 1_000_000 ether, deployer)); // deployment params - ISequencerInbox.MaxTimeVariation memory timeVars = ISequencerInbox.MaxTimeVariation( - ((60 * 60 * 24) / 15), - 12, - 60 * 60 * 24, - 60 * 60 - ); + ISequencerInbox.MaxTimeVariation memory timeVars = + ISequencerInbox.MaxTimeVariation(((60 * 60 * 24) / 15), 12, 60 * 60 * 24, 60 * 60); Config memory config = Config({ confirmPeriodBlocks: 20, extraChallengeTimeBlocks: 200, @@ -265,9 +250,7 @@ contract RollupCreatorTest is Test { }); // approve fee token to pay for deployment of L2 factories - uint256 expectedCost = 0.1247 ether + - 4 * - (1400 * 100_000_000_000 + 100_000 * 1_000_000_000); + uint256 expectedCost = 0.1247 ether + 4 * (1400 * 100_000_000_000 + 100_000 * 1_000_000_000); IERC20(nativeToken).approve(address(rollupCreator), expectedCost); /// deploy rollup @@ -284,9 +267,7 @@ contract RollupCreatorTest is Test { maxDataSize: MAX_DATA_SIZE, nativeToken: nativeToken, deployFactoriesToL2: true, - maxFeePerGasForRetryables: MAX_FEE_PER_GAS, - dataHashReader: dummyDataHashReader, - blobBasefeeReader: dummyBlobBasefeeReader + maxFeePerGasForRetryables: MAX_FEE_PER_GAS }); address rollupAddress = rollupCreator.createRollup(deployParams); @@ -301,6 +282,7 @@ contract RollupCreatorTest is Test { /// rollup proxy assertEq(_getPrimary(rollupAddress), address(rollupAdmin), "Invalid proxy primary impl"); assertEq(_getSecondary(rollupAddress), address(rollupUser), "Invalid proxy secondary impl"); + /// rollup check RollupCore rollup = RollupCore(rollupAddress); assertTrue(address(rollup.sequencerInbox()) != address(0), "Invalid seqInbox"); @@ -318,18 +300,15 @@ contract RollupCreatorTest is Test { // native token check IBridge bridge = RollupCore(address(rollupAddress)).bridge(); assertEq( - IERC20Bridge(address(bridge)).nativeToken(), - nativeToken, - "Invalid native token ref" + IERC20Bridge(address(bridge)).nativeToken(), nativeToken, "Invalid native token ref" ); // check proxy admin for non-rollup contracts address proxyAdminExpectedAddress = computeCreateAddress(address(rollupCreator), 1); - // seq inbox has no proxy admin assertEq( _getProxyAdmin(address(rollup.sequencerInbox())), - address(0), + proxyAdminExpectedAddress, "Invalid seqInbox' proxyAdmin owner" ); assertEq( @@ -361,32 +340,25 @@ contract RollupCreatorTest is Test { // check upgrade executor owns proxyAdmin address upgradeExecutorExpectedAddress = computeCreateAddress(address(rollupCreator), 4); assertEq( - ProxyAdmin(_getProxyAdmin(address(rollup.inbox()))).owner(), + ProxyAdmin(_getProxyAdmin(address(rollup.sequencerInbox()))).owner(), upgradeExecutorExpectedAddress, "Invalid proxyAdmin's owner" ); - console.log("c2"); // upgrade executor owns rollup assertEq( - IOwnable(rollupAddress).owner(), - upgradeExecutorExpectedAddress, - "Invalid rollup owner" + IOwnable(rollupAddress).owner(), upgradeExecutorExpectedAddress, "Invalid rollup owner" ); assertEq( _getProxyAdmin(rollupAddress), upgradeExecutorExpectedAddress, "Invalid rollup's proxyAdmin owner" ); - console.log("d"); // check rollupOwner has executor role - AccessControlUpgradeable executor = AccessControlUpgradeable( - upgradeExecutorExpectedAddress - ); + AccessControlUpgradeable executor = AccessControlUpgradeable(upgradeExecutorExpectedAddress); assertTrue( - executor.hasRole(keccak256("EXECUTOR_ROLE"), rollupOwner), - "Invalid executor role" + executor.hasRole(keccak256("EXECUTOR_ROLE"), rollupOwner), "Invalid executor role" ); } @@ -394,12 +366,8 @@ contract RollupCreatorTest is Test { vm.startPrank(deployer); // deployment params - ISequencerInbox.MaxTimeVariation memory timeVars = ISequencerInbox.MaxTimeVariation( - ((60 * 60 * 24) / 15), - 12, - 60 * 60 * 24, - 60 * 60 - ); + ISequencerInbox.MaxTimeVariation memory timeVars = + ISequencerInbox.MaxTimeVariation(((60 * 60 * 24) / 15), 12, 60 * 60 * 24, 60 * 60); Config memory config = Config({ confirmPeriodBlocks: 20, extraChallengeTimeBlocks: 200, @@ -432,9 +400,7 @@ contract RollupCreatorTest is Test { maxDataSize: MAX_DATA_SIZE, nativeToken: address(0), deployFactoriesToL2: true, - maxFeePerGasForRetryables: MAX_FEE_PER_GAS, - dataHashReader: dummyDataHashReader, - blobBasefeeReader: dummyBlobBasefeeReader + maxFeePerGasForRetryables: MAX_FEE_PER_GAS }); address rollupAddress = rollupCreator.createRollup{value: factoryDeploymentFunds}( deployParams @@ -446,16 +412,12 @@ contract RollupCreatorTest is Test { RollupCore rollup = RollupCore(rollupAddress); address inbox = address(rollup.inbox()); address proxyAdmin = computeCreateAddress(address(rollupCreator), 1); - IUpgradeExecutor upgradeExecutor = IUpgradeExecutor( - computeCreateAddress(address(rollupCreator), 4) - ); + IUpgradeExecutor upgradeExecutor = + IUpgradeExecutor(computeCreateAddress(address(rollupCreator), 4)); Dummy newLogicImpl = new Dummy(); bytes memory data = abi.encodeWithSelector( - ProxyUpgradeAction.perform.selector, - address(proxyAdmin), - inbox, - address(newLogicImpl) + ProxyUpgradeAction.perform.selector, address(proxyAdmin), inbox, address(newLogicImpl) ); address upgradeAction = address(new ProxyUpgradeAction()); @@ -507,19 +469,14 @@ contract RollupCreatorTest is Test { } function _getSecondary(address proxy) internal view returns (address) { - bytes32 secondarySlot = bytes32( - uint256(keccak256("eip1967.proxy.implementation.secondary")) - 1 - ); + bytes32 secondarySlot = + bytes32(uint256(keccak256("eip1967.proxy.implementation.secondary")) - 1); return address(uint160(uint256(vm.load(proxy, secondarySlot)))); } } contract ProxyUpgradeAction { - function perform( - address admin, - address payable target, - address newLogic - ) public payable { + function perform(address admin, address payable target, address newLogic) public payable { ProxyAdmin(admin).upgrade(TransparentUpgradeableProxy(target), newLogic); } } diff --git a/test/foundry/SequencerInbox.t.sol b/test/foundry/SequencerInbox.t.sol new file mode 100644 index 00000000..7af81507 --- /dev/null +++ b/test/foundry/SequencerInbox.t.sol @@ -0,0 +1,318 @@ +// SPDX-License-Identifier: UNLICENSED +pragma solidity ^0.8.4; + +import "forge-std/Test.sol"; +import "./util/TestUtil.sol"; +import "../../src/bridge/Bridge.sol"; +import "../../src/bridge/SequencerInbox.sol"; + +contract RollupMock { + address immutable public owner; + constructor(address _owner) { + owner = _owner; + } +} + +contract SequencerInboxTest is Test { + // cannot reference events outside of the original contract until 0.8.21 + // we currently use 0.8.9 + event MessageDelivered( + uint256 indexed messageIndex, + bytes32 indexed beforeInboxAcc, + address inbox, + uint8 kind, + address sender, + bytes32 messageDataHash, + uint256 baseFeeL1, + uint64 timestamp + ); + event InboxMessageDelivered(uint256 indexed messageNum, bytes data); + event SequencerBatchDelivered( + uint256 indexed batchSequenceNumber, + bytes32 indexed beforeAcc, + bytes32 indexed afterAcc, + bytes32 delayedAcc, + uint256 afterDelayedMessagesRead, + IBridge.TimeBounds timeBounds, + IBridge.BatchDataLocation dataLocation + ); + + + Random RAND = new Random(); + address rollupOwner = address(137); + uint256 maxDataSize = 10000; + ISequencerInbox.MaxTimeVariation maxTimeVariation = ISequencerInbox.MaxTimeVariation({ + delayBlocks: 10, + futureBlocks: 10, + delaySeconds: 100, + futureSeconds: 100 + }); + address dummyInbox = address(139); + address proxyAdmin = address(140); + IDataHashReader dummyDataHashReader = IDataHashReader(address(141)); + IBlobBasefeeReader dummyBlobBasefeeReader = IBlobBasefeeReader(address(142)); + + function deploy() public returns(SequencerInbox, Bridge) { + RollupMock rollupMock = new RollupMock(rollupOwner); + Bridge bridgeImpl = new Bridge(); + Bridge bridge = Bridge(address(new TransparentUpgradeableProxy(address(bridgeImpl), proxyAdmin, ""))); + + bridge.initialize(IOwnable(address(rollupMock))); + vm.prank(rollupOwner); + bridge.setDelayedInbox(dummyInbox, true); + + SequencerInbox seqInboxImpl = new SequencerInbox( + maxDataSize, + dummyDataHashReader, + dummyBlobBasefeeReader + ); + SequencerInbox seqInbox = SequencerInbox(address(new TransparentUpgradeableProxy(address(seqInboxImpl), proxyAdmin, ""))); + seqInbox.initialize( + bridge, + maxTimeVariation + ); + + vm.prank(rollupOwner); + seqInbox.setIsBatchPoster(tx.origin, true); + + vm.prank(rollupOwner); + bridge.setSequencerInbox(address(seqInbox)); + + return (seqInbox, bridge); + } + + function expectEvents(Bridge bridge, SequencerInbox seqInbox, bytes memory data) internal { + uint256 delayedMessagesRead = bridge.delayedMessageCount(); + uint256 sequenceNumber = bridge.sequencerMessageCount(); + IBridge.TimeBounds memory timeBounds; + if (block.timestamp > maxTimeVariation.delaySeconds) { + timeBounds.minTimestamp = uint64(block.timestamp - maxTimeVariation.delaySeconds); + } + timeBounds.maxTimestamp = uint64(block.timestamp + maxTimeVariation.futureSeconds); + if (block.number > maxTimeVariation.delayBlocks) { + timeBounds.minBlockNumber = uint64(block.number - maxTimeVariation.delayBlocks); + } + timeBounds.maxBlockNumber = uint64(block.number + maxTimeVariation.futureBlocks); + bytes32 dataHash = keccak256(bytes.concat(abi.encodePacked( + timeBounds.minTimestamp, + timeBounds.maxTimestamp, + timeBounds.minBlockNumber, + timeBounds.maxBlockNumber, + uint64(delayedMessagesRead) + ), data)); + + bytes memory spendingReportMsg = abi.encodePacked( + block.timestamp, + msg.sender, + dataHash, + sequenceNumber, + block.basefee + ); + bytes32 beforeAcc = bytes32(0); + bytes32 delayedAcc = bridge.delayedInboxAccs(delayedMessagesRead - 1); + bytes32 afterAcc = keccak256(abi.encodePacked(beforeAcc, dataHash, delayedAcc)); + + // spending report + vm.expectEmit(); + emit MessageDelivered( + delayedMessagesRead, + delayedAcc, + address(seqInbox), + L1MessageType_batchPostingReport, + tx.origin, + keccak256(spendingReportMsg), + block.basefee, + uint64(block.timestamp) + ); + + // spending report event in seq inbox + vm.expectEmit(); + emit InboxMessageDelivered( + delayedMessagesRead, + spendingReportMsg + ); + + // sequencer batch delivered + vm.expectEmit(); + emit SequencerBatchDelivered( + sequenceNumber, + beforeAcc, + afterAcc, + delayedAcc, + delayedMessagesRead, + timeBounds, + IBridge.BatchDataLocation.TxInput + ); + } + + function testAddSequencerL2BatchFromOrigin() public { + (SequencerInbox seqInbox, Bridge bridge) = deploy(); + address delayedInboxSender = address(140); + uint8 delayedInboxKind = 3; + bytes32 messageDataHash = RAND.Bytes32(); + bytes memory data = hex"00a4567890"; // CHRIS: TODO: bigger data; // 00 is BROTLI_MESSAGE_HEADER_FLAG + + vm.prank(dummyInbox); + bridge.enqueueDelayedMessage( + delayedInboxKind, + delayedInboxSender, + messageDataHash + ); + + uint256 subMessageCount = bridge.sequencerReportedSubMessageCount(); + uint256 sequenceNumber = bridge.sequencerMessageCount(); + uint256 delayedMessagesRead = bridge.delayedMessageCount(); + + expectEvents(bridge, seqInbox, data); + + vm.prank(tx.origin); + seqInbox.addSequencerL2BatchFromOrigin( + sequenceNumber, + data, + delayedMessagesRead, + IGasRefunder(address(0)), + subMessageCount, + subMessageCount + 1 + ); + } + + function testAddSequencerL2BatchFromOriginRevers() public { + (SequencerInbox seqInbox, Bridge bridge) = deploy(); + address delayedInboxSender = address(140); + uint8 delayedInboxKind = 3; + bytes32 messageDataHash = RAND.Bytes32(); + bytes memory data = hex"00567890"; // CHRIS: TODO: bigger data; // 00 is BROTLI_MESSAGE_HEADER_FLAG + + vm.prank(dummyInbox); + bridge.enqueueDelayedMessage( + delayedInboxKind, + delayedInboxSender, + messageDataHash + ); + + uint256 subMessageCount = bridge.sequencerReportedSubMessageCount(); + uint256 sequenceNumber = bridge.sequencerMessageCount(); + uint256 delayedMessagesRead = bridge.delayedMessageCount(); + + vm.expectRevert(abi.encodeWithSelector(NotOrigin.selector)); + seqInbox.addSequencerL2BatchFromOrigin( + sequenceNumber, + data, + delayedMessagesRead, + IGasRefunder(address(0)), + subMessageCount, + subMessageCount + 1 + ); + + + vm.prank(rollupOwner); + seqInbox.setIsBatchPoster(tx.origin, false); + + vm.expectRevert(abi.encodeWithSelector(NotBatchPoster.selector)); + vm.prank(tx.origin); + seqInbox.addSequencerL2BatchFromOrigin( + sequenceNumber, + data, + delayedMessagesRead, + IGasRefunder(address(0)), + subMessageCount, + subMessageCount + 1 + ); + + vm.prank(rollupOwner); + seqInbox.setIsBatchPoster(tx.origin, true); + + bytes memory bigData = bytes.concat(seqInbox.BROTLI_MESSAGE_HEADER_FLAG(), RAND.Bytes(maxDataSize - seqInbox.HEADER_LENGTH())); + vm.expectRevert(abi.encodeWithSelector(DataTooLarge.selector, bigData.length + seqInbox.HEADER_LENGTH(), maxDataSize)); + vm.prank(tx.origin); + seqInbox.addSequencerL2BatchFromOrigin( + sequenceNumber, + bigData, + delayedMessagesRead, + IGasRefunder(address(0)), + subMessageCount, + subMessageCount + 1 + ); + + bytes memory authenticatedData = bytes.concat(seqInbox.DATA_BLOB_HEADER_FLAG(), data); // TODO: unsure + vm.expectRevert(abi.encodeWithSelector(InvalidHeaderFlag.selector, authenticatedData[0])); + vm.prank(tx.origin); + seqInbox.addSequencerL2BatchFromOrigin( + sequenceNumber, + authenticatedData, + delayedMessagesRead, + IGasRefunder(address(0)), + subMessageCount, + subMessageCount + 1 + ); + + vm.expectRevert(abi.encodeWithSelector(BadSequencerNumber.selector, sequenceNumber, sequenceNumber + 5)); + vm.prank(tx.origin); + seqInbox.addSequencerL2BatchFromOrigin( + sequenceNumber + 5, + data, + delayedMessagesRead, + IGasRefunder(address(0)), + subMessageCount, + subMessageCount + 1 + ); + } + + function testPostUpgradeInitAlreadyInit() public returns (SequencerInbox, SequencerInbox){ + (SequencerInbox seqInbox, ) = deploy(); + SequencerInbox seqInboxImpl = new SequencerInbox( + maxDataSize, + dummyDataHashReader, + dummyBlobBasefeeReader + ); + + vm.expectRevert(abi.encodeWithSelector(AlreadyInit.selector)); + vm.prank(proxyAdmin); + TransparentUpgradeableProxy(payable(address(seqInbox))).upgradeToAndCall(address(seqInboxImpl), abi.encodeWithSelector(SequencerInbox.postUpgradeInit.selector)); + return (seqInbox, seqInboxImpl); + } + + function testPostUpgradeInit(uint64 delayBlocks, uint64 futureBlocks, uint64 delaySeconds, uint64 futureSeconds) public { + vm.assume(delayBlocks != 0 || futureBlocks != 0 || delaySeconds != 0 || futureSeconds != 0); + + (SequencerInbox seqInbox, SequencerInbox seqInboxImpl) = testPostUpgradeInitAlreadyInit(); + + vm.expectRevert(abi.encodeWithSelector(AlreadyInit.selector)); + vm.prank(proxyAdmin); + TransparentUpgradeableProxy(payable(address(seqInbox))).upgradeToAndCall(address(seqInboxImpl), abi.encodeWithSelector(SequencerInbox.postUpgradeInit.selector)); + + vm.store(address(seqInbox), bytes32(uint256(4)), bytes32(uint256(delayBlocks))); // slot 4: delayBlocks + vm.store(address(seqInbox), bytes32(uint256(5)), bytes32(uint256(futureBlocks))); // slot 5: futureBlocks + vm.store(address(seqInbox), bytes32(uint256(6)), bytes32(uint256(delaySeconds))); // slot 6: delaySeconds + vm.store(address(seqInbox), bytes32(uint256(7)), bytes32(uint256(futureSeconds))); // slot 7: futureSeconds + vm.prank(proxyAdmin); + TransparentUpgradeableProxy(payable(address(seqInbox))).upgradeToAndCall(address(seqInboxImpl), abi.encodeWithSelector(SequencerInbox.postUpgradeInit.selector)); + + (uint256 delayBlocks_, uint256 futureBlocks_, uint256 delaySeconds_, uint256 futureSeconds_) = seqInbox.maxTimeVariation(); + assertEq(delayBlocks_, delayBlocks); + assertEq(futureBlocks_, futureBlocks); + assertEq(delaySeconds_, delaySeconds); + assertEq(futureSeconds_, futureSeconds); + + vm.expectRevert(abi.encodeWithSelector(AlreadyInit.selector)); + vm.prank(proxyAdmin); + TransparentUpgradeableProxy(payable(address(seqInbox))).upgradeToAndCall(address(seqInboxImpl), abi.encodeWithSelector(SequencerInbox.postUpgradeInit.selector)); + } + + function testPostUpgradeInitBadInit(uint256 delayBlocks, uint256 futureBlocks, uint256 delaySeconds, uint256 futureSeconds) public { + vm.assume(delayBlocks > uint256(type(uint64).max)); + vm.assume(futureBlocks > uint256(type(uint64).max)); + vm.assume(delaySeconds > uint256(type(uint64).max)); + vm.assume(futureSeconds > uint256(type(uint64).max)); + + (SequencerInbox seqInbox, SequencerInbox seqInboxImpl) = testPostUpgradeInitAlreadyInit(); + + vm.store(address(seqInbox), bytes32(uint256(4)), bytes32(delayBlocks)); // slot 4: delayBlocks + vm.store(address(seqInbox), bytes32(uint256(5)), bytes32(futureBlocks)); // slot 5: futureBlocks + vm.store(address(seqInbox), bytes32(uint256(6)), bytes32(delaySeconds)); // slot 6: delaySeconds + vm.store(address(seqInbox), bytes32(uint256(7)), bytes32(futureSeconds)); // slot 7: futureSeconds + vm.expectRevert(abi.encodeWithSelector(BadPostUpgradeInit.selector)); + vm.prank(proxyAdmin); + TransparentUpgradeableProxy(payable(address(seqInbox))).upgradeToAndCall(address(seqInboxImpl), abi.encodeWithSelector(SequencerInbox.postUpgradeInit.selector)); + } +} \ No newline at end of file diff --git a/test/foundry/util/TestUtil.sol b/test/foundry/util/TestUtil.sol index 27b32658..63e3f84e 100644 --- a/test/foundry/util/TestUtil.sol +++ b/test/foundry/util/TestUtil.sol @@ -10,3 +10,24 @@ library TestUtil { return address(new TransparentUpgradeableProxy(address(logic), address(pa), "")); } } + +contract Random { + bytes32 seed = bytes32(uint256(0x137)); + + function Bytes32() public returns(bytes32) { + seed = keccak256(abi.encodePacked(seed)); + return seed; + } + + function Bytes(uint256 length) public returns(bytes memory) { + require(length > 0, "Length must be greater than 0"); + bytes memory randomBytes = new bytes(length); + + for (uint256 i = 0; i < length; i++) { + Bytes32(); + randomBytes[i] = bytes1(uint8(uint256(seed) % 256)); + } + + return randomBytes; + } +} diff --git a/test/storage/Bridge b/test/storage/Bridge index 078c31e7..9ed7f48a 100644 --- a/test/storage/Bridge +++ b/test/storage/Bridge @@ -12,5 +12,4 @@ | rollup | contract IOwnable | 8 | 0 | 20 | src/bridge/Bridge.sol:Bridge | | sequencerInbox | address | 9 | 0 | 20 | src/bridge/Bridge.sol:Bridge | | sequencerReportedSubMessageCount | uint256 | 10 | 0 | 32 | src/bridge/Bridge.sol:Bridge | -| totalDelayedMessagesRead | uint256 | 11 | 0 | 32 | src/bridge/Bridge.sol:Bridge | -| __gap | uint256[39] | 12 | 0 | 1248 | src/bridge/Bridge.sol:Bridge | +| __gap | uint256[40] | 11 | 0 | 1280 | src/bridge/Bridge.sol:Bridge | diff --git a/test/storage/ERC20Bridge b/test/storage/ERC20Bridge index 952d876f..1b0d838b 100644 --- a/test/storage/ERC20Bridge +++ b/test/storage/ERC20Bridge @@ -12,6 +12,5 @@ | rollup | contract IOwnable | 8 | 0 | 20 | src/bridge/ERC20Bridge.sol:ERC20Bridge | | sequencerInbox | address | 9 | 0 | 20 | src/bridge/ERC20Bridge.sol:ERC20Bridge | | sequencerReportedSubMessageCount | uint256 | 10 | 0 | 32 | src/bridge/ERC20Bridge.sol:ERC20Bridge | -| totalDelayedMessagesRead | uint256 | 11 | 0 | 32 | src/bridge/ERC20Bridge.sol:ERC20Bridge | -| __gap | uint256[39] | 12 | 0 | 1248 | src/bridge/ERC20Bridge.sol:ERC20Bridge | +| __gap | uint256[40] | 11 | 0 | 1280 | src/bridge/ERC20Bridge.sol:ERC20Bridge | | nativeToken | address | 51 | 0 | 20 | src/bridge/ERC20Bridge.sol:ERC20Bridge | diff --git a/test/storage/SequencerInbox b/test/storage/SequencerInbox index 28d58281..81cd1415 100644 --- a/test/storage/SequencerInbox +++ b/test/storage/SequencerInbox @@ -1,6 +1,13 @@ -| Name | Type | Slot | Offset | Bytes | Contract | -|---------------|----------------------------------------------------------|------|--------|-------|----------------------------------------------| -| rollup | contract IOwnable | 0 | 0 | 20 | src/bridge/SequencerInbox.sol:SequencerInbox | -| isBatchPoster | mapping(address => bool) | 1 | 0 | 32 | src/bridge/SequencerInbox.sol:SequencerInbox | -| dasKeySetInfo | mapping(bytes32 => struct ISequencerInbox.DasKeySetInfo) | 2 | 0 | 32 | src/bridge/SequencerInbox.sol:SequencerInbox | -| isSequencer | mapping(address => bool) | 3 | 0 | 32 | src/bridge/SequencerInbox.sol:SequencerInbox | +| Name | Type | Slot | Offset | Bytes | Contract | +|-----------------------------|----------------------------------------------------------|------|--------|-------|----------------------------------------------| +| totalDelayedMessagesRead | uint256 | 0 | 0 | 32 | src/bridge/SequencerInbox.sol:SequencerInbox | +| bridge | contract IBridge | 1 | 0 | 20 | src/bridge/SequencerInbox.sol:SequencerInbox | +| rollup | contract IOwnable | 2 | 0 | 20 | src/bridge/SequencerInbox.sol:SequencerInbox | +| isBatchPoster | mapping(address => bool) | 3 | 0 | 32 | src/bridge/SequencerInbox.sol:SequencerInbox | +| __LEGACY_MAX_TIME_VARIATION | uint256[4] | 4 | 0 | 128 | src/bridge/SequencerInbox.sol:SequencerInbox | +| dasKeySetInfo | mapping(bytes32 => struct ISequencerInbox.DasKeySetInfo) | 8 | 0 | 32 | src/bridge/SequencerInbox.sol:SequencerInbox | +| isSequencer | mapping(address => bool) | 9 | 0 | 32 | src/bridge/SequencerInbox.sol:SequencerInbox | +| delayBlocks | uint64 | 10 | 0 | 8 | src/bridge/SequencerInbox.sol:SequencerInbox | +| futureBlocks | uint64 | 10 | 8 | 8 | src/bridge/SequencerInbox.sol:SequencerInbox | +| delaySeconds | uint64 | 10 | 16 | 8 | src/bridge/SequencerInbox.sol:SequencerInbox | +| futureSeconds | uint64 | 10 | 24 | 8 | src/bridge/SequencerInbox.sol:SequencerInbox | From a4e709cb5d0d3abb5ef7687c4add05db623926f4 Mon Sep 17 00:00:00 2001 From: gzeon Date: Thu, 18 Jan 2024 16:28:18 +0800 Subject: [PATCH 265/292] chore: remove dot file --- test/storage/SequencerInbox.dot | 15 --------------- 1 file changed, 15 deletions(-) delete mode 100644 test/storage/SequencerInbox.dot diff --git a/test/storage/SequencerInbox.dot b/test/storage/SequencerInbox.dot deleted file mode 100644 index 2fb98a6a..00000000 --- a/test/storage/SequencerInbox.dot +++ /dev/null @@ -1,15 +0,0 @@ - -digraph StorageDiagram { -rankdir=LR -color=black -arrowhead=open -node [shape=record, style=filled, fillcolor=gray95 fontname="Courier New"] -3 [label="SequencerInbox \<\\>\n | {{ slot| 0 | 1 | 2 | 3 | 4-7 | 8 | 9 | 10 | 11 } | { type: \.variable (bytes) | { uint256: totalDelayedMessagesRead (32) } | { unallocated (12) | IBridge: bridge (20) } | { unallocated (12) | IOwnable: rollup (20) } | { mapping\(address=\>bool\): isBatchPoster (32) } | { <9> ISequencerInbox.MaxTimeVariation: maxTimeVariation (128) } | { <12> mapping\(bytes32=\>DasKeySetInfo\): dasKeySetInfo (32) } | { mapping\(address=\>bool\): isSequencer (32) } | { unallocated (12) | IDataHashReader: dataHashReader (20) } | { unallocated (12) | IBlobBasefeeReader: blobBasefeeReader (20) }}}"] - -1 [label="ISequencerInbox.MaxTimeVariation \<\\>\n | {{ slot| 4 | 5 | 6 | 7 } | { type: variable (bytes) | { uint256: MaxTimeVariation.delayBlocks (32) } | { uint256: MaxTimeVariation.futureBlocks (32) } | { uint256: MaxTimeVariation.delaySeconds (32) } | { uint256: MaxTimeVariation.futureSeconds (32) }}}"] - -2 [label="DasKeySetInfo \<\\>\n | {{ slot| 0 } | { type: variable (bytes) | { unallocated (23) | uint64: creationBlock (8) | bool: isValidKeyset (1) }}}"] - - 3:9 -> 1 - 3:12 -> 2 -} \ No newline at end of file From 0e733fcff13036085ba4a6e9494e34005ba68a45 Mon Sep 17 00:00:00 2001 From: Chris Buckland Date: Thu, 18 Jan 2024 12:57:29 +0000 Subject: [PATCH 266/292] Added both block basefee and blob basefee to batch spending report --- src/bridge/SequencerInbox.sol | 20 ++++++++++-------- test/contract/sequencerInbox.spec.4844.ts | 25 ++++++++++++++++++++--- test/foundry/SequencerInbox.t.sol | 4 +++- 3 files changed, 37 insertions(+), 12 deletions(-) diff --git a/src/bridge/SequencerInbox.sol b/src/bridge/SequencerInbox.sol index 7aef44b8..7cecec64 100644 --- a/src/bridge/SequencerInbox.sol +++ b/src/bridge/SequencerInbox.sol @@ -418,6 +418,9 @@ contract SequencerInbox is DelegateCallAware, GasRefundEnabled, ISequencerInbox afterDelayedMessagesRead ); + // we use addSequencerL2BatchImpl for submitting the message + // normally this would also submit a batch spending report but that is skipped if we pass + // an empty call data size, then we submit a separate batch spending report later ( uint256 seqMessageIndex, bytes32 beforeAcc, @@ -453,11 +456,7 @@ contract SequencerInbox is DelegateCallAware, GasRefundEnabled, ISequencerInbox // submit a batch spending report to refund the entity that produced the blob batch data uint256 blobBasefee = blobBasefeeReader.getBlobBaseFee(); - - // TODO: This report the gas spending using the blob basefee, however the actual spending actually involve - // 2 parts: 1. data cost priced in blob basefee, 2. tx cost priced in block basefee - // We might need to change the batch spending report format so both costs are reported. - submitBatchSpendingReport(dataHash, seqMessageIndex, blobBasefee); + submitBatchSpendingReport(dataHash, seqMessageIndex, block.basefee, blobBasefee); } function addSequencerL2Batch( @@ -625,7 +624,8 @@ contract SequencerInbox is DelegateCallAware, GasRefundEnabled, ISequencerInbox function submitBatchSpendingReport( bytes32 dataHash, uint256 seqMessageIndex, - uint256 gasPrice + uint256 gasPrice, + uint256 blobBaseFeePrice ) internal { bytes memory spendingReportMsg; address batchPoster = msg.sender; @@ -646,12 +646,16 @@ contract SequencerInbox is DelegateCallAware, GasRefundEnabled, ISequencerInbox uint64(extraGas) ); } else { + // when a blob base fee is supplied we include it into the batch spending report spendingReportMsg = abi.encodePacked( block.timestamp, batchPoster, dataHash, seqMessageIndex, - gasPrice + gasPrice, + // we add an empty extraGas since the parsing code expects a value here + uint64(0), + blobBaseFeePrice ); } @@ -691,7 +695,7 @@ contract SequencerInbox is DelegateCallAware, GasRefundEnabled, ISequencerInbox totalDelayedMessagesRead = afterDelayedMessagesRead; if (calldataLengthPosted > 0) { - submitBatchSpendingReport(dataHash, seqMessageIndex, block.basefee); + submitBatchSpendingReport(dataHash, seqMessageIndex, block.basefee, 0); } } diff --git a/test/contract/sequencerInbox.spec.4844.ts b/test/contract/sequencerInbox.spec.4844.ts index cb7d51b1..681e78dd 100644 --- a/test/contract/sequencerInbox.spec.4844.ts +++ b/test/contract/sequencerInbox.spec.4844.ts @@ -445,8 +445,11 @@ describe('SequencerInbox', async () => { const batchSendTx = await Toolkit4844.getTx(txHash) const blobHashes = (batchSendTx as any)['blobVersionedHashes'] as string[] const batchSendReceipt = await Toolkit4844.getTxReceipt(txHash) - const { timestamp: blockTimestamp, number: blockNumber } = - await wallet.provider.getBlock(batchSendReceipt.blockNumber) + const { + timestamp: blockTimestamp, + number: blockNumber, + baseFeePerGas, + } = await wallet.provider.getBlock(batchSendReceipt.blockNumber) const timeBounds = await getTimeBounds( blockNumber, @@ -516,8 +519,12 @@ describe('SequencerInbox', async () => { '0x' + inboxMsgDeliveredEvent.data.substring(106, 170) const spendingSeqMessageIndex = '0x' + inboxMsgDeliveredEvent.data.substring(170, 234) - const spendingBlobBasefee = + const spendingBlockBaseFee = '0x' + inboxMsgDeliveredEvent.data.substring(234, 298) + const spendingExtraGas = + '0x' + inboxMsgDeliveredEvent.data.substring(298, 314) + const spendingBlobBasefee = + '0x' + inboxMsgDeliveredEvent.data.substring(314, 378) expect( BigNumber.from(spendingTimestamp).eq(blockTimestamp), @@ -531,6 +538,18 @@ describe('SequencerInbox', async () => { BigNumber.from(spendingSeqMessageIndex).eq(sequenceNumber), 'spending seq message index' ).to.eq(true) + + if (baseFeePerGas == null) { + throw new Error('Missing base fee') + } + expect( + BigNumber.from(spendingBlockBaseFee).eq(baseFeePerGas), + `spending basefee: ${BigNumber.from(spendingBlockBaseFee).toString()}` + ).to.eq(true) + expect( + BigNumber.from(spendingExtraGas).eq(0), + `spending extra gas: ${BigNumber.from(spendingExtraGas).toString()}` + ).to.eq(true) // we expect a very low - 1 - basefee since we havent sent many blobs expect( BigNumber.from(spendingBlobBasefee).eq(1), diff --git a/test/foundry/SequencerInbox.t.sol b/test/foundry/SequencerInbox.t.sol index 7af81507..f947e8ac 100644 --- a/test/foundry/SequencerInbox.t.sol +++ b/test/foundry/SequencerInbox.t.sol @@ -106,7 +106,9 @@ contract SequencerInboxTest is Test { msg.sender, dataHash, sequenceNumber, - block.basefee + block.basefee, + uint64(0), + uint256(0) ); bytes32 beforeAcc = bytes32(0); bytes32 delayedAcc = bridge.delayedInboxAccs(delayedMessagesRead - 1); From 0efe90cd66509099c880ffa3804981d64fccf7b2 Mon Sep 17 00:00:00 2001 From: Chris Buckland Date: Wed, 17 Jan 2024 19:51:09 +0000 Subject: [PATCH 267/292] Updated gas refunder for blob costs Formatting Updates for code review Remove whitespace Formatting --- src/bridge/ISequencerInbox.sol | 10 --- src/bridge/SequencerInbox.sol | 14 +++- src/libraries/I4844Readers.sol | 11 +++ src/libraries/IGasRefunder.sol | 29 ++++++- src/rollup/ValidatorWallet.sol | 20 ++++- test/contract/sequencerInbox.spec.4844.ts | 99 ++++++++++++++++------- 6 files changed, 138 insertions(+), 45 deletions(-) create mode 100644 src/libraries/I4844Readers.sol diff --git a/src/bridge/ISequencerInbox.sol b/src/bridge/ISequencerInbox.sol index 077729a9..5d671ba7 100644 --- a/src/bridge/ISequencerInbox.sol +++ b/src/bridge/ISequencerInbox.sol @@ -193,13 +193,3 @@ interface ISequencerInbox is IDelayedMessageProvider { function updateRollupAddress() external; } - -interface IDataHashReader { - /// @notice Returns all the data hashes of all the blobs on the current transaction - function getDataHashes() external view returns (bytes32[] memory); -} - -interface IBlobBasefeeReader { - /// @notice Returns the current BLOBBASEFEE - function getBlobBaseFee() external view returns (uint256); -} diff --git a/src/bridge/SequencerInbox.sol b/src/bridge/SequencerInbox.sol index 7cecec64..0eaaaedc 100644 --- a/src/bridge/SequencerInbox.sol +++ b/src/bridge/SequencerInbox.sol @@ -38,6 +38,7 @@ import "../rollup/IRollupLogic.sol"; import "./Messages.sol"; import "../precompiles/ArbGasInfo.sol"; import "../precompiles/ArbSys.sol"; +import "../libraries/I4844Readers.sol"; import {L1MessageType_batchPostingReport} from "../libraries/MessageTypes.sol"; import {GasRefundEnabled, IGasRefunder} from "../libraries/IGasRefunder.sol"; @@ -361,7 +362,10 @@ contract SequencerInbox is DelegateCallAware, GasRefundEnabled, ISequencerInbox IGasRefunder gasRefunder, uint256 prevMessageCount, uint256 newMessageCount - ) external refundsGas(gasRefunder) { + ) + external + refundsGas(gasRefunder, IDataHashReader(address(0)), IBlobBasefeeReader(address(0))) + { // solhint-disable-next-line avoid-tx-origin if (msg.sender != tx.origin) revert NotOrigin(); if (!isBatchPoster[msg.sender]) revert NotBatchPoster(); @@ -412,7 +416,7 @@ contract SequencerInbox is DelegateCallAware, GasRefundEnabled, ISequencerInbox IGasRefunder gasRefunder, uint256 prevMessageCount, uint256 newMessageCount - ) external refundsGas(gasRefunder) { + ) external refundsGas(gasRefunder, dataHashReader, blobBasefeeReader) { if (!isBatchPoster[msg.sender]) revert NotBatchPoster(); (bytes32 dataHash, IBridge.TimeBounds memory timeBounds) = formBlobDataHash( afterDelayedMessagesRead @@ -466,7 +470,11 @@ contract SequencerInbox is DelegateCallAware, GasRefundEnabled, ISequencerInbox IGasRefunder gasRefunder, uint256 prevMessageCount, uint256 newMessageCount - ) external override refundsGas(gasRefunder) { + ) + external + override + refundsGas(gasRefunder, IDataHashReader(address(0)), IBlobBasefeeReader(address(0))) + { if (!isBatchPoster[msg.sender] && msg.sender != address(rollup)) revert NotBatchPoster(); (bytes32 dataHash, IBridge.TimeBounds memory timeBounds) = formCallDataHash( data, diff --git a/src/libraries/I4844Readers.sol b/src/libraries/I4844Readers.sol new file mode 100644 index 00000000..f920d69e --- /dev/null +++ b/src/libraries/I4844Readers.sol @@ -0,0 +1,11 @@ +pragma solidity >=0.6.9 <0.9.0; + +interface IBlobBasefeeReader { + /// @notice Returns the current BLOBBASEFEE + function getBlobBaseFee() external view returns (uint256); +} + +interface IDataHashReader { + /// @notice Returns all the data hashes of all the blobs on the current transaction + function getDataHashes() external view returns (bytes32[] memory); +} diff --git a/src/libraries/IGasRefunder.sol b/src/libraries/IGasRefunder.sol index e7b08656..b53b00e4 100644 --- a/src/libraries/IGasRefunder.sol +++ b/src/libraries/IGasRefunder.sol @@ -5,6 +5,8 @@ // solhint-disable-next-line compiler-version pragma solidity >=0.6.9 <0.9.0; +import "../libraries/I4844Readers.sol"; + interface IGasRefunder { function onGasSpent( address payable spender, @@ -14,10 +16,16 @@ interface IGasRefunder { } abstract contract GasRefundEnabled { + uint256 immutable gasPerBlob = 2**17; + /// @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-refunded - modifier refundsGas(IGasRefunder gasRefunder) { + modifier refundsGas( + IGasRefunder gasRefunder, + IDataHashReader dataHashReader, + IBlobBasefeeReader blobBasefeeReader + ) { uint256 startGasLeft = gasleft(); _; if (address(gasRefunder) != address(0)) { @@ -32,7 +40,26 @@ abstract contract GasRefundEnabled { // 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; + } else { + // for similar reasons to above we only refund blob gas when the tx.origin is the msg.sender + // this avoids the caller being able to send blobs to other contracts and still get refunded here + if ( + address(dataHashReader) != address(0) && + address(blobBasefeeReader) != (address(0)) + ) { + // add any cost for 4844 data, the data hash reader throws an error prior to 4844 being activated + // we do this addition here rather in the GasRefunder so that we can check the msg.sender is the tx.origin + try dataHashReader.getDataHashes() returns (bytes32[] memory dataHashes) { + if (dataHashes.length != 0) { + uint256 blobBasefee = blobBasefeeReader.getBlobBaseFee(); + startGasLeft += + (dataHashes.length * gasPerBlob * blobBasefee) / + block.basefee; + } + } catch {} + } } + gasRefunder.onGasSpent(payable(msg.sender), startGasLeft - gasleft(), calldataSize); } } diff --git a/src/rollup/ValidatorWallet.sol b/src/rollup/ValidatorWallet.sol index 9b8c2296..b04e9a5c 100644 --- a/src/rollup/ValidatorWallet.sol +++ b/src/rollup/ValidatorWallet.sol @@ -109,7 +109,12 @@ contract ValidatorWallet is OwnableUpgradeable, DelegateCallAware, GasRefundEnab bytes[] calldata data, address[] calldata destination, uint256[] calldata amount - ) public payable onlyExecutorOrOwner refundsGas(gasRefunder) { + ) + public + payable + onlyExecutorOrOwner + refundsGas(gasRefunder, IDataHashReader(address(0)), IBlobBasefeeReader(address(0))) + { uint256 numTxes = data.length; if (numTxes != destination.length) revert BadArrayLength(numTxes, destination.length); if (numTxes != amount.length) revert BadArrayLength(numTxes, amount.length); @@ -144,7 +149,12 @@ contract ValidatorWallet is OwnableUpgradeable, DelegateCallAware, GasRefundEnab bytes calldata data, address destination, uint256 amount - ) public payable onlyExecutorOrOwner refundsGas(gasRefunder) { + ) + public + payable + onlyExecutorOrOwner + refundsGas(gasRefunder, IDataHashReader(address(0)), IBlobBasefeeReader(address(0))) + { if (data.length > 0) require(destination.isContract(), "NO_CODE_AT_ADDR"); validateExecuteTransaction(destination); // We use a low level call here to allow for contract and non-contract calls @@ -168,7 +178,11 @@ contract ValidatorWallet is OwnableUpgradeable, DelegateCallAware, GasRefundEnab IGasRefunder gasRefunder, IChallengeManager manager, uint64[] calldata challenges - ) public onlyExecutorOrOwner refundsGas(gasRefunder) { + ) + public + onlyExecutorOrOwner + refundsGas(gasRefunder, IDataHashReader(address(0)), IBlobBasefeeReader(address(0))) + { uint256 challengesCount = challenges.length; for (uint256 i = 0; i < challengesCount; i++) { try manager.timeout(challenges[i]) {} catch (bytes memory error) { diff --git a/test/contract/sequencerInbox.spec.4844.ts b/test/contract/sequencerInbox.spec.4844.ts index 681e78dd..30195698 100644 --- a/test/contract/sequencerInbox.spec.4844.ts +++ b/test/contract/sequencerInbox.spec.4844.ts @@ -23,10 +23,11 @@ import { JsonRpcProvider, TransactionReceipt, } from '@ethersproject/providers' -import { expect, util } from 'chai' +import { expect } from 'chai' import { Bridge, Bridge__factory, + GasRefunder__factory, Inbox, Inbox__factory, MessageTester, @@ -43,11 +44,14 @@ import { MessageDeliveredEvent, } from '../../build/types/src/bridge/Bridge' import { Signer, Wallet, constants, utils } from 'ethers' -import { keccak256, solidityKeccak256, solidityPack } from 'ethers/lib/utils' +import { + keccak256, + parseEther, + solidityKeccak256, + solidityPack, +} from 'ethers/lib/utils' import { Toolkit4844 } from './toolkit4844' import { SequencerInbox } from '../../build/types/src/bridge/SequencerInbox' -import { execSync } from 'child_process' -import { wait } from '@arbitrum/sdk/dist/lib/utils/lib' import { InboxMessageDeliveredEvent } from '../../build/types/src/bridge/AbsInbox' import { SequencerBatchDeliveredEvent } from '../../build/types/src/bridge/ISequencerInbox' @@ -225,6 +229,7 @@ describe('SequencerInbox', async () => { sequencerInbox: string messageTester: string batchPoster: string + gasRefunder: string } ) => { return { @@ -240,6 +245,10 @@ describe('SequencerInbox', async () => { addresses.messageTester, deployer ), + gasRefunder: GasRefunder__factory.connect( + addresses.gasRefunder, + deployer + ), } } @@ -258,13 +267,14 @@ describe('SequencerInbox', async () => { const batchPoster = accounts[4] // update the addresses below and uncomment to avoid redeploying - // return connectAddreses(user, deployer, batchPoster, { + // return connectAddreses(user, deployer, batchPoster, { // user: '0x870204e93ca485a6676E264EB0d7df4cD0246203', - // bridge: '0x00eb941BD8B89E0396A983c870fa74DA4aC5ecFB', - // inbox: '0x68BCf73c6b36ae3f20b2fD06c2d4651538Ae02a6', + // bridge: '0x95491D63100cc7a21155247329007ca294fC752B', + // inbox: '0x00eb941BD8B89E0396A983c870fa74DA4aC5ecFB', // sequencerInbox: '0x87fEe873425A65Bb2A11dFf6E15B4Ce25e7AFccD', - // messageTester: '0x33B1355B2F3BE116eB1c8226CF3B0a433259459C', + // messageTester: '0x68BCf73c6b36ae3f20b2fD06c2d4651538Ae02a6', // batchPoster: '0x328375c90F01Dcb114888DA36e3832F69Ad0BB57', + // gasRefunder: '0x33B1355B2F3BE116eB1c8226CF3B0a433259459C' // }) const rollupMockFac = new RollupMock__factory(deployer) @@ -346,6 +356,21 @@ describe('SequencerInbox', async () => { await (await bridgeAdmin.setSequencerInbox(sequencerInbox.address)).wait() const messageTester = await new MessageTester__factory(deployer).deploy() await messageTester.deployed() + + const gasRefunderFac = new GasRefunder__factory(deployer) + const gasRefunder = await gasRefunderFac.deploy() + await gasRefunder.deployed() + // fund the gas refunder + await ( + await deployer.sendTransaction({ + to: gasRefunder.address, + value: parseEther('0.2'), + }) + ).wait() + await (await gasRefunder.allowContracts([sequencerInbox.address])).wait() + await (await gasRefunder.allowRefundees([batchPoster.address])).wait() + await (await gasRefunder.setExtraGasMargin(35000)).wait() + const res = { user, bridge: bridge, @@ -353,6 +378,7 @@ describe('SequencerInbox', async () => { sequencerInbox: sequencerInbox, messageTester, batchPoster, + gasRefunder, } // comment this in to print the addresses that can then be re-used to avoid redeployment @@ -369,8 +395,15 @@ describe('SequencerInbox', async () => { const prov = new JsonRpcProvider('http://127.0.0.1:8545') const wallet = new Wallet(privKey).connect(prov) - const { user, inbox, bridge, messageTester, sequencerInbox, batchPoster } = - await setupSequencerInbox(wallet) + const { + user, + inbox, + bridge, + messageTester, + sequencerInbox, + batchPoster, + gasRefunder, + } = await setupSequencerInbox(wallet) await sendDelayedTx( user, @@ -386,20 +419,20 @@ describe('SequencerInbox', async () => { ) const subMessageCount = await bridge.sequencerReportedSubMessageCount() - const batchSendTx = await sequencerInbox - .connect(batchPoster) - .functions[ - 'addSequencerL2BatchFromOrigin(uint256,bytes,uint256,address,uint256,uint256)' - ]( - await bridge.sequencerMessageCount(), - '0x0042', - await bridge.delayedMessageCount(), - constants.AddressZero, - subMessageCount, - subMessageCount.add(1) - ) - - await batchSendTx.wait() + const balBefore = await batchPoster.getBalance() + const receipt = await ( + await sequencerInbox + .connect(batchPoster) + .functions.addSequencerL2BatchFromOrigin( + await bridge.sequencerMessageCount(), + '0x0042', + await bridge.delayedMessageCount(), + gasRefunder.address, + subMessageCount, + subMessageCount.add(1) + ) + ).wait() + expect((await batchPoster.getBalance()).gt(balBefore), 'Refund not enough') }) it('can send blob batch', async () => { @@ -408,8 +441,15 @@ describe('SequencerInbox', async () => { const prov = new JsonRpcProvider('http://127.0.0.1:8545') const wallet = new Wallet(privKey).connect(prov) - const { user, inbox, bridge, messageTester, sequencerInbox, batchPoster } = - await setupSequencerInbox(wallet) + const { + user, + inbox, + bridge, + messageTester, + sequencerInbox, + batchPoster, + gasRefunder, + } = await setupSequencerInbox(wallet) await sendDelayedTx( user, @@ -427,6 +467,7 @@ describe('SequencerInbox', async () => { const afterDelayedMessagesRead = await bridge.delayedMessageCount() const sequenceNumber = await bridge.sequencerMessageCount() + const balBefore = await batchPoster.getBalance() const txHash = await Toolkit4844.sendBlobTx( batchPoster.privateKey.substring(2), sequencerInbox.address, @@ -436,12 +477,15 @@ describe('SequencerInbox', async () => { [ sequenceNumber, afterDelayedMessagesRead, - constants.AddressZero, + gasRefunder.address, subMessageCount, subMessageCount.add(1), ] ) ) + + expect((await batchPoster.getBalance()).gt(balBefore), 'Refund not enough') + const batchSendTx = await Toolkit4844.getTx(txHash) const blobHashes = (batchSendTx as any)['blobVersionedHashes'] as string[] const batchSendReceipt = await Toolkit4844.getTxReceipt(txHash) @@ -461,7 +505,6 @@ describe('SequencerInbox', async () => { afterDelayedMessagesRead.toNumber(), blobHashes ) - const batchDeliveredEvent = batchSendReceipt.logs .filter( (b: any) => From e6871c51b431346520a5ad1bd9dd8a698d856a82 Mon Sep 17 00:00:00 2001 From: Chris Buckland Date: Wed, 17 Jan 2024 20:02:04 +0000 Subject: [PATCH 268/292] Moved gas refund enabled to separate file to for interface compatibility with block basefee --- src/bridge/SequencerInbox.sol | 4 +- src/libraries/GasRefundEnabled.sol | 59 ++++++++++++++++++++++++++++++ src/libraries/IGasRefunder.sol | 52 -------------------------- src/rollup/ValidatorWallet.sol | 1 + 4 files changed, 62 insertions(+), 54 deletions(-) create mode 100644 src/libraries/GasRefundEnabled.sol diff --git a/src/bridge/SequencerInbox.sol b/src/bridge/SequencerInbox.sol index 0eaaaedc..1cefd13b 100644 --- a/src/bridge/SequencerInbox.sol +++ b/src/bridge/SequencerInbox.sol @@ -41,8 +41,8 @@ import "../precompiles/ArbSys.sol"; import "../libraries/I4844Readers.sol"; import {L1MessageType_batchPostingReport} from "../libraries/MessageTypes.sol"; -import {GasRefundEnabled, IGasRefunder} from "../libraries/IGasRefunder.sol"; -import "../libraries/DelegateCallAware.sol"; +import {IGasRefunder} from "../libraries/IGasRefunder.sol"; +import {GasRefundEnabled} from "../libraries/GasRefundEnabled.sol"; import "../libraries/ArbitrumChecker.sol"; /** diff --git a/src/libraries/GasRefundEnabled.sol b/src/libraries/GasRefundEnabled.sol new file mode 100644 index 00000000..363b6110 --- /dev/null +++ b/src/libraries/GasRefundEnabled.sol @@ -0,0 +1,59 @@ +// 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-version +pragma solidity ^0.8.0; + +import "./I4844Readers.sol"; +import "./IGasRefunder.sol"; + +abstract contract GasRefundEnabled { + uint256 immutable gasPerBlob = 2**17; + + /// @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-refunded + modifier refundsGas( + IGasRefunder gasRefunder, + IDataHashReader dataHashReader, + IBlobBasefeeReader blobBasefeeReader + ) { + 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-origin + if (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; + } else { + // for similar reasons to above we only refund blob gas when the tx.origin is the msg.sender + // this avoids the caller being able to send blobs to other contracts and still get refunded here + if ( + address(dataHashReader) != address(0) && + address(blobBasefeeReader) != (address(0)) + ) { + // add any cost for 4844 data, the data hash reader throws an error prior to 4844 being activated + // we do this addition here rather in the GasRefunder so that we can check the msg.sender is the tx.origin + try dataHashReader.getDataHashes() returns (bytes32[] memory dataHashes) { + if (dataHashes.length != 0) { + uint256 blobBasefee = blobBasefeeReader.getBlobBaseFee(); + startGasLeft += + (dataHashes.length * gasPerBlob * blobBasefee) / + block.basefee; + } + } catch {} + } + } + + gasRefunder.onGasSpent(payable(msg.sender), startGasLeft - gasleft(), calldataSize); + } + } +} diff --git a/src/libraries/IGasRefunder.sol b/src/libraries/IGasRefunder.sol index b53b00e4..f80ac3b2 100644 --- a/src/libraries/IGasRefunder.sol +++ b/src/libraries/IGasRefunder.sol @@ -5,8 +5,6 @@ // solhint-disable-next-line compiler-version pragma solidity >=0.6.9 <0.9.0; -import "../libraries/I4844Readers.sol"; - interface IGasRefunder { function onGasSpent( address payable spender, @@ -14,53 +12,3 @@ interface IGasRefunder { uint256 calldataSize ) external returns (bool success); } - -abstract contract GasRefundEnabled { - uint256 immutable gasPerBlob = 2**17; - - /// @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-refunded - modifier refundsGas( - IGasRefunder gasRefunder, - IDataHashReader dataHashReader, - IBlobBasefeeReader blobBasefeeReader - ) { - 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-origin - if (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; - } else { - // for similar reasons to above we only refund blob gas when the tx.origin is the msg.sender - // this avoids the caller being able to send blobs to other contracts and still get refunded here - if ( - address(dataHashReader) != address(0) && - address(blobBasefeeReader) != (address(0)) - ) { - // add any cost for 4844 data, the data hash reader throws an error prior to 4844 being activated - // we do this addition here rather in the GasRefunder so that we can check the msg.sender is the tx.origin - try dataHashReader.getDataHashes() returns (bytes32[] memory dataHashes) { - if (dataHashes.length != 0) { - uint256 blobBasefee = blobBasefeeReader.getBlobBaseFee(); - startGasLeft += - (dataHashes.length * gasPerBlob * blobBasefee) / - block.basefee; - } - } catch {} - } - } - - gasRefunder.onGasSpent(payable(msg.sender), startGasLeft - gasleft(), calldataSize); - } - } -} diff --git a/src/rollup/ValidatorWallet.sol b/src/rollup/ValidatorWallet.sol index b04e9a5c..f6794260 100644 --- a/src/rollup/ValidatorWallet.sol +++ b/src/rollup/ValidatorWallet.sol @@ -7,6 +7,7 @@ pragma solidity ^0.8.0; import "../challenge/IChallengeManager.sol"; import "../libraries/DelegateCallAware.sol"; import "../libraries/IGasRefunder.sol"; +import "../libraries/GasRefundEnabled.sol"; import "@openzeppelin/contracts/utils/Address.sol"; import "@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol"; From e3cc7214d4f734d06d3476798e641ae68bbf5ce8 Mon Sep 17 00:00:00 2001 From: gzeon Date: Fri, 19 Jan 2024 02:11:46 +0800 Subject: [PATCH 269/292] fix: add DelegateCallAware --- src/bridge/SequencerInbox.sol | 1 + 1 file changed, 1 insertion(+) diff --git a/src/bridge/SequencerInbox.sol b/src/bridge/SequencerInbox.sol index 1cefd13b..63ff73cb 100644 --- a/src/bridge/SequencerInbox.sol +++ b/src/bridge/SequencerInbox.sol @@ -41,6 +41,7 @@ import "../precompiles/ArbSys.sol"; import "../libraries/I4844Readers.sol"; import {L1MessageType_batchPostingReport} from "../libraries/MessageTypes.sol"; +import "../libraries/DelegateCallAware.sol"; import {IGasRefunder} from "../libraries/IGasRefunder.sol"; import {GasRefundEnabled} from "../libraries/GasRefundEnabled.sol"; import "../libraries/ArbitrumChecker.sol"; From dcb688b6427a254e40a7efd15af27e0d29446b3b Mon Sep 17 00:00:00 2001 From: Lee Bousfield Date: Thu, 18 Jan 2024 19:05:23 -0700 Subject: [PATCH 270/292] Include blob cost in extraGas field of batch posting reports --- src/bridge/SequencerInbox.sol | 69 +++++++++++++++++++---------------- 1 file changed, 38 insertions(+), 31 deletions(-) diff --git a/src/bridge/SequencerInbox.sol b/src/bridge/SequencerInbox.sol index 7cecec64..2721fdbe 100644 --- a/src/bridge/SequencerInbox.sol +++ b/src/bridge/SequencerInbox.sol @@ -74,6 +74,9 @@ contract SequencerInbox is DelegateCallAware, GasRefundEnabled, ISequencerInbox /// @inheritdoc ISequencerInbox bytes1 public constant ZERO_HEAVY_MESSAGE_HEADER_FLAG = 0x20; + // GAS_PER_BLOB from EIP-4844 + uint256 internal constant GAS_PER_BLOB = 1 << 17; + IOwnable public rollup; mapping(address => bool) public isBatchPoster; @@ -414,9 +417,11 @@ contract SequencerInbox is DelegateCallAware, GasRefundEnabled, ISequencerInbox uint256 newMessageCount ) external refundsGas(gasRefunder) { if (!isBatchPoster[msg.sender]) revert NotBatchPoster(); - (bytes32 dataHash, IBridge.TimeBounds memory timeBounds) = formBlobDataHash( - afterDelayedMessagesRead - ); + ( + bytes32 dataHash, + IBridge.TimeBounds memory timeBounds, + uint256 blobCost + ) = formBlobDataHash(afterDelayedMessagesRead); // we use addSequencerL2BatchImpl for submitting the message // normally this would also submit a batch spending report but that is skipped if we pass @@ -455,8 +460,12 @@ contract SequencerInbox is DelegateCallAware, GasRefundEnabled, ISequencerInbox if (hostChainIsArbitrum) revert DataBlobsNotSupported(); // submit a batch spending report to refund the entity that produced the blob batch data - uint256 blobBasefee = blobBasefeeReader.getBlobBaseFee(); - submitBatchSpendingReport(dataHash, seqMessageIndex, block.basefee, blobBasefee); + submitBatchSpendingReport( + dataHash, + seqMessageIndex, + block.basefee, + blobCost / block.basefee + ); } function addSequencerL2Batch( @@ -602,7 +611,11 @@ contract SequencerInbox is DelegateCallAware, GasRefundEnabled, ISequencerInbox function formBlobDataHash(uint256 afterDelayedMessagesRead) internal view - returns (bytes32, IBridge.TimeBounds memory) + returns ( + bytes32, + IBridge.TimeBounds memory, + uint256 + ) { bytes32[] memory dataHashes = dataHashReader.getDataHashes(); if (dataHashes.length == 0) revert MissingDataHashes(); @@ -611,9 +624,16 @@ contract SequencerInbox is DelegateCallAware, GasRefundEnabled, ISequencerInbox afterDelayedMessagesRead ); + uint256 blobCost = blobBasefeeReader.getBlobBaseFee() * GAS_PER_BLOB * dataHashes.length; + // solhint-disable-next-line avoid-tx-origin + if (tx.origin != msg.sender) { + // Make sure that if we're refunding this blob, it's only for this batch submission. + blobCost = 0; + } return ( keccak256(bytes.concat(header, DATA_BLOB_HEADER_FLAG, abi.encodePacked(dataHashes))), - timeBounds + timeBounds, + blobCost ); } @@ -625,9 +645,8 @@ contract SequencerInbox is DelegateCallAware, GasRefundEnabled, ISequencerInbox bytes32 dataHash, uint256 seqMessageIndex, uint256 gasPrice, - uint256 blobBaseFeePrice + uint256 extraGas ) internal { - bytes memory spendingReportMsg; address batchPoster = msg.sender; // this msg isn't included in the current sequencer batch, but instead added to @@ -635,29 +654,17 @@ contract SequencerInbox is DelegateCallAware, GasRefundEnabled, ISequencerInbox if (hostChainIsArbitrum) { // Include extra gas for the host chain's L1 gas charging uint256 l1Fees = ArbGasInfo(address(0x6c)).getCurrentTxL1GasFees(); - uint256 extraGas = l1Fees / block.basefee; - require(extraGas <= type(uint64).max, "L1_GAS_NOT_UINT64"); - spendingReportMsg = abi.encodePacked( - block.timestamp, - batchPoster, - dataHash, - seqMessageIndex, - gasPrice, - uint64(extraGas) - ); - } else { - // when a blob base fee is supplied we include it into the batch spending report - spendingReportMsg = abi.encodePacked( - block.timestamp, - batchPoster, - dataHash, - seqMessageIndex, - gasPrice, - // we add an empty extraGas since the parsing code expects a value here - uint64(0), - blobBaseFeePrice - ); + extraGas += l1Fees / block.basefee; } + require(extraGas <= type(uint64).max, "EXTRA_GAS_NOT_UINT64"); + bytes memory spendingReportMsg = abi.encodePacked( + block.timestamp, + batchPoster, + dataHash, + seqMessageIndex, + gasPrice, + uint64(extraGas) + ); uint256 msgNum = bridge.submitBatchSpendingReport( batchPoster, From b95ab08544ae339c5ee7e7d708c9acb5e4ab1f75 Mon Sep 17 00:00:00 2001 From: Lee Bousfield Date: Thu, 18 Jan 2024 19:21:06 -0700 Subject: [PATCH 271/292] Expect extraGas field in batch posting report --- test/foundry/SequencerInbox.t.sol | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/test/foundry/SequencerInbox.t.sol b/test/foundry/SequencerInbox.t.sol index f947e8ac..2e03c42b 100644 --- a/test/foundry/SequencerInbox.t.sol +++ b/test/foundry/SequencerInbox.t.sol @@ -108,7 +108,8 @@ contract SequencerInboxTest is Test { sequenceNumber, block.basefee, uint64(0), - uint256(0) + uint256(0), + uint64(0) ); bytes32 beforeAcc = bytes32(0); bytes32 delayedAcc = bridge.delayedInboxAccs(delayedMessagesRead - 1); @@ -137,7 +138,7 @@ contract SequencerInboxTest is Test { // sequencer batch delivered vm.expectEmit(); emit SequencerBatchDelivered( - sequenceNumber, + sequenceNumber, beforeAcc, afterAcc, delayedAcc, From 5989fe0e895bcef4a8ecd6306b29a5c53f4585e4 Mon Sep 17 00:00:00 2001 From: gzeon Date: Fri, 19 Jan 2024 13:53:40 +0800 Subject: [PATCH 272/292] chore: revert SequencerInboxStub changes --- src/mocks/SequencerInboxStub.sol | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/mocks/SequencerInboxStub.sol b/src/mocks/SequencerInboxStub.sol index f06393d4..75d94962 100644 --- a/src/mocks/SequencerInboxStub.sol +++ b/src/mocks/SequencerInboxStub.sol @@ -10,11 +10,19 @@ import {INITIALIZATION_MSG_TYPE} from "../libraries/MessageTypes.sol"; contract SequencerInboxStub is SequencerInbox { constructor( + IBridge bridge_, address sequencer_, + ISequencerInbox.MaxTimeVariation memory maxTimeVariation_, uint256 maxDataSize_, IDataHashReader dataHashReader_, IBlobBasefeeReader blobBasefeeReader_ ) SequencerInbox(maxDataSize_, dataHashReader_, blobBasefeeReader_) { + bridge = bridge_; + rollup = IOwnable(msg.sender); + delayBlocks = maxTimeVariation_.delayBlocks; + futureBlocks = maxTimeVariation_.futureBlocks; + delaySeconds = maxTimeVariation_.delaySeconds; + futureSeconds = maxTimeVariation_.futureSeconds; isBatchPoster[sequencer_] = true; } From 77ce30ee8393a7b489e42f7afdbe6f3966538e72 Mon Sep 17 00:00:00 2001 From: Lee Bousfield Date: Fri, 19 Jan 2024 01:20:34 -0700 Subject: [PATCH 273/292] Fix expected log in SequencerInboxTest --- test/foundry/SequencerInbox.t.sol | 2 -- 1 file changed, 2 deletions(-) diff --git a/test/foundry/SequencerInbox.t.sol b/test/foundry/SequencerInbox.t.sol index 2e03c42b..93c42b12 100644 --- a/test/foundry/SequencerInbox.t.sol +++ b/test/foundry/SequencerInbox.t.sol @@ -107,8 +107,6 @@ contract SequencerInboxTest is Test { dataHash, sequenceNumber, block.basefee, - uint64(0), - uint256(0), uint64(0) ); bytes32 beforeAcc = bytes32(0); From ab7df1ba689bc2f1617854dd42d6d3bc0e2d696f Mon Sep 17 00:00:00 2001 From: Chris Buckland Date: Fri, 19 Jan 2024 10:15:42 +0000 Subject: [PATCH 274/292] Moved 4844 readers into a single yul contract - reduces stack size in the sequencer inbox --- package.json | 2 +- src/bridge/SequencerInbox.sol | 49 +++++++++---------- src/libraries/GasRefundEnabled.sol | 14 ++---- .../{I4844Readers.sol => IReader4844.sol} | 5 +- src/mocks/SequencerInboxStub.sol | 5 +- src/rollup/ValidatorWallet.sol | 6 +-- test/contract/sequencerInbox.spec.4844.ts | 11 ++--- test/contract/toolkit4844.ts | 40 ++++----------- test/foundry/BridgeCreator.t.sol | 6 +-- test/foundry/RollupCreator.t.sol | 6 +-- test/foundry/SequencerInbox.t.sol | 9 ++-- yul/BlobBasefeeReader.yul | 20 -------- yul/{DataHashesReader.yul => Reader4844.yul} | 9 +++- 13 files changed, 65 insertions(+), 117 deletions(-) rename src/libraries/{I4844Readers.sol => IReader4844.sol} (83%) delete mode 100644 yul/BlobBasefeeReader.yul rename yul/{DataHashesReader.yul => Reader4844.yul} (76%) diff --git a/package.json b/package.json index 9af3259a..6f649956 100644 --- a/package.json +++ b/package.json @@ -21,7 +21,7 @@ "build:all": "yarn build && yarn build:forge", "build": "hardhat compile", "build:forge:sol": "forge build --skip *.yul", - "build:forge:yul": "FOUNDRY_PROFILE=yul forge build --skip *.sol --skip *BlobBasefeeReader.yul && FOUNDRY_PROFILE=yul forge build --skip *.sol --skip *DataHashesReader.yul", + "build:forge:yul": "FOUNDRY_PROFILE=yul forge build --skip *.sol", "build:forge": "yarn build:forge:sol && yarn build:forge:yul", "lint:test": "eslint ./test", "solhint": "solhint -f table src/**/*.sol", diff --git a/src/bridge/SequencerInbox.sol b/src/bridge/SequencerInbox.sol index 63ff73cb..347ccc87 100644 --- a/src/bridge/SequencerInbox.sol +++ b/src/bridge/SequencerInbox.sol @@ -38,7 +38,7 @@ import "../rollup/IRollupLogic.sol"; import "./Messages.sol"; import "../precompiles/ArbGasInfo.sol"; import "../precompiles/ArbSys.sol"; -import "../libraries/I4844Readers.sol"; +import "../libraries/IReader4844.sol"; import {L1MessageType_batchPostingReport} from "../libraries/MessageTypes.sol"; import "../libraries/DelegateCallAware.sol"; @@ -90,8 +90,7 @@ contract SequencerInbox is DelegateCallAware, GasRefundEnabled, ISequencerInbox } mapping(address => bool) public isSequencer; - IDataHashReader immutable dataHashReader; - IBlobBasefeeReader immutable blobBasefeeReader; + IReader4844 immutable reader4844; // see ISequencerInbox.MaxTimeVariation uint64 internal delayBlocks; @@ -107,22 +106,16 @@ contract SequencerInbox is DelegateCallAware, GasRefundEnabled, ISequencerInbox constructor( uint256 _maxDataSize, - IDataHashReader dataHashReader_, - IBlobBasefeeReader blobBasefeeReader_ + IReader4844 reader4844_ ) { maxDataSize = _maxDataSize; if (hostChainIsArbitrum) { - if (dataHashReader_ != IDataHashReader(address(0))) revert DataBlobsNotSupported(); - if (blobBasefeeReader_ != IBlobBasefeeReader(address(0))) - revert DataBlobsNotSupported(); + if (reader4844_ != IReader4844(address(0))) revert DataBlobsNotSupported(); } else { - if (dataHashReader_ == IDataHashReader(address(0))) - revert InitParamZero("DataHashReader"); - if (blobBasefeeReader_ == IBlobBasefeeReader(address(0))) - revert InitParamZero("BlobBasefeeReader"); + if (reader4844_ == IReader4844(address(0))) + revert InitParamZero("Reader4844"); } - dataHashReader = dataHashReader_; - blobBasefeeReader = blobBasefeeReader_; + reader4844 = reader4844_; } function _chainIdChanged() internal view returns (bool) { @@ -324,7 +317,7 @@ contract SequencerInbox is DelegateCallAware, GasRefundEnabled, ISequencerInbox bytes calldata data, uint256 afterDelayedMessagesRead, IGasRefunder gasRefunder - ) external refundsGas(gasRefunder) { + ) external refundsGas(gasRefunder, IReader4844(address(0))) { // solhint-disable-next-line avoid-tx-origin if (msg.sender != tx.origin) revert NotOrigin(); if (!isBatchPoster[msg.sender]) revert NotBatchPoster(); @@ -333,25 +326,31 @@ contract SequencerInbox is DelegateCallAware, GasRefundEnabled, ISequencerInbox data, afterDelayedMessagesRead ); + // Reformat the stack to prevent "Stack too deep" + uint256 sequenceNumber_ = sequenceNumber; + IBridge.TimeBounds memory timeBounds_ = timeBounds; + bytes32 dataHash_ = dataHash; + uint256 dataLength = data.length; + uint256 afterDelayedMessagesRead_ = afterDelayedMessagesRead; ( uint256 seqMessageIndex, bytes32 beforeAcc, bytes32 delayedAcc, bytes32 afterAcc - ) = addSequencerL2BatchImpl(dataHash, afterDelayedMessagesRead, data.length, 0, 0); + ) = addSequencerL2BatchImpl(dataHash_, afterDelayedMessagesRead_, dataLength, 0, 0); // ~uint256(0) is type(uint256).max, but ever so slightly cheaper - if (seqMessageIndex != sequenceNumber && sequenceNumber != ~uint256(0)) { - revert BadSequencerNumber(seqMessageIndex, sequenceNumber); + if (seqMessageIndex != sequenceNumber_ && sequenceNumber_ != ~uint256(0)) { + revert BadSequencerNumber(seqMessageIndex, sequenceNumber_); } emit SequencerBatchDelivered( - sequenceNumber, + sequenceNumber_, beforeAcc, afterAcc, delayedAcc, totalDelayedMessagesRead, - timeBounds, + timeBounds_, IBridge.BatchDataLocation.TxInput ); } @@ -365,7 +364,7 @@ contract SequencerInbox is DelegateCallAware, GasRefundEnabled, ISequencerInbox uint256 newMessageCount ) external - refundsGas(gasRefunder, IDataHashReader(address(0)), IBlobBasefeeReader(address(0))) + refundsGas(gasRefunder, IReader4844(address(0))) { // solhint-disable-next-line avoid-tx-origin if (msg.sender != tx.origin) revert NotOrigin(); @@ -417,7 +416,7 @@ contract SequencerInbox is DelegateCallAware, GasRefundEnabled, ISequencerInbox IGasRefunder gasRefunder, uint256 prevMessageCount, uint256 newMessageCount - ) external refundsGas(gasRefunder, dataHashReader, blobBasefeeReader) { + ) external refundsGas(gasRefunder, reader4844) { if (!isBatchPoster[msg.sender]) revert NotBatchPoster(); (bytes32 dataHash, IBridge.TimeBounds memory timeBounds) = formBlobDataHash( afterDelayedMessagesRead @@ -460,7 +459,7 @@ contract SequencerInbox is DelegateCallAware, GasRefundEnabled, ISequencerInbox if (hostChainIsArbitrum) revert DataBlobsNotSupported(); // submit a batch spending report to refund the entity that produced the blob batch data - uint256 blobBasefee = blobBasefeeReader.getBlobBaseFee(); + uint256 blobBasefee = reader4844.getBlobBaseFee(); submitBatchSpendingReport(dataHash, seqMessageIndex, block.basefee, blobBasefee); } @@ -474,7 +473,7 @@ contract SequencerInbox is DelegateCallAware, GasRefundEnabled, ISequencerInbox ) external override - refundsGas(gasRefunder, IDataHashReader(address(0)), IBlobBasefeeReader(address(0))) + refundsGas(gasRefunder, IReader4844(address(0))) { if (!isBatchPoster[msg.sender] && msg.sender != address(rollup)) revert NotBatchPoster(); (bytes32 dataHash, IBridge.TimeBounds memory timeBounds) = formCallDataHash( @@ -613,7 +612,7 @@ contract SequencerInbox is DelegateCallAware, GasRefundEnabled, ISequencerInbox view returns (bytes32, IBridge.TimeBounds memory) { - bytes32[] memory dataHashes = dataHashReader.getDataHashes(); + bytes32[] memory dataHashes = reader4844.getDataHashes(); if (dataHashes.length == 0) revert MissingDataHashes(); (bytes memory header, IBridge.TimeBounds memory timeBounds) = packHeader( diff --git a/src/libraries/GasRefundEnabled.sol b/src/libraries/GasRefundEnabled.sol index 363b6110..9c8eabff 100644 --- a/src/libraries/GasRefundEnabled.sol +++ b/src/libraries/GasRefundEnabled.sol @@ -5,7 +5,7 @@ // solhint-disable-next-line compiler-version pragma solidity ^0.8.0; -import "./I4844Readers.sol"; +import "./IReader4844.sol"; import "./IGasRefunder.sol"; abstract contract GasRefundEnabled { @@ -16,8 +16,7 @@ abstract contract GasRefundEnabled { /// for the `tx.input`. this avoids a possible attack where you generate large calldata from a contract and get over-refunded modifier refundsGas( IGasRefunder gasRefunder, - IDataHashReader dataHashReader, - IBlobBasefeeReader blobBasefeeReader + IReader4844 reader4844 ) { uint256 startGasLeft = gasleft(); _; @@ -36,15 +35,12 @@ abstract contract GasRefundEnabled { } else { // for similar reasons to above we only refund blob gas when the tx.origin is the msg.sender // this avoids the caller being able to send blobs to other contracts and still get refunded here - if ( - address(dataHashReader) != address(0) && - address(blobBasefeeReader) != (address(0)) - ) { + if (address(reader4844) != address(0)) { // add any cost for 4844 data, the data hash reader throws an error prior to 4844 being activated // we do this addition here rather in the GasRefunder so that we can check the msg.sender is the tx.origin - try dataHashReader.getDataHashes() returns (bytes32[] memory dataHashes) { + try reader4844.getDataHashes() returns (bytes32[] memory dataHashes) { if (dataHashes.length != 0) { - uint256 blobBasefee = blobBasefeeReader.getBlobBaseFee(); + uint256 blobBasefee = reader4844.getBlobBaseFee(); startGasLeft += (dataHashes.length * gasPerBlob * blobBasefee) / block.basefee; diff --git a/src/libraries/I4844Readers.sol b/src/libraries/IReader4844.sol similarity index 83% rename from src/libraries/I4844Readers.sol rename to src/libraries/IReader4844.sol index f920d69e..ed361885 100644 --- a/src/libraries/I4844Readers.sol +++ b/src/libraries/IReader4844.sol @@ -1,11 +1,8 @@ pragma solidity >=0.6.9 <0.9.0; -interface IBlobBasefeeReader { +interface IReader4844 { /// @notice Returns the current BLOBBASEFEE function getBlobBaseFee() external view returns (uint256); -} - -interface IDataHashReader { /// @notice Returns all the data hashes of all the blobs on the current transaction function getDataHashes() external view returns (bytes32[] memory); } diff --git a/src/mocks/SequencerInboxStub.sol b/src/mocks/SequencerInboxStub.sol index f06393d4..70b58d62 100644 --- a/src/mocks/SequencerInboxStub.sol +++ b/src/mocks/SequencerInboxStub.sol @@ -12,9 +12,8 @@ contract SequencerInboxStub is SequencerInbox { constructor( address sequencer_, uint256 maxDataSize_, - IDataHashReader dataHashReader_, - IBlobBasefeeReader blobBasefeeReader_ - ) SequencerInbox(maxDataSize_, dataHashReader_, blobBasefeeReader_) { + IReader4844 reader4844_ + ) SequencerInbox(maxDataSize_, reader4844_) { isBatchPoster[sequencer_] = true; } diff --git a/src/rollup/ValidatorWallet.sol b/src/rollup/ValidatorWallet.sol index f6794260..cc6c7988 100644 --- a/src/rollup/ValidatorWallet.sol +++ b/src/rollup/ValidatorWallet.sol @@ -114,7 +114,7 @@ contract ValidatorWallet is OwnableUpgradeable, DelegateCallAware, GasRefundEnab public payable onlyExecutorOrOwner - refundsGas(gasRefunder, IDataHashReader(address(0)), IBlobBasefeeReader(address(0))) + refundsGas(gasRefunder, IReader4844(address(0))) { uint256 numTxes = data.length; if (numTxes != destination.length) revert BadArrayLength(numTxes, destination.length); @@ -154,7 +154,7 @@ contract ValidatorWallet is OwnableUpgradeable, DelegateCallAware, GasRefundEnab public payable onlyExecutorOrOwner - refundsGas(gasRefunder, IDataHashReader(address(0)), IBlobBasefeeReader(address(0))) + refundsGas(gasRefunder, IReader4844(address(0))) { if (data.length > 0) require(destination.isContract(), "NO_CODE_AT_ADDR"); validateExecuteTransaction(destination); @@ -182,7 +182,7 @@ contract ValidatorWallet is OwnableUpgradeable, DelegateCallAware, GasRefundEnab ) public onlyExecutorOrOwner - refundsGas(gasRefunder, IDataHashReader(address(0)), IBlobBasefeeReader(address(0))) + refundsGas(gasRefunder, IReader4844(address(0))) { uint256 challengesCount = challenges.length; for (uint256 i = 0; i < challengesCount; i++) { diff --git a/test/contract/sequencerInbox.spec.4844.ts b/test/contract/sequencerInbox.spec.4844.ts index 30195698..d9fae2ac 100644 --- a/test/contract/sequencerInbox.spec.4844.ts +++ b/test/contract/sequencerInbox.spec.4844.ts @@ -282,15 +282,12 @@ describe('SequencerInbox', async () => { await rollupOwner.getAddress() ) - const dataHashReader = await Toolkit4844.deployDataHashReader(fundingWallet) - const blobBasefeeReader = await Toolkit4844.deployBlobBasefeeReader( - fundingWallet - ) + const reader4844 = await Toolkit4844.deployReader4844(fundingWallet) + const sequencerInboxFac = new SequencerInbox__factory(deployer) const seqInboxTemplate = await sequencerInboxFac.deploy( 117964, - dataHashReader.address, - blobBasefeeReader.address + reader4844.address ) const inboxFac = new Inbox__factory(deployer) const inboxTemplate = await inboxFac.deploy(117964) @@ -420,7 +417,7 @@ describe('SequencerInbox', async () => { const subMessageCount = await bridge.sequencerReportedSubMessageCount() const balBefore = await batchPoster.getBalance() - const receipt = await ( + await ( await sequencerInbox .connect(batchPoster) .functions.addSequencerL2BatchFromOrigin( diff --git a/test/contract/toolkit4844.ts b/test/contract/toolkit4844.ts index bca1ea14..46a35854 100644 --- a/test/contract/toolkit4844.ts +++ b/test/contract/toolkit4844.ts @@ -2,14 +2,11 @@ import { execSync } from 'child_process' import { ContractFactory, Signer, Wallet, ethers } from 'ethers' import * as http from 'http' import { - IBlobBasefeeReader, - IBlobBasefeeReader__factory, - IDataHashReader, - IDataHashReader__factory, + IReader4844, + IReader4844__factory } from '../../build/types' import { JsonRpcProvider } from '@ethersproject/providers' -import { bytecode as blobBasefeeReaderBytecode } from '../../out/yul/BlobBasefeeReader.yul/BlobBasefeeReader.json' -import { bytecode as dataHeashesReaderBytecode } from '../../out/yul/DataHashesReader.yul/DataHashesReader.json' +import { bytecode as Reader4844Bytecode } from '../../out/yul/Reader4844.yul/Reader4844.json' const wait = async (ms: number) => new Promise((res, rej) => { @@ -128,34 +125,17 @@ export class Toolkit4844 { } } - public static async deployDataHashReader( + public static async deployReader4844( wallet: Signer - ): Promise { + ): Promise { const contractFactory = new ContractFactory( - IDataHashReader__factory.abi, - dataHeashesReaderBytecode, + IReader4844__factory.abi, + Reader4844Bytecode, wallet ) - const dataHashReader = await contractFactory.deploy() - await dataHashReader.deployed() + const reader4844 = await contractFactory.deploy() + await reader4844.deployed() - return IDataHashReader__factory.connect(dataHashReader.address, wallet) - } - - public static async deployBlobBasefeeReader( - wallet: Signer - ): Promise { - const contractFactory = new ContractFactory( - IBlobBasefeeReader__factory.abi, - blobBasefeeReaderBytecode, - wallet - ) - const blobBasefeeReader = await contractFactory.deploy() - await blobBasefeeReader.deployed() - - return IBlobBasefeeReader__factory.connect( - blobBasefeeReader.address, - wallet - ) + return IReader4844__factory.connect(reader4844.address, wallet) } } diff --git a/test/foundry/BridgeCreator.t.sol b/test/foundry/BridgeCreator.t.sol index 25bdddc8..ce8e2c13 100644 --- a/test/foundry/BridgeCreator.t.sol +++ b/test/foundry/BridgeCreator.t.sol @@ -13,16 +13,14 @@ contract BridgeCreatorTest is Test { BridgeCreator public creator; address public owner = address(100); uint256 public constant MAX_DATA_SIZE = 117_964; - IDataHashReader dummyDataHashReader = IDataHashReader(address(137)); - IBlobBasefeeReader dummyBlobBasefeeReader = IBlobBasefeeReader(address(138)); + IReader4844 dummyReader4844 = IReader4844(address(137)); BridgeCreator.BridgeContracts ethBasedTemplates = BridgeCreator.BridgeContracts({ bridge: new Bridge(), sequencerInbox: new SequencerInbox( MAX_DATA_SIZE, - dummyDataHashReader, - dummyBlobBasefeeReader + dummyReader4844 ), inbox: new Inbox(MAX_DATA_SIZE), rollupEventInbox: new RollupEventInbox(), diff --git a/test/foundry/RollupCreator.t.sol b/test/foundry/RollupCreator.t.sol index 6efaf803..b9f895c1 100644 --- a/test/foundry/RollupCreator.t.sol +++ b/test/foundry/RollupCreator.t.sol @@ -27,8 +27,7 @@ contract RollupCreatorTest is Test { IRollupAdmin public rollupAdmin; IRollupUser public rollupUser; DeployHelper public deployHelper; - IDataHashReader dummyDataHashReader = IDataHashReader(address(137)); - IBlobBasefeeReader dummyBlobBasefeeReader = IBlobBasefeeReader(address(138)); + IReader4844 dummyReader4844 = IReader4844(address(137)); // 1 gwei uint256 public constant MAX_FEE_PER_GAS = 1_000_000_000; @@ -38,8 +37,7 @@ contract RollupCreatorTest is Test { bridge: new Bridge(), sequencerInbox: new SequencerInbox( MAX_DATA_SIZE, - dummyDataHashReader, - dummyBlobBasefeeReader + dummyReader4844 ), inbox: new Inbox(MAX_DATA_SIZE), rollupEventInbox: new RollupEventInbox(), diff --git a/test/foundry/SequencerInbox.t.sol b/test/foundry/SequencerInbox.t.sol index f947e8ac..45973a69 100644 --- a/test/foundry/SequencerInbox.t.sol +++ b/test/foundry/SequencerInbox.t.sol @@ -49,8 +49,7 @@ contract SequencerInboxTest is Test { }); address dummyInbox = address(139); address proxyAdmin = address(140); - IDataHashReader dummyDataHashReader = IDataHashReader(address(141)); - IBlobBasefeeReader dummyBlobBasefeeReader = IBlobBasefeeReader(address(142)); + IReader4844 dummyReader4844 = IReader4844(address(137)); function deploy() public returns(SequencerInbox, Bridge) { RollupMock rollupMock = new RollupMock(rollupOwner); @@ -63,8 +62,7 @@ contract SequencerInboxTest is Test { SequencerInbox seqInboxImpl = new SequencerInbox( maxDataSize, - dummyDataHashReader, - dummyBlobBasefeeReader + dummyReader4844 ); SequencerInbox seqInbox = SequencerInbox(address(new TransparentUpgradeableProxy(address(seqInboxImpl), proxyAdmin, ""))); seqInbox.initialize( @@ -264,8 +262,7 @@ contract SequencerInboxTest is Test { (SequencerInbox seqInbox, ) = deploy(); SequencerInbox seqInboxImpl = new SequencerInbox( maxDataSize, - dummyDataHashReader, - dummyBlobBasefeeReader + dummyReader4844 ); vm.expectRevert(abi.encodeWithSelector(AlreadyInit.selector)); diff --git a/yul/BlobBasefeeReader.yul b/yul/BlobBasefeeReader.yul deleted file mode 100644 index de12c8e2..00000000 --- a/yul/BlobBasefeeReader.yul +++ /dev/null @@ -1,20 +0,0 @@ - -object "BlobBasefeeReader" { - code { - datacopy(0, dataoffset("runtime"), datasize("runtime")) - return(0, datasize("runtime")) - } - object "runtime" { - code { - // Match against the keccak of the ABI function signature needed. - switch shr(0xe0,calldataload(0)) - // bytes4(keccak("getBlobBaseFee()")) - case 0x1f6d6ef7 { - // BLOBBASEFEE opcode has hex value 0x4a - let blobBasefee := verbatim_0i_1o(hex"4a") - mstore(0, blobBasefee) - return(0, 32) - } - } - } -} \ No newline at end of file diff --git a/yul/DataHashesReader.yul b/yul/Reader4844.yul similarity index 76% rename from yul/DataHashesReader.yul rename to yul/Reader4844.yul index 90e736f9..c700202a 100644 --- a/yul/DataHashesReader.yul +++ b/yul/Reader4844.yul @@ -1,5 +1,5 @@ // taken from https://github.com/rauljordan/eip4844-interop/blob/b23c1afa79ad18b0318dca41c000c7c0edfe29d9/upload/contracts/DataHashesReader.yul -object "DataHashesReader" { +object "Reader4844" { code { datacopy(0, dataoffset("runtime"), datasize("runtime")) return(0, datasize("runtime")) @@ -24,6 +24,13 @@ object "DataHashesReader" { mstore(32, i) return(0, add(mul(i, 32), 64)) } + // bytes4(keccak("getBlobBaseFee()")) + case 0x1f6d6ef7 { + // BLOBBASEFEE opcode has hex value 0x4a + let blobBasefee := verbatim_0i_1o(hex"4a") + mstore(0, blobBasefee) + return(0, 32) + } } } } \ No newline at end of file From 229b43a1ca9c0d2ec139fa111d450f577617879c Mon Sep 17 00:00:00 2001 From: Chris Buckland Date: Fri, 19 Jan 2024 10:21:06 +0000 Subject: [PATCH 275/292] Formatting --- src/bridge/SequencerInbox.sol | 21 +++++---------------- src/libraries/GasRefundEnabled.sol | 5 +---- src/libraries/IReader4844.sol | 1 + src/rollup/ValidatorWallet.sol | 20 +++----------------- 4 files changed, 10 insertions(+), 37 deletions(-) diff --git a/src/bridge/SequencerInbox.sol b/src/bridge/SequencerInbox.sol index 347ccc87..4ff38e30 100644 --- a/src/bridge/SequencerInbox.sol +++ b/src/bridge/SequencerInbox.sol @@ -104,16 +104,12 @@ contract SequencerInbox is DelegateCallAware, GasRefundEnabled, ISequencerInbox // If the chain this SequencerInbox is deployed on is an Arbitrum chain. bool internal immutable hostChainIsArbitrum = ArbitrumChecker.runningOnArbitrum(); - constructor( - uint256 _maxDataSize, - IReader4844 reader4844_ - ) { + constructor(uint256 _maxDataSize, IReader4844 reader4844_) { maxDataSize = _maxDataSize; if (hostChainIsArbitrum) { if (reader4844_ != IReader4844(address(0))) revert DataBlobsNotSupported(); } else { - if (reader4844_ == IReader4844(address(0))) - revert InitParamZero("Reader4844"); + if (reader4844_ == IReader4844(address(0))) revert InitParamZero("Reader4844"); } reader4844 = reader4844_; } @@ -326,7 +322,7 @@ contract SequencerInbox is DelegateCallAware, GasRefundEnabled, ISequencerInbox data, afterDelayedMessagesRead ); - // Reformat the stack to prevent "Stack too deep" + // Reformat the stack to prevent "Stack too deep" uint256 sequenceNumber_ = sequenceNumber; IBridge.TimeBounds memory timeBounds_ = timeBounds; bytes32 dataHash_ = dataHash; @@ -362,10 +358,7 @@ contract SequencerInbox is DelegateCallAware, GasRefundEnabled, ISequencerInbox IGasRefunder gasRefunder, uint256 prevMessageCount, uint256 newMessageCount - ) - external - refundsGas(gasRefunder, IReader4844(address(0))) - { + ) external refundsGas(gasRefunder, IReader4844(address(0))) { // solhint-disable-next-line avoid-tx-origin if (msg.sender != tx.origin) revert NotOrigin(); if (!isBatchPoster[msg.sender]) revert NotBatchPoster(); @@ -470,11 +463,7 @@ contract SequencerInbox is DelegateCallAware, GasRefundEnabled, ISequencerInbox IGasRefunder gasRefunder, uint256 prevMessageCount, uint256 newMessageCount - ) - external - override - refundsGas(gasRefunder, IReader4844(address(0))) - { + ) external override refundsGas(gasRefunder, IReader4844(address(0))) { if (!isBatchPoster[msg.sender] && msg.sender != address(rollup)) revert NotBatchPoster(); (bytes32 dataHash, IBridge.TimeBounds memory timeBounds) = formCallDataHash( data, diff --git a/src/libraries/GasRefundEnabled.sol b/src/libraries/GasRefundEnabled.sol index 9c8eabff..60287ee0 100644 --- a/src/libraries/GasRefundEnabled.sol +++ b/src/libraries/GasRefundEnabled.sol @@ -14,10 +14,7 @@ abstract contract GasRefundEnabled { /// @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-refunded - modifier refundsGas( - IGasRefunder gasRefunder, - IReader4844 reader4844 - ) { + modifier refundsGas(IGasRefunder gasRefunder, IReader4844 reader4844) { uint256 startGasLeft = gasleft(); _; if (address(gasRefunder) != address(0)) { diff --git a/src/libraries/IReader4844.sol b/src/libraries/IReader4844.sol index ed361885..a66ebae5 100644 --- a/src/libraries/IReader4844.sol +++ b/src/libraries/IReader4844.sol @@ -3,6 +3,7 @@ pragma solidity >=0.6.9 <0.9.0; interface IReader4844 { /// @notice Returns the current BLOBBASEFEE function getBlobBaseFee() external view returns (uint256); + /// @notice Returns all the data hashes of all the blobs on the current transaction function getDataHashes() external view returns (bytes32[] memory); } diff --git a/src/rollup/ValidatorWallet.sol b/src/rollup/ValidatorWallet.sol index cc6c7988..0d7cbace 100644 --- a/src/rollup/ValidatorWallet.sol +++ b/src/rollup/ValidatorWallet.sol @@ -110,12 +110,7 @@ contract ValidatorWallet is OwnableUpgradeable, DelegateCallAware, GasRefundEnab bytes[] calldata data, address[] calldata destination, uint256[] calldata amount - ) - public - payable - onlyExecutorOrOwner - refundsGas(gasRefunder, IReader4844(address(0))) - { + ) public payable onlyExecutorOrOwner refundsGas(gasRefunder, IReader4844(address(0))) { uint256 numTxes = data.length; if (numTxes != destination.length) revert BadArrayLength(numTxes, destination.length); if (numTxes != amount.length) revert BadArrayLength(numTxes, amount.length); @@ -150,12 +145,7 @@ contract ValidatorWallet is OwnableUpgradeable, DelegateCallAware, GasRefundEnab bytes calldata data, address destination, uint256 amount - ) - public - payable - onlyExecutorOrOwner - refundsGas(gasRefunder, IReader4844(address(0))) - { + ) public payable onlyExecutorOrOwner refundsGas(gasRefunder, IReader4844(address(0))) { if (data.length > 0) require(destination.isContract(), "NO_CODE_AT_ADDR"); validateExecuteTransaction(destination); // We use a low level call here to allow for contract and non-contract calls @@ -179,11 +169,7 @@ contract ValidatorWallet is OwnableUpgradeable, DelegateCallAware, GasRefundEnab IGasRefunder gasRefunder, IChallengeManager manager, uint64[] calldata challenges - ) - public - onlyExecutorOrOwner - refundsGas(gasRefunder, IReader4844(address(0))) - { + ) public onlyExecutorOrOwner refundsGas(gasRefunder, IReader4844(address(0))) { uint256 challengesCount = challenges.length; for (uint256 i = 0; i < challengesCount; i++) { try manager.timeout(challenges[i]) {} catch (bytes memory error) { From d07138c4f1eeb980db74537dc735bad758e51721 Mon Sep 17 00:00:00 2001 From: Chris Buckland Date: Fri, 19 Jan 2024 10:22:37 +0000 Subject: [PATCH 276/292] Formatting --- test/contract/sequencerInbox.spec.4844.ts | 2 +- test/contract/toolkit4844.ts | 9 ++------- 2 files changed, 3 insertions(+), 8 deletions(-) diff --git a/test/contract/sequencerInbox.spec.4844.ts b/test/contract/sequencerInbox.spec.4844.ts index d9fae2ac..2b033928 100644 --- a/test/contract/sequencerInbox.spec.4844.ts +++ b/test/contract/sequencerInbox.spec.4844.ts @@ -283,7 +283,7 @@ describe('SequencerInbox', async () => { ) const reader4844 = await Toolkit4844.deployReader4844(fundingWallet) - + const sequencerInboxFac = new SequencerInbox__factory(deployer) const seqInboxTemplate = await sequencerInboxFac.deploy( 117964, diff --git a/test/contract/toolkit4844.ts b/test/contract/toolkit4844.ts index 46a35854..39ad0cc0 100644 --- a/test/contract/toolkit4844.ts +++ b/test/contract/toolkit4844.ts @@ -1,10 +1,7 @@ import { execSync } from 'child_process' import { ContractFactory, Signer, Wallet, ethers } from 'ethers' import * as http from 'http' -import { - IReader4844, - IReader4844__factory -} from '../../build/types' +import { IReader4844, IReader4844__factory } from '../../build/types' import { JsonRpcProvider } from '@ethersproject/providers' import { bytecode as Reader4844Bytecode } from '../../out/yul/Reader4844.yul/Reader4844.json' @@ -125,9 +122,7 @@ export class Toolkit4844 { } } - public static async deployReader4844( - wallet: Signer - ): Promise { + public static async deployReader4844(wallet: Signer): Promise { const contractFactory = new ContractFactory( IReader4844__factory.abi, Reader4844Bytecode, From 4d91bc102f6c1b760d3656bd84390c0eee0aa4cf Mon Sep 17 00:00:00 2001 From: gzeon Date: Fri, 19 Jan 2024 19:14:25 +0800 Subject: [PATCH 277/292] test: fix --- test/contract/arbRollup.spec.ts | 6 ++---- test/contract/sequencerInbox.spec.4844.ts | 4 +++- test/contract/sequencerInboxForceInclude.spec.ts | 6 ++---- 3 files changed, 7 insertions(+), 9 deletions(-) diff --git a/test/contract/arbRollup.spec.ts b/test/contract/arbRollup.spec.ts index 1d657765..50424e45 100644 --- a/test/contract/arbRollup.spec.ts +++ b/test/contract/arbRollup.spec.ts @@ -82,8 +82,7 @@ const ZERO_ADDR = ethers.constants.AddressZero const extraChallengeTimeBlocks = 20 const wasmModuleRoot = '0x9900000000000000000000000000000000000000000000000000000000000010' -const dummyDataHashReader = '0x0000000000000000000000000000000000000089' -const dummyBlobBasefeeReader = '0x0000000000000000000000000000000000000090' +const dummy4844Reader = '0x0000000000000000000000000000000000000089' // let rollup: RollupContract let rollup: RollupContract @@ -192,8 +191,7 @@ const setup = async () => { )) as SequencerInbox__factory const ethSequencerInbox = await ethSequencerInboxFac.deploy( 117964, - dummyDataHashReader, - dummyBlobBasefeeReader + dummy4844Reader ) const ethInboxFac = (await ethers.getContractFactory( diff --git a/test/contract/sequencerInbox.spec.4844.ts b/test/contract/sequencerInbox.spec.4844.ts index 2b033928..29af6b2e 100644 --- a/test/contract/sequencerInbox.spec.4844.ts +++ b/test/contract/sequencerInbox.spec.4844.ts @@ -420,7 +420,9 @@ describe('SequencerInbox', async () => { await ( await sequencerInbox .connect(batchPoster) - .functions.addSequencerL2BatchFromOrigin( + .functions[ + 'addSequencerL2BatchFromOrigin(uint256,bytes,uint256,address,uint256,uint256)' + ]( await bridge.sequencerMessageCount(), '0x0042', await bridge.delayedMessageCount(), diff --git a/test/contract/sequencerInboxForceInclude.spec.ts b/test/contract/sequencerInboxForceInclude.spec.ts index 3aefb3fc..3e30fa6d 100644 --- a/test/contract/sequencerInboxForceInclude.spec.ts +++ b/test/contract/sequencerInboxForceInclude.spec.ts @@ -231,15 +231,13 @@ describe('SequencerInboxForceInclude', async () => { )) as RollupMock__factory const rollup = await rollupMockFac.deploy(await rollupOwner.getAddress()) - const dataHashReader = await Toolkit4844.deployDataHashReader(admin) - const blobBasefeeReader = await Toolkit4844.deployBlobBasefeeReader(admin) + const reader4844 = await Toolkit4844.deployReader4844(admin) const sequencerInboxFac = (await ethers.getContractFactory( 'SequencerInbox' )) as SequencerInbox__factory const seqInboxTemplate = await sequencerInboxFac.deploy( 117964, - dataHashReader.address, - blobBasefeeReader.address + reader4844.address ) const inboxFac = (await ethers.getContractFactory( 'Inbox' From 7957bf7385546abca1f0cc9bfd8f31c08fe8af64 Mon Sep 17 00:00:00 2001 From: gzeon Date: Fri, 19 Jan 2024 19:18:40 +0800 Subject: [PATCH 278/292] test: fix 4844 --- test/contract/sequencerInbox.spec.4844.ts | 9 +-------- 1 file changed, 1 insertion(+), 8 deletions(-) diff --git a/test/contract/sequencerInbox.spec.4844.ts b/test/contract/sequencerInbox.spec.4844.ts index 681e78dd..7ba06e5d 100644 --- a/test/contract/sequencerInbox.spec.4844.ts +++ b/test/contract/sequencerInbox.spec.4844.ts @@ -523,8 +523,6 @@ describe('SequencerInbox', async () => { '0x' + inboxMsgDeliveredEvent.data.substring(234, 298) const spendingExtraGas = '0x' + inboxMsgDeliveredEvent.data.substring(298, 314) - const spendingBlobBasefee = - '0x' + inboxMsgDeliveredEvent.data.substring(314, 378) expect( BigNumber.from(spendingTimestamp).eq(blockTimestamp), @@ -547,14 +545,9 @@ describe('SequencerInbox', async () => { `spending basefee: ${BigNumber.from(spendingBlockBaseFee).toString()}` ).to.eq(true) expect( - BigNumber.from(spendingExtraGas).eq(0), + BigNumber.from(spendingExtraGas).gt(0), // blob spending is normalized into extra gas `spending extra gas: ${BigNumber.from(spendingExtraGas).toString()}` ).to.eq(true) - // we expect a very low - 1 - basefee since we havent sent many blobs - expect( - BigNumber.from(spendingBlobBasefee).eq(1), - `spending blob basefee: ${BigNumber.from(spendingBlobBasefee).toString()}` - ).to.eq(true) }) const getTimeBounds = async ( From 477b16fa63f5583636de7a438857e43608a3e64e Mon Sep 17 00:00:00 2001 From: gzeon Date: Fri, 19 Jan 2024 20:18:02 +0800 Subject: [PATCH 279/292] fix: solhint --- .prettierrc.js | 2 +- src/bridge/SequencerInbox.sol | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.prettierrc.js b/.prettierrc.js index b08bd49d..5392936b 100644 --- a/.prettierrc.js +++ b/.prettierrc.js @@ -14,7 +14,7 @@ module.exports = { printWidth: 100, singleQuote: false, bracketSpacing: false, - compiler: '0.8.6', + compiler: '0.8.9', }, }, ], diff --git a/src/bridge/SequencerInbox.sol b/src/bridge/SequencerInbox.sol index 4ff38e30..143a8968 100644 --- a/src/bridge/SequencerInbox.sol +++ b/src/bridge/SequencerInbox.sol @@ -90,7 +90,7 @@ contract SequencerInbox is DelegateCallAware, GasRefundEnabled, ISequencerInbox } mapping(address => bool) public isSequencer; - IReader4844 immutable reader4844; + IReader4844 public immutable reader4844; // see ISequencerInbox.MaxTimeVariation uint64 internal delayBlocks; From 5f1d5f57ebab531eab6d37c2d098339b335129a1 Mon Sep 17 00:00:00 2001 From: Lee Bousfield Date: Fri, 19 Jan 2024 11:03:50 -0700 Subject: [PATCH 280/292] Add safety checks to Reader4844.yul --- yul/Reader4844.yul | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/yul/Reader4844.yul b/yul/Reader4844.yul index c700202a..7c8aeaff 100644 --- a/yul/Reader4844.yul +++ b/yul/Reader4844.yul @@ -6,6 +6,11 @@ object "Reader4844" { } object "runtime" { code { + // This contract does not accept callvalue + if callvalue() { + revert(0, 0) + } + // Match against the keccak of the ABI function signature needed. switch shr(0xe0,calldataload(0)) // bytes4(keccak("getDataHashes()")) @@ -28,9 +33,13 @@ object "Reader4844" { case 0x1f6d6ef7 { // BLOBBASEFEE opcode has hex value 0x4a let blobBasefee := verbatim_0i_1o(hex"4a") - mstore(0, blobBasefee) + mstore(0, blobBasefee) return(0, 32) } + // Unknown selector (revert) + default { + revert(0, 0) + } } } -} \ No newline at end of file +} From ac03c0e7c1fc48f032e4b6a8dee7ffc2b2d15c24 Mon Sep 17 00:00:00 2001 From: Lee Bousfield Date: Fri, 19 Jan 2024 14:11:56 -0700 Subject: [PATCH 281/292] Use solc's formatting for Yul --- yul/Reader4844.yul | 48 ++++++++++++++++++++-------------------------- 1 file changed, 21 insertions(+), 27 deletions(-) diff --git a/yul/Reader4844.yul b/yul/Reader4844.yul index 7c8aeaff..ef183d79 100644 --- a/yul/Reader4844.yul +++ b/yul/Reader4844.yul @@ -1,27 +1,23 @@ -// taken from https://github.com/rauljordan/eip4844-interop/blob/b23c1afa79ad18b0318dca41c000c7c0edfe29d9/upload/contracts/DataHashesReader.yul object "Reader4844" { - code { - datacopy(0, dataoffset("runtime"), datasize("runtime")) - return(0, datasize("runtime")) - } - object "runtime" { - code { - // This contract does not accept callvalue - if callvalue() { - revert(0, 0) - } + code { + datacopy(0, dataoffset("runtime"), datasize("runtime")) + return(0, datasize("runtime")) + } + object "runtime" { + code { + // This contract does not accept callvalue + if callvalue() { revert(0, 0) } - // Match against the keccak of the ABI function signature needed. - switch shr(0xe0,calldataload(0)) + // Match against the keccak of the ABI function signature needed. + switch shr(0xe0, calldataload(0)) // bytes4(keccak("getDataHashes()")) case 0xe83a2d82 { - // DATAHASH opcode has hex value 0x49 let i := 0 - for {} true {} { + for { } true { } + { + // DATAHASH opcode has hex value 0x49 let hash := verbatim_1i_1o(hex"49", i) - if iszero(hash) { - break - } + if iszero(hash) { break } mstore(add(mul(i, 32), 64), hash) i := add(i, 1) } @@ -31,15 +27,13 @@ object "Reader4844" { } // bytes4(keccak("getBlobBaseFee()")) case 0x1f6d6ef7 { - // BLOBBASEFEE opcode has hex value 0x4a - let blobBasefee := verbatim_0i_1o(hex"4a") - mstore(0, blobBasefee) - return(0, 32) + // BLOBBASEFEE opcode has hex value 0x4a + let blobBasefee := verbatim_0i_1o(hex"4a") + mstore(0, blobBasefee) + return(0, 32) } // Unknown selector (revert) - default { - revert(0, 0) - } - } - } + default { revert(0, 0) } + } + } } From 9ee895e5e6b5b87907a549ab0eef8dd6cd84185b Mon Sep 17 00:00:00 2001 From: Chris Buckland Date: Mon, 22 Jan 2024 15:00:41 +0000 Subject: [PATCH 282/292] Added postupgradeinit for the challenge manafer --- src/challenge/ChallengeManager.sol | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/challenge/ChallengeManager.sol b/src/challenge/ChallengeManager.sol index 12cad085..08232cd5 100644 --- a/src/challenge/ChallengeManager.sol +++ b/src/challenge/ChallengeManager.sol @@ -110,6 +110,12 @@ contract ChallengeManager is DelegateCallAware, IChallengeManager { osp = osp_; } + function postUpgradeInit(IOneStepProofEntry osp_) onlyDelegated onlyProxyOwner external { + // when updating to 4844 we need to create new osp contracts and set them here + // on the challenge manager + osp = osp_; + } + function createChallenge( bytes32 wasmModuleRoot_, MachineStatus[2] calldata startAndEndMachineStatuses_, From dd3d8ba00f319136f27a81c8b433746fcb8421cd Mon Sep 17 00:00:00 2001 From: Chris Buckland Date: Mon, 22 Jan 2024 15:05:14 +0000 Subject: [PATCH 283/292] Formatting --- src/challenge/ChallengeManager.sol | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/challenge/ChallengeManager.sol b/src/challenge/ChallengeManager.sol index 08232cd5..c5427e7e 100644 --- a/src/challenge/ChallengeManager.sol +++ b/src/challenge/ChallengeManager.sol @@ -110,7 +110,7 @@ contract ChallengeManager is DelegateCallAware, IChallengeManager { osp = osp_; } - function postUpgradeInit(IOneStepProofEntry osp_) onlyDelegated onlyProxyOwner external { + function postUpgradeInit(IOneStepProofEntry osp_) external onlyDelegated onlyProxyOwner { // when updating to 4844 we need to create new osp contracts and set them here // on the challenge manager osp = osp_; From 86390e6f92489fb0cf4a8050faa21a4a0d0fe859 Mon Sep 17 00:00:00 2001 From: Chris Buckland Date: Mon, 22 Jan 2024 15:49:45 +0000 Subject: [PATCH 284/292] Added postupgradeinit tests --- test/foundry/ChallengeManager.t.sol | 56 +++++++++++++++++++++++++++++ 1 file changed, 56 insertions(+) create mode 100644 test/foundry/ChallengeManager.t.sol diff --git a/test/foundry/ChallengeManager.t.sol b/test/foundry/ChallengeManager.t.sol new file mode 100644 index 00000000..5e25e51c --- /dev/null +++ b/test/foundry/ChallengeManager.t.sol @@ -0,0 +1,56 @@ +// SPDX-License-Identifier: UNLICENSED +pragma solidity ^0.8.4; + +import "forge-std/Test.sol"; +import "./util/TestUtil.sol"; +import "../../src/challenge/ChallengeManager.sol"; + + +contract ChallengeManagerTest is Test { + IChallengeResultReceiver resultReceiver = IChallengeResultReceiver(address(137)); + ISequencerInbox sequencerInbox = ISequencerInbox(address(138)); + IBridge bridge = IBridge(address(139)); + IOneStepProofEntry osp = IOneStepProofEntry(address(140)); + IOneStepProofEntry newOsp = IOneStepProofEntry(address(141)); + address proxyAdmin = address(141); + ChallengeManager chalmanImpl = new ChallengeManager(); + + + function deploy() public returns(ChallengeManager) { + ChallengeManager chalman = ChallengeManager(address(new TransparentUpgradeableProxy(address(chalmanImpl), proxyAdmin, ""))); + chalman.initialize( + resultReceiver, + sequencerInbox, + bridge, + osp + ); + assertEq(address(chalman.resultReceiver()), address(resultReceiver), "Result receiver not set"); + assertEq(address(chalman.sequencerInbox()), address(sequencerInbox), "Sequencer inbox not set"); + assertEq(address(chalman.bridge()), address(bridge), "Bridge not set"); + assertEq(address(chalman.osp()), address(osp), "OSP not set"); + return chalman; + } + + function testPostUpgradeInit() public { + ChallengeManager chalman = deploy(); + + vm.prank(proxyAdmin); + TransparentUpgradeableProxy(payable(address(chalman))).upgradeToAndCall(address(chalmanImpl), abi.encodeWithSelector(ChallengeManager.postUpgradeInit.selector, newOsp)); + + assertEq(address(chalman.osp()), address(newOsp), "New osp not set"); + } + + function testPostUpgradeInitFailsNotAdmin() public { + ChallengeManager chalman = deploy(); + + vm.expectRevert(abi.encodeWithSelector(NotOwner.selector, address(151), proxyAdmin)); + vm.prank(address(151)); + chalman.postUpgradeInit(osp); + } + + function testPostUpgradeInitFailsNotDelCall() public { + vm.expectRevert(bytes("Function must be called through delegatecall")); + vm.prank(proxyAdmin); + chalmanImpl.postUpgradeInit(osp); + } +} \ No newline at end of file From 00d4d6257835ba58bb381ce8d884a819d7ce9448 Mon Sep 17 00:00:00 2001 From: Lee Bousfield Date: Tue, 23 Jan 2024 00:29:29 -0700 Subject: [PATCH 285/292] Use 0x50 as the header byte for 4844 batches --- src/bridge/ISequencerInbox.sol | 6 ++++++ src/bridge/SequencerInbox.sol | 7 +++++-- test/contract/sequencerInbox.spec.4844.ts | 2 +- 3 files changed, 12 insertions(+), 3 deletions(-) diff --git a/src/bridge/ISequencerInbox.sol b/src/bridge/ISequencerInbox.sol index 5d671ba7..5fe1ea76 100644 --- a/src/bridge/ISequencerInbox.sol +++ b/src/bridge/ISequencerInbox.sol @@ -47,6 +47,12 @@ interface ISequencerInbox is IDelayedMessageProvider { // solhint-disable-next-line func-name-mixedcase function HEADER_LENGTH() external view returns (uint256); + /// @dev If the first batch data byte after the header has this bit set, + /// the sequencer inbox has authenticated the data. Currently only used for 4844 blob support. + /// See: https://github.com/OffchainLabs/nitro/blob/69de0603abf6f900a4128cab7933df60cad54ded/arbstate/das_reader.go + // solhint-disable-next-line func-name-mixedcase + function DATA_AUTHENTICATED_FLAG() external view returns (bytes1); + /// @dev If the first data byte after the header has this bit set, /// then the batch data is to be found in 4844 data blobs /// See: https://github.com/OffchainLabs/nitro/blob/69de0603abf6f900a4128cab7933df60cad54ded/arbstate/das_reader.go diff --git a/src/bridge/SequencerInbox.sol b/src/bridge/SequencerInbox.sol index c0d01db2..e25dc06d 100644 --- a/src/bridge/SequencerInbox.sol +++ b/src/bridge/SequencerInbox.sol @@ -62,7 +62,10 @@ contract SequencerInbox is DelegateCallAware, GasRefundEnabled, ISequencerInbox uint256 public constant HEADER_LENGTH = 40; /// @inheritdoc ISequencerInbox - bytes1 public constant DATA_BLOB_HEADER_FLAG = 0x40; + bytes1 public constant DATA_AUTHENTICATED_FLAG = 0x40; + + /// @inheritdoc ISequencerInbox + bytes1 public constant DATA_BLOB_HEADER_FLAG = DATA_AUTHENTICATED_FLAG | 0x10; /// @inheritdoc ISequencerInbox bytes1 public constant DAS_MESSAGE_HEADER_FLAG = 0x80; @@ -406,7 +409,7 @@ contract SequencerInbox is DelegateCallAware, GasRefundEnabled, ISequencerInbox ); } - function addSequencerL2BatchFromBlob( + function addSequencerL2BatchFromBlobs( uint256 sequenceNumber, uint256 afterDelayedMessagesRead, IGasRefunder gasRefunder, diff --git a/test/contract/sequencerInbox.spec.4844.ts b/test/contract/sequencerInbox.spec.4844.ts index 3cb70f8a..e40804cb 100644 --- a/test/contract/sequencerInbox.spec.4844.ts +++ b/test/contract/sequencerInbox.spec.4844.ts @@ -472,7 +472,7 @@ describe('SequencerInbox', async () => { sequencerInbox.address, ['0x0142', '0x0143'], sequencerInbox.interface.encodeFunctionData( - 'addSequencerL2BatchFromBlob', + 'addSequencerL2BatchFromBlobs', [ sequenceNumber, afterDelayedMessagesRead, From 66aba4e03e3b49b921a404ab9b47cfbcd171504b Mon Sep 17 00:00:00 2001 From: gzeon Date: Tue, 23 Jan 2024 17:50:02 +0900 Subject: [PATCH 286/292] test: update DATA_BLOB_HEADER_FLAG --- test/contract/toolkit4844.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/contract/toolkit4844.ts b/test/contract/toolkit4844.ts index 39ad0cc0..b0271641 100644 --- a/test/contract/toolkit4844.ts +++ b/test/contract/toolkit4844.ts @@ -11,7 +11,7 @@ const wait = async (ms: number) => }) export class Toolkit4844 { - public static DATA_BLOB_HEADER_FLAG = '0x40' + public static DATA_BLOB_HEADER_FLAG = '0x50' // 0x40 | 0x10 public static postDataToGeth(body: any): Promise { return new Promise((resolve, reject) => { From e253b8b1b5865f135ac63ea3d3cea1bfe8ef2ad7 Mon Sep 17 00:00:00 2001 From: Lee Bousfield Date: Tue, 23 Jan 2024 17:47:20 -0700 Subject: [PATCH 287/292] Support zero basefee for gas estimation --- src/bridge/SequencerInbox.sol | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/src/bridge/SequencerInbox.sol b/src/bridge/SequencerInbox.sol index e25dc06d..3e4d68f0 100644 --- a/src/bridge/SequencerInbox.sol +++ b/src/bridge/SequencerInbox.sol @@ -462,12 +462,11 @@ contract SequencerInbox is DelegateCallAware, GasRefundEnabled, ISequencerInbox if (hostChainIsArbitrum) revert DataBlobsNotSupported(); // submit a batch spending report to refund the entity that produced the blob batch data - submitBatchSpendingReport( - dataHash, - seqMessageIndex, - block.basefee, - blobCost / block.basefee - ); + uint256 blobGas = 0; + if (block.basefee > 0) { + blobGas = blobCost / block.basefee; + } + submitBatchSpendingReport(dataHash, seqMessageIndex, block.basefee, blobGas); } function addSequencerL2Batch( From cd5093d45ef0353fc5b2718ead70bd7f36e1a92c Mon Sep 17 00:00:00 2001 From: Lee Bousfield Date: Tue, 23 Jan 2024 19:53:18 -0700 Subject: [PATCH 288/292] Fix SequencerInboxStubCreator --- deploy/SequencerInboxStubCreator.js | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/deploy/SequencerInboxStubCreator.js b/deploy/SequencerInboxStubCreator.js index b0adea5e..7d17727b 100644 --- a/deploy/SequencerInboxStubCreator.js +++ b/deploy/SequencerInboxStubCreator.js @@ -1,11 +1,12 @@ +import { Toolkit4844 } from '../test/contract/toolkit4844' + module.exports = async hre => { - const { deployments, getNamedAccounts, ethers } = hre + const { deployments, getSigners, getNamedAccounts, ethers } = hre const { deploy } = deployments const { deployer } = await getNamedAccounts() const bridge = await ethers.getContract('BridgeStub') - const blobBasefeeReader = await ethers.getContract('BlobBasefeeReader') - const dataHashReader = await ethers.getContract('DataHashReader') + const reader4844 = await Toolkit4844.deployReader4844(await ethers.getSigner(deployer)) const maxTime = { delayBlocks: 10000, futureBlocks: 10000, @@ -19,8 +20,7 @@ module.exports = async hre => { deployer, maxTime, 117964, - dataHashReader, - blobBasefeeReader, + reader4844.address, ], }) } From 7b84be56ec5352aaeb85c58fea7f50725e1927d9 Mon Sep 17 00:00:00 2001 From: Lee Bousfield Date: Sun, 28 Jan 2024 11:38:12 -0700 Subject: [PATCH 289/292] Add missing getters for L1 pricing parameters to ArbGasInfo --- src/precompiles/ArbGasInfo.sol | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/src/precompiles/ArbGasInfo.sol b/src/precompiles/ArbGasInfo.sol index 31dd70ea..23eae727 100644 --- a/src/precompiles/ArbGasInfo.sol +++ b/src/precompiles/ArbGasInfo.sol @@ -129,4 +129,19 @@ interface ArbGasInfo { /// @notice Returns the available funds from L1 fees function getL1FeesAvailable() external view returns (uint256); + + /// @notice Returns the equilibration units parameter for L1 price adjustment algorithm + function getL1PricingEquilibrationUnits() external view returns (uint256); + + /// @notice Returns the last time the L1 calldata pricer was updated. + function getLastL1PricingUpdateTime() external view returns (uint64); + + /// @notice Returns the amount of L1 calldata payments due for rewards (per the L1 reward rate) + function getL1PricingFundsDueForRewards() external view returns (uint256); + + /// @notice Returns the amount of L1 calldata posted since the last update. + function getL1PricingUnitsSinceUpdate() external view returns (uint64); + + /// @notice Returns the L1 pricing surplus as of the last update (may be negative). + function getLastL1PricingSurplus() external view returns (int256); } From f28f24819e3c9627702a16e75c37c1d118dc570e Mon Sep 17 00:00:00 2001 From: Lee Bousfield Date: Sun, 28 Jan 2024 11:45:44 -0700 Subject: [PATCH 290/292] Add comments noting precompile methods are new to ArbOS 20 --- src/precompiles/ArbGasInfo.sol | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/precompiles/ArbGasInfo.sol b/src/precompiles/ArbGasInfo.sol index 23eae727..b4c21096 100644 --- a/src/precompiles/ArbGasInfo.sol +++ b/src/precompiles/ArbGasInfo.sol @@ -131,17 +131,22 @@ interface ArbGasInfo { function getL1FeesAvailable() external view returns (uint256); /// @notice Returns the equilibration units parameter for L1 price adjustment algorithm + /// Available in ArbOS version 20 function getL1PricingEquilibrationUnits() external view returns (uint256); /// @notice Returns the last time the L1 calldata pricer was updated. + /// Available in ArbOS version 20 function getLastL1PricingUpdateTime() external view returns (uint64); /// @notice Returns the amount of L1 calldata payments due for rewards (per the L1 reward rate) + /// Available in ArbOS version 20 function getL1PricingFundsDueForRewards() external view returns (uint256); /// @notice Returns the amount of L1 calldata posted since the last update. + /// Available in ArbOS version 20 function getL1PricingUnitsSinceUpdate() external view returns (uint64); /// @notice Returns the L1 pricing surplus as of the last update (may be negative). + /// Available in ArbOS version 20 function getLastL1PricingSurplus() external view returns (int256); } From 6e61fdb475bb4b38870e40827dd37627afc4bacd Mon Sep 17 00:00:00 2001 From: Lee Bousfield Date: Sun, 28 Jan 2024 16:53:00 -0700 Subject: [PATCH 291/292] Add ArbOS precompile method to get scheduled upgrade --- src/precompiles/ArbOwnerPublic.sol | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/precompiles/ArbOwnerPublic.sol b/src/precompiles/ArbOwnerPublic.sol index ee9e2347..a7cd39a6 100644 --- a/src/precompiles/ArbOwnerPublic.sol +++ b/src/precompiles/ArbOwnerPublic.sol @@ -29,5 +29,10 @@ interface ArbOwnerPublic { /// @notice Get the Brotli compression level used for fast compression function getBrotliCompressionLevel() external view returns (uint64); + /// @notice Get the next scheduled ArbOS version upgrade and its activation timestamp. + /// Returns (0, 0) if no ArbOS upgrade is scheduled. + /// Available in ArbOS version 20. + function getScheduledUpgrade() external view returns (uint64 arbosVersion, uint64 scheduledForTimestamp); + event ChainOwnerRectified(address rectifiedOwner); } From 9a6bfad2363322099d399698751551ff044c7a72 Mon Sep 17 00:00:00 2001 From: Lee Bousfield Date: Sun, 28 Jan 2024 16:58:07 -0700 Subject: [PATCH 292/292] Fix formatting --- src/precompiles/ArbOwnerPublic.sol | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/precompiles/ArbOwnerPublic.sol b/src/precompiles/ArbOwnerPublic.sol index a7cd39a6..0de57ce6 100644 --- a/src/precompiles/ArbOwnerPublic.sol +++ b/src/precompiles/ArbOwnerPublic.sol @@ -32,7 +32,10 @@ interface ArbOwnerPublic { /// @notice Get the next scheduled ArbOS version upgrade and its activation timestamp. /// Returns (0, 0) if no ArbOS upgrade is scheduled. /// Available in ArbOS version 20. - function getScheduledUpgrade() external view returns (uint64 arbosVersion, uint64 scheduledForTimestamp); + function getScheduledUpgrade() + external + view + returns (uint64 arbosVersion, uint64 scheduledForTimestamp); event ChainOwnerRectified(address rectifiedOwner); }